@leafer-ui/core 1.0.0-rc.19 → 1.0.0-rc.20

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.esm.js CHANGED
@@ -1,6 +1,6 @@
1
- import { Leafer, State, UI, Rect, Group } from '@leafer-ui/draw';
1
+ import { Leafer, State, UI, ImageManager, 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, BoundsHelper, Bounds, ResizeEvent, LeaferEvent, CanvasManager, Leaf, Platform } from '@leafer/core';
3
+ import { registerUI, Creator, PropertyEvent, Debug, DataHelper, canvasSizeAttrs, LayoutEvent, RenderEvent, Event, EventCreator, registerUIEvent, LeafList, PointHelper, Bounds, BoundsHelper, ResizeEvent, LeaferEvent, CanvasManager, LeaferCanvasBase, tempBounds, Leaf, Matrix, Platform } from '@leafer/core';
4
4
 
5
5
  /******************************************************************************
6
6
  Copyright (c) Microsoft Corporation.
@@ -122,7 +122,8 @@ let App = class App extends Leafer {
122
122
  if (this.viewReady)
123
123
  this.renderer.update();
124
124
  }
125
- __render(canvas, _options) {
125
+ __render(canvas, options) {
126
+ canvas.setWorld(options.matrix || this.__world);
126
127
  this.children.forEach(leafer => canvas.copyWorld(leafer.canvas));
127
128
  }
128
129
  __onResize(event) {
@@ -155,11 +156,6 @@ App = __decorate([
155
156
  registerUI()
156
157
  ], App);
157
158
 
158
- function draw(leafer) {
159
- const { config } = leafer;
160
- config.move.dragOut = false;
161
- }
162
-
163
159
  const downKeyMap = {};
164
160
  const Keyboard = {
165
161
  isHoldSpaceKey() {
@@ -354,21 +350,16 @@ KeyEvent = __decorate([
354
350
  registerUIEvent()
355
351
  ], KeyEvent);
356
352
 
357
- function design(leafer) {
353
+ function addInteractionWindow(leafer) {
358
354
  if (leafer.isApp)
359
355
  return;
360
356
  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);
357
+ const { x, y } = leafer.getValidMove(e.moveX, e.moveY);
358
+ if (x || y)
359
+ leafer.zoomLayer.move(x, y);
369
360
  }), leafer.on_(ZoomEvent.BEFORE_ZOOM, (e) => {
370
361
  const { zoomLayer } = leafer;
371
- const changeScale = leafer.validScale(e.scale);
362
+ const changeScale = leafer.getValidScale(e.scale);
372
363
  if (changeScale !== 1) {
373
364
  PointHelper.scaleOf(zoomLayer, e, changeScale);
374
365
  zoomLayer.scale = zoomLayer.__.scaleX * changeScale;
@@ -376,6 +367,12 @@ function design(leafer) {
376
367
  }));
377
368
  }
378
369
 
370
+ function document(leafer) {
371
+ addInteractionWindow(leafer);
372
+ leafer.config.move.scroll = 'limit';
373
+ leafer.config.zoom.min = 1;
374
+ }
375
+
379
376
  const debug$1 = Debug.get('LeaferTypeCreator');
380
377
  const LeaferTypeCreator = {
381
378
  list: {},
@@ -398,12 +395,51 @@ const LeaferTypeCreator = {
398
395
  }
399
396
  };
400
397
  const { list, register } = LeaferTypeCreator;
401
- register('draw', draw);
402
- register('design', design);
398
+ register('draw', () => { });
399
+ register('design', addInteractionWindow);
400
+ register('document', document);
403
401
 
404
402
  Leafer.prototype.initType = function (type) {
405
403
  LeaferTypeCreator.run(type, this);
406
404
  };
405
+ Leafer.prototype.getValidMove = function (moveX, moveY) {
406
+ const { scroll, disabled } = this.app.config.move;
407
+ if (scroll) {
408
+ if (Math.abs(moveX) > Math.abs(moveY))
409
+ moveY = 0;
410
+ else
411
+ moveX = 0;
412
+ if (scroll === 'limit') {
413
+ const { x, y, width, height } = new Bounds(this.__world).addPoint(this.zoomLayer);
414
+ const right = x + width - this.width, bottom = y + height - this.height;
415
+ if (x >= 0 && right <= 0)
416
+ moveX = 0;
417
+ else if (moveX > 0) {
418
+ if (x + moveX > 0)
419
+ moveX = -x;
420
+ }
421
+ else if (moveX < 0 && right + moveX < 0)
422
+ moveX = -right;
423
+ if (y >= 0 && bottom <= 0)
424
+ moveY = 0;
425
+ else if (moveY > 0) {
426
+ if (y + moveY > 0)
427
+ moveY = -y;
428
+ }
429
+ else if (moveY < 0 && bottom + moveY < 0)
430
+ moveY = -bottom;
431
+ }
432
+ }
433
+ return { x: disabled ? 0 : moveX, y: disabled ? 0 : moveY };
434
+ };
435
+ Leafer.prototype.getValidScale = function (changeScale) {
436
+ const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale);
437
+ if (absScale < min)
438
+ changeScale = min / scaleX;
439
+ else if (absScale > max)
440
+ changeScale = max / scaleX;
441
+ return disabled ? 1 : changeScale;
442
+ };
407
443
 
408
444
  class Transformer {
409
445
  constructor(interaction) {
@@ -575,7 +611,7 @@ class Dragger {
575
611
  return;
576
612
  }
577
613
  if (!this.moving && canDrag) {
578
- if (this.moving = interaction.canMove(this.downData) || interaction.isHoldRightKey)
614
+ if (this.moving = interaction.canMove(this.downData) || interaction.isHoldRightKey || interaction.isMobileDragEmpty)
579
615
  interaction.emit(MoveEvent.START, this.dragData);
580
616
  }
581
617
  if (!this.moving) {
@@ -624,7 +660,7 @@ class Dragger {
624
660
  const list = this.getList();
625
661
  if (list.length && running) {
626
662
  const { moveX, moveY } = this.dragData;
627
- list.forEach(leaf => leaf.moveWorld(moveX, moveY));
663
+ list.forEach(leaf => leaf.draggable && leaf.moveWorld(moveX, moveY));
628
664
  }
629
665
  }
630
666
  dragOverOrOut(data) {
@@ -651,7 +687,7 @@ class Dragger {
651
687
  this.dragEnterPath = path;
652
688
  }
653
689
  dragEnd(data, speed) {
654
- if (!this.dragData)
690
+ if (!this.dragging && !this.moving)
655
691
  return;
656
692
  const { moveX, moveY } = this.dragData;
657
693
  if (this.interaction.config.move.dragAnimate && this.canAnimate && this.moving && (Math.abs(moveX) > 1 || Math.abs(moveY) > 1)) {
@@ -674,12 +710,16 @@ class Dragger {
674
710
  if (throughPath)
675
711
  endDragData.throughPath = throughPath;
676
712
  endDragData.path = path;
677
- if (this.moving)
713
+ if (this.moving) {
714
+ this.moving = false;
678
715
  interaction.emit(MoveEvent.END, endDragData);
716
+ }
679
717
  if (this.dragging) {
718
+ const dropList = this.getList();
719
+ this.dragging = false;
680
720
  interaction.emit(DragEvent.END, endDragData);
681
- this.swipe(data, endDragData);
682
- this.drop(data);
721
+ this.swipe(data, downData, dragData, endDragData);
722
+ this.drop(data, dropList, this.dragEnterPath);
683
723
  }
684
724
  this.autoMoveCancel();
685
725
  this.dragReset();
@@ -691,22 +731,21 @@ class Dragger {
691
731
  this.interaction.target.nextRender(animateWait, null, off);
692
732
  this.animateWait = func;
693
733
  }
694
- swipe(data, endDragData) {
695
- const { interaction, downData } = this;
734
+ swipe(data, downData, dragData, endDragData) {
735
+ const { interaction } = this;
696
736
  if (PointHelper.getDistance(downData, data) > interaction.config.pointer.swipeDistance) {
697
- const swipeData = getSwipeEventData(downData, this.dragData, endDragData);
737
+ const swipeData = getSwipeEventData(downData, dragData, endDragData);
698
738
  this.interaction.emit(swipeData.type, swipeData);
699
739
  }
700
740
  }
701
- drop(data) {
702
- const dropData = getDropEventData(data, this.getList(), DragEvent.data);
703
- dropData.path = this.dragEnterPath;
741
+ drop(data, dropList, dragEnterPath) {
742
+ const dropData = getDropEventData(data, dropList, DragEvent.data);
743
+ dropData.path = dragEnterPath;
704
744
  this.interaction.emit(DropEvent.DROP, dropData);
705
- this.interaction.emit(DragEvent.LEAVE, data, this.dragEnterPath);
745
+ this.interaction.emit(DragEvent.LEAVE, data, dragEnterPath);
706
746
  }
707
747
  dragReset() {
708
748
  DragEvent.list = DragEvent.data = this.dragableList = this.dragData = this.downData = this.dragOverPath = this.dragEnterPath = null;
709
- this.dragging = this.moving = false;
710
749
  }
711
750
  checkDragOut(data) {
712
751
  const { interaction } = this;
@@ -838,6 +877,7 @@ const config = {
838
877
  tapTime: 120,
839
878
  longPressTime: 800,
840
879
  transformTime: 500,
880
+ hover: true,
841
881
  dragHover: true,
842
882
  dragDistance: 2,
843
883
  swipeDistance: 20,
@@ -849,9 +889,12 @@ const config = {
849
889
  const { pathHasEventType, getMoveEventData, getZoomEventData, getRotateEventData } = InteractionHelper;
850
890
  class InteractionBase {
851
891
  get dragging() { return this.dragger.dragging; }
892
+ get moveMode() { return this.config.move.drag || this.isHoldSpaceKey || this.isHoldMiddleKey || (this.isHoldRightKey && this.dragger.moving) || this.isDragEmpty; }
852
893
  get isDragEmpty() { return this.config.move.dragEmpty && this.isRootPath(this.hoverData) && (!this.downData || this.isRootPath(this.downData)); }
894
+ get isMobileDragEmpty() { return this.config.move.dragEmpty && !this.config.pointer.hover && this.downData && this.isTreePath(this.downData); }
895
+ get isHoldMiddleKey() { return this.config.move.holdMiddleKey && this.downData && PointerButton.middle(this.downData); }
853
896
  get isHoldRightKey() { return this.config.move.holdRightKey && this.downData && PointerButton.right(this.downData); }
854
- get moveMode() { return this.config.move.drag || (this.config.move.holdSpaceKey && Keyboard.isHoldSpaceKey()) || (this.downData && ((this.config.move.holdMiddleKey && PointerButton.middle(this.downData)) || (this.isHoldRightKey && this.dragger.moving))) || this.isDragEmpty; }
897
+ get isHoldSpaceKey() { return this.config.move.holdSpaceKey && Keyboard.isHoldSpaceKey(); }
855
898
  get hitRadius() { return this.config.pointer.hitRadius; }
856
899
  constructor(target, canvas, selector, userConfig) {
857
900
  this.config = config;
@@ -893,7 +936,8 @@ class InteractionBase {
893
936
  this.waitMenuTap = true;
894
937
  }
895
938
  this.dragger.setDragData(data);
896
- this.updateCursor(data);
939
+ if (!this.isHoldRightKey)
940
+ this.updateCursor(data);
897
941
  }
898
942
  pointerMove(data) {
899
943
  if (!data)
@@ -911,9 +955,10 @@ class InteractionBase {
911
955
  }
912
956
  }
913
957
  pointerMoveReal(data) {
958
+ const { dragHover, dragDistance } = this.config.pointer;
914
959
  this.emit(PointerEvent.BEFORE_MOVE, data, this.defaultPath);
915
960
  if (this.downData) {
916
- const canDrag = PointHelper.getDistance(this.downData, data) > this.config.pointer.dragDistance;
961
+ const canDrag = PointHelper.getDistance(this.downData, data) > dragDistance;
917
962
  if (canDrag) {
918
963
  if (this.waitTap)
919
964
  this.pointerWaitCancel();
@@ -925,7 +970,7 @@ class InteractionBase {
925
970
  this.updateHoverData(data);
926
971
  this.checkPath(data);
927
972
  this.emit(PointerEvent.MOVE, data);
928
- if (!(this.dragging && !this.config.pointer.dragHover))
973
+ if (!(this.dragging && !dragHover))
929
974
  this.pointerHover(data);
930
975
  if (this.dragger.dragging) {
931
976
  this.dragger.dragOverOrOut(data);
@@ -941,20 +986,25 @@ class InteractionBase {
941
986
  if (!downData)
942
987
  return;
943
988
  PointerButton.defaultLeft(data);
944
- this.downData = null;
945
989
  this.findPath(data);
990
+ const upData = Object.assign(Object.assign({}, data), { path: data.path.clone() });
946
991
  data.path.addList(downData.path.list);
947
992
  this.checkPath(data);
993
+ this.downData = null;
948
994
  this.emit(PointerEvent.BEFORE_UP, data);
949
995
  this.emit(PointerEvent.UP, data);
950
996
  this.touchLeave(data);
951
- this.tap(data);
952
- this.menuTap(data);
997
+ if (!data.isCancel) {
998
+ this.tap(data);
999
+ this.menuTap(data);
1000
+ }
953
1001
  this.dragger.dragEnd(data);
954
- this.updateCursor(data);
1002
+ this.updateCursor(upData);
955
1003
  }
956
1004
  pointerCancel() {
957
- this.pointerUp(this.dragger.dragData);
1005
+ const data = Object.assign({}, this.dragger.dragData);
1006
+ data.isCancel = true;
1007
+ this.pointerUp(data);
958
1008
  }
959
1009
  multiTouch(data, list) {
960
1010
  const { move, angle, scale, center } = MultiTouchHelper.getData(list);
@@ -1004,8 +1054,10 @@ class InteractionBase {
1004
1054
  this.updateCursor();
1005
1055
  }
1006
1056
  pointerHover(data) {
1007
- this.pointerOverOrOut(data);
1008
- this.pointerEnterOrLeave(data);
1057
+ if (this.config.pointer.hover) {
1058
+ this.pointerOverOrOut(data);
1059
+ this.pointerEnterOrLeave(data);
1060
+ }
1009
1061
  }
1010
1062
  pointerOverOrOut(data) {
1011
1063
  const { path } = data;
@@ -1086,6 +1138,12 @@ class InteractionBase {
1086
1138
  isRootPath(data) {
1087
1139
  return data && data.path.list[0].isLeafer;
1088
1140
  }
1141
+ isTreePath(data) {
1142
+ const app = this.target.app;
1143
+ if (!app || !app.isApp)
1144
+ return false;
1145
+ return app.editor && (!data.path.has(app.editor) && data.path.has(app.tree));
1146
+ }
1089
1147
  checkPath(data, useDefaultPath) {
1090
1148
  if (useDefaultPath || this.canMove(data))
1091
1149
  data.path = this.defaultPath;
@@ -1132,7 +1190,7 @@ class InteractionBase {
1132
1190
  this.hoverData = data;
1133
1191
  }
1134
1192
  updateCursor(data) {
1135
- if (this.config.cursor.stop)
1193
+ if (this.config.cursor.stop || !this.config.pointer.hover)
1136
1194
  return;
1137
1195
  if (!data) {
1138
1196
  this.updateHoverData();
@@ -1242,22 +1300,25 @@ Cursor.custom = {};
1242
1300
  class HitCanvasManager extends CanvasManager {
1243
1301
  constructor() {
1244
1302
  super(...arguments);
1245
- this.pathTypeList = new LeafList();
1246
- this.imageTypeList = new LeafList();
1303
+ this.maxTotal = 1000;
1304
+ this.pathList = new LeafList();
1305
+ this.pixelList = new LeafList();
1247
1306
  }
1248
- getImageType(leaf, size) {
1249
- this.imageTypeList.add(leaf);
1250
- return Creator.hitCanvas(size);
1307
+ getPixelType(leaf, config) {
1308
+ this.__autoClear();
1309
+ this.pixelList.add(leaf);
1310
+ return Creator.hitCanvas(config);
1251
1311
  }
1252
1312
  getPathType(leaf) {
1253
- this.pathTypeList.add(leaf);
1313
+ this.__autoClear();
1314
+ this.pathList.add(leaf);
1254
1315
  return Creator.hitCanvas();
1255
1316
  }
1256
1317
  clearImageType() {
1257
- this.__clearLeafList(this.imageTypeList);
1318
+ this.__clearLeafList(this.pixelList);
1258
1319
  }
1259
1320
  clearPathType() {
1260
- this.__clearLeafList(this.pathTypeList);
1321
+ this.__clearLeafList(this.pathList);
1261
1322
  }
1262
1323
  __clearLeafList(leafList) {
1263
1324
  if (leafList.length) {
@@ -1270,56 +1331,117 @@ class HitCanvasManager extends CanvasManager {
1270
1331
  leafList.reset();
1271
1332
  }
1272
1333
  }
1334
+ __autoClear() {
1335
+ if (this.pathList.length + this.pixelList.length > this.maxTotal)
1336
+ this.clear();
1337
+ }
1273
1338
  clear() {
1274
1339
  this.clearPathType();
1275
1340
  this.clearImageType();
1276
1341
  }
1277
1342
  }
1278
1343
 
1344
+ const canvas = LeaferCanvasBase.prototype;
1345
+ canvas.hitFill = function (point, fillRule) {
1346
+ return fillRule ? this.context.isPointInPath(point.x, point.y, fillRule) : this.context.isPointInPath(point.x, point.y);
1347
+ };
1348
+ canvas.hitStroke = function (point, strokeWidth) {
1349
+ this.strokeWidth = strokeWidth;
1350
+ return this.context.isPointInStroke(point.x, point.y);
1351
+ };
1352
+ canvas.hitPixel = function (radiusPoint, offset, scale = 1) {
1353
+ let { x, y, radiusX, radiusY } = radiusPoint;
1354
+ if (offset)
1355
+ x -= offset.x, y -= offset.y;
1356
+ tempBounds.set(x - radiusX, y - radiusY, radiusX * 2, radiusY * 2).scale(scale).ceil();
1357
+ const { data } = this.context.getImageData(tempBounds.x, tempBounds.y, tempBounds.width, tempBounds.height);
1358
+ for (let i = 0, len = data.length; i < len; i += 4) {
1359
+ if (data[i + 3] > 0)
1360
+ return true;
1361
+ }
1362
+ return data[3] > 0;
1363
+ };
1364
+
1279
1365
  const { toInnerRadiusPointOf, copy, setRadius } = PointHelper;
1280
1366
  const inner = {};
1281
- Leaf.prototype.__hitWorld = function (point) {
1282
- if (this.__layout.hitCanvasChanged || !this.__hitCanvas) {
1283
- this.__updateHitCanvas();
1284
- if (!this.__layout.boundsChanged)
1285
- this.__layout.hitCanvasChanged = false;
1286
- }
1367
+ const leaf = Leaf.prototype;
1368
+ leaf.__hitWorld = function (point) {
1287
1369
  if (this.__.hitRadius) {
1288
1370
  copy(inner, point), point = inner;
1289
1371
  setRadius(point, this.__.hitRadius);
1290
1372
  }
1291
1373
  toInnerRadiusPointOf(point, this.__world, inner);
1292
- if (this.__.hitBox) {
1374
+ const { width, height } = this.__world;
1375
+ const isSmall = width < 10 && height < 10;
1376
+ if (this.__.hitBox || isSmall) {
1293
1377
  if (BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner))
1294
1378
  return true;
1379
+ if (isSmall)
1380
+ return false;
1381
+ }
1382
+ if (this.__layout.hitCanvasChanged || !this.__hitCanvas) {
1383
+ this.__updateHitCanvas();
1384
+ if (!this.__layout.boundsChanged)
1385
+ this.__layout.hitCanvasChanged = false;
1295
1386
  }
1296
1387
  return this.__hit(inner);
1297
1388
  };
1389
+ leaf.__hitFill = function (inner) { var _a; return (_a = this.__hitCanvas) === null || _a === void 0 ? void 0 : _a.hitFill(inner, this.__.windingRule); };
1390
+ leaf.__hitStroke = function (inner, strokeWidth) { var _a; return (_a = this.__hitCanvas) === null || _a === void 0 ? void 0 : _a.hitStroke(inner, strokeWidth); };
1391
+ leaf.__hitPixel = function (inner) { var _a; return (_a = this.__hitCanvas) === null || _a === void 0 ? void 0 : _a.hitPixel(inner, this.__layout.renderBounds, this.__hitCanvas.hitScale); };
1392
+ leaf.__drawHitPath = function (canvas) { if (canvas)
1393
+ this.__drawRenderPath(canvas); };
1298
1394
 
1299
- UI.prototype.__updateHitCanvas = function () {
1395
+ const matrix = new Matrix();
1396
+ const ui$1 = UI.prototype;
1397
+ ui$1.__updateHitCanvas = function () {
1398
+ const data = this.__, { hitCanvasManager } = this.leafer;
1399
+ const isHitPixelFill = data.__pixelFill && data.hitFill === 'pixel';
1400
+ const isHitPixelStroke = data.__pixelStroke && data.hitStroke === 'pixel';
1401
+ const isHitPixel = isHitPixelFill || isHitPixelStroke;
1300
1402
  if (!this.__hitCanvas)
1301
- this.__hitCanvas = this.leafer.hitCanvasManager.getPathType(this);
1403
+ this.__hitCanvas = isHitPixel ? hitCanvasManager.getPixelType(this, { contextSettings: { willReadFrequently: true } }) : hitCanvasManager.getPathType(this);
1302
1404
  const h = this.__hitCanvas;
1405
+ if (isHitPixel) {
1406
+ const { renderBounds } = this.__layout;
1407
+ const size = Platform.image.hitCanvasSize;
1408
+ const scale = h.hitScale = tempBounds.set(0, 0, size, size).getFitMatrix(renderBounds, 0.5).a;
1409
+ const { x, y, width, height } = tempBounds.set(renderBounds).scale(scale);
1410
+ h.resize({ width, height, pixelRatio: 1 });
1411
+ h.clear();
1412
+ ImageManager.patternLocked = true;
1413
+ this.__renderShape(h, { matrix: matrix.setWith(this.__world).scaleWith(1 / scale).invertWith().translate(-x, -y) }, !isHitPixelFill, !isHitPixelStroke);
1414
+ ImageManager.patternLocked = false;
1415
+ h.resetTransform();
1416
+ data.__isHitPixel = true;
1417
+ }
1418
+ else {
1419
+ data.__isHitPixel && (data.__isHitPixel = false);
1420
+ }
1303
1421
  this.__drawHitPath(h);
1304
- h.setStrokeOptions(this.__);
1422
+ h.setStrokeOptions(data);
1305
1423
  };
1306
- UI.prototype.__hit = function (inner) {
1424
+ ui$1.__hit = function (inner) {
1307
1425
  if (Platform.name === 'miniapp')
1308
1426
  this.__drawHitPath(this.__hitCanvas);
1309
- const { fill, hitFill, windingRule } = this.__;
1310
- const needHitFill = (fill && hitFill === 'path') || hitFill === 'all';
1311
- const isHitFill = this.__hitFill(inner, windingRule);
1312
- if (needHitFill && isHitFill)
1427
+ const data = this.__;
1428
+ if (data.__isHitPixel && this.__hitPixel(inner))
1313
1429
  return true;
1314
- const { stroke, hitStroke, __strokeWidth, strokeAlign } = this.__;
1315
- const needHitStroke = (stroke && hitStroke === 'path') || hitStroke === 'all';
1430
+ const { hitFill } = data;
1431
+ const needHitFillPath = ((data.fill && hitFill == 'path') || hitFill === 'all');
1432
+ if (needHitFillPath && this.__hitFill(inner))
1433
+ return true;
1434
+ const { hitStroke, __strokeWidth } = data;
1435
+ const needHitStrokePath = ((data.stroke && hitStroke == 'path') || hitStroke === 'all');
1436
+ if (!needHitFillPath && !needHitStrokePath)
1437
+ return false;
1316
1438
  const radiusWidth = inner.radiusX * 2;
1317
1439
  let hitWidth = radiusWidth;
1318
- if (needHitStroke) {
1319
- switch (strokeAlign) {
1440
+ if (needHitStrokePath) {
1441
+ switch (data.strokeAlign) {
1320
1442
  case 'inside':
1321
1443
  hitWidth += __strokeWidth * 2;
1322
- if (!needHitFill && (isHitFill && this.__hitStroke(inner, hitWidth)))
1444
+ if (!needHitFillPath && this.__hitFill(inner) && this.__hitStroke(inner, hitWidth))
1323
1445
  return true;
1324
1446
  hitWidth = radiusWidth;
1325
1447
  break;
@@ -1328,8 +1450,8 @@ UI.prototype.__hit = function (inner) {
1328
1450
  break;
1329
1451
  case 'outside':
1330
1452
  hitWidth += __strokeWidth * 2;
1331
- if (!needHitFill) {
1332
- if (!isHitFill && this.__hitStroke(inner, hitWidth))
1453
+ if (!needHitFillPath) {
1454
+ if (!this.__hitFill(inner) && this.__hitStroke(inner, hitWidth))
1333
1455
  return true;
1334
1456
  hitWidth = radiusWidth;
1335
1457
  }
@@ -1344,8 +1466,8 @@ Rect.prototype.__updateHitCanvas = function () {
1344
1466
  if (this.stroke || this.cornerRadius)
1345
1467
  ui.__updateHitCanvas.call(this);
1346
1468
  };
1347
- Rect.prototype.__hitFill = function (inner, windingRule) {
1348
- return this.__hitCanvas ? ui.__hitFill.call(this, inner, windingRule) : BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
1469
+ Rect.prototype.__hitFill = function (inner) {
1470
+ return this.__hitCanvas ? ui.__hitFill.call(this, inner) : BoundsHelper.hitRadiusPoint(this.__layout.boxBounds, inner);
1349
1471
  };
1350
1472
 
1351
1473
  UI.prototype.find = function (condition, options) {
@@ -1 +1 @@
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 c,LayoutEvent as g,RenderEvent as l,Event as u,EventCreator as p,registerUIEvent as m,LeafList as v,PointHelper as _,BoundsHelper as f,Bounds as E,ResizeEvent as D,LeaferEvent as y,CanvasManager as O,Leaf as T,Platform as P}from"@leafer/core";function R(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 w=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,c),e.view=this.realCanvas?void 0:this.view,e.fill=void 0,e}__listenChildEvents(t){t.once(g.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))}};w=R([r()],w);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=R([m()],A);const x={};let k=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}};k.BEFORE_DRAG="drag.before_drag",k.START="drag.start",k.DRAG="drag",k.END="drag.end",k.OVER="drag.over",k.OUT="drag.out",k.ENTER="drag.enter",k.LEAVE="drag.leave",k=R([m()],k);let S=class extends A{static setList(t){k.setList(t)}static setData(t){k.setData(t)}};S.DROP="drop",S=R([m()],S);let B=class extends k{};B.BEFORE_MOVE="move.before_move",B.START="move.start",B.MOVE="move",B.END="move.end",B=R([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=R([m()],H);let N=class extends k{};N.SWIPE="swipe",N.LEFT="swipe.left",N.RIGHT="swipe.right",N.UP="swipe.up",N.DOWN="swipe.down",N=R([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=R([m()],W);let I=class extends M{};I.DOWN="key.down",I.HOLD="key.hold",I.UP="key.up",I=R([m()],I);const j=h.get("LeaferTypeCreator"),V={list:{},register(t,e){z[t]?j.repeat(t):z[t]=e},run(t,e){const i=z[t];i?i(e):j.error("no",t)}},{list:z,register:U}=V;U("draw",(function(t){const{config:e}=t;e.move.dragOut=!1})),U("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){V.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:k.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.canMove(this.downData)||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(k.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(k.BEFORE_DRAG,this.dragData),e.emit(k.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(k.OUT,t,i),e.emit(k.OVER,t,a)):e.emit(k.OVER,t,a)}dragEnterOrLeave(t){const{interaction:e}=this,{dragEnterPath:i}=this,{path:a}=t;e.emit(k.LEAVE,t,i,a),e.emit(k.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(k.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(),k.data);e.path=this.dragEnterPath,this.interaction.emit(S.DROP,e),this.interaction.emit(k.LEAVE,t,this.dragEnterPath)}dragReset(){k.list=k.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),c=f.maxY(n),g=t.x<o?s:d<t.x?-s:0,l=t.y<h?s:c<t.y?-s:0;let u=0,p=0;this.autoMoveTimer=setInterval((()=>{u+=g,p+=l,_.move(i,g,l),_.move(this.dragData,g,l),e.move(Object.assign(Object.assign({},t),{moveX:g,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.isRootPath(this.hoverData)&&(!this.downData||this.isRootPath(this.downData))}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),this.checkPath(t,e),this.downTime=Date.now(),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);(this.canvas.bounds.hitPoint(t)||e)&&(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.checkPath(t),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}=this;t||(t=e),e&&(b.defaultLeft(t),this.downData=null,this.findPath(t),t.path.addList(e.path.list),this.checkPath(t),this.emit(A.BEFORE_UP,t),this.emit(A.UP,t),this.touchLeave(t),this.tap(t),this.menuTap(t),this.dragger.dragEnd(t),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(I.HOLD,t,this.defaultPath),this.moveMode&&(this.cancelHover(),this.updateCursor())),this.emit(I.DOWN,t,this.defaultPath)}keyUp(t){const{code:e}=t;this.downKeyMap[e]=!1,L.setUpCode(e),this.emit(I.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(S.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}isRootPath(t){return t&&t.path.list[0].isLeafer}checkPath(t,e){(e||this.canMove(t))&&(t.path=this.defaultPath)}canMove(t){return this.moveMode&&t&&t.path.list.every((t=>!t.isOutside))}isDrag(t){return this.dragger.getList().has(t)}isPress(t){return this.downData&&this.downData.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,i){const{downData:a}=this;!t&&a&&(t=a),t&&(this.findPath(t,e),i&&a&&t.path.addList(a.path.list),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.canMove(t))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 E(this.canvas.bounds),this.shrinkCanvasBounds.spread(-2)}__listenEvents(){const{target:t}=this;this.__eventIds=[t.on_(D.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 ct{static set(t,e){this.custom[t]=e}static get(t){return this.custom[t]}}ct.custom={};class gt 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.boundsChanged||(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"===P.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.__,c=n&&"path"===o||"all"===o,g=2*t.radiusX;let l=g;if(c)switch(d){case"inside":if(l+=2*h,!s&&r&&this.__hitStroke(t,l))return!0;l=g;break;case"center":l+=h;break;case"outside":if(l+=2*h,!s){if(!r&&this.__hitStroke(t,l))return!0;l=g}}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{w as App,ct as Cursor,k as DragEvent,S as DropEvent,gt as HitCanvasManager,dt as InteractionBase,F as InteractionHelper,I as KeyEvent,L as Keyboard,V 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};
1
+ import{Leafer as t,State as e,UI as i,ImageManager as a,Rect as s,Group as n}from"@leafer-ui/draw";export*from"@leafer-ui/draw";import{registerUI as r,Creator as o,PropertyEvent as h,Debug as d,DataHelper as c,canvasSizeAttrs as l,LayoutEvent as g,RenderEvent as u,Event as p,EventCreator as m,registerUIEvent as _,LeafList as v,PointHelper as f,Bounds as E,BoundsHelper as D,ResizeEvent as y,LeaferEvent as O,CanvasManager as P,LeaferCanvasBase as T,tempBounds as w,Leaf as R,Matrix as C,Platform as L}from"@leafer/core";function b(t,e,i,a){var s,n=arguments.length,r=n<3?e:null===a?a=Object.getOwnPropertyDescriptor(e,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,i,a);else for(var o=t.length-1;o>=0;o--)(s=t[o])&&(r=(n<3?s(r):n>3?s(e,i,r):s(e,i))||r);return n>3&&r&&Object.defineProperty(e,i,r),r}"function"==typeof SuppressedError&&SuppressedError;let x=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=o.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_(h.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(){d.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){t.setWorld(e.matrix||this.__world),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(g.END,(()=>this.__onReady())),t.once(u.START,(()=>this.__onCreated())),t.once(u.END,(()=>this.__onViewReady())),this.realCanvas&&this.__eventIds.push(t.on_(u.END,this.__onChildRenderEnd,this))}};x=b([r()],x);const M={},S={isHoldSpaceKey:()=>S.isHold("Space"),isHold:t=>M[t],setDownCode(t){M[t]||(M[t]=!0)},setUpCode(t){M[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 k extends p{get spaceKey(){return S.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){m.changeName(t,e)}}let H=class extends k{};H.POINTER="pointer",H.BEFORE_DOWN="pointer.before_down",H.BEFORE_MOVE="pointer.before_move",H.BEFORE_UP="pointer.before_up",H.DOWN="pointer.down",H.MOVE="pointer.move",H.UP="pointer.up",H.OVER="pointer.over",H.OUT="pointer.out",H.ENTER="pointer.enter",H.LEAVE="pointer.leave",H.TAP="tap",H.DOUBLE_TAP="double_tap",H.CLICK="click",H.DOUBLE_CLICK="double_click",H.LONG_PRESS="long_press",H.LONG_TAP="long_tap",H.MENU="pointer.menu",H.MENU_TAP="pointer.menu_tap",H=b([_()],H);const B={};let W=class extends H{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(B,null,!0)}getInnerMove(t,e){return t||(t=this.current),this.assignMove(e),t.getInnerPoint(B,null,!0)}getLocalMove(t,e){return t||(t=this.current),this.assignMove(e),t.getLocalPoint(B,null,!0)}getPageTotal(){return this.getPageMove(!0)}getInnerTotal(t){return this.getInnerMove(t,!0)}getLocalTotal(t){return this.getLocalMove(t,!0)}assignMove(t){B.x=t?this.totalX:this.moveX,B.y=t?this.totalY:this.moveY}};W.BEFORE_DRAG="drag.before_drag",W.START="drag.start",W.DRAG="drag",W.END="drag.end",W.OVER="drag.over",W.OUT="drag.out",W.ENTER="drag.enter",W.LEAVE="drag.leave",W=b([_()],W);let N=class extends H{static setList(t){W.setList(t)}static setData(t){W.setData(t)}};N.DROP="drop",N=b([_()],N);let z=class extends W{};z.BEFORE_MOVE="move.before_move",z.START="move.start",z.MOVE="move",z.END="move.end",z=b([_()],z);let F=class extends k{};F.BEFORE_ROTATE="rotate.before_rotate",F.START="rotate.start",F.ROTATE="rotate",F.END="rotate.end",F=b([_()],F);let I=class extends W{};I.SWIPE="swipe",I.LEFT="swipe.left",I.RIGHT="swipe.right",I.UP="swipe.up",I.DOWN="swipe.down",I=b([_()],I);let V=class extends k{};V.BEFORE_ZOOM="zoom.before_zoom",V.START="zoom.start",V.ZOOM="zoom",V.END="zoom.end",V=b([_()],V);let j=class extends k{};function K(t){t.isApp||t.__eventIds.push(t.on_(z.BEFORE_MOVE,(e=>{const{x:i,y:a}=t.getValidMove(e.moveX,e.moveY);(i||a)&&t.zoomLayer.move(i,a)})),t.on_(V.BEFORE_ZOOM,(e=>{const{zoomLayer:i}=t,a=t.getValidScale(e.scale);1!==a&&(f.scaleOf(i,e,a),i.scale=i.__.scaleX*a)})))}j.DOWN="key.down",j.HOLD="key.hold",j.UP="key.up",j=b([_()],j);const U=d.get("LeaferTypeCreator"),X={list:{},register(t,e){Y[t]?U.repeat(t):Y[t]=e},run(t,e){const i=Y[t];i?i(e):U.error("no",t)}},{list:Y,register:G}=X;G("draw",(()=>{})),G("design",K),G("document",(function(t){K(t),t.config.move.scroll="limit",t.config.zoom.min=1})),t.prototype.initType=function(t){X.run(t,this)},t.prototype.getValidMove=function(t,e){const{scroll:i,disabled:a}=this.app.config.move;if(i&&(Math.abs(t)>Math.abs(e)?e=0:t=0,"limit"===i)){const{x:i,y:a,width:s,height:n}=new E(this.__world).addPoint(this.zoomLayer),r=i+s-this.width,o=a+n-this.height;i>=0&&r<=0?t=0:t>0?i+t>0&&(t=-i):t<0&&r+t<0&&(t=-r),a>=0&&o<=0?e=0:e>0?a+e>0&&(e=-a):e<0&&o+e<0&&(e=-o)}return{x:a?0:t,y:a?0:e}},t.prototype.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:i,max:a,disabled:s}=this.app.config.zoom,n=Math.abs(e*t);return n<i?t=i/e:n>a&&(t=a/e),s?1:t};class Z{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(z.START,this.moveData)}t.path=this.moveData.path,e.emit(z.BEFORE_MOVE,t),e.emit(z.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(V.START,this.zoomData)}t.path=this.zoomData.path,e.emit(V.BEFORE_ZOOM,t),e.emit(V.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(F.START,this.rotateData)}t.path=this.rotateData.path,e.emit(F.BEFORE_ROTATE,t),e.emit(F.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(z.END,this.moveData),this.moveData=null)}zoomEnd(){this.zoomData&&(this.interaction.emit(V.END,this.zoomData),this.zoomData=null)}rotateEnd(){this.rotateData&&(this.interaction.emit(F.END,this.rotateData),this.rotateData=null)}destroy(){this.zoomData=this.moveData=this.rotateData=null}}const q={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?I.UP:t>45&&t<135?I.DOWN:t<=45&&t>=-45?I.RIGHT:I.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:J.getSwipeDirection(f.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}},J=q,Q=new v,{getDragEventData:$,getDropEventData:tt,getSwipeEventData:et}=q;class it{constructor(t){this.interaction=t}setDragData(t){this.animateWait&&this.dragEndReal(),this.downData=this.interaction.downData,this.dragData=$(t,t,t),this.canAnimate=this.canDragOut=!0}getList(){const{proxy:t}=this.interaction.selector;return!this.dragging||t&&t.list.length?Q:W.list||this.dragableList||Q}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.canMove(this.downData)||i.isHoldRightKey||i.isMobileDragEmpty)&&i.emit(z.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(W.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:n}=a;this.dragData=$(a,i,t),n&&(this.dragData.throughPath=n),this.dragData.path=s,this.moving?(e.emit(z.BEFORE_MOVE,this.dragData),e.emit(z.MOVE,this.dragData)):this.dragging&&(this.dragReal(),e.emit(W.BEFORE_DRAG,this.dragData),e.emit(W.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.draggable&&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(W.OUT,t,i),e.emit(W.OVER,t,a)):e.emit(W.OVER,t,a)}dragEnterOrLeave(t){const{interaction:e}=this,{dragEnterPath:i}=this,{path:a}=t;e.emit(W.LEAVE,t,i,a),e.emit(W.ENTER,t,a,i),this.dragEnterPath=a}dragEnd(t,e){if(!this.dragging&&!this.moving)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)),f.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:n}=i,r=$(i,t,t);if(n&&(r.throughPath=n),r.path=s,this.moving&&(this.moving=!1,e.emit(z.END,r)),this.dragging){const s=this.getList();this.dragging=!1,e.emit(W.END,r),this.swipe(t,i,a,r),this.drop(t,s,this.dragEnterPath)}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,i,a){const{interaction:s}=this;if(f.getDistance(e,t)>s.config.pointer.swipeDistance){const t=et(e,i,a);this.interaction.emit(t.type,t)}}drop(t,e,i){const a=tt(t,e,W.data);a.path=i,this.interaction.emit(N.DROP,a),this.interaction.emit(W.LEAVE,t,i)}dragReset(){W.list=W.data=this.dragableList=this.dragData=this.downData=this.dragOverPath=this.dragEnterPath=null}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:n}=e.config.move;if(!n||!a||!s)return;const r=e.shrinkCanvasBounds,{x:o,y:h}=r,d=D.maxX(r),c=D.maxY(r),l=t.x<o?s:d<t.x?-s:0,g=t.y<h?s:c<t.y?-s:0;let u=0,p=0;this.autoMoveTimer=setInterval((()=>{u+=l,p+=g,f.move(i,l,g),f.move(this.dragData,l,g),e.move(Object.assign(Object.assign({},t),{moveX:l,moveY:g,totalX:u,totalY:p})),e.pointerMoveReal(t)}),10)}autoMoveCancel(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)}destroy(){this.dragReset()}}const at=d.get("emit");const st=["move","zoom","rotate","key"];function nt(t,e,i,a,s){if(st.some((t=>e.startsWith(t)))&&t.__.hitChildren&&!ot(t,s)){let n;for(let r=0,o=t.children.length;r<o;r++)n=t.children[r],!i.path.has(n)&&n.__.hittable&&rt(n,e,i,a,s)}}function rt(t,i,a,s,n){if(t.destroyed)return!0;if(t.__.hitSelf&&!ot(t,n)&&(e.updateEventStyle&&e.updateEventStyle(t,i),t.hasEvent(i,s))){a.phase=s?1:t===a.target?2:3;const e=m.get(i,a);if(t.emitEvent(e,s),e.isStop)return!0}return!1}function ot(t,e){return e&&e.has(t)}const ht={getData(t){const e=t[0],i=t[1],a=f.getCenter(e.from,i.from),s=f.getCenter(e.to,i.to),n={x:s.x-a.x,y:s.y-a.y},r=f.getDistance(e.from,i.from);return{move:n,scale:f.getDistance(e.to,i.to)/r,angle:f.getRotation(e.from,i.from,e.to,i.to),center:s}}},dt={wheel:{zoomSpeed:.5,moveSpeed:.5,rotateSpeed:.5,delta:{x:20,y:8},preventDefault:!0},pointer:{hitRadius:5,tapTime:120,longPressTime:800,transformTime:500,hover:!0,dragHover:!0,dragDistance:2,swipeDistance:20,preventDefaultMenu:!0},cursor:{}},{pathHasEventType:ct,getMoveEventData:lt,getZoomEventData:gt,getRotateEventData:ut}=q;class pt{get dragging(){return this.dragger.dragging}get moveMode(){return this.config.move.drag||this.isHoldSpaceKey||this.isHoldMiddleKey||this.isHoldRightKey&&this.dragger.moving||this.isDragEmpty}get isDragEmpty(){return this.config.move.dragEmpty&&this.isRootPath(this.hoverData)&&(!this.downData||this.isRootPath(this.downData))}get isMobileDragEmpty(){return this.config.move.dragEmpty&&!this.config.pointer.hover&&this.downData&&this.isTreePath(this.downData)}get isHoldMiddleKey(){return this.config.move.holdMiddleKey&&this.downData&&A.middle(this.downData)}get isHoldRightKey(){return this.config.move.holdRightKey&&this.downData&&A.right(this.downData)}get isHoldSpaceKey(){return this.config.move.holdSpaceKey&&S.isHoldSpaceKey()}get hitRadius(){return this.config.pointer.hitRadius}constructor(t,e,i,a){this.config=dt,this.tapCount=0,this.downKeyMap={},this.target=t,this.canvas=e,this.selector=i,this.defaultPath=new v(t),this.transformer=new Z(this),this.dragger=new it(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),this.checkPath(t,e),this.downTime=Date.now(),this.emit(H.BEFORE_DOWN,t),this.emit(H.DOWN,t),A.left(t)?(this.tapWait(),this.longPressWait(t)):A.right(t)&&(this.waitMenuTap=!0),this.dragger.setDragData(t),this.isHoldRightKey||this.updateCursor(t))}pointerMove(t){if(t||(t=this.hoverData),!t)return;const{downData:e}=this;e&&A.defaultLeft(t);(this.canvas.bounds.hitPoint(t)||e)&&(this.pointerMoveReal(t),e&&this.dragger.checkDragOut(t))}pointerMoveReal(t){const{dragHover:e,dragDistance:i}=this.config.pointer;if(this.emit(H.BEFORE_MOVE,t,this.defaultPath),this.downData){const e=f.getDistance(this.downData,t)>i;e&&(this.waitTap&&this.pointerWaitCancel(),this.waitMenuTap=!1),this.dragger.checkDrag(t,e)}this.dragger.moving||(this.updateHoverData(t),this.checkPath(t),this.emit(H.MOVE,t),this.dragging&&!e||this.pointerHover(t),this.dragger.dragging&&(this.dragger.dragOverOrOut(t),this.dragger.dragEnterOrLeave(t))),this.updateCursor(this.downData||t)}pointerUp(t){const{downData:e}=this;if(t||(t=e),!e)return;A.defaultLeft(t),this.findPath(t);const i=Object.assign(Object.assign({},t),{path:t.path.clone()});t.path.addList(e.path.list),this.checkPath(t),this.downData=null,this.emit(H.BEFORE_UP,t),this.emit(H.UP,t),this.touchLeave(t),t.isCancel||(this.tap(t),this.menuTap(t)),this.dragger.dragEnd(t),this.updateCursor(i)}pointerCancel(){const t=Object.assign({},this.dragger.dragData);t.isCancel=!0,this.pointerUp(t)}multiTouch(t,e){const{move:i,angle:a,scale:s,center:n}=ht.getData(e);this.rotate(ut(n,a,t)),this.zoom(gt(n,s,t)),this.move(lt(n,i,t))}menu(t){this.findPath(t),this.emit(H.MENU,t)}menuTap(t){this.waitMenuTap&&this.emit(H.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,S.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,S.setUpCode(e),this.emit(j.UP,t,this.defaultPath),"grab"===this.cursor&&this.updateCursor()}pointerHover(t){this.config.pointer.hover&&(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(H.OUT,t,i),this.emit(H.OVER,t,e)):this.emit(H.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(H.LEAVE,t,i,e),this.emit(H.ENTER,t,e,i)}touchLeave(t){"touch"===t.pointerType&&this.enterPath&&(this.emit(H.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=[H.DOUBLE_TAP,H.DOUBLE_CLICK].some((e=>ct(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}isRootPath(t){return t&&t.path.list[0].isLeafer}isTreePath(t){const e=this.target.app;return!(!e||!e.isApp)&&(e.editor&&!t.path.has(e.editor)&&t.path.has(e.tree))}checkPath(t,e){(e||this.canMove(t))&&(t.path=this.defaultPath)}canMove(t){return this.moveMode&&t&&t.path.list.every((t=>!t.isOutside))}isDrag(t){return this.dragger.getList().has(t)}isPress(t){return this.downData&&this.downData.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,i){const{downData:a}=this;!t&&a&&(t=a),t&&(this.findPath(t,e),i&&a&&t.path.addList(a.path.list),this.downData=t)}updateHoverData(t){t||(t=this.hoverData),t&&(this.findPath(t,{exclude:this.dragger.getList(),name:H.MOVE}),this.hoverData=t)}updateCursor(t){if(this.config.cursor.stop||!this.config.pointer.hover)return;if(t||(this.updateHoverData(),t=this.downData||this.hoverData),this.dragger.moving)return this.setCursor("grabbing");if(this.canMove(t))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(H.TAP,t),this.emit(H.CLICK,t)}emitDoubleTap(t){this.emit(H.DOUBLE_TAP,t),this.emit(H.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(H.LONG_PRESS,t)}),this.config.pointer.longPressTime)}longTap(t){let e;return this.longPressed&&(this.emit(H.LONG_TAP,t),ct(t.path,H.LONG_TAP)&&(e=!0)),this.longPressWaitCancel(),e}longPressWaitCancel(){clearTimeout(this.longPressTimer),this.longPressed=!1}__onResize(){this.shrinkCanvasBounds=new E(this.canvas.bounds),this.shrinkCanvasBounds.spread(-2)}__listenEvents(){const{target:t}=this;this.__eventIds=[t.on_(y.RESIZE,this.__onResize,this)],t.once(O.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 n=i.length-1;n>-1;n--){if(s=i.list[n],rt(s,t,e,!0,a))return;s.isApp&&nt(s,t,e,!0,a)}for(let n=0,r=i.length;n<r;n++)if(s=i.list[n],s.isApp&&nt(s,t,e,!1,a),rt(s,t,e,!1,a))return}catch(t){at.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 mt{static set(t,e){this.custom[t]=e}static get(t){return this.custom[t]}}mt.custom={};class _t extends P{constructor(){super(...arguments),this.maxTotal=1e3,this.pathList=new v,this.pixelList=new v}getPixelType(t,e){return this.__autoClear(),this.pixelList.add(t),o.hitCanvas(e)}getPathType(t){return this.__autoClear(),this.pathList.add(t),o.hitCanvas()}clearImageType(){this.__clearLeafList(this.pixelList)}clearPathType(){this.__clearLeafList(this.pathList)}__clearLeafList(t){t.length&&(t.forEach((t=>{t.__hitCanvas&&(t.__hitCanvas.destroy(),t.__hitCanvas=null)})),t.reset())}__autoClear(){this.pathList.length+this.pixelList.length>this.maxTotal&&this.clear()}clear(){this.clearPathType(),this.clearImageType()}}const vt=T.prototype;vt.hitFill=function(t,e){return e?this.context.isPointInPath(t.x,t.y,e):this.context.isPointInPath(t.x,t.y)},vt.hitStroke=function(t,e){return this.strokeWidth=e,this.context.isPointInStroke(t.x,t.y)},vt.hitPixel=function(t,e,i=1){let{x:a,y:s,radiusX:n,radiusY:r}=t;e&&(a-=e.x,s-=e.y),w.set(a-n,s-r,2*n,2*r).scale(i).ceil();const{data:o}=this.context.getImageData(w.x,w.y,w.width,w.height);for(let t=0,e=o.length;t<e;t+=4)if(o[t+3]>0)return!0;return o[3]>0};const{toInnerRadiusPointOf:ft,copy:Et,setRadius:Dt}=f,yt={},Ot=R.prototype;Ot.__hitWorld=function(t){this.__.hitRadius&&(Et(yt,t),Dt(t=yt,this.__.hitRadius)),ft(t,this.__world,yt);const{width:e,height:i}=this.__world,a=e<10&&i<10;if(this.__.hitBox||a){if(D.hitRadiusPoint(this.__layout.boxBounds,yt))return!0;if(a)return!1}return!this.__layout.hitCanvasChanged&&this.__hitCanvas||(this.__updateHitCanvas(),this.__layout.boundsChanged||(this.__layout.hitCanvasChanged=!1)),this.__hit(yt)},Ot.__hitFill=function(t){var e;return null===(e=this.__hitCanvas)||void 0===e?void 0:e.hitFill(t,this.__.windingRule)},Ot.__hitStroke=function(t,e){var i;return null===(i=this.__hitCanvas)||void 0===i?void 0:i.hitStroke(t,e)},Ot.__hitPixel=function(t){var e;return null===(e=this.__hitCanvas)||void 0===e?void 0:e.hitPixel(t,this.__layout.renderBounds,this.__hitCanvas.hitScale)},Ot.__drawHitPath=function(t){t&&this.__drawRenderPath(t)};const Pt=new C,Tt=i.prototype;Tt.__updateHitCanvas=function(){const t=this.__,{hitCanvasManager:e}=this.leafer,i=t.__pixelFill&&"pixel"===t.hitFill,s=t.__pixelStroke&&"pixel"===t.hitStroke,n=i||s;this.__hitCanvas||(this.__hitCanvas=n?e.getPixelType(this,{contextSettings:{willReadFrequently:!0}}):e.getPathType(this));const r=this.__hitCanvas;if(n){const{renderBounds:e}=this.__layout,n=L.image.hitCanvasSize,o=r.hitScale=w.set(0,0,n,n).getFitMatrix(e,.5).a,{x:h,y:d,width:c,height:l}=w.set(e).scale(o);r.resize({width:c,height:l,pixelRatio:1}),r.clear(),a.patternLocked=!0,this.__renderShape(r,{matrix:Pt.setWith(this.__world).scaleWith(1/o).invertWith().translate(-h,-d)},!i,!s),a.patternLocked=!1,r.resetTransform(),t.__isHitPixel=!0}else t.__isHitPixel&&(t.__isHitPixel=!1);this.__drawHitPath(r),r.setStrokeOptions(t)},Tt.__hit=function(t){"miniapp"===L.name&&this.__drawHitPath(this.__hitCanvas);const e=this.__;if(e.__isHitPixel&&this.__hitPixel(t))return!0;const{hitFill:i}=e,a=e.fill&&"path"==i||"all"===i;if(a&&this.__hitFill(t))return!0;const{hitStroke:s,__strokeWidth:n}=e,r=e.stroke&&"path"==s||"all"===s;if(!a&&!r)return!1;const o=2*t.radiusX;let h=o;if(r)switch(e.strokeAlign){case"inside":if(h+=2*n,!a&&this.__hitFill(t)&&this.__hitStroke(t,h))return!0;h=o;break;case"center":h+=n;break;case"outside":if(h+=2*n,!a){if(!this.__hitFill(t)&&this.__hitStroke(t,h))return!0;h=o}}return!!h&&this.__hitStroke(t,h)};const wt=new i;s.prototype.__updateHitCanvas=function(){(this.stroke||this.cornerRadius)&&wt.__updateHitCanvas.call(this)},s.prototype.__hitFill=function(t){return this.__hitCanvas?wt.__hitFill.call(this,t):D.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},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{x as App,mt as Cursor,W as DragEvent,N as DropEvent,_t as HitCanvasManager,pt as InteractionBase,q as InteractionHelper,j as KeyEvent,S as Keyboard,X as LeaferTypeCreator,z as MoveEvent,ht as MultiTouchHelper,A as PointerButton,H as PointerEvent,F as RotateEvent,I as SwipeEvent,k as UIEvent,V as ZoomEvent};