@os-design/use-auto-scroll 1.0.20 → 1.0.22

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.
@@ -0,0 +1,24 @@
1
+ export interface UseAutoScrollProps {
2
+ /**
3
+ * Whether the auto scroll is enabled.
4
+ * @default true
5
+ */
6
+ enabled?: boolean;
7
+ /**
8
+ * The distance to the border at which the container starts to scroll automatically (in percent).
9
+ * @default 20
10
+ */
11
+ distPercent?: number;
12
+ /**
13
+ * The max auto scroll speed (in px).
14
+ * @default 100
15
+ */
16
+ maxSpeedPx?: number;
17
+ }
18
+ /**
19
+ * Returns an array of the scrollable elements located under the specified coordinates. The first one is the topmost.
20
+ */
21
+ export declare const getScrollableElements: (x: number, y: number) => Element[];
22
+ declare const useAutoScroll: (props?: UseAutoScrollProps) => void;
23
+ export default useAutoScroll;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyCD;;GAEG;AACH,eAAO,MAAM,qBAAqB,MAAO,MAAM,KAAK,MAAM,KAAG,OAAO,EAWnE,CAAC;AAeF,QAAA,MAAM,aAAa,WAAW,kBAAkB,SAuH/C,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -46,7 +46,6 @@ const isScrollable = el => {
46
46
  export const getScrollableElements = (x, y) => {
47
47
  const elementsFromPoint = document.elementsFromPoint(x, y);
48
48
  const elements = [];
49
- // eslint-disable-next-line no-restricted-syntax
50
49
  for (const element of elementsFromPoint) {
51
50
  const el = element === document.documentElement ? document.body : element;
52
51
  if (isScrollable(el)) {
@@ -136,8 +135,6 @@ const useAutoScroll = (props = {}) => {
136
135
  return;
137
136
  }
138
137
  isScrollingRef.current = true;
139
-
140
- // eslint-disable-next-line no-restricted-syntax
141
138
  for (const el of scrollableElements) {
142
139
  const rect = getRect(el);
143
140
  const {
@@ -187,5 +184,4 @@ const useAutoScroll = (props = {}) => {
187
184
  if (!isScrollingRef.current && props.enabled) scroll();
188
185
  }, [scroll, cursorPosition, props.enabled]);
189
186
  };
190
- export default useAutoScroll;
191
- //# sourceMappingURL=index.js.map
187
+ export default useAutoScroll;
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@os-design/use-auto-scroll",
3
- "version": "1.0.20",
3
+ "version": "1.0.22",
4
4
  "license": "UNLICENSED",
5
5
  "repository": "git@gitlab.com:os-team/libs/os-design.git",
6
- "main": "dist/cjs/index.js",
7
- "module": "dist/esm/index.js",
8
- "types": "dist/types/index.d.ts",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
9
  "files": [
10
10
  "dist",
11
11
  "src",
@@ -20,9 +20,8 @@
20
20
  "sideEffects": false,
21
21
  "scripts": {
22
22
  "clean": "rimraf dist",
23
- "build:esm": "cross-env BABEL_ENV=esm babel src --root-mode upward --extensions .ts,.tsx --out-dir dist/esm --source-maps",
24
- "build:cjs": "cross-env BABEL_ENV=cjs babel src --root-mode upward --extensions .ts,.tsx --out-dir dist/cjs --source-maps",
25
- "build:types": "tsc --emitDeclarationOnly --declaration --declarationDir dist/types",
23
+ "build:esm": "cross-env BABEL_ENV=esm babel src --root-mode upward --extensions .ts,.tsx --out-dir dist",
24
+ "build:types": "tsc -p tsconfig.build.json --emitDeclarationOnly --declaration --declarationDir dist",
26
25
  "build": "yarn clean && npm-run-all 'build:*'",
27
26
  "ncu": "ncu -u"
28
27
  },
@@ -30,10 +29,10 @@
30
29
  "access": "public"
31
30
  },
32
31
  "dependencies": {
33
- "@os-design/use-cursor-position": "^1.0.18"
32
+ "@os-design/use-cursor-position": "^1.0.20"
34
33
  },
35
34
  "peerDependencies": {
36
35
  "react": ">=18"
37
36
  },
38
- "gitHead": "6c92e27c799cae9ae9930e734868d8da35c61cb6"
37
+ "gitHead": "86a83e87297a07afe132782ca2c95023b7139276"
39
38
  }
package/src/index.ts CHANGED
@@ -67,7 +67,6 @@ const isScrollable = (el: Element) => {
67
67
  export const getScrollableElements = (x: number, y: number): Element[] => {
68
68
  const elementsFromPoint = document.elementsFromPoint(x, y);
69
69
  const elements: Element[] = [];
70
- // eslint-disable-next-line no-restricted-syntax
71
70
  for (const element of elementsFromPoint) {
72
71
  const el = element === document.documentElement ? document.body : element;
73
72
  if (isScrollable(el)) {
@@ -154,7 +153,6 @@ const useAutoScroll = (props: UseAutoScrollProps = {}) => {
154
153
 
155
154
  isScrollingRef.current = true;
156
155
 
157
- // eslint-disable-next-line no-restricted-syntax
158
156
  for (const el of scrollableElements) {
159
157
  const rect = getRect(el);
160
158
  const { scrollLeft, scrollTop } = getScrollOffset(el);
package/dist/cjs/index.js DELETED
@@ -1,214 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getScrollableElements = exports["default"] = void 0;
7
- var _useCursorPosition = _interopRequireDefault(require("@os-design/use-cursor-position"));
8
- var _react = require("react");
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
11
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
12
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
13
- var FPS = 60;
14
- var FRAME_TIMEOUT = 1000 / FPS;
15
- var getProps = function getProps(props) {
16
- return {
17
- enabled: props.enabled !== undefined ? props.enabled : true,
18
- distPercent: 20,
19
- maxSpeedPx: 100
20
- };
21
- };
22
- var getRect = function getRect(el) {
23
- if (el === document.body) {
24
- return {
25
- x: 0,
26
- y: 0,
27
- width: window.innerWidth,
28
- height: window.innerHeight
29
- };
30
- }
31
- var rect = el.getBoundingClientRect();
32
- return {
33
- x: rect.x,
34
- y: rect.y,
35
- width: rect.width,
36
- height: rect.height
37
- };
38
- };
39
-
40
- /**
41
- * Detects whether the element is scrollable.
42
- */
43
- var isScrollable = function isScrollable(el) {
44
- var style = getComputedStyle(el);
45
- if (el !== document.body && !/(auto|scroll)/.test(style.overflow + style.overflowY + style.overflowX)) {
46
- return false;
47
- }
48
- var _getRect = getRect(el),
49
- width = _getRect.width,
50
- height = _getRect.height;
51
- return el.scrollWidth > width || el.scrollHeight > height;
52
- };
53
-
54
- /**
55
- * Returns an array of the scrollable elements located under the specified coordinates. The first one is the topmost.
56
- */
57
- var getScrollableElements = exports.getScrollableElements = function getScrollableElements(x, y) {
58
- var elementsFromPoint = document.elementsFromPoint(x, y);
59
- var elements = [];
60
- // eslint-disable-next-line no-restricted-syntax
61
- var _iterator = _createForOfIteratorHelper(elementsFromPoint),
62
- _step;
63
- try {
64
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
65
- var element = _step.value;
66
- var el = element === document.documentElement ? document.body : element;
67
- if (isScrollable(el)) {
68
- elements.push(el);
69
- }
70
- if (el === document.body) break;
71
- }
72
- } catch (err) {
73
- _iterator.e(err);
74
- } finally {
75
- _iterator.f();
76
- }
77
- return elements;
78
- };
79
- var getScrollOffset = function getScrollOffset(el) {
80
- if (el === document.body) {
81
- return {
82
- scrollLeft: window.scrollX,
83
- scrollTop: window.scrollY
84
- };
85
- }
86
- return {
87
- scrollLeft: el.scrollLeft,
88
- scrollTop: el.scrollTop
89
- };
90
- };
91
- var useAutoScroll = function useAutoScroll() {
92
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
93
- var cursorPosition = (0, _useCursorPosition["default"])();
94
- var cursorPositionRef = (0, _react.useRef)(cursorPosition);
95
- var propsRef = (0, _react.useRef)(getProps(props));
96
- var isScrollingRef = (0, _react.useRef)(false);
97
- var frameRef = (0, _react.useRef)();
98
- var timeoutRef = (0, _react.useRef)();
99
-
100
- // Update the ref to the cursor position if it changes
101
- (0, _react.useEffect)(function () {
102
- cursorPositionRef.current = cursorPosition;
103
- }, [cursorPosition]);
104
-
105
- // Update the props if it changes
106
- (0, _react.useEffect)(function () {
107
- propsRef.current = getProps(props);
108
- }, [props]);
109
-
110
- // Cancel the animation frame request and clear the timeout if the component was unmounted
111
- (0, _react.useEffect)(function () {
112
- return function () {
113
- if (frameRef.current) window.cancelAnimationFrame(frameRef.current);
114
- if (timeoutRef.current) clearTimeout(timeoutRef.current);
115
- };
116
- }, []);
117
-
118
- // Returns the max distance from the border of the specified element at which auto scrolling is enabled (in px)
119
- var getMaxDist = (0, _react.useCallback)(function (el, axis) {
120
- var distPercent = propsRef.current.distPercent;
121
- var _getRect2 = getRect(el),
122
- width = _getRect2.width,
123
- height = _getRect2.height;
124
- var size = axis === 'x' ? width : height;
125
- return Math.round(size * distPercent / 100);
126
- }, []);
127
-
128
- // Returns the distance by which the scroll position should be changed
129
- var getScrollStep = (0, _react.useCallback)(function (dist, maxDist) {
130
- if (dist < 0 || dist > maxDist) return 0;
131
- var maxSpeedPx = propsRef.current.maxSpeedPx;
132
- var divisor = maxDist / Math.log(maxSpeedPx);
133
- return Math.round(Math.exp((maxDist - dist) / divisor));
134
- }, []);
135
-
136
- // Scrolls the element to the specified position
137
- var scrollTo = (0, _react.useCallback)(function (element, options) {
138
- frameRef.current = window.requestAnimationFrame(function () {
139
- var el = element === document.body ? window : element;
140
- el.scrollTo(options);
141
- });
142
- }, []);
143
- var scroll = (0, _react.useCallback)(function () {
144
- var enabled = propsRef.current.enabled;
145
- var _cursorPositionRef$cu = cursorPositionRef.current,
146
- x = _cursorPositionRef$cu.x,
147
- y = _cursorPositionRef$cu.y;
148
- var scrollableElements = getScrollableElements(x, y).reverse();
149
- if (!enabled) {
150
- isScrollingRef.current = false;
151
- return;
152
- }
153
- isScrollingRef.current = true;
154
-
155
- // eslint-disable-next-line no-restricted-syntax
156
- var _iterator2 = _createForOfIteratorHelper(scrollableElements),
157
- _step2;
158
- try {
159
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
160
- var el = _step2.value;
161
- var rect = getRect(el);
162
- var _getScrollOffset = getScrollOffset(el),
163
- scrollLeft = _getScrollOffset.scrollLeft,
164
- scrollTop = _getScrollOffset.scrollTop;
165
- var xMaxDist = getMaxDist(el, 'x');
166
- var yMaxDist = getMaxDist(el, 'y');
167
- var leftDist = x - rect.x;
168
- var topDist = y - rect.y;
169
- var rightDist = rect.x + rect.width - x;
170
- var bottomDist = rect.y + rect.height - y;
171
- var leftScrollStep = getScrollStep(leftDist, xMaxDist);
172
- var topScrollStep = getScrollStep(topDist, yMaxDist);
173
- var rightScrollStep = getScrollStep(rightDist, xMaxDist);
174
- var bottomScrollStep = getScrollStep(bottomDist, yMaxDist);
175
- var canScrollLeft = scrollLeft > 0;
176
- var canScrollTop = scrollTop > 0;
177
- var canScrollRight = el.scrollWidth - scrollLeft > rect.width;
178
- var canScrollBottom = el.scrollHeight - scrollTop > rect.height;
179
- var left = scrollLeft;
180
- if (canScrollLeft && leftScrollStep > 0) {
181
- left = Math.max(scrollLeft - leftScrollStep, 0);
182
- } else if (canScrollRight && rightScrollStep > 0) {
183
- left = Math.min(scrollLeft + rightScrollStep, el.scrollWidth - rect.width);
184
- }
185
- var top = scrollTop;
186
- if (canScrollTop && topScrollStep > 0) {
187
- top = Math.max(scrollTop - topScrollStep, 0);
188
- } else if (canScrollBottom && bottomScrollStep > 0) {
189
- top = Math.min(scrollTop + bottomScrollStep, el.scrollHeight - rect.height);
190
- }
191
- if (left !== scrollLeft || top !== scrollTop) {
192
- scrollTo(el, {
193
- left: left,
194
- top: top
195
- });
196
- timeoutRef.current = setTimeout(scroll, FRAME_TIMEOUT);
197
- return;
198
- }
199
- }
200
- } catch (err) {
201
- _iterator2.e(err);
202
- } finally {
203
- _iterator2.f();
204
- }
205
- isScrollingRef.current = false;
206
- }, [getMaxDist, getScrollStep, scrollTo]);
207
-
208
- // Start auto scrolling when the cursor position changes only if it is not already running
209
- (0, _react.useEffect)(function () {
210
- if (!isScrollingRef.current && props.enabled) scroll();
211
- }, [scroll, cursorPosition, props.enabled]);
212
- };
213
- var _default = exports["default"] = useAutoScroll;
214
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
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":[]}
@@ -1 +0,0 @@
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":[]}
@@ -1,9 +0,0 @@
1
- export interface UseAutoScrollProps {
2
- enabled?: boolean;
3
- distPercent?: number;
4
- maxSpeedPx?: number;
5
- }
6
- export declare const getScrollableElements: (x: number, y: number) => Element[];
7
- declare const useAutoScroll: (props?: UseAutoScrollProps) => void;
8
- export default useAutoScroll;
9
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IAKjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAKlB,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA4CD,eAAO,MAAM,qBAAqB,MAAO,MAAM,KAAK,MAAM,KAAG,OAAO,EAYnE,CAAC;AAeF,QAAA,MAAM,aAAa,WAAW,kBAAkB,SAwH/C,CAAC;AAEF,eAAe,aAAa,CAAC"}