@prose-reader/core 1.168.0 → 1.169.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.
@@ -1,4 +1,4 @@
1
- export declare const translateFramePositionIntoPage: ({ position, frameElement, pageWidth, pageHeight, }: {
1
+ export declare const translateFramePositionIntoPage: ({ position, frameElement, }: {
2
2
  position: {
3
3
  clientX: number;
4
4
  clientY: number;
@@ -1,7 +1,7 @@
1
1
  import { DocumentRenderer } from '../../../spineItem/renderer/DocumentRenderer';
2
2
  export declare class HtmlRenderer extends DocumentRenderer {
3
3
  latestContentHeightWhenLoaded: number | undefined;
4
- onCreateDocument(): import('rxjs').Observable<never>;
4
+ onCreateDocument(): import('rxjs').Observable<HTMLIFrameElement>;
5
5
  onLoadDocument(): import('rxjs').Observable<HTMLIFrameElement>;
6
6
  onUnload(): import('rxjs').Observable<never>;
7
7
  onLayout({ minPageSpread, blankPagePosition, spreadPosition, }: {
@@ -1,7 +1,7 @@
1
1
  import { DocumentRenderer } from '../../spineItem/renderer/DocumentRenderer';
2
2
  export declare class ImageRenderer extends DocumentRenderer {
3
3
  private getImageElement;
4
- onCreateDocument(): import('rxjs').Observable<string>;
4
+ onCreateDocument(): import('rxjs').Observable<HTMLImageElement>;
5
5
  onLoadDocument(): import('rxjs').Observable<Event>;
6
6
  onUnload(): import('rxjs').Observable<never>;
7
7
  onLayout({ spreadPosition, }: {
@@ -9,9 +9,7 @@ export type CoreHook = {
9
9
  name: `item.onDocumentCreated`;
10
10
  runFn: (params: {
11
11
  itemId: string;
12
- layers: {
13
- element: HTMLElement;
14
- }[];
12
+ documentContainer: HTMLElement;
15
13
  }) => Observable<void> | void;
16
14
  } | {
17
15
  name: `item.onDocumentLoad`;
@@ -19,9 +17,7 @@ export type CoreHook = {
19
17
  destroy$: Observable<void>;
20
18
  destroy: (fn: UserDestroyFn) => void;
21
19
  itemId: string;
22
- layers: {
23
- element: HTMLElement;
24
- }[];
20
+ documentContainer: HTMLElement;
25
21
  }) => Observable<void> | void;
26
22
  } | {
27
23
  name: "item.onBeforeLayout";
package/dist/index.js CHANGED
@@ -568,28 +568,29 @@ const layoutEnhancer = (next) => (options) => {
568
568
  }
569
569
  });
570
570
  fixReflowable(reader);
571
- reader.hookManager.register(`item.onDocumentCreated`, ({ layers }) => {
572
- layers.forEach(({ element }) => {
573
- element.style.opacity = `0`;
571
+ reader.hookManager.register(
572
+ `item.onDocumentCreated`,
573
+ ({ documentContainer }) => {
574
+ documentContainer.style.opacity = `0`;
574
575
  if (settingsManager.values.layoutLayerTransition) {
575
- element.style.transition = `opacity 300ms`;
576
+ documentContainer.style.transition = `opacity 300ms`;
576
577
  }
577
- });
578
- });
578
+ }
579
+ );
579
580
  reader.hookManager.register(`item.onBeforeLayout`, ({ item }) => {
580
581
  const spineItem = reader.spineItemsManager.get(item.id);
581
- spineItem == null ? void 0 : spineItem.renderer.layers.forEach(({ element }) => {
582
- if (reader.settings.values.computedPageTurnMode !== `scrollable`) {
583
- element.setAttribute(`tab-index`, `0`);
584
- }
585
- });
582
+ const element = spineItem == null ? void 0 : spineItem.renderer.documentContainer;
583
+ if (reader.settings.values.computedPageTurnMode !== `scrollable`) {
584
+ element == null ? void 0 : element.setAttribute(`tab-index`, `0`);
585
+ }
586
586
  });
587
587
  const revealItemOnReady$ = reader.spineItemsObserver.itemIsReady$.pipe(
588
588
  filter(({ isReady }) => isReady),
589
589
  tap(({ item }) => {
590
- item.renderer.layers.forEach(({ element }) => {
590
+ const element = item.renderer.documentContainer;
591
+ if (element) {
591
592
  element.style.opacity = `1`;
592
- });
593
+ }
593
594
  })
594
595
  );
595
596
  const observeContainerResize = (container) => new Observable((observer) => {
@@ -5435,7 +5436,6 @@ class DocumentRenderer extends DestroyableClass {
5435
5436
  map$1(() => void 0),
5436
5437
  share()
5437
5438
  );
5438
- this.layers = [];
5439
5439
  this.context = params.context;
5440
5440
  this.settings = params.settings;
5441
5441
  this.hookManager = params.hookManager;
@@ -5453,33 +5453,29 @@ class DocumentRenderer extends DestroyableClass {
5453
5453
  this.load$.pipe(
5454
5454
  switchMap$1(() => {
5455
5455
  this.stateSubject.next(`loading`);
5456
- const createDocument$ = this.onCreateDocument().pipe(
5457
- endWith(null),
5458
- first$1()
5459
- );
5456
+ const createDocument$ = this.onCreateDocument().pipe(first$1());
5460
5457
  return createDocument$.pipe(
5461
- tap$1(() => {
5458
+ mergeMap((documentContainer) => {
5462
5459
  this.hookManager.execute(`item.onDocumentCreated`, this.item.id, {
5463
5460
  itemId: this.item.id,
5464
- layers: this.layers
5461
+ documentContainer
5465
5462
  });
5466
- }),
5467
- switchMap$1(() => {
5468
5463
  const loadDocument$ = this.onLoadDocument().pipe(
5469
5464
  endWith(null),
5470
5465
  first$1()
5471
5466
  );
5472
- return loadDocument$;
5473
- }),
5474
- waitForSwitch(this.context.bridgeEvent.viewportFree$),
5475
- switchMap$1(() => {
5476
- const hookResults = this.hookManager.execute(`item.onDocumentLoad`, this.item.id, {
5477
- itemId: this.item.id,
5478
- layers: this.layers
5479
- }).filter(
5480
- (result) => result instanceof Observable
5467
+ return loadDocument$.pipe(
5468
+ waitForSwitch(this.context.bridgeEvent.viewportFree$),
5469
+ switchMap$1(() => {
5470
+ const hookResults = this.hookManager.execute(`item.onDocumentLoad`, this.item.id, {
5471
+ itemId: this.item.id,
5472
+ documentContainer
5473
+ }).filter(
5474
+ (result) => result instanceof Observable
5475
+ );
5476
+ return combineLatest([of(null), ...hookResults]).pipe(first$1());
5477
+ })
5481
5478
  );
5482
- return combineLatest([of(null), ...hookResults]).pipe(first$1());
5483
5479
  }),
5484
5480
  tap$1(() => {
5485
5481
  this.stateSubject.next(`loaded`);
@@ -5509,6 +5505,16 @@ class DocumentRenderer extends DestroyableClass {
5509
5505
  );
5510
5506
  merge(unload$).pipe(takeUntil(this.destroy$)).subscribe();
5511
5507
  }
5508
+ attach() {
5509
+ if (this.documentContainer) {
5510
+ this.containerElement.appendChild(this.documentContainer);
5511
+ }
5512
+ }
5513
+ detach() {
5514
+ var _a;
5515
+ (_a = this.documentContainer) == null ? void 0 : _a.remove();
5516
+ this.documentContainer = void 0;
5517
+ }
5512
5518
  get state$() {
5513
5519
  return this.stateSubject;
5514
5520
  }
@@ -5614,7 +5620,7 @@ class DefaultRenderer extends DocumentRenderer {
5614
5620
  return EMPTY;
5615
5621
  }
5616
5622
  onCreateDocument() {
5617
- return EMPTY;
5623
+ return of(document.createElement("div"));
5618
5624
  }
5619
5625
  onLoadDocument() {
5620
5626
  return EMPTY;
@@ -6405,20 +6411,20 @@ const layoutItem = ({
6405
6411
  }) => {
6406
6412
  let minimumWidth = context.getPageSize().width;
6407
6413
  let blankPagePosition = `none`;
6408
- const itemStartOnNewScreen = horizontalOffset % context.state.visibleAreaRect.width === 0;
6414
+ const isScreenStartItem = horizontalOffset % context.state.visibleAreaRect.width === 0;
6409
6415
  const isLastItem = index === spineItemsManager.items.length - 1;
6410
6416
  if (context.state.isUsingSpreadMode) {
6411
6417
  if (!isGloballyPrePaginated && item.renditionLayout === `reflowable` && !isLastItem) {
6412
6418
  minimumWidth = context.getPageSize().width * 2;
6413
6419
  }
6414
- if (!isGloballyPrePaginated && item.renditionLayout === `reflowable` && isLastItem && itemStartOnNewScreen) {
6420
+ if (!isGloballyPrePaginated && item.renditionLayout === `reflowable` && isLastItem && isScreenStartItem) {
6415
6421
  minimumWidth = context.getPageSize().width * 2;
6416
6422
  }
6417
- const lastItemStartOnNewScreenInAPrepaginatedBook = itemStartOnNewScreen && isLastItem && isGloballyPrePaginated;
6418
- if (item.item.pageSpreadRight && itemStartOnNewScreen && !context.isRTL()) {
6423
+ const lastItemStartOnNewScreenInAPrepaginatedBook = isScreenStartItem && isLastItem && isGloballyPrePaginated;
6424
+ if (item.item.pageSpreadRight && isScreenStartItem && !context.isRTL()) {
6419
6425
  blankPagePosition = `before`;
6420
6426
  minimumWidth = context.getPageSize().width * 2;
6421
- } else if (item.item.pageSpreadLeft && itemStartOnNewScreen && context.isRTL()) {
6427
+ } else if (item.item.pageSpreadLeft && isScreenStartItem && context.isRTL()) {
6422
6428
  blankPagePosition = `before`;
6423
6429
  minimumWidth = context.getPageSize().width * 2;
6424
6430
  } else if (lastItemStartOnNewScreenInAPrepaginatedBook) {
@@ -6433,13 +6439,13 @@ const layoutItem = ({
6433
6439
  const itemLayout$ = item.layout({
6434
6440
  minimumWidth,
6435
6441
  blankPagePosition,
6436
- spreadPosition: context.state.isUsingSpreadMode ? itemStartOnNewScreen ? context.isRTL() ? `right` : `left` : context.isRTL() ? `left` : `right` : `none`
6442
+ spreadPosition: context.state.isUsingSpreadMode ? isScreenStartItem ? context.isRTL() ? `right` : `left` : context.isRTL() ? `left` : `right` : `none`
6437
6443
  });
6438
6444
  return itemLayout$.pipe(
6439
6445
  map$1(({ width, height }) => {
6440
6446
  if (settings.values.computedPageTurnDirection === `vertical`) {
6441
- const currentValidEdgeYForVerticalPositioning = itemStartOnNewScreen ? verticalOffset : verticalOffset - context.state.visibleAreaRect.height;
6442
- const currentValidEdgeXForVerticalPositioning = itemStartOnNewScreen ? 0 : horizontalOffset;
6447
+ const currentValidEdgeYForVerticalPositioning = isScreenStartItem ? verticalOffset : verticalOffset - context.state.visibleAreaRect.height;
6448
+ const currentValidEdgeXForVerticalPositioning = isScreenStartItem ? 0 : horizontalOffset;
6443
6449
  if (context.isRTL()) {
6444
6450
  item.adjustPositionOfElement({
6445
6451
  top: currentValidEdgeYForVerticalPositioning,
@@ -7162,16 +7168,15 @@ const resourcesEnhancer = (next) => (options) => {
7162
7168
  };
7163
7169
  class ImageRenderer extends DocumentRenderer {
7164
7170
  getImageElement() {
7165
- var _a;
7166
- const element = (_a = this.layers[0]) == null ? void 0 : _a.element;
7171
+ const element = this.documentContainer;
7167
7172
  if (!(element instanceof HTMLImageElement)) return void 0;
7168
7173
  return element;
7169
7174
  }
7170
7175
  onCreateDocument() {
7176
+ const imgElement = this.containerElement.ownerDocument.createElement(`img`);
7171
7177
  return from(this.resourcesHandler.getResource()).pipe(
7172
7178
  switchMap$1((responseOrUrl) => {
7173
- const imgElement = this.containerElement.ownerDocument.createElement(`img`);
7174
- this.layers = [{ element: imgElement }];
7179
+ this.documentContainer = imgElement;
7175
7180
  imgElement.style.objectFit = `contain`;
7176
7181
  imgElement.style.userSelect = `none`;
7177
7182
  if (responseOrUrl instanceof URL) {
@@ -7186,18 +7191,19 @@ class ImageRenderer extends DocumentRenderer {
7186
7191
  }
7187
7192
  throw new Error(`Invalid resource`);
7188
7193
  }),
7189
- tap$1((src) => {
7194
+ map$1((src) => {
7190
7195
  const element = this.getImageElement();
7191
7196
  if (element) {
7192
7197
  element.src = src;
7193
7198
  }
7199
+ return imgElement;
7194
7200
  })
7195
7201
  );
7196
7202
  }
7197
7203
  onLoadDocument() {
7198
7204
  const imageElement = this.getImageElement();
7199
7205
  if (!imageElement) throw new Error(`invalid element`);
7200
- this.containerElement.appendChild(imageElement);
7206
+ this.attach();
7201
7207
  return fromEvent(imageElement, `load`);
7202
7208
  }
7203
7209
  onUnload() {
@@ -7205,10 +7211,7 @@ class ImageRenderer extends DocumentRenderer {
7205
7211
  if (imageElement) {
7206
7212
  URL.revokeObjectURL(imageElement.src);
7207
7213
  }
7208
- this.layers.forEach(({ element }) => {
7209
- element.remove();
7210
- });
7211
- this.layers = [];
7214
+ this.detach();
7212
7215
  return EMPTY;
7213
7216
  }
7214
7217
  onLayout({
@@ -7575,22 +7578,14 @@ const loadingEnhancer = (next) => (options) => {
7575
7578
  };
7576
7579
  const translateFramePositionIntoPage = ({
7577
7580
  position,
7578
- frameElement,
7579
- pageWidth,
7580
- pageHeight
7581
+ frameElement
7581
7582
  }) => {
7582
- const {
7583
- height: viewportHeight = pageHeight,
7584
- width: viewportWidth = pageWidth
7585
- } = getFrameViewportInfo(frameElement);
7586
- const computedWidthScale = pageWidth / viewportWidth;
7587
- const computedScale = Math.min(
7588
- computedWidthScale,
7589
- pageHeight / viewportHeight
7590
- );
7591
- const { left = 0, top = 0 } = (frameElement == null ? void 0 : frameElement.getBoundingClientRect()) || {};
7592
- const adjustedX = position.clientX * computedScale + left;
7593
- const adjustedY = position.clientY * computedScale + top;
7583
+ const frameRect = frameElement.getBoundingClientRect();
7584
+ const scaleX = frameRect.width / frameElement.offsetWidth;
7585
+ const scaleY = frameRect.height / frameElement.offsetHeight;
7586
+ const { left = 0, top = 0 } = frameRect;
7587
+ const adjustedX = position.clientX * scaleX + left;
7588
+ const adjustedY = position.clientY * scaleY + top;
7594
7589
  return {
7595
7590
  clientX: adjustedX,
7596
7591
  clientY: adjustedY
@@ -8423,12 +8418,8 @@ class HtmlRenderer extends DocumentRenderer {
8423
8418
  }
8424
8419
  onCreateDocument() {
8425
8420
  const frameElement = createFrameElement();
8426
- this.layers = [
8427
- {
8428
- element: frameElement
8429
- }
8430
- ];
8431
- return EMPTY;
8421
+ this.documentContainer = frameElement;
8422
+ return of(frameElement);
8432
8423
  }
8433
8424
  onLoadDocument() {
8434
8425
  const frameElement = this.getFrameElement();
@@ -8440,8 +8431,8 @@ class HtmlRenderer extends DocumentRenderer {
8440
8431
  settings: this.settings
8441
8432
  }),
8442
8433
  waitForSwitch(this.context.bridgeEvent.viewportFree$),
8443
- tap$1((frameElement2) => {
8444
- this.containerElement.appendChild(frameElement2);
8434
+ tap$1(() => {
8435
+ this.attach();
8445
8436
  }),
8446
8437
  waitForFrameLoad,
8447
8438
  loadAssets({
@@ -8454,8 +8445,7 @@ class HtmlRenderer extends DocumentRenderer {
8454
8445
  }
8455
8446
  onUnload() {
8456
8447
  unloadMedias(this.getFrameElement());
8457
- this.layers.forEach((layer) => layer.element.remove());
8458
- this.layers = [];
8448
+ this.detach();
8459
8449
  return EMPTY;
8460
8450
  }
8461
8451
  onLayout({
@@ -8526,8 +8516,7 @@ class HtmlRenderer extends DocumentRenderer {
8526
8516
  );
8527
8517
  }
8528
8518
  getFrameElement() {
8529
- var _a;
8530
- const frame = (_a = this.layers[0]) == null ? void 0 : _a.element;
8519
+ const frame = this.documentContainer;
8531
8520
  if (!(frame instanceof HTMLIFrameElement)) return;
8532
8521
  return frame;
8533
8522
  }