leafer-ui 1.2.1 → 1.3.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.
@@ -765,8 +765,8 @@ const TwoPointBoundsHelper = {
765
765
  t.maxY = y > t.maxY ? y : t.maxY;
766
766
  },
767
767
  addBounds(t, x, y, width, height) {
768
- addPoint$4(t, x, y);
769
- addPoint$4(t, x + width, y + height);
768
+ addPoint$3(t, x, y);
769
+ addPoint$3(t, x + width, y + height);
770
770
  },
771
771
  copy(t, pb) {
772
772
  t.minX = pb.minX;
@@ -787,9 +787,9 @@ const TwoPointBoundsHelper = {
787
787
  setBounds.height = t.maxY - t.minY;
788
788
  }
789
789
  };
790
- const { addPoint: addPoint$4 } = TwoPointBoundsHelper;
790
+ const { addPoint: addPoint$3 } = TwoPointBoundsHelper;
791
791
 
792
- const { tempPointBounds: tempPointBounds$1, setPoint: setPoint$3, addPoint: addPoint$3, toBounds: toBounds$4 } = TwoPointBoundsHelper;
792
+ const { tempPointBounds: tempPointBounds$1, setPoint: setPoint$2, addPoint: addPoint$2, toBounds: toBounds$3 } = TwoPointBoundsHelper;
793
793
  const { toOuterPoint: toOuterPoint$2 } = MatrixHelper;
794
794
  const { float, fourNumber } = MathHelper;
795
795
  const { floor, ceil: ceil$2 } = Math;
@@ -905,17 +905,17 @@ const BoundsHelper = {
905
905
  point.x = t.x;
906
906
  point.y = t.y;
907
907
  toOuterPoint$2(matrix, point, toPoint$5);
908
- setPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
908
+ setPoint$2(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
909
909
  point.x = t.x + t.width;
910
910
  toOuterPoint$2(matrix, point, toPoint$5);
911
- addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
911
+ addPoint$2(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
912
912
  point.y = t.y + t.height;
913
913
  toOuterPoint$2(matrix, point, toPoint$5);
914
- addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
914
+ addPoint$2(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
915
915
  point.x = t.x;
916
916
  toOuterPoint$2(matrix, point, toPoint$5);
917
- addPoint$3(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
918
- toBounds$4(tempPointBounds$1, to);
917
+ addPoint$2(tempPointBounds$1, toPoint$5.x, toPoint$5.y);
918
+ toBounds$3(tempPointBounds$1, to);
919
919
  }
920
920
  },
921
921
  toInnerOf(t, matrix, to) {
@@ -1005,8 +1005,8 @@ const BoundsHelper = {
1005
1005
  B.reset(t);
1006
1006
  },
1007
1007
  setPoints(t, points) {
1008
- points.forEach((point, index) => index === 0 ? setPoint$3(tempPointBounds$1, point.x, point.y) : addPoint$3(tempPointBounds$1, point.x, point.y));
1009
- toBounds$4(tempPointBounds$1, t);
1008
+ points.forEach((point, index) => index === 0 ? setPoint$2(tempPointBounds$1, point.x, point.y) : addPoint$2(tempPointBounds$1, point.x, point.y));
1009
+ toBounds$3(tempPointBounds$1, t);
1010
1010
  },
1011
1011
  setPoint(t, point) {
1012
1012
  B.set(t, point.x, point.y);
@@ -1374,7 +1374,7 @@ function getNameList(name) {
1374
1374
  }
1375
1375
  const D$4 = Debug;
1376
1376
 
1377
- const debug$g = Debug.get('RunTime');
1377
+ const debug$f = Debug.get('RunTime');
1378
1378
  const Run = {
1379
1379
  currentId: 0,
1380
1380
  currentName: '',
@@ -1392,7 +1392,7 @@ const Run = {
1392
1392
  const time = R.idMap[id], name = R.nameMap[id];
1393
1393
  const duration = microsecond ? (performance.now() - time) / 1000 : Date.now() - time;
1394
1394
  R.idMap[id] = R.nameMap[id] = R.nameToIdMap[name] = undefined;
1395
- debug$g.log(name, duration, 'ms');
1395
+ debug$f.log(name, duration, 'ms');
1396
1396
  },
1397
1397
  endOfName(name, microsecond) {
1398
1398
  const id = R.nameToIdMap[name];
@@ -1402,34 +1402,37 @@ const Run = {
1402
1402
  };
1403
1403
  const R = Run;
1404
1404
 
1405
+ const check = [];
1405
1406
  const Plugin = {
1406
1407
  list: {},
1407
- add(name) {
1408
+ add(name, ...needPlugins) {
1408
1409
  this.list[name] = true;
1410
+ check.push(...needPlugins);
1409
1411
  },
1410
- check(name, tip) {
1412
+ has(name, tip) {
1411
1413
  const rs = this.list[name];
1412
1414
  if (!rs && tip)
1413
1415
  this.need(name);
1414
1416
  return rs;
1415
1417
  },
1416
1418
  need(name) {
1417
- console.error('need plugin: @leafer-in/' + name);
1419
+ console.error('need plugin: ' + (name.includes('-x') ? '' : '@leafer-in/') + name);
1418
1420
  }
1419
1421
  };
1422
+ setTimeout(() => check.forEach(name => Plugin.has(name, true)));
1420
1423
 
1421
- const debug$f = Debug.get('UICreator');
1424
+ const debug$e = Debug.get('UICreator');
1422
1425
  const UICreator = {
1423
1426
  list: {},
1424
1427
  register(UI) {
1425
1428
  const { __tag: tag } = UI.prototype;
1426
1429
  if (list$1[tag])
1427
- debug$f.repeat(tag);
1430
+ debug$e.repeat(tag);
1428
1431
  list$1[tag] = UI;
1429
1432
  },
1430
1433
  get(tag, data, x, y, width, height) {
1431
1434
  if (!list$1[tag])
1432
- debug$f.error('not register ' + tag);
1435
+ debug$e.error('not register ' + tag);
1433
1436
  const ui = new list$1[tag](data);
1434
1437
  if (x !== undefined) {
1435
1438
  ui.x = x;
@@ -1445,7 +1448,7 @@ const UICreator = {
1445
1448
  };
1446
1449
  const { list: list$1 } = UICreator;
1447
1450
 
1448
- const debug$e = Debug.get('EventCreator');
1451
+ const debug$d = Debug.get('EventCreator');
1449
1452
  const EventCreator = {
1450
1453
  nameList: {},
1451
1454
  register(Event) {
@@ -1453,7 +1456,7 @@ const EventCreator = {
1453
1456
  Object.keys(Event).forEach(key => {
1454
1457
  name = Event[key];
1455
1458
  if (typeof name === 'string')
1456
- nameList[name] && debug$e.repeat(name), nameList[name] = Event;
1459
+ nameList[name] && debug$d.repeat(name), nameList[name] = Event;
1457
1460
  });
1458
1461
  },
1459
1462
  changeName(oldName, newName) {
@@ -2047,11 +2050,11 @@ class LeaferCanvasBase extends Canvas$1 {
2047
2050
  toBlob(_type, _quality) { return undefined; }
2048
2051
  toDataURL(_type, _quality) { return undefined; }
2049
2052
  saveAs(_filename, _quality) { return undefined; }
2050
- resize(size) {
2053
+ resize(size, safeResize = true) {
2051
2054
  if (this.isSameSize(size))
2052
2055
  return;
2053
2056
  let takeCanvas;
2054
- if (this.context && !this.unreal && this.width) {
2057
+ if (this.context && !this.unreal && safeResize && this.width) {
2055
2058
  takeCanvas = this.getSameCanvas();
2056
2059
  takeCanvas.copyWorld(this);
2057
2060
  }
@@ -2342,7 +2345,7 @@ const RectHelper = {
2342
2345
  };
2343
2346
 
2344
2347
  const { sin: sin$3, cos: cos$3, atan2: atan2$1, ceil: ceil$1, abs: abs$3, PI: PI$2, sqrt: sqrt$1, pow } = Math;
2345
- const { setPoint: setPoint$2, addPoint: addPoint$2 } = TwoPointBoundsHelper;
2348
+ const { setPoint: setPoint$1, addPoint: addPoint$1 } = TwoPointBoundsHelper;
2346
2349
  const { set, toNumberPoints } = PointHelper;
2347
2350
  const { M: M$5, L: L$6, C: C$5, Q: Q$4, Z: Z$5 } = PathCommandMap;
2348
2351
  const tempPoint$2 = {};
@@ -2418,8 +2421,8 @@ const BezierHelper = {
2418
2421
  if (data)
2419
2422
  data.push(L$6, x1, y1);
2420
2423
  if (setPointBounds) {
2421
- setPoint$2(setPointBounds, fromX, fromY);
2422
- addPoint$2(setPointBounds, x1, y1);
2424
+ setPoint$1(setPointBounds, fromX, fromY);
2425
+ addPoint$1(setPointBounds, x1, y1);
2423
2426
  }
2424
2427
  if (setStartPoint)
2425
2428
  set(setStartPoint, fromX, fromY);
@@ -2471,7 +2474,7 @@ const BezierHelper = {
2471
2474
  if (data)
2472
2475
  data.push(data.length ? L$6 : M$5, fromX, fromY);
2473
2476
  if (setPointBounds)
2474
- setPoint$2(setPointBounds, fromX, fromY);
2477
+ setPoint$1(setPointBounds, fromX, fromY);
2475
2478
  if (setStartPoint)
2476
2479
  set(setStartPoint, fromX, fromY);
2477
2480
  for (let i = 0; i < parts; i++) {
@@ -2533,11 +2536,11 @@ const BezierHelper = {
2533
2536
  if (0 < t2 && t2 < 1)
2534
2537
  tList.push(t2);
2535
2538
  }
2536
- addMode ? addPoint$2(pointBounds, fromX, fromY) : setPoint$2(pointBounds, fromX, fromY);
2537
- addPoint$2(pointBounds, toX, toY);
2539
+ addMode ? addPoint$1(pointBounds, fromX, fromY) : setPoint$1(pointBounds, fromX, fromY);
2540
+ addPoint$1(pointBounds, toX, toY);
2538
2541
  for (let i = 0, len = tList.length; i < len; i++) {
2539
2542
  getPointAndSet(tList[i], fromX, fromY, x1, y1, x2, y2, toX, toY, tempPoint$2);
2540
- addPoint$2(pointBounds, tempPoint$2.x, tempPoint$2.y);
2543
+ addPoint$1(pointBounds, tempPoint$2.x, tempPoint$2.y);
2541
2544
  }
2542
2545
  },
2543
2546
  getPointAndSet(t, fromX, fromY, x1, y1, x2, y2, toX, toY, setPoint) {
@@ -2609,7 +2612,7 @@ const EllipseHelper = {
2609
2612
  const { M: M$4, m, L: L$5, l, H, h, V, v, C: C$4, c, S, s, Q: Q$3, q, T, t, A, a, Z: Z$4, z, N: N$3, D: D$3, X: X$3, G: G$3, F: F$4, O: O$3, P: P$3, U: U$3 } = PathCommandMap;
2610
2613
  const { rect: rect$3, roundRect: roundRect$2, arcTo: arcTo$3, arc: arc$3, ellipse: ellipse$4, quadraticCurveTo: quadraticCurveTo$1 } = BezierHelper;
2611
2614
  const { ellipticalArc } = EllipseHelper;
2612
- const debug$d = Debug.get('PathConvert');
2615
+ const debug$c = Debug.get('PathConvert');
2613
2616
  const setEndPoint$1 = {};
2614
2617
  const PathConvert = {
2615
2618
  current: { dot: 0 },
@@ -2850,7 +2853,7 @@ const PathConvert = {
2850
2853
  i += 6;
2851
2854
  break;
2852
2855
  default:
2853
- debug$d.error(`command: ${command} [index:${i}]`, old);
2856
+ debug$c.error(`command: ${command} [index:${i}]`, old);
2854
2857
  return data;
2855
2858
  }
2856
2859
  lastCommand = command;
@@ -3075,7 +3078,7 @@ class PathCreator {
3075
3078
  }
3076
3079
 
3077
3080
  const { M: M$2, L: L$3, C: C$2, Q: Q$1, Z: Z$2, N: N$1, D: D$1, X: X$1, G: G$1, F: F$2, O: O$1, P: P$1, U: U$1 } = PathCommandMap;
3078
- const debug$c = Debug.get('PathDrawer');
3081
+ const debug$b = Debug.get('PathDrawer');
3079
3082
  const PathDrawer = {
3080
3083
  drawPathByData(drawer, data) {
3081
3084
  if (!data)
@@ -3138,7 +3141,7 @@ const PathDrawer = {
3138
3141
  i += 6;
3139
3142
  break;
3140
3143
  default:
3141
- debug$c.error(`command: ${command} [index:${i}]`, data);
3144
+ debug$b.error(`command: ${command} [index:${i}]`, data);
3142
3145
  return;
3143
3146
  }
3144
3147
  }
@@ -3147,8 +3150,8 @@ const PathDrawer = {
3147
3150
 
3148
3151
  const { M: M$1, L: L$2, C: C$1, Q, Z: Z$1, N, D, X, G, F: F$1, O, P, U } = PathCommandMap;
3149
3152
  const { toTwoPointBounds, toTwoPointBoundsByQuadraticCurve, arcTo: arcTo$1, arc, ellipse: ellipse$1 } = BezierHelper;
3150
- const { addPointBounds, copy: copy$8, addPoint: addPoint$1, setPoint: setPoint$1, addBounds, toBounds: toBounds$3 } = TwoPointBoundsHelper;
3151
- const debug$b = Debug.get('PathBounds');
3153
+ const { addPointBounds, copy: copy$8, addPoint, setPoint, addBounds, toBounds: toBounds$2 } = TwoPointBoundsHelper;
3154
+ const debug$a = Debug.get('PathBounds');
3152
3155
  let radius, radiusX, radiusY;
3153
3156
  const tempPointBounds = {};
3154
3157
  const setPointBounds = {};
@@ -3156,21 +3159,21 @@ const setEndPoint = {};
3156
3159
  const PathBounds = {
3157
3160
  toBounds(data, setBounds) {
3158
3161
  PathBounds.toTwoPointBounds(data, setPointBounds);
3159
- toBounds$3(setPointBounds, setBounds);
3162
+ toBounds$2(setPointBounds, setBounds);
3160
3163
  },
3161
3164
  toTwoPointBounds(data, setPointBounds) {
3162
3165
  if (!data || !data.length)
3163
- return setPoint$1(setPointBounds, 0, 0);
3166
+ return setPoint(setPointBounds, 0, 0);
3164
3167
  let i = 0, x = 0, y = 0, x1, y1, toX, toY, command;
3165
3168
  const len = data.length;
3166
3169
  while (i < len) {
3167
3170
  command = data[i];
3168
3171
  if (i === 0) {
3169
3172
  if (command === Z$1 || command === C$1 || command === Q) {
3170
- setPoint$1(setPointBounds, x, y);
3173
+ setPoint(setPointBounds, x, y);
3171
3174
  }
3172
3175
  else {
3173
- setPoint$1(setPointBounds, data[i + 1], data[i + 2]);
3176
+ setPoint(setPointBounds, data[i + 1], data[i + 2]);
3174
3177
  }
3175
3178
  }
3176
3179
  switch (command) {
@@ -3178,7 +3181,7 @@ const PathBounds = {
3178
3181
  case L$2:
3179
3182
  x = data[i + 1];
3180
3183
  y = data[i + 2];
3181
- addPoint$1(setPointBounds, x, y);
3184
+ addPoint(setPointBounds, x, y);
3182
3185
  i += 3;
3183
3186
  break;
3184
3187
  case C$1:
@@ -3256,7 +3259,7 @@ const PathBounds = {
3256
3259
  i += 6;
3257
3260
  break;
3258
3261
  default:
3259
- debug$b.error(`command: ${command} [index:${i}]`, data);
3262
+ debug$a.error(`command: ${command} [index:${i}]`, data);
3260
3263
  return;
3261
3264
  }
3262
3265
  }
@@ -3372,7 +3375,7 @@ const FileHelper = {
3372
3375
  const F = FileHelper;
3373
3376
  F.opacityTypes.forEach(type => F.upperCaseTypeMap[type] = type.toUpperCase());
3374
3377
 
3375
- const debug$a = Debug.get('TaskProcessor');
3378
+ const debug$9 = Debug.get('TaskProcessor');
3376
3379
  class TaskItem {
3377
3380
  constructor(task) {
3378
3381
  this.parallel = true;
@@ -3387,7 +3390,7 @@ class TaskItem {
3387
3390
  yield this.task();
3388
3391
  }
3389
3392
  catch (error) {
3390
- debug$a.error(error);
3393
+ debug$9.error(error);
3391
3394
  }
3392
3395
  });
3393
3396
  }
@@ -4074,7 +4077,7 @@ function defineDataProcessor(target, key, defaultValue) {
4074
4077
  defineKey(data, key, property);
4075
4078
  }
4076
4079
 
4077
- const debug$9 = new Debug('rewrite');
4080
+ const debug$8 = new Debug('rewrite');
4078
4081
  const list = [];
4079
4082
  const excludeNames = ['destroy', 'constructor'];
4080
4083
  function rewrite(method) {
@@ -4091,7 +4094,7 @@ function doRewrite(error) {
4091
4094
  if (list.length) {
4092
4095
  list.forEach(item => {
4093
4096
  if (error)
4094
- debug$9.error(item.name, '需在Class上装饰@rewriteAble()');
4097
+ debug$8.error(item.name, '需在Class上装饰@rewriteAble()');
4095
4098
  item.run();
4096
4099
  });
4097
4100
  list.length = 0;
@@ -4253,18 +4256,21 @@ const LeafHelper = {
4253
4256
  L.setTransform(t, matrix$1, resize);
4254
4257
  },
4255
4258
  setTransform(t, transform, resize) {
4256
- const layout = getLayout(transform, t.origin && L.getInnerOrigin(t, t.origin), t.around && L.getInnerOrigin(t, t.around));
4259
+ const data = t.__, originPoint = data.origin && L.getInnerOrigin(t, data.origin);
4260
+ const layout = getLayout(transform, originPoint, data.around && L.getInnerOrigin(t, data.around));
4257
4261
  if (resize) {
4258
- const scaleX = layout.scaleX / t.scaleX;
4259
- const scaleY = layout.scaleY / t.scaleY;
4260
- delete layout.scaleX;
4261
- delete layout.scaleY;
4262
+ const scaleX = layout.scaleX / t.scaleX, scaleY = layout.scaleY / t.scaleY;
4263
+ delete layout.scaleX, delete layout.scaleY;
4264
+ if (originPoint) {
4265
+ BoundsHelper.scale(t.boxBounds, Math.abs(scaleX), Math.abs(scaleY));
4266
+ const changedPoint = L.getInnerOrigin(t, data.origin);
4267
+ PointHelper.move(layout, originPoint.x - changedPoint.x, originPoint.y - changedPoint.y);
4268
+ }
4262
4269
  t.set(layout);
4263
- t.scaleResize(scaleX, scaleY, resize !== true);
4270
+ t.scaleResize(scaleX, scaleY, false);
4264
4271
  }
4265
- else {
4272
+ else
4266
4273
  t.set(layout);
4267
- }
4268
4274
  },
4269
4275
  getFlipTransform(t, axis) {
4270
4276
  const m = getMatrixData();
@@ -4805,7 +4811,6 @@ class LayoutEvent extends Event {
4805
4811
  }
4806
4812
  }
4807
4813
  }
4808
- LayoutEvent.CHECK_UPDATE = 'layout.check_update';
4809
4814
  LayoutEvent.REQUEST = 'layout.request';
4810
4815
  LayoutEvent.START = 'layout.start';
4811
4816
  LayoutEvent.BEFORE = 'layout.before';
@@ -4947,14 +4952,15 @@ class Eventer {
4947
4952
  if (list) {
4948
4953
  let item;
4949
4954
  for (let i = 0, len = list.length; i < len; i++) {
4950
- item = list[i];
4951
- item.listener(event);
4952
- if (item.once) {
4953
- this.off(type, item.listener, capture);
4954
- i--, len--;
4955
+ if (item = list[i]) {
4956
+ item.listener(event);
4957
+ if (item.once) {
4958
+ this.off(type, item.listener, capture);
4959
+ i--, len--;
4960
+ }
4961
+ if (event && event.isStopNow)
4962
+ break;
4955
4963
  }
4956
- if (event && event.isStopNow)
4957
- break;
4958
4964
  }
4959
4965
  }
4960
4966
  this.syncEventer && this.syncEventer.emitEvent(event, capture);
@@ -4999,13 +5005,13 @@ const { on, on_, off, off_, once, emit: emit$2, emitEvent: emitEvent$1, hasEvent
4999
5005
  const LeafEventer = { on, on_, off, off_, once, emit: emit$2, emitEvent: emitEvent$1, hasEvent, destroyEventer: destroy };
5000
5006
 
5001
5007
  const { isFinite } = Number;
5002
- const debug$8 = Debug.get('setAttr');
5008
+ const debug$7 = Debug.get('setAttr');
5003
5009
  const LeafDataProxy = {
5004
5010
  __setAttr(name, newValue, checkFiniteNumber) {
5005
5011
  if (this.leaferIsCreated) {
5006
5012
  const oldValue = this.__.__getInput(name);
5007
5013
  if (checkFiniteNumber && !isFinite(newValue) && newValue !== undefined) {
5008
- debug$8.warn(this.innerName, name, newValue);
5014
+ debug$7.warn(this.innerName, name, newValue);
5009
5015
  newValue = undefined;
5010
5016
  }
5011
5017
  if (typeof newValue === 'object' || oldValue !== newValue) {
@@ -5075,7 +5081,7 @@ const LeafMatrix = {
5075
5081
  const { updateMatrix: updateMatrix$1, updateAllMatrix: updateAllMatrix$2 } = LeafHelper;
5076
5082
  const { updateBounds: updateBounds$1 } = BranchHelper;
5077
5083
  const { toOuterOf: toOuterOf$1, copyAndSpread: copyAndSpread$1, copy: copy$5 } = BoundsHelper;
5078
- const { toBounds: toBounds$2 } = PathBounds;
5084
+ const { toBounds: toBounds$1 } = PathBounds;
5079
5085
  const LeafBounds = {
5080
5086
  __updateWorldBounds() {
5081
5087
  toOuterOf$1(this.__layout.renderBounds, this.__world, this.__world);
@@ -5157,7 +5163,7 @@ const LeafBounds = {
5157
5163
  const b = this.__layout.boxBounds;
5158
5164
  const data = this.__;
5159
5165
  if (data.__pathInputed) {
5160
- toBounds$2(data.path, b);
5166
+ toBounds$1(data.path, b);
5161
5167
  }
5162
5168
  else {
5163
5169
  b.x = 0;
@@ -5705,7 +5711,7 @@ Leaf = __decorate([
5705
5711
  const { setListWithFn } = BoundsHelper;
5706
5712
  const { sort } = BranchHelper;
5707
5713
  const { localBoxBounds, localStrokeBounds, localRenderBounds, maskLocalBoxBounds, maskLocalStrokeBounds, maskLocalRenderBounds } = LeafBoundsHelper;
5708
- const debug$7 = new Debug('Branch');
5714
+ const debug$6 = new Debug('Branch');
5709
5715
  let Branch = class Branch extends Leaf {
5710
5716
  __updateStrokeSpread() {
5711
5717
  const { children } = this;
@@ -5747,7 +5753,7 @@ let Branch = class Branch extends Leaf {
5747
5753
  }
5748
5754
  add(child, index) {
5749
5755
  if (child === this || child.destroyed)
5750
- return debug$7.warn('add self or destroyed');
5756
+ return debug$6.warn('add self or destroyed');
5751
5757
  const noIndex = index === undefined;
5752
5758
  if (!child.__) {
5753
5759
  if (child instanceof Array)
@@ -6001,9 +6007,9 @@ class LeafLevelList {
6001
6007
  }
6002
6008
  }
6003
6009
 
6004
- const version = "1.2.1";
6010
+ const version = "1.3.0";
6005
6011
 
6006
- const debug$6 = Debug.get('LeaferCanvas');
6012
+ const debug$5 = Debug.get('LeaferCanvas');
6007
6013
  class LeaferCanvas extends LeaferCanvasBase {
6008
6014
  set zIndex(zIndex) {
6009
6015
  const { style } = this.view;
@@ -6075,7 +6081,7 @@ class LeaferCanvas extends LeaferCanvasBase {
6075
6081
  }
6076
6082
  }
6077
6083
  else {
6078
- debug$6.error(`no id: ${inputView}`);
6084
+ debug$5.error(`no id: ${inputView}`);
6079
6085
  this.__createView();
6080
6086
  }
6081
6087
  }
@@ -6093,7 +6099,8 @@ class LeaferCanvas extends LeaferCanvasBase {
6093
6099
  this.view.height = Math.ceil(height * pixelRatio);
6094
6100
  }
6095
6101
  updateClientBounds() {
6096
- this.clientBounds = this.view.getBoundingClientRect();
6102
+ if (this.view.parentElement)
6103
+ this.clientBounds = this.view.getBoundingClientRect();
6097
6104
  }
6098
6105
  startAutoLayout(autoBounds, listener) {
6099
6106
  this.resizeListener = listener;
@@ -6112,7 +6119,7 @@ class LeaferCanvas extends LeaferCanvasBase {
6112
6119
  }
6113
6120
  else {
6114
6121
  this.checkAutoBounds(this.view);
6115
- debug$6.warn('no parent');
6122
+ debug$5.warn('no parent');
6116
6123
  }
6117
6124
  }
6118
6125
  catch (_a) {
@@ -6448,7 +6455,7 @@ class LayoutBlockData {
6448
6455
  }
6449
6456
 
6450
6457
  const { updateAllMatrix, updateAllChange } = LeafHelper;
6451
- const debug$5 = Debug.get('Layouter');
6458
+ const debug$4 = Debug.get('Layouter');
6452
6459
  class Layouter {
6453
6460
  constructor(target, userConfig) {
6454
6461
  this.totalTimes = 0;
@@ -6483,7 +6490,7 @@ class Layouter {
6483
6490
  target.emitEvent(new LayoutEvent(LayoutEvent.END, this.layoutedBlocks, this.times));
6484
6491
  }
6485
6492
  catch (e) {
6486
- debug$5.error(e);
6493
+ debug$4.error(e);
6487
6494
  }
6488
6495
  this.layoutedBlocks = null;
6489
6496
  }
@@ -6497,9 +6504,9 @@ class Layouter {
6497
6504
  }
6498
6505
  layoutOnce() {
6499
6506
  if (this.layouting)
6500
- return debug$5.warn('layouting');
6507
+ return debug$4.warn('layouting');
6501
6508
  if (this.times > 3)
6502
- return debug$5.warn('layout max times');
6509
+ return debug$4.warn('layout max times');
6503
6510
  this.times++;
6504
6511
  this.totalTimes++;
6505
6512
  this.layouting = true;
@@ -6603,7 +6610,7 @@ class Layouter {
6603
6610
  }
6604
6611
  }
6605
6612
 
6606
- const debug$4 = Debug.get('Renderer');
6613
+ const debug$3 = Debug.get('Renderer');
6607
6614
  class Renderer {
6608
6615
  get needFill() { return !!(!this.canvas.allowBackgroundColor && this.config.fill); }
6609
6616
  constructor(target, canvas, userConfig) {
@@ -6641,7 +6648,7 @@ class Renderer {
6641
6648
  const { target } = this;
6642
6649
  this.times = 0;
6643
6650
  this.totalBounds = new Bounds();
6644
- debug$4.log(target.innerName, '--->');
6651
+ debug$3.log(target.innerName, '--->');
6645
6652
  try {
6646
6653
  if (!target.isApp)
6647
6654
  target.app.emit(RenderEvent.CHILD_START, target);
@@ -6652,9 +6659,9 @@ class Renderer {
6652
6659
  }
6653
6660
  catch (e) {
6654
6661
  this.rendering = false;
6655
- debug$4.error(e);
6662
+ debug$3.error(e);
6656
6663
  }
6657
- debug$4.log('-------------|');
6664
+ debug$3.log('-------------|');
6658
6665
  }
6659
6666
  renderAgain() {
6660
6667
  if (this.rendering) {
@@ -6666,9 +6673,9 @@ class Renderer {
6666
6673
  }
6667
6674
  renderOnce(callback) {
6668
6675
  if (this.rendering)
6669
- return debug$4.warn('rendering');
6676
+ return debug$3.warn('rendering');
6670
6677
  if (this.times > 3)
6671
- return debug$4.warn('render max times');
6678
+ return debug$3.warn('render max times');
6672
6679
  this.times++;
6673
6680
  this.totalTimes++;
6674
6681
  this.rendering = true;
@@ -6705,7 +6712,7 @@ class Renderer {
6705
6712
  partRender() {
6706
6713
  const { canvas, updateBlocks: list } = this;
6707
6714
  if (!list)
6708
- return debug$4.warn('PartRender: need update attr');
6715
+ return debug$3.warn('PartRender: need update attr');
6709
6716
  this.mergeBlocks();
6710
6717
  list.forEach(block => { if (canvas.bounds.hit(block) && !block.isEmpty())
6711
6718
  this.clipRender(block); });
@@ -6808,7 +6815,7 @@ class Renderer {
6808
6815
  empty = (!leaf.__world.width || !leaf.__world.height);
6809
6816
  if (empty) {
6810
6817
  if (!leaf.isLeafer)
6811
- debug$4.tip(leaf.innerName, ': empty');
6818
+ debug$3.tip(leaf.innerName, ': empty');
6812
6819
  empty = (!leaf.isBranch || leaf.isBranchLeaf);
6813
6820
  }
6814
6821
  return empty;
@@ -6974,143 +6981,26 @@ class Picker {
6974
6981
  }
6975
6982
  }
6976
6983
 
6977
- const { Yes, NoAndSkip, YesAndSkip } = Answer;
6978
- const idCondition = {}, classNameCondition = {}, tagCondition = {};
6979
6984
  class Selector {
6980
6985
  constructor(target, userConfig) {
6981
6986
  this.config = {};
6982
- this.innerIdMap = {};
6983
- this.idMap = {};
6984
- this.methods = {
6985
- id: (leaf, name) => leaf.id === name ? (this.target && (this.idMap[name] = leaf), 1) : 0,
6986
- innerId: (leaf, innerId) => leaf.innerId === innerId ? (this.target && (this.innerIdMap[innerId] = leaf), 1) : 0,
6987
- className: (leaf, name) => leaf.className === name ? 1 : 0,
6988
- tag: (leaf, name) => leaf.__tag === name ? 1 : 0,
6989
- tags: (leaf, nameMap) => nameMap[leaf.__tag] ? 1 : 0
6990
- };
6991
- this.target = target;
6992
6987
  if (userConfig)
6993
6988
  this.config = DataHelper.default(userConfig, this.config);
6994
- this.picker = new Picker(target, this);
6995
- if (target)
6996
- this.__listenEvents();
6997
- }
6998
- getBy(condition, branch, one, options) {
6999
- switch (typeof condition) {
7000
- case 'number':
7001
- const leaf = this.getByInnerId(condition, branch);
7002
- return one ? leaf : (leaf ? [leaf] : []);
7003
- case 'string':
7004
- switch (condition[0]) {
7005
- case '#':
7006
- idCondition.id = condition.substring(1), condition = idCondition;
7007
- break;
7008
- case '.':
7009
- classNameCondition.className = condition.substring(1), condition = classNameCondition;
7010
- break;
7011
- default:
7012
- tagCondition.tag = condition, condition = tagCondition;
7013
- }
7014
- case 'object':
7015
- if (condition.id !== undefined) {
7016
- const leaf = this.getById(condition.id, branch);
7017
- return one ? leaf : (leaf ? [leaf] : []);
7018
- }
7019
- else if (condition.tag) {
7020
- const { tag } = condition, isArray = tag instanceof Array;
7021
- return this.getByMethod(isArray ? this.methods.tags : this.methods.tag, branch, one, isArray ? DataHelper.toMap(tag) : tag);
7022
- }
7023
- else {
7024
- return this.getByMethod(this.methods.className, branch, one, condition.className);
7025
- }
7026
- case 'function':
7027
- return this.getByMethod(condition, branch, one, options);
7028
- }
6989
+ this.picker = new Picker(this.target = target, this);
6990
+ this.finder = Creator.finder && Creator.finder();
7029
6991
  }
7030
6992
  getByPoint(hitPoint, hitRadius, options) {
7031
- if (Platform.name === 'node' && this.target)
7032
- this.target.emit(LayoutEvent.CHECK_UPDATE);
6993
+ if (Platform.backgrounder && this.target)
6994
+ this.target.updateLayout();
7033
6995
  return this.picker.getByPoint(hitPoint, hitRadius, options);
7034
6996
  }
7035
- getByInnerId(innerId, branch) {
7036
- const cache = this.innerIdMap[innerId];
7037
- if (cache)
7038
- return cache;
7039
- this.eachFind(this.toChildren(branch), this.methods.innerId, null, innerId);
7040
- return this.findLeaf;
7041
- }
7042
- getById(id, branch) {
7043
- const cache = this.idMap[id];
7044
- if (cache && LeafHelper.hasParent(cache, branch || this.target))
7045
- return cache;
7046
- this.eachFind(this.toChildren(branch), this.methods.id, null, id);
7047
- return this.findLeaf;
7048
- }
7049
- getByClassName(className, branch) {
7050
- return this.getByMethod(this.methods.className, branch, false, className);
7051
- }
7052
- getByTag(tag, branch) {
7053
- return this.getByMethod(this.methods.tag, branch, false, tag);
7054
- }
7055
- getByMethod(method, branch, one, options) {
7056
- const list = one ? null : [];
7057
- this.eachFind(this.toChildren(branch), method, list, options);
7058
- return list || this.findLeaf;
7059
- }
7060
- eachFind(children, method, list, options) {
7061
- let child, result;
7062
- for (let i = 0, len = children.length; i < len; i++) {
7063
- child = children[i];
7064
- result = method(child, options);
7065
- if (result === Yes || result === YesAndSkip) {
7066
- if (list) {
7067
- list.push(child);
7068
- }
7069
- else {
7070
- this.findLeaf = child;
7071
- return;
7072
- }
7073
- }
7074
- if (child.isBranch && result < NoAndSkip)
7075
- this.eachFind(child.children, method, list, options);
7076
- }
7077
- }
7078
- toChildren(branch) {
7079
- this.findLeaf = null;
7080
- return [branch || this.target];
7081
- }
7082
- __onRemoveChild(event) {
7083
- const { id, innerId } = event.child;
7084
- if (this.idMap[id])
7085
- delete this.idMap[id];
7086
- if (this.innerIdMap[innerId])
7087
- delete this.innerIdMap[innerId];
7088
- }
7089
- __checkIdChange(event) {
7090
- if (event.attrName === 'id') {
7091
- const id = event.oldValue;
7092
- if (this.idMap[id])
7093
- delete this.idMap[id];
7094
- }
7095
- }
7096
- __listenEvents() {
7097
- this.__eventIds = [
7098
- this.target.on_(ChildEvent.REMOVE, this.__onRemoveChild, this),
7099
- this.target.on_(PropertyEvent.CHANGE, this.__checkIdChange, this)
7100
- ];
7101
- }
7102
- __removeListenEvents() {
7103
- this.target.off_(this.__eventIds);
7104
- this.__eventIds.length = 0;
6997
+ getBy(condition, branch, one, options) {
6998
+ return this.finder ? this.finder.getBy(condition, branch, one, options) : Plugin.need('find');
7105
6999
  }
7106
7000
  destroy() {
7107
- if (this.__eventIds.length) {
7108
- this.__removeListenEvents();
7109
- this.picker.destroy();
7110
- this.findLeaf = null;
7111
- this.innerIdMap = {};
7112
- this.idMap = {};
7113
- }
7001
+ this.picker.destroy();
7002
+ if (this.finder)
7003
+ this.finder.destroy();
7114
7004
  }
7115
7005
  }
7116
7006
 
@@ -7183,7 +7073,7 @@ const Transition = {
7183
7073
 
7184
7074
  const { parse, objectToCanvasData } = PathConvert;
7185
7075
  const emptyPaint = {};
7186
- const debug$3 = Debug.get('UIData');
7076
+ const debug$2 = Debug.get('UIData');
7187
7077
  class UIData extends LeafData {
7188
7078
  get scale() { const { scaleX, scaleY } = this; return scaleX !== scaleY ? { x: scaleX, y: scaleY } : scaleX; }
7189
7079
  get __strokeWidth() {
@@ -7220,7 +7110,7 @@ class UIData extends LeafData {
7220
7110
  if (value < 0) {
7221
7111
  this._width = -value;
7222
7112
  this.__leaf.scaleX *= -1;
7223
- debug$3.warn('width < 0, instead -scaleX ', this);
7113
+ debug$2.warn('width < 0, instead -scaleX ', this);
7224
7114
  }
7225
7115
  else
7226
7116
  this._width = value;
@@ -7229,7 +7119,7 @@ class UIData extends LeafData {
7229
7119
  if (value < 0) {
7230
7120
  this._height = -value;
7231
7121
  this.__leaf.scaleY *= -1;
7232
- debug$3.warn('height < 0, instead -scaleY', this);
7122
+ debug$2.warn('height < 0, instead -scaleY', this);
7233
7123
  }
7234
7124
  else
7235
7125
  this._height = value;
@@ -7606,25 +7496,27 @@ let UI = UI_1 = class UI extends Leaf {
7606
7496
  }
7607
7497
  reset(_data) { }
7608
7498
  set(data, transition) {
7609
- if (transition) {
7610
- if (transition === 'temp') {
7611
- this.lockNormalStyle = true;
7612
- Object.assign(this, data);
7613
- this.lockNormalStyle = false;
7499
+ if (data) {
7500
+ if (transition) {
7501
+ if (transition === 'temp') {
7502
+ this.lockNormalStyle = true;
7503
+ Object.assign(this, data);
7504
+ this.lockNormalStyle = false;
7505
+ }
7506
+ else
7507
+ this.animate(data, transition);
7614
7508
  }
7615
7509
  else
7616
- this.animate(data, transition);
7510
+ Object.assign(this, data);
7617
7511
  }
7618
- else
7619
- Object.assign(this, data);
7620
7512
  }
7621
7513
  get(name) {
7622
7514
  return typeof name === 'string' ? this.__.__getInput(name) : this.__.__getInputData(name);
7623
7515
  }
7624
7516
  createProxyData() { return undefined; }
7625
- find(_condition, _options) { return undefined; }
7517
+ find(_condition, _options) { return Plugin.need('find'); }
7626
7518
  findTag(tag) { return this.find({ tag }); }
7627
- findOne(_condition, _options) { return undefined; }
7519
+ findOne(_condition, _options) { return Plugin.need('find'); }
7628
7520
  findId(id) { return this.findOne({ id }); }
7629
7521
  getPath(curve, pathForRender) {
7630
7522
  this.__layout.update();
@@ -7676,9 +7568,9 @@ let UI = UI_1 = class UI extends Leaf {
7676
7568
  animate(_keyframe, _options, _type, _isTemp) {
7677
7569
  return Plugin.need('animate');
7678
7570
  }
7679
- killAnimate(_type) { }
7680
- export(filename, options) {
7681
- return Export.export(this, filename, options);
7571
+ killAnimate(_type, _killStyle) { }
7572
+ export(_filename, _options) {
7573
+ return Plugin.need('export');
7682
7574
  }
7683
7575
  clone(data) {
7684
7576
  const json = this.toJSON();
@@ -7924,16 +7816,18 @@ let Group = class Group extends UI {
7924
7816
  this.children = [];
7925
7817
  }
7926
7818
  set(data, transition) {
7927
- if (data.children) {
7928
- const { children } = data;
7929
- delete data.children;
7930
- this.children ? this.clear() : this.__setBranch();
7931
- super.set(data, transition);
7932
- children.forEach(child => this.add(child));
7933
- data.children = children;
7819
+ if (data) {
7820
+ if (data.children) {
7821
+ const { children } = data;
7822
+ delete data.children;
7823
+ this.children ? this.clear() : this.__setBranch();
7824
+ super.set(data, transition);
7825
+ children.forEach(child => this.add(child));
7826
+ data.children = children;
7827
+ }
7828
+ else
7829
+ super.set(data, transition);
7934
7830
  }
7935
- else
7936
- super.set(data, transition);
7937
7831
  }
7938
7832
  toJSON(options) {
7939
7833
  const data = super.toJSON(options);
@@ -7965,7 +7859,7 @@ Group = __decorate([
7965
7859
  ], Group);
7966
7860
 
7967
7861
  var Leafer_1;
7968
- const debug$2 = Debug.get('Leafer');
7862
+ const debug$1 = Debug.get('Leafer');
7969
7863
  let Leafer = Leafer_1 = class Leafer extends Group {
7970
7864
  get __tag() { return 'Leafer'; }
7971
7865
  get isApp() { return false; }
@@ -8130,7 +8024,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8130
8024
  if (this.canvas) {
8131
8025
  if (canvasSizeAttrs.includes(attrName)) {
8132
8026
  if (!newValue)
8133
- debug$2.warn(attrName + ' is 0');
8027
+ debug$1.warn(attrName + ' is 0');
8134
8028
  this.__changeCanvasSize(attrName, newValue);
8135
8029
  }
8136
8030
  else if (attrName === 'fill') {
@@ -8196,6 +8090,8 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8196
8090
  this.requestRender();
8197
8091
  }
8198
8092
  }
8093
+ else
8094
+ this.requestRender();
8199
8095
  }
8200
8096
  __checkViewCompleted(emit = true) {
8201
8097
  this.nextRender(() => {
@@ -8269,9 +8165,6 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8269
8165
  this.canvas && this.canvas.updateClientBounds();
8270
8166
  }
8271
8167
  receiveEvent(_event) { }
8272
- __checkUpdateLayout() {
8273
- this.__layout.update();
8274
- }
8275
8168
  emitLeafer(type) {
8276
8169
  this.emitEvent(new LeaferEvent(type, this));
8277
8170
  }
@@ -8282,7 +8175,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8282
8175
  this.once(LayoutEvent.END, () => this.__onReady());
8283
8176
  this.once(RenderEvent.START, () => this.__onCreated());
8284
8177
  this.once(RenderEvent.END, () => this.__onViewReady());
8285
- this.__eventIds.push(this.on_(WatchEvent.DATA, this.__onWatchData, this), this.on_(RenderEvent.NEXT, this.__onNextRender, this), this.on_(LayoutEvent.CHECK_UPDATE, this.__checkUpdateLayout, this));
8178
+ this.__eventIds.push(this.on_(WatchEvent.DATA, this.__onWatchData, this), this.on_(RenderEvent.NEXT, this.__onNextRender, this));
8286
8179
  }
8287
8180
  __removeListenEvents() {
8288
8181
  this.off_(this.__eventIds);
@@ -8313,7 +8206,7 @@ let Leafer = Leafer_1 = class Leafer extends Group {
8313
8206
  setTimeout(() => { ImageManager.clearRecycled(); }, 100);
8314
8207
  }
8315
8208
  catch (e) {
8316
- debug$2.error(e);
8209
+ debug$1.error(e);
8317
8210
  }
8318
8211
  }
8319
8212
  };
@@ -8347,7 +8240,7 @@ Rect = __decorate([
8347
8240
  ], Rect);
8348
8241
 
8349
8242
  const { copy: copy$3, add, includes: includes$1 } = BoundsHelper;
8350
- const rect$1 = Rect.prototype, group$1 = Group.prototype;
8243
+ const rect$1 = Rect.prototype, group = Group.prototype;
8351
8244
  const childrenRenderBounds = {};
8352
8245
  let Box = class Box extends Group {
8353
8246
  get __tag() { return 'Box'; }
@@ -8457,7 +8350,7 @@ __decorate([
8457
8350
  rewrite(rect$1.__render)
8458
8351
  ], Box.prototype, "__renderRect", null);
8459
8352
  __decorate([
8460
- rewrite(group$1.__render)
8353
+ rewrite(group.__render)
8461
8354
  ], Box.prototype, "__renderGroup", null);
8462
8355
  Box = __decorate([
8463
8356
  rewriteAble(),
@@ -8542,7 +8435,7 @@ Ellipse = __decorate([
8542
8435
 
8543
8436
  const { moveTo: moveTo$2, lineTo: lineTo$2, drawPoints: drawPoints$1 } = PathCommandDataHelper;
8544
8437
  const { rotate: rotate$1, getAngle: getAngle$1, getDistance: getDistance$2, defaultPoint } = PointHelper;
8545
- const { toBounds: toBounds$1 } = PathBounds;
8438
+ const { toBounds } = PathBounds;
8546
8439
  let Line = class Line extends UI {
8547
8440
  get __tag() { return 'Line'; }
8548
8441
  get toPoint() {
@@ -8586,7 +8479,7 @@ let Line = class Line extends UI {
8586
8479
  }
8587
8480
  __updateBoxBounds() {
8588
8481
  if (this.points) {
8589
- toBounds$1(this.__.__pathForRender, this.__layout.boxBounds);
8482
+ toBounds(this.__.__pathForRender, this.__layout.boxBounds);
8590
8483
  }
8591
8484
  else
8592
8485
  super.__updateBoxBounds();
@@ -8761,10 +8654,10 @@ let Canvas = class Canvas extends Rect {
8761
8654
  __updateSize() {
8762
8655
  const { canvas } = this;
8763
8656
  if (canvas) {
8764
- const { smooth } = this.__;
8657
+ const { smooth, safeResize } = this.__;
8658
+ canvas.resize(this.__, safeResize);
8765
8659
  if (canvas.smooth !== smooth)
8766
8660
  canvas.smooth = smooth;
8767
- canvas.resize(this.__);
8768
8661
  }
8769
8662
  }
8770
8663
  destroy() {
@@ -8790,6 +8683,9 @@ __decorate([
8790
8683
  __decorate([
8791
8684
  resizeType(true)
8792
8685
  ], Canvas.prototype, "smooth", void 0);
8686
+ __decorate([
8687
+ dataType(false)
8688
+ ], Canvas.prototype, "safeResize", void 0);
8793
8689
  __decorate([
8794
8690
  resizeType()
8795
8691
  ], Canvas.prototype, "contextSettings", void 0);
@@ -8935,6 +8831,9 @@ __decorate([
8935
8831
  __decorate([
8936
8832
  boundsType(0)
8937
8833
  ], Text.prototype, "paraSpacing", void 0);
8834
+ __decorate([
8835
+ boundsType('x')
8836
+ ], Text.prototype, "writingMode", void 0);
8938
8837
  __decorate([
8939
8838
  boundsType('left')
8940
8839
  ], Text.prototype, "textAlign", void 0);
@@ -9121,8 +9020,8 @@ let App = class App extends Leafer {
9121
9020
  this.children.forEach(leafer => leafer.resize(event));
9122
9021
  super.__onResize(event);
9123
9022
  }
9124
- __checkUpdateLayout() {
9125
- this.children.forEach(leafer => leafer.__layout.update());
9023
+ updateLayout() {
9024
+ this.children.forEach(leafer => leafer.updateLayout());
9126
9025
  }
9127
9026
  __getChildConfig(userConfig) {
9128
9027
  let config = Object.assign({}, this.config);
@@ -9612,7 +9511,7 @@ class Dragger {
9612
9511
  }
9613
9512
  }
9614
9513
 
9615
- const debug$1 = Debug.get('emit');
9514
+ const debug = Debug.get('emit');
9616
9515
  function emit$1(type, data, path, excludePath) {
9617
9516
  if (!path && !data.path)
9618
9517
  return;
@@ -9642,7 +9541,7 @@ function emit$1(type, data, path, excludePath) {
9642
9541
  }
9643
9542
  }
9644
9543
  catch (e) {
9645
- debug$1.error(e);
9544
+ debug.error(e);
9646
9545
  }
9647
9546
  }
9648
9547
  const allowTypes = ['move', 'zoom', 'rotate', 'key'];
@@ -10199,8 +10098,8 @@ leaf.__drawHitPath = function (canvas) { if (canvas)
10199
10098
  this.__drawRenderPath(canvas); };
10200
10099
 
10201
10100
  const matrix = new Matrix();
10202
- const ui$2 = UI.prototype;
10203
- ui$2.__updateHitCanvas = function () {
10101
+ const ui$1 = UI.prototype;
10102
+ ui$1.__updateHitCanvas = function () {
10204
10103
  const data = this.__, { hitCanvasManager } = this.leafer;
10205
10104
  const isHitPixelFill = (data.__pixelFill || data.__isCanvas) && data.hitFill === 'pixel';
10206
10105
  const isHitPixelStroke = data.__pixelStroke && data.hitStroke === 'pixel';
@@ -10227,7 +10126,7 @@ ui$2.__updateHitCanvas = function () {
10227
10126
  this.__drawHitPath(h);
10228
10127
  h.setStrokeOptions(data);
10229
10128
  };
10230
- ui$2.__hit = function (inner) {
10129
+ ui$1.__hit = function (inner) {
10231
10130
  if (Platform.name === 'miniapp')
10232
10131
  this.__drawHitPath(this.__hitCanvas);
10233
10132
  const data = this.__;
@@ -10267,43 +10166,35 @@ ui$2.__hit = function (inner) {
10267
10166
  return hitWidth ? this.__hitStroke(inner, hitWidth) : false;
10268
10167
  };
10269
10168
 
10270
- const ui$1 = UI.prototype, rect = Rect.prototype, box$1 = Box.prototype;
10169
+ const ui = UI.prototype, rect = Rect.prototype, box$1 = Box.prototype;
10271
10170
  rect.__updateHitCanvas = box$1.__updateHitCanvas = function () {
10272
10171
  if (this.stroke || this.cornerRadius || ((this.fill || this.__.__isCanvas) && this.hitFill === 'pixel') || this.hitStroke === 'all')
10273
- ui$1.__updateHitCanvas.call(this);
10172
+ ui.__updateHitCanvas.call(this);
10274
10173
  else if (this.__hitCanvas)
10275
10174
  this.__hitCanvas = null;
10276
10175
  };
10277
10176
  rect.__hitFill = box$1.__hitFill = function (inner) {
10278
- return this.__hitCanvas ? ui$1.__hitFill.call(this, inner) : BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
10177
+ return this.__hitCanvas ? ui.__hitFill.call(this, inner) : BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
10279
10178
  };
10280
10179
 
10281
- const ui = UI.prototype, group = Group.prototype;
10282
10180
  function getSelector(ui) {
10283
10181
  return ui.leafer ? ui.leafer.selector : (Platform.selector || (Platform.selector = Creator.selector()));
10284
10182
  }
10285
- ui.find = function (condition, options) {
10286
- return getSelector(this).getBy(condition, this, false, options);
10287
- };
10288
- ui.findOne = function (condition, options) {
10289
- return getSelector(this).getBy(condition, this, true, options);
10290
- };
10291
- group.pick = function (hitPoint, options) {
10292
- this.__layout.update();
10293
- if (!options)
10294
- options = {};
10183
+ Group.prototype.pick = function (hitPoint, options) {
10184
+ this.leafer || this.updateLayout();
10185
+ options || (options = emptyData);
10295
10186
  return getSelector(this).getByPoint(hitPoint, options.hitRadius || 0, Object.assign(Object.assign({}, options), { target: this }));
10296
10187
  };
10297
10188
 
10298
- const canvas$1 = LeaferCanvasBase.prototype;
10299
- canvas$1.hitFill = function (point, fillRule) {
10189
+ const canvas = LeaferCanvasBase.prototype;
10190
+ canvas.hitFill = function (point, fillRule) {
10300
10191
  return fillRule ? this.context.isPointInPath(point.x, point.y, fillRule) : this.context.isPointInPath(point.x, point.y);
10301
10192
  };
10302
- canvas$1.hitStroke = function (point, strokeWidth) {
10193
+ canvas.hitStroke = function (point, strokeWidth) {
10303
10194
  this.strokeWidth = strokeWidth;
10304
10195
  return this.context.isPointInStroke(point.x, point.y);
10305
10196
  };
10306
- canvas$1.hitPixel = function (radiusPoint, offset, scale = 1) {
10197
+ canvas.hitPixel = function (radiusPoint, offset, scale = 1) {
10307
10198
  let { x, y, radiusX, radiusY } = radiusPoint;
10308
10199
  if (offset)
10309
10200
  x -= offset.x, y -= offset.y;
@@ -12099,197 +11990,12 @@ const ColorConvertModule = {
12099
11990
  string
12100
11991
  };
12101
11992
 
12102
- const { setPoint, addPoint, toBounds } = TwoPointBoundsHelper;
12103
- function getTrimBounds(canvas) {
12104
- const { width, height } = canvas.view;
12105
- const { data } = canvas.context.getImageData(0, 0, width, height);
12106
- let x, y, pointBounds, index = 0;
12107
- for (let i = 0; i < data.length; i += 4) {
12108
- if (data[i + 3] !== 0) {
12109
- x = index % width;
12110
- y = (index - x) / width;
12111
- pointBounds ? addPoint(pointBounds, x, y) : setPoint(pointBounds = {}, x, y);
12112
- }
12113
- index++;
12114
- }
12115
- const bounds = new Bounds();
12116
- toBounds(pointBounds, bounds);
12117
- return bounds.scale(1 / canvas.pixelRatio).ceil();
12118
- }
12119
-
12120
- const ExportModule = {
12121
- export(leaf, filename, options) {
12122
- this.running = true;
12123
- const fileType = FileHelper.fileType(filename);
12124
- const isDownload = filename.includes('.');
12125
- options = FileHelper.getExportOptions(options);
12126
- return addTask((success) => new Promise((resolve) => {
12127
- const over = (result) => {
12128
- success(result);
12129
- resolve();
12130
- this.running = false;
12131
- };
12132
- const { toURL } = Platform;
12133
- const { download } = Platform.origin;
12134
- if (fileType === 'json') {
12135
- isDownload && download(toURL(JSON.stringify(leaf.toJSON(options.json)), 'text'), filename);
12136
- return over({ data: isDownload ? true : leaf.toJSON(options.json) });
12137
- }
12138
- if (fileType === 'svg') {
12139
- isDownload && download(toURL(leaf.toSVG(), 'svg'), filename);
12140
- return over({ data: isDownload ? true : leaf.toSVG() });
12141
- }
12142
- const { leafer } = leaf;
12143
- if (leafer) {
12144
- checkLazy(leaf);
12145
- leafer.waitViewCompleted(() => __awaiter(this, void 0, void 0, function* () {
12146
- let renderBounds, trimBounds, scaleX = 1, scaleY = 1;
12147
- const { worldTransform, isLeafer, isFrame } = leaf;
12148
- const { slice, trim, onCanvas } = options;
12149
- const smooth = options.smooth === undefined ? leafer.config.smooth : options.smooth;
12150
- const contextSettings = options.contextSettings || leafer.config.contextSettings;
12151
- const screenshot = options.screenshot || leaf.isApp;
12152
- const fill = (isLeafer && screenshot) ? (options.fill === undefined ? leaf.fill : options.fill) : options.fill;
12153
- const needFill = FileHelper.isOpaqueImage(filename) || fill, matrix = new Matrix();
12154
- if (screenshot) {
12155
- renderBounds = screenshot === true ? (isLeafer ? leafer.canvas.bounds : leaf.worldRenderBounds) : screenshot;
12156
- }
12157
- else {
12158
- let relative = options.relative || (isLeafer ? 'inner' : 'local');
12159
- scaleX = worldTransform.scaleX;
12160
- scaleY = worldTransform.scaleY;
12161
- switch (relative) {
12162
- case 'inner':
12163
- matrix.set(worldTransform);
12164
- break;
12165
- case 'local':
12166
- matrix.set(worldTransform).divide(leaf.localTransform);
12167
- scaleX /= leaf.scaleX;
12168
- scaleY /= leaf.scaleY;
12169
- break;
12170
- case 'world':
12171
- scaleX = 1;
12172
- scaleY = 1;
12173
- break;
12174
- case 'page':
12175
- relative = leaf.leafer;
12176
- default:
12177
- matrix.set(worldTransform).divide(leaf.getTransform(relative));
12178
- const l = relative.worldTransform;
12179
- scaleX /= scaleX / l.scaleX;
12180
- scaleY /= scaleY / l.scaleY;
12181
- }
12182
- renderBounds = leaf.getBounds('render', relative);
12183
- }
12184
- const scaleData = { scaleX: 1, scaleY: 1 };
12185
- MathHelper.getScaleData(options.scale, options.size, renderBounds, scaleData);
12186
- let pixelRatio = options.pixelRatio || 1;
12187
- if (leaf.isApp) {
12188
- scaleData.scaleX *= pixelRatio;
12189
- scaleData.scaleY *= pixelRatio;
12190
- pixelRatio = leaf.app.pixelRatio;
12191
- }
12192
- const { x, y, width, height } = new Bounds(renderBounds).scale(scaleData.scaleX, scaleData.scaleY);
12193
- const renderOptions = { matrix: matrix.scale(1 / scaleData.scaleX, 1 / scaleData.scaleY).invert().translate(-x, -y).withScale(1 / scaleX * scaleData.scaleX, 1 / scaleY * scaleData.scaleY) };
12194
- let canvas = Creator.canvas({ width: Math.round(width), height: Math.round(height), pixelRatio, smooth, contextSettings });
12195
- let sliceLeaf;
12196
- if (slice) {
12197
- sliceLeaf = leaf;
12198
- sliceLeaf.__worldOpacity = 0;
12199
- leaf = leafer;
12200
- renderOptions.bounds = canvas.bounds;
12201
- }
12202
- canvas.save();
12203
- if (isFrame && fill !== undefined) {
12204
- const oldFill = leaf.get('fill');
12205
- leaf.fill = '';
12206
- leaf.__render(canvas, renderOptions);
12207
- leaf.fill = oldFill;
12208
- }
12209
- else {
12210
- leaf.__render(canvas, renderOptions);
12211
- }
12212
- canvas.restore();
12213
- if (sliceLeaf)
12214
- sliceLeaf.__updateWorldOpacity();
12215
- if (trim) {
12216
- trimBounds = getTrimBounds(canvas);
12217
- const old = canvas, { width, height } = trimBounds;
12218
- const config = { x: 0, y: 0, width, height, pixelRatio };
12219
- canvas = Creator.canvas(config);
12220
- canvas.copyWorld(old, trimBounds, config);
12221
- }
12222
- if (needFill)
12223
- canvas.fillWorld(canvas.bounds, fill || '#FFFFFF', 'destination-over');
12224
- if (onCanvas)
12225
- onCanvas(canvas);
12226
- const data = filename === 'canvas' ? canvas : yield canvas.export(filename, options);
12227
- over({ data, width: canvas.pixelWidth, height: canvas.pixelHeight, renderBounds, trimBounds });
12228
- }));
12229
- }
12230
- else {
12231
- over({ data: false });
12232
- }
12233
- }));
12234
- }
12235
- };
12236
- let tasker;
12237
- function addTask(task) {
12238
- if (!tasker)
12239
- tasker = new TaskProcessor();
12240
- return new Promise((resolve) => {
12241
- tasker.add(() => __awaiter(this, void 0, void 0, function* () { return yield task(resolve); }), { parallel: false });
12242
- });
12243
- }
12244
- function checkLazy(leaf) {
12245
- if (leaf.__.__needComputePaint)
12246
- leaf.__.__computePaint();
12247
- if (leaf.isBranch)
12248
- leaf.children.forEach(child => checkLazy(child));
12249
- }
12250
-
12251
- const canvas = LeaferCanvasBase.prototype;
12252
- const debug = Debug.get('@leafer-ui/export');
12253
- canvas.export = function (filename, options) {
12254
- const { quality, blob } = FileHelper.getExportOptions(options);
12255
- if (filename.includes('.'))
12256
- return this.saveAs(filename, quality);
12257
- else if (blob)
12258
- return this.toBlob(filename, quality);
12259
- else
12260
- return this.toDataURL(filename, quality);
12261
- };
12262
- canvas.toBlob = function (type, quality) {
12263
- return new Promise((resolve) => {
12264
- Platform.origin.canvasToBolb(this.view, type, quality).then((blob) => {
12265
- resolve(blob);
12266
- }).catch((e) => {
12267
- debug.error(e);
12268
- resolve(null);
12269
- });
12270
- });
12271
- };
12272
- canvas.toDataURL = function (type, quality) {
12273
- return Platform.origin.canvasToDataURL(this.view, type, quality);
12274
- };
12275
- canvas.saveAs = function (filename, quality) {
12276
- return new Promise((resolve) => {
12277
- Platform.origin.canvasSaveAs(this.view, filename, quality).then(() => {
12278
- resolve(true);
12279
- }).catch((e) => {
12280
- debug.error(e);
12281
- resolve(false);
12282
- });
12283
- });
12284
- };
12285
-
12286
11993
  Object.assign(TextConvert, TextConvertModule);
12287
11994
  Object.assign(ColorConvert, ColorConvertModule);
12288
11995
  Object.assign(Paint, PaintModule);
12289
11996
  Object.assign(PaintImage, PaintImageModule);
12290
11997
  Object.assign(PaintGradient, PaintGradientModule);
12291
11998
  Object.assign(Effect, EffectModule);
12292
- Object.assign(Export, ExportModule);
12293
11999
 
12294
12000
  Object.assign(Creator, {
12295
12001
  interaction: (target, canvas, selector, options) => new Interaction(target, canvas, selector, options),
@@ -12298,4 +12004,4 @@ Object.assign(Creator, {
12298
12004
  });
12299
12005
  useCanvas();
12300
12006
 
12301
- export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isNull, layoutProcessor, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix, tempPoint$3 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };
12007
+ export { AlignHelper, Answer, App, AroundHelper, AutoBounds, BezierHelper, Bounds, BoundsHelper, Box, BoxData, Branch, BranchHelper, BranchRender, Canvas, CanvasData, CanvasManager, ChildEvent, ColorConvert, Creator, Cursor, DataHelper, Debug, Direction4, Direction9, DragEvent, Dragger, DropEvent, Effect, Ellipse, EllipseData, EllipseHelper, Event, EventCreator, Eventer, Export, FileHelper, Frame, FrameData, Group, GroupData, HitCanvasManager, Image$1 as Image, ImageData, ImageEvent, ImageManager, IncrementId, Interaction, InteractionBase, InteractionHelper, KeyEvent, Keyboard, LayoutEvent, Layouter, Leaf, LeafBounds, LeafBoundsHelper, LeafData, LeafDataProxy, LeafEventer, LeafHelper, LeafLayout, LeafLevelList, LeafList, LeafMatrix, LeafRender, Leafer, LeaferCanvas, LeaferCanvasBase, LeaferData, LeaferEvent, LeaferImage, Line, LineData, MathHelper, Matrix, MatrixHelper, MoveEvent, MyDragEvent, MyImage, MyPointerEvent, NeedConvertToCanvasCommandMap, OneRadian, PI2, PI_2, Paint, PaintGradient, PaintImage, Path, PathArrow, PathBounds, PathCommandDataHelper, PathCommandMap, PathConvert, PathCorner, PathCreator, PathData, PathDrawer, PathHelper, PathNumberCommandLengthMap, PathNumberCommandMap, Pen, PenData, Picker, Platform, Plugin, Point, PointHelper, PointerButton, PointerEvent, Polygon, PolygonData, PropertyEvent, Rect, RectData, RectHelper, RectRender, RenderEvent, Renderer, ResizeEvent, RotateEvent, Run, Selector, Star, StarData, State, StringNumberMap, SwipeEvent, TaskItem, TaskProcessor, Text, TextConvert, TextData, Transition, TwoPointBoundsHelper, UI, UIBounds, UICreator, UIData, UIEvent, UIRender, UnitConvert, WaitHelper, WatchEvent, Watcher, ZoomEvent, affectRenderBoundsType, affectStrokeBoundsType, attr, autoLayoutType, boundsType, canvasPatch, canvasSizeAttrs, cursorType, dataProcessor, dataType, decorateLeafAttr, defineDataProcessor, defineKey, defineLeafAttr, doBoundsType, doStrokeType, effectType, emptyData, eraserType, getBoundsData, getDescriptor, getMatrixData, getPointData, hitType, isNull, layoutProcessor, maskType, naturalBoundsType, opacityType, pathInputType, pathType, pen, positionType, registerUI, registerUIEvent, resizeType, rewrite, rewriteAble, rotationType, scaleType, sortType, strokeType, surfaceType, tempBounds$1 as tempBounds, tempMatrix, tempPoint$3 as tempPoint, useCanvas, useModule, version, visibleType, zoomLayerType };