@prose-reader/core 1.201.0 → 1.203.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 (32) 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 +169 -96
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.umd.cjs +171 -97
  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/spineItem/renderer/DocumentRenderer.d.ts +4 -1
  24. package/dist/utils/rxjs.d.ts +1 -0
  25. package/dist/viewport/Viewport.d.ts +5 -1
  26. package/package.json +3 -3
  27. package/dist/navigation/UserNavigator.d.ts +0 -29
  28. package/dist/enhancers/{layoutEnhancer → layout}/SettingsManager.d.ts +1 -1
  29. /package/dist/enhancers/{layoutEnhancer → layout}/createMovingSafePan$.d.ts +0 -0
  30. /package/dist/enhancers/{layoutEnhancer → layout}/fixReflowable.d.ts +0 -0
  31. /package/dist/enhancers/{layoutEnhancer → layout}/layoutEnhancer.d.ts +0 -0
  32. /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`);
@@ -677,6 +677,17 @@
677
677
  return () => observer.disconnect();
678
678
  });
679
679
  };
680
+ function observeIntersection(element, options) {
681
+ return new rxjs.Observable((observer) => {
682
+ const intersectionObserver = new IntersectionObserver((entries) => {
683
+ observer.next(entries);
684
+ }, options);
685
+ intersectionObserver.observe(element);
686
+ return () => {
687
+ intersectionObserver.disconnect();
688
+ };
689
+ });
690
+ }
680
691
  class SettingsManagerOverload {
681
692
  constructor(initialSettings, settingsManager) {
682
693
  this.settingsManager = settingsManager;
@@ -731,9 +742,12 @@
731
742
  ...this.outputSettings
732
743
  };
733
744
  }
734
- watch(keys) {
745
+ watch(keyOrKeys) {
746
+ if (Array.isArray(keyOrKeys)) {
747
+ return this.values$.pipe(watchKeys(keyOrKeys));
748
+ }
735
749
  return this.values$.pipe(
736
- mapKeysTo(keys),
750
+ operators.map((result) => result[keyOrKeys]),
737
751
  operators.distinctUntilChanged(shared.isShallowEqual)
738
752
  );
739
753
  }
@@ -931,7 +945,7 @@
931
945
  this.destroySubject.complete();
932
946
  }
933
947
  }
934
- class DocumentRenderer extends DestroyableClass {
948
+ const _DocumentRenderer = class _DocumentRenderer extends DestroyableClass {
935
949
  constructor(params) {
936
950
  super();
937
951
  this.triggerSubject = new rxjs.Subject();
@@ -1021,6 +1035,12 @@
1021
1035
  );
1022
1036
  rxjs.merge(unload$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
1023
1037
  }
1038
+ setDocumentContainer(element) {
1039
+ this._documentContainer = element;
1040
+ this._documentContainer.classList.add(
1041
+ _DocumentRenderer.DOCUMENT_CONTAINER_CLASS_NAME
1042
+ );
1043
+ }
1024
1044
  attach() {
1025
1045
  if (this.documentContainer) {
1026
1046
  this.containerElement.appendChild(this.documentContainer);
@@ -1028,8 +1048,8 @@
1028
1048
  }
1029
1049
  detach() {
1030
1050
  var _a;
1031
- (_a = this.documentContainer) == null ? void 0 : _a.remove();
1032
- this.documentContainer = void 0;
1051
+ (_a = this._documentContainer) == null ? void 0 : _a.remove();
1052
+ this._documentContainer = void 0;
1033
1053
  }
1034
1054
  get state$() {
1035
1055
  return this.stateSubject;
@@ -1070,8 +1090,12 @@
1070
1090
  return rxjs.defer(() => this.onLayout(params)).pipe();
1071
1091
  }
1072
1092
  destroy() {
1073
- super.destroy();
1093
+ this.unload();
1074
1094
  this.stateSubject.complete();
1095
+ super.destroy();
1096
+ }
1097
+ get documentContainer() {
1098
+ return this._documentContainer;
1075
1099
  }
1076
1100
  get writingMode() {
1077
1101
  return void 0;
@@ -1090,7 +1114,9 @@
1090
1114
  }
1091
1115
  return ((_a = this.context.manifest) == null ? void 0 : _a.renditionLayout) ?? "reflowable";
1092
1116
  }
1093
- }
1117
+ };
1118
+ _DocumentRenderer.DOCUMENT_CONTAINER_CLASS_NAME = `prose-reader-document-container`;
1119
+ let DocumentRenderer = _DocumentRenderer;
1094
1120
  const defaultGetResource = (item) => new URL(item.href);
1095
1121
  class ResourceHandler {
1096
1122
  constructor(item, settings) {
@@ -1883,7 +1909,7 @@
1883
1909
  }
1884
1910
  onCreateDocument() {
1885
1911
  const frameElement = createFrameElement();
1886
- this.documentContainer = frameElement;
1912
+ this.setDocumentContainer(frameElement);
1887
1913
  return rxjs.of(frameElement);
1888
1914
  }
1889
1915
  onLoadDocument() {
@@ -2053,6 +2079,7 @@
2053
2079
  pageHorizontalMargin,
2054
2080
  pageVerticalMargin,
2055
2081
  layoutLayerTransition,
2082
+ viewportMode,
2056
2083
  ...rest
2057
2084
  } = settings;
2058
2085
  return rest;
@@ -2062,7 +2089,8 @@
2062
2089
  layoutAutoResize: "container",
2063
2090
  pageHorizontalMargin: 24,
2064
2091
  pageVerticalMargin: 24,
2065
- layoutLayerTransition: true
2092
+ layoutLayerTransition: true,
2093
+ viewportMode: "normal"
2066
2094
  };
2067
2095
  }
2068
2096
  };
@@ -2240,6 +2268,24 @@
2240
2268
  info$.pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
2241
2269
  return { layout$, info$ };
2242
2270
  };
2271
+ const createViewportModeHandler = (reader, viewportMode$) => {
2272
+ return viewportMode$.pipe(
2273
+ rxjs.tap((viewportMode) => {
2274
+ reader.viewport.value.element.style.transition = `transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275)`;
2275
+ if (reader.settings.values.computedPageTurnMode === "scrollable") {
2276
+ reader.viewport.value.element.style.transformOrigin = `top`;
2277
+ } else {
2278
+ reader.viewport.value.element.style.transformOrigin = `center`;
2279
+ }
2280
+ if (viewportMode === `thumbnails`) {
2281
+ reader.viewport.value.element.style.transform = `scale(0.5)`;
2282
+ } else {
2283
+ reader.viewport.value.element.style.transform = `scale(1)`;
2284
+ }
2285
+ reader.layout();
2286
+ })
2287
+ );
2288
+ };
2243
2289
  const layoutEnhancer = (next) => (options) => {
2244
2290
  const {
2245
2291
  pageHorizontalMargin,
@@ -2375,11 +2421,16 @@
2375
2421
  })
2376
2422
  );
2377
2423
  const { layout$, info$ } = createLayoutInfo(reader);
2424
+ const viewportModeHandler$ = createViewportModeHandler(
2425
+ reader,
2426
+ settingsManager.watch(`viewportMode`)
2427
+ );
2378
2428
  rxjs.merge(
2379
2429
  updateSpineItemClassName$,
2380
2430
  revealItemOnReady$,
2381
2431
  movingSafePan$,
2382
- layoutOnContainerResize$
2432
+ layoutOnContainerResize$,
2433
+ viewportModeHandler$
2383
2434
  ).pipe(operators.takeUntil(reader.$.destroy$)).subscribe();
2384
2435
  return {
2385
2436
  ...reader,
@@ -2525,7 +2576,7 @@
2525
2576
  const imgElement = this.containerElement.ownerDocument.createElement(`img`);
2526
2577
  return rxjs.from(this.resourcesHandler.getResource()).pipe(
2527
2578
  rxjs.switchMap((responseOrUrl) => {
2528
- this.documentContainer = imgElement;
2579
+ this.setDocumentContainer(imgElement);
2529
2580
  imgElement.style.objectFit = `contain`;
2530
2581
  imgElement.style.userSelect = `none`;
2531
2582
  if (responseOrUrl instanceof URL) {
@@ -2698,7 +2749,7 @@
2698
2749
  })
2699
2750
  );
2700
2751
  };
2701
- const report$4 = Report.namespace(`navigation`);
2752
+ const report$3 = Report.namespace(`navigation`);
2702
2753
  class SpineItemPosition {
2703
2754
  constructor(position) {
2704
2755
  this.__symbol = Symbol(`SpineItemPosition`);
@@ -3098,7 +3149,7 @@
3098
3149
  pageIndex,
3099
3150
  spineItemId
3100
3151
  });
3101
- report$4.debug(`.goToPageOfSpineItem()`, {
3152
+ report$3.debug(`.goToPageOfSpineItem()`, {
3102
3153
  pageIndex,
3103
3154
  spineItemId,
3104
3155
  ...rest,
@@ -3116,7 +3167,7 @@
3116
3167
  const foundInfo = this.reader.spine.locator.getSpineInfoFromAbsolutePageIndex({
3117
3168
  absolutePageIndex
3118
3169
  });
3119
- report$4.debug(`.goToAbsolutePageIndex()`, {
3170
+ report$3.debug(`.goToAbsolutePageIndex()`, {
3120
3171
  absolutePageIndex,
3121
3172
  ...rest,
3122
3173
  foundInfo
@@ -3159,7 +3210,7 @@
3159
3210
  }
3160
3211
  let navigation = this.reader.navigation.getNavigation().position;
3161
3212
  if (delta) {
3162
- const viewportScale = this.reader.viewport.absoluteViewport.width / this.reader.viewport.absoluteViewport.width;
3213
+ const viewportScale = this.reader.viewport.absoluteViewport.width / this.reader.viewport.relativeViewport.width;
3163
3214
  const correctedX = Math.floor(delta.x) - (((_b = this.lastDelta) == null ? void 0 : _b.x) || 0);
3164
3215
  const correctedY = Math.floor(delta.y) - (((_c = this.lastDelta) == null ? void 0 : _c.y) || 0);
3165
3216
  const x = Math.floor(
@@ -3285,7 +3336,7 @@
3285
3336
  }
3286
3337
  };
3287
3338
  };
3288
- const NAMESPACE$5 = `paginationEnhancer`;
3339
+ const NAMESPACE$4 = `paginationEnhancer`;
3289
3340
  const consolidate = (item, reader) => {
3290
3341
  var _a;
3291
3342
  let itemPageIndex = (_a = item.meta) == null ? void 0 : _a.itemPageIndex;
@@ -3640,7 +3691,7 @@
3640
3691
  );
3641
3692
  return { paginationInfo$, getPaginationInfo: () => currentValue.value };
3642
3693
  };
3643
- Report.namespace(NAMESPACE$5);
3694
+ Report.namespace(NAMESPACE$4);
3644
3695
  const paginationEnhancer = (next) => (options) => {
3645
3696
  const reader = next(options);
3646
3697
  const { paginationInfo$, getPaginationInfo } = trackPaginationInfo(reader);
@@ -6157,8 +6208,8 @@
6157
6208
  );
6158
6209
  })
6159
6210
  );
6160
- const NAMESPACE$4 = `navigation/InternalNavigator`;
6161
- const report$3 = Report.namespace(NAMESPACE$4);
6211
+ const NAMESPACE$3 = `navigation/InternalNavigator`;
6212
+ const report$2 = Report.namespace(NAMESPACE$3);
6162
6213
  class InternalNavigator extends DestroyableClass {
6163
6214
  constructor(settings, context, userNavigation$, viewportController, scrollNavigationController, navigationResolver, spine, isUserLocked$) {
6164
6215
  super();
@@ -6360,7 +6411,7 @@
6360
6411
  );
6361
6412
  const notifyNavigationUpdate = (stream) => stream.pipe(
6362
6413
  rxjs.tap(([currentNavigation, previousNavigation]) => {
6363
- report$3.info(
6414
+ report$2.info(
6364
6415
  `navigation updated from ${currentNavigation.meta.triggeredBy} of type ${currentNavigation.type}`,
6365
6416
  {
6366
6417
  previousNavigation,
@@ -6436,40 +6487,23 @@
6436
6487
  return scaledDownPosition;
6437
6488
  };
6438
6489
  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) {
6490
+ class UserScrollNavigation extends DestroyableClass {
6491
+ constructor(settings, context, spine, scrollNavigationController, locker) {
6443
6492
  super();
6444
6493
  this.settings = settings;
6445
- this.scrollNavigatorElement$ = scrollNavigatorElement$;
6446
6494
  this.context = context;
6447
- this.scrollHappeningFromBrowser$ = scrollHappeningFromBrowser$;
6448
6495
  this.spine = spine;
6496
+ this.scrollNavigationController = scrollNavigationController;
6497
+ this.locker = locker;
6449
6498
  this.navigationSubject = new rxjs.Subject();
6450
- this.locker = new Locker();
6451
6499
  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(
6500
+ const navigateOnScroll$ = this.scrollNavigationController.userScroll$.pipe(
6470
6501
  rxjs.exhaustMap((event) => {
6471
6502
  const unlock = this.locker.lock();
6472
- return rxjs.merge(userScroll$, rxjs.of(event)).pipe(
6503
+ return rxjs.merge(
6504
+ this.scrollNavigationController.userScroll$,
6505
+ rxjs.of(event)
6506
+ ).pipe(
6473
6507
  rxjs.debounceTime(
6474
6508
  SCROLL_FINISHED_DEBOUNCE_TIMEOUT,
6475
6509
  rxjs.animationFrameScheduler
@@ -6485,7 +6519,7 @@
6485
6519
  }),
6486
6520
  spineElement: this.spine.element
6487
6521
  });
6488
- this.navigate({
6522
+ this.navigationSubject.next({
6489
6523
  animation: false,
6490
6524
  type: "scroll",
6491
6525
  position: scaledDownPosition
@@ -6499,15 +6533,6 @@
6499
6533
  );
6500
6534
  rxjs.merge(navigateOnScroll$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
6501
6535
  }
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
6536
  }
6512
6537
  const spinePositionToTranslation = (position) => {
6513
6538
  return {
@@ -6772,6 +6797,46 @@
6772
6797
  rxjs.switchMap(() => rxjs.merge(rxjs.of(true), rxjs.of(false))),
6773
6798
  rxjs.shareReplay(1)
6774
6799
  );
6800
+ const isSpineScrolling$ = rxjs.merge(
6801
+ spine.element$.pipe(rxjs.switchMap((element) => observeResize(element))),
6802
+ spine.element$.pipe(rxjs.switchMap((element) => rxjs.fromEvent(element, "scroll"))),
6803
+ spine.spineItemsObserver.itemResize$
6804
+ ).pipe(
6805
+ rxjs.switchMap(
6806
+ () => rxjs.timer(10).pipe(
6807
+ rxjs.map(() => false),
6808
+ rxjs.startWith(true)
6809
+ )
6810
+ ),
6811
+ rxjs.distinctUntilChanged(),
6812
+ rxjs.startWith(false)
6813
+ );
6814
+ const scrollHappeningFromBrowser$ = rxjs.combineLatest([
6815
+ isSpineScrolling$,
6816
+ this.isScrolling$
6817
+ ]).pipe(
6818
+ rxjs.map(
6819
+ ([spineScrolling, viewportScrolling]) => spineScrolling || viewportScrolling
6820
+ ),
6821
+ rxjs.shareReplay(1)
6822
+ );
6823
+ this.userScroll$ = this.watch("element").pipe(
6824
+ rxjs.filter(isDefined),
6825
+ rxjs.switchMap(
6826
+ (element) => settings.watch(["computedPageTurnMode"]).pipe(
6827
+ rxjs.switchMap(
6828
+ ({ computedPageTurnMode }) => computedPageTurnMode === "controlled" ? rxjs.NEVER : rxjs.fromEvent(element, `scroll`).pipe(
6829
+ rxjs.withLatestFrom(scrollHappeningFromBrowser$),
6830
+ rxjs.filter(
6831
+ ([, shouldAvoidScrollEvent]) => !shouldAvoidScrollEvent
6832
+ ),
6833
+ rxjs.map(([event]) => event)
6834
+ )
6835
+ )
6836
+ )
6837
+ ),
6838
+ rxjs.share()
6839
+ );
6775
6840
  rxjs.merge(elementCreation$, toggleElementDisplay$, navigate$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
6776
6841
  }
6777
6842
  navigate(navigation) {
@@ -7415,6 +7480,8 @@
7415
7480
  settings,
7416
7481
  viewport
7417
7482
  }) => {
7483
+ const userExplicitNavigationSubject = new rxjs.Subject();
7484
+ const locker = new Locker();
7418
7485
  const navigationResolver = createNavigationResolver({
7419
7486
  context,
7420
7487
  settings,
@@ -7436,58 +7503,42 @@
7436
7503
  spine,
7437
7504
  context
7438
7505
  );
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(
7506
+ const userScrollNavigation = new UserScrollNavigation(
7463
7507
  settings,
7464
- scrollNavigationController.watch("element"),
7465
7508
  context,
7466
- scrollHappeningFromBrowser$,
7467
- spine
7509
+ spine,
7510
+ scrollNavigationController,
7511
+ locker
7512
+ );
7513
+ const userNavigation$ = rxjs.merge(
7514
+ userExplicitNavigationSubject,
7515
+ userScrollNavigation.navigation$
7468
7516
  );
7469
7517
  const internalNavigator = new InternalNavigator(
7470
7518
  settings,
7471
7519
  context,
7472
- userNavigator.navigation$,
7520
+ userNavigation$,
7473
7521
  controlledNavigationController,
7474
7522
  scrollNavigationController,
7475
7523
  navigationResolver,
7476
7524
  spine,
7477
- userNavigator.locker.isLocked$
7525
+ locker.isLocked$
7478
7526
  );
7479
7527
  const viewportState$ = rxjs.combineLatest([
7480
7528
  controlledNavigationController.isNavigating$,
7481
7529
  scrollNavigationController.isNavigating$,
7482
- userNavigator.locker.isLocked$,
7530
+ locker.isLocked$,
7483
7531
  internalNavigator.locker.isLocked$
7484
7532
  ]).pipe(
7485
7533
  operators.map((states) => states.some((isLocked) => isLocked) ? `busy` : `free`),
7486
7534
  operators.distinctUntilChanged(),
7487
7535
  operators.shareReplay(1)
7488
7536
  );
7537
+ const navigate = (to) => {
7538
+ userExplicitNavigationSubject.next(to);
7539
+ };
7489
7540
  const destroy = () => {
7490
- userNavigator.destroy();
7541
+ userScrollNavigation.destroy();
7491
7542
  controlledNavigationController.destroy();
7492
7543
  internalNavigator.destroy();
7493
7544
  };
@@ -7497,11 +7548,11 @@
7497
7548
  internalNavigator,
7498
7549
  scrollNavigationController,
7499
7550
  controlledNavigationController,
7500
- isLocked$: userNavigator.locker.isLocked$,
7551
+ locker,
7501
7552
  viewportState$,
7502
- navigate: userNavigator.navigate.bind(userNavigator),
7553
+ navigate,
7503
7554
  lock() {
7504
- return userNavigator.locker.lock();
7555
+ return locker.lock();
7505
7556
  },
7506
7557
  navigationResolver,
7507
7558
  navigation$: internalNavigator.navigation$
@@ -8368,11 +8419,16 @@
8368
8419
  loadSpineItems$.pipe(rxjs.takeUntil(this.destroy$)).subscribe();
8369
8420
  }
8370
8421
  forceOpen(spineItems) {
8371
- this.forcedOpenSubject.next([...this.forcedOpenSubject.value, spineItems]);
8422
+ const indexes = spineItems.map(
8423
+ (item) => typeof item === "number" ? item : item.index
8424
+ );
8425
+ this.forcedOpenSubject.next([...this.forcedOpenSubject.value, indexes]);
8372
8426
  return () => {
8373
8427
  if (this.isDestroyed) return;
8374
8428
  this.forcedOpenSubject.next(
8375
- this.forcedOpenSubject.value.filter((item) => item !== spineItems)
8429
+ this.forcedOpenSubject.value.filter(
8430
+ (arrayOfIndexes) => arrayOfIndexes !== indexes
8431
+ )
8376
8432
  );
8377
8433
  };
8378
8434
  }
@@ -8954,11 +9010,23 @@
8954
9010
  `;
