@libresign/pdf-elements 0.2.2 → 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=ddd8aa14&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
- resizeObserver: null
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, {
@@ -30276,23 +30204,15 @@ function readAsPDF(file) {
30276
30204
  this.$el?.addEventListener('wheel', this.boundHandleWheel, {
30277
30205
  passive: false
30278
30206
  });
30279
- if (this.autoFitZoom) {
30280
- window.addEventListener('resize', this.adjustZoomToFit);
30281
- if (typeof ResizeObserver !== 'undefined') {
30282
- this.resizeObserver = new ResizeObserver(() => {
30283
- this.scheduleAutoFitZoom();
30284
- });
30285
- if (this.$el) {
30286
- this.resizeObserver.observe(this.$el);
30287
- }
30288
- }
30289
- }
30290
30207
  },
30291
30208
  beforeUnmount() {
30292
30209
  if (this.zoomRafId) {
30293
30210
  cancelAnimationFrame(this.zoomRafId);
30294
30211
  }
30295
- this.debouncedApplyZoom?.clear?.();
30212
+ if (this.wheelZoomRafId) {
30213
+ cancelAnimationFrame(this.wheelZoomRafId);
30214
+ this.wheelZoomRafId = null;
30215
+ }
30296
30216
  if (this.boundHandleWheel) {
30297
30217
  this.$el?.removeEventListener('wheel', this.boundHandleWheel);
30298
30218
  }
@@ -30304,13 +30224,6 @@ function readAsPDF(file) {
30304
30224
  window.removeEventListener('scroll', this.onViewportScroll);
30305
30225
  window.removeEventListener('resize', this.onViewportScroll);
30306
30226
  this.$el?.removeEventListener('scroll', this.onViewportScroll);
30307
- if (this.autoFitZoom) {
30308
- window.removeEventListener('resize', this.adjustZoomToFit);
30309
- if (this.resizeObserver) {
30310
- this.resizeObserver.disconnect();
30311
- this.resizeObserver = null;
30312
- }
30313
- }
30314
30227
  if (this.viewportRafId) {
30315
30228
  window.cancelAnimationFrame(this.viewportRafId);
30316
30229
  this.viewportRafId = 0;
@@ -30320,6 +30233,7 @@ function readAsPDF(file) {
30320
30233
  async init() {
30321
30234
  if (!this.initFiles || this.initFiles.length === 0) return;
30322
30235
  const docs = [];
30236
+ this.autoFitApplied = false;
30323
30237
  for (let i = 0; i < this.initFiles.length; i++) {
30324
30238
  const file = this.initFiles[i];
30325
30239
  const name = this.initFileNames[i] || `document-${i + 1}.pdf`;
@@ -30457,23 +30371,34 @@ function readAsPDF(file) {
30457
30371
  this.cachePageBounds();
30458
30372
  },
30459
30373
  cachePageBounds() {
30460
- this.pagesBoundingRects = {};
30374
+ const nextRects = {};
30461
30375
  for (let docIdx = 0; docIdx < this.pdfDocuments.length; docIdx++) {
30462
30376
  for (let pageIdx = 0; pageIdx < this.pdfDocuments[docIdx].pages.length; pageIdx++) {
30463
30377
  const canvas = this.getPageCanvasElement(docIdx, pageIdx);
30464
30378
  if (!canvas) continue;
30465
30379
  const rect = canvas.getBoundingClientRect();
30466
- this.pagesBoundingRects[`${docIdx}-${pageIdx}`] = {
30380
+ nextRects[`${docIdx}-${pageIdx}`] = {
30467
30381
  docIndex: docIdx,
30468
30382
  pageIndex: pageIdx,
30469
30383
  rect
30470
30384
  };
30471
30385
  }
30472
30386
  }
30387
+ this.pagesBoundingRects = nextRects;
30473
30388
  },
30474
30389
  getDisplayedPageScale(docIndex, pageIndex) {
30475
30390
  const doc = this.pdfDocuments[docIndex];
30476
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
+ }
30477
30402
  const base = doc.pagesScale[pageIndex] || 1;
30478
30403
  const factor = this.visualScale && this.scale ? this.visualScale / this.scale : 1;
30479
30404
  return base * factor;
@@ -30497,6 +30422,14 @@ function readAsPDF(file) {
30497
30422
  if (this.isAddingMode || this.isDraggingElement) {
30498
30423
  this.cachePageBounds();
30499
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
+ }
30500
30433
  this.viewportRafId = 0;
30501
30434
  });
30502
30435
  },
@@ -30517,16 +30450,16 @@ function readAsPDF(file) {
30517
30450
  foundPage = true;
30518
30451
  const canvasEl = this.getPageCanvasElement(docIndex, pageIndex);
30519
30452
  const pagesScale = this.pdfDocuments[docIndex]?.pagesScale?.[pageIndex] || 1;
30520
- const layoutWidth = canvasEl?.offsetWidth || rect.width;
30521
- const layoutHeight = canvasEl?.offsetHeight || rect.height;
30522
- const layoutScaleX = layoutWidth ? rect.width / layoutWidth : 1;
30523
- 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;
30524
30457
  const relX = (clientX - rect.left) / layoutScaleX / pagesScale;
30525
30458
  const relY = (clientY - rect.top) / layoutScaleY / pagesScale;
30526
- const pageWidth = layoutWidth / pagesScale;
30527
- const pageHeight = layoutHeight / pagesScale;
30528
- this.previewScale.x = pagesScale * layoutScaleX;
30529
- 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;
30530
30463
  let x = relX - this.previewElement.width / 2;
30531
30464
  let y = relY - this.previewElement.height / 2;
30532
30465
  x = Math.max(0, Math.min(x, pageWidth - this.previewElement.width));
@@ -30556,7 +30489,11 @@ function readAsPDF(file) {
30556
30489
  const factor = 1 - event.deltaY * 0.002;
30557
30490
  const nextVisual = Math.max(0.5, Math.min(3.0, this.visualScale * factor));
30558
30491
  this.visualScale = nextVisual;
30559
- this.debouncedApplyZoom();
30492
+ if (this.wheelZoomRafId) return;
30493
+ this.wheelZoomRafId = window.requestAnimationFrame(() => {
30494
+ this.wheelZoomRafId = null;
30495
+ this.commitZoom();
30496
+ });
30560
30497
  },
30561
30498
  commitZoom() {
30562
30499
  const newScale = this.visualScale;
@@ -30617,23 +30554,25 @@ function readAsPDF(file) {
30617
30554
  getAllObjects(docIndex = this.selectedDocIndex) {
30618
30555
  if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return [];
30619
30556
  const doc = this.pdfDocuments[docIndex];
30620
- const scale = this.scale || 1;
30621
30557
  const result = [];
30622
30558
  doc.allObjects.forEach((pageObjects, pageIndex) => {
30623
30559
  const pageRef = this.getPageComponent(docIndex, pageIndex);
30624
30560
  if (!pageRef) return;
30625
30561
  const measurement = pageRef.getCanvasMeasurement();
30626
- const normalizedCanvasHeight = measurement.canvasHeight / scale;
30562
+ const pagesScale = doc.pagesScale[pageIndex] || 1;
30563
+ const normalizedCanvasHeight = measurement.canvasHeight / pagesScale;
30627
30564
  pageObjects.forEach(object => {
30628
30565
  result.push({
30629
30566
  ...object,
30630
30567
  pageIndex,
30631
30568
  pageNumber: pageIndex + 1,
30632
- scale,
30569
+ scale: pagesScale,
30633
30570
  normalizedCoordinates: {
30634
30571
  llx: parseInt(object.x, 10),
30635
30572
  lly: parseInt(normalizedCanvasHeight - object.y, 10),
30636
- 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)
30637
30576
  }
30638
30577
  });
30639
30578
  });
@@ -30727,8 +30666,24 @@ function readAsPDF(file) {
30727
30666
  deleteObject(docIndex, objectId) {
30728
30667
  if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return;
30729
30668
  const doc = this.pdfDocuments[docIndex];
30730
- 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
+ }));
30731
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
+ }
30732
30687
  },
30733
30688
  checkAndMoveObjectPage(docIndex, objectId, mouseX, mouseY) {
30734
30689
  if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return undefined;
@@ -30816,6 +30771,7 @@ function readAsPDF(file) {
30816
30771
  return Math.max(0.1, Math.min(2, availableWidth / maxPageWidth));
30817
30772
  },
30818
30773
  scheduleAutoFitZoom() {
30774
+ if (this.autoFitApplied) return;
30819
30775
  if (this.zoomRafId) return;
30820
30776
  this.zoomRafId = window.requestAnimationFrame(() => {
30821
30777
  this.zoomRafId = 0;
@@ -30823,7 +30779,7 @@ function readAsPDF(file) {
30823
30779
  });
30824
30780
  },
30825
30781
  adjustZoomToFit() {
30826
- if (!this.autoFitZoom || !this.pdfDocuments.length) return;
30782
+ if (!this.autoFitZoom || this.autoFitApplied || !this.pdfDocuments.length) return;
30827
30783
  const widths = this.pdfDocuments.flatMap(doc => doc.pageWidths || []).filter(width => width > 0);
30828
30784
  let maxCanvasWidth = 0;
30829
30785
  if (widths.length) {
@@ -30838,6 +30794,7 @@ function readAsPDF(file) {
30838
30794
  maxCanvasWidth = Math.max(...Array.from(canvases).map(canvas => canvas.width / (this.scale || 1)));
30839
30795
  }
30840
30796
  const optimalScale = this.calculateOptimalScale(maxCanvasWidth);
30797
+ this.autoFitApplied = true;
30841
30798
  if (Math.abs(optimalScale - this.scale) > 0.01) {
30842
30799
  this.scale = optimalScale;
30843
30800
  this.visualScale = optimalScale;
@@ -30851,10 +30808,10 @@ function readAsPDF(file) {
30851
30808
  });
30852
30809
  ;// ./src/components/PDFElements.vue?vue&type=script&lang=js
30853
30810
  /* harmony default export */ const components_PDFElementsvue_type_script_lang_js = (PDFElementsvue_type_script_lang_js);
30854
- ;// ./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=ddd8aa14&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
30855
30812
  // extracted by mini-css-extract-plugin
30856
30813
 
30857
- ;// ./src/components/PDFElements.vue?vue&type=style&index=0&id=ddd8aa14&prod&scoped=true&lang=css
30814
+ ;// ./src/components/PDFElements.vue?vue&type=style&index=0&id=1815c763&prod&scoped=true&lang=css
30858
30815
 
30859
30816
  ;// ./src/components/PDFElements.vue
30860
30817
 
@@ -30871,7 +30828,7 @@ var PDFElements_component = normalizeComponent(
30871
30828
  staticRenderFns,
30872
30829
  false,
30873
30830
  null,
30874
- "ddd8aa14",
30831
+ "1815c763",
30875
30832
  null
30876
30833
 
30877
30834
  )