@operato/scene-pdf 10.0.0-beta.2 → 10.0.0-beta.30

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
@@ -1,41 +1,23 @@
1
- # \<scene-pdf>
1
+ # @operato/scene-pdf
2
2
 
3
- ## Installation
3
+ > pdf component for operato-scene
4
4
 
5
- ```bash
6
- npm i scene-pdf
7
- ```
8
-
9
- ## Usage
10
-
11
- ```html
12
-
13
- ```
5
+ <!-- AUTOGEN_BEGIN: do not edit between markers (run scripts/regenerate-readmes.mjs to update) -->
14
6
 
15
- ## Linting and formatting
16
-
17
- To scan the project for linting and formatting errors, run
7
+ ## Install
18
8
 
19
9
  ```bash
20
- npm run lint
10
+ yarn add @operato/scene-pdf
21
11
  ```
22
12
 
23
- To automatically fix linting and formatting errors, run
13
+ ## Build
24
14
 
25
15
  ```bash
26
- npm run format
16
+ yarn build
27
17
  ```
28
18
 
29
- ## Tooling configs
30
-
31
- For most of the tools, the configuration is in the `package.json` to reduce the amount of files in your project.
32
-
33
- If you customize the configuration a lot, you can consider moving them to individual files.
19
+ Output: ESM module at `dist/index.js` (single bundle, no UMD/IE legacy).
34
20
 
35
- ## Local Demo with `web-dev-server`
36
-
37
- ```bash
38
- npm start
39
- ```
21
+ _Version: 10.0.0-beta.2_
40
22
 
