/**
 * Easing function signature
 */
export type EasingFunction = (t: number) => number;
/**
 * Scroll direction
 */
export type ScrollDirection = 1 | -1 | 0;
/**
 * Current scroll state and progress information
 */
export interface ScrollProgress {
    /** Current scroll position */
    current: number;
    /** Target scroll position */
    target: number;
    /** Maximum scrollable distance */
    max: number;
    /** Scroll progress as percentage (0-1) */
    progress: number;
    /** Current velocity (pixels per frame) */
    velocity: number;
    /** Scroll direction */
    direction: ScrollDirection;
    /** Whether currently at top */
    isAtTop: boolean;
    /** Whether currently at bottom */
    isAtBottom: boolean;
}
/**
 * Velocity tracking data
 */
export interface Velocity {
    /** Current velocity */
    current: number;
    /** Previous velocity */
    previous: number;
    /** Timestamp of last update */
    timestamp: number;
}
/**
 * Snap point information
 */
export interface SnapPoint {
    /** Scroll position of this snap point */
    position: number;
    /** Element that defines this snap point */
    element: HTMLElement;
    /** Snap alignment (start, center, end) */
    align: 'start' | 'center' | 'end';
}
/**
 * Options for programmatic scrollTo
 */
export interface ScrollToOptions {
    /** Duration of animation in milliseconds */
    duration?: number;
    /** Easing function for animation */
    easing?: EasingFunction;
    /** Whether to respect snap points */
    snapToNearest?: boolean;
    /** Callback when scroll completes */
    onComplete?: () => void;
}
/**
 * Configuration for smooth scrolling engine
 */
export interface SmoothScrollConfig {
    /** Linear interpolation factor (0-1, lower = smoother but slower) */
    lerp: number;
    /** Easing function applied to interpolation */
    easing: EasingFunction;
    /** Whether to respect CSS snap points */
    respectSnapPoints: boolean;
    /** Easing function for snap animations */
    snapEasing: EasingFunction;
    /** Velocity threshold to trigger snap (lower = more sensitive) */
    snapVelocityThreshold: number;
    /** Lerp factor for snap animations (higher = faster snap) */
    snapLerp: number;
    /** Whether to enable elastic edge effect */
    elasticEdges: boolean;
    /** Strength of elastic effect (0-1) */
    elasticStrength: number;
    /** Whether to enable rubber-band overscroll */
    rubberBand: boolean;
    /** Strength of rubber-band effect (0-1) */
    rubberBandStrength: number;
    /** Scroll multiplier for wheel events */
    wheelMultiplier: number;
    /** Scroll multiplier for touchpad events */
    touchpadMultiplier: number;
    /** Target FPS (30, 60, or 120) */
    targetFPS: number;
    /** Whether to auto-adjust FPS on performance drops */
    adaptiveQuality: boolean;
    /** Callback fired on each scroll update */
    onScroll?: (progress: ScrollProgress) => void;
    /** Callback fired when snap point is reached */
    onSnapPointReached?: (snapPoint: SnapPoint) => void;
    /** Callback fired when velocity changes significantly */
    onVelocityChange?: (velocity: number) => void;
}
/**
 * Partial config for updates
 */
export type SmoothScrollConfigUpdate = Partial<SmoothScrollConfig>;
/**
 * Performance metrics
 */
export interface PerformanceMetrics {
    /** Current frames per second */
    fps: number;
    /** Average frame time in milliseconds */
    avgFrameTime: number;
    /** Number of dropped frames */
    droppedFrames: number;
    /** Total frames rendered */
    totalFrames: number;
    /** Whether performance is below target */
    isBelowTarget: boolean;
}
/**
 * Internal state of the smooth scroll engine
 */
export interface EngineState {
    /** Current interpolated position */
    current: number;
    /** Target scroll position */
    target: number;
    /** Current velocity */
    velocity: Velocity;
    /** Whether engine is running */
    isRunning: boolean;
    /** Whether currently animating to snap point */
    isSnapping: boolean;
    /** Current snap animation progress */
    snapProgress: number;
    /** Start position for snap animation */
    snapStartPosition: number;
    /** Target snap point */
    targetSnapPoint: SnapPoint | null;
    /** Timestamp of snap animation start */
    snapStartTime: number;
}
