@plait/draw 0.1.0-next.3 → 0.1.0-next.4

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,9 +1,10 @@
1
- import { idCreator, distanceBetweenPointAndSegments, PlaitBoard, createG, arrowPoints, drawLinearPath, getElementById, RectangleClient } from '@plait/core';
2
- import { getPoints, Direction, getRectangleByPoints, getDirectionByPoint, getPointOnPolyline } from '@plait/common';
3
- import { LineMarkerType } from '../interfaces';
1
+ import { idCreator, distanceBetweenPointAndSegments, PlaitBoard, createG, arrowPoints, drawLinearPath, getElementById, RectangleClient, setPathStrokeLinecap } from '@plait/core';
2
+ import { getPoints, Direction, getRectangleByPoints, getDirectionByPoint, getPointOnPolyline, getDirectionFactor, getDirectionBetweenPointAndPoint } from '@plait/common';
3
+ import { LineMarkerType, PlaitLine } from '../interfaces';
4
4
  import { getPointsByCenterPoint, getNearestPoint } from './geometry';
5
5
  import { getLineDashByElement, getStrokeColorByElement, getStrokeWidthByElement } from './geometry-style/stroke';
6
6
  import { getEngine } from './engine';
7
+ const BOUNDED_HANDLE_OFFSET = 0.5;
7
8
  export const createLineElement = (shape, points, source, target, options) => {
8
9
  return {
9
10
  id: idCreator(),
@@ -67,26 +68,32 @@ export const drawElbowLine = (board, element) => {
67
68
  const elbowLine = PlaitBoard.getRoughSVG(board).linearPath(points, options);
68
69
  const path = elbowLine.querySelector('path');
69
70
  path?.setAttribute('mask', `url(#${element.id})`);
71
+ setPathStrokeLinecap(elbowLine, 'square');
70
72
  lineG.appendChild(elbowLine);
71
73
  const arrow = drawLineArrow(element, points, options);
72
74
  arrow && lineG.appendChild(arrow);
73
75
  return lineG;
74
76
  };
75
77
  export const drawLineArrow = (element, points, options) => {
76
- const sourceMarker = element.source.marker;
77
- const targetMarker = element.target.marker;
78
78
  const arrowG = createG();
79
- if (sourceMarker === LineMarkerType.none && targetMarker === LineMarkerType.none)
79
+ if (PlaitLine.isSourceMark(element, LineMarkerType.none) && PlaitLine.isTargetMark(element, LineMarkerType.none)) {
80
80
  return null;
81
- if (sourceMarker === LineMarkerType.arrow) {
81
+ }
82
+ if (PlaitLine.isSourceMark(element, LineMarkerType.arrow)) {
82
83
  const sourcePoint = points[0];
83
- const { pointLeft, pointRight } = arrowPoints(points[1], sourcePoint, 10, 20);
84
+ const { pointLeft, pointRight } = arrowPoints(points[1], sourcePoint, 12, 40);
84
85
  const sourceArrow = drawLinearPath([pointLeft, sourcePoint, pointRight], options);
85
86
  arrowG.appendChild(sourceArrow);
86
87
  }
87
- if (targetMarker === LineMarkerType.arrow) {
88
- const endPoint = points[points.length - 1];
89
- const { pointLeft, pointRight } = arrowPoints(points[points.length - 2], endPoint, 10, 20);
88
+ if (PlaitLine.isTargetMark(element, LineMarkerType.arrow)) {
89
+ const _endPoint = points[points.length - 1];
90
+ const arrowDirection = getDirectionBetweenPointAndPoint(points[points.length - 2], _endPoint);
91
+ const directionFactor = getDirectionFactor(arrowDirection);
92
+ const endPoint = [
93
+ _endPoint[0] + BOUNDED_HANDLE_OFFSET * directionFactor.x,
94
+ _endPoint[1] + BOUNDED_HANDLE_OFFSET * directionFactor.y
95
+ ];
96
+ const { pointLeft, pointRight } = arrowPoints(points[points.length - 2], endPoint, 12, 40);
90
97
  const targetArrow = drawLinearPath([pointLeft, endPoint, pointRight], options);
91
98
  arrowG.appendChild(targetArrow);
92
99
  }
@@ -94,24 +101,29 @@ export const drawLineArrow = (element, points, options) => {
94
101
  };
95
102
  export const getSourcePoint = (board, element) => {
96
103
  if (element.source.boundId) {
104
+ const connectionOffset = PlaitLine.isSourceMark(element, LineMarkerType.arrow) ? BOUNDED_HANDLE_OFFSET : 0;
97
105
  const boundElement = getElementById(board, element.source.boundId);
98
- return boundElement ? normalizeConnection(boundElement, element.source.connection) : element.points[0];
106
+ return boundElement ? getConnectionPoint(boundElement, element.source.connection, connectionOffset) : element.points[0];
99
107
  }
100
108
  return element.points[0];
101
109
  };
102
110
  export const getTargetPoint = (board, element) => {
103
111
  if (element.target.boundId) {
112
+ const connectionOffset = PlaitLine.isTargetMark(element, LineMarkerType.arrow) ? BOUNDED_HANDLE_OFFSET : 0;
104
113
  const boundElement = getElementById(board, element.target.boundId);
105
- return boundElement ? normalizeConnection(boundElement, element.target.connection) : element.points[element.points.length - 1];
114
+ return boundElement
115
+ ? getConnectionPoint(boundElement, element.target.connection, connectionOffset)
116
+ : element.points[element.points.length - 1];
106
117
  }
107
118
  return element.points[element.points.length - 1];
108
119
  };
109
- export const normalizeConnection = (geometry, connection) => {
120
+ export const getConnectionPoint = (geometry, connection, offset) => {
110
121
  const rectangle = getRectangleByPoints(geometry.points);
111
122
  const strokeWidth = getStrokeWidthByElement(geometry);
123
+ const directionFactor = getDirectionFactor(getDirectionByPoint(connection, Direction.bottom));
112
124
  return [
113
- rectangle.x - strokeWidth / 2 + (rectangle.width + strokeWidth) * connection[0],
114
- rectangle.y - strokeWidth / 2 + (rectangle.height + strokeWidth) * connection[1]
125
+ rectangle.x + rectangle.width * connection[0] + strokeWidth * directionFactor.x + offset * directionFactor.x,
126
+ rectangle.y + rectangle.height * connection[1] + strokeWidth * directionFactor.y + offset * directionFactor.y
115
127
  ];
116
128
  };
117
129
  export const transformPointToConnection = (board, point, hitElement) => {
@@ -142,4 +154,4 @@ export const getLineTextRectangle = (board, element, index) => {
142
154
  height: text.height
143
155
  };
144
156
  };
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCwrQkFBK0IsRUFDL0IsVUFBVSxFQUNWLE9BQU8sRUFDUCxXQUFXLEVBQ1gsY0FBYyxFQUNkLGNBQWMsRUFDZCxlQUFlLEVBQ2xCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBYyxjQUFjLEVBQXVDLE1BQU0sZUFBZSxDQUFDO0FBRWhHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUM3QixLQUFnQixFQUNoQixNQUFzQixFQUN0QixNQUFrQixFQUNsQixNQUFrQixFQUNsQixPQUF3RCxFQUMvQyxFQUFFO0lBQ1gsT0FBTztRQUNILEVBQUUsRUFBRSxTQUFTLEVBQUU7UUFDZixJQUFJLEVBQUUsTUFBTTtRQUNaLEtBQUs7UUFDTCxNQUFNO1FBQ04sS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNO1FBQ04sT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNO1FBQ04sR0FBRyxPQUFPO0tBQ2IsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBa0IsRUFBRSxFQUFFO0lBQ3BFLElBQUksT0FBTyxDQUFDLE1BQU0s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RCxPQUFPO1FBQ0gsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBTSxHQUFHLENBQUM7UUFDN0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTyxHQUFHLENBQUM7UUFDOUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFNO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTztLQUN2QixDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBQb2ludCxcbiAgICBpZENyZWF0b3IsXG4gICAgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRTZWdtZW50cyxcbiAgICBQbGFpdEJvYXJkLFxuICAgIGNyZWF0ZUcsXG4gICAgYXJyb3dQb2ludHMsXG4gICAgZHJhd0xpbmVhclBhdGgsXG4gICAgZ2V0RWxlbWVudEJ5SWQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50XG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IGdldFBvaW50cywgRGlyZWN0aW9uLCBnZXRSZWN0YW5nbGVCeVBvaW50cywgZ2V0RGlyZWN0aW9uQnlQb2ludCwgZ2V0UG9pbnRPblBvbHlsaW5lIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBMaW5lSGFuZGxlLCBMaW5lTWFya2VyVHlwZSwgTGluZVNoYXBlLCBQbGFpdEdlb21ldHJ5LCBQbGFpdExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IGdldFBvaW50c0J5Q2VudGVyUG9pbnQsIGdldE5lYXJlc3RQb2ludCB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0TGluZURhc2hCeUVsZW1lbnQsIGdldFN0cm9rZUNvbG9yQnlFbGVtZW50LCBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCB9IGZyb20gJy4vZ2VvbWV0cnktc3R5bGUvc3Ryb2tlJztcbmltcG9ydCB7IGdldEVuZ2luZSB9IGZyb20gJy4vZW5naW5lJztcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxpbmVFbGVtZW50ID0gKFxuICAgIHNoYXBlOiBMaW5lU2hhcGUsXG4gICAgcG9pbnRzOiBbUG9pbnQsIFBvaW50XSxcbiAgICBzb3VyY2U6IExpbmVIYW5kbGUsXG4gICAgdGFyZ2V0OiBMaW5lSGFuZGxlLFxuICAgIG9wdGlvbnM/OiBQaWNrPFBsYWl0TGluZSwgJ3N0cm9rZUNvbG9yJyB8ICdzdHJva2VXaWR0aCc+XG4pOiBQbGFpdExpbmUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZENyZWF0b3IoKSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0ZXh0czogW10sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGJvd1BvaW50cyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRTb3VyY2VQb2ludChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldFBvaW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgbGV0IHNvdXJjZURpcmVjdGlvbiA9IHNvdXJjZVswXSA8IHRhcmdldFswXSA/IERpcmVjdGlvbi5yaWdodCA6IERpcmVjdGlvbi5sZWZ0O1xuICAgICAgICBsZXQgdGFyZ2V0RGlyZWN0aW9uID0gc291cmNlWzBdIDwgdGFyZ2V0WzBdID8gRGlyZWN0aW9uLmxlZnQgOiBEaXJlY3Rpb24ucmlnaHQ7XG4gICAgICAgIGlmIChlbGVtZW50LnNvdXJjZS5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBzb3VyY2VEaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVBvaW50KGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24sIHNvdXJjZURpcmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQudGFyZ2V0LmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRhcmdldERpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5UG9pbnQoZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiwgdGFyZ2V0RGlyZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludHM6IFBvaW50W10gPSBnZXRQb2ludHMoc291cmNlLCBzb3VyY2VEaXJlY3Rpb24sIHRhcmdldCwgdGFyZ2V0RGlyZWN0aW9uLCAzMCk7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBvaW50cztcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdFBvbHlMaW5lID0gKHBhdGhQb2ludHM6IFBvaW50W10sIHBvaW50OiBQb2ludCwgc3Ryb2tlV2lkdGg6IG51bWJlciwgZXhwYW5kOiBudW1iZXIgPSAwKSA9PiB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFNlZ21lbnRzKHBhdGhQb2ludHMsIHBvaW50KTtcbiAgICByZXR1cm4gZGlzdGFuY2UgPD0gc3Ryb2tlV2lkdGggKyBleHBhbmQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0TGluZVRleHRJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCB0ZXh0cyA9IGVsZW1lbnQudGV4dHM7XG4gICAgaWYgKCF0ZXh0cy5sZW5ndGgpIHJldHVybiAtMTtcblxuICAgIGNvbnN0IHBvaW50cyA9IGdldEVsYm93UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICByZXR1cm4gdGV4dHMuZmluZEluZGV4KHRleHQgPT4ge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBnZXRQb2ludE9uUG9seWxpbmUocG9pbnRzLCB0ZXh0LnBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0ge1xuICAgICAgICAgICAgeDogY2VudGVyWzBdIC0gdGV4dC53aWR0aCEgLyAyLFxuICAgICAgICAgICAgeTogY2VudGVyWzFdIC0gdGV4dC5oZWlnaHQhIC8gMixcbiAgICAgICAgICAgIHdpZHRoOiB0ZXh0LndpZHRoISxcbiAgICAgICAgICAgIGhlaWdodDogdGV4dC5oZWlnaHQhXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQocmVjdGFuZ2xlLCBSZWN0YW5nbGVDbGllbnQudG9SZWN0YW5nbGVDbGllbnQoW3BvaW50LCBwb2ludF0pKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdExpbmVUZXh0ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIHJldHVybiBnZXRIaXRMaW5lVGV4dEluZGV4KGJvYXJkLCBlbGVtZW50LCBwb2ludCkgIT09IC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGRyYXdFbGJvd0xpbmUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSBnZXRTdHJva2VDb2xvckJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VMaW5lRGFzaCA9IGdldExpbmVEYXNoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHN0cm9rZTogc3Ryb2tlQ29sb3IsIHN0cm9rZVdpZHRoLCBzdHJva2VMaW5lRGFzaCB9O1xuICAgIGNvbnN0IGxpbmVHID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldEVsYm93UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBlbGJvd0xpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5saW5lYXJQYXRoKHBvaW50cywgb3B0aW9ucyk7XG4gICAgY29uc3QgcGF0aCA9IGVsYm93TGluZS5xdWVyeVNlbGVjdG9yKCdwYXRoJyk7XG4gICAgcGF0aD8uc2V0QXR0cmlidXRlKCdtYXNrJywgYHVybCgjJHtlbGVtZW50LmlkfSlgKTtcbiAgICBsaW5lRy5hcHBlbmRDaGlsZChlbGJvd0xpbmUpO1xuICAgIGNvbnN0IGFycm93ID0gZHJhd0xpbmVBcnJvdyhlbGVtZW50LCBwb2ludHMsIG9wdGlvbnMpO1xuICAgIGFycm93ICYmIGxpbmVHLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICByZXR1cm4gbGluZUc7XG59O1xuXG5leHBvcnQgY29uc3QgZHJhd0xpbmVBcnJvdyA9IChlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50czogUG9pbnRbXSwgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHNvdXJjZU1hcmtlciA9IGVsZW1lbnQuc291cmNlLm1hcmtlcjtcbiAgICBjb25zdCB0YXJnZXRNYXJrZXIgPSBlbGVtZW50LnRhcmdldC5tYXJrZXI7XG4gICAgY29uc3QgYXJyb3dHID0gY3JlYXRlRygpO1xuICAgIGlmIChzb3VyY2VNYXJrZXIgPT09IExpbmVNYXJrZXJUeXBlLm5vbmUgJiYgdGFyZ2V0TWFya2VyID09PSBMaW5lTWFya2VyVHlwZS5ub25lKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoc291cmNlTWFya2VyID09PSBMaW5lTWFya2VyVHlwZS5hcnJvdykge1xuICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHBvaW50c1swXTtcbiAgICAgICAgY29uc3QgeyBwb2ludExlZnQsIHBvaW50UmlnaHQgfSA9IGFycm93UG9pbnRzKHBvaW50c1sxXSwgc291cmNlUG9pbnQsIDEwLCAyMCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFycm93ID0gZHJhd0xpbmVhclBhdGgoW3BvaW50TGVmdCwgc291cmNlUG9pbnQsIHBvaW50UmlnaHRdLCBvcHRpb25zKTtcbiAgICAgICAgYXJyb3dHLmFwcGVuZENoaWxkKHNvdXJjZUFycm93KTtcbiAgICB9XG4gICAgaWYgKHRhcmdldE1hcmtlciA9PT0gTGluZU1hcmtlclR5cGUuYXJyb3cpIHtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCB7IHBvaW50TGVmdCwgcG9pbnRSaWdodCB9ID0gYXJyb3dQb2ludHMocG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXSwgZW5kUG9pbnQsIDEwLCAyMCk7XG4gICAgICAgIGNvbnN0IHRhcmdldEFycm93ID0gZHJhd0xpbmVhclBhdGgoW3BvaW50TGVmdCwgZW5kUG9pbnQsIHBvaW50UmlnaHRdLCBvcHRpb25zKTtcbiAgICAgICAgYXJyb3dHLmFwcGVuZENoaWxkKHRhcmdldEFycm93KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycm93Rztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTb3VyY2VQb2ludCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQuc291cmNlLmJvdW5kSWQpIHtcbiAgICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0RWxlbWVudEJ5SWQ8UGxhaXRHZW9tZXRyeT4oYm9hcmQsIGVsZW1lbnQuc291cmNlLmJvdW5kSWQpO1xuICAgICAgICByZXR1cm4gYm91bmRFbGVtZW50ID8gbm9ybWFsaXplQ29ubmVjdGlvbihib3VuZEVsZW1lbnQsIGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24hKSA6IGVsZW1lbnQucG9pbnRzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wb2ludHNbMF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFyZ2V0UG9pbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LnRhcmdldC5ib3VuZElkKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEVsZW1lbnRCeUlkPFBsYWl0R2VvbWV0cnk+KGJvYXJkLCBlbGVtZW50LnRhcmdldC5ib3VuZElkKTtcbiAgICAgICAgcmV0dXJuIGJvdW5kRWxlbWVudCA/IG5vcm1hbGl6ZUNvbm5lY3Rpb24oYm91bmRFbGVtZW50LCBlbGVtZW50LnRhcmdldC5jb25uZWN0aW9uISkgOiBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdO1xufTtcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUNvbm5lY3Rpb24gPSAoZ2VvbWV0cnk6IFBsYWl0R2VvbWV0cnksIGNvbm5lY3Rpb246IFBvaW50KTogUG9pbnQgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5UG9pbnRzKGdlb21ldHJ5LnBvaW50cyk7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChnZW9tZXRyeSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcmVjdGFuZ2xlLnggLSBzdHJva2VXaWR0aCAvIDIgKyAocmVjdGFuZ2xlLndpZHRoICsgc3Ryb2tlV2lkdGgpICogY29ubmVjdGlvblswXSxcbiAgICAgICAgcmVjdGFuZ2xlLnkgLSBzdHJva2VXaWR0aCAvIDIgKyAocmVjdGFuZ2xlLmhlaWdodCArIHN0cm9rZVdpZHRoKSAqIGNvbm5lY3Rpb25bMV1cbiAgICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVBvaW50VG9Db25uZWN0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkpOiBQb2ludCA9PiB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KGhpdEVsZW1lbnQpICsgMSkgLyAyO1xuICAgIGxldCByZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeVBvaW50cyhoaXRFbGVtZW50LnBvaW50cyk7XG4gICAgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldE91dGxpbmVSZWN0YW5nbGUocmVjdGFuZ2xlLCAtb2Zmc2V0KTtcbiAgICBsZXQgbmVhcmVzdFBvaW50ID0gZ2V0TmVhcmVzdFBvaW50KGhpdEVsZW1lbnQsIHBvaW50LCBvZmZzZXQpO1xuICAgIGNvbnN0IGhpdENvbm5lY3RvciA9IGdldEhpdENvbm5lY3RvclBvaW50KG5lYXJlc3RQb2ludCwgaGl0RWxlbWVudCwgcmVjdGFuZ2xlKTtcbiAgICBuZWFyZXN0UG9pbnQgPSBoaXRDb25uZWN0b3IgPyBoaXRDb25uZWN0b3IgOiBuZWFyZXN0UG9pbnQ7XG4gICAgcmV0dXJuIFsobmVhcmVzdFBvaW50WzBdIC0gcmVjdGFuZ2xlLngpIC8gcmVjdGFuZ2xlLndpZHRoLCAobmVhcmVzdFBvaW50WzFdIC0gcmVjdGFuZ2xlLnkpIC8gcmVjdGFuZ2xlLmhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0Q29ubmVjdG9yUG9pbnQgPSAobW92aW5nUG9pbnQ6IFBvaW50LCBoaXRFbGVtZW50OiBQbGFpdEdlb21ldHJ5LCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGNvbm5lY3RvciA9IGdldEVuZ2luZShoaXRFbGVtZW50LnNoYXBlKS5nZXRDb25uZWN0b3JQb2ludHMocmVjdGFuZ2xlKTtcbiAgICBjb25zdCBwb2ludHMgPSBnZXRQb2ludHNCeUNlbnRlclBvaW50KG1vdmluZ1BvaW50LCA1LCA1KTtcbiAgICBjb25zdCBwb2ludFJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5UG9pbnRzKHBvaW50cyk7XG4gICAgcmV0dXJuIGNvbm5lY3Rvci5maW5kKHBvaW50ID0+IHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChwb2ludFJlY3RhbmdsZSwgUmVjdGFuZ2xlQ2xpZW50LnRvUmVjdGFuZ2xlQ2xpZW50KFtwb2ludCwgcG9pbnRdKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGluZVRleHRSZWN0YW5nbGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgaW5kZXg6IG51bWJlcik6IFJlY3RhbmdsZUNsaWVudCA9PiB7XG4gICAgY29uc3QgdGV4dCA9IGVsZW1lbnQudGV4dHNbaW5kZXhdO1xuICAgIGNvbnN0IGVsYm93UG9pbnRzID0gZ2V0RWxib3dQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnRPblBvbHlsaW5lKGVsYm93UG9pbnRzLCB0ZXh0LnBvc2l0aW9uKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBwb2ludFswXSAtIHRleHQud2lkdGghIC8gMixcbiAgICAgICAgeTogcG9pbnRbMV0gLSB0ZXh0LmhlaWdodCEgLyAyLFxuICAgICAgICB3aWR0aDogdGV4dC53aWR0aCEsXG4gICAgICAgIGhlaWdodDogdGV4dC5oZWlnaHQhXG4gICAgfTtcbn07XG4iXX0=
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCwrQkFBK0IsRUFDL0IsVUFBVSxFQUNWLE9BQU8sRUFDUCxXQUFXLEVBQ1gsY0FBYyxFQUNkLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3ZCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixnQ0FBZ0MsRUFDbkMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLGNBQWMsRUFBNEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVyQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUM3QixLQUFnQixFQUNoQixNQUFzQixFQUN0QixNQUFrQixFQUNsQixNQUFrQixFQUNsQixPQUF3RCxFQUMvQyxFQUFFO0lBQ1gsT0FBTztRQUNILEVBQUUsRUFBRSxTQUFTLEVBQUU7UUFDZixJQUFJLEVBQUUsTUFBTTtRQUNaLEtBQUs7UUFDTCxNQUFNO1FBQ04sS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNO1FBQ04sT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNO1FBQ04sR0FBRyxPQUFPO0tBQ2IsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVG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LENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU8sR0FBRyxDQUFDO1FBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBTTtRQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU87S0FDdkIsQ0FBQztBQUNOLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgUG9pbnQsXG4gICAgaWRDcmVhdG9yLFxuICAgIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudHMsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBjcmVhdGVHLFxuICAgIGFycm93UG9pbnRzLFxuICAgIGRyYXdMaW5lYXJQYXRoLFxuICAgIGdldEVsZW1lbnRCeUlkLFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBzZXRQYXRoU3Ryb2tlTGluZWNhcFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQge1xuICAgIGdldFBvaW50cyxcbiAgICBEaXJlY3Rpb24sXG4gICAgZ2V0UmVjdGFuZ2xlQnlQb2ludHMsXG4gICAgZ2V0RGlyZWN0aW9uQnlQb2ludCxcbiAgICBnZXRQb2ludE9uUG9seWxpbmUsXG4gICAgZ2V0RGlyZWN0aW9uRmFjdG9yLFxuICAgIGdldERpcmVjdGlvbkJldHdlZW5Qb2ludEFuZFBvaW50XG59IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgTGluZUhhbmRsZSwgTGluZU1hcmtlclR5cGUsIExpbmVTaGFwZSwgUGxhaXRHZW9tZXRyeSwgUGxhaXRMaW5lIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBnZXRQb2ludHNCeUNlbnRlclBvaW50LCBnZXROZWFyZXN0UG9pbnQgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7IGdldExpbmVEYXNoQnlFbGVtZW50LCBnZXRTdHJva2VDb2xvckJ5RWxlbWVudCwgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuL2dlb21ldHJ5LXN0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuL2VuZ2luZSc7XG5cbmNvbnN0IEJPVU5ERURfSEFORExFX09GRlNFVCA9IDAuNTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxpbmVFbGVtZW50ID0gKFxuICAgIHNoYXBlOiBMaW5lU2hhcGUsXG4gICAgcG9pbnRzOiBbUG9pbnQsIFBvaW50XSxcbiAgICBzb3VyY2U6IExpbmVIYW5kbGUsXG4gICAgdGFyZ2V0OiBMaW5lSGFuZGxlLFxuICAgIG9wdGlvbnM/OiBQaWNrPFBsYWl0TGluZSwgJ3N0cm9rZUNvbG9yJyB8ICdzdHJva2VXaWR0aCc+XG4pOiBQbGFpdExpbmUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZENyZWF0b3IoKSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0ZXh0czogW10sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGJvd1BvaW50cyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRTb3VyY2VQb2ludChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldFBvaW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgbGV0IHNvdXJjZURpcmVjdGlvbiA9IHNvdXJjZVswXSA8IHRhcmdldFswXSA/IERpcmVjdGlvbi5yaWdodCA6IERpcmVjdGlvbi5sZWZ0O1xuICAgICAgICBsZXQgdGFyZ2V0RGlyZWN0aW9uID0gc291cmNlWzBdIDwgdGFyZ2V0WzBdID8gRGlyZWN0aW9uLmxlZnQgOiBEaXJlY3Rpb24ucmlnaHQ7XG4gICAgICAgIGlmIChlbGVtZW50LnNvdXJjZS5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBzb3VyY2VEaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVBvaW50KGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24sIHNvdXJjZURpcmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQudGFyZ2V0LmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRhcmdldERpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5UG9pbnQoZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiwgdGFyZ2V0RGlyZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludHM6IFBvaW50W10gPSBnZXRQb2ludHMoc291cmNlLCBzb3VyY2VEaXJlY3Rpb24sIHRhcmdldCwgdGFyZ2V0RGlyZWN0aW9uLCAzMCk7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBvaW50cztcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdFBvbHlMaW5lID0gKHBhdGhQb2ludHM6IFBvaW50W10sIHBvaW50OiBQb2ludCwgc3Ryb2tlV2lkdGg6IG51bWJlciwgZXhwYW5kOiBudW1iZXIgPSAwKSA9PiB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFNlZ21lbnRzKHBhdGhQb2ludHMsIHBvaW50KTtcbiAgICByZXR1cm4gZGlzdGFuY2UgPD0gc3Ryb2tlV2lkdGggKyBleHBhbmQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0TGluZVRleHRJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCB0ZXh0cyA9IGVsZW1lbnQudGV4dHM7XG4gICAgaWYgKCF0ZXh0cy5sZW5ndGgpIHJldHVybiAtMTtcblxuICAgIGNvbnN0IHBvaW50cyA9IGdldEVsYm93UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICByZXR1cm4gdGV4dHMuZmluZEluZGV4KHRleHQgPT4ge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBnZXRQb2ludE9uUG9seWxpbmUocG9pbnRzLCB0ZXh0LnBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0ge1xuICAgICAgICAgICAgeDogY2VudGVyWzBdIC0gdGV4dC53aWR0aCEgLyAyLFxuICAgICAgICAgICAgeTogY2VudGVyWzFdIC0gdGV4dC5oZWlnaHQhIC8gMixcbiAgICAgICAgICAgIHdpZHRoOiB0ZXh0LndpZHRoISxcbiAgICAgICAgICAgIGhlaWdodDogdGV4dC5oZWlnaHQhXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQocmVjdGFuZ2xlLCBSZWN0YW5nbGVDbGllbnQudG9SZWN0YW5nbGVDbGllbnQoW3BvaW50LCBwb2ludF0pKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdExpbmVUZXh0ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIHJldHVybiBnZXRIaXRMaW5lVGV4dEluZGV4KGJvYXJkLCBlbGVtZW50LCBwb2ludCkgIT09IC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGRyYXdFbGJvd0xpbmUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSBnZXRTdHJva2VDb2xvckJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VMaW5lRGFzaCA9IGdldExpbmVEYXNoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHN0cm9rZTogc3Ryb2tlQ29sb3IsIHN0cm9rZVdpZHRoLCBzdHJva2VMaW5lRGFzaCB9O1xuICAgIGNvbnN0IGxpbmVHID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldEVsYm93UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBlbGJvd0xpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5saW5lYXJQYXRoKHBvaW50cywgb3B0aW9ucyk7XG4gICAgY29uc3QgcGF0aCA9IGVsYm93TGluZS5xdWVyeVNlbGVjdG9yKCdwYXRoJyk7XG4gICAgcGF0aD8uc2V0QXR0cmlidXRlKCdtYXNrJywgYHVybCgjJHtlbGVtZW50LmlkfSlgKTtcbiAgICBzZXRQYXRoU3Ryb2tlTGluZWNhcChlbGJvd0xpbmUsICdzcXVhcmUnKTtcbiAgICBsaW5lRy5hcHBlbmRDaGlsZChlbGJvd0xpbmUpO1xuICAgIGNvbnN0IGFycm93ID0gZHJhd0xpbmVBcnJvdyhlbGVtZW50LCBwb2ludHMsIG9wdGlvbnMpO1xuICAgIGFycm93ICYmIGxpbmVHLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICByZXR1cm4gbGluZUc7XG59O1xuXG5leHBvcnQgY29uc3QgZHJhd0xpbmVBcnJvdyA9IChlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50czogUG9pbnRbXSwgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGFycm93RyA9IGNyZWF0ZUcoKTtcbiAgICBpZiAoUGxhaXRMaW5lLmlzU291cmNlTWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lKSAmJiBQbGFpdExpbmUuaXNUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoUGxhaXRMaW5lLmlzU291cmNlTWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5hcnJvdykpIHtcbiAgICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBwb2ludHNbMF07XG4gICAgICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhwb2ludHNbMV0sIHNvdXJjZVBvaW50LCAxMiwgNDApO1xuICAgICAgICBjb25zdCBzb3VyY2VBcnJvdyA9IGRyYXdMaW5lYXJQYXRoKFtwb2ludExlZnQsIHNvdXJjZVBvaW50LCBwb2ludFJpZ2h0XSwgb3B0aW9ucyk7XG4gICAgICAgIGFycm93Ry5hcHBlbmRDaGlsZChzb3VyY2VBcnJvdyk7XG4gICAgfVxuICAgIGlmIChQbGFpdExpbmUuaXNUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLmFycm93KSkge1xuICAgICAgICBjb25zdCBfZW5kUG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBhcnJvd0RpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJldHdlZW5Qb2ludEFuZFBvaW50KHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0sIF9lbmRQb2ludCk7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihhcnJvd0RpcmVjdGlvbik7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50OiBQb2ludCA9IFtcbiAgICAgICAgICAgIF9lbmRQb2ludFswXSArIEJPVU5ERURfSEFORExFX09GRlNFVCAqIGRpcmVjdGlvbkZhY3Rvci54LFxuICAgICAgICAgICAgX2VuZFBvaW50WzFdICsgQk9VTkRFRF9IQU5ETEVfT0ZGU0VUICogZGlyZWN0aW9uRmFjdG9yLnlcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgeyBwb2ludExlZnQsIHBvaW50UmlnaHQgfSA9IGFycm93UG9pbnRzKHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0sIGVuZFBvaW50LCAxMiwgNDApO1xuICAgICAgICBjb25zdCB0YXJnZXRBcnJvdyA9IGRyYXdMaW5lYXJQYXRoKFtwb2ludExlZnQsIGVuZFBvaW50LCBwb2ludFJpZ2h0XSwgb3B0aW9ucyk7XG4gICAgICAgIGFycm93Ry5hcHBlbmRDaGlsZCh0YXJnZXRBcnJvdyk7XG4gICAgfVxuICAgIHJldHVybiBhcnJvd0c7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U291cmNlUG9pbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LnNvdXJjZS5ib3VuZElkKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25PZmZzZXQgPSBQbGFpdExpbmUuaXNTb3VyY2VNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLmFycm93KSA/IEJPVU5ERURfSEFORExFX09GRlNFVCA6IDA7XG4gICAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEVsZW1lbnRCeUlkPFBsYWl0R2VvbWV0cnk+KGJvYXJkLCBlbGVtZW50LnNvdXJjZS5ib3VuZElkKTtcbiAgICAgICAgcmV0dXJuIGJvdW5kRWxlbWVudCA/IGdldENvbm5lY3Rpb25Qb2ludChib3VuZEVsZW1lbnQsIGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24hLCBjb25uZWN0aW9uT2Zmc2V0KSA6IGVsZW1lbnQucG9pbnRzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wb2ludHNbMF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFyZ2V0UG9pbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LnRhcmdldC5ib3VuZElkKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25PZmZzZXQgPSBQbGFpdExpbmUuaXNUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLmFycm93KSA/IEJPVU5ERURfSEFORExFX09GRlNFVCA6IDA7XG4gICAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEVsZW1lbnRCeUlkPFBsYWl0R2VvbWV0cnk+KGJvYXJkLCBlbGVtZW50LnRhcmdldC5ib3VuZElkKTtcbiAgICAgICAgcmV0dXJuIGJvdW5kRWxlbWVudFxuICAgICAgICAgICAgPyBnZXRDb25uZWN0aW9uUG9pbnQoYm91bmRFbGVtZW50LCBlbGVtZW50LnRhcmdldC5jb25uZWN0aW9uISwgY29ubmVjdGlvbk9mZnNldClcbiAgICAgICAgICAgIDogZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uUG9pbnQgPSAoZ2VvbWV0cnk6IFBsYWl0R2VvbWV0cnksIGNvbm5lY3Rpb246IFBvaW50LCBvZmZzZXQ6IG51bWJlcik6IFBvaW50ID0+IHtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeVBvaW50cyhnZW9tZXRyeS5wb2ludHMpO1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZ2VvbWV0cnkpO1xuICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihnZXREaXJlY3Rpb25CeVBvaW50KGNvbm5lY3Rpb24sIERpcmVjdGlvbi5ib3R0b20pKTtcbiAgICByZXR1cm4gW1xuICAgICAgICByZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCAqIGNvbm5lY3Rpb25bMF0gKyBzdHJva2VXaWR0aCAqIGRpcmVjdGlvbkZhY3Rvci54ICsgb2Zmc2V0ICogZGlyZWN0aW9uRmFjdG9yLngsXG4gICAgICAgIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCAqIGNvbm5lY3Rpb25bMV0gKyBzdHJva2VXaWR0aCAqIGRpcmVjdGlvbkZhY3Rvci55ICsgb2Zmc2V0ICogZGlyZWN0aW9uRmFjdG9yLnlcbiAgICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVBvaW50VG9Db25uZWN0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkpOiBQb2ludCA9PiB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KGhpdEVsZW1lbnQpICsgMSkgLyAyO1xuICAgIGxldCByZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeVBvaW50cyhoaXRFbGVtZW50LnBvaW50cyk7XG4gICAgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldE91dGxpbmVSZWN0YW5nbGUocmVjdGFuZ2xlLCAtb2Zmc2V0KTtcbiAgICBsZXQgbmVhcmVzdFBvaW50ID0gZ2V0TmVhcmVzdFBvaW50KGhpdEVsZW1lbnQsIHBvaW50LCBvZmZzZXQpO1xuICAgIGNvbnN0IGhpdENvbm5lY3RvciA9IGdldEhpdENvbm5lY3RvclBvaW50KG5lYXJlc3RQb2ludCwgaGl0RWxlbWVudCwgcmVjdGFuZ2xlKTtcbiAgICBuZWFyZXN0UG9pbnQgPSBoaXRDb25uZWN0b3IgPyBoaXRDb25uZWN0b3IgOiBuZWFyZXN0UG9pbnQ7XG4gICAgcmV0dXJuIFsobmVhcmVzdFBvaW50WzBdIC0gcmVjdGFuZ2xlLngpIC8gcmVjdGFuZ2xlLndpZHRoLCAobmVhcmVzdFBvaW50WzFdIC0gcmVjdGFuZ2xlLnkpIC8gcmVjdGFuZ2xlLmhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0Q29ubmVjdG9yUG9pbnQgPSAobW92aW5nUG9pbnQ6IFBvaW50LCBoaXRFbGVtZW50OiBQbGFpdEdlb21ldHJ5LCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGNvbm5lY3RvciA9IGdldEVuZ2luZShoaXRFbGVtZW50LnNoYXBlKS5nZXRDb25uZWN0b3JQb2ludHMocmVjdGFuZ2xlKTtcbiAgICBjb25zdCBwb2ludHMgPSBnZXRQb2ludHNCeUNlbnRlclBvaW50KG1vdmluZ1BvaW50LCA1LCA1KTtcbiAgICBjb25zdCBwb2ludFJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5UG9pbnRzKHBvaW50cyk7XG4gICAgcmV0dXJuIGNvbm5lY3Rvci5maW5kKHBvaW50ID0+IHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChwb2ludFJlY3RhbmdsZSwgUmVjdGFuZ2xlQ2xpZW50LnRvUmVjdGFuZ2xlQ2xpZW50KFtwb2ludCwgcG9pbnRdKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGluZVRleHRSZWN0YW5nbGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgaW5kZXg6IG51bWJlcik6IFJlY3RhbmdsZUNsaWVudCA9PiB7XG4gICAgY29uc3QgdGV4dCA9IGVsZW1lbnQudGV4dHNbaW5kZXhdO1xuICAgIGNvbnN0IGVsYm93UG9pbnRzID0gZ2V0RWxib3dQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnRPblBvbHlsaW5lKGVsYm93UG9pbnRzLCB0ZXh0LnBvc2l0aW9uKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBwb2ludFswXSAtIHRleHQud2lkdGghIC8gMixcbiAgICAgICAgeTogcG9pbnRbMV0gLSB0ZXh0LmhlaWdodCEgLyAyLFxuICAgICAgICB3aWR0aDogdGV4dC53aWR0aCEsXG4gICAgICAgIGhlaWdodDogdGV4dC5oZWlnaHQhXG4gICAgfTtcbn07XG4iXX0=
@@ -1,8 +1,8 @@
1
- import { PlaitElement, RectangleClient, PlaitBoard, isPointInPolygon, getNearestPointBetweenPointAndSegments, isPointInEllipse, drawRectangle, drawRoundRectangle, isPointInRoundRectangle, idCreator, createG, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, drawCircle, distanceBetweenPointAndSegments, arrowPoints, drawLinearPath, getElementById, getSelectedElements, Transforms, clearSelectedElement, addSelectedElement, PlaitNode, Point, PlaitPluginElementComponent, isSelectionMoving, createMask, createRect, transformPoint, toPoint, BoardTransforms, PlaitPointerType, preventTouchMove, createForeignObject, setClipboardData, getDataFromClipboard, depthFirstRecursion, getIsRecursionFunc, getHitElements, isPolylineHitRectangle } from '@plait/core';
1
+ import { PlaitElement, RectangleClient, PlaitBoard, setStrokeLinecap, isPointInPolygon, getNearestPointBetweenPointAndSegments, isPointInEllipse, drawRectangle, drawRoundRectangle, isPointInRoundRectangle, idCreator, createG, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, drawCircle, distanceBetweenPointAndSegments, setPathStrokeLinecap, arrowPoints, drawLinearPath, getElementById, getSelectedElements, Transforms, clearSelectedElement, addSelectedElement, PlaitNode, Point, PlaitPluginElementComponent, isSelectionMoving, createMask, createRect, transformPoint, toPoint, BoardTransforms, PlaitPointerType, preventTouchMove, createForeignObject, setClipboardData, getDataFromClipboard, depthFirstRecursion, getIsRecursionFunc, getHitElements, isPolylineHitRectangle } from '@plait/core';
2
2
  import * as i0 from '@angular/core';
3
3
  import { Component, ChangeDetectionStrategy } from '@angular/core';
4
4
  import { Subject } from 'rxjs';
5
- import { getRectangleByPoints, Direction, getDirectionByPoint, getPoints, getPointOnPolyline, Generator, normalizeShapePoints, ActiveGenerator, RESIZE_HANDLE_DIAMETER, isVirtualKey, isSpaceHotkey, CommonTransforms, getRectangleResizeHandleRefs, ResizeHandle, withResize, isResizingByCondition, getRatioByPoint } from '@plait/common';
5
+ import { getRectangleByPoints, Direction, getDirectionByPoint, getPoints, getPointOnPolyline, getDirectionBetweenPointAndPoint, getDirectionFactor, Generator, normalizeShapePoints, ActiveGenerator, RESIZE_HANDLE_DIAMETER, isVirtualKey, isSpaceHotkey, isDndMode, isDrawingMode, CommonTransforms, getRectangleResizeHandleRefs, ResizeHandle, withResize, isResizingByCondition, getRatioByPoint } from '@plait/common';
6
6
  import { Alignment, buildText, AlignEditor, TextManage, DEFAULT_FONT_SIZE, getTextFromClipboard, getTextSize } from '@plait/text';
7
7
  import { isKeyHotkey } from 'is-hotkey';
8
8
  import { Node } from 'slate';
@@ -37,6 +37,27 @@ var LineShape;
37
37
  LineShape["curve"] = "curve";
38
38
  LineShape["elbow"] = "elbow";
39
39
  })(LineShape || (LineShape = {}));
40
+ const PlaitLine = {
41
+ getTextEditors(element) {
42
+ const component = PlaitElement.getComponent(element);
43
+ if (component) {
44
+ const manage = component.textManages.find(manage => manage.isEditing);
45
+ if (manage) {
46
+ return [manage.componentRef.instance.editor];
47
+ }
48
+ else {
49
+ return component.textManages.map(manage => manage.componentRef.instance.editor);
50
+ }
51
+ }
52
+ throw new Error('can not get correctly component in get text editor');
53
+ },
54
+ isSourceMark(line, markType) {
55
+ return line.source.marker === markType;
56
+ },
57
+ isTargetMark(line, markType) {
58
+ return line.target.marker === markType;
59
+ }
60
+ };
40
61
 
41
62
  const PlaitDrawElement = {
42
63
  isGeometry: (value) => {
@@ -125,7 +146,9 @@ const DiamondEngine = {
125
146
  draw(board, rectangle, options) {
126
147
  const points = RectangleClient.getEdgeCenterPoints(rectangle);
127
148
  const rs = PlaitBoard.getRoughSVG(board);
128
- return rs.polygon(points, { ...options, fillStyle: 'solid' });
149
+ const polygon = rs.polygon(points, { ...options, fillStyle: 'solid' });
150
+ setStrokeLinecap(polygon, 'round');
151
+ return polygon;
129
152
  },
130
153
  isHit(rectangle, point) {
131
154
  const controlPoints = RectangleClient.getEdgeCenterPoints(rectangle);
@@ -198,7 +221,9 @@ const ParallelogramEngine = {
198
221
  draw(board, rectangle, options) {
199
222
  const points = getParallelogramPoints(rectangle);
200
223
  const rs = PlaitBoard.getRoughSVG(board);
201
- return rs.polygon(points, { ...options, fillStyle: 'solid' });
224
+ const polygon = rs.polygon(points, { ...options, fillStyle: 'solid' });
225
+ setStrokeLinecap(polygon, 'round');
226
+ return polygon;
202
227
  },
203
228
  isHit(rectangle, point) {
204
229
  const parallelogramPoints = getParallelogramPoints(rectangle);
@@ -375,6 +400,7 @@ const getCenterPointsOnPolygon = (points) => {
375
400
  return centerPoint;
376
401
  };
377
402
 
403
+ const BOUNDED_HANDLE_OFFSET = 0.5;
378
404
  const createLineElement = (shape, points, source, target, options) => {
379
405
  return {
380
406
  id: idCreator(),
@@ -438,26 +464,32 @@ const drawElbowLine = (board, element) => {
438
464
  const elbowLine = PlaitBoard.getRoughSVG(board).linearPath(points, options);
439
465
  const path = elbowLine.querySelector('path');
440
466
  path?.setAttribute('mask', `url(#${element.id})`);
467
+ setPathStrokeLinecap(elbowLine, 'square');
441
468
  lineG.appendChild(elbowLine);
442
469
  const arrow = drawLineArrow(element, points, options);
443
470
  arrow && lineG.appendChild(arrow);
444
471
  return lineG;
445
472
  };
446
473
  const drawLineArrow = (element, points, options) => {
447
- const sourceMarker = element.source.marker;
448
- const targetMarker = element.target.marker;
449
474
  const arrowG = createG();
450
- if (sourceMarker === LineMarkerType.none && targetMarker === LineMarkerType.none)
475
+ if (PlaitLine.isSourceMark(element, LineMarkerType.none) && PlaitLine.isTargetMark(element, LineMarkerType.none)) {
451
476
  return null;
452
- if (sourceMarker === LineMarkerType.arrow) {
477
+ }
478
+ if (PlaitLine.isSourceMark(element, LineMarkerType.arrow)) {
453
479
  const sourcePoint = points[0];
454
- const { pointLeft, pointRight } = arrowPoints(points[1], sourcePoint, 10, 20);
480
+ const { pointLeft, pointRight } = arrowPoints(points[1], sourcePoint, 12, 40);
455
481
  const sourceArrow = drawLinearPath([pointLeft, sourcePoint, pointRight], options);
456
482
  arrowG.appendChild(sourceArrow);
457
483
  }
458
- if (targetMarker === LineMarkerType.arrow) {
459
- const endPoint = points[points.length - 1];
460
- const { pointLeft, pointRight } = arrowPoints(points[points.length - 2], endPoint, 10, 20);
484
+ if (PlaitLine.isTargetMark(element, LineMarkerType.arrow)) {
485
+ const _endPoint = points[points.length - 1];
486
+ const arrowDirection = getDirectionBetweenPointAndPoint(points[points.length - 2], _endPoint);
487
+ const directionFactor = getDirectionFactor(arrowDirection);
488
+ const endPoint = [
489
+ _endPoint[0] + BOUNDED_HANDLE_OFFSET * directionFactor.x,
490
+ _endPoint[1] + BOUNDED_HANDLE_OFFSET * directionFactor.y
491
+ ];
492
+ const { pointLeft, pointRight } = arrowPoints(points[points.length - 2], endPoint, 12, 40);
461
493
  const targetArrow = drawLinearPath([pointLeft, endPoint, pointRight], options);
462
494
  arrowG.appendChild(targetArrow);
463
495
  }
@@ -465,24 +497,29 @@ const drawLineArrow = (element, points, options) => {
465
497
  };
466
498
  const getSourcePoint = (board, element) => {
467
499
  if (element.source.boundId) {
500
+ const connectionOffset = PlaitLine.isSourceMark(element, LineMarkerType.arrow) ? BOUNDED_HANDLE_OFFSET : 0;
468
501
  const boundElement = getElementById(board, element.source.boundId);
469
- return boundElement ? normalizeConnection(boundElement, element.source.connection) : element.points[0];
502
+ return boundElement ? getConnectionPoint(boundElement, element.source.connection, connectionOffset) : element.points[0];
470
503
  }
471
504
  return element.points[0];
472
505
  };
473
506
  const getTargetPoint = (board, element) => {
474
507
  if (element.target.boundId) {
508
+ const connectionOffset = PlaitLine.isTargetMark(element, LineMarkerType.arrow) ? BOUNDED_HANDLE_OFFSET : 0;
475
509
  const boundElement = getElementById(board, element.target.boundId);
476
- return boundElement ? normalizeConnection(boundElement, element.target.connection) : element.points[element.points.length - 1];
510
+ return boundElement
511
+ ? getConnectionPoint(boundElement, element.target.connection, connectionOffset)
512
+ : element.points[element.points.length - 1];
477
513
  }
478
514
  return element.points[element.points.length - 1];
479
515
  };
480
- const normalizeConnection = (geometry, connection) => {
516
+ const getConnectionPoint = (geometry, connection, offset) => {
481
517
  const rectangle = getRectangleByPoints(geometry.points);
482
518
  const strokeWidth = getStrokeWidthByElement(geometry);
519
+ const directionFactor = getDirectionFactor(getDirectionByPoint(connection, Direction.bottom));
483
520
  return [
484
- rectangle.x - strokeWidth / 2 + (rectangle.width + strokeWidth) * connection[0],
485
- rectangle.y - strokeWidth / 2 + (rectangle.height + strokeWidth) * connection[1]
521
+ rectangle.x + rectangle.width * connection[0] + strokeWidth * directionFactor.x + offset * directionFactor.x,
522
+ rectangle.y + rectangle.height * connection[1] + strokeWidth * directionFactor.y + offset * directionFactor.y
486
523
  ];
487
524
  };
488
525
  const transformPointToConnection = (board, point, hitElement) => {
@@ -514,19 +551,6 @@ const getLineTextRectangle = (board, element, index) => {
514
551
  };
515
552
  };
516
553
 
517
- var DrawCreateMode;
518
- (function (DrawCreateMode) {
519
- DrawCreateMode["drag"] = "drag";
520
- DrawCreateMode["draw"] = "draw";
521
- })(DrawCreateMode || (DrawCreateMode = {}));
522
- const BOARD_TO_CREATE_MODE = new WeakMap();
523
- const getCreateMode = (board) => {
524
- return BOARD_TO_CREATE_MODE.get(board);
525
- };
526
- const setCreateMode = (board, mode) => {
527
- BOARD_TO_CREATE_MODE.set(board, mode);
528
- };
529
-
530
554
  const getSelectedDrawElements = (board) => {
531
555
  const selectedElements = getSelectedElements(board).filter(value => PlaitDrawElement.isDrawElement(value));
532
556
  return selectedElements;
@@ -686,7 +710,7 @@ class GeometryComponent extends PlaitPluginElementComponent {
686
710
  },
687
711
  hasResizeHandle: () => {
688
712
  const selectedElements = getSelectedElements(this.board);
689
- if (PlaitBoard.hasBeenTextEditing(this.board)) {
713
+ if (PlaitBoard.hasBeenTextEditing(this.board) && PlaitDrawElement.isText(this.element)) {
690
714
  return false;
691
715
  }
692
716
  return selectedElements.length === 1 && !isSelectionMoving(this.board);
@@ -982,7 +1006,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImpor
982
1006
  }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; } });
983
1007
 
984
1008
  const withDrawHotkey = (board) => {
985
- const { keydown } = board;
1009
+ const { keydown, dblclick } = board;
986
1010
  board.keydown = (event) => {
987
1011
  const selectedElements = getSelectedElements(board);
988
1012
  const isSingleSelection = selectedElements.length === 1;
@@ -994,20 +1018,27 @@ const withDrawHotkey = (board) => {
994
1018
  }
995
1019
  keydown(event);
996
1020
  };
1021
+ board.dblclick = (event) => {
1022
+ event.preventDefault();
1023
+ const geometries = getSelectedGeometryElements(board);
1024
+ if (geometries.length === 1) {
1025
+ const component = PlaitElement.getComponent(geometries[0]);
1026
+ component.editText();
1027
+ }
1028
+ dblclick(event);
1029
+ };
997
1030
  return board;
998
1031
  };
999
1032
 
1000
1033
  const withGeometryCreateByDrag = (board) => {
1001
1034
  const { pointerMove, pointerUp } = board;
1002
- let createMode = undefined;
1003
1035
  let geometryShapeG = null;
1004
1036
  board.pointerMove = (event) => {
1005
1037
  geometryShapeG?.remove();
1006
1038
  geometryShapeG = createG();
1007
- createMode = getCreateMode(board);
1008
1039
  const geometryGenerator = new GeometryShapeGenerator(board);
1009
1040
  const isGeometryPointer = PlaitBoard.isInPointer(board, GeometryPointer);
1010
- const dragMode = isGeometryPointer && createMode === DrawCreateMode.drag;
1041
+ const dragMode = isGeometryPointer && isDndMode(board);
1011
1042
  const movingPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
1012
1043
  const pointer = PlaitBoard.getPointer(board);
1013
1044
  if (dragMode) {
@@ -1031,7 +1062,7 @@ const withGeometryCreateByDrag = (board) => {
1031
1062
  board.pointerUp = (event) => {
1032
1063
  const pointer = PlaitBoard.getPointer(board);
1033
1064
  const isGeometryPointer = PlaitBoard.isInPointer(board, GeometryPointer);
1034
- const dragMode = isGeometryPointer && createMode === DrawCreateMode.drag;
1065
+ const dragMode = isGeometryPointer && isDndMode(board);
1035
1066
  if (dragMode) {
1036
1067
  const targetPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
1037
1068
  const points = getDefaultGeometryPoints(pointer, targetPoint);
@@ -1065,9 +1096,8 @@ const withGeometryCreateByDraw = (board) => {
1065
1096
  keyup(event);
1066
1097
  };
1067
1098
  board.pointerDown = (event) => {
1068
- const createMode = getCreateMode(board);
1069
1099
  const isGeometryPointer = PlaitBoard.isInPointer(board, GeometryPointer);
1070
- if (isGeometryPointer && createMode === DrawCreateMode.draw) {
1100
+ if (isGeometryPointer && isDrawingMode(board)) {
1071
1101
  const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
1072
1102
  start = point;
1073
1103
  preventTouchMove(board, true);
@@ -1254,9 +1284,8 @@ const withLineCreateByDraw = (board) => {
1254
1284
  let lineShapeG = null;
1255
1285
  let temporaryElement = null;
1256
1286
  board.pointerDown = (event) => {
1257
- const createMode = getCreateMode(board);
1258
1287
  const isLinePointer = PlaitBoard.isPointer(board, DrawPointerType.line);
1259
- if (isLinePointer && createMode === DrawCreateMode.draw) {
1288
+ if (isLinePointer && isDrawingMode(board)) {
1260
1289
  const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
1261
1290
  start = point;
1262
1291
  const hitElement = getHitOutlineGeometry(board, point, -4);
@@ -1583,14 +1612,6 @@ const withDraw = (board) => {
1583
1612
  }
1584
1613
  return isMovable(element);
1585
1614
  };
1586
- board.dblclick = (event) => {
1587
- const element = getSelectedElements(board)[0];
1588
- if (element && PlaitDrawElement.isGeometry(element)) {
1589
- const component = PlaitElement.getComponent(element);
1590
- component.editText();
1591
- }
1592
- dblclick(event);
1593
- };
1594
1615
  return withLineText(withLineBoundReaction(withLineResize(withGeometryResize(withLineCreateByDraw(withGeometryCreateByDrag(withGeometryCreateByDraw(withDrawFragment(withDrawHotkey(board)))))))));
1595
1616
  };
1596
1617
 
@@ -1598,5 +1619,5 @@ const withDraw = (board) => {
1598
1619
  * Generated bundle index. Do not edit.
1599
1620
  */
1600
1621
 
1601
- export { DefaultGeometryActiveStyle, DefaultGeometryProperty, DefaultGeometryStyle, DefaultTextProperty, DrawCreateMode, DrawPointerType, GeometryPointer, GeometryShape, GeometryThreshold, LineMarkerType, LineShape, PlaitDrawElement, PlaitGeometry, ShapeDefaultSpace, createGeometryElement, createLineElement, drawBoundMask, drawElbowLine, drawGeometry, drawLineArrow, getCenterPointsOnPolygon, getCreateMode, getElbowPoints, getHitConnectorPoint, getHitLineTextIndex, getLineTextRectangle, getNearestPoint, getPointsByCenterPoint, getSelectedDrawElements, getSelectedGeometryElements, getSelectedLineElements, getSourcePoint, getTargetPoint, getTextRectangle, isHitLineText, isHitPolyLine, normalizeConnection, setCreateMode, transformPointToConnection, withDraw };
1622
+ export { DefaultGeometryActiveStyle, DefaultGeometryProperty, DefaultGeometryStyle, DefaultTextProperty, DrawPointerType, GeometryComponent, GeometryPointer, GeometryShape, GeometryThreshold, LineComponent, LineMarkerType, LineShape, PlaitDrawElement, PlaitGeometry, PlaitLine, ShapeDefaultSpace, createGeometryElement, createLineElement, drawBoundMask, drawElbowLine, drawGeometry, drawLineArrow, getCenterPointsOnPolygon, getConnectionPoint, getElbowPoints, getHitConnectorPoint, getHitLineTextIndex, getLineTextRectangle, getNearestPoint, getPointsByCenterPoint, getSelectedDrawElements, getSelectedGeometryElements, getSelectedLineElements, getSourcePoint, getTargetPoint, getTextRectangle, isHitLineText, isHitPolyLine, transformPointToConnection, withDraw };
1602
1623
  //# sourceMappingURL=plait-draw.mjs.map