genus-pdf-viewer 0.1.12 → 0.1.13

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.
package/README.md CHANGED
@@ -70,6 +70,7 @@ import { GenusPdfViewerComponent } from '@genus/pdf-viewer';
70
70
  ```
71
71
 
72
72
  Inputs: `src`, `page`, `zoom`, `maxZoom`, `minZoom`, `fit`, `disableTextLayer`, `continuous`, `showToolbar`.
73
+ Additional network inputs: `withCredentials`, `httpHeaders`, `allowIframeFallback`.
73
74
 
74
75
  Methods (via `ViewChild`): `goTo(page)`, `zoomIn(step)`, `zoomOut(step)`.
75
76
 
@@ -77,6 +78,7 @@ Methods (via `ViewChild`): `goTo(page)`, `zoomIn(step)`, `zoomOut(step)`.
77
78
  - Continuous scrolling with width-fit for a doc-like reading experience.
78
79
  - Toolbar: zoom in/out, page nav, Download, Print.
79
80
  - Pan when zoomed: cursor changes to grab/grabbing; drag to scroll.
81
+ - Automatic iframe fallback when CORS/network blocks pdf.js byte access.
80
82
 
81
83
  ## Build
82
84
 
@@ -1,11 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, effect, ViewChild, Input, Component, InjectionToken, PLATFORM_ID, APP_INITIALIZER } from '@angular/core';
2
+ import { inject, signal, effect, ViewChild, Input, Component, InjectionToken, PLATFORM_ID, APP_INITIALIZER } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule, isPlatformBrowser } from '@angular/common';
5
+ import { DomSanitizer } from '@angular/platform-browser';
5
6
  import * as pdfjsLib from 'pdfjs-dist';
6
7
 
7
8
  class GenusPdfViewerComponent {
8
9
  static inlineWorkerSetupPromise = null;
10
+ sanitizer = inject(DomSanitizer);
9
11
  src;
10
12
  page = 1;
11
13
  zoom = 1.0;
@@ -19,6 +21,7 @@ class GenusPdfViewerComponent {
19
21
  zoomAnimationMs = 180;
20
22
  gestureAnimationMs = 120;
21
23
  loadTimeoutMs = 45000;
24
+ allowIframeFallback = true;
22
25
  withCredentials = false;
23
26
  httpHeaders;
24
27
  canvas;
@@ -32,6 +35,7 @@ class GenusPdfViewerComponent {
32
35
  canPan = signal(false, ...(ngDevMode ? [{ debugName: "canPan" }] : []));
33
36
  loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
34
37
  error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
38
+ iframeFallbackSrc = signal(null, ...(ngDevMode ? [{ debugName: "iframeFallbackSrc" }] : []));
35
39
  PRINT_SCALE = 2;
36
40
  scrollRaf = 0;
37
41
  renderLockCount = 0;
@@ -103,6 +107,7 @@ class GenusPdfViewerComponent {
103
107
  async loadDocument() {
104
108
  this.loading.set(true);
105
109
  this.error.set(null);
110
+ this.iframeFallbackSrc.set(null);
106
111
  this.lastLoadError = null;
107
112
  if (this.doc) {
108
113
  try {
@@ -113,12 +118,17 @@ class GenusPdfViewerComponent {
113
118
  }
114
119
  try {
115
120
  this.doc = await this.loadDocumentWithFallbacks(this.src);
116
- if (!this.doc)
117
- this.error.set(this.buildLoadErrorMessage());
121
+ if (!this.doc) {
122
+ if (!this.tryEnableIframeFallback()) {
123
+ this.error.set(this.buildLoadErrorMessage());
124
+ }
125
+ }
118
126
  }
119
127
  catch {
120
128
  this.doc = undefined;
121
- this.error.set(this.buildLoadErrorMessage());
129
+ if (!this.tryEnableIframeFallback()) {
130
+ this.error.set(this.buildLoadErrorMessage());
131
+ }
122
132
  }
123
133
  finally {
124
134
  this.loading.set(false);
@@ -283,6 +293,49 @@ class GenusPdfViewerComponent {
283
293
  }
284
294
  return 'Failed to load PDF. Check URL/CORS and worker setup, then retry.';
285
295
  }
296
+ tryEnableIframeFallback() {
297
+ if (!this.allowIframeFallback)
298
+ return false;
299
+ if (!this.isLikelyNetworkOrCorsError())
300
+ return false;
301
+ const href = this.toFallbackHref(this.src);
302
+ if (!href)
303
+ return false;
304
+ this.iframeFallbackSrc.set(this.sanitizer.bypassSecurityTrustResourceUrl(href));
305
+ this.error.set(null);
306
+ this.pageSig.set(1);
307
+ return true;
308
+ }
309
+ isLikelyNetworkOrCorsError() {
310
+ const lower = this.extractErrorText(this.lastLoadError).toLowerCase();
311
+ return (lower.includes('cors') ||
312
+ lower.includes('network') ||
313
+ lower.includes('fetch') ||
314
+ lower.includes('load failed') ||
315
+ lower.includes('failed to fetch') ||
316
+ lower.includes('securityerror'));
317
+ }
318
+ toFallbackHref(src) {
319
+ if (typeof window === 'undefined')
320
+ return null;
321
+ if (typeof src === 'string') {
322
+ try {
323
+ const url = new URL(src, window.location.href);
324
+ if (!['http:', 'https:', 'blob:', 'data:'].includes(url.protocol))
325
+ return null;
326
+ return url.toString();
327
+ }
328
+ catch {
329
+ return null;
330
+ }
331
+ }
332
+ if (src instanceof URL) {
333
+ if (!['http:', 'https:', 'blob:', 'data:'].includes(src.protocol))
334
+ return null;
335
+ return src.toString();
336
+ }
337
+ return null;
338
+ }
286
339
  extractErrorText(error) {
287
340
  if (!error)
288
341
  return '';
@@ -633,6 +686,9 @@ class GenusPdfViewerComponent {
633
686
  }
634
687
  async nextPage() { await this.goTo(this.pageSig() + 1); }
635
688
  async prevPage() { await this.goTo(this.pageSig() - 1); }
689
+ pageCount() {
690
+ return this.doc?.numPages ?? (this.iframeFallbackSrc() ? 1 : 0);
691
+ }
636
692
  isZoomed() {
637
693
  return Math.abs(this.zoomSig() - 1) > 0.0001;
638
694
  }
@@ -1080,7 +1136,7 @@ class GenusPdfViewerComponent {
1080
1136
  return last.endsWith('.pdf') ? last : (last ? last + '.pdf' : 'document.pdf');
1081
1137
  }
1082
1138
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: GenusPdfViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1083
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.1", type: GenusPdfViewerComponent, isStandalone: true, selector: "genus-pdf-viewer", inputs: { src: "src", page: "page", zoom: "zoom", maxZoom: "maxZoom", minZoom: "minZoom", fit: "fit", disableTextLayer: "disableTextLayer", continuous: "continuous", showToolbar: "showToolbar", zoomAnimation: "zoomAnimation", zoomAnimationMs: "zoomAnimationMs", gestureAnimationMs: "gestureAnimationMs", loadTimeoutMs: "loadTimeoutMs", withCredentials: "withCredentials", httpHeaders: "httpHeaders" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }, { propertyName: "singleStage", first: true, predicate: ["singleStage"], descendants: true }, { propertyName: "stage", first: true, predicate: ["stage"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
1139
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.1", type: GenusPdfViewerComponent, isStandalone: true, selector: "genus-pdf-viewer", inputs: { src: "src", page: "page", zoom: "zoom", maxZoom: "maxZoom", minZoom: "minZoom", fit: "fit", disableTextLayer: "disableTextLayer", continuous: "continuous", showToolbar: "showToolbar", zoomAnimation: "zoomAnimation", zoomAnimationMs: "zoomAnimationMs", gestureAnimationMs: "gestureAnimationMs", loadTimeoutMs: "loadTimeoutMs", allowIframeFallback: "allowIframeFallback", withCredentials: "withCredentials", httpHeaders: "httpHeaders" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }, { propertyName: "singleStage", first: true, predicate: ["singleStage"], descendants: true }, { propertyName: "stage", first: true, predicate: ["stage"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
1084
1140
  <div class="genus-pdf-shell">
1085
1141
  <ng-content select="[toolbar]"></ng-content>
1086
1142
 
@@ -1091,7 +1147,7 @@ class GenusPdfViewerComponent {
1091
1147
  <button type="button" *ngIf="isZoomed()" title="Reset zoom to 100%" aria-label="Reset zoom to 100%" (click)="resetZoom()">100%</button>
1092
1148
  <span class="spacer"></span>
1093
1149
  <button type="button" title="Previous page" aria-label="Previous page" (click)="prevPage()" [disabled]="pageSig() <= 1">⟨</button>
1094
- <span>{{ pageSig() }} / {{ doc ? doc.numPages : 0 }}</span>
1150
+ <span>{{ pageSig() }} / {{ pageCount() }}</span>
1095
1151
  <button type="button" title="Next page" aria-label="Next page" (click)="nextPage()" [disabled]="doc ? pageSig() >= doc.numPages : true">⟩</button>
1096
1152
  <span class="spacer"></span>
1097
1153
  <button type="button" class="download-btn" title="Download" aria-label="Download" (click)="download()">
@@ -1103,19 +1159,21 @@ class GenusPdfViewerComponent {
1103
1159
  </div>
1104
1160
 
1105
1161
  <div class="genus-pdf-stage" #singleStage [style.display]="continuous ? 'none' : 'flex'" [class.can-pan]="canPan()" [class.is-panning]="isPanning()" (pointerdown)="onPointerDown($event, singleStage)" (wheel)="onWheel($event, singleStage)" (scroll)="onScroll($event)">
1106
- <div class="genus-pdf-overlay" *ngIf="loading()"><div class="spinner" aria-label="Loading"></div></div>
1107
- <div class="genus-pdf-overlay error" *ngIf="error()">
1162
+ <iframe *ngIf="iframeFallbackSrc()" class="genus-pdf-iframe" [src]="iframeFallbackSrc()" title="PDF document"></iframe>
1163
+ <div class="genus-pdf-overlay" *ngIf="loading() && !iframeFallbackSrc()"><div class="spinner" aria-label="Loading"></div></div>
1164
+ <div class="genus-pdf-overlay error" *ngIf="error() && !iframeFallbackSrc()">
1108
1165
  <div style="display:flex;flex-direction:column;gap:8px;align-items:center;">
1109
1166
  <span>{{ error() }}</span>
1110
1167
  <button type="button" (click)="retryLoad()">Retry</button>
1111
1168
  </div>
1112
1169
  </div>
1113
- <canvas #canvas></canvas>
1170
+ <canvas #canvas [style.display]="iframeFallbackSrc() ? 'none' : 'block'"></canvas>
1114
1171
  </div>
1115
1172
 
1116
1173
  <div class="genus-pdf-stage genus-pdf-stage--continuous" #stage [style.display]="continuous ? 'block' : 'none'" [class.can-pan]="canPan()" [class.is-panning]="isPanning()" (pointerdown)="onPointerDown($event, stage)" (wheel)="onWheel($event, stage)" (scroll)="onScroll($event)">
1117
- <div class="genus-pdf-overlay" *ngIf="loading()"><div class="spinner" aria-label="Loading"></div></div>
1118
- <div class="genus-pdf-overlay error" *ngIf="error()">
1174
+ <iframe *ngIf="iframeFallbackSrc()" class="genus-pdf-iframe" [src]="iframeFallbackSrc()" title="PDF document"></iframe>
1175
+ <div class="genus-pdf-overlay" *ngIf="loading() && !iframeFallbackSrc()"><div class="spinner" aria-label="Loading"></div></div>
1176
+ <div class="genus-pdf-overlay error" *ngIf="error() && !iframeFallbackSrc()">
1119
1177
  <div style="display:flex;flex-direction:column;gap:8px;align-items:center;">
1120
1178
  <span>{{ error() }}</span>
1121
1179
  <button type="button" (click)="retryLoad()">Retry</button>
@@ -1123,7 +1181,7 @@ class GenusPdfViewerComponent {
1123
1181
  </div>
1124
1182
  </div>
1125
1183
  </div>
1126
- `, isInline: true, styles: [".genus-pdf-shell{display:flex;flex-direction:column;gap:8px;width:100%;height:100%;background:#f3f4f6}.genus-pdf-toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid #e5e7eb;border-radius:8px;background:#ffffffd9;-webkit-backdrop-filter:saturate(1.2) blur(6px);backdrop-filter:saturate(1.2) blur(6px);box-shadow:0 1px 2px #0000000f}.genus-pdf-toolbar .pct{min-width:48px;text-align:center;font-variant-numeric:tabular-nums;color:#111827}.genus-pdf-toolbar button{appearance:none;border:1px solid #e5e7eb;background:#fff;padding:6px 10px;border-radius:6px;cursor:pointer;color:#111827;font-size:14px;line-height:1;font-weight:500;min-width:32px;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;gap:6px}.genus-pdf-toolbar button.download-btn{background:#2563eb;border-color:#2563eb;color:#fff}.genus-pdf-toolbar button.download-btn:hover{background:#1d4ed8;border-color:#1d4ed8}.genus-pdf-toolbar button:disabled{opacity:.5;cursor:not-allowed}.genus-pdf-toolbar .spacer{flex:1}.genus-pdf-stage{position:relative;flex:1;overflow:auto;display:flex;align-items:flex-start;justify-content:center;background:#fafafa;touch-action:pan-y;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-y:contain}.genus-pdf-stage.can-pan{cursor:grab;touch-action:none}.genus-pdf-stage.is-panning{cursor:grabbing}.genus-pdf-stage--continuous{display:block;align-items:unset;justify-content:unset;padding:8px;scroll-behavior:smooth}.genus-pdf-stage--continuous .pdf-page{margin:0 auto 12px;background:#fff;box-shadow:0 1px 2px #00000014}canvas{display:block;max-width:100%;height:auto}.genus-pdf-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#ffffffb3;z-index:1}.genus-pdf-overlay.error{background:transparent}.spinner{width:28px;height:28px;border-radius:50%;border:3px solid #e5e7eb;border-top-color:#111827;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
1184
+ `, isInline: true, styles: [".genus-pdf-shell{display:flex;flex-direction:column;gap:8px;width:100%;height:100%;background:#f3f4f6}.genus-pdf-toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid #e5e7eb;border-radius:8px;background:#ffffffd9;-webkit-backdrop-filter:saturate(1.2) blur(6px);backdrop-filter:saturate(1.2) blur(6px);box-shadow:0 1px 2px #0000000f}.genus-pdf-toolbar .pct{min-width:48px;text-align:center;font-variant-numeric:tabular-nums;color:#111827}.genus-pdf-toolbar button{appearance:none;border:1px solid #e5e7eb;background:#fff;padding:6px 10px;border-radius:6px;cursor:pointer;color:#111827;font-size:14px;line-height:1;font-weight:500;min-width:32px;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;gap:6px}.genus-pdf-toolbar button.download-btn{background:#2563eb;border-color:#2563eb;color:#fff}.genus-pdf-toolbar button.download-btn:hover{background:#1d4ed8;border-color:#1d4ed8}.genus-pdf-toolbar button:disabled{opacity:.5;cursor:not-allowed}.genus-pdf-toolbar .spacer{flex:1}.genus-pdf-stage{position:relative;flex:1;overflow:auto;display:flex;align-items:flex-start;justify-content:center;background:#fafafa;touch-action:pan-y;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-y:contain}.genus-pdf-stage.can-pan{cursor:grab;touch-action:none}.genus-pdf-stage.is-panning{cursor:grabbing}.genus-pdf-stage--continuous{display:block;align-items:unset;justify-content:unset;padding:8px;scroll-behavior:smooth}.genus-pdf-stage--continuous .pdf-page{margin:0 auto 12px;background:#fff;box-shadow:0 1px 2px #00000014}canvas{display:block;max-width:100%;height:auto}.genus-pdf-iframe{width:100%;height:100%;border:0;background:#fff}.genus-pdf-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#ffffffb3;z-index:1}.genus-pdf-overlay.error{background:transparent}.spinner{width:28px;height:28px;border-radius:50%;border:3px solid #e5e7eb;border-top-color:#111827;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
1127
1185
  }
1128
1186
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: GenusPdfViewerComponent, decorators: [{
1129
1187
  type: Component,
@@ -1138,7 +1196,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImpor
1138
1196
  <button type="button" *ngIf="isZoomed()" title="Reset zoom to 100%" aria-label="Reset zoom to 100%" (click)="resetZoom()">100%</button>
1139
1197
  <span class="spacer"></span>
1140
1198
  <button type="button" title="Previous page" aria-label="Previous page" (click)="prevPage()" [disabled]="pageSig() <= 1">⟨</button>
1141
- <span>{{ pageSig() }} / {{ doc ? doc.numPages : 0 }}</span>
1199
+ <span>{{ pageSig() }} / {{ pageCount() }}</span>
1142
1200
  <button type="button" title="Next page" aria-label="Next page" (click)="nextPage()" [disabled]="doc ? pageSig() >= doc.numPages : true">⟩</button>
1143
1201
  <span class="spacer"></span>
1144
1202
  <button type="button" class="download-btn" title="Download" aria-label="Download" (click)="download()">
@@ -1150,19 +1208,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImpor
1150
1208
  </div>
1151
1209
 
1152
1210
  <div class="genus-pdf-stage" #singleStage [style.display]="continuous ? 'none' : 'flex'" [class.can-pan]="canPan()" [class.is-panning]="isPanning()" (pointerdown)="onPointerDown($event, singleStage)" (wheel)="onWheel($event, singleStage)" (scroll)="onScroll($event)">
1153
- <div class="genus-pdf-overlay" *ngIf="loading()"><div class="spinner" aria-label="Loading"></div></div>
1154
- <div class="genus-pdf-overlay error" *ngIf="error()">
1211
+ <iframe *ngIf="iframeFallbackSrc()" class="genus-pdf-iframe" [src]="iframeFallbackSrc()" title="PDF document"></iframe>
1212
+ <div class="genus-pdf-overlay" *ngIf="loading() && !iframeFallbackSrc()"><div class="spinner" aria-label="Loading"></div></div>
1213
+ <div class="genus-pdf-overlay error" *ngIf="error() && !iframeFallbackSrc()">
1155
1214
  <div style="display:flex;flex-direction:column;gap:8px;align-items:center;">
1156
1215
  <span>{{ error() }}</span>
1157
1216
  <button type="button" (click)="retryLoad()">Retry</button>
1158
1217
  </div>
1159
1218
  </div>
1160
- <canvas #canvas></canvas>
1219
+ <canvas #canvas [style.display]="iframeFallbackSrc() ? 'none' : 'block'"></canvas>
1161
1220
  </div>
1162
1221
 
1163
1222
  <div class="genus-pdf-stage genus-pdf-stage--continuous" #stage [style.display]="continuous ? 'block' : 'none'" [class.can-pan]="canPan()" [class.is-panning]="isPanning()" (pointerdown)="onPointerDown($event, stage)" (wheel)="onWheel($event, stage)" (scroll)="onScroll($event)">
1164
- <div class="genus-pdf-overlay" *ngIf="loading()"><div class="spinner" aria-label="Loading"></div></div>
1165
- <div class="genus-pdf-overlay error" *ngIf="error()">
1223
+ <iframe *ngIf="iframeFallbackSrc()" class="genus-pdf-iframe" [src]="iframeFallbackSrc()" title="PDF document"></iframe>
1224
+ <div class="genus-pdf-overlay" *ngIf="loading() && !iframeFallbackSrc()"><div class="spinner" aria-label="Loading"></div></div>
1225
+ <div class="genus-pdf-overlay error" *ngIf="error() && !iframeFallbackSrc()">
1166
1226
  <div style="display:flex;flex-direction:column;gap:8px;align-items:center;">
1167
1227
  <span>{{ error() }}</span>
1168
1228
  <button type="button" (click)="retryLoad()">Retry</button>
@@ -1170,7 +1230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImpor
1170
1230
  </div>
1171
1231
  </div>
1172
1232
  </div>
1173
- `, styles: [".genus-pdf-shell{display:flex;flex-direction:column;gap:8px;width:100%;height:100%;background:#f3f4f6}.genus-pdf-toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid #e5e7eb;border-radius:8px;background:#ffffffd9;-webkit-backdrop-filter:saturate(1.2) blur(6px);backdrop-filter:saturate(1.2) blur(6px);box-shadow:0 1px 2px #0000000f}.genus-pdf-toolbar .pct{min-width:48px;text-align:center;font-variant-numeric:tabular-nums;color:#111827}.genus-pdf-toolbar button{appearance:none;border:1px solid #e5e7eb;background:#fff;padding:6px 10px;border-radius:6px;cursor:pointer;color:#111827;font-size:14px;line-height:1;font-weight:500;min-width:32px;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;gap:6px}.genus-pdf-toolbar button.download-btn{background:#2563eb;border-color:#2563eb;color:#fff}.genus-pdf-toolbar button.download-btn:hover{background:#1d4ed8;border-color:#1d4ed8}.genus-pdf-toolbar button:disabled{opacity:.5;cursor:not-allowed}.genus-pdf-toolbar .spacer{flex:1}.genus-pdf-stage{position:relative;flex:1;overflow:auto;display:flex;align-items:flex-start;justify-content:center;background:#fafafa;touch-action:pan-y;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-y:contain}.genus-pdf-stage.can-pan{cursor:grab;touch-action:none}.genus-pdf-stage.is-panning{cursor:grabbing}.genus-pdf-stage--continuous{display:block;align-items:unset;justify-content:unset;padding:8px;scroll-behavior:smooth}.genus-pdf-stage--continuous .pdf-page{margin:0 auto 12px;background:#fff;box-shadow:0 1px 2px #00000014}canvas{display:block;max-width:100%;height:auto}.genus-pdf-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#ffffffb3;z-index:1}.genus-pdf-overlay.error{background:transparent}.spinner{width:28px;height:28px;border-radius:50%;border:3px solid #e5e7eb;border-top-color:#111827;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
1233
+ `, styles: [".genus-pdf-shell{display:flex;flex-direction:column;gap:8px;width:100%;height:100%;background:#f3f4f6}.genus-pdf-toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid #e5e7eb;border-radius:8px;background:#ffffffd9;-webkit-backdrop-filter:saturate(1.2) blur(6px);backdrop-filter:saturate(1.2) blur(6px);box-shadow:0 1px 2px #0000000f}.genus-pdf-toolbar .pct{min-width:48px;text-align:center;font-variant-numeric:tabular-nums;color:#111827}.genus-pdf-toolbar button{appearance:none;border:1px solid #e5e7eb;background:#fff;padding:6px 10px;border-radius:6px;cursor:pointer;color:#111827;font-size:14px;line-height:1;font-weight:500;min-width:32px;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;gap:6px}.genus-pdf-toolbar button.download-btn{background:#2563eb;border-color:#2563eb;color:#fff}.genus-pdf-toolbar button.download-btn:hover{background:#1d4ed8;border-color:#1d4ed8}.genus-pdf-toolbar button:disabled{opacity:.5;cursor:not-allowed}.genus-pdf-toolbar .spacer{flex:1}.genus-pdf-stage{position:relative;flex:1;overflow:auto;display:flex;align-items:flex-start;justify-content:center;background:#fafafa;touch-action:pan-y;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-y:contain}.genus-pdf-stage.can-pan{cursor:grab;touch-action:none}.genus-pdf-stage.is-panning{cursor:grabbing}.genus-pdf-stage--continuous{display:block;align-items:unset;justify-content:unset;padding:8px;scroll-behavior:smooth}.genus-pdf-stage--continuous .pdf-page{margin:0 auto 12px;background:#fff;box-shadow:0 1px 2px #00000014}canvas{display:block;max-width:100%;height:auto}.genus-pdf-iframe{width:100%;height:100%;border:0;background:#fff}.genus-pdf-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#ffffffb3;z-index:1}.genus-pdf-overlay.error{background:transparent}.spinner{width:28px;height:28px;border-radius:50%;border:3px solid #e5e7eb;border-top-color:#111827;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
1174
1234
  }], ctorParameters: () => [], propDecorators: { src: [{
1175
1235
  type: Input
1176
1236
  }], page: [{
@@ -1197,6 +1257,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImpor
1197
1257
  type: Input
1198
1258
  }], loadTimeoutMs: [{
1199
1259
  type: Input
1260
+ }], allowIframeFallback: [{
1261
+ type: Input
1200
1262
  }], withCredentials: [{
1201
1263
  type: Input
1202
1264
  }], httpHeaders: [{
@@ -1 +1 @@
1
- {"version":3,"file":"genus-pdf-viewer.mjs","sources":["../../../projects/genus-pdf-viewer/src/lib/genus-pdf-viewer.ts","../../../projects/genus-pdf-viewer/src/lib/pdfjs-worker.provider.ts","../../../projects/genus-pdf-viewer/src/public-api.ts","../../../projects/genus-pdf-viewer/src/genus-pdf-viewer.ts"],"sourcesContent":["import { Component, Input, ViewChild, ElementRef, OnChanges, SimpleChanges, effect, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type {\n DocumentInitParameters,\n PDFDocumentLoadingTask,\n PDFDocumentProxy,\n PDFPageProxy,\n} from 'pdfjs-dist/types/src/display/api';\n\n@Component({\n selector: 'genus-pdf-viewer',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"genus-pdf-shell\">\n <ng-content select=\"[toolbar]\"></ng-content>\n\n <div class=\"genus-pdf-toolbar\" *ngIf=\"showToolbar\">\n <button type=\"button\" title=\"Zoom out\" aria-label=\"Zoom out\" (click)=\"zoomOut()\">−</button>\n <span class=\"pct\">{{ (zoomSig() * 100) | number:'1.0-0' }}%</span>\n <button type=\"button\" title=\"Zoom in\" aria-label=\"Zoom in\" (click)=\"zoomIn()\">+</button>\n <button type=\"button\" *ngIf=\"isZoomed()\" title=\"Reset zoom to 100%\" aria-label=\"Reset zoom to 100%\" (click)=\"resetZoom()\">100%</button>\n <span class=\"spacer\"></span>\n <button type=\"button\" title=\"Previous page\" aria-label=\"Previous page\" (click)=\"prevPage()\" [disabled]=\"pageSig() <= 1\">⟨</button>\n <span>{{ pageSig() }} / {{ doc ? doc.numPages : 0 }}</span>\n <button type=\"button\" title=\"Next page\" aria-label=\"Next page\" (click)=\"nextPage()\" [disabled]=\"doc ? pageSig() >= doc.numPages : true\">⟩</button>\n <span class=\"spacer\"></span>\n <button type=\"button\" class=\"download-btn\" title=\"Download\" aria-label=\"Download\" (click)=\"download()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12 3v10m0 0 4-4m-4 4-4-4M5 15v3a3 3 0 0 0 3 3h8a3 3 0 0 0 3-3v-3\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </button>\n </div>\n\n <div class=\"genus-pdf-stage\" #singleStage [style.display]=\"continuous ? 'none' : 'flex'\" [class.can-pan]=\"canPan()\" [class.is-panning]=\"isPanning()\" (pointerdown)=\"onPointerDown($event, singleStage)\" (wheel)=\"onWheel($event, singleStage)\" (scroll)=\"onScroll($event)\">\n <div class=\"genus-pdf-overlay\" *ngIf=\"loading()\"><div class=\"spinner\" aria-label=\"Loading\"></div></div>\n <div class=\"genus-pdf-overlay error\" *ngIf=\"error()\">\n <div style=\"display:flex;flex-direction:column;gap:8px;align-items:center;\">\n <span>{{ error() }}</span>\n <button type=\"button\" (click)=\"retryLoad()\">Retry</button>\n </div>\n </div>\n <canvas #canvas></canvas>\n </div>\n\n <div class=\"genus-pdf-stage genus-pdf-stage--continuous\" #stage [style.display]=\"continuous ? 'block' : 'none'\" [class.can-pan]=\"canPan()\" [class.is-panning]=\"isPanning()\" (pointerdown)=\"onPointerDown($event, stage)\" (wheel)=\"onWheel($event, stage)\" (scroll)=\"onScroll($event)\">\n <div class=\"genus-pdf-overlay\" *ngIf=\"loading()\"><div class=\"spinner\" aria-label=\"Loading\"></div></div>\n <div class=\"genus-pdf-overlay error\" *ngIf=\"error()\">\n <div style=\"display:flex;flex-direction:column;gap:8px;align-items:center;\">\n <span>{{ error() }}</span>\n <button type=\"button\" (click)=\"retryLoad()\">Retry</button>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .genus-pdf-shell { display:flex; flex-direction:column; gap:8px; width:100%; height:100%; background:#f3f4f6; }\n .genus-pdf-toolbar { position:sticky; top:0; z-index:2; display:flex; align-items:center; gap:8px; padding:6px 8px; border:1px solid #e5e7eb; border-radius:8px; background:#ffffffd9; backdrop-filter:saturate(1.2) blur(6px); box-shadow:0 1px 2px rgba(0,0,0,0.06); }\n .genus-pdf-toolbar .pct { min-width: 48px; text-align:center; font-variant-numeric: tabular-nums; color:#111827; }\n .genus-pdf-toolbar button { appearance:none; border:1px solid #e5e7eb; background:#fff; padding:6px 10px; border-radius:6px; cursor:pointer; color:#111827; font-size:14px; line-height:1; font-weight:500; min-width:32px; user-select:none; display:inline-flex; align-items:center; gap:6px; }\n .genus-pdf-toolbar button.download-btn { background:#2563eb; border-color:#2563eb; color:#fff; }\n .genus-pdf-toolbar button.download-btn:hover { background:#1d4ed8; border-color:#1d4ed8; }\n .genus-pdf-toolbar button:disabled { opacity:0.5; cursor:not-allowed; }\n .genus-pdf-toolbar .spacer { flex:1; }\n .genus-pdf-stage { position:relative; flex:1; overflow:auto; display:flex; align-items:flex-start; justify-content:center; background:#fafafa; touch-action: pan-y; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; overscroll-behavior-y: contain; }\n .genus-pdf-stage.can-pan { cursor: grab; touch-action: none; }\n .genus-pdf-stage.is-panning { cursor: grabbing; }\n .genus-pdf-stage--continuous { display:block; align-items:unset; justify-content:unset; padding:8px; scroll-behavior:smooth; }\n .genus-pdf-stage--continuous .pdf-page { margin:0 auto 12px auto; background:white; box-shadow:0 1px 2px rgba(0,0,0,0.08); }\n canvas { display:block; max-width:100%; height:auto; }\n .genus-pdf-overlay { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; background:rgba(255,255,255,0.7); z-index:1; }\n .genus-pdf-overlay.error { background:transparent; }\n .spinner { width:28px; height:28px; border-radius:50%; border:3px solid #e5e7eb; border-top-color:#111827; animation:spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0) } to { transform: rotate(360deg) } }\n `]\n})\nexport class GenusPdfViewerComponent implements OnChanges {\n private static inlineWorkerSetupPromise: Promise<void> | null = null;\n\n @Input() src!: string | URL | Uint8Array | Blob;\n @Input() page = 1;\n @Input() zoom = 1.0;\n @Input() maxZoom = 4;\n @Input() minZoom = 0.25;\n @Input() fit: 'width'|'height'|'page'|'none' = 'width';\n @Input() disableTextLayer = true;\n @Input() continuous = true;\n @Input() showToolbar = true;\n @Input() zoomAnimation = true;\n @Input() zoomAnimationMs = 180;\n @Input() gestureAnimationMs = 120;\n @Input() loadTimeoutMs = 45000;\n @Input() withCredentials = false;\n @Input() httpHeaders?: Record<string, string>;\n\n @ViewChild('canvas', { static: false }) canvas!: ElementRef<HTMLCanvasElement>;\n @ViewChild('singleStage', { static: false }) singleStage!: ElementRef<HTMLDivElement>;\n @ViewChild('stage', { static: false }) stage!: ElementRef<HTMLDivElement>;\n\n doc?: PDFDocumentProxy;\n private currentPage?: PDFPageProxy;\n\n pageSig = signal(1);\n zoomSig = signal(1);\n isPanning = signal(false);\n canPan = signal(false);\n loading = signal(false);\n error = signal<string | null>(null);\n private readonly PRINT_SCALE = 2;\n private scrollRaf = 0 as any;\n private renderLockCount = 0;\n private zoomAnimInFlight = false;\n private activeRenderTasks = new Set<any>();\n private wheelRaf = 0 as any;\n private pinchState: { id1: number; id2: number; startDist: number; startZoom: number } | null = null;\n private activePointers = new Map<number, { x: number; y: number; type: string }>();\n private renderVersion = 0;\n private previewActive = false;\n private reRenderQueued = false;\n private pendingAnchor: { page: number; ratio: number } | undefined;\n private lastZoomClient: { x: number; y: number } | null = null;\n private readonly WHEEL_STEP = 0.02;\n private readonly PINCH_SENSITIVITY = 0.5;\n private wheelCommitTimer = 0 as any;\n private lastLoadError: unknown = null;\n \n\n constructor() {\n effect(() => {\n // Only react to zoom changes here; page changes in continuous mode should NOT trigger a re-render\n this.zoomSig();\n if (this.renderLockCount > 0 || this.previewActive) return;\n this.safeRender();\n });\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['page']) this.pageSig.set(this.page);\n if (changes['zoom']) this.zoomSig.set(this.zoom);\n\n const srcChanged = !!changes['src'];\n const layoutChanged = !!(changes['fit'] || changes['minZoom'] || changes['maxZoom']);\n\n if (!this.src) return;\n\n if (srcChanged) {\n await this.loadDocument();\n\n if (this.doc) {\n const pages = this.doc.numPages;\n if (this.pageSig() < 1) this.pageSig.set(1);\n if (this.pageSig() > pages) this.pageSig.set(pages);\n await this.render();\n }\n return;\n }\n\n if (layoutChanged) {\n if (this.continuous) {\n const container = this.stage?.nativeElement;\n const anchor = container ? this.captureScrollAnchor(container) || undefined : undefined;\n await this.renderAllPages(anchor);\n } else {\n await this.render();\n }\n return;\n }\n\n if (!this.continuous && changes['page']) {\n await this.render();\n }\n }\n\n async safeRender() {\n try { await this.render(); } catch (_) {}\n }\n\n private async loadDocument() {\n this.loading.set(true);\n this.error.set(null);\n this.lastLoadError = null;\n if (this.doc) {\n try { await this.doc.destroy(); } catch {}\n this.doc = undefined;\n }\n try {\n this.doc = await this.loadDocumentWithFallbacks(this.src);\n if (!this.doc) this.error.set(this.buildLoadErrorMessage());\n } catch {\n this.doc = undefined;\n this.error.set(this.buildLoadErrorMessage());\n } finally {\n this.loading.set(false);\n }\n }\n\n private async loadDocumentWithFallbacks(src: string | URL | Uint8Array | Blob): Promise<PDFDocumentProxy | undefined> {\n await this.ensureInlineWorkerFallback();\n const workerCandidates = this.getWorkerSrcCandidates();\n const baseTimeout = this.getEffectiveLoadTimeoutMs();\n const primary = this.createPrimaryParams(src);\n if (primary && workerCandidates.length) {\n for (let i = 0; i < workerCandidates.length; i++) {\n this.applyWorkerSrc(workerCandidates[i]);\n const timeoutMs = i === 0 ? baseTimeout : Math.min(baseTimeout, 12000);\n const doc = await this.tryLoadDocument(primary, timeoutMs);\n if (doc) return doc;\n }\n } else if (primary) {\n const doc = await this.tryLoadDocument(primary, baseTimeout);\n if (doc) return doc;\n }\n\n const bytes = await this.toPdfBytes(src);\n if (!bytes) return undefined;\n\n const byteParams: DocumentInitParameters = {\n data: bytes,\n disableRange: true,\n disableStream: true,\n disableAutoFetch: true,\n stopAtErrors: true,\n };\n if (workerCandidates.length) {\n for (let i = 0; i < workerCandidates.length; i++) {\n this.applyWorkerSrc(workerCandidates[i]);\n const timeoutMs = i === 0 ? baseTimeout : Math.min(baseTimeout, 12000);\n const doc = await this.tryLoadDocument(byteParams, timeoutMs);\n if (doc) return doc;\n }\n return undefined;\n }\n return this.tryLoadDocument(byteParams, baseTimeout);\n }\n\n private createPrimaryParams(src: string | URL | Uint8Array | Blob): DocumentInitParameters | null {\n if (typeof src === 'string') {\n return {\n url: src,\n withCredentials: this.withCredentials,\n httpHeaders: this.httpHeaders,\n stopAtErrors: true,\n };\n }\n if (src instanceof URL) {\n return {\n url: src.toString(),\n withCredentials: this.withCredentials,\n httpHeaders: this.httpHeaders,\n stopAtErrors: true,\n };\n }\n if (src instanceof Uint8Array) {\n const copy = new Uint8Array(src.byteLength);\n copy.set(src);\n return {\n data: copy,\n disableRange: true,\n disableStream: true,\n disableAutoFetch: true,\n stopAtErrors: true,\n };\n }\n return null;\n }\n\n private async tryLoadDocument(params: DocumentInitParameters, timeoutMs: number): Promise<PDFDocumentProxy | undefined> {\n const task = pdfjsLib.getDocument(params as any) as PDFDocumentLoadingTask;\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n if (timeoutMs <= 0) {\n return await task.promise;\n }\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('PDF load timeout')), timeoutMs);\n });\n return await Promise.race([task.promise, timeoutPromise]);\n } catch (e) {\n this.lastLoadError = e;\n try { await task.destroy(); } catch {}\n return undefined;\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private getEffectiveLoadTimeoutMs(): number {\n if (!Number.isFinite(this.loadTimeoutMs)) return 45000;\n if (this.loadTimeoutMs <= 0) return 0;\n return Math.max(5000, this.loadTimeoutMs);\n }\n\n private async ensureInlineWorkerFallback(): Promise<void> {\n if (typeof window === 'undefined') return;\n const g = globalThis as any;\n if (g?.pdfjsWorker?.WorkerMessageHandler) return;\n if (!GenusPdfViewerComponent.inlineWorkerSetupPromise) {\n GenusPdfViewerComponent.inlineWorkerSetupPromise = (async () => {\n try {\n // @ts-ignore pdfjs-dist worker entry does not ship declaration files.\n const workerModule: any = await import('pdfjs-dist/build/pdf.worker.min.mjs');\n if (workerModule?.WorkerMessageHandler) {\n g.pdfjsWorker = { ...(g.pdfjsWorker || {}), WorkerMessageHandler: workerModule.WorkerMessageHandler };\n }\n } catch {}\n })();\n }\n await GenusPdfViewerComponent.inlineWorkerSetupPromise;\n }\n\n private resolveBundledWorkerSrc(): string | null {\n try {\n return new URL('../workers/pdf.worker.min.mjs', import.meta.url).toString();\n } catch {\n return null;\n }\n }\n\n private getWorkerSrcCandidates(): string[] {\n const options = (pdfjsLib as any).GlobalWorkerOptions || {};\n const current = typeof options.workerSrc === 'string' ? options.workerSrc : '';\n const bundled = this.resolveBundledWorkerSrc() || '';\n const assetJs = '/assets/pdf.worker.min.js';\n const assetMjs = '/assets/pdf.worker.min.mjs';\n const candidates = [bundled, current, assetJs, assetMjs].filter((v) => !!v);\n return Array.from(new Set(candidates));\n }\n\n private applyWorkerSrc(workerSrc: string): void {\n const options = (pdfjsLib as any).GlobalWorkerOptions || {};\n options.workerPort = null;\n options.workerSrc = workerSrc;\n }\n\n private buildLoadErrorMessage(): string {\n const raw = this.extractErrorText(this.lastLoadError).trim();\n const lower = raw.toLowerCase();\n if (lower.includes('worker')) {\n return 'PDF worker bootstrap failed. Check CSP/network restrictions for dynamic imports and retry.';\n }\n if (lower.includes('cors') || lower.includes('network') || lower.includes('fetch')) {\n return 'PDF request failed. Check file URL, network, and CORS policy, then retry.';\n }\n if (lower.includes('password')) {\n return 'This PDF appears to be password protected.';\n }\n return 'Failed to load PDF. Check URL/CORS and worker setup, then retry.';\n }\n\n private extractErrorText(error: unknown): string {\n if (!error) return '';\n if (typeof error === 'string') return error;\n if (typeof error === 'object') {\n const maybeMessage = (error as { message?: unknown }).message;\n if (typeof maybeMessage === 'string') return maybeMessage;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n return String(error);\n }\n\n private async toPdfBytes(src: string | URL | Uint8Array | Blob): Promise<Uint8Array | null> {\n if (src instanceof Uint8Array) {\n const copy = new Uint8Array(src.byteLength);\n copy.set(src);\n return copy;\n }\n if (src instanceof Blob) {\n try {\n return new Uint8Array(await src.arrayBuffer());\n } catch {\n return null;\n }\n }\n const href = typeof src === 'string' ? src : src.toString();\n if (typeof fetch === 'undefined') return null;\n try {\n const res = await fetch(href, {\n mode: 'cors',\n headers: this.httpHeaders,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) return null;\n return new Uint8Array(await res.arrayBuffer());\n } catch {\n return null;\n }\n }\n\n async render() {\n if (!this.doc) return;\n const version = ++this.renderVersion;\n if (this.continuous) {\n await this.renderAllPages();\n return;\n }\n\n const pageNum = this.pageSig();\n const pdfPage = await this.doc.getPage(pageNum);\n this.currentPage = pdfPage;\n\n const canvas = this.canvas?.nativeElement;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n\n const baseViewport = pdfPage.getViewport({ scale: 1 });\n const parent = canvas.parentElement!;\n const anchor = this.captureScrollAnchor(parent) || undefined;\n const pW = parent.clientWidth, pH = parent.clientHeight || baseViewport.height;\n\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (pW - 16) / baseViewport.width;\n if (this.fit === 'height') baseScale = (pH - 16) / baseViewport.height;\n if (this.fit === 'page') baseScale = Math.min((pW - 16) / baseViewport.width, (pH - 16) / baseViewport.height);\n\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n this.canPan.set(finalScale > baseScale + 0.001);\n const viewport = pdfPage.getViewport({ scale: finalScale });\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = pdfPage.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n if (anchor) this.restoreScrollAnchor(parent, anchor);\n }\n\n private async renderAllPages(anchorOverride?: { page: number; ratio: number }) {\n if (!this.doc) return;\n const stageEl = this.stage?.nativeElement;\n if (!stageEl) return;\n const version = ++this.renderVersion;\n const anchor = anchorOverride ?? this.captureScrollAnchor(stageEl);\n const total = this.doc.numPages;\n const parentRect = stageEl.getBoundingClientRect();\n const parentWidth = parentRect.width || stageEl.clientWidth || 800;\n let computedCanPan = false;\n const existing = Array.from(stageEl.querySelectorAll<HTMLElement>('.pdf-page'));\n const isInitialBuild = existing.length !== total;\n this.renderLockCount++;\n try {\n if (isInitialBuild) {\n stageEl.innerHTML = '';\n const contentEl = document.createElement('div');\n contentEl.className = 'pdf-content';\n stageEl.appendChild(contentEl);\n for (let i = 1; i <= total; i++) {\n const page = await this.doc.getPage(i);\n const baseViewport = page.getViewport({ scale: 1 });\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (parentWidth - 16) / baseViewport.width;\n if (this.fit === 'page') baseScale = (parentWidth - 16) / baseViewport.width;\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n if (i === 1) computedCanPan = finalScale > baseScale + 0.001;\n const viewport = page.getViewport({ scale: finalScale });\n\n const wrapper = document.createElement('div');\n wrapper.className = 'pdf-page';\n wrapper.setAttribute('data-page', String(i));\n wrapper.style.width = Math.floor(viewport.width) + 'px';\n wrapper.style.height = Math.floor(viewport.height) + 'px';\n wrapper.style.margin = '0 auto 12px auto';\n\n const canvas = document.createElement('canvas');\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const ctx = canvas.getContext('2d')!;\n\n wrapper.appendChild(canvas);\n contentEl.appendChild(wrapper);\n\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = page.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n }\n } else {\n let contentEl = stageEl.querySelector<HTMLElement>('.pdf-content');\n if (!contentEl) {\n contentEl = document.createElement('div');\n contentEl.className = 'pdf-content';\n const pages = Array.from(stageEl.querySelectorAll<HTMLElement>('.pdf-page'));\n for (const el of pages) contentEl.appendChild(el);\n stageEl.appendChild(contentEl);\n }\n for (let i = 1; i <= total; i++) {\n const page = await this.doc.getPage(i);\n const baseViewport = page.getViewport({ scale: 1 });\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (parentWidth - 16) / baseViewport.width;\n if (this.fit === 'page') baseScale = (parentWidth - 16) / baseViewport.width;\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n if (i === 1) computedCanPan = finalScale > baseScale + 0.001;\n const viewport = page.getViewport({ scale: finalScale });\n\n const wrapper = existing[i - 1];\n const canvas = wrapper.querySelector('canvas') as HTMLCanvasElement;\n wrapper.style.width = Math.floor(viewport.width) + 'px';\n wrapper.style.height = Math.floor(viewport.height) + 'px';\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const ctx = canvas.getContext('2d')!;\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = page.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n }\n }\n this.canPan.set(computedCanPan);\n if (anchor) this.restoreScrollAnchor(stageEl, anchor);\n } finally {\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n }\n }\n\n async goTo(page: number) {\n if (!this.doc) return;\n const p = Math.max(1, Math.min(this.doc.numPages, page));\n this.pageSig.set(p);\n if (this.continuous) {\n const stageEl = this.stage?.nativeElement;\n const el = stageEl?.querySelector(`[data-page=\"${p}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n } else {\n await this.render();\n }\n }\n async zoomIn(step = 0.1) { await this.applyZoomDelta(step); }\n async zoomOut(step = 0.1) { await this.applyZoomDelta(-step); }\n\n private clampZoom(z: number): number {\n return Math.max(this.minZoom, Math.min(this.maxZoom, z));\n }\n\n private cancelPreviewIfAny(container?: HTMLElement): void {\n if (!this.previewActive || !container) return;\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n try {\n target.style.transform = '';\n target.style.willChange = '';\n target.style.transition = '';\n } catch {}\n this.previewActive = false;\n this.lastZoomClient = null;\n }\n\n private async applyZoomDelta(delta: number): Promise<void> {\n const oldZoom = this.zoomSig();\n const newZoom = this.clampZoom(oldZoom + delta);\n if (Math.abs(newZoom - oldZoom) < 0.0001) return;\n\n const container = this.continuous ? this.stage?.nativeElement : this.singleStage?.nativeElement;\n // If a preview transform is active (from pinch/wheel), clear it before capturing anchor or animating\n this.cancelPreviewIfAny(container);\n const anchor = container ? this.captureScrollAnchor(container) || undefined : undefined;\n const ratio = newZoom / oldZoom;\n\n if (this.zoomAnimation && container && !this.zoomAnimInFlight) {\n this.zoomAnimInFlight = true;\n this.renderLockCount++;\n // Update UI value immediately\n this.zoomSig.set(newZoom);\n try {\n await this.runZoomAnimation(container, ratio);\n } finally {\n // Release the render lock before triggering the actual re-render\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n await this.safeReRenderWithCancellation(anchor);\n this.zoomAnimInFlight = false;\n }\n } else {\n this.zoomSig.set(newZoom);\n await this.safeReRenderWithCancellation(anchor);\n }\n }\n\n private async runZoomAnimation(container: HTMLElement, ratio: number): Promise<void> {\n if (Math.abs(ratio - 1) < 0.0001) return;\n const { target, originX, originY } = this.getZoomAnimTarget(container);\n return new Promise<void>((resolve) => {\n try {\n const onDone = () => {\n cleanup();\n resolve();\n };\n const cleanup = () => {\n target.removeEventListener('transitionend', onEnd as any);\n target.style.transition = '';\n target.style.transform = '';\n target.style.transformOrigin = '';\n target.style.willChange = '';\n };\n const onEnd = () => onDone();\n target.style.willChange = 'transform';\n target.style.transformOrigin = `${Math.max(0, originX)}px ${Math.max(0, originY)}px`;\n target.style.transition = 'none';\n target.style.transform = 'scale(1)';\n requestAnimationFrame(() => {\n target.addEventListener('transitionend', onEnd as any, { once: true } as any);\n target.style.transition = `transform ${this.zoomAnimationMs}ms cubic-bezier(0.2,0,0,1)`;\n target.style.transform = `scale(${ratio})`;\n setTimeout(onDone, this.zoomAnimationMs + 60);\n });\n } catch {\n resolve();\n }\n });\n }\n\n private getZoomAnimTarget(container: HTMLElement): { target: HTMLElement; originX: number; originY: number } {\n const isContinuous = this.continuous;\n let target: HTMLElement | null = null;\n if (isContinuous) {\n target = container.querySelector<HTMLElement>('.pdf-content');\n if (!target) target = container; // fallback\n } else {\n target = container.querySelector<HTMLElement>('canvas');\n if (!target) target = container; // fallback\n }\n const rectLeft = target.offsetLeft;\n const rectTop = target.offsetTop;\n // Prefer last gesture point (pinch center or wheel pointer) if available\n const client = this.lastZoomClient;\n const originX = client ? (container.scrollLeft + client.x - rectLeft) : (container.scrollLeft + container.clientWidth / 2 - rectLeft);\n const originY = client ? (container.scrollTop + client.y - rectTop) : (container.scrollTop + container.clientHeight / 2 - rectTop);\n return { target, originX, originY };\n }\n\n onScroll(evt: Event) {\n const container = evt.target as HTMLElement;\n // debounce via rAF\n if (this.scrollRaf) cancelAnimationFrame(this.scrollRaf);\n this.scrollRaf = requestAnimationFrame(() => {\n if (!this.doc || !this.continuous) return;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('.pdf-page'));\n if (!pages.length) return;\n const centerY = container.scrollTop + container.clientHeight / 2;\n let current = this.pageSig();\n for (const el of pages) {\n const top = el.offsetTop;\n const bottom = top + el.offsetHeight;\n if (centerY >= top && centerY <= bottom) {\n const p = parseInt(el.getAttribute('data-page') || '1', 10);\n current = p;\n break;\n }\n }\n if (current !== this.pageSig()) this.pageSig.set(current);\n });\n }\n\n async nextPage() { await this.goTo(this.pageSig() + 1); }\n async prevPage() { await this.goTo(this.pageSig() - 1); }\n\n isZoomed(): boolean {\n return Math.abs(this.zoomSig() - 1) > 0.0001;\n }\n\n async resetZoom() {\n // Reset to exactly 1.0 (100%)\n const delta = 1 - this.zoomSig();\n await this.applyZoomDelta(delta);\n }\n\n async retryLoad() {\n await this.loadDocument();\n if (this.doc) {\n const pages = this.doc.numPages;\n if (this.pageSig() < 1) this.pageSig.set(1);\n if (this.pageSig() > pages) this.pageSig.set(pages);\n await this.render();\n }\n }\n\n onPointerDown(evt: PointerEvent, containerEl: HTMLElement) {\n // Pinch-to-zoom (two pointers)\n if (evt.pointerType === 'touch') {\n this.activePointers.set(evt.pointerId, { x: evt.clientX, y: evt.clientY, type: evt.pointerType });\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerType === 'touch') this.activePointers.set(e.pointerId, { x: e.clientX, y: e.clientY, type: e.pointerType });\n const touches = Array.from(this.activePointers.entries()).map(([id, p]) => ({ pointerId: id, clientX: p.x, clientY: p.y }))\n .slice(0, 2);\n if (touches.length === 2) {\n const [a, b] = touches;\n const dist = Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n if (!this.pinchState) {\n this.pinchState = { id1: a.pointerId, id2: b.pointerId, startDist: Math.max(1, dist), startZoom: this.zoomSig() };\n const rect = containerEl.getBoundingClientRect();\n this.lastZoomClient = { x: ((a.clientX + b.clientX) / 2) - rect.left, y: ((a.clientY + b.clientY) / 2) - rect.top };\n }\n const scale = dist / Math.max(1, this.pinchState.startDist);\n const adjusted = 1 + (scale - 1) * this.PINCH_SENSITIVITY;\n const desiredAdj = this.clampZoom(this.pinchState.startZoom * adjusted);\n this.previewZoom(containerEl, desiredAdj);\n e.preventDefault();\n return;\n }\n // When pinch ends (not exactly two touches), commit render if we were previewing\n if (this.pinchState) {\n const final = this.zoomSig();\n this.commitPreviewZoom(containerEl, final);\n this.pinchState = null;\n this.lastZoomClient = null;\n }\n };\n const onPointerEnd = (e: PointerEvent) => {\n this.activePointers.delete(e.pointerId);\n const touches = Array.from(this.activePointers.values());\n if (touches.length !== 2 && this.pinchState) {\n const final = this.zoomSig();\n this.commitPreviewZoom(containerEl, final);\n this.pinchState = null;\n this.lastZoomClient = null;\n }\n cleanup();\n };\n const cleanup = () => {\n containerEl.removeEventListener('pointermove', onPointerMove);\n containerEl.removeEventListener('pointerup', onPointerEnd);\n containerEl.removeEventListener('pointercancel', onPointerEnd);\n this.activePointers.clear();\n };\n containerEl.addEventListener('pointermove', onPointerMove);\n containerEl.addEventListener('pointerup', onPointerEnd);\n containerEl.addEventListener('pointercancel', onPointerEnd);\n return;\n }\n\n // Mouse pan when canPan\n if (!this.canPan()) return;\n this.isPanning.set(true);\n const startX = evt.clientX;\n const startY = evt.clientY;\n const startLeft = containerEl.scrollLeft;\n const startTop = containerEl.scrollTop;\n containerEl.style.scrollBehavior = 'auto';\n containerEl.setPointerCapture?.(evt.pointerId);\n const move = (e: PointerEvent) => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n containerEl.scrollLeft = startLeft - dx;\n containerEl.scrollTop = startTop - dy;\n e.preventDefault();\n };\n const end = (e: PointerEvent) => {\n this.isPanning.set(false);\n containerEl.releasePointerCapture?.(evt.pointerId);\n containerEl.removeEventListener('pointermove', move);\n containerEl.removeEventListener('pointerup', end);\n containerEl.removeEventListener('pointercancel', end);\n containerEl.style.scrollBehavior = 'smooth';\n };\n containerEl.addEventListener('pointermove', move);\n containerEl.addEventListener('pointerup', end);\n containerEl.addEventListener('pointercancel', end);\n }\n\n private getActiveTouches(containerEl: HTMLElement): PointerEvent[] {\n // We capture pointer events only on this element; maintain list by querying PointerEvent.getCoalescedEvents not available broadly.\n // Instead, rely on touches reported in native events; browsers will deliver move events for all active pointers targeting the element.\n // Here we cannot query directly; so we return an empty array and use move handler state. For simplicity, we derive from event stream only.\n // This helper remains for future extension; current logic passes actual events to compute pinch.\n return [] as any;\n }\n\n onWheel(evt: WheelEvent, containerEl: HTMLElement) {\n const isCtrlZoom = evt.ctrlKey || evt.metaKey;\n if (!isCtrlZoom) return;\n evt.preventDefault();\n const rect = containerEl.getBoundingClientRect();\n // Record gesture point relative to container\n this.lastZoomClient = { x: evt.clientX - rect.left, y: evt.clientY - rect.top };\n if (this.wheelRaf) cancelAnimationFrame(this.wheelRaf);\n if (this.wheelCommitTimer) clearTimeout(this.wheelCommitTimer);\n const delta = -evt.deltaY;\n const step = delta > 0 ? this.WHEEL_STEP : -this.WHEEL_STEP;\n const desired = this.clampZoom(this.zoomSig() + step);\n this.previewZoom(containerEl, desired);\n this.wheelRaf = requestAnimationFrame(() => {\n this.wheelCommitTimer = setTimeout(() => {\n this.commitPreviewZoom(containerEl, this.zoomSig());\n this.lastZoomClient = null;\n }, this.gestureAnimationMs + 20);\n });\n }\n\n private previewZoom(container: HTMLElement, newZoom: number) {\n const oldZoom = this.zoomSig();\n if (Math.abs(newZoom - oldZoom) < 0.0001) return;\n const ratio = newZoom / oldZoom;\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n const origin = this.getZoomAnimTarget(container);\n target.style.willChange = 'transform';\n target.style.transformOrigin = `${Math.max(0, origin.originX)}px ${Math.max(0, origin.originY)}px`;\n target.style.transition = `transform ${this.gestureAnimationMs}ms cubic-bezier(0.2,0,0,1)`;\n target.style.transform = `scale(${ratio})`;\n this.zoomSig.set(newZoom);\n this.previewActive = true;\n }\n\n private async commitPreviewZoom(container: HTMLElement, expectedZoom: number) {\n // Clear transform and re-render once; cancel any in-flight render tasks\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n target.style.transform = '';\n target.style.willChange = '';\n target.style.transition = '';\n const anchor = this.captureScrollAnchor(container) || undefined;\n if (this.previewActive) {\n await this.safeReRenderWithCancellation(anchor);\n this.previewActive = false;\n }\n }\n\n private async safeReRenderWithCancellation(anchor?: { page: number; ratio: number }) {\n // If a render is in progress, queue once with the most recent anchor\n if (this.renderLockCount > 0) {\n this.reRenderQueued = true;\n if (anchor) this.pendingAnchor = anchor;\n return;\n }\n try {\n this.renderLockCount++;\n if (this.continuous) {\n await this.renderAllPages(anchor);\n } else {\n await this.render();\n }\n } finally {\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n if (this.renderLockCount === 0 && this.reRenderQueued) {\n const nextAnchor = this.pendingAnchor;\n this.reRenderQueued = false;\n this.pendingAnchor = undefined;\n await this.safeReRenderWithCancellation(nextAnchor);\n }\n }\n }\n\n private captureScrollAnchor(container: HTMLElement, client?: { x: number; y: number } | null): { page: number; ratio: number } | null {\n try {\n const pages = Array.from(container.querySelectorAll<HTMLElement>('.pdf-page'));\n const centerY = container.scrollTop + container.clientHeight / 2;\n if (pages.length > 0) {\n let pageEl = pages.find(el => (el.offsetTop <= centerY && (el.offsetTop + el.offsetHeight) >= centerY))\n || pages.find(el => (el.offsetTop + el.offsetHeight) > (container.scrollTop + 1))\n || pages[0];\n const page = parseInt(pageEl.getAttribute('data-page') || '1', 10);\n const height = Math.max(1, pageEl.offsetHeight);\n const ratio = Math.max(0, Math.min(1, (centerY - pageEl.offsetTop) / height));\n return { page, ratio };\n }\n // Fallback: single-canvas mode\n const canvas = container.querySelector('canvas');\n if (!canvas) return null;\n const height = Math.max(1, (canvas as HTMLElement).offsetHeight);\n const ratio = Math.max(0, Math.min(1, (centerY - (canvas as HTMLElement).offsetTop) / height));\n return { page: 1, ratio };\n } catch {\n return null;\n }\n }\n\n private restoreScrollAnchor(container: HTMLElement, anchor: { page: number; ratio: number }): void {\n try {\n let el = container.querySelector<HTMLElement>(`[data-page=\"${anchor.page}\"]`);\n if (!el) el = container.querySelector<HTMLElement>('canvas');\n if (!el) return;\n const prevBehavior = container.style.scrollBehavior;\n container.style.scrollBehavior = 'auto';\n const height = Math.max(1, el.offsetHeight);\n const desired = el.offsetTop + anchor.ratio * height - container.clientHeight / 2;\n const maxScroll = Math.max(0, container.scrollHeight - container.clientHeight);\n container.scrollTop = Math.max(0, Math.min(maxScroll, desired));\n container.style.scrollBehavior = prevBehavior;\n } catch {}\n }\n\n async download() {\n const filename = this.deriveFilename();\n const link = document.createElement('a');\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && (navigator as any).maxTouchPoints > 1);\n let popup: Window | null = null;\n if (isIOS) {\n // Open a tab synchronously to stay within user gesture\n try { popup = window.open('', '_blank', 'noopener,noreferrer'); } catch { popup = null; }\n }\n\n const blob = await this.createBlobFromSrc();\n if (blob) {\n const url = URL.createObjectURL(blob);\n if (isIOS) {\n if (popup) {\n try { popup.location.href = url; } catch { /* ignore */ }\n // Revoke later to allow the view to load fully\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n } else {\n const a = document.createElement('a');\n a.href = url;\n a.target = '_blank';\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n }\n } else {\n link.href = url;\n link.download = filename;\n link.rel = 'noopener';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n }\n return;\n }\n\n // Fallback: cross-origin without CORS\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (!href) return;\n if (isIOS) {\n if (popup) {\n try { popup.location.href = href; } catch { /* ignore */ }\n } else {\n const a = document.createElement('a');\n a.href = href;\n a.target = '_blank';\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n } else {\n link.href = href;\n link.target = '_blank';\n link.rel = 'noopener';\n link.download = filename; // browsers may ignore for cross-origin\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n }\n\n async print() {\n // Robust, plugin-free printing by rendering pages to images\n const ok = await this.printViaImages();\n if (ok) return;\n // Fallbacks\n const blob = await this.createBlobFromSrc();\n if (blob) {\n const url = URL.createObjectURL(blob);\n const win = window.open('', '_blank', 'noopener,noreferrer');\n if (win) {\n win.document.write('<!doctype html><html><head><title>Print</title><meta charset=\"utf-8\"><style>html,body{height:100%;margin:0}@page{size:auto;margin:0} iframe{border:0;width:100%;height:100%}</style></head><body><iframe src=\"' + url + '\"></iframe></body></html>');\n win.document.close();\n setTimeout(() => { try { win.focus(); win.print(); } catch {} }, 800);\n win.onafterprint = () => { try { win.close(); } catch {} URL.revokeObjectURL(url); };\n } else {\n const iframe = document.createElement('iframe');\n iframe.style.position = 'fixed'; iframe.style.right = '0'; iframe.style.bottom = '0';\n iframe.style.width = '0'; iframe.style.height = '0'; iframe.style.border = '0';\n iframe.src = url; document.body.appendChild(iframe);\n iframe.onload = () => { try { setTimeout(() => iframe.contentWindow?.print(), 800); } catch {} setTimeout(() => { URL.revokeObjectURL(url); iframe.remove(); }, 3000); };\n }\n return;\n }\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (href) window.open(href, '_blank');\n }\n\n private async printViaImages(): Promise<boolean> {\n try {\n let doc = this.doc;\n if (!doc) {\n doc = await this.loadDocumentWithFallbacks(this.src);\n }\n if (!doc) return false;\n const win = window.open('', '_blank', 'noopener,noreferrer');\n if (!win) return false;\n win.document.write('<!doctype html><html><head><meta charset=\"utf-8\"><title>Print</title><style>@page{size:auto;margin:0} html,body{margin:0;padding:0} .page{page-break-after:always;}</style></head><body></body></html>');\n win.document.close();\n\n for (let i = 1; i <= doc.numPages; i++) {\n const page = await doc.getPage(i);\n const vp = page.getViewport({ scale: this.PRINT_SCALE });\n const canvas = document.createElement('canvas');\n canvas.width = Math.floor(vp.width);\n canvas.height = Math.floor(vp.height);\n const ctx = canvas.getContext('2d')!;\n await page.render({ canvas, canvasContext: ctx, viewport: vp }).promise;\n const img = win.document.createElement('img');\n img.className = 'page';\n img.style.width = '100%';\n img.style.display = 'block';\n img.src = canvas.toDataURL('image/png');\n win.document.body.appendChild(img);\n }\n setTimeout(() => { try { win.focus(); win.print(); } catch {} }, 300);\n win.onafterprint = () => { try { win.close(); } catch {} };\n setTimeout(() => { try { win.close(); } catch {} }, 60000);\n return true;\n } catch {\n return false;\n }\n }\n\n private async createBlobFromSrc(): Promise<Blob | null> {\n if (!this.src) return null;\n if (this.src instanceof Blob) return this.src;\n if (this.src instanceof Uint8Array) {\n const ab = new ArrayBuffer(this.src.byteLength);\n new Uint8Array(ab).set(this.src);\n return new Blob([ab], { type: 'application/pdf' });\n }\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (!href || typeof fetch === 'undefined') return null;\n try {\n const res = await fetch(href, {\n mode: 'cors',\n headers: this.httpHeaders,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) return null;\n const blob = await res.blob();\n return blob.type ? blob : new Blob([await res.arrayBuffer()], { type: 'application/pdf' });\n } catch {\n return null;\n }\n }\n\n private deriveFilename(): string {\n if (typeof this.src === 'string') {\n try { const u = new URL(this.src, window.location.origin); return this.basename(u.pathname) || 'document.pdf'; } catch { return 'document.pdf'; }\n }\n if (this.src instanceof URL) {\n return this.basename(this.src.pathname) || 'document.pdf';\n }\n return 'document.pdf';\n }\n\n private basename(path: string): string {\n const last = path.split('/').filter(Boolean).pop() || '';\n return last.endsWith('.pdf') ? last : (last ? last + '.pdf' : 'document.pdf');\n }\n}\n","import { APP_INITIALIZER, InjectionToken, Provider, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport * as pdfjsLib from 'pdfjs-dist';\n\nexport type GenusPdfWorkerConfig = {\n /** Try ESM module worker first (best); falls back to workerSrc if creation fails. */\n tryModuleWorker?: boolean;\n /** Optional absolute URL for worker file. If omitted, package-shipped worker is used. */\n workerSrc?: string;\n /** If true, preloads pdf.js worker handler in-package for fake-worker fallback. */\n inlineWorkerFallback?: boolean;\n};\n\nexport const GENUS_PDF_WORKER_CONFIG = new InjectionToken<GenusPdfWorkerConfig>('GENUS_PDF_WORKER_CONFIG');\n\nfunction resolveBundledWorkerUrl(): string | null {\n try {\n return new URL('../workers/pdf.worker.min.mjs', import.meta.url).toString();\n } catch {\n return null;\n }\n}\n\nasync function setupInlineWorkerFallback(): Promise<void> {\n const g = globalThis as any;\n if (g?.pdfjsWorker?.WorkerMessageHandler) return;\n try {\n // @ts-ignore pdfjs-dist worker entry does not ship declaration files.\n const workerModule: any = await import('pdfjs-dist/build/pdf.worker.min.mjs');\n if (workerModule?.WorkerMessageHandler) {\n g.pdfjsWorker = { ...(g.pdfjsWorker || {}), WorkerMessageHandler: workerModule.WorkerMessageHandler };\n }\n } catch {}\n}\n\nfunction initPdfWorkerFactory(cfg: GenusPdfWorkerConfig, platformId: object) {\n return async () => {\n if (!isPlatformBrowser(platformId)) return;\n\n const defaults: Required<Pick<GenusPdfWorkerConfig, 'tryModuleWorker' | 'inlineWorkerFallback'>> = {\n tryModuleWorker: true,\n inlineWorkerFallback: true,\n };\n const merged = { ...defaults, ...cfg };\n\n const globalOptions = (pdfjsLib as any).GlobalWorkerOptions;\n globalOptions.workerPort = null;\n if (merged.inlineWorkerFallback) {\n await setupInlineWorkerFallback();\n }\n if (typeof merged.workerSrc === 'string' && merged.workerSrc.length > 0) {\n globalOptions.workerSrc = merged.workerSrc;\n return;\n }\n const bundledWorkerUrl = resolveBundledWorkerUrl();\n if (!merged.tryModuleWorker) {\n globalOptions.workerSrc = bundledWorkerUrl || '/assets/pdf.worker.min.js';\n return;\n }\n globalOptions.workerSrc = bundledWorkerUrl || '/assets/pdf.worker.min.js';\n };\n}\n\nexport function provideGenusPdfViewer(cfg: GenusPdfWorkerConfig = {}): Provider[] {\n return [\n { provide: GENUS_PDF_WORKER_CONFIG, useValue: cfg },\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: initPdfWorkerFactory,\n deps: [GENUS_PDF_WORKER_CONFIG, PLATFORM_ID],\n },\n ];\n}\n","/*\n * Public API Surface of genus-pdf-viewer\n */\n\nexport * from './lib/genus-pdf-viewer';\nexport { GenusPdfViewerComponent } from './lib/genus-pdf-viewer';\nexport * from './lib/pdfjs-worker.provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"genus-pdf-viewer.mjs","sources":["../../../projects/genus-pdf-viewer/src/lib/genus-pdf-viewer.ts","../../../projects/genus-pdf-viewer/src/lib/pdfjs-worker.provider.ts","../../../projects/genus-pdf-viewer/src/public-api.ts","../../../projects/genus-pdf-viewer/src/genus-pdf-viewer.ts"],"sourcesContent":["import { Component, Input, ViewChild, ElementRef, OnChanges, SimpleChanges, effect, signal, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type {\n DocumentInitParameters,\n PDFDocumentLoadingTask,\n PDFDocumentProxy,\n PDFPageProxy,\n} from 'pdfjs-dist/types/src/display/api';\n\n@Component({\n selector: 'genus-pdf-viewer',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"genus-pdf-shell\">\n <ng-content select=\"[toolbar]\"></ng-content>\n\n <div class=\"genus-pdf-toolbar\" *ngIf=\"showToolbar\">\n <button type=\"button\" title=\"Zoom out\" aria-label=\"Zoom out\" (click)=\"zoomOut()\">−</button>\n <span class=\"pct\">{{ (zoomSig() * 100) | number:'1.0-0' }}%</span>\n <button type=\"button\" title=\"Zoom in\" aria-label=\"Zoom in\" (click)=\"zoomIn()\">+</button>\n <button type=\"button\" *ngIf=\"isZoomed()\" title=\"Reset zoom to 100%\" aria-label=\"Reset zoom to 100%\" (click)=\"resetZoom()\">100%</button>\n <span class=\"spacer\"></span>\n <button type=\"button\" title=\"Previous page\" aria-label=\"Previous page\" (click)=\"prevPage()\" [disabled]=\"pageSig() <= 1\">⟨</button>\n <span>{{ pageSig() }} / {{ pageCount() }}</span>\n <button type=\"button\" title=\"Next page\" aria-label=\"Next page\" (click)=\"nextPage()\" [disabled]=\"doc ? pageSig() >= doc.numPages : true\">⟩</button>\n <span class=\"spacer\"></span>\n <button type=\"button\" class=\"download-btn\" title=\"Download\" aria-label=\"Download\" (click)=\"download()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12 3v10m0 0 4-4m-4 4-4-4M5 15v3a3 3 0 0 0 3 3h8a3 3 0 0 0 3-3v-3\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </button>\n </div>\n\n <div class=\"genus-pdf-stage\" #singleStage [style.display]=\"continuous ? 'none' : 'flex'\" [class.can-pan]=\"canPan()\" [class.is-panning]=\"isPanning()\" (pointerdown)=\"onPointerDown($event, singleStage)\" (wheel)=\"onWheel($event, singleStage)\" (scroll)=\"onScroll($event)\">\n <iframe *ngIf=\"iframeFallbackSrc()\" class=\"genus-pdf-iframe\" [src]=\"iframeFallbackSrc()\" title=\"PDF document\"></iframe>\n <div class=\"genus-pdf-overlay\" *ngIf=\"loading() && !iframeFallbackSrc()\"><div class=\"spinner\" aria-label=\"Loading\"></div></div>\n <div class=\"genus-pdf-overlay error\" *ngIf=\"error() && !iframeFallbackSrc()\">\n <div style=\"display:flex;flex-direction:column;gap:8px;align-items:center;\">\n <span>{{ error() }}</span>\n <button type=\"button\" (click)=\"retryLoad()\">Retry</button>\n </div>\n </div>\n <canvas #canvas [style.display]=\"iframeFallbackSrc() ? 'none' : 'block'\"></canvas>\n </div>\n\n <div class=\"genus-pdf-stage genus-pdf-stage--continuous\" #stage [style.display]=\"continuous ? 'block' : 'none'\" [class.can-pan]=\"canPan()\" [class.is-panning]=\"isPanning()\" (pointerdown)=\"onPointerDown($event, stage)\" (wheel)=\"onWheel($event, stage)\" (scroll)=\"onScroll($event)\">\n <iframe *ngIf=\"iframeFallbackSrc()\" class=\"genus-pdf-iframe\" [src]=\"iframeFallbackSrc()\" title=\"PDF document\"></iframe>\n <div class=\"genus-pdf-overlay\" *ngIf=\"loading() && !iframeFallbackSrc()\"><div class=\"spinner\" aria-label=\"Loading\"></div></div>\n <div class=\"genus-pdf-overlay error\" *ngIf=\"error() && !iframeFallbackSrc()\">\n <div style=\"display:flex;flex-direction:column;gap:8px;align-items:center;\">\n <span>{{ error() }}</span>\n <button type=\"button\" (click)=\"retryLoad()\">Retry</button>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .genus-pdf-shell { display:flex; flex-direction:column; gap:8px; width:100%; height:100%; background:#f3f4f6; }\n .genus-pdf-toolbar { position:sticky; top:0; z-index:2; display:flex; align-items:center; gap:8px; padding:6px 8px; border:1px solid #e5e7eb; border-radius:8px; background:#ffffffd9; backdrop-filter:saturate(1.2) blur(6px); box-shadow:0 1px 2px rgba(0,0,0,0.06); }\n .genus-pdf-toolbar .pct { min-width: 48px; text-align:center; font-variant-numeric: tabular-nums; color:#111827; }\n .genus-pdf-toolbar button { appearance:none; border:1px solid #e5e7eb; background:#fff; padding:6px 10px; border-radius:6px; cursor:pointer; color:#111827; font-size:14px; line-height:1; font-weight:500; min-width:32px; user-select:none; display:inline-flex; align-items:center; gap:6px; }\n .genus-pdf-toolbar button.download-btn { background:#2563eb; border-color:#2563eb; color:#fff; }\n .genus-pdf-toolbar button.download-btn:hover { background:#1d4ed8; border-color:#1d4ed8; }\n .genus-pdf-toolbar button:disabled { opacity:0.5; cursor:not-allowed; }\n .genus-pdf-toolbar .spacer { flex:1; }\n .genus-pdf-stage { position:relative; flex:1; overflow:auto; display:flex; align-items:flex-start; justify-content:center; background:#fafafa; touch-action: pan-y; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; overscroll-behavior-y: contain; }\n .genus-pdf-stage.can-pan { cursor: grab; touch-action: none; }\n .genus-pdf-stage.is-panning { cursor: grabbing; }\n .genus-pdf-stage--continuous { display:block; align-items:unset; justify-content:unset; padding:8px; scroll-behavior:smooth; }\n .genus-pdf-stage--continuous .pdf-page { margin:0 auto 12px auto; background:white; box-shadow:0 1px 2px rgba(0,0,0,0.08); }\n canvas { display:block; max-width:100%; height:auto; }\n .genus-pdf-iframe { width:100%; height:100%; border:0; background:#fff; }\n .genus-pdf-overlay { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; background:rgba(255,255,255,0.7); z-index:1; }\n .genus-pdf-overlay.error { background:transparent; }\n .spinner { width:28px; height:28px; border-radius:50%; border:3px solid #e5e7eb; border-top-color:#111827; animation:spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0) } to { transform: rotate(360deg) } }\n `]\n})\nexport class GenusPdfViewerComponent implements OnChanges {\n private static inlineWorkerSetupPromise: Promise<void> | null = null;\n private readonly sanitizer = inject(DomSanitizer);\n\n @Input() src!: string | URL | Uint8Array | Blob;\n @Input() page = 1;\n @Input() zoom = 1.0;\n @Input() maxZoom = 4;\n @Input() minZoom = 0.25;\n @Input() fit: 'width'|'height'|'page'|'none' = 'width';\n @Input() disableTextLayer = true;\n @Input() continuous = true;\n @Input() showToolbar = true;\n @Input() zoomAnimation = true;\n @Input() zoomAnimationMs = 180;\n @Input() gestureAnimationMs = 120;\n @Input() loadTimeoutMs = 45000;\n @Input() allowIframeFallback = true;\n @Input() withCredentials = false;\n @Input() httpHeaders?: Record<string, string>;\n\n @ViewChild('canvas', { static: false }) canvas!: ElementRef<HTMLCanvasElement>;\n @ViewChild('singleStage', { static: false }) singleStage!: ElementRef<HTMLDivElement>;\n @ViewChild('stage', { static: false }) stage!: ElementRef<HTMLDivElement>;\n\n doc?: PDFDocumentProxy;\n private currentPage?: PDFPageProxy;\n\n pageSig = signal(1);\n zoomSig = signal(1);\n isPanning = signal(false);\n canPan = signal(false);\n loading = signal(false);\n error = signal<string | null>(null);\n iframeFallbackSrc = signal<SafeResourceUrl | null>(null);\n private readonly PRINT_SCALE = 2;\n private scrollRaf = 0 as any;\n private renderLockCount = 0;\n private zoomAnimInFlight = false;\n private activeRenderTasks = new Set<any>();\n private wheelRaf = 0 as any;\n private pinchState: { id1: number; id2: number; startDist: number; startZoom: number } | null = null;\n private activePointers = new Map<number, { x: number; y: number; type: string }>();\n private renderVersion = 0;\n private previewActive = false;\n private reRenderQueued = false;\n private pendingAnchor: { page: number; ratio: number } | undefined;\n private lastZoomClient: { x: number; y: number } | null = null;\n private readonly WHEEL_STEP = 0.02;\n private readonly PINCH_SENSITIVITY = 0.5;\n private wheelCommitTimer = 0 as any;\n private lastLoadError: unknown = null;\n \n\n constructor() {\n effect(() => {\n // Only react to zoom changes here; page changes in continuous mode should NOT trigger a re-render\n this.zoomSig();\n if (this.renderLockCount > 0 || this.previewActive) return;\n this.safeRender();\n });\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['page']) this.pageSig.set(this.page);\n if (changes['zoom']) this.zoomSig.set(this.zoom);\n\n const srcChanged = !!changes['src'];\n const layoutChanged = !!(changes['fit'] || changes['minZoom'] || changes['maxZoom']);\n\n if (!this.src) return;\n\n if (srcChanged) {\n await this.loadDocument();\n\n if (this.doc) {\n const pages = this.doc.numPages;\n if (this.pageSig() < 1) this.pageSig.set(1);\n if (this.pageSig() > pages) this.pageSig.set(pages);\n await this.render();\n }\n return;\n }\n\n if (layoutChanged) {\n if (this.continuous) {\n const container = this.stage?.nativeElement;\n const anchor = container ? this.captureScrollAnchor(container) || undefined : undefined;\n await this.renderAllPages(anchor);\n } else {\n await this.render();\n }\n return;\n }\n\n if (!this.continuous && changes['page']) {\n await this.render();\n }\n }\n\n async safeRender() {\n try { await this.render(); } catch (_) {}\n }\n\n private async loadDocument() {\n this.loading.set(true);\n this.error.set(null);\n this.iframeFallbackSrc.set(null);\n this.lastLoadError = null;\n if (this.doc) {\n try { await this.doc.destroy(); } catch {}\n this.doc = undefined;\n }\n try {\n this.doc = await this.loadDocumentWithFallbacks(this.src);\n if (!this.doc) {\n if (!this.tryEnableIframeFallback()) {\n this.error.set(this.buildLoadErrorMessage());\n }\n }\n } catch {\n this.doc = undefined;\n if (!this.tryEnableIframeFallback()) {\n this.error.set(this.buildLoadErrorMessage());\n }\n } finally {\n this.loading.set(false);\n }\n }\n\n private async loadDocumentWithFallbacks(src: string | URL | Uint8Array | Blob): Promise<PDFDocumentProxy | undefined> {\n await this.ensureInlineWorkerFallback();\n const workerCandidates = this.getWorkerSrcCandidates();\n const baseTimeout = this.getEffectiveLoadTimeoutMs();\n const primary = this.createPrimaryParams(src);\n if (primary && workerCandidates.length) {\n for (let i = 0; i < workerCandidates.length; i++) {\n this.applyWorkerSrc(workerCandidates[i]);\n const timeoutMs = i === 0 ? baseTimeout : Math.min(baseTimeout, 12000);\n const doc = await this.tryLoadDocument(primary, timeoutMs);\n if (doc) return doc;\n }\n } else if (primary) {\n const doc = await this.tryLoadDocument(primary, baseTimeout);\n if (doc) return doc;\n }\n\n const bytes = await this.toPdfBytes(src);\n if (!bytes) return undefined;\n\n const byteParams: DocumentInitParameters = {\n data: bytes,\n disableRange: true,\n disableStream: true,\n disableAutoFetch: true,\n stopAtErrors: true,\n };\n if (workerCandidates.length) {\n for (let i = 0; i < workerCandidates.length; i++) {\n this.applyWorkerSrc(workerCandidates[i]);\n const timeoutMs = i === 0 ? baseTimeout : Math.min(baseTimeout, 12000);\n const doc = await this.tryLoadDocument(byteParams, timeoutMs);\n if (doc) return doc;\n }\n return undefined;\n }\n return this.tryLoadDocument(byteParams, baseTimeout);\n }\n\n private createPrimaryParams(src: string | URL | Uint8Array | Blob): DocumentInitParameters | null {\n if (typeof src === 'string') {\n return {\n url: src,\n withCredentials: this.withCredentials,\n httpHeaders: this.httpHeaders,\n stopAtErrors: true,\n };\n }\n if (src instanceof URL) {\n return {\n url: src.toString(),\n withCredentials: this.withCredentials,\n httpHeaders: this.httpHeaders,\n stopAtErrors: true,\n };\n }\n if (src instanceof Uint8Array) {\n const copy = new Uint8Array(src.byteLength);\n copy.set(src);\n return {\n data: copy,\n disableRange: true,\n disableStream: true,\n disableAutoFetch: true,\n stopAtErrors: true,\n };\n }\n return null;\n }\n\n private async tryLoadDocument(params: DocumentInitParameters, timeoutMs: number): Promise<PDFDocumentProxy | undefined> {\n const task = pdfjsLib.getDocument(params as any) as PDFDocumentLoadingTask;\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n if (timeoutMs <= 0) {\n return await task.promise;\n }\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('PDF load timeout')), timeoutMs);\n });\n return await Promise.race([task.promise, timeoutPromise]);\n } catch (e) {\n this.lastLoadError = e;\n try { await task.destroy(); } catch {}\n return undefined;\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private getEffectiveLoadTimeoutMs(): number {\n if (!Number.isFinite(this.loadTimeoutMs)) return 45000;\n if (this.loadTimeoutMs <= 0) return 0;\n return Math.max(5000, this.loadTimeoutMs);\n }\n\n private async ensureInlineWorkerFallback(): Promise<void> {\n if (typeof window === 'undefined') return;\n const g = globalThis as any;\n if (g?.pdfjsWorker?.WorkerMessageHandler) return;\n if (!GenusPdfViewerComponent.inlineWorkerSetupPromise) {\n GenusPdfViewerComponent.inlineWorkerSetupPromise = (async () => {\n try {\n // @ts-ignore pdfjs-dist worker entry does not ship declaration files.\n const workerModule: any = await import('pdfjs-dist/build/pdf.worker.min.mjs');\n if (workerModule?.WorkerMessageHandler) {\n g.pdfjsWorker = { ...(g.pdfjsWorker || {}), WorkerMessageHandler: workerModule.WorkerMessageHandler };\n }\n } catch {}\n })();\n }\n await GenusPdfViewerComponent.inlineWorkerSetupPromise;\n }\n\n private resolveBundledWorkerSrc(): string | null {\n try {\n return new URL('../workers/pdf.worker.min.mjs', import.meta.url).toString();\n } catch {\n return null;\n }\n }\n\n private getWorkerSrcCandidates(): string[] {\n const options = (pdfjsLib as any).GlobalWorkerOptions || {};\n const current = typeof options.workerSrc === 'string' ? options.workerSrc : '';\n const bundled = this.resolveBundledWorkerSrc() || '';\n const assetJs = '/assets/pdf.worker.min.js';\n const assetMjs = '/assets/pdf.worker.min.mjs';\n const candidates = [bundled, current, assetJs, assetMjs].filter((v) => !!v);\n return Array.from(new Set(candidates));\n }\n\n private applyWorkerSrc(workerSrc: string): void {\n const options = (pdfjsLib as any).GlobalWorkerOptions || {};\n options.workerPort = null;\n options.workerSrc = workerSrc;\n }\n\n private buildLoadErrorMessage(): string {\n const raw = this.extractErrorText(this.lastLoadError).trim();\n const lower = raw.toLowerCase();\n if (lower.includes('worker')) {\n return 'PDF worker bootstrap failed. Check CSP/network restrictions for dynamic imports and retry.';\n }\n if (lower.includes('cors') || lower.includes('network') || lower.includes('fetch')) {\n return 'PDF request failed. Check file URL, network, and CORS policy, then retry.';\n }\n if (lower.includes('password')) {\n return 'This PDF appears to be password protected.';\n }\n return 'Failed to load PDF. Check URL/CORS and worker setup, then retry.';\n }\n\n private tryEnableIframeFallback(): boolean {\n if (!this.allowIframeFallback) return false;\n if (!this.isLikelyNetworkOrCorsError()) return false;\n const href = this.toFallbackHref(this.src);\n if (!href) return false;\n this.iframeFallbackSrc.set(this.sanitizer.bypassSecurityTrustResourceUrl(href));\n this.error.set(null);\n this.pageSig.set(1);\n return true;\n }\n\n private isLikelyNetworkOrCorsError(): boolean {\n const lower = this.extractErrorText(this.lastLoadError).toLowerCase();\n return (\n lower.includes('cors') ||\n lower.includes('network') ||\n lower.includes('fetch') ||\n lower.includes('load failed') ||\n lower.includes('failed to fetch') ||\n lower.includes('securityerror')\n );\n }\n\n private toFallbackHref(src: string | URL | Uint8Array | Blob): string | null {\n if (typeof window === 'undefined') return null;\n if (typeof src === 'string') {\n try {\n const url = new URL(src, window.location.href);\n if (!['http:', 'https:', 'blob:', 'data:'].includes(url.protocol)) return null;\n return url.toString();\n } catch {\n return null;\n }\n }\n if (src instanceof URL) {\n if (!['http:', 'https:', 'blob:', 'data:'].includes(src.protocol)) return null;\n return src.toString();\n }\n return null;\n }\n\n private extractErrorText(error: unknown): string {\n if (!error) return '';\n if (typeof error === 'string') return error;\n if (typeof error === 'object') {\n const maybeMessage = (error as { message?: unknown }).message;\n if (typeof maybeMessage === 'string') return maybeMessage;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n return String(error);\n }\n\n private async toPdfBytes(src: string | URL | Uint8Array | Blob): Promise<Uint8Array | null> {\n if (src instanceof Uint8Array) {\n const copy = new Uint8Array(src.byteLength);\n copy.set(src);\n return copy;\n }\n if (src instanceof Blob) {\n try {\n return new Uint8Array(await src.arrayBuffer());\n } catch {\n return null;\n }\n }\n const href = typeof src === 'string' ? src : src.toString();\n if (typeof fetch === 'undefined') return null;\n try {\n const res = await fetch(href, {\n mode: 'cors',\n headers: this.httpHeaders,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) return null;\n return new Uint8Array(await res.arrayBuffer());\n } catch {\n return null;\n }\n }\n\n async render() {\n if (!this.doc) return;\n const version = ++this.renderVersion;\n if (this.continuous) {\n await this.renderAllPages();\n return;\n }\n\n const pageNum = this.pageSig();\n const pdfPage = await this.doc.getPage(pageNum);\n this.currentPage = pdfPage;\n\n const canvas = this.canvas?.nativeElement;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n\n const baseViewport = pdfPage.getViewport({ scale: 1 });\n const parent = canvas.parentElement!;\n const anchor = this.captureScrollAnchor(parent) || undefined;\n const pW = parent.clientWidth, pH = parent.clientHeight || baseViewport.height;\n\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (pW - 16) / baseViewport.width;\n if (this.fit === 'height') baseScale = (pH - 16) / baseViewport.height;\n if (this.fit === 'page') baseScale = Math.min((pW - 16) / baseViewport.width, (pH - 16) / baseViewport.height);\n\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n this.canPan.set(finalScale > baseScale + 0.001);\n const viewport = pdfPage.getViewport({ scale: finalScale });\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = pdfPage.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n if (anchor) this.restoreScrollAnchor(parent, anchor);\n }\n\n private async renderAllPages(anchorOverride?: { page: number; ratio: number }) {\n if (!this.doc) return;\n const stageEl = this.stage?.nativeElement;\n if (!stageEl) return;\n const version = ++this.renderVersion;\n const anchor = anchorOverride ?? this.captureScrollAnchor(stageEl);\n const total = this.doc.numPages;\n const parentRect = stageEl.getBoundingClientRect();\n const parentWidth = parentRect.width || stageEl.clientWidth || 800;\n let computedCanPan = false;\n const existing = Array.from(stageEl.querySelectorAll<HTMLElement>('.pdf-page'));\n const isInitialBuild = existing.length !== total;\n this.renderLockCount++;\n try {\n if (isInitialBuild) {\n stageEl.innerHTML = '';\n const contentEl = document.createElement('div');\n contentEl.className = 'pdf-content';\n stageEl.appendChild(contentEl);\n for (let i = 1; i <= total; i++) {\n const page = await this.doc.getPage(i);\n const baseViewport = page.getViewport({ scale: 1 });\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (parentWidth - 16) / baseViewport.width;\n if (this.fit === 'page') baseScale = (parentWidth - 16) / baseViewport.width;\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n if (i === 1) computedCanPan = finalScale > baseScale + 0.001;\n const viewport = page.getViewport({ scale: finalScale });\n\n const wrapper = document.createElement('div');\n wrapper.className = 'pdf-page';\n wrapper.setAttribute('data-page', String(i));\n wrapper.style.width = Math.floor(viewport.width) + 'px';\n wrapper.style.height = Math.floor(viewport.height) + 'px';\n wrapper.style.margin = '0 auto 12px auto';\n\n const canvas = document.createElement('canvas');\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const ctx = canvas.getContext('2d')!;\n\n wrapper.appendChild(canvas);\n contentEl.appendChild(wrapper);\n\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = page.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n }\n } else {\n let contentEl = stageEl.querySelector<HTMLElement>('.pdf-content');\n if (!contentEl) {\n contentEl = document.createElement('div');\n contentEl.className = 'pdf-content';\n const pages = Array.from(stageEl.querySelectorAll<HTMLElement>('.pdf-page'));\n for (const el of pages) contentEl.appendChild(el);\n stageEl.appendChild(contentEl);\n }\n for (let i = 1; i <= total; i++) {\n const page = await this.doc.getPage(i);\n const baseViewport = page.getViewport({ scale: 1 });\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (parentWidth - 16) / baseViewport.width;\n if (this.fit === 'page') baseScale = (parentWidth - 16) / baseViewport.width;\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n if (i === 1) computedCanPan = finalScale > baseScale + 0.001;\n const viewport = page.getViewport({ scale: finalScale });\n\n const wrapper = existing[i - 1];\n const canvas = wrapper.querySelector('canvas') as HTMLCanvasElement;\n wrapper.style.width = Math.floor(viewport.width) + 'px';\n wrapper.style.height = Math.floor(viewport.height) + 'px';\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const ctx = canvas.getContext('2d')!;\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = page.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n }\n }\n this.canPan.set(computedCanPan);\n if (anchor) this.restoreScrollAnchor(stageEl, anchor);\n } finally {\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n }\n }\n\n async goTo(page: number) {\n if (!this.doc) return;\n const p = Math.max(1, Math.min(this.doc.numPages, page));\n this.pageSig.set(p);\n if (this.continuous) {\n const stageEl = this.stage?.nativeElement;\n const el = stageEl?.querySelector(`[data-page=\"${p}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n } else {\n await this.render();\n }\n }\n async zoomIn(step = 0.1) { await this.applyZoomDelta(step); }\n async zoomOut(step = 0.1) { await this.applyZoomDelta(-step); }\n\n private clampZoom(z: number): number {\n return Math.max(this.minZoom, Math.min(this.maxZoom, z));\n }\n\n private cancelPreviewIfAny(container?: HTMLElement): void {\n if (!this.previewActive || !container) return;\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n try {\n target.style.transform = '';\n target.style.willChange = '';\n target.style.transition = '';\n } catch {}\n this.previewActive = false;\n this.lastZoomClient = null;\n }\n\n private async applyZoomDelta(delta: number): Promise<void> {\n const oldZoom = this.zoomSig();\n const newZoom = this.clampZoom(oldZoom + delta);\n if (Math.abs(newZoom - oldZoom) < 0.0001) return;\n\n const container = this.continuous ? this.stage?.nativeElement : this.singleStage?.nativeElement;\n // If a preview transform is active (from pinch/wheel), clear it before capturing anchor or animating\n this.cancelPreviewIfAny(container);\n const anchor = container ? this.captureScrollAnchor(container) || undefined : undefined;\n const ratio = newZoom / oldZoom;\n\n if (this.zoomAnimation && container && !this.zoomAnimInFlight) {\n this.zoomAnimInFlight = true;\n this.renderLockCount++;\n // Update UI value immediately\n this.zoomSig.set(newZoom);\n try {\n await this.runZoomAnimation(container, ratio);\n } finally {\n // Release the render lock before triggering the actual re-render\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n await this.safeReRenderWithCancellation(anchor);\n this.zoomAnimInFlight = false;\n }\n } else {\n this.zoomSig.set(newZoom);\n await this.safeReRenderWithCancellation(anchor);\n }\n }\n\n private async runZoomAnimation(container: HTMLElement, ratio: number): Promise<void> {\n if (Math.abs(ratio - 1) < 0.0001) return;\n const { target, originX, originY } = this.getZoomAnimTarget(container);\n return new Promise<void>((resolve) => {\n try {\n const onDone = () => {\n cleanup();\n resolve();\n };\n const cleanup = () => {\n target.removeEventListener('transitionend', onEnd as any);\n target.style.transition = '';\n target.style.transform = '';\n target.style.transformOrigin = '';\n target.style.willChange = '';\n };\n const onEnd = () => onDone();\n target.style.willChange = 'transform';\n target.style.transformOrigin = `${Math.max(0, originX)}px ${Math.max(0, originY)}px`;\n target.style.transition = 'none';\n target.style.transform = 'scale(1)';\n requestAnimationFrame(() => {\n target.addEventListener('transitionend', onEnd as any, { once: true } as any);\n target.style.transition = `transform ${this.zoomAnimationMs}ms cubic-bezier(0.2,0,0,1)`;\n target.style.transform = `scale(${ratio})`;\n setTimeout(onDone, this.zoomAnimationMs + 60);\n });\n } catch {\n resolve();\n }\n });\n }\n\n private getZoomAnimTarget(container: HTMLElement): { target: HTMLElement; originX: number; originY: number } {\n const isContinuous = this.continuous;\n let target: HTMLElement | null = null;\n if (isContinuous) {\n target = container.querySelector<HTMLElement>('.pdf-content');\n if (!target) target = container; // fallback\n } else {\n target = container.querySelector<HTMLElement>('canvas');\n if (!target) target = container; // fallback\n }\n const rectLeft = target.offsetLeft;\n const rectTop = target.offsetTop;\n // Prefer last gesture point (pinch center or wheel pointer) if available\n const client = this.lastZoomClient;\n const originX = client ? (container.scrollLeft + client.x - rectLeft) : (container.scrollLeft + container.clientWidth / 2 - rectLeft);\n const originY = client ? (container.scrollTop + client.y - rectTop) : (container.scrollTop + container.clientHeight / 2 - rectTop);\n return { target, originX, originY };\n }\n\n onScroll(evt: Event) {\n const container = evt.target as HTMLElement;\n // debounce via rAF\n if (this.scrollRaf) cancelAnimationFrame(this.scrollRaf);\n this.scrollRaf = requestAnimationFrame(() => {\n if (!this.doc || !this.continuous) return;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('.pdf-page'));\n if (!pages.length) return;\n const centerY = container.scrollTop + container.clientHeight / 2;\n let current = this.pageSig();\n for (const el of pages) {\n const top = el.offsetTop;\n const bottom = top + el.offsetHeight;\n if (centerY >= top && centerY <= bottom) {\n const p = parseInt(el.getAttribute('data-page') || '1', 10);\n current = p;\n break;\n }\n }\n if (current !== this.pageSig()) this.pageSig.set(current);\n });\n }\n\n async nextPage() { await this.goTo(this.pageSig() + 1); }\n async prevPage() { await this.goTo(this.pageSig() - 1); }\n\n pageCount(): number {\n return this.doc?.numPages ?? (this.iframeFallbackSrc() ? 1 : 0);\n }\n\n isZoomed(): boolean {\n return Math.abs(this.zoomSig() - 1) > 0.0001;\n }\n\n async resetZoom() {\n // Reset to exactly 1.0 (100%)\n const delta = 1 - this.zoomSig();\n await this.applyZoomDelta(delta);\n }\n\n async retryLoad() {\n await this.loadDocument();\n if (this.doc) {\n const pages = this.doc.numPages;\n if (this.pageSig() < 1) this.pageSig.set(1);\n if (this.pageSig() > pages) this.pageSig.set(pages);\n await this.render();\n }\n }\n\n onPointerDown(evt: PointerEvent, containerEl: HTMLElement) {\n // Pinch-to-zoom (two pointers)\n if (evt.pointerType === 'touch') {\n this.activePointers.set(evt.pointerId, { x: evt.clientX, y: evt.clientY, type: evt.pointerType });\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerType === 'touch') this.activePointers.set(e.pointerId, { x: e.clientX, y: e.clientY, type: e.pointerType });\n const touches = Array.from(this.activePointers.entries()).map(([id, p]) => ({ pointerId: id, clientX: p.x, clientY: p.y }))\n .slice(0, 2);\n if (touches.length === 2) {\n const [a, b] = touches;\n const dist = Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n if (!this.pinchState) {\n this.pinchState = { id1: a.pointerId, id2: b.pointerId, startDist: Math.max(1, dist), startZoom: this.zoomSig() };\n const rect = containerEl.getBoundingClientRect();\n this.lastZoomClient = { x: ((a.clientX + b.clientX) / 2) - rect.left, y: ((a.clientY + b.clientY) / 2) - rect.top };\n }\n const scale = dist / Math.max(1, this.pinchState.startDist);\n const adjusted = 1 + (scale - 1) * this.PINCH_SENSITIVITY;\n const desiredAdj = this.clampZoom(this.pinchState.startZoom * adjusted);\n this.previewZoom(containerEl, desiredAdj);\n e.preventDefault();\n return;\n }\n // When pinch ends (not exactly two touches), commit render if we were previewing\n if (this.pinchState) {\n const final = this.zoomSig();\n this.commitPreviewZoom(containerEl, final);\n this.pinchState = null;\n this.lastZoomClient = null;\n }\n };\n const onPointerEnd = (e: PointerEvent) => {\n this.activePointers.delete(e.pointerId);\n const touches = Array.from(this.activePointers.values());\n if (touches.length !== 2 && this.pinchState) {\n const final = this.zoomSig();\n this.commitPreviewZoom(containerEl, final);\n this.pinchState = null;\n this.lastZoomClient = null;\n }\n cleanup();\n };\n const cleanup = () => {\n containerEl.removeEventListener('pointermove', onPointerMove);\n containerEl.removeEventListener('pointerup', onPointerEnd);\n containerEl.removeEventListener('pointercancel', onPointerEnd);\n this.activePointers.clear();\n };\n containerEl.addEventListener('pointermove', onPointerMove);\n containerEl.addEventListener('pointerup', onPointerEnd);\n containerEl.addEventListener('pointercancel', onPointerEnd);\n return;\n }\n\n // Mouse pan when canPan\n if (!this.canPan()) return;\n this.isPanning.set(true);\n const startX = evt.clientX;\n const startY = evt.clientY;\n const startLeft = containerEl.scrollLeft;\n const startTop = containerEl.scrollTop;\n containerEl.style.scrollBehavior = 'auto';\n containerEl.setPointerCapture?.(evt.pointerId);\n const move = (e: PointerEvent) => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n containerEl.scrollLeft = startLeft - dx;\n containerEl.scrollTop = startTop - dy;\n e.preventDefault();\n };\n const end = (e: PointerEvent) => {\n this.isPanning.set(false);\n containerEl.releasePointerCapture?.(evt.pointerId);\n containerEl.removeEventListener('pointermove', move);\n containerEl.removeEventListener('pointerup', end);\n containerEl.removeEventListener('pointercancel', end);\n containerEl.style.scrollBehavior = 'smooth';\n };\n containerEl.addEventListener('pointermove', move);\n containerEl.addEventListener('pointerup', end);\n containerEl.addEventListener('pointercancel', end);\n }\n\n private getActiveTouches(containerEl: HTMLElement): PointerEvent[] {\n // We capture pointer events only on this element; maintain list by querying PointerEvent.getCoalescedEvents not available broadly.\n // Instead, rely on touches reported in native events; browsers will deliver move events for all active pointers targeting the element.\n // Here we cannot query directly; so we return an empty array and use move handler state. For simplicity, we derive from event stream only.\n // This helper remains for future extension; current logic passes actual events to compute pinch.\n return [] as any;\n }\n\n onWheel(evt: WheelEvent, containerEl: HTMLElement) {\n const isCtrlZoom = evt.ctrlKey || evt.metaKey;\n if (!isCtrlZoom) return;\n evt.preventDefault();\n const rect = containerEl.getBoundingClientRect();\n // Record gesture point relative to container\n this.lastZoomClient = { x: evt.clientX - rect.left, y: evt.clientY - rect.top };\n if (this.wheelRaf) cancelAnimationFrame(this.wheelRaf);\n if (this.wheelCommitTimer) clearTimeout(this.wheelCommitTimer);\n const delta = -evt.deltaY;\n const step = delta > 0 ? this.WHEEL_STEP : -this.WHEEL_STEP;\n const desired = this.clampZoom(this.zoomSig() + step);\n this.previewZoom(containerEl, desired);\n this.wheelRaf = requestAnimationFrame(() => {\n this.wheelCommitTimer = setTimeout(() => {\n this.commitPreviewZoom(containerEl, this.zoomSig());\n this.lastZoomClient = null;\n }, this.gestureAnimationMs + 20);\n });\n }\n\n private previewZoom(container: HTMLElement, newZoom: number) {\n const oldZoom = this.zoomSig();\n if (Math.abs(newZoom - oldZoom) < 0.0001) return;\n const ratio = newZoom / oldZoom;\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n const origin = this.getZoomAnimTarget(container);\n target.style.willChange = 'transform';\n target.style.transformOrigin = `${Math.max(0, origin.originX)}px ${Math.max(0, origin.originY)}px`;\n target.style.transition = `transform ${this.gestureAnimationMs}ms cubic-bezier(0.2,0,0,1)`;\n target.style.transform = `scale(${ratio})`;\n this.zoomSig.set(newZoom);\n this.previewActive = true;\n }\n\n private async commitPreviewZoom(container: HTMLElement, expectedZoom: number) {\n // Clear transform and re-render once; cancel any in-flight render tasks\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n target.style.transform = '';\n target.style.willChange = '';\n target.style.transition = '';\n const anchor = this.captureScrollAnchor(container) || undefined;\n if (this.previewActive) {\n await this.safeReRenderWithCancellation(anchor);\n this.previewActive = false;\n }\n }\n\n private async safeReRenderWithCancellation(anchor?: { page: number; ratio: number }) {\n // If a render is in progress, queue once with the most recent anchor\n if (this.renderLockCount > 0) {\n this.reRenderQueued = true;\n if (anchor) this.pendingAnchor = anchor;\n return;\n }\n try {\n this.renderLockCount++;\n if (this.continuous) {\n await this.renderAllPages(anchor);\n } else {\n await this.render();\n }\n } finally {\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n if (this.renderLockCount === 0 && this.reRenderQueued) {\n const nextAnchor = this.pendingAnchor;\n this.reRenderQueued = false;\n this.pendingAnchor = undefined;\n await this.safeReRenderWithCancellation(nextAnchor);\n }\n }\n }\n\n private captureScrollAnchor(container: HTMLElement, client?: { x: number; y: number } | null): { page: number; ratio: number } | null {\n try {\n const pages = Array.from(container.querySelectorAll<HTMLElement>('.pdf-page'));\n const centerY = container.scrollTop + container.clientHeight / 2;\n if (pages.length > 0) {\n let pageEl = pages.find(el => (el.offsetTop <= centerY && (el.offsetTop + el.offsetHeight) >= centerY))\n || pages.find(el => (el.offsetTop + el.offsetHeight) > (container.scrollTop + 1))\n || pages[0];\n const page = parseInt(pageEl.getAttribute('data-page') || '1', 10);\n const height = Math.max(1, pageEl.offsetHeight);\n const ratio = Math.max(0, Math.min(1, (centerY - pageEl.offsetTop) / height));\n return { page, ratio };\n }\n // Fallback: single-canvas mode\n const canvas = container.querySelector('canvas');\n if (!canvas) return null;\n const height = Math.max(1, (canvas as HTMLElement).offsetHeight);\n const ratio = Math.max(0, Math.min(1, (centerY - (canvas as HTMLElement).offsetTop) / height));\n return { page: 1, ratio };\n } catch {\n return null;\n }\n }\n\n private restoreScrollAnchor(container: HTMLElement, anchor: { page: number; ratio: number }): void {\n try {\n let el = container.querySelector<HTMLElement>(`[data-page=\"${anchor.page}\"]`);\n if (!el) el = container.querySelector<HTMLElement>('canvas');\n if (!el) return;\n const prevBehavior = container.style.scrollBehavior;\n container.style.scrollBehavior = 'auto';\n const height = Math.max(1, el.offsetHeight);\n const desired = el.offsetTop + anchor.ratio * height - container.clientHeight / 2;\n const maxScroll = Math.max(0, container.scrollHeight - container.clientHeight);\n container.scrollTop = Math.max(0, Math.min(maxScroll, desired));\n container.style.scrollBehavior = prevBehavior;\n } catch {}\n }\n\n async download() {\n const filename = this.deriveFilename();\n const link = document.createElement('a');\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && (navigator as any).maxTouchPoints > 1);\n let popup: Window | null = null;\n if (isIOS) {\n // Open a tab synchronously to stay within user gesture\n try { popup = window.open('', '_blank', 'noopener,noreferrer'); } catch { popup = null; }\n }\n\n const blob = await this.createBlobFromSrc();\n if (blob) {\n const url = URL.createObjectURL(blob);\n if (isIOS) {\n if (popup) {\n try { popup.location.href = url; } catch { /* ignore */ }\n // Revoke later to allow the view to load fully\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n } else {\n const a = document.createElement('a');\n a.href = url;\n a.target = '_blank';\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n }\n } else {\n link.href = url;\n link.download = filename;\n link.rel = 'noopener';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n }\n return;\n }\n\n // Fallback: cross-origin without CORS\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (!href) return;\n if (isIOS) {\n if (popup) {\n try { popup.location.href = href; } catch { /* ignore */ }\n } else {\n const a = document.createElement('a');\n a.href = href;\n a.target = '_blank';\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n } else {\n link.href = href;\n link.target = '_blank';\n link.rel = 'noopener';\n link.download = filename; // browsers may ignore for cross-origin\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n }\n\n async print() {\n // Robust, plugin-free printing by rendering pages to images\n const ok = await this.printViaImages();\n if (ok) return;\n // Fallbacks\n const blob = await this.createBlobFromSrc();\n if (blob) {\n const url = URL.createObjectURL(blob);\n const win = window.open('', '_blank', 'noopener,noreferrer');\n if (win) {\n win.document.write('<!doctype html><html><head><title>Print</title><meta charset=\"utf-8\"><style>html,body{height:100%;margin:0}@page{size:auto;margin:0} iframe{border:0;width:100%;height:100%}</style></head><body><iframe src=\"' + url + '\"></iframe></body></html>');\n win.document.close();\n setTimeout(() => { try { win.focus(); win.print(); } catch {} }, 800);\n win.onafterprint = () => { try { win.close(); } catch {} URL.revokeObjectURL(url); };\n } else {\n const iframe = document.createElement('iframe');\n iframe.style.position = 'fixed'; iframe.style.right = '0'; iframe.style.bottom = '0';\n iframe.style.width = '0'; iframe.style.height = '0'; iframe.style.border = '0';\n iframe.src = url; document.body.appendChild(iframe);\n iframe.onload = () => { try { setTimeout(() => iframe.contentWindow?.print(), 800); } catch {} setTimeout(() => { URL.revokeObjectURL(url); iframe.remove(); }, 3000); };\n }\n return;\n }\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (href) window.open(href, '_blank');\n }\n\n private async printViaImages(): Promise<boolean> {\n try {\n let doc = this.doc;\n if (!doc) {\n doc = await this.loadDocumentWithFallbacks(this.src);\n }\n if (!doc) return false;\n const win = window.open('', '_blank', 'noopener,noreferrer');\n if (!win) return false;\n win.document.write('<!doctype html><html><head><meta charset=\"utf-8\"><title>Print</title><style>@page{size:auto;margin:0} html,body{margin:0;padding:0} .page{page-break-after:always;}</style></head><body></body></html>');\n win.document.close();\n\n for (let i = 1; i <= doc.numPages; i++) {\n const page = await doc.getPage(i);\n const vp = page.getViewport({ scale: this.PRINT_SCALE });\n const canvas = document.createElement('canvas');\n canvas.width = Math.floor(vp.width);\n canvas.height = Math.floor(vp.height);\n const ctx = canvas.getContext('2d')!;\n await page.render({ canvas, canvasContext: ctx, viewport: vp }).promise;\n const img = win.document.createElement('img');\n img.className = 'page';\n img.style.width = '100%';\n img.style.display = 'block';\n img.src = canvas.toDataURL('image/png');\n win.document.body.appendChild(img);\n }\n setTimeout(() => { try { win.focus(); win.print(); } catch {} }, 300);\n win.onafterprint = () => { try { win.close(); } catch {} };\n setTimeout(() => { try { win.close(); } catch {} }, 60000);\n return true;\n } catch {\n return false;\n }\n }\n\n private async createBlobFromSrc(): Promise<Blob | null> {\n if (!this.src) return null;\n if (this.src instanceof Blob) return this.src;\n if (this.src instanceof Uint8Array) {\n const ab = new ArrayBuffer(this.src.byteLength);\n new Uint8Array(ab).set(this.src);\n return new Blob([ab], { type: 'application/pdf' });\n }\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (!href || typeof fetch === 'undefined') return null;\n try {\n const res = await fetch(href, {\n mode: 'cors',\n headers: this.httpHeaders,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) return null;\n const blob = await res.blob();\n return blob.type ? blob : new Blob([await res.arrayBuffer()], { type: 'application/pdf' });\n } catch {\n return null;\n }\n }\n\n private deriveFilename(): string {\n if (typeof this.src === 'string') {\n try { const u = new URL(this.src, window.location.origin); return this.basename(u.pathname) || 'document.pdf'; } catch { return 'document.pdf'; }\n }\n if (this.src instanceof URL) {\n return this.basename(this.src.pathname) || 'document.pdf';\n }\n return 'document.pdf';\n }\n\n private basename(path: string): string {\n const last = path.split('/').filter(Boolean).pop() || '';\n return last.endsWith('.pdf') ? last : (last ? last + '.pdf' : 'document.pdf');\n }\n}\n","import { APP_INITIALIZER, InjectionToken, Provider, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport * as pdfjsLib from 'pdfjs-dist';\n\nexport type GenusPdfWorkerConfig = {\n /** Try ESM module worker first (best); falls back to workerSrc if creation fails. */\n tryModuleWorker?: boolean;\n /** Optional absolute URL for worker file. If omitted, package-shipped worker is used. */\n workerSrc?: string;\n /** If true, preloads pdf.js worker handler in-package for fake-worker fallback. */\n inlineWorkerFallback?: boolean;\n};\n\nexport const GENUS_PDF_WORKER_CONFIG = new InjectionToken<GenusPdfWorkerConfig>('GENUS_PDF_WORKER_CONFIG');\n\nfunction resolveBundledWorkerUrl(): string | null {\n try {\n return new URL('../workers/pdf.worker.min.mjs', import.meta.url).toString();\n } catch {\n return null;\n }\n}\n\nasync function setupInlineWorkerFallback(): Promise<void> {\n const g = globalThis as any;\n if (g?.pdfjsWorker?.WorkerMessageHandler) return;\n try {\n // @ts-ignore pdfjs-dist worker entry does not ship declaration files.\n const workerModule: any = await import('pdfjs-dist/build/pdf.worker.min.mjs');\n if (workerModule?.WorkerMessageHandler) {\n g.pdfjsWorker = { ...(g.pdfjsWorker || {}), WorkerMessageHandler: workerModule.WorkerMessageHandler };\n }\n } catch {}\n}\n\nfunction initPdfWorkerFactory(cfg: GenusPdfWorkerConfig, platformId: object) {\n return async () => {\n if (!isPlatformBrowser(platformId)) return;\n\n const defaults: Required<Pick<GenusPdfWorkerConfig, 'tryModuleWorker' | 'inlineWorkerFallback'>> = {\n tryModuleWorker: true,\n inlineWorkerFallback: true,\n };\n const merged = { ...defaults, ...cfg };\n\n const globalOptions = (pdfjsLib as any).GlobalWorkerOptions;\n globalOptions.workerPort = null;\n if (merged.inlineWorkerFallback) {\n await setupInlineWorkerFallback();\n }\n if (typeof merged.workerSrc === 'string' && merged.workerSrc.length > 0) {\n globalOptions.workerSrc = merged.workerSrc;\n return;\n }\n const bundledWorkerUrl = resolveBundledWorkerUrl();\n if (!merged.tryModuleWorker) {\n globalOptions.workerSrc = bundledWorkerUrl || '/assets/pdf.worker.min.js';\n return;\n }\n globalOptions.workerSrc = bundledWorkerUrl || '/assets/pdf.worker.min.js';\n };\n}\n\nexport function provideGenusPdfViewer(cfg: GenusPdfWorkerConfig = {}): Provider[] {\n return [\n { provide: GENUS_PDF_WORKER_CONFIG, useValue: cfg },\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: initPdfWorkerFactory,\n deps: [GENUS_PDF_WORKER_CONFIG, PLATFORM_ID],\n },\n ];\n}\n","/*\n * Public API Surface of genus-pdf-viewer\n */\n\nexport * from './lib/genus-pdf-viewer';\nexport { GenusPdfViewerComponent } from './lib/genus-pdf-viewer';\nexport * from './lib/pdfjs-worker.provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
Binary file
package/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnChanges, ElementRef, SimpleChanges, InjectionToken, Provider } from '@angular/core';
3
+ import { SafeResourceUrl } from '@angular/platform-browser';
3
4
  import { PDFDocumentProxy } from 'pdfjs-dist/types/src/display/api';
4
5
 
5
6
  declare class GenusPdfViewerComponent implements OnChanges {
6
7
  private static inlineWorkerSetupPromise;
8
+ private readonly sanitizer;
7
9
  src: string | URL | Uint8Array | Blob;
8
10
  page: number;
9
11
  zoom: number;
@@ -17,6 +19,7 @@ declare class GenusPdfViewerComponent implements OnChanges {
17
19
  zoomAnimationMs: number;
18
20
  gestureAnimationMs: number;
19
21
  loadTimeoutMs: number;
22
+ allowIframeFallback: boolean;
20
23
  withCredentials: boolean;
21
24
  httpHeaders?: Record<string, string>;
22
25
  canvas: ElementRef<HTMLCanvasElement>;
@@ -30,6 +33,7 @@ declare class GenusPdfViewerComponent implements OnChanges {
30
33
  canPan: _angular_core.WritableSignal<boolean>;
31
34
  loading: _angular_core.WritableSignal<boolean>;
32
35
  error: _angular_core.WritableSignal<string | null>;
36
+ iframeFallbackSrc: _angular_core.WritableSignal<SafeResourceUrl | null>;
33
37
  private readonly PRINT_SCALE;
34
38
  private scrollRaf;
35
39
  private renderLockCount;
@@ -60,6 +64,9 @@ declare class GenusPdfViewerComponent implements OnChanges {
60
64
  private getWorkerSrcCandidates;
61
65
  private applyWorkerSrc;
62
66
  private buildLoadErrorMessage;
67
+ private tryEnableIframeFallback;
68
+ private isLikelyNetworkOrCorsError;
69
+ private toFallbackHref;
63
70
  private extractErrorText;
64
71
  private toPdfBytes;
65
72
  render(): Promise<void>;
@@ -75,6 +82,7 @@ declare class GenusPdfViewerComponent implements OnChanges {
75
82
  onScroll(evt: Event): void;
76
83
  nextPage(): Promise<void>;
77
84
  prevPage(): Promise<void>;
85
+ pageCount(): number;
78
86
  isZoomed(): boolean;
79
87
  resetZoom(): Promise<void>;
80
88
  retryLoad(): Promise<void>;
@@ -93,7 +101,7 @@ declare class GenusPdfViewerComponent implements OnChanges {
93
101
  private deriveFilename;
94
102
  private basename;
95
103
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<GenusPdfViewerComponent, never>;
96
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<GenusPdfViewerComponent, "genus-pdf-viewer", never, { "src": { "alias": "src"; "required": false; }; "page": { "alias": "page"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "fit": { "alias": "fit"; "required": false; }; "disableTextLayer": { "alias": "disableTextLayer"; "required": false; }; "continuous": { "alias": "continuous"; "required": false; }; "showToolbar": { "alias": "showToolbar"; "required": false; }; "zoomAnimation": { "alias": "zoomAnimation"; "required": false; }; "zoomAnimationMs": { "alias": "zoomAnimationMs"; "required": false; }; "gestureAnimationMs": { "alias": "gestureAnimationMs"; "required": false; }; "loadTimeoutMs": { "alias": "loadTimeoutMs"; "required": false; }; "withCredentials": { "alias": "withCredentials"; "required": false; }; "httpHeaders": { "alias": "httpHeaders"; "required": false; }; }, {}, never, ["[toolbar]"], true, never>;
104
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GenusPdfViewerComponent, "genus-pdf-viewer", never, { "src": { "alias": "src"; "required": false; }; "page": { "alias": "page"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "fit": { "alias": "fit"; "required": false; }; "disableTextLayer": { "alias": "disableTextLayer"; "required": false; }; "continuous": { "alias": "continuous"; "required": false; }; "showToolbar": { "alias": "showToolbar"; "required": false; }; "zoomAnimation": { "alias": "zoomAnimation"; "required": false; }; "zoomAnimationMs": { "alias": "zoomAnimationMs"; "required": false; }; "gestureAnimationMs": { "alias": "gestureAnimationMs"; "required": false; }; "loadTimeoutMs": { "alias": "loadTimeoutMs"; "required": false; }; "allowIframeFallback": { "alias": "allowIframeFallback"; "required": false; }; "withCredentials": { "alias": "withCredentials"; "required": false; }; "httpHeaders": { "alias": "httpHeaders"; "required": false; }; }, {}, never, ["[toolbar]"], true, never>;
97
105
  }
98
106
 
99
107
  type GenusPdfWorkerConfig = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genus-pdf-viewer",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "schematics": "./schematics/collection.json",
5
5
  "ng-add": {
6
6
  "save": "dependencies"
Binary file