import { BasePluginConfig, EventHook } from '@embedpdf/core'; import { PdfPageObjectWithRotatedSize, Rect, Rotation } from '@embedpdf/models'; import { ViewportMetrics } from '@embedpdf/plugin-viewport'; import { VirtualItem } from './types/virtual-item'; export type ScrollBehavior = 'instant' | 'smooth' | 'auto'; export interface PageChangeState { isChanging: boolean; targetPage: number; fromPage: number; startTime: number; } export interface ScrollDocumentState { virtualItems: VirtualItem[]; totalPages: number; currentPage: number; totalContentSize: { width: number; height: number; }; strategy: ScrollStrategy; pageGap: number; visiblePages: number[]; pageVisibilityMetrics: PageVisibilityMetrics[]; renderedPageIndexes: number[]; scrollOffset: { x: number; y: number; }; startSpacing: number; endSpacing: number; pageChangeState: PageChangeState; } export interface ScrollState { defaultStrategy: ScrollStrategy; defaultPageGap: number; defaultBufferSize: number; documents: Record; } export interface ScrollerLayout { startSpacing: number; endSpacing: number; totalWidth: number; totalHeight: number; pageGap: number; strategy: ScrollStrategy; items: VirtualItem[]; } export declare enum ScrollStrategy { Vertical = "vertical", Horizontal = "horizontal" } export interface PageVisibilityMetrics { pageNumber: number; viewportX: number; viewportY: number; visiblePercentage: number; original: { pageX: number; pageY: number; visibleWidth: number; visibleHeight: number; scale: number; }; scaled: { pageX: number; pageY: number; visibleWidth: number; visibleHeight: number; scale: number; }; } export interface ScrollMetrics { currentPage: number; visiblePages: number[]; pageVisibilityMetrics: PageVisibilityMetrics[]; renderedPageIndexes: number[]; scrollOffset: { x: number; y: number; }; startSpacing: number; endSpacing: number; } export interface ScrollPluginConfig extends BasePluginConfig { defaultStrategy?: ScrollStrategy; defaultPageGap?: number; defaultBufferSize?: number; } export type LayoutChangePayload = Pick; export interface ScrollToPageOptions { pageNumber: number; pageCoordinates?: { x: number; y: number; }; behavior?: ScrollBehavior; /** * Horizontal alignment as a percentage (0-100). * 0 = target at left edge, 50 = centered, 100 = target at right edge. */ alignX?: number; /** * Vertical alignment as a percentage (0-100). * 0 = target at top edge, 50 = centered, 100 = target at bottom edge. * Useful for mobile where UI overlays may cover part of the screen (e.g., alignY: 25 for top quarter). */ alignY?: number; } export interface PageChangeEvent { documentId: string; pageNumber: number; totalPages: number; } export interface ScrollEvent { documentId: string; metrics: ScrollMetrics; } export interface LayoutChangeEvent { documentId: string; layout: LayoutChangePayload; } export interface PageChangeStateEvent { documentId: string; state: PageChangeState; } export interface LayoutReadyEvent { documentId: string; /** True only on the first layout ready after document load, false on subsequent (e.g., tab switches) */ isInitial: boolean; pageNumber: number; totalPages: number; } export interface ScrollScope { getCurrentPage(): number; getTotalPages(): number; getPageChangeState(): PageChangeState; scrollToPage(options: ScrollToPageOptions): void; scrollToNextPage(behavior?: ScrollBehavior): void; scrollToPreviousPage(behavior?: ScrollBehavior): void; getSpreadPagesWithRotatedSize(): PdfPageObjectWithRotatedSize[][]; getMetrics(viewport?: ViewportMetrics): ScrollMetrics; getLayout(): LayoutChangePayload; getRectPositionForPage(page: number, rect: Rect, scale?: number, rotation?: Rotation): Rect | null; setScrollStrategy(strategy: ScrollStrategy): void; onPageChange: EventHook; onScroll: EventHook; onLayoutChange: EventHook; } export interface ScrollCapability { getCurrentPage(): number; getTotalPages(): number; getPageChangeState(): PageChangeState; scrollToPage(options: ScrollToPageOptions): void; scrollToNextPage(behavior?: ScrollBehavior): void; scrollToPreviousPage(behavior?: ScrollBehavior): void; getMetrics(viewport?: ViewportMetrics): ScrollMetrics; getLayout(): LayoutChangePayload; getRectPositionForPage(page: number, rect: Rect, scale?: number, rotation?: Rotation): Rect | null; forDocument(documentId: string): ScrollScope; setScrollStrategy(strategy: ScrollStrategy, documentId?: string): void; getPageGap(): number; onPageChange: EventHook; onScroll: EventHook; onLayoutChange: EventHook; onLayoutReady: EventHook; onPageChangeState: EventHook; onStateChange: EventHook; }