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.
package/dist/web.js CHANGED
@@ -122,11 +122,18 @@ var LeaferUI = (function (exports) {
122
122
  scaleData.scaleX = (typeof size === 'number' ? size : size.width) / originSize.width;
123
123
  scaleData.scaleY = (typeof size === 'number' ? size : size.height) / originSize.height;
124
124
  }
125
- else if (scale) {
126
- scaleData.scaleX = typeof scale === 'number' ? scale : scale.x;
127
- scaleData.scaleY = typeof scale === 'number' ? scale : scale.y;
128
- }
125
+ else if (scale)
126
+ MathHelper.assignScale(scaleData, scale);
129
127
  return scaleData;
128
+ },
129
+ assignScale(scaleData, scale) {
130
+ if (typeof scale === 'number') {
131
+ scaleData.scaleX = scaleData.scaleY = scale;
132
+ }
133
+ else {
134
+ scaleData.scaleX = scale.x;
135
+ scaleData.scaleY = scale.y;
136
+ }
130
137
  }
131
138
  };
132
139
  const OneRadian = PI$4 / 180;
@@ -1258,7 +1265,6 @@ var LeaferUI = (function (exports) {
1258
1265
  tempPoint: {},
1259
1266
  get: get$4,
1260
1267
  toPoint(around, bounds, to, onlySize, pointBounds) {
1261
- to || (to = {});
1262
1268
  const point = get$4(around);
1263
1269
  to.x = point.x;
1264
1270
  to.y = point.y;
@@ -1393,6 +1399,10 @@ var LeaferUI = (function (exports) {
1393
1399
  };
1394
1400
  const R = Run;
1395
1401
 
1402
+ function needPlugin(name) {
1403
+ console.error('need plugin: @leafer-in/' + name);
1404
+ }
1405
+
1396
1406
  const debug$f = Debug.get('UICreator');
1397
1407
  const UICreator = {
1398
1408
  list: {},
@@ -1655,6 +1665,9 @@ var LeaferUI = (function (exports) {
1655
1665
  Answer[Answer["YesAndSkip"] = 3] = "YesAndSkip";
1656
1666
  })(exports.Answer || (exports.Answer = {}));
1657
1667
  const emptyData = {};
1668
+ function isNull(value) {
1669
+ return value === undefined || value === null;
1670
+ }
1658
1671
 
1659
1672
  /******************************************************************************
1660
1673
  Copyright (c) Microsoft Corporation.
@@ -2420,7 +2433,7 @@ var LeaferUI = (function (exports) {
2420
2433
  let startY = y = rotationSin * radiusX * startCos + rotationCos * radiusY * startSin;
2421
2434
  let fromX = cx + x, fromY = cy + y;
2422
2435
  if (data)
2423
- data.push(L$6, fromX, fromY);
2436
+ data.push(data.length ? L$6 : M$5, fromX, fromY);
2424
2437
  if (setPointBounds)
2425
2438
  setPoint$2(setPointBounds, fromX, fromY);
2426
2439
  if (setStartPoint)
@@ -3089,8 +3102,7 @@ var LeaferUI = (function (exports) {
3089
3102
  toTwoPointBounds(data, setPointBounds) {
3090
3103
  if (!data || !data.length)
3091
3104
  return setPoint$1(setPointBounds, 0, 0);
3092
- let command;
3093
- let i = 0, x = 0, y = 0, x1, y1, toX, toY;
3105
+ let i = 0, x = 0, y = 0, x1, y1, toX, toY, command;
3094
3106
  const len = data.length;
3095
3107
  while (i < len) {
3096
3108
  command = data[i];
@@ -3746,7 +3758,7 @@ var LeaferUI = (function (exports) {
3746
3758
  set(value) {
3747
3759
  if (this.__setAttr(key, value)) {
3748
3760
  this.__layout.matrixChanged || this.__layout.matrixChange();
3749
- this.__hasAutoLayout = !!value;
3761
+ this.__hasAutoLayout = !!(this.origin || this.around || this.flow);
3750
3762
  if (!this.__local)
3751
3763
  this.__layout.createLocal();
3752
3764
  }
@@ -3839,14 +3851,25 @@ var LeaferUI = (function (exports) {
3839
3851
  return decorateLeafAttr(defaultValue, (key) => attr({
3840
3852
  set(value) {
3841
3853
  const oldValue = this.visible;
3842
- if (this.__setAttr(key, value)) {
3843
- this.__layout.opacityChanged || this.__layout.opacityChange();
3844
- if (oldValue === 0 || value === 0)
3845
- doBoundsType(this);
3854
+ if (oldValue === true && value === 0) {
3855
+ if (this.animationOut)
3856
+ return this.__runAnimation('out', () => doVisible(this, key, value, oldValue));
3857
+ }
3858
+ else if (oldValue === 0 && value === true) {
3859
+ if (this.animation)
3860
+ this.__runAnimation('in');
3846
3861
  }
3862
+ doVisible(this, key, value, oldValue);
3847
3863
  }
3848
3864
  }));
3849
3865
  }
3866
+ function doVisible(leaf, key, value, oldValue) {
3867
+ if (leaf.__setAttr(key, value)) {
3868
+ leaf.__layout.opacityChanged || leaf.__layout.opacityChange();
3869
+ if (oldValue === 0 || value === 0)
3870
+ doBoundsType(leaf);
3871
+ }
3872
+ }
3850
3873
  function sortType(defaultValue) {
3851
3874
  return decorateLeafAttr(defaultValue, (key) => attr({
3852
3875
  set(value) {
@@ -3930,7 +3953,16 @@ var LeaferUI = (function (exports) {
3930
3953
  if (defaultValue === undefined) {
3931
3954
  property.get = function () { return this[computedKey]; };
3932
3955
  }
3933
- else if (key === 'width') {
3956
+ else if (typeof defaultValue === 'object') {
3957
+ const { clone } = DataHelper;
3958
+ property.get = function () {
3959
+ let v = this[computedKey];
3960
+ if (v === undefined)
3961
+ this[computedKey] = v = clone(defaultValue);
3962
+ return v;
3963
+ };
3964
+ }
3965
+ if (key === 'width') {
3934
3966
  property.get = function () {
3935
3967
  const v = this[computedKey];
3936
3968
  if (v === undefined) {
@@ -4454,15 +4486,16 @@ var LeaferUI = (function (exports) {
4454
4486
  }
4455
4487
  getLayoutBounds(type, relative = 'world', unscale) {
4456
4488
  const { leaf } = this;
4457
- let point, matrix, bounds = this.getInnerBounds(type);
4489
+ let point, matrix, layoutBounds, bounds = this.getInnerBounds(type);
4458
4490
  switch (relative) {
4459
4491
  case 'world':
4460
4492
  point = leaf.getWorldPoint(bounds);
4461
4493
  matrix = leaf.__world;
4462
4494
  break;
4463
4495
  case 'local':
4496
+ const { scaleX, scaleY, rotation, skewX, skewY } = leaf.__;
4497
+ layoutBounds = { scaleX, scaleY, rotation, skewX, skewY };
4464
4498
  point = leaf.getLocalPointByInner(bounds);
4465
- matrix = leaf.__localMatrix;
4466
4499
  break;
4467
4500
  case 'inner':
4468
4501
  point = bounds;
@@ -4474,7 +4507,8 @@ var LeaferUI = (function (exports) {
4474
4507
  point = leaf.getWorldPoint(bounds, relative);
4475
4508
  matrix = getRelativeWorld$1(leaf, relative, true);
4476
4509
  }
4477
- const layoutBounds = MatrixHelper.getLayout(matrix);
4510
+ if (!layoutBounds)
4511
+ layoutBounds = MatrixHelper.getLayout(matrix);
4478
4512
  copy$6(layoutBounds, bounds);
4479
4513
  PointHelper.copy(layoutBounds, point);
4480
4514
  if (unscale) {
@@ -4597,144 +4631,6 @@ var LeaferUI = (function (exports) {
4597
4631
  destroy() { }
4598
4632
  }
4599
4633
 
4600
- const empty = {};
4601
- const LeafEventer = {
4602
- on(type, listener, options) {
4603
- let capture, once;
4604
- if (options) {
4605
- if (options === 'once') {
4606
- once = true;
4607
- }
4608
- else if (typeof options === 'boolean') {
4609
- capture = options;
4610
- }
4611
- else {
4612
- capture = options.capture;
4613
- once = options.once;
4614
- }
4615
- }
4616
- let events;
4617
- const map = __getListenerMap(this, capture, true);
4618
- const typeList = typeof type === 'string' ? type.split(' ') : type;
4619
- const item = once ? { listener, once } : { listener };
4620
- typeList.forEach(type => {
4621
- if (type) {
4622
- events = map[type];
4623
- if (events) {
4624
- if (events.findIndex(item => item.listener === listener) === -1)
4625
- events.push(item);
4626
- }
4627
- else {
4628
- map[type] = [item];
4629
- }
4630
- }
4631
- });
4632
- },
4633
- off(type, listener, options) {
4634
- if (type) {
4635
- const typeList = typeof type === 'string' ? type.split(' ') : type;
4636
- if (listener) {
4637
- let capture;
4638
- if (options)
4639
- capture = typeof options === 'boolean' ? options : (options === 'once' ? false : options.capture);
4640
- let events, index;
4641
- const map = __getListenerMap(this, capture);
4642
- typeList.forEach(type => {
4643
- if (type) {
4644
- events = map[type];
4645
- if (events) {
4646
- index = events.findIndex(item => item.listener === listener);
4647
- if (index > -1)
4648
- events.splice(index, 1);
4649
- if (!events.length)
4650
- delete map[type];
4651
- }
4652
- }
4653
- });
4654
- }
4655
- else {
4656
- const { __bubbleMap: b, __captureMap: c } = this;
4657
- typeList.forEach(type => {
4658
- if (b)
4659
- delete b[type];
4660
- if (c)
4661
- delete c[type];
4662
- });
4663
- }
4664
- }
4665
- else {
4666
- this.__bubbleMap = this.__captureMap = undefined;
4667
- }
4668
- },
4669
- on_(type, listener, bind, options) {
4670
- if (bind)
4671
- listener = listener.bind(bind);
4672
- this.on(type, listener, options);
4673
- return { type, current: this, listener, options };
4674
- },
4675
- off_(id) {
4676
- if (!id)
4677
- return;
4678
- const list = id instanceof Array ? id : [id];
4679
- list.forEach(item => item.current.off(item.type, item.listener, item.options));
4680
- list.length = 0;
4681
- },
4682
- once(type, listener, capture) {
4683
- this.on(type, listener, { once: true, capture });
4684
- },
4685
- emit(type, event, capture) {
4686
- if (!event && EventCreator.has(type))
4687
- event = EventCreator.get(type, { type, target: this, current: this });
4688
- const map = __getListenerMap(this, capture);
4689
- const list = map[type];
4690
- if (list) {
4691
- let item;
4692
- for (let i = 0, len = list.length; i < len; i++) {
4693
- item = list[i];
4694
- item.listener(event);
4695
- if (item.once) {
4696
- this.off(type, item.listener, capture);
4697
- i--, len--;
4698
- }
4699
- if (event && event.isStopNow)
4700
- break;
4701
- }
4702
- }
4703
- this.syncEventer && this.syncEventer.emitEvent(event, capture);
4704
- },
4705
- emitEvent(event, capture) {
4706
- event.current = this;
4707
- this.emit(event.type, event, capture);
4708
- },
4709
- hasEvent(type, capture) {
4710
- if (this.syncEventer && this.syncEventer.hasEvent(type, capture))
4711
- return true;
4712
- const { __bubbleMap: b, __captureMap: c } = this;
4713
- const hasB = b && b[type], hasC = c && c[type];
4714
- return !!(capture === undefined ? (hasB || hasC) : (capture ? hasC : hasB));
4715
- },
4716
- };
4717
- function __getListenerMap(eventer, capture, create) {
4718
- if (capture) {
4719
- const { __captureMap: c } = eventer;
4720
- if (c) {
4721
- return c;
4722
- }
4723
- else {
4724
- return create ? eventer.__captureMap = {} : empty;
4725
- }
4726
- }
4727
- else {
4728
- const { __bubbleMap: b } = eventer;
4729
- if (b) {
4730
- return b;
4731
- }
4732
- else {
4733
- return create ? eventer.__bubbleMap = {} : empty;
4734
- }
4735
- }
4736
- }
4737
-
4738
4634
  class Event {
4739
4635
  constructor(type, target) {
4740
4636
  this.bubbles = false;
@@ -4769,7 +4665,10 @@ var LeaferUI = (function (exports) {
4769
4665
  }
4770
4666
  ChildEvent.ADD = 'child.add';
4771
4667
  ChildEvent.REMOVE = 'child.remove';
4772
- ChildEvent.DESTROY = 'child.destroy';
4668
+ ChildEvent.CREATED = 'created';
4669
+ ChildEvent.MOUNTED = 'mounted';
4670
+ ChildEvent.UNMOUNTED = 'unmounted';
4671
+ ChildEvent.DESTROY = 'destroy';
4773
4672
 
4774
4673
  class PropertyEvent extends Event {
4775
4674
  constructor(type, target, attrName, oldValue, newValue) {
@@ -4847,10 +4746,6 @@ var LeaferUI = (function (exports) {
4847
4746
  LayoutEvent.AGAIN = 'layout.again';
4848
4747
  LayoutEvent.END = 'layout.end';
4849
4748
 
4850
- class AnimateEvent extends Event {
4851
- }
4852
- AnimateEvent.FRAME = 'animate.frame';
4853
-
4854
4749
  class RenderEvent extends Event {
4855
4750
  constructor(type, times, bounds, options) {
4856
4751
  super(type);
@@ -4883,6 +4778,157 @@ var LeaferUI = (function (exports) {
4883
4778
  LeaferEvent.RESTART = 'leafer.restart';
4884
4779
  LeaferEvent.END = 'leafer.end';
4885
4780
 
4781
+ const empty = {};
4782
+ class Eventer {
4783
+ set event(map) { this.on(map); }
4784
+ on(type, listener, options) {
4785
+ if (!listener) {
4786
+ let event, map = type;
4787
+ for (let key in map)
4788
+ event = map[key], event instanceof Array ? this.on(key, event[0], event[1]) : this.on(key, event);
4789
+ return;
4790
+ }
4791
+ let capture, once;
4792
+ if (options) {
4793
+ if (options === 'once') {
4794
+ once = true;
4795
+ }
4796
+ else if (typeof options === 'boolean') {
4797
+ capture = options;
4798
+ }
4799
+ else {
4800
+ capture = options.capture;
4801
+ once = options.once;
4802
+ }
4803
+ }
4804
+ let events;
4805
+ const map = __getListenerMap(this, capture, true);
4806
+ const typeList = typeof type === 'string' ? type.split(' ') : type;
4807
+ const item = once ? { listener, once } : { listener };
4808
+ typeList.forEach(type => {
4809
+ if (type) {
4810
+ events = map[type];
4811
+ if (events) {
4812
+ if (events.findIndex(item => item.listener === listener) === -1)
4813
+ events.push(item);
4814
+ }
4815
+ else {
4816
+ map[type] = [item];
4817
+ }
4818
+ }
4819
+ });
4820
+ }
4821
+ off(type, listener, options) {
4822
+ if (type) {
4823
+ const typeList = typeof type === 'string' ? type.split(' ') : type;
4824
+ if (listener) {
4825
+ let capture;
4826
+ if (options)
4827
+ capture = typeof options === 'boolean' ? options : (options === 'once' ? false : options.capture);
4828
+ let events, index;
4829
+ const map = __getListenerMap(this, capture);
4830
+ typeList.forEach(type => {
4831
+ if (type) {
4832
+ events = map[type];
4833
+ if (events) {
4834
+ index = events.findIndex(item => item.listener === listener);
4835
+ if (index > -1)
4836
+ events.splice(index, 1);
4837
+ if (!events.length)
4838
+ delete map[type];
4839
+ }
4840
+ }
4841
+ });
4842
+ }
4843
+ else {
4844
+ const { __bubbleMap: b, __captureMap: c } = this;
4845
+ typeList.forEach(type => {
4846
+ if (b)
4847
+ delete b[type];
4848
+ if (c)
4849
+ delete c[type];
4850
+ });
4851
+ }
4852
+ }
4853
+ else {
4854
+ this.__bubbleMap = this.__captureMap = undefined;
4855
+ }
4856
+ }
4857
+ on_(type, listener, bind, options) {
4858
+ if (bind)
4859
+ listener = listener.bind(bind);
4860
+ this.on(type, listener, options);
4861
+ return { type, current: this, listener, options };
4862
+ }
4863
+ off_(id) {
4864
+ if (!id)
4865
+ return;
4866
+ const list = id instanceof Array ? id : [id];
4867
+ list.forEach(item => item.current.off(item.type, item.listener, item.options));
4868
+ list.length = 0;
4869
+ }
4870
+ once(type, listener, capture) {
4871
+ this.on(type, listener, { once: true, capture });
4872
+ }
4873
+ emit(type, event, capture) {
4874
+ if (!event && EventCreator.has(type))
4875
+ event = EventCreator.get(type, { type, target: this, current: this });
4876
+ const map = __getListenerMap(this, capture);
4877
+ const list = map[type];
4878
+ if (list) {
4879
+ let item;
4880
+ for (let i = 0, len = list.length; i < len; i++) {
4881
+ item = list[i];
4882
+ item.listener(event);
4883
+ if (item.once) {
4884
+ this.off(type, item.listener, capture);
4885
+ i--, len--;
4886
+ }
4887
+ if (event && event.isStopNow)
4888
+ break;
4889
+ }
4890
+ }
4891
+ this.syncEventer && this.syncEventer.emitEvent(event, capture);
4892
+ }
4893
+ emitEvent(event, capture) {
4894
+ event.current = this;
4895
+ this.emit(event.type, event, capture);
4896
+ }
4897
+ hasEvent(type, capture) {
4898
+ if (this.syncEventer && this.syncEventer.hasEvent(type, capture))
4899
+ return true;
4900
+ const { __bubbleMap: b, __captureMap: c } = this;
4901
+ const hasB = b && b[type], hasC = c && c[type];
4902
+ return !!(capture === undefined ? (hasB || hasC) : (capture ? hasC : hasB));
4903
+ }
4904
+ destroy() {
4905
+ this.__captureMap = this.__bubbleMap = this.syncEventer = null;
4906
+ }
4907
+ }
4908
+ function __getListenerMap(eventer, capture, create) {
4909
+ if (capture) {
4910
+ const { __captureMap: c } = eventer;
4911
+ if (c) {
4912
+ return c;
4913
+ }
4914
+ else {
4915
+ return create ? eventer.__captureMap = {} : empty;
4916
+ }
4917
+ }
4918
+ else {
4919
+ const { __bubbleMap: b } = eventer;
4920
+ if (b) {
4921
+ return b;
4922
+ }
4923
+ else {
4924
+ return create ? eventer.__bubbleMap = {} : empty;
4925
+ }
4926
+ }
4927
+ }
4928
+
4929
+ const { on, on_, off, off_, once, emit: emit$2, emitEvent: emitEvent$1, hasEvent, destroy } = Eventer.prototype;
4930
+ const LeafEventer = { on, on_, off, off_, once, emit: emit$2, emitEvent: emitEvent$1, hasEvent, destroyEventer: destroy };
4931
+
4886
4932
  const { isFinite } = Number;
4887
4933
  const debug$8 = Debug.get('setAttr');
4888
4934
  const LeafDataProxy = {
@@ -4894,9 +4940,7 @@ var LeaferUI = (function (exports) {
4894
4940
  newValue = undefined;
4895
4941
  }
4896
4942
  if (typeof newValue === 'object' || oldValue !== newValue) {
4897
- this.__[name] = newValue;
4898
- if (this.__proxyData)
4899
- this.setProxyAttr(name, newValue);
4943
+ this.__realSetAttr(name, newValue);
4900
4944
  const { CHANGE } = PropertyEvent;
4901
4945
  const event = new PropertyEvent(CHANGE, this, name, oldValue, newValue);
4902
4946
  if (this.isLeafer) {
@@ -4914,12 +4958,18 @@ var LeaferUI = (function (exports) {
4914
4958
  }
4915
4959
  }
4916
4960
  else {
4917
- this.__[name] = newValue;
4918
- if (this.__proxyData)
4919
- this.setProxyAttr(name, newValue);
4961
+ this.__realSetAttr(name, newValue);
4920
4962
  return true;
4921
4963
  }
4922
4964
  },
4965
+ __realSetAttr(name, newValue) {
4966
+ const data = this.__;
4967
+ data[name] = newValue;
4968
+ if (this.__proxyData)
4969
+ this.setProxyAttr(name, newValue);
4970
+ if (data.normalStyle)
4971
+ this.lockNormalStyle || data.normalStyle[name] === undefined || (data.normalStyle[name] = newValue);
4972
+ },
4923
4973
  __getAttr(name) {
4924
4974
  if (this.__proxyData)
4925
4975
  return this.getProxyAttr(name);
@@ -5022,6 +5072,8 @@ var LeaferUI = (function (exports) {
5022
5072
  layout.boundsChanged = false;
5023
5073
  },
5024
5074
  __updateLocalBoxBounds() {
5075
+ if (this.__hasMotionPath)
5076
+ this.__updateMotionPath();
5025
5077
  if (this.__hasAutoLayout)
5026
5078
  this.__updateAutoLayout();
5027
5079
  toOuterOf$1(this.__layout.boxBounds, this.__local, this.__local);
@@ -5174,7 +5226,7 @@ var LeaferUI = (function (exports) {
5174
5226
  const { LEAF, create } = IncrementId;
5175
5227
  const { toInnerPoint, toOuterPoint, multiplyParent } = MatrixHelper;
5176
5228
  const { toOuterOf } = BoundsHelper;
5177
- const { copy: copy$4 } = PointHelper;
5229
+ const { copy: copy$4, move: move$1 } = PointHelper;
5178
5230
  const { moveLocal, zoomOfLocal, rotateOfLocal, skewOfLocal, moveWorld, zoomOfWorld, rotateOfWorld, skewOfWorld, transform, transformWorld, setTransform, getFlipTransform, getLocalOrigin, getRelativeWorld, drop } = LeafHelper;
5179
5231
  exports.Leaf = class Leaf {
5180
5232
  get tag() { return this.__tag; }
@@ -5201,13 +5253,16 @@ var LeaferUI = (function (exports) {
5201
5253
  get __ignoreHitWorld() { return (this.__hasMask || this.__hasEraser) && this.__.hitChildren; }
5202
5254
  get __inLazyBounds() { const { leafer } = this; return leafer && leafer.created && leafer.lazyBounds.hit(this.__world); }
5203
5255
  get pathInputed() { return this.__.__pathInputed; }
5204
- set event(map) { let event; for (let key in map)
5205
- event = map[key], event instanceof Array ? this.on(key, event[0], event[1]) : this.on(key, event); }
5256
+ set event(map) { this.on(map); }
5206
5257
  constructor(data) {
5207
5258
  this.innerId = create(LEAF);
5208
5259
  this.reset(data);
5260
+ if (this.__bubbleMap)
5261
+ this.__emitLifeEvent(ChildEvent.CREATED);
5209
5262
  }
5210
5263
  reset(data) {
5264
+ if (this.leafer)
5265
+ this.leafer.forceRender(this.__world);
5211
5266
  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 };
5212
5267
  if (data !== null)
5213
5268
  this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
@@ -5229,12 +5284,12 @@ var LeaferUI = (function (exports) {
5229
5284
  waitParent(item, bind) {
5230
5285
  if (bind)
5231
5286
  item = item.bind(bind);
5232
- this.parent ? item() : (this.__parentWait ? this.__parentWait.push(item) : this.__parentWait = [item]);
5287
+ this.parent ? item() : this.on(ChildEvent.ADD, item, 'once');
5233
5288
  }
5234
5289
  waitLeafer(item, bind) {
5235
5290
  if (bind)
5236
5291
  item = item.bind(bind);
5237
- this.leafer ? item() : (this.__leaferWait ? this.__leaferWait.push(item) : this.__leaferWait = [item]);
5292
+ this.leafer ? item() : this.on(ChildEvent.MOUNTED, item, 'once');
5238
5293
  }
5239
5294
  nextRender(item, bind, off) {
5240
5295
  this.leafer ? this.leafer.nextRender(item, bind, off) : this.waitLeafer(() => this.leafer.nextRender(item, bind, off));
@@ -5243,18 +5298,21 @@ var LeaferUI = (function (exports) {
5243
5298
  this.nextRender(item, null, 'off');
5244
5299
  }
5245
5300
  __bindLeafer(leafer) {
5246
- if (this.isLeafer) {
5247
- if (leafer !== null)
5248
- leafer = this;
5249
- }
5301
+ if (this.isLeafer && leafer !== null)
5302
+ leafer = this;
5250
5303
  if (this.leafer && !leafer)
5251
5304
  this.leafer.leafs--;
5252
5305
  this.leafer = leafer;
5253
5306
  if (leafer) {
5254
5307
  leafer.leafs++;
5255
5308
  this.__level = this.parent ? this.parent.__level + 1 : 1;
5256
- if (this.__leaferWait)
5257
- WaitHelper.run(this.__leaferWait);
5309
+ if (this.animation)
5310
+ this.__runAnimation('in');
5311
+ if (this.__bubbleMap)
5312
+ this.__emitLifeEvent(ChildEvent.MOUNTED);
5313
+ }
5314
+ else {
5315
+ this.__emitLifeEvent(ChildEvent.UNMOUNTED);
5258
5316
  }
5259
5317
  if (this.isBranch) {
5260
5318
  const { children } = this;
@@ -5263,7 +5321,7 @@ var LeaferUI = (function (exports) {
5263
5321
  }
5264
5322
  }
5265
5323
  }
5266
- set(_data) { }
5324
+ set(_data, _isTemp) { }
5267
5325
  get(_name) { return undefined; }
5268
5326
  setAttr(name, value) { this[name] = value; }
5269
5327
  getAttr(name) { return this[name]; }
@@ -5288,6 +5346,7 @@ var LeaferUI = (function (exports) {
5288
5346
  findOne(_condition, _options) { return undefined; }
5289
5347
  findId(_id) { return undefined; }
5290
5348
  focus(_value) { }
5349
+ updateState() { }
5291
5350
  updateLayout() {
5292
5351
  this.__layout.update();
5293
5352
  }
@@ -5395,11 +5454,24 @@ var LeaferUI = (function (exports) {
5395
5454
  if (relative)
5396
5455
  relative.worldToInner(to ? to : inner, null, distance);
5397
5456
  }
5457
+ getBoxPoint(world, relative, distance, change) {
5458
+ return this.getBoxPointByInner(this.getInnerPoint(world, relative, distance, change), null, null, true);
5459
+ }
5460
+ getBoxPointByInner(inner, _relative, _distance, change) {
5461
+ const point = change ? inner : Object.assign({}, inner), { x, y } = this.boxBounds;
5462
+ move$1(point, -x, -y);
5463
+ return point;
5464
+ }
5398
5465
  getInnerPoint(world, relative, distance, change) {
5399
5466
  const point = change ? world : {};
5400
5467
  this.worldToInner(world, point, distance, relative);
5401
5468
  return point;
5402
5469
  }
5470
+ getInnerPointByBox(box, _relative, _distance, change) {
5471
+ const point = change ? box : Object.assign({}, box), { x, y } = this.boxBounds;
5472
+ move$1(point, x, y);
5473
+ return point;
5474
+ }
5403
5475
  getInnerPointByLocal(local, _relative, distance, change) {
5404
5476
  return this.getInnerPoint(local, this.parent, distance, change);
5405
5477
  }
@@ -5411,20 +5483,23 @@ var LeaferUI = (function (exports) {
5411
5483
  getLocalPointByInner(inner, _relative, distance, change) {
5412
5484
  return this.getWorldPoint(inner, this.parent, distance, change);
5413
5485
  }
5486
+ getPagePoint(world, relative, distance, change) {
5487
+ const layer = this.leafer ? this.leafer.zoomLayer : this;
5488
+ return layer.getInnerPoint(world, relative, distance, change);
5489
+ }
5414
5490
  getWorldPoint(inner, relative, distance, change) {
5415
5491
  const point = change ? inner : {};
5416
5492
  this.innerToWorld(inner, point, distance, relative);
5417
5493
  return point;
5418
5494
  }
5495
+ getWorldPointByBox(box, relative, distance, change) {
5496
+ return this.getWorldPoint(this.getInnerPointByBox(box, null, null, change), relative, distance, true);
5497
+ }
5419
5498
  getWorldPointByLocal(local, relative, distance, change) {
5420
5499
  const point = change ? local : {};
5421
5500
  this.localToWorld(local, point, distance, relative);
5422
5501
  return point;
5423
5502
  }
5424
- getPagePoint(world, relative, distance, change) {
5425
- const layer = this.leafer ? this.leafer.zoomLayer : this;
5426
- return layer.getInnerPoint(world, relative, distance, change);
5427
- }
5428
5503
  getWorldPointByPage(page, relative, distance, change) {
5429
5504
  const layer = this.leafer ? this.leafer.zoomLayer : this;
5430
5505
  return layer.getWorldPoint(page, relative, distance, change);
@@ -5493,6 +5568,17 @@ var LeaferUI = (function (exports) {
5493
5568
  __drawRenderPath(_canvas) { }
5494
5569
  __updatePath() { }
5495
5570
  __updateRenderPath() { }
5571
+ getMotionPathData() {
5572
+ return needPlugin('path');
5573
+ }
5574
+ getMotionPoint(_motionDistance) {
5575
+ return needPlugin('path');
5576
+ }
5577
+ getMotionTotal() {
5578
+ return 0;
5579
+ }
5580
+ __updateMotionPath() { }
5581
+ __runAnimation(_type, _complete) { }
5496
5582
  __updateSortChildren() { }
5497
5583
  add(_child, _index) { }
5498
5584
  remove(_child, destroy) {
@@ -5518,6 +5604,10 @@ var LeaferUI = (function (exports) {
5518
5604
  fn = boundsType;
5519
5605
  fn(defaultValue)(this.prototype, attrName);
5520
5606
  }
5607
+ __emitLifeEvent(type) {
5608
+ if (this.hasEvent(type))
5609
+ this.emitEvent(new ChildEvent(type, this, this.parent));
5610
+ }
5521
5611
  destroy() {
5522
5612
  if (!this.destroyed) {
5523
5613
  const { parent } = this;
@@ -5525,11 +5615,10 @@ var LeaferUI = (function (exports) {
5525
5615
  this.remove();
5526
5616
  if (this.children)
5527
5617
  this.removeAll(true);
5528
- if (this.hasEvent(ChildEvent.DESTROY))
5529
- this.emitEvent(new ChildEvent(ChildEvent.DESTROY, this, parent));
5618
+ this.__emitLifeEvent(ChildEvent.DESTROY);
5530
5619
  this.__.destroy();
5531
5620
  this.__layout.destroy();
5532
- this.__captureMap = this.__bubbleMap = this.__parentWait = this.__leaferWait = null;
5621
+ this.destroyEventer();
5533
5622
  this.destroyed = true;
5534
5623
  }
5535
5624
  }
@@ -5595,8 +5684,8 @@ var LeaferUI = (function (exports) {
5595
5684
  this.__.__childBranchNumber = (this.__.__childBranchNumber || 0) + 1;
5596
5685
  child.__layout.boxChanged || child.__layout.boxChange();
5597
5686
  child.__layout.matrixChanged || child.__layout.matrixChange();
5598
- if (child.__parentWait)
5599
- WaitHelper.run(child.__parentWait);
5687
+ if (child.__bubbleMap)
5688
+ child.__emitLifeEvent(ChildEvent.ADD);
5600
5689
  if (this.leafer) {
5601
5690
  child.__bindLeafer(this.leafer);
5602
5691
  if (this.leafer.created)
@@ -5609,16 +5698,10 @@ var LeaferUI = (function (exports) {
5609
5698
  }
5610
5699
  remove(child, destroy) {
5611
5700
  if (child) {
5612
- const index = this.children.indexOf(child);
5613
- if (index > -1) {
5614
- this.children.splice(index, 1);
5615
- if (child.isBranch)
5616
- this.__.__childBranchNumber = (this.__.__childBranchNumber || 1) - 1;
5617
- this.__preRemove();
5618
- this.__realRemoveChild(child);
5619
- if (destroy)
5620
- child.destroy();
5621
- }
5701
+ if (child.animationOut)
5702
+ child.__runAnimation('out', () => this.__remove(child, destroy));
5703
+ else
5704
+ this.__remove(child, destroy);
5622
5705
  }
5623
5706
  else if (child === undefined) {
5624
5707
  super.remove(null, destroy);
@@ -5640,6 +5723,18 @@ var LeaferUI = (function (exports) {
5640
5723
  clear() {
5641
5724
  this.removeAll(true);
5642
5725
  }
5726
+ __remove(child, destroy) {
5727
+ const index = this.children.indexOf(child);
5728
+ if (index > -1) {
5729
+ this.children.splice(index, 1);
5730
+ if (child.isBranch)
5731
+ this.__.__childBranchNumber = (this.__.__childBranchNumber || 1) - 1;
5732
+ this.__preRemove();
5733
+ this.__realRemoveChild(child);
5734
+ if (destroy)
5735
+ child.destroy();
5736
+ }
5737
+ }
5643
5738
  __preRemove() {
5644
5739
  if (this.__hasMask)
5645
5740
  this.__updateMask();
@@ -5649,6 +5744,7 @@ var LeaferUI = (function (exports) {
5649
5744
  this.__layout.affectChildrenSort && this.__layout.childrenSortChange();
5650
5745
  }
5651
5746
  __realRemoveChild(child) {
5747
+ child.__emitLifeEvent(ChildEvent.REMOVE);
5652
5748
  child.parent = null;
5653
5749
  if (this.leafer) {
5654
5750
  child.__bindLeafer(null);
@@ -5661,8 +5757,6 @@ var LeaferUI = (function (exports) {
5661
5757
  }
5662
5758
  __emitChildEvent(type, child) {
5663
5759
  const event = new ChildEvent(type, child, this);
5664
- if (child.hasEvent(type))
5665
- child.emitEvent(event);
5666
5760
  if (this.hasEvent(type) && !this.isLeafer)
5667
5761
  this.emitEvent(event);
5668
5762
  this.leafer.emitEvent(event);
@@ -5825,8 +5919,7 @@ var LeaferUI = (function (exports) {
5825
5919
  }
5826
5920
  }
5827
5921
 
5828
- const version = "1.0.1";
5829
- const inviteCode = {};
5922
+ const version = "1.0.4";
5830
5923
 
5831
5924
  const debug$7 = Debug.get('LeaferCanvas');
5832
5925
  class LeaferCanvas extends LeaferCanvasBase {
@@ -6226,9 +6319,13 @@ var LeaferUI = (function (exports) {
6226
6319
  });
6227
6320
  }
6228
6321
  function updateChange(updateList) {
6322
+ let layout;
6229
6323
  updateList.list.forEach(leaf => {
6230
- if (leaf.__layout.opacityChanged)
6324
+ layout = leaf.__layout;
6325
+ if (layout.opacityChanged)
6231
6326
  updateAllWorldOpacity(leaf);
6327
+ if (layout.stateStyleChanged)
6328
+ setTimeout(() => layout.stateStyleChanged && leaf.updateState());
6232
6329
  leaf.__updateChange();
6233
6330
  });
6234
6331
  }
@@ -6594,7 +6691,6 @@ var LeaferUI = (function (exports) {
6594
6691
  Platform.requestRender(() => {
6595
6692
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - startTime)));
6596
6693
  if (this.running) {
6597
- this.target.emit(AnimateEvent.FRAME);
6598
6694
  if (this.changed && this.canvas.view)
6599
6695
  this.render();
6600
6696
  this.target.emit(RenderEvent.NEXT);
@@ -6939,36 +7035,6 @@ var LeaferUI = (function (exports) {
6939
7035
  });
6940
7036
  Platform.layout = Layouter.fullLayout;
6941
7037
 
6942
- const TextConvert = {};
6943
- const ColorConvert = {};
6944
- const PathArrow = {};
6945
- const Paint = {};
6946
- const PaintImage = {};
6947
- const PaintGradient = {};
6948
- const Effect = {};
6949
- const Export = {};
6950
- const State = {};
6951
-
6952
- function stateType(defaultValue) {
6953
- return decorateLeafAttr(defaultValue, (key) => attr({
6954
- set(value) {
6955
- this.__setAttr(key, value);
6956
- this.waitLeafer(() => { if (State.setStyle)
6957
- State.setStyle(this, key + 'Style', value); });
6958
- }
6959
- }));
6960
- }
6961
- function arrowType(defaultValue) {
6962
- return decorateLeafAttr(defaultValue, (key) => attr({
6963
- set(value) {
6964
- if (this.__setAttr(key, value)) {
6965
- const data = this.__;
6966
- data.__useArrow = data.startArrow !== 'none' || data.endArrow !== 'none';
6967
- doStrokeType(this);
6968
- }
6969
- }
6970
- }));
6971
- }
6972
7038
  function effectType(defaultValue) {
6973
7039
  return decorateLeafAttr(defaultValue, (key) => attr({
6974
7040
  set(value) {
@@ -7003,10 +7069,33 @@ var LeaferUI = (function (exports) {
7003
7069
  };
7004
7070
  }
7005
7071
 
7072
+ const TextConvert = {};
7073
+ const ColorConvert = {};
7074
+ const PathArrow = {};
7075
+ const Paint = {};
7076
+ const PaintImage = {};
7077
+ const PaintGradient = {};
7078
+ const Effect = {};
7079
+ const Export = {};
7080
+ const State = {
7081
+ setStyleName(_leaf, _styleName, _value) { return needPlugin('state'); },
7082
+ set(_leaf, _stateName) { return needPlugin('state'); }
7083
+ };
7084
+ const Transition = {
7085
+ list: {},
7086
+ register(attrName, fn) {
7087
+ Transition.list[attrName] = fn;
7088
+ },
7089
+ get(attrName) {
7090
+ return Transition.list[attrName];
7091
+ }
7092
+ };
7093
+
7006
7094
  const { parse } = PathConvert;
7007
7095
  const emptyPaint = {};
7008
7096
  const debug$4 = Debug.get('UIData');
7009
7097
  class UIData extends LeafData {
7098
+ get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
7010
7099
  get __strokeWidth() {
7011
7100
  const { strokeWidth, strokeWidthFixed } = this;
7012
7101
  if (strokeWidthFixed) {
@@ -7025,9 +7114,10 @@ var LeaferUI = (function (exports) {
7025
7114
  get __autoSide() { return !this._width || !this._height; }
7026
7115
  get __autoSize() { return !this._width && !this._height; }
7027
7116
  setVisible(value) {
7028
- if (this.__leaf.leafer)
7029
- this.__leaf.leafer.watcher.hasVisible = true;
7030
7117
  this._visible = value;
7118
+ const { leafer } = this.__leaf;
7119
+ if (leafer)
7120
+ leafer.watcher.hasVisible = true;
7031
7121
  }
7032
7122
  setWidth(value) {
7033
7123
  if (value < 0) {
@@ -7218,7 +7308,7 @@ var LeaferUI = (function (exports) {
7218
7308
  __setImageFill(value) {
7219
7309
  if (this.__leaf.image)
7220
7310
  this.__leaf.image = null;
7221
- this.fill = value ? { type: 'image', mode: 'strench', url: value } : undefined;
7311
+ this.fill = value ? { type: 'image', mode: 'stretch', url: value } : undefined;
7222
7312
  }
7223
7313
  __getData() {
7224
7314
  const data = super.__getData();
@@ -7408,19 +7498,8 @@ var LeaferUI = (function (exports) {
7408
7498
  exports.UI = UI_1 = class UI extends exports.Leaf {
7409
7499
  get app() { return this.leafer && this.leafer.app; }
7410
7500
  get isFrame() { return false; }
7411
- set scale(value) {
7412
- if (typeof value === 'number') {
7413
- this.scaleX = this.scaleY = value;
7414
- }
7415
- else {
7416
- this.scaleX = value.x;
7417
- this.scaleY = value.y;
7418
- }
7419
- }
7420
- get scale() {
7421
- const { scaleX, scaleY } = this;
7422
- return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX;
7423
- }
7501
+ set scale(value) { MathHelper.assignScale(this, value); }
7502
+ get scale() { return this.__.scale; }
7424
7503
  get pen() {
7425
7504
  const { path } = this.__;
7426
7505
  pen.set(this.path = path || []);
@@ -7435,8 +7514,15 @@ var LeaferUI = (function (exports) {
7435
7514
  super(data);
7436
7515
  }
7437
7516
  reset(_data) { }
7438
- set(data) {
7439
- Object.assign(this, data);
7517
+ set(data, isTemp) {
7518
+ if (isTemp) {
7519
+ this.lockNormalStyle = true;
7520
+ Object.assign(this, data);
7521
+ this.lockNormalStyle = false;
7522
+ }
7523
+ else {
7524
+ Object.assign(this, data);
7525
+ }
7440
7526
  }
7441
7527
  get(name) {
7442
7528
  return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -7499,11 +7585,18 @@ var LeaferUI = (function (exports) {
7499
7585
  drawer.rect(x, y, width, height);
7500
7586
  }
7501
7587
  }
7588
+ animate(_keyframe, _options, _type, _isTemp) {
7589
+ return needPlugin('animate');
7590
+ }
7591
+ killAnimate(_type) { }
7502
7592
  export(filename, options) {
7503
7593
  return Export.export(this, filename, options);
7504
7594
  }
7505
- clone() {
7506
- return UI_1.one(this.toJSON());
7595
+ clone(data) {
7596
+ const json = this.toJSON();
7597
+ if (data)
7598
+ Object.assign(json, data);
7599
+ return UI_1.one(json);
7507
7600
  }
7508
7601
  static one(data, x, y, width, height) {
7509
7602
  return UICreator.get(data.tag || this.prototype.__tag, data, x, y, width, height);
@@ -7519,6 +7612,8 @@ var LeaferUI = (function (exports) {
7519
7612
  static setEditInner(_editorName) { }
7520
7613
  destroy() {
7521
7614
  this.fill = this.stroke = null;
7615
+ if (this.__animate)
7616
+ this.killAnimate();
7522
7617
  super.destroy();
7523
7618
  }
7524
7619
  };
@@ -7546,12 +7641,6 @@ var LeaferUI = (function (exports) {
7546
7641
  __decorate([
7547
7642
  visibleType(true)
7548
7643
  ], exports.UI.prototype, "visible", void 0);
7549
- __decorate([
7550
- stateType(false)
7551
- ], exports.UI.prototype, "selected", void 0);
7552
- __decorate([
7553
- stateType(false)
7554
- ], exports.UI.prototype, "disabled", void 0);
7555
7644
  __decorate([
7556
7645
  surfaceType(false)
7557
7646
  ], exports.UI.prototype, "locked", void 0);
@@ -7624,45 +7713,9 @@ var LeaferUI = (function (exports) {
7624
7713
  __decorate([
7625
7714
  pathType(true)
7626
7715
  ], exports.UI.prototype, "closed", void 0);
7627
- __decorate([
7628
- autoLayoutType(false)
7629
- ], exports.UI.prototype, "flow", void 0);
7630
7716
  __decorate([
7631
7717
  boundsType(0)
7632
7718
  ], exports.UI.prototype, "padding", void 0);
7633
- __decorate([
7634
- boundsType(0)
7635
- ], exports.UI.prototype, "gap", void 0);
7636
- __decorate([
7637
- boundsType('top-left')
7638
- ], exports.UI.prototype, "flowAlign", void 0);
7639
- __decorate([
7640
- boundsType(false)
7641
- ], exports.UI.prototype, "flowWrap", void 0);
7642
- __decorate([
7643
- boundsType('box')
7644
- ], exports.UI.prototype, "itemBox", void 0);
7645
- __decorate([
7646
- boundsType(true)
7647
- ], exports.UI.prototype, "inFlow", void 0);
7648
- __decorate([
7649
- boundsType()
7650
- ], exports.UI.prototype, "autoWidth", void 0);
7651
- __decorate([
7652
- boundsType()
7653
- ], exports.UI.prototype, "autoHeight", void 0);
7654
- __decorate([
7655
- boundsType()
7656
- ], exports.UI.prototype, "lockRatio", void 0);
7657
- __decorate([
7658
- boundsType()
7659
- ], exports.UI.prototype, "autoBox", void 0);
7660
- __decorate([
7661
- boundsType()
7662
- ], exports.UI.prototype, "widthRange", void 0);
7663
- __decorate([
7664
- boundsType()
7665
- ], exports.UI.prototype, "heightRange", void 0);
7666
7719
  __decorate([
7667
7720
  dataType(false)
7668
7721
  ], exports.UI.prototype, "draggable", void 0);
@@ -7726,12 +7779,6 @@ var LeaferUI = (function (exports) {
7726
7779
  __decorate([
7727
7780
  strokeType(10)
7728
7781
  ], exports.UI.prototype, "miterLimit", void 0);
7729
- __decorate([
7730
- arrowType('none')
7731
- ], exports.UI.prototype, "startArrow", void 0);
7732
- __decorate([
7733
- arrowType('none')
7734
- ], exports.UI.prototype, "endArrow", void 0);
7735
7782
  __decorate([
7736
7783
  pathType(0)
7737
7784
  ], exports.UI.prototype, "cornerRadius", void 0);
@@ -7753,24 +7800,6 @@ var LeaferUI = (function (exports) {
7753
7800
  __decorate([
7754
7801
  effectType()
7755
7802
  ], exports.UI.prototype, "grayscale", void 0);
7756
- __decorate([
7757
- dataType()
7758
- ], exports.UI.prototype, "normalStyle", void 0);
7759
- __decorate([
7760
- dataType()
7761
- ], exports.UI.prototype, "hoverStyle", void 0);
7762
- __decorate([
7763
- dataType()
7764
- ], exports.UI.prototype, "pressStyle", void 0);
7765
- __decorate([
7766
- dataType()
7767
- ], exports.UI.prototype, "focusStyle", void 0);
7768
- __decorate([
7769
- dataType()
7770
- ], exports.UI.prototype, "selectedStyle", void 0);
7771
- __decorate([
7772
- dataType()
7773
- ], exports.UI.prototype, "disabledStyle", void 0);
7774
7803
  __decorate([
7775
7804
  dataType({})
7776
7805
  ], exports.UI.prototype, "data", void 0);
@@ -7797,7 +7826,7 @@ var LeaferUI = (function (exports) {
7797
7826
  if (!this.children)
7798
7827
  this.children = [];
7799
7828
  }
7800
- set(data) {
7829
+ set(data, isTemp) {
7801
7830
  if (data.children) {
7802
7831
  const { children } = data;
7803
7832
  delete data.children;
@@ -7807,7 +7836,7 @@ var LeaferUI = (function (exports) {
7807
7836
  else {
7808
7837
  this.clear();
7809
7838
  }
7810
- super.set(data);
7839
+ super.set(data, isTemp);
7811
7840
  let child;
7812
7841
  children.forEach(childData => {
7813
7842
  child = childData.__ ? childData : UICreator.get(childData.tag, childData);
@@ -7816,7 +7845,7 @@ var LeaferUI = (function (exports) {
7816
7845
  data.children = children;
7817
7846
  }
7818
7847
  else {
7819
- super.set(data);
7848
+ super.set(data, isTemp);
7820
7849
  }
7821
7850
  }
7822
7851
  toJSON(options) {
@@ -8143,7 +8172,7 @@ var LeaferUI = (function (exports) {
8143
8172
  }
8144
8173
  }
8145
8174
  zoom(_zoomType, _padding, _fixedScale) {
8146
- return debug$3.error('need @leafer-in/view');
8175
+ return needPlugin('view');
8147
8176
  }
8148
8177
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
8149
8178
  getValidScale(changeScale) { return changeScale; }
@@ -8666,19 +8695,18 @@ var LeaferUI = (function (exports) {
8666
8695
  this.paint();
8667
8696
  }
8668
8697
  paint() {
8669
- this.forceUpdate('fill');
8698
+ this.forceRender();
8670
8699
  }
8671
8700
  __drawAfterFill(canvas, _options) {
8672
- const origin = this.canvas.view;
8673
- const { width, height } = this;
8674
- if (this.__.cornerRadius || this.pathInputed) {
8701
+ const { width, height, cornerRadius } = this.__, { view } = this.canvas;
8702
+ if (cornerRadius || this.pathInputed) {
8675
8703
  canvas.save();
8676
8704
  canvas.clip();
8677
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8705
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8678
8706
  canvas.restore();
8679
8707
  }
8680
8708
  else {
8681
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8709
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8682
8710
  }
8683
8711
  }
8684
8712
  __updateSize() {
@@ -9121,21 +9149,29 @@ var LeaferUI = (function (exports) {
9121
9149
  constructor(params) {
9122
9150
  super(params.type);
9123
9151
  this.bubbles = true;
9152
+ this.getInner = this.getInnerPoint;
9153
+ this.getLocal = this.getLocalPoint;
9154
+ this.getPage = this.getPagePoint;
9124
9155
  Object.assign(this, params);
9125
9156
  }
9126
- getPage() {
9127
- return this.current.getPagePoint(this);
9157
+ getBoxPoint(relative) {
9158
+ if (!relative)
9159
+ relative = this.current;
9160
+ return relative.getBoxPoint(this);
9128
9161
  }
9129
- getInner(relative) {
9162
+ getInnerPoint(relative) {
9130
9163
  if (!relative)
9131
9164
  relative = this.current;
9132
9165
  return relative.getInnerPoint(this);
9133
9166
  }
9134
- getLocal(relative) {
9167
+ getLocalPoint(relative) {
9135
9168
  if (!relative)
9136
9169
  relative = this.current;
9137
9170
  return relative.getLocalPoint(this);
9138
9171
  }
9172
+ getPagePoint() {
9173
+ return this.current.getPagePoint(this);
9174
+ }
9139
9175
  static changeName(oldName, newName) {
9140
9176
  EventCreator.changeName(oldName, newName);
9141
9177
  }
@@ -9243,7 +9279,7 @@ var LeaferUI = (function (exports) {
9243
9279
  }
9244
9280
  getPageBounds() {
9245
9281
  const total = this.getPageTotal();
9246
- const start = this.getPage();
9282
+ const start = this.getPagePoint();
9247
9283
  const bounds = {};
9248
9284
  BoundsHelper.set(bounds, start.x - total.x, start.y - total.y, total.x, total.y);
9249
9285
  BoundsHelper.unsign(bounds);
@@ -9827,7 +9863,7 @@ var LeaferUI = (function (exports) {
9827
9863
  if (leaf.destroyed)
9828
9864
  return false;
9829
9865
  if (leaf.__.hitSelf && !exclude(leaf, excludePath)) {
9830
- if (State.updateEventStyle)
9866
+ if (State.updateEventStyle && !capture)
9831
9867
  State.updateEventStyle(leaf, type);
9832
9868
  if (leaf.hasEvent(type, capture)) {
9833
9869
  data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
@@ -9932,7 +9968,7 @@ var LeaferUI = (function (exports) {
9932
9968
  this.tapWait();
9933
9969
  this.longPressWait(data);
9934
9970
  }
9935
- this.waitMenuTap = PointerButton.right(data);
9971
+ this.waitRightTap = PointerButton.right(data);
9936
9972
  this.dragger.setDragData(data);
9937
9973
  if (!this.isHoldRightKey)
9938
9974
  this.updateCursor(data);
@@ -9960,7 +9996,7 @@ var LeaferUI = (function (exports) {
9960
9996
  if (canDrag) {
9961
9997
  if (this.waitTap)
9962
9998
  this.pointerWaitCancel();
9963
- this.waitMenuTap = false;
9999
+ this.waitRightTap = false;
9964
10000
  }
9965
10001
  this.dragger.checkDrag(data, canDrag);
9966
10002
  }
@@ -10014,10 +10050,15 @@ var LeaferUI = (function (exports) {
10014
10050
  menu(data) {
10015
10051
  this.findPath(data);
10016
10052
  this.emit(exports.PointerEvent.MENU, data);
10053
+ this.waitMenuTap = true;
10054
+ if (!this.downData && this.waitRightTap)
10055
+ this.menuTap(data);
10017
10056
  }
10018
10057
  menuTap(data) {
10019
- if (this.waitMenuTap)
10058
+ if (this.waitRightTap && this.waitMenuTap) {
10020
10059
  this.emit(exports.PointerEvent.MENU_TAP, data);
10060
+ this.waitRightTap = this.waitMenuTap = false;
10061
+ }
10021
10062
  }
10022
10063
  move(data) {
10023
10064
  this.transformer.move(data);
@@ -11213,6 +11254,8 @@ var LeaferUI = (function (exports) {
11213
11254
  let { width, height } = image;
11214
11255
  if (paint.padding)
11215
11256
  box = tempBox.set(box).shrink(paint.padding);
11257
+ if (paint.mode === 'strench')
11258
+ paint.mode = 'stretch';
11216
11259
  const { opacity, mode, align, offset, scale, size, rotation, repeat } = paint;
11217
11260
  const sameBox = box.width === width && box.height === height;
11218
11261
  const data = { mode };
@@ -11241,7 +11284,7 @@ var LeaferUI = (function (exports) {
11241
11284
  if (offset)
11242
11285
  x += offset.x, y += offset.y;
11243
11286
  switch (mode) {
11244
- case 'strench':
11287
+ case 'stretch':
11245
11288
  if (!sameBox)
11246
11289
  width = box.width, height = box.height;
11247
11290
  break;
@@ -11268,7 +11311,7 @@ var LeaferUI = (function (exports) {
11268
11311
  translate(data.transform, box.x, box.y);
11269
11312
  }
11270
11313
  }
11271
- if (scaleX && mode !== 'strench') {
11314
+ if (scaleX && mode !== 'stretch') {
11272
11315
  data.scaleX = scaleX;
11273
11316
  data.scaleY = scaleY;
11274
11317
  }
@@ -11372,7 +11415,7 @@ var LeaferUI = (function (exports) {
11372
11415
  const { ceil, abs: abs$1 } = Math;
11373
11416
  function createPattern(ui, paint, pixelRatio) {
11374
11417
  let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11375
- const id = scaleX + '-' + scaleY;
11418
+ const id = scaleX + '-' + scaleY + '-' + pixelRatio;
11376
11419
  if (paint.patternId !== id && !ui.destroyed) {
11377
11420
  scaleX = abs$1(scaleX);
11378
11421
  scaleY = abs$1(scaleY);
@@ -11434,7 +11477,8 @@ var LeaferUI = (function (exports) {
11434
11477
  const { abs } = Math;
11435
11478
  function checkImage(ui, canvas, paint, allowPaint) {
11436
11479
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
11437
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY && !Export.running)) {
11480
+ const { pixelRatio } = canvas;
11481
+ if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
11438
11482
  return false;
11439
11483
  }
11440
11484
  else {
@@ -11442,8 +11486,8 @@ var LeaferUI = (function (exports) {
11442
11486
  if (allowPaint) {
11443
11487
  if (!data.repeat) {
11444
11488
  let { width, height } = data;
11445
- width *= abs(scaleX) * canvas.pixelRatio;
11446
- height *= abs(scaleY) * canvas.pixelRatio;
11489
+ width *= abs(scaleX) * pixelRatio;
11490
+ height *= abs(scaleY) * pixelRatio;
11447
11491
  if (data.scaleX) {
11448
11492
  width *= data.scaleX;
11449
11493
  height *= data.scaleY;
@@ -11469,14 +11513,14 @@ var LeaferUI = (function (exports) {
11469
11513
  }
11470
11514
  else {
11471
11515
  if (!paint.style || paint.sync || Export.running) {
11472
- createPattern(ui, paint, canvas.pixelRatio);
11516
+ createPattern(ui, paint, pixelRatio);
11473
11517
  }
11474
11518
  else {
11475
11519
  if (!paint.patternTask) {
11476
11520
  paint.patternTask = ImageManager.patternTasker.add(() => __awaiter(this, void 0, void 0, function* () {
11477
11521
  paint.patternTask = null;
11478
11522
  if (canvas.bounds.hit(ui.__nowWorld))
11479
- createPattern(ui, paint, canvas.pixelRatio);
11523
+ createPattern(ui, paint, pixelRatio);
11480
11524
  ui.forceUpdate('surface');
11481
11525
  }), 300);
11482
11526
  }
@@ -11540,14 +11584,16 @@ var LeaferUI = (function (exports) {
11540
11584
  return data;
11541
11585
  }
11542
11586
  function applyStops(gradient, stops, opacity) {
11543
- let stop;
11544
- for (let i = 0, len = stops.length; i < len; i++) {
11545
- stop = stops[i];
11546
- if (typeof stop === 'string') {
11547
- gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
11548
- }
11549
- else {
11550
- gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
11587
+ if (stops) {
11588
+ let stop;
11589
+ for (let i = 0, len = stops.length; i < len; i++) {
11590
+ stop = stops[i];
11591
+ if (typeof stop === 'string') {
11592
+ gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
11593
+ }
11594
+ else {
11595
+ gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
11596
+ }
11551
11597
  }
11552
11598
  }
11553
11599
  }
@@ -12303,10 +12349,15 @@ var LeaferUI = (function (exports) {
12303
12349
  };
12304
12350
 
12305
12351
  function string(color, opacity) {
12306
- if (typeof color === 'string')
12307
- return color;
12352
+ const doOpacity = typeof opacity === 'number' && opacity !== 1;
12353
+ if (typeof color === 'string') {
12354
+ if (doOpacity && ColorConvert.object)
12355
+ color = ColorConvert.object(color);
12356
+ else
12357
+ return color;
12358
+ }
12308
12359
  let a = color.a === undefined ? 1 : color.a;
12309
- if (opacity)
12360
+ if (doOpacity)
12310
12361
  a *= opacity;
12311
12362
  const rgb = color.r + ',' + color.g + ',' + color.b;
12312
12363
  return a === 1 ? 'rgb(' + rgb + ')' : 'rgba(' + rgb + ',' + a + ')';
@@ -12519,7 +12570,6 @@ var LeaferUI = (function (exports) {
12519
12570
  useCanvas();
12520
12571
 
12521
12572
  exports.AlignHelper = AlignHelper;
12522
- exports.AnimateEvent = AnimateEvent;
12523
12573
  exports.AroundHelper = AroundHelper;
12524
12574
  exports.AutoBounds = AutoBounds;
12525
12575
  exports.BezierHelper = BezierHelper;
@@ -12541,6 +12591,7 @@ var LeaferUI = (function (exports) {
12541
12591
  exports.EllipseHelper = EllipseHelper;
12542
12592
  exports.Event = Event;
12543
12593
  exports.EventCreator = EventCreator;
12594
+ exports.Eventer = Eventer;
12544
12595
  exports.Export = Export;
12545
12596
  exports.FileHelper = FileHelper;
12546
12597
  exports.FrameData = FrameData;
@@ -12622,6 +12673,7 @@ var LeaferUI = (function (exports) {
12622
12673
  exports.TaskProcessor = TaskProcessor;
12623
12674
  exports.TextConvert = TextConvert;
12624
12675
  exports.TextData = TextData;
12676
+ exports.Transition = Transition;
12625
12677
  exports.TwoPointBoundsHelper = TwoPointBoundsHelper;
12626
12678
  exports.UIBounds = UIBounds;
12627
12679
  exports.UICreator = UICreator;
@@ -12635,7 +12687,6 @@ var LeaferUI = (function (exports) {
12635
12687
  exports.addInteractionWindow = addInteractionWindow;
12636
12688
  exports.affectRenderBoundsType = affectRenderBoundsType;
12637
12689
  exports.affectStrokeBoundsType = affectStrokeBoundsType;
12638
- exports.arrowType = arrowType;
12639
12690
  exports.attr = attr;
12640
12691
  exports.autoLayoutType = autoLayoutType;
12641
12692
  exports.boundsType = boundsType;
@@ -12658,10 +12709,11 @@ var LeaferUI = (function (exports) {
12658
12709
  exports.getMatrixData = getMatrixData;
12659
12710
  exports.getPointData = getPointData;
12660
12711
  exports.hitType = hitType;
12661
- exports.inviteCode = inviteCode;
12712
+ exports.isNull = isNull;
12662
12713
  exports.layoutProcessor = layoutProcessor;
12663
12714
  exports.maskType = maskType;
12664
12715
  exports.naturalBoundsType = naturalBoundsType;
12716
+ exports.needPlugin = needPlugin;
12665
12717
  exports.opacityType = opacityType;
12666
12718
  exports.pathInputType = pathInputType;
12667
12719
  exports.pathType = pathType;
@@ -12675,7 +12727,6 @@ var LeaferUI = (function (exports) {
12675
12727
  exports.rotationType = rotationType;
12676
12728
  exports.scaleType = scaleType;
12677
12729
  exports.sortType = sortType;
12678
- exports.stateType = stateType;
12679
12730
  exports.strokeType = strokeType;
12680
12731
  exports.surfaceType = surfaceType;
12681
12732
  exports.tempBounds = tempBounds$1;