leafer-draw 1.0.1 → 1.0.3

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.
@@ -111,6 +111,26 @@ const MathHelper = {
111
111
  const a = maxLength ? pow$1(10, maxLength) : 1000000000000;
112
112
  num = round(num * a) / a;
113
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
+ MathHelper.assignScale(scaleData, scale);
124
+ return scaleData;
125
+ },
126
+ assignScale(scaleData, scale) {
127
+ if (typeof scale === 'number') {
128
+ scaleData.scaleX = scaleData.scaleY = scale;
129
+ }
130
+ else {
131
+ scaleData.scaleX = scale.x;
132
+ scaleData.scaleY = scale.y;
133
+ }
114
134
  }
115
135
  };
116
136
  const OneRadian = PI$4 / 180;
@@ -409,7 +429,7 @@ const MatrixHelper = {
409
429
  };
410
430
  const M$6 = MatrixHelper;
411
431
 
412
- const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$2 } = MatrixHelper;
432
+ const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3 } = MatrixHelper;
413
433
  const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, PI: PI$3 } = Math;
414
434
  const PointHelper = {
415
435
  defaultPoint: getPointData(),
@@ -465,7 +485,7 @@ const PointHelper = {
465
485
  tempToOuterOf(t, matrix) {
466
486
  const { tempPoint: temp } = P$5;
467
487
  copy$a(temp, t);
468
- toOuterPoint$2(matrix, temp, temp);
488
+ toOuterPoint$3(matrix, temp, temp);
469
489
  return temp;
470
490
  },
471
491
  tempToInnerRadiusPointOf(t, matrix) {
@@ -484,7 +504,7 @@ const PointHelper = {
484
504
  toInnerPoint$2(matrix, t, to);
485
505
  },
486
506
  toOuterOf(t, matrix, to) {
487
- toOuterPoint$2(matrix, t, to);
507
+ toOuterPoint$3(matrix, t, to);
488
508
  },
489
509
  getCenter(t, to) {
490
510
  return { x: t.x + (to.x - t.x) / 2, y: t.y + (to.y - t.y) / 2 };
@@ -764,7 +784,7 @@ const TwoPointBoundsHelper = {
764
784
  const { addPoint: addPoint$4 } = TwoPointBoundsHelper;
765
785
 
766
786
  const { tempPointBounds: tempPointBounds$1, setPoint: setPoint$3, addPoint: addPoint$3, toBounds: toBounds$4 } = TwoPointBoundsHelper;
767
- const { toOuterPoint: toOuterPoint$1 } = MatrixHelper;
787
+ const { toOuterPoint: toOuterPoint$2 } = MatrixHelper;
768
788
  const { float, fourNumber } = MathHelper;
769
789
  const { floor, ceil: ceil$2 } = Math;
770
790
  let right$1, bottom$1, boundsRight, boundsBottom;
@@ -784,17 +804,24 @@ const BoundsHelper = {
784
804
  t.width = bounds.width;
785
805
  t.height = bounds.height;
786
806
  },
787
- copyAndSpread(t, bounds, spread, isShrink) {
807
+ copyAndSpread(t, bounds, spread, isShrink, side) {
808
+ const { x, y, width, height } = bounds;
788
809
  if (spread instanceof Array) {
789
810
  const four = fourNumber(spread);
790
811
  isShrink
791
- ? B.set(t, bounds.x + four[3], bounds.y + four[0], bounds.width - four[1] - four[3], bounds.height - four[2] - four[0])
792
- : B.set(t, bounds.x - four[3], bounds.y - four[0], bounds.width + four[1] + four[3], bounds.height + four[2] + four[0]);
812
+ ? B.set(t, x + four[3], y + four[0], width - four[1] - four[3], height - four[2] - four[0])
813
+ : B.set(t, x - four[3], y - four[0], width + four[1] + four[3], height + four[2] + four[0]);
793
814
  }
794
815
  else {
795
816
  if (isShrink)
796
817
  spread = -spread;
797
- B.set(t, bounds.x - spread, bounds.y - spread, bounds.width + spread * 2, bounds.height + spread * 2);
818
+ B.set(t, x - spread, y - spread, width + spread * 2, height + spread * 2);
819
+ }
820
+ if (side) {
821
+ if (side === 'width')
822
+ t.y = y, t.height = height;
823
+ else
824
+ t.x = x, t.width = width;
798
825
  }
799
826
  },
800
827
  minX(t) { return t.width > 0 ? t.x : t.x + t.width; },
@@ -871,16 +898,16 @@ const BoundsHelper = {
871
898
  else {
872
899
  point.x = t.x;
873
900
  point.y = t.y;
874
- toOuterPoint$1(matrix, point, toPoint$5);
901
+ toOuterPoint$2(matrix, point, toPoint$5);
875
902
  setPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
876
903
  point.x = t.x + t.width;
877
- toOuterPoint$1(matrix, point, toPoint$5);
904
+ toOuterPoint$2(matrix, point, toPoint$5);
878
905
  addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
879
906
  point.y = t.y + t.height;
880
- toOuterPoint$1(matrix, point, toPoint$5);
907
+ toOuterPoint$2(matrix, point, toPoint$5);
881
908
  addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
882
909
  point.x = t.x;
883
- toOuterPoint$1(matrix, point, toPoint$5);
910
+ toOuterPoint$2(matrix, point, toPoint$5);
884
911
  addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
885
912
  toBounds$4(tempPointBounds$1, to);
886
913
  }
@@ -894,16 +921,16 @@ const BoundsHelper = {
894
921
  const scale = Math.min(baseScale, Math.min(t.width / put.width, t.height / put.height));
895
922
  return new Matrix(scale, 0, 0, scale, -put.x * scale, -put.y * scale);
896
923
  },
897
- getSpread(t, spread) {
924
+ getSpread(t, spread, side) {
898
925
  const n = {};
899
- B.copyAndSpread(n, t, spread);
926
+ B.copyAndSpread(n, t, spread, false, side);
900
927
  return n;
901
928
  },
902
- spread(t, spread) {
903
- B.copyAndSpread(t, t, spread);
929
+ spread(t, spread, side) {
930
+ B.copyAndSpread(t, t, spread, false, side);
904
931
  },
905
- shrink(t, shrink) {
906
- B.copyAndSpread(t, t, shrink, true);
932
+ shrink(t, shrink, side) {
933
+ B.copyAndSpread(t, t, shrink, true, side);
907
934
  },
908
935
  ceil(t) {
909
936
  const { x, y } = t;
@@ -1086,12 +1113,12 @@ class Bounds {
1086
1113
  getFitMatrix(put, baseScale) {
1087
1114
  return BoundsHelper.getFitMatrix(this, put, baseScale);
1088
1115
  }
1089
- spread(fourNumber) {
1090
- BoundsHelper.spread(this, fourNumber);
1116
+ spread(fourNumber, side) {
1117
+ BoundsHelper.spread(this, fourNumber, side);
1091
1118
  return this;
1092
1119
  }
1093
- shrink(fourNumber) {
1094
- BoundsHelper.shrink(this, fourNumber);
1120
+ shrink(fourNumber, side) {
1121
+ BoundsHelper.shrink(this, fourNumber, side);
1095
1122
  return this;
1096
1123
  }
1097
1124
  ceil() {
@@ -1235,7 +1262,6 @@ const AroundHelper = {
1235
1262
  tempPoint: {},
1236
1263
  get: get$4,
1237
1264
  toPoint(around, bounds, to, onlySize, pointBounds) {
1238
- to || (to = {});
1239
1265
  const point = get$4(around);
1240
1266
  to.x = point.x;
1241
1267
  to.y = point.y;
@@ -1370,6 +1396,10 @@ const Run = {
1370
1396
  };
1371
1397
  const R = Run;
1372
1398
 
1399
+ function needPlugin(name) {
1400
+ console.error('need plugin: @leafer-in/' + name);
1401
+ }
1402
+
1373
1403
  const debug$d = Debug.get('UICreator');
1374
1404
  const UICreator = {
1375
1405
  list: {},
@@ -1632,6 +1662,9 @@ var Answer;
1632
1662
  Answer[Answer["YesAndSkip"] = 3] = "YesAndSkip";
1633
1663
  })(Answer || (Answer = {}));
1634
1664
  const emptyData = {};
1665
+ function isNull(value) {
1666
+ return value === undefined || value === null;
1667
+ }
1635
1668
 
1636
1669
  /******************************************************************************
1637
1670
  Copyright (c) Microsoft Corporation.
@@ -2397,7 +2430,7 @@ const BezierHelper = {
2397
2430
  let startY = y = rotationSin * radiusX * startCos + rotationCos * radiusY * startSin;
2398
2431
  let fromX = cx + x, fromY = cy + y;
2399
2432
  if (data)
2400
- data.push(L$6, fromX, fromY);
2433
+ data.push(data.length ? L$6 : M$5, fromX, fromY);
2401
2434
  if (setPointBounds)
2402
2435
  setPoint$2(setPointBounds, fromX, fromY);
2403
2436
  if (setStartPoint)
@@ -2908,60 +2941,75 @@ class PathCreator {
2908
2941
  }
2909
2942
  beginPath() {
2910
2943
  beginPath(this.__path);
2944
+ this.paint();
2911
2945
  return this;
2912
2946
  }
2913
2947
  moveTo(x, y) {
2914
2948
  moveTo$4(this.__path, x, y);
2949
+ this.paint();
2915
2950
  return this;
2916
2951
  }
2917
2952
  lineTo(x, y) {
2918
2953
  lineTo$3(this.__path, x, y);
2954
+ this.paint();
2919
2955
  return this;
2920
2956
  }
2921
2957
  bezierCurveTo(x1, y1, x2, y2, x, y) {
2922
2958
  bezierCurveTo(this.__path, x1, y1, x2, y2, x, y);
2959
+ this.paint();
2923
2960
  return this;
2924
2961
  }
2925
2962
  quadraticCurveTo(x1, y1, x, y) {
2926
2963
  quadraticCurveTo(this.__path, x1, y1, x, y);
2964
+ this.paint();
2927
2965
  return this;
2928
2966
  }
2929
2967
  closePath() {
2930
2968
  closePath$3(this.__path);
2969
+ this.paint();
2931
2970
  return this;
2932
2971
  }
2933
2972
  rect(x, y, width, height) {
2934
2973
  rect$1(this.__path, x, y, width, height);
2974
+ this.paint();
2935
2975
  return this;
2936
2976
  }
2937
2977
  roundRect(x, y, width, height, cornerRadius) {
2938
2978
  roundRect$1(this.__path, x, y, width, height, cornerRadius);
2979
+ this.paint();
2939
2980
  return this;
2940
2981
  }
2941
2982
  ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) {
2942
2983
  ellipse$2(this.__path, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
2984
+ this.paint();
2943
2985
  return this;
2944
2986
  }
2945
2987
  arc(x, y, radius, startAngle, endAngle, anticlockwise) {
2946
2988
  arc$1(this.__path, x, y, radius, startAngle, endAngle, anticlockwise);
2989
+ this.paint();
2947
2990
  return this;
2948
2991
  }
2949
2992
  arcTo(x1, y1, x2, y2, radius) {
2950
2993
  arcTo$2(this.__path, x1, y1, x2, y2, radius);
2994
+ this.paint();
2951
2995
  return this;
2952
2996
  }
2953
2997
  drawEllipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) {
2954
2998
  drawEllipse(this.__path, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
2999
+ this.paint();
2955
3000
  return this;
2956
3001
  }
2957
3002
  drawArc(x, y, radius, startAngle, endAngle, anticlockwise) {
2958
3003
  drawArc(this.__path, x, y, radius, startAngle, endAngle, anticlockwise);
3004
+ this.paint();
2959
3005
  return this;
2960
3006
  }
2961
3007
  drawPoints(points, curve, close) {
2962
3008
  drawPoints$2(this.__path, points, curve, close);
3009
+ this.paint();
2963
3010
  return this;
2964
3011
  }
3012
+ paint() { }
2965
3013
  }
2966
3014
 
2967
3015
  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;
@@ -3051,8 +3099,7 @@ const PathBounds = {
3051
3099
  toTwoPointBounds(data, setPointBounds) {
3052
3100
  if (!data || !data.length)
3053
3101
  return setPoint$1(setPointBounds, 0, 0);
3054
- let command;
3055
- let i = 0, x = 0, y = 0, x1, y1, toX, toY;
3102
+ let i = 0, x = 0, y = 0, x1, y1, toX, toY, command;
3056
3103
  const len = data.length;
3057
3104
  while (i < len) {
3058
3105
  command = data[i];
@@ -3708,7 +3755,7 @@ function autoLayoutType(defaultValue) {
3708
3755
  set(value) {
3709
3756
  if (this.__setAttr(key, value)) {
3710
3757
  this.__layout.matrixChanged || this.__layout.matrixChange();
3711
- this.__hasAutoLayout = !!value;
3758
+ this.__hasAutoLayout = !!(this.origin || this.around || this.flow);
3712
3759
  if (!this.__local)
3713
3760
  this.__layout.createLocal();
3714
3761
  }
@@ -3801,14 +3848,25 @@ function visibleType(defaultValue) {
3801
3848
  return decorateLeafAttr(defaultValue, (key) => attr({
3802
3849
  set(value) {
3803
3850
  const oldValue = this.visible;
3804
- if (this.__setAttr(key, value)) {
3805
- this.__layout.opacityChanged || this.__layout.opacityChange();
3806
- if (oldValue === 0 || value === 0)
3807
- doBoundsType(this);
3851
+ if (oldValue === true && value === 0) {
3852
+ if (this.animationOut)
3853
+ return this.__runAnimation('out', () => doVisible(this, key, value, oldValue));
3854
+ }
3855
+ else if (oldValue === 0 && value === true) {
3856
+ if (this.animation)
3857
+ this.__runAnimation('in');
3808
3858
  }
3859
+ doVisible(this, key, value, oldValue);
3809
3860
  }
3810
3861
  }));
3811
3862
  }
3863
+ function doVisible(leaf, key, value, oldValue) {
3864
+ if (leaf.__setAttr(key, value)) {
3865
+ leaf.__layout.opacityChanged || leaf.__layout.opacityChange();
3866
+ if (oldValue === 0 || value === 0)
3867
+ doBoundsType(leaf);
3868
+ }
3869
+ }
3812
3870
  function sortType(defaultValue) {
3813
3871
  return decorateLeafAttr(defaultValue, (key) => attr({
3814
3872
  set(value) {
@@ -3892,7 +3950,16 @@ function defineDataProcessor(target, key, defaultValue) {
3892
3950
  if (defaultValue === undefined) {
3893
3951
  property.get = function () { return this[computedKey]; };
3894
3952
  }
3895
- else if (key === 'width') {
3953
+ else if (typeof defaultValue === 'object') {
3954
+ const { clone } = DataHelper;
3955
+ property.get = function () {
3956
+ let v = this[computedKey];
3957
+ if (v === undefined)
3958
+ this[computedKey] = v = clone(defaultValue);
3959
+ return v;
3960
+ };
3961
+ }
3962
+ if (key === 'width') {
3896
3963
  property.get = function () {
3897
3964
  const v = this[computedKey];
3898
3965
  if (v === undefined) {
@@ -3983,7 +4050,7 @@ function registerUIEvent() {
3983
4050
  };
3984
4051
  }
3985
4052
 
3986
- const { copy: copy$6, toInnerPoint: toInnerPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
4053
+ const { copy: copy$6, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
3987
4054
  const matrix = {};
3988
4055
  const LeafHelper = {
3989
4056
  updateAllMatrix(leaf, checkAutoLayout, waitAutoLayout) {
@@ -4048,10 +4115,9 @@ const LeafHelper = {
4048
4115
  }
4049
4116
  return true;
4050
4117
  },
4051
- moveWorld(t, x, y = 0) {
4118
+ moveWorld(t, x, y = 0, isInnerPoint) {
4052
4119
  const local = typeof x === 'object' ? Object.assign({}, x) : { x, y };
4053
- if (t.parent)
4054
- toInnerPoint$1(t.parent.worldTransform, local, local, true);
4120
+ isInnerPoint ? toOuterPoint$1(t.localTransform, local, local, true) : (t.parent && toInnerPoint$1(t.parent.worldTransform, local, local, true));
4055
4121
  L.moveLocal(t, local.x, local.y);
4056
4122
  },
4057
4123
  moveLocal(t, x, y = 0) {
@@ -4560,144 +4626,6 @@ class LeafLayout {
4560
4626
  destroy() { }
4561
4627
  }
4562
4628
 
4563
- const empty = {};
4564
- const LeafEventer = {
4565
- on(type, listener, options) {
4566
- let capture, once;
4567
- if (options) {
4568
- if (options === 'once') {
4569
- once = true;
4570
- }
4571
- else if (typeof options === 'boolean') {
4572
- capture = options;
4573
- }
4574
- else {
4575
- capture = options.capture;
4576
- once = options.once;
4577
- }
4578
- }
4579
- let events;
4580
- const map = __getListenerMap(this, capture, true);
4581
- const typeList = typeof type === 'string' ? type.split(' ') : type;
4582
- const item = once ? { listener, once } : { listener };
4583
- typeList.forEach(type => {
4584
- if (type) {
4585
- events = map[type];
4586
- if (events) {
4587
- if (events.findIndex(item => item.listener === listener) === -1)
4588
- events.push(item);
4589
- }
4590
- else {
4591
- map[type] = [item];
4592
- }
4593
- }
4594
- });
4595
- },
4596
- off(type, listener, options) {
4597
- if (type) {
4598
- const typeList = typeof type === 'string' ? type.split(' ') : type;
4599
- if (listener) {
4600
- let capture;
4601
- if (options)
4602
- capture = typeof options === 'boolean' ? options : (options === 'once' ? false : options.capture);
4603
- let events, index;
4604
- const map = __getListenerMap(this, capture);
4605
- typeList.forEach(type => {
4606
- if (type) {
4607
- events = map[type];
4608
- if (events) {
4609
- index = events.findIndex(item => item.listener === listener);
4610
- if (index > -1)
4611
- events.splice(index, 1);
4612
- if (!events.length)
4613
- delete map[type];
4614
- }
4615
- }
4616
- });
4617
- }
4618
- else {
4619
- const { __bubbleMap: b, __captureMap: c } = this;
4620
- typeList.forEach(type => {
4621
- if (b)
4622
- delete b[type];
4623
- if (c)
4624
- delete c[type];
4625
- });
4626
- }
4627
- }
4628
- else {
4629
- this.__bubbleMap = this.__captureMap = undefined;
4630
- }
4631
- },
4632
- on_(type, listener, bind, options) {
4633
- if (bind)
4634
- listener = listener.bind(bind);
4635
- this.on(type, listener, options);
4636
- return { type, current: this, listener, options };
4637
- },
4638
- off_(id) {
4639
- if (!id)
4640
- return;
4641
- const list = id instanceof Array ? id : [id];
4642
- list.forEach(item => item.current.off(item.type, item.listener, item.options));
4643
- list.length = 0;
4644
- },
4645
- once(type, listener, capture) {
4646
- this.on(type, listener, { once: true, capture });
4647
- },
4648
- emit(type, event, capture) {
4649
- if (!event && EventCreator.has(type))
4650
- event = EventCreator.get(type, { type, target: this, current: this });
4651
- const map = __getListenerMap(this, capture);
4652
- const list = map[type];
4653
- if (list) {
4654
- let item;
4655
- for (let i = 0, len = list.length; i < len; i++) {
4656
- item = list[i];
4657
- item.listener(event);
4658
- if (item.once) {
4659
- this.off(type, item.listener, capture);
4660
- i--, len--;
4661
- }
4662
- if (event && event.isStopNow)
4663
- break;
4664
- }
4665
- }
4666
- this.syncEventer && this.syncEventer.emitEvent(event, capture);
4667
- },
4668
- emitEvent(event, capture) {
4669
- event.current = this;
4670
- this.emit(event.type, event, capture);
4671
- },
4672
- hasEvent(type, capture) {
4673
- if (this.syncEventer && this.syncEventer.hasEvent(type, capture))
4674
- return true;
4675
- const { __bubbleMap: b, __captureMap: c } = this;
4676
- const hasB = b && b[type], hasC = c && c[type];
4677
- return !!(capture === undefined ? (hasB || hasC) : (capture ? hasC : hasB));
4678
- },
4679
- };
4680
- function __getListenerMap(eventer, capture, create) {
4681
- if (capture) {
4682
- const { __captureMap: c } = eventer;
4683
- if (c) {
4684
- return c;
4685
- }
4686
- else {
4687
- return create ? eventer.__captureMap = {} : empty;
4688
- }
4689
- }
4690
- else {
4691
- const { __bubbleMap: b } = eventer;
4692
- if (b) {
4693
- return b;
4694
- }
4695
- else {
4696
- return create ? eventer.__bubbleMap = {} : empty;
4697
- }
4698
- }
4699
- }
4700
-
4701
4629
  class Event {
4702
4630
  constructor(type, target) {
4703
4631
  this.bubbles = false;
@@ -4732,7 +4660,10 @@ class ChildEvent extends Event {
4732
4660
  }
4733
4661
  ChildEvent.ADD = 'child.add';
4734
4662
  ChildEvent.REMOVE = 'child.remove';
4735
- ChildEvent.DESTROY = 'child.destroy';
4663
+ ChildEvent.CREATED = 'created';
4664
+ ChildEvent.MOUNTED = 'mounted';
4665
+ ChildEvent.UNMOUNTED = 'unmounted';
4666
+ ChildEvent.DESTROY = 'destroy';
4736
4667
 
4737
4668
  class PropertyEvent extends Event {
4738
4669
  constructor(type, target, attrName, oldValue, newValue) {
@@ -4810,10 +4741,6 @@ LayoutEvent.AFTER = 'layout.after';
4810
4741
  LayoutEvent.AGAIN = 'layout.again';
4811
4742
  LayoutEvent.END = 'layout.end';
4812
4743
 
4813
- class AnimateEvent extends Event {
4814
- }
4815
- AnimateEvent.FRAME = 'animate.frame';
4816
-
4817
4744
  class RenderEvent extends Event {
4818
4745
  constructor(type, times, bounds, options) {
4819
4746
  super(type);
@@ -4846,6 +4773,157 @@ LeaferEvent.STOP = 'leafer.stop';
4846
4773
  LeaferEvent.RESTART = 'leafer.restart';
4847
4774
  LeaferEvent.END = 'leafer.end';
4848
4775
 
4776
+ const empty = {};
4777
+ class Eventer {
4778
+ set event(map) { this.on(map); }
4779
+ on(type, listener, options) {
4780
+ if (!listener) {
4781
+ let event, map = type;
4782
+ for (let key in map)
4783
+ event = map[key], event instanceof Array ? this.on(key, event[0], event[1]) : this.on(key, event);
4784
+ return;
4785
+ }
4786
+ let capture, once;
4787
+ if (options) {
4788
+ if (options === 'once') {
4789
+ once = true;
4790
+ }
4791
+ else if (typeof options === 'boolean') {
4792
+ capture = options;
4793
+ }
4794
+ else {
4795
+ capture = options.capture;
4796
+ once = options.once;
4797
+ }
4798
+ }
4799
+ let events;
4800
+ const map = __getListenerMap(this, capture, true);
4801
+ const typeList = typeof type === 'string' ? type.split(' ') : type;
4802
+ const item = once ? { listener, once } : { listener };
4803
+ typeList.forEach(type => {
4804
+ if (type) {
4805
+ events = map[type];
4806
+ if (events) {
4807
+ if (events.findIndex(item => item.listener === listener) === -1)
4808
+ events.push(item);
4809
+ }
4810
+ else {
4811
+ map[type] = [item];
4812
+ }
4813
+ }
4814
+ });
4815
+ }
4816
+ off(type, listener, options) {
4817
+ if (type) {
4818
+ const typeList = typeof type === 'string' ? type.split(' ') : type;
4819
+ if (listener) {
4820
+ let capture;
4821
+ if (options)
4822
+ capture = typeof options === 'boolean' ? options : (options === 'once' ? false : options.capture);
4823
+ let events, index;
4824
+ const map = __getListenerMap(this, capture);
4825
+ typeList.forEach(type => {
4826
+ if (type) {
4827
+ events = map[type];
4828
+ if (events) {
4829
+ index = events.findIndex(item => item.listener === listener);
4830
+ if (index > -1)
4831
+ events.splice(index, 1);
4832
+ if (!events.length)
4833
+ delete map[type];
4834
+ }
4835
+ }
4836
+ });
4837
+ }
4838
+ else {
4839
+ const { __bubbleMap: b, __captureMap: c } = this;
4840
+ typeList.forEach(type => {
4841
+ if (b)
4842
+ delete b[type];
4843
+ if (c)
4844
+ delete c[type];
4845
+ });
4846
+ }
4847
+ }
4848
+ else {
4849
+ this.__bubbleMap = this.__captureMap = undefined;
4850
+ }
4851
+ }
4852
+ on_(type, listener, bind, options) {
4853
+ if (bind)
4854
+ listener = listener.bind(bind);
4855
+ this.on(type, listener, options);
4856
+ return { type, current: this, listener, options };
4857
+ }
4858
+ off_(id) {
4859
+ if (!id)
4860
+ return;
4861
+ const list = id instanceof Array ? id : [id];
4862
+ list.forEach(item => item.current.off(item.type, item.listener, item.options));
4863
+ list.length = 0;
4864
+ }
4865
+ once(type, listener, capture) {
4866
+ this.on(type, listener, { once: true, capture });
4867
+ }
4868
+ emit(type, event, capture) {
4869
+ if (!event && EventCreator.has(type))
4870
+ event = EventCreator.get(type, { type, target: this, current: this });
4871
+ const map = __getListenerMap(this, capture);
4872
+ const list = map[type];
4873
+ if (list) {
4874
+ let item;
4875
+ for (let i = 0, len = list.length; i < len; i++) {
4876
+ item = list[i];
4877
+ item.listener(event);
4878
+ if (item.once) {
4879
+ this.off(type, item.listener, capture);
4880
+ i--, len--;
4881
+ }
4882
+ if (event && event.isStopNow)
4883
+ break;
4884
+ }
4885
+ }
4886
+ this.syncEventer && this.syncEventer.emitEvent(event, capture);
4887
+ }
4888
+ emitEvent(event, capture) {
4889
+ event.current = this;
4890
+ this.emit(event.type, event, capture);
4891
+ }
4892
+ hasEvent(type, capture) {
4893
+ if (this.syncEventer && this.syncEventer.hasEvent(type, capture))
4894
+ return true;
4895
+ const { __bubbleMap: b, __captureMap: c } = this;
4896
+ const hasB = b && b[type], hasC = c && c[type];
4897
+ return !!(capture === undefined ? (hasB || hasC) : (capture ? hasC : hasB));
4898
+ }
4899
+ destroy() {
4900
+ this.__captureMap = this.__bubbleMap = this.syncEventer = null;
4901
+ }
4902
+ }
4903
+ function __getListenerMap(eventer, capture, create) {
4904
+ if (capture) {
4905
+ const { __captureMap: c } = eventer;
4906
+ if (c) {
4907
+ return c;
4908
+ }
4909
+ else {
4910
+ return create ? eventer.__captureMap = {} : empty;
4911
+ }
4912
+ }
4913
+ else {
4914
+ const { __bubbleMap: b } = eventer;
4915
+ if (b) {
4916
+ return b;
4917
+ }
4918
+ else {
4919
+ return create ? eventer.__bubbleMap = {} : empty;
4920
+ }
4921
+ }
4922
+ }
4923
+
4924
+ const { on, on_, off, off_, once, emit: emit$1, emitEvent, hasEvent, destroy } = Eventer.prototype;
4925
+ const LeafEventer = { on, on_, off, off_, once, emit: emit$1, emitEvent, hasEvent, destroyEventer: destroy };
4926
+
4849
4927
  const { isFinite } = Number;
4850
4928
  const debug$6 = Debug.get('setAttr');
4851
4929
  const LeafDataProxy = {
@@ -4857,9 +4935,7 @@ const LeafDataProxy = {
4857
4935
  newValue = undefined;
4858
4936
  }
4859
4937
  if (typeof newValue === 'object' || oldValue !== newValue) {
4860
- this.__[name] = newValue;
4861
- if (this.__proxyData)
4862
- this.setProxyAttr(name, newValue);
4938
+ this.__realSetAttr(name, newValue);
4863
4939
  const { CHANGE } = PropertyEvent;
4864
4940
  const event = new PropertyEvent(CHANGE, this, name, oldValue, newValue);
4865
4941
  if (this.isLeafer) {
@@ -4877,12 +4953,18 @@ const LeafDataProxy = {
4877
4953
  }
4878
4954
  }
4879
4955
  else {
4880
- this.__[name] = newValue;
4881
- if (this.__proxyData)
4882
- this.setProxyAttr(name, newValue);
4956
+ this.__realSetAttr(name, newValue);
4883
4957
  return true;
4884
4958
  }
4885
4959
  },
4960
+ __realSetAttr(name, newValue) {
4961
+ const data = this.__;
4962
+ data[name] = newValue;
4963
+ if (this.__proxyData)
4964
+ this.setProxyAttr(name, newValue);
4965
+ if (data.normalStyle)
4966
+ this.lockNormalStyle || data.normalStyle[name] === undefined || (data.normalStyle[name] = newValue);
4967
+ },
4886
4968
  __getAttr(name) {
4887
4969
  if (this.__proxyData)
4888
4970
  return this.getProxyAttr(name);
@@ -4918,7 +5000,7 @@ const LeafMatrix = {
4918
5000
 
4919
5001
  const { updateMatrix: updateMatrix$1, updateAllMatrix: updateAllMatrix$2 } = LeafHelper;
4920
5002
  const { updateBounds: updateBounds$1 } = BranchHelper;
4921
- const { toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$1, copy: copy$4 } = BoundsHelper;
5003
+ const { toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$2, copy: copy$4 } = BoundsHelper;
4922
5004
  const { toBounds: toBounds$2 } = PathBounds;
4923
5005
  const LeafBounds = {
4924
5006
  __updateWorldBounds() {
@@ -4985,6 +5067,8 @@ const LeafBounds = {
4985
5067
  layout.boundsChanged = false;
4986
5068
  },
4987
5069
  __updateLocalBoxBounds() {
5070
+ if (this.__hasMotionPath)
5071
+ this.__updateMotionPath();
4988
5072
  if (this.__hasAutoLayout)
4989
5073
  this.__updateAutoLayout();
4990
5074
  toOuterOf$1(this.__layout.boxBounds, this.__local, this.__local);
@@ -5019,7 +5103,7 @@ const LeafBounds = {
5019
5103
  updateAllMatrix$2(this);
5020
5104
  updateBounds$1(this, this);
5021
5105
  if (this.__.__autoSide)
5022
- this.__updateBoxBounds();
5106
+ this.__updateBoxBounds(true);
5023
5107
  }
5024
5108
  else {
5025
5109
  updateAllMatrix$2(this);
@@ -5037,11 +5121,11 @@ const LeafBounds = {
5037
5121
  },
5038
5122
  __updateStrokeBounds() {
5039
5123
  const layout = this.__layout;
5040
- copyAndSpread$1(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5124
+ copyAndSpread$2(layout.strokeBounds, layout.boxBounds, layout.strokeBoxSpread);
5041
5125
  },
5042
5126
  __updateRenderBounds() {
5043
5127
  const layout = this.__layout;
5044
- layout.renderSpread > 0 ? copyAndSpread$1(layout.renderBounds, layout.boxBounds, layout.renderSpread) : copy$4(layout.renderBounds, layout.strokeBounds);
5128
+ layout.renderSpread > 0 ? copyAndSpread$2(layout.renderBounds, layout.boxBounds, layout.renderSpread) : copy$4(layout.renderBounds, layout.strokeBounds);
5045
5129
  }
5046
5130
  };
5047
5131
 
@@ -5137,7 +5221,7 @@ const BranchRender = {
5137
5221
  const { LEAF, create } = IncrementId;
5138
5222
  const { toInnerPoint, toOuterPoint, multiplyParent } = MatrixHelper;
5139
5223
  const { toOuterOf } = BoundsHelper;
5140
- const { copy: copy$3 } = PointHelper;
5224
+ const { copy: copy$3, move } = PointHelper;
5141
5225
  const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getFlipTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
5142
5226
  let Leaf = class Leaf {
5143
5227
  get tag() { return this.__tag; }
@@ -5164,13 +5248,16 @@ let Leaf = class Leaf {
5164
5248
  get __ignoreHitWorld() { return (this.__hasMask || this.__hasEraser) && this.__.hitChildren; }
5165
5249
  get __inLazyBounds() { const { leafer } = this; return leafer && leafer.created && leafer.lazyBounds.hit(this.__world); }
5166
5250
  get pathInputed() { return this.__.__pathInputed; }
5167
- set event(map) { let event; for (let key in map)
5168
- event = map[key], event instanceof Array ? this.on(key, event[0], event[1]) : this.on(key, event); }
5251
+ set event(map) { this.on(map); }
5169
5252
  constructor(data) {
5170
5253
  this.innerId = create(LEAF);
5171
5254
  this.reset(data);
5255
+ if (this.__bubbleMap)
5256
+ this.__emitLifeEvent(ChildEvent.CREATED);
5172
5257
  }
5173
5258
  reset(data) {
5259
+ if (this.leafer)
5260
+ this.leafer.forceRender(this.__world);
5174
5261
  this.__world = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0, scaleX: 1, scaleY: 1 };
5175
5262
  if (data !== null)
5176
5263
  this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
@@ -5192,12 +5279,12 @@ let Leaf = class Leaf {
5192
5279
  waitParent(item, bind) {
5193
5280
  if (bind)
5194
5281
  item = item.bind(bind);
5195
- this.parent ? item() : (this.__parentWait ? this.__parentWait.push(item) : this.__parentWait = [item]);
5282
+ this.parent ? item() : this.on(ChildEvent.ADD, item, 'once');
5196
5283
  }
5197
5284
  waitLeafer(item, bind) {
5198
5285
  if (bind)
5199
5286
  item = item.bind(bind);
5200
- this.leafer ? item() : (this.__leaferWait ? this.__leaferWait.push(item) : this.__leaferWait = [item]);
5287
+ this.leafer ? item() : this.on(ChildEvent.MOUNTED, item, 'once');
5201
5288
  }
5202
5289
  nextRender(item, bind, off) {
5203
5290
  this.leafer ? this.leafer.nextRender(item, bind, off) : this.waitLeafer(() => this.leafer.nextRender(item, bind, off));
@@ -5206,18 +5293,21 @@ let Leaf = class Leaf {
5206
5293
  this.nextRender(item, null, 'off');
5207
5294
  }
5208
5295
  __bindLeafer(leafer) {
5209
- if (this.isLeafer) {
5210
- if (leafer !== null)
5211
- leafer = this;
5212
- }
5296
+ if (this.isLeafer && leafer !== null)
5297
+ leafer = this;
5213
5298
  if (this.leafer && !leafer)
5214
5299
  this.leafer.leafs--;
5215
5300
  this.leafer = leafer;
5216
5301
  if (leafer) {
5217
5302
  leafer.leafs++;
5218
5303
  this.__level = this.parent ? this.parent.__level + 1 : 1;
5219
- if (this.__leaferWait)
5220
- WaitHelper.run(this.__leaferWait);
5304
+ if (this.animation)
5305
+ this.__runAnimation('in');
5306
+ if (this.__bubbleMap)
5307
+ this.__emitLifeEvent(ChildEvent.MOUNTED);
5308
+ }
5309
+ else {
5310
+ this.__emitLifeEvent(ChildEvent.UNMOUNTED);
5221
5311
  }
5222
5312
  if (this.isBranch) {
5223
5313
  const { children } = this;
@@ -5226,7 +5316,7 @@ let Leaf = class Leaf {
5226
5316
  }
5227
5317
  }
5228
5318
  }
5229
- set(_data) { }
5319
+ set(_data, _isTemp) { }
5230
5320
  get(_name) { return undefined; }
5231
5321
  setAttr(name, value) { this[name] = value; }
5232
5322
  getAttr(name) { return this[name]; }
@@ -5251,6 +5341,7 @@ let Leaf = class Leaf {
5251
5341
  findOne(_condition, _options) { return undefined; }
5252
5342
  findId(_id) { return undefined; }
5253
5343
  focus(_value) { }
5344
+ updateState() { }
5254
5345
  updateLayout() {
5255
5346
  this.__layout.update();
5256
5347
  }
@@ -5358,11 +5449,24 @@ let Leaf = class Leaf {
5358
5449
  if (relative)
5359
5450
  relative.worldToInner(to ? to : inner, null, distance);
5360
5451
  }
5452
+ getBoxPoint(world, relative, distance, change) {
5453
+ return this.getBoxPointByInner(this.getInnerPoint(world, relative, distance, change), null, null, true);
5454
+ }
5455
+ getBoxPointByInner(inner, _relative, _distance, change) {
5456
+ const point = change ? inner : Object.assign({}, inner), { x, y } = this.boxBounds;
5457
+ move(point, -x, -y);
5458
+ return point;
5459
+ }
5361
5460
  getInnerPoint(world, relative, distance, change) {
5362
5461
  const point = change ? world : {};
5363
5462
  this.worldToInner(world, point, distance, relative);
5364
5463
  return point;
5365
5464
  }
5465
+ getInnerPointByBox(box, _relative, _distance, change) {
5466
+ const point = change ? box : Object.assign({}, box), { x, y } = this.boxBounds;
5467
+ move(point, x, y);
5468
+ return point;
5469
+ }
5366
5470
  getInnerPointByLocal(local, _relative, distance, change) {
5367
5471
  return this.getInnerPoint(local, this.parent, distance, change);
5368
5472
  }
@@ -5374,20 +5478,23 @@ let Leaf = class Leaf {
5374
5478
  getLocalPointByInner(inner, _relative, distance, change) {
5375
5479
  return this.getWorldPoint(inner, this.parent, distance, change);
5376
5480
  }
5481
+ getPagePoint(world, relative, distance, change) {
5482
+ const layer = this.leafer ? this.leafer.zoomLayer : this;
5483
+ return layer.getInnerPoint(world, relative, distance, change);
5484
+ }
5377
5485
  getWorldPoint(inner, relative, distance, change) {
5378
5486
  const point = change ? inner : {};
5379
5487
  this.innerToWorld(inner, point, distance, relative);
5380
5488
  return point;
5381
5489
  }
5490
+ getWorldPointByBox(box, relative, distance, change) {
5491
+ return this.getWorldPoint(this.getInnerPointByBox(box, null, null, change), relative, distance, true);
5492
+ }
5382
5493
  getWorldPointByLocal(local, relative, distance, change) {
5383
5494
  const point = change ? local : {};
5384
5495
  this.localToWorld(local, point, distance, relative);
5385
5496
  return point;
5386
5497
  }
5387
- getPagePoint(world, relative, distance, change) {
5388
- const layer = this.leafer ? this.leafer.zoomLayer : this;
5389
- return layer.getInnerPoint(world, relative, distance, change);
5390
- }
5391
5498
  getWorldPointByPage(page, relative, distance, change) {
5392
5499
  const layer = this.leafer ? this.leafer.zoomLayer : this;
5393
5500
  return layer.getWorldPoint(page, relative, distance, change);
@@ -5401,6 +5508,9 @@ let Leaf = class Leaf {
5401
5508
  move(x, y) {
5402
5509
  moveLocal(this, x, y);
5403
5510
  }
5511
+ moveInner(x, y) {
5512
+ moveWorld(this, x, y, true);
5513
+ }
5404
5514
  scaleOf(origin, scaleX, scaleY, resize) {
5405
5515
  zoomOfLocal(this, getLocalOrigin(this, origin), scaleX, scaleY, resize);
5406
5516
  }
@@ -5453,6 +5563,17 @@ let Leaf = class Leaf {
5453
5563
  __drawRenderPath(_canvas) { }
5454
5564
  __updatePath() { }
5455
5565
  __updateRenderPath() { }
5566
+ getMotionPathData() {
5567
+ return needPlugin('path');
5568
+ }
5569
+ getMotionPoint(_motionDistance) {
5570
+ return needPlugin('path');
5571
+ }
5572
+ getMotionTotal() {
5573
+ return 0;
5574
+ }
5575
+ __updateMotionPath() { }
5576
+ __runAnimation(_type, _complete) { }
5456
5577
  __updateSortChildren() { }
5457
5578
  add(_child, _index) { }
5458
5579
  remove(_child, destroy) {
@@ -5478,6 +5599,10 @@ let Leaf = class Leaf {
5478
5599
  fn = boundsType;
5479
5600
  fn(defaultValue)(this.prototype, attrName);
5480
5601
  }
5602
+ __emitLifeEvent(type) {
5603
+ if (this.hasEvent(type))
5604
+ this.emitEvent(new ChildEvent(type, this, this.parent));
5605
+ }
5481
5606
  destroy() {
5482
5607
  if (!this.destroyed) {
5483
5608
  const { parent } = this;
@@ -5485,11 +5610,10 @@ let Leaf = class Leaf {
5485
5610
  this.remove();
5486
5611
  if (this.children)
5487
5612
  this.removeAll(true);
5488
- if (this.hasEvent(ChildEvent.DESTROY))
5489
- this.emitEvent(new ChildEvent(ChildEvent.DESTROY, this, parent));
5613
+ this.__emitLifeEvent(ChildEvent.DESTROY);
5490
5614
  this.__.destroy();
5491
5615
  this.__layout.destroy();
5492
- this.__captureMap = this.__bubbleMap = this.__parentWait = this.__leaferWait = null;
5616
+ this.destroyEventer();
5493
5617
  this.destroyed = true;
5494
5618
  }
5495
5619
  }
@@ -5555,8 +5679,8 @@ let Branch = class Branch extends Leaf {
5555
5679
  this.__.__childBranchNumber = (this.__.__childBranchNumber || 0) + 1;
5556
5680
  child.__layout.boxChanged || child.__layout.boxChange();
5557
5681
  child.__layout.matrixChanged || child.__layout.matrixChange();
5558
- if (child.__parentWait)
5559
- WaitHelper.run(child.__parentWait);
5682
+ if (child.__bubbleMap)
5683
+ child.__emitLifeEvent(ChildEvent.ADD);
5560
5684
  if (this.leafer) {
5561
5685
  child.__bindLeafer(this.leafer);
5562
5686
  if (this.leafer.created)
@@ -5569,16 +5693,10 @@ let Branch = class Branch extends Leaf {
5569
5693
  }
5570
5694
  remove(child, destroy) {
5571
5695
  if (child) {
5572
- const index = this.children.indexOf(child);
5573
- if (index > -1) {
5574
- this.children.splice(index, 1);
5575
- if (child.isBranch)
5576
- this.__.__childBranchNumber = (this.__.__childBranchNumber || 1) - 1;
5577
- this.__preRemove();
5578
- this.__realRemoveChild(child);
5579
- if (destroy)
5580
- child.destroy();
5581
- }
5696
+ if (child.animationOut)
5697
+ child.__runAnimation('out', () => this.__remove(child, destroy));
5698
+ else
5699
+ this.__remove(child, destroy);
5582
5700
  }
5583
5701
  else if (child === undefined) {
5584
5702
  super.remove(null, destroy);
@@ -5600,6 +5718,18 @@ let Branch = class Branch extends Leaf {
5600
5718
  clear() {
5601
5719
  this.removeAll(true);
5602
5720
  }
5721
+ __remove(child, destroy) {
5722
+ const index = this.children.indexOf(child);
5723
+ if (index > -1) {
5724
+ this.children.splice(index, 1);
5725
+ if (child.isBranch)
5726
+ this.__.__childBranchNumber = (this.__.__childBranchNumber || 1) - 1;
5727
+ this.__preRemove();
5728
+ this.__realRemoveChild(child);
5729
+ if (destroy)
5730
+ child.destroy();
5731
+ }
5732
+ }
5603
5733
  __preRemove() {
5604
5734
  if (this.__hasMask)
5605
5735
  this.__updateMask();
@@ -5609,6 +5739,7 @@ let Branch = class Branch extends Leaf {
5609
5739
  this.__layout.affectChildrenSort && this.__layout.childrenSortChange();
5610
5740
  }
5611
5741
  __realRemoveChild(child) {
5742
+ child.__emitLifeEvent(ChildEvent.REMOVE);
5612
5743
  child.parent = null;
5613
5744
  if (this.leafer) {
5614
5745
  child.__bindLeafer(null);
@@ -5621,8 +5752,6 @@ let Branch = class Branch extends Leaf {
5621
5752
  }
5622
5753
  __emitChildEvent(type, child) {
5623
5754
  const event = new ChildEvent(type, child, this);
5624
- if (child.hasEvent(type))
5625
- child.emitEvent(event);
5626
5755
  if (this.hasEvent(type) && !this.isLeafer)
5627
5756
  this.emitEvent(event);
5628
5757
  this.leafer.emitEvent(event);
@@ -5785,8 +5914,7 @@ class LeafLevelList {
5785
5914
  }
5786
5915
  }
5787
5916
 
5788
- const version = "1.0.1";
5789
- const inviteCode = {};
5917
+ const version = "1.0.3";
5790
5918
 
5791
5919
  const debug$5 = Debug.get('LeaferCanvas');
5792
5920
  class LeaferCanvas extends LeaferCanvasBase {
@@ -6186,9 +6314,13 @@ function updateBounds(boundsList) {
6186
6314
  });
6187
6315
  }
6188
6316
  function updateChange(updateList) {
6317
+ let layout;
6189
6318
  updateList.list.forEach(leaf => {
6190
- if (leaf.__layout.opacityChanged)
6319
+ layout = leaf.__layout;
6320
+ if (layout.opacityChanged)
6191
6321
  updateAllWorldOpacity(leaf);
6322
+ if (layout.stateStyleChanged)
6323
+ setTimeout(() => layout.stateStyleChanged && leaf.updateState());
6192
6324
  leaf.__updateChange();
6193
6325
  });
6194
6326
  }
@@ -6554,7 +6686,6 @@ class Renderer {
6554
6686
  Platform.requestRender(() => {
6555
6687
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - startTime)));
6556
6688
  if (this.running) {
6557
- this.target.emit(AnimateEvent.FRAME);
6558
6689
  if (this.changed && this.canvas.view)
6559
6690
  this.render();
6560
6691
  this.target.emit(RenderEvent.NEXT);
@@ -6628,36 +6759,6 @@ Object.assign(Creator, {
6628
6759
  });
6629
6760
  Platform.layout = Layouter.fullLayout;
6630
6761
 
6631
- const TextConvert = {};
6632
- const ColorConvert = {};
6633
- const PathArrow = {};
6634
- const Paint = {};
6635
- const PaintImage = {};
6636
- const PaintGradient = {};
6637
- const Effect = {};
6638
- const Export = {};
6639
- const State = {};
6640
-
6641
- function stateType(defaultValue) {
6642
- return decorateLeafAttr(defaultValue, (key) => attr({
6643
- set(value) {
6644
- this.__setAttr(key, value);
6645
- this.waitLeafer(() => { if (State.setStyle)
6646
- State.setStyle(this, key + 'Style', value); });
6647
- }
6648
- }));
6649
- }
6650
- function arrowType(defaultValue) {
6651
- return decorateLeafAttr(defaultValue, (key) => attr({
6652
- set(value) {
6653
- if (this.__setAttr(key, value)) {
6654
- const data = this.__;
6655
- data.__useArrow = data.startArrow !== 'none' || data.endArrow !== 'none';
6656
- doStrokeType(this);
6657
- }
6658
- }
6659
- }));
6660
- }
6661
6762
  function effectType(defaultValue) {
6662
6763
  return decorateLeafAttr(defaultValue, (key) => attr({
6663
6764
  set(value) {
@@ -6692,10 +6793,33 @@ function zoomLayerType() {
6692
6793
  };
6693
6794
  }
6694
6795
 
6796
+ const TextConvert = {};
6797
+ const ColorConvert = {};
6798
+ const PathArrow = {};
6799
+ const Paint = {};
6800
+ const PaintImage = {};
6801
+ const PaintGradient = {};
6802
+ const Effect = {};
6803
+ const Export = {};
6804
+ const State = {
6805
+ setStyleName(_leaf, _styleName, _value) { return needPlugin('state'); },
6806
+ set(_leaf, _stateName) { return needPlugin('state'); }
6807
+ };
6808
+ const Transition = {
6809
+ list: {},
6810
+ register(attrName, fn) {
6811
+ Transition.list[attrName] = fn;
6812
+ },
6813
+ get(attrName) {
6814
+ return Transition.list[attrName];
6815
+ }
6816
+ };
6817
+
6695
6818
  const { parse } = PathConvert;
6696
6819
  const emptyPaint = {};
6697
6820
  const debug$2 = Debug.get('UIData');
6698
6821
  class UIData extends LeafData {
6822
+ get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
6699
6823
  get __strokeWidth() {
6700
6824
  const { strokeWidth, strokeWidthFixed } = this;
6701
6825
  if (strokeWidthFixed) {
@@ -6714,9 +6838,10 @@ class UIData extends LeafData {
6714
6838
  get __autoSide() { return !this._width || !this._height; }
6715
6839
  get __autoSize() { return !this._width && !this._height; }
6716
6840
  setVisible(value) {
6717
- if (this.__leaf.leafer)
6718
- this.__leaf.leafer.watcher.hasVisible = true;
6719
6841
  this._visible = value;
6842
+ const { leafer } = this.__leaf;
6843
+ if (leafer)
6844
+ leafer.watcher.hasVisible = true;
6720
6845
  }
6721
6846
  setWidth(value) {
6722
6847
  if (value < 0) {
@@ -6840,6 +6965,11 @@ class BoxData extends GroupData {
6840
6965
  }
6841
6966
 
6842
6967
  class LeaferData extends GroupData {
6968
+ __getInputData() {
6969
+ const data = super.__getInputData();
6970
+ canvasSizeAttrs.forEach(key => delete data[key]);
6971
+ return data;
6972
+ }
6843
6973
  }
6844
6974
 
6845
6975
  class FrameData extends BoxData {
@@ -6902,7 +7032,7 @@ class ImageData extends RectData {
6902
7032
  __setImageFill(value) {
6903
7033
  if (this.__leaf.image)
6904
7034
  this.__leaf.image = null;
6905
- this.fill = value ? { type: 'image', mode: 'strench', url: value } : undefined;
7035
+ this.fill = value ? { type: 'image', mode: 'stretch', url: value } : undefined;
6906
7036
  }
6907
7037
  __getData() {
6908
7038
  const data = super.__getData();
@@ -6917,6 +7047,11 @@ class ImageData extends RectData {
6917
7047
  }
6918
7048
 
6919
7049
  class CanvasData extends RectData {
7050
+ __getInputData() {
7051
+ const data = super.__getInputData();
7052
+ data.url = this.__leaf.canvas.toDataURL('image/png');
7053
+ return data;
7054
+ }
6920
7055
  }
6921
7056
 
6922
7057
  const UIBounds = {
@@ -7087,19 +7222,8 @@ var UI_1;
7087
7222
  let UI = UI_1 = class UI extends Leaf {
7088
7223
  get app() { return this.leafer && this.leafer.app; }
7089
7224
  get isFrame() { return false; }
7090
- set scale(value) {
7091
- if (typeof value === 'number') {
7092
- this.scaleX = this.scaleY = value;
7093
- }
7094
- else {
7095
- this.scaleX = value.x;
7096
- this.scaleY = value.y;
7097
- }
7098
- }
7099
- get scale() {
7100
- const { scaleX, scaleY } = this;
7101
- return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX;
7102
- }
7225
+ set scale(value) { MathHelper.assignScale(this, value); }
7226
+ get scale() { return this.__.scale; }
7103
7227
  get pen() {
7104
7228
  const { path } = this.__;
7105
7229
  pen.set(this.path = path || []);
@@ -7114,8 +7238,15 @@ let UI = UI_1 = class UI extends Leaf {
7114
7238
  super(data);
7115
7239
  }
7116
7240
  reset(_data) { }
7117
- set(data) {
7118
- Object.assign(this, data);
7241
+ set(data, isTemp) {
7242
+ if (isTemp) {
7243
+ this.lockNormalStyle = true;
7244
+ Object.assign(this, data);
7245
+ this.lockNormalStyle = false;
7246
+ }
7247
+ else {
7248
+ Object.assign(this, data);
7249
+ }
7119
7250
  }
7120
7251
  get(name) {
7121
7252
  return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -7178,11 +7309,18 @@ let UI = UI_1 = class UI extends Leaf {
7178
7309
  drawer.rect(x, y, width, height);
7179
7310
  }
7180
7311
  }
7312
+ animate(_keyframe, _options, _type, _isTemp) {
7313
+ return needPlugin('animate');
7314
+ }
7315
+ killAnimate(_type) { }
7181
7316
  export(filename, options) {
7182
7317
  return Export.export(this, filename, options);
7183
7318
  }
7184
- clone() {
7185
- return UI_1.one(this.toJSON());
7319
+ clone(newData) {
7320
+ const json = this.toJSON();
7321
+ if (newData)
7322
+ Object.assign(json, newData);
7323
+ return UI_1.one(json);
7186
7324
  }
7187
7325
  static one(data, x, y, width, height) {
7188
7326
  return UICreator.get(data.tag || this.prototype.__tag, data, x, y, width, height);
@@ -7198,6 +7336,8 @@ let UI = UI_1 = class UI extends Leaf {
7198
7336
  static setEditInner(_editorName) { }
7199
7337
  destroy() {
7200
7338
  this.fill = this.stroke = null;
7339
+ if (this.__animate)
7340
+ this.killAnimate();
7201
7341
  super.destroy();
7202
7342
  }
7203
7343
  };
@@ -7225,12 +7365,6 @@ __decorate([
7225
7365
  __decorate([
7226
7366
  visibleType(true)
7227
7367
  ], UI.prototype, "visible", void 0);
7228
- __decorate([
7229
- stateType(false)
7230
- ], UI.prototype, "selected", void 0);
7231
- __decorate([
7232
- stateType(false)
7233
- ], UI.prototype, "disabled", void 0);
7234
7368
  __decorate([
7235
7369
  surfaceType(false)
7236
7370
  ], UI.prototype, "locked", void 0);
@@ -7303,45 +7437,9 @@ __decorate([
7303
7437
  __decorate([
7304
7438
  pathType(true)
7305
7439
  ], UI.prototype, "closed", void 0);
7306
- __decorate([
7307
- autoLayoutType(false)
7308
- ], UI.prototype, "flow", void 0);
7309
7440
  __decorate([
7310
7441
  boundsType(0)
7311
7442
  ], UI.prototype, "padding", void 0);
7312
- __decorate([
7313
- boundsType(0)
7314
- ], UI.prototype, "gap", void 0);
7315
- __decorate([
7316
- boundsType('top-left')
7317
- ], UI.prototype, "flowAlign", void 0);
7318
- __decorate([
7319
- boundsType(false)
7320
- ], UI.prototype, "flowWrap", void 0);
7321
- __decorate([
7322
- boundsType('box')
7323
- ], UI.prototype, "itemBox", void 0);
7324
- __decorate([
7325
- boundsType(true)
7326
- ], UI.prototype, "inFlow", void 0);
7327
- __decorate([
7328
- boundsType()
7329
- ], UI.prototype, "autoWidth", void 0);
7330
- __decorate([
7331
- boundsType()
7332
- ], UI.prototype, "autoHeight", void 0);
7333
- __decorate([
7334
- boundsType()
7335
- ], UI.prototype, "lockRatio", void 0);
7336
- __decorate([
7337
- boundsType()
7338
- ], UI.prototype, "autoBox", void 0);
7339
- __decorate([
7340
- boundsType()
7341
- ], UI.prototype, "widthRange", void 0);
7342
- __decorate([
7343
- boundsType()
7344
- ], UI.prototype, "heightRange", void 0);
7345
7443
  __decorate([
7346
7444
  dataType(false)
7347
7445
  ], UI.prototype, "draggable", void 0);
@@ -7405,12 +7503,6 @@ __decorate([
7405
7503
  __decorate([
7406
7504
  strokeType(10)
7407
7505
  ], UI.prototype, "miterLimit", void 0);
7408
- __decorate([
7409
- arrowType('none')
7410
- ], UI.prototype, "startArrow", void 0);
7411
- __decorate([
7412
- arrowType('none')
7413
- ], UI.prototype, "endArrow", void 0);
7414
7506
  __decorate([
7415
7507
  pathType(0)
7416
7508
  ], UI.prototype, "cornerRadius", void 0);
@@ -7432,24 +7524,6 @@ __decorate([
7432
7524
  __decorate([
7433
7525
  effectType()
7434
7526
  ], UI.prototype, "grayscale", void 0);
7435
- __decorate([
7436
- dataType()
7437
- ], UI.prototype, "normalStyle", void 0);
7438
- __decorate([
7439
- dataType()
7440
- ], UI.prototype, "hoverStyle", void 0);
7441
- __decorate([
7442
- dataType()
7443
- ], UI.prototype, "pressStyle", void 0);
7444
- __decorate([
7445
- dataType()
7446
- ], UI.prototype, "focusStyle", void 0);
7447
- __decorate([
7448
- dataType()
7449
- ], UI.prototype, "selectedStyle", void 0);
7450
- __decorate([
7451
- dataType()
7452
- ], UI.prototype, "disabledStyle", void 0);
7453
7527
  __decorate([
7454
7528
  dataType({})
7455
7529
  ], UI.prototype, "data", void 0);
@@ -7476,7 +7550,7 @@ let Group = class Group extends UI {
7476
7550
  if (!this.children)
7477
7551
  this.children = [];
7478
7552
  }
7479
- set(data) {
7553
+ set(data, isTemp) {
7480
7554
  if (data.children) {
7481
7555
  const { children } = data;
7482
7556
  delete data.children;
@@ -7486,7 +7560,7 @@ let Group = class Group extends UI {
7486
7560
  else {
7487
7561
  this.clear();
7488
7562
  }
7489
- super.set(data);
7563
+ super.set(data, isTemp);
7490
7564
  let child;
7491
7565
  children.forEach(childData => {
7492
7566
  child = childData.__ ? childData : UICreator.get(childData.tag, childData);
@@ -7495,7 +7569,7 @@ let Group = class Group extends UI {
7495
7569
  data.children = children;
7496
7570
  }
7497
7571
  else {
7498
- super.set(data);
7572
+ super.set(data, isTemp);
7499
7573
  }
7500
7574
  }
7501
7575
  toJSON(options) {
@@ -7822,13 +7896,20 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7822
7896
  }
7823
7897
  }
7824
7898
  zoom(_zoomType, _padding, _fixedScale) {
7825
- return debug$1.error('need @leafer-in/view');
7899
+ return needPlugin('view');
7826
7900
  }
7827
7901
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
7828
7902
  getValidScale(changeScale) { return changeScale; }
7829
7903
  getWorldPointByClient(clientPoint, updateClient) {
7830
7904
  return this.interaction && this.interaction.getLocal(clientPoint, updateClient);
7831
7905
  }
7906
+ getPagePointByClient(clientPoint, updateClient) {
7907
+ return this.getPagePoint(this.getWorldPointByClient(clientPoint, updateClient));
7908
+ }
7909
+ updateClientBounds() {
7910
+ this.canvas && this.canvas.updateClientBounds();
7911
+ }
7912
+ receiveEvent(_event) { }
7832
7913
  __checkUpdateLayout() {
7833
7914
  this.__layout.update();
7834
7915
  }
@@ -7912,7 +7993,7 @@ Rect = __decorate([
7912
7993
  const rect = Rect.prototype;
7913
7994
  const group = Group.prototype;
7914
7995
  const childrenRenderBounds = {};
7915
- const { copy: copy$2, add, includes: includes$1 } = BoundsHelper;
7996
+ const { copy: copy$2, add, includes: includes$1, copyAndSpread: copyAndSpread$1 } = BoundsHelper;
7916
7997
  let Box = class Box extends Group {
7917
7998
  get __tag() { return 'Box'; }
7918
7999
  get isBranchLeaf() { return true; }
@@ -7926,20 +8007,23 @@ let Box = class Box extends Group {
7926
8007
  return this.__updateRectRenderSpread() || -1;
7927
8008
  }
7928
8009
  __updateRectBoxBounds() { }
7929
- __updateBoxBounds() {
8010
+ __updateBoxBounds(secondLayout) {
7930
8011
  const data = this.__;
7931
8012
  if (this.children.length) {
7932
8013
  if (data.__autoSide) {
7933
8014
  if (this.leafer && this.leafer.ready)
7934
8015
  this.leafer.layouter.addExtra(this);
7935
8016
  super.__updateBoxBounds();
8017
+ const { boxBounds } = this.__layout;
7936
8018
  if (!data.__autoSize) {
7937
- const b = this.__layout.boxBounds;
7938
- if (!data.__autoWidth)
7939
- b.height += b.y, b.width = data.width, b.x = b.y = 0;
7940
- if (!data.__autoHeight)
7941
- b.width += b.x, b.height = data.height, b.y = b.x = 0;
8019
+ if (data.__autoWidth)
8020
+ boxBounds.width += boxBounds.x, boxBounds.height = data.height, boxBounds.y = boxBounds.x = 0;
8021
+ else
8022
+ boxBounds.height += boxBounds.y, boxBounds.width = data.width, boxBounds.x = boxBounds.y = 0;
7942
8023
  }
8024
+ if (secondLayout && data.flow && data.padding)
8025
+ copyAndSpread$1(boxBounds, boxBounds, data.padding, false, data.__autoSize ? null : (data.__autoWidth ? 'width' : 'height'));
8026
+ this.__updateNaturalSize();
7943
8027
  }
7944
8028
  else {
7945
8029
  this.__updateRectBoxBounds();
@@ -7959,13 +8043,13 @@ let Box = class Box extends Group {
7959
8043
  super.__updateRenderBounds();
7960
8044
  copy$2(childrenRenderBounds, renderBounds);
7961
8045
  this.__updateRectRenderBounds();
7962
- isOverflow = !includes$1(renderBounds, childrenRenderBounds) || undefined;
8046
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds) || !this.pathInputed || !this.__.cornerRadius;
7963
8047
  }
7964
8048
  else {
7965
8049
  this.__updateRectRenderBounds();
7966
8050
  }
7967
8051
  this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
7968
- if (isOverflow && !(this.__.__drawAfterFill = this.__.overflow === 'hide'))
8052
+ if (!(this.__.__drawAfterFill = this.__.overflow === 'hide') && isOverflow)
7969
8053
  add(renderBounds, childrenRenderBounds);
7970
8054
  }
7971
8055
  __updateRectRenderBounds() { }
@@ -8299,14 +8383,26 @@ __decorate([
8299
8383
  Image$1 = __decorate([
8300
8384
  registerUI()
8301
8385
  ], Image$1);
8386
+ const MyImage = Image$1;
8302
8387
 
8303
8388
  let Canvas = class Canvas extends Rect {
8304
8389
  get __tag() { return 'Canvas'; }
8390
+ get ready() { return !this.url; }
8305
8391
  constructor(data) {
8306
8392
  super(data);
8307
8393
  this.canvas = Creator.canvas(this.__);
8308
8394
  this.context = this.canvas.context;
8309
8395
  this.__.__isCanvas = this.__.__drawAfterFill = true;
8396
+ if (data && data.url)
8397
+ this.drawImage(data.url);
8398
+ }
8399
+ drawImage(url) {
8400
+ new LeaferImage({ url }).load((image) => {
8401
+ this.context.drawImage(image.view, 0, 0);
8402
+ this.url = undefined;
8403
+ this.paint();
8404
+ this.emitEvent(new ImageEvent(ImageEvent.LOADED, { image }));
8405
+ });
8310
8406
  }
8311
8407
  draw(ui, offset, scale, rotation) {
8312
8408
  ui.__layout.update();
@@ -8323,19 +8419,18 @@ let Canvas = class Canvas extends Rect {
8323
8419
  this.paint();
8324
8420
  }
8325
8421
  paint() {
8326
- this.forceUpdate('fill');
8422
+ this.forceRender();
8327
8423
  }
8328
8424
  __drawAfterFill(canvas, _options) {
8329
- const origin = this.canvas.view;
8330
- const { width, height } = this;
8331
- if (this.__.cornerRadius || this.pathInputed) {
8425
+ const { width, height, cornerRadius } = this.__, { view } = this.canvas;
8426
+ if (cornerRadius || this.pathInputed) {
8332
8427
  canvas.save();
8333
8428
  canvas.clip();
8334
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8429
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8335
8430
  canvas.restore();
8336
8431
  }
8337
8432
  else {
8338
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8433
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8339
8434
  }
8340
8435
  }
8341
8436
  __updateSize() {
@@ -8365,7 +8460,7 @@ __decorate([
8365
8460
  resizeType(100)
8366
8461
  ], Canvas.prototype, "height", void 0);
8367
8462
  __decorate([
8368
- resizeType(Platform.devicePixelRatio)
8463
+ resizeType(1)
8369
8464
  ], Canvas.prototype, "pixelRatio", void 0);
8370
8465
  __decorate([
8371
8466
  resizeType(true)
@@ -8389,13 +8484,13 @@ let Text = class Text extends UI {
8389
8484
  super(data);
8390
8485
  }
8391
8486
  __drawHitPath(canvas) {
8392
- const { __lineHeight, __baseLine, __textDrawData: data } = this.__;
8487
+ const { __lineHeight, fontSize, __baseLine, __textDrawData: data } = this.__;
8393
8488
  canvas.beginPath();
8394
8489
  if (this.__.__letterSpacing < 0) {
8395
8490
  this.__drawPathByData(canvas);
8396
8491
  }
8397
8492
  else {
8398
- data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight));
8493
+ data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
8399
8494
  }
8400
8495
  }
8401
8496
  __drawPathByData(drawer, _data) {
@@ -8588,7 +8683,8 @@ let Pen = class Pen extends Group {
8588
8683
  drawPoints(_points, _curve, _close) { return this; }
8589
8684
  clearPath() { return this; }
8590
8685
  paint() {
8591
- this.pathElement.forceUpdate('path');
8686
+ if (!this.pathElement.__layout.boxChanged)
8687
+ this.pathElement.forceUpdate('path');
8592
8688
  }
8593
8689
  };
8594
8690
  __decorate([
@@ -8598,7 +8694,7 @@ __decorate([
8598
8694
  penPathType()
8599
8695
  ], Pen.prototype, "path", void 0);
8600
8696
  Pen = __decorate([
8601
- useModule(PathCreator, ['set', 'beginPath', 'path']),
8697
+ useModule(PathCreator, ['set', 'beginPath', 'path', 'paint']),
8602
8698
  registerUI()
8603
8699
  ], Pen);
8604
8700
  function penPathType() {
@@ -8960,16 +9056,21 @@ function repeatMode(data, box, width, height, x, y, scaleX, scaleY, rotation, al
8960
9056
  const { get: get$2, translate } = MatrixHelper;
8961
9057
  const tempBox = new Bounds();
8962
9058
  const tempPoint = {};
9059
+ const tempScaleData = {};
8963
9060
  function createData(leafPaint, image, paint, box) {
8964
- const { blendMode } = paint;
9061
+ const { blendMode, sync } = paint;
8965
9062
  if (blendMode)
8966
9063
  leafPaint.blendMode = blendMode;
9064
+ if (sync)
9065
+ leafPaint.sync = sync;
8967
9066
  leafPaint.data = getPatternData(paint, box, image);
8968
9067
  }
8969
9068
  function getPatternData(paint, box, image) {
8970
9069
  let { width, height } = image;
8971
9070
  if (paint.padding)
8972
9071
  box = tempBox.set(box).shrink(paint.padding);
9072
+ if (paint.mode === 'strench')
9073
+ paint.mode = 'stretch';
8973
9074
  const { opacity, mode, align, offset, scale, size, rotation, repeat } = paint;
8974
9075
  const sameBox = box.width === width && box.height === height;
8975
9076
  const data = { mode };
@@ -8983,13 +9084,10 @@ function getPatternData(paint, box, image) {
8983
9084
  x += (box.width - width * scaleX) / 2, y += (box.height - height * scaleY) / 2;
8984
9085
  }
8985
9086
  }
8986
- else if (size) {
8987
- scaleX = (typeof size === 'number' ? size : size.width) / width;
8988
- scaleY = (typeof size === 'number' ? size : size.height) / height;
8989
- }
8990
- else if (scale) {
8991
- scaleX = typeof scale === 'number' ? scale : scale.x;
8992
- scaleY = typeof scale === 'number' ? scale : scale.y;
9087
+ else if (scale || size) {
9088
+ MathHelper.getScaleData(scale, size, image, tempScaleData);
9089
+ scaleX = tempScaleData.scaleX;
9090
+ scaleY = tempScaleData.scaleY;
8993
9091
  }
8994
9092
  if (align) {
8995
9093
  const imageBounds = { x, y, width: swapWidth, height: swapHeight };
@@ -9001,7 +9099,7 @@ function getPatternData(paint, box, image) {
9001
9099
  if (offset)
9002
9100
  x += offset.x, y += offset.y;
9003
9101
  switch (mode) {
9004
- case 'strench':
9102
+ case 'stretch':
9005
9103
  if (!sameBox)
9006
9104
  width = box.width, height = box.height;
9007
9105
  break;
@@ -9028,7 +9126,7 @@ function getPatternData(paint, box, image) {
9028
9126
  translate(data.transform, box.x, box.y);
9029
9127
  }
9030
9128
  }
9031
- if (scaleX && mode !== 'strench') {
9129
+ if (scaleX && mode !== 'stretch') {
9032
9130
  data.scaleX = scaleX;
9033
9131
  data.scaleY = scaleY;
9034
9132
  }
@@ -9132,7 +9230,7 @@ const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
9132
9230
  const { ceil, abs: abs$1 } = Math;
9133
9231
  function createPattern(ui, paint, pixelRatio) {
9134
9232
  let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9135
- const id = scaleX + '-' + scaleY;
9233
+ const id = scaleX + '-' + scaleY + '-' + pixelRatio;
9136
9234
  if (paint.patternId !== id && !ui.destroyed) {
9137
9235
  scaleX = abs$1(scaleX);
9138
9236
  scaleY = abs$1(scaleY);
@@ -9194,7 +9292,8 @@ function createPattern(ui, paint, pixelRatio) {
9194
9292
  const { abs } = Math;
9195
9293
  function checkImage(ui, canvas, paint, allowPaint) {
9196
9294
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9197
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY && !Export.running)) {
9295
+ const { pixelRatio } = canvas;
9296
+ if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9198
9297
  return false;
9199
9298
  }
9200
9299
  else {
@@ -9202,8 +9301,8 @@ function checkImage(ui, canvas, paint, allowPaint) {
9202
9301
  if (allowPaint) {
9203
9302
  if (!data.repeat) {
9204
9303
  let { width, height } = data;
9205
- width *= abs(scaleX) * canvas.pixelRatio;
9206
- height *= abs(scaleY) * canvas.pixelRatio;
9304
+ width *= abs(scaleX) * pixelRatio;
9305
+ height *= abs(scaleY) * pixelRatio;
9207
9306
  if (data.scaleX) {
9208
9307
  width *= data.scaleX;
9209
9308
  height *= data.scaleY;
@@ -9228,15 +9327,15 @@ function checkImage(ui, canvas, paint, allowPaint) {
9228
9327
  return true;
9229
9328
  }
9230
9329
  else {
9231
- if (!paint.style || Export.running) {
9232
- createPattern(ui, paint, canvas.pixelRatio);
9330
+ if (!paint.style || paint.sync || Export.running) {
9331
+ createPattern(ui, paint, pixelRatio);
9233
9332
  }
9234
9333
  else {
9235
9334
  if (!paint.patternTask) {
9236
9335
  paint.patternTask = ImageManager.patternTasker.add(() => __awaiter(this, void 0, void 0, function* () {
9237
9336
  paint.patternTask = null;
9238
9337
  if (canvas.bounds.hit(ui.__nowWorld))
9239
- createPattern(ui, paint, canvas.pixelRatio);
9338
+ createPattern(ui, paint, pixelRatio);
9240
9339
  ui.forceUpdate('surface');
9241
9340
  }), 300);
9242
9341
  }
@@ -9300,14 +9399,16 @@ function linearGradient(paint, box) {
9300
9399
  return data;
9301
9400
  }
9302
9401
  function applyStops(gradient, stops, opacity) {
9303
- let stop;
9304
- for (let i = 0, len = stops.length; i < len; i++) {
9305
- stop = stops[i];
9306
- if (typeof stop === 'string') {
9307
- gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
9308
- }
9309
- else {
9310
- gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
9402
+ if (stops) {
9403
+ let stop;
9404
+ for (let i = 0, len = stops.length; i < len; i++) {
9405
+ stop = stops[i];
9406
+ if (typeof stop === 'string') {
9407
+ gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
9408
+ }
9409
+ else {
9410
+ gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
9411
+ }
9311
9412
  }
9312
9413
  }
9313
9414
  }
@@ -10063,10 +10164,15 @@ const TextConvertModule = {
10063
10164
  };
10064
10165
 
10065
10166
  function string(color, opacity) {
10066
- if (typeof color === 'string')
10067
- return color;
10167
+ const doOpacity = typeof opacity === 'number' && opacity !== 1;
10168
+ if (typeof color === 'string') {
10169
+ if (doOpacity && ColorConvert.object)
10170
+ color = ColorConvert.object(color);
10171
+ else
10172
+ return color;
10173
+ }
10068
10174
  let a = color.a === undefined ? 1 : color.a;
10069
- if (opacity)
10175
+ if (doOpacity)
10070
10176
  a *= opacity;
10071
10177
  const rgb = color.r + ',' + color.g + ',' + color.b;
10072
10178
  return a === 1 ? 'rgb(' + rgb + ')' : 'rgba(' + rgb + ',' + a + ')';
@@ -10098,6 +10204,7 @@ const ExportModule = {
10098
10204
  export(leaf, filename, options) {
10099
10205
  this.running = true;
10100
10206
  const fileType = FileHelper.fileType(filename);
10207
+ const isDownload = filename.includes('.');
10101
10208
  options = FileHelper.getExportOptions(options);
10102
10209
  return addTask((success) => new Promise((resolve) => {
10103
10210
  const over = (result) => {
@@ -10107,19 +10214,13 @@ const ExportModule = {
10107
10214
  };
10108
10215
  const { toURL } = Platform;
10109
10216
  const { download } = Platform.origin;
10110
- if (filename === 'json') {
10111
- return over({ data: leaf.toJSON(options.json) });
10217
+ if (fileType === 'json') {
10218
+ isDownload && download(toURL(JSON.stringify(leaf.toJSON(options.json)), 'text'), filename);
10219
+ return over({ data: isDownload ? true : leaf.toJSON(options.json) });
10112
10220
  }
10113
- else if (fileType === 'json') {
10114
- download(toURL(JSON.stringify(leaf.toJSON(options.json)), 'text'), filename);
10115
- return over({ data: true });
10116
- }
10117
- if (filename === 'svg') {
10118
- return over({ data: leaf.toSVG() });
10119
- }
10120
- else if (fileType === 'svg') {
10121
- download(toURL(leaf.toSVG(), 'svg'), filename);
10122
- return over({ data: true });
10221
+ if (fileType === 'svg') {
10222
+ isDownload && download(toURL(leaf.toSVG(), 'svg'), filename);
10223
+ return over({ data: isDownload ? true : leaf.toSVG() });
10123
10224
  }
10124
10225
  const { leafer } = leaf;
10125
10226
  if (leafer) {
@@ -10128,14 +10229,8 @@ const ExportModule = {
10128
10229
  let renderBounds, trimBounds, scaleX = 1, scaleY = 1;
10129
10230
  const { worldTransform, isLeafer, isFrame } = leaf;
10130
10231
  const { slice, trim, onCanvas } = options;
10131
- let scale = options.scale || 1;
10132
- let pixelRatio = options.pixelRatio || 1;
10133
10232
  const smooth = options.smooth === undefined ? leafer.config.smooth : options.smooth;
10134
10233
  const contextSettings = options.contextSettings || leafer.config.contextSettings;
10135
- if (leaf.isApp) {
10136
- scale *= pixelRatio;
10137
- pixelRatio = leaf.app.pixelRatio;
10138
- }
10139
10234
  const screenshot = options.screenshot || leaf.isApp;
10140
10235
  const fill = (isLeafer && screenshot) ? (options.fill === undefined ? leaf.fill : options.fill) : options.fill;
10141
10236
  const needFill = FileHelper.isOpaqueImage(filename) || fill, matrix = new Matrix();
@@ -10169,9 +10264,17 @@ const ExportModule = {
10169
10264
  }
10170
10265
  renderBounds = leaf.getBounds('render', relative);
10171
10266
  }
10172
- const { x, y, width, height } = new Bounds(renderBounds).scale(scale);
10267
+ const scaleData = { scaleX: 1, scaleY: 1 };
10268
+ MathHelper.getScaleData(options.scale, options.size, renderBounds, scaleData);
10269
+ let pixelRatio = options.pixelRatio || 1;
10270
+ if (leaf.isApp) {
10271
+ scaleData.scaleX *= pixelRatio;
10272
+ scaleData.scaleY *= pixelRatio;
10273
+ pixelRatio = leaf.app.pixelRatio;
10274
+ }
10275
+ const { x, y, width, height } = new Bounds(renderBounds).scale(scaleData.scaleX, scaleData.scaleY);
10276
+ const renderOptions = { matrix: matrix.scale(1 / scaleData.scaleX, 1 / scaleData.scaleY).invert().translate(-x, -y).withScale(1 / scaleX * scaleData.scaleX, 1 / scaleY * scaleData.scaleY) };
10173
10277
  let canvas = Creator.canvas({ width: Math.round(width), height: Math.round(height), pixelRatio, smooth, contextSettings });
10174
- const renderOptions = { matrix: matrix.scale(1 / scale).invert().translate(-x, -y).withScale(1 / scaleX * scale, 1 / scaleY * scale) };
10175
10278
  let sliceLeaf;
10176
10279
  if (slice) {
10177
10280
  sliceLeaf = leaf;
@@ -10276,4 +10379,4 @@ Object.assign(Export, ExportModule);
10276
10379
 
10277
10380
  useCanvas();
10278
10381
 
10279
- export { AlignHelper, AnimateEvent, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Export, FileHelper, Frame, FrameData, Group, GroupData, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, 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, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Run, Star, StarData, State, StringNumberMap, TaskItem, TaskProcessor, Text, TextConvert, TextData, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, 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 };
10382
+ export { AlignHelper, Answer, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, DataHelper, Debug, Direction4, Direction9, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Frame, FrameData, Group, GroupData, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MyImage, 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, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, Run, Star, StarData, State, StringNumberMap, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isNull, layoutProcessor, maskType, naturalBoundsType, needPlugin, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix, tempPoint$3 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };