@leafer-draw/worker 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/worker.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$c = 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$5(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$1, emitEvent, hasEvent, destroy } = Eventer.prototype;
4930
+ const LeafEventer = { on, on_, off, off_, once, emit: emit$1, emitEvent, hasEvent, destroyEventer: destroy };
4931
+
4886
4932
  const { isFinite } = Number;
4887
4933
  const debug$5 = 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$3 } = PointHelper;
5229
+ const { copy: copy$3, move } = 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(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(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
  class LeaferCanvas extends LeaferCanvasBase {
5832
5925
  get allowBackgroundColor() { return true; }
@@ -6053,9 +6146,13 @@ var LeaferUI = (function (exports) {
6053
6146
  });
6054
6147
  }
6055
6148
  function updateChange(updateList) {
6149
+ let layout;
6056
6150
  updateList.list.forEach(leaf => {
6057
- if (leaf.__layout.opacityChanged)
6151
+ layout = leaf.__layout;
6152
+ if (layout.opacityChanged)
6058
6153
  updateAllWorldOpacity(leaf);
6154
+ if (layout.stateStyleChanged)
6155
+ setTimeout(() => layout.stateStyleChanged && leaf.updateState());
6059
6156
  leaf.__updateChange();
6060
6157
  });
6061
6158
  }
@@ -6421,7 +6518,6 @@ var LeaferUI = (function (exports) {
6421
6518
  Platform.requestRender(() => {
6422
6519
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - startTime)));
6423
6520
  if (this.running) {
6424
- this.target.emit(AnimateEvent.FRAME);
6425
6521
  if (this.changed && this.canvas.view)
6426
6522
  this.render();
6427
6523
  this.target.emit(RenderEvent.NEXT);
@@ -6495,36 +6591,6 @@ var LeaferUI = (function (exports) {
6495
6591
  });
6496
6592
  Platform.layout = Layouter.fullLayout;
6497
6593
 
6498
- const TextConvert = {};
6499
- const ColorConvert = {};
6500
- const PathArrow = {};
6501
- const Paint = {};
6502
- const PaintImage = {};
6503
- const PaintGradient = {};
6504
- const Effect = {};
6505
- const Export = {};
6506
- const State = {};
6507
-
6508
- function stateType(defaultValue) {
6509
- return decorateLeafAttr(defaultValue, (key) => attr({
6510
- set(value) {
6511
- this.__setAttr(key, value);
6512
- this.waitLeafer(() => { if (State.setStyle)
6513
- State.setStyle(this, key + 'Style', value); });
6514
- }
6515
- }));
6516
- }
6517
- function arrowType(defaultValue) {
6518
- return decorateLeafAttr(defaultValue, (key) => attr({
6519
- set(value) {
6520
- if (this.__setAttr(key, value)) {
6521
- const data = this.__;
6522
- data.__useArrow = data.startArrow !== 'none' || data.endArrow !== 'none';
6523
- doStrokeType(this);
6524
- }
6525
- }
6526
- }));
6527
- }
6528
6594
  function effectType(defaultValue) {
6529
6595
  return decorateLeafAttr(defaultValue, (key) => attr({
6530
6596
  set(value) {
@@ -6559,10 +6625,33 @@ var LeaferUI = (function (exports) {
6559
6625
  };
6560
6626
  }
6561
6627
 
6628
+ const TextConvert = {};
6629
+ const ColorConvert = {};
6630
+ const PathArrow = {};
6631
+ const Paint = {};
6632
+ const PaintImage = {};
6633
+ const PaintGradient = {};
6634
+ const Effect = {};
6635
+ const Export = {};
6636
+ const State = {
6637
+ setStyleName(_leaf, _styleName, _value) { return needPlugin('state'); },
6638
+ set(_leaf, _stateName) { return needPlugin('state'); }
6639
+ };
6640
+ const Transition = {
6641
+ list: {},
6642
+ register(attrName, fn) {
6643
+ Transition.list[attrName] = fn;
6644
+ },
6645
+ get(attrName) {
6646
+ return Transition.list[attrName];
6647
+ }
6648
+ };
6649
+
6562
6650
  const { parse } = PathConvert;
6563
6651
  const emptyPaint = {};
6564
6652
  const debug$2 = Debug.get('UIData');
6565
6653
  class UIData extends LeafData {
6654
+ get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
6566
6655
  get __strokeWidth() {
6567
6656
  const { strokeWidth, strokeWidthFixed } = this;
6568
6657
  if (strokeWidthFixed) {
@@ -6581,9 +6670,10 @@ var LeaferUI = (function (exports) {
6581
6670
  get __autoSide() { return !this._width || !this._height; }
6582
6671
  get __autoSize() { return !this._width && !this._height; }
6583
6672
  setVisible(value) {
6584
- if (this.__leaf.leafer)
6585
- this.__leaf.leafer.watcher.hasVisible = true;
6586
6673
  this._visible = value;
6674
+ const { leafer } = this.__leaf;
6675
+ if (leafer)
6676
+ leafer.watcher.hasVisible = true;
6587
6677
  }
6588
6678
  setWidth(value) {
6589
6679
  if (value < 0) {
@@ -6774,7 +6864,7 @@ var LeaferUI = (function (exports) {
6774
6864
  __setImageFill(value) {
6775
6865
  if (this.__leaf.image)
6776
6866
  this.__leaf.image = null;
6777
- this.fill = value ? { type: 'image', mode: 'strench', url: value } : undefined;
6867
+ this.fill = value ? { type: 'image', mode: 'stretch', url: value } : undefined;
6778
6868
  }
6779
6869
  __getData() {
6780
6870
  const data = super.__getData();
@@ -6964,19 +7054,8 @@ var LeaferUI = (function (exports) {
6964
7054
  exports.UI = UI_1 = class UI extends exports.Leaf {
6965
7055
  get app() { return this.leafer && this.leafer.app; }
6966
7056
  get isFrame() { return false; }
6967
- set scale(value) {
6968
- if (typeof value === 'number') {
6969
- this.scaleX = this.scaleY = value;
6970
- }
6971
- else {
6972
- this.scaleX = value.x;
6973
- this.scaleY = value.y;
6974
- }
6975
- }
6976
- get scale() {
6977
- const { scaleX, scaleY } = this;
6978
- return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX;
6979
- }
7057
+ set scale(value) { MathHelper.assignScale(this, value); }
7058
+ get scale() { return this.__.scale; }
6980
7059
  get pen() {
6981
7060
  const { path } = this.__;
6982
7061
  pen.set(this.path = path || []);
@@ -6991,8 +7070,15 @@ var LeaferUI = (function (exports) {
6991
7070
  super(data);
6992
7071
  }
6993
7072
  reset(_data) { }
6994
- set(data) {
6995
- Object.assign(this, data);
7073
+ set(data, isTemp) {
7074
+ if (isTemp) {
7075
+ this.lockNormalStyle = true;
7076
+ Object.assign(this, data);
7077
+ this.lockNormalStyle = false;
7078
+ }
7079
+ else {
7080
+ Object.assign(this, data);
7081
+ }
6996
7082
  }
6997
7083
  get(name) {
6998
7084
  return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
@@ -7055,11 +7141,18 @@ var LeaferUI = (function (exports) {
7055
7141
  drawer.rect(x, y, width, height);
7056
7142
  }
7057
7143
  }
7144
+ animate(_keyframe, _options, _type, _isTemp) {
7145
+ return needPlugin('animate');
7146
+ }
7147
+ killAnimate(_type) { }
7058
7148
  export(filename, options) {
7059
7149
  return Export.export(this, filename, options);
7060
7150
  }
7061
- clone() {
7062
- return UI_1.one(this.toJSON());
7151
+ clone(data) {
7152
+ const json = this.toJSON();
7153
+ if (data)
7154
+ Object.assign(json, data);
7155
+ return UI_1.one(json);
7063
7156
  }
7064
7157
  static one(data, x, y, width, height) {
7065
7158
  return UICreator.get(data.tag || this.prototype.__tag, data, x, y, width, height);
@@ -7075,6 +7168,8 @@ var LeaferUI = (function (exports) {
7075
7168
  static setEditInner(_editorName) { }
7076
7169
  destroy() {
7077
7170
  this.fill = this.stroke = null;
7171
+ if (this.__animate)
7172
+ this.killAnimate();
7078
7173
  super.destroy();
7079
7174
  }
7080
7175
  };
@@ -7102,12 +7197,6 @@ var LeaferUI = (function (exports) {
7102
7197
  __decorate([
7103
7198
  visibleType(true)
7104
7199
  ], exports.UI.prototype, "visible", void 0);
7105
- __decorate([
7106
- stateType(false)
7107
- ], exports.UI.prototype, "selected", void 0);
7108
- __decorate([
7109
- stateType(false)
7110
- ], exports.UI.prototype, "disabled", void 0);
7111
7200
  __decorate([
7112
7201
  surfaceType(false)
7113
7202
  ], exports.UI.prototype, "locked", void 0);
@@ -7180,45 +7269,9 @@ var LeaferUI = (function (exports) {
7180
7269
  __decorate([
7181
7270
  pathType(true)
7182
7271
  ], exports.UI.prototype, "closed", void 0);
7183
- __decorate([
7184
- autoLayoutType(false)
7185
- ], exports.UI.prototype, "flow", void 0);
7186
7272
  __decorate([
7187
7273
  boundsType(0)
7188
7274
  ], exports.UI.prototype, "padding", void 0);
7189
- __decorate([
7190
- boundsType(0)
7191
- ], exports.UI.prototype, "gap", void 0);
7192
- __decorate([
7193
- boundsType('top-left')
7194
- ], exports.UI.prototype, "flowAlign", void 0);
7195
- __decorate([
7196
- boundsType(false)
7197
- ], exports.UI.prototype, "flowWrap", void 0);
7198
- __decorate([
7199
- boundsType('box')
7200
- ], exports.UI.prototype, "itemBox", void 0);
7201
- __decorate([
7202
- boundsType(true)
7203
- ], exports.UI.prototype, "inFlow", void 0);
7204
- __decorate([
7205
- boundsType()
7206
- ], exports.UI.prototype, "autoWidth", void 0);
7207
- __decorate([
7208
- boundsType()
7209
- ], exports.UI.prototype, "autoHeight", void 0);
7210
- __decorate([
7211
- boundsType()
7212
- ], exports.UI.prototype, "lockRatio", void 0);
7213
- __decorate([
7214
- boundsType()
7215
- ], exports.UI.prototype, "autoBox", void 0);
7216
- __decorate([
7217
- boundsType()
7218
- ], exports.UI.prototype, "widthRange", void 0);
7219
- __decorate([
7220
- boundsType()
7221
- ], exports.UI.prototype, "heightRange", void 0);
7222
7275
  __decorate([
7223
7276
  dataType(false)
7224
7277
  ], exports.UI.prototype, "draggable", void 0);
@@ -7282,12 +7335,6 @@ var LeaferUI = (function (exports) {
7282
7335
  __decorate([
7283
7336
  strokeType(10)
7284
7337
  ], exports.UI.prototype, "miterLimit", void 0);
7285
- __decorate([
7286
- arrowType('none')
7287
- ], exports.UI.prototype, "startArrow", void 0);
7288
- __decorate([
7289
- arrowType('none')
7290
- ], exports.UI.prototype, "endArrow", void 0);
7291
7338
  __decorate([
7292
7339
  pathType(0)
7293
7340
  ], exports.UI.prototype, "cornerRadius", void 0);
@@ -7309,24 +7356,6 @@ var LeaferUI = (function (exports) {
7309
7356
  __decorate([
7310
7357
  effectType()
7311
7358
  ], exports.UI.prototype, "grayscale", void 0);
7312
- __decorate([
7313
- dataType()
7314
- ], exports.UI.prototype, "normalStyle", void 0);
7315
- __decorate([
7316
- dataType()
7317
- ], exports.UI.prototype, "hoverStyle", void 0);
7318
- __decorate([
7319
- dataType()
7320
- ], exports.UI.prototype, "pressStyle", void 0);
7321
- __decorate([
7322
- dataType()
7323
- ], exports.UI.prototype, "focusStyle", void 0);
7324
- __decorate([
7325
- dataType()
7326
- ], exports.UI.prototype, "selectedStyle", void 0);
7327
- __decorate([
7328
- dataType()
7329
- ], exports.UI.prototype, "disabledStyle", void 0);
7330
7359
  __decorate([
7331
7360
  dataType({})
7332
7361
  ], exports.UI.prototype, "data", void 0);
@@ -7353,7 +7382,7 @@ var LeaferUI = (function (exports) {
7353
7382
  if (!this.children)
7354
7383
  this.children = [];
7355
7384
  }
7356
- set(data) {
7385
+ set(data, isTemp) {
7357
7386
  if (data.children) {
7358
7387
  const { children } = data;
7359
7388
  delete data.children;
@@ -7363,7 +7392,7 @@ var LeaferUI = (function (exports) {
7363
7392
  else {
7364
7393
  this.clear();
7365
7394
  }
7366
- super.set(data);
7395
+ super.set(data, isTemp);
7367
7396
  let child;
7368
7397
  children.forEach(childData => {
7369
7398
  child = childData.__ ? childData : UICreator.get(childData.tag, childData);
@@ -7372,7 +7401,7 @@ var LeaferUI = (function (exports) {
7372
7401
  data.children = children;
7373
7402
  }
7374
7403
  else {
7375
- super.set(data);
7404
+ super.set(data, isTemp);
7376
7405
  }
7377
7406
  }
7378
7407
  toJSON(options) {
@@ -7699,7 +7728,7 @@ var LeaferUI = (function (exports) {
7699
7728
  }
7700
7729
  }
7701
7730
  zoom(_zoomType, _padding, _fixedScale) {
7702
- return debug$1.error('need @leafer-in/view');
7731
+ return needPlugin('view');
7703
7732
  }
7704
7733
  getValidMove(moveX, moveY) { return { x: moveX, y: moveY }; }
7705
7734
  getValidScale(changeScale) { return changeScale; }
@@ -8222,19 +8251,18 @@ var LeaferUI = (function (exports) {
8222
8251
  this.paint();
8223
8252
  }
8224
8253
  paint() {
8225
- this.forceUpdate('fill');
8254
+ this.forceRender();
8226
8255
  }
8227
8256
  __drawAfterFill(canvas, _options) {
8228
- const origin = this.canvas.view;
8229
- const { width, height } = this;
8230
- if (this.__.cornerRadius || this.pathInputed) {
8257
+ const { width, height, cornerRadius } = this.__, { view } = this.canvas;
8258
+ if (cornerRadius || this.pathInputed) {
8231
8259
  canvas.save();
8232
8260
  canvas.clip();
8233
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8261
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8234
8262
  canvas.restore();
8235
8263
  }
8236
8264
  else {
8237
- canvas.drawImage(this.canvas.view, 0, 0, origin.width, origin.height, 0, 0, width, height);
8265
+ canvas.drawImage(view, 0, 0, view.width, view.height, 0, 0, width, height);
8238
8266
  }
8239
8267
  }
8240
8268
  __updateSize() {
@@ -8873,6 +8901,8 @@ var LeaferUI = (function (exports) {
8873
8901
  let { width, height } = image;
8874
8902
  if (paint.padding)
8875
8903
  box = tempBox.set(box).shrink(paint.padding);
8904
+ if (paint.mode === 'strench')
8905
+ paint.mode = 'stretch';
8876
8906
  const { opacity, mode, align, offset, scale, size, rotation, repeat } = paint;
8877
8907
  const sameBox = box.width === width && box.height === height;
8878
8908
  const data = { mode };
@@ -8901,7 +8931,7 @@ var LeaferUI = (function (exports) {
8901
8931
  if (offset)
8902
8932
  x += offset.x, y += offset.y;
8903
8933
  switch (mode) {
8904
- case 'strench':
8934
+ case 'stretch':
8905
8935
  if (!sameBox)
8906
8936
  width = box.width, height = box.height;
8907
8937
  break;
@@ -8928,7 +8958,7 @@ var LeaferUI = (function (exports) {
8928
8958
  translate(data.transform, box.x, box.y);
8929
8959
  }
8930
8960
  }
8931
- if (scaleX && mode !== 'strench') {
8961
+ if (scaleX && mode !== 'stretch') {
8932
8962
  data.scaleX = scaleX;
8933
8963
  data.scaleY = scaleY;
8934
8964
  }
@@ -9032,7 +9062,7 @@ var LeaferUI = (function (exports) {
9032
9062
  const { ceil, abs: abs$1 } = Math;
9033
9063
  function createPattern(ui, paint, pixelRatio) {
9034
9064
  let { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9035
- const id = scaleX + '-' + scaleY;
9065
+ const id = scaleX + '-' + scaleY + '-' + pixelRatio;
9036
9066
  if (paint.patternId !== id && !ui.destroyed) {
9037
9067
  scaleX = abs$1(scaleX);
9038
9068
  scaleY = abs$1(scaleY);
@@ -9094,7 +9124,8 @@ var LeaferUI = (function (exports) {
9094
9124
  const { abs } = Math;
9095
9125
  function checkImage(ui, canvas, paint, allowPaint) {
9096
9126
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
9097
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY && !Export.running)) {
9127
+ const { pixelRatio } = canvas;
9128
+ if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
9098
9129
  return false;
9099
9130
  }
9100
9131
  else {
@@ -9102,8 +9133,8 @@ var LeaferUI = (function (exports) {
9102
9133
  if (allowPaint) {
9103
9134
  if (!data.repeat) {
9104
9135
  let { width, height } = data;
9105
- width *= abs(scaleX) * canvas.pixelRatio;
9106
- height *= abs(scaleY) * canvas.pixelRatio;
9136
+ width *= abs(scaleX) * pixelRatio;
9137
+ height *= abs(scaleY) * pixelRatio;
9107
9138
  if (data.scaleX) {
9108
9139
  width *= data.scaleX;
9109
9140
  height *= data.scaleY;
@@ -9129,14 +9160,14 @@ var LeaferUI = (function (exports) {
9129
9160
  }
9130
9161
  else {
9131
9162
  if (!paint.style || paint.sync || Export.running) {
9132
- createPattern(ui, paint, canvas.pixelRatio);
9163
+ createPattern(ui, paint, pixelRatio);
9133
9164
  }
9134
9165
  else {
9135
9166
  if (!paint.patternTask) {
9136
9167
  paint.patternTask = ImageManager.patternTasker.add(() => __awaiter(this, void 0, void 0, function* () {
9137
9168
  paint.patternTask = null;
9138
9169
  if (canvas.bounds.hit(ui.__nowWorld))
9139
- createPattern(ui, paint, canvas.pixelRatio);
9170
+ createPattern(ui, paint, pixelRatio);
9140
9171
  ui.forceUpdate('surface');
9141
9172
  }), 300);
9142
9173
  }
@@ -9200,14 +9231,16 @@ var LeaferUI = (function (exports) {
9200
9231
  return data;
9201
9232
  }
9202
9233
  function applyStops(gradient, stops, opacity) {
9203
- let stop;
9204
- for (let i = 0, len = stops.length; i < len; i++) {
9205
- stop = stops[i];
9206
- if (typeof stop === 'string') {
9207
- gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
9208
- }
9209
- else {
9210
- gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
9234
+ if (stops) {
9235
+ let stop;
9236
+ for (let i = 0, len = stops.length; i < len; i++) {
9237
+ stop = stops[i];
9238
+ if (typeof stop === 'string') {
9239
+ gradient.addColorStop(i / (len - 1), ColorConvert.string(stop, opacity));
9240
+ }
9241
+ else {
9242
+ gradient.addColorStop(stop.offset, ColorConvert.string(stop.color, opacity));
9243
+ }
9211
9244
  }
9212
9245
  }
9213
9246
  }
@@ -9963,10 +9996,15 @@ var LeaferUI = (function (exports) {
9963
9996
  };
9964
9997
 
9965
9998
  function string(color, opacity) {
9966
- if (typeof color === 'string')
9967
- return color;
9999
+ const doOpacity = typeof opacity === 'number' && opacity !== 1;
10000
+ if (typeof color === 'string') {
10001
+ if (doOpacity && ColorConvert.object)
10002
+ color = ColorConvert.object(color);
10003
+ else
10004
+ return color;
10005
+ }
9968
10006
  let a = color.a === undefined ? 1 : color.a;
9969
- if (opacity)
10007
+ if (doOpacity)
9970
10008
  a *= opacity;
9971
10009
  const rgb = color.r + ',' + color.g + ',' + color.b;
9972
10010
  return a === 1 ? 'rgb(' + rgb + ')' : 'rgba(' + rgb + ',' + a + ')';
@@ -10174,7 +10212,6 @@ var LeaferUI = (function (exports) {
10174
10212
  useCanvas();
10175
10213
 
10176
10214
  exports.AlignHelper = AlignHelper;
10177
- exports.AnimateEvent = AnimateEvent;
10178
10215
  exports.AroundHelper = AroundHelper;
10179
10216
  exports.AutoBounds = AutoBounds;
10180
10217
  exports.BezierHelper = BezierHelper;
@@ -10195,6 +10232,7 @@ var LeaferUI = (function (exports) {
10195
10232
  exports.EllipseHelper = EllipseHelper;
10196
10233
  exports.Event = Event;
10197
10234
  exports.EventCreator = EventCreator;
10235
+ exports.Eventer = Eventer;
10198
10236
  exports.Export = Export;
10199
10237
  exports.FileHelper = FileHelper;
10200
10238
  exports.FrameData = FrameData;
@@ -10265,6 +10303,7 @@ var LeaferUI = (function (exports) {
10265
10303
  exports.TaskProcessor = TaskProcessor;
10266
10304
  exports.TextConvert = TextConvert;
10267
10305
  exports.TextData = TextData;
10306
+ exports.Transition = Transition;
10268
10307
  exports.TwoPointBoundsHelper = TwoPointBoundsHelper;
10269
10308
  exports.UIBounds = UIBounds;
10270
10309
  exports.UICreator = UICreator;
@@ -10276,7 +10315,6 @@ var LeaferUI = (function (exports) {
10276
10315
  exports.Watcher = Watcher;
10277
10316
  exports.affectRenderBoundsType = affectRenderBoundsType;
10278
10317
  exports.affectStrokeBoundsType = affectStrokeBoundsType;
10279
- exports.arrowType = arrowType;
10280
10318
  exports.attr = attr;
10281
10319
  exports.autoLayoutType = autoLayoutType;
10282
10320
  exports.boundsType = boundsType;
@@ -10299,10 +10337,11 @@ var LeaferUI = (function (exports) {
10299
10337
  exports.getMatrixData = getMatrixData;
10300
10338
  exports.getPointData = getPointData;
10301
10339
  exports.hitType = hitType;
10302
- exports.inviteCode = inviteCode;
10340
+ exports.isNull = isNull;
10303
10341
  exports.layoutProcessor = layoutProcessor;
10304
10342
  exports.maskType = maskType;
10305
10343
  exports.naturalBoundsType = naturalBoundsType;
10344
+ exports.needPlugin = needPlugin;
10306
10345
  exports.opacityType = opacityType;
10307
10346
  exports.pathInputType = pathInputType;
10308
10347
  exports.pathType = pathType;
@@ -10316,7 +10355,6 @@ var LeaferUI = (function (exports) {
10316
10355
  exports.rotationType = rotationType;
10317
10356
  exports.scaleType = scaleType;
10318
10357
  exports.sortType = sortType;
10319
- exports.stateType = stateType;
10320
10358
  exports.strokeType = strokeType;
10321
10359
  exports.surfaceType = surfaceType;
10322
10360
  exports.tempBounds = tempBounds$1;