@leafer-ui/miniapp 1.5.2 → 1.6.0

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.
@@ -45,7 +45,7 @@ const IncrementId = {
45
45
  };
46
46
  const I$2 = IncrementId;
47
47
 
48
- const { round, pow: pow$1, PI: PI$4 } = Math;
48
+ const { round: round$3, pow: pow$1, PI: PI$4 } = Math;
49
49
  const MathHelper = {
50
50
  within(value, min, max) {
51
51
  if (typeof min === 'object')
@@ -109,7 +109,7 @@ const MathHelper = {
109
109
  },
110
110
  float(num, maxLength) {
111
111
  const a = maxLength !== undefined ? pow$1(10, maxLength) : 1000000000000;
112
- num = round(num * a) / a;
112
+ num = round$3(num * a) / a;
113
113
  return num === -0 ? 0 : num;
114
114
  },
115
115
  getScaleData(scale, size, originSize, scaleData) {
@@ -132,8 +132,15 @@ const MathHelper = {
132
132
  scaleData.scaleX = scale.x;
133
133
  scaleData.scaleY = scale.y;
134
134
  }
135
+ },
136
+ randInt,
137
+ randColor(opacity) {
138
+ return `rgba(${randInt(255)},${randInt(255)},${randInt(255)},${opacity || 1})`;
135
139
  }
136
140
  };
141
+ function randInt(num) {
142
+ return Math.round(Math.random() * num);
143
+ }
137
144
  const OneRadian = PI$4 / 180;
138
145
  const PI2 = PI$4 * 2;
139
146
  const PI_2 = PI$4 / 2;
@@ -431,7 +438,7 @@ const MatrixHelper = {
431
438
  const M$6 = MatrixHelper;
432
439
 
433
440
  const { toInnerPoint: toInnerPoint$2, toOuterPoint: toOuterPoint$3 } = MatrixHelper;
434
- const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, PI: PI$3 } = Math;
441
+ const { sin: sin$4, cos: cos$4, abs: abs$4, sqrt: sqrt$2, atan2: atan2$2, min: min$1, round: round$2, PI: PI$3 } = Math;
435
442
  const PointHelper = {
436
443
  defaultPoint: getPointData(),
437
444
  tempPoint: {},
@@ -452,6 +459,10 @@ const PointHelper = {
452
459
  t.x = x;
453
460
  t.y = y;
454
461
  },
462
+ round(t, halfPixel) {
463
+ t.x = halfPixel ? round$2(t.x - 0.5) + 0.5 : round$2(t.x);
464
+ t.y = halfPixel ? round$2(t.y - 0.5) + 0.5 : round$2(t.y);
465
+ },
455
466
  move(t, x, y) {
456
467
  t.x += x;
457
468
  t.y += y;
@@ -1317,6 +1328,7 @@ const StringNumberMap = {
1317
1328
  'E': 1
1318
1329
  };
1319
1330
 
1331
+ const { randColor } = MathHelper;
1320
1332
  class Debug {
1321
1333
  constructor(name) {
1322
1334
  this.repeatMap = {};
@@ -1331,6 +1343,19 @@ class Debug {
1331
1343
  static set exclude(name) {
1332
1344
  this.excludeList = getNameList(name);
1333
1345
  }
1346
+ static drawRepaint(canvas, bounds) {
1347
+ const color = randColor();
1348
+ canvas.fillWorld(bounds, color.replace('1)', '.1)'));
1349
+ canvas.strokeWorld(bounds, color);
1350
+ }
1351
+ static drawBounds(leaf, canvas, _options) {
1352
+ const showHit = Debug.showBounds === 'hit', w = leaf.__nowWorld, color = randColor();
1353
+ if (showHit)
1354
+ canvas.setWorld(w), leaf.__drawHitPath(canvas), canvas.fillStyle = color.replace('1)', '.2)'), canvas.fill();
1355
+ canvas.resetTransform();
1356
+ canvas.setStroke(color, 2);
1357
+ showHit ? canvas.stroke() : canvas.strokeWorld(w, color);
1358
+ }
1334
1359
  log(...messages) {
1335
1360
  if (D$4.enable) {
1336
1361
  if (D$4.filterList.length && D$4.filterList.every(name => name !== this.name))
@@ -1417,7 +1442,7 @@ const Plugin = {
1417
1442
  return rs;
1418
1443
  },
1419
1444
  need(name) {
1420
- console.error('need plugin: ' + (name.includes('-x') ? '' : '@leafer-in/') + name);
1445
+ console.error('please install plugin: ' + (name.includes('-x') ? '' : '@leafer-in/') + name);
1421
1446
  }
1422
1447
  };
1423
1448
  setTimeout(() => check.forEach(name => Plugin.has(name, true)));
@@ -2017,7 +2042,7 @@ __decorate([
2017
2042
  contextMethod()
2018
2043
  ], Canvas$1.prototype, "strokeText", null);
2019
2044
 
2020
- const { copy: copy$9 } = MatrixHelper;
2045
+ const { copy: copy$9, multiplyParent: multiplyParent$3 } = MatrixHelper, { round: round$1 } = Math;
2021
2046
  const minSize = { width: 1, height: 1, pixelRatio: 1 };
2022
2047
  const canvasSizeAttrs = ['width', 'height', 'pixelRatio'];
2023
2048
  class LeaferCanvasBase extends Canvas$1 {
@@ -2026,6 +2051,8 @@ class LeaferCanvasBase extends Canvas$1 {
2026
2051
  get pixelRatio() { return this.size.pixelRatio; }
2027
2052
  get pixelWidth() { return this.width * this.pixelRatio; }
2028
2053
  get pixelHeight() { return this.height * this.pixelRatio; }
2054
+ get pixelSnap() { return this.config.pixelSnap; }
2055
+ set pixelSnap(value) { this.config.pixelSnap = value; }
2029
2056
  get allowBackgroundColor() { return this.view && this.parentView; }
2030
2057
  constructor(config, manager) {
2031
2058
  super();
@@ -2086,15 +2113,22 @@ class LeaferCanvasBase extends Canvas$1 {
2086
2113
  stopAutoLayout() { }
2087
2114
  setCursor(_cursor) { }
2088
2115
  setWorld(matrix, parentMatrix) {
2089
- const { pixelRatio } = this;
2090
- const w = this.worldTransform;
2091
- if (parentMatrix) {
2092
- const { a, b, c, d, e, f } = parentMatrix;
2093
- this.setTransform(w.a = ((matrix.a * a) + (matrix.b * c)) * pixelRatio, w.b = ((matrix.a * b) + (matrix.b * d)) * pixelRatio, w.c = ((matrix.c * a) + (matrix.d * c)) * pixelRatio, w.d = ((matrix.c * b) + (matrix.d * d)) * pixelRatio, w.e = (((matrix.e * a) + (matrix.f * c) + e)) * pixelRatio, w.f = (((matrix.e * b) + (matrix.f * d) + f)) * pixelRatio);
2094
- }
2095
- else {
2096
- this.setTransform(w.a = matrix.a * pixelRatio, w.b = matrix.b * pixelRatio, w.c = matrix.c * pixelRatio, w.d = matrix.d * pixelRatio, w.e = matrix.e * pixelRatio, w.f = matrix.f * pixelRatio);
2116
+ const { pixelRatio, pixelSnap } = this, w = this.worldTransform;
2117
+ if (parentMatrix)
2118
+ multiplyParent$3(matrix, parentMatrix, w);
2119
+ w.a = matrix.a * pixelRatio;
2120
+ w.b = matrix.b * pixelRatio;
2121
+ w.c = matrix.c * pixelRatio;
2122
+ w.d = matrix.d * pixelRatio;
2123
+ w.e = matrix.e * pixelRatio;
2124
+ w.f = matrix.f * pixelRatio;
2125
+ if (pixelSnap) {
2126
+ if (matrix.half && (matrix.half * pixelRatio) % 2)
2127
+ w.e = round$1(w.e - 0.5) + 0.5, w.f = round$1(w.f - 0.5) + 0.5;
2128
+ else
2129
+ w.e = round$1(w.e), w.f = round$1(w.f);
2097
2130
  }
2131
+ this.setTransform(w.a, w.b, w.c, w.d, w.e, w.f);
2098
2132
  }
2099
2133
  useWorldTransform(worldTransform) {
2100
2134
  if (worldTransform)
@@ -2237,12 +2271,13 @@ class LeaferCanvasBase extends Canvas$1 {
2237
2271
  return this.width === size.width && this.height === size.height && (!size.pixelRatio || this.pixelRatio === size.pixelRatio);
2238
2272
  }
2239
2273
  getSameCanvas(useSameWorldTransform, useSameSmooth) {
2240
- const canvas = this.manager ? this.manager.get(this.size) : Creator.canvas(Object.assign({}, this.size));
2274
+ const { size, pixelSnap } = this, canvas = this.manager ? this.manager.get(size) : Creator.canvas(Object.assign({}, size));
2241
2275
  canvas.save();
2242
2276
  if (useSameWorldTransform)
2243
2277
  copy$9(canvas.worldTransform, this.worldTransform), canvas.useWorldTransform();
2244
2278
  if (useSameSmooth)
2245
2279
  canvas.smooth = this.smooth;
2280
+ canvas.pixelSnap !== pixelSnap && (canvas.pixelSnap = pixelSnap);
2246
2281
  return canvas;
2247
2282
  }
2248
2283
  recycle(clearBounds) {
@@ -3669,7 +3704,7 @@ const Resource = {
3669
3704
  const R = Resource;
3670
3705
 
3671
3706
  const ImageManager = {
3672
- maxRecycled: 100,
3707
+ maxRecycled: 10,
3673
3708
  recycledList: [],
3674
3709
  patternTasker: new TaskProcessor(),
3675
3710
  get(config) {
@@ -4022,9 +4057,8 @@ function hitType(defaultValue) {
4022
4057
  set(value) {
4023
4058
  if (this.__setAttr(key, value)) {
4024
4059
  this.__layout.hitCanvasChanged = true;
4025
- if (Debug.showHitView) {
4060
+ if (Debug.showBounds === 'hit')
4026
4061
  this.__layout.surfaceChanged || this.__layout.surfaceChange();
4027
- }
4028
4062
  if (this.leafer)
4029
4063
  this.leafer.updateCursor();
4030
4064
  }
@@ -4185,7 +4219,7 @@ function registerUIEvent() {
4185
4219
  }
4186
4220
 
4187
4221
  const { copy: copy$7, toInnerPoint: toInnerPoint$1, toOuterPoint: toOuterPoint$1, scaleOfOuter: scaleOfOuter$2, rotateOfOuter: rotateOfOuter$2, skewOfOuter, multiplyParent: multiplyParent$2, divideParent, getLayout } = MatrixHelper;
4188
- const matrix$1 = {};
4222
+ const matrix$1 = {}, { round } = Math;
4189
4223
  const LeafHelper = {
4190
4224
  updateAllMatrix(leaf, checkAutoLayout, waitAutoLayout) {
4191
4225
  if (checkAutoLayout && leaf.__hasAutoLayout && leaf.__layout.matrixChanged)
@@ -4259,6 +4293,8 @@ const LeafHelper = {
4259
4293
  y = x.y, x = x.x;
4260
4294
  x += t.x;
4261
4295
  y += t.y;
4296
+ if (t.leafer && t.leafer.config.pointSnap)
4297
+ x = round(x), y = round(y);
4262
4298
  transition ? t.animate({ x, y }, transition) : (t.x = x, t.y = y);
4263
4299
  },
4264
4300
  zoomOfWorld(t, origin, scaleX, scaleY, resize, transition) {
@@ -4497,6 +4533,7 @@ class LeafLayout {
4497
4533
  set contentBounds(bounds) { this._contentBounds = bounds; }
4498
4534
  get strokeBounds() { return this._strokeBounds || this.boxBounds; }
4499
4535
  get renderBounds() { return this._renderBounds || this.boxBounds; }
4536
+ set renderBounds(bounds) { this._renderBounds = bounds; }
4500
4537
  get localContentBounds() { toOuterOf$2(this.contentBounds, this.leaf.__localMatrix, this[localContent] || (this[localContent] = {})); return this[localContent]; }
4501
4538
  get localStrokeBounds() { return this._localStrokeBounds || this; }
4502
4539
  get localRenderBounds() { return this._localRenderBounds || this; }
@@ -4515,11 +4552,13 @@ class LeafLayout {
4515
4552
  get height() { return this.boxBounds.height; }
4516
4553
  constructor(leaf) {
4517
4554
  this.leaf = leaf;
4518
- this.boxBounds = { x: 0, y: 0, width: 0, height: 0 };
4519
4555
  if (this.leaf.__local)
4520
4556
  this._localRenderBounds = this._localStrokeBounds = this.leaf.__local;
4521
- this.boxChange();
4522
- this.matrixChange();
4557
+ if (leaf.__world) {
4558
+ this.boxBounds = { x: 0, y: 0, width: 0, height: 0 };
4559
+ this.boxChange();
4560
+ this.matrixChange();
4561
+ }
4523
4562
  }
4524
4563
  createLocal() {
4525
4564
  const local = this.leaf.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
@@ -4851,6 +4890,9 @@ class ResizeEvent extends Event {
4851
4890
  }
4852
4891
  this.old = oldSize;
4853
4892
  }
4893
+ static isResizing(leaf) {
4894
+ return this.resizingKeys && this.resizingKeys[leaf.innerId] !== undefined;
4895
+ }
4854
4896
  }
4855
4897
  ResizeEvent.RESIZE = 'resize';
4856
4898
 
@@ -4893,6 +4935,7 @@ class RenderEvent extends Event {
4893
4935
  }
4894
4936
  RenderEvent.REQUEST = 'render.request';
4895
4937
  RenderEvent.CHILD_START = 'render.child_start';
4938
+ RenderEvent.CHILD_END = 'render.child_end';
4896
4939
  RenderEvent.START = 'render.start';
4897
4940
  RenderEvent.BEFORE = 'render.before';
4898
4941
  RenderEvent.RENDER = 'render';
@@ -5272,24 +5315,27 @@ const LeafBounds = {
5272
5315
  const LeafRender = {
5273
5316
  __render(canvas, options) {
5274
5317
  if (this.__worldOpacity) {
5318
+ const data = this.__;
5275
5319
  canvas.setWorld(this.__nowWorld = this.__getNowWorld(options));
5276
- canvas.opacity = this.__.opacity;
5320
+ canvas.opacity = options.dimOpacity && !data.dimskip ? data.opacity * options.dimOpacity : data.opacity;
5277
5321
  if (this.__.__single) {
5278
- if (this.__.eraser === 'path')
5322
+ if (data.eraser === 'path')
5279
5323
  return this.__renderEraser(canvas, options);
5280
5324
  const tempCanvas = canvas.getSameCanvas(true, true);
5281
5325
  this.__draw(tempCanvas, options, canvas);
5282
5326
  if (this.__worldFlipped) {
5283
- canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, this.__.__blendMode, true);
5327
+ canvas.copyWorldByReset(tempCanvas, this.__nowWorld, null, data.__blendMode, true);
5284
5328
  }
5285
5329
  else {
5286
- canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, this.__.__blendMode);
5330
+ canvas.copyWorldToInner(tempCanvas, this.__nowWorld, this.__layout.renderBounds, data.__blendMode);
5287
5331
  }
5288
5332
  tempCanvas.recycle(this.__nowWorld);
5289
5333
  }
5290
5334
  else {
5291
5335
  this.__draw(canvas, options);
5292
5336
  }
5337
+ if (Debug.showBounds)
5338
+ Debug.drawBounds(this, canvas, options);
5293
5339
  }
5294
5340
  },
5295
5341
  __clip(canvas, options) {
@@ -5319,14 +5365,19 @@ const BranchRender = {
5319
5365
  __render(canvas, options) {
5320
5366
  this.__nowWorld = this.__getNowWorld(options);
5321
5367
  if (this.__worldOpacity) {
5322
- if (this.__.__single) {
5323
- if (this.__.eraser === 'path')
5368
+ const data = this.__;
5369
+ if (data.dim)
5370
+ options.dimOpacity = data.dim === true ? 0.2 : data.dim;
5371
+ else if (data.dimskip)
5372
+ options.dimOpacity && (options.dimOpacity = 0);
5373
+ if (data.__single) {
5374
+ if (data.eraser === 'path')
5324
5375
  return this.__renderEraser(canvas, options);
5325
5376
  const tempCanvas = canvas.getSameCanvas(false, true);
5326
5377
  this.__renderBranch(tempCanvas, options);
5327
5378
  const nowWorld = this.__nowWorld;
5328
- canvas.opacity = this.__.opacity;
5329
- canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, this.__.__blendMode, true);
5379
+ canvas.opacity = options.dimOpacity ? data.opacity * options.dimOpacity : data.opacity;
5380
+ canvas.copyWorldByReset(tempCanvas, nowWorld, nowWorld, data.__blendMode, true);
5330
5381
  tempCanvas.recycle(nowWorld);
5331
5382
  }
5332
5383
  else {
@@ -5401,9 +5452,11 @@ let Leaf = class Leaf {
5401
5452
  reset(data) {
5402
5453
  if (this.leafer)
5403
5454
  this.leafer.forceRender(this.__world);
5404
- 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 };
5405
- if (data !== null)
5406
- this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
5455
+ if (data !== 0) {
5456
+ 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 };
5457
+ if (data !== null)
5458
+ this.__local = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0, x: 0, y: 0, width: 0, height: 0 };
5459
+ }
5407
5460
  this.__worldOpacity = 1;
5408
5461
  this.__ = new this.__DataProcessor(this);
5409
5462
  this.__layout = new this.__LayoutProcessor(this);
@@ -5539,9 +5592,10 @@ let Leaf = class Leaf {
5539
5592
  if (options.matrix) {
5540
5593
  if (!this.__cameraWorld)
5541
5594
  this.__cameraWorld = {};
5542
- const cameraWorld = this.__cameraWorld;
5543
- multiplyParent(this.__world, options.matrix, cameraWorld, undefined, this.__world);
5595
+ const cameraWorld = this.__cameraWorld, world = this.__world;
5596
+ multiplyParent(world, options.matrix, cameraWorld, undefined, world);
5544
5597
  toOuterOf(this.__layout.renderBounds, cameraWorld, cameraWorld);
5598
+ cameraWorld.half !== world.half && (cameraWorld.half = world.half);
5545
5599
  return cameraWorld;
5546
5600
  }
5547
5601
  else {
@@ -5701,7 +5755,7 @@ let Leaf = class Leaf {
5701
5755
  __updateHitCanvas() { }
5702
5756
  __render(_canvas, _options) { }
5703
5757
  __drawFast(_canvas, _options) { }
5704
- __draw(_canvas, _options) { }
5758
+ __draw(_canvas, _options, _originCanvas) { }
5705
5759
  __clip(_canvas, _options) { }
5706
5760
  __renderShape(_canvas, _options, _ignoreFill, _ignoreStroke) { }
5707
5761
  __updateWorldOpacity() { }
@@ -6071,7 +6125,7 @@ class LeafLevelList {
6071
6125
  }
6072
6126
  }
6073
6127
 
6074
- const version = "1.5.2";
6128
+ const version = "1.6.0";
6075
6129
 
6076
6130
  class LeaferCanvas extends LeaferCanvasBase {
6077
6131
  get allowBackgroundColor() { return false; }
@@ -6450,7 +6504,6 @@ function updateChange(updateList) {
6450
6504
  }
6451
6505
 
6452
6506
  const { worldBounds } = LeafBoundsHelper;
6453
- const bigBounds = { x: 0, y: 0, width: 100000, height: 100000 };
6454
6507
  class LayoutBlockData {
6455
6508
  constructor(list) {
6456
6509
  this.updatedBounds = new Bounds();
@@ -6464,13 +6517,7 @@ class LayoutBlockData {
6464
6517
  this.beforeBounds.setListWithFn(this.updatedList.list, worldBounds);
6465
6518
  }
6466
6519
  setAfter() {
6467
- const { list } = this.updatedList;
6468
- if (list.some(leaf => leaf.noBounds)) {
6469
- this.afterBounds.set(bigBounds);
6470
- }
6471
- else {
6472
- this.afterBounds.setListWithFn(list, worldBounds);
6473
- }
6520
+ this.afterBounds.setListWithFn(this.updatedList.list, worldBounds);
6474
6521
  this.updatedBounds.setList([this.beforeBounds, this.afterBounds]);
6475
6522
  }
6476
6523
  merge(data) {
@@ -6672,6 +6719,13 @@ class Renderer {
6672
6719
  requestLayout() {
6673
6720
  this.target.emit(LayoutEvent.REQUEST);
6674
6721
  }
6722
+ checkRender() {
6723
+ if (this.running) {
6724
+ if (this.changed && this.canvas.view)
6725
+ this.render();
6726
+ this.target.emit(RenderEvent.NEXT);
6727
+ }
6728
+ }
6675
6729
  render(callback) {
6676
6730
  if (!(this.running && this.canvas.view))
6677
6731
  return this.update();
@@ -6680,8 +6734,6 @@ class Renderer {
6680
6734
  this.totalBounds = new Bounds();
6681
6735
  debug$3.log(target.innerName, '--->');
6682
6736
  try {
6683
- if (!target.isApp)
6684
- target.app.emit(RenderEvent.CHILD_START, target);
6685
6737
  this.emitRender(RenderEvent.START);
6686
6738
  this.renderOnce(callback);
6687
6739
  this.emitRender(RenderEvent.END, this.totalBounds);
@@ -6749,20 +6801,12 @@ class Renderer {
6749
6801
  }
6750
6802
  clipRender(block) {
6751
6803
  const t = Run.start('PartRender');
6752
- const { canvas } = this;
6753
- const bounds = block.getIntersect(canvas.bounds);
6754
- const includes = block.includes(this.target.__world);
6755
- const realBounds = new Bounds(bounds);
6804
+ const { canvas } = this, bounds = block.getIntersect(canvas.bounds), realBounds = new Bounds(bounds);
6756
6805
  canvas.save();
6757
- if (includes && !Debug.showRepaint) {
6758
- canvas.clear();
6759
- }
6760
- else {
6761
- bounds.spread(10 + 1 / this.canvas.pixelRatio).ceil();
6762
- canvas.clearWorld(bounds, true);
6763
- canvas.clipWorld(bounds, true);
6764
- }
6765
- this.__render(bounds, includes, realBounds);
6806
+ bounds.spread(Renderer.clipSpread).ceil();
6807
+ canvas.clearWorld(bounds, true);
6808
+ canvas.clipWorld(bounds, true);
6809
+ this.__render(bounds, block.includes(this.target.__world), realBounds);
6766
6810
  canvas.restore();
6767
6811
  Run.end(t);
6768
6812
  }
@@ -6776,23 +6820,17 @@ class Renderer {
6776
6820
  Run.end(t);
6777
6821
  }
6778
6822
  __render(bounds, includes, realBounds) {
6779
- const options = bounds.includes(this.target.__world) ? { includes } : { bounds, includes };
6823
+ const { canvas } = this, options = includes ? { includes } : { bounds, includes };
6780
6824
  if (this.needFill)
6781
- this.canvas.fillWorld(bounds, this.config.fill);
6825
+ canvas.fillWorld(bounds, this.config.fill);
6782
6826
  if (Debug.showRepaint)
6783
- this.canvas.strokeWorld(bounds, 'red');
6784
- this.target.__render(this.canvas, options);
6827
+ Debug.drawRepaint(canvas, bounds);
6828
+ this.target.__render(canvas, options);
6785
6829
  this.renderBounds = realBounds = realBounds || bounds;
6786
6830
  this.renderOptions = options;
6787
6831
  this.totalBounds.isEmpty() ? this.totalBounds = realBounds : this.totalBounds.add(realBounds);
6788
- if (Debug.showHitView)
6789
- this.renderHitView(options);
6790
- if (Debug.showBoundsView)
6791
- this.renderBoundsView(options);
6792
- this.canvas.updateRender(realBounds);
6793
- }
6794
- renderHitView(_options) { }
6795
- renderBoundsView(_options) { }
6832
+ canvas.updateRender(realBounds);
6833
+ }
6796
6834
  addBlock(block) {
6797
6835
  if (!this.updateBlocks)
6798
6836
  this.updateBlocks = [];
@@ -6808,17 +6846,24 @@ class Renderer {
6808
6846
  }
6809
6847
  }
6810
6848
  __requestRender() {
6849
+ const target = this.target;
6850
+ if (target.parentApp)
6851
+ return target.parentApp.renderer.update(false);
6811
6852
  if (this.requestTime)
6812
6853
  return;
6813
6854
  const requestTime = this.requestTime = Date.now();
6814
6855
  Platform.requestRender(() => {
6815
6856
  this.FPS = Math.min(60, Math.ceil(1000 / (Date.now() - requestTime)));
6816
6857
  this.requestTime = 0;
6817
- if (this.running) {
6818
- if (this.changed && this.canvas.view)
6819
- this.render();
6820
- this.target.emit(RenderEvent.NEXT);
6858
+ if (target.isApp) {
6859
+ target.emit(RenderEvent.CHILD_START, target);
6860
+ target.children.forEach(leafer => {
6861
+ leafer.renderer.FPS = this.FPS;
6862
+ leafer.renderer.checkRender();
6863
+ });
6864
+ target.emit(RenderEvent.CHILD_END, target);
6821
6865
  }
6866
+ this.checkRender();
6822
6867
  });
6823
6868
  }
6824
6869
  __onResize(e) {
@@ -6876,6 +6921,7 @@ class Renderer {
6876
6921
  }
6877
6922
  }
6878
6923
  }
6924
+ Renderer.clipSpread = 10;
6879
6925
 
6880
6926
  const { hitRadiusPoint } = BoundsHelper;
6881
6927
  class Picker {
@@ -7121,6 +7167,7 @@ class UIData extends LeafData {
7121
7167
  return strokeWidth;
7122
7168
  }
7123
7169
  get __hasStroke() { return this.stroke && this.strokeWidth; }
7170
+ get __hasHalf() { const t = this; return (t.stroke && t.strokeAlign === 'center' && t.strokeWidth % 2) || undefined; }
7124
7171
  get __hasMultiPaint() {
7125
7172
  const t = this;
7126
7173
  if ((t.__isFills && t.fill.length > 1) || (t.__isStrokes && t.stroke.length > 1) || t.__useEffect)
@@ -7165,14 +7212,14 @@ class UIData extends LeafData {
7165
7212
  this.__removeInput('fill');
7166
7213
  PaintImage.recycleImage('fill', this);
7167
7214
  this.__isFills = false;
7168
- if (this.__pixelFill)
7169
- this.__pixelFill = false;
7215
+ this.__pixelFill && (this.__pixelFill = false);
7170
7216
  }
7171
7217
  this._fill = value;
7172
7218
  }
7173
7219
  else if (typeof value === 'object') {
7174
7220
  this.__setInput('fill', value);
7175
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7221
+ const layout = this.__leaf.__layout;
7222
+ layout.boxChanged || layout.boxChange();
7176
7223
  this.__isFills = true;
7177
7224
  this._fill || (this._fill = emptyPaint);
7178
7225
  }
@@ -7183,14 +7230,14 @@ class UIData extends LeafData {
7183
7230
  this.__removeInput('stroke');
7184
7231
  PaintImage.recycleImage('stroke', this);
7185
7232
  this.__isStrokes = false;
7186
- if (this.__pixelStroke)
7187
- this.__pixelStroke = false;
7233
+ this.__pixelStroke && (this.__pixelStroke = false);
7188
7234
  }
7189
7235
  this._stroke = value;
7190
7236
  }
7191
7237
  else if (typeof value === 'object') {
7192
7238
  this.__setInput('stroke', value);
7193
- this.__leaf.__layout.boxChanged || this.__leaf.__layout.boxChange();
7239
+ const layout = this.__leaf.__layout;
7240
+ layout.boxChanged || layout.boxChange();
7194
7241
  this.__isStrokes = true;
7195
7242
  this._stroke || (this._stroke = emptyPaint);
7196
7243
  }
@@ -7305,6 +7352,31 @@ class TextData extends UIData {
7305
7352
  this._fontWeight = value;
7306
7353
  }
7307
7354
  }
7355
+ setBoxStyle(value) {
7356
+ let t = this.__leaf, box = t.__box;
7357
+ if (value) {
7358
+ const { boxStyle } = this;
7359
+ if (box)
7360
+ for (let key in boxStyle)
7361
+ box[key] = undefined;
7362
+ else
7363
+ box = t.__box = UICreator.get('Rect', 0);
7364
+ const layout = t.__layout, boxLayout = box.__layout;
7365
+ if (!boxStyle)
7366
+ box.parent = t, box.__world = t.__world, boxLayout.boxBounds = layout.boxBounds;
7367
+ box.set(value);
7368
+ if (boxLayout.strokeChanged)
7369
+ layout.strokeChange();
7370
+ if (boxLayout.renderChanged)
7371
+ layout.renderChange();
7372
+ box.__updateChange();
7373
+ }
7374
+ else if (box) {
7375
+ t.__box = box.parent = null;
7376
+ box.destroy();
7377
+ }
7378
+ this._boxStyle = value;
7379
+ }
7308
7380
  }
7309
7381
 
7310
7382
  class ImageData extends RectData {
@@ -7342,7 +7414,7 @@ class CanvasData extends RectData {
7342
7414
  const UIBounds = {
7343
7415
  __updateStrokeSpread() {
7344
7416
  let width = 0, boxWidth = 0;
7345
- const data = this.__, { strokeAlign, strokeWidth } = data;
7417
+ const data = this.__, { strokeAlign, strokeWidth } = data, box = this.__box;
7346
7418
  if ((data.stroke || data.hitStroke === 'all') && strokeWidth && strokeAlign !== 'inside') {
7347
7419
  boxWidth = width = strokeAlign === 'center' ? strokeWidth / 2 : strokeWidth;
7348
7420
  if (!data.__boxStroke) {
@@ -7353,6 +7425,10 @@ const UIBounds = {
7353
7425
  }
7354
7426
  if (data.__useArrow)
7355
7427
  width += strokeWidth * 5;
7428
+ if (box) {
7429
+ width = Math.max(box.__layout.strokeSpread = box.__updateStrokeSpread(), width);
7430
+ boxWidth = box.__layout.strokeBoxSpread;
7431
+ }
7356
7432
  this.__layout.strokeBoxSpread = boxWidth;
7357
7433
  return width;
7358
7434
  },
@@ -7371,25 +7447,26 @@ const UIBounds = {
7371
7447
  if (backgroundBlur)
7372
7448
  shapeWidth = Math.max(shapeWidth, backgroundBlur);
7373
7449
  this.__layout.renderShapeSpread = shapeWidth;
7374
- return width + (this.__layout.strokeSpread || 0);
7450
+ width += this.__layout.strokeSpread || 0;
7451
+ return this.__box ? Math.max(this.__box.__updateRenderSpread(), width) : width;
7375
7452
  }
7376
7453
  };
7377
7454
 
7378
7455
  const UIRender = {
7379
7456
  __updateChange() {
7380
- const data = this.__;
7457
+ const data = this.__, w = this.__world;
7381
7458
  if (data.__useEffect) {
7382
7459
  const { shadow, innerShadow, blur, backgroundBlur, filter } = this.__;
7383
7460
  data.__useEffect = !!(shadow || innerShadow || blur || backgroundBlur || filter);
7384
7461
  }
7462
+ const half = data.__hasHalf;
7463
+ w.half !== half && (w.half = half);
7385
7464
  data.__checkSingle();
7386
7465
  const complex = data.__isFills || data.__isStrokes || data.cornerRadius || data.__useEffect;
7387
- if (complex) {
7466
+ if (complex)
7388
7467
  data.__complex = true;
7389
- }
7390
- else {
7468
+ else
7391
7469
  data.__complex && (data.__complex = false);
7392
- }
7393
7470
  },
7394
7471
  __drawFast(canvas, options) {
7395
7472
  drawFast(this, canvas, options);
@@ -7476,10 +7553,11 @@ function drawFast(ui, canvas, options) {
7476
7553
 
7477
7554
  const RectRender = {
7478
7555
  __drawFast(canvas, options) {
7479
- let { width, height, fill, stroke, __drawAfterFill } = this.__;
7556
+ let { x, y, width, height } = this.__layout.boxBounds;
7557
+ const { fill, stroke, __drawAfterFill } = this.__;
7480
7558
  if (fill) {
7481
7559
  canvas.fillStyle = fill;
7482
- canvas.fillRect(0, 0, width, height);
7560
+ canvas.fillRect(x, y, width, height);
7483
7561
  }
7484
7562
  if (__drawAfterFill)
7485
7563
  this.__drawAfterFill(canvas, options);
@@ -7498,14 +7576,14 @@ const RectRender = {
7498
7576
  if (width < 0 || height < 0) {
7499
7577
  canvas.save();
7500
7578
  this.__clip(canvas, options);
7501
- canvas.strokeRect(half, half, width, height);
7579
+ canvas.strokeRect(x + half, y + half, width, height);
7502
7580
  canvas.restore();
7503
7581
  }
7504
7582
  else
7505
- canvas.strokeRect(half, half, width, height);
7583
+ canvas.strokeRect(x + half, y + half, width, height);
7506
7584
  break;
7507
7585
  case 'outside':
7508
- canvas.strokeRect(-half, -half, width + __strokeWidth, height + __strokeWidth);
7586
+ canvas.strokeRect(x - half, y - half, width + __strokeWidth, height + __strokeWidth);
7509
7587
  break;
7510
7588
  }
7511
7589
  }
@@ -7661,6 +7739,12 @@ __decorate([
7661
7739
  __decorate([
7662
7740
  surfaceType(false)
7663
7741
  ], UI.prototype, "locked", void 0);
7742
+ __decorate([
7743
+ surfaceType(false)
7744
+ ], UI.prototype, "dim", void 0);
7745
+ __decorate([
7746
+ surfaceType(false)
7747
+ ], UI.prototype, "dimskip", void 0);
7664
7748
  __decorate([
7665
7749
  sortType(0)
7666
7750
  ], UI.prototype, "zIndex", void 0);
@@ -7922,7 +8006,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
7922
8006
  start: true,
7923
8007
  hittable: true,
7924
8008
  smooth: true,
7925
- lazySpeard: 100
8009
+ lazySpeard: 100,
7926
8010
  };
7927
8011
  this.leafs = 0;
7928
8012
  this.__eventIds = [];
@@ -8346,13 +8430,13 @@ let Box = class Box extends Group {
8346
8430
  super.__updateRenderBounds();
8347
8431
  copy$3(childrenRenderBounds, renderBounds);
8348
8432
  this.__updateRectRenderBounds();
8349
- isOverflow = !includes$1(renderBounds, childrenRenderBounds);
8433
+ isOverflow = !includes$1(renderBounds, childrenRenderBounds) || undefined;
8350
8434
  if (isOverflow && this.__.overflow !== 'hide')
8351
8435
  add(renderBounds, childrenRenderBounds);
8352
8436
  }
8353
8437
  else
8354
8438
  this.__updateRectRenderBounds();
8355
- !this.isOverflow !== !isOverflow && (this.isOverflow = isOverflow);
8439
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8356
8440
  }
8357
8441
  __updateRectRenderBounds() { }
8358
8442
  __updateRectChange() { }
@@ -8760,33 +8844,13 @@ Canvas = __decorate([
8760
8844
  registerUI()
8761
8845
  ], Canvas);
8762
8846
 
8763
- const { copyAndSpread, includes, isSame: isSame$1, spread, setList } = BoundsHelper;
8847
+ const { copyAndSpread, includes, spread, setList } = BoundsHelper;
8764
8848
  let Text = class Text extends UI {
8765
8849
  get __tag() { return 'Text'; }
8766
- get textDrawData() {
8767
- this.__layout.update();
8768
- return this.__.__textDrawData;
8769
- }
8850
+ get textDrawData() { this.updateLayout(); return this.__.__textDrawData; }
8770
8851
  constructor(data) {
8771
8852
  super(data);
8772
8853
  }
8773
- __drawHitPath(canvas) {
8774
- const { __lineHeight, fontSize, __baseLine, __textDrawData: data } = this.__;
8775
- canvas.beginPath();
8776
- if (this.__.__letterSpacing < 0) {
8777
- this.__drawPathByData(canvas);
8778
- }
8779
- else {
8780
- data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
8781
- }
8782
- }
8783
- __drawPathByData(drawer, _data) {
8784
- const { x, y, width, height } = this.__layout.boxBounds;
8785
- drawer.rect(x, y, width, height);
8786
- }
8787
- __drawRenderPath(canvas) {
8788
- canvas.font = this.__.__font;
8789
- }
8790
8854
  __updateTextDrawData() {
8791
8855
  const data = this.__;
8792
8856
  const { lineHeight, letterSpacing, fontFamily, fontSize, fontWeight, italic, textCase, textOverflow, padding } = data;
@@ -8803,15 +8867,16 @@ let Text = class Text extends UI {
8803
8867
  const layout = this.__layout;
8804
8868
  const { fontSize, italic, padding, __autoWidth: autoWidth, __autoHeight: autoHeight } = data;
8805
8869
  this.__updateTextDrawData();
8806
- const { bounds } = data.__textDrawData;
8870
+ const { bounds: contentBounds } = data.__textDrawData;
8807
8871
  const b = layout.boxBounds;
8872
+ layout.contentBounds = contentBounds;
8808
8873
  if (data.__lineHeight < fontSize)
8809
- spread(bounds, fontSize / 2);
8874
+ spread(contentBounds, fontSize / 2);
8810
8875
  if (autoWidth || autoHeight) {
8811
- b.x = autoWidth ? bounds.x : 0;
8812
- b.y = autoHeight ? bounds.y : 0;
8813
- b.width = autoWidth ? bounds.width : data.width;
8814
- b.height = autoHeight ? bounds.height : data.height;
8876
+ b.x = autoWidth ? contentBounds.x : 0;
8877
+ b.y = autoHeight ? contentBounds.y : 0;
8878
+ b.width = autoWidth ? contentBounds.width : data.width;
8879
+ b.height = autoHeight ? contentBounds.height : data.height;
8815
8880
  if (padding) {
8816
8881
  const [top, right, bottom, left] = data.__padding;
8817
8882
  if (autoWidth)
@@ -8825,23 +8890,45 @@ let Text = class Text extends UI {
8825
8890
  super.__updateBoxBounds();
8826
8891
  if (italic)
8827
8892
  b.width += fontSize * 0.16;
8828
- const contentBounds = includes(b, bounds) ? b : bounds;
8829
- if (!isSame$1(contentBounds, layout.contentBounds)) {
8830
- layout.contentBounds = contentBounds;
8831
- layout.renderChanged = true;
8832
- setList(data.__textBoxBounds = {}, [b, bounds]);
8833
- }
8893
+ const isOverflow = !includes(b, contentBounds) || undefined;
8894
+ if (isOverflow)
8895
+ setList(data.__textBoxBounds = {}, [b, contentBounds]), layout.renderChanged = true;
8834
8896
  else
8835
- data.__textBoxBounds = contentBounds;
8897
+ data.__textBoxBounds = b;
8898
+ this.isOverflow !== isOverflow && (this.isOverflow = isOverflow);
8899
+ }
8900
+ __onUpdateSize() {
8901
+ if (this.__box)
8902
+ this.__box.__onUpdateSize();
8903
+ super.__onUpdateSize();
8836
8904
  }
8837
8905
  __updateRenderSpread() {
8838
8906
  let width = super.__updateRenderSpread();
8839
8907
  if (!width)
8840
- width = this.__layout.boxBounds === this.__layout.contentBounds ? 0 : 1;
8908
+ width = this.isOverflow ? 1 : 0;
8841
8909
  return width;
8842
8910
  }
8843
8911
  __updateRenderBounds() {
8844
- copyAndSpread(this.__layout.renderBounds, this.__.__textBoxBounds, this.__layout.renderSpread);
8912
+ const { renderBounds, renderSpread } = this.__layout;
8913
+ copyAndSpread(renderBounds, this.__.__textBoxBounds, renderSpread);
8914
+ if (this.__box)
8915
+ this.__box.__layout.renderBounds = renderBounds;
8916
+ }
8917
+ __drawRenderPath(canvas) {
8918
+ canvas.font = this.__.__font;
8919
+ }
8920
+ __draw(canvas, options, originCanvas) {
8921
+ const box = this.__box;
8922
+ if (box)
8923
+ box.__nowWorld = this.__nowWorld, box.__draw(canvas, options, originCanvas);
8924
+ if (this.textEditing && !Export.running)
8925
+ return;
8926
+ super.__draw(canvas, options, originCanvas);
8927
+ }
8928
+ destroy() {
8929
+ if (this.boxStyle)
8930
+ this.boxStyle = null;
8931
+ super.destroy();
8845
8932
  }
8846
8933
  };
8847
8934
  __decorate([
@@ -8853,6 +8940,9 @@ __decorate([
8853
8940
  __decorate([
8854
8941
  boundsType(0)
8855
8942
  ], Text.prototype, "height", void 0);
8943
+ __decorate([
8944
+ surfaceType()
8945
+ ], Text.prototype, "boxStyle", void 0);
8856
8946
  __decorate([
8857
8947
  dataType(false)
8858
8948
  ], Text.prototype, "resizeFontSize", void 0);
@@ -9016,26 +9106,25 @@ let App = class App extends Leafer {
9016
9106
  this.leafer = this;
9017
9107
  this.watcher.disable();
9018
9108
  this.layouter.disable();
9019
- this.__eventIds.push(this.on_(PropertyEvent.CHANGE, this.__onPropertyChange, this));
9020
9109
  }
9021
9110
  start() {
9022
9111
  super.start();
9023
- this.children.forEach(leafer => leafer.start());
9112
+ this.forEach(leafer => leafer.start());
9024
9113
  }
9025
9114
  stop() {
9026
- this.children.forEach(leafer => leafer.stop());
9115
+ this.forEach(leafer => leafer.stop());
9027
9116
  super.stop();
9028
9117
  }
9029
9118
  unlockLayout() {
9030
9119
  super.unlockLayout();
9031
- this.children.forEach(leafer => leafer.unlockLayout());
9120
+ this.forEach(leafer => leafer.unlockLayout());
9032
9121
  }
9033
9122
  lockLayout() {
9034
9123
  super.lockLayout();
9035
- this.children.forEach(leafer => leafer.lockLayout());
9124
+ this.forEach(leafer => leafer.lockLayout());
9036
9125
  }
9037
9126
  forceRender(bounds, sync) {
9038
- this.children.forEach(leafer => leafer.forceRender(bounds, sync));
9127
+ this.forEach(leafer => leafer.forceRender(bounds, sync));
9039
9128
  }
9040
9129
  addLeafer(merge) {
9041
9130
  const leafer = new Leafer(merge);
@@ -9055,9 +9144,8 @@ let App = class App extends Leafer {
9055
9144
  leafer.canvas.childIndex = index;
9056
9145
  this.__listenChildEvents(leafer);
9057
9146
  }
9058
- __onPropertyChange() {
9059
- if (Debug.showHitView)
9060
- this.children.forEach(leafer => leafer.forceUpdate('surface'));
9147
+ forEach(fn) {
9148
+ this.children.forEach(fn);
9061
9149
  }
9062
9150
  __onCreated() {
9063
9151
  this.created = this.children.every(child => child.created);
@@ -9080,18 +9168,18 @@ let App = class App extends Leafer {
9080
9168
  const m = options.matrix;
9081
9169
  if (m)
9082
9170
  canvas.setTransform(m.a, m.b, m.c, m.d, m.e, m.f);
9083
- this.children.forEach(leafer => canvas.copyWorld(leafer.canvas));
9171
+ this.forEach(leafer => canvas.copyWorld(leafer.canvas));
9084
9172
  }
9085
9173
  }
9086
9174
  __onResize(event) {
9087
- this.children.forEach(leafer => leafer.resize(event));
9175
+ this.forEach(leafer => leafer.resize(event));
9088
9176
  super.__onResize(event);
9089
9177
  }
9090
9178
  updateLayout() {
9091
- this.children.forEach(leafer => leafer.updateLayout());
9179
+ this.forEach(leafer => leafer.updateLayout());
9092
9180
  }
9093
9181
  __getChildConfig(userConfig) {
9094
- let config = Object.assign({}, this.config);
9182
+ const config = Object.assign({}, this.config);
9095
9183
  config.hittable = config.realCanvas = undefined;
9096
9184
  if (userConfig)
9097
9185
  DataHelper.assign(config, userConfig);
@@ -9650,6 +9738,7 @@ const config = {
9650
9738
  delta: { x: 80 / 4, y: 8.0 },
9651
9739
  },
9652
9740
  pointer: {
9741
+ snap: true,
9653
9742
  hitRadius: 5,
9654
9743
  tapTime: 120,
9655
9744
  longPressTime: 800,
@@ -9744,7 +9833,7 @@ class InteractionBase {
9744
9833
  if (this.downData) {
9745
9834
  const canDrag = PointHelper.getDistance(this.downData, data) > this.p.dragDistance;
9746
9835
  if (canDrag) {
9747
- if (this.waitTap)
9836
+ if (this.waitTap || this.longPressTimer)
9748
9837
  this.pointerWaitCancel();
9749
9838
  this.waitRightTap = false;
9750
9839
  }
@@ -10005,7 +10094,10 @@ class InteractionBase {
10005
10094
  }
10006
10095
  getLocal(clientPoint, updateClient) {
10007
10096
  const clientBounds = this.canvas.getClientBounds(updateClient);
10008
- return { x: clientPoint.clientX - clientBounds.x, y: clientPoint.clientY - clientBounds.y };
10097
+ const point = { x: clientPoint.clientX - clientBounds.x, y: clientPoint.clientY - clientBounds.y };
10098
+ if (this.p.snap)
10099
+ PointHelper.round(point);
10100
+ return point;
10009
10101
  }
10010
10102
  emitTap(data) {
10011
10103
  this.emit(PointerEvent.TAP, data);
@@ -10137,25 +10229,26 @@ const { toInnerRadiusPointOf, copy: copy$2, setRadius } = PointHelper;
10137
10229
  const inner = {};
10138
10230
  const leaf = Leaf.prototype;
10139
10231
  leaf.__hitWorld = function (point) {
10140
- if (!this.__.hitSelf)
10232
+ const data = this.__;
10233
+ if (!data.hitSelf)
10141
10234
  return false;
10142
- if (this.__.hitRadius) {
10235
+ const world = this.__world, layout = this.__layout;
10236
+ const isSmall = world.width < 10 && world.height < 10;
10237
+ if (data.hitRadius) {
10143
10238
  copy$2(inner, point), point = inner;
10144
- setRadius(point, this.__.hitRadius);
10239
+ setRadius(point, data.hitRadius);
10145
10240
  }
10146
- toInnerRadiusPointOf(point, this.__world, inner);
10147
- const { width, height } = this.__world;
10148
- const isSmall = width < 10 && height < 10;
10149
- if (this.__.hitBox || isSmall) {
10150
- if (BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner))
10241
+ toInnerRadiusPointOf(point, world, inner);
10242
+ if (data.hitBox || isSmall) {
10243
+ if (BoundsHelper.hitRadiusPoint(layout.boxBounds, inner))
10151
10244
  return true;
10152
10245
  if (isSmall)
10153
10246
  return false;
10154
10247
  }
10155
- if (this.__layout.hitCanvasChanged || !this.__hitCanvas) {
10248
+ if (layout.hitCanvasChanged || !this.__hitCanvas) {
10156
10249
  this.__updateHitCanvas();
10157
- if (!this.__layout.boundsChanged)
10158
- this.__layout.hitCanvasChanged = false;
10250
+ if (!layout.boundsChanged)
10251
+ layout.hitCanvasChanged = false;
10159
10252
  }
10160
10253
  return this.__hit(inner);
10161
10254
  };
@@ -10168,7 +10261,9 @@ leaf.__drawHitPath = function (canvas) { if (canvas)
10168
10261
  const matrix = new Matrix();
10169
10262
  const ui$1 = UI.prototype;
10170
10263
  ui$1.__updateHitCanvas = function () {
10171
- const data = this.__, { hitCanvasManager } = this.leafer;
10264
+ if (this.__box)
10265
+ this.__box.__updateHitCanvas();
10266
+ const data = this.__, { hitCanvasManager } = this.leafer || this.parent.leafer;
10172
10267
  const isHitPixelFill = (data.__pixelFill || data.__isCanvas) && data.hitFill === 'pixel';
10173
10268
  const isHitPixelStroke = data.__pixelStroke && data.hitStroke === 'pixel';
10174
10269
  const isHitPixel = isHitPixelFill || isHitPixelStroke;
@@ -10195,6 +10290,8 @@ ui$1.__updateHitCanvas = function () {
10195
10290
  h.setStrokeOptions(data);
10196
10291
  };
10197
10292
  ui$1.__hit = function (inner) {
10293
+ if (this.__box && this.__box.__hit(inner))
10294
+ return true;
10198
10295
  const data = this.__;
10199
10296
  if (data.__isHitPixel && this.__hitPixel(inner))
10200
10297
  return true;
@@ -10243,6 +10340,15 @@ rect.__hitFill = box$1.__hitFill = function (inner) {
10243
10340
  return this.__hitCanvas ? ui.__hitFill.call(this, inner) : BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
10244
10341
  };
10245
10342
 
10343
+ Text.prototype.__drawHitPath = function (canvas) {
10344
+ const { __lineHeight, fontSize, __baseLine, __letterSpacing, __textDrawData: data } = this.__;
10345
+ canvas.beginPath();
10346
+ if (__letterSpacing < 0)
10347
+ this.__drawPathByBox(canvas);
10348
+ else
10349
+ data.rows.forEach(row => canvas.rect(row.x, row.y - __baseLine, row.width, __lineHeight < fontSize ? fontSize : __lineHeight));
10350
+ };
10351
+
10246
10352
  function getSelector(ui) {
10247
10353
  return ui.leafer ? ui.leafer.selector : (Platform.selector || (Platform.selector = Creator.selector()));
10248
10354
  }
@@ -10730,9 +10836,11 @@ const tempBox = new Bounds();
10730
10836
  const tempPoint = {};
10731
10837
  const tempScaleData = {};
10732
10838
  function createData(leafPaint, image, paint, box) {
10733
- const { blendMode, sync } = paint;
10839
+ const { blendMode, changeful, sync } = paint;
10734
10840
  if (blendMode)
10735
10841
  leafPaint.blendMode = blendMode;
10842
+ if (changeful)
10843
+ leafPaint.changeful = changeful;
10736
10844
  if (sync)
10737
10845
  leafPaint.sync = sync;
10738
10846
  leafPaint.data = getPatternData(paint, box, image);
@@ -10965,40 +11073,32 @@ function createPattern(ui, paint, pixelRatio) {
10965
11073
  }
10966
11074
 
10967
11075
  const { abs } = Math;
10968
- function checkImage(ui, canvas, paint, allowPaint) {
11076
+ function checkImage(ui, canvas, paint, allowDraw) {
10969
11077
  const { scaleX, scaleY } = ImageManager.patternLocked ? ui.__world : ui.__nowWorld;
10970
- const { pixelRatio } = canvas;
10971
- if (!paint.data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
11078
+ const { pixelRatio } = canvas, { data } = paint;
11079
+ if (!data || (paint.patternId === scaleX + '-' + scaleY + '-' + pixelRatio && !Export.running)) {
10972
11080
  return false;
10973
11081
  }
10974
11082
  else {
10975
- const { data } = paint;
10976
- if (allowPaint) {
10977
- if (!data.repeat) {
10978
- let { width, height } = data;
10979
- width *= abs(scaleX) * pixelRatio;
10980
- height *= abs(scaleY) * pixelRatio;
10981
- if (data.scaleX) {
10982
- width *= data.scaleX;
10983
- height *= data.scaleY;
10984
- }
10985
- allowPaint = (width * height > Platform.image.maxCacheSize) || Export.running;
11083
+ if (allowDraw) {
11084
+ if (data.repeat) {
11085
+ allowDraw = false;
10986
11086
  }
10987
11087
  else {
10988
- allowPaint = false;
11088
+ if (!(paint.changeful || ResizeEvent.isResizing(ui) || Export.running)) {
11089
+ let { width, height } = data;
11090
+ width *= abs(scaleX) * pixelRatio;
11091
+ height *= abs(scaleY) * pixelRatio;
11092
+ if (data.scaleX) {
11093
+ width *= data.scaleX;
11094
+ height *= data.scaleY;
11095
+ }
11096
+ allowDraw = (width * height > Platform.image.maxCacheSize);
11097
+ }
10989
11098
  }
10990
11099
  }
10991
- if (allowPaint) {
10992
- canvas.save();
10993
- ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
10994
- if (paint.blendMode)
10995
- canvas.blendMode = paint.blendMode;
10996
- if (data.opacity)
10997
- canvas.opacity *= data.opacity;
10998
- if (data.transform)
10999
- canvas.transform(data.transform);
11000
- canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
11001
- canvas.restore();
11100
+ if (allowDraw) {
11101
+ drawImage(ui, canvas, paint, data);
11002
11102
  return true;
11003
11103
  }
11004
11104
  else {
@@ -11019,13 +11119,26 @@ function checkImage(ui, canvas, paint, allowPaint) {
11019
11119
  }
11020
11120
  }
11021
11121
  }
11122
+ function drawImage(ui, canvas, paint, data) {
11123
+ canvas.save();
11124
+ ui.windingRule ? canvas.clip(ui.windingRule) : canvas.clip();
11125
+ if (paint.blendMode)
11126
+ canvas.blendMode = paint.blendMode;
11127
+ if (data.opacity)
11128
+ canvas.opacity *= data.opacity;
11129
+ if (data.transform)
11130
+ canvas.transform(data.transform);
11131
+ canvas.drawImage(paint.image.getFull(data.filters), 0, 0, data.width, data.height);
11132
+ canvas.restore();
11133
+ }
11022
11134
 
11023
11135
  function recycleImage(attrName, data) {
11024
11136
  const paints = data['_' + attrName];
11025
11137
  if (paints instanceof Array) {
11026
- let image, recycleMap, input, url;
11138
+ let paint, image, recycleMap, input, url;
11027
11139
  for (let i = 0, len = paints.length; i < len; i++) {
11028
- image = paints[i].image;
11140
+ paint = paints[i];
11141
+ image = paint.image;
11029
11142
  url = image && image.url;
11030
11143
  if (url) {
11031
11144
  if (!recycleMap)
@@ -11040,8 +11153,6 @@ function recycleImage(attrName, data) {
11040
11153
  }
11041
11154
  image.unload(paints[i].loadId, !input.some((item) => item.url === url));
11042
11155
  }
11043
- else
11044
- paints[i].style = null;
11045
11156
  }
11046
11157
  }
11047
11158
  return recycleMap;
@@ -11220,7 +11331,7 @@ const { toOffsetOutBounds } = BoundsHelper;
11220
11331
  const offsetOutBounds = {};
11221
11332
  function innerShadow(ui, current, shape) {
11222
11333
  let copyBounds, spreadScale;
11223
- const { __nowWorld: nowWorld, __layout: __layout } = ui;
11334
+ const { __nowWorld: nowWorld, __layout } = ui;
11224
11335
  const { innerShadow } = ui.__;
11225
11336
  const { worldCanvas, bounds, shapeBounds, scaleX, scaleY } = shape;
11226
11337
  const other = current.getSameCanvas();