@libresign/pdf-elements 0.3.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +24 -1
  2. package/dist/components/DraggableElement.vue.d.ts +240 -0
  3. package/dist/components/PDFElements.vue.d.ts +552 -0
  4. package/dist/components/PDFPage.vue.d.ts +40 -0
  5. package/dist/index.css +1 -0
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.mjs +1293 -0
  8. package/dist/pdf-uHvE5neP.mjs +17593 -0
  9. package/dist/pdf.worker.min-DmO9Xdfo.mjs +4 -0
  10. package/dist/types.d.ts +30 -0
  11. package/dist/utils/asyncReader.d.ts +10 -0
  12. package/dist/utils/geometry.d.ts +5 -0
  13. package/dist/utils/measurements.d.ts +12 -0
  14. package/dist/utils/objectStore.d.ts +5 -0
  15. package/dist/utils/pageBounds.d.ts +5 -0
  16. package/dist/utils/zoom.d.ts +2 -0
  17. package/package.json +46 -21
  18. package/src/components/DraggableElement.vue +18 -15
  19. package/src/components/PDFElements.vue +135 -60
  20. package/src/components/PDFPage.vue +11 -7
  21. package/src/index.ts +18 -0
  22. package/src/types.ts +35 -0
  23. package/src/utils/asyncReader.ts +103 -0
  24. package/src/utils/{geometry.js → geometry.ts} +16 -2
  25. package/src/utils/{measurements.js → measurements.ts} +20 -1
  26. package/src/utils/{objectStore.js → objectStore.ts} +15 -4
  27. package/src/utils/{pageBounds.js → pageBounds.ts} +2 -2
  28. package/src/utils/{zoom.js → zoom.ts} +3 -1
  29. package/dist/demo.html +0 -1
  30. package/dist/pdf-elements.common.js +0 -31698
  31. package/dist/pdf-elements.common.js.map +0 -1
  32. package/dist/pdf-elements.css +0 -1
  33. package/dist/pdf-elements.umd.js +0 -31710
  34. package/dist/pdf-elements.umd.js.map +0 -1
  35. package/dist/pdf-elements.umd.min.js +0 -2
  36. package/dist/pdf-elements.umd.min.js.map +0 -1
  37. package/dist/pdf.worker.min.mjs +0 -22
  38. package/src/index.js +0 -17
  39. package/src/utils/asyncReader.js +0 -44
