@plait/core 0.38.0 → 0.40.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.
@@ -14,6 +14,7 @@ const NODE_TO_INDEX = new WeakMap();
14
14
  const NODE_TO_PARENT = new WeakMap();
15
15
  const IS_TEXT_EDITABLE = new WeakMap();
16
16
  const BOARD_TO_ON_CHANGE = new WeakMap();
17
+ const BOARD_TO_AFTER_CHANGE = new WeakMap();
17
18
  const BOARD_TO_COMPONENT = new WeakMap();
18
19
  const BOARD_TO_ROUGH_SVG = new WeakMap();
19
20
  const BOARD_TO_HOST = new WeakMap();
@@ -125,13 +126,29 @@ const getSelectedElements = (board) => {
125
126
  return BOARD_TO_SELECTED_ELEMENT.get(board) || [];
126
127
  };
127
128
  const addSelectedElement = (board, element) => {
129
+ let elements = [];
130
+ if (Array.isArray(element)) {
131
+ elements.push(...element);
132
+ }
133
+ else {
134
+ elements.push(element);
135
+ }
128
136
  const selectedElements = getSelectedElements(board);
129
- cacheSelectedElements(board, [...selectedElements, element]);
137
+ cacheSelectedElements(board, [...selectedElements, ...elements]);
130
138
  };
131
139
  const removeSelectedElement = (board, element) => {
132
140
  const selectedElements = getSelectedElements(board);
133
141
  if (selectedElements.includes(element)) {
134
- const newSelectedElements = selectedElements.filter(value => value !== element);
142
+ const targetElements = [];
143
+ if (board.isRecursion(element)) {
144
+ depthFirstRecursion(element, node => {
145
+ targetElements.push(node);
146
+ }, node => board.isRecursion(node));
147
+ }
148
+ else {
149
+ targetElements.push(element);
150
+ }
151
+ const newSelectedElements = selectedElements.filter(value => !targetElements.includes(value));
135
152
  cacheSelectedElements(board, newSelectedElements);
136
153
  }
137
154
  };
@@ -306,13 +323,30 @@ const POINTER_BUTTON = {
306
323
  SECONDARY: 2,
307
324
  TOUCH: -1
308
325
  };
309
- const PRESS_AND_MOVE_BUFFER = 5;
326
+ const PRESS_AND_MOVE_BUFFER = 3;
310
327
 
311
328
  const NS = 'http://www.w3.org/2000/svg';
312
- function toPoint(x, y, container) {
313
- const rect = container.getBoundingClientRect();
329
+ /**
330
+ * Get the screen coordinates starting from the upper left corner of the svg element (based on the svg screen coordinate system)
331
+ * @param x screen x
332
+ * @param y screen x
333
+ * @returns
334
+ */
335
+ function toPoint(x, y, svg) {
336
+ const rect = svg.getBoundingClientRect();
314
337
  return [x - rect.x, y - rect.y];
315
338
  }
339
+ /**
340
+ * `toPoint` reverse processing
341
+ * Get the screen coordinate starting from the upper left corner of the browser window (based on the screen coordinate system)
342
+ * @param point screen coordinates based on the upper left corner of the svg
343
+ * @returns
344
+ */
345
+ function toScreenPoint(board, point) {
346
+ const host = PlaitBoard.getHost(board);
347
+ const rect = host.getBoundingClientRect();
348
+ return [point[0] + rect.x, point[1] + rect.y];
349
+ }
316
350
  function createG() {
317
351
  const newG = document.createElementNS(NS, 'g');
318
352
  return newG;
@@ -552,8 +586,8 @@ const RectangleClient = {
552
586
  };
553
587
  },
554
588
  getGapCenter(rectangle1, rectangle2, isHorizontal) {
555
- const axis = isHorizontal ? 'y' : 'x';
556
- const side = isHorizontal ? 'height' : 'width';
589
+ const axis = isHorizontal ? 'x' : 'y';
590
+ const side = isHorizontal ? 'width' : 'height';
557
591
  const align = [rectangle1[axis], rectangle1[axis] + rectangle1[side], rectangle2[axis], rectangle2[axis] + rectangle2[side]];
558
592
  const sortArr = align.sort((a, b) => a - b);
559
593
  return (sortArr[1] + sortArr[2]) / 2;
@@ -635,12 +669,14 @@ function distanceBetweenPointAndSegments(points, point) {
635
669
  }
636
670
  return distance;
637
671
  }
638
- function getNearestPointBetweenPointAndSegments(point, points) {
672
+ function getNearestPointBetweenPointAndSegments(point, points, isClose = true) {
639
673
  const len = points.length;
640
674
  let distance = Infinity;
641
675
  let result = point;
642
676
  for (let i = 0; i < len; i++) {
643
677
  const p = points[i];
678
+ if (i === len - 1 && !isClose)
679
+ continue;
644
680
  const p2 = i === len - 1 ? points[0] : points[i + 1];
645
681
  const currentDistance = distanceBetweenPointAndSegment(point[0], point[1], p[0], p[1], p2[0], p2[1]);
646
682
  if (currentDistance < distance) {
@@ -1183,6 +1219,8 @@ function updateViewport(board, origination, zoom) {
1183
1219
  clearViewportOrigination(board);
1184
1220
  }
1185
1221
  const updatePointerType = (board, pointer) => {
1222
+ if (board.pointer === pointer)
1223
+ return;
1186
1224
  board.pointer = pointer;
1187
1225
  const boardComponent = BOARD_TO_COMPONENT.get(board);
1188
1226
  boardComponent?.markForCheck();
@@ -1285,6 +1323,13 @@ const BoardTransforms = {
1285
1323
 
1286
1324
  const IS_FROM_SCROLLING = new WeakMap();
1287
1325
  const IS_FROM_VIEWPORT_CHANGE = new WeakMap();
1326
+ function toSVGScreenPoint(board, point) {
1327
+ const { zoom } = board.viewport;
1328
+ const viewBox = getViewBox(board, zoom);
1329
+ const x = (point[0] - viewBox[0]) * zoom;
1330
+ const y = (point[1] - viewBox[1]) * zoom;
1331
+ return [x, y];
1332
+ }
1288
1333
  function getViewportContainerRect(board) {
1289
1334
  const { hideScrollbar } = board.options;
1290
1335
  const scrollBarWidth = hideScrollbar ? SCROLL_BAR_WIDTH : 0;
@@ -1372,17 +1417,17 @@ function updateViewportOffset(board) {
1372
1417
  if (!origination) {
1373
1418
  return;
1374
1419
  }
1375
- const { zoom } = board.viewport;
1376
- const viewBox = getViewBox(board, zoom);
1377
- const scrollLeft = (origination[0] - viewBox[0]) * zoom;
1378
- const scrollTop = (origination[1] - viewBox[1]) * zoom;
1420
+ const [scrollLeft, scrollTop] = toSVGScreenPoint(board, origination);
1379
1421
  updateViewportContainerScroll(board, scrollLeft, scrollTop);
1380
1422
  }
1381
1423
  function updateViewportContainerScroll(board, left, top, isFromViewportChange = true) {
1382
1424
  const viewportContainer = PlaitBoard.getViewportContainer(board);
1383
1425
  const previousScrollLeft = viewportContainer.scrollLeft;
1384
1426
  const previousScrollTop = viewportContainer.scrollTop;
1385
- if (viewportContainer.scrollLeft !== left || viewportContainer.scrollTop !== top) {
1427
+ // scrollTop assign 11.8 will get 11.5 in chrome
1428
+ // scrollTop assign 11.8 will get 11 in firefox, safari
1429
+ // scrollTop assign 11.4 will get 11 in chrome, firefox, safari
1430
+ if (viewportContainer.scrollLeft !== Math.floor(left) || viewportContainer.scrollTop !== Math.floor(top)) {
1386
1431
  viewportContainer.scrollLeft = left;
1387
1432
  viewportContainer.scrollTop = top;
1388
1433
  const offsetWidth = viewportContainer.offsetWidth;
@@ -1406,7 +1451,7 @@ function updateViewportByScrolling(board, scrollLeft, scrollTop) {
1406
1451
  const zoom = board.viewport.zoom;
1407
1452
  const viewBox = getViewBox(board, zoom);
1408
1453
  const origination = [scrollLeft / zoom + viewBox[0], scrollTop / zoom + viewBox[1]];
1409
- if (Point.isEquals(origination, board.viewport.origination)) {
1454
+ if (Point.isEquals(origination, getViewportOrigination(board))) {
1410
1455
  return;
1411
1456
  }
1412
1457
  BoardTransforms.updateViewport(board, origination);
@@ -1491,7 +1536,9 @@ const debounce = (func, wait, options) => {
1491
1536
  }
1492
1537
  else {
1493
1538
  if (options?.leading) {
1494
- func();
1539
+ timer(0).subscribe(() => {
1540
+ func();
1541
+ });
1495
1542
  }
1496
1543
  timerSubscription = timer(wait).subscribe();
1497
1544
  }
@@ -1501,6 +1548,9 @@ const debounce = (func, wait, options) => {
1501
1548
  const getMovingElements = (board) => {
1502
1549
  return BOARD_TO_MOVING_ELEMENT.get(board) || [];
1503
1550
  };
1551
+ const isMovingElements = (board) => {
1552
+ return (BOARD_TO_MOVING_ELEMENT.get(board) || []).length > 0;
1553
+ };
1504
1554
  const addMovingElements = (board, elements) => {
1505
1555
  const movingElements = getMovingElements(board);
1506
1556
  const newElements = elements.filter(item => !movingElements.find(movingElement => movingElement.key === item.key));
@@ -1530,7 +1580,7 @@ function isElementNode(node) {
1530
1580
  function loadImage(src) {
1531
1581
  return new Promise((resolve, reject) => {
1532
1582
  const img = new Image();
1533
- img.crossOrigin = 'anonymous';
1583
+ img.crossOrigin = 'Anonymous';
1534
1584
  img.onload = () => resolve(img);
1535
1585
  img.onerror = () => reject(new Error('Failed to load image'));
1536
1586
  img.src = src;
@@ -1645,7 +1695,7 @@ async function batchConvertImage(sourceNode, cloneNode) {
1645
1695
  * @param options parameter configuration
1646
1696
  * @returns clone svg element
1647
1697
  */
1648
- function cloneSvg(board, elements, rectangle, options) {
1698
+ async function cloneSvg(board, elements, rectangle, options) {
1649
1699
  const { width, height, x, y } = rectangle;
1650
1700
  const { padding = 4, inlineStyleClassNames } = options;
1651
1701
  const sourceSvg = PlaitBoard.getHost(board);
@@ -1658,12 +1708,12 @@ function cloneSvg(board, elements, rectangle, options) {
1658
1708
  cloneSvgElement.setAttribute('width', `${width}`);
1659
1709
  cloneSvgElement.setAttribute('height', `${height}`);
1660
1710
  cloneSvgElement.setAttribute('viewBox', [x - padding, y - padding, width + 2 * padding, height + 2 * padding].join(','));
1661
- selectedGElements.forEach((child, i) => {
1711
+ await Promise.all(selectedGElements.map(async (child, i) => {
1662
1712
  const cloneChild = child.cloneNode(true);
1663
1713
  batchCloneCSSStyle(child, cloneChild, inlineStyleClassNames);
1664
- batchConvertImage(child, cloneChild);
1714
+ await batchConvertImage(child, cloneChild);
1665
1715
  newHostElement.appendChild(cloneChild);
1666
- });
1716
+ }));
1667
1717
  cloneSvgElement.appendChild(newHostElement);
1668
1718
  return cloneSvgElement;
1669
1719
  }
@@ -2536,7 +2586,7 @@ const NodeTransforms = {
2536
2586
  };
2537
2587
 
2538
2588
  function withSelection(board) {
2539
- const { pointerDown, globalPointerMove, globalPointerUp, onChange } = board;
2589
+ const { pointerDown, globalPointerMove, globalPointerUp, keyup, onChange, afterChange } = board;
2540
2590
  let start = null;
2541
2591
  let end = null;
2542
2592
  let selectionMovingG;
@@ -2544,11 +2594,15 @@ function withSelection(board) {
2544
2594
  let previousSelectedElements;
2545
2595
  // prevent text from being selected when user pressed main pointer and is moving
2546
2596
  let needPreventNativeSelectionWhenMoving = false;
2597
+ let isShift = false;
2547
2598
  board.pointerDown = (event) => {
2548
2599
  const isHitText = event.target instanceof Element && event.target.closest('.plait-richtext-container');
2549
- // prevent text from being selected when user pressed shift and pointer down
2550
- if (!isHitText && event.shiftKey) {
2600
+ if (event.shiftKey) {
2551
2601
  event.preventDefault();
2602
+ isShift = true;
2603
+ }
2604
+ else {
2605
+ isShift = false;
2552
2606
  }
2553
2607
  if (!isHitText) {
2554
2608
  needPreventNativeSelectionWhenMoving = true;
@@ -2562,7 +2616,7 @@ function withSelection(board) {
2562
2616
  const selection = { anchor: point, focus: point };
2563
2617
  const hitElement = getHitElementByPoint(board, point);
2564
2618
  const selectedElements = getSelectedElements(board);
2565
- if (hitElement && selectedElements.includes(hitElement) && !options.isDisabledSelect) {
2619
+ if (!isShift && hitElement && selectedElements.includes(hitElement) && !options.isDisabledSelect) {
2566
2620
  pointerDown(event);
2567
2621
  return;
2568
2622
  }
@@ -2574,12 +2628,18 @@ function withSelection(board) {
2574
2628
  Transforms.setSelection(board, selection);
2575
2629
  pointerDown(event);
2576
2630
  };
2631
+ board.keyup = (event) => {
2632
+ if (isShift && event.key === 'Shift') {
2633
+ isShift = false;
2634
+ }
2635
+ keyup(event);
2636
+ };
2577
2637
  board.globalPointerMove = (event) => {
2578
2638
  if (needPreventNativeSelectionWhenMoving) {
2579
2639
  // prevent text from being selected
2580
2640
  event.preventDefault();
2581
2641
  }
2582
- if (start) {
2642
+ if (start && PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
2583
2643
  const movedTarget = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
2584
2644
  const rectangle = RectangleClient.toRectangleClient([start, movedTarget]);
2585
2645
  selectionMovingG?.remove();
@@ -2635,43 +2695,63 @@ function withSelection(board) {
2635
2695
  removeSelectedElement(board, op.node);
2636
2696
  }
2637
2697
  });
2638
- // calc selected elements entry
2639
- if (board.pointer !== PlaitPointerType.hand && !options.isDisabledSelect) {
2698
+ if (isHandleSelection(board) && isSetSelectionOperation(board)) {
2640
2699
  try {
2641
- if (board.operations.find(value => value.type === 'set_selection')) {
2642
- selectionRectangleG?.remove();
2643
- const temporaryElements = getTemporaryElements(board);
2644
- let elements = temporaryElements ? temporaryElements : getHitElementsBySelection(board);
2645
- if (!options.isMultiple && elements.length > 1) {
2646
- elements = [elements[0]];
2647
- }
2700
+ selectionRectangleG?.remove();
2701
+ const temporaryElements = getTemporaryElements(board);
2702
+ let elements = temporaryElements ? temporaryElements : getHitElementsBySelection(board);
2703
+ if (!options.isMultiple && elements.length > 1) {
2704
+ elements = [elements[0]];
2705
+ }
2706
+ if (isShift && board.selection && Selection.isCollapsed(board.selection)) {
2707
+ const newSelectedElements = [...getSelectedElements(board)];
2708
+ elements.forEach(element => {
2709
+ if (newSelectedElements.includes(element)) {
2710
+ newSelectedElements.splice(newSelectedElements.indexOf(element), 1);
2711
+ }
2712
+ else {
2713
+ newSelectedElements.push(element);
2714
+ }
2715
+ });
2716
+ cacheSelectedElements(board, newSelectedElements);
2717
+ }
2718
+ else {
2648
2719
  cacheSelectedElements(board, elements);
2649
- previousSelectedElements = elements;
2650
- deleteTemporaryElements(board);
2651
- if (!isSelectionMoving(board) && elements.length > 1) {
2720
+ }
2721
+ const newElements = getSelectedElements(board);
2722
+ previousSelectedElements = newElements;
2723
+ deleteTemporaryElements(board);
2724
+ if (!isSelectionMoving(board) && newElements.length > 1) {
2725
+ selectionRectangleG = createSelectionRectangleG(board);
2726
+ }
2727
+ }
2728
+ catch (error) {
2729
+ console.error(error);
2730
+ }
2731
+ }
2732
+ onChange();
2733
+ };
2734
+ board.afterChange = () => {
2735
+ if (isHandleSelection(board) && !isSetSelectionOperation(board)) {
2736
+ try {
2737
+ const currentSelectedElements = getSelectedElements(board);
2738
+ if (currentSelectedElements.length && currentSelectedElements.length > 1) {
2739
+ if (currentSelectedElements.length !== previousSelectedElements.length ||
2740
+ currentSelectedElements.some((c, index) => c !== previousSelectedElements[index])) {
2741
+ selectionRectangleG?.remove();
2652
2742
  selectionRectangleG = createSelectionRectangleG(board);
2743
+ previousSelectedElements = currentSelectedElements;
2653
2744
  }
2654
2745
  }
2655
2746
  else {
2656
- const currentSelectedElements = getSelectedElements(board);
2657
- if (currentSelectedElements.length && currentSelectedElements.length > 1) {
2658
- if (currentSelectedElements.length !== previousSelectedElements.length ||
2659
- currentSelectedElements.some((c, index) => c !== previousSelectedElements[index])) {
2660
- selectionRectangleG?.remove();
2661
- selectionRectangleG = createSelectionRectangleG(board);
2662
- previousSelectedElements = currentSelectedElements;
2663
- }
2664
- }
2665
- else {
2666
- selectionRectangleG?.remove();
2667
- }
2747
+ selectionRectangleG?.remove();
2668
2748
  }
2669
2749
  }
2670
2750
  catch (error) {
2671
2751
  console.error(error);
2672
2752
  }
2673
2753
  }
2674
- onChange();
2754
+ afterChange();
2675
2755
  };
2676
2756
  board.setPluginOptions(PlaitPluginKey.withSelection, {
2677
2757
  isMultiple: true,
@@ -2679,6 +2759,13 @@ function withSelection(board) {
2679
2759
  });
2680
2760
  return board;
2681
2761
  }
2762
+ function isHandleSelection(board) {
2763
+ const options = board.getPluginOptions(PlaitPluginKey.withSelection);
2764
+ return board.pointer !== PlaitPointerType.hand && !options.isDisabledSelect && !PlaitBoard.isReadonly(board);
2765
+ }
2766
+ function isSetSelectionOperation(board) {
2767
+ return !!board.operations.find(value => value.type === 'set_selection');
2768
+ }
2682
2769
  function getTemporaryElements(board) {
2683
2770
  const ref = BOARD_TO_TEMPORARY_ELEMENTS.get(board);
2684
2771
  if (ref) {
@@ -2817,6 +2904,7 @@ function createBoard(children, options) {
2817
2904
  Promise.resolve().then(() => {
2818
2905
  FLUSHING.set(board, false);
2819
2906
  board.onChange();
2907
+ board.afterChange();
2820
2908
  board.operations = [];
2821
2909
  });
2822
2910
  }
@@ -2847,6 +2935,7 @@ function createBoard(children, options) {
2847
2935
  return refs;
2848
2936
  },
2849
2937
  onChange: () => { },
2938
+ afterChange: () => { },
2850
2939
  mousedown: (event) => { },
2851
2940
  mousemove: (event) => { },
2852
2941
  mouseleave: (event) => { },
@@ -2883,13 +2972,13 @@ function createBoard(children, options) {
2883
2972
  pointerLeave: pointer => { },
2884
2973
  globalPointerMove: pointer => { },
2885
2974
  globalPointerUp: pointer => { },
2886
- isImageBindingAllowed: (element) => false,
2975
+ isImageBindingAllowed: (element) => false
2887
2976
  };
2888
2977
  return board;
2889
2978
  }
2890
2979
 
2891
2980
  function withBoard(board) {
2892
- const { onChange } = board;
2981
+ const { onChange, afterChange } = board;
2893
2982
  board.onChange = () => {
2894
2983
  const onContextChange = BOARD_TO_ON_CHANGE.get(board);
2895
2984
  if (onContextChange) {
@@ -2897,6 +2986,13 @@ function withBoard(board) {
2897
2986
  }
2898
2987
  onChange();
2899
2988
  };
2989
+ board.afterChange = () => {
2990
+ const afterContextChange = BOARD_TO_AFTER_CHANGE.get(board);
2991
+ if (afterContextChange) {
2992
+ afterContextChange();
2993
+ }
2994
+ afterChange();
2995
+ };
2900
2996
  return board;
2901
2997
  }
2902
2998
 
@@ -2985,23 +3081,23 @@ function withHistory(board) {
2985
3081
  }
2986
3082
 
2987
3083
  function withHandPointer(board) {
2988
- const { mousedown, mousemove, globalMouseup, keydown, keyup } = board;
3084
+ const { pointerDown, pointerMove, globalPointerUp, keydown, keyup } = board;
2989
3085
  let isMoving = false;
2990
3086
  const plaitBoardMove = {
2991
3087
  x: 0,
2992
3088
  y: 0
2993
3089
  };
2994
- board.mousedown = (event) => {
3090
+ board.pointerDown = (event) => {
2995
3091
  if (PlaitBoard.isPointer(board, PlaitPointerType.hand) && isMainPointer(event)) {
2996
3092
  isMoving = true;
2997
3093
  PlaitBoard.getBoardContainer(board).classList.add('viewport-moving');
2998
3094
  plaitBoardMove.x = event.x;
2999
3095
  plaitBoardMove.y = event.y;
3000
3096
  }
3001
- mousedown(event);
3097
+ pointerDown(event);
3002
3098
  };
3003
- board.mousemove = (event) => {
3004
- if (PlaitBoard.isPointer(board, PlaitPointerType.hand) && board.selection && isMoving) {
3099
+ board.pointerMove = (event) => {
3100
+ if (PlaitBoard.isPointer(board, PlaitPointerType.hand) && isMoving) {
3005
3101
  const viewportContainer = PlaitBoard.getViewportContainer(board);
3006
3102
  const left = viewportContainer.scrollLeft - (event.x - plaitBoardMove.x);
3007
3103
  const top = viewportContainer.scrollTop - (event.y - plaitBoardMove.y);
@@ -3009,16 +3105,16 @@ function withHandPointer(board) {
3009
3105
  plaitBoardMove.x = event.x;
3010
3106
  plaitBoardMove.y = event.y;
3011
3107
  }
3012
- mousemove(event);
3108
+ pointerMove(event);
3013
3109
  };
3014
- board.globalMouseup = (event) => {
3015
- if (board.selection) {
3110
+ board.globalPointerUp = (event) => {
3111
+ if (isMoving) {
3016
3112
  isMoving = false;
3017
3113
  PlaitBoard.getBoardContainer(board).classList.remove('viewport-moving');
3018
3114
  plaitBoardMove.x = 0;
3019
3115
  plaitBoardMove.y = 0;
3020
3116
  }
3021
- globalMouseup(event);
3117
+ globalPointerUp(event);
3022
3118
  };
3023
3119
  board.keydown = (event) => {
3024
3120
  if (event.code === 'Space') {
@@ -3446,7 +3542,11 @@ function withMoving(board) {
3446
3542
  const host = BOARD_TO_HOST.get(board);
3447
3543
  const point = transformPoint(board, toPoint(event.x, event.y, host));
3448
3544
  let movableElements = board.children.filter(item => board.isMovable(item));
3449
- if (!PlaitBoard.isReadonly(board) && movableElements.length && !isPreventTouchMove(board) && isMainPointer(event)) {
3545
+ if (!PlaitBoard.isReadonly(board) &&
3546
+ PlaitBoard.isPointer(board, PlaitPointerType.selection) &&
3547
+ movableElements.length &&
3548
+ !isPreventTouchMove(board) &&
3549
+ isMainPointer(event)) {
3450
3550
  startPoint = point;
3451
3551
  const selectedMovableElements = getSelectedElements(board).filter(item => movableElements.includes(item));
3452
3552
  const hitElement = getHitElementByPoint(board, point);
@@ -3941,8 +4041,10 @@ class PlaitBoardComponent {
3941
4041
  activeHost: elementActiveHost
3942
4042
  });
3943
4043
  BOARD_TO_ON_CHANGE.set(this.board, () => {
4044
+ this.update();
4045
+ });
4046
+ BOARD_TO_AFTER_CHANGE.set(this.board, () => {
3944
4047
  this.ngZone.run(() => {
3945
- this.detect();
3946
4048
  const changeEvent = {
3947
4049
  children: this.board.children,
3948
4050
  operations: this.board.operations,
@@ -3959,7 +4061,7 @@ class PlaitBoardComponent {
3959
4061
  ngAfterContentInit() {
3960
4062
  this.initializeIslands();
3961
4063
  }
3962
- detect() {
4064
+ update() {
3963
4065
  this.effect = {};
3964
4066
  this.cdr.detectChanges();
3965
4067
  }
@@ -4429,5 +4531,5 @@ function createModModifierKeys() {
4429
4531
  * Generated bundle index. Do not edit.
4430
4532
  */
4431
4533
 
4432
- export { A, ACTIVE_MOVING_CLASS_NAME, ACTIVE_STROKE_WIDTH, 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_TOUCH_REF, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, C, CAPS_LOCK, CLIP_BOARD_FORMAT_KEY, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, ColorfulThemeColor, CoreTransforms, CursorClass, D, DASH, DELETE, DOWN_ARROW, DarkThemeColor, DefaultThemeColor, Direction, 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, PlaitChildrenElementComponent, PlaitContextService, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitIslandPopoverBaseComponent, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, Q, QUESTION_MARK, R, RIGHT_ARROW, RectangleClient, ResizeCursorClass, RetroThemeColor, RgbaToHEX, S, SAVING, SCROLL_BAR_WIDTH, SCROLL_LOCK, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SELECTION_RECTANGLE_CLASS_NAME, 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, catmullRomFitting, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createFakeEvent, createForeignObject, createG, createKeyboardEvent, createMask, createModModifierKeys, createMouseEvent, createPath, createPointerEvent, createRect, createSVG, createSelectionRectangleG, createTestingBoard, createText, createTouchEvent, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, distanceBetweenPointAndSegments, downScale, downloadImage, drawArrow, drawBezierPath, drawCircle, drawLine, drawLinearPath, drawRectangle, drawRoundRectangle, fakeNodeWeakMap, findElements, getBoardRectangle, getClipboardByKey, getClipboardDataByMedia, getDataFromClipboard, getElementById, getElementHostBBox, getHitElementByPoint, getHitElementsBySelection, getIsRecursionFunc, getMovingElements, getNearestPointBetweenPointAndSegment, getNearestPointBetweenPointAndSegments, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getTemporaryRef, getTextFromClipboard, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, handleTouchTarget, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isInPlaitBoard, isLineHitLine, isMainPointer, isNullOrUndefined, isPointInEllipse, isPointInPolygon, isPointInRoundRectangle, isPolylineHitRectangle, isPreventTouchMove, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetViewportOperation, normalizePoint, preventTouchMove, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setClipboardData, setClipboardDataByMedia, setClipboardDataByText, setIsFromScrolling, setIsFromViewportChange, setPathStrokeLinecap, setSVGViewBox, setSelectionMoving, setStrokeLinecap, shouldClear, shouldMerge, shouldSave, temporaryDisableSelection, throttleRAF, toImage, toPoint, transformPoint, transformPoints, updateForeignObject, updateForeignObjectWidth, updateViewportByScrolling, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
4534
+ export { A, ACTIVE_MOVING_CLASS_NAME, ACTIVE_STROKE_WIDTH, ALT, APOSTROPHE, ATTACHED_ELEMENT_CLASS_NAME, AT_SIGN, B, BACKSLASH, BACKSPACE, BOARD_TO_AFTER_CHANGE, 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_TOUCH_REF, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, C, CAPS_LOCK, CLIP_BOARD_FORMAT_KEY, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, ColorfulThemeColor, CoreTransforms, CursorClass, D, DASH, DELETE, DOWN_ARROW, DarkThemeColor, DefaultThemeColor, Direction, 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, PlaitChildrenElementComponent, PlaitContextService, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitIslandPopoverBaseComponent, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, Q, QUESTION_MARK, R, RIGHT_ARROW, RectangleClient, ResizeCursorClass, RetroThemeColor, RgbaToHEX, S, SAVING, SCROLL_BAR_WIDTH, SCROLL_LOCK, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SELECTION_RECTANGLE_CLASS_NAME, 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, catmullRomFitting, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createFakeEvent, createForeignObject, createG, createKeyboardEvent, createMask, createModModifierKeys, createMouseEvent, createPath, createPointerEvent, createRect, createSVG, createSelectionRectangleG, createTestingBoard, createText, createTouchEvent, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, distanceBetweenPointAndSegments, downScale, downloadImage, drawArrow, drawBezierPath, drawCircle, drawLine, drawLinearPath, drawRectangle, drawRoundRectangle, fakeNodeWeakMap, findElements, getBoardRectangle, getClipboardByKey, getClipboardDataByMedia, getDataFromClipboard, getElementById, getElementHostBBox, getHitElementByPoint, getHitElementsBySelection, getIsRecursionFunc, getMovingElements, getNearestPointBetweenPointAndSegment, getNearestPointBetweenPointAndSegments, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getTemporaryRef, getTextFromClipboard, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, handleTouchTarget, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isHandleSelection, isInPlaitBoard, isLineHitLine, isMainPointer, isMovingElements, isNullOrUndefined, isPointInEllipse, isPointInPolygon, isPointInRoundRectangle, isPolylineHitRectangle, isPreventTouchMove, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetSelectionOperation, isSetViewportOperation, normalizePoint, preventTouchMove, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setClipboardData, setClipboardDataByMedia, setClipboardDataByText, setIsFromScrolling, setIsFromViewportChange, setPathStrokeLinecap, setSVGViewBox, setSelectionMoving, setStrokeLinecap, shouldClear, shouldMerge, shouldSave, temporaryDisableSelection, throttleRAF, toImage, toPoint, toSVGScreenPoint, toScreenPoint, transformPoint, transformPoints, updateForeignObject, updateForeignObjectWidth, updateViewportByScrolling, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
4433
4535
  //# sourceMappingURL=plait-core.mjs.map