diff --git a/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts b/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts index 69815ff6e..8f92556a2 100644 --- a/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts +++ b/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts @@ -1978,6 +1978,41 @@ export class PresentationEditor extends EventEmitter { } } + /** + * Scrolls a specific page into view. + * + * @param pageNumber - One-based page number to scroll to (e.g., 1 for first page) + * @param scrollBehavior - Scroll behavior ('auto' | 'smooth'). Defaults to 'smooth'. + * @returns True if the page was scrolled to, false if layout not available or invalid page + * + * @example + * ```typescript + * // Smooth scroll to first page + * presentationEditor.scrollToPage(1); + * + * // Instant scroll to page 5 + * presentationEditor.scrollToPage(5, 'auto'); + * ``` + */ + scrollToPage(pageNumber: number, scrollBehavior: ScrollBehavior = 'smooth'): boolean { + const layout = this.#layoutState.layout; + if (!layout) return false; + + // Convert 1-based page number to 0-based index + const pageIndex = pageNumber - 1; + + // Clamp to valid page range + const maxPage = layout.pages.length - 1; + if (pageIndex < 0 || pageIndex > maxPage) return false; + + const pageEl = getPageElementByIndex(this.#viewportHost, pageIndex); + if (pageEl) { + pageEl.scrollIntoView({ block: 'start', inline: 'nearest', behavior: scrollBehavior }); + return true; + } + return false; + } + /** * Get document position from viewport coordinates (header/footer-aware). *