@libresign/pdf-elements 0.2.5 → 0.3.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.
@@ -1 +1 @@
1
- canvas[data-v-acf7a444]{display:block}.draggable-wrapper[data-v-1fb13404]{position:relative}.actions-toolbar[data-v-1fb13404]{position:absolute;display:flex;gap:4px;background:#1f2937;border-radius:6px;padding:6px 8px;box-shadow:0 4px 12px -2px #00000026,0 2px 6px -2px #0000001a;z-index:5;white-space:nowrap}.action-btn[data-v-1fb13404]{border:none;background:#0000;color:#fff;padding:4px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .12s ease}.action-btn[data-v-1fb13404]:hover{background:#ffffff1a}.draggable-element[data-v-1fb13404]{position:absolute;cursor:move;user-select:none;border-radius:6px;overflow:visible}.draggable-element.selected[data-v-1fb13404]{box-shadow:inset 0 0 0 2px #2563eb}.resize-handle[data-v-1fb13404]{all:unset;position:absolute;width:12px;height:12px;min-width:0;min-height:0;background:#2563eb;border:1px solid #fff;border-radius:3px;padding:0;margin:0;line-height:0;font-size:0;box-sizing:border-box;display:block;appearance:none;cursor:pointer;z-index:5}.handle-top-left[data-v-1fb13404]{top:-7px;left:-7px;cursor:nwse-resize}.handle-top-right[data-v-1fb13404]{top:-7px;right:-7px;cursor:nesw-resize}.handle-bottom-left[data-v-1fb13404]{bottom:-7px;left:-7px;cursor:nesw-resize}.handle-bottom-right[data-v-1fb13404]{bottom:-7px;right:-7px;cursor:nwse-resize}.pdf-elements-root[data-v-ec3a4e5e]{width:100%;height:100%;overflow-y:auto;overflow-x:hidden;box-sizing:border-box}.pages-container[data-v-ec3a4e5e]{width:100%;padding:20px 0 0 0;text-align:center;background:#f7fafc;overflow:hidden}.page-slot[data-v-ec3a4e5e]{margin:0 auto}.page-wrapper[data-v-ec3a4e5e]{display:inline-block;margin-bottom:0}.page-canvas[data-v-ec3a4e5e]{position:relative;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.shadow-outline[data-v-ec3a4e5e]{box-shadow:0 0 0 3px #4299e180}.preview-element[data-v-ec3a4e5e]{position:absolute;opacity:.7;pointer-events:none}.overlay[data-v-ec3a4e5e]{position:absolute;top:0;left:0;transform-origin:top left;width:100%;height:100%}.page-footer[data-v-ec3a4e5e]{display:flex;justify-content:space-between;align-items:center;padding:12px 20px 20px 20px;color:#4b5563;font-size:14px}
1
+ canvas[data-v-acf7a444]{display:block}.draggable-wrapper[data-v-9f1fd9e4]{position:relative}.actions-toolbar[data-v-9f1fd9e4]{position:absolute;display:flex;gap:4px;background:#1f2937;border-radius:6px;padding:6px 8px;box-shadow:0 4px 12px -2px #00000026,0 2px 6px -2px #0000001a;z-index:5;white-space:nowrap}.action-btn[data-v-9f1fd9e4]{border:none;background:#0000;color:#fff;padding:4px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .12s ease}.action-btn[data-v-9f1fd9e4]:hover{background:#ffffff1a}.draggable-element[data-v-9f1fd9e4]{position:absolute;cursor:move;user-select:none;border-radius:6px;overflow:visible}.draggable-element.selected[data-v-9f1fd9e4]{box-shadow:inset 0 0 0 2px #2563eb}.resize-handle[data-v-9f1fd9e4]{all:unset;position:absolute;width:12px;height:12px;min-width:0;min-height:0;background:#2563eb;border:1px solid #fff;border-radius:3px;padding:0;margin:0;line-height:0;font-size:0;box-sizing:border-box;display:block;appearance:none;cursor:pointer;z-index:5}.handle-top-left[data-v-9f1fd9e4]{top:-7px;left:-7px;cursor:nwse-resize}.handle-top-right[data-v-9f1fd9e4]{top:-7px;right:-7px;cursor:nesw-resize}.handle-bottom-left[data-v-9f1fd9e4]{bottom:-7px;left:-7px;cursor:nesw-resize}.handle-bottom-right[data-v-9f1fd9e4]{bottom:-7px;right:-7px;cursor:nwse-resize}.pdf-elements-root[data-v-46de43ea]{width:100%;height:100%;overflow-y:auto;overflow-x:hidden;box-sizing:border-box}.pages-container[data-v-46de43ea]{width:100%;padding:20px 0 0 0;text-align:center;background:#f7fafc;overflow:hidden}.page-slot[data-v-46de43ea]{margin:0 auto}.page-wrapper[data-v-46de43ea]{display:inline-block;margin-bottom:0}.page-canvas[data-v-46de43ea]{position:relative;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.shadow-outline[data-v-46de43ea]{box-shadow:0 0 0 3px #4299e180}.preview-element[data-v-46de43ea]{position:absolute;opacity:.7;pointer-events:none}.overlay[data-v-46de43ea]{position:absolute;top:0;left:0;transform-origin:top left;width:100%;height:100%}.page-footer[data-v-46de43ea]{display:flex;justify-content:space-between;align-items:center;padding:12px 20px 20px 20px;color:#4b5563;font-size:14px}
@@ -2821,7 +2821,7 @@ if (typeof window !== 'undefined') {
2821
2821
  // Indicate to webpack that this file can be concatenated
2822
2822
  /* harmony default export */ const setPublicPath = (null);
2823
2823
 
2824
- ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.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=ec3a4e5e&scoped=true
2824
+ ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.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=46de43ea&scoped=true
2825
2825
  var render = function render() {
2826
2826
  var _vm = this,
2827
2827
  _c = _vm._self._c;
@@ -2902,6 +2902,7 @@ var render = function render() {
2902
2902
  "read-only": _vm.readOnly,
2903
2903
  "on-update": payload => _vm.updateObject(docIndex, object.id, payload),
2904
2904
  "on-delete": () => _vm.deleteObject(docIndex, object.id),
2905
+ "on-duplicate": () => _vm.duplicateObject(docIndex, object.id),
2905
2906
  "on-drag-start": (mouseX, mouseY, pointerOffset, dragShift) => _vm.startDraggingElement(docIndex, pIndex, object, mouseX, mouseY, pointerOffset, dragShift),
2906
2907
  "on-drag-move": _vm.updateDraggingPosition,
2907
2908
  "on-drag-end": _vm.stopDraggingElement,
@@ -2912,7 +2913,8 @@ var render = function render() {
2912
2913
  "global-drag-doc-index": _vm.draggingDocIndex,
2913
2914
  "global-drag-page-index": _vm.draggingPageIndex,
2914
2915
  "show-selection-ui": _vm.showSelectionHandles && !_vm.hideSelectionUI && object.resizable !== false,
2915
- "show-default-actions": _vm.showElementActions && !_vm.hideSelectionUI
2916
+ "show-default-actions": _vm.showElementActions && !_vm.hideSelectionUI,
2917
+ "ignore-click-outside-selectors": _vm.ignoreClickOutsideSelectors
2916
2918
  },
2917
2919
  scopedSlots: _vm._u([{
2918
2920
  key: "default",
@@ -2934,7 +2936,8 @@ var render = function render() {
2934
2936
  fn: function (slotProps) {
2935
2937
  return [_vm._t("actions", null, {
2936
2938
  "object": slotProps.object,
2937
- "onDelete": slotProps.onDelete
2939
+ "onDelete": slotProps.onDelete,
2940
+ "onDuplicate": slotProps.onDuplicate
2938
2941
  })];
2939
2942
  }
2940
2943
  }], null, true)
@@ -3211,8 +3214,8 @@ var component = normalizeComponent(
3211
3214
  )
3212
3215
 
3213
3216
  /* harmony default export */ const PDFPage = (component.exports);
3214
- ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.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=1fb13404&scoped=true
3215
- var DraggableElementvue_type_template_id_1fb13404_scoped_true_render = function render() {
3217
+ ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.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=9f1fd9e4&scoped=true
3218
+ var DraggableElementvue_type_template_id_9f1fd9e4_scoped_true_render = function render() {
3216
3219
  var _vm = this,
3217
3220
  _c = _vm._self._c;
3218
3221
  return _c('div', {
@@ -3222,6 +3225,29 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_render = function
3222
3225
  style: _vm.toolbarStyle
3223
3226
  }, [_vm._t("actions", function () {
3224
3227
  return [_c('button', {
3228
+ staticClass: "action-btn",
3229
+ attrs: {
3230
+ "type": "button",
3231
+ "title": "Duplicate"
3232
+ },
3233
+ on: {
3234
+ "click": function ($event) {
3235
+ $event.stopPropagation();
3236
+ return _vm.onDuplicate.apply(null, arguments);
3237
+ }
3238
+ }
3239
+ }, [_c('svg', {
3240
+ attrs: {
3241
+ "width": "16",
3242
+ "height": "16",
3243
+ "viewBox": "0 0 24 24",
3244
+ "fill": "currentColor"
3245
+ }
3246
+ }, [_c('path', {
3247
+ attrs: {
3248
+ "d": "M16 1H6a2 2 0 0 0-2 2v12h2V3h10V1zm3 4H10a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2zm0 16H10V7h9v14z"
3249
+ }
3250
+ })])]), _c('button', {
3225
3251
  staticClass: "action-btn",
3226
3252
  attrs: {
3227
3253
  "type": "button",
@@ -3247,7 +3273,8 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_render = function
3247
3273
  })])])];
3248
3274
  }, {
3249
3275
  "object": _vm.object,
3250
- "onDelete": _vm.onDelete
3276
+ "onDelete": _vm.onDelete,
3277
+ "onDuplicate": _vm.onDuplicate
3251
3278
  })], 2) : _vm._e(), _c('div', {
3252
3279
  staticClass: "draggable-element",
3253
3280
  class: {
@@ -3292,7 +3319,7 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_render = function
3292
3319
  });
3293
3320
  }) : _vm._e()], 2)]);
3294
3321
  };
3295
- var DraggableElementvue_type_template_id_1fb13404_scoped_true_staticRenderFns = [];
3322
+ var DraggableElementvue_type_template_id_9f1fd9e4_scoped_true_staticRenderFns = [];
3296
3323
 
3297
3324
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=script&lang=js
3298
3325
  /* harmony default export */ const DraggableElementvue_type_script_lang_js = ({
@@ -3322,6 +3349,10 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_staticRenderFns =
3322
3349
  type: Function,
3323
3350
  default: () => {}
3324
3351
  },
3352
+ onDuplicate: {
3353
+ type: Function,
3354
+ default: () => {}
3355
+ },
3325
3356
  onDragStart: {
3326
3357
  type: Function,
3327
3358
  default: () => {}
@@ -3372,6 +3403,10 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_staticRenderFns =
3372
3403
  readOnly: {
3373
3404
  type: Boolean,
3374
3405
  default: false
3406
+ },
3407
+ ignoreClickOutsideSelectors: {
3408
+ type: Array,
3409
+ default: () => []
3375
3410
  }
3376
3411
  },
3377
3412
  data() {
@@ -3488,6 +3523,12 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_staticRenderFns =
3488
3523
  this.startDrag(event);
3489
3524
  },
3490
3525
  handleClickOutside(event) {
3526
+ const selectors = Array.isArray(this.ignoreClickOutsideSelectors) ? this.ignoreClickOutsideSelectors : [];
3527
+ for (const selector of selectors) {
3528
+ if (selector && event?.target?.closest?.(selector)) {
3529
+ return;
3530
+ }
3531
+ }
3491
3532
  if (this.$el && !this.$el.contains(event.target)) {
3492
3533
  this.isSelected = false;
3493
3534
  }
@@ -3702,10 +3743,10 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_staticRenderFns =
3702
3743
  });
3703
3744
  ;// ./src/components/DraggableElement.vue?vue&type=script&lang=js
3704
3745
  /* harmony default export */ const components_DraggableElementvue_type_script_lang_js = (DraggableElementvue_type_script_lang_js);
3705
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=style&index=0&id=1fb13404&prod&scoped=true&lang=css
3746
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/DraggableElement.vue?vue&type=style&index=0&id=9f1fd9e4&prod&scoped=true&lang=css
3706
3747
  // extracted by mini-css-extract-plugin
3707
3748
 
3708
- ;// ./src/components/DraggableElement.vue?vue&type=style&index=0&id=1fb13404&prod&scoped=true&lang=css
3749
+ ;// ./src/components/DraggableElement.vue?vue&type=style&index=0&id=9f1fd9e4&prod&scoped=true&lang=css
3709
3750
 
3710
3751
  ;// ./src/components/DraggableElement.vue
3711
3752
 
@@ -3718,11 +3759,11 @@ var DraggableElementvue_type_template_id_1fb13404_scoped_true_staticRenderFns =
3718
3759
 
3719
3760
  var DraggableElement_component = normalizeComponent(
3720
3761
  components_DraggableElementvue_type_script_lang_js,
3721
- DraggableElementvue_type_template_id_1fb13404_scoped_true_render,
3722
- DraggableElementvue_type_template_id_1fb13404_scoped_true_staticRenderFns,
3762
+ DraggableElementvue_type_template_id_9f1fd9e4_scoped_true_render,
3763
+ DraggableElementvue_type_template_id_9f1fd9e4_scoped_true_staticRenderFns,
3723
3764
  false,
3724
3765
  null,
3725
- "1fb13404",
3766
+ "9f1fd9e4",
3726
3767
  null
3727
3768
 
3728
3769
  )
@@ -30307,6 +30348,10 @@ function getCachedMeasurement(cache, cacheKey, pageRef, pagesScale) {
30307
30348
  type: Boolean,
30308
30349
  default: false
30309
30350
  },
30351
+ ignoreClickOutsideSelectors: {
30352
+ type: Array,
30353
+ default: () => []
30354
+ },
30310
30355
  pageCountFormat: {
30311
30356
  type: String,
30312
30357
  default: '{currentPage} of {totalPages}'
@@ -31037,6 +31082,56 @@ function getCachedMeasurement(cache, cacheKey, pageRef, pagesScale) {
31037
31082
  });
31038
31083
  }
31039
31084
  },
31085
+ duplicateObject(docIndex, objectId) {
31086
+ if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return;
31087
+ const doc = this.pdfDocuments[docIndex];
31088
+ const cacheKey = `${docIndex}-${objectId}`;
31089
+ let pageIndex = this.objectIndexCache[cacheKey];
31090
+ if (pageIndex === undefined) {
31091
+ pageIndex = findObjectPageIndex(doc, objectId);
31092
+ if (pageIndex !== undefined) {
31093
+ this.objectIndexCache[cacheKey] = pageIndex;
31094
+ }
31095
+ }
31096
+ if (pageIndex === undefined) return;
31097
+ const sourceObject = doc.allObjects[pageIndex]?.find(o => o.id === objectId);
31098
+ if (!sourceObject) return;
31099
+ const {
31100
+ width: pageWidth,
31101
+ height: pageHeight
31102
+ } = this.getPageSize(docIndex, pageIndex);
31103
+ const offset = 12;
31104
+ const {
31105
+ x,
31106
+ y
31107
+ } = clampPosition(sourceObject.x + offset, sourceObject.y + offset, sourceObject.width, sourceObject.height, pageWidth, pageHeight);
31108
+ let duplicatedSigner = sourceObject.signer;
31109
+ if (duplicatedSigner?.element && Object.prototype.hasOwnProperty.call(duplicatedSigner.element, 'elementId')) {
31110
+ duplicatedSigner = {
31111
+ ...duplicatedSigner,
31112
+ element: {
31113
+ ...duplicatedSigner.element
31114
+ }
31115
+ };
31116
+ delete duplicatedSigner.element.elementId;
31117
+ }
31118
+ const duplicatedObject = {
31119
+ ...sourceObject,
31120
+ id: this.generateObjectId(),
31121
+ x,
31122
+ y,
31123
+ signer: duplicatedSigner
31124
+ };
31125
+ doc.allObjects[pageIndex].push(duplicatedObject);
31126
+ this.objectIndexCache[`${docIndex}-${duplicatedObject.id}`] = pageIndex;
31127
+ this.$nextTick(() => {
31128
+ const refKey = `draggable${docIndex}-${pageIndex}-${duplicatedObject.id}`;
31129
+ const draggableRefs = this.$refs[refKey];
31130
+ if (draggableRefs && Array.isArray(draggableRefs) && draggableRefs[0]) {
31131
+ draggableRefs[0].isSelected = true;
31132
+ }
31133
+ });
31134
+ },
31040
31135
  checkAndMoveObjectPage(docIndex, objectId, mouseX, mouseY) {
31041
31136
  if (docIndex < 0 || docIndex >= this.pdfDocuments.length) return undefined;
31042
31137
  const doc = this.pdfDocuments[docIndex];
@@ -31172,10 +31267,10 @@ function getCachedMeasurement(cache, cacheKey, pageRef, pagesScale) {
31172
31267
  });
31173
31268
  ;// ./src/components/PDFElements.vue?vue&type=script&lang=js
31174
31269
  /* harmony default export */ const components_PDFElementsvue_type_script_lang_js = (PDFElementsvue_type_script_lang_js);
31175
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/PDFElements.vue?vue&type=style&index=0&id=ec3a4e5e&prod&scoped=true&lang=css
31270
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/PDFElements.vue?vue&type=style&index=0&id=46de43ea&prod&scoped=true&lang=css
31176
31271
  // extracted by mini-css-extract-plugin
31177
31272
 
31178
- ;// ./src/components/PDFElements.vue?vue&type=style&index=0&id=ec3a4e5e&prod&scoped=true&lang=css
31273
+ ;// ./src/components/PDFElements.vue?vue&type=style&index=0&id=46de43ea&prod&scoped=true&lang=css
31179
31274
 
31180
31275
  ;// ./src/components/PDFElements.vue
31181
31276
 
@@ -31192,7 +31287,7 @@ var PDFElements_component = normalizeComponent(
31192
31287
  staticRenderFns,
31193
31288
  false,
31194
31289
  null,
31195
- "ec3a4e5e",
31290
+ "46de43ea",
31196
31291
  null
31197
31292
 
31198
31293
  )