leafer-ui 1.0.2 → 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.
@@ -119,11 +119,18 @@ const MathHelper = {
119
119
  scaleData.scaleX = (typeof size === 'number' ? size : size.width) / originSize.width;
120
120
  scaleData.scaleY = (typeof size === 'number' ? size : size.height) / originSize.height;
121
121
  }
122
- else if (scale) {
123
- scaleData.scaleX = typeof scale === 'number' ? scale : scale.x;
124
- scaleData.scaleY = typeof scale === 'number' ? scale : scale.y;
125
- }
122
+ else if (scale)
123
+ MathHelper.assignScale(scaleData, scale);
126
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
+ }
127
134
  }
128
135
  };
129
136
  const OneRadian = PI$4 / 180;
@@ -1255,7 +1262,6 @@ const AroundHelper = {
1255
1262
  tempPoint: {},
1256
1263
  get: get$4,
1257
1264
  toPoint(around, bounds, to, onlySize, pointBounds) {
1258
- to || (to = {});
1259
1265
  const point = get$4(around);
1260
1266
  to.x = point.x;
1261
1267
  to.y = point.y;
@@ -1390,6 +1396,10 @@ const Run = {
1390
1396
  };
1391
1397
  const R = Run;
1392
1398
 
1399
+ function needPlugin(name) {
1400
+ console.error('need plugin: @leafer-in/' + name);
1401
+ }
1402
+
1393
1403
  const debug$f = Debug.get('UICreator');
1394
1404
  const UICreator = {
1395
1405
  list: {},
@@ -1652,6 +1662,9 @@ var Answer;
1652
1662
  Answer[Answer["YesAndSkip"] = 3] = "YesAndSkip";
1653
1663
  })(Answer || (Answer = {}));
1654
1664
  const emptyData = {};
1665
+ function isNull(value) {
1666
+ return value === undefined || value === null;
1667
+ }
1655
1668
 
1656
1669
  /******************************************************************************
1657
1670
  Copyright (c) Microsoft Corporation.
@@ -2417,7 +2430,7 @@ const BezierHelper = {
2417
2430
  let startY = y = rotationSin * radiusX * startCos + rotationCos * radiusY * startSin;
2418
2431
  let fromX = cx + x, fromY = cy + y;
2419
2432
  if (data)
2420
- data.push(L$6, fromX, fromY);
2433
+ data.push(data.length ? L$6 : M$5, fromX, fromY);
2421
2434
  if (setPointBounds)
2422
2435
  setPoint$2(setPointBounds, fromX, fromY);
2423
2436
  if (setStartPoint)
@@ -3086,8 +3099,7 @@ const PathBounds = {
3086
3099
  toTwoPointBounds(data, setPointBounds) {
3087
3100
  if (!data || !data.length)
3088
3101
  return setPoint$1(setPointBounds, 0, 0);
3089
- let command;
3090
- let i = 0, x = 0, y = 0, x1, y1, toX, toY;
3102
+ let i = 0, x = 0, y = 0, x1, y1, toX, toY, command;
3091
3103
  const len = data.length;
3092
3104
  while (i < len) {
3093
3105
  command = data[i];
@@ -3743,7 +3755,7 @@ function autoLayoutType(defaultValue) {
3743
3755
  set(value) {
3744
3756
  if (this.__setAttr(key, value)) {
3745
3757
  this.__layout.matrixChanged || this.__layout.matrixChange();
3746
- this.__hasAutoLayout = !!value;
3758
+ this.__hasAutoLayout = !!(this.origin || this.around || this.flow);
3747
3759
  if (!this.__local)
3748
3760
  this.__layout.createLocal();
3749
3761
  }
@@ -3836,14 +3848,25 @@ function visibleType(defaultValue) {
3836
3848
  return decorateLeafAttr(defaultValue, (key) => attr({
3837
3849
  set(value) {
3838
3850
  const oldValue = this.visible;
3839
- if (this.__setAttr(key, value)) {
3840
- this.__layout.opacityChanged || this.__layout.opacityChange();
3841
- if (oldValue === 0 || value === 0)
3842
- 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');
3843
3858
  }
3859
+ doVisible(this, key, value, oldValue);
3844
3860
  }
3845
3861
  }));
3846
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
+ }
3847
3870
  function sortType(defaultValue) {
3848
3871
  return decorateLeafAttr(defaultValue, (key) => attr({
3849
3872
  set(value) {
@@ -3927,7 +3950,16 @@ function defineDataProcessor(target, key, defaultValue) {
3927
3950
  if (defaultValue === undefined) {
3928
3951
  property.get = function () { return this[computedKey]; };
3929
3952
  }
3930
- 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') {
3931
3963
  property.get = function () {
3932
3964
  const v = this[computedKey];
3933
3965
  if (v === undefined) {
@@ -4594,144 +4626,6 @@ class LeafLayout {
4594
4626
  destroy() { }
4595
4627
  }
4596
4628
 
4597
- const empty = {};
4598
- const LeafEventer = {
4599
- on(type, listener, options) {
4600
- let capture, once;
4601
- if (options) {
4602
- if (options === 'once') {
4603
- once = true;
4604
- }
4605
- else if (typeof options === 'boolean') {
4606
- capture = options;
4607
- }
4608
- else {
4609
- capture = options.capture;
4610
- once = options.once;
4611
- }
4612
- }
4613
- let events;
4614
- const map = __getListenerMap(this, capture, true);
4615
- const typeList = typeof type === 'string' ? type.split(' ') : type;
4616
- const item = once ? { listener, once } : { listener };
4617
- typeList.forEach(type => {
4618
- if (type) {
4619
- events = map[type];
4620
- if (events) {
4621
- if (events.findIndex(item => item.listener === listener) === -1)
4622
- events.push(item);
4623
- }
4624
- else {
4625
- map[type] = [item];
4626
- }
4627
- }
4628
- });
4629
- },
4630
- off(type, listener, options) {
4631
- if (type) {
4632
- const typeList = typeof type === 'string' ? type.split(' ') : type;
4633
- if (listener) {
4634
- let capture;
4635
- if (options)
4636
- capture = typeof options === 'boolean' ? options : (options === 'once' ? false : options.capture);
4637
- let events, index;
4638
- const map = __getListenerMap(this, capture);
4639
- typeList.forEach(type => {
4640
- if (type) {
4641
- events = map[type];
4642
- if (events) {
4643
- index = events.findIndex(item => item.listener === listener);
4644
- if (index > -1)
4645
- events.splice(index, 1);
4646
- if (!events.length)
4647
- delete map[type];
4648
- }
4649
- }
4650
- });
4651
- }
4652
- else {
4653
- const { __bubbleMap: b, __captureMap: c } = this;
4654
- typeList.forEach(type => {
4655
- if (b)
4656
- delete b[type];
4657
- if (c)
4658
- delete c[type];
4659
- });
4660
- }
4661
- }
4662
- else {
4663
- this.__bubbleMap = this.__captureMap = undefined;
4664
- }
4665
- },
4666
- on_(type, listener, bind, options) {
4667
- if (bind)
4668
- listener = listener.bind(bind);
4669
- this.on(type, listener, options);
4670
- return { type, current: this, listener, options };
4671
- },
4672
- off_(id) {
4673
- if (!id)
4674
- return;
4675
- const list = id instanceof Array ? id : [id];
4676
- list.forEach(item => item.current.off(item.type, item.listener, item.options));
4677
- list.length = 0;
4678
- },
4679
- once(type, listener, capture) {
4680
- this.on(type, listener, { once: true, capture });
4681
- },
4682
- emit(type, event, capture) {
4683
- if (!event && EventCreator.has(type))
4684
- event = EventCreator.get(type, { type, target: this, current: this });
4685
- const map = __getListenerMap(this, capture);
4686
- const list = map[type];
4687
- if (list) {
4688
- let item;
4689
- for (let i = 0, len = list.length; i < len; i++) {
4690
- item = list[i];
4691
- item.listener(event);
4692
- if (item.once) {
4693
- this.off(type, item.listener, capture);
4694
- i--, len--;
4695
- }
4696
- if (event && event.isStopNow)
4697
- break;
4698
- }
4699
- }
4700
- this.syncEventer && this.syncEventer.emitEvent(event, capture);
4701
- },
4702
- emitEvent(event, capture) {
4703
- event.current = this;
4704
- this.emit(event.type, event, capture);
4705
- },
4706
- hasEvent(type, capture) {
4707
- if (this.syncEventer && this.syncEventer.hasEvent(type, capture))
4708
- return true;
4709
- const { __bubbleMap: b, __captureMap: c } = this;
4710
- const hasB = b && b[type], hasC = c && c[type];
4711
- return !!(capture === undefined ? (hasB || hasC) : (capture ? hasC : hasB));
4712
- },
4713
- };
4714
- function __getListenerMap(eventer, capture, create) {
4715
- if (capture) {
4716
- const { __captureMap: c } = eventer;
4717
- if (c) {
4718
- return c;
4719
- }
4720
- else {
4721
- return create ? eventer.__captureMap = {} : empty;
4722
- }
4723
- }
4724
- else {
4725
- const { __bubbleMap: b } = eventer;
4726
- if (b) {
4727
- return b;
4728
- }
4729
- else {
4730
- return create ? eventer.__bubbleMap = {} : empty;
4731
- }
4732
- }
4733
- }
4734
-
4735
4629
  class Event {
4736
4630
  constructor(type, target) {
4737
4631
  this.bubbles = false;
@@ -4766,7 +4660,10 @@ class ChildEvent extends Event {
4766
4660
  }
4767
4661
  ChildEvent.ADD = 'child.add';
4768
4662
  ChildEvent.REMOVE = 'child.remove';
4769
- ChildEvent.DESTROY = 'child.destroy';
4663
+ ChildEvent.CREATED = 'created';
4664
+ ChildEvent.MOUNTED = 'mounted';
4665
+ ChildEvent.UNMOUNTED = 'unmounted';
4666
+ ChildEvent.DESTROY = 'destroy';
4770
4667
 
4771
4668
  class PropertyEvent extends Event {
4772
4669
  constructor(type, target, attrName, oldValue, newValue) {
@@ -4844,10 +4741,6 @@ LayoutEvent.AFTER = 'layout.after';
4844
4741
  LayoutEvent.AGAIN = 'layout.again';
4845
4742
  LayoutEvent.END = 'layout.end';
4846
4743
 
4847
- class AnimateEvent extends Event {
4848
- }
4849
- AnimateEvent.FRAME = 'animate.frame';
4850
-
4851
4744
  class RenderEvent extends Event {
4852
4745
  constructor(type, times, bounds, options) {
4853
4746
  super(type);
@@ -4880,6 +4773,157 @@ LeaferEvent.STOP = 'leafer.stop';
4880
4773
  LeaferEvent.RESTART = 'leafer.restart';
4881
4774
  LeaferEvent.END = 'leafer.end';
4882
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$2, emitEvent: emitEvent$1, hasEvent, destroy } = Eventer.prototype;
4925
+ const LeafEventer = { on, on_, off, off_, once, emit: emit$2, emitEvent: emitEvent$1, hasEvent, destroyEventer: destroy };
4926
+
4883
4927
  const { isFinite } = Number;
4884
4928
  const debug$8 = Debug.get('setAttr');
4885
4929
  const LeafDataProxy = {
@@ -4891,9 +4935,7 @@ const LeafDataProxy = {
4891
4935
  newValue = undefined;
4892
4936
  }
4893
4937
  if (typeof newValue === 'object' || oldValue !== newValue) {
4894
- this.__[name] = newValue;
4895
- if (this.__proxyData)
4896
- this.setProxyAttr(name, newValue);
4938
+ this.__realSetAttr(name, newValue);
4897
4939
  const { CHANGE } = PropertyEvent;
4898
4940
  const event = new PropertyEvent(CHANGE, this, name, oldValue, newValue);
4899
4941
  if (this.isLeafer) {
@@ -4911,12 +4953,18 @@ const LeafDataProxy = {
4911
4953
  }
4912
4954
  }
4913
4955
  else {
4914
- this.__[name] = newValue;
4915
- if (this.__proxyData)
4916
- this.setProxyAttr(name, newValue);
4956
+ this.__realSetAttr(name, newValue);
4917
4957
  return true;
4918
4958
  }
4919
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
+ },
4920
4968
  __getAttr(name) {
4921
4969
  if (this.__proxyData)
4922
4970
  return this.getProxyAttr(name);
@@ -5019,6 +5067,8 @@ const LeafBounds = {
5019
5067
  layout.boundsChanged = false;
5020
5068
  },
5021
5069
  __updateLocalBoxBounds() {
5070
+ if (this.__hasMotionPath)
5071
+ this.__updateMotionPath();
5022
5072
  if (this.__hasAutoLayout)
5023
5073
  this.__updateAutoLayout();
5024
5074
  toOuterOf$1(this.__layout.boxBounds, this.__local, this.__local);
@@ -5171,7 +5221,7 @@ const BranchRender = {
5171
5221
  const { LEAF, create } = IncrementId;
5172
5222
  const { toInnerPoint, toOuterPoint, multiplyParent } = MatrixHelper;
5173
5223
  const { toOuterOf } = BoundsHelper;
5174
- const { copy: copy$4 } = PointHelper;
5224
+ const { copy: copy$4, move: move$1 } = PointHelper;
5175
5225
  const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getFlipTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
5176
5226
  let Leaf = class Leaf {
5177
5227
  get tag() { return this.__tag; }
@@ -5198,13 +5248,16 @@ let Leaf = class Leaf {
5198
5248
  get __ignoreHitWorld() { return (this.__hasMask || this.__hasEraser) && this.__.hitChildren; }
5199
5249
  get __inLazyBounds() { const { leafer } = this; return leafer && leafer.created && leafer.lazyBounds.hit(this.__world); }
5200
5250
  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); }
5251
+ set event(map) { this.on(map); }
5203
5252
  constructor(data) {
5204
5253
  this.innerId = create(LEAF);
5205
5254
  this.reset(data);
5255
+ if (this.__bubbleMap)
5256
+ this.__emitLifeEvent(ChildEvent.CREATED);
5206
5257
  }
5207
5258
  reset(data) {
5259
+ if (this.leafer)
5260
+ this.leafer.forceRender(this.__world);
5208
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 };
5209
5262
  if (data !== null)
5210
5263
  this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
@@ -5226,12 +5279,12 @@ let Leaf = class Leaf {
5226
5279
  waitParent(item, bind) {
5227
5280
  if (bind)
5228
5281
  item = item.bind(bind);
5229
- this.parent ? item() : (this.__parentWait ? this.__parentWait.push(item) : this.__parentWait = [item]);
5282
+ this.parent ? item() : this.on(ChildEvent.ADD, item, 'once');
5230
5283
  }
5231
5284
  waitLeafer(item, bind) {
5232
5285
  if (bind)
5233
5286
  item = item.bind(bind);
5234
- this.leafer ? item() : (this.__leaferWait ? this.__leaferWait.push(item) : this.__leaferWait = [item]);
5287
+ this.leafer ? item() : this.on(ChildEvent.MOUNTED, item, 'once');
5235
5288
  }
5236
5289
  nextRender(item, bind, off) {
5237
5290
  this.leafer ? this.leafer.nextRender(item, bind, off) : this.waitLeafer(() => this.leafer.nextRender(item, bind, off));
@@ -5240,18 +5293,21 @@ let Leaf = class Leaf {
5240
5293
  this.nextRender(item, null, 'off');
5241
5294
  }
5242
5295
  __bindLeafer(leafer) {
5243
- if (this.isLeafer) {
5244
- if (leafer !== null)
5245
- leafer = this;
5246
- }
5296
+ if (this.isLeafer && leafer !== null)
5297
+ leafer = this;
5247
5298
  if (this.leafer && !leafer)
5248
5299
  this.leafer.leafs--;
5249
5300
  this.leafer = leafer;
5250
5301
  if (leafer) {
5251
5302
  leafer.leafs++;
5252
5303
  this.__level = this.parent ? this.parent.__level + 1 : 1;
5253
- if (this.__leaferWait)
5254
- 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);
5255
5311
  }
5256
5312
  if (this.isBranch) {
5257
5313
  const { children } = this;
@@ -5260,7 +5316,7 @@ let Leaf = class Leaf {
5260
5316
  }
5261
5317
  }
5262
5318
  }
5263
- set(_data) { }
5319
+ set(_data, _isTemp) { }
5264
5320
  get(_name) { return undefined; }
5265
5321
  setAttr(name, value) { this[name] = value; }
5266
5322
  getAttr(name) { return this[name]; }
@@ -5285,6 +5341,7 @@ let Leaf = class Leaf {
5285
5341
  findOne(_condition, _options) { return undefined; }
5286
5342
  findId(_id) { return undefined; }
5287
5343
  focus(_value) { }
5344
+ updateState() { }
5288
5345
  updateLayout() {
5289
5346
  this.__layout.update();
5290
5347
  }
@@ -5392,11 +5449,24 @@ let Leaf = class Leaf {
5392
5449
  if (relative)
5393
5450
  relative.worldToInner(to ? to : inner, null, distance);
5394
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$1(point, -x, -y);
5458
+ return point;
5459
+ }
5395
5460
  getInnerPoint(world, relative, distance, change) {
5396
5461
  const point = change ? world : {};
5397
5462
  this.worldToInner(world, point, distance, relative);
5398
5463
  return point;
5399
5464
  }
5465
+ getInnerPointByBox(box, _relative, _distance, change) {
5466
+ const point = change ? box : Object.assign({}, box), { x, y } = this.boxBounds;
5467
+ move$1(point, x, y);
5468
+ return point;
5469
+ }
5400
5470
  getInnerPointByLocal(local, _relative, distance, change) {
5401
5471
  return this.getInnerPoint(local, this.parent, distance, change);
5402
5472
  }
@@ -5408,20 +5478,23 @@ let Leaf = class Leaf {
5408
5478
  getLocalPointByInner(inner, _relative, distance, change) {
5409
5479
  return this.getWorldPoint(inner, this.parent, distance, change);
5410
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
+ }
5411
5485
  getWorldPoint(inner, relative, distance, change) {
5412
5486
  const point = change ? inner : {};
5413
5487
  this.innerToWorld(inner, point, distance, relative);
5414
5488
  return point;
5415
5489
  }
5490
+ getWorldPointByBox(box, relative, distance, change) {
5491
+ return this.getWorldPoint(this.getInnerPointByBox(box, null, null, change), relative, distance, true);
5492
+ }
5416
5493
  getWorldPointByLocal(local, relative, distance, change) {
5417
5494
  const point = change ? local : {};
5418
5495
  this.localToWorld(local, point, distance, relative);
5419
5496
  return point;
5420
5497
  }
5421
- getPagePoint(world, relative, distance, change) {
5422
- const layer = this.leafer ? this.leafer.zoomLayer : this;
5423
- return layer.getInnerPoint(world, relative, distance, change);
5424
- }
5425
5498
  getWorldPointByPage(page, relative, distance, change) {
5426
5499
  const layer = this.leafer ? this.leafer.zoomLayer : this;
5427
5500
  return layer.getWorldPoint(page, relative, distance, change);
@@ -5490,6 +5563,17 @@ let Leaf = class Leaf {
5490
5563
  __drawRenderPath(_canvas) { }
5491
5564
  __updatePath() { }
5492
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) { }
5493
5577
  __updateSortChildren() { }
5494
5578
  add(_child, _index) { }
5495
5579
  remove(_child, destroy) {
@@ -5515,6 +5599,10 @@ let Leaf = class Leaf {
5515
5599
  fn = boundsType;
5516
5600
  fn(defaultValue)(this.prototype, attrName);
5517
5601
  }
5602
+ __emitLifeEvent(type) {
5603
+ if (this.hasEvent(type))
5604
+ this.emitEvent(new ChildEvent(type, this, this.parent));
5605
+ }
5518
5606
  destroy() {
5519
5607
  if (!this.destroyed) {
5520
5608
  const { parent } = this;
@@ -5522,11 +5610,10 @@ let Leaf = class Leaf {
5522
5610
  this.remove();
5523
5611
  if (this.children)
5524
5612
  this.removeAll(true);
5525
- if (this.hasEvent(ChildEvent.DESTROY))
5526
- this.emitEvent(new ChildEvent(ChildEvent.DESTROY, this, parent));
5613
+ this.__emitLifeEvent(ChildEvent.DESTROY);
5527
5614
  this.__.destroy();
5528
5615
  this.__layout.destroy();
5529
- this.__captureMap = this.__bubbleMap = this.__parentWait = this.__leaferWait = null;
5616
+ this.destroyEventer();
5530
5617
  this.destroyed = true;
5531
5618
  }
5532
5619
  }
@@ -5592,8 +5679,8 @@ let Branch = class Branch extends Leaf {
5592
5679
  this.__.__childBranchNumber = (this.__.__childBranchNumber || 0) + 1;
5593
5680
  child.__layout.boxChanged || child.__layout.boxChange();
5594
5681
  child.__layout.matrixChanged || child.__layout.matrixChange();
5595
- if (child.__parentWait)
5596
- WaitHelper.run(child.__parentWait);
5682
+ if (child.__bubbleMap)
5683
+ child.__emitLifeEvent(ChildEvent.ADD);
5597
5684
  if (this.leafer) {
5598
5685
  child.__bindLeafer(this.leafer);
5599
5686
  if (this.leafer.created)
@@ -5606,16 +5693,10 @@ let Branch = class Branch extends Leaf {
5606
5693
  }
5607
5694
  remove(child, destroy) {
5608
5695
  if (child) {
5609
- const index = this.children.indexOf(child);
5610
- if (index > -1) {
5611
- this.children.splice(index, 1);
5612
- if (child.isBranch)
5613
- this.__.__childBranchNumber = (this.__.__childBranchNumber || 1) - 1;
5614
- this.__preRemove();
5615
- this.__realRemoveChild(child);
5616
- if (destroy)
5617
- child.destroy();
5618
- }
5696
+ if (child.animationOut)
5697
+ child.__runAnimation('out', () => this.__remove(child, destroy));
5698
+ else
5699
+ this.__remove(child, destroy);
5619
5700
  }
5620
5701
  else if (child === undefined) {
5621
5702
  super.remove(null, destroy);
@@ -5637,6 +5718,18 @@ let Branch = class Branch extends Leaf {
5637
5718
  clear() {
5638
5719
  this.removeAll(true);
5639
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
+ }
5640
5733
  __preRemove() {
5641
5734
  if (this.__hasMask)
5642
5735
  this.__updateMask();
@@ -5646,6 +5739,7 @@ let Branch = class Branch extends Leaf {
5646
5739
  this.__layout.affectChildrenSort && this.__layout.childrenSortChange();
5647
5740
  }
5648
5741
  __realRemoveChild(child) {
5742
+ child.__emitLifeEvent(ChildEvent.REMOVE);
5649
5743
  child.parent = null;
5650
5744
  if (this.leafer) {
5651
5745
  child.__bindLeafer(null);
@@ -5658,8 +5752,6 @@ let Branch = class Branch extends Leaf {
5658
5752
  }
5659
5753
  __emitChildEvent(type, child) {
5660
5754
  const event = new ChildEvent(type, child, this);
5661
- if (child.hasEvent(type))
5662
- child.emitEvent(event);
5663
5755
  if (this.hasEvent(type) && !this.isLeafer)
5664
5756
  this.emitEvent(event);
5665
5757
  this.leafer.emitEvent(event);
@@ -5822,8 +5914,7 @@ class LeafLevelList {
5822
5914
  }
5823
5915
  }
5824
5916
 
5825
- const version = "1.0.1";
5826
- const inviteCode = {};
5917
+ const version = "1.0.3";
5827
5918
 
5828
5919
  const debug$7 = Debug.get('LeaferCanvas');
5829
5920
  class LeaferCanvas extends LeaferCanvasBase {
@@ -6223,9 +6314,13 @@ function updateBounds(boundsList) {
6223
6314
  });
6224
6315
  }
6225
6316
  function updateChange(updateList) {
6317
+ let layout;
6226
6318
  updateList.list.forEach(leaf => {
6227
- if (leaf.__layout.opacityChanged)
6319
+ layout = leaf.__layout;
6320
+ if (layout.opacityChanged)
6228
6321
  updateAllWorldOpacity(leaf);
6322
+ if (layout.stateStyleChanged)
6323
+ setTimeout(() => layout.stateStyleChanged && leaf.updateState());
6229
6324
  leaf.__updateChange();
6230
6325
  });
6231
6326
  }
@@ -6591,7 +6686,6 @@ class Renderer {
6591
6686
  Platform.requestRender(() => {
6592
6687
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - startTime)));
6593
6688
  if (this.running) {
6594
- this.target.emit(AnimateEvent.FRAME);
6595
6689
  if (this.changed && this.canvas.view)
6596
6690
  this.render();
6597
6691
  this.target.emit(RenderEvent.NEXT);
@@ -6936,36 +7030,6 @@ Object.assign(Creator, {
6936
7030
  });
6937
7031
  Platform.layout = Layouter.fullLayout;
6938
7032
 
6939
- const TextConvert = {};
6940
- const ColorConvert = {};
6941
- const PathArrow = {};
6942
- const Paint = {};
6943
- const PaintImage = {};
6944
- const PaintGradient = {};
6945
- const Effect = {};
6946
- const Export = {};
6947
- const State = {};
6948
-
6949
- function stateType(defaultValue) {
6950
- return decorateLeafAttr(defaultValue, (key) => attr({
6951
- set(value) {
6952
- this.__setAttr(key, value);
6953
- this.waitLeafer(() => { if (State.setStyle)
6954
- State.setStyle(this, key + 'Style', value); });
6955
- }
6956
- }));
6957
- }
6958
- function arrowType(defaultValue) {
6959
- return decorateLeafAttr(defaultValue, (key) => attr({
6960
- set(value) {
6961
- if (this.__setAttr(key, value)) {
6962
- const data = this.__;
6963
- data.__useArrow = data.startArrow !== 'none' || data.endArrow !== 'none';
6964
- doStrokeType(this);
6965
- }
6966
- }
6967
- }));
6968
- }
6969
7033
  function effectType(defaultValue) {
6970
7034
  return decorateLeafAttr(defaultValue, (key) => attr({
6971
7035
  set(value) {
@@ -7000,10 +7064,33 @@ function zoomLayerType() {
7000
7064
  };
7001
7065
  }
7002
7066
 
7067
+ const TextConvert = {};
7068
+ const ColorConvert = {};
7069
+ const PathArrow = {};
7070
+ const Paint = {};
7071
+ const PaintImage = {};
7072
+ const PaintGradient = {};
7073
+ const Effect = {};
7074
+ const Export = {};
7075
+ const State = {
7076
+ setStyleName(_leaf, _styleName, _value) { return needPlugin('state'); },
7077
+ set(_leaf, _stateName) { return needPlugin('state'); }
7078
+ };
7079
+ const Transition = {
7080
+ list: {},
7081
+ register(attrName, fn) {
7082
+ Transition.list[attrName] = fn;
7083
+ },
7084
+ get(attrName) {
7085
+ return Transition.list[attrName];
7086
+ }
7087
+ };
7088
+
7003
7089
  const { parse } = PathConvert;
7004
7090
  const emptyPaint = {};
7005
7091
  const debug$4 = Debug.get('UIData');
7006
7092
  class UIData extends LeafData {
7093
+ get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
7007
7094
  get __strokeWidth() {
7008
7095
  const { strokeWidth, strokeWidthFixed } = this;
7009
7096
  if (strokeWidthFixed) {
@@ -7022,9 +7109,10 @@ class UIData extends LeafData {
7022
7109
  get __autoSide() { return !this._width || !this._height; }
7023
7110
  get __autoSize() { return !this._width && !this._height; }
7024
7111
  setVisible(value) {
7025
- if (this.__leaf.leafer)
7026
- this.__leaf.leafer.watcher.hasVisible = true;
7027
7112
  this._visible = value;
7113
+ const { leafer } = this.__leaf;
7114
+ if (leafer)
7115
+ leafer.watcher.hasVisible = true;
7028
7116
  }
7029
7117
  setWidth(value) {
7030
7118
  if (value < 0) {
@@ -7215,7 +7303,7 @@ class ImageData extends RectData {
7215
7303
  __setImageFill(value) {
7216
7304
  if (this.__leaf.image)
7217
7305
  this.__leaf.image = null;
7218
- this.fill = value ? { type: 'image', mode: 'strench', url: value } : undefined;
7306
+ this.fill = value ? { type: 'image', mode: 'stretch', url: value } : undefined;
7219
7307
  }
7220
7308
  __getData() {
7221
7309
  const data = super.__getData();
@@ -7405,19 +7493,8 @@ var UI_1;
7405
7493
  let UI = UI_1 = class UI extends Leaf {
7406
7494
  get app() { return this.leafer && this.leafer.app; }
7407
7495
  get isFrame() { return false; }
7408
- set scale(value) {
7409
- if (typeof value === 'number') {
7410
- this.scaleX = this.scaleY = value;
7411
- }
7412
- else {
7413
- this.scaleX = value.x;
7414
- this.scaleY = value.y;
7415
- }
7416
- }
7417
- get scale() {
7418
- const { scaleX, scaleY } = this;
7419
- return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX;
7420
- }
7496
+ set scale(value) { MathHelper.assignScale(this, value); }
7497
+ get scale() { return this.__.scale; }
7421
7498
  get pen() {
7422
7499
  const { path } = this.__;
7423
7500
  pen.set(this.path = path || []);
@@ -7432,8 +7509,15 @@ let UI = UI_1 = class UI extends Leaf {
7432
7509
  super(data);
7433
7510
  }
7434
7511
  reset(_data) { }
7435
- set(data) {
7436
- Object.assign(this, data);
7512
+ set(data, isTemp) {
7513
+ if (isTemp) {
7514
+ this.lockNormalStyle = true;
7515
+ Object.assign(this, data);
7516
+ this.lockNormalStyle = false;
7517
+ }
7518
+ else {
7519
+ Object.assign(this, data);
7520
+ }
7437
7521
  }
7438
7522
  get(name) {
7439
7523
  return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -7496,11 +7580,18 @@ let UI = UI_1 = class UI extends Leaf {
7496
7580
  drawer.rect(x, y, width, height);
7497
7581
  }
7498
7582
  }
7583
+ animate(_keyframe, _options, _type, _isTemp) {
7584
+ return needPlugin('animate');
7585
+ }
7586
+ killAnimate(_type) { }
7499
7587
  export(filename, options) {
7500
7588
  return Export.export(this, filename, options);
7501
7589
  }
7502
- clone() {
7503
- return UI_1.one(this.toJSON());
7590
+ clone(newData) {
7591
+ const json = this.toJSON();
7592
+ if (newData)
7593
+ Object.assign(json, newData);
7594
+ return UI_1.one(json);
7504
7595
  }
7505
7596
  static one(data, x, y, width, height) {
7506
7597
  return UICreator.get(data.tag || this.prototype.__tag, data, x, y, width, height);
@@ -7516,6 +7607,8 @@ let UI = UI_1 = class UI extends Leaf {
7516
7607
  static setEditInner(_editorName) { }
7517
7608
  destroy() {
7518
7609
  this.fill = this.stroke = null;
7610
+ if (this.__animate)
7611
+ this.killAnimate();
7519
7612
  super.destroy();
7520
7613
  }
7521
7614
  };
@@ -7543,12 +7636,6 @@ __decorate([
7543
7636
  __decorate([
7544
7637
  visibleType(true)
7545
7638
  ], UI.prototype, "visible", void 0);
7546
- __decorate([
7547
- stateType(false)
7548
- ], UI.prototype, "selected", void 0);
7549
- __decorate([
7550
- stateType(false)
7551
- ], UI.prototype, "disabled", void 0);
7552
7639
  __decorate([
7553
7640
  surfaceType(false)
7554
7641
  ], UI.prototype, "locked", void 0);
@@ -7621,45 +7708,9 @@ __decorate([
7621
7708
  __decorate([
7622
7709
  pathType(true)
7623
7710
  ], UI.prototype, "closed", void 0);
7624
- __decorate([
7625
- autoLayoutType(false)
7626
- ], UI.prototype, "flow", void 0);
7627
7711
  __decorate([
7628
7712
  boundsType(0)
7629
7713
  ], UI.prototype, "padding", void 0);
7630
- __decorate([
7631
- boundsType(0)
7632
- ], UI.prototype, "gap", void 0);
7633
- __decorate([
7634
- boundsType('top-left')
7635
- ], UI.prototype, "flowAlign", void 0);
7636
- __decorate([
7637
- boundsType(false)
7638
- ], UI.prototype, "flowWrap", void 0);
7639
- __decorate([
7640
- boundsType('box')
7641
- ], UI.prototype, "itemBox", void 0);
7642
- __decorate([
7643
- boundsType(true)
7644
- ], UI.prototype, "inFlow", void 0);
7645
- __decorate([
7646
- boundsType()
7647
- ], UI.prototype, "autoWidth", void 0);
7648
- __decorate([
7649
- boundsType()
7650
- ], UI.prototype, "autoHeight", void 0);
7651
- __decorate([
7652
- boundsType()
7653
- ], UI.prototype, "lockRatio", void 0);
7654
- __decorate([
7655
- boundsType()
7656
- ], UI.prototype, "autoBox", void 0);
7657
- __decorate([
7658
- boundsType()
7659
- ], UI.prototype, "widthRange", void 0);
7660
- __decorate([
7661
- boundsType()
7662
- ], UI.prototype, "heightRange", void 0);
7663
7714
  __decorate([
7664
7715
  dataType(false)
7665
7716
  ], UI.prototype, "draggable", void 0);
@@ -7723,12 +7774,6 @@ __decorate([
7723
7774
  __decorate([
7724
7775
  strokeType(10)
7725
7776
  ], UI.prototype, "miterLimit", void 0);
7726
- __decorate([
7727
- arrowType('none')
7728
- ], UI.prototype, "startArrow", void 0);
7729
- __decorate([
7730
- arrowType('none')
7731
- ], UI.prototype, "endArrow", void 0);
7732
7777
  __decorate([
7733
7778
  pathType(0)
7734
7779
  ], UI.prototype, "cornerRadius", void 0);
@@ -7750,24 +7795,6 @@ __decorate([
7750
7795
  __decorate([
7751
7796
  effectType()
7752
7797
  ], UI.prototype, "grayscale", void 0);
7753
- __decorate([
7754
- dataType()
7755
- ], UI.prototype, "normalStyle", void 0);
7756
- __decorate([
7757
- dataType()
7758
- ], UI.prototype, "hoverStyle", void 0);
7759
- __decorate([
7760
- dataType()
7761
- ], UI.prototype, "pressStyle", void 0);
7762
- __decorate([
7763
- dataType()
7764
- ], UI.prototype, "focusStyle", void 0);
7765
- __decorate([
7766
- dataType()
7767
- ], UI.prototype, "selectedStyle", void 0);
7768
- __decorate([
7769
- dataType()
7770
- ], UI.prototype, "disabledStyle", void 0);
7771
7798
  __decorate([
7772
7799
  dataType({})
7773
7800
  ], UI.prototype, "data", void 0);
@@ -7794,7 +7821,7 @@ let Group = class Group extends UI {
7794
7821
  if (!this.children)
7795
7822
  this.children = [];
7796
7823
  }
7797
- set(data) {
7824
+ set(data, isTemp) {
7798
7825
  if (data.children) {
7799
7826
  const { children } = data;
7800
7827
  delete data.children;
@@ -7804,7 +7831,7 @@ let Group = class Group extends UI {
7804
7831
  else {
7805
7832
  this.clear();
7806
7833
  }
7807
- super.set(data);
7834
+ super.set(data, isTemp);
7808
7835
  let child;
7809
7836
  children.forEach(childData => {
7810
7837
  child = childData.__ ? childData : UICreator.get(childData.tag, childData);
@@ -7813,7 +7840,7 @@ let Group = class Group extends UI {
7813
7840
  data.children = children;
7814
7841
  }
7815
7842
  else {
7816
- super.set(data);
7843
+ super.set(data, isTemp);
7817
7844
  }
7818
7845
  }
7819
7846
  toJSON(options) {
@@ -8140,7 +8167,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8140
8167
  }
8141
8168
  }
8142
8169
  zoom(_zoomType, _padding, _fixedScale) {
8143
- return debug$3.error('need @leafer-in/view');
8170
+ return needPlugin('view');
8144
8171
  }
8145
8172
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
8146
8173
  getValidScale(changeScale) { return changeScale; }
@@ -8663,19 +8690,18 @@ let Canvas = class Canvas extends Rect {
8663
8690
  this.paint();
8664
8691
  }
8665
8692
  paint() {
8666
- this.forceUpdate('fill');
8693
+ this.forceRender();
8667
8694
  }
8668
8695
  __drawAfterFill(canvas, _options) {
8669
- const origin = this.canvas.view;
8670
- const { width, height } = this;
8671
- if (this.__.cornerRadius || this.pathInputed) {
8696
+ const { width, height, cornerRadius } = this.__, { view } = this.canvas;
8697
+ if (cornerRadius || this.pathInputed) {
8672
8698
  canvas.save();
8673
8699
  canvas.clip();
8674
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8700
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8675
8701
  canvas.restore();
8676
8702
  }
8677
8703
  else {
8678
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8704
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8679
8705
  }
8680
8706
  }
8681
8707
  __updateSize() {
@@ -9118,21 +9144,29 @@ class UIEvent extends Event {
9118
9144
  constructor(params) {
9119
9145
  super(params.type);
9120
9146
  this.bubbles = true;
9147
+ this.getInner = this.getInnerPoint;
9148
+ this.getLocal = this.getLocalPoint;
9149
+ this.getPage = this.getPagePoint;
9121
9150
  Object.assign(this, params);
9122
9151
  }
9123
- getPage() {
9124
- return this.current.getPagePoint(this);
9152
+ getBoxPoint(relative) {
9153
+ if (!relative)
9154
+ relative = this.current;
9155
+ return relative.getBoxPoint(this);
9125
9156
  }
9126
- getInner(relative) {
9157
+ getInnerPoint(relative) {
9127
9158
  if (!relative)
9128
9159
  relative = this.current;
9129
9160
  return relative.getInnerPoint(this);
9130
9161
  }
9131
- getLocal(relative) {
9162
+ getLocalPoint(relative) {
9132
9163
  if (!relative)
9133
9164
  relative = this.current;
9134
9165
  return relative.getLocalPoint(this);
9135
9166
  }
9167
+ getPagePoint() {
9168
+ return this.current.getPagePoint(this);
9169
+ }
9136
9170
  static changeName(oldName, newName) {
9137
9171
  EventCreator.changeName(oldName, newName);
9138
9172
  }
@@ -9240,7 +9274,7 @@ let DragEvent = class DragEvent extends PointerEvent {
9240
9274
  }
9241
9275
  getPageBounds() {
9242
9276
  const total = this.getPageTotal();
9243
- const start = this.getPage();
9277
+ const start = this.getPagePoint();
9244
9278
  const bounds = {};
9245
9279
  BoundsHelper.set(bounds, start.x - total.x, start.y - total.y, total.x, total.y);
9246
9280
  BoundsHelper.unsign(bounds);
@@ -9824,7 +9858,7 @@ function emitEvent(leaf, type, data, capture, excludePath) {
9824
9858
  if (leaf.destroyed)
9825
9859
  return false;
9826
9860
  if (leaf.__.hitSelf && !exclude(leaf, excludePath)) {
9827
- if (State.updateEventStyle)
9861
+ if (State.updateEventStyle && !capture)
9828
9862
  State.updateEventStyle(leaf, type);
9829
9863
  if (leaf.hasEvent(type, capture)) {
9830
9864
  data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
@@ -9929,7 +9963,7 @@ class InteractionBase {
9929
9963
  this.tapWait();
9930
9964
  this.longPressWait(data);
9931
9965
  }
9932
- this.waitMenuTap = PointerButton.right(data);
9966
+ this.waitRightTap = PointerButton.right(data);
9933
9967
  this.dragger.setDragData(data);
9934
9968
  if (!this.isHoldRightKey)
9935
9969
  this.updateCursor(data);
@@ -9957,7 +9991,7 @@ class InteractionBase {
9957
9991
  if (canDrag) {
9958
9992
  if (this.waitTap)
9959
9993
  this.pointerWaitCancel();
9960
- this.waitMenuTap = false;
9994
+ this.waitRightTap = false;
9961
9995
  }
9962
9996
  this.dragger.checkDrag(data, canDrag);
9963
9997
  }
@@ -10011,10 +10045,15 @@ class InteractionBase {
10011
10045
  menu(data) {
10012
10046
  this.findPath(data);
10013
10047
  this.emit(PointerEvent.MENU, data);
10048
+ this.waitMenuTap = true;
10049
+ if (!this.downData && this.waitRightTap)
10050
+ this.menuTap(data);
10014
10051
  }
10015
10052
  menuTap(data) {
10016
- if (this.waitMenuTap)
10053
+ if (this.waitRightTap && this.waitMenuTap) {
10017
10054
  this.emit(PointerEvent.MENU_TAP, data);
10055
+ this.waitRightTap = this.waitMenuTap = false;
10056
+ }
10018
10057
  }
10019
10058
  move(data) {
10020
10059
  this.transformer.move(data);
@@ -11210,6 +11249,8 @@ function getPatternData(paint, box, image) {
11210
11249
  let { width, height } = image;
11211
11250
  if (paint.padding)
11212
11251
  box = tempBox.set(box).shrink(paint.padding);
11252
+ if (paint.mode === 'strench')
11253
+ paint.mode = 'stretch';
11213
11254
  const { opacity, mode, align, offset, scale, size, rotation, repeat } = paint;
11214
11255
  const sameBox = box.width === width && box.height === height;
11215
11256
  const data = { mode };
@@ -11238,7 +11279,7 @@ function getPatternData(paint, box, image) {
11238
11279
  if (offset)
11239
11280
  x += offset.x, y += offset.y;
11240
11281
  switch (mode) {
11241
- case 'strench':
11282
+ case 'stretch':
11242
11283
  if (!sameBox)
11243
11284
  width = box.width, height = box.height;
11244
11285
  break;
@@ -11265,7 +11306,7 @@ function getPatternData(paint, box, image) {
11265
11306
  translate(data.transform, box.x, box.y);
11266
11307
  }
11267
11308
  }
11268
- if (scaleX && mode !== 'strench') {
11309
+ if (scaleX && mode !== 'stretch') {
11269
11310
  data.scaleX = scaleX;
11270
11311
  data.scaleY = scaleY;
11271
11312
  }
@@ -11369,7 +11410,7 @@ const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
11369
11410
  const { ceil, abs: abs$1 } = Math;
11370
11411
  function createPattern(ui, paint, pixelRatio) {
11371
11412
  let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11372
- const id = scaleX + '-' + scaleY;
11413
+ const id = scaleX + '-' + scaleY + '-' + pixelRatio;
11373
11414
  if (paint.patternId !== id && !ui.destroyed) {
11374
11415
  scaleX = abs$1(scaleX);
11375
11416
  scaleY = abs$1(scaleY);
@@ -11431,7 +11472,8 @@ function createPattern(ui, paint, pixelRatio) {
11431
11472
  const { abs } = Math;
11432
11473
  function checkImage(ui, canvas, paint, allowPaint) {
11433
11474
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11434
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY && !Export.running)) {
11475
+ const { pixelRatio } = canvas;
11476
+ if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
11435
11477
  return false;
11436
11478
  }
11437
11479
  else {
@@ -11439,8 +11481,8 @@ function checkImage(ui, canvas, paint, allowPaint) {
11439
11481
  if (allowPaint) {
11440
11482
  if (!data.repeat) {
11441
11483
  let { width, height } = data;
11442
- width *= abs(scaleX) * canvas.pixelRatio;
11443
- height *= abs(scaleY) * canvas.pixelRatio;
11484
+ width *= abs(scaleX) * pixelRatio;
11485
+ height *= abs(scaleY) * pixelRatio;
11444
11486
  if (data.scaleX) {
11445
11487
  width *= data.scaleX;
11446
11488
  height *= data.scaleY;
@@ -11466,14 +11508,14 @@ function checkImage(ui, canvas, paint, allowPaint) {
11466
11508
  }
11467
11509
  else {
11468
11510
  if (!paint.style || paint.sync || Export.running) {
11469
- createPattern(ui, paint, canvas.pixelRatio);
11511
+ createPattern(ui, paint, pixelRatio);
11470
11512
  }
11471
11513
  else {
11472
11514
  if (!paint.patternTask) {
11473
11515
  paint.patternTask = ImageManager.patternTasker.add(() => __awaiter(this, void 0, void 0, function* () {
11474
11516
  paint.patternTask = null;
11475
11517
  if (canvas.bounds.hit(ui.__nowWorld))
11476
- createPattern(ui, paint, canvas.pixelRatio);
11518
+ createPattern(ui, paint, pixelRatio);
11477
11519
  ui.forceUpdate('surface');
11478
11520
  }), 300);
11479
11521
  }
@@ -11537,14 +11579,16 @@ function linearGradient(paint, box) {
11537
11579
  return data;
11538
11580
  }
11539
11581
  function applyStops(gradient, stops, opacity) {
11540
- let stop;
11541
- for (let i = 0, len = stops.length; i < len; i++) {
11542
- stop = stops[i];
11543
- if (typeof stop === 'string') {
11544
- gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
11545
- }
11546
- else {
11547
- gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
11582
+ if (stops) {
11583
+ let stop;
11584
+ for (let i = 0, len = stops.length; i < len; i++) {
11585
+ stop = stops[i];
11586
+ if (typeof stop === 'string') {
11587
+ gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
11588
+ }
11589
+ else {
11590
+ gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
11591
+ }
11548
11592
  }
11549
11593
  }
11550
11594
  }
@@ -12300,10 +12344,15 @@ const TextConvertModule = {
12300
12344
  };
12301
12345
 
12302
12346
  function string(color, opacity) {
12303
- if (typeof color === 'string')
12304
- return color;
12347
+ const doOpacity = typeof opacity === 'number' && opacity !== 1;
12348
+ if (typeof color === 'string') {
12349
+ if (doOpacity && ColorConvert.object)
12350
+ color = ColorConvert.object(color);
12351
+ else
12352
+ return color;
12353
+ }
12305
12354
  let a = color.a === undefined ? 1 : color.a;
12306
- if (opacity)
12355
+ if (doOpacity)
12307
12356
  a *= opacity;
12308
12357
  const rgb = color.r + ',' + color.g + ',' + color.b;
12309
12358
  return a === 1 ? 'rgb(' + rgb + ')' : 'rgba(' + rgb + ',' + a + ')';
@@ -12515,4 +12564,4 @@ Object.assign(Creator, {
12515
12564
  });
12516
12565
  useCanvas();
12517
12566
 
12518
- 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$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, 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 };
12567
+ export { AlignHelper, 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, Eventer, Export, FileHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, 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, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, addInteractionWindow, 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 };