@libresign/pdf-elements 0.2.3 → 0.2.4

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
@@ -24,6 +24,7 @@ A Vue 2 component for rendering PDFs with draggable and resizable element overla
24
24
  | `hideSelectionUI` | Boolean | `false` | Hide selection handles and actions UI |
25
25
  | `showSelectionHandles` | Boolean | `true` | Show resize/move handles on selected elements |
26
26
  | `showElementActions` | Boolean | `true` | Show action buttons on selected elements |
27
+ | `readOnly` | Boolean | `false` | Disable drag, resize, and actions for elements |
27
28
  | `pageCountFormat` | String | `'{currentPage} of {totalPages}'` | Format string for page counter |
28
29
  | `autoFitZoom` | Boolean | `false` | Automatically adjust zoom to fit viewport on window resize |
29
30
 
@@ -29166,7 +29166,7 @@ globalThis.pdfjsLib = {
29166
29166
  //# sourceMappingURL=pdf.mjs.map
29167
29167
  ;// ./node_modules/pdfjs-dist/build/pdf.worker.min.mjs
29168
29168
  const pdf_worker_min_namespaceObject = __webpack_require__.p + "pdf.worker.min.mjs";
29169
- ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/PDFElements.vue?vue&type=template&id=a3ee1be0&scoped=true
29169
+ ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/PDFElements.vue?vue&type=template&id=1815c763&scoped=true
29170
29170
  var render = function render() {
29171
29171
  var _vm = this,
29172
29172
  _c = _vm._self._c;
@@ -29177,11 +29177,7 @@ var render = function render() {
29177
29177
  height: _vm.height
29178
29178
  }
29179
29179
  }, [_vm.pdfDocuments.length ? _c('div', {
29180
- staticClass: "pages-container",
29181
- style: {
29182
- transform: `scale(${_vm.visualScale / _vm.scale})`,
29183
- transformOrigin: 'top center'
29184
- }
29180
+ staticClass: "pages-container"
29185
29181
  }, _vm._l(_vm.pdfDocuments, function (pdfDoc, docIndex) {
29186
29182
  return _c('div', {
29187
29183
  key: docIndex
@@ -29217,7 +29213,11 @@ var render = function render() {
29217
29213
  }
29218
29214
  }
29219
29215
  }), _c('div', {
29220
- staticClass: "overlay"
29216
+ staticClass: "overlay",
29217
+ on: {
29218
+ "mousemove": _vm.handleMouseMove,
29219
+ "touchmove": _vm.handleMouseMove
29220
+ }
29221
29221
  }, [_vm.isAddingMode && _vm.previewPageDocIndex === docIndex && _vm.previewPageIndex === pIndex && _vm.previewElement && _vm.previewVisible ? _c('div', {
29222
29222
  staticClass: "preview-element",
29223
29223
  style: {
@@ -29226,7 +29226,12 @@ var render = function render() {
29226
29226
  width: `${_vm.previewElement.width * _vm.previewScale.x}px`,
29227
29227
  height: `${_vm.previewElement.height * _vm.previewScale.y}px`
29228
29228
  }
29229
- }, [_vm._t("custom", null, {
29229
+ }, [_vm._t(_vm.previewElement.type ? `element-${_vm.previewElement.type}` : 'custom', function () {
29230
+ return [_vm._t("custom", null, {
29231
+ "object": _vm.previewElement,
29232
+ "isSelected": false
29233
+ })];
29234
+ }, {
29230
29235
  "object": _vm.previewElement,
29231
29236
  "isSelected": false
29232
29237
  })], 2) : _vm._e(), _vm._l(pdfDoc.allObjects[pIndex], function (object) {
@@ -29236,9 +29241,10 @@ var render = function render() {
29236
29241
  refInFor: true,
29237
29242
  attrs: {
29238
29243
  "object": object,
29239
- "pages-scale": _vm.getRenderPageScale(docIndex, pIndex),
29244
+ "pages-scale": _vm.getDisplayedPageScale(docIndex, pIndex),
29240
29245
  "page-width": _vm.getPageWidth(docIndex, pIndex),
29241
29246
  "page-height": _vm.getPageHeight(docIndex, pIndex),
29247
+ "read-only": _vm.readOnly,
29242
29248
  "on-update": payload => _vm.updateObject(docIndex, object.id, payload),
29243
29249
  "on-delete": () => _vm.deleteObject(docIndex, object.id),
29244
29250
  "on-drag-start": (mouseX, mouseY, pointerOffset, dragShift) => _vm.startDraggingElement(docIndex, pIndex, object, mouseX, mouseY, pointerOffset, dragShift),
@@ -29318,112 +29324,6 @@ var es_iterator_flat_map = __webpack_require__(531);
29318
29324
  var es_iterator_for_each = __webpack_require__(7588);
29319
29325
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.map.js
29320
29326
  var es_iterator_map = __webpack_require__(1701);
29321
- ;// ./node_modules/debounce/index.js
29322
- function debounce(function_, wait = 100, options = {}) {
29323
- if (typeof function_ !== 'function') {
29324
- throw new TypeError(`Expected the first parameter to be a function, got \`${typeof function_}\`.`);
29325
- }
29326
-
29327
- if (wait < 0) {
29328
- throw new RangeError('`wait` must not be negative.');
29329
- }
29330
-
29331
- if (typeof options === 'boolean') {
29332
- throw new TypeError('The `options` parameter must be an object, not a boolean. Use `{immediate: true}` instead.');
29333
- }
29334
-
29335
- const {immediate} = options;
29336
-
29337
- let storedContext;
29338
- let storedArguments;
29339
- let timeoutId;
29340
- let timestamp;
29341
- let result;
29342
-
29343
- function run() {
29344
- const callContext = storedContext;
29345
- const callArguments = storedArguments;
29346
- storedContext = undefined;
29347
- storedArguments = undefined;
29348
- result = function_.apply(callContext, callArguments);
29349
- return result;
29350
- }
29351
-
29352
- function later() {
29353
- const last = Date.now() - timestamp;
29354
-
29355
- if (last < wait && last >= 0) {
29356
- timeoutId = setTimeout(later, wait - last);
29357
- } else {
29358
- timeoutId = undefined;
29359
-
29360
- if (!immediate) {
29361
- result = run();
29362
- }
29363
- }
29364
- }
29365
-
29366
- const debounced = function (...arguments_) {
29367
- if (
29368
- storedContext
29369
- && this !== storedContext
29370
- && Object.getPrototypeOf(this) === Object.getPrototypeOf(storedContext)
29371
- ) {
29372
- throw new Error('Debounced method called with different contexts of the same prototype.');
29373
- }
29374
-
29375
- storedContext = this; // eslint-disable-line unicorn/no-this-assignment
29376
- storedArguments = arguments_;
29377
- timestamp = Date.now();
29378
-
29379
- const callNow = immediate && !timeoutId;
29380
-
29381
- if (!timeoutId) {
29382
- timeoutId = setTimeout(later, wait);
29383
- }
29384
-
29385
- if (callNow) {
29386
- result = run();
29387
- return result;
29388
- }
29389
-
29390
- return undefined;
29391
- };
29392
-
29393
- Object.defineProperty(debounced, 'isPending', {
29394
- get() {
29395
- return timeoutId !== undefined;
29396
- },
29397
- });
29398
-
29399
- debounced.clear = () => {
29400
- if (!timeoutId) {
29401
- return;
29402
- }
29403
-
29404
- clearTimeout(timeoutId);
29405
- timeoutId = undefined;
29406
- storedContext = undefined;
29407
- storedArguments = undefined;
29408
- };
29409
-
29410
- debounced.flush = () => {
29411
- if (!timeoutId) {
29412
- return;
29413
- }
29414
-
29415
- debounced.trigger();
29416
- };
29417
-
29418
- debounced.trigger = () => {
29419
- result = run();
29420
-
29421
- debounced.clear();
29422
- };
29423
-
29424
- return debounced;
29425
- }
29426
-
29427
29327
  ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/PDFPage.vue?vue&type=template&id=2c9e224a&scoped=true
29428
29328
  var PDFPagevue_type_template_id_2c9e224a_scoped_true_render = function render() {
29429
29329
  var _vm = this,
@@ -29631,8 +29531,8 @@ var component = normalizeComponent(
29631
29531
  )
29632
29532
 
29633
29533
  /* harmony default export */ const PDFPage = (component.exports);
29634
- ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=template&id=55db89ce&scoped=true
29635
- var DraggableElementvue_type_template_id_55db89ce_scoped_true_render = function render() {
29534
+ ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=template&id=17037ade&scoped=true
29535
+ var DraggableElementvue_type_template_id_17037ade_scoped_true_render = function render() {
29636
29536
  var _vm = this,
29637
29537
  _c = _vm._self._c;
29638
29538
  return _c('div', {
@@ -29712,7 +29612,7 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_render = function
29712
29612
  });
29713
29613
  }) : _vm._e()], 2)]);
29714
29614
  };
29715
- var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns = [];
29615
+ var DraggableElementvue_type_template_id_17037ade_scoped_true_staticRenderFns = [];
29716
29616
 
29717
29617
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=script&lang=js
29718
29618
  /* harmony default export */ const DraggableElementvue_type_script_lang_js = ({
@@ -29788,6 +29688,10 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
29788
29688
  showDefaultActions: {
29789
29689
  type: Boolean,
29790
29690
  default: true
29691
+ },
29692
+ readOnly: {
29693
+ type: Boolean,
29694
+ default: false
29791
29695
  }
29792
29696
  },
29793
29697
  data() {
@@ -29824,25 +29728,41 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
29824
29728
  },
29825
29729
  elementStyle() {
29826
29730
  const scale = this.pagesScale || 1;
29827
- const currentX = this.object.x + this.offsetX + this.resizeOffsetX;
29828
- const currentY = this.object.y + this.offsetY + this.resizeOffsetY;
29829
- const currentWidth = this.object.width + this.resizeOffsetW;
29830
- const currentHeight = this.object.height + this.resizeOffsetH;
29731
+ const isDragging = this.mode === 'drag';
29732
+ const isResizing = this.mode === 'resize';
29733
+ const offsetX = isDragging ? this.offsetX : 0;
29734
+ const offsetY = isDragging ? this.offsetY : 0;
29735
+ const resizeOffsetX = isResizing ? this.resizeOffsetX : 0;
29736
+ const resizeOffsetY = isResizing ? this.resizeOffsetY : 0;
29737
+ const resizeOffsetW = isResizing ? this.resizeOffsetW : 0;
29738
+ const resizeOffsetH = isResizing ? this.resizeOffsetH : 0;
29739
+ const currentX = this.object.x + offsetX + resizeOffsetX;
29740
+ const currentY = this.object.y + offsetY + resizeOffsetY;
29741
+ const currentWidth = this.object.width + resizeOffsetW;
29742
+ const currentHeight = this.object.height + resizeOffsetH;
29831
29743
  return {
29832
29744
  left: `${currentX * scale}px`,
29833
29745
  top: `${currentY * scale}px`,
29834
29746
  width: `${currentWidth * scale}px`,
29835
- height: `${currentHeight * scale}px`
29747
+ height: `${currentHeight * scale}px`,
29748
+ pointerEvents: this.readOnly ? 'none' : 'auto'
29836
29749
  };
29837
29750
  },
29838
29751
  toolbarStyle() {
29839
29752
  const scale = this.pagesScale || 1;
29840
- const x = this.object.x + this.offsetX + this.resizeOffsetX;
29841
- const y = this.object.y + this.offsetY + this.resizeOffsetY;
29842
- const width = this.object.width + this.resizeOffsetW;
29753
+ const isDragging = this.mode === 'drag';
29754
+ const isResizing = this.mode === 'resize';
29755
+ const offsetX = isDragging ? this.offsetX : 0;
29756
+ const offsetY = isDragging ? this.offsetY : 0;
29757
+ const resizeOffsetX = isResizing ? this.resizeOffsetX : 0;
29758
+ const resizeOffsetY = isResizing ? this.resizeOffsetY : 0;
29759
+ const resizeOffsetW = isResizing ? this.resizeOffsetW : 0;
29760
+ const x = this.object.x + offsetX + resizeOffsetX;
29761
+ const y = this.object.y + offsetY + resizeOffsetY;
29762
+ const width = this.object.width + resizeOffsetW;
29843
29763
  return {
29844
29764
  left: `${(x + width / 2) * scale}px`,
29845
- top: `${(y - 48) * scale}px`,
29765
+ top: `${(y - 60) * scale}px`,
29846
29766
  transform: 'translateX(-50%)'
29847
29767
  };
29848
29768
  },
@@ -29874,6 +29794,9 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
29874
29794
  },
29875
29795
  methods: {
29876
29796
  handleElementClick(event) {
29797
+ if (this.readOnly) {
29798
+ return;
29799
+ }
29877
29800
  if (event.target.closest('.delete-handle') || event.target.closest('[data-stop-drag]') || event.target.closest('.actions-toolbar')) {
29878
29801
  return;
29879
29802
  }
@@ -29891,6 +29814,7 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
29891
29814
  this.startResize(direction, event);
29892
29815
  },
29893
29816
  startDrag(event) {
29817
+ if (this.readOnly) return;
29894
29818
  if (event.target.classList.contains('delete')) return;
29895
29819
  if (event.target.classList.contains('resize-handle')) return;
29896
29820
  this.mode = 'drag';
@@ -29927,6 +29851,7 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
29927
29851
  window.addEventListener('touchend', this.boundStopInteraction);
29928
29852
  },
29929
29853
  startResize(direction, event) {
29854
+ if (this.readOnly) return;
29930
29855
  this.mode = 'resize';
29931
29856
  this.direction = direction;
29932
29857
  this.startX = event.type.includes('touch') ? event.touches[0].clientX : event.clientX;
@@ -29980,7 +29905,7 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
29980
29905
  this.rafId = null;
29981
29906
  return;
29982
29907
  }
29983
- const minSize = 16;
29908
+ const minSize = 16 / (this.pagesScale || 1);
29984
29909
  let newWidth = this.startWidth;
29985
29910
  let newHeight = this.startHeight;
29986
29911
  let newLeft = this.startLeft;
@@ -30094,10 +30019,10 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
30094
30019
  });
30095
30020
  ;// ./src/components/DraggableElement.vue?vue&type=script&lang=js
30096
30021
  /* harmony default export */ const components_DraggableElementvue_type_script_lang_js = (DraggableElementvue_type_script_lang_js);
30097
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=style&index=0&id=55db89ce&prod&scoped=true&lang=css
30022
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=style&index=0&id=17037ade&prod&scoped=true&lang=css
30098
30023
  // extracted by mini-css-extract-plugin
30099
30024
 
30100
- ;// ./src/components/DraggableElement.vue?vue&type=style&index=0&id=55db89ce&prod&scoped=true&lang=css
30025
+ ;// ./src/components/DraggableElement.vue?vue&type=style&index=0&id=17037ade&prod&scoped=true&lang=css
30101
30026
 
30102
30027
  ;// ./src/components/DraggableElement.vue
30103
30028
 
@@ -30110,11 +30035,11 @@ var DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns =
30110
30035
 
30111
30036
  var DraggableElement_component = normalizeComponent(
30112
30037
  components_DraggableElementvue_type_script_lang_js,
30113
- DraggableElementvue_type_template_id_55db89ce_scoped_true_render,
30114
- DraggableElementvue_type_template_id_55db89ce_scoped_true_staticRenderFns,
30038
+ DraggableElementvue_type_template_id_17037ade_scoped_true_render,
30039
+ DraggableElementvue_type_template_id_17037ade_scoped_true_staticRenderFns,
30115
30040
  false,
30116
30041
  null,
30117
- "55db89ce",
30042
+ "17037ade",
30118
30043
  null
30119
30044
 
30120
30045
  )
@@ -30152,7 +30077,6 @@ function readAsPDF(file) {
30152
30077
 
30153
30078
 
30154
30079
 
30155
-
30156
30080
  /* harmony default export */ const PDFElementsvue_type_script_lang_js = ({
30157
30081
  name: 'PDFElements',
30158
30082
  components: {
@@ -30196,6 +30120,10 @@ function readAsPDF(file) {
30196
30120
  type: Boolean,
30197
30121
  default: true
30198
30122
  },
30123
+ readOnly: {
30124
+ type: Boolean,
30125
+ default: false
30126
+ },
30199
30127
  pageCountFormat: {
30200
30128
  type: String,
30201
30129
  default: '{currentPage} of {totalPages}'
@@ -30249,15 +30177,15 @@ function readAsPDF(file) {
30249
30177
  viewportRafId: 0,
30250
30178
  objectIndexCache: {},
30251
30179
  zoomRafId: null,
30180
+ wheelZoomRafId: null,
30252
30181
  boundHandleWheel: null,
30253
- debouncedApplyZoom: null,
30254
30182
  visualScale: this.initialScale,
30255
- autoFitApplied: false
30183
+ autoFitApplied: false,
30184
+ lastContainerWidth: 0
30256
30185
  };
30257
30186
  },
30258
30187
  mounted() {
30259
30188
  this.boundHandleWheel = this.handleWheel.bind(this);
30260
- this.debouncedApplyZoom = debounce(this.commitZoom, 150);
30261
30189
  this.init();
30262
30190
  document.addEventListener('mousemove', this.handleMouseMove);
30263
30191
  document.addEventListener('touchmove', this.handleMouseMove, {
@@ -30281,7 +30209,10 @@ function readAsPDF(file) {
30281
30209
  if (this.zoomRafId) {
30282
30210
  cancelAnimationFrame(this.zoomRafId);
30283
30211
  }
30284
- this.debouncedApplyZoom?.clear?.();
30212
+ if (this.wheelZoomRafId) {
30213
+ cancelAnimationFrame(this.wheelZoomRafId);
30214
+ this.wheelZoomRafId = null;
30215
+ }
30285
30216
  if (this.boundHandleWheel) {
30286
30217
  this.$el?.removeEventListener('wheel', this.boundHandleWheel);
30287
30218
  }
@@ -30440,23 +30371,34 @@ function readAsPDF(file) {
30440
30371
  this.cachePageBounds();
30441
30372
  },
30442
30373
  cachePageBounds() {
30443
- this.pagesBoundingRects = {};
30374
+ const nextRects = {};
30444
30375
  for (let docIdx = 0; docIdx < this.pdfDocuments.length; docIdx++) {
30445
30376
  for (let pageIdx = 0; pageIdx < this.pdfDocuments[docIdx].pages.length; pageIdx++) {
30446
30377
  const canvas = this.getPageCanvasElement(docIdx, pageIdx);
30447
30378
  if (!canvas) continue;
30448
30379
  const rect = canvas.getBoundingClientRect();
30449
- this.pagesBoundingRects[`${docIdx}-${pageIdx}`] = {
30380
+ nextRects[`${docIdx}-${pageIdx}`] = {
30450
30381
  docIndex: docIdx,
30451
30382
  pageIndex: pageIdx,
30452
30383
  rect
30453
30384
  };
30454
30385
  }
30455
30386
  }
30387
+ this.pagesBoundingRects = nextRects;
30456
30388
  },
30457
30389
  getDisplayedPageScale(docIndex, pageIndex) {
30458
30390
  const doc = this.pdfDocuments[docIndex];
30459
30391
  if (!doc) return 1;
30392
+ const baseWidth = doc.pageWidths?.[pageIndex] || 0;
30393
+ const rectWidth = this.pagesBoundingRects[`${docIndex}-${pageIndex}`]?.rect?.width || 0;
30394
+ if (rectWidth && baseWidth) {
30395
+ return rectWidth / baseWidth;
30396
+ }
30397
+ const canvas = this.getPageCanvasElement(docIndex, pageIndex);
30398
+ const fallbackRectWidth = canvas?.getBoundingClientRect?.().width || 0;
30399
+ if (fallbackRectWidth && baseWidth) {
30400
+ return fallbackRectWidth / baseWidth;
30401
+ }
30460
30402
  const base = doc.pagesScale[pageIndex] || 1;
30461
30403
  const factor = this.visualScale && this.scale ? this.visualScale / this.scale : 1;
30462
30404
  return base * factor;
@@ -30480,6 +30422,14 @@ function readAsPDF(file) {
30480
30422
  if (this.isAddingMode || this.isDraggingElement) {
30481
30423
  this.cachePageBounds();
30482
30424
  }
30425
+ if (this.autoFitZoom && !this.isAddingMode && !this.isDraggingElement) {
30426
+ const containerWidth = this.$el?.clientWidth || 0;
30427
+ if (containerWidth && containerWidth !== this.lastContainerWidth) {
30428
+ this.lastContainerWidth = containerWidth;
30429
+ this.autoFitApplied = false;
30430
+ this.scheduleAutoFitZoom();
30431
+ }
30432
+ }
30483
30433
  this.viewportRafId = 0;
30484
30434
  });
30485
30435
  },
@@ -30500,16 +30450,16 @@ function readAsPDF(file) {
30500
30450
  foundPage = true;
30501
30451
  const canvasEl = this.getPageCanvasElement(docIndex, pageIndex);
30502
30452
  const pagesScale = this.pdfDocuments[docIndex]?.pagesScale?.[pageIndex] || 1;
30503
- const layoutWidth = canvasEl?.offsetWidth || rect.width;
30504
- const layoutHeight = canvasEl?.offsetHeight || rect.height;
30505
- const layoutScaleX = layoutWidth ? rect.width / layoutWidth : 1;
30506
- const layoutScaleY = layoutHeight ? rect.height / layoutHeight : 1;
30453
+ const renderWidth = canvasEl?.width || rect.width;
30454
+ const renderHeight = canvasEl?.height || rect.height;
30455
+ const layoutScaleX = renderWidth ? rect.width / renderWidth : 1;
30456
+ const layoutScaleY = renderHeight ? rect.height / renderHeight : 1;
30507
30457
  const relX = (clientX - rect.left) / layoutScaleX / pagesScale;
30508
30458
  const relY = (clientY - rect.top) / layoutScaleY / pagesScale;
30509
- const pageWidth = layoutWidth / pagesScale;
30510
- const pageHeight = layoutHeight / pagesScale;
30511
- this.previewScale.x = pagesScale * layoutScaleX;
30512
- this.previewScale.y = pagesScale * layoutScaleY;
30459
+ const pageWidth = renderWidth / pagesScale;
30460
+ const pageHeight = renderHeight / pagesScale;
30461
+ this.previewScale.x = pagesScale;
30462
+ this.previewScale.y = pagesScale;
30513
30463
  let x = relX - this.previewElement.width / 2;
30514
30464
  let y = relY - this.previewElement.height / 2;
30515
30465
  x = Math.max(0, Math.min(x, pageWidth - this.previewElement.width));
@@ -30539,7 +30489,11 @@ function readAsPDF(file) {
30539
30489
  const factor = 1 - event.deltaY * 0.002;
30540
30490
  const nextVisual = Math.max(0.5, Math.min(3.0, this.visualScale * factor));
30541
30491
  this.visualScale = nextVisual;
30542
- this.debouncedApplyZoom();
30492
+ if (this.wheelZoomRafId) return;
30493
+ this.wheelZoomRafId = window.requestAnimationFrame(() => {
30494
+ this.wheelZoomRafId = null;
30495
+ this.commitZoom();
30496
+ });
30543
30497
  },
30544
30498
  commitZoom() {
30545
30499
  const newScale = this.visualScale;
@@ -30600,23 +30554,25 @@ function readAsPDF(file) {
30600
30554
  getAllObjects(docIndex = this.selectedDocIndex) {
30601
30555
  if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return [];
30602
30556
  const doc = this.pdfDocuments[docIndex];
30603
- const scale = this.scale || 1;
30604
30557
  const result = [];
30605
30558
  doc.allObjects.forEach((pageObjects, pageIndex) => {
30606
30559
  const pageRef = this.getPageComponent(docIndex, pageIndex);
30607
30560
  if (!pageRef) return;
30608
30561
  const measurement = pageRef.getCanvasMeasurement();
30609
- const normalizedCanvasHeight = measurement.canvasHeight / scale;
30562
+ const pagesScale = doc.pagesScale[pageIndex] || 1;
30563
+ const normalizedCanvasHeight = measurement.canvasHeight / pagesScale;
30610
30564
  pageObjects.forEach(object => {
30611
30565
  result.push({
30612
30566
  ...object,
30613
30567
  pageIndex,
30614
30568
  pageNumber: pageIndex + 1,
30615
- scale,
30569
+ scale: pagesScale,
30616
30570
  normalizedCoordinates: {
30617
30571
  llx: parseInt(object.x, 10),
30618
30572
  lly: parseInt(normalizedCanvasHeight - object.y, 10),
30619
- ury: parseInt(normalizedCanvasHeight - object.y - object.height, 10)
30573
+ ury: parseInt(normalizedCanvasHeight - object.y - object.height, 10),
30574
+ width: parseInt(object.width, 10),
30575
+ height: parseInt(object.height, 10)
30620
30576
  }
30621
30577
  });
30622
30578
  });
@@ -30710,8 +30666,24 @@ function readAsPDF(file) {
30710
30666
  deleteObject(docIndex, objectId) {
30711
30667
  if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return;
30712
30668
  const doc = this.pdfDocuments[docIndex];
30713
- doc.allObjects = doc.allObjects.map(objects => objects.filter(object => object.id !== objectId));
30669
+ let deletedObject = null;
30670
+ let deletedPageIndex = -1;
30671
+ doc.allObjects = doc.allObjects.map((objects, pageIndex) => objects.filter(object => {
30672
+ if (object.id === objectId) {
30673
+ deletedObject = object;
30674
+ deletedPageIndex = pageIndex;
30675
+ return false;
30676
+ }
30677
+ return true;
30678
+ }));
30714
30679
  delete this.objectIndexCache[`${docIndex}-${objectId}`];
30680
+ if (deletedObject) {
30681
+ this.$emit('pdf-elements:delete-object', {
30682
+ object: deletedObject,
30683
+ docIndex,
30684
+ pageIndex: deletedPageIndex
30685
+ });
30686
+ }
30715
30687
  },
30716
30688
  checkAndMoveObjectPage(docIndex, objectId, mouseX, mouseY) {
30717
30689
  if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return undefined;
@@ -30836,10 +30808,10 @@ function readAsPDF(file) {
30836
30808
  });
30837
30809
  ;// ./src/components/PDFElements.vue?vue&type=script&lang=js
30838
30810
  /* harmony default export */ const components_PDFElementsvue_type_script_lang_js = (PDFElementsvue_type_script_lang_js);
30839
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/PDFElements.vue?vue&type=style&index=0&id=a3ee1be0&prod&scoped=true&lang=css
30811
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/PDFElements.vue?vue&type=style&index=0&id=1815c763&prod&scoped=true&lang=css
30840
30812
  // extracted by mini-css-extract-plugin
30841
30813
 
30842
- ;// ./src/components/PDFElements.vue?vue&type=style&index=0&id=a3ee1be0&prod&scoped=true&lang=css
30814
+ ;// ./src/components/PDFElements.vue?vue&type=style&index=0&id=1815c763&prod&scoped=true&lang=css
30843
30815
 
30844
30816
  ;// ./src/components/PDFElements.vue
30845
30817
 
@@ -30856,7 +30828,7 @@ var PDFElements_component = normalizeComponent(
30856
30828
  staticRenderFns,
30857
30829
  false,
30858
30830
  null,
30859
- "a3ee1be0",
30831
+ "1815c763",
30860
30832
  null
30861
30833
 
30862
30834
  )