leafer-ui 1.0.2 → 1.0.4

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) {
@@ -4451,15 +4483,16 @@ class LeafLayout {
4451
4483
  }
4452
4484
  getLayoutBounds(type, relative = 'world', unscale) {
4453
4485
  const { leaf } = this;
4454
- let point, matrix, bounds = this.getInnerBounds(type);
4486
+ let point, matrix, layoutBounds, bounds = this.getInnerBounds(type);
4455
4487
  switch (relative) {
4456
4488
  case 'world':
4457
4489
  point = leaf.getWorldPoint(bounds);
4458
4490
  matrix = leaf.__world;
4459
4491
  break;
4460
4492
  case 'local':
4493
+ const { scaleX, scaleY, rotation, skewX, skewY } = leaf.__;
4494
+ layoutBounds = { scaleX, scaleY, rotation, skewX, skewY };
4461
4495
  point = leaf.getLocalPointByInner(bounds);
4462
- matrix = leaf.__localMatrix;
4463
4496
  break;
4464
4497
  case 'inner':
4465
4498
  point = bounds;
@@ -4471,7 +4504,8 @@ class LeafLayout {
4471
4504
  point = leaf.getWorldPoint(bounds, relative);
4472
4505
  matrix = getRelativeWorld$1(leaf, relative, true);
4473
4506
  }
4474
- const layoutBounds = MatrixHelper.getLayout(matrix);
4507
+ if (!layoutBounds)
4508
+ layoutBounds = MatrixHelper.getLayout(matrix);
4475
4509
  copy$6(layoutBounds, bounds);
4476
4510
  PointHelper.copy(layoutBounds, point);
4477
4511
  if (unscale) {
@@ -4594,144 +4628,6 @@ class LeafLayout {
4594
4628
  destroy() { }
4595
4629
  }
4596
4630
 
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
4631
  class Event {
4736
4632
  constructor(type, target) {
4737
4633
  this.bubbles = false;
@@ -4766,7 +4662,10 @@ class ChildEvent extends Event {
4766
4662
  }
4767
4663
  ChildEvent.ADD = 'child.add';
4768
4664
  ChildEvent.REMOVE = 'child.remove';
4769
- ChildEvent.DESTROY = 'child.destroy';
4665
+ ChildEvent.CREATED = 'created';
4666
+ ChildEvent.MOUNTED = 'mounted';
4667
+ ChildEvent.UNMOUNTED = 'unmounted';
4668
+ ChildEvent.DESTROY = 'destroy';
4770
4669
 
4771
4670
  class PropertyEvent extends Event {
4772
4671
  constructor(type, target, attrName, oldValue, newValue) {
@@ -4844,10 +4743,6 @@ LayoutEvent.AFTER = 'layout.after';
4844
4743
  LayoutEvent.AGAIN = 'layout.again';
4845
4744
  LayoutEvent.END = 'layout.end';
4846
4745
 
4847
- class AnimateEvent extends Event {
4848
- }
4849
- AnimateEvent.FRAME = 'animate.frame';
4850
-
4851
4746
  class RenderEvent extends Event {
4852
4747
  constructor(type, times, bounds, options) {
4853
4748
  super(type);
@@ -4880,6 +4775,157 @@ LeaferEvent.STOP = 'leafer.stop';
4880
4775
  LeaferEvent.RESTART = 'leafer.restart';
4881
4776
  LeaferEvent.END = 'leafer.end';
4882
4777
 
4778
+ const empty = {};
4779
+ class Eventer {
4780
+ set event(map) { this.on(map); }
4781
+ on(type, listener, options) {
4782
+ if (!listener) {
4783
+ let event, map = type;
4784
+ for (let key in map)
4785
+ event = map[key], event instanceof Array ? this.on(key, event[0], event[1]) : this.on(key, event);
4786
+ return;
4787
+ }
4788
+ let capture, once;
4789
+ if (options) {
4790
+ if (options === 'once') {
4791
+ once = true;
4792
+ }
4793
+ else if (typeof options === 'boolean') {
4794
+ capture = options;
4795
+ }
4796
+ else {
4797
+ capture = options.capture;
4798
+ once = options.once;
4799
+ }
4800
+ }
4801
+ let events;
4802
+ const map = __getListenerMap(this, capture, true);
4803
+ const typeList = typeof type === 'string' ? type.split(' ') : type;
4804
+ const item = once ? { listener, once } : { listener };
4805
+ typeList.forEach(type => {
4806
+ if (type) {
4807
+ events = map[type];
4808
+ if (events) {
4809
+ if (events.findIndex(item => item.listener === listener) === -1)
4810
+ events.push(item);
4811
+ }
4812
+ else {
4813
+ map[type] = [item];
4814
+ }
4815
+ }
4816
+ });
4817
+ }
4818
+ off(type, listener, options) {
4819
+ if (type) {
4820
+ const typeList = typeof type === 'string' ? type.split(' ') : type;
4821
+ if (listener) {
4822
+ let capture;
4823
+ if (options)
4824
+ capture = typeof options === 'boolean' ? options : (options === 'once' ? false : options.capture);
4825
+ let events, index;
4826
+ const map = __getListenerMap(this, capture);
4827
+ typeList.forEach(type => {
4828
+ if (type) {
4829
+ events = map[type];
4830
+ if (events) {
4831
+ index = events.findIndex(item => item.listener === listener);
4832
+ if (index > -1)
4833
+ events.splice(index, 1);
4834
+ if (!events.length)
4835
+ delete map[type];
4836
+ }
4837
+ }
4838
+ });
4839
+ }
4840
+ else {
4841
+ const { __bubbleMap: b, __captureMap: c } = this;
4842
+ typeList.forEach(type => {
4843
+ if (b)
4844
+ delete b[type];
4845
+ if (c)
4846
+ delete c[type];
4847
+ });
4848
+ }
4849
+ }
4850
+ else {
4851
+ this.__bubbleMap = this.__captureMap = undefined;
4852
+ }
4853
+ }
4854
+ on_(type, listener, bind, options) {
4855
+ if (bind)
4856
+ listener = listener.bind(bind);
4857
+ this.on(type, listener, options);
4858
+ return { type, current: this, listener, options };
4859
+ }
4860
+ off_(id) {
4861
+ if (!id)
4862
+ return;
4863
+ const list = id instanceof Array ? id : [id];
4864
+ list.forEach(item => item.current.off(item.type, item.listener, item.options));
4865
+ list.length = 0;
4866
+ }
4867
+ once(type, listener, capture) {
4868
+ this.on(type, listener, { once: true, capture });
4869
+ }
4870
+ emit(type, event, capture) {
4871
+ if (!event && EventCreator.has(type))
4872
+ event = EventCreator.get(type, { type, target: this, current: this });
4873
+ const map = __getListenerMap(this, capture);
4874
+ const list = map[type];
4875
+ if (list) {
4876
+ let item;
4877
+ for (let i = 0, len = list.length; i < len; i++) {
4878
+ item = list[i];
4879
+ item.listener(event);
4880
+ if (item.once) {
4881
+ this.off(type, item.listener, capture);
4882
+ i--, len--;
4883
+ }
4884
+ if (event && event.isStopNow)
4885
+ break;
4886
+ }
4887
+ }
4888
+ this.syncEventer && this.syncEventer.emitEvent(event, capture);
4889
+ }
4890
+ emitEvent(event, capture) {
4891
+ event.current = this;
4892
+ this.emit(event.type, event, capture);
4893
+ }
4894
+ hasEvent(type, capture) {
4895
+ if (this.syncEventer && this.syncEventer.hasEvent(type, capture))
4896
+ return true;
4897
+ const { __bubbleMap: b, __captureMap: c } = this;
4898
+ const hasB = b && b[type], hasC = c && c[type];
4899
+ return !!(capture === undefined ? (hasB || hasC) : (capture ? hasC : hasB));
4900
+ }
4901
+ destroy() {
4902
+ this.__captureMap = this.__bubbleMap = this.syncEventer = null;
4903
+ }
4904
+ }
4905
+ function __getListenerMap(eventer, capture, create) {
4906
+ if (capture) {
4907
+ const { __captureMap: c } = eventer;
4908
+ if (c) {
4909
+ return c;
4910
+ }
4911
+ else {
4912
+ return create ? eventer.__captureMap = {} : empty;
4913
+ }
4914
+ }
4915
+ else {
4916
+ const { __bubbleMap: b } = eventer;
4917
+ if (b) {
4918
+ return b;
4919
+ }
4920
+ else {
4921
+ return create ? eventer.__bubbleMap = {} : empty;
4922
+ }
4923
+ }
4924
+ }
4925
+
4926
+ const { on, on_, off, off_, once, emit: emit$2, emitEvent: emitEvent$1, hasEvent, destroy } = Eventer.prototype;
4927
+ const LeafEventer = { on, on_, off, off_, once, emit: emit$2, emitEvent: emitEvent$1, hasEvent, destroyEventer: destroy };
4928
+
4883
4929
  const { isFinite } = Number;
4884
4930
  const debug$8 = Debug.get('setAttr');
4885
4931
  const LeafDataProxy = {
@@ -4891,9 +4937,7 @@ const LeafDataProxy = {
4891
4937
  newValue = undefined;
4892
4938
  }
4893
4939
  if (typeof newValue === 'object' || oldValue !== newValue) {
4894
- this.__[name] = newValue;
4895
- if (this.__proxyData)
4896
- this.setProxyAttr(name, newValue);
4940
+ this.__realSetAttr(name, newValue);
4897
4941
  const { CHANGE } = PropertyEvent;
4898
4942
  const event = new PropertyEvent(CHANGE, this, name, oldValue, newValue);
4899
4943
  if (this.isLeafer) {
@@ -4911,12 +4955,18 @@ const LeafDataProxy = {
4911
4955
  }
4912
4956
  }
4913
4957
  else {
4914
- this.__[name] = newValue;
4915
- if (this.__proxyData)
4916
- this.setProxyAttr(name, newValue);
4958
+ this.__realSetAttr(name, newValue);
4917
4959
  return true;
4918
4960
  }
4919
4961
  },
4962
+ __realSetAttr(name, newValue) {
4963
+ const data = this.__;
4964
+ data[name] = newValue;
4965
+ if (this.__proxyData)
4966
+ this.setProxyAttr(name, newValue);
4967
+ if (data.normalStyle)
4968
+ this.lockNormalStyle || data.normalStyle[name] === undefined || (data.normalStyle[name] = newValue);
4969
+ },
4920
4970
  __getAttr(name) {
4921
4971
  if (this.__proxyData)
4922
4972
  return this.getProxyAttr(name);
@@ -5019,6 +5069,8 @@ const LeafBounds = {
5019
5069
  layout.boundsChanged = false;
5020
5070
  },
5021
5071
  __updateLocalBoxBounds() {
5072
+ if (this.__hasMotionPath)
5073
+ this.__updateMotionPath();
5022
5074
  if (this.__hasAutoLayout)
5023
5075
  this.__updateAutoLayout();
5024
5076
  toOuterOf$1(this.__layout.boxBounds, this.__local, this.__local);
@@ -5171,7 +5223,7 @@ const BranchRender = {
5171
5223
  const { LEAF, create } = IncrementId;
5172
5224
  const { toInnerPoint, toOuterPoint, multiplyParent } = MatrixHelper;
5173
5225
  const { toOuterOf } = BoundsHelper;
5174
- const { copy: copy$4 } = PointHelper;
5226
+ const { copy: copy$4, move: move$1 } = PointHelper;
5175
5227
  const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getFlipTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
5176
5228
  let Leaf = class Leaf {
5177
5229
  get tag() { return this.__tag; }
@@ -5198,13 +5250,16 @@ let Leaf = class Leaf {
5198
5250
  get __ignoreHitWorld() { return (this.__hasMask || this.__hasEraser) && this.__.hitChildren; }
5199
5251
  get __inLazyBounds() { const { leafer } = this; return leafer && leafer.created && leafer.lazyBounds.hit(this.__world); }
5200
5252
  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); }
5253
+ set event(map) { this.on(map); }
5203
5254
  constructor(data) {
5204
5255
  this.innerId = create(LEAF);
5205
5256
  this.reset(data);
5257
+ if (this.__bubbleMap)
5258
+ this.__emitLifeEvent(ChildEvent.CREATED);
5206
5259
  }
5207
5260
  reset(data) {
5261
+ if (this.leafer)
5262
+ this.leafer.forceRender(this.__world);
5208
5263
  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
5264
  if (data !== null)
5210
5265
  this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
@@ -5226,12 +5281,12 @@ let Leaf = class Leaf {
5226
5281
  waitParent(item, bind) {
5227
5282
  if (bind)
5228
5283
  item = item.bind(bind);
5229
- this.parent ? item() : (this.__parentWait ? this.__parentWait.push(item) : this.__parentWait = [item]);
5284
+ this.parent ? item() : this.on(ChildEvent.ADD, item, 'once');
5230
5285
  }
5231
5286
  waitLeafer(item, bind) {
5232
5287
  if (bind)
5233
5288
  item = item.bind(bind);
5234
- this.leafer ? item() : (this.__leaferWait ? this.__leaferWait.push(item) : this.__leaferWait = [item]);
5289
+ this.leafer ? item() : this.on(ChildEvent.MOUNTED, item, 'once');
5235
5290
  }
5236
5291
  nextRender(item, bind, off) {
5237
5292
  this.leafer ? this.leafer.nextRender(item, bind, off) : this.waitLeafer(() => this.leafer.nextRender(item, bind, off));
@@ -5240,18 +5295,21 @@ let Leaf = class Leaf {
5240
5295
  this.nextRender(item, null, 'off');
5241
5296
  }
5242
5297
  __bindLeafer(leafer) {
5243
- if (this.isLeafer) {
5244
- if (leafer !== null)
5245
- leafer = this;
5246
- }
5298
+ if (this.isLeafer && leafer !== null)
5299
+ leafer = this;
5247
5300
  if (this.leafer && !leafer)
5248
5301
  this.leafer.leafs--;
5249
5302
  this.leafer = leafer;
5250
5303
  if (leafer) {
5251
5304
  leafer.leafs++;
5252
5305
  this.__level = this.parent ? this.parent.__level + 1 : 1;
5253
- if (this.__leaferWait)
5254
- WaitHelper.run(this.__leaferWait);
5306
+ if (this.animation)
5307
+ this.__runAnimation('in');
5308
+ if (this.__bubbleMap)
5309
+ this.__emitLifeEvent(ChildEvent.MOUNTED);
5310
+ }
5311
+ else {
5312
+ this.__emitLifeEvent(ChildEvent.UNMOUNTED);
5255
5313
  }
5256
5314
  if (this.isBranch) {
5257
5315
  const { children } = this;
@@ -5260,7 +5318,7 @@ let Leaf = class Leaf {
5260
5318
  }
5261
5319
  }
5262
5320
  }
5263
- set(_data) { }
5321
+ set(_data, _isTemp) { }
5264
5322
  get(_name) { return undefined; }
5265
5323
  setAttr(name, value) { this[name] = value; }
5266
5324
  getAttr(name) { return this[name]; }
@@ -5285,6 +5343,7 @@ let Leaf = class Leaf {
5285
5343
  findOne(_condition, _options) { return undefined; }
5286
5344
  findId(_id) { return undefined; }
5287
5345
  focus(_value) { }
5346
+ updateState() { }
5288
5347
  updateLayout() {
5289
5348
  this.__layout.update();
5290
5349
  }
@@ -5392,11 +5451,24 @@ let Leaf = class Leaf {
5392
5451
  if (relative)
5393
5452
  relative.worldToInner(to ? to : inner, null, distance);
5394
5453
  }
5454
+ getBoxPoint(world, relative, distance, change) {
5455
+ return this.getBoxPointByInner(this.getInnerPoint(world, relative, distance, change), null, null, true);
5456
+ }
5457
+ getBoxPointByInner(inner, _relative, _distance, change) {
5458
+ const point = change ? inner : Object.assign({}, inner), { x, y } = this.boxBounds;
5459
+ move$1(point, -x, -y);
5460
+ return point;
5461
+ }
5395
5462
  getInnerPoint(world, relative, distance, change) {
5396
5463
  const point = change ? world : {};
5397
5464
  this.worldToInner(world, point, distance, relative);
5398
5465
  return point;
5399
5466
  }
5467
+ getInnerPointByBox(box, _relative, _distance, change) {
5468
+ const point = change ? box : Object.assign({}, box), { x, y } = this.boxBounds;
5469
+ move$1(point, x, y);
5470
+ return point;
5471
+ }
5400
5472
  getInnerPointByLocal(local, _relative, distance, change) {
5401
5473
  return this.getInnerPoint(local, this.parent, distance, change);
5402
5474
  }
@@ -5408,20 +5480,23 @@ let Leaf = class Leaf {
5408
5480
  getLocalPointByInner(inner, _relative, distance, change) {
5409
5481
  return this.getWorldPoint(inner, this.parent, distance, change);
5410
5482
  }
5483
+ getPagePoint(world, relative, distance, change) {
5484
+ const layer = this.leafer ? this.leafer.zoomLayer : this;
5485
+ return layer.getInnerPoint(world, relative, distance, change);
5486
+ }
5411
5487
  getWorldPoint(inner, relative, distance, change) {
5412
5488
  const point = change ? inner : {};
5413
5489
  this.innerToWorld(inner, point, distance, relative);
5414
5490
  return point;
5415
5491
  }
5492
+ getWorldPointByBox(box, relative, distance, change) {
5493
+ return this.getWorldPoint(this.getInnerPointByBox(box, null, null, change), relative, distance, true);
5494
+ }
5416
5495
  getWorldPointByLocal(local, relative, distance, change) {
5417
5496
  const point = change ? local : {};
5418
5497
  this.localToWorld(local, point, distance, relative);
5419
5498
  return point;
5420
5499
  }
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
5500
  getWorldPointByPage(page, relative, distance, change) {
5426
5501
  const layer = this.leafer ? this.leafer.zoomLayer : this;
5427
5502
  return layer.getWorldPoint(page, relative, distance, change);
@@ -5490,6 +5565,17 @@ let Leaf = class Leaf {
5490
5565
  __drawRenderPath(_canvas) { }
5491
5566
  __updatePath() { }
5492
5567
  __updateRenderPath() { }
5568
+ getMotionPathData() {
5569
+ return needPlugin('path');
5570
+ }
5571
+ getMotionPoint(_motionDistance) {
5572
+ return needPlugin('path');
5573
+ }
5574
+ getMotionTotal() {
5575
+ return 0;
5576
+ }
5577
+ __updateMotionPath() { }
5578
+ __runAnimation(_type, _complete) { }
5493
5579
  __updateSortChildren() { }
5494
5580
  add(_child, _index) { }
5495
5581
  remove(_child, destroy) {
@@ -5515,6 +5601,10 @@ let Leaf = class Leaf {
5515
5601
  fn = boundsType;
5516
5602
  fn(defaultValue)(this.prototype, attrName);
5517
5603
  }
5604
+ __emitLifeEvent(type) {
5605
+ if (this.hasEvent(type))
5606
+ this.emitEvent(new ChildEvent(type, this, this.parent));
5607
+ }
5518
5608
  destroy() {
5519
5609
  if (!this.destroyed) {
5520
5610
  const { parent } = this;
@@ -5522,11 +5612,10 @@ let Leaf = class Leaf {
5522
5612
  this.remove();
5523
5613
  if (this.children)
5524
5614
  this.removeAll(true);
5525
- if (this.hasEvent(ChildEvent.DESTROY))
5526
- this.emitEvent(new ChildEvent(ChildEvent.DESTROY, this, parent));
5615
+ this.__emitLifeEvent(ChildEvent.DESTROY);
5527
5616
  this.__.destroy();
5528
5617
  this.__layout.destroy();
5529
- this.__captureMap = this.__bubbleMap = this.__parentWait = this.__leaferWait = null;
5618
+ this.destroyEventer();
5530
5619
  this.destroyed = true;
5531
5620
  }
5532
5621
  }
@@ -5592,8 +5681,8 @@ let Branch = class Branch extends Leaf {
5592
5681
  this.__.__childBranchNumber = (this.__.__childBranchNumber || 0) + 1;
5593
5682
  child.__layout.boxChanged || child.__layout.boxChange();
5594
5683
  child.__layout.matrixChanged || child.__layout.matrixChange();
5595
- if (child.__parentWait)
5596
- WaitHelper.run(child.__parentWait);
5684
+ if (child.__bubbleMap)
5685
+ child.__emitLifeEvent(ChildEvent.ADD);
5597
5686
  if (this.leafer) {
5598
5687
  child.__bindLeafer(this.leafer);
5599
5688
  if (this.leafer.created)
@@ -5606,16 +5695,10 @@ let Branch = class Branch extends Leaf {
5606
5695
  }
5607
5696
  remove(child, destroy) {
5608
5697
  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
- }
5698
+ if (child.animationOut)
5699
+ child.__runAnimation('out', () => this.__remove(child, destroy));
5700
+ else
5701
+ this.__remove(child, destroy);
5619
5702
  }
5620
5703
  else if (child === undefined) {
5621
5704
  super.remove(null, destroy);
@@ -5637,6 +5720,18 @@ let Branch = class Branch extends Leaf {
5637
5720
  clear() {
5638
5721
  this.removeAll(true);
5639
5722
  }
5723
+ __remove(child, destroy) {
5724
+ const index = this.children.indexOf(child);
5725
+ if (index > -1) {
5726
+ this.children.splice(index, 1);
5727
+ if (child.isBranch)
5728
+ this.__.__childBranchNumber = (this.__.__childBranchNumber || 1) - 1;
5729
+ this.__preRemove();
5730
+ this.__realRemoveChild(child);
5731
+ if (destroy)
5732
+ child.destroy();
5733
+ }
5734
+ }
5640
5735
  __preRemove() {
5641
5736
  if (this.__hasMask)
5642
5737
  this.__updateMask();
@@ -5646,6 +5741,7 @@ let Branch = class Branch extends Leaf {
5646
5741
  this.__layout.affectChildrenSort && this.__layout.childrenSortChange();
5647
5742
  }
5648
5743
  __realRemoveChild(child) {
5744
+ child.__emitLifeEvent(ChildEvent.REMOVE);
5649
5745
  child.parent = null;
5650
5746
  if (this.leafer) {
5651
5747
  child.__bindLeafer(null);
@@ -5658,8 +5754,6 @@ let Branch = class Branch extends Leaf {
5658
5754
  }
5659
5755
  __emitChildEvent(type, child) {
5660
5756
  const event = new ChildEvent(type, child, this);
5661
- if (child.hasEvent(type))
5662
- child.emitEvent(event);
5663
5757
  if (this.hasEvent(type) && !this.isLeafer)
5664
5758
  this.emitEvent(event);
5665
5759
  this.leafer.emitEvent(event);
@@ -5822,8 +5916,7 @@ class LeafLevelList {
5822
5916
  }
5823
5917
  }
5824
5918
 
5825
- const version = "1.0.1";
5826
- const inviteCode = {};
5919
+ const version = "1.0.4";
5827
5920
 
5828
5921
  const debug$7 = Debug.get('LeaferCanvas');
5829
5922
  class LeaferCanvas extends LeaferCanvasBase {
@@ -6223,9 +6316,13 @@ function updateBounds(boundsList) {
6223
6316
  });
6224
6317
  }
6225
6318
  function updateChange(updateList) {
6319
+ let layout;
6226
6320
  updateList.list.forEach(leaf => {
6227
- if (leaf.__layout.opacityChanged)
6321
+ layout = leaf.__layout;
6322
+ if (layout.opacityChanged)
6228
6323
  updateAllWorldOpacity(leaf);
6324
+ if (layout.stateStyleChanged)
6325
+ setTimeout(() => layout.stateStyleChanged && leaf.updateState());
6229
6326
  leaf.__updateChange();
6230
6327
  });
6231
6328
  }
@@ -6591,7 +6688,6 @@ class Renderer {
6591
6688
  Platform.requestRender(() => {
6592
6689
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - startTime)));
6593
6690
  if (this.running) {
6594
- this.target.emit(AnimateEvent.FRAME);
6595
6691
  if (this.changed && this.canvas.view)
6596
6692
  this.render();
6597
6693
  this.target.emit(RenderEvent.NEXT);
@@ -6936,36 +7032,6 @@ Object.assign(Creator, {
6936
7032
  });
6937
7033
  Platform.layout = Layouter.fullLayout;
6938
7034
 
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
7035
  function effectType(defaultValue) {
6970
7036
  return decorateLeafAttr(defaultValue, (key) => attr({
6971
7037
  set(value) {
@@ -7000,10 +7066,33 @@ function zoomLayerType() {
7000
7066
  };
7001
7067
  }
7002
7068
 
7069
+ const TextConvert = {};
7070
+ const ColorConvert = {};
7071
+ const PathArrow = {};
7072
+ const Paint = {};
7073
+ const PaintImage = {};
7074
+ const PaintGradient = {};
7075
+ const Effect = {};
7076
+ const Export = {};
7077
+ const State = {
7078
+ setStyleName(_leaf, _styleName, _value) { return needPlugin('state'); },
7079
+ set(_leaf, _stateName) { return needPlugin('state'); }
7080
+ };
7081
+ const Transition = {
7082
+ list: {},
7083
+ register(attrName, fn) {
7084
+ Transition.list[attrName] = fn;
7085
+ },
7086
+ get(attrName) {
7087
+ return Transition.list[attrName];
7088
+ }
7089
+ };
7090
+
7003
7091
  const { parse } = PathConvert;
7004
7092
  const emptyPaint = {};
7005
7093
  const debug$4 = Debug.get('UIData');
7006
7094
  class UIData extends LeafData {
7095
+ get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
7007
7096
  get __strokeWidth() {
7008
7097
  const { strokeWidth, strokeWidthFixed } = this;
7009
7098
  if (strokeWidthFixed) {
@@ -7022,9 +7111,10 @@ class UIData extends LeafData {
7022
7111
  get __autoSide() { return !this._width || !this._height; }
7023
7112
  get __autoSize() { return !this._width && !this._height; }
7024
7113
  setVisible(value) {
7025
- if (this.__leaf.leafer)
7026
- this.__leaf.leafer.watcher.hasVisible = true;
7027
7114
  this._visible = value;
7115
+ const { leafer } = this.__leaf;
7116
+ if (leafer)
7117
+ leafer.watcher.hasVisible = true;
7028
7118
  }
7029
7119
  setWidth(value) {
7030
7120
  if (value < 0) {
@@ -7215,7 +7305,7 @@ class ImageData extends RectData {
7215
7305
  __setImageFill(value) {
7216
7306
  if (this.__leaf.image)
7217
7307
  this.__leaf.image = null;
7218
- this.fill = value ? { type: 'image', mode: 'strench', url: value } : undefined;
7308
+ this.fill = value ? { type: 'image', mode: 'stretch', url: value } : undefined;
7219
7309
  }
7220
7310
  __getData() {
7221
7311
  const data = super.__getData();
@@ -7405,19 +7495,8 @@ var UI_1;
7405
7495
  let UI = UI_1 = class UI extends Leaf {
7406
7496
  get app() { return this.leafer && this.leafer.app; }
7407
7497
  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
- }
7498
+ set scale(value) { MathHelper.assignScale(this, value); }
7499
+ get scale() { return this.__.scale; }
7421
7500
  get pen() {
7422
7501
  const { path } = this.__;
7423
7502
  pen.set(this.path = path || []);
@@ -7432,8 +7511,15 @@ let UI = UI_1 = class UI extends Leaf {
7432
7511
  super(data);
7433
7512
  }
7434
7513
  reset(_data) { }
7435
- set(data) {
7436
- Object.assign(this, data);
7514
+ set(data, isTemp) {
7515
+ if (isTemp) {
7516
+ this.lockNormalStyle = true;
7517
+ Object.assign(this, data);
7518
+ this.lockNormalStyle = false;
7519
+ }
7520
+ else {
7521
+ Object.assign(this, data);
7522
+ }
7437
7523
  }
7438
7524
  get(name) {
7439
7525
  return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -7496,11 +7582,18 @@ let UI = UI_1 = class UI extends Leaf {
7496
7582
  drawer.rect(x, y, width, height);
7497
7583
  }
7498
7584
  }
7585
+ animate(_keyframe, _options, _type, _isTemp) {
7586
+ return needPlugin('animate');
7587
+ }
7588
+ killAnimate(_type) { }
7499
7589
  export(filename, options) {
7500
7590
  return Export.export(this, filename, options);
7501
7591
  }
7502
- clone() {
7503
- return UI_1.one(this.toJSON());
7592
+ clone(data) {
7593
+ const json = this.toJSON();
7594
+ if (data)
7595
+ Object.assign(json, data);
7596
+ return UI_1.one(json);
7504
7597
  }
7505
7598
  static one(data, x, y, width, height) {
7506
7599
  return UICreator.get(data.tag || this.prototype.__tag, data, x, y, width, height);
@@ -7516,6 +7609,8 @@ let UI = UI_1 = class UI extends Leaf {
7516
7609
  static setEditInner(_editorName) { }
7517
7610
  destroy() {
7518
7611
  this.fill = this.stroke = null;
7612
+ if (this.__animate)
7613
+ this.killAnimate();
7519
7614
  super.destroy();
7520
7615
  }
7521
7616
  };
@@ -7543,12 +7638,6 @@ __decorate([
7543
7638
  __decorate([
7544
7639
  visibleType(true)
7545
7640
  ], 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
7641
  __decorate([
7553
7642
  surfaceType(false)
7554
7643
  ], UI.prototype, "locked", void 0);
@@ -7621,45 +7710,9 @@ __decorate([
7621
7710
  __decorate([
7622
7711
  pathType(true)
7623
7712
  ], UI.prototype, "closed", void 0);
7624
- __decorate([
7625
- autoLayoutType(false)
7626
- ], UI.prototype, "flow", void 0);
7627
7713
  __decorate([
7628
7714
  boundsType(0)
7629
7715
  ], 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
7716
  __decorate([
7664
7717
  dataType(false)
7665
7718
  ], UI.prototype, "draggable", void 0);
@@ -7723,12 +7776,6 @@ __decorate([
7723
7776
  __decorate([
7724
7777
  strokeType(10)
7725
7778
  ], 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
7779
  __decorate([
7733
7780
  pathType(0)
7734
7781
  ], UI.prototype, "cornerRadius", void 0);
@@ -7750,24 +7797,6 @@ __decorate([
7750
7797
  __decorate([
7751
7798
  effectType()
7752
7799
  ], 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
7800
  __decorate([
7772
7801
  dataType({})
7773
7802
  ], UI.prototype, "data", void 0);
@@ -7794,7 +7823,7 @@ let Group = class Group extends UI {
7794
7823
  if (!this.children)
7795
7824
  this.children = [];
7796
7825
  }
7797
- set(data) {
7826
+ set(data, isTemp) {
7798
7827
  if (data.children) {
7799
7828
  const { children } = data;
7800
7829
  delete data.children;
@@ -7804,7 +7833,7 @@ let Group = class Group extends UI {
7804
7833
  else {
7805
7834
  this.clear();
7806
7835
  }
7807
- super.set(data);
7836
+ super.set(data, isTemp);
7808
7837
  let child;
7809
7838
  children.forEach(childData => {
7810
7839
  child = childData.__ ? childData : UICreator.get(childData.tag, childData);
@@ -7813,7 +7842,7 @@ let Group = class Group extends UI {
7813
7842
  data.children = children;
7814
7843
  }
7815
7844
  else {
7816
- super.set(data);
7845
+ super.set(data, isTemp);
7817
7846
  }
7818
7847
  }
7819
7848
  toJSON(options) {
@@ -8140,7 +8169,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8140
8169
  }
8141
8170
  }
8142
8171
  zoom(_zoomType, _padding, _fixedScale) {
8143
- return debug$3.error('need @leafer-in/view');
8172
+ return needPlugin('view');
8144
8173
  }
8145
8174
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
8146
8175
  getValidScale(changeScale) { return changeScale; }
@@ -8663,19 +8692,18 @@ let Canvas = class Canvas extends Rect {
8663
8692
  this.paint();
8664
8693
  }
8665
8694
  paint() {
8666
- this.forceUpdate('fill');
8695
+ this.forceRender();
8667
8696
  }
8668
8697
  __drawAfterFill(canvas, _options) {
8669
- const origin = this.canvas.view;
8670
- const { width, height } = this;
8671
- if (this.__.cornerRadius || this.pathInputed) {
8698
+ const { width, height, cornerRadius } = this.__, { view } = this.canvas;
8699
+ if (cornerRadius || this.pathInputed) {
8672
8700
  canvas.save();
8673
8701
  canvas.clip();
8674
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8702
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8675
8703
  canvas.restore();
8676
8704
  }
8677
8705
  else {
8678
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8706
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8679
8707
  }
8680
8708
  }
8681
8709
  __updateSize() {
@@ -9118,21 +9146,29 @@ class UIEvent extends Event {
9118
9146
  constructor(params) {
9119
9147
  super(params.type);
9120
9148
  this.bubbles = true;
9149
+ this.getInner = this.getInnerPoint;
9150
+ this.getLocal = this.getLocalPoint;
9151
+ this.getPage = this.getPagePoint;
9121
9152
  Object.assign(this, params);
9122
9153
  }
9123
- getPage() {
9124
- return this.current.getPagePoint(this);
9154
+ getBoxPoint(relative) {
9155
+ if (!relative)
9156
+ relative = this.current;
9157
+ return relative.getBoxPoint(this);
9125
9158
  }
9126
- getInner(relative) {
9159
+ getInnerPoint(relative) {
9127
9160
  if (!relative)
9128
9161
  relative = this.current;
9129
9162
  return relative.getInnerPoint(this);
9130
9163
  }
9131
- getLocal(relative) {
9164
+ getLocalPoint(relative) {
9132
9165
  if (!relative)
9133
9166
  relative = this.current;
9134
9167
  return relative.getLocalPoint(this);
9135
9168
  }
9169
+ getPagePoint() {
9170
+ return this.current.getPagePoint(this);
9171
+ }
9136
9172
  static changeName(oldName, newName) {
9137
9173
  EventCreator.changeName(oldName, newName);
9138
9174
  }
@@ -9240,7 +9276,7 @@ let DragEvent = class DragEvent extends PointerEvent {
9240
9276
  }
9241
9277
  getPageBounds() {
9242
9278
  const total = this.getPageTotal();
9243
- const start = this.getPage();
9279
+ const start = this.getPagePoint();
9244
9280
  const bounds = {};
9245
9281
  BoundsHelper.set(bounds, start.x - total.x, start.y - total.y, total.x, total.y);
9246
9282
  BoundsHelper.unsign(bounds);
@@ -9824,7 +9860,7 @@ function emitEvent(leaf, type, data, capture, excludePath) {
9824
9860
  if (leaf.destroyed)
9825
9861
  return false;
9826
9862
  if (leaf.__.hitSelf && !exclude(leaf, excludePath)) {
9827
- if (State.updateEventStyle)
9863
+ if (State.updateEventStyle && !capture)
9828
9864
  State.updateEventStyle(leaf, type);
9829
9865
  if (leaf.hasEvent(type, capture)) {
9830
9866
  data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
@@ -9929,7 +9965,7 @@ class InteractionBase {
9929
9965
  this.tapWait();
9930
9966
  this.longPressWait(data);
9931
9967
  }
9932
- this.waitMenuTap = PointerButton.right(data);
9968
+ this.waitRightTap = PointerButton.right(data);
9933
9969
  this.dragger.setDragData(data);
9934
9970
  if (!this.isHoldRightKey)
9935
9971
  this.updateCursor(data);
@@ -9957,7 +9993,7 @@ class InteractionBase {
9957
9993
  if (canDrag) {
9958
9994
  if (this.waitTap)
9959
9995
  this.pointerWaitCancel();
9960
- this.waitMenuTap = false;
9996
+ this.waitRightTap = false;
9961
9997
  }
9962
9998
  this.dragger.checkDrag(data, canDrag);
9963
9999
  }
@@ -10011,10 +10047,15 @@ class InteractionBase {
10011
10047
  menu(data) {
10012
10048
  this.findPath(data);
10013
10049
  this.emit(PointerEvent.MENU, data);
10050
+ this.waitMenuTap = true;
10051
+ if (!this.downData && this.waitRightTap)
10052
+ this.menuTap(data);
10014
10053
  }
10015
10054
  menuTap(data) {
10016
- if (this.waitMenuTap)
10055
+ if (this.waitRightTap && this.waitMenuTap) {
10017
10056
  this.emit(PointerEvent.MENU_TAP, data);
10057
+ this.waitRightTap = this.waitMenuTap = false;
10058
+ }
10018
10059
  }
10019
10060
  move(data) {
10020
10061
  this.transformer.move(data);
@@ -11210,6 +11251,8 @@ function getPatternData(paint, box, image) {
11210
11251
  let { width, height } = image;
11211
11252
  if (paint.padding)
11212
11253
  box = tempBox.set(box).shrink(paint.padding);
11254
+ if (paint.mode === 'strench')
11255
+ paint.mode = 'stretch';
11213
11256
  const { opacity, mode, align, offset, scale, size, rotation, repeat } = paint;
11214
11257
  const sameBox = box.width === width && box.height === height;
11215
11258
  const data = { mode };
@@ -11238,7 +11281,7 @@ function getPatternData(paint, box, image) {
11238
11281
  if (offset)
11239
11282
  x += offset.x, y += offset.y;
11240
11283
  switch (mode) {
11241
- case 'strench':
11284
+ case 'stretch':
11242
11285
  if (!sameBox)
11243
11286
  width = box.width, height = box.height;
11244
11287
  break;
@@ -11265,7 +11308,7 @@ function getPatternData(paint, box, image) {
11265
11308
  translate(data.transform, box.x, box.y);
11266
11309
  }
11267
11310
  }
11268
- if (scaleX && mode !== 'strench') {
11311
+ if (scaleX && mode !== 'stretch') {
11269
11312
  data.scaleX = scaleX;
11270
11313
  data.scaleY = scaleY;
11271
11314
  }
@@ -11369,7 +11412,7 @@ const { get: get$1, scale, copy: copy$1 } = MatrixHelper;
11369
11412
  const { ceil, abs: abs$1 } = Math;
11370
11413
  function createPattern(ui, paint, pixelRatio) {
11371
11414
  let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11372
- const id = scaleX + '-' + scaleY;
11415
+ const id = scaleX + '-' + scaleY + '-' + pixelRatio;
11373
11416
  if (paint.patternId !== id && !ui.destroyed) {
11374
11417
  scaleX = abs$1(scaleX);
11375
11418
  scaleY = abs$1(scaleY);
@@ -11431,7 +11474,8 @@ function createPattern(ui, paint, pixelRatio) {
11431
11474
  const { abs } = Math;
11432
11475
  function checkImage(ui, canvas, paint, allowPaint) {
11433
11476
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11434
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY && !Export.running)) {
11477
+ const { pixelRatio } = canvas;
11478
+ if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
11435
11479
  return false;
11436
11480
  }
11437
11481
  else {
@@ -11439,8 +11483,8 @@ function checkImage(ui, canvas, paint, allowPaint) {
11439
11483
  if (allowPaint) {
11440
11484
  if (!data.repeat) {
11441
11485
  let { width, height } = data;
11442
- width *= abs(scaleX) * canvas.pixelRatio;
11443
- height *= abs(scaleY) * canvas.pixelRatio;
11486
+ width *= abs(scaleX) * pixelRatio;
11487
+ height *= abs(scaleY) * pixelRatio;
11444
11488
  if (data.scaleX) {
11445
11489
  width *= data.scaleX;
11446
11490
  height *= data.scaleY;
@@ -11466,14 +11510,14 @@ function checkImage(ui, canvas, paint, allowPaint) {
11466
11510
  }
11467
11511
  else {
11468
11512
  if (!paint.style || paint.sync || Export.running) {
11469
- createPattern(ui, paint, canvas.pixelRatio);
11513
+ createPattern(ui, paint, pixelRatio);
11470
11514
  }
11471
11515
  else {
11472
11516
  if (!paint.patternTask) {
11473
11517
  paint.patternTask = ImageManager.patternTasker.add(() => __awaiter(this, void 0, void 0, function* () {
11474
11518
  paint.patternTask = null;
11475
11519
  if (canvas.bounds.hit(ui.__nowWorld))
11476
- createPattern(ui, paint, canvas.pixelRatio);
11520
+ createPattern(ui, paint, pixelRatio);
11477
11521
  ui.forceUpdate('surface');
11478
11522
  }), 300);
11479
11523
  }
@@ -11537,14 +11581,16 @@ function linearGradient(paint, box) {
11537
11581
  return data;
11538
11582
  }
11539
11583
  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));
11584
+ if (stops) {
11585
+ let stop;
11586
+ for (let i = 0, len = stops.length; i < len; i++) {
11587
+ stop = stops[i];
11588
+ if (typeof stop === 'string') {
11589
+ gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
11590
+ }
11591
+ else {
11592
+ gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
11593
+ }
11548
11594
  }
11549
11595
  }
11550
11596
  }
@@ -12300,10 +12346,15 @@ const TextConvertModule = {
12300
12346
  };
12301
12347
 
12302
12348
  function string(color, opacity) {
12303
- if (typeof color === 'string')
12304
- return color;
12349
+ const doOpacity = typeof opacity === 'number' && opacity !== 1;
12350
+ if (typeof color === 'string') {
12351
+ if (doOpacity && ColorConvert.object)
12352
+ color = ColorConvert.object(color);
12353
+ else
12354
+ return color;
12355
+ }
12305
12356
  let a = color.a === undefined ? 1 : color.a;
12306
- if (opacity)
12357
+ if (doOpacity)
12307
12358
  a *= opacity;
12308
12359
  const rgb = color.r + ',' + color.g + ',' + color.b;
12309
12360
  return a === 1 ? 'rgb(' + rgb + ')' : 'rgba(' + rgb + ',' + a + ')';
@@ -12515,4 +12566,4 @@ Object.assign(Creator, {
12515
12566
  });
12516
12567
  useCanvas();
12517
12568
 
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 };
12569
+ 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 };