@prose-reader/core 1.201.0 → 1.202.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 (30) hide show
  1. package/dist/createReaderWithEnhancer.d.ts +10 -10
  2. package/dist/enhancers/{layoutEnhancer → layout}/types.d.ts +1 -0
  3. package/dist/enhancers/layout/viewportMode.d.ts +3 -0
  4. package/dist/enhancers/navigation/navigators/manualNavigator.d.ts +1 -1
  5. package/dist/enhancers/pagination/enhancer.d.ts +1 -1
  6. package/dist/enhancers/pagination/pagination.d.ts +1 -1
  7. package/dist/enhancers/pagination/progression.d.ts +1 -1
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +140 -90
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.umd.cjs +142 -91
  12. package/dist/index.umd.cjs.map +1 -1
  13. package/dist/navigation/InternalNavigator.d.ts +1 -1
  14. package/dist/navigation/Navigator.d.ts +4 -2
  15. package/dist/navigation/UserScrollNavigation.d.ts +18 -0
  16. package/dist/navigation/consolidation/mapUserNavigationToInternal.d.ts +1 -1
  17. package/dist/navigation/controllers/ScrollNavigationController.d.ts +1 -0
  18. package/dist/navigation/tests/utils.d.ts +0 -11
  19. package/dist/navigation/types.d.ts +11 -0
  20. package/dist/reader.d.ts +2 -2
  21. package/dist/settings/SettingsManagerOverload.d.ts +1 -0
  22. package/dist/spine/loader/SpineItemsLoader.d.ts +2 -1
  23. package/dist/viewport/Viewport.d.ts +5 -1
  24. package/package.json +3 -3
  25. package/dist/navigation/UserNavigator.d.ts +0 -29
  26. package/dist/enhancers/{layoutEnhancer → layout}/SettingsManager.d.ts +1 -1
  27. /package/dist/enhancers/{layoutEnhancer → layout}/createMovingSafePan$.d.ts +0 -0
  28. /package/dist/enhancers/{layoutEnhancer → layout}/fixReflowable.d.ts +0 -0
  29. /package/dist/enhancers/{layoutEnhancer → layout}/layoutEnhancer.d.ts +0 -0
  30. /package/dist/enhancers/{layoutEnhancer → layout}/layoutInfo.d.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("rxjs"), require("rxjs/operators"), require("@prose-reader/shared"), require("reactjrx")) : typeof define === "function" && define.amd ? define(["exports", "rxjs", "rxjs/operators", "@prose-reader/shared", "reactjrx"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.prose = {}, global.rxjs, global.operators, global.shared, global.reactjrx));
3
- })(this, function(exports2, rxjs, operators, shared, reactjrx) {
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("rxjs"), require("rxjs/operators"), require("@prose-reader/shared")) : typeof define === "function" && define.amd ? define(["exports", "rxjs", "rxjs/operators", "@prose-reader/shared"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.prose = {}, global.rxjs, global.operators, global.shared));
3
+ })(this, function(exports2, rxjs, operators, shared) {
4
4
  "use strict";
5
5
  const getAttributeValueFromString = (string, key) => {
6
6
  const regExp = new RegExp(`${key}\\s*=\\s*([0-9.]+)`, `i`);
@@ -731,9 +731,12 @@
731
731
  ...this.outputSettings
732
732
  };
733
733
  }
734
- watch(keys) {
734
+ watch(keyOrKeys) {
735
+ if (Array.isArray(keyOrKeys)) {
736
+ return this.values$.pipe(watchKeys(keyOrKeys));
737
+ }
735
738
  return this.values$.pipe(
736
- mapKeysTo(keys),
739
+ operators.map((result) => result[keyOrKeys]),
737
740
  operators.distinctUntilChanged(shared.isShallowEqual)
738
741
  );
739
742
  }
@@ -1070,8 +1073,9 @@
1070
1073
  return rxjs.defer(() => this.onLayout(params)).pipe();
1071
1074
  }
1072
1075
  destroy() {
1073
- super.destroy();
1076
+ this.unload();
1074
1077
  this.stateSubject.complete();
1078
+ super.destroy();
1075
1079
  }
1076
1080
  get writingMode() {
1077
1081
  return void 0;
@@ -2053,6 +2057,7 @@
2053
2057
  pageHorizontalMargin,
2054
2058
  pageVerticalMargin,
2055
2059
  layoutLayerTransition,
2060
+ viewportMode,
2056
2061
  ...rest
2057
2062
  } = settings;
2058
2063
  return rest;
@@ -2062,7 +2067,8 @@
2062
2067
  layoutAutoResize: "container",
2063
2068
  pageHorizontalMargin: 24,
2064
2069
  pageVerticalMargin: 24,
2065
- layoutLayerTransition: true
2070
+ layoutLayerTransition: true,
2071
+ viewportMode: "normal"
2066
2072
  };