@@ -0,0 +1,30 @@
1
+ export interface PDFElementObject {
2
+ id?: string;
3
+ x: number;
4
+ y: number;
5
+ width: number;
6
+ height: number;
7
+ type?: string;
8
+ label?: string;
9
+ icon?: string;
10
+ resizable?: boolean;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface PDFDocumentEntry {
14
+ name: string;
15
+ file: unknown;
16
+ pdfDoc: unknown;
17
+ numPages: number;
18
+ pages: Promise<unknown>[];
19
+ pageWidths: number[];
20
+ pagesScale: number[];
21
+ allObjects: PDFElementObject[][];
22
+ }
23
+ export interface PDFElementsPublicApi {
24
+ startAddingElement: (templateObject: PDFElementObject) => void;
25
+ addObjectToPage: (object: PDFElementObject, pageIndex?: number, docIndex?: number) => boolean;
26
+ getAllObjects: (docIndex?: number) => PDFElementObject[];
27
+ updateObject: (docIndex: number, objectId: string, payload: Partial<PDFElementObject>) => void;
28
+ deleteObject: (docIndex: number, objectId: string) => void;
29
+ duplicateObject: (docIndex: number, objectId: string) => void;
30
+ }
@@ -0,0 +1,10 @@
1
+ import { PDFDocumentProxy } from 'pdfjs-dist';
2
+ export declare function setWorkerPath(path: string): void;
3
+ export declare function readAsArrayBuffer(file: Blob): Promise<ArrayBuffer>;
4
+ type PdfInput = string | ArrayBuffer | ArrayBufferView | Blob | {
5
+ url?: string;
6
+ data?: ArrayBuffer | Uint8Array;
7
+ [key: string]: unknown;
8
+ };
9
+ export declare function readAsPDF(file: PdfInput, options?: Record<string, unknown>): Promise<PDFDocumentProxy>;
10
+ export {};
@@ -0,0 +1,5 @@
1
+ export declare function clampPosition(x: number, y: number, width: number, height: number, pageWidth: number, pageHeight: number): {
2
+ x: number;
3
+ y: number;
4
+ };
5
+ export declare function getVisibleArea(newX: number, newY: number, objWidth: number, objHeight: number, pageWidth: number, pageHeight: number): number;
@@ -0,0 +1,12 @@
1
+ export interface CanvasMeasurement {
2
+ canvasWidth: number;
3
+ canvasHeight: number;
4
+ }
5
+ export interface PageMeasurement {
6
+ width: number;
7
+ height: number;
8
+ }
9
+ export interface PageMeasurementProvider {
10
+ getCanvasMeasurement: () => CanvasMeasurement;
11
+ }
12
+ export declare function getCachedMeasurement(cache: Record<string, PageMeasurement>, cacheKey: string, pageRef: PageMeasurementProvider, pagesScale: number): PageMeasurement;
@@ -0,0 +1,5 @@
1
+ import { PDFDocumentEntry, PDFElementObject } from '../types';
2
+ export declare function objectIdExistsInDoc(doc: PDFDocumentEntry | undefined, objectId: string): boolean;
3
+ export declare function findObjectPageIndex(doc: PDFDocumentEntry | undefined, objectId: string): number;
4
+ export declare function updateObjectInDoc(doc: PDFDocumentEntry | undefined, pageIndex: number, objectId: string, payload: Partial<PDFElementObject>): boolean;
5
+ export declare function removeObjectFromDoc(doc: PDFDocumentEntry | undefined, pageIndex: number, objectId: string): boolean;
@@ -0,0 +1,5 @@
1
+ export declare function getViewportWindow(scrollTop: number, viewHeight: number, margin?: number): {
2
+ minY: number;
3
+ maxY: number;
4
+ };
5
+ export declare function isPageInViewport(offsetTop: number, offsetHeight: number, minY: number, maxY: number): boolean;
@@ -0,0 +1,2 @@
1
+ import { PDFDocumentEntry } from '../types';
2
+ export declare function applyScaleToDocs(docs: PDFDocumentEntry[], scale: number): void;
package/package.json CHANGED
@@ -1,11 +1,18 @@
1
1
  {
2
2
  "name": "@libresign/pdf-elements",
3
- "description": "PDF viewer with draggable and resizable element overlays for Vue 2",
4
- "version": "0.3.1",
3
+ "description": "PDF viewer with draggable and resizable element overlays for Vue 3",
4
+ "version": "1.0.0",
5
5
  "author": "LibreCode <contact@librecode.coop>",
6
6
  "private": false,
7
- "main": "dist/pdf-elements.umd.js",
8
- "module": "dist/pdf-elements.esm.js",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
9
16
  "repository": {
10
17
  "type": "git",
11
18
  "url": "https://github.com/LibreSign/pdf-elements"
@@ -21,40 +28,58 @@
21
28
  "draggable",
22
29
  "resizable",
23
30
  "libresign",
24
- "vue2"
31
+ "vue3"
25
32
  ],
26
33
  "scripts": {
27
- "serve": "vue-cli-service serve",
28
- "build": "vue-cli-service build",
29
- "build:lib": "vue-cli-service build --target lib --name pdf-elements src/index.js",
30
- "lint": "vue-cli-service lint --no-fix",
31
- "lint:fix": "vue-cli-service lint"
34
+ "dev": "vite",
35
+ "build": "vite build",
36
+ "build:report": "vite build --mode report",
37
+ "build:demo": "vite build --mode demo",
38
+ "preview:demo": "vite preview --outDir dist-demo",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest",
41
+ "lint": "eslint . --ext .vue,.ts,.js --max-warnings=0",
42
+ "lint:fix": "eslint . --ext .vue,.ts,.js --fix"
32
43
  },
33
44
  "dependencies": {
34
- "pdfjs-dist": "^5.4.530",
35
- "vue": "^2.7.16"
45
+ "pdfjs-dist": "^5.4.624",
46
+ "vue": "^3.5.28"
36
47
  },
37
48
  "devDependencies": {
38
- "@babel/core": "^7.28.6",
39
- "@babel/eslint-parser": "^7.28.6",
40
- "@babel/plugin-transform-private-methods": "^7.28.6",
41
49
  "@nextcloud/browserslist-config": "^3.1.2",
42
- "@vue/cli-plugin-babel": "^5.0.9",
43
- "@vue/cli-plugin-eslint": "^5.0.9",
44
- "@vue/cli-service": "^5.0.9",
45
- "eslint": "^8.57.1",
46
- "eslint-plugin-vue": "^9.24.0",
50
+ "@eslint/js": "^9.39.3",
51
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
52
+ "@typescript-eslint/parser": "^8.56.0",
53
+ "@vitejs/plugin-vue": "^6.0.4",
54
+ "eslint": "^9.0.0",
55
+ "eslint-plugin-vue": "^10.8.0",
56
+ "eslint-plugin-vitest": "^0.5.4",
57
+ "globals": "^15.9.0",
58
+ "happy-dom": "^20.7.0",
47
59
  "postcss": "^8.5.6",
48
- "vue-template-compiler": "^2.7.16"
60
+ "rollup-plugin-visualizer": "^7.0.0",
61
+ "typescript": "^5.9.3",
62
+ "vite": "^7.3.1",
63
+ "vite-plugin-dts": "^4.5.4",
64
+ "vitest": "^4.0.18",
65
+ "@vue/test-utils": "^2.4.6",
66
+ "vue-eslint-parser": "^10.4.0",
67
+ "vue-tsc": "^3.2.4"
49
68
  },
50
69
  "browserslist": [
51
70
  "extends @nextcloud/browserslist-config"
52
71
  ],
72
+ "overrides": {
73
+ "eslint-plugin-vitest": {
74
+ "@typescript-eslint/utils": "^8.56.0"
75
+ }
76
+ },
53
77
  "files": [
54
78
  "dist",
55
79
  "src",
56
80
  "COPYING",
57
81
  "README.md"
58
82
  ],
83
+ "sideEffects": false,
59
84
  "license": "AGPL-3.0-or-later"
60
85
  }
@@ -54,12 +54,15 @@ SPDX-License-Identifier: AGPL-3.0-or-later
54
54
  </div>
55
55
  </template>
56
56
 
57
- <script>
58
- export default {
57
+ <script lang="ts">
58
+ import { defineComponent, type PropType, type CSSProperties } from 'vue'
59
+ import type { PDFElementObject } from '../types'
60
+
61
+ export default defineComponent({
59
62
  name: 'DraggableElement',
60
63
  props: {
61
64
  object: {
62
- type: Object,
65
+ type: Object as PropType<PDFElementObject>,
63
66
  required: true,
64
67
  },
65
68
  pagesScale: {
@@ -75,27 +78,27 @@ export default {
75
78
  required: true,
76
79
  },
77
80
  onUpdate: {
78
- type: Function,
81
+ type: Function as PropType<(...args: any[]) => void>,
79
82
  default: () => {},
80
83
  },
81
84
  onDelete: {
82
- type: Function,
85
+ type: Function as PropType<(...args: any[]) => void>,
83
86
  default: () => {},
84
87
  },
85
88
  onDuplicate: {
86
- type: Function,
89
+ type: Function as PropType<(...args: any[]) => void>,
87
90
  default: () => {},
88
91
  },
89
92
  onDragStart: {
90
- type: Function,
93
+ type: Function as PropType<(...args: any[]) => void>,
91
94
  default: () => {},
92
95
  },
93
96
  onDragMove: {
94
- type: Function,
97
+ type: Function as PropType<(...args: any[]) => void>,
95
98
  default: () => {},
96
99
  },
97
100
  onDragEnd: {
98
- type: Function,
101
+ type: Function as PropType<(...args: any[]) => void>,
99
102
  default: () => {},
100
103
  },
101
104
  isBeingDraggedGlobally: {
@@ -103,7 +106,7 @@ export default {
103
106
  default: false,
104
107
  },
105
108
  draggingClientPos: {
106
- type: Object,
109
+ type: Object as PropType<{ x: number; y: number }>,
107
110
  default: () => ({ x: 0, y: 0 }),
108
111
  },
109
112
  currentDocIndex: {
@@ -135,7 +138,7 @@ export default {
135
138
  default: false,
136
139
  },
137
140
  ignoreClickOutsideSelectors: {
138
- type: Array,
141
+ type: Array as PropType<string[]>,
139
142
  default: () => [],
140
143
  },
141
144
  },
@@ -188,7 +191,7 @@ export default {
188
191
  width: `${currentWidth * scale}px`,
189
192
  height: `${currentHeight * scale}px`,
190
193
  pointerEvents: this.readOnly ? 'none' : 'auto',
191
- }
194
+ } as CSSProperties
192
195
  },
193
196
  toolbarStyle() {
194
197
  const scale = this.pagesScale || 1
@@ -209,7 +212,7 @@ export default {
209
212
  left: `${(x + width / 2) * scale}px`,
210
213
  top: `${top * scale}px`,
211
214
  transform: 'translateX(-50%)',
212
- }
215
+ } as CSSProperties
213
216
  },
214
217
  dragElementStyle() {
215
218
  if (!this.isBeingDraggedGlobally || !this.draggingClientPos) {
@@ -218,7 +221,7 @@ export default {
218
221
  return {
219
222
  opacity: 0,
220
223
  pointerEvents: 'none',
221
- }
224
+ } as CSSProperties
222
225
  },
223
226
  },
224
227
  mounted() {
@@ -476,7 +479,7 @@ export default {
476
479
  this.currentPageRect = null
477
480
  },
478
481
  },
479
- }
482
+ })
480
483
  </script>
481
484
 
482
485
  <style scoped>