107 lines
3.5 KiB
TypeScript
107 lines
3.5 KiB
TypeScript
/*!---------------------------------------------------------------------------------------------
|
|
* Copyright (c) StackBlitz. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
export interface StickToBottomState {
|
|
scrollTop: number;
|
|
lastScrollTop?: number;
|
|
ignoreScrollToTop?: number;
|
|
targetScrollTop: number;
|
|
calculatedTargetScrollTop: number;
|
|
scrollDifference: number;
|
|
resizeDifference: number;
|
|
animation?: {
|
|
behavior: "instant" | Required<SpringAnimation>;
|
|
ignoreEscapes: boolean;
|
|
promise: Promise<boolean>;
|
|
};
|
|
lastTick?: number;
|
|
velocity: number;
|
|
accumulated: number;
|
|
escapedFromLock: boolean;
|
|
isAtBottom: boolean;
|
|
isNearBottom: boolean;
|
|
resizeObserver?: ResizeObserver;
|
|
}
|
|
declare const DEFAULT_SPRING_ANIMATION: {
|
|
/**
|
|
* A value from 0 to 1, on how much to damp the animation.
|
|
* 0 means no damping, 1 means full damping.
|
|
*
|
|
* @default 0.7
|
|
*/
|
|
damping: number;
|
|
/**
|
|
* The stiffness of how fast/slow the animation gets up to speed.
|
|
*
|
|
* @default 0.05
|
|
*/
|
|
stiffness: number;
|
|
/**
|
|
* The inertial mass associated with the animation.
|
|
* Higher numbers make the animation slower.
|
|
*
|
|
* @default 1.25
|
|
*/
|
|
mass: number;
|
|
};
|
|
export interface SpringAnimation extends Partial<typeof DEFAULT_SPRING_ANIMATION> {
|
|
}
|
|
export type Animation = ScrollBehavior | SpringAnimation;
|
|
export interface ScrollElements {
|
|
scrollElement: HTMLElement;
|
|
contentElement: HTMLElement;
|
|
}
|
|
export type GetTargetScrollTop = (targetScrollTop: number, context: ScrollElements) => number;
|
|
export interface StickToBottomOptions extends SpringAnimation {
|
|
resize?: Animation;
|
|
initial?: Animation | boolean;
|
|
targetScrollTop?: GetTargetScrollTop;
|
|
}
|
|
export type ScrollToBottomOptions = ScrollBehavior | {
|
|
animation?: Animation;
|
|
/**
|
|
* Whether to wait for any existing scrolls to finish before
|
|
* performing this one. Or if a millisecond is passed,
|
|
* it will wait for that duration before performing the scroll.
|
|
*
|
|
* @default false
|
|
*/
|
|
wait?: boolean | number;
|
|
/**
|
|
* Whether to prevent the user from escaping the scroll,
|
|
* by scrolling up with their mouse.
|
|
*/
|
|
ignoreEscapes?: boolean;
|
|
/**
|
|
* Only scroll to the bottom if we're already at the bottom.
|
|
*
|
|
* @default false
|
|
*/
|
|
preserveScrollPosition?: boolean;
|
|
/**
|
|
* The extra duration in ms that this scroll event should persist for.
|
|
* (in addition to the time that it takes to get to the bottom)
|
|
*
|
|
* Not to be confused with the duration of the animation -
|
|
* for that you should adjust the animation option.
|
|
*
|
|
* @default 0
|
|
*/
|
|
duration?: number | Promise<void>;
|
|
};
|
|
export type ScrollToBottom = (scrollOptions?: ScrollToBottomOptions) => Promise<boolean> | boolean;
|
|
export type StopScroll = () => void;
|
|
export declare const useStickToBottom: (options?: StickToBottomOptions) => StickToBottomInstance;
|
|
export interface StickToBottomInstance {
|
|
contentRef: React.MutableRefObject<HTMLElement | null> & React.RefCallback<HTMLElement>;
|
|
scrollRef: React.MutableRefObject<HTMLElement | null> & React.RefCallback<HTMLElement>;
|
|
scrollToBottom: ScrollToBottom;
|
|
stopScroll: StopScroll;
|
|
isAtBottom: boolean;
|
|
isNearBottom: boolean;
|
|
escapedFromLock: boolean;
|
|
state: StickToBottomState;
|
|
}
|
|
export {};
|