2067
2073
  }
2068
2074
  };
@@ -2240,6 +2246,24 @@
2240
2246
  info$.pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
2241
2247
  return { layout$, info$ };
2242
2248
  };
2249
+ const createViewportModeHandler = (reader, viewportMode$) => {
2250
+ return viewportMode$.pipe(
2251
+ rxjs.tap((viewportMode) => {
2252
+ reader.viewport.value.element.style.transition = `transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275)`;
2253
+ if (reader.settings.values.computedPageTurnMode === "scrollable") {
2254
+ reader.viewport.value.element.style.transformOrigin = `top`;
2255
+ } else {
2256
+ reader.viewport.value.element.style.transformOrigin = `center`;
2257
+ }
2258
+ if (viewportMode === `thumbnails`) {
2259
+ reader.viewport.value.element.style.transform = `scale(0.5)`;
2260
+ } else {
2261
+ reader.viewport.value.element.style.transform = `scale(1)`;
2262
+ }
2263
+ reader.layout();
2264
+ })
2265
+ );
2266
+ };
2243
2267
  const layoutEnhancer = (next) => (options) => {
2244
2268
  const {
2245
2269
  pageHorizontalMargin,
@@ -2375,11 +2399,16 @@
2375
2399
  })
2376
2400
  );
2377
2401
  const { layout$, info$ } = createLayoutInfo(reader);
2402
+ const viewportModeHandler$ = createViewportModeHandler(
2403
+ reader,
2404
+ settingsManager.watch(`viewportMode`)
2405
+ );
2378
2406
  rxjs.merge(
2379
2407
  updateSpineItemClassName$,
2380
2408
  revealItemOnReady$,
2381
2409
  movingSafePan$,
2382
- layoutOnContainerResize$
2410
+ layoutOnContainerResize$,
2411
+ viewportModeHandler$
2383
2412
  ).pipe(operators.takeUntil(reader.$.destroy$)).subscribe();
2384
2413
  return {
2385
2414
  ...reader,
@@ -2698,7 +2727,7 @@
2698
2727
  })
2699
2728
  );
2700
2729
  };
2701
- const report$4 = Report.namespace(`navigation`);
2730
+ const report$3 = Report.namespace(`navigation`);
2702
2731
  class SpineItemPosition {
2703
2732
  constructor(position) {
2704
2733
  this.__symbol = Symbol(`SpineItemPosition`);
@@ -3098,7 +3127,7 @@
3098
3127
  pageIndex,
3099
3128
  spineItemId
3100
3129
  });