8955
9011
  element.className = `${HTML_PREFIX$1}-viewport`;
8956
9012
  super({
8957
- element
9013
+ element,
9014
+ pageSize: {
9015
+ width: 1,
9016
+ height: 1
9017
+ }
8958
9018
  });
8959
9019
  this.context = context;
9020
+ const updatePageSize$ = this.context.watch("visibleAreaRect").pipe(
9021
+ rxjs.tap(() => {
9022
+ this.update({
9023
+ pageSize: this.calculatePageSize()
9024
+ });
9025
+ })
9026
+ );
9027
+ rxjs.merge(updatePageSize$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
8960
9028
  }
8961
- getPageSize() {
9029
+ calculatePageSize() {
8962
9030
  const absoluteViewport = this.absoluteViewport;
8963
9031
  const { isUsingSpreadMode: isUsingSpreadMode2 } = this.context.state;
8964
9032
  return {
@@ -8977,6 +9045,9 @@
8977
9045
  * @important
8978
9046
  *
8979
9047
  * Contains long floating values.
9048
+ *
9049
+ * @todo take position of translate into consideration in something
9050
+ * like relativeViewportPosition or even better a ViewportSlicePosition
8980
9051
  */
8981
9052
  get relativeViewport() {
8982
9053
  const absoluteViewport = this.absoluteViewport;
@@ -9037,7 +9108,9 @@
9037
9108
  );
9038
9109
  navigator2.viewportState$.subscribe(context.bridgeEvent.viewportStateSubject);
9039
9110
  navigator2.navigation$.subscribe(context.bridgeEvent.navigationSubject);
9040
- navigator2.isLocked$.subscribe(context.bridgeEvent.navigationIsLockedSubject);
9111
+ navigator2.locker.isLocked$.subscribe(
9112
+ context.bridgeEvent.navigationIsLockedSubject
9113
+ );
9041
9114
  pagination.state$.subscribe(context.bridgeEvent.paginationSubject);
9042
9115
  const layout = () => {
9043
9116
  var _a;
@@ -9244,6 +9317,7 @@
9244
9317
  exports2.isHtmlElement = isHtmlElement;
9245
9318
  exports2.isHtmlTagElement = isHtmlTagElement;
9246
9319
  exports2.mapKeysTo = mapKeysTo;
9320
+ exports2.observeIntersection = observeIntersection;
9247
9321
  exports2.observeMutation = observeMutation;
9248
9322
  exports2.observeResize = observeResize;
9249
9323
  exports2.removeCSS = removeCSS;