@anu3ev/fabric-image-editor 0.1.28 → 0.1.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.
Files changed (2) hide show
  1. package/dist/main.js +712 -438
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -1,11 +1,11 @@
1
- import { ActiveSelection as z, util as U, controlsUtils as Oe, InteractiveFabricObject as Te, loadSVGFromURL as Ee, FabricImage as de, Point as ke, Rect as xe, Circle as Be, Triangle as Ze, Group as ze, Pattern as Ue, Canvas as Pe } from "fabric";
2
- import { create as Ye } from "jsondiffpatch";
3
- var He = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", I = function() {
1
+ import { ActiveSelection as P, util as U, controlsUtils as Oe, InteractiveFabricObject as Te, loadSVGFromURL as ke, FabricImage as le, Point as xe, Rect as Be, Circle as Ze, Triangle as ze, Group as Pe, Pattern as Ue, Canvas as Ye } from "fabric";
2
+ import { create as He } from "jsondiffpatch";
3
+ var _e = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", w = function() {
4
4
  for (var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 21, t = "", a = crypto.getRandomValues(new Uint8Array(e |= 0)); e--; )
5
- t += He[a[e] & 63];
5
+ t += _e[a[e] & 63];
6
6
  return t;
7
7
  };
8
- function le(o, e, t, a, r, n, i) {
8
+ function he(o, e, t, a, r, n, i) {
9
9
  try {
10
10
  var s = o[n](i), c = s.value;
11
11
  } catch (u) {
@@ -13,22 +13,22 @@ function le(o, e, t, a, r, n, i) {
13
13
  }
14
14
  s.done ? e(c) : Promise.resolve(c).then(a, r);
15
15
  }
16
- function We(o) {
16
+ function Re(o) {
17
17
  return function() {
18
18
  var e = this, t = arguments;
19
19
  return new Promise(function(a, r) {
20
20
  var n = o.apply(e, t);
21
21
  function i(c) {
22
- le(n, a, r, i, s, "next", c);
22
+ he(n, a, r, i, s, "next", c);
23
23
  }
24
24
  function s(c) {
25
- le(n, a, r, i, s, "throw", c);
25
+ he(n, a, r, i, s, "throw", c);
26
26
  }
27
27
  i(void 0);
28
28
  });
29
29
  };
30
30
  }
31
- class Z {
31
+ class z {
32
32
  /**
33
33
  * Конструктор принимает редактор и опции.
34
34
  * @param {Object} params
@@ -49,7 +49,7 @@ class Z {
49
49
  editor: t,
50
50
  options: a = {}
51
51
  } = e;
52
- this.editor = t, this.canvas = t.canvas, this.options = a, this.isUndoRedoKeyPressed = !1, this.handleAdaptCanvasToContainerBound = Z.debounce(this.handleAdaptCanvasToContainer.bind(this), 500), this.handleCopyEventBound = this.handleCopyEvent.bind(this), this.handlePasteEventBound = this.handlePasteEvent.bind(this), this.handleUndoRedoEventBound = this.handleUndoRedoEvent.bind(this), this.handleUndoRedoKeyUpBound = this.handleUndoRedoKeyUp.bind(this), this.handleSelectAllEventBound = this.handleSelectAllEvent.bind(this), this.handleDeleteObjectsEventBound = this.handleDeleteObjectsEvent.bind(this), this.handleObjectModifiedHistoryBound = Z.debounce(this.handleObjectModifiedHistory.bind(this), 300), this.handleObjectRotatingHistoryBound = Z.debounce(this.handleObjectRotatingHistory.bind(this), 300), this.handleObjectAddedHistoryBound = this.handleObjectAddedHistory.bind(this), this.handleObjectRemovedHistoryBound = this.handleObjectRemovedHistory.bind(this), this.handleOverlayUpdateBound = this.handleOverlayUpdate.bind(this), this.handleCanvasDragStartBound = this.handleCanvasDragStart.bind(this), this.handleCanvasDraggingBound = this.handleCanvasDragging.bind(this), this.handleCanvasDragEndBound = this.handleCanvasDragEnd.bind(this), this.handleMouseWheelZoomBound = this.handleMouseWheelZoom.bind(this), this.handleBringToFrontBound = this.handleBringToFront.bind(this), this.handleResetObjectFitBound = this.handleResetObjectFit.bind(this), this.handleLockedSelectionBound = this._filterLockedSelection.bind(this), this.init();
52
+ this.editor = t, this.canvas = t.canvas, this.options = a, this.isUndoRedoKeyPressed = !1, this.isSpacePressed = !1, this.handleAdaptCanvasToContainerBound = z.debounce(this.handleAdaptCanvasToContainer.bind(this), 500), this.handleCopyEventBound = this.handleCopyEvent.bind(this), this.handlePasteEventBound = this.handlePasteEvent.bind(this), this.handleUndoRedoEventBound = this.handleUndoRedoEvent.bind(this), this.handleUndoRedoKeyUpBound = this.handleUndoRedoKeyUp.bind(this), this.handleSelectAllEventBound = this.handleSelectAllEvent.bind(this), this.handleDeleteObjectsEventBound = this.handleDeleteObjectsEvent.bind(this), this.handleSpaceKeyDownBound = this.handleSpaceKeyDown.bind(this), this.handleSpaceKeyUpBound = this.handleSpaceKeyUp.bind(this), this.handleObjectModifiedHistoryBound = z.debounce(this.handleObjectModifiedHistory.bind(this), 300), this.handleObjectRotatingHistoryBound = z.debounce(this.handleObjectRotatingHistory.bind(this), 300), this.handleObjectAddedHistoryBound = this.handleObjectAddedHistory.bind(this), this.handleObjectRemovedHistoryBound = this.handleObjectRemovedHistory.bind(this), this.handleOverlayUpdateBound = this.handleOverlayUpdate.bind(this), this.handleCanvasDragStartBound = this.handleCanvasDragStart.bind(this), this.handleCanvasDraggingBound = this.handleCanvasDragging.bind(this), this.handleCanvasDragEndBound = this.handleCanvasDragEnd.bind(this), this.handleMouseWheelZoomBound = this.handleMouseWheelZoom.bind(this), this.handleBringToFrontBound = this.handleBringToFront.bind(this), this.handleResetObjectFitBound = this.handleResetObjectFit.bind(this), this.handleLockedSelectionBound = this._filterLockedSelection.bind(this), this.init();
53
53
  }
54
54
  /**
55
55
  * Инициализация всех обработчиков согласно опциям.
@@ -67,7 +67,11 @@ class Z {
67
67
  deleteObjectsByHotkey: u,
68
68
  resetObjectFitByDoubleClick: l
69
69
  } = this.options;
70
- t && (this.canvas.on("mouse:down", this.handleCanvasDragStartBound), this.canvas.on("mouse:move", this.handleCanvasDraggingBound), this.canvas.on("mouse:up", this.handleCanvasDragEndBound)), a && this.canvas.on("mouse:wheel", this.handleMouseWheelZoomBound), r && (this.canvas.on("selection:created", this.handleBringToFrontBound), this.canvas.on("selection:updated", this.handleBringToFrontBound)), l && this.canvas.on("mouse:dblclick", this.handleResetObjectFitBound), e && window.addEventListener("resize", this.handleAdaptCanvasToContainerBound, {
70
+ t && (this.canvas.on("mouse:down", this.handleCanvasDragStartBound), this.canvas.on("mouse:move", this.handleCanvasDraggingBound), this.canvas.on("mouse:up", this.handleCanvasDragEndBound), document.addEventListener("keydown", this.handleSpaceKeyDownBound, {
71
+ capture: !0
72
+ }), document.addEventListener("keyup", this.handleSpaceKeyUpBound, {
73
+ capture: !0
74
+ })), a && this.canvas.on("mouse:wheel", this.handleMouseWheelZoomBound), r && (this.canvas.on("selection:created", this.handleBringToFrontBound), this.canvas.on("selection:updated", this.handleBringToFrontBound)), l && this.canvas.on("mouse:dblclick", this.handleResetObjectFitBound), e && window.addEventListener("resize", this.handleAdaptCanvasToContainerBound, {
71
75
  capture: !0
72
76
  }), n && document.addEventListener("keydown", this.handleCopyEventBound, {
73
77
  capture: !0
@@ -103,7 +107,7 @@ class Z {
103
107
  this.canvas.setActiveObject(n[0]);
104
108
  return;
105
109
  }
106
- var i = new z(n, {
110
+ var i = new P(n, {
107
111
  canvas: this.canvas
108
112
  });
109
113
  this.canvas.setActiveObject(i), this.canvas.requestRenderAll();
@@ -193,9 +197,9 @@ class Z {
193
197
  var s = i.getAsFile();
194
198
  if (!s) return;
195
199
  var c = new FileReader();
196
- c.onload = (g) => {
200
+ c.onload = (v) => {
197
201
  this.editor.imageManager.importImage({
198
- source: g.target.result
202
+ source: v.target.result
199
203
  });
200
204
  }, c.readAsDataURL(s);
201
205
  return;
@@ -222,7 +226,7 @@ class Z {
222
226
  */
223
227
  handleUndoRedoEvent(e) {
224
228
  var t = this;
225
- return We(function* () {
229
+ return Re(function* () {
226
230
  var {
227
231
  ctrlKey: a,
228
232
  metaKey: r,
@@ -266,9 +270,52 @@ class Z {
266
270
  handleDeleteObjectsEvent(e) {
267
271
  e.code === "Delete" && (e.preventDefault(), this.editor.deletionManager.deleteSelectedObjects());
268
272
  }
273
+ /**
274
+ * Обработчик для нажатия пробела.
275
+ * Отключает выделение объектов и делает курсор "grab" для перетаскивания канваса.
276
+ * @param {Object} event — объект события
277
+ * @param {String} event.code — код клавиши
278
+ */
279
+ handleSpaceKeyDown(e) {
280
+ if (e.code === "Space") {
281
+ var {
282
+ canvas: t,
283
+ editor: a,
284
+ isSpacePressed: r,
285
+ isDragging: n
286
+ } = this;
287
+ r || n || (this.isSpacePressed = !0, e.preventDefault(), t.set({
288
+ selection: !1,
289
+ defaultCursor: "grab"
290
+ }), t.setCursor("grab"), a.canvasManager.getObjects().forEach((i) => {
291
+ i.set({
292
+ selectable: !1,
293
+ evented: !1
294
+ });
295
+ }));
296
+ }
297
+ }
298
+ /**
299
+ * Обработчик для отпускания пробела.
300
+ * Завершает перетаскивание канваса, если оно активно.
301
+ * Включает выделение объектов и возвращает курсор в состояние "default".
302
+ * @param {Object} event — объект события
303
+ * @param {String} event.code — код клавиши
304
+ */
305
+ handleSpaceKeyUp(e) {
306
+ e.code === "Space" && (this.isSpacePressed = !1, this.canvas.isDragging && this.handleCanvasDragEnd(), this.canvas.set({
307
+ defaultCursor: "default",
308
+ selection: !0
309
+ }), this.canvas.setCursor("default"), this.editor.canvasManager.getObjects().forEach((t) => {
310
+ t.set({
311
+ selectable: !0,
312
+ evented: !0
313
+ });
314
+ }));
315
+ }
269
316
  // --- Обработчики для событий canvas (Fabric) ---
270
317
  /**
271
- * Начало перетаскивания канваса (срабатывает при mouse:down).
318
+ * Начало перетаскивания канваса (срабатывает при mouse:down и зажатом пробеле).
272
319
  * @param {Object} options
273
320
  * @param {Object} options.e — объект события
274
321
  */
@@ -276,7 +323,10 @@ class Z {
276
323
  var {
277
324
  e: t
278
325
  } = e;
279
- t.altKey && (this.canvas.isDragging = !0, this.canvas.selection = !1, this.canvas.lastPosX = t.clientX, this.canvas.lastPosY = t.clientY);
326
+ this.isSpacePressed && (this.canvas.set({
327
+ isDragging: !0,
328
+ defaultCursor: "grabbing"
329
+ }), this.canvas.setCursor("grabbing"), this.canvas.lastPosX = t.clientX, this.canvas.lastPosY = t.clientY);
280
330
  }
281
331
  /**
282
332
  * Перетаскивание канваса (mouse:move).
@@ -289,7 +339,7 @@ class Z {
289
339
  var {
290
340
  e: t
291
341
  } = e;
292
- if (this.canvas.isDragging) {
342
+ if (!(!this.canvas.isDragging || !this.isSpacePressed)) {
293
343
  var a = this.canvas.viewportTransform;
294
344
  a[4] += t.clientX - this.canvas.lastPosX, a[5] += t.clientY - this.canvas.lastPosY, this.canvas.requestRenderAll(), this.canvas.lastPosX = t.clientX, this.canvas.lastPosY = t.clientY;
295
345
  }
@@ -299,18 +349,21 @@ class Z {
299
349
  * Сохраняет новое положение канваса.
300
350
  */
301
351
  handleCanvasDragEnd() {
302
- this.canvas.setViewportTransform(this.canvas.viewportTransform), this.canvas.isDragging = !1, this.canvas.selection = !0;
352
+ this.canvas.isDragging && (this.canvas.setViewportTransform(this.canvas.viewportTransform), this.canvas.set("isDragging", !1), this.isSpacePressed && (this.canvas.set("defaultCursor", "grab"), this.canvas.setCursor("grab")));
303
353
  }
304
354
  /**
305
- * Обработчик зума колесиком мыши.
355
+ * Обработчик зума колесиком мыши. Работает при зажатом Ctrl или Cmd.
306
356
  * @param {Object} options
307
357
  * @param {Object} options.e — объект события
308
358
  */
309
359
  handleMouseWheelZoom(e) {
310
360
  var {
311
361
  e: t
312
- } = e, a = 1e-3, r = -t.deltaY * a;
313
- this.editor.transformManager.zoom(r), t.preventDefault(), t.stopPropagation();
362
+ } = e;
363
+ if (!(!t.ctrlKey && !t.metaKey)) {
364
+ var a = 1e-3, r = -t.deltaY * a;
365
+ this.editor.transformManager.zoom(r), t.preventDefault(), t.stopPropagation();
366
+ }
314
367
  }
315
368
  /**
316
369
  * Обработчик, поднимающий выделенные объекты на передний план.
@@ -352,7 +405,11 @@ class Z {
352
405
  capture: !0
353
406
  }), document.removeEventListener("keydown", this.handleDeleteObjectsEventBound, {
354
407
  capture: !0
355
- }), this.options.canvasDragging && (this.canvas.off("mouse:down", this.handleCanvasDragStartBound), this.canvas.off("mouse:move", this.handleCanvasDraggingBound), this.canvas.off("mouse:up", this.handleCanvasDragEndBound)), this.options.mouseWheelZooming && this.canvas.off("mouse:wheel", this.handleMouseWheelZoomBound), this.options.bringToFrontOnSelection && (this.canvas.off("selection:created", this.handleBringToFrontBound), this.canvas.off("selection:updated", this.handleBringToFrontBound)), this.options.resetObjectFitByDoubleClick && this.canvas.off("mouse:dblclick", this.handleResetObjectFitBound), this.canvas.off("object:modified", this.handleObjectModifiedHistoryBound), this.canvas.off("object:rotating", this.handleObjectRotatingHistoryBound), this.canvas.off("object:added", this.handleObjectAddedHistoryBound), this.canvas.off("object:removed", this.handleObjectRemovedHistoryBound), this.canvas.off("object:added", this.handleOverlayUpdateBound), this.canvas.off("selection:created", this.handleOverlayUpdateBound), this.canvas.off("selection:created", this.handleLockedSelectionBound.bind(this)), this.canvas.off("selection:updated", this.handleLockedSelectionBound.bind(this));
408
+ }), this.options.canvasDragging && (this.canvas.off("mouse:down", this.handleCanvasDragStartBound), this.canvas.off("mouse:move", this.handleCanvasDraggingBound), this.canvas.off("mouse:up", this.handleCanvasDragEndBound), document.removeEventListener("keydown", this.handleSpaceKeyDownBound, {
409
+ capture: !0
410
+ }), document.removeEventListener("keyup", this.handleSpaceKeyUpBound, {
411
+ capture: !0
412
+ })), this.options.mouseWheelZooming && this.canvas.off("mouse:wheel", this.handleMouseWheelZoomBound), this.options.bringToFrontOnSelection && (this.canvas.off("selection:created", this.handleBringToFrontBound), this.canvas.off("selection:updated", this.handleBringToFrontBound)), this.options.resetObjectFitByDoubleClick && this.canvas.off("mouse:dblclick", this.handleResetObjectFitBound), this.canvas.off("object:modified", this.handleObjectModifiedHistoryBound), this.canvas.off("object:rotating", this.handleObjectRotatingHistoryBound), this.canvas.off("object:added", this.handleObjectAddedHistoryBound), this.canvas.off("object:removed", this.handleObjectRemovedHistoryBound), this.canvas.off("object:added", this.handleOverlayUpdateBound), this.canvas.off("selection:created", this.handleOverlayUpdateBound), this.canvas.off("selection:created", this.handleLockedSelectionBound.bind(this)), this.canvas.off("selection:updated", this.handleLockedSelectionBound.bind(this));
356
413
  }
357
414
  // Дебаунс для снижения частоты сохранения состояния
358
415
  static debounce(e, t) {
@@ -367,7 +424,7 @@ class Z {
367
424
  };
368
425
  }
369
426
  }
370
- class _e {
427
+ class We {
371
428
  /**
372
429
  * @description Класс для динамической загрузки внешних модулей.
373
430
  */
@@ -385,7 +442,7 @@ class _e {
385
442
  return this.loaders[e] ? (this.cache.has(e) || this.cache.set(e, this.loaders[e]()), this.cache.get(e)) : Promise.reject(new Error('Unknown module "'.concat(e, '"')));
386
443
  }
387
444
  }
388
- class Re {
445
+ class Fe {
389
446
  /**
390
447
  * @param {string|URL} [scriptUrl] — URL скрипта воркера.
391
448
  * По-умолчанию использует файл рядом с этим модулем
@@ -425,7 +482,7 @@ class Re {
425
482
  * @returns {Promise<any>}
426
483
  */
427
484
  post(e, t) {
428
- var a = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [], r = "".concat(e, ":").concat(I(8));
485
+ var a = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [], r = "".concat(e, ":").concat(w(8));
429
486
  return new Promise((n, i) => {
430
487
  this._callbacks.set(r, {
431
488
  resolve: n,
@@ -444,98 +501,98 @@ class Re {
444
501
  this.worker.terminate();
445
502
  }
446
503
  }
447
- var p = 12, Ve = 2, X = 8, Q = 20, Fe = 100, J = 20, K = 8, Ge = 100, $ = 32, q = 1, Xe = "#2B2D33", ee = "#3D8BF4", te = "#FFFFFF";
448
- function Y(o, e, t, a, r) {
449
- var n = p, i = Ve;
450
- o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = te, o.strokeStyle = ee, o.lineWidth = q, o.beginPath(), o.roundRect(-12 / 2, -12 / 2, n, n, i), o.fill(), o.stroke(), o.restore();
451
- }
452
- function he(o, e, t, a, r) {
453
- var n = X, i = Q, s = Fe;
454
- o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = te, o.strokeStyle = ee, o.lineWidth = q, o.beginPath(), o.roundRect(-8 / 2, -20 / 2, n, i, s), o.fill(), o.stroke(), o.restore();
504
+ var I = 12, Ve = 2, K = 8, $ = 20, Ge = 100, q = 20, ee = 8, Xe = 100, te = 32, ae = 1, Qe = "#2B2D33", re = "#3D8BF4", ne = "#FFFFFF";
505
+ function R(o, e, t, a, r) {
506
+ var n = I, i = Ve;
507
+ o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = ne, o.strokeStyle = re, o.lineWidth = ae, o.beginPath(), o.roundRect(-12 / 2, -12 / 2, n, n, i), o.fill(), o.stroke(), o.restore();
455
508
  }
456
509
  function ge(o, e, t, a, r) {
457
- var n = J, i = K, s = Ge;
458
- o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = te, o.strokeStyle = ee, o.lineWidth = q, o.beginPath(), o.roundRect(-20 / 2, -8 / 2, n, i, s), o.fill(), o.stroke(), o.restore();
510
+ var n = K, i = $, s = Ge;
511
+ o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = ne, o.strokeStyle = re, o.lineWidth = ae, o.beginPath(), o.roundRect(-8 / 2, -20 / 2, n, i, s), o.fill(), o.stroke(), o.restore();
512
+ }
513
+ function ve(o, e, t, a, r) {
514
+ var n = q, i = ee, s = Xe;
515
+ o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = ne, o.strokeStyle = re, o.lineWidth = ae, o.beginPath(), o.roundRect(-20 / 2, -8 / 2, n, i, s), o.fill(), o.stroke(), o.restore();
459
516
  }
460
- var Qe = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE4Ljc1IDQuMzc1djMuNzVhLjYyNS42MjUgMCAwIDEtLjYyNS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDEgMC0xLjI1aDIuMTRsLTIuMDc3LTEuOTAzLS4wMi0uMDE5YTYuMjUgNi4yNSAwIDEgMC0uMTMgOC45NjcuNjI2LjYyNiAwIDAgMSAuODYuOTA5QTcuNDU2IDcuNDU2IDAgMCAxIDEwIDE3LjVoLS4xMDNhNy41IDcuNSAwIDEgMSA1LjM5Ni0xMi44MTJMMTcuNSA2LjcwM1Y0LjM3NWEuNjI1LjYyNSAwIDAgMSAxLjI1IDBaIi8+PC9zdmc+", Ae = new Image();
461
- Ae.src = Qe;
462
- function Je(o, e, t, a, r) {
463
- var n = $, i = n / 2;
464
- o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = Xe, o.beginPath(), o.arc(0, 0, i, 0, 2 * Math.PI), o.fill(), o.drawImage(Ae, -16 / 2, -16 / 2, i, i), o.restore();
517
+ var Je = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE4Ljc1IDQuMzc1djMuNzVhLjYyNS42MjUgMCAwIDEtLjYyNS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDEgMC0xLjI1aDIuMTRsLTIuMDc3LTEuOTAzLS4wMi0uMDE5YTYuMjUgNi4yNSAwIDEgMC0uMTMgOC45NjcuNjI2LjYyNiAwIDAgMSAuODYuOTA5QTcuNDU2IDcuNDU2IDAgMCAxIDEwIDE3LjVoLS4xMDNhNy41IDcuNSAwIDEgMSA1LjM5Ni0xMi44MTJMMTcuNSA2LjcwM1Y0LjM3NWEuNjI1LjYyNSAwIDAgMSAxLjI1IDBaIi8+PC9zdmc+", we = new Image();
518
+ we.src = Je;
519
+ function Ke(o, e, t, a, r) {
520
+ var n = te, i = n / 2;
521
+ o.save(), o.translate(e, t), o.rotate(U.degreesToRadians(r.angle)), o.fillStyle = Qe, o.beginPath(), o.arc(0, 0, i, 0, 2 * Math.PI), o.fill(), o.drawImage(we, -16 / 2, -16 / 2, i, i), o.restore();
465
522
  }
466
- var Ke = {
523
+ var $e = {
467
524
  // Угловые точки
468
525
  tl: {
469
- render: Y,
470
- sizeX: p,
471
- sizeY: p,
526
+ render: R,
527
+ sizeX: I,
528
+ sizeY: I,
472
529
  offsetX: 0,
473
530
  offsetY: 0
474
531
  },
475
532
  tr: {
476
- render: Y,
477
- sizeX: p,
478
- sizeY: p,
533
+ render: R,
534
+ sizeX: I,
535
+ sizeY: I,
479
536
  offsetX: 0,
480
537
  offsetY: 0
481
538
  },
482
539
  bl: {
483
- render: Y,
484
- sizeX: p,
485
- sizeY: p,
540
+ render: R,
541
+ sizeX: I,
542
+ sizeY: I,
486
543
  offsetX: 0,
487
544
  offsetY: 0
488
545
  },
489
546
  br: {
490
- render: Y,
491
- sizeX: p,
492
- sizeY: p,
547
+ render: R,
548
+ sizeX: I,
549
+ sizeY: I,
493
550
  offsetX: 0,
494
551
  offsetY: 0
495
552
  },
496
553
  // Середина вертикалей
497
554
  ml: {
498
- render: he,
499
- sizeX: X,
500
- sizeY: Q,
555
+ render: ge,
556
+ sizeX: K,
557
+ sizeY: $,
501
558
  offsetX: 0,
502
559
  offsetY: 0
503
560
  },
504
561
  mr: {
505
- render: he,
506
- sizeX: X,
507
- sizeY: Q,
562
+ render: ge,
563
+ sizeX: K,
564
+ sizeY: $,
508
565
  offsetX: 0,
509
566
  offsetY: 0
510
567
  },
511
568
  // Середина горизонталей
512
569
  mt: {
513
- render: ge,
514
- sizeX: J,
515
- sizeY: K,
570
+ render: ve,
571
+ sizeX: q,
572
+ sizeY: ee,
516
573
  offsetX: 0,
517
574
  offsetY: 0
518
575
  },
519
576
  mb: {
520
- render: ge,
521
- sizeX: J,
522
- sizeY: K,
577
+ render: ve,
578
+ sizeX: q,
579
+ sizeY: ee,
523
580
  offsetX: 0,
524
581
  offsetY: 0
525
582
  },
526
583
  // Специальный «rotate» контрол
527
584
  mtr: {
528
- render: Je,
529
- sizeX: $,
530
- sizeY: $,
585
+ render: Ke,
586
+ sizeX: te,
587
+ sizeY: te,
531
588
  offsetX: 0,
532
589
  offsetY: -32
533
590
  }
534
591
  };
535
- class $e {
592
+ class qe {
536
593
  static apply() {
537
594
  var e = Oe.createObjectDefaultControls();
538
- Object.entries(Ke).forEach((t) => {
595
+ Object.entries($e).forEach((t) => {
539
596
  var [a, r] = t;
540
597
  Object.assign(e[a], {
541
598
  render: r.render,
@@ -547,8 +604,8 @@ class $e {
547
604
  }), Te.ownDefaults.controls = e;
548
605
  }
549
606
  }
550
- var qe = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNi44NzUgMi41YS42MjUuNjI1IDAgMCAwLS42MjUuNjI0VjYuMjVIMy4xMjVhLjYyNS42MjUgMCAwIDAtLjYyNS42MjV2MTBjMCAuMzQ1LjI4LjYyNS42MjUuNjI1aDEwYy4zNDUgMCAuNjI1LS4yOC42MjUtLjYyNXYtMy4xMjZoMy4xMjVjLjM0NSAwIC42MjUtLjI4LjYyNS0uNjI1di0xMGEuNjI1LjYyNSAwIDAgMC0uNjI1LS42MjVoLTEwWm02Ljg3NSAxMGgyLjVWMy43NUg3LjV2Mi41aDUuNjI1Yy4zNDUgMCAuNjI1LjI4LjYyNS42MjV2NS42MjRabS0xMCAzLjc1VjcuNWg4Ljc1djguNzVIMy43NVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==", et = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDcuNWMwLS42OS41Ni0xLjI1IDEuMjUtMS4yNWgxMi41Yy42OSAwIDEuMjUuNTYgMS4yNSAxLjI1djguNzVjMCAuNjktLjU2IDEuMjUtMS4yNSAxLjI1SDMuNzVjLS42OSAwLTEuMjUtLjU2LTEuMjUtMS4yNVY3LjVabTEzLjc1IDBIMy43NXY4Ljc1aDEyLjVWNy41WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMS44NzVhMi4xODggMi4xODggMCAwIDAtMi4xODggMi4xODh2Mi44MTJhLjYyNS42MjUgMCAxIDEtMS4yNSAwVjQuMDYyYTMuNDM3IDMuNDM3IDAgMSAxIDYuODc1IDB2Mi44MTNhLjYyNS42MjUgMCAxIDEtMS4yNSAwVjQuMDYyQTIuMTg4IDIuMTg4IDAgMCAwIDEwIDEuODc2WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEwIDEyLjgxM2EuOTM3LjkzNyAwIDEgMCAwLTEuODc1LjkzNy45MzcgMCAwIDAgMCAxLjg3NFoiLz48L3N2Zz4=", tt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE2LjI1IDYuMjVINy41VjQuMzc1YTIuNSAyLjUgMCAwIDEgMi41LTIuNWMxLjIgMCAyLjI4MS44NiAyLjUxMiAyYS42MjUuNjI1IDAgMCAwIDEuMjI2LS4yNWMtLjM1NC0xLjczOC0xLjkyNS0zLTMuNzM4LTNhMy43NTQgMy43NTQgMCAwIDAtMy43NSAzLjc1VjYuMjVoLTIuNUExLjI1IDEuMjUgMCAwIDAgMi41IDcuNXY4Ljc1YTEuMjUgMS4yNSAwIDAgMCAxLjI1IDEuMjVoMTIuNWExLjI1IDEuMjUgMCAwIDAgMS4yNS0xLjI1VjcuNWExLjI1IDEuMjUgMCAwIDAtMS4yNS0xLjI1Wm0wIDEwSDMuNzVWNy41aDEyLjV2OC43NVptLTUuMzEzLTQuMzc1YS45MzcuOTM3IDAgMSAxLTEuODc0IDAgLjkzNy45MzcgMCAwIDEgMS44NzQgMFoiLz48L3N2Zz4K", at = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTIuNSA4LjEyNSAxMCAxMi41bDcuNS00LjM3NUwxMCAzLjc1IDIuNSA4LjEyNVoiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LjY4NSAzLjIxYS42MjUuNjI1IDAgMCAxIC42MyAwbDcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOGw3LjUtNC4zNzVaTTMuNzQgOC4xMjUgMTAgMTEuNzc2bDYuMjYtMy42NTFMMTAgNC40NzQgMy43NCA4LjEyNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNCA5LjQ2YS42MjUuNjI1IDAgMCAxIC42MyAwTDEwIDExLjc3NmwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCA5LjQ2Wm0tMS42NiAyLjQxNUwxMCAxNS41MjZsNi4yNi0zLjY1MS0xLjk3NC0xLjE1MS0zLjk3MSAyLjMxNmEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtMy45Ny0yLjMxNi0xLjk3NSAxLjE1MVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==", rt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMy4yMWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDguMTI1IDEwIDExLjc3Nmw2LjI2LTMuNjUxTDEwIDQuNDc0IDMuNzQgOC4xMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjcxNCAxMCAxMCAxMi41bDQuMjg2LTIuNSAzLjIxNCAxLjg3NUwxMCAxNi4yNWwtNy41LTQuMzc1TDUuNzE0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDkuNDZhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgMTEuNzc2bDMuOTctMi4zMTZhLjYyNS42MjUgMCAwIDEgLjYzIDBsMy4yMTUgMS44NzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhMNS40IDkuNDZabS0xLjY2IDIuNDE1TDEwIDE1LjUyNmw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2LTEuOTc1IDEuMTUxWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", nt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTIuNSA2LjI1IDcuNSA0LjM3NSA3LjUtNC4zNzVMMTAgMS44NzUgMi41IDYuMjVaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMS4zMzVhLjYyNS42MjUgMCAwIDEgLjYzIDBsNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4bDcuNS00LjM3NVpNMy43NCA2LjI1IDEwIDkuOTAxbDYuMjYtMy42NTFMMTAgMi41OTkgMy43NCA2LjI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDExLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCAxMy42NTFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgMTEuMzM1Wk0zLjc0IDEzLjc1IDEwIDE3LjQwMWw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTMuNzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgNy41ODVhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgOS45MDFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgNy41ODVaTTMuNzQgMTAgMTAgMTMuNjUxIDE2LjI2IDEwbC0xLjk3NC0xLjE1MS0zLjk3MSAyLjMxNmEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtMy45Ny0yLjMxNkwzLjc0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", it = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMS45NiAxMy40MzVhLjYyNS42MjUgMCAwIDEgLjg1NS0uMjI1TDEwIDE3LjQwMWw3LjE4NS00LjE5YS42MjUuNjI1IDAgMCAxIC42MyAxLjA3OWwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEtLjIyNS0uODU1Wk05LjY4NSAxLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDYuMjUgMTAgOS45MDFsNi4yNi0zLjY1MUwxMCAyLjU5OSAzLjc0IDYuMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im01LjcxNCAxMS44NzUgNC4yODYgMi41IDQuMjg2LTIuNUwxNy41IDEzLjc1IDEwIDE4LjEyNSAyLjUgMTMuNzVsMy4yMTQtMS44NzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgMTEuMzM1YS42MjUuNjI1IDAgMCAxIC42MyAwTDEwIDEzLjY1MWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCAxMS4zMzVaTTMuNzQgMTMuNzUgMTAgMTcuNDAxbDYuMjYtMy42NTEtMS45NzQtMS4xNTEtMy45NzEgMi4zMTZhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTMuOTctMi4zMTZMMy43NCAxMy43NVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNCA3LjU4NWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCA5LjkwMWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCA3LjU4NVpNMy43NCAxMCAxMCAxMy42NTEgMTYuMjYgMTBsLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTBaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=", ot = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI0VDNEU0MCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOC4xMjUgMS4yNUExLjg3NSAxLjg3NSAwIDAgMCA2LjI1IDMuMTI1di42MjVIMy4xMjVhLjYyNS42MjUgMCAwIDAgMCAxLjI1aC42MjV2MTEuMjVBMS4yNSAxLjI1IDAgMCAwIDUgMTcuNWgxMGExLjI1IDEuMjUgMCAwIDAgMS4yNS0xLjI1VjVoLjYyNWEuNjI1LjYyNSAwIDAgMCAwLTEuMjVIMTMuNzV2LS42MjVhMS44NzUgMS44NzUgMCAwIDAtMS44NzUtMS44NzVoLTMuNzVabTQuMzc1IDIuNXYtLjYyNWEuNjI1LjYyNSAwIDAgMC0uNjI1LS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDAtLjYyNS42MjV2LjYyNWg1Wk01IDE2LjI1VjVoMTB2MTEuMjVINVpNOC4xMjUgNy41Yy4zNDUgMCAuNjI1LjI4LjYyNS42MjV2NWEuNjI1LjYyNSAwIDEgMS0xLjI1IDB2LTVjMC0uMzQ1LjI4LS42MjUuNjI1LS42MjVabTQuMzc1IDUuNjI1di01YS42MjUuNjI1IDAgMCAwLTEuMjUgMHY1YS42MjUuNjI1IDAgMSAwIDEuMjUgMFoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==";
551
- function ve(o, e, t, a, r, n, i) {
607
+ var et = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNi44NzUgMi41YS42MjUuNjI1IDAgMCAwLS42MjUuNjI0VjYuMjVIMy4xMjVhLjYyNS42MjUgMCAwIDAtLjYyNS42MjV2MTBjMCAuMzQ1LjI4LjYyNS42MjUuNjI1aDEwYy4zNDUgMCAuNjI1LS4yOC42MjUtLjYyNXYtMy4xMjZoMy4xMjVjLjM0NSAwIC42MjUtLjI4LjYyNS0uNjI1di0xMGEuNjI1LjYyNSAwIDAgMC0uNjI1LS42MjVoLTEwWm02Ljg3NSAxMGgyLjVWMy43NUg3LjV2Mi41aDUuNjI1Yy4zNDUgMCAuNjI1LjI4LjYyNS42MjV2NS42MjRabS0xMCAzLjc1VjcuNWg4Ljc1djguNzVIMy43NVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==", tt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDcuNWMwLS42OS41Ni0xLjI1IDEuMjUtMS4yNWgxMi41Yy42OSAwIDEuMjUuNTYgMS4yNSAxLjI1djguNzVjMCAuNjktLjU2IDEuMjUtMS4yNSAxLjI1SDMuNzVjLS42OSAwLTEuMjUtLjU2LTEuMjUtMS4yNVY3LjVabTEzLjc1IDBIMy43NXY4Ljc1aDEyLjVWNy41WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMS44NzVhMi4xODggMi4xODggMCAwIDAtMi4xODggMi4xODh2Mi44MTJhLjYyNS42MjUgMCAxIDEtMS4yNSAwVjQuMDYyYTMuNDM3IDMuNDM3IDAgMSAxIDYuODc1IDB2Mi44MTNhLjYyNS42MjUgMCAxIDEtMS4yNSAwVjQuMDYyQTIuMTg4IDIuMTg4IDAgMCAwIDEwIDEuODc2WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEwIDEyLjgxM2EuOTM3LjkzNyAwIDEgMCAwLTEuODc1LjkzNy45MzcgMCAwIDAgMCAxLjg3NFoiLz48L3N2Zz4=", at = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE2LjI1IDYuMjVINy41VjQuMzc1YTIuNSAyLjUgMCAwIDEgMi41LTIuNWMxLjIgMCAyLjI4MS44NiAyLjUxMiAyYS42MjUuNjI1IDAgMCAwIDEuMjI2LS4yNWMtLjM1NC0xLjczOC0xLjkyNS0zLTMuNzM4LTNhMy43NTQgMy43NTQgMCAwIDAtMy43NSAzLjc1VjYuMjVoLTIuNUExLjI1IDEuMjUgMCAwIDAgMi41IDcuNXY4Ljc1YTEuMjUgMS4yNSAwIDAgMCAxLjI1IDEuMjVoMTIuNWExLjI1IDEuMjUgMCAwIDAgMS4yNS0xLjI1VjcuNWExLjI1IDEuMjUgMCAwIDAtMS4yNS0xLjI1Wm0wIDEwSDMuNzVWNy41aDEyLjV2OC43NVptLTUuMzEzLTQuMzc1YS45MzcuOTM3IDAgMSAxLTEuODc0IDAgLjkzNy45MzcgMCAwIDEgMS44NzQgMFoiLz48L3N2Zz4K", rt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTIuNSA4LjEyNSAxMCAxMi41bDcuNS00LjM3NUwxMCAzLjc1IDIuNSA4LjEyNVoiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LjY4NSAzLjIxYS42MjUuNjI1IDAgMCAxIC42MyAwbDcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOGw3LjUtNC4zNzVaTTMuNzQgOC4xMjUgMTAgMTEuNzc2bDYuMjYtMy42NTFMMTAgNC40NzQgMy43NCA4LjEyNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNCA5LjQ2YS42MjUuNjI1IDAgMCAxIC42MyAwTDEwIDExLjc3NmwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCA5LjQ2Wm0tMS42NiAyLjQxNUwxMCAxNS41MjZsNi4yNi0zLjY1MS0xLjk3NC0xLjE1MS0zLjk3MSAyLjMxNmEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtMy45Ny0yLjMxNi0xLjk3NSAxLjE1MVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==", nt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMy4yMWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDguMTI1IDEwIDExLjc3Nmw2LjI2LTMuNjUxTDEwIDQuNDc0IDMuNzQgOC4xMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjcxNCAxMCAxMCAxMi41bDQuMjg2LTIuNSAzLjIxNCAxLjg3NUwxMCAxNi4yNWwtNy41LTQuMzc1TDUuNzE0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDkuNDZhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgMTEuNzc2bDMuOTctMi4zMTZhLjYyNS42MjUgMCAwIDEgLjYzIDBsMy4yMTUgMS44NzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhMNS40IDkuNDZabS0xLjY2IDIuNDE1TDEwIDE1LjUyNmw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2LTEuOTc1IDEuMTUxWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", it = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTIuNSA2LjI1IDcuNSA0LjM3NSA3LjUtNC4zNzVMMTAgMS44NzUgMi41IDYuMjVaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMS4zMzVhLjYyNS42MjUgMCAwIDEgLjYzIDBsNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4bDcuNS00LjM3NVpNMy43NCA2LjI1IDEwIDkuOTAxbDYuMjYtMy42NTFMMTAgMi41OTkgMy43NCA2LjI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDExLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCAxMy42NTFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgMTEuMzM1Wk0zLjc0IDEzLjc1IDEwIDE3LjQwMWw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTMuNzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgNy41ODVhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgOS45MDFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgNy41ODVaTTMuNzQgMTAgMTAgMTMuNjUxIDE2LjI2IDEwbC0xLjk3NC0xLjE1MS0zLjk3MSAyLjMxNmEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtMy45Ny0yLjMxNkwzLjc0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", ot = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMS45NiAxMy40MzVhLjYyNS42MjUgMCAwIDEgLjg1NS0uMjI1TDEwIDE3LjQwMWw3LjE4NS00LjE5YS42MjUuNjI1IDAgMCAxIC42MyAxLjA3OWwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEtLjIyNS0uODU1Wk05LjY4NSAxLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDYuMjUgMTAgOS45MDFsNi4yNi0zLjY1MUwxMCAyLjU5OSAzLjc0IDYuMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im01LjcxNCAxMS44NzUgNC4yODYgMi41IDQuMjg2LTIuNUwxNy41IDEzLjc1IDEwIDE4LjEyNSAyLjUgMTMuNzVsMy4yMTQtMS44NzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgMTEuMzM1YS42MjUuNjI1IDAgMCAxIC42MyAwTDEwIDEzLjY1MWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCAxMS4zMzVaTTMuNzQgMTMuNzUgMTAgMTcuNDAxbDYuMjYtMy42NTEtMS45NzQtMS4xNTEtMy45NzEgMi4zMTZhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTMuOTctMi4zMTZMMy43NCAxMy43NVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNCA3LjU4NWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCA5LjkwMWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCA3LjU4NVpNMy43NCAxMCAxMCAxMy42NTEgMTYuMjYgMTBsLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTBaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=", st = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI0VDNEU0MCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOC4xMjUgMS4yNUExLjg3NSAxLjg3NSAwIDAgMCA2LjI1IDMuMTI1di42MjVIMy4xMjVhLjYyNS42MjUgMCAwIDAgMCAxLjI1aC42MjV2MTEuMjVBMS4yNSAxLjI1IDAgMCAwIDUgMTcuNWgxMGExLjI1IDEuMjUgMCAwIDAgMS4yNS0xLjI1VjVoLjYyNWEuNjI1LjYyNSAwIDAgMCAwLTEuMjVIMTMuNzV2LS42MjVhMS44NzUgMS44NzUgMCAwIDAtMS44NzUtMS44NzVoLTMuNzVabTQuMzc1IDIuNXYtLjYyNWEuNjI1LjYyNSAwIDAgMC0uNjI1LS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDAtLjYyNS42MjV2LjYyNWg1Wk01IDE2LjI1VjVoMTB2MTEuMjVINVpNOC4xMjUgNy41Yy4zNDUgMCAuNjI1LjI4LjYyNS42MjV2NWEuNjI1LjYyNSAwIDEgMS0xLjI1IDB2LTVjMC0uMzQ1LjI4LS42MjUuNjI1LS42MjVabTQuMzc1IDUuNjI1di01YS42MjUuNjI1IDAgMCAwLTEuMjUgMHY1YS42MjUuNjI1IDAgMSAwIDEuMjUgMFoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==";
608
+ function me(o, e, t, a, r, n, i) {
552
609
  try {
553
610
  var s = o[n](i), c = s.value;
554
611
  } catch (u) {
@@ -556,22 +613,22 @@ function ve(o, e, t, a, r, n, i) {
556
613
  }
557
614
  s.done ? e(c) : Promise.resolve(c).then(a, r);
558
615
  }
559
- function st(o) {
616
+ function ct(o) {
560
617
  return function() {
561
618
  var e = this, t = arguments;
562
619
  return new Promise(function(a, r) {
563
620
  var n = o.apply(e, t);
564
621
  function i(c) {
565
- ve(n, a, r, i, s, "next", c);
622
+ me(n, a, r, i, s, "next", c);
566
623
  }
567
624
  function s(c) {
568
- ve(n, a, r, i, s, "throw", c);
625
+ me(n, a, r, i, s, "throw", c);
569
626
  }
570
627
  i(void 0);
571
628
  });
572
629
  };
573
630
  }
574
- const k = {
631
+ const x = {
575
632
  style: {
576
633
  position: "absolute",
577
634
  display: "none",
@@ -630,18 +687,18 @@ const k = {
630
687
  }],
631
688
  offsetTop: 50,
632
689
  icons: {
633
- copyPaste: qe,
634
- delete: ot,
635
- lock: et,
636
- unlock: tt,
637
- bringToFront: nt,
638
- sendToBack: it,
639
- bringForward: at,
640
- sendBackwards: rt
690
+ copyPaste: et,
691
+ delete: st,
692
+ lock: tt,
693
+ unlock: at,
694
+ bringToFront: it,
695
+ sendToBack: ot,
696
+ bringForward: rt,
697
+ sendBackwards: nt
641
698
  },
642
699
  handlers: {
643
700
  copyPaste: function() {
644
- var o = st(function* (t) {
701
+ var o = ct(function* (t) {
645
702
  yield t.clipboardManager.copy(), yield t.clipboardManager.paste();
646
703
  });
647
704
  function e(t) {
@@ -672,7 +729,7 @@ const k = {
672
729
  }
673
730
  }
674
731
  };
675
- function me(o, e) {
732
+ function fe(o, e) {
676
733
  var t = Object.keys(o);
677
734
  if (Object.getOwnPropertySymbols) {
678
735
  var a = Object.getOwnPropertySymbols(o);
@@ -685,22 +742,22 @@ function me(o, e) {
685
742
  function j(o) {
686
743
  for (var e = 1; e < arguments.length; e++) {
687
744
  var t = arguments[e] != null ? arguments[e] : {};
688
- e % 2 ? me(Object(t), !0).forEach(function(a) {
689
- ct(o, a, t[a]);
690
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(o, Object.getOwnPropertyDescriptors(t)) : me(Object(t)).forEach(function(a) {
745
+ e % 2 ? fe(Object(t), !0).forEach(function(a) {
746
+ ut(o, a, t[a]);
747
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(o, Object.getOwnPropertyDescriptors(t)) : fe(Object(t)).forEach(function(a) {
691
748
  Object.defineProperty(o, a, Object.getOwnPropertyDescriptor(t, a));
692
749
  });
693
750
  }
694
751
  return o;
695
752
  }
696
- function ct(o, e, t) {
697
- return (e = ut(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
753
+ function ut(o, e, t) {
754
+ return (e = dt(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
698
755
  }
699
- function ut(o) {
700
- var e = dt(o, "string");
756
+ function dt(o) {
757
+ var e = lt(o, "string");
701
758
  return typeof e == "symbol" ? e : e + "";
702
759
  }
703
- function dt(o, e) {
760
+ function lt(o, e) {
704
761
  if (typeof o != "object" || !o) return o;
705
762
  var t = o[Symbol.toPrimitive];
706
763
  if (t !== void 0) {
@@ -710,7 +767,7 @@ function dt(o, e) {
710
767
  }
711
768
  return (e === "string" ? String : Number)(o);
712
769
  }
713
- class lt {
770
+ class ht {
714
771
  /**
715
772
  * @param {object} options
716
773
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -722,11 +779,11 @@ class lt {
722
779
  if (this.options = t.options, !!this.options.showToolbar) {
723
780
  this.editor = t, this.canvas = t.canvas;
724
781
  var a = this.options.toolbar || {};
725
- this.config = j(j(j({}, k), a), {}, {
726
- style: j(j({}, k.style), a.style || {}),
727
- btnStyle: j(j({}, k.btnStyle), a.btnStyle || {}),
728
- icons: j(j({}, k.icons), a.icons || {}),
729
- handlers: j(j({}, k.handlers), a.handlers || {})
782
+ this.config = j(j(j({}, x), a), {}, {
783
+ style: j(j({}, x.style), a.style || {}),
784
+ btnStyle: j(j({}, x.btnStyle), a.btnStyle || {}),
785
+ icons: j(j({}, x.icons), a.icons || {}),
786
+ handlers: j(j({}, x.handlers), a.handlers || {})
730
787
  }), this.currentTarget = null, this.currentLocked = null, this.isTransforming = !1, this._onMouseDown = this._handleMouseDown.bind(this), this._onObjectMoving = this._startTransform.bind(this), this._onObjectScaling = this._startTransform.bind(this), this._onObjectRotating = this._startTransform.bind(this), this._onMouseUp = this._endTransform.bind(this), this._onObjectModified = this._endTransform.bind(this), this._onSelectionChange = this._updateToolbar.bind(this), this._onSelectionClear = () => {
731
788
  this.el.style.display = "none";
732
789
  }, this._createDOM(), this._bindEvents();
@@ -847,10 +904,10 @@ class lt {
847
904
  } = e.getCenterPoint(), {
848
905
  top: u,
849
906
  height: l
850
- } = e.getBoundingRect(!1, !0), d = c * n + i, h = d - t.offsetWidth / 2, g = (u + l) * n + s + a.offsetTop;
907
+ } = e.getBoundingRect(!1, !0), d = c * n + i, h = d - t.offsetWidth / 2, v = (u + l) * n + s + a.offsetTop;
851
908
  Object.assign(t.style, {
852
909
  left: "".concat(h, "px"),
853
- top: "".concat(g, "px"),
910
+ top: "".concat(v, "px"),
854
911
  display: "flex"
855
912
  });
856
913
  }
@@ -862,7 +919,7 @@ class lt {
862
919
  this.el.removeEventListener("mouseover", this._onBtnOver), this.el.removeEventListener("mouseout", this._onBtnOut), this.canvas.off("mouse:down", this._onMouseDown), this.canvas.off("object:moving", this._onObjectMoving), this.canvas.off("object:scaling", this._onObjectScaling), this.canvas.off("object:rotating", this._onObjectRotating), this.canvas.off("mouse:up", this._onMouseUp), this.canvas.off("object:modified", this._onObjectModified), this.canvas.off("selection:created", this._onSelectionChange), this.canvas.off("selection:updated", this._onSelectionChange), this.canvas.off("selection:changed", this._onSelectionChange), this.canvas.off("after:render", this._onSelectionChange), this.canvas.off("selection:cleared", this._onSelectionClear), this.el.remove();
863
920
  }
864
921
  }
865
- function fe(o, e, t, a, r, n, i) {
922
+ function Me(o, e, t, a, r, n, i) {
866
923
  try {
867
924
  var s = o[n](i), c = s.value;
868
925
  } catch (u) {
@@ -870,22 +927,22 @@ function fe(o, e, t, a, r, n, i) {
870
927
  }
871
928
  s.done ? e(c) : Promise.resolve(c).then(a, r);
872
929
  }
873
- function V(o) {
930
+ function X(o) {
874
931
  return function() {
875
932
  var e = this, t = arguments;
876
933
  return new Promise(function(a, r) {
877
934
  var n = o.apply(e, t);
878
935
  function i(c) {
879
- fe(n, a, r, i, s, "next", c);
936
+ Me(n, a, r, i, s, "next", c);
880
937
  }
881
938
  function s(c) {
882
- fe(n, a, r, i, s, "throw", c);
939
+ Me(n, a, r, i, s, "throw", c);
883
940
  }
884
941
  i(void 0);
885
942
  });
886
943
  };
887
944
  }
888
- class ht {
945
+ class gt {
889
946
  /**
890
947
  * @param {object} options
891
948
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -901,7 +958,7 @@ class ht {
901
958
  return this._historySuspendCount > 0;
902
959
  }
903
960
  _createDiffPatcher() {
904
- this.diffPatcher = Ye({
961
+ this.diffPatcher = He({
905
962
  objectHash(e) {
906
963
  return [e.id, e.format, e.locked, e.left, e.top, e.width, e.height, e.flipX, e.flipY, e.scaleX, e.scaleY, e.angle, e.opacity].join("-");
907
964
  },
@@ -974,7 +1031,7 @@ class ht {
974
1031
  */
975
1032
  loadStateFromFullState(e) {
976
1033
  var t = this;
977
- return V(function* () {
1034
+ return X(function* () {
978
1035
  if (e) {
979
1036
  console.log("loadStateFromFullState fullState", e), yield t.canvas.loadFromJSON(e);
980
1037
  var a = t.canvas.getObjects().find((n) => n.id === "montage-area");
@@ -990,7 +1047,7 @@ class ht {
990
1047
  */
991
1048
  undo() {
992
1049
  var e = this;
993
- return V(function* () {
1050
+ return X(function* () {
994
1051
  if (!e.skipHistory) {
995
1052
  if (e.currentIndex <= 0) {
996
1053
  console.log("Нет предыдущих состояний для отмены.");
@@ -1017,7 +1074,7 @@ class ht {
1017
1074
  */
1018
1075
  redo() {
1019
1076
  var e = this;
1020
- return V(function* () {
1077
+ return X(function* () {
1021
1078
  if (!e.skipHistory) {
1022
1079
  if (e.currentIndex >= e.patches.length) {
1023
1080
  console.log("Нет состояний для повтора.");
@@ -1039,8 +1096,8 @@ class ht {
1039
1096
  })();
1040
1097
  }
1041
1098
  }
1042
- var gt = 0.1, vt = 2, mt = 0.1, ft = 90, x = 16, B = 16, D = 4096, N = 4096;
1043
- function Me(o, e, t, a, r, n, i) {
1099
+ var vt = 0.1, mt = 2, ft = 0.1, Mt = 90, B = 16, Z = 16, N = 4096, L = 4096;
1100
+ function je(o, e, t, a, r, n, i) {
1044
1101
  try {
1045
1102
  var s = o[n](i), c = s.value;
1046
1103
  } catch (u) {
@@ -1048,22 +1105,22 @@ function Me(o, e, t, a, r, n, i) {
1048
1105
  }
1049
1106
  s.done ? e(c) : Promise.resolve(c).then(a, r);
1050
1107
  }
1051
- function T(o) {
1108
+ function O(o) {
1052
1109
  return function() {
1053
1110
  var e = this, t = arguments;
1054
1111
  return new Promise(function(a, r) {
1055
1112
  var n = o.apply(e, t);
1056
1113
  function i(c) {
1057
- Me(n, a, r, i, s, "next", c);
1114
+ je(n, a, r, i, s, "next", c);
1058
1115
  }
1059
1116
  function s(c) {
1060
- Me(n, a, r, i, s, "throw", c);
1117
+ je(n, a, r, i, s, "throw", c);
1061
1118
  }
1062
1119
  i(void 0);
1063
1120
  });
1064
1121
  };
1065
1122
  }
1066
- class C {
1123
+ class A {
1067
1124
  /**
1068
1125
  * @param {object} options
1069
1126
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -1072,7 +1129,7 @@ class C {
1072
1129
  var {
1073
1130
  editor: t
1074
1131
  } = e;
1075
- this.editor = t, this.options = t.options, this._createdBlobUrls = [];
1132
+ this.editor = t, this.options = t.options, this._createdBlobUrls = [], this.acceptContentTypes = this.editor.options.acceptContentTypes, this.acceptFormats = this.getAllowedFormatsFromContentTypes();
1076
1133
  }
1077
1134
  /**
1078
1135
  * Импорт изображения
@@ -1087,89 +1144,131 @@ class C {
1087
1144
  */
1088
1145
  importImage(e) {
1089
1146
  var t = this;
1090
- return T(function* () {
1147
+ return O(function* () {
1091
1148
  var {
1092
1149
  source: a,
1093
1150
  scale: r = "image-".concat(t.options.scaleType),
1094
1151
  withoutSave: n = !1
1095
1152
  } = e;
1096
1153
  if (a) {
1097
- var i = yield t.getContentType(a);
1098
- if (!t.isAllowedContentType(i)) {
1099
- var s = "Неверный contentType для изображения: ".concat(i, ". Ожидается один из: ").concat(t.options.acceptContentTypes.join(", "), ".");
1100
- console.error("ImageManager. ".concat(s)), t.editor.canvas.fire("editor:error", {
1101
- message: s
1154
+ var {
1155
+ canvas: i,
1156
+ montageArea: s,
1157
+ transformManager: c,
1158
+ historyManager: u,
1159
+ errorManager: l
1160
+ } = t.editor, d = yield t.getContentType(a), h = A.getFormatFromContentType(d), {
1161
+ acceptContentTypes: v,
1162
+ acceptFormats: m
1163
+ } = t;
1164
+ if (!t.isAllowedContentType(d)) {
1165
+ var f = "Неверный contentType для изображения: ".concat(d, ". Ожидается один из: ").concat(t.acceptContentTypes.join(", "), ".");
1166
+ l.emitError({
1167
+ origin: "ImageManager",
1168
+ method: "importImage",
1169
+ code: "INVALID_CONTENT_TYPE",
1170
+ message: f,
1171
+ data: {
1172
+ source: a,
1173
+ format: h,
1174
+ contentType: d,
1175
+ acceptContentTypes: v,
1176
+ acceptFormats: m
1177
+ }
1102
1178
  });
1103
1179
  return;
1104
1180
  }
1105
- var {
1106
- canvas: c,
1107
- montageArea: u,
1108
- transformManager: l,
1109
- historyManager: d
1110
- } = t.editor;
1111
- d.suspendHistory();
1181
+ u.suspendHistory();
1112
1182
  try {
1113
- var h, g;
1183
+ var M, g;
1114
1184
  if (a instanceof File)
1115
- h = URL.createObjectURL(a);
1185
+ M = URL.createObjectURL(a);
1116
1186
  else if (typeof a == "string") {
1117
- var v = yield fetch(a, {
1187
+ var C = yield fetch(a, {
1118
1188
  mode: "cors"
1119
- }), f = yield v.blob({
1120
- type: i,
1189
+ }), y = yield C.blob({
1190
+ type: d,
1121
1191
  quality: 1
1122
1192
  });
1123
- h = URL.createObjectURL(f);
1124
- } else
1125
- throw new Error("ImportImage. Неверный тип источника изображения. Ожидается URL или объект File.");
1126
- t._createdBlobUrls.push(h);
1127
- var y = C.getFormatFromContentType(i);
1128
- if (y === "svg") {
1129
- var m = yield Ee(h);
1130
- g = U.groupSVGElements(m.objects, m.options);
1193
+ M = URL.createObjectURL(y);
1194
+ } else {
1195
+ l.emitError({
1196
+ origin: "ImageManager",
1197
+ method: "importImage",
1198
+ code: "INVALID_SOURCE_TYPE",
1199
+ message: "Неверный тип источника изображения. Ожидается URL или объект File.",
1200
+ data: {
1201
+ source: a,
1202
+ format: h,
1203
+ contentType: d,
1204
+ acceptContentTypes: v,
1205
+ acceptFormats: m
1206
+ }
1207
+ });
1208
+ return;
1209
+ }
1210
+ if (t._createdBlobUrls.push(M), h === "svg") {
1211
+ var D = yield ke(M);
1212
+ g = U.groupSVGElements(D.objects, D.options);
1131
1213
  } else
1132
- g = yield de.fromURL(h, {
1214
+ g = yield le.fromURL(M, {
1133
1215
  crossOrigin: "anonymous"
1134
1216
  });
1135
1217
  var {
1136
- width: b,
1137
- height: M
1218
+ width: E,
1219
+ height: S
1138
1220
  } = g;
1139
- if (M > N || b > D) {
1140
- var L = yield t.resizeImageToBoundaries(g._element.src, "max"), O = URL.createObjectURL(L);
1141
- t._createdBlobUrls.push(O), g = yield de.fromURL(O, {
1221
+ if (S > L || E > N) {
1222
+ var p = yield t.resizeImageToBoundaries(g._element.src, "max"), T = URL.createObjectURL(p);
1223
+ t._createdBlobUrls.push(T), g = yield le.fromURL(T, {
1142
1224
  crossOrigin: "anonymous"
1143
1225
  });
1144
1226
  }
1145
- if (g.set("id", "".concat(g.type, "-").concat(I())), g.set("format", y), r === "scale-montage")
1227
+ if (g.set("id", "".concat(g.type, "-").concat(w())), g.set("format", h), r === "scale-montage")
1146
1228
  t.editor.canvasManager.scaleMontageAreaToImage({
1147
1229
  object: g,
1148
1230
  withoutSave: !0
1149
1231
  });
1150
1232
  else {
1151
1233
  var {
1152
- width: S,
1153
- height: A
1154
- } = u, P = t.calculateScaleFactor({
1234
+ width: Y,
1235
+ height: H
1236
+ } = s, _ = t.calculateScaleFactor({
1155
1237
  imageObject: g,
1156
1238
  scaleType: r
1157
1239
  });
1158
- r === "image-contain" && P < 1 ? l.fitObject({
1240
+ r === "image-contain" && _ < 1 ? c.fitObject({
1159
1241
  object: g,
1160
1242
  type: "contain",
1161
1243
  withoutSave: !0
1162
- }) : r === "image-cover" && (b > S || M > A) && l.fitObject({
1244
+ }) : r === "image-cover" && (E > Y || S > H) && c.fitObject({
1163
1245
  object: g,
1164
1246
  type: "cover",
1165
1247
  withoutSave: !0
1166
1248
  });
1167
1249
  }
1168
- c.add(g), c.centerObject(g), c.setActiveObject(g), c.renderAll(), d.resumeHistory(), n || d.saveState();
1169
- } catch (E) {
1170
- console.error("importImage. Ошибка импорта изображения: ", E), c.fire("editor:error", {
1171
- message: "Ошибка импорта изображения: ".concat(E.message)
1172
- }), d.resumeHistory();
1250
+ i.add(g), i.centerObject(g), i.setActiveObject(g), i.renderAll(), u.resumeHistory(), n || u.saveState(), i.fire("editor:image-imported", {
1251
+ image: g,
1252
+ format: h,
1253
+ contentType: d,
1254
+ scale: r,
1255
+ withoutSave: n,
1256
+ source: a
1257
+ });
1258
+ } catch (k) {
1259
+ l.emitError({
1260
+ origin: "ImageManager",
1261
+ method: "importImage",
1262
+ code: "IMPORT_FAILED",
1263
+ message: "Ошибка импорта изображения: ".concat(k.message),
1264
+ data: {
1265
+ source: a,
1266
+ format: h,
1267
+ contentType: d,
1268
+ scale: r,
1269
+ withoutSave: n
1270
+ }
1271
+ }), u.resumeHistory();
1173
1272
  }
1174
1273
  }
1175
1274
  })();
@@ -1184,15 +1283,22 @@ class C {
1184
1283
  */
1185
1284
  resizeImageToBoundaries(e) {
1186
1285
  var t = arguments, a = this;
1187
- return T(function* () {
1188
- var r = t.length > 1 && t[1] !== void 0 ? t[1] : "max", n = "Размер изображения больше максимального размера канваса, поэтому оно будет уменьшено до максимальных размеров: ".concat(D, "x").concat(N);
1189
- console.warn("importImage. ".concat(n)), a.editor.canvas.fire("editor:warning", {
1190
- message: n
1286
+ return O(function* () {
1287
+ var r = t.length > 1 && t[1] !== void 0 ? t[1] : "max", n = "Размер изображения больше максимального размера канваса, поэтому оно будет уменьшено до максимальных размеров: ".concat(N, "x").concat(L);
1288
+ a.editor.errorManager.emitWarning({
1289
+ origin: "ImageManager",
1290
+ method: "resizeImageToBoundaries",
1291
+ code: "IMAGE_RESIZE_WARNING",
1292
+ message: n,
1293
+ data: {
1294
+ dataURL: e,
1295
+ size: r
1296
+ }
1191
1297
  });
1192
1298
  var i = yield a.editor.workerManager.post("resizeImage", {
1193
1299
  dataURL: e,
1194
- maxWidth: D,
1195
- maxHeight: N,
1300
+ maxWidth: N,
1301
+ maxHeight: L,
1196
1302
  sizeType: r
1197
1303
  });
1198
1304
  return i;
@@ -1211,7 +1317,7 @@ class C {
1211
1317
  */
1212
1318
  exportCanvasAsImageFile() {
1213
1319
  var e = arguments, t = this;
1214
- return T(function* () {
1320
+ return O(function* () {
1215
1321
  var {
1216
1322
  fileName: a = "image.png",
1217
1323
  contentType: r = "image/png",
@@ -1221,98 +1327,114 @@ class C {
1221
1327
  canvas: s,
1222
1328
  montageArea: c,
1223
1329
  workerManager: u
1224
- } = t.editor, l = r === "application/pdf", d = l ? "image/jpg" : r, h = C.getFormatFromContentType(d);
1225
- c.setCoords();
1226
- var {
1227
- left: g,
1228
- top: v,
1229
- width: f,
1230
- height: y
1231
- } = c.getBoundingRect(), m = yield s.clone(["id", "format", "locked"]);
1232
- ["image/jpg", "image/jpeg"].includes(d) && (m.backgroundColor = "#ffffff");
1233
- var b = m.getObjects().find((w) => w.id === c.id);
1234
- b.visible = !1, m.viewportTransform = [1, 0, 0, 1, -g, -v], m.setDimensions({
1235
- width: f,
1236
- height: y
1237
- }, {
1238
- backstoreOnly: !0
1239
- }), m.renderAll();
1240
- var M = m.getObjects().filter((w) => w.format).every((w) => w.format === "svg");
1241
- if (h === "svg" && M) {
1242
- var L = m.toSVG();
1243
- m.dispose();
1244
- var O = C._exportSVGStringAsFile(L, {
1245
- exportAsBase64: n,
1246
- exportAsBlob: i,
1247
- fileName: a
1248
- }), S = {
1249
- image: O,
1250
- format: "svg",
1251
- contentType: "image/svg+xml",
1252
- fileName: a.replace(/\.[^/.]+$/, ".svg")
1253
- };
1254
- return s.fire("editor:canvas-exported", S), S;
1255
- }
1256
- var A = yield new Promise((w) => {
1257
- m.getElement().toBlob(w);
1258
- });
1259
- if (m.dispose(), i) {
1260
- var P = {
1261
- image: A,
1262
- format: h,
1263
- contentType: d,
1264
- fileName: a
1265
- };
1266
- return s.fire("editor:canvas-exported", P), P;
1267
- }
1268
- var E = yield createImageBitmap(A), re = yield u.post("toDataURL", {
1269
- format: h,
1270
- quality: 1,
1271
- bitmap: E
1272
- }, [E]);
1273
- if (l) {
1274
- var ne = 0.264583, W = f * ne, _ = y * ne, we = (yield t.editor.moduleLoader.loadModule("jspdf")).jsPDF, R = new we({
1275
- orientation: W > _ ? "landscape" : "portrait",
1276
- unit: "mm",
1277
- format: [W, _]
1330
+ } = t.editor;
1331
+ try {
1332
+ var l = r === "application/pdf", d = l ? "image/jpg" : r, h = A.getFormatFromContentType(d);
1333
+ c.setCoords();
1334
+ var {
1335
+ left: v,
1336
+ top: m,
1337
+ width: f,
1338
+ height: M
1339
+ } = c.getBoundingRect(), g = yield s.clone(["id", "format", "locked"]);
1340
+ ["image/jpg", "image/jpeg"].includes(d) && (g.backgroundColor = "#ffffff");
1341
+ var C = g.getObjects().find((b) => b.id === c.id);
1342
+ C.visible = !1, g.viewportTransform = [1, 0, 0, 1, -v, -m], g.setDimensions({
1343
+ width: f,
1344
+ height: M
1345
+ }, {
1346
+ backstoreOnly: !0
1347
+ }), g.renderAll();
1348
+ var y = g.getObjects().filter((b) => b.format).every((b) => b.format === "svg");
1349
+ if (h === "svg" && y) {
1350
+ var D = g.toSVG();
1351
+ g.dispose();
1352
+ var E = A._exportSVGStringAsFile(D, {
1353
+ exportAsBase64: n,
1354
+ exportAsBlob: i,
1355
+ fileName: a
1356
+ }), S = {
1357
+ image: E,
1358
+ format: "svg",
1359
+ contentType: "image/svg+xml",
1360
+ fileName: a.replace(/\.[^/.]+$/, ".svg")
1361
+ };
1362
+ return s.fire("editor:canvas-exported", S), S;
1363
+ }
1364
+ var p = yield new Promise((b) => {
1365
+ g.getElement().toBlob(b);
1278
1366
  });
1279
- if (R.addImage(re, "JPG", 0, 0, W, _), n) {
1280
- var Ce = R.output("datauristring"), ie = {
1281
- image: Ce,
1367
+ if (g.dispose(), i) {
1368
+ var T = {
1369
+ image: p,
1370
+ format: h,
1371
+ contentType: d,
1372
+ fileName: a
1373
+ };
1374
+ return s.fire("editor:canvas-exported", T), T;
1375
+ }
1376
+ var Y = yield createImageBitmap(p), H = yield u.post("toDataURL", {
1377
+ format: h,
1378
+ quality: 1,
1379
+ bitmap: Y
1380
+ }, [Y]);
1381
+ if (l) {
1382
+ var _ = 0.264583, k = f * _, V = M * _, Ce = (yield t.editor.moduleLoader.loadModule("jspdf")).jsPDF, G = new Ce({
1383
+ orientation: k > V ? "landscape" : "portrait",
1384
+ unit: "mm",
1385
+ format: [k, V]
1386
+ });
1387
+ if (G.addImage(H, "JPG", 0, 0, k, V), n) {
1388
+ var De = G.output("datauristring"), oe = {
1389
+ image: De,
1390
+ format: "pdf",
1391
+ contentType: "application/pdf",
1392
+ fileName: a
1393
+ };
1394
+ return s.fire("editor:canvas-exported", oe), oe;
1395
+ }
1396
+ var Ne = G.output("blob"), Le = new File([Ne], a, {
1397
+ type: "application/pdf"
1398
+ }), se = {
1399
+ image: Le,
1282
1400
  format: "pdf",
1283
1401
  contentType: "application/pdf",
1284
1402
  fileName: a
1285
1403
  };
1286
- return s.fire("editor:canvas-exported", ie), ie;
1404
+ return s.fire("editor:canvas-exported", se), se;
1287
1405
  }
1288
- var De = R.output("blob"), Ne = new File([De], a, {
1289
- type: "application/pdf"
1290
- }), oe = {
1291
- image: Ne,
1292
- format: "pdf",
1293
- contentType: "application/pdf",
1294
- fileName: a
1295
- };
1296
- return s.fire("editor:canvas-exported", oe), oe;
1297
- }
1298
- if (n) {
1299
- var se = {
1300
- image: re,
1406
+ if (n) {
1407
+ var ce = {
1408
+ image: H,
1409
+ format: h,
1410
+ contentType: d,
1411
+ fileName: a
1412
+ };
1413
+ return s.fire("editor:canvas-exported", ce), ce;
1414
+ }
1415
+ var ue = h === "svg" && !y ? a.replace(/\.[^/.]+$/, ".png") : a, Ee = new File([p], ue, {
1416
+ type: d
1417
+ }), de = {
1418
+ image: Ee,
1301
1419
  format: h,
1302
1420
  contentType: d,
1303
- fileName: a
1421
+ fileName: ue
1304
1422
  };
1305
- return s.fire("editor:canvas-exported", se), se;
1423
+ return s.fire("editor:canvas-exported", de), de;
1424
+ } catch (b) {
1425
+ return t.editor.errorManager.emitError({
1426
+ origin: "ImageManager",
1427
+ method: "exportCanvasAsImageFile",
1428
+ code: "IMAGE_EXPORT_FAILED",
1429
+ message: "Ошибка экспорта изображения: ".concat(b.message),
1430
+ data: {
1431
+ contentType: r,
1432
+ fileName: a,
1433
+ exportAsBase64: n,
1434
+ exportAsBlob: i
1435
+ }
1436
+ }), "";
1306
1437
  }
1307
- var ce = h === "svg" && !M ? a.replace(/\.[^/.]+$/, ".png") : a, Le = new File([A], ce, {
1308
- type: d
1309
- }), ue = {
1310
- image: Le,
1311
- format: h,
1312
- contentType: d,
1313
- fileName: ce
1314
- };
1315
- return s.fire("editor:canvas-exported", ue), ue;
1316
1438
  })();
1317
1439
  }
1318
1440
  /**
@@ -1328,7 +1450,7 @@ class C {
1328
1450
  */
1329
1451
  exportObjectAsImageFile() {
1330
1452
  var e = arguments, t = this;
1331
- return T(function* () {
1453
+ return O(function* () {
1332
1454
  var {
1333
1455
  object: a,
1334
1456
  fileName: r = "image.png",
@@ -1340,57 +1462,81 @@ class C {
1340
1462
  workerManager: u
1341
1463
  } = t.editor, l = a || c.getActiveObject();
1342
1464
  if (!l)
1343
- return console.error("exportObjectAsDataURL. Не выбран объект"), c.fire("editor:error", {
1344
- message: "Не выбран объект для экспорта"
1465
+ return t.editor.errorManager.emitError({
1466
+ origin: "ImageManager",
1467
+ method: "exportObjectAsImageFile",
1468
+ code: "NO_OBJECT_SELECTED",
1469
+ message: "Не выбран объект для экспорта",
1470
+ data: {
1471
+ contentType: n,
1472
+ fileName: r,
1473
+ exportAsBase64: i,
1474
+ exportAsBlob: s
1475
+ }
1345
1476
  }), "";
1346
- var d = C.getFormatFromContentType(n);
1347
- if (d === "svg") {
1348
- var h = l.toSVG(), g = t._exportSVGStringAsFile(h, {
1349
- exportAsBase64: i,
1350
- exportAsBlob: s,
1351
- fileName: r
1352
- }), v = {
1353
- image: g,
1354
- format: d,
1355
- contentType: "image/svg+xml",
1356
- fileName: r.replace(/\.[^/.]+$/, ".svg")
1357
- };
1358
- return c.fire("editor:object-exported", v), v;
1359
- }
1360
- if (i) {
1361
- var f = yield createImageBitmap(l._element), y = yield u.post("toDataURL", {
1362
- format: d,
1363
- quality: 1,
1364
- bitmap: f
1365
- }, [f]), m = {
1366
- image: y,
1367
- format: d,
1368
- contentType: n,
1369
- fileName: r
1370
- };
1371
- return c.fire("editor:object-exported", m), m;
1372
- }
1373
- var b = l.toCanvasElement(), M = yield new Promise((A) => {
1374
- b.toBlob(A);
1375
- });
1376
- if (s) {
1377
- var L = {
1378
- image: M,
1477
+ try {
1478
+ var d = A.getFormatFromContentType(n);
1479
+ if (d === "svg") {
1480
+ var h = l.toSVG(), v = t._exportSVGStringAsFile(h, {
1481
+ exportAsBase64: i,
1482
+ exportAsBlob: s,
1483
+ fileName: r
1484
+ }), m = {
1485
+ image: v,
1486
+ format: d,
1487
+ contentType: "image/svg+xml",
1488
+ fileName: r.replace(/\.[^/.]+$/, ".svg")
1489
+ };
1490
+ return c.fire("editor:object-exported", m), m;
1491
+ }
1492
+ if (i) {
1493
+ var f = yield createImageBitmap(l._element), M = yield u.post("toDataURL", {
1494
+ format: d,
1495
+ quality: 1,
1496
+ bitmap: f
1497
+ }, [f]), g = {
1498
+ image: M,
1499
+ format: d,
1500
+ contentType: n,
1501
+ fileName: r
1502
+ };
1503
+ return c.fire("editor:object-exported", g), g;
1504
+ }
1505
+ var C = l.toCanvasElement(), y = yield new Promise((p) => {
1506
+ C.toBlob(p);
1507
+ });
1508
+ if (s) {
1509
+ var D = {
1510
+ image: y,
1511
+ format: d,
1512
+ contentType: n,
1513
+ fileName: r
1514
+ };
1515
+ return c.fire("editor:object-exported", D), D;
1516
+ }
1517
+ var E = new File([y], r, {
1518
+ type: n
1519
+ }), S = {
1520
+ image: E,
1379
1521
  format: d,
1380
1522
  contentType: n,
1381
1523
  fileName: r
1382
1524
  };
1383
- return c.fire("editor:object-exported", L), L;
1525
+ return c.fire("editor:object-exported", S), S;
1526
+ } catch (p) {
1527
+ return t.editor.errorManager.emitError({
1528
+ origin: "ImageManager",
1529
+ method: "exportObjectAsImageFile",
1530
+ code: "IMAGE_EXPORT_FAILED",
1531
+ message: "Ошибка экспорта объекта: ".concat(p.message),
1532
+ data: {
1533
+ contentType: n,
1534
+ fileName: r,
1535
+ exportAsBase64: i,
1536
+ exportAsBlob: s
1537
+ }
1538
+ }), "";
1384
1539
  }
1385
- var O = new File([M], r, {
1386
- type: n
1387
- }), S = {
1388
- image: O,
1389
- format: d,
1390
- contentType: n,
1391
- fileName: r
1392
- };
1393
- return c.fire("editor:object-exported", S), S;
1394
1540
  })();
1395
1541
  }
1396
1542
  /**
@@ -1423,6 +1569,13 @@ class C {
1423
1569
  type: "image/svg+xml"
1424
1570
  });
1425
1571
  }
1572
+ /**
1573
+ * Получает список допустимых форматов изображений
1574
+ * @returns {string[]} - массив допустимых форматов изображений
1575
+ */
1576
+ getAllowedFormatsFromContentTypes() {
1577
+ return this.acceptContentTypes.map((e) => A.getFormatFromContentType(e)).filter((e) => e);
1578
+ }
1426
1579
  /**
1427
1580
  * Извлекает чистый формат (subtype) из contentType,
1428
1581
  * отбросив любую часть после «+» или «;»
@@ -1440,21 +1593,8 @@ class C {
1440
1593
  * @returns {boolean} true, если contentType допустим, иначе false
1441
1594
  */
1442
1595
  isAllowedContentType() {
1443
- var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", {
1444
- acceptContentTypes: t
1445
- } = this.editor.options;
1446
- return t.includes(e);
1447
- }
1448
- /**
1449
- * Проверяет, является ли формат допустимым.
1450
- * @param {string} format - формат изображения, например 'png', 'jpeg', 'svg'
1451
- * @returns {boolean} true, если формат допустим, иначе false
1452
- */
1453
- isAllowedFormat() {
1454
- var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", {
1455
- acceptContentTypes: t
1456
- } = this.editor.options, a = "image/".concat(e);
1457
- return t.includes(a);
1596
+ var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
1597
+ return this.acceptContentTypes.includes(e);
1458
1598
  }
1459
1599
  /**
1460
1600
  * Получает contentType изображения из источника
@@ -1464,7 +1604,7 @@ class C {
1464
1604
  */
1465
1605
  getContentType(e) {
1466
1606
  var t = this;
1467
- return T(function* () {
1607
+ return O(function* () {
1468
1608
  return typeof e == "string" ? t.getContentTypeFromUrl(e) : e.type || "application/octet-stream";
1469
1609
  })();
1470
1610
  }
@@ -1476,7 +1616,7 @@ class C {
1476
1616
  */
1477
1617
  getContentTypeFromUrl(e) {
1478
1618
  var t = this;
1479
- return T(function* () {
1619
+ return O(function* () {
1480
1620
  if (e.startsWith("data:")) {
1481
1621
  var a = e.match(/^data:([^;]+)/);
1482
1622
  return a ? a[1] : "application/octet-stream";
@@ -1501,15 +1641,13 @@ class C {
1501
1641
  */
1502
1642
  getContentTypeFromExtension(e) {
1503
1643
  try {
1504
- var t, {
1505
- acceptContentTypes: a
1506
- } = this.editor.options, r = new URL(e), n = (t = r.pathname.split(".").pop()) === null || t === void 0 ? void 0 : t.toLowerCase(), i = {};
1507
- return a.forEach((s) => {
1508
- var c = C.getFormatFromContentType(s);
1509
- c && (i[c] = s);
1510
- }), i[n] || "application/octet-stream";
1511
- } catch (s) {
1512
- return console.warn("Не удалось определить расширение из URL:", e, s), "application/octet-stream";
1644
+ var t, a = new URL(e), r = (t = a.pathname.split(".").pop()) === null || t === void 0 ? void 0 : t.toLowerCase(), n = {};
1645
+ return this.acceptContentTypes.forEach((i) => {
1646
+ var s = A.getFormatFromContentType(i);
1647
+ s && (n[s] = i);
1648
+ }), n[r] || "application/octet-stream";
1649
+ } catch (i) {
1650
+ return console.warn("Не удалось определить расширение из URL:", e, i), "application/octet-stream";
1513
1651
  }
1514
1652
  }
1515
1653
  /**
@@ -1533,7 +1671,7 @@ class C {
1533
1671
  return a === "contain" || a === "image-contain" ? Math.min(n / s, i / c) : a === "cover" || a === "image-cover" ? Math.max(n / s, i / c) : 1;
1534
1672
  }
1535
1673
  }
1536
- class Mt {
1674
+ class jt {
1537
1675
  /**
1538
1676
  * @param {object} options
1539
1677
  * @param {ImageEditor} options.editor – экземпляр редактора
@@ -1568,7 +1706,7 @@ class Mt {
1568
1706
  } = this.editor, {
1569
1707
  width: c,
1570
1708
  height: u
1571
- } = i, l = Number(Math.max(Math.min(e, D), x));
1709
+ } = i, l = Number(Math.max(Math.min(e, N), B));
1572
1710
  if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreWidth(s) : this.setCanvasBackstoreWidth(l), i.set({
1573
1711
  width: l
1574
1712
  }), n.clipPath.set({
@@ -1579,10 +1717,10 @@ class Mt {
1579
1717
  return;
1580
1718
  }
1581
1719
  var {
1582
- left: g,
1583
- top: v
1720
+ left: v,
1721
+ top: m
1584
1722
  } = this.getObjectDefaultCoords(i), f = n.getZoom();
1585
- n.setViewportTransform([f, 0, 0, f, g, v]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), n == null || n.fire("editor:resolution-width-changed", {
1723
+ n.setViewportTransform([f, 0, 0, f, v, m]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), n == null || n.fire("editor:resolution-width-changed", {
1586
1724
  width: e
1587
1725
  });
1588
1726
  }
@@ -1611,7 +1749,7 @@ class Mt {
1611
1749
  } = this.editor, {
1612
1750
  width: c,
1613
1751
  height: u
1614
- } = i, l = Number(Math.max(Math.min(e, N), B));
1752
+ } = i, l = Number(Math.max(Math.min(e, L), Z));
1615
1753
  if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreHeight(s) : this.setCanvasBackstoreHeight(l), i.set({
1616
1754
  height: l
1617
1755
  }), n.clipPath.set({
@@ -1622,10 +1760,10 @@ class Mt {
1622
1760
  return;
1623
1761
  }
1624
1762
  var {
1625
- left: g,
1626
- top: v
1763
+ left: v,
1764
+ top: m
1627
1765
  } = this.getObjectDefaultCoords(i), f = n.getZoom();
1628
- n.setViewportTransform([f, 0, 0, f, g, v]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), n == null || n.fire("editor:resolution-height-changed", {
1766
+ n.setViewportTransform([f, 0, 0, f, v, m]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), n == null || n.fire("editor:resolution-height-changed", {
1629
1767
  height: e
1630
1768
  });
1631
1769
  }
@@ -1638,7 +1776,7 @@ class Mt {
1638
1776
  var {
1639
1777
  canvas: e,
1640
1778
  montageArea: t
1641
- } = this.editor, a = e.getWidth(), r = e.getHeight(), n = e.getZoom(), i = new ke(a / 2, r / 2);
1779
+ } = this.editor, a = e.getWidth(), r = e.getHeight(), n = e.getZoom(), i = new xe(a / 2, r / 2);
1642
1780
  t.set({
1643
1781
  left: a / 2,
1644
1782
  top: r / 2
@@ -1673,7 +1811,7 @@ class Mt {
1673
1811
  }
1674
1812
  setCanvasBackstoreWidth(e) {
1675
1813
  if (!(!e || typeof e != "number")) {
1676
- var t = Math.max(Math.min(e, D), x);
1814
+ var t = Math.max(Math.min(e, N), B);
1677
1815
  this.editor.canvas.setDimensions({
1678
1816
  width: t
1679
1817
  }, {
@@ -1683,7 +1821,7 @@ class Mt {
1683
1821
  }
1684
1822
  setCanvasBackstoreHeight(e) {
1685
1823
  if (!(!e || typeof e != "number")) {
1686
- var t = Math.max(Math.min(e, N), B);
1824
+ var t = Math.max(Math.min(e, L), Z);
1687
1825
  this.editor.canvas.setDimensions({
1688
1826
  height: t
1689
1827
  }, {
@@ -1694,7 +1832,7 @@ class Mt {
1694
1832
  adaptCanvasToContainer() {
1695
1833
  var {
1696
1834
  canvas: e
1697
- } = this.editor, t = e.editorContainer, a = t.clientWidth, r = t.clientHeight, n = Math.max(Math.min(a, D), x), i = Math.max(Math.min(r, N), B);
1835
+ } = this.editor, t = e.editorContainer, a = t.clientWidth, r = t.clientHeight, n = Math.max(Math.min(a, N), B), i = Math.max(Math.min(r, L), Z);
1698
1836
  console.log("adaptCanvasToContainer newWidth", n), console.log("adaptCanvasToContainer newHeight", i), e.setDimensions({
1699
1837
  width: n,
1700
1838
  height: i
@@ -1702,6 +1840,29 @@ class Mt {
1702
1840
  backstoreOnly: !0
1703
1841
  });
1704
1842
  }
1843
+ /**
1844
+ * Заготовка.
1845
+ * Обновляет CSS-размеры канваса в зависимости от текущего зума, чтобы можно было скроллить вниз-вверх, влево-вправо.
1846
+ *
1847
+ * TODO: Сейчас изображение обрезается при зуме.
1848
+ * Нужно сделать зум по курсору мыши внутри монтажной области, и возможность перетаскивать канвас с зажатым пробелом.
1849
+ *
1850
+ * Метод нужно вызывать после zoomToPoint.
1851
+ *
1852
+ * @param {Number} zoom — текущее значение zoom (например, 1, 1.2, 2 и т.д.)
1853
+ */
1854
+ updateCssDimensionsForZoom(e) {
1855
+ var {
1856
+ canvas: t,
1857
+ montageArea: a
1858
+ } = this.editor, r = a.width * e, n = a.height * e, i = t.wrapperEl.parentNode, s = r <= i.clientWidth ? "100%" : r, c = n <= i.clientHeight ? "100%" : n;
1859
+ t.setDimensions({
1860
+ width: s,
1861
+ height: c
1862
+ }, {
1863
+ cssOnly: !0
1864
+ });
1865
+ }
1705
1866
  /**
1706
1867
  * Устанавливаем CSS ширину канваса для отображения
1707
1868
  * @param {string|number} width
@@ -1855,29 +2016,29 @@ class Mt {
1855
2016
  width: l,
1856
2017
  height: d
1857
2018
  } = u;
1858
- if (l < x || d < B) {
1859
- var h = "Размер изображения меньше минимального размера канваса, поэтому оно будет растянуто до минимальных размеров: ".concat(x, "x").concat(B);
2019
+ if (l < B || d < Z) {
2020
+ var h = "Размер изображения меньше минимального размера канваса, поэтому оно будет растянуто до минимальных размеров: ".concat(B, "x").concat(Z);
1860
2021
  console.warn("scaleMontageAreaToImage. ".concat(h)), r.fire("editor:warning", {
1861
2022
  message: h
1862
2023
  });
1863
2024
  }
1864
- var g = Math.min(l, D), v = Math.min(d, N);
2025
+ var v = Math.min(l, N), m = Math.min(d, L);
1865
2026
  if (t) {
1866
2027
  var {
1867
2028
  width: f,
1868
- height: y
1869
- } = n, m = l / f, b = d / y, M = Math.max(m, b);
1870
- g = f * M, v = y * M;
2029
+ height: M
2030
+ } = n, g = l / f, C = d / M, y = Math.max(g, C);
2031
+ v = f * y, m = M * y;
1871
2032
  }
1872
- this.setResolutionWidth(g, {
2033
+ this.setResolutionWidth(v, {
1873
2034
  withoutSave: !0
1874
- }), this.setResolutionHeight(v, {
2035
+ }), this.setResolutionHeight(m, {
1875
2036
  withoutSave: !0
1876
2037
  }), (l > s || d > c) && i.calculateAndApplyDefaultZoom(s, c), i.resetObject(u, {
1877
2038
  withoutSave: !0
1878
2039
  }), r.centerObject(u), r.renderAll(), a || this.editor.historyManager.saveState(), r.fire("editor:canvas-scaled", {
1879
- width: g,
1880
- height: v
2040
+ width: v,
2041
+ height: m
1881
2042
  });
1882
2043
  }
1883
2044
  }
@@ -1932,7 +2093,7 @@ class Mt {
1932
2093
  return r.filter((n) => n.id !== t.id && n.id !== a.id);
1933
2094
  }
1934
2095
  }
1935
- class jt {
2096
+ class yt {
1936
2097
  /**
1937
2098
  * @param {object} options
1938
2099
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -1971,7 +2132,7 @@ class jt {
1971
2132
  * Если передавать координаты курсора, то нужно быть аккуратнее, так как юзер может выйти за пределы рабочей области
1972
2133
  */
1973
2134
  zoom() {
1974
- var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : mt, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
2135
+ var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ft, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
1975
2136
  if (e) {
1976
2137
  var {
1977
2138
  canvas: a,
@@ -2043,7 +2204,7 @@ class jt {
2043
2204
  * @fires editor:object-rotated
2044
2205
  */
2045
2206
  rotate() {
2046
- var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ft, {
2207
+ var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Mt, {
2047
2208
  withoutSave: t
2048
2209
  } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
2049
2210
  canvas: a,
@@ -2130,13 +2291,13 @@ class jt {
2130
2291
  if (["activeselection"].includes(c.type) && !r) {
2131
2292
  var u = c.getObjects();
2132
2293
  n.discardActiveObject(), u.forEach((h) => {
2133
- var g = i.calculateScaleFactor({
2294
+ var v = i.calculateScaleFactor({
2134
2295
  imageObject: h,
2135
2296
  scaleType: t
2136
2297
  });
2137
- h.scale(g), n.centerObject(h);
2298
+ h.scale(v), n.centerObject(h);
2138
2299
  });
2139
- var l = new z(u, {
2300
+ var l = new P(u, {
2140
2301
  canvas: n
2141
2302
  });
2142
2303
  n.setActiveObject(l);
@@ -2198,12 +2359,12 @@ class jt {
2198
2359
  height: d
2199
2360
  } = n, {
2200
2361
  width: h,
2201
- height: g
2202
- } = u, v = i.calculateScaleFactor({
2362
+ height: v
2363
+ } = u, m = i.calculateScaleFactor({
2203
2364
  imageObject: u,
2204
2365
  scaleType: c
2205
2366
  });
2206
- c === "contain" && v < 1 || c === "cover" && (h > l || g > d) ? this.fitObject({
2367
+ c === "contain" && m < 1 || c === "cover" && (h > l || v > d) ? this.fitObject({
2207
2368
  object: u,
2208
2369
  withoutSave: !0
2209
2370
  }) : u.set({
@@ -2219,7 +2380,7 @@ class jt {
2219
2380
  }
2220
2381
  }
2221
2382
  }
2222
- class yt {
2383
+ class pt {
2223
2384
  /**
2224
2385
  * @param {object} options
2225
2386
  * @param {ImageEditor} options.editor – экземпляр редактора
@@ -2319,7 +2480,7 @@ class yt {
2319
2480
  }
2320
2481
  }
2321
2482
  }
2322
- class H {
2483
+ class W {
2323
2484
  /**
2324
2485
  * @param {object} options
2325
2486
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2366,7 +2527,7 @@ class H {
2366
2527
  } = this.editor;
2367
2528
  r.suspendHistory();
2368
2529
  var n = e || a.getActiveObject();
2369
- n && (n.type === "activeselection" ? H._moveSelectionForward(a, n) : a.bringObjectForward(n), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:object-bring-forward"));
2530
+ n && (n.type === "activeselection" ? W._moveSelectionForward(a, n) : a.bringObjectForward(n), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:object-bring-forward"));
2370
2531
  }
2371
2532
  /**
2372
2533
  * Отправить объект на задний план по оси Z
@@ -2416,7 +2577,7 @@ class H {
2416
2577
  } = this.editor;
2417
2578
  n.suspendHistory();
2418
2579
  var s = e || a.getActiveObject();
2419
- s && (s.type === "activeselection" ? H._moveSelectionBackwards(a, s) : a.sendObjectBackwards(s), a.sendObjectToBack(r), a.sendObjectToBack(i), a.renderAll(), n.resumeHistory(), t || n.saveState(), a.fire("editor:object-send-backwards"));
2580
+ s && (s.type === "activeselection" ? W._moveSelectionBackwards(a, s) : a.sendObjectBackwards(s), a.sendObjectToBack(r), a.sendObjectToBack(i), a.renderAll(), n.resumeHistory(), t || n.saveState(), a.fire("editor:object-send-backwards"));
2420
2581
  }
2421
2582
  /**
2422
2583
  * Сдвигает выделенные объекты на один уровень вверх относительно ближайшего верхнего объекта
@@ -2428,7 +2589,7 @@ class H {
2428
2589
  static _moveSelectionForward(e, t) {
2429
2590
  for (var a = e.getObjects(), r = t.getObjects(), n = r.map((l) => a.indexOf(l)), i = -1, s = function(d) {
2430
2591
  var h = a[d];
2431
- if (!r.includes(h) && n.some((g) => d > g))
2592
+ if (!r.includes(h) && n.some((v) => d > v))
2432
2593
  return i = d, 1;
2433
2594
  }, c = 0; c < a.length && !s(c); c += 1)
2434
2595
  ;
@@ -2455,8 +2616,8 @@ class H {
2455
2616
  e.moveObjectTo(r[i], n - 1);
2456
2617
  }
2457
2618
  }
2458
- var pt = ["id", "left", "top", "width", "height", "fill"], bt = ["id", "left", "top", "radius", "fill"], It = ["id", "left", "top", "width", "height", "fill"];
2459
- function je(o, e) {
2619
+ var bt = ["id", "left", "top", "width", "height", "fill"], It = ["id", "left", "top", "radius", "fill"], St = ["id", "left", "top", "width", "height", "fill"];
2620
+ function ye(o, e) {
2460
2621
  var t = Object.keys(o);
2461
2622
  if (Object.getOwnPropertySymbols) {
2462
2623
  var a = Object.getOwnPropertySymbols(o);
@@ -2466,25 +2627,25 @@ function je(o, e) {
2466
2627
  }
2467
2628
  return t;
2468
2629
  }
2469
- function F(o) {
2630
+ function Q(o) {
2470
2631
  for (var e = 1; e < arguments.length; e++) {
2471
2632
  var t = arguments[e] != null ? arguments[e] : {};
2472
- e % 2 ? je(Object(t), !0).forEach(function(a) {
2473
- St(o, a, t[a]);
2474
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(o, Object.getOwnPropertyDescriptors(t)) : je(Object(t)).forEach(function(a) {
2633
+ e % 2 ? ye(Object(t), !0).forEach(function(a) {
2634
+ At(o, a, t[a]);
2635
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(o, Object.getOwnPropertyDescriptors(t)) : ye(Object(t)).forEach(function(a) {
2475
2636
  Object.defineProperty(o, a, Object.getOwnPropertyDescriptor(t, a));
2476
2637
  });
2477
2638
  }
2478
2639
  return o;
2479
2640
  }
2480
- function St(o, e, t) {
2481
- return (e = At(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
2641
+ function At(o, e, t) {
2642
+ return (e = wt(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
2482
2643
  }
2483
- function At(o) {
2484
- var e = wt(o, "string");
2644
+ function wt(o) {
2645
+ var e = Ct(o, "string");
2485
2646
  return typeof e == "symbol" ? e : e + "";
2486
2647
  }
2487
- function wt(o, e) {
2648
+ function Ct(o, e) {
2488
2649
  if (typeof o != "object" || !o) return o;
2489
2650
  var t = o[Symbol.toPrimitive];
2490
2651
  if (t !== void 0) {
@@ -2494,16 +2655,16 @@ function wt(o, e) {
2494
2655
  }
2495
2656
  return (e === "string" ? String : Number)(o);
2496
2657
  }
2497
- function G(o, e) {
2658
+ function J(o, e) {
2498
2659
  if (o == null) return {};
2499
- var t, a, r = Ct(o, e);
2660
+ var t, a, r = Dt(o, e);
2500
2661
  if (Object.getOwnPropertySymbols) {
2501
2662
  var n = Object.getOwnPropertySymbols(o);
2502
2663
  for (a = 0; a < n.length; a++) t = n[a], e.indexOf(t) === -1 && {}.propertyIsEnumerable.call(o, t) && (r[t] = o[t]);
2503
2664
  }
2504
2665
  return r;
2505
2666
  }
2506
- function Ct(o, e) {
2667
+ function Dt(o, e) {
2507
2668
  if (o == null) return {};
2508
2669
  var t = {};
2509
2670
  for (var a in o) if ({}.hasOwnProperty.call(o, a)) {
@@ -2512,7 +2673,7 @@ function Ct(o, e) {
2512
2673
  }
2513
2674
  return t;
2514
2675
  }
2515
- class Dt {
2676
+ class Nt {
2516
2677
  /**
2517
2678
  * @param {object} options
2518
2679
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2540,18 +2701,18 @@ class Dt {
2540
2701
  */
2541
2702
  addRectangle() {
2542
2703
  var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, {
2543
- id: t = "rect-".concat(I()),
2704
+ id: t = "rect-".concat(w()),
2544
2705
  left: a,
2545
2706
  top: r,
2546
2707
  width: n = 100,
2547
2708
  height: i = 100,
2548
2709
  fill: s = "blue"
2549
- } = e, c = G(e, pt), {
2710
+ } = e, c = J(e, bt), {
2550
2711
  withoutSelection: u,
2551
2712
  withoutAdding: l
2552
2713
  } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
2553
2714
  canvas: d
2554
- } = this.editor, h = new xe(F({
2715
+ } = this.editor, h = new Be(Q({
2555
2716
  id: t,
2556
2717
  left: a,
2557
2718
  top: r,
@@ -2577,17 +2738,17 @@ class Dt {
2577
2738
  */
2578
2739
  addCircle() {
2579
2740
  var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, {
2580
- id: t = "circle-".concat(I()),
2741
+ id: t = "circle-".concat(w()),
2581
2742
  left: a,
2582
2743
  top: r,
2583
2744
  radius: n = 50,
2584
2745
  fill: i = "green"
2585
- } = e, s = G(e, bt), {
2746
+ } = e, s = J(e, It), {
2586
2747
  withoutSelection: c,
2587
2748
  withoutAdding: u
2588
2749
  } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
2589
2750
  canvas: l
2590
- } = this.editor, d = new Be(F({
2751
+ } = this.editor, d = new Ze(Q({
2591
2752
  id: t,
2592
2753
  left: a,
2593
2754
  top: r,
@@ -2613,18 +2774,18 @@ class Dt {
2613
2774
  */
2614
2775
  addTriangle() {
2615
2776
  var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, {
2616
- id: t = "triangle-".concat(I()),
2777
+ id: t = "triangle-".concat(w()),
2617
2778
  left: a,
2618
2779
  top: r,
2619
2780
  width: n = 100,
2620
2781
  height: i = 100,
2621
2782
  fill: s = "yellow"
2622
- } = e, c = G(e, It), {
2783
+ } = e, c = J(e, St), {
2623
2784
  withoutSelection: u,
2624
2785
  withoutAdding: l
2625
2786
  } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
2626
2787
  canvas: d
2627
- } = this.editor, h = new Ze(F({
2788
+ } = this.editor, h = new ze(Q({
2628
2789
  id: t,
2629
2790
  left: a,
2630
2791
  top: r,
@@ -2635,7 +2796,7 @@ class Dt {
2635
2796
  return !a && !r && d.centerObject(h), l || (d.add(h), u || d.setActiveObject(h), d.renderAll()), h;
2636
2797
  }
2637
2798
  }
2638
- function ye(o, e, t, a, r, n, i) {
2799
+ function pe(o, e, t, a, r, n, i) {
2639
2800
  try {
2640
2801
  var s = o[n](i), c = s.value;
2641
2802
  } catch (u) {
@@ -2643,22 +2804,22 @@ function ye(o, e, t, a, r, n, i) {
2643
2804
  }
2644
2805
  s.done ? e(c) : Promise.resolve(c).then(a, r);
2645
2806
  }
2646
- function pe(o) {
2807
+ function be(o) {
2647
2808
  return function() {
2648
2809
  var e = this, t = arguments;
2649
2810
  return new Promise(function(a, r) {
2650
2811
  var n = o.apply(e, t);
2651
2812
  function i(c) {
2652
- ye(n, a, r, i, s, "next", c);
2813
+ pe(n, a, r, i, s, "next", c);
2653
2814
  }
2654
2815
  function s(c) {
2655
- ye(n, a, r, i, s, "throw", c);
2816
+ pe(n, a, r, i, s, "throw", c);
2656
2817
  }
2657
2818
  i(void 0);
2658
2819
  });
2659
2820
  };
2660
2821
  }
2661
- class Nt {
2822
+ class Lt {
2662
2823
  /**
2663
2824
  * @param {object} options
2664
2825
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2675,7 +2836,7 @@ class Nt {
2675
2836
  */
2676
2837
  copy() {
2677
2838
  var e = this;
2678
- return pe(function* () {
2839
+ return be(function* () {
2679
2840
  var {
2680
2841
  canvas: t
2681
2842
  } = e.editor, a = t.getActiveObject();
@@ -2719,18 +2880,18 @@ class Nt {
2719
2880
  */
2720
2881
  paste() {
2721
2882
  var e = this;
2722
- return pe(function* () {
2883
+ return be(function* () {
2723
2884
  var {
2724
2885
  canvas: t
2725
2886
  } = e.editor;
2726
2887
  if (e.clipboard) {
2727
2888
  var a = yield e.clipboard.clone(["format"]);
2728
2889
  t.discardActiveObject(), a.set({
2729
- id: "".concat(a.type, "-").concat(I()),
2890
+ id: "".concat(a.type, "-").concat(w()),
2730
2891
  left: a.left + 10,
2731
2892
  top: a.top + 10,
2732
2893
  evented: !0
2733
- }), a instanceof z ? (a.canvas = t, a.forEachObject((r) => {
2894
+ }), a instanceof P ? (a.canvas = t, a.forEachObject((r) => {
2734
2895
  t.add(r);
2735
2896
  })) : t.add(a), t.setActiveObject(a), t.requestRenderAll(), t.fire("editor:object-pasted", {
2736
2897
  object: a
@@ -2739,7 +2900,7 @@ class Nt {
2739
2900
  })();
2740
2901
  }
2741
2902
  }
2742
- class Lt {
2903
+ class Et {
2743
2904
  /**
2744
2905
  * @param {object} options
2745
2906
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2851,8 +3012,8 @@ class Ot {
2851
3012
  r.suspendHistory();
2852
3013
  var n = e || a.getActiveObject();
2853
3014
  if (n && n.type === "activeselection") {
2854
- var i = n.getObjects(), s = new ze(i);
2855
- i.forEach((c) => a.remove(c)), s.set("id", "".concat(s.type, "-").concat(I())), a.add(s), a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-grouped");
3015
+ var i = n.getObjects(), s = new Pe(i);
3016
+ i.forEach((c) => a.remove(c)), s.set("id", "".concat(s.type, "-").concat(w())), a.add(s), a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-grouped");
2856
3017
  }
2857
3018
  }
2858
3019
  /**
@@ -2875,7 +3036,7 @@ class Ot {
2875
3036
  if (!(!n || n.type !== "group")) {
2876
3037
  var i = n.removeAll();
2877
3038
  a.remove(n), i.forEach((c) => a.add(c));
2878
- var s = new z(i, {
3039
+ var s = new P(i, {
2879
3040
  canvas: a
2880
3041
  });
2881
3042
  a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-ungrouped");
@@ -2904,7 +3065,7 @@ class Tt {
2904
3065
  objectLockManager: a
2905
3066
  } = this.editor;
2906
3067
  e.discardActiveObject();
2907
- var r = t.getObjects(), n = r.some((s) => s.locked), i = r.length > 1 ? new z(t.getObjects(), {
3068
+ var r = t.getObjects(), n = r.some((s) => s.locked), i = r.length > 1 ? new P(t.getObjects(), {
2908
3069
  canvas: e
2909
3070
  }) : r[0];
2910
3071
  n && a.lockObject({
@@ -2916,7 +3077,7 @@ class Tt {
2916
3077
  });
2917
3078
  }
2918
3079
  }
2919
- class Et {
3080
+ class kt {
2920
3081
  /**
2921
3082
  * @param {object} options
2922
3083
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2951,7 +3112,118 @@ class Et {
2951
3112
  }), a.discardActiveObject(), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-deleted"));
2952
3113
  }
2953
3114
  }
2954
- function be(o, e, t, a, r, n, i) {
3115
+ var xt = {
3116
+ IMAGE_MANAGER: {
3117
+ /**
3118
+ * Некорректный Content-Type изображения
3119
+ */
3120
+ INVALID_CONTENT_TYPE: "INVALID_CONTENT_TYPE",
3121
+ /**
3122
+ * Некорректный тип источника изображения
3123
+ */
3124
+ INVALID_SOURCE_TYPE: "INVALID_SOURCE_TYPE",
3125
+ /**
3126
+ * Ошибка при загрузке изображения
3127
+ */
3128
+ IMPORT_FAILED: "IMPORT_FAILED",
3129
+ /**
3130
+ * Предупреждение, что изображение слишком большое, и оно будет уменьшено
3131
+ */
3132
+ IMAGE_RESIZE_WARNING: "IMAGE_RESIZE_WARNING",
3133
+ /**
3134
+ * Не выбран объект для экспорта
3135
+ */
3136
+ NO_OBJECT_SELECTED: "NO_OBJECT_SELECTED",
3137
+ /**
3138
+ * Ошибка при экспорте изображения
3139
+ */
3140
+ IMAGE_EXPORT_FAILED: "IMAGE_EXPORT_FAILED"
3141
+ }
3142
+ };
3143
+ class F {
3144
+ constructor(e) {
3145
+ var {
3146
+ editor: t
3147
+ } = e;
3148
+ this.editor = t;
3149
+ }
3150
+ /**
3151
+ * Эмитит событие ошибки через fabricjs
3152
+ * @param {object} options
3153
+ * @param {string} [origin='ImageEditor'] — источник ошибки (по умолчанию 'ImageEditor')
3154
+ * @param {string} [method='Unknown Method'] — метод, вызвавший ошибку (по умолчанию 'Unknown Method')
3155
+ * @param {string} code — код ошибки (из errorCodes)
3156
+ * @param {object} [data] — доп. данные (опционально)
3157
+ * @param {string} [message] — текст ошибки (опционально, если не передан, то используется код ошибки)
3158
+ * @fires editor:error
3159
+ */
3160
+ emitError(e) {
3161
+ var {
3162
+ origin: t = "ImageEditor",
3163
+ method: a = "Unknown Method",
3164
+ code: r,
3165
+ data: n,
3166
+ message: i
3167
+ } = e;
3168
+ if (!F.isValidErrorCode(r)) {
3169
+ console.warn("Неизвестный код ошибки: ", {
3170
+ code: r,
3171
+ origin: t,
3172
+ method: a
3173
+ });
3174
+ return;
3175
+ }
3176
+ if (r) {
3177
+ var s = i || r;
3178
+ console.error("".concat(t, ". ").concat(a, ". ").concat(r, ". ").concat(s), n), this.editor.canvas.fire("editor:error", {
3179
+ code: r,
3180
+ origin: t,
3181
+ method: a,
3182
+ message: s,
3183
+ data: n
3184
+ });
3185
+ }
3186
+ }
3187
+ /**
3188
+ * Эмитит предупреждение через fabricjs
3189
+ * @param {object} options
3190
+ * @param {string} [origin='ImageEditor'] — источник предупреждения (по умолчанию 'ImageEditor')
3191
+ * @param {string} [method='Unknown Method'] — метод, вызвавший предупреждение (по умолчанию 'Unknown Method')
3192
+ * @param {string} code — код предупреждения (из errorCodes)
3193
+ * @param {object} [data] — доп. данные (опционально)
3194
+ * @param {string} [message] — текст предупреждения (опционально, если не передан, то используется код предупреждения)
3195
+ * @fires editor:warning
3196
+ */
3197
+ emitWarning(e) {
3198
+ var {
3199
+ origin: t = "ImageEditor",
3200
+ method: a = "Unknown Method",
3201
+ code: r,
3202
+ message: n,
3203
+ data: i
3204
+ } = e;
3205
+ if (!F.isValidErrorCode(r)) {
3206
+ console.warn("Неизвестный код ошибки: ", {
3207
+ code: r,
3208
+ origin: t,
3209
+ method: a
3210
+ });
3211
+ return;
3212
+ }
3213
+ var s = n || r;
3214
+ console.warn("".concat(t, ". ").concat(a, ". ").concat(r, ". ").concat(s), i), this.editor.canvas.fire("editor:warning", {
3215
+ code: r,
3216
+ origin: t,
3217
+ method: a,
3218
+ message: n,
3219
+ data: i
3220
+ });
3221
+ }
3222
+ static isValidErrorCode(e) {
3223
+ return e ? Object.values(xt).some((t) => Object.values(t).includes(e)) : !1;
3224
+ }
3225
+ }
3226
+ function Ie(o, e, t, a, r, n, i) {
2955
3227
  try {
2956
3228
  var s = o[n](i), c = s.value;
2957
3229
  } catch (u) {
@@ -2959,22 +3231,22 @@ function be(o, e, t, a, r, n, i) {
2959
3231
  }
2960
3232
  s.done ? e(c) : Promise.resolve(c).then(a, r);
2961
3233
  }
2962
- function kt(o) {
3234
+ function Bt(o) {
2963
3235
  return function() {
2964
3236
  var e = this, t = arguments;
2965
3237
  return new Promise(function(a, r) {
2966
3238
  var n = o.apply(e, t);
2967
3239
  function i(c) {
2968
- be(n, a, r, i, s, "next", c);
3240
+ Ie(n, a, r, i, s, "next", c);
2969
3241
  }
2970
3242
  function s(c) {
2971
- be(n, a, r, i, s, "throw", c);
3243
+ Ie(n, a, r, i, s, "throw", c);
2972
3244
  }
2973
3245
  i(void 0);
2974
3246
  });
2975
3247
  };
2976
3248
  }
2977
- class ae {
3249
+ class ie {
2978
3250
  constructor(e) {
2979
3251
  var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
2980
3252
  this.options = t;
@@ -2983,11 +3255,11 @@ class ae {
2983
3255
  minZoom: r,
2984
3256
  maxZoom: n
2985
3257
  } = t;
2986
- this.containerId = e, this.editorId = "".concat(e, "-").concat(I()), this.clipboard = null, this.defaultZoom = a, this.minZoom = r || gt, this.maxZoom = n || vt, this.init();
3258
+ this.containerId = e, this.editorId = "".concat(e, "-").concat(w()), this.clipboard = null, this.defaultZoom = a, this.minZoom = r || vt, this.maxZoom = n || mt, this.init();
2987
3259
  }
2988
3260
  init() {
2989
3261
  var e = this;
2990
- return kt(function* () {
3262
+ return Bt(function* () {
2991
3263
  var {
2992
3264
  editorContainerWidth: t,
2993
3265
  editorContainerHeight: a,
@@ -3000,45 +3272,47 @@ class ae {
3000
3272
  scaleType: l,
3001
3273
  _onReadyCallback: d
3002
3274
  } = e.options;
3003
- if ($e.apply(), e.canvas = new Pe(e.containerId, e.options), e.moduleLoader = new _e(), e.workerManager = new Re(), e.historyManager = new ht({
3275
+ if (qe.apply(), e.canvas = new Ye(e.containerId, e.options), e.moduleLoader = new We(), e.workerManager = new Fe(), e.errorManager = new F({
3276
+ editor: e
3277
+ }), e.historyManager = new gt({
3004
3278
  editor: e
3005
- }), e.toolbar = new lt({
3279
+ }), e.toolbar = new ht({
3006
3280
  editor: e
3007
- }), e.transformManager = new jt({
3281
+ }), e.transformManager = new yt({
3008
3282
  editor: e
3009
- }), e.canvasManager = new Mt({
3283
+ }), e.canvasManager = new jt({
3010
3284
  editor: e
3011
- }), e.imageManager = new C({
3285
+ }), e.imageManager = new A({
3012
3286
  editor: e
3013
- }), e.layerManager = new H({
3287
+ }), e.layerManager = new W({
3014
3288
  editor: e
3015
- }), e.shapeManager = new Dt({
3289
+ }), e.shapeManager = new Nt({
3016
3290
  editor: e
3017
- }), e.interactionBlocker = new yt({
3291
+ }), e.interactionBlocker = new pt({
3018
3292
  editor: e
3019
- }), e.clipboardManager = new Nt({
3293
+ }), e.clipboardManager = new Lt({
3020
3294
  editor: e
3021
- }), e.objectLockManager = new Lt({
3295
+ }), e.objectLockManager = new Et({
3022
3296
  editor: e
3023
3297
  }), e.groupingManager = new Ot({
3024
3298
  editor: e
3025
3299
  }), e.selectionManager = new Tt({
3026
3300
  editor: e
3027
- }), e.deletionManager = new Et({
3301
+ }), e.deletionManager = new kt({
3028
3302
  editor: e
3029
- }), e._createMonageArea(), e._createClippingArea(), e.listeners = new Z({
3303
+ }), e._createMonageArea(), e._createClippingArea(), e.listeners = new z({
3030
3304
  editor: e,
3031
3305
  options: e.options
3032
3306
  }), e.canvasManager.setEditorContainerWidth(t), e.canvasManager.setEditorContainerHeight(a), e.canvasManager.setCanvasWrapperWidth(r), e.canvasManager.setCanvasWrapperHeight(n), e.canvasManager.setCanvasCSSWidth(i), e.canvasManager.setCanvasCSSHeight(s), c != null && c.source) {
3033
3307
  var {
3034
3308
  source: h,
3035
- scale: g = "image-".concat(l),
3036
- withoutSave: v = !0
3309
+ scale: v = "image-".concat(l),
3310
+ withoutSave: m = !0
3037
3311
  } = c;
3038
3312
  yield e.imageManager.importImage({
3039
3313
  source: h,
3040
- scale: g,
3041
- withoutSave: v
3314
+ scale: v,
3315
+ withoutSave: m
3042
3316
  });
3043
3317
  } else
3044
3318
  e.canvasManager.setDefaultScale({
@@ -3060,7 +3334,7 @@ class ae {
3060
3334
  this.montageArea = this.shapeManager.addRectangle({
3061
3335
  width: e,
3062
3336
  height: t,
3063
- fill: ae._createMosaicPattern(),
3337
+ fill: ie._createMosaicPattern(),
3064
3338
  stroke: null,
3065
3339
  strokeWidth: 0,
3066
3340
  selectable: !1,
@@ -3124,7 +3398,7 @@ class ae {
3124
3398
  });
3125
3399
  }
3126
3400
  }
3127
- const xt = {
3401
+ const Zt = {
3128
3402
  // Cохраняют ли объекты свой текущий порядок (z-index) при выделении
3129
3403
  preserveObjectStacking: !0,
3130
3404
  // Возможность взаимодействия с объектом за пределами монтажной области
@@ -3235,7 +3509,7 @@ const xt = {
3235
3509
  // Сброс параметров объекта по двойному клику
3236
3510
  resetObjectFitByDoubleClick: !0
3237
3511
  };
3238
- function Ie(o, e) {
3512
+ function Se(o, e) {
3239
3513
  var t = Object.keys(o);
3240
3514
  if (Object.getOwnPropertySymbols) {
3241
3515
  var a = Object.getOwnPropertySymbols(o);
@@ -3245,25 +3519,25 @@ function Ie(o, e) {
3245
3519
  }
3246
3520
  return t;
3247
3521
  }
3248
- function Se(o) {
3522
+ function Ae(o) {
3249
3523
  for (var e = 1; e < arguments.length; e++) {
3250
3524
  var t = arguments[e] != null ? arguments[e] : {};
3251
- e % 2 ? Ie(Object(t), !0).forEach(function(a) {
3252
- Bt(o, a, t[a]);
3253
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(o, Object.getOwnPropertyDescriptors(t)) : Ie(Object(t)).forEach(function(a) {
3525
+ e % 2 ? Se(Object(t), !0).forEach(function(a) {
3526
+ zt(o, a, t[a]);
3527
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(o, Object.getOwnPropertyDescriptors(t)) : Se(Object(t)).forEach(function(a) {
3254
3528
  Object.defineProperty(o, a, Object.getOwnPropertyDescriptor(t, a));
3255
3529
  });
3256
3530
  }
3257
3531
  return o;
3258
3532
  }
3259
- function Bt(o, e, t) {
3260
- return (e = Zt(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
3533
+ function zt(o, e, t) {
3534
+ return (e = Pt(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
3261
3535
  }
3262
- function Zt(o) {
3263
- var e = zt(o, "string");
3536
+ function Pt(o) {
3537
+ var e = Ut(o, "string");
3264
3538
  return typeof e == "symbol" ? e : e + "";
3265
3539
  }
3266
- function zt(o, e) {
3540
+ function Ut(o, e) {
3267
3541
  if (typeof o != "object" || !o) return o;
3268
3542
  var t = o[Symbol.toPrimitive];
3269
3543
  if (t !== void 0) {
@@ -3273,18 +3547,18 @@ function zt(o, e) {
3273
3547
  }
3274
3548
  return (e === "string" ? String : Number)(o);
3275
3549
  }
3276
- function Yt(o) {
3277
- var e = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, t = Se(Se({}, xt), e), a = document.getElementById(o);
3550
+ function _t(o) {
3551
+ var e = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, t = Ae(Ae({}, Zt), e), a = document.getElementById(o);
3278
3552
  if (!a)
3279
3553
  return Promise.reject(new Error('Контейнер с ID "'.concat(o, '" не найден.')));
3280
3554
  var r = document.createElement("canvas");
3281
3555
  return r.id = "".concat(o, "-canvas"), a.appendChild(r), t.editorContainer = a, new Promise((n) => {
3282
3556
  t._onReadyCallback = n;
3283
- var i = new ae(r.id, t);
3557
+ var i = new ie(r.id, t);
3284
3558
  window[o] = i;
3285
3559
  });
3286
3560
  }
3287
3561
  export {
3288
- Yt as default
3562
+ _t as default
3289
3563
  };
3290
3564
  //# sourceMappingURL=main.js.map