@siberiacancode/reactuse 0.3.9 → 0.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/hooks/useActiveElement/useActiveElement.cjs +1 -1
- package/dist/cjs/hooks/useActiveElement/useActiveElement.cjs.map +1 -1
- package/dist/cjs/hooks/useAutoScroll/useAutoScroll.cjs +1 -1
- package/dist/cjs/hooks/useAutoScroll/useAutoScroll.cjs.map +1 -1
- package/dist/cjs/hooks/useClickOutside/useClickOutside.cjs +1 -1
- package/dist/cjs/hooks/useClickOutside/useClickOutside.cjs.map +1 -1
- package/dist/cjs/hooks/useDoubleClick/useDoubleClick.cjs +1 -1
- package/dist/cjs/hooks/useDoubleClick/useDoubleClick.cjs.map +1 -1
- package/dist/cjs/hooks/useFocusTrap/useFocusTrap.cjs.map +1 -1
- package/dist/cjs/hooks/useHash/useHash.cjs +1 -1
- package/dist/cjs/hooks/useHash/useHash.cjs.map +1 -1
- package/dist/cjs/hooks/useHover/useHover.cjs +1 -1
- package/dist/cjs/hooks/useHover/useHover.cjs.map +1 -1
- package/dist/cjs/hooks/useInfiniteScroll/useInfiniteScroll.cjs +1 -1
- package/dist/cjs/hooks/useInfiniteScroll/useInfiniteScroll.cjs.map +1 -1
- package/dist/cjs/hooks/useKeyPress/useKeyPress.cjs +1 -1
- package/dist/cjs/hooks/useKeyPress/useKeyPress.cjs.map +1 -1
- package/dist/cjs/hooks/useKeysPressed/useKeysPressed.cjs +1 -1
- package/dist/cjs/hooks/useKeysPressed/useKeysPressed.cjs.map +1 -1
- package/dist/cjs/hooks/useLongPress/useLongPress.cjs +1 -1
- package/dist/cjs/hooks/useLongPress/useLongPress.cjs.map +1 -1
- package/dist/cjs/hooks/useMediaControls/useMediaControls.cjs.map +1 -1
- package/dist/cjs/hooks/usePostMessage/usePostMessage.cjs +1 -1
- package/dist/cjs/hooks/usePostMessage/usePostMessage.cjs.map +1 -1
- package/dist/cjs/hooks/useSticky/useSticky.cjs +1 -1
- package/dist/cjs/hooks/useSticky/useSticky.cjs.map +1 -1
- package/dist/cjs/hooks/useUrlSearchParams/useUrlSearchParams.cjs +1 -1
- package/dist/cjs/hooks/useUrlSearchParams/useUrlSearchParams.cjs.map +1 -1
- package/dist/cjs/hooks/useWindowScroll/useWindowScroll.cjs +1 -1
- package/dist/cjs/hooks/useWindowScroll/useWindowScroll.cjs.map +1 -1
- package/dist/esm/hooks/useActiveElement/useActiveElement.mjs +1 -1
- package/dist/esm/hooks/useActiveElement/useActiveElement.mjs.map +1 -1
- package/dist/esm/hooks/useAutoScroll/useAutoScroll.mjs +11 -11
- package/dist/esm/hooks/useAutoScroll/useAutoScroll.mjs.map +1 -1
- package/dist/esm/hooks/useClickOutside/useClickOutside.mjs +9 -9
- package/dist/esm/hooks/useClickOutside/useClickOutside.mjs.map +1 -1
- package/dist/esm/hooks/useDoubleClick/useDoubleClick.mjs +3 -1
- package/dist/esm/hooks/useDoubleClick/useDoubleClick.mjs.map +1 -1
- package/dist/esm/hooks/useFocusTrap/useFocusTrap.mjs.map +1 -1
- package/dist/esm/hooks/useHash/useHash.mjs +6 -3
- package/dist/esm/hooks/useHash/useHash.mjs.map +1 -1
- package/dist/esm/hooks/useHover/useHover.mjs +4 -4
- package/dist/esm/hooks/useHover/useHover.mjs.map +1 -1
- package/dist/esm/hooks/useInfiniteScroll/useInfiniteScroll.mjs +1 -1
- package/dist/esm/hooks/useInfiniteScroll/useInfiniteScroll.mjs.map +1 -1
- package/dist/esm/hooks/useKeyPress/useKeyPress.mjs +1 -1
- package/dist/esm/hooks/useKeyPress/useKeyPress.mjs.map +1 -1
- package/dist/esm/hooks/useKeysPressed/useKeysPressed.mjs +1 -1
- package/dist/esm/hooks/useKeysPressed/useKeysPressed.mjs.map +1 -1
- package/dist/esm/hooks/useLongPress/useLongPress.mjs +1 -4
- package/dist/esm/hooks/useLongPress/useLongPress.mjs.map +1 -1
- package/dist/esm/hooks/useMediaControls/useMediaControls.mjs.map +1 -1
- package/dist/esm/hooks/usePostMessage/usePostMessage.mjs +18 -14
- package/dist/esm/hooks/usePostMessage/usePostMessage.mjs.map +1 -1
- package/dist/esm/hooks/useSticky/useSticky.mjs +1 -1
- package/dist/esm/hooks/useSticky/useSticky.mjs.map +1 -1
- package/dist/esm/hooks/useUrlSearchParams/useUrlSearchParams.mjs +6 -6
- package/dist/esm/hooks/useUrlSearchParams/useUrlSearchParams.mjs.map +1 -1
- package/dist/esm/hooks/useWindowScroll/useWindowScroll.mjs +1 -4
- package/dist/esm/hooks/useWindowScroll/useWindowScroll.mjs.map +1 -1
- package/dist/types/hooks/useActiveElement/useActiveElement.d.ts +4 -3
- package/dist/types/hooks/useAutoScroll/useAutoScroll.d.ts +5 -3
- package/dist/types/hooks/useClickOutside/useClickOutside.d.ts +5 -3
- package/dist/types/hooks/useDoubleClick/useDoubleClick.d.ts +7 -5
- package/dist/types/hooks/useFocusTrap/useFocusTrap.d.ts +2 -2
- package/dist/types/hooks/useHash/useHash.d.ts +10 -5
- package/dist/types/hooks/useHover/useHover.d.ts +8 -6
- package/dist/types/hooks/useInfiniteScroll/useInfiniteScroll.d.ts +12 -6
- package/dist/types/hooks/useKeyPress/useKeyPress.d.ts +10 -4
- package/dist/types/hooks/useKeysPressed/useKeysPressed.d.ts +10 -10
- package/dist/types/hooks/useLongPress/useLongPress.d.ts +9 -3
- package/dist/types/hooks/usePostMessage/usePostMessage.d.ts +5 -2
- package/dist/types/hooks/useSticky/useSticky.d.ts +5 -5
- package/package.json +89 -89
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSticky.cjs","sources":["../../../../src/hooks/useSticky/useSticky.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use sticky return type */\nexport interface UseStickyReturn {\n stuck: boolean;\n}\n\n/** The use sticky axis type */\nexport type UseStickyAxis = 'horizontal' | 'vertical';\n\n/** The use sticky options type */\nexport interface UseStickyOptions {\n axis?: UseStickyAxis;\n root?: HookTarget;\n}\n\nexport interface UseSticky {\n (target: HookTarget, options?: UseStickyOptions):
|
|
1
|
+
{"version":3,"file":"useSticky.cjs","sources":["../../../../src/hooks/useSticky/useSticky.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use sticky return type */\nexport interface UseStickyReturn {\n stuck: boolean;\n}\n\n/** The use sticky axis type */\nexport type UseStickyAxis = 'horizontal' | 'vertical';\n\n/** The use sticky options type */\nexport interface UseStickyOptions {\n axis?: UseStickyAxis;\n root?: HookTarget;\n}\n\nexport interface UseSticky {\n (target: HookTarget, options?: UseStickyOptions): UseStickyReturn;\n\n <Target extends Element>(\n options?: UseStickyOptions,\n target?: never\n ): UseStickyReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name UseSticky\n * @description - Hook that allows you to detect that your sticky component is stuck\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target sticky element\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck } = useSticky(ref);\n *\n * @overload\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {{ ref: StateRef<Target> } & UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck, ref } = useSticky();\n */\nexport const useSticky = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (target ? params[1] : params[0]) as UseStickyOptions;\n const axis = options?.axis ?? 'vertical';\n\n const internalRef = useRefState<Element>();\n const [stuck, setStuck] = useState(false);\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n\n if (!element) return;\n\n const root = (options?.root ? isTarget.getElement(options.root) : document) as Element;\n const elementOffsetTop =\n element.getBoundingClientRect().top + root.scrollTop - root.getBoundingClientRect().top;\n const elementOffsetLeft =\n element.getBoundingClientRect().left + root.scrollLeft - root.getBoundingClientRect().left;\n\n const onSticky = () => {\n if (axis === 'vertical') {\n const scrollTop = root.scrollTop;\n setStuck(scrollTop >= elementOffsetTop);\n }\n\n if (axis === 'horizontal') {\n const scrollLeft = root.scrollLeft;\n setStuck(scrollLeft >= elementOffsetLeft);\n }\n };\n\n root.addEventListener('scroll', onSticky);\n window.addEventListener('resize', onSticky);\n window.addEventListener('orientationchange', onSticky);\n\n onSticky();\n\n return () => {\n root.removeEventListener('scroll', onSticky);\n window.removeEventListener('resize', onSticky);\n window.removeEventListener('orientationchange', onSticky);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state, axis, options?.root]);\n\n if (target) return { stuck };\n return {\n stuck,\n ref: internalRef\n };\n}) as UseSticky;\n"],"names":["useSticky","params","target","isTarget","options","axis","internalRef","useRefState","stuck","setStuck","useState","useEffect","element","root","elementOffsetTop","elementOffsetLeft","onSticky","scrollTop","scrollLeft"],"mappings":"mMA0DaA,GAAa,IAAIC,IAAkB,CAC9C,MAAMC,EAAUC,EAAAA,SAASF,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,OAC5CG,EAAWF,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EACxCI,EAAOD,GAAS,MAAQ,WAExBE,EAAcC,EAAAA,YAAA,EACd,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAK,EAwCxC,OAtCAC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACT,GAAU,CAACI,EAAY,MAAO,OAEnC,MAAMM,EAAWV,EAASC,EAAAA,SAAS,WAAWD,CAAM,EAAII,EAAY,QAEpE,GAAI,CAACM,EAAS,OAEd,MAAMC,EAAQT,GAAS,KAAOD,EAAAA,SAAS,WAAWC,EAAQ,IAAI,EAAI,SAC5DU,EACJF,EAAQ,wBAAwB,IAAMC,EAAK,UAAYA,EAAK,sBAAA,EAAwB,IAChFE,EACJH,EAAQ,wBAAwB,KAAOC,EAAK,WAAaA,EAAK,sBAAA,EAAwB,KAElFG,EAAW,IAAM,CACrB,GAAIX,IAAS,WAAY,CACvB,MAAMY,EAAYJ,EAAK,UACvBJ,EAASQ,GAAaH,CAAgB,CAAA,CAGxC,GAAIT,IAAS,aAAc,CACzB,MAAMa,EAAaL,EAAK,WACxBJ,EAASS,GAAcH,CAAiB,CAAA,CAC1C,EAGF,OAAAF,EAAK,iBAAiB,SAAUG,CAAQ,EACxC,OAAO,iBAAiB,SAAUA,CAAQ,EAC1C,OAAO,iBAAiB,oBAAqBA,CAAQ,EAErDA,EAAA,EAEO,IAAM,CACXH,EAAK,oBAAoB,SAAUG,CAAQ,EAC3C,OAAO,oBAAoB,SAAUA,CAAQ,EAC7C,OAAO,oBAAoB,oBAAqBA,CAAQ,CAAA,CAC1D,EACC,CAACd,GAAUC,WAAS,cAAcD,CAAM,EAAGI,EAAY,MAAOD,EAAMD,GAAS,IAAI,CAAC,EAEjFF,EAAe,CAAE,MAAAM,CAAA,EACd,CACL,MAAAA,EACA,IAAKF,CAAA,CAET"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react"),t=require("../useUrlSearchParam/useUrlSearchParam.cjs"),v=(i=>{const n=typeof i=="object"&&i&&("serializer"in i||"deserializer"in i||"initialValue"in i||"mode"in i||"write"in i)?i:
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react"),t=require("../useUrlSearchParam/useUrlSearchParam.cjs"),v=(i=>{const n=typeof i=="object"&&i&&("serializer"in i||"deserializer"in i||"initialValue"in i||"mode"in i||"write"in i)?i:void 0,u=n?n?.initialValue:i,{mode:s="history",write:l="replace"}=n??{},h=e=>n?.serializer?n.serializer(e):typeof e=="string"?e:JSON.stringify(e),E=e=>{if(n?.deserializer)return n.deserializer(e);if(e!=="undefined")try{return JSON.parse(e)}catch{return e}},S=(e,r,a="replace")=>{const o=t.getUrlSearchParams(e);Object.entries(r).forEach(([g,d])=>{if(d===void 0)o.delete(g);else{const m=h?h(d):String(d);o.set(g,m)}});const P=t.createQueryString(o,e);return a==="replace"&&window.history.replaceState({},"",P),a==="push"&&window.history.pushState({},"",P),t.dispatchUrlSearchParamsEvent(),o},c=e=>typeof e=="string"?c(new URLSearchParams(e)):e instanceof URLSearchParams?Array.from(e.entries()).reduce((r,[a,o])=>(r[a]=E(o),r),{}):e,[f,w]=y.useState(()=>{if(typeof window>"u")return u??{};const e=t.getUrlSearchParams(s),r={...u&&c(u),...c(e)};return S(s,r,l),r}),U=(e,r)=>{const a=S(s,{...f,...e},r?.write??l);w(c(a))};return y.useEffect(()=>{const e=()=>{const r=t.getUrlSearchParams(s);w(c(r))};return window.addEventListener(t.URL_SEARCH_PARAMS_EVENT,e),window.addEventListener("popstate",e),s!=="history"&&window.addEventListener("hashchange",e),()=>{window.removeEventListener(t.URL_SEARCH_PARAMS_EVENT,e),window.removeEventListener("popstate",e),s!=="history"&&window.removeEventListener("hashchange",e)}},[s]),{value:f,set:U}});exports.createQueryString=t.createQueryString;exports.dispatchUrlSearchParamsEvent=t.dispatchUrlSearchParamsEvent;exports.getUrlSearchParams=t.getUrlSearchParams;exports.useUrlSearchParams=v;
|
|
2
2
|
//# sourceMappingURL=useUrlSearchParams.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUrlSearchParams.cjs","sources":["../../../../src/hooks/useUrlSearchParams/useUrlSearchParams.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport {\n createQueryString,\n dispatchUrlSearchParamsEvent,\n getUrlSearchParams,\n URL_SEARCH_PARAMS_EVENT\n} from '../useUrlSearchParam/useUrlSearchParam';\n\n/** The url params type */\nexport type UrlParams = Record<string, any>;\n\n/** The url search params mod */\nexport type UrlSearchParamsMode = 'hash-params' | 'hash' | 'history';\n\n/** The use url search params set options type */\nexport interface UseUrlSearchParamsSetOptions {\n /** The mode to use for writing to the URL */\n write?: 'push' | 'replace';\n}\n\n/* The use search params initial value type */\nexport type UseUrlSearchParamsInitialValue<Value> = (() => Value) | Value;\n\n/** The use url search params options type */\nexport interface UseUrlSearchParamsOptions<Value> {\n /* The initial value of the url search params */\n initialValue?: UseUrlSearchParamsInitialValue<string | URLSearchParams | Value>;\n /** The mode to use for writing to the URL */\n mode?: UrlSearchParamsMode;\n /** The mode to use for writing to the URL */\n write?: 'push' | 'replace';\n /* The deserializer function to be invoked */\n deserializer?: (value: string) => Value[keyof Value];\n /* The serializer function to be invoked */\n serializer?: (value: Value[keyof Value]) => string;\n}\n\n/** The use url search params return type */\nexport interface UseUrlSearchParamsReturn<Value> {\n /** The value of the url search params */\n value: Value;\n /** The set function */\n set: (value: Partial<Value>, options?: UseUrlSearchParamsSetOptions) => void;\n}\n\nexport interface UseUrlSearchParams {\n <Value>(\n key: string,\n options: UseUrlSearchParamsOptions<Value> & {\n initialValue: UseUrlSearchParamsInitialValue<Value>;\n }\n ): UseUrlSearchParamsReturn<Value>;\n\n <Value>(options?: UseUrlSearchParamsOptions<Value>): UseUrlSearchParamsReturn<Value | undefined>;\n\n <Value>(initialValue: UseUrlSearchParamsInitialValue<Value>): UseUrlSearchParamsReturn<Value>;\n\n <Value>(key: string): UseUrlSearchParamsReturn<Value | undefined>;\n}\n\n/**\n * @name useUrlSearchParams\n * @description - Hook that provides reactive URLSearchParams\n * @category State\n * @usage high\n *\n * @overload\n * @template Value The type of the url param values\n * @param {UseUrlSearchParamsOptions<Value> & { initialValue: UseUrlSearchParamsInitialValue<Value> }} options The options object with required initialValue\n * @param {UseUrlSearchParamsInitialValue<Value>} [options.initialValue] The initial value for the url params\n * @param {UrlSearchParamsMode} [options.mode='history'] The mode to use for the URL ('history' | 'hash-params' | 'hash')\n * @param {'push' | 'replace'} [options.write='replace'] The mode to use for writing to the URL\n * @param {(value: Value[keyof Value]) => string} [options.serializer] Custom serializer function to convert value to string\n * @param {(value: string) => Value[keyof Value]} [options.deserializer] Custom deserializer function to convert string to value\n * @returns {UseUrlSearchParamsReturn<Value>} The object with value and function for change value\n *\n * @example\n * const { value, set } = useUrlSearchParams({ initialValue: { page: 1 } });\n *\n * @overload\n * @template Value The type of the url param values\n * @param {UseUrlSearchParamsInitialValue<Value>} [initialValue] The initial value for the url params\n * @returns {UseUrlSearchParamsReturn<Value>} The object with value and function for change value\n *\n * @example\n * const { value, set } = useUrlSearchParams({ page: 1 });\n */\nexport const useUrlSearchParams = (<Value extends UrlParams>(\n params: any\n): UseUrlSearchParamsReturn<Value> => {\n const options = (\n typeof params === 'object' &&\n params &&\n ('serializer' in params ||\n 'deserializer' in params ||\n 'initialValue' in params ||\n 'mode' in params ||\n 'write' in params)\n ? params\n : {}\n ) as UseUrlSearchParamsOptions<Value>;\n const initialValue = (\n options ? options?.initialValue : params\n ) as UseUrlSearchParamsInitialValue<Value>;\n\n const { mode = 'history', write: writeMode = 'replace' } = options;\n\n const serializer = (value: Value[keyof Value]) => {\n if (options?.serializer) return options.serializer(value);\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n };\n\n const deserializer = (value: string) => {\n if (options?.deserializer) return options.deserializer(value);\n if (value === 'undefined') return undefined as unknown as Value[keyof Value];\n\n try {\n return JSON.parse(value) as Value;\n } catch {\n return value as Value[keyof Value];\n }\n };\n\n const setUrlSearchParams = <Value extends UrlParams>(\n mode: UrlSearchParamsMode,\n value: Partial<Value>,\n write: 'push' | 'replace' = 'replace'\n ) => {\n const urlSearchParams = getUrlSearchParams(mode);\n\n Object.entries(value).forEach(([key, param]) => {\n if (param === undefined) {\n urlSearchParams.delete(key);\n } else {\n const serializedValue = serializer ? serializer(param) : String(param);\n urlSearchParams.set(key, serializedValue);\n }\n });\n\n const query = createQueryString(urlSearchParams, mode);\n if (write === 'replace') window.history.replaceState({}, '', query);\n if (write === 'push') window.history.pushState({}, '', query);\n dispatchUrlSearchParamsEvent();\n\n return urlSearchParams;\n };\n\n const getParsedUrlSearchParams = (searchParams: string | UrlParams | URLSearchParams) => {\n if (typeof searchParams === 'string') {\n return getParsedUrlSearchParams(new URLSearchParams(searchParams));\n }\n\n if (searchParams instanceof URLSearchParams) {\n return Array.from(searchParams.entries()).reduce(\n (acc, [key, value]) => {\n acc[key] = deserializer(value);\n return acc;\n },\n {} as Record<string, any>\n );\n }\n\n return searchParams;\n };\n\n const [value, setValue] = useState<Value>(() => {\n if (typeof window === 'undefined') return (initialValue ?? {}) as Value;\n\n const urlSearchParams = getUrlSearchParams(mode);\n const value = {\n ...(initialValue && getParsedUrlSearchParams(initialValue)),\n ...getParsedUrlSearchParams(urlSearchParams)\n } as Value;\n\n setUrlSearchParams(mode, value, writeMode);\n\n return value;\n });\n\n const set = (params: Partial<Value>, options?: UseUrlSearchParamsSetOptions) => {\n const searchParams = setUrlSearchParams(\n mode,\n { ...value, ...params },\n options?.write ?? writeMode\n );\n setValue(getParsedUrlSearchParams(searchParams) as Value);\n };\n\n useEffect(() => {\n const onParamsChange = () => {\n const searchParams = getUrlSearchParams(mode);\n setValue(getParsedUrlSearchParams(searchParams) as Value);\n };\n\n window.addEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\n window.addEventListener('popstate', onParamsChange);\n if (mode !== 'history') window.addEventListener('hashchange', onParamsChange);\n\n return () => {\n window.removeEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\n window.removeEventListener('popstate', onParamsChange);\n if (mode !== 'history') window.removeEventListener('hashchange', onParamsChange);\n };\n }, [mode]);\n\n return {\n value,\n set\n };\n}) as UseUrlSearchParams;\n\nexport { createQueryString, dispatchUrlSearchParamsEvent, getUrlSearchParams };\n"],"names":["useUrlSearchParams","params","options","initialValue","mode","writeMode","serializer","value","deserializer","setUrlSearchParams","write","urlSearchParams","getUrlSearchParams","key","param","serializedValue","query","createQueryString","dispatchUrlSearchParamsEvent","getParsedUrlSearchParams","searchParams","acc","setValue","useState","set","useEffect","onParamsChange","URL_SEARCH_PARAMS_EVENT"],"mappings":"iKAwFaA,GACXC,GACoC,CACpC,MAAMC,EACJ,OAAOD,GAAW,UAClBA,IACC,eAAgBA,GACf,iBAAkBA,GAClB,iBAAkBA,GAClB,SAAUA,GACV,UAAWA,GACTA,EACA,CAAA,EAEAE,EACJD,EAAUA,GAAS,aAAeD,EAG9B,CAAE,KAAAG,EAAO,UAAW,MAAOC,EAAY,WAAcH,EAErDI,EAAcC,GACdL,GAAS,WAAmBA,EAAQ,WAAWK,CAAK,EACpD,OAAOA,GAAU,SAAiBA,EAC/B,KAAK,UAAUA,CAAK,EAGvBC,EAAgBD,GAAkB,CACtC,GAAIL,GAAS,aAAc,OAAOA,EAAQ,aAAaK,CAAK,EAC5D,GAAIA,IAAU,YAEd,GAAI,CACF,OAAO,KAAK,MAAMA,CAAK,CAAA,MACjB,CACN,OAAOA,CAAA,CACT,EAGIE,EAAqB,CACzBL,EACAG,EACAG,EAA4B,YACzB,CACH,MAAMC,EAAkBC,EAAAA,mBAAmBR,CAAI,EAE/C,OAAO,QAAQG,CAAK,EAAE,QAAQ,CAAC,CAACM,EAAKC,CAAK,IAAM,CAC9C,GAAIA,IAAU,OACZH,EAAgB,OAAOE,CAAG,MACrB,CACL,MAAME,EAAkBT,EAAaA,EAAWQ,CAAK,EAAI,OAAOA,CAAK,EACrEH,EAAgB,IAAIE,EAAKE,CAAe,CAAA,CAC1C,CACD,EAED,MAAMC,EAAQC,EAAAA,kBAAkBN,EAAiBP,CAAI,EACrD,OAAIM,IAAU,WAAW,OAAO,QAAQ,aAAa,CAAA,EAAI,GAAIM,CAAK,EAC9DN,IAAU,QAAQ,OAAO,QAAQ,UAAU,CAAA,EAAI,GAAIM,CAAK,EAC5DE,+BAAA,EAEOP,CAAA,EAGHQ,EAA4BC,GAC5B,OAAOA,GAAiB,SACnBD,EAAyB,IAAI,gBAAgBC,CAAY,CAAC,EAG/DA,aAAwB,gBACnB,MAAM,KAAKA,EAAa,QAAA,CAAS,EAAE,OACxC,CAACC,EAAK,CAACR,EAAKN,CAAK,KACfc,EAAIR,CAAG,EAAIL,EAAaD,CAAK,EACtBc,GAET,CAAA,CAAC,EAIED,EAGH,CAACb,EAAOe,CAAQ,EAAIC,EAAAA,SAAgB,IAAM,CAC9C,GAAI,OAAO,OAAW,IAAa,OAAQpB,GAAgB,CAAA,EAE3D,MAAMQ,EAAkBC,EAAAA,mBAAmBR,CAAI,EACzCG,EAAQ,CACZ,GAAIJ,GAAgBgB,EAAyBhB,CAAY,EACzD,GAAGgB,EAAyBR,CAAe,CAAA,EAG7C,OAAAF,EAAmBL,EAAMG,EAAOF,CAAS,EAElCE,CAAA,CACR,EAEKiB,EAAM,CAACvB,EAAwBC,IAA2C,CAC9E,MAAMkB,EAAeX,EACnBL,EACA,CAAE,GAAGG,EAAO,GAAGN,CAAAA,EACfC,GAAS,OAASG,CAAA,EAEpBiB,EAASH,EAAyBC,CAAY,CAAU,CAAA,EAG1DK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAiB,IAAM,CAC3B,MAAMN,EAAeR,EAAAA,mBAAmBR,CAAI,EAC5CkB,EAASH,EAAyBC,CAAY,CAAU,CAAA,EAG1D,cAAO,iBAAiBO,EAAAA,wBAAyBD,CAAc,EAC/D,OAAO,iBAAiB,WAAYA,CAAc,EAC9CtB,IAAS,WAAW,OAAO,iBAAiB,aAAcsB,CAAc,EAErE,IAAM,CACX,OAAO,oBAAoBC,EAAAA,wBAAyBD,CAAc,EAClE,OAAO,oBAAoB,WAAYA,CAAc,EACjDtB,IAAS,WAAW,OAAO,oBAAoB,aAAcsB,CAAc,CAAA,CACjF,EACC,CAACtB,CAAI,CAAC,EAEF,CACL,MAAAG,EACA,IAAAiB,CAAA,CAEJ"}
|
|
1
|
+
{"version":3,"file":"useUrlSearchParams.cjs","sources":["../../../../src/hooks/useUrlSearchParams/useUrlSearchParams.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport {\n createQueryString,\n dispatchUrlSearchParamsEvent,\n getUrlSearchParams,\n URL_SEARCH_PARAMS_EVENT\n} from '../useUrlSearchParam/useUrlSearchParam';\n\n/** The url params type */\nexport type UrlParams = Record<string, any>;\n\n/** The url search params mod */\nexport type UrlSearchParamsMode = 'hash-params' | 'hash' | 'history';\n\n/** The use url search params set options type */\nexport interface UseUrlSearchParamsSetOptions {\n /** The mode to use for writing to the URL */\n write?: 'push' | 'replace';\n}\n\n/* The use search params initial value type */\nexport type UseUrlSearchParamsInitialValue<Value> = (() => Value) | Value;\n\n/** The use url search params options type */\nexport interface UseUrlSearchParamsOptions<Value> {\n /* The initial value of the url search params */\n initialValue?: UseUrlSearchParamsInitialValue<string | URLSearchParams | Value>;\n /** The mode to use for writing to the URL */\n mode?: UrlSearchParamsMode;\n /** The mode to use for writing to the URL */\n write?: 'push' | 'replace';\n /* The deserializer function to be invoked */\n deserializer?: (value: string) => Value[keyof Value];\n /* The serializer function to be invoked */\n serializer?: (value: Value[keyof Value]) => string;\n}\n\n/** The use url search params return type */\nexport interface UseUrlSearchParamsReturn<Value> {\n /** The value of the url search params */\n value: Value;\n /** The set function */\n set: (value: Partial<Value>, options?: UseUrlSearchParamsSetOptions) => void;\n}\n\nexport interface UseUrlSearchParams {\n <Value>(\n key: string,\n options: UseUrlSearchParamsOptions<Value> & {\n initialValue: UseUrlSearchParamsInitialValue<Value>;\n }\n ): UseUrlSearchParamsReturn<Value>;\n\n <Value>(options?: UseUrlSearchParamsOptions<Value>): UseUrlSearchParamsReturn<Value | undefined>;\n\n <Value>(initialValue: UseUrlSearchParamsInitialValue<Value>): UseUrlSearchParamsReturn<Value>;\n\n <Value>(key: string): UseUrlSearchParamsReturn<Value | undefined>;\n}\n\n/**\n * @name useUrlSearchParams\n * @description - Hook that provides reactive URLSearchParams\n * @category State\n * @usage high\n *\n * @overload\n * @template Value The type of the url param values\n * @param {UseUrlSearchParamsOptions<Value> & { initialValue: UseUrlSearchParamsInitialValue<Value> }} options The options object with required initialValue\n * @param {UseUrlSearchParamsInitialValue<Value>} [options.initialValue] The initial value for the url params\n * @param {UrlSearchParamsMode} [options.mode='history'] The mode to use for the URL ('history' | 'hash-params' | 'hash')\n * @param {'push' | 'replace'} [options.write='replace'] The mode to use for writing to the URL\n * @param {(value: Value[keyof Value]) => string} [options.serializer] Custom serializer function to convert value to string\n * @param {(value: string) => Value[keyof Value]} [options.deserializer] Custom deserializer function to convert string to value\n * @returns {UseUrlSearchParamsReturn<Value>} The object with value and function for change value\n *\n * @example\n * const { value, set } = useUrlSearchParams({ initialValue: { page: 1 } });\n *\n * @overload\n * @template Value The type of the url param values\n * @param {UseUrlSearchParamsInitialValue<Value>} [initialValue] The initial value for the url params\n * @returns {UseUrlSearchParamsReturn<Value>} The object with value and function for change value\n *\n * @example\n * const { value, set } = useUrlSearchParams({ page: 1 });\n */\nexport const useUrlSearchParams = (<Value extends UrlParams>(\n params: any\n): UseUrlSearchParamsReturn<Value> => {\n const options = (\n typeof params === 'object' &&\n params &&\n ('serializer' in params ||\n 'deserializer' in params ||\n 'initialValue' in params ||\n 'mode' in params ||\n 'write' in params)\n ? params\n : undefined\n ) as UseUrlSearchParamsOptions<Value> | undefined;\n const initialValue = (\n options ? options?.initialValue : params\n ) as UseUrlSearchParamsInitialValue<Value>;\n\n const { mode = 'history', write: writeMode = 'replace' } = options ?? {};\n\n const serializer = (value: Value[keyof Value]) => {\n if (options?.serializer) return options.serializer(value);\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n };\n\n const deserializer = (value: string) => {\n if (options?.deserializer) return options.deserializer(value);\n if (value === 'undefined') return undefined as unknown as Value[keyof Value];\n\n try {\n return JSON.parse(value) as Value;\n } catch {\n return value as Value[keyof Value];\n }\n };\n\n const setUrlSearchParams = <Value extends UrlParams>(\n mode: UrlSearchParamsMode,\n value: Partial<Value>,\n write: 'push' | 'replace' = 'replace'\n ) => {\n const urlSearchParams = getUrlSearchParams(mode);\n\n Object.entries(value).forEach(([key, param]) => {\n if (param === undefined) {\n urlSearchParams.delete(key);\n } else {\n const serializedValue = serializer ? serializer(param) : String(param);\n urlSearchParams.set(key, serializedValue);\n }\n });\n\n const query = createQueryString(urlSearchParams, mode);\n if (write === 'replace') window.history.replaceState({}, '', query);\n if (write === 'push') window.history.pushState({}, '', query);\n dispatchUrlSearchParamsEvent();\n\n return urlSearchParams;\n };\n\n const getParsedUrlSearchParams = (searchParams: string | UrlParams | URLSearchParams) => {\n if (typeof searchParams === 'string') {\n return getParsedUrlSearchParams(new URLSearchParams(searchParams));\n }\n\n if (searchParams instanceof URLSearchParams) {\n return Array.from(searchParams.entries()).reduce(\n (acc, [key, value]) => {\n acc[key] = deserializer(value);\n return acc;\n },\n {} as Record<string, any>\n );\n }\n\n return searchParams;\n };\n\n const [value, setValue] = useState<Value>(() => {\n if (typeof window === 'undefined') return (initialValue ?? {}) as Value;\n\n const urlSearchParams = getUrlSearchParams(mode);\n const value = {\n ...(initialValue && getParsedUrlSearchParams(initialValue)),\n ...getParsedUrlSearchParams(urlSearchParams)\n } as Value;\n\n setUrlSearchParams(mode, value, writeMode);\n\n return value;\n });\n\n const set = (params: Partial<Value>, options?: UseUrlSearchParamsSetOptions) => {\n const searchParams = setUrlSearchParams(\n mode,\n { ...value, ...params },\n options?.write ?? writeMode\n );\n setValue(getParsedUrlSearchParams(searchParams) as Value);\n };\n\n useEffect(() => {\n const onParamsChange = () => {\n const searchParams = getUrlSearchParams(mode);\n setValue(getParsedUrlSearchParams(searchParams) as Value);\n };\n\n window.addEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\n window.addEventListener('popstate', onParamsChange);\n if (mode !== 'history') window.addEventListener('hashchange', onParamsChange);\n\n return () => {\n window.removeEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\n window.removeEventListener('popstate', onParamsChange);\n if (mode !== 'history') window.removeEventListener('hashchange', onParamsChange);\n };\n }, [mode]);\n\n return {\n value,\n set\n };\n}) as UseUrlSearchParams;\n\nexport { createQueryString, dispatchUrlSearchParamsEvent, getUrlSearchParams };\n"],"names":["useUrlSearchParams","params","options","initialValue","mode","writeMode","serializer","value","deserializer","setUrlSearchParams","write","urlSearchParams","getUrlSearchParams","key","param","serializedValue","query","createQueryString","dispatchUrlSearchParamsEvent","getParsedUrlSearchParams","searchParams","acc","setValue","useState","set","useEffect","onParamsChange","URL_SEARCH_PARAMS_EVENT"],"mappings":"iKAwFaA,GACXC,GACoC,CACpC,MAAMC,EACJ,OAAOD,GAAW,UAClBA,IACC,eAAgBA,GACf,iBAAkBA,GAClB,iBAAkBA,GAClB,SAAUA,GACV,UAAWA,GACTA,EACA,OAEAE,EACJD,EAAUA,GAAS,aAAeD,EAG9B,CAAE,KAAAG,EAAO,UAAW,MAAOC,EAAY,SAAA,EAAcH,GAAW,CAAA,EAEhEI,EAAcC,GACdL,GAAS,WAAmBA,EAAQ,WAAWK,CAAK,EACpD,OAAOA,GAAU,SAAiBA,EAC/B,KAAK,UAAUA,CAAK,EAGvBC,EAAgBD,GAAkB,CACtC,GAAIL,GAAS,aAAc,OAAOA,EAAQ,aAAaK,CAAK,EAC5D,GAAIA,IAAU,YAEd,GAAI,CACF,OAAO,KAAK,MAAMA,CAAK,CAAA,MACjB,CACN,OAAOA,CAAA,CACT,EAGIE,EAAqB,CACzBL,EACAG,EACAG,EAA4B,YACzB,CACH,MAAMC,EAAkBC,EAAAA,mBAAmBR,CAAI,EAE/C,OAAO,QAAQG,CAAK,EAAE,QAAQ,CAAC,CAACM,EAAKC,CAAK,IAAM,CAC9C,GAAIA,IAAU,OACZH,EAAgB,OAAOE,CAAG,MACrB,CACL,MAAME,EAAkBT,EAAaA,EAAWQ,CAAK,EAAI,OAAOA,CAAK,EACrEH,EAAgB,IAAIE,EAAKE,CAAe,CAAA,CAC1C,CACD,EAED,MAAMC,EAAQC,EAAAA,kBAAkBN,EAAiBP,CAAI,EACrD,OAAIM,IAAU,WAAW,OAAO,QAAQ,aAAa,CAAA,EAAI,GAAIM,CAAK,EAC9DN,IAAU,QAAQ,OAAO,QAAQ,UAAU,CAAA,EAAI,GAAIM,CAAK,EAC5DE,+BAAA,EAEOP,CAAA,EAGHQ,EAA4BC,GAC5B,OAAOA,GAAiB,SACnBD,EAAyB,IAAI,gBAAgBC,CAAY,CAAC,EAG/DA,aAAwB,gBACnB,MAAM,KAAKA,EAAa,QAAA,CAAS,EAAE,OACxC,CAACC,EAAK,CAACR,EAAKN,CAAK,KACfc,EAAIR,CAAG,EAAIL,EAAaD,CAAK,EACtBc,GAET,CAAA,CAAC,EAIED,EAGH,CAACb,EAAOe,CAAQ,EAAIC,EAAAA,SAAgB,IAAM,CAC9C,GAAI,OAAO,OAAW,IAAa,OAAQpB,GAAgB,CAAA,EAE3D,MAAMQ,EAAkBC,EAAAA,mBAAmBR,CAAI,EACzCG,EAAQ,CACZ,GAAIJ,GAAgBgB,EAAyBhB,CAAY,EACzD,GAAGgB,EAAyBR,CAAe,CAAA,EAG7C,OAAAF,EAAmBL,EAAMG,EAAOF,CAAS,EAElCE,CAAA,CACR,EAEKiB,EAAM,CAACvB,EAAwBC,IAA2C,CAC9E,MAAMkB,EAAeX,EACnBL,EACA,CAAE,GAAGG,EAAO,GAAGN,CAAAA,EACfC,GAAS,OAASG,CAAA,EAEpBiB,EAASH,EAAyBC,CAAY,CAAU,CAAA,EAG1DK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAiB,IAAM,CAC3B,MAAMN,EAAeR,EAAAA,mBAAmBR,CAAI,EAC5CkB,EAASH,EAAyBC,CAAY,CAAU,CAAA,EAG1D,cAAO,iBAAiBO,EAAAA,wBAAyBD,CAAc,EAC/D,OAAO,iBAAiB,WAAYA,CAAc,EAC9CtB,IAAS,WAAW,OAAO,iBAAiB,aAAcsB,CAAc,EAErE,IAAM,CACX,OAAO,oBAAoBC,EAAAA,wBAAyBD,CAAc,EAClE,OAAO,oBAAoB,WAAYA,CAAc,EACjDtB,IAAS,WAAW,OAAO,oBAAoB,aAAcsB,CAAc,CAAA,CACjF,EACC,CAACtB,CAAI,CAAC,EAEF,CACL,MAAAG,EACA,IAAAiB,CAAA,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),s=({x:o,y:n,behavior:e="smooth"})=>{const r={behavior:e};typeof o=="number"&&(r.left=o),typeof n=="number"&&(r.top=n),window.scrollTo(r)},l=()=>{const[o,n]=t.useState(
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),s=({x:o,y:n,behavior:e="smooth"})=>{const r={behavior:e};typeof o=="number"&&(r.left=o),typeof n=="number"&&(r.top=n),window.scrollTo(r)},l=()=>{const[o,n]=t.useState(()=>typeof window>"u"?{x:Number.POSITIVE_INFINITY,y:Number.POSITIVE_INFINITY}:{x:window.scrollX,y:window.scrollY});return t.useEffect(()=>{const e=()=>n({x:window.scrollX,y:window.scrollY});return window.addEventListener("scroll",e),window.addEventListener("resize",e),()=>{window.removeEventListener("scroll",e),window.removeEventListener("resize",e)}},[]),{value:o,scrollTo:s}};exports.scrollTo=s;exports.useWindowScroll=l;
|
|
2
2
|
//# sourceMappingURL=useWindowScroll.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWindowScroll.cjs","sources":["../../../../src/hooks/useWindowScroll/useWindowScroll.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport interface ScrollPosition {\n x: number;\n y: number;\n}\n\nexport const scrollTo = ({\n x,\n y,\n behavior = 'smooth'\n}: Partial<ScrollPosition & ScrollOptions>) => {\n const scrollOptions: ScrollToOptions = { behavior };\n if (typeof x === 'number') scrollOptions.left = x;\n if (typeof y === 'number') scrollOptions.top = y;\n window.scrollTo(scrollOptions);\n};\n\n/**\n * @name useWindowScroll\n * @description - Hook that manages the window scroll position\n * @category Sensors\n * @usage low\n *\n * @returns {UseWindowScrollReturn} An object containing the current window scroll position\n *\n * @example\n * const { value, scrollTo } = useWindowScroll();\n */\nexport const useWindowScroll = () => {\n const [value, setValue] = useState<ScrollPosition>({\n
|
|
1
|
+
{"version":3,"file":"useWindowScroll.cjs","sources":["../../../../src/hooks/useWindowScroll/useWindowScroll.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport interface ScrollPosition {\n x: number;\n y: number;\n}\n\nexport const scrollTo = ({\n x,\n y,\n behavior = 'smooth'\n}: Partial<ScrollPosition & ScrollOptions>) => {\n const scrollOptions: ScrollToOptions = { behavior };\n if (typeof x === 'number') scrollOptions.left = x;\n if (typeof y === 'number') scrollOptions.top = y;\n window.scrollTo(scrollOptions);\n};\n\n/**\n * @name useWindowScroll\n * @description - Hook that manages the window scroll position\n * @category Sensors\n * @usage low\n *\n * @returns {UseWindowScrollReturn} An object containing the current window scroll position\n *\n * @example\n * const { value, scrollTo } = useWindowScroll();\n */\nexport const useWindowScroll = () => {\n const [value, setValue] = useState<ScrollPosition>(() => {\n if (typeof window === 'undefined')\n return { x: Number.POSITIVE_INFINITY, y: Number.POSITIVE_INFINITY };\n return { x: window.scrollX, y: window.scrollY };\n });\n\n useEffect(() => {\n const onChange = () => setValue({ x: window.scrollX, y: window.scrollY });\n window.addEventListener('scroll', onChange);\n window.addEventListener('resize', onChange);\n return () => {\n window.removeEventListener('scroll', onChange);\n window.removeEventListener('resize', onChange);\n };\n }, []);\n\n return { value, scrollTo };\n};\n"],"names":["scrollTo","x","y","behavior","scrollOptions","useWindowScroll","value","setValue","useState","useEffect","onChange"],"mappings":"yGAOaA,EAAW,CAAC,CACvB,EAAAC,EACA,EAAAC,EACA,SAAAC,EAAW,QACb,IAA+C,CAC7C,MAAMC,EAAiC,CAAE,SAAAD,CAAA,EACrC,OAAOF,GAAM,WAAUG,EAAc,KAAOH,GAC5C,OAAOC,GAAM,WAAUE,EAAc,IAAMF,GAC/C,OAAO,SAASE,CAAa,CAC/B,EAaaC,EAAkB,IAAM,CACnC,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAyB,IAC7C,OAAO,OAAW,IACb,CAAE,EAAG,OAAO,kBAAmB,EAAG,OAAO,iBAAA,EAC3C,CAAE,EAAG,OAAO,QAAS,EAAG,OAAO,OAAA,CACvC,EAEDC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,IAAMH,EAAS,CAAE,EAAG,OAAO,QAAS,EAAG,OAAO,QAAS,EACxE,cAAO,iBAAiB,SAAUG,CAAQ,EAC1C,OAAO,iBAAiB,SAAUA,CAAQ,EACnC,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAQ,EAC7C,OAAO,oBAAoB,SAAUA,CAAQ,CAAA,CAC/C,EACC,EAAE,EAEE,CAAE,MAAAJ,EAAO,SAAAN,CAAA,CAClB"}
|
|
@@ -17,7 +17,7 @@ const L = ((...u) => {
|
|
|
17
17
|
return t.addEventListener("focus", n, !0), t.addEventListener("blur", n, !0), () => {
|
|
18
18
|
m.disconnect(), t.removeEventListener("focus", n, !0), t.removeEventListener("blur", n, !0);
|
|
19
19
|
};
|
|
20
|
-
}, [e && s.getRawElement(e), o.state]), e ? i : {
|
|
20
|
+
}, [e && s.getRawElement(e), o.state]), e ? { value: i } : {
|
|
21
21
|
ref: o,
|
|
22
22
|
value: i
|
|
23
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useActiveElement.mjs","sources":["../../../../src/hooks/useActiveElement/useActiveElement.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use active element return type */\nexport
|
|
1
|
+
{"version":3,"file":"useActiveElement.mjs","sources":["../../../../src/hooks/useActiveElement/useActiveElement.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use active element return type */\nexport interface UseActiveElementReturn<ActiveElement extends HTMLElement = HTMLElement> {\n value: ActiveElement | null;\n}\n\nexport interface UseActiveElement {\n (): UseActiveElementReturn;\n\n <Target extends Element, ActiveElement extends HTMLElement = HTMLElement>(\n target?: never\n ): {\n ref: StateRef<Target>;\n } & UseActiveElementReturn<ActiveElement>;\n\n <ActiveElement extends HTMLElement = HTMLElement>(\n target: HookTarget\n ): UseActiveElementReturn<ActiveElement>;\n}\n\n/**\n * @name useActiveElement\n * @description - Hook that returns the active element\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} [target=window] The target element to observe active element changes\n * @returns {ActiveElement | null} The active element\n *\n * @example\n * const activeElement = useActiveElement(ref);\n *\n * @overload\n * @template ActiveElement The active element type\n * @returns {{ ref: StateRef<Element>; activeElement: ActiveElement | null }} An object containing the ref and active element\n *\n * @example\n * const { ref, value } = useActiveElement();\n *\n * @see {@link https://siberiacancode.github.io/reactuse/functions/hooks/useActiveElement.html}\n */\nexport const useActiveElement = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n\n const [value, setValue] = useState<HTMLElement | null>(null);\n const internalRef = useRefState();\n\n useEffect(() => {\n const element = ((target ? isTarget.getElement(target) : internalRef.current) ??\n window) as Element;\n\n const observer = new MutationObserver((mutations) => {\n mutations\n .filter((mutation) => mutation.removedNodes.length)\n .map((mutation) => Array.from(mutation.removedNodes))\n .flat()\n .forEach((node) => {\n setValue((prevActiveElement) => {\n if (node === prevActiveElement) return document.activeElement as HTMLElement | null;\n return prevActiveElement;\n });\n });\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true\n });\n\n const onActiveElementChange = () => setValue(document?.activeElement as HTMLElement | null);\n\n element.addEventListener('focus', onActiveElementChange, true);\n element.addEventListener('blur', onActiveElementChange, true);\n\n return () => {\n observer.disconnect();\n element.removeEventListener('focus', onActiveElementChange, true);\n element.removeEventListener('blur', onActiveElementChange, true);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n if (target) return { value };\n return {\n ref: internalRef,\n value\n };\n}) as UseActiveElement;\n"],"names":["useActiveElement","params","target","isTarget","value","setValue","useState","internalRef","useRefState","useEffect","element","observer","mutations","mutation","node","prevActiveElement","onActiveElementChange"],"mappings":";;;AAmDO,MAAMA,KAAoB,IAAIC,MAAkB;AACrD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAE5C,CAACG,GAAOC,CAAQ,IAAIC,EAA6B,IAAI,GACrDC,IAAcC,EAAA;AAoCpB,SAlCAC,EAAU,MAAM;AACd,UAAMC,KAAYR,IAASC,EAAS,WAAWD,CAAM,IAAIK,EAAY,YACnE,QAEII,IAAW,IAAI,iBAAiB,CAACC,MAAc;AACnD,MAAAA,EACG,OAAO,CAACC,MAAaA,EAAS,aAAa,MAAM,EACjD,IAAI,CAACA,MAAa,MAAM,KAAKA,EAAS,YAAY,CAAC,EACnD,OACA,QAAQ,CAACC,MAAS;AACjB,QAAAT,EAAS,CAACU,MACJD,MAASC,IAA0B,SAAS,gBACzCA,CACR;AAAA,MAAA,CACF;AAAA,IAAA,CACJ;AAED,IAAAJ,EAAS,QAAQD,GAAS;AAAA,MACxB,WAAW;AAAA,MACX,SAAS;AAAA,IAAA,CACV;AAED,UAAMM,IAAwB,MAAMX,EAAS,UAAU,aAAmC;AAE1F,WAAAK,EAAQ,iBAAiB,SAASM,GAAuB,EAAI,GAC7DN,EAAQ,iBAAiB,QAAQM,GAAuB,EAAI,GAErD,MAAM;AACX,MAAAL,EAAS,WAAA,GACTD,EAAQ,oBAAoB,SAASM,GAAuB,EAAI,GAChEN,EAAQ,oBAAoB,QAAQM,GAAuB,EAAI;AAAA,IAAA;AAAA,EACjE,GACC,CAACd,KAAUC,EAAS,cAAcD,CAAM,GAAGK,EAAY,KAAK,CAAC,GAE5DL,IAAe,EAAE,OAAAE,EAAA,IACd;AAAA,IACL,KAAKG;AAAA,IACL,OAAAH;AAAA,EAAA;AAEJ;"}
|
|
@@ -2,26 +2,26 @@ import { useRef as b, useEffect as p } from "react";
|
|
|
2
2
|
import { useRefState as R } from "../useRefState/useRefState.mjs";
|
|
3
3
|
import { isTarget as a } from "../../utils/helpers/isTarget.mjs";
|
|
4
4
|
const x = ((...n) => {
|
|
5
|
-
const
|
|
6
|
-
if (
|
|
7
|
-
if (!h || !
|
|
8
|
-
const e =
|
|
5
|
+
const r = a(n[0]) ? n[0] : void 0, i = n[1] || (typeof n[0] == "object" ? n[0] : {}), { enabled: h = !0 } = i, s = R(), o = b(i);
|
|
6
|
+
if (o.current = i, p(() => {
|
|
7
|
+
if (!h || !r && !s.state) return;
|
|
8
|
+
const e = r ? a.getElement(r) : s.state;
|
|
9
9
|
if (!e) return;
|
|
10
10
|
let c = !0, f = 0, d = 0;
|
|
11
11
|
const v = () => {
|
|
12
|
-
if (
|
|
12
|
+
if (o.current.force) return;
|
|
13
13
|
const { scrollHeight: t, clientHeight: l, scrollTop: u } = e, L = t - l, Y = L / 2;
|
|
14
14
|
u < d ? c = !1 : L - u <= Y && (c = !0), d = u;
|
|
15
15
|
}, m = (t) => {
|
|
16
|
-
|
|
16
|
+
o.current.force || (t.deltaY < 0 ? c = !1 : v());
|
|
17
17
|
}, E = (t) => {
|
|
18
|
-
|
|
18
|
+
o.current.force || (f = t.touches[0].clientY);
|
|
19
19
|
}, g = (t) => {
|
|
20
|
-
if (
|
|
20
|
+
if (o.current.force) return;
|
|
21
21
|
const l = t.touches[0].clientY;
|
|
22
22
|
f - l < 0 ? c = !1 : v(), f = l;
|
|
23
23
|
}, T = () => {
|
|
24
|
-
!c && !
|
|
24
|
+
!c && !o.current.force || e.scrollTo({ top: e.scrollHeight });
|
|
25
25
|
};
|
|
26
26
|
e.addEventListener("wheel", m), e.addEventListener("touchstart", E), e.addEventListener("touchmove", g);
|
|
27
27
|
const S = new MutationObserver(T);
|
|
@@ -32,8 +32,8 @@ const x = ((...n) => {
|
|
|
32
32
|
}), () => {
|
|
33
33
|
S.disconnect(), e.removeEventListener("wheel", m), e.removeEventListener("touchstart", E), e.removeEventListener("touchmove", g);
|
|
34
34
|
};
|
|
35
|
-
}, [h,
|
|
36
|
-
return s;
|
|
35
|
+
}, [h, r && a.getRawElement(r), s.state]), !r)
|
|
36
|
+
return { ref: s };
|
|
37
37
|
});
|
|
38
38
|
export {
|
|
39
39
|
x as useAutoScroll
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAutoScroll.mjs","sources":["../../../../src/hooks/useAutoScroll/useAutoScroll.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use auto scroll options type */\nexport interface UseAutoScrollOptions {\n /** Whether auto-scrolling is enabled */\n enabled?: boolean;\n /** Whether to force auto-scrolling regardless of user interactions */\n force?: boolean;\n}\n\nexport interface UseAutoScroll {\n (target: HookTarget, options?: UseAutoScrollOptions): void;\n\n <Target extends HTMLElement>(options?: UseAutoScrollOptions): StateRef<Target>;\n}\n\n/**\n * @name useAutoScroll\n * @description - Hook that automatically scrolls a list element to the bottom\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target element to auto-scroll\n * @param {boolean} [options.enabled] Whether auto-scrolling is enabled\n * @returns {void}\n *\n * @example\n * useAutoScroll(ref);\n *\n * @overload\n * @template Target\n * @param {boolean} [options.enabled] Whether auto-scrolling is enabled\n * @returns {StateRef<Target>} A React ref to attach to the list element\n *\n * @example\n * const ref = useAutoScroll();\n */\nexport const useAutoScroll = ((...params: any[]) => {\n const target = isTarget(params[0]) ? params[0] : undefined;\n const options = (params[1] ||\n (typeof params[0] === 'object' ? params[0] : {})) as UseAutoScrollOptions;\n const { enabled = true } = options;\n\n const internalRef = useRefState<HTMLElement>();\n const internalOptionsRef = useRef<UseAutoScrollOptions>(options);\n internalOptionsRef.current = options;\n\n useEffect(() => {\n if (!enabled || (!target && !internalRef.state)) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.state) as HTMLElement;\n\n if (!element) return;\n\n let shouldAutoScroll = true;\n let touchStartY = 0;\n let lastScrollTop = 0;\n\n const onCheckScrollPosition = () => {\n if (internalOptionsRef.current.force) return;\n\n const { scrollHeight, clientHeight, scrollTop } = element;\n const maxScrollHeight = scrollHeight - clientHeight;\n const scrollThreshold = maxScrollHeight / 2;\n\n if (scrollTop < lastScrollTop) shouldAutoScroll = false;\n else if (maxScrollHeight - scrollTop <= scrollThreshold) shouldAutoScroll = true;\n\n lastScrollTop = scrollTop;\n };\n\n const onWheel = (event: WheelEvent) => {\n if (internalOptionsRef.current.force) return;\n\n if (event.deltaY < 0) shouldAutoScroll = false;\n else onCheckScrollPosition();\n };\n\n const onTouchStart = (event: TouchEvent) => {\n if (internalOptionsRef.current.force) return;\n touchStartY = event.touches[0].clientY;\n };\n\n const onTouchMove = (event: TouchEvent) => {\n if (internalOptionsRef.current.force) return;\n\n const touchEndY = event.touches[0].clientY;\n const deltaY = touchStartY - touchEndY;\n\n if (deltaY < 0) shouldAutoScroll = false;\n else onCheckScrollPosition();\n\n touchStartY = touchEndY;\n };\n\n const onMutation = () => {\n if (!shouldAutoScroll && !internalOptionsRef.current.force) return;\n element.scrollTo({ top: element.scrollHeight });\n };\n\n element.addEventListener('wheel', onWheel);\n element.addEventListener('touchstart', onTouchStart);\n element.addEventListener('touchmove', onTouchMove);\n\n const observer = new MutationObserver(onMutation);\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: true\n });\n\n return () => {\n observer.disconnect();\n element.removeEventListener('wheel', onWheel);\n element.removeEventListener('touchstart', onTouchStart);\n element.removeEventListener('touchmove', onTouchMove);\n };\n }, [enabled, target && isTarget.getRawElement(target), internalRef.state]);\n\n if (target) return;\n return internalRef;\n}) as UseAutoScroll;\n"],"names":["useAutoScroll","params","target","isTarget","options","enabled","internalRef","useRefState","internalOptionsRef","useRef","useEffect","element","shouldAutoScroll","touchStartY","lastScrollTop","onCheckScrollPosition","scrollHeight","clientHeight","scrollTop","maxScrollHeight","scrollThreshold","onWheel","event","onTouchStart","onTouchMove","touchEndY","onMutation","observer"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"useAutoScroll.mjs","sources":["../../../../src/hooks/useAutoScroll/useAutoScroll.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use auto scroll options type */\nexport interface UseAutoScrollOptions {\n /** Whether auto-scrolling is enabled */\n enabled?: boolean;\n /** Whether to force auto-scrolling regardless of user interactions */\n force?: boolean;\n}\n\nexport interface UseAutoScroll {\n (target: HookTarget, options?: UseAutoScrollOptions): void;\n\n <Target extends HTMLElement>(\n options?: UseAutoScrollOptions\n ): {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useAutoScroll\n * @description - Hook that automatically scrolls a list element to the bottom\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target element to auto-scroll\n * @param {boolean} [options.enabled] Whether auto-scrolling is enabled\n * @returns {void}\n *\n * @example\n * useAutoScroll(ref);\n *\n * @overload\n * @template Target\n * @param {boolean} [options.enabled] Whether auto-scrolling is enabled\n * @returns {{ ref: StateRef<Target> }} A React ref to attach to the list element\n *\n * @example\n * const { ref } = useAutoScroll();\n */\nexport const useAutoScroll = ((...params: any[]) => {\n const target = isTarget(params[0]) ? params[0] : undefined;\n const options = (params[1] ||\n (typeof params[0] === 'object' ? params[0] : {})) as UseAutoScrollOptions;\n const { enabled = true } = options;\n\n const internalRef = useRefState<HTMLElement>();\n const internalOptionsRef = useRef<UseAutoScrollOptions>(options);\n internalOptionsRef.current = options;\n\n useEffect(() => {\n if (!enabled || (!target && !internalRef.state)) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.state) as HTMLElement;\n\n if (!element) return;\n\n let shouldAutoScroll = true;\n let touchStartY = 0;\n let lastScrollTop = 0;\n\n const onCheckScrollPosition = () => {\n if (internalOptionsRef.current.force) return;\n\n const { scrollHeight, clientHeight, scrollTop } = element;\n const maxScrollHeight = scrollHeight - clientHeight;\n const scrollThreshold = maxScrollHeight / 2;\n\n if (scrollTop < lastScrollTop) shouldAutoScroll = false;\n else if (maxScrollHeight - scrollTop <= scrollThreshold) shouldAutoScroll = true;\n\n lastScrollTop = scrollTop;\n };\n\n const onWheel = (event: WheelEvent) => {\n if (internalOptionsRef.current.force) return;\n\n if (event.deltaY < 0) shouldAutoScroll = false;\n else onCheckScrollPosition();\n };\n\n const onTouchStart = (event: TouchEvent) => {\n if (internalOptionsRef.current.force) return;\n touchStartY = event.touches[0].clientY;\n };\n\n const onTouchMove = (event: TouchEvent) => {\n if (internalOptionsRef.current.force) return;\n\n const touchEndY = event.touches[0].clientY;\n const deltaY = touchStartY - touchEndY;\n\n if (deltaY < 0) shouldAutoScroll = false;\n else onCheckScrollPosition();\n\n touchStartY = touchEndY;\n };\n\n const onMutation = () => {\n if (!shouldAutoScroll && !internalOptionsRef.current.force) return;\n element.scrollTo({ top: element.scrollHeight });\n };\n\n element.addEventListener('wheel', onWheel);\n element.addEventListener('touchstart', onTouchStart);\n element.addEventListener('touchmove', onTouchMove);\n\n const observer = new MutationObserver(onMutation);\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: true\n });\n\n return () => {\n observer.disconnect();\n element.removeEventListener('wheel', onWheel);\n element.removeEventListener('touchstart', onTouchStart);\n element.removeEventListener('touchmove', onTouchMove);\n };\n }, [enabled, target && isTarget.getRawElement(target), internalRef.state]);\n\n if (target) return;\n return { ref: internalRef };\n}) as UseAutoScroll;\n"],"names":["useAutoScroll","params","target","isTarget","options","enabled","internalRef","useRefState","internalOptionsRef","useRef","useEffect","element","shouldAutoScroll","touchStartY","lastScrollTop","onCheckScrollPosition","scrollHeight","clientHeight","scrollTop","maxScrollHeight","scrollThreshold","onWheel","event","onTouchStart","onTouchMove","touchEndY","onMutation","observer"],"mappings":";;;AAkDO,MAAMA,KAAiB,IAAIC,MAAkB;AAClD,QAAMC,IAASC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC3CG,IAAWH,EAAO,CAAC,MACtB,OAAOA,EAAO,CAAC,KAAM,WAAWA,EAAO,CAAC,IAAI,CAAA,IACzC,EAAE,SAAAI,IAAU,GAAA,IAASD,GAErBE,IAAcC,EAAA,GACdC,IAAqBC,EAA6BL,CAAO;AA4E/D,MA3EAI,EAAmB,UAAUJ,GAE7BM,EAAU,MAAM;AACd,QAAI,CAACL,KAAY,CAACH,KAAU,CAACI,EAAY,MAAQ;AAEjD,UAAMK,IAAWT,IAASC,EAAS,WAAWD,CAAM,IAAII,EAAY;AAEpE,QAAI,CAACK,EAAS;AAEd,QAAIC,IAAmB,IACnBC,IAAc,GACdC,IAAgB;AAEpB,UAAMC,IAAwB,MAAM;AAClC,UAAIP,EAAmB,QAAQ,MAAO;AAEtC,YAAM,EAAE,cAAAQ,GAAc,cAAAC,GAAc,WAAAC,EAAA,IAAcP,GAC5CQ,IAAkBH,IAAeC,GACjCG,IAAkBD,IAAkB;AAE1C,MAAID,IAAYJ,IAAeF,IAAmB,KACzCO,IAAkBD,KAAaE,MAAiBR,IAAmB,KAE5EE,IAAgBI;AAAA,IAAA,GAGZG,IAAU,CAACC,MAAsB;AACrC,MAAId,EAAmB,QAAQ,UAE3Bc,EAAM,SAAS,IAAGV,IAAmB,KACpCG,EAAA;AAAA,IAAsB,GAGvBQ,IAAe,CAACD,MAAsB;AAC1C,MAAId,EAAmB,QAAQ,UAC/BK,IAAcS,EAAM,QAAQ,CAAC,EAAE;AAAA,IAAA,GAG3BE,IAAc,CAACF,MAAsB;AACzC,UAAId,EAAmB,QAAQ,MAAO;AAEtC,YAAMiB,IAAYH,EAAM,QAAQ,CAAC,EAAE;AAGnC,MAFeT,IAAcY,IAEhB,IAAGb,IAAmB,KAC9BG,EAAA,GAELF,IAAcY;AAAA,IAAA,GAGVC,IAAa,MAAM;AACvB,MAAI,CAACd,KAAoB,CAACJ,EAAmB,QAAQ,SACrDG,EAAQ,SAAS,EAAE,KAAKA,EAAQ,cAAc;AAAA,IAAA;AAGhD,IAAAA,EAAQ,iBAAiB,SAASU,CAAO,GACzCV,EAAQ,iBAAiB,cAAcY,CAAY,GACnDZ,EAAQ,iBAAiB,aAAaa,CAAW;AAEjD,UAAMG,IAAW,IAAI,iBAAiBD,CAAU;AAEhD,WAAAC,EAAS,QAAQhB,GAAS;AAAA,MACxB,WAAW;AAAA,MACX,SAAS;AAAA,MACT,eAAe;AAAA,IAAA,CAChB,GAEM,MAAM;AACX,MAAAgB,EAAS,WAAA,GACThB,EAAQ,oBAAoB,SAASU,CAAO,GAC5CV,EAAQ,oBAAoB,cAAcY,CAAY,GACtDZ,EAAQ,oBAAoB,aAAaa,CAAW;AAAA,IAAA;AAAA,EACtD,GACC,CAACnB,GAASH,KAAUC,EAAS,cAAcD,CAAM,GAAGI,EAAY,KAAK,CAAC,GAErE,CAAAJ;AACJ,WAAO,EAAE,KAAKI,EAAA;AAChB;"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { useRef as
|
|
1
|
+
import { useRef as s, useEffect as l } from "react";
|
|
2
2
|
import { useRefState as m } from "../useRefState/useRefState.mjs";
|
|
3
3
|
import { isTarget as r } from "../../utils/helpers/isTarget.mjs";
|
|
4
|
-
const g = ((...
|
|
5
|
-
const
|
|
4
|
+
const g = ((...t) => {
|
|
5
|
+
const e = r(t[0]) ? t[0] : void 0, c = t[1] ? t[1] : t[0], n = m(), o = s(c);
|
|
6
6
|
if (o.current = c, l(() => {
|
|
7
|
-
if (!
|
|
8
|
-
const i =
|
|
7
|
+
if (!e && !n.state) return;
|
|
8
|
+
const i = e ? r.getElement(e) : n.current;
|
|
9
9
|
if (!i) return;
|
|
10
|
-
const u = (
|
|
11
|
-
i.contains(
|
|
10
|
+
const u = (f) => {
|
|
11
|
+
i.contains(f.target) || o.current(f);
|
|
12
12
|
};
|
|
13
13
|
return document.addEventListener("click", u), () => {
|
|
14
14
|
document.removeEventListener("click", u);
|
|
15
15
|
};
|
|
16
|
-
}, [
|
|
17
|
-
return n;
|
|
16
|
+
}, [e && r.getRawElement(e), n.state]), !e)
|
|
17
|
+
return { ref: n };
|
|
18
18
|
});
|
|
19
19
|
export {
|
|
20
20
|
g as useClickOutside
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useClickOutside.mjs","sources":["../../../../src/hooks/useClickOutside/useClickOutside.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport interface UseClickOutside {\n (target: HookTarget, callback: (event: Event) => void): void;\n\n <Target extends Element>(callback: (event: Event) => void
|
|
1
|
+
{"version":3,"file":"useClickOutside.mjs","sources":["../../../../src/hooks/useClickOutside/useClickOutside.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport interface UseClickOutside {\n (target: HookTarget, callback: (event: Event) => void): void;\n\n <Target extends Element>(\n callback: (event: Event) => void,\n target?: never\n ): {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useClickOutside\n * @description - Hook to handle click events outside the specified target element(s)\n * @category Elements \n * @usage necessary\n\n * @overload\n * @param {HookTarget} target The target element(s) to detect outside clicks for\n * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected\n * @returns {void}\n *\n * @example\n * useClickOutside(ref, () => console.log('click outside'));\n *\n * @overload\n * @template Target The target element(s)\n * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected\n * @returns {{ ref: StateRef<Target> }} A ref to attach to the target element\n *\n * @example\n * const { ref } = useClickOutside<HTMLDivElement>(() => console.log('click outside'));\n *\n * @see {@link https://siberiacancode.github.io/reactuse/functions/hooks/useClickOutside.html}\n */\nexport const useClickOutside = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const callback = (params[1] ? params[1] : params[0]) as (event: Event) => void;\n\n const internalRef = useRefState<Element>();\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n\n if (!element) return;\n\n const onClick = (event: Event) => {\n if (!element.contains(event.target as Node)) {\n internalCallbackRef.current(event);\n }\n };\n\n document.addEventListener('click', onClick);\n\n return () => {\n document.removeEventListener('click', onClick);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n if (target) return;\n return { ref: internalRef };\n}) as UseClickOutside;\n"],"names":["useClickOutside","params","target","isTarget","callback","internalRef","useRefState","internalCallbackRef","useRef","useEffect","element","onClick","event"],"mappings":";;;AA6CO,MAAMA,KAAmB,IAAIC,MAAkB;AACpD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,IAAYH,EAAO,CAAC,IAAIA,EAAO,CAAC,IAAIA,EAAO,CAAC,GAE5CI,IAAcC,EAAA,GACdC,IAAsBC,EAAOJ,CAAQ;AAsB3C,MArBAG,EAAoB,UAAUH,GAE9BK,EAAU,MAAM;AACd,QAAI,CAACP,KAAU,CAACG,EAAY,MAAO;AAEnC,UAAMK,IAAWR,IAASC,EAAS,WAAWD,CAAM,IAAIG,EAAY;AAEpE,QAAI,CAACK,EAAS;AAEd,UAAMC,IAAU,CAACC,MAAiB;AAChC,MAAKF,EAAQ,SAASE,EAAM,MAAc,KACxCL,EAAoB,QAAQK,CAAK;AAAA,IACnC;AAGF,oBAAS,iBAAiB,SAASD,CAAO,GAEnC,MAAM;AACX,eAAS,oBAAoB,SAASA,CAAO;AAAA,IAAA;AAAA,EAC/C,GACC,CAACT,KAAUC,EAAS,cAAcD,CAAM,GAAGG,EAAY,KAAK,CAAC,GAC5D,CAAAH;AACJ,WAAO,EAAE,KAAKG,EAAA;AAChB;"}
|
|
@@ -18,7 +18,9 @@ const k = 300, C = ((...t) => {
|
|
|
18
18
|
n.removeEventListener("mousedown", i), n.removeEventListener("touchstart", i), c.current && clearTimeout(c.current);
|
|
19
19
|
};
|
|
20
20
|
}, [e && l.getRawElement(e), o.state]), !e)
|
|
21
|
-
return
|
|
21
|
+
return {
|
|
22
|
+
ref: o
|
|
23
|
+
};
|
|
22
24
|
});
|
|
23
25
|
export {
|
|
24
26
|
k as DEFAULT_THRESHOLD_TIME,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDoubleClick.mjs","sources":["../../../../src/hooks/useDoubleClick/useDoubleClick.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport type DoubleClickEvents = MouseEvent | TouchEvent;\n\n/** The use double click options type */\nexport interface UseDoubleClickOptions {\n /** The threshold time in milliseconds between clicks */\n threshold?: number;\n /** The callback function to be invoked on single click */\n onSingleClick?: (event: DoubleClickEvents) => void;\n}\n\nexport interface UseDoubleClick {\n (\n target: HookTarget,\n callback: (event: DoubleClickEvents) => void,\n options?: UseDoubleClickOptions\n ):
|
|
1
|
+
{"version":3,"file":"useDoubleClick.mjs","sources":["../../../../src/hooks/useDoubleClick/useDoubleClick.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport type DoubleClickEvents = MouseEvent | TouchEvent;\n\n/** The use double click options type */\nexport interface UseDoubleClickOptions {\n /** The threshold time in milliseconds between clicks */\n threshold?: number;\n /** The callback function to be invoked on single click */\n onSingleClick?: (event: DoubleClickEvents) => void;\n}\n\nexport interface UseDoubleClick {\n (\n target: HookTarget,\n callback: (event: DoubleClickEvents) => void,\n options?: UseDoubleClickOptions\n ): void;\n\n <Target extends Element>(\n callback: (event: DoubleClickEvents) => void,\n options?: UseDoubleClickOptions,\n target?: never\n ): { ref: StateRef<Target> };\n}\n\nexport const DEFAULT_THRESHOLD_TIME = 300;\n\n/**\n * @name useDoubleClick\n * @description - Hook that defines the logic when double clicking an element\n * @category Elements\n * @usage medium\n\n * @overload\n * @param {HookTarget} target The target element to be double clicked\n * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click\n * @param {UseDoubleClickOptions} [options] The options for the double click\n * @returns {void} The double clicking state\n *\n * @example\n * useDoubleClick(ref, () => console.log('double clicked'));\n *\n * @overload\n * @template Target The target element\n * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click\n * @param {UseDoubleClickOptions} [options] The options for the double click\n * @returns {{ ref: StateRef<Target> }} The double clicking state\n *\n * @example\n * const { ref } = useDoubleClick(() => console.log('double clicked'));\n *\n * @see {@link https://siberiacancode.github.io/reactuse/functions/hooks/useDoubleClick.html}\n */\nexport const useDoubleClick = ((...params: any[]): any => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const callback = (target ? params[1] : params[0]) as (event: DoubleClickEvents) => void;\n const options = (target ? params[2] : params[1]) as UseDoubleClickOptions | undefined;\n\n const timeoutIdRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const clickCountRef = useRef(0);\n const internalRef = useRefState<Element>();\n\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n const internalOptionsRef = useRef(options);\n internalOptionsRef.current = options;\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = target ? isTarget.getElement(target) : internalRef.current;\n if (!element) return;\n\n const onClick = (event: DoubleClickEvents) => {\n clickCountRef.current += 1;\n\n if (clickCountRef.current === 1) {\n timeoutIdRef.current = setTimeout(() => {\n if (internalOptionsRef.current?.onSingleClick)\n internalOptionsRef.current.onSingleClick(event);\n clickCountRef.current = 0;\n }, internalOptionsRef.current?.threshold ?? DEFAULT_THRESHOLD_TIME);\n }\n\n if (clickCountRef.current === 2) {\n clearTimeout(timeoutIdRef.current);\n internalCallbackRef.current(event);\n clickCountRef.current = 0;\n }\n };\n\n element.addEventListener('mousedown', onClick as EventListener);\n element.addEventListener('touchstart', onClick as EventListener);\n\n return () => {\n element.removeEventListener('mousedown', onClick as EventListener);\n element.removeEventListener('touchstart', onClick as EventListener);\n if (timeoutIdRef.current) clearTimeout(timeoutIdRef.current);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n if (target) return;\n return {\n ref: internalRef\n };\n}) as UseDoubleClick;\n"],"names":["DEFAULT_THRESHOLD_TIME","useDoubleClick","params","target","isTarget","callback","options","timeoutIdRef","useRef","clickCountRef","internalRef","useRefState","internalCallbackRef","internalOptionsRef","useEffect","element","onClick","event"],"mappings":";;;AAkCO,MAAMA,IAAyB,KA4BzBC,KAAkB,IAAIC,MAAuB;AACxD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,IAAYF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GACzCI,IAAWH,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GAExCK,IAAeC,EAAsC,MAAS,GAC9DC,IAAgBD,EAAO,CAAC,GACxBE,IAAcC,EAAA,GAEdC,IAAsBJ,EAAOH,CAAQ;AAC3C,EAAAO,EAAoB,UAAUP;AAC9B,QAAMQ,IAAqBL,EAAOF,CAAO;AAqCzC,MApCAO,EAAmB,UAAUP,GAE7BQ,EAAU,MAAM;AACd,QAAI,CAACX,KAAU,CAACO,EAAY,MAAO;AAEnC,UAAMK,IAAUZ,IAASC,EAAS,WAAWD,CAAM,IAAIO,EAAY;AACnE,QAAI,CAACK,EAAS;AAEd,UAAMC,IAAU,CAACC,MAA6B;AAC5C,MAAAR,EAAc,WAAW,GAErBA,EAAc,YAAY,MAC5BF,EAAa,UAAU,WAAW,MAAM;AACtC,QAAIM,EAAmB,SAAS,iBAC9BA,EAAmB,QAAQ,cAAcI,CAAK,GAChDR,EAAc,UAAU;AAAA,MAAA,GACvBI,EAAmB,SAAS,aAAab,CAAsB,IAGhES,EAAc,YAAY,MAC5B,aAAaF,EAAa,OAAO,GACjCK,EAAoB,QAAQK,CAAK,GACjCR,EAAc,UAAU;AAAA,IAC1B;AAGF,WAAAM,EAAQ,iBAAiB,aAAaC,CAAwB,GAC9DD,EAAQ,iBAAiB,cAAcC,CAAwB,GAExD,MAAM;AACX,MAAAD,EAAQ,oBAAoB,aAAaC,CAAwB,GACjED,EAAQ,oBAAoB,cAAcC,CAAwB,GAC9DT,EAAa,WAAS,aAAaA,EAAa,OAAO;AAAA,IAAA;AAAA,EAC7D,GACC,CAACJ,KAAUC,EAAS,cAAcD,CAAM,GAAGO,EAAY,KAAK,CAAC,GAE5D,CAAAP;AACJ,WAAO;AAAA,MACL,KAAKO;AAAA,IAAA;AAET;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFocusTrap.mjs","sources":["../../../../src/hooks/useFocusTrap/useFocusTrap.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect/useIsomorphicLayoutEffect';\nimport { useRefState } from '../useRefState/useRefState';\n\nexport const FOCUS_SELECTOR = 'a, input, select, textarea, button, object, [tabindex]';\n\nconst getFocusableElements = (element: HTMLElement) => {\n const elements = Array.from(element.querySelectorAll(FOCUS_SELECTOR));\n return elements.filter((element) => {\n const htmlEl = element as HTMLElement;\n return htmlEl.tabIndex !== -1 && !htmlEl.hidden && htmlEl.style.display !== 'none';\n }) as HTMLElement[];\n};\n\nconst focusElement = (element: HTMLElement) => {\n const autofocusElement = element.querySelector('[data-autofocus]') as HTMLElement;\n if (autofocusElement) return autofocusElement.focus();\n const focusableElements = getFocusableElements(element);\n if (focusableElements.length) focusableElements[0].focus();\n};\n\n/** The use focus trap return type */\nexport interface UseFocusTrapReturn {\n /** Whether focus trap is active */\n active: boolean;\n /** Disable focus trap */\n disable: () => void;\n /** Enable focus trap */\n enable: () => void;\n /** Toggle focus trap */\n toggle: () => void;\n}\n\nexport interface UseFocusTrap {\n (target: HookTarget, active?: boolean): UseFocusTrapReturn;\n\n <Target extends HTMLElement>(\n active?: boolean,\n target?: never\n ): UseFocusTrapReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useFocusTrap\n * @description - Hook that traps focus within a given element\n * @category Elements\n * @usage medium\n *\n * @overload\n * @param {HookTarget} target The target element for focus trap\n * @param {boolean} [active=true] Whether focus trap is active\n * @returns {UseFocusTrapReturn} Object with
|
|
1
|
+
{"version":3,"file":"useFocusTrap.mjs","sources":["../../../../src/hooks/useFocusTrap/useFocusTrap.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect/useIsomorphicLayoutEffect';\nimport { useRefState } from '../useRefState/useRefState';\n\nexport const FOCUS_SELECTOR = 'a, input, select, textarea, button, object, [tabindex]';\n\nconst getFocusableElements = (element: HTMLElement) => {\n const elements = Array.from(element.querySelectorAll(FOCUS_SELECTOR));\n return elements.filter((element) => {\n const htmlEl = element as HTMLElement;\n return htmlEl.tabIndex !== -1 && !htmlEl.hidden && htmlEl.style.display !== 'none';\n }) as HTMLElement[];\n};\n\nconst focusElement = (element: HTMLElement) => {\n const autofocusElement = element.querySelector('[data-autofocus]') as HTMLElement;\n if (autofocusElement) return autofocusElement.focus();\n const focusableElements = getFocusableElements(element);\n if (focusableElements.length) focusableElements[0].focus();\n};\n\n/** The use focus trap return type */\nexport interface UseFocusTrapReturn {\n /** Whether focus trap is active */\n active: boolean;\n /** Disable focus trap */\n disable: () => void;\n /** Enable focus trap */\n enable: () => void;\n /** Toggle focus trap */\n toggle: () => void;\n}\n\nexport interface UseFocusTrap {\n (target: HookTarget, active?: boolean): UseFocusTrapReturn;\n\n <Target extends HTMLElement>(\n active?: boolean,\n target?: never\n ): UseFocusTrapReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useFocusTrap\n * @description - Hook that traps focus within a given element\n * @category Elements\n * @usage medium\n *\n * @overload\n * @param {HookTarget} target The target element for focus trap\n * @param {boolean} [active=true] Whether focus trap is active\n * @returns {UseFocusTrapReturn} Object with the focus trap state and methods\n *\n * @example\n * const { active, disable, toggle, enable } = useFocusTrap(ref, true);\n *\n * @overload\n * @template Target The target element type\n * @param {boolean} [active=true] Whether focus trap is active\n * @returns {UseFocusTrapReturn & { ref: StateRef<Target> }} Object with the focus trap state and methods\n *\n * @example\n * const { ref, active, disable, toggle, enable } = useFocusTrap(true);\n */\nexport const useFocusTrap = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const initialActive = target ? params[1] : params[0];\n\n const [active, setActive] = useState(initialActive);\n const internalRef = useRefState<HTMLElement>();\n\n const enable = () => setActive(true);\n const disable = () => setActive(false);\n const toggle = () => setActive((prevActive: boolean) => !prevActive);\n\n useIsomorphicLayoutEffect(() => {\n if (!active) return;\n\n const element = target ? isTarget.getElement(target) : internalRef.current;\n if (!element) return;\n\n const htmlElement = element as HTMLElement;\n focusElement(htmlElement);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const [firstElement, ...restElements] = getFocusableElements(htmlElement);\n if (!restElements.length) return;\n\n const lastElement = restElements.at(-1)!;\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n };\n\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [active, target && isTarget.getRawElement(target), internalRef.state]);\n\n if (target) return { active, enable, disable, toggle };\n return { active, enable, disable, toggle, ref: internalRef };\n}) as UseFocusTrap;\n"],"names":["FOCUS_SELECTOR","getFocusableElements","element","htmlEl","focusElement","autofocusElement","focusableElements","useFocusTrap","params","target","isTarget","initialActive","active","setActive","useState","internalRef","useRefState","enable","disable","toggle","prevActive","useIsomorphicLayoutEffect","htmlElement","onKeyDown","event","firstElement","restElements","lastElement"],"mappings":";;;;AAWO,MAAMA,IAAiB,0DAExBC,IAAuB,CAACC,MACX,MAAM,KAAKA,EAAQ,iBAAiBF,CAAc,CAAC,EACpD,OAAO,CAACE,MAAY;AAClC,QAAMC,IAASD;AACf,SAAOC,EAAO,aAAa,MAAM,CAACA,EAAO,UAAUA,EAAO,MAAM,YAAY;AAAA,CAC7E,GAGGC,IAAe,CAACF,MAAyB;AAC7C,QAAMG,IAAmBH,EAAQ,cAAc,kBAAkB;AACjE,MAAIG,EAAkB,QAAOA,EAAiB,MAAA;AAC9C,QAAMC,IAAoBL,EAAqBC,CAAO;AACtD,EAAII,EAAkB,UAAQA,EAAkB,CAAC,EAAE,MAAA;AACrD,GA+CaC,KAAgB,IAAIC,MAAkB;AACjD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,IAAgBF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GAE7C,CAACI,GAAQC,CAAS,IAAIC,EAASH,CAAa,GAC5CI,IAAcC,EAAA,GAEdC,IAAS,MAAMJ,EAAU,EAAI,GAC7BK,IAAU,MAAML,EAAU,EAAK,GAC/BM,IAAS,MAAMN,EAAU,CAACO,MAAwB,CAACA,CAAU;AAqCnE,SAnCAC,EAA0B,MAAM;AAC9B,QAAI,CAACT,EAAQ;AAEb,UAAMV,IAAUO,IAASC,EAAS,WAAWD,CAAM,IAAIM,EAAY;AACnE,QAAI,CAACb,EAAS;AAEd,UAAMoB,IAAcpB;AACpB,IAAAE,EAAakB,CAAW;AAExB,UAAMC,IAAY,CAACC,MAAyB;AAC1C,UAAIA,EAAM,QAAQ,MAAO;AAEzB,YAAM,CAACC,GAAc,GAAGC,CAAY,IAAIzB,EAAqBqB,CAAW;AACxE,UAAI,CAACI,EAAa,OAAQ;AAE1B,YAAMC,IAAcD,EAAa,GAAG,EAAE;AAEtC,MAAIF,EAAM,YAAY,SAAS,kBAAkBC,MAC/CD,EAAM,eAAA,GACNG,EAAY,MAAA,IAGV,SAAS,kBAAkBA,MAC7BH,EAAM,eAAA,GACNC,EAAa,MAAA;AAAA,IACf;AAGF,oBAAS,iBAAiB,WAAWF,CAAS,GAEvC,MAAM;AACX,eAAS,oBAAoB,WAAWA,CAAS;AAAA,IAAA;AAAA,EACnD,GACC,CAACX,GAAQH,KAAUC,EAAS,cAAcD,CAAM,GAAGM,EAAY,KAAK,CAAC,GAEpEN,IAAe,EAAE,QAAAG,GAAQ,QAAAK,GAAQ,SAAAC,GAAS,QAAAC,EAAA,IACvC,EAAE,QAAAP,GAAQ,QAAAK,GAAQ,SAAAC,GAAS,QAAAC,GAAQ,KAAKJ,EAAA;AACjD;"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { useState as a, useRef as w, useEffect as
|
|
1
|
+
import { useState as a, useRef as w, useEffect as l } from "react";
|
|
2
2
|
const f = () => decodeURIComponent(window.location.hash.replace("#", "")), p = ((...e) => {
|
|
3
3
|
const c = typeof e[0] == "string" ? e[0] : "", o = typeof e[1] == "object" ? e[1] : typeof e[1] == "function" ? { onChange: e[1] } : typeof e[0] == "object" ? e[0] : {}, s = o?.enabled ?? !0, h = o?.mode ?? "replace", [i, r] = a(() => typeof window > "u" ? c : f() || c), t = w(o);
|
|
4
4
|
t.current = o;
|
|
5
5
|
const u = (n) => {
|
|
6
6
|
window.location.hash = n, r(n), t.current?.onChange?.(n);
|
|
7
7
|
};
|
|
8
|
-
return
|
|
8
|
+
return l(() => {
|
|
9
9
|
if (!s) return;
|
|
10
10
|
h === "replace" && (window.location.hash = i);
|
|
11
11
|
const n = () => {
|
|
@@ -15,7 +15,10 @@ const f = () => decodeURIComponent(window.location.hash.replace("#", "")), p = (
|
|
|
15
15
|
return window.addEventListener("hashchange", n), () => {
|
|
16
16
|
window.removeEventListener("hashchange", n);
|
|
17
17
|
};
|
|
18
|
-
}, [s, h]),
|
|
18
|
+
}, [s, h]), {
|
|
19
|
+
value: i,
|
|
20
|
+
set: u
|
|
21
|
+
};
|
|
19
22
|
});
|
|
20
23
|
export {
|
|
21
24
|
f as getHash,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHash.mjs","sources":["../../../../src/hooks/useHash/useHash.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nexport const getHash = () => decodeURIComponent(window.location.hash.replace('#', ''));\n\n/** The use hash options type */\nexport interface UseHashOptions {\n /** The enabled state of the hook */\n enabled?: boolean;\n /** The mode of hash setting */\n mode?: 'initial' | 'replace';\n /** Callback function called when hash changes */\n onChange?: (hash: string) => void;\n}\n\n/** The use hash return type */\
|
|
1
|
+
{"version":3,"file":"useHash.mjs","sources":["../../../../src/hooks/useHash/useHash.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nexport const getHash = () => decodeURIComponent(window.location.hash.replace('#', ''));\n\n/** The use hash options type */\nexport interface UseHashOptions {\n /** The enabled state of the hook */\n enabled?: boolean;\n /** The mode of hash setting */\n mode?: 'initial' | 'replace';\n /** Callback function called when hash changes */\n onChange?: (hash: string) => void;\n}\n\n/** The use hash return type */\ninterface UseHashReturn {\n /** The hash value */\n value: string;\n /** The function to set the hash value */\n set: (value: string) => void;\n}\n\nexport interface UseHash {\n (initialValue?: string, options?: UseHashOptions): UseHashReturn;\n\n (options?: UseHashOptions): UseHashReturn;\n\n (initialValue?: string, callback?: (hash: string) => void): UseHashReturn;\n\n (callback?: (hash: string) => void): UseHashReturn;\n}\n\n/**\n * @name useHash\n * @description - Hook that manages the hash value\n * @category State\n * @usage low\n *\n * @overload\n * @param {string} [initialValue] The initial hash value if no hash exists\n * @param {UseHashOptions} [options] Configuration options\n * @param {boolean} [options.enabled] The enabled state of the hook\n * @param {'initial' | 'replace'} [options.mode] The mode of hash setting\n * @param {(hash: string) => void} [options.onChange] Callback function called when hash changes\n * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value\n *\n * @example\n * const { value, set } = useHash(\"initial\");\n *\n * @overload\n * @param {string} [initialValue] The initial hash value if no hash exists\n * @param {(hash: string) => void} [callback] Callback function called when hash changes\n * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value\n *\n * @example\n * const { value, set } = useHash(\"initial\", (newHash) => console.log('callback'));\n *\n * @overload\n * @param {UseHashOptions} [options] Configuration options\n * @param {boolean} [options.enabled] The enabled state of the hook\n * @param {'initial' | 'replace'} [options.mode] The mode of hash setting\n * @param {(hash: string) => void} [options.onChange] Callback function called when hash changes\n * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value\n *\n * @example\n * const { value, set } = useHash();\n *\n * @overload\n * @param {(hash: string) => void} [callback] Callback function called when hash changes\n * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value\n *\n * @example\n * const { value, set } = useHash((newHash) => console.log('callback'));\n */\nexport const useHash = ((...params: any[]) => {\n const initialValue = typeof params[0] === 'string' ? params[0] : '';\n const options =\n typeof params[1] === 'object'\n ? params[1]\n : typeof params[1] === 'function'\n ? { onChange: params[1] }\n : typeof params[0] === 'object'\n ? params[0]\n : {};\n\n const enabled = options?.enabled ?? true;\n const mode = options?.mode ?? 'replace';\n\n const [hash, setHash] = useState(() => {\n if (typeof window === 'undefined') return initialValue;\n return getHash() || initialValue;\n });\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const set = (value: string) => {\n window.location.hash = value;\n setHash(value);\n optionsRef.current?.onChange?.(value);\n };\n\n useEffect(() => {\n if (!enabled) return;\n\n if (mode === 'replace') window.location.hash = hash;\n\n const onHashChange = () => {\n const newHash = getHash();\n setHash(newHash);\n optionsRef.current?.onChange?.(newHash);\n };\n\n window.addEventListener('hashchange', onHashChange);\n return () => {\n window.removeEventListener('hashchange', onHashChange);\n };\n }, [enabled, mode]);\n\n return {\n value: hash,\n set\n };\n}) as UseHash;\n"],"names":["getHash","useHash","params","initialValue","options","enabled","mode","hash","setHash","useState","optionsRef","useRef","set","value","useEffect","onHashChange","newHash"],"mappings":";AAEO,MAAMA,IAAU,MAAM,mBAAmB,OAAO,SAAS,KAAK,QAAQ,KAAK,EAAE,CAAC,GAwExEC,KAAW,IAAIC,MAAkB;AAC5C,QAAMC,IAAe,OAAOD,EAAO,CAAC,KAAM,WAAWA,EAAO,CAAC,IAAI,IAC3DE,IACJ,OAAOF,EAAO,CAAC,KAAM,WACjBA,EAAO,CAAC,IACR,OAAOA,EAAO,CAAC,KAAM,aACnB,EAAE,UAAUA,EAAO,CAAC,EAAA,IACpB,OAAOA,EAAO,CAAC,KAAM,WACnBA,EAAO,CAAC,IACR,CAAA,GAEJG,IAAUD,GAAS,WAAW,IAC9BE,IAAOF,GAAS,QAAQ,WAExB,CAACG,GAAMC,CAAO,IAAIC,EAAS,MAC3B,OAAO,SAAW,MAAoBN,IACnCH,OAAaG,CACrB,GAEKO,IAAaC,EAAOP,CAAO;AACjC,EAAAM,EAAW,UAAUN;AAErB,QAAMQ,IAAM,CAACC,MAAkB;AAC7B,WAAO,SAAS,OAAOA,GACvBL,EAAQK,CAAK,GACbH,EAAW,SAAS,WAAWG,CAAK;AAAA,EAAA;AAGtC,SAAAC,EAAU,MAAM;AACd,QAAI,CAACT,EAAS;AAEd,IAAIC,MAAS,cAAW,OAAO,SAAS,OAAOC;AAE/C,UAAMQ,IAAe,MAAM;AACzB,YAAMC,IAAUhB,EAAA;AAChB,MAAAQ,EAAQQ,CAAO,GACfN,EAAW,SAAS,WAAWM,CAAO;AAAA,IAAA;AAGxC,kBAAO,iBAAiB,cAAcD,CAAY,GAC3C,MAAM;AACX,aAAO,oBAAoB,cAAcA,CAAY;AAAA,IAAA;AAAA,EACvD,GACC,CAACV,GAASC,CAAI,CAAC,GAEX;AAAA,IACL,OAAOC;AAAA,IACP,KAAAK;AAAA,EAAA;AAEJ;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { useState as m, useRef as
|
|
1
|
+
import { useState as m, useRef as a, useEffect as d } from "react";
|
|
2
2
|
import { useRefState as g } from "../useRefState/useRefState.mjs";
|
|
3
3
|
import { isTarget as i } from "../../utils/helpers/isTarget.mjs";
|
|
4
4
|
const b = ((...e) => {
|
|
5
|
-
const t = i(e[0]) ? e[0] : void 0, r = t ? typeof e[1] == "object" ? e[1] : { onEntry: e[1] } : typeof e[0] == "object" ? e[0] : { onEntry: e[0] }, c = r?.enabled ?? !0, [f, v] = m(!1), o = g(), s =
|
|
6
|
-
return s.current = r,
|
|
5
|
+
const t = i(e[0]) ? e[0] : void 0, r = t ? typeof e[1] == "object" ? e[1] : { onEntry: e[1] } : typeof e[0] == "object" ? e[0] : { onEntry: e[0] }, c = r?.enabled ?? !0, [f, v] = m(!1), o = g(), s = a(r);
|
|
6
|
+
return s.current = r, d(() => {
|
|
7
7
|
if (!c || !t && !o.state) return;
|
|
8
8
|
const n = t ? i.getElement(t) : o.current;
|
|
9
9
|
if (!n) return;
|
|
@@ -15,7 +15,7 @@ const b = ((...e) => {
|
|
|
15
15
|
return n.addEventListener("mouseenter", l), n.addEventListener("mouseleave", E), () => {
|
|
16
16
|
n.removeEventListener("mouseenter", l), n.removeEventListener("mouseleave", E);
|
|
17
17
|
};
|
|
18
|
-
}, [c, t && i.getRawElement(t), o.state]), t ? f : {
|
|
18
|
+
}, [c, t && i.getRawElement(t), o.state]), t ? { value: f } : {
|
|
19
19
|
ref: o,
|
|
20
20
|
value: f
|
|
21
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHover.mjs","sources":["../../../../src/hooks/useHover/useHover.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use hover options type */\nexport interface UseHoverOptions {\n /** The enabled state of the hook */\n enabled?: boolean;\n /** The on entry callback */\n onEntry?: (event: Event) => void;\n /** The on leave callback */\n onLeave?: (event: Event) => void;\n}\n\nexport interface UseHoverReturn {\n value: boolean;\n}\n\nexport interface UseHover {\n (target: HookTarget, callback?: (event: Event) => void):
|
|
1
|
+
{"version":3,"file":"useHover.mjs","sources":["../../../../src/hooks/useHover/useHover.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use hover options type */\nexport interface UseHoverOptions {\n /** The enabled state of the hook */\n enabled?: boolean;\n /** The on entry callback */\n onEntry?: (event: Event) => void;\n /** The on leave callback */\n onLeave?: (event: Event) => void;\n}\n\n/** The use hover return type */\nexport interface UseHoverReturn {\n /** The value of the hover */\n value: boolean;\n}\n\nexport interface UseHover {\n (target: HookTarget, callback?: (event: Event) => void): UseHoverReturn;\n\n (target: HookTarget, options?: UseHoverOptions): UseHoverReturn;\n\n <Target extends Element>(\n callback?: (event: Event) => void,\n target?: never\n ): UseHoverReturn & { ref: StateRef<Target> };\n\n <Target extends Element>(\n options?: UseHoverOptions,\n target?: never\n ): UseHoverReturn & { ref: StateRef<Target> };\n}\n\n/**\n * @name useHover\n * @description - Hook that defines the logic when hovering an element\n * @category Elements\n * @usage medium\n *\n * @overload\n * @param {HookTarget} target The target element to be hovered\n * @param {(event: Event) => void} [callback] The callback function to be invoked on mouse enter\n * @returns {boolean} The value of the hover\n *\n * @example\n * const hovering = useHover(ref, () => console.log('callback'));\n *\n * @overload\n * @param {HookTarget} target The target element to be hovered\n * @param {(event: Event) => void} [options.onEntry] The callback function to be invoked on mouse enter\n * @param {(event: Event) => void} [options.onLeave] The callback function to be invoked on mouse leave\n * @returns {boolean} The value of the hover\n *\n * @example\n * const hovering = useHover(ref, options);\n *\n * @overload\n * @template Target The target element\n * @param {(event: Event) => void} [callback] The callback function to be invoked on mouse enter\n * @returns {{ ref: StateRef<Target> } & UseHoverReturn} The object with the ref and the value of the hover\n *\n * @example\n * const { ref, value } = useHover(() => console.log('callback'));\n *\n * @overload\n * @template Target The target element\n * @param {(event: Event) => void} [options.onEntry] The callback function to be invoked on mouse enter\n * @param {(event: Event) => void} [options.onLeave] The callback function to be invoked on mouse leave\n * @returns {{ ref: StateRef<Target> } & UseHoverReturn} The object with the ref and the value of the hover\n *\n * @example\n * const { ref, value } = useHover(options);\n */\nexport const useHover = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n\n const options = (\n target\n ? typeof params[1] === 'object'\n ? params[1]\n : { onEntry: params[1] }\n : typeof params[0] === 'object'\n ? params[0]\n : { onEntry: params[0] }\n ) as UseHoverOptions | undefined;\n\n const enabled = options?.enabled ?? true;\n\n const [hovering, setHovering] = useState(false);\n const internalRef = useRefState<Element>();\n const internalOptionsRef = useRef(options);\n internalOptionsRef.current = options;\n\n useEffect(() => {\n if (!enabled || (!target && !internalRef.state)) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n\n if (!element) return;\n\n const onMouseEnter = (event: Event) => {\n internalOptionsRef.current?.onEntry?.(event);\n setHovering(true);\n };\n\n const onMouseLeave = (event: Event) => {\n internalOptionsRef.current?.onLeave?.(event);\n setHovering(false);\n };\n\n element.addEventListener('mouseenter', onMouseEnter);\n element.addEventListener('mouseleave', onMouseLeave);\n\n return () => {\n element.removeEventListener('mouseenter', onMouseEnter);\n element.removeEventListener('mouseleave', onMouseLeave);\n };\n }, [enabled, target && isTarget.getRawElement(target), internalRef.state]);\n\n if (target) return { value: hovering };\n return {\n ref: internalRef,\n value: hovering\n } as const;\n}) as UseHover;\n"],"names":["useHover","params","target","isTarget","options","enabled","hovering","setHovering","useState","internalRef","useRefState","internalOptionsRef","useRef","useEffect","element","onMouseEnter","event","onMouseLeave"],"mappings":";;;AAkFO,MAAMA,KAAY,IAAIC,MAAkB;AAC7C,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAE5CG,IACJF,IACI,OAAOD,EAAO,CAAC,KAAM,WACnBA,EAAO,CAAC,IACR,EAAE,SAASA,EAAO,CAAC,EAAA,IACrB,OAAOA,EAAO,CAAC,KAAM,WACnBA,EAAO,CAAC,IACR,EAAE,SAASA,EAAO,CAAC,EAAA,GAGrBI,IAAUD,GAAS,WAAW,IAE9B,CAACE,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAAcC,EAAA,GACdC,IAAqBC,EAAOR,CAAO;AA6BzC,SA5BAO,EAAmB,UAAUP,GAE7BS,EAAU,MAAM;AACd,QAAI,CAACR,KAAY,CAACH,KAAU,CAACO,EAAY,MAAQ;AAEjD,UAAMK,IAAWZ,IAASC,EAAS,WAAWD,CAAM,IAAIO,EAAY;AAEpE,QAAI,CAACK,EAAS;AAEd,UAAMC,IAAe,CAACC,MAAiB;AACrC,MAAAL,EAAmB,SAAS,UAAUK,CAAK,GAC3CT,EAAY,EAAI;AAAA,IAAA,GAGZU,IAAe,CAACD,MAAiB;AACrC,MAAAL,EAAmB,SAAS,UAAUK,CAAK,GAC3CT,EAAY,EAAK;AAAA,IAAA;AAGnB,WAAAO,EAAQ,iBAAiB,cAAcC,CAAY,GACnDD,EAAQ,iBAAiB,cAAcG,CAAY,GAE5C,MAAM;AACX,MAAAH,EAAQ,oBAAoB,cAAcC,CAAY,GACtDD,EAAQ,oBAAoB,cAAcG,CAAY;AAAA,IAAA;AAAA,EACxD,GACC,CAACZ,GAASH,KAAUC,EAAS,cAAcD,CAAM,GAAGO,EAAY,KAAK,CAAC,GAErEP,IAAe,EAAE,OAAOI,EAAA,IACrB;AAAA,IACL,KAAKG;AAAA,IACL,OAAOH;AAAA,EAAA;AAEX;"}
|
|
@@ -22,7 +22,7 @@ const B = ((...e) => {
|
|
|
22
22
|
return r.addEventListener("scroll", g), () => {
|
|
23
23
|
r.removeEventListener("scroll", g);
|
|
24
24
|
};
|
|
25
|
-
}, [t && c.getRawElement(t), o.state, l, f]), t ? n : {
|
|
25
|
+
}, [t && c.getRawElement(t), o.state, l, f]), t ? { loading: n } : {
|
|
26
26
|
ref: o,
|
|
27
27
|
loading: n
|
|
28
28
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInfiniteScroll.mjs","sources":["../../../../src/hooks/useInfiniteScroll/useInfiniteScroll.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use infinite scroll options type */\nexport interface UseInfiniteScrollOptions {\n /** The direction to trigger the callback */\n direction?: 'bottom' | 'left' | 'right' | 'top';\n /** The distance in pixels to trigger the callback */\n distance?: number;\n}\n\nexport interface UseInfiniteScroll {\n (\n target: HookTarget,\n callback: (event: Event) => void,\n options?: UseInfiniteScrollOptions\n ):
|
|
1
|
+
{"version":3,"file":"useInfiniteScroll.mjs","sources":["../../../../src/hooks/useInfiniteScroll/useInfiniteScroll.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use infinite scroll options type */\nexport interface UseInfiniteScrollOptions {\n /** The direction to trigger the callback */\n direction?: 'bottom' | 'left' | 'right' | 'top';\n /** The distance in pixels to trigger the callback */\n distance?: number;\n}\n\n/** The use infinite scroll return type */\nexport interface UseInfiniteScrollReturn {\n /** The loading state of the infinite scroll */\n loading: boolean;\n /** The ref to attach to the element */\n ref: StateRef<Element>;\n}\n\nexport interface UseInfiniteScroll {\n (\n target: HookTarget,\n callback: (event: Event) => void,\n options?: UseInfiniteScrollOptions\n ): UseInfiniteScrollReturn;\n\n <Target extends Element>(\n callback: (event: Event) => void,\n options?: UseInfiniteScrollOptions,\n target?: never\n ): UseInfiniteScrollReturn & { ref: StateRef<Target> };\n}\n\n/**\n * @name useInfiniteScroll\n * @description - Hook that defines the logic for infinite scroll\n * @category Sensors\n * @usage medium\n *\n * @overload\n * @template Target The target element\n * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected\n * @param {number} [options.distance=10] The distance in pixels to trigger the callback\n * @param {string} [options.direction='bottom'] The direction to trigger the callback\n * @returns {UseInfiniteScrollReturn & { ref: StateRef<Target> }} An object containing the ref and loading\n *\n * @example\n * const { ref, loading } = useInfiniteScroll(() => console.log('infinite scroll'));\n *\n * @overload\n * @param {HookTarget} target The target element to detect infinite scroll for\n * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected\n * @param {number} [options.distance=10] The distance in pixels to trigger the callback\n * @param {string} [options.direction='bottom'] The direction to trigger the callback\n * @returns {UseInfiniteScrollReturn} An object containing the ref and loading\n *\n * @example\n * const { loading } = useInfiniteScroll(ref, () => console.log('infinite scroll'));\n */\nexport const useInfiniteScroll = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const callback = (target ? params[1] : params[0]) as (event: Event) => void;\n const options = (target ? params[2] : params[1]) as UseInfiniteScrollOptions | undefined;\n\n const direction = options?.direction ?? 'bottom';\n const distance = options?.distance ?? 10;\n\n const [loading, setIsLoading] = useState(false);\n\n const internalRef = useRefState<Element>();\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n const internalLoadingRef = useRef(loading);\n internalLoadingRef.current = loading;\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n if (!element) return;\n\n const onLoadMore = async (event: Event) => {\n if (internalLoadingRef.current) return;\n\n const { clientHeight, scrollHeight, scrollTop, clientWidth, scrollWidth, scrollLeft } =\n event.target as Element;\n const scrollBottom = scrollHeight - (scrollTop + clientHeight);\n const scrollRight = scrollWidth - (scrollLeft + clientWidth);\n\n const distances = {\n bottom: scrollBottom,\n top: scrollTop,\n right: scrollRight,\n left: scrollLeft\n };\n\n if (distances[direction] <= distance) {\n setIsLoading(true);\n await internalCallbackRef.current(event);\n setIsLoading(false);\n }\n };\n\n element.addEventListener('scroll', onLoadMore);\n\n return () => {\n element.removeEventListener('scroll', onLoadMore);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state, direction, distance]);\n\n if (target) return { loading };\n return {\n ref: internalRef,\n loading\n };\n}) as UseInfiniteScroll;\n"],"names":["useInfiniteScroll","params","target","isTarget","callback","options","direction","distance","loading","setIsLoading","useState","internalRef","useRefState","internalCallbackRef","useRef","internalLoadingRef","useEffect","element","onLoadMore","event","clientHeight","scrollHeight","scrollTop","clientWidth","scrollWidth","scrollLeft","scrollBottom","scrollRight"],"mappings":";;;AAkEO,MAAMA,KAAqB,IAAIC,MAAkB;AACtD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,IAAYF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GACzCI,IAAWH,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GAExCK,IAAYD,GAAS,aAAa,UAClCE,IAAWF,GAAS,YAAY,IAEhC,CAACG,GAASC,CAAY,IAAIC,EAAS,EAAK,GAExCC,IAAcC,EAAA,GACdC,IAAsBC,EAAOV,CAAQ;AAC3C,EAAAS,EAAoB,UAAUT;AAC9B,QAAMW,IAAqBD,EAAON,CAAO;AAqCzC,SApCAO,EAAmB,UAAUP,GAE7BQ,EAAU,MAAM;AACd,QAAI,CAACd,KAAU,CAACS,EAAY,MAAO;AACnC,UAAMM,IAAWf,IAASC,EAAS,WAAWD,CAAM,IAAIS,EAAY;AACpE,QAAI,CAACM,EAAS;AAEd,UAAMC,IAAa,OAAOC,MAAiB;AACzC,UAAIJ,EAAmB,QAAS;AAEhC,YAAM,EAAE,cAAAK,GAAc,cAAAC,GAAc,WAAAC,GAAW,aAAAC,GAAa,aAAAC,GAAa,YAAAC,MACvEN,EAAM,QACFO,IAAeL,KAAgBC,IAAYF,IAC3CO,IAAcH,KAAeC,IAAaF;AAShD,OAPkB;AAAA,QAChB,QAAQG;AAAA,QACR,KAAKJ;AAAA,QACL,OAAOK;AAAA,QACP,MAAMF;AAAA,MAAA,GAGMnB,CAAS,KAAKC,MAC1BE,EAAa,EAAI,GACjB,MAAMI,EAAoB,QAAQM,CAAK,GACvCV,EAAa,EAAK;AAAA,IACpB;AAGF,WAAAQ,EAAQ,iBAAiB,UAAUC,CAAU,GAEtC,MAAM;AACX,MAAAD,EAAQ,oBAAoB,UAAUC,CAAU;AAAA,IAAA;AAAA,EAClD,GACC,CAAChB,KAAUC,EAAS,cAAcD,CAAM,GAAGS,EAAY,OAAOL,GAAWC,CAAQ,CAAC,GAEjFL,IAAe,EAAE,SAAAM,EAAA,IACd;AAAA,IACL,KAAKG;AAAA,IACL,SAAAH;AAAA,EAAA;AAEJ;"}
|
|
@@ -19,7 +19,7 @@ const A = ((...n) => {
|
|
|
19
19
|
return s.addEventListener("keydown", k), s.addEventListener("keyup", l), () => {
|
|
20
20
|
s.removeEventListener("keydown", k), s.removeEventListener("keyup", l);
|
|
21
21
|
};
|
|
22
|
-
}, [e && i.getRawElement(e), o.state]), e ? a : { pressed: a, ref: o };
|
|
22
|
+
}, [e && i.getRawElement(e), o.state]), e ? { pressed: a } : { pressed: a, ref: o };
|
|
23
23
|
});
|
|
24
24
|
export {
|
|
25
25
|
A as useKeyPress
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyPress.mjs","sources":["../../../../src/hooks/useKeyPress/useKeyPress.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The key or keys to listen for */\nexport type UseKeyPressKey = string | string[];\n\n/** The callback function to be invoked when key is pressed */\nexport type UseKeyPressCallback = (pressed: boolean, event: KeyboardEvent) => void;\n\nexport interface UseKeyPress {\n (target: HookTarget | Window
|
|
1
|
+
{"version":3,"file":"useKeyPress.mjs","sources":["../../../../src/hooks/useKeyPress/useKeyPress.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The key or keys to listen for */\nexport type UseKeyPressKey = string | string[];\n\n/** The callback function to be invoked when key is pressed */\nexport type UseKeyPressCallback = (pressed: boolean, event: KeyboardEvent) => void;\n\n/** The use key press return type */\nexport interface UseKeyPressReturn {\n /** The pressed state of the key */\n pressed: boolean;\n /** The ref to attach to the element */\n ref: StateRef<Element>;\n}\n\nexport interface UseKeyPress {\n (\n target: HookTarget | Window,\n key: UseKeyPressKey,\n callback?: UseKeyPressCallback\n ): UseKeyPressReturn;\n\n <Target extends Element>(\n key: UseKeyPressKey,\n callback?: UseKeyPressCallback,\n target?: never\n ): UseKeyPressReturn & { ref: StateRef<Target> };\n}\n\n/**\n * @name useKeyPress\n * @description - Hook that listens for key press events\n * @category Sensors\n * @usage medium\n *\n * @overload\n * @param {HookTarget} [target=window] The target to attach the event listeners to\n * @param {UseKeyPressKey} key The key or keys to listen for\n * @param {(pressed: boolean, event: KeyboardEvent) => void} [callback] Callback function invoked when key is pressed\n * @returns {UseKeyPressReturn} An object containing the pressed state and ref\n *\n * @example\n * const isKeyPressed = useKeyPress(ref, 'a');\n *\n * @overload\n * @template Target The target element type\n * @param {UseKeyPressKey} key The key or keys to listen for\n * @param {(pressed: boolean, event: KeyboardEvent) => void} [callback] Callback function invoked when key is pressed\n * @returns {{ pressed: boolean; ref: StateRef<Target> }} An object containing the pressed state and ref\n *\n * @example\n * const { pressed, ref } = useKeyPress('a');\n */\nexport const useKeyPress = ((...params: any[]) => {\n const target = isTarget(params[0]) ? params[0] : undefined;\n const key = (target ? params[1] : params[0]) as UseKeyPressKey;\n const callback = (target ? params[2] : params[1]) as UseKeyPressCallback | undefined;\n\n const [pressed, setPressed] = useState(false);\n const internalRef = useRefState(window);\n\n const keyRef = useRef(key);\n keyRef.current = key;\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n if (!element) return;\n\n const onKeyDown = (event: Event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (\n Array.isArray(keyRef.current)\n ? keyRef.current.includes(keyboardEvent.key)\n : keyboardEvent.key === keyRef.current\n ) {\n setPressed(true);\n internalCallbackRef.current?.(true, keyboardEvent);\n }\n };\n\n const onKeyUp = (event: Event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (\n Array.isArray(keyRef.current)\n ? keyRef.current.includes(keyboardEvent.key)\n : keyboardEvent.key === keyRef.current\n ) {\n setPressed(false);\n internalCallbackRef.current?.(false, keyboardEvent);\n }\n };\n\n element.addEventListener('keydown', onKeyDown);\n element.addEventListener('keyup', onKeyUp);\n\n return () => {\n element.removeEventListener('keydown', onKeyDown);\n element.removeEventListener('keyup', onKeyUp);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n if (target) return { pressed };\n return { pressed, ref: internalRef };\n}) as UseKeyPress;\n"],"names":["useKeyPress","params","target","isTarget","key","callback","pressed","setPressed","useState","internalRef","useRefState","keyRef","useRef","internalCallbackRef","useEffect","element","onKeyDown","event","keyboardEvent","onKeyUp"],"mappings":";;;AA8DO,MAAMA,KAAe,IAAIC,MAAkB;AAChD,QAAMC,IAASC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC3CG,IAAOF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GACpCI,IAAYH,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GAEzC,CAACK,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtCC,IAAcC,EAAY,MAAM,GAEhCC,IAASC,EAAOR,CAAG;AACzB,EAAAO,EAAO,UAAUP;AACjB,QAAMS,IAAsBD,EAAOP,CAAQ;AA0C3C,SAzCAQ,EAAoB,UAAUR,GAE9BS,EAAU,MAAM;AACd,QAAI,CAACZ,KAAU,CAACO,EAAY,MAAO;AAEnC,UAAMM,IAAWb,IAASC,EAAS,WAAWD,CAAM,IAAIO,EAAY;AACpE,QAAI,CAACM,EAAS;AAEd,UAAMC,IAAY,CAACC,MAAiB;AAClC,YAAMC,IAAgBD;AACtB,OACE,MAAM,QAAQN,EAAO,OAAO,IACxBA,EAAO,QAAQ,SAASO,EAAc,GAAG,IACzCA,EAAc,QAAQP,EAAO,aAEjCJ,EAAW,EAAI,GACfM,EAAoB,UAAU,IAAMK,CAAa;AAAA,IACnD,GAGIC,IAAU,CAACF,MAAiB;AAChC,YAAMC,IAAgBD;AACtB,OACE,MAAM,QAAQN,EAAO,OAAO,IACxBA,EAAO,QAAQ,SAASO,EAAc,GAAG,IACzCA,EAAc,QAAQP,EAAO,aAEjCJ,EAAW,EAAK,GAChBM,EAAoB,UAAU,IAAOK,CAAa;AAAA,IACpD;AAGF,WAAAH,EAAQ,iBAAiB,WAAWC,CAAS,GAC7CD,EAAQ,iBAAiB,SAASI,CAAO,GAElC,MAAM;AACX,MAAAJ,EAAQ,oBAAoB,WAAWC,CAAS,GAChDD,EAAQ,oBAAoB,SAASI,CAAO;AAAA,IAAA;AAAA,EAC9C,GACC,CAACjB,KAAUC,EAAS,cAAcD,CAAM,GAAGO,EAAY,KAAK,CAAC,GAE5DP,IAAe,EAAE,SAAAI,EAAA,IACd,EAAE,SAAAA,GAAS,KAAKG,EAAA;AACzB;"}
|
|
@@ -18,7 +18,7 @@ const p = ((...r) => {
|
|
|
18
18
|
return t.addEventListener("keydown", m), t.addEventListener("keyup", E), () => {
|
|
19
19
|
t.removeEventListener("keydown", m), t.removeEventListener("keyup", E);
|
|
20
20
|
};
|
|
21
|
-
}, [f, i.state, e && u.getRawElement(e)]), e ? y : { value: y, ref: i };
|
|
21
|
+
}, [f, i.state, e && u.getRawElement(e)]), e ? { value: y } : { value: y, ref: i };
|
|
22
22
|
});
|
|
23
23
|
export {
|
|
24
24
|
p as useKeysPressed
|