@prose-reader/core 1.69.0 → 1.71.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.
@@ -63,7 +63,7 @@ export declare const createReaderWithEnhancers: (options: Partial<import('./sett
63
63
  getNavigationForSpineIndexOrId: (indexOrId: number | string | import('./spineItem/createSpineItem').SpineItem) => import('./navigation/viewport/ViewportNavigator').ViewportPosition;
64
64
  getNavigationForPosition: (viewportPosition: import('./navigation/viewport/ViewportNavigator').ViewportPosition) => import('./navigation/viewport/ViewportNavigator').ViewportPosition;
65
65
  getMostPredominantNavigationForPosition: (viewportPosition: import('./navigation/viewport/ViewportNavigator').ViewportPosition) => import('./navigation/viewport/ViewportNavigator').ViewportPosition;
66
- wrapPositionWithSafeEdge: (position: import('./navigation/viewport/ViewportNavigator').ViewportPosition) => {
66
+ getAdjustedPositionWithSafeEdge: (position: import('./navigation/viewport/ViewportNavigator').ViewportPosition) => {
67
67
  x: number;
68
68
  y: number;
69
69
  };
@@ -2,6 +2,8 @@ import { Reader } from '../../reader';
2
2
 
3
3
  export type State = ReturnType<typeof observeState>;
4
4
  export declare const observeState: (reader: Reader) => import('rxjs').Observable<{
5
+ canTurnLeft: boolean;
6
+ canTurnRight: boolean;
5
7
  canGoTopSpineItem: boolean;
6
8
  canGoBottomSpineItem: boolean;
7
9
  canGoLeftSpineItem: boolean;
package/dist/index.js CHANGED
@@ -704,7 +704,7 @@ const getNavigationForRightSinglePage = ({
704
704
  spineItemPosition
705
705
  );
706
706
  if (!isNewNavigationInCurrentItem) {
707
- return navigationResolver.wrapPositionWithSafeEdge(
707
+ return navigationResolver.getAdjustedPositionWithSafeEdge(
708
708
  pageTurnDirection === `horizontal` ? { x: position.x + context.getPageSize().width, y: 0 } : { y: position.y + context.getPageSize().height, x: 0 }
709
709
  );
710
710
  } else {
@@ -738,7 +738,7 @@ const getNavigationForRightPage = ({
738
738
  if (context.state.isUsingSpreadMode) {
739
739
  if ((spineItem == null ? void 0 : spineItem.isUsingVerticalWriting()) && position.x !== navigation.x) {
740
740
  return navigationResolver.getAdjustedPositionForSpread(
741
- navigationResolver.wrapPositionWithSafeEdge(
741
+ navigationResolver.getAdjustedPositionWithSafeEdge(
742
742
  context.isRTL() ? {
743
743
  ...navigation,
744
744
  x: navigation.x - context.getPageSize().width
@@ -817,7 +817,7 @@ const getNavigationForLeftSinglePage = ({
817
817
  spineItemPosition
818
818
  );
819
819
  if (!isNewNavigationInCurrentItem) {
820
- return navigationResolver.wrapPositionWithSafeEdge(
820
+ return navigationResolver.getAdjustedPositionWithSafeEdge(
821
821
  pageTurnDirection === `horizontal` ? { x: position.x - context.getPageSize().width, y: 0 } : { y: position.y - context.getPageSize().height, x: 0 }
822
822
  );
823
823
  } else {
@@ -851,7 +851,7 @@ const getNavigationForLeftPage = ({
851
851
  if (context.state.isUsingSpreadMode) {
852
852
  if ((spineItem == null ? void 0 : spineItem.isUsingVerticalWriting()) && position.x !== navigation.x) {
853
853
  return navigationResolver.getAdjustedPositionForSpread(
854
- navigationResolver.wrapPositionWithSafeEdge(
854
+ navigationResolver.getAdjustedPositionWithSafeEdge(
855
855
  context.isRTL() ? { ...navigation, x: navigation.x + context.getPageSize().width } : {
856
856
  ...navigation,
857
857
  x: navigation.x - context.getPageSize().width
@@ -1062,19 +1062,29 @@ class PanNavigator {
1062
1062
  const observeState = (reader) => {
1063
1063
  return reader.pagination.pagination$.pipe(
1064
1064
  withLatestFrom(reader.context.manifest$, reader.settings.settings$),
1065
- map$1(([paginationInfo, manifest, { computedPageTurnDirection }]) => {
1066
- const numberOfSpineItems = (manifest == null ? void 0 : manifest.spineItems.length) ?? 0;
1067
- const isAtAbsoluteBeginning = paginationInfo.beginSpineItemIndex === 0;
1068
- const isAtAbsoluteEnd = paginationInfo.endSpineItemIndex === Math.max(numberOfSpineItems - 1, 0);
1069
- const isAtEndSpineItem = paginationInfo.endSpineItemIndex === Math.max(numberOfSpineItems - 1, 0);
1070
- const isAtBeginSpineItem = paginationInfo.beginSpineItemIndex === 0;
1071
- return {
1072
- canGoTopSpineItem: computedPageTurnDirection === "vertical" && !isAtAbsoluteBeginning,
1073
- canGoBottomSpineItem: computedPageTurnDirection === "vertical" && !isAtAbsoluteEnd,
1074
- canGoLeftSpineItem: computedPageTurnDirection !== "vertical" && ((manifest == null ? void 0 : manifest.readingDirection) === "ltr" && !isAtAbsoluteBeginning || (manifest == null ? void 0 : manifest.readingDirection) === "rtl" && !isAtEndSpineItem),
1075
- canGoRightSpineItem: computedPageTurnDirection !== "vertical" && ((manifest == null ? void 0 : manifest.readingDirection) === "ltr" && !isAtAbsoluteEnd || (manifest == null ? void 0 : manifest.readingDirection) === "rtl" && !isAtBeginSpineItem)
1076
- };
1077
- }),
1065
+ map$1(
1066
+ ([
1067
+ paginationInfo,
1068
+ { spineItems, readingDirection },
1069
+ { computedPageTurnDirection }
1070
+ ]) => {
1071
+ const numberOfSpineItems = spineItems.length ?? 0;
1072
+ const isAtAbsoluteBeginning = paginationInfo.beginSpineItemIndex === 0;
1073
+ const isAtAbsoluteEnd = paginationInfo.endSpineItemIndex === Math.max(numberOfSpineItems - 1, 0);
1074
+ const isAtEndSpineItem = paginationInfo.endSpineItemIndex === Math.max(numberOfSpineItems - 1, 0);
1075
+ const isAtBeginSpineItem = paginationInfo.beginSpineItemIndex === 0;
1076
+ const isAtBeginFirstPage = paginationInfo.beginPageIndexInSpineItem === 0;
1077
+ const isAtEndLastPage = paginationInfo.endPageIndexInSpineItem === paginationInfo.endNumberOfPagesInSpineItem - 1;
1078
+ return {
1079
+ canTurnLeft: computedPageTurnDirection === "vertical" ? false : !isAtBeginFirstPage,
1080
+ canTurnRight: computedPageTurnDirection === "vertical" ? false : !isAtEndLastPage,
1081
+ canGoTopSpineItem: computedPageTurnDirection === "vertical" && !isAtAbsoluteBeginning,
1082
+ canGoBottomSpineItem: computedPageTurnDirection === "vertical" && !isAtAbsoluteEnd,
1083
+ canGoLeftSpineItem: computedPageTurnDirection !== "vertical" && (readingDirection === "ltr" && !isAtAbsoluteBeginning || readingDirection === "rtl" && !isAtEndSpineItem),
1084
+ canGoRightSpineItem: computedPageTurnDirection !== "vertical" && (readingDirection === "ltr" && !isAtAbsoluteEnd || readingDirection === "rtl" && !isAtBeginSpineItem)
1085
+ };
1086
+ }
1087
+ ),
1078
1088
  distinctUntilChanged$1(isShallowEqual)
1079
1089
  );
1080
1090
  };
@@ -2249,12 +2259,12 @@ const getAdjustedPositionForSpread = ({
2249
2259
  const correctedX = isOffsetNotAtEdge ? x - pageSizeWidth : x;
2250
2260
  return { x: correctedX, y };
2251
2261
  };
2252
- const wrapPositionWithSafeEdge = ({
2262
+ const getAdjustedPositionWithSafeEdge = ({
2253
2263
  position,
2254
2264
  isRTL,
2255
- pageSizeWidth,
2256
2265
  pageSizeHeight,
2257
- spineItemsManager
2266
+ spineItemsManager,
2267
+ visibleAreaRectWidth
2258
2268
  }) => {
2259
2269
  const lastSpineItem = spineItemsManager.get(spineItemsManager.getLength() - 1);
2260
2270
  const distanceOfLastSpineItem = spineItemsManager.getAbsolutePositionOf(
@@ -2268,7 +2278,7 @@ const wrapPositionWithSafeEdge = ({
2268
2278
  y
2269
2279
  };
2270
2280
  }
2271
- const maximumXOffset = distanceOfLastSpineItem.right - pageSizeWidth;
2281
+ const maximumXOffset = distanceOfLastSpineItem.right - visibleAreaRectWidth;
2272
2282
  return {
2273
2283
  x: Math.min(Math.max(0, position.x), maximumXOffset),
2274
2284
  y
@@ -3399,14 +3409,14 @@ const createNavigationResolver = ({
3399
3409
  const triggerPercentage = 0.5;
3400
3410
  const triggerXPosition = pageTurnDirection === `horizontal` ? viewportPosition.x + context.state.visibleAreaRect.width * triggerPercentage : 0;
3401
3411
  const triggerYPosition = pageTurnDirection === `horizontal` ? 0 : viewportPosition.y + context.state.visibleAreaRect.height * triggerPercentage;
3402
- const midScreenPositionSafePosition = wrapPositionWithSafeEdge({
3412
+ const midScreenPositionSafePosition = getAdjustedPositionWithSafeEdge({
3403
3413
  position: {
3404
3414
  x: triggerXPosition,
3405
3415
  y: triggerYPosition
3406
3416
  },
3407
3417
  isRTL: context.isRTL(),
3408
3418
  pageSizeHeight: context.getPageSize().height,
3409
- pageSizeWidth: context.getPageSize().width,
3419
+ visibleAreaRectWidth: context.state.visibleAreaRect.width,
3410
3420
  spineItemsManager
3411
3421
  });
3412
3422
  return getNavigationForPosition({
@@ -3455,11 +3465,11 @@ const createNavigationResolver = ({
3455
3465
  spineLocator: locator
3456
3466
  }),
3457
3467
  getMostPredominantNavigationForPosition,
3458
- wrapPositionWithSafeEdge: (position) => wrapPositionWithSafeEdge({
3468
+ getAdjustedPositionWithSafeEdge: (position) => getAdjustedPositionWithSafeEdge({
3459
3469
  position,
3460
3470
  isRTL: context.isRTL(),
3461
3471
  pageSizeHeight: context.getPageSize().height,
3462
- pageSizeWidth: context.getPageSize().width,
3472
+ visibleAreaRectWidth: context.state.visibleAreaRect.width,
3463
3473
  spineItemsManager
3464
3474
  }),
3465
3475
  isNavigationGoingForwardFrom,
@@ -4148,7 +4158,7 @@ const withFallbackPosition = ({
4148
4158
  return {
4149
4159
  navigation: {
4150
4160
  ...navigation,
4151
- position: navigationResolver.wrapPositionWithSafeEdge(
4161
+ position: navigationResolver.getAdjustedPositionWithSafeEdge(
4152
4162
  navigation.position
4153
4163
  )
4154
4164
  },
@@ -4438,7 +4448,7 @@ class InternalNavigator extends DestroyableClass {
4438
4448
  map$1(
4439
4449
  () => ({
4440
4450
  ...navigation,
4441
- animation: "turn"
4451
+ animation: "snap"
4442
4452
  })
4443
4453
  ),
4444
4454
  finalize(() => {
@@ -4805,7 +4815,7 @@ class ReaderSettingsManager extends SettingsManager3 {
4805
4815
  pageTurnMode: `controlled`,
4806
4816
  snapAnimationDuration: 300,
4807
4817
  navigationSnapThreshold: 0.3,
4808
- numberOfAdjacentSpineItemToPreLoad: 0
4818
+ numberOfAdjacentSpineItemToPreLoad: 2
4809
4819
  };
4810
4820
  }
4811
4821
  }
@@ -6914,7 +6924,18 @@ class SpineItemsLoader extends DestroyableClass {
6914
6924
  const layoutHasChanged$ = spineItemsManager.layout$.pipe(
6915
6925
  filter$1((hasChanged) => hasChanged)
6916
6926
  );
6917
- const loadSpineItems$ = merge(navigationUpdate$, layoutHasChanged$).pipe(
6927
+ const numberOfAdjacentSpineItemToPreLoad$ = settings.settings$.pipe(
6928
+ map$1(
6929
+ ({ numberOfAdjacentSpineItemToPreLoad }) => numberOfAdjacentSpineItemToPreLoad
6930
+ ),
6931
+ skip$1(1),
6932
+ distinctUntilChanged$1()
6933
+ );
6934
+ const loadSpineItems$ = merge(
6935
+ navigationUpdate$,
6936
+ layoutHasChanged$,
6937
+ numberOfAdjacentSpineItemToPreLoad$
6938
+ ).pipe(
6918
6939
  // this can be changed by whatever we want and SHOULD not break navigation.
6919
6940
  // Ideally loading faster is better but loading too close to user navigating can
6920
6941
  // be dangerous.