@anu3ev/fabric-image-editor 0.1.37 → 0.1.39

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 +448 -409
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -1,24 +1,24 @@
1
- var Te = Object.defineProperty;
2
- var G = Object.getOwnPropertySymbols;
1
+ var Le = Object.defineProperty;
2
+ var X = Object.getOwnPropertySymbols;
3
3
  var Me = Object.prototype.hasOwnProperty, fe = Object.prototype.propertyIsEnumerable;
4
- var me = (o, e, t) => e in o ? Te(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t, A = (o, e) => {
4
+ var me = (o, e, t) => e in o ? Le(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t, C = (o, e) => {
5
5
  for (var t in e || (e = {}))
6
6
  Me.call(e, t) && me(o, t, e[t]);
7
- if (G)
8
- for (var t of G(e))
7
+ if (X)
8
+ for (var t of X(e))
9
9
  fe.call(e, t) && me(o, t, e[t]);
10
10
  return o;
11
11
  };
12
- var X = (o, e) => {
12
+ var Q = (o, e) => {
13
13
  var t = {};
14
14
  for (var a in o)
15
15
  Me.call(o, a) && e.indexOf(a) < 0 && (t[a] = o[a]);
16
- if (o != null && G)
17
- for (var a of G(o))
16
+ if (o != null && X)
17
+ for (var a of X(o))
18
18
  e.indexOf(a) < 0 && fe.call(o, a) && (t[a] = o[a]);
19
19
  return t;
20
20
  };
21
- var $ = (o, e, t) => new Promise((a, r) => {
21
+ var H = (o, e, t) => new Promise((a, r) => {
22
22
  var i = (c) => {
23
23
  try {
24
24
  s(t.next(c));
@@ -34,14 +34,14 @@ var $ = (o, e, t) => new Promise((a, r) => {
34
34
  }, s = (c) => c.done ? a(c.value) : Promise.resolve(c.value).then(i, n);
35
35
  s((t = t.apply(o, e)).next());
36
36
  });
37
- import { ActiveSelection as _, util as R, controlsUtils as Oe, InteractiveFabricObject as ke, loadSVGFromURL as xe, FabricImage as q, Point as Be, Rect as Ze, Circle as ze, Triangle as Ue, Group as Ye, Canvas as He, Pattern as Pe } from "fabric";
38
- import { create as _e } from "jsondiffpatch";
39
- var Re = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", D = function() {
37
+ import { ActiveSelection as W, util as _, controlsUtils as Ee, InteractiveFabricObject as Oe, loadSVGFromURL as Te, FabricImage as q, Point as ke, Rect as xe, Circle as Be, Triangle as Ze, Group as ze, Canvas as Ue, Pattern as Ye } from "fabric";
38
+ import { create as He } from "jsondiffpatch";
39
+ var Pe = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", S = function() {
40
40
  for (var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 21, t = "", a = crypto.getRandomValues(new Uint8Array(e |= 0)); e--; )
41
- t += Re[a[e] & 63];
41
+ t += Pe[a[e] & 63];
42
42
  return t;
43
43
  };
44
- class P {
44
+ class R {
45
45
  /**
46
46
  * Конструктор принимает редактор и опции.
47
47
  * @param {Object} params
@@ -58,14 +58,14 @@ class P {
58
58
  * @param {Boolean} [params.options.resetObjectFitByDoubleClick] — сброс фита объекта по двойному клику
59
59
  */
60
60
  constructor({ editor: e, options: t = {} }) {
61
- this.isDragging = !1, this.lastMouseX = 0, this.lastMouseY = 0, this.isUndoRedoKeyPressed = !1, this.isSpacePressed = !1, this.canvasDragging = !1, this.mouseWheelZooming = !1, this.bringToFrontOnSelection = !1, this.resetObjectFitByDoubleClick = !1, this.copyObjectsByHotkey = !1, this.pasteImageFromClipboard = !1, this.undoRedoByHotKeys = !1, this.selectAllByHotkey = !1, this.deleteObjectsByHotkey = !1, this.adaptCanvasToContainer = !1, this.editor = e, this.canvas = e.canvas, this.options = t, this.handleAdaptCanvasToContainerBound = P.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 = P.debounce(this.handleObjectModifiedHistory.bind(this), 300), this.handleObjectRotatingHistoryBound = P.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();
61
+ this.isDragging = !1, this.lastMouseX = 0, this.lastMouseY = 0, this.isUndoRedoKeyPressed = !1, this.isSpacePressed = !1, this.canvasDragging = !1, this.mouseWheelZooming = !1, this.bringToFrontOnSelection = !1, this.resetObjectFitByDoubleClick = !1, this.copyObjectsByHotkey = !1, this.pasteImageFromClipboard = !1, this.undoRedoByHotKeys = !1, this.selectAllByHotkey = !1, this.deleteObjectsByHotkey = !1, this.adaptCanvasToContainerOnResize = !1, this.editor = e, this.canvas = e.canvas, this.options = t, this.handleContainerResizeBound = R.debounce(this.handleContainerResize.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 = R.debounce(this.handleObjectModifiedHistory.bind(this), 300), this.handleObjectRotatingHistoryBound = R.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();
62
62
  }
63
63
  /**
64
64
  * Инициализация всех обработчиков согласно опциям.
65
65
  */
66
66
  init() {
67
67
  const {
68
- adaptCanvasToContainer: e,
68
+ adaptCanvasToContainerOnResize: e,
69
69
  canvasDragging: t,
70
70
  mouseWheelZooming: a,
71
71
  bringToFrontOnSelection: r,
@@ -74,9 +74,9 @@ class P {
74
74
  undoRedoByHotKeys: s,
75
75
  selectAllByHotkey: c,
76
76
  deleteObjectsByHotkey: u,
77
- resetObjectFitByDoubleClick: l
77
+ resetObjectFitByDoubleClick: d
78
78
  } = this.options;
79
- 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, { capture: !0 }), document.addEventListener("keyup", this.handleSpaceKeyUpBound, { capture: !0 })), 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, { capture: !0 }), i && document.addEventListener("keydown", this.handleCopyEventBound, { capture: !0 }), n && document.addEventListener("paste", this.handlePasteEventBound, { capture: !0 }), s && (document.addEventListener("keydown", this.handleUndoRedoEventBound, { capture: !0 }), document.addEventListener("keyup", this.handleUndoRedoKeyUpBound, { capture: !0 })), c && document.addEventListener("keydown", this.handleSelectAllEventBound, { capture: !0 }), u && document.addEventListener("keydown", this.handleDeleteObjectsEventBound, { capture: !0 }), this.canvas.on("object:modified", this.handleObjectModifiedHistoryBound), this.canvas.on("object:rotating", this.handleObjectRotatingHistoryBound), this.canvas.on("object:added", this.handleObjectAddedHistoryBound), this.canvas.on("object:removed", this.handleObjectRemovedHistoryBound), this.canvas.on("object:added", this.handleOverlayUpdateBound), this.canvas.on("selection:created", this.handleOverlayUpdateBound), this.canvas.on("selection:created", this.handleLockedSelectionBound), this.canvas.on("selection:updated", this.handleLockedSelectionBound);
79
+ 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, { capture: !0 }), document.addEventListener("keyup", this.handleSpaceKeyUpBound, { capture: !0 })), a && this.canvas.on("mouse:wheel", this.handleMouseWheelZoomBound), r && (this.canvas.on("selection:created", this.handleBringToFrontBound), this.canvas.on("selection:updated", this.handleBringToFrontBound)), d && this.canvas.on("mouse:dblclick", this.handleResetObjectFitBound), e && window.addEventListener("resize", this.handleContainerResizeBound, { capture: !0 }), i && document.addEventListener("keydown", this.handleCopyEventBound, { capture: !0 }), n && document.addEventListener("paste", this.handlePasteEventBound, { capture: !0 }), s && (document.addEventListener("keydown", this.handleUndoRedoEventBound, { capture: !0 }), document.addEventListener("keyup", this.handleUndoRedoKeyUpBound, { capture: !0 })), c && document.addEventListener("keydown", this.handleSelectAllEventBound, { capture: !0 }), u && document.addEventListener("keydown", this.handleDeleteObjectsEventBound, { capture: !0 }), this.canvas.on("object:modified", this.handleObjectModifiedHistoryBound), this.canvas.on("object:rotating", this.handleObjectRotatingHistoryBound), this.canvas.on("object:added", this.handleObjectAddedHistoryBound), this.canvas.on("object:removed", this.handleObjectRemovedHistoryBound), this.canvas.on("object:added", this.handleOverlayUpdateBound), this.canvas.on("selection:created", this.handleOverlayUpdateBound), this.canvas.on("selection:created", this.handleLockedSelectionBound), this.canvas.on("selection:updated", this.handleLockedSelectionBound);
80
80
  }
81
81
  /**
82
82
  * При массовом выделении объектов удаляем из него залоченные.
@@ -95,7 +95,7 @@ class P {
95
95
  this.canvas.setActiveObject(r[0]);
96
96
  return;
97
97
  }
98
- const i = new _(r, {
98
+ const i = new W(r, {
99
99
  canvas: this.canvas
100
100
  });
101
101
  this.canvas.setActiveObject(i), this.canvas.requestRenderAll();
@@ -128,9 +128,8 @@ class P {
128
128
  * Обработчик изменения размеров окна браузера.
129
129
  * Адаптирует канвас к размерам контейнера.
130
130
  */
131
- handleAdaptCanvasToContainer() {
132
- const { width: e, height: t } = this.editor.montageArea;
133
- this.editor.canvasManager.setResolutionWidth(e, { adaptCanvasToContainer: !0, withoutSave: !0 }), this.editor.canvasManager.setResolutionHeight(t, { adaptCanvasToContainer: !0, withoutSave: !0 }), this.editor.canvasManager.centerMontageArea(), this.editor.selectionManager.selectAll(), this.editor.transformManager.fitObject({ fitAsOneObject: !0, withoutSave: !0 });
131
+ handleContainerResize() {
132
+ this.editor.canvasManager.updateCanvasAndFitObjects();
134
133
  }
135
134
  /**
136
135
  * Обработчик для Ctrl+C (копирование).
@@ -145,34 +144,10 @@ class P {
145
144
  }
146
145
  /**
147
146
  * Обработчик вставки объекта или изображения из буфера обмена.
148
- * @param {Object} event — объект события
149
- * @param {Object} event.clipboardData — данные из буфера обмена
150
- * @param {Array} event.clipboardData.items — элементы буфера обмена
151
- *
152
- * TODO: Попробовать вынести методы в классы-менеджеры.
147
+ * @param {ClipboardEvent} event — объект события
153
148
  */
154
- handlePasteEvent({ clipboardData: e }) {
155
- var n;
156
- if (!((n = e == null ? void 0 : e.items) != null && n.length)) return;
157
- const { imageManager: t } = this.editor, { items: a } = e, r = a[a.length - 1];
158
- if (r.type.indexOf("image") !== -1) {
159
- const s = r.getAsFile();
160
- if (!s) return;
161
- const c = new FileReader();
162
- c.onload = (u) => {
163
- u.target && this.editor.imageManager.importImage({ source: u.target.result });
164
- }, c.readAsDataURL(s);
165
- return;
166
- }
167
- const i = e.getData("text/html");
168
- if (i) {
169
- const u = new DOMParser().parseFromString(i, "text/html").querySelector("img");
170
- if (u != null && u.src) {
171
- t.importImage({ source: u.src });
172
- return;
173
- }
174
- }
175
- this.editor.clipboardManager.paste();
149
+ handlePasteEvent(e) {
150
+ this.editor.clipboardManager.handlePasteEvent(e);
176
151
  }
177
152
  /**
178
153
  * Обработчик для отмены/повтора (Ctrl+Z/Ctrl+Y).
@@ -182,7 +157,7 @@ class P {
182
157
  * @param {String} event.code — код клавиши
183
158
  */
184
159
  handleUndoRedoEvent(e) {
185
- return $(this, null, function* () {
160
+ return H(this, null, function* () {
186
161
  const { ctrlKey: t, metaKey: a, code: r, repeat: i } = e;
187
162
  !t && !a || i || this.isUndoRedoKeyPressed || (r === "KeyZ" ? (e.preventDefault(), this.isUndoRedoKeyPressed = !0, yield this.editor.historyManager.undo()) : r === "KeyY" && (e.preventDefault(), this.isUndoRedoKeyPressed = !0, yield this.editor.historyManager.redo()));
188
163
  });
@@ -311,7 +286,7 @@ class P {
311
286
  * Метод для удаления всех слушателей
312
287
  */
313
288
  destroy() {
314
- window.removeEventListener("resize", this.handleAdaptCanvasToContainerBound, { capture: !0 }), document.removeEventListener("keydown", this.handleCopyEventBound, { capture: !0 }), document.removeEventListener("paste", this.handlePasteEventBound, { capture: !0 }), document.removeEventListener("keydown", this.handleUndoRedoEventBound, { capture: !0 }), document.removeEventListener("keyup", this.handleUndoRedoKeyUpBound, { capture: !0 }), document.removeEventListener("keydown", this.handleSelectAllEventBound, { capture: !0 }), document.removeEventListener("keydown", this.handleDeleteObjectsEventBound, { capture: !0 }), 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, { capture: !0 }), document.removeEventListener("keyup", this.handleSpaceKeyUpBound, { capture: !0 })), 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), this.canvas.off("selection:updated", this.handleLockedSelectionBound);
289
+ window.removeEventListener("resize", this.handleContainerResizeBound, { capture: !0 }), document.removeEventListener("keydown", this.handleCopyEventBound, { capture: !0 }), document.removeEventListener("paste", this.handlePasteEventBound, { capture: !0 }), document.removeEventListener("keydown", this.handleUndoRedoEventBound, { capture: !0 }), document.removeEventListener("keyup", this.handleUndoRedoKeyUpBound, { capture: !0 }), document.removeEventListener("keydown", this.handleSelectAllEventBound, { capture: !0 }), document.removeEventListener("keydown", this.handleDeleteObjectsEventBound, { capture: !0 }), 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, { capture: !0 }), document.removeEventListener("keyup", this.handleSpaceKeyUpBound, { capture: !0 })), 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), this.canvas.off("selection:updated", this.handleLockedSelectionBound);
315
290
  }
316
291
  /**
317
292
  * Дебаунс для снижения частоты вызова функции.
@@ -329,7 +304,7 @@ class P {
329
304
  };
330
305
  }
331
306
  }
332
- class We {
307
+ class Re {
333
308
  /**
334
309
  * @description Класс для динамической загрузки внешних модулей.
335
310
  */
@@ -347,7 +322,7 @@ class We {
347
322
  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, '"')));
348
323
  }
349
324
  }
350
- class Fe {
325
+ class We {
351
326
  /**
352
327
  * @param {string|URL} [scriptUrl] — URL скрипта воркера.
353
328
  * По-умолчанию использует файл рядом с этим модулем
@@ -387,7 +362,7 @@ class Fe {
387
362
  * @returns {Promise<any>}
388
363
  */
389
364
  post(e, t) {
390
- var a = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [], r = "".concat(e, ":").concat(D(8));
365
+ var a = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [], r = "".concat(e, ":").concat(S(8));
391
366
  return new Promise((i, n) => {
392
367
  this._callbacks.set(r, {
393
368
  resolve: i,
@@ -406,50 +381,50 @@ class Fe {
406
381
  this.worker.terminate();
407
382
  }
408
383
  }
409
- var I = 12, Ve = 2, te = 8, ae = 20, Ge = 100, re = 20, ie = 8, Xe = 100, ne = 32, se = 1, Qe = "#2B2D33", oe = "#3D8BF4", ce = "#FFFFFF";
410
- function Q(o, e, t, a, r) {
411
- var i = I, n = Ve;
412
- o.save(), o.translate(e, t), o.rotate(R.degreesToRadians(r.angle)), o.fillStyle = ce, o.strokeStyle = oe, o.lineWidth = se, o.beginPath(), o.roundRect(-12 / 2, -12 / 2, i, i, n), o.fill(), o.stroke(), o.restore();
384
+ var I = 12, _e = 2, te = 8, ae = 20, Fe = 100, re = 20, ie = 8, Ve = 100, ne = 32, se = 1, Ge = "#2B2D33", oe = "#3D8BF4", ce = "#FFFFFF";
385
+ function J(o, e, t, a, r) {
386
+ var i = I, n = _e;
387
+ o.save(), o.translate(e, t), o.rotate(_.degreesToRadians(r.angle)), o.fillStyle = ce, o.strokeStyle = oe, o.lineWidth = se, o.beginPath(), o.roundRect(-12 / 2, -12 / 2, i, i, n), o.fill(), o.stroke(), o.restore();
413
388
  }
414
389
  function je(o, e, t, a, r) {
415
- var i = te, n = ae, s = Ge;
416
- o.save(), o.translate(e, t), o.rotate(R.degreesToRadians(r.angle)), o.fillStyle = ce, o.strokeStyle = oe, o.lineWidth = se, o.beginPath(), o.roundRect(-8 / 2, -20 / 2, i, n, s), o.fill(), o.stroke(), o.restore();
390
+ var i = te, n = ae, s = Fe;
391
+ o.save(), o.translate(e, t), o.rotate(_.degreesToRadians(r.angle)), o.fillStyle = ce, o.strokeStyle = oe, o.lineWidth = se, o.beginPath(), o.roundRect(-8 / 2, -20 / 2, i, n, s), o.fill(), o.stroke(), o.restore();
417
392
  }
418
393
  function ye(o, e, t, a, r) {
419
- var i = re, n = ie, s = Xe;
420
- o.save(), o.translate(e, t), o.rotate(R.degreesToRadians(r.angle)), o.fillStyle = ce, o.strokeStyle = oe, o.lineWidth = se, o.beginPath(), o.roundRect(-20 / 2, -8 / 2, i, n, s), o.fill(), o.stroke(), o.restore();
394
+ var i = re, n = ie, s = Ve;
395
+ o.save(), o.translate(e, t), o.rotate(_.degreesToRadians(r.angle)), o.fillStyle = ce, o.strokeStyle = oe, o.lineWidth = se, o.beginPath(), o.roundRect(-20 / 2, -8 / 2, i, n, s), o.fill(), o.stroke(), o.restore();
421
396
  }
422
- var Je = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE4Ljc1IDQuMzc1djMuNzVhLjYyNS42MjUgMCAwIDEtLjYyNS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDEgMC0xLjI1aDIuMTRsLTIuMDc3LTEuOTAzLS4wMi0uMDE5YTYuMjUgNi4yNSAwIDEgMC0uMTMgOC45NjcuNjI2LjYyNiAwIDAgMSAuODYuOTA5QTcuNDU2IDcuNDU2IDAgMCAxIDEwIDE3LjVoLS4xMDNhNy41IDcuNSAwIDEgMSA1LjM5Ni0xMi44MTJMMTcuNSA2LjcwM1Y0LjM3NWEuNjI1LjYyNSAwIDAgMSAxLjI1IDBaIi8+PC9zdmc+", De = new Image();
423
- De.src = Je;
424
- function Ke(o, e, t, a, r) {
397
+ var Xe = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE4Ljc1IDQuMzc1djMuNzVhLjYyNS42MjUgMCAwIDEtLjYyNS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDEgMC0xLjI1aDIuMTRsLTIuMDc3LTEuOTAzLS4wMi0uMDE5YTYuMjUgNi4yNSAwIDEgMC0uMTMgOC45NjcuNjI2LjYyNiAwIDAgMSAuODYuOTA5QTcuNDU2IDcuNDU2IDAgMCAxIDEwIDE3LjVoLS4xMDNhNy41IDcuNSAwIDEgMSA1LjM5Ni0xMi44MTJMMTcuNSA2LjcwM1Y0LjM3NWEuNjI1LjYyNSAwIDAgMSAxLjI1IDBaIi8+PC9zdmc+", Ae = new Image();
398
+ Ae.src = Xe;
399
+ function Qe(o, e, t, a, r) {
425
400
  var i = ne, n = i / 2;
426
- o.save(), o.translate(e, t), o.rotate(R.degreesToRadians(r.angle)), o.fillStyle = Qe, o.beginPath(), o.arc(0, 0, n, 0, 2 * Math.PI), o.fill(), o.drawImage(De, -16 / 2, -16 / 2, n, n), o.restore();
401
+ o.save(), o.translate(e, t), o.rotate(_.degreesToRadians(r.angle)), o.fillStyle = Ge, o.beginPath(), o.arc(0, 0, n, 0, 2 * Math.PI), o.fill(), o.drawImage(Ae, -16 / 2, -16 / 2, n, n), o.restore();
427
402
  }
428
- var $e = {
403
+ var Je = {
429
404
  // Угловые точки
430
405
  tl: {
431
- render: Q,
406
+ render: J,
432
407
  sizeX: I,
433
408
  sizeY: I,
434
409
  offsetX: 0,
435
410
  offsetY: 0
436
411
  },
437
412
  tr: {
438
- render: Q,
413
+ render: J,
439
414
  sizeX: I,
440
415
  sizeY: I,
441
416
  offsetX: 0,
442
417
  offsetY: 0
443
418
  },
444
419
  bl: {
445
- render: Q,
420
+ render: J,
446
421
  sizeX: I,
447
422
  sizeY: I,
448
423
  offsetX: 0,
449
424
  offsetY: 0
450
425
  },
451
426
  br: {
452
- render: Q,
427
+ render: J,
453
428
  sizeX: I,
454
429
  sizeY: I,
455
430
  offsetX: 0,
@@ -487,17 +462,17 @@ var $e = {
487
462
  },
488
463
  // Специальный «rotate» контрол
489
464
  mtr: {
490
- render: Ke,
465
+ render: Qe,
491
466
  sizeX: ne,
492
467
  sizeY: ne,
493
468
  offsetX: 0,
494
469
  offsetY: -32
495
470
  }
496
471
  };
497
- class qe {
472
+ class Ke {
498
473
  static apply() {
499
- var e = Oe.createObjectDefaultControls();
500
- Object.entries($e).forEach((t) => {
474
+ var e = Ee.createObjectDefaultControls();
475
+ Object.entries(Je).forEach((t) => {
501
476
  var [a, r] = t;
502
477
  Object.assign(e[a], {
503
478
  render: r.render,
@@ -509,10 +484,10 @@ class qe {
509
484
  var u = n.target;
510
485
  u.canvas.setCursor("grabbing");
511
486
  });
512
- }), ke.ownDefaults.controls = e;
487
+ }), Oe.ownDefaults.controls = e;
513
488
  }
514
489
  }
515
- 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==", it = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMy4yMWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDguMTI1IDEwIDExLjc3Nmw2LjI2LTMuNjUxTDEwIDQuNDc0IDMuNzQgOC4xMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjcxNCAxMCAxMCAxMi41bDQuMjg2LTIuNSAzLjIxNCAxLjg3NUwxMCAxNi4yNWwtNy41LTQuMzc1TDUuNzE0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDkuNDZhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgMTEuNzc2bDMuOTctMi4zMTZhLjYyNS42MjUgMCAwIDEgLjYzIDBsMy4yMTUgMS44NzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhMNS40IDkuNDZabS0xLjY2IDIuNDE1TDEwIDE1LjUyNmw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2LTEuOTc1IDEuMTUxWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", nt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTIuNSA2LjI1IDcuNSA0LjM3NSA3LjUtNC4zNzVMMTAgMS44NzUgMi41IDYuMjVaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMS4zMzVhLjYyNS42MjUgMCAwIDEgLjYzIDBsNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4bDcuNS00LjM3NVpNMy43NCA2LjI1IDEwIDkuOTAxbDYuMjYtMy42NTFMMTAgMi41OTkgMy43NCA2LjI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDExLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCAxMy42NTFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgMTEuMzM1Wk0zLjc0IDEzLjc1IDEwIDE3LjQwMWw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTMuNzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgNy41ODVhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgOS45MDFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgNy41ODVaTTMuNzQgMTAgMTAgMTMuNjUxIDE2LjI2IDEwbC0xLjk3NC0xLjE1MS0zLjk3MSAyLjMxNmEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtMy45Ny0yLjMxNkwzLjc0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", st = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMS45NiAxMy40MzVhLjYyNS42MjUgMCAwIDEgLjg1NS0uMjI1TDEwIDE3LjQwMWw3LjE4NS00LjE5YS42MjUuNjI1IDAgMCAxIC42MyAxLjA3OWwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEtLjIyNS0uODU1Wk05LjY4NSAxLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDYuMjUgMTAgOS45MDFsNi4yNi0zLjY1MUwxMCAyLjU5OSAzLjc0IDYuMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im01LjcxNCAxMS44NzUgNC4yODYgMi41IDQuMjg2LTIuNUwxNy41IDEzLjc1IDEwIDE4LjEyNSAyLjUgMTMuNzVsMy4yMTQtMS44NzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgMTEuMzM1YS42MjUuNjI1IDAgMCAxIC42MyAwTDEwIDEzLjY1MWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCAxMS4zMzVaTTMuNzQgMTMuNzUgMTAgMTcuNDAxbDYuMjYtMy42NTEtMS45NzQtMS4xNTEtMy45NzEgMi4zMTZhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTMuOTctMi4zMTZMMy43NCAxMy43NVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNCA3LjU4NWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCA5LjkwMWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCA3LjU4NVpNMy43NCAxMCAxMCAxMy42NTEgMTYuMjYgMTBsLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTBaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=", ot = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI0VDNEU0MCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOC4xMjUgMS4yNUExLjg3NSAxLjg3NSAwIDAgMCA2LjI1IDMuMTI1di42MjVIMy4xMjVhLjYyNS42MjUgMCAwIDAgMCAxLjI1aC42MjV2MTEuMjVBMS4yNSAxLjI1IDAgMCAwIDUgMTcuNWgxMGExLjI1IDEuMjUgMCAwIDAgMS4yNS0xLjI1VjVoLjYyNWEuNjI1LjYyNSAwIDAgMCAwLTEuMjVIMTMuNzV2LS42MjVhMS44NzUgMS44NzUgMCAwIDAtMS44NzUtMS44NzVoLTMuNzVabTQuMzc1IDIuNXYtLjYyNWEuNjI1LjYyNSAwIDAgMC0uNjI1LS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDAtLjYyNS42MjV2LjYyNWg1Wk01IDE2LjI1VjVoMTB2MTEuMjVINVpNOC4xMjUgNy41Yy4zNDUgMCAuNjI1LjI4LjYyNS42MjV2NWEuNjI1LjYyNSAwIDEgMS0xLjI1IDB2LTVjMC0uMzQ1LjI4LS42MjUuNjI1LS42MjVabTQuMzc1IDUuNjI1di01YS42MjUuNjI1IDAgMCAwLTEuMjUgMHY1YS42MjUuNjI1IDAgMSAwIDEuMjUgMFoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==";
490
+ var $e = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNi44NzUgMi41YS42MjUuNjI1IDAgMCAwLS42MjUuNjI0VjYuMjVIMy4xMjVhLjYyNS42MjUgMCAwIDAtLjYyNS42MjV2MTBjMCAuMzQ1LjI4LjYyNS42MjUuNjI1aDEwYy4zNDUgMCAuNjI1LS4yOC42MjUtLjYyNXYtMy4xMjZoMy4xMjVjLjM0NSAwIC42MjUtLjI4LjYyNS0uNjI1di0xMGEuNjI1LjYyNSAwIDAgMC0uNjI1LS42MjVoLTEwWm02Ljg3NSAxMGgyLjVWMy43NUg3LjV2Mi41aDUuNjI1Yy4zNDUgMCAuNjI1LjI4LjYyNS42MjV2NS42MjRabS0xMCAzLjc1VjcuNWg4Ljc1djguNzVIMy43NVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==", qe = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDcuNWMwLS42OS41Ni0xLjI1IDEuMjUtMS4yNWgxMi41Yy42OSAwIDEuMjUuNTYgMS4yNSAxLjI1djguNzVjMCAuNjktLjU2IDEuMjUtMS4yNSAxLjI1SDMuNzVjLS42OSAwLTEuMjUtLjU2LTEuMjUtMS4yNVY3LjVabTEzLjc1IDBIMy43NXY4Ljc1aDEyLjVWNy41WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMS44NzVhMi4xODggMi4xODggMCAwIDAtMi4xODggMi4xODh2Mi44MTJhLjYyNS42MjUgMCAxIDEtMS4yNSAwVjQuMDYyYTMuNDM3IDMuNDM3IDAgMSAxIDYuODc1IDB2Mi44MTNhLjYyNS42MjUgMCAxIDEtMS4yNSAwVjQuMDYyQTIuMTg4IDIuMTg4IDAgMCAwIDEwIDEuODc2WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEwIDEyLjgxM2EuOTM3LjkzNyAwIDEgMCAwLTEuODc1LjkzNy45MzcgMCAwIDAgMCAxLjg3NFoiLz48L3N2Zz4=", et = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE2LjI1IDYuMjVINy41VjQuMzc1YTIuNSAyLjUgMCAwIDEgMi41LTIuNWMxLjIgMCAyLjI4MS44NiAyLjUxMiAyYS42MjUuNjI1IDAgMCAwIDEuMjI2LS4yNWMtLjM1NC0xLjczOC0xLjkyNS0zLTMuNzM4LTNhMy43NTQgMy43NTQgMCAwIDAtMy43NSAzLjc1VjYuMjVoLTIuNUExLjI1IDEuMjUgMCAwIDAgMi41IDcuNXY4Ljc1YTEuMjUgMS4yNSAwIDAgMCAxLjI1IDEuMjVoMTIuNWExLjI1IDEuMjUgMCAwIDAgMS4yNS0xLjI1VjcuNWExLjI1IDEuMjUgMCAwIDAtMS4yNS0xLjI1Wm0wIDEwSDMuNzVWNy41aDEyLjV2OC43NVptLTUuMzEzLTQuMzc1YS45MzcuOTM3IDAgMSAxLTEuODc0IDAgLjkzNy45MzcgMCAwIDEgMS44NzQgMFoiLz48L3N2Zz4K", tt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTIuNSA4LjEyNSAxMCAxMi41bDcuNS00LjM3NUwxMCAzLjc1IDIuNSA4LjEyNVoiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LjY4NSAzLjIxYS42MjUuNjI1IDAgMCAxIC42MyAwbDcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOGw3LjUtNC4zNzVaTTMuNzQgOC4xMjUgMTAgMTEuNzc2bDYuMjYtMy42NTFMMTAgNC40NzQgMy43NCA4LjEyNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNCA5LjQ2YS42MjUuNjI1IDAgMCAxIC42MyAwTDEwIDExLjc3NmwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCA5LjQ2Wm0tMS42NiAyLjQxNUwxMCAxNS41MjZsNi4yNi0zLjY1MS0xLjk3NC0xLjE1MS0zLjk3MSAyLjMxNmEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtMy45Ny0yLjMxNi0xLjk3NSAxLjE1MVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==", at = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMy4yMWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDguMTI1IDEwIDExLjc3Nmw2LjI2LTMuNjUxTDEwIDQuNDc0IDMuNzQgOC4xMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjcxNCAxMCAxMCAxMi41bDQuMjg2LTIuNSAzLjIxNCAxLjg3NUwxMCAxNi4yNWwtNy41LTQuMzc1TDUuNzE0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDkuNDZhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgMTEuNzc2bDMuOTctMi4zMTZhLjYyNS42MjUgMCAwIDEgLjYzIDBsMy4yMTUgMS44NzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhMNS40IDkuNDZabS0xLjY2IDIuNDE1TDEwIDE1LjUyNmw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2LTEuOTc1IDEuMTUxWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", rt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTIuNSA2LjI1IDcuNSA0LjM3NSA3LjUtNC4zNzVMMTAgMS44NzUgMi41IDYuMjVaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS42ODUgMS4zMzVhLjYyNS42MjUgMCAwIDEgLjYzIDBsNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4bDcuNS00LjM3NVpNMy43NCA2LjI1IDEwIDkuOTAxbDYuMjYtMy42NTFMMTAgMi41OTkgMy43NCA2LjI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNS40IDExLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCAxMy42NTFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgMTEuMzM1Wk0zLjc0IDEzLjc1IDEwIDE3LjQwMWw2LjI2LTMuNjUxLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTMuNzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgNy41ODVhLjYyNS42MjUgMCAwIDEgLjYzIDBMMTAgOS45MDFsMy45Ny0yLjMxNmEuNjI1LjYyNSAwIDAgMSAuNjMgMGwzLjIxNSAxLjg3NWEuNjI1LjYyNSAwIDAgMSAwIDEuMDhsLTcuNSA0LjM3NWEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtNy41LTQuMzc1YS42MjUuNjI1IDAgMCAxIDAtMS4wOEw1LjQgNy41ODVaTTMuNzQgMTAgMTAgMTMuNjUxIDE2LjI2IDEwbC0xLjk3NC0xLjE1MS0zLjk3MSAyLjMxNmEuNjI1LjYyNSAwIDAgMS0uNjMgMGwtMy45Ny0yLjMxNkwzLjc0IDEwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+", it = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMS45NiAxMy40MzVhLjYyNS42MjUgMCAwIDEgLjg1NS0uMjI1TDEwIDE3LjQwMWw3LjE4NS00LjE5YS42MjUuNjI1IDAgMCAxIC42MyAxLjA3OWwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEtLjIyNS0uODU1Wk05LjY4NSAxLjMzNWEuNjI1LjYyNSAwIDAgMSAuNjMgMGw3LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEgMCAxLjA4bC03LjUgNC4zNzVhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTcuNS00LjM3NWEuNjI1LjYyNSAwIDAgMSAwLTEuMDhsNy41LTQuMzc1Wk0zLjc0IDYuMjUgMTAgOS45MDFsNi4yNi0zLjY1MUwxMCAyLjU5OSAzLjc0IDYuMjVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im01LjcxNCAxMS44NzUgNC4yODYgMi41IDQuMjg2LTIuNUwxNy41IDEzLjc1IDEwIDE4LjEyNSAyLjUgMTMuNzVsMy4yMTQtMS44NzVaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjQgMTEuMzM1YS42MjUuNjI1IDAgMCAxIC42MyAwTDEwIDEzLjY1MWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCAxMS4zMzVaTTMuNzQgMTMuNzUgMTAgMTcuNDAxbDYuMjYtMy42NTEtMS45NzQtMS4xNTEtMy45NzEgMi4zMTZhLjYyNS42MjUgMCAwIDEtLjYzIDBsLTMuOTctMi4zMTZMMy43NCAxMy43NVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNCA3LjU4NWEuNjI1LjYyNSAwIDAgMSAuNjMgMEwxMCA5LjkwMWwzLjk3LTIuMzE2YS42MjUuNjI1IDAgMCAxIC42MyAwbDMuMjE1IDEuODc1YS42MjUuNjI1IDAgMCAxIDAgMS4wOGwtNy41IDQuMzc1YS42MjUuNjI1IDAgMCAxLS42MyAwbC03LjUtNC4zNzVhLjYyNS42MjUgMCAwIDEgMC0xLjA4TDUuNCA3LjU4NVpNMy43NCAxMCAxMCAxMy42NTEgMTYuMjYgMTBsLTEuOTc0LTEuMTUxLTMuOTcxIDIuMzE2YS42MjUuNjI1IDAgMCAxLS42MyAwbC0zLjk3LTIuMzE2TDMuNzQgMTBaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=", nt = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI0VDNEU0MCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOC4xMjUgMS4yNUExLjg3NSAxLjg3NSAwIDAgMCA2LjI1IDMuMTI1di42MjVIMy4xMjVhLjYyNS42MjUgMCAwIDAgMCAxLjI1aC42MjV2MTEuMjVBMS4yNSAxLjI1IDAgMCAwIDUgMTcuNWgxMGExLjI1IDEuMjUgMCAwIDAgMS4yNS0xLjI1VjVoLjYyNWEuNjI1LjYyNSAwIDAgMCAwLTEuMjVIMTMuNzV2LS42MjVhMS44NzUgMS44NzUgMCAwIDAtMS44NzUtMS44NzVoLTMuNzVabTQuMzc1IDIuNXYtLjYyNWEuNjI1LjYyNSAwIDAgMC0uNjI1LS42MjVoLTMuNzVhLjYyNS42MjUgMCAwIDAtLjYyNS42MjV2LjYyNWg1Wk01IDE2LjI1VjVoMTB2MTEuMjVINVpNOC4xMjUgNy41Yy4zNDUgMCAuNjI1LjI4LjYyNS42MjV2NWEuNjI1LjYyNSAwIDEgMS0xLjI1IDB2LTVjMC0uMzQ1LjI4LS42MjUuNjI1LS42MjVabTQuMzc1IDUuNjI1di01YS42MjUuNjI1IDAgMCAwLTEuMjUgMHY1YS42MjUuNjI1IDAgMSAwIDEuMjUgMFoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==";
516
491
  function pe(o, e, t, a, r, i, n) {
517
492
  try {
518
493
  var s = o[i](n), c = s.value;
@@ -521,7 +496,7 @@ function pe(o, e, t, a, r, i, n) {
521
496
  }
522
497
  s.done ? e(c) : Promise.resolve(c).then(a, r);
523
498
  }
524
- function ct(o) {
499
+ function st(o) {
525
500
  return function() {
526
501
  var e = this, t = arguments;
527
502
  return new Promise(function(a, r) {
@@ -536,7 +511,7 @@ function ct(o) {
536
511
  });
537
512
  };
538
513
  }
539
- const H = {
514
+ const P = {
540
515
  style: {
541
516
  position: "absolute",
542
517
  display: "none",
@@ -595,18 +570,18 @@ const H = {
595
570
  }],
596
571
  offsetTop: 50,
597
572
  icons: {
598
- copyPaste: et,
599
- delete: ot,
600
- lock: tt,
601
- unlock: at,
602
- bringToFront: nt,
603
- sendToBack: st,
604
- bringForward: rt,
605
- sendBackwards: it
573
+ copyPaste: $e,
574
+ delete: nt,
575
+ lock: qe,
576
+ unlock: et,
577
+ bringToFront: rt,
578
+ sendToBack: it,
579
+ bringForward: tt,
580
+ sendBackwards: at
606
581
  },
607
582
  handlers: {
608
583
  copyPaste: function() {
609
- var o = ct(function* (t) {
584
+ var o = st(function* (t) {
610
585
  yield t.clipboardManager.copy(), yield t.clipboardManager.paste();
611
586
  });
612
587
  function e(t) {
@@ -651,21 +626,21 @@ function j(o) {
651
626
  for (var e = 1; e < arguments.length; e++) {
652
627
  var t = arguments[e] != null ? arguments[e] : {};
653
628
  e % 2 ? be(Object(t), !0).forEach(function(a) {
654
- ut(o, a, t[a]);
629
+ ot(o, a, t[a]);
655
630
  }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(o, Object.getOwnPropertyDescriptors(t)) : be(Object(t)).forEach(function(a) {
656
631
  Object.defineProperty(o, a, Object.getOwnPropertyDescriptor(t, a));
657
632
  });
658
633
  }
659
634
  return o;
660
635
  }
661
- function ut(o, e, t) {
662
- return (e = dt(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
636
+ function ot(o, e, t) {
637
+ return (e = ct(e)) in o ? Object.defineProperty(o, e, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : o[e] = t, o;
663
638
  }
664
- function dt(o) {
665
- var e = lt(o, "string");
639
+ function ct(o) {
640
+ var e = ut(o, "string");
666
641
  return typeof e == "symbol" ? e : e + "";
667
642
  }
668
- function lt(o, e) {
643
+ function ut(o, e) {
669
644
  if (typeof o != "object" || !o) return o;
670
645
  var t = o[Symbol.toPrimitive];
671
646
  if (t !== void 0) {
@@ -675,7 +650,7 @@ function lt(o, e) {
675
650
  }
676
651
  return (e === "string" ? String : Number)(o);
677
652
  }
678
- class ht {
653
+ class dt {
679
654
  /**
680
655
  * @param {object} options
681
656
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -687,11 +662,11 @@ class ht {
687
662
  if (this.options = t.options, !!this.options.showToolbar) {
688
663
  this.editor = t, this.canvas = t.canvas;
689
664
  var a = this.options.toolbar || {};
690
- this.config = j(j(j({}, H), a), {}, {
691
- style: j(j({}, H.style), a.style || {}),
692
- btnStyle: j(j({}, H.btnStyle), a.btnStyle || {}),
693
- icons: j(j({}, H.icons), a.icons || {}),
694
- handlers: j(j({}, H.handlers), a.handlers || {})
665
+ this.config = j(j(j({}, P), a), {}, {
666
+ style: j(j({}, P.style), a.style || {}),
667
+ btnStyle: j(j({}, P.btnStyle), a.btnStyle || {}),
668
+ icons: j(j({}, P.icons), a.icons || {}),
669
+ handlers: j(j({}, P.handlers), a.handlers || {})
695
670
  }), 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 = () => {
696
671
  this.el.style.display = "none";
697
672
  }, this._createDOM(), this._bindEvents();
@@ -730,12 +705,12 @@ class ht {
730
705
  } = r, {
731
706
  icons: c,
732
707
  btnStyle: u,
733
- handlers: l
734
- } = t.config, d = document.createElement("button");
735
- d.innerHTML = c[s] ? '<img src="'.concat(c[s], '" title="').concat(n, '" />') : n, Object.assign(d.style, u), d.onclick = () => {
708
+ handlers: d
709
+ } = t.config, l = document.createElement("button");
710
+ l.innerHTML = c[s] ? '<img src="'.concat(c[s], '" title="').concat(n, '" />') : n, Object.assign(l.style, u), l.onclick = () => {
736
711
  var h;
737
- return (h = l[s]) === null || h === void 0 ? void 0 : h.call(l, t.editor);
738
- }, t.el.appendChild(d);
712
+ return (h = d[s]) === null || h === void 0 ? void 0 : h.call(d, t.editor);
713
+ }, t.el.appendChild(l);
739
714
  };
740
715
  for (var r of e)
741
716
  a();
@@ -811,8 +786,8 @@ class ht {
811
786
  x: c
812
787
  } = e.getCenterPoint(), {
813
788
  top: u,
814
- height: l
815
- } = e.getBoundingRect(!1, !0), d = c * i + n, h = d - t.offsetWidth / 2, g = (u + l) * i + s + a.offsetTop;
789
+ height: d
790
+ } = e.getBoundingRect(!1, !0), l = c * i + n, h = l - t.offsetWidth / 2, g = (u + d) * i + s + a.offsetTop;
816
791
  Object.assign(t.style, {
817
792
  left: "".concat(h, "px"),
818
793
  top: "".concat(g, "px"),
@@ -850,7 +825,7 @@ function ee(o) {
850
825
  });
851
826
  };
852
827
  }
853
- class gt {
828
+ class lt {
854
829
  /**
855
830
  * @param {object} options
856
831
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -865,8 +840,11 @@ class gt {
865
840
  get skipHistory() {
866
841
  return this._historySuspendCount > 0;
867
842
  }
843
+ get lastPatch() {
844
+ return this.patches[this.currentIndex - 1] || null;
845
+ }
868
846
  _createDiffPatcher() {
869
- this.diffPatcher = _e({
847
+ this.diffPatcher = He({
870
848
  objectHash(e) {
871
849
  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("-");
872
850
  },
@@ -910,7 +888,7 @@ class gt {
910
888
  currentIndex: t,
911
889
  patches: a
912
890
  } = this, r = JSON.parse(JSON.stringify(e)), i = 0; i < t; i += 1)
913
- r = this.diffPatcher.patch(r, a[i]);
891
+ r = this.diffPatcher.patch(r, a[i].diff);
914
892
  return console.log("getFullState state", r), r;
915
893
  }
916
894
  /**
@@ -929,7 +907,10 @@ class gt {
929
907
  console.log("Нет изменений для сохранения.");
930
908
  return;
931
909
  }
932
- console.log("baseState", this.baseState), this.currentIndex < this.patches.length && this.patches.splice(this.currentIndex), console.log("diff", a), this.totalChangesCount += 1, this.patches.push(a), this.currentIndex += 1, this.patches.length > this.maxHistoryLength && (this.baseState = this.diffPatcher.patch(this.baseState, this.patches[0]), this.patches.shift(), this.currentIndex -= 1, this.baseStateChangesCount += 1), console.log("Состояние сохранено. Текущий индекс истории:", this.currentIndex);
910
+ console.log("baseState", this.baseState), this.currentIndex < this.patches.length && this.patches.splice(this.currentIndex), console.log("diff", a), this.totalChangesCount += 1, this.patches.push({
911
+ id: S(),
912
+ diff: a
913
+ }), this.currentIndex += 1, this.patches.length > this.maxHistoryLength && (this.baseState = this.diffPatcher.patch(this.baseState, this.patches[0].diff), this.patches.shift(), this.currentIndex -= 1, this.baseStateChangesCount += 1), console.log("Состояние сохранено. Текущий индекс истории:", this.currentIndex);
933
914
  }
934
915
  }
935
916
  /**
@@ -941,11 +922,27 @@ class gt {
941
922
  var t = this;
942
923
  return ee(function* () {
943
924
  if (e) {
944
- console.log("loadStateFromFullState fullState", e), yield t.canvas.loadFromJSON(e);
945
- var a = t.canvas.getObjects().find((i) => i.id === "montage-area");
946
- a && (t.editor.montageArea = a);
947
- var r = t.canvas.getObjects().find((i) => i.id === "overlay-mask");
948
- r && (t.editor.interactionBlocker.overlayMask = r, t.editor.interactionBlocker.overlayMask.visible = !1), t.canvas.renderAll(), t.canvas.fire("editor:history-state-loaded");
925
+ console.log("loadStateFromFullState fullState", e);
926
+ var {
927
+ canvas: a,
928
+ canvasManager: r,
929
+ interactionBlocker: i
930
+ } = t.editor, {
931
+ width: n,
932
+ height: s
933
+ } = a;
934
+ yield a.loadFromJSON(e);
935
+ var c = a.getObjects().find((d) => d.id === "montage-area");
936
+ c && (t.editor.montageArea = c, (n !== e.width || s !== e.height) && r.updateCanvasAndFitObjects());
937
+ var u = a.getObjects().find((d) => d.id === "overlay-mask");
938
+ u && (i.overlayMask = u, i.overlayMask.visible = !1), a.renderAll(), a.fire("editor:history-state-loaded", {
939
+ fullState: e,
940
+ currentIndex: t.currentIndex,
941
+ totalChangesCount: t.totalChangesCount,
942
+ baseStateChangesCount: t.baseStateChangesCount,
943
+ patchesCount: t.patches.length,
944
+ patches: t.patches
945
+ });
949
946
  }
950
947
  })();
951
948
  }
@@ -1004,7 +1001,7 @@ class gt {
1004
1001
  })();
1005
1002
  }
1006
1003
  }
1007
- const vt = 0.1, mt = 2, Mt = 0.1, ft = 90, k = 16, x = 16, E = 4096, T = 4096;
1004
+ const ht = 0.1, gt = 2, vt = 0.1, mt = 90, k = 16, x = 16, E = 4096, O = 4096;
1008
1005
  function Se(o, e, t, a, r, i, n) {
1009
1006
  try {
1010
1007
  var s = o[i](n), c = s.value;
@@ -1013,7 +1010,7 @@ function Se(o, e, t, a, r, i, n) {
1013
1010
  }
1014
1011
  s.done ? e(c) : Promise.resolve(c).then(a, r);
1015
1012
  }
1016
- function O(o) {
1013
+ function T(o) {
1017
1014
  return function() {
1018
1015
  var e = this, t = arguments;
1019
1016
  return new Promise(function(a, r) {
@@ -1028,7 +1025,7 @@ function O(o) {
1028
1025
  });
1029
1026
  };
1030
1027
  }
1031
- class C {
1028
+ class w {
1032
1029
  /**
1033
1030
  * @param {object} options
1034
1031
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -1053,7 +1050,7 @@ class C {
1053
1050
  */
1054
1051
  importImage(e) {
1055
1052
  var t = this;
1056
- return O(function* () {
1053
+ return T(function* () {
1057
1054
  var {
1058
1055
  source: a,
1059
1056
  scale: r = "image-".concat(t.options.scaleType),
@@ -1065,24 +1062,24 @@ class C {
1065
1062
  montageArea: s,
1066
1063
  transformManager: c,
1067
1064
  historyManager: u,
1068
- errorManager: l
1069
- } = t.editor, d = yield t.getContentType(a), h = C.getFormatFromContentType(d), {
1065
+ errorManager: d
1066
+ } = t.editor, l = yield t.getContentType(a), h = w.getFormatFromContentType(l), {
1070
1067
  acceptContentTypes: g,
1071
- acceptFormats: m
1068
+ acceptFormats: M
1072
1069
  } = t;
1073
- if (!t.isAllowedContentType(d)) {
1074
- var M = "Неверный contentType для изображения: ".concat(d, ". Ожидается один из: ").concat(t.acceptContentTypes.join(", "), ".");
1075
- return l.emitError({
1070
+ if (!t.isAllowedContentType(l)) {
1071
+ var m = "Неверный contentType для изображения: ".concat(l, ". Ожидается один из: ").concat(t.acceptContentTypes.join(", "), ".");
1072
+ return d.emitError({
1076
1073
  origin: "ImageManager",
1077
1074
  method: "importImage",
1078
1075
  code: "INVALID_CONTENT_TYPE",
1079
- message: M,
1076
+ message: m,
1080
1077
  data: {
1081
1078
  source: a,
1082
1079
  format: h,
1083
- contentType: d,
1080
+ contentType: l,
1084
1081
  acceptContentTypes: g,
1085
- acceptFormats: m
1082
+ acceptFormats: M
1086
1083
  }
1087
1084
  }), null;
1088
1085
  }
@@ -1092,15 +1089,15 @@ class C {
1092
1089
  if (a instanceof File)
1093
1090
  f = URL.createObjectURL(a);
1094
1091
  else if (typeof a == "string") {
1095
- var S = yield fetch(a, {
1092
+ var A = yield fetch(a, {
1096
1093
  mode: "cors"
1097
- }), N = yield S.blob({
1098
- type: d,
1094
+ }), D = yield A.blob({
1095
+ type: l,
1099
1096
  quality: 1
1100
1097
  });
1101
- f = URL.createObjectURL(N);
1098
+ f = URL.createObjectURL(D);
1102
1099
  } else
1103
- return l.emitError({
1100
+ return d.emitError({
1104
1101
  origin: "ImageManager",
1105
1102
  method: "importImage",
1106
1103
  code: "INVALID_SOURCE_TYPE",
@@ -1108,14 +1105,14 @@ class C {
1108
1105
  data: {
1109
1106
  source: a,
1110
1107
  format: h,
1111
- contentType: d,
1108
+ contentType: l,
1112
1109
  acceptContentTypes: g,
1113
- acceptFormats: m
1110
+ acceptFormats: M
1114
1111
  }
1115
1112
  }), null;
1116
1113
  if (t._createdBlobUrls.push(f), h === "svg") {
1117
- var w = yield xe(f);
1118
- v = R.groupSVGElements(w.objects, w.options);
1114
+ var N = yield Te(f);
1115
+ v = _.groupSVGElements(N.objects, N.options);
1119
1116
  } else
1120
1117
  v = yield q.fromURL(f, {
1121
1118
  crossOrigin: "anonymous"
@@ -1124,25 +1121,25 @@ class C {
1124
1121
  width: L,
1125
1122
  height: y
1126
1123
  } = v;
1127
- if (y > T || L > E) {
1124
+ if (y > O || L > E) {
1128
1125
  var p = yield t.resizeImageToBoundaries(v._element.src, "max"), B = URL.createObjectURL(p);
1129
1126
  t._createdBlobUrls.push(B), v = yield q.fromURL(B, {
1130
1127
  crossOrigin: "anonymous"
1131
1128
  });
1132
1129
  } else if (y < x || L < k) {
1133
- var W = yield t.resizeImageToBoundaries(v._element.src, "min"), Z = URL.createObjectURL(W);
1130
+ var F = yield t.resizeImageToBoundaries(v._element.src, "min"), Z = URL.createObjectURL(F);
1134
1131
  t._createdBlobUrls.push(Z), v = yield q.fromURL(Z, {
1135
1132
  crossOrigin: "anonymous"
1136
1133
  });
1137
1134
  }
1138
- if (v.set("id", "".concat(v.type, "-").concat(D())), v.set("format", h), r === "scale-montage")
1135
+ if (v.set("id", "".concat(v.type, "-").concat(S())), v.set("format", h), r === "scale-montage")
1139
1136
  t.editor.canvasManager.scaleMontageAreaToImage({
1140
1137
  object: v,
1141
1138
  withoutSave: !0
1142
1139
  });
1143
1140
  else {
1144
1141
  var {
1145
- width: F,
1142
+ width: V,
1146
1143
  height: z
1147
1144
  } = s, U = t.calculateScaleFactor({
1148
1145
  imageObject: v,
@@ -1152,24 +1149,24 @@ class C {
1152
1149
  object: v,
1153
1150
  type: "contain",
1154
1151
  withoutSave: !0
1155
- }) : r === "image-cover" && (L > F || y > z) && c.fitObject({
1152
+ }) : r === "image-cover" && (L > V || y > z) && c.fitObject({
1156
1153
  object: v,
1157
1154
  type: "cover",
1158
1155
  withoutSave: !0
1159
1156
  });
1160
1157
  }
1161
1158
  n.add(v), n.centerObject(v), n.setActiveObject(v), n.renderAll(), u.resumeHistory(), i || u.saveState();
1162
- var V = {
1159
+ var G = {
1163
1160
  image: v,
1164
1161
  format: h,
1165
- contentType: d,
1162
+ contentType: l,
1166
1163
  scale: r,
1167
1164
  withoutSave: i,
1168
1165
  source: a
1169
1166
  };
1170
- return n.fire("editor:image-imported", V), V;
1167
+ return n.fire("editor:image-imported", G), G;
1171
1168
  } catch (Y) {
1172
- return l.emitError({
1169
+ return d.emitError({
1173
1170
  origin: "ImageManager",
1174
1171
  method: "importImage",
1175
1172
  code: "IMPORT_FAILED",
@@ -1177,7 +1174,7 @@ class C {
1177
1174
  data: {
1178
1175
  source: a,
1179
1176
  format: h,
1180
- contentType: d,
1177
+ contentType: l,
1181
1178
  scale: r,
1182
1179
  withoutSave: i
1183
1180
  }
@@ -1195,14 +1192,14 @@ class C {
1195
1192
  */
1196
1193
  resizeImageToBoundaries(e) {
1197
1194
  var t = arguments, a = this;
1198
- return O(function* () {
1199
- var r = t.length > 1 && t[1] !== void 0 ? t[1] : "max", i = "Размер изображения больше максимального размера канваса, поэтому оно будет уменьшено до максимальных размеров c сохранением пропорций: ".concat(E, "x").concat(T);
1195
+ return T(function* () {
1196
+ var r = t.length > 1 && t[1] !== void 0 ? t[1] : "max", i = "Размер изображения больше максимального размера канваса, поэтому оно будет уменьшено до максимальных размеров c сохранением пропорций: ".concat(E, "x").concat(O);
1200
1197
  r === "min" && (i = "Размер изображения меньше минимального размера канваса, поэтому оно будет увеличено до минимальных размеров c сохранением пропорций: ".concat(k, "x").concat(x));
1201
1198
  var n = {
1202
1199
  dataURL: e,
1203
1200
  sizeType: r,
1204
1201
  maxWidth: E,
1205
- maxHeight: T,
1202
+ maxHeight: O,
1206
1203
  minWidth: k,
1207
1204
  minHeight: x
1208
1205
  };
@@ -1228,7 +1225,7 @@ class C {
1228
1225
  */
1229
1226
  exportCanvasAsImageFile() {
1230
1227
  var e = arguments, t = this;
1231
- return O(function* () {
1228
+ return T(function* () {
1232
1229
  var {
1233
1230
  fileName: a = "image.png",
1234
1231
  contentType: r = "image/png",
@@ -1240,27 +1237,27 @@ class C {
1240
1237
  workerManager: u
1241
1238
  } = t.editor;
1242
1239
  try {
1243
- var l = r === "application/pdf", d = l ? "image/jpg" : r, h = C.getFormatFromContentType(d);
1240
+ var d = r === "application/pdf", l = d ? "image/jpg" : r, h = w.getFormatFromContentType(l);
1244
1241
  c.setCoords();
1245
1242
  var {
1246
1243
  left: g,
1247
- top: m,
1248
- width: M,
1244
+ top: M,
1245
+ width: m,
1249
1246
  height: f
1250
1247
  } = c.getBoundingRect(), v = yield s.clone(["id", "format", "locked"]);
1251
- ["image/jpg", "image/jpeg"].includes(d) && (v.backgroundColor = "#ffffff");
1252
- var S = v.getObjects().find((b) => b.id === c.id);
1253
- S.visible = !1, v.viewportTransform = [1, 0, 0, 1, -g, -m], v.setDimensions({
1254
- width: M,
1248
+ ["image/jpg", "image/jpeg"].includes(l) && (v.backgroundColor = "#ffffff");
1249
+ var A = v.getObjects().find((b) => b.id === c.id);
1250
+ A.visible = !1, v.viewportTransform = [1, 0, 0, 1, -g, -M], v.setDimensions({
1251
+ width: m,
1255
1252
  height: f
1256
1253
  }, {
1257
1254
  backstoreOnly: !0
1258
1255
  }), v.renderAll();
1259
- var N = v.getObjects().filter((b) => b.format).every((b) => b.format === "svg");
1260
- if (h === "svg" && N) {
1261
- var w = v.toSVG();
1256
+ var D = v.getObjects().filter((b) => b.format).every((b) => b.format === "svg");
1257
+ if (h === "svg" && D) {
1258
+ var N = v.toSVG();
1262
1259
  v.dispose();
1263
- var L = C._exportSVGStringAsFile(w, {
1260
+ var L = w._exportSVGStringAsFile(N, {
1264
1261
  exportAsBase64: i,
1265
1262
  exportAsBlob: n,
1266
1263
  fileName: a
@@ -1279,35 +1276,35 @@ class C {
1279
1276
  var B = {
1280
1277
  image: p,
1281
1278
  format: h,
1282
- contentType: d,
1279
+ contentType: l,
1283
1280
  fileName: a
1284
1281
  };
1285
1282
  return s.fire("editor:canvas-exported", B), B;
1286
1283
  }
1287
- var W = yield createImageBitmap(p), Z = yield u.post("toDataURL", {
1284
+ var F = yield createImageBitmap(p), Z = yield u.post("toDataURL", {
1288
1285
  format: h,
1289
1286
  quality: 1,
1290
- bitmap: W
1291
- }, [W]);
1292
- if (l) {
1293
- var F = 0.264583, z = M * F, U = f * F, V = (yield t.editor.moduleLoader.loadModule("jspdf")).jsPDF, Y = new V({
1287
+ bitmap: F
1288
+ }, [F]);
1289
+ if (d) {
1290
+ var V = 0.264583, z = m * V, U = f * V, G = (yield t.editor.moduleLoader.loadModule("jspdf")).jsPDF, Y = new G({
1294
1291
  orientation: z > U ? "landscape" : "portrait",
1295
1292
  unit: "mm",
1296
1293
  format: [z, U]
1297
1294
  });
1298
1295
  if (Y.addImage(Z, "JPG", 0, 0, z, U), i) {
1299
- var Ne = Y.output("datauristring"), de = {
1300
- image: Ne,
1296
+ var Ce = Y.output("datauristring"), de = {
1297
+ image: Ce,
1301
1298
  format: "pdf",
1302
1299
  contentType: "application/pdf",
1303
1300
  fileName: a
1304
1301
  };
1305
1302
  return s.fire("editor:canvas-exported", de), de;
1306
1303
  }
1307
- var we = Y.output("blob"), Le = new File([we], a, {
1304
+ var we = Y.output("blob"), De = new File([we], a, {
1308
1305
  type: "application/pdf"
1309
1306
  }), le = {
1310
- image: Le,
1307
+ image: De,
1311
1308
  format: "pdf",
1312
1309
  contentType: "application/pdf",
1313
1310
  fileName: a
@@ -1318,17 +1315,17 @@ class C {
1318
1315
  var he = {
1319
1316
  image: Z,
1320
1317
  format: h,
1321
- contentType: d,
1318
+ contentType: l,
1322
1319
  fileName: a
1323
1320
  };
1324
1321
  return s.fire("editor:canvas-exported", he), he;
1325
1322
  }
1326
- var ge = h === "svg" && !N ? a.replace(/\.[^/.]+$/, ".png") : a, Ee = new File([p], ge, {
1327
- type: d
1323
+ var ge = h === "svg" && !D ? a.replace(/\.[^/.]+$/, ".png") : a, Ne = new File([p], ge, {
1324
+ type: l
1328
1325
  }), ve = {
1329
- image: Ee,
1326
+ image: Ne,
1330
1327
  format: h,
1331
- contentType: d,
1328
+ contentType: l,
1332
1329
  fileName: ge
1333
1330
  };
1334
1331
  return s.fire("editor:canvas-exported", ve), ve;
@@ -1361,7 +1358,7 @@ class C {
1361
1358
  */
1362
1359
  exportObjectAsImageFile() {
1363
1360
  var e = arguments, t = this;
1364
- return O(function* () {
1361
+ return T(function* () {
1365
1362
  var {
1366
1363
  object: a,
1367
1364
  fileName: r = "image.png",
@@ -1371,8 +1368,8 @@ class C {
1371
1368
  } = e.length > 0 && e[0] !== void 0 ? e[0] : {}, {
1372
1369
  canvas: c,
1373
1370
  workerManager: u
1374
- } = t.editor, l = a || c.getActiveObject();
1375
- if (!l)
1371
+ } = t.editor, d = a || c.getActiveObject();
1372
+ if (!d)
1376
1373
  return t.editor.errorManager.emitError({
1377
1374
  origin: "ImageManager",
1378
1375
  method: "exportObjectAsImageFile",
@@ -1386,50 +1383,50 @@ class C {
1386
1383
  }
1387
1384
  }), "";
1388
1385
  try {
1389
- var d = C.getFormatFromContentType(i);
1390
- if (d === "svg") {
1391
- var h = l.toSVG(), g = t._exportSVGStringAsFile(h, {
1386
+ var l = w.getFormatFromContentType(i);
1387
+ if (l === "svg") {
1388
+ var h = d.toSVG(), g = t._exportSVGStringAsFile(h, {
1392
1389
  exportAsBase64: n,
1393
1390
  exportAsBlob: s,
1394
1391
  fileName: r
1395
- }), m = {
1392
+ }), M = {
1396
1393
  image: g,
1397
- format: d,
1394
+ format: l,
1398
1395
  contentType: "image/svg+xml",
1399
1396
  fileName: r.replace(/\.[^/.]+$/, ".svg")
1400
1397
  };
1401
- return c.fire("editor:object-exported", m), m;
1398
+ return c.fire("editor:object-exported", M), M;
1402
1399
  }
1403
1400
  if (n) {
1404
- var M = yield createImageBitmap(l._element), f = yield u.post("toDataURL", {
1405
- format: d,
1401
+ var m = yield createImageBitmap(d._element), f = yield u.post("toDataURL", {
1402
+ format: l,
1406
1403
  quality: 1,
1407
- bitmap: M
1408
- }, [M]), v = {
1404
+ bitmap: m
1405
+ }, [m]), v = {
1409
1406
  image: f,
1410
- format: d,
1407
+ format: l,
1411
1408
  contentType: i,
1412
1409
  fileName: r
1413
1410
  };
1414
1411
  return c.fire("editor:object-exported", v), v;
1415
1412
  }
1416
- var S = l.toCanvasElement(), N = yield new Promise((p) => {
1417
- S.toBlob(p);
1413
+ var A = d.toCanvasElement(), D = yield new Promise((p) => {
1414
+ A.toBlob(p);
1418
1415
  });
1419
1416
  if (s) {
1420
- var w = {
1421
- image: N,
1422
- format: d,
1417
+ var N = {
1418
+ image: D,
1419
+ format: l,
1423
1420
  contentType: i,
1424
1421
  fileName: r
1425
1422
  };
1426
- return c.fire("editor:object-exported", w), w;
1423
+ return c.fire("editor:object-exported", N), N;
1427
1424
  }
1428
- var L = new File([N], r, {
1425
+ var L = new File([D], r, {
1429
1426
  type: i
1430
1427
  }), y = {
1431
1428
  image: L,
1432
- format: d,
1429
+ format: l,
1433
1430
  contentType: i,
1434
1431
  fileName: r
1435
1432
  };
@@ -1485,7 +1482,7 @@ class C {
1485
1482
  * @returns {string[]} - массив допустимых форматов изображений
1486
1483
  */
1487
1484
  getAllowedFormatsFromContentTypes() {
1488
- return this.acceptContentTypes.map((e) => C.getFormatFromContentType(e)).filter((e) => e);
1485
+ return this.acceptContentTypes.map((e) => w.getFormatFromContentType(e)).filter((e) => e);
1489
1486
  }
1490
1487
  /**
1491
1488
  * Извлекает чистый формат (subtype) из contentType,
@@ -1515,7 +1512,7 @@ class C {
1515
1512
  */
1516
1513
  getContentType(e) {
1517
1514
  var t = this;
1518
- return O(function* () {
1515
+ return T(function* () {
1519
1516
  return typeof e == "string" ? t.getContentTypeFromUrl(e) : e.type || "application/octet-stream";
1520
1517
  })();
1521
1518
  }
@@ -1527,7 +1524,7 @@ class C {
1527
1524
  */
1528
1525
  getContentTypeFromUrl(e) {
1529
1526
  var t = this;
1530
- return O(function* () {
1527
+ return T(function* () {
1531
1528
  if (e.startsWith("data:")) {
1532
1529
  var a = e.match(/^data:([^;]+)/);
1533
1530
  return a ? a[1] : "application/octet-stream";
@@ -1554,7 +1551,7 @@ class C {
1554
1551
  try {
1555
1552
  var t, a = new URL(e), r = (t = a.pathname.split(".").pop()) === null || t === void 0 ? void 0 : t.toLowerCase(), i = {};
1556
1553
  return this.acceptContentTypes.forEach((n) => {
1557
- var s = C.getFormatFromContentType(n);
1554
+ var s = w.getFormatFromContentType(n);
1558
1555
  s && (i[s] = n);
1559
1556
  }), i[r] || "application/octet-stream";
1560
1557
  } catch (n) {
@@ -1582,7 +1579,7 @@ class C {
1582
1579
  return a === "contain" || a === "image-contain" ? Math.min(i / s, n / c) : a === "cover" || a === "image-cover" ? Math.max(i / s, n / c) : 1;
1583
1580
  }
1584
1581
  }
1585
- class jt {
1582
+ class Mt {
1586
1583
  /**
1587
1584
  * @param {object} options
1588
1585
  * @param {ImageEditor} options.editor – экземпляр редактора
@@ -1618,21 +1615,21 @@ class jt {
1618
1615
  } = this.editor, {
1619
1616
  width: c,
1620
1617
  height: u
1621
- } = n, l = Number(Math.max(Math.min(e, E), k));
1622
- if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreWidth(s) : this.setCanvasBackstoreWidth(l), n.set({
1623
- width: l
1618
+ } = n, d = Number(Math.max(Math.min(e, E), k));
1619
+ if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreWidth(s) : this.setCanvasBackstoreWidth(d), n.set({
1620
+ width: d
1624
1621
  }), i.clipPath.set({
1625
- width: l
1622
+ width: d
1626
1623
  }), t) {
1627
- var d = l / c, h = u * d;
1624
+ var l = d / c, h = u * l;
1628
1625
  this.setResolutionHeight(h);
1629
1626
  return;
1630
1627
  }
1631
1628
  var {
1632
1629
  left: g,
1633
- top: m
1634
- } = this.getObjectDefaultCoords(n), M = i.getZoom();
1635
- i.setViewportTransform([M, 0, 0, M, g, m]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), i == null || i.fire("editor:resolution-width-changed", {
1630
+ top: M
1631
+ } = this.getObjectDefaultCoords(n), m = i.getZoom();
1632
+ i.setViewportTransform([m, 0, 0, m, g, M]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), i == null || i.fire("editor:resolution-width-changed", {
1636
1633
  width: e
1637
1634
  });
1638
1635
  }
@@ -1662,21 +1659,21 @@ class jt {
1662
1659
  } = this.editor, {
1663
1660
  width: c,
1664
1661
  height: u
1665
- } = n, l = Number(Math.max(Math.min(e, T), x));
1666
- if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreHeight(s) : this.setCanvasBackstoreHeight(l), n.set({
1667
- height: l
1662
+ } = n, d = Number(Math.max(Math.min(e, O), x));
1663
+ if (!s || s === "auto" || r ? this.adaptCanvasToContainer() : s ? this.setCanvasBackstoreHeight(s) : this.setCanvasBackstoreHeight(d), n.set({
1664
+ height: d
1668
1665
  }), i.clipPath.set({
1669
- height: l
1666
+ height: d
1670
1667
  }), t) {
1671
- var d = l / u, h = c * d;
1668
+ var l = d / u, h = c * l;
1672
1669
  this.setResolutionWidth(h);
1673
1670
  return;
1674
1671
  }
1675
1672
  var {
1676
1673
  left: g,
1677
- top: m
1678
- } = this.getObjectDefaultCoords(n), M = i.getZoom();
1679
- i.setViewportTransform([M, 0, 0, M, g, m]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), i == null || i.fire("editor:resolution-height-changed", {
1674
+ top: M
1675
+ } = this.getObjectDefaultCoords(n), m = i.getZoom();
1676
+ i.setViewportTransform([m, 0, 0, m, g, M]), this.centerMontageArea(), a || this.editor.historyManager.saveState(), i == null || i.fire("editor:resolution-height-changed", {
1680
1677
  height: e
1681
1678
  });
1682
1679
  }
@@ -1689,7 +1686,7 @@ class jt {
1689
1686
  var {
1690
1687
  canvas: e,
1691
1688
  montageArea: t
1692
- } = this.editor, a = e.getWidth(), r = e.getHeight(), i = e.getZoom(), n = new Be(a / 2, r / 2);
1689
+ } = this.editor, a = e.getWidth(), r = e.getHeight(), i = e.getZoom(), n = new ke(a / 2, r / 2);
1693
1690
  t.set({
1694
1691
  left: a / 2,
1695
1692
  top: r / 2
@@ -1734,7 +1731,7 @@ class jt {
1734
1731
  }
1735
1732
  setCanvasBackstoreHeight(e) {
1736
1733
  if (!(!e || typeof e != "number")) {
1737
- var t = Math.max(Math.min(e, T), x);
1734
+ var t = Math.max(Math.min(e, O), x);
1738
1735
  this.editor.canvas.setDimensions({
1739
1736
  height: t
1740
1737
  }, {
@@ -1745,7 +1742,7 @@ class jt {
1745
1742
  adaptCanvasToContainer() {
1746
1743
  var {
1747
1744
  canvas: e
1748
- } = this.editor, t = e.editorContainer, a = t.clientWidth, r = t.clientHeight, i = Math.max(Math.min(a, E), k), n = Math.max(Math.min(r, T), x);
1745
+ } = this.editor, t = e.editorContainer, a = t.clientWidth, r = t.clientHeight, i = Math.max(Math.min(a, E), k), n = Math.max(Math.min(r, O), x);
1749
1746
  console.log("adaptCanvasToContainer newWidth", i), console.log("adaptCanvasToContainer newHeight", n), e.setDimensions({
1750
1747
  width: i,
1751
1748
  height: n
@@ -1753,6 +1750,35 @@ class jt {
1753
1750
  backstoreOnly: !0
1754
1751
  });
1755
1752
  }
1753
+ /**
1754
+ * Обновляет размеры канваса и вписывает объекты в монтажную область.
1755
+ * Вызывается при изменении размеров контейнера редактора.
1756
+ * @fires editor:canvas-updated
1757
+ */
1758
+ updateCanvasAndFitObjects() {
1759
+ var {
1760
+ canvas: e,
1761
+ selectionManager: t,
1762
+ transformManager: a,
1763
+ montageArea: {
1764
+ width: r,
1765
+ height: i
1766
+ }
1767
+ } = this.editor;
1768
+ this.setResolutionWidth(r, {
1769
+ adaptCanvasToContainer: !0,
1770
+ withoutSave: !0
1771
+ }), this.setResolutionHeight(i, {
1772
+ adaptCanvasToContainer: !0,
1773
+ withoutSave: !0
1774
+ }), this.centerMontageArea(), t.selectAll(), a.fitObject({
1775
+ fitAsOneObject: !0,
1776
+ withoutSave: !0
1777
+ }), e.fire("editor:canvas-updated", {
1778
+ width: r,
1779
+ height: i
1780
+ });
1781
+ }
1756
1782
  /**
1757
1783
  * Заготовка.
1758
1784
  * Обновляет CSS-размеры канваса в зависимости от текущего зума, чтобы можно было скроллить вниз-вверх, влево-вправо.
@@ -1885,16 +1911,16 @@ class jt {
1885
1911
  }
1886
1912
  var s = t === "width" ? "width" : "height";
1887
1913
  if (typeof a == "string") {
1888
- n.forEach((l) => {
1889
- l.style[s] = a;
1914
+ n.forEach((d) => {
1915
+ d.style[s] = a;
1890
1916
  });
1891
1917
  return;
1892
1918
  }
1893
1919
  var c = parseFloat(a);
1894
1920
  if (!isNaN(c)) {
1895
1921
  var u = "".concat(c, "px");
1896
- n.forEach((l) => {
1897
- l.style[s] = u;
1922
+ n.forEach((d) => {
1923
+ d.style[s] = u;
1898
1924
  }), r.fire("editor:display-".concat(e, "-").concat(s, "-changed"), {
1899
1925
  element: e,
1900
1926
  value: a
@@ -1908,7 +1934,7 @@ class jt {
1908
1934
  * @param {fabric.Object} [options.object] - Объект с изображением, которое нужно масштабировать
1909
1935
  * @param {Boolean} [options.withoutSave] - Не сохранять состояние
1910
1936
  * @param {Boolean} [options.preserveAspectRatio] - Сохранять изначальные пропорции монтажной области
1911
- * @fires editor:canvas-scaled
1937
+ * @fires editor:montage-area-scaled-to-image
1912
1938
  */
1913
1939
  scaleMontageAreaToImage() {
1914
1940
  var {
@@ -1926,25 +1952,28 @@ class jt {
1926
1952
  } = this.editor, u = e || r.getActiveObject();
1927
1953
  if (!(!u || u.type !== "image" && u.format !== "svg")) {
1928
1954
  var {
1929
- width: l,
1930
- height: d
1931
- } = u, h = Math.min(l, E), g = Math.min(d, T);
1955
+ width: d,
1956
+ height: l
1957
+ } = u, h = Math.min(d, E), g = Math.min(l, O);
1932
1958
  if (t) {
1933
1959
  var {
1934
- width: m,
1935
- height: M
1936
- } = i, f = l / m, v = d / M, S = Math.max(f, v);
1937
- h = m * S, g = M * S;
1960
+ width: M,
1961
+ height: m
1962
+ } = i, f = d / M, v = l / m, A = Math.max(f, v);
1963
+ h = M * A, g = m * A;
1938
1964
  }
1939
1965
  this.setResolutionWidth(h, {
1940
1966
  withoutSave: !0
1941
1967
  }), this.setResolutionHeight(g, {
1942
1968
  withoutSave: !0
1943
- }), (l > s || d > c) && n.calculateAndApplyDefaultZoom(s, c), n.resetObject(u, {
1969
+ }), (d > s || l > c) && n.calculateAndApplyDefaultZoom(), n.resetObject(u, {
1944
1970
  withoutSave: !0
1945
- }), r.centerObject(u), r.renderAll(), a || this.editor.historyManager.saveState(), r.fire("editor:canvas-scaled", {
1971
+ }), r.centerObject(u), r.renderAll(), a || this.editor.historyManager.saveState(), r.fire("editor:montage-area-scaled-to-image", {
1972
+ object: u,
1946
1973
  width: h,
1947
- height: g
1974
+ height: g,
1975
+ preserveAspectRatio: t,
1976
+ withoutSave: a
1948
1977
  });
1949
1978
  }
1950
1979
  }
@@ -1999,7 +2028,7 @@ class jt {
1999
2028
  return r.filter((i) => i.id !== t.id && i.id !== a.id);
2000
2029
  }
2001
2030
  }
2002
- class yt {
2031
+ class ft {
2003
2032
  /**
2004
2033
  * @param {object} options
2005
2034
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2011,22 +2040,24 @@ class yt {
2011
2040
  this.editor = t, this.options = t.options;
2012
2041
  }
2013
2042
  /**
2014
- * Метод рассчитывает дефолтный, максимальный, и минимальный зум таким образом,
2015
- * чтобы монтажная область визуально занимала переданные размеры.
2016
- * Если размеры не переданы, то используются дефолтные размеры монтажной области переданные в options.
2017
- * @param {number} [targetWidth] — желаемая видимая ширина (px)
2018
- * @param {number} [targetHeight] желаемая видимая высота (px)
2043
+ * Метод рассчитывает и применяет зум по умолчанию для монтажной области редактора.
2044
+ * Зум рассчитывается исходя из размеров контейнера редактора и текущих размеров монтажной области.
2045
+ * Расчёт происходит таким образом, чтобы монтажная область визуально целиком помещалась в контейнер редактора.
2046
+ * Если scale не передан, то используется значение из options.defaultScale.
2047
+ * @param {Number} [scale] - Желаемый масштаб относительно размеров контейнера редактора.
2019
2048
  */
2020
2049
  calculateAndApplyDefaultZoom() {
2021
- var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.options.montageAreaWidth, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.options.montageAreaHeight, {
2022
- width: a,
2023
- height: r
2024
- } = this.editor.montageArea, i = e / a, n = t / r, s = Math.min(i, n), {
2025
- minZoom: c,
2026
- maxZoom: u,
2027
- maxZoomFactor: l
2050
+ var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.options.defaultScale, {
2051
+ canvas: t
2052
+ } = this.editor, a = t.editorContainer, r = a.clientWidth, i = a.clientHeight, {
2053
+ width: n,
2054
+ height: s
2055
+ } = this.editor.montageArea, c = r / n * e, u = i / s * e, d = Math.min(c, u), {
2056
+ minZoom: l,
2057
+ maxZoom: h,
2058
+ maxZoomFactor: g
2028
2059
  } = this.options;
2029
- this.minZoom = Math.min(s / l, c), this.maxZoom = Math.max(s * l, u), this.defaultZoom = s, this.setZoom(s);
2060
+ this.minZoom = Math.min(d / g, l), this.maxZoom = Math.max(d * g, h), this.defaultZoom = d, this.setZoom(d);
2030
2061
  }
2031
2062
  /**
2032
2063
  * Увеличение/уменьшение масштаба
@@ -2038,7 +2069,7 @@ class yt {
2038
2069
  * Если передавать координаты курсора, то нужно быть аккуратнее, так как юзер может выйти за пределы рабочей области
2039
2070
  */
2040
2071
  zoom() {
2041
- var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Mt, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
2072
+ var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : vt, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
2042
2073
  if (e) {
2043
2074
  var {
2044
2075
  canvas: a,
@@ -2110,7 +2141,7 @@ class yt {
2110
2141
  * @fires editor:object-rotated
2111
2142
  */
2112
2143
  rotate() {
2113
- var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ft, {
2144
+ var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : mt, {
2114
2145
  withoutSave: t
2115
2146
  } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, {
2116
2147
  canvas: a,
@@ -2172,7 +2203,7 @@ class yt {
2172
2203
  }) : n.set("opacity", t), r.renderAll(), a || i.saveState(), r.fire("editor:object-opacity-changed", t));
2173
2204
  }
2174
2205
  /**
2175
- * Масштабирование изображения
2206
+ * Масштабирование объекта
2176
2207
  * @param {Object} options
2177
2208
  * @param {fabric.Object} [options.object] - Объект с изображением, которое нужно масштабировать
2178
2209
  * @param {String} [options.type] - Тип масштабирования
@@ -2203,19 +2234,22 @@ class yt {
2203
2234
  });
2204
2235
  h.scale(g), i.centerObject(h);
2205
2236
  });
2206
- var l = new _(u, {
2237
+ var d = new W(u, {
2207
2238
  canvas: i
2208
2239
  });
2209
- i.setActiveObject(l);
2240
+ i.setActiveObject(d);
2210
2241
  } else {
2211
- var d = n.calculateScaleFactor({
2242
+ var l = n.calculateScaleFactor({
2212
2243
  imageObject: c,
2213
2244
  scaleType: t
2214
2245
  });
2215
- c.scale(d), i.centerObject(c);
2246
+ c.scale(l), i.centerObject(c);
2216
2247
  }
2217
- i.renderAll(), a || s.saveState(), i.fire("editor:image-fitted", {
2218
- type: t
2248
+ i.renderAll(), a || s.saveState(), i.fire("editor:object-fitted", {
2249
+ object: c,
2250
+ type: t,
2251
+ withoutSave: a,
2252
+ fitAsOneObject: r
2219
2253
  });
2220
2254
  }
2221
2255
  }
@@ -2230,7 +2264,9 @@ class yt {
2230
2264
  /**
2231
2265
  * Сброс масштаба объекта до дефолтного
2232
2266
  * @param {fabric.Object} object
2233
- * @param {Boolean} [fitOnlyBigImage] - растягивать только большие изображения
2267
+ * @param {Object} options
2268
+ * @param {Boolean} [options.withoutSave] - Не сохранять состояние
2269
+ * @param {Boolean} [options.alwaysFitObject] - вписывать объект в рабочую область даже если он меньше рабочей области
2234
2270
  * @returns
2235
2271
  * @fires editor:object-reset
2236
2272
  */
@@ -2248,31 +2284,35 @@ class yt {
2248
2284
  }
2249
2285
  } = this.editor, u = e || r.getActiveObject();
2250
2286
  if (!(!u || u.locked)) {
2251
- if (s.suspendHistory(), u.type !== "image" && u.format !== "svg" && (u.set({
2287
+ s.suspendHistory();
2288
+ var d = u.type === "image" || u.format === "svg";
2289
+ if (d || u.set({
2252
2290
  scaleX: 1,
2253
2291
  scaleY: 1,
2254
2292
  flipX: !1,
2255
2293
  flipY: !1,
2256
2294
  angle: 0
2257
- }), r.centerObject(u), r.renderAll()), t)
2295
+ }), t)
2258
2296
  this.fitObject({
2259
2297
  object: u,
2260
- withoutSave: !0
2298
+ withoutSave: !0,
2299
+ fitAsOneObject: !0
2261
2300
  });
2262
2301
  else {
2263
2302
  var {
2264
2303
  width: l,
2265
- height: d
2304
+ height: h
2266
2305
  } = i, {
2267
- width: h,
2268
- height: g
2306
+ width: g,
2307
+ height: M
2269
2308
  } = u, m = n.calculateScaleFactor({
2270
2309
  imageObject: u,
2271
2310
  scaleType: c
2272
- });
2273
- c === "contain" && m < 1 || c === "cover" && (h > l || g > d) ? this.fitObject({
2311
+ }), f = c === "contain" && m < 1 || c === "cover" && (g > l || M > h);
2312
+ f ? this.fitObject({
2274
2313
  object: u,
2275
- withoutSave: !0
2314
+ withoutSave: !0,
2315
+ fitAsOneObject: !0
2276
2316
  }) : u.set({
2277
2317
  scaleX: 1,
2278
2318
  scaleY: 1
@@ -2286,7 +2326,7 @@ class yt {
2286
2326
  }
2287
2327
  }
2288
2328
  }
2289
- class pt {
2329
+ class jt {
2290
2330
  /**
2291
2331
  * @param {object} options
2292
2332
  * @param {ImageEditor} options.editor – экземпляр редактора
@@ -2386,7 +2426,7 @@ class pt {
2386
2426
  }
2387
2427
  }
2388
2428
  }
2389
- class J {
2429
+ class K {
2390
2430
  /**
2391
2431
  * @param {object} options
2392
2432
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2433,7 +2473,7 @@ class J {
2433
2473
  } = this.editor;
2434
2474
  r.suspendHistory();
2435
2475
  var i = e || a.getActiveObject();
2436
- i && (i.type === "activeselection" ? J._moveSelectionForward(a, i) : a.bringObjectForward(i), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:object-bring-forward"));
2476
+ i && (i.type === "activeselection" ? K._moveSelectionForward(a, i) : a.bringObjectForward(i), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:object-bring-forward"));
2437
2477
  }
2438
2478
  /**
2439
2479
  * Отправить объект на задний план по оси Z
@@ -2483,7 +2523,7 @@ class J {
2483
2523
  } = this.editor;
2484
2524
  i.suspendHistory();
2485
2525
  var s = e || a.getActiveObject();
2486
- s && (s.type === "activeselection" ? J._moveSelectionBackwards(a, s) : a.sendObjectBackwards(s), a.sendObjectToBack(r), a.sendObjectToBack(n), a.renderAll(), i.resumeHistory(), t || i.saveState(), a.fire("editor:object-send-backwards"));
2526
+ s && (s.type === "activeselection" ? K._moveSelectionBackwards(a, s) : a.sendObjectBackwards(s), a.sendObjectToBack(r), a.sendObjectToBack(n), a.renderAll(), i.resumeHistory(), t || i.saveState(), a.fire("editor:object-send-backwards"));
2487
2527
  }
2488
2528
  /**
2489
2529
  * Сдвигает выделенные объекты на один уровень вверх относительно ближайшего верхнего объекта
@@ -2493,20 +2533,20 @@ class J {
2493
2533
  * @private
2494
2534
  */
2495
2535
  static _moveSelectionForward(e, t) {
2496
- for (var a = e.getObjects(), r = t.getObjects(), i = r.map((l) => a.indexOf(l)), n = -1, s = function(d) {
2497
- var h = a[d];
2498
- if (!r.includes(h) && i.some((g) => d > g))
2499
- return n = d, 1;
2536
+ for (var a = e.getObjects(), r = t.getObjects(), i = r.map((d) => a.indexOf(d)), n = -1, s = function(l) {
2537
+ var h = a[l];
2538
+ if (!r.includes(h) && i.some((g) => l > g))
2539
+ return n = l, 1;
2500
2540
  }, c = 0; c < a.length && !s(c); c += 1)
2501
2541
  ;
2502
2542
  if (n !== -1) {
2503
- var u = r.map((l) => ({
2504
- obj: l,
2505
- index: a.indexOf(l)
2506
- })).sort((l, d) => d.index - l.index);
2507
- u.forEach((l) => {
2508
- var d = a.indexOf(l.obj);
2509
- d < n && (e.moveObjectTo(l.obj, n), n = d);
2543
+ var u = r.map((d) => ({
2544
+ obj: d,
2545
+ index: a.indexOf(d)
2546
+ })).sort((d, l) => l.index - d.index);
2547
+ u.forEach((d) => {
2548
+ var l = a.indexOf(d.obj);
2549
+ l < n && (e.moveObjectTo(d.obj, n), n = l);
2510
2550
  });
2511
2551
  }
2512
2552
  }
@@ -2522,7 +2562,7 @@ class J {
2522
2562
  e.moveObjectTo(r[n], i - 1);
2523
2563
  }
2524
2564
  }
2525
- class bt {
2565
+ class yt {
2526
2566
  /**
2527
2567
  * Менеджер фигур для редактора.
2528
2568
  * @param {Object} options - Опции и настройки менеджера фигур.
@@ -2546,15 +2586,15 @@ class bt {
2546
2586
  * @param {Object} flags.withoutSelection - Не выделять объект
2547
2587
  * @param {Object} flags.withoutAdding - Не добавлять объект в canvas
2548
2588
  */
2549
- addRectangle(l = {}, { withoutSelection: c, withoutAdding: u } = {}) {
2550
- var d = l, {
2551
- id: e = `rect-${D()}`,
2589
+ addRectangle(d = {}, { withoutSelection: c, withoutAdding: u } = {}) {
2590
+ var l = d, {
2591
+ id: e = `rect-${S()}`,
2552
2592
  left: t,
2553
2593
  top: a,
2554
2594
  width: r = 100,
2555
2595
  height: i = 100,
2556
2596
  fill: n = "blue"
2557
- } = d, s = X(d, [
2597
+ } = l, s = Q(l, [
2558
2598
  "id",
2559
2599
  "left",
2560
2600
  "top",
@@ -2562,7 +2602,7 @@ class bt {
2562
2602
  "height",
2563
2603
  "fill"
2564
2604
  ]);
2565
- const { canvas: h } = this.editor, g = new Ze(A({
2605
+ const { canvas: h } = this.editor, g = new xe(C({
2566
2606
  id: e,
2567
2607
  left: t,
2568
2608
  top: a,
@@ -2589,27 +2629,27 @@ class bt {
2589
2629
  * @param {Object} flags.withoutAdding - Не добавлять объект в canvas
2590
2630
  */
2591
2631
  addCircle(u = {}, { withoutSelection: s, withoutAdding: c } = {}) {
2592
- var l = u, {
2593
- id: e = `circle-${D()}`,
2632
+ var d = u, {
2633
+ id: e = `circle-${S()}`,
2594
2634
  left: t,
2595
2635
  top: a,
2596
2636
  radius: r = 50,
2597
2637
  fill: i = "green"
2598
- } = l, n = X(l, [
2638
+ } = d, n = Q(d, [
2599
2639
  "id",
2600
2640
  "left",
2601
2641
  "top",
2602
2642
  "radius",
2603
2643
  "fill"
2604
2644
  ]);
2605
- const { canvas: d } = this.editor, h = new ze(A({
2645
+ const { canvas: l } = this.editor, h = new Be(C({
2606
2646
  id: e,
2607
2647
  left: t,
2608
2648
  top: a,
2609
2649
  fill: i,
2610
2650
  radius: r
2611
2651
  }, n));
2612
- return !t && !a && d.centerObject(h), c || (d.add(h), s || d.setActiveObject(h), d.renderAll()), h;
2652
+ return !t && !a && l.centerObject(h), c || (l.add(h), s || l.setActiveObject(h), l.renderAll()), h;
2613
2653
  }
2614
2654
  /**
2615
2655
  * Добавление треугольника
@@ -2628,15 +2668,15 @@ class bt {
2628
2668
  * @param {Object} flags.withoutSelection - Не выделять объект
2629
2669
  * @param {Object} flags.withoutAdding - Не добавлять объект в canvas
2630
2670
  */
2631
- addTriangle(l = {}, { withoutSelection: c, withoutAdding: u } = {}) {
2632
- var d = l, {
2633
- id: e = `triangle-${D()}`,
2671
+ addTriangle(d = {}, { withoutSelection: c, withoutAdding: u } = {}) {
2672
+ var l = d, {
2673
+ id: e = `triangle-${S()}`,
2634
2674
  left: t,
2635
2675
  top: a,
2636
2676
  width: r = 100,
2637
2677
  height: i = 100,
2638
2678
  fill: n = "yellow"
2639
- } = d, s = X(d, [
2679
+ } = l, s = Q(l, [
2640
2680
  "id",
2641
2681
  "left",
2642
2682
  "top",
@@ -2644,7 +2684,7 @@ class bt {
2644
2684
  "height",
2645
2685
  "fill"
2646
2686
  ]);
2647
- const { canvas: h } = this.editor, g = new Ue(A({
2687
+ const { canvas: h } = this.editor, g = new Ze(C({
2648
2688
  id: e,
2649
2689
  left: t,
2650
2690
  top: a,
@@ -2655,111 +2695,100 @@ class bt {
2655
2695
  return !t && !a && h.centerObject(g), u || (h.add(g), c || h.setActiveObject(g), h.renderAll()), g;
2656
2696
  }
2657
2697
  }
2658
- function Ae(o, e, t, a, r, i, n) {
2659
- try {
2660
- var s = o[i](n), c = s.value;
2661
- } catch (u) {
2662
- return void t(u);
2663
- }
2664
- s.done ? e(c) : Promise.resolve(c).then(a, r);
2665
- }
2666
- function Ce(o) {
2667
- return function() {
2668
- var e = this, t = arguments;
2669
- return new Promise(function(a, r) {
2670
- var i = o.apply(e, t);
2671
- function n(c) {
2672
- Ae(i, a, r, n, s, "next", c);
2673
- }
2674
- function s(c) {
2675
- Ae(i, a, r, n, s, "throw", c);
2676
- }
2677
- n(void 0);
2678
- });
2679
- };
2680
- }
2681
- class It {
2698
+ class pt {
2682
2699
  /**
2683
2700
  * @param {object} options
2684
2701
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
2685
2702
  */
2686
- constructor(e) {
2687
- var {
2688
- editor: t
2689
- } = e;
2690
- this.editor = t, this.clipboard = null;
2703
+ constructor({ editor: e }) {
2704
+ this.editor = e, this.clipboard = null;
2691
2705
  }
2692
2706
  /**
2693
2707
  * Копирование объекта
2694
2708
  * @fires editor:object-copied
2695
2709
  */
2696
2710
  copy() {
2697
- var e = this;
2698
- return Ce(function* () {
2699
- var {
2700
- canvas: t
2701
- } = e.editor, a = t.getActiveObject();
2702
- if (a)
2711
+ return H(this, null, function* () {
2712
+ const { canvas: e } = this.editor, t = e.getActiveObject();
2713
+ if (t)
2703
2714
  try {
2704
- var r = yield a.clone(["format"]);
2705
- if (e.clipboard = r, typeof ClipboardItem == "undefined" || !navigator.clipboard) {
2715
+ const a = yield t.clone(["format"]);
2716
+ if (this.clipboard = a, typeof ClipboardItem == "undefined" || !navigator.clipboard) {
2706
2717
  console.warn(
2707
2718
  // eslint-disable-next-line max-len
2708
2719
  "ClipboardManager. navigator.clipboard не поддерживается в этом браузере или отсутствует соединение по HTTPS-протоколу."
2709
- ), t.fire("editor:object-copied", {
2710
- object: r
2711
- });
2720
+ ), e.fire("editor:object-copied", { object: a });
2712
2721
  return;
2713
2722
  }
2714
- if (e.clipboard.type !== "image") {
2715
- yield navigator.clipboard.writeText(["application/image-editor", JSON.stringify(r)]), t.fire("editor:object-copied", {
2716
- object: r
2717
- });
2723
+ if (this.clipboard.type !== "image") {
2724
+ yield navigator.clipboard.writeText(`application/image-editor:${JSON.stringify(a)}`), e.fire("editor:object-copied", { object: a });
2718
2725
  return;
2719
2726
  }
2720
- var i = r.toCanvasElement(), n = yield new Promise((u) => {
2721
- i.toBlob(u);
2722
- }), s = new ClipboardItem({
2723
- [n.type]: n
2724
- });
2725
- yield navigator.clipboard.write([s]), t.fire("editor:object-copied", {
2726
- object: r
2727
+ const r = a.toCanvasElement(), i = yield new Promise((s) => {
2728
+ r.toBlob(s);
2727
2729
  });
2728
- } catch (u) {
2729
- var c = "ClipboardManager. Ошибка записи в системный буфер обмена:";
2730
- console.error(c, u), t.fire("editor:error", {
2731
- message: "".concat(c, " ").concat(u.message)
2730
+ if (!i) return;
2731
+ const n = new ClipboardItem({ [i.type]: i });
2732
+ yield navigator.clipboard.write([n]), e.fire("editor:object-copied", { object: a });
2733
+ } catch (a) {
2734
+ if (!(a instanceof Error)) return;
2735
+ const r = "ClipboardManager. Ошибка записи в системный буфер обмена:";
2736
+ console.error(r, a), e.fire("editor:error", {
2737
+ message: `${r} ${a.message}`
2732
2738
  });
2733
2739
  }
2734
- })();
2740
+ });
2741
+ }
2742
+ /**
2743
+ * Обработчик вставки объекта или изображения из буфера обмена.
2744
+ * @param {Object} event — объект события
2745
+ * @param {Object} event.clipboardData — данные из буфера обмена
2746
+ * @param {Array} event.clipboardData.items — элементы буфера обмена
2747
+ */
2748
+ handlePasteEvent({ clipboardData: e }) {
2749
+ var n;
2750
+ if (!((n = e == null ? void 0 : e.items) != null && n.length)) return;
2751
+ const { imageManager: t } = this.editor, { items: a } = e, r = a[a.length - 1];
2752
+ if (console.log("handlePasteEvent clipboardData", e), console.log("handlePasteEvent lastItem", r), r.type !== "text/html") {
2753
+ const s = r.getAsFile();
2754
+ if (!s) return;
2755
+ const c = new FileReader();
2756
+ c.onload = (u) => {
2757
+ u.target && this.editor.imageManager.importImage({ source: u.target.result });
2758
+ }, c.readAsDataURL(s);
2759
+ return;
2760
+ }
2761
+ const i = e.getData("text/html");
2762
+ if (i) {
2763
+ const u = new DOMParser().parseFromString(i, "text/html").querySelector("img");
2764
+ if (u != null && u.src) {
2765
+ t.importImage({ source: u.src });
2766
+ return;
2767
+ }
2768
+ }
2769
+ this.paste();
2735
2770
  }
2736
2771
  /**
2737
2772
  * Вставка объекта
2738
2773
  * @fires editor:object-pasted
2739
2774
  */
2740
2775
  paste() {
2741
- var e = this;
2742
- return Ce(function* () {
2743
- var {
2744
- canvas: t
2745
- } = e.editor;
2746
- if (e.clipboard) {
2747
- var a = yield e.clipboard.clone(["format"]);
2748
- t.discardActiveObject(), a.set({
2749
- id: "".concat(a.type, "-").concat(D()),
2750
- left: a.left + 10,
2751
- top: a.top + 10,
2752
- evented: !0
2753
- }), a instanceof _ ? (a.canvas = t, a.forEachObject((r) => {
2754
- t.add(r);
2755
- })) : t.add(a), t.setActiveObject(a), t.requestRenderAll(), t.fire("editor:object-pasted", {
2756
- object: a
2757
- });
2758
- }
2759
- })();
2776
+ return H(this, null, function* () {
2777
+ const { canvas: e } = this.editor;
2778
+ if (!this.clipboard) return;
2779
+ const t = yield this.clipboard.clone(["format"]);
2780
+ e.discardActiveObject(), t.set({
2781
+ id: `${t.type}-${S()}`,
2782
+ left: t.left + 10,
2783
+ top: t.top + 10,
2784
+ evented: !0
2785
+ }), t instanceof W ? (t.canvas = e, t.forEachObject((a) => {
2786
+ e.add(a);
2787
+ })) : e.add(t), e.setActiveObject(t), e.requestRenderAll(), e.fire("editor:object-pasted", { object: t });
2788
+ });
2760
2789
  }
2761
2790
  }
2762
- class St {
2791
+ class bt {
2763
2792
  /**
2764
2793
  * @param {object} options
2765
2794
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2842,7 +2871,7 @@ class St {
2842
2871
  }
2843
2872
  }
2844
2873
  }
2845
- class At {
2874
+ class It {
2846
2875
  /**
2847
2876
  * @param {object} options
2848
2877
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2871,8 +2900,12 @@ class At {
2871
2900
  r.suspendHistory();
2872
2901
  var i = e || a.getActiveObject();
2873
2902
  if (i && i.type === "activeselection") {
2874
- var n = i.getObjects(), s = new Ye(n);
2875
- n.forEach((c) => a.remove(c)), s.set("id", "".concat(s.type, "-").concat(D())), a.add(s), a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-grouped");
2903
+ var n = i.getObjects(), s = new ze(n);
2904
+ n.forEach((c) => a.remove(c)), s.set("id", "".concat(s.type, "-").concat(S())), a.add(s), a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-grouped", {
2905
+ object: i,
2906
+ group: s,
2907
+ withoutSave: t
2908
+ });
2876
2909
  }
2877
2910
  }
2878
2911
  /**
@@ -2895,14 +2928,18 @@ class At {
2895
2928
  if (!(!i || i.type !== "group")) {
2896
2929
  var n = i.removeAll();
2897
2930
  a.remove(i), n.forEach((c) => a.add(c));
2898
- var s = new _(n, {
2931
+ var s = new W(n, {
2899
2932
  canvas: a
2900
2933
  });
2901
- a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-ungrouped");
2934
+ a.setActiveObject(s), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-ungrouped", {
2935
+ object: i,
2936
+ selection: s,
2937
+ withoutSave: t
2938
+ });
2902
2939
  }
2903
2940
  }
2904
2941
  }
2905
- class Ct {
2942
+ class St {
2906
2943
  /**
2907
2944
  * @param {object} options
2908
2945
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2924,7 +2961,7 @@ class Ct {
2924
2961
  objectLockManager: a
2925
2962
  } = this.editor;
2926
2963
  e.discardActiveObject();
2927
- var r = t.getObjects(), i = r.some((s) => s.locked), n = r.length > 1 ? new _(t.getObjects(), {
2964
+ var r = t.getObjects(), i = r.some((s) => s.locked), n = r.length > 1 ? new W(t.getObjects(), {
2928
2965
  canvas: e
2929
2966
  }) : r[0];
2930
2967
  i && a.lockObject({
@@ -2936,7 +2973,7 @@ class Ct {
2936
2973
  });
2937
2974
  }
2938
2975
  }
2939
- class Dt {
2976
+ class At {
2940
2977
  /**
2941
2978
  * @param {object} options
2942
2979
  * @param {ImageEditor} options.editor - экземпляр редактора с доступом к canvas
@@ -2969,10 +3006,13 @@ class Dt {
2969
3006
  return;
2970
3007
  }
2971
3008
  a.remove(s);
2972
- }), a.discardActiveObject(), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-deleted"));
3009
+ }), a.discardActiveObject(), a.renderAll(), r.resumeHistory(), t || r.saveState(), a.fire("editor:objects-deleted", {
3010
+ objects: n,
3011
+ withoutSave: t
3012
+ }));
2973
3013
  }
2974
3014
  }
2975
- var Nt = {
3015
+ var Ct = {
2976
3016
  IMAGE_MANAGER: {
2977
3017
  /**
2978
3018
  * Некорректный Content-Type изображения
@@ -3000,7 +3040,7 @@ var Nt = {
3000
3040
  IMAGE_EXPORT_FAILED: "IMAGE_EXPORT_FAILED"
3001
3041
  }
3002
3042
  };
3003
- class K {
3043
+ class $ {
3004
3044
  constructor({ editor: e }) {
3005
3045
  this._buffer = [], this.editor = e;
3006
3046
  }
@@ -3021,7 +3061,7 @@ class K {
3021
3061
  * @fires editor:error
3022
3062
  */
3023
3063
  emitError({ origin: e = "ImageEditor", method: t = "Unknown Method", code: a, data: r, message: i }) {
3024
- if (!K.isValidErrorCode(a)) {
3064
+ if (!$.isValidErrorCode(a)) {
3025
3065
  console.warn("Неизвестный код ошибки: ", { code: a, origin: e, method: t });
3026
3066
  return;
3027
3067
  }
@@ -3035,7 +3075,7 @@ class K {
3035
3075
  message: n,
3036
3076
  data: r
3037
3077
  };
3038
- this._buffer.push(A({
3078
+ this._buffer.push(C({
3039
3079
  type: "editor:error"
3040
3080
  }, s)), this.editor.canvas.fire("editor:error", s);
3041
3081
  }
@@ -3050,7 +3090,7 @@ class K {
3050
3090
  * @fires editor:warning
3051
3091
  */
3052
3092
  emitWarning({ origin: e = "ImageEditor", method: t = "Unknown Method", code: a, message: r, data: i }) {
3053
- if (!K.isValidErrorCode(a)) {
3093
+ if (!$.isValidErrorCode(a)) {
3054
3094
  console.warn("Неизвестный код предупреждения: ", { code: a, origin: e, method: t });
3055
3095
  return;
3056
3096
  }
@@ -3063,12 +3103,12 @@ class K {
3063
3103
  message: n,
3064
3104
  data: i
3065
3105
  };
3066
- this._buffer.push(A({
3106
+ this._buffer.push(C({
3067
3107
  type: "editor:warning"
3068
3108
  }, s)), this.editor.canvas.fire("editor:warning", s);
3069
3109
  }
3070
3110
  static isValidErrorCode(e) {
3071
- return e ? Object.values(Nt).some((t) => Object.values(t).includes(e)) : !1;
3111
+ return e ? Object.values(Ct).some((t) => Object.values(t).includes(e)) : !1;
3072
3112
  }
3073
3113
  }
3074
3114
  class ue {
@@ -3080,10 +3120,10 @@ class ue {
3080
3120
  constructor(e, t) {
3081
3121
  this.options = t;
3082
3122
  const { defaultScale: a, minZoom: r, maxZoom: i } = t;
3083
- this.containerId = e, this.editorId = `${e}-${D()}`, this.clipboard = null, this.defaultZoom = a, this.minZoom = r || vt, this.maxZoom = i || mt, this.init();
3123
+ this.containerId = e, this.editorId = `${e}-${S()}`, this.clipboard = null, this.defaultZoom = a, this.minZoom = r || ht, this.maxZoom = i || gt, this.init();
3084
3124
  }
3085
3125
  init() {
3086
- return $(this, null, function* () {
3126
+ return H(this, null, function* () {
3087
3127
  const {
3088
3128
  editorContainerWidth: e,
3089
3129
  editorContainerHeight: t,
@@ -3094,18 +3134,18 @@ class ue {
3094
3134
  initialImage: s,
3095
3135
  initialStateJSON: c,
3096
3136
  scaleType: u,
3097
- _onReadyCallback: l
3137
+ _onReadyCallback: d
3098
3138
  } = this.options;
3099
- if (qe.apply(), this.canvas = new He(this.containerId, this.options), this.moduleLoader = new We(), this.workerManager = new Fe(), this.errorManager = new K({ editor: this }), this.historyManager = new gt({ editor: this }), this.toolbar = new ht({ editor: this }), this.transformManager = new yt({ editor: this }), this.canvasManager = new jt({ editor: this }), this.imageManager = new C({ editor: this }), this.layerManager = new J({ editor: this }), this.shapeManager = new bt({ editor: this }), this.interactionBlocker = new pt({ editor: this }), this.clipboardManager = new It({ editor: this }), this.objectLockManager = new St({ editor: this }), this.groupingManager = new At({ editor: this }), this.selectionManager = new Ct({ editor: this }), this.deletionManager = new Dt({ editor: this }), this._createMontageArea(), this._createClippingArea(), this.listeners = new P({ editor: this, options: this.options }), this.canvasManager.setEditorContainerWidth(e), this.canvasManager.setEditorContainerHeight(t), this.canvasManager.setCanvasWrapperWidth(a), this.canvasManager.setCanvasWrapperHeight(r), this.canvasManager.setCanvasCSSWidth(i), this.canvasManager.setCanvasCSSHeight(n), s != null && s.source) {
3139
+ if (Ke.apply(), this.canvas = new Ue(this.containerId, this.options), this.moduleLoader = new Re(), this.workerManager = new We(), this.errorManager = new $({ editor: this }), this.historyManager = new lt({ editor: this }), this.toolbar = new dt({ editor: this }), this.transformManager = new ft({ editor: this }), this.canvasManager = new Mt({ editor: this }), this.imageManager = new w({ editor: this }), this.layerManager = new K({ editor: this }), this.shapeManager = new yt({ editor: this }), this.interactionBlocker = new jt({ editor: this }), this.clipboardManager = new pt({ editor: this }), this.objectLockManager = new bt({ editor: this }), this.groupingManager = new It({ editor: this }), this.selectionManager = new St({ editor: this }), this.deletionManager = new At({ editor: this }), this._createMontageArea(), this._createClippingArea(), this.listeners = new R({ editor: this, options: this.options }), this.canvasManager.setEditorContainerWidth(e), this.canvasManager.setEditorContainerHeight(t), this.canvasManager.setCanvasWrapperWidth(a), this.canvasManager.setCanvasWrapperHeight(r), this.canvasManager.setCanvasCSSWidth(i), this.canvasManager.setCanvasCSSHeight(n), s != null && s.source) {
3100
3140
  const {
3101
- source: d,
3141
+ source: l,
3102
3142
  scale: h = `image-${u}`,
3103
3143
  withoutSave: g = !0
3104
3144
  } = s;
3105
- yield this.imageManager.importImage({ source: d, scale: h, withoutSave: g });
3145
+ yield this.imageManager.importImage({ source: l, scale: h, withoutSave: g });
3106
3146
  } else
3107
3147
  this.canvasManager.setDefaultScale({ withoutSave: !0 });
3108
- c && this.historyManager.loadStateFromFullState(c), this.historyManager.saveState(), console.log("editor:ready"), this.canvas.fire("editor:ready", this), typeof l == "function" && l(this);
3148
+ c && this.historyManager.loadStateFromFullState(c), this.historyManager.saveState(), console.log("editor:ready"), this.canvas.fire("editor:ready", this), typeof d == "function" && d(this);
3109
3149
  });
3110
3150
  }
3111
3151
  _createMontageArea() {
@@ -3160,7 +3200,7 @@ class ue {
3160
3200
  const e = document.createElement("canvas");
3161
3201
  e.width = 20, e.height = 20;
3162
3202
  const t = e.getContext("2d");
3163
- return t.fillStyle = "#ddd", t.fillRect(0, 0, 40, 40), t.fillStyle = "#ccc", t.fillRect(0, 0, 10, 10), t.fillRect(10, 10, 10, 10), new Pe({
3203
+ return t.fillStyle = "#ddd", t.fillRect(0, 0, 40, 40), t.fillStyle = "#ccc", t.fillRect(0, 0, 10, 10), t.fillRect(10, 10, 10, 10), new Ye({
3164
3204
  source: e,
3165
3205
  repeat: "repeat"
3166
3206
  });
@@ -3172,7 +3212,6 @@ const wt = {
3172
3212
  */
3173
3213
  preserveObjectStacking: !0,
3174
3214
  controlsAboveOverlay: !0,
3175
- centeredScaling: !0,
3176
3215
  centeredRotation: !0,
3177
3216
  /*
3178
3217
  * Кастомные опции
@@ -3235,7 +3274,7 @@ const wt = {
3235
3274
  },
3236
3275
  initialStateJSON: null,
3237
3276
  initialImage: null,
3238
- defaultScale: 1,
3277
+ defaultScale: 0.5,
3239
3278
  minZoom: 0.1,
3240
3279
  maxZoom: 2,
3241
3280
  maxZoomFactor: 2,
@@ -3244,7 +3283,7 @@ const wt = {
3244
3283
  /*
3245
3284
  * Настройки слушателей событий
3246
3285
  */
3247
- adaptCanvasToContainer: !0,
3286
+ adaptCanvasToContainerOnResize: !0,
3248
3287
  bringToFrontOnSelection: !1,
3249
3288
  mouseWheelZooming: !0,
3250
3289
  canvasDragging: !0,
@@ -3255,8 +3294,8 @@ const wt = {
3255
3294
  deleteObjectsByHotkey: !0,
3256
3295
  resetObjectFitByDoubleClick: !0
3257
3296
  };
3258
- function Ot(o, e = {}) {
3259
- const t = A(A({}, wt), e), a = document.getElementById(o);
3297
+ function Et(o, e = {}) {
3298
+ const t = C(C({}, wt), e), a = document.getElementById(o);
3260
3299
  if (!a)
3261
3300
  return Promise.reject(new Error(`Контейнер с ID "${o}" не найден.`));
3262
3301
  const r = document.createElement("canvas");
@@ -3267,6 +3306,6 @@ function Ot(o, e = {}) {
3267
3306
  });
3268
3307
  }
3269
3308
  export {
3270
- Ot as default
3309
+ Et as default
3271
3310
  };
3272
3311
  //# sourceMappingURL=main.js.map