41
- To run a local development server that serves the basic demo located in `demo/index.html`
23
+ <!-- AUTOGEN_END -->
@@ -1,4 +1,4 @@
1
- import { Component, Properties, Shape } from '@hatiolab/things-scene';
1
+ import { Properties, Shape } from '@hatiolab/things-scene';
2
2
  declare const PDFPage_base: (new (...args: any[]) => {
3
3
  contains(x: number, y: number): boolean;
4
4
  get path(): {
@@ -49,7 +49,7 @@ declare const PDFPage_base: (new (...args: any[]) => {
49
49
  get disposed(): boolean;
50
50
  isLayer(): boolean;
51
51
  isGroup(): boolean;
52
- isContainer(): this is import("@hatiolab/things-scene/dist-types/types/component").Container;
52
+ isContainer(): this is import("@hatiolab/things-scene").Container;
53
53
  isLine(): boolean;
54
54
  isRoot(): boolean;
55
55
  isRootModel(): boolean;
@@ -65,9 +65,9 @@ declare const PDFPage_base: (new (...args: any[]) => {
65
65
  get(property: any): any;
66
66
  set(props: any, propval?: any): any;
67
67
  getState(property: any): any;
68
- setState(props: any, propval?: any): any;
68
+ setState(props: Partial<import("@hatiolab/things-scene").State> | string, propval?: any): any;
69
69
  get model(): any;
70
- get state(): any;
70
+ get state(): import("@hatiolab/things-scene").State;
71
71
  get hierarchy(): any;
72
72
  get volatile(): never[];
73
73
  _applyProps(target: any, props: any, options: any): any;
@@ -103,7 +103,7 @@ declare const PDFPage_base: (new (...args: any[]) => {
103
103
  draw(context?: import("@hatiolab/things-scene").SceneRenderContext): void;
104
104
  prerender(context: import("@hatiolab/things-scene").SceneRenderContext): void;
105
105
  postrender(context: import("@hatiolab/things-scene").SceneRenderContext): void;
106
- prepare(resolve: (component: Component) => void, reject: (reason: any) => void): void;
106
+ prepare(resolve: (component: import("@hatiolab/things-scene").Component) => void, reject: (reason: any) => void): void;
107
107
  prepareIf(condition: boolean): void;
108
108
  drawText(context: import("@hatiolab/things-scene").SceneRenderContext): void;
109
109
  drawStroke(context: import("@hatiolab/things-scene").SceneRenderContext, override?: Record<string, unknown>): void;
@@ -154,16 +154,16 @@ declare const PDFPage_base: (new (...args: any[]) => {
154
154
  get started(): boolean;
155
155
  set started(v: boolean): any;
156
156
  get controls(): import("@hatiolab/things-scene").Control[] | undefined;
157
- findFirst(finder: string | ((c: Component) => boolean), ...others: any[]): Component | undefined;
158
- findAll(s: string | ((c: Component) => boolean), ...others: any[]): any[] | undefined;
159
- capture(x: number, y: number, except?: (c: Component) => boolean): any;
157
+ findFirst(finder: string | ((c: import("@hatiolab/things-scene").Component) => boolean), ...others: any[]): import("@hatiolab/things-scene").Component | undefined;
158
+ findAll(s: string | ((c: import("@hatiolab/things-scene").Component) => boolean), ...others: any[]): any[] | undefined;
159
+ capture(x: number, y: number, except?: (c: import("@hatiolab/things-scene").Component) => boolean): any;
160
160
  findAnchor(name: string): any;
161
- isDescendible(container: Component): boolean;
161
+ isDescendible(container: import("@hatiolab/things-scene").Component): boolean;
162
162
  getContext(component?: unknown): any;
163
- get root(): Component;
164
- get rootModel(): Component;
165
- get parent(): Component;
166
- set parent(v: Component): any;
163
+ get root(): import("@hatiolab/things-scene").Component;
164
+ get rootModel(): import("@hatiolab/things-scene").Component;
165
+ get parent(): import("@hatiolab/things-scene").Component;
166
+ set parent(v: import("@hatiolab/things-scene").Component): any;
167
167
  get scalable(): boolean;
168
168
  get stuck(): boolean;
169
169
  get capturable(): boolean;
@@ -188,20 +188,20 @@ declare const PDFPage_base: (new (...args: any[]) => {
188
188
  ondropfile(transfered: FileList, files: string[]): void;
189
189
  transcoordS2P(x: number, y: number, rp?: import("@hatiolab/things-scene").POINT): import("@hatiolab/things-scene").POINT;
190
190
  transcoordP2S(x: number, y: number, rp?: import("@hatiolab/things-scene").POINT): import("@hatiolab/things-scene").POINT;
191
- transcoordS2T(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
192
- transcoordT2P(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
193
- transcoordT2S(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
194
- transcoordS2TR(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
195
- transcoordS2O(x: number, y: number, target: Component): import("@hatiolab/things-scene").POINT;
196
- transcoordC2S(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
197
- transcoordS2C(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
191
+ transcoordS2T(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
192
+ transcoordT2P(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
193
+ transcoordT2S(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
194
+ transcoordS2TR(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
195
+ transcoordS2O(x: number, y: number, target: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
196
+ transcoordC2S(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
197
+ transcoordS2C(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
198
198
  toParent(x: number, y: number, rp?: import("@hatiolab/things-scene").POINT): import("@hatiolab/things-scene").POINT;
199
199
  fromParent(x: number, y: number, rp?: import("@hatiolab/things-scene").POINT): import("@hatiolab/things-scene").POINT;
200
- toScene(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
201
- fromScene(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
202
- toLocal(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
203
- toGlobal(x: number, y: number, top?: Component): import("@hatiolab/things-scene").POINT;
204
- toOther(x: number, y: number, target: Component): import("@hatiolab/things-scene").POINT;
200
+ toScene(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
201
+ fromScene(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
202
+ toLocal(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
203
+ toGlobal(x: number, y: number, top?: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
204
+ toOther(x: number, y: number, target: import("@hatiolab/things-scene").Component): import("@hatiolab/things-scene").POINT;
205
205
  on(name: string | object, callback: Function, context?: any): any;
206
206
  off(name?: string | object, callback?: Function, context?: any): any;
207
207
  once(name: string | object, callback: Function, context?: any): any;
@@ -211,24 +211,24 @@ declare const PDFPage_base: (new (...args: any[]) => {
211
211
  onchange(after: Record<string, any>, before: Record<string, any>): void;
212
212
  calculateBounds?(): void;
213
213
  oncreate_element?(element: HTMLElement): void;
214
- removeComponent(component: Component, ghost?: boolean): void;
215
- addComponent(component: Component, ghost?: boolean): void;
216
- insertComponentAt(component: Component, index: number, ghost?: boolean): void;
217
- getOverlay(component: Component): HTMLElement | undefined;
218
- findById(id: string): Component | undefined;
219
- findByRefid(ref: string | number): Component | undefined;
220
- findAllById(id: string): Component[];
214
+ removeComponent(component: import("@hatiolab/things-scene").Component, ghost?: boolean): void;
215
+ addComponent(component: import("@hatiolab/things-scene").Component, ghost?: boolean): void;
216
+ insertComponentAt(component: import("@hatiolab/things-scene").Component, index: number, ghost?: boolean): void;
217
+ getOverlay(component: import("@hatiolab/things-scene").Component): HTMLElement | undefined;
218
+ findById(id: string): import("@hatiolab/things-scene").Component | undefined;
219
+ findByRefid(ref: string | number): import("@hatiolab/things-scene").Component | undefined;
220
+ findAllById(id: string): import("@hatiolab/things-scene").Component[];
221
221
  resize(): void;
222
222
  fit(type?: string): void;
223
- get components(): Component[] | undefined;
223
+ get components(): import("@hatiolab/things-scene").Component[] | undefined;
224
224
  get layout(): any;
225
225
  get auxOverlay(): HTMLElement | undefined;
226
226
  get isReady(): boolean;
227
227
  get unitScale(): number;
228
- get selected(): Component[];
229
- set selected(_v: Component[]): any;
230
- get focused(): Component | null;
231
- set focused(_v: Component | null): any;
228
+ get selected(): import("@hatiolab/things-scene").Component[];
229
+ set selected(_v: import("@hatiolab/things-scene").Component[]): any;
230
+ get focused(): import("@hatiolab/things-scene").Component | null;
231
+ set focused(_v: import("@hatiolab/things-scene").Component | null): any;
232
232
  get hasSameParentForAllSelected(): boolean;
233
233
  set hasSameParentForAllSelected(_v: boolean): any;
234
234
  get fitMode(): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-page.js","sourceRoot":"","sources":["../src/pdf-page.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDocument, GlobalWorkerOptions, PageViewport, PDFDocumentProxy, PDFPageProxy, RenderTask } from 'pdfjs-dist'\nimport { Component, Properties, RectPath, Shape, sceneComponent } from '@hatiolab/things-scene'\n\nGlobalWorkerOptions.workerSrc = '/node_modules/pdfjs-dist/build/pdf.worker.min.mjs'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'number',\n label: 'round',\n name: 'round',\n property: { min: 0 }\n },\n {\n type: 'attachment-selector',\n label: 'pdf-file',\n name: 'file',\n property: {\n displayField: 'fullpath',\n displayFullUrl: true,\n storageFilters: { type: Array, value: [{ name: 'category', value: 'application' }] },\n useUpload: true\n }\n },\n {\n type: 'number',\n label: 'pdf-page',\n name: 'page'\n },\n {\n type: 'select',\n label: 'pdf-fit',\n name: 'fit',\n property: {\n options: ['none', 'ratio', 'width', 'height']\n }\n }\n ],\n help: 'scene/component/pdf-viewer'\n}\n\nconst SCALE_LEVELS = [2, 4, 8, 16, 32]\nconst MAX_CANVAS_SIZE = 16000\n\n@sceneComponent('pdf-page')\nexport default class PDFPage extends RectPath(Shape) {\n private scaleIndex: number = 0\n private displayScale: number = 1\n private offsetX: number = 0\n private offsetY: number = 0\n private pdfDoc: PDFDocumentProxy | null = null\n private canvas: HTMLCanvasElement | null = document.createElement('canvas')\n private renderTask: RenderTask | null = null\n private page: PDFPageProxy | null = null\n private documentSize: PageViewport | null = null\n private pos: { x: number; y: number } = { x: 0, y: 0 }\n\n async ready() {\n this.loadPDF()\n }\n\n dispose() {\n super.dispose()\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n this.pdfDoc = null\n this.canvas = null\n }\n\n async loadPDF() {\n const { file, page: pageNo = 1 } = this.state\n if (!file) return\n\n try {\n console.log(`📌 Loading PDF: ${file}`)\n this.pdfDoc = await getDocument(file).promise\n\n const numPages = this.pdfDoc.numPages\n this.page = await this.pdfDoc.getPage(pageNo > numPages ? 1 : pageNo)\n this.documentSize = this.page.getViewport({ scale: 1 })\n\n this.fit()\n } catch (error) {\n console.error('🚨 Failed to load PDF:', error)\n }\n }\n\n onchange(after: Properties, before: Properties) {\n if ('file' in after || 'fit' in after || 'page' in after) {\n this.loadPDF()\n }\n }\n\n /**\n * Adjusts the PDF display scale and offsets based on the fit mode.\n *\n * @async\n * @method fit\n * @memberof PdfPage\n * @returns {Promise<void>}\n *\n * @description\n * This method adjusts the display scale of the PDF page based on the `fit` mode specified in the component's state.\n * It supports the following fit modes:\n * - 'width': Scales the PDF to fit the width of the container.\n * - 'height': Scales the PDF to fit the height of the container.\n * - 'ratio': Scales the PDF to fit both the width and height of the container while maintaining the aspect ratio.\n * - 'none': Displays the PDF at its original size.\n *\n * The method also calculates the appropriate offsets to center the PDF within the container when the fit mode is 'ratio'.\n * Finally, it triggers the rendering of the PDF.\n */\n async fit() {\n if (!this.documentSize) {\n return\n }\n\n const { fit = 'none' } = this.state\n const { width, height } = this.bounds\n const viewport = this.documentSize\n\n switch (fit) {\n case 'none':\n this.displayScale = 1\n break\n case 'width':\n this.displayScale = width / viewport.width\n break\n case 'height':\n this.displayScale = height / viewport.height\n break\n case 'ratio':\n this.displayScale = Math.min(width / viewport.width, height / viewport.height)\n break\n default:\n this.displayScale = 1\n }\n\n this.scaleIndex = SCALE_LEVELS.findIndex(level => this.displayScale <= level)\n if (this.scaleIndex === -1) {\n this.scaleIndex = SCALE_LEVELS.length - 1\n }\n\n if (fit === 'ratio') {\n this.offsetX = (width - viewport.width * this.displayScale) / 2\n this.offsetY = (height - viewport.height * this.displayScale) / 2\n } else {\n this.offsetX = 0\n this.offsetY = 0\n }\n\n this.renderPDF()\n }\n\n async renderPDF() {\n if (!this.pdfDoc || !this.page || !this.documentSize) {\n return\n }\n\n const { width, height } = this.documentSize\n\n let scale = SCALE_LEVELS[this.scaleIndex]\n\n let newWidth = Math.min(width * scale, MAX_CANVAS_SIZE)\n let newHeight = Math.min(height * scale, MAX_CANVAS_SIZE)\n\n if (newWidth === MAX_CANVAS_SIZE || newHeight === MAX_CANVAS_SIZE) {\n const ratio = width / height\n if (ratio > 1) {\n newHeight = newWidth / ratio\n }\n\n const recalcScale = newHeight / height\n\n this.scaleIndex = SCALE_LEVELS.findIndex(level => recalcScale <= level) - 1\n scale = SCALE_LEVELS[this.scaleIndex]\n\n newWidth = width * scale\n newHeight = height * scale\n }\n\n // Create an `offscreenCanvas` to render in the background while maintaining the existing display\n const offscreenCanvas = document.createElement('canvas')\n offscreenCanvas.width = newWidth\n offscreenCanvas.height = newHeight\n\n const renderContext = {\n canvasContext: offscreenCanvas.getContext('2d')!,\n viewport: this.page.getViewport({ scale })\n }\n\n if (this.renderTask) {\n this.renderTask.cancel()\n try {\n await this.renderTask.promise\n } catch (error) {\n console.warn('Previous render task was canceled.')\n }\n }\n\n this.renderTask = this.page.render(renderContext)\n\n try {\n await this.renderTask.promise\n\n // 🔹 Replace the existing canvas with the new canvas once rendering is complete\n this.canvas = offscreenCanvas\n this.renderTask = null\n\n this.invalidate()\n } catch (error) {\n if (error instanceof Error && error.name !== 'RenderingCancelledException') {\n console.error('Failed to render PDF:', error)\n }\n }\n }\n\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx)\n\n if (!this.canvas) {\n return\n }\n\n const { left, top } = this.bounds\n const { width, height } = this.canvas\n\n ctx.clip()\n ctx.drawImage(\n this.canvas,\n left + this.offsetX,\n top + this.offsetY,\n (this.documentSize?.width || width) * this.displayScale,\n (this.documentSize?.height || height) * this.displayScale\n )\n }\n\n onwheel(e: WheelEvent) {\n e.preventDefault()\n var { left, top } = this.bounds\n var { x, y } = this.transcoordC2S(e.offsetX, e.offsetY)\n x -= left\n y -= top\n\n const zoomIn = e.deltaY < 0\n const zoomFactor = zoomIn ? 1.05 : 0.95\n const oldScale = this.displayScale\n\n this.displayScale = Math.min(Math.max(0.5, this.displayScale * zoomFactor), SCALE_LEVELS[SCALE_LEVELS.length - 1])\n\n const scaleLevel = SCALE_LEVELS.findIndex(level => this.displayScale <= level)\n const newScaleIndex = scaleLevel === -1 ? SCALE_LEVELS.length - 1 : scaleLevel\n\n // Calculate zoom reference point (zoom in/out based on mouse pos)\n const scaleRatio = this.displayScale / oldScale\n this.offsetX = x - (x - this.offsetX) * scaleRatio\n this.offsetY = y - (y - this.offsetY) * scaleRatio\n\n this.invalidate()\n\n if (newScaleIndex !== this.scaleIndex) {\n this.scaleIndex = newScaleIndex\n this.renderPDF()\n }\n }\n\n ondragstart(e: MouseEvent) {\n this.pos = this.transcoordC2S(e.offsetX, e.offsetY)\n }\n\n ondragmove(e: MouseEvent) {\n var { x, y } = this.transcoordC2S(e.offsetX, e.offsetY)\n const dx = x - this.pos.x\n const dy = y - this.pos.y\n this.offsetX += dx\n this.offsetY += dy\n this.pos = { x, y }\n this.invalidate()\n }\n\n ondblclick(e: MouseEvent) {\n this.fit()\n }\n\n get nature() {\n return NATURE\n }\n}\n"]}
1
+ {"version":3,"file":"pdf-page.js","sourceRoot":"","sources":["../src/pdf-page.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDocument, GlobalWorkerOptions, PageViewport, PDFDocumentProxy, PDFPageProxy, RenderTask } from 'pdfjs-dist'\nimport { Properties, RectPath, Shape, sceneComponent } from '@hatiolab/things-scene'\n\nGlobalWorkerOptions.workerSrc = '/node_modules/pdfjs-dist/build/pdf.worker.min.mjs'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'number',\n label: 'round',\n name: 'round',\n property: { min: 0 }\n },\n {\n type: 'attachment-selector',\n label: 'pdf-file',\n name: 'file',\n property: {\n displayField: 'fullpath',\n displayFullUrl: true,\n storageFilters: { type: Array, value: [{ name: 'category', value: 'application' }] },\n useUpload: true\n }\n },\n {\n type: 'number',\n label: 'pdf-page',\n name: 'page'\n },\n {\n type: 'select',\n label: 'pdf-fit',\n name: 'fit',\n property: {\n options: ['none', 'ratio', 'width', 'height']\n }\n }\n ],\n help: 'scene/component/pdf-viewer'\n}\n\nconst SCALE_LEVELS = [2, 4, 8, 16, 32]\nconst MAX_CANVAS_SIZE = 16000\n\n@sceneComponent('pdf-page')\nexport default class PDFPage extends RectPath(Shape) {\n private scaleIndex: number = 0\n private displayScale: number = 1\n private offsetX: number = 0\n private offsetY: number = 0\n private pdfDoc: PDFDocumentProxy | null = null\n private canvas: HTMLCanvasElement | null = document.createElement('canvas')\n private renderTask: RenderTask | null = null\n private page: PDFPageProxy | null = null\n private documentSize: PageViewport | null = null\n private pos: { x: number; y: number } = { x: 0, y: 0 }\n\n async ready() {\n this.loadPDF()\n }\n\n dispose() {\n super.dispose()\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n this.pdfDoc = null\n this.canvas = null\n }\n\n async loadPDF() {\n const { file, page: pageNo = 1 } = this.state\n if (!file) return\n\n try {\n console.log(`📌 Loading PDF: ${file}`)\n this.pdfDoc = await getDocument(file).promise\n\n const numPages = this.pdfDoc.numPages\n this.page = await this.pdfDoc.getPage(pageNo > numPages ? 1 : pageNo)\n this.documentSize = this.page.getViewport({ scale: 1 })\n\n this.fit()\n } catch (error) {\n console.error('🚨 Failed to load PDF:', error)\n }\n }\n\n onchange(after: Properties, before: Properties) {\n if ('file' in after || 'fit' in after || 'page' in after) {\n this.loadPDF()\n }\n }\n\n /**\n * Adjusts the PDF display scale and offsets based on the fit mode.\n *\n * @async\n * @method fit\n * @memberof PdfPage\n * @returns {Promise<void>}\n *\n * @description\n * This method adjusts the display scale of the PDF page based on the `fit` mode specified in the component's state.\n * It supports the following fit modes:\n * - 'width': Scales the PDF to fit the width of the container.\n * - 'height': Scales the PDF to fit the height of the container.\n * - 'ratio': Scales the PDF to fit both the width and height of the container while maintaining the aspect ratio.\n * - 'none': Displays the PDF at its original size.\n *\n * The method also calculates the appropriate offsets to center the PDF within the container when the fit mode is 'ratio'.\n * Finally, it triggers the rendering of the PDF.\n */\n async fit() {\n if (!this.documentSize) {\n return\n }\n\n const { fit = 'none' } = this.state\n const { width, height } = this.bounds\n const viewport = this.documentSize\n\n switch (fit) {\n case 'none':\n this.displayScale = 1\n break\n case 'width':\n this.displayScale = width / viewport.width\n break\n case 'height':\n this.displayScale = height / viewport.height\n break\n case 'ratio':\n this.displayScale = Math.min(width / viewport.width, height / viewport.height)\n break\n default:\n this.displayScale = 1\n }\n\n this.scaleIndex = SCALE_LEVELS.findIndex(level => this.displayScale <= level)\n if (this.scaleIndex === -1) {\n this.scaleIndex = SCALE_LEVELS.length - 1\n }\n\n if (fit === 'ratio') {\n this.offsetX = (width - viewport.width * this.displayScale) / 2\n this.offsetY = (height - viewport.height * this.displayScale) / 2\n } else {\n this.offsetX = 0\n this.offsetY = 0\n }\n\n this.renderPDF()\n }\n\n async renderPDF() {\n if (!this.pdfDoc || !this.page || !this.documentSize) {\n return\n }\n\n const { width, height } = this.documentSize\n\n let scale = SCALE_LEVELS[this.scaleIndex]\n\n let newWidth = Math.min(width * scale, MAX_CANVAS_SIZE)\n let newHeight = Math.min(height * scale, MAX_CANVAS_SIZE)\n\n if (newWidth === MAX_CANVAS_SIZE || newHeight === MAX_CANVAS_SIZE) {\n const ratio = width / height\n if (ratio > 1) {\n newHeight = newWidth / ratio\n }\n\n const recalcScale = newHeight / height\n\n this.scaleIndex = SCALE_LEVELS.findIndex(level => recalcScale <= level) - 1\n scale = SCALE_LEVELS[this.scaleIndex]\n\n newWidth = width * scale\n newHeight = height * scale\n }\n\n // Create an `offscreenCanvas` to render in the background while maintaining the existing display\n const offscreenCanvas = document.createElement('canvas')\n offscreenCanvas.width = newWidth\n offscreenCanvas.height = newHeight\n\n const renderContext = {\n canvasContext: offscreenCanvas.getContext('2d')!,\n viewport: this.page.getViewport({ scale })\n }\n\n if (this.renderTask) {\n this.renderTask.cancel()\n try {\n await this.renderTask.promise\n } catch (error) {\n console.warn('Previous render task was canceled.')\n }\n }\n\n this.renderTask = this.page.render(renderContext)\n\n try {\n await this.renderTask.promise\n\n // 🔹 Replace the existing canvas with the new canvas once rendering is complete\n this.canvas = offscreenCanvas\n this.renderTask = null\n\n this.invalidate()\n } catch (error) {\n if (error instanceof Error && error.name !== 'RenderingCancelledException') {\n console.error('Failed to render PDF:', error)\n }\n }\n }\n\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx)\n\n if (!this.canvas) {\n return\n }\n\n const { left, top } = this.bounds\n const { width, height } = this.canvas\n\n ctx.clip()\n ctx.drawImage(\n this.canvas,\n left + this.offsetX,\n top + this.offsetY,\n (this.documentSize?.width || width) * this.displayScale,\n (this.documentSize?.height || height) * this.displayScale\n )\n }\n\n onwheel(e: WheelEvent) {\n e.preventDefault()\n var { left, top } = this.bounds\n var { x, y } = this.transcoordC2S(e.offsetX, e.offsetY)\n x -= left\n y -= top\n\n const zoomIn = e.deltaY < 0\n const zoomFactor = zoomIn ? 1.05 : 0.95\n const oldScale = this.displayScale\n\n this.displayScale = Math.min(Math.max(0.5, this.displayScale * zoomFactor), SCALE_LEVELS[SCALE_LEVELS.length - 1])\n\n const scaleLevel = SCALE_LEVELS.findIndex(level => this.displayScale <= level)\n const newScaleIndex = scaleLevel === -1 ? SCALE_LEVELS.length - 1 : scaleLevel\n\n // Calculate zoom reference point (zoom in/out based on mouse pos)\n const scaleRatio = this.displayScale / oldScale\n this.offsetX = x - (x - this.offsetX) * scaleRatio\n this.offsetY = y - (y - this.offsetY) * scaleRatio\n\n this.invalidate()\n\n if (newScaleIndex !== this.scaleIndex) {\n this.scaleIndex = newScaleIndex\n this.renderPDF()\n }\n }\n\n ondragstart(e: MouseEvent) {\n this.pos = this.transcoordC2S(e.offsetX, e.offsetY)\n }\n\n ondragmove(e: MouseEvent) {\n var { x, y } = this.transcoordC2S(e.offsetX, e.offsetY)\n const dx = x - this.pos.x\n const dy = y - this.pos.y\n this.offsetX += dx\n this.offsetY += dy\n this.pos = { x, y }\n this.invalidate()\n }\n\n ondblclick(e: MouseEvent) {\n this.fit()\n }\n\n get nature() {\n return NATURE\n }\n}\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@operato/scene-pdf",
3
3
  "description": "pdf component for operato-scene",
4
4
  "author": "heartyoh",
5
- "version": "10.0.0-beta.2",
5
+ "version": "10.0.0-beta.30",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
@@ -60,5 +60,5 @@
60
60
  "prettier --write"
61
61
  ]
62
62
  },
63
- "gitHead": "350ece104754d007967cf8e3f54d0d157465e94a"
63
+ "gitHead": "06b35b1726ec4f27ee76657ce341c6c6f3ba1b3a"
64
64
  }