3101
- report$4.debug(`.goToPageOfSpineItem()`, {
3130
+ report$3.debug(`.goToPageOfSpineItem()`, {
3102
3131
  pageIndex,
3103
3132
  spineItemId,
3104
3133
  ...rest,
@@ -3116,7 +3145,7 @@
3116
3145
  const foundInfo = this.reader.spine.locator.getSpineInfoFromAbsolutePageIndex({
3117
3146
  absolutePageIndex
3118
3147
  });
3119
- report$4.debug(`.goToAbsolutePageIndex()`, {
3148
+ report$3.debug(`.goToAbsolutePageIndex()`, {
3120
3149
  absolutePageIndex,
3121
3150
  ...rest,
3122
3151
  foundInfo
@@ -3159,7 +3188,7 @@
3159
3188
  }
3160
3189
  let navigation = this.reader.navigation.getNavigation().position;
3161
3190
  if (delta) {
3162
- const viewportScale = this.reader.viewport.absoluteViewport.width / this.reader.viewport.absoluteViewport.width;
3191
+ const viewportScale = this.reader.viewport.absoluteViewport.width / this.reader.viewport.relativeViewport.width;
3163
3192
  const correctedX = Math.floor(delta.x) - (((_b = this.lastDelta) == null ? void 0 : _b.x) || 0);
3164
3193
  const correctedY = Math.floor(delta.y) - (((_c = this.lastDelta) == null ? void 0 : _c.y) || 0);
3165
3194
  const x = Math.floor(
@@ -3285,7 +3314,7 @@
3285
3314
  }
3286
3315
  };
3287
3316
  };
3288
- const NAMESPACE$5 = `paginationEnhancer`;
3317
+ const NAMESPACE$4 = `paginationEnhancer`;
3289
3318
  const consolidate = (item, reader) => {
3290
3319
  var _a;
3291
3320
  let itemPageIndex = (_a = item.meta) == null ? void 0 : _a.itemPageIndex;
@@ -3640,7 +3669,7 @@
3640
3669
  );
3641
3670
  return { paginationInfo$, getPaginationInfo: () => currentValue.value };
3642
3671
  };
3643
- Report.namespace(NAMESPACE$5);
3672
+ Report.namespace(NAMESPACE$4);
3644
3673
  const paginationEnhancer = (next) => (options) => {
3645
3674
  const reader = next(options);
3646
3675
  const { paginationInfo$, getPaginationInfo } = trackPaginationInfo(reader);
@@ -6157,8 +6186,8 @@
6157
6186
  );
6158
6187
  })
6159
6188
  );
6160
- const NAMESPACE$4 = `navigation/InternalNavigator`;
6161
- const report$3 = Report.namespace(NAMESPACE$4);
6189
+ const NAMESPACE$3 = `navigation/InternalNavigator`;
6190
+ const report$2 = Report.namespace(NAMESPACE$3);
6162
6191
  class InternalNavigator extends DestroyableClass {
6163
6192
  constructor(settings, context, userNavigation$, viewportController, scrollNavigationController, navigationResolver, spine, isUserLocked$) {
6164
6193
  super();
@@ -6360,7 +6389,7 @@
6360
6389
  );
6361
6390
  const notifyNavigationUpdate = (stream) => stream.pipe(
6362
6391
  rxjs.tap(([currentNavigation, previousNavigation]) => {
6363
- report$3.info(
6392
+ report$2.info(
6364
6393
  `navigation updated from ${currentNavigation.meta.triggeredBy} of type ${currentNavigation.type}`,
6365
6394
  {
6366
6395
  previousNavigation,
@@ -6436,40 +6465,23 @@
6436
6465
  return scaledDownPosition;
6437
6466
  };
6438
6467
  const SCROLL_FINISHED_DEBOUNCE_TIMEOUT = 500;
6439
- const NAMESPACE$3 = `navigation/UserNavigator`;
6440
- const report$2 = Report.namespace(NAMESPACE$3);
6441
- class UserNavigator extends DestroyableClass {
6442
- constructor(settings, scrollNavigatorElement$, context, scrollHappeningFromBrowser$, spine) {
6468
+ class UserScrollNavigation extends DestroyableClass {
6469
+ constructor(settings, context, spine, scrollNavigationController, locker) {
6443
6470
  super();
6444
6471
  this.settings = settings;
6445
- this.scrollNavigatorElement$ = scrollNavigatorElement$;
6446
6472
  this.context = context;
6447
- this.scrollHappeningFromBrowser$ = scrollHappeningFromBrowser$;
6448
6473
  this.spine = spine;
6474
+ this.scrollNavigationController = scrollNavigationController;
6475
+ this.locker = locker;
6449
6476
  this.navigationSubject = new rxjs.Subject();
6450
- this.locker = new Locker();
6451
6477
  this.navigation$ = this.navigationSubject.asObservable();
6452
- const userScroll$ = scrollNavigatorElement$.pipe(
6453
- rxjs.filter(reactjrx.isDefined),
6454
- rxjs.switchMap(
6455
- (element) => settings.watch(["computedPageTurnMode"]).pipe(
6456
- rxjs.switchMap(
6457
- ({ computedPageTurnMode }) => computedPageTurnMode === "controlled" ? rxjs.NEVER : rxjs.fromEvent(element, `scroll`).pipe(
6458
- rxjs.withLatestFrom(scrollHappeningFromBrowser$),
6459
- rxjs.filter(
6460
- ([, shouldAvoidScrollEvent]) => !shouldAvoidScrollEvent
6461
- ),
6462
- rxjs.map(([event]) => event)
6463
- )
6464
- )
6465
- )
6466
- ),
6467
- rxjs.share()
6468
- );
6469
- const navigateOnScroll$ = userScroll$.pipe(
6478
+ const navigateOnScroll$ = this.scrollNavigationController.userScroll$.pipe(
6470
6479
  rxjs.exhaustMap((event) => {
6471
6480
  const unlock = this.locker.lock();
6472
- return rxjs.merge(userScroll$, rxjs.of(event)).pipe(
6481
+ return rxjs.merge(
6482
+ this.scrollNavigationController.userScroll$,
6483
+ rxjs.of(event)
6484
+ ).pipe(
6473
6485
  rxjs.debounceTime(
6474
6486
  SCROLL_FINISHED_DEBOUNCE_TIMEOUT,
6475
6487
  rxjs.animationFrameScheduler
@@ -6485,7 +6497,7 @@
6485
6497
  }),
6486
6498
  spineElement: this.spine.element
6487
6499
  });
6488
- this.navigate({
6500
+ this.navigationSubject.next({
6489
6501
  animation: false,
6490
6502
  type: "scroll",
6491
6503
  position: scaledDownPosition
@@ -6499,15 +6511,6 @@
6499
6511
  );
6500
6512
  rxjs.merge(navigateOnScroll$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
6501
6513
  }
6502
- /**
6503
- * Remember that this navigation is not trustable.
6504
- *
6505
- * It needs to be verified and adjusted if necessary before becoming internal.
6506
- */
6507
- navigate(to) {
6508
- report$2.info(`.navigate`, to);
6509
- this.navigationSubject.next(to);
6510
- }
6511
6514
  }
6512
6515
  const spinePositionToTranslation = (position) => {
6513
6516
  return {
@@ -6772,6 +6775,46 @@
6772
6775
  rxjs.switchMap(() => rxjs.merge(rxjs.of(true), rxjs.of(false))),
6773
6776
  rxjs.shareReplay(1)
6774
6777
  );
6778
+ const isSpineScrolling$ = rxjs.merge(
6779
+ spine.element$.pipe(rxjs.switchMap((element) => observeResize(element))),
6780
+ spine.element$.pipe(rxjs.switchMap((element) => rxjs.fromEvent(element, "scroll"))),
6781
+ spine.spineItemsObserver.itemResize$
6782
+ ).pipe(
6783
+ rxjs.switchMap(
6784
+ () => rxjs.timer(10).pipe(
6785
+ rxjs.map(() => false),
6786
+ rxjs.startWith(true)
6787
+ )
6788
+ ),
6789
+ rxjs.distinctUntilChanged(),
6790
+ rxjs.startWith(false)
6791
+ );
6792
+ const scrollHappeningFromBrowser$ = rxjs.combineLatest([
6793
+ isSpineScrolling$,
6794
+ this.isScrolling$
6795
+ ]).pipe(
6796
+ rxjs.map(
6797
+ ([spineScrolling, viewportScrolling]) => spineScrolling || viewportScrolling
6798
+ ),
6799
+ rxjs.shareReplay(1)
6800
+ );
6801
+ this.userScroll$ = this.watch("element").pipe(
6802
+ rxjs.filter(isDefined),
6803
+ rxjs.switchMap(
6804
+ (element) => settings.watch(["computedPageTurnMode"]).pipe(
6805
+ rxjs.switchMap(
6806
+ ({ computedPageTurnMode }) => computedPageTurnMode === "controlled" ? rxjs.NEVER : rxjs.fromEvent(element, `scroll`).pipe(
6807
+ rxjs.withLatestFrom(scrollHappeningFromBrowser$),
6808
+ rxjs.filter(
6809
+ ([, shouldAvoidScrollEvent]) => !shouldAvoidScrollEvent
6810
+ ),
6811
+ rxjs.map(([event]) => event)
6812
+ )
6813
+ )
6814
+ )
6815
+ ),
6816
+ rxjs.share()
6817
+ );
6775
6818
  rxjs.merge(elementCreation$, toggleElementDisplay$, navigate$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
6776
6819
  }
6777
6820
  navigate(navigation) {
@@ -7415,6 +7458,8 @@
7415
7458
  settings,
7416
7459
  viewport
7417
7460
  }) => {
7461
+ const userExplicitNavigationSubject = new rxjs.Subject();
7462
+ const locker = new Locker();
7418
7463
  const navigationResolver = createNavigationResolver({
7419
7464
  context,
7420
7465
  settings,
@@ -7436,58 +7481,42 @@
7436
7481
  spine,
7437
7482
  context
7438
7483
  );
7439
- const isSpineScrolling$ = rxjs.merge(
7440
- spine.element$.pipe(operators.switchMap((element) => observeResize(element))),
7441
- spine.element$.pipe(operators.switchMap((element) => rxjs.fromEvent(element, "scroll"))),
7442
- spine.spineItemsObserver.itemResize$
7443
- ).pipe(
7444
- operators.switchMap(
7445
- () => rxjs.timer(10).pipe(
7446
- operators.map(() => false),
7447
- operators.startWith(true)
7448
- )
7449
- ),
7450
- operators.distinctUntilChanged(),
7451
- operators.startWith(false)
7452
- );
7453
- const scrollHappeningFromBrowser$ = rxjs.combineLatest([
7454
- isSpineScrolling$,
7455
- scrollNavigationController.isScrolling$
7456
- ]).pipe(
7457
- operators.map(
7458
- ([spineScrolling, viewportScrolling]) => spineScrolling || viewportScrolling
7459
- ),
7460
- operators.shareReplay(1)
7461
- );
7462
- const userNavigator = new UserNavigator(
7484
+ const userScrollNavigation = new UserScrollNavigation(
7463
7485
  settings,
7464
- scrollNavigationController.watch("element"),
7465
7486
  context,
7466
- scrollHappeningFromBrowser$,
7467
- spine
7487
+ spine,
7488
+ scrollNavigationController,
7489
+ locker
7490
+ );
7491
+ const userNavigation$ = rxjs.merge(
7492
+ userExplicitNavigationSubject,
7493
+ userScrollNavigation.navigation$
7468
7494
  );
7469
7495
  const internalNavigator = new InternalNavigator(
7470
7496
  settings,
7471
7497
  context,
7472
- userNavigator.navigation$,
7498
+ userNavigation$,
7473
7499
  controlledNavigationController,
7474
7500
  scrollNavigationController,
7475
7501
  navigationResolver,
7476
7502
  spine,
7477
- userNavigator.locker.isLocked$
7503
+ locker.isLocked$
7478
7504
  );
7479
7505
  const viewportState$ = rxjs.combineLatest([
7480
7506
  controlledNavigationController.isNavigating$,
7481
7507
  scrollNavigationController.isNavigating$,
7482
- userNavigator.locker.isLocked$,
7508
+ locker.isLocked$,
7483
7509
  internalNavigator.locker.isLocked$
7484
7510
  ]).pipe(
7485
7511
  operators.map((states) => states.some((isLocked) => isLocked) ? `busy` : `free`),
7486
7512
  operators.distinctUntilChanged(),
7487
7513
  operators.shareReplay(1)
7488
7514
  );
7515
+ const navigate = (to) => {
7516
+ userExplicitNavigationSubject.next(to);
7517
+ };
7489
7518
  const destroy = () => {
7490
- userNavigator.destroy();
7519
+ userScrollNavigation.destroy();
7491
7520
  controlledNavigationController.destroy();
7492
7521
  internalNavigator.destroy();
7493
7522
  };
@@ -7497,11 +7526,11 @@
7497
7526
  internalNavigator,
7498
7527
  scrollNavigationController,
7499
7528
  controlledNavigationController,
7500
- isLocked$: userNavigator.locker.isLocked$,
7529
+ locker,
7501
7530
  viewportState$,
7502
- navigate: userNavigator.navigate.bind(userNavigator),
7531
+ navigate,
7503
7532
  lock() {
7504
- return userNavigator.locker.lock();
7533
+ return locker.lock();
7505
7534
  },
7506
7535
  navigationResolver,
7507
7536
  navigation$: internalNavigator.navigation$
@@ -8368,11 +8397,16 @@
8368
8397
  loadSpineItems$.pipe(rxjs.takeUntil(this.destroy$)).subscribe();
8369
8398
  }
8370
8399
  forceOpen(spineItems) {
8371
- this.forcedOpenSubject.next([...this.forcedOpenSubject.value, spineItems]);
8400
+ const indexes = spineItems.map(
8401
+ (item) => typeof item === "number" ? item : item.index
8402
+ );
8403
+ this.forcedOpenSubject.next([...this.forcedOpenSubject.value, indexes]);
8372
8404
  return () => {
8373
8405
  if (this.isDestroyed) return;
8374
8406
  this.forcedOpenSubject.next(
8375
- this.forcedOpenSubject.value.filter((item) => item !== spineItems)
8407
+ this.forcedOpenSubject.value.filter(
8408
+ (arrayOfIndexes) => arrayOfIndexes !== indexes
8409
+ )
8376
8410
  );
8377
8411
  };
8378
8412
  }
@@ -8954,11 +8988,23 @@
8954
8988
  `;
8955
8989
  element.className = `${HTML_PREFIX$1}-viewport`;
8956
8990
  super({
8957
- element
8991
+ element,
8992
+ pageSize: {
8993
+ width: 1,
8994
+ height: 1
8995
+ }
8958
8996
  });
8959
8997
  this.context = context;
8998
+ const updatePageSize$ = this.context.watch("visibleAreaRect").pipe(
8999
+ rxjs.tap(() => {
9000
+ this.update({
9001
+ pageSize: this.calculatePageSize()
9002
+ });
9003
+ })
9004
+ );
9005
+ rxjs.merge(updatePageSize$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
8960
9006
  }
8961
- getPageSize() {
9007
+ calculatePageSize() {
8962
9008
  const absoluteViewport = this.absoluteViewport;
8963
9009
  const { isUsingSpreadMode: isUsingSpreadMode2 } = this.context.state;
8964
9010
  return {
@@ -8977,6 +9023,9 @@
8977
9023
  * @important
8978
9024
  *
8979
9025
  * Contains long floating values.
9026
+ *
9027
+ * @todo take position of translate into consideration in something
9028
+ * like relativeViewportPosition or even better a ViewportSlicePosition
8980
9029
  */
8981
9030
  get relativeViewport() {
8982
9031
  const absoluteViewport = this.absoluteViewport;
@@ -9037,7 +9086,9 @@
9037
9086
  );
9038
9087
  navigator2.viewportState$.subscribe(context.bridgeEvent.viewportStateSubject);
9039
9088
  navigator2.navigation$.subscribe(context.bridgeEvent.navigationSubject);
9040
- navigator2.isLocked$.subscribe(context.bridgeEvent.navigationIsLockedSubject);
9089
+ navigator2.locker.isLocked$.subscribe(
9090
+ context.bridgeEvent.navigationIsLockedSubject
9091
+ );
9041
9092
  pagination.state$.subscribe(context.bridgeEvent.paginationSubject);
9042
9093
  const layout = () => {
9043
9094
  var _a;