@embedpdf/plugin-scroll 1.0.10 → 1.0.11

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.
package/dist/index.cjs CHANGED
@@ -374,11 +374,13 @@ var ScrollPlugin = class extends import_core.BasePlugin {
374
374
  this.currentScale = 1;
375
375
  this.currentRotation = import_models2.Rotation.Degree0;
376
376
  this.currentPage = 1;
377
+ this.layoutReady = false;
377
378
  this.layout$ = (0, import_core.createBehaviorEmitter)();
378
379
  this.scroll$ = (0, import_core.createBehaviorEmitter)();
379
380
  this.state$ = (0, import_core.createBehaviorEmitter)();
380
381
  this.scrollerLayout$ = (0, import_core.createBehaviorEmitter)();
381
382
  this.pageChange$ = (0, import_core.createBehaviorEmitter)();
383
+ this.layoutReady$ = (0, import_core.createBehaviorEmitter)();
382
384
  this.viewport = this.registry.getPlugin("viewport").provides();
383
385
  this.strategyConfig = {
384
386
  pageGap: this.config?.pageGap ?? 10,
@@ -483,6 +485,11 @@ var ScrollPlugin = class extends import_core.BasePlugin {
483
485
  const pages = (0, import_core.getPagesWithRotatedSize)(this.coreState.core);
484
486
  this.refreshAll(pages, this.viewport.getMetrics());
485
487
  }
488
+ setLayoutReady() {
489
+ if (this.layoutReady) return;
490
+ this.layoutReady = true;
491
+ this.layoutReady$.emit(true);
492
+ }
486
493
  buildCapability() {
487
494
  return {
488
495
  onStateChange: this.state$.on,
@@ -490,6 +497,7 @@ var ScrollPlugin = class extends import_core.BasePlugin {
490
497
  onScroll: this.scroll$.on,
491
498
  onPageChange: this.pageChange$.on,
492
499
  onScrollerData: this.scrollerLayout$.on,
500
+ onLayoutReady: this.layoutReady$.on,
493
501
  getCurrentPage: () => this.currentPage,
494
502
  getTotalPages: () => this.state.totalPages,
495
503
  scrollToPage: (options) => {
@@ -577,6 +585,8 @@ var ScrollPlugin = class extends import_core.BasePlugin {
577
585
  this.scroll$.clear();
578
586
  this.pageChange$.clear();
579
587
  this.state$.clear();
588
+ this.scrollerLayout$.clear();
589
+ this.layoutReady$.clear();
580
590
  super.destroy();
581
591
  }
582
592
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/scroll-plugin.ts","../src/lib/types.ts","../src/lib/strategies/base-strategy.ts","../src/lib/strategies/vertical-strategy.ts","../src/lib/strategies/horizontal-strategy.ts","../src/lib/actions.ts","../src/lib/selectors.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["export * from './lib';\n","import {\n BasePlugin,\n CoreState,\n PluginRegistry,\n SET_DOCUMENT,\n SET_PAGES,\n SET_ROTATION,\n StoreState,\n createBehaviorEmitter,\n createEmitter,\n getPagesWithRotatedSize,\n} from '@embedpdf/core';\nimport {\n PdfPageObject,\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n restoreRect,\n rotateRect,\n Rotation,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportCapability, ViewportMetrics, ViewportPlugin } from '@embedpdf/plugin-viewport';\nimport {\n ScrollCapability,\n ScrollPluginConfig,\n ScrollStrategy,\n ScrollMetrics,\n ScrollState,\n LayoutChangePayload,\n ScrollerLayout,\n ScrollToPageOptions,\n PageChangePayload,\n} from './types';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './strategies/base-strategy';\nimport { VerticalScrollStrategy } from './strategies/vertical-strategy';\nimport { HorizontalScrollStrategy } from './strategies/horizontal-strategy';\nimport { updateScrollState, ScrollAction, updateTotalPages } from './actions';\nimport { VirtualItem } from './types/virtual-item';\nimport { getScrollerLayout } from './selectors';\n\ntype PartialScroll = Partial<ScrollState>;\ntype Emits = {\n layout?: LayoutChangePayload;\n metrics?: ScrollMetrics;\n};\n\nexport class ScrollPlugin extends BasePlugin<\n ScrollPluginConfig,\n ScrollCapability,\n ScrollState,\n ScrollAction\n> {\n static readonly id = 'scroll' as const;\n private viewport: ViewportCapability;\n private strategy: BaseScrollStrategy;\n private strategyConfig: ScrollStrategyConfig;\n private currentScale: number = 1;\n private currentRotation: Rotation = Rotation.Degree0;\n private initialPage?: number;\n private currentPage: number = 1;\n\n private readonly layout$ = createBehaviorEmitter<LayoutChangePayload>();\n private readonly scroll$ = createBehaviorEmitter<ScrollMetrics>();\n private readonly state$ = createBehaviorEmitter<ScrollState>();\n private readonly scrollerLayout$ = createBehaviorEmitter<ScrollerLayout>();\n private readonly pageChange$ = createBehaviorEmitter<PageChangePayload>();\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n private config?: ScrollPluginConfig,\n ) {\n super(id, registry);\n\n this.viewport = this.registry.getPlugin<ViewportPlugin>('viewport')!.provides();\n\n this.strategyConfig = {\n pageGap: this.config?.pageGap ?? 10,\n viewportGap: this.viewport.getViewportGap(),\n bufferSize: this.config?.bufferSize ?? 2,\n };\n\n this.strategy =\n this.config?.strategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n this.initialPage = this.config?.initialPage;\n this.currentScale = this.coreState.core.scale;\n this.currentRotation = this.coreState.core.rotation;\n // Subscribe to viewport and page manager events\n this.viewport.onViewportChange((vp) => this.commitMetrics(this.computeMetrics(vp)), {\n mode: 'throttle',\n wait: 250,\n });\n this.coreStore.onAction(SET_DOCUMENT, (_action, state) => {\n const totalPages = state.core.pages.length;\n this.dispatch(updateTotalPages(totalPages));\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages });\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics());\n });\n this.coreStore.onAction(SET_ROTATION, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n this.coreStore.onAction(SET_PAGES, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴘᴜᴛᴇʀs */\n /* ------------------------------------------------------------------ */\n\n private computeLayout(pages: PdfPageObjectWithRotatedSize[][]) {\n const virtualItems = this.strategy.createVirtualItems(pages);\n const totalContentSize = this.strategy.getTotalContentSize(virtualItems);\n return { virtualItems, totalContentSize };\n }\n\n private computeMetrics(vp: ViewportMetrics, items: VirtualItem[] = this.state.virtualItems) {\n return this.strategy.handleScroll(vp, items, this.currentScale);\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴍɪᴛ (single source of truth) */\n /* ------------------------------------------------------------------ */\n\n private commit(stateDelta: PartialScroll, emit?: Emits) {\n /* update Redux-like store */\n this.dispatch(updateScrollState(stateDelta));\n\n /* fire optional events */\n if (emit?.layout) this.layout$.emit(emit.layout);\n if (emit?.metrics) {\n this.scroll$.emit(emit.metrics);\n\n if (emit.metrics.currentPage !== this.currentPage) {\n this.currentPage = emit.metrics.currentPage;\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages: this.state.totalPages });\n }\n }\n\n /* keep scroller-layout reactive */\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n /* convenience wrappers */\n private commitMetrics(metrics: ScrollMetrics) {\n this.commit(metrics, { metrics });\n }\n\n /* full re-compute after page-spread or initialisation */\n private refreshAll(pages: PdfPageObjectWithRotatedSize[][], vp: ViewportMetrics) {\n const layout = this.computeLayout(pages);\n const metrics = this.computeMetrics(vp, layout.virtualItems);\n\n this.commit({ ...layout, ...metrics }, { layout, metrics });\n }\n\n private getVirtualItemsFromState(): VirtualItem[] {\n return this.state.virtualItems || [];\n }\n\n private getScrollerLayoutFromState(): ScrollerLayout {\n const scale = this.coreState.core.scale;\n return getScrollerLayout(this.state, scale);\n }\n\n private pushScrollLayout() {\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n override onStoreUpdated(_prevState: ScrollState, _newState: ScrollState): void {\n this.pushScrollLayout();\n }\n\n override onCoreStoreUpdated(\n prevState: StoreState<CoreState>,\n newState: StoreState<CoreState>,\n ): void {\n if (prevState.core.scale !== newState.core.scale) {\n this.currentScale = newState.core.scale;\n this.commitMetrics(this.computeMetrics(this.viewport.getMetrics()));\n }\n if (prevState.core.rotation !== newState.core.rotation) {\n this.currentRotation = newState.core.rotation;\n }\n }\n\n /**\n * Change the scroll strategy at runtime (e.g., vertical <-> horizontal)\n * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical\n */\n private setScrollStrategy(newStrategy: ScrollStrategy) {\n // Only update if the strategy is actually changing\n if (\n (newStrategy === ScrollStrategy.Horizontal &&\n this.strategy instanceof HorizontalScrollStrategy) ||\n (newStrategy === ScrollStrategy.Vertical && this.strategy instanceof VerticalScrollStrategy)\n ) {\n return;\n }\n\n this.strategy =\n newStrategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n // Update state with new strategy\n this.dispatch(\n updateScrollState({\n strategy: newStrategy,\n }),\n );\n\n // Recalculate layout and scroll metrics\n const pages = getPagesWithRotatedSize(this.coreState.core);\n this.refreshAll(pages, this.viewport.getMetrics());\n }\n\n protected buildCapability(): ScrollCapability {\n return {\n onStateChange: this.state$.on,\n onLayoutChange: this.layout$.on,\n onScroll: this.scroll$.on,\n onPageChange: this.pageChange$.on,\n onScrollerData: this.scrollerLayout$.on,\n getCurrentPage: () => this.currentPage,\n getTotalPages: () => this.state.totalPages,\n scrollToPage: (options: ScrollToPageOptions) => {\n const { pageNumber, behavior = 'smooth', pageCoordinates, center = false } = options;\n const virtualItems = this.getVirtualItemsFromState();\n const position = this.strategy.getScrollPositionForPage(\n pageNumber,\n virtualItems,\n this.currentScale,\n this.currentRotation,\n pageCoordinates,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior, center });\n }\n },\n scrollToNextPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex >= 0 && currentItemIndex < virtualItems.length - 1) {\n const nextItem = virtualItems[currentItemIndex + 1];\n const position = this.strategy.getScrollPositionForPage(\n nextItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n scrollToPreviousPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex > 0) {\n const prevItem = virtualItems[currentItemIndex - 1];\n const position = this.strategy.getScrollPositionForPage(\n prevItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n getMetrics: this.getMetrics.bind(this),\n getLayout: this.getLayout.bind(this),\n getRectPositionForPage: this.getRectPositionForPage.bind(this),\n getPageGap: () => this.state.pageGap,\n getScrollerLayout: () => this.getScrollerLayoutFromState(),\n setScrollStrategy: (strategy: ScrollStrategy) => this.setScrollStrategy(strategy),\n };\n }\n\n private getMetrics(viewport?: ViewportMetrics): ScrollMetrics {\n const metrics = viewport || this.viewport.getMetrics();\n const virtualItems = this.getVirtualItemsFromState();\n return this.strategy.handleScroll(metrics, virtualItems, this.currentScale);\n }\n\n private getLayout(): LayoutChangePayload {\n return {\n virtualItems: this.state.virtualItems,\n totalContentSize: this.state.totalContentSize,\n };\n }\n\n private getRectPositionForPage(\n pageIndex: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null {\n return this.strategy.getRectPositionForPage(\n pageIndex + 1,\n this.state.virtualItems,\n scale ?? this.currentScale,\n rotation ?? this.currentRotation,\n rect,\n );\n }\n\n async initialize(): Promise<void> {\n // No DOM initialization needed; state drives rendering\n }\n\n async destroy(): Promise<void> {\n this.layout$.clear();\n this.scroll$.clear();\n this.pageChange$.clear();\n this.state$.clear();\n super.destroy();\n }\n}\n","import { BasePluginConfig, Emitter, EventHook } from '@embedpdf/core';\nimport { PdfPageObject, Rect, Rotation } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from './types/virtual-item';\n\nexport interface ScrollState extends ScrollMetrics {\n virtualItems: VirtualItem[];\n totalPages: number;\n totalContentSize: { width: number; height: number };\n desiredScrollPosition: { x: number; y: number };\n strategy: ScrollStrategy;\n pageGap: number;\n scale: number;\n}\n\nexport interface ScrollerLayout {\n startSpacing: number;\n endSpacing: number;\n totalWidth: number;\n totalHeight: number;\n pageGap: number;\n strategy: ScrollState['strategy'];\n items: VirtualItem[];\n}\n\nexport enum ScrollStrategy {\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n}\n\nexport interface PageVisibilityMetrics {\n pageNumber: number;\n viewportX: number;\n viewportY: number;\n visiblePercentage: number;\n original: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n scaled: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n}\n\nexport interface ScrollMetrics {\n currentPage: number;\n visiblePages: number[];\n pageVisibilityMetrics: PageVisibilityMetrics[];\n renderedPageIndexes: number[];\n scrollOffset: { x: number; y: number };\n startSpacing: number;\n endSpacing: number;\n}\n\nexport interface ScrollStrategyInterface {\n initialize(container: HTMLElement, innerDiv: HTMLElement): void;\n destroy(): void;\n updateLayout(viewport: ViewportMetrics, pdfPageObject: PdfPageObject[][]): void;\n handleScroll(viewport: ViewportMetrics): void;\n getVirtualItems(): VirtualItem[];\n scrollToPage(pageNumber: number, behavior?: ScrollBehavior): void;\n calculateDimensions(pdfPageObject: PdfPageObject[][]): void;\n}\n\nexport interface ScrollPluginConfig extends BasePluginConfig {\n strategy?: ScrollStrategy;\n initialPage?: number;\n bufferSize?: number;\n pageGap?: number;\n}\n\nexport type LayoutChangePayload = Pick<ScrollState, 'virtualItems' | 'totalContentSize'>;\n\nexport interface ScrollToPageOptions {\n pageNumber: number;\n pageCoordinates?: { x: number; y: number };\n behavior?: ScrollBehavior;\n center?: boolean;\n}\n\nexport interface PageChangePayload {\n pageNumber: number;\n totalPages: number;\n}\n\nexport interface ScrollCapability {\n onScrollerData: EventHook<ScrollerLayout>;\n onStateChange: EventHook<ScrollState>;\n onScroll: EventHook<ScrollMetrics>;\n getCurrentPage(): number;\n getTotalPages(): number;\n onPageChange: EventHook<PageChangePayload>;\n onLayoutChange: EventHook<LayoutChangePayload>;\n scrollToPage(options: ScrollToPageOptions): void;\n scrollToNextPage(behavior?: ScrollBehavior): void;\n scrollToPreviousPage(behavior?: ScrollBehavior): void;\n getMetrics(viewport?: ViewportMetrics): ScrollMetrics;\n getLayout(): LayoutChangePayload;\n getScrollerLayout(): ScrollerLayout;\n getRectPositionForPage(\n page: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null;\n setScrollStrategy(strategy: ScrollStrategy): void;\n getPageGap(): number;\n}\n","import {\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n Rotation,\n scalePosition,\n transformPosition,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport interface ScrollStrategyConfig {\n pageGap?: number;\n viewportGap?: number;\n bufferSize?: number;\n}\n\nexport abstract class BaseScrollStrategy {\n protected pageGap: number;\n protected viewportGap: number;\n protected bufferSize: number;\n\n constructor(config: ScrollStrategyConfig) {\n this.pageGap = config.pageGap ?? 20;\n this.viewportGap = config.viewportGap ?? 20;\n this.bufferSize = config.bufferSize ?? 2;\n }\n\n abstract createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[];\n abstract getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number };\n protected abstract getScrollOffset(viewport: ViewportMetrics): number;\n protected abstract getClientSize(viewport: ViewportMetrics): number;\n\n protected getVisibleRange(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): { start: number; end: number } {\n const scrollOffset = this.getScrollOffset(viewport);\n const clientSize = this.getClientSize(viewport);\n const viewportStart = scrollOffset;\n const viewportEnd = scrollOffset + clientSize;\n\n let startIndex = 0;\n while (\n startIndex < virtualItems.length &&\n (virtualItems[startIndex].offset + virtualItems[startIndex].height) * scale <= viewportStart\n ) {\n startIndex++;\n }\n\n let endIndex = startIndex;\n while (endIndex < virtualItems.length && virtualItems[endIndex].offset * scale <= viewportEnd) {\n endIndex++;\n }\n\n return {\n start: Math.max(0, startIndex - this.bufferSize),\n end: Math.min(virtualItems.length - 1, endIndex + this.bufferSize - 1),\n };\n }\n\n handleScroll(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): ScrollMetrics {\n const range = this.getVisibleRange(viewport, virtualItems, scale);\n const visibleItems = virtualItems.slice(range.start, range.end + 1);\n const pageVisibilityMetrics = this.calculatePageVisibility(visibleItems, viewport, scale);\n const visiblePages = pageVisibilityMetrics.map((m) => m.pageNumber);\n const renderedPageIndexes = virtualItems\n .slice(range.start, range.end + 1)\n .flatMap((item) => item.index);\n const currentPage = this.determineCurrentPage(pageVisibilityMetrics);\n const first = virtualItems[range.start];\n const last = virtualItems[range.end];\n const startSpacing = first ? first.offset * scale : 0;\n const endSpacing = last\n ? (virtualItems[virtualItems.length - 1].offset + // end of content\n virtualItems[virtualItems.length - 1].height) *\n scale - // minus\n (last.offset + last.height) * scale // end of last rendered\n : 0;\n\n return {\n currentPage,\n visiblePages,\n pageVisibilityMetrics,\n renderedPageIndexes,\n scrollOffset: { x: viewport.scrollLeft, y: viewport.scrollTop },\n startSpacing,\n endSpacing,\n };\n }\n\n protected calculatePageVisibility(\n virtualItems: VirtualItem[],\n viewport: ViewportMetrics,\n scale: number,\n ): ScrollMetrics['pageVisibilityMetrics'] {\n const visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'] = [];\n\n virtualItems.forEach((item) => {\n item.pageLayouts.forEach((page) => {\n const itemX = item.x * scale;\n const itemY = item.y * scale;\n const pageX = itemX + page.x * scale;\n const pageY = itemY + page.y * scale;\n const pageWidth = page.rotatedWidth * scale;\n const pageHeight = page.rotatedHeight * scale;\n\n const viewportLeft = viewport.scrollLeft;\n const viewportTop = viewport.scrollTop;\n const viewportRight = viewportLeft + viewport.clientWidth;\n const viewportBottom = viewportTop + viewport.clientHeight;\n\n const intersectionLeft = Math.max(pageX, viewportLeft);\n const intersectionTop = Math.max(pageY, viewportTop);\n const intersectionRight = Math.min(pageX + pageWidth, viewportRight);\n const intersectionBottom = Math.min(pageY + pageHeight, viewportBottom);\n\n if (intersectionLeft < intersectionRight && intersectionTop < intersectionBottom) {\n const visibleWidth = intersectionRight - intersectionLeft;\n const visibleHeight = intersectionBottom - intersectionTop;\n const totalArea = pageWidth * pageHeight;\n const visibleArea = visibleWidth * visibleHeight;\n\n visibilityMetrics.push({\n pageNumber: page.pageNumber,\n viewportX: intersectionLeft - viewportLeft,\n viewportY: intersectionTop - viewportTop,\n visiblePercentage: (visibleArea / totalArea) * 100,\n original: {\n pageX: (intersectionLeft - pageX) / scale,\n pageY: (intersectionTop - pageY) / scale,\n visibleWidth: visibleWidth / scale,\n visibleHeight: visibleHeight / scale,\n scale: 1,\n },\n scaled: {\n pageX: intersectionLeft - pageX,\n pageY: intersectionTop - pageY,\n visibleWidth,\n visibleHeight,\n scale,\n },\n });\n }\n });\n });\n\n return visibilityMetrics;\n }\n\n protected determineCurrentPage(\n visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'],\n ): number {\n if (visibilityMetrics.length === 0) return 1;\n\n const maxVisibility = Math.max(...visibilityMetrics.map((m) => m.visiblePercentage));\n const mostVisiblePages = visibilityMetrics.filter((m) => m.visiblePercentage === maxVisibility);\n\n return mostVisiblePages.length === 1\n ? mostVisiblePages[0].pageNumber\n : mostVisiblePages.sort((a, b) => a.pageNumber - b.pageNumber)[0].pageNumber;\n }\n\n private getRectLocationForPage(pageNumber: number, virtualItems: VirtualItem[]): Rect | null {\n // Find the virtual item containing the page\n const item = virtualItems.find((item) => item.pageNumbers.includes(pageNumber));\n if (!item) return null;\n\n // Find the specific page layout for the requested page number\n const pageLayout = item.pageLayouts.find((layout) => layout.pageNumber === pageNumber);\n if (!pageLayout) return null;\n\n return {\n origin: {\n x: item.x + pageLayout.x,\n y: item.y + pageLayout.y,\n },\n size: {\n width: pageLayout.width,\n height: pageLayout.height,\n },\n };\n }\n\n getScrollPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n pageCoordinates?: { x: number; y: number },\n ): Position | null {\n // Find the virtual item containing the page\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n // If specific page coordinates are provided, add them to the base position\n if (pageCoordinates) {\n const rotatedSize = transformPosition(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n {\n x: pageCoordinates.x,\n y: pageCoordinates.y,\n },\n rotation,\n scale,\n );\n\n return {\n x: scaledBasePosition.x + rotatedSize.x + this.viewportGap,\n y: scaledBasePosition.y + rotatedSize.y + this.viewportGap,\n };\n }\n\n return {\n x: scaledBasePosition.x + this.viewportGap,\n y: scaledBasePosition.y + this.viewportGap,\n };\n }\n\n getRectPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n rect: Rect,\n ): Rect | null {\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n const rotatedSize = transformRect(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n rect,\n rotation,\n scale,\n );\n\n return {\n origin: {\n x: scaledBasePosition.x + rotatedSize.origin.x,\n y: scaledBasePosition.y + rotatedSize.origin.y,\n },\n size: rotatedSize.size,\n };\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport class VerticalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let yOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: 0,\n y: yOffset,\n offset: yOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n yOffset += height + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const maxWidth = Math.max(...virtualItems.map((item) => item.width));\n const totalHeight =\n virtualItems[virtualItems.length - 1].y + virtualItems[virtualItems.length - 1].height;\n return {\n width: maxWidth,\n height: totalHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollTop;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientHeight;\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\n\nexport class HorizontalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let xOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: xOffset,\n y: 0,\n offset: xOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n xOffset += width + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const totalWidth =\n virtualItems[virtualItems.length - 1].x + virtualItems[virtualItems.length - 1].width;\n const maxHeight = Math.max(...virtualItems.map((item) => item.height));\n return {\n width: totalWidth,\n height: maxHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollLeft;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientWidth;\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { ScrollState } from './types';\n\nexport const UPDATE_SCROLL_STATE = 'UPDATE_SCROLL_STATE';\nexport const SET_DESIRED_SCROLL_POSITION = 'SET_DESIRED_SCROLL_POSITION';\nexport const UPDATE_TOTAL_PAGES = 'UPDATE_TOTAL_PAGES';\n\nexport interface UpdateScrollStateAction extends Action {\n type: typeof UPDATE_SCROLL_STATE;\n payload: Partial<ScrollState>;\n}\n\nexport interface SetDesiredScrollPositionAction extends Action {\n type: typeof SET_DESIRED_SCROLL_POSITION;\n payload: { x: number; y: number };\n}\n\nexport interface UpdateTotalPagesAction extends Action {\n type: typeof UPDATE_TOTAL_PAGES;\n payload: number;\n}\n\nexport type ScrollAction =\n | UpdateScrollStateAction\n | SetDesiredScrollPositionAction\n | UpdateTotalPagesAction;\n\nexport function updateScrollState(payload: Partial<ScrollState>): UpdateScrollStateAction {\n return { type: UPDATE_SCROLL_STATE, payload };\n}\n\nexport function setDesiredScrollPosition(payload: {\n x: number;\n y: number;\n}): SetDesiredScrollPositionAction {\n return { type: SET_DESIRED_SCROLL_POSITION, payload };\n}\n\nexport function updateTotalPages(payload: number): UpdateTotalPagesAction {\n return { type: UPDATE_TOTAL_PAGES, payload };\n}\n","import { ScrollerLayout, ScrollState } from './types';\n\nexport const getScrollerLayout = (state: ScrollState, scale: number): ScrollerLayout => {\n return {\n startSpacing: state.startSpacing,\n endSpacing: state.endSpacing,\n totalWidth: state.totalContentSize.width * scale,\n totalHeight: state.totalContentSize.height * scale,\n pageGap: state.pageGap * scale,\n strategy: state.strategy,\n items: state.renderedPageIndexes.map((idx) => {\n return {\n ...state.virtualItems[idx],\n pageLayouts: state.virtualItems[idx].pageLayouts.map((layout) => {\n return {\n ...layout,\n rotatedWidth: layout.rotatedWidth * scale,\n rotatedHeight: layout.rotatedHeight * scale,\n width: layout.width * scale,\n height: layout.height * scale,\n };\n }),\n };\n }),\n };\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { ScrollPluginConfig } from './types';\n\nexport const SCROLL_PLUGIN_ID = 'scroll';\n\nexport const manifest: PluginManifest<ScrollPluginConfig> = {\n id: SCROLL_PLUGIN_ID,\n name: 'Scroll Plugin',\n version: '1.0.0',\n provides: ['scroll'],\n requires: ['viewport'],\n optional: [],\n defaultConfig: {\n enabled: true,\n pageGap: 10,\n },\n};\n","import { Reducer, CoreState, SET_SCALE, SetScaleAction } from '@embedpdf/core';\nimport { ScrollState, ScrollStrategy, ScrollPluginConfig, ScrollMetrics } from './types';\nimport {\n ScrollAction,\n UPDATE_SCROLL_STATE,\n SET_DESIRED_SCROLL_POSITION,\n UPDATE_TOTAL_PAGES,\n} from './actions';\n\nexport const defaultScrollMetrics: ScrollMetrics = {\n currentPage: 1,\n visiblePages: [],\n pageVisibilityMetrics: [],\n renderedPageIndexes: [],\n scrollOffset: { x: 0, y: 0 },\n startSpacing: 0,\n endSpacing: 0,\n};\n\nexport const initialState: (coreState: CoreState, config: ScrollPluginConfig) => ScrollState = (\n coreState,\n config,\n) => ({\n virtualItems: [],\n totalPages: coreState.pages.length,\n totalContentSize: { width: 0, height: 0 },\n desiredScrollPosition: { x: 0, y: 0 },\n strategy: config.strategy ?? ScrollStrategy.Vertical,\n pageGap: config.pageGap ?? 10,\n scale: coreState.scale,\n ...defaultScrollMetrics,\n});\n\nexport const scrollReducer: Reducer<ScrollState, ScrollAction | SetScaleAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case UPDATE_TOTAL_PAGES:\n return { ...state, totalPages: action.payload };\n case SET_SCALE:\n return { ...state, scale: action.payload };\n case UPDATE_SCROLL_STATE:\n return { ...state, ...action.payload };\n case SET_DESIRED_SCROLL_POSITION:\n return { ...state, desiredScrollPosition: action.payload };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { ScrollPlugin } from './scroll-plugin';\nimport { manifest, SCROLL_PLUGIN_ID } from './manifest';\nimport { ScrollPluginConfig, ScrollState } from './types';\nimport { scrollReducer, initialState } from './reducer';\nimport { ScrollAction } from './actions';\n\nexport const ScrollPluginPackage: PluginPackage<\n ScrollPlugin,\n ScrollPluginConfig,\n ScrollState,\n ScrollAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ScrollPlugin(SCROLL_PLUGIN_ID, registry, config),\n reducer: scrollReducer,\n initialState: (coreState, config) => initialState(coreState, config),\n};\n\nexport * from './scroll-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './types/virtual-item';\n"],"mappings":"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","names":["import_models","ScrollStrategy","item","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/scroll-plugin.ts","../src/lib/types.ts","../src/lib/strategies/base-strategy.ts","../src/lib/strategies/vertical-strategy.ts","../src/lib/strategies/horizontal-strategy.ts","../src/lib/actions.ts","../src/lib/selectors.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["export * from './lib';\n","import {\n BasePlugin,\n CoreState,\n PluginRegistry,\n SET_DOCUMENT,\n SET_PAGES,\n SET_ROTATION,\n StoreState,\n createBehaviorEmitter,\n createEmitter,\n getPagesWithRotatedSize,\n} from '@embedpdf/core';\nimport {\n PdfPageObject,\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n restoreRect,\n rotateRect,\n Rotation,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportCapability, ViewportMetrics, ViewportPlugin } from '@embedpdf/plugin-viewport';\nimport {\n ScrollCapability,\n ScrollPluginConfig,\n ScrollStrategy,\n ScrollMetrics,\n ScrollState,\n LayoutChangePayload,\n ScrollerLayout,\n ScrollToPageOptions,\n PageChangePayload,\n} from './types';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './strategies/base-strategy';\nimport { VerticalScrollStrategy } from './strategies/vertical-strategy';\nimport { HorizontalScrollStrategy } from './strategies/horizontal-strategy';\nimport { updateScrollState, ScrollAction, updateTotalPages } from './actions';\nimport { VirtualItem } from './types/virtual-item';\nimport { getScrollerLayout } from './selectors';\n\ntype PartialScroll = Partial<ScrollState>;\ntype Emits = {\n layout?: LayoutChangePayload;\n metrics?: ScrollMetrics;\n};\n\nexport class ScrollPlugin extends BasePlugin<\n ScrollPluginConfig,\n ScrollCapability,\n ScrollState,\n ScrollAction\n> {\n static readonly id = 'scroll' as const;\n private viewport: ViewportCapability;\n private strategy: BaseScrollStrategy;\n private strategyConfig: ScrollStrategyConfig;\n private currentScale: number = 1;\n private currentRotation: Rotation = Rotation.Degree0;\n private initialPage?: number;\n private currentPage: number = 1;\n private layoutReady: boolean = false;\n\n private readonly layout$ = createBehaviorEmitter<LayoutChangePayload>();\n private readonly scroll$ = createBehaviorEmitter<ScrollMetrics>();\n private readonly state$ = createBehaviorEmitter<ScrollState>();\n private readonly scrollerLayout$ = createBehaviorEmitter<ScrollerLayout>();\n private readonly pageChange$ = createBehaviorEmitter<PageChangePayload>();\n private readonly layoutReady$ = createBehaviorEmitter<boolean>();\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n private config?: ScrollPluginConfig,\n ) {\n super(id, registry);\n\n this.viewport = this.registry.getPlugin<ViewportPlugin>('viewport')!.provides();\n\n this.strategyConfig = {\n pageGap: this.config?.pageGap ?? 10,\n viewportGap: this.viewport.getViewportGap(),\n bufferSize: this.config?.bufferSize ?? 2,\n };\n\n this.strategy =\n this.config?.strategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n this.initialPage = this.config?.initialPage;\n this.currentScale = this.coreState.core.scale;\n this.currentRotation = this.coreState.core.rotation;\n // Subscribe to viewport and page manager events\n this.viewport.onViewportChange((vp) => this.commitMetrics(this.computeMetrics(vp)), {\n mode: 'throttle',\n wait: 250,\n });\n this.coreStore.onAction(SET_DOCUMENT, (_action, state) => {\n const totalPages = state.core.pages.length;\n this.dispatch(updateTotalPages(totalPages));\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages });\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics());\n });\n this.coreStore.onAction(SET_ROTATION, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n this.coreStore.onAction(SET_PAGES, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴘᴜᴛᴇʀs */\n /* ------------------------------------------------------------------ */\n\n private computeLayout(pages: PdfPageObjectWithRotatedSize[][]) {\n const virtualItems = this.strategy.createVirtualItems(pages);\n const totalContentSize = this.strategy.getTotalContentSize(virtualItems);\n return { virtualItems, totalContentSize };\n }\n\n private computeMetrics(vp: ViewportMetrics, items: VirtualItem[] = this.state.virtualItems) {\n return this.strategy.handleScroll(vp, items, this.currentScale);\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴍɪᴛ (single source of truth) */\n /* ------------------------------------------------------------------ */\n\n private commit(stateDelta: PartialScroll, emit?: Emits) {\n /* update Redux-like store */\n this.dispatch(updateScrollState(stateDelta));\n\n /* fire optional events */\n if (emit?.layout) this.layout$.emit(emit.layout);\n if (emit?.metrics) {\n this.scroll$.emit(emit.metrics);\n\n if (emit.metrics.currentPage !== this.currentPage) {\n this.currentPage = emit.metrics.currentPage;\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages: this.state.totalPages });\n }\n }\n\n /* keep scroller-layout reactive */\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n /* convenience wrappers */\n private commitMetrics(metrics: ScrollMetrics) {\n this.commit(metrics, { metrics });\n }\n\n /* full re-compute after page-spread or initialisation */\n private refreshAll(pages: PdfPageObjectWithRotatedSize[][], vp: ViewportMetrics) {\n const layout = this.computeLayout(pages);\n const metrics = this.computeMetrics(vp, layout.virtualItems);\n\n this.commit({ ...layout, ...metrics }, { layout, metrics });\n }\n\n private getVirtualItemsFromState(): VirtualItem[] {\n return this.state.virtualItems || [];\n }\n\n private getScrollerLayoutFromState(): ScrollerLayout {\n const scale = this.coreState.core.scale;\n return getScrollerLayout(this.state, scale);\n }\n\n private pushScrollLayout() {\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n override onStoreUpdated(_prevState: ScrollState, _newState: ScrollState): void {\n this.pushScrollLayout();\n }\n\n override onCoreStoreUpdated(\n prevState: StoreState<CoreState>,\n newState: StoreState<CoreState>,\n ): void {\n if (prevState.core.scale !== newState.core.scale) {\n this.currentScale = newState.core.scale;\n this.commitMetrics(this.computeMetrics(this.viewport.getMetrics()));\n }\n if (prevState.core.rotation !== newState.core.rotation) {\n this.currentRotation = newState.core.rotation;\n }\n }\n\n /**\n * Change the scroll strategy at runtime (e.g., vertical <-> horizontal)\n * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical\n */\n private setScrollStrategy(newStrategy: ScrollStrategy) {\n // Only update if the strategy is actually changing\n if (\n (newStrategy === ScrollStrategy.Horizontal &&\n this.strategy instanceof HorizontalScrollStrategy) ||\n (newStrategy === ScrollStrategy.Vertical && this.strategy instanceof VerticalScrollStrategy)\n ) {\n return;\n }\n\n this.strategy =\n newStrategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n // Update state with new strategy\n this.dispatch(\n updateScrollState({\n strategy: newStrategy,\n }),\n );\n\n // Recalculate layout and scroll metrics\n const pages = getPagesWithRotatedSize(this.coreState.core);\n this.refreshAll(pages, this.viewport.getMetrics());\n }\n\n public setLayoutReady() {\n if (this.layoutReady) return;\n\n this.layoutReady = true;\n this.layoutReady$.emit(true);\n }\n\n protected buildCapability(): ScrollCapability {\n return {\n onStateChange: this.state$.on,\n onLayoutChange: this.layout$.on,\n onScroll: this.scroll$.on,\n onPageChange: this.pageChange$.on,\n onScrollerData: this.scrollerLayout$.on,\n onLayoutReady: this.layoutReady$.on,\n getCurrentPage: () => this.currentPage,\n getTotalPages: () => this.state.totalPages,\n scrollToPage: (options: ScrollToPageOptions) => {\n const { pageNumber, behavior = 'smooth', pageCoordinates, center = false } = options;\n const virtualItems = this.getVirtualItemsFromState();\n const position = this.strategy.getScrollPositionForPage(\n pageNumber,\n virtualItems,\n this.currentScale,\n this.currentRotation,\n pageCoordinates,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior, center });\n }\n },\n scrollToNextPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex >= 0 && currentItemIndex < virtualItems.length - 1) {\n const nextItem = virtualItems[currentItemIndex + 1];\n const position = this.strategy.getScrollPositionForPage(\n nextItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n scrollToPreviousPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex > 0) {\n const prevItem = virtualItems[currentItemIndex - 1];\n const position = this.strategy.getScrollPositionForPage(\n prevItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n getMetrics: this.getMetrics.bind(this),\n getLayout: this.getLayout.bind(this),\n getRectPositionForPage: this.getRectPositionForPage.bind(this),\n getPageGap: () => this.state.pageGap,\n getScrollerLayout: () => this.getScrollerLayoutFromState(),\n setScrollStrategy: (strategy: ScrollStrategy) => this.setScrollStrategy(strategy),\n };\n }\n\n private getMetrics(viewport?: ViewportMetrics): ScrollMetrics {\n const metrics = viewport || this.viewport.getMetrics();\n const virtualItems = this.getVirtualItemsFromState();\n return this.strategy.handleScroll(metrics, virtualItems, this.currentScale);\n }\n\n private getLayout(): LayoutChangePayload {\n return {\n virtualItems: this.state.virtualItems,\n totalContentSize: this.state.totalContentSize,\n };\n }\n\n private getRectPositionForPage(\n pageIndex: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null {\n return this.strategy.getRectPositionForPage(\n pageIndex + 1,\n this.state.virtualItems,\n scale ?? this.currentScale,\n rotation ?? this.currentRotation,\n rect,\n );\n }\n\n async initialize(): Promise<void> {\n // No DOM initialization needed; state drives rendering\n }\n\n async destroy(): Promise<void> {\n this.layout$.clear();\n this.scroll$.clear();\n this.pageChange$.clear();\n this.state$.clear();\n this.scrollerLayout$.clear();\n this.layoutReady$.clear();\n super.destroy();\n }\n}\n","import { BasePluginConfig, Emitter, EventHook } from '@embedpdf/core';\nimport { PdfPageObject, Rect, Rotation } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from './types/virtual-item';\n\nexport interface ScrollState extends ScrollMetrics {\n virtualItems: VirtualItem[];\n totalPages: number;\n totalContentSize: { width: number; height: number };\n desiredScrollPosition: { x: number; y: number };\n strategy: ScrollStrategy;\n pageGap: number;\n scale: number;\n}\n\nexport interface ScrollerLayout {\n startSpacing: number;\n endSpacing: number;\n totalWidth: number;\n totalHeight: number;\n pageGap: number;\n strategy: ScrollState['strategy'];\n items: VirtualItem[];\n}\n\nexport enum ScrollStrategy {\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n}\n\nexport interface PageVisibilityMetrics {\n pageNumber: number;\n viewportX: number;\n viewportY: number;\n visiblePercentage: number;\n original: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n scaled: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n}\n\nexport interface ScrollMetrics {\n currentPage: number;\n visiblePages: number[];\n pageVisibilityMetrics: PageVisibilityMetrics[];\n renderedPageIndexes: number[];\n scrollOffset: { x: number; y: number };\n startSpacing: number;\n endSpacing: number;\n}\n\nexport interface ScrollStrategyInterface {\n initialize(container: HTMLElement, innerDiv: HTMLElement): void;\n destroy(): void;\n updateLayout(viewport: ViewportMetrics, pdfPageObject: PdfPageObject[][]): void;\n handleScroll(viewport: ViewportMetrics): void;\n getVirtualItems(): VirtualItem[];\n scrollToPage(pageNumber: number, behavior?: ScrollBehavior): void;\n calculateDimensions(pdfPageObject: PdfPageObject[][]): void;\n}\n\nexport interface ScrollPluginConfig extends BasePluginConfig {\n strategy?: ScrollStrategy;\n initialPage?: number;\n bufferSize?: number;\n pageGap?: number;\n}\n\nexport type LayoutChangePayload = Pick<ScrollState, 'virtualItems' | 'totalContentSize'>;\n\nexport interface ScrollToPageOptions {\n pageNumber: number;\n pageCoordinates?: { x: number; y: number };\n behavior?: ScrollBehavior;\n center?: boolean;\n}\n\nexport interface PageChangePayload {\n pageNumber: number;\n totalPages: number;\n}\n\nexport interface ScrollCapability {\n onScrollerData: EventHook<ScrollerLayout>;\n onStateChange: EventHook<ScrollState>;\n onScroll: EventHook<ScrollMetrics>;\n getCurrentPage(): number;\n getTotalPages(): number;\n onPageChange: EventHook<PageChangePayload>;\n onLayoutChange: EventHook<LayoutChangePayload>;\n onLayoutReady: EventHook<boolean>;\n scrollToPage(options: ScrollToPageOptions): void;\n scrollToNextPage(behavior?: ScrollBehavior): void;\n scrollToPreviousPage(behavior?: ScrollBehavior): void;\n getMetrics(viewport?: ViewportMetrics): ScrollMetrics;\n getLayout(): LayoutChangePayload;\n getScrollerLayout(): ScrollerLayout;\n getRectPositionForPage(\n page: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null;\n setScrollStrategy(strategy: ScrollStrategy): void;\n getPageGap(): number;\n}\n","import {\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n Rotation,\n scalePosition,\n transformPosition,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport interface ScrollStrategyConfig {\n pageGap?: number;\n viewportGap?: number;\n bufferSize?: number;\n}\n\nexport abstract class BaseScrollStrategy {\n protected pageGap: number;\n protected viewportGap: number;\n protected bufferSize: number;\n\n constructor(config: ScrollStrategyConfig) {\n this.pageGap = config.pageGap ?? 20;\n this.viewportGap = config.viewportGap ?? 20;\n this.bufferSize = config.bufferSize ?? 2;\n }\n\n abstract createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[];\n abstract getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number };\n protected abstract getScrollOffset(viewport: ViewportMetrics): number;\n protected abstract getClientSize(viewport: ViewportMetrics): number;\n\n protected getVisibleRange(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): { start: number; end: number } {\n const scrollOffset = this.getScrollOffset(viewport);\n const clientSize = this.getClientSize(viewport);\n const viewportStart = scrollOffset;\n const viewportEnd = scrollOffset + clientSize;\n\n let startIndex = 0;\n while (\n startIndex < virtualItems.length &&\n (virtualItems[startIndex].offset + virtualItems[startIndex].height) * scale <= viewportStart\n ) {\n startIndex++;\n }\n\n let endIndex = startIndex;\n while (endIndex < virtualItems.length && virtualItems[endIndex].offset * scale <= viewportEnd) {\n endIndex++;\n }\n\n return {\n start: Math.max(0, startIndex - this.bufferSize),\n end: Math.min(virtualItems.length - 1, endIndex + this.bufferSize - 1),\n };\n }\n\n handleScroll(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): ScrollMetrics {\n const range = this.getVisibleRange(viewport, virtualItems, scale);\n const visibleItems = virtualItems.slice(range.start, range.end + 1);\n const pageVisibilityMetrics = this.calculatePageVisibility(visibleItems, viewport, scale);\n const visiblePages = pageVisibilityMetrics.map((m) => m.pageNumber);\n const renderedPageIndexes = virtualItems\n .slice(range.start, range.end + 1)\n .flatMap((item) => item.index);\n const currentPage = this.determineCurrentPage(pageVisibilityMetrics);\n const first = virtualItems[range.start];\n const last = virtualItems[range.end];\n const startSpacing = first ? first.offset * scale : 0;\n const endSpacing = last\n ? (virtualItems[virtualItems.length - 1].offset + // end of content\n virtualItems[virtualItems.length - 1].height) *\n scale - // minus\n (last.offset + last.height) * scale // end of last rendered\n : 0;\n\n return {\n currentPage,\n visiblePages,\n pageVisibilityMetrics,\n renderedPageIndexes,\n scrollOffset: { x: viewport.scrollLeft, y: viewport.scrollTop },\n startSpacing,\n endSpacing,\n };\n }\n\n protected calculatePageVisibility(\n virtualItems: VirtualItem[],\n viewport: ViewportMetrics,\n scale: number,\n ): ScrollMetrics['pageVisibilityMetrics'] {\n const visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'] = [];\n\n virtualItems.forEach((item) => {\n item.pageLayouts.forEach((page) => {\n const itemX = item.x * scale;\n const itemY = item.y * scale;\n const pageX = itemX + page.x * scale;\n const pageY = itemY + page.y * scale;\n const pageWidth = page.rotatedWidth * scale;\n const pageHeight = page.rotatedHeight * scale;\n\n const viewportLeft = viewport.scrollLeft;\n const viewportTop = viewport.scrollTop;\n const viewportRight = viewportLeft + viewport.clientWidth;\n const viewportBottom = viewportTop + viewport.clientHeight;\n\n const intersectionLeft = Math.max(pageX, viewportLeft);\n const intersectionTop = Math.max(pageY, viewportTop);\n const intersectionRight = Math.min(pageX + pageWidth, viewportRight);\n const intersectionBottom = Math.min(pageY + pageHeight, viewportBottom);\n\n if (intersectionLeft < intersectionRight && intersectionTop < intersectionBottom) {\n const visibleWidth = intersectionRight - intersectionLeft;\n const visibleHeight = intersectionBottom - intersectionTop;\n const totalArea = pageWidth * pageHeight;\n const visibleArea = visibleWidth * visibleHeight;\n\n visibilityMetrics.push({\n pageNumber: page.pageNumber,\n viewportX: intersectionLeft - viewportLeft,\n viewportY: intersectionTop - viewportTop,\n visiblePercentage: (visibleArea / totalArea) * 100,\n original: {\n pageX: (intersectionLeft - pageX) / scale,\n pageY: (intersectionTop - pageY) / scale,\n visibleWidth: visibleWidth / scale,\n visibleHeight: visibleHeight / scale,\n scale: 1,\n },\n scaled: {\n pageX: intersectionLeft - pageX,\n pageY: intersectionTop - pageY,\n visibleWidth,\n visibleHeight,\n scale,\n },\n });\n }\n });\n });\n\n return visibilityMetrics;\n }\n\n protected determineCurrentPage(\n visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'],\n ): number {\n if (visibilityMetrics.length === 0) return 1;\n\n const maxVisibility = Math.max(...visibilityMetrics.map((m) => m.visiblePercentage));\n const mostVisiblePages = visibilityMetrics.filter((m) => m.visiblePercentage === maxVisibility);\n\n return mostVisiblePages.length === 1\n ? mostVisiblePages[0].pageNumber\n : mostVisiblePages.sort((a, b) => a.pageNumber - b.pageNumber)[0].pageNumber;\n }\n\n private getRectLocationForPage(pageNumber: number, virtualItems: VirtualItem[]): Rect | null {\n // Find the virtual item containing the page\n const item = virtualItems.find((item) => item.pageNumbers.includes(pageNumber));\n if (!item) return null;\n\n // Find the specific page layout for the requested page number\n const pageLayout = item.pageLayouts.find((layout) => layout.pageNumber === pageNumber);\n if (!pageLayout) return null;\n\n return {\n origin: {\n x: item.x + pageLayout.x,\n y: item.y + pageLayout.y,\n },\n size: {\n width: pageLayout.width,\n height: pageLayout.height,\n },\n };\n }\n\n getScrollPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n pageCoordinates?: { x: number; y: number },\n ): Position | null {\n // Find the virtual item containing the page\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n // If specific page coordinates are provided, add them to the base position\n if (pageCoordinates) {\n const rotatedSize = transformPosition(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n {\n x: pageCoordinates.x,\n y: pageCoordinates.y,\n },\n rotation,\n scale,\n );\n\n return {\n x: scaledBasePosition.x + rotatedSize.x + this.viewportGap,\n y: scaledBasePosition.y + rotatedSize.y + this.viewportGap,\n };\n }\n\n return {\n x: scaledBasePosition.x + this.viewportGap,\n y: scaledBasePosition.y + this.viewportGap,\n };\n }\n\n getRectPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n rect: Rect,\n ): Rect | null {\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n const rotatedSize = transformRect(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n rect,\n rotation,\n scale,\n );\n\n return {\n origin: {\n x: scaledBasePosition.x + rotatedSize.origin.x,\n y: scaledBasePosition.y + rotatedSize.origin.y,\n },\n size: rotatedSize.size,\n };\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport class VerticalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let yOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: 0,\n y: yOffset,\n offset: yOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n yOffset += height + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const maxWidth = Math.max(...virtualItems.map((item) => item.width));\n const totalHeight =\n virtualItems[virtualItems.length - 1].y + virtualItems[virtualItems.length - 1].height;\n return {\n width: maxWidth,\n height: totalHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollTop;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientHeight;\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\n\nexport class HorizontalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let xOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: xOffset,\n y: 0,\n offset: xOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n xOffset += width + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const totalWidth =\n virtualItems[virtualItems.length - 1].x + virtualItems[virtualItems.length - 1].width;\n const maxHeight = Math.max(...virtualItems.map((item) => item.height));\n return {\n width: totalWidth,\n height: maxHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollLeft;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientWidth;\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { ScrollState } from './types';\n\nexport const UPDATE_SCROLL_STATE = 'UPDATE_SCROLL_STATE';\nexport const SET_DESIRED_SCROLL_POSITION = 'SET_DESIRED_SCROLL_POSITION';\nexport const UPDATE_TOTAL_PAGES = 'UPDATE_TOTAL_PAGES';\n\nexport interface UpdateScrollStateAction extends Action {\n type: typeof UPDATE_SCROLL_STATE;\n payload: Partial<ScrollState>;\n}\n\nexport interface SetDesiredScrollPositionAction extends Action {\n type: typeof SET_DESIRED_SCROLL_POSITION;\n payload: { x: number; y: number };\n}\n\nexport interface UpdateTotalPagesAction extends Action {\n type: typeof UPDATE_TOTAL_PAGES;\n payload: number;\n}\n\nexport type ScrollAction =\n | UpdateScrollStateAction\n | SetDesiredScrollPositionAction\n | UpdateTotalPagesAction;\n\nexport function updateScrollState(payload: Partial<ScrollState>): UpdateScrollStateAction {\n return { type: UPDATE_SCROLL_STATE, payload };\n}\n\nexport function setDesiredScrollPosition(payload: {\n x: number;\n y: number;\n}): SetDesiredScrollPositionAction {\n return { type: SET_DESIRED_SCROLL_POSITION, payload };\n}\n\nexport function updateTotalPages(payload: number): UpdateTotalPagesAction {\n return { type: UPDATE_TOTAL_PAGES, payload };\n}\n","import { ScrollerLayout, ScrollState } from './types';\n\nexport const getScrollerLayout = (state: ScrollState, scale: number): ScrollerLayout => {\n return {\n startSpacing: state.startSpacing,\n endSpacing: state.endSpacing,\n totalWidth: state.totalContentSize.width * scale,\n totalHeight: state.totalContentSize.height * scale,\n pageGap: state.pageGap * scale,\n strategy: state.strategy,\n items: state.renderedPageIndexes.map((idx) => {\n return {\n ...state.virtualItems[idx],\n pageLayouts: state.virtualItems[idx].pageLayouts.map((layout) => {\n return {\n ...layout,\n rotatedWidth: layout.rotatedWidth * scale,\n rotatedHeight: layout.rotatedHeight * scale,\n width: layout.width * scale,\n height: layout.height * scale,\n };\n }),\n };\n }),\n };\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { ScrollPluginConfig } from './types';\n\nexport const SCROLL_PLUGIN_ID = 'scroll';\n\nexport const manifest: PluginManifest<ScrollPluginConfig> = {\n id: SCROLL_PLUGIN_ID,\n name: 'Scroll Plugin',\n version: '1.0.0',\n provides: ['scroll'],\n requires: ['viewport'],\n optional: [],\n defaultConfig: {\n enabled: true,\n pageGap: 10,\n },\n};\n","import { Reducer, CoreState, SET_SCALE, SetScaleAction } from '@embedpdf/core';\nimport { ScrollState, ScrollStrategy, ScrollPluginConfig, ScrollMetrics } from './types';\nimport {\n ScrollAction,\n UPDATE_SCROLL_STATE,\n SET_DESIRED_SCROLL_POSITION,\n UPDATE_TOTAL_PAGES,\n} from './actions';\n\nexport const defaultScrollMetrics: ScrollMetrics = {\n currentPage: 1,\n visiblePages: [],\n pageVisibilityMetrics: [],\n renderedPageIndexes: [],\n scrollOffset: { x: 0, y: 0 },\n startSpacing: 0,\n endSpacing: 0,\n};\n\nexport const initialState: (coreState: CoreState, config: ScrollPluginConfig) => ScrollState = (\n coreState,\n config,\n) => ({\n virtualItems: [],\n totalPages: coreState.pages.length,\n totalContentSize: { width: 0, height: 0 },\n desiredScrollPosition: { x: 0, y: 0 },\n strategy: config.strategy ?? ScrollStrategy.Vertical,\n pageGap: config.pageGap ?? 10,\n scale: coreState.scale,\n ...defaultScrollMetrics,\n});\n\nexport const scrollReducer: Reducer<ScrollState, ScrollAction | SetScaleAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case UPDATE_TOTAL_PAGES:\n return { ...state, totalPages: action.payload };\n case SET_SCALE:\n return { ...state, scale: action.payload };\n case UPDATE_SCROLL_STATE:\n return { ...state, ...action.payload };\n case SET_DESIRED_SCROLL_POSITION:\n return { ...state, desiredScrollPosition: action.payload };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { ScrollPlugin } from './scroll-plugin';\nimport { manifest, SCROLL_PLUGIN_ID } from './manifest';\nimport { ScrollPluginConfig, ScrollState } from './types';\nimport { scrollReducer, initialState } from './reducer';\nimport { ScrollAction } from './actions';\n\nexport const ScrollPluginPackage: PluginPackage<\n ScrollPlugin,\n ScrollPluginConfig,\n ScrollState,\n ScrollAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ScrollPlugin(SCROLL_PLUGIN_ID, registry, config),\n reducer: scrollReducer,\n initialState: (coreState, config) => initialState(coreState, config),\n};\n\nexport * from './scroll-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './types/virtual-item';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAWO;AACP,IAAAA,iBASO;;;ACIA,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,gBAAa;AAFH,SAAAA;AAAA,GAAA;;;ACzBZ,oBAQO;AAWA,IAAe,qBAAf,MAAkC;AAAA,EAKvC,YAAY,QAA8B;AACxC,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,cAAc,OAAO,eAAe;AACzC,SAAK,aAAa,OAAO,cAAc;AAAA,EACzC;AAAA,EAOU,gBACR,UACA,cACA,OACgC;AAChC,UAAM,eAAe,KAAK,gBAAgB,QAAQ;AAClD,UAAM,aAAa,KAAK,cAAc,QAAQ;AAC9C,UAAM,gBAAgB;AACtB,UAAM,cAAc,eAAe;AAEnC,QAAI,aAAa;AACjB,WACE,aAAa,aAAa,WACzB,aAAa,UAAU,EAAE,SAAS,aAAa,UAAU,EAAE,UAAU,SAAS,eAC/E;AACA;AAAA,IACF;AAEA,QAAI,WAAW;AACf,WAAO,WAAW,aAAa,UAAU,aAAa,QAAQ,EAAE,SAAS,SAAS,aAAa;AAC7F;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,KAAK,IAAI,GAAG,aAAa,KAAK,UAAU;AAAA,MAC/C,KAAK,KAAK,IAAI,aAAa,SAAS,GAAG,WAAW,KAAK,aAAa,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,aACE,UACA,cACA,OACe;AACf,UAAM,QAAQ,KAAK,gBAAgB,UAAU,cAAc,KAAK;AAChE,UAAM,eAAe,aAAa,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC;AAClE,UAAM,wBAAwB,KAAK,wBAAwB,cAAc,UAAU,KAAK;AACxF,UAAM,eAAe,sBAAsB,IAAI,CAAC,MAAM,EAAE,UAAU;AAClE,UAAM,sBAAsB,aACzB,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC,EAChC,QAAQ,CAAC,SAAS,KAAK,KAAK;AAC/B,UAAM,cAAc,KAAK,qBAAqB,qBAAqB;AACnE,UAAM,QAAQ,aAAa,MAAM,KAAK;AACtC,UAAM,OAAO,aAAa,MAAM,GAAG;AACnC,UAAM,eAAe,QAAQ,MAAM,SAAS,QAAQ;AACpD,UAAM,aAAa,QACd,aAAa,aAAa,SAAS,CAAC,EAAE;AAAA,IACrC,aAAa,aAAa,SAAS,CAAC,EAAE,UACtC;AAAA,KACD,KAAK,SAAS,KAAK,UAAU,QAC9B;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,EAAE,GAAG,SAAS,YAAY,GAAG,SAAS,UAAU;AAAA,MAC9D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEU,wBACR,cACA,UACA,OACwC;AACxC,UAAM,oBAA4D,CAAC;AAEnE,iBAAa,QAAQ,CAAC,SAAS;AAC7B,WAAK,YAAY,QAAQ,CAAC,SAAS;AACjC,cAAM,QAAQ,KAAK,IAAI;AACvB,cAAM,QAAQ,KAAK,IAAI;AACvB,cAAM,QAAQ,QAAQ,KAAK,IAAI;AAC/B,cAAM,QAAQ,QAAQ,KAAK,IAAI;AAC/B,cAAM,YAAY,KAAK,eAAe;AACtC,cAAM,aAAa,KAAK,gBAAgB;AAExC,cAAM,eAAe,SAAS;AAC9B,cAAM,cAAc,SAAS;AAC7B,cAAM,gBAAgB,eAAe,SAAS;AAC9C,cAAM,iBAAiB,cAAc,SAAS;AAE9C,cAAM,mBAAmB,KAAK,IAAI,OAAO,YAAY;AACrD,cAAM,kBAAkB,KAAK,IAAI,OAAO,WAAW;AACnD,cAAM,oBAAoB,KAAK,IAAI,QAAQ,WAAW,aAAa;AACnE,cAAM,qBAAqB,KAAK,IAAI,QAAQ,YAAY,cAAc;AAEtE,YAAI,mBAAmB,qBAAqB,kBAAkB,oBAAoB;AAChF,gBAAM,eAAe,oBAAoB;AACzC,gBAAM,gBAAgB,qBAAqB;AAC3C,gBAAM,YAAY,YAAY;AAC9B,gBAAM,cAAc,eAAe;AAEnC,4BAAkB,KAAK;AAAA,YACrB,YAAY,KAAK;AAAA,YACjB,WAAW,mBAAmB;AAAA,YAC9B,WAAW,kBAAkB;AAAA,YAC7B,mBAAoB,cAAc,YAAa;AAAA,YAC/C,UAAU;AAAA,cACR,QAAQ,mBAAmB,SAAS;AAAA,cACpC,QAAQ,kBAAkB,SAAS;AAAA,cACnC,cAAc,eAAe;AAAA,cAC7B,eAAe,gBAAgB;AAAA,cAC/B,OAAO;AAAA,YACT;AAAA,YACA,QAAQ;AAAA,cACN,OAAO,mBAAmB;AAAA,cAC1B,OAAO,kBAAkB;AAAA,cACzB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEU,qBACR,mBACQ;AACR,QAAI,kBAAkB,WAAW,EAAG,QAAO;AAE3C,UAAM,gBAAgB,KAAK,IAAI,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC;AACnF,UAAM,mBAAmB,kBAAkB,OAAO,CAAC,MAAM,EAAE,sBAAsB,aAAa;AAE9F,WAAO,iBAAiB,WAAW,IAC/B,iBAAiB,CAAC,EAAE,aACpB,iBAAiB,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE;AAAA,EACtE;AAAA,EAEQ,uBAAuB,YAAoB,cAA0C;AAE3F,UAAM,OAAO,aAAa,KAAK,CAACC,UAASA,MAAK,YAAY,SAAS,UAAU,CAAC;AAC9E,QAAI,CAAC,KAAM,QAAO;AAGlB,UAAM,aAAa,KAAK,YAAY,KAAK,CAAC,WAAW,OAAO,eAAe,UAAU;AACrF,QAAI,CAAC,WAAY,QAAO;AAExB,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAG,KAAK,IAAI,WAAW;AAAA,QACvB,GAAG,KAAK,IAAI,WAAW;AAAA,MACzB;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,WAAW;AAAA,QAClB,QAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,yBACE,YACA,cACA,OACA,UACA,iBACiB;AAEjB,UAAM,WAAW,KAAK,uBAAuB,YAAY,YAAY;AACrE,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,yBAAqB,6BAAc,SAAS,QAAQ,KAAK;AAG/D,QAAI,iBAAiB;AACnB,YAAM,kBAAc;AAAA,QAClB;AAAA,UACE,OAAO,SAAS,KAAK;AAAA,UACrB,QAAQ,SAAS,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,UACE,GAAG,gBAAgB;AAAA,UACnB,GAAG,gBAAgB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG,mBAAmB,IAAI,YAAY,IAAI,KAAK;AAAA,QAC/C,GAAG,mBAAmB,IAAI,YAAY,IAAI,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG,mBAAmB,IAAI,KAAK;AAAA,MAC/B,GAAG,mBAAmB,IAAI,KAAK;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,uBACE,YACA,cACA,OACA,UACA,MACa;AACb,UAAM,WAAW,KAAK,uBAAuB,YAAY,YAAY;AACrE,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,yBAAqB,6BAAc,SAAS,QAAQ,KAAK;AAE/D,UAAM,kBAAc;AAAA,MAClB;AAAA,QACE,OAAO,SAAS,KAAK;AAAA,QACrB,QAAQ,SAAS,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAG,mBAAmB,IAAI,YAAY,OAAO;AAAA,QAC7C,GAAG,mBAAmB,IAAI,YAAY,OAAO;AAAA,MAC/C;AAAA,MACA,MAAM,YAAY;AAAA,IACpB;AAAA,EACF;AACF;;;AC/PO,IAAM,yBAAN,cAAqC,mBAAmB;AAAA,EAC7D,YAAY,QAA8B;AACxC,UAAM,MAAM;AAAA,EACd;AAAA,EAEA,mBAAmB,eAAgE;AACjF,QAAI,UAAU;AACd,WAAO,cAAc,IAAI,CAAC,eAAe,UAAU;AACjD,UAAI,QAAQ;AACZ,YAAM,cAA4B,cAAc,IAAI,CAAC,SAAS;AAC5D,cAAM,SAAqB;AAAA,UACzB,YAAY,KAAK,QAAQ;AAAA,UACzB,WAAW,KAAK;AAAA,UAChB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,KAAK,KAAK;AAAA,UACjB,QAAQ,KAAK,KAAK;AAAA,UAClB,cAAc,KAAK,YAAY;AAAA,UAC/B,eAAe,KAAK,YAAY;AAAA,QAClC;AACA,iBAAS,KAAK,YAAY,QAAQ,KAAK;AACvC,eAAO;AAAA,MACT,CAAC;AACD,YAAM,QAAQ,cAAc;AAAA,QAC1B,CAAC,KAAK,MAAM,MACV,MAAM,KAAK,YAAY,SAAS,IAAI,cAAc,SAAS,IAAI,KAAK,UAAU;AAAA,QAChF;AAAA,MACF;AACA,YAAM,SAAS,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,YAAY,MAAM,CAAC;AACzE,YAAM,OAAoB;AAAA,QACxB,IAAI,QAAQ,KAAK;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,cAAc,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,QACjD;AAAA,MACF;AACA,iBAAW,SAAS,KAAK;AACzB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,cAAgE;AAClF,QAAI,aAAa,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAC5D,UAAM,WAAW,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AACnE,UAAM,cACJ,aAAa,aAAa,SAAS,CAAC,EAAE,IAAI,aAAa,aAAa,SAAS,CAAC,EAAE;AAClF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEU,gBAAgB,UAAmC;AAC3D,WAAO,SAAS;AAAA,EAClB;AAAA,EAEU,cAAc,UAAmC;AACzD,WAAO,SAAS;AAAA,EAClB;AACF;;;AChEO,IAAM,2BAAN,cAAuC,mBAAmB;AAAA,EAC/D,YAAY,QAA8B;AACxC,UAAM,MAAM;AAAA,EACd;AAAA,EAEA,mBAAmB,eAAgE;AACjF,QAAI,UAAU;AACd,WAAO,cAAc,IAAI,CAAC,eAAe,UAAU;AACjD,UAAI,QAAQ;AACZ,YAAM,cAA4B,cAAc,IAAI,CAAC,SAAS;AAC5D,cAAM,SAAqB;AAAA,UACzB,YAAY,KAAK,QAAQ;AAAA,UACzB,WAAW,KAAK;AAAA,UAChB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,KAAK,KAAK;AAAA,UACjB,QAAQ,KAAK,KAAK;AAAA,UAClB,cAAc,KAAK,YAAY;AAAA,UAC/B,eAAe,KAAK,YAAY;AAAA,QAClC;AACA,iBAAS,KAAK,YAAY,QAAQ,KAAK;AACvC,eAAO;AAAA,MACT,CAAC;AACD,YAAM,QAAQ,cAAc;AAAA,QAC1B,CAAC,KAAK,MAAM,MACV,MAAM,KAAK,YAAY,SAAS,IAAI,cAAc,SAAS,IAAI,KAAK,UAAU;AAAA,QAChF;AAAA,MACF;AACA,YAAM,SAAS,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,YAAY,MAAM,CAAC;AACzE,YAAM,OAAoB;AAAA,QACxB,IAAI,QAAQ,KAAK;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,cAAc,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,QACjD;AAAA,MACF;AACA,iBAAW,QAAQ,KAAK;AACxB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,cAAgE;AAClF,QAAI,aAAa,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAC5D,UAAM,aACJ,aAAa,aAAa,SAAS,CAAC,EAAE,IAAI,aAAa,aAAa,SAAS,CAAC,EAAE;AAClF,UAAM,YAAY,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AACrE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEU,gBAAgB,UAAmC;AAC3D,WAAO,SAAS;AAAA,EAClB;AAAA,EAEU,cAAc,UAAmC;AACzD,WAAO,SAAS;AAAA,EAClB;AACF;;;ACjEO,IAAM,sBAAsB;AAC5B,IAAM,8BAA8B;AACpC,IAAM,qBAAqB;AAsB3B,SAAS,kBAAkB,SAAwD;AACxF,SAAO,EAAE,MAAM,qBAAqB,QAAQ;AAC9C;AASO,SAAS,iBAAiB,SAAyC;AACxE,SAAO,EAAE,MAAM,oBAAoB,QAAQ;AAC7C;;;ACtCO,IAAM,oBAAoB,CAAC,OAAoB,UAAkC;AACtF,SAAO;AAAA,IACL,cAAc,MAAM;AAAA,IACpB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM,iBAAiB,QAAQ;AAAA,IAC3C,aAAa,MAAM,iBAAiB,SAAS;AAAA,IAC7C,SAAS,MAAM,UAAU;AAAA,IACzB,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM,oBAAoB,IAAI,CAAC,QAAQ;AAC5C,aAAO;AAAA,QACL,GAAG,MAAM,aAAa,GAAG;AAAA,QACzB,aAAa,MAAM,aAAa,GAAG,EAAE,YAAY,IAAI,CAAC,WAAW;AAC/D,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,cAAc,OAAO,eAAe;AAAA,YACpC,eAAe,OAAO,gBAAgB;AAAA,YACtC,OAAO,OAAO,QAAQ;AAAA,YACtB,QAAQ,OAAO,SAAS;AAAA,UAC1B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ANsBO,IAAM,eAAN,cAA2B,uBAKhC;AAAA,EAkBA,YACkB,IAChB,UACQ,QACR;AACA,UAAM,IAAI,QAAQ;AAJF;AAER;AAhBV,SAAQ,eAAuB;AAC/B,SAAQ,kBAA4B,wBAAS;AAE7C,SAAQ,cAAsB;AAC9B,SAAQ,cAAuB;AAE/B,SAAiB,cAAU,mCAA2C;AACtE,SAAiB,cAAU,mCAAqC;AAChE,SAAiB,aAAS,mCAAmC;AAC7D,SAAiB,sBAAkB,mCAAsC;AACzE,SAAiB,kBAAc,mCAAyC;AACxE,SAAiB,mBAAe,mCAA+B;AAS7D,SAAK,WAAW,KAAK,SAAS,UAA0B,UAAU,EAAG,SAAS;AAE9E,SAAK,iBAAiB;AAAA,MACpB,SAAS,KAAK,QAAQ,WAAW;AAAA,MACjC,aAAa,KAAK,SAAS,eAAe;AAAA,MAC1C,YAAY,KAAK,QAAQ,cAAc;AAAA,IACzC;AAEA,SAAK,WACH,KAAK,QAAQ,6CACT,IAAI,yBAAyB,KAAK,cAAc,IAChD,IAAI,uBAAuB,KAAK,cAAc;AAEpD,SAAK,cAAc,KAAK,QAAQ;AAChC,SAAK,eAAe,KAAK,UAAU,KAAK;AACxC,SAAK,kBAAkB,KAAK,UAAU,KAAK;AAE3C,SAAK,SAAS,iBAAiB,CAAC,OAAO,KAAK,cAAc,KAAK,eAAe,EAAE,CAAC,GAAG;AAAA,MAClF,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,SAAK,UAAU,SAAS,0BAAc,CAAC,SAAS,UAAU;AACxD,YAAM,aAAa,MAAM,KAAK,MAAM;AACpC,WAAK,SAAS,iBAAiB,UAAU,CAAC;AAC1C,WAAK,YAAY,KAAK,EAAE,YAAY,KAAK,aAAa,WAAW,CAAC;AAClE,WAAK,eAAW,qCAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAW,CAAC;AAAA,IACjF,CAAC;AACD,SAAK,UAAU;AAAA,MAAS;AAAA,MAAc,CAAC,SAAS,UAC9C,KAAK,eAAW,qCAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAW,CAAC;AAAA,IACjF;AACA,SAAK,UAAU;AAAA,MAAS;AAAA,MAAW,CAAC,SAAS,UAC3C,KAAK,eAAW,qCAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAW,CAAC;AAAA,IACjF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,OAAyC;AAC7D,UAAM,eAAe,KAAK,SAAS,mBAAmB,KAAK;AAC3D,UAAM,mBAAmB,KAAK,SAAS,oBAAoB,YAAY;AACvE,WAAO,EAAE,cAAc,iBAAiB;AAAA,EAC1C;AAAA,EAEQ,eAAe,IAAqB,QAAuB,KAAK,MAAM,cAAc;AAC1F,WAAO,KAAK,SAAS,aAAa,IAAI,OAAO,KAAK,YAAY;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAO,YAA2B,MAAc;AAEtD,SAAK,SAAS,kBAAkB,UAAU,CAAC;AAG3C,QAAI,MAAM,OAAQ,MAAK,QAAQ,KAAK,KAAK,MAAM;AAC/C,QAAI,MAAM,SAAS;AACjB,WAAK,QAAQ,KAAK,KAAK,OAAO;AAE9B,UAAI,KAAK,QAAQ,gBAAgB,KAAK,aAAa;AACjD,aAAK,cAAc,KAAK,QAAQ;AAChC,aAAK,YAAY,KAAK,EAAE,YAAY,KAAK,aAAa,YAAY,KAAK,MAAM,WAAW,CAAC;AAAA,MAC3F;AAAA,IACF;AAGA,SAAK,gBAAgB,KAAK,KAAK,2BAA2B,CAAC;AAAA,EAC7D;AAAA;AAAA,EAGQ,cAAc,SAAwB;AAC5C,SAAK,OAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EAClC;AAAA;AAAA,EAGQ,WAAW,OAAyC,IAAqB;AAC/E,UAAM,SAAS,KAAK,cAAc,KAAK;AACvC,UAAM,UAAU,KAAK,eAAe,IAAI,OAAO,YAAY;AAE3D,SAAK,OAAO,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,EAAE,QAAQ,QAAQ,CAAC;AAAA,EAC5D;AAAA,EAEQ,2BAA0C;AAChD,WAAO,KAAK,MAAM,gBAAgB,CAAC;AAAA,EACrC;AAAA,EAEQ,6BAA6C;AACnD,UAAM,QAAQ,KAAK,UAAU,KAAK;AAClC,WAAO,kBAAkB,KAAK,OAAO,KAAK;AAAA,EAC5C;AAAA,EAEQ,mBAAmB;AACzB,SAAK,gBAAgB,KAAK,KAAK,2BAA2B,CAAC;AAAA,EAC7D;AAAA,EAES,eAAe,YAAyB,WAA8B;AAC7E,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAES,mBACP,WACA,UACM;AACN,QAAI,UAAU,KAAK,UAAU,SAAS,KAAK,OAAO;AAChD,WAAK,eAAe,SAAS,KAAK;AAClC,WAAK,cAAc,KAAK,eAAe,KAAK,SAAS,WAAW,CAAC,CAAC;AAAA,IACpE;AACA,QAAI,UAAU,KAAK,aAAa,SAAS,KAAK,UAAU;AACtD,WAAK,kBAAkB,SAAS,KAAK;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,aAA6B;AAErD,QACG,iDACC,KAAK,oBAAoB,4BAC1B,6CAA2C,KAAK,oBAAoB,wBACrE;AACA;AAAA,IACF;AAEA,SAAK,WACH,gDACI,IAAI,yBAAyB,KAAK,cAAc,IAChD,IAAI,uBAAuB,KAAK,cAAc;AAGpD,SAAK;AAAA,MACH,kBAAkB;AAAA,QAChB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAGA,UAAM,YAAQ,qCAAwB,KAAK,UAAU,IAAI;AACzD,SAAK,WAAW,OAAO,KAAK,SAAS,WAAW,CAAC;AAAA,EACnD;AAAA,EAEO,iBAAiB;AACtB,QAAI,KAAK,YAAa;AAEtB,SAAK,cAAc;AACnB,SAAK,aAAa,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEU,kBAAoC;AAC5C,WAAO;AAAA,MACL,eAAe,KAAK,OAAO;AAAA,MAC3B,gBAAgB,KAAK,QAAQ;AAAA,MAC7B,UAAU,KAAK,QAAQ;AAAA,MACvB,cAAc,KAAK,YAAY;AAAA,MAC/B,gBAAgB,KAAK,gBAAgB;AAAA,MACrC,eAAe,KAAK,aAAa;AAAA,MACjC,gBAAgB,MAAM,KAAK;AAAA,MAC3B,eAAe,MAAM,KAAK,MAAM;AAAA,MAChC,cAAc,CAAC,YAAiC;AAC9C,cAAM,EAAE,YAAY,WAAW,UAAU,iBAAiB,SAAS,MAAM,IAAI;AAC7E,cAAM,eAAe,KAAK,yBAAyB;AACnD,cAAM,WAAW,KAAK,SAAS;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,QACF;AACA,YAAI,UAAU;AACZ,eAAK,SAAS,SAAS,EAAE,GAAG,UAAU,UAAU,OAAO,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,MACA,kBAAkB,CAAC,WAAW,aAAa;AACzC,cAAM,eAAe,KAAK,yBAAyB;AACnD,cAAM,mBAAmB,aAAa;AAAA,UAAU,CAAC,SAC/C,KAAK,YAAY,SAAS,KAAK,WAAW;AAAA,QAC5C;AACA,YAAI,oBAAoB,KAAK,mBAAmB,aAAa,SAAS,GAAG;AACvE,gBAAM,WAAW,aAAa,mBAAmB,CAAC;AAClD,gBAAM,WAAW,KAAK,SAAS;AAAA,YAC7B,SAAS,YAAY,CAAC;AAAA,YACtB;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AACA,cAAI,UAAU;AACZ,iBAAK,SAAS,SAAS,EAAE,GAAG,UAAU,SAAS,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,sBAAsB,CAAC,WAAW,aAAa;AAC7C,cAAM,eAAe,KAAK,yBAAyB;AACnD,cAAM,mBAAmB,aAAa;AAAA,UAAU,CAAC,SAC/C,KAAK,YAAY,SAAS,KAAK,WAAW;AAAA,QAC5C;AACA,YAAI,mBAAmB,GAAG;AACxB,gBAAM,WAAW,aAAa,mBAAmB,CAAC;AAClD,gBAAM,WAAW,KAAK,SAAS;AAAA,YAC7B,SAAS,YAAY,CAAC;AAAA,YACtB;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AACA,cAAI,UAAU;AACZ,iBAAK,SAAS,SAAS,EAAE,GAAG,UAAU,SAAS,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY,KAAK,WAAW,KAAK,IAAI;AAAA,MACrC,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,MACnC,wBAAwB,KAAK,uBAAuB,KAAK,IAAI;AAAA,MAC7D,YAAY,MAAM,KAAK,MAAM;AAAA,MAC7B,mBAAmB,MAAM,KAAK,2BAA2B;AAAA,MACzD,mBAAmB,CAAC,aAA6B,KAAK,kBAAkB,QAAQ;AAAA,IAClF;AAAA,EACF;AAAA,EAEQ,WAAW,UAA2C;AAC5D,UAAM,UAAU,YAAY,KAAK,SAAS,WAAW;AACrD,UAAM,eAAe,KAAK,yBAAyB;AACnD,WAAO,KAAK,SAAS,aAAa,SAAS,cAAc,KAAK,YAAY;AAAA,EAC5E;AAAA,EAEQ,YAAiC;AACvC,WAAO;AAAA,MACL,cAAc,KAAK,MAAM;AAAA,MACzB,kBAAkB,KAAK,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,uBACN,WACA,MACA,OACA,UACa;AACb,WAAO,KAAK,SAAS;AAAA,MACnB,YAAY;AAAA,MACZ,KAAK,MAAM;AAAA,MACX,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAAA,EAElC;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,QAAQ,MAAM;AACnB,SAAK,QAAQ,MAAM;AACnB,SAAK,YAAY,MAAM;AACvB,SAAK,OAAO,MAAM;AAClB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,aAAa,MAAM;AACxB,UAAM,QAAQ;AAAA,EAChB;AACF;AArSa,aAMK,KAAK;;;AOlDhB,IAAM,mBAAmB;AAEzB,IAAM,WAA+C;AAAA,EAC1D,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU,CAAC,QAAQ;AAAA,EACnB,UAAU,CAAC,UAAU;AAAA,EACrB,UAAU,CAAC;AAAA,EACX,eAAe;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;;;AChBA,IAAAC,eAA8D;AASvD,IAAM,uBAAsC;AAAA,EACjD,aAAa;AAAA,EACb,cAAc,CAAC;AAAA,EACf,uBAAuB,CAAC;AAAA,EACxB,qBAAqB,CAAC;AAAA,EACtB,cAAc,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAC3B,cAAc;AAAA,EACd,YAAY;AACd;AAEO,IAAM,eAAkF,CAC7F,WACA,YACI;AAAA,EACJ,cAAc,CAAC;AAAA,EACf,YAAY,UAAU,MAAM;AAAA,EAC5B,kBAAkB,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,EACxC,uBAAuB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACpC,UAAU,OAAO;AAAA,EACjB,SAAS,OAAO,WAAW;AAAA,EAC3B,OAAO,UAAU;AAAA,EACjB,GAAG;AACL;AAEO,IAAM,gBAAqE,CAChF,OACA,WACG;AACH,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,YAAY,OAAO,QAAQ;AAAA,IAChD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAO,QAAQ;AAAA,IAC3C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,GAAG,OAAO,QAAQ;AAAA,IACvC,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,uBAAuB,OAAO,QAAQ;AAAA,IAC3D;AACE,aAAO;AAAA,EACX;AACF;;;AC1CO,IAAM,sBAKT;AAAA,EACF;AAAA,EACA,QAAQ,CAAC,UAAU,SAAS,WAAW,IAAI,aAAa,kBAAkB,UAAU,MAAM;AAAA,EAC1F,SAAS;AAAA,EACT,cAAc,CAAC,WAAW,WAAW,aAAa,WAAW,MAAM;AACrE;","names":["import_models","ScrollStrategy","item","import_core"]}
package/dist/index.d.cts CHANGED
@@ -121,6 +121,7 @@ interface ScrollCapability {
121
121
  getTotalPages(): number;
122
122
  onPageChange: EventHook<PageChangePayload>;
123
123
  onLayoutChange: EventHook<LayoutChangePayload>;
124
+ onLayoutReady: EventHook<boolean>;
124
125
  scrollToPage(options: ScrollToPageOptions): void;
125
126
  scrollToNextPage(behavior?: ScrollBehavior): void;
126
127
  scrollToPreviousPage(behavior?: ScrollBehavior): void;
@@ -163,11 +164,13 @@ declare class ScrollPlugin extends BasePlugin<ScrollPluginConfig, ScrollCapabili
163
164
  private currentRotation;
164
165
  private initialPage?;
165
166
  private currentPage;
167
+ private layoutReady;
166
168
  private readonly layout$;
167
169
  private readonly scroll$;
168
170
  private readonly state$;
169
171
  private readonly scrollerLayout$;
170
172
  private readonly pageChange$;
173
+ private readonly layoutReady$;
171
174
  constructor(id: string, registry: PluginRegistry, config?: ScrollPluginConfig | undefined);
172
175
  private computeLayout;
173
176
  private computeMetrics;
@@ -184,6 +187,7 @@ declare class ScrollPlugin extends BasePlugin<ScrollPluginConfig, ScrollCapabili
184
187
  * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical
185
188
  */
186
189
  private setScrollStrategy;
190
+ setLayoutReady(): void;
187
191
  protected buildCapability(): ScrollCapability;
188
192
  private getMetrics;
189
193
  private getLayout;
package/dist/index.d.ts CHANGED
@@ -121,6 +121,7 @@ interface ScrollCapability {
121
121
  getTotalPages(): number;
122
122
  onPageChange: EventHook<PageChangePayload>;
123
123
  onLayoutChange: EventHook<LayoutChangePayload>;
124
+ onLayoutReady: EventHook<boolean>;
124
125
  scrollToPage(options: ScrollToPageOptions): void;
125
126
  scrollToNextPage(behavior?: ScrollBehavior): void;
126
127
  scrollToPreviousPage(behavior?: ScrollBehavior): void;
@@ -163,11 +164,13 @@ declare class ScrollPlugin extends BasePlugin<ScrollPluginConfig, ScrollCapabili
163
164
  private currentRotation;
164
165
  private initialPage?;
165
166
  private currentPage;
167
+ private layoutReady;
166
168
  private readonly layout$;
167
169
  private readonly scroll$;
168
170
  private readonly state$;
169
171
  private readonly scrollerLayout$;
170
172
  private readonly pageChange$;
173
+ private readonly layoutReady$;
171
174
  constructor(id: string, registry: PluginRegistry, config?: ScrollPluginConfig | undefined);
172
175
  private computeLayout;
173
176
  private computeMetrics;
@@ -184,6 +187,7 @@ declare class ScrollPlugin extends BasePlugin<ScrollPluginConfig, ScrollCapabili
184
187
  * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical
185
188
  */
186
189
  private setScrollStrategy;
190
+ setLayoutReady(): void;
187
191
  protected buildCapability(): ScrollCapability;
188
192
  private getMetrics;
189
193
  private getLayout;
package/dist/index.js CHANGED
@@ -357,11 +357,13 @@ var ScrollPlugin = class extends BasePlugin {
357
357
  this.currentScale = 1;
358
358
  this.currentRotation = Rotation2.Degree0;
359
359
  this.currentPage = 1;
360
+ this.layoutReady = false;
360
361
  this.layout$ = createBehaviorEmitter();
361
362
  this.scroll$ = createBehaviorEmitter();
362
363
  this.state$ = createBehaviorEmitter();
363
364
  this.scrollerLayout$ = createBehaviorEmitter();
364
365
  this.pageChange$ = createBehaviorEmitter();
366
+ this.layoutReady$ = createBehaviorEmitter();
365
367
  this.viewport = this.registry.getPlugin("viewport").provides();
366
368
  this.strategyConfig = {
367
369
  pageGap: this.config?.pageGap ?? 10,
@@ -466,6 +468,11 @@ var ScrollPlugin = class extends BasePlugin {
466
468
  const pages = getPagesWithRotatedSize(this.coreState.core);
467
469
  this.refreshAll(pages, this.viewport.getMetrics());
468
470
  }
471
+ setLayoutReady() {
472
+ if (this.layoutReady) return;
473
+ this.layoutReady = true;
474
+ this.layoutReady$.emit(true);
475
+ }
469
476
  buildCapability() {
470
477
  return {
471
478
  onStateChange: this.state$.on,
@@ -473,6 +480,7 @@ var ScrollPlugin = class extends BasePlugin {
473
480
  onScroll: this.scroll$.on,
474
481
  onPageChange: this.pageChange$.on,
475
482
  onScrollerData: this.scrollerLayout$.on,
483
+ onLayoutReady: this.layoutReady$.on,
476
484
  getCurrentPage: () => this.currentPage,
477
485
  getTotalPages: () => this.state.totalPages,
478
486
  scrollToPage: (options) => {
@@ -560,6 +568,8 @@ var ScrollPlugin = class extends BasePlugin {
560
568
  this.scroll$.clear();
561
569
  this.pageChange$.clear();
562
570
  this.state$.clear();
571
+ this.scrollerLayout$.clear();
572
+ this.layoutReady$.clear();
563
573
  super.destroy();
564
574
  }
565
575
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/scroll-plugin.ts","../src/lib/types.ts","../src/lib/strategies/base-strategy.ts","../src/lib/strategies/vertical-strategy.ts","../src/lib/strategies/horizontal-strategy.ts","../src/lib/actions.ts","../src/lib/selectors.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import {\n BasePlugin,\n CoreState,\n PluginRegistry,\n SET_DOCUMENT,\n SET_PAGES,\n SET_ROTATION,\n StoreState,\n createBehaviorEmitter,\n createEmitter,\n getPagesWithRotatedSize,\n} from '@embedpdf/core';\nimport {\n PdfPageObject,\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n restoreRect,\n rotateRect,\n Rotation,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportCapability, ViewportMetrics, ViewportPlugin } from '@embedpdf/plugin-viewport';\nimport {\n ScrollCapability,\n ScrollPluginConfig,\n ScrollStrategy,\n ScrollMetrics,\n ScrollState,\n LayoutChangePayload,\n ScrollerLayout,\n ScrollToPageOptions,\n PageChangePayload,\n} from './types';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './strategies/base-strategy';\nimport { VerticalScrollStrategy } from './strategies/vertical-strategy';\nimport { HorizontalScrollStrategy } from './strategies/horizontal-strategy';\nimport { updateScrollState, ScrollAction, updateTotalPages } from './actions';\nimport { VirtualItem } from './types/virtual-item';\nimport { getScrollerLayout } from './selectors';\n\ntype PartialScroll = Partial<ScrollState>;\ntype Emits = {\n layout?: LayoutChangePayload;\n metrics?: ScrollMetrics;\n};\n\nexport class ScrollPlugin extends BasePlugin<\n ScrollPluginConfig,\n ScrollCapability,\n ScrollState,\n ScrollAction\n> {\n static readonly id = 'scroll' as const;\n private viewport: ViewportCapability;\n private strategy: BaseScrollStrategy;\n private strategyConfig: ScrollStrategyConfig;\n private currentScale: number = 1;\n private currentRotation: Rotation = Rotation.Degree0;\n private initialPage?: number;\n private currentPage: number = 1;\n\n private readonly layout$ = createBehaviorEmitter<LayoutChangePayload>();\n private readonly scroll$ = createBehaviorEmitter<ScrollMetrics>();\n private readonly state$ = createBehaviorEmitter<ScrollState>();\n private readonly scrollerLayout$ = createBehaviorEmitter<ScrollerLayout>();\n private readonly pageChange$ = createBehaviorEmitter<PageChangePayload>();\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n private config?: ScrollPluginConfig,\n ) {\n super(id, registry);\n\n this.viewport = this.registry.getPlugin<ViewportPlugin>('viewport')!.provides();\n\n this.strategyConfig = {\n pageGap: this.config?.pageGap ?? 10,\n viewportGap: this.viewport.getViewportGap(),\n bufferSize: this.config?.bufferSize ?? 2,\n };\n\n this.strategy =\n this.config?.strategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n this.initialPage = this.config?.initialPage;\n this.currentScale = this.coreState.core.scale;\n this.currentRotation = this.coreState.core.rotation;\n // Subscribe to viewport and page manager events\n this.viewport.onViewportChange((vp) => this.commitMetrics(this.computeMetrics(vp)), {\n mode: 'throttle',\n wait: 250,\n });\n this.coreStore.onAction(SET_DOCUMENT, (_action, state) => {\n const totalPages = state.core.pages.length;\n this.dispatch(updateTotalPages(totalPages));\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages });\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics());\n });\n this.coreStore.onAction(SET_ROTATION, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n this.coreStore.onAction(SET_PAGES, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴘᴜᴛᴇʀs */\n /* ------------------------------------------------------------------ */\n\n private computeLayout(pages: PdfPageObjectWithRotatedSize[][]) {\n const virtualItems = this.strategy.createVirtualItems(pages);\n const totalContentSize = this.strategy.getTotalContentSize(virtualItems);\n return { virtualItems, totalContentSize };\n }\n\n private computeMetrics(vp: ViewportMetrics, items: VirtualItem[] = this.state.virtualItems) {\n return this.strategy.handleScroll(vp, items, this.currentScale);\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴍɪᴛ (single source of truth) */\n /* ------------------------------------------------------------------ */\n\n private commit(stateDelta: PartialScroll, emit?: Emits) {\n /* update Redux-like store */\n this.dispatch(updateScrollState(stateDelta));\n\n /* fire optional events */\n if (emit?.layout) this.layout$.emit(emit.layout);\n if (emit?.metrics) {\n this.scroll$.emit(emit.metrics);\n\n if (emit.metrics.currentPage !== this.currentPage) {\n this.currentPage = emit.metrics.currentPage;\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages: this.state.totalPages });\n }\n }\n\n /* keep scroller-layout reactive */\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n /* convenience wrappers */\n private commitMetrics(metrics: ScrollMetrics) {\n this.commit(metrics, { metrics });\n }\n\n /* full re-compute after page-spread or initialisation */\n private refreshAll(pages: PdfPageObjectWithRotatedSize[][], vp: ViewportMetrics) {\n const layout = this.computeLayout(pages);\n const metrics = this.computeMetrics(vp, layout.virtualItems);\n\n this.commit({ ...layout, ...metrics }, { layout, metrics });\n }\n\n private getVirtualItemsFromState(): VirtualItem[] {\n return this.state.virtualItems || [];\n }\n\n private getScrollerLayoutFromState(): ScrollerLayout {\n const scale = this.coreState.core.scale;\n return getScrollerLayout(this.state, scale);\n }\n\n private pushScrollLayout() {\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n override onStoreUpdated(_prevState: ScrollState, _newState: ScrollState): void {\n this.pushScrollLayout();\n }\n\n override onCoreStoreUpdated(\n prevState: StoreState<CoreState>,\n newState: StoreState<CoreState>,\n ): void {\n if (prevState.core.scale !== newState.core.scale) {\n this.currentScale = newState.core.scale;\n this.commitMetrics(this.computeMetrics(this.viewport.getMetrics()));\n }\n if (prevState.core.rotation !== newState.core.rotation) {\n this.currentRotation = newState.core.rotation;\n }\n }\n\n /**\n * Change the scroll strategy at runtime (e.g., vertical <-> horizontal)\n * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical\n */\n private setScrollStrategy(newStrategy: ScrollStrategy) {\n // Only update if the strategy is actually changing\n if (\n (newStrategy === ScrollStrategy.Horizontal &&\n this.strategy instanceof HorizontalScrollStrategy) ||\n (newStrategy === ScrollStrategy.Vertical && this.strategy instanceof VerticalScrollStrategy)\n ) {\n return;\n }\n\n this.strategy =\n newStrategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n // Update state with new strategy\n this.dispatch(\n updateScrollState({\n strategy: newStrategy,\n }),\n );\n\n // Recalculate layout and scroll metrics\n const pages = getPagesWithRotatedSize(this.coreState.core);\n this.refreshAll(pages, this.viewport.getMetrics());\n }\n\n protected buildCapability(): ScrollCapability {\n return {\n onStateChange: this.state$.on,\n onLayoutChange: this.layout$.on,\n onScroll: this.scroll$.on,\n onPageChange: this.pageChange$.on,\n onScrollerData: this.scrollerLayout$.on,\n getCurrentPage: () => this.currentPage,\n getTotalPages: () => this.state.totalPages,\n scrollToPage: (options: ScrollToPageOptions) => {\n const { pageNumber, behavior = 'smooth', pageCoordinates, center = false } = options;\n const virtualItems = this.getVirtualItemsFromState();\n const position = this.strategy.getScrollPositionForPage(\n pageNumber,\n virtualItems,\n this.currentScale,\n this.currentRotation,\n pageCoordinates,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior, center });\n }\n },\n scrollToNextPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex >= 0 && currentItemIndex < virtualItems.length - 1) {\n const nextItem = virtualItems[currentItemIndex + 1];\n const position = this.strategy.getScrollPositionForPage(\n nextItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n scrollToPreviousPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex > 0) {\n const prevItem = virtualItems[currentItemIndex - 1];\n const position = this.strategy.getScrollPositionForPage(\n prevItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n getMetrics: this.getMetrics.bind(this),\n getLayout: this.getLayout.bind(this),\n getRectPositionForPage: this.getRectPositionForPage.bind(this),\n getPageGap: () => this.state.pageGap,\n getScrollerLayout: () => this.getScrollerLayoutFromState(),\n setScrollStrategy: (strategy: ScrollStrategy) => this.setScrollStrategy(strategy),\n };\n }\n\n private getMetrics(viewport?: ViewportMetrics): ScrollMetrics {\n const metrics = viewport || this.viewport.getMetrics();\n const virtualItems = this.getVirtualItemsFromState();\n return this.strategy.handleScroll(metrics, virtualItems, this.currentScale);\n }\n\n private getLayout(): LayoutChangePayload {\n return {\n virtualItems: this.state.virtualItems,\n totalContentSize: this.state.totalContentSize,\n };\n }\n\n private getRectPositionForPage(\n pageIndex: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null {\n return this.strategy.getRectPositionForPage(\n pageIndex + 1,\n this.state.virtualItems,\n scale ?? this.currentScale,\n rotation ?? this.currentRotation,\n rect,\n );\n }\n\n async initialize(): Promise<void> {\n // No DOM initialization needed; state drives rendering\n }\n\n async destroy(): Promise<void> {\n this.layout$.clear();\n this.scroll$.clear();\n this.pageChange$.clear();\n this.state$.clear();\n super.destroy();\n }\n}\n","import { BasePluginConfig, Emitter, EventHook } from '@embedpdf/core';\nimport { PdfPageObject, Rect, Rotation } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from './types/virtual-item';\n\nexport interface ScrollState extends ScrollMetrics {\n virtualItems: VirtualItem[];\n totalPages: number;\n totalContentSize: { width: number; height: number };\n desiredScrollPosition: { x: number; y: number };\n strategy: ScrollStrategy;\n pageGap: number;\n scale: number;\n}\n\nexport interface ScrollerLayout {\n startSpacing: number;\n endSpacing: number;\n totalWidth: number;\n totalHeight: number;\n pageGap: number;\n strategy: ScrollState['strategy'];\n items: VirtualItem[];\n}\n\nexport enum ScrollStrategy {\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n}\n\nexport interface PageVisibilityMetrics {\n pageNumber: number;\n viewportX: number;\n viewportY: number;\n visiblePercentage: number;\n original: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n scaled: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n}\n\nexport interface ScrollMetrics {\n currentPage: number;\n visiblePages: number[];\n pageVisibilityMetrics: PageVisibilityMetrics[];\n renderedPageIndexes: number[];\n scrollOffset: { x: number; y: number };\n startSpacing: number;\n endSpacing: number;\n}\n\nexport interface ScrollStrategyInterface {\n initialize(container: HTMLElement, innerDiv: HTMLElement): void;\n destroy(): void;\n updateLayout(viewport: ViewportMetrics, pdfPageObject: PdfPageObject[][]): void;\n handleScroll(viewport: ViewportMetrics): void;\n getVirtualItems(): VirtualItem[];\n scrollToPage(pageNumber: number, behavior?: ScrollBehavior): void;\n calculateDimensions(pdfPageObject: PdfPageObject[][]): void;\n}\n\nexport interface ScrollPluginConfig extends BasePluginConfig {\n strategy?: ScrollStrategy;\n initialPage?: number;\n bufferSize?: number;\n pageGap?: number;\n}\n\nexport type LayoutChangePayload = Pick<ScrollState, 'virtualItems' | 'totalContentSize'>;\n\nexport interface ScrollToPageOptions {\n pageNumber: number;\n pageCoordinates?: { x: number; y: number };\n behavior?: ScrollBehavior;\n center?: boolean;\n}\n\nexport interface PageChangePayload {\n pageNumber: number;\n totalPages: number;\n}\n\nexport interface ScrollCapability {\n onScrollerData: EventHook<ScrollerLayout>;\n onStateChange: EventHook<ScrollState>;\n onScroll: EventHook<ScrollMetrics>;\n getCurrentPage(): number;\n getTotalPages(): number;\n onPageChange: EventHook<PageChangePayload>;\n onLayoutChange: EventHook<LayoutChangePayload>;\n scrollToPage(options: ScrollToPageOptions): void;\n scrollToNextPage(behavior?: ScrollBehavior): void;\n scrollToPreviousPage(behavior?: ScrollBehavior): void;\n getMetrics(viewport?: ViewportMetrics): ScrollMetrics;\n getLayout(): LayoutChangePayload;\n getScrollerLayout(): ScrollerLayout;\n getRectPositionForPage(\n page: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null;\n setScrollStrategy(strategy: ScrollStrategy): void;\n getPageGap(): number;\n}\n","import {\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n Rotation,\n scalePosition,\n transformPosition,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport interface ScrollStrategyConfig {\n pageGap?: number;\n viewportGap?: number;\n bufferSize?: number;\n}\n\nexport abstract class BaseScrollStrategy {\n protected pageGap: number;\n protected viewportGap: number;\n protected bufferSize: number;\n\n constructor(config: ScrollStrategyConfig) {\n this.pageGap = config.pageGap ?? 20;\n this.viewportGap = config.viewportGap ?? 20;\n this.bufferSize = config.bufferSize ?? 2;\n }\n\n abstract createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[];\n abstract getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number };\n protected abstract getScrollOffset(viewport: ViewportMetrics): number;\n protected abstract getClientSize(viewport: ViewportMetrics): number;\n\n protected getVisibleRange(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): { start: number; end: number } {\n const scrollOffset = this.getScrollOffset(viewport);\n const clientSize = this.getClientSize(viewport);\n const viewportStart = scrollOffset;\n const viewportEnd = scrollOffset + clientSize;\n\n let startIndex = 0;\n while (\n startIndex < virtualItems.length &&\n (virtualItems[startIndex].offset + virtualItems[startIndex].height) * scale <= viewportStart\n ) {\n startIndex++;\n }\n\n let endIndex = startIndex;\n while (endIndex < virtualItems.length && virtualItems[endIndex].offset * scale <= viewportEnd) {\n endIndex++;\n }\n\n return {\n start: Math.max(0, startIndex - this.bufferSize),\n end: Math.min(virtualItems.length - 1, endIndex + this.bufferSize - 1),\n };\n }\n\n handleScroll(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): ScrollMetrics {\n const range = this.getVisibleRange(viewport, virtualItems, scale);\n const visibleItems = virtualItems.slice(range.start, range.end + 1);\n const pageVisibilityMetrics = this.calculatePageVisibility(visibleItems, viewport, scale);\n const visiblePages = pageVisibilityMetrics.map((m) => m.pageNumber);\n const renderedPageIndexes = virtualItems\n .slice(range.start, range.end + 1)\n .flatMap((item) => item.index);\n const currentPage = this.determineCurrentPage(pageVisibilityMetrics);\n const first = virtualItems[range.start];\n const last = virtualItems[range.end];\n const startSpacing = first ? first.offset * scale : 0;\n const endSpacing = last\n ? (virtualItems[virtualItems.length - 1].offset + // end of content\n virtualItems[virtualItems.length - 1].height) *\n scale - // minus\n (last.offset + last.height) * scale // end of last rendered\n : 0;\n\n return {\n currentPage,\n visiblePages,\n pageVisibilityMetrics,\n renderedPageIndexes,\n scrollOffset: { x: viewport.scrollLeft, y: viewport.scrollTop },\n startSpacing,\n endSpacing,\n };\n }\n\n protected calculatePageVisibility(\n virtualItems: VirtualItem[],\n viewport: ViewportMetrics,\n scale: number,\n ): ScrollMetrics['pageVisibilityMetrics'] {\n const visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'] = [];\n\n virtualItems.forEach((item) => {\n item.pageLayouts.forEach((page) => {\n const itemX = item.x * scale;\n const itemY = item.y * scale;\n const pageX = itemX + page.x * scale;\n const pageY = itemY + page.y * scale;\n const pageWidth = page.rotatedWidth * scale;\n const pageHeight = page.rotatedHeight * scale;\n\n const viewportLeft = viewport.scrollLeft;\n const viewportTop = viewport.scrollTop;\n const viewportRight = viewportLeft + viewport.clientWidth;\n const viewportBottom = viewportTop + viewport.clientHeight;\n\n const intersectionLeft = Math.max(pageX, viewportLeft);\n const intersectionTop = Math.max(pageY, viewportTop);\n const intersectionRight = Math.min(pageX + pageWidth, viewportRight);\n const intersectionBottom = Math.min(pageY + pageHeight, viewportBottom);\n\n if (intersectionLeft < intersectionRight && intersectionTop < intersectionBottom) {\n const visibleWidth = intersectionRight - intersectionLeft;\n const visibleHeight = intersectionBottom - intersectionTop;\n const totalArea = pageWidth * pageHeight;\n const visibleArea = visibleWidth * visibleHeight;\n\n visibilityMetrics.push({\n pageNumber: page.pageNumber,\n viewportX: intersectionLeft - viewportLeft,\n viewportY: intersectionTop - viewportTop,\n visiblePercentage: (visibleArea / totalArea) * 100,\n original: {\n pageX: (intersectionLeft - pageX) / scale,\n pageY: (intersectionTop - pageY) / scale,\n visibleWidth: visibleWidth / scale,\n visibleHeight: visibleHeight / scale,\n scale: 1,\n },\n scaled: {\n pageX: intersectionLeft - pageX,\n pageY: intersectionTop - pageY,\n visibleWidth,\n visibleHeight,\n scale,\n },\n });\n }\n });\n });\n\n return visibilityMetrics;\n }\n\n protected determineCurrentPage(\n visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'],\n ): number {\n if (visibilityMetrics.length === 0) return 1;\n\n const maxVisibility = Math.max(...visibilityMetrics.map((m) => m.visiblePercentage));\n const mostVisiblePages = visibilityMetrics.filter((m) => m.visiblePercentage === maxVisibility);\n\n return mostVisiblePages.length === 1\n ? mostVisiblePages[0].pageNumber\n : mostVisiblePages.sort((a, b) => a.pageNumber - b.pageNumber)[0].pageNumber;\n }\n\n private getRectLocationForPage(pageNumber: number, virtualItems: VirtualItem[]): Rect | null {\n // Find the virtual item containing the page\n const item = virtualItems.find((item) => item.pageNumbers.includes(pageNumber));\n if (!item) return null;\n\n // Find the specific page layout for the requested page number\n const pageLayout = item.pageLayouts.find((layout) => layout.pageNumber === pageNumber);\n if (!pageLayout) return null;\n\n return {\n origin: {\n x: item.x + pageLayout.x,\n y: item.y + pageLayout.y,\n },\n size: {\n width: pageLayout.width,\n height: pageLayout.height,\n },\n };\n }\n\n getScrollPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n pageCoordinates?: { x: number; y: number },\n ): Position | null {\n // Find the virtual item containing the page\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n // If specific page coordinates are provided, add them to the base position\n if (pageCoordinates) {\n const rotatedSize = transformPosition(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n {\n x: pageCoordinates.x,\n y: pageCoordinates.y,\n },\n rotation,\n scale,\n );\n\n return {\n x: scaledBasePosition.x + rotatedSize.x + this.viewportGap,\n y: scaledBasePosition.y + rotatedSize.y + this.viewportGap,\n };\n }\n\n return {\n x: scaledBasePosition.x + this.viewportGap,\n y: scaledBasePosition.y + this.viewportGap,\n };\n }\n\n getRectPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n rect: Rect,\n ): Rect | null {\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n const rotatedSize = transformRect(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n rect,\n rotation,\n scale,\n );\n\n return {\n origin: {\n x: scaledBasePosition.x + rotatedSize.origin.x,\n y: scaledBasePosition.y + rotatedSize.origin.y,\n },\n size: rotatedSize.size,\n };\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport class VerticalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let yOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: 0,\n y: yOffset,\n offset: yOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n yOffset += height + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const maxWidth = Math.max(...virtualItems.map((item) => item.width));\n const totalHeight =\n virtualItems[virtualItems.length - 1].y + virtualItems[virtualItems.length - 1].height;\n return {\n width: maxWidth,\n height: totalHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollTop;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientHeight;\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\n\nexport class HorizontalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let xOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: xOffset,\n y: 0,\n offset: xOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n xOffset += width + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const totalWidth =\n virtualItems[virtualItems.length - 1].x + virtualItems[virtualItems.length - 1].width;\n const maxHeight = Math.max(...virtualItems.map((item) => item.height));\n return {\n width: totalWidth,\n height: maxHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollLeft;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientWidth;\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { ScrollState } from './types';\n\nexport const UPDATE_SCROLL_STATE = 'UPDATE_SCROLL_STATE';\nexport const SET_DESIRED_SCROLL_POSITION = 'SET_DESIRED_SCROLL_POSITION';\nexport const UPDATE_TOTAL_PAGES = 'UPDATE_TOTAL_PAGES';\n\nexport interface UpdateScrollStateAction extends Action {\n type: typeof UPDATE_SCROLL_STATE;\n payload: Partial<ScrollState>;\n}\n\nexport interface SetDesiredScrollPositionAction extends Action {\n type: typeof SET_DESIRED_SCROLL_POSITION;\n payload: { x: number; y: number };\n}\n\nexport interface UpdateTotalPagesAction extends Action {\n type: typeof UPDATE_TOTAL_PAGES;\n payload: number;\n}\n\nexport type ScrollAction =\n | UpdateScrollStateAction\n | SetDesiredScrollPositionAction\n | UpdateTotalPagesAction;\n\nexport function updateScrollState(payload: Partial<ScrollState>): UpdateScrollStateAction {\n return { type: UPDATE_SCROLL_STATE, payload };\n}\n\nexport function setDesiredScrollPosition(payload: {\n x: number;\n y: number;\n}): SetDesiredScrollPositionAction {\n return { type: SET_DESIRED_SCROLL_POSITION, payload };\n}\n\nexport function updateTotalPages(payload: number): UpdateTotalPagesAction {\n return { type: UPDATE_TOTAL_PAGES, payload };\n}\n","import { ScrollerLayout, ScrollState } from './types';\n\nexport const getScrollerLayout = (state: ScrollState, scale: number): ScrollerLayout => {\n return {\n startSpacing: state.startSpacing,\n endSpacing: state.endSpacing,\n totalWidth: state.totalContentSize.width * scale,\n totalHeight: state.totalContentSize.height * scale,\n pageGap: state.pageGap * scale,\n strategy: state.strategy,\n items: state.renderedPageIndexes.map((idx) => {\n return {\n ...state.virtualItems[idx],\n pageLayouts: state.virtualItems[idx].pageLayouts.map((layout) => {\n return {\n ...layout,\n rotatedWidth: layout.rotatedWidth * scale,\n rotatedHeight: layout.rotatedHeight * scale,\n width: layout.width * scale,\n height: layout.height * scale,\n };\n }),\n };\n }),\n };\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { ScrollPluginConfig } from './types';\n\nexport const SCROLL_PLUGIN_ID = 'scroll';\n\nexport const manifest: PluginManifest<ScrollPluginConfig> = {\n id: SCROLL_PLUGIN_ID,\n name: 'Scroll Plugin',\n version: '1.0.0',\n provides: ['scroll'],\n requires: ['viewport'],\n optional: [],\n defaultConfig: {\n enabled: true,\n pageGap: 10,\n },\n};\n","import { Reducer, CoreState, SET_SCALE, SetScaleAction } from '@embedpdf/core';\nimport { ScrollState, ScrollStrategy, ScrollPluginConfig, ScrollMetrics } from './types';\nimport {\n ScrollAction,\n UPDATE_SCROLL_STATE,\n SET_DESIRED_SCROLL_POSITION,\n UPDATE_TOTAL_PAGES,\n} from './actions';\n\nexport const defaultScrollMetrics: ScrollMetrics = {\n currentPage: 1,\n visiblePages: [],\n pageVisibilityMetrics: [],\n renderedPageIndexes: [],\n scrollOffset: { x: 0, y: 0 },\n startSpacing: 0,\n endSpacing: 0,\n};\n\nexport const initialState: (coreState: CoreState, config: ScrollPluginConfig) => ScrollState = (\n coreState,\n config,\n) => ({\n virtualItems: [],\n totalPages: coreState.pages.length,\n totalContentSize: { width: 0, height: 0 },\n desiredScrollPosition: { x: 0, y: 0 },\n strategy: config.strategy ?? ScrollStrategy.Vertical,\n pageGap: config.pageGap ?? 10,\n scale: coreState.scale,\n ...defaultScrollMetrics,\n});\n\nexport const scrollReducer: Reducer<ScrollState, ScrollAction | SetScaleAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case UPDATE_TOTAL_PAGES:\n return { ...state, totalPages: action.payload };\n case SET_SCALE:\n return { ...state, scale: action.payload };\n case UPDATE_SCROLL_STATE:\n return { ...state, ...action.payload };\n case SET_DESIRED_SCROLL_POSITION:\n return { ...state, desiredScrollPosition: action.payload };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { ScrollPlugin } from './scroll-plugin';\nimport { manifest, SCROLL_PLUGIN_ID } from './manifest';\nimport { ScrollPluginConfig, ScrollState } from './types';\nimport { scrollReducer, initialState } from './reducer';\nimport { ScrollAction } from './actions';\n\nexport const ScrollPluginPackage: PluginPackage<\n ScrollPlugin,\n ScrollPluginConfig,\n ScrollState,\n ScrollAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ScrollPlugin(SCROLL_PLUGIN_ID, registry, config),\n reducer: scrollReducer,\n initialState: (coreState, config) => initialState(coreState, config),\n};\n\nexport * from './scroll-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './types/virtual-item';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EAOE,YAAAA;AAAA,OAEK;;;ACIA,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,gBAAa;AAFH,SAAAA;AAAA,GAAA;;;ACzBZ;AAAA,EAKE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAWA,IAAe,qBAAf,MAAkC;AAAA,EAKvC,YAAY,QAA8B;AACxC,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,cAAc,OAAO,eAAe;AACzC,SAAK,aAAa,OAAO,cAAc;AAAA,EACzC;AAAA,EAOU,gBACR,UACA,cACA,OACgC;AAChC,UAAM,eAAe,KAAK,gBAAgB,QAAQ;AAClD,UAAM,aAAa,KAAK,cAAc,QAAQ;AAC9C,UAAM,gBAAgB;AACtB,UAAM,cAAc,eAAe;AAEnC,QAAI,aAAa;AACjB,WACE,aAAa,aAAa,WACzB,aAAa,UAAU,EAAE,SAAS,aAAa,UAAU,EAAE,UAAU,SAAS,eAC/E;AACA;AAAA,IACF;AAEA,QAAI,WAAW;AACf,WAAO,WAAW,aAAa,UAAU,aAAa,QAAQ,EAAE,SAAS,SAAS,aAAa;AAC7F;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,KAAK,IAAI,GAAG,aAAa,KAAK,UAAU;AAAA,MAC/C,KAAK,KAAK,IAAI,aAAa,SAAS,GAAG,WAAW,KAAK,aAAa,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,aACE,UACA,cACA,OACe;AACf,UAAM,QAAQ,KAAK,gBAAgB,UAAU,cAAc,KAAK;AAChE,UAAM,eAAe,aAAa,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC;AAClE,UAAM,wBAAwB,KAAK,wBAAwB,cAAc,UAAU,KAAK;AACxF,UAAM,eAAe,sBAAsB,IAAI,CAAC,MAAM,EAAE,UAAU;AAClE,UAAM,sBAAsB,aACzB,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC,EAChC,QAAQ,CAAC,SAAS,KAAK,KAAK;AAC/B,UAAM,cAAc,KAAK,qBAAqB,qBAAqB;AACnE,UAAM,QAAQ,aAAa,MAAM,KAAK;AACtC,UAAM,OAAO,aAAa,MAAM,GAAG;AACnC,UAAM,eAAe,QAAQ,MAAM,SAAS,QAAQ;AACpD,UAAM,aAAa,QACd,aAAa,aAAa,SAAS,CAAC,EAAE;AAAA,IACrC,aAAa,aAAa,SAAS,CAAC,EAAE,UACtC;AAAA,KACD,KAAK,SAAS,KAAK,UAAU,QAC9B;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,EAAE,GAAG,SAAS,YAAY,GAAG,SAAS,UAAU;AAAA,MAC9D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEU,wBACR,cACA,UACA,OACwC;AACxC,UAAM,oBAA4D,CAAC;AAEnE,iBAAa,QAAQ,CAAC,SAAS;AAC7B,WAAK,YAAY,QAAQ,CAAC,SAAS;AACjC,cAAM,QAAQ,KAAK,IAAI;AACvB,cAAM,QAAQ,KAAK,IAAI;AACvB,cAAM,QAAQ,QAAQ,KAAK,IAAI;AAC/B,cAAM,QAAQ,QAAQ,KAAK,IAAI;AAC/B,cAAM,YAAY,KAAK,eAAe;AACtC,cAAM,aAAa,KAAK,gBAAgB;AAExC,cAAM,eAAe,SAAS;AAC9B,cAAM,cAAc,SAAS;AAC7B,cAAM,gBAAgB,eAAe,SAAS;AAC9C,cAAM,iBAAiB,cAAc,SAAS;AAE9C,cAAM,mBAAmB,KAAK,IAAI,OAAO,YAAY;AACrD,cAAM,kBAAkB,KAAK,IAAI,OAAO,WAAW;AACnD,cAAM,oBAAoB,KAAK,IAAI,QAAQ,WAAW,aAAa;AACnE,cAAM,qBAAqB,KAAK,IAAI,QAAQ,YAAY,cAAc;AAEtE,YAAI,mBAAmB,qBAAqB,kBAAkB,oBAAoB;AAChF,gBAAM,eAAe,oBAAoB;AACzC,gBAAM,gBAAgB,qBAAqB;AAC3C,gBAAM,YAAY,YAAY;AAC9B,gBAAM,cAAc,eAAe;AAEnC,4BAAkB,KAAK;AAAA,YACrB,YAAY,KAAK;AAAA,YACjB,WAAW,mBAAmB;AAAA,YAC9B,WAAW,kBAAkB;AAAA,YAC7B,mBAAoB,cAAc,YAAa;AAAA,YAC/C,UAAU;AAAA,cACR,QAAQ,mBAAmB,SAAS;AAAA,cACpC,QAAQ,kBAAkB,SAAS;AAAA,cACnC,cAAc,eAAe;AAAA,cAC7B,eAAe,gBAAgB;AAAA,cAC/B,OAAO;AAAA,YACT;AAAA,YACA,QAAQ;AAAA,cACN,OAAO,mBAAmB;AAAA,cAC1B,OAAO,kBAAkB;AAAA,cACzB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEU,qBACR,mBACQ;AACR,QAAI,kBAAkB,WAAW,EAAG,QAAO;AAE3C,UAAM,gBAAgB,KAAK,IAAI,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC;AACnF,UAAM,mBAAmB,kBAAkB,OAAO,CAAC,MAAM,EAAE,sBAAsB,aAAa;AAE9F,WAAO,iBAAiB,WAAW,IAC/B,iBAAiB,CAAC,EAAE,aACpB,iBAAiB,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE;AAAA,EACtE;AAAA,EAEQ,uBAAuB,YAAoB,cAA0C;AAE3F,UAAM,OAAO,aAAa,KAAK,CAACC,UAASA,MAAK,YAAY,SAAS,UAAU,CAAC;AAC9E,QAAI,CAAC,KAAM,QAAO;AAGlB,UAAM,aAAa,KAAK,YAAY,KAAK,CAAC,WAAW,OAAO,eAAe,UAAU;AACrF,QAAI,CAAC,WAAY,QAAO;AAExB,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAG,KAAK,IAAI,WAAW;AAAA,QACvB,GAAG,KAAK,IAAI,WAAW;AAAA,MACzB;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,WAAW;AAAA,QAClB,QAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,yBACE,YACA,cACA,OACA,UACA,iBACiB;AAEjB,UAAM,WAAW,KAAK,uBAAuB,YAAY,YAAY;AACrE,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,qBAAqB,cAAc,SAAS,QAAQ,KAAK;AAG/D,QAAI,iBAAiB;AACnB,YAAM,cAAc;AAAA,QAClB;AAAA,UACE,OAAO,SAAS,KAAK;AAAA,UACrB,QAAQ,SAAS,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,UACE,GAAG,gBAAgB;AAAA,UACnB,GAAG,gBAAgB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG,mBAAmB,IAAI,YAAY,IAAI,KAAK;AAAA,QAC/C,GAAG,mBAAmB,IAAI,YAAY,IAAI,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG,mBAAmB,IAAI,KAAK;AAAA,MAC/B,GAAG,mBAAmB,IAAI,KAAK;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,uBACE,YACA,cACA,OACA,UACA,MACa;AACb,UAAM,WAAW,KAAK,uBAAuB,YAAY,YAAY;AACrE,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,qBAAqB,cAAc,SAAS,QAAQ,KAAK;AAE/D,UAAM,cAAc;AAAA,MAClB;AAAA,QACE,OAAO,SAAS,KAAK;AAAA,QACrB,QAAQ,SAAS,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAG,mBAAmB,IAAI,YAAY,OAAO;AAAA,QAC7C,GAAG,mBAAmB,IAAI,YAAY,OAAO;AAAA,MAC/C;AAAA,MACA,MAAM,YAAY;AAAA,IACpB;AAAA,EACF;AACF;;;AC/PO,IAAM,yBAAN,cAAqC,mBAAmB;AAAA,EAC7D,YAAY,QAA8B;AACxC,UAAM,MAAM;AAAA,EACd;AAAA,EAEA,mBAAmB,eAAgE;AACjF,QAAI,UAAU;AACd,WAAO,cAAc,IAAI,CAAC,eAAe,UAAU;AACjD,UAAI,QAAQ;AACZ,YAAM,cAA4B,cAAc,IAAI,CAAC,SAAS;AAC5D,cAAM,SAAqB;AAAA,UACzB,YAAY,KAAK,QAAQ;AAAA,UACzB,WAAW,KAAK;AAAA,UAChB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,KAAK,KAAK;AAAA,UACjB,QAAQ,KAAK,KAAK;AAAA,UAClB,cAAc,KAAK,YAAY;AAAA,UAC/B,eAAe,KAAK,YAAY;AAAA,QAClC;AACA,iBAAS,KAAK,YAAY,QAAQ,KAAK;AACvC,eAAO;AAAA,MACT,CAAC;AACD,YAAM,QAAQ,cAAc;AAAA,QAC1B,CAAC,KAAK,MAAM,MACV,MAAM,KAAK,YAAY,SAAS,IAAI,cAAc,SAAS,IAAI,KAAK,UAAU;AAAA,QAChF;AAAA,MACF;AACA,YAAM,SAAS,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,YAAY,MAAM,CAAC;AACzE,YAAM,OAAoB;AAAA,QACxB,IAAI,QAAQ,KAAK;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,cAAc,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,QACjD;AAAA,MACF;AACA,iBAAW,SAAS,KAAK;AACzB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,cAAgE;AAClF,QAAI,aAAa,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAC5D,UAAM,WAAW,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AACnE,UAAM,cACJ,aAAa,aAAa,SAAS,CAAC,EAAE,IAAI,aAAa,aAAa,SAAS,CAAC,EAAE;AAClF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEU,gBAAgB,UAAmC;AAC3D,WAAO,SAAS;AAAA,EAClB;AAAA,EAEU,cAAc,UAAmC;AACzD,WAAO,SAAS;AAAA,EAClB;AACF;;;AChEO,IAAM,2BAAN,cAAuC,mBAAmB;AAAA,EAC/D,YAAY,QAA8B;AACxC,UAAM,MAAM;AAAA,EACd;AAAA,EAEA,mBAAmB,eAAgE;AACjF,QAAI,UAAU;AACd,WAAO,cAAc,IAAI,CAAC,eAAe,UAAU;AACjD,UAAI,QAAQ;AACZ,YAAM,cAA4B,cAAc,IAAI,CAAC,SAAS;AAC5D,cAAM,SAAqB;AAAA,UACzB,YAAY,KAAK,QAAQ;AAAA,UACzB,WAAW,KAAK;AAAA,UAChB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,KAAK,KAAK;AAAA,UACjB,QAAQ,KAAK,KAAK;AAAA,UAClB,cAAc,KAAK,YAAY;AAAA,UAC/B,eAAe,KAAK,YAAY;AAAA,QAClC;AACA,iBAAS,KAAK,YAAY,QAAQ,KAAK;AACvC,eAAO;AAAA,MACT,CAAC;AACD,YAAM,QAAQ,cAAc;AAAA,QAC1B,CAAC,KAAK,MAAM,MACV,MAAM,KAAK,YAAY,SAAS,IAAI,cAAc,SAAS,IAAI,KAAK,UAAU;AAAA,QAChF;AAAA,MACF;AACA,YAAM,SAAS,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,YAAY,MAAM,CAAC;AACzE,YAAM,OAAoB;AAAA,QACxB,IAAI,QAAQ,KAAK;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,cAAc,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,QACjD;AAAA,MACF;AACA,iBAAW,QAAQ,KAAK;AACxB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,cAAgE;AAClF,QAAI,aAAa,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAC5D,UAAM,aACJ,aAAa,aAAa,SAAS,CAAC,EAAE,IAAI,aAAa,aAAa,SAAS,CAAC,EAAE;AAClF,UAAM,YAAY,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AACrE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEU,gBAAgB,UAAmC;AAC3D,WAAO,SAAS;AAAA,EAClB;AAAA,EAEU,cAAc,UAAmC;AACzD,WAAO,SAAS;AAAA,EAClB;AACF;;;ACjEO,IAAM,sBAAsB;AAC5B,IAAM,8BAA8B;AACpC,IAAM,qBAAqB;AAsB3B,SAAS,kBAAkB,SAAwD;AACxF,SAAO,EAAE,MAAM,qBAAqB,QAAQ;AAC9C;AASO,SAAS,iBAAiB,SAAyC;AACxE,SAAO,EAAE,MAAM,oBAAoB,QAAQ;AAC7C;;;ACtCO,IAAM,oBAAoB,CAAC,OAAoB,UAAkC;AACtF,SAAO;AAAA,IACL,cAAc,MAAM;AAAA,IACpB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM,iBAAiB,QAAQ;AAAA,IAC3C,aAAa,MAAM,iBAAiB,SAAS;AAAA,IAC7C,SAAS,MAAM,UAAU;AAAA,IACzB,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM,oBAAoB,IAAI,CAAC,QAAQ;AAC5C,aAAO;AAAA,QACL,GAAG,MAAM,aAAa,GAAG;AAAA,QACzB,aAAa,MAAM,aAAa,GAAG,EAAE,YAAY,IAAI,CAAC,WAAW;AAC/D,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,cAAc,OAAO,eAAe;AAAA,YACpC,eAAe,OAAO,gBAAgB;AAAA,YACtC,OAAO,OAAO,QAAQ;AAAA,YACtB,QAAQ,OAAO,SAAS;AAAA,UAC1B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ANsBO,IAAM,eAAN,cAA2B,WAKhC;AAAA,EAgBA,YACkB,IAChB,UACQ,QACR;AACA,UAAM,IAAI,QAAQ;AAJF;AAER;AAdV,SAAQ,eAAuB;AAC/B,SAAQ,kBAA4BC,UAAS;AAE7C,SAAQ,cAAsB;AAE9B,SAAiB,UAAU,sBAA2C;AACtE,SAAiB,UAAU,sBAAqC;AAChE,SAAiB,SAAS,sBAAmC;AAC7D,SAAiB,kBAAkB,sBAAsC;AACzE,SAAiB,cAAc,sBAAyC;AAStE,SAAK,WAAW,KAAK,SAAS,UAA0B,UAAU,EAAG,SAAS;AAE9E,SAAK,iBAAiB;AAAA,MACpB,SAAS,KAAK,QAAQ,WAAW;AAAA,MACjC,aAAa,KAAK,SAAS,eAAe;AAAA,MAC1C,YAAY,KAAK,QAAQ,cAAc;AAAA,IACzC;AAEA,SAAK,WACH,KAAK,QAAQ,6CACT,IAAI,yBAAyB,KAAK,cAAc,IAChD,IAAI,uBAAuB,KAAK,cAAc;AAEpD,SAAK,cAAc,KAAK,QAAQ;AAChC,SAAK,eAAe,KAAK,UAAU,KAAK;AACxC,SAAK,kBAAkB,KAAK,UAAU,KAAK;AAE3C,SAAK,SAAS,iBAAiB,CAAC,OAAO,KAAK,cAAc,KAAK,eAAe,EAAE,CAAC,GAAG;AAAA,MAClF,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,SAAK,UAAU,SAAS,cAAc,CAAC,SAAS,UAAU;AACxD,YAAM,aAAa,MAAM,KAAK,MAAM;AACpC,WAAK,SAAS,iBAAiB,UAAU,CAAC;AAC1C,WAAK,YAAY,KAAK,EAAE,YAAY,KAAK,aAAa,WAAW,CAAC;AAClE,WAAK,WAAW,wBAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAW,CAAC;AAAA,IACjF,CAAC;AACD,SAAK,UAAU;AAAA,MAAS;AAAA,MAAc,CAAC,SAAS,UAC9C,KAAK,WAAW,wBAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAW,CAAC;AAAA,IACjF;AACA,SAAK,UAAU;AAAA,MAAS;AAAA,MAAW,CAAC,SAAS,UAC3C,KAAK,WAAW,wBAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAW,CAAC;AAAA,IACjF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,OAAyC;AAC7D,UAAM,eAAe,KAAK,SAAS,mBAAmB,KAAK;AAC3D,UAAM,mBAAmB,KAAK,SAAS,oBAAoB,YAAY;AACvE,WAAO,EAAE,cAAc,iBAAiB;AAAA,EAC1C;AAAA,EAEQ,eAAe,IAAqB,QAAuB,KAAK,MAAM,cAAc;AAC1F,WAAO,KAAK,SAAS,aAAa,IAAI,OAAO,KAAK,YAAY;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAO,YAA2B,MAAc;AAEtD,SAAK,SAAS,kBAAkB,UAAU,CAAC;AAG3C,QAAI,MAAM,OAAQ,MAAK,QAAQ,KAAK,KAAK,MAAM;AAC/C,QAAI,MAAM,SAAS;AACjB,WAAK,QAAQ,KAAK,KAAK,OAAO;AAE9B,UAAI,KAAK,QAAQ,gBAAgB,KAAK,aAAa;AACjD,aAAK,cAAc,KAAK,QAAQ;AAChC,aAAK,YAAY,KAAK,EAAE,YAAY,KAAK,aAAa,YAAY,KAAK,MAAM,WAAW,CAAC;AAAA,MAC3F;AAAA,IACF;AAGA,SAAK,gBAAgB,KAAK,KAAK,2BAA2B,CAAC;AAAA,EAC7D;AAAA;AAAA,EAGQ,cAAc,SAAwB;AAC5C,SAAK,OAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EAClC;AAAA;AAAA,EAGQ,WAAW,OAAyC,IAAqB;AAC/E,UAAM,SAAS,KAAK,cAAc,KAAK;AACvC,UAAM,UAAU,KAAK,eAAe,IAAI,OAAO,YAAY;AAE3D,SAAK,OAAO,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,EAAE,QAAQ,QAAQ,CAAC;AAAA,EAC5D;AAAA,EAEQ,2BAA0C;AAChD,WAAO,KAAK,MAAM,gBAAgB,CAAC;AAAA,EACrC;AAAA,EAEQ,6BAA6C;AACnD,UAAM,QAAQ,KAAK,UAAU,KAAK;AAClC,WAAO,kBAAkB,KAAK,OAAO,KAAK;AAAA,EAC5C;AAAA,EAEQ,mBAAmB;AACzB,SAAK,gBAAgB,KAAK,KAAK,2BAA2B,CAAC;AAAA,EAC7D;AAAA,EAES,eAAe,YAAyB,WAA8B;AAC7E,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAES,mBACP,WACA,UACM;AACN,QAAI,UAAU,KAAK,UAAU,SAAS,KAAK,OAAO;AAChD,WAAK,eAAe,SAAS,KAAK;AAClC,WAAK,cAAc,KAAK,eAAe,KAAK,SAAS,WAAW,CAAC,CAAC;AAAA,IACpE;AACA,QAAI,UAAU,KAAK,aAAa,SAAS,KAAK,UAAU;AACtD,WAAK,kBAAkB,SAAS,KAAK;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,aAA6B;AAErD,QACG,iDACC,KAAK,oBAAoB,4BAC1B,6CAA2C,KAAK,oBAAoB,wBACrE;AACA;AAAA,IACF;AAEA,SAAK,WACH,gDACI,IAAI,yBAAyB,KAAK,cAAc,IAChD,IAAI,uBAAuB,KAAK,cAAc;AAGpD,SAAK;AAAA,MACH,kBAAkB;AAAA,QAChB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAGA,UAAM,QAAQ,wBAAwB,KAAK,UAAU,IAAI;AACzD,SAAK,WAAW,OAAO,KAAK,SAAS,WAAW,CAAC;AAAA,EACnD;AAAA,EAEU,kBAAoC;AAC5C,WAAO;AAAA,MACL,eAAe,KAAK,OAAO;AAAA,MAC3B,gBAAgB,KAAK,QAAQ;AAAA,MAC7B,UAAU,KAAK,QAAQ;AAAA,MACvB,cAAc,KAAK,YAAY;AAAA,MAC/B,gBAAgB,KAAK,gBAAgB;AAAA,MACrC,gBAAgB,MAAM,KAAK;AAAA,MAC3B,eAAe,MAAM,KAAK,MAAM;AAAA,MAChC,cAAc,CAAC,YAAiC;AAC9C,cAAM,EAAE,YAAY,WAAW,UAAU,iBAAiB,SAAS,MAAM,IAAI;AAC7E,cAAM,eAAe,KAAK,yBAAyB;AACnD,cAAM,WAAW,KAAK,SAAS;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,QACF;AACA,YAAI,UAAU;AACZ,eAAK,SAAS,SAAS,EAAE,GAAG,UAAU,UAAU,OAAO,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,MACA,kBAAkB,CAAC,WAAW,aAAa;AACzC,cAAM,eAAe,KAAK,yBAAyB;AACnD,cAAM,mBAAmB,aAAa;AAAA,UAAU,CAAC,SAC/C,KAAK,YAAY,SAAS,KAAK,WAAW;AAAA,QAC5C;AACA,YAAI,oBAAoB,KAAK,mBAAmB,aAAa,SAAS,GAAG;AACvE,gBAAM,WAAW,aAAa,mBAAmB,CAAC;AAClD,gBAAM,WAAW,KAAK,SAAS;AAAA,YAC7B,SAAS,YAAY,CAAC;AAAA,YACtB;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AACA,cAAI,UAAU;AACZ,iBAAK,SAAS,SAAS,EAAE,GAAG,UAAU,SAAS,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,sBAAsB,CAAC,WAAW,aAAa;AAC7C,cAAM,eAAe,KAAK,yBAAyB;AACnD,cAAM,mBAAmB,aAAa;AAAA,UAAU,CAAC,SAC/C,KAAK,YAAY,SAAS,KAAK,WAAW;AAAA,QAC5C;AACA,YAAI,mBAAmB,GAAG;AACxB,gBAAM,WAAW,aAAa,mBAAmB,CAAC;AAClD,gBAAM,WAAW,KAAK,SAAS;AAAA,YAC7B,SAAS,YAAY,CAAC;AAAA,YACtB;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AACA,cAAI,UAAU;AACZ,iBAAK,SAAS,SAAS,EAAE,GAAG,UAAU,SAAS,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY,KAAK,WAAW,KAAK,IAAI;AAAA,MACrC,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,MACnC,wBAAwB,KAAK,uBAAuB,KAAK,IAAI;AAAA,MAC7D,YAAY,MAAM,KAAK,MAAM;AAAA,MAC7B,mBAAmB,MAAM,KAAK,2BAA2B;AAAA,MACzD,mBAAmB,CAAC,aAA6B,KAAK,kBAAkB,QAAQ;AAAA,IAClF;AAAA,EACF;AAAA,EAEQ,WAAW,UAA2C;AAC5D,UAAM,UAAU,YAAY,KAAK,SAAS,WAAW;AACrD,UAAM,eAAe,KAAK,yBAAyB;AACnD,WAAO,KAAK,SAAS,aAAa,SAAS,cAAc,KAAK,YAAY;AAAA,EAC5E;AAAA,EAEQ,YAAiC;AACvC,WAAO;AAAA,MACL,cAAc,KAAK,MAAM;AAAA,MACzB,kBAAkB,KAAK,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,uBACN,WACA,MACA,OACA,UACa;AACb,WAAO,KAAK,SAAS;AAAA,MACnB,YAAY;AAAA,MACZ,KAAK,MAAM;AAAA,MACX,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAAA,EAElC;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,QAAQ,MAAM;AACnB,SAAK,QAAQ,MAAM;AACnB,SAAK,YAAY,MAAM;AACvB,SAAK,OAAO,MAAM;AAClB,UAAM,QAAQ;AAAA,EAChB;AACF;AAzRa,aAMK,KAAK;;;AOlDhB,IAAM,mBAAmB;AAEzB,IAAM,WAA+C;AAAA,EAC1D,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU,CAAC,QAAQ;AAAA,EACnB,UAAU,CAAC,UAAU;AAAA,EACrB,UAAU,CAAC;AAAA,EACX,eAAe;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;;;AChBA,SAA6B,iBAAiC;AASvD,IAAM,uBAAsC;AAAA,EACjD,aAAa;AAAA,EACb,cAAc,CAAC;AAAA,EACf,uBAAuB,CAAC;AAAA,EACxB,qBAAqB,CAAC;AAAA,EACtB,cAAc,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAC3B,cAAc;AAAA,EACd,YAAY;AACd;AAEO,IAAM,eAAkF,CAC7F,WACA,YACI;AAAA,EACJ,cAAc,CAAC;AAAA,EACf,YAAY,UAAU,MAAM;AAAA,EAC5B,kBAAkB,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,EACxC,uBAAuB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACpC,UAAU,OAAO;AAAA,EACjB,SAAS,OAAO,WAAW;AAAA,EAC3B,OAAO,UAAU;AAAA,EACjB,GAAG;AACL;AAEO,IAAM,gBAAqE,CAChF,OACA,WACG;AACH,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,YAAY,OAAO,QAAQ;AAAA,IAChD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAO,QAAQ;AAAA,IAC3C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,GAAG,OAAO,QAAQ;AAAA,IACvC,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,uBAAuB,OAAO,QAAQ;AAAA,IAC3D;AACE,aAAO;AAAA,EACX;AACF;;;AC1CO,IAAM,sBAKT;AAAA,EACF;AAAA,EACA,QAAQ,CAAC,UAAU,SAAS,WAAW,IAAI,aAAa,kBAAkB,UAAU,MAAM;AAAA,EAC1F,SAAS;AAAA,EACT,cAAc,CAAC,WAAW,WAAW,aAAa,WAAW,MAAM;AACrE;","names":["Rotation","ScrollStrategy","item","Rotation"]}
1
+ {"version":3,"sources":["../src/lib/scroll-plugin.ts","../src/lib/types.ts","../src/lib/strategies/base-strategy.ts","../src/lib/strategies/vertical-strategy.ts","../src/lib/strategies/horizontal-strategy.ts","../src/lib/actions.ts","../src/lib/selectors.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import {\n BasePlugin,\n CoreState,\n PluginRegistry,\n SET_DOCUMENT,\n SET_PAGES,\n SET_ROTATION,\n StoreState,\n createBehaviorEmitter,\n createEmitter,\n getPagesWithRotatedSize,\n} from '@embedpdf/core';\nimport {\n PdfPageObject,\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n restoreRect,\n rotateRect,\n Rotation,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportCapability, ViewportMetrics, ViewportPlugin } from '@embedpdf/plugin-viewport';\nimport {\n ScrollCapability,\n ScrollPluginConfig,\n ScrollStrategy,\n ScrollMetrics,\n ScrollState,\n LayoutChangePayload,\n ScrollerLayout,\n ScrollToPageOptions,\n PageChangePayload,\n} from './types';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './strategies/base-strategy';\nimport { VerticalScrollStrategy } from './strategies/vertical-strategy';\nimport { HorizontalScrollStrategy } from './strategies/horizontal-strategy';\nimport { updateScrollState, ScrollAction, updateTotalPages } from './actions';\nimport { VirtualItem } from './types/virtual-item';\nimport { getScrollerLayout } from './selectors';\n\ntype PartialScroll = Partial<ScrollState>;\ntype Emits = {\n layout?: LayoutChangePayload;\n metrics?: ScrollMetrics;\n};\n\nexport class ScrollPlugin extends BasePlugin<\n ScrollPluginConfig,\n ScrollCapability,\n ScrollState,\n ScrollAction\n> {\n static readonly id = 'scroll' as const;\n private viewport: ViewportCapability;\n private strategy: BaseScrollStrategy;\n private strategyConfig: ScrollStrategyConfig;\n private currentScale: number = 1;\n private currentRotation: Rotation = Rotation.Degree0;\n private initialPage?: number;\n private currentPage: number = 1;\n private layoutReady: boolean = false;\n\n private readonly layout$ = createBehaviorEmitter<LayoutChangePayload>();\n private readonly scroll$ = createBehaviorEmitter<ScrollMetrics>();\n private readonly state$ = createBehaviorEmitter<ScrollState>();\n private readonly scrollerLayout$ = createBehaviorEmitter<ScrollerLayout>();\n private readonly pageChange$ = createBehaviorEmitter<PageChangePayload>();\n private readonly layoutReady$ = createBehaviorEmitter<boolean>();\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n private config?: ScrollPluginConfig,\n ) {\n super(id, registry);\n\n this.viewport = this.registry.getPlugin<ViewportPlugin>('viewport')!.provides();\n\n this.strategyConfig = {\n pageGap: this.config?.pageGap ?? 10,\n viewportGap: this.viewport.getViewportGap(),\n bufferSize: this.config?.bufferSize ?? 2,\n };\n\n this.strategy =\n this.config?.strategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n this.initialPage = this.config?.initialPage;\n this.currentScale = this.coreState.core.scale;\n this.currentRotation = this.coreState.core.rotation;\n // Subscribe to viewport and page manager events\n this.viewport.onViewportChange((vp) => this.commitMetrics(this.computeMetrics(vp)), {\n mode: 'throttle',\n wait: 250,\n });\n this.coreStore.onAction(SET_DOCUMENT, (_action, state) => {\n const totalPages = state.core.pages.length;\n this.dispatch(updateTotalPages(totalPages));\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages });\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics());\n });\n this.coreStore.onAction(SET_ROTATION, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n this.coreStore.onAction(SET_PAGES, (_action, state) =>\n this.refreshAll(getPagesWithRotatedSize(state.core), this.viewport.getMetrics()),\n );\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴘᴜᴛᴇʀs */\n /* ------------------------------------------------------------------ */\n\n private computeLayout(pages: PdfPageObjectWithRotatedSize[][]) {\n const virtualItems = this.strategy.createVirtualItems(pages);\n const totalContentSize = this.strategy.getTotalContentSize(virtualItems);\n return { virtualItems, totalContentSize };\n }\n\n private computeMetrics(vp: ViewportMetrics, items: VirtualItem[] = this.state.virtualItems) {\n return this.strategy.handleScroll(vp, items, this.currentScale);\n }\n\n /* ------------------------------------------------------------------ */\n /* ᴄᴏᴍᴍɪᴛ (single source of truth) */\n /* ------------------------------------------------------------------ */\n\n private commit(stateDelta: PartialScroll, emit?: Emits) {\n /* update Redux-like store */\n this.dispatch(updateScrollState(stateDelta));\n\n /* fire optional events */\n if (emit?.layout) this.layout$.emit(emit.layout);\n if (emit?.metrics) {\n this.scroll$.emit(emit.metrics);\n\n if (emit.metrics.currentPage !== this.currentPage) {\n this.currentPage = emit.metrics.currentPage;\n this.pageChange$.emit({ pageNumber: this.currentPage, totalPages: this.state.totalPages });\n }\n }\n\n /* keep scroller-layout reactive */\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n /* convenience wrappers */\n private commitMetrics(metrics: ScrollMetrics) {\n this.commit(metrics, { metrics });\n }\n\n /* full re-compute after page-spread or initialisation */\n private refreshAll(pages: PdfPageObjectWithRotatedSize[][], vp: ViewportMetrics) {\n const layout = this.computeLayout(pages);\n const metrics = this.computeMetrics(vp, layout.virtualItems);\n\n this.commit({ ...layout, ...metrics }, { layout, metrics });\n }\n\n private getVirtualItemsFromState(): VirtualItem[] {\n return this.state.virtualItems || [];\n }\n\n private getScrollerLayoutFromState(): ScrollerLayout {\n const scale = this.coreState.core.scale;\n return getScrollerLayout(this.state, scale);\n }\n\n private pushScrollLayout() {\n this.scrollerLayout$.emit(this.getScrollerLayoutFromState());\n }\n\n override onStoreUpdated(_prevState: ScrollState, _newState: ScrollState): void {\n this.pushScrollLayout();\n }\n\n override onCoreStoreUpdated(\n prevState: StoreState<CoreState>,\n newState: StoreState<CoreState>,\n ): void {\n if (prevState.core.scale !== newState.core.scale) {\n this.currentScale = newState.core.scale;\n this.commitMetrics(this.computeMetrics(this.viewport.getMetrics()));\n }\n if (prevState.core.rotation !== newState.core.rotation) {\n this.currentRotation = newState.core.rotation;\n }\n }\n\n /**\n * Change the scroll strategy at runtime (e.g., vertical <-> horizontal)\n * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical\n */\n private setScrollStrategy(newStrategy: ScrollStrategy) {\n // Only update if the strategy is actually changing\n if (\n (newStrategy === ScrollStrategy.Horizontal &&\n this.strategy instanceof HorizontalScrollStrategy) ||\n (newStrategy === ScrollStrategy.Vertical && this.strategy instanceof VerticalScrollStrategy)\n ) {\n return;\n }\n\n this.strategy =\n newStrategy === ScrollStrategy.Horizontal\n ? new HorizontalScrollStrategy(this.strategyConfig)\n : new VerticalScrollStrategy(this.strategyConfig);\n\n // Update state with new strategy\n this.dispatch(\n updateScrollState({\n strategy: newStrategy,\n }),\n );\n\n // Recalculate layout and scroll metrics\n const pages = getPagesWithRotatedSize(this.coreState.core);\n this.refreshAll(pages, this.viewport.getMetrics());\n }\n\n public setLayoutReady() {\n if (this.layoutReady) return;\n\n this.layoutReady = true;\n this.layoutReady$.emit(true);\n }\n\n protected buildCapability(): ScrollCapability {\n return {\n onStateChange: this.state$.on,\n onLayoutChange: this.layout$.on,\n onScroll: this.scroll$.on,\n onPageChange: this.pageChange$.on,\n onScrollerData: this.scrollerLayout$.on,\n onLayoutReady: this.layoutReady$.on,\n getCurrentPage: () => this.currentPage,\n getTotalPages: () => this.state.totalPages,\n scrollToPage: (options: ScrollToPageOptions) => {\n const { pageNumber, behavior = 'smooth', pageCoordinates, center = false } = options;\n const virtualItems = this.getVirtualItemsFromState();\n const position = this.strategy.getScrollPositionForPage(\n pageNumber,\n virtualItems,\n this.currentScale,\n this.currentRotation,\n pageCoordinates,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior, center });\n }\n },\n scrollToNextPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex >= 0 && currentItemIndex < virtualItems.length - 1) {\n const nextItem = virtualItems[currentItemIndex + 1];\n const position = this.strategy.getScrollPositionForPage(\n nextItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n scrollToPreviousPage: (behavior = 'smooth') => {\n const virtualItems = this.getVirtualItemsFromState();\n const currentItemIndex = virtualItems.findIndex((item) =>\n item.pageNumbers.includes(this.currentPage),\n );\n if (currentItemIndex > 0) {\n const prevItem = virtualItems[currentItemIndex - 1];\n const position = this.strategy.getScrollPositionForPage(\n prevItem.pageNumbers[0],\n virtualItems,\n this.currentScale,\n this.currentRotation,\n );\n if (position) {\n this.viewport.scrollTo({ ...position, behavior });\n }\n }\n },\n getMetrics: this.getMetrics.bind(this),\n getLayout: this.getLayout.bind(this),\n getRectPositionForPage: this.getRectPositionForPage.bind(this),\n getPageGap: () => this.state.pageGap,\n getScrollerLayout: () => this.getScrollerLayoutFromState(),\n setScrollStrategy: (strategy: ScrollStrategy) => this.setScrollStrategy(strategy),\n };\n }\n\n private getMetrics(viewport?: ViewportMetrics): ScrollMetrics {\n const metrics = viewport || this.viewport.getMetrics();\n const virtualItems = this.getVirtualItemsFromState();\n return this.strategy.handleScroll(metrics, virtualItems, this.currentScale);\n }\n\n private getLayout(): LayoutChangePayload {\n return {\n virtualItems: this.state.virtualItems,\n totalContentSize: this.state.totalContentSize,\n };\n }\n\n private getRectPositionForPage(\n pageIndex: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null {\n return this.strategy.getRectPositionForPage(\n pageIndex + 1,\n this.state.virtualItems,\n scale ?? this.currentScale,\n rotation ?? this.currentRotation,\n rect,\n );\n }\n\n async initialize(): Promise<void> {\n // No DOM initialization needed; state drives rendering\n }\n\n async destroy(): Promise<void> {\n this.layout$.clear();\n this.scroll$.clear();\n this.pageChange$.clear();\n this.state$.clear();\n this.scrollerLayout$.clear();\n this.layoutReady$.clear();\n super.destroy();\n }\n}\n","import { BasePluginConfig, Emitter, EventHook } from '@embedpdf/core';\nimport { PdfPageObject, Rect, Rotation } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from './types/virtual-item';\n\nexport interface ScrollState extends ScrollMetrics {\n virtualItems: VirtualItem[];\n totalPages: number;\n totalContentSize: { width: number; height: number };\n desiredScrollPosition: { x: number; y: number };\n strategy: ScrollStrategy;\n pageGap: number;\n scale: number;\n}\n\nexport interface ScrollerLayout {\n startSpacing: number;\n endSpacing: number;\n totalWidth: number;\n totalHeight: number;\n pageGap: number;\n strategy: ScrollState['strategy'];\n items: VirtualItem[];\n}\n\nexport enum ScrollStrategy {\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n}\n\nexport interface PageVisibilityMetrics {\n pageNumber: number;\n viewportX: number;\n viewportY: number;\n visiblePercentage: number;\n original: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n scaled: {\n pageX: number;\n pageY: number;\n visibleWidth: number;\n visibleHeight: number;\n scale: number;\n };\n}\n\nexport interface ScrollMetrics {\n currentPage: number;\n visiblePages: number[];\n pageVisibilityMetrics: PageVisibilityMetrics[];\n renderedPageIndexes: number[];\n scrollOffset: { x: number; y: number };\n startSpacing: number;\n endSpacing: number;\n}\n\nexport interface ScrollStrategyInterface {\n initialize(container: HTMLElement, innerDiv: HTMLElement): void;\n destroy(): void;\n updateLayout(viewport: ViewportMetrics, pdfPageObject: PdfPageObject[][]): void;\n handleScroll(viewport: ViewportMetrics): void;\n getVirtualItems(): VirtualItem[];\n scrollToPage(pageNumber: number, behavior?: ScrollBehavior): void;\n calculateDimensions(pdfPageObject: PdfPageObject[][]): void;\n}\n\nexport interface ScrollPluginConfig extends BasePluginConfig {\n strategy?: ScrollStrategy;\n initialPage?: number;\n bufferSize?: number;\n pageGap?: number;\n}\n\nexport type LayoutChangePayload = Pick<ScrollState, 'virtualItems' | 'totalContentSize'>;\n\nexport interface ScrollToPageOptions {\n pageNumber: number;\n pageCoordinates?: { x: number; y: number };\n behavior?: ScrollBehavior;\n center?: boolean;\n}\n\nexport interface PageChangePayload {\n pageNumber: number;\n totalPages: number;\n}\n\nexport interface ScrollCapability {\n onScrollerData: EventHook<ScrollerLayout>;\n onStateChange: EventHook<ScrollState>;\n onScroll: EventHook<ScrollMetrics>;\n getCurrentPage(): number;\n getTotalPages(): number;\n onPageChange: EventHook<PageChangePayload>;\n onLayoutChange: EventHook<LayoutChangePayload>;\n onLayoutReady: EventHook<boolean>;\n scrollToPage(options: ScrollToPageOptions): void;\n scrollToNextPage(behavior?: ScrollBehavior): void;\n scrollToPreviousPage(behavior?: ScrollBehavior): void;\n getMetrics(viewport?: ViewportMetrics): ScrollMetrics;\n getLayout(): LayoutChangePayload;\n getScrollerLayout(): ScrollerLayout;\n getRectPositionForPage(\n page: number,\n rect: Rect,\n scale?: number,\n rotation?: Rotation,\n ): Rect | null;\n setScrollStrategy(strategy: ScrollStrategy): void;\n getPageGap(): number;\n}\n","import {\n PdfPageObjectWithRotatedSize,\n Position,\n Rect,\n Rotation,\n scalePosition,\n transformPosition,\n transformRect,\n} from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { VirtualItem } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport interface ScrollStrategyConfig {\n pageGap?: number;\n viewportGap?: number;\n bufferSize?: number;\n}\n\nexport abstract class BaseScrollStrategy {\n protected pageGap: number;\n protected viewportGap: number;\n protected bufferSize: number;\n\n constructor(config: ScrollStrategyConfig) {\n this.pageGap = config.pageGap ?? 20;\n this.viewportGap = config.viewportGap ?? 20;\n this.bufferSize = config.bufferSize ?? 2;\n }\n\n abstract createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[];\n abstract getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number };\n protected abstract getScrollOffset(viewport: ViewportMetrics): number;\n protected abstract getClientSize(viewport: ViewportMetrics): number;\n\n protected getVisibleRange(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): { start: number; end: number } {\n const scrollOffset = this.getScrollOffset(viewport);\n const clientSize = this.getClientSize(viewport);\n const viewportStart = scrollOffset;\n const viewportEnd = scrollOffset + clientSize;\n\n let startIndex = 0;\n while (\n startIndex < virtualItems.length &&\n (virtualItems[startIndex].offset + virtualItems[startIndex].height) * scale <= viewportStart\n ) {\n startIndex++;\n }\n\n let endIndex = startIndex;\n while (endIndex < virtualItems.length && virtualItems[endIndex].offset * scale <= viewportEnd) {\n endIndex++;\n }\n\n return {\n start: Math.max(0, startIndex - this.bufferSize),\n end: Math.min(virtualItems.length - 1, endIndex + this.bufferSize - 1),\n };\n }\n\n handleScroll(\n viewport: ViewportMetrics,\n virtualItems: VirtualItem[],\n scale: number,\n ): ScrollMetrics {\n const range = this.getVisibleRange(viewport, virtualItems, scale);\n const visibleItems = virtualItems.slice(range.start, range.end + 1);\n const pageVisibilityMetrics = this.calculatePageVisibility(visibleItems, viewport, scale);\n const visiblePages = pageVisibilityMetrics.map((m) => m.pageNumber);\n const renderedPageIndexes = virtualItems\n .slice(range.start, range.end + 1)\n .flatMap((item) => item.index);\n const currentPage = this.determineCurrentPage(pageVisibilityMetrics);\n const first = virtualItems[range.start];\n const last = virtualItems[range.end];\n const startSpacing = first ? first.offset * scale : 0;\n const endSpacing = last\n ? (virtualItems[virtualItems.length - 1].offset + // end of content\n virtualItems[virtualItems.length - 1].height) *\n scale - // minus\n (last.offset + last.height) * scale // end of last rendered\n : 0;\n\n return {\n currentPage,\n visiblePages,\n pageVisibilityMetrics,\n renderedPageIndexes,\n scrollOffset: { x: viewport.scrollLeft, y: viewport.scrollTop },\n startSpacing,\n endSpacing,\n };\n }\n\n protected calculatePageVisibility(\n virtualItems: VirtualItem[],\n viewport: ViewportMetrics,\n scale: number,\n ): ScrollMetrics['pageVisibilityMetrics'] {\n const visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'] = [];\n\n virtualItems.forEach((item) => {\n item.pageLayouts.forEach((page) => {\n const itemX = item.x * scale;\n const itemY = item.y * scale;\n const pageX = itemX + page.x * scale;\n const pageY = itemY + page.y * scale;\n const pageWidth = page.rotatedWidth * scale;\n const pageHeight = page.rotatedHeight * scale;\n\n const viewportLeft = viewport.scrollLeft;\n const viewportTop = viewport.scrollTop;\n const viewportRight = viewportLeft + viewport.clientWidth;\n const viewportBottom = viewportTop + viewport.clientHeight;\n\n const intersectionLeft = Math.max(pageX, viewportLeft);\n const intersectionTop = Math.max(pageY, viewportTop);\n const intersectionRight = Math.min(pageX + pageWidth, viewportRight);\n const intersectionBottom = Math.min(pageY + pageHeight, viewportBottom);\n\n if (intersectionLeft < intersectionRight && intersectionTop < intersectionBottom) {\n const visibleWidth = intersectionRight - intersectionLeft;\n const visibleHeight = intersectionBottom - intersectionTop;\n const totalArea = pageWidth * pageHeight;\n const visibleArea = visibleWidth * visibleHeight;\n\n visibilityMetrics.push({\n pageNumber: page.pageNumber,\n viewportX: intersectionLeft - viewportLeft,\n viewportY: intersectionTop - viewportTop,\n visiblePercentage: (visibleArea / totalArea) * 100,\n original: {\n pageX: (intersectionLeft - pageX) / scale,\n pageY: (intersectionTop - pageY) / scale,\n visibleWidth: visibleWidth / scale,\n visibleHeight: visibleHeight / scale,\n scale: 1,\n },\n scaled: {\n pageX: intersectionLeft - pageX,\n pageY: intersectionTop - pageY,\n visibleWidth,\n visibleHeight,\n scale,\n },\n });\n }\n });\n });\n\n return visibilityMetrics;\n }\n\n protected determineCurrentPage(\n visibilityMetrics: ScrollMetrics['pageVisibilityMetrics'],\n ): number {\n if (visibilityMetrics.length === 0) return 1;\n\n const maxVisibility = Math.max(...visibilityMetrics.map((m) => m.visiblePercentage));\n const mostVisiblePages = visibilityMetrics.filter((m) => m.visiblePercentage === maxVisibility);\n\n return mostVisiblePages.length === 1\n ? mostVisiblePages[0].pageNumber\n : mostVisiblePages.sort((a, b) => a.pageNumber - b.pageNumber)[0].pageNumber;\n }\n\n private getRectLocationForPage(pageNumber: number, virtualItems: VirtualItem[]): Rect | null {\n // Find the virtual item containing the page\n const item = virtualItems.find((item) => item.pageNumbers.includes(pageNumber));\n if (!item) return null;\n\n // Find the specific page layout for the requested page number\n const pageLayout = item.pageLayouts.find((layout) => layout.pageNumber === pageNumber);\n if (!pageLayout) return null;\n\n return {\n origin: {\n x: item.x + pageLayout.x,\n y: item.y + pageLayout.y,\n },\n size: {\n width: pageLayout.width,\n height: pageLayout.height,\n },\n };\n }\n\n getScrollPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n pageCoordinates?: { x: number; y: number },\n ): Position | null {\n // Find the virtual item containing the page\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n // If specific page coordinates are provided, add them to the base position\n if (pageCoordinates) {\n const rotatedSize = transformPosition(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n {\n x: pageCoordinates.x,\n y: pageCoordinates.y,\n },\n rotation,\n scale,\n );\n\n return {\n x: scaledBasePosition.x + rotatedSize.x + this.viewportGap,\n y: scaledBasePosition.y + rotatedSize.y + this.viewportGap,\n };\n }\n\n return {\n x: scaledBasePosition.x + this.viewportGap,\n y: scaledBasePosition.y + this.viewportGap,\n };\n }\n\n getRectPositionForPage(\n pageNumber: number,\n virtualItems: VirtualItem[],\n scale: number,\n rotation: Rotation,\n rect: Rect,\n ): Rect | null {\n const pageRect = this.getRectLocationForPage(pageNumber, virtualItems);\n if (!pageRect) return null;\n\n const scaledBasePosition = scalePosition(pageRect.origin, scale);\n\n const rotatedSize = transformRect(\n {\n width: pageRect.size.width,\n height: pageRect.size.height,\n },\n rect,\n rotation,\n scale,\n );\n\n return {\n origin: {\n x: scaledBasePosition.x + rotatedSize.origin.x,\n y: scaledBasePosition.y + rotatedSize.origin.y,\n },\n size: rotatedSize.size,\n };\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\nimport { ScrollMetrics } from '../types';\n\nexport class VerticalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let yOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: 0,\n y: yOffset,\n offset: yOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n yOffset += height + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const maxWidth = Math.max(...virtualItems.map((item) => item.width));\n const totalHeight =\n virtualItems[virtualItems.length - 1].y + virtualItems[virtualItems.length - 1].height;\n return {\n width: maxWidth,\n height: totalHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollTop;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientHeight;\n }\n}\n","import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';\nimport { ViewportMetrics } from '@embedpdf/plugin-viewport';\nimport { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';\nimport { VirtualItem, PageLayout } from '../types/virtual-item';\n\nexport class HorizontalScrollStrategy extends BaseScrollStrategy {\n constructor(config: ScrollStrategyConfig) {\n super(config);\n }\n\n createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[] {\n let xOffset = 0;\n return pdfPageObject.map((pagesInSpread, index) => {\n let pageX = 0;\n const pageLayouts: PageLayout[] = pagesInSpread.map((page) => {\n const layout: PageLayout = {\n pageNumber: page.index + 1,\n pageIndex: page.index,\n x: pageX,\n y: 0,\n width: page.size.width,\n height: page.size.height,\n rotatedWidth: page.rotatedSize.width,\n rotatedHeight: page.rotatedSize.height,\n };\n pageX += page.rotatedSize.width + this.pageGap;\n return layout;\n });\n const width = pagesInSpread.reduce(\n (sum, page, i) =>\n sum + page.rotatedSize.width + (i < pagesInSpread.length - 1 ? this.pageGap : 0),\n 0,\n );\n const height = Math.max(...pagesInSpread.map((p) => p.rotatedSize.height));\n const item: VirtualItem = {\n id: `item-${index}`,\n x: xOffset,\n y: 0,\n offset: xOffset,\n width,\n height,\n pageLayouts,\n pageNumbers: pagesInSpread.map((p) => p.index + 1),\n index,\n };\n xOffset += width + this.pageGap;\n return item;\n });\n }\n\n getTotalContentSize(virtualItems: VirtualItem[]): { width: number; height: number } {\n if (virtualItems.length === 0) return { width: 0, height: 0 };\n const totalWidth =\n virtualItems[virtualItems.length - 1].x + virtualItems[virtualItems.length - 1].width;\n const maxHeight = Math.max(...virtualItems.map((item) => item.height));\n return {\n width: totalWidth,\n height: maxHeight,\n };\n }\n\n protected getScrollOffset(viewport: ViewportMetrics): number {\n return viewport.scrollLeft;\n }\n\n protected getClientSize(viewport: ViewportMetrics): number {\n return viewport.clientWidth;\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { ScrollState } from './types';\n\nexport const UPDATE_SCROLL_STATE = 'UPDATE_SCROLL_STATE';\nexport const SET_DESIRED_SCROLL_POSITION = 'SET_DESIRED_SCROLL_POSITION';\nexport const UPDATE_TOTAL_PAGES = 'UPDATE_TOTAL_PAGES';\n\nexport interface UpdateScrollStateAction extends Action {\n type: typeof UPDATE_SCROLL_STATE;\n payload: Partial<ScrollState>;\n}\n\nexport interface SetDesiredScrollPositionAction extends Action {\n type: typeof SET_DESIRED_SCROLL_POSITION;\n payload: { x: number; y: number };\n}\n\nexport interface UpdateTotalPagesAction extends Action {\n type: typeof UPDATE_TOTAL_PAGES;\n payload: number;\n}\n\nexport type ScrollAction =\n | UpdateScrollStateAction\n | SetDesiredScrollPositionAction\n | UpdateTotalPagesAction;\n\nexport function updateScrollState(payload: Partial<ScrollState>): UpdateScrollStateAction {\n return { type: UPDATE_SCROLL_STATE, payload };\n}\n\nexport function setDesiredScrollPosition(payload: {\n x: number;\n y: number;\n}): SetDesiredScrollPositionAction {\n return { type: SET_DESIRED_SCROLL_POSITION, payload };\n}\n\nexport function updateTotalPages(payload: number): UpdateTotalPagesAction {\n return { type: UPDATE_TOTAL_PAGES, payload };\n}\n","import { ScrollerLayout, ScrollState } from './types';\n\nexport const getScrollerLayout = (state: ScrollState, scale: number): ScrollerLayout => {\n return {\n startSpacing: state.startSpacing,\n endSpacing: state.endSpacing,\n totalWidth: state.totalContentSize.width * scale,\n totalHeight: state.totalContentSize.height * scale,\n pageGap: state.pageGap * scale,\n strategy: state.strategy,\n items: state.renderedPageIndexes.map((idx) => {\n return {\n ...state.virtualItems[idx],\n pageLayouts: state.virtualItems[idx].pageLayouts.map((layout) => {\n return {\n ...layout,\n rotatedWidth: layout.rotatedWidth * scale,\n rotatedHeight: layout.rotatedHeight * scale,\n width: layout.width * scale,\n height: layout.height * scale,\n };\n }),\n };\n }),\n };\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { ScrollPluginConfig } from './types';\n\nexport const SCROLL_PLUGIN_ID = 'scroll';\n\nexport const manifest: PluginManifest<ScrollPluginConfig> = {\n id: SCROLL_PLUGIN_ID,\n name: 'Scroll Plugin',\n version: '1.0.0',\n provides: ['scroll'],\n requires: ['viewport'],\n optional: [],\n defaultConfig: {\n enabled: true,\n pageGap: 10,\n },\n};\n","import { Reducer, CoreState, SET_SCALE, SetScaleAction } from '@embedpdf/core';\nimport { ScrollState, ScrollStrategy, ScrollPluginConfig, ScrollMetrics } from './types';\nimport {\n ScrollAction,\n UPDATE_SCROLL_STATE,\n SET_DESIRED_SCROLL_POSITION,\n UPDATE_TOTAL_PAGES,\n} from './actions';\n\nexport const defaultScrollMetrics: ScrollMetrics = {\n currentPage: 1,\n visiblePages: [],\n pageVisibilityMetrics: [],\n renderedPageIndexes: [],\n scrollOffset: { x: 0, y: 0 },\n startSpacing: 0,\n endSpacing: 0,\n};\n\nexport const initialState: (coreState: CoreState, config: ScrollPluginConfig) => ScrollState = (\n coreState,\n config,\n) => ({\n virtualItems: [],\n totalPages: coreState.pages.length,\n totalContentSize: { width: 0, height: 0 },\n desiredScrollPosition: { x: 0, y: 0 },\n strategy: config.strategy ?? ScrollStrategy.Vertical,\n pageGap: config.pageGap ?? 10,\n scale: coreState.scale,\n ...defaultScrollMetrics,\n});\n\nexport const scrollReducer: Reducer<ScrollState, ScrollAction | SetScaleAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case UPDATE_TOTAL_PAGES:\n return { ...state, totalPages: action.payload };\n case SET_SCALE:\n return { ...state, scale: action.payload };\n case UPDATE_SCROLL_STATE:\n return { ...state, ...action.payload };\n case SET_DESIRED_SCROLL_POSITION:\n return { ...state, desiredScrollPosition: action.payload };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { ScrollPlugin } from './scroll-plugin';\nimport { manifest, SCROLL_PLUGIN_ID } from './manifest';\nimport { ScrollPluginConfig, ScrollState } from './types';\nimport { scrollReducer, initialState } from './reducer';\nimport { ScrollAction } from './actions';\n\nexport const ScrollPluginPackage: PluginPackage<\n ScrollPlugin,\n ScrollPluginConfig,\n ScrollState,\n ScrollAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ScrollPlugin(SCROLL_PLUGIN_ID, registry, config),\n reducer: scrollReducer,\n initialState: (coreState, config) => initialState(coreState, config),\n};\n\nexport * from './scroll-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './types/virtual-item';\n"],"mappings":"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","names":["Rotation","ScrollStrategy","item","Rotation"]}
@@ -58,6 +58,7 @@ var import_preact2 = require("@embedpdf/core/preact");
58
58
  var import_jsx_runtime = require("preact/jsx-runtime");
59
59
  function Scroller({ renderPage, overlayElements, ...props }) {
60
60
  const { provides: scrollProvides } = useScrollCapability();
61
+ const { plugin: scrollPlugin } = useScrollPlugin();
61
62
  const { registry } = (0, import_preact2.useRegistry)();
62
63
  const [scrollerLayout, setScrollerLayout] = (0, import_hooks2.useState)(
63
64
  () => scrollProvides?.getScrollerLayout() ?? null
@@ -66,6 +67,10 @@ function Scroller({ renderPage, overlayElements, ...props }) {
66
67
  if (!scrollProvides) return;
67
68
  return scrollProvides.onScrollerData(setScrollerLayout);
68
69
  }, [scrollProvides]);
70
+ (0, import_hooks2.useEffect)(() => {
71
+ if (!scrollPlugin) return;
72
+ scrollPlugin.setLayoutReady();
73
+ }, [scrollPlugin]);
69
74
  if (!scrollerLayout) return null;
70
75
  if (!registry) return null;
71
76
  const coreState = registry.getStore().getState();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/preact/index.ts","../../src/preact/hooks/use-scroll.ts","../../src/preact/components/scroller.tsx"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/preact';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = JSX.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => JSX.Element;\n overlayElements?: JSX.Element[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["totalPages","import_hooks","import_plugin_scroll","import_preact"]}
1
+ {"version":3,"sources":["../../src/preact/index.ts","../../src/preact/hooks/use-scroll.ts","../../src/preact/components/scroller.tsx"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/preact';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability, useScrollPlugin } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = JSX.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => JSX.Element;\n overlayElements?: JSX.Element[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { plugin: scrollPlugin } = useScrollPlugin();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n useEffect(() => {\n if (!scrollPlugin) return;\n\n scrollPlugin.setLayoutReady();\n }, [scrollPlugin]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["totalPages","import_hooks","import_plugin_scroll","import_preact"]}
@@ -26,6 +26,7 @@ declare const useScroll: () => {
26
26
  getTotalPages?: (() => number) | undefined;
27
27
  onPageChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.PageChangePayload> | undefined;
28
28
  onLayoutChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.LayoutChangePayload> | undefined;
29
+ onLayoutReady?: _embedpdf_core.EventHook<boolean> | undefined;
29
30
  scrollToPage?: ((options: _embedpdf_plugin_scroll.ScrollToPageOptions) => void) | undefined;
30
31
  scrollToNextPage?: ((behavior?: ScrollBehavior) => void) | undefined;
31
32
  scrollToPreviousPage?: ((behavior?: ScrollBehavior) => void) | undefined;
@@ -26,6 +26,7 @@ declare const useScroll: () => {
26
26
  getTotalPages?: (() => number) | undefined;
27
27
  onPageChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.PageChangePayload> | undefined;
28
28
  onLayoutChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.LayoutChangePayload> | undefined;
29
+ onLayoutReady?: _embedpdf_core.EventHook<boolean> | undefined;
29
30
  scrollToPage?: ((options: _embedpdf_plugin_scroll.ScrollToPageOptions) => void) | undefined;
30
31
  scrollToNextPage?: ((behavior?: ScrollBehavior) => void) | undefined;
31
32
  scrollToPreviousPage?: ((behavior?: ScrollBehavior) => void) | undefined;
@@ -29,6 +29,7 @@ import { useRegistry } from "@embedpdf/core/preact";
29
29
  import { jsx, jsxs } from "preact/jsx-runtime";
30
30
  function Scroller({ renderPage, overlayElements, ...props }) {
31
31
  const { provides: scrollProvides } = useScrollCapability();
32
+ const { plugin: scrollPlugin } = useScrollPlugin();
32
33
  const { registry } = useRegistry();
33
34
  const [scrollerLayout, setScrollerLayout] = useState2(
34
35
  () => scrollProvides?.getScrollerLayout() ?? null
@@ -37,6 +38,10 @@ function Scroller({ renderPage, overlayElements, ...props }) {
37
38
  if (!scrollProvides) return;
38
39
  return scrollProvides.onScrollerData(setScrollerLayout);
39
40
  }, [scrollProvides]);
41
+ useEffect2(() => {
42
+ if (!scrollPlugin) return;
43
+ scrollPlugin.setLayoutReady();
44
+ }, [scrollPlugin]);
40
45
  if (!scrollerLayout) return null;
41
46
  if (!registry) return null;
42
47
  const coreState = registry.getStore().getState();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/preact/hooks/use-scroll.ts","../../src/preact/components/scroller.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/preact';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = JSX.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => JSX.Element;\n overlayElements?: JSX.Element[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["totalPages","useEffect","useState","useState","useEffect"]}
1
+ {"version":3,"sources":["../../src/preact/hooks/use-scroll.ts","../../src/preact/components/scroller.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/preact';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability, useScrollPlugin } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = JSX.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => JSX.Element;\n overlayElements?: JSX.Element[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { plugin: scrollPlugin } = useScrollPlugin();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n useEffect(() => {\n if (!scrollPlugin) return;\n\n scrollPlugin.setLayoutReady();\n }, [scrollPlugin]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["totalPages","useEffect","useState","useState","useEffect"]}
@@ -58,6 +58,7 @@ var import_react4 = require("@embedpdf/core/react");
58
58
  var import_jsx_runtime = require("react/jsx-runtime");
59
59
  function Scroller({ renderPage, overlayElements, ...props }) {
60
60
  const { provides: scrollProvides } = useScrollCapability();
61
+ const { plugin: scrollPlugin } = useScrollPlugin();
61
62
  const { registry } = (0, import_react4.useRegistry)();
62
63
  const [scrollerLayout, setScrollerLayout] = (0, import_react3.useState)(
63
64
  () => scrollProvides?.getScrollerLayout() ?? null
@@ -66,6 +67,10 @@ function Scroller({ renderPage, overlayElements, ...props }) {
66
67
  if (!scrollProvides) return;
67
68
  return scrollProvides.onScrollerData(setScrollerLayout);
68
69
  }, [scrollProvides]);
70
+ (0, import_react3.useEffect)(() => {
71
+ if (!scrollPlugin) return;
72
+ scrollPlugin.setLayoutReady();
73
+ }, [scrollPlugin]);
69
74
  if (!scrollerLayout) return null;
70
75
  if (!registry) return null;
71
76
  const coreState = registry.getStore().getState();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/index.ts","../../src/react/hooks/use-scroll.ts","../../src/react/components/scroller.tsx"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'react';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","import React, { ReactNode, useEffect, useState } from 'react';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/react';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = React.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => ReactNode;\n overlayElements?: ReactNode[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","totalPages","import_react","import_plugin_scroll"]}
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/react/hooks/use-scroll.ts","../../src/react/components/scroller.tsx"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'react';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","import React, { ReactNode, useEffect, useState } from 'react';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/react';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability, useScrollPlugin } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = React.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => ReactNode;\n overlayElements?: ReactNode[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { plugin: scrollPlugin } = useScrollPlugin();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n useEffect(() => {\n if (!scrollPlugin) return;\n\n scrollPlugin.setLayoutReady();\n }, [scrollPlugin]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","totalPages","import_react","import_plugin_scroll"]}
@@ -27,6 +27,7 @@ declare const useScroll: () => {
27
27
  getTotalPages?: (() => number) | undefined;
28
28
  onPageChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.PageChangePayload> | undefined;
29
29
  onLayoutChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.LayoutChangePayload> | undefined;
30
+ onLayoutReady?: _embedpdf_core.EventHook<boolean> | undefined;
30
31
  scrollToPage?: ((options: _embedpdf_plugin_scroll.ScrollToPageOptions) => void) | undefined;
31
32
  scrollToNextPage?: ((behavior?: ScrollBehavior) => void) | undefined;
32
33
  scrollToPreviousPage?: ((behavior?: ScrollBehavior) => void) | undefined;
@@ -27,6 +27,7 @@ declare const useScroll: () => {
27
27
  getTotalPages?: (() => number) | undefined;
28
28
  onPageChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.PageChangePayload> | undefined;
29
29
  onLayoutChange?: _embedpdf_core.EventHook<_embedpdf_plugin_scroll.LayoutChangePayload> | undefined;
30
+ onLayoutReady?: _embedpdf_core.EventHook<boolean> | undefined;
30
31
  scrollToPage?: ((options: _embedpdf_plugin_scroll.ScrollToPageOptions) => void) | undefined;
31
32
  scrollToNextPage?: ((behavior?: ScrollBehavior) => void) | undefined;
32
33
  scrollToPreviousPage?: ((behavior?: ScrollBehavior) => void) | undefined;
@@ -29,6 +29,7 @@ import { useRegistry } from "@embedpdf/core/react";
29
29
  import { jsx, jsxs } from "react/jsx-runtime";
30
30
  function Scroller({ renderPage, overlayElements, ...props }) {
31
31
  const { provides: scrollProvides } = useScrollCapability();
32
+ const { plugin: scrollPlugin } = useScrollPlugin();
32
33
  const { registry } = useRegistry();
33
34
  const [scrollerLayout, setScrollerLayout] = useState2(
34
35
  () => scrollProvides?.getScrollerLayout() ?? null
@@ -37,6 +38,10 @@ function Scroller({ renderPage, overlayElements, ...props }) {
37
38
  if (!scrollProvides) return;
38
39
  return scrollProvides.onScrollerData(setScrollerLayout);
39
40
  }, [scrollProvides]);
41
+ useEffect2(() => {
42
+ if (!scrollPlugin) return;
43
+ scrollPlugin.setLayoutReady();
44
+ }, [scrollPlugin]);
40
45
  if (!scrollerLayout) return null;
41
46
  if (!registry) return null;
42
47
  const coreState = registry.getStore().getState();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/hooks/use-scroll.ts","../../src/react/components/scroller.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'react';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","import React, { ReactNode, useEffect, useState } from 'react';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/react';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = React.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => ReactNode;\n overlayElements?: ReactNode[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["totalPages","useEffect","useState","useState","useEffect"]}
1
+ {"version":3,"sources":["../../src/react/hooks/use-scroll.ts","../../src/react/components/scroller.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ScrollPlugin } from '@embedpdf/plugin-scroll';\nimport { useEffect, useState } from 'react';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\nexport const useScroll = () => {\n const { provides: scroll } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!scroll) return;\n return scroll.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [scroll]);\n\n return {\n ...scroll,\n currentPage,\n totalPages,\n };\n};\n","import React, { ReactNode, useEffect, useState } from 'react';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/react';\nimport { PdfDocumentObject, Rotation } from '@embedpdf/models';\n\nimport { useScrollCapability, useScrollPlugin } from '../hooks';\n\ninterface RenderPageProps extends PageLayout {\n rotation: Rotation;\n scale: number;\n document: PdfDocumentObject | null;\n}\n\ntype ScrollerProps = React.HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => ReactNode;\n overlayElements?: ReactNode[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { provides: scrollProvides } = useScrollCapability();\n const { plugin: scrollPlugin } = useScrollPlugin();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollProvides?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollProvides) return;\n\n return scrollProvides.onScrollerData(setScrollerLayout);\n }, [scrollProvides]);\n\n useEffect(() => {\n if (!scrollPlugin) return;\n\n scrollPlugin.setLayoutReady();\n }, [scrollPlugin]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"mappings":"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","names":["totalPages","useEffect","useState","useState","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-scroll",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -23,20 +23,20 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@embedpdf/models": "1.0.10"
26
+ "@embedpdf/models": "1.0.11"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/react": "^18.2.0",
30
30
  "tsup": "^8.0.0",
31
31
  "typescript": "^5.0.0",
32
- "@embedpdf/plugin-viewport": "1.0.10"
32
+ "@embedpdf/plugin-viewport": "1.0.11"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "react": ">=16.8.0",
36
36
  "react-dom": ">=16.8.0",
37
37
  "preact": "^10.26.4",
38
- "@embedpdf/core": "1.0.10",
39
- "@embedpdf/plugin-viewport": "1.0.10"
38
+ "@embedpdf/core": "1.0.11",
39
+ "@embedpdf/plugin-viewport": "1.0.11"
40
40
  },
41
41
  "files": [
42
42
  "dist",