@prose-reader/core 1.196.0 → 1.198.0

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 (51) hide show
  1. package/dist/createReaderWithEnhancer.d.ts +12 -14
  2. package/dist/enhancers/layoutEnhancer/layoutEnhancer.d.ts +7 -1
  3. package/dist/enhancers/layoutEnhancer/layoutInfo.d.ts +25 -0
  4. package/dist/enhancers/loading/loadingEnhancer.d.ts +1 -1
  5. package/dist/enhancers/navigation/resolvers/getNavigationForLeftOrTopPage.d.ts +3 -2
  6. package/dist/enhancers/navigation/resolvers/getNavigationForLeftSinglePage.d.ts +4 -3
  7. package/dist/enhancers/navigation/resolvers/getNavigationForRightOrBottomPage.d.ts +3 -2
  8. package/dist/enhancers/navigation/resolvers/getNavigationForRightSinglePage.d.ts +4 -3
  9. package/dist/enhancers/navigation/resolvers/getSpineItemPositionForLeftPage.d.ts +4 -4
  10. package/dist/enhancers/navigation/resolvers/getSpineItemPositionForRightPage.d.ts +4 -4
  11. package/dist/enhancers/pagination/enhancer.d.ts +2 -1
  12. package/dist/enhancers/pagination/pagination.d.ts +2 -1
  13. package/dist/enhancers/pagination/progression.d.ts +2 -1
  14. package/dist/enhancers/pagination/spine.d.ts +0 -1
  15. package/dist/index.js +285 -303
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.umd.cjs +284 -302
  18. package/dist/index.umd.cjs.map +1 -1
  19. package/dist/navigation/InternalNavigator.d.ts +6 -5
  20. package/dist/navigation/Navigator.d.ts +8 -8
  21. package/dist/navigation/consolidation/consolidateWithPagination.d.ts +2 -2
  22. package/dist/navigation/resolvers/NavigationResolver.d.ts +12 -11
  23. package/dist/navigation/resolvers/getAdjustedPositionForSpread.d.ts +2 -1
  24. package/dist/navigation/resolvers/getAdjustedPositionWithSafeEdge.d.ts +2 -1
  25. package/dist/navigation/resolvers/getNavigationForPosition.d.ts +2 -1
  26. package/dist/navigation/resolvers/getNavigationFromSpineItemPosition.d.ts +2 -2
  27. package/dist/navigation/restoration/restorePosition.d.ts +2 -1
  28. package/dist/navigation/tests/SpineItemsManagerMock.d.ts +1 -1
  29. package/dist/navigation/viewport/ViewportNavigator.d.ts +6 -5
  30. package/dist/reader.d.ts +7 -9
  31. package/dist/spine/SpineLayout.d.ts +6 -7
  32. package/dist/spine/layout/layoutItem.d.ts +2 -2
  33. package/dist/spine/locator/SpineLocator.d.ts +17 -31
  34. package/dist/spine/locator/getAbsolutePageIndexFromPageIndex.d.ts +1 -1
  35. package/dist/spine/locator/getItemVisibilityForPosition.d.ts +2 -1
  36. package/dist/spine/locator/getSpineInfoFromAbsolutePageIndex.d.ts +1 -1
  37. package/dist/spine/locator/getSpineItemFromPosition.d.ts +2 -1
  38. package/dist/spine/locator/getSpinePositionFromSpineItemPageIndex.d.ts +1 -1
  39. package/dist/spine/locator/getSpinePositionFromSpineItemPosition.d.ts +4 -4
  40. package/dist/spine/locator/getVisibleSpineItemsFromPosition.d.ts +2 -1
  41. package/dist/spine/types.d.ts +35 -0
  42. package/dist/spineItem/SpineItem.d.ts +1 -0
  43. package/dist/spineItem/{locator → layout}/getSpineItemPagesPosition.d.ts +1 -1
  44. package/dist/spineItem/{locator → layout}/getSpineItemPositionFromPageIndex.d.ts +2 -2
  45. package/dist/spineItem/locationResolver.d.ts +8 -23
  46. package/dist/spineItem/navigationResolver.d.ts +4 -4
  47. package/dist/spineItem/types.d.ts +9 -10
  48. package/package.json +3 -3
  49. package/dist/spine/layout/convertViewportPositionToLayoutPosition.d.ts +0 -9
  50. package/dist/spine/layout/types.d.ts +0 -11
  51. /package/dist/spineItem/{locator → layout}/getSpineItemNumberOfPages.d.ts +0 -0
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { switchMap, of, fromEvent, take, map, from, takeUntil, Observable, defer, Subject, combineLatest, merge, EMPTY, withLatestFrom, NEVER, tap as tap$1, share, BehaviorSubject, filter, first as first$1, mergeMap, endWith, finalize, catchError, lastValueFrom, scheduled, animationFrameScheduler, distinctUntilChanged as distinctUntilChanged$1, throttleTime, debounceTime as debounceTime$1, startWith as startWith$1, switchScan, forkJoin, shareReplay as shareReplay$1, delay, ReplaySubject, identity, timer, skip as skip$1, exhaustMap, reduce, concatMap } from "rxjs";
1
+ import { switchMap, of, fromEvent, take, map, from, takeUntil, Observable, defer, Subject, combineLatest, merge, EMPTY, withLatestFrom, NEVER, tap as tap$1, share, BehaviorSubject, filter, first as first$1, mergeMap, endWith, finalize, catchError, lastValueFrom, scheduled, animationFrameScheduler, shareReplay as shareReplay$1, distinctUntilChanged as distinctUntilChanged$1, throttleTime, debounceTime as debounceTime$1, startWith as startWith$1, switchScan, forkJoin, delay, ReplaySubject, identity, timer, skip as skip$1, exhaustMap, reduce, concatMap } from "rxjs";
2
2
  import { switchMap as switchMap$1, first, map as map$1, startWith, shareReplay, distinctUntilChanged, tap, pairwise, take as take$1, takeUntil as takeUntil$1, filter as filter$1, debounceTime, skip, mergeMap as mergeMap$1, catchError as catchError$1, withLatestFrom as withLatestFrom$1 } from "rxjs/operators";
3
3
  import { shallowMergeIfDefined, isShallowEqual, getParentPath, parseContentType, detectMimeTypeFromName, arrayEqual } from "@prose-reader/shared";
4
4
  import { isShallowEqual as isShallowEqual2 } from "@prose-reader/shared";
@@ -2141,6 +2141,92 @@ const fixReflowable = (reader) => {
2141
2141
  }
2142
2142
  );
2143
2143
  };
2144
+ class SpineElementLayout {
2145
+ constructor(layout) {
2146
+ this.left = layout.left;
2147
+ this.right = layout.right;
2148
+ this.top = layout.top;
2149
+ this.bottom = layout.bottom;
2150
+ this.width = layout.width;
2151
+ this.height = layout.height;
2152
+ this.x = layout.x;
2153
+ this.y = layout.y;
2154
+ }
2155
+ }
2156
+ class SpineItemSpineLayout extends SpineElementLayout {
2157
+ constructor() {
2158
+ super(...arguments);
2159
+ this.__symbol = Symbol(`SpineItemSpineLayout`);
2160
+ }
2161
+ }
2162
+ class SpineItemPageSpineLayout extends SpineElementLayout {
2163
+ constructor() {
2164
+ super(...arguments);
2165
+ this.__symbol = Symbol(`SpineItemPageSpineLayout`);
2166
+ }
2167
+ }
2168
+ class SpinePosition {
2169
+ constructor(position) {
2170
+ this.__symbol = Symbol(`SpinePosition`);
2171
+ this.x = position.x;
2172
+ this.y = position.y;
2173
+ }
2174
+ }
2175
+ const spinePositionToSpineItemSpineLayout = ({
2176
+ position,
2177
+ pageSize
2178
+ }) => {
2179
+ return new SpineItemPageSpineLayout({
2180
+ x: position.x,
2181
+ y: position.y,
2182
+ left: position.x,
2183
+ top: position.y,
2184
+ width: pageSize.width,
2185
+ height: pageSize.height,
2186
+ bottom: position.y + pageSize.height,
2187
+ right: position.x + pageSize.width
2188
+ });
2189
+ };
2190
+ const createLayoutInfo = (reader) => {
2191
+ const layout$ = reader.spine.spineLayout.layout$.pipe(
2192
+ map(() => {
2193
+ const items = reader.spine.spineItemsManager.items;
2194
+ const pages = items.reduce((acc, spineItem, itemIndex) => {
2195
+ const pages2 = new Array(spineItem.numberOfPages).fill(void 0);
2196
+ const pagesAbsolutePositions = pages2.map((_, pageIndex) => {
2197
+ const pageSpineItemPosition = reader.spine.spineItemLocator.getSpineItemPositionFromPageIndex({
2198
+ spineItem,
2199
+ pageIndex
2200
+ });
2201
+ const pageSpinePosition = reader.spine.locator.getSpinePositionFromSpineItemPosition({
2202
+ spineItem,
2203
+ spineItemPosition: pageSpineItemPosition
2204
+ });
2205
+ return spinePositionToSpineItemSpineLayout({
2206
+ pageSize: reader.context.getPageSize(),
2207
+ position: pageSpinePosition
2208
+ });
2209
+ });
2210
+ const itemPagesInfo = pagesAbsolutePositions.map((absolutePosition, pageIndex) => ({
2211
+ itemIndex,
2212
+ absolutePageIndex: itemIndex + pageIndex,
2213
+ absolutePosition
2214
+ }));
2215
+ return [...acc, ...itemPagesInfo];
2216
+ }, []);
2217
+ return {
2218
+ pages
2219
+ };
2220
+ }),
2221
+ tap$1((layout) => {
2222
+ Report.log(`layout:info`, layout);
2223
+ }),
2224
+ share()
2225
+ );
2226
+ const info$ = layout$.pipe(shareReplay$1({ refCount: true, bufferSize: 1 }));
2227
+ info$.pipe(takeUntil(reader.$.destroy$)).subscribe();
2228
+ return { layout$, info$ };
2229
+ };
2144
2230
  const layoutEnhancer = (next) => (options) => {
2145
2231
  const {
2146
2232
  pageHorizontalMargin,
@@ -2275,6 +2361,7 @@ const layoutEnhancer = (next) => (options) => {
2275
2361
  }
2276
2362
  })
2277
2363
  );
2364
+ const { layout$, info$ } = createLayoutInfo(reader);
2278
2365
  merge(
2279
2366
  updateSpineItemClassName$,
2280
2367
  revealItemOnReady$,
@@ -2287,7 +2374,9 @@ const layoutEnhancer = (next) => (options) => {
2287
2374
  settingsManager.destroy();
2288
2375
  reader.destroy();
2289
2376
  },
2290
- settings: settingsManager
2377
+ settings: settingsManager,
2378
+ layout$,
2379
+ layoutInfo$: info$
2291
2380
  };
2292
2381
  };
2293
2382
  const HTML_PREFIX = `${HTML_PREFIX$1}-enhancer-loading`;
@@ -2358,7 +2447,10 @@ const loadingEnhancer = (next) => (options) => {
2358
2447
  return acc;
2359
2448
  }, {})
2360
2449
  );
2361
- const updateEntriesLayout$ = (entries) => combineLatest([reader.layout$, reader.theme.$.theme$]).pipe(
2450
+ const updateEntriesLayout$ = (entries) => combineLatest([
2451
+ reader.spine.spineLayout.layout$,
2452
+ reader.theme.$.theme$
2453
+ ]).pipe(
2362
2454
  map$1(([, theme]) => ({
2363
2455
  width: reader.context.state.visibleAreaRect.width,
2364
2456
  theme
@@ -2594,6 +2686,13 @@ const handleLinksNavigation = (reader, manualNavigator) => {
2594
2686
  );
2595
2687
  };
2596
2688
  const report$4 = Report.namespace(`navigation`);
2689
+ class SpineItemPosition {
2690
+ constructor(position) {
2691
+ this.__symbol = Symbol(`SpineItemPosition`);
2692
+ this.x = position.x;
2693
+ this.y = position.y;
2694
+ }
2695
+ }
2597
2696
  const getSpineItemPositionForLeftPage = ({
2598
2697
  position,
2599
2698
  spineItem,
@@ -2601,15 +2700,15 @@ const getSpineItemPositionForLeftPage = ({
2601
2700
  pageWidth,
2602
2701
  spineItemLocator
2603
2702
  }) => {
2604
- let nextPotentialPosition = {
2703
+ let nextPotentialPosition = new SpineItemPosition({
2605
2704
  x: position.x - pageWidth,
2606
2705
  y: position.y
2607
- };
2706
+ });
2608
2707
  if (spineItem.isUsingVerticalWriting()) {
2609
- nextPotentialPosition = {
2708
+ nextPotentialPosition = new SpineItemPosition({
2610
2709
  x: position.x,
2611
2710
  y: position.y + pageHeight
2612
- };
2711
+ });
2613
2712
  }
2614
2713
  const navigationPosition = spineItemLocator.getSpineItemClosestPositionFromUnsafePosition(
2615
2714
  nextPotentialPosition,
@@ -2710,15 +2809,15 @@ const getSpineItemPositionForRightPage = ({
2710
2809
  pageWidth,
2711
2810
  spineItemLocator
2712
2811
  }) => {
2713
- let nextPotentialPosition = {
2812
+ let nextPotentialPosition = new SpineItemPosition({
2714
2813
  x: position.x + pageWidth,
2715
2814
  y: position.y
2716
- };
2815
+ });
2717
2816
  if (spineItem.isUsingVerticalWriting()) {
2718
- nextPotentialPosition = {
2817
+ nextPotentialPosition = new SpineItemPosition({
2719
2818
  x: position.x,
2720
2819
  y: position.y - pageHeight
2721
- };
2820
+ });
2722
2821
  }
2723
2822
  const navigationPosition = spineItemLocator.getSpineItemClosestPositionFromUnsafePosition(
2724
2823
  nextPotentialPosition,
@@ -3158,7 +3257,7 @@ const navigationEnhancer = (next) => (options) => {
3158
3257
  }
3159
3258
  };
3160
3259
  };
3161
- const NAMESPACE$6 = `paginationEnhancer`;
3260
+ const NAMESPACE$5 = `paginationEnhancer`;
3162
3261
  const consolidate = (item, reader) => {
3163
3262
  var _a;
3164
3263
  let itemPageIndex = (_a = item.meta) == null ? void 0 : _a.itemPageIndex;
@@ -3214,7 +3313,7 @@ const consolidate = (item, reader) => {
3214
3313
  const createLocator = (reader) => (resources) => {
3215
3314
  return deferIdle(() => {
3216
3315
  if (!resources.length) return of(resources);
3217
- const consolidate$ = reader.layout$.pipe(
3316
+ const consolidate$ = reader.spine.spineLayout.layout$.pipe(
3218
3317
  debounceTime$1(10),
3219
3318
  startWith$1(null),
3220
3319
  switchScan((acc$) => {
@@ -3309,7 +3408,7 @@ const getTotalProgressFromPercentages = (estimateBeforeThisItem, currentItemWeig
3309
3408
  const getScrollPercentageWithinItem = (reader, currentPosition, currentItem) => {
3310
3409
  const context = reader.context;
3311
3410
  const { height, width } = currentItem.layout.layoutInfo;
3312
- const { top, left } = reader.spine.spineLayout.getSpineItemRelativeLayoutInfo(currentItem);
3411
+ const { top, left } = reader.spine.spineLayout.getSpineItemSpineLayoutInfo(currentItem);
3313
3412
  if (reader.settings.values.computedPageTurnDirection === `vertical`) {
3314
3413
  return Math.max(
3315
3414
  0,
@@ -3371,29 +3470,22 @@ const getPercentageEstimate = (reader, currentSpineIndex, pageIndex, currentPosi
3371
3470
  })
3372
3471
  );
3373
3472
  };
3374
- const getNumberOfPagesForAllSpineItems = (reader) => reader.spineItemsManager.items.map((item) => {
3375
- const { height, width } = item.layout.layoutInfo;
3376
- return reader.spine.spineItemLocator.getSpineItemNumberOfPages({
3377
- isUsingVerticalWriting: !!item.isUsingVerticalWriting(),
3378
- itemHeight: height,
3379
- itemWidth: width
3380
- });
3381
- }, 0);
3382
3473
  const trackTotalPages = (reader) => {
3383
- const totalPages$ = reader.layout$.pipe(
3474
+ const totalPages$ = reader.spine.spineLayout.layout$.pipe(
3384
3475
  debounceTime$1(10, animationFrameScheduler),
3385
3476
  withLatestFrom(reader.pagination.state$),
3386
3477
  map(() => {
3387
- const numberOfPagesPerItems = getNumberOfPagesForAllSpineItems(reader);
3388
3478
  return {
3389
- numberOfPagesPerItems,
3479
+ numberOfPagesPerItems: reader.spineItemsManager.items.reduce(
3480
+ (acc, item) => {
3481
+ return [...acc, item.numberOfPages];
3482
+ },
3483
+ []
3484
+ ),
3390
3485
  /**
3391
3486
  * This may be not accurate for reflowable due to dynamic load / unload.
3392
3487
  */
3393
- numberOfTotalPages: numberOfPagesPerItems.reduce(
3394
- (acc, numberOfPagesForItem) => acc + numberOfPagesForItem,
3395
- 0
3396
- )
3488
+ numberOfTotalPages: reader.spine.spineLayout.numberOfPages
3397
3489
  };
3398
3490
  }),
3399
3491
  distinctUntilChanged$1(isShallowEqual),
@@ -3520,7 +3612,7 @@ const trackPaginationInfo = (reader) => {
3520
3612
  );
3521
3613
  return { paginationInfo$, getPaginationInfo: () => currentValue.value };
3522
3614
  };
3523
- Report.namespace(NAMESPACE$6);
3615
+ Report.namespace(NAMESPACE$5);
3524
3616
  const paginationEnhancer = (next) => (options) => {
3525
3617
  const reader = next(options);
3526
3618
  const { paginationInfo$, getPaginationInfo } = trackPaginationInfo(reader);
@@ -5481,10 +5573,10 @@ const getSpineItemPositionFromPageIndex = ({
5481
5573
  pageIndex,
5482
5574
  itemLayout.height
5483
5575
  );
5484
- return {
5576
+ return new SpineItemPosition({
5485
5577
  x: 0,
5486
5578
  y: ltrRelativeOffset2
5487
- };
5579
+ });
5488
5580
  }
5489
5581
  const ltrRelativeOffset = getItemOffsetFromPageIndex(
5490
5582
  context.getPageSize().width,
@@ -5492,15 +5584,15 @@ const getSpineItemPositionFromPageIndex = ({
5492
5584
  itemLayout.width
5493
5585
  );
5494
5586
  if (context.isRTL()) {
5495
- return {
5587
+ return new SpineItemPosition({
5496
5588
  x: itemLayout.width - ltrRelativeOffset - context.getPageSize().width,
5497
5589
  y: 0
5498
- };
5590
+ });
5499
5591
  }
5500
- return {
5592
+ return new SpineItemPosition({
5501
5593
  x: ltrRelativeOffset,
5502
5594
  y: 0
5503
- };
5595
+ });
5504
5596
  };
5505
5597
  const getSpineItemPagesPosition = ({
5506
5598
  context,
@@ -5532,7 +5624,7 @@ const createSpineItemLocator = ({
5532
5624
  itemWidth,
5533
5625
  itemHeight,
5534
5626
  spineItemPosition
5535
- }) => ({
5627
+ }) => new SpineItemPosition({
5536
5628
  x: Math.min(itemWidth, Math.max(0, spineItemPosition.x)),
5537
5629
  y: Math.min(itemHeight, Math.max(0, spineItemPosition.y))
5538
5630
  });
@@ -5580,7 +5672,7 @@ const createSpineItemLocator = ({
5580
5672
  pageWidth,
5581
5673
  spineItemWidth
5582
5674
  );
5583
- return { x: val, y: 0 };
5675
+ return new SpineItemPosition({ x: val, y: 0 });
5584
5676
  }
5585
5677
  return void 0;
5586
5678
  };
@@ -5612,7 +5704,7 @@ const createSpineItemLocator = ({
5612
5704
  };
5613
5705
  const getSpineItemClosestPositionFromUnsafePosition = (unsafePosition, spineItem) => {
5614
5706
  const { width, height } = spineItem.layout.layoutInfo;
5615
- const adjustedPosition = {
5707
+ const adjustedPosition = new SpineItemPosition({
5616
5708
  x: getClosestValidOffsetFromApproximateOffsetInPages(
5617
5709
  unsafePosition.x,
5618
5710
  context.getPageSize().width,
@@ -5623,7 +5715,7 @@ const createSpineItemLocator = ({
5623
5715
  context.getPageSize().height,
5624
5716
  height
5625
5717
  )
5626
- };
5718
+ });
5627
5719
  return adjustedPosition;
5628
5720
  };
5629
5721
  const getSpineItemPageIndexFromNode = (node, offset, spineItem) => {
@@ -5649,12 +5741,11 @@ const createSpineItemLocator = ({
5649
5741
  getSpineItemPositionFromNode,
5650
5742
  getSpineItemPositionFromPageIndex: ({
5651
5743
  pageIndex,
5652
- itemLayout,
5653
- isUsingVerticalWriting
5744
+ spineItem
5654
5745
  }) => getSpineItemPositionFromPageIndex({
5655
5746
  context,
5656
- isUsingVerticalWriting,
5657
- itemLayout,
5747
+ isUsingVerticalWriting: !!spineItem.isUsingVerticalWriting(),
5748
+ itemLayout: spineItem.layout.layoutInfo,
5658
5749
  pageIndex
5659
5750
  }),
5660
5751
  getSpineItemPageIndexFromPosition,
@@ -5668,12 +5759,7 @@ const createSpineItemLocator = ({
5668
5759
  settings,
5669
5760
  itemLayout: item.layout.layoutInfo
5670
5761
  });
5671
- },
5672
- getSpineItemNumberOfPages: (params) => getSpineItemNumberOfPages({
5673
- context,
5674
- settings,
5675
- ...params
5676
- })
5762
+ }
5677
5763
  };
5678
5764
  };
5679
5765
  const createNavigationResolver$1 = ({
@@ -5682,16 +5768,10 @@ const createNavigationResolver$1 = ({
5682
5768
  }) => {
5683
5769
  const spineItemLocator = createSpineItemLocator({ context, settings });
5684
5770
  const getNavigationForLastPage = (spineItem) => {
5685
- const { height, width } = spineItem.layout.layoutInfo;
5686
- const numberOfPages = spineItemLocator.getSpineItemNumberOfPages({
5687
- isUsingVerticalWriting: !!spineItem.isUsingVerticalWriting(),
5688
- itemHeight: height,
5689
- itemWidth: width
5690
- });
5771
+ const numberOfPages = spineItem.numberOfPages;
5691
5772
  return spineItemLocator.getSpineItemPositionFromPageIndex({
5692
5773
  pageIndex: numberOfPages - 1,
5693
- isUsingVerticalWriting: !!spineItem.isUsingVerticalWriting(),
5694
- itemLayout: spineItem.layout.layoutInfo
5774
+ spineItem
5695
5775
  });
5696
5776
  };
5697
5777
  const getNavigationFromNode = (spineItem, node, offset) => {
@@ -5700,7 +5780,7 @@ const createNavigationResolver$1 = ({
5700
5780
  offset,
5701
5781
  spineItem
5702
5782
  );
5703
- return position || { x: 0, y: 0 };
5783
+ return position || new SpineItemPosition({ x: 0, y: 0 });
5704
5784
  };
5705
5785
  const getNavigationForPosition2 = (spineItem, position) => {
5706
5786
  const potentiallyCorrectedPosition = spineItemLocator.getSpineItemClosestPositionFromUnsafePosition(
@@ -5735,7 +5815,7 @@ const getAdjustedPositionWithSafeEdge = ({
5735
5815
  const lastSpineItem = spineItemsManager.get(
5736
5816
  spineItemsManager.items.length - 1
5737
5817
  );
5738
- const distanceOfLastSpineItem = spineLayout.getSpineItemRelativeLayoutInfo(
5818
+ const distanceOfLastSpineItem = spineLayout.getSpineItemSpineLayoutInfo(
5739
5819
  lastSpineItem || 0
5740
5820
  );
5741
5821
  const maximumYOffset = distanceOfLastSpineItem.bottom - pageSizeHeight;
@@ -5752,6 +5832,66 @@ const getAdjustedPositionWithSafeEdge = ({
5752
5832
  y
5753
5833
  };
5754
5834
  };
5835
+ const getNavigationForPosition = ({
5836
+ viewportPosition,
5837
+ spineLocator,
5838
+ context,
5839
+ spineItemNavigationResolver
5840
+ }) => {
5841
+ const spineItem = spineLocator.getSpineItemFromPosition(viewportPosition);
5842
+ if (spineItem) {
5843
+ const spineItemPosition = spineLocator.getSpineItemPositionFromSpinePosition(
5844
+ viewportPosition,
5845
+ spineItem
5846
+ );
5847
+ const spineItemValidPosition = spineItemNavigationResolver.getNavigationForPosition(
5848
+ spineItem,
5849
+ spineItemPosition
5850
+ );
5851
+ const viewportNavigation = spineLocator.getSpinePositionFromSpineItemPosition({
5852
+ spineItemPosition: spineItemValidPosition,
5853
+ spineItem
5854
+ });
5855
+ return getAdjustedPositionForSpread({
5856
+ position: viewportNavigation,
5857
+ pageSizeWidth: context.getPageSize().width,
5858
+ visibleAreaRectWidth: context.state.visibleAreaRect.width
5859
+ });
5860
+ }
5861
+ return { x: 0, y: 0 };
5862
+ };
5863
+ const getNavigationForSpineItemPage = ({
5864
+ pageIndex,
5865
+ spineItemsManager,
5866
+ spineItemId,
5867
+ context,
5868
+ spineLocator,
5869
+ spineItemNavigationResolver
5870
+ }) => {
5871
+ const spineItem = spineItemsManager.get(spineItemId);
5872
+ if (!spineItem) {
5873
+ const xPositionForPageIndex = pageIndex * context.getPageSize().width;
5874
+ return getNavigationForPosition({
5875
+ viewportPosition: { x: xPositionForPageIndex, y: 0 },
5876
+ context,
5877
+ spineItemNavigationResolver,
5878
+ spineLocator
5879
+ });
5880
+ }
5881
+ const spineItemNavigation = spineLocator.spineItemLocator.getSpineItemPositionFromPageIndex({
5882
+ pageIndex,
5883
+ spineItem
5884
+ });
5885
+ const readingOffset = spineLocator.getSpinePositionFromSpineItemPosition({
5886
+ spineItemPosition: spineItemNavigation,
5887
+ spineItem
5888
+ });
5889
+ return getAdjustedPositionForSpread({
5890
+ position: readingOffset,
5891
+ pageSizeWidth: context.getPageSize().width,
5892
+ visibleAreaRectWidth: context.state.visibleAreaRect.width
5893
+ });
5894
+ };
5755
5895
  const getSpineItemOffsetFromAnchor = ({
5756
5896
  anchor,
5757
5897
  spineItem,
@@ -5780,7 +5920,7 @@ const getSpinePositionFromSpineItemAnchor = ({
5780
5920
  context
5781
5921
  });
5782
5922
  const position = spineLocator.getSpinePositionFromSpineItemPosition({
5783
- spineItemPosition: { x: spineItemOffset, y: 0 },
5923
+ spineItemPosition: new SpineItemPosition({ x: spineItemOffset, y: 0 }),
5784
5924
  spineItem
5785
5925
  });
5786
5926
  return position;
@@ -5868,68 +6008,7 @@ const getNavigationFromSpineItemPosition = ({
5868
6008
  visibleAreaRectWidth: context.state.visibleAreaRect.width
5869
6009
  });
5870
6010
  };
5871
- const getNavigationForPosition = ({
5872
- viewportPosition,
5873
- spineLocator,
5874
- context,
5875
- spineItemNavigationResolver
5876
- }) => {
5877
- const spineItem = spineLocator.getSpineItemFromPosition(viewportPosition);
5878
- if (spineItem) {
5879
- const spineItemPosition = spineLocator.getSpineItemPositionFromSpinePosition(
5880
- viewportPosition,
5881
- spineItem
5882
- );
5883
- const spineItemValidPosition = spineItemNavigationResolver.getNavigationForPosition(
5884
- spineItem,
5885
- spineItemPosition
5886
- );
5887
- const viewportNavigation = spineLocator.getSpinePositionFromSpineItemPosition({
5888
- spineItemPosition: spineItemValidPosition,
5889
- spineItem
5890
- });
5891
- return getAdjustedPositionForSpread({
5892
- position: viewportNavigation,
5893
- pageSizeWidth: context.getPageSize().width,
5894
- visibleAreaRectWidth: context.state.visibleAreaRect.width
5895
- });
5896
- }
5897
- return { x: 0, y: 0 };
5898
- };
5899
- const getNavigationForSpineItemPage = ({
5900
- pageIndex,
5901
- spineItemsManager,
5902
- spineItemId,
5903
- context,
5904
- spineLocator,
5905
- spineItemNavigationResolver
5906
- }) => {
5907
- const spineItem = spineItemsManager.get(spineItemId);
5908
- if (!spineItem) {
5909
- const xPositionForPageIndex = pageIndex * context.getPageSize().width;
5910
- return getNavigationForPosition({
5911
- viewportPosition: { x: xPositionForPageIndex, y: 0 },
5912
- context,
5913
- spineItemNavigationResolver,
5914
- spineLocator
5915
- });
5916
- }
5917
- const spineItemNavigation = spineLocator.spineItemLocator.getSpineItemPositionFromPageIndex({
5918
- pageIndex,
5919
- isUsingVerticalWriting: !!spineItem.isUsingVerticalWriting(),
5920
- itemLayout: spineItem.layout.layoutInfo
5921
- });
5922
- const readingOffset = spineLocator.getSpinePositionFromSpineItemPosition({
5923
- spineItemPosition: spineItemNavigation,
5924
- spineItem
5925
- });
5926
- return getAdjustedPositionForSpread({
5927
- position: readingOffset,
5928
- pageSizeWidth: context.getPageSize().width,
5929
- visibleAreaRectWidth: context.state.visibleAreaRect.width
5930
- });
5931
- };
5932
- const NAMESPACE$5 = `spineNavigator`;
6011
+ const NAMESPACE$4 = `spineNavigator`;
5933
6012
  const createNavigationResolver = ({
5934
6013
  context,
5935
6014
  spineItemsManager,
@@ -5947,10 +6026,10 @@ const createNavigationResolver = ({
5947
6026
  spineItemsManager
5948
6027
  }) || {};
5949
6028
  if (!spineItem) {
5950
- Report.warn(NAMESPACE$5, `unable to detect item id from cfi ${cfi}`);
6029
+ Report.warn(NAMESPACE$4, `unable to detect item id from cfi ${cfi}`);
5951
6030
  return void 0;
5952
6031
  }
5953
- const spineItemNavigation = node ? spineItemNavigator.getNavigationFromNode(spineItem, node, offset) : { x: 0, y: 0 };
6032
+ const spineItemNavigation = node ? spineItemNavigator.getNavigationFromNode(spineItem, node, offset) : new SpineItemPosition({ x: 0, y: 0 });
5954
6033
  const readingPosition = locator.getSpinePositionFromSpineItemPosition({
5955
6034
  spineItemPosition: spineItemNavigation,
5956
6035
  spineItem
@@ -6091,8 +6170,8 @@ const getScaledDownPosition = ({
6091
6170
  };
6092
6171
  return scaledDownPosition;
6093
6172
  };
6094
- const NAMESPACE$4 = `navigation/ViewportNavigator`;
6095
- const report$3 = Report.namespace(NAMESPACE$4);
6173
+ const NAMESPACE$3 = `navigation/ViewportNavigator`;
6174
+ const report$3 = Report.namespace(NAMESPACE$3);
6096
6175
  class ViewportNavigator extends DestroyableClass {
6097
6176
  constructor(settings, viewportElement$, hookManager, context, spine) {
6098
6177
  super();
@@ -6298,8 +6377,8 @@ class Locker {
6298
6377
  }
6299
6378
  }
6300
6379
  const SCROLL_FINISHED_DEBOUNCE_TIMEOUT = 500;
6301
- const NAMESPACE$3 = `navigation/UserNavigator`;
6302
- const report$2 = Report.namespace(NAMESPACE$3);
6380
+ const NAMESPACE$2 = `navigation/UserNavigator`;
6381
+ const report$2 = Report.namespace(NAMESPACE$2);
6303
6382
  class UserNavigator extends DestroyableClass {
6304
6383
  constructor(settings, element$, context, scrollHappeningFromBrowser$, spine) {
6305
6384
  super();
@@ -6628,7 +6707,7 @@ const withSpineItem = ({
6628
6707
  const withSpineItemLayoutInfo = ({ spine }) => (stream) => {
6629
6708
  return stream.pipe(
6630
6709
  switchMap(({ navigation, ...rest }) => {
6631
- const spineItemDimensions = spine.spineLayout.getSpineItemRelativeLayoutInfo(navigation.spineItem);
6710
+ const spineItemDimensions = spine.spineLayout.getSpineItemSpineLayoutInfo(navigation.spineItem);
6632
6711
  const spineItem = spine.spineItemsManager.get(navigation.spineItem);
6633
6712
  return ((spineItem == null ? void 0 : spineItem.isReady$) ?? of(false)).pipe(
6634
6713
  first$1(),
@@ -6681,8 +6760,7 @@ const withSpineItemPosition = ({
6681
6760
  const beginPageIndexForDirection = (navigation.directionFromLastNavigation === "forward" || navigation.directionFromLastNavigation === "anchor" ? visiblePagesAtNavigablePosition == null ? void 0 : visiblePagesAtNavigablePosition.beginPageIndex : visiblePagesAtNavigablePosition == null ? void 0 : visiblePagesAtNavigablePosition.endPageIndex) ?? 0;
6682
6761
  const positionInSpineItem = spineLocator.spineItemLocator.getSpineItemPositionFromPageIndex({
6683
6762
  pageIndex: beginPageIndexForDirection,
6684
- isUsingVerticalWriting: !!spineItem.isUsingVerticalWriting(),
6685
- itemLayout: spineItem.layout.layoutInfo
6763
+ spineItem
6686
6764
  });
6687
6765
  return positionInSpineItem;
6688
6766
  }
@@ -6743,7 +6821,7 @@ const restoreNavigationForControlledPageTurnMode = ({
6743
6821
  first$1(),
6744
6822
  map((isReady) => {
6745
6823
  var _a, _b;
6746
- const spineItemAbsolutePosition = spineLayout.getSpineItemRelativeLayoutInfo(spineItem);
6824
+ const spineItemAbsolutePosition = spineLayout.getSpineItemSpineLayoutInfo(spineItem);
6747
6825
  const isPositionWithinSpineItem = spineLocator.isPositionWithinSpineItem(
6748
6826
  navigation.position,
6749
6827
  spineItem
@@ -6775,10 +6853,10 @@ const restoreNavigationForControlledPageTurnMode = ({
6775
6853
  }
6776
6854
  }
6777
6855
  if (isPositionWithinSpineItem && hasSpineItemGrewOrShrink && navigation.directionFromLastNavigation === "backward") {
6778
- const positionInSpineItemWithDifference = {
6856
+ const positionInSpineItemWithDifference = new SpineItemPosition({
6779
6857
  x: (((_a = navigation.positionInSpineItem) == null ? void 0 : _a.x) ?? 0) + spineItemWidthDifference,
6780
6858
  y: (((_b = navigation.positionInSpineItem) == null ? void 0 : _b.y) ?? 0) + spineItemHeighDifference
6781
- };
6859
+ });
6782
6860
  return navigationResolver.getNavigationFromSpineItemPosition({
6783
6861
  spineItem,
6784
6862
  spineItemPosition: positionInSpineItemWithDifference
@@ -6813,15 +6891,16 @@ const restoreNavigationForScrollingPageTurnMode = ({
6813
6891
  }) => {
6814
6892
  const { spineItem } = navigation;
6815
6893
  const foundSpineItem = spineItemsManager.get(spineItem);
6816
- if (!foundSpineItem) return { x: 0, y: 0 };
6817
- const { height, top } = spineLayout.getSpineItemRelativeLayoutInfo(foundSpineItem);
6894
+ if (!foundSpineItem) return new SpinePosition({ x: 0, y: 0 });
6895
+ const { height, top } = spineLayout.getSpineItemSpineLayoutInfo(foundSpineItem);
6818
6896
  const isPositionWithinSpineItem = spineLocator.isPositionWithinSpineItem(
6819
6897
  navigation.position,
6820
6898
  foundSpineItem
6821
6899
  );
6822
- const positionInSpineItem = navigation.positionInSpineItem ?? {
6823
- y: 0
6824
- };
6900
+ const positionInSpineItem = navigation.positionInSpineItem ?? new SpineItemPosition({
6901
+ y: 0,
6902
+ x: 0
6903
+ });
6825
6904
  if (settings.values.computedPageTurnDirection === "vertical") {
6826
6905
  if (top === navigation.spineItemTop && height === navigation.spineItemHeight && isPositionWithinSpineItem) {
6827
6906
  return navigation.position;
@@ -6831,10 +6910,10 @@ const restoreNavigationForScrollingPageTurnMode = ({
6831
6910
  }
6832
6911
  if (top !== navigation.spineItemTop) {
6833
6912
  const positionInSpineItem2 = spineLocator.getSafeSpineItemPositionFromUnsafeSpineItemPosition(
6834
- navigation.positionInSpineItem ?? {
6913
+ navigation.positionInSpineItem ?? new SpineItemPosition({
6835
6914
  x: 0,
6836
6915
  y: 0
6837
- },
6916
+ }),
6838
6917
  foundSpineItem
6839
6918
  );
6840
6919
  return spineLocator.getSpinePositionFromSpineItemPosition({
@@ -6844,10 +6923,10 @@ const restoreNavigationForScrollingPageTurnMode = ({
6844
6923
  }
6845
6924
  if (top === navigation.spineItemTop && height !== navigation.spineItemHeight) {
6846
6925
  const positionYfromBottomPreviousNavigation = (navigation.spineItemHeight ?? positionInSpineItem.y) - positionInSpineItem.y;
6847
- const positionInspineItem = {
6926
+ const positionInspineItem = new SpineItemPosition({
6848
6927
  y: navigation.directionFromLastNavigation === "backward" ? height - positionYfromBottomPreviousNavigation : positionInSpineItem.y,
6849
6928
  x: navigation.position.x
6850
- };
6929
+ });
6851
6930
  if (isPositionWithinSpineItem) {
6852
6931
  const positionInSpineItem2 = spineLocator.getSafeSpineItemPositionFromUnsafeSpineItemPosition(
6853
6932
  positionInspineItem,
@@ -6861,10 +6940,10 @@ const restoreNavigationForScrollingPageTurnMode = ({
6861
6940
  if (!isPositionWithinSpineItem) {
6862
6941
  const positionIsBeforeItem = navigation.position.y < top;
6863
6942
  if (!positionIsBeforeItem) {
6864
- const positionInItem = {
6943
+ const positionInItem = new SpineItemPosition({
6865
6944
  y: height - positionYfromBottomPreviousNavigation,
6866
6945
  x: navigation.position.x
6867
- };
6946
+ });
6868
6947
  return spineLocator.getSpinePositionFromSpineItemPosition({
6869
6948
  spineItemPosition: spineLocator.getSafeSpineItemPositionFromUnsafeSpineItemPosition(
6870
6949
  positionInItem,
@@ -6933,8 +7012,8 @@ const withRestoredPosition = ({
6933
7012
  );
6934
7013
  })
6935
7014
  );
6936
- const NAMESPACE$2 = `navigation/InternalNavigator`;
6937
- const report$1 = Report.namespace(NAMESPACE$2);
7015
+ const NAMESPACE$1 = `navigation/InternalNavigator`;
7016
+ const report$1 = Report.namespace(NAMESPACE$1);
6938
7017
  class InternalNavigator extends DestroyableClass {
6939
7018
  constructor(settings, context, userNavigation$, viewportController, navigationResolver, spine, element$, isUserLocked$) {
6940
7019
  super();
@@ -6948,7 +7027,7 @@ class InternalNavigator extends DestroyableClass {
6948
7027
  this.isUserLocked$ = isUserLocked$;
6949
7028
  this.navigationSubject = new BehaviorSubject({
6950
7029
  animation: false,
6951
- position: { x: 0, y: 0 },
7030
+ position: new SpinePosition({ x: 0, y: 0 }),
6952
7031
  meta: {
6953
7032
  triggeredBy: "user"
6954
7033
  },
@@ -7290,8 +7369,8 @@ const createNavigator = ({
7290
7369
  getElement: () => element$.getValue()
7291
7370
  };
7292
7371
  };
7293
- const NAMESPACE$1 = `pagination`;
7294
- const report = Report.namespace(NAMESPACE$1);
7372
+ const NAMESPACE = `pagination`;
7373
+ const report = Report.namespace(NAMESPACE);
7295
7374
  class Pagination extends DestroyableClass {
7296
7375
  constructor(context, spineItemsManager) {
7297
7376
  super();
@@ -7381,18 +7460,8 @@ class PaginationController extends DestroyableClass {
7381
7460
  const shouldUpdateEndCfi = previousPagination.endSpineItemIndex !== endSpineItemIndex || endLastCfi === void 0 || isRootCfi(endLastCfi);
7382
7461
  const beginCfi = shouldUpdateBeginCfi ? getRootCfi(beginSpineItem) : beginLastCfi;
7383
7462
  const endCfi = shouldUpdateEndCfi ? getRootCfi(endSpineItem) : endLastCfi;
7384
- const beginSpineItemDimensions = beginSpineItem.layout.layoutInfo;
7385
- const beginNumberOfPagesInSpineItem = this.spineItemLocator.getSpineItemNumberOfPages({
7386
- itemHeight: beginSpineItemDimensions.height,
7387
- itemWidth: beginSpineItemDimensions.width,
7388
- isUsingVerticalWriting: !!beginSpineItem.isUsingVerticalWriting()
7389
- });
7390
- const endSpineItemDimensions = endSpineItem.layout.layoutInfo;
7391
- const endNumberOfPagesInSpineItem = this.spineItemLocator.getSpineItemNumberOfPages({
7392
- itemHeight: endSpineItemDimensions.height,
7393
- itemWidth: endSpineItemDimensions.width,
7394
- isUsingVerticalWriting: !!endSpineItem.isUsingVerticalWriting()
7395
- });
7463
+ const beginNumberOfPagesInSpineItem = beginSpineItem.numberOfPages;
7464
+ const endNumberOfPagesInSpineItem = endSpineItem.numberOfPages;
7396
7465
  this.pagination.update({
7397
7466
  beginCfi,
7398
7467
  beginNumberOfPagesInSpineItem,
@@ -7565,10 +7634,7 @@ class ReaderSettingsManager extends SettingsManager3 {
7565
7634
  const getAbsolutePageIndexFromPageIndex = ({
7566
7635
  pageIndex,
7567
7636
  spineItemOrId,
7568
- spineLayout,
7569
- spineItemsManager,
7570
- context,
7571
- settings
7637
+ spineItemsManager
7572
7638
  }) => {
7573
7639
  const items = spineItemsManager.items;
7574
7640
  const spineItem = spineItemsManager.get(spineItemOrId);
@@ -7576,14 +7642,7 @@ const getAbsolutePageIndexFromPageIndex = ({
7576
7642
  const { currentAbsolutePage } = items.reduce(
7577
7643
  (acc, item) => {
7578
7644
  if (acc.found) return acc;
7579
- const itemLayout = spineLayout.getSpineItemRelativeLayoutInfo(item);
7580
- const numberOfPages = getSpineItemNumberOfPages({
7581
- isUsingVerticalWriting: !!item.isUsingVerticalWriting(),
7582
- itemHeight: itemLayout.height,
7583
- itemWidth: itemLayout.width,
7584
- context,
7585
- settings
7586
- });
7645
+ const numberOfPages = item.numberOfPages;
7587
7646
  if (spineItem === item) {
7588
7647
  if (pageIndex <= numberOfPages - 1) {
7589
7648
  return {
@@ -7677,23 +7736,13 @@ const getItemVisibilityForPosition = ({
7677
7736
  };
7678
7737
  const getSpineInfoFromAbsolutePageIndex = ({
7679
7738
  absolutePageIndex,
7680
- spineLayout,
7681
- spineItemsManager,
7682
- context,
7683
- settings
7739
+ spineItemsManager
7684
7740
  }) => {
7685
7741
  const items = spineItemsManager.items;
7686
7742
  const { found, currentAbsolutePage } = items.reduce(
7687
7743
  (acc, item) => {
7688
7744
  if (acc.found) return acc;
7689
- const itemLayout = spineLayout.getSpineItemRelativeLayoutInfo(item);
7690
- const numberOfPages = getSpineItemNumberOfPages({
7691
- isUsingVerticalWriting: !!item.isUsingVerticalWriting(),
7692
- itemHeight: itemLayout.height,
7693
- itemWidth: itemLayout.width,
7694
- context,
7695
- settings
7696
- });
7745
+ const numberOfPages = item.numberOfPages;
7697
7746
  const possiblePageIndex = absolutePageIndex - acc.currentAbsolutePage;
7698
7747
  const currentAbsolutePage2 = acc.currentAbsolutePage + numberOfPages;
7699
7748
  if (possiblePageIndex <= numberOfPages - 1) {
@@ -7727,7 +7776,7 @@ const getSpineItemFromPosition = ({
7727
7776
  settings
7728
7777
  }) => {
7729
7778
  const spineItem = spineItemsManager.items.find((item) => {
7730
- const { left, right, bottom, top } = spineLayout.getSpineItemRelativeLayoutInfo(item);
7779
+ const { left, right, bottom, top } = spineLayout.getSpineItemSpineLayoutInfo(item);
7731
7780
  const isWithinXAxis = position.x >= left && position.x < right;
7732
7781
  if (settings.values.computedPageTurnDirection === `horizontal`) {
7733
7782
  return isWithinXAxis;
@@ -7743,10 +7792,10 @@ const getSpinePositionFromSpineItemPosition = ({
7743
7792
  spineItemPosition,
7744
7793
  itemLayout: { left, top }
7745
7794
  }) => {
7746
- return {
7795
+ return new SpinePosition({
7747
7796
  x: left + spineItemPosition.x,
7748
7797
  y: top + spineItemPosition.y
7749
- };
7798
+ });
7750
7799
  };
7751
7800
  const getVisibleSpineItemsFromPosition = ({
7752
7801
  position,
@@ -7765,7 +7814,7 @@ const getVisibleSpineItemsFromPosition = ({
7765
7814
  }) || spineItemsManager.get(0);
7766
7815
  const spineItemsVisible = spineItemsManager.items.reduce(
7767
7816
  (acc, spineItem) => {
7768
- const itemPosition = spineLayout.getSpineItemRelativeLayoutInfo(spineItem);
7817
+ const itemPosition = spineLayout.getSpineItemSpineLayoutInfo(spineItem);
7769
7818
  const { visible } = getItemVisibilityForPosition({
7770
7819
  itemPosition,
7771
7820
  threshold,
@@ -7801,8 +7850,8 @@ const createSpineLocator = ({
7801
7850
  `getSpineItemPositionFromSpinePosition`,
7802
7851
  10,
7803
7852
  (position, spineItem) => {
7804
- const { left, top } = spineLayout.getSpineItemRelativeLayoutInfo(spineItem);
7805
- return {
7853
+ const { left, top } = spineLayout.getSpineItemSpineLayoutInfo(spineItem);
7854
+ return new SpineItemPosition({
7806
7855
  /**
7807
7856
  * when using spread the item could be on the right and therefore will be negative
7808
7857
  * @example
@@ -7812,14 +7861,14 @@ const createSpineLocator = ({
7812
7861
  */
7813
7862
  x: Math.max(position.x - left, 0),
7814
7863
  y: Math.max(position.y - top, 0)
7815
- };
7864
+ });
7816
7865
  },
7817
7866
  { disable: true }
7818
7867
  );
7819
7868
  const getSpinePositionFromSpineItem = (spineItem) => {
7820
7869
  return getSpinePositionFromSpineItemPosition({
7821
- spineItemPosition: { x: 0, y: 0 },
7822
- itemLayout: spineLayout.getSpineItemRelativeLayoutInfo(spineItem)
7870
+ spineItemPosition: new SpineItemPosition({ x: 0, y: 0 }),
7871
+ itemLayout: spineLayout.getSpineItemSpineLayoutInfo(spineItem)
7823
7872
  });
7824
7873
  };
7825
7874
  const getSpineItemFromIframe = (iframe) => {
@@ -7849,21 +7898,15 @@ const createSpineLocator = ({
7849
7898
  spineItem,
7850
7899
  restrictToScreen
7851
7900
  }) => {
7852
- const { height, width } = spineItem.layout.layoutInfo;
7853
- const numberOfPages = spineItemLocator.getSpineItemNumberOfPages({
7854
- isUsingVerticalWriting: !!spineItem.isUsingVerticalWriting(),
7855
- itemHeight: height,
7856
- itemWidth: width
7857
- });
7901
+ const numberOfPages = spineItem.numberOfPages;
7858
7902
  const pages = Array.from(Array(numberOfPages)).map((_, index) => {
7859
7903
  const spineItemPosition = spineItemLocator.getSpineItemPositionFromPageIndex({
7860
7904
  pageIndex: index,
7861
- isUsingVerticalWriting: !!spineItem.isUsingVerticalWriting(),
7862
- itemLayout: spineItem.layout.layoutInfo
7905
+ spineItem
7863
7906
  });
7864
7907
  const spinePosition = getSpinePositionFromSpineItemPosition({
7865
7908
  spineItemPosition,
7866
- itemLayout: spineLayout.getSpineItemRelativeLayoutInfo(spineItem)
7909
+ itemLayout: spineLayout.getSpineItemSpineLayoutInfo(spineItem)
7867
7910
  });
7868
7911
  return {
7869
7912
  index,
@@ -7903,22 +7946,22 @@ const createSpineLocator = ({
7903
7946
  };
7904
7947
  };
7905
7948
  const isPositionWithinSpineItem = (position, spineItem) => {
7906
- const { bottom, left, right, top } = spineLayout.getSpineItemRelativeLayoutInfo(spineItem);
7949
+ const { bottom, left, right, top } = spineLayout.getSpineItemSpineLayoutInfo(spineItem);
7907
7950
  return position.x >= left && position.x <= right && position.y <= bottom && position.y >= top;
7908
7951
  };
7909
7952
  const getSafeSpineItemPositionFromUnsafeSpineItemPosition = (unsafePosition, spineItem) => {
7910
- const { height, width } = spineLayout.getSpineItemRelativeLayoutInfo(spineItem);
7911
- return {
7953
+ const { height, width } = spineLayout.getSpineItemSpineLayoutInfo(spineItem);
7954
+ return new SpineItemPosition({
7912
7955
  x: Math.min(Math.max(0, unsafePosition.x), width),
7913
7956
  y: Math.min(Math.max(0, unsafePosition.y), height)
7914
- };
7957
+ });
7915
7958
  };
7916
7959
  return {
7917
7960
  getSpinePositionFromSpineItemPosition: ({
7918
7961
  spineItem,
7919
7962
  spineItemPosition
7920
7963
  }) => {
7921
- const itemLayout = spineLayout.getSpineItemRelativeLayoutInfo(spineItem);
7964
+ const itemLayout = spineLayout.getSpineItemSpineLayoutInfo(spineItem);
7922
7965
  return getSpinePositionFromSpineItemPosition({
7923
7966
  itemLayout,
7924
7967
  spineItemPosition
@@ -7926,17 +7969,11 @@ const createSpineLocator = ({
7926
7969
  },
7927
7970
  getAbsolutePageIndexFromPageIndex: (params) => getAbsolutePageIndexFromPageIndex({
7928
7971
  ...params,
7929
- context,
7930
- settings,
7931
- spineItemsManager,
7932
- spineLayout
7972
+ spineItemsManager
7933
7973
  }),
7934
7974
  getSpineInfoFromAbsolutePageIndex: (params) => getSpineInfoFromAbsolutePageIndex({
7935
7975
  ...params,
7936
- context,
7937
- settings,
7938
- spineItemsManager,
7939
- spineLayout
7976
+ spineItemsManager
7940
7977
  }),
7941
7978
  getSpinePositionFromSpineItem,
7942
7979
  getSpineItemPositionFromSpinePosition,
@@ -8061,21 +8098,6 @@ class SpineItemsObserver extends DestroyableClass {
8061
8098
  );
8062
8099
  }
8063
8100
  }
8064
- const convertSpinePositionToLayoutPosition = ({
8065
- position,
8066
- pageSize
8067
- }) => {
8068
- return {
8069
- x: position.x,
8070
- y: position.y,
8071
- left: position.x,
8072
- top: position.y,
8073
- width: pageSize.width,
8074
- height: pageSize.height,
8075
- bottom: position.y + pageSize.height,
8076
- right: position.x + pageSize.width
8077
- };
8078
- };
8079
8101
  const layoutItem = ({
8080
8102
  horizontalOffset,
8081
8103
  verticalOffset,
@@ -8136,7 +8158,7 @@ const layoutItem = ({
8136
8158
  }
8137
8159
  const newEdgeX = width + currentValidEdgeXForVerticalPositioning;
8138
8160
  const newEdgeY = height + currentValidEdgeYForVerticalPositioning;
8139
- const layoutPosition2 = {
8161
+ const layoutPosition2 = new SpineItemSpineLayout({
8140
8162
  left: currentValidEdgeXForVerticalPositioning,
8141
8163
  right: newEdgeX,
8142
8164
  top: currentValidEdgeYForVerticalPositioning,
@@ -8145,7 +8167,7 @@ const layoutItem = ({
8145
8167
  width,
8146
8168
  x: currentValidEdgeXForVerticalPositioning,
8147
8169
  y: currentValidEdgeYForVerticalPositioning
8148
- };
8170
+ });
8149
8171
  return {
8150
8172
  horizontalOffset: newEdgeX,
8151
8173
  verticalOffset: newEdgeY,
@@ -8156,7 +8178,7 @@ const layoutItem = ({
8156
8178
  context.isRTL() ? { right: horizontalOffset, top: 0 } : { left: horizontalOffset, top: 0 }
8157
8179
  );
8158
8180
  const left = context.isRTL() ? context.state.visibleAreaRect.width - horizontalOffset - width : horizontalOffset;
8159
- const layoutPosition = {
8181
+ const layoutPosition = new SpineItemSpineLayout({
8160
8182
  right: context.isRTL() ? context.state.visibleAreaRect.width - horizontalOffset : horizontalOffset + width,
8161
8183
  left,
8162
8184
  x: left,
@@ -8165,7 +8187,7 @@ const layoutItem = ({
8165
8187
  height,
8166
8188
  width,
8167
8189
  y: verticalOffset
8168
- };
8190
+ });
8169
8191
  return {
8170
8192
  horizontalOffset: horizontalOffset + width,
8171
8193
  verticalOffset: 0,
@@ -8174,7 +8196,6 @@ const layoutItem = ({
8174
8196
  })
8175
8197
  );
8176
8198
  };
8177
- const NAMESPACE = `SpineLayout`;
8178
8199
  class SpineLayout extends DestroyableClass {
8179
8200
  constructor(spineItemsManager, context, settings) {
8180
8201
  super();
@@ -8267,67 +8288,16 @@ class SpineLayout extends DestroyableClass {
8267
8288
  })
8268
8289
  );
8269
8290
  }),
8270
- map(() => {
8271
- const items = spineItemsManager.items;
8272
- const spineItemsPagesAbsolutePositions = items.map((item) => {
8273
- const itemLayout = this.getSpineItemRelativeLayoutInfo(item);
8274
- const numberOfPages = getSpineItemNumberOfPages({
8275
- isUsingVerticalWriting: !!item.isUsingVerticalWriting(),
8276
- itemHeight: itemLayout.height,
8277
- itemWidth: itemLayout.width,
8278
- context,
8279
- settings
8280
- });
8281
- const pages2 = new Array(numberOfPages).fill(void 0);
8282
- return pages2.map(
8283
- (_, pageIndex) => convertSpinePositionToLayoutPosition({
8284
- pageSize: this.context.getPageSize(),
8285
- position: getSpinePositionFromSpineItemPosition({
8286
- itemLayout,
8287
- spineItemPosition: getSpineItemPositionFromPageIndex({
8288
- isUsingVerticalWriting: !!item.isUsingVerticalWriting(),
8289
- itemLayout,
8290
- pageIndex,
8291
- context
8292
- })
8293
- })
8294
- })
8295
- );
8296
- });
8297
- const pages = spineItemsPagesAbsolutePositions.reduce(
8298
- (acc, itemPages, itemIndex) => {
8299
- const itemPagesInfo = itemPages.map(
8300
- (absolutePosition, pageIndex) => ({
8301
- itemIndex,
8302
- absolutePageIndex: itemIndex + pageIndex,
8303
- absolutePosition
8304
- })
8305
- );
8306
- return [...acc, ...itemPagesInfo];
8307
- },
8308
- []
8309
- );
8310
- return {
8311
- spineItemsAbsolutePositions: [...this.spineItemsRelativeLayouts],
8312
- pages
8313
- };
8314
- }),
8315
8291
  share()
8316
8292
  );
8317
- this.info$ = this.layout$.pipe(
8318
- tap$1((layout) => {
8319
- Report.log(NAMESPACE, `layout:info`, layout);
8320
- }),
8321
- shareReplay$1({ refCount: true, bufferSize: 1 })
8322
- );
8323
- merge(this.layout$, this.info$).pipe(takeUntil(this.destroy$)).subscribe();
8293
+ merge(this.layout$).pipe(takeUntil(this.destroy$)).subscribe();
8324
8294
  }
8325
8295
  layout() {
8326
8296
  this.layoutSubject.next(void 0);
8327
8297
  }
8328
- getSpineItemRelativeLayoutInfo(spineItemOrIndex) {
8298
+ getSpineItemSpineLayoutInfo(spineItemOrIndex) {
8329
8299
  const itemIndex = this.spineItemsManager.getSpineItemIndex(spineItemOrIndex) ?? 0;
8330
- return this.spineItemsRelativeLayouts[itemIndex] || {
8300
+ return this.spineItemsRelativeLayouts[itemIndex] || new SpineItemSpineLayout({
8331
8301
  left: 0,
8332
8302
  right: 0,
8333
8303
  top: 0,
@@ -8336,7 +8306,12 @@ class SpineLayout extends DestroyableClass {
8336
8306
  height: 0,
8337
8307
  x: 0,
8338
8308
  y: 0
8339
- };
8309
+ });
8310
+ }
8311
+ get numberOfPages() {
8312
+ return this.spineItemsManager.items.reduce((acc, item) => {
8313
+ return acc + item.numberOfPages;
8314
+ }, 0);
8340
8315
  }
8341
8316
  destroy() {
8342
8317
  super.destroy();
@@ -8607,6 +8582,15 @@ class SpineItem extends DestroyableClass {
8607
8582
  get renditionLayout() {
8608
8583
  return this.renderer.renditionLayout;
8609
8584
  }
8585
+ get numberOfPages() {
8586
+ return getSpineItemNumberOfPages({
8587
+ isUsingVerticalWriting: !!this.isUsingVerticalWriting(),
8588
+ itemHeight: this.layout.layoutInfo.height,
8589
+ itemWidth: this.layout.layoutInfo.width,
8590
+ context: this.context,
8591
+ settings: this.settings
8592
+ });
8593
+ }
8610
8594
  }
8611
8595
  const createContainerElement = (containerElement, item, hookManager) => {
8612
8596
  const element = containerElement.ownerDocument.createElement(`div`);
@@ -8922,8 +8906,6 @@ const createReader = (inputSettings) => {
8922
8906
  },
8923
8907
  settings: settingsManager,
8924
8908
  element$,
8925
- layout$: spine.spineLayout.layout$,
8926
- layoutInfo$: spine.spineLayout.info$,
8927
8909
  viewportState$: context.bridgeEvent.viewportState$,
8928
8910
  viewportFree$: context.bridgeEvent.viewportFree$,
8929
8911
  /**
@@ -8960,14 +8942,14 @@ const createReaderWithEnhancers = (
8960
8942
  accessibilityEnhancer(
8961
8943
  resourcesEnhancer(
8962
8944
  utilsEnhancer(
8963
- layoutEnhancer(
8964
- zoomEnhancer(
8965
- navigationEnhancer(
8966
- htmlEnhancer(
8967
- mediaEnhancer(
8968
- chromeEnhancer(
8969
- themeEnhancer(
8970
- paginationEnhancer(
8945
+ zoomEnhancer(
8946
+ navigationEnhancer(
8947
+ htmlEnhancer(
8948
+ mediaEnhancer(
8949
+ chromeEnhancer(
8950
+ themeEnhancer(
8951
+ paginationEnhancer(
8952
+ layoutEnhancer(
8971
8953
  eventsEnhancer(
8972
8954
  // __
8973
8955
  createReader