@leafer-ui/core 1.0.0-rc.17 → 1.0.0-rc.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/core.cjs CHANGED
@@ -358,17 +358,21 @@ exports.KeyEvent = __decorate([
358
358
  function design(leafer) {
359
359
  if (leafer.isApp)
360
360
  return;
361
- leafer.__eventIds.push(leafer.on_(exports.MoveEvent.BEFORE_MOVE, (e) => leafer.zoomLayer.move(e.moveX, e.moveY)), leafer.on_(exports.ZoomEvent.BEFORE_ZOOM, (e) => {
361
+ leafer.__eventIds.push(leafer.on_(exports.MoveEvent.BEFORE_MOVE, (e) => {
362
+ let { moveX, moveY } = e;
363
+ if (leafer.config.move.scroll) {
364
+ if (Math.abs(moveX) > Math.abs(moveY))
365
+ moveY = 0;
366
+ else
367
+ moveX = 0;
368
+ }
369
+ leafer.zoomLayer.move(moveX, moveY);
370
+ }), leafer.on_(exports.ZoomEvent.BEFORE_ZOOM, (e) => {
362
371
  const { zoomLayer } = leafer;
363
- const { scaleX } = zoomLayer.__, { min, max } = leafer.app.config.zoom;
364
- let { scale } = e, absScale = Math.abs(scaleX * scale);
365
- if (absScale < min)
366
- scale = min / scaleX;
367
- else if (absScale > max)
368
- scale = max / scaleX;
369
- if (scale !== 1) {
370
- core.PointHelper.scaleOf(zoomLayer, e, scale);
371
- zoomLayer.scale = scaleX * scale;
372
+ const changeScale = leafer.validScale(e.scale);
373
+ if (changeScale !== 1) {
374
+ core.PointHelper.scaleOf(zoomLayer, e, changeScale);
375
+ zoomLayer.scale = zoomLayer.__.scaleX * changeScale;
372
376
  }
373
377
  }));
374
378
  }
@@ -412,6 +416,7 @@ class Transformer {
412
416
  const { path } = interaction.selector.getByPoint(data, interaction.hitRadius);
413
417
  data.path = path;
414
418
  this.moveData = Object.assign(Object.assign({}, data), { moveX: 0, moveY: 0 });
419
+ interaction.cancelHover();
415
420
  interaction.emit(exports.MoveEvent.START, this.moveData);
416
421
  }
417
422
  data.path = this.moveData.path;
@@ -425,6 +430,7 @@ class Transformer {
425
430
  const { path } = interaction.selector.getByPoint(data, interaction.hitRadius);
426
431
  data.path = path;
427
432
  this.zoomData = Object.assign(Object.assign({}, data), { scale: 1 });
433
+ interaction.cancelHover();
428
434
  interaction.emit(exports.ZoomEvent.START, this.zoomData);
429
435
  }
430
436
  data.path = this.zoomData.path;
@@ -438,6 +444,7 @@ class Transformer {
438
444
  const { path } = interaction.selector.getByPoint(data, interaction.hitRadius);
439
445
  data.path = path;
440
446
  this.rotateData = Object.assign(Object.assign({}, data), { rotation: 0 });
447
+ interaction.cancelHover();
441
448
  interaction.emit(exports.RotateEvent.START, this.rotateData);
442
449
  }
443
450
  data.path = this.rotateData.path;
@@ -555,6 +562,7 @@ class Dragger {
555
562
  this.dragEndReal();
556
563
  this.downData = this.interaction.downData;
557
564
  this.dragData = getDragEventData(data, data, data);
565
+ this.canAnimate = this.canDragOut = true;
558
566
  }
559
567
  getList() {
560
568
  const { proxy } = this.interaction.selector;
@@ -567,9 +575,6 @@ class Dragger {
567
575
  interaction.pointerCancel();
568
576
  return;
569
577
  }
570
- else {
571
- this.canAnimate = true;
572
- }
573
578
  if (!this.moving && canDrag) {
574
579
  if (this.moving = interaction.moveMode || interaction.isHoldRightKey)
575
580
  interaction.emit(exports.MoveEvent.START, this.dragData);
@@ -620,13 +625,14 @@ class Dragger {
620
625
  const list = this.getList();
621
626
  if (list.length && running) {
622
627
  const { moveX, moveY } = this.dragData;
623
- list.forEach(leaf => core.LeafHelper.moveWorld(leaf, moveX, moveY));
628
+ list.forEach(leaf => leaf.moveWorld(moveX, moveY));
624
629
  }
625
630
  }
626
631
  dragOverOrOut(data) {
627
632
  const { interaction } = this;
628
633
  const { dragOverPath } = this;
629
634
  const { path } = data;
635
+ this.dragOverPath = path;
630
636
  if (dragOverPath) {
631
637
  if (path.indexAt(0) !== dragOverPath.indexAt(0)) {
632
638
  interaction.emit(exports.DragEvent.OUT, data, dragOverPath);
@@ -636,7 +642,6 @@ class Dragger {
636
642
  else {
637
643
  interaction.emit(exports.DragEvent.OVER, data, path);
638
644
  }
639
- this.dragOverPath = path;
640
645
  }
641
646
  dragEnterOrLeave(data) {
642
647
  const { interaction } = this;
@@ -650,7 +655,7 @@ class Dragger {
650
655
  if (!this.dragData)
651
656
  return;
652
657
  const { moveX, moveY } = this.dragData;
653
- if (this.canAnimate && this.moving && (Math.abs(moveX) > 1 || Math.abs(moveY) > 1)) {
658
+ if (this.interaction.config.move.dragAnimate && this.canAnimate && this.moving && (Math.abs(moveX) > 1 || Math.abs(moveY) > 1)) {
654
659
  data = Object.assign({}, data);
655
660
  speed = (speed || (data.pointerType === 'touch' ? 2 : 1)) * 0.9;
656
661
  core.PointHelper.move(data, moveX * speed, moveY * speed);
@@ -684,12 +689,11 @@ class Dragger {
684
689
  animate(func, off) {
685
690
  const animateWait = func || this.animateWait;
686
691
  if (animateWait)
687
- this.interaction.target.nextRender(animateWait, off);
692
+ this.interaction.target.nextRender(animateWait, null, off);
688
693
  this.animateWait = func;
689
694
  }
690
695
  swipe(data, endDragData) {
691
- const { interaction } = this;
692
- const { downData } = interaction;
696
+ const { interaction, downData } = this;
693
697
  if (core.PointHelper.getDistance(downData, data) > interaction.config.pointer.swipeDistance) {
694
698
  const swipeData = getSwipeEventData(downData, this.dragData, endDragData);
695
699
  this.interaction.emit(swipeData.type, swipeData);
@@ -712,9 +716,9 @@ class Dragger {
712
716
  this.autoMoveOnDragOut(data);
713
717
  }
714
718
  autoMoveOnDragOut(data) {
715
- const { interaction, downData } = this;
719
+ const { interaction, downData, canDragOut } = this;
716
720
  const { autoDistance, dragOut } = interaction.config.move;
717
- if (!dragOut || !autoDistance)
721
+ if (!dragOut || !canDragOut || !autoDistance)
718
722
  return;
719
723
  const bounds = interaction.shrinkCanvasBounds;
720
724
  const { x, y } = bounds;
@@ -790,12 +794,16 @@ function emitAppChildren(leaf, type, data, capture, excludePath) {
790
794
  function emitEvent(leaf, type, data, capture, excludePath) {
791
795
  if (leaf.destroyed)
792
796
  return true;
793
- if (leaf.__.hitSelf && leaf.hasEvent(type, capture) && !exclude(leaf, excludePath)) {
794
- data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
795
- const event = core.EventCreator.get(type, data);
796
- leaf.emitEvent(event, capture);
797
- if (event.isStop)
798
- return true;
797
+ if (leaf.__.hitSelf && !exclude(leaf, excludePath)) {
798
+ if (draw$1.State.updateEventStyle)
799
+ draw$1.State.updateEventStyle(leaf, type);
800
+ if (leaf.hasEvent(type, capture)) {
801
+ data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
802
+ const event = core.EventCreator.get(type, data);
803
+ leaf.emitEvent(event, capture);
804
+ if (event.isStop)
805
+ return true;
806
+ }
799
807
  }
800
808
  return false;
801
809
  }
@@ -820,7 +828,6 @@ const MultiTouchHelper = {
820
828
 
821
829
  const config = {
822
830
  wheel: {
823
- zoomMode: false,
824
831
  zoomSpeed: 0.5,
825
832
  moveSpeed: 0.5,
826
833
  rotateSpeed: 0.5,
@@ -829,14 +836,12 @@ const config = {
829
836
  },
830
837
  pointer: {
831
838
  hitRadius: 5,
832
- through: false,
833
839
  tapTime: 120,
834
840
  longPressTime: 800,
835
841
  transformTime: 500,
836
842
  dragHover: true,
837
843
  dragDistance: 2,
838
844
  swipeDistance: 20,
839
- ignoreMove: false,
840
845
  preventDefaultMenu: true
841
846
  },
842
847
  cursor: {}
@@ -879,17 +884,19 @@ class InteractionBase {
879
884
  this.updateDownData(data);
880
885
  if (useDefaultPath)
881
886
  data.path = this.defaultPath;
882
- this.emit(exports.PointerEvent.BEFORE_DOWN, data);
883
- this.emit(exports.PointerEvent.DOWN, data);
884
887
  this.downTime = Date.now();
885
- this.dragger.setDragData(data);
886
- if (PointerButton.left(data)) {
887
- this.tapWait();
888
- this.longPressWait(data);
889
- }
890
- else if (PointerButton.right(data)) {
891
- this.waitMenuTap = true;
888
+ if (this.downed = !this.moveMode) {
889
+ this.emit(exports.PointerEvent.BEFORE_DOWN, data);
890
+ this.emit(exports.PointerEvent.DOWN, data);
891
+ if (PointerButton.left(data)) {
892
+ this.tapWait();
893
+ this.longPressWait(data);
894
+ }
895
+ else if (PointerButton.right(data)) {
896
+ this.waitMenuTap = true;
897
+ }
892
898
  }
899
+ this.dragger.setDragData(data);
893
900
  this.updateCursor(data);
894
901
  }
895
902
  pointerMove(data) {
@@ -897,14 +904,18 @@ class InteractionBase {
897
904
  data = this.hoverData;
898
905
  if (!data)
899
906
  return;
900
- if (this.downData)
907
+ const { downData } = this;
908
+ if (downData)
901
909
  PointerButton.defaultLeft(data);
902
910
  const hit = this.canvas.bounds.hitPoint(data);
903
- if (hit || this.downData) {
904
- if (hit && !this.downData && PointerButton.left(data))
911
+ if (hit || downData) {
912
+ if (hit && !downData && PointerButton.left(data)) {
905
913
  this.pointerDown(data, true);
914
+ this.dragger.canDragOut = false;
915
+ }
906
916
  this.pointerMoveReal(data);
907
- this.dragger.checkDragOut(data);
917
+ if (downData)
918
+ this.dragger.checkDragOut(data);
908
919
  }
909
920
  }
910
921
  pointerMoveReal(data) {
@@ -920,9 +931,11 @@ class InteractionBase {
920
931
  }
921
932
  if (!this.dragger.moving) {
922
933
  this.updateHoverData(data);
934
+ if (this.moveMode)
935
+ data.path = this.defaultPath;
923
936
  this.emit(exports.PointerEvent.MOVE, data);
924
- this.pointerOverOrOut(data);
925
- this.pointerEnterOrLeave(data);
937
+ if (!(this.dragging && !this.config.pointer.dragHover))
938
+ this.pointerHover(data);
926
939
  if (this.dragger.dragging) {
927
940
  this.dragger.dragOverOrOut(data);
928
941
  this.dragger.dragEnterOrLeave(data);
@@ -931,20 +944,24 @@ class InteractionBase {
931
944
  this.updateCursor(this.downData || data);
932
945
  }
933
946
  pointerUp(data) {
947
+ const { downData, oldDownData } = this;
934
948
  if (!data)
935
- data = this.downData;
936
- if (!this.downData)
949
+ data = downData;
950
+ if (!downData)
937
951
  return;
938
952
  PointerButton.defaultLeft(data);
939
953
  this.findPath(data);
940
- this.emit(exports.PointerEvent.BEFORE_UP, data);
941
- this.emit(exports.PointerEvent.UP, data);
942
- if (this.oldDownData)
943
- this.emit(exports.PointerEvent.UP, this.oldDownData, undefined, data.path);
944
- this.emit(exports.PointerEvent.UP, this.downData, undefined, data.path);
945
- this.touchLeave(data);
946
- this.tap(data);
947
- this.menuTap(data);
954
+ if (this.downed) {
955
+ this.downed = false;
956
+ this.emit(exports.PointerEvent.BEFORE_UP, data);
957
+ this.emit(exports.PointerEvent.UP, data);
958
+ if (oldDownData)
959
+ this.emit(exports.PointerEvent.UP, oldDownData, undefined, data.path);
960
+ this.emit(exports.PointerEvent.UP, downData, undefined, data.path);
961
+ this.touchLeave(data);
962
+ this.tap(data);
963
+ this.menuTap(data);
964
+ }
948
965
  this.dragger.dragEnd(data);
949
966
  this.downData = this.oldDownData = null;
950
967
  this.updateCursor(data);
@@ -984,8 +1001,10 @@ class InteractionBase {
984
1001
  this.downKeyMap[code] = true;
985
1002
  Keyboard.setDownCode(code);
986
1003
  this.emit(exports.KeyEvent.HOLD, data, this.defaultPath);
987
- if (this.moveMode)
1004
+ if (this.moveMode) {
1005
+ this.cancelHover();
988
1006
  this.updateCursor();
1007
+ }
989
1008
  }
990
1009
  this.emit(exports.KeyEvent.DOWN, data, this.defaultPath);
991
1010
  }
@@ -997,32 +1016,34 @@ class InteractionBase {
997
1016
  if (this.cursor === 'grab')
998
1017
  this.updateCursor();
999
1018
  }
1019
+ pointerHover(data) {
1020
+ this.pointerOverOrOut(data);
1021
+ this.pointerEnterOrLeave(data);
1022
+ }
1000
1023
  pointerOverOrOut(data) {
1001
- if (this.dragger.moving)
1002
- return;
1003
- if (this.dragging && !this.config.pointer.dragHover)
1004
- return;
1005
1024
  const { path } = data;
1006
- if (this.overPath) {
1007
- if (path.indexAt(0) !== this.overPath.indexAt(0)) {
1008
- this.emit(exports.PointerEvent.OUT, data, this.overPath);
1025
+ const { overPath } = this;
1026
+ this.overPath = path;
1027
+ if (overPath) {
1028
+ if (path.indexAt(0) !== overPath.indexAt(0)) {
1029
+ this.emit(exports.PointerEvent.OUT, data, overPath);
1009
1030
  this.emit(exports.PointerEvent.OVER, data, path);
1010
1031
  }
1011
1032
  }
1012
1033
  else {
1013
1034
  this.emit(exports.PointerEvent.OVER, data, path);
1014
1035
  }
1015
- this.overPath = path;
1016
1036
  }
1017
1037
  pointerEnterOrLeave(data) {
1018
- if (this.dragger.moving)
1019
- return;
1020
- if (this.dragging && !this.config.pointer.dragHover)
1021
- return;
1022
- const { path } = data;
1023
- this.emit(exports.PointerEvent.LEAVE, data, this.enterPath, path);
1024
- this.emit(exports.PointerEvent.ENTER, data, path, this.enterPath);
1038
+ let { path } = data;
1039
+ if (this.downData && !this.moveMode) {
1040
+ path = path.clone();
1041
+ this.downData.path.forEach(leaf => path.add(leaf));
1042
+ }
1043
+ const { enterPath } = this;
1025
1044
  this.enterPath = path;
1045
+ this.emit(exports.PointerEvent.LEAVE, data, enterPath, path);
1046
+ this.emit(exports.PointerEvent.ENTER, data, path, enterPath);
1026
1047
  }
1027
1048
  touchLeave(data) {
1028
1049
  if (data.pointerType === 'touch') {
@@ -1078,6 +1099,23 @@ class InteractionBase {
1078
1099
  isDrag(leaf) {
1079
1100
  return this.dragger.getList().has(leaf);
1080
1101
  }
1102
+ isPress(leaf) {
1103
+ const { downData, oldDownData } = this;
1104
+ return this.downed && ((downData && downData.path.has(leaf)) || (oldDownData && oldDownData.path.has(leaf)));
1105
+ }
1106
+ isHover(leaf) {
1107
+ return this.enterPath && this.enterPath.has(leaf);
1108
+ }
1109
+ isFocus(leaf) {
1110
+ return this.focusData === leaf;
1111
+ }
1112
+ cancelHover() {
1113
+ const { hoverData } = this;
1114
+ if (hoverData) {
1115
+ hoverData.path = this.defaultPath;
1116
+ this.pointerHover(hoverData);
1117
+ }
1118
+ }
1081
1119
  updateDownData(data, options) {
1082
1120
  const { downData } = this;
1083
1121
  if (!data && downData)
@@ -1111,8 +1149,7 @@ class InteractionBase {
1111
1149
  }
1112
1150
  else if (!data)
1113
1151
  return;
1114
- let leaf;
1115
- let cursor;
1152
+ let leaf, cursor;
1116
1153
  const { path } = data;
1117
1154
  for (let i = 0, len = path.length; i < len; i++) {
1118
1155
  leaf = path.list[i];
@@ -1242,9 +1279,9 @@ class HitCanvasManager extends core.CanvasManager {
1242
1279
  }
1243
1280
  }
1244
1281
 
1245
- const { toInnerRadiusPointOf, copy, setRadius } = draw$1.PointHelper;
1282
+ const { toInnerRadiusPointOf, copy, setRadius } = core.PointHelper;
1246
1283
  const inner = {};
1247
- draw$1.Leaf.prototype.__hitWorld = function (point) {
1284
+ core.Leaf.prototype.__hitWorld = function (point) {
1248
1285
  if (this.__layout.hitCanvasChanged || !this.__hitCanvas) {
1249
1286
  this.__updateHitCanvas();
1250
1287
  this.__layout.hitCanvasChanged = false;
@@ -1255,7 +1292,7 @@ draw$1.Leaf.prototype.__hitWorld = function (point) {
1255
1292
  }
1256
1293
  toInnerRadiusPointOf(point, this.__world, inner);
1257
1294
  if (this.__.hitBox) {
1258
- if (draw$1.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner))
1295
+ if (core.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner))
1259
1296
  return true;
1260
1297
  }
1261
1298
  return this.__hit(inner);
@@ -1310,7 +1347,7 @@ draw$1.Rect.prototype.__updateHitCanvas = function () {
1310
1347
  ui.__updateHitCanvas.call(this);
1311
1348
  };
1312
1349
  draw$1.Rect.prototype.__hitFill = function (inner, windingRule) {
1313
- return this.__hitCanvas ? ui.__hitFill.call(this, inner, windingRule) : draw$1.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
1350
+ return this.__hitCanvas ? ui.__hitFill.call(this, inner, windingRule) : core.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
1314
1351
  };
1315
1352
 
1316
1353
  draw$1.UI.prototype.find = function (condition, options) {
package/lib/core.esm.js CHANGED
@@ -1,6 +1,6 @@
1
- import { Leafer, Leaf, BoundsHelper as BoundsHelper$1, PointHelper as PointHelper$1, UI, Rect, Group } from '@leafer-ui/draw';
1
+ import { Leafer, State, UI, Rect, Group } from '@leafer-ui/draw';
2
2
  export * from '@leafer-ui/draw';
3
- import { registerUI, Creator, PropertyEvent, Debug, DataHelper, canvasSizeAttrs, LayoutEvent, RenderEvent, Event, EventCreator, registerUIEvent, LeafList, PointHelper, LeafHelper, BoundsHelper, Bounds, ResizeEvent, LeaferEvent, CanvasManager, Platform } from '@leafer/core';
3
+ import { registerUI, Creator, PropertyEvent, Debug, DataHelper, canvasSizeAttrs, LayoutEvent, RenderEvent, Event, EventCreator, registerUIEvent, LeafList, PointHelper, BoundsHelper, Bounds, ResizeEvent, LeaferEvent, CanvasManager, Leaf, Platform } from '@leafer/core';
4
4
 
5
5
  /******************************************************************************
6
6
  Copyright (c) Microsoft Corporation.
@@ -357,17 +357,21 @@ KeyEvent = __decorate([
357
357
  function design(leafer) {
358
358
  if (leafer.isApp)
359
359
  return;
360
- leafer.__eventIds.push(leafer.on_(MoveEvent.BEFORE_MOVE, (e) => leafer.zoomLayer.move(e.moveX, e.moveY)), leafer.on_(ZoomEvent.BEFORE_ZOOM, (e) => {
360
+ leafer.__eventIds.push(leafer.on_(MoveEvent.BEFORE_MOVE, (e) => {
361
+ let { moveX, moveY } = e;
362
+ if (leafer.config.move.scroll) {
363
+ if (Math.abs(moveX) > Math.abs(moveY))
364
+ moveY = 0;
365
+ else
366
+ moveX = 0;
367
+ }
368
+ leafer.zoomLayer.move(moveX, moveY);
369
+ }), leafer.on_(ZoomEvent.BEFORE_ZOOM, (e) => {
361
370
  const { zoomLayer } = leafer;
362
- const { scaleX } = zoomLayer.__, { min, max } = leafer.app.config.zoom;
363
- let { scale } = e, absScale = Math.abs(scaleX * scale);
364
- if (absScale < min)
365
- scale = min / scaleX;
366
- else if (absScale > max)
367
- scale = max / scaleX;
368
- if (scale !== 1) {
369
- PointHelper.scaleOf(zoomLayer, e, scale);
370
- zoomLayer.scale = scaleX * scale;
371
+ const changeScale = leafer.validScale(e.scale);
372
+ if (changeScale !== 1) {
373
+ PointHelper.scaleOf(zoomLayer, e, changeScale);
374
+ zoomLayer.scale = zoomLayer.__.scaleX * changeScale;
371
375
  }
372
376
  }));
373
377
  }
@@ -411,6 +415,7 @@ class Transformer {
411
415
  const { path } = interaction.selector.getByPoint(data, interaction.hitRadius);
412
416
  data.path = path;
413
417
  this.moveData = Object.assign(Object.assign({}, data), { moveX: 0, moveY: 0 });
418
+ interaction.cancelHover();
414
419
  interaction.emit(MoveEvent.START, this.moveData);
415
420
  }
416
421
  data.path = this.moveData.path;
@@ -424,6 +429,7 @@ class Transformer {
424
429
  const { path } = interaction.selector.getByPoint(data, interaction.hitRadius);
425
430
  data.path = path;
426
431
  this.zoomData = Object.assign(Object.assign({}, data), { scale: 1 });
432
+ interaction.cancelHover();
427
433
  interaction.emit(ZoomEvent.START, this.zoomData);
428
434
  }
429
435
  data.path = this.zoomData.path;
@@ -437,6 +443,7 @@ class Transformer {
437
443
  const { path } = interaction.selector.getByPoint(data, interaction.hitRadius);
438
444
  data.path = path;
439
445
  this.rotateData = Object.assign(Object.assign({}, data), { rotation: 0 });
446
+ interaction.cancelHover();
440
447
  interaction.emit(RotateEvent.START, this.rotateData);
441
448
  }
442
449
  data.path = this.rotateData.path;
@@ -554,6 +561,7 @@ class Dragger {
554
561
  this.dragEndReal();
555
562
  this.downData = this.interaction.downData;
556
563
  this.dragData = getDragEventData(data, data, data);
564
+ this.canAnimate = this.canDragOut = true;
557
565
  }
558
566
  getList() {
559
567
  const { proxy } = this.interaction.selector;
@@ -566,9 +574,6 @@ class Dragger {
566
574
  interaction.pointerCancel();
567
575
  return;
568
576
  }
569
- else {
570
- this.canAnimate = true;
571
- }
572
577
  if (!this.moving && canDrag) {
573
578
  if (this.moving = interaction.moveMode || interaction.isHoldRightKey)
574
579
  interaction.emit(MoveEvent.START, this.dragData);
@@ -619,13 +624,14 @@ class Dragger {
619
624
  const list = this.getList();
620
625
  if (list.length && running) {
621
626
  const { moveX, moveY } = this.dragData;
622
- list.forEach(leaf => LeafHelper.moveWorld(leaf, moveX, moveY));
627
+ list.forEach(leaf => leaf.moveWorld(moveX, moveY));
623
628
  }
624
629
  }
625
630
  dragOverOrOut(data) {
626
631
  const { interaction } = this;
627
632
  const { dragOverPath } = this;
628
633
  const { path } = data;
634
+ this.dragOverPath = path;
629
635
  if (dragOverPath) {
630
636
  if (path.indexAt(0) !== dragOverPath.indexAt(0)) {
631
637
  interaction.emit(DragEvent.OUT, data, dragOverPath);
@@ -635,7 +641,6 @@ class Dragger {
635
641
  else {
636
642
  interaction.emit(DragEvent.OVER, data, path);
637
643
  }
638
- this.dragOverPath = path;
639
644
  }
640
645
  dragEnterOrLeave(data) {
641
646
  const { interaction } = this;
@@ -649,7 +654,7 @@ class Dragger {
649
654
  if (!this.dragData)
650
655
  return;
651
656
  const { moveX, moveY } = this.dragData;
652
- if (this.canAnimate && this.moving && (Math.abs(moveX) > 1 || Math.abs(moveY) > 1)) {
657
+ if (this.interaction.config.move.dragAnimate && this.canAnimate && this.moving && (Math.abs(moveX) > 1 || Math.abs(moveY) > 1)) {
653
658
  data = Object.assign({}, data);
654
659
  speed = (speed || (data.pointerType === 'touch' ? 2 : 1)) * 0.9;
655
660
  PointHelper.move(data, moveX * speed, moveY * speed);
@@ -683,12 +688,11 @@ class Dragger {
683
688
  animate(func, off) {
684
689
  const animateWait = func || this.animateWait;
685
690
  if (animateWait)
686
- this.interaction.target.nextRender(animateWait, off);
691
+ this.interaction.target.nextRender(animateWait, null, off);
687
692
  this.animateWait = func;
688
693
  }
689
694
  swipe(data, endDragData) {
690
- const { interaction } = this;
691
- const { downData } = interaction;
695
+ const { interaction, downData } = this;
692
696
  if (PointHelper.getDistance(downData, data) > interaction.config.pointer.swipeDistance) {
693
697
  const swipeData = getSwipeEventData(downData, this.dragData, endDragData);
694
698
  this.interaction.emit(swipeData.type, swipeData);
@@ -711,9 +715,9 @@ class Dragger {
711
715
  this.autoMoveOnDragOut(data);
712
716
  }
713
717
  autoMoveOnDragOut(data) {
714
- const { interaction, downData } = this;
718
+ const { interaction, downData, canDragOut } = this;
715
719
  const { autoDistance, dragOut } = interaction.config.move;
716
- if (!dragOut || !autoDistance)
720
+ if (!dragOut || !canDragOut || !autoDistance)
717
721
  return;
718
722
  const bounds = interaction.shrinkCanvasBounds;
719
723
  const { x, y } = bounds;
@@ -789,12 +793,16 @@ function emitAppChildren(leaf, type, data, capture, excludePath) {
789
793
  function emitEvent(leaf, type, data, capture, excludePath) {
790
794
  if (leaf.destroyed)
791
795
  return true;
792
- if (leaf.__.hitSelf && leaf.hasEvent(type, capture) && !exclude(leaf, excludePath)) {
793
- data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
794
- const event = EventCreator.get(type, data);
795
- leaf.emitEvent(event, capture);
796
- if (event.isStop)
797
- return true;
796
+ if (leaf.__.hitSelf && !exclude(leaf, excludePath)) {
797
+ if (State.updateEventStyle)
798
+ State.updateEventStyle(leaf, type);
799
+ if (leaf.hasEvent(type, capture)) {
800
+ data.phase = capture ? 1 : ((leaf === data.target) ? 2 : 3);
801
+ const event = EventCreator.get(type, data);
802
+ leaf.emitEvent(event, capture);
803
+ if (event.isStop)
804
+ return true;
805
+ }
798
806
  }
799
807
  return false;
800
808
  }
@@ -819,7 +827,6 @@ const MultiTouchHelper = {
819
827
 
820
828
  const config = {
821
829
  wheel: {
822
- zoomMode: false,
823
830
  zoomSpeed: 0.5,
824
831
  moveSpeed: 0.5,
825
832
  rotateSpeed: 0.5,
@@ -828,14 +835,12 @@ const config = {
828
835
  },
829
836
  pointer: {
830
837
  hitRadius: 5,
831
- through: false,
832
838
  tapTime: 120,
833
839
  longPressTime: 800,
834
840
  transformTime: 500,
835
841
  dragHover: true,
836
842
  dragDistance: 2,
837
843
  swipeDistance: 20,
838
- ignoreMove: false,
839
844
  preventDefaultMenu: true
840
845
  },
841
846
  cursor: {}
@@ -878,17 +883,19 @@ class InteractionBase {
878
883
  this.updateDownData(data);
879
884
  if (useDefaultPath)
880
885
  data.path = this.defaultPath;
881
- this.emit(PointerEvent.BEFORE_DOWN, data);
882
- this.emit(PointerEvent.DOWN, data);
883
886
  this.downTime = Date.now();
884
- this.dragger.setDragData(data);
885
- if (PointerButton.left(data)) {
886
- this.tapWait();
887
- this.longPressWait(data);
888
- }
889
- else if (PointerButton.right(data)) {
890
- this.waitMenuTap = true;
887
+ if (this.downed = !this.moveMode) {
888
+ this.emit(PointerEvent.BEFORE_DOWN, data);
889
+ this.emit(PointerEvent.DOWN, data);
890
+ if (PointerButton.left(data)) {
891
+ this.tapWait();
892
+ this.longPressWait(data);
893
+ }
894
+ else if (PointerButton.right(data)) {
895
+ this.waitMenuTap = true;
896
+ }
891
897
  }
898
+ this.dragger.setDragData(data);
892
899
  this.updateCursor(data);
893
900
  }
894
901
  pointerMove(data) {
@@ -896,14 +903,18 @@ class InteractionBase {
896
903
  data = this.hoverData;
897
904
  if (!data)
898
905
  return;
899
- if (this.downData)
906
+ const { downData } = this;
907
+ if (downData)
900
908
  PointerButton.defaultLeft(data);
901
909
  const hit = this.canvas.bounds.hitPoint(data);
902
- if (hit || this.downData) {
903
- if (hit && !this.downData && PointerButton.left(data))
910
+ if (hit || downData) {
911
+ if (hit && !downData && PointerButton.left(data)) {
904
912
  this.pointerDown(data, true);
913
+ this.dragger.canDragOut = false;
914
+ }
905
915
  this.pointerMoveReal(data);
906
- this.dragger.checkDragOut(data);
916
+ if (downData)
917
+ this.dragger.checkDragOut(data);
907
918
  }
908
919
  }
909
920
  pointerMoveReal(data) {
@@ -919,9 +930,11 @@ class InteractionBase {
919
930
  }
920
931
  if (!this.dragger.moving) {
921
932
  this.updateHoverData(data);
933
+ if (this.moveMode)
934
+ data.path = this.defaultPath;
922
935
  this.emit(PointerEvent.MOVE, data);
923
- this.pointerOverOrOut(data);
924
- this.pointerEnterOrLeave(data);
936
+ if (!(this.dragging && !this.config.pointer.dragHover))
937
+ this.pointerHover(data);
925
938
  if (this.dragger.dragging) {
926
939
  this.dragger.dragOverOrOut(data);
927
940
  this.dragger.dragEnterOrLeave(data);
@@ -930,20 +943,24 @@ class InteractionBase {
930
943
  this.updateCursor(this.downData || data);
931
944
  }
932
945
  pointerUp(data) {
946
+ const { downData, oldDownData } = this;
933
947
  if (!data)
934
- data = this.downData;
935
- if (!this.downData)
948
+ data = downData;
949
+ if (!downData)
936
950
  return;
937
951
  PointerButton.defaultLeft(data);
938
952
  this.findPath(data);
939
- this.emit(PointerEvent.BEFORE_UP, data);
940
- this.emit(PointerEvent.UP, data);
941
- if (this.oldDownData)
942
- this.emit(PointerEvent.UP, this.oldDownData, undefined, data.path);
943
- this.emit(PointerEvent.UP, this.downData, undefined, data.path);
944
- this.touchLeave(data);
945
- this.tap(data);
946
- this.menuTap(data);
953
+ if (this.downed) {
954
+ this.downed = false;
955
+ this.emit(PointerEvent.BEFORE_UP, data);
956
+ this.emit(PointerEvent.UP, data);
957
+ if (oldDownData)
958
+ this.emit(PointerEvent.UP, oldDownData, undefined, data.path);
959
+ this.emit(PointerEvent.UP, downData, undefined, data.path);
960
+ this.touchLeave(data);
961
+ this.tap(data);
962
+ this.menuTap(data);
963
+ }
947
964
  this.dragger.dragEnd(data);
948
965
  this.downData = this.oldDownData = null;
949
966
  this.updateCursor(data);
@@ -983,8 +1000,10 @@ class InteractionBase {
983
1000
  this.downKeyMap[code] = true;
984
1001
  Keyboard.setDownCode(code);
985
1002
  this.emit(KeyEvent.HOLD, data, this.defaultPath);
986
- if (this.moveMode)
1003
+ if (this.moveMode) {
1004
+ this.cancelHover();
987
1005
  this.updateCursor();
1006
+ }
988
1007
  }
989
1008
  this.emit(KeyEvent.DOWN, data, this.defaultPath);
990
1009
  }
@@ -996,32 +1015,34 @@ class InteractionBase {
996
1015
  if (this.cursor === 'grab')
997
1016
  this.updateCursor();
998
1017
  }
1018
+ pointerHover(data) {
1019
+ this.pointerOverOrOut(data);
1020
+ this.pointerEnterOrLeave(data);
1021
+ }
999
1022
  pointerOverOrOut(data) {
1000
- if (this.dragger.moving)
1001
- return;
1002
- if (this.dragging && !this.config.pointer.dragHover)
1003
- return;
1004
1023
  const { path } = data;
1005
- if (this.overPath) {
1006
- if (path.indexAt(0) !== this.overPath.indexAt(0)) {
1007
- this.emit(PointerEvent.OUT, data, this.overPath);
1024
+ const { overPath } = this;
1025
+ this.overPath = path;
1026
+ if (overPath) {
1027
+ if (path.indexAt(0) !== overPath.indexAt(0)) {
1028
+ this.emit(PointerEvent.OUT, data, overPath);
1008
1029
  this.emit(PointerEvent.OVER, data, path);
1009
1030
  }
1010
1031
  }
1011
1032
  else {
1012
1033
  this.emit(PointerEvent.OVER, data, path);
1013
1034
  }
1014
- this.overPath = path;
1015
1035
  }
1016
1036
  pointerEnterOrLeave(data) {
1017
- if (this.dragger.moving)
1018
- return;
1019
- if (this.dragging && !this.config.pointer.dragHover)
1020
- return;
1021
- const { path } = data;
1022
- this.emit(PointerEvent.LEAVE, data, this.enterPath, path);
1023
- this.emit(PointerEvent.ENTER, data, path, this.enterPath);
1037
+ let { path } = data;
1038
+ if (this.downData && !this.moveMode) {
1039
+ path = path.clone();
1040
+ this.downData.path.forEach(leaf => path.add(leaf));
1041
+ }
1042
+ const { enterPath } = this;
1024
1043
  this.enterPath = path;
1044
+ this.emit(PointerEvent.LEAVE, data, enterPath, path);
1045
+ this.emit(PointerEvent.ENTER, data, path, enterPath);
1025
1046
  }
1026
1047
  touchLeave(data) {
1027
1048
  if (data.pointerType === 'touch') {
@@ -1077,6 +1098,23 @@ class InteractionBase {
1077
1098
  isDrag(leaf) {
1078
1099
  return this.dragger.getList().has(leaf);
1079
1100
  }
1101
+ isPress(leaf) {
1102
+ const { downData, oldDownData } = this;
1103
+ return this.downed && ((downData && downData.path.has(leaf)) || (oldDownData && oldDownData.path.has(leaf)));
1104
+ }
1105
+ isHover(leaf) {
1106
+ return this.enterPath && this.enterPath.has(leaf);
1107
+ }
1108
+ isFocus(leaf) {
1109
+ return this.focusData === leaf;
1110
+ }
1111
+ cancelHover() {
1112
+ const { hoverData } = this;
1113
+ if (hoverData) {
1114
+ hoverData.path = this.defaultPath;
1115
+ this.pointerHover(hoverData);
1116
+ }
1117
+ }
1080
1118
  updateDownData(data, options) {
1081
1119
  const { downData } = this;
1082
1120
  if (!data && downData)
@@ -1110,8 +1148,7 @@ class InteractionBase {
1110
1148
  }
1111
1149
  else if (!data)
1112
1150
  return;
1113
- let leaf;
1114
- let cursor;
1151
+ let leaf, cursor;
1115
1152
  const { path } = data;
1116
1153
  for (let i = 0, len = path.length; i < len; i++) {
1117
1154
  leaf = path.list[i];
@@ -1241,7 +1278,7 @@ class HitCanvasManager extends CanvasManager {
1241
1278
  }
1242
1279
  }
1243
1280
 
1244
- const { toInnerRadiusPointOf, copy, setRadius } = PointHelper$1;
1281
+ const { toInnerRadiusPointOf, copy, setRadius } = PointHelper;
1245
1282
  const inner = {};
1246
1283
  Leaf.prototype.__hitWorld = function (point) {
1247
1284
  if (this.__layout.hitCanvasChanged || !this.__hitCanvas) {
@@ -1254,7 +1291,7 @@ Leaf.prototype.__hitWorld = function (point) {
1254
1291
  }
1255
1292
  toInnerRadiusPointOf(point, this.__world, inner);
1256
1293
  if (this.__.hitBox) {
1257
- if (BoundsHelper$1.hitRadiusPoint(this.__layout.boxBounds, inner))
1294
+ if (BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner))
1258
1295
  return true;
1259
1296
  }
1260
1297
  return this.__hit(inner);
@@ -1309,7 +1346,7 @@ Rect.prototype.__updateHitCanvas = function () {
1309
1346
  ui.__updateHitCanvas.call(this);
1310
1347
  };
1311
1348
  Rect.prototype.__hitFill = function (inner, windingRule) {
1312
- return this.__hitCanvas ? ui.__hitFill.call(this, inner, windingRule) : BoundsHelper$1.hitRadiusPoint(this.__layout.boxBounds, inner);
1349
+ return this.__hitCanvas ? ui.__hitFill.call(this, inner, windingRule) : BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
1313
1350
  };
1314
1351
 
1315
1352
  UI.prototype.find = function (condition, options) {
@@ -1 +1 @@
1
- import{Leafer as t,Leaf as e,BoundsHelper as i,PointHelper as a,UI as s,Rect as r,Group as n}from"@leafer-ui/draw";export*from"@leafer-ui/draw";import{registerUI as o,Creator as h,PropertyEvent as d,Debug as g,DataHelper as c,canvasSizeAttrs as l,LayoutEvent as u,RenderEvent as p,Event as m,EventCreator as v,registerUIEvent as _,LeafList as f,PointHelper as D,LeafHelper as E,BoundsHelper as y,Bounds as O,ResizeEvent as T,LeaferEvent as R,CanvasManager as P,Platform as w}from"@leafer/core";function C(t,e,i,a){var s,r=arguments.length,n=r<3?e:null===a?a=Object.getOwnPropertyDescriptor(e,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,i,a);else for(var o=t.length-1;o>=0;o--)(s=t[o])&&(n=(r<3?s(n):r>3?s(e,i,n):s(e,i))||n);return r>3&&n&&Object.defineProperty(e,i,n),n}"function"==typeof SuppressedError&&SuppressedError;let L=class extends t{get __tag(){return"App"}get isApp(){return!0}constructor(t,e){super(t,e)}init(t,e){if(super.init(t,e),t){const{ground:e,tree:i,sky:a,editor:s}=t;e&&(this.ground=this.addLeafer(e)),(i||s)&&(this.tree=this.addLeafer(i)),(a||s)&&(this.sky=this.addLeafer(a||{type:"draw",usePartRender:!1})),s&&(this.editor=h.editor(s),this.sky.add(this.editor))}}__setApp(){const{canvas:t}=this,{realCanvas:e,view:i}=this.config;e||i===this.canvas.view||!t.parentView?this.realCanvas=!0:t.unrealCanvas(),this.leafer=this,this.watcher.disable(),this.layouter.disable(),this.__eventIds.push(this.on_(d.CHANGE,this.__onPropertyChange,this))}start(){super.start(),this.children.forEach((t=>t.start()))}stop(){this.children.forEach((t=>t.stop())),super.stop()}unlockLayout(){super.unlockLayout(),this.children.forEach((t=>t.unlockLayout()))}lockLayout(){super.lockLayout(),this.children.forEach((t=>t.lockLayout()))}forceRender(t){this.children.forEach((e=>e.forceRender(t)))}addLeafer(e){const i=new t(e);return this.add(i),i}add(t){if(!t.view){if(this.realCanvas&&!this.canvas.bounds)return void setTimeout((()=>this.add(t)),10);t.init(this.__getChildConfig(t.userConfig),this)}super.add(t),this.__listenChildEvents(t)}__onPropertyChange(){g.showHitView&&this.children.forEach((t=>t.forceUpdate("surface")))}__onCreated(){this.created=this.children.every((t=>t.created))}__onReady(){this.children.every((t=>t.ready))&&super.__onReady()}__onViewReady(){this.children.every((t=>t.viewReady))&&super.__onViewReady()}__onChildRenderEnd(t){this.renderer.addBlock(t.renderBounds),this.viewReady&&this.renderer.update()}__render(t,e){this.children.forEach((e=>t.copyWorld(e.canvas)))}__onResize(t){this.children.forEach((e=>e.resize(t))),super.__onResize(t)}__checkUpdateLayout(){this.children.forEach((t=>t.__layout.update()))}__getChildConfig(t){let e=Object.assign({},this.config);return e.hittable=e.realCanvas=void 0,t&&c.assign(e,t),this.autoLayout&&c.copyAttrs(e,this,l),e.view=this.realCanvas?void 0:this.view,e.fill=void 0,e}__listenChildEvents(t){t.once(u.END,(()=>this.__onReady())),t.once(p.START,(()=>this.__onCreated())),t.once(p.END,(()=>this.__onViewReady())),this.realCanvas&&this.__eventIds.push(t.on_(p.END,this.__onChildRenderEnd,this))}};L=C([o()],L);const b={},M={isHoldSpaceKey:()=>M.isHold("Space"),isHold:t=>b[t],setDownCode(t){b[t]||(b[t]=!0)},setUpCode(t){b[t]=!1}},A={LEFT:1,RIGHT:2,MIDDLE:4,defaultLeft(t){t.buttons||(t.buttons=1)},left:t=>1===t.buttons,right:t=>2===t.buttons,middle:t=>4===t.buttons};class x extends m{get spaceKey(){return M.isHoldSpaceKey()}get left(){return A.left(this)}get right(){return A.right(this)}get middle(){return A.middle(this)}constructor(t){super(t.type),this.bubbles=!0,Object.assign(this,t)}getPage(){return this.current.getPagePoint(this)}getInner(t){return t||(t=this.current),t.getInnerPoint(this)}getLocal(t){return t||(t=this.current),t.getLocalPoint(this)}static changeName(t,e){v.changeName(t,e)}}let B=class extends x{};B.POINTER="pointer",B.BEFORE_DOWN="pointer.before_down",B.BEFORE_MOVE="pointer.before_move",B.BEFORE_UP="pointer.before_up",B.DOWN="pointer.down",B.MOVE="pointer.move",B.UP="pointer.up",B.OVER="pointer.over",B.OUT="pointer.out",B.ENTER="pointer.enter",B.LEAVE="pointer.leave",B.TAP="tap",B.DOUBLE_TAP="double_tap",B.CLICK="click",B.DOUBLE_CLICK="double_click",B.LONG_PRESS="long_press",B.LONG_TAP="long_tap",B.MENU="pointer.menu",B.MENU_TAP="pointer.menu_tap",B=C([_()],B);const k={};let S=class extends B{static setList(t){this.list=t instanceof f?t:new f(t)}static setData(t){this.data=t}getPageMove(t){return this.assignMove(t),this.current.getPagePoint(k,null,!0)}getInnerMove(t,e){return t||(t=this.current),this.assignMove(e),t.getInnerPoint(k,null,!0)}getLocalMove(t,e){return t||(t=this.current),this.assignMove(e),t.getLocalPoint(k,null,!0)}getPageTotal(){return this.getPageMove(!0)}getInnerTotal(t){return this.getInnerMove(t,!0)}getLocalTotal(t){return this.getLocalMove(t,!0)}assignMove(t){k.x=t?this.totalX:this.moveX,k.y=t?this.totalY:this.moveY}};S.BEFORE_DRAG="drag.before_drag",S.START="drag.start",S.DRAG="drag",S.END="drag.end",S.OVER="drag.over",S.OUT="drag.out",S.ENTER="drag.enter",S.LEAVE="drag.leave",S=C([_()],S);let N=class extends B{static setList(t){S.setList(t)}static setData(t){S.setData(t)}};N.DROP="drop",N=C([_()],N);let W=class extends S{};W.BEFORE_MOVE="move.before_move",W.START="move.start",W.MOVE="move",W.END="move.end",W=C([_()],W);let j=class extends x{};j.BEFORE_ROTATE="rotate.before_rotate",j.START="rotate.start",j.ROTATE="rotate",j.END="rotate.end",j=C([_()],j);let z=class extends S{};z.SWIPE="swipe",z.LEFT="swipe.left",z.RIGHT="swipe.right",z.UP="swipe.up",z.DOWN="swipe.down",z=C([_()],z);let H=class extends x{};H.BEFORE_ZOOM="zoom.before_zoom",H.START="zoom.start",H.ZOOM="zoom",H.END="zoom.end",H=C([_()],H);let I=class extends x{};I.DOWN="key.down",I.HOLD="key.hold",I.UP="key.up",I=C([_()],I);const U=g.get("LeaferTypeCreator"),V={list:{},register(t,e){K[t]?U.repeat(t):K[t]=e},run(t,e){const i=K[t];i?i(e):U.error("no",t)}},{list:K,register:F}=V;F("draw",(function(t){const{config:e}=t;e.move.dragOut=!1})),F("design",(function(t){t.isApp||t.__eventIds.push(t.on_(W.BEFORE_MOVE,(e=>t.zoomLayer.move(e.moveX,e.moveY))),t.on_(H.BEFORE_ZOOM,(e=>{const{zoomLayer:i}=t,{scaleX:a}=i.__,{min:s,max:r}=t.app.config.zoom;let{scale:n}=e,o=Math.abs(a*n);o<s?n=s/a:o>r&&(n=r/a),1!==n&&(D.scaleOf(i,e,n),i.scale=a*n)})))})),t.prototype.initType=function(t){V.run(t,this)};class X{constructor(t){this.interaction=t}move(t){const{interaction:e}=this;if(!this.moveData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.moveData=Object.assign(Object.assign({},t),{moveX:0,moveY:0}),e.emit(W.START,this.moveData)}t.path=this.moveData.path,e.emit(W.BEFORE_MOVE,t),e.emit(W.MOVE,t),this.transformEndWait()}zoom(t){const{interaction:e}=this;if(!this.zoomData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.zoomData=Object.assign(Object.assign({},t),{scale:1}),e.emit(H.START,this.zoomData)}t.path=this.zoomData.path,e.emit(H.BEFORE_ZOOM,t),e.emit(H.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:e}=this;if(!this.rotateData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),e.emit(j.START,this.rotateData)}t.path=this.rotateData.path,e.emit(j.BEFORE_ROTATE,t),e.emit(j.ROTATE,t),this.transformEndWait()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout((()=>{this.transformEnd()}),this.interaction.config.pointer.transformTime)}transformEnd(){this.moveEnd(),this.zoomEnd(),this.rotateEnd()}moveEnd(){this.moveData&&(this.interaction.emit(W.END,this.moveData),this.moveData=null)}zoomEnd(){this.zoomData&&(this.interaction.emit(H.END,this.zoomData),this.zoomData=null)}rotateEnd(){this.rotateData&&(this.interaction.emit(j.END,this.rotateData),this.rotateData=null)}destroy(){this.zoomData=this.moveData=this.rotateData=null}}const Y={getMoveEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,moveX:e.x,moveY:e.y}),getRotateEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,rotation:e}),getZoomEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,scale:e}),getDragEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:i.x,y:i.y,moveX:i.x-e.x,moveY:i.y-e.y,totalX:i.x-t.x,totalY:i.y-t.y}),getDropEventData:(t,e,i)=>Object.assign(Object.assign({},t),{list:e,data:i}),getSwipeDirection:t=>t<-45&&t>-135?z.UP:t>45&&t<135?z.DOWN:t<=45&&t>=-45?z.RIGHT:z.LEFT,getSwipeEventData:(t,e,i)=>Object.assign(Object.assign({},i),{moveX:e.moveX,moveY:e.moveY,totalX:i.x-t.x,totalY:i.y-t.y,type:G.getSwipeDirection(D.getAngle(t,i))}),getBase(t){const e=1===t.button?4:t.button;return{altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,buttons:void 0===t.buttons?1:0===t.buttons?e:t.buttons,origin:t}},pathHasEventType(t,e){const{list:i}=t;for(let t=0,a=i.length;t<a;t++)if(i[t].hasEvent(e))return!0;return!1},filterPathByEventType(t,e){const i=new f,{list:a}=t;for(let t=0,s=a.length;t<s;t++)a[t].hasEvent(e)&&i.add(a[t]);return i}},G=Y,Z=new f,{getDragEventData:q,getDropEventData:J,getSwipeEventData:Q}=Y;class ${constructor(t){this.interaction=t}setDragData(t){this.animateWait&&this.dragEndReal(),this.downData=this.interaction.downData,this.dragData=q(t,t,t)}getList(){const{proxy:t}=this.interaction.selector;return!this.dragging||t&&t.list.length?Z:S.list||this.dragableList||Z}checkDrag(t,e){const{interaction:i}=this;if(this.moving&&t.buttons<1)return this.canAnimate=!1,void i.pointerCancel();this.canAnimate=!0,!this.moving&&e&&(this.moving=i.moveMode||i.isHoldRightKey)&&i.emit(W.START,this.dragData),this.moving||this.dragStart(t,e),this.drag(t)}dragStart(t,e){this.dragging||(this.dragging=e&&A.left(t),this.dragging&&(this.interaction.emit(S.START,this.dragData),this.getDragableList(this.dragData.path)))}getDragableList(t){let e;for(let i=0,a=t.length;i<a;i++)if(e=t.list[i],(e.__.draggable||e.__.editable)&&e.__.hitSelf&&!e.__.locked){this.dragableList=new f(e);break}}drag(t){const{interaction:e,dragData:i,downData:a}=this,{path:s,throughPath:r}=a;this.dragData=q(a,i,t),r&&(this.dragData.throughPath=r),this.dragData.path=s,this.moving?(e.emit(W.BEFORE_MOVE,this.dragData),e.emit(W.MOVE,this.dragData)):this.dragging&&(this.dragReal(),e.emit(S.BEFORE_DRAG,this.dragData),e.emit(S.DRAG,this.dragData))}dragReal(){const{running:t}=this.interaction,e=this.getList();if(e.length&&t){const{moveX:t,moveY:i}=this.dragData;e.forEach((e=>E.moveWorld(e,t,i)))}}dragOverOrOut(t){const{interaction:e}=this,{dragOverPath:i}=this,{path:a}=t;i?a.indexAt(0)!==i.indexAt(0)&&(e.emit(S.OUT,t,i),e.emit(S.OVER,t,a)):e.emit(S.OVER,t,a),this.dragOverPath=a}dragEnterOrLeave(t){const{interaction:e}=this,{dragEnterPath:i}=this,{path:a}=t;e.emit(S.LEAVE,t,i,a),e.emit(S.ENTER,t,a,i),this.dragEnterPath=a}dragEnd(t,e){if(!this.dragData)return;const{moveX:i,moveY:a}=this.dragData;this.canAnimate&&this.moving&&(Math.abs(i)>1||Math.abs(a)>1)?(t=Object.assign({},t),e=.9*(e||("touch"===t.pointerType?2:1)),D.move(t,i*e,a*e),this.drag(t),this.animate((()=>{this.dragEnd(t,1)}))):this.dragEndReal(t)}dragEndReal(t){const{interaction:e,downData:i,dragData:a}=this;t||(t=a);const{path:s,throughPath:r}=i,n=q(i,t,t);r&&(n.throughPath=r),n.path=s,this.moving&&e.emit(W.END,n),this.dragging&&(e.emit(S.END,n),this.swipe(t,n),this.drop(t)),this.autoMoveCancel(),this.dragReset(),this.animate(null,"off")}animate(t,e){const i=t||this.animateWait;i&&this.interaction.target.nextRender(i,e),this.animateWait=t}swipe(t,e){const{interaction:i}=this,{downData:a}=i;if(D.getDistance(a,t)>i.config.pointer.swipeDistance){const t=Q(a,this.dragData,e);this.interaction.emit(t.type,t)}}drop(t){const e=J(t,this.getList(),S.data);e.path=this.dragEnterPath,this.interaction.emit(N.DROP,e),this.interaction.emit(S.LEAVE,t,this.dragEnterPath)}dragReset(){S.list=S.data=this.dragableList=this.dragData=this.downData=this.dragOverPath=this.dragEnterPath=null,this.dragging=this.moving=!1}checkDragOut(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)}autoMoveOnDragOut(t){const{interaction:e,downData:i}=this,{autoDistance:a,dragOut:s}=e.config.move;if(!s||!a)return;const r=e.shrinkCanvasBounds,{x:n,y:o}=r,h=y.maxX(r),d=y.maxY(r),g=t.x<n?a:h<t.x?-a:0,c=t.y<o?a:d<t.y?-a:0;let l=0,u=0;this.autoMoveTimer=setInterval((()=>{l+=g,u+=c,D.move(i,g,c),D.move(this.dragData,g,c),e.move(Object.assign(Object.assign({},t),{moveX:g,moveY:c,totalX:l,totalY:u})),e.pointerMoveReal(t)}),10)}autoMoveCancel(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)}destroy(){this.dragReset()}}const tt=g.get("emit");const et=["move","zoom","rotate","key"];function it(t,e,i,a,s){if(et.some((t=>e.startsWith(t)))&&t.__.hitChildren&&!st(t,s)){let r;for(let n=0,o=t.children.length;n<o;n++)r=t.children[n],!i.path.has(r)&&r.__.hittable&&at(r,e,i,a,s)}}function at(t,e,i,a,s){if(t.destroyed)return!0;if(t.__.hitSelf&&t.hasEvent(e,a)&&!st(t,s)){i.phase=a?1:t===i.target?2:3;const s=v.get(e,i);if(t.emitEvent(s,a),s.isStop)return!0}return!1}function st(t,e){return e&&e.has(t)}const rt={getData(t){const e=t[0],i=t[1],a=D.getCenter(e.from,i.from),s=D.getCenter(e.to,i.to),r={x:s.x-a.x,y:s.y-a.y},n=D.getDistance(e.from,i.from);return{move:r,scale:D.getDistance(e.to,i.to)/n,angle:D.getRotation(e.from,i.from,e.to,i.to),center:s}}},nt={wheel:{zoomMode:!1,zoomSpeed:.5,moveSpeed:.5,rotateSpeed:.5,delta:{x:20,y:8},preventDefault:!0},pointer:{hitRadius:5,through:!1,tapTime:120,longPressTime:800,transformTime:500,dragHover:!0,dragDistance:2,swipeDistance:20,ignoreMove:!1,preventDefaultMenu:!0},cursor:{}},{pathHasEventType:ot,getMoveEventData:ht,getZoomEventData:dt,getRotateEventData:gt}=Y;class ct{get dragging(){return this.dragger.dragging}get isDragEmpty(){return this.config.move.dragEmpty&&this.hoverData&&this.hoverData.path.list[0].isLeafer&&(!this.downData||this.downData.path.list[0].isLeafer)}get isHoldRightKey(){return this.config.move.holdRightKey&&this.downData&&A.right(this.downData)}get moveMode(){return this.config.move.drag||this.config.move.holdSpaceKey&&M.isHoldSpaceKey()||this.downData&&(this.config.move.holdMiddleKey&&A.middle(this.downData)||this.isHoldRightKey&&this.dragger.moving)||this.isDragEmpty}get hitRadius(){return this.config.pointer.hitRadius}constructor(t,e,i,a){this.config=nt,this.tapCount=0,this.downKeyMap={},this.target=t,this.canvas=e,this.selector=i,this.defaultPath=new f(t),this.transformer=new X(this),this.dragger=new $(this),a&&(this.config=c.default(a,this.config)),this.__listenEvents()}start(){this.running=!0}stop(){this.running=!1}receive(t){}pointerDown(t,e){t||(t=this.hoverData),t&&(A.defaultLeft(t),this.updateDownData(t),e&&(t.path=this.defaultPath),this.emit(B.BEFORE_DOWN,t),this.emit(B.DOWN,t),this.downTime=Date.now(),this.dragger.setDragData(t),A.left(t)?(this.tapWait(),this.longPressWait(t)):A.right(t)&&(this.waitMenuTap=!0),this.updateCursor(t))}pointerMove(t){if(t||(t=this.hoverData),!t)return;this.downData&&A.defaultLeft(t);const e=this.canvas.bounds.hitPoint(t);(e||this.downData)&&(e&&!this.downData&&A.left(t)&&this.pointerDown(t,!0),this.pointerMoveReal(t),this.dragger.checkDragOut(t))}pointerMoveReal(t){if(this.emit(B.BEFORE_MOVE,t,this.defaultPath),this.downData){const e=D.getDistance(this.downData,t)>this.config.pointer.dragDistance;e&&(this.waitTap&&this.pointerWaitCancel(),this.waitMenuTap=!1),this.dragger.checkDrag(t,e)}this.dragger.moving||(this.updateHoverData(t),this.emit(B.MOVE,t),this.pointerOverOrOut(t),this.pointerEnterOrLeave(t),this.dragger.dragging&&(this.dragger.dragOverOrOut(t),this.dragger.dragEnterOrLeave(t))),this.updateCursor(this.downData||t)}pointerUp(t){t||(t=this.downData),this.downData&&(A.defaultLeft(t),this.findPath(t),this.emit(B.BEFORE_UP,t),this.emit(B.UP,t),this.oldDownData&&this.emit(B.UP,this.oldDownData,void 0,t.path),this.emit(B.UP,this.downData,void 0,t.path),this.touchLeave(t),this.tap(t),this.menuTap(t),this.dragger.dragEnd(t),this.downData=this.oldDownData=null,this.updateCursor(t))}pointerCancel(){this.pointerUp(this.dragger.dragData)}multiTouch(t,e){const{move:i,angle:a,scale:s,center:r}=rt.getData(e);this.rotate(gt(r,a,t)),this.zoom(dt(r,s,t)),this.move(ht(r,i,t))}menu(t){this.findPath(t),this.emit(B.MENU,t)}menuTap(t){this.waitMenuTap&&this.emit(B.MENU_TAP,t)}move(t){this.transformer.move(t)}zoom(t){this.transformer.zoom(t)}rotate(t){this.transformer.rotate(t)}transformEnd(){this.transformer.transformEnd()}keyDown(t){const{code:e}=t;this.downKeyMap[e]||(this.downKeyMap[e]=!0,M.setDownCode(e),this.emit(I.HOLD,t,this.defaultPath),this.moveMode&&this.updateCursor()),this.emit(I.DOWN,t,this.defaultPath)}keyUp(t){const{code:e}=t;this.downKeyMap[e]=!1,M.setUpCode(e),this.emit(I.UP,t,this.defaultPath),"grab"===this.cursor&&this.updateCursor()}pointerOverOrOut(t){if(this.dragger.moving)return;if(this.dragging&&!this.config.pointer.dragHover)return;const{path:e}=t;this.overPath?e.indexAt(0)!==this.overPath.indexAt(0)&&(this.emit(B.OUT,t,this.overPath),this.emit(B.OVER,t,e)):this.emit(B.OVER,t,e),this.overPath=e}pointerEnterOrLeave(t){if(this.dragger.moving)return;if(this.dragging&&!this.config.pointer.dragHover)return;const{path:e}=t;this.emit(B.LEAVE,t,this.enterPath,e),this.emit(B.ENTER,t,e,this.enterPath),this.enterPath=e}touchLeave(t){"touch"===t.pointerType&&this.enterPath&&(this.emit(B.LEAVE,t),this.dragger.dragging&&this.emit(N.LEAVE,t))}tap(t){const{pointer:e}=this.config,i=this.longTap(t);if(!e.tapMore&&i)return;if(!this.waitTap)return;e.tapMore&&this.emitTap(t);const a=Date.now()-this.downTime,s=[B.DOUBLE_TAP,B.DOUBLE_CLICK].some((e=>ot(t.path,e)));a<e.tapTime+50&&s?(this.tapCount++,2===this.tapCount?(this.tapWaitCancel(),this.emitDoubleTap(t)):(clearTimeout(this.tapTimer),this.tapTimer=setTimeout((()=>{e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}),e.tapTime))):e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}findPath(t,e){const{hitRadius:i,through:a}=this.config.pointer,s=this.selector.getByPoint(t,i,e||{through:a});return s.throughPath&&(t.throughPath=s.throughPath),t.path=s.path,s.path}isDrag(t){return this.dragger.getList().has(t)}updateDownData(t,e){const{downData:i}=this;!t&&i&&(t=Object.assign({},i)),t&&(this.oldDownData=i,this.findPath(t,e),this.downData=t)}updateHoverData(t){t||(t=this.hoverData),t&&(this.findPath(t,{exclude:this.dragger.getList(),name:B.MOVE}),this.hoverData=t)}updateCursor(t){if(this.config.cursor.stop)return;if(t||(this.updateHoverData(),t=this.downData||this.hoverData),this.dragger.moving)return this.setCursor("grabbing");if(this.moveMode)return this.setCursor(this.downData?"grabbing":"grab");if(!t)return;let e,i;const{path:a}=t;for(let t=0,s=a.length;t<s&&(e=a.list[t],i=e.cursor,!i);t++);this.setCursor(i)}setCursor(t){this.cursor=t}emitTap(t){this.emit(B.TAP,t),this.emit(B.CLICK,t)}emitDoubleTap(t){this.emit(B.DOUBLE_TAP,t),this.emit(B.DOUBLE_CLICK,t)}pointerWaitCancel(){this.tapWaitCancel(),this.longPressWaitCancel()}tapWait(){clearTimeout(this.tapTimer),this.waitTap=!0}tapWaitCancel(){clearTimeout(this.tapTimer),this.waitTap=!1,this.tapCount=0}longPressWait(t){clearTimeout(this.longPressTimer),this.longPressTimer=setTimeout((()=>{this.longPressed=!0,this.emit(B.LONG_PRESS,t)}),this.config.pointer.longPressTime)}longTap(t){let e;return this.longPressed&&(this.emit(B.LONG_TAP,t),ot(t.path,B.LONG_TAP)&&(e=!0)),this.longPressWaitCancel(),e}longPressWaitCancel(){clearTimeout(this.longPressTimer),this.longPressed=!1}__onResize(){this.shrinkCanvasBounds=new O(this.canvas.bounds),this.shrinkCanvasBounds.spread(-2)}__listenEvents(){const{target:t}=this;this.__eventIds=[t.on_(T.RESIZE,this.__onResize,this)],t.once(R.READY,(()=>this.__onResize()))}__removeListenEvents(){this.target.off_(this.__eventIds),this.__eventIds.length=0}emit(t,e,i,a){this.running&&function(t,e,i,a){if(!i&&!e.path)return;let s;e.type=t,i?e=Object.assign(Object.assign({},e),{path:i}):i=e.path,e.target=i.indexAt(0);try{for(let r=i.length-1;r>-1;r--){if(s=i.list[r],at(s,t,e,!0,a))return;s.isApp&&it(s,t,e,!0,a)}for(let r=0,n=i.length;r<n;r++)if(s=i.list[r],s.isApp&&it(s,t,e,!1,a),at(s,t,e,!1,a))return}catch(t){tt.error(t)}}(t,e,i,a)}destroy(){this.__eventIds.length&&(this.stop(),this.__removeListenEvents(),this.dragger.destroy(),this.transformer.destroy(),this.downData=this.overPath=this.enterPath=null)}}class lt{static set(t,e){this.custom[t]=e}static get(t){return this.custom[t]}}lt.custom={};class ut extends P{constructor(){super(...arguments),this.pathTypeList=new f,this.imageTypeList=new f}getImageType(t,e){return this.imageTypeList.add(t),h.hitCanvas(e)}getPathType(t){return this.pathTypeList.add(t),h.hitCanvas()}clearImageType(){this.__clearLeafList(this.imageTypeList)}clearPathType(){this.__clearLeafList(this.pathTypeList)}__clearLeafList(t){t.length&&(t.forEach((t=>{t.__hitCanvas&&(t.__hitCanvas.destroy(),t.__hitCanvas=null)})),t.reset())}clear(){this.clearPathType(),this.clearImageType()}}const{toInnerRadiusPointOf:pt,copy:mt,setRadius:vt}=a,_t={};e.prototype.__hitWorld=function(t){return!this.__layout.hitCanvasChanged&&this.__hitCanvas||(this.__updateHitCanvas(),this.__layout.hitCanvasChanged=!1),this.__.hitRadius&&(mt(_t,t),vt(t=_t,this.__.hitRadius)),pt(t,this.__world,_t),!(!this.__.hitBox||!i.hitRadiusPoint(this.__layout.boxBounds,_t))||this.__hit(_t)},s.prototype.__updateHitCanvas=function(){this.__hitCanvas||(this.__hitCanvas=this.leafer.hitCanvasManager.getPathType(this));const t=this.__hitCanvas;this.__drawHitPath(t),t.setStrokeOptions(this.__)},s.prototype.__hit=function(t){"miniapp"===w.name&&this.__drawHitPath(this.__hitCanvas);const{fill:e,hitFill:i,windingRule:a}=this.__,s=e&&"path"===i||"all"===i,r=this.__hitFill(t,a);if(s&&r)return!0;const{stroke:n,hitStroke:o,__strokeWidth:h,strokeAlign:d}=this.__,g=n&&"path"===o||"all"===o,c=2*t.radiusX;let l=c;if(g)switch(d){case"inside":if(l+=2*h,!s&&r&&this.__hitStroke(t,l))return!0;l=c;break;case"center":l+=h;break;case"outside":if(l+=2*h,!s){if(!r&&this.__hitStroke(t,l))return!0;l=c}}return!!l&&this.__hitStroke(t,l)};const ft=new s;r.prototype.__updateHitCanvas=function(){(this.stroke||this.cornerRadius)&&ft.__updateHitCanvas.call(this)},r.prototype.__hitFill=function(t,e){return this.__hitCanvas?ft.__hitFill.call(this,t,e):i.hitRadiusPoint(this.__layout.boxBounds,t)},s.prototype.find=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!1,e):[]},s.prototype.findOne=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!0,e):null},n.prototype.pick=function(t,e){return this.__layout.update(),e||(e={}),this.leafer?this.leafer.selector.getByPoint(t,e.hitRadius||0,Object.assign(Object.assign({},e),{target:this})):null};export{L as App,lt as Cursor,S as DragEvent,N as DropEvent,ut as HitCanvasManager,ct as InteractionBase,Y as InteractionHelper,I as KeyEvent,M as Keyboard,V as LeaferTypeCreator,W as MoveEvent,rt as MultiTouchHelper,A as PointerButton,B as PointerEvent,j as RotateEvent,z as SwipeEvent,x as UIEvent,H as ZoomEvent};
1
+ import{Leafer as t,State as e,UI as i,Rect as a,Group as s}from"@leafer-ui/draw";export*from"@leafer-ui/draw";import{registerUI as r,Creator as n,PropertyEvent as o,Debug as h,DataHelper as d,canvasSizeAttrs as g,LayoutEvent as c,RenderEvent as l,Event as u,EventCreator as p,registerUIEvent as m,LeafList as v,PointHelper as _,BoundsHelper as f,Bounds as D,ResizeEvent as E,LeaferEvent as y,CanvasManager as O,Leaf as T,Platform as w}from"@leafer/core";function P(t,e,i,a){var s,r=arguments.length,n=r<3?e:null===a?a=Object.getOwnPropertyDescriptor(e,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,i,a);else for(var o=t.length-1;o>=0;o--)(s=t[o])&&(n=(r<3?s(n):r>3?s(e,i,n):s(e,i))||n);return r>3&&n&&Object.defineProperty(e,i,n),n}"function"==typeof SuppressedError&&SuppressedError;let R=class extends t{get __tag(){return"App"}get isApp(){return!0}constructor(t,e){super(t,e)}init(t,e){if(super.init(t,e),t){const{ground:e,tree:i,sky:a,editor:s}=t;e&&(this.ground=this.addLeafer(e)),(i||s)&&(this.tree=this.addLeafer(i)),(a||s)&&(this.sky=this.addLeafer(a||{type:"draw",usePartRender:!1})),s&&(this.editor=n.editor(s),this.sky.add(this.editor))}}__setApp(){const{canvas:t}=this,{realCanvas:e,view:i}=this.config;e||i===this.canvas.view||!t.parentView?this.realCanvas=!0:t.unrealCanvas(),this.leafer=this,this.watcher.disable(),this.layouter.disable(),this.__eventIds.push(this.on_(o.CHANGE,this.__onPropertyChange,this))}start(){super.start(),this.children.forEach((t=>t.start()))}stop(){this.children.forEach((t=>t.stop())),super.stop()}unlockLayout(){super.unlockLayout(),this.children.forEach((t=>t.unlockLayout()))}lockLayout(){super.lockLayout(),this.children.forEach((t=>t.lockLayout()))}forceRender(t){this.children.forEach((e=>e.forceRender(t)))}addLeafer(e){const i=new t(e);return this.add(i),i}add(t){if(!t.view){if(this.realCanvas&&!this.canvas.bounds)return void setTimeout((()=>this.add(t)),10);t.init(this.__getChildConfig(t.userConfig),this)}super.add(t),this.__listenChildEvents(t)}__onPropertyChange(){h.showHitView&&this.children.forEach((t=>t.forceUpdate("surface")))}__onCreated(){this.created=this.children.every((t=>t.created))}__onReady(){this.children.every((t=>t.ready))&&super.__onReady()}__onViewReady(){this.children.every((t=>t.viewReady))&&super.__onViewReady()}__onChildRenderEnd(t){this.renderer.addBlock(t.renderBounds),this.viewReady&&this.renderer.update()}__render(t,e){this.children.forEach((e=>t.copyWorld(e.canvas)))}__onResize(t){this.children.forEach((e=>e.resize(t))),super.__onResize(t)}__checkUpdateLayout(){this.children.forEach((t=>t.__layout.update()))}__getChildConfig(t){let e=Object.assign({},this.config);return e.hittable=e.realCanvas=void 0,t&&d.assign(e,t),this.autoLayout&&d.copyAttrs(e,this,g),e.view=this.realCanvas?void 0:this.view,e.fill=void 0,e}__listenChildEvents(t){t.once(c.END,(()=>this.__onReady())),t.once(l.START,(()=>this.__onCreated())),t.once(l.END,(()=>this.__onViewReady())),this.realCanvas&&this.__eventIds.push(t.on_(l.END,this.__onChildRenderEnd,this))}};R=P([r()],R);const C={},L={isHoldSpaceKey:()=>L.isHold("Space"),isHold:t=>C[t],setDownCode(t){C[t]||(C[t]=!0)},setUpCode(t){C[t]=!1}},b={LEFT:1,RIGHT:2,MIDDLE:4,defaultLeft(t){t.buttons||(t.buttons=1)},left:t=>1===t.buttons,right:t=>2===t.buttons,middle:t=>4===t.buttons};class M extends u{get spaceKey(){return L.isHoldSpaceKey()}get left(){return b.left(this)}get right(){return b.right(this)}get middle(){return b.middle(this)}constructor(t){super(t.type),this.bubbles=!0,Object.assign(this,t)}getPage(){return this.current.getPagePoint(this)}getInner(t){return t||(t=this.current),t.getInnerPoint(this)}getLocal(t){return t||(t=this.current),t.getLocalPoint(this)}static changeName(t,e){p.changeName(t,e)}}let A=class extends M{};A.POINTER="pointer",A.BEFORE_DOWN="pointer.before_down",A.BEFORE_MOVE="pointer.before_move",A.BEFORE_UP="pointer.before_up",A.DOWN="pointer.down",A.MOVE="pointer.move",A.UP="pointer.up",A.OVER="pointer.over",A.OUT="pointer.out",A.ENTER="pointer.enter",A.LEAVE="pointer.leave",A.TAP="tap",A.DOUBLE_TAP="double_tap",A.CLICK="click",A.DOUBLE_CLICK="double_click",A.LONG_PRESS="long_press",A.LONG_TAP="long_tap",A.MENU="pointer.menu",A.MENU_TAP="pointer.menu_tap",A=P([m()],A);const x={};let S=class extends A{static setList(t){this.list=t instanceof v?t:new v(t)}static setData(t){this.data=t}getPageMove(t){return this.assignMove(t),this.current.getPagePoint(x,null,!0)}getInnerMove(t,e){return t||(t=this.current),this.assignMove(e),t.getInnerPoint(x,null,!0)}getLocalMove(t,e){return t||(t=this.current),this.assignMove(e),t.getLocalPoint(x,null,!0)}getPageTotal(){return this.getPageMove(!0)}getInnerTotal(t){return this.getInnerMove(t,!0)}getLocalTotal(t){return this.getLocalMove(t,!0)}assignMove(t){x.x=t?this.totalX:this.moveX,x.y=t?this.totalY:this.moveY}};S.BEFORE_DRAG="drag.before_drag",S.START="drag.start",S.DRAG="drag",S.END="drag.end",S.OVER="drag.over",S.OUT="drag.out",S.ENTER="drag.enter",S.LEAVE="drag.leave",S=P([m()],S);let k=class extends A{static setList(t){S.setList(t)}static setData(t){S.setData(t)}};k.DROP="drop",k=P([m()],k);let B=class extends S{};B.BEFORE_MOVE="move.before_move",B.START="move.start",B.MOVE="move",B.END="move.end",B=P([m()],B);let H=class extends M{};H.BEFORE_ROTATE="rotate.before_rotate",H.START="rotate.start",H.ROTATE="rotate",H.END="rotate.end",H=P([m()],H);let N=class extends S{};N.SWIPE="swipe",N.LEFT="swipe.left",N.RIGHT="swipe.right",N.UP="swipe.up",N.DOWN="swipe.down",N=P([m()],N);let W=class extends M{};W.BEFORE_ZOOM="zoom.before_zoom",W.START="zoom.start",W.ZOOM="zoom",W.END="zoom.end",W=P([m()],W);let j=class extends M{};j.DOWN="key.down",j.HOLD="key.hold",j.UP="key.up",j=P([m()],j);const I=h.get("LeaferTypeCreator"),U={list:{},register(t,e){V[t]?I.repeat(t):V[t]=e},run(t,e){const i=V[t];i?i(e):I.error("no",t)}},{list:V,register:z}=U;z("draw",(function(t){const{config:e}=t;e.move.dragOut=!1})),z("design",(function(t){t.isApp||t.__eventIds.push(t.on_(B.BEFORE_MOVE,(e=>{let{moveX:i,moveY:a}=e;t.config.move.scroll&&(Math.abs(i)>Math.abs(a)?a=0:i=0),t.zoomLayer.move(i,a)})),t.on_(W.BEFORE_ZOOM,(e=>{const{zoomLayer:i}=t,a=t.validScale(e.scale);1!==a&&(_.scaleOf(i,e,a),i.scale=i.__.scaleX*a)})))})),t.prototype.initType=function(t){U.run(t,this)};class K{constructor(t){this.interaction=t}move(t){const{interaction:e}=this;if(!this.moveData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.moveData=Object.assign(Object.assign({},t),{moveX:0,moveY:0}),e.cancelHover(),e.emit(B.START,this.moveData)}t.path=this.moveData.path,e.emit(B.BEFORE_MOVE,t),e.emit(B.MOVE,t),this.transformEndWait()}zoom(t){const{interaction:e}=this;if(!this.zoomData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.zoomData=Object.assign(Object.assign({},t),{scale:1}),e.cancelHover(),e.emit(W.START,this.zoomData)}t.path=this.zoomData.path,e.emit(W.BEFORE_ZOOM,t),e.emit(W.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:e}=this;if(!this.rotateData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),e.cancelHover(),e.emit(H.START,this.rotateData)}t.path=this.rotateData.path,e.emit(H.BEFORE_ROTATE,t),e.emit(H.ROTATE,t),this.transformEndWait()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout((()=>{this.transformEnd()}),this.interaction.config.pointer.transformTime)}transformEnd(){this.moveEnd(),this.zoomEnd(),this.rotateEnd()}moveEnd(){this.moveData&&(this.interaction.emit(B.END,this.moveData),this.moveData=null)}zoomEnd(){this.zoomData&&(this.interaction.emit(W.END,this.zoomData),this.zoomData=null)}rotateEnd(){this.rotateData&&(this.interaction.emit(H.END,this.rotateData),this.rotateData=null)}destroy(){this.zoomData=this.moveData=this.rotateData=null}}const F={getMoveEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,moveX:e.x,moveY:e.y}),getRotateEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,rotation:e}),getZoomEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,scale:e}),getDragEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:i.x,y:i.y,moveX:i.x-e.x,moveY:i.y-e.y,totalX:i.x-t.x,totalY:i.y-t.y}),getDropEventData:(t,e,i)=>Object.assign(Object.assign({},t),{list:e,data:i}),getSwipeDirection:t=>t<-45&&t>-135?N.UP:t>45&&t<135?N.DOWN:t<=45&&t>=-45?N.RIGHT:N.LEFT,getSwipeEventData:(t,e,i)=>Object.assign(Object.assign({},i),{moveX:e.moveX,moveY:e.moveY,totalX:i.x-t.x,totalY:i.y-t.y,type:X.getSwipeDirection(_.getAngle(t,i))}),getBase(t){const e=1===t.button?4:t.button;return{altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,buttons:void 0===t.buttons?1:0===t.buttons?e:t.buttons,origin:t}},pathHasEventType(t,e){const{list:i}=t;for(let t=0,a=i.length;t<a;t++)if(i[t].hasEvent(e))return!0;return!1},filterPathByEventType(t,e){const i=new v,{list:a}=t;for(let t=0,s=a.length;t<s;t++)a[t].hasEvent(e)&&i.add(a[t]);return i}},X=F,Y=new v,{getDragEventData:G,getDropEventData:Z,getSwipeEventData:q}=F;class J{constructor(t){this.interaction=t}setDragData(t){this.animateWait&&this.dragEndReal(),this.downData=this.interaction.downData,this.dragData=G(t,t,t),this.canAnimate=this.canDragOut=!0}getList(){const{proxy:t}=this.interaction.selector;return!this.dragging||t&&t.list.length?Y:S.list||this.dragableList||Y}checkDrag(t,e){const{interaction:i}=this;if(this.moving&&t.buttons<1)return this.canAnimate=!1,void i.pointerCancel();!this.moving&&e&&(this.moving=i.moveMode||i.isHoldRightKey)&&i.emit(B.START,this.dragData),this.moving||this.dragStart(t,e),this.drag(t)}dragStart(t,e){this.dragging||(this.dragging=e&&b.left(t),this.dragging&&(this.interaction.emit(S.START,this.dragData),this.getDragableList(this.dragData.path)))}getDragableList(t){let e;for(let i=0,a=t.length;i<a;i++)if(e=t.list[i],(e.__.draggable||e.__.editable)&&e.__.hitSelf&&!e.__.locked){this.dragableList=new v(e);break}}drag(t){const{interaction:e,dragData:i,downData:a}=this,{path:s,throughPath:r}=a;this.dragData=G(a,i,t),r&&(this.dragData.throughPath=r),this.dragData.path=s,this.moving?(e.emit(B.BEFORE_MOVE,this.dragData),e.emit(B.MOVE,this.dragData)):this.dragging&&(this.dragReal(),e.emit(S.BEFORE_DRAG,this.dragData),e.emit(S.DRAG,this.dragData))}dragReal(){const{running:t}=this.interaction,e=this.getList();if(e.length&&t){const{moveX:t,moveY:i}=this.dragData;e.forEach((e=>e.moveWorld(t,i)))}}dragOverOrOut(t){const{interaction:e}=this,{dragOverPath:i}=this,{path:a}=t;this.dragOverPath=a,i?a.indexAt(0)!==i.indexAt(0)&&(e.emit(S.OUT,t,i),e.emit(S.OVER,t,a)):e.emit(S.OVER,t,a)}dragEnterOrLeave(t){const{interaction:e}=this,{dragEnterPath:i}=this,{path:a}=t;e.emit(S.LEAVE,t,i,a),e.emit(S.ENTER,t,a,i),this.dragEnterPath=a}dragEnd(t,e){if(!this.dragData)return;const{moveX:i,moveY:a}=this.dragData;this.interaction.config.move.dragAnimate&&this.canAnimate&&this.moving&&(Math.abs(i)>1||Math.abs(a)>1)?(t=Object.assign({},t),e=.9*(e||("touch"===t.pointerType?2:1)),_.move(t,i*e,a*e),this.drag(t),this.animate((()=>{this.dragEnd(t,1)}))):this.dragEndReal(t)}dragEndReal(t){const{interaction:e,downData:i,dragData:a}=this;t||(t=a);const{path:s,throughPath:r}=i,n=G(i,t,t);r&&(n.throughPath=r),n.path=s,this.moving&&e.emit(B.END,n),this.dragging&&(e.emit(S.END,n),this.swipe(t,n),this.drop(t)),this.autoMoveCancel(),this.dragReset(),this.animate(null,"off")}animate(t,e){const i=t||this.animateWait;i&&this.interaction.target.nextRender(i,null,e),this.animateWait=t}swipe(t,e){const{interaction:i,downData:a}=this;if(_.getDistance(a,t)>i.config.pointer.swipeDistance){const t=q(a,this.dragData,e);this.interaction.emit(t.type,t)}}drop(t){const e=Z(t,this.getList(),S.data);e.path=this.dragEnterPath,this.interaction.emit(k.DROP,e),this.interaction.emit(S.LEAVE,t,this.dragEnterPath)}dragReset(){S.list=S.data=this.dragableList=this.dragData=this.downData=this.dragOverPath=this.dragEnterPath=null,this.dragging=this.moving=!1}checkDragOut(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)}autoMoveOnDragOut(t){const{interaction:e,downData:i,canDragOut:a}=this,{autoDistance:s,dragOut:r}=e.config.move;if(!r||!a||!s)return;const n=e.shrinkCanvasBounds,{x:o,y:h}=n,d=f.maxX(n),g=f.maxY(n),c=t.x<o?s:d<t.x?-s:0,l=t.y<h?s:g<t.y?-s:0;let u=0,p=0;this.autoMoveTimer=setInterval((()=>{u+=c,p+=l,_.move(i,c,l),_.move(this.dragData,c,l),e.move(Object.assign(Object.assign({},t),{moveX:c,moveY:l,totalX:u,totalY:p})),e.pointerMoveReal(t)}),10)}autoMoveCancel(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)}destroy(){this.dragReset()}}const Q=h.get("emit");const $=["move","zoom","rotate","key"];function tt(t,e,i,a,s){if($.some((t=>e.startsWith(t)))&&t.__.hitChildren&&!it(t,s)){let r;for(let n=0,o=t.children.length;n<o;n++)r=t.children[n],!i.path.has(r)&&r.__.hittable&&et(r,e,i,a,s)}}function et(t,i,a,s,r){if(t.destroyed)return!0;if(t.__.hitSelf&&!it(t,r)&&(e.updateEventStyle&&e.updateEventStyle(t,i),t.hasEvent(i,s))){a.phase=s?1:t===a.target?2:3;const e=p.get(i,a);if(t.emitEvent(e,s),e.isStop)return!0}return!1}function it(t,e){return e&&e.has(t)}const at={getData(t){const e=t[0],i=t[1],a=_.getCenter(e.from,i.from),s=_.getCenter(e.to,i.to),r={x:s.x-a.x,y:s.y-a.y},n=_.getDistance(e.from,i.from);return{move:r,scale:_.getDistance(e.to,i.to)/n,angle:_.getRotation(e.from,i.from,e.to,i.to),center:s}}},st={wheel:{zoomSpeed:.5,moveSpeed:.5,rotateSpeed:.5,delta:{x:20,y:8},preventDefault:!0},pointer:{hitRadius:5,tapTime:120,longPressTime:800,transformTime:500,dragHover:!0,dragDistance:2,swipeDistance:20,preventDefaultMenu:!0},cursor:{}},{pathHasEventType:rt,getMoveEventData:nt,getZoomEventData:ot,getRotateEventData:ht}=F;class dt{get dragging(){return this.dragger.dragging}get isDragEmpty(){return this.config.move.dragEmpty&&this.hoverData&&this.hoverData.path.list[0].isLeafer&&(!this.downData||this.downData.path.list[0].isLeafer)}get isHoldRightKey(){return this.config.move.holdRightKey&&this.downData&&b.right(this.downData)}get moveMode(){return this.config.move.drag||this.config.move.holdSpaceKey&&L.isHoldSpaceKey()||this.downData&&(this.config.move.holdMiddleKey&&b.middle(this.downData)||this.isHoldRightKey&&this.dragger.moving)||this.isDragEmpty}get hitRadius(){return this.config.pointer.hitRadius}constructor(t,e,i,a){this.config=st,this.tapCount=0,this.downKeyMap={},this.target=t,this.canvas=e,this.selector=i,this.defaultPath=new v(t),this.transformer=new K(this),this.dragger=new J(this),a&&(this.config=d.default(a,this.config)),this.__listenEvents()}start(){this.running=!0}stop(){this.running=!1}receive(t){}pointerDown(t,e){t||(t=this.hoverData),t&&(b.defaultLeft(t),this.updateDownData(t),e&&(t.path=this.defaultPath),this.downTime=Date.now(),(this.downed=!this.moveMode)&&(this.emit(A.BEFORE_DOWN,t),this.emit(A.DOWN,t),b.left(t)?(this.tapWait(),this.longPressWait(t)):b.right(t)&&(this.waitMenuTap=!0)),this.dragger.setDragData(t),this.updateCursor(t))}pointerMove(t){if(t||(t=this.hoverData),!t)return;const{downData:e}=this;e&&b.defaultLeft(t);const i=this.canvas.bounds.hitPoint(t);(i||e)&&(i&&!e&&b.left(t)&&(this.pointerDown(t,!0),this.dragger.canDragOut=!1),this.pointerMoveReal(t),e&&this.dragger.checkDragOut(t))}pointerMoveReal(t){if(this.emit(A.BEFORE_MOVE,t,this.defaultPath),this.downData){const e=_.getDistance(this.downData,t)>this.config.pointer.dragDistance;e&&(this.waitTap&&this.pointerWaitCancel(),this.waitMenuTap=!1),this.dragger.checkDrag(t,e)}this.dragger.moving||(this.updateHoverData(t),this.moveMode&&(t.path=this.defaultPath),this.emit(A.MOVE,t),this.dragging&&!this.config.pointer.dragHover||this.pointerHover(t),this.dragger.dragging&&(this.dragger.dragOverOrOut(t),this.dragger.dragEnterOrLeave(t))),this.updateCursor(this.downData||t)}pointerUp(t){const{downData:e,oldDownData:i}=this;t||(t=e),e&&(b.defaultLeft(t),this.findPath(t),this.downed&&(this.downed=!1,this.emit(A.BEFORE_UP,t),this.emit(A.UP,t),i&&this.emit(A.UP,i,void 0,t.path),this.emit(A.UP,e,void 0,t.path),this.touchLeave(t),this.tap(t),this.menuTap(t)),this.dragger.dragEnd(t),this.downData=this.oldDownData=null,this.updateCursor(t))}pointerCancel(){this.pointerUp(this.dragger.dragData)}multiTouch(t,e){const{move:i,angle:a,scale:s,center:r}=at.getData(e);this.rotate(ht(r,a,t)),this.zoom(ot(r,s,t)),this.move(nt(r,i,t))}menu(t){this.findPath(t),this.emit(A.MENU,t)}menuTap(t){this.waitMenuTap&&this.emit(A.MENU_TAP,t)}move(t){this.transformer.move(t)}zoom(t){this.transformer.zoom(t)}rotate(t){this.transformer.rotate(t)}transformEnd(){this.transformer.transformEnd()}keyDown(t){const{code:e}=t;this.downKeyMap[e]||(this.downKeyMap[e]=!0,L.setDownCode(e),this.emit(j.HOLD,t,this.defaultPath),this.moveMode&&(this.cancelHover(),this.updateCursor())),this.emit(j.DOWN,t,this.defaultPath)}keyUp(t){const{code:e}=t;this.downKeyMap[e]=!1,L.setUpCode(e),this.emit(j.UP,t,this.defaultPath),"grab"===this.cursor&&this.updateCursor()}pointerHover(t){this.pointerOverOrOut(t),this.pointerEnterOrLeave(t)}pointerOverOrOut(t){const{path:e}=t,{overPath:i}=this;this.overPath=e,i?e.indexAt(0)!==i.indexAt(0)&&(this.emit(A.OUT,t,i),this.emit(A.OVER,t,e)):this.emit(A.OVER,t,e)}pointerEnterOrLeave(t){let{path:e}=t;this.downData&&!this.moveMode&&(e=e.clone(),this.downData.path.forEach((t=>e.add(t))));const{enterPath:i}=this;this.enterPath=e,this.emit(A.LEAVE,t,i,e),this.emit(A.ENTER,t,e,i)}touchLeave(t){"touch"===t.pointerType&&this.enterPath&&(this.emit(A.LEAVE,t),this.dragger.dragging&&this.emit(k.LEAVE,t))}tap(t){const{pointer:e}=this.config,i=this.longTap(t);if(!e.tapMore&&i)return;if(!this.waitTap)return;e.tapMore&&this.emitTap(t);const a=Date.now()-this.downTime,s=[A.DOUBLE_TAP,A.DOUBLE_CLICK].some((e=>rt(t.path,e)));a<e.tapTime+50&&s?(this.tapCount++,2===this.tapCount?(this.tapWaitCancel(),this.emitDoubleTap(t)):(clearTimeout(this.tapTimer),this.tapTimer=setTimeout((()=>{e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}),e.tapTime))):e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}findPath(t,e){const{hitRadius:i,through:a}=this.config.pointer,s=this.selector.getByPoint(t,i,e||{through:a});return s.throughPath&&(t.throughPath=s.throughPath),t.path=s.path,s.path}isDrag(t){return this.dragger.getList().has(t)}isPress(t){const{downData:e,oldDownData:i}=this;return this.downed&&(e&&e.path.has(t)||i&&i.path.has(t))}isHover(t){return this.enterPath&&this.enterPath.has(t)}isFocus(t){return this.focusData===t}cancelHover(){const{hoverData:t}=this;t&&(t.path=this.defaultPath,this.pointerHover(t))}updateDownData(t,e){const{downData:i}=this;!t&&i&&(t=Object.assign({},i)),t&&(this.oldDownData=i,this.findPath(t,e),this.downData=t)}updateHoverData(t){t||(t=this.hoverData),t&&(this.findPath(t,{exclude:this.dragger.getList(),name:A.MOVE}),this.hoverData=t)}updateCursor(t){if(this.config.cursor.stop)return;if(t||(this.updateHoverData(),t=this.downData||this.hoverData),this.dragger.moving)return this.setCursor("grabbing");if(this.moveMode)return this.setCursor(this.downData?"grabbing":"grab");if(!t)return;let e,i;const{path:a}=t;for(let t=0,s=a.length;t<s&&(e=a.list[t],i=e.cursor,!i);t++);this.setCursor(i)}setCursor(t){this.cursor=t}emitTap(t){this.emit(A.TAP,t),this.emit(A.CLICK,t)}emitDoubleTap(t){this.emit(A.DOUBLE_TAP,t),this.emit(A.DOUBLE_CLICK,t)}pointerWaitCancel(){this.tapWaitCancel(),this.longPressWaitCancel()}tapWait(){clearTimeout(this.tapTimer),this.waitTap=!0}tapWaitCancel(){clearTimeout(this.tapTimer),this.waitTap=!1,this.tapCount=0}longPressWait(t){clearTimeout(this.longPressTimer),this.longPressTimer=setTimeout((()=>{this.longPressed=!0,this.emit(A.LONG_PRESS,t)}),this.config.pointer.longPressTime)}longTap(t){let e;return this.longPressed&&(this.emit(A.LONG_TAP,t),rt(t.path,A.LONG_TAP)&&(e=!0)),this.longPressWaitCancel(),e}longPressWaitCancel(){clearTimeout(this.longPressTimer),this.longPressed=!1}__onResize(){this.shrinkCanvasBounds=new D(this.canvas.bounds),this.shrinkCanvasBounds.spread(-2)}__listenEvents(){const{target:t}=this;this.__eventIds=[t.on_(E.RESIZE,this.__onResize,this)],t.once(y.READY,(()=>this.__onResize()))}__removeListenEvents(){this.target.off_(this.__eventIds),this.__eventIds.length=0}emit(t,e,i,a){this.running&&function(t,e,i,a){if(!i&&!e.path)return;let s;e.type=t,i?e=Object.assign(Object.assign({},e),{path:i}):i=e.path,e.target=i.indexAt(0);try{for(let r=i.length-1;r>-1;r--){if(s=i.list[r],et(s,t,e,!0,a))return;s.isApp&&tt(s,t,e,!0,a)}for(let r=0,n=i.length;r<n;r++)if(s=i.list[r],s.isApp&&tt(s,t,e,!1,a),et(s,t,e,!1,a))return}catch(t){Q.error(t)}}(t,e,i,a)}destroy(){this.__eventIds.length&&(this.stop(),this.__removeListenEvents(),this.dragger.destroy(),this.transformer.destroy(),this.downData=this.overPath=this.enterPath=null)}}class gt{static set(t,e){this.custom[t]=e}static get(t){return this.custom[t]}}gt.custom={};class ct extends O{constructor(){super(...arguments),this.pathTypeList=new v,this.imageTypeList=new v}getImageType(t,e){return this.imageTypeList.add(t),n.hitCanvas(e)}getPathType(t){return this.pathTypeList.add(t),n.hitCanvas()}clearImageType(){this.__clearLeafList(this.imageTypeList)}clearPathType(){this.__clearLeafList(this.pathTypeList)}__clearLeafList(t){t.length&&(t.forEach((t=>{t.__hitCanvas&&(t.__hitCanvas.destroy(),t.__hitCanvas=null)})),t.reset())}clear(){this.clearPathType(),this.clearImageType()}}const{toInnerRadiusPointOf:lt,copy:ut,setRadius:pt}=_,mt={};T.prototype.__hitWorld=function(t){return!this.__layout.hitCanvasChanged&&this.__hitCanvas||(this.__updateHitCanvas(),this.__layout.hitCanvasChanged=!1),this.__.hitRadius&&(ut(mt,t),pt(t=mt,this.__.hitRadius)),lt(t,this.__world,mt),!(!this.__.hitBox||!f.hitRadiusPoint(this.__layout.boxBounds,mt))||this.__hit(mt)},i.prototype.__updateHitCanvas=function(){this.__hitCanvas||(this.__hitCanvas=this.leafer.hitCanvasManager.getPathType(this));const t=this.__hitCanvas;this.__drawHitPath(t),t.setStrokeOptions(this.__)},i.prototype.__hit=function(t){"miniapp"===w.name&&this.__drawHitPath(this.__hitCanvas);const{fill:e,hitFill:i,windingRule:a}=this.__,s=e&&"path"===i||"all"===i,r=this.__hitFill(t,a);if(s&&r)return!0;const{stroke:n,hitStroke:o,__strokeWidth:h,strokeAlign:d}=this.__,g=n&&"path"===o||"all"===o,c=2*t.radiusX;let l=c;if(g)switch(d){case"inside":if(l+=2*h,!s&&r&&this.__hitStroke(t,l))return!0;l=c;break;case"center":l+=h;break;case"outside":if(l+=2*h,!s){if(!r&&this.__hitStroke(t,l))return!0;l=c}}return!!l&&this.__hitStroke(t,l)};const vt=new i;a.prototype.__updateHitCanvas=function(){(this.stroke||this.cornerRadius)&&vt.__updateHitCanvas.call(this)},a.prototype.__hitFill=function(t,e){return this.__hitCanvas?vt.__hitFill.call(this,t,e):f.hitRadiusPoint(this.__layout.boxBounds,t)},i.prototype.find=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!1,e):[]},i.prototype.findOne=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!0,e):null},s.prototype.pick=function(t,e){return this.__layout.update(),e||(e={}),this.leafer?this.leafer.selector.getByPoint(t,e.hitRadius||0,Object.assign(Object.assign({},e),{target:this})):null};export{R as App,gt as Cursor,S as DragEvent,k as DropEvent,ct as HitCanvasManager,dt as InteractionBase,F as InteractionHelper,j as KeyEvent,L as Keyboard,U as LeaferTypeCreator,B as MoveEvent,at as MultiTouchHelper,b as PointerButton,A as PointerEvent,H as RotateEvent,N as SwipeEvent,M as UIEvent,W as ZoomEvent};
package/lib/core.min.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var t=require("@leafer-ui/draw"),e=require("@leafer/core");function i(t,e,i,s){var r,a=arguments.length,o=a<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,i,s);else for(var n=t.length-1;n>=0;n--)(r=t[n])&&(o=(a<3?r(o):a>3?r(e,i,o):r(e,i))||o);return a>3&&o&&Object.defineProperty(e,i,o),o}"function"==typeof SuppressedError&&SuppressedError,exports.App=class extends t.Leafer{get __tag(){return"App"}get isApp(){return!0}constructor(t,e){super(t,e)}init(t,i){if(super.init(t,i),t){const{ground:i,tree:s,sky:r,editor:a}=t;i&&(this.ground=this.addLeafer(i)),(s||a)&&(this.tree=this.addLeafer(s)),(r||a)&&(this.sky=this.addLeafer(r||{type:"draw",usePartRender:!1})),a&&(this.editor=e.Creator.editor(a),this.sky.add(this.editor))}}__setApp(){const{canvas:t}=this,{realCanvas:i,view:s}=this.config;i||s===this.canvas.view||!t.parentView?this.realCanvas=!0:t.unrealCanvas(),this.leafer=this,this.watcher.disable(),this.layouter.disable(),this.__eventIds.push(this.on_(e.PropertyEvent.CHANGE,this.__onPropertyChange,this))}start(){super.start(),this.children.forEach((t=>t.start()))}stop(){this.children.forEach((t=>t.stop())),super.stop()}unlockLayout(){super.unlockLayout(),this.children.forEach((t=>t.unlockLayout()))}lockLayout(){super.lockLayout(),this.children.forEach((t=>t.lockLayout()))}forceRender(t){this.children.forEach((e=>e.forceRender(t)))}addLeafer(e){const i=new t.Leafer(e);return this.add(i),i}add(t){if(!t.view){if(this.realCanvas&&!this.canvas.bounds)return void setTimeout((()=>this.add(t)),10);t.init(this.__getChildConfig(t.userConfig),this)}super.add(t),this.__listenChildEvents(t)}__onPropertyChange(){e.Debug.showHitView&&this.children.forEach((t=>t.forceUpdate("surface")))}__onCreated(){this.created=this.children.every((t=>t.created))}__onReady(){this.children.every((t=>t.ready))&&super.__onReady()}__onViewReady(){this.children.every((t=>t.viewReady))&&super.__onViewReady()}__onChildRenderEnd(t){this.renderer.addBlock(t.renderBounds),this.viewReady&&this.renderer.update()}__render(t,e){this.children.forEach((e=>t.copyWorld(e.canvas)))}__onResize(t){this.children.forEach((e=>e.resize(t))),super.__onResize(t)}__checkUpdateLayout(){this.children.forEach((t=>t.__layout.update()))}__getChildConfig(t){let i=Object.assign({},this.config);return i.hittable=i.realCanvas=void 0,t&&e.DataHelper.assign(i,t),this.autoLayout&&e.DataHelper.copyAttrs(i,this,e.canvasSizeAttrs),i.view=this.realCanvas?void 0:this.view,i.fill=void 0,i}__listenChildEvents(t){t.once(e.LayoutEvent.END,(()=>this.__onReady())),t.once(e.RenderEvent.START,(()=>this.__onCreated())),t.once(e.RenderEvent.END,(()=>this.__onViewReady())),this.realCanvas&&this.__eventIds.push(t.on_(e.RenderEvent.END,this.__onChildRenderEnd,this))}},exports.App=i([e.registerUI()],exports.App);const s={},r={isHoldSpaceKey:()=>r.isHold("Space"),isHold:t=>s[t],setDownCode(t){s[t]||(s[t]=!0)},setUpCode(t){s[t]=!1}},a={LEFT:1,RIGHT:2,MIDDLE:4,defaultLeft(t){t.buttons||(t.buttons=1)},left:t=>1===t.buttons,right:t=>2===t.buttons,middle:t=>4===t.buttons};class o extends e.Event{get spaceKey(){return r.isHoldSpaceKey()}get left(){return a.left(this)}get right(){return a.right(this)}get middle(){return a.middle(this)}constructor(t){super(t.type),this.bubbles=!0,Object.assign(this,t)}getPage(){return this.current.getPagePoint(this)}getInner(t){return t||(t=this.current),t.getInnerPoint(this)}getLocal(t){return t||(t=this.current),t.getLocalPoint(this)}static changeName(t,i){e.EventCreator.changeName(t,i)}}exports.PointerEvent=class extends o{},exports.PointerEvent.POINTER="pointer",exports.PointerEvent.BEFORE_DOWN="pointer.before_down",exports.PointerEvent.BEFORE_MOVE="pointer.before_move",exports.PointerEvent.BEFORE_UP="pointer.before_up",exports.PointerEvent.DOWN="pointer.down",exports.PointerEvent.MOVE="pointer.move",exports.PointerEvent.UP="pointer.up",exports.PointerEvent.OVER="pointer.over",exports.PointerEvent.OUT="pointer.out",exports.PointerEvent.ENTER="pointer.enter",exports.PointerEvent.LEAVE="pointer.leave",exports.PointerEvent.TAP="tap",exports.PointerEvent.DOUBLE_TAP="double_tap",exports.PointerEvent.CLICK="click",exports.PointerEvent.DOUBLE_CLICK="double_click",exports.PointerEvent.LONG_PRESS="long_press",exports.PointerEvent.LONG_TAP="long_tap",exports.PointerEvent.MENU="pointer.menu",exports.PointerEvent.MENU_TAP="pointer.menu_tap",exports.PointerEvent=i([e.registerUIEvent()],exports.PointerEvent);const n={};exports.DragEvent=class extends exports.PointerEvent{static setList(t){this.list=t instanceof e.LeafList?t:new e.LeafList(t)}static setData(t){this.data=t}getPageMove(t){return this.assignMove(t),this.current.getPagePoint(n,null,!0)}getInnerMove(t,e){return t||(t=this.current),this.assignMove(e),t.getInnerPoint(n,null,!0)}getLocalMove(t,e){return t||(t=this.current),this.assignMove(e),t.getLocalPoint(n,null,!0)}getPageTotal(){return this.getPageMove(!0)}getInnerTotal(t){return this.getInnerMove(t,!0)}getLocalTotal(t){return this.getLocalMove(t,!0)}assignMove(t){n.x=t?this.totalX:this.moveX,n.y=t?this.totalY:this.moveY}},exports.DragEvent.BEFORE_DRAG="drag.before_drag",exports.DragEvent.START="drag.start",exports.DragEvent.DRAG="drag",exports.DragEvent.END="drag.end",exports.DragEvent.OVER="drag.over",exports.DragEvent.OUT="drag.out",exports.DragEvent.ENTER="drag.enter",exports.DragEvent.LEAVE="drag.leave",exports.DragEvent=i([e.registerUIEvent()],exports.DragEvent),exports.DropEvent=class extends exports.PointerEvent{static setList(t){exports.DragEvent.setList(t)}static setData(t){exports.DragEvent.setData(t)}},exports.DropEvent.DROP="drop",exports.DropEvent=i([e.registerUIEvent()],exports.DropEvent),exports.MoveEvent=class extends exports.DragEvent{},exports.MoveEvent.BEFORE_MOVE="move.before_move",exports.MoveEvent.START="move.start",exports.MoveEvent.MOVE="move",exports.MoveEvent.END="move.end",exports.MoveEvent=i([e.registerUIEvent()],exports.MoveEvent),exports.RotateEvent=class extends o{},exports.RotateEvent.BEFORE_ROTATE="rotate.before_rotate",exports.RotateEvent.START="rotate.start",exports.RotateEvent.ROTATE="rotate",exports.RotateEvent.END="rotate.end",exports.RotateEvent=i([e.registerUIEvent()],exports.RotateEvent),exports.SwipeEvent=class extends exports.DragEvent{},exports.SwipeEvent.SWIPE="swipe",exports.SwipeEvent.LEFT="swipe.left",exports.SwipeEvent.RIGHT="swipe.right",exports.SwipeEvent.UP="swipe.up",exports.SwipeEvent.DOWN="swipe.down",exports.SwipeEvent=i([e.registerUIEvent()],exports.SwipeEvent),exports.ZoomEvent=class extends o{},exports.ZoomEvent.BEFORE_ZOOM="zoom.before_zoom",exports.ZoomEvent.START="zoom.start",exports.ZoomEvent.ZOOM="zoom",exports.ZoomEvent.END="zoom.end",exports.ZoomEvent=i([e.registerUIEvent()],exports.ZoomEvent),exports.KeyEvent=class extends o{},exports.KeyEvent.DOWN="key.down",exports.KeyEvent.HOLD="key.hold",exports.KeyEvent.UP="key.up",exports.KeyEvent=i([e.registerUIEvent()],exports.KeyEvent);const h=e.Debug.get("LeaferTypeCreator"),p={list:{},register(t,e){g[t]?h.repeat(t):g[t]=e},run(t,e){const i=g[t];i?i(e):h.error("no",t)}},{list:g,register:d}=p;d("draw",(function(t){const{config:e}=t;e.move.dragOut=!1})),d("design",(function(t){t.isApp||t.__eventIds.push(t.on_(exports.MoveEvent.BEFORE_MOVE,(e=>t.zoomLayer.move(e.moveX,e.moveY))),t.on_(exports.ZoomEvent.BEFORE_ZOOM,(i=>{const{zoomLayer:s}=t,{scaleX:r}=s.__,{min:a,max:o}=t.app.config.zoom;let{scale:n}=i,h=Math.abs(r*n);h<a?n=a/r:h>o&&(n=o/r),1!==n&&(e.PointHelper.scaleOf(s,i,n),s.scale=r*n)})))})),t.Leafer.prototype.initType=function(t){p.run(t,this)};class v{constructor(t){this.interaction=t}move(t){const{interaction:e}=this;if(!this.moveData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.moveData=Object.assign(Object.assign({},t),{moveX:0,moveY:0}),e.emit(exports.MoveEvent.START,this.moveData)}t.path=this.moveData.path,e.emit(exports.MoveEvent.BEFORE_MOVE,t),e.emit(exports.MoveEvent.MOVE,t),this.transformEndWait()}zoom(t){const{interaction:e}=this;if(!this.zoomData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.zoomData=Object.assign(Object.assign({},t),{scale:1}),e.emit(exports.ZoomEvent.START,this.zoomData)}t.path=this.zoomData.path,e.emit(exports.ZoomEvent.BEFORE_ZOOM,t),e.emit(exports.ZoomEvent.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:e}=this;if(!this.rotateData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),e.emit(exports.RotateEvent.START,this.rotateData)}t.path=this.rotateData.path,e.emit(exports.RotateEvent.BEFORE_ROTATE,t),e.emit(exports.RotateEvent.ROTATE,t),this.transformEndWait()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout((()=>{this.transformEnd()}),this.interaction.config.pointer.transformTime)}transformEnd(){this.moveEnd(),this.zoomEnd(),this.rotateEnd()}moveEnd(){this.moveData&&(this.interaction.emit(exports.MoveEvent.END,this.moveData),this.moveData=null)}zoomEnd(){this.zoomData&&(this.interaction.emit(exports.ZoomEvent.END,this.zoomData),this.zoomData=null)}rotateEnd(){this.rotateData&&(this.interaction.emit(exports.RotateEvent.END,this.rotateData),this.rotateData=null)}destroy(){this.zoomData=this.moveData=this.rotateData=null}}const c={getMoveEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,moveX:e.x,moveY:e.y}),getRotateEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,rotation:e}),getZoomEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,scale:e}),getDragEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:i.x,y:i.y,moveX:i.x-e.x,moveY:i.y-e.y,totalX:i.x-t.x,totalY:i.y-t.y}),getDropEventData:(t,e,i)=>Object.assign(Object.assign({},t),{list:e,data:i}),getSwipeDirection:t=>t<-45&&t>-135?exports.SwipeEvent.UP:t>45&&t<135?exports.SwipeEvent.DOWN:t<=45&&t>=-45?exports.SwipeEvent.RIGHT:exports.SwipeEvent.LEFT,getSwipeEventData:(t,i,s)=>Object.assign(Object.assign({},s),{moveX:i.moveX,moveY:i.moveY,totalX:s.x-t.x,totalY:s.y-t.y,type:l.getSwipeDirection(e.PointHelper.getAngle(t,s))}),getBase(t){const e=1===t.button?4:t.button;return{altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,buttons:void 0===t.buttons?1:0===t.buttons?e:t.buttons,origin:t}},pathHasEventType(t,e){const{list:i}=t;for(let t=0,s=i.length;t<s;t++)if(i[t].hasEvent(e))return!0;return!1},filterPathByEventType(t,i){const s=new e.LeafList,{list:r}=t;for(let t=0,e=r.length;t<e;t++)r[t].hasEvent(i)&&s.add(r[t]);return s}},l=c,E=new e.LeafList,{getDragEventData:u,getDropEventData:m,getSwipeEventData:D}=c;class f{constructor(t){this.interaction=t}setDragData(t){this.animateWait&&this.dragEndReal(),this.downData=this.interaction.downData,this.dragData=u(t,t,t)}getList(){const{proxy:t}=this.interaction.selector;return!this.dragging||t&&t.list.length?E:exports.DragEvent.list||this.dragableList||E}checkDrag(t,e){const{interaction:i}=this;if(this.moving&&t.buttons<1)return this.canAnimate=!1,void i.pointerCancel();this.canAnimate=!0,!this.moving&&e&&(this.moving=i.moveMode||i.isHoldRightKey)&&i.emit(exports.MoveEvent.START,this.dragData),this.moving||this.dragStart(t,e),this.drag(t)}dragStart(t,e){this.dragging||(this.dragging=e&&a.left(t),this.dragging&&(this.interaction.emit(exports.DragEvent.START,this.dragData),this.getDragableList(this.dragData.path)))}getDragableList(t){let i;for(let s=0,r=t.length;s<r;s++)if(i=t.list[s],(i.__.draggable||i.__.editable)&&i.__.hitSelf&&!i.__.locked){this.dragableList=new e.LeafList(i);break}}drag(t){const{interaction:e,dragData:i,downData:s}=this,{path:r,throughPath:a}=s;this.dragData=u(s,i,t),a&&(this.dragData.throughPath=a),this.dragData.path=r,this.moving?(e.emit(exports.MoveEvent.BEFORE_MOVE,this.dragData),e.emit(exports.MoveEvent.MOVE,this.dragData)):this.dragging&&(this.dragReal(),e.emit(exports.DragEvent.BEFORE_DRAG,this.dragData),e.emit(exports.DragEvent.DRAG,this.dragData))}dragReal(){const{running:t}=this.interaction,i=this.getList();if(i.length&&t){const{moveX:t,moveY:s}=this.dragData;i.forEach((i=>e.LeafHelper.moveWorld(i,t,s)))}}dragOverOrOut(t){const{interaction:e}=this,{dragOverPath:i}=this,{path:s}=t;i?s.indexAt(0)!==i.indexAt(0)&&(e.emit(exports.DragEvent.OUT,t,i),e.emit(exports.DragEvent.OVER,t,s)):e.emit(exports.DragEvent.OVER,t,s),this.dragOverPath=s}dragEnterOrLeave(t){const{interaction:e}=this,{dragEnterPath:i}=this,{path:s}=t;e.emit(exports.DragEvent.LEAVE,t,i,s),e.emit(exports.DragEvent.ENTER,t,s,i),this.dragEnterPath=s}dragEnd(t,i){if(!this.dragData)return;const{moveX:s,moveY:r}=this.dragData;this.canAnimate&&this.moving&&(Math.abs(s)>1||Math.abs(r)>1)?(t=Object.assign({},t),i=.9*(i||("touch"===t.pointerType?2:1)),e.PointHelper.move(t,s*i,r*i),this.drag(t),this.animate((()=>{this.dragEnd(t,1)}))):this.dragEndReal(t)}dragEndReal(t){const{interaction:e,downData:i,dragData:s}=this;t||(t=s);const{path:r,throughPath:a}=i,o=u(i,t,t);a&&(o.throughPath=a),o.path=r,this.moving&&e.emit(exports.MoveEvent.END,o),this.dragging&&(e.emit(exports.DragEvent.END,o),this.swipe(t,o),this.drop(t)),this.autoMoveCancel(),this.dragReset(),this.animate(null,"off")}animate(t,e){const i=t||this.animateWait;i&&this.interaction.target.nextRender(i,e),this.animateWait=t}swipe(t,i){const{interaction:s}=this,{downData:r}=s;if(e.PointHelper.getDistance(r,t)>s.config.pointer.swipeDistance){const t=D(r,this.dragData,i);this.interaction.emit(t.type,t)}}drop(t){const e=m(t,this.getList(),exports.DragEvent.data);e.path=this.dragEnterPath,this.interaction.emit(exports.DropEvent.DROP,e),this.interaction.emit(exports.DragEvent.LEAVE,t,this.dragEnterPath)}dragReset(){exports.DragEvent.list=exports.DragEvent.data=this.dragableList=this.dragData=this.downData=this.dragOverPath=this.dragEnterPath=null,this.dragging=this.moving=!1}checkDragOut(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)}autoMoveOnDragOut(t){const{interaction:i,downData:s}=this,{autoDistance:r,dragOut:a}=i.config.move;if(!a||!r)return;const o=i.shrinkCanvasBounds,{x:n,y:h}=o,p=e.BoundsHelper.maxX(o),g=e.BoundsHelper.maxY(o),d=t.x<n?r:p<t.x?-r:0,v=t.y<h?r:g<t.y?-r:0;let c=0,l=0;this.autoMoveTimer=setInterval((()=>{c+=d,l+=v,e.PointHelper.move(s,d,v),e.PointHelper.move(this.dragData,d,v),i.move(Object.assign(Object.assign({},t),{moveX:d,moveY:v,totalX:c,totalY:l})),i.pointerMoveReal(t)}),10)}autoMoveCancel(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)}destroy(){this.dragReset()}}const _=e.Debug.get("emit");const x=["move","zoom","rotate","key"];function P(t,e,i,s,r){if(x.some((t=>e.startsWith(t)))&&t.__.hitChildren&&!O(t,r)){let a;for(let o=0,n=t.children.length;o<n;o++)a=t.children[o],!i.path.has(a)&&a.__.hittable&&y(a,e,i,s,r)}}function y(t,i,s,r,a){if(t.destroyed)return!0;if(t.__.hitSelf&&t.hasEvent(i,r)&&!O(t,a)){s.phase=r?1:t===s.target?2:3;const a=e.EventCreator.get(i,s);if(t.emitEvent(a,r),a.isStop)return!0}return!1}function O(t,e){return e&&e.has(t)}const R={getData(t){const i=t[0],s=t[1],r=e.PointHelper.getCenter(i.from,s.from),a=e.PointHelper.getCenter(i.to,s.to),o={x:a.x-r.x,y:a.y-r.y},n=e.PointHelper.getDistance(i.from,s.from);return{move:o,scale:e.PointHelper.getDistance(i.to,s.to)/n,angle:e.PointHelper.getRotation(i.from,s.from,i.to,s.to),center:a}}},T={wheel:{zoomMode:!1,zoomSpeed:.5,moveSpeed:.5,rotateSpeed:.5,delta:{x:20,y:8},preventDefault:!0},pointer:{hitRadius:5,through:!1,tapTime:120,longPressTime:800,transformTime:500,dragHover:!0,dragDistance:2,swipeDistance:20,ignoreMove:!1,preventDefaultMenu:!0},cursor:{}},{pathHasEventType:w,getMoveEventData:L,getZoomEventData:C,getRotateEventData:b}=c;class M{static set(t,e){this.custom[t]=e}static get(t){return this.custom[t]}}M.custom={};class A extends e.CanvasManager{constructor(){super(...arguments),this.pathTypeList=new e.LeafList,this.imageTypeList=new e.LeafList}getImageType(t,i){return this.imageTypeList.add(t),e.Creator.hitCanvas(i)}getPathType(t){return this.pathTypeList.add(t),e.Creator.hitCanvas()}clearImageType(){this.__clearLeafList(this.imageTypeList)}clearPathType(){this.__clearLeafList(this.pathTypeList)}__clearLeafList(t){t.length&&(t.forEach((t=>{t.__hitCanvas&&(t.__hitCanvas.destroy(),t.__hitCanvas=null)})),t.reset())}clear(){this.clearPathType(),this.clearImageType()}}const{toInnerRadiusPointOf:H,copy:S,setRadius:B}=t.PointHelper,I={};t.Leaf.prototype.__hitWorld=function(e){return!this.__layout.hitCanvasChanged&&this.__hitCanvas||(this.__updateHitCanvas(),this.__layout.hitCanvasChanged=!1),this.__.hitRadius&&(S(I,e),B(e=I,this.__.hitRadius)),H(e,this.__world,I),!(!this.__.hitBox||!t.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds,I))||this.__hit(I)},t.UI.prototype.__updateHitCanvas=function(){this.__hitCanvas||(this.__hitCanvas=this.leafer.hitCanvasManager.getPathType(this));const t=this.__hitCanvas;this.__drawHitPath(t),t.setStrokeOptions(this.__)},t.UI.prototype.__hit=function(t){"miniapp"===e.Platform.name&&this.__drawHitPath(this.__hitCanvas);const{fill:i,hitFill:s,windingRule:r}=this.__,a=i&&"path"===s||"all"===s,o=this.__hitFill(t,r);if(a&&o)return!0;const{stroke:n,hitStroke:h,__strokeWidth:p,strokeAlign:g}=this.__,d=n&&"path"===h||"all"===h,v=2*t.radiusX;let c=v;if(d)switch(g){case"inside":if(c+=2*p,!a&&o&&this.__hitStroke(t,c))return!0;c=v;break;case"center":c+=p;break;case"outside":if(c+=2*p,!a){if(!o&&this.__hitStroke(t,c))return!0;c=v}}return!!c&&this.__hitStroke(t,c)};const U=new t.UI;t.Rect.prototype.__updateHitCanvas=function(){(this.stroke||this.cornerRadius)&&U.__updateHitCanvas.call(this)},t.Rect.prototype.__hitFill=function(e,i){return this.__hitCanvas?U.__hitFill.call(this,e,i):t.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds,e)},t.UI.prototype.find=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!1,e):[]},t.UI.prototype.findOne=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!0,e):null},t.Group.prototype.pick=function(t,e){return this.__layout.update(),e||(e={}),this.leafer?this.leafer.selector.getByPoint(t,e.hitRadius||0,Object.assign(Object.assign({},e),{target:this})):null},exports.Cursor=M,exports.HitCanvasManager=A,exports.InteractionBase=class{get dragging(){return this.dragger.dragging}get isDragEmpty(){return this.config.move.dragEmpty&&this.hoverData&&this.hoverData.path.list[0].isLeafer&&(!this.downData||this.downData.path.list[0].isLeafer)}get isHoldRightKey(){return this.config.move.holdRightKey&&this.downData&&a.right(this.downData)}get moveMode(){return this.config.move.drag||this.config.move.holdSpaceKey&&r.isHoldSpaceKey()||this.downData&&(this.config.move.holdMiddleKey&&a.middle(this.downData)||this.isHoldRightKey&&this.dragger.moving)||this.isDragEmpty}get hitRadius(){return this.config.pointer.hitRadius}constructor(t,i,s,r){this.config=T,this.tapCount=0,this.downKeyMap={},this.target=t,this.canvas=i,this.selector=s,this.defaultPath=new e.LeafList(t),this.transformer=new v(this),this.dragger=new f(this),r&&(this.config=e.DataHelper.default(r,this.config)),this.__listenEvents()}start(){this.running=!0}stop(){this.running=!1}receive(t){}pointerDown(t,e){t||(t=this.hoverData),t&&(a.defaultLeft(t),this.updateDownData(t),e&&(t.path=this.defaultPath),this.emit(exports.PointerEvent.BEFORE_DOWN,t),this.emit(exports.PointerEvent.DOWN,t),this.downTime=Date.now(),this.dragger.setDragData(t),a.left(t)?(this.tapWait(),this.longPressWait(t)):a.right(t)&&(this.waitMenuTap=!0),this.updateCursor(t))}pointerMove(t){if(t||(t=this.hoverData),!t)return;this.downData&&a.defaultLeft(t);const e=this.canvas.bounds.hitPoint(t);(e||this.downData)&&(e&&!this.downData&&a.left(t)&&this.pointerDown(t,!0),this.pointerMoveReal(t),this.dragger.checkDragOut(t))}pointerMoveReal(t){if(this.emit(exports.PointerEvent.BEFORE_MOVE,t,this.defaultPath),this.downData){const i=e.PointHelper.getDistance(this.downData,t)>this.config.pointer.dragDistance;i&&(this.waitTap&&this.pointerWaitCancel(),this.waitMenuTap=!1),this.dragger.checkDrag(t,i)}this.dragger.moving||(this.updateHoverData(t),this.emit(exports.PointerEvent.MOVE,t),this.pointerOverOrOut(t),this.pointerEnterOrLeave(t),this.dragger.dragging&&(this.dragger.dragOverOrOut(t),this.dragger.dragEnterOrLeave(t))),this.updateCursor(this.downData||t)}pointerUp(t){t||(t=this.downData),this.downData&&(a.defaultLeft(t),this.findPath(t),this.emit(exports.PointerEvent.BEFORE_UP,t),this.emit(exports.PointerEvent.UP,t),this.oldDownData&&this.emit(exports.PointerEvent.UP,this.oldDownData,void 0,t.path),this.emit(exports.PointerEvent.UP,this.downData,void 0,t.path),this.touchLeave(t),this.tap(t),this.menuTap(t),this.dragger.dragEnd(t),this.downData=this.oldDownData=null,this.updateCursor(t))}pointerCancel(){this.pointerUp(this.dragger.dragData)}multiTouch(t,e){const{move:i,angle:s,scale:r,center:a}=R.getData(e);this.rotate(b(a,s,t)),this.zoom(C(a,r,t)),this.move(L(a,i,t))}menu(t){this.findPath(t),this.emit(exports.PointerEvent.MENU,t)}menuTap(t){this.waitMenuTap&&this.emit(exports.PointerEvent.MENU_TAP,t)}move(t){this.transformer.move(t)}zoom(t){this.transformer.zoom(t)}rotate(t){this.transformer.rotate(t)}transformEnd(){this.transformer.transformEnd()}keyDown(t){const{code:e}=t;this.downKeyMap[e]||(this.downKeyMap[e]=!0,r.setDownCode(e),this.emit(exports.KeyEvent.HOLD,t,this.defaultPath),this.moveMode&&this.updateCursor()),this.emit(exports.KeyEvent.DOWN,t,this.defaultPath)}keyUp(t){const{code:e}=t;this.downKeyMap[e]=!1,r.setUpCode(e),this.emit(exports.KeyEvent.UP,t,this.defaultPath),"grab"===this.cursor&&this.updateCursor()}pointerOverOrOut(t){if(this.dragger.moving)return;if(this.dragging&&!this.config.pointer.dragHover)return;const{path:e}=t;this.overPath?e.indexAt(0)!==this.overPath.indexAt(0)&&(this.emit(exports.PointerEvent.OUT,t,this.overPath),this.emit(exports.PointerEvent.OVER,t,e)):this.emit(exports.PointerEvent.OVER,t,e),this.overPath=e}pointerEnterOrLeave(t){if(this.dragger.moving)return;if(this.dragging&&!this.config.pointer.dragHover)return;const{path:e}=t;this.emit(exports.PointerEvent.LEAVE,t,this.enterPath,e),this.emit(exports.PointerEvent.ENTER,t,e,this.enterPath),this.enterPath=e}touchLeave(t){"touch"===t.pointerType&&this.enterPath&&(this.emit(exports.PointerEvent.LEAVE,t),this.dragger.dragging&&this.emit(exports.DropEvent.LEAVE,t))}tap(t){const{pointer:e}=this.config,i=this.longTap(t);if(!e.tapMore&&i)return;if(!this.waitTap)return;e.tapMore&&this.emitTap(t);const s=Date.now()-this.downTime,r=[exports.PointerEvent.DOUBLE_TAP,exports.PointerEvent.DOUBLE_CLICK].some((e=>w(t.path,e)));s<e.tapTime+50&&r?(this.tapCount++,2===this.tapCount?(this.tapWaitCancel(),this.emitDoubleTap(t)):(clearTimeout(this.tapTimer),this.tapTimer=setTimeout((()=>{e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}),e.tapTime))):e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}findPath(t,e){const{hitRadius:i,through:s}=this.config.pointer,r=this.selector.getByPoint(t,i,e||{through:s});return r.throughPath&&(t.throughPath=r.throughPath),t.path=r.path,r.path}isDrag(t){return this.dragger.getList().has(t)}updateDownData(t,e){const{downData:i}=this;!t&&i&&(t=Object.assign({},i)),t&&(this.oldDownData=i,this.findPath(t,e),this.downData=t)}updateHoverData(t){t||(t=this.hoverData),t&&(this.findPath(t,{exclude:this.dragger.getList(),name:exports.PointerEvent.MOVE}),this.hoverData=t)}updateCursor(t){if(this.config.cursor.stop)return;if(t||(this.updateHoverData(),t=this.downData||this.hoverData),this.dragger.moving)return this.setCursor("grabbing");if(this.moveMode)return this.setCursor(this.downData?"grabbing":"grab");if(!t)return;let e,i;const{path:s}=t;for(let t=0,r=s.length;t<r&&(e=s.list[t],i=e.cursor,!i);t++);this.setCursor(i)}setCursor(t){this.cursor=t}emitTap(t){this.emit(exports.PointerEvent.TAP,t),this.emit(exports.PointerEvent.CLICK,t)}emitDoubleTap(t){this.emit(exports.PointerEvent.DOUBLE_TAP,t),this.emit(exports.PointerEvent.DOUBLE_CLICK,t)}pointerWaitCancel(){this.tapWaitCancel(),this.longPressWaitCancel()}tapWait(){clearTimeout(this.tapTimer),this.waitTap=!0}tapWaitCancel(){clearTimeout(this.tapTimer),this.waitTap=!1,this.tapCount=0}longPressWait(t){clearTimeout(this.longPressTimer),this.longPressTimer=setTimeout((()=>{this.longPressed=!0,this.emit(exports.PointerEvent.LONG_PRESS,t)}),this.config.pointer.longPressTime)}longTap(t){let e;return this.longPressed&&(this.emit(exports.PointerEvent.LONG_TAP,t),w(t.path,exports.PointerEvent.LONG_TAP)&&(e=!0)),this.longPressWaitCancel(),e}longPressWaitCancel(){clearTimeout(this.longPressTimer),this.longPressed=!1}__onResize(){this.shrinkCanvasBounds=new e.Bounds(this.canvas.bounds),this.shrinkCanvasBounds.spread(-2)}__listenEvents(){const{target:t}=this;this.__eventIds=[t.on_(e.ResizeEvent.RESIZE,this.__onResize,this)],t.once(e.LeaferEvent.READY,(()=>this.__onResize()))}__removeListenEvents(){this.target.off_(this.__eventIds),this.__eventIds.length=0}emit(t,e,i,s){this.running&&function(t,e,i,s){if(!i&&!e.path)return;let r;e.type=t,i?e=Object.assign(Object.assign({},e),{path:i}):i=e.path,e.target=i.indexAt(0);try{for(let a=i.length-1;a>-1;a--){if(r=i.list[a],y(r,t,e,!0,s))return;r.isApp&&P(r,t,e,!0,s)}for(let a=0,o=i.length;a<o;a++)if(r=i.list[a],r.isApp&&P(r,t,e,!1,s),y(r,t,e,!1,s))return}catch(t){_.error(t)}}(t,e,i,s)}destroy(){this.__eventIds.length&&(this.stop(),this.__removeListenEvents(),this.dragger.destroy(),this.transformer.destroy(),this.downData=this.overPath=this.enterPath=null)}},exports.InteractionHelper=c,exports.Keyboard=r,exports.LeaferTypeCreator=p,exports.MultiTouchHelper=R,exports.PointerButton=a,exports.UIEvent=o,Object.keys(t).forEach((function(e){"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:function(){return t[e]}})}));
1
+ "use strict";var t=require("@leafer-ui/draw"),e=require("@leafer/core");function i(t,e,i,s){var r,a=arguments.length,o=a<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,i,s);else for(var n=t.length-1;n>=0;n--)(r=t[n])&&(o=(a<3?r(o):a>3?r(e,i,o):r(e,i))||o);return a>3&&o&&Object.defineProperty(e,i,o),o}"function"==typeof SuppressedError&&SuppressedError,exports.App=class extends t.Leafer{get __tag(){return"App"}get isApp(){return!0}constructor(t,e){super(t,e)}init(t,i){if(super.init(t,i),t){const{ground:i,tree:s,sky:r,editor:a}=t;i&&(this.ground=this.addLeafer(i)),(s||a)&&(this.tree=this.addLeafer(s)),(r||a)&&(this.sky=this.addLeafer(r||{type:"draw",usePartRender:!1})),a&&(this.editor=e.Creator.editor(a),this.sky.add(this.editor))}}__setApp(){const{canvas:t}=this,{realCanvas:i,view:s}=this.config;i||s===this.canvas.view||!t.parentView?this.realCanvas=!0:t.unrealCanvas(),this.leafer=this,this.watcher.disable(),this.layouter.disable(),this.__eventIds.push(this.on_(e.PropertyEvent.CHANGE,this.__onPropertyChange,this))}start(){super.start(),this.children.forEach((t=>t.start()))}stop(){this.children.forEach((t=>t.stop())),super.stop()}unlockLayout(){super.unlockLayout(),this.children.forEach((t=>t.unlockLayout()))}lockLayout(){super.lockLayout(),this.children.forEach((t=>t.lockLayout()))}forceRender(t){this.children.forEach((e=>e.forceRender(t)))}addLeafer(e){const i=new t.Leafer(e);return this.add(i),i}add(t){if(!t.view){if(this.realCanvas&&!this.canvas.bounds)return void setTimeout((()=>this.add(t)),10);t.init(this.__getChildConfig(t.userConfig),this)}super.add(t),this.__listenChildEvents(t)}__onPropertyChange(){e.Debug.showHitView&&this.children.forEach((t=>t.forceUpdate("surface")))}__onCreated(){this.created=this.children.every((t=>t.created))}__onReady(){this.children.every((t=>t.ready))&&super.__onReady()}__onViewReady(){this.children.every((t=>t.viewReady))&&super.__onViewReady()}__onChildRenderEnd(t){this.renderer.addBlock(t.renderBounds),this.viewReady&&this.renderer.update()}__render(t,e){this.children.forEach((e=>t.copyWorld(e.canvas)))}__onResize(t){this.children.forEach((e=>e.resize(t))),super.__onResize(t)}__checkUpdateLayout(){this.children.forEach((t=>t.__layout.update()))}__getChildConfig(t){let i=Object.assign({},this.config);return i.hittable=i.realCanvas=void 0,t&&e.DataHelper.assign(i,t),this.autoLayout&&e.DataHelper.copyAttrs(i,this,e.canvasSizeAttrs),i.view=this.realCanvas?void 0:this.view,i.fill=void 0,i}__listenChildEvents(t){t.once(e.LayoutEvent.END,(()=>this.__onReady())),t.once(e.RenderEvent.START,(()=>this.__onCreated())),t.once(e.RenderEvent.END,(()=>this.__onViewReady())),this.realCanvas&&this.__eventIds.push(t.on_(e.RenderEvent.END,this.__onChildRenderEnd,this))}},exports.App=i([e.registerUI()],exports.App);const s={},r={isHoldSpaceKey:()=>r.isHold("Space"),isHold:t=>s[t],setDownCode(t){s[t]||(s[t]=!0)},setUpCode(t){s[t]=!1}},a={LEFT:1,RIGHT:2,MIDDLE:4,defaultLeft(t){t.buttons||(t.buttons=1)},left:t=>1===t.buttons,right:t=>2===t.buttons,middle:t=>4===t.buttons};class o extends e.Event{get spaceKey(){return r.isHoldSpaceKey()}get left(){return a.left(this)}get right(){return a.right(this)}get middle(){return a.middle(this)}constructor(t){super(t.type),this.bubbles=!0,Object.assign(this,t)}getPage(){return this.current.getPagePoint(this)}getInner(t){return t||(t=this.current),t.getInnerPoint(this)}getLocal(t){return t||(t=this.current),t.getLocalPoint(this)}static changeName(t,i){e.EventCreator.changeName(t,i)}}exports.PointerEvent=class extends o{},exports.PointerEvent.POINTER="pointer",exports.PointerEvent.BEFORE_DOWN="pointer.before_down",exports.PointerEvent.BEFORE_MOVE="pointer.before_move",exports.PointerEvent.BEFORE_UP="pointer.before_up",exports.PointerEvent.DOWN="pointer.down",exports.PointerEvent.MOVE="pointer.move",exports.PointerEvent.UP="pointer.up",exports.PointerEvent.OVER="pointer.over",exports.PointerEvent.OUT="pointer.out",exports.PointerEvent.ENTER="pointer.enter",exports.PointerEvent.LEAVE="pointer.leave",exports.PointerEvent.TAP="tap",exports.PointerEvent.DOUBLE_TAP="double_tap",exports.PointerEvent.CLICK="click",exports.PointerEvent.DOUBLE_CLICK="double_click",exports.PointerEvent.LONG_PRESS="long_press",exports.PointerEvent.LONG_TAP="long_tap",exports.PointerEvent.MENU="pointer.menu",exports.PointerEvent.MENU_TAP="pointer.menu_tap",exports.PointerEvent=i([e.registerUIEvent()],exports.PointerEvent);const n={};exports.DragEvent=class extends exports.PointerEvent{static setList(t){this.list=t instanceof e.LeafList?t:new e.LeafList(t)}static setData(t){this.data=t}getPageMove(t){return this.assignMove(t),this.current.getPagePoint(n,null,!0)}getInnerMove(t,e){return t||(t=this.current),this.assignMove(e),t.getInnerPoint(n,null,!0)}getLocalMove(t,e){return t||(t=this.current),this.assignMove(e),t.getLocalPoint(n,null,!0)}getPageTotal(){return this.getPageMove(!0)}getInnerTotal(t){return this.getInnerMove(t,!0)}getLocalTotal(t){return this.getLocalMove(t,!0)}assignMove(t){n.x=t?this.totalX:this.moveX,n.y=t?this.totalY:this.moveY}},exports.DragEvent.BEFORE_DRAG="drag.before_drag",exports.DragEvent.START="drag.start",exports.DragEvent.DRAG="drag",exports.DragEvent.END="drag.end",exports.DragEvent.OVER="drag.over",exports.DragEvent.OUT="drag.out",exports.DragEvent.ENTER="drag.enter",exports.DragEvent.LEAVE="drag.leave",exports.DragEvent=i([e.registerUIEvent()],exports.DragEvent),exports.DropEvent=class extends exports.PointerEvent{static setList(t){exports.DragEvent.setList(t)}static setData(t){exports.DragEvent.setData(t)}},exports.DropEvent.DROP="drop",exports.DropEvent=i([e.registerUIEvent()],exports.DropEvent),exports.MoveEvent=class extends exports.DragEvent{},exports.MoveEvent.BEFORE_MOVE="move.before_move",exports.MoveEvent.START="move.start",exports.MoveEvent.MOVE="move",exports.MoveEvent.END="move.end",exports.MoveEvent=i([e.registerUIEvent()],exports.MoveEvent),exports.RotateEvent=class extends o{},exports.RotateEvent.BEFORE_ROTATE="rotate.before_rotate",exports.RotateEvent.START="rotate.start",exports.RotateEvent.ROTATE="rotate",exports.RotateEvent.END="rotate.end",exports.RotateEvent=i([e.registerUIEvent()],exports.RotateEvent),exports.SwipeEvent=class extends exports.DragEvent{},exports.SwipeEvent.SWIPE="swipe",exports.SwipeEvent.LEFT="swipe.left",exports.SwipeEvent.RIGHT="swipe.right",exports.SwipeEvent.UP="swipe.up",exports.SwipeEvent.DOWN="swipe.down",exports.SwipeEvent=i([e.registerUIEvent()],exports.SwipeEvent),exports.ZoomEvent=class extends o{},exports.ZoomEvent.BEFORE_ZOOM="zoom.before_zoom",exports.ZoomEvent.START="zoom.start",exports.ZoomEvent.ZOOM="zoom",exports.ZoomEvent.END="zoom.end",exports.ZoomEvent=i([e.registerUIEvent()],exports.ZoomEvent),exports.KeyEvent=class extends o{},exports.KeyEvent.DOWN="key.down",exports.KeyEvent.HOLD="key.hold",exports.KeyEvent.UP="key.up",exports.KeyEvent=i([e.registerUIEvent()],exports.KeyEvent);const h=e.Debug.get("LeaferTypeCreator"),p={list:{},register(t,e){g[t]?h.repeat(t):g[t]=e},run(t,e){const i=g[t];i?i(e):h.error("no",t)}},{list:g,register:d}=p;d("draw",(function(t){const{config:e}=t;e.move.dragOut=!1})),d("design",(function(t){t.isApp||t.__eventIds.push(t.on_(exports.MoveEvent.BEFORE_MOVE,(e=>{let{moveX:i,moveY:s}=e;t.config.move.scroll&&(Math.abs(i)>Math.abs(s)?s=0:i=0),t.zoomLayer.move(i,s)})),t.on_(exports.ZoomEvent.BEFORE_ZOOM,(i=>{const{zoomLayer:s}=t,r=t.validScale(i.scale);1!==r&&(e.PointHelper.scaleOf(s,i,r),s.scale=s.__.scaleX*r)})))})),t.Leafer.prototype.initType=function(t){p.run(t,this)};class v{constructor(t){this.interaction=t}move(t){const{interaction:e}=this;if(!this.moveData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.moveData=Object.assign(Object.assign({},t),{moveX:0,moveY:0}),e.cancelHover(),e.emit(exports.MoveEvent.START,this.moveData)}t.path=this.moveData.path,e.emit(exports.MoveEvent.BEFORE_MOVE,t),e.emit(exports.MoveEvent.MOVE,t),this.transformEndWait()}zoom(t){const{interaction:e}=this;if(!this.zoomData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.zoomData=Object.assign(Object.assign({},t),{scale:1}),e.cancelHover(),e.emit(exports.ZoomEvent.START,this.zoomData)}t.path=this.zoomData.path,e.emit(exports.ZoomEvent.BEFORE_ZOOM,t),e.emit(exports.ZoomEvent.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:e}=this;if(!this.rotateData){const{path:i}=e.selector.getByPoint(t,e.hitRadius);t.path=i,this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),e.cancelHover(),e.emit(exports.RotateEvent.START,this.rotateData)}t.path=this.rotateData.path,e.emit(exports.RotateEvent.BEFORE_ROTATE,t),e.emit(exports.RotateEvent.ROTATE,t),this.transformEndWait()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout((()=>{this.transformEnd()}),this.interaction.config.pointer.transformTime)}transformEnd(){this.moveEnd(),this.zoomEnd(),this.rotateEnd()}moveEnd(){this.moveData&&(this.interaction.emit(exports.MoveEvent.END,this.moveData),this.moveData=null)}zoomEnd(){this.zoomData&&(this.interaction.emit(exports.ZoomEvent.END,this.zoomData),this.zoomData=null)}rotateEnd(){this.rotateData&&(this.interaction.emit(exports.RotateEvent.END,this.rotateData),this.rotateData=null)}destroy(){this.zoomData=this.moveData=this.rotateData=null}}const c={getMoveEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,moveX:e.x,moveY:e.y}),getRotateEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,rotation:e}),getZoomEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:t.x,y:t.y,scale:e}),getDragEventData:(t,e,i)=>Object.assign(Object.assign({},i),{x:i.x,y:i.y,moveX:i.x-e.x,moveY:i.y-e.y,totalX:i.x-t.x,totalY:i.y-t.y}),getDropEventData:(t,e,i)=>Object.assign(Object.assign({},t),{list:e,data:i}),getSwipeDirection:t=>t<-45&&t>-135?exports.SwipeEvent.UP:t>45&&t<135?exports.SwipeEvent.DOWN:t<=45&&t>=-45?exports.SwipeEvent.RIGHT:exports.SwipeEvent.LEFT,getSwipeEventData:(t,i,s)=>Object.assign(Object.assign({},s),{moveX:i.moveX,moveY:i.moveY,totalX:s.x-t.x,totalY:s.y-t.y,type:l.getSwipeDirection(e.PointHelper.getAngle(t,s))}),getBase(t){const e=1===t.button?4:t.button;return{altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,buttons:void 0===t.buttons?1:0===t.buttons?e:t.buttons,origin:t}},pathHasEventType(t,e){const{list:i}=t;for(let t=0,s=i.length;t<s;t++)if(i[t].hasEvent(e))return!0;return!1},filterPathByEventType(t,i){const s=new e.LeafList,{list:r}=t;for(let t=0,e=r.length;t<e;t++)r[t].hasEvent(i)&&s.add(r[t]);return s}},l=c,E=new e.LeafList,{getDragEventData:u,getDropEventData:m,getSwipeEventData:D}=c;class f{constructor(t){this.interaction=t}setDragData(t){this.animateWait&&this.dragEndReal(),this.downData=this.interaction.downData,this.dragData=u(t,t,t),this.canAnimate=this.canDragOut=!0}getList(){const{proxy:t}=this.interaction.selector;return!this.dragging||t&&t.list.length?E:exports.DragEvent.list||this.dragableList||E}checkDrag(t,e){const{interaction:i}=this;if(this.moving&&t.buttons<1)return this.canAnimate=!1,void i.pointerCancel();!this.moving&&e&&(this.moving=i.moveMode||i.isHoldRightKey)&&i.emit(exports.MoveEvent.START,this.dragData),this.moving||this.dragStart(t,e),this.drag(t)}dragStart(t,e){this.dragging||(this.dragging=e&&a.left(t),this.dragging&&(this.interaction.emit(exports.DragEvent.START,this.dragData),this.getDragableList(this.dragData.path)))}getDragableList(t){let i;for(let s=0,r=t.length;s<r;s++)if(i=t.list[s],(i.__.draggable||i.__.editable)&&i.__.hitSelf&&!i.__.locked){this.dragableList=new e.LeafList(i);break}}drag(t){const{interaction:e,dragData:i,downData:s}=this,{path:r,throughPath:a}=s;this.dragData=u(s,i,t),a&&(this.dragData.throughPath=a),this.dragData.path=r,this.moving?(e.emit(exports.MoveEvent.BEFORE_MOVE,this.dragData),e.emit(exports.MoveEvent.MOVE,this.dragData)):this.dragging&&(this.dragReal(),e.emit(exports.DragEvent.BEFORE_DRAG,this.dragData),e.emit(exports.DragEvent.DRAG,this.dragData))}dragReal(){const{running:t}=this.interaction,e=this.getList();if(e.length&&t){const{moveX:t,moveY:i}=this.dragData;e.forEach((e=>e.moveWorld(t,i)))}}dragOverOrOut(t){const{interaction:e}=this,{dragOverPath:i}=this,{path:s}=t;this.dragOverPath=s,i?s.indexAt(0)!==i.indexAt(0)&&(e.emit(exports.DragEvent.OUT,t,i),e.emit(exports.DragEvent.OVER,t,s)):e.emit(exports.DragEvent.OVER,t,s)}dragEnterOrLeave(t){const{interaction:e}=this,{dragEnterPath:i}=this,{path:s}=t;e.emit(exports.DragEvent.LEAVE,t,i,s),e.emit(exports.DragEvent.ENTER,t,s,i),this.dragEnterPath=s}dragEnd(t,i){if(!this.dragData)return;const{moveX:s,moveY:r}=this.dragData;this.interaction.config.move.dragAnimate&&this.canAnimate&&this.moving&&(Math.abs(s)>1||Math.abs(r)>1)?(t=Object.assign({},t),i=.9*(i||("touch"===t.pointerType?2:1)),e.PointHelper.move(t,s*i,r*i),this.drag(t),this.animate((()=>{this.dragEnd(t,1)}))):this.dragEndReal(t)}dragEndReal(t){const{interaction:e,downData:i,dragData:s}=this;t||(t=s);const{path:r,throughPath:a}=i,o=u(i,t,t);a&&(o.throughPath=a),o.path=r,this.moving&&e.emit(exports.MoveEvent.END,o),this.dragging&&(e.emit(exports.DragEvent.END,o),this.swipe(t,o),this.drop(t)),this.autoMoveCancel(),this.dragReset(),this.animate(null,"off")}animate(t,e){const i=t||this.animateWait;i&&this.interaction.target.nextRender(i,null,e),this.animateWait=t}swipe(t,i){const{interaction:s,downData:r}=this;if(e.PointHelper.getDistance(r,t)>s.config.pointer.swipeDistance){const t=D(r,this.dragData,i);this.interaction.emit(t.type,t)}}drop(t){const e=m(t,this.getList(),exports.DragEvent.data);e.path=this.dragEnterPath,this.interaction.emit(exports.DropEvent.DROP,e),this.interaction.emit(exports.DragEvent.LEAVE,t,this.dragEnterPath)}dragReset(){exports.DragEvent.list=exports.DragEvent.data=this.dragableList=this.dragData=this.downData=this.dragOverPath=this.dragEnterPath=null,this.dragging=this.moving=!1}checkDragOut(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)}autoMoveOnDragOut(t){const{interaction:i,downData:s,canDragOut:r}=this,{autoDistance:a,dragOut:o}=i.config.move;if(!o||!r||!a)return;const n=i.shrinkCanvasBounds,{x:h,y:p}=n,g=e.BoundsHelper.maxX(n),d=e.BoundsHelper.maxY(n),v=t.x<h?a:g<t.x?-a:0,c=t.y<p?a:d<t.y?-a:0;let l=0,E=0;this.autoMoveTimer=setInterval((()=>{l+=v,E+=c,e.PointHelper.move(s,v,c),e.PointHelper.move(this.dragData,v,c),i.move(Object.assign(Object.assign({},t),{moveX:v,moveY:c,totalX:l,totalY:E})),i.pointerMoveReal(t)}),10)}autoMoveCancel(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)}destroy(){this.dragReset()}}const _=e.Debug.get("emit");const x=["move","zoom","rotate","key"];function P(t,e,i,s,r){if(x.some((t=>e.startsWith(t)))&&t.__.hitChildren&&!O(t,r)){let a;for(let o=0,n=t.children.length;o<n;o++)a=t.children[o],!i.path.has(a)&&a.__.hittable&&y(a,e,i,s,r)}}function y(i,s,r,a,o){if(i.destroyed)return!0;if(i.__.hitSelf&&!O(i,o)&&(t.State.updateEventStyle&&t.State.updateEventStyle(i,s),i.hasEvent(s,a))){r.phase=a?1:i===r.target?2:3;const t=e.EventCreator.get(s,r);if(i.emitEvent(t,a),t.isStop)return!0}return!1}function O(t,e){return e&&e.has(t)}const R={getData(t){const i=t[0],s=t[1],r=e.PointHelper.getCenter(i.from,s.from),a=e.PointHelper.getCenter(i.to,s.to),o={x:a.x-r.x,y:a.y-r.y},n=e.PointHelper.getDistance(i.from,s.from);return{move:o,scale:e.PointHelper.getDistance(i.to,s.to)/n,angle:e.PointHelper.getRotation(i.from,s.from,i.to,s.to),center:a}}},T={wheel:{zoomSpeed:.5,moveSpeed:.5,rotateSpeed:.5,delta:{x:20,y:8},preventDefault:!0},pointer:{hitRadius:5,tapTime:120,longPressTime:800,transformTime:500,dragHover:!0,dragDistance:2,swipeDistance:20,preventDefaultMenu:!0},cursor:{}},{pathHasEventType:w,getMoveEventData:L,getZoomEventData:C,getRotateEventData:b}=c;class M{static set(t,e){this.custom[t]=e}static get(t){return this.custom[t]}}M.custom={};class H extends e.CanvasManager{constructor(){super(...arguments),this.pathTypeList=new e.LeafList,this.imageTypeList=new e.LeafList}getImageType(t,i){return this.imageTypeList.add(t),e.Creator.hitCanvas(i)}getPathType(t){return this.pathTypeList.add(t),e.Creator.hitCanvas()}clearImageType(){this.__clearLeafList(this.imageTypeList)}clearPathType(){this.__clearLeafList(this.pathTypeList)}__clearLeafList(t){t.length&&(t.forEach((t=>{t.__hitCanvas&&(t.__hitCanvas.destroy(),t.__hitCanvas=null)})),t.reset())}clear(){this.clearPathType(),this.clearImageType()}}const{toInnerRadiusPointOf:A,copy:S,setRadius:B}=e.PointHelper,I={};e.Leaf.prototype.__hitWorld=function(t){return!this.__layout.hitCanvasChanged&&this.__hitCanvas||(this.__updateHitCanvas(),this.__layout.hitCanvasChanged=!1),this.__.hitRadius&&(S(I,t),B(t=I,this.__.hitRadius)),A(t,this.__world,I),!(!this.__.hitBox||!e.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds,I))||this.__hit(I)},t.UI.prototype.__updateHitCanvas=function(){this.__hitCanvas||(this.__hitCanvas=this.leafer.hitCanvasManager.getPathType(this));const t=this.__hitCanvas;this.__drawHitPath(t),t.setStrokeOptions(this.__)},t.UI.prototype.__hit=function(t){"miniapp"===e.Platform.name&&this.__drawHitPath(this.__hitCanvas);const{fill:i,hitFill:s,windingRule:r}=this.__,a=i&&"path"===s||"all"===s,o=this.__hitFill(t,r);if(a&&o)return!0;const{stroke:n,hitStroke:h,__strokeWidth:p,strokeAlign:g}=this.__,d=n&&"path"===h||"all"===h,v=2*t.radiusX;let c=v;if(d)switch(g){case"inside":if(c+=2*p,!a&&o&&this.__hitStroke(t,c))return!0;c=v;break;case"center":c+=p;break;case"outside":if(c+=2*p,!a){if(!o&&this.__hitStroke(t,c))return!0;c=v}}return!!c&&this.__hitStroke(t,c)};const U=new t.UI;t.Rect.prototype.__updateHitCanvas=function(){(this.stroke||this.cornerRadius)&&U.__updateHitCanvas.call(this)},t.Rect.prototype.__hitFill=function(t,i){return this.__hitCanvas?U.__hitFill.call(this,t,i):e.BoundsHelper.hitRadiusPoint(this.__layout.boxBounds,t)},t.UI.prototype.find=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!1,e):[]},t.UI.prototype.findOne=function(t,e){return this.leafer?this.leafer.selector.getBy(t,this,!0,e):null},t.Group.prototype.pick=function(t,e){return this.__layout.update(),e||(e={}),this.leafer?this.leafer.selector.getByPoint(t,e.hitRadius||0,Object.assign(Object.assign({},e),{target:this})):null},exports.Cursor=M,exports.HitCanvasManager=H,exports.InteractionBase=class{get dragging(){return this.dragger.dragging}get isDragEmpty(){return this.config.move.dragEmpty&&this.hoverData&&this.hoverData.path.list[0].isLeafer&&(!this.downData||this.downData.path.list[0].isLeafer)}get isHoldRightKey(){return this.config.move.holdRightKey&&this.downData&&a.right(this.downData)}get moveMode(){return this.config.move.drag||this.config.move.holdSpaceKey&&r.isHoldSpaceKey()||this.downData&&(this.config.move.holdMiddleKey&&a.middle(this.downData)||this.isHoldRightKey&&this.dragger.moving)||this.isDragEmpty}get hitRadius(){return this.config.pointer.hitRadius}constructor(t,i,s,r){this.config=T,this.tapCount=0,this.downKeyMap={},this.target=t,this.canvas=i,this.selector=s,this.defaultPath=new e.LeafList(t),this.transformer=new v(this),this.dragger=new f(this),r&&(this.config=e.DataHelper.default(r,this.config)),this.__listenEvents()}start(){this.running=!0}stop(){this.running=!1}receive(t){}pointerDown(t,e){t||(t=this.hoverData),t&&(a.defaultLeft(t),this.updateDownData(t),e&&(t.path=this.defaultPath),this.downTime=Date.now(),(this.downed=!this.moveMode)&&(this.emit(exports.PointerEvent.BEFORE_DOWN,t),this.emit(exports.PointerEvent.DOWN,t),a.left(t)?(this.tapWait(),this.longPressWait(t)):a.right(t)&&(this.waitMenuTap=!0)),this.dragger.setDragData(t),this.updateCursor(t))}pointerMove(t){if(t||(t=this.hoverData),!t)return;const{downData:e}=this;e&&a.defaultLeft(t);const i=this.canvas.bounds.hitPoint(t);(i||e)&&(i&&!e&&a.left(t)&&(this.pointerDown(t,!0),this.dragger.canDragOut=!1),this.pointerMoveReal(t),e&&this.dragger.checkDragOut(t))}pointerMoveReal(t){if(this.emit(exports.PointerEvent.BEFORE_MOVE,t,this.defaultPath),this.downData){const i=e.PointHelper.getDistance(this.downData,t)>this.config.pointer.dragDistance;i&&(this.waitTap&&this.pointerWaitCancel(),this.waitMenuTap=!1),this.dragger.checkDrag(t,i)}this.dragger.moving||(this.updateHoverData(t),this.moveMode&&(t.path=this.defaultPath),this.emit(exports.PointerEvent.MOVE,t),this.dragging&&!this.config.pointer.dragHover||this.pointerHover(t),this.dragger.dragging&&(this.dragger.dragOverOrOut(t),this.dragger.dragEnterOrLeave(t))),this.updateCursor(this.downData||t)}pointerUp(t){const{downData:e,oldDownData:i}=this;t||(t=e),e&&(a.defaultLeft(t),this.findPath(t),this.downed&&(this.downed=!1,this.emit(exports.PointerEvent.BEFORE_UP,t),this.emit(exports.PointerEvent.UP,t),i&&this.emit(exports.PointerEvent.UP,i,void 0,t.path),this.emit(exports.PointerEvent.UP,e,void 0,t.path),this.touchLeave(t),this.tap(t),this.menuTap(t)),this.dragger.dragEnd(t),this.downData=this.oldDownData=null,this.updateCursor(t))}pointerCancel(){this.pointerUp(this.dragger.dragData)}multiTouch(t,e){const{move:i,angle:s,scale:r,center:a}=R.getData(e);this.rotate(b(a,s,t)),this.zoom(C(a,r,t)),this.move(L(a,i,t))}menu(t){this.findPath(t),this.emit(exports.PointerEvent.MENU,t)}menuTap(t){this.waitMenuTap&&this.emit(exports.PointerEvent.MENU_TAP,t)}move(t){this.transformer.move(t)}zoom(t){this.transformer.zoom(t)}rotate(t){this.transformer.rotate(t)}transformEnd(){this.transformer.transformEnd()}keyDown(t){const{code:e}=t;this.downKeyMap[e]||(this.downKeyMap[e]=!0,r.setDownCode(e),this.emit(exports.KeyEvent.HOLD,t,this.defaultPath),this.moveMode&&(this.cancelHover(),this.updateCursor())),this.emit(exports.KeyEvent.DOWN,t,this.defaultPath)}keyUp(t){const{code:e}=t;this.downKeyMap[e]=!1,r.setUpCode(e),this.emit(exports.KeyEvent.UP,t,this.defaultPath),"grab"===this.cursor&&this.updateCursor()}pointerHover(t){this.pointerOverOrOut(t),this.pointerEnterOrLeave(t)}pointerOverOrOut(t){const{path:e}=t,{overPath:i}=this;this.overPath=e,i?e.indexAt(0)!==i.indexAt(0)&&(this.emit(exports.PointerEvent.OUT,t,i),this.emit(exports.PointerEvent.OVER,t,e)):this.emit(exports.PointerEvent.OVER,t,e)}pointerEnterOrLeave(t){let{path:e}=t;this.downData&&!this.moveMode&&(e=e.clone(),this.downData.path.forEach((t=>e.add(t))));const{enterPath:i}=this;this.enterPath=e,this.emit(exports.PointerEvent.LEAVE,t,i,e),this.emit(exports.PointerEvent.ENTER,t,e,i)}touchLeave(t){"touch"===t.pointerType&&this.enterPath&&(this.emit(exports.PointerEvent.LEAVE,t),this.dragger.dragging&&this.emit(exports.DropEvent.LEAVE,t))}tap(t){const{pointer:e}=this.config,i=this.longTap(t);if(!e.tapMore&&i)return;if(!this.waitTap)return;e.tapMore&&this.emitTap(t);const s=Date.now()-this.downTime,r=[exports.PointerEvent.DOUBLE_TAP,exports.PointerEvent.DOUBLE_CLICK].some((e=>w(t.path,e)));s<e.tapTime+50&&r?(this.tapCount++,2===this.tapCount?(this.tapWaitCancel(),this.emitDoubleTap(t)):(clearTimeout(this.tapTimer),this.tapTimer=setTimeout((()=>{e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}),e.tapTime))):e.tapMore||(this.tapWaitCancel(),this.emitTap(t))}findPath(t,e){const{hitRadius:i,through:s}=this.config.pointer,r=this.selector.getByPoint(t,i,e||{through:s});return r.throughPath&&(t.throughPath=r.throughPath),t.path=r.path,r.path}isDrag(t){return this.dragger.getList().has(t)}isPress(t){const{downData:e,oldDownData:i}=this;return this.downed&&(e&&e.path.has(t)||i&&i.path.has(t))}isHover(t){return this.enterPath&&this.enterPath.has(t)}isFocus(t){return this.focusData===t}cancelHover(){const{hoverData:t}=this;t&&(t.path=this.defaultPath,this.pointerHover(t))}updateDownData(t,e){const{downData:i}=this;!t&&i&&(t=Object.assign({},i)),t&&(this.oldDownData=i,this.findPath(t,e),this.downData=t)}updateHoverData(t){t||(t=this.hoverData),t&&(this.findPath(t,{exclude:this.dragger.getList(),name:exports.PointerEvent.MOVE}),this.hoverData=t)}updateCursor(t){if(this.config.cursor.stop)return;if(t||(this.updateHoverData(),t=this.downData||this.hoverData),this.dragger.moving)return this.setCursor("grabbing");if(this.moveMode)return this.setCursor(this.downData?"grabbing":"grab");if(!t)return;let e,i;const{path:s}=t;for(let t=0,r=s.length;t<r&&(e=s.list[t],i=e.cursor,!i);t++);this.setCursor(i)}setCursor(t){this.cursor=t}emitTap(t){this.emit(exports.PointerEvent.TAP,t),this.emit(exports.PointerEvent.CLICK,t)}emitDoubleTap(t){this.emit(exports.PointerEvent.DOUBLE_TAP,t),this.emit(exports.PointerEvent.DOUBLE_CLICK,t)}pointerWaitCancel(){this.tapWaitCancel(),this.longPressWaitCancel()}tapWait(){clearTimeout(this.tapTimer),this.waitTap=!0}tapWaitCancel(){clearTimeout(this.tapTimer),this.waitTap=!1,this.tapCount=0}longPressWait(t){clearTimeout(this.longPressTimer),this.longPressTimer=setTimeout((()=>{this.longPressed=!0,this.emit(exports.PointerEvent.LONG_PRESS,t)}),this.config.pointer.longPressTime)}longTap(t){let e;return this.longPressed&&(this.emit(exports.PointerEvent.LONG_TAP,t),w(t.path,exports.PointerEvent.LONG_TAP)&&(e=!0)),this.longPressWaitCancel(),e}longPressWaitCancel(){clearTimeout(this.longPressTimer),this.longPressed=!1}__onResize(){this.shrinkCanvasBounds=new e.Bounds(this.canvas.bounds),this.shrinkCanvasBounds.spread(-2)}__listenEvents(){const{target:t}=this;this.__eventIds=[t.on_(e.ResizeEvent.RESIZE,this.__onResize,this)],t.once(e.LeaferEvent.READY,(()=>this.__onResize()))}__removeListenEvents(){this.target.off_(this.__eventIds),this.__eventIds.length=0}emit(t,e,i,s){this.running&&function(t,e,i,s){if(!i&&!e.path)return;let r;e.type=t,i?e=Object.assign(Object.assign({},e),{path:i}):i=e.path,e.target=i.indexAt(0);try{for(let a=i.length-1;a>-1;a--){if(r=i.list[a],y(r,t,e,!0,s))return;r.isApp&&P(r,t,e,!0,s)}for(let a=0,o=i.length;a<o;a++)if(r=i.list[a],r.isApp&&P(r,t,e,!1,s),y(r,t,e,!1,s))return}catch(t){_.error(t)}}(t,e,i,s)}destroy(){this.__eventIds.length&&(this.stop(),this.__removeListenEvents(),this.dragger.destroy(),this.transformer.destroy(),this.downData=this.overPath=this.enterPath=null)}},exports.InteractionHelper=c,exports.Keyboard=r,exports.LeaferTypeCreator=p,exports.MultiTouchHelper=R,exports.PointerButton=a,exports.UIEvent=o,Object.keys(t).forEach((function(e){"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:function(){return t[e]}})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leafer-ui/core",
3
- "version": "1.0.0-rc.17",
3
+ "version": "1.0.0-rc.18",
4
4
  "description": "@leafer-ui/core",
5
5
  "author": "Chao (Leafer) Wan",
6
6
  "license": "MIT",
@@ -29,11 +29,11 @@
29
29
  "leaferjs"
30
30
  ],
31
31
  "dependencies": {
32
- "@leafer-ui/draw": "1.0.0-rc.17",
33
- "@leafer-ui/app": "1.0.0-rc.17",
34
- "@leafer-ui/type": "1.0.0-rc.17",
35
- "@leafer-ui/interaction": "1.0.0-rc.17",
36
- "@leafer-ui/event": "1.0.0-rc.17",
37
- "@leafer-ui/hit": "1.0.0-rc.17"
32
+ "@leafer-ui/draw": "1.0.0-rc.18",
33
+ "@leafer-ui/app": "1.0.0-rc.18",
34
+ "@leafer-ui/type": "1.0.0-rc.18",
35
+ "@leafer-ui/interaction": "1.0.0-rc.18",
36
+ "@leafer-ui/event": "1.0.0-rc.18",
37
+ "@leafer-ui/hit": "1.0.0-rc.18"
38
38
  }
39
39
  }