@leafer/worker 1.9.9 → 1.9.11

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.
@@ -249,7 +249,7 @@ class LeafData {
249
249
 
250
250
  let tempA, tempB, tempTo;
251
251
 
252
- const {max: max$5} = Math, tempFour = [ 0, 0, 0, 0 ];
252
+ const {max: max$6} = Math, tempFour = [ 0, 0, 0, 0 ];
253
253
 
254
254
  const FourNumberHelper = {
255
255
  zero: [ ...tempFour ],
@@ -263,7 +263,7 @@ const FourNumberHelper = {
263
263
  return to;
264
264
  },
265
265
  setTemp(top, right, bottom, left) {
266
- return set$1(tempFour, top, right, bottom, left);
266
+ return set$2(tempFour, top, right, bottom, left);
267
267
  },
268
268
  toTempAB(a, b, change) {
269
269
  tempTo = change ? isNumber(a) ? b : a : [];
@@ -301,24 +301,24 @@ const FourNumberHelper = {
301
301
  return data;
302
302
  },
303
303
  max(t, other, change) {
304
- if (isNumber(t) && isNumber(other)) return max$5(t, other);
304
+ if (isNumber(t) && isNumber(other)) return max$6(t, other);
305
305
  toTempAB(t, other, change);
306
- return set$1(tempTo, max$5(tempA[0], tempB[0]), max$5(tempA[1], tempB[1]), max$5(tempA[2], tempB[2]), max$5(tempA[3], tempB[3]));
306
+ return set$2(tempTo, max$6(tempA[0], tempB[0]), max$6(tempA[1], tempB[1]), max$6(tempA[2], tempB[2]), max$6(tempA[3], tempB[3]));
307
307
  },
308
308
  add(t, other, change) {
309
309
  if (isNumber(t) && isNumber(other)) return t + other;
310
310
  toTempAB(t, other, change);
311
- return set$1(tempTo, tempA[0] + tempB[0], tempA[1] + tempB[1], tempA[2] + tempB[2], tempA[3] + tempB[3]);
311
+ return set$2(tempTo, tempA[0] + tempB[0], tempA[1] + tempB[1], tempA[2] + tempB[2], tempA[3] + tempB[3]);
312
312
  },
313
313
  swapAndScale(t, scaleX, scaleY, change) {
314
314
  if (isNumber(t)) return scaleX === scaleY ? t * scaleX : [ t * scaleY, t * scaleX ];
315
315
  const to = change ? t : [];
316
316
  const [top, right, bottom, left] = t.length === 4 ? t : get$5(t);
317
- return set$1(to, bottom * scaleY, left * scaleX, top * scaleY, right * scaleX);
317
+ return set$2(to, bottom * scaleY, left * scaleX, top * scaleY, right * scaleX);
318
318
  }
319
319
  };
320
320
 
321
- const {set: set$1, get: get$5, setTemp: setTemp, toTempAB: toTempAB} = FourNumberHelper;
321
+ const {set: set$2, get: get$5, setTemp: setTemp, toTempAB: toTempAB} = FourNumberHelper;
322
322
 
323
323
  const {round: round$6, pow: pow$2, PI: PI$4} = Math;
324
324
 
@@ -720,7 +720,7 @@ const M$b = MatrixHelper;
720
720
 
721
721
  const {toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3} = MatrixHelper;
722
722
 
723
- const {sin: sin$5, cos: cos$5, abs: abs$7, sqrt: sqrt$4, atan2: atan2$2, min: min$1, round: round$5} = Math;
723
+ const {sin: sin$5, cos: cos$5, abs: abs$a, sqrt: sqrt$4, atan2: atan2$2, min: min$2, round: round$5} = Math;
724
724
 
725
725
  const PointHelper = {
726
726
  defaultPoint: getPointData(),
@@ -813,12 +813,12 @@ const PointHelper = {
813
813
  return getDistanceFrom(t.x, t.y, point.x, point.y);
814
814
  },
815
815
  getDistanceFrom(x1, y1, x2, y2) {
816
- const x = abs$7(x2 - x1);
817
- const y = abs$7(y2 - y1);
816
+ const x = abs$a(x2 - x1);
817
+ const y = abs$a(y2 - y1);
818
818
  return sqrt$4(x * x + y * y);
819
819
  },
820
820
  getMinDistanceFrom(x1, y1, x2, y2, x3, y3) {
821
- return min$1(getDistanceFrom(x1, y1, x2, y2), getDistanceFrom(x2, y2, x3, y3));
821
+ return min$2(getDistanceFrom(x1, y1, x2, y2), getDistanceFrom(x2, y2, x3, y3));
822
822
  },
823
823
  getAngle(t, to) {
824
824
  return getAtan2(t, to) / OneRadian;
@@ -2592,11 +2592,11 @@ const RectHelper = {
2592
2592
  }
2593
2593
  };
2594
2594
 
2595
- const {sin: sin$4, cos: cos$4, hypot: hypot, atan2: atan2$1, ceil: ceil$2, abs: abs$6, PI: PI$3, sqrt: sqrt$3, pow: pow$1} = Math;
2595
+ const {sin: sin$4, cos: cos$4, hypot: hypot, atan2: atan2$1, ceil: ceil$2, abs: abs$9, PI: PI$3, sqrt: sqrt$3, pow: pow$1} = Math;
2596
2596
 
2597
2597
  const {setPoint: setPoint$4, addPoint: addPoint$2} = TwoPointBoundsHelper;
2598
2598
 
2599
- const {set: set, toNumberPoints: toNumberPoints$1} = PointHelper;
2599
+ const {set: set$1, toNumberPoints: toNumberPoints$1} = PointHelper;
2600
2600
 
2601
2601
  const {M: M$a, L: L$a, C: C$8, Q: Q$7, Z: Z$8} = PathCommandMap;
2602
2602
 
@@ -2667,14 +2667,14 @@ const BezierHelper = {
2667
2667
  const lenCB = hypot(CBx, CBy);
2668
2668
  let totalRadian = endRadian - startRadian;
2669
2669
  if (totalRadian < 0) totalRadian += PI2;
2670
- if (lenBA < 1e-12 || lenCB < 1e-12 || totalRadian < 1e-12 || abs$6(totalRadian - PI$3) < 1e-12) {
2670
+ if (lenBA < 1e-12 || lenCB < 1e-12 || totalRadian < 1e-12 || abs$9(totalRadian - PI$3) < 1e-12) {
2671
2671
  if (data) data.push(L$a, x1, y1);
2672
2672
  if (setPointBounds) {
2673
2673
  setPoint$4(setPointBounds, fromX, fromY);
2674
2674
  addPoint$2(setPointBounds, x1, y1);
2675
2675
  }
2676
- if (setStartPoint) set(setStartPoint, fromX, fromY);
2677
- if (setEndPoint) set(setEndPoint, x1, y1);
2676
+ if (setStartPoint) set$1(setStartPoint, fromX, fromY);
2677
+ if (setEndPoint) set$1(setEndPoint, x1, y1);
2678
2678
  return;
2679
2679
  }
2680
2680
  const anticlockwise = BAx * CBy - CBx * BAy < 0;
@@ -2700,7 +2700,7 @@ const BezierHelper = {
2700
2700
  let totalRadian = endRadian - startRadian;
2701
2701
  if (totalRadian < 0) totalRadian += PI2; else if (totalRadian > PI2) totalRadian -= PI2;
2702
2702
  if (anticlockwise) totalRadian -= PI2;
2703
- const parts = ceil$2(abs$6(totalRadian / PI_2));
2703
+ const parts = ceil$2(abs$9(totalRadian / PI_2));
2704
2704
  const partRadian = totalRadian / parts;
2705
2705
  const partRadian4Sin = sin$4(partRadian / 4);
2706
2706
  const control = 8 / 3 * partRadian4Sin * partRadian4Sin / sin$4(partRadian / 2);
@@ -2714,7 +2714,7 @@ const BezierHelper = {
2714
2714
  let fromX = cx + x, fromY = cy + y;
2715
2715
  if (data) data.push(data.length ? L$a : M$a, fromX, fromY);
2716
2716
  if (setPointBounds) setPoint$4(setPointBounds, fromX, fromY);
2717
- if (setStartPoint) set(setStartPoint, fromX, fromY);
2717
+ if (setStartPoint) set$1(setStartPoint, fromX, fromY);
2718
2718
  for (let i = 0; i < parts; i++) {
2719
2719
  endCos = cos$4(endRadian);
2720
2720
  endSin = sin$4(endRadian);
@@ -2733,7 +2733,7 @@ const BezierHelper = {
2733
2733
  startRadian = endRadian;
2734
2734
  endRadian += partRadian;
2735
2735
  }
2736
- if (setEndPoint) set(setEndPoint, cx + x, cy + y);
2736
+ if (setEndPoint) set$1(setEndPoint, cx + x, cy + y);
2737
2737
  },
2738
2738
  quadraticCurveTo(data, fromX, fromY, x1, y1, toX, toY) {
2739
2739
  data.push(C$8, (fromX + 2 * x1) / 3, (fromY + 2 * y1) / 3, (toX + 2 * x1) / 3, (toY + 2 * y1) / 3, toX, toY);
@@ -3167,7 +3167,7 @@ const {M: M$8, L: L$8, C: C$6, Q: Q$5, Z: Z$6, N: N$4, D: D$5, X: X$4, G: G$4, F
3167
3167
 
3168
3168
  const {getMinDistanceFrom: getMinDistanceFrom, getRadianFrom: getRadianFrom} = PointHelper;
3169
3169
 
3170
- const {tan: tan, min: min, abs: abs$5} = Math;
3170
+ const {tan: tan, min: min$1, abs: abs$8} = Math;
3171
3171
 
3172
3172
  const startPoint = {};
3173
3173
 
@@ -3225,7 +3225,7 @@ const PathCommandDataHelper = {
3225
3225
  arcTo(data, x1, y1, x2, y2, radius, lastX, lastY) {
3226
3226
  if (!isUndefined(lastX)) {
3227
3227
  const d = getMinDistanceFrom(lastX, lastY, x1, y1, x2, y2);
3228
- radius = min(radius, min(d / 2, d / 2 * abs$5(tan(getRadianFrom(lastX, lastY, x1, y1, x2, y2) / 2))));
3228
+ radius = min$1(radius, min$1(d / 2, d / 2 * abs$8(tan(getRadianFrom(lastX, lastY, x1, y1, x2, y2) / 2))));
3229
3229
  }
3230
3230
  data.push(U$4, x1, y1, x2, y2, radius);
3231
3231
  },
@@ -3840,7 +3840,12 @@ class TaskProcessor {
3840
3840
  runTask() {
3841
3841
  const task = this.list[this.index];
3842
3842
  if (!task) {
3843
- this.nextTask();
3843
+ this.timer = setTimeout(() => this.nextTask());
3844
+ return;
3845
+ }
3846
+ if (task.isCancel) {
3847
+ this.index++;
3848
+ this.runTask();
3844
3849
  return;
3845
3850
  }
3846
3851
  task.run().then(() => {
@@ -3871,16 +3876,15 @@ class TaskProcessor {
3871
3876
  }
3872
3877
  setParallelList() {
3873
3878
  let task;
3879
+ const {config: config, list: list, index: index} = this;
3874
3880
  this.parallelList = [];
3875
3881
  this.parallelSuccessNumber = 0;
3876
- let end = this.index + this.config.parallel;
3877
- if (end > this.list.length) end = this.list.length;
3878
- for (let i = this.index; i < end; i++) {
3879
- task = this.list[i];
3880
- if (task.parallel) {
3881
- this.parallelList.push(task);
3882
- } else {
3883
- break;
3882
+ let end = index + config.parallel;
3883
+ if (end > list.length) end = list.length;
3884
+ if (config.parallel > 1) {
3885
+ for (let i = index; i < end; i++) {
3886
+ task = list[i];
3887
+ if (task.parallel) this.parallelList.push(task); else break;
3884
3888
  }
3885
3889
  }
3886
3890
  }
@@ -4023,7 +4027,7 @@ const I$1 = ImageManager;
4023
4027
 
4024
4028
  const {IMAGE: IMAGE, create: create$1} = IncrementId;
4025
4029
 
4026
- const {floor: floor$2, max: max$4} = Math;
4030
+ const {floor: floor$2, max: max$5} = Math;
4027
4031
 
4028
4032
  class LeaferImage {
4029
4033
  get url() {
@@ -4112,7 +4116,7 @@ class LeaferImage {
4112
4116
  }
4113
4117
  if (data) return data;
4114
4118
  }
4115
- const canvas = Platform.origin.createCanvas(max$4(floor$2(width + (xGap || 0)), 1), max$4(floor$2(height + (yGap || 0)), 1));
4119
+ const canvas = Platform.origin.createCanvas(max$5(floor$2(width + (xGap || 0)), 1), max$5(floor$2(height + (yGap || 0)), 1));
4116
4120
  const ctx = canvas.getContext("2d");
4117
4121
  if (opacity) ctx.globalAlpha = opacity;
4118
4122
  ctx.imageSmoothingEnabled = smooth === false ? false : true;
@@ -6815,7 +6819,7 @@ class LeafLevelList {
6815
6819
  }
6816
6820
  }
6817
6821
 
6818
- const version = "1.9.9";
6822
+ const version = "1.9.11";
6819
6823
 
6820
6824
  class LeaferCanvas extends LeaferCanvasBase {
6821
6825
  get allowBackgroundColor() {
@@ -7481,7 +7485,7 @@ class Picker {
7481
7485
  children: [ target ]
7482
7486
  } : target);
7483
7487
  const {list: list} = this.findList;
7484
- const leaf = this.getBestMatchLeaf(list, options.bottomList, ignoreHittable);
7488
+ const leaf = this.getBestMatchLeaf(list, options.bottomList, ignoreHittable, !!options.findList);
7485
7489
  const path = ignoreHittable ? this.getPath(leaf) : this.getHitablePath(leaf);
7486
7490
  this.clear();
7487
7491
  return through ? {
@@ -7496,7 +7500,7 @@ class Picker {
7496
7500
  hitPoint(hitPoint, hitRadius, options) {
7497
7501
  return !!this.getByPoint(hitPoint, hitRadius, options).target;
7498
7502
  }
7499
- getBestMatchLeaf(list, bottomList, ignoreHittable) {
7503
+ getBestMatchLeaf(list, bottomList, ignoreHittable, allowNull) {
7500
7504
  const findList = this.findList = new LeafList;
7501
7505
  if (list.length) {
7502
7506
  let find;
@@ -7527,15 +7531,27 @@ class Picker {
7527
7531
  if (findList.length) return findList.list[0];
7528
7532
  }
7529
7533
  }
7534
+ if (allowNull) return null;
7530
7535
  return ignoreHittable ? list[0] : list.find(item => LeafHelper.worldHittable(item));
7531
7536
  }
7532
7537
  getPath(leaf) {
7533
- const path = new LeafList;
7538
+ const path = new LeafList, syncList = [], {target: target} = this;
7534
7539
  while (leaf) {
7540
+ if (leaf.syncEventer) syncList.push(leaf.syncEventer);
7535
7541
  path.add(leaf);
7536
7542
  leaf = leaf.parent;
7543
+ if (leaf === target) break;
7544
+ }
7545
+ if (syncList.length) {
7546
+ syncList.forEach(item => {
7547
+ while (item) {
7548
+ if (item.__.hittable) path.add(item);
7549
+ item = item.parent;
7550
+ if (item === target) break;
7551
+ }
7552
+ });
7537
7553
  }
7538
- if (this.target) path.add(this.target);
7554
+ if (target) path.add(target);
7539
7555
  return path;
7540
7556
  }
7541
7557
  getHitablePath(leaf) {
@@ -8033,12 +8049,12 @@ class ImageData extends RectData {
8033
8049
  }
8034
8050
  __getData() {
8035
8051
  const data = super.__getData();
8036
- delete data.fill;
8052
+ if (data.url) delete data.fill;
8037
8053
  return data;
8038
8054
  }
8039
8055
  __getInputData(names, options) {
8040
8056
  const data = super.__getInputData(names, options);
8041
- delete data.fill;
8057
+ if (data.url) delete data.fill;
8042
8058
  return data;
8043
8059
  }
8044
8060
  }
@@ -8057,7 +8073,7 @@ class CanvasData extends RectData {
8057
8073
  }
8058
8074
  }
8059
8075
 
8060
- const {max: max$3, add: add$1} = FourNumberHelper;
8076
+ const {max: max$4, add: add$1} = FourNumberHelper;
8061
8077
 
8062
8078
  const UIBounds = {
8063
8079
  __updateStrokeSpread() {
@@ -8073,7 +8089,7 @@ const UIBounds = {
8073
8089
  }
8074
8090
  if (data.__useArrow) spread += strokeWidth * 5;
8075
8091
  if (box) {
8076
- spread = max$3(spread, box.__layout.strokeSpread = box.__updateStrokeSpread());
8092
+ spread = max$4(spread, box.__layout.strokeSpread = box.__updateStrokeSpread());
8077
8093
  boxSpread = Math.max(boxSpread, box.__layout.strokeBoxSpread);
8078
8094
  }
8079
8095
  this.__layout.strokeBoxSpread = boxSpread;
@@ -8083,86 +8099,18 @@ const UIBounds = {
8083
8099
  let spread = 0;
8084
8100
  const {shadow: shadow, innerShadow: innerShadow, blur: blur, backgroundBlur: backgroundBlur, filter: filter, renderSpread: renderSpread} = this.__, {strokeSpread: strokeSpread} = this.__layout, box = this.__box;
8085
8101
  if (shadow) spread = Effect.getShadowRenderSpread(this, shadow);
8086
- if (blur) spread = max$3(spread, blur);
8102
+ if (blur) spread = max$4(spread, blur);
8087
8103
  if (filter) spread = add$1(spread, Filter.getSpread(filter));
8088
8104
  if (renderSpread) spread = add$1(spread, renderSpread);
8089
8105
  if (strokeSpread) spread = add$1(spread, strokeSpread);
8090
8106
  let shapeSpread = spread;
8091
- if (innerShadow) shapeSpread = max$3(shapeSpread, Effect.getInnerShadowSpread(this, innerShadow));
8092
- if (backgroundBlur) shapeSpread = max$3(shapeSpread, backgroundBlur);
8107
+ if (innerShadow) shapeSpread = max$4(shapeSpread, Effect.getInnerShadowSpread(this, innerShadow));
8108
+ if (backgroundBlur) shapeSpread = max$4(shapeSpread, backgroundBlur);
8093
8109
  this.__layout.renderShapeSpread = shapeSpread;
8094
- return box ? max$3(box.__updateRenderSpread(), spread) : spread;
8110
+ return box ? max$4(box.__updateRenderSpread(), spread) : spread;
8095
8111
  }
8096
8112
  };
8097
8113
 
8098
- const {float: float$1} = MathHelper;
8099
-
8100
- const tempContent = new Bounds, tempMerge = new Bounds, tempIntersect = new Bounds;
8101
-
8102
- const DragBoundsHelper = {
8103
- limitMove(leaf, move) {
8104
- const {dragBounds: dragBounds, dragBoundsType: dragBoundsType} = leaf;
8105
- if (dragBounds) D$2.getValidMove(leaf.__localBoxBounds, D$2.getDragBounds(leaf), dragBoundsType, move, true);
8106
- D$2.axisMove(leaf, move);
8107
- },
8108
- limitScaleOf(leaf, origin, scale) {
8109
- const {dragBounds: dragBounds, dragBoundsType: dragBoundsType} = leaf;
8110
- if (dragBounds) D$2.getValidScaleOf(leaf.__localBoxBounds, D$2.getDragBounds(leaf), dragBoundsType, leaf.getLocalPointByInner(leaf.getInnerPointByBox(origin)), scale, true);
8111
- },
8112
- axisMove(leaf, move) {
8113
- const {draggable: draggable} = leaf;
8114
- if (draggable === "x") move.y = 0;
8115
- if (draggable === "y") move.x = 0;
8116
- },
8117
- getDragBounds(leaf) {
8118
- const {dragBounds: dragBounds} = leaf;
8119
- return dragBounds === "parent" ? leaf.parent.boxBounds : dragBounds;
8120
- },
8121
- isInnerMode(content, dragBounds, dragBoundsType, sideType) {
8122
- return dragBoundsType === "inner" || dragBoundsType === "auto" && content[sideType] > dragBounds[sideType];
8123
- },
8124
- getValidMove(content, dragBounds, dragBoundsType, move, change) {
8125
- const x = content.x + move.x, y = content.y + move.y, right = x + content.width, bottom = y + content.height;
8126
- const boundsRight = dragBounds.x + dragBounds.width, boundsBottom = dragBounds.y + dragBounds.height;
8127
- if (!change) move = Object.assign({}, move);
8128
- if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "width")) {
8129
- if (x > dragBounds.x) move.x += dragBounds.x - x; else if (right < boundsRight) move.x += boundsRight - right;
8130
- } else {
8131
- if (x < dragBounds.x) move.x += dragBounds.x - x; else if (right > boundsRight) move.x += boundsRight - right;
8132
- }
8133
- if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "height")) {
8134
- if (y > dragBounds.y) move.y += dragBounds.y - y; else if (bottom < boundsBottom) move.y += boundsBottom - bottom;
8135
- } else {
8136
- if (y < dragBounds.y) move.y += dragBounds.y - y; else if (bottom > boundsBottom) move.y += boundsBottom - bottom;
8137
- }
8138
- move.x = float$1(move.x);
8139
- move.y = float$1(move.y);
8140
- return move;
8141
- },
8142
- getValidScaleOf(content, dragBounds, dragBoundsType, origin, scale, change) {
8143
- if (!change) scale = Object.assign({}, scale);
8144
- let fitScaleX, fitScaleY;
8145
- tempContent.set(content).scaleOf(origin, scale.x, scale.y).unsign();
8146
- tempMerge.set(tempContent).add(dragBounds);
8147
- tempIntersect.set(tempContent).intersect(dragBounds);
8148
- if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "width")) {
8149
- fitScaleX = tempMerge.width / tempContent.width;
8150
- } else {
8151
- fitScaleX = tempIntersect.width / tempContent.width;
8152
- }
8153
- if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "height")) {
8154
- fitScaleY = tempMerge.height / tempContent.height;
8155
- } else {
8156
- fitScaleY = tempIntersect.height / tempContent.height;
8157
- }
8158
- scale.x = float$1(tempIntersect.width) ? scale.x * fitScaleX : 1;
8159
- scale.y = float$1(tempIntersect.height) ? scale.y * fitScaleY : 1;
8160
- return scale;
8161
- }
8162
- };
8163
-
8164
- const D$2 = DragBoundsHelper;
8165
-
8166
8114
  const {stintSet: stintSet$1} = DataHelper;
8167
8115
 
8168
8116
  const UIRender = {
@@ -9828,6 +9776,106 @@ class UIEvent extends Event {
9828
9776
  }
9829
9777
  }
9830
9778
 
9779
+ const {min: min, max: max$3, abs: abs$7} = Math, {float: float$1, sign: sign$2} = MathHelper, {minX: minX, maxX: maxX, minY: minY, maxY: maxY} = BoundsHelper;
9780
+
9781
+ const tempContent = new Bounds, tempDragBounds = new Bounds;
9782
+
9783
+ const DragBoundsHelper = {
9784
+ limitMove(leaf, move) {
9785
+ const {dragBounds: dragBounds, dragBoundsType: dragBoundsType} = leaf;
9786
+ if (dragBounds) D$2.getValidMove(leaf.__localBoxBounds, D$2.getDragBounds(leaf), dragBoundsType, move, true);
9787
+ D$2.axisMove(leaf, move);
9788
+ },
9789
+ limitScaleOf(leaf, origin, scale, lockRatio) {
9790
+ const {dragBounds: dragBounds, dragBoundsType: dragBoundsType} = leaf;
9791
+ if (dragBounds) D$2.getValidScaleOf(leaf.__localBoxBounds, D$2.getDragBounds(leaf), dragBoundsType, leaf.getLocalPointByInner(leaf.getInnerPointByBox(origin)), scale, lockRatio, true);
9792
+ },
9793
+ axisMove(leaf, move) {
9794
+ const {draggable: draggable} = leaf;
9795
+ if (draggable === "x") move.y = 0;
9796
+ if (draggable === "y") move.x = 0;
9797
+ },
9798
+ getDragBounds(leaf) {
9799
+ const {dragBounds: dragBounds} = leaf;
9800
+ return dragBounds === "parent" ? leaf.parent.boxBounds : dragBounds;
9801
+ },
9802
+ isInnerMode(content, dragBounds, dragBoundsType, sideType) {
9803
+ return dragBoundsType === "inner" || dragBoundsType === "auto" && content[sideType] > dragBounds[sideType];
9804
+ },
9805
+ getValidMove(content, dragBounds, dragBoundsType, move, change) {
9806
+ const x = content.x + move.x, y = content.y + move.y, right = x + content.width, bottom = y + content.height;
9807
+ const boundsRight = dragBounds.x + dragBounds.width, boundsBottom = dragBounds.y + dragBounds.height;
9808
+ if (!change) move = Object.assign({}, move);
9809
+ if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "width")) {
9810
+ if (x > dragBounds.x) move.x += dragBounds.x - x; else if (right < boundsRight) move.x += boundsRight - right;
9811
+ } else {
9812
+ if (x < dragBounds.x) move.x += dragBounds.x - x; else if (right > boundsRight) move.x += boundsRight - right;
9813
+ }
9814
+ if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "height")) {
9815
+ if (y > dragBounds.y) move.y += dragBounds.y - y; else if (bottom < boundsBottom) move.y += boundsBottom - bottom;
9816
+ } else {
9817
+ if (y < dragBounds.y) move.y += dragBounds.y - y; else if (bottom > boundsBottom) move.y += boundsBottom - bottom;
9818
+ }
9819
+ move.x = float$1(move.x);
9820
+ move.y = float$1(move.y);
9821
+ return move;
9822
+ },
9823
+ getValidScaleOf(content, dragBounds, dragBoundsType, origin, scale, lockRatio, change) {
9824
+ if (!change) scale = Object.assign({}, scale);
9825
+ tempDragBounds.set(dragBounds);
9826
+ tempContent.set(content).scaleOf(origin, scale.x, scale.y);
9827
+ const originLeftScale = (origin.x - content.x) / content.width, originRightScale = 1 - originLeftScale;
9828
+ const originTopScale = (origin.y - content.y) / content.height, originBottomScale = 1 - originTopScale;
9829
+ let correctScaleX = 1, correctScaleY = 1, aScale, bScale, aSize, bSize;
9830
+ if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "width")) {
9831
+ if (scale.x < 0) tempContent.scaleOf(origin, correctScaleX = 1 / scale.x, 1);
9832
+ aSize = float$1(tempContent.minX - tempDragBounds.minX);
9833
+ bSize = float$1(tempDragBounds.maxX - tempContent.maxX);
9834
+ aScale = originLeftScale && aSize > 0 ? 1 + aSize / (originLeftScale * tempContent.width) : 1;
9835
+ bScale = originRightScale && bSize > 0 ? 1 + bSize / (originRightScale * tempContent.width) : 1;
9836
+ correctScaleX *= max$3(aScale, bScale);
9837
+ } else {
9838
+ if (scale.x < 0) {
9839
+ if (float$1(minX(content) - minX(dragBounds)) <= 0 || float$1(maxX(dragBounds) - maxX(content)) <= 0) tempContent.scaleOf(origin, correctScaleX = 1 / scale.x, 1);
9840
+ tempContent.unsign();
9841
+ }
9842
+ aSize = float$1(tempDragBounds.minX - tempContent.minX);
9843
+ bSize = float$1(tempContent.maxX - tempDragBounds.maxX);
9844
+ aScale = originLeftScale && aSize > 0 ? 1 - aSize / (originLeftScale * tempContent.width) : 1;
9845
+ bScale = originRightScale && bSize > 0 ? 1 - bSize / (originRightScale * tempContent.width) : 1;
9846
+ correctScaleX *= min(aScale, bScale);
9847
+ }
9848
+ if (D$2.isInnerMode(content, dragBounds, dragBoundsType, "height")) {
9849
+ if (scale.y < 0) tempContent.scaleOf(origin, 1, correctScaleY = 1 / scale.y);
9850
+ aSize = float$1(tempContent.minY - tempDragBounds.minY);
9851
+ bSize = float$1(tempDragBounds.maxY - tempContent.maxY);
9852
+ aScale = originTopScale && aSize > 0 ? 1 + aSize / (originTopScale * tempContent.height) : 1;
9853
+ bScale = originBottomScale && bSize > 0 ? 1 + bSize / (originBottomScale * tempContent.height) : 1;
9854
+ correctScaleY *= max$3(aScale, bScale);
9855
+ if (lockRatio) {
9856
+ aScale = max$3(abs$7(correctScaleX), abs$7(correctScaleY));
9857
+ correctScaleX = sign$2(correctScaleX) * aScale;
9858
+ correctScaleY = sign$2(correctScaleY) * aScale;
9859
+ }
9860
+ } else {
9861
+ if (scale.y < 0) {
9862
+ if (float$1(minY(content) - minY(dragBounds)) <= 0 || float$1(maxY(dragBounds) - maxY(content)) <= 0) tempContent.scaleOf(origin, 1, correctScaleY = 1 / scale.y);
9863
+ tempContent.unsign();
9864
+ }
9865
+ aSize = float$1(tempDragBounds.minY - tempContent.minY);
9866
+ bSize = float$1(tempContent.maxY - tempDragBounds.maxY);
9867
+ aScale = originTopScale && aSize > 0 ? 1 - aSize / (originTopScale * tempContent.height) : 1;
9868
+ bScale = originBottomScale && bSize > 0 ? 1 - bSize / (originBottomScale * tempContent.height) : 1;
9869
+ correctScaleY *= min(aScale, bScale);
9870
+ }
9871
+ scale.x *= isFinite(correctScaleX) ? correctScaleX : 1;
9872
+ scale.y *= isFinite(correctScaleY) ? correctScaleY : 1;
9873
+ return scale;
9874
+ }
9875
+ };
9876
+
9877
+ const D$2 = DragBoundsHelper;
9878
+
9831
9879
  let PointerEvent = class PointerEvent extends UIEvent {};
9832
9880
 
9833
9881
  PointerEvent.POINTER = "pointer";
@@ -10898,9 +10946,9 @@ const ui$5 = UI.prototype;
10898
10946
 
10899
10947
  ui$5.__updateHitCanvas = function() {
10900
10948
  if (this.__box) this.__box.__updateHitCanvas();
10901
- const leafer = this.leafer || this.parent && this.parent.leafer;
10902
- if (!leafer) return;
10903
- const data = this.__, {hitCanvasManager: hitCanvasManager} = leafer;
10949
+ const {hitCanvasManager: hitCanvasManager} = this.leafer || this.parent && this.parent.leafer || {};
10950
+ if (!hitCanvasManager) return;
10951
+ const data = this.__;
10904
10952
  const isHitPixelFill = (data.__isAlphaPixelFill || data.__isCanvas) && data.hitFill === "pixel";
10905
10953
  const isHitPixelStroke = data.__isAlphaPixelStroke && data.hitStroke === "pixel";
10906
10954
  const isHitPixel = isHitPixelFill || isHitPixelStroke;
@@ -11372,7 +11420,14 @@ const PaintModule = {
11372
11420
 
11373
11421
  let origin$1 = {}, tempMatrix$1 = getMatrixData();
11374
11422
 
11375
- const {get: get$3, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent: multiplyParent, scale: scaleHelper, rotate: rotate$2, skew: skewHelper} = MatrixHelper;
11423
+ const {get: get$3, set: set, rotateOfOuter: rotateOfOuter$1, translate: translate$1, scaleOfOuter: scaleOfOuter$1, multiplyParent: multiplyParent, scale: scaleHelper, rotate: rotate$2, skew: skewHelper} = MatrixHelper;
11424
+
11425
+ function stretchMode(data, box, scaleX, scaleY) {
11426
+ const transform = get$3();
11427
+ translate$1(transform, box.x, box.y);
11428
+ if (scaleX) scaleHelper(transform, scaleX, scaleY);
11429
+ data.transform = transform;
11430
+ }
11376
11431
 
11377
11432
  function fillOrFitMode(data, box, x, y, scaleX, scaleY, rotation) {
11378
11433
  const transform = get$3();
@@ -11389,8 +11444,11 @@ function clipMode(data, box, x, y, scaleX, scaleY, rotation, skew, clipScaleX, c
11389
11444
  const transform = get$3();
11390
11445
  layout$3(transform, box, x, y, scaleX, scaleY, rotation, skew);
11391
11446
  if (clipScaleX) {
11392
- tempMatrix$1.a = clipScaleX, tempMatrix$1.d = clipScaleY;
11393
- multiplyParent(transform, tempMatrix$1);
11447
+ if (rotation || skew) {
11448
+ set(tempMatrix$1);
11449
+ scaleOfOuter$1(tempMatrix$1, box, clipScaleX, clipScaleY);
11450
+ multiplyParent(transform, tempMatrix$1);
11451
+ } else scaleOfOuter$1(transform, box, clipScaleX, clipScaleY);
11394
11452
  }
11395
11453
  data.transform = transform;
11396
11454
  }
@@ -11486,7 +11544,10 @@ function getPatternData(paint, box, image) {
11486
11544
  if (offset) PointHelper.move(tempImage, offset);
11487
11545
  switch (mode) {
11488
11546
  case "stretch":
11489
- if (!sameBox) width = box.width, height = box.height;
11547
+ if (!sameBox) {
11548
+ scaleX = box.width / width, scaleY = box.height / height;
11549
+ stretchMode(data, box, scaleX, scaleY);
11550
+ }
11490
11551
  break;
11491
11552
 
11492
11553
  case "normal":
@@ -11495,7 +11556,7 @@ function getPatternData(paint, box, image) {
11495
11556
  let clipScaleX, clipScaleY;
11496
11557
  if (clipSize) clipScaleX = box.width / clipSize.width, clipScaleY = box.height / clipSize.height;
11497
11558
  clipMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation, skew, clipScaleX, clipScaleY);
11498
- if (clipScaleX) scaleX = scaleX ? scaleX * clipScaleX : scaleX, scaleY = scaleY ? scaleY * clipScaleY : clipScaleY;
11559
+ if (clipScaleX) scaleX = scaleX ? scaleX * clipScaleX : clipScaleX, scaleY = scaleY ? scaleY * clipScaleY : clipScaleY;
11499
11560
  }
11500
11561
  break;
11501
11562
 
@@ -11512,17 +11573,14 @@ function getPatternData(paint, box, image) {
11512
11573
  if (scaleX) fillOrFitMode(data, box, tempImage.x, tempImage.y, scaleX, scaleY, rotation);
11513
11574
  }
11514
11575
  if (!data.transform) {
11515
- if (box.x || box.y) {
11516
- data.transform = get$2();
11517
- translate(data.transform, box.x, box.y);
11518
- }
11576
+ if (box.x || box.y) translate(data.transform = get$2(), box.x, box.y);
11519
11577
  }
11520
- if (scaleX && mode !== "stretch") {
11578
+ data.width = width;
11579
+ data.height = height;
11580
+ if (scaleX) {
11521
11581
  data.scaleX = scaleX;
11522
11582
  data.scaleY = scaleY;
11523
11583
  }
11524
- data.width = width;
11525
- data.height = height;
11526
11584
  if (opacity) data.opacity = opacity;
11527
11585
  if (filters) data.filters = filters;
11528
11586
  if (repeat) data.repeat = isString(repeat) ? repeat === "x" ? "repeat-x" : "repeat-y" : "repeat";
@@ -11654,7 +11712,7 @@ function ignoreRender(ui, value) {
11654
11712
 
11655
11713
  const {get: get$1, scale: scale$2, copy: copy$4} = MatrixHelper;
11656
11714
 
11657
- const {floor: floor$1, ceil: ceil$1, max: max$2, abs: abs$4} = Math;
11715
+ const {floor: floor$1, ceil: ceil$1, max: max$2, abs: abs$6} = Math;
11658
11716
 
11659
11717
  function createPattern(ui, paint, pixelRatio) {
11660
11718
  let {scaleX: scaleX, scaleY: scaleY} = ui.getRenderScaleData(true, paint.scaleFixed);
@@ -11665,8 +11723,8 @@ function createPattern(ui, paint, pixelRatio) {
11665
11723
  scaleX *= pixelRatio;
11666
11724
  scaleY *= pixelRatio;
11667
11725
  if (sx) {
11668
- sx = abs$4(sx);
11669
- sy = abs$4(sy);
11726
+ sx = abs$6(sx);
11727
+ sy = abs$6(sy);
11670
11728
  imageMatrix = get$1();
11671
11729
  copy$4(imageMatrix, transform);
11672
11730
  scale$2(imageMatrix, 1 / sx, 1 / sy);
@@ -11808,6 +11866,7 @@ const PaintImageModule = {
11808
11866
  recycleImage: recycleImage,
11809
11867
  createData: createData,
11810
11868
  getPatternData: getPatternData,
11869
+ stretchMode: stretchMode,
11811
11870
  fillOrFitMode: fillOrFitMode,
11812
11871
  clipMode: clipMode,
11813
11872
  repeatMode: repeatMode
@@ -11918,7 +11977,7 @@ const PaintGradientModule = {
11918
11977
  getTransform: getTransform
11919
11978
  };
11920
11979
 
11921
- const {copy: copy$3, move: move$6, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper, {max: max$1} = Math;
11980
+ const {copy: copy$3, move: move$6, toOffsetOutBounds: toOffsetOutBounds$1} = BoundsHelper, {max: max$1, abs: abs$5} = Math;
11922
11981
 
11923
11982
  const tempBounds = {}, tempMatrix = new Matrix;
11924
11983
 
@@ -11962,7 +12021,7 @@ function shadow$1(ui, current, shape) {
11962
12021
  function getShadowRenderSpread(_ui, shadow) {
11963
12022
  let top = 0, right = 0, bottom = 0, left = 0, x, y, spread, blur;
11964
12023
  shadow.forEach(item => {
11965
- x = item.x || 0, y = item.y || 0, spread = item.spread || 0, blur = (item.blur || 0) * 1.5;
12024
+ x = item.x || 0, y = item.y || 0, blur = (item.blur || 0) * 1.5, spread = abs$5(item.spread || 0);
11966
12025
  top = max$1(top, spread + blur - y);
11967
12026
  right = max$1(right, spread + blur + x);
11968
12027
  bottom = max$1(bottom, spread + blur + y);
@@ -11973,11 +12032,11 @@ function getShadowRenderSpread(_ui, shadow) {
11973
12032
 
11974
12033
  function getShadowTransform(ui, canvas, _shape, shadow, outBounds, otherScale, isInnerShaodw) {
11975
12034
  if (shadow.spread) {
11976
- const spreadScale = 1 + shadow.spread * 2 / ui.__layout.strokeBounds.width * otherScale * (isInnerShaodw ? -1 : 1);
12035
+ const spread = shadow.spread * 2 * otherScale * (isInnerShaodw ? -1 : 1), {width: width, height: height} = ui.__layout.strokeBounds;
11977
12036
  tempMatrix.set().scaleOfOuter({
11978
12037
  x: (outBounds.x + outBounds.width / 2) * canvas.pixelRatio,
11979
12038
  y: (outBounds.y + outBounds.height / 2) * canvas.pixelRatio
11980
- }, spreadScale);
12039
+ }, 1 + spread / width, 1 + spread / height);
11981
12040
  return tempMatrix;
11982
12041
  }
11983
12042
  return undefined;
@@ -12738,7 +12797,10 @@ function targetAttr(fn) {
12738
12797
  t.setDimOthers(false);
12739
12798
  t.setBright(false);
12740
12799
  if (isArray(value) && value.length > 1 && value[0].locked) value.splice(0, 1);
12741
- if (t.single) t.element.syncEventer = null;
12800
+ if (t.single) {
12801
+ delete t.element.syncEventer;
12802
+ delete t.element.__world.ignorePixelSnap;
12803
+ }
12742
12804
  }
12743
12805
  const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER;
12744
12806
  if (this.hasEvent(type)) this.emitEvent(new EditorEvent(type, {
@@ -12759,7 +12821,15 @@ function mergeConfigAttr() {
12759
12821
  defineKey(target, key, {
12760
12822
  get() {
12761
12823
  const {config: config, element: element, dragPoint: dragPoint, editBox: editBox, app: app} = this, mergeConfig = Object.assign({}, config);
12762
- if (element && element.editConfig) Object.assign(mergeConfig, element.editConfig);
12824
+ if (element && element.editConfig) {
12825
+ let {editConfig: editConfig} = element;
12826
+ if (editConfig.hover || editConfig.hoverStyle) {
12827
+ editConfig = Object.assign({}, editConfig);
12828
+ delete editConfig.hover;
12829
+ delete editConfig.hoverStyle;
12830
+ }
12831
+ Object.assign(mergeConfig, editConfig);
12832
+ }
12763
12833
  if (editBox.config) Object.assign(mergeConfig, editBox.config);
12764
12834
  if (dragPoint) {
12765
12835
  if (dragPoint.editConfig) Object.assign(mergeConfig, dragPoint.editConfig);
@@ -12776,7 +12846,7 @@ function mergeConfigAttr() {
12776
12846
  };
12777
12847
  }
12778
12848
 
12779
- const {abs: abs$3} = Math;
12849
+ const {abs: abs$4} = Math;
12780
12850
 
12781
12851
  const {copy: copy$2, scale: scale$1} = MatrixHelper;
12782
12852
 
@@ -12819,7 +12889,7 @@ class Stroker extends UI {
12819
12889
  leaf = list[i];
12820
12890
  const {worldTransform: worldTransform, worldRenderBounds: worldRenderBounds} = leaf;
12821
12891
  if (worldRenderBounds.width && worldRenderBounds.height && (!bounds || bounds.hit(worldRenderBounds, options.matrix))) {
12822
- const aScaleX = abs$3(worldTransform.scaleX), aScaleY = abs$3(worldTransform.scaleY);
12892
+ const aScaleX = abs$4(worldTransform.scaleX), aScaleY = abs$4(worldTransform.scaleY);
12823
12893
  copy$2(matrix$1, worldTransform);
12824
12894
  matrix$1.half = strokeWidth % 2;
12825
12895
  if (aScaleX !== aScaleY) {
@@ -12833,7 +12903,7 @@ class Stroker extends UI {
12833
12903
  canvas.setWorld(matrix$1, options.matrix);
12834
12904
  canvas.beginPath();
12835
12905
  if (leaf.__.__useArrow) leaf.__drawPath(canvas); else leaf.__.__pathForRender ? leaf.__drawRenderPath(canvas) : leaf.__drawPathByBox(canvas);
12836
- data.strokeWidth = strokeWidth / abs$3(worldTransform.scaleX);
12906
+ data.strokeWidth = strokeWidth / abs$4(worldTransform.scaleX);
12837
12907
  }
12838
12908
  if (stroke) isString(stroke) ? Paint.stroke(stroke, this, canvas) : Paint.strokes(stroke, this, canvas);
12839
12909
  if (fill) isString(fill) ? Paint.fill(fill, this, canvas) : Paint.fills(fill, this, canvas);
@@ -12945,8 +13015,10 @@ class EditSelect extends Group {
12945
13015
  onHover() {
12946
13016
  const {editor: editor} = this;
12947
13017
  if (this.running && !this.dragging && !editor.dragging) {
12948
- const {stroke: stroke, strokeWidth: strokeWidth, hover: hover, hoverStyle: hoverStyle} = editor.mergeConfig;
12949
- this.hoverStroker.setTarget(hover ? this.editor.hoverTarget : null, Object.assign({
13018
+ const {hoverTarget: hoverTarget, mergeConfig: mergeConfig} = editor, config = Object.assign({}, mergeConfig);
13019
+ if (hoverTarget && hoverTarget.editConfig) Object.assign(config, hoverTarget.editConfig);
13020
+ const {stroke: stroke, strokeWidth: strokeWidth, hover: hover, hoverStyle: hoverStyle} = config;
13021
+ this.hoverStroker.setTarget(hover ? hoverTarget : null, Object.assign({
12950
13022
  stroke: stroke,
12951
13023
  strokeWidth: strokeWidth
12952
13024
  }, hoverStyle || {}));
@@ -13126,13 +13198,11 @@ class EditSelect extends Group {
13126
13198
 
13127
13199
  const {topLeft: topLeft$1, top: top$1, topRight: topRight$1, right: right$2, bottomRight: bottomRight, bottom: bottom$1, bottomLeft: bottomLeft, left: left$2} = Direction9;
13128
13200
 
13129
- const {toPoint: toPoint} = AroundHelper;
13130
-
13131
- const {within: within$3, sign: sign$1} = MathHelper;
13201
+ const {toPoint: toPoint} = AroundHelper, {within: within$3, sign: sign$1} = MathHelper, {abs: abs$3} = Math;
13132
13202
 
13133
13203
  const EditDataHelper = {
13134
13204
  getScaleData(target, startBounds, direction, totalMoveOrScale, lockRatio, around, flipable, scaleMode) {
13135
- let align, origin = {}, scaleX = 1, scaleY = 1;
13205
+ let align, origin = {}, scaleX = 1, scaleY = 1, lockScale;
13136
13206
  const {boxBounds: boxBounds, widthRange: widthRange, heightRange: heightRange, dragBounds: dragBounds, worldBoxBounds: worldBoxBounds} = target;
13137
13207
  const {width: width, height: height} = startBounds;
13138
13208
  const originChangedScaleX = target.scaleX / startBounds.scaleX;
@@ -13202,23 +13272,22 @@ const EditDataHelper = {
13202
13272
  if (lockRatio === "corner" && direction % 2) {
13203
13273
  lockRatio = false;
13204
13274
  } else {
13205
- let scale;
13206
13275
  switch (direction) {
13207
13276
  case top$1:
13208
13277
  case bottom$1:
13209
- scale = scaleY;
13278
+ scaleX = scaleY;
13210
13279
  break;
13211
13280
 
13212
13281
  case left$2:
13213
13282
  case right$2:
13214
- scale = scaleX;
13283
+ scaleY = scaleX;
13215
13284
  break;
13216
13285
 
13217
13286
  default:
13218
- scale = Math.sqrt(Math.abs(scaleX * scaleY));
13287
+ lockScale = Math.sqrt(abs$3(scaleX * scaleY));
13288
+ scaleX = sign$1(scaleX) * lockScale;
13289
+ scaleY = sign$1(scaleY) * lockScale;
13219
13290
  }
13220
- scaleX = scaleX < 0 ? -scale : scale;
13221
- scaleY = scaleY < 0 ? -scale : scale;
13222
13291
  }
13223
13292
  }
13224
13293
  }
@@ -13236,7 +13305,7 @@ const EditDataHelper = {
13236
13305
  x: scaleX,
13237
13306
  y: scaleY
13238
13307
  };
13239
- DragBoundsHelper.limitScaleOf(target, origin, scaleData);
13308
+ DragBoundsHelper.limitScaleOf(target, origin, scaleData, lockRatio);
13240
13309
  scaleX = scaleData.x;
13241
13310
  scaleY = scaleData.y;
13242
13311
  }
@@ -13248,9 +13317,13 @@ const EditDataHelper = {
13248
13317
  const nowHeight = boxBounds.height * target.scaleY;
13249
13318
  scaleY = within$3(nowHeight * scaleY, heightRange) / nowHeight;
13250
13319
  }
13251
- if (useScaleX && Math.abs(scaleX * worldBoxBounds.width) < 1) scaleX = sign$1(scaleX) / worldBoxBounds.width;
13252
- if (useScaleY && Math.abs(scaleY * worldBoxBounds.height) < 1) scaleY = sign$1(scaleY) / worldBoxBounds.height;
13253
- if (lockRatio && scaleX !== scaleY) scaleY = scaleX = Math.min(scaleX, scaleY);
13320
+ if (useScaleX && abs$3(scaleX * worldBoxBounds.width) < 1) scaleX = sign$1(scaleX) / worldBoxBounds.width;
13321
+ if (useScaleY && abs$3(scaleY * worldBoxBounds.height) < 1) scaleY = sign$1(scaleY) / worldBoxBounds.height;
13322
+ if (lockRatio && scaleX !== scaleY) {
13323
+ lockScale = Math.min(abs$3(scaleX), abs$3(scaleY));
13324
+ scaleX = sign$1(scaleX) * lockScale;
13325
+ scaleY = sign$1(scaleY) * lockScale;
13326
+ }
13254
13327
  return {
13255
13328
  origin: origin,
13256
13329
  scaleX: scaleX,
@@ -13500,7 +13573,7 @@ class EditBox extends Group {
13500
13573
  return this.scaleX * this.scaleY < 0;
13501
13574
  }
13502
13575
  get canUse() {
13503
- return this.visible && this.view.visible;
13576
+ return this.app && this.editor.editing;
13504
13577
  }
13505
13578
  get canGesture() {
13506
13579
  if (!this.canUse) return false;
@@ -13581,7 +13654,7 @@ class EditBox extends Group {
13581
13654
  }
13582
13655
  load() {
13583
13656
  const {target: target, mergeConfig: mergeConfig, single: single, rect: rect, circle: circle, resizePoints: resizePoints, resizeLines: resizeLines} = this;
13584
- const {stroke: stroke, strokeWidth: strokeWidth, resizeLine: resizeLine} = mergeConfig;
13657
+ const {stroke: stroke, strokeWidth: strokeWidth, resizeLine: resizeLine, ignorePixelSnap: ignorePixelSnap} = mergeConfig;
13585
13658
  const pointsStyle = this.getPointsStyle();
13586
13659
  const middlePointsStyle = this.getMiddlePointsStyle();
13587
13660
  this.visible = !target.locked;
@@ -13601,16 +13674,16 @@ class EditBox extends Group {
13601
13674
  strokeWidth: strokeWidth,
13602
13675
  editConfig: editConfig
13603
13676
  }, mergeConfig.rect || {}));
13604
- const syncEventer = single && this.transformTool.editTool;
13605
- rect.hittable = !syncEventer;
13606
- rect.syncEventer = syncEventer && this.editor;
13607
- if (syncEventer) {
13677
+ const rectThrough = isNull(mergeConfig.rectThrough) ? single : mergeConfig.rectThrough;
13678
+ rect.hittable = !rectThrough;
13679
+ if (rectThrough) {
13608
13680
  target.syncEventer = rect;
13609
13681
  this.app.interaction.bottomList = [ {
13610
13682
  target: rect,
13611
13683
  proxy: target
13612
13684
  } ];
13613
13685
  }
13686
+ if (single) DataHelper.stintSet(target.__world, "ignorePixelSnap", ignorePixelSnap);
13614
13687
  updateMoveCursor(this);
13615
13688
  }
13616
13689
  update() {
@@ -13774,29 +13847,25 @@ class EditBox extends Group {
13774
13847
  this.dragPoint = null;
13775
13848
  }
13776
13849
  onTransformStart(e) {
13777
- if (this.canUse) {
13778
- if (this.moving) this.editor.opacity = this.mergedConfig.hideOnMove ? 0 : 1;
13779
- if (this.resizing) ResizeEvent.resizingKeys = this.editor.leafList.keys;
13780
- const {dragStartData: dragStartData, target: target} = this;
13781
- dragStartData.x = e.x;
13782
- dragStartData.y = e.y;
13783
- dragStartData.totalOffset = getPointData();
13784
- dragStartData.point = {
13785
- x: target.x,
13786
- y: target.y
13787
- };
13788
- dragStartData.bounds = Object.assign({}, target.getLayoutBounds("box", "local"));
13789
- dragStartData.rotation = target.rotation;
13790
- }
13850
+ if (this.moving) this.editor.opacity = this.mergedConfig.hideOnMove ? 0 : 1;
13851
+ if (this.resizing) ResizeEvent.resizingKeys = this.editor.leafList.keys;
13852
+ const {dragStartData: dragStartData, target: target} = this;
13853
+ dragStartData.x = e.x;
13854
+ dragStartData.y = e.y;
13855
+ dragStartData.totalOffset = getPointData();
13856
+ dragStartData.point = {
13857
+ x: target.x,
13858
+ y: target.y
13859
+ };
13860
+ dragStartData.bounds = Object.assign({}, target.getLayoutBounds("box", "local"));
13861
+ dragStartData.rotation = target.rotation;
13791
13862
  }
13792
13863
  onTransformEnd(e) {
13793
- if (this.canUse) {
13794
- if (this.canDragLimitAnimate && (e instanceof DragEvent || e instanceof MoveEvent)) this.transformTool.onMove(e);
13795
- if (this.resizing) ResizeEvent.resizingKeys = null;
13796
- this.dragging = this.gesturing = this.moving = this.resizing = this.rotating = this.skewing = false;
13797
- this.editor.opacity = 1;
13798
- this.update();
13799
- }
13864
+ if (this.canDragLimitAnimate && (e instanceof DragEvent || e instanceof MoveEvent)) this.transformTool.onMove(e);
13865
+ if (this.resizing) ResizeEvent.resizingKeys = null;
13866
+ this.dragging = this.gesturing = this.moving = this.resizing = this.rotating = this.skewing = false;
13867
+ this.editor.opacity = 1;
13868
+ this.editor.update();
13800
13869
  }
13801
13870
  onMove(e) {
13802
13871
  if (this.canGesture && e.moveType !== "drag") {
@@ -13825,6 +13894,12 @@ class EditBox extends Group {
13825
13894
  }
13826
13895
  }
13827
13896
  }
13897
+ onGestureStart(e) {
13898
+ if (this.canGesture && e.moveType !== "drag") this.onTransformStart(e);
13899
+ }
13900
+ onGestureEnd(e) {
13901
+ if (this.canGesture && e.moveType !== "drag") this.onTransformEnd(e);
13902
+ }
13828
13903
  isHoldRotateKey(e) {
13829
13904
  const {rotateKey: rotateKey} = this.mergedConfig;
13830
13905
  if (rotateKey) return e.isHoldKeys(rotateKey);
@@ -13894,7 +13969,7 @@ class EditBox extends Group {
13894
13969
  const {rect: rect, editor: editor, __eventIds: events} = this;
13895
13970
  events.push(rect.on_([ [ PointerEvent.DOUBLE_TAP, this.onDoubleTap, this ], [ PointerEvent.LONG_PRESS, this.onLongPress, this ] ]));
13896
13971
  this.waitLeafer(() => {
13897
- events.push(editor.app.on_([ [ [ KeyEvent.HOLD, KeyEvent.UP ], this.onKey, this ], [ KeyEvent.DOWN, this.onArrow, this ], [ [ MoveEvent.START, MoveEvent.BEFORE_MOVE ], this.onMove, this, true ], [ [ ZoomEvent.START, ZoomEvent.BEFORE_ZOOM ], this.onScale, this, true ], [ [ RotateEvent.START, RotateEvent.BEFORE_ROTATE ], this.onRotate, this, true ], [ [ MoveEvent.END, ZoomEvent.END, RotateEvent.END ], this.onTransformEnd, this ] ]));
13972
+ events.push(editor.app.on_([ [ [ KeyEvent.HOLD, KeyEvent.UP ], this.onKey, this ], [ KeyEvent.DOWN, this.onArrow, this ], [ MoveEvent.BEFORE_MOVE, this.onMove, this, true ], [ ZoomEvent.BEFORE_ZOOM, this.onScale, this, true ], [ RotateEvent.BEFORE_ROTATE, this.onRotate, this, true ], [ [ MoveEvent.START, ZoomEvent.START, RotateEvent.START ], this.onGestureStart, this ], [ [ MoveEvent.END, ZoomEvent.END, RotateEvent.END ], this.onGestureEnd, this ] ]));
13898
13973
  });
13899
13974
  }
13900
13975
  __removeListenEvents() {
@@ -16335,6 +16410,69 @@ class HTMLTextData extends ImageData {
16335
16410
  }
16336
16411
  }
16337
16412
 
16413
+ const unicodeEntities = {
16414
+ lt: "<",
16415
+ gt: ">",
16416
+ amp: "&",
16417
+ quot: '"',
16418
+ apos: "'",
16419
+ nbsp: " ",
16420
+ ensp: " ",
16421
+ emsp: " ",
16422
+ thinsp: " ",
16423
+ ndash: "–",
16424
+ mdash: "—",
16425
+ hellip: "…",
16426
+ middot: "·",
16427
+ bull: "•",
16428
+ laquo: "«",
16429
+ raquo: "»",
16430
+ lsquo: "‘",
16431
+ rsquo: "’",
16432
+ ldquo: "“",
16433
+ rdquo: "”",
16434
+ cent: "¢",
16435
+ pound: "£",
16436
+ yen: "¥",
16437
+ euro: "€",
16438
+ times: "×",
16439
+ divide: "÷",
16440
+ plusmn: "±",
16441
+ minus: "−",
16442
+ frac12: "½",
16443
+ frac14: "¼",
16444
+ frac34: "¾",
16445
+ sup2: "²",
16446
+ sup3: "³",
16447
+ deg: "°",
16448
+ reg: "®",
16449
+ copy: "©",
16450
+ trade: "™",
16451
+ section: "§",
16452
+ para: "¶",
16453
+ dagger: "†",
16454
+ Dagger: "‡",
16455
+ larr: "←",
16456
+ uarr: "↑",
16457
+ rarr: "→",
16458
+ darr: "↓",
16459
+ harr: "↔",
16460
+ alpha: "α",
16461
+ beta: "β",
16462
+ gamma: "γ",
16463
+ delta: "δ",
16464
+ pi: "π",
16465
+ sigma: "σ",
16466
+ omega: "ω",
16467
+ Omega: "Ω",
16468
+ micro: "µ",
16469
+ infinity: "∞",
16470
+ not: "¬",
16471
+ equiv: "≡",
16472
+ le: "≤",
16473
+ ge: "≥"
16474
+ };
16475
+
16338
16476
  let HTMLText = class HTMLText extends Image {
16339
16477
  get __tag() {
16340
16478
  return "HTMLText";
@@ -16354,7 +16492,7 @@ let HTMLText = class HTMLText extends Image {
16354
16492
  document.body.appendChild(div);
16355
16493
  const {width: width, height: height} = div.getBoundingClientRect();
16356
16494
  const realWidth = width + 10;
16357
- const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${realWidth}" height="${height}">\n <foreignObject width="${realWidth}" height="${height}">\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n </style>\n <body xmlns="http://www.w3.org/1999/xhtml">\n ${this.text}\n </body>\n </foreignObject>\n </svg>`;
16495
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${realWidth}" height="${height}">\n <foreignObject width="${realWidth}" height="${height}">\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n </style>\n <body xmlns="http://www.w3.org/1999/xhtml">\n ${this.decodeText(this.text)}\n </body>\n </foreignObject>\n </svg>`;
16358
16496
  data.__setImageFill("data:image/svg+xml," + encodeURIComponent(svg));
16359
16497
  data.__naturalWidth = realWidth / data.pixelRatio;
16360
16498
  data.__naturalHeight = height / data.pixelRatio;
@@ -16367,6 +16505,29 @@ let HTMLText = class HTMLText extends Image {
16367
16505
  if (this.textEditing && !options.exporting) return;
16368
16506
  super.__draw(canvas, options, originCanvas);
16369
16507
  }
16508
+ decodeText(text) {
16509
+ if (!text.includes("&")) return text;
16510
+ let result = "", i = 0, entity, value;
16511
+ while (i < text.length) {
16512
+ if (text[i] === "&") {
16513
+ const semicolonIndex = text.indexOf(";", i + 1);
16514
+ if (semicolonIndex > i + 1) {
16515
+ entity = text.slice(i + 1, semicolonIndex);
16516
+ value = unicodeEntities[entity];
16517
+ if (value !== undefined) {
16518
+ result += value;
16519
+ i = semicolonIndex + 1;
16520
+ continue;
16521
+ }
16522
+ }
16523
+ }
16524
+ result += text[i++];
16525
+ }
16526
+ return result;
16527
+ }
16528
+ static addUnicodeEntity(entity, unicode) {
16529
+ if (isString(entity)) unicodeEntities[entity] = unicode; else Object.assign(unicodeEntities, entity);
16530
+ }
16370
16531
  };
16371
16532
 
16372
16533
  __decorate([ dataProcessor(HTMLTextData) ], HTMLText.prototype, "__", void 0);