@plait/core 0.22.0 → 0.24.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/board/board.component.interface.d.ts +2 -2
  2. package/constants/index.d.ts +0 -1
  3. package/esm2020/board/board.component.interface.mjs +1 -1
  4. package/esm2020/board/board.component.mjs +71 -18
  5. package/esm2020/constants/index.mjs +1 -2
  6. package/esm2020/constants/keycodes.mjs +1 -1
  7. package/esm2020/constants/resize.mjs +1 -1
  8. package/esm2020/constants/selection.mjs +1 -1
  9. package/esm2020/core/children/children.component.mjs +1 -1
  10. package/esm2020/core/children/effect.mjs +1 -1
  11. package/esm2020/core/element/context-change.mjs +1 -1
  12. package/esm2020/core/element/context.mjs +1 -1
  13. package/esm2020/core/element/element.component.mjs +1 -1
  14. package/esm2020/core/element/plugin-element.mjs +1 -1
  15. package/esm2020/core/island/island-base.component.mjs +1 -1
  16. package/esm2020/interfaces/board.mjs +9 -5
  17. package/esm2020/interfaces/custom-types.mjs +1 -1
  18. package/esm2020/interfaces/element.mjs +1 -1
  19. package/esm2020/interfaces/history.mjs +1 -1
  20. package/esm2020/interfaces/index.mjs +1 -1
  21. package/esm2020/interfaces/node.mjs +1 -1
  22. package/esm2020/interfaces/operation.mjs +1 -1
  23. package/esm2020/interfaces/path-ref.mjs +1 -1
  24. package/esm2020/interfaces/path.mjs +1 -1
  25. package/esm2020/interfaces/plugin-key.mjs +1 -1
  26. package/esm2020/interfaces/plugin.mjs +1 -1
  27. package/esm2020/interfaces/point.mjs +1 -1
  28. package/esm2020/interfaces/pointer.mjs +1 -1
  29. package/esm2020/interfaces/rectangle-client.mjs +1 -1
  30. package/esm2020/interfaces/selection.mjs +1 -1
  31. package/esm2020/interfaces/theme.mjs +1 -1
  32. package/esm2020/interfaces/viewport.mjs +1 -1
  33. package/esm2020/plait-core.mjs +1 -1
  34. package/esm2020/plait.module.mjs +1 -1
  35. package/esm2020/plugins/create-board.mjs +10 -2
  36. package/esm2020/plugins/with-board.mjs +1 -1
  37. package/esm2020/plugins/with-hand.mjs +1 -1
  38. package/esm2020/plugins/with-history.mjs +1 -1
  39. package/esm2020/plugins/with-hotkey.mjs +1 -1
  40. package/esm2020/plugins/with-moving.mjs +6 -4
  41. package/esm2020/plugins/with-options.mjs +1 -1
  42. package/esm2020/plugins/with-selection.mjs +15 -18
  43. package/esm2020/plugins/with-viewport.mjs +1 -1
  44. package/esm2020/public-api.mjs +1 -1
  45. package/esm2020/services/image-context.service.mjs +1 -1
  46. package/esm2020/testing/core/create-board.mjs +1 -1
  47. package/esm2020/testing/core/fake-weak-map.mjs +1 -1
  48. package/esm2020/testing/core/index.mjs +1 -1
  49. package/esm2020/testing/fake-events/event-objects.mjs +1 -1
  50. package/esm2020/testing/fake-events/index.mjs +1 -1
  51. package/esm2020/testing/index.mjs +1 -1
  52. package/esm2020/testing/test-element.mjs +1 -1
  53. package/esm2020/transforms/board.mjs +1 -1
  54. package/esm2020/transforms/general.mjs +1 -1
  55. package/esm2020/transforms/index.mjs +1 -1
  56. package/esm2020/transforms/node.mjs +1 -1
  57. package/esm2020/transforms/selection.mjs +1 -1
  58. package/esm2020/transforms/theme.mjs +1 -1
  59. package/esm2020/transforms/viewport.mjs +1 -1
  60. package/esm2020/utils/board.mjs +1 -1
  61. package/esm2020/utils/clipboard.mjs +45 -0
  62. package/esm2020/utils/common.mjs +1 -1
  63. package/esm2020/utils/dom/common.mjs +1 -1
  64. package/esm2020/utils/dom/environment.mjs +1 -1
  65. package/esm2020/utils/dom/foreign.mjs +1 -1
  66. package/esm2020/utils/dom/index.mjs +1 -1
  67. package/esm2020/utils/draw/arrow.mjs +1 -1
  68. package/esm2020/utils/draw/circle.mjs +1 -1
  69. package/esm2020/utils/draw/line.mjs +1 -1
  70. package/esm2020/utils/draw/rectangle.mjs +1 -1
  71. package/esm2020/utils/element.mjs +1 -1
  72. package/esm2020/utils/environment.mjs +1 -1
  73. package/esm2020/utils/helper.mjs +1 -1
  74. package/esm2020/utils/history.mjs +1 -1
  75. package/esm2020/utils/hotkeys.mjs +1 -1
  76. package/esm2020/utils/id-creator.mjs +1 -1
  77. package/esm2020/utils/index.mjs +3 -1
  78. package/esm2020/utils/math.mjs +1 -1
  79. package/esm2020/utils/moving-element.mjs +1 -1
  80. package/esm2020/utils/selected-element.mjs +1 -1
  81. package/esm2020/utils/to-image.mjs +1 -1
  82. package/esm2020/utils/touch.mjs +8 -0
  83. package/esm2020/utils/tree.mjs +1 -1
  84. package/esm2020/utils/viewport.mjs +1 -1
  85. package/esm2020/utils/weak-maps.mjs +2 -1
  86. package/fesm2015/plait-core.mjs +156 -45
  87. package/fesm2015/plait-core.mjs.map +1 -1
  88. package/fesm2020/plait-core.mjs +156 -42
  89. package/fesm2020/plait-core.mjs.map +1 -1
  90. package/interfaces/board.d.ts +15 -6
  91. package/interfaces/operation.d.ts +1 -1
  92. package/package.json +1 -1
  93. package/plugins/with-selection.d.ts +0 -4
  94. package/styles/styles.scss +7 -1
  95. package/utils/clipboard.d.ts +8 -0
  96. package/utils/index.d.ts +2 -0
  97. package/utils/touch.d.ts +3 -0
  98. package/utils/weak-maps.d.ts +1 -0
@@ -28,6 +28,7 @@ const BOARD_TO_IS_SELECTION_MOVING = new WeakMap();
28
28
  // save no standard selected elements
29
29
  const BOARD_TO_TEMPORARY_ELEMENTS = new WeakMap();
30
30
  const BOARD_TO_MOVING_ELEMENT = new WeakMap();
31
+ const IS_PREVENT_TOUCH_MOVE = new WeakMap();
31
32
  const PATH_REFS = new WeakMap();
32
33
 
33
34
  function depthFirstRecursion(node, callback, recursion, isReverse) {
@@ -232,13 +233,13 @@ const PlaitBoard = {
232
233
  var _a;
233
234
  return (_a = BOARD_TO_ELEMENT_HOST.get(board)) === null || _a === void 0 ? void 0 : _a.host;
234
235
  },
235
- getElementHostUp(board) {
236
+ getElementUpperHost(board) {
236
237
  var _a;
237
- return (_a = BOARD_TO_ELEMENT_HOST.get(board)) === null || _a === void 0 ? void 0 : _a.hostUp;
238
+ return (_a = BOARD_TO_ELEMENT_HOST.get(board)) === null || _a === void 0 ? void 0 : _a.upperHost;
238
239
  },
239
- getElementHostActive(board) {
240
+ getElementActiveHost(board) {
240
241
  var _a;
241
- return (_a = BOARD_TO_ELEMENT_HOST.get(board)) === null || _a === void 0 ? void 0 : _a.hostActive;
242
+ return (_a = BOARD_TO_ELEMENT_HOST.get(board)) === null || _a === void 0 ? void 0 : _a.activeHost;
242
243
  },
243
244
  getRoughSVG(board) {
244
245
  return BOARD_TO_ROUGH_SVG.get(board);
@@ -270,6 +271,10 @@ const PlaitBoard = {
270
271
  isPointer(board, pointer) {
271
272
  return board.pointer === pointer;
272
273
  },
274
+ isInPointer(board, pointers) {
275
+ const point = board.pointer;
276
+ return pointers.includes(point);
277
+ },
273
278
  getMovingPointInBoard(board) {
274
279
  return BOARD_TO_MOVING_POINT_IN_BOARD.get(board);
275
280
  },
@@ -874,7 +879,6 @@ var ResizeCursorClass;
874
879
  const ATTACHED_ELEMENT_CLASS_NAME = 'plait-board-attached';
875
880
 
876
881
  const CLIP_BOARD_FORMAT_KEY = 'x-plait-fragment';
877
- const CLIP_BOARD_IMAGE_FORMAT_KEY = 'x-plait-image-fragment';
878
882
  const HOST_CLASS_NAME = 'plait-board-container';
879
883
  const SCROLL_BAR_WIDTH = 20;
880
884
  const MAX_RADIUS = 16;
@@ -1571,6 +1575,57 @@ function downloadImage(url, name) {
1571
1575
  a.remove();
1572
1576
  }
1573
1577
 
1578
+ const getClipboardByKey = (key) => {
1579
+ return `application/x-plait-${key}-fragment`;
1580
+ };
1581
+ const setClipboardData = (data, elements) => {
1582
+ const result = [...elements];
1583
+ const pluginContextResult = getDataFromClipboard(data);
1584
+ if (pluginContextResult) {
1585
+ result.push(...pluginContextResult);
1586
+ }
1587
+ const stringObj = JSON.stringify(result);
1588
+ const encoded = window.btoa(encodeURIComponent(stringObj));
1589
+ data === null || data === void 0 ? void 0 : data.setData(`application/${CLIP_BOARD_FORMAT_KEY}`, encoded);
1590
+ };
1591
+ const setClipboardDataByText = (data, text) => {
1592
+ const pluginContextResult = getTextFromClipboard(data);
1593
+ data === null || data === void 0 ? void 0 : data.setData(`text/plain`, text + '\n' + pluginContextResult);
1594
+ };
1595
+ const setClipboardDataByMedia = (data, media, key) => {
1596
+ const stringObj = JSON.stringify(media);
1597
+ const encoded = window.btoa(encodeURIComponent(stringObj));
1598
+ data === null || data === void 0 ? void 0 : data.setData(getClipboardByKey(key), encoded);
1599
+ };
1600
+ const getDataFromClipboard = (data) => {
1601
+ const encoded = data === null || data === void 0 ? void 0 : data.getData(`application/${CLIP_BOARD_FORMAT_KEY}`);
1602
+ let nodesData = [];
1603
+ if (encoded) {
1604
+ const decoded = decodeURIComponent(window.atob(encoded));
1605
+ nodesData = JSON.parse(decoded);
1606
+ }
1607
+ return nodesData;
1608
+ };
1609
+ const getTextFromClipboard = (data) => {
1610
+ return (data ? data.getData(`text/plain`) : '');
1611
+ };
1612
+ const getClipboardDataByMedia = (data, key) => {
1613
+ const encoded = data === null || data === void 0 ? void 0 : data.getData(getClipboardByKey(key));
1614
+ let imageItem = null;
1615
+ if (encoded) {
1616
+ const decoded = decodeURIComponent(window.atob(encoded));
1617
+ imageItem = JSON.parse(decoded);
1618
+ }
1619
+ return imageItem;
1620
+ };
1621
+
1622
+ const isPreventTouchMove = (board) => {
1623
+ return !!IS_PREVENT_TOUCH_MOVE.get(board);
1624
+ };
1625
+ const preventTouchMove = (board, state) => {
1626
+ IS_PREVENT_TOUCH_MOVE.set(board, state);
1627
+ };
1628
+
1574
1629
  const PlaitElement = {
1575
1630
  isRootElement(value) {
1576
1631
  const parent = NODE_TO_PARENT.get(value);
@@ -2082,7 +2137,15 @@ function createBoard(children, options) {
2082
2137
  isRecursion: element => true,
2083
2138
  isMovable: element => false,
2084
2139
  getRectangle: element => null,
2085
- applyTheme: (element) => { }
2140
+ applyTheme: (element) => { },
2141
+ pointerDown: (pointer) => { },
2142
+ pointerMove: (pointer) => { },
2143
+ pointerUp: (pointer) => { },
2144
+ pointerCancel: (pointer) => { },
2145
+ pointerOut: (pointer) => { },
2146
+ pointerLeave: (pointer) => { },
2147
+ globalPointerMove: (pointer) => { },
2148
+ globalPointerUp: (pointer) => { },
2086
2149
  };
2087
2150
  return board;
2088
2151
  }
@@ -2238,7 +2301,7 @@ function withHandPointer(board) {
2238
2301
  }
2239
2302
 
2240
2303
  function withSelection(board) {
2241
- const { mousedown, globalMousemove, globalMouseup, onChange } = board;
2304
+ const { pointerDown, globalPointerMove, globalPointerUp, onChange } = board;
2242
2305
  let start = null;
2243
2306
  let end = null;
2244
2307
  let selectionMovingG;
@@ -2246,12 +2309,12 @@ function withSelection(board) {
2246
2309
  let previousSelectedElements;
2247
2310
  // prevent text from being selected when user pressed main pointer and is moving
2248
2311
  let needPreventNativeSelectionWhenMoving = false;
2249
- board.mousedown = (event) => {
2312
+ board.pointerDown = (event) => {
2250
2313
  if (event.target instanceof Element && !event.target.closest('.plait-richtext-container')) {
2251
2314
  needPreventNativeSelectionWhenMoving = true;
2252
2315
  }
2253
2316
  if (!isMainPointer(event)) {
2254
- mousedown(event);
2317
+ pointerDown(event);
2255
2318
  return;
2256
2319
  }
2257
2320
  const options = board.getPluginOptions(PlaitPluginKey.withSelection);
@@ -2260,7 +2323,7 @@ function withSelection(board) {
2260
2323
  const hitElements = getHitElements(board, { ranges: [range] });
2261
2324
  const selectedElements = getSelectedElements(board);
2262
2325
  if (hitElements.length === 1 && selectedElements.includes(hitElements[0]) && !options.isDisabledSelect) {
2263
- mousedown(event);
2326
+ pointerDown(event);
2264
2327
  return;
2265
2328
  }
2266
2329
  if (PlaitBoard.isPointer(board, PlaitPointerType.selection) &&
@@ -2268,13 +2331,15 @@ function withSelection(board) {
2268
2331
  options.isMultiple &&
2269
2332
  !options.isDisabledSelect) {
2270
2333
  start = point;
2334
+ preventTouchMove(board, true);
2271
2335
  }
2272
2336
  Transforms.setSelection(board, { ranges: [range] });
2273
- mousedown(event);
2337
+ pointerDown(event);
2274
2338
  };
2275
- board.globalMousemove = (event) => {
2339
+ board.globalPointerMove = (event) => {
2276
2340
  if (needPreventNativeSelectionWhenMoving) {
2277
- preventNativeSelection(board, event);
2341
+ // prevent text from being selected
2342
+ event.preventDefault();
2278
2343
  }
2279
2344
  if (start) {
2280
2345
  const movedTarget = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
@@ -2298,9 +2363,9 @@ function withSelection(board) {
2298
2363
  PlaitBoard.getHost(board).append(selectionMovingG);
2299
2364
  }
2300
2365
  }
2301
- globalMousemove(event);
2366
+ globalPointerMove(event);
2302
2367
  };
2303
- board.globalMouseup = (event) => {
2368
+ board.globalPointerUp = (event) => {
2304
2369
  if (start && end) {
2305
2370
  selectionMovingG === null || selectionMovingG === void 0 ? void 0 : selectionMovingG.remove();
2306
2371
  clearSelectionMoving(board);
@@ -2319,7 +2384,8 @@ function withSelection(board) {
2319
2384
  start = null;
2320
2385
  end = null;
2321
2386
  needPreventNativeSelectionWhenMoving = false;
2322
- globalMouseup(event);
2387
+ preventTouchMove(board, false);
2388
+ globalPointerUp(event);
2323
2389
  };
2324
2390
  board.onChange = () => {
2325
2391
  const options = board.getPluginOptions(PlaitPluginKey.withSelection);
@@ -2404,12 +2470,6 @@ function createSelectionOuterG(board, selectElements) {
2404
2470
  fillStyle: 'solid'
2405
2471
  });
2406
2472
  }
2407
- /**
2408
- * prevent text from being selected
2409
- */
2410
- const preventNativeSelection = (board, event) => {
2411
- event.preventDefault();
2412
- };
2413
2473
 
2414
2474
  function withViewport(board) {
2415
2475
  const { onChange } = board;
@@ -2465,7 +2525,7 @@ function withMoving(board) {
2465
2525
  mousedown(event);
2466
2526
  };
2467
2527
  board.mousemove = event => {
2468
- if (startPoint && (activeElements === null || activeElements === void 0 ? void 0 : activeElements.length) && !PlaitBoard.hasBeenTextEditing(board)) {
2528
+ if (startPoint && activeElements.length && !PlaitBoard.hasBeenTextEditing(board)) {
2469
2529
  if (!isPreventDefault) {
2470
2530
  isPreventDefault = true;
2471
2531
  }
@@ -2477,10 +2537,12 @@ function withMoving(board) {
2477
2537
  if (Math.abs(offsetX) > offsetBuffer || Math.abs(offsetY) > offsetBuffer) {
2478
2538
  throttleRAF(() => {
2479
2539
  const currentElements = activeElements.map(activeElement => {
2480
- const [x, y] = activeElement === null || activeElement === void 0 ? void 0 : activeElement.points[0];
2540
+ const points = activeElement.points || [];
2541
+ const [x, y] = activeElement.points[0];
2542
+ const newPoints = points.map(p => [p[0] + offsetX, p[1] + offsetY]);
2481
2543
  const index = board.children.findIndex(item => item.id === activeElement.id);
2482
2544
  Transforms.setNode(board, {
2483
- points: [[x + offsetX, y + offsetY]]
2545
+ points: newPoints
2484
2546
  }, [index]);
2485
2547
  MERGING.set(board, true);
2486
2548
  return PlaitNode.get(board, [index]);
@@ -2828,8 +2890,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
2828
2890
  }] } });
2829
2891
 
2830
2892
  const ElementHostClass = 'element-host';
2831
- const ElementHostUpClass = 'element-host-up';
2832
- const ElementHostActiveClass = 'element-host-active';
2893
+ const ElementUpperHostClass = 'element-upper-host';
2894
+ const ElementActiveHostClass = 'element-active-host';
2833
2895
  class PlaitBoardComponent {
2834
2896
  get host() {
2835
2897
  return this.svg.nativeElement;
@@ -2879,8 +2941,8 @@ class PlaitBoardComponent {
2879
2941
  }
2880
2942
  ngOnInit() {
2881
2943
  const elementHost = this.host.querySelector(`.${ElementHostClass}`);
2882
- const elementHostUp = this.host.querySelector(`.${ElementHostUpClass}`);
2883
- const elementHostActive = this.host.querySelector(`.${ElementHostActiveClass}`);
2944
+ const elementUpperHost = this.host.querySelector(`.${ElementUpperHostClass}`);
2945
+ const elementActiveHost = this.host.querySelector(`.${ElementActiveHostClass}`);
2884
2946
  const roughSVG = rough.svg(this.host, {
2885
2947
  options: { roughness: 0, strokeWidth: 1 }
2886
2948
  });
@@ -2901,8 +2963,8 @@ class PlaitBoardComponent {
2901
2963
  BOARD_TO_HOST.set(this.board, this.host);
2902
2964
  BOARD_TO_ELEMENT_HOST.set(this.board, {
2903
2965
  host: elementHost,
2904
- hostUp: elementHostUp,
2905
- hostActive: elementHostActive
2966
+ upperHost: elementUpperHost,
2967
+ activeHost: elementActiveHost
2906
2968
  });
2907
2969
  BOARD_TO_ON_CHANGE.set(this.board, () => {
2908
2970
  this.ngZone.run(() => {
@@ -2963,34 +3025,67 @@ class PlaitBoardComponent {
2963
3025
  .subscribe((event) => {
2964
3026
  this.board.mousedown(event);
2965
3027
  });
3028
+ fromEvent(this.host, 'pointerdown')
3029
+ .pipe(takeUntil(this.destroy$))
3030
+ .subscribe((event) => {
3031
+ this.board.pointerDown(event);
3032
+ });
2966
3033
  fromEvent(this.host, 'mousemove')
2967
3034
  .pipe(takeUntil(this.destroy$))
2968
3035
  .subscribe((event) => {
2969
3036
  BOARD_TO_MOVING_POINT_IN_BOARD.set(this.board, [event.x, event.y]);
2970
3037
  this.board.mousemove(event);
2971
3038
  });
3039
+ fromEvent(this.host, 'pointermove')
3040
+ .pipe(takeUntil(this.destroy$))
3041
+ .subscribe((event) => {
3042
+ BOARD_TO_MOVING_POINT_IN_BOARD.set(this.board, [event.x, event.y]);
3043
+ this.board.pointerMove(event);
3044
+ });
2972
3045
  fromEvent(this.host, 'mouseleave')
2973
3046
  .pipe(takeUntil(this.destroy$))
2974
3047
  .subscribe((event) => {
2975
3048
  BOARD_TO_MOVING_POINT_IN_BOARD.delete(this.board);
2976
3049
  this.board.mouseleave(event);
2977
3050
  });
3051
+ fromEvent(this.host, 'pointerleave')
3052
+ .pipe(takeUntil(this.destroy$))
3053
+ .subscribe((event) => {
3054
+ BOARD_TO_MOVING_POINT_IN_BOARD.delete(this.board);
3055
+ this.board.pointerLeave(event);
3056
+ });
2978
3057
  fromEvent(document, 'mousemove')
2979
3058
  .pipe(takeUntil(this.destroy$))
2980
3059
  .subscribe((event) => {
2981
3060
  BOARD_TO_MOVING_POINT.set(this.board, [event.x, event.y]);
2982
3061
  this.board.globalMousemove(event);
2983
3062
  });
3063
+ fromEvent(document, 'pointermove')
3064
+ .pipe(takeUntil(this.destroy$))
3065
+ .subscribe((event) => {
3066
+ BOARD_TO_MOVING_POINT.set(this.board, [event.x, event.y]);
3067
+ this.board.globalPointerMove(event);
3068
+ });
2984
3069
  fromEvent(this.host, 'mouseup')
2985
3070
  .pipe(takeUntil(this.destroy$))
2986
3071
  .subscribe((event) => {
2987
3072
  this.board.mouseup(event);
2988
3073
  });
3074
+ fromEvent(this.host, 'pointerup')
3075
+ .pipe(takeUntil(this.destroy$))
3076
+ .subscribe((event) => {
3077
+ this.board.pointerUp(event);
3078
+ });
2989
3079
  fromEvent(document, 'mouseup')
2990
3080
  .pipe(takeUntil(this.destroy$))
2991
3081
  .subscribe((event) => {
2992
3082
  this.board.globalMouseup(event);
2993
3083
  });
3084
+ fromEvent(document, 'pointerup')
3085
+ .pipe(takeUntil(this.destroy$))
3086
+ .subscribe((event) => {
3087
+ this.board.globalPointerUp(event);
3088
+ });
2994
3089
  fromEvent(this.host, 'dblclick')
2995
3090
  .pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board)))
2996
3091
  .subscribe((event) => {
@@ -3001,8 +3096,11 @@ class PlaitBoardComponent {
3001
3096
  this.board.globalKeydown(event);
3002
3097
  }), filter(event => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board) && !hasInputOrTextareaTarget(event.target)))
3003
3098
  .subscribe((event) => {
3004
- var _a;
3005
- (_a = this.board) === null || _a === void 0 ? void 0 : _a.keydown(event);
3099
+ const selectedElements = getSelectedElements(this.board);
3100
+ if (selectedElements.length > 0 && (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event))) {
3101
+ this.board.deleteFragment(null);
3102
+ }
3103
+ this.board.keydown(event);
3006
3104
  });
3007
3105
  fromEvent(document, 'keyup')
3008
3106
  .pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board)))
@@ -3013,9 +3111,12 @@ class PlaitBoardComponent {
3013
3111
  fromEvent(document, 'copy')
3014
3112
  .pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board)))
3015
3113
  .subscribe((event) => {
3016
- var _a;
3017
- event.preventDefault();
3018
- (_a = this.board) === null || _a === void 0 ? void 0 : _a.setFragment(event.clipboardData);
3114
+ const selectedElements = getSelectedElements(this.board);
3115
+ if (selectedElements.length > 0) {
3116
+ event.preventDefault();
3117
+ const rectangle = getRectangleByElements(this.board, selectedElements, false);
3118
+ this.board.setFragment(event.clipboardData, rectangle);
3119
+ }
3019
3120
  });
3020
3121
  fromEvent(document, 'paste')
3021
3122
  .pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.isReadonly(this.board) && !PlaitBoard.hasBeenTextEditing(this.board)))
@@ -3029,10 +3130,13 @@ class PlaitBoardComponent {
3029
3130
  fromEvent(document, 'cut')
3030
3131
  .pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.isReadonly(this.board) && !PlaitBoard.hasBeenTextEditing(this.board)))
3031
3132
  .subscribe((event) => {
3032
- var _a, _b;
3033
- event.preventDefault();
3034
- (_a = this.board) === null || _a === void 0 ? void 0 : _a.setFragment(event.clipboardData);
3035
- (_b = this.board) === null || _b === void 0 ? void 0 : _b.deleteFragment(event.clipboardData);
3133
+ const selectedElements = getSelectedElements(this.board);
3134
+ if (selectedElements.length > 0) {
3135
+ event.preventDefault();
3136
+ const rectangle = getRectangleByElements(this.board, selectedElements, false);
3137
+ this.board.setFragment(event.clipboardData, rectangle);
3138
+ this.board.deleteFragment(event.clipboardData);
3139
+ }
3036
3140
  });
3037
3141
  }
3038
3142
  viewportScrollListener() {
@@ -3057,6 +3161,13 @@ class PlaitBoardComponent {
3057
3161
  setIsFromScrolling(this.board, true);
3058
3162
  });
3059
3163
  });
3164
+ this.ngZone.runOutsideAngular(() => {
3165
+ fromEvent(this.viewportContainer.nativeElement, 'touchmove', { passive: false }).subscribe((event) => {
3166
+ if (isPreventTouchMove(this.board)) {
3167
+ event.preventDefault();
3168
+ }
3169
+ });
3170
+ });
3060
3171
  }
3061
3172
  elementResizeListener() {
3062
3173
  this.resizeObserver = new ResizeObserver(() => {
@@ -3105,8 +3216,8 @@ PlaitBoardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ve
3105
3216
  <div class="viewport-container" #viewportContainer>
3106
3217
  <svg #svg width="100%" height="100%" style="position: relative;" class="board-host-svg">
3107
3218
  <g class="element-host"></g>
3108
- <g class="element-host-up"></g>
3109
- <g class="element-host-active"></g>
3219
+ <g class="element-upper-host"></g>
3220
+ <g class="element-active-host"></g>
3110
3221
  </svg>
3111
3222
  <plait-children [board]="board" [effect]="effect"></plait-children>
3112
3223
  </div>
@@ -3120,8 +3231,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
3120
3231
  <div class="viewport-container" #viewportContainer>
3121
3232
  <svg #svg width="100%" height="100%" style="position: relative;" class="board-host-svg">
3122
3233
  <g class="element-host"></g>
3123
- <g class="element-host-up"></g>
3124
- <g class="element-host-active"></g>
3234
+ <g class="element-upper-host"></g>
3235
+ <g class="element-active-host"></g>
3125
3236
  </svg>
3126
3237
  <plait-children [board]="board" [effect]="effect"></plait-children>
3127
3238
  </div>
@@ -3343,5 +3454,5 @@ function createModModifierKeys() {
3343
3454
  * Generated bundle index. Do not edit.
3344
3455
  */
3345
3456
 
3346
- export { A, ALT, APOSTROPHE, ATTACHED_ELEMENT_CLASS_NAME, AT_SIGN, B, BACKSLASH, BACKSPACE, BOARD_TO_COMPONENT, BOARD_TO_ELEMENT_HOST, BOARD_TO_HOST, BOARD_TO_IS_SELECTION_MOVING, BOARD_TO_MOVING_ELEMENT, BOARD_TO_MOVING_POINT, BOARD_TO_MOVING_POINT_IN_BOARD, BOARD_TO_ON_CHANGE, BOARD_TO_ROUGH_SVG, BOARD_TO_SELECTED_ELEMENT, BOARD_TO_TEMPORARY_ELEMENTS, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, C, CAPS_LOCK, CLIP_BOARD_FORMAT_KEY, CLIP_BOARD_IMAGE_FORMAT_KEY, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, ColorfulThemeColor, D, DASH, DELETE, DOWN_ARROW, DarkThemeColor, DefaultThemeColor, E, EIGHT, ELEMENT_TO_COMPONENT, END, ENTER, EQUALS, ESCAPE, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FLUSHING, FOUR, G, H, HOME, HOST_CLASS_NAME, I, INSERT, IS_APPLE, IS_BOARD_CACHE, IS_CHROME, IS_CHROME_LEGACY, IS_EDGE_LEGACY, IS_FIREFOX, IS_IOS, IS_MAC, IS_SAFARI, IS_TEXT_EDITABLE, J, K, L, LAST_MEDIA, LEFT_ARROW, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, MAX_RADIUS, MERGING, META, MUTE, N, NINE, NODE_TO_INDEX, NODE_TO_PARENT, NS, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PATH_REFS, PAUSE, PERIOD, PLUS_SIGN, POINTER_BUTTON, PRESS_AND_MOVE_BUFFER, PRINT_SCREEN, Path, PlaitBoard, PlaitBoardComponent, PlaitChildrenElement, PlaitContextService, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitIslandPopoverBaseComponent, PlaitModule, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, Q, QUESTION_MARK, R, RIGHT_ARROW, RectangleClient, ResizeCursorClass, RetroThemeColor, S, SAVING, SCROLL_BAR_WIDTH, SCROLL_LOCK, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, Selection, SoftThemeColor, StarryThemeColor, T, TAB, THREE, TILDE, TWO, ThemeColorMode, ThemeColors, Transforms, U, UP_ARROW, V, VOLUME_DOWN, VOLUME_UP, Viewport, W, X, Y, Z, ZERO, addMovingElements, addSelectedElement, arrowPoints, cacheMovingElements, cacheSelectedElements, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createFakeEvent, createForeignObject, createG, createKeyboardEvent, createModModifierKeys, createMouseEvent, createPath, createPointerEvent, createSVG, createSelectionOuterG, createTestingBoard, createText, createTouchEvent, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, downloadImage, drawArrow, drawBezierPath, drawCircle, drawLine, drawLinearPath, drawRoundRectangle, fakeNodeWeakMap, getBoardRectangle, getElementHostBBox, getHitElementOfRoot, getHitElements, getIsRecursionFunc, getMovingElements, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isHitElements, isInPlaitBoard, isMainPointer, isNullOrUndefined, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetViewportOperation, normalizePoint, preventNativeSelection, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setIsFromScrolling, setIsFromViewportChange, setSVGViewBox, setSelectionMoving, shouldClear, shouldMerge, shouldSave, throttleRAF, toImage, toPoint, transformPoint, transformPoints, updateForeignObject, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
3457
+ export { A, ALT, APOSTROPHE, ATTACHED_ELEMENT_CLASS_NAME, AT_SIGN, B, BACKSLASH, BACKSPACE, BOARD_TO_COMPONENT, BOARD_TO_ELEMENT_HOST, BOARD_TO_HOST, BOARD_TO_IS_SELECTION_MOVING, BOARD_TO_MOVING_ELEMENT, BOARD_TO_MOVING_POINT, BOARD_TO_MOVING_POINT_IN_BOARD, BOARD_TO_ON_CHANGE, BOARD_TO_ROUGH_SVG, BOARD_TO_SELECTED_ELEMENT, BOARD_TO_TEMPORARY_ELEMENTS, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, C, CAPS_LOCK, CLIP_BOARD_FORMAT_KEY, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, ColorfulThemeColor, D, DASH, DELETE, DOWN_ARROW, DarkThemeColor, DefaultThemeColor, E, EIGHT, ELEMENT_TO_COMPONENT, END, ENTER, EQUALS, ESCAPE, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FLUSHING, FOUR, G, H, HOME, HOST_CLASS_NAME, I, INSERT, IS_APPLE, IS_BOARD_CACHE, IS_CHROME, IS_CHROME_LEGACY, IS_EDGE_LEGACY, IS_FIREFOX, IS_IOS, IS_MAC, IS_PREVENT_TOUCH_MOVE, IS_SAFARI, IS_TEXT_EDITABLE, J, K, L, LAST_MEDIA, LEFT_ARROW, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, MAX_RADIUS, MERGING, META, MUTE, N, NINE, NODE_TO_INDEX, NODE_TO_PARENT, NS, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PATH_REFS, PAUSE, PERIOD, PLUS_SIGN, POINTER_BUTTON, PRESS_AND_MOVE_BUFFER, PRINT_SCREEN, Path, PlaitBoard, PlaitBoardComponent, PlaitChildrenElement, PlaitContextService, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitIslandPopoverBaseComponent, PlaitModule, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, Q, QUESTION_MARK, R, RIGHT_ARROW, RectangleClient, ResizeCursorClass, RetroThemeColor, S, SAVING, SCROLL_BAR_WIDTH, SCROLL_LOCK, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, Selection, SoftThemeColor, StarryThemeColor, T, TAB, THREE, TILDE, TWO, ThemeColorMode, ThemeColors, Transforms, U, UP_ARROW, V, VOLUME_DOWN, VOLUME_UP, Viewport, W, X, Y, Z, ZERO, addMovingElements, addSelectedElement, arrowPoints, cacheMovingElements, cacheSelectedElements, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createFakeEvent, createForeignObject, createG, createKeyboardEvent, createModModifierKeys, createMouseEvent, createPath, createPointerEvent, createSVG, createSelectionOuterG, createTestingBoard, createText, createTouchEvent, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, downloadImage, drawArrow, drawBezierPath, drawCircle, drawLine, drawLinearPath, drawRoundRectangle, fakeNodeWeakMap, getBoardRectangle, getClipboardByKey, getClipboardDataByMedia, getDataFromClipboard, getElementHostBBox, getHitElementOfRoot, getHitElements, getIsRecursionFunc, getMovingElements, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getTextFromClipboard, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isHitElements, isInPlaitBoard, isMainPointer, isNullOrUndefined, isPreventTouchMove, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetViewportOperation, normalizePoint, preventTouchMove, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setClipboardData, setClipboardDataByMedia, setClipboardDataByText, setIsFromScrolling, setIsFromViewportChange, setSVGViewBox, setSelectionMoving, shouldClear, shouldMerge, shouldSave, throttleRAF, toImage, toPoint, transformPoint, transformPoints, updateForeignObject, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
3347
3458
  //# sourceMappingURL=plait-core.mjs.map