@idraw/util 0.4.0-beta.1 → 0.4.0-beta.10

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.
@@ -17,8 +17,12 @@ var __privateSet = (obj, member, value, setter) => {
17
17
  setter ? setter.call(obj, value) : member.set(obj, value);
18
18
  return value;
19
19
  };
20
+ var __privateMethod = (obj, member, method) => {
21
+ __accessCheck(obj, member, "access private method");
22
+ return method;
23
+ };
20
24
 
21
- var _ctx, _opts;
25
+ var _ctx, _opts, _listeners, _temp, _backUpDefaultStorage, _createTempStorage, createTempStorage_fn;
22
26
  function compose(middleware) {
23
27
  return function(context, next) {
24
28
  return dispatch(0);
@@ -47,7 +51,7 @@ var __privateSet = (obj, member, value, setter) => {
47
51
  function throttle(fn, timeout) {
48
52
  let timer = -1;
49
53
  return function(...args) {
50
- if (timer > 0) {
54
+ if (timer >= 0) {
51
55
  return;
52
56
  }
53
57
  timer = setTimeout(() => {
@@ -56,20 +60,34 @@ var __privateSet = (obj, member, value, setter) => {
56
60
  }, timeout);
57
61
  };
58
62
  }
63
+ function debounce(fn, timeout) {
64
+ let timer = -1;
65
+ return function(...args) {
66
+ if (timer >= 0) {
67
+ window.clearTimeout(timer);
68
+ }
69
+ timer = setTimeout(() => {
70
+ fn(...args);
71
+ timer = -1;
72
+ }, timeout);
73
+ };
74
+ }
59
75
  function downloadImageFromCanvas(canvas, opts) {
60
- const { filename, type = "image/jpeg" } = opts;
76
+ const { fileName, type = "image/jpeg" } = opts;
61
77
  const stream = canvas.toDataURL(type);
62
- const downloadLink = document.createElement("a");
78
+ let downloadLink = document.createElement("a");
63
79
  downloadLink.href = stream;
64
- downloadLink.download = filename;
65
- const downloadClickEvent = document.createEvent("MouseEvents");
66
- downloadClickEvent.initEvent("click", true, false);
67
- downloadLink.dispatchEvent(downloadClickEvent);
80
+ downloadLink.download = fileName;
81
+ downloadLink.click();
82
+ downloadLink = null;
68
83
  }
69
84
  function pickFile(opts) {
70
- const { success, error } = opts;
85
+ const { accept, success, error } = opts;
71
86
  let input = document.createElement("input");
72
87
  input.type = "file";
88
+ if (accept) {
89
+ input.accept = accept;
90
+ }
73
91
  input.addEventListener("change", function() {
74
92
  var _a;
75
93
  const file = (_a = input.files) == null ? void 0 : _a[0];
@@ -122,6 +140,23 @@ var __privateSet = (obj, member, value, setter) => {
122
140
  reader.readAsText(file);
123
141
  });
124
142
  }
143
+ function parseTextToBlobURL(text2) {
144
+ const bytes = new TextEncoder().encode(text2);
145
+ const blob = new Blob([bytes], {
146
+ type: "text/plain;charset=utf-8"
147
+ });
148
+ const blobURL = window.URL.createObjectURL(blob);
149
+ return blobURL;
150
+ }
151
+ function downloadFileFromText(text2, opts) {
152
+ const { fileName } = opts;
153
+ const blobURL = parseTextToBlobURL(text2);
154
+ let downloadLink = document.createElement("a");
155
+ downloadLink.href = blobURL;
156
+ downloadLink.download = fileName;
157
+ downloadLink.click();
158
+ downloadLink = null;
159
+ }
125
160
  function toColorHexNum(color2) {
126
161
  return parseInt(color2.replace(/^\#/, "0x"));
127
162
  }
@@ -406,6 +441,19 @@ var __privateSet = (obj, member, value, setter) => {
406
441
  }
407
442
  return _clone(target);
408
443
  }
444
+ function deepCloneElement(element) {
445
+ const elem = deepClone(element);
446
+ const _resetUUID = (e) => {
447
+ e.uuid = createUUID();
448
+ if (e.type === "group" && e.detail.children) {
449
+ e.detail.children.forEach((child) => {
450
+ _resetUUID(child);
451
+ });
452
+ }
453
+ };
454
+ _resetUUID(elem);
455
+ return elem;
456
+ }
409
457
  function is$1(target) {
410
458
  return Object.prototype.toString.call(target).replace(/[\]|\[]{1,1}/gi, "").split(" ")[1];
411
459
  }
@@ -441,8 +489,78 @@ var __privateSet = (obj, member, value, setter) => {
441
489
  const html2 = elem.detail.html;
442
490
  const assetUUID = createAssetId(html2);
443
491
  if (!assets[assetUUID]) {
492
+ assets[assetUUID] = {
493
+ type: "html",
494
+ value: html2
495
+ };
496
+ }
497
+ elem.detail.html = assetUUID;
498
+ } else if (elem.type === "group" && Array.isArray(elem.detail.children)) {
499
+ const groupAssets = elem.detail.assets || {};
500
+ Object.keys(groupAssets).forEach((assetId) => {
501
+ if (!assets[assetId]) {
502
+ assets[assetId] = groupAssets[assetId];
503
+ }
504
+ });
505
+ delete elem.detail.assets;
506
+ _scanElements(elem.detail.children);
507
+ }
508
+ });
509
+ };
510
+ _scanElements(sortedData.elements);
511
+ sortedData.assets = assets;
512
+ return sortedData;
513
+ }
514
+ function filterCompactData(data, opts) {
515
+ const assets = data.assets || {};
516
+ const sortedData = deepClone(data);
517
+ const loadItemMap = (opts == null ? void 0 : opts.loadItemMap) || {};
518
+ const _scanElements = (elems) => {
519
+ elems.forEach((elem) => {
520
+ var _a, _b, _c;
521
+ if (elem.type === "image" && elem.detail.src) {
522
+ const src = elem.detail.src;
523
+ if (isAssetId(src) && !assets[src] && loadItemMap[src] && typeof ((_a = loadItemMap[src]) == null ? void 0 : _a.source) === "string") {
524
+ assets[src] = {
525
+ type: "image",
526
+ value: loadItemMap[src].source
527
+ };
528
+ } else {
529
+ const assetUUID = createAssetId(src);
530
+ if (!assets[assetUUID]) {
531
+ assets[assetUUID] = {
532
+ type: "image",
533
+ value: src
534
+ };
535
+ }
536
+ elem.detail.src = assetUUID;
537
+ }
538
+ } else if (elem.type === "svg") {
539
+ const svg2 = elem.detail.svg;
540
+ const assetUUID = createAssetId(svg2);
541
+ if (isAssetId(svg2) && !assets[svg2] && loadItemMap[svg2] && typeof ((_b = loadItemMap[svg2]) == null ? void 0 : _b.source) === "string") {
542
+ assets[svg2] = {
543
+ type: "svg",
544
+ value: loadItemMap[svg2].source
545
+ };
546
+ } else if (!assets[assetUUID]) {
444
547
  assets[assetUUID] = {
445
548
  type: "svg",
549
+ value: svg2
550
+ };
551
+ }
552
+ elem.detail.svg = assetUUID;
553
+ } else if (elem.type === "html") {
554
+ const html2 = elem.detail.html;
555
+ const assetUUID = createAssetId(html2);
556
+ if (isAssetId(html2) && !assets[html2] && loadItemMap[html2] && typeof ((_c = loadItemMap[html2]) == null ? void 0 : _c.source) === "string") {
557
+ assets[html2] = {
558
+ type: "html",
559
+ value: loadItemMap[html2].source
560
+ };
561
+ } else if (!assets[assetUUID]) {
562
+ assets[assetUUID] = {
563
+ type: "html",
446
564
  value: html2
447
565
  };
448
566
  }
@@ -808,6 +926,9 @@ var __privateSet = (obj, member, value, setter) => {
808
926
  $getContext() {
809
927
  return __privateGet(this, _ctx);
810
928
  }
929
+ $setContext(ctx) {
930
+ __privateSet(this, _ctx, ctx);
931
+ }
811
932
  $setFont(opts) {
812
933
  const strList = [];
813
934
  if (opts.fontWeight) {
@@ -1090,15 +1211,39 @@ var __privateSet = (obj, member, value, setter) => {
1090
1211
  });
1091
1212
  return context2d;
1092
1213
  }
1093
- function createViewContent(canvas, opts) {
1094
- const { width, height, devicePixelRatio, offscreen } = opts;
1214
+ function createBoardContent(canvas, opts) {
1215
+ const { width, height, devicePixelRatio, offscreen, createCustomContext2D } = opts;
1095
1216
  const ctxOpts = {
1096
1217
  width,
1097
1218
  height,
1098
1219
  devicePixelRatio
1099
1220
  };
1221
+ const ctx = canvas.getContext("2d");
1222
+ if (createCustomContext2D) {
1223
+ const viewContext = createCustomContext2D(ctxOpts);
1224
+ const helperContext = createCustomContext2D(ctxOpts);
1225
+ const underContext = createCustomContext2D(ctxOpts);
1226
+ const boardContext = createContext2D({ ctx, ...ctxOpts });
1227
+ const drawView = () => {
1228
+ const { width: w2, height: h2 } = viewContext.$getSize();
1229
+ boardContext.clearRect(0, 0, w2, h2);
1230
+ boardContext.drawImage(underContext.canvas, 0, 0, w2, h2);
1231
+ boardContext.drawImage(viewContext.canvas, 0, 0, w2, h2);
1232
+ boardContext.drawImage(helperContext.canvas, 0, 0, w2, h2);
1233
+ underContext.clearRect(0, 0, w2, h2);
1234
+ viewContext.clearRect(0, 0, w2, h2);
1235
+ helperContext.clearRect(0, 0, w2, h2);
1236
+ };
1237
+ const content = {
1238
+ underContext,
1239
+ viewContext,
1240
+ helperContext,
1241
+ boardContext,
1242
+ drawView
1243
+ };
1244
+ return content;
1245
+ }
1100
1246
  if (offscreen === true) {
1101
- const ctx = canvas.getContext("2d");
1102
1247
  const viewContext = createOffscreenContext2D(ctxOpts);
1103
1248
  const helperContext = createOffscreenContext2D(ctxOpts);
1104
1249
  const underContext = createOffscreenContext2D(ctxOpts);
@@ -1122,7 +1267,6 @@ var __privateSet = (obj, member, value, setter) => {
1122
1267
  };
1123
1268
  return content;
1124
1269
  } else {
1125
- const ctx = canvas.getContext("2d");
1126
1270
  const viewContext = createContext2D(ctxOpts);
1127
1271
  const helperContext = createContext2D(ctxOpts);
1128
1272
  const underContext = createContext2D(ctxOpts);
@@ -1148,20 +1292,21 @@ var __privateSet = (obj, member, value, setter) => {
1148
1292
  }
1149
1293
  class EventEmitter {
1150
1294
  constructor() {
1151
- this._listeners = /* @__PURE__ */ new Map();
1295
+ __privateAdd(this, _listeners, void 0);
1296
+ __privateSet(this, _listeners, /* @__PURE__ */ new Map());
1152
1297
  }
1153
1298
  on(eventKey, callback) {
1154
- if (this._listeners.has(eventKey)) {
1155
- const callbacks = this._listeners.get(eventKey) || [];
1299
+ if (__privateGet(this, _listeners).has(eventKey)) {
1300
+ const callbacks = __privateGet(this, _listeners).get(eventKey) || [];
1156
1301
  callbacks == null ? void 0 : callbacks.push(callback);
1157
- this._listeners.set(eventKey, callbacks);
1302
+ __privateGet(this, _listeners).set(eventKey, callbacks);
1158
1303
  } else {
1159
- this._listeners.set(eventKey, [callback]);
1304
+ __privateGet(this, _listeners).set(eventKey, [callback]);
1160
1305
  }
1161
1306
  }
1162
1307
  off(eventKey, callback) {
1163
- if (this._listeners.has(eventKey)) {
1164
- const callbacks = this._listeners.get(eventKey);
1308
+ if (__privateGet(this, _listeners).has(eventKey)) {
1309
+ const callbacks = __privateGet(this, _listeners).get(eventKey);
1165
1310
  if (Array.isArray(callbacks)) {
1166
1311
  for (let i = 0; i < (callbacks == null ? void 0 : callbacks.length); i++) {
1167
1312
  if (callbacks[i] === callback) {
@@ -1170,11 +1315,11 @@ var __privateSet = (obj, member, value, setter) => {
1170
1315
  }
1171
1316
  }
1172
1317
  }
1173
- this._listeners.set(eventKey, callbacks || []);
1318
+ __privateGet(this, _listeners).set(eventKey, callbacks || []);
1174
1319
  }
1175
1320
  }
1176
1321
  trigger(eventKey, e) {
1177
- const callbacks = this._listeners.get(eventKey);
1322
+ const callbacks = __privateGet(this, _listeners).get(eventKey);
1178
1323
  if (Array.isArray(callbacks)) {
1179
1324
  callbacks.forEach((cb) => {
1180
1325
  cb(e);
@@ -1185,15 +1330,19 @@ var __privateSet = (obj, member, value, setter) => {
1185
1330
  }
1186
1331
  }
1187
1332
  has(name) {
1188
- if (this._listeners.has(name)) {
1189
- const list = this._listeners.get(name);
1333
+ if (__privateGet(this, _listeners).has(name)) {
1334
+ const list = __privateGet(this, _listeners).get(name);
1190
1335
  if (Array.isArray(list) && list.length > 0) {
1191
1336
  return true;
1192
1337
  }
1193
1338
  }
1194
1339
  return false;
1195
1340
  }
1341
+ destroy() {
1342
+ __privateGet(this, _listeners).clear();
1343
+ }
1196
1344
  }
1345
+ _listeners = new WeakMap();
1197
1346
  function calcDistance(start, end) {
1198
1347
  const distance = (start.x - end.x) * (start.x - end.x) + (start.y - end.y) * (start.y - end.y);
1199
1348
  return distance === 0 ? distance : Math.sqrt(distance);
@@ -1226,25 +1375,34 @@ var __privateSet = (obj, member, value, setter) => {
1226
1375
  }
1227
1376
  class Store {
1228
1377
  constructor(opts) {
1229
- this._backUpDefaultStorage = deepClone(opts.defaultStorage);
1230
- this._temp = this._createTempStorage();
1378
+ __privateAdd(this, _createTempStorage);
1379
+ __privateAdd(this, _temp, void 0);
1380
+ __privateAdd(this, _backUpDefaultStorage, void 0);
1381
+ __privateSet(this, _backUpDefaultStorage, deepClone(opts.defaultStorage));
1382
+ __privateSet(this, _temp, __privateMethod(this, _createTempStorage, createTempStorage_fn).call(this));
1231
1383
  }
1232
1384
  set(name, value) {
1233
- this._temp[name] = value;
1385
+ __privateGet(this, _temp)[name] = value;
1234
1386
  }
1235
1387
  get(name) {
1236
- return this._temp[name];
1388
+ return __privateGet(this, _temp)[name];
1237
1389
  }
1238
1390
  getSnapshot() {
1239
- return deepClone(this._temp);
1391
+ return deepClone(__privateGet(this, _temp));
1240
1392
  }
1241
1393
  clear() {
1242
- this._temp = this._createTempStorage();
1394
+ __privateSet(this, _temp, __privateMethod(this, _createTempStorage, createTempStorage_fn).call(this));
1243
1395
  }
1244
- _createTempStorage() {
1245
- return deepClone(this._backUpDefaultStorage);
1396
+ destroy() {
1397
+ __privateSet(this, _temp, null);
1246
1398
  }
1247
1399
  }
1400
+ _temp = new WeakMap();
1401
+ _backUpDefaultStorage = new WeakMap();
1402
+ _createTempStorage = new WeakSet();
1403
+ createTempStorage_fn = function() {
1404
+ return deepClone(__privateGet(this, _backUpDefaultStorage));
1405
+ };
1248
1406
  function getViewScaleInfoFromSnapshot(snapshot) {
1249
1407
  const { activeStore } = snapshot;
1250
1408
  const sacelInfo = {
@@ -1505,6 +1663,58 @@ var __privateSet = (obj, member, value, setter) => {
1505
1663
  }
1506
1664
  return isValid;
1507
1665
  }
1666
+ function calcElementListSize(list) {
1667
+ var _a;
1668
+ const area = { x: 0, y: 0, w: 0, h: 0 };
1669
+ let prevElemSize = null;
1670
+ for (let i = 0; i < list.length; i++) {
1671
+ const elem = list[i];
1672
+ if ((_a = elem == null ? void 0 : elem.operations) == null ? void 0 : _a.invisible) {
1673
+ continue;
1674
+ }
1675
+ const elemSize = {
1676
+ x: elem.x,
1677
+ y: elem.y,
1678
+ w: elem.w,
1679
+ h: elem.h,
1680
+ angle: elem.angle || 0
1681
+ };
1682
+ if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
1683
+ const ves = rotateElementVertexes(elemSize);
1684
+ if (ves.length === 4) {
1685
+ const xList = [ves[0].x, ves[1].x, ves[2].x, ves[3].x];
1686
+ const yList = [ves[0].y, ves[1].y, ves[2].y, ves[3].y];
1687
+ elemSize.x = Math.min(...xList);
1688
+ elemSize.y = Math.min(...yList);
1689
+ elemSize.w = Math.abs(Math.max(...xList) - Math.min(...xList));
1690
+ elemSize.h = Math.abs(Math.max(...yList) - Math.min(...yList));
1691
+ }
1692
+ }
1693
+ if (prevElemSize) {
1694
+ const areaStartX = Math.min(elemSize.x, area.x);
1695
+ const areaStartY = Math.min(elemSize.y, area.y);
1696
+ const areaEndX = Math.max(elemSize.x + elemSize.w, area.x + area.w);
1697
+ const areaEndY = Math.max(elemSize.y + elemSize.h, area.y + area.h);
1698
+ area.x = areaStartX;
1699
+ area.y = areaStartY;
1700
+ area.w = Math.abs(areaEndX - areaStartX);
1701
+ area.h = Math.abs(areaEndY - areaStartY);
1702
+ } else {
1703
+ area.x = elemSize.x;
1704
+ area.y = elemSize.y;
1705
+ area.w = elemSize.w;
1706
+ area.h = elemSize.h;
1707
+ }
1708
+ prevElemSize = elemSize;
1709
+ }
1710
+ const listSize = {
1711
+ x: Math.floor(area.x),
1712
+ y: Math.floor(area.y),
1713
+ w: Math.ceil(area.w),
1714
+ h: Math.ceil(area.h)
1715
+ };
1716
+ return listSize;
1717
+ }
1508
1718
  function calcElementsContextSize(elements, opts) {
1509
1719
  const area = { x: 0, y: 0, w: 0, h: 0 };
1510
1720
  elements.forEach((elem) => {
@@ -1730,8 +1940,27 @@ var __privateSet = (obj, member, value, setter) => {
1730
1940
  }
1731
1941
  return result;
1732
1942
  }
1943
+ function findElementQueueFromListByPosition(position, list) {
1944
+ const result = [];
1945
+ let tempList = list;
1946
+ for (let i = 0; i < position.length; i++) {
1947
+ const pos = position[i];
1948
+ const item = tempList[pos];
1949
+ if (item) {
1950
+ result.push(item);
1951
+ } else {
1952
+ break;
1953
+ }
1954
+ if (i < position.length - 1 && item.type === "group") {
1955
+ tempList = item.detail.children;
1956
+ } else {
1957
+ break;
1958
+ }
1959
+ }
1960
+ return result;
1961
+ }
1733
1962
  function getElementPositionFromList(uuid, elements) {
1734
- let result = [];
1963
+ const result = [];
1735
1964
  let over = false;
1736
1965
  const _loop = (list) => {
1737
1966
  var _a;
@@ -2064,6 +2293,10 @@ var __privateSet = (obj, member, value, setter) => {
2064
2293
  const topRightCenter = vertexes[1];
2065
2294
  const bottomRightCenter = vertexes[2];
2066
2295
  const bottomLeftCenter = vertexes[3];
2296
+ const topMiddleSize = createControllerElementSizeFromCenter(topCenter, { size: ctrlSize, angle: totalAngle });
2297
+ const rightMiddleSize = createControllerElementSizeFromCenter(rightCenter, { size: ctrlSize, angle: totalAngle });
2298
+ const bottomMiddleSize = createControllerElementSizeFromCenter(bottomCenter, { size: ctrlSize, angle: totalAngle });
2299
+ const leftMiddleSize = createControllerElementSizeFromCenter(leftCenter, { size: ctrlSize, angle: totalAngle });
2067
2300
  const topLeftSize = createControllerElementSizeFromCenter(topLeftCenter, { size: ctrlSize, angle: totalAngle });
2068
2301
  const topRightSize = createControllerElementSizeFromCenter(topRightCenter, { size: ctrlSize, angle: totalAngle });
2069
2302
  const bottomLeftSize = createControllerElementSizeFromCenter(bottomLeftCenter, { size: ctrlSize, angle: totalAngle });
@@ -2076,6 +2309,10 @@ var __privateSet = (obj, member, value, setter) => {
2076
2309
  const rightVertexes = [topRightVertexes[3], topRightVertexes[2], bottomRightVertexes[1], bottomRightVertexes[0]];
2077
2310
  const bottomVertexes = [bottomLeftVertexes[1], bottomRightVertexes[0], bottomRightVertexes[3], bottomLeftVertexes[2]];
2078
2311
  const leftVertexes = [topLeftVertexes[3], topLeftVertexes[2], bottomLeftVertexes[1], bottomLeftVertexes[0]];
2312
+ const topMiddleVertexes = calcElementVertexes(topMiddleSize);
2313
+ const rightMiddleVertexes = calcElementVertexes(rightMiddleSize);
2314
+ const bottomMiddleVertexes = calcElementVertexes(bottomMiddleSize);
2315
+ const leftMiddleVertexes = calcElementVertexes(leftMiddleSize);
2079
2316
  const sizeController = {
2080
2317
  elementWrapper: vertexes,
2081
2318
  left: {
@@ -2117,6 +2354,26 @@ var __privateSet = (obj, member, value, setter) => {
2117
2354
  type: "bottom-right",
2118
2355
  vertexes: bottomRightVertexes,
2119
2356
  center: bottomRightCenter
2357
+ },
2358
+ leftMiddle: {
2359
+ type: "left-middle",
2360
+ vertexes: leftMiddleVertexes,
2361
+ center: leftCenter
2362
+ },
2363
+ rightMiddle: {
2364
+ type: "right-middle",
2365
+ vertexes: rightMiddleVertexes,
2366
+ center: rightCenter
2367
+ },
2368
+ topMiddle: {
2369
+ type: "top-middle",
2370
+ vertexes: topMiddleVertexes,
2371
+ center: topCenter
2372
+ },
2373
+ bottomMiddle: {
2374
+ type: "bottom-middle",
2375
+ vertexes: bottomMiddleVertexes,
2376
+ center: bottomCenter
2120
2377
  }
2121
2378
  };
2122
2379
  return sizeController;
@@ -2354,6 +2611,7 @@ var __privateSet = (obj, member, value, setter) => {
2354
2611
  }
2355
2612
  return radian;
2356
2613
  }
2614
+ const defaultText = "Text Element";
2357
2615
  function getDefaultElementDetailConfig() {
2358
2616
  const config = {
2359
2617
  boxSizing: "border-box",
@@ -2383,24 +2641,22 @@ var __privateSet = (obj, member, value, setter) => {
2383
2641
  };
2384
2642
  return detail;
2385
2643
  }
2386
- function getDefaultElementCircleDetail(opts) {
2644
+ function getDefaultElementCircleDetail() {
2387
2645
  const detail = {
2388
2646
  background: "#D9D9D9",
2389
2647
  radius: 0
2390
2648
  };
2391
2649
  return detail;
2392
2650
  }
2393
- function getDefaultElementTextDetail(opts) {
2394
- var _a;
2651
+ function getDefaultElementTextDetail(elementSize) {
2395
2652
  const detailConfig = getDefaultElementDetailConfig();
2396
- const scale = ((_a = opts == null ? void 0 : opts.viewScaleInfo) == null ? void 0 : _a.scale) || 1;
2397
2653
  const detail = {
2398
- text: "Text Element",
2654
+ text: defaultText,
2399
2655
  color: detailConfig.color,
2400
2656
  fontFamily: detailConfig.fontFamily,
2401
2657
  fontWeight: detailConfig.fontWeight,
2402
- lineHeight: detailConfig.fontSize * scale,
2403
- fontSize: detailConfig.fontSize * scale,
2658
+ lineHeight: elementSize.w / defaultText.length,
2659
+ fontSize: elementSize.w / defaultText.length,
2404
2660
  textAlign: "center",
2405
2661
  verticalAlign: "middle"
2406
2662
  };
@@ -2418,7 +2674,7 @@ var __privateSet = (obj, member, value, setter) => {
2418
2674
  };
2419
2675
  return detail;
2420
2676
  }
2421
- function getDefaultElementGroupDetail(opts) {
2677
+ function getDefaultElementGroupDetail() {
2422
2678
  const detail = {
2423
2679
  children: [],
2424
2680
  background: "#D9D9D9",
@@ -2430,8 +2686,9 @@ var __privateSet = (obj, member, value, setter) => {
2430
2686
  function calcViewBoxSize(viewElem, opts) {
2431
2687
  const { viewScaleInfo } = opts;
2432
2688
  const { scale } = viewScaleInfo;
2433
- let { borderRadius: borderRadius2, boxSizing = defaultElemConfig.boxSizing, borderWidth: borderWidth2 } = viewElem.detail;
2434
- if (typeof borderWidth2 !== "number") {
2689
+ let { borderRadius: borderRadius2 } = viewElem.detail;
2690
+ const { boxSizing = defaultElemConfig.boxSizing, borderWidth: borderWidth2 } = viewElem.detail;
2691
+ if (Array.isArray(borderWidth2)) {
2435
2692
  borderRadius2 = 0;
2436
2693
  }
2437
2694
  let { x: x2, y: y2, w: w2, h: h2 } = viewElem;
@@ -2475,9 +2732,105 @@ var __privateSet = (obj, member, value, setter) => {
2475
2732
  radiusList
2476
2733
  };
2477
2734
  }
2735
+ const doNum = (n) => {
2736
+ return formatNumber(n, { decimalPlaces: 4 });
2737
+ };
2738
+ function resizeElementBaseDetail(elem, opts) {
2739
+ const { detail } = elem;
2740
+ const { xRatio, yRatio, maxRatio } = opts;
2741
+ const middleRatio = (xRatio + yRatio) / 2;
2742
+ const { borderWidth: borderWidth2, borderRadius: borderRadius2, borderDash, shadowOffsetX, shadowOffsetY, shadowBlur } = detail;
2743
+ if (typeof borderWidth2 === "number") {
2744
+ detail.borderWidth = doNum(borderWidth2 * middleRatio);
2745
+ } else if (Array.isArray(detail.borderWidth)) {
2746
+ const bw = borderWidth2;
2747
+ detail.borderWidth = [doNum(bw[0] * yRatio), doNum(bw[1] * xRatio), doNum(bw[2] * yRatio), doNum(bw[3] * xRatio)];
2748
+ }
2749
+ if (typeof borderRadius2 === "number") {
2750
+ detail.borderRadius = doNum(borderRadius2 * middleRatio);
2751
+ } else if (Array.isArray(detail.borderRadius)) {
2752
+ const br = borderRadius2;
2753
+ detail.borderRadius = [br[0] * xRatio, br[1] * xRatio, br[2] * yRatio, br[3] * yRatio];
2754
+ }
2755
+ if (Array.isArray(borderDash)) {
2756
+ borderDash.forEach((dash, i) => {
2757
+ detail.borderDash[i] = doNum(dash * maxRatio);
2758
+ });
2759
+ }
2760
+ if (typeof shadowOffsetX === "number") {
2761
+ detail.shadowOffsetX = doNum(shadowOffsetX * maxRatio);
2762
+ }
2763
+ if (typeof shadowOffsetY === "number") {
2764
+ detail.shadowOffsetX = doNum(shadowOffsetY * maxRatio);
2765
+ }
2766
+ if (typeof shadowBlur === "number") {
2767
+ detail.shadowOffsetX = doNum(shadowBlur * maxRatio);
2768
+ }
2769
+ }
2770
+ function resizeElementBase(elem, opts) {
2771
+ const { xRatio, yRatio } = opts;
2772
+ const { x: x2, y: y2, w: w2, h: h2 } = elem;
2773
+ elem.x = doNum(x2 * xRatio);
2774
+ elem.y = doNum(y2 * yRatio);
2775
+ elem.w = doNum(w2 * xRatio);
2776
+ elem.h = doNum(h2 * yRatio);
2777
+ resizeElementBaseDetail(elem, opts);
2778
+ }
2779
+ function resizeTextElementDetail(elem, opts) {
2780
+ const { minRatio, maxRatio } = opts;
2781
+ const { fontSize: fontSize2, lineHeight: lineHeight2 } = elem.detail;
2782
+ const ratio = (minRatio + maxRatio) / 2;
2783
+ if (fontSize2 && fontSize2 > 0) {
2784
+ elem.detail.fontSize = doNum(fontSize2 * ratio);
2785
+ }
2786
+ if (lineHeight2 && lineHeight2 > 0) {
2787
+ elem.detail.lineHeight = doNum(lineHeight2 * ratio);
2788
+ }
2789
+ }
2790
+ function resizeElement(elem, opts) {
2791
+ const { type } = elem;
2792
+ resizeElementBase(elem, opts);
2793
+ if (type === "circle")
2794
+ ;
2795
+ else if (type === "text") {
2796
+ resizeTextElementDetail(elem, opts);
2797
+ } else if (type === "image")
2798
+ ;
2799
+ else if (type === "svg")
2800
+ ;
2801
+ else if (type === "html")
2802
+ ;
2803
+ else if (type === "path")
2804
+ ;
2805
+ else if (type === "group" && Array.isArray(elem.detail.children)) {
2806
+ elem.detail.children.forEach((child) => {
2807
+ resizeElement(child, opts);
2808
+ });
2809
+ }
2810
+ }
2811
+ function deepResizeGroupElement(elem, size) {
2812
+ const resizeW = size.w && size.w > 0 ? size.w : elem.w;
2813
+ const resizeH = size.h && size.h > 0 ? size.h : elem.h;
2814
+ const xRatio = resizeW / elem.w;
2815
+ const yRatio = resizeH / elem.h;
2816
+ if (xRatio === yRatio && xRatio === 1) {
2817
+ return elem;
2818
+ }
2819
+ const minRatio = Math.min(xRatio, yRatio);
2820
+ const maxRatio = Math.max(xRatio, yRatio);
2821
+ elem.w = resizeW;
2822
+ elem.h = resizeH;
2823
+ const opts = { xRatio, yRatio, minRatio, maxRatio };
2824
+ if (elem.type === "group" && Array.isArray(elem.detail.children)) {
2825
+ elem.detail.children.forEach((child) => {
2826
+ resizeElement(child, opts);
2827
+ });
2828
+ }
2829
+ resizeElementBaseDetail(elem, opts);
2830
+ return elem;
2831
+ }
2478
2832
  const defaultViewWidth = 200;
2479
2833
  const defaultViewHeight = 200;
2480
- const defaultDetail = getDefaultElementDetailConfig();
2481
2834
  function createElementSize(type, opts) {
2482
2835
  let x2 = 0;
2483
2836
  let y2 = 0;
@@ -2487,26 +2840,23 @@ var __privateSet = (obj, member, value, setter) => {
2487
2840
  const { viewScaleInfo, viewSizeInfo } = opts;
2488
2841
  const { scale, offsetLeft, offsetTop } = viewScaleInfo;
2489
2842
  const { width, height } = viewSizeInfo;
2490
- if (type === "text") {
2491
- const textDetail = getDefaultElementTextDetail();
2492
- w2 = defaultDetail.fontSize * scale * textDetail.text.length;
2493
- h2 = defaultDetail.fontSize * scale * 2;
2843
+ const limitViewWidth = width / 4;
2844
+ const limitViewHeight = height / 4;
2845
+ if (defaultViewWidth >= limitViewWidth) {
2846
+ w2 = limitViewWidth / scale;
2494
2847
  } else {
2495
- const limitViewWidth = width / 4;
2496
- const limitViewHeight = height / 4;
2497
- if (defaultViewWidth >= limitViewWidth) {
2498
- w2 = limitViewWidth / scale;
2499
- } else {
2500
- w2 = defaultViewWidth / scale;
2501
- }
2502
- if (defaultViewHeight >= limitViewHeight) {
2503
- h2 = limitViewHeight / scale;
2504
- } else {
2505
- h2 = defaultViewHeight / scale;
2506
- }
2507
- if (["circle", "svg", "image"].includes(type)) {
2508
- w2 = h2 = Math.max(w2, h2);
2509
- }
2848
+ w2 = defaultViewWidth / scale;
2849
+ }
2850
+ if (defaultViewHeight >= limitViewHeight) {
2851
+ h2 = limitViewHeight / scale;
2852
+ } else {
2853
+ h2 = defaultViewHeight / scale;
2854
+ }
2855
+ if (["circle", "svg", "image"].includes(type)) {
2856
+ w2 = h2 = Math.max(w2, h2);
2857
+ } else if (type === "text") {
2858
+ const fontSize2 = w2 / defaultText.length;
2859
+ h2 = fontSize2 * 2;
2510
2860
  }
2511
2861
  x2 = (0 - offsetLeft + width / 2 - w2 * scale / 2) / scale;
2512
2862
  y2 = (0 - offsetTop + height / 2 - h2 * scale / 2) / scale;
@@ -2520,16 +2870,14 @@ var __privateSet = (obj, member, value, setter) => {
2520
2870
  return elemSize;
2521
2871
  }
2522
2872
  function createElement(type, baseElem, opts) {
2523
- const elemSize = createElementSize(type, opts);
2873
+ const elementSize = createElementSize(type, opts);
2524
2874
  let detail = {};
2525
2875
  if (type === "rect") {
2526
2876
  detail = getDefaultElementRectDetail();
2527
2877
  } else if (type === "circle") {
2528
- detail = getDefaultElementCircleDetail({
2529
- radius: elemSize.w
2530
- });
2878
+ detail = getDefaultElementCircleDetail();
2531
2879
  } else if (type === "text") {
2532
- detail = getDefaultElementTextDetail(opts);
2880
+ detail = getDefaultElementTextDetail(elementSize);
2533
2881
  } else if (type === "svg") {
2534
2882
  detail = getDefaultElementSVGDetail();
2535
2883
  } else if (type === "image") {
@@ -2538,7 +2886,7 @@ var __privateSet = (obj, member, value, setter) => {
2538
2886
  detail = getDefaultElementGroupDetail();
2539
2887
  }
2540
2888
  const elem = {
2541
- ...elemSize,
2889
+ ...elementSize,
2542
2890
  ...baseElem,
2543
2891
  uuid: createUUID(),
2544
2892
  type,
@@ -2674,26 +3022,86 @@ var __privateSet = (obj, member, value, setter) => {
2674
3022
  return originElem;
2675
3023
  }
2676
3024
  function updateElementInList(uuid, updateContent, elements) {
2677
- var _a;
3025
+ var _a, _b;
2678
3026
  let targetElement = null;
2679
3027
  for (let i = 0; i < elements.length; i++) {
2680
3028
  const elem = elements[i];
2681
3029
  if (elem.uuid === uuid) {
3030
+ if (elem.type === "group" && ((_a = elem.operations) == null ? void 0 : _a.deepResize) === true) {
3031
+ if (updateContent.w && updateContent.w > 0 || updateContent.h && updateContent.h > 0) {
3032
+ deepResizeGroupElement(elem, {
3033
+ w: updateContent.w,
3034
+ h: updateContent.h
3035
+ });
3036
+ }
3037
+ }
2682
3038
  mergeElement(elem, updateContent);
2683
3039
  targetElement = elem;
2684
3040
  break;
2685
3041
  } else if (elem.type === "group") {
2686
- targetElement = updateElementInList(uuid, updateContent, ((_a = elem == null ? void 0 : elem.detail) == null ? void 0 : _a.children) || []);
3042
+ targetElement = updateElementInList(uuid, updateContent, ((_b = elem == null ? void 0 : elem.detail) == null ? void 0 : _b.children) || []);
2687
3043
  }
2688
3044
  }
2689
3045
  return targetElement;
2690
3046
  }
3047
+ function calcViewCenterContent(data, opts) {
3048
+ let offsetX = 0;
3049
+ let offsetY = 0;
3050
+ let scale = 0;
3051
+ let contentX = 0;
3052
+ let contentY = 0;
3053
+ let contentW = 0;
3054
+ let contentH = 0;
3055
+ const { width, height } = opts.viewSizeInfo;
3056
+ data.elements.forEach((elem) => {
3057
+ const elemSize = {
3058
+ x: elem.x,
3059
+ y: elem.y,
3060
+ w: elem.w,
3061
+ h: elem.h,
3062
+ angle: elem.angle
3063
+ };
3064
+ if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
3065
+ const ves = rotateElementVertexes(elemSize);
3066
+ if (ves.length === 4) {
3067
+ const xList = [ves[0].x, ves[1].x, ves[2].x, ves[3].x];
3068
+ const yList = [ves[0].y, ves[1].y, ves[2].y, ves[3].y];
3069
+ elemSize.x = Math.min(...xList);
3070
+ elemSize.y = Math.min(...yList);
3071
+ elemSize.w = Math.abs(Math.max(...xList) - Math.min(...xList));
3072
+ elemSize.h = Math.abs(Math.max(...yList) - Math.min(...yList));
3073
+ }
3074
+ }
3075
+ const areaStartX = Math.min(elemSize.x, contentX);
3076
+ const areaStartY = Math.min(elemSize.y, contentY);
3077
+ const areaEndX = Math.max(elemSize.x + elemSize.w, contentX + contentW);
3078
+ const areaEndY = Math.max(elemSize.y + elemSize.h, contentY + contentH);
3079
+ contentX = areaStartX;
3080
+ contentY = areaStartY;
3081
+ contentW = Math.abs(areaEndX - areaStartX);
3082
+ contentH = Math.abs(areaEndY - areaStartY);
3083
+ });
3084
+ if (contentW > 0 && contentH > 0) {
3085
+ const scaleW = formatNumber(width / contentW, { decimalPlaces: 4 });
3086
+ const scaleH = formatNumber(height / contentH, { decimalPlaces: 4 });
3087
+ scale = Math.min(scaleW, scaleH, 1);
3088
+ offsetX = (contentW * scale - width) / 2 / scale;
3089
+ offsetY = (contentH * scale - height) / 2 / scale;
3090
+ }
3091
+ const result = {
3092
+ offsetX: formatNumber(offsetX, { decimalPlaces: 0 }),
3093
+ offsetY: formatNumber(offsetY, { decimalPlaces: 0 }),
3094
+ scale
3095
+ };
3096
+ return result;
3097
+ }
2691
3098
  exports.Context2D = Context2D;
2692
3099
  exports.EventEmitter = EventEmitter;
2693
3100
  exports.Store = Store;
2694
3101
  exports.calcDistance = calcDistance;
2695
3102
  exports.calcElementCenter = calcElementCenter;
2696
3103
  exports.calcElementCenterFromVertexes = calcElementCenterFromVertexes;
3104
+ exports.calcElementListSize = calcElementListSize;
2697
3105
  exports.calcElementQueueVertexesQueueInGroup = calcElementQueueVertexesQueueInGroup;
2698
3106
  exports.calcElementSizeController = calcElementSizeController;
2699
3107
  exports.calcElementVertexesInGroup = calcElementVertexesInGroup;
@@ -2702,6 +3110,7 @@ var __privateSet = (obj, member, value, setter) => {
2702
3110
  exports.calcElementsViewInfo = calcElementsViewInfo;
2703
3111
  exports.calcSpeed = calcSpeed;
2704
3112
  exports.calcViewBoxSize = calcViewBoxSize;
3113
+ exports.calcViewCenterContent = calcViewCenterContent;
2705
3114
  exports.calcViewElementSize = calcViewElementSize;
2706
3115
  exports.calcViewPointSize = calcViewPointSize;
2707
3116
  exports.calcViewScaleInfo = calcViewScaleInfo;
@@ -2714,21 +3123,27 @@ var __privateSet = (obj, member, value, setter) => {
2714
3123
  exports.compose = compose;
2715
3124
  exports.compressImage = compressImage;
2716
3125
  exports.createAssetId = createAssetId;
3126
+ exports.createBoardContent = createBoardContent;
2717
3127
  exports.createContext2D = createContext2D;
2718
3128
  exports.createElement = createElement;
2719
3129
  exports.createOffscreenContext2D = createOffscreenContext2D;
2720
3130
  exports.createUUID = createUUID;
2721
- exports.createViewContent = createViewContent;
3131
+ exports.debounce = debounce;
2722
3132
  exports.deepClone = deepClone;
3133
+ exports.deepCloneElement = deepCloneElement;
3134
+ exports.deepResizeGroupElement = deepResizeGroupElement;
2723
3135
  exports.delay = delay;
2724
3136
  exports.deleteElementInList = deleteElementInList;
2725
3137
  exports.deleteElementInListByPosition = deleteElementInListByPosition;
3138
+ exports.downloadFileFromText = downloadFileFromText;
2726
3139
  exports.downloadImageFromCanvas = downloadImageFromCanvas;
2727
3140
  exports.equalPoint = equalPoint;
2728
3141
  exports.equalTouchPoint = equalTouchPoint;
3142
+ exports.filterCompactData = filterCompactData;
2729
3143
  exports.filterElementAsset = filterElementAsset;
2730
3144
  exports.findElementFromList = findElementFromList;
2731
3145
  exports.findElementFromListByPosition = findElementFromListByPosition;
3146
+ exports.findElementQueueFromListByPosition = findElementQueueFromListByPosition;
2732
3147
  exports.findElementsFromList = findElementsFromList;
2733
3148
  exports.findElementsFromListByPositions = findElementsFromListByPositions;
2734
3149
  exports.formatNumber = formatNumber;