@mantine/hooks 9.7.0 → 9.7.2
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/cjs/use-debounced-callback/use-debounced-callback.cjs +3 -5
- package/cjs/use-debounced-callback/use-debounced-callback.cjs.map +1 -1
- package/cjs/use-debounced-state/use-debounced-state.cjs +6 -2
- package/cjs/use-debounced-state/use-debounced-state.cjs.map +1 -1
- package/cjs/use-pagination/use-pagination.cjs +1 -1
- package/cjs/use-pagination/use-pagination.cjs.map +1 -1
- package/cjs/use-scroll-into-view/use-scroll-into-view.cjs +1 -0
- package/cjs/use-scroll-into-view/use-scroll-into-view.cjs.map +1 -1
- package/esm/use-debounced-callback/use-debounced-callback.mjs +3 -5
- package/esm/use-debounced-callback/use-debounced-callback.mjs.map +1 -1
- package/esm/use-debounced-state/use-debounced-state.mjs +6 -2
- package/esm/use-debounced-state/use-debounced-state.mjs.map +1 -1
- package/esm/use-pagination/use-pagination.mjs +1 -1
- package/esm/use-pagination/use-pagination.mjs.map +1 -1
- package/esm/use-scroll-into-view/use-scroll-into-view.mjs +1 -0
- package/esm/use-scroll-into-view/use-scroll-into-view.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -29,7 +29,8 @@ function useDebouncedCallback(callback, options) {
|
|
|
29
29
|
}
|
|
30
30
|
function startMaxWaitTimer() {
|
|
31
31
|
if (maxWait !== void 0 && maxWaitTimerRef.current === 0) maxWaitTimerRef.current = window.setTimeout(() => {
|
|
32
|
-
|
|
32
|
+
maxWaitTimerRef.current = 0;
|
|
33
|
+
if (debounceTimerRef.current !== 0 && currentCallback._hasPendingCallback) {
|
|
33
34
|
const latestArgs = latestArgsRef.current;
|
|
34
35
|
clearTimeoutAndLeadingRef();
|
|
35
36
|
handleCallback(...latestArgs);
|
|
@@ -42,10 +43,7 @@ function useDebouncedCallback(callback, options) {
|
|
|
42
43
|
clearTimeoutAndLeadingRef();
|
|
43
44
|
};
|
|
44
45
|
const flush = () => {
|
|
45
|
-
if (debounceTimerRef.current !== 0)
|
|
46
|
-
clearTimeoutAndLeadingRef();
|
|
47
|
-
handleCallback(...args);
|
|
48
|
-
}
|
|
46
|
+
if (debounceTimerRef.current !== 0) clearTimeoutAndLeadingRef();
|
|
49
47
|
};
|
|
50
48
|
const cancel = () => {
|
|
51
49
|
clearTimeoutAndLeadingRef();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounced-callback.cjs","names":["useCallbackRef","useRef","useMemo"],"sources":["../../src/use-debounced-callback/use-debounced-callback.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { useCallbackRef } from '../utils';\n\nexport interface UseDebouncedCallbackOptions {\n delay: number;\n flushOnUnmount?: boolean;\n leading?: boolean;\n maxWait?: number;\n}\n\nexport type UseDebouncedCallbackReturnValue<T extends (...args: any[]) => any> = ((\n ...args: Parameters<T>\n) => void) & { flush: () => void; cancel: () => void; isPending: () => boolean };\n\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n options: number | UseDebouncedCallbackOptions\n) {\n const { delay, flushOnUnmount, leading, maxWait } =\n typeof options === 'number'\n ? {\n delay: options,\n flushOnUnmount: false,\n leading: false,\n maxWait: undefined as number | undefined,\n }\n : options;\n\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = useRef(0);\n const maxWaitTimerRef = useRef(0);\n const latestArgsRef = useRef<Parameters<T> | null>(null);\n\n const lastCallback = useMemo(() => {\n const currentCallback = Object.assign(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current);\n latestArgsRef.current = args;\n\n const isFirstCall = currentCallback._isFirstCall;\n currentCallback._isFirstCall = false;\n\n function clearTimeoutAndLeadingRef() {\n window.clearTimeout(debounceTimerRef.current);\n window.clearTimeout(maxWaitTimerRef.current);\n debounceTimerRef.current = 0;\n maxWaitTimerRef.current = 0;\n currentCallback._isFirstCall = true;\n currentCallback._hasPendingCallback = false;\n }\n\n function startMaxWaitTimer() {\n if (maxWait !== undefined && maxWaitTimerRef.current === 0) {\n maxWaitTimerRef.current = window.setTimeout(() => {\n if (debounceTimerRef.current !== 0) {\n const latestArgs = latestArgsRef.current!;\n clearTimeoutAndLeadingRef();\n handleCallback(...latestArgs);\n }\n }, maxWait);\n }\n }\n\n if (leading && isFirstCall) {\n handleCallback(...args);\n\n const resetLeadingState = () => {\n clearTimeoutAndLeadingRef();\n };\n\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n
|
|
1
|
+
{"version":3,"file":"use-debounced-callback.cjs","names":["useCallbackRef","useRef","useMemo"],"sources":["../../src/use-debounced-callback/use-debounced-callback.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { useCallbackRef } from '../utils';\n\nexport interface UseDebouncedCallbackOptions {\n delay: number;\n flushOnUnmount?: boolean;\n leading?: boolean;\n maxWait?: number;\n}\n\nexport type UseDebouncedCallbackReturnValue<T extends (...args: any[]) => any> = ((\n ...args: Parameters<T>\n) => void) & { flush: () => void; cancel: () => void; isPending: () => boolean };\n\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n options: number | UseDebouncedCallbackOptions\n) {\n const { delay, flushOnUnmount, leading, maxWait } =\n typeof options === 'number'\n ? {\n delay: options,\n flushOnUnmount: false,\n leading: false,\n maxWait: undefined as number | undefined,\n }\n : options;\n\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = useRef(0);\n const maxWaitTimerRef = useRef(0);\n const latestArgsRef = useRef<Parameters<T> | null>(null);\n\n const lastCallback = useMemo(() => {\n const currentCallback = Object.assign(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current);\n latestArgsRef.current = args;\n\n const isFirstCall = currentCallback._isFirstCall;\n currentCallback._isFirstCall = false;\n\n function clearTimeoutAndLeadingRef() {\n window.clearTimeout(debounceTimerRef.current);\n window.clearTimeout(maxWaitTimerRef.current);\n debounceTimerRef.current = 0;\n maxWaitTimerRef.current = 0;\n currentCallback._isFirstCall = true;\n currentCallback._hasPendingCallback = false;\n }\n\n function startMaxWaitTimer() {\n if (maxWait !== undefined && maxWaitTimerRef.current === 0) {\n maxWaitTimerRef.current = window.setTimeout(() => {\n maxWaitTimerRef.current = 0;\n if (debounceTimerRef.current !== 0 && currentCallback._hasPendingCallback) {\n const latestArgs = latestArgsRef.current!;\n clearTimeoutAndLeadingRef();\n handleCallback(...latestArgs);\n }\n }, maxWait);\n }\n }\n\n if (leading && isFirstCall) {\n handleCallback(...args);\n\n const resetLeadingState = () => {\n clearTimeoutAndLeadingRef();\n };\n\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n }\n };\n\n const cancel = () => {\n clearTimeoutAndLeadingRef();\n };\n\n currentCallback.flush = flush;\n currentCallback.cancel = cancel;\n debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);\n startMaxWaitTimer();\n return;\n }\n\n if (leading && !isFirstCall) {\n currentCallback._hasPendingCallback = true;\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n handleCallback(...args);\n }\n };\n\n const cancel = () => {\n clearTimeoutAndLeadingRef();\n };\n\n currentCallback.flush = flush;\n currentCallback.cancel = cancel;\n\n const resetLeadingState = () => {\n clearTimeoutAndLeadingRef();\n };\n debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);\n startMaxWaitTimer();\n return;\n }\n\n currentCallback._hasPendingCallback = true;\n\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n handleCallback(...args);\n }\n };\n\n const cancel = () => {\n clearTimeoutAndLeadingRef();\n };\n\n currentCallback.flush = flush;\n currentCallback.cancel = cancel;\n debounceTimerRef.current = window.setTimeout(flush, delay);\n startMaxWaitTimer();\n },\n {\n flush: () => {},\n cancel: () => {},\n isPending: () => currentCallback._hasPendingCallback,\n _isFirstCall: true,\n _hasPendingCallback: false,\n }\n );\n return currentCallback;\n }, [handleCallback, delay, leading, maxWait]);\n\n useEffect(\n () => () => {\n if (flushOnUnmount) {\n lastCallback.flush();\n } else {\n lastCallback.cancel();\n }\n },\n [lastCallback, flushOnUnmount]\n );\n\n return lastCallback;\n}\n\nexport namespace useDebouncedCallback {\n export type Options = UseDebouncedCallbackOptions;\n export type ReturnValue<T extends (...args: any[]) => any> = UseDebouncedCallbackReturnValue<T>;\n}\n"],"mappings":";;;;AAcA,SAAgB,qBACd,UACA,SACA;CACA,MAAM,EAAE,OAAO,gBAAgB,SAAS,YACtC,OAAO,YAAY,WACf;EACE,OAAO;EACP,gBAAgB;EAChB,SAAS;EACT,SAAS,KAAA;CACX,IACA;CAEN,MAAM,iBAAiBA,yBAAAA,eAAe,QAAQ;CAC9C,MAAM,oBAAA,GAAmBC,MAAAA,OAAAA,CAAO,CAAC;CACjC,MAAM,mBAAA,GAAkBA,MAAAA,OAAAA,CAAO,CAAC;CAChC,MAAM,iBAAA,GAAgBA,MAAAA,OAAAA,CAA6B,IAAI;CAEvD,MAAM,gBAAA,GAAeC,MAAAA,QAAAA,OAAc;EACjC,MAAM,kBAAkB,OAAO,QAC5B,GAAG,SAAwB;GAC1B,OAAO,aAAa,iBAAiB,OAAO;GAC5C,cAAc,UAAU;GAExB,MAAM,cAAc,gBAAgB;GACpC,gBAAgB,eAAe;GAE/B,SAAS,4BAA4B;IACnC,OAAO,aAAa,iBAAiB,OAAO;IAC5C,OAAO,aAAa,gBAAgB,OAAO;IAC3C,iBAAiB,UAAU;IAC3B,gBAAgB,UAAU;IAC1B,gBAAgB,eAAe;IAC/B,gBAAgB,sBAAsB;GACxC;GAEA,SAAS,oBAAoB;IAC3B,IAAI,YAAY,KAAA,KAAa,gBAAgB,YAAY,GACvD,gBAAgB,UAAU,OAAO,iBAAiB;KAChD,gBAAgB,UAAU;KAC1B,IAAI,iBAAiB,YAAY,KAAK,gBAAgB,qBAAqB;MACzE,MAAM,aAAa,cAAc;MACjC,0BAA0B;MAC1B,eAAe,GAAG,UAAU;KAC9B;IACF,GAAG,OAAO;GAEd;GAEA,IAAI,WAAW,aAAa;IAC1B,eAAe,GAAG,IAAI;IAEtB,MAAM,0BAA0B;KAC9B,0BAA0B;IAC5B;IAEA,MAAM,cAAc;KAClB,IAAI,iBAAiB,YAAY,GAC/B,0BAA0B;IAE9B;IAEA,MAAM,eAAe;KACnB,0BAA0B;IAC5B;IAEA,gBAAgB,QAAQ;IACxB,gBAAgB,SAAS;IACzB,iBAAiB,UAAU,OAAO,WAAW,mBAAmB,KAAK;IACrE,kBAAkB;IAClB;GACF;GAEA,IAAI,WAAW,CAAC,aAAa;IAC3B,gBAAgB,sBAAsB;IACtC,MAAM,cAAc;KAClB,IAAI,iBAAiB,YAAY,GAAG;MAClC,0BAA0B;MAC1B,eAAe,GAAG,IAAI;KACxB;IACF;IAEA,MAAM,eAAe;KACnB,0BAA0B;IAC5B;IAEA,gBAAgB,QAAQ;IACxB,gBAAgB,SAAS;IAEzB,MAAM,0BAA0B;KAC9B,0BAA0B;IAC5B;IACA,iBAAiB,UAAU,OAAO,WAAW,mBAAmB,KAAK;IACrE,kBAAkB;IAClB;GACF;GAEA,gBAAgB,sBAAsB;GAEtC,MAAM,cAAc;IAClB,IAAI,iBAAiB,YAAY,GAAG;KAClC,0BAA0B;KAC1B,eAAe,GAAG,IAAI;IACxB;GACF;GAEA,MAAM,eAAe;IACnB,0BAA0B;GAC5B;GAEA,gBAAgB,QAAQ;GACxB,gBAAgB,SAAS;GACzB,iBAAiB,UAAU,OAAO,WAAW,OAAO,KAAK;GACzD,kBAAkB;EACpB,GACA;GACE,aAAa,CAAC;GACd,cAAc,CAAC;GACf,iBAAiB,gBAAgB;GACjC,cAAc;GACd,qBAAqB;EACvB,CACF;EACA,OAAO;CACT,GAAG;EAAC;EAAgB;EAAO;EAAS;CAAO,CAAC;CAE5C,CAAA,GAAA,MAAA,UAAA,aACc;EACV,IAAI,gBACF,aAAa,MAAM;OAEnB,aAAa,OAAO;CAExB,GACA,CAAC,cAAc,cAAc,CAC/B;CAEA,OAAO;AACT"}
|
|
@@ -9,8 +9,12 @@ function useDebouncedState(defaultValue, wait, options = { leading: false }) {
|
|
|
9
9
|
(0, react.useEffect)(() => clearTimeout, []);
|
|
10
10
|
return [value, (0, react.useCallback)((newValue) => {
|
|
11
11
|
clearTimeout();
|
|
12
|
-
if (leadingRef.current && options.leading)
|
|
13
|
-
|
|
12
|
+
if (leadingRef.current && options.leading) {
|
|
13
|
+
setValue(newValue);
|
|
14
|
+
timeoutRef.current = window.setTimeout(() => {
|
|
15
|
+
leadingRef.current = true;
|
|
16
|
+
}, wait);
|
|
17
|
+
} else timeoutRef.current = window.setTimeout(() => {
|
|
14
18
|
leadingRef.current = true;
|
|
15
19
|
setValue(newValue);
|
|
16
20
|
}, wait);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounced-state.cjs","names":["useState","useRef","useCallback"],"sources":["../../src/use-debounced-state/use-debounced-state.ts"],"sourcesContent":["import { SetStateAction, useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseDebouncedStateOptions {\n leading?: boolean;\n}\n\nexport type UseDebouncedStateReturnValue<T> = [T, (newValue: SetStateAction<T>) => void];\n\nexport function useDebouncedState<T = any>(\n defaultValue: T,\n wait: number,\n options: UseDebouncedStateOptions = { leading: false }\n): UseDebouncedStateReturnValue<T> {\n const [value, setValue] = useState(defaultValue);\n const timeoutRef = useRef<number | null>(null);\n const leadingRef = useRef(true);\n\n const clearTimeout = () => window.clearTimeout(timeoutRef.current!);\n useEffect(() => clearTimeout, []);\n\n const debouncedSetValue = useCallback(\n (newValue: SetStateAction<T>) => {\n clearTimeout();\n if (leadingRef.current && options.leading) {\n setValue(newValue);\n } else {\n timeoutRef.current = window.setTimeout(() => {\n leadingRef.current = true;\n setValue(newValue);\n }, wait);\n }\n leadingRef.current = false;\n },\n [options.leading, wait]\n );\n\n return [value, debouncedSetValue] as const;\n}\n\nexport namespace useDebouncedState {\n export type Options = UseDebouncedStateOptions;\n export type ReturnValue<T> = UseDebouncedStateReturnValue<T>;\n}\n"],"mappings":";;;AAQA,SAAgB,kBACd,cACA,MACA,UAAoC,EAAE,SAAS,MAAM,GACpB;CACjC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,YAAY;CAC/C,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAAsB,IAAI;CAC7C,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAO,IAAI;CAE9B,MAAM,qBAAqB,OAAO,aAAa,WAAW,OAAQ;CAClE,CAAA,GAAA,MAAA,UAAA,OAAgB,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"use-debounced-state.cjs","names":["useState","useRef","useCallback"],"sources":["../../src/use-debounced-state/use-debounced-state.ts"],"sourcesContent":["import { SetStateAction, useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseDebouncedStateOptions {\n leading?: boolean;\n}\n\nexport type UseDebouncedStateReturnValue<T> = [T, (newValue: SetStateAction<T>) => void];\n\nexport function useDebouncedState<T = any>(\n defaultValue: T,\n wait: number,\n options: UseDebouncedStateOptions = { leading: false }\n): UseDebouncedStateReturnValue<T> {\n const [value, setValue] = useState(defaultValue);\n const timeoutRef = useRef<number | null>(null);\n const leadingRef = useRef(true);\n\n const clearTimeout = () => window.clearTimeout(timeoutRef.current!);\n useEffect(() => clearTimeout, []);\n\n const debouncedSetValue = useCallback(\n (newValue: SetStateAction<T>) => {\n clearTimeout();\n if (leadingRef.current && options.leading) {\n setValue(newValue);\n timeoutRef.current = window.setTimeout(() => {\n leadingRef.current = true;\n }, wait);\n } else {\n timeoutRef.current = window.setTimeout(() => {\n leadingRef.current = true;\n setValue(newValue);\n }, wait);\n }\n leadingRef.current = false;\n },\n [options.leading, wait]\n );\n\n return [value, debouncedSetValue] as const;\n}\n\nexport namespace useDebouncedState {\n export type Options = UseDebouncedStateOptions;\n export type ReturnValue<T> = UseDebouncedStateReturnValue<T>;\n}\n"],"mappings":";;;AAQA,SAAgB,kBACd,cACA,MACA,UAAoC,EAAE,SAAS,MAAM,GACpB;CACjC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,YAAY;CAC/C,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAAsB,IAAI;CAC7C,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAO,IAAI;CAE9B,MAAM,qBAAqB,OAAO,aAAa,WAAW,OAAQ;CAClE,CAAA,GAAA,MAAA,UAAA,OAAgB,cAAc,CAAC,CAAC;CAqBhC,OAAO,CAAC,QAAA,GAnBkBC,MAAAA,YAAAA,EACvB,aAAgC;EAC/B,aAAa;EACb,IAAI,WAAW,WAAW,QAAQ,SAAS;GACzC,SAAS,QAAQ;GACjB,WAAW,UAAU,OAAO,iBAAiB;IAC3C,WAAW,UAAU;GACvB,GAAG,IAAI;EACT,OACE,WAAW,UAAU,OAAO,iBAAiB;GAC3C,WAAW,UAAU;GACrB,SAAS,QAAQ;EACnB,GAAG,IAAI;EAET,WAAW,UAAU;CACvB,GACA,CAAC,QAAQ,SAAS,IAAI,CAGO,CAAC;AAClC"}
|
|
@@ -37,7 +37,7 @@ function usePagination({ total, siblings = 1, boundaries = 1, page, initialPage,
|
|
|
37
37
|
const leftSiblingIndex = Math.max(activePage - siblings, _startValue + boundaries - 1);
|
|
38
38
|
const rightSiblingIndex = Math.min(activePage + siblings, _endValue - boundaries);
|
|
39
39
|
const shouldShowLeftDots = leftSiblingIndex > _startValue + boundaries + 1;
|
|
40
|
-
const shouldShowRightDots = rightSiblingIndex < _endValue - boundaries;
|
|
40
|
+
const shouldShowRightDots = rightSiblingIndex < _endValue - (boundaries + 1);
|
|
41
41
|
if (!shouldShowLeftDots && shouldShowRightDots) {
|
|
42
42
|
const leftItemCount = siblings * 2 + boundaries + 2;
|
|
43
43
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-pagination.cjs","names":["useUncontrolled","useCallback","useMemo"],"sources":["../../src/use-pagination/use-pagination.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useUncontrolled } from '../use-uncontrolled/use-uncontrolled';\n\nfunction range(start: number, end: number) {\n const length = end - start + 1;\n return Array.from({ length }, (_, index) => index + start);\n}\n\nexport const DOTS = 'dots';\n\nexport interface UsePaginationOptions {\n /** Page selected on initial render, defaults to 1 or startValue if provided */\n initialPage?: number;\n\n /** Controlled active page number */\n page?: number;\n\n /** Total amount of pages */\n total: number;\n\n /** Siblings amount on left/right side of selected page, defaults to 1 */\n siblings?: number;\n\n /** Amount of elements visible on left/right edges, defaults to 1 */\n boundaries?: number;\n\n /** Callback fired after change of each page */\n onChange?: (page: number) => void;\n\n /** Starting page number, defaults to 1 */\n startValue?: number;\n}\n\nexport interface UsePaginationReturnValue {\n /** Array of page numbers and dots */\n range: (number | 'dots')[];\n\n /** Active page number */\n active: number;\n\n /** Function to set active page */\n setPage: (page: number) => void;\n\n /** Function to go to next page */\n next: () => void;\n\n /** Function to go to previous page */\n previous: () => void;\n\n /** Function to go to first page */\n first: () => void;\n\n /** Function to go to last page */\n last: () => void;\n}\n\nexport function usePagination({\n total,\n siblings = 1,\n boundaries = 1,\n page,\n initialPage,\n onChange,\n startValue = 1,\n}: UsePaginationOptions): UsePaginationReturnValue {\n const _startValue = Math.max(Math.trunc(startValue), 1);\n const _endValue = Math.max(Math.trunc(total), _startValue);\n const _total = _endValue - _startValue + 1;\n const _initialPage = initialPage ?? _startValue;\n\n const [activePage, setActivePage] = useUncontrolled({\n value: page,\n onChange,\n defaultValue: _initialPage,\n finalValue: _initialPage,\n });\n\n const setPage = useCallback(\n (pageNumber: number) => {\n if (pageNumber < _startValue) {\n setActivePage(_startValue);\n } else if (pageNumber > _endValue) {\n setActivePage(_endValue);\n } else {\n setActivePage(pageNumber);\n }\n },\n [_startValue, _endValue, setActivePage]\n );\n\n const next = useCallback(() => setPage(activePage + 1), [activePage, setPage]);\n const previous = useCallback(() => setPage(activePage - 1), [activePage, setPage]);\n const first = useCallback(() => setPage(_startValue), [setPage, _startValue]);\n const last = useCallback(() => setPage(_endValue), [_endValue, setPage]);\n\n const paginationRange = useMemo((): (number | 'dots')[] => {\n const totalPageNumbers = siblings * 2 + 3 + boundaries * 2;\n if (totalPageNumbers >= _total) {\n return range(_startValue, _endValue);\n }\n\n const leftSiblingIndex = Math.max(activePage - siblings, _startValue + boundaries - 1);\n const rightSiblingIndex = Math.min(activePage + siblings, _endValue - boundaries);\n\n const shouldShowLeftDots = leftSiblingIndex > _startValue + boundaries + 1;\n const shouldShowRightDots = rightSiblingIndex < _endValue - boundaries;\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = siblings * 2 + boundaries + 2;\n return [\n ...range(_startValue, _startValue + leftItemCount - 1),\n DOTS,\n ...range(_endValue - (boundaries - 1), _endValue),\n ];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = boundaries + 1 + 2 * siblings;\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(_endValue - rightItemCount, _endValue),\n ];\n }\n\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(leftSiblingIndex, rightSiblingIndex),\n DOTS,\n ...range(_endValue - boundaries + 1, _endValue),\n ];\n }, [_total, siblings, activePage, _startValue, _endValue, boundaries]);\n\n return {\n range: paginationRange,\n active: activePage,\n setPage,\n next,\n previous,\n first,\n last,\n };\n}\n\nexport namespace usePagination {\n export type Options = UsePaginationOptions;\n export type ReturnValue = UsePaginationReturnValue;\n}\n"],"mappings":";;;;AAGA,SAAS,MAAM,OAAe,KAAa;CACzC,MAAM,SAAS,MAAM,QAAQ;CAC7B,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI,GAAG,UAAU,QAAQ,KAAK;AAC3D;AAEA,MAAa,OAAO;AAgDpB,SAAgB,cAAc,EAC5B,OACA,WAAW,GACX,aAAa,GACb,MACA,aACA,UACA,aAAa,KACoC;CACjD,MAAM,cAAc,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC;CACtD,MAAM,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,WAAW;CACzD,MAAM,SAAS,YAAY,cAAc;CACzC,MAAM,eAAe,eAAe;CAEpC,MAAM,CAAC,YAAY,iBAAiBA,yBAAAA,gBAAgB;EAClD,OAAO;EACP;EACA,cAAc;EACd,YAAY;CACd,CAAC;CAED,MAAM,WAAA,GAAUC,MAAAA,YAAAA,EACb,eAAuB;EACtB,IAAI,aAAa,aACf,cAAc,WAAW;OACpB,IAAI,aAAa,WACtB,cAAc,SAAS;OAEvB,cAAc,UAAU;CAE5B,GACA;EAAC;EAAa;EAAW;CAAa,CACxC;CAEA,MAAM,QAAA,GAAOA,MAAAA,YAAAA,OAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CAC7E,MAAM,YAAA,GAAWA,MAAAA,YAAAA,OAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CACjF,MAAM,SAAA,GAAQA,MAAAA,YAAAA,OAAkB,QAAQ,WAAW,GAAG,CAAC,SAAS,WAAW,CAAC;CAC5E,MAAM,QAAA,GAAOA,MAAAA,YAAAA,OAAkB,QAAQ,SAAS,GAAG,CAAC,WAAW,OAAO,CAAC;CAyCvE,OAAO;EACL,QAAA,GAxCsBC,MAAAA,QAAAA,OAAmC;GAEzD,IADyB,WAAW,IAAI,IAAI,aAAa,KACjC,QACtB,OAAO,MAAM,aAAa,SAAS;GAGrC,MAAM,mBAAmB,KAAK,IAAI,aAAa,UAAU,cAAc,aAAa,CAAC;GACrF,MAAM,oBAAoB,KAAK,IAAI,aAAa,UAAU,YAAY,UAAU;GAEhF,MAAM,qBAAqB,mBAAmB,cAAc,aAAa;GACzE,MAAM,sBAAsB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"use-pagination.cjs","names":["useUncontrolled","useCallback","useMemo"],"sources":["../../src/use-pagination/use-pagination.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useUncontrolled } from '../use-uncontrolled/use-uncontrolled';\n\nfunction range(start: number, end: number) {\n const length = end - start + 1;\n return Array.from({ length }, (_, index) => index + start);\n}\n\nexport const DOTS = 'dots';\n\nexport interface UsePaginationOptions {\n /** Page selected on initial render, defaults to 1 or startValue if provided */\n initialPage?: number;\n\n /** Controlled active page number */\n page?: number;\n\n /** Total amount of pages */\n total: number;\n\n /** Siblings amount on left/right side of selected page, defaults to 1 */\n siblings?: number;\n\n /** Amount of elements visible on left/right edges, defaults to 1 */\n boundaries?: number;\n\n /** Callback fired after change of each page */\n onChange?: (page: number) => void;\n\n /** Starting page number, defaults to 1 */\n startValue?: number;\n}\n\nexport interface UsePaginationReturnValue {\n /** Array of page numbers and dots */\n range: (number | 'dots')[];\n\n /** Active page number */\n active: number;\n\n /** Function to set active page */\n setPage: (page: number) => void;\n\n /** Function to go to next page */\n next: () => void;\n\n /** Function to go to previous page */\n previous: () => void;\n\n /** Function to go to first page */\n first: () => void;\n\n /** Function to go to last page */\n last: () => void;\n}\n\nexport function usePagination({\n total,\n siblings = 1,\n boundaries = 1,\n page,\n initialPage,\n onChange,\n startValue = 1,\n}: UsePaginationOptions): UsePaginationReturnValue {\n const _startValue = Math.max(Math.trunc(startValue), 1);\n const _endValue = Math.max(Math.trunc(total), _startValue);\n const _total = _endValue - _startValue + 1;\n const _initialPage = initialPage ?? _startValue;\n\n const [activePage, setActivePage] = useUncontrolled({\n value: page,\n onChange,\n defaultValue: _initialPage,\n finalValue: _initialPage,\n });\n\n const setPage = useCallback(\n (pageNumber: number) => {\n if (pageNumber < _startValue) {\n setActivePage(_startValue);\n } else if (pageNumber > _endValue) {\n setActivePage(_endValue);\n } else {\n setActivePage(pageNumber);\n }\n },\n [_startValue, _endValue, setActivePage]\n );\n\n const next = useCallback(() => setPage(activePage + 1), [activePage, setPage]);\n const previous = useCallback(() => setPage(activePage - 1), [activePage, setPage]);\n const first = useCallback(() => setPage(_startValue), [setPage, _startValue]);\n const last = useCallback(() => setPage(_endValue), [_endValue, setPage]);\n\n const paginationRange = useMemo((): (number | 'dots')[] => {\n const totalPageNumbers = siblings * 2 + 3 + boundaries * 2;\n if (totalPageNumbers >= _total) {\n return range(_startValue, _endValue);\n }\n\n const leftSiblingIndex = Math.max(activePage - siblings, _startValue + boundaries - 1);\n const rightSiblingIndex = Math.min(activePage + siblings, _endValue - boundaries);\n\n const shouldShowLeftDots = leftSiblingIndex > _startValue + boundaries + 1;\n const shouldShowRightDots = rightSiblingIndex < _endValue - (boundaries + 1);\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = siblings * 2 + boundaries + 2;\n return [\n ...range(_startValue, _startValue + leftItemCount - 1),\n DOTS,\n ...range(_endValue - (boundaries - 1), _endValue),\n ];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = boundaries + 1 + 2 * siblings;\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(_endValue - rightItemCount, _endValue),\n ];\n }\n\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(leftSiblingIndex, rightSiblingIndex),\n DOTS,\n ...range(_endValue - boundaries + 1, _endValue),\n ];\n }, [_total, siblings, activePage, _startValue, _endValue, boundaries]);\n\n return {\n range: paginationRange,\n active: activePage,\n setPage,\n next,\n previous,\n first,\n last,\n };\n}\n\nexport namespace usePagination {\n export type Options = UsePaginationOptions;\n export type ReturnValue = UsePaginationReturnValue;\n}\n"],"mappings":";;;;AAGA,SAAS,MAAM,OAAe,KAAa;CACzC,MAAM,SAAS,MAAM,QAAQ;CAC7B,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI,GAAG,UAAU,QAAQ,KAAK;AAC3D;AAEA,MAAa,OAAO;AAgDpB,SAAgB,cAAc,EAC5B,OACA,WAAW,GACX,aAAa,GACb,MACA,aACA,UACA,aAAa,KACoC;CACjD,MAAM,cAAc,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC;CACtD,MAAM,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,WAAW;CACzD,MAAM,SAAS,YAAY,cAAc;CACzC,MAAM,eAAe,eAAe;CAEpC,MAAM,CAAC,YAAY,iBAAiBA,yBAAAA,gBAAgB;EAClD,OAAO;EACP;EACA,cAAc;EACd,YAAY;CACd,CAAC;CAED,MAAM,WAAA,GAAUC,MAAAA,YAAAA,EACb,eAAuB;EACtB,IAAI,aAAa,aACf,cAAc,WAAW;OACpB,IAAI,aAAa,WACtB,cAAc,SAAS;OAEvB,cAAc,UAAU;CAE5B,GACA;EAAC;EAAa;EAAW;CAAa,CACxC;CAEA,MAAM,QAAA,GAAOA,MAAAA,YAAAA,OAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CAC7E,MAAM,YAAA,GAAWA,MAAAA,YAAAA,OAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CACjF,MAAM,SAAA,GAAQA,MAAAA,YAAAA,OAAkB,QAAQ,WAAW,GAAG,CAAC,SAAS,WAAW,CAAC;CAC5E,MAAM,QAAA,GAAOA,MAAAA,YAAAA,OAAkB,QAAQ,SAAS,GAAG,CAAC,WAAW,OAAO,CAAC;CAyCvE,OAAO;EACL,QAAA,GAxCsBC,MAAAA,QAAAA,OAAmC;GAEzD,IADyB,WAAW,IAAI,IAAI,aAAa,KACjC,QACtB,OAAO,MAAM,aAAa,SAAS;GAGrC,MAAM,mBAAmB,KAAK,IAAI,aAAa,UAAU,cAAc,aAAa,CAAC;GACrF,MAAM,oBAAoB,KAAK,IAAI,aAAa,UAAU,YAAY,UAAU;GAEhF,MAAM,qBAAqB,mBAAmB,cAAc,aAAa;GACzE,MAAM,sBAAsB,oBAAoB,aAAa,aAAa;GAE1E,IAAI,CAAC,sBAAsB,qBAAqB;IAC9C,MAAM,gBAAgB,WAAW,IAAI,aAAa;IAClD,OAAO;KACL,GAAG,MAAM,aAAa,cAAc,gBAAgB,CAAC;KACrD;KACA,GAAG,MAAM,aAAa,aAAa,IAAI,SAAS;IAClD;GACF;GAEA,IAAI,sBAAsB,CAAC,qBAAqB;IAC9C,MAAM,iBAAiB,aAAa,IAAI,IAAI;IAC5C,OAAO;KACL,GAAG,MAAM,aAAa,cAAc,aAAa,CAAC;KAClD;KACA,GAAG,MAAM,YAAY,gBAAgB,SAAS;IAChD;GACF;GAEA,OAAO;IACL,GAAG,MAAM,aAAa,cAAc,aAAa,CAAC;IAClD;IACA,GAAG,MAAM,kBAAkB,iBAAiB;IAC5C;IACA,GAAG,MAAM,YAAY,aAAa,GAAG,SAAS;GAChD;EACF,GAAG;GAAC;GAAQ;GAAU;GAAY;GAAa;GAAW;EAAU,CAG7C;EACrB,QAAQ;EACR;EACA;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-scroll-into-view.cjs","names":["useRef","useState","useReducedMotion","useCallback"],"sources":["../../src/use-scroll-into-view/use-scroll-into-view.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useReducedMotion } from '../use-reduced-motion/use-reduced-motion';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\ninterface UseScrollIntoViewAnimation {\n /** Target element alignment relatively to parent based on current axis */\n alignment?: 'start' | 'end' | 'center';\n}\n\nexport interface UseScrollIntoViewOptions {\n /** Callback fired after scroll */\n onScrollFinish?: () => void;\n\n /** Callback fired when scroll animation is canceled by user interaction */\n onScrollCancel?: () => void;\n\n /** Duration of scroll in milliseconds */\n duration?: number;\n\n /** Axis of scroll */\n axis?: 'x' | 'y';\n\n /** Custom mathematical easing function */\n easing?: (t: number) => number;\n\n /** Additional distance between nearest edge and element */\n offset?: number;\n\n /** Indicator if animation may be interrupted by user scrolling */\n cancelable?: boolean;\n\n /** Prevents content jumping in scrolling lists with multiple targets */\n isList?: boolean;\n}\n\nexport interface UseScrollIntoViewReturnValue<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n> {\n scrollableRef: React.RefObject<Parent | null>;\n targetRef: React.RefObject<Target | null>;\n scrollIntoView: (params?: UseScrollIntoViewAnimation) => void;\n cancel: () => void;\n scrolling: boolean;\n}\n\nexport function useScrollIntoView<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n>({\n duration = 1250,\n axis = 'y',\n onScrollFinish,\n onScrollCancel,\n easing,\n offset = 0,\n cancelable = true,\n isList = false,\n}: UseScrollIntoViewOptions = {}): UseScrollIntoViewReturnValue<Target, Parent> {\n const frameID = useRef(0);\n const startTime = useRef(0);\n const shouldStop = useRef(false);\n const [scrolling, setScrolling] = useState(false);\n\n const scrollableRef = useRef<Parent | null>(null);\n const targetRef = useRef<Target | null>(null);\n\n const reducedMotion = useReducedMotion();\n\n const _easing = easing ?? easeInOutQuad;\n\n const cancel = (): void => {\n if (frameID.current) {\n cancelAnimationFrame(frameID.current);\n frameID.current = 0;\n setScrolling(false);\n }\n };\n\n const scrollIntoView = useCallback(\n ({ alignment = 'start' }: UseScrollIntoViewAnimation = {}) => {\n shouldStop.current = false;\n\n if (frameID.current) {\n cancel();\n }\n\n const start = getScrollStart({ parent: scrollableRef.current, axis }) ?? 0;\n\n const change =\n getRelativePosition({\n parent: scrollableRef.current,\n target: targetRef.current,\n axis,\n alignment,\n offset,\n isList,\n }) - (scrollableRef.current ? 0 : start);\n\n setScrolling(true);\n\n function animateScroll() {\n if (startTime.current === 0) {\n startTime.current = performance.now();\n }\n\n const now = performance.now();\n const elapsed = now - startTime.current;\n\n // Easing timing progress\n const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;\n\n const distance = start + change * _easing(t);\n\n setScrollParam({\n parent: scrollableRef.current,\n axis,\n distance,\n });\n\n if (!shouldStop.current && t < 1) {\n frameID.current = requestAnimationFrame(animateScroll);\n } else {\n if (shouldStop.current) {\n typeof onScrollCancel === 'function' && onScrollCancel();\n } else {\n typeof onScrollFinish === 'function' && onScrollFinish();\n }\n startTime.current = 0;\n frameID.current = 0;\n setScrolling(false);\n cancel();\n }\n }\n animateScroll();\n },\n [axis, duration, _easing, isList, offset, onScrollFinish, onScrollCancel, reducedMotion]\n );\n\n const handleStop = () => {\n if (cancelable) {\n shouldStop.current = true;\n }\n };\n\n /**\n * Detection of one of these events stops scroll animation\n * wheel - mouse wheel / touch pad\n * touchmove - any touchable device\n */\n\n useWindowEvent('wheel', handleStop, {\n passive: true,\n });\n\n useWindowEvent('touchmove', handleStop, {\n passive: true,\n });\n\n // Cleanup requestAnimationFrame\n useEffect(() => cancel, []);\n\n return {\n scrollableRef,\n targetRef,\n scrollIntoView,\n cancel,\n scrolling,\n };\n}\n\n// ---------------------------------------------------\n// Helpers\n// ---------------------------------------------------\n\nfunction easeInOutQuad(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\nfunction getRelativePosition({ axis, target, parent, alignment, offset, isList }: any): number {\n if (!target || (!parent && typeof document === 'undefined')) {\n return 0;\n }\n const isCustomParent = !!parent;\n const parentElement = parent || document.body;\n const parentPosition = parentElement.getBoundingClientRect();\n const targetPosition = target.getBoundingClientRect();\n\n const getDiff = (property: 'top' | 'left'): number =>\n targetPosition[property] - parentPosition[property];\n\n if (axis === 'y') {\n const diff = getDiff('top');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentHeight = isCustomParent ? parentPosition.height : window.innerHeight;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentHeight + targetPosition.height;\n const shouldScroll = distance >= -targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentHeight / 2 + targetPosition.height / 2;\n }\n\n return 0;\n }\n\n if (axis === 'x') {\n const diff = getDiff('left');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentWidth = isCustomParent ? parentPosition.width : window.innerWidth;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentWidth + targetPosition.width;\n const shouldScroll = distance >= -targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentWidth / 2 + targetPosition.width / 2;\n }\n\n return 0;\n }\n\n return 0;\n}\n\nfunction getScrollStart({ axis, parent }: any) {\n if (!parent && typeof document === 'undefined') {\n return 0;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n return parent[method];\n }\n\n const { body, documentElement } = document;\n\n // While one of it has a value the second is equal 0\n return body[method] + documentElement[method];\n}\n\nfunction setScrollParam({ axis, parent, distance }: any) {\n if (!parent && typeof document === 'undefined') {\n return;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n parent[method] = distance;\n } else {\n const { body, documentElement } = document;\n body[method] = distance;\n documentElement[method] = distance;\n }\n}\n\nexport namespace useScrollIntoView {\n export type Options = UseScrollIntoViewOptions;\n export type ReturnValue<\n Target extends HTMLElement,\n Parent extends HTMLElement | null,\n > = UseScrollIntoViewReturnValue<Target, Parent>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-scroll-into-view.cjs","names":["useRef","useState","useReducedMotion","useCallback"],"sources":["../../src/use-scroll-into-view/use-scroll-into-view.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useReducedMotion } from '../use-reduced-motion/use-reduced-motion';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\ninterface UseScrollIntoViewAnimation {\n /** Target element alignment relatively to parent based on current axis */\n alignment?: 'start' | 'end' | 'center';\n}\n\nexport interface UseScrollIntoViewOptions {\n /** Callback fired after scroll */\n onScrollFinish?: () => void;\n\n /** Callback fired when scroll animation is canceled by user interaction */\n onScrollCancel?: () => void;\n\n /** Duration of scroll in milliseconds */\n duration?: number;\n\n /** Axis of scroll */\n axis?: 'x' | 'y';\n\n /** Custom mathematical easing function */\n easing?: (t: number) => number;\n\n /** Additional distance between nearest edge and element */\n offset?: number;\n\n /** Indicator if animation may be interrupted by user scrolling */\n cancelable?: boolean;\n\n /** Prevents content jumping in scrolling lists with multiple targets */\n isList?: boolean;\n}\n\nexport interface UseScrollIntoViewReturnValue<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n> {\n scrollableRef: React.RefObject<Parent | null>;\n targetRef: React.RefObject<Target | null>;\n scrollIntoView: (params?: UseScrollIntoViewAnimation) => void;\n cancel: () => void;\n scrolling: boolean;\n}\n\nexport function useScrollIntoView<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n>({\n duration = 1250,\n axis = 'y',\n onScrollFinish,\n onScrollCancel,\n easing,\n offset = 0,\n cancelable = true,\n isList = false,\n}: UseScrollIntoViewOptions = {}): UseScrollIntoViewReturnValue<Target, Parent> {\n const frameID = useRef(0);\n const startTime = useRef(0);\n const shouldStop = useRef(false);\n const [scrolling, setScrolling] = useState(false);\n\n const scrollableRef = useRef<Parent | null>(null);\n const targetRef = useRef<Target | null>(null);\n\n const reducedMotion = useReducedMotion();\n\n const _easing = easing ?? easeInOutQuad;\n\n const cancel = (): void => {\n if (frameID.current) {\n cancelAnimationFrame(frameID.current);\n frameID.current = 0;\n startTime.current = 0;\n setScrolling(false);\n }\n };\n\n const scrollIntoView = useCallback(\n ({ alignment = 'start' }: UseScrollIntoViewAnimation = {}) => {\n shouldStop.current = false;\n\n if (frameID.current) {\n cancel();\n }\n\n const start = getScrollStart({ parent: scrollableRef.current, axis }) ?? 0;\n\n const change =\n getRelativePosition({\n parent: scrollableRef.current,\n target: targetRef.current,\n axis,\n alignment,\n offset,\n isList,\n }) - (scrollableRef.current ? 0 : start);\n\n setScrolling(true);\n\n function animateScroll() {\n if (startTime.current === 0) {\n startTime.current = performance.now();\n }\n\n const now = performance.now();\n const elapsed = now - startTime.current;\n\n // Easing timing progress\n const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;\n\n const distance = start + change * _easing(t);\n\n setScrollParam({\n parent: scrollableRef.current,\n axis,\n distance,\n });\n\n if (!shouldStop.current && t < 1) {\n frameID.current = requestAnimationFrame(animateScroll);\n } else {\n if (shouldStop.current) {\n typeof onScrollCancel === 'function' && onScrollCancel();\n } else {\n typeof onScrollFinish === 'function' && onScrollFinish();\n }\n startTime.current = 0;\n frameID.current = 0;\n setScrolling(false);\n cancel();\n }\n }\n animateScroll();\n },\n [axis, duration, _easing, isList, offset, onScrollFinish, onScrollCancel, reducedMotion]\n );\n\n const handleStop = () => {\n if (cancelable) {\n shouldStop.current = true;\n }\n };\n\n /**\n * Detection of one of these events stops scroll animation\n * wheel - mouse wheel / touch pad\n * touchmove - any touchable device\n */\n\n useWindowEvent('wheel', handleStop, {\n passive: true,\n });\n\n useWindowEvent('touchmove', handleStop, {\n passive: true,\n });\n\n // Cleanup requestAnimationFrame\n useEffect(() => cancel, []);\n\n return {\n scrollableRef,\n targetRef,\n scrollIntoView,\n cancel,\n scrolling,\n };\n}\n\n// ---------------------------------------------------\n// Helpers\n// ---------------------------------------------------\n\nfunction easeInOutQuad(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\nfunction getRelativePosition({ axis, target, parent, alignment, offset, isList }: any): number {\n if (!target || (!parent && typeof document === 'undefined')) {\n return 0;\n }\n const isCustomParent = !!parent;\n const parentElement = parent || document.body;\n const parentPosition = parentElement.getBoundingClientRect();\n const targetPosition = target.getBoundingClientRect();\n\n const getDiff = (property: 'top' | 'left'): number =>\n targetPosition[property] - parentPosition[property];\n\n if (axis === 'y') {\n const diff = getDiff('top');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentHeight = isCustomParent ? parentPosition.height : window.innerHeight;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentHeight + targetPosition.height;\n const shouldScroll = distance >= -targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentHeight / 2 + targetPosition.height / 2;\n }\n\n return 0;\n }\n\n if (axis === 'x') {\n const diff = getDiff('left');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentWidth = isCustomParent ? parentPosition.width : window.innerWidth;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentWidth + targetPosition.width;\n const shouldScroll = distance >= -targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentWidth / 2 + targetPosition.width / 2;\n }\n\n return 0;\n }\n\n return 0;\n}\n\nfunction getScrollStart({ axis, parent }: any) {\n if (!parent && typeof document === 'undefined') {\n return 0;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n return parent[method];\n }\n\n const { body, documentElement } = document;\n\n // While one of it has a value the second is equal 0\n return body[method] + documentElement[method];\n}\n\nfunction setScrollParam({ axis, parent, distance }: any) {\n if (!parent && typeof document === 'undefined') {\n return;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n parent[method] = distance;\n } else {\n const { body, documentElement } = document;\n body[method] = distance;\n documentElement[method] = distance;\n }\n}\n\nexport namespace useScrollIntoView {\n export type Options = UseScrollIntoViewOptions;\n export type ReturnValue<\n Target extends HTMLElement,\n Parent extends HTMLElement | null,\n > = UseScrollIntoViewReturnValue<Target, Parent>;\n}\n"],"mappings":"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"}
|
|
@@ -29,7 +29,8 @@ function useDebouncedCallback(callback, options) {
|
|
|
29
29
|
}
|
|
30
30
|
function startMaxWaitTimer() {
|
|
31
31
|
if (maxWait !== void 0 && maxWaitTimerRef.current === 0) maxWaitTimerRef.current = window.setTimeout(() => {
|
|
32
|
-
|
|
32
|
+
maxWaitTimerRef.current = 0;
|
|
33
|
+
if (debounceTimerRef.current !== 0 && currentCallback._hasPendingCallback) {
|
|
33
34
|
const latestArgs = latestArgsRef.current;
|
|
34
35
|
clearTimeoutAndLeadingRef();
|
|
35
36
|
handleCallback(...latestArgs);
|
|
@@ -42,10 +43,7 @@ function useDebouncedCallback(callback, options) {
|
|
|
42
43
|
clearTimeoutAndLeadingRef();
|
|
43
44
|
};
|
|
44
45
|
const flush = () => {
|
|
45
|
-
if (debounceTimerRef.current !== 0)
|
|
46
|
-
clearTimeoutAndLeadingRef();
|
|
47
|
-
handleCallback(...args);
|
|
48
|
-
}
|
|
46
|
+
if (debounceTimerRef.current !== 0) clearTimeoutAndLeadingRef();
|
|
49
47
|
};
|
|
50
48
|
const cancel = () => {
|
|
51
49
|
clearTimeoutAndLeadingRef();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounced-callback.mjs","names":[],"sources":["../../src/use-debounced-callback/use-debounced-callback.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { useCallbackRef } from '../utils';\n\nexport interface UseDebouncedCallbackOptions {\n delay: number;\n flushOnUnmount?: boolean;\n leading?: boolean;\n maxWait?: number;\n}\n\nexport type UseDebouncedCallbackReturnValue<T extends (...args: any[]) => any> = ((\n ...args: Parameters<T>\n) => void) & { flush: () => void; cancel: () => void; isPending: () => boolean };\n\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n options: number | UseDebouncedCallbackOptions\n) {\n const { delay, flushOnUnmount, leading, maxWait } =\n typeof options === 'number'\n ? {\n delay: options,\n flushOnUnmount: false,\n leading: false,\n maxWait: undefined as number | undefined,\n }\n : options;\n\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = useRef(0);\n const maxWaitTimerRef = useRef(0);\n const latestArgsRef = useRef<Parameters<T> | null>(null);\n\n const lastCallback = useMemo(() => {\n const currentCallback = Object.assign(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current);\n latestArgsRef.current = args;\n\n const isFirstCall = currentCallback._isFirstCall;\n currentCallback._isFirstCall = false;\n\n function clearTimeoutAndLeadingRef() {\n window.clearTimeout(debounceTimerRef.current);\n window.clearTimeout(maxWaitTimerRef.current);\n debounceTimerRef.current = 0;\n maxWaitTimerRef.current = 0;\n currentCallback._isFirstCall = true;\n currentCallback._hasPendingCallback = false;\n }\n\n function startMaxWaitTimer() {\n if (maxWait !== undefined && maxWaitTimerRef.current === 0) {\n maxWaitTimerRef.current = window.setTimeout(() => {\n if (debounceTimerRef.current !== 0) {\n const latestArgs = latestArgsRef.current!;\n clearTimeoutAndLeadingRef();\n handleCallback(...latestArgs);\n }\n }, maxWait);\n }\n }\n\n if (leading && isFirstCall) {\n handleCallback(...args);\n\n const resetLeadingState = () => {\n clearTimeoutAndLeadingRef();\n };\n\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n
|
|
1
|
+
{"version":3,"file":"use-debounced-callback.mjs","names":[],"sources":["../../src/use-debounced-callback/use-debounced-callback.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { useCallbackRef } from '../utils';\n\nexport interface UseDebouncedCallbackOptions {\n delay: number;\n flushOnUnmount?: boolean;\n leading?: boolean;\n maxWait?: number;\n}\n\nexport type UseDebouncedCallbackReturnValue<T extends (...args: any[]) => any> = ((\n ...args: Parameters<T>\n) => void) & { flush: () => void; cancel: () => void; isPending: () => boolean };\n\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n options: number | UseDebouncedCallbackOptions\n) {\n const { delay, flushOnUnmount, leading, maxWait } =\n typeof options === 'number'\n ? {\n delay: options,\n flushOnUnmount: false,\n leading: false,\n maxWait: undefined as number | undefined,\n }\n : options;\n\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = useRef(0);\n const maxWaitTimerRef = useRef(0);\n const latestArgsRef = useRef<Parameters<T> | null>(null);\n\n const lastCallback = useMemo(() => {\n const currentCallback = Object.assign(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current);\n latestArgsRef.current = args;\n\n const isFirstCall = currentCallback._isFirstCall;\n currentCallback._isFirstCall = false;\n\n function clearTimeoutAndLeadingRef() {\n window.clearTimeout(debounceTimerRef.current);\n window.clearTimeout(maxWaitTimerRef.current);\n debounceTimerRef.current = 0;\n maxWaitTimerRef.current = 0;\n currentCallback._isFirstCall = true;\n currentCallback._hasPendingCallback = false;\n }\n\n function startMaxWaitTimer() {\n if (maxWait !== undefined && maxWaitTimerRef.current === 0) {\n maxWaitTimerRef.current = window.setTimeout(() => {\n maxWaitTimerRef.current = 0;\n if (debounceTimerRef.current !== 0 && currentCallback._hasPendingCallback) {\n const latestArgs = latestArgsRef.current!;\n clearTimeoutAndLeadingRef();\n handleCallback(...latestArgs);\n }\n }, maxWait);\n }\n }\n\n if (leading && isFirstCall) {\n handleCallback(...args);\n\n const resetLeadingState = () => {\n clearTimeoutAndLeadingRef();\n };\n\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n }\n };\n\n const cancel = () => {\n clearTimeoutAndLeadingRef();\n };\n\n currentCallback.flush = flush;\n currentCallback.cancel = cancel;\n debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);\n startMaxWaitTimer();\n return;\n }\n\n if (leading && !isFirstCall) {\n currentCallback._hasPendingCallback = true;\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n handleCallback(...args);\n }\n };\n\n const cancel = () => {\n clearTimeoutAndLeadingRef();\n };\n\n currentCallback.flush = flush;\n currentCallback.cancel = cancel;\n\n const resetLeadingState = () => {\n clearTimeoutAndLeadingRef();\n };\n debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);\n startMaxWaitTimer();\n return;\n }\n\n currentCallback._hasPendingCallback = true;\n\n const flush = () => {\n if (debounceTimerRef.current !== 0) {\n clearTimeoutAndLeadingRef();\n handleCallback(...args);\n }\n };\n\n const cancel = () => {\n clearTimeoutAndLeadingRef();\n };\n\n currentCallback.flush = flush;\n currentCallback.cancel = cancel;\n debounceTimerRef.current = window.setTimeout(flush, delay);\n startMaxWaitTimer();\n },\n {\n flush: () => {},\n cancel: () => {},\n isPending: () => currentCallback._hasPendingCallback,\n _isFirstCall: true,\n _hasPendingCallback: false,\n }\n );\n return currentCallback;\n }, [handleCallback, delay, leading, maxWait]);\n\n useEffect(\n () => () => {\n if (flushOnUnmount) {\n lastCallback.flush();\n } else {\n lastCallback.cancel();\n }\n },\n [lastCallback, flushOnUnmount]\n );\n\n return lastCallback;\n}\n\nexport namespace useDebouncedCallback {\n export type Options = UseDebouncedCallbackOptions;\n export type ReturnValue<T extends (...args: any[]) => any> = UseDebouncedCallbackReturnValue<T>;\n}\n"],"mappings":";;;;AAcA,SAAgB,qBACd,UACA,SACA;CACA,MAAM,EAAE,OAAO,gBAAgB,SAAS,YACtC,OAAO,YAAY,WACf;EACE,OAAO;EACP,gBAAgB;EAChB,SAAS;EACT,SAAS,KAAA;CACX,IACA;CAEN,MAAM,iBAAiB,eAAe,QAAQ;CAC9C,MAAM,mBAAmB,OAAO,CAAC;CACjC,MAAM,kBAAkB,OAAO,CAAC;CAChC,MAAM,gBAAgB,OAA6B,IAAI;CAEvD,MAAM,eAAe,cAAc;EACjC,MAAM,kBAAkB,OAAO,QAC5B,GAAG,SAAwB;GAC1B,OAAO,aAAa,iBAAiB,OAAO;GAC5C,cAAc,UAAU;GAExB,MAAM,cAAc,gBAAgB;GACpC,gBAAgB,eAAe;GAE/B,SAAS,4BAA4B;IACnC,OAAO,aAAa,iBAAiB,OAAO;IAC5C,OAAO,aAAa,gBAAgB,OAAO;IAC3C,iBAAiB,UAAU;IAC3B,gBAAgB,UAAU;IAC1B,gBAAgB,eAAe;IAC/B,gBAAgB,sBAAsB;GACxC;GAEA,SAAS,oBAAoB;IAC3B,IAAI,YAAY,KAAA,KAAa,gBAAgB,YAAY,GACvD,gBAAgB,UAAU,OAAO,iBAAiB;KAChD,gBAAgB,UAAU;KAC1B,IAAI,iBAAiB,YAAY,KAAK,gBAAgB,qBAAqB;MACzE,MAAM,aAAa,cAAc;MACjC,0BAA0B;MAC1B,eAAe,GAAG,UAAU;KAC9B;IACF,GAAG,OAAO;GAEd;GAEA,IAAI,WAAW,aAAa;IAC1B,eAAe,GAAG,IAAI;IAEtB,MAAM,0BAA0B;KAC9B,0BAA0B;IAC5B;IAEA,MAAM,cAAc;KAClB,IAAI,iBAAiB,YAAY,GAC/B,0BAA0B;IAE9B;IAEA,MAAM,eAAe;KACnB,0BAA0B;IAC5B;IAEA,gBAAgB,QAAQ;IACxB,gBAAgB,SAAS;IACzB,iBAAiB,UAAU,OAAO,WAAW,mBAAmB,KAAK;IACrE,kBAAkB;IAClB;GACF;GAEA,IAAI,WAAW,CAAC,aAAa;IAC3B,gBAAgB,sBAAsB;IACtC,MAAM,cAAc;KAClB,IAAI,iBAAiB,YAAY,GAAG;MAClC,0BAA0B;MAC1B,eAAe,GAAG,IAAI;KACxB;IACF;IAEA,MAAM,eAAe;KACnB,0BAA0B;IAC5B;IAEA,gBAAgB,QAAQ;IACxB,gBAAgB,SAAS;IAEzB,MAAM,0BAA0B;KAC9B,0BAA0B;IAC5B;IACA,iBAAiB,UAAU,OAAO,WAAW,mBAAmB,KAAK;IACrE,kBAAkB;IAClB;GACF;GAEA,gBAAgB,sBAAsB;GAEtC,MAAM,cAAc;IAClB,IAAI,iBAAiB,YAAY,GAAG;KAClC,0BAA0B;KAC1B,eAAe,GAAG,IAAI;IACxB;GACF;GAEA,MAAM,eAAe;IACnB,0BAA0B;GAC5B;GAEA,gBAAgB,QAAQ;GACxB,gBAAgB,SAAS;GACzB,iBAAiB,UAAU,OAAO,WAAW,OAAO,KAAK;GACzD,kBAAkB;EACpB,GACA;GACE,aAAa,CAAC;GACd,cAAc,CAAC;GACf,iBAAiB,gBAAgB;GACjC,cAAc;GACd,qBAAqB;EACvB,CACF;EACA,OAAO;CACT,GAAG;EAAC;EAAgB;EAAO;EAAS;CAAO,CAAC;CAE5C,sBACc;EACV,IAAI,gBACF,aAAa,MAAM;OAEnB,aAAa,OAAO;CAExB,GACA,CAAC,cAAc,cAAc,CAC/B;CAEA,OAAO;AACT"}
|
|
@@ -9,8 +9,12 @@ function useDebouncedState(defaultValue, wait, options = { leading: false }) {
|
|
|
9
9
|
useEffect(() => clearTimeout, []);
|
|
10
10
|
return [value, useCallback((newValue) => {
|
|
11
11
|
clearTimeout();
|
|
12
|
-
if (leadingRef.current && options.leading)
|
|
13
|
-
|
|
12
|
+
if (leadingRef.current && options.leading) {
|
|
13
|
+
setValue(newValue);
|
|
14
|
+
timeoutRef.current = window.setTimeout(() => {
|
|
15
|
+
leadingRef.current = true;
|
|
16
|
+
}, wait);
|
|
17
|
+
} else timeoutRef.current = window.setTimeout(() => {
|
|
14
18
|
leadingRef.current = true;
|
|
15
19
|
setValue(newValue);
|
|
16
20
|
}, wait);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounced-state.mjs","names":[],"sources":["../../src/use-debounced-state/use-debounced-state.ts"],"sourcesContent":["import { SetStateAction, useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseDebouncedStateOptions {\n leading?: boolean;\n}\n\nexport type UseDebouncedStateReturnValue<T> = [T, (newValue: SetStateAction<T>) => void];\n\nexport function useDebouncedState<T = any>(\n defaultValue: T,\n wait: number,\n options: UseDebouncedStateOptions = { leading: false }\n): UseDebouncedStateReturnValue<T> {\n const [value, setValue] = useState(defaultValue);\n const timeoutRef = useRef<number | null>(null);\n const leadingRef = useRef(true);\n\n const clearTimeout = () => window.clearTimeout(timeoutRef.current!);\n useEffect(() => clearTimeout, []);\n\n const debouncedSetValue = useCallback(\n (newValue: SetStateAction<T>) => {\n clearTimeout();\n if (leadingRef.current && options.leading) {\n setValue(newValue);\n } else {\n timeoutRef.current = window.setTimeout(() => {\n leadingRef.current = true;\n setValue(newValue);\n }, wait);\n }\n leadingRef.current = false;\n },\n [options.leading, wait]\n );\n\n return [value, debouncedSetValue] as const;\n}\n\nexport namespace useDebouncedState {\n export type Options = UseDebouncedStateOptions;\n export type ReturnValue<T> = UseDebouncedStateReturnValue<T>;\n}\n"],"mappings":";;;AAQA,SAAgB,kBACd,cACA,MACA,UAAoC,EAAE,SAAS,MAAM,GACpB;CACjC,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAC/C,MAAM,aAAa,OAAsB,IAAI;CAC7C,MAAM,aAAa,OAAO,IAAI;CAE9B,MAAM,qBAAqB,OAAO,aAAa,WAAW,OAAQ;CAClE,gBAAgB,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"use-debounced-state.mjs","names":[],"sources":["../../src/use-debounced-state/use-debounced-state.ts"],"sourcesContent":["import { SetStateAction, useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseDebouncedStateOptions {\n leading?: boolean;\n}\n\nexport type UseDebouncedStateReturnValue<T> = [T, (newValue: SetStateAction<T>) => void];\n\nexport function useDebouncedState<T = any>(\n defaultValue: T,\n wait: number,\n options: UseDebouncedStateOptions = { leading: false }\n): UseDebouncedStateReturnValue<T> {\n const [value, setValue] = useState(defaultValue);\n const timeoutRef = useRef<number | null>(null);\n const leadingRef = useRef(true);\n\n const clearTimeout = () => window.clearTimeout(timeoutRef.current!);\n useEffect(() => clearTimeout, []);\n\n const debouncedSetValue = useCallback(\n (newValue: SetStateAction<T>) => {\n clearTimeout();\n if (leadingRef.current && options.leading) {\n setValue(newValue);\n timeoutRef.current = window.setTimeout(() => {\n leadingRef.current = true;\n }, wait);\n } else {\n timeoutRef.current = window.setTimeout(() => {\n leadingRef.current = true;\n setValue(newValue);\n }, wait);\n }\n leadingRef.current = false;\n },\n [options.leading, wait]\n );\n\n return [value, debouncedSetValue] as const;\n}\n\nexport namespace useDebouncedState {\n export type Options = UseDebouncedStateOptions;\n export type ReturnValue<T> = UseDebouncedStateReturnValue<T>;\n}\n"],"mappings":";;;AAQA,SAAgB,kBACd,cACA,MACA,UAAoC,EAAE,SAAS,MAAM,GACpB;CACjC,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAC/C,MAAM,aAAa,OAAsB,IAAI;CAC7C,MAAM,aAAa,OAAO,IAAI;CAE9B,MAAM,qBAAqB,OAAO,aAAa,WAAW,OAAQ;CAClE,gBAAgB,cAAc,CAAC,CAAC;CAqBhC,OAAO,CAAC,OAnBkB,aACvB,aAAgC;EAC/B,aAAa;EACb,IAAI,WAAW,WAAW,QAAQ,SAAS;GACzC,SAAS,QAAQ;GACjB,WAAW,UAAU,OAAO,iBAAiB;IAC3C,WAAW,UAAU;GACvB,GAAG,IAAI;EACT,OACE,WAAW,UAAU,OAAO,iBAAiB;GAC3C,WAAW,UAAU;GACrB,SAAS,QAAQ;EACnB,GAAG,IAAI;EAET,WAAW,UAAU;CACvB,GACA,CAAC,QAAQ,SAAS,IAAI,CAGO,CAAC;AAClC"}
|
|
@@ -37,7 +37,7 @@ function usePagination({ total, siblings = 1, boundaries = 1, page, initialPage,
|
|
|
37
37
|
const leftSiblingIndex = Math.max(activePage - siblings, _startValue + boundaries - 1);
|
|
38
38
|
const rightSiblingIndex = Math.min(activePage + siblings, _endValue - boundaries);
|
|
39
39
|
const shouldShowLeftDots = leftSiblingIndex > _startValue + boundaries + 1;
|
|
40
|
-
const shouldShowRightDots = rightSiblingIndex < _endValue - boundaries;
|
|
40
|
+
const shouldShowRightDots = rightSiblingIndex < _endValue - (boundaries + 1);
|
|
41
41
|
if (!shouldShowLeftDots && shouldShowRightDots) {
|
|
42
42
|
const leftItemCount = siblings * 2 + boundaries + 2;
|
|
43
43
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-pagination.mjs","names":[],"sources":["../../src/use-pagination/use-pagination.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useUncontrolled } from '../use-uncontrolled/use-uncontrolled';\n\nfunction range(start: number, end: number) {\n const length = end - start + 1;\n return Array.from({ length }, (_, index) => index + start);\n}\n\nexport const DOTS = 'dots';\n\nexport interface UsePaginationOptions {\n /** Page selected on initial render, defaults to 1 or startValue if provided */\n initialPage?: number;\n\n /** Controlled active page number */\n page?: number;\n\n /** Total amount of pages */\n total: number;\n\n /** Siblings amount on left/right side of selected page, defaults to 1 */\n siblings?: number;\n\n /** Amount of elements visible on left/right edges, defaults to 1 */\n boundaries?: number;\n\n /** Callback fired after change of each page */\n onChange?: (page: number) => void;\n\n /** Starting page number, defaults to 1 */\n startValue?: number;\n}\n\nexport interface UsePaginationReturnValue {\n /** Array of page numbers and dots */\n range: (number | 'dots')[];\n\n /** Active page number */\n active: number;\n\n /** Function to set active page */\n setPage: (page: number) => void;\n\n /** Function to go to next page */\n next: () => void;\n\n /** Function to go to previous page */\n previous: () => void;\n\n /** Function to go to first page */\n first: () => void;\n\n /** Function to go to last page */\n last: () => void;\n}\n\nexport function usePagination({\n total,\n siblings = 1,\n boundaries = 1,\n page,\n initialPage,\n onChange,\n startValue = 1,\n}: UsePaginationOptions): UsePaginationReturnValue {\n const _startValue = Math.max(Math.trunc(startValue), 1);\n const _endValue = Math.max(Math.trunc(total), _startValue);\n const _total = _endValue - _startValue + 1;\n const _initialPage = initialPage ?? _startValue;\n\n const [activePage, setActivePage] = useUncontrolled({\n value: page,\n onChange,\n defaultValue: _initialPage,\n finalValue: _initialPage,\n });\n\n const setPage = useCallback(\n (pageNumber: number) => {\n if (pageNumber < _startValue) {\n setActivePage(_startValue);\n } else if (pageNumber > _endValue) {\n setActivePage(_endValue);\n } else {\n setActivePage(pageNumber);\n }\n },\n [_startValue, _endValue, setActivePage]\n );\n\n const next = useCallback(() => setPage(activePage + 1), [activePage, setPage]);\n const previous = useCallback(() => setPage(activePage - 1), [activePage, setPage]);\n const first = useCallback(() => setPage(_startValue), [setPage, _startValue]);\n const last = useCallback(() => setPage(_endValue), [_endValue, setPage]);\n\n const paginationRange = useMemo((): (number | 'dots')[] => {\n const totalPageNumbers = siblings * 2 + 3 + boundaries * 2;\n if (totalPageNumbers >= _total) {\n return range(_startValue, _endValue);\n }\n\n const leftSiblingIndex = Math.max(activePage - siblings, _startValue + boundaries - 1);\n const rightSiblingIndex = Math.min(activePage + siblings, _endValue - boundaries);\n\n const shouldShowLeftDots = leftSiblingIndex > _startValue + boundaries + 1;\n const shouldShowRightDots = rightSiblingIndex < _endValue - boundaries;\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = siblings * 2 + boundaries + 2;\n return [\n ...range(_startValue, _startValue + leftItemCount - 1),\n DOTS,\n ...range(_endValue - (boundaries - 1), _endValue),\n ];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = boundaries + 1 + 2 * siblings;\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(_endValue - rightItemCount, _endValue),\n ];\n }\n\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(leftSiblingIndex, rightSiblingIndex),\n DOTS,\n ...range(_endValue - boundaries + 1, _endValue),\n ];\n }, [_total, siblings, activePage, _startValue, _endValue, boundaries]);\n\n return {\n range: paginationRange,\n active: activePage,\n setPage,\n next,\n previous,\n first,\n last,\n };\n}\n\nexport namespace usePagination {\n export type Options = UsePaginationOptions;\n export type ReturnValue = UsePaginationReturnValue;\n}\n"],"mappings":";;;;AAGA,SAAS,MAAM,OAAe,KAAa;CACzC,MAAM,SAAS,MAAM,QAAQ;CAC7B,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI,GAAG,UAAU,QAAQ,KAAK;AAC3D;AAEA,MAAa,OAAO;AAgDpB,SAAgB,cAAc,EAC5B,OACA,WAAW,GACX,aAAa,GACb,MACA,aACA,UACA,aAAa,KACoC;CACjD,MAAM,cAAc,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC;CACtD,MAAM,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,WAAW;CACzD,MAAM,SAAS,YAAY,cAAc;CACzC,MAAM,eAAe,eAAe;CAEpC,MAAM,CAAC,YAAY,iBAAiB,gBAAgB;EAClD,OAAO;EACP;EACA,cAAc;EACd,YAAY;CACd,CAAC;CAED,MAAM,UAAU,aACb,eAAuB;EACtB,IAAI,aAAa,aACf,cAAc,WAAW;OACpB,IAAI,aAAa,WACtB,cAAc,SAAS;OAEvB,cAAc,UAAU;CAE5B,GACA;EAAC;EAAa;EAAW;CAAa,CACxC;CAEA,MAAM,OAAO,kBAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CAC7E,MAAM,WAAW,kBAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CACjF,MAAM,QAAQ,kBAAkB,QAAQ,WAAW,GAAG,CAAC,SAAS,WAAW,CAAC;CAC5E,MAAM,OAAO,kBAAkB,QAAQ,SAAS,GAAG,CAAC,WAAW,OAAO,CAAC;CAyCvE,OAAO;EACL,OAxCsB,cAAmC;GAEzD,IADyB,WAAW,IAAI,IAAI,aAAa,KACjC,QACtB,OAAO,MAAM,aAAa,SAAS;GAGrC,MAAM,mBAAmB,KAAK,IAAI,aAAa,UAAU,cAAc,aAAa,CAAC;GACrF,MAAM,oBAAoB,KAAK,IAAI,aAAa,UAAU,YAAY,UAAU;GAEhF,MAAM,qBAAqB,mBAAmB,cAAc,aAAa;GACzE,MAAM,sBAAsB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"use-pagination.mjs","names":[],"sources":["../../src/use-pagination/use-pagination.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useUncontrolled } from '../use-uncontrolled/use-uncontrolled';\n\nfunction range(start: number, end: number) {\n const length = end - start + 1;\n return Array.from({ length }, (_, index) => index + start);\n}\n\nexport const DOTS = 'dots';\n\nexport interface UsePaginationOptions {\n /** Page selected on initial render, defaults to 1 or startValue if provided */\n initialPage?: number;\n\n /** Controlled active page number */\n page?: number;\n\n /** Total amount of pages */\n total: number;\n\n /** Siblings amount on left/right side of selected page, defaults to 1 */\n siblings?: number;\n\n /** Amount of elements visible on left/right edges, defaults to 1 */\n boundaries?: number;\n\n /** Callback fired after change of each page */\n onChange?: (page: number) => void;\n\n /** Starting page number, defaults to 1 */\n startValue?: number;\n}\n\nexport interface UsePaginationReturnValue {\n /** Array of page numbers and dots */\n range: (number | 'dots')[];\n\n /** Active page number */\n active: number;\n\n /** Function to set active page */\n setPage: (page: number) => void;\n\n /** Function to go to next page */\n next: () => void;\n\n /** Function to go to previous page */\n previous: () => void;\n\n /** Function to go to first page */\n first: () => void;\n\n /** Function to go to last page */\n last: () => void;\n}\n\nexport function usePagination({\n total,\n siblings = 1,\n boundaries = 1,\n page,\n initialPage,\n onChange,\n startValue = 1,\n}: UsePaginationOptions): UsePaginationReturnValue {\n const _startValue = Math.max(Math.trunc(startValue), 1);\n const _endValue = Math.max(Math.trunc(total), _startValue);\n const _total = _endValue - _startValue + 1;\n const _initialPage = initialPage ?? _startValue;\n\n const [activePage, setActivePage] = useUncontrolled({\n value: page,\n onChange,\n defaultValue: _initialPage,\n finalValue: _initialPage,\n });\n\n const setPage = useCallback(\n (pageNumber: number) => {\n if (pageNumber < _startValue) {\n setActivePage(_startValue);\n } else if (pageNumber > _endValue) {\n setActivePage(_endValue);\n } else {\n setActivePage(pageNumber);\n }\n },\n [_startValue, _endValue, setActivePage]\n );\n\n const next = useCallback(() => setPage(activePage + 1), [activePage, setPage]);\n const previous = useCallback(() => setPage(activePage - 1), [activePage, setPage]);\n const first = useCallback(() => setPage(_startValue), [setPage, _startValue]);\n const last = useCallback(() => setPage(_endValue), [_endValue, setPage]);\n\n const paginationRange = useMemo((): (number | 'dots')[] => {\n const totalPageNumbers = siblings * 2 + 3 + boundaries * 2;\n if (totalPageNumbers >= _total) {\n return range(_startValue, _endValue);\n }\n\n const leftSiblingIndex = Math.max(activePage - siblings, _startValue + boundaries - 1);\n const rightSiblingIndex = Math.min(activePage + siblings, _endValue - boundaries);\n\n const shouldShowLeftDots = leftSiblingIndex > _startValue + boundaries + 1;\n const shouldShowRightDots = rightSiblingIndex < _endValue - (boundaries + 1);\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = siblings * 2 + boundaries + 2;\n return [\n ...range(_startValue, _startValue + leftItemCount - 1),\n DOTS,\n ...range(_endValue - (boundaries - 1), _endValue),\n ];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = boundaries + 1 + 2 * siblings;\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(_endValue - rightItemCount, _endValue),\n ];\n }\n\n return [\n ...range(_startValue, _startValue + boundaries - 1),\n DOTS,\n ...range(leftSiblingIndex, rightSiblingIndex),\n DOTS,\n ...range(_endValue - boundaries + 1, _endValue),\n ];\n }, [_total, siblings, activePage, _startValue, _endValue, boundaries]);\n\n return {\n range: paginationRange,\n active: activePage,\n setPage,\n next,\n previous,\n first,\n last,\n };\n}\n\nexport namespace usePagination {\n export type Options = UsePaginationOptions;\n export type ReturnValue = UsePaginationReturnValue;\n}\n"],"mappings":";;;;AAGA,SAAS,MAAM,OAAe,KAAa;CACzC,MAAM,SAAS,MAAM,QAAQ;CAC7B,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI,GAAG,UAAU,QAAQ,KAAK;AAC3D;AAEA,MAAa,OAAO;AAgDpB,SAAgB,cAAc,EAC5B,OACA,WAAW,GACX,aAAa,GACb,MACA,aACA,UACA,aAAa,KACoC;CACjD,MAAM,cAAc,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC;CACtD,MAAM,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,WAAW;CACzD,MAAM,SAAS,YAAY,cAAc;CACzC,MAAM,eAAe,eAAe;CAEpC,MAAM,CAAC,YAAY,iBAAiB,gBAAgB;EAClD,OAAO;EACP;EACA,cAAc;EACd,YAAY;CACd,CAAC;CAED,MAAM,UAAU,aACb,eAAuB;EACtB,IAAI,aAAa,aACf,cAAc,WAAW;OACpB,IAAI,aAAa,WACtB,cAAc,SAAS;OAEvB,cAAc,UAAU;CAE5B,GACA;EAAC;EAAa;EAAW;CAAa,CACxC;CAEA,MAAM,OAAO,kBAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CAC7E,MAAM,WAAW,kBAAkB,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC;CACjF,MAAM,QAAQ,kBAAkB,QAAQ,WAAW,GAAG,CAAC,SAAS,WAAW,CAAC;CAC5E,MAAM,OAAO,kBAAkB,QAAQ,SAAS,GAAG,CAAC,WAAW,OAAO,CAAC;CAyCvE,OAAO;EACL,OAxCsB,cAAmC;GAEzD,IADyB,WAAW,IAAI,IAAI,aAAa,KACjC,QACtB,OAAO,MAAM,aAAa,SAAS;GAGrC,MAAM,mBAAmB,KAAK,IAAI,aAAa,UAAU,cAAc,aAAa,CAAC;GACrF,MAAM,oBAAoB,KAAK,IAAI,aAAa,UAAU,YAAY,UAAU;GAEhF,MAAM,qBAAqB,mBAAmB,cAAc,aAAa;GACzE,MAAM,sBAAsB,oBAAoB,aAAa,aAAa;GAE1E,IAAI,CAAC,sBAAsB,qBAAqB;IAC9C,MAAM,gBAAgB,WAAW,IAAI,aAAa;IAClD,OAAO;KACL,GAAG,MAAM,aAAa,cAAc,gBAAgB,CAAC;KACrD;KACA,GAAG,MAAM,aAAa,aAAa,IAAI,SAAS;IAClD;GACF;GAEA,IAAI,sBAAsB,CAAC,qBAAqB;IAC9C,MAAM,iBAAiB,aAAa,IAAI,IAAI;IAC5C,OAAO;KACL,GAAG,MAAM,aAAa,cAAc,aAAa,CAAC;KAClD;KACA,GAAG,MAAM,YAAY,gBAAgB,SAAS;IAChD;GACF;GAEA,OAAO;IACL,GAAG,MAAM,aAAa,cAAc,aAAa,CAAC;IAClD;IACA,GAAG,MAAM,kBAAkB,iBAAiB;IAC5C;IACA,GAAG,MAAM,YAAY,aAAa,GAAG,SAAS;GAChD;EACF,GAAG;GAAC;GAAQ;GAAU;GAAY;GAAa;GAAW;EAAU,CAG7C;EACrB,QAAQ;EACR;EACA;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-scroll-into-view.mjs","names":[],"sources":["../../src/use-scroll-into-view/use-scroll-into-view.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useReducedMotion } from '../use-reduced-motion/use-reduced-motion';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\ninterface UseScrollIntoViewAnimation {\n /** Target element alignment relatively to parent based on current axis */\n alignment?: 'start' | 'end' | 'center';\n}\n\nexport interface UseScrollIntoViewOptions {\n /** Callback fired after scroll */\n onScrollFinish?: () => void;\n\n /** Callback fired when scroll animation is canceled by user interaction */\n onScrollCancel?: () => void;\n\n /** Duration of scroll in milliseconds */\n duration?: number;\n\n /** Axis of scroll */\n axis?: 'x' | 'y';\n\n /** Custom mathematical easing function */\n easing?: (t: number) => number;\n\n /** Additional distance between nearest edge and element */\n offset?: number;\n\n /** Indicator if animation may be interrupted by user scrolling */\n cancelable?: boolean;\n\n /** Prevents content jumping in scrolling lists with multiple targets */\n isList?: boolean;\n}\n\nexport interface UseScrollIntoViewReturnValue<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n> {\n scrollableRef: React.RefObject<Parent | null>;\n targetRef: React.RefObject<Target | null>;\n scrollIntoView: (params?: UseScrollIntoViewAnimation) => void;\n cancel: () => void;\n scrolling: boolean;\n}\n\nexport function useScrollIntoView<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n>({\n duration = 1250,\n axis = 'y',\n onScrollFinish,\n onScrollCancel,\n easing,\n offset = 0,\n cancelable = true,\n isList = false,\n}: UseScrollIntoViewOptions = {}): UseScrollIntoViewReturnValue<Target, Parent> {\n const frameID = useRef(0);\n const startTime = useRef(0);\n const shouldStop = useRef(false);\n const [scrolling, setScrolling] = useState(false);\n\n const scrollableRef = useRef<Parent | null>(null);\n const targetRef = useRef<Target | null>(null);\n\n const reducedMotion = useReducedMotion();\n\n const _easing = easing ?? easeInOutQuad;\n\n const cancel = (): void => {\n if (frameID.current) {\n cancelAnimationFrame(frameID.current);\n frameID.current = 0;\n setScrolling(false);\n }\n };\n\n const scrollIntoView = useCallback(\n ({ alignment = 'start' }: UseScrollIntoViewAnimation = {}) => {\n shouldStop.current = false;\n\n if (frameID.current) {\n cancel();\n }\n\n const start = getScrollStart({ parent: scrollableRef.current, axis }) ?? 0;\n\n const change =\n getRelativePosition({\n parent: scrollableRef.current,\n target: targetRef.current,\n axis,\n alignment,\n offset,\n isList,\n }) - (scrollableRef.current ? 0 : start);\n\n setScrolling(true);\n\n function animateScroll() {\n if (startTime.current === 0) {\n startTime.current = performance.now();\n }\n\n const now = performance.now();\n const elapsed = now - startTime.current;\n\n // Easing timing progress\n const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;\n\n const distance = start + change * _easing(t);\n\n setScrollParam({\n parent: scrollableRef.current,\n axis,\n distance,\n });\n\n if (!shouldStop.current && t < 1) {\n frameID.current = requestAnimationFrame(animateScroll);\n } else {\n if (shouldStop.current) {\n typeof onScrollCancel === 'function' && onScrollCancel();\n } else {\n typeof onScrollFinish === 'function' && onScrollFinish();\n }\n startTime.current = 0;\n frameID.current = 0;\n setScrolling(false);\n cancel();\n }\n }\n animateScroll();\n },\n [axis, duration, _easing, isList, offset, onScrollFinish, onScrollCancel, reducedMotion]\n );\n\n const handleStop = () => {\n if (cancelable) {\n shouldStop.current = true;\n }\n };\n\n /**\n * Detection of one of these events stops scroll animation\n * wheel - mouse wheel / touch pad\n * touchmove - any touchable device\n */\n\n useWindowEvent('wheel', handleStop, {\n passive: true,\n });\n\n useWindowEvent('touchmove', handleStop, {\n passive: true,\n });\n\n // Cleanup requestAnimationFrame\n useEffect(() => cancel, []);\n\n return {\n scrollableRef,\n targetRef,\n scrollIntoView,\n cancel,\n scrolling,\n };\n}\n\n// ---------------------------------------------------\n// Helpers\n// ---------------------------------------------------\n\nfunction easeInOutQuad(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\nfunction getRelativePosition({ axis, target, parent, alignment, offset, isList }: any): number {\n if (!target || (!parent && typeof document === 'undefined')) {\n return 0;\n }\n const isCustomParent = !!parent;\n const parentElement = parent || document.body;\n const parentPosition = parentElement.getBoundingClientRect();\n const targetPosition = target.getBoundingClientRect();\n\n const getDiff = (property: 'top' | 'left'): number =>\n targetPosition[property] - parentPosition[property];\n\n if (axis === 'y') {\n const diff = getDiff('top');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentHeight = isCustomParent ? parentPosition.height : window.innerHeight;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentHeight + targetPosition.height;\n const shouldScroll = distance >= -targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentHeight / 2 + targetPosition.height / 2;\n }\n\n return 0;\n }\n\n if (axis === 'x') {\n const diff = getDiff('left');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentWidth = isCustomParent ? parentPosition.width : window.innerWidth;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentWidth + targetPosition.width;\n const shouldScroll = distance >= -targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentWidth / 2 + targetPosition.width / 2;\n }\n\n return 0;\n }\n\n return 0;\n}\n\nfunction getScrollStart({ axis, parent }: any) {\n if (!parent && typeof document === 'undefined') {\n return 0;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n return parent[method];\n }\n\n const { body, documentElement } = document;\n\n // While one of it has a value the second is equal 0\n return body[method] + documentElement[method];\n}\n\nfunction setScrollParam({ axis, parent, distance }: any) {\n if (!parent && typeof document === 'undefined') {\n return;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n parent[method] = distance;\n } else {\n const { body, documentElement } = document;\n body[method] = distance;\n documentElement[method] = distance;\n }\n}\n\nexport namespace useScrollIntoView {\n export type Options = UseScrollIntoViewOptions;\n export type ReturnValue<\n Target extends HTMLElement,\n Parent extends HTMLElement | null,\n > = UseScrollIntoViewReturnValue<Target, Parent>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-scroll-into-view.mjs","names":[],"sources":["../../src/use-scroll-into-view/use-scroll-into-view.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useReducedMotion } from '../use-reduced-motion/use-reduced-motion';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\ninterface UseScrollIntoViewAnimation {\n /** Target element alignment relatively to parent based on current axis */\n alignment?: 'start' | 'end' | 'center';\n}\n\nexport interface UseScrollIntoViewOptions {\n /** Callback fired after scroll */\n onScrollFinish?: () => void;\n\n /** Callback fired when scroll animation is canceled by user interaction */\n onScrollCancel?: () => void;\n\n /** Duration of scroll in milliseconds */\n duration?: number;\n\n /** Axis of scroll */\n axis?: 'x' | 'y';\n\n /** Custom mathematical easing function */\n easing?: (t: number) => number;\n\n /** Additional distance between nearest edge and element */\n offset?: number;\n\n /** Indicator if animation may be interrupted by user scrolling */\n cancelable?: boolean;\n\n /** Prevents content jumping in scrolling lists with multiple targets */\n isList?: boolean;\n}\n\nexport interface UseScrollIntoViewReturnValue<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n> {\n scrollableRef: React.RefObject<Parent | null>;\n targetRef: React.RefObject<Target | null>;\n scrollIntoView: (params?: UseScrollIntoViewAnimation) => void;\n cancel: () => void;\n scrolling: boolean;\n}\n\nexport function useScrollIntoView<\n Target extends HTMLElement = any,\n Parent extends HTMLElement | null = null,\n>({\n duration = 1250,\n axis = 'y',\n onScrollFinish,\n onScrollCancel,\n easing,\n offset = 0,\n cancelable = true,\n isList = false,\n}: UseScrollIntoViewOptions = {}): UseScrollIntoViewReturnValue<Target, Parent> {\n const frameID = useRef(0);\n const startTime = useRef(0);\n const shouldStop = useRef(false);\n const [scrolling, setScrolling] = useState(false);\n\n const scrollableRef = useRef<Parent | null>(null);\n const targetRef = useRef<Target | null>(null);\n\n const reducedMotion = useReducedMotion();\n\n const _easing = easing ?? easeInOutQuad;\n\n const cancel = (): void => {\n if (frameID.current) {\n cancelAnimationFrame(frameID.current);\n frameID.current = 0;\n startTime.current = 0;\n setScrolling(false);\n }\n };\n\n const scrollIntoView = useCallback(\n ({ alignment = 'start' }: UseScrollIntoViewAnimation = {}) => {\n shouldStop.current = false;\n\n if (frameID.current) {\n cancel();\n }\n\n const start = getScrollStart({ parent: scrollableRef.current, axis }) ?? 0;\n\n const change =\n getRelativePosition({\n parent: scrollableRef.current,\n target: targetRef.current,\n axis,\n alignment,\n offset,\n isList,\n }) - (scrollableRef.current ? 0 : start);\n\n setScrolling(true);\n\n function animateScroll() {\n if (startTime.current === 0) {\n startTime.current = performance.now();\n }\n\n const now = performance.now();\n const elapsed = now - startTime.current;\n\n // Easing timing progress\n const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;\n\n const distance = start + change * _easing(t);\n\n setScrollParam({\n parent: scrollableRef.current,\n axis,\n distance,\n });\n\n if (!shouldStop.current && t < 1) {\n frameID.current = requestAnimationFrame(animateScroll);\n } else {\n if (shouldStop.current) {\n typeof onScrollCancel === 'function' && onScrollCancel();\n } else {\n typeof onScrollFinish === 'function' && onScrollFinish();\n }\n startTime.current = 0;\n frameID.current = 0;\n setScrolling(false);\n cancel();\n }\n }\n animateScroll();\n },\n [axis, duration, _easing, isList, offset, onScrollFinish, onScrollCancel, reducedMotion]\n );\n\n const handleStop = () => {\n if (cancelable) {\n shouldStop.current = true;\n }\n };\n\n /**\n * Detection of one of these events stops scroll animation\n * wheel - mouse wheel / touch pad\n * touchmove - any touchable device\n */\n\n useWindowEvent('wheel', handleStop, {\n passive: true,\n });\n\n useWindowEvent('touchmove', handleStop, {\n passive: true,\n });\n\n // Cleanup requestAnimationFrame\n useEffect(() => cancel, []);\n\n return {\n scrollableRef,\n targetRef,\n scrollIntoView,\n cancel,\n scrolling,\n };\n}\n\n// ---------------------------------------------------\n// Helpers\n// ---------------------------------------------------\n\nfunction easeInOutQuad(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\nfunction getRelativePosition({ axis, target, parent, alignment, offset, isList }: any): number {\n if (!target || (!parent && typeof document === 'undefined')) {\n return 0;\n }\n const isCustomParent = !!parent;\n const parentElement = parent || document.body;\n const parentPosition = parentElement.getBoundingClientRect();\n const targetPosition = target.getBoundingClientRect();\n\n const getDiff = (property: 'top' | 'left'): number =>\n targetPosition[property] - parentPosition[property];\n\n if (axis === 'y') {\n const diff = getDiff('top');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentHeight = isCustomParent ? parentPosition.height : window.innerHeight;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentHeight + targetPosition.height;\n const shouldScroll = distance >= -targetPosition.height * (isList ? 0 : 1) || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentHeight / 2 + targetPosition.height / 2;\n }\n\n return 0;\n }\n\n if (axis === 'x') {\n const diff = getDiff('left');\n\n if (diff === 0) {\n return 0;\n }\n\n if (alignment === 'start') {\n const distance = diff - offset;\n const shouldScroll = distance <= targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n const parentWidth = isCustomParent ? parentPosition.width : window.innerWidth;\n\n if (alignment === 'end') {\n const distance = diff + offset - parentWidth + targetPosition.width;\n const shouldScroll = distance >= -targetPosition.width || !isList;\n\n return shouldScroll ? distance : 0;\n }\n\n if (alignment === 'center') {\n return diff - parentWidth / 2 + targetPosition.width / 2;\n }\n\n return 0;\n }\n\n return 0;\n}\n\nfunction getScrollStart({ axis, parent }: any) {\n if (!parent && typeof document === 'undefined') {\n return 0;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n return parent[method];\n }\n\n const { body, documentElement } = document;\n\n // While one of it has a value the second is equal 0\n return body[method] + documentElement[method];\n}\n\nfunction setScrollParam({ axis, parent, distance }: any) {\n if (!parent && typeof document === 'undefined') {\n return;\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n if (parent) {\n parent[method] = distance;\n } else {\n const { body, documentElement } = document;\n body[method] = distance;\n documentElement[method] = distance;\n }\n}\n\nexport namespace useScrollIntoView {\n export type Options = UseScrollIntoViewOptions;\n export type ReturnValue<\n Target extends HTMLElement,\n Parent extends HTMLElement | null,\n > = UseScrollIntoViewReturnValue<Target, Parent>;\n}\n"],"mappings":"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"}
|