polpo 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/theme.ts +2 -2
- package/.turbo/turbo-lint.log +1 -1
- package/README.md +2 -5
- package/dist/chunk-MAWW6AA7.js +3 -0
- package/dist/chunk-MAWW6AA7.js.map +1 -0
- package/dist/chunk-ROUSN3KT.js +3 -0
- package/dist/chunk-ROUSN3KT.js.map +1 -0
- package/dist/get-modal-position-drle0OjP.d.cts +49 -0
- package/dist/get-modal-position-drle0OjP.d.ts +49 -0
- package/dist/helpers.cjs +1 -1
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts +9 -2
- package/dist/helpers.d.ts +9 -2
- package/dist/helpers.js +1 -1
- package/dist/hooks.cjs +1 -1
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.cts +59 -21
- package/dist/hooks.d.ts +59 -21
- package/dist/hooks.js +1 -1
- package/dist/ui.cjs +603 -391
- package/dist/ui.cjs.map +1 -1
- package/dist/ui.d.cts +97 -77
- package/dist/ui.d.ts +97 -77
- package/dist/ui.js +585 -373
- package/dist/ui.js.map +1 -1
- package/dist/use-modal-in-container-DiNW1PE_.d.cts +34 -0
- package/dist/use-modal-in-container-neGo-kMk.d.ts +34 -0
- package/package.json +7 -5
- package/src/components/buttons/button/button.stories.tsx +4 -4
- package/src/components/buttons/button/button.style.ts +10 -5
- package/src/components/buttons/button/button.tsx +7 -19
- package/src/components/cards/flip-card/flip-card.tsx +1 -1
- package/src/components/cursor/cursor.stories.tsx +35 -0
- package/src/components/cursor/cursor.style.ts +73 -0
- package/src/components/cursor/cursor.tsx +49 -0
- package/src/components/cursor/index.ts +1 -0
- package/src/components/form/checkbox/checkbox.stories.tsx +51 -0
- package/src/components/form/checkbox/checkbox.style.ts +73 -37
- package/src/components/form/checkbox/checkbox.tsx +38 -4
- package/src/components/form/field/field.stories.tsx +5 -1
- package/src/components/form/field/field.style.ts +12 -0
- package/src/components/form/field/field.tsx +3 -1
- package/src/components/form/field/field.types.ts +6 -0
- package/src/components/form/input-color/input-color.style.ts +5 -4
- package/src/components/form/input-color/input-color.tsx +41 -44
- package/src/components/form/radio/radio.stories.tsx +29 -5
- package/src/components/form/radio/radio.style.ts +45 -24
- package/src/components/form/radio/radio.tsx +22 -3
- package/src/components/form/select/options.tsx +119 -67
- package/src/components/form/select/select.stories.tsx +103 -42
- package/src/components/form/select/select.style.ts +10 -92
- package/src/components/form/select/select.tsx +19 -42
- package/src/components/form/select/select.types.ts +4 -21
- package/src/components/form/slider/slider.style.ts +2 -0
- package/src/components/icon/icons/social.tsx +17 -1
- package/src/components/index.ts +1 -0
- package/src/components/infinity-scroll/infinity-scroll.tsx +1 -1
- package/src/components/line/line.stories.tsx +3 -4
- package/src/components/modals/action-modal/action-modal.stories.tsx +58 -39
- package/src/components/modals/action-modal/action-modal.style.ts +13 -25
- package/src/components/modals/action-modal/action-modal.tsx +68 -70
- package/src/components/modals/aside-modal/aside-modal.stories.tsx +11 -15
- package/src/components/modals/aside-modal/aside-modal.style.ts +17 -37
- package/src/components/modals/aside-modal/aside-modal.tsx +41 -43
- package/src/components/modals/confirmation-modal/confirmation-modal.stories.tsx +21 -9
- package/src/components/modals/index.ts +2 -0
- package/src/components/modals/menu/index.ts +1 -0
- package/src/components/modals/menu/menu.stories.tsx +69 -0
- package/src/components/modals/menu/menu.style.ts +62 -0
- package/src/components/modals/menu/menu.tsx +142 -0
- package/src/components/modals/modal/backdrop.tsx +70 -0
- package/src/components/modals/modal/index.ts +1 -0
- package/src/components/modals/modal/modal.stories.tsx +325 -0
- package/src/components/modals/modal/modal.style.ts +62 -2
- package/src/components/modals/modal/modal.tsx +82 -123
- package/src/components/modals/portal/index.ts +1 -0
- package/src/components/modals/portal/portal.tsx +22 -0
- package/src/components/tabs/tabs-list.tsx +13 -10
- package/src/components/tabs/tabs.style.ts +48 -43
- package/src/components/tag/tag.stories.tsx +11 -12
- package/src/components/tag/tag.style.ts +9 -4
- package/src/components/tag/tag.tsx +2 -12
- package/src/components/tooltips/tooltip/tooltip.stories.tsx +5 -2
- package/src/components/tooltips/tooltip/tooltip.style.ts +37 -6
- package/src/components/tooltips/tooltip/tooltip.tsx +33 -19
- package/src/components/typography/typography.stories.tsx +3 -1
- package/src/components/typography/typography.tsx +21 -0
- package/src/contexts/theme-context/theme.animations.ts +91 -2
- package/src/contexts/theme-context/theme.defaults.ts +1 -1
- package/src/core/http-client.ts +49 -47
- package/src/core/variants/color.ts +3 -30
- package/src/core/variants/radius.ts +12 -41
- package/src/core/variants/size.ts +8 -33
- package/src/helpers/get-modal-position-relative-to-screen.ts +86 -0
- package/src/helpers/get-modal-position.ts +173 -28
- package/src/helpers/index.ts +1 -0
- package/src/hooks/index.ts +9 -3
- package/src/hooks/use-click-outside.ts +32 -0
- package/src/hooks/use-cookie.ts +124 -0
- package/src/hooks/use-dimensions.ts +11 -14
- package/src/hooks/use-dom-container.ts +32 -0
- package/src/hooks/use-event-listener.ts +4 -4
- package/src/hooks/use-geolocation.ts +63 -0
- package/src/hooks/use-in-view.ts +9 -11
- package/src/hooks/use-intersection-observer.ts +19 -0
- package/src/hooks/use-modal-in-container.ts +60 -52
- package/src/hooks/use-modal-transition.ts +54 -0
- package/src/hooks/use-modal.ts +21 -0
- package/src/hooks/use-mouse-position.ts +55 -7
- package/src/hooks/use-resize-observer.ts +18 -0
- package/src/stories/GettingStarted.mdx +2 -6
- package/svg/Name=npm, Category=social.svg +3 -0
- package/.turbo/turbo-build.log +0 -0
- package/dist/chunk-M4KRSYE7.js +0 -3
- package/dist/chunk-M4KRSYE7.js.map +0 -1
- package/dist/chunk-U5XSMSKZ.js +0 -3
- package/dist/chunk-U5XSMSKZ.js.map +0 -1
- package/dist/get-modal-position-DPftPoU2.d.cts +0 -28
- package/dist/get-modal-position-DPftPoU2.d.ts +0 -28
- package/src/components/form/select/select-option.tsx +0 -84
- package/src/hooks/use-observer.ts +0 -18
- package/src/hooks/use-on-click-outside-ref.ts +0 -17
package/dist/hooks.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/index.ts","../src/hooks/use-async.ts","../src/hooks/use-safe-dispatch.ts","../src/hooks/use-classnames.ts","../src/hooks/use-constant.ts","../src/hooks/use-debounce.ts","../src/hooks/use-dimensions.ts","../src/hooks/use-event-listener.ts","../src/hooks/use-observer.ts","../src/hooks/use-file-reader.ts","../src/helpers/format-bytes.ts","../src/helpers/get-modal-position.ts","../src/hooks/use-in-view.ts","../src/hooks/use-input-handlers.ts","../src/hooks/use-media-query.ts","../src/hooks/use-modal-in-container.ts","../src/hooks/use-on-click-outside-ref.ts","../src/hooks/use-mouse-position.ts","../src/hooks/use-online-status.ts","../src/hooks/use-render-count.ts","../src/hooks/use-scroll.ts","../src/hooks/use-state-history.ts","../src/hooks/use-toggle.ts","../src/hooks/use-toggle-values.ts","../src/hooks/use-viewport.ts"],"sourcesContent":["export * from './use-async';\nexport * from './use-async';\nexport * from './use-classnames';\nexport * from './use-constant';\nexport * from './use-debounce';\nexport * from './use-dimensions';\nexport * from './use-event-listener';\nexport * from './use-file-reader';\nexport * from './use-in-view';\nexport * from './use-input-handlers';\nexport * from './use-media-query';\nexport * from './use-modal-in-container';\nexport * from './use-mouse-position';\nexport * from './use-observer';\nexport * from './use-on-click-outside-ref';\nexport * from './use-online-status';\nexport * from './use-render-count';\nexport * from './use-safe-dispatch';\nexport * from './use-scroll';\nexport * from './use-state-history';\nexport * from './use-toggle';\nexport * from './use-toggle-values';\nexport * from './use-viewport';\n","import React, { useCallback, useMemo, useReducer } from 'react';\n\nimport { useSafeDispatch } from './use-safe-dispatch';\n\ntype AsyncState<T> =\n | {\n status: 'idle' | 'pending';\n data?: null;\n error?: null;\n }\n | {\n status: 'resolved';\n data: T;\n error: null;\n }\n | {\n status: 'rejected';\n data: null;\n error: Error;\n };\n\ntype AsyncAction<T> =\n | { type: 'reset' }\n | { type: 'pending' }\n | { type: 'resolved'; data: T }\n | { type: 'rejected'; error: Error };\n\nconst asyncReducer = <T>(_state: AsyncState<T>, action: AsyncAction<T>): AsyncState<T> => {\n switch (action.type) {\n case 'pending': {\n return { status: 'pending' as const, data: null, error: null };\n }\n case 'resolved': {\n return { status: 'resolved' as const, data: action.data, error: null };\n }\n case 'rejected': {\n return { status: 'rejected' as const, data: null, error: action.error };\n }\n default: {\n throw new Error(`Unhandled action: ${JSON.stringify(action)}`);\n }\n }\n};\n\nexport const useAsync = <T>(\n initialState?: AsyncState<T>,\n): AsyncState<T> & {\n setData: (data: T) => void;\n setError: (error: Error) => void;\n run: (promise: Promise<T>) => void;\n} => {\n const [asyncState, unsafeDispatch] = useReducer<React.Reducer<AsyncState<T>, AsyncAction<T>>>(asyncReducer, {\n status: 'idle',\n data: null,\n error: null,\n ...initialState,\n });\n const dispatch = useSafeDispatch(unsafeDispatch);\n\n const run = useCallback(\n (promise: Promise<T>) => {\n dispatch({ type: 'pending' });\n promise.then(\n data => {\n dispatch({ type: 'resolved', data });\n },\n (error: Error) => {\n dispatch({ type: 'rejected', error });\n },\n );\n },\n [dispatch],\n );\n\n const setData = useCallback((data: T) => dispatch({ type: 'resolved', data }), [dispatch]);\n\n const setError = useCallback((error: Error) => dispatch({ type: 'rejected', error }), [dispatch]);\n\n return useMemo(\n () => ({\n setData,\n setError,\n run,\n ...asyncState,\n }),\n [asyncState, run, setData, setError],\n );\n};\n","import React, { useCallback, useLayoutEffect, useRef } from 'react';\n\nexport const useSafeDispatch = <T>(dispatch: React.Dispatch<T>): ((action: T) => void) => {\n const mounted = useRef(false);\n\n useLayoutEffect(() => {\n mounted.current = true;\n\n return () => {\n mounted.current = false;\n };\n }, []);\n\n return useCallback(\n (...args: Parameters<React.Dispatch<T>>) => {\n if (mounted.current) {\n dispatch(...args);\n }\n },\n [dispatch],\n );\n};\n","import { useMemo } from 'react';\n\nexport const useClassNames = (classes: Record<string, boolean>): string =>\n useMemo<string>(\n () =>\n Object.entries(classes)\n .reduce<Array<string>>(\n (compiledClassNames, [classname, value]) => (value ? [...compiledClassNames, classname] : compiledClassNames),\n [],\n )\n .join(' '),\n [classes],\n );\n","import { useState } from 'react';\n\nexport const useConstant = <T>(initializer: T | (() => T)): T => useState(initializer)[0];\n","import { useEffect, useState } from 'react';\n\nexport const useDebounce = <T>(value: T, delay: number = 500): T => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n};\n","import React, { useEffect, useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\nimport { useObserver } from './use-observer';\n\nexport const useDimensions = (ref: React.RefObject<HTMLElement>) => {\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n\n const getSize = () => {\n setDimensions({\n width: ref.current?.offsetWidth ?? 0,\n height: ref.current?.offsetHeight ?? 0,\n });\n };\n\n useEventListener('resize', getSize);\n useObserver(ref, getSize);\n\n useEffect(getSize, [ref]);\n\n return dimensions;\n};\n","import { RefObject, useEffect, useLayoutEffect, useRef } from 'react';\n\nfunction useEventListener<EventName extends keyof MediaQueryListEventMap>(\n eventName: EventName,\n callback: (event: MediaQueryListEventMap[EventName]) => void,\n element: RefObject<MediaQueryList>,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<EventName extends keyof WindowEventMap>(\n eventName: EventName,\n callback: (event: WindowEventMap[EventName]) => void,\n element?: undefined,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<EventName extends keyof HTMLElementEventMap, ElementRef extends HTMLElement = HTMLDivElement>(\n eventName: EventName,\n callback: (event: HTMLElementEventMap[EventName]) => void,\n element: RefObject<ElementRef>,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<EventName extends keyof DocumentEventMap>(\n eventName: EventName,\n callback: (event: DocumentEventMap[EventName]) => void,\n element: RefObject<Document>,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<\n MediaQueryEventName extends keyof MediaQueryListEventMap,\n WindowEventName extends keyof WindowEventMap,\n ElementEventName extends keyof HTMLElementEventMap,\n DocumentEventName extends keyof DocumentEventMap,\n ElementRef extends HTMLElement | MediaQueryList | Document | Window | void = void,\n>(\n eventName: WindowEventName | DocumentEventName | ElementEventName | MediaQueryEventName,\n callback: (\n event:\n | MediaQueryListEventMap[MediaQueryEventName]\n | WindowEventMap[WindowEventName]\n | HTMLElementEventMap[ElementEventName]\n | DocumentEventMap[DocumentEventName]\n | Event,\n ) => void,\n element?: RefObject<ElementRef>,\n options?: boolean | AddEventListenerOptions,\n) {\n const callbackRef = useRef<EventListener>(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useLayoutEffect(() => {\n const targetElement = element?.current ?? window;\n\n if (!(targetElement && targetElement.addEventListener)) return;\n\n const listener: typeof callback = event => callbackRef.current(event);\n\n targetElement.addEventListener(eventName, listener, options);\n\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\nexport { useEventListener };\n","import { useEffect } from 'react';\n\nexport const useObserver = <T extends HTMLElement>(ref: React.RefObject<T>, callback: () => void) => {\n useEffect(() => {\n let observer = null;\n\n if (callback && ref.current) {\n observer = new ResizeObserver(callback);\n observer.observe(ref.current);\n }\n\n return () => {\n if (observer) {\n observer.disconnect();\n }\n };\n }, [ref, callback]);\n};\n","import { useEffect, useState } from 'react';\n\nimport { formatBytes } from '@polpo/helpers';\n\nexport enum FileTypeEnum {\n PNG = 'image/png',\n PDF = 'application/pdf',\n}\n\nexport type FileResolvedT = {\n name: string;\n size: number;\n formatSize: string;\n type: FileTypeEnum;\n url: FileReader['result'];\n};\n\nexport const useFileReader = (inputFiles: Array<File>) => {\n const [files, setFiles] = useState<Array<FileResolvedT>>([]);\n\n useEffect(() => {\n const fileReaders: Array<FileReader> = [];\n let isCancel = false;\n\n if (!Array.isArray(inputFiles) || inputFiles.length === 0) {\n setFiles([]);\n } else {\n const promises = inputFiles.map(file => {\n return new Promise<FileResolvedT>((resolve, reject) => {\n const fileReader = new FileReader();\n fileReaders.push(fileReader);\n fileReader.onload = (e: ProgressEvent<FileReader>) => {\n if (e.target?.result) {\n resolve({\n name: file.name,\n size: file.size,\n formatSize: formatBytes(file.size),\n type: file.type as FileTypeEnum,\n url: e.target.result,\n });\n }\n };\n fileReader.onabort = () => {\n reject(new Error('File reading aborted'));\n };\n fileReader.onerror = () => {\n reject(new Error('Failed to read file'));\n };\n fileReader.readAsDataURL(file);\n });\n });\n\n Promise.all(promises).then(files => {\n if (!isCancel) {\n setFiles(files);\n }\n });\n }\n\n return () => {\n isCancel = true;\n fileReaders.forEach(fileReader => {\n fileReader.abort();\n });\n };\n }, [inputFiles]);\n\n return files;\n};\n","export const formatBytes = (bytes: number, decimals = 2) => {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n","export enum POSITION {\n top = 'top',\n left = 'left',\n right = 'right',\n bottom = 'bottom',\n}\n\nexport type PositionObject = {\n x: number;\n y: number;\n top: number;\n left: number;\n w: number;\n h: number;\n};\n\nexport type GetModalPositionParams = {\n c: PositionObject;\n m: PositionObject;\n offset: number;\n windowOffset: number;\n position?: `${POSITION}`;\n distancePercentage?: number;\n};\n\nexport const getModalPosition = ({\n c,\n m,\n offset,\n windowOffset,\n position,\n distancePercentage = 50,\n}: GetModalPositionParams) => {\n // Default bottom\n let top = c.y + c.h + offset;\n let left = c.x - (m.w - c.w);\n\n switch (position) {\n case POSITION.top:\n top = c.y - m.h - offset;\n left = c.x - (m.w - c.w) * (distancePercentage / 100);\n\n break;\n case POSITION.bottom:\n top = c.y + c.h + offset;\n left = c.x - (m.w - c.w) * (distancePercentage / 100);\n\n break;\n case POSITION.left:\n top = c.y - (m.h - c.h) * (distancePercentage / 100);\n left = c.x - m.w - offset;\n\n break;\n case POSITION.right:\n top = c.y - (m.h - c.h) * (distancePercentage / 100);\n left = c.x + c.w + offset;\n\n break;\n }\n\n return {\n left:\n left + m.w + windowOffset > window.innerWidth ? c.left - (left + m.w - window.innerWidth) - windowOffset : left,\n top: top + m.h + windowOffset > window.innerHeight ? c.top - (top + m.h - window.innerHeight) - windowOffset : top,\n };\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useInView = (initOptions: IntersectionObserverInit = {}) => {\n const [inView, setInView] = useState(false);\n const ref = useRef<Element>(null);\n\n useEffect(() => {\n const observer = new IntersectionObserver(([entry]) => {\n setInView(entry.isIntersecting);\n }, initOptions);\n\n ref.current && observer.observe(ref.current);\n\n return () => {\n observer.disconnect();\n };\n }, [initOptions]);\n\n return { ref, inView };\n};\n","import React, { useCallback, useState } from 'react';\n\ntype InputTypes = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\ntype UseInputHandlersProps<T extends InputTypes> = {\n onBlur?: (e: React.FocusEvent<T>) => void;\n onFocus?: (e: React.FocusEvent<T>) => void;\n onChange?: (e: React.ChangeEvent<T>) => void;\n};\n\nexport const useInputHandlers = <T extends InputTypes>({\n onBlur,\n onFocus,\n onChange,\n}: UseInputHandlersProps<T> = {}) => {\n const [isFocus, setIsFocus] = useState(false);\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<T>) => {\n setIsFocus(true);\n onFocus && onFocus(e);\n },\n [onFocus],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<T>) => {\n setIsFocus(false);\n onBlur && onBlur(e);\n },\n [onBlur],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<T>) => {\n onChange && onChange(e);\n },\n [onChange],\n );\n\n return {\n isFocus,\n handlers: {\n onFocus: handleFocus,\n onBlur: handleBlur,\n onChange: handleChange,\n },\n };\n};\n","import { useEffect, useState } from 'react';\n\nexport const useMediaQuery = (query: string): boolean => {\n const [matches, setMatches] = useState(false);\n\n useEffect(() => {\n const media = window.matchMedia(query);\n\n if (media.matches !== matches) {\n setMatches(media.matches);\n }\n\n const listener = () => {\n setMatches(media.matches);\n };\n\n media.addEventListener('change', listener);\n\n return () => {\n media.removeEventListener('change', listener);\n };\n }, [matches, query]);\n\n return matches;\n};\n","import React, { RefObject, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\nimport { useObserver } from './use-observer';\nimport { useOnClickOutsideRef } from './use-on-click-outside-ref';\n\nimport { getModalPosition, GetModalPositionParams, PositionObject } from '@polpo/helpers';\n\nconst convertDOMRectToPosition = (rect: DOMRectReadOnly): PositionObject => ({\n x: rect.x,\n y: rect.y,\n w: rect.width,\n h: rect.height,\n top: rect.top,\n left: rect.left,\n});\n\ntype useModalInContainerParams = Partial<\n Pick<GetModalPositionParams, 'position' | 'distancePercentage' | 'offset' | 'windowOffset'>\n> & {\n closeOnClickOutside?: boolean;\n};\n\nexport const useModalInContainer = <Container extends HTMLElement, Modal extends HTMLElement = Container>({\n closeOnClickOutside = true,\n offset = 5,\n windowOffset = 10,\n position,\n distancePercentage = 50,\n}: useModalInContainerParams = {}) => {\n const [isVisible, setIsVisible] = useState<boolean>(false);\n const [modalStyle, setModalStyle] = useState<React.CSSProperties>({});\n\n const modalRef = useRef<Modal>(null);\n const containerRef = useRef<Container>(null);\n\n useEffect(() => {\n if (closeOnClickOutside) {\n document.documentElement.style.overflow = isVisible ? 'hidden' : 'auto';\n }\n }, [isVisible, closeOnClickOutside]);\n\n useOnClickOutsideRef<Modal>(modalRef, () => {\n if (isVisible && closeOnClickOutside) {\n setIsVisible(false);\n }\n });\n\n const getPosition = useCallback(\n (modalRef: RefObject<HTMLElement>) => {\n const modal = modalRef.current?.getClientRects()[0];\n const container = containerRef.current?.getClientRects()[0];\n\n if (!container || !modal) {\n setModalStyle({});\n\n return;\n }\n\n const nextStyles = getModalPosition({\n c: convertDOMRectToPosition(container),\n m: convertDOMRectToPosition(modal),\n distancePercentage,\n windowOffset,\n position,\n offset,\n });\n\n setModalStyle(nextStyles);\n },\n [distancePercentage, windowOffset, position, offset],\n );\n\n const callback = useCallback(() => {\n if (isVisible) {\n getPosition(modalRef);\n }\n }, [getPosition, isVisible]);\n\n useLayoutEffect(callback, [callback]);\n\n useObserver<Container>(containerRef, callback);\n useObserver<Modal>(modalRef, callback);\n useEventListener('resize', callback);\n useEventListener('scroll', callback, modalRef);\n\n return {\n isVisible,\n setIsVisible,\n modalStyle,\n containerRef,\n modalRef,\n };\n};\n","import { RefObject } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nexport const useOnClickOutsideRef = <T extends HTMLElement>(containerRef: RefObject<T>, callback: () => void) => {\n useEventListener('keydown', e => {\n if (e.key === 'Escape') {\n callback();\n }\n });\n\n useEventListener('mousedown', event => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n callback();\n }\n });\n};\n","import React, { useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nexport const useMousePosition = () => {\n const [{ x, y }, setPosition] = useState({ x: 0, y: 0 });\n\n const mouseMove = (e: React.MouseEvent) => {\n const { clientX, clientY } = e;\n setPosition({ x: clientX, y: clientY });\n };\n\n useEventListener('mousemove', mouseMove as unknown as EventListener);\n\n return [x, y];\n};\n","import { useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nexport const useOnlineStatus = () => {\n const [online, setOnline] = useState(navigator.onLine);\n\n useEventListener('online', () => setOnline(navigator.onLine));\n useEventListener('offline', () => setOnline(navigator.onLine));\n\n return online;\n};\n","import { useEffect, useRef } from 'react';\n\nexport const useRenderCount = () => {\n const count = useRef(1);\n\n useEffect(() => {\n count.current++;\n });\n\n return count.current;\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useScroll = () => {\n const ref = useRef<HTMLElement>(null);\n const [position, setPosition] = useState([0, 0]);\n\n useEffect(() => {\n const element = ref.current;\n\n const handleScroll = () => {\n if (!element) return;\n\n setPosition([element.scrollLeft, element.scrollTop]);\n };\n\n if (element) {\n element.addEventListener('scroll', handleScroll);\n }\n\n return () => {\n if (element) {\n element.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n return {\n ref,\n position,\n };\n};\n","import { Dispatch, SetStateAction, useEffect, useState } from 'react';\n\nfunction useStateHistory<T>(initialState: T | (() => T)): [T, Dispatch<SetStateAction<T>>, Array<T>];\n\nfunction useStateHistory<T = undefined>(): [T | undefined, Dispatch<SetStateAction<T | undefined>>, Array<T>];\n\nfunction useStateHistory<T = undefined>(\n initialState?: T | (() => T) | undefined,\n): [T | undefined, Dispatch<SetStateAction<T | undefined>>, Array<T>] {\n const [state, setState] = useState<T | undefined>(initialState);\n const [history, setHistory] = useState<Array<T>>([]);\n\n useEffect(() => {\n if (state !== undefined) {\n setHistory(prevHistory => [...prevHistory, state]);\n }\n }, [state]);\n\n return [state, setState, history];\n}\n\nexport { useStateHistory };\n","import { useCallback, useState } from 'react';\n\nexport const useToggle = (defaultValue: boolean = false) => {\n const [value, setValue] = useState<boolean>(defaultValue);\n\n const toggle = useCallback(() => {\n setValue(prev => !prev);\n }, []);\n\n return [value, toggle, setValue];\n};\n","import { useCallback, useState } from 'react';\n\nexport const useToggleValues = <T>(values: Array<T>, defaultIndex: number = 0): [T, (index?: number) => void] => {\n const [index, setIndex] = useState(defaultIndex);\n\n const toggle = useCallback(\n (index?: number) => {\n setIndex(index !== undefined ? index : prev => (prev + 1) % values.length);\n },\n [values.length],\n );\n\n return [values[index], toggle];\n};\n","import { useEffect, useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nenum ScreenOrientation {\n PORTRAIT = 'portrait',\n LANDSCAPE = 'landscape',\n}\n\ntype UseViewportData = {\n width: number;\n height: number;\n orientation: ScreenOrientation;\n};\n\nexport const useViewport = (): UseViewportData => {\n const getData = (): UseViewportData => {\n const { innerWidth, innerHeight } = window;\n\n return {\n width: innerWidth,\n height: innerHeight,\n orientation: innerWidth > innerHeight ? ScreenOrientation.LANDSCAPE : ScreenOrientation.PORTRAIT,\n };\n };\n\n const [data, setData] = useState<UseViewportData>(getData);\n\n useEventListener('resize', () => {\n setData(getData());\n });\n\n useEffect(() => {\n setData(getData());\n }, []);\n\n return data;\n};\n"],"mappings":"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","names":["hooks_exports","__export","FileTypeEnum","useAsync","useClassNames","useConstant","useDebounce","useDimensions","useEventListener","useFileReader","useInView","useInputHandlers","useMediaQuery","useModalInContainer","useMousePosition","useObserver","useOnClickOutsideRef","useOnlineStatus","useRenderCount","useSafeDispatch","useScroll","useStateHistory","useToggle","useToggleValues","useViewport","__toCommonJS","import_react","import_react","useSafeDispatch","dispatch","mounted","args","asyncReducer","_state","action","useAsync","initialState","asyncState","unsafeDispatch","dispatch","useSafeDispatch","run","promise","data","error","setData","setError","import_react","useClassNames","classes","compiledClassNames","classname","value","import_react","useConstant","initializer","import_react","useDebounce","value","delay","debouncedValue","setDebouncedValue","timer","import_react","import_react","useEventListener","eventName","callback","element","options","callbackRef","targetElement","listener","event","import_react","useObserver","ref","callback","observer","useDimensions","ref","dimensions","setDimensions","getSize","useEventListener","useObserver","import_react","formatBytes","bytes","decimals","k","dm","sizes","i","getModalPosition","c","m","offset","windowOffset","position","distancePercentage","top","left","FileTypeEnum","useFileReader","inputFiles","files","setFiles","fileReaders","isCancel","promises","file","resolve","reject","fileReader","e","formatBytes","import_react","useInView","initOptions","inView","setInView","ref","observer","entry","import_react","useInputHandlers","onBlur","onFocus","onChange","isFocus","setIsFocus","handleFocus","e","handleBlur","handleChange","import_react","useMediaQuery","query","matches","setMatches","media","listener","import_react","useOnClickOutsideRef","containerRef","callback","useEventListener","e","event","convertDOMRectToPosition","rect","useModalInContainer","closeOnClickOutside","offset","windowOffset","position","distancePercentage","isVisible","setIsVisible","modalStyle","setModalStyle","modalRef","containerRef","useOnClickOutsideRef","getPosition","modal","container","nextStyles","getModalPosition","callback","useObserver","useEventListener","import_react","useMousePosition","x","y","setPosition","useEventListener","e","clientX","clientY","import_react","useOnlineStatus","online","setOnline","useEventListener","import_react","useRenderCount","count","import_react","useScroll","ref","position","setPosition","element","handleScroll","import_react","useStateHistory","initialState","state","setState","history","setHistory","prevHistory","import_react","useToggle","defaultValue","value","setValue","toggle","prev","import_react","useToggleValues","values","defaultIndex","index","setIndex","toggle","prev","import_react","useViewport","getData","innerWidth","innerHeight","data","setData","useEventListener"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/index.ts","../src/hooks/use-async.ts","../src/hooks/use-safe-dispatch.ts","../src/hooks/use-classnames.ts","../src/hooks/use-event-listener.ts","../src/hooks/use-click-outside.ts","../src/hooks/use-constant.ts","../src/hooks/use-cookie.ts","../src/hooks/use-debounce.ts","../src/hooks/use-dimensions.ts","../src/hooks/use-resize-observer.ts","../src/hooks/use-dom-container.ts","../src/hooks/use-file-reader.ts","../src/helpers/format-bytes.ts","../src/helpers/get-modal-position.ts","../src/helpers/get-modal-position-relative-to-screen.ts","../src/hooks/use-geolocation.ts","../src/hooks/use-hover.ts","../src/hooks/use-in-view.ts","../src/hooks/use-intersection-observer.ts","../src/hooks/use-input-handlers.ts","../src/hooks/use-media-query.ts","../src/hooks/use-modal.ts","../src/hooks/use-modal-in-container.ts","../src/hooks/use-modal-transition.ts","../src/hooks/use-mouse-position.ts","../src/hooks/use-online-status.ts","../src/hooks/use-render-count.ts","../src/hooks/use-scroll.ts","../src/hooks/use-state-history.ts","../src/hooks/use-toggle.ts","../src/hooks/use-toggle-values.ts","../src/hooks/use-viewport.ts"],"sourcesContent":["export * from './use-async';\nexport * from './use-classnames';\nexport * from './use-click-outside';\nexport * from './use-constant';\nexport * from './use-cookie';\nexport * from './use-debounce';\nexport * from './use-dimensions';\nexport * from './use-dom-container';\nexport * from './use-event-listener';\nexport * from './use-file-reader';\nexport * from './use-geolocation';\nexport * from './use-hover';\nexport * from './use-in-view';\nexport * from './use-input-handlers';\nexport * from './use-intersection-observer';\nexport * from './use-media-query';\nexport * from './use-modal';\nexport * from './use-modal-in-container';\nexport * from './use-modal-transition';\nexport * from './use-mouse-position';\nexport * from './use-online-status';\nexport * from './use-render-count';\nexport * from './use-resize-observer';\nexport * from './use-safe-dispatch';\nexport * from './use-scroll';\nexport * from './use-state-history';\nexport * from './use-toggle';\nexport * from './use-toggle-values';\nexport * from './use-viewport';\n","import React, { useCallback, useMemo, useReducer } from 'react';\n\nimport { useSafeDispatch } from './use-safe-dispatch';\n\ntype AsyncState<T> =\n | {\n status: 'idle' | 'pending';\n data?: null;\n error?: null;\n }\n | {\n status: 'resolved';\n data: T;\n error: null;\n }\n | {\n status: 'rejected';\n data: null;\n error: Error;\n };\n\ntype AsyncAction<T> =\n | { type: 'reset' }\n | { type: 'pending' }\n | { type: 'resolved'; data: T }\n | { type: 'rejected'; error: Error };\n\nconst asyncReducer = <T>(_state: AsyncState<T>, action: AsyncAction<T>): AsyncState<T> => {\n switch (action.type) {\n case 'pending': {\n return { status: 'pending' as const, data: null, error: null };\n }\n case 'resolved': {\n return { status: 'resolved' as const, data: action.data, error: null };\n }\n case 'rejected': {\n return { status: 'rejected' as const, data: null, error: action.error };\n }\n default: {\n throw new Error(`Unhandled action: ${JSON.stringify(action)}`);\n }\n }\n};\n\nexport const useAsync = <T>(\n initialState?: AsyncState<T>,\n): AsyncState<T> & {\n setData: (data: T) => void;\n setError: (error: Error) => void;\n run: (promise: Promise<T>) => void;\n} => {\n const [asyncState, unsafeDispatch] = useReducer<React.Reducer<AsyncState<T>, AsyncAction<T>>>(asyncReducer, {\n status: 'idle',\n data: null,\n error: null,\n ...initialState,\n });\n const dispatch = useSafeDispatch(unsafeDispatch);\n\n const run = useCallback(\n (promise: Promise<T>) => {\n dispatch({ type: 'pending' });\n promise.then(\n data => {\n dispatch({ type: 'resolved', data });\n },\n (error: Error) => {\n dispatch({ type: 'rejected', error });\n },\n );\n },\n [dispatch],\n );\n\n const setData = useCallback((data: T) => dispatch({ type: 'resolved', data }), [dispatch]);\n\n const setError = useCallback((error: Error) => dispatch({ type: 'rejected', error }), [dispatch]);\n\n return useMemo(\n () => ({\n setData,\n setError,\n run,\n ...asyncState,\n }),\n [asyncState, run, setData, setError],\n );\n};\n","import React, { useCallback, useLayoutEffect, useRef } from 'react';\n\nexport const useSafeDispatch = <T>(dispatch: React.Dispatch<T>): ((action: T) => void) => {\n const mounted = useRef(false);\n\n useLayoutEffect(() => {\n mounted.current = true;\n\n return () => {\n mounted.current = false;\n };\n }, []);\n\n return useCallback(\n (...args: Parameters<React.Dispatch<T>>) => {\n if (mounted.current) {\n dispatch(...args);\n }\n },\n [dispatch],\n );\n};\n","import { useMemo } from 'react';\n\nexport const useClassNames = (classes: Record<string, boolean>): string =>\n useMemo<string>(\n () =>\n Object.entries(classes)\n .reduce<Array<string>>(\n (compiledClassNames, [classname, value]) => (value ? [...compiledClassNames, classname] : compiledClassNames),\n [],\n )\n .join(' '),\n [classes],\n );\n","import { RefObject, useEffect, useLayoutEffect, useRef } from 'react';\n\nfunction useEventListener<EventName extends keyof MediaQueryListEventMap>(\n eventName: EventName,\n callback: (event: MediaQueryListEventMap[EventName]) => void,\n element: RefObject<MediaQueryList> | undefined,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<EventName extends keyof WindowEventMap>(\n eventName: EventName,\n callback: (event: WindowEventMap[EventName]) => void,\n element?: undefined,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<EventName extends keyof HTMLElementEventMap, ElementRef extends HTMLElement = HTMLDivElement>(\n eventName: EventName,\n callback: (event: HTMLElementEventMap[EventName]) => void,\n element: RefObject<ElementRef> | undefined,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<EventName extends keyof DocumentEventMap>(\n eventName: EventName,\n callback: (event: DocumentEventMap[EventName]) => void,\n element: RefObject<Document> | undefined,\n options?: boolean | AddEventListenerOptions,\n): void;\n\nfunction useEventListener<\n MediaQueryEventName extends keyof MediaQueryListEventMap,\n WindowEventName extends keyof WindowEventMap,\n ElementEventName extends keyof HTMLElementEventMap,\n DocumentEventName extends keyof DocumentEventMap,\n ElementRef extends HTMLElement | MediaQueryList | Document | Window | void = void,\n>(\n eventName: WindowEventName | DocumentEventName | ElementEventName | MediaQueryEventName,\n callback: (\n event:\n | MediaQueryListEventMap[MediaQueryEventName]\n | WindowEventMap[WindowEventName]\n | HTMLElementEventMap[ElementEventName]\n | DocumentEventMap[DocumentEventName]\n | Event,\n ) => void,\n element?: RefObject<ElementRef> | undefined,\n options?: boolean | AddEventListenerOptions,\n) {\n const callbackRef = useRef<EventListener>(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useLayoutEffect(() => {\n const targetElement = element?.current ?? window;\n\n if (!(targetElement && targetElement.addEventListener)) return;\n\n const listener: typeof callback = event => callbackRef.current(event);\n\n targetElement.addEventListener(eventName, listener, options);\n\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\nexport { useEventListener };\n","import { RefObject } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nconst checkIsOutside = (ref: RefObject<HTMLElement>, target: Node) => {\n return ref.current && !ref.current.contains(target);\n};\n\nexport const useClickOutside = <T extends HTMLElement>(\n ref: RefObject<T> | Array<RefObject<T>>,\n callback: () => void,\n) => {\n useEventListener('keydown', e => {\n if (e.key === 'Escape') {\n callback();\n }\n });\n\n useEventListener('mousedown', event => {\n const target = event.target as Node;\n\n if (!target?.isConnected) {\n return;\n }\n\n const isOutside = (Array.isArray(ref) ? ref : [ref]).every(r => checkIsOutside(r, target));\n\n if (isOutside) {\n callback();\n }\n });\n};\n","import { useState } from 'react';\n\nexport const useConstant = <T>(initializer: T | (() => T)): T => useState(initializer)[0];\n","import { useState, useCallback } from 'react';\n\nexport type CookieOptions = {\n days?: number;\n expires?: Date;\n maxAge?: number;\n path?: string;\n domain?: string;\n secure?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n};\n\nconst generateCookieAttributes = (options: CookieOptions): string => {\n const parts: Array<string> = [];\n\n if (options.expires instanceof Date) {\n parts.push(`expires=${options.expires.toUTCString()}`);\n } else if (typeof options.days === 'number') {\n const date = new Date();\n date.setTime(date.getTime() + options.days * 24 * 60 * 60 * 1000);\n parts.push(`expires=${date.toUTCString()}`);\n }\n\n if (typeof options.maxAge === 'number') {\n parts.push(`max-age=${options.maxAge}`);\n }\n\n parts.push(`path=${options.path ?? '/'}`);\n\n if (options.domain) {\n parts.push(`domain=${options.domain}`);\n }\n\n if (options.secure) {\n parts.push('secure');\n }\n\n if (options.sameSite) {\n parts.push(`SameSite=${options.sameSite}`);\n }\n\n return parts.length > 0 ? `; ${parts.join('; ')}` : '';\n};\n\nconst setCookie = (name: string, value: string, options: CookieOptions = {}): void => {\n if (typeof document === 'undefined') {\n return;\n }\n\n const encodedValue = encodeURIComponent(value);\n const attributes = generateCookieAttributes(options);\n document.cookie = `${name}=${encodedValue}${attributes}`;\n};\n\nconst getCookie = (name: string): string | null => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const nameEq = `${name}=`;\n const cookies = document.cookie ? document.cookie.split(';') : [];\n\n for (const cookie of cookies) {\n const cookieTrimmed = cookie.trim();\n\n if (cookieTrimmed.indexOf(nameEq) === 0) {\n return decodeURIComponent(cookieTrimmed.substring(nameEq.length));\n }\n }\n\n return null;\n};\n\nconst deleteCookie = (name: string, options: CookieOptions = {}) => {\n if (typeof document === 'undefined') {\n return;\n }\n\n // Ensure the same path/domain so that the deletion matches the existing cookie.\n setCookie(name, '', {\n ...options,\n days: -1,\n });\n};\n\ntype UpdateCookie<T> = (value: T, overrideOptions?: CookieOptions) => void;\ntype RemoveCookie = () => void;\n\nexport const useCookie = <T = unknown>(\n cookieName: string,\n defaultValue?: T,\n options: CookieOptions = {},\n): [T, UpdateCookie<T>, RemoveCookie] => {\n const [cookieValue, setCookieValue] = useState<T>(() => {\n const rawCookie = getCookie(cookieName);\n\n if (rawCookie !== null) {\n try {\n return JSON.parse(rawCookie) as T;\n } catch {\n return defaultValue as T;\n }\n }\n\n return defaultValue as T;\n });\n\n const updateCookie = useCallback<UpdateCookie<T>>(\n (value: T, overrideOptions: CookieOptions = {}) => {\n const mergedOptions = { ...options, ...overrideOptions };\n const stringValue = JSON.stringify(value);\n setCookie(cookieName, stringValue, mergedOptions);\n setCookieValue(value);\n },\n [cookieName, options],\n );\n\n const removeCookie = useCallback<RemoveCookie>(() => {\n deleteCookie(cookieName, options);\n setCookieValue(defaultValue as T);\n }, [cookieName, defaultValue, options]);\n\n return [cookieValue, updateCookie, removeCookie];\n};\n","import { useEffect, useState } from 'react';\n\nexport const useDebounce = <T>(value: T, delay: number = 500): T => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n};\n","import { useState } from 'react';\n\nimport { useResizeObserver } from './use-resize-observer';\n\nexport const useDimensions = (ref: React.RefObject<HTMLElement>) => {\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n\n useResizeObserver(ref, ([entry]) => {\n if ((entry?.borderBoxSize ?? [])[0]) {\n const { inlineSize: width, blockSize: height } = entry.borderBoxSize[0];\n setDimensions({ width, height });\n } else if (entry.contentRect) {\n const { width, height } = entry.contentRect;\n setDimensions({ width, height });\n }\n });\n\n return dimensions;\n};\n","import { RefObject, useEffect } from 'react';\n\nexport const useResizeObserver = <T extends Element>(\n ref: RefObject<T> | Array<RefObject<T>>,\n callback: ResizeObserverCallback,\n) => {\n useEffect(() => {\n const refs = Array.isArray(ref) ? ref : [ref];\n\n const observer = new ResizeObserver(callback);\n\n refs.forEach(r => r.current && observer.observe(r.current));\n\n return () => {\n observer.disconnect();\n };\n }, [ref, callback]);\n};\n","import { ForwardedRef, useEffect, useState } from 'react';\n\nexport const useDomContainer = (containerID: string, ref?: ForwardedRef<HTMLElement>) => {\n const [container, setContainer] = useState<HTMLElement | null>(() => document.getElementById(containerID));\n\n useEffect(() => {\n let domContainer = document.getElementById(containerID);\n\n if (!domContainer) {\n domContainer = document.createElement('div');\n domContainer.setAttribute('id', containerID);\n\n if (typeof ref === 'function') {\n ref(domContainer);\n } else if (ref) {\n ref.current = domContainer;\n }\n\n document.body.appendChild(domContainer);\n\n setContainer(domContainer);\n }\n\n return () => {\n if (domContainer) {\n document.body.removeChild(domContainer);\n }\n };\n }, [containerID, ref]);\n\n return container;\n};\n","import { useEffect, useState } from 'react';\n\nimport { formatBytes } from '@polpo/helpers';\n\nexport enum FileTypeEnum {\n PNG = 'image/png',\n PDF = 'application/pdf',\n}\n\nexport type FileResolvedT = {\n name: string;\n size: number;\n formatSize: string;\n type: FileTypeEnum;\n url: FileReader['result'];\n};\n\nexport const useFileReader = (inputFiles: Array<File>) => {\n const [files, setFiles] = useState<Array<FileResolvedT>>([]);\n\n useEffect(() => {\n const fileReaders: Array<FileReader> = [];\n let isCancel = false;\n\n if (!Array.isArray(inputFiles) || inputFiles.length === 0) {\n setFiles([]);\n } else {\n const promises = inputFiles.map(file => {\n return new Promise<FileResolvedT>((resolve, reject) => {\n const fileReader = new FileReader();\n fileReaders.push(fileReader);\n fileReader.onload = (e: ProgressEvent<FileReader>) => {\n if (e.target?.result) {\n resolve({\n name: file.name,\n size: file.size,\n formatSize: formatBytes(file.size),\n type: file.type as FileTypeEnum,\n url: e.target.result,\n });\n }\n };\n fileReader.onabort = () => {\n reject(new Error('File reading aborted'));\n };\n fileReader.onerror = () => {\n reject(new Error('Failed to read file'));\n };\n fileReader.readAsDataURL(file);\n });\n });\n\n Promise.all(promises).then(files => {\n if (!isCancel) {\n setFiles(files);\n }\n });\n }\n\n return () => {\n isCancel = true;\n fileReaders.forEach(fileReader => {\n fileReader.abort();\n });\n };\n }, [inputFiles]);\n\n return files;\n};\n","export const formatBytes = (bytes: number, decimals = 2) => {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n","export enum PositionContainer {\n CENTER = 'center',\n TOP = 'top',\n TOP_LEFT = 'top left',\n TOP_RIGHT = 'top right',\n TOP_CENTER = 'top center',\n LEFT = 'left',\n LEFT_TOP = 'left top',\n LEFT_BOTTOM = 'left bottom',\n LEFT_CENTER = 'left center',\n RIGHT = 'right',\n RIGHT_TOP = 'right top',\n RIGHT_BOTTOM = 'right bottom',\n RIGHT_CENTER = 'right center',\n BOTTOM = 'bottom',\n BOTTOM_LEFT = 'bottom left',\n BOTTOM_RIGHT = 'bottom right',\n BOTTOM_CENTER = 'bottom center',\n}\n\nexport type PositionObject = {\n x: number;\n y: number;\n top: number;\n left: number;\n w: number;\n h: number;\n};\n\nexport type ModalPosition = {\n left: number;\n top: number;\n};\n\nexport type GetModalPositionParams = {\n c: PositionObject;\n m: PositionObject;\n offset: number;\n position: PositionContainer;\n};\n\n/*\n * @description Calculates the position of the modal relative to the container\n *\n * @param c - The container's position object\n * @param m - The modal's position object\n * @param offset - The offset between the container and the modal\n * @param position - The position of the modal\n *\n * -----------------------------------------------------------------------------\n * @returns The position of the modal relative to the container\n */\nexport const getModalPosition = ({ c, m, offset, position }: GetModalPositionParams): ModalPosition => {\n // Default bottom\n let top = c.y + c.h + offset;\n let left = c.x - (m.w - c.w) * (50 / 100);\n\n switch (position) {\n case PositionContainer.TOP:\n case PositionContainer.TOP_CENTER:\n top = c.y - m.h - offset;\n left = c.x - (m.w - c.w) / 2;\n\n break;\n case PositionContainer.TOP_LEFT:\n top = c.y - m.h - offset;\n left = c.x - m.w + c.w;\n\n break;\n\n case PositionContainer.TOP_RIGHT:\n top = c.y - m.h - offset;\n left = c.x;\n\n break;\n\n case PositionContainer.BOTTOM:\n case PositionContainer.BOTTOM_CENTER:\n top = c.y + c.h + offset;\n left = c.x - (m.w - c.w) / 2;\n\n break;\n\n case PositionContainer.BOTTOM_LEFT:\n top = c.y + c.h + offset;\n left = c.x - m.w + c.w;\n\n break;\n\n case PositionContainer.BOTTOM_RIGHT:\n top = c.y + c.h + offset;\n left = c.x;\n\n break;\n\n case PositionContainer.LEFT:\n case PositionContainer.LEFT_CENTER:\n top = c.y - (m.h - c.h) / 2;\n left = c.x - m.w - offset;\n\n break;\n\n case PositionContainer.LEFT_TOP:\n top = c.y - m.h + c.h;\n left = c.x - m.w - offset;\n\n break;\n\n case PositionContainer.LEFT_BOTTOM:\n top = c.y;\n left = c.x - m.w - offset;\n\n break;\n\n case PositionContainer.RIGHT:\n case PositionContainer.RIGHT_CENTER:\n top = c.y - (m.h - c.h) / 2;\n left = c.x + c.w + offset;\n\n break;\n\n case PositionContainer.RIGHT_TOP:\n top = c.y - m.h + c.h;\n left = c.x + c.w + offset;\n\n break;\n\n case PositionContainer.RIGHT_BOTTOM:\n top = c.y;\n left = c.x + c.w + offset;\n\n break;\n }\n\n return {\n left: Math.round(left),\n top: Math.round(top),\n };\n};\n\nexport const getOppositePosition = (\n { top, left }: ModalPosition,\n position: PositionContainer,\n windowOffset: number,\n m: PositionObject,\n) => {\n const positions = position.split(' ');\n const newPosition = [];\n const rightOffset = left + m.w + windowOffset - window.innerWidth;\n const bottomOffset = top + m.h + windowOffset - window.innerHeight;\n\n for (const p of positions) {\n if (p === PositionContainer.TOP && top < windowOffset) {\n newPosition.push(PositionContainer.BOTTOM);\n } else if (p === PositionContainer.LEFT && left < windowOffset) {\n newPosition.push(PositionContainer.RIGHT);\n } else if (p === PositionContainer.BOTTOM && bottomOffset > 0) {\n newPosition.push(PositionContainer.TOP);\n } else if (p === PositionContainer.RIGHT && rightOffset > 0) {\n newPosition.push(PositionContainer.LEFT);\n } else {\n newPosition.push(p);\n }\n }\n\n return newPosition.join(' ') as PositionContainer;\n};\n\nexport const fixModalPosition = ({ top, left }: ModalPosition, m: PositionObject, windowOffset: number) => {\n const rightOffset = left + m.w + windowOffset - window.innerWidth;\n const bottomOffset = top + m.h + windowOffset - window.innerHeight;\n\n left = rightOffset > 0 ? left - rightOffset : left;\n top = bottomOffset > 0 ? top - bottomOffset : top;\n\n left = left < windowOffset ? windowOffset : left;\n top = top < windowOffset ? windowOffset : top;\n\n return { top, left };\n};\n\ntype getModalPositionRelativeToContainerParams = GetModalPositionParams & {\n windowOffset: number;\n};\n\nexport const getModalPositionRelativeToContainer = ({\n c,\n m,\n offset,\n windowOffset,\n position,\n}: getModalPositionRelativeToContainerParams): Record<string, string> => {\n const params = { c, m, offset, position };\n let modalContainerStyle = getModalPosition(params);\n\n const oppositePosition = getOppositePosition(modalContainerStyle, position, windowOffset, m);\n\n if (oppositePosition !== position) {\n modalContainerStyle = getModalPosition({\n ...params,\n position: oppositePosition,\n });\n }\n\n const fixedPosition = fixModalPosition(modalContainerStyle, m, windowOffset);\n\n return {\n left: `${fixedPosition.left}px`,\n top: `${fixedPosition.top}px`,\n };\n};\n","import { PositionContainer } from './get-modal-position';\n\nexport type GetModalPositionRelativeToScreenParams = {\n position: PositionContainer;\n windowOffset: number;\n};\n\nexport const getModalPositionRelativeToScreen = ({\n position,\n windowOffset,\n}: GetModalPositionRelativeToScreenParams): Record<string, string> => {\n switch (position) {\n case PositionContainer.CENTER:\n return {\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n };\n\n case PositionContainer.TOP:\n case PositionContainer.TOP_CENTER:\n return {\n top: `${windowOffset}px`,\n left: '50%',\n transform: 'translateX(-50%)',\n };\n\n case PositionContainer.TOP_LEFT:\n case PositionContainer.LEFT_TOP:\n return {\n top: `${windowOffset}px`,\n left: `${windowOffset}px`,\n };\n\n case PositionContainer.TOP_RIGHT:\n case PositionContainer.RIGHT_TOP:\n return {\n top: `${windowOffset}px`,\n right: `${windowOffset}px`,\n };\n\n case PositionContainer.BOTTOM:\n case PositionContainer.BOTTOM_CENTER:\n return {\n bottom: `${windowOffset}px`,\n left: '50%',\n transform: 'translateX(-50%)',\n };\n\n case PositionContainer.LEFT_BOTTOM:\n case PositionContainer.BOTTOM_LEFT:\n return {\n bottom: `${windowOffset}px`,\n left: `${windowOffset}px`,\n };\n\n case PositionContainer.RIGHT_BOTTOM:\n case PositionContainer.BOTTOM_RIGHT:\n return {\n bottom: `${windowOffset}px`,\n right: `${windowOffset}px`,\n };\n\n case PositionContainer.LEFT:\n case PositionContainer.LEFT_CENTER:\n return {\n top: '50%',\n left: `${windowOffset}px`,\n transform: 'translateY(-50%)',\n };\n\n case PositionContainer.RIGHT:\n case PositionContainer.RIGHT_CENTER:\n return {\n top: '50%',\n right: `${windowOffset}px`,\n transform: 'translateY(-50%)',\n };\n }\n\n return {\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n };\n};\n","import { useEffect, useRef, useState } from 'react';\n\ntype GeolocationData = GeolocationPosition['coords'] & {\n timestamp: GeolocationPosition['timestamp'];\n};\n\ninterface GeolocationError {\n code: number;\n message: string;\n}\n\ntype UseGeolocationReturn = {\n data: GeolocationData | null;\n error: GeolocationError | null;\n isLoading: boolean;\n};\n\nexport const useGeolocation = (): UseGeolocationReturn => {\n const [data, setData] = useState<GeolocationData | null>(null);\n const [error, setError] = useState<GeolocationError | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const watchIdRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!navigator.geolocation) {\n setError({\n code: 0,\n message: 'Geolocation is not supported by your browser.',\n });\n setIsLoading(false);\n\n return;\n }\n\n const handleSuccess = (position: GeolocationPosition) => {\n setData({\n ...position.coords,\n timestamp: position.timestamp,\n });\n setIsLoading(false);\n };\n\n const handleError = (geolocationError: GeolocationPositionError) => {\n setError({\n code: geolocationError.code,\n message: geolocationError.message,\n });\n setIsLoading(false);\n };\n\n navigator.geolocation.getCurrentPosition(handleSuccess, handleError);\n\n watchIdRef.current = navigator.geolocation.watchPosition(handleSuccess, handleError);\n\n return () => {\n if (watchIdRef.current !== null) {\n navigator.geolocation.clearWatch(watchIdRef.current);\n }\n };\n }, []);\n\n return { data, error, isLoading };\n};\n","import { useCallback, useRef, useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nexport const useHover = () => {\n const [isHovered, setIsHovered] = useState(false);\n const ref = useRef<HTMLElement>(null);\n\n const handleMouseEnter = useCallback(() => setIsHovered(true), []);\n\n const handleMouseLeave = useCallback(() => setIsHovered(false), []);\n\n useEventListener('mouseenter', handleMouseEnter, ref);\n useEventListener('mouseleave', handleMouseLeave, ref);\n\n return isHovered;\n};\n","import { useRef, useState } from 'react';\n\nimport { useIntersectionObserver } from './use-intersection-observer';\n\nexport const useInView = (initOptions: IntersectionObserverInit = {}) => {\n const [inView, setInView] = useState(false);\n const ref = useRef<Element>(null);\n\n useIntersectionObserver(\n ref,\n ([entry]) => {\n setInView(entry.isIntersecting);\n },\n initOptions,\n );\n\n return { ref, inView };\n};\n","import { RefObject, useEffect } from 'react';\n\nexport const useIntersectionObserver = <T extends Element>(\n ref: RefObject<T> | Array<RefObject<T>>,\n callback: IntersectionObserverCallback,\n initOptions: IntersectionObserverInit = {},\n) => {\n useEffect(() => {\n const refs = Array.isArray(ref) ? ref : [ref];\n\n const observer = new IntersectionObserver(callback, initOptions);\n\n refs.forEach(r => r.current && observer.observe(r.current));\n\n return () => {\n observer.disconnect();\n };\n }, [callback, initOptions, ref]);\n};\n","import React, { useCallback, useState } from 'react';\n\ntype InputTypes = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\ntype UseInputHandlersProps<T extends InputTypes> = {\n onBlur?: (e: React.FocusEvent<T>) => void;\n onFocus?: (e: React.FocusEvent<T>) => void;\n onChange?: (e: React.ChangeEvent<T>) => void;\n};\n\nexport const useInputHandlers = <T extends InputTypes>({\n onBlur,\n onFocus,\n onChange,\n}: UseInputHandlersProps<T> = {}) => {\n const [isFocus, setIsFocus] = useState(false);\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<T>) => {\n setIsFocus(true);\n onFocus && onFocus(e);\n },\n [onFocus],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<T>) => {\n setIsFocus(false);\n onBlur && onBlur(e);\n },\n [onBlur],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<T>) => {\n onChange && onChange(e);\n },\n [onChange],\n );\n\n return {\n isFocus,\n handlers: {\n onFocus: handleFocus,\n onBlur: handleBlur,\n onChange: handleChange,\n },\n };\n};\n","import { useEffect, useState } from 'react';\n\nexport const useMediaQuery = (query: string): boolean => {\n const [matches, setMatches] = useState(false);\n\n useEffect(() => {\n const media = window.matchMedia(query);\n\n if (media.matches !== matches) {\n setMatches(media.matches);\n }\n\n const listener = () => {\n setMatches(media.matches);\n };\n\n media.addEventListener('change', listener);\n\n return () => {\n media.removeEventListener('change', listener);\n };\n }, [matches, query]);\n\n return matches;\n};\n","import { useRef, useState } from 'react';\n\nexport const useModal = <T extends HTMLElement>() => {\n const containerRef = useRef<T>(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const openModal = () => {\n setIsOpen(true);\n };\n\n const closeModal = () => {\n setIsOpen(false);\n };\n\n return {\n containerRef,\n isOpen,\n openModal,\n closeModal,\n };\n};\n","import { RefObject, useCallback, useLayoutEffect, useRef } from 'react';\n\nimport { useClickOutside } from './use-click-outside';\nimport { useEventListener } from './use-event-listener';\nimport { useModalTransition } from './use-modal-transition';\nimport { useResizeObserver } from './use-resize-observer';\n\nimport {\n getModalPositionRelativeToContainer,\n getModalPositionRelativeToScreen,\n PositionContainer,\n PositionObject,\n} from '@polpo/helpers';\n\nconst convertDOMRectToPosition = (rect: DOMRectReadOnly): PositionObject => ({\n x: rect.x,\n y: rect.y,\n w: rect.width,\n h: rect.height,\n top: rect.top,\n left: rect.left,\n});\n\nexport type UseModalInContainerParams<\n Container extends HTMLElement = HTMLElement,\n Modal extends HTMLElement = Container,\n> = {\n closeOnClickOutside?: boolean;\n transitionDuration?: number;\n windowOffset?: number;\n offset?: number;\n position?: `${PositionContainer}`;\n modalRef: RefObject<Modal>;\n containerRef?: RefObject<Container>;\n onClose?: () => void;\n};\n\nexport const useModalInContainer = <\n Container extends HTMLElement = HTMLElement,\n Modal extends HTMLElement = Container,\n>({\n closeOnClickOutside = true,\n offset = 0,\n windowOffset = 0,\n position = PositionContainer.BOTTOM,\n transitionDuration = 0,\n modalRef,\n containerRef,\n onClose,\n}: UseModalInContainerParams<Container, Modal>) => {\n const containerTemporalRef = useRef<Container>(null);\n const modalState = useModalTransition(transitionDuration, onClose);\n\n const { isVisible, closeModal } = modalState;\n\n useClickOutside<Modal>(modalRef, () => {\n if (isVisible && closeOnClickOutside) {\n closeModal();\n }\n });\n\n const getPosition = useCallback(\n (modalRef: RefObject<Modal>, containerRef: RefObject<Container>) => {\n const modal = modalRef.current?.getClientRects()[0];\n const container = containerRef.current?.getClientRects()[0];\n\n if (!modal) {\n return;\n }\n\n const modalStyle: Record<string, string> = !container\n ? getModalPositionRelativeToScreen({ position: position as PositionContainer, windowOffset })\n : getModalPositionRelativeToContainer({\n c: convertDOMRectToPosition(container),\n m: convertDOMRectToPosition(modal),\n offset,\n windowOffset,\n position: position as PositionContainer,\n });\n\n Object.keys(modalStyle).forEach(key => {\n modalRef.current?.style.setProperty(key, modalStyle[key]);\n });\n },\n [position, windowOffset, offset],\n );\n\n const callback = useCallback(() => {\n if (isVisible) {\n getPosition(modalRef, containerRef ?? containerTemporalRef);\n }\n }, [getPosition, isVisible, containerRef, modalRef]);\n\n useLayoutEffect(callback, [callback]);\n\n useResizeObserver<Container>(containerRef ?? containerTemporalRef, callback);\n useResizeObserver<Modal>(modalRef, callback);\n useEventListener('resize', callback);\n useEventListener('scroll', callback, modalRef);\n\n return modalState;\n};\n","import React, { useCallback, useEffect, useMemo } from 'react';\n\nexport enum ModalState {\n OPENING = 'OPENING',\n OPEN = 'OPEN',\n CLOSING = 'CLOSING',\n CLOSED = 'CLOSED',\n}\n\nexport const useModalTransition = (transitionDuration: number = 0, onClose: () => void = () => null) => {\n const [modalState, setModalState] = React.useState<ModalState>(ModalState.CLOSED);\n\n const isVisible = useMemo(() => {\n return modalState !== ModalState.CLOSED;\n }, [modalState]);\n\n useEffect(() => {\n document.documentElement.style.overflow = isVisible ? 'hidden' : 'auto';\n }, [isVisible]);\n\n const closeModal = useCallback(() => {\n if ([ModalState.OPENING, ModalState.OPEN].includes(modalState)) {\n if (transitionDuration > 0) {\n setModalState(ModalState.CLOSING);\n setTimeout(() => {\n setModalState(ModalState.CLOSED);\n onClose();\n }, transitionDuration);\n } else {\n setModalState(ModalState.CLOSED);\n }\n }\n }, [onClose, modalState, transitionDuration]);\n\n const openModal = useCallback(() => {\n if ([ModalState.CLOSING, ModalState.CLOSED].includes(modalState)) {\n if (transitionDuration > 0) {\n setModalState(ModalState.OPENING);\n setTimeout(() => {\n setModalState(ModalState.OPEN);\n }, transitionDuration);\n } else {\n setModalState(ModalState.OPEN);\n }\n }\n }, [modalState, transitionDuration]);\n\n return {\n isVisible,\n closeModal,\n openModal,\n modalState,\n };\n};\n","import React, { useRef, useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\ntype MousePosition = {\n x: null | number;\n y: null | number;\n elementX: number | null;\n elementY: number | null;\n elementPositionX: number | null;\n elementPositionY: number | null;\n};\n\nconst getMousePosition = (domRect: DOMRect, e: MouseEvent) => {\n const { left, top } = domRect;\n const containerPositionX = left + window.scrollX;\n const containerPositionY = top + window.scrollY;\n const containerX = e.pageX - containerPositionX;\n const containerY = e.pageY - containerPositionY;\n\n return {\n x: e.pageX,\n y: e.pageY,\n elementX: containerX,\n elementY: containerY,\n elementPositionX: containerPositionX,\n elementPositionY: containerPositionY,\n };\n};\n\nexport const useMousePosition = (containerRef?: React.RefObject<HTMLElement | SVGElement | null>) => {\n const ref = useRef<HTMLElement>(null);\n const [position, setPosition] = useState<MousePosition>({\n x: null,\n y: null,\n elementX: null,\n elementY: null,\n elementPositionX: null,\n elementPositionY: null,\n });\n\n const mouseMove = (e: MouseEvent) => {\n const { clientX, clientY } = e;\n setPosition(prev => ({ ...prev, x: clientX, y: clientY }));\n\n if (containerRef?.current instanceof Element) {\n const newState = getMousePosition(containerRef.current.getBoundingClientRect(), e);\n setPosition(prev => ({\n ...prev,\n ...newState,\n }));\n } else if (ref.current instanceof Element) {\n const newState = getMousePosition(ref.current.getBoundingClientRect(), e);\n setPosition(prev => ({\n ...prev,\n ...newState,\n }));\n }\n };\n\n useEventListener('mousemove', mouseMove);\n\n return { ...position, ref };\n};\n","import { useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nexport const useOnlineStatus = () => {\n const [online, setOnline] = useState(navigator.onLine);\n\n useEventListener('online', () => setOnline(navigator.onLine));\n useEventListener('offline', () => setOnline(navigator.onLine));\n\n return online;\n};\n","import { useEffect, useRef } from 'react';\n\nexport const useRenderCount = () => {\n const count = useRef(1);\n\n useEffect(() => {\n count.current++;\n });\n\n return count.current;\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useScroll = () => {\n const ref = useRef<HTMLElement>(null);\n const [position, setPosition] = useState([0, 0]);\n\n useEffect(() => {\n const element = ref.current;\n\n const handleScroll = () => {\n if (!element) return;\n\n setPosition([element.scrollLeft, element.scrollTop]);\n };\n\n if (element) {\n element.addEventListener('scroll', handleScroll);\n }\n\n return () => {\n if (element) {\n element.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n return {\n ref,\n position,\n };\n};\n","import { Dispatch, SetStateAction, useEffect, useState } from 'react';\n\nfunction useStateHistory<T>(initialState: T | (() => T)): [T, Dispatch<SetStateAction<T>>, Array<T>];\n\nfunction useStateHistory<T = undefined>(): [T | undefined, Dispatch<SetStateAction<T | undefined>>, Array<T>];\n\nfunction useStateHistory<T = undefined>(\n initialState?: T | (() => T) | undefined,\n): [T | undefined, Dispatch<SetStateAction<T | undefined>>, Array<T>] {\n const [state, setState] = useState<T | undefined>(initialState);\n const [history, setHistory] = useState<Array<T>>([]);\n\n useEffect(() => {\n if (state !== undefined) {\n setHistory(prevHistory => [...prevHistory, state]);\n }\n }, [state]);\n\n return [state, setState, history];\n}\n\nexport { useStateHistory };\n","import { useCallback, useState } from 'react';\n\nexport const useToggle = (defaultValue: boolean = false) => {\n const [value, setValue] = useState<boolean>(defaultValue);\n\n const toggle = useCallback(() => {\n setValue(prev => !prev);\n }, []);\n\n return [value, toggle, setValue];\n};\n","import { useCallback, useState } from 'react';\n\nexport const useToggleValues = <T>(values: Array<T>, defaultIndex: number = 0): [T, (index?: number) => void] => {\n const [index, setIndex] = useState(defaultIndex);\n\n const toggle = useCallback(\n (index?: number) => {\n setIndex(index !== undefined ? index : prev => (prev + 1) % values.length);\n },\n [values.length],\n );\n\n return [values[index], toggle];\n};\n","import { useEffect, useState } from 'react';\n\nimport { useEventListener } from './use-event-listener';\n\nenum ScreenOrientation {\n PORTRAIT = 'portrait',\n LANDSCAPE = 'landscape',\n}\n\ntype UseViewportData = {\n width: number;\n height: number;\n orientation: ScreenOrientation;\n};\n\nexport const useViewport = (): UseViewportData => {\n const getData = (): UseViewportData => {\n const { innerWidth, innerHeight } = window;\n\n return {\n width: innerWidth,\n height: innerHeight,\n orientation: innerWidth > innerHeight ? ScreenOrientation.LANDSCAPE : ScreenOrientation.PORTRAIT,\n };\n };\n\n const [data, setData] = useState<UseViewportData>(getData);\n\n useEventListener('resize', () => {\n setData(getData());\n });\n\n useEffect(() => {\n setData(getData());\n }, []);\n\n return data;\n};\n"],"mappings":";ukBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,kBAAAE,GAAA,eAAAC,GAAA,aAAAC,GAAA,kBAAAC,GAAA,oBAAAC,EAAA,gBAAAC,GAAA,cAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,oBAAAC,GAAA,qBAAAC,EAAA,kBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,cAAAC,GAAA,qBAAAC,GAAA,4BAAAC,EAAA,kBAAAC,GAAA,aAAAC,GAAA,wBAAAC,GAAA,uBAAAC,EAAA,qBAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,sBAAAC,EAAA,oBAAAC,EAAA,cAAAC,GAAA,oBAAAC,GAAA,cAAAC,GAAA,oBAAAC,GAAA,gBAAAC,KAAA,eAAAC,GAAAjC,ICAA,IAAAkC,EAAwD,iBCAxD,IAAAC,EAA4D,iBAE/CC,EAAsBC,GAAuD,CACxF,IAAMC,KAAU,UAAO,EAAK,EAE5B,4BAAgB,KACdA,EAAQ,QAAU,GAEX,IAAM,CACXA,EAAQ,QAAU,EACpB,GACC,CAAC,CAAC,KAEE,eACL,IAAIC,IAAwC,CACtCD,EAAQ,SACVD,EAAS,GAAGE,CAAI,CAEpB,EACA,CAACF,CAAQ,CACX,CACF,EDMA,IAAMG,GAAe,CAAIC,EAAuBC,IAA0C,CACxF,OAAQA,EAAO,KAAM,CACnB,IAAK,UACH,MAAO,CAAE,OAAQ,UAAoB,KAAM,KAAM,MAAO,IAAK,EAE/D,IAAK,WACH,MAAO,CAAE,OAAQ,WAAqB,KAAMA,EAAO,KAAM,MAAO,IAAK,EAEvE,IAAK,WACH,MAAO,CAAE,OAAQ,WAAqB,KAAM,KAAM,MAAOA,EAAO,KAAM,EAExE,QACE,MAAM,IAAI,MAAM,qBAAqB,KAAK,UAAUA,CAAM,CAAC,EAAE,CAEjE,CACF,EAEaC,GACXC,GAKG,CACH,GAAM,CAACC,EAAYC,CAAc,KAAI,cAAyDN,GAAc,CAC1G,OAAQ,OACR,KAAM,KACN,MAAO,KACP,GAAGI,CACL,CAAC,EACKG,EAAWC,EAAgBF,CAAc,EAEzCG,KAAM,eACTC,GAAwB,CACvBH,EAAS,CAAE,KAAM,SAAU,CAAC,EAC5BG,EAAQ,KACNC,GAAQ,CACNJ,EAAS,CAAE,KAAM,WAAY,KAAAI,CAAK,CAAC,CACrC,EACCC,GAAiB,CAChBL,EAAS,CAAE,KAAM,WAAY,MAAAK,CAAM,CAAC,CACtC,CACF,CACF,EACA,CAACL,CAAQ,CACX,EAEMM,KAAU,eAAaF,GAAYJ,EAAS,CAAE,KAAM,WAAY,KAAAI,CAAK,CAAC,EAAG,CAACJ,CAAQ,CAAC,EAEnFO,KAAW,eAAaF,GAAiBL,EAAS,CAAE,KAAM,WAAY,MAAAK,CAAM,CAAC,EAAG,CAACL,CAAQ,CAAC,EAEhG,SAAO,WACL,KAAO,CACL,QAAAM,EACA,SAAAC,EACA,IAAAL,EACA,GAAGJ,CACL,GACA,CAACA,EAAYI,EAAKI,EAASC,CAAQ,CACrC,CACF,EEvFA,IAAAC,EAAwB,iBAEXC,GAAiBC,MAC5B,WACE,IACE,OAAO,QAAQA,CAAO,EACnB,OACC,CAACC,EAAoB,CAACC,EAAWC,CAAK,IAAOA,EAAQ,CAAC,GAAGF,EAAoBC,CAAS,EAAID,EAC1F,CAAC,CACH,EACC,KAAK,GAAG,EACb,CAACD,CAAO,CACV,ECZF,IAAAI,EAA8D,iBA8B9D,SAASC,EAOPC,EACAC,EAQAC,EACAC,EACA,CACA,IAAMC,KAAc,UAAsBH,CAAQ,KAElD,aAAU,IAAM,CACdG,EAAY,QAAUH,CACxB,EAAG,CAACA,CAAQ,CAAC,KAEb,mBAAgB,IAAM,CACpB,IAAMI,EAAgBH,GAAS,SAAW,OAE1C,GAAI,EAAEG,GAAiBA,EAAc,kBAAmB,OAExD,IAAMC,EAA4BC,GAASH,EAAY,QAAQG,CAAK,EAEpE,OAAAF,EAAc,iBAAiBL,EAAWM,EAAUH,CAAO,EAEpD,IAAM,CACXE,EAAc,oBAAoBL,EAAWM,EAAUH,CAAO,CAChE,CACF,EAAG,CAACH,EAAWE,EAASC,CAAO,CAAC,CAClC,CChEA,IAAMK,GAAiB,CAACC,EAA6BC,IAC5CD,EAAI,SAAW,CAACA,EAAI,QAAQ,SAASC,CAAM,EAGvCC,EAAkB,CAC7BF,EACAG,IACG,CACHC,EAAiB,UAAWC,GAAK,CAC3BA,EAAE,MAAQ,UACZF,EAAS,CAEb,CAAC,EAEDC,EAAiB,YAAaE,GAAS,CACrC,IAAML,EAASK,EAAM,OAErB,GAAI,CAACL,GAAQ,YACX,QAGiB,MAAM,QAAQD,CAAG,EAAIA,EAAM,CAACA,CAAG,GAAG,MAAMO,GAAKR,GAAeQ,EAAGN,CAAM,CAAC,GAGvFE,EAAS,CAEb,CAAC,CACH,EC/BA,IAAAK,EAAyB,iBAEZC,GAAkBC,MAAkC,YAASA,CAAW,EAAE,CAAC,ECFxF,IAAAC,EAAsC,iBAYhCC,GAA4BC,GAAmC,CACnE,IAAMC,EAAuB,CAAC,EAE9B,GAAID,EAAQ,mBAAmB,KAC7BC,EAAM,KAAK,WAAWD,EAAQ,QAAQ,YAAY,CAAC,EAAE,UAC5C,OAAOA,EAAQ,MAAS,SAAU,CAC3C,IAAME,EAAO,IAAI,KACjBA,EAAK,QAAQA,EAAK,QAAQ,EAAIF,EAAQ,KAAO,GAAK,GAAK,GAAK,GAAI,EAChEC,EAAM,KAAK,WAAWC,EAAK,YAAY,CAAC,EAAE,CAC5C,CAEA,OAAI,OAAOF,EAAQ,QAAW,UAC5BC,EAAM,KAAK,WAAWD,EAAQ,MAAM,EAAE,EAGxCC,EAAM,KAAK,QAAQD,EAAQ,MAAQ,GAAG,EAAE,EAEpCA,EAAQ,QACVC,EAAM,KAAK,UAAUD,EAAQ,MAAM,EAAE,EAGnCA,EAAQ,QACVC,EAAM,KAAK,QAAQ,EAGjBD,EAAQ,UACVC,EAAM,KAAK,YAAYD,EAAQ,QAAQ,EAAE,EAGpCC,EAAM,OAAS,EAAI,KAAKA,EAAM,KAAK,IAAI,CAAC,GAAK,EACtD,EAEME,EAAY,CAACC,EAAcC,EAAeL,EAAyB,CAAC,IAAY,CACpF,GAAI,OAAO,SAAa,IACtB,OAGF,IAAMM,EAAe,mBAAmBD,CAAK,EACvCE,EAAaR,GAAyBC,CAAO,EACnD,SAAS,OAAS,GAAGI,CAAI,IAAIE,CAAY,GAAGC,CAAU,EACxD,EAEMC,GAAaJ,GAAgC,CACjD,GAAI,OAAO,SAAa,IACtB,OAAO,KAGT,IAAMK,EAAS,GAAGL,CAAI,IAChBM,EAAU,SAAS,OAAS,SAAS,OAAO,MAAM,GAAG,EAAI,CAAC,EAEhE,QAAWC,KAAUD,EAAS,CAC5B,IAAME,EAAgBD,EAAO,KAAK,EAElC,GAAIC,EAAc,QAAQH,CAAM,IAAM,EACpC,OAAO,mBAAmBG,EAAc,UAAUH,EAAO,MAAM,CAAC,CAEpE,CAEA,OAAO,IACT,EAEMI,GAAe,CAACT,EAAcJ,EAAyB,CAAC,IAAM,CAC9D,OAAO,SAAa,KAKxBG,EAAUC,EAAM,GAAI,CAClB,GAAGJ,EACH,KAAM,EACR,CAAC,CACH,EAKac,GAAY,CACvBC,EACAC,EACAhB,EAAyB,CAAC,IACa,CACvC,GAAM,CAACiB,EAAaC,CAAc,KAAI,YAAY,IAAM,CACtD,IAAMC,EAAYX,GAAUO,CAAU,EAEtC,GAAII,IAAc,KAChB,GAAI,CACF,OAAO,KAAK,MAAMA,CAAS,CAC7B,MAAQ,CACN,OAAOH,CACT,CAGF,OAAOA,CACT,CAAC,EAEKI,KAAe,eACnB,CAACf,EAAUgB,EAAiC,CAAC,IAAM,CACjD,IAAMC,EAAgB,CAAE,GAAGtB,EAAS,GAAGqB,CAAgB,EACjDE,EAAc,KAAK,UAAUlB,CAAK,EACxCF,EAAUY,EAAYQ,EAAaD,CAAa,EAChDJ,EAAeb,CAAK,CACtB,EACA,CAACU,EAAYf,CAAO,CACtB,EAEMwB,KAAe,eAA0B,IAAM,CACnDX,GAAaE,EAAYf,CAAO,EAChCkB,EAAeF,CAAiB,CAClC,EAAG,CAACD,EAAYC,EAAchB,CAAO,CAAC,EAEtC,MAAO,CAACiB,EAAaG,EAAcI,CAAY,CACjD,EC3HA,IAAAC,EAAoC,iBAEvBC,GAAc,CAAIC,EAAUC,EAAgB,MAAW,CAClE,GAAM,CAACC,EAAgBC,CAAiB,KAAI,YAAYH,CAAK,EAE7D,sBAAU,IAAM,CACd,IAAMI,EAAQ,WAAW,IAAMD,EAAkBH,CAAK,EAAGC,CAAK,EAE9D,MAAO,IAAM,CACX,aAAaG,CAAK,CACpB,CACF,EAAG,CAACJ,EAAOC,CAAK,CAAC,EAEVC,CACT,ECdA,IAAAG,EAAyB,iBCAzB,IAAAC,EAAqC,iBAExBC,EAAoB,CAC/BC,EACAC,IACG,IACH,aAAU,IAAM,CACd,IAAMC,EAAO,MAAM,QAAQF,CAAG,EAAIA,EAAM,CAACA,CAAG,EAEtCG,EAAW,IAAI,eAAeF,CAAQ,EAE5C,OAAAC,EAAK,QAAQ,GAAK,EAAE,SAAWC,EAAS,QAAQ,EAAE,OAAO,CAAC,EAEnD,IAAM,CACXA,EAAS,WAAW,CACtB,CACF,EAAG,CAACH,EAAKC,CAAQ,CAAC,CACpB,EDbO,IAAMG,GAAiBC,GAAsC,CAClE,GAAM,CAACC,EAAYC,CAAa,KAAI,YAAS,CAAE,MAAO,EAAG,OAAQ,CAAE,CAAC,EAEpE,OAAAC,EAAkBH,EAAK,CAAC,CAACI,CAAK,IAAM,CAClC,IAAKA,GAAO,eAAiB,CAAC,GAAG,CAAC,EAAG,CACnC,GAAM,CAAE,WAAYC,EAAO,UAAWC,CAAO,EAAIF,EAAM,cAAc,CAAC,EACtEF,EAAc,CAAE,MAAAG,EAAO,OAAAC,CAAO,CAAC,CACjC,SAAWF,EAAM,YAAa,CAC5B,GAAM,CAAE,MAAAC,EAAO,OAAAC,CAAO,EAAIF,EAAM,YAChCF,EAAc,CAAE,MAAAG,EAAO,OAAAC,CAAO,CAAC,CACjC,CACF,CAAC,EAEML,CACT,EElBA,IAAAM,EAAkD,iBAErCC,GAAkB,CAACC,EAAqBC,IAAoC,CACvF,GAAM,CAACC,EAAWC,CAAY,KAAI,YAA6B,IAAM,SAAS,eAAeH,CAAW,CAAC,EAEzG,sBAAU,IAAM,CACd,IAAII,EAAe,SAAS,eAAeJ,CAAW,EAEtD,OAAKI,IACHA,EAAe,SAAS,cAAc,KAAK,EAC3CA,EAAa,aAAa,KAAMJ,CAAW,EAEvC,OAAOC,GAAQ,WACjBA,EAAIG,CAAY,EACPH,IACTA,EAAI,QAAUG,GAGhB,SAAS,KAAK,YAAYA,CAAY,EAEtCD,EAAaC,CAAY,GAGpB,IAAM,CACPA,GACF,SAAS,KAAK,YAAYA,CAAY,CAE1C,CACF,EAAG,CAACJ,EAAaC,CAAG,CAAC,EAEdC,CACT,EC/BA,IAAAG,EAAoC,iBCA7B,IAAMC,EAAc,CAACC,EAAeC,EAAW,IAAM,CAC1D,GAAID,IAAU,EAAG,MAAO,UAExB,IAAME,EAAI,IACJC,EAAKF,EAAW,EAAI,EAAIA,EACxBG,EAAQ,CAAC,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAEhEC,EAAI,KAAK,MAAM,KAAK,IAAIL,CAAK,EAAI,KAAK,IAAIE,CAAC,CAAC,EAElD,OAAO,YAAYF,EAAQ,KAAK,IAAIE,EAAGG,CAAC,GAAG,QAAQF,CAAE,CAAC,EAAI,IAAMC,EAAMC,CAAC,CACzE,EC0CO,IAAMC,GAAmB,CAAC,CAAE,EAAAC,EAAG,EAAAC,EAAG,OAAAC,EAAQ,SAAAC,CAAS,IAA6C,CAErG,IAAIC,EAAMJ,EAAE,EAAIA,EAAE,EAAIE,EAClBG,EAAOL,EAAE,GAAKC,EAAE,EAAID,EAAE,IAAM,GAAK,KAErC,OAAQG,EAAU,CAChB,IAAK,MACL,IAAK,aACHC,EAAMJ,EAAE,EAAIC,EAAE,EAAIC,EAClBG,EAAOL,EAAE,GAAKC,EAAE,EAAID,EAAE,GAAK,EAE3B,MACF,IAAK,WACHI,EAAMJ,EAAE,EAAIC,EAAE,EAAIC,EAClBG,EAAOL,EAAE,EAAIC,EAAE,EAAID,EAAE,EAErB,MAEF,IAAK,YACHI,EAAMJ,EAAE,EAAIC,EAAE,EAAIC,EAClBG,EAAOL,EAAE,EAET,MAEF,IAAK,SACL,IAAK,gBACHI,EAAMJ,EAAE,EAAIA,EAAE,EAAIE,EAClBG,EAAOL,EAAE,GAAKC,EAAE,EAAID,EAAE,GAAK,EAE3B,MAEF,IAAK,cACHI,EAAMJ,EAAE,EAAIA,EAAE,EAAIE,EAClBG,EAAOL,EAAE,EAAIC,EAAE,EAAID,EAAE,EAErB,MAEF,IAAK,eACHI,EAAMJ,EAAE,EAAIA,EAAE,EAAIE,EAClBG,EAAOL,EAAE,EAET,MAEF,IAAK,OACL,IAAK,cACHI,EAAMJ,EAAE,GAAKC,EAAE,EAAID,EAAE,GAAK,EAC1BK,EAAOL,EAAE,EAAIC,EAAE,EAAIC,EAEnB,MAEF,IAAK,WACHE,EAAMJ,EAAE,EAAIC,EAAE,EAAID,EAAE,EACpBK,EAAOL,EAAE,EAAIC,EAAE,EAAIC,EAEnB,MAEF,IAAK,cACHE,EAAMJ,EAAE,EACRK,EAAOL,EAAE,EAAIC,EAAE,EAAIC,EAEnB,MAEF,IAAK,QACL,IAAK,eACHE,EAAMJ,EAAE,GAAKC,EAAE,EAAID,EAAE,GAAK,EAC1BK,EAAOL,EAAE,EAAIA,EAAE,EAAIE,EAEnB,MAEF,IAAK,YACHE,EAAMJ,EAAE,EAAIC,EAAE,EAAID,EAAE,EACpBK,EAAOL,EAAE,EAAIA,EAAE,EAAIE,EAEnB,MAEF,IAAK,eACHE,EAAMJ,EAAE,EACRK,EAAOL,EAAE,EAAIA,EAAE,EAAIE,EAEnB,KACJ,CAEA,MAAO,CACL,KAAM,KAAK,MAAMG,CAAI,EACrB,IAAK,KAAK,MAAMD,CAAG,CACrB,CACF,EAEaE,GAAsB,CACjC,CAAE,IAAAF,EAAK,KAAAC,CAAK,EACZF,EACAI,EACAN,IACG,CACH,IAAMO,EAAYL,EAAS,MAAM,GAAG,EAC9BM,EAAc,CAAC,EACfC,EAAcL,EAAOJ,EAAE,EAAIM,EAAe,OAAO,WACjDI,EAAeP,EAAMH,EAAE,EAAIM,EAAe,OAAO,YAEvD,QAAWK,KAAKJ,EACVI,IAAM,OAAyBR,EAAMG,EACvCE,EAAY,KAAK,QAAwB,EAChCG,IAAM,QAA0BP,EAAOE,EAChDE,EAAY,KAAK,OAAuB,EAC/BG,IAAM,UAA4BD,EAAe,EAC1DF,EAAY,KAAK,KAAqB,EAC7BG,IAAM,SAA2BF,EAAc,EACxDD,EAAY,KAAK,MAAsB,EAEvCA,EAAY,KAAKG,CAAC,EAItB,OAAOH,EAAY,KAAK,GAAG,CAC7B,EAEaI,GAAmB,CAAC,CAAE,IAAAT,EAAK,KAAAC,CAAK,EAAkBJ,EAAmBM,IAAyB,CACzG,IAAMG,EAAcL,EAAOJ,EAAE,EAAIM,EAAe,OAAO,WACjDI,EAAeP,EAAMH,EAAE,EAAIM,EAAe,OAAO,YAEvD,OAAAF,EAAOK,EAAc,EAAIL,EAAOK,EAAcL,EAC9CD,EAAMO,EAAe,EAAIP,EAAMO,EAAeP,EAE9CC,EAAOA,EAAOE,EAAeA,EAAeF,EAC5CD,EAAMA,EAAMG,EAAeA,EAAeH,EAEnC,CAAE,IAAAA,EAAK,KAAAC,CAAK,CACrB,EAMaS,GAAsC,CAAC,CAClD,EAAAd,EACA,EAAAC,EACA,OAAAC,EACA,aAAAK,EACA,SAAAJ,CACF,IAAyE,CACvE,IAAMY,EAAS,CAAE,EAAAf,EAAG,EAAAC,EAAG,OAAAC,EAAQ,SAAAC,CAAS,EACpCa,EAAsBjB,GAAiBgB,CAAM,EAE3CE,EAAmBX,GAAoBU,EAAqBb,EAAUI,EAAcN,CAAC,EAEvFgB,IAAqBd,IACvBa,EAAsBjB,GAAiB,CACrC,GAAGgB,EACH,SAAUE,CACZ,CAAC,GAGH,IAAMC,EAAgBL,GAAiBG,EAAqBf,EAAGM,CAAY,EAE3E,MAAO,CACL,KAAM,GAAGW,EAAc,IAAI,KAC3B,IAAK,GAAGA,EAAc,GAAG,IAC3B,CACF,EC3MO,IAAMC,GAAmC,CAAC,CAC/C,SAAAC,EACA,aAAAC,CACF,IAAsE,CACpE,OAAQD,EAAU,CAChB,aACE,MAAO,CACL,IAAK,MACL,KAAM,MACN,UAAW,uBACb,EAEF,UACA,iBACE,MAAO,CACL,IAAK,GAAGC,CAAY,KACpB,KAAM,MACN,UAAW,kBACb,EAEF,eACA,eACE,MAAO,CACL,IAAK,GAAGA,CAAY,KACpB,KAAM,GAAGA,CAAY,IACvB,EAEF,gBACA,gBACE,MAAO,CACL,IAAK,GAAGA,CAAY,KACpB,MAAO,GAAGA,CAAY,IACxB,EAEF,aACA,oBACE,MAAO,CACL,OAAQ,GAAGA,CAAY,KACvB,KAAM,MACN,UAAW,kBACb,EAEF,kBACA,kBACE,MAAO,CACL,OAAQ,GAAGA,CAAY,KACvB,KAAM,GAAGA,CAAY,IACvB,EAEF,mBACA,mBACE,MAAO,CACL,OAAQ,GAAGA,CAAY,KACvB,MAAO,GAAGA,CAAY,IACxB,EAEF,WACA,kBACE,MAAO,CACL,IAAK,MACL,KAAM,GAAGA,CAAY,KACrB,UAAW,kBACb,EAEF,YACA,mBACE,MAAO,CACL,IAAK,MACL,MAAO,GAAGA,CAAY,KACtB,UAAW,kBACb,CACJ,CAEA,MAAO,CACL,IAAK,MACL,KAAM,MACN,UAAW,uBACb,CACF,EHjFO,IAAKC,QACVA,EAAA,IAAM,YACNA,EAAA,IAAM,kBAFIA,QAAA,IAaCC,GAAiBC,GAA4B,CACxD,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAA+B,CAAC,CAAC,EAE3D,sBAAU,IAAM,CACd,IAAMC,EAAiC,CAAC,EACpCC,EAAW,GAEf,GAAI,CAAC,MAAM,QAAQJ,CAAU,GAAKA,EAAW,SAAW,EACtDE,EAAS,CAAC,CAAC,MACN,CACL,IAAMG,EAAWL,EAAW,IAAIM,GACvB,IAAI,QAAuB,CAACC,EAASC,IAAW,CACrD,IAAMC,EAAa,IAAI,WACvBN,EAAY,KAAKM,CAAU,EAC3BA,EAAW,OAAUC,GAAiC,CAChDA,EAAE,QAAQ,QACZH,EAAQ,CACN,KAAMD,EAAK,KACX,KAAMA,EAAK,KACX,WAAYK,EAAYL,EAAK,IAAI,EACjC,KAAMA,EAAK,KACX,IAAKI,EAAE,OAAO,MAChB,CAAC,CAEL,EACAD,EAAW,QAAU,IAAM,CACzBD,EAAO,IAAI,MAAM,sBAAsB,CAAC,CAC1C,EACAC,EAAW,QAAU,IAAM,CACzBD,EAAO,IAAI,MAAM,qBAAqB,CAAC,CACzC,EACAC,EAAW,cAAcH,CAAI,CAC/B,CAAC,CACF,EAED,QAAQ,IAAID,CAAQ,EAAE,KAAKJ,GAAS,CAC7BG,GACHF,EAASD,CAAK,CAElB,CAAC,CACH,CAEA,MAAO,IAAM,CACXG,EAAW,GACXD,EAAY,QAAQM,GAAc,CAChCA,EAAW,MAAM,CACnB,CAAC,CACH,CACF,EAAG,CAACT,CAAU,CAAC,EAERC,CACT,EIpEA,IAAAW,EAA4C,iBAiB/BC,GAAiB,IAA4B,CACxD,GAAM,CAACC,EAAMC,CAAO,KAAI,YAAiC,IAAI,EACvD,CAACC,EAAOC,CAAQ,KAAI,YAAkC,IAAI,EAC1D,CAACC,EAAWC,CAAY,KAAI,YAAkB,EAAI,EAClDC,KAAa,UAAsB,IAAI,EAE7C,sBAAU,IAAM,CACd,GAAI,CAAC,UAAU,YAAa,CAC1BH,EAAS,CACP,KAAM,EACN,QAAS,+CACX,CAAC,EACDE,EAAa,EAAK,EAElB,MACF,CAEA,IAAME,EAAiBC,GAAkC,CACvDP,EAAQ,CACN,GAAGO,EAAS,OACZ,UAAWA,EAAS,SACtB,CAAC,EACDH,EAAa,EAAK,CACpB,EAEMI,EAAeC,GAA+C,CAClEP,EAAS,CACP,KAAMO,EAAiB,KACvB,QAASA,EAAiB,OAC5B,CAAC,EACDL,EAAa,EAAK,CACpB,EAEA,iBAAU,YAAY,mBAAmBE,EAAeE,CAAW,EAEnEH,EAAW,QAAU,UAAU,YAAY,cAAcC,EAAeE,CAAW,EAE5E,IAAM,CACPH,EAAW,UAAY,MACzB,UAAU,YAAY,WAAWA,EAAW,OAAO,CAEvD,CACF,EAAG,CAAC,CAAC,EAEE,CAAE,KAAAN,EAAM,MAAAE,EAAO,UAAAE,CAAU,CAClC,EC9DA,IAAAO,EAA8C,iBAIvC,IAAMC,GAAW,IAAM,CAC5B,GAAM,CAACC,EAAWC,CAAY,KAAI,YAAS,EAAK,EAC1CC,KAAM,UAAoB,IAAI,EAE9BC,KAAmB,eAAY,IAAMF,EAAa,EAAI,EAAG,CAAC,CAAC,EAE3DG,KAAmB,eAAY,IAAMH,EAAa,EAAK,EAAG,CAAC,CAAC,EAElE,OAAAI,EAAiB,aAAcF,EAAkBD,CAAG,EACpDG,EAAiB,aAAcD,EAAkBF,CAAG,EAE7CF,CACT,EChBA,IAAAM,EAAiC,iBCAjC,IAAAC,GAAqC,iBAExBC,EAA0B,CACrCC,EACAC,EACAC,EAAwC,CAAC,IACtC,IACH,cAAU,IAAM,CACd,IAAMC,EAAO,MAAM,QAAQH,CAAG,EAAIA,EAAM,CAACA,CAAG,EAEtCI,EAAW,IAAI,qBAAqBH,EAAUC,CAAW,EAE/D,OAAAC,EAAK,QAAQE,GAAKA,EAAE,SAAWD,EAAS,QAAQC,EAAE,OAAO,CAAC,EAEnD,IAAM,CACXD,EAAS,WAAW,CACtB,CACF,EAAG,CAACH,EAAUC,EAAaF,CAAG,CAAC,CACjC,EDdO,IAAMM,GAAY,CAACC,EAAwC,CAAC,IAAM,CACvE,GAAM,CAACC,EAAQC,CAAS,KAAI,YAAS,EAAK,EACpCC,KAAM,UAAgB,IAAI,EAEhC,OAAAC,EACED,EACA,CAAC,CAACE,CAAK,IAAM,CACXH,EAAUG,EAAM,cAAc,CAChC,EACAL,CACF,EAEO,CAAE,IAAAG,EAAK,OAAAF,CAAO,CACvB,EEjBA,IAAAK,EAA6C,iBAUhCC,GAAmB,CAAuB,CACrD,OAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAA8B,CAAC,IAAM,CACnC,GAAM,CAACC,EAASC,CAAU,KAAI,YAAS,EAAK,EAEtCC,KAAc,eACjBC,GAA2B,CAC1BF,EAAW,EAAI,EACfH,GAAWA,EAAQK,CAAC,CACtB,EACA,CAACL,CAAO,CACV,EAEMM,KAAa,eAChBD,GAA2B,CAC1BF,EAAW,EAAK,EAChBJ,GAAUA,EAAOM,CAAC,CACpB,EACA,CAACN,CAAM,CACT,EAEMQ,KAAe,eAClBF,GAA4B,CAC3BJ,GAAYA,EAASI,CAAC,CACxB,EACA,CAACJ,CAAQ,CACX,EAEA,MAAO,CACL,QAAAC,EACA,SAAU,CACR,QAASE,EACT,OAAQE,EACR,SAAUC,CACZ,CACF,CACF,EChDA,IAAAC,EAAoC,iBAEvBC,GAAiBC,GAA2B,CACvD,GAAM,CAACC,EAASC,CAAU,KAAI,YAAS,EAAK,EAE5C,sBAAU,IAAM,CACd,IAAMC,EAAQ,OAAO,WAAWH,CAAK,EAEjCG,EAAM,UAAYF,GACpBC,EAAWC,EAAM,OAAO,EAG1B,IAAMC,EAAW,IAAM,CACrBF,EAAWC,EAAM,OAAO,CAC1B,EAEA,OAAAA,EAAM,iBAAiB,SAAUC,CAAQ,EAElC,IAAM,CACXD,EAAM,oBAAoB,SAAUC,CAAQ,CAC9C,CACF,EAAG,CAACH,EAASD,CAAK,CAAC,EAEZC,CACT,ECxBA,IAAAI,EAAiC,iBAEpBC,GAAW,IAA6B,CACnD,IAAMC,KAAe,UAAU,IAAI,EAC7B,CAACC,EAAQC,CAAS,KAAI,YAAS,EAAK,EAU1C,MAAO,CACL,aAAAF,EACA,OAAAC,EACA,UAXgB,IAAM,CACtBC,EAAU,EAAI,CAChB,EAUE,WARiB,IAAM,CACvBA,EAAU,EAAK,CACjB,CAOA,CACF,ECpBA,IAAAC,EAAgE,iBCAhE,IAAAC,EAAuD,uBAE3CC,QACVA,EAAA,QAAU,UACVA,EAAA,KAAO,OACPA,EAAA,QAAU,UACVA,EAAA,OAAS,SAJCA,QAAA,IAOCC,EAAqB,CAACC,EAA6B,EAAGC,EAAsB,IAAM,OAAS,CACtG,GAAM,CAACC,EAAYC,CAAa,EAAI,EAAAC,QAAM,SAAqB,QAAiB,EAE1EC,KAAY,WAAQ,IACjBH,IAAe,SACrB,CAACA,CAAU,CAAC,KAEf,aAAU,IAAM,CACd,SAAS,gBAAgB,MAAM,SAAWG,EAAY,SAAW,MACnE,EAAG,CAACA,CAAS,CAAC,EAEd,IAAMC,KAAa,eAAY,IAAM,CAC/B,CAAC,UAAoB,MAAe,EAAE,SAASJ,CAAU,IACvDF,EAAqB,GACvBG,EAAc,SAAkB,EAChC,WAAW,IAAM,CACfA,EAAc,QAAiB,EAC/BF,EAAQ,CACV,EAAGD,CAAkB,GAErBG,EAAc,QAAiB,EAGrC,EAAG,CAACF,EAASC,EAAYF,CAAkB,CAAC,EAEtCO,KAAY,eAAY,IAAM,CAC9B,CAAC,UAAoB,QAAiB,EAAE,SAASL,CAAU,IACzDF,EAAqB,GACvBG,EAAc,SAAkB,EAChC,WAAW,IAAM,CACfA,EAAc,MAAe,CAC/B,EAAGH,CAAkB,GAErBG,EAAc,MAAe,EAGnC,EAAG,CAACD,EAAYF,CAAkB,CAAC,EAEnC,MAAO,CACL,UAAAK,EACA,WAAAC,EACA,UAAAC,EACA,WAAAL,CACF,CACF,EDvCA,IAAMM,GAA4BC,IAA2C,CAC3E,EAAGA,EAAK,EACR,EAAGA,EAAK,EACR,EAAGA,EAAK,MACR,EAAGA,EAAK,OACR,IAAKA,EAAK,IACV,KAAMA,EAAK,IACb,GAgBaC,GAAsB,CAGjC,CACA,oBAAAC,EAAsB,GACtB,OAAAC,EAAS,EACT,aAAAC,EAAe,EACf,SAAAC,WACA,mBAAAC,EAAqB,EACrB,SAAAC,EACA,aAAAC,EACA,QAAAC,CACF,IAAmD,CACjD,IAAMC,KAAuB,UAAkB,IAAI,EAC7CC,EAAaC,EAAmBN,EAAoBG,CAAO,EAE3D,CAAE,UAAAI,EAAW,WAAAC,EAAW,EAAIH,EAElCI,EAAuBR,EAAU,IAAM,CACjCM,GAAaX,GACfY,GAAW,CAEf,CAAC,EAED,IAAME,KAAc,eAClB,CAACT,EAA4BC,KAAuC,CAClE,IAAMS,EAAQV,EAAS,SAAS,eAAe,EAAE,CAAC,EAC5CW,EAAYV,GAAa,SAAS,eAAe,EAAE,CAAC,EAE1D,GAAI,CAACS,EACH,OAGF,IAAME,EAAsCD,EAExCE,GAAoC,CAClC,EAAGrB,GAAyBmB,CAAS,EACrC,EAAGnB,GAAyBkB,CAAK,EACjC,OAAAd,EACA,aAAAC,EACA,SAAUC,CACZ,CAAC,EAPDgB,GAAiC,CAAE,SAAUhB,EAA+B,aAAAD,CAAa,CAAC,EAS9F,OAAO,KAAKe,CAAU,EAAE,QAAQG,GAAO,CACrCf,EAAS,SAAS,MAAM,YAAYe,EAAKH,EAAWG,CAAG,CAAC,CAC1D,CAAC,CACH,EACA,CAACjB,EAAUD,EAAcD,CAAM,CACjC,EAEMoB,KAAW,eAAY,IAAM,CAC7BV,GACFG,EAAYT,EAAUC,GAAgBE,CAAoB,CAE9D,EAAG,CAACM,EAAaH,EAAWL,EAAcD,CAAQ,CAAC,EAEnD,4BAAgBgB,EAAU,CAACA,CAAQ,CAAC,EAEpCC,EAA6BhB,GAAgBE,EAAsBa,CAAQ,EAC3EC,EAAyBjB,EAAUgB,CAAQ,EAC3CE,EAAiB,SAAUF,CAAQ,EACnCE,EAAiB,SAAUF,EAAUhB,CAAQ,EAEtCI,CACT,EErGA,IAAAe,EAAwC,iBAaxC,IAAMC,GAAmB,CAACC,EAAkBC,IAAkB,CAC5D,GAAM,CAAE,KAAAC,EAAM,IAAAC,CAAI,EAAIH,EAChBI,EAAqBF,EAAO,OAAO,QACnCG,EAAqBF,EAAM,OAAO,QAClCG,EAAaL,EAAE,MAAQG,EACvBG,EAAaN,EAAE,MAAQI,EAE7B,MAAO,CACL,EAAGJ,EAAE,MACL,EAAGA,EAAE,MACL,SAAUK,EACV,SAAUC,EACV,iBAAkBH,EAClB,iBAAkBC,CACpB,CACF,EAEaG,GAAoBC,GAAoE,CACnG,IAAMC,KAAM,UAAoB,IAAI,EAC9B,CAACC,EAAUC,CAAW,KAAI,YAAwB,CACtD,EAAG,KACH,EAAG,KACH,SAAU,KACV,SAAU,KACV,iBAAkB,KAClB,iBAAkB,IACpB,CAAC,EAqBD,OAAAC,EAAiB,YAnBEZ,GAAkB,CACnC,GAAM,CAAE,QAAAa,EAAS,QAAAC,CAAQ,EAAId,EAG7B,GAFAW,EAAYI,IAAS,CAAE,GAAGA,EAAM,EAAGF,EAAS,EAAGC,CAAQ,EAAE,EAErDN,GAAc,mBAAmB,QAAS,CAC5C,IAAMQ,EAAWlB,GAAiBU,EAAa,QAAQ,sBAAsB,EAAGR,CAAC,EACjFW,EAAYI,IAAS,CACnB,GAAGA,EACH,GAAGC,CACL,EAAE,CACJ,SAAWP,EAAI,mBAAmB,QAAS,CACzC,IAAMO,EAAWlB,GAAiBW,EAAI,QAAQ,sBAAsB,EAAGT,CAAC,EACxEW,EAAYI,IAAS,CACnB,GAAGA,EACH,GAAGC,CACL,EAAE,CACJ,CACF,CAEuC,EAEhC,CAAE,GAAGN,EAAU,IAAAD,CAAI,CAC5B,EC/DA,IAAAQ,GAAyB,iBAIlB,IAAMC,GAAkB,IAAM,CACnC,GAAM,CAACC,EAAQC,CAAS,KAAI,aAAS,UAAU,MAAM,EAErD,OAAAC,EAAiB,SAAU,IAAMD,EAAU,UAAU,MAAM,CAAC,EAC5DC,EAAiB,UAAW,IAAMD,EAAU,UAAU,MAAM,CAAC,EAEtDD,CACT,ECXA,IAAAG,EAAkC,iBAErBC,GAAiB,IAAM,CAClC,IAAMC,KAAQ,UAAO,CAAC,EAEtB,sBAAU,IAAM,CACdA,EAAM,SACR,CAAC,EAEMA,EAAM,OACf,ECVA,IAAAC,EAA4C,iBAE/BC,GAAY,IAAM,CAC7B,IAAMC,KAAM,UAAoB,IAAI,EAC9B,CAACC,EAAUC,CAAW,KAAI,YAAS,CAAC,EAAG,CAAC,CAAC,EAE/C,sBAAU,IAAM,CACd,IAAMC,EAAUH,EAAI,QAEdI,EAAe,IAAM,CACpBD,GAELD,EAAY,CAACC,EAAQ,WAAYA,EAAQ,SAAS,CAAC,CACrD,EAEA,OAAIA,GACFA,EAAQ,iBAAiB,SAAUC,CAAY,EAG1C,IAAM,CACPD,GACFA,EAAQ,oBAAoB,SAAUC,CAAY,CAEtD,CACF,EAAG,CAAC,CAAC,EAEE,CACL,IAAAJ,EACA,SAAAC,CACF,CACF,EC9BA,IAAAI,EAA8D,iBAM9D,SAASC,GACPC,EACoE,CACpE,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAwBF,CAAY,EACxD,CAACG,EAASC,CAAU,KAAI,YAAmB,CAAC,CAAC,EAEnD,sBAAU,IAAM,CACVH,IAAU,QACZG,EAAWC,GAAe,CAAC,GAAGA,EAAaJ,CAAK,CAAC,CAErD,EAAG,CAACA,CAAK,CAAC,EAEH,CAACA,EAAOC,EAAUC,CAAO,CAClC,CCnBA,IAAAG,EAAsC,iBAEzBC,GAAY,CAACC,EAAwB,KAAU,CAC1D,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAkBF,CAAY,EAElDG,KAAS,eAAY,IAAM,CAC/BD,EAASE,GAAQ,CAACA,CAAI,CACxB,EAAG,CAAC,CAAC,EAEL,MAAO,CAACH,EAAOE,EAAQD,CAAQ,CACjC,ECVA,IAAAG,EAAsC,iBAEzBC,GAAkB,CAAIC,EAAkBC,EAAuB,IAAqC,CAC/G,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAASF,CAAY,EAEzCG,KAAS,eACZF,GAAmB,CAClBC,EAASD,IAAU,OAAYA,EAAQG,IAASA,EAAO,GAAKL,EAAO,MAAM,CAC3E,EACA,CAACA,EAAO,MAAM,CAChB,EAEA,MAAO,CAACA,EAAOE,CAAK,EAAGE,CAAM,CAC/B,ECbA,IAAAE,EAAoC,iBAe7B,IAAMC,GAAc,IAAuB,CAChD,IAAMC,EAAU,IAAuB,CACrC,GAAM,CAAE,WAAAC,EAAY,YAAAC,CAAY,EAAI,OAEpC,MAAO,CACL,MAAOD,EACP,OAAQC,EACR,YAAaD,EAAaC,EAAc,YAA8B,UACxE,CACF,EAEM,CAACC,EAAMC,CAAO,KAAI,YAA0BJ,CAAO,EAEzD,OAAAK,EAAiB,SAAU,IAAM,CAC/BD,EAAQJ,EAAQ,CAAC,CACnB,CAAC,KAED,aAAU,IAAM,CACdI,EAAQJ,EAAQ,CAAC,CACnB,EAAG,CAAC,CAAC,EAEEG,CACT","names":["hooks_exports","__export","FileTypeEnum","ModalState","useAsync","useClassNames","useClickOutside","useConstant","useCookie","useDebounce","useDimensions","useDomContainer","useEventListener","useFileReader","useGeolocation","useHover","useInView","useInputHandlers","useIntersectionObserver","useMediaQuery","useModal","useModalInContainer","useModalTransition","useMousePosition","useOnlineStatus","useRenderCount","useResizeObserver","useSafeDispatch","useScroll","useStateHistory","useToggle","useToggleValues","useViewport","__toCommonJS","import_react","import_react","useSafeDispatch","dispatch","mounted","args","asyncReducer","_state","action","useAsync","initialState","asyncState","unsafeDispatch","dispatch","useSafeDispatch","run","promise","data","error","setData","setError","import_react","useClassNames","classes","compiledClassNames","classname","value","import_react","useEventListener","eventName","callback","element","options","callbackRef","targetElement","listener","event","checkIsOutside","ref","target","useClickOutside","callback","useEventListener","e","event","r","import_react","useConstant","initializer","import_react","generateCookieAttributes","options","parts","date","setCookie","name","value","encodedValue","attributes","getCookie","nameEq","cookies","cookie","cookieTrimmed","deleteCookie","useCookie","cookieName","defaultValue","cookieValue","setCookieValue","rawCookie","updateCookie","overrideOptions","mergedOptions","stringValue","removeCookie","import_react","useDebounce","value","delay","debouncedValue","setDebouncedValue","timer","import_react","import_react","useResizeObserver","ref","callback","refs","observer","useDimensions","ref","dimensions","setDimensions","useResizeObserver","entry","width","height","import_react","useDomContainer","containerID","ref","container","setContainer","domContainer","import_react","formatBytes","bytes","decimals","k","dm","sizes","i","getModalPosition","c","m","offset","position","top","left","getOppositePosition","windowOffset","positions","newPosition","rightOffset","bottomOffset","p","fixModalPosition","getModalPositionRelativeToContainer","params","modalContainerStyle","oppositePosition","fixedPosition","getModalPositionRelativeToScreen","position","windowOffset","FileTypeEnum","useFileReader","inputFiles","files","setFiles","fileReaders","isCancel","promises","file","resolve","reject","fileReader","e","formatBytes","import_react","useGeolocation","data","setData","error","setError","isLoading","setIsLoading","watchIdRef","handleSuccess","position","handleError","geolocationError","import_react","useHover","isHovered","setIsHovered","ref","handleMouseEnter","handleMouseLeave","useEventListener","import_react","import_react","useIntersectionObserver","ref","callback","initOptions","refs","observer","r","useInView","initOptions","inView","setInView","ref","useIntersectionObserver","entry","import_react","useInputHandlers","onBlur","onFocus","onChange","isFocus","setIsFocus","handleFocus","e","handleBlur","handleChange","import_react","useMediaQuery","query","matches","setMatches","media","listener","import_react","useModal","containerRef","isOpen","setIsOpen","import_react","import_react","ModalState","useModalTransition","transitionDuration","onClose","modalState","setModalState","React","isVisible","closeModal","openModal","convertDOMRectToPosition","rect","useModalInContainer","closeOnClickOutside","offset","windowOffset","position","transitionDuration","modalRef","containerRef","onClose","containerTemporalRef","modalState","useModalTransition","isVisible","closeModal","useClickOutside","getPosition","modal","container","modalStyle","getModalPositionRelativeToContainer","getModalPositionRelativeToScreen","key","callback","useResizeObserver","useEventListener","import_react","getMousePosition","domRect","e","left","top","containerPositionX","containerPositionY","containerX","containerY","useMousePosition","containerRef","ref","position","setPosition","useEventListener","clientX","clientY","prev","newState","import_react","useOnlineStatus","online","setOnline","useEventListener","import_react","useRenderCount","count","import_react","useScroll","ref","position","setPosition","element","handleScroll","import_react","useStateHistory","initialState","state","setState","history","setHistory","prevHistory","import_react","useToggle","defaultValue","value","setValue","toggle","prev","import_react","useToggleValues","values","defaultIndex","index","setIndex","toggle","prev","import_react","useViewport","getData","innerWidth","innerHeight","data","setData","useEventListener"]}
|
package/dist/hooks.d.cts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React$1 from 'react';
|
|
2
|
-
import React__default, { RefObject, Dispatch, SetStateAction } from 'react';
|
|
3
|
-
|
|
2
|
+
import React__default, { RefObject, ForwardedRef, Dispatch, SetStateAction } from 'react';
|
|
3
|
+
export { M as ModalState, U as UseModalInContainerParams, u as useModalInContainer, a as useModalTransition } from './use-modal-in-container-DiNW1PE_.cjs';
|
|
4
|
+
import './get-modal-position-drle0OjP.cjs';
|
|
4
5
|
|
|
5
6
|
type AsyncState<T> = {
|
|
6
7
|
status: 'idle' | 'pending';
|
|
@@ -23,19 +24,36 @@ declare const useAsync: <T>(initialState?: AsyncState<T>) => AsyncState<T> & {
|
|
|
23
24
|
|
|
24
25
|
declare const useClassNames: (classes: Record<string, boolean>) => string;
|
|
25
26
|
|
|
27
|
+
declare const useClickOutside: <T extends HTMLElement>(ref: RefObject<T> | Array<RefObject<T>>, callback: () => void) => void;
|
|
28
|
+
|
|
26
29
|
declare const useConstant: <T>(initializer: T | (() => T)) => T;
|
|
27
30
|
|
|
31
|
+
type CookieOptions = {
|
|
32
|
+
days?: number;
|
|
33
|
+
expires?: Date;
|
|
34
|
+
maxAge?: number;
|
|
35
|
+
path?: string;
|
|
36
|
+
domain?: string;
|
|
37
|
+
secure?: boolean;
|
|
38
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
39
|
+
};
|
|
40
|
+
type UpdateCookie<T> = (value: T, overrideOptions?: CookieOptions) => void;
|
|
41
|
+
type RemoveCookie = () => void;
|
|
42
|
+
declare const useCookie: <T = unknown>(cookieName: string, defaultValue?: T, options?: CookieOptions) => [T, UpdateCookie<T>, RemoveCookie];
|
|
43
|
+
|
|
28
44
|
declare const useDebounce: <T>(value: T, delay?: number) => T;
|
|
29
45
|
|
|
30
|
-
declare const useDimensions: (ref:
|
|
46
|
+
declare const useDimensions: (ref: React.RefObject<HTMLElement>) => {
|
|
31
47
|
width: number;
|
|
32
48
|
height: number;
|
|
33
49
|
};
|
|
34
50
|
|
|
35
|
-
declare
|
|
51
|
+
declare const useDomContainer: (containerID: string, ref?: ForwardedRef<HTMLElement>) => HTMLElement | null;
|
|
52
|
+
|
|
53
|
+
declare function useEventListener<EventName extends keyof MediaQueryListEventMap>(eventName: EventName, callback: (event: MediaQueryListEventMap[EventName]) => void, element: RefObject<MediaQueryList> | undefined, options?: boolean | AddEventListenerOptions): void;
|
|
36
54
|
declare function useEventListener<EventName extends keyof WindowEventMap>(eventName: EventName, callback: (event: WindowEventMap[EventName]) => void, element?: undefined, options?: boolean | AddEventListenerOptions): void;
|
|
37
|
-
declare function useEventListener<EventName extends keyof HTMLElementEventMap, ElementRef extends HTMLElement = HTMLDivElement>(eventName: EventName, callback: (event: HTMLElementEventMap[EventName]) => void, element: RefObject<ElementRef
|
|
38
|
-
declare function useEventListener<EventName extends keyof DocumentEventMap>(eventName: EventName, callback: (event: DocumentEventMap[EventName]) => void, element: RefObject<Document
|
|
55
|
+
declare function useEventListener<EventName extends keyof HTMLElementEventMap, ElementRef extends HTMLElement = HTMLDivElement>(eventName: EventName, callback: (event: HTMLElementEventMap[EventName]) => void, element: RefObject<ElementRef> | undefined, options?: boolean | AddEventListenerOptions): void;
|
|
56
|
+
declare function useEventListener<EventName extends keyof DocumentEventMap>(eventName: EventName, callback: (event: DocumentEventMap[EventName]) => void, element: RefObject<Document> | undefined, options?: boolean | AddEventListenerOptions): void;
|
|
39
57
|
|
|
40
58
|
declare enum FileTypeEnum {
|
|
41
59
|
PNG = "image/png",
|
|
@@ -50,6 +68,22 @@ type FileResolvedT = {
|
|
|
50
68
|
};
|
|
51
69
|
declare const useFileReader: (inputFiles: Array<File>) => FileResolvedT[];
|
|
52
70
|
|
|
71
|
+
type GeolocationData = GeolocationPosition['coords'] & {
|
|
72
|
+
timestamp: GeolocationPosition['timestamp'];
|
|
73
|
+
};
|
|
74
|
+
interface GeolocationError {
|
|
75
|
+
code: number;
|
|
76
|
+
message: string;
|
|
77
|
+
}
|
|
78
|
+
type UseGeolocationReturn = {
|
|
79
|
+
data: GeolocationData | null;
|
|
80
|
+
error: GeolocationError | null;
|
|
81
|
+
isLoading: boolean;
|
|
82
|
+
};
|
|
83
|
+
declare const useGeolocation: () => UseGeolocationReturn;
|
|
84
|
+
|
|
85
|
+
declare const useHover: () => boolean;
|
|
86
|
+
|
|
53
87
|
declare const useInView: (initOptions?: IntersectionObserverInit) => {
|
|
54
88
|
ref: React$1.RefObject<Element>;
|
|
55
89
|
inView: boolean;
|
|
@@ -70,29 +104,33 @@ declare const useInputHandlers: <T extends InputTypes>({ onBlur, onFocus, onChan
|
|
|
70
104
|
};
|
|
71
105
|
};
|
|
72
106
|
|
|
107
|
+
declare const useIntersectionObserver: <T extends Element>(ref: RefObject<T> | Array<RefObject<T>>, callback: IntersectionObserverCallback, initOptions?: IntersectionObserverInit) => void;
|
|
108
|
+
|
|
73
109
|
declare const useMediaQuery: (query: string) => boolean;
|
|
74
110
|
|
|
75
|
-
|
|
76
|
-
|
|
111
|
+
declare const useModal: <T extends HTMLElement>() => {
|
|
112
|
+
containerRef: React$1.RefObject<T>;
|
|
113
|
+
isOpen: boolean;
|
|
114
|
+
openModal: () => void;
|
|
115
|
+
closeModal: () => void;
|
|
77
116
|
};
|
|
78
|
-
declare const useModalInContainer: <Container extends HTMLElement, Modal extends HTMLElement = Container>({ closeOnClickOutside, offset, windowOffset, position, distancePercentage, }?: useModalInContainerParams) => {
|
|
79
|
-
isVisible: boolean;
|
|
80
|
-
setIsVisible: React__default.Dispatch<React__default.SetStateAction<boolean>>;
|
|
81
|
-
modalStyle: React__default.CSSProperties;
|
|
82
|
-
containerRef: React__default.RefObject<Container>;
|
|
83
|
-
modalRef: React__default.RefObject<Modal>;
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
declare const useMousePosition: () => number[];
|
|
87
117
|
|
|
88
|
-
declare const
|
|
89
|
-
|
|
90
|
-
|
|
118
|
+
declare const useMousePosition: (containerRef?: React__default.RefObject<HTMLElement | SVGElement | null>) => {
|
|
119
|
+
ref: React__default.RefObject<HTMLElement>;
|
|
120
|
+
x: null | number;
|
|
121
|
+
y: null | number;
|
|
122
|
+
elementX: number | null;
|
|
123
|
+
elementY: number | null;
|
|
124
|
+
elementPositionX: number | null;
|
|
125
|
+
elementPositionY: number | null;
|
|
126
|
+
};
|
|
91
127
|
|
|
92
128
|
declare const useOnlineStatus: () => boolean;
|
|
93
129
|
|
|
94
130
|
declare const useRenderCount: () => number;
|
|
95
131
|
|
|
132
|
+
declare const useResizeObserver: <T extends Element>(ref: RefObject<T> | Array<RefObject<T>>, callback: ResizeObserverCallback) => void;
|
|
133
|
+
|
|
96
134
|
declare const useSafeDispatch: <T>(dispatch: React__default.Dispatch<T>) => ((action: T) => void);
|
|
97
135
|
|
|
98
136
|
declare const useScroll: () => {
|
|
@@ -118,4 +156,4 @@ type UseViewportData = {
|
|
|
118
156
|
};
|
|
119
157
|
declare const useViewport: () => UseViewportData;
|
|
120
158
|
|
|
121
|
-
export { type FileResolvedT, FileTypeEnum, useAsync, useClassNames, useConstant, useDebounce, useDimensions, useEventListener, useFileReader, useInView, useInputHandlers, useMediaQuery,
|
|
159
|
+
export { type CookieOptions, type FileResolvedT, FileTypeEnum, useAsync, useClassNames, useClickOutside, useConstant, useCookie, useDebounce, useDimensions, useDomContainer, useEventListener, useFileReader, useGeolocation, useHover, useInView, useInputHandlers, useIntersectionObserver, useMediaQuery, useModal, useMousePosition, useOnlineStatus, useRenderCount, useResizeObserver, useSafeDispatch, useScroll, useStateHistory, useToggle, useToggleValues, useViewport };
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React$1 from 'react';
|
|
2
|
-
import React__default, { RefObject, Dispatch, SetStateAction } from 'react';
|
|
3
|
-
|
|
2
|
+
import React__default, { RefObject, ForwardedRef, Dispatch, SetStateAction } from 'react';
|
|
3
|
+
export { M as ModalState, U as UseModalInContainerParams, u as useModalInContainer, a as useModalTransition } from './use-modal-in-container-neGo-kMk.js';
|
|
4
|
+
import './get-modal-position-drle0OjP.js';
|
|
4
5
|
|
|
5
6
|
type AsyncState<T> = {
|
|
6
7
|
status: 'idle' | 'pending';
|
|
@@ -23,19 +24,36 @@ declare const useAsync: <T>(initialState?: AsyncState<T>) => AsyncState<T> & {
|
|
|
23
24
|
|
|
24
25
|
declare const useClassNames: (classes: Record<string, boolean>) => string;
|
|
25
26
|
|
|
27
|
+
declare const useClickOutside: <T extends HTMLElement>(ref: RefObject<T> | Array<RefObject<T>>, callback: () => void) => void;
|
|
28
|
+
|
|
26
29
|
declare const useConstant: <T>(initializer: T | (() => T)) => T;
|
|
27
30
|
|
|
31
|
+
type CookieOptions = {
|
|
32
|
+
days?: number;
|
|
33
|
+
expires?: Date;
|
|
34
|
+
maxAge?: number;
|
|
35
|
+
path?: string;
|
|
36
|
+
domain?: string;
|
|
37
|
+
secure?: boolean;
|
|
38
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
39
|
+
};
|
|
40
|
+
type UpdateCookie<T> = (value: T, overrideOptions?: CookieOptions) => void;
|
|
41
|
+
type RemoveCookie = () => void;
|
|
42
|
+
declare const useCookie: <T = unknown>(cookieName: string, defaultValue?: T, options?: CookieOptions) => [T, UpdateCookie<T>, RemoveCookie];
|
|
43
|
+
|
|
28
44
|
declare const useDebounce: <T>(value: T, delay?: number) => T;
|
|
29
45
|
|
|
30
|
-
declare const useDimensions: (ref:
|
|
46
|
+
declare const useDimensions: (ref: React.RefObject<HTMLElement>) => {
|
|
31
47
|
width: number;
|
|
32
48
|
height: number;
|
|
33
49
|
};
|
|
34
50
|
|
|
35
|
-
declare
|
|
51
|
+
declare const useDomContainer: (containerID: string, ref?: ForwardedRef<HTMLElement>) => HTMLElement | null;
|
|
52
|
+
|
|
53
|
+
declare function useEventListener<EventName extends keyof MediaQueryListEventMap>(eventName: EventName, callback: (event: MediaQueryListEventMap[EventName]) => void, element: RefObject<MediaQueryList> | undefined, options?: boolean | AddEventListenerOptions): void;
|
|
36
54
|
declare function useEventListener<EventName extends keyof WindowEventMap>(eventName: EventName, callback: (event: WindowEventMap[EventName]) => void, element?: undefined, options?: boolean | AddEventListenerOptions): void;
|
|
37
|
-
declare function useEventListener<EventName extends keyof HTMLElementEventMap, ElementRef extends HTMLElement = HTMLDivElement>(eventName: EventName, callback: (event: HTMLElementEventMap[EventName]) => void, element: RefObject<ElementRef
|
|
38
|
-
declare function useEventListener<EventName extends keyof DocumentEventMap>(eventName: EventName, callback: (event: DocumentEventMap[EventName]) => void, element: RefObject<Document
|
|
55
|
+
declare function useEventListener<EventName extends keyof HTMLElementEventMap, ElementRef extends HTMLElement = HTMLDivElement>(eventName: EventName, callback: (event: HTMLElementEventMap[EventName]) => void, element: RefObject<ElementRef> | undefined, options?: boolean | AddEventListenerOptions): void;
|
|
56
|
+
declare function useEventListener<EventName extends keyof DocumentEventMap>(eventName: EventName, callback: (event: DocumentEventMap[EventName]) => void, element: RefObject<Document> | undefined, options?: boolean | AddEventListenerOptions): void;
|
|
39
57
|
|
|
40
58
|
declare enum FileTypeEnum {
|
|
41
59
|
PNG = "image/png",
|
|
@@ -50,6 +68,22 @@ type FileResolvedT = {
|
|
|
50
68
|
};
|
|
51
69
|
declare const useFileReader: (inputFiles: Array<File>) => FileResolvedT[];
|
|
52
70
|
|
|
71
|
+
type GeolocationData = GeolocationPosition['coords'] & {
|
|
72
|
+
timestamp: GeolocationPosition['timestamp'];
|
|
73
|
+
};
|
|
74
|
+
interface GeolocationError {
|
|
75
|
+
code: number;
|
|
76
|
+
message: string;
|
|
77
|
+
}
|
|
78
|
+
type UseGeolocationReturn = {
|
|
79
|
+
data: GeolocationData | null;
|
|
80
|
+
error: GeolocationError | null;
|
|
81
|
+
isLoading: boolean;
|
|
82
|
+
};
|
|
83
|
+
declare const useGeolocation: () => UseGeolocationReturn;
|
|
84
|
+
|
|
85
|
+
declare const useHover: () => boolean;
|
|
86
|
+
|
|
53
87
|
declare const useInView: (initOptions?: IntersectionObserverInit) => {
|
|
54
88
|
ref: React$1.RefObject<Element>;
|
|
55
89
|
inView: boolean;
|
|
@@ -70,29 +104,33 @@ declare const useInputHandlers: <T extends InputTypes>({ onBlur, onFocus, onChan
|
|
|
70
104
|
};
|
|
71
105
|
};
|
|
72
106
|
|
|
107
|
+
declare const useIntersectionObserver: <T extends Element>(ref: RefObject<T> | Array<RefObject<T>>, callback: IntersectionObserverCallback, initOptions?: IntersectionObserverInit) => void;
|
|
108
|
+
|
|
73
109
|
declare const useMediaQuery: (query: string) => boolean;
|
|
74
110
|
|
|
75
|
-
|
|
76
|
-
|
|
111
|
+
declare const useModal: <T extends HTMLElement>() => {
|
|
112
|
+
containerRef: React$1.RefObject<T>;
|
|
113
|
+
isOpen: boolean;
|
|
114
|
+
openModal: () => void;
|
|
115
|
+
closeModal: () => void;
|
|
77
116
|
};
|
|
78
|
-
declare const useModalInContainer: <Container extends HTMLElement, Modal extends HTMLElement = Container>({ closeOnClickOutside, offset, windowOffset, position, distancePercentage, }?: useModalInContainerParams) => {
|
|
79
|
-
isVisible: boolean;
|
|
80
|
-
setIsVisible: React__default.Dispatch<React__default.SetStateAction<boolean>>;
|
|
81
|
-
modalStyle: React__default.CSSProperties;
|
|
82
|
-
containerRef: React__default.RefObject<Container>;
|
|
83
|
-
modalRef: React__default.RefObject<Modal>;
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
declare const useMousePosition: () => number[];
|
|
87
117
|
|
|
88
|
-
declare const
|
|
89
|
-
|
|
90
|
-
|
|
118
|
+
declare const useMousePosition: (containerRef?: React__default.RefObject<HTMLElement | SVGElement | null>) => {
|
|
119
|
+
ref: React__default.RefObject<HTMLElement>;
|
|
120
|
+
x: null | number;
|
|
121
|
+
y: null | number;
|
|
122
|
+
elementX: number | null;
|
|
123
|
+
elementY: number | null;
|
|
124
|
+
elementPositionX: number | null;
|
|
125
|
+
elementPositionY: number | null;
|
|
126
|
+
};
|
|
91
127
|
|
|
92
128
|
declare const useOnlineStatus: () => boolean;
|
|
93
129
|
|
|
94
130
|
declare const useRenderCount: () => number;
|
|
95
131
|
|
|
132
|
+
declare const useResizeObserver: <T extends Element>(ref: RefObject<T> | Array<RefObject<T>>, callback: ResizeObserverCallback) => void;
|
|
133
|
+
|
|
96
134
|
declare const useSafeDispatch: <T>(dispatch: React__default.Dispatch<T>) => ((action: T) => void);
|
|
97
135
|
|
|
98
136
|
declare const useScroll: () => {
|
|
@@ -118,4 +156,4 @@ type UseViewportData = {
|
|
|
118
156
|
};
|
|
119
157
|
declare const useViewport: () => UseViewportData;
|
|
120
158
|
|
|
121
|
-
export { type FileResolvedT, FileTypeEnum, useAsync, useClassNames, useConstant, useDebounce, useDimensions, useEventListener, useFileReader, useInView, useInputHandlers, useMediaQuery,
|
|
159
|
+
export { type CookieOptions, type FileResolvedT, FileTypeEnum, useAsync, useClassNames, useClickOutside, useConstant, useCookie, useDebounce, useDimensions, useDomContainer, useEventListener, useFileReader, useGeolocation, useHover, useInView, useInputHandlers, useIntersectionObserver, useMediaQuery, useModal, useMousePosition, useOnlineStatus, useRenderCount, useResizeObserver, useSafeDispatch, useScroll, useStateHistory, useToggle, useToggleValues, useViewport };
|
package/dist/hooks.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w}from"./chunk-
|
|
2
|
+
import{A,B,C,D,E,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}from"./chunk-ROUSN3KT.js";import"./chunk-MAWW6AA7.js";export{l as FileTypeEnum,u as ModalState,b as useAsync,c as useClassNames,e as useClickOutside,f as useConstant,g as useCookie,h as useDebounce,j as useDimensions,k as useDomContainer,d as useEventListener,m as useFileReader,n as useGeolocation,o as useHover,q as useInView,r as useInputHandlers,p as useIntersectionObserver,s as useMediaQuery,t as useModal,w as useModalInContainer,v as useModalTransition,x as useMousePosition,y as useOnlineStatus,z as useRenderCount,i as useResizeObserver,a as useSafeDispatch,A as useScroll,B as useStateHistory,C as useToggle,D as useToggleValues,E as useViewport};
|
|
3
3
|
//# sourceMappingURL=hooks.js.map
|