use-scroller 1.2.0 → 2.0.0

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.
Files changed (42) hide show
  1. package/README.md +387 -95
  2. package/dist/chunk-BDIJT5M4.js +1188 -0
  3. package/dist/core.d.ts +121 -0
  4. package/dist/core.js +36 -0
  5. package/dist/index.d.ts +51 -0
  6. package/dist/index.js +346 -0
  7. package/package.json +38 -24
  8. package/dist/cjs/hooks/use-iso-morphic-effect.d.ts +0 -2
  9. package/dist/cjs/hooks/use-iso-morphic-effect.js +0 -6
  10. package/dist/cjs/hooks/use-scroll.d.ts +0 -24
  11. package/dist/cjs/hooks/use-scroll.js +0 -80
  12. package/dist/cjs/hooks/use-window-scroll.d.ts +0 -13
  13. package/dist/cjs/hooks/use-window-scroll.js +0 -62
  14. package/dist/cjs/index.d.ts +0 -3
  15. package/dist/cjs/index.js +0 -19
  16. package/dist/cjs/scroller.d.ts +0 -10
  17. package/dist/cjs/scroller.js +0 -94
  18. package/dist/cjs/types.d.ts +0 -17
  19. package/dist/cjs/types.js +0 -2
  20. package/dist/cjs/utils.d.ts +0 -37
  21. package/dist/cjs/utils.js +0 -92
  22. package/dist/esm/hooks/use-iso-morphic-effect.d.ts +0 -2
  23. package/dist/esm/hooks/use-iso-morphic-effect.js +0 -3
  24. package/dist/esm/hooks/use-scroll.d.ts +0 -24
  25. package/dist/esm/hooks/use-scroll.js +0 -76
  26. package/dist/esm/hooks/use-window-scroll.d.ts +0 -13
  27. package/dist/esm/hooks/use-window-scroll.js +0 -58
  28. package/dist/esm/index.d.ts +0 -3
  29. package/dist/esm/index.js +0 -3
  30. package/dist/esm/scroller.d.ts +0 -10
  31. package/dist/esm/scroller.js +0 -90
  32. package/dist/esm/types.d.ts +0 -17
  33. package/dist/esm/types.js +0 -1
  34. package/dist/esm/utils.d.ts +0 -37
  35. package/dist/esm/utils.js +0 -85
  36. package/src/hooks/use-iso-morphic-effect.ts +0 -4
  37. package/src/hooks/use-scroll.ts +0 -84
  38. package/src/hooks/use-window-scroll.ts +0 -73
  39. package/src/index.ts +0 -3
  40. package/src/scroller.ts +0 -107
  41. package/src/types.ts +0 -21
  42. package/src/utils.ts +0 -103
@@ -1,80 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.useScroll = void 0;
15
- var react_1 = require("react");
16
- var scroller_1 = require("../scroller");
17
- var utils_1 = require("../utils");
18
- var use_iso_morphic_effect_1 = require("./use-iso-morphic-effect");
19
- var initialState = {
20
- left: 0,
21
- top: 0,
22
- isScrollable: false,
23
- isScrolledLeft: true,
24
- isScrolledRight: false,
25
- isScrolledTop: true,
26
- isScrolledBottom: false,
27
- maxScrollLeft: 0,
28
- maxScrollTop: 0,
29
- scrollPercentageX: 0,
30
- scrollPercentageY: 0, // Percentage of vertical scroll covered
31
- };
32
- function useScroll(props) {
33
- var _a, _b, _c, _d, _e, _f;
34
- var ref = (0, react_1.useRef)(null);
35
- var scrollOpt = __assign(__assign({}, utils_1.defaultScrollOptions), props);
36
- var scrollerRef = (0, react_1.useRef)(null);
37
- var _g = (0, react_1.useState)(function () { return initialState; }), state = _g[0], setState = _g[1];
38
- (0, use_iso_morphic_effect_1.useIsoMorphicEffect)(function () {
39
- var scrollContainer = ref.current;
40
- if (!scrollContainer)
41
- return;
42
- // Create the scroller instance only once inside the effect
43
- if (!scrollerRef.current) {
44
- var container = (0, utils_1.getElement)(ref);
45
- scrollerRef.current = (0, scroller_1.createScroller)(container, scrollOpt);
46
- }
47
- var scrollWidth = scrollContainer.scrollWidth, clientWidth = scrollContainer.clientWidth, clientHeight = scrollContainer.clientHeight, scrollHeight = scrollContainer.scrollHeight;
48
- var isScrollable = clientWidth !== scrollWidth || clientHeight !== scrollHeight;
49
- setState(function (prev) { return (__assign(__assign({}, prev), { isScrollable: isScrollable })); });
50
- var handleScroll = function () {
51
- if (scrollContainer) {
52
- var scrollLeft = scrollContainer.scrollLeft, scrollTop = scrollContainer.scrollTop;
53
- var isAtLeftBoundary = scrollLeft === 0;
54
- var isAtRightBoundary = scrollLeft >= scrollWidth - clientWidth;
55
- var isAtTopBoundary = scrollTop === 0;
56
- var isAtBottomBoundary = scrollTop >= scrollHeight - clientHeight;
57
- var scrollState = __assign(__assign({}, state), { isScrolledLeft: isAtLeftBoundary, isScrolledRight: isAtRightBoundary, isScrolledTop: isAtTopBoundary, isScrolledBottom: isAtBottomBoundary, left: scrollLeft, top: scrollTop, maxScrollLeft: scrollWidth - clientWidth, maxScrollTop: scrollHeight - clientHeight, scrollPercentageX: isAtLeftBoundary
58
- ? 0
59
- : (scrollLeft / (scrollWidth - clientWidth)) * 100, scrollPercentageY: isAtTopBoundary
60
- ? 0
61
- : (scrollTop / (scrollHeight - clientHeight)) * 100 });
62
- setState(scrollState);
63
- }
64
- };
65
- handleScroll();
66
- scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.addEventListener('scroll', handleScroll);
67
- return function () { return scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.removeEventListener('scroll', handleScroll); };
68
- }, [state]);
69
- return {
70
- ref: ref,
71
- state: state,
72
- scrollLeft: (_a = scrollerRef.current) === null || _a === void 0 ? void 0 : _a.scrollToLeft,
73
- scrollRight: (_b = scrollerRef.current) === null || _b === void 0 ? void 0 : _b.scrollToRight,
74
- scrollBottom: (_c = scrollerRef.current) === null || _c === void 0 ? void 0 : _c.scrollToBottom,
75
- scrollTop: (_d = scrollerRef.current) === null || _d === void 0 ? void 0 : _d.scrollToTop,
76
- scrollCenter: (_e = scrollerRef.current) === null || _e === void 0 ? void 0 : _e.scrollToCenter,
77
- scrollTo: (_f = scrollerRef.current) === null || _f === void 0 ? void 0 : _f.scrollTo,
78
- };
79
- }
80
- exports.useScroll = useScroll;
@@ -1,13 +0,0 @@
1
- import { ScrollOptions } from '../types';
2
- export declare function useWindowScroll(props?: Partial<Omit<ScrollOptions, 'direction'>>): {
3
- state: {
4
- left: number;
5
- top: number;
6
- isScrolledTop: boolean;
7
- isScrolledBottom: boolean;
8
- };
9
- scrollTop: (offset?: number | undefined) => void;
10
- scrollBottom: (offset?: number | undefined) => void;
11
- scrollToTarget: (currentTarget: HTMLElement) => void;
12
- scrollTo: (position: number) => void;
13
- };
@@ -1,62 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.useWindowScroll = void 0;
15
- var react_1 = require("react");
16
- var scroller_1 = require("../scroller");
17
- var use_iso_morphic_effect_1 = require("./use-iso-morphic-effect");
18
- var utils_1 = require("../utils");
19
- function useWindowScroll(props) {
20
- var _a = (0, react_1.useState)(function () { return ({
21
- left: 0,
22
- top: 0,
23
- isScrolledTop: false,
24
- isScrolledBottom: false,
25
- }); }), state = _a[0], setState = _a[1];
26
- var container = window;
27
- var scrollOptions = __assign(__assign({}, utils_1.defaultScrollOptions), props);
28
- var scrollContainer = (0, scroller_1.createScroller)(container, scrollOptions);
29
- var handleScroll = (0, react_1.useCallback)(function () {
30
- var _a = (0, utils_1.resolveScrollValues)(container), scrollLeft = _a.scrollLeft, scrollTop = _a.scrollTop, clientHeight = _a.clientHeight, scrollHeight = _a.scrollHeight;
31
- var isAtTopBoundary = scrollTop === 0;
32
- var isAtBottomBoundary = scrollTop >= scrollHeight - clientHeight;
33
- var scrollState = {
34
- left: scrollLeft,
35
- top: scrollTop,
36
- isScrolledTop: isAtTopBoundary,
37
- isScrolledBottom: isAtBottomBoundary,
38
- };
39
- setState(scrollState);
40
- }, [container]);
41
- (0, use_iso_morphic_effect_1.useIsoMorphicEffect)(function () {
42
- handleScroll();
43
- container.addEventListener('scroll', handleScroll);
44
- return function () {
45
- container.removeEventListener('scroll', handleScroll);
46
- };
47
- }, [handleScroll]);
48
- var scrollTo = (0, react_1.useCallback)(function (position) {
49
- scrollContainer.scrollTo(position);
50
- }, [scrollContainer]);
51
- var scrollToTarget = (0, react_1.useCallback)(function (currentTarget) {
52
- scrollContainer.scrollToTarget(currentTarget);
53
- }, [scrollContainer]);
54
- var scrollTop = (0, react_1.useCallback)(function (offset) {
55
- scrollContainer.scrollToTop(offset);
56
- }, [scrollContainer]);
57
- var scrollBottom = (0, react_1.useCallback)(function (offset) {
58
- scrollContainer.scrollToBottom(offset);
59
- }, [scrollContainer]);
60
- return { state: state, scrollTop: scrollTop, scrollBottom: scrollBottom, scrollToTarget: scrollToTarget, scrollTo: scrollTo };
61
- }
62
- exports.useWindowScroll = useWindowScroll;
@@ -1,3 +0,0 @@
1
- export * from './types';
2
- export * from './hooks/use-scroll';
3
- export * from './hooks/use-window-scroll';
package/dist/cjs/index.js DELETED
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./types"), exports);
18
- __exportStar(require("./hooks/use-scroll"), exports);
19
- __exportStar(require("./hooks/use-window-scroll"), exports);
@@ -1,10 +0,0 @@
1
- import { ScrollOptions } from './types';
2
- export declare function createScroller(container: HTMLElement | Window, options?: ScrollOptions): {
3
- scrollTo: (to: number) => void;
4
- scrollToCenter: () => void;
5
- scrollToTarget: (target: HTMLElement, offset?: number) => void;
6
- scrollToLeft: (offset?: number) => void;
7
- scrollToRight: (offset?: number) => void;
8
- scrollToTop: (offset?: number) => void;
9
- scrollToBottom: (offset?: number) => void;
10
- };
@@ -1,94 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createScroller = void 0;
4
- var utils_1 = require("./utils");
5
- function createScroller(container, options) {
6
- if (options === void 0) { options = utils_1.defaultScrollOptions; }
7
- (0, utils_1.validateElement)(container);
8
- var duration = options.duration, easingOption = options.easingOption, direction = options.direction;
9
- var _a = (0, utils_1.resolveScrollValues)(container), scrollLeft = _a.scrollLeft, scrollTop = _a.scrollTop, clientWidth = _a.clientWidth, clientHeight = _a.clientHeight, scrollWidth = _a.scrollWidth, scrollHeight = _a.scrollHeight;
10
- function scroll(from, to, layout) {
11
- if (layout === void 0) { layout = direction; }
12
- var startTime = null;
13
- var requestId = 0;
14
- var distance = Math.abs(to - from);
15
- function calculateCurrentPosition(timeFraction) {
16
- var easingFunc = (0, utils_1.getEasing)(easingOption);
17
- return easingFunc(timeFraction) * distance + from;
18
- }
19
- function updateScrollPosition(currentPosition) {
20
- container.scrollTo({
21
- left: layout === 'horizontal' ? currentPosition : undefined,
22
- top: layout === 'vertical' ? currentPosition : undefined,
23
- });
24
- }
25
- function animateScroll(currentTime) {
26
- if (!startTime)
27
- startTime = currentTime;
28
- var elapsedTime = currentTime - startTime;
29
- var timeFraction = elapsedTime / duration;
30
- var currentPosition = calculateCurrentPosition(timeFraction);
31
- updateScrollPosition(currentPosition);
32
- if (timeFraction < 1) {
33
- requestId = requestAnimationFrame(animateScroll);
34
- }
35
- else {
36
- cancelAnimationFrame(requestId);
37
- }
38
- }
39
- requestId = requestAnimationFrame(animateScroll);
40
- }
41
- function scrollTo(to) {
42
- var from = direction === 'vertical' ? scrollTop : scrollLeft;
43
- scroll(from, to);
44
- }
45
- function scrollToCenter() {
46
- var from = 0;
47
- var to = 0;
48
- if (direction === 'vertical') {
49
- var scrollYCenterPosition = (scrollHeight - clientHeight) / 2;
50
- from = scrollTop;
51
- to = scrollYCenterPosition;
52
- }
53
- if (direction === 'horizontal') {
54
- var scrollXCenterPosition = (scrollWidth - clientWidth) / 2;
55
- from = scrollLeft;
56
- to = scrollXCenterPosition;
57
- }
58
- scroll(from, to, direction);
59
- }
60
- function scrollToTarget(target, offset) {
61
- if (offset === void 0) { offset = 0; }
62
- (0, utils_1.validateElement)(target);
63
- var offsetTop = target.offsetTop, offsetLeft = target.offsetLeft;
64
- var from = 0;
65
- var to = 0;
66
- if (direction === 'vertical') {
67
- from = scrollTop;
68
- to = offsetTop - offset;
69
- }
70
- if (direction === 'horizontal') {
71
- from = scrollLeft;
72
- to = offsetLeft - offset;
73
- }
74
- scroll(from, to, direction);
75
- }
76
- return {
77
- scrollTo: scrollTo,
78
- scrollToCenter: scrollToCenter,
79
- scrollToTarget: scrollToTarget,
80
- scrollToLeft: function (offset) {
81
- scroll(scrollLeft, offset || scrollLeft - clientWidth, 'horizontal');
82
- },
83
- scrollToRight: function (offset) {
84
- scroll(scrollLeft, offset || scrollLeft + clientWidth, 'horizontal');
85
- },
86
- scrollToTop: function (offset) {
87
- scroll(scrollTop, offset || scrollTop - clientHeight, 'vertical');
88
- },
89
- scrollToBottom: function (offset) {
90
- scroll(scrollTop, offset || scrollTop + clientHeight, 'vertical');
91
- },
92
- };
93
- }
94
- exports.createScroller = createScroller;
@@ -1,17 +0,0 @@
1
- export type ScrollOptions = {
2
- direction: 'horizontal' | 'vertical';
3
- duration: number;
4
- easingOption: EasingOptions;
5
- };
6
- export type ScrollerProps = {
7
- container: HTMLElement | Window;
8
- options: ScrollOptions;
9
- };
10
- export type EasingOptions = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';
11
- export type EasingFunction = (t: number) => number;
12
- export interface EasingFunctions {
13
- linear: EasingFunction;
14
- 'ease-in': EasingFunction;
15
- 'ease-out': EasingFunction;
16
- 'ease-in-out': EasingFunction;
17
- }
package/dist/cjs/types.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,37 +0,0 @@
1
- import { RefObject } from 'react';
2
- import { EasingFunction, EasingFunctions, EasingOptions, ScrollOptions } from './types';
3
- export declare const isServer: boolean;
4
- export declare const defaultScrollOptions: ScrollOptions;
5
- /**
6
- * Resolves scroll values based on the type of element.
7
- * @param {HTMLElement | Window} element - The element to retrieve scroll values from.
8
- * @returns {object} - An object containing scroll-related properties.
9
- */
10
- export declare const resolveScrollValues: (element: HTMLElement | Window) => {
11
- scrollLeft: number;
12
- scrollTop: number;
13
- scrollWidth: number;
14
- clientWidth: number;
15
- clientHeight: number;
16
- scrollHeight: number;
17
- scrollLeftMax: number;
18
- scrollTopMax: number;
19
- };
20
- /**
21
- * Validate if the element passed to the function is valid.
22
- * @param {HTMLElement | Window} element - The element to validate.
23
- */
24
- export declare function validateElement(element?: HTMLElement | Window): void;
25
- /**
26
- * Get the DOM element from a React ref object.
27
- * @param {RefObject<HTMLElement>} ref - The React ref object.
28
- * @returns {HTMLElement} - The DOM element.
29
- */
30
- export declare const getElement: (ref: RefObject<HTMLElement>) => HTMLElement;
31
- export declare const easingMap: EasingFunctions;
32
- /**
33
- * Get an easing function based on the provided easing option or the default option.
34
- * @param {EasingOptions} easing - The easing option.
35
- * @returns {EasingFunction} - The easing function.
36
- */
37
- export declare const getEasing: (easing?: EasingOptions) => EasingFunction;
package/dist/cjs/utils.js DELETED
@@ -1,92 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getEasing = exports.easingMap = exports.getElement = exports.validateElement = exports.resolveScrollValues = exports.defaultScrollOptions = exports.isServer = void 0;
4
- // Check if the code is running on the server-side.
5
- exports.isServer = typeof window === 'undefined' || typeof document === 'undefined';
6
- // Default scroll options used if no options are provided.
7
- exports.defaultScrollOptions = {
8
- direction: 'vertical',
9
- duration: 300,
10
- easingOption: 'ease-in-out',
11
- };
12
- /**
13
- * Resolves scroll values based on the type of element.
14
- * @param {HTMLElement | Window} element - The element to retrieve scroll values from.
15
- * @returns {object} - An object containing scroll-related properties.
16
- */
17
- var resolveScrollValues = function (element) {
18
- var isWindow = element instanceof Window;
19
- var docElement = document.documentElement;
20
- var docBody = document.body;
21
- var scrollLeftMax = isWindow
22
- ? Math.max(docBody.scrollLeft, docElement.scrollLeft)
23
- : element.scrollWidth - element.clientWidth;
24
- var scrollTopMax = isWindow
25
- ? Math.max(docBody.scrollTop, docElement.scrollTop)
26
- : element.scrollHeight - element.clientHeight;
27
- return {
28
- scrollLeft: isWindow ? docBody.scrollLeft || docElement.scrollLeft : element.scrollLeft,
29
- scrollTop: isWindow ? docBody.scrollTop || docElement.scrollTop : element.scrollTop,
30
- scrollWidth: isWindow ? docBody.scrollWidth || docElement.scrollWidth : element.scrollWidth,
31
- clientWidth: isWindow ? docBody.clientWidth || docElement.clientWidth : element.clientWidth,
32
- clientHeight: isWindow ? docBody.clientHeight || docElement.clientHeight : element.clientHeight,
33
- scrollHeight: isWindow ? docBody.scrollHeight || docElement.scrollHeight : element.scrollHeight,
34
- scrollLeftMax: scrollLeftMax,
35
- scrollTopMax: scrollTopMax,
36
- };
37
- };
38
- exports.resolveScrollValues = resolveScrollValues;
39
- /**
40
- * Validate if the element passed to the function is valid.
41
- * @param {HTMLElement | Window} element - The element to validate.
42
- */
43
- function validateElement(element) {
44
- if (element === undefined) {
45
- throw new Error("The element passed to scroller() was undefined");
46
- }
47
- if (!(element instanceof HTMLElement || Window)) {
48
- throw new TypeError("\n The element passed to scroller() must be a valid element. \n You passed ".concat(element, ".\n "));
49
- }
50
- }
51
- exports.validateElement = validateElement;
52
- /**
53
- * Get the DOM element from a React ref object.
54
- * @param {RefObject<HTMLElement>} ref - The React ref object.
55
- * @returns {HTMLElement} - The DOM element.
56
- */
57
- var getElement = function (ref) {
58
- if (!ref.current) {
59
- throw new Error("Could not resolve ref object: ".concat(ref.current));
60
- }
61
- return ref.current;
62
- };
63
- exports.getElement = getElement;
64
- // Map of easing functions for scroll animations.
65
- exports.easingMap = {
66
- linear: function (t) {
67
- return t;
68
- },
69
- 'ease-in': function (t) {
70
- return t * t;
71
- },
72
- 'ease-out': function (t) {
73
- return t * (2 - t);
74
- },
75
- 'ease-in-out': function (t) {
76
- return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
77
- },
78
- };
79
- /**
80
- * Get an easing function based on the provided easing option or the default option.
81
- * @param {EasingOptions} easing - The easing option.
82
- * @returns {EasingFunction} - The easing function.
83
- */
84
- var getEasing = function (easing) {
85
- var easeFunc = exports.easingMap[easing || exports.defaultScrollOptions.easingOption];
86
- if (!easeFunc) {
87
- var options = Object.keys(exports.easingMap).join(',');
88
- throw new Error("Scroll error: scroller does not support an easing option of \"".concat(easing, "\". Supported options are ").concat(options));
89
- }
90
- return easeFunc;
91
- };
92
- exports.getEasing = getEasing;
@@ -1,2 +0,0 @@
1
- import { useEffect } from 'react';
2
- export declare const useIsoMorphicEffect: typeof useEffect;
@@ -1,3 +0,0 @@
1
- import { useLayoutEffect, useEffect } from 'react';
2
- import { isServer } from '../utils';
3
- export var useIsoMorphicEffect = isServer ? useEffect : useLayoutEffect;
@@ -1,24 +0,0 @@
1
- /// <reference types="react" />
2
- import { ScrollOptions } from '../types';
3
- export declare function useScroll<T extends HTMLElement>(props?: Partial<ScrollOptions>): {
4
- ref: import("react").RefObject<T>;
5
- state: {
6
- left: number;
7
- top: number;
8
- isScrollable: boolean;
9
- isScrolledLeft: boolean;
10
- isScrolledRight: boolean;
11
- isScrolledTop: boolean;
12
- isScrolledBottom: boolean;
13
- maxScrollLeft: number;
14
- maxScrollTop: number;
15
- scrollPercentageX: number;
16
- scrollPercentageY: number;
17
- };
18
- scrollLeft: ((offset?: number | undefined) => void) | undefined;
19
- scrollRight: ((offset?: number | undefined) => void) | undefined;
20
- scrollBottom: ((offset?: number | undefined) => void) | undefined;
21
- scrollTop: ((offset?: number | undefined) => void) | undefined;
22
- scrollCenter: (() => void) | undefined;
23
- scrollTo: ((to: number) => void) | undefined;
24
- };
@@ -1,76 +0,0 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- import { useRef, useState } from 'react';
13
- import { createScroller } from '../scroller';
14
- import { defaultScrollOptions, getElement } from '../utils';
15
- import { useIsoMorphicEffect } from './use-iso-morphic-effect';
16
- var initialState = {
17
- left: 0,
18
- top: 0,
19
- isScrollable: false,
20
- isScrolledLeft: true,
21
- isScrolledRight: false,
22
- isScrolledTop: true,
23
- isScrolledBottom: false,
24
- maxScrollLeft: 0,
25
- maxScrollTop: 0,
26
- scrollPercentageX: 0,
27
- scrollPercentageY: 0, // Percentage of vertical scroll covered
28
- };
29
- export function useScroll(props) {
30
- var _a, _b, _c, _d, _e, _f;
31
- var ref = useRef(null);
32
- var scrollOpt = __assign(__assign({}, defaultScrollOptions), props);
33
- var scrollerRef = useRef(null);
34
- var _g = useState(function () { return initialState; }), state = _g[0], setState = _g[1];
35
- useIsoMorphicEffect(function () {
36
- var scrollContainer = ref.current;
37
- if (!scrollContainer)
38
- return;
39
- // Create the scroller instance only once inside the effect
40
- if (!scrollerRef.current) {
41
- var container = getElement(ref);
42
- scrollerRef.current = createScroller(container, scrollOpt);
43
- }
44
- var scrollWidth = scrollContainer.scrollWidth, clientWidth = scrollContainer.clientWidth, clientHeight = scrollContainer.clientHeight, scrollHeight = scrollContainer.scrollHeight;
45
- var isScrollable = clientWidth !== scrollWidth || clientHeight !== scrollHeight;
46
- setState(function (prev) { return (__assign(__assign({}, prev), { isScrollable: isScrollable })); });
47
- var handleScroll = function () {
48
- if (scrollContainer) {
49
- var scrollLeft = scrollContainer.scrollLeft, scrollTop = scrollContainer.scrollTop;
50
- var isAtLeftBoundary = scrollLeft === 0;
51
- var isAtRightBoundary = scrollLeft >= scrollWidth - clientWidth;
52
- var isAtTopBoundary = scrollTop === 0;
53
- var isAtBottomBoundary = scrollTop >= scrollHeight - clientHeight;
54
- var scrollState = __assign(__assign({}, state), { isScrolledLeft: isAtLeftBoundary, isScrolledRight: isAtRightBoundary, isScrolledTop: isAtTopBoundary, isScrolledBottom: isAtBottomBoundary, left: scrollLeft, top: scrollTop, maxScrollLeft: scrollWidth - clientWidth, maxScrollTop: scrollHeight - clientHeight, scrollPercentageX: isAtLeftBoundary
55
- ? 0
56
- : (scrollLeft / (scrollWidth - clientWidth)) * 100, scrollPercentageY: isAtTopBoundary
57
- ? 0
58
- : (scrollTop / (scrollHeight - clientHeight)) * 100 });
59
- setState(scrollState);
60
- }
61
- };
62
- handleScroll();
63
- scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.addEventListener('scroll', handleScroll);
64
- return function () { return scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.removeEventListener('scroll', handleScroll); };
65
- }, [state]);
66
- return {
67
- ref: ref,
68
- state: state,
69
- scrollLeft: (_a = scrollerRef.current) === null || _a === void 0 ? void 0 : _a.scrollToLeft,
70
- scrollRight: (_b = scrollerRef.current) === null || _b === void 0 ? void 0 : _b.scrollToRight,
71
- scrollBottom: (_c = scrollerRef.current) === null || _c === void 0 ? void 0 : _c.scrollToBottom,
72
- scrollTop: (_d = scrollerRef.current) === null || _d === void 0 ? void 0 : _d.scrollToTop,
73
- scrollCenter: (_e = scrollerRef.current) === null || _e === void 0 ? void 0 : _e.scrollToCenter,
74
- scrollTo: (_f = scrollerRef.current) === null || _f === void 0 ? void 0 : _f.scrollTo,
75
- };
76
- }
@@ -1,13 +0,0 @@
1
- import { ScrollOptions } from '../types';
2
- export declare function useWindowScroll(props?: Partial<Omit<ScrollOptions, 'direction'>>): {
3
- state: {
4
- left: number;
5
- top: number;
6
- isScrolledTop: boolean;
7
- isScrolledBottom: boolean;
8
- };
9
- scrollTop: (offset?: number | undefined) => void;
10
- scrollBottom: (offset?: number | undefined) => void;
11
- scrollToTarget: (currentTarget: HTMLElement) => void;
12
- scrollTo: (position: number) => void;
13
- };
@@ -1,58 +0,0 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- import { useCallback, useState } from 'react';
13
- import { createScroller } from '../scroller';
14
- import { useIsoMorphicEffect } from './use-iso-morphic-effect';
15
- import { defaultScrollOptions, resolveScrollValues } from '../utils';
16
- export function useWindowScroll(props) {
17
- var _a = useState(function () { return ({
18
- left: 0,
19
- top: 0,
20
- isScrolledTop: false,
21
- isScrolledBottom: false,
22
- }); }), state = _a[0], setState = _a[1];
23
- var container = window;
24
- var scrollOptions = __assign(__assign({}, defaultScrollOptions), props);
25
- var scrollContainer = createScroller(container, scrollOptions);
26
- var handleScroll = useCallback(function () {
27
- var _a = resolveScrollValues(container), scrollLeft = _a.scrollLeft, scrollTop = _a.scrollTop, clientHeight = _a.clientHeight, scrollHeight = _a.scrollHeight;
28
- var isAtTopBoundary = scrollTop === 0;
29
- var isAtBottomBoundary = scrollTop >= scrollHeight - clientHeight;
30
- var scrollState = {
31
- left: scrollLeft,
32
- top: scrollTop,
33
- isScrolledTop: isAtTopBoundary,
34
- isScrolledBottom: isAtBottomBoundary,
35
- };
36
- setState(scrollState);
37
- }, [container]);
38
- useIsoMorphicEffect(function () {
39
- handleScroll();
40
- container.addEventListener('scroll', handleScroll);
41
- return function () {
42
- container.removeEventListener('scroll', handleScroll);
43
- };
44
- }, [handleScroll]);
45
- var scrollTo = useCallback(function (position) {
46
- scrollContainer.scrollTo(position);
47
- }, [scrollContainer]);
48
- var scrollToTarget = useCallback(function (currentTarget) {
49
- scrollContainer.scrollToTarget(currentTarget);
50
- }, [scrollContainer]);
51
- var scrollTop = useCallback(function (offset) {
52
- scrollContainer.scrollToTop(offset);
53
- }, [scrollContainer]);
54
- var scrollBottom = useCallback(function (offset) {
55
- scrollContainer.scrollToBottom(offset);
56
- }, [scrollContainer]);
57
- return { state: state, scrollTop: scrollTop, scrollBottom: scrollBottom, scrollToTarget: scrollToTarget, scrollTo: scrollTo };
58
- }
@@ -1,3 +0,0 @@
1
- export * from './types';
2
- export * from './hooks/use-scroll';
3
- export * from './hooks/use-window-scroll';
package/dist/esm/index.js DELETED
@@ -1,3 +0,0 @@
1
- export * from './types';
2
- export * from './hooks/use-scroll';
3
- export * from './hooks/use-window-scroll';
@@ -1,10 +0,0 @@
1
- import { ScrollOptions } from './types';
2
- export declare function createScroller(container: HTMLElement | Window, options?: ScrollOptions): {
3
- scrollTo: (to: number) => void;
4
- scrollToCenter: () => void;
5
- scrollToTarget: (target: HTMLElement, offset?: number) => void;
6
- scrollToLeft: (offset?: number) => void;
7
- scrollToRight: (offset?: number) => void;
8
- scrollToTop: (offset?: number) => void;
9
- scrollToBottom: (offset?: number) => void;
10
- };