@leafer-ui/worker 1.0.0 → 1.0.2

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.
@@ -48,6 +48,8 @@ const I$2 = IncrementId;
48
48
  const { round, pow: pow$1, PI: PI$4 } = Math;
49
49
  const MathHelper = {
50
50
  within(value, min, max) {
51
+ if (typeof min === 'object')
52
+ max = min.max, min = min.min;
51
53
  if (min !== undefined && value < min)
52
54
  value = min;
53
55
  if (max !== undefined && value > max)
@@ -109,6 +111,19 @@ const MathHelper = {
109
111
  const a = maxLength ? pow$1(10, maxLength) : 1000000000000;
110
112
  num = round(num * a) / a;
111
113
  return num === -0 ? 0 : num;
114
+ },
115
+ getScaleData(scale, size, originSize, scaleData) {
116
+ if (!scaleData)
117
+ scaleData = {};
118
+ if (size) {
119
+ scaleData.scaleX = (typeof size === 'number' ? size : size.width) / originSize.width;
120
+ scaleData.scaleY = (typeof size === 'number' ? size : size.height) / originSize.height;
121
+ }
122
+ else if (scale) {
123
+ scaleData.scaleX = typeof scale === 'number' ? scale : scale.x;
124
+ scaleData.scaleY = typeof scale === 'number' ? scale : scale.y;
125
+ }
126
+ return scaleData;
112
127
  }
113
128
  };
114
129
  const OneRadian = PI$4 / 180;
@@ -150,10 +165,10 @@ const MatrixHelper = {
150
165
  t.e += x;
151
166
  t.f += y;
152
167
  },
153
- translateInner(t, x, y, isMoveOrigin) {
168
+ translateInner(t, x, y, hasOrigin) {
154
169
  t.e += t.a * x + t.c * y;
155
170
  t.f += t.b * x + t.d * y;
156
- if (isMoveOrigin)
171
+ if (hasOrigin)
157
172
  t.e -= x, t.f -= y;
158
173
  },
159
174
  scale(t, scaleX, scaleY = scaleX) {
@@ -312,7 +327,7 @@ const MatrixHelper = {
312
327
  to.y -= (f * a - e * b) * s;
313
328
  }
314
329
  },
315
- setLayout(t, layout, origin, bcChanged) {
330
+ setLayout(t, layout, origin, around, bcChanged) {
316
331
  const { x, y, scaleX, scaleY } = layout;
317
332
  if (bcChanged === undefined)
318
333
  bcChanged = layout.rotation || layout.skewX || layout.skewY;
@@ -344,10 +359,10 @@ const MatrixHelper = {
344
359
  }
345
360
  t.e = x;
346
361
  t.f = y;
347
- if (origin)
348
- M$6.translateInner(t, -origin.x, -origin.y, true);
362
+ if (origin = origin || around)
363
+ M$6.translateInner(t, -origin.x, -origin.y, !around);
349
364
  },
350
- getLayout(t, origin, firstSkewY) {
365
+ getLayout(t, origin, around, firstSkewY) {
351
366
  const { a, b, c, d, e, f } = t;
352
367
  let x = e, y = f, scaleX, scaleY, rotation, skewX, skewY;
353
368
  if (b || c) {
@@ -376,9 +391,11 @@ const MatrixHelper = {
376
391
  scaleY = d;
377
392
  rotation = skewX = skewY = 0;
378
393
  }
379
- if (origin) {
394
+ if (origin = around || origin) {
380
395
  x += origin.x * a + origin.y * c;
381
396
  y += origin.x * b + origin.y * d;
397
+ if (!around)
398
+ x -= origin.x, y -= origin.y;
382
399
  }
383
400
  return { x, y, scaleX, scaleY, rotation, skewX, skewY };
384
401
  },
@@ -405,7 +422,7 @@ const MatrixHelper = {
405
422
  };
406
423
  const M$6 = MatrixHelper;
407
424
 
408
- const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$2 } = MatrixHelper;
425
+ const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3 } = MatrixHelper;
409
426
  const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, PI: PI$3 } = Math;
410
427
  const PointHelper = {
411
428
  defaultPoint: getPointData(),
@@ -461,7 +478,7 @@ const PointHelper = {
461
478
  tempToOuterOf(t, matrix) {
462
479
  const { tempPoint: temp } = P$5;
463
480
  copy$b(temp, t);
464
- toOuterPoint$2(matrix, temp, temp);
481
+ toOuterPoint$3(matrix, temp, temp);
465
482
  return temp;
466
483
  },
467
484
  tempToInnerRadiusPointOf(t, matrix) {
@@ -480,7 +497,7 @@ const PointHelper = {
480
497
  toInnerPoint$2(matrix, t, to);
481
498
  },
482
499
  toOuterOf(t, matrix, to) {
483
- toOuterPoint$2(matrix, t, to);
500
+ toOuterPoint$3(matrix, t, to);
484
501
  },
485
502
  getCenter(t, to) {
486
503
  return { x: t.x + (to.x - t.x) / 2, y: t.y + (to.y - t.y) / 2 };
@@ -706,12 +723,12 @@ class Matrix {
706
723
  toInnerPoint(outer, to, distance) {
707
724
  MatrixHelper.toInnerPoint(this, outer, to, distance);
708
725
  }
709
- setLayout(data, origin) {
710
- MatrixHelper.setLayout(this, data, origin);
726
+ setLayout(data, origin, around) {
727
+ MatrixHelper.setLayout(this, data, origin, around);
711
728
  return this;
712
729
  }
713
- getLayout(origin, firstSkewY) {
714
- return MatrixHelper.getLayout(this, origin, firstSkewY);
730
+ getLayout(origin, around, firstSkewY) {
731
+ return MatrixHelper.getLayout(this, origin, around, firstSkewY);
715
732
  }
716
733
  withScale(scaleX, scaleY) {
717
734
  return MatrixHelper.withScale(this, scaleX, scaleY);
@@ -760,7 +777,7 @@ const TwoPointBoundsHelper = {
760
777
  const { addPoint: addPoint$4 } = TwoPointBoundsHelper;
761
778
 
762
779
  const { tempPointBounds: tempPointBounds$1, setPoint: setPoint$3, addPoint: addPoint$3, toBounds: toBounds$4 } = TwoPointBoundsHelper;
763
- const { toOuterPoint: toOuterPoint$1 } = MatrixHelper;
780
+ const { toOuterPoint: toOuterPoint$2 } = MatrixHelper;
764
781
  const { float, fourNumber } = MathHelper;
765
782
  const { floor, ceil: ceil$2 } = Math;
766
783
  let right$1, bottom$1, boundsRight, boundsBottom;
@@ -780,17 +797,24 @@ const BoundsHelper = {
780
797
  t.width = bounds.width;
781
798
  t.height = bounds.height;
782
799
  },
783
- copyAndSpread(t, bounds, spread, isShrink) {
800
+ copyAndSpread(t, bounds, spread, isShrink, side) {
801
+ const { x, y, width, height } = bounds;
784
802
  if (spread instanceof Array) {
785
803
  const four = fourNumber(spread);
786
804
  isShrink
787
- ? B.set(t, bounds.x + four[3], bounds.y + four[0], bounds.width - four[1] - four[3], bounds.height - four[2] - four[0])
788
- : B.set(t, bounds.x - four[3], bounds.y - four[0], bounds.width + four[1] + four[3], bounds.height + four[2] + four[0]);
805
+ ? B.set(t, x + four[3], y + four[0], width - four[1] - four[3], height - four[2] - four[0])
806
+ : B.set(t, x - four[3], y - four[0], width + four[1] + four[3], height + four[2] + four[0]);
789
807
  }
790
808
  else {
791
809
  if (isShrink)
792
810
  spread = -spread;
793
- B.set(t, bounds.x - spread, bounds.y - spread, bounds.width + spread * 2, bounds.height + spread * 2);
811
+ B.set(t, x - spread, y - spread, width + spread * 2, height + spread * 2);
812
+ }
813
+ if (side) {
814
+ if (side === 'width')
815
+ t.y = y, t.height = height;
816
+ else
817
+ t.x = x, t.width = width;
794
818
  }
795
819
  },
796
820
  minX(t) { return t.width > 0 ? t.x : t.x + t.width; },
@@ -867,16 +891,16 @@ const BoundsHelper = {
867
891
  else {
868
892
  point.x = t.x;
869
893
  point.y = t.y;
870
- toOuterPoint$1(matrix, point, toPoint$5);
894
+ toOuterPoint$2(matrix, point, toPoint$5);
871
895
  setPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
872
896
  point.x = t.x + t.width;
873
- toOuterPoint$1(matrix, point, toPoint$5);
897
+ toOuterPoint$2(matrix, point, toPoint$5);
874
898
  addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
875
899
  point.y = t.y + t.height;
876
- toOuterPoint$1(matrix, point, toPoint$5);
900
+ toOuterPoint$2(matrix, point, toPoint$5);
877
901
  addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
878
902
  point.x = t.x;
879
- toOuterPoint$1(matrix, point, toPoint$5);
903
+ toOuterPoint$2(matrix, point, toPoint$5);
880
904
  addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
881
905
  toBounds$4(tempPointBounds$1, to);
882
906
  }
@@ -890,16 +914,16 @@ const BoundsHelper = {
890
914
  const scale = Math.min(baseScale, Math.min(t.width / put.width, t.height / put.height));
891
915
  return new Matrix(scale, 0, 0, scale, -put.x * scale, -put.y * scale);
892
916
  },
893
- getSpread(t, spread) {
917
+ getSpread(t, spread, side) {
894
918
  const n = {};
895
- B.copyAndSpread(n, t, spread);
919
+ B.copyAndSpread(n, t, spread, false, side);
896
920
  return n;
897
921
  },
898
- spread(t, spread) {
899
- B.copyAndSpread(t, t, spread);
922
+ spread(t, spread, side) {
923
+ B.copyAndSpread(t, t, spread, false, side);
900
924
  },
901
- shrink(t, shrink) {
902
- B.copyAndSpread(t, t, shrink, true);
925
+ shrink(t, shrink, side) {
926
+ B.copyAndSpread(t, t, shrink, true, side);
903
927
  },
904
928
  ceil(t) {
905
929
  const { x, y } = t;
@@ -1082,12 +1106,12 @@ class Bounds {
1082
1106
  getFitMatrix(put, baseScale) {
1083
1107
  return BoundsHelper.getFitMatrix(this, put, baseScale);
1084
1108
  }
1085
- spread(fourNumber) {
1086
- BoundsHelper.spread(this, fourNumber);
1109
+ spread(fourNumber, side) {
1110
+ BoundsHelper.spread(this, fourNumber, side);
1087
1111
  return this;
1088
1112
  }
1089
- shrink(fourNumber) {
1090
- BoundsHelper.shrink(this, fourNumber);
1113
+ shrink(fourNumber, side) {
1114
+ BoundsHelper.shrink(this, fourNumber, side);
1091
1115
  return this;
1092
1116
  }
1093
1117
  ceil() {
@@ -1999,7 +2023,7 @@ class LeaferCanvasBase extends Canvas$1 {
1999
2023
  DataHelper.copyAttrs(this.size, size, canvasSizeAttrs);
2000
2024
  this.size.pixelRatio || (this.size.pixelRatio = 1);
2001
2025
  this.bounds = new Bounds(0, 0, this.width, this.height);
2002
- if (!this.unreal) {
2026
+ if (this.context && !this.unreal) {
2003
2027
  this.updateViewSize();
2004
2028
  this.smooth = this.config.smooth;
2005
2029
  }
@@ -2172,7 +2196,7 @@ class LeaferCanvasBase extends Canvas$1 {
2172
2196
  this.manager ? this.manager.recycle(this) : this.destroy();
2173
2197
  }
2174
2198
  }
2175
- updateRender() { }
2199
+ updateRender(_bounds) { }
2176
2200
  unrealCanvas() { }
2177
2201
  destroy() {
2178
2202
  this.manager = this.view = this.parentView = null;
@@ -2904,60 +2928,75 @@ class PathCreator {
2904
2928
  }
2905
2929
  beginPath() {
2906
2930
  beginPath(this.__path);
2931
+ this.paint();
2907
2932
  return this;
2908
2933
  }
2909
2934
  moveTo(x, y) {
2910
2935
  moveTo$4(this.__path, x, y);
2936
+ this.paint();
2911
2937
  return this;
2912
2938
  }
2913
2939
  lineTo(x, y) {
2914
2940
  lineTo$3(this.__path, x, y);
2941
+ this.paint();
2915
2942
  return this;
2916
2943
  }
2917
2944
  bezierCurveTo(x1, y1, x2, y2, x, y) {
2918
2945
  bezierCurveTo(this.__path, x1, y1, x2, y2, x, y);
2946
+ this.paint();
2919
2947
  return this;
2920
2948
  }
2921
2949
  quadraticCurveTo(x1, y1, x, y) {
2922
2950
  quadraticCurveTo(this.__path, x1, y1, x, y);
2951
+ this.paint();
2923
2952
  return this;
2924
2953
  }
2925
2954
  closePath() {
2926
2955
  closePath$3(this.__path);
2956
+ this.paint();
2927
2957
  return this;
2928
2958
  }
2929
2959
  rect(x, y, width, height) {
2930
2960
  rect$2(this.__path, x, y, width, height);
2961
+ this.paint();
2931
2962
  return this;
2932
2963
  }
2933
2964
  roundRect(x, y, width, height, cornerRadius) {
2934
2965
  roundRect$1(this.__path, x, y, width, height, cornerRadius);
2966
+ this.paint();
2935
2967
  return this;
2936
2968
  }
2937
2969
  ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) {
2938
2970
  ellipse$2(this.__path, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
2971
+ this.paint();
2939
2972
  return this;
2940
2973
  }
2941
2974
  arc(x, y, radius, startAngle, endAngle, anticlockwise) {
2942
2975
  arc$1(this.__path, x, y, radius, startAngle, endAngle, anticlockwise);
2976
+ this.paint();
2943
2977
  return this;
2944
2978
  }
2945
2979
  arcTo(x1, y1, x2, y2, radius) {
2946
2980
  arcTo$2(this.__path, x1, y1, x2, y2, radius);
2981
+ this.paint();
2947
2982
  return this;
2948
2983
  }
2949
2984
  drawEllipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) {
2950
2985
  drawEllipse(this.__path, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
2986
+ this.paint();
2951
2987
  return this;
2952
2988
  }
2953
2989
  drawArc(x, y, radius, startAngle, endAngle, anticlockwise) {
2954
2990
  drawArc(this.__path, x, y, radius, startAngle, endAngle, anticlockwise);
2991
+ this.paint();
2955
2992
  return this;
2956
2993
  }
2957
2994
  drawPoints(points, curve, close) {
2958
2995
  drawPoints$2(this.__path, points, curve, close);
2996
+ this.paint();
2959
2997
  return this;
2960
2998
  }
2999
+ paint() { }
2961
3000
  }
2962
3001
 
2963
3002
  const { M: M$2, L: L$3, C: C$2, Q: Q$1, Z: Z$2, N: N$1, D: D$1, X: X$1, G: G$1, F: F$2, O: O$1, P: P$1, U: U$1 } = PathCommandMap;
@@ -3979,7 +4018,7 @@ function registerUIEvent() {
3979
4018
  };
3980
4019
  }
3981
4020
 
3982
- const { copy: copy$7, toInnerPoint: toInnerPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
4021
+ const { copy: copy$7, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
3983
4022
  const matrix$1 = {};
3984
4023
  const LeafHelper = {
3985
4024
  updateAllMatrix(leaf, checkAutoLayout, waitAutoLayout) {
@@ -4044,10 +4083,9 @@ const LeafHelper = {
4044
4083
  }
4045
4084
  return true;
4046
4085
  },
4047
- moveWorld(t, x, y = 0) {
4086
+ moveWorld(t, x, y = 0, isInnerPoint) {
4048
4087
  const local = typeof x === 'object' ? Object.assign({}, x) : { x, y };
4049
- if (t.parent)
4050
- toInnerPoint$1(t.parent.worldTransform, local, local, true);
4088
+ isInnerPoint ? toOuterPoint$1(t.localTransform, local, local, true) : (t.parent && toInnerPoint$1(t.parent.worldTransform, local, local, true));
4051
4089
  L.moveLocal(t, local.x, local.y);
4052
4090
  },
4053
4091
  moveLocal(t, x, y = 0) {
@@ -4066,8 +4104,13 @@ const LeafHelper = {
4066
4104
  zoomOfLocal(t, origin, scaleX, scaleY = scaleX, resize) {
4067
4105
  copy$7(matrix$1, t.__localMatrix);
4068
4106
  scaleOfOuter$2(matrix$1, origin, scaleX, scaleY);
4069
- moveByMatrix(t, matrix$1);
4070
- t.scaleResize(scaleX, scaleY, resize !== true);
4107
+ if (t.origin || t.around) {
4108
+ L.setTransform(t, matrix$1, resize);
4109
+ }
4110
+ else {
4111
+ moveByMatrix(t, matrix$1);
4112
+ t.scaleResize(scaleX, scaleY, resize !== true);
4113
+ }
4071
4114
  },
4072
4115
  rotateOfWorld(t, origin, angle) {
4073
4116
  L.rotateOfLocal(t, getTempLocal(t, origin), angle);
@@ -4075,8 +4118,13 @@ const LeafHelper = {
4075
4118
  rotateOfLocal(t, origin, angle) {
4076
4119
  copy$7(matrix$1, t.__localMatrix);
4077
4120
  rotateOfOuter$2(matrix$1, origin, angle);
4078
- moveByMatrix(t, matrix$1);
4079
- t.rotation = MathHelper.formatRotation(t.rotation + angle);
4121
+ if (t.origin || t.around) {
4122
+ L.setTransform(t, matrix$1);
4123
+ }
4124
+ else {
4125
+ moveByMatrix(t, matrix$1);
4126
+ t.rotation = MathHelper.formatRotation(t.rotation + angle);
4127
+ }
4080
4128
  },
4081
4129
  skewOfWorld(t, origin, skewX, skewY, resize) {
4082
4130
  L.skewOfLocal(t, getTempLocal(t, origin), skewX, skewY, resize);
@@ -4099,7 +4147,7 @@ const LeafHelper = {
4099
4147
  L.setTransform(t, matrix$1, resize);
4100
4148
  },
4101
4149
  setTransform(t, transform, resize) {
4102
- const layout = getLayout(transform);
4150
+ const layout = getLayout(transform, t.origin && L.getInnerOrigin(t, t.origin), t.around && L.getInnerOrigin(t, t.around));
4103
4151
  if (resize) {
4104
4152
  const scaleX = layout.scaleX / t.scaleX;
4105
4153
  const scaleY = layout.scaleY / t.scaleY;
@@ -4112,13 +4160,19 @@ const LeafHelper = {
4112
4160
  t.set(layout);
4113
4161
  }
4114
4162
  },
4163
+ getFlipTransform(t, axis) {
4164
+ const m = getMatrixData();
4165
+ const sign = axis === 'x' ? 1 : -1;
4166
+ scaleOfOuter$2(m, L.getLocalOrigin(t, 'center'), -1 * sign, 1 * sign);
4167
+ return m;
4168
+ },
4115
4169
  getLocalOrigin(t, origin) {
4116
4170
  return PointHelper.tempToOuterOf(L.getInnerOrigin(t, origin), t.localTransform);
4117
4171
  },
4118
4172
  getInnerOrigin(t, origin) {
4119
- if (typeof origin === 'string')
4120
- AroundHelper.toPoint(origin, t.boxBounds, origin = {});
4121
- return origin;
4173
+ const innerOrigin = {};
4174
+ AroundHelper.toPoint(origin, t.boxBounds, innerOrigin);
4175
+ return innerOrigin;
4122
4176
  },
4123
4177
  getRelativeWorld(t, relative, temp) {
4124
4178
  copy$7(matrix$1, t.worldTransform);
@@ -4545,7 +4599,10 @@ const LeafEventer = {
4545
4599
  on(type, listener, options) {
4546
4600
  let capture, once;
4547
4601
  if (options) {
4548
- if (typeof options === 'boolean') {
4602
+ if (options === 'once') {
4603
+ once = true;
4604
+ }
4605
+ else if (typeof options === 'boolean') {
4549
4606
  capture = options;
4550
4607
  }
4551
4608
  else {
@@ -4576,7 +4633,7 @@ const LeafEventer = {
4576
4633
  if (listener) {
4577
4634
  let capture;
4578
4635
  if (options)
4579
- capture = typeof options === 'boolean' ? options : options.capture;
4636
+ capture = typeof options === 'boolean' ? options : (options === 'once' ? false : options.capture);
4580
4637
  let events, index;
4581
4638
  const map = __getListenerMap(this, capture);
4582
4639
  typeList.forEach(type => {
@@ -4878,7 +4935,7 @@ const LeafMatrix = {
4878
4935
  const layout = this.__layout, local = this.__local, data = this.__;
4879
4936
  if (layout.affectScaleOrRotation) {
4880
4937
  if (layout.scaleChanged || layout.rotationChanged) {
4881
- setLayout(local, data, null, layout.affectRotation);
4938
+ setLayout(local, data, null, null, layout.affectRotation);
4882
4939
  layout.scaleChanged = layout.rotationChanged = false;
4883
4940
  }
4884
4941
  }
@@ -4886,7 +4943,7 @@ const LeafMatrix = {
4886
4943
  local.f = data.y + data.offsetY;
4887
4944
  if (data.around || data.origin) {
4888
4945
  toPoint$3(data.around || data.origin, layout.boxBounds, tempPoint$1);
4889
- translateInner(local, -tempPoint$1.x, -tempPoint$1.y, data.origin);
4946
+ translateInner(local, -tempPoint$1.x, -tempPoint$1.y, !data.around);
4890
4947
  }
4891
4948
  }
4892
4949
  this.__layout.matrixChanged = false;
@@ -4895,7 +4952,7 @@ const LeafMatrix = {
4895
4952
 
4896
4953
  const { updateMatrix: updateMatrix$1, updateAllMatrix: updateAllMatrix$2 } = LeafHelper;
4897
4954
  const { updateBounds: updateBounds$1 } = BranchHelper;
4898
- const { toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$1, copy: copy$5 } = BoundsHelper;
4955
+ const { toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$2, copy: copy$5 } = BoundsHelper;
4899
4956
  const { toBounds: toBounds$2 } = PathBounds;
4900
4957
  const LeafBounds = {
4901
4958
  __updateWorldBounds() {
@@ -4996,7 +5053,7 @@ const LeafBounds = {
4996
5053
  updateAllMatrix$2(this);
4997
5054
  updateBounds$1(this, this);
4998
5055
  if (this.__.__autoSide)
4999
- this.__updateBoxBounds();
5056
+ this.__updateBoxBounds(true);
5000
5057
  }
5001
5058
  else {
5002
5059
  updateAllMatrix$2(this);
@@ -5014,11 +5071,11 @@ const LeafBounds = {
5014
5071
  },
5015
5072
  __updateStrokeBounds() {
5016
5073
  const layout = this.__layout;
5017
- copyAndSpread$1(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5074
+ copyAndSpread$2(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5018
5075
  },
5019
5076
  __updateRenderBounds() {
5020
5077
  const layout = this.__layout;
5021
- layout.renderSpread > 0 ? copyAndSpread$1(layout.renderBounds, layout.boxBounds, layout.renderSpread) : copy$5(layout.renderBounds, layout.strokeBounds);
5078
+ layout.renderSpread > 0 ? copyAndSpread$2(layout.renderBounds, layout.boxBounds, layout.renderSpread) : copy$5(layout.renderBounds, layout.strokeBounds);
5022
5079
  }
5023
5080
  };
5024
5081
 
@@ -5115,7 +5172,7 @@ const { LEAF, create } = IncrementId;
5115
5172
  const { toInnerPoint, toOuterPoint, multiplyParent } = MatrixHelper;
5116
5173
  const { toOuterOf } = BoundsHelper;
5117
5174
  const { copy: copy$4 } = PointHelper;
5118
- const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
5175
+ const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getFlipTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
5119
5176
  let Leaf = class Leaf {
5120
5177
  get tag() { return this.__tag; }
5121
5178
  set tag(_value) { }
@@ -5141,6 +5198,8 @@ let Leaf = class Leaf {
5141
5198
  get __ignoreHitWorld() { return (this.__hasMask || this.__hasEraser) && this.__.hitChildren; }
5142
5199
  get __inLazyBounds() { const { leafer } = this; return leafer && leafer.created && leafer.lazyBounds.hit(this.__world); }
5143
5200
  get pathInputed() { return this.__.__pathInputed; }
5201
+ set event(map) { let event; for (let key in map)
5202
+ event = map[key], event instanceof Array ? this.on(key, event[0], event[1]) : this.on(key, event); }
5144
5203
  constructor(data) {
5145
5204
  this.innerId = create(LEAF);
5146
5205
  this.reset(data);
@@ -5376,6 +5435,9 @@ let Leaf = class Leaf {
5376
5435
  move(x, y) {
5377
5436
  moveLocal(this, x, y);
5378
5437
  }
5438
+ moveInner(x, y) {
5439
+ moveWorld(this, x, y, true);
5440
+ }
5379
5441
  scaleOf(origin, scaleX, scaleY, resize) {
5380
5442
  zoomOfLocal(this, getLocalOrigin(this, origin), scaleX, scaleY, resize);
5381
5443
  }
@@ -5400,6 +5462,9 @@ let Leaf = class Leaf {
5400
5462
  skewOfWorld(worldOrigin, skewX, skewY, resize) {
5401
5463
  skewOfWorld(this, worldOrigin, skewX, skewY, resize);
5402
5464
  }
5465
+ flip(axis) {
5466
+ transform(this, getFlipTransform(this, axis));
5467
+ }
5403
5468
  scaleResize(scaleX, scaleY = scaleX, _noResize) {
5404
5469
  this.scaleX *= scaleX;
5405
5470
  this.scaleY *= scaleY;
@@ -5757,7 +5822,7 @@ class LeafLevelList {
5757
5822
  }
5758
5823
  }
5759
5824
 
5760
- const version = "1.0.0-rc.30";
5825
+ const version = "1.0.1";
5761
5826
  const inviteCode = {};
5762
5827
 
5763
5828
  class LeaferCanvas extends LeaferCanvasBase {
@@ -5827,7 +5892,7 @@ function useCanvas(_canvasType, _power) {
5827
5892
  Platform.name = 'web';
5828
5893
  Platform.isWorker = true;
5829
5894
  Platform.requestRender = function (render) { requestAnimationFrame(render); };
5830
- Platform.devicePixelRatio = 1;
5895
+ defineKey(Platform, 'devicePixelRatio', { get() { return 1; } });
5831
5896
  const { userAgent } = navigator;
5832
5897
  if (userAgent.indexOf("Firefox") > -1) {
5833
5898
  Platform.conicGradientRotate90 = true;
@@ -6323,14 +6388,14 @@ class Renderer {
6323
6388
  if (Debug.showRepaint)
6324
6389
  this.canvas.strokeWorld(bounds, 'red');
6325
6390
  this.target.__render(this.canvas, options);
6326
- this.renderBounds = realBounds || bounds;
6391
+ this.renderBounds = realBounds = realBounds || bounds;
6327
6392
  this.renderOptions = options;
6328
- this.totalBounds.isEmpty() ? this.totalBounds = this.renderBounds : this.totalBounds.add(this.renderBounds);
6393
+ this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
6329
6394
  if (Debug.showHitView)
6330
6395
  this.renderHitView(options);
6331
6396
  if (Debug.showBoundsView)
6332
6397
  this.renderBoundsView(options);
6333
- this.canvas.updateRender();
6398
+ this.canvas.updateRender(realBounds);
6334
6399
  }
6335
6400
  renderHitView(_options) { }
6336
6401
  renderBoundsView(_options) { }
@@ -6910,6 +6975,11 @@ class BoxData extends GroupData {
6910
6975
  }
6911
6976
 
6912
6977
  class LeaferData extends GroupData {
6978
+ __getInputData() {
6979
+ const data = super.__getInputData();
6980
+ canvasSizeAttrs.forEach(key => delete data[key]);
6981
+ return data;
6982
+ }
6913
6983
  }
6914
6984
 
6915
6985
  class FrameData extends BoxData {
@@ -6987,6 +7057,11 @@ class ImageData extends RectData {
6987
7057
  }
6988
7058
 
6989
7059
  class CanvasData extends RectData {
7060
+ __getInputData() {
7061
+ const data = super.__getInputData();
7062
+ data.url = this.__leaf.canvas.toDataURL('image/png');
7063
+ return data;
7064
+ }
6990
7065
  }
6991
7066
 
6992
7067
  const UIBounds = {
@@ -7652,7 +7727,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7652
7727
  this.__controllers.push(this.renderer = Creator.renderer(this, canvas, config), this.watcher = Creator.watcher(this, config), this.layouter = Creator.layouter(this, config));
7653
7728
  if (this.isApp)
7654
7729
  this.__setApp();
7655
- this.__checkAutoLayout(config);
7730
+ this.__checkAutoLayout(config, parentApp);
7656
7731
  this.view = canvas.view;
7657
7732
  if (parentApp) {
7658
7733
  this.__bindApp(parentApp);
@@ -7753,9 +7828,10 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7753
7828
  this.leafer = leafer;
7754
7829
  this.__level = 1;
7755
7830
  }
7756
- __checkAutoLayout(config) {
7757
- if (!config.width || !config.height) {
7758
- this.autoLayout = new AutoBounds(config);
7831
+ __checkAutoLayout(config, parentApp) {
7832
+ if (!parentApp) {
7833
+ if (!config.width || !config.height)
7834
+ this.autoLayout = new AutoBounds(config);
7759
7835
  this.canvas.startAutoLayout(this.autoLayout, this.__onResize.bind(this));
7760
7836
  }
7761
7837
  }
@@ -7890,12 +7966,21 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7890
7966
  list.push(item);
7891
7967
  }
7892
7968
  }
7893
- zoom(_zoomType, _padding, _fixedScale) { return undefined; }
7969
+ zoom(_zoomType, _padding, _fixedScale) {
7970
+ return debug$3.error('need @leafer-in/view');
7971
+ }
7894
7972
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
7895
7973
  getValidScale(changeScale) { return changeScale; }
7896
7974
  getWorldPointByClient(clientPoint, updateClient) {
7897
7975
  return this.interaction && this.interaction.getLocal(clientPoint, updateClient);
7898
7976
  }
7977
+ getPagePointByClient(clientPoint, updateClient) {
7978
+ return this.getPagePoint(this.getWorldPointByClient(clientPoint, updateClient));
7979
+ }
7980
+ updateClientBounds() {
7981
+ this.canvas && this.canvas.updateClientBounds();
7982
+ }
7983
+ receiveEvent(_event) { }
7899
7984
  __checkUpdateLayout() {
7900
7985
  this.__layout.update();
7901
7986
  }
@@ -7979,7 +8064,7 @@ Rect = __decorate([
7979
8064
  const rect$1 = Rect.prototype;
7980
8065
  const group$1 = Group.prototype;
7981
8066
  const childrenRenderBounds = {};
7982
- const { copy: copy$3, add, includes: includes$1 } = BoundsHelper;
8067
+ const { copy: copy$3, add, includes: includes$1, copyAndSpread: copyAndSpread$1 } = BoundsHelper;
7983
8068
  let Box = class Box extends Group {
7984
8069
  get __tag() { return 'Box'; }
7985
8070
  get isBranchLeaf() { return true; }
@@ -7993,20 +8078,23 @@ let Box = class Box extends Group {
7993
8078
  return this.__updateRectRenderSpread() || -1;
7994
8079
  }
7995
8080
  __updateRectBoxBounds() { }
7996
- __updateBoxBounds() {
8081
+ __updateBoxBounds(secondLayout) {
7997
8082
  const data = this.__;
7998
8083
  if (this.children.length) {
7999
8084
  if (data.__autoSide) {
8000
8085
  if (this.leafer && this.leafer.ready)
8001
8086
  this.leafer.layouter.addExtra(this);
8002
8087
  super.__updateBoxBounds();
8088
+ const { boxBounds } = this.__layout;
8003
8089
  if (!data.__autoSize) {
8004
- const b = this.__layout.boxBounds;
8005
- if (!data.__autoWidth)
8006
- b.height += b.y, b.width = data.width, b.x = b.y = 0;
8007
- if (!data.__autoHeight)
8008
- b.width += b.x, b.height = data.height, b.y = b.x = 0;
8090
+ if (data.__autoWidth)
8091
+ boxBounds.width += boxBounds.x, boxBounds.height = data.height, boxBounds.y = boxBounds.x = 0;
8092
+ else
8093
+ boxBounds.height += boxBounds.y, boxBounds.width = data.width, boxBounds.x = boxBounds.y = 0;
8009
8094
  }
8095
+ if (secondLayout && data.flow && data.padding)
8096
+ copyAndSpread$1(boxBounds, boxBounds, data.padding, false, data.__autoSize ? null : (data.__autoWidth ? 'width' : 'height'));
8097
+ this.__updateNaturalSize();
8010
8098
  }
8011
8099
  else {
8012
8100
  this.__updateRectBoxBounds();
@@ -8026,13 +8114,13 @@ let Box = class Box extends Group {
8026
8114
  super.__updateRenderBounds();
8027
8115
  copy$3(childrenRenderBounds, renderBounds);
8028
8116
  this.__updateRectRenderBounds();
8029
- isOverflow = !includes$1(renderBounds, childrenRenderBounds) || undefined;
8117
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds) || !this.pathInputed || !this.__.cornerRadius;
8030
8118
  }
8031
8119
  else {
8032
8120
  this.__updateRectRenderBounds();
8033
8121
  }
8034
8122
  this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8035
- if (isOverflow && !(this.__.__drawAfterFill = this.__.overflow === 'hide'))
8123
+ if (!(this.__.__drawAfterFill = this.__.overflow === 'hide') && isOverflow)
8036
8124
  add(renderBounds, childrenRenderBounds);
8037
8125
  }
8038
8126
  __updateRectRenderBounds() { }
@@ -8366,14 +8454,26 @@ __decorate([
8366
8454
  Image = __decorate([
8367
8455
  registerUI()
8368
8456
  ], Image);
8457
+ const MyImage = Image;
8369
8458
 
8370
8459
  let Canvas = class Canvas extends Rect {
8371
8460
  get __tag() { return 'Canvas'; }
8461
+ get ready() { return !this.url; }
8372
8462
  constructor(data) {
8373
8463
  super(data);
8374
8464
  this.canvas = Creator.canvas(this.__);
8375
8465
  this.context = this.canvas.context;
8376
8466
  this.__.__isCanvas = this.__.__drawAfterFill = true;
8467
+ if (data && data.url)
8468
+ this.drawImage(data.url);
8469
+ }
8470
+ drawImage(url) {
8471
+ new LeaferImage({ url }).load((image) => {
8472
+ this.context.drawImage(image.view, 0, 0);
8473
+ this.url = undefined;
8474
+ this.paint();
8475
+ this.emitEvent(new ImageEvent(ImageEvent.LOADED, { image }));
8476
+ });
8377
8477
  }
8378
8478
  draw(ui, offset, scale, rotation) {
8379
8479
  ui.__layout.update();
@@ -8417,8 +8517,7 @@ let Canvas = class Canvas extends Rect {
8417
8517
  destroy() {
8418
8518
  if (this.canvas) {
8419
8519
  this.canvas.destroy();
8420
- this.canvas = null;
8421
- this.context = null;
8520
+ this.canvas = this.context = null;
8422
8521
  }
8423
8522
  super.destroy();
8424
8523
  }
@@ -8433,7 +8532,7 @@ __decorate([
8433
8532
  resizeType(100)
8434
8533
  ], Canvas.prototype, "height", void 0);
8435
8534
  __decorate([
8436
- resizeType(Platform.devicePixelRatio)
8535
+ resizeType(1)
8437
8536
  ], Canvas.prototype, "pixelRatio", void 0);
8438
8537
  __decorate([
8439
8538
  resizeType(true)
@@ -8457,13 +8556,13 @@ let Text = class Text extends UI {
8457
8556
  super(data);
8458
8557
  }
8459
8558
  __drawHitPath(canvas) {
8460
- const { __lineHeight, __baseLine, __textDrawData: data } = this.__;
8559
+ const { __lineHeight, fontSize, __baseLine, __textDrawData: data } = this.__;
8461
8560
  canvas.beginPath();
8462
8561
  if (this.__.__letterSpacing < 0) {
8463
8562
  this.__drawPathByData(canvas);
8464
8563
  }
8465
8564
  else {
8466
- data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight));
8565
+ data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
8467
8566
  }
8468
8567
  }
8469
8568
  __drawPathByData(drawer, _data) {
@@ -8656,7 +8755,8 @@ let Pen = class Pen extends Group {
8656
8755
  drawPoints(_points, _curve, _close) { return this; }
8657
8756
  clearPath() { return this; }
8658
8757
  paint() {
8659
- this.pathElement.forceUpdate('path');
8758
+ if (!this.pathElement.__layout.boxChanged)
8759
+ this.pathElement.forceUpdate('path');
8660
8760
  }
8661
8761
  };
8662
8762
  __decorate([
@@ -8666,7 +8766,7 @@ __decorate([
8666
8766
  penPathType()
8667
8767
  ], Pen.prototype, "path", void 0);
8668
8768
  Pen = __decorate([
8669
- useModule(PathCreator, ['set', 'beginPath', 'path']),
8769
+ useModule(PathCreator, ['set', 'beginPath', 'path', 'paint']),
8670
8770
  registerUI()
8671
8771
  ], Pen);
8672
8772
  function penPathType() {
@@ -8771,11 +8871,13 @@ let App = class App extends Leafer {
8771
8871
  this.renderer.update();
8772
8872
  }
8773
8873
  __render(canvas, options) {
8774
- if (options.matrix) {
8775
- const { a, b, c, d, e, f } = options.matrix;
8776
- canvas.setTransform(a, b, c, d, e, f);
8874
+ if (canvas.context) {
8875
+ if (options.matrix) {
8876
+ const { a, b, c, d, e, f } = options.matrix;
8877
+ canvas.setTransform(a, b, c, d, e, f);
8878
+ }
8879
+ this.children.forEach(leafer => canvas.copyWorld(leafer.canvas));
8777
8880
  }
8778
- this.children.forEach(leafer => canvas.copyWorld(leafer.canvas));
8779
8881
  }
8780
8882
  __onResize(event) {
8781
8883
  this.children.forEach(leafer => leafer.resize(event));
@@ -8887,6 +8989,7 @@ PointerEvent.MENU_TAP = 'pointer.menu_tap';
8887
8989
  PointerEvent = __decorate([
8888
8990
  registerUIEvent()
8889
8991
  ], PointerEvent);
8992
+ const MyPointerEvent = PointerEvent;
8890
8993
 
8891
8994
  const move = {};
8892
8995
  let DragEvent = class DragEvent extends PointerEvent {
@@ -8986,6 +9089,7 @@ DragEvent.LEAVE = 'drag.leave';
8986
9089
  DragEvent = __decorate([
8987
9090
  registerUIEvent()
8988
9091
  ], DragEvent);
9092
+ const MyDragEvent = DragEvent;
8989
9093
 
8990
9094
  let DropEvent = class DropEvent extends PointerEvent {
8991
9095
  static setList(data) {
@@ -9067,36 +9171,32 @@ function addInteractionWindow(leafer) {
9067
9171
 
9068
9172
  function document(leafer) {
9069
9173
  addInteractionWindow(leafer);
9070
- leafer.config.move.scroll = 'limit';
9071
- leafer.config.zoom.min = 1;
9174
+ const { move, zoom } = leafer.config;
9175
+ move.scroll = 'limit';
9176
+ zoom.min = 1;
9177
+ }
9178
+
9179
+ function block(leafer) {
9180
+ const { config } = leafer;
9181
+ (config.wheel || (config.wheel = {})).preventDefault = false;
9182
+ (config.touch || (config.touch = {})).preventDefault = 'auto';
9072
9183
  }
9073
9184
 
9074
9185
  const debug$2 = Debug.get('LeaferTypeCreator');
9075
9186
  const LeaferTypeCreator = {
9076
9187
  list: {},
9077
9188
  register(name, fn) {
9078
- if (list[name]) {
9079
- debug$2.repeat(name);
9080
- }
9081
- else {
9082
- list[name] = fn;
9083
- }
9189
+ list[name] ? debug$2.repeat(name) : list[name] = fn;
9084
9190
  },
9085
9191
  run(name, leafer) {
9086
9192
  const fn = list[name];
9087
- if (fn) {
9088
- fn(leafer);
9089
- }
9090
- else {
9091
- debug$2.error('no', name);
9092
- }
9193
+ fn && fn(leafer);
9093
9194
  }
9094
9195
  };
9095
9196
  const { list, register } = LeaferTypeCreator;
9096
- register('draw', () => { });
9097
- register('custom', () => { });
9098
9197
  register('design', addInteractionWindow);
9099
9198
  register('document', document);
9199
+ register('block', block);
9100
9200
 
9101
9201
  const leafer = Leafer.prototype;
9102
9202
  leafer.initType = function (type) {
@@ -9142,11 +9242,14 @@ leafer.getValidScale = function (changeScale) {
9142
9242
  };
9143
9243
 
9144
9244
  class Transformer {
9245
+ get transforming() { return !!(this.moveData || this.zoomData || this.rotateData); }
9145
9246
  constructor(interaction) {
9146
9247
  this.interaction = interaction;
9147
9248
  }
9148
9249
  move(data) {
9149
9250
  const { interaction } = this;
9251
+ if (!data.moveType)
9252
+ data.moveType = 'move';
9150
9253
  if (!this.moveData) {
9151
9254
  const { path } = interaction.selector.getByPoint(data, interaction.hitRadius);
9152
9255
  data.path = path;
@@ -9282,7 +9385,13 @@ const InteractionHelper = {
9282
9385
  find.add(list[i]);
9283
9386
  }
9284
9387
  return find;
9285
- }
9388
+ },
9389
+ pathCanDrag(path) {
9390
+ return path && path.list.some(item => item.draggable || item.editable || (!item.isLeafer && item.hasEvent(DragEvent.DRAG)));
9391
+ },
9392
+ pathHasOutside(path) {
9393
+ return path && path.list.some(item => item.isOutside);
9394
+ },
9286
9395
  };
9287
9396
  const I = InteractionHelper;
9288
9397
 
@@ -9311,8 +9420,10 @@ class Dragger {
9311
9420
  return;
9312
9421
  }
9313
9422
  if (!this.moving && canDrag) {
9314
- if (this.moving = interaction.canMove(this.downData) || interaction.isHoldRightKey || interaction.isMobileDragEmpty)
9423
+ if (this.moving = interaction.canMove(this.downData) || interaction.isHoldRightKey || interaction.isMobileDragEmpty) {
9424
+ this.dragData.moveType = 'drag';
9315
9425
  interaction.emit(MoveEvent.START, this.dragData);
9426
+ }
9316
9427
  }
9317
9428
  if (!this.moving) {
9318
9429
  this.dragStart(data, canDrag);
@@ -9351,6 +9462,7 @@ class Dragger {
9351
9462
  this.dragData.throughPath = throughPath;
9352
9463
  this.dragData.path = path;
9353
9464
  if (this.moving) {
9465
+ this.dragData.moveType = 'drag';
9354
9466
  interaction.emit(MoveEvent.BEFORE_MOVE, this.dragData);
9355
9467
  interaction.emit(MoveEvent.MOVE, this.dragData);
9356
9468
  }
@@ -9417,6 +9529,7 @@ class Dragger {
9417
9529
  endDragData.path = path;
9418
9530
  if (this.moving) {
9419
9531
  this.moving = false;
9532
+ endDragData.moveType = 'drag';
9420
9533
  interaction.emit(MoveEvent.END, endDragData);
9421
9534
  }
9422
9535
  if (this.dragging) {
@@ -9475,7 +9588,7 @@ class Dragger {
9475
9588
  totalY += moveY;
9476
9589
  PointHelper.move(downData, moveX, moveY);
9477
9590
  PointHelper.move(this.dragData, moveX, moveY);
9478
- interaction.move(Object.assign(Object.assign({}, data), { moveX, moveY, totalX, totalY }));
9591
+ interaction.move(Object.assign(Object.assign({}, data), { moveX, moveY, totalX, totalY, moveType: 'drag' }));
9479
9592
  interaction.pointerMoveReal(data);
9480
9593
  }, 10);
9481
9594
  }
@@ -9588,22 +9701,27 @@ const config = {
9588
9701
  swipeDistance: 20,
9589
9702
  preventDefaultMenu: true
9590
9703
  },
9704
+ touch: {
9705
+ preventDefault: true
9706
+ },
9591
9707
  cursor: true,
9592
9708
  keyEvent: true
9593
9709
  };
9594
9710
 
9595
- const { pathHasEventType, getMoveEventData, getZoomEventData, getRotateEventData } = InteractionHelper;
9711
+ const { pathHasEventType, getMoveEventData, getZoomEventData, getRotateEventData, pathCanDrag, pathHasOutside } = InteractionHelper;
9596
9712
  class InteractionBase {
9597
9713
  get dragging() { return this.dragger.dragging; }
9598
- get moveMode() { return this.config.move.drag || this.isHoldSpaceKey || this.isHoldMiddleKey || (this.isHoldRightKey && this.dragger.moving) || this.isDragEmpty; }
9714
+ get transforming() { return this.transformer.transforming; }
9715
+ get moveMode() { return this.config.move.drag === true || this.isHoldSpaceKey || this.isHoldMiddleKey || (this.isHoldRightKey && this.dragger.moving) || this.isDragEmpty; }
9716
+ get canHover() { return this.config.pointer.hover && !this.config.mobile; }
9599
9717
  get isDragEmpty() { return this.config.move.dragEmpty && this.isRootPath(this.hoverData) && (!this.downData || this.isRootPath(this.downData)); }
9600
- get isMobileDragEmpty() { return this.config.move.dragEmpty && !this.config.pointer.hover && this.downData && this.isTreePath(this.downData); }
9718
+ get isMobileDragEmpty() { return this.config.move.dragEmpty && !this.canHover && this.downData && this.isTreePath(this.downData); }
9601
9719
  get isHoldMiddleKey() { return this.config.move.holdMiddleKey && this.downData && PointerButton.middle(this.downData); }
9602
9720
  get isHoldRightKey() { return this.config.move.holdRightKey && this.downData && PointerButton.right(this.downData); }
9603
9721
  get isHoldSpaceKey() { return this.config.move.holdSpaceKey && Keyboard.isHoldSpaceKey(); }
9604
9722
  get hitRadius() { return this.config.pointer.hitRadius; }
9605
9723
  constructor(target, canvas, selector, userConfig) {
9606
- this.config = config;
9724
+ this.config = DataHelper.clone(config);
9607
9725
  this.tapCount = 0;
9608
9726
  this.downKeyMap = {};
9609
9727
  this.target = target;
@@ -9690,6 +9808,7 @@ class InteractionBase {
9690
9808
  if (!downData)
9691
9809
  return;
9692
9810
  PointerButton.defaultLeft(data);
9811
+ data.multiTouch = downData.multiTouch;
9693
9812
  this.findPath(data);
9694
9813
  const upData = Object.assign(Object.assign({}, data), { path: data.path.clone() });
9695
9814
  data.path.addList(downData.path.list);
@@ -9762,7 +9881,7 @@ class InteractionBase {
9762
9881
  this.updateCursor();
9763
9882
  }
9764
9883
  pointerHover(data) {
9765
- if (this.config.pointer.hover) {
9884
+ if (this.canHover) {
9766
9885
  this.pointerOverOrOut(data);
9767
9886
  this.pointerEnterOrLeave(data);
9768
9887
  }
@@ -9854,11 +9973,11 @@ class InteractionBase {
9854
9973
  return app.editor && (!data.path.has(app.editor) && data.path.has(app.tree) && !data.target.syncEventer);
9855
9974
  }
9856
9975
  checkPath(data, useDefaultPath) {
9857
- if (useDefaultPath || this.canMove(data))
9976
+ if (useDefaultPath || (this.moveMode && !pathHasOutside(data.path)))
9858
9977
  data.path = this.defaultPath;
9859
9978
  }
9860
9979
  canMove(data) {
9861
- return this.moveMode && data && data.path.list.every(item => !item.isOutside);
9980
+ return data && (this.moveMode || (this.config.move.drag === 'auto' && !pathCanDrag(data.path))) && !pathHasOutside(data.path);
9862
9981
  }
9863
9982
  isDrag(leaf) {
9864
9983
  return this.dragger.getList().has(leaf);
@@ -9899,7 +10018,7 @@ class InteractionBase {
9899
10018
  this.hoverData = data;
9900
10019
  }
9901
10020
  updateCursor(data) {
9902
- if (!this.config.cursor || !this.config.pointer.hover)
10021
+ if (!this.config.cursor || !this.canHover)
9903
10022
  return;
9904
10023
  if (!data) {
9905
10024
  this.updateHoverData();
@@ -10553,10 +10672,13 @@ function repeatMode(data, box, width, height, x, y, scaleX, scaleY, rotation, al
10553
10672
  const { get: get$2, translate } = MatrixHelper;
10554
10673
  const tempBox = new Bounds();
10555
10674
  const tempPoint = {};
10675
+ const tempScaleData = {};
10556
10676
  function createData(leafPaint, image, paint, box) {
10557
- const { blendMode } = paint;
10677
+ const { blendMode, sync } = paint;
10558
10678
  if (blendMode)
10559
10679
  leafPaint.blendMode = blendMode;
10680
+ if (sync)
10681
+ leafPaint.sync = sync;
10560
10682
  leafPaint.data = getPatternData(paint, box, image);
10561
10683
  }
10562
10684
  function getPatternData(paint, box, image) {
@@ -10576,13 +10698,10 @@ function getPatternData(paint, box, image) {
10576
10698
  x += (box.width - width * scaleX) / 2, y += (box.height - height * scaleY) / 2;
10577
10699
  }
10578
10700
  }
10579
- else if (size) {
10580
- scaleX = (typeof size === 'number' ? size : size.width) / width;
10581
- scaleY = (typeof size === 'number' ? size : size.height) / height;
10582
- }
10583
- else if (scale) {
10584
- scaleX = typeof scale === 'number' ? scale : scale.x;
10585
- scaleY = typeof scale === 'number' ? scale : scale.y;
10701
+ else if (scale || size) {
10702
+ MathHelper.getScaleData(scale, size, image, tempScaleData);
10703
+ scaleX = tempScaleData.scaleX;
10704
+ scaleY = tempScaleData.scaleY;
10586
10705
  }
10587
10706
  if (align) {
10588
10707
  const imageBounds = { x, y, width: swapWidth, height: swapHeight };
@@ -10787,7 +10906,7 @@ function createPattern(ui, paint, pixelRatio) {
10787
10906
  const { abs } = Math;
10788
10907
  function checkImage(ui, canvas, paint, allowPaint) {
10789
10908
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
10790
- if (!paint.data || paint.patternId === scaleX + '-' + scaleY) {
10909
+ if (!paint.data || (paint.patternId === scaleX + '-' + scaleY && !Export.running)) {
10791
10910
  return false;
10792
10911
  }
10793
10912
  else {
@@ -10821,7 +10940,7 @@ function checkImage(ui, canvas, paint, allowPaint) {
10821
10940
  return true;
10822
10941
  }
10823
10942
  else {
10824
- if (!paint.style || Export.running) {
10943
+ if (!paint.style || paint.sync || Export.running) {
10825
10944
  createPattern(ui, paint, canvas.pixelRatio);
10826
10945
  }
10827
10946
  else {
@@ -11691,6 +11810,7 @@ const ExportModule = {
11691
11810
  export(leaf, filename, options) {
11692
11811
  this.running = true;
11693
11812
  const fileType = FileHelper.fileType(filename);
11813
+ const isDownload = filename.includes('.');
11694
11814
  options = FileHelper.getExportOptions(options);
11695
11815
  return addTask((success) => new Promise((resolve) => {
11696
11816
  const over = (result) => {
@@ -11700,19 +11820,13 @@ const ExportModule = {
11700
11820
  };
11701
11821
  const { toURL } = Platform;
11702
11822
  const { download } = Platform.origin;
11703
- if (filename === 'json') {
11704
- return over({ data: leaf.toJSON(options.json) });
11705
- }
11706
- else if (fileType === 'json') {
11707
- download(toURL(JSON.stringify(leaf.toJSON(options.json)), 'text'), filename);
11708
- return over({ data: true });
11823
+ if (fileType === 'json') {
11824
+ isDownload && download(toURL(JSON.stringify(leaf.toJSON(options.json)), 'text'), filename);
11825
+ return over({ data: isDownload ? true : leaf.toJSON(options.json) });
11709
11826
  }
11710
- if (filename === 'svg') {
11711
- return over({ data: leaf.toSVG() });
11712
- }
11713
- else if (fileType === 'svg') {
11714
- download(toURL(leaf.toSVG(), 'svg'), filename);
11715
- return over({ data: true });
11827
+ if (fileType === 'svg') {
11828
+ isDownload && download(toURL(leaf.toSVG(), 'svg'), filename);
11829
+ return over({ data: isDownload ? true : leaf.toSVG() });
11716
11830
  }
11717
11831
  const { leafer } = leaf;
11718
11832
  if (leafer) {
@@ -11721,14 +11835,8 @@ const ExportModule = {
11721
11835
  let renderBounds, trimBounds, scaleX = 1, scaleY = 1;
11722
11836
  const { worldTransform, isLeafer, isFrame } = leaf;
11723
11837
  const { slice, trim, onCanvas } = options;
11724
- let scale = options.scale || 1;
11725
- let pixelRatio = options.pixelRatio || 1;
11726
11838
  const smooth = options.smooth === undefined ? leafer.config.smooth : options.smooth;
11727
11839
  const contextSettings = options.contextSettings || leafer.config.contextSettings;
11728
- if (leaf.isApp) {
11729
- scale *= pixelRatio;
11730
- pixelRatio = leaf.app.pixelRatio;
11731
- }
11732
11840
  const screenshot = options.screenshot || leaf.isApp;
11733
11841
  const fill = (isLeafer && screenshot) ? (options.fill === undefined ? leaf.fill : options.fill) : options.fill;
11734
11842
  const needFill = FileHelper.isOpaqueImage(filename) || fill, matrix = new Matrix();
@@ -11762,10 +11870,21 @@ const ExportModule = {
11762
11870
  }
11763
11871
  renderBounds = leaf.getBounds('render', relative);
11764
11872
  }
11765
- const { x, y, width, height } = new Bounds(renderBounds).scale(scale);
11873
+ const scaleData = { scaleX: 1, scaleY: 1 };
11874
+ MathHelper.getScaleData(options.scale, options.size, renderBounds, scaleData);
11875
+ let pixelRatio = options.pixelRatio || 1;
11876
+ if (leaf.isApp) {
11877
+ scaleData.scaleX *= pixelRatio;
11878
+ scaleData.scaleY *= pixelRatio;
11879
+ pixelRatio = leaf.app.pixelRatio;
11880
+ }
11881
+ const { x, y, width, height } = new Bounds(renderBounds).scale(scaleData.scaleX, scaleData.scaleY);
11882
+ const renderOptions = { matrix: matrix.scale(1 / scaleData.scaleX, 1 / scaleData.scaleY).invert().translate(-x, -y).withScale(1 / scaleX * scaleData.scaleX, 1 / scaleY * scaleData.scaleY) };
11766
11883
  let canvas = Creator.canvas({ width: Math.round(width), height: Math.round(height), pixelRatio, smooth, contextSettings });
11767
- const renderOptions = { matrix: matrix.scale(1 / scale).invert().translate(-x, -y).withScale(1 / scaleX * scale, 1 / scaleY * scale) };
11884
+ let sliceLeaf;
11768
11885
  if (slice) {
11886
+ sliceLeaf = leaf;
11887
+ sliceLeaf.__worldOpacity = 0;
11769
11888
  leaf = leafer;
11770
11889
  renderOptions.bounds = canvas.bounds;
11771
11890
  }
@@ -11780,6 +11899,8 @@ const ExportModule = {
11780
11899
  leaf.__render(canvas, renderOptions);
11781
11900
  }
11782
11901
  canvas.restore();
11902
+ if (sliceLeaf)
11903
+ sliceLeaf.__updateWorldOpacity();
11783
11904
  if (trim) {
11784
11905
  trimBounds = getTrimBounds(canvas);
11785
11906
  const old = canvas, { width, height } = trimBounds;
@@ -11869,4 +11990,4 @@ Object.assign(Creator, {
11869
11990
  });
11870
11991
  useCanvas();
11871
11992
 
11872
- export { AlignHelper, AnimateEvent, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragEvent, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Export, FileHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, LeaferTypeCreator, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, addInteractionWindow, affectRenderBoundsType, affectStrokeBoundsType, arrowType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, inviteCode, layoutProcessor, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, stateType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix, tempPoint$3 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };
11993
+ export { AlignHelper, AnimateEvent, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragEvent, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Export, FileHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, LeaferTypeCreator, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, addInteractionWindow, affectRenderBoundsType, affectStrokeBoundsType, arrowType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, inviteCode, layoutProcessor, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, stateType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix, tempPoint$3 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };