@os-design/use-auto-scroll 1.0.18 → 1.0.19
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/index.js +2 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +3 -3
- package/src/index.mdx +34 -0
package/dist/cjs/index.js
CHANGED
|
@@ -54,7 +54,7 @@ var isScrollable = function isScrollable(el) {
|
|
|
54
54
|
/**
|
|
55
55
|
* Returns an array of the scrollable elements located under the specified coordinates. The first one is the topmost.
|
|
56
56
|
*/
|
|
57
|
-
var getScrollableElements = function getScrollableElements(x, y) {
|
|
57
|
+
var getScrollableElements = exports.getScrollableElements = function getScrollableElements(x, y) {
|
|
58
58
|
var elementsFromPoint = document.elementsFromPoint(x, y);
|
|
59
59
|
var elements = [];
|
|
60
60
|
// eslint-disable-next-line no-restricted-syntax
|
|
@@ -76,7 +76,6 @@ var getScrollableElements = function getScrollableElements(x, y) {
|
|
|
76
76
|
}
|
|
77
77
|
return elements;
|
|
78
78
|
};
|
|
79
|
-
exports.getScrollableElements = getScrollableElements;
|
|
80
79
|
var getScrollOffset = function getScrollOffset(el) {
|
|
81
80
|
if (el === document.body) {
|
|
82
81
|
return {
|
|
@@ -211,6 +210,5 @@ var useAutoScroll = function useAutoScroll() {
|
|
|
211
210
|
if (!isScrollingRef.current && props.enabled) scroll();
|
|
212
211
|
}, [scroll, cursorPosition, props.enabled]);
|
|
213
212
|
};
|
|
214
|
-
var _default = useAutoScroll;
|
|
215
|
-
exports["default"] = _default;
|
|
213
|
+
var _default = exports["default"] = useAutoScroll;
|
|
216
214
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_useCursorPosition","_interopRequireDefault","require","_react","obj","__esModule","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","FPS","FRAME_TIMEOUT","getProps","props","enabled","undefined","distPercent","maxSpeedPx","getRect","el","document","body","x","y","width","window","innerWidth","height","innerHeight","rect","getBoundingClientRect","isScrollable","style","getComputedStyle","overflow","overflowY","overflowX","_getRect","scrollWidth","scrollHeight","getScrollableElements","elementsFromPoint","elements","_iterator","_step","element","documentElement","push","exports","getScrollOffset","scrollLeft","scrollX","scrollTop","scrollY","useAutoScroll","arguments","cursorPosition","useCursorPosition","cursorPositionRef","useRef","propsRef","isScrollingRef","frameRef","timeoutRef","useEffect","current","cancelAnimationFrame","clearTimeout","getMaxDist","useCallback","axis","_getRect2","size","Math","round","getScrollStep","dist","maxDist","divisor","log","exp","scrollTo","options","requestAnimationFrame","scroll","_cursorPositionRef$cu","scrollableElements","reverse","_iterator2","_step2","_getScrollOffset","xMaxDist","yMaxDist","leftDist","topDist","rightDist","bottomDist","leftScrollStep","topScrollStep","rightScrollStep","bottomScrollStep","canScrollLeft","canScrollTop","canScrollRight","canScrollBottom","left","max","min","top","setTimeout","_default"],"sources":["../../src/index.ts"],"sourcesContent":["import useCursorPosition from '@os-design/use-cursor-position';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst FPS = 60;\nconst FRAME_TIMEOUT = 1000 / FPS;\n\nexport interface UseAutoScrollProps {\n /**\n * Whether the auto scroll is enabled.\n * @default true\n */\n enabled?: boolean;\n /**\n * The distance to the border at which the container starts to scroll automatically (in percent).\n * @default 20\n */\n distPercent?: number;\n /**\n * The max auto scroll speed (in px).\n * @default 100\n */\n maxSpeedPx?: number;\n}\n\nconst getProps = (props: UseAutoScrollProps): Required<UseAutoScrollProps> => ({\n enabled: props.enabled !== undefined ? props.enabled : true,\n distPercent: 20,\n maxSpeedPx: 100,\n});\n\nconst getRect = (el: Element) => {\n if (el === document.body) {\n return {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n const rect = el.getBoundingClientRect();\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n};\n\n/**\n * Detects whether the element is scrollable.\n */\nconst isScrollable = (el: Element) => {\n const style = getComputedStyle(el);\n if (\n el !== document.body &&\n !/(auto|scroll)/.test(style.overflow + style.overflowY + style.overflowX)\n ) {\n return false;\n }\n const { width, height } = getRect(el);\n return el.scrollWidth > width || el.scrollHeight > height;\n};\n\n/**\n * Returns an array of the scrollable elements located under the specified coordinates. The first one is the topmost.\n */\nexport const getScrollableElements = (x: number, y: number): Element[] => {\n const elementsFromPoint = document.elementsFromPoint(x, y);\n const elements: Element[] = [];\n // eslint-disable-next-line no-restricted-syntax\n for (const element of elementsFromPoint) {\n const el = element === document.documentElement ? document.body : element;\n if (isScrollable(el)) {\n elements.push(el);\n }\n if (el === document.body) break;\n }\n return elements;\n};\n\nconst getScrollOffset = (el: Element) => {\n if (el === document.body) {\n return {\n scrollLeft: window.scrollX,\n scrollTop: window.scrollY,\n };\n }\n return {\n scrollLeft: el.scrollLeft,\n scrollTop: el.scrollTop,\n };\n};\n\nconst useAutoScroll = (props: UseAutoScrollProps = {}) => {\n const cursorPosition = useCursorPosition();\n const cursorPositionRef = useRef(cursorPosition);\n const propsRef = useRef<Required<UseAutoScrollProps>>(getProps(props));\n const isScrollingRef = useRef(false);\n const frameRef = useRef<number>();\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n // Update the ref to the cursor position if it changes\n useEffect(() => {\n cursorPositionRef.current = cursorPosition;\n }, [cursorPosition]);\n\n // Update the props if it changes\n useEffect(() => {\n propsRef.current = getProps(props);\n }, [props]);\n\n // Cancel the animation frame request and clear the timeout if the component was unmounted\n useEffect(\n () => () => {\n if (frameRef.current) window.cancelAnimationFrame(frameRef.current);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n },\n []\n );\n\n // Returns the max distance from the border of the specified element at which auto scrolling is enabled (in px)\n const getMaxDist = useCallback((el: Element, axis: 'x' | 'y') => {\n const { distPercent } = propsRef.current;\n const { width, height } = getRect(el);\n const size = axis === 'x' ? width : height;\n return Math.round((size * distPercent) / 100);\n }, []);\n\n // Returns the distance by which the scroll position should be changed\n const getScrollStep = useCallback((dist: number, maxDist: number) => {\n if (dist < 0 || dist > maxDist) return 0;\n const { maxSpeedPx } = propsRef.current;\n const divisor = maxDist / Math.log(maxSpeedPx);\n return Math.round(Math.exp((maxDist - dist) / divisor));\n }, []);\n\n // Scrolls the element to the specified position\n const scrollTo = useCallback((element: Element, options: ScrollToOptions) => {\n frameRef.current = window.requestAnimationFrame(() => {\n const el = element === document.body ? window : element;\n el.scrollTo(options);\n });\n }, []);\n\n const scroll = useCallback(() => {\n const { enabled } = propsRef.current;\n const { x, y } = cursorPositionRef.current;\n const scrollableElements = getScrollableElements(x, y).reverse();\n\n if (!enabled) {\n isScrollingRef.current = false;\n return;\n }\n\n isScrollingRef.current = true;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const el of scrollableElements) {\n const rect = getRect(el);\n const { scrollLeft, scrollTop } = getScrollOffset(el);\n\n const xMaxDist = getMaxDist(el, 'x');\n const yMaxDist = getMaxDist(el, 'y');\n\n const leftDist = x - rect.x;\n const topDist = y - rect.y;\n const rightDist = rect.x + rect.width - x;\n const bottomDist = rect.y + rect.height - y;\n\n const leftScrollStep = getScrollStep(leftDist, xMaxDist);\n const topScrollStep = getScrollStep(topDist, yMaxDist);\n const rightScrollStep = getScrollStep(rightDist, xMaxDist);\n const bottomScrollStep = getScrollStep(bottomDist, yMaxDist);\n\n const canScrollLeft = scrollLeft > 0;\n const canScrollTop = scrollTop > 0;\n const canScrollRight = el.scrollWidth - scrollLeft > rect.width;\n const canScrollBottom = el.scrollHeight - scrollTop > rect.height;\n\n let left = scrollLeft;\n if (canScrollLeft && leftScrollStep > 0) {\n left = Math.max(scrollLeft - leftScrollStep, 0);\n } else if (canScrollRight && rightScrollStep > 0) {\n left = Math.min(\n scrollLeft + rightScrollStep,\n el.scrollWidth - rect.width\n );\n }\n\n let top = scrollTop;\n if (canScrollTop && topScrollStep > 0) {\n top = Math.max(scrollTop - topScrollStep, 0);\n } else if (canScrollBottom && bottomScrollStep > 0) {\n top = Math.min(\n scrollTop + bottomScrollStep,\n el.scrollHeight - rect.height\n );\n }\n\n if (left !== scrollLeft || top !== scrollTop) {\n scrollTo(el, { left, top });\n timeoutRef.current = setTimeout(scroll, FRAME_TIMEOUT);\n return;\n }\n }\n\n isScrollingRef.current = false;\n }, [getMaxDist, getScrollStep, scrollTo]);\n\n // Start auto scrolling when the cursor position changes only if it is not already running\n useEffect(() => {\n if (!isScrollingRef.current && props.enabled) scroll();\n }, [scroll, cursorPosition, props.enabled]);\n};\n\nexport default useAutoScroll;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_useCursorPosition","_interopRequireDefault","require","_react","obj","__esModule","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","FPS","FRAME_TIMEOUT","getProps","props","enabled","undefined","distPercent","maxSpeedPx","getRect","el","document","body","x","y","width","window","innerWidth","height","innerHeight","rect","getBoundingClientRect","isScrollable","style","getComputedStyle","overflow","overflowY","overflowX","_getRect","scrollWidth","scrollHeight","getScrollableElements","exports","elementsFromPoint","elements","_iterator","_step","element","documentElement","push","getScrollOffset","scrollLeft","scrollX","scrollTop","scrollY","useAutoScroll","arguments","cursorPosition","useCursorPosition","cursorPositionRef","useRef","propsRef","isScrollingRef","frameRef","timeoutRef","useEffect","current","cancelAnimationFrame","clearTimeout","getMaxDist","useCallback","axis","_getRect2","size","Math","round","getScrollStep","dist","maxDist","divisor","log","exp","scrollTo","options","requestAnimationFrame","scroll","_cursorPositionRef$cu","scrollableElements","reverse","_iterator2","_step2","_getScrollOffset","xMaxDist","yMaxDist","leftDist","topDist","rightDist","bottomDist","leftScrollStep","topScrollStep","rightScrollStep","bottomScrollStep","canScrollLeft","canScrollTop","canScrollRight","canScrollBottom","left","max","min","top","setTimeout","_default"],"sources":["../../src/index.ts"],"sourcesContent":["import useCursorPosition from '@os-design/use-cursor-position';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst FPS = 60;\nconst FRAME_TIMEOUT = 1000 / FPS;\n\nexport interface UseAutoScrollProps {\n /**\n * Whether the auto scroll is enabled.\n * @default true\n */\n enabled?: boolean;\n /**\n * The distance to the border at which the container starts to scroll automatically (in percent).\n * @default 20\n */\n distPercent?: number;\n /**\n * The max auto scroll speed (in px).\n * @default 100\n */\n maxSpeedPx?: number;\n}\n\nconst getProps = (props: UseAutoScrollProps): Required<UseAutoScrollProps> => ({\n enabled: props.enabled !== undefined ? props.enabled : true,\n distPercent: 20,\n maxSpeedPx: 100,\n});\n\nconst getRect = (el: Element) => {\n if (el === document.body) {\n return {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n const rect = el.getBoundingClientRect();\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n};\n\n/**\n * Detects whether the element is scrollable.\n */\nconst isScrollable = (el: Element) => {\n const style = getComputedStyle(el);\n if (\n el !== document.body &&\n !/(auto|scroll)/.test(style.overflow + style.overflowY + style.overflowX)\n ) {\n return false;\n }\n const { width, height } = getRect(el);\n return el.scrollWidth > width || el.scrollHeight > height;\n};\n\n/**\n * Returns an array of the scrollable elements located under the specified coordinates. The first one is the topmost.\n */\nexport const getScrollableElements = (x: number, y: number): Element[] => {\n const elementsFromPoint = document.elementsFromPoint(x, y);\n const elements: Element[] = [];\n // eslint-disable-next-line no-restricted-syntax\n for (const element of elementsFromPoint) {\n const el = element === document.documentElement ? document.body : element;\n if (isScrollable(el)) {\n elements.push(el);\n }\n if (el === document.body) break;\n }\n return elements;\n};\n\nconst getScrollOffset = (el: Element) => {\n if (el === document.body) {\n return {\n scrollLeft: window.scrollX,\n scrollTop: window.scrollY,\n };\n }\n return {\n scrollLeft: el.scrollLeft,\n scrollTop: el.scrollTop,\n };\n};\n\nconst useAutoScroll = (props: UseAutoScrollProps = {}) => {\n const cursorPosition = useCursorPosition();\n const cursorPositionRef = useRef(cursorPosition);\n const propsRef = useRef<Required<UseAutoScrollProps>>(getProps(props));\n const isScrollingRef = useRef(false);\n const frameRef = useRef<number>();\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n // Update the ref to the cursor position if it changes\n useEffect(() => {\n cursorPositionRef.current = cursorPosition;\n }, [cursorPosition]);\n\n // Update the props if it changes\n useEffect(() => {\n propsRef.current = getProps(props);\n }, [props]);\n\n // Cancel the animation frame request and clear the timeout if the component was unmounted\n useEffect(\n () => () => {\n if (frameRef.current) window.cancelAnimationFrame(frameRef.current);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n },\n []\n );\n\n // Returns the max distance from the border of the specified element at which auto scrolling is enabled (in px)\n const getMaxDist = useCallback((el: Element, axis: 'x' | 'y') => {\n const { distPercent } = propsRef.current;\n const { width, height } = getRect(el);\n const size = axis === 'x' ? width : height;\n return Math.round((size * distPercent) / 100);\n }, []);\n\n // Returns the distance by which the scroll position should be changed\n const getScrollStep = useCallback((dist: number, maxDist: number) => {\n if (dist < 0 || dist > maxDist) return 0;\n const { maxSpeedPx } = propsRef.current;\n const divisor = maxDist / Math.log(maxSpeedPx);\n return Math.round(Math.exp((maxDist - dist) / divisor));\n }, []);\n\n // Scrolls the element to the specified position\n const scrollTo = useCallback((element: Element, options: ScrollToOptions) => {\n frameRef.current = window.requestAnimationFrame(() => {\n const el = element === document.body ? window : element;\n el.scrollTo(options);\n });\n }, []);\n\n const scroll = useCallback(() => {\n const { enabled } = propsRef.current;\n const { x, y } = cursorPositionRef.current;\n const scrollableElements = getScrollableElements(x, y).reverse();\n\n if (!enabled) {\n isScrollingRef.current = false;\n return;\n }\n\n isScrollingRef.current = true;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const el of scrollableElements) {\n const rect = getRect(el);\n const { scrollLeft, scrollTop } = getScrollOffset(el);\n\n const xMaxDist = getMaxDist(el, 'x');\n const yMaxDist = getMaxDist(el, 'y');\n\n const leftDist = x - rect.x;\n const topDist = y - rect.y;\n const rightDist = rect.x + rect.width - x;\n const bottomDist = rect.y + rect.height - y;\n\n const leftScrollStep = getScrollStep(leftDist, xMaxDist);\n const topScrollStep = getScrollStep(topDist, yMaxDist);\n const rightScrollStep = getScrollStep(rightDist, xMaxDist);\n const bottomScrollStep = getScrollStep(bottomDist, yMaxDist);\n\n const canScrollLeft = scrollLeft > 0;\n const canScrollTop = scrollTop > 0;\n const canScrollRight = el.scrollWidth - scrollLeft > rect.width;\n const canScrollBottom = el.scrollHeight - scrollTop > rect.height;\n\n let left = scrollLeft;\n if (canScrollLeft && leftScrollStep > 0) {\n left = Math.max(scrollLeft - leftScrollStep, 0);\n } else if (canScrollRight && rightScrollStep > 0) {\n left = Math.min(\n scrollLeft + rightScrollStep,\n el.scrollWidth - rect.width\n );\n }\n\n let top = scrollTop;\n if (canScrollTop && topScrollStep > 0) {\n top = Math.max(scrollTop - topScrollStep, 0);\n } else if (canScrollBottom && bottomScrollStep > 0) {\n top = Math.min(\n scrollTop + bottomScrollStep,\n el.scrollHeight - rect.height\n );\n }\n\n if (left !== scrollLeft || top !== scrollTop) {\n scrollTo(el, { left, top });\n timeoutRef.current = setTimeout(scroll, FRAME_TIMEOUT);\n return;\n }\n }\n\n isScrollingRef.current = false;\n }, [getMaxDist, getScrollStep, scrollTo]);\n\n // Start auto scrolling when the cursor position changes only if it is not already running\n useEffect(() => {\n if (!isScrollingRef.current && props.enabled) scroll();\n }, [scroll, cursorPosition, props.enabled]);\n};\n\nexport default useAutoScroll;\n"],"mappings":"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","ignoreList":[]}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useCursorPosition","useCallback","useEffect","useRef","FPS","FRAME_TIMEOUT","getProps","props","enabled","undefined","distPercent","maxSpeedPx","getRect","el","document","body","x","y","width","window","innerWidth","height","innerHeight","rect","getBoundingClientRect","isScrollable","style","getComputedStyle","test","overflow","overflowY","overflowX","scrollWidth","scrollHeight","getScrollableElements","elementsFromPoint","elements","element","documentElement","push","getScrollOffset","scrollLeft","scrollX","scrollTop","scrollY","useAutoScroll","cursorPosition","cursorPositionRef","propsRef","isScrollingRef","frameRef","timeoutRef","current","cancelAnimationFrame","clearTimeout","getMaxDist","axis","size","Math","round","getScrollStep","dist","maxDist","divisor","log","exp","scrollTo","options","requestAnimationFrame","scroll","scrollableElements","reverse","xMaxDist","yMaxDist","leftDist","topDist","rightDist","bottomDist","leftScrollStep","topScrollStep","rightScrollStep","bottomScrollStep","canScrollLeft","canScrollTop","canScrollRight","canScrollBottom","left","max","min","top","setTimeout"],"sources":["../../src/index.ts"],"sourcesContent":["import useCursorPosition from '@os-design/use-cursor-position';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst FPS = 60;\nconst FRAME_TIMEOUT = 1000 / FPS;\n\nexport interface UseAutoScrollProps {\n /**\n * Whether the auto scroll is enabled.\n * @default true\n */\n enabled?: boolean;\n /**\n * The distance to the border at which the container starts to scroll automatically (in percent).\n * @default 20\n */\n distPercent?: number;\n /**\n * The max auto scroll speed (in px).\n * @default 100\n */\n maxSpeedPx?: number;\n}\n\nconst getProps = (props: UseAutoScrollProps): Required<UseAutoScrollProps> => ({\n enabled: props.enabled !== undefined ? props.enabled : true,\n distPercent: 20,\n maxSpeedPx: 100,\n});\n\nconst getRect = (el: Element) => {\n if (el === document.body) {\n return {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n const rect = el.getBoundingClientRect();\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n};\n\n/**\n * Detects whether the element is scrollable.\n */\nconst isScrollable = (el: Element) => {\n const style = getComputedStyle(el);\n if (\n el !== document.body &&\n !/(auto|scroll)/.test(style.overflow + style.overflowY + style.overflowX)\n ) {\n return false;\n }\n const { width, height } = getRect(el);\n return el.scrollWidth > width || el.scrollHeight > height;\n};\n\n/**\n * Returns an array of the scrollable elements located under the specified coordinates. The first one is the topmost.\n */\nexport const getScrollableElements = (x: number, y: number): Element[] => {\n const elementsFromPoint = document.elementsFromPoint(x, y);\n const elements: Element[] = [];\n // eslint-disable-next-line no-restricted-syntax\n for (const element of elementsFromPoint) {\n const el = element === document.documentElement ? document.body : element;\n if (isScrollable(el)) {\n elements.push(el);\n }\n if (el === document.body) break;\n }\n return elements;\n};\n\nconst getScrollOffset = (el: Element) => {\n if (el === document.body) {\n return {\n scrollLeft: window.scrollX,\n scrollTop: window.scrollY,\n };\n }\n return {\n scrollLeft: el.scrollLeft,\n scrollTop: el.scrollTop,\n };\n};\n\nconst useAutoScroll = (props: UseAutoScrollProps = {}) => {\n const cursorPosition = useCursorPosition();\n const cursorPositionRef = useRef(cursorPosition);\n const propsRef = useRef<Required<UseAutoScrollProps>>(getProps(props));\n const isScrollingRef = useRef(false);\n const frameRef = useRef<number>();\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n // Update the ref to the cursor position if it changes\n useEffect(() => {\n cursorPositionRef.current = cursorPosition;\n }, [cursorPosition]);\n\n // Update the props if it changes\n useEffect(() => {\n propsRef.current = getProps(props);\n }, [props]);\n\n // Cancel the animation frame request and clear the timeout if the component was unmounted\n useEffect(\n () => () => {\n if (frameRef.current) window.cancelAnimationFrame(frameRef.current);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n },\n []\n );\n\n // Returns the max distance from the border of the specified element at which auto scrolling is enabled (in px)\n const getMaxDist = useCallback((el: Element, axis: 'x' | 'y') => {\n const { distPercent } = propsRef.current;\n const { width, height } = getRect(el);\n const size = axis === 'x' ? width : height;\n return Math.round((size * distPercent) / 100);\n }, []);\n\n // Returns the distance by which the scroll position should be changed\n const getScrollStep = useCallback((dist: number, maxDist: number) => {\n if (dist < 0 || dist > maxDist) return 0;\n const { maxSpeedPx } = propsRef.current;\n const divisor = maxDist / Math.log(maxSpeedPx);\n return Math.round(Math.exp((maxDist - dist) / divisor));\n }, []);\n\n // Scrolls the element to the specified position\n const scrollTo = useCallback((element: Element, options: ScrollToOptions) => {\n frameRef.current = window.requestAnimationFrame(() => {\n const el = element === document.body ? window : element;\n el.scrollTo(options);\n });\n }, []);\n\n const scroll = useCallback(() => {\n const { enabled } = propsRef.current;\n const { x, y } = cursorPositionRef.current;\n const scrollableElements = getScrollableElements(x, y).reverse();\n\n if (!enabled) {\n isScrollingRef.current = false;\n return;\n }\n\n isScrollingRef.current = true;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const el of scrollableElements) {\n const rect = getRect(el);\n const { scrollLeft, scrollTop } = getScrollOffset(el);\n\n const xMaxDist = getMaxDist(el, 'x');\n const yMaxDist = getMaxDist(el, 'y');\n\n const leftDist = x - rect.x;\n const topDist = y - rect.y;\n const rightDist = rect.x + rect.width - x;\n const bottomDist = rect.y + rect.height - y;\n\n const leftScrollStep = getScrollStep(leftDist, xMaxDist);\n const topScrollStep = getScrollStep(topDist, yMaxDist);\n const rightScrollStep = getScrollStep(rightDist, xMaxDist);\n const bottomScrollStep = getScrollStep(bottomDist, yMaxDist);\n\n const canScrollLeft = scrollLeft > 0;\n const canScrollTop = scrollTop > 0;\n const canScrollRight = el.scrollWidth - scrollLeft > rect.width;\n const canScrollBottom = el.scrollHeight - scrollTop > rect.height;\n\n let left = scrollLeft;\n if (canScrollLeft && leftScrollStep > 0) {\n left = Math.max(scrollLeft - leftScrollStep, 0);\n } else if (canScrollRight && rightScrollStep > 0) {\n left = Math.min(\n scrollLeft + rightScrollStep,\n el.scrollWidth - rect.width\n );\n }\n\n let top = scrollTop;\n if (canScrollTop && topScrollStep > 0) {\n top = Math.max(scrollTop - topScrollStep, 0);\n } else if (canScrollBottom && bottomScrollStep > 0) {\n top = Math.min(\n scrollTop + bottomScrollStep,\n el.scrollHeight - rect.height\n );\n }\n\n if (left !== scrollLeft || top !== scrollTop) {\n scrollTo(el, { left, top });\n timeoutRef.current = setTimeout(scroll, FRAME_TIMEOUT);\n return;\n }\n }\n\n isScrollingRef.current = false;\n }, [getMaxDist, getScrollStep, scrollTo]);\n\n // Start auto scrolling when the cursor position changes only if it is not already running\n useEffect(() => {\n if (!isScrollingRef.current && props.enabled) scroll();\n }, [scroll, cursorPosition, props.enabled]);\n};\n\nexport default useAutoScroll;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useCursorPosition","useCallback","useEffect","useRef","FPS","FRAME_TIMEOUT","getProps","props","enabled","undefined","distPercent","maxSpeedPx","getRect","el","document","body","x","y","width","window","innerWidth","height","innerHeight","rect","getBoundingClientRect","isScrollable","style","getComputedStyle","test","overflow","overflowY","overflowX","scrollWidth","scrollHeight","getScrollableElements","elementsFromPoint","elements","element","documentElement","push","getScrollOffset","scrollLeft","scrollX","scrollTop","scrollY","useAutoScroll","cursorPosition","cursorPositionRef","propsRef","isScrollingRef","frameRef","timeoutRef","current","cancelAnimationFrame","clearTimeout","getMaxDist","axis","size","Math","round","getScrollStep","dist","maxDist","divisor","log","exp","scrollTo","options","requestAnimationFrame","scroll","scrollableElements","reverse","xMaxDist","yMaxDist","leftDist","topDist","rightDist","bottomDist","leftScrollStep","topScrollStep","rightScrollStep","bottomScrollStep","canScrollLeft","canScrollTop","canScrollRight","canScrollBottom","left","max","min","top","setTimeout"],"sources":["../../src/index.ts"],"sourcesContent":["import useCursorPosition from '@os-design/use-cursor-position';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst FPS = 60;\nconst FRAME_TIMEOUT = 1000 / FPS;\n\nexport interface UseAutoScrollProps {\n /**\n * Whether the auto scroll is enabled.\n * @default true\n */\n enabled?: boolean;\n /**\n * The distance to the border at which the container starts to scroll automatically (in percent).\n * @default 20\n */\n distPercent?: number;\n /**\n * The max auto scroll speed (in px).\n * @default 100\n */\n maxSpeedPx?: number;\n}\n\nconst getProps = (props: UseAutoScrollProps): Required<UseAutoScrollProps> => ({\n enabled: props.enabled !== undefined ? props.enabled : true,\n distPercent: 20,\n maxSpeedPx: 100,\n});\n\nconst getRect = (el: Element) => {\n if (el === document.body) {\n return {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n const rect = el.getBoundingClientRect();\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n};\n\n/**\n * Detects whether the element is scrollable.\n */\nconst isScrollable = (el: Element) => {\n const style = getComputedStyle(el);\n if (\n el !== document.body &&\n !/(auto|scroll)/.test(style.overflow + style.overflowY + style.overflowX)\n ) {\n return false;\n }\n const { width, height } = getRect(el);\n return el.scrollWidth > width || el.scrollHeight > height;\n};\n\n/**\n * Returns an array of the scrollable elements located under the specified coordinates. The first one is the topmost.\n */\nexport const getScrollableElements = (x: number, y: number): Element[] => {\n const elementsFromPoint = document.elementsFromPoint(x, y);\n const elements: Element[] = [];\n // eslint-disable-next-line no-restricted-syntax\n for (const element of elementsFromPoint) {\n const el = element === document.documentElement ? document.body : element;\n if (isScrollable(el)) {\n elements.push(el);\n }\n if (el === document.body) break;\n }\n return elements;\n};\n\nconst getScrollOffset = (el: Element) => {\n if (el === document.body) {\n return {\n scrollLeft: window.scrollX,\n scrollTop: window.scrollY,\n };\n }\n return {\n scrollLeft: el.scrollLeft,\n scrollTop: el.scrollTop,\n };\n};\n\nconst useAutoScroll = (props: UseAutoScrollProps = {}) => {\n const cursorPosition = useCursorPosition();\n const cursorPositionRef = useRef(cursorPosition);\n const propsRef = useRef<Required<UseAutoScrollProps>>(getProps(props));\n const isScrollingRef = useRef(false);\n const frameRef = useRef<number>();\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n // Update the ref to the cursor position if it changes\n useEffect(() => {\n cursorPositionRef.current = cursorPosition;\n }, [cursorPosition]);\n\n // Update the props if it changes\n useEffect(() => {\n propsRef.current = getProps(props);\n }, [props]);\n\n // Cancel the animation frame request and clear the timeout if the component was unmounted\n useEffect(\n () => () => {\n if (frameRef.current) window.cancelAnimationFrame(frameRef.current);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n },\n []\n );\n\n // Returns the max distance from the border of the specified element at which auto scrolling is enabled (in px)\n const getMaxDist = useCallback((el: Element, axis: 'x' | 'y') => {\n const { distPercent } = propsRef.current;\n const { width, height } = getRect(el);\n const size = axis === 'x' ? width : height;\n return Math.round((size * distPercent) / 100);\n }, []);\n\n // Returns the distance by which the scroll position should be changed\n const getScrollStep = useCallback((dist: number, maxDist: number) => {\n if (dist < 0 || dist > maxDist) return 0;\n const { maxSpeedPx } = propsRef.current;\n const divisor = maxDist / Math.log(maxSpeedPx);\n return Math.round(Math.exp((maxDist - dist) / divisor));\n }, []);\n\n // Scrolls the element to the specified position\n const scrollTo = useCallback((element: Element, options: ScrollToOptions) => {\n frameRef.current = window.requestAnimationFrame(() => {\n const el = element === document.body ? window : element;\n el.scrollTo(options);\n });\n }, []);\n\n const scroll = useCallback(() => {\n const { enabled } = propsRef.current;\n const { x, y } = cursorPositionRef.current;\n const scrollableElements = getScrollableElements(x, y).reverse();\n\n if (!enabled) {\n isScrollingRef.current = false;\n return;\n }\n\n isScrollingRef.current = true;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const el of scrollableElements) {\n const rect = getRect(el);\n const { scrollLeft, scrollTop } = getScrollOffset(el);\n\n const xMaxDist = getMaxDist(el, 'x');\n const yMaxDist = getMaxDist(el, 'y');\n\n const leftDist = x - rect.x;\n const topDist = y - rect.y;\n const rightDist = rect.x + rect.width - x;\n const bottomDist = rect.y + rect.height - y;\n\n const leftScrollStep = getScrollStep(leftDist, xMaxDist);\n const topScrollStep = getScrollStep(topDist, yMaxDist);\n const rightScrollStep = getScrollStep(rightDist, xMaxDist);\n const bottomScrollStep = getScrollStep(bottomDist, yMaxDist);\n\n const canScrollLeft = scrollLeft > 0;\n const canScrollTop = scrollTop > 0;\n const canScrollRight = el.scrollWidth - scrollLeft > rect.width;\n const canScrollBottom = el.scrollHeight - scrollTop > rect.height;\n\n let left = scrollLeft;\n if (canScrollLeft && leftScrollStep > 0) {\n left = Math.max(scrollLeft - leftScrollStep, 0);\n } else if (canScrollRight && rightScrollStep > 0) {\n left = Math.min(\n scrollLeft + rightScrollStep,\n el.scrollWidth - rect.width\n );\n }\n\n let top = scrollTop;\n if (canScrollTop && topScrollStep > 0) {\n top = Math.max(scrollTop - topScrollStep, 0);\n } else if (canScrollBottom && bottomScrollStep > 0) {\n top = Math.min(\n scrollTop + bottomScrollStep,\n el.scrollHeight - rect.height\n );\n }\n\n if (left !== scrollLeft || top !== scrollTop) {\n scrollTo(el, { left, top });\n timeoutRef.current = setTimeout(scroll, FRAME_TIMEOUT);\n return;\n }\n }\n\n isScrollingRef.current = false;\n }, [getMaxDist, getScrollStep, scrollTo]);\n\n // Start auto scrolling when the cursor position changes only if it is not already running\n useEffect(() => {\n if (!isScrollingRef.current && props.enabled) scroll();\n }, [scroll, cursorPosition, props.enabled]);\n};\n\nexport default useAutoScroll;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@os-design/use-auto-scroll",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.19",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"repository": "git@gitlab.com:os-team/libs/os-design.git",
|
|
6
6
|
"main": "dist/cjs/index.js",
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"access": "public"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@os-design/use-cursor-position": "^1.0.
|
|
33
|
+
"@os-design/use-cursor-position": "^1.0.17"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"react": ">=18"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "1f17189e344a56fd6347dd6b896d6e7ef6e7b35d"
|
|
39
39
|
}
|
package/src/index.mdx
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Meta } from '@storybook/blocks';
|
|
2
|
+
import UseEventExample from './index.example';
|
|
3
|
+
|
|
4
|
+
<Meta title='Utils/useAutoScroll' />
|
|
5
|
+
|
|
6
|
+
# useAutoScroll
|
|
7
|
+
|
|
8
|
+
Auto scrolls if the cursor is near the border of the scrollable element. It works on both mouse and touch devices.
|
|
9
|
+
|
|
10
|
+
## Example of usage
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
import React, { useCallback, useState } from 'react';
|
|
14
|
+
import { useEvent } from '@os-design/utils';
|
|
15
|
+
|
|
16
|
+
const UseEventExample: React.FC = () => {
|
|
17
|
+
const [numberOfEvents, setNumberOfEvents] = useState(0);
|
|
18
|
+
|
|
19
|
+
const resizeListener = useCallback(
|
|
20
|
+
() => setNumberOfEvents(numberOfEvents + 1),
|
|
21
|
+
[numberOfEvents]
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
useEvent(window, 'resize', resizeListener);
|
|
25
|
+
|
|
26
|
+
return <p>Number of resize events: {numberOfEvents}</p>;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default UseEventExample;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
<UseEventExample />
|
|
33
|
+
|
|
34
|
+
Try resizing the browser window.
|