@embedpdf/plugin-scroll 1.0.10 → 1.0.12

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.
Files changed (53) hide show
  1. package/dist/index.cjs +2 -651
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -200
  4. package/dist/index.js +43 -67
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/actions.d.ts +27 -0
  7. package/dist/lib/index.d.ts +9 -0
  8. package/dist/lib/manifest.d.ts +4 -0
  9. package/dist/lib/reducer.d.ts +6 -0
  10. package/dist/lib/scroll-plugin.d.ts +45 -0
  11. package/dist/lib/selectors.d.ts +2 -0
  12. package/dist/lib/strategies/base-strategy.d.ts +35 -0
  13. package/dist/lib/strategies/horizontal-strategy.d.ts +14 -0
  14. package/dist/lib/strategies/vertical-strategy.d.ts +14 -0
  15. package/dist/lib/types/virtual-item.d.ts +21 -0
  16. package/dist/lib/types.d.ts +112 -0
  17. package/dist/preact/adapter.d.ts +4 -0
  18. package/dist/preact/core.d.ts +1 -0
  19. package/dist/preact/index.cjs +2 -176
  20. package/dist/preact/index.cjs.map +1 -1
  21. package/dist/preact/index.d.ts +1 -53
  22. package/dist/preact/index.js +17 -17
  23. package/dist/preact/index.js.map +1 -1
  24. package/dist/react/adapter.d.ts +2 -0
  25. package/dist/react/core.d.ts +1 -0
  26. package/dist/react/index.cjs +2 -176
  27. package/dist/react/index.cjs.map +1 -1
  28. package/dist/react/index.d.ts +1 -52
  29. package/dist/react/index.js +16 -17
  30. package/dist/react/index.js.map +1 -1
  31. package/dist/shared-preact/components/index.d.ts +1 -0
  32. package/dist/shared-preact/components/scroller.d.ts +14 -0
  33. package/dist/shared-preact/hooks/index.d.ts +1 -0
  34. package/dist/shared-preact/hooks/use-scroll.d.ts +32 -0
  35. package/dist/shared-preact/index.d.ts +2 -0
  36. package/dist/shared-react/components/index.d.ts +1 -0
  37. package/dist/shared-react/components/scroller.d.ts +14 -0
  38. package/dist/shared-react/hooks/index.d.ts +1 -0
  39. package/dist/shared-react/hooks/use-scroll.d.ts +32 -0
  40. package/dist/shared-react/index.d.ts +2 -0
  41. package/dist/vue/components/index.d.ts +1 -0
  42. package/dist/vue/components/scroller.vue.d.ts +28 -0
  43. package/dist/vue/hooks/index.d.ts +1 -0
  44. package/dist/vue/hooks/use-scroll.d.ts +11 -0
  45. package/dist/vue/index.cjs +2 -0
  46. package/dist/vue/index.cjs.map +1 -0
  47. package/dist/vue/index.d.ts +2 -0
  48. package/dist/vue/index.js +136 -0
  49. package/dist/vue/index.js.map +1 -0
  50. package/package.json +22 -13
  51. package/dist/index.d.cts +0 -200
  52. package/dist/preact/index.d.cts +0 -53
  53. package/dist/react/index.d.cts +0 -52
package/dist/index.js CHANGED
@@ -1,30 +1,11 @@
1
- // src/lib/scroll-plugin.ts
2
- import {
3
- BasePlugin,
4
- SET_DOCUMENT,
5
- SET_PAGES,
6
- SET_ROTATION,
7
- createBehaviorEmitter,
8
- getPagesWithRotatedSize
9
- } from "@embedpdf/core";
10
- import {
11
- Rotation as Rotation2
12
- } from "@embedpdf/models";
13
-
14
- // src/lib/types.ts
1
+ import { BasePlugin, createBehaviorEmitter, SET_DOCUMENT, getPagesWithRotatedSize, SET_ROTATION, SET_PAGES, SET_SCALE } from "@embedpdf/core";
2
+ import { scalePosition, transformPosition, transformRect, Rotation } from "@embedpdf/models";
15
3
  var ScrollStrategy = /* @__PURE__ */ ((ScrollStrategy2) => {
16
4
  ScrollStrategy2["Vertical"] = "vertical";
17
5
  ScrollStrategy2["Horizontal"] = "horizontal";
18
6
  return ScrollStrategy2;
19
7
  })(ScrollStrategy || {});
20
-
21
- // src/lib/strategies/base-strategy.ts
22
- import {
23
- scalePosition,
24
- transformPosition,
25
- transformRect
26
- } from "@embedpdf/models";
27
- var BaseScrollStrategy = class {
8
+ class BaseScrollStrategy {
28
9
  constructor(config) {
29
10
  this.pageGap = config.pageGap ?? 20;
30
11
  this.viewportGap = config.viewportGap ?? 20;
@@ -189,10 +170,8 @@ var BaseScrollStrategy = class {
189
170
  size: rotatedSize.size
190
171
  };
191
172
  }
192
- };
193
-
194
- // src/lib/strategies/vertical-strategy.ts
195
- var VerticalScrollStrategy = class extends BaseScrollStrategy {
173
+ }
174
+ class VerticalScrollStrategy extends BaseScrollStrategy {
196
175
  constructor(config) {
197
176
  super(config);
198
177
  }
@@ -249,10 +228,8 @@ var VerticalScrollStrategy = class extends BaseScrollStrategy {
249
228
  getClientSize(viewport) {
250
229
  return viewport.clientHeight;
251
230
  }
252
- };
253
-
254
- // src/lib/strategies/horizontal-strategy.ts
255
- var HorizontalScrollStrategy = class extends BaseScrollStrategy {
231
+ }
232
+ class HorizontalScrollStrategy extends BaseScrollStrategy {
256
233
  constructor(config) {
257
234
  super(config);
258
235
  }
@@ -309,21 +286,17 @@ var HorizontalScrollStrategy = class extends BaseScrollStrategy {
309
286
  getClientSize(viewport) {
310
287
  return viewport.clientWidth;
311
288
  }
312
- };
313
-
314
- // src/lib/actions.ts
315
- var UPDATE_SCROLL_STATE = "UPDATE_SCROLL_STATE";
316
- var SET_DESIRED_SCROLL_POSITION = "SET_DESIRED_SCROLL_POSITION";
317
- var UPDATE_TOTAL_PAGES = "UPDATE_TOTAL_PAGES";
289
+ }
290
+ const UPDATE_SCROLL_STATE = "UPDATE_SCROLL_STATE";
291
+ const SET_DESIRED_SCROLL_POSITION = "SET_DESIRED_SCROLL_POSITION";
292
+ const UPDATE_TOTAL_PAGES = "UPDATE_TOTAL_PAGES";
318
293
  function updateScrollState(payload) {
319
294
  return { type: UPDATE_SCROLL_STATE, payload };
320
295
  }
321
296
  function updateTotalPages(payload) {
322
297
  return { type: UPDATE_TOTAL_PAGES, payload };
323
298
  }
324
-
325
- // src/lib/selectors.ts
326
- var getScrollerLayout = (state, scale) => {
299
+ const getScrollerLayout = (state, scale) => {
327
300
  return {
328
301
  startSpacing: state.startSpacing,
329
302
  endSpacing: state.endSpacing,
@@ -347,29 +320,30 @@ var getScrollerLayout = (state, scale) => {
347
320
  })
348
321
  };
349
322
  };
350
-
351
- // src/lib/scroll-plugin.ts
352
- var ScrollPlugin = class extends BasePlugin {
323
+ const _ScrollPlugin = class _ScrollPlugin extends BasePlugin {
353
324
  constructor(id, registry, config) {
325
+ var _a, _b, _c, _d;
354
326
  super(id, registry);
355
327
  this.id = id;
356
328
  this.config = config;
357
329
  this.currentScale = 1;
358
- this.currentRotation = Rotation2.Degree0;
330
+ this.currentRotation = Rotation.Degree0;
359
331
  this.currentPage = 1;
332
+ this.layoutReady = false;
360
333
  this.layout$ = createBehaviorEmitter();
361
334
  this.scroll$ = createBehaviorEmitter();
362
335
  this.state$ = createBehaviorEmitter();
363
336
  this.scrollerLayout$ = createBehaviorEmitter();
364
337
  this.pageChange$ = createBehaviorEmitter();
338
+ this.layoutReady$ = createBehaviorEmitter();
365
339
  this.viewport = this.registry.getPlugin("viewport").provides();
366
340
  this.strategyConfig = {
367
- pageGap: this.config?.pageGap ?? 10,
341
+ pageGap: ((_a = this.config) == null ? void 0 : _a.pageGap) ?? 10,
368
342
  viewportGap: this.viewport.getViewportGap(),
369
- bufferSize: this.config?.bufferSize ?? 2
343
+ bufferSize: ((_b = this.config) == null ? void 0 : _b.bufferSize) ?? 2
370
344
  };
371
- this.strategy = this.config?.strategy === "horizontal" /* Horizontal */ ? new HorizontalScrollStrategy(this.strategyConfig) : new VerticalScrollStrategy(this.strategyConfig);
372
- this.initialPage = this.config?.initialPage;
345
+ this.strategy = ((_c = this.config) == null ? void 0 : _c.strategy) === ScrollStrategy.Horizontal ? new HorizontalScrollStrategy(this.strategyConfig) : new VerticalScrollStrategy(this.strategyConfig);
346
+ this.initialPage = (_d = this.config) == null ? void 0 : _d.initialPage;
373
347
  this.currentScale = this.coreState.core.scale;
374
348
  this.currentRotation = this.coreState.core.rotation;
375
349
  this.viewport.onViewportChange((vp) => this.commitMetrics(this.computeMetrics(vp)), {
@@ -407,8 +381,8 @@ var ScrollPlugin = class extends BasePlugin {
407
381
  /* ------------------------------------------------------------------ */
408
382
  commit(stateDelta, emit) {
409
383
  this.dispatch(updateScrollState(stateDelta));
410
- if (emit?.layout) this.layout$.emit(emit.layout);
411
- if (emit?.metrics) {
384
+ if (emit == null ? void 0 : emit.layout) this.layout$.emit(emit.layout);
385
+ if (emit == null ? void 0 : emit.metrics) {
412
386
  this.scroll$.emit(emit.metrics);
413
387
  if (emit.metrics.currentPage !== this.currentPage) {
414
388
  this.currentPage = emit.metrics.currentPage;
@@ -454,10 +428,10 @@ var ScrollPlugin = class extends BasePlugin {
454
428
  * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical
455
429
  */
456
430
  setScrollStrategy(newStrategy) {
457
- if (newStrategy === "horizontal" /* Horizontal */ && this.strategy instanceof HorizontalScrollStrategy || newStrategy === "vertical" /* Vertical */ && this.strategy instanceof VerticalScrollStrategy) {
431
+ if (newStrategy === ScrollStrategy.Horizontal && this.strategy instanceof HorizontalScrollStrategy || newStrategy === ScrollStrategy.Vertical && this.strategy instanceof VerticalScrollStrategy) {
458
432
  return;
459
433
  }
460
- this.strategy = newStrategy === "horizontal" /* Horizontal */ ? new HorizontalScrollStrategy(this.strategyConfig) : new VerticalScrollStrategy(this.strategyConfig);
434
+ this.strategy = newStrategy === ScrollStrategy.Horizontal ? new HorizontalScrollStrategy(this.strategyConfig) : new VerticalScrollStrategy(this.strategyConfig);
461
435
  this.dispatch(
462
436
  updateScrollState({
463
437
  strategy: newStrategy
@@ -466,6 +440,11 @@ var ScrollPlugin = class extends BasePlugin {
466
440
  const pages = getPagesWithRotatedSize(this.coreState.core);
467
441
  this.refreshAll(pages, this.viewport.getMetrics());
468
442
  }
443
+ setLayoutReady() {
444
+ if (this.layoutReady) return;
445
+ this.layoutReady = true;
446
+ this.layoutReady$.emit(true);
447
+ }
469
448
  buildCapability() {
470
449
  return {
471
450
  onStateChange: this.state$.on,
@@ -473,6 +452,7 @@ var ScrollPlugin = class extends BasePlugin {
473
452
  onScroll: this.scroll$.on,
474
453
  onPageChange: this.pageChange$.on,
475
454
  onScrollerData: this.scrollerLayout$.on,
455
+ onLayoutReady: this.layoutReady$.on,
476
456
  getCurrentPage: () => this.currentPage,
477
457
  getTotalPages: () => this.state.totalPages,
478
458
  scrollToPage: (options) => {
@@ -560,14 +540,15 @@ var ScrollPlugin = class extends BasePlugin {
560
540
  this.scroll$.clear();
561
541
  this.pageChange$.clear();
562
542
  this.state$.clear();
543
+ this.scrollerLayout$.clear();
544
+ this.layoutReady$.clear();
563
545
  super.destroy();
564
546
  }
565
547
  };
566
- ScrollPlugin.id = "scroll";
567
-
568
- // src/lib/manifest.ts
569
- var SCROLL_PLUGIN_ID = "scroll";
570
- var manifest = {
548
+ _ScrollPlugin.id = "scroll";
549
+ let ScrollPlugin = _ScrollPlugin;
550
+ const SCROLL_PLUGIN_ID = "scroll";
551
+ const manifest = {
571
552
  id: SCROLL_PLUGIN_ID,
572
553
  name: "Scroll Plugin",
573
554
  version: "1.0.0",
@@ -579,10 +560,7 @@ var manifest = {
579
560
  pageGap: 10
580
561
  }
581
562
  };
582
-
583
- // src/lib/reducer.ts
584
- import { SET_SCALE } from "@embedpdf/core";
585
- var defaultScrollMetrics = {
563
+ const defaultScrollMetrics = {
586
564
  currentPage: 1,
587
565
  visiblePages: [],
588
566
  pageVisibilityMetrics: [],
@@ -591,17 +569,17 @@ var defaultScrollMetrics = {
591
569
  startSpacing: 0,
592
570
  endSpacing: 0
593
571
  };
594
- var initialState = (coreState, config) => ({
572
+ const initialState = (coreState, config) => ({
595
573
  virtualItems: [],
596
574
  totalPages: coreState.pages.length,
597
575
  totalContentSize: { width: 0, height: 0 },
598
576
  desiredScrollPosition: { x: 0, y: 0 },
599
- strategy: config.strategy ?? "vertical" /* Vertical */,
577
+ strategy: config.strategy ?? ScrollStrategy.Vertical,
600
578
  pageGap: config.pageGap ?? 10,
601
579
  scale: coreState.scale,
602
580
  ...defaultScrollMetrics
603
581
  });
604
- var scrollReducer = (state, action) => {
582
+ const scrollReducer = (state, action) => {
605
583
  switch (action.type) {
606
584
  case UPDATE_TOTAL_PAGES:
607
585
  return { ...state, totalPages: action.payload };
@@ -615,9 +593,7 @@ var scrollReducer = (state, action) => {
615
593
  return state;
616
594
  }
617
595
  };
618
-
619
- // src/lib/index.ts
620
- var ScrollPluginPackage = {
596
+ const ScrollPluginPackage = {
621
597
  manifest,
622
598
  create: (registry, _engine, config) => new ScrollPlugin(SCROLL_PLUGIN_ID, registry, config),
623
599
  reducer: scrollReducer,
@@ -630,4 +606,4 @@ export {
630
606
  ScrollStrategy,
631
607
  manifest
632
608
  };
633
- //# sourceMappingURL=index.js.map
609
+ //# sourceMappingURL=index.js.map
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":"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","names":["Rotation","ScrollStrategy","item","Rotation"]}
1
+ {"version":3,"file":"index.js","sources":["../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/scroll-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["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 {\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 { 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"],"names":["ScrollStrategy","item"],"mappings":";;AAyBY,IAAA,mCAAAA,oBAAL;AACLA,kBAAA,UAAW,IAAA;AACXA,kBAAA,YAAa,IAAA;AAFHA,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;ACNL,MAAe,mBAAmB;AAAA,EAKvC,YAAY,QAA8B;AACnC,SAAA,UAAU,OAAO,WAAW;AAC5B,SAAA,cAAc,OAAO,eAAe;AACpC,SAAA,aAAa,OAAO,cAAc;AAAA,EAAA;AAAA,EAQ/B,gBACR,UACA,cACA,OACgC;AAC1B,UAAA,eAAe,KAAK,gBAAgB,QAAQ;AAC5C,UAAA,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,IAAA;AAGF,QAAI,WAAW;AACR,WAAA,WAAW,aAAa,UAAU,aAAa,QAAQ,EAAE,SAAS,SAAS,aAAa;AAC7F;AAAA,IAAA;AAGK,WAAA;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,EAAA;AAAA,EAGF,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;AACzB,UAAA,cAAc,KAAK,qBAAqB,qBAAqB;AAC7D,UAAA,QAAQ,aAAa,MAAM,KAAK;AAChC,UAAA,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;AAEG,WAAA;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,EAAA;AAAA,EAGQ,wBACR,cACA,UACA,OACwC;AACxC,UAAM,oBAA4D,CAAC;AAEtD,iBAAA,QAAQ,CAAC,SAAS;AACxB,WAAA,YAAY,QAAQ,CAAC,SAAS;AAC3B,cAAA,QAAQ,KAAK,IAAI;AACjB,cAAA,QAAQ,KAAK,IAAI;AACjB,cAAA,QAAQ,QAAQ,KAAK,IAAI;AACzB,cAAA,QAAQ,QAAQ,KAAK,IAAI;AACzB,cAAA,YAAY,KAAK,eAAe;AAChC,cAAA,aAAa,KAAK,gBAAgB;AAExC,cAAM,eAAe,SAAS;AAC9B,cAAM,cAAc,SAAS;AACvB,cAAA,gBAAgB,eAAe,SAAS;AACxC,cAAA,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;AAElE,YAAA,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,YAAA;AAAA,UACF,CACD;AAAA,QAAA;AAAA,MACH,CACD;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,EAAA;AAAA,EAGC,qBACR,mBACQ;AACJ,QAAA,kBAAkB,WAAW,EAAU,QAAA;AAErC,UAAA,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,EAAA;AAAA,EAG9D,uBAAuB,YAAoB,cAA0C;AAErF,UAAA,OAAO,aAAa,KAAK,CAACC,UAASA,MAAK,YAAY,SAAS,UAAU,CAAC;AAC1E,QAAA,CAAC,KAAa,QAAA;AAGZ,UAAA,aAAa,KAAK,YAAY,KAAK,CAAC,WAAW,OAAO,eAAe,UAAU;AACjF,QAAA,CAAC,WAAmB,QAAA;AAEjB,WAAA;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,MAAA;AAAA,IAEvB;AAAA,EAAA;AAAA,EAGF,yBACE,YACA,cACA,OACA,UACA,iBACiB;AAEjB,UAAM,WAAW,KAAK,uBAAuB,YAAY,YAAY;AACjE,QAAA,CAAC,SAAiB,QAAA;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;AAEO,aAAA;AAAA,QACL,GAAG,mBAAmB,IAAI,YAAY,IAAI,KAAK;AAAA,QAC/C,GAAG,mBAAmB,IAAI,YAAY,IAAI,KAAK;AAAA,MACjD;AAAA,IAAA;AAGK,WAAA;AAAA,MACL,GAAG,mBAAmB,IAAI,KAAK;AAAA,MAC/B,GAAG,mBAAmB,IAAI,KAAK;AAAA,IACjC;AAAA,EAAA;AAAA,EAGF,uBACE,YACA,cACA,OACA,UACA,MACa;AACb,UAAM,WAAW,KAAK,uBAAuB,YAAY,YAAY;AACjE,QAAA,CAAC,SAAiB,QAAA;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;AAEO,WAAA;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,EAAA;AAEJ;AC/PO,MAAM,+BAA+B,mBAAmB;AAAA,EAC7D,YAAY,QAA8B;AACxC,UAAM,MAAM;AAAA,EAAA;AAAA,EAGd,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;AACS,iBAAA,KAAK,YAAY,QAAQ,KAAK;AAChC,eAAA;AAAA,MAAA,CACR;AACD,YAAM,QAAQ,cAAc;AAAA,QAC1B,CAAC,KAAK,MAAM,MACV,MAAM,KAAK,YAAY,SAAS,IAAI,cAAc,SAAS,IAAI,KAAK,UAAU;AAAA,QAChF;AAAA,MACF;AACM,YAAA,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;AAClB,aAAA;AAAA,IAAA,CACR;AAAA,EAAA;AAAA,EAGH,oBAAoB,cAAgE;AAC9E,QAAA,aAAa,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AACtD,UAAA,WAAW,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAC7D,UAAA,cACJ,aAAa,aAAa,SAAS,CAAC,EAAE,IAAI,aAAa,aAAa,SAAS,CAAC,EAAE;AAC3E,WAAA;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EAAA;AAAA,EAGQ,gBAAgB,UAAmC;AAC3D,WAAO,SAAS;AAAA,EAAA;AAAA,EAGR,cAAc,UAAmC;AACzD,WAAO,SAAS;AAAA,EAAA;AAEpB;AChEO,MAAM,iCAAiC,mBAAmB;AAAA,EAC/D,YAAY,QAA8B;AACxC,UAAM,MAAM;AAAA,EAAA;AAAA,EAGd,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;AACS,iBAAA,KAAK,YAAY,QAAQ,KAAK;AAChC,eAAA;AAAA,MAAA,CACR;AACD,YAAM,QAAQ,cAAc;AAAA,QAC1B,CAAC,KAAK,MAAM,MACV,MAAM,KAAK,YAAY,SAAS,IAAI,cAAc,SAAS,IAAI,KAAK,UAAU;AAAA,QAChF;AAAA,MACF;AACM,YAAA,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;AACjB,aAAA;AAAA,IAAA,CACR;AAAA,EAAA;AAAA,EAGH,oBAAoB,cAAgE;AAC9E,QAAA,aAAa,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AACtD,UAAA,aACJ,aAAa,aAAa,SAAS,CAAC,EAAE,IAAI,aAAa,aAAa,SAAS,CAAC,EAAE;AAC5E,UAAA,YAAY,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAC9D,WAAA;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EAAA;AAAA,EAGQ,gBAAgB,UAAmC;AAC3D,WAAO,SAAS;AAAA,EAAA;AAAA,EAGR,cAAc,UAAmC;AACzD,WAAO,SAAS;AAAA,EAAA;AAEpB;ACjEO,MAAM,sBAAsB;AAC5B,MAAM,8BAA8B;AACpC,MAAM,qBAAqB;AAsB3B,SAAS,kBAAkB,SAAwD;AACjF,SAAA,EAAE,MAAM,qBAAqB,QAAQ;AAC9C;AASO,SAAS,iBAAiB,SAAyC;AACjE,SAAA,EAAE,MAAM,oBAAoB,QAAQ;AAC7C;ACtCa,MAAA,oBAAoB,CAAC,OAAoB,UAAkC;AAC/E,SAAA;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;AACrC,aAAA;AAAA,QACL,GAAG,MAAM,aAAa,GAAG;AAAA,QACzB,aAAa,MAAM,aAAa,GAAG,EAAE,YAAY,IAAI,CAAC,WAAW;AACxD,iBAAA;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,QACD,CAAA;AAAA,MACH;AAAA,IACD,CAAA;AAAA,EACH;AACF;ACsBO,MAAM,gBAAN,MAAM,sBAAqB,WAKhC;AAAA,EAkBA,YACkB,IAChB,UACQ,QACR;;AACA,UAAM,IAAI,QAAQ;AAJF,SAAA,KAAA;AAER,SAAA,SAAA;AAhBV,SAAQ,eAAuB;AAC/B,SAAQ,kBAA4B,SAAS;AAE7C,SAAQ,cAAsB;AAC9B,SAAQ,cAAuB;AAE/B,SAAiB,UAAU,sBAA2C;AACtE,SAAiB,UAAU,sBAAqC;AAChE,SAAiB,SAAS,sBAAmC;AAC7D,SAAiB,kBAAkB,sBAAsC;AACzE,SAAiB,cAAc,sBAAyC;AACxE,SAAiB,eAAe,sBAA+B;AAS7D,SAAK,WAAW,KAAK,SAAS,UAA0B,UAAU,EAAG,SAAS;AAE9E,SAAK,iBAAiB;AAAA,MACpB,WAAS,UAAK,WAAL,mBAAa,YAAW;AAAA,MACjC,aAAa,KAAK,SAAS,eAAe;AAAA,MAC1C,cAAY,UAAK,WAAL,mBAAa,eAAc;AAAA,IACzC;AAEA,SAAK,aACH,UAAK,WAAL,mBAAa,cAAa,eAAe,aACrC,IAAI,yBAAyB,KAAK,cAAc,IAChD,IAAI,uBAAuB,KAAK,cAAc;AAE/C,SAAA,eAAc,UAAK,WAAL,mBAAa;AAC3B,SAAA,eAAe,KAAK,UAAU,KAAK;AACnC,SAAA,kBAAkB,KAAK,UAAU,KAAK;AAEtC,SAAA,SAAS,iBAAiB,CAAC,OAAO,KAAK,cAAc,KAAK,eAAe,EAAE,CAAC,GAAG;AAAA,MAClF,MAAM;AAAA,MACN,MAAM;AAAA,IAAA,CACP;AACD,SAAK,UAAU,SAAS,cAAc,CAAC,SAAS,UAAU;AAClD,YAAA,aAAa,MAAM,KAAK,MAAM;AAC/B,WAAA,SAAS,iBAAiB,UAAU,CAAC;AAC1C,WAAK,YAAY,KAAK,EAAE,YAAY,KAAK,aAAa,YAAY;AAC7D,WAAA,WAAW,wBAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,YAAY;AAAA,IAAA,CAChF;AACD,SAAK,UAAU;AAAA,MAAS;AAAA,MAAc,CAAC,SAAS,UAC9C,KAAK,WAAW,wBAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAY,CAAA;AAAA,IACjF;AACA,SAAK,UAAU;AAAA,MAAS;AAAA,MAAW,CAAC,SAAS,UAC3C,KAAK,WAAW,wBAAwB,MAAM,IAAI,GAAG,KAAK,SAAS,WAAY,CAAA;AAAA,IACjF;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAOM,cAAc,OAAyC;AAC7D,UAAM,eAAe,KAAK,SAAS,mBAAmB,KAAK;AAC3D,UAAM,mBAAmB,KAAK,SAAS,oBAAoB,YAAY;AAChE,WAAA,EAAE,cAAc,iBAAiB;AAAA,EAAA;AAAA,EAGlC,eAAe,IAAqB,QAAuB,KAAK,MAAM,cAAc;AAC1F,WAAO,KAAK,SAAS,aAAa,IAAI,OAAO,KAAK,YAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAOxD,OAAO,YAA2B,MAAc;AAEjD,SAAA,SAAS,kBAAkB,UAAU,CAAC;AAG3C,QAAI,6BAAM,OAAQ,MAAK,QAAQ,KAAK,KAAK,MAAM;AAC/C,QAAI,6BAAM,SAAS;AACZ,WAAA,QAAQ,KAAK,KAAK,OAAO;AAE9B,UAAI,KAAK,QAAQ,gBAAgB,KAAK,aAAa;AAC5C,aAAA,cAAc,KAAK,QAAQ;AAC3B,aAAA,YAAY,KAAK,EAAE,YAAY,KAAK,aAAa,YAAY,KAAK,MAAM,WAAA,CAAY;AAAA,MAAA;AAAA,IAC3F;AAIF,SAAK,gBAAgB,KAAK,KAAK,2BAAA,CAA4B;AAAA,EAAA;AAAA;AAAA,EAIrD,cAAc,SAAwB;AAC5C,SAAK,OAAO,SAAS,EAAE,QAAA,CAAS;AAAA,EAAA;AAAA;AAAA,EAI1B,WAAW,OAAyC,IAAqB;AACzE,UAAA,SAAS,KAAK,cAAc,KAAK;AACvC,UAAM,UAAU,KAAK,eAAe,IAAI,OAAO,YAAY;AAEtD,SAAA,OAAO,EAAE,GAAG,QAAQ,GAAG,WAAW,EAAE,QAAQ,SAAS;AAAA,EAAA;AAAA,EAGpD,2BAA0C;AACzC,WAAA,KAAK,MAAM,gBAAgB,CAAC;AAAA,EAAA;AAAA,EAG7B,6BAA6C;AAC7C,UAAA,QAAQ,KAAK,UAAU,KAAK;AAC3B,WAAA,kBAAkB,KAAK,OAAO,KAAK;AAAA,EAAA;AAAA,EAGpC,mBAAmB;AACzB,SAAK,gBAAgB,KAAK,KAAK,2BAAA,CAA4B;AAAA,EAAA;AAAA,EAGpD,eAAe,YAAyB,WAA8B;AAC7E,SAAK,iBAAiB;AAAA,EAAA;AAAA,EAGf,mBACP,WACA,UACM;AACN,QAAI,UAAU,KAAK,UAAU,SAAS,KAAK,OAAO;AAC3C,WAAA,eAAe,SAAS,KAAK;AAClC,WAAK,cAAc,KAAK,eAAe,KAAK,SAAS,WAAA,CAAY,CAAC;AAAA,IAAA;AAEpE,QAAI,UAAU,KAAK,aAAa,SAAS,KAAK,UAAU;AACjD,WAAA,kBAAkB,SAAS,KAAK;AAAA,IAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,kBAAkB,aAA6B;AAGlD,QAAA,gBAAgB,eAAe,cAC9B,KAAK,oBAAoB,4BAC1B,gBAAgB,eAAe,YAAY,KAAK,oBAAoB,wBACrE;AACA;AAAA,IAAA;AAGF,SAAK,WACH,gBAAgB,eAAe,aAC3B,IAAI,yBAAyB,KAAK,cAAc,IAChD,IAAI,uBAAuB,KAAK,cAAc;AAG/C,SAAA;AAAA,MACH,kBAAkB;AAAA,QAChB,UAAU;AAAA,MACX,CAAA;AAAA,IACH;AAGA,UAAM,QAAQ,wBAAwB,KAAK,UAAU,IAAI;AACzD,SAAK,WAAW,OAAO,KAAK,SAAS,YAAY;AAAA,EAAA;AAAA,EAG5C,iBAAiB;AACtB,QAAI,KAAK,YAAa;AAEtB,SAAK,cAAc;AACd,SAAA,aAAa,KAAK,IAAI;AAAA,EAAA;AAAA,EAGnB,kBAAoC;AACrC,WAAA;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,UAAU;AACvE,cAAA,eAAe,KAAK,yBAAyB;AAC7C,cAAA,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,QAAQ;AAAA,QAAA;AAAA,MAE5D;AAAA,MACA,kBAAkB,CAAC,WAAW,aAAa;AACnC,cAAA,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;AACjE,gBAAA,WAAW,aAAa,mBAAmB,CAAC;AAC5C,gBAAA,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,UAAU;AAAA,UAAA;AAAA,QAClD;AAAA,MAEJ;AAAA,MACA,sBAAsB,CAAC,WAAW,aAAa;AACvC,cAAA,eAAe,KAAK,yBAAyB;AACnD,cAAM,mBAAmB,aAAa;AAAA,UAAU,CAAC,SAC/C,KAAK,YAAY,SAAS,KAAK,WAAW;AAAA,QAC5C;AACA,YAAI,mBAAmB,GAAG;AAClB,gBAAA,WAAW,aAAa,mBAAmB,CAAC;AAC5C,gBAAA,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,UAAU;AAAA,UAAA;AAAA,QAClD;AAAA,MAEJ;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,EAAA;AAAA,EAGM,WAAW,UAA2C;AAC5D,UAAM,UAAU,YAAY,KAAK,SAAS,WAAW;AAC/C,UAAA,eAAe,KAAK,yBAAyB;AACnD,WAAO,KAAK,SAAS,aAAa,SAAS,cAAc,KAAK,YAAY;AAAA,EAAA;AAAA,EAGpE,YAAiC;AAChC,WAAA;AAAA,MACL,cAAc,KAAK,MAAM;AAAA,MACzB,kBAAkB,KAAK,MAAM;AAAA,IAC/B;AAAA,EAAA;AAAA,EAGM,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,EAAA;AAAA,EAGF,MAAM,aAA4B;AAAA,EAAA;AAAA,EAIlC,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,EAAA;AAElB;AA/RE,cAAgB,KAAK;AANhB,IAAM,eAAN;AC5CA,MAAM,mBAAmB;AAEzB,MAAM,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,EAAA;AAEb;ACPO,MAAM,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;AAEa,MAAA,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,YAAY,eAAe;AAAA,EAC5C,SAAS,OAAO,WAAW;AAAA,EAC3B,OAAO,UAAU;AAAA,EACjB,GAAG;AACL;AAEa,MAAA,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;AACS,aAAA;AAAA,EAAA;AAEb;AC1CO,MAAM,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;"}
@@ -0,0 +1,27 @@
1
+ import { Action } from '@embedpdf/core';
2
+ import { ScrollState } from './types';
3
+ export declare const UPDATE_SCROLL_STATE = "UPDATE_SCROLL_STATE";
4
+ export declare const SET_DESIRED_SCROLL_POSITION = "SET_DESIRED_SCROLL_POSITION";
5
+ export declare const UPDATE_TOTAL_PAGES = "UPDATE_TOTAL_PAGES";
6
+ export interface UpdateScrollStateAction extends Action {
7
+ type: typeof UPDATE_SCROLL_STATE;
8
+ payload: Partial<ScrollState>;
9
+ }
10
+ export interface SetDesiredScrollPositionAction extends Action {
11
+ type: typeof SET_DESIRED_SCROLL_POSITION;
12
+ payload: {
13
+ x: number;
14
+ y: number;
15
+ };
16
+ }
17
+ export interface UpdateTotalPagesAction extends Action {
18
+ type: typeof UPDATE_TOTAL_PAGES;
19
+ payload: number;
20
+ }
21
+ export type ScrollAction = UpdateScrollStateAction | SetDesiredScrollPositionAction | UpdateTotalPagesAction;
22
+ export declare function updateScrollState(payload: Partial<ScrollState>): UpdateScrollStateAction;
23
+ export declare function setDesiredScrollPosition(payload: {
24
+ x: number;
25
+ y: number;
26
+ }): SetDesiredScrollPositionAction;
27
+ export declare function updateTotalPages(payload: number): UpdateTotalPagesAction;
@@ -0,0 +1,9 @@
1
+ import { PluginPackage } from '@embedpdf/core';
2
+ import { ScrollPlugin } from './scroll-plugin';
3
+ import { ScrollPluginConfig, ScrollState } from './types';
4
+ import { ScrollAction } from './actions';
5
+ export declare const ScrollPluginPackage: PluginPackage<ScrollPlugin, ScrollPluginConfig, ScrollState, ScrollAction>;
6
+ export * from './scroll-plugin';
7
+ export * from './types';
8
+ export * from './manifest';
9
+ export * from './types/virtual-item';
@@ -0,0 +1,4 @@
1
+ import { PluginManifest } from '@embedpdf/core';
2
+ import { ScrollPluginConfig } from './types';
3
+ export declare const SCROLL_PLUGIN_ID = "scroll";
4
+ export declare const manifest: PluginManifest<ScrollPluginConfig>;
@@ -0,0 +1,6 @@
1
+ import { Reducer, CoreState, SetScaleAction } from '@embedpdf/core';
2
+ import { ScrollState, ScrollPluginConfig, ScrollMetrics } from './types';
3
+ import { ScrollAction } from './actions';
4
+ export declare const defaultScrollMetrics: ScrollMetrics;
5
+ export declare const initialState: (coreState: CoreState, config: ScrollPluginConfig) => ScrollState;
6
+ export declare const scrollReducer: Reducer<ScrollState, ScrollAction | SetScaleAction>;
@@ -0,0 +1,45 @@
1
+ import { BasePlugin, CoreState, PluginRegistry, StoreState } from '@embedpdf/core';
2
+ import { ScrollCapability, ScrollPluginConfig, ScrollState } from './types';
3
+ import { ScrollAction } from './actions';
4
+ export declare class ScrollPlugin extends BasePlugin<ScrollPluginConfig, ScrollCapability, ScrollState, ScrollAction> {
5
+ readonly id: string;
6
+ private config?;
7
+ static readonly id: "scroll";
8
+ private viewport;
9
+ private strategy;
10
+ private strategyConfig;
11
+ private currentScale;
12
+ private currentRotation;
13
+ private initialPage?;
14
+ private currentPage;
15
+ private layoutReady;
16
+ private readonly layout$;
17
+ private readonly scroll$;
18
+ private readonly state$;
19
+ private readonly scrollerLayout$;
20
+ private readonly pageChange$;
21
+ private readonly layoutReady$;
22
+ constructor(id: string, registry: PluginRegistry, config?: ScrollPluginConfig | undefined);
23
+ private computeLayout;
24
+ private computeMetrics;
25
+ private commit;
26
+ private commitMetrics;
27
+ private refreshAll;
28
+ private getVirtualItemsFromState;
29
+ private getScrollerLayoutFromState;
30
+ private pushScrollLayout;
31
+ onStoreUpdated(_prevState: ScrollState, _newState: ScrollState): void;
32
+ onCoreStoreUpdated(prevState: StoreState<CoreState>, newState: StoreState<CoreState>): void;
33
+ /**
34
+ * Change the scroll strategy at runtime (e.g., vertical <-> horizontal)
35
+ * @param newStrategy ScrollStrategy.Horizontal or ScrollStrategy.Vertical
36
+ */
37
+ private setScrollStrategy;
38
+ setLayoutReady(): void;
39
+ protected buildCapability(): ScrollCapability;
40
+ private getMetrics;
41
+ private getLayout;
42
+ private getRectPositionForPage;
43
+ initialize(): Promise<void>;
44
+ destroy(): Promise<void>;
45
+ }
@@ -0,0 +1,2 @@
1
+ import { ScrollerLayout, ScrollState } from './types';
2
+ export declare const getScrollerLayout: (state: ScrollState, scale: number) => ScrollerLayout;
@@ -0,0 +1,35 @@
1
+ import { PdfPageObjectWithRotatedSize, Position, Rect, Rotation } from '@embedpdf/models';
2
+ import { ViewportMetrics } from '@embedpdf/plugin-viewport';
3
+ import { VirtualItem } from '../types/virtual-item';
4
+ import { ScrollMetrics } from '../types';
5
+ export interface ScrollStrategyConfig {
6
+ pageGap?: number;
7
+ viewportGap?: number;
8
+ bufferSize?: number;
9
+ }
10
+ export declare abstract class BaseScrollStrategy {
11
+ protected pageGap: number;
12
+ protected viewportGap: number;
13
+ protected bufferSize: number;
14
+ constructor(config: ScrollStrategyConfig);
15
+ abstract createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[];
16
+ abstract getTotalContentSize(virtualItems: VirtualItem[]): {
17
+ width: number;
18
+ height: number;
19
+ };
20
+ protected abstract getScrollOffset(viewport: ViewportMetrics): number;
21
+ protected abstract getClientSize(viewport: ViewportMetrics): number;
22
+ protected getVisibleRange(viewport: ViewportMetrics, virtualItems: VirtualItem[], scale: number): {
23
+ start: number;
24
+ end: number;
25
+ };
26
+ handleScroll(viewport: ViewportMetrics, virtualItems: VirtualItem[], scale: number): ScrollMetrics;
27
+ protected calculatePageVisibility(virtualItems: VirtualItem[], viewport: ViewportMetrics, scale: number): ScrollMetrics['pageVisibilityMetrics'];
28
+ protected determineCurrentPage(visibilityMetrics: ScrollMetrics['pageVisibilityMetrics']): number;
29
+ private getRectLocationForPage;
30
+ getScrollPositionForPage(pageNumber: number, virtualItems: VirtualItem[], scale: number, rotation: Rotation, pageCoordinates?: {
31
+ x: number;
32
+ y: number;
33
+ }): Position | null;
34
+ getRectPositionForPage(pageNumber: number, virtualItems: VirtualItem[], scale: number, rotation: Rotation, rect: Rect): Rect | null;
35
+ }
@@ -0,0 +1,14 @@
1
+ import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';
2
+ import { ViewportMetrics } from '@embedpdf/plugin-viewport';
3
+ import { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';
4
+ import { VirtualItem } from '../types/virtual-item';
5
+ export declare class HorizontalScrollStrategy extends BaseScrollStrategy {
6
+ constructor(config: ScrollStrategyConfig);
7
+ createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[];
8
+ getTotalContentSize(virtualItems: VirtualItem[]): {
9
+ width: number;
10
+ height: number;
11
+ };
12
+ protected getScrollOffset(viewport: ViewportMetrics): number;
13
+ protected getClientSize(viewport: ViewportMetrics): number;
14
+ }
@@ -0,0 +1,14 @@
1
+ import { PdfPageObjectWithRotatedSize } from '@embedpdf/models';
2
+ import { ViewportMetrics } from '@embedpdf/plugin-viewport';
3
+ import { BaseScrollStrategy, ScrollStrategyConfig } from './base-strategy';
4
+ import { VirtualItem } from '../types/virtual-item';
5
+ export declare class VerticalScrollStrategy extends BaseScrollStrategy {
6
+ constructor(config: ScrollStrategyConfig);
7
+ createVirtualItems(pdfPageObject: PdfPageObjectWithRotatedSize[][]): VirtualItem[];
8
+ getTotalContentSize(virtualItems: VirtualItem[]): {
9
+ width: number;
10
+ height: number;
11
+ };
12
+ protected getScrollOffset(viewport: ViewportMetrics): number;
13
+ protected getClientSize(viewport: ViewportMetrics): number;
14
+ }