@leafer-ui/worker 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$e = 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$7 = 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
  class LeaferCanvas extends LeaferCanvasBase {
5829
5920
  get allowBackgroundColor() { return true; }
@@ -6050,9 +6141,13 @@ function updateBounds(boundsList) {
6050
6141
  });
6051
6142
  }
6052
6143
  function updateChange(updateList) {
6144
+ let layout;
6053
6145
  updateList.list.forEach(leaf => {
6054
- if (leaf.__layout.opacityChanged)
6146
+ layout = leaf.__layout;
6147
+ if (layout.opacityChanged)
6055
6148
  updateAllWorldOpacity(leaf);
6149
+ if (layout.stateStyleChanged)
6150
+ setTimeout(() => layout.stateStyleChanged && leaf.updateState());
6056
6151
  leaf.__updateChange();
6057
6152
  });
6058
6153
  }
@@ -6418,7 +6513,6 @@ class Renderer {
6418
6513
  Platform.requestRender(() => {
6419
6514
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - startTime)));
6420
6515
  if (this.running) {
6421
- this.target.emit(AnimateEvent.FRAME);
6422
6516
  if (this.changed && this.canvas.view)
6423
6517
  this.render();
6424
6518
  this.target.emit(RenderEvent.NEXT);
@@ -6763,36 +6857,6 @@ Object.assign(Creator, {
6763
6857
  });
6764
6858
  Platform.layout = Layouter.fullLayout;
6765
6859
 
6766
- const TextConvert = {};
6767
- const ColorConvert = {};
6768
- const PathArrow = {};
6769
- const Paint = {};
6770
- const PaintImage = {};
6771
- const PaintGradient = {};
6772
- const Effect = {};
6773
- const Export = {};
6774
- const State = {};
6775
-
6776
- function stateType(defaultValue) {
6777
- return decorateLeafAttr(defaultValue, (key) => attr({
6778
- set(value) {
6779
- this.__setAttr(key, value);
6780
- this.waitLeafer(() => { if (State.setStyle)
6781
- State.setStyle(this, key + 'Style', value); });
6782
- }
6783
- }));
6784
- }
6785
- function arrowType(defaultValue) {
6786
- return decorateLeafAttr(defaultValue, (key) => attr({
6787
- set(value) {
6788
- if (this.__setAttr(key, value)) {
6789
- const data = this.__;
6790
- data.__useArrow = data.startArrow !== 'none' || data.endArrow !== 'none';
6791
- doStrokeType(this);
6792
- }
6793
- }
6794
- }));
6795
- }
6796
6860
  function effectType(defaultValue) {
6797
6861
  return decorateLeafAttr(defaultValue, (key) => attr({
6798
6862
  set(value) {
@@ -6827,10 +6891,33 @@ function zoomLayerType() {
6827
6891
  };
6828
6892
  }
6829
6893
 
6894
+ const TextConvert = {};
6895
+ const ColorConvert = {};
6896
+ const PathArrow = {};
6897
+ const Paint = {};
6898
+ const PaintImage = {};
6899
+ const PaintGradient = {};
6900
+ const Effect = {};
6901
+ const Export = {};
6902
+ const State = {
6903
+ setStyleName(_leaf, _styleName, _value) { return needPlugin('state'); },
6904
+ set(_leaf, _stateName) { return needPlugin('state'); }
6905
+ };
6906
+ const Transition = {
6907
+ list: {},
6908
+ register(attrName, fn) {
6909
+ Transition.list[attrName] = fn;
6910
+ },
6911
+ get(attrName) {
6912
+ return Transition.list[attrName];
6913
+ }
6914
+ };
6915
+
6830
6916
  const { parse } = PathConvert;
6831
6917
  const emptyPaint = {};
6832
6918
  const debug$4 = Debug.get('UIData');
6833
6919
  class UIData extends LeafData {
6920
+ get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
6834
6921
  get __strokeWidth() {
6835
6922
  const { strokeWidth, strokeWidthFixed } = this;
6836
6923
  if (strokeWidthFixed) {
@@ -6849,9 +6936,10 @@ class UIData extends LeafData {
6849
6936
  get __autoSide() { return !this._width || !this._height; }
6850
6937
  get __autoSize() { return !this._width && !this._height; }
6851
6938
  setVisible(value) {
6852
- if (this.__leaf.leafer)
6853
- this.__leaf.leafer.watcher.hasVisible = true;
6854
6939
  this._visible = value;
6940
+ const { leafer } = this.__leaf;
6941
+ if (leafer)
6942
+ leafer.watcher.hasVisible = true;
6855
6943
  }
6856
6944
  setWidth(value) {
6857
6945
  if (value < 0) {
@@ -7042,7 +7130,7 @@ class ImageData extends RectData {
7042
7130
  __setImageFill(value) {
7043
7131
  if (this.__leaf.image)
7044
7132
  this.__leaf.image = null;
7045
- this.fill = value ? { type: 'image', mode: 'strench', url: value } : undefined;
7133
+ this.fill = value ? { type: 'image', mode: 'stretch', url: value } : undefined;
7046
7134
  }
7047
7135
  __getData() {
7048
7136
  const data = super.__getData();
@@ -7232,19 +7320,8 @@ var UI_1;
7232
7320
  let UI = UI_1 = class UI extends Leaf {
7233
7321
  get app() { return this.leafer && this.leafer.app; }
7234
7322
  get isFrame() { return false; }
7235
- set scale(value) {
7236
- if (typeof value === 'number') {
7237
- this.scaleX = this.scaleY = value;
7238
- }
7239
- else {
7240
- this.scaleX = value.x;
7241
- this.scaleY = value.y;
7242
- }
7243
- }
7244
- get scale() {
7245
- const { scaleX, scaleY } = this;
7246
- return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX;
7247
- }
7323
+ set scale(value) { MathHelper.assignScale(this, value); }
7324
+ get scale() { return this.__.scale; }
7248
7325
  get pen() {
7249
7326
  const { path } = this.__;
7250
7327
  pen.set(this.path = path || []);
@@ -7259,8 +7336,15 @@ let UI = UI_1 = class UI extends Leaf {
7259
7336
  super(data);
7260
7337
  }
7261
7338
  reset(_data) { }
7262
- set(data) {
7263
- Object.assign(this, data);
7339
+ set(data, isTemp) {
7340
+ if (isTemp) {
7341
+ this.lockNormalStyle = true;
7342
+ Object.assign(this, data);
7343
+ this.lockNormalStyle = false;
7344
+ }
7345
+ else {
7346
+ Object.assign(this, data);
7347
+ }
7264
7348
  }
7265
7349
  get(name) {
7266
7350
  return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -7323,11 +7407,18 @@ let UI = UI_1 = class UI extends Leaf {
7323
7407
  drawer.rect(x, y, width, height);
7324
7408
  }
7325
7409
  }
7410
+ animate(_keyframe, _options, _type, _isTemp) {
7411
+ return needPlugin('animate');
7412
+ }
7413
+ killAnimate(_type) { }
7326
7414
  export(filename, options) {
7327
7415
  return Export.export(this, filename, options);
7328
7416
  }
7329
- clone() {
7330
- return UI_1.one(this.toJSON());
7417
+ clone(newData) {
7418
+ const json = this.toJSON();
7419
+ if (newData)
7420
+ Object.assign(json, newData);
7421
+ return UI_1.one(json);
7331
7422
  }
7332
7423
  static one(data, x, y, width, height) {
7333
7424
  return UICreator.get(data.tag || this.prototype.__tag, data, x, y, width, height);
@@ -7343,6 +7434,8 @@ let UI = UI_1 = class UI extends Leaf {
7343
7434
  static setEditInner(_editorName) { }
7344
7435
  destroy() {
7345
7436
  this.fill = this.stroke = null;
7437
+ if (this.__animate)
7438
+ this.killAnimate();
7346
7439
  super.destroy();
7347
7440
  }
7348
7441
  };
@@ -7370,12 +7463,6 @@ __decorate([
7370
7463
  __decorate([
7371
7464
  visibleType(true)
7372
7465
  ], UI.prototype, "visible", void 0);
7373
- __decorate([
7374
- stateType(false)
7375
- ], UI.prototype, "selected", void 0);
7376
- __decorate([
7377
- stateType(false)
7378
- ], UI.prototype, "disabled", void 0);
7379
7466
  __decorate([
7380
7467
  surfaceType(false)
7381
7468
  ], UI.prototype, "locked", void 0);
@@ -7448,45 +7535,9 @@ __decorate([
7448
7535
  __decorate([
7449
7536
  pathType(true)
7450
7537
  ], UI.prototype, "closed", void 0);
7451
- __decorate([
7452
- autoLayoutType(false)
7453
- ], UI.prototype, "flow", void 0);
7454
7538
  __decorate([
7455
7539
  boundsType(0)
7456
7540
  ], UI.prototype, "padding", void 0);
7457
- __decorate([
7458
- boundsType(0)
7459
- ], UI.prototype, "gap", void 0);
7460
- __decorate([
7461
- boundsType('top-left')
7462
- ], UI.prototype, "flowAlign", void 0);
7463
- __decorate([
7464
- boundsType(false)
7465
- ], UI.prototype, "flowWrap", void 0);
7466
- __decorate([
7467
- boundsType('box')
7468
- ], UI.prototype, "itemBox", void 0);
7469
- __decorate([
7470
- boundsType(true)
7471
- ], UI.prototype, "inFlow", void 0);
7472
- __decorate([
7473
- boundsType()
7474
- ], UI.prototype, "autoWidth", void 0);
7475
- __decorate([
7476
- boundsType()
7477
- ], UI.prototype, "autoHeight", void 0);
7478
- __decorate([
7479
- boundsType()
7480
- ], UI.prototype, "lockRatio", void 0);
7481
- __decorate([
7482
- boundsType()
7483
- ], UI.prototype, "autoBox", void 0);
7484
- __decorate([
7485
- boundsType()
7486
- ], UI.prototype, "widthRange", void 0);
7487
- __decorate([
7488
- boundsType()
7489
- ], UI.prototype, "heightRange", void 0);
7490
7541
  __decorate([
7491
7542
  dataType(false)
7492
7543
  ], UI.prototype, "draggable", void 0);
@@ -7550,12 +7601,6 @@ __decorate([
7550
7601
  __decorate([
7551
7602
  strokeType(10)
7552
7603
  ], UI.prototype, "miterLimit", void 0);
7553
- __decorate([
7554
- arrowType('none')
7555
- ], UI.prototype, "startArrow", void 0);
7556
- __decorate([
7557
- arrowType('none')
7558
- ], UI.prototype, "endArrow", void 0);
7559
7604
  __decorate([
7560
7605
  pathType(0)
7561
7606
  ], UI.prototype, "cornerRadius", void 0);
@@ -7577,24 +7622,6 @@ __decorate([
7577
7622
  __decorate([
7578
7623
  effectType()
7579
7624
  ], UI.prototype, "grayscale", void 0);
7580
- __decorate([
7581
- dataType()
7582
- ], UI.prototype, "normalStyle", void 0);
7583
- __decorate([
7584
- dataType()
7585
- ], UI.prototype, "hoverStyle", void 0);
7586
- __decorate([
7587
- dataType()
7588
- ], UI.prototype, "pressStyle", void 0);
7589
- __decorate([
7590
- dataType()
7591
- ], UI.prototype, "focusStyle", void 0);
7592
- __decorate([
7593
- dataType()
7594
- ], UI.prototype, "selectedStyle", void 0);
7595
- __decorate([
7596
- dataType()
7597
- ], UI.prototype, "disabledStyle", void 0);
7598
7625
  __decorate([
7599
7626
  dataType({})
7600
7627
  ], UI.prototype, "data", void 0);
@@ -7621,7 +7648,7 @@ let Group = class Group extends UI {
7621
7648
  if (!this.children)
7622
7649
  this.children = [];
7623
7650
  }
7624
- set(data) {
7651
+ set(data, isTemp) {
7625
7652
  if (data.children) {
7626
7653
  const { children } = data;
7627
7654
  delete data.children;
@@ -7631,7 +7658,7 @@ let Group = class Group extends UI {
7631
7658
  else {
7632
7659
  this.clear();
7633
7660
  }
7634
- super.set(data);
7661
+ super.set(data, isTemp);
7635
7662
  let child;
7636
7663
  children.forEach(childData => {
7637
7664
  child = childData.__ ? childData : UICreator.get(childData.tag, childData);
@@ -7640,7 +7667,7 @@ let Group = class Group extends UI {
7640
7667
  data.children = children;
7641
7668
  }
7642
7669
  else {
7643
- super.set(data);
7670
+ super.set(data, isTemp);
7644
7671
  }
7645
7672
  }
7646
7673
  toJSON(options) {
@@ -7967,7 +7994,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7967
7994
  }
7968
7995
  }
7969
7996
  zoom(_zoomType, _padding, _fixedScale) {
7970
- return debug$3.error('need @leafer-in/view');
7997
+ return needPlugin('view');
7971
7998
  }
7972
7999
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
7973
8000
  getValidScale(changeScale) { return changeScale; }
@@ -8490,19 +8517,18 @@ let Canvas = class Canvas extends Rect {
8490
8517
  this.paint();
8491
8518
  }
8492
8519
  paint() {
8493
- this.forceUpdate('fill');
8520
+ this.forceRender();
8494
8521
  }
8495
8522
  __drawAfterFill(canvas, _options) {
8496
- const origin = this.canvas.view;
8497
- const { width, height } = this;
8498
- if (this.__.cornerRadius || this.pathInputed) {
8523
+ const { width, height, cornerRadius } = this.__, { view } = this.canvas;
8524
+ if (cornerRadius || this.pathInputed) {
8499
8525
  canvas.save();
8500
8526
  canvas.clip();
8501
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8527
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8502
8528
  canvas.restore();
8503
8529
  }
8504
8530
  else {
8505
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8531
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8506
8532
  }
8507
8533
  }
8508
8534
  __updateSize() {
@@ -8945,21 +8971,29 @@ class UIEvent extends Event {
8945
8971
  constructor(params) {
8946
8972
  super(params.type);
8947
8973
  this.bubbles = true;
8974
+ this.getInner = this.getInnerPoint;
8975
+ this.getLocal = this.getLocalPoint;
8976
+ this.getPage = this.getPagePoint;
8948
8977
  Object.assign(this, params);
8949
8978
  }
8950
- getPage() {
8951
- return this.current.getPagePoint(this);
8979
+ getBoxPoint(relative) {
8980
+ if (!relative)
8981
+ relative = this.current;
8982
+ return relative.getBoxPoint(this);
8952
8983
  }
8953
- getInner(relative) {
8984
+ getInnerPoint(relative) {
8954
8985
  if (!relative)
8955
8986
  relative = this.current;
8956
8987
  return relative.getInnerPoint(this);
8957
8988
  }
8958
- getLocal(relative) {
8989
+ getLocalPoint(relative) {
8959
8990
  if (!relative)
8960
8991
  relative = this.current;
8961
8992
  return relative.getLocalPoint(this);
8962
8993
  }
8994
+ getPagePoint() {
8995
+ return this.current.getPagePoint(this);
8996
+ }
8963
8997
  static changeName(oldName, newName) {
8964
8998
  EventCreator.changeName(oldName, newName);
8965
8999
  }
@@ -9067,7 +9101,7 @@ let DragEvent = class DragEvent extends PointerEvent {
9067
9101
  }
9068
9102
  getPageBounds() {
9069
9103
  const total = this.getPageTotal();
9070
- const start = this.getPage();
9104
+ const start = this.getPagePoint();
9071
9105
  const bounds = {};
9072
9106
  BoundsHelper.set(bounds, start.x - total.x, start.y - total.y, total.x, total.y);
9073
9107
  BoundsHelper.unsign(bounds);
@@ -9651,7 +9685,7 @@ function emitEvent(leaf, type, data, capture, excludePath) {
9651
9685
  if (leaf.destroyed)
9652
9686
  return false;
9653
9687
  if (leaf.__.hitSelf && !exclude(leaf, excludePath)) {
9654
- if (State.updateEventStyle)
9688
+ if (State.updateEventStyle && !capture)
9655
9689
  State.updateEventStyle(leaf, type);
9656
9690
  if (leaf.hasEvent(type, capture)) {
9657
9691
  data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
@@ -9756,7 +9790,7 @@ class InteractionBase {
9756
9790
  this.tapWait();
9757
9791
  this.longPressWait(data);
9758
9792
  }
9759
- this.waitMenuTap = PointerButton.right(data);
9793
+ this.waitRightTap = PointerButton.right(data);
9760
9794
  this.dragger.setDragData(data);
9761
9795
  if (!this.isHoldRightKey)
9762
9796
  this.updateCursor(data);
@@ -9784,7 +9818,7 @@ class InteractionBase {
9784
9818
  if (canDrag) {
9785
9819
  if (this.waitTap)
9786
9820
  this.pointerWaitCancel();
9787
- this.waitMenuTap = false;
9821
+ this.waitRightTap = false;
9788
9822
  }
9789
9823
  this.dragger.checkDrag(data, canDrag);
9790
9824
  }
@@ -9838,10 +9872,15 @@ class InteractionBase {
9838
9872
  menu(data) {
9839
9873
  this.findPath(data);
9840
9874
  this.emit(PointerEvent.MENU, data);
9875
+ this.waitMenuTap = true;
9876
+ if (!this.downData && this.waitRightTap)
9877
+ this.menuTap(data);
9841
9878
  }
9842
9879
  menuTap(data) {
9843
- if (this.waitMenuTap)
9880
+ if (this.waitRightTap && this.waitMenuTap) {
9844
9881
  this.emit(PointerEvent.MENU_TAP, data);
9882
+ this.waitRightTap = this.waitMenuTap = false;
9883
+ }
9845
9884
  }
9846
9885
  move(data) {
9847
9886
  this.transformer.move(data);
@@ -10685,6 +10724,8 @@ function getPatternData(paint, box, image) {
10685
10724
  let { width, height } = image;
10686
10725
  if (paint.padding)
10687
10726
  box = tempBox.set(box).shrink(paint.padding);
10727
+ if (paint.mode === 'strench')
10728
+ paint.mode = 'stretch';
10688
10729
  const { opacity, mode, align, offset, scale, size, rotation, repeat } = paint;
10689
10730
  const sameBox = box.width === width && box.height === height;
10690
10731
  const data = { mode };
@@ -10713,7 +10754,7 @@ function getPatternData(paint, box, image) {
10713
10754
  if (offset)
10714
10755
  x += offset.x, y += offset.y;
10715
10756
  switch (mode) {
10716
- case 'strench':
10757
+ case 'stretch':
10717
10758
  if (!sameBox)
10718
10759
  width = box.width, height = box.height;
10719
10760
  break;
@@ -10740,7 +10781,7 @@ function getPatternData(paint, box, image) {
10740
10781
  translate(data.transform, box.x, box.y);
10741
10782
  }
10742
10783
  }
10743
- if (scaleX && mode !== 'strench') {
10784
+ if (scaleX && mode !== 'stretch') {
10744
10785
  data.scaleX = scaleX;
10745
10786
  data.scaleY = scaleY;
10746
10787
  }
@@ -10844,7 +10885,7 @@ const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
10844
10885
  const { ceil, abs: abs$1 } = Math;
10845
10886
  function createPattern(ui, paint, pixelRatio) {
10846
10887
  let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
10847
- const id = scaleX + '-' + scaleY;
10888
+ const id = scaleX + '-' + scaleY + '-' + pixelRatio;
10848
10889
  if (paint.patternId !== id && !ui.destroyed) {
10849
10890
  scaleX = abs$1(scaleX);
10850
10891
  scaleY = abs$1(scaleY);
@@ -10906,7 +10947,8 @@ function createPattern(ui, paint, pixelRatio) {
10906
10947
  const { abs } = Math;
10907
10948
  function checkImage(ui, canvas, paint, allowPaint) {
10908
10949
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
10909
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY && !Export.running)) {
10950
+ const { pixelRatio } = canvas;
10951
+ if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
10910
10952
  return false;
10911
10953
  }
10912
10954
  else {
@@ -10914,8 +10956,8 @@ function checkImage(ui, canvas, paint, allowPaint) {
10914
10956
  if (allowPaint) {
10915
10957
  if (!data.repeat) {
10916
10958
  let { width, height } = data;
10917
- width *= abs(scaleX) * canvas.pixelRatio;
10918
- height *= abs(scaleY) * canvas.pixelRatio;
10959
+ width *= abs(scaleX) * pixelRatio;
10960
+ height *= abs(scaleY) * pixelRatio;
10919
10961
  if (data.scaleX) {
10920
10962
  width *= data.scaleX;
10921
10963
  height *= data.scaleY;
@@ -10941,14 +10983,14 @@ function checkImage(ui, canvas, paint, allowPaint) {
10941
10983
  }
10942
10984
  else {
10943
10985
  if (!paint.style || paint.sync || Export.running) {
10944
- createPattern(ui, paint, canvas.pixelRatio);
10986
+ createPattern(ui, paint, pixelRatio);
10945
10987
  }
10946
10988
  else {
10947
10989
  if (!paint.patternTask) {
10948
10990
  paint.patternTask = ImageManager.patternTasker.add(() => __awaiter(this, void 0, void 0, function* () {
10949
10991
  paint.patternTask = null;
10950
10992
  if (canvas.bounds.hit(ui.__nowWorld))
10951
- createPattern(ui, paint, canvas.pixelRatio);
10993
+ createPattern(ui, paint, pixelRatio);
10952
10994
  ui.forceUpdate('surface');
10953
10995
  }), 300);
10954
10996
  }
@@ -11012,14 +11054,16 @@ function linearGradient(paint, box) {
11012
11054
  return data;
11013
11055
  }
11014
11056
  function applyStops(gradient, stops, opacity) {
11015
- let stop;
11016
- for (let i = 0, len = stops.length; i < len; i++) {
11017
- stop = stops[i];
11018
- if (typeof stop === 'string') {
11019
- gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
11020
- }
11021
- else {
11022
- gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
11057
+ if (stops) {
11058
+ let stop;
11059
+ for (let i = 0, len = stops.length; i < len; i++) {
11060
+ stop = stops[i];
11061
+ if (typeof stop === 'string') {
11062
+ gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
11063
+ }
11064
+ else {
11065
+ gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
11066
+ }
11023
11067
  }
11024
11068
  }
11025
11069
  }
@@ -11775,10 +11819,15 @@ const TextConvertModule = {
11775
11819
  };
11776
11820
 
11777
11821
  function string(color, opacity) {
11778
- if (typeof color === 'string')
11779
- return color;
11822
+ const doOpacity = typeof opacity === 'number' && opacity !== 1;
11823
+ if (typeof color === 'string') {
11824
+ if (doOpacity && ColorConvert.object)
11825
+ color = ColorConvert.object(color);
11826
+ else
11827
+ return color;
11828
+ }
11780
11829
  let a = color.a === undefined ? 1 : color.a;
11781
- if (opacity)
11830
+ if (doOpacity)
11782
11831
  a *= opacity;
11783
11832
  const rgb = color.r + ',' + color.g + ',' + color.b;
11784
11833
  return a === 1 ? 'rgb(' + rgb + ')' : 'rgba(' + rgb + ',' + a + ')';
@@ -11990,4 +12039,4 @@ Object.assign(Creator, {
11990
12039
  });
11991
12040
  useCanvas();
11992
12041
 
11993
- export { AlignHelper, AnimateEvent, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragEvent, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Export, FileHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image, ImageData, ImageEvent, ImageManager, IncrementId, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, LeaferTypeCreator, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, addInteractionWindow, affectRenderBoundsType, affectStrokeBoundsType, arrowType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, inviteCode, layoutProcessor, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, stateType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix, tempPoint$3 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };
12042
+ 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, ImageData, ImageEvent, ImageManager, IncrementId, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, LeaferTypeCreator, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MultiTouchHelper, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, 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 };