@plait/mind 0.39.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.
@@ -1,122 +1,57 @@
1
- import { MERGING, PRESS_AND_MOVE_BUFFER, PlaitBoard, PlaitElement, PlaitNode, ResizeCursorClass, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, getSelectedElements, preventTouchMove, throttleRAF, toPoint, transformPoint } from '@plait/core';
1
+ import { PlaitBoard, PlaitNode, ResizeCursorClass, distanceBetweenPointAndRectangle, getSelectedElements } from '@plait/core';
2
2
  import { MindElement } from '../interfaces/element';
3
3
  import { getRectangleByNode } from '../utils/position/node';
4
4
  import { NodeSpace } from '../utils/space/node-space';
5
5
  import { MindTransforms } from '../transforms';
6
6
  import { EXTEND_OFFSET } from '../constants/default';
7
7
  import { isDragging } from '../utils/dnd/common';
8
+ import { withResize } from '@plait/common';
8
9
  export const withNodeResize = (board) => {
9
- const { pointerDown, pointerMove, globalPointerUp } = board;
10
- let targetElement = null;
11
10
  let targetElementRef = null;
12
- let startPoint = null;
13
- board.pointerDown = (event) => {
14
- if (PlaitBoard.isReadonly(board)) {
15
- pointerDown(event);
16
- return;
17
- }
18
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
19
- const newTargetElement = getSelectedTarget(board, point);
20
- if (newTargetElement) {
21
- PlaitBoard.getBoardContainer(board).classList.add(ResizeCursorClass['ew']);
22
- targetElement = newTargetElement;
23
- startPoint = [event.x, event.y];
24
- preventTouchMove(board, event, true);
25
- }
26
- pointerDown(event);
27
- };
28
- board.pointerMove = (event) => {
29
- if (PlaitBoard.isReadonly(board) || PlaitBoard.hasBeenTextEditing(board)) {
30
- pointerMove(event);
31
- return;
32
- }
33
- if (startPoint && targetElement && !isMindNodeResizing(board)) {
34
- // prevent text from being selected
35
- event.preventDefault();
36
- const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
37
- const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
38
- if (distance > PRESS_AND_MOVE_BUFFER) {
39
- addResizing(board, targetElement);
40
- targetElementRef = {
41
- minWidth: NodeSpace.getNodeResizableMinWidth(board, targetElement),
42
- currentWidth: NodeSpace.getNodeDynamicWidth(board, targetElement),
43
- path: PlaitBoard.findPath(board, targetElement),
44
- textManage: MindElement.getTextManage(targetElement)
11
+ const options = {
12
+ key: 'mind-node',
13
+ canResize: () => {
14
+ return !isDragging(board);
15
+ },
16
+ detect: (point) => {
17
+ const newTargetElement = getSelectedTarget(board, point);
18
+ if (newTargetElement) {
19
+ return {
20
+ element: newTargetElement,
21
+ handle: null,
22
+ cursorClass: ResizeCursorClass.ew
45
23
  };
46
- MERGING.set(board, true);
47
24
  }
48
- }
49
- if (isMindNodeResizing(board) && startPoint && targetElementRef) {
50
- // prevent text from being selected
51
- event.preventDefault();
52
- preventTouchMove(board, event, true);
53
- throttleRAF(() => {
54
- if (!startPoint) {
55
- return;
56
- }
57
- const endPoint = [event.x, event.y];
58
- const offsetX = endPoint[0] - startPoint[0];
59
- const zoom = board.viewport.zoom;
60
- let resizedWidth = targetElementRef.currentWidth + offsetX / zoom;
61
- if (resizedWidth <= targetElementRef.minWidth) {
62
- resizedWidth = targetElementRef.minWidth;
63
- }
64
- const newTarget = PlaitNode.get(board, targetElementRef.path);
65
- if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
66
- targetElementRef.textManage.updateRectangleWidth(resizedWidth);
67
- const { height } = targetElementRef.textManage.getSize();
68
- MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth * zoom, height);
69
- }
70
- });
71
- return;
72
- }
73
- else {
74
- // press and start drag when node is non selected
75
- if (!isDragging(board)) {
76
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
77
- const newTargetElement = getSelectedTarget(board, point);
78
- if (newTargetElement) {
79
- PlaitBoard.getBoardContainer(board).classList.add(`mind-${ResizeCursorClass['ew']}`);
80
- }
81
- else {
82
- PlaitBoard.getBoardContainer(board).classList.remove(`mind-${ResizeCursorClass['ew']}`);
83
- }
25
+ return null;
26
+ },
27
+ beforeResize: (resizeRef) => {
28
+ targetElementRef = {
29
+ minWidth: NodeSpace.getNodeResizableMinWidth(board, resizeRef.element),
30
+ currentWidth: NodeSpace.getNodeDynamicWidth(board, resizeRef.element),
31
+ path: PlaitBoard.findPath(board, resizeRef.element),
32
+ textManage: MindElement.getTextManage(resizeRef.element)
33
+ };
34
+ },
35
+ onResize: (resizeRef, resizeState) => {
36
+ const zoom = board.viewport.zoom;
37
+ let resizedWidth = targetElementRef.currentWidth + resizeState.offsetX / zoom;
38
+ if (resizedWidth <= targetElementRef.minWidth) {
39
+ resizedWidth = targetElementRef.minWidth;
84
40
  }
85
- }
86
- pointerMove(event);
87
- };
88
- board.globalPointerUp = (event) => {
89
- globalPointerUp(event);
90
- if (isMindNodeResizing(board) || targetElement) {
91
- targetElement && removeResizing(board, targetElement);
41
+ const newTarget = PlaitNode.get(board, targetElementRef.path);
42
+ if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
43
+ targetElementRef.textManage.updateRectangleWidth(resizedWidth);
44
+ const { height } = targetElementRef.textManage.getSize();
45
+ MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth * zoom, height);
46
+ }
47
+ },
48
+ afterResize: (resizeRef) => {
92
49
  targetElementRef = null;
93
- targetElement = null;
94
- startPoint = null;
95
- MERGING.set(board, false);
96
- preventTouchMove(board, event, false);
97
50
  }
98
51
  };
52
+ withResize(board, options);
99
53
  return board;
100
54
  };
101
- export const IS_MIND_NODE_RESIZING = new WeakMap();
102
- export const isMindNodeResizing = (board) => {
103
- return !!IS_MIND_NODE_RESIZING.get(board);
104
- };
105
- export const addResizing = (board, element) => {
106
- PlaitBoard.getBoardContainer(board).classList.add('mind-node-resizing');
107
- const component = PlaitElement.getComponent(element);
108
- component.g.classList.add('resizing');
109
- IS_MIND_NODE_RESIZING.set(board, true);
110
- };
111
- export const removeResizing = (board, element) => {
112
- PlaitBoard.getBoardContainer(board).classList.remove('mind-node-resizing');
113
- PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew']);
114
- const component = PlaitElement.getComponent(element);
115
- if (component && component.g) {
116
- component.g.classList.remove('resizing');
117
- }
118
- IS_MIND_NODE_RESIZING.set(board, false);
119
- };
120
55
  export const getSelectedTarget = (board, point) => {
121
56
  const selectedElements = getSelectedElements(board).filter(value => MindElement.isMindElement(board, value));
122
57
  if (selectedElements.length > 0) {
@@ -133,4 +68,4 @@ export const getResizeActiveRectangle = (board, element) => {
133
68
  const rectangle = getRectangleByNode(node);
134
69
  return { x: rectangle.x + rectangle.width - EXTEND_OFFSET, y: rectangle.y, width: EXTEND_OFFSET * 2, height: rectangle.height };
135
70
  };
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub2RlLXJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3BsdWdpbnMvd2l0aC1ub2RlLXJlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsT0FBTyxFQUNQLHFCQUFxQixFQUVyQixVQUFVLEVBQ1YsWUFBWSxFQUNaLFNBQVMsRUFHVCxpQkFBaUIsRUFDakIsNEJBQTRCLEVBQzVCLGdDQUFnQyxFQUNoQyxtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxPQUFPLEVBQ1AsY0FBYyxFQUNqQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDaEQsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQzVELElBQUksYUFBYSxHQUF1QixJQUFJLENBQUM7SUFDN0MsSUFBSSxnQkFBZ0IsR0FBNEIsSUFBSSxDQUFDO0lBQ3JELElBQUksVUFBVSxHQUFpQixJQUFJLENBQUM7SUFFcEMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtRQUN4QyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDOUIs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cG9ydCB7XG4gICAgTUVSR0lORyxcbiAgICBQUkVTU19BTkRfTU9WRV9CVUZGRVIsXG4gICAgUGF0aCxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQbGFpdE5vZGUsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFJlc2l6ZUN1cnNvckNsYXNzLFxuICAgIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQsXG4gICAgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRSZWN0YW5nbGUsXG4gICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyxcbiAgICBwcmV2ZW50VG91Y2hNb3ZlLFxuICAgIHRocm90dGxlUkFGLFxuICAgIHRvUG9pbnQsXG4gICAgdHJhbnNmb3JtUG9pbnRcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vbm9kZSc7XG5pbXBvcnQgeyBOb2RlU3BhY2UgfSBmcm9tICcuLi91dGlscy9zcGFjZS9ub2RlLXNwYWNlJztcbmltcG9ydCB7IFBsYWl0TWluZEJvYXJkIH0gZnJvbSAnLi93aXRoLW1pbmQuYm9hcmQnO1xuaW1wb3J0IHsgTWluZE5vZGVDb21wb25lbnQgfSBmcm9tICcuLi9taW5kLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IE1pbmRUcmFuc2Zvcm1zIH0gZnJvbSAnLi4vdHJhbnNmb3Jtcyc7XG5pbXBvcnQgeyBUZXh0TWFuYWdlIH0gZnJvbSAnQHBsYWl0L3RleHQnO1xuaW1wb3J0IHsgRVhURU5EX09GRlNFVCB9IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IGlzRHJhZ2dpbmcgfSBmcm9tICcuLi91dGlscy9kbmQvY29tbW9uJztcblxuaW50ZXJmYWNlIFRhcmdldEVsZW1lbnRSZWYge1xuICAgIG1pbldpZHRoOiBudW1iZXI7XG4gICAgY3VycmVudFdpZHRoOiBudW1iZXI7XG4gICAgcGF0aDogUGF0aDtcbiAgICB0ZXh0TWFuYWdlOiBUZXh0TWFuYWdlO1xufVxuXG5leHBvcnQgY29uc3Qgd2l0aE5vZGVSZXNpemUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCB7IHBvaW50ZXJEb3duLCBwb2ludGVyTW92ZSwgZ2xvYmFsUG9pbnRlclVwIH0gPSBib2FyZDtcbiAgICBsZXQgdGFyZ2V0RWxlbWVudDogTWluZEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgdGFyZ2V0RWxlbWVudFJlZjogVGFyZ2V0RWxlbWVudFJlZiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzdGFydFBvaW50OiBQb2ludCB8IG51bGwgPSBudWxsO1xuXG4gICAgYm9hcmQucG9pbnRlckRvd24gPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgICBpZiAoUGxhaXRCb2FyZC5pc1JlYWRvbmx5KGJvYXJkKSkge1xuICAgICAgICAgICAgcG9pbnRlckRvd24oZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvaW50ID0gdHJhbnNmb3JtUG9pbnQoYm9hcmQsIHRvUG9pbnQoZXZlbnQueCwgZXZlbnQueSwgUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKSkpO1xuICAgICAgICBjb25zdCBuZXdUYXJnZXRFbGVtZW50ID0gZ2V0U2VsZWN0ZWRUYXJnZXQoYm9hcmQgYXMgUGxhaXRNaW5kQm9hcmQsIHBvaW50KTtcbiAgICAgICAgaWYgKG5ld1RhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5hZGQoUmVzaXplQ3Vyc29yQ2xhc3NbJ2V3J10pO1xuICAgICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IG5ld1RhcmdldEVsZW1lbnQ7XG4gICAgICAgICAgICBzdGFydFBvaW50ID0gW2V2ZW50LngsIGV2ZW50LnldO1xuICAgICAgICAgICAgcHJldmVudFRvdWNoTW92ZShib2FyZCwgZXZlbnQsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnRlckRvd24oZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5wb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdEJvYXJkLmlzUmVhZG9ubHkoYm9hcmQpIHx8IFBsYWl0Qm9hcmQuaGFzQmVlblRleHRFZGl0aW5nKGJvYXJkKSkge1xuICAgICAgICAgICAgcG9pbnRlck1vdmUoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXJ0UG9pbnQgJiYgdGFyZ2V0RWxlbWVudCAmJiAhaXNNaW5kTm9kZVJlc2l6aW5nKGJvYXJkKSkge1xuICAgICAgICAgICAgLy8gcHJldmVudCB0ZXh0IGZyb20gYmVpbmcgc2VsZWN0ZWRcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRyYW5zZm9ybVBvaW50KGJvYXJkLCB0b1BvaW50KGV2ZW50LngsIGV2ZW50LnksIFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCkpKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdLCBlbmRQb2ludFswXSwgZW5kUG9pbnRbMV0pO1xuICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gUFJFU1NfQU5EX01PVkVfQlVGRkVSKSB7XG4gICAgICAgICAgICAgICAgYWRkUmVzaXppbmcoYm9hcmQsIHRhcmdldEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1lbnRSZWYgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBOb2RlU3BhY2UuZ2V0Tm9kZVJlc2l6YWJsZU1pbldpZHRoKGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCB0YXJnZXRFbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFdpZHRoOiBOb2RlU3BhY2UuZ2V0Tm9kZUR5bmFtaWNXaWR0aChib2FyZCBhcyBQbGFpdE1pbmRCb2FyZCwgdGFyZ2V0RWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIHRhcmdldEVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0TWFuYWdlOiBNaW5kRWxlbWVudC5nZXRUZXh0TWFuYWdlKHRhcmdldEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNRVJHSU5HLnNldChib2FyZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNaW5kTm9kZVJlc2l6aW5nKGJvYXJkKSAmJiBzdGFydFBvaW50ICYmIHRhcmdldEVsZW1lbnRSZWYpIHtcbiAgICAgICAgICAgIC8vIHByZXZlbnQgdGV4dCBmcm9tIGJlaW5nIHNlbGVjdGVkXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcHJldmVudFRvdWNoTW92ZShib2FyZCwgZXZlbnQsIHRydWUpO1xuICAgICAgICAgICAgdGhyb3R0bGVSQUYoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3RhcnRQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBbZXZlbnQueCwgZXZlbnQueV07XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGVuZFBvaW50WzBdIC0gc3RhcnRQb2ludCFbMF07XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbSA9IGJvYXJkLnZpZXdwb3J0Lnpvb207XG4gICAgICAgICAgICAgICAgbGV0IHJlc2l6ZWRXaWR0aCA9IHRhcmdldEVsZW1lbnRSZWYhLmN1cnJlbnRXaWR0aCArIG9mZnNldFggLyB6b29tO1xuICAgICAgICAgICAgICAgIGlmIChyZXNpemVkV2lkdGggPD0gdGFyZ2V0RWxlbWVudFJlZiEubWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplZFdpZHRoID0gdGFyZ2V0RWxlbWVudFJlZiEubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gUGxhaXROb2RlLmdldDxNaW5kRWxlbWVudD4oYm9hcmQsIHRhcmdldEVsZW1lbnRSZWYhLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdUYXJnZXQgJiYgTm9kZVNwYWNlLmdldE5vZGVUb3BpY01pbldpZHRoKGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCBuZXdUYXJnZXQpICE9PSByZXNpemVkV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbWVudFJlZiEudGV4dE1hbmFnZS51cGRhdGVSZWN0YW5nbGVXaWR0aChyZXNpemVkV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGhlaWdodCB9ID0gdGFyZ2V0RWxlbWVudFJlZiEudGV4dE1hbmFnZS5nZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIE1pbmRUcmFuc2Zvcm1zLnNldE5vZGVNYW51YWxXaWR0aChib2FyZCBhcyBQbGFpdE1pbmRCb2FyZCwgbmV3VGFyZ2V0LCByZXNpemVkV2lkdGggKiB6b29tLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcHJlc3MgYW5kIHN0YXJ0IGRyYWcgd2hlbiBub2RlIGlzIG5vbiBzZWxlY3RlZFxuICAgICAgICAgICAgaWYgKCFpc0RyYWdnaW5nKGJvYXJkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gdHJhbnNmb3JtUG9pbnQoYm9hcmQsIHRvUG9pbnQoZXZlbnQueCwgZXZlbnQueSwgUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1RhcmdldEVsZW1lbnQgPSBnZXRTZWxlY3RlZFRhcmdldChib2FyZCBhcyBQbGFpdE1pbmRCb2FyZCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdUYXJnZXRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5hZGQoYG1pbmQtJHtSZXNpemVDdXJzb3JDbGFzc1snZXcnXX1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5jbGFzc0xpc3QucmVtb3ZlKGBtaW5kLSR7UmVzaXplQ3Vyc29yQ2xhc3NbJ2V3J119YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnRlck1vdmUoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5nbG9iYWxQb2ludGVyVXAgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgICBnbG9iYWxQb2ludGVyVXAoZXZlbnQpO1xuXG4gICAgICAgIGlmIChpc01pbmROb2RlUmVzaXppbmcoYm9hcmQpIHx8IHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRhcmdldEVsZW1lbnQgJiYgcmVtb3ZlUmVzaXppbmcoYm9hcmQsIHRhcmdldEVsZW1lbnQpO1xuICAgICAgICAgICAgdGFyZ2V0RWxlbWVudFJlZiA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgICAgTUVSR0lORy5zZXQoYm9hcmQsIGZhbHNlKTtcbiAgICAgICAgICAgIHByZXZlbnRUb3VjaE1vdmUoYm9hcmQsIGV2ZW50LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGJvYXJkO1xufTtcblxuZXhwb3J0IGNvbnN0IElTX01JTkRfTk9ERV9SRVNJWklORyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBpc01pbmROb2RlUmVzaXppbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICByZXR1cm4gISFJU19NSU5EX05PREVfUkVTSVpJTkcuZ2V0KGJvYXJkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRSZXNpemluZyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogTWluZEVsZW1lbnQpID0+IHtcbiAgICBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5jbGFzc0xpc3QuYWRkKCdtaW5kLW5vZGUtcmVzaXppbmcnKTtcbiAgICBjb25zdCBjb21wb25lbnQgPSBQbGFpdEVsZW1lbnQuZ2V0Q29tcG9uZW50KGVsZW1lbnQpO1xuICAgIGNvbXBvbmVudC5nLmNsYXNzTGlzdC5hZGQoJ3Jlc2l6aW5nJyk7XG4gICAgSVNfTUlORF9OT0RFX1JFU0laSU5HLnNldChib2FyZCwgdHJ1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlUmVzaXppbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50KSA9PiB7XG4gICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LnJlbW92ZSgnbWluZC1ub2RlLXJlc2l6aW5nJyk7XG4gICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LnJlbW92ZShSZXNpemVDdXJzb3JDbGFzc1snZXcnXSk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudChlbGVtZW50KTtcbiAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5nKSB7XG4gICAgICAgIGNvbXBvbmVudC5nLmNsYXNzTGlzdC5yZW1vdmUoJ3Jlc2l6aW5nJyk7XG4gICAgfVxuICAgIElTX01JTkRfTk9ERV9SRVNJWklORy5zZXQoYm9hcmQsIGZhbHNlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3RlZFRhcmdldCA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKS5maWx0ZXIodmFsdWUgPT4gTWluZEVsZW1lbnQuaXNNaW5kRWxlbWVudChib2FyZCwgdmFsdWUpKSBhcyBNaW5kRWxlbWVudFtdO1xuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0ZWRFbGVtZW50cy5maW5kKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGdldFJlc2l6ZUFjdGl2ZVJlY3RhbmdsZShib2FyZCwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUmVjdGFuZ2xlKHBvaW50WzBdLCBwb2ludFsxXSwgcmVjdGFuZ2xlKSA8PSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldCA/IHRhcmdldCA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplQWN0aXZlUmVjdGFuZ2xlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudCk6IFJlY3RhbmdsZUNsaWVudCA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IE1pbmRFbGVtZW50LmdldE5vZGUoZWxlbWVudCk7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKG5vZGUpO1xuICAgIHJldHVybiB7IHg6IHJlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC0gRVhURU5EX09GRlNFVCwgeTogcmVjdGFuZ2xlLnksIHdpZHRoOiBFWFRFTkRfT0ZGU0VUICogMiwgaGVpZ2h0OiByZWN0YW5nbGUuaGVpZ2h0IH07XG59O1xuIl19
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub2RlLXJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3BsdWdpbnMvd2l0aC1ub2RlLXJlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsVUFBVSxFQUNWLFNBQVMsRUFHVCxpQkFBaUIsRUFDakIsZ0NBQWdDLEVBQ2hDLG1CQUFtQixFQUN0QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXRELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQTZDLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVN0RixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDaEQsSUFBSSxnQkFBZ0IsR0FBNEIsSUFBSSxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUF5QztRQUNsRCxHQUFHLEVBQUUsV0FBVztRQUNoQixTQUFTLEVBQUUsR0FBRyxFQUFFO1lBQ1osT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsTUFBTSxFQUFFLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDckIsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxLQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNFLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ2xCLE9BQU87b0JBQ0gsT0FBTyxFQUFFLGdCQUFn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Q0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBb0IsRUFBbUIsRUFBRTtJQUNqRyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsYUFBYSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3BJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgUGF0aCxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0Tm9kZSxcbiAgICBQb2ludCxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgUmVzaXplQ3Vyc29yQ2xhc3MsXG4gICAgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRSZWN0YW5nbGUsXG4gICAgZ2V0U2VsZWN0ZWRFbGVtZW50c1xufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi91dGlscy9wb3NpdGlvbi9ub2RlJztcbmltcG9ydCB7IE5vZGVTcGFjZSB9IGZyb20gJy4uL3V0aWxzL3NwYWNlL25vZGUtc3BhY2UnO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuL3dpdGgtbWluZC5ib2FyZCc7XG5pbXBvcnQgeyBNaW5kVHJhbnNmb3JtcyB9IGZyb20gJy4uL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgVGV4dE1hbmFnZSB9IGZyb20gJ0BwbGFpdC90ZXh0JztcbmltcG9ydCB7IEVYVEVORF9PRkZTRVQgfSBmcm9tICcuLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBpc0RyYWdnaW5nIH0gZnJvbSAnLi4vdXRpbHMvZG5kL2NvbW1vbic7XG5pbXBvcnQgeyBSZXNpemVSZWYsIFJlc2l6ZVN0YXRlLCBXaXRoUmVzaXplT3B0aW9ucywgd2l0aFJlc2l6ZSB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuXG5pbnRlcmZhY2UgVGFyZ2V0RWxlbWVudFJlZiB7XG4gICAgbWluV2lkdGg6IG51bWJlcjtcbiAgICBjdXJyZW50V2lkdGg6IG51bWJlcjtcbiAgICBwYXRoOiBQYXRoO1xuICAgIHRleHRNYW5hZ2U6IFRleHRNYW5hZ2U7XG59XG5cbmV4cG9ydCBjb25zdCB3aXRoTm9kZVJlc2l6ZSA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGxldCB0YXJnZXRFbGVtZW50UmVmOiBUYXJnZXRFbGVtZW50UmVmIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgb3B0aW9uczogV2l0aFJlc2l6ZU9wdGlvbnM8TWluZEVsZW1lbnQsIG51bGw+ID0ge1xuICAgICAgICBrZXk6ICdtaW5kLW5vZGUnLFxuICAgICAgICBjYW5SZXNpemU6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhaXNEcmFnZ2luZyhib2FyZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRldGVjdDogKHBvaW50OiBQb2ludCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VGFyZ2V0RWxlbWVudCA9IGdldFNlbGVjdGVkVGFyZ2V0KGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCBwb2ludCk7XG4gICAgICAgICAgICBpZiAobmV3VGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IG5ld1RhcmdldEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yQ2xhc3M6IFJlc2l6ZUN1cnNvckNsYXNzLmV3XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBiZWZvcmVSZXNpemU6IChyZXNpemVSZWY6IFJlc2l6ZVJlZjxNaW5kRWxlbWVudCwgbnVsbD4pID0+IHtcbiAgICAgICAgICAgIHRhcmdldEVsZW1lbnRSZWYgPSB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IE5vZGVTcGFjZS5nZXROb2RlUmVzaXphYmxlTWluV2lkdGgoYm9hcmQgYXMgUGxhaXRNaW5kQm9hcmQsIHJlc2l6ZVJlZi5lbGVtZW50KSxcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGg6IE5vZGVTcGFjZS5nZXROb2RlRHluYW1pY1dpZHRoKGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCByZXNpemVSZWYuZWxlbWVudCksXG4gICAgICAgICAgICAgICAgcGF0aDogUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgcmVzaXplUmVmLmVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIHRleHRNYW5hZ2U6IE1pbmRFbGVtZW50LmdldFRleHRNYW5hZ2UocmVzaXplUmVmLmVsZW1lbnQpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblJlc2l6ZTogKHJlc2l6ZVJlZjogUmVzaXplUmVmPE1pbmRFbGVtZW50LCBudWxsPiwgcmVzaXplU3RhdGU6IFJlc2l6ZVN0YXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB6b29tID0gYm9hcmQudmlld3BvcnQuem9vbTtcbiAgICAgICAgICAgIGxldCByZXNpemVkV2lkdGggPSB0YXJnZXRFbGVtZW50UmVmIS5jdXJyZW50V2lkdGggKyByZXNpemVTdGF0ZS5vZmZzZXRYIC8gem9vbTtcbiAgICAgICAgICAgIGlmIChyZXNpemVkV2lkdGggPD0gdGFyZ2V0RWxlbWVudFJlZiEubWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZXNpemVkV2lkdGggPSB0YXJnZXRFbGVtZW50UmVmIS5taW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5ld1RhcmdldCA9IFBsYWl0Tm9kZS5nZXQ8TWluZEVsZW1lbnQ+KGJvYXJkLCB0YXJnZXRFbGVtZW50UmVmIS5wYXRoKTtcbiAgICAgICAgICAgIGlmIChuZXdUYXJnZXQgJiYgTm9kZVNwYWNlLmdldE5vZGVUb3BpY01pbldpZHRoKGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCBuZXdUYXJnZXQpICE9PSByZXNpemVkV2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50UmVmIS50ZXh0TWFuYWdlLnVwZGF0ZVJlY3RhbmdsZVdpZHRoKHJlc2l6ZWRXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IHRhcmdldEVsZW1lbnRSZWYhLnRleHRNYW5hZ2UuZ2V0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIE1pbmRUcmFuc2Zvcm1zLnNldE5vZGVNYW51YWxXaWR0aChib2FyZCBhcyBQbGFpdE1pbmRCb2FyZCwgbmV3VGFyZ2V0LCByZXNpemVkV2lkdGggKiB6b29tLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhZnRlclJlc2l6ZTogKHJlc2l6ZVJlZjogUmVzaXplUmVmPE1pbmRFbGVtZW50LCBudWxsPikgPT4ge1xuICAgICAgICAgICAgdGFyZ2V0RWxlbWVudFJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHdpdGhSZXNpemU8TWluZEVsZW1lbnQsIG51bGw+KGJvYXJkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYm9hcmQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0ZWRUYXJnZXQgPSAoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCkuZmlsdGVyKHZhbHVlID0+IE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIHZhbHVlKSkgYXMgTWluZEVsZW1lbnRbXTtcbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdGVkRWxlbWVudHMuZmluZCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0YW5nbGUgPSBnZXRSZXNpemVBY3RpdmVSZWN0YW5nbGUoYm9hcmQsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFJlY3RhbmdsZShwb2ludFswXSwgcG9pbnRbMV0sIHJlY3RhbmdsZSkgPD0gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQgPyB0YXJnZXQgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVBY3RpdmVSZWN0YW5nbGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50KTogUmVjdGFuZ2xlQ2xpZW50ID0+IHtcbiAgICBjb25zdCBub2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KTtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeU5vZGUobm9kZSk7XG4gICAgcmV0dXJuIHsgeDogcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLSBFWFRFTkRfT0ZGU0VULCB5OiByZWN0YW5nbGUueSwgd2lkdGg6IEVYVEVORF9PRkZTRVQgKiAyLCBoZWlnaHQ6IHJlY3RhbmdsZS5oZWlnaHQgfTtcbn07XG4iXX0=
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, ChangeDetectionStrategy, NgZone, Directive, Input, HostListener } from '@angular/core';
3
- import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, PlaitElement, PlaitNode, Path, isNullOrUndefined, PlaitBoard, distanceBetweenPointAndRectangle, RectangleClient, getSelectedElements, idCreator, Transforms, clearSelectedElement, addSelectedElement, depthFirstRecursion, getIsRecursionFunc, drawRoundRectangle, drawLinearPath, drawBezierPath, createG, updateForeignObject, getRectangleByElements, NODE_TO_PARENT, createForeignObject, setStrokeLinecap, ACTIVE_STROKE_WIDTH, createText, PlaitPointerType, NODE_TO_INDEX, PlaitChildrenElementComponent, isMainPointer, transformPoint, toPoint, getHitElementByPoint, distanceBetweenPointAndPoint, CoreTransforms, BOARD_TO_HOST, BoardTransforms, throttleRAF, removeSelectedElement, PlaitHistoryBoard, temporaryDisableSelection, hotkeys, setClipboardDataByMedia, getClipboardDataByMedia, ResizeCursorClass, preventTouchMove, PRESS_AND_MOVE_BUFFER, MERGING, setClipboardData, setClipboardDataByText, getDataFromClipboard, PlaitPluginKey } from '@plait/core';
3
+ import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, PlaitElement, PlaitNode, Path, isNullOrUndefined, PlaitBoard, distanceBetweenPointAndRectangle, RectangleClient, getSelectedElements, idCreator, Transforms, clearSelectedElement, addSelectedElement, depthFirstRecursion, getIsRecursionFunc, drawRoundRectangle, drawLinearPath, drawBezierPath, createG, updateForeignObject, getRectangleByElements, NODE_TO_PARENT, createForeignObject, setStrokeLinecap, ACTIVE_STROKE_WIDTH, createText, PlaitPointerType, NODE_TO_INDEX, PlaitChildrenElementComponent, isMainPointer, transformPoint, toPoint, getHitElementByPoint, distanceBetweenPointAndPoint, CoreTransforms, BOARD_TO_HOST, BoardTransforms, throttleRAF, removeSelectedElement, PlaitHistoryBoard, temporaryDisableSelection, hotkeys, setClipboardDataByMedia, getClipboardDataByMedia, ResizeCursorClass, setClipboardData, setClipboardDataByText, getDataFromClipboard, PlaitPluginKey } from '@plait/core';
4
4
  import { MindLayoutType, AbstractNode, isIndentedLayout, isHorizontalLayout, isHorizontalLogicLayout, ConnectingPosition, getNonAbstractChildren, isStandardLayout, isLeftLayout, isRightLayout, isVerticalLogicLayout, isTopLayout, isBottomLayout, getCorrectStartEnd, getAbstractLayout, GlobalLayout } from '@plait/layouts';
5
5
  import { PlaitMarkEditor, MarkTypes, DEFAULT_FONT_SIZE, TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, getTextFromClipboard } from '@plait/text';
6
6
  import { fromEvent, Subject } from 'rxjs';
7
- import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, addElementOfFocusedImage, removeElementOfFocusedImage, Generator, CommonPluginElement, ImageGenerator, WithTextPluginKey, isDrawingMode, isDndMode, setCreationMode, BoardCreationMode, isExpandHotkey, isTabHotkey, isEnterHotkey, isVirtualKey, isDelete, isSpaceHotkey, getElementOfFocusedImage, MediaKeys, acceptImageTypes, buildImage, ResizeHandle, withResize } from '@plait/common';
7
+ import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, addElementOfFocusedImage, removeElementOfFocusedImage, Generator, CommonPluginElement, ImageGenerator, WithTextPluginKey, isDrawingMode, isDndMode, setCreationMode, BoardCreationMode, isExpandHotkey, isTabHotkey, isEnterHotkey, isVirtualKey, isDelete, isSpaceHotkey, getElementOfFocusedImage, MediaKeys, acceptImageTypes, buildImage, withResize, ResizeHandle } from '@plait/common';
8
8
  import { Node as Node$1, Path as Path$1 } from 'slate';
9
9
  import { pointsOnBezierCurves } from 'points-on-curve';
10
10
  import { take, filter } from 'rxjs/operators';
@@ -3762,117 +3762,51 @@ const withNodeImage = (board) => {
3762
3762
  };
3763
3763
 
3764
3764
  const withNodeResize = (board) => {
3765
- const { pointerDown, pointerMove, globalPointerUp } = board;
3766
- let targetElement = null;
3767
3765
  let targetElementRef = null;
3768
- let startPoint = null;
3769
- board.pointerDown = (event) => {
3770
- if (PlaitBoard.isReadonly(board)) {
3771
- pointerDown(event);
3772
- return;
3773
- }
3774
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3775
- const newTargetElement = getSelectedTarget(board, point);
3776
- if (newTargetElement) {
3777
- PlaitBoard.getBoardContainer(board).classList.add(ResizeCursorClass['ew']);
3778
- targetElement = newTargetElement;
3779
- startPoint = [event.x, event.y];
3780
- preventTouchMove(board, event, true);
3781
- }
3782
- pointerDown(event);
3783
- };
3784
- board.pointerMove = (event) => {
3785
- if (PlaitBoard.isReadonly(board) || PlaitBoard.hasBeenTextEditing(board)) {
3786
- pointerMove(event);
3787
- return;
3788
- }
3789
- if (startPoint && targetElement && !isMindNodeResizing(board)) {
3790
- // prevent text from being selected
3791
- event.preventDefault();
3792
- const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3793
- const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
3794
- if (distance > PRESS_AND_MOVE_BUFFER) {
3795
- addResizing(board, targetElement);
3796
- targetElementRef = {
3797
- minWidth: NodeSpace.getNodeResizableMinWidth(board, targetElement),
3798
- currentWidth: NodeSpace.getNodeDynamicWidth(board, targetElement),
3799
- path: PlaitBoard.findPath(board, targetElement),
3800
- textManage: MindElement.getTextManage(targetElement)
3766
+ const options = {
3767
+ key: 'mind-node',
3768
+ canResize: () => {
3769
+ return !isDragging(board);
3770
+ },
3771
+ detect: (point) => {
3772
+ const newTargetElement = getSelectedTarget(board, point);
3773
+ if (newTargetElement) {
3774
+ return {
3775
+ element: newTargetElement,
3776
+ handle: null,
3777
+ cursorClass: ResizeCursorClass.ew
3801
3778
  };
3802
- MERGING.set(board, true);
3803
3779
  }
3804
- }
3805
- if (isMindNodeResizing(board) && startPoint && targetElementRef) {
3806
- // prevent text from being selected
3807
- event.preventDefault();
3808
- preventTouchMove(board, event, true);
3809
- throttleRAF(() => {
3810
- if (!startPoint) {
3811
- return;
3812
- }
3813
- const endPoint = [event.x, event.y];
3814
- const offsetX = endPoint[0] - startPoint[0];
3815
- const zoom = board.viewport.zoom;
3816
- let resizedWidth = targetElementRef.currentWidth + offsetX / zoom;
3817
- if (resizedWidth <= targetElementRef.minWidth) {
3818
- resizedWidth = targetElementRef.minWidth;
3819
- }
3820
- const newTarget = PlaitNode.get(board, targetElementRef.path);
3821
- if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
3822
- targetElementRef.textManage.updateRectangleWidth(resizedWidth);
3823
- const { height } = targetElementRef.textManage.getSize();
3824
- MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth * zoom, height);
3825
- }
3826
- });
3827
- return;
3828
- }
3829
- else {
3830
- // press and start drag when node is non selected
3831
- if (!isDragging(board)) {
3832
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3833
- const newTargetElement = getSelectedTarget(board, point);
3834
- if (newTargetElement) {
3835
- PlaitBoard.getBoardContainer(board).classList.add(`mind-${ResizeCursorClass['ew']}`);
3836
- }
3837
- else {
3838
- PlaitBoard.getBoardContainer(board).classList.remove(`mind-${ResizeCursorClass['ew']}`);
3839
- }
3780
+ return null;
3781
+ },
3782
+ beforeResize: (resizeRef) => {
3783
+ targetElementRef = {
3784
+ minWidth: NodeSpace.getNodeResizableMinWidth(board, resizeRef.element),
3785
+ currentWidth: NodeSpace.getNodeDynamicWidth(board, resizeRef.element),
3786
+ path: PlaitBoard.findPath(board, resizeRef.element),
3787
+ textManage: MindElement.getTextManage(resizeRef.element)
3788
+ };
3789
+ },
3790
+ onResize: (resizeRef, resizeState) => {
3791
+ const zoom = board.viewport.zoom;
3792
+ let resizedWidth = targetElementRef.currentWidth + resizeState.offsetX / zoom;
3793
+ if (resizedWidth <= targetElementRef.minWidth) {
3794
+ resizedWidth = targetElementRef.minWidth;
3840
3795
  }
3841
- }
3842
- pointerMove(event);
3843
- };
3844
- board.globalPointerUp = (event) => {
3845
- globalPointerUp(event);
3846
- if (isMindNodeResizing(board) || targetElement) {
3847
- targetElement && removeResizing(board, targetElement);
3796
+ const newTarget = PlaitNode.get(board, targetElementRef.path);
3797
+ if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
3798
+ targetElementRef.textManage.updateRectangleWidth(resizedWidth);
3799
+ const { height } = targetElementRef.textManage.getSize();
3800
+ MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth * zoom, height);
3801
+ }
3802
+ },
3803
+ afterResize: (resizeRef) => {
3848
3804
  targetElementRef = null;
3849
- targetElement = null;
3850
- startPoint = null;
3851
- MERGING.set(board, false);
3852
- preventTouchMove(board, event, false);
3853
3805
  }
3854
3806
  };
3807
+ withResize(board, options);
3855
3808
  return board;
3856
3809
  };
3857
- const IS_MIND_NODE_RESIZING = new WeakMap();
3858
- const isMindNodeResizing = (board) => {
3859
- return !!IS_MIND_NODE_RESIZING.get(board);
3860
- };
3861
- const addResizing = (board, element) => {
3862
- PlaitBoard.getBoardContainer(board).classList.add('mind-node-resizing');
3863
- const component = PlaitElement.getComponent(element);
3864
- component.g.classList.add('resizing');
3865
- IS_MIND_NODE_RESIZING.set(board, true);
3866
- };
3867
- const removeResizing = (board, element) => {
3868
- PlaitBoard.getBoardContainer(board).classList.remove('mind-node-resizing');
3869
- PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew']);
3870
- const component = PlaitElement.getComponent(element);
3871
- if (component && component.g) {
3872
- component.g.classList.remove('resizing');
3873
- }
3874
- IS_MIND_NODE_RESIZING.set(board, false);
3875
- };
3876
3810
  const getSelectedTarget = (board, point) => {
3877
3811
  const selectedElements = getSelectedElements(board).filter(value => MindElement.isMindElement(board, value));
3878
3812
  if (selectedElements.length > 0) {