microboard-ui-temp 0.3.5 → 0.3.6

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.
@@ -228592,43 +228592,25 @@ var __getProtoOf2 = Object.getPrototypeOf;
228592
228592
  var __defProp2 = Object.defineProperty;
228593
228593
  var __getOwnPropNames2 = Object.getOwnPropertyNames;
228594
228594
  var __hasOwnProp2 = Object.prototype.hasOwnProperty;
228595
- function __accessProp(key) {
228596
- return this[key];
228597
- }
228598
- var __toESMCache_node;
228599
- var __toESMCache_esm;
228600
228595
  var __toESM2 = (mod2, isNodeMode, target) => {
228601
- var canCache = mod2 != null && typeof mod2 === "object";
228602
- if (canCache) {
228603
- var cache2 = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
228604
- var cached = cache2.get(mod2);
228605
- if (cached)
228606
- return cached;
228607
- }
228608
228596
  target = mod2 != null ? __create2(__getProtoOf2(mod2)) : {};
228609
228597
  const to = isNodeMode || !mod2 || !mod2.__esModule ? __defProp2(target, "default", { value: mod2, enumerable: true }) : target;
228610
228598
  for (let key of __getOwnPropNames2(mod2))
228611
228599
  if (!__hasOwnProp2.call(to, key))
228612
228600
  __defProp2(to, key, {
228613
- get: __accessProp.bind(mod2, key),
228601
+ get: () => mod2[key],
228614
228602
  enumerable: true
228615
228603
  });
228616
- if (canCache)
228617
- cache2.set(mod2, to);
228618
228604
  return to;
228619
228605
  };
228620
228606
  var __commonJS2 = (cb, mod2) => () => (mod2 || cb((mod2 = { exports: {} }).exports, mod2), mod2.exports);
228621
- var __returnValue = (v) => v;
228622
- function __exportSetter(name, newValue) {
228623
- this[name] = __returnValue.bind(null, newValue);
228624
- }
228625
228607
  var __export2 = (target, all) => {
228626
228608
  for (var name in all)
228627
228609
  __defProp2(target, name, {
228628
228610
  get: all[name],
228629
228611
  enumerable: true,
228630
228612
  configurable: true,
228631
- set: __exportSetter.bind(all, name)
228613
+ set: (newValue) => all[name] = () => newValue
228632
228614
  });
228633
228615
  };
228634
228616
  var __require2 = /* @__PURE__ */ ((x) => __require)(function(x) {
@@ -228641,13 +228623,13 @@ var require_extend = __commonJS2((exports2, module2) => {
228641
228623
  var toStr2 = Object.prototype.toString;
228642
228624
  var defineProperty = Object.defineProperty;
228643
228625
  var gOPD = Object.getOwnPropertyDescriptor;
228644
- var isArray = function isArray2(arr2) {
228626
+ var isArray = function isArray(arr2) {
228645
228627
  if (typeof Array.isArray === "function") {
228646
228628
  return Array.isArray(arr2);
228647
228629
  }
228648
228630
  return toStr2.call(arr2) === "[object Array]";
228649
228631
  };
228650
- var isPlainObject22 = function isPlainObject3(obj) {
228632
+ var isPlainObject22 = function isPlainObject(obj) {
228651
228633
  if (!obj || toStr2.call(obj) !== "[object Object]") {
228652
228634
  return false;
228653
228635
  }
@@ -228660,7 +228642,7 @@ var require_extend = __commonJS2((exports2, module2) => {
228660
228642
  for (key in obj) {}
228661
228643
  return typeof key === "undefined" || hasOwn.call(obj, key);
228662
228644
  };
228663
- var setProperty = function setProperty2(target, options2) {
228645
+ var setProperty = function setProperty(target, options2) {
228664
228646
  if (defineProperty && options2.name === "__proto__") {
228665
228647
  defineProperty(target, options2.name, {
228666
228648
  enumerable: true,
@@ -228672,7 +228654,7 @@ var require_extend = __commonJS2((exports2, module2) => {
228672
228654
  target[options2.name] = options2.newValue;
228673
228655
  }
228674
228656
  };
228675
- var getProperty = function getProperty2(obj, name) {
228657
+ var getProperty = function getProperty(obj, name) {
228676
228658
  if (name === "__proto__") {
228677
228659
  if (!hasOwn.call(obj, name)) {
228678
228660
  return;
@@ -229366,7 +229348,7 @@ function safeRequestAnimationFrame(callback) {
229366
229348
  if (typeof requestAnimationFrame === "function") {
229367
229349
  return requestAnimationFrame(callback);
229368
229350
  } else {
229369
- callback();
229351
+ setTimeout(callback, 0);
229370
229352
  }
229371
229353
  }
229372
229354
  function isFiniteNumber(value) {
@@ -229741,205 +229723,6 @@ class Mbr {
229741
229723
  }
229742
229724
  }
229743
229725
  }
229744
- function updateRects(board, ref, mbr, verticalOffset, horizontalOffset, fit = "contextPanel") {
229745
- const { selection, camera } = board;
229746
- const panel = ref.current;
229747
- const selectionMbr = mbr ?? selection.getMbr();
229748
- const selectionItems = selection.items;
229749
- const richTextSelection = selectionItems.getSingle() instanceof RichText ? selectionItems.list()[0] : undefined;
229750
- if (panel && selectionMbr) {
229751
- if (fit === "contextPanel") {
229752
- const panelRect = getContextPanelRect(selectionMbr, camera, panel, !!richTextSelection, horizontalOffset, verticalOffset);
229753
- return panelRect;
229754
- }
229755
- if (fit === "linkToBtn") {
229756
- if (!mbr) {
229757
- return null;
229758
- }
229759
- const panelRect = fitLinkToBtn(selectionMbr.getTransformed(camera.getMatrix()), camera.window.getMbr(), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
229760
- return panelRect;
229761
- }
229762
- if (fit === "comment") {
229763
- if (!mbr) {
229764
- return null;
229765
- }
229766
- const panelRect = fitComment(selectionMbr.getTransformed(camera.getMatrix()), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
229767
- return panelRect;
229768
- }
229769
- if (fit === "threadPanel") {
229770
- if (!mbr) {
229771
- return null;
229772
- }
229773
- const panelRect = fitThreadPanel(selectionMbr.getTransformed(camera.getMatrix()), camera.window.getMbr(), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
229774
- return panelRect;
229775
- }
229776
- if (fit === "boardMenu") {
229777
- if (!mbr) {
229778
- return null;
229779
- }
229780
- const panelRect = fitBoardMenu(selectionMbr.getTransformed(camera.getMatrix()), camera.window.getMbr(), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
229781
- return panelRect;
229782
- }
229783
- if (fit === "hyperLink") {
229784
- if (!mbr) {
229785
- return null;
229786
- }
229787
- const panelRect = fitHyperLink(selectionMbr.getTransformed(camera.getMatrix()), Mbr.fromDomRect(panel.getBoundingClientRect()), camera.window.getMbr(), verticalOffset);
229788
- return panelRect;
229789
- }
229790
- }
229791
- return null;
229792
- }
229793
- function getContextPanelRect(selectionMbr, camera, panel, toLeft, horizontalOffset, verticalOffset) {
229794
- const transformedMbr = selectionMbr.getTransformed(camera.getMatrix());
229795
- const windowMbr = camera.window.getMbr();
229796
- const panelRectFromDom = Mbr.fromDomRect(panel.getBoundingClientRect());
229797
- const panelRect = toLeft ? fitContextPanelToLeft(transformedMbr, windowMbr, panelRectFromDom, verticalOffset, horizontalOffset) : fitContextPanelToCenter(transformedMbr, windowMbr, panelRectFromDom, verticalOffset, horizontalOffset);
229798
- return panelRect;
229799
- }
229800
- function fitContextPanelToLeft(selectionMbr, view, panel, verticalOffset = 40, horizontalOffset = 80) {
229801
- const panelHeight = panel.getHeight();
229802
- const panelWidth = panel.getWidth();
229803
- const newPanel = new Mbr;
229804
- const topSpace = selectionMbr.top - view.top;
229805
- const hasEnoughTopSpace = topSpace >= panelHeight + verticalOffset;
229806
- if (hasEnoughTopSpace) {
229807
- newPanel.top = selectionMbr.top - panelHeight - verticalOffset;
229808
- if (newPanel.top < view.top) {
229809
- newPanel.top = view.top + verticalOffset;
229810
- }
229811
- } else {
229812
- const usePanelTop = panel.top > 1 && panel.top > selectionMbr.top + verticalOffset;
229813
- newPanel.top = usePanelTop ? panel.top : selectionMbr.bottom + verticalOffset;
229814
- const isOverflowingBottom = newPanel.top + panelHeight > view.bottom;
229815
- const isLargeOffsetForRichText = newPanel.top >= selectionMbr.bottom + verticalOffset * 2;
229816
- if (isOverflowingBottom || isLargeOffsetForRichText) {
229817
- newPanel.top = selectionMbr.bottom - (panelHeight + verticalOffset);
229818
- }
229819
- }
229820
- newPanel.bottom = newPanel.top + panelHeight;
229821
- fitContextPanelInViewRect(newPanel, view, verticalOffset);
229822
- const itemMbr = selectionMbr.getMbr();
229823
- newPanel.left = itemMbr.left;
229824
- adjustPanelHorizontal(newPanel, panelWidth, view, horizontalOffset);
229825
- return newPanel;
229826
- }
229827
- function fitContextPanelToCenter(selectionMbr, view, panel, verticalOffset = 40, horizontalOffset = 80) {
229828
- const panelHeight = panel.getHeight();
229829
- const panelWidth = panel.getWidth();
229830
- const newPanel = new Mbr;
229831
- const topSpace = selectionMbr.top - view.top;
229832
- const bottomSpace = view.bottom - selectionMbr.bottom;
229833
- const shouldPlaceAbove = topSpace > bottomSpace - panelHeight;
229834
- if (shouldPlaceAbove) {
229835
- newPanel.top = selectionMbr.top - panelHeight - verticalOffset;
229836
- if (newPanel.top < view.top) {
229837
- newPanel.top = view.top + verticalOffset;
229838
- }
229839
- } else {
229840
- newPanel.top = selectionMbr.bottom + verticalOffset;
229841
- const isOverflowingBottom = newPanel.top + panelHeight > view.bottom;
229842
- const isLargeOffsetForRichText = newPanel.top >= selectionMbr.bottom + verticalOffset * 2;
229843
- if (isOverflowingBottom || isLargeOffsetForRichText) {
229844
- newPanel.top = selectionMbr.bottom - (panelHeight + verticalOffset);
229845
- }
229846
- }
229847
- newPanel.bottom = newPanel.top + panelHeight;
229848
- fitContextPanelInViewRect(newPanel, view, verticalOffset);
229849
- const itemCenter = selectionMbr.getCenter();
229850
- newPanel.left = itemCenter.x - panelWidth / 2;
229851
- adjustPanelHorizontal(newPanel, panelWidth, view, horizontalOffset);
229852
- return newPanel;
229853
- }
229854
- function adjustPanelHorizontal(newPanel, panelWidth, view, horizontalOffset) {
229855
- newPanel.right = newPanel.left + panelWidth;
229856
- if (newPanel.left < view.left + horizontalOffset) {
229857
- newPanel.left = view.left + horizontalOffset;
229858
- } else if (newPanel.right + horizontalOffset > view.right) {
229859
- newPanel.left = view.right - (panelWidth + horizontalOffset);
229860
- }
229861
- newPanel.right = newPanel.left + panelWidth;
229862
- }
229863
- function fitContextPanelInViewRect(panel, view, verticalOffset) {
229864
- const panelHeight = panel.getHeight();
229865
- if (panel.top <= view.top + verticalOffset) {
229866
- panel.top = view.top + 2 * verticalOffset;
229867
- panel.bottom = panel.top + panelHeight;
229868
- }
229869
- if (panel.bottom >= view.bottom - verticalOffset) {
229870
- panel.bottom = view.bottom - 2 * verticalOffset;
229871
- panel.top = panel.bottom - panelHeight;
229872
- }
229873
- }
229874
- function fitLinkToBtn(itemMbr, view, panel, verticalOffset = -2, horizontalOffset = -2) {
229875
- const panelHeight = panel.getHeight();
229876
- const newPanel = new Mbr;
229877
- newPanel.top = itemMbr.top - panelHeight - verticalOffset;
229878
- newPanel.top = newPanel.top + panelHeight;
229879
- newPanel.bottom = newPanel.top + panelHeight * 2;
229880
- const panelWidth = panel.getWidth();
229881
- newPanel.left = itemMbr.right - panelWidth + horizontalOffset;
229882
- return newPanel;
229883
- }
229884
- function fitHyperLink(linkMbr, panel, view, offset = 20) {
229885
- const panelHeight = panel.getHeight();
229886
- const newPanel = new Mbr;
229887
- newPanel.top = linkMbr.bottom;
229888
- newPanel.bottom = panelHeight + newPanel.top;
229889
- const panelWidth = panel.getWidth();
229890
- newPanel.left = linkMbr.left;
229891
- newPanel.right = newPanel.left + panelWidth;
229892
- return newPanel;
229893
- }
229894
- function fitComment(anchor, panel, verticalOffset = 0, horizontalOffset = 0) {
229895
- const panelHeight = panel.getHeight();
229896
- const newPanel = new Mbr;
229897
- newPanel.top = anchor.top - panelHeight - verticalOffset;
229898
- newPanel.bottom = newPanel.top + panelHeight;
229899
- const panelWidth = panel.getWidth();
229900
- newPanel.left = anchor.left - panelWidth / 2 - horizontalOffset;
229901
- newPanel.right = newPanel.left + panelWidth;
229902
- return newPanel;
229903
- }
229904
- function fitBoardMenu(anchor, view, panel, verticalOffset = 20, horizontalOffset = 20) {
229905
- const panelHeight = panel.getHeight();
229906
- const panelWidth = panel.getWidth();
229907
- const newPanel = new Mbr;
229908
- newPanel.top = anchor.top;
229909
- newPanel.bottom = newPanel.top + panelHeight;
229910
- if (newPanel.bottom > view.bottom - verticalOffset) {
229911
- newPanel.bottom = view.bottom - verticalOffset;
229912
- newPanel.top = newPanel.bottom - panelHeight;
229913
- }
229914
- newPanel.left = anchor.left;
229915
- newPanel.right = newPanel.left + panelWidth;
229916
- if (newPanel.right > view.right - horizontalOffset) {
229917
- newPanel.right = view.right - horizontalOffset;
229918
- newPanel.left = newPanel.right - panelWidth;
229919
- }
229920
- return newPanel;
229921
- }
229922
- function fitThreadPanel(anchor, view, panel, verticalOffset = 50, horizontalOffset = 50) {
229923
- const panelHeight = panel.getHeight();
229924
- const panelWidth = panel.getWidth();
229925
- const newPanel = new Mbr;
229926
- newPanel.top = anchor.top - panelHeight / 2;
229927
- if (newPanel.top < view.top + verticalOffset) {
229928
- newPanel.top = view.top + verticalOffset;
229929
- }
229930
- newPanel.bottom = newPanel.top + panelHeight;
229931
- if (newPanel.bottom > view.bottom - verticalOffset) {
229932
- newPanel.bottom = view.bottom - verticalOffset;
229933
- newPanel.top = newPanel.bottom - panelHeight;
229934
- }
229935
- newPanel.left = anchor.left;
229936
- newPanel.right = newPanel.left + panelWidth;
229937
- if (newPanel.right > view.right - horizontalOffset) {
229938
- newPanel.right = anchor.right;
229939
- newPanel.left = newPanel.right - panelWidth;
229940
- }
229941
- return newPanel;
229942
- }
229943
229726
  function getLinesRelationType(lineA, lineB) {
229944
229727
  let denominator = (lineB.end.y - lineB.start.y) * (lineA.end.x - lineA.start.x) - (lineB.end.x - lineB.start.x) * (lineA.end.y - lineA.start.y);
229945
229728
  if (denominator === Infinity || denominator === -Infinity) {
@@ -231857,6 +231640,229 @@ class Arc {
231857
231640
  return new Arc(this.center.copy(), this.radiusX, this.radiusY, this.startAngle, this.endAngle, this.clockwise);
231858
231641
  }
231859
231642
  }
231643
+ var _sessionStorage;
231644
+ if (typeof window !== "undefined" && window.sessionStorage) {
231645
+ _sessionStorage = window.sessionStorage;
231646
+ } else {
231647
+
231648
+ class NodeStoragePolyfill {
231649
+ _store = {};
231650
+ clear() {
231651
+ this._store = {};
231652
+ }
231653
+ getItem(key) {
231654
+ return Object.prototype.hasOwnProperty.call(this._store, key) ? this._store[key] : null;
231655
+ }
231656
+ key(index) {
231657
+ const keys = Object.keys(this._store);
231658
+ return keys[index] ?? null;
231659
+ }
231660
+ removeItem(key) {
231661
+ delete this._store[key];
231662
+ }
231663
+ setItem(key, value) {
231664
+ this._store[key] = value;
231665
+ }
231666
+ get length() {
231667
+ return Object.keys(this._store).length;
231668
+ }
231669
+ }
231670
+ _sessionStorage = new NodeStoragePolyfill;
231671
+ }
231672
+
231673
+ class SessionStorage {
231674
+ set(key, value) {
231675
+ const boardId = this.getBoardId() || "";
231676
+ _sessionStorage.setItem(boardId + "_" + key, JSON.stringify(value));
231677
+ }
231678
+ get(key) {
231679
+ const boardId = this.getBoardId() || "";
231680
+ const item = _sessionStorage.getItem(boardId + "_" + key);
231681
+ if (!item || item === "undefined") {
231682
+ return;
231683
+ }
231684
+ return JSON.parse(item);
231685
+ }
231686
+ remove(key) {
231687
+ const boardId = this.getBoardId() || "";
231688
+ _sessionStorage.removeItem(boardId + "_" + key);
231689
+ }
231690
+ setConnectorStrokeStyle(color) {
231691
+ this.set(`connectorStrokeStyle`, color);
231692
+ }
231693
+ getConnectorStrokeStyle() {
231694
+ return this.get("connectorStrokeStyle");
231695
+ }
231696
+ setConnectorLineWidth(width) {
231697
+ this.set(`connectorLineWidth`, width);
231698
+ }
231699
+ getConnectorLineWidth() {
231700
+ return this.get("connectorLineWidth");
231701
+ }
231702
+ setConnectorFillColor(color) {
231703
+ this.set(`connectorFillColor`, color);
231704
+ }
231705
+ getConnectorFillColor() {
231706
+ return this.get("connectorFillColor");
231707
+ }
231708
+ setConnectorPointer(type, edge) {
231709
+ this.set(`connector${edge.charAt(0).toUpperCase() + edge.slice(1)}Pointer`, type);
231710
+ }
231711
+ getConnectorPointer(edge) {
231712
+ return this.get(`connector${edge.charAt(0).toUpperCase() + edge.slice(1)}Pointer`);
231713
+ }
231714
+ setConnectorLineStyle(type) {
231715
+ this.set("connectorLineStyle", type);
231716
+ }
231717
+ getConnectorLineStyle() {
231718
+ return this.get("connectorLineStyle");
231719
+ }
231720
+ setShapeData(data) {
231721
+ this.set("lastShapeData", data);
231722
+ }
231723
+ getShapeData() {
231724
+ return this.get("lastShapeData");
231725
+ }
231726
+ setStickerData(data) {
231727
+ this.set("lastSticker", data);
231728
+ }
231729
+ getStickerData() {
231730
+ return this.get("lastSticker");
231731
+ }
231732
+ setShapeWidth(width) {
231733
+ this.set("shapeWidth", width);
231734
+ }
231735
+ getShapeWidth() {
231736
+ return this.get("shapeWidth");
231737
+ }
231738
+ setShapeHeight(height) {
231739
+ this.set("shapeHeight", height);
231740
+ }
231741
+ getShapeHeight() {
231742
+ return this.get("shapeHeight");
231743
+ }
231744
+ setImageDimensions(dimension) {
231745
+ this.set("imageDimensions", dimension);
231746
+ }
231747
+ getImageDimensions() {
231748
+ return this.get("imageDimensions");
231749
+ }
231750
+ setFontSize(itemType, size2) {
231751
+ this.set(`fontSize_${itemType}`, size2);
231752
+ }
231753
+ getFontSize(itemType) {
231754
+ return this.get(`fontSize_${itemType}`);
231755
+ }
231756
+ setFontStyles(itemType, styles) {
231757
+ this.set(`fontStyles_${itemType}`, styles);
231758
+ }
231759
+ getFontStyles(itemType) {
231760
+ return this.get(`fontStyles_${itemType}`);
231761
+ }
231762
+ setFontColor(itemType, color) {
231763
+ this.set(`fontColor_${itemType}`, color);
231764
+ }
231765
+ getFontColor(itemType) {
231766
+ return this.get(`fontColor_${itemType}`);
231767
+ }
231768
+ setFontHighlight(itemType, highlightColor) {
231769
+ this.set(`fontHighlightColor_${itemType}`, highlightColor);
231770
+ }
231771
+ getFontHighlight(itemType) {
231772
+ return this.get(`fontHighlightColor_${itemType}`);
231773
+ }
231774
+ setHorizontalAlignment(itemType, horizontalAlignment) {
231775
+ this.set(`fontHorizontalAlignment_${itemType}`, horizontalAlignment);
231776
+ }
231777
+ getHorizontalAlignment(itemType) {
231778
+ return this.get(`fontHorizontalAlignment_${itemType}`);
231779
+ }
231780
+ setVerticalAlignment(itemType, verticalAlignment) {
231781
+ this.set(`fontVerticalAlignment_${itemType}`, verticalAlignment);
231782
+ }
231783
+ getVerticalAlignment(itemType) {
231784
+ return this.get(`fontVerticalAlignment_${itemType}`);
231785
+ }
231786
+ setLastAIRequest(request) {
231787
+ _sessionStorage.setItem("lastAIRequest", request);
231788
+ }
231789
+ getLastAIRequest() {
231790
+ return _sessionStorage.getItem("lastAIRequest");
231791
+ }
231792
+ removeLastAIRequest() {
231793
+ _sessionStorage.removeItem("lastAIRequest");
231794
+ }
231795
+ clear() {
231796
+ _sessionStorage.clear();
231797
+ }
231798
+ getBoardId() {
231799
+ if (typeof window === "undefined") {
231800
+ return;
231801
+ }
231802
+ return window.location.href.split("/").pop()?.split("?")[0];
231803
+ }
231804
+ }
231805
+ var tempStorage = new SessionStorage;
231806
+ function getTranslationFromHTML(el) {
231807
+ const transform = el.style.transform;
231808
+ const translateMatch = transform.match(/translate\(([^)]+)\)/);
231809
+ const [translateX, translateY] = translateMatch ? translateMatch[1].split(",").map((value) => parseFloat(value)) : [0, 0];
231810
+ return [translateX, translateY];
231811
+ }
231812
+ function getScaleFromHTML(el) {
231813
+ const transform = el.style.transform;
231814
+ const scaleMatch = transform.match(/scale\(([^)]+)\)/);
231815
+ const [scaleX, scaleY] = scaleMatch ? scaleMatch[1].split(",").map((value) => parseFloat(value)) : [1, 1];
231816
+ return [scaleX, scaleY];
231817
+ }
231818
+ function translateElementBy(el, x, y) {
231819
+ const [exX, exY] = getTranslationFromHTML(el);
231820
+ const [newX, newY] = [exX + x, exY + y];
231821
+ const [scaleX, scaleY] = getScaleFromHTML(el);
231822
+ el.style.transform = `translate(${newX}px, ${newY}px) scale(${scaleX}, ${scaleY})`;
231823
+ return el;
231824
+ }
231825
+ function scaleElementBy(el, scaleX, scaleY) {
231826
+ const [currentScaleX, currentScaleY] = getScaleFromHTML(el);
231827
+ const [newScaleX, newScaleY] = [
231828
+ currentScaleX * scaleX,
231829
+ currentScaleY * scaleY
231830
+ ];
231831
+ const [translateX, translateY] = getTranslationFromHTML(el);
231832
+ el.style.transform = `translate(${translateX}px, ${translateY}px) scale(${newScaleX}, ${newScaleY})`;
231833
+ return el;
231834
+ }
231835
+ function resetElementScale(el) {
231836
+ const [x, y] = getTranslationFromHTML(el);
231837
+ el.style.transform = `translate(${x}px, ${y}px) scale(1, 1)`;
231838
+ return el;
231839
+ }
231840
+ function positionRelatively(toPosition, positionBy, padding2 = 0) {
231841
+ const [translateX, translateY] = getTranslationFromHTML(toPosition);
231842
+ const [frameX, frameY] = getTranslationFromHTML(positionBy);
231843
+ const [dx, dy] = [translateX - frameX, translateY - frameY];
231844
+ const verticalAlignment = toPosition.getAttribute("data-vertical-alignment");
231845
+ const horizontalAlignment = toPosition.getAttribute("data-vertical-alignment");
231846
+ let paddingX = padding2;
231847
+ let paddingY = padding2;
231848
+ if (verticalAlignment && verticalAlignment === "bottom") {
231849
+ paddingY = -padding2;
231850
+ }
231851
+ if (horizontalAlignment && horizontalAlignment === "right") {
231852
+ paddingX = -padding2;
231853
+ }
231854
+ const [scaleX, scaleY] = getScaleFromHTML(toPosition);
231855
+ toPosition.style.transform = `translate(${dx + paddingX}px, ${dy + paddingY}px) scale(${scaleX}, ${scaleY})`;
231856
+ return toPosition;
231857
+ }
231858
+ function positionAbsolutely(toPosition, positionBy) {
231859
+ const [translateX, translateY] = getTranslationFromHTML(toPosition);
231860
+ const [frameX, frameY] = getTranslationFromHTML(positionBy);
231861
+ const [dx, dy] = [translateX + frameX, translateY + frameY];
231862
+ const [scaleX, scaleY] = getScaleFromHTML(toPosition);
231863
+ toPosition.style.transform = `translate(${dx}px, ${dy}px) scale(${scaleX}, ${scaleY})`;
231864
+ return toPosition;
231865
+ }
231860
231866
 
231861
231867
  class BrowserDocumentFactory {
231862
231868
  createElement(tagName) {
@@ -232032,6 +232038,151 @@ class MockPath2D {
232032
232038
  }
232033
232039
  }
232034
232040
 
232041
+ class Matrix2 {
232042
+ translateX;
232043
+ translateY;
232044
+ scaleX;
232045
+ scaleY;
232046
+ shearX;
232047
+ shearY;
232048
+ constructor(translateX = 0, translateY = 0, scaleX = 1, scaleY = 1, shearX = 0, shearY = 0) {
232049
+ this.translateX = translateX;
232050
+ this.translateY = translateY;
232051
+ this.scaleX = scaleX;
232052
+ this.scaleY = scaleY;
232053
+ this.shearX = shearX;
232054
+ this.shearY = shearY;
232055
+ this.translateX = toFiniteNumber(translateX);
232056
+ this.translateY = toFiniteNumber(translateY);
232057
+ this.scaleX = toFiniteNumber(scaleX, 1);
232058
+ this.scaleY = toFiniteNumber(scaleY, 1);
232059
+ this.shearX = toFiniteNumber(shearX);
232060
+ this.shearY = toFiniteNumber(shearY);
232061
+ }
232062
+ translate(x, y) {
232063
+ this.translateX += x;
232064
+ this.translateY += y;
232065
+ }
232066
+ scale(x, y) {
232067
+ this.scaleX = this.scaleX * x;
232068
+ this.scaleY = this.scaleY * y;
232069
+ }
232070
+ multiplyByMatrix(matrix) {
232071
+ const { translateX, translateY, scaleX, scaleY, shearX, shearY } = this;
232072
+ this.translateX = scaleX * matrix.translateX + shearX * matrix.translateY + translateX;
232073
+ this.translateY = shearY * matrix.translateX + scaleY * matrix.translateY + translateY;
232074
+ this.scaleX = scaleX * matrix.scaleX + shearX * matrix.shearY;
232075
+ this.scaleY = shearY * matrix.shearX + scaleY * matrix.scaleY;
232076
+ this.shearX = scaleX * matrix.shearX + shearX * matrix.scaleY;
232077
+ this.shearY = shearY * matrix.scaleX + scaleY * matrix.shearY;
232078
+ return this;
232079
+ }
232080
+ multiplyByMatrixies(matrixies) {
232081
+ for (const matrix of matrixies) {
232082
+ this.multiplyByMatrix(matrix);
232083
+ }
232084
+ return this;
232085
+ }
232086
+ multiply(value) {
232087
+ if (Array.isArray(value)) {
232088
+ this.multiplyByMatrixies(value);
232089
+ } else {
232090
+ this.multiplyByMatrix(value);
232091
+ }
232092
+ return this;
232093
+ }
232094
+ copy() {
232095
+ return new Matrix2(this.translateX, this.translateY, this.scaleX, this.scaleY, this.shearX, this.shearY);
232096
+ }
232097
+ invert() {
232098
+ const { scaleX, shearY, shearX, scaleY, translateX, translateY } = this;
232099
+ const denom = scaleX * scaleY - shearX * shearY;
232100
+ this.scaleX = scaleY / denom;
232101
+ this.shearY = shearY / -denom;
232102
+ this.shearX = shearX / -denom;
232103
+ this.scaleY = scaleX / denom;
232104
+ this.translateX = (scaleY * translateX - shearX * translateY) / -denom;
232105
+ this.translateY = (shearY * translateX - scaleX * translateY) / denom;
232106
+ }
232107
+ getInverse() {
232108
+ const inverse = this.copy();
232109
+ inverse.invert();
232110
+ return inverse;
232111
+ }
232112
+ rotateByRadian(radian) {
232113
+ const cosAngle = Math.cos(radian);
232114
+ const sinAngle = Math.sin(radian);
232115
+ const rotationMatrix = new Matrix2(0, 0, cosAngle, cosAngle, -sinAngle, sinAngle);
232116
+ return this.multiply(rotationMatrix);
232117
+ }
232118
+ rotateBy(degree) {
232119
+ const radian = degree * Math.PI / 180;
232120
+ this.rotateByRadian(radian);
232121
+ }
232122
+ rotateByObjectCenter(degree, size2, scale) {
232123
+ const angle = degree * (Math.PI / 180);
232124
+ const width = size2.width * scale.x;
232125
+ const height = size2.height * scale.y;
232126
+ const centerX = width / 2;
232127
+ const centerY = height / 2;
232128
+ const x = centerX - (centerX * Math.cos(angle) - centerY * Math.sin(angle));
232129
+ const y = centerY - (centerX * Math.sin(angle) + centerY * Math.cos(angle));
232130
+ this.rotateBy(degree);
232131
+ this.translate(x, y);
232132
+ }
232133
+ rotateByRelativeTo(degree, x, y) {
232134
+ this.translateX += x;
232135
+ this.translateY += y;
232136
+ this.rotateBy(degree);
232137
+ this.translateX -= x;
232138
+ this.translateY -= y;
232139
+ }
232140
+ rotateByRadianRelativeTo(radian, x, y) {
232141
+ this.translateX += x;
232142
+ this.translateY += y;
232143
+ this.rotateByRadian(radian);
232144
+ this.translateX -= x;
232145
+ this.translateY -= y;
232146
+ }
232147
+ apply(point3) {
232148
+ const { x, y } = point3;
232149
+ point3.x = this.scaleX * x + this.shearX * y + this.translateX;
232150
+ point3.y = this.shearY * x + this.scaleY * y + this.translateY;
232151
+ }
232152
+ applyToContext(ctx) {
232153
+ ctx.transform(this.scaleX, this.shearY, this.shearX, this.scaleY, this.translateX, this.translateY);
232154
+ }
232155
+ getAffineMatrix() {
232156
+ return {
232157
+ a: this.scaleX,
232158
+ b: this.shearY,
232159
+ c: this.shearX,
232160
+ d: this.scaleY,
232161
+ e: this.translateX,
232162
+ f: this.translateY
232163
+ };
232164
+ }
232165
+ getCssString() {
232166
+ return `matrix(${this.scaleX},${this.shearY},${this.shearX},${this.scaleY},${this.translateX},${this.translateY})`;
232167
+ }
232168
+ identity() {
232169
+ return new Matrix2;
232170
+ }
232171
+ mirrorOrigin() {
232172
+ return new Matrix2(0, 0, -1, -1);
232173
+ }
232174
+ mirrorX() {
232175
+ return new Matrix2(0, 0, 1, -1);
232176
+ }
232177
+ mirrorY() {
232178
+ return new Matrix2(0, 0, -1, 1);
232179
+ }
232180
+ compare(matrix) {
232181
+ const { translateX, translateY, scaleX, scaleY, shearX, shearY } = matrix;
232182
+ return this.translateX === translateX && this.translateY === translateY && this.scaleX === scaleX && this.scaleY === scaleY && this.shearX === shearX && this.shearY === shearY;
232183
+ }
232184
+ }
232185
+
232035
232186
  class Subject {
232036
232187
  observers = [];
232037
232188
  subscribe(observer) {
@@ -234955,7 +235106,7 @@ var Browser = /* @__PURE__ */ function() {
234955
235106
  }
234956
235107
  _createClass(Browser2, [{
234957
235108
  key: "init",
234958
- value: function init2(services) {
235109
+ value: function init(services) {
234959
235110
  var options2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
234960
235111
  var i18nOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
234961
235112
  this.services = services || {
@@ -235010,7 +235161,7 @@ var Browser = /* @__PURE__ */ function() {
235010
235161
  }
235011
235162
  }, {
235012
235163
  key: "cacheUserLanguage",
235013
- value: function cacheUserLanguage4(lng, caches) {
235164
+ value: function cacheUserLanguage(lng, caches) {
235014
235165
  var _this2 = this;
235015
235166
  if (!caches)
235016
235167
  caches = this.options.caches;
@@ -235404,772 +235555,6 @@ var conf = {
235404
235555
  CONNECTOR_ITEM_OFFSET: 20
235405
235556
  };
235406
235557
  initDefaultI18N();
235407
-
235408
- class Matrix2 {
235409
- translateX;
235410
- translateY;
235411
- scaleX;
235412
- scaleY;
235413
- shearX;
235414
- shearY;
235415
- constructor(translateX = 0, translateY = 0, scaleX = 1, scaleY = 1, shearX = 0, shearY = 0) {
235416
- this.translateX = translateX;
235417
- this.translateY = translateY;
235418
- this.scaleX = scaleX;
235419
- this.scaleY = scaleY;
235420
- this.shearX = shearX;
235421
- this.shearY = shearY;
235422
- this.translateX = toFiniteNumber(translateX);
235423
- this.translateY = toFiniteNumber(translateY);
235424
- this.scaleX = toFiniteNumber(scaleX, 1);
235425
- this.scaleY = toFiniteNumber(scaleY, 1);
235426
- this.shearX = toFiniteNumber(shearX);
235427
- this.shearY = toFiniteNumber(shearY);
235428
- }
235429
- translate(x, y) {
235430
- this.translateX += x;
235431
- this.translateY += y;
235432
- }
235433
- scale(x, y) {
235434
- this.scaleX = this.scaleX * x;
235435
- this.scaleY = this.scaleY * y;
235436
- }
235437
- multiplyByMatrix(matrix) {
235438
- const { translateX, translateY, scaleX, scaleY, shearX, shearY } = this;
235439
- this.translateX = scaleX * matrix.translateX + shearX * matrix.translateY + translateX;
235440
- this.translateY = shearY * matrix.translateX + scaleY * matrix.translateY + translateY;
235441
- this.scaleX = scaleX * matrix.scaleX + shearX * matrix.shearY;
235442
- this.scaleY = shearY * matrix.shearX + scaleY * matrix.scaleY;
235443
- this.shearX = scaleX * matrix.shearX + shearX * matrix.scaleY;
235444
- this.shearY = shearY * matrix.scaleX + scaleY * matrix.shearY;
235445
- return this;
235446
- }
235447
- multiplyByMatrixies(matrixies) {
235448
- for (const matrix of matrixies) {
235449
- this.multiplyByMatrix(matrix);
235450
- }
235451
- return this;
235452
- }
235453
- multiply(value) {
235454
- if (Array.isArray(value)) {
235455
- this.multiplyByMatrixies(value);
235456
- } else {
235457
- this.multiplyByMatrix(value);
235458
- }
235459
- return this;
235460
- }
235461
- copy() {
235462
- return new Matrix2(this.translateX, this.translateY, this.scaleX, this.scaleY, this.shearX, this.shearY);
235463
- }
235464
- invert() {
235465
- const { scaleX, shearY, shearX, scaleY, translateX, translateY } = this;
235466
- const denom = scaleX * scaleY - shearX * shearY;
235467
- this.scaleX = scaleY / denom;
235468
- this.shearY = shearY / -denom;
235469
- this.shearX = shearX / -denom;
235470
- this.scaleY = scaleX / denom;
235471
- this.translateX = (scaleY * translateX - shearX * translateY) / -denom;
235472
- this.translateY = (shearY * translateX - scaleX * translateY) / denom;
235473
- }
235474
- getInverse() {
235475
- const inverse = this.copy();
235476
- inverse.invert();
235477
- return inverse;
235478
- }
235479
- rotateByRadian(radian) {
235480
- const cosAngle = Math.cos(radian);
235481
- const sinAngle = Math.sin(radian);
235482
- const rotationMatrix = new Matrix2(0, 0, cosAngle, cosAngle, -sinAngle, sinAngle);
235483
- return this.multiply(rotationMatrix);
235484
- }
235485
- rotateBy(degree) {
235486
- const radian = degree * Math.PI / 180;
235487
- this.rotateByRadian(radian);
235488
- }
235489
- rotateByObjectCenter(degree, size2, scale) {
235490
- const angle = degree * (Math.PI / 180);
235491
- const width = size2.width * scale.x;
235492
- const height = size2.height * scale.y;
235493
- const centerX = width / 2;
235494
- const centerY = height / 2;
235495
- const x = centerX - (centerX * Math.cos(angle) - centerY * Math.sin(angle));
235496
- const y = centerY - (centerX * Math.sin(angle) + centerY * Math.cos(angle));
235497
- this.rotateBy(degree);
235498
- this.translate(x, y);
235499
- }
235500
- rotateByRelativeTo(degree, x, y) {
235501
- this.translateX += x;
235502
- this.translateY += y;
235503
- this.rotateBy(degree);
235504
- this.translateX -= x;
235505
- this.translateY -= y;
235506
- }
235507
- rotateByRadianRelativeTo(radian, x, y) {
235508
- this.translateX += x;
235509
- this.translateY += y;
235510
- this.rotateByRadian(radian);
235511
- this.translateX -= x;
235512
- this.translateY -= y;
235513
- }
235514
- apply(point3) {
235515
- const { x, y } = point3;
235516
- point3.x = this.scaleX * x + this.shearX * y + this.translateX;
235517
- point3.y = this.shearY * x + this.scaleY * y + this.translateY;
235518
- }
235519
- applyToContext(ctx) {
235520
- ctx.transform(this.scaleX, this.shearY, this.shearX, this.scaleY, this.translateX, this.translateY);
235521
- }
235522
- getAffineMatrix() {
235523
- return {
235524
- a: this.scaleX,
235525
- b: this.shearY,
235526
- c: this.shearX,
235527
- d: this.scaleY,
235528
- e: this.translateX,
235529
- f: this.translateY
235530
- };
235531
- }
235532
- getCssString() {
235533
- return `matrix(${this.scaleX},${this.shearY},${this.shearX},${this.scaleY},${this.translateX},${this.translateY})`;
235534
- }
235535
- identity() {
235536
- return new Matrix2;
235537
- }
235538
- mirrorOrigin() {
235539
- return new Matrix2(0, 0, -1, -1);
235540
- }
235541
- mirrorX() {
235542
- return new Matrix2(0, 0, 1, -1);
235543
- }
235544
- mirrorY() {
235545
- return new Matrix2(0, 0, -1, 1);
235546
- }
235547
- compare(matrix) {
235548
- const { translateX, translateY, scaleX, scaleY, shearX, shearY } = matrix;
235549
- return this.translateX === translateX && this.translateY === translateY && this.scaleX === scaleX && this.scaleY === scaleY && this.shearX === shearX && this.shearY === shearY;
235550
- }
235551
- }
235552
-
235553
- class SubjectOperation {
235554
- observers = [];
235555
- subscribe(observer) {
235556
- const index = this.observers.indexOf(observer);
235557
- if (index === -1) {
235558
- this.observers.push(observer);
235559
- }
235560
- }
235561
- unsubscribe(observer) {
235562
- const index = this.observers.indexOf(observer);
235563
- if (index !== -1) {
235564
- this.observers.splice(index, 1);
235565
- }
235566
- }
235567
- publish(subject, op) {
235568
- for (const observer of this.observers) {
235569
- observer(subject, op);
235570
- }
235571
- }
235572
- }
235573
- function mapItemsByOperation(item, getCallback) {
235574
- const items = Array.isArray(item) ? item : [item];
235575
- return items.map((item2) => {
235576
- const operation = getCallback(item2);
235577
- return { item: item2, operation };
235578
- });
235579
- }
235580
-
235581
- class TransformationCommand {
235582
- transformation;
235583
- operation;
235584
- reverse;
235585
- constructor(transformation, operation) {
235586
- this.transformation = transformation;
235587
- this.operation = operation;
235588
- this.reverse = this.getReverse();
235589
- }
235590
- merge(op) {
235591
- this.operation = op;
235592
- this.reverse = this.getReverse();
235593
- return this;
235594
- }
235595
- apply() {
235596
- for (const transformation of this.transformation) {
235597
- transformation.apply(this.operation);
235598
- }
235599
- }
235600
- revert() {
235601
- this.reverse.forEach(({ item, operation }) => {
235602
- item.apply(operation);
235603
- });
235604
- }
235605
- getReverse() {
235606
- const op = this.operation;
235607
- switch (this.operation.method) {
235608
- case "applyMatrix": {
235609
- const op2 = this.operation;
235610
- return this.transformation.map((t3) => {
235611
- const itemOp = op2.items.find((i) => i.id === t3.getId());
235612
- if (!itemOp)
235613
- return { item: t3, operation: op2 };
235614
- return {
235615
- item: t3,
235616
- operation: {
235617
- class: "Transformation",
235618
- method: "applyMatrix",
235619
- items: [{
235620
- id: t3.getId(),
235621
- matrix: {
235622
- translateX: -itemOp.matrix.translateX,
235623
- translateY: -itemOp.matrix.translateY,
235624
- scaleX: 1 / itemOp.matrix.scaleX,
235625
- scaleY: 1 / itemOp.matrix.scaleY,
235626
- shearX: 0,
235627
- shearY: 0
235628
- }
235629
- }]
235630
- }
235631
- };
235632
- });
235633
- }
235634
- case "translateTo":
235635
- return mapItemsByOperation(this.transformation, (transformation) => {
235636
- return {
235637
- ...this.operation,
235638
- x: transformation.getTranslation().x,
235639
- y: transformation.getTranslation().y
235640
- };
235641
- });
235642
- case "translateBy": {
235643
- const op2 = this.operation;
235644
- return mapItemsByOperation(this.transformation, () => {
235645
- return {
235646
- ...this.operation,
235647
- x: -op2.x,
235648
- y: -op2.y
235649
- };
235650
- });
235651
- }
235652
- case "scaleTo":
235653
- case "scaleToRelativeTo": {
235654
- return mapItemsByOperation(this.transformation, (transformation) => {
235655
- return {
235656
- ...op,
235657
- x: transformation.getScale().x,
235658
- y: transformation.getScale().y
235659
- };
235660
- });
235661
- }
235662
- case "scaleBy":
235663
- case "scaleByRelativeTo": {
235664
- const op2 = this.operation;
235665
- return mapItemsByOperation(this.transformation, () => {
235666
- return {
235667
- ...op2,
235668
- x: 1 / op2.x,
235669
- y: 1 / op2.y
235670
- };
235671
- });
235672
- }
235673
- case "rotateTo":
235674
- return mapItemsByOperation(this.transformation, (transformation) => {
235675
- return {
235676
- ...this.operation,
235677
- degree: transformation.getRotation()
235678
- };
235679
- });
235680
- case "scaleByTranslateBy": {
235681
- const op2 = this.operation;
235682
- const scaleTransformation = mapItemsByOperation(this.transformation, () => {
235683
- const scaleX = 1 / op2.scale.x;
235684
- const scaleY = 1 / op2.scale.y;
235685
- const translateX = -op2.translate.x;
235686
- const translateY = -op2.translate.y;
235687
- return {
235688
- ...op2,
235689
- scale: {
235690
- x: scaleX,
235691
- y: scaleY
235692
- },
235693
- translate: {
235694
- x: translateX,
235695
- y: translateY
235696
- }
235697
- };
235698
- });
235699
- return scaleTransformation;
235700
- }
235701
- case "rotateBy": {
235702
- const op2 = this.operation;
235703
- return mapItemsByOperation(this.transformation, () => {
235704
- return {
235705
- ...this.operation,
235706
- degree: -op2.degree
235707
- };
235708
- });
235709
- }
235710
- case "transformMany": {
235711
- const { operation, transformation } = this;
235712
- return transformation.map((currTrans) => {
235713
- const op2 = operation.items[currTrans.getId()];
235714
- const m = op2.method === "applyMatrix" ? op2.matrix : op2.method === "scaleByTranslateBy" ? { translateX: -op2.translate.x, translateY: -op2.translate.y, scaleX: 1 / op2.scale.x, scaleY: 1 / op2.scale.y, shearX: 0, shearY: 0 } : { translateX: 0, translateY: 0, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 };
235715
- return {
235716
- item: currTrans,
235717
- operation: {
235718
- class: "Transformation",
235719
- method: "applyMatrix",
235720
- items: [{
235721
- id: currTrans.getId(),
235722
- matrix: {
235723
- translateX: op2.method === "applyMatrix" ? -m.translateX : m.translateX,
235724
- translateY: op2.method === "applyMatrix" ? -m.translateY : m.translateY,
235725
- scaleX: op2.method === "applyMatrix" ? 1 / m.scaleX : m.scaleX,
235726
- scaleY: op2.method === "applyMatrix" ? 1 / m.scaleY : m.scaleY,
235727
- shearX: 0,
235728
- shearY: 0
235729
- }
235730
- }]
235731
- }
235732
- };
235733
- });
235734
- }
235735
- case "locked": {
235736
- const op2 = this.operation;
235737
- return mapItemsByOperation(this.transformation, () => {
235738
- return {
235739
- ...op2,
235740
- item: [...op2.item],
235741
- method: "unlocked",
235742
- locked: false
235743
- };
235744
- });
235745
- }
235746
- case "unlocked": {
235747
- const op2 = this.operation;
235748
- return mapItemsByOperation(this.transformation, () => {
235749
- return {
235750
- ...op2,
235751
- item: [...op2.item],
235752
- method: "locked",
235753
- locked: true
235754
- };
235755
- });
235756
- }
235757
- default:
235758
- return [
235759
- { item: this.transformation[0], operation: this.operation }
235760
- ];
235761
- }
235762
- }
235763
- }
235764
-
235765
- class DefaultTransformationData {
235766
- translateX;
235767
- translateY;
235768
- scaleX;
235769
- scaleY;
235770
- rotate;
235771
- isLocked;
235772
- constructor(translateX = 0, translateY = 0, scaleX = 1, scaleY = 1, rotate = 0, isLocked = false) {
235773
- this.translateX = translateX;
235774
- this.translateY = translateY;
235775
- this.scaleX = scaleX;
235776
- this.scaleY = scaleY;
235777
- this.rotate = rotate;
235778
- this.isLocked = isLocked;
235779
- }
235780
- }
235781
- var defaultData = new DefaultTransformationData;
235782
-
235783
- class Transformation {
235784
- id;
235785
- events;
235786
- subject = new SubjectOperation;
235787
- matrix = new Matrix2;
235788
- previous = new Matrix2;
235789
- rotate = defaultData.rotate;
235790
- isLocked = false;
235791
- constructor(id2 = "", events2) {
235792
- this.id = id2;
235793
- this.events = events2;
235794
- }
235795
- serialize() {
235796
- return {
235797
- translateX: this.matrix.translateX,
235798
- translateY: this.matrix.translateY,
235799
- scaleX: this.matrix.scaleX,
235800
- scaleY: this.matrix.scaleY,
235801
- rotate: this.rotate,
235802
- isLocked: this.isLocked
235803
- };
235804
- }
235805
- deserialize(data) {
235806
- this.previous = this.matrix.copy();
235807
- if (data.translateX) {
235808
- this.matrix.translateX = data.translateX;
235809
- }
235810
- if (data.translateY) {
235811
- this.matrix.translateY = data.translateY;
235812
- }
235813
- if (data.scaleX) {
235814
- this.matrix.scaleX = data.scaleX;
235815
- }
235816
- if (data.scaleY) {
235817
- this.matrix.scaleY = data.scaleY;
235818
- }
235819
- if (data.isLocked) {
235820
- this.isLocked = data.isLocked;
235821
- }
235822
- if (data.rotate) {
235823
- this.rotate = data.rotate;
235824
- }
235825
- this.subject.publish(this, {
235826
- class: "Transformation",
235827
- method: "deserialize",
235828
- item: [this.id],
235829
- data
235830
- });
235831
- return this;
235832
- }
235833
- copy(id2) {
235834
- const { translateX, translateY, scaleX, scaleY } = this.matrix;
235835
- const { rotate } = this;
235836
- return new Transformation(id2 || "", this.events).deserialize({
235837
- translateX,
235838
- translateY,
235839
- scaleX,
235840
- scaleY,
235841
- rotate,
235842
- isLocked: false
235843
- });
235844
- }
235845
- emit(operation) {
235846
- if (this.events) {
235847
- const command = new TransformationCommand([this], operation);
235848
- command.apply();
235849
- this.events.emit(operation, command);
235850
- } else {
235851
- this.apply(operation);
235852
- }
235853
- }
235854
- setId(id2) {
235855
- this.id = id2;
235856
- }
235857
- apply(op) {
235858
- this.previous = this.matrix.copy();
235859
- switch (op.method) {
235860
- case "applyMatrix": {
235861
- const itemOp = op.items.find((i) => i.id === this.id);
235862
- if (itemOp) {
235863
- this.matrix.scale(itemOp.matrix.scaleX, itemOp.matrix.scaleY);
235864
- this.matrix.translate(itemOp.matrix.translateX, itemOp.matrix.translateY);
235865
- }
235866
- break;
235867
- }
235868
- case "translateTo":
235869
- this.applyTranslateTo(op.x, op.y);
235870
- break;
235871
- case "translateBy":
235872
- this.applyTranslateBy(op.x, op.y);
235873
- break;
235874
- case "scaleTo":
235875
- this.applyScaleTo(op.x, op.y);
235876
- break;
235877
- case "scaleBy":
235878
- this.applyScaleBy(op.x, op.y);
235879
- break;
235880
- case "scaleToRelativeTo":
235881
- this.applyScaleToRelativeTo(op.x, op.y, op.point);
235882
- break;
235883
- case "scaleByRelativeTo":
235884
- this.applyScaleByRelativeTo(op.x, op.y, op.point);
235885
- break;
235886
- case "rotateTo":
235887
- this.applyRotateTo(op.degree);
235888
- break;
235889
- case "rotateBy":
235890
- this.applyRotateBy(op.degree);
235891
- break;
235892
- case "scaleByTranslateBy":
235893
- this.applyScaleByTranslateBy(op.scale, op.translate);
235894
- break;
235895
- case "transformMany":
235896
- this.applyTransformMany(op.items[this.id]);
235897
- break;
235898
- case "locked":
235899
- this.applyLocked(op.locked);
235900
- break;
235901
- case "unlocked":
235902
- this.applyUnlocked(op.locked);
235903
- break;
235904
- default:
235905
- return;
235906
- }
235907
- this.subject.publish(this, op);
235908
- }
235909
- applyTranslateTo(x, y) {
235910
- this.matrix.translateX = x;
235911
- this.matrix.translateY = y;
235912
- }
235913
- applyTranslateBy(x, y) {
235914
- this.matrix.translate(x, y);
235915
- }
235916
- applyScaleTo(x, y) {
235917
- this.matrix.scaleX = x;
235918
- this.matrix.scaleY = y;
235919
- }
235920
- applyScaleBy(x, y) {
235921
- this.matrix.scale(x, y);
235922
- }
235923
- applyScaleByTranslateBy(scale, translate) {
235924
- this.matrix.scale(scale.x, scale.y);
235925
- this.matrix.translate(translate.x, translate.y);
235926
- }
235927
- applyTransformMany(op) {
235928
- if (op.method === "applyMatrix") {
235929
- this.matrix.scale(op.matrix.scaleX, op.matrix.scaleY);
235930
- this.matrix.translate(op.matrix.translateX, op.matrix.translateY);
235931
- } else if (op.method === "scaleByTranslateBy") {
235932
- this.applyScaleByTranslateBy(op.scale, op.translate);
235933
- } else if (op.method === "scaleBy") {
235934
- this.applyScaleBy(op.x, op.y);
235935
- } else if (op.method === "translateBy") {
235936
- this.applyTranslateBy(op.x, op.y);
235937
- } else if (op.method === "translateTo") {
235938
- this.applyTranslateTo(op.x, op.y);
235939
- }
235940
- }
235941
- applyScaleByRelativeTo(x, y, point3) {
235942
- const scaleX = this.matrix.scaleX * x;
235943
- const scaleY = this.matrix.scaleY * y;
235944
- this.matrix.translateX = -point3.x * scaleX + point3.x;
235945
- this.matrix.translateY = -point3.y * scaleY + point3.y;
235946
- this.matrix.scaleX = scaleX;
235947
- this.matrix.scaleY = scaleY;
235948
- }
235949
- applyScaleToRelativeTo(x, y, point3) {
235950
- this.applyTranslateBy(-point3.x, -point3.y);
235951
- this.applyScaleTo(x, y);
235952
- this.applyTranslateBy(point3.x, point3.y);
235953
- }
235954
- applyRotateTo(degree) {
235955
- if (degree > 0) {
235956
- while (degree > 360) {
235957
- degree -= 360;
235958
- }
235959
- if (degree === 360) {
235960
- degree = 0;
235961
- }
235962
- } else {
235963
- while (degree < -360) {
235964
- degree += 360;
235965
- }
235966
- if (degree === -360) {
235967
- degree = 0;
235968
- }
235969
- }
235970
- this.rotate = degree;
235971
- }
235972
- applyRotateBy(degree) {
235973
- this.applyRotateTo(this.rotate + degree);
235974
- }
235975
- applyLocked(locked7) {
235976
- this.isLocked = locked7;
235977
- }
235978
- applyUnlocked(locked7) {
235979
- this.isLocked = locked7;
235980
- }
235981
- getTranslation() {
235982
- return { x: this.matrix.translateX, y: this.matrix.translateY };
235983
- }
235984
- getScale() {
235985
- return { x: this.matrix.scaleX, y: this.matrix.scaleY };
235986
- }
235987
- getRotation() {
235988
- return this.rotate;
235989
- }
235990
- getInverse() {
235991
- const copy22 = this.copy();
235992
- copy22.matrix.invert();
235993
- return copy22;
235994
- }
235995
- getId() {
235996
- return this.id;
235997
- }
235998
- emitMatrix(matrix, timeStamp) {
235999
- this.emit({
236000
- class: "Transformation",
236001
- method: "applyMatrix",
236002
- items: [{ id: this.id, matrix }],
236003
- timeStamp
236004
- });
236005
- }
236006
- translateTo(x, y, timeStamp) {
236007
- if (!this.id) {}
236008
- this.emitMatrix({
236009
- translateX: x - this.matrix.translateX,
236010
- translateY: y - this.matrix.translateY,
236011
- scaleX: 1,
236012
- scaleY: 1,
236013
- shearX: 0,
236014
- shearY: 0
236015
- }, timeStamp);
236016
- }
236017
- translateBy(x, y, timeStamp) {
236018
- if (!this.id) {}
236019
- if (x === 0 && y === 0) {
236020
- return;
236021
- }
236022
- this.emitMatrix({
236023
- translateX: x,
236024
- translateY: y,
236025
- scaleX: 1,
236026
- scaleY: 1,
236027
- shearX: 0,
236028
- shearY: 0
236029
- }, timeStamp);
236030
- }
236031
- scaleTo(x, y, timeStamp) {
236032
- this.emitMatrix({
236033
- translateX: 0,
236034
- translateY: 0,
236035
- scaleX: x / this.matrix.scaleX,
236036
- scaleY: y / this.matrix.scaleY,
236037
- shearX: 0,
236038
- shearY: 0
236039
- }, timeStamp);
236040
- }
236041
- scaleBy(x, y, timeStamp) {
236042
- if (x === 0 && y === 0) {
236043
- return;
236044
- }
236045
- this.emitMatrix({
236046
- translateX: 0,
236047
- translateY: 0,
236048
- scaleX: x,
236049
- scaleY: y,
236050
- shearX: 0,
236051
- shearY: 0
236052
- }, timeStamp);
236053
- }
236054
- scaleByTranslateBy(scale, translate, timeStamp) {
236055
- if (scale.x === 0 && scale.y === 0 && translate.x === 0 && translate.y === 0) {
236056
- return;
236057
- }
236058
- this.emitMatrix({
236059
- translateX: translate.x,
236060
- translateY: translate.y,
236061
- scaleX: scale.x,
236062
- scaleY: scale.y,
236063
- shearX: 0,
236064
- shearY: 0
236065
- }, timeStamp);
236066
- }
236067
- rotateTo(degree, timeStamp) {
236068
- this.emit({
236069
- class: "Transformation",
236070
- method: "rotateTo",
236071
- item: [this.id],
236072
- degree,
236073
- timeStamp
236074
- });
236075
- }
236076
- rotateBy(degree, timeStamp) {
236077
- this.emit({
236078
- class: "Transformation",
236079
- method: "rotateBy",
236080
- item: [this.id],
236081
- degree,
236082
- timeStamp
236083
- });
236084
- }
236085
- scaleToRelativeTo(x, y, _point, timeStamp) {
236086
- this.emitMatrix({
236087
- translateX: 0,
236088
- translateY: 0,
236089
- scaleX: x / this.matrix.scaleX,
236090
- scaleY: y / this.matrix.scaleY,
236091
- shearX: 0,
236092
- shearY: 0
236093
- }, timeStamp);
236094
- }
236095
- scaleByRelativeTo(x, y, point3, timeStamp) {
236096
- const { scaleX: sx0, scaleY: sy0, translateX: tx0, translateY: ty0 } = this.matrix;
236097
- const newSx = sx0 * x;
236098
- const newSy = sy0 * y;
236099
- this.emitMatrix({
236100
- translateX: -point3.x * newSx + point3.x - tx0,
236101
- translateY: -point3.y * newSy + point3.y - ty0,
236102
- scaleX: x,
236103
- scaleY: y,
236104
- shearX: 0,
236105
- shearY: 0
236106
- }, timeStamp);
236107
- }
236108
- setIsLocked(isLocked, timestamp) {
236109
- if (isLocked) {
236110
- this.emit({
236111
- class: "Transformation",
236112
- method: "locked",
236113
- item: [this.id],
236114
- locked: true,
236115
- timestamp
236116
- });
236117
- } else {
236118
- this.emit({
236119
- class: "Transformation",
236120
- method: "unlocked",
236121
- item: [this.id],
236122
- locked: false,
236123
- timestamp
236124
- });
236125
- }
236126
- }
236127
- }
236128
-
236129
- class DrawingContext {
236130
- camera;
236131
- ctx;
236132
- cursorCtx;
236133
- matrix;
236134
- isBorderInvisible = false;
236135
- shapeVisibilityTreshold = 3;
236136
- rectangleVisibilyTreshold = 2;
236137
- constructor(camera, ctx, cursorCtx, matrix = new Matrix2) {
236138
- this.camera = camera;
236139
- this.ctx = ctx;
236140
- this.cursorCtx = cursorCtx;
236141
- this.matrix = matrix;
236142
- this.setCamera(camera);
236143
- }
236144
- dpi() {
236145
- return conf.getDPI();
236146
- }
236147
- setCamera(camera) {
236148
- this.camera = camera;
236149
- this.matrix = camera.getMatrix();
236150
- const scale = this.matrix.scaleX;
236151
- this.isBorderInvisible = 4 * scale < 0.1;
236152
- }
236153
- clear() {
236154
- this.ctx.setTransform(1 * this.dpi(), 0, 0, 1 * this.dpi(), 0, 0);
236155
- this.ctx.clearRect(0, 0, conf.getDocumentWidth(), conf.getDocumentHeight());
236156
- this.matrix.applyToContext(this.ctx);
236157
- }
236158
- clearCursor() {
236159
- if (!this.cursorCtx) {
236160
- return;
236161
- }
236162
- this.cursorCtx.setTransform(1 * this.dpi(), 0, 0, 1 * this.dpi(), 0, 0);
236163
- this.cursorCtx.clearRect(0, 0, conf.getDocumentWidth(), conf.getDocumentHeight());
236164
- this.matrix.applyToContext(this.cursorCtx);
236165
- }
236166
- applyChanges() {
236167
- this.matrix.applyToContext(this.ctx);
236168
- }
236169
- getCameraScale() {
236170
- return this.camera.getScale();
236171
- }
236172
- }
236173
235558
  var LinePatterns = {
236174
235559
  solid: [],
236175
235560
  dot: [1, 2],
@@ -236803,388 +236188,30 @@ class Paths {
236803
236188
  return !isAllPathsOpened;
236804
236189
  }
236805
236190
  }
236806
-
236807
- class ConnectorCommand {
236808
- connector;
236809
- operation;
236810
- reverse;
236811
- constructor(connector, operation) {
236812
- this.connector = connector;
236813
- this.operation = operation;
236814
- this.reverse = this.getReverse();
236815
- }
236816
- merge(op) {
236817
- this.operation = op;
236818
- return this;
236819
- }
236820
- apply() {
236821
- for (const connector of this.connector) {
236822
- connector.apply(this.operation);
236823
- }
236824
- }
236825
- revert() {
236826
- for (const { item, operation } of this.reverse) {
236827
- item.apply(operation);
236828
- }
236829
- }
236830
- getReverse() {
236831
- const reverse = [];
236832
- switch (this.operation.method) {
236833
- case "setStartPoint":
236834
- for (const connector of this.connector) {
236835
- reverse.push({
236836
- item: connector,
236837
- operation: {
236838
- ...this.operation,
236839
- startPointData: connector.getStartPoint().serialize()
236840
- }
236841
- });
236842
- }
236843
- break;
236844
- case "setEndPoint":
236845
- for (const connector of this.connector) {
236846
- reverse.push({
236847
- item: connector,
236848
- operation: {
236849
- ...this.operation,
236850
- endPointData: connector.getEndPoint().serialize()
236851
- }
236852
- });
236853
- }
236854
- break;
236855
- case "setMiddlePoint":
236856
- for (const connector of this.connector) {
236857
- const middlePoint = connector.getMiddlePoint();
236858
- reverse.push({
236859
- item: connector,
236860
- operation: {
236861
- ...this.operation,
236862
- middlePointData: middlePoint ? middlePoint.serialize() : null
236863
- }
236864
- });
236865
- }
236866
- break;
236867
- case "setStartPointerStyle":
236868
- for (const connector of this.connector) {
236869
- reverse.push({
236870
- item: connector,
236871
- operation: {
236872
- ...this.operation,
236873
- startPointerStyle: connector.getStartPointerStyle()
236874
- }
236875
- });
236876
- }
236877
- break;
236878
- case "setEndPointerStyle":
236879
- for (const connector of this.connector) {
236880
- reverse.push({
236881
- item: connector,
236882
- operation: {
236883
- ...this.operation,
236884
- endPointerStyle: connector.getEndPointerStyle()
236885
- }
236886
- });
236887
- }
236888
- break;
236889
- case "setLineStyle":
236890
- for (const connector of this.connector) {
236891
- reverse.push({
236892
- item: connector,
236893
- operation: {
236894
- ...this.operation,
236895
- lineStyle: connector.getLineStyle()
236896
- }
236897
- });
236898
- }
236899
- break;
236900
- case "setBorderStyle":
236901
- for (const connector of this.connector) {
236902
- reverse.push({
236903
- item: connector,
236904
- operation: {
236905
- ...this.operation,
236906
- borderStyle: connector.getBorderStyle()
236907
- }
236908
- });
236909
- }
236910
- break;
236911
- case "setLineWidth":
236912
- for (const connector of this.connector) {
236913
- reverse.push({
236914
- item: connector,
236915
- operation: {
236916
- ...this.operation,
236917
- lineWidth: connector.getLineWidth()
236918
- }
236919
- });
236920
- }
236921
- break;
236922
- case "setLineColor":
236923
- for (const connector of this.connector) {
236924
- reverse.push({
236925
- item: connector,
236926
- operation: {
236927
- ...this.operation,
236928
- lineColor: connector.getLineColor()
236929
- }
236930
- });
236931
- }
236932
- break;
236933
- case "switchPointers":
236934
- for (const connector of this.connector) {
236935
- reverse.push({
236936
- item: connector,
236937
- operation: this.operation
236938
- });
236939
- }
236940
- break;
236941
- }
236942
- return reverse;
236943
- }
236944
- }
236945
- var _sessionStorage;
236946
- if (typeof window !== "undefined" && window.sessionStorage) {
236947
- _sessionStorage = window.sessionStorage;
236948
- } else {
236949
-
236950
- class NodeStoragePolyfill {
236951
- _store = {};
236952
- clear() {
236953
- this._store = {};
236954
- }
236955
- getItem(key) {
236956
- return Object.prototype.hasOwnProperty.call(this._store, key) ? this._store[key] : null;
236957
- }
236958
- key(index) {
236959
- const keys = Object.keys(this._store);
236960
- return keys[index] ?? null;
236961
- }
236962
- removeItem(key) {
236963
- delete this._store[key];
236964
- }
236965
- setItem(key, value) {
236966
- this._store[key] = value;
236967
- }
236968
- get length() {
236969
- return Object.keys(this._store).length;
236970
- }
236971
- }
236972
- _sessionStorage = new NodeStoragePolyfill;
236973
- }
236974
-
236975
- class SessionStorage {
236976
- set(key, value) {
236977
- const boardId = this.getBoardId() || "";
236978
- _sessionStorage.setItem(boardId + "_" + key, JSON.stringify(value));
236979
- }
236980
- get(key) {
236981
- const boardId = this.getBoardId() || "";
236982
- const item = _sessionStorage.getItem(boardId + "_" + key);
236983
- if (!item || item === "undefined") {
236984
- return;
236985
- }
236986
- return JSON.parse(item);
236987
- }
236988
- remove(key) {
236989
- const boardId = this.getBoardId() || "";
236990
- _sessionStorage.removeItem(boardId + "_" + key);
236991
- }
236992
- setConnectorStrokeStyle(color) {
236993
- this.set(`connectorStrokeStyle`, color);
236994
- }
236995
- getConnectorStrokeStyle() {
236996
- return this.get("connectorStrokeStyle");
236997
- }
236998
- setConnectorLineWidth(width) {
236999
- this.set(`connectorLineWidth`, width);
237000
- }
237001
- getConnectorLineWidth() {
237002
- return this.get("connectorLineWidth");
237003
- }
237004
- setConnectorFillColor(color) {
237005
- this.set(`connectorFillColor`, color);
237006
- }
237007
- getConnectorFillColor() {
237008
- return this.get("connectorFillColor");
237009
- }
237010
- setConnectorPointer(type, edge) {
237011
- this.set(`connector${edge.charAt(0).toUpperCase() + edge.slice(1)}Pointer`, type);
237012
- }
237013
- getConnectorPointer(edge) {
237014
- return this.get(`connector${edge.charAt(0).toUpperCase() + edge.slice(1)}Pointer`);
237015
- }
237016
- setConnectorLineStyle(type) {
237017
- this.set("connectorLineStyle", type);
237018
- }
237019
- getConnectorLineStyle() {
237020
- return this.get("connectorLineStyle");
237021
- }
237022
- setShapeData(data) {
237023
- this.set("lastShapeData", data);
237024
- }
237025
- getShapeData() {
237026
- return this.get("lastShapeData");
237027
- }
237028
- setStickerData(data) {
237029
- this.set("lastSticker", data);
237030
- }
237031
- getStickerData() {
237032
- return this.get("lastSticker");
237033
- }
237034
- setShapeWidth(width) {
237035
- this.set("shapeWidth", width);
237036
- }
237037
- getShapeWidth() {
237038
- return this.get("shapeWidth");
237039
- }
237040
- setShapeHeight(height) {
237041
- this.set("shapeHeight", height);
237042
- }
237043
- getShapeHeight() {
237044
- return this.get("shapeHeight");
237045
- }
237046
- setImageDimensions(dimension) {
237047
- this.set("imageDimensions", dimension);
237048
- }
237049
- getImageDimensions() {
237050
- return this.get("imageDimensions");
237051
- }
237052
- setFontSize(itemType, size2) {
237053
- this.set(`fontSize_${itemType}`, size2);
237054
- }
237055
- getFontSize(itemType) {
237056
- return this.get(`fontSize_${itemType}`);
237057
- }
237058
- setFontStyles(itemType, styles) {
237059
- this.set(`fontStyles_${itemType}`, styles);
237060
- }
237061
- getFontStyles(itemType) {
237062
- return this.get(`fontStyles_${itemType}`);
237063
- }
237064
- setFontColor(itemType, color) {
237065
- this.set(`fontColor_${itemType}`, color);
237066
- }
237067
- getFontColor(itemType) {
237068
- return this.get(`fontColor_${itemType}`);
237069
- }
237070
- setFontHighlight(itemType, highlightColor) {
237071
- this.set(`fontHighlightColor_${itemType}`, highlightColor);
237072
- }
237073
- getFontHighlight(itemType) {
237074
- return this.get(`fontHighlightColor_${itemType}`);
237075
- }
237076
- setHorizontalAlignment(itemType, horizontalAlignment) {
237077
- this.set(`fontHorizontalAlignment_${itemType}`, horizontalAlignment);
237078
- }
237079
- getHorizontalAlignment(itemType) {
237080
- return this.get(`fontHorizontalAlignment_${itemType}`);
237081
- }
237082
- setVerticalAlignment(itemType, verticalAlignment) {
237083
- this.set(`fontVerticalAlignment_${itemType}`, verticalAlignment);
237084
- }
237085
- getVerticalAlignment(itemType) {
237086
- return this.get(`fontVerticalAlignment_${itemType}`);
237087
- }
237088
- setLastAIRequest(request) {
237089
- _sessionStorage.setItem("lastAIRequest", request);
237090
- }
237091
- getLastAIRequest() {
237092
- return _sessionStorage.getItem("lastAIRequest");
237093
- }
237094
- removeLastAIRequest() {
237095
- _sessionStorage.removeItem("lastAIRequest");
237096
- }
237097
- clear() {
237098
- _sessionStorage.clear();
237099
- }
237100
- getBoardId() {
237101
- if (typeof window === "undefined") {
237102
- return;
237103
- }
237104
- return window.location.href.split("/").pop()?.split("?")[0];
237105
- }
237106
- }
237107
- var tempStorage = new SessionStorage;
237108
- function getTranslationFromHTML(el) {
237109
- const transform = el.style.transform;
237110
- const translateMatch = transform.match(/translate\(([^)]+)\)/);
237111
- const [translateX, translateY] = translateMatch ? translateMatch[1].split(",").map((value) => parseFloat(value)) : [0, 0];
237112
- return [translateX, translateY];
237113
- }
237114
- function getScaleFromHTML(el) {
237115
- const transform = el.style.transform;
237116
- const scaleMatch = transform.match(/scale\(([^)]+)\)/);
237117
- const [scaleX, scaleY] = scaleMatch ? scaleMatch[1].split(",").map((value) => parseFloat(value)) : [1, 1];
237118
- return [scaleX, scaleY];
237119
- }
237120
- function translateElementBy(el, x, y) {
237121
- const [exX, exY] = getTranslationFromHTML(el);
237122
- const [newX, newY] = [exX + x, exY + y];
237123
- const [scaleX, scaleY] = getScaleFromHTML(el);
237124
- el.style.transform = `translate(${newX}px, ${newY}px) scale(${scaleX}, ${scaleY})`;
237125
- return el;
237126
- }
237127
- function scaleElementBy(el, scaleX, scaleY) {
237128
- const [currentScaleX, currentScaleY] = getScaleFromHTML(el);
237129
- const [newScaleX, newScaleY] = [
237130
- currentScaleX * scaleX,
237131
- currentScaleY * scaleY
237132
- ];
237133
- const [translateX, translateY] = getTranslationFromHTML(el);
237134
- el.style.transform = `translate(${translateX}px, ${translateY}px) scale(${newScaleX}, ${newScaleY})`;
237135
- return el;
237136
- }
237137
- function resetElementScale(el) {
237138
- const [x, y] = getTranslationFromHTML(el);
237139
- el.style.transform = `translate(${x}px, ${y}px) scale(1, 1)`;
237140
- return el;
237141
- }
237142
- function positionRelatively(toPosition, positionBy, padding2 = 0) {
237143
- const [translateX, translateY] = getTranslationFromHTML(toPosition);
237144
- const [frameX, frameY] = getTranslationFromHTML(positionBy);
237145
- const [dx, dy] = [translateX - frameX, translateY - frameY];
237146
- const verticalAlignment = toPosition.getAttribute("data-vertical-alignment");
237147
- const horizontalAlignment = toPosition.getAttribute("data-vertical-alignment");
237148
- let paddingX = padding2;
237149
- let paddingY = padding2;
237150
- if (verticalAlignment && verticalAlignment === "bottom") {
237151
- paddingY = -padding2;
237152
- }
237153
- if (horizontalAlignment && horizontalAlignment === "right") {
237154
- paddingX = -padding2;
237155
- }
237156
- const [scaleX, scaleY] = getScaleFromHTML(toPosition);
237157
- toPosition.style.transform = `translate(${dx + paddingX}px, ${dy + paddingY}px) scale(${scaleX}, ${scaleY})`;
237158
- return toPosition;
237159
- }
237160
- function positionAbsolutely(toPosition, positionBy) {
237161
- const [translateX, translateY] = getTranslationFromHTML(toPosition);
237162
- const [frameX, frameY] = getTranslationFromHTML(positionBy);
237163
- const [dx, dy] = [translateX + frameX, translateY + frameY];
237164
- const [scaleX, scaleY] = getScaleFromHTML(toPosition);
237165
- toPosition.style.transform = `translate(${dx}px, ${dy}px) scale(${scaleX}, ${scaleY})`;
237166
- return toPosition;
237167
- }
237168
236191
  var Custom = {
237169
236192
  name: "Custom",
237170
236193
  textBounds: new Mbr(0, -10, 100, -1),
237171
- path: new Path2([
237172
- new Line(new Point3(0, 0), new Point3(100, 0)),
237173
- new Line(new Point3(100, 0), new Point3(100, 100)),
237174
- new Line(new Point3(100, 100), new Point3(0, 100)),
237175
- new Line(new Point3(0, 100), new Point3(0, 0))
237176
- ], true),
236194
+ get path() {
236195
+ return new Path2([
236196
+ new Line(new Point3(0, 0), new Point3(100, 0)),
236197
+ new Line(new Point3(100, 0), new Point3(100, 100)),
236198
+ new Line(new Point3(100, 100), new Point3(0, 100)),
236199
+ new Line(new Point3(0, 100), new Point3(0, 0))
236200
+ ], true);
236201
+ },
237177
236202
  anchorPoints: [new Point3(0, 50), new Point3(100, 50), new Point3(50, 0), new Point3(50, 100)]
237178
236203
  };
237179
236204
  var Frame16x9 = {
237180
236205
  name: "16:9",
237181
236206
  textBounds: new Mbr(0, -10, 200, -1),
237182
- path: new Path2([
237183
- new Line(new Point3(0, 0), new Point3(200, 0)),
237184
- new Line(new Point3(200, 0), new Point3(200, 200 * (739 / 1314))),
237185
- new Line(new Point3(200, 200 * (739 / 1314)), new Point3(0, 200 * (739 / 1314))),
237186
- new Line(new Point3(0, 200 * (739 / 1314)), new Point3(0, 0))
237187
- ], true),
236207
+ get path() {
236208
+ return new Path2([
236209
+ new Line(new Point3(0, 0), new Point3(200, 0)),
236210
+ new Line(new Point3(200, 0), new Point3(200, 200 * (739 / 1314))),
236211
+ new Line(new Point3(200, 200 * (739 / 1314)), new Point3(0, 200 * (739 / 1314))),
236212
+ new Line(new Point3(0, 200 * (739 / 1314)), new Point3(0, 0))
236213
+ ], true);
236214
+ },
237188
236215
  anchorPoints: [
237189
236216
  new Point3(0, 100 * (739 / 1314)),
237190
236217
  new Point3(200, 100 * (739 / 1314)),
@@ -237195,12 +236222,14 @@ var Frame16x9 = {
237195
236222
  var Frame4x3 = {
237196
236223
  name: "4:3",
237197
236224
  textBounds: new Mbr(0, -10, 200, -1),
237198
- path: new Path2([
237199
- new Line(new Point3(0, 0), new Point3(200, 0)),
237200
- new Line(new Point3(200, 0), new Point3(200, 200 * (853 / 1138))),
237201
- new Line(new Point3(200, 200 * (853 / 1138)), new Point3(0, 200 * (853 / 1138))),
237202
- new Line(new Point3(0, 200 * (853 / 1138)), new Point3(0, 0))
237203
- ], true),
236225
+ get path() {
236226
+ return new Path2([
236227
+ new Line(new Point3(0, 0), new Point3(200, 0)),
236228
+ new Line(new Point3(200, 0), new Point3(200, 200 * (853 / 1138))),
236229
+ new Line(new Point3(200, 200 * (853 / 1138)), new Point3(0, 200 * (853 / 1138))),
236230
+ new Line(new Point3(0, 200 * (853 / 1138)), new Point3(0, 0))
236231
+ ], true);
236232
+ },
237204
236233
  anchorPoints: [
237205
236234
  new Point3(0, 100 * (853 / 1138)),
237206
236235
  new Point3(200, 100 * (853 / 1138)),
@@ -237211,12 +236240,14 @@ var Frame4x3 = {
237211
236240
  var A4 = {
237212
236241
  name: "A4",
237213
236242
  textBounds: new Mbr(0, -15, 100, -1),
237214
- path: new Path2([
237215
- new Line(new Point3(0, 0), new Point3(100, 0)),
237216
- new Line(new Point3(100, 0), new Point3(100, 100 * (1172 / 828))),
237217
- new Line(new Point3(100, 100 * (1172 / 828)), new Point3(0, 100 * (1172 / 828))),
237218
- new Line(new Point3(0, 100 * (1172 / 828)), new Point3(0, 0))
237219
- ], true),
236243
+ get path() {
236244
+ return new Path2([
236245
+ new Line(new Point3(0, 0), new Point3(100, 0)),
236246
+ new Line(new Point3(100, 0), new Point3(100, 100 * (1172 / 828))),
236247
+ new Line(new Point3(100, 100 * (1172 / 828)), new Point3(0, 100 * (1172 / 828))),
236248
+ new Line(new Point3(0, 100 * (1172 / 828)), new Point3(0, 0))
236249
+ ], true);
236250
+ },
237220
236251
  anchorPoints: [
237221
236252
  new Point3(0, 50 * (1172 / 828)),
237222
236253
  new Point3(100, 50 * (1172 / 828)),
@@ -237227,12 +236258,14 @@ var A4 = {
237227
236258
  var Letter = {
237228
236259
  name: "Letter",
237229
236260
  textBounds: new Mbr(0, -10, 100, -1),
237230
- path: new Path2([
237231
- new Line(new Point3(0, 0), new Point3(100, 0)),
237232
- new Line(new Point3(100, 0), new Point3(100, 100 * (1120 / 867))),
237233
- new Line(new Point3(100, 100 * (1120 / 867)), new Point3(0, 100 * (1120 / 867))),
237234
- new Line(new Point3(0, 100 * (1120 / 867)), new Point3(0, 0))
237235
- ], true),
236261
+ get path() {
236262
+ return new Path2([
236263
+ new Line(new Point3(0, 0), new Point3(100, 0)),
236264
+ new Line(new Point3(100, 0), new Point3(100, 100 * (1120 / 867))),
236265
+ new Line(new Point3(100, 100 * (1120 / 867)), new Point3(0, 100 * (1120 / 867))),
236266
+ new Line(new Point3(0, 100 * (1120 / 867)), new Point3(0, 0))
236267
+ ], true);
236268
+ },
237236
236269
  anchorPoints: [
237237
236270
  new Point3(0, 50 * (1120 / 867)),
237238
236271
  new Point3(100, 50 * (1120 / 867)),
@@ -237243,23 +236276,27 @@ var Letter = {
237243
236276
  var Frame1x1 = {
237244
236277
  name: "1:1",
237245
236278
  textBounds: new Mbr(0, -10, 100, -1),
237246
- path: new Path2([
237247
- new Line(new Point3(0, 0), new Point3(100, 0)),
237248
- new Line(new Point3(100, 0), new Point3(100, 100)),
237249
- new Line(new Point3(100, 100), new Point3(0, 100)),
237250
- new Line(new Point3(0, 100), new Point3(0, 0))
237251
- ], true),
236279
+ get path() {
236280
+ return new Path2([
236281
+ new Line(new Point3(0, 0), new Point3(100, 0)),
236282
+ new Line(new Point3(100, 0), new Point3(100, 100)),
236283
+ new Line(new Point3(100, 100), new Point3(0, 100)),
236284
+ new Line(new Point3(0, 100), new Point3(0, 0))
236285
+ ], true);
236286
+ },
237252
236287
  anchorPoints: [new Point3(0, 50), new Point3(100, 50), new Point3(50, 0), new Point3(50, 100)]
237253
236288
  };
237254
236289
  var Frame3x2 = {
237255
236290
  name: "3:2",
237256
236291
  textBounds: new Mbr(0, -10, 200, -1),
237257
- path: new Path2([
237258
- new Line(new Point3(0, 0), new Point3(200, 0)),
237259
- new Line(new Point3(200, 0), new Point3(200, 200 * (200 / 300))),
237260
- new Line(new Point3(200, 200 * (200 / 300)), new Point3(0, 200 * (200 / 300))),
237261
- new Line(new Point3(0, 200 * (200 / 300)), new Point3(0, 0))
237262
- ], true),
236292
+ get path() {
236293
+ return new Path2([
236294
+ new Line(new Point3(0, 0), new Point3(200, 0)),
236295
+ new Line(new Point3(200, 0), new Point3(200, 200 * (200 / 300))),
236296
+ new Line(new Point3(200, 200 * (200 / 300)), new Point3(0, 200 * (200 / 300))),
236297
+ new Line(new Point3(0, 200 * (200 / 300)), new Point3(0, 0))
236298
+ ], true);
236299
+ },
237263
236300
  anchorPoints: [
237264
236301
  new Point3(0, 100 * (200 / 300)),
237265
236302
  new Point3(200, 100 * (200 / 300)),
@@ -237270,12 +236307,14 @@ var Frame3x2 = {
237270
236307
  var Frame9x18 = {
237271
236308
  name: "9:18",
237272
236309
  textBounds: new Mbr(0, -10, 200, -1),
237273
- path: new Path2([
237274
- new Line(new Point3(0, 0), new Point3(200, 0)),
237275
- new Line(new Point3(200, 0), new Point3(200, 200 * (1230 / 612))),
237276
- new Line(new Point3(200, 200 * (1230 / 612)), new Point3(0, 200 * (1230 / 612))),
237277
- new Line(new Point3(0, 200 * (1230 / 612)), new Point3(0, 0))
237278
- ], true),
236310
+ get path() {
236311
+ return new Path2([
236312
+ new Line(new Point3(0, 0), new Point3(200, 0)),
236313
+ new Line(new Point3(200, 0), new Point3(200, 200 * (1230 / 612))),
236314
+ new Line(new Point3(200, 200 * (1230 / 612)), new Point3(0, 200 * (1230 / 612))),
236315
+ new Line(new Point3(0, 200 * (1230 / 612)), new Point3(0, 0))
236316
+ ], true);
236317
+ },
237279
236318
  anchorPoints: [
237280
236319
  new Point3(0, 100 * (1230 / 612)),
237281
236320
  new Point3(200, 100 * (1230 / 612)),
@@ -237724,6 +236763,34 @@ function parseHTMLAINode(el) {
237724
236763
  return aiNodeData;
237725
236764
  }
237726
236765
 
236766
+ class SubjectOperation {
236767
+ observers = [];
236768
+ subscribe(observer) {
236769
+ const index = this.observers.indexOf(observer);
236770
+ if (index === -1) {
236771
+ this.observers.push(observer);
236772
+ }
236773
+ }
236774
+ unsubscribe(observer) {
236775
+ const index = this.observers.indexOf(observer);
236776
+ if (index !== -1) {
236777
+ this.observers.splice(index, 1);
236778
+ }
236779
+ }
236780
+ publish(subject, op) {
236781
+ for (const observer of this.observers) {
236782
+ observer(subject, op);
236783
+ }
236784
+ }
236785
+ }
236786
+ function mapItemsByOperation(item, getCallback) {
236787
+ const items = Array.isArray(item) ? item : [item];
236788
+ return items.map((item2) => {
236789
+ const operation = getCallback(item2);
236790
+ return { item: item2, operation };
236791
+ });
236792
+ }
236793
+
237727
236794
  class LinkToCommand {
237728
236795
  linkTo;
237729
236796
  operation;
@@ -239352,7 +238419,10 @@ var setLink = (editor, link, selection) => {
239352
238419
  return;
239353
238420
  }
239354
238421
  const format = link ? "rgba(71, 120, 245, 1)" : "rgb(20, 21, 26)";
239355
- Editor.addMark(editor, "fontColor", format);
238422
+ Transforms.setNodes(editor, { fontColor: format }, {
238423
+ match: (n4) => !Editor.isEditor(n4) && n4.type === "text",
238424
+ split: true
238425
+ });
239356
238426
  for (const [node3, path22] of Editor.nodes(editor, {
239357
238427
  match: (n4) => !Editor.isEditor(n4) && n4.type === "text"
239358
238428
  })) {
@@ -245327,7 +244397,7 @@ function persistLeafFormats(children) {
245327
244397
  }, {});
245328
244398
  }
245329
244399
  function plugin(opts) {
245330
- var compiler2 = function compiler3(node22) {
244400
+ var compiler2 = function compiler(node22) {
245331
244401
  return node22.children.map(function(c) {
245332
244402
  return deserialize(c, opts);
245333
244403
  });
@@ -245439,6 +244509,7 @@ class MarkdownProcessor {
245439
244509
  isProcessingChunk = false;
245440
244510
  stopProcessingMarkDownCb = null;
245441
244511
  currentNode = "";
244512
+ doneResolvers = [];
245442
244513
  editor;
245443
244514
  subject = new Subject;
245444
244515
  constructor(editor) {
@@ -245450,6 +244521,19 @@ class MarkdownProcessor {
245450
244521
  getStopProcessingMarkDownCb() {
245451
244522
  return this.stopProcessingMarkDownCb;
245452
244523
  }
244524
+ waitForDone() {
244525
+ if (!this.isProcessingChunk && this.chunksQueue.length === 0) {
244526
+ return Promise.resolve();
244527
+ }
244528
+ return new Promise((resolve) => {
244529
+ this.doneResolvers.push(resolve);
244530
+ });
244531
+ }
244532
+ notifyDone() {
244533
+ const resolvers = this.doneResolvers;
244534
+ this.doneResolvers = [];
244535
+ resolvers.forEach((r2) => r2());
244536
+ }
245453
244537
  deserializeMarkdown(isNewParagraphNeeded) {
245454
244538
  const lastNode = this.getText()[this.getText().length - 1];
245455
244539
  if (lastNode.type !== "paragraph") {
@@ -245506,6 +244590,7 @@ class MarkdownProcessor {
245506
244590
  async processNextChunk() {
245507
244591
  if (this.chunksQueue.length === 0) {
245508
244592
  this.isProcessingChunk = false;
244593
+ this.notifyDone();
245509
244594
  return;
245510
244595
  }
245511
244596
  this.isProcessingChunk = true;
@@ -245513,6 +244598,7 @@ class MarkdownProcessor {
245513
244598
  if (chunk === "StopProcessingMarkdown") {
245514
244599
  await this.deserializeMarkdownAsync(false);
245515
244600
  this.isProcessingChunk = false;
244601
+ this.notifyDone();
245516
244602
  this.currentNode = "";
245517
244603
  if (this.stopProcessingMarkDownCb) {
245518
244604
  selectWholeText(this.editor);
@@ -245774,10 +244860,22 @@ function setSelectionFontStyle(editor, style) {
245774
244860
  const isAllNodesContainStyle = selectionStyles.every((styleArr) => styleArr.includes(style2));
245775
244861
  const isSomeNodeContainStyle = selectionStyles.some((styleArr) => styleArr.includes(style2));
245776
244862
  const isAllNodesNotContainStyle = selectionStyles.every((styleArr) => !styleArr.includes(style2));
244863
+ let value;
245777
244864
  if (isAllNodesContainStyle) {
245778
- Editor.addMark(editor, style2, false);
244865
+ value = false;
245779
244866
  } else if (isSomeNodeContainStyle || isAllNodesNotContainStyle) {
245780
- Editor.addMark(editor, style2, true);
244867
+ value = true;
244868
+ } else {
244869
+ continue;
244870
+ }
244871
+ const { selection } = editor;
244872
+ if (selection && Range.isExpanded(selection)) {
244873
+ Transforms.setNodes(editor, { [style2]: value }, {
244874
+ match: (n4) => !Editor.isEditor(n4) && n4.type === "text",
244875
+ split: true
244876
+ });
244877
+ } else {
244878
+ Editor.addMark(editor, style2, value);
245781
244879
  }
245782
244880
  }
245783
244881
  }
@@ -246382,6 +245480,589 @@ function setEditorFocus(editor, selectionContext) {
246382
245480
  }
246383
245481
  }
246384
245482
 
245483
+ class TransformationCommand {
245484
+ transformation;
245485
+ operation;
245486
+ reverse;
245487
+ constructor(transformation, operation) {
245488
+ this.transformation = transformation;
245489
+ this.operation = operation;
245490
+ this.reverse = this.getReverse();
245491
+ }
245492
+ merge(op) {
245493
+ this.operation = op;
245494
+ this.reverse = this.getReverse();
245495
+ return this;
245496
+ }
245497
+ apply() {
245498
+ for (const transformation of this.transformation) {
245499
+ transformation.apply(this.operation);
245500
+ }
245501
+ }
245502
+ revert() {
245503
+ this.reverse.forEach(({ item, operation }) => {
245504
+ item.apply(operation);
245505
+ });
245506
+ }
245507
+ getReverse() {
245508
+ const op = this.operation;
245509
+ switch (this.operation.method) {
245510
+ case "applyMatrix": {
245511
+ const op2 = this.operation;
245512
+ return this.transformation.map((t3) => {
245513
+ const itemOp = op2.items.find((i) => i.id === t3.getId());
245514
+ if (!itemOp)
245515
+ return { item: t3, operation: op2 };
245516
+ return {
245517
+ item: t3,
245518
+ operation: {
245519
+ class: "Transformation",
245520
+ method: "applyMatrix",
245521
+ items: [{
245522
+ id: t3.getId(),
245523
+ matrix: {
245524
+ translateX: -itemOp.matrix.translateX,
245525
+ translateY: -itemOp.matrix.translateY,
245526
+ scaleX: 1 / itemOp.matrix.scaleX,
245527
+ scaleY: 1 / itemOp.matrix.scaleY,
245528
+ shearX: 0,
245529
+ shearY: 0
245530
+ }
245531
+ }]
245532
+ }
245533
+ };
245534
+ });
245535
+ }
245536
+ case "translateTo":
245537
+ return mapItemsByOperation(this.transformation, (transformation) => {
245538
+ return {
245539
+ ...this.operation,
245540
+ x: transformation.getTranslation().x,
245541
+ y: transformation.getTranslation().y
245542
+ };
245543
+ });
245544
+ case "translateBy": {
245545
+ const op2 = this.operation;
245546
+ return mapItemsByOperation(this.transformation, () => {
245547
+ return {
245548
+ ...this.operation,
245549
+ x: -op2.x,
245550
+ y: -op2.y
245551
+ };
245552
+ });
245553
+ }
245554
+ case "scaleTo":
245555
+ case "scaleToRelativeTo": {
245556
+ return mapItemsByOperation(this.transformation, (transformation) => {
245557
+ return {
245558
+ ...op,
245559
+ x: transformation.getScale().x,
245560
+ y: transformation.getScale().y
245561
+ };
245562
+ });
245563
+ }
245564
+ case "scaleBy":
245565
+ case "scaleByRelativeTo": {
245566
+ const op2 = this.operation;
245567
+ return mapItemsByOperation(this.transformation, () => {
245568
+ return {
245569
+ ...op2,
245570
+ x: 1 / op2.x,
245571
+ y: 1 / op2.y
245572
+ };
245573
+ });
245574
+ }
245575
+ case "scaleByTranslateBy": {
245576
+ const op2 = this.operation;
245577
+ const scaleTransformation = mapItemsByOperation(this.transformation, () => {
245578
+ const scaleX = 1 / op2.scale.x;
245579
+ const scaleY = 1 / op2.scale.y;
245580
+ const translateX = -op2.translate.x;
245581
+ const translateY = -op2.translate.y;
245582
+ return {
245583
+ ...op2,
245584
+ scale: {
245585
+ x: scaleX,
245586
+ y: scaleY
245587
+ },
245588
+ translate: {
245589
+ x: translateX,
245590
+ y: translateY
245591
+ }
245592
+ };
245593
+ });
245594
+ return scaleTransformation;
245595
+ }
245596
+ case "rotateTo":
245597
+ return mapItemsByOperation(this.transformation, (transformation) => {
245598
+ return {
245599
+ ...this.operation,
245600
+ degree: transformation.getRotation()
245601
+ };
245602
+ });
245603
+ case "rotateBy": {
245604
+ const op2 = this.operation;
245605
+ return mapItemsByOperation(this.transformation, () => {
245606
+ return {
245607
+ ...this.operation,
245608
+ degree: -op2.degree
245609
+ };
245610
+ });
245611
+ }
245612
+ case "transformMany": {
245613
+ const { operation, transformation } = this;
245614
+ return transformation.map((currTrans) => {
245615
+ const op2 = operation.items[currTrans.getId()];
245616
+ const m = op2.method === "applyMatrix" ? op2.matrix : op2.method === "scaleByTranslateBy" ? { translateX: -op2.translate.x, translateY: -op2.translate.y, scaleX: 1 / op2.scale.x, scaleY: 1 / op2.scale.y, shearX: 0, shearY: 0 } : { translateX: 0, translateY: 0, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 };
245617
+ return {
245618
+ item: currTrans,
245619
+ operation: {
245620
+ class: "Transformation",
245621
+ method: "applyMatrix",
245622
+ items: [{
245623
+ id: currTrans.getId(),
245624
+ matrix: {
245625
+ translateX: op2.method === "applyMatrix" ? -m.translateX : m.translateX,
245626
+ translateY: op2.method === "applyMatrix" ? -m.translateY : m.translateY,
245627
+ scaleX: op2.method === "applyMatrix" ? 1 / m.scaleX : m.scaleX,
245628
+ scaleY: op2.method === "applyMatrix" ? 1 / m.scaleY : m.scaleY,
245629
+ shearX: 0,
245630
+ shearY: 0
245631
+ }
245632
+ }]
245633
+ }
245634
+ };
245635
+ });
245636
+ }
245637
+ case "locked": {
245638
+ const op2 = this.operation;
245639
+ return mapItemsByOperation(this.transformation, () => {
245640
+ return {
245641
+ ...op2,
245642
+ item: [...op2.item],
245643
+ method: "unlocked",
245644
+ locked: false
245645
+ };
245646
+ });
245647
+ }
245648
+ case "unlocked": {
245649
+ const op2 = this.operation;
245650
+ return mapItemsByOperation(this.transformation, () => {
245651
+ return {
245652
+ ...op2,
245653
+ item: [...op2.item],
245654
+ method: "locked",
245655
+ locked: true
245656
+ };
245657
+ });
245658
+ }
245659
+ default:
245660
+ return [
245661
+ { item: this.transformation[0], operation: this.operation }
245662
+ ];
245663
+ }
245664
+ }
245665
+ }
245666
+
245667
+ class DefaultTransformationData {
245668
+ translateX;
245669
+ translateY;
245670
+ scaleX;
245671
+ scaleY;
245672
+ rotate;
245673
+ isLocked;
245674
+ constructor(translateX = 0, translateY = 0, scaleX = 1, scaleY = 1, rotate = 0, isLocked = false) {
245675
+ this.translateX = translateX;
245676
+ this.translateY = translateY;
245677
+ this.scaleX = scaleX;
245678
+ this.scaleY = scaleY;
245679
+ this.rotate = rotate;
245680
+ this.isLocked = isLocked;
245681
+ }
245682
+ }
245683
+ var defaultData = new DefaultTransformationData;
245684
+
245685
+ class Transformation {
245686
+ id;
245687
+ events;
245688
+ subject = new SubjectOperation;
245689
+ _matrix = new Matrix2;
245690
+ previous = new Matrix2;
245691
+ rotate = defaultData.rotate;
245692
+ isLocked = false;
245693
+ constructor(id2 = "", events2) {
245694
+ this.id = id2;
245695
+ this.events = events2;
245696
+ }
245697
+ getMatrixData() {
245698
+ const { translateX, translateY, scaleX, scaleY, shearX, shearY } = this._matrix;
245699
+ return { translateX, translateY, scaleX, scaleY, shearX, shearY };
245700
+ }
245701
+ toMatrix() {
245702
+ return this._matrix.copy();
245703
+ }
245704
+ applyToContext(ctx) {
245705
+ this._matrix.applyToContext(ctx);
245706
+ }
245707
+ getTranslation() {
245708
+ return { x: this._matrix.translateX, y: this._matrix.translateY };
245709
+ }
245710
+ getScale() {
245711
+ return { x: this._matrix.scaleX, y: this._matrix.scaleY };
245712
+ }
245713
+ getRotation() {
245714
+ return this.rotate;
245715
+ }
245716
+ setLocal(xOrData, y, scaleX, scaleY) {
245717
+ this.previous = this._matrix.copy();
245718
+ if (typeof xOrData === "object") {
245719
+ if (xOrData.translateX !== undefined)
245720
+ this._matrix.translateX = xOrData.translateX;
245721
+ if (xOrData.translateY !== undefined)
245722
+ this._matrix.translateY = xOrData.translateY;
245723
+ if (xOrData.scaleX !== undefined)
245724
+ this._matrix.scaleX = xOrData.scaleX;
245725
+ if (xOrData.scaleY !== undefined)
245726
+ this._matrix.scaleY = xOrData.scaleY;
245727
+ } else {
245728
+ this._matrix.translateX = xOrData;
245729
+ this._matrix.translateY = y;
245730
+ if (scaleX !== undefined)
245731
+ this._matrix.scaleX = scaleX;
245732
+ if (scaleY !== undefined)
245733
+ this._matrix.scaleY = scaleY;
245734
+ }
245735
+ this.subject.publish(this, {
245736
+ class: "Transformation",
245737
+ method: "applyMatrix",
245738
+ items: [{ id: this.id, matrix: this.getMatrixData() }]
245739
+ });
245740
+ }
245741
+ serialize() {
245742
+ return {
245743
+ translateX: this._matrix.translateX,
245744
+ translateY: this._matrix.translateY,
245745
+ scaleX: this._matrix.scaleX,
245746
+ scaleY: this._matrix.scaleY,
245747
+ rotate: this.rotate,
245748
+ isLocked: this.isLocked
245749
+ };
245750
+ }
245751
+ deserialize(data) {
245752
+ this.previous = this._matrix.copy();
245753
+ if (data.translateX) {
245754
+ this._matrix.translateX = data.translateX;
245755
+ }
245756
+ if (data.translateY) {
245757
+ this._matrix.translateY = data.translateY;
245758
+ }
245759
+ if (data.scaleX) {
245760
+ this._matrix.scaleX = data.scaleX;
245761
+ }
245762
+ if (data.scaleY) {
245763
+ this._matrix.scaleY = data.scaleY;
245764
+ }
245765
+ if (data.isLocked) {
245766
+ this.isLocked = data.isLocked;
245767
+ }
245768
+ if (data.rotate) {
245769
+ this.rotate = data.rotate;
245770
+ }
245771
+ this.subject.publish(this, {
245772
+ class: "Transformation",
245773
+ method: "deserialize",
245774
+ item: [this.id],
245775
+ data
245776
+ });
245777
+ return this;
245778
+ }
245779
+ copy(id2) {
245780
+ const { translateX, translateY, scaleX, scaleY } = this._matrix;
245781
+ const { rotate } = this;
245782
+ return new Transformation(id2 || "", this.events).deserialize({
245783
+ translateX,
245784
+ translateY,
245785
+ scaleX,
245786
+ scaleY,
245787
+ rotate,
245788
+ isLocked: false
245789
+ });
245790
+ }
245791
+ getInverse() {
245792
+ const copy22 = this.copy();
245793
+ copy22._matrix.invert();
245794
+ return copy22;
245795
+ }
245796
+ getId() {
245797
+ return this.id;
245798
+ }
245799
+ setId(id2) {
245800
+ this.id = id2;
245801
+ }
245802
+ emit(operation) {
245803
+ if (this.events) {
245804
+ const command = new TransformationCommand([this], operation);
245805
+ command.apply();
245806
+ this.events.emit(operation, command);
245807
+ } else {
245808
+ this.apply(operation);
245809
+ }
245810
+ }
245811
+ emitMatrix(matrix, timeStamp) {
245812
+ this.emit({
245813
+ class: "Transformation",
245814
+ method: "applyMatrix",
245815
+ items: [{ id: this.id, matrix }],
245816
+ timeStamp
245817
+ });
245818
+ }
245819
+ translateTo(x, y, timeStamp) {
245820
+ if (!this.id) {}
245821
+ this.emitMatrix({
245822
+ translateX: x - this._matrix.translateX,
245823
+ translateY: y - this._matrix.translateY,
245824
+ scaleX: 1,
245825
+ scaleY: 1,
245826
+ shearX: 0,
245827
+ shearY: 0
245828
+ }, timeStamp);
245829
+ }
245830
+ translateBy(x, y, timeStamp) {
245831
+ if (!this.id) {}
245832
+ if (x === 0 && y === 0) {
245833
+ return;
245834
+ }
245835
+ this.emitMatrix({
245836
+ translateX: x,
245837
+ translateY: y,
245838
+ scaleX: 1,
245839
+ scaleY: 1,
245840
+ shearX: 0,
245841
+ shearY: 0
245842
+ }, timeStamp);
245843
+ }
245844
+ scaleTo(x, y, timeStamp) {
245845
+ this.emitMatrix({
245846
+ translateX: 0,
245847
+ translateY: 0,
245848
+ scaleX: x / this._matrix.scaleX,
245849
+ scaleY: y / this._matrix.scaleY,
245850
+ shearX: 0,
245851
+ shearY: 0
245852
+ }, timeStamp);
245853
+ }
245854
+ scaleBy(x, y, timeStamp) {
245855
+ if (x === 0 && y === 0) {
245856
+ return;
245857
+ }
245858
+ this.emitMatrix({
245859
+ translateX: 0,
245860
+ translateY: 0,
245861
+ scaleX: x,
245862
+ scaleY: y,
245863
+ shearX: 0,
245864
+ shearY: 0
245865
+ }, timeStamp);
245866
+ }
245867
+ scaleByTranslateBy(scale, translate, timeStamp) {
245868
+ if (scale.x === 0 && scale.y === 0 && translate.x === 0 && translate.y === 0) {
245869
+ return;
245870
+ }
245871
+ this.emitMatrix({
245872
+ translateX: translate.x,
245873
+ translateY: translate.y,
245874
+ scaleX: scale.x,
245875
+ scaleY: scale.y,
245876
+ shearX: 0,
245877
+ shearY: 0
245878
+ }, timeStamp);
245879
+ }
245880
+ rotateTo(degree, timeStamp) {
245881
+ this.emit({
245882
+ class: "Transformation",
245883
+ method: "rotateTo",
245884
+ item: [this.id],
245885
+ degree,
245886
+ timeStamp
245887
+ });
245888
+ }
245889
+ rotateBy(degree, timeStamp) {
245890
+ this.emit({
245891
+ class: "Transformation",
245892
+ method: "rotateBy",
245893
+ item: [this.id],
245894
+ degree,
245895
+ timeStamp
245896
+ });
245897
+ }
245898
+ scaleToRelativeTo(x, y, _point, timeStamp) {
245899
+ this.emitMatrix({
245900
+ translateX: 0,
245901
+ translateY: 0,
245902
+ scaleX: x / this._matrix.scaleX,
245903
+ scaleY: y / this._matrix.scaleY,
245904
+ shearX: 0,
245905
+ shearY: 0
245906
+ }, timeStamp);
245907
+ }
245908
+ scaleByRelativeTo(x, y, point32, timeStamp) {
245909
+ const { scaleX: sx0, scaleY: sy0, translateX: tx0, translateY: ty0 } = this._matrix;
245910
+ const newSx = sx0 * x;
245911
+ const newSy = sy0 * y;
245912
+ this.emitMatrix({
245913
+ translateX: -point32.x * newSx + point32.x - tx0,
245914
+ translateY: -point32.y * newSy + point32.y - ty0,
245915
+ scaleX: x,
245916
+ scaleY: y,
245917
+ shearX: 0,
245918
+ shearY: 0
245919
+ }, timeStamp);
245920
+ }
245921
+ setIsLocked(isLocked, timestamp) {
245922
+ if (isLocked) {
245923
+ this.emit({
245924
+ class: "Transformation",
245925
+ method: "locked",
245926
+ item: [this.id],
245927
+ locked: true,
245928
+ timestamp
245929
+ });
245930
+ } else {
245931
+ this.emit({
245932
+ class: "Transformation",
245933
+ method: "unlocked",
245934
+ item: [this.id],
245935
+ locked: false,
245936
+ timestamp
245937
+ });
245938
+ }
245939
+ }
245940
+ apply(op) {
245941
+ this.previous = this._matrix.copy();
245942
+ switch (op.method) {
245943
+ case "applyMatrix": {
245944
+ const itemOp = op.items.find((i) => i.id === this.id);
245945
+ if (itemOp) {
245946
+ this._matrix.scale(itemOp.matrix.scaleX, itemOp.matrix.scaleY);
245947
+ this._matrix.translate(itemOp.matrix.translateX, itemOp.matrix.translateY);
245948
+ }
245949
+ break;
245950
+ }
245951
+ case "translateTo":
245952
+ this.applyTranslateTo(op.x, op.y);
245953
+ break;
245954
+ case "translateBy":
245955
+ this.applyTranslateBy(op.x, op.y);
245956
+ break;
245957
+ case "scaleTo":
245958
+ this.applyScaleTo(op.x, op.y);
245959
+ break;
245960
+ case "scaleBy":
245961
+ this.applyScaleBy(op.x, op.y);
245962
+ break;
245963
+ case "scaleToRelativeTo":
245964
+ this.applyScaleToRelativeTo(op.x, op.y, op.point);
245965
+ break;
245966
+ case "scaleByRelativeTo":
245967
+ this.applyScaleByRelativeTo(op.x, op.y, op.point);
245968
+ break;
245969
+ case "scaleByTranslateBy":
245970
+ this.applyScaleByTranslateBy(op.scale, op.translate);
245971
+ break;
245972
+ case "rotateTo":
245973
+ this.applyRotateTo(op.degree);
245974
+ break;
245975
+ case "rotateBy":
245976
+ this.applyRotateBy(op.degree);
245977
+ break;
245978
+ case "transformMany":
245979
+ this.applyTransformMany(op.items[this.id]);
245980
+ break;
245981
+ case "locked":
245982
+ this.applyLocked(op.locked);
245983
+ break;
245984
+ case "unlocked":
245985
+ this.applyUnlocked(op.locked);
245986
+ break;
245987
+ default:
245988
+ return;
245989
+ }
245990
+ this.subject.publish(this, op);
245991
+ }
245992
+ applyTranslateTo(x, y) {
245993
+ this._matrix.translateX = x;
245994
+ this._matrix.translateY = y;
245995
+ }
245996
+ applyTranslateBy(x, y) {
245997
+ this._matrix.translate(x, y);
245998
+ }
245999
+ applyScaleTo(x, y) {
246000
+ this._matrix.scaleX = x;
246001
+ this._matrix.scaleY = y;
246002
+ }
246003
+ applyScaleBy(x, y) {
246004
+ this._matrix.scale(x, y);
246005
+ }
246006
+ applyScaleByTranslateBy(scale, translate) {
246007
+ this._matrix.scale(scale.x, scale.y);
246008
+ this._matrix.translate(translate.x, translate.y);
246009
+ }
246010
+ applyTransformMany(op) {
246011
+ if (op.method === "applyMatrix") {
246012
+ this._matrix.scale(op.matrix.scaleX, op.matrix.scaleY);
246013
+ this._matrix.translate(op.matrix.translateX, op.matrix.translateY);
246014
+ } else if (op.method === "scaleByTranslateBy") {
246015
+ this.applyScaleByTranslateBy(op.scale, op.translate);
246016
+ } else if (op.method === "scaleBy") {
246017
+ this.applyScaleBy(op.x, op.y);
246018
+ } else if (op.method === "translateBy") {
246019
+ this.applyTranslateBy(op.x, op.y);
246020
+ } else if (op.method === "translateTo") {
246021
+ this.applyTranslateTo(op.x, op.y);
246022
+ }
246023
+ }
246024
+ applyScaleByRelativeTo(x, y, point32) {
246025
+ const scaleX = this._matrix.scaleX * x;
246026
+ const scaleY = this._matrix.scaleY * y;
246027
+ this._matrix.translateX = -point32.x * scaleX + point32.x;
246028
+ this._matrix.translateY = -point32.y * scaleY + point32.y;
246029
+ this._matrix.scaleX = scaleX;
246030
+ this._matrix.scaleY = scaleY;
246031
+ }
246032
+ applyScaleToRelativeTo(x, y, point32) {
246033
+ this.applyTranslateBy(-point32.x, -point32.y);
246034
+ this.applyScaleTo(x, y);
246035
+ this.applyTranslateBy(point32.x, point32.y);
246036
+ }
246037
+ applyRotateTo(degree) {
246038
+ if (degree > 0) {
246039
+ while (degree > 360) {
246040
+ degree -= 360;
246041
+ }
246042
+ if (degree === 360) {
246043
+ degree = 0;
246044
+ }
246045
+ } else {
246046
+ while (degree < -360) {
246047
+ degree += 360;
246048
+ }
246049
+ if (degree === -360) {
246050
+ degree = 0;
246051
+ }
246052
+ }
246053
+ this.rotate = degree;
246054
+ }
246055
+ applyRotateBy(degree) {
246056
+ this.applyRotateTo(this.rotate + degree);
246057
+ }
246058
+ applyLocked(locked7) {
246059
+ this.isLocked = locked7;
246060
+ }
246061
+ applyUnlocked(locked7) {
246062
+ this.isLocked = locked7;
246063
+ }
246064
+ }
246065
+
246385
246066
  class ShapeCommand {
246386
246067
  shape;
246387
246068
  operation;
@@ -246714,6 +246395,145 @@ function applyRedo(board, operation) {
246714
246395
  addOperationHandler("undo", applyUndo);
246715
246396
  addOperationHandler("redo", applyRedo);
246716
246397
 
246398
+ class ConnectorCommand {
246399
+ connector;
246400
+ operation;
246401
+ reverse;
246402
+ constructor(connector, operation) {
246403
+ this.connector = connector;
246404
+ this.operation = operation;
246405
+ this.reverse = this.getReverse();
246406
+ }
246407
+ merge(op) {
246408
+ this.operation = op;
246409
+ return this;
246410
+ }
246411
+ apply() {
246412
+ for (const connector of this.connector) {
246413
+ connector.apply(this.operation);
246414
+ }
246415
+ }
246416
+ revert() {
246417
+ for (const { item, operation } of this.reverse) {
246418
+ item.apply(operation);
246419
+ }
246420
+ }
246421
+ getReverse() {
246422
+ const reverse = [];
246423
+ switch (this.operation.method) {
246424
+ case "setStartPoint":
246425
+ for (const connector of this.connector) {
246426
+ reverse.push({
246427
+ item: connector,
246428
+ operation: {
246429
+ ...this.operation,
246430
+ startPointData: connector.getStartPoint().serialize()
246431
+ }
246432
+ });
246433
+ }
246434
+ break;
246435
+ case "setEndPoint":
246436
+ for (const connector of this.connector) {
246437
+ reverse.push({
246438
+ item: connector,
246439
+ operation: {
246440
+ ...this.operation,
246441
+ endPointData: connector.getEndPoint().serialize()
246442
+ }
246443
+ });
246444
+ }
246445
+ break;
246446
+ case "setMiddlePoint":
246447
+ for (const connector of this.connector) {
246448
+ const middlePoint = connector.getMiddlePoint();
246449
+ reverse.push({
246450
+ item: connector,
246451
+ operation: {
246452
+ ...this.operation,
246453
+ middlePointData: middlePoint ? middlePoint.serialize() : null
246454
+ }
246455
+ });
246456
+ }
246457
+ break;
246458
+ case "setStartPointerStyle":
246459
+ for (const connector of this.connector) {
246460
+ reverse.push({
246461
+ item: connector,
246462
+ operation: {
246463
+ ...this.operation,
246464
+ startPointerStyle: connector.getStartPointerStyle()
246465
+ }
246466
+ });
246467
+ }
246468
+ break;
246469
+ case "setEndPointerStyle":
246470
+ for (const connector of this.connector) {
246471
+ reverse.push({
246472
+ item: connector,
246473
+ operation: {
246474
+ ...this.operation,
246475
+ endPointerStyle: connector.getEndPointerStyle()
246476
+ }
246477
+ });
246478
+ }
246479
+ break;
246480
+ case "setLineStyle":
246481
+ for (const connector of this.connector) {
246482
+ reverse.push({
246483
+ item: connector,
246484
+ operation: {
246485
+ ...this.operation,
246486
+ lineStyle: connector.getLineStyle()
246487
+ }
246488
+ });
246489
+ }
246490
+ break;
246491
+ case "setBorderStyle":
246492
+ for (const connector of this.connector) {
246493
+ reverse.push({
246494
+ item: connector,
246495
+ operation: {
246496
+ ...this.operation,
246497
+ borderStyle: connector.getBorderStyle()
246498
+ }
246499
+ });
246500
+ }
246501
+ break;
246502
+ case "setLineWidth":
246503
+ for (const connector of this.connector) {
246504
+ reverse.push({
246505
+ item: connector,
246506
+ operation: {
246507
+ ...this.operation,
246508
+ lineWidth: connector.getLineWidth()
246509
+ }
246510
+ });
246511
+ }
246512
+ break;
246513
+ case "setLineColor":
246514
+ for (const connector of this.connector) {
246515
+ reverse.push({
246516
+ item: connector,
246517
+ operation: {
246518
+ ...this.operation,
246519
+ lineColor: connector.getLineColor()
246520
+ }
246521
+ });
246522
+ }
246523
+ break;
246524
+ case "switchPointers":
246525
+ for (const connector of this.connector) {
246526
+ reverse.push({
246527
+ item: connector,
246528
+ operation: this.operation
246529
+ });
246530
+ }
246531
+ break;
246532
+ }
246533
+ return reverse;
246534
+ }
246535
+ }
246536
+
246717
246537
  class DrawingCommand {
246718
246538
  item;
246719
246539
  operation;
@@ -246955,8 +246775,13 @@ class CommentCommand {
246955
246775
  }
246956
246776
  }
246957
246777
  }
246958
- var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
246959
- var native_default = { randomUUID };
246778
+ var byteToHex = [];
246779
+ for (let i = 0;i < 256; ++i) {
246780
+ byteToHex.push((i + 256).toString(16).slice(1));
246781
+ }
246782
+ function unsafeStringify(arr2, offset = 0) {
246783
+ return (byteToHex[arr2[offset + 0]] + byteToHex[arr2[offset + 1]] + byteToHex[arr2[offset + 2]] + byteToHex[arr2[offset + 3]] + "-" + byteToHex[arr2[offset + 4]] + byteToHex[arr2[offset + 5]] + "-" + byteToHex[arr2[offset + 6]] + byteToHex[arr2[offset + 7]] + "-" + byteToHex[arr2[offset + 8]] + byteToHex[arr2[offset + 9]] + "-" + byteToHex[arr2[offset + 10]] + byteToHex[arr2[offset + 11]] + byteToHex[arr2[offset + 12]] + byteToHex[arr2[offset + 13]] + byteToHex[arr2[offset + 14]] + byteToHex[arr2[offset + 15]]).toLowerCase();
246784
+ }
246960
246785
  var getRandomValues;
246961
246786
  var rnds8 = new Uint8Array(16);
246962
246787
  function rng() {
@@ -246968,13 +246793,8 @@ function rng() {
246968
246793
  }
246969
246794
  return getRandomValues(rnds8);
246970
246795
  }
246971
- var byteToHex = [];
246972
- for (let i = 0;i < 256; ++i) {
246973
- byteToHex.push((i + 256).toString(16).slice(1));
246974
- }
246975
- function unsafeStringify(arr2, offset = 0) {
246976
- return (byteToHex[arr2[offset + 0]] + byteToHex[arr2[offset + 1]] + byteToHex[arr2[offset + 2]] + byteToHex[arr2[offset + 3]] + "-" + byteToHex[arr2[offset + 4]] + byteToHex[arr2[offset + 5]] + "-" + byteToHex[arr2[offset + 6]] + byteToHex[arr2[offset + 7]] + "-" + byteToHex[arr2[offset + 8]] + byteToHex[arr2[offset + 9]] + "-" + byteToHex[arr2[offset + 10]] + byteToHex[arr2[offset + 11]] + byteToHex[arr2[offset + 12]] + byteToHex[arr2[offset + 13]] + byteToHex[arr2[offset + 14]] + byteToHex[arr2[offset + 15]]).toLowerCase();
246977
- }
246796
+ var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
246797
+ var native_default = { randomUUID };
246978
246798
  function v4(options2, buf, offset) {
246979
246799
  if (native_default.randomUUID && !buf && !options2) {
246980
246800
  return native_default.randomUUID();
@@ -247225,12 +247045,11 @@ class Comment {
247225
247045
  });
247226
247046
  }
247227
247047
  transform() {
247228
- const matrix = this.transformation.matrix;
247229
- if (matrix.translateX && matrix.translateY) {
247230
- this.anchor = new Point3(matrix.translateX, matrix.translateY);
247048
+ const { translateX, translateY } = this.transformation.getMatrixData();
247049
+ if (translateX && translateY) {
247050
+ this.anchor = new Point3(translateX, translateY);
247231
247051
  } else {
247232
- matrix.translateX = this.anchor.x;
247233
- matrix.translateY = this.anchor.y;
247052
+ this.transformation.setLocal(this.anchor.x, this.anchor.y);
247234
247053
  }
247235
247054
  }
247236
247055
  getUnreadMessages(userId = ANONYMOUS_ID) {
@@ -247339,7 +247158,7 @@ class Comment {
247339
247158
  render(context) {}
247340
247159
  renderHTML(documentFactory) {
247341
247160
  const div = documentFactory.createElement("comment-item");
247342
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
247161
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
247343
247162
  const transform = `translate(${translateX}px, ${translateY}px) scale(${scaleX}, ${scaleY})`;
247344
247163
  div.style.transformOrigin = "top left";
247345
247164
  div.style.transform = transform;
@@ -248488,18 +248307,25 @@ class RTreeIndex {
248488
248307
  }
248489
248308
  }
248490
248309
 
248491
- class Container extends Mbr {
248310
+ class Container {
248492
248311
  id;
248493
248312
  item;
248494
248313
  layer;
248495
248314
  zIndex;
248315
+ left;
248316
+ top;
248317
+ right;
248318
+ bottom;
248496
248319
  constructor(id2, item, layer, zIndex) {
248497
- const rect = item.getMbrWithChildren();
248498
- super(rect.left, rect.top, rect.right, rect.bottom);
248499
248320
  this.id = id2;
248500
248321
  this.item = item;
248501
248322
  this.layer = layer;
248502
248323
  this.zIndex = zIndex;
248324
+ const rect = item.getMbrWithChildren();
248325
+ this.left = rect.left;
248326
+ this.top = rect.top;
248327
+ this.right = rect.right;
248328
+ this.bottom = rect.bottom;
248503
248329
  }
248504
248330
  }
248505
248331
 
@@ -249846,7 +249672,7 @@ class BaseItem extends Mbr {
249846
249672
  }
249847
249673
  renderHTML(documentFactory) {
249848
249674
  const div = documentFactory.createElement("base-item");
249849
- const { translateX, translateY } = this.transformation.matrix;
249675
+ const { translateX, translateY } = this.transformation.getMatrixData();
249850
249676
  const transform = `translate(${translateX}px, ${translateY}px) scale(1, 1)`;
249851
249677
  div.style.backgroundColor = "#b2b0c3";
249852
249678
  div.id = this.getId();
@@ -249987,7 +249813,7 @@ class RichText extends BaseItem {
249987
249813
  mbr.right += 20;
249988
249814
  mbr.bottom += 20;
249989
249815
  }
249990
- const linkMbr = mbr.getTransformed(this.transformation.matrix);
249816
+ const linkMbr = mbr.getTransformed(this.transformation.toMatrix());
249991
249817
  if (linkMbr.isUnderPoint(point32)) {
249992
249818
  return { hyperLink, linkMbr };
249993
249819
  }
@@ -250184,12 +250010,13 @@ class RichText extends BaseItem {
250184
250010
  return this.shrinkWidth;
250185
250011
  }
250186
250012
  getTransformedContainer() {
250187
- let matrix = this.transformation.matrix;
250188
250013
  if (this.insideOf === "Frame") {
250014
+ const { translateX, translateY, scaleX } = this.transformation.getMatrixData();
250189
250015
  const scaleY = this.getMbr().getHeight() * 2 / 10;
250190
- matrix = new Matrix2(matrix.translateX, matrix.translateY, matrix.scaleX, scaleY);
250016
+ const matrix = new Matrix2(translateX, translateY, scaleX, scaleY);
250017
+ return this.container.getTransformed(matrix);
250191
250018
  }
250192
- return this.container.getTransformed(matrix);
250019
+ return this.container.getTransformed(this.transformation.toMatrix());
250193
250020
  }
250194
250021
  emitWithoutApplying = (op) => {
250195
250022
  if (this.board.events) {
@@ -250550,7 +250377,7 @@ class RichText extends BaseItem {
250550
250377
  ctx.translate(this.left, this.top);
250551
250378
  const shouldScale = !this.isInShape && !this.autoSize;
250552
250379
  if (shouldScale) {
250553
- const { scaleX, scaleY } = this.transformation.matrix;
250380
+ const { scaleX, scaleY } = this.transformation.getMatrixData();
250554
250381
  ctx.scale(scaleX, scaleY);
250555
250382
  }
250556
250383
  const shouldClip = this.insideOf === "Shape" || this.insideOf === "Sticker";
@@ -250683,7 +250510,7 @@ class RichText extends BaseItem {
250683
250510
  return unsafe.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
250684
250511
  };
250685
250512
  const elements = this.editor.editor.children.map(renderNode);
250686
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
250513
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
250687
250514
  const transform = `translate(${translateX}px, ${translateY}px) scale(${scaleX}, ${scaleY})`;
250688
250515
  const transformedWidth = this.getTransformedContainer().getWidth();
250689
250516
  const transformedHeight = this.getTransformedContainer().getHeight();
@@ -250781,6 +250608,250 @@ class RichText extends BaseItem {
250781
250608
  return this.prevMbr;
250782
250609
  }
250783
250610
  }
250611
+ function updateRects(board, ref, mbr, verticalOffset, horizontalOffset, fit = "contextPanel") {
250612
+ const { selection, camera } = board;
250613
+ const panel = ref.current;
250614
+ const selectionMbr = mbr ?? selection.getMbr();
250615
+ const selectionItems = selection.items;
250616
+ const richTextSelection = selectionItems.getSingle() instanceof RichText ? selectionItems.list()[0] : undefined;
250617
+ if (panel && selectionMbr) {
250618
+ if (fit === "contextPanel") {
250619
+ const panelRect = getContextPanelRect(selectionMbr, camera, panel, !!richTextSelection, horizontalOffset, verticalOffset);
250620
+ return panelRect;
250621
+ }
250622
+ if (fit === "linkToBtn") {
250623
+ if (!mbr) {
250624
+ return null;
250625
+ }
250626
+ const panelRect = fitLinkToBtn(selectionMbr.getTransformed(camera.getMatrix()), camera.window.getMbr(), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
250627
+ return panelRect;
250628
+ }
250629
+ if (fit === "comment") {
250630
+ if (!mbr) {
250631
+ return null;
250632
+ }
250633
+ const panelRect = fitComment(selectionMbr.getTransformed(camera.getMatrix()), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
250634
+ return panelRect;
250635
+ }
250636
+ if (fit === "threadPanel") {
250637
+ if (!mbr) {
250638
+ return null;
250639
+ }
250640
+ const panelRect = fitThreadPanel(selectionMbr.getTransformed(camera.getMatrix()), camera.window.getMbr(), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
250641
+ return panelRect;
250642
+ }
250643
+ if (fit === "boardMenu") {
250644
+ if (!mbr) {
250645
+ return null;
250646
+ }
250647
+ const panelRect = fitBoardMenu(selectionMbr.getTransformed(camera.getMatrix()), camera.window.getMbr(), Mbr.fromDomRect(panel.getBoundingClientRect()), verticalOffset, horizontalOffset);
250648
+ return panelRect;
250649
+ }
250650
+ if (fit === "hyperLink") {
250651
+ if (!mbr) {
250652
+ return null;
250653
+ }
250654
+ const panelRect = fitHyperLink(selectionMbr.getTransformed(camera.getMatrix()), Mbr.fromDomRect(panel.getBoundingClientRect()), camera.window.getMbr(), verticalOffset);
250655
+ return panelRect;
250656
+ }
250657
+ }
250658
+ return null;
250659
+ }
250660
+ function getContextPanelRect(selectionMbr, camera, panel, toLeft, horizontalOffset, verticalOffset) {
250661
+ const transformedMbr = selectionMbr.getTransformed(camera.getMatrix());
250662
+ const windowMbr = camera.window.getMbr();
250663
+ const panelRectFromDom = Mbr.fromDomRect(panel.getBoundingClientRect());
250664
+ const panelRect = toLeft ? fitContextPanelToLeft(transformedMbr, windowMbr, panelRectFromDom, verticalOffset, horizontalOffset) : fitContextPanelToCenter(transformedMbr, windowMbr, panelRectFromDom, verticalOffset, horizontalOffset);
250665
+ return panelRect;
250666
+ }
250667
+ function fitContextPanelToLeft(selectionMbr, view, panel, verticalOffset = 40, horizontalOffset = 80) {
250668
+ const panelHeight = panel.getHeight();
250669
+ const panelWidth = panel.getWidth();
250670
+ const newPanel = new Mbr;
250671
+ const topSpace = selectionMbr.top - view.top;
250672
+ const hasEnoughTopSpace = topSpace >= panelHeight + verticalOffset;
250673
+ if (hasEnoughTopSpace) {
250674
+ newPanel.top = selectionMbr.top - panelHeight - verticalOffset;
250675
+ if (newPanel.top < view.top) {
250676
+ newPanel.top = view.top + verticalOffset;
250677
+ }
250678
+ } else {
250679
+ const usePanelTop = panel.top > 1 && panel.top > selectionMbr.top + verticalOffset;
250680
+ newPanel.top = usePanelTop ? panel.top : selectionMbr.bottom + verticalOffset;
250681
+ const isOverflowingBottom = newPanel.top + panelHeight > view.bottom;
250682
+ const isLargeOffsetForRichText = newPanel.top >= selectionMbr.bottom + verticalOffset * 2;
250683
+ if (isOverflowingBottom || isLargeOffsetForRichText) {
250684
+ newPanel.top = selectionMbr.bottom - (panelHeight + verticalOffset);
250685
+ }
250686
+ }
250687
+ newPanel.bottom = newPanel.top + panelHeight;
250688
+ fitContextPanelInViewRect(newPanel, view, verticalOffset);
250689
+ const itemMbr = selectionMbr.getMbr();
250690
+ newPanel.left = itemMbr.left;
250691
+ adjustPanelHorizontal(newPanel, panelWidth, view, horizontalOffset);
250692
+ return newPanel;
250693
+ }
250694
+ function fitContextPanelToCenter(selectionMbr, view, panel, verticalOffset = 40, horizontalOffset = 80) {
250695
+ const panelHeight = panel.getHeight();
250696
+ const panelWidth = panel.getWidth();
250697
+ const newPanel = new Mbr;
250698
+ const topSpace = selectionMbr.top - view.top;
250699
+ const bottomSpace = view.bottom - selectionMbr.bottom;
250700
+ const shouldPlaceAbove = topSpace > bottomSpace - panelHeight;
250701
+ if (shouldPlaceAbove) {
250702
+ newPanel.top = selectionMbr.top - panelHeight - verticalOffset;
250703
+ if (newPanel.top < view.top) {
250704
+ newPanel.top = view.top + verticalOffset;
250705
+ }
250706
+ } else {
250707
+ newPanel.top = selectionMbr.bottom + verticalOffset;
250708
+ const isOverflowingBottom = newPanel.top + panelHeight > view.bottom;
250709
+ const isLargeOffsetForRichText = newPanel.top >= selectionMbr.bottom + verticalOffset * 2;
250710
+ if (isOverflowingBottom || isLargeOffsetForRichText) {
250711
+ newPanel.top = selectionMbr.bottom - (panelHeight + verticalOffset);
250712
+ }
250713
+ }
250714
+ newPanel.bottom = newPanel.top + panelHeight;
250715
+ fitContextPanelInViewRect(newPanel, view, verticalOffset);
250716
+ const itemCenter = selectionMbr.getCenter();
250717
+ newPanel.left = itemCenter.x - panelWidth / 2;
250718
+ adjustPanelHorizontal(newPanel, panelWidth, view, horizontalOffset);
250719
+ return newPanel;
250720
+ }
250721
+ function adjustPanelHorizontal(newPanel, panelWidth, view, horizontalOffset) {
250722
+ newPanel.right = newPanel.left + panelWidth;
250723
+ if (newPanel.left < view.left + horizontalOffset) {
250724
+ newPanel.left = view.left + horizontalOffset;
250725
+ } else if (newPanel.right + horizontalOffset > view.right) {
250726
+ newPanel.left = view.right - (panelWidth + horizontalOffset);
250727
+ }
250728
+ newPanel.right = newPanel.left + panelWidth;
250729
+ }
250730
+ function fitContextPanelInViewRect(panel, view, verticalOffset) {
250731
+ const panelHeight = panel.getHeight();
250732
+ if (panel.top <= view.top + verticalOffset) {
250733
+ panel.top = view.top + 2 * verticalOffset;
250734
+ panel.bottom = panel.top + panelHeight;
250735
+ }
250736
+ if (panel.bottom >= view.bottom - verticalOffset) {
250737
+ panel.bottom = view.bottom - 2 * verticalOffset;
250738
+ panel.top = panel.bottom - panelHeight;
250739
+ }
250740
+ }
250741
+ function fitLinkToBtn(itemMbr, view, panel, verticalOffset = -2, horizontalOffset = -2) {
250742
+ const panelHeight = panel.getHeight();
250743
+ const newPanel = new Mbr;
250744
+ newPanel.top = itemMbr.top - panelHeight - verticalOffset;
250745
+ newPanel.top = newPanel.top + panelHeight;
250746
+ newPanel.bottom = newPanel.top + panelHeight * 2;
250747
+ const panelWidth = panel.getWidth();
250748
+ newPanel.left = itemMbr.right - panelWidth + horizontalOffset;
250749
+ return newPanel;
250750
+ }
250751
+ function fitHyperLink(linkMbr, panel, view, offset = 20) {
250752
+ const panelHeight = panel.getHeight();
250753
+ const newPanel = new Mbr;
250754
+ newPanel.top = linkMbr.bottom;
250755
+ newPanel.bottom = panelHeight + newPanel.top;
250756
+ const panelWidth = panel.getWidth();
250757
+ newPanel.left = linkMbr.left;
250758
+ newPanel.right = newPanel.left + panelWidth;
250759
+ return newPanel;
250760
+ }
250761
+ function fitComment(anchor, panel, verticalOffset = 0, horizontalOffset = 0) {
250762
+ const panelHeight = panel.getHeight();
250763
+ const newPanel = new Mbr;
250764
+ newPanel.top = anchor.top - panelHeight - verticalOffset;
250765
+ newPanel.bottom = newPanel.top + panelHeight;
250766
+ const panelWidth = panel.getWidth();
250767
+ newPanel.left = anchor.left - panelWidth / 2 - horizontalOffset;
250768
+ newPanel.right = newPanel.left + panelWidth;
250769
+ return newPanel;
250770
+ }
250771
+ function fitBoardMenu(anchor, view, panel, verticalOffset = 20, horizontalOffset = 20) {
250772
+ const panelHeight = panel.getHeight();
250773
+ const panelWidth = panel.getWidth();
250774
+ const newPanel = new Mbr;
250775
+ newPanel.top = anchor.top;
250776
+ newPanel.bottom = newPanel.top + panelHeight;
250777
+ if (newPanel.bottom > view.bottom - verticalOffset) {
250778
+ newPanel.bottom = view.bottom - verticalOffset;
250779
+ newPanel.top = newPanel.bottom - panelHeight;
250780
+ }
250781
+ newPanel.left = anchor.left;
250782
+ newPanel.right = newPanel.left + panelWidth;
250783
+ if (newPanel.right > view.right - horizontalOffset) {
250784
+ newPanel.right = view.right - horizontalOffset;
250785
+ newPanel.left = newPanel.right - panelWidth;
250786
+ }
250787
+ return newPanel;
250788
+ }
250789
+ function fitThreadPanel(anchor, view, panel, verticalOffset = 50, horizontalOffset = 50) {
250790
+ const panelHeight = panel.getHeight();
250791
+ const panelWidth = panel.getWidth();
250792
+ const newPanel = new Mbr;
250793
+ newPanel.top = anchor.top - panelHeight / 2;
250794
+ if (newPanel.top < view.top + verticalOffset) {
250795
+ newPanel.top = view.top + verticalOffset;
250796
+ }
250797
+ newPanel.bottom = newPanel.top + panelHeight;
250798
+ if (newPanel.bottom > view.bottom - verticalOffset) {
250799
+ newPanel.bottom = view.bottom - verticalOffset;
250800
+ newPanel.top = newPanel.bottom - panelHeight;
250801
+ }
250802
+ newPanel.left = anchor.left;
250803
+ newPanel.right = newPanel.left + panelWidth;
250804
+ if (newPanel.right > view.right - horizontalOffset) {
250805
+ newPanel.right = anchor.right;
250806
+ newPanel.left = newPanel.right - panelWidth;
250807
+ }
250808
+ return newPanel;
250809
+ }
250810
+
250811
+ class DrawingContext2 {
250812
+ camera;
250813
+ ctx;
250814
+ cursorCtx;
250815
+ matrix;
250816
+ isBorderInvisible = false;
250817
+ shapeVisibilityTreshold = 3;
250818
+ rectangleVisibilyTreshold = 2;
250819
+ constructor(camera, ctx, cursorCtx, matrix = new Matrix2) {
250820
+ this.camera = camera;
250821
+ this.ctx = ctx;
250822
+ this.cursorCtx = cursorCtx;
250823
+ this.matrix = matrix;
250824
+ this.setCamera(camera);
250825
+ }
250826
+ dpi() {
250827
+ return conf.getDPI();
250828
+ }
250829
+ setCamera(camera) {
250830
+ this.camera = camera;
250831
+ this.matrix = camera.getMatrix();
250832
+ const scale = this.matrix.scaleX;
250833
+ this.isBorderInvisible = 4 * scale < 0.1;
250834
+ }
250835
+ clear() {
250836
+ this.ctx.setTransform(1 * this.dpi(), 0, 0, 1 * this.dpi(), 0, 0);
250837
+ this.ctx.clearRect(0, 0, conf.getDocumentWidth(), conf.getDocumentHeight());
250838
+ this.matrix.applyToContext(this.ctx);
250839
+ }
250840
+ clearCursor() {
250841
+ if (!this.cursorCtx) {
250842
+ return;
250843
+ }
250844
+ this.cursorCtx.setTransform(1 * this.dpi(), 0, 0, 1 * this.dpi(), 0, 0);
250845
+ this.cursorCtx.clearRect(0, 0, conf.getDocumentWidth(), conf.getDocumentHeight());
250846
+ this.matrix.applyToContext(this.cursorCtx);
250847
+ }
250848
+ applyChanges() {
250849
+ this.matrix.applyToContext(this.ctx);
250850
+ }
250851
+ getCameraScale() {
250852
+ return this.camera.getScale();
250853
+ }
250854
+ }
250784
250855
 
250785
250856
  class Schema {
250786
250857
  constructor(property, normal, space) {
@@ -262271,10 +262342,10 @@ function zwitch(key, options2) {
262271
262342
  const settings = options2 || {};
262272
262343
  function one4(value, ...parameters) {
262273
262344
  let fn = one4.invalid;
262274
- const handlers3 = one4.handlers;
262345
+ const handlers2 = one4.handlers;
262275
262346
  if (value && own6.call(value, key)) {
262276
262347
  const id2 = String(value[key]);
262277
- fn = own6.call(handlers3, id2) ? handlers3[id2] : one4.unknown;
262348
+ fn = own6.call(handlers2, id2) ? handlers2[id2] : one4.unknown;
262278
262349
  }
262279
262350
  if (fn) {
262280
262351
  return fn.call(this, value, ...parameters);
@@ -263625,17 +263696,17 @@ class AINode extends BaseItem {
263625
263696
  }
263626
263697
  transformPath() {
263627
263698
  const { left, right, top, bottom } = this.text.getTransformedContainer();
263628
- const { scaleX, scaleY } = this.transformation.matrix;
263699
+ const { scaleX, scaleY, translateX: nodeTranslateX, translateY: nodeTranslateY } = this.transformation.getMatrixData();
263629
263700
  const minScale = Math.min(scaleX, scaleY);
263630
263701
  const leftOffset = 20 * minScale;
263631
263702
  const topOffset = 20 * minScale;
263632
263703
  const nodeRight = right + 80 * minScale;
263633
263704
  const nodeBottom = bottom + (bottom - top > 400 ? 60 : 40) * minScale;
263634
263705
  if (!this.path || this.text.left < this.path.getMbr().left + leftOffset && this.text.top < this.path.getMbr().top + topOffset) {
263635
- this.text.left = this.transformation.matrix.translateX + leftOffset;
263636
- this.text.top = this.transformation.matrix.translateY + topOffset;
263706
+ this.text.left = nodeTranslateX + leftOffset;
263707
+ this.text.top = nodeTranslateY + topOffset;
263637
263708
  }
263638
- this.path = createNodePath(new Mbr(left, top, nodeRight, nodeBottom), this.transformation.matrix);
263709
+ this.path = createNodePath(new Mbr(left, top, nodeRight, nodeBottom), this.transformation.toMatrix());
263639
263710
  const scaledSize = BUTTON_SIZE * minScale;
263640
263711
  this.buttonMbr = new Mbr(nodeRight - scaledSize * 2, nodeBottom - scaledSize * 2, nodeRight - scaledSize, nodeBottom - scaledSize);
263641
263712
  }
@@ -263796,7 +263867,7 @@ class AINode extends BaseItem {
263796
263867
  }
263797
263868
  renderHTML(documentFactory) {
263798
263869
  const div = documentFactory.createElement("ainode-item");
263799
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
263870
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
263800
263871
  const mbr = this.getMbr();
263801
263872
  const width = mbr.getWidth();
263802
263873
  const height = mbr.getHeight();
@@ -265253,7 +265324,7 @@ class Connector2 extends BaseItem {
265253
265324
  }
265254
265325
  renderHTML(documentFactory) {
265255
265326
  const div = documentFactory.createElement("connector-item");
265256
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
265327
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
265257
265328
  const mbr = this.getMbr();
265258
265329
  const width = mbr.getWidth();
265259
265330
  const height = mbr.getHeight();
@@ -265318,7 +265389,7 @@ class Connector2 extends BaseItem {
265318
265389
  return div;
265319
265390
  }
265320
265391
  renderPathHTML(documentFactory, path22) {
265321
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
265392
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
265322
265393
  const pathElement = path22.renderHTML(documentFactory);
265323
265394
  const paths = Array.isArray(pathElement) ? pathElement : [pathElement];
265324
265395
  paths.forEach((element4) => {
@@ -265340,8 +265411,7 @@ class Connector2 extends BaseItem {
265340
265411
  text5.transformation = undefined;
265341
265412
  const mbr = this.getMbr();
265342
265413
  const transformation = new Transformation;
265343
- transformation.matrix.translateX = mbr.left;
265344
- transformation.matrix.translateY = mbr.top;
265414
+ transformation.setLocal(mbr.left, mbr.top);
265345
265415
  return {
265346
265416
  itemType: "Connector",
265347
265417
  transformation: transformation.serialize(),
@@ -265421,7 +265491,7 @@ class Connector2 extends BaseItem {
265421
265491
  previous22.translateX = 0;
265422
265492
  previous22.translateY = 0;
265423
265493
  previous22.invert();
265424
- const currUnscaled = this.transformation.matrix.copy();
265494
+ const currUnscaled = this.transformation.toMatrix();
265425
265495
  currUnscaled.translateX = 0;
265426
265496
  currUnscaled.translateY = 0;
265427
265497
  const delta = previous22.multiplyByMatrix(currUnscaled);
@@ -265448,7 +265518,7 @@ class Connector2 extends BaseItem {
265448
265518
  previous22.scaleX = 1;
265449
265519
  previous22.scaleY = 1;
265450
265520
  previous22.invert();
265451
- const currUnscaled = this.transformation.matrix.copy();
265521
+ const currUnscaled = this.transformation.toMatrix();
265452
265522
  currUnscaled.scaleX = 1;
265453
265523
  currUnscaled.scaleY = 1;
265454
265524
  const delta = previous22.multiplyByMatrix(currUnscaled);
@@ -267322,7 +267392,7 @@ class Shape extends BaseItem {
267322
267392
  }
267323
267393
  renderHTML(documentFactory) {
267324
267394
  const div = documentFactory.createElement("shape-item");
267325
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
267395
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
267326
267396
  const mbr = this.getMbr();
267327
267397
  const width = mbr.getWidth();
267328
267398
  const height = mbr.getHeight();
@@ -267411,8 +267481,8 @@ class Shape extends BaseItem {
267411
267481
  this.path = Shapes[this.shapeType].createPath(this.mbr);
267412
267482
  this.textContainer = Shapes[this.shapeType].textBounds.copy();
267413
267483
  this.text.setContainer(this.textContainer.copy());
267414
- this.textContainer.transform(this.transformation.matrix);
267415
- this.path.transform(this.transformation.matrix);
267484
+ this.textContainer.transform(this.transformation.toMatrix());
267485
+ this.path.transform(this.transformation.toMatrix());
267416
267486
  this.path.setBackgroundColor(this.backgroundColor);
267417
267487
  this.path.setBackgroundOpacity(this.backgroundOpacity);
267418
267488
  this.path.setBorderColor(this.borderColor);
@@ -267427,7 +267497,7 @@ class Shape extends BaseItem {
267427
267497
  const anchorPoints = Shapes[this.shapeType].anchorPoints;
267428
267498
  const points = [];
267429
267499
  for (const anchorPoint of anchorPoints) {
267430
- points.push(anchorPoint.getTransformed(this.transformation.matrix));
267500
+ points.push(anchorPoint.getTransformed(this.transformation.toMatrix()));
267431
267501
  }
267432
267502
  return points;
267433
267503
  }
@@ -267595,10 +267665,9 @@ class Sticker extends BaseItem {
267595
267665
  }
267596
267666
  this.stickerPath = StickerShape.stickerPath.copy();
267597
267667
  this.textContainer = StickerShape.textBounds.copy();
267598
- const matrix = this.transformation.matrix;
267599
- this.stickerPath.transform(matrix);
267668
+ this.stickerPath.transform(this.transformation.toMatrix());
267600
267669
  this.text.setContainer(this.textContainer.copy());
267601
- this.textContainer.transform(this.transformation.matrix);
267670
+ this.textContainer.transform(this.transformation.toMatrix());
267602
267671
  this.stickerPath.setBackgroundColor(this.backgroundColor);
267603
267672
  this.saveStickerData();
267604
267673
  }
@@ -267699,7 +267768,7 @@ class Sticker extends BaseItem {
267699
267768
  }
267700
267769
  renderHTML(documentFactory) {
267701
267770
  const div = documentFactory.createElement("sticker-item");
267702
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
267771
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
267703
267772
  const transform = `translate(${Math.round(translateX)}px, ${Math.round(translateY)}px) scale(${scaleX}, ${scaleY})`;
267704
267773
  const itemMbr = this.getMbr();
267705
267774
  const height2 = itemMbr.getHeight();
@@ -267780,7 +267849,7 @@ class Sticker extends BaseItem {
267780
267849
  const anchorPoints = StickerShape.anchorPoints;
267781
267850
  const points = [];
267782
267851
  for (const anchorPoint of anchorPoints) {
267783
- points.push(anchorPoint.getTransformed(this.transformation.matrix));
267852
+ points.push(anchorPoint.getTransformed(this.transformation.toMatrix()));
267784
267853
  }
267785
267854
  return points;
267786
267855
  }
@@ -267794,20 +267863,7 @@ class Sticker extends BaseItem {
267794
267863
  if (line.end.y < line.start.y) {
267795
267864
  y -= l2 * height;
267796
267865
  }
267797
- this.transformation.apply({
267798
- class: "Transformation",
267799
- method: "translateTo",
267800
- item: [this.id],
267801
- x,
267802
- y
267803
- });
267804
- this.transformation.apply({
267805
- class: "Transformation",
267806
- method: "scaleTo",
267807
- item: [this.id],
267808
- x: l2,
267809
- y: l2
267810
- });
267866
+ this.transformation.setLocal(x, y, l2, l2);
267811
267867
  this.saveStickerData();
267812
267868
  }
267813
267869
  applyTransformToCenter(pt, newWidth) {
@@ -267815,35 +267871,9 @@ class Sticker extends BaseItem {
267815
267871
  const scale = newWidth / width;
267816
267872
  const w = width * scale;
267817
267873
  const h2 = height * scale;
267818
- this.transformation.apply({
267819
- class: "Transformation",
267820
- method: "translateTo",
267821
- item: [this.id],
267822
- x: pt.x - w / 2,
267823
- y: pt.y - h2 / 2
267824
- });
267825
- this.transformation.apply({
267826
- class: "Transformation",
267827
- method: "scaleTo",
267828
- item: [this.id],
267829
- x: scale,
267830
- y: scale
267831
- });
267874
+ this.transformation.setLocal(pt.x - w / 2, pt.y - h2 / 2, scale, scale);
267832
267875
  } else {
267833
- this.transformation.apply({
267834
- class: "Transformation",
267835
- method: "translateTo",
267836
- item: [this.id],
267837
- x: pt.x - width / 2,
267838
- y: pt.y - height / 2
267839
- });
267840
- this.transformation.apply({
267841
- class: "Transformation",
267842
- method: "scaleTo",
267843
- item: [this.id],
267844
- x: 1,
267845
- y: 1
267846
- });
267876
+ this.transformation.setLocal(pt.x - width / 2, pt.y - height / 2, 1, 1);
267847
267877
  }
267848
267878
  }
267849
267879
  doResize(resizeType, pointer, mbr, opposite, startMbr, timeStamp) {
@@ -267930,7 +267960,7 @@ async function exportBoardSnapshot({
267930
267960
  const selectionMatrix = new Matrix2(translationX, translationY, scaleX, scaleY);
267931
267961
  camera.matrix = selectionMatrix;
267932
267962
  }
267933
- const context = new DrawingContext(camera, ctx);
267963
+ const context = new DrawingContext2(camera, ctx);
267934
267964
  context.setCamera(camera);
267935
267965
  context.ctx.setTransform(upscaleFactor, 0, 0, upscaleFactor, 0, 0);
267936
267966
  context.matrix.applyToContext(context.ctx);
@@ -268144,7 +268174,7 @@ class Frame2 extends BaseItem {
268144
268174
  const res = this.getCanChangeRatio() ? getResize(resizeType, pointer, mbr, opposite) : getProportionalResize(resizeType, pointer, mbr, opposite);
268145
268175
  if (!res) {
268146
268176
  return {
268147
- matrix: this.transformation.matrix,
268177
+ matrix: this.transformation.toMatrix(),
268148
268178
  mbr: this.getMbr()
268149
268179
  };
268150
268180
  }
@@ -268243,8 +268273,9 @@ class Frame2 extends BaseItem {
268243
268273
  return this;
268244
268274
  }
268245
268275
  getSavedProportionsMatrix() {
268246
- const newScale = Math.min(this.transformation.matrix.scaleX, this.transformation.matrix.scaleY);
268247
- const newMatrix = this.transformation.matrix.copy();
268276
+ const { scaleX, scaleY } = this.transformation.getMatrixData();
268277
+ const newScale = Math.min(scaleX, scaleY);
268278
+ const newMatrix = this.transformation.toMatrix();
268248
268279
  newMatrix.scaleX = newScale;
268249
268280
  newMatrix.scaleY = newScale;
268250
268281
  return newMatrix;
@@ -268258,8 +268289,8 @@ class Frame2 extends BaseItem {
268258
268289
  this.textContainer.transform(newMatrix);
268259
268290
  this.transformation.applyScaleTo(newMatrix.scaleX, newMatrix.scaleY);
268260
268291
  } else {
268261
- this.path.transform(this.transformation.matrix);
268262
- this.textContainer.transform(this.transformation.matrix);
268292
+ this.path.transform(this.transformation.toMatrix());
268293
+ this.textContainer.transform(this.transformation.toMatrix());
268263
268294
  }
268264
268295
  this.path.setBackgroundColor(this.backgroundColor);
268265
268296
  this.path.setBackgroundOpacity(this.backgroundOpacity);
@@ -268315,7 +268346,7 @@ class Frame2 extends BaseItem {
268315
268346
  const anchorPoints = Frames[this.shapeType].anchorPoints;
268316
268347
  const points = [];
268317
268348
  for (const anchorPoint of anchorPoints) {
268318
- points.push(anchorPoint.getTransformed(this.transformation.matrix));
268349
+ points.push(anchorPoint.getTransformed(this.transformation.toMatrix()));
268319
268350
  }
268320
268351
  return points;
268321
268352
  }
@@ -268491,7 +268522,7 @@ class Frame2 extends BaseItem {
268491
268522
  div.style.borderColor = this.borderColor;
268492
268523
  div.style.borderWidth = `${this.borderWidth}px`;
268493
268524
  div.style.borderStyle = this.borderStyle;
268494
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
268525
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
268495
268526
  const transform = `translate(${Math.round(translateX)}px, ${Math.round(translateY)}px) scale(1, 1)`;
268496
268527
  const width2 = this.getMbr().getWidth();
268497
268528
  const height2 = this.getMbr().getHeight();
@@ -268801,13 +268832,13 @@ class VideoItem extends BaseItem {
268801
268832
  this.shootLoadCallbacks();
268802
268833
  };
268803
268834
  updateMbr() {
268804
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
268835
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
268805
268836
  this.left = translateX;
268806
268837
  this.top = translateY;
268807
268838
  this.right = this.left + this.videoDimension.width * scaleX;
268808
268839
  this.bottom = this.top + this.videoDimension.height * scaleY;
268809
268840
  const playBtnSize = 50;
268810
- const scaledPlayBtn = playBtnSize * this.transformation.matrix.scaleX;
268841
+ const scaledPlayBtn = playBtnSize * this.transformation.getMatrixData().scaleX;
268811
268842
  this.playBtnMbr = new Mbr(this.left + this.getWidth() / 2 - scaledPlayBtn / 2, this.top + this.getHeight() / 2 - scaledPlayBtn / 2, this.right - this.getWidth() / 2 + scaledPlayBtn / 2, this.bottom - this.getHeight() / 2 + scaledPlayBtn / 2);
268812
268843
  }
268813
268844
  render(context) {
@@ -268823,7 +268854,7 @@ class VideoItem extends BaseItem {
268823
268854
  return;
268824
268855
  }
268825
268856
  ctx.save();
268826
- this.transformation.matrix.applyToContext(ctx);
268857
+ this.transformation.applyToContext(ctx);
268827
268858
  ctx.drawImage(this.preview, 0, 0);
268828
268859
  if (this.shouldShowControls && this.previewUrl) {
268829
268860
  ctx.restore();
@@ -268844,7 +268875,7 @@ class VideoItem extends BaseItem {
268844
268875
  }
268845
268876
  renderHTML(documentFactory) {
268846
268877
  const div = documentFactory.createElement("video-item");
268847
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
268878
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
268848
268879
  const transform = `translate(${translateX}px, ${translateY}px) scale(${scaleX}, ${scaleY})`;
268849
268880
  div.style.backgroundImage = this.previewUrl ? `url(${this.previewUrl})` : `url(${createPlaceholderImage(this.videoDimension.width, this.videoDimension.height).src})`;
268850
268881
  div.id = this.getId();
@@ -269289,7 +269320,7 @@ class AudioItem extends BaseItem {
269289
269320
  this.shootLoadCallbacks();
269290
269321
  };
269291
269322
  updateMbr() {
269292
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
269323
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
269293
269324
  this.left = translateX;
269294
269325
  this.top = translateY;
269295
269326
  this.right = this.left + conf.AUDIO_DIMENSIONS.width * scaleX;
@@ -269319,7 +269350,7 @@ class AudioItem extends BaseItem {
269319
269350
  }
269320
269351
  renderHTML(documentFactory) {
269321
269352
  const div = documentFactory.createElement("audio-item");
269322
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
269353
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
269323
269354
  const transform = `translate(${translateX}px, ${translateY}px) scale(${scaleX}, ${scaleY})`;
269324
269355
  div.id = this.getId();
269325
269356
  div.style.width = `${conf.AUDIO_DIMENSIONS.width}px`;
@@ -269669,7 +269700,7 @@ class Placeholder extends BaseItem {
269669
269700
  const anchorPoints = Shapes[this.shapeType].anchorPoints;
269670
269701
  const points = [];
269671
269702
  for (const anchorPoint of anchorPoints) {
269672
- points.push(anchorPoint.getTransformed(this.transformation.matrix));
269703
+ points.push(anchorPoint.getTransformed(this.transformation.toMatrix()));
269673
269704
  }
269674
269705
  return points;
269675
269706
  }
@@ -269687,7 +269718,7 @@ class Placeholder extends BaseItem {
269687
269718
  }
269688
269719
  transformPath() {
269689
269720
  this.path = Shapes[this.shapeType].createPath(this.mbr);
269690
- this.path.transform(this.transformation.matrix);
269721
+ this.path.transform(this.transformation.toMatrix());
269691
269722
  this.path.setBackgroundColor(this.backgroundColor);
269692
269723
  this.path.setBorderColor("transparent");
269693
269724
  }
@@ -269754,7 +269785,7 @@ class Placeholder extends BaseItem {
269754
269785
  function getPlaceholderImage(board, imageDimension) {
269755
269786
  const placeholderCanvas = conf.documentFactory.createElement("canvas");
269756
269787
  const placeholderContext = placeholderCanvas.getContext("2d");
269757
- const context = new DrawingContext(board.camera, placeholderContext);
269788
+ const context = new DrawingContext2(board.camera, placeholderContext);
269758
269789
  const placeholder = new Placeholder(board);
269759
269790
  if (imageDimension) {
269760
269791
  placeholderCanvas.width = imageDimension.width;
@@ -269882,7 +269913,7 @@ class ImageItem extends BaseItem {
269882
269913
  this.subject.publish(this);
269883
269914
  };
269884
269915
  updateMbr() {
269885
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
269916
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
269886
269917
  const rotation = this.transformation.getRotation();
269887
269918
  const width2 = this.image.width * scaleX;
269888
269919
  const height2 = this.image.height * scaleY;
@@ -269925,10 +269956,11 @@ class ImageItem extends BaseItem {
269925
269956
  };
269926
269957
  }
269927
269958
  setCoordinates() {
269928
- this.left = this.transformation.matrix.translateX;
269929
- this.top = this.transformation.matrix.translateY;
269930
- this.right = this.left + this.image.width * this.transformation.matrix.scaleX;
269931
- this.bottom = this.top + this.image.height * this.transformation.matrix.scaleY;
269959
+ const { translateX: coordX, translateY: coordY, scaleX: coordScaleX, scaleY: coordScaleY } = this.transformation.getMatrixData();
269960
+ this.left = coordX;
269961
+ this.top = coordY;
269962
+ this.right = this.left + this.image.width * coordScaleX;
269963
+ this.bottom = this.top + this.image.height * coordScaleY;
269932
269964
  this.subject.publish(this);
269933
269965
  }
269934
269966
  shootBeforeLoadCallbacks() {
@@ -269995,7 +270027,7 @@ class ImageItem extends BaseItem {
269995
270027
  }
269996
270028
  const ctx = context.ctx;
269997
270029
  ctx.save();
269998
- this.transformation.matrix.applyToContext(ctx);
270030
+ this.transformation.applyToContext(ctx);
269999
270031
  const rotation = this.transformation.getRotation();
270000
270032
  if (rotation !== 0) {
270001
270033
  const imgWidth = this.image.width || 0;
@@ -270013,7 +270045,7 @@ class ImageItem extends BaseItem {
270013
270045
  }
270014
270046
  renderHTML(documentFactory) {
270015
270047
  const div = documentFactory.createElement("image-item");
270016
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
270048
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
270017
270049
  const transform = `translate(${translateX}px, ${translateY}px) scale(${scaleX}, ${scaleY})`;
270018
270050
  div.style.backgroundImage = `url(${this.storageLink})`;
270019
270051
  div.id = this.getId();
@@ -270164,7 +270196,7 @@ class Drawing extends BaseItem {
270164
270196
  untransformedMbr.top -= offset;
270165
270197
  untransformedMbr.right += offset;
270166
270198
  untransformedMbr.bottom += offset;
270167
- const mbr = untransformedMbr.getTransformed(this.transformation.matrix);
270199
+ const mbr = untransformedMbr.getTransformed(this.transformation.toMatrix());
270168
270200
  this.left = mbr.left;
270169
270201
  this.top = mbr.top;
270170
270202
  this.right = mbr.right;
@@ -270211,7 +270243,7 @@ class Drawing extends BaseItem {
270211
270243
  }
270212
270244
  updateLines() {
270213
270245
  this.lines = [];
270214
- const matrix = this.transformation.matrix;
270246
+ const matrix = this.transformation.toMatrix();
270215
270247
  if (this.points.length < 2) {
270216
270248
  return;
270217
270249
  }
@@ -270259,7 +270291,7 @@ class Drawing extends BaseItem {
270259
270291
  ctx.lineWidth = this.strokeWidth;
270260
270292
  ctx.lineCap = "round";
270261
270293
  ctx.setLineDash(this.linePattern);
270262
- this.transformation.matrix.applyToContext(ctx);
270294
+ this.transformation.applyToContext(ctx);
270263
270295
  ctx.stroke(this.path2d.nativePath);
270264
270296
  ctx.restore();
270265
270297
  if (this.getLinkTo()) {
@@ -270269,7 +270301,7 @@ class Drawing extends BaseItem {
270269
270301
  }
270270
270302
  renderHTML(documentFactory) {
270271
270303
  const div = documentFactory.createElement("drawing-item");
270272
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
270304
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
270273
270305
  const mbr = this.getMbr();
270274
270306
  const width2 = mbr.getWidth();
270275
270307
  const height2 = mbr.getHeight();
@@ -270458,8 +270490,9 @@ class Drawing extends BaseItem {
270458
270490
  return null;
270459
270491
  }
270460
270492
  isPointNearLine(point5, threshold = 10) {
270461
- const transformedMouseX = (point5.x - this.transformation.matrix.translateX) / this.transformation.matrix.scaleX;
270462
- const transformedMouseY = (point5.y - this.transformation.matrix.translateY) / this.transformation.matrix.scaleY;
270493
+ const { translateX: drawingTranslateX, translateY: drawingTranslateY, scaleX: drawingScaleX, scaleY: drawingScaleY } = this.transformation.getMatrixData();
270494
+ const transformedMouseX = (point5.x - drawingTranslateX) / drawingScaleX;
270495
+ const transformedMouseY = (point5.y - drawingTranslateY) / drawingScaleY;
270463
270496
  const transformedMouse = new Point3(transformedMouseX, transformedMouseY);
270464
270497
  for (let i = 0;i < this.points.length - 1; i++) {
270465
270498
  const p1 = this.points[i];
@@ -271779,40 +271812,16 @@ class AddFrame extends BoardTool {
271779
271812
  this.applyTranslateBy(-this.frame.getMbr().getWidth() / 2, -this.frame.getMbr().getHeight() / 2);
271780
271813
  }
271781
271814
  applyScaleTo(x, y) {
271782
- this.frame.transformation.apply({
271783
- class: "Transformation",
271784
- method: "scaleTo",
271785
- item: [this.frame.getId()],
271786
- x,
271787
- y
271788
- });
271815
+ this.frame.transformation.setLocal({ scaleX: x, scaleY: y });
271789
271816
  }
271790
271817
  applyScaleBy(x, y) {
271791
- this.frame.transformation.apply({
271792
- class: "Transformation",
271793
- method: "scaleBy",
271794
- item: [this.frame.getId()],
271795
- x,
271796
- y
271797
- });
271818
+ this.frame.transformation.scaleBy(x, y);
271798
271819
  }
271799
271820
  applyTranslateTo(x, y) {
271800
- this.frame.transformation.apply({
271801
- class: "Transformation",
271802
- method: "translateTo",
271803
- item: [this.frame.getId()],
271804
- x,
271805
- y
271806
- });
271821
+ this.frame.transformation.setLocal(x, y);
271807
271822
  }
271808
271823
  applyTranslateBy(x, y) {
271809
- this.frame.transformation.apply({
271810
- class: "Transformation",
271811
- method: "translateBy",
271812
- item: [this.frame.getId()],
271813
- x,
271814
- y
271815
- });
271824
+ this.frame.transformation.translateBy(x, y);
271816
271825
  }
271817
271826
  applyAddChildren(children) {
271818
271827
  const childrenIds = children.map((child) => {
@@ -271880,20 +271889,7 @@ class AddShape extends BoardTool {
271880
271889
  initTransformation(sx, sy) {
271881
271890
  sx = sx || this.bounds.getWidth() / 100;
271882
271891
  sy = sy || this.bounds.getHeight() / 100;
271883
- this.shape.transformation.apply({
271884
- class: "Transformation",
271885
- method: "translateTo",
271886
- item: [this.shape.getId()],
271887
- x: this.bounds.left,
271888
- y: this.bounds.top
271889
- });
271890
- this.shape.transformation.apply({
271891
- class: "Transformation",
271892
- method: "scaleTo",
271893
- item: [this.shape.getId()],
271894
- x: sx,
271895
- y: sy
271896
- });
271892
+ this.shape.transformation.setLocal(this.bounds.left, this.bounds.top, sx, sy);
271897
271893
  }
271898
271894
  leftButtonDown() {
271899
271895
  if (this.type === "None") {
@@ -272416,11 +272412,11 @@ class ExportSnapshot extends Tool {
272416
272412
  const cameraCenter = this.board.camera.getMbr().getCenter();
272417
272413
  this.mbr = new Mbr(cameraCenter.x - conf.EXPORT_SELECTION_BOX_WIDTH / 2, cameraCenter.y - conf.EXPORT_SELECTION_BOX_HEIGHT / 2, cameraCenter.x + conf.EXPORT_SELECTION_BOX_WIDTH / 2, cameraCenter.y + conf.EXPORT_SELECTION_BOX_HEIGHT / 2, "transparent", "transparent", 1);
272418
272414
  this.board.selection.disable();
272419
- this.tempDrawingContext = new DrawingContext(board.camera, this.tempCtx);
272415
+ this.tempDrawingContext = new DrawingContext2(board.camera, this.tempCtx);
272420
272416
  }
272421
272417
  rectMoveTo(x, y) {
272422
272418
  this.transformation.translateTo(x, y);
272423
- this.mbr.transform(this.transformation.matrix);
272419
+ this.mbr.transform(this.transformation.toMatrix());
272424
272420
  this.board.tools.publish();
272425
272421
  }
272426
272422
  resize() {
@@ -272702,7 +272698,7 @@ function createCanvasDrawer(board) {
272702
272698
  const camera = new Camera;
272703
272699
  const newCameraMatix = new Matrix2(-mbr.left, -mbr.top, 1, 1);
272704
272700
  camera.matrix = newCameraMatix;
272705
- const context = new DrawingContext(camera, ctx);
272701
+ const context = new DrawingContext2(camera, ctx);
272706
272702
  context.setCamera(camera);
272707
272703
  context.ctx.setTransform(board2.camera.getMatrix().scaleX, 0, 0, board2.camera.getMatrix().scaleY, 0, 0);
272708
272704
  context.matrix.applyToContext(context.ctx);
@@ -274599,20 +274595,7 @@ class ShapeTool extends CustomTool {
274599
274595
  initTransformation(sx, sy) {
274600
274596
  sx = sx || this.bounds.getWidth() / 100;
274601
274597
  sy = sy || this.bounds.getHeight() / 100;
274602
- this.item.transformation.apply({
274603
- class: "Transformation",
274604
- method: "translateTo",
274605
- item: [this.item.getId()],
274606
- x: this.bounds.left,
274607
- y: this.bounds.top
274608
- });
274609
- this.item.transformation.apply({
274610
- class: "Transformation",
274611
- method: "scaleTo",
274612
- item: [this.item.getId()],
274613
- x: sx,
274614
- y: sy
274615
- });
274598
+ this.item.transformation.setLocal(this.bounds.left, this.bounds.top, sx, sy);
274616
274599
  }
274617
274600
  pointerDown() {
274618
274601
  this.isDown = true;
@@ -274683,22 +274666,10 @@ class StickerTool extends CustomTool {
274683
274666
  }
274684
274667
  pointerDown() {
274685
274668
  const point5 = this.board.pointer.point;
274686
- this.item.transformation.apply({
274687
- class: "Transformation",
274688
- method: "translateTo",
274689
- item: [this.item.getId()],
274690
- x: point5.x - this.settings.width / 2,
274691
- y: point5.y - this.settings.height / 2
274692
- });
274669
+ this.item.transformation.setLocal(point5.x - this.settings.width / 2, point5.y - this.settings.height / 2);
274693
274670
  const width2 = this.item.getWidth();
274694
274671
  const height3 = this.item.getHeight();
274695
- this.item.transformation.apply({
274696
- class: "Transformation",
274697
- method: "scaleBy",
274698
- item: [this.item.getId()],
274699
- x: width2 / this.settings.width,
274700
- y: height3 / this.settings.height
274701
- });
274672
+ this.item.transformation.scaleBy(width2 / this.settings.width, height3 / this.settings.height);
274702
274673
  const addedItem = this.board.add(this.item);
274703
274674
  this.board.selection.removeAll();
274704
274675
  this.board.selection.add(addedItem);
@@ -275307,7 +275278,7 @@ class Star2 extends BaseItem {
275307
275278
  }
275308
275279
  transformPath() {
275309
275280
  this.path = starPath.copy();
275310
- this.path.transform(this.transformation.matrix);
275281
+ this.path.transform(this.transformation.toMatrix());
275311
275282
  this.path.setBackgroundColor(this.backgroundColor);
275312
275283
  this.path.setBorderColor(this.borderColor);
275313
275284
  this.path.setBorderWidth(this.borderWidth);
@@ -275335,7 +275306,7 @@ class Star2 extends BaseItem {
275335
275306
  }
275336
275307
  renderHTML(documentFactory) {
275337
275308
  const div = documentFactory.createElement("star-item");
275338
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
275309
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
275339
275310
  const mbr = this.getMbr();
275340
275311
  const unscaledWidth = mbr.getWidth() / scaleX;
275341
275312
  const unscaledHeight = mbr.getHeight() / scaleY;
@@ -275422,13 +275393,7 @@ class AddCounter extends StickerTool {
275422
275393
  const x = (left + right) / 2 - COUNTER_DIMENSIONS.width / 2;
275423
275394
  const y = (top + bottom) / 2 - COUNTER_DIMENSIONS.height / 2;
275424
275395
  const counter2 = new Counter(this.board, "");
275425
- counter2.transformation.apply({
275426
- class: "Transformation",
275427
- method: "translateTo",
275428
- item: [counter2.getId()],
275429
- x,
275430
- y
275431
- });
275396
+ counter2.transformation.setLocal(x, y);
275432
275397
  const addedCounter = this.board.add(counter2);
275433
275398
  this.board.selection.add(addedCounter);
275434
275399
  }
@@ -275466,7 +275431,7 @@ class Counter extends BaseItem {
275466
275431
  }
275467
275432
  }
275468
275433
  updateMbr() {
275469
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
275434
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
275470
275435
  this.left = translateX;
275471
275436
  this.top = translateY;
275472
275437
  this.right = this.left + COUNTER_DIMENSIONS.width * scaleX;
@@ -275658,7 +275623,7 @@ class Card extends BaseItem {
275658
275623
  }
275659
275624
  renderHTML(documentFactory) {
275660
275625
  const div = super.renderHTML(documentFactory);
275661
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
275626
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
275662
275627
  const transform = `translate(${translateX}px, ${translateY}px) scale(${scaleX}, ${scaleY})`;
275663
275628
  div.style.backgroundImage = `url(${this.imageToRender?.src || this.backsideUrl})`;
275664
275629
  div.id = this.getId();
@@ -275672,7 +275637,7 @@ class Card extends BaseItem {
275672
275637
  return div;
275673
275638
  }
275674
275639
  updateMbr() {
275675
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
275640
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
275676
275641
  const rotation = this.transformation.getRotation();
275677
275642
  const height3 = this.dimensions.height * scaleY;
275678
275643
  const width2 = this.dimensions.width * scaleX;
@@ -275822,24 +275787,12 @@ class Deck extends BaseItem {
275822
275787
  const canAddItem = !this.index?.getById(childId) && foundItem instanceof Card && (typeof this.isPerpendicular === "undefined" || this.isPerpendicular === foundItem.getIsRotatedPerpendicular()) && (!firstCardDimensions || firstCardDimensions.width === foundItem.getDimensions().width && firstCardDimensions.height === foundItem.getDimensions().height);
275823
275788
  if (canAddItem) {
275824
275789
  this.isPerpendicular = foundItem.getIsRotatedPerpendicular();
275825
- foundItem.transformation.apply({
275826
- class: "Transformation",
275827
- method: "translateTo",
275828
- item: [this.id],
275829
- x: this.left + (this.index?.list().length || 0) * (this.isPerpendicular ? 0 : conf.DECK_HORIZONTAL_OFFSET),
275830
- y: this.top + (this.index?.list().length || 0) * (this.isPerpendicular ? conf.DECK_VERTICAL_OFFSET : 0)
275831
- });
275790
+ foundItem.transformation.setLocal(this.left + (this.index?.list().length || 0) * (this.isPerpendicular ? 0 : conf.DECK_HORIZONTAL_OFFSET), this.top + (this.index?.list().length || 0) * (this.isPerpendicular ? conf.DECK_VERTICAL_OFFSET : 0));
275832
275791
  if (firstCard) {
275833
- const { scaleX, scaleY } = foundItem.transformation.matrix;
275834
- const { scaleX: targetScaleX, scaleY: targetScaleY } = firstCard.transformation.matrix;
275792
+ const { scaleX, scaleY } = foundItem.transformation.getMatrixData();
275793
+ const { scaleX: targetScaleX, scaleY: targetScaleY } = firstCard.transformation.getMatrixData();
275835
275794
  if (scaleX !== targetScaleX || scaleY !== targetScaleY) {
275836
- foundItem.transformation.apply({
275837
- class: "Transformation",
275838
- method: "scaleTo",
275839
- item: [this.id],
275840
- x: targetScaleX,
275841
- y: targetScaleY
275842
- });
275795
+ foundItem.transformation.setLocal({ scaleX: targetScaleX, scaleY: targetScaleY });
275843
275796
  }
275844
275797
  }
275845
275798
  this.board.selection.remove(foundItem);
@@ -275941,7 +275894,7 @@ class Deck extends BaseItem {
275941
275894
  this.subject.publish(this);
275942
275895
  }
275943
275896
  updateMbr() {
275944
- const { translateX, translateY } = this.transformation.matrix;
275897
+ const { translateX, translateY } = this.transformation.getMatrixData();
275945
275898
  const items = this.index.list();
275946
275899
  const itemsMbr = items[0]?.getMbr().combine(items.slice(1).map((item) => item.getMbr()));
275947
275900
  this.left = translateX;
@@ -276015,7 +275968,7 @@ class Deck extends BaseItem {
276015
275968
  if (!topCard) {
276016
275969
  return div;
276017
275970
  }
276018
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
275971
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
276019
275972
  const transform = `translate(${translateX}px, ${translateY}px) scale(1, 1)`;
276020
275973
  const topCardElement = topCard.renderHTML(documentFactory);
276021
275974
  div.appendChild(topCardElement);
@@ -276170,13 +276123,7 @@ function createDeck(event, board) {
276170
276123
  const onlyCards = board.selection.items.isAllItemsType("Card");
276171
276124
  if (onlyCards) {
276172
276125
  const deck = new Deck(board, "");
276173
- deck.transformation.apply({
276174
- class: "Transformation",
276175
- method: "translateTo",
276176
- item: [deck.getId()],
276177
- x: cardsOrDecks[cardsOrDecks.length - 1].left,
276178
- y: cardsOrDecks[cardsOrDecks.length - 1].top
276179
- });
276126
+ deck.transformation.setLocal(cardsOrDecks[cardsOrDecks.length - 1].left, cardsOrDecks[cardsOrDecks.length - 1].top);
276180
276127
  const addedDeck = board.add(deck);
276181
276128
  board.selection.items.removeAll();
276182
276129
  addedDeck.addChildItems(cardsOrDecks);
@@ -276261,7 +276208,7 @@ class Dice extends BaseItem {
276261
276208
  }
276262
276209
  transformPath() {
276263
276210
  this.path = createRoundedRectanglePath(this).copy();
276264
- this.path.transform(this.transformation.matrix);
276211
+ this.path.transform(this.transformation.toMatrix());
276265
276212
  this.path.setBackgroundColor(this.backgroundColor);
276266
276213
  this.path.setBorderColor(this.borderColor);
276267
276214
  this.path.setBorderWidth(this.borderWidth);
@@ -276483,7 +276430,7 @@ class Dice extends BaseItem {
276483
276430
  }
276484
276431
  renderHTML(documentFactory) {
276485
276432
  const div = super.renderHTML(documentFactory);
276486
- const { translateX, translateY, scaleX, scaleY } = this.transformation.matrix;
276433
+ const { translateX, translateY, scaleX, scaleY } = this.transformation.getMatrixData();
276487
276434
  const mbr = this.getMbr();
276488
276435
  const width2 = mbr.getWidth();
276489
276436
  const height3 = mbr.getHeight();
@@ -276732,7 +276679,7 @@ class Screen extends BaseItem {
276732
276679
  }
276733
276680
  transformPath() {
276734
276681
  this.path = screenPath.copy();
276735
- this.path.transform(this.transformation.matrix);
276682
+ this.path.transform(this.transformation.toMatrix());
276736
276683
  this.path.setBackgroundColor(this.backgroundColor);
276737
276684
  this.path.setBorderColor(this.borderColor);
276738
276685
  this.path.setBorderWidth(this.borderWidth);
@@ -276846,8 +276793,11 @@ class Camera {
276846
276793
  boardId = "";
276847
276794
  observableItem = null;
276848
276795
  throttledZoom;
276849
- isAnimating = false;
276850
276796
  isTrackingAnimation = false;
276797
+ localAnimationTarget = null;
276798
+ localAnimationId = null;
276799
+ localLastTime = null;
276800
+ localSpringVelocity = { translateX: 0, translateY: 0, scaleX: 0, scaleY: 0 };
276851
276801
  trackingAnimationId = null;
276852
276802
  trackingTarget = null;
276853
276803
  lastTrackingTime = null;
@@ -276927,7 +276877,7 @@ class Camera {
276927
276877
  }
276928
276878
  view(_left, _top, _scale) {}
276929
276879
  zoomRelativeToPointerBy(scale) {
276930
- this.zoomRelativeToPointBy(scale, this.pointer.x, this.pointer.y, 0);
276880
+ this.zoomRelativeToPointBy(scale, this.pointer.x, this.pointer.y);
276931
276881
  }
276932
276882
  zoomRelativeToPointBy(scale, x, y, duration = 400) {
276933
276883
  const startScaleX = this.matrix.scaleX;
@@ -276953,23 +276903,12 @@ class Camera {
276953
276903
  this.subject.publish(this);
276954
276904
  return;
276955
276905
  }
276956
- const startTime = performance.now();
276957
- const animate = (currentTime) => {
276958
- if (!currentTime) {
276959
- currentTime = performance.now();
276960
- }
276961
- const progress = Math.min((currentTime - startTime) / duration, 1);
276962
- const easedProgress = this.easeOutQuad(progress);
276963
- this.matrix.translateX = this.lerp(startTranslateX, targetTranslateX, easedProgress);
276964
- this.matrix.translateY = this.lerp(startTranslateY, targetTranslateY, easedProgress);
276965
- this.matrix.scaleX = this.lerp(startScaleX, finalScaleX, easedProgress);
276966
- this.matrix.scaleY = this.lerp(startScaleY, finalScaleY, easedProgress);
276967
- this.subject.publish(this);
276968
- if (progress < 1) {
276969
- safeRequestAnimationFrame(animate);
276970
- }
276971
- };
276972
- safeRequestAnimationFrame(animate);
276906
+ this.animateLocalToTarget({
276907
+ translateX: targetTranslateX,
276908
+ translateY: targetTranslateY,
276909
+ scaleX: finalScaleX,
276910
+ scaleY: finalScaleY
276911
+ });
276973
276912
  }
276974
276913
  saveDownEvent(event) {
276975
276914
  this.touchEvents.set(event.pointerId, event);
@@ -277199,13 +277138,6 @@ class Camera {
277199
277138
  }
277200
277139
  }
277201
277140
  viewRectangle(mbr, offsetInPercent = 10, duration = 500) {
277202
- if (duration <= 0) {
277203
- duration = 1;
277204
- }
277205
- if (this.isAnimating) {
277206
- return;
277207
- }
277208
- this.isAnimating = true;
277209
277141
  if (mbr.left === mbr.right && mbr.bottom === mbr.top) {
277210
277142
  mbr.left -= 100;
277211
277143
  mbr.right += 100;
@@ -277228,9 +277160,6 @@ class Camera {
277228
277160
  targetScale = Math.min(targetScale, this.maxScale);
277229
277161
  const translationX = this.window.width / 2 - (mbrWithOffset.left + mbrWidth / 2) * targetScale;
277230
277162
  const translationY = this.window.height / 2 - (mbrWithOffset.top + mbrHeight / 2) * targetScale;
277231
- const startTranslationX = this.matrix.translateX;
277232
- const startTranslationY = this.matrix.translateY;
277233
- const startScale = this.matrix.scaleX;
277234
277163
  if (duration === 0) {
277235
277164
  this.matrix.translateX = translationX;
277236
277165
  this.matrix.translateY = translationY;
@@ -277239,29 +277168,76 @@ class Camera {
277239
277168
  this.subject.publish(this);
277240
277169
  return;
277241
277170
  }
277242
- const startTime = performance.now();
277243
- const animate = () => {
277244
- const currentTime = performance.now();
277245
- const progress = Math.min((currentTime - startTime) / duration, 1);
277246
- const easedProgress = this.easeOutQuad(progress);
277247
- this.matrix.translateX = this.lerp(startTranslationX, translationX, easedProgress);
277248
- this.matrix.translateY = this.lerp(startTranslationY, translationY, easedProgress);
277249
- this.matrix.scaleX = this.lerp(startScale, targetScale, easedProgress);
277250
- this.matrix.scaleY = this.matrix.scaleX;
277171
+ this.animateLocalToTarget({
277172
+ translateX: translationX,
277173
+ translateY: translationY,
277174
+ scaleX: targetScale,
277175
+ scaleY: targetScale
277176
+ });
277177
+ }
277178
+ cancelLocalAnimation() {
277179
+ if (this.localAnimationId !== null) {
277180
+ cancelAnimationFrame(this.localAnimationId);
277181
+ this.localAnimationId = null;
277182
+ }
277183
+ this.localAnimationTarget = null;
277184
+ this.localLastTime = null;
277185
+ this.localSpringVelocity = { translateX: 0, translateY: 0, scaleX: 0, scaleY: 0 };
277186
+ }
277187
+ animateLocalToTarget(target) {
277188
+ this.localAnimationTarget = target;
277189
+ if (this.localAnimationId !== null) {
277190
+ return;
277191
+ }
277192
+ this.localLastTime = null;
277193
+ const STIFFNESS = 150;
277194
+ const DAMPING = 28;
277195
+ const SNAP_PX = 0.5;
277196
+ const SNAP_SCALE = 0.0005;
277197
+ const SNAP_VEL = 1;
277198
+ const springStep = (pos, tgt, vel, dt) => {
277199
+ const acc = STIFFNESS * (tgt - pos) - DAMPING * vel;
277200
+ const newVel = vel + acc * dt;
277201
+ return [pos + newVel * dt, newVel];
277202
+ };
277203
+ const loop = () => {
277204
+ const tgt = this.localAnimationTarget;
277205
+ if (!tgt) {
277206
+ this.localAnimationId = null;
277207
+ return;
277208
+ }
277209
+ const now = performance.now();
277210
+ const dt = Math.min(this.localLastTime !== null ? now - this.localLastTime : 16, 50) / 1000;
277211
+ this.localLastTime = now;
277212
+ const v = this.localSpringVelocity;
277213
+ const [tx, vtx] = springStep(this.matrix.translateX, tgt.translateX, v.translateX, dt);
277214
+ const [ty, vty] = springStep(this.matrix.translateY, tgt.translateY, v.translateY, dt);
277215
+ const [sx, vsx] = springStep(this.matrix.scaleX, tgt.scaleX, v.scaleX, dt);
277216
+ const [sy, vsy] = springStep(this.matrix.scaleY, tgt.scaleY, v.scaleY, dt);
277217
+ this.matrix.translateX = tx;
277218
+ this.matrix.translateY = ty;
277219
+ this.matrix.scaleX = sx;
277220
+ this.matrix.scaleY = sy;
277221
+ this.localSpringVelocity = { translateX: vtx, translateY: vty, scaleX: vsx, scaleY: vsy };
277222
+ this.updateBoardPointer();
277251
277223
  this.subject.publish(this);
277252
- if (progress < 1) {
277253
- safeRequestAnimationFrame(animate);
277254
- } else {
277255
- this.isAnimating = false;
277224
+ const settled = Math.abs(tgt.translateX - tx) < SNAP_PX && Math.abs(tgt.translateY - ty) < SNAP_PX && Math.abs(tgt.scaleX - sx) < SNAP_SCALE && Math.abs(vtx) < SNAP_VEL && Math.abs(vty) < SNAP_VEL;
277225
+ if (settled) {
277226
+ this.matrix.translateX = tgt.translateX;
277227
+ this.matrix.translateY = tgt.translateY;
277228
+ this.matrix.scaleX = tgt.scaleX;
277229
+ this.matrix.scaleY = tgt.scaleY;
277230
+ this.localSpringVelocity = { translateX: 0, translateY: 0, scaleX: 0, scaleY: 0 };
277231
+ this.localAnimationTarget = null;
277232
+ this.localAnimationId = null;
277233
+ this.localLastTime = null;
277234
+ this.updateBoardPointer();
277235
+ this.subject.publish(this);
277236
+ return;
277256
277237
  }
277238
+ this.localAnimationId = safeRequestAnimationFrame(loop) || null;
277257
277239
  };
277258
- safeRequestAnimationFrame(animate);
277259
- }
277260
- lerp(a2, b2, time2) {
277261
- return a2 + (b2 - a2) * time2;
277262
- }
277263
- easeOutQuad(time2) {
277264
- return time2 * (2 - time2);
277240
+ this.localAnimationId = safeRequestAnimationFrame(loop) || null;
277265
277241
  }
277266
277242
  zoomToFit(rect, offsetInPercent = 10, duration = 480) {
277267
277243
  this.viewRectangle(rect, offsetInPercent, duration);
@@ -277270,11 +277246,13 @@ class Camera {
277270
277246
  return { x: 0, y: 0 };
277271
277247
  }
277272
277248
  translateTo(x, y) {
277249
+ this.cancelLocalAnimation();
277273
277250
  this.matrix.translate(x, y);
277274
277251
  this.updateBoardPointer();
277275
277252
  this.subject.publish(this);
277276
277253
  }
277277
277254
  translateBy(x, y) {
277255
+ this.cancelLocalAnimation();
277278
277256
  this.matrix.translate(x * this.matrix.scaleX, y * this.matrix.scaleY);
277279
277257
  this.updateBoardPointer();
277280
277258
  this.subject.publish(this);
@@ -279267,8 +279245,8 @@ function handleMultipleItemsResize({
279267
279245
  let itemX = item.getMbr().left;
279268
279246
  let itemY = item.getMbr().top;
279269
279247
  if (item.itemType === "Drawing") {
279270
- itemX = item.transformation.matrix.translateX;
279271
- itemY = item.transformation.matrix.translateY;
279248
+ itemX = item.transformation.getMatrixData().translateX;
279249
+ itemY = item.transformation.getMatrixData().translateY;
279272
279250
  }
279273
279251
  const deltaX = itemX - initMbr.left;
279274
279252
  const translateX = deltaX * matrix.scaleX - deltaX + matrix.translateX;
@@ -283638,6 +283616,21 @@ function insertEventsFromOtherConnectionsIntoList(value, list6, board) {
283638
283616
  }
283639
283617
  const events2 = expandEvents(eventArray);
283640
283618
  board.selection.memoize();
283619
+ const focusedTextId = board.selection.memorySnapshot?.focus?.textToEdit;
283620
+ let localOpOriginalSelection = null;
283621
+ if (focusedTextId) {
283622
+ const allUnconfirmed = [...list6.getRecordsToSend(), ...list6.getNewRecords()];
283623
+ for (const rec of allUnconfirmed) {
283624
+ const op = rec.event.body.operation;
283625
+ if (op.class === "RichText" && op.method === "edit") {
283626
+ const items = Array.isArray(op.item) ? op.item : [op.item];
283627
+ if (items.includes(focusedTextId)) {
283628
+ localOpOriginalSelection = op.selection;
283629
+ break;
283630
+ }
283631
+ }
283632
+ }
283633
+ }
283641
283634
  const createdItems = [];
283642
283635
  const updatedText = [];
283643
283636
  const filter = (rec) => {
@@ -283647,6 +283640,10 @@ function insertEventsFromOtherConnectionsIntoList(value, list6, board) {
283647
283640
  createdItems.push(...creating);
283648
283641
  return false;
283649
283642
  }
283643
+ if (op.class === "RichText" && op.method === "edit") {
283644
+ const items = Array.isArray(op.item) ? op.item : [op.item];
283645
+ updatedText.push(...items);
283646
+ }
283650
283647
  return true;
283651
283648
  };
283652
283649
  list6.revertUnconfirmed(filter);
@@ -283665,7 +283662,28 @@ function insertEventsFromOtherConnectionsIntoList(value, list6, board) {
283665
283662
  return arr2.some((item) => lookup9.has(item));
283666
283663
  };
283667
283664
  const currSelection = board.selection.list().map((item) => item.getId());
283668
- if (hasAnyOverlap(currSelection, createdItems) || hasAnyOverlap(currSelection, updatedText)) {
283665
+ const memoizedCursor = board.selection.memorySnapshot?.focus?.selection;
283666
+ if (focusedTextId && localOpOriginalSelection && memoizedCursor && hasAnyOverlap(currSelection, updatedText)) {
283667
+ const rt = board.items.getById(focusedTextId)?.getRichText();
283668
+ if (rt) {
283669
+ const otAdjustedCursor = rt.editor.getSelection();
283670
+ if (otAdjustedCursor && memoizedCursor.anchor.path.length > 0 && memoizedCursor.focus.path.length > 0) {
283671
+ const deltaAnchor = otAdjustedCursor.anchor.offset - (localOpOriginalSelection?.anchor?.offset ?? 0);
283672
+ const deltaFocus = otAdjustedCursor.focus.offset - (localOpOriginalSelection?.focus?.offset ?? 0);
283673
+ const adjustedSelection = {
283674
+ anchor: {
283675
+ path: memoizedCursor.anchor.path,
283676
+ offset: memoizedCursor.anchor.offset + deltaAnchor
283677
+ },
283678
+ focus: {
283679
+ path: memoizedCursor.focus.path,
283680
+ offset: memoizedCursor.focus.offset + deltaFocus
283681
+ }
283682
+ };
283683
+ rt.editorTransforms.select(rt.editor.editor, adjustedSelection);
283684
+ }
283685
+ }
283686
+ } else if (hasAnyOverlap(currSelection, createdItems) || hasAnyOverlap(currSelection, updatedText)) {
283669
283687
  board.selection.applyMemoizedCaretOrRange();
283670
283688
  }
283671
283689
  }
@@ -283938,16 +283956,16 @@ function createEvents(board, connection, lastIndex) {
283938
283956
  return new Events2(board, connection, lastIndex);
283939
283957
  }
283940
283958
  function createMessageRouter() {
283941
- const handlers3 = new Map;
283959
+ const handlers2 = new Map;
283942
283960
  function addHandler(type, handler) {
283943
- handlers3.set(type, (message, board) => {
283961
+ handlers2.set(type, (message, board) => {
283944
283962
  if (message.type === type) {
283945
283963
  handler(message, board);
283946
283964
  }
283947
283965
  });
283948
283966
  }
283949
283967
  function handleMessage(message, board) {
283950
- const handler = handlers3.get(message.type);
283968
+ const handler = handlers2.get(message.type);
283951
283969
  if (handler) {
283952
283970
  handler(message, board);
283953
283971
  } else {
@@ -319826,12 +319844,7 @@ Upgrade to Plus to increase the limit and keep working`,
319826
319844
  myBoards: "My boards",
319827
319845
  notAvailable: "No boards available yet"
319828
319846
  },
319829
- addNew: "Add new",
319830
- itemsList: "Items list",
319831
- itemsTitle: "Items",
319832
- itemsSearch: "Search...",
319833
- itemsEmpty: "No items",
319834
- itemsNotFound: "Nothing found"
319847
+ addNew: "Add new"
319835
319848
  },
319836
319849
  contextMenu: {
319837
319850
  delete: "Delete",
@@ -321089,12 +321102,7 @@ var ru_default = {
321089
321102
  myBoards: "Мои доски",
321090
321103
  notAvailable: "Досок пока нет"
321091
321104
  },
321092
- addNew: "Добавить",
321093
- itemsList: "Список предметов",
321094
- itemsTitle: "Предметы",
321095
- itemsSearch: "Поиск...",
321096
- itemsEmpty: "Нет элементов",
321097
- itemsNotFound: "Ничего не найдено"
321105
+ addNew: "Добавить"
321098
321106
  },
321099
321107
  contextMenu: {
321100
321108
  delete: "Удалить",
@@ -364809,7 +364817,7 @@ class CanvasBase extends React106.Component {
364809
364817
  if (!ctx || !cursorsCtx) {
364810
364818
  return;
364811
364819
  }
364812
- const context = new DrawingContext(this.props.board.camera, ctx, cursorsCtx);
364820
+ const context = new DrawingContext2(this.props.board.camera, ctx, cursorsCtx);
364813
364821
  const { board } = this.props;
364814
364822
  context.setCamera(board.camera);
364815
364823
  context.clear();
@@ -364996,7 +365004,7 @@ var CanvasNoRouter = ({ app, board, children }) => {
364996
365004
  if (!ctx || !cursorsCtx) {
364997
365005
  return;
364998
365006
  }
364999
- const context = new DrawingContext(board.camera, ctx, cursorsCtx);
365007
+ const context = new DrawingContext2(board.camera, ctx, cursorsCtx);
365000
365008
  context.setCamera(board.camera);
365001
365009
  context.clear();
365002
365010
  context.clearCursor();
@@ -370888,7 +370896,6 @@ function BoardItemsList({
370888
370896
  }) {
370889
370897
  const { board } = useAppContext();
370890
370898
  const forceUpdate = useForceUpdate();
370891
- const { t: t10 } = useTranslation();
370892
370899
  useAppSubscription({
370893
370900
  subjects: ["items"],
370894
370901
  observer: forceUpdate
@@ -370902,7 +370909,7 @@ function BoardItemsList({
370902
370909
  if (matched.length === 0) {
370903
370910
  return /* @__PURE__ */ import_react205.default.createElement("div", {
370904
370911
  className: BoardItemsList_module_default.empty
370905
- }, t10("sidePanel.itemsNotFound"));
370912
+ }, "Ничего не найдено");
370906
370913
  }
370907
370914
  return /* @__PURE__ */ import_react205.default.createElement("div", {
370908
370915
  className: BoardItemsList_module_default.list
@@ -370917,7 +370924,7 @@ function BoardItemsList({
370917
370924
  if (topLevelItems.length === 0) {
370918
370925
  return /* @__PURE__ */ import_react205.default.createElement("div", {
370919
370926
  className: BoardItemsList_module_default.empty
370920
- }, t10("sidePanel.itemsEmpty"));
370927
+ }, "Нет элементов");
370921
370928
  }
370922
370929
  return /* @__PURE__ */ import_react205.default.createElement("div", {
370923
370930
  className: BoardItemsList_module_default.list
@@ -371184,7 +371191,7 @@ function SidePanel() {
371184
371191
  iconName: "ArrowLeft1"
371185
371192
  })), /* @__PURE__ */ import_react208.default.createElement("h3", {
371186
371193
  className: SidePanel_module_default.title
371187
- }, t10("sidePanel.itemsTitle")), /* @__PURE__ */ import_react208.default.createElement(UiButton, {
371194
+ }, "Предметы"), /* @__PURE__ */ import_react208.default.createElement(UiButton, {
371188
371195
  onClick: toggleSideMenu,
371189
371196
  variant: "secondary",
371190
371197
  className: SidePanel_module_default.close
@@ -371199,7 +371206,7 @@ function SidePanel() {
371199
371206
  className: SidePanel_module_default.itemsSearchIcon
371200
371207
  }), /* @__PURE__ */ import_react208.default.createElement("input", {
371201
371208
  className: SidePanel_module_default.itemsSearchInput,
371202
- placeholder: t10("sidePanel.itemsSearch"),
371209
+ placeholder: "Поиск...",
371203
371210
  ref: itemsSearchRef,
371204
371211
  value: itemsQuery,
371205
371212
  onChange: (e15) => setItemsQuery(e15.target.value)
@@ -371257,7 +371264,7 @@ function SidePanel() {
371257
371264
  iconName: "Stack",
371258
371265
  width: 16,
371259
371266
  height: 16
371260
- }), /* @__PURE__ */ import_react208.default.createElement("span", null, t10("sidePanel.itemsList"))), /* @__PURE__ */ import_react208.default.createElement("button", {
371267
+ }), /* @__PURE__ */ import_react208.default.createElement("span", null, "Список предметов")), /* @__PURE__ */ import_react208.default.createElement("button", {
371261
371268
  className: SidePanel_module_default.add,
371262
371269
  onClick: handleAddNewMenu
371263
371270
  }, /* @__PURE__ */ import_react208.default.createElement(Icon, {
@@ -445797,25 +445804,6 @@ var BoardPage = () => {
445797
445804
  });
445798
445805
  app.render();
445799
445806
  });
445800
- } else if (window.opener) {
445801
- boardsList.createBoard().then((boardId) => {
445802
- app.openBoard(boardId).then(() => {
445803
- navigate(`/boards/${boardId}`, { replace: true });
445804
- app.render();
445805
- console.log("[import] board ready, sending snapshot-ready to opener");
445806
- window.opener.postMessage({ type: "microboard-snapshot-ready" }, "*");
445807
- const onMessage = (event) => {
445808
- if (event.data?.type !== "microboard-snapshot")
445809
- return;
445810
- window.removeEventListener("message", onMessage);
445811
- const { html: html5 } = event.data;
445812
- console.log("[import] received snapshot, html length:", html5.length);
445813
- const added = app.getBoard().deserializeHTMLAndEmit(html5);
445814
- console.log("[import] deserializeHTMLAndEmit added ids:", added);
445815
- };
445816
- window.addEventListener("message", onMessage);
445817
- });
445818
- });
445819
445807
  } else {
445820
445808
  const lastSeenBoard = localStorage.getItem(LAST_BOARD_KEY);
445821
445809
  const isFirstVisit = !api7.get("first_visit");
@@ -445840,8 +445828,21 @@ var BoardPage = () => {
445840
445828
  } else {
445841
445829
  boardsList.createBoard().then((boardId) => {
445842
445830
  app.openBoard(boardId).then(() => {
445843
- navigate(`/boards/${boardId}`, { replace: true });
445831
+ navigate(`/boards/${boardId}`, {
445832
+ replace: true
445833
+ });
445844
445834
  app.render();
445835
+ if (window.opener) {
445836
+ window.opener.postMessage({ type: "microboard-snapshot-ready" }, "*");
445837
+ const onMessage = (event) => {
445838
+ if (event.data?.type !== "microboard-snapshot")
445839
+ return;
445840
+ window.removeEventListener("message", onMessage);
445841
+ const { html: html5 } = event.data;
445842
+ app.getBoard().deserializeHTMLAndEmit(html5);
445843
+ };
445844
+ window.addEventListener("message", onMessage);
445845
+ }
445845
445846
  });
445846
445847
  });
445847
445848
  }