@plait/common 0.65.2 → 0.66.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,4 +1,4 @@
|
|
|
1
|
-
import { PlaitBoard, PlaitGroupElement, toViewBoxPoint, toHostPoint, getHitElementsBySelection, createGroupRectangleG, getHighestSelectedGroups, getSelectedIsolatedElements, getSelectedGroups, Selection, Transforms, idCreator, getGroupByElement, getSelectedIsolatedElementsCanAddToGroup, getElementsInGroup, getRectangleByGroup, PlaitPointerType } from '@plait/core';
|
|
1
|
+
import { PlaitBoard, PlaitGroupElement, toViewBoxPoint, toHostPoint, getHitElementsBySelection, createGroupRectangleG, getHighestSelectedGroups, getSelectedIsolatedElements, getSelectedGroups, Selection, Transforms, idCreator, getGroupByElement, getSelectedIsolatedElementsCanAddToGroup, getElementsInGroup, getRectangleByGroup, PlaitPointerType, throttleRAF, isMovingElements } from '@plait/core';
|
|
2
2
|
import { GroupComponent } from '../core/group.component';
|
|
3
3
|
import { isKeyHotkey } from 'is-hotkey';
|
|
4
4
|
import { isResizing } from '../utils';
|
|
@@ -13,20 +13,22 @@ export function withGroup(board) {
|
|
|
13
13
|
return drawElement(context);
|
|
14
14
|
};
|
|
15
15
|
board.pointerMove = (event) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
selection
|
|
21
|
-
|
|
22
|
-
const pointer = PlaitBoard.getPointer(board);
|
|
23
|
-
if (!isResizing(board) && pointer === PlaitPointerType.selection) {
|
|
24
|
-
const hitElements = getHitElementsBySelection(board, selection);
|
|
25
|
-
if (hitElements.length) {
|
|
26
|
-
groupRectangleG = createGroupRectangleG(board, hitElements);
|
|
27
|
-
groupRectangleG && PlaitBoard.getElementActiveHost(board).append(groupRectangleG);
|
|
16
|
+
throttleRAF(board, 'with-group', () => {
|
|
17
|
+
groupRectangleG?.remove();
|
|
18
|
+
const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
19
|
+
let selection = { anchor: point, focus: point };
|
|
20
|
+
if (board.selection && !Selection.isCollapsed(board.selection)) {
|
|
21
|
+
selection = board.selection;
|
|
28
22
|
}
|
|
29
|
-
|
|
23
|
+
const pointer = PlaitBoard.getPointer(board);
|
|
24
|
+
if (!isResizing(board) && !isMovingElements(board) && pointer === PlaitPointerType.selection) {
|
|
25
|
+
const hitElements = getHitElementsBySelection(board, selection);
|
|
26
|
+
if (hitElements.length) {
|
|
27
|
+
groupRectangleG = createGroupRectangleG(board, hitElements);
|
|
28
|
+
groupRectangleG && PlaitBoard.getElementActiveHost(board).append(groupRectangleG);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
30
32
|
pointerMove(event);
|
|
31
33
|
};
|
|
32
34
|
board.globalPointerUp = (event) => {
|
|
@@ -193,4 +195,4 @@ const updateSiblingElementGroupId = (board, removeGroups) => {
|
|
|
193
195
|
}
|
|
194
196
|
});
|
|
195
197
|
};
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ncm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvcGx1Z2lucy93aXRoLWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxVQUFVLEVBRVYsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxXQUFXLEVBQ1gseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUVyQix3QkFBd0IsRUFDeEIsMkJBQTJCLEVBRzNCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsVUFBVSxFQUNWLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsd0NBQXdDLEVBQ3hDLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBRW5CLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdEMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFpQjtJQUN2QyxJQUFJLGVBQW1DLENBQUM7SUFDeEMsSUFBSSxZQUFpQyxDQUFDO0lBRXRDLE1BQU0sRUFDRixXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLE9BQU8sRUFDVixHQUFHLEtBQUssQ0FBQztJQUVWLEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxPQUFrQyxFQUFFLEVBQUU7UUFDdkQsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxjQUFjLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztJQUVG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QUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNqRixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDekUsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dCxcbiAgICBQbGFpdEdyb3VwRWxlbWVudCxcbiAgICB0b1ZpZXdCb3hQb2ludCxcbiAgICB0b0hvc3RQb2ludCxcbiAgICBnZXRIaXRFbGVtZW50c0J5U2VsZWN0aW9uLFxuICAgIGNyZWF0ZUdyb3VwUmVjdGFuZ2xlRyxcbiAgICBDbGlwYm9hcmREYXRhLFxuICAgIGdldEhpZ2hlc3RTZWxlY3RlZEdyb3VwcyxcbiAgICBnZXRTZWxlY3RlZElzb2xhdGVkRWxlbWVudHMsXG4gICAgUGxhaXRFbGVtZW50LFxuICAgIFBsYWl0R3JvdXAsXG4gICAgZ2V0U2VsZWN0ZWRHcm91cHMsXG4gICAgU2VsZWN0aW9uLFxuICAgIFBvaW50LFxuICAgIFRyYW5zZm9ybXMsXG4gICAgaWRDcmVhdG9yLFxuICAgIGdldEdyb3VwQnlFbGVtZW50LFxuICAgIGdldFNlbGVjdGVkSXNvbGF0ZWRFbGVtZW50c0NhbkFkZFRvR3JvdXAsXG4gICAgZ2V0RWxlbWVudHNJbkdyb3VwLFxuICAgIGdldFJlY3RhbmdsZUJ5R3JvdXAsXG4gICAgUGxhaXRQb2ludGVyVHlwZSxcbiAgICBXcml0YWJsZUNsaXBib2FyZE9wZXJhdGlvblR5cGVcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9jb3JlL2dyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpc0tleUhvdGtleSB9IGZyb20gJ2lzLWhvdGtleSc7XG5pbXBvcnQgeyBpc1Jlc2l6aW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aEdyb3VwKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgbGV0IGdyb3VwUmVjdGFuZ2xlRzogU1ZHR0VsZW1lbnQgfCBudWxsO1xuICAgIGxldCByZW1vdmVHcm91cHM6IFBsYWl0R3JvdXBbXSB8IG51bGw7XG5cbiAgICBjb25zdCB7XG4gICAgICAgIGRyYXdFbGVtZW50LFxuICAgICAgICBwb2ludGVyTW92ZSxcbiAgICAgICAgZ2xvYmFsUG9pbnRlclVwLFxuICAgICAgICBpbnNlcnRGcmFnbWVudCxcbiAgICAgICAgZ2V0RGVsZXRlZEZyYWdtZW50LFxuICAgICAgICBkZWxldGVGcmFnbWVudCxcbiAgICAgICAgZ2V0UmVsYXRlZEZyYWdtZW50LFxuICAgICAgICBnZXRSZWN0YW5nbGUsXG4gICAgICAgIGtleURvd25cbiAgICB9ID0gYm9hcmQ7XG5cbiAgICBib2FyZC5kcmF3RWxlbWVudCA9IChjb250ZXh0OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGNvbnRleHQuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBHcm91cENvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhd0VsZW1lbnQoY29udGV4dCk7XG4gICAgfTtcblxuICAgIGJvYXJkLnBvaW50ZXJNb3ZlID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgZ3JvdXBSZWN0YW5nbGVHPy5yZW1vdmUoKTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB0b1ZpZXdCb3hQb2ludChib2FyZCwgdG9Ib3N0UG9pbnQoYm9hcmQsIGV2ZW50LngsIGV2ZW50LnkpKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0geyBhbmNob3I6IHBvaW50LCBmb2N1czogcG9pbnQgfTtcbiAgICAgICAgaWYgKGJvYXJkLnNlbGVjdGlvbiAmJiAhU2VsZWN0aW9uLmlzQ29sbGFwc2VkKGJvYXJkLnNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IGJvYXJkLnNlbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludGVyID0gUGxhaXRCb2FyZC5nZXRQb2ludGVyKGJvYXJkKTtcbiAgICAgICAgaWYgKCFpc1Jlc2l6aW5nKGJvYXJkKSAmJiBwb2ludGVyID09PSBQbGFpdFBvaW50ZXJUeXBlLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaGl0RWxlbWVudHMgPSBnZXRIaXRFbGVtZW50c0J5U2VsZWN0aW9uKGJvYXJkLCBzZWxlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKGhpdEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGdyb3VwUmVjdGFuZ2xlRyA9IGNyZWF0ZUdyb3VwUmVjdGFuZ2xlRyhib2FyZCwgaGl0RWxlbWVudHMpO1xuICAgICAgICAgICAgICAgIGdyb3VwUmVjdGFuZ2xlRyAmJiBQbGFpdEJvYXJkLmdldEVsZW1lbnRBY3RpdmVIb3N0KGJvYXJkKS5hcHBlbmQoZ3JvdXBSZWN0YW5nbGVHKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwb2ludGVyTW92ZShldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmdsb2JhbFBvaW50ZXJVcCA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIGdyb3VwUmVjdGFuZ2xlRz8ucmVtb3ZlKCk7XG4gICAgICAgIGdyb3VwUmVjdGFuZ2xlRyA9IG51bGw7XG4gICAgICAgIGdsb2JhbFBvaW50ZXJVcChldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmdldFJlbGF0ZWRGcmFnbWVudCA9IChlbGVtZW50czogUGxhaXRFbGVtZW50W10sIG9yaWdpbkRhdGE/OiBQbGFpdEVsZW1lbnRbXSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cHMgPSBnZXRTZWxlY3RlZEdyb3Vwcyhib2FyZCwgZWxlbWVudHMsIG9yaWdpbkRhdGEpO1xuICAgICAgICByZXR1cm4gZ2V0UmVsYXRlZEZyYWdtZW50KFsuLi5lbGVtZW50cywgLi4uZ3JvdXBzXSwgb3JpZ2luRGF0YSk7XG4gICAgfTtcblxuICAgIGJvYXJkLmluc2VydEZyYWdtZW50ID0gKGNsaXBib2FyZERhdGE6IENsaXBib2FyZERhdGEgfCBudWxsLCB0YXJnZXRQb2ludDogUG9pbnQsIG9wZXJhdGlvblR5cGU/OiBXcml0YWJsZUNsaXBib2FyZE9wZXJhdGlvblR5cGUpID0+IHtcbiAgICAgICAgbGV0IGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBpZiAoY2xpcGJvYXJkRGF0YT8uZWxlbWVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgQXJyYXkoY2xpcGJvYXJkRGF0YT8uZWxlbWVudHM/Lmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBncm91cHMgPSBnZXRIaWdoZXN0U2VsZWN0ZWRHcm91cHMoYm9hcmQsIGNsaXBib2FyZERhdGE/LmVsZW1lbnRzKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXNvbGF0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkSXNvbGF0ZWRFbGVtZW50cyhib2FyZCwgY2xpcGJvYXJkRGF0YT8uZWxlbWVudHMpO1xuICAgICAgICAgICAgc2VsZWN0ZWRJc29sYXRlZEVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjbGlwYm9hcmREYXRhLmVsZW1lbnRzIS5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmlkKS5pbmRleE9mKGl0ZW0uaWQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNwbGljZShpbmRleCwgMSwgIWl0ZW0uZ3JvdXBJZCA/IGl0ZW0gOiB1cGRhdGVHcm91cElkKGl0ZW0sIHVuZGVmaW5lZCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGNsaXBib2FyZERhdGEuZWxlbWVudHMhLm1hcChlbGVtZW50ID0+IGVsZW1lbnQuaWQpLmluZGV4T2YoaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0dyb3VwID0geyAuLi51cGRhdGVHcm91cElkKGl0ZW0sIHVuZGVmaW5lZCksIGlkOiBpZENyZWF0b3IoKSB9O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEsIG5ld0dyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRWxlbWVudHNHcm91cElkKGl0ZW0sIGNsaXBib2FyZERhdGEuZWxlbWVudHMhLCBuZXdHcm91cC5pZCwgZWxlbWVudHMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xpcGJvYXJkRGF0YS5lbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGluc2VydEZyYWdtZW50KGNsaXBib2FyZERhdGEsIHRhcmdldFBvaW50LCBvcGVyYXRpb25UeXBlKTtcbiAgICAgICAgY29uc3QgZ3JvdXBFbGVtZW50cyA9IGVsZW1lbnRzPy5maWx0ZXIodmFsdWUgPT4gUGxhaXRHcm91cEVsZW1lbnQuaXNHcm91cCh2YWx1ZSkpIGFzIFBsYWl0RWxlbWVudFtdO1xuICAgICAgICBncm91cEVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLmluc2VydE5vZGUoYm9hcmQsIGVsZW1lbnQsIFtib2FyZC5jaGlsZHJlbi5sZW5ndGhdKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGJvYXJkLmdldERlbGV0ZWRGcmFnbWVudCA9IChkYXRhOiBQbGFpdEVsZW1lbnRbXSkgPT4ge1xuICAgICAgICByZW1vdmVHcm91cHMgPSBnZXRSZW1vdmVHcm91cHMoYm9hcmQpO1xuICAgICAgICBpZiAocmVtb3ZlR3JvdXBzICYmIHJlbW92ZUdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaCguLi5yZW1vdmVHcm91cHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXREZWxldGVkRnJhZ21lbnQoZGF0YSk7XG4gICAgfTtcblxuICAgIGJvYXJkLmRlbGV0ZUZyYWdtZW50ID0gKGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSkgPT4ge1xuICAgICAgICBpZiAocmVtb3ZlR3JvdXBzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHVwZGF0ZVNpYmxpbmdFbGVtZW50R3JvdXBJZChib2FyZCwgcmVtb3ZlR3JvdXBzKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVGcmFnbWVudChlbGVtZW50cyk7XG4gICAgICAgIHJlbW92ZUdyb3VwcyA9IG51bGw7XG4gICAgfTtcblxuICAgIGJvYXJkLmdldFJlY3RhbmdsZSA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKFBsYWl0R3JvdXBFbGVtZW50LmlzR3JvdXAoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRSZWN0YW5nbGVCeUdyb3VwKGJvYXJkLCBlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0UmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5rZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghUGxhaXRCb2FyZC5pc1JlYWRvbmx5KGJvYXJkKSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5SG90a2V5KCdtb2QrZycsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5hZGRHcm91cChib2FyZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzS2V5SG90a2V5KCdtb2Qrc2hpZnQrZycsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5yZW1vdmVHcm91cChib2FyZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleURvd24oZXZlbnQpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYm9hcmQ7XG59XG5cbmNvbnN0IHVwZGF0ZUdyb3VwSWQgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50LCBncm91cElkPzogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZWxlbWVudCxcbiAgICAgICAgZ3JvdXBJZDogZ3JvdXBJZFxuICAgIH07XG59O1xuXG5jb25zdCB1cGRhdGVFbGVtZW50c0dyb3VwSWQgPSAoZ3JvdXA6IFBsYWl0R3JvdXAsIGNsaXBib2FyZERhdGFFbGVtZW50czogUGxhaXRFbGVtZW50W10sIG5ld0dyb3VwSWQ6IHN0cmluZywgZWxlbWVudHM6IFBsYWl0RWxlbWVudFtdKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHNJbkdyb3VwID0gY2xpcGJvYXJkRGF0YUVsZW1lbnRzLmZpbHRlcihpdGVtID0+IGl0ZW0uZ3JvdXBJZCA9PT0gZ3JvdXAuaWQpO1xuICAgIGlmIChlbGVtZW50c0luR3JvdXAubGVuZ3RoKSB7XG4gICAgICAgIGVsZW1lbnRzSW5Hcm91cC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjbGlwYm9hcmREYXRhRWxlbWVudHMubWFwKGl0ZW0gPT4gaXRlbS5pZCkuaW5kZXhPZihpdGVtLmlkKTtcbiAgICAgICAgICAgIGlmIChQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3R3JvdXAgPSB7IC4uLnVwZGF0ZUdyb3VwSWQoaXRlbSwgbmV3R3JvdXBJZCksIGlkOiBpZENyZWF0b3IoKSB9O1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNwbGljZShpbmRleCwgMSwgbmV3R3JvdXApO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRzR3JvdXBJZChpdGVtLCBjbGlwYm9hcmREYXRhRWxlbWVudHMsIG5ld0dyb3VwLmlkLCBlbGVtZW50cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNwbGljZShpbmRleCwgMSwgdXBkYXRlR3JvdXBJZChpdGVtLCBuZXdHcm91cElkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG59O1xuXG5jb25zdCBnZXRSZW1vdmVHcm91cHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IGJvYXJkLmdldFJlbGF0ZWRGcmFnbWVudChbXSkgYXMgUGxhaXRHcm91cFtdO1xuICAgIGNvbnN0IHJlbW92ZUdyb3VwcyA9IFsuLi5zZWxlY3RlZEdyb3Vwc107XG4gICAgY29uc3QgaGlnaGVzdFNlbGVjdGVkR3JvdXBzID0gZ2V0SGlnaGVzdFNlbGVjdGVkR3JvdXBzKGJvYXJkKTtcbiAgICBjb25zdCBzZWxlY3RlZElzb2xhdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZElzb2xhdGVkRWxlbWVudHNDYW5BZGRUb0dyb3VwKGJvYXJkKTtcbiAgICBjb25zdCByZW1vdmVOb2RlcyA9IFsuLi5oaWdoZXN0U2VsZWN0ZWRHcm91cHMsIC4uLnNlbGVjdGVkSXNvbGF0ZWRFbGVtZW50c107XG4gICAgcmVtb3ZlTm9kZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgaGl0RWxlbWVudEdyb3VwcyA9IGdldEdyb3VwQnlFbGVtZW50KGJvYXJkLCBpdGVtLCB0cnVlKSBhcyBQbGFpdEdyb3VwW107XG4gICAgICAgIGlmIChoaXRFbGVtZW50R3JvdXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNJbkdyb3VwID0gZ2V0RWxlbWVudHNJbkdyb3VwKGJvYXJkLCBoaXRFbGVtZW50R3JvdXBzWzBdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBzaWJsaW5nRWxlbWVudHMgPSBlbGVtZW50c0luR3JvdXAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gIVsuLi5yZW1vdmVOb2RlcywgLi4ucmVtb3ZlR3JvdXBzXS5tYXAoaXRlbSA9PiBpdGVtLmlkKS5pbmNsdWRlcyhlbGVtZW50LmlkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzaWJsaW5nRWxlbWVudHMubGVuZ3RoID09PSAxIHx8IHNpYmxpbmdFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZUdyb3Vwcy5pbmNsdWRlcyhoaXRFbGVtZW50R3JvdXBzWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVHcm91cHMucHVzaChoaXRFbGVtZW50R3JvdXBzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNpYmxpbmdFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpdEVsZW1lbnRHcm91cHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvdmVHcm91cCA9IGZpbmRBYm92ZUdyb3VwV2l0aEFub3RoZXJFbGVtZW50KGJvYXJkLCBoaXRFbGVtZW50R3JvdXBzLnNsaWNlKDEsIGhpdEVsZW1lbnRHcm91cHMubGVuZ3RoKSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlbW92ZU5vZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlbW92ZUdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBoaXRFbGVtZW50R3JvdXBzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBoaXRFbGVtZW50R3JvdXBzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGFib3ZlR3JvdXAuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgWy4uLmhpdEVsZW1lbnRHcm91cHMuc2xpY2UoMSwgaW5kZXgpXS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVtb3ZlR3JvdXBzLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUdyb3Vwcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlbW92ZUdyb3Vwcztcbn07XG5cbmNvbnN0IGZpbmRBYm92ZUdyb3VwV2l0aEFub3RoZXJFbGVtZW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBncm91cHM6IFBsYWl0R3JvdXBbXSwgZXhjbHVkZU5vZGVzOiBQbGFpdEVsZW1lbnRbXSkgPT4ge1xuICAgIGxldCBncm91cDogUGxhaXRHcm91cCB8IG51bGwgPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChib2FyZCwgZ3JvdXBzW2ldLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHNpYmxpbmdFbGVtZW50cyA9IGVsZW1lbnRzSW5Hcm91cC5maWx0ZXIoZWxlbWVudCA9PiAhZXhjbHVkZU5vZGVzLm1hcChpdGVtID0+IGl0ZW0uaWQpLmluY2x1ZGVzKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgaWYgKHNpYmxpbmdFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBncm91cCA9IGdyb3Vwc1tpXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBncm91cDtcbn07XG5cbmNvbnN0IHVwZGF0ZVNpYmxpbmdFbGVtZW50R3JvdXBJZCA9IChib2FyZDogUGxhaXRCb2FyZCwgcmVtb3ZlR3JvdXBzOiBQbGFpdEdyb3VwW10pID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZElzb2xhdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZElzb2xhdGVkRWxlbWVudHNDYW5BZGRUb0dyb3VwKGJvYXJkKTtcbiAgICBjb25zdCBoaWdoZXN0U2VsZWN0ZWRHcm91cHMgPSBnZXRIaWdoZXN0U2VsZWN0ZWRHcm91cHMoYm9hcmQpO1xuICAgIGNvbnN0IGlzb2xhdGVkRWxlbWVudHNJbkdyb3VwID0gc2VsZWN0ZWRJc29sYXRlZEVsZW1lbnRzLmZpbHRlcihpdGVtID0+IGl0ZW0uZ3JvdXBJZCk7XG4gICAgWy4uLmhpZ2hlc3RTZWxlY3RlZEdyb3VwcywgLi4uaXNvbGF0ZWRFbGVtZW50c0luR3JvdXBdLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnRHcm91cHMgPSBnZXRHcm91cEJ5RWxlbWVudChib2FyZCwgaXRlbSwgdHJ1ZSkgYXMgUGxhaXRHcm91cFtdO1xuICAgICAgICBpZiAoaGl0RWxlbWVudEdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChib2FyZCwgaGl0RWxlbWVudEdyb3Vwc1swXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgY29uc3Qgc2libGluZ0VsZW1lbnRzID0gZWxlbWVudHNJbkdyb3VwLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuaWQgIT09IGl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKHNpYmxpbmdFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVHcm91cElkcyA9IHJlbW92ZUdyb3Vwcy5tYXAoaXRlbSA9PiBpdGVtLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaGl0RWxlbWVudEdyb3Vwcy5zb21lKGdyb3VwID0+IHJlbW92ZUdyb3VwSWRzLmluY2x1ZGVzKGdyb3VwLmlkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBoaXRFbGVtZW50R3JvdXBzLmZpbmQoZ3JvdXAgPT4gIXJlbW92ZUdyb3VwSWRzLmluY2x1ZGVzKGdyb3VwLmlkKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBQbGFpdEJvYXJkLmZpbmRQYXRoKGJvYXJkLCBzaWJsaW5nRWxlbWVudHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIHsgZ3JvdXBJZDogZ3JvdXA/LmlkIHx8IHVuZGVmaW5lZCB9LCBwYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iXX0=
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ncm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvcGx1Z2lucy93aXRoLWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxVQUFVLEVBRVYsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxXQUFXLEVBQ1gseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUVyQix3QkFBd0IsRUFDeEIsMkJBQTJCLEVBRzNCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsVUFBVSxFQUNWLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsd0NBQXdDLEVBQ3hDLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBRWhCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDbkIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV0QyxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWlCO0lBQ3ZDLElBQUksZUFBbUMsQ0FBQztJQUN4QyxJQUFJLFlBQWlDLENBQUM7SUFFdEMsTUFBTSxFQUNGLFdBQVcsRUFDWCxXQUFXLEVBQ1gsZUFBZSxFQUNmLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osT0FBTyxFQUNWLEdBQUcsS0FBSyxDQUFDO0lBRVYsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLE9BQWtDLEVBQUUsRUFBRTtRQUN2RCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxPQUFPLGNBQWMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENB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QWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNwRSxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2pGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1RCxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN6RSxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgUGxhaXRCb2FyZCxcbiAgICBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0LFxuICAgIFBsYWl0R3JvdXBFbGVtZW50LFxuICAgIHRvVmlld0JveFBvaW50LFxuICAgIHRvSG9zdFBvaW50LFxuICAgIGdldEhpdEVsZW1lbnRzQnlTZWxlY3Rpb24sXG4gICAgY3JlYXRlR3JvdXBSZWN0YW5nbGVHLFxuICAgIENsaXBib2FyZERhdGEsXG4gICAgZ2V0SGlnaGVzdFNlbGVjdGVkR3JvdXBzLFxuICAgIGdldFNlbGVjdGVkSXNvbGF0ZWRFbGVtZW50cyxcbiAgICBQbGFpdEVsZW1lbnQsXG4gICAgUGxhaXRHcm91cCxcbiAgICBnZXRTZWxlY3RlZEdyb3VwcyxcbiAgICBTZWxlY3Rpb24sXG4gICAgUG9pbnQsXG4gICAgVHJhbnNmb3JtcyxcbiAgICBpZENyZWF0b3IsXG4gICAgZ2V0R3JvdXBCeUVsZW1lbnQsXG4gICAgZ2V0U2VsZWN0ZWRJc29sYXRlZEVsZW1lbnRzQ2FuQWRkVG9Hcm91cCxcbiAgICBnZXRFbGVtZW50c0luR3JvdXAsXG4gICAgZ2V0UmVjdGFuZ2xlQnlHcm91cCxcbiAgICBQbGFpdFBvaW50ZXJUeXBlLFxuICAgIFdyaXRhYmxlQ2xpcGJvYXJkT3BlcmF0aW9uVHlwZSxcbiAgICB0aHJvdHRsZVJBRixcbiAgICBpc01vdmluZ0VsZW1lbnRzXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNLZXlIb3RrZXkgfSBmcm9tICdpcy1ob3RrZXknO1xuaW1wb3J0IHsgaXNSZXNpemluZyB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhHcm91cChib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGxldCBncm91cFJlY3RhbmdsZUc6IFNWR0dFbGVtZW50IHwgbnVsbDtcbiAgICBsZXQgcmVtb3ZlR3JvdXBzOiBQbGFpdEdyb3VwW10gfCBudWxsO1xuXG4gICAgY29uc3Qge1xuICAgICAgICBkcmF3RWxlbWVudCxcbiAgICAgICAgcG9pbnRlck1vdmUsXG4gICAgICAgIGdsb2JhbFBvaW50ZXJVcCxcbiAgICAgICAgaW5zZXJ0RnJhZ21lbnQsXG4gICAgICAgIGdldERlbGV0ZWRGcmFnbWVudCxcbiAgICAgICAgZGVsZXRlRnJhZ21lbnQsXG4gICAgICAgIGdldFJlbGF0ZWRGcmFnbWVudCxcbiAgICAgICAgZ2V0UmVjdGFuZ2xlLFxuICAgICAgICBrZXlEb3duXG4gICAgfSA9IGJvYXJkO1xuXG4gICAgYm9hcmQuZHJhd0VsZW1lbnQgPSAoY29udGV4dDogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dCkgPT4ge1xuICAgICAgICBpZiAoUGxhaXRHcm91cEVsZW1lbnQuaXNHcm91cChjb250ZXh0LmVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JvdXBDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXdFbGVtZW50KGNvbnRleHQpO1xuICAgIH07XG5cbiAgICBib2FyZC5wb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIHRocm90dGxlUkFGKGJvYXJkLCAnd2l0aC1ncm91cCcsICgpID0+IHtcbiAgICAgICAgICAgIGdyb3VwUmVjdGFuZ2xlRz8ucmVtb3ZlKCk7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHRvVmlld0JveFBvaW50KGJvYXJkLCB0b0hvc3RQb2ludChib2FyZCwgZXZlbnQueCwgZXZlbnQueSkpO1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0geyBhbmNob3I6IHBvaW50LCBmb2N1czogcG9pbnQgfTtcbiAgICAgICAgICAgIGlmIChib2FyZC5zZWxlY3Rpb24gJiYgIVNlbGVjdGlvbi5pc0NvbGxhcHNlZChib2FyZC5zZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gYm9hcmQuc2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcG9pbnRlciA9IFBsYWl0Qm9hcmQuZ2V0UG9pbnRlcihib2FyZCk7XG4gICAgICAgICAgICBpZiAoIWlzUmVzaXppbmcoYm9hcmQpICYmICFpc01vdmluZ0VsZW1lbnRzKGJvYXJkKSAmJiBwb2ludGVyID09PSBQbGFpdFBvaW50ZXJUeXBlLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpdEVsZW1lbnRzID0gZ2V0SGl0RWxlbWVudHNCeVNlbGVjdGlvbihib2FyZCwgc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoaGl0RWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwUmVjdGFuZ2xlRyA9IGNyZWF0ZUdyb3VwUmVjdGFuZ2xlRyhib2FyZCwgaGl0RWxlbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICBncm91cFJlY3RhbmdsZUcgJiYgUGxhaXRCb2FyZC5nZXRFbGVtZW50QWN0aXZlSG9zdChib2FyZCkuYXBwZW5kKGdyb3VwUmVjdGFuZ2xlRyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcG9pbnRlck1vdmUoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5nbG9iYWxQb2ludGVyVXAgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgICBncm91cFJlY3RhbmdsZUc/LnJlbW92ZSgpO1xuICAgICAgICBncm91cFJlY3RhbmdsZUcgPSBudWxsO1xuICAgICAgICBnbG9iYWxQb2ludGVyVXAoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5nZXRSZWxhdGVkRnJhZ21lbnQgPSAoZWxlbWVudHM6IFBsYWl0RWxlbWVudFtdLCBvcmlnaW5EYXRhPzogUGxhaXRFbGVtZW50W10pID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gZ2V0U2VsZWN0ZWRHcm91cHMoYm9hcmQsIGVsZW1lbnRzLCBvcmlnaW5EYXRhKTtcbiAgICAgICAgcmV0dXJuIGdldFJlbGF0ZWRGcmFnbWVudChbLi4uZWxlbWVudHMsIC4uLmdyb3Vwc10sIG9yaWdpbkRhdGEpO1xuICAgIH07XG5cbiAgICBib2FyZC5pbnNlcnRGcmFnbWVudCA9IChjbGlwYm9hcmREYXRhOiBDbGlwYm9hcmREYXRhIHwgbnVsbCwgdGFyZ2V0UG9pbnQ6IFBvaW50LCBvcGVyYXRpb25UeXBlPzogV3JpdGFibGVDbGlwYm9hcmRPcGVyYXRpb25UeXBlKSA9PiB7XG4gICAgICAgIGxldCBlbGVtZW50czogUGxhaXRFbGVtZW50W10gPSBbXTtcbiAgICAgICAgaWYgKGNsaXBib2FyZERhdGE/LmVsZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gbmV3IEFycmF5KGNsaXBib2FyZERhdGE/LmVsZW1lbnRzPy5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBzID0gZ2V0SGlnaGVzdFNlbGVjdGVkR3JvdXBzKGJvYXJkLCBjbGlwYm9hcmREYXRhPy5lbGVtZW50cyk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZElzb2xhdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZElzb2xhdGVkRWxlbWVudHMoYm9hcmQsIGNsaXBib2FyZERhdGE/LmVsZW1lbnRzKTtcbiAgICAgICAgICAgIHNlbGVjdGVkSXNvbGF0ZWRFbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2xpcGJvYXJkRGF0YS5lbGVtZW50cyEubWFwKGVsZW1lbnQgPT4gZWxlbWVudC5pZCkuaW5kZXhPZihpdGVtLmlkKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEsICFpdGVtLmdyb3VwSWQgPyBpdGVtIDogdXBkYXRlR3JvdXBJZChpdGVtLCB1bmRlZmluZWQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBncm91cHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjbGlwYm9hcmREYXRhLmVsZW1lbnRzIS5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmlkKS5pbmRleE9mKGl0ZW0uaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdHcm91cCA9IHsgLi4udXBkYXRlR3JvdXBJZChpdGVtLCB1bmRlZmluZWQpLCBpZDogaWRDcmVhdG9yKCkgfTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuc3BsaWNlKGluZGV4LCAxLCBuZXdHcm91cCk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRzR3JvdXBJZChpdGVtLCBjbGlwYm9hcmREYXRhLmVsZW1lbnRzISwgbmV3R3JvdXAuaWQsIGVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsaXBib2FyZERhdGEuZWxlbWVudHMgPSBlbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRGcmFnbWVudChjbGlwYm9hcmREYXRhLCB0YXJnZXRQb2ludCwgb3BlcmF0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IGdyb3VwRWxlbWVudHMgPSBlbGVtZW50cz8uZmlsdGVyKHZhbHVlID0+IFBsYWl0R3JvdXBFbGVtZW50LmlzR3JvdXAodmFsdWUpKSBhcyBQbGFpdEVsZW1lbnRbXTtcbiAgICAgICAgZ3JvdXBFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlKGJvYXJkLCBlbGVtZW50LCBbYm9hcmQuY2hpbGRyZW4ubGVuZ3RoXSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBib2FyZC5nZXREZWxldGVkRnJhZ21lbnQgPSAoZGF0YTogUGxhaXRFbGVtZW50W10pID0+IHtcbiAgICAgICAgcmVtb3ZlR3JvdXBzID0gZ2V0UmVtb3ZlR3JvdXBzKGJvYXJkKTtcbiAgICAgICAgaWYgKHJlbW92ZUdyb3VwcyAmJiByZW1vdmVHcm91cHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhLnB1c2goLi4ucmVtb3ZlR3JvdXBzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0RGVsZXRlZEZyYWdtZW50KGRhdGEpO1xuICAgIH07XG5cbiAgICBib2FyZC5kZWxldGVGcmFnbWVudCA9IChlbGVtZW50czogUGxhaXRFbGVtZW50W10pID0+IHtcbiAgICAgICAgaWYgKHJlbW92ZUdyb3Vwcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB1cGRhdGVTaWJsaW5nRWxlbWVudEdyb3VwSWQoYm9hcmQsIHJlbW92ZUdyb3Vwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlRnJhZ21lbnQoZWxlbWVudHMpO1xuICAgICAgICByZW1vdmVHcm91cHMgPSBudWxsO1xuICAgIH07XG5cbiAgICBib2FyZC5nZXRSZWN0YW5nbGUgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0UmVjdGFuZ2xlQnlHcm91cChib2FyZCwgZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFJlY3RhbmdsZShlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQua2V5RG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIVBsYWl0Qm9hcmQuaXNSZWFkb25seShib2FyZCkpIHtcbiAgICAgICAgICAgIGlmIChpc0tleUhvdGtleSgnbW9kK2cnLCBldmVudCkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuYWRkR3JvdXAoYm9hcmQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0tleUhvdGtleSgnbW9kK3NoaWZ0K2cnLCBldmVudCkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMucmVtb3ZlR3JvdXAoYm9hcmQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJvYXJkO1xufVxuXG5jb25zdCB1cGRhdGVHcm91cElkID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCwgZ3JvdXBJZD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmVsZW1lbnQsXG4gICAgICAgIGdyb3VwSWQ6IGdyb3VwSWRcbiAgICB9O1xufTtcblxuY29uc3QgdXBkYXRlRWxlbWVudHNHcm91cElkID0gKGdyb3VwOiBQbGFpdEdyb3VwLCBjbGlwYm9hcmREYXRhRWxlbWVudHM6IFBsYWl0RWxlbWVudFtdLCBuZXdHcm91cElkOiBzdHJpbmcsIGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGNsaXBib2FyZERhdGFFbGVtZW50cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmdyb3VwSWQgPT09IGdyb3VwLmlkKTtcbiAgICBpZiAoZWxlbWVudHNJbkdyb3VwLmxlbmd0aCkge1xuICAgICAgICBlbGVtZW50c0luR3JvdXAuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2xpcGJvYXJkRGF0YUVsZW1lbnRzLm1hcChpdGVtID0+IGl0ZW0uaWQpLmluZGV4T2YoaXRlbS5pZCk7XG4gICAgICAgICAgICBpZiAoUGxhaXRHcm91cEVsZW1lbnQuaXNHcm91cChpdGVtKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0dyb3VwID0geyAuLi51cGRhdGVHcm91cElkKGl0ZW0sIG5ld0dyb3VwSWQpLCBpZDogaWRDcmVhdG9yKCkgfTtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEsIG5ld0dyb3VwKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVFbGVtZW50c0dyb3VwSWQoaXRlbSwgY2xpcGJvYXJkRGF0YUVsZW1lbnRzLCBuZXdHcm91cC5pZCwgZWxlbWVudHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEsIHVwZGF0ZUdyb3VwSWQoaXRlbSwgbmV3R3JvdXBJZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xufTtcblxuY29uc3QgZ2V0UmVtb3ZlR3JvdXBzID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cHMgPSBib2FyZC5nZXRSZWxhdGVkRnJhZ21lbnQoW10pIGFzIFBsYWl0R3JvdXBbXTtcbiAgICBjb25zdCByZW1vdmVHcm91cHMgPSBbLi4uc2VsZWN0ZWRHcm91cHNdO1xuICAgIGNvbnN0IGhpZ2hlc3RTZWxlY3RlZEdyb3VwcyA9IGdldEhpZ2hlc3RTZWxlY3RlZEdyb3Vwcyhib2FyZCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJc29sYXRlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRJc29sYXRlZEVsZW1lbnRzQ2FuQWRkVG9Hcm91cChib2FyZCk7XG4gICAgY29uc3QgcmVtb3ZlTm9kZXMgPSBbLi4uaGlnaGVzdFNlbGVjdGVkR3JvdXBzLCAuLi5zZWxlY3RlZElzb2xhdGVkRWxlbWVudHNdO1xuICAgIHJlbW92ZU5vZGVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnRHcm91cHMgPSBnZXRHcm91cEJ5RWxlbWVudChib2FyZCwgaXRlbSwgdHJ1ZSkgYXMgUGxhaXRHcm91cFtdO1xuICAgICAgICBpZiAoaGl0RWxlbWVudEdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChib2FyZCwgaGl0RWxlbWVudEdyb3Vwc1swXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgY29uc3Qgc2libGluZ0VsZW1lbnRzID0gZWxlbWVudHNJbkdyb3VwLmZpbHRlcihcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0+ICFbLi4ucmVtb3ZlTm9kZXMsIC4uLnJlbW92ZUdyb3Vwc10ubWFwKGl0ZW0gPT4gaXRlbS5pZCkuaW5jbHVkZXMoZWxlbWVudC5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc2libGluZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMSB8fCBzaWJsaW5nRWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZW1vdmVHcm91cHMuaW5jbHVkZXMoaGl0RWxlbWVudEdyb3Vwc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlR3JvdXBzLnB1c2goaGl0RWxlbWVudEdyb3Vwc1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoaXRFbGVtZW50R3JvdXBzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFib3ZlR3JvdXAgPSBmaW5kQWJvdmVHcm91cFdpdGhBbm90aGVyRWxlbWVudChib2FyZCwgaGl0RWxlbWVudEdyb3Vwcy5zbGljZSgxLCBoaXRFbGVtZW50R3JvdXBzLmxlbmd0aCksIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZW1vdmVOb2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZW1vdmVHcm91cHNcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gaGl0RWxlbWVudEdyb3Vwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvdmVHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaGl0RWxlbWVudEdyb3Vwcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmlkID09PSBhYm92ZUdyb3VwLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFsuLi5oaXRFbGVtZW50R3JvdXBzLnNsaWNlKDEsIGluZGV4KV0uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZUdyb3Vwcy5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVHcm91cHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZW1vdmVHcm91cHM7XG59O1xuXG5jb25zdCBmaW5kQWJvdmVHcm91cFdpdGhBbm90aGVyRWxlbWVudCA9IChib2FyZDogUGxhaXRCb2FyZCwgZ3JvdXBzOiBQbGFpdEdyb3VwW10sIGV4Y2x1ZGVOb2RlczogUGxhaXRFbGVtZW50W10pID0+IHtcbiAgICBsZXQgZ3JvdXA6IFBsYWl0R3JvdXAgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbGVtZW50c0luR3JvdXAgPSBnZXRFbGVtZW50c0luR3JvdXAoYm9hcmQsIGdyb3Vwc1tpXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICBjb25zdCBzaWJsaW5nRWxlbWVudHMgPSBlbGVtZW50c0luR3JvdXAuZmlsdGVyKGVsZW1lbnQgPT4gIWV4Y2x1ZGVOb2Rlcy5tYXAoaXRlbSA9PiBpdGVtLmlkKS5pbmNsdWRlcyhlbGVtZW50LmlkKSk7XG4gICAgICAgIGlmIChzaWJsaW5nRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ3JvdXAgPSBncm91cHNbaV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ3JvdXA7XG59O1xuXG5jb25zdCB1cGRhdGVTaWJsaW5nRWxlbWVudEdyb3VwSWQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlbW92ZUdyb3VwczogUGxhaXRHcm91cFtdKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJc29sYXRlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRJc29sYXRlZEVsZW1lbnRzQ2FuQWRkVG9Hcm91cChib2FyZCk7XG4gICAgY29uc3QgaGlnaGVzdFNlbGVjdGVkR3JvdXBzID0gZ2V0SGlnaGVzdFNlbGVjdGVkR3JvdXBzKGJvYXJkKTtcbiAgICBjb25zdCBpc29sYXRlZEVsZW1lbnRzSW5Hcm91cCA9IHNlbGVjdGVkSXNvbGF0ZWRFbGVtZW50cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmdyb3VwSWQpO1xuICAgIFsuLi5oaWdoZXN0U2VsZWN0ZWRHcm91cHMsIC4uLmlzb2xhdGVkRWxlbWVudHNJbkdyb3VwXS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBoaXRFbGVtZW50R3JvdXBzID0gZ2V0R3JvdXBCeUVsZW1lbnQoYm9hcmQsIGl0ZW0sIHRydWUpIGFzIFBsYWl0R3JvdXBbXTtcbiAgICAgICAgaWYgKGhpdEVsZW1lbnRHcm91cHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c0luR3JvdXAgPSBnZXRFbGVtZW50c0luR3JvdXAoYm9hcmQsIGhpdEVsZW1lbnRHcm91cHNbMF0sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdFbGVtZW50cyA9IGVsZW1lbnRzSW5Hcm91cC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50LmlkICE9PSBpdGVtLmlkKTtcbiAgICAgICAgICAgIGlmIChzaWJsaW5nRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlR3JvdXBJZHMgPSByZW1vdmVHcm91cHMubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKGhpdEVsZW1lbnRHcm91cHMuc29tZShncm91cCA9PiByZW1vdmVHcm91cElkcy5pbmNsdWRlcyhncm91cC5pZCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gaGl0RWxlbWVudEdyb3Vwcy5maW5kKGdyb3VwID0+ICFyZW1vdmVHcm91cElkcy5pbmNsdWRlcyhncm91cC5pZCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgc2libGluZ0VsZW1lbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCB7IGdyb3VwSWQ6IGdyb3VwPy5pZCB8fCB1bmRlZmluZWQgfSwgcGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PlaitGroupElement, getSelectionAngle, getElementsInGroup, setAngleForG, RectangleClient, drawCircle, PlaitBoard, RESIZE_HANDLE_CLASS_NAME, createG, setStrokeLinecap, drawRectangle, SELECTION_RECTANGLE_CLASS_NAME, ResizeCursorClass, RESIZE_CURSORS, setDragging, rotatePoints, isSelectionMoving, getSelectedElements, distanceBetweenPointAndPoint, Point, Direction, hotkeys, createDebugGenerator, createForeignObject, ACTIVE_STROKE_WIDTH, updateForeignObject, Transforms, getHighestSelectedElements, getRectangleByElements, MERGING, PlaitPointerType, isMainPointer, toViewBoxPoint, toHostPoint, preventTouchMove, PRESS_AND_MOVE_BUFFER, isDragging, throttleRAF, handleTouchTarget, getRectangleByGroup, ElementFlavour, isSelectedElementOrGroup, Selection, getHitElementsBySelection, createGroupRectangleG, getSelectedGroups, getHighestSelectedGroups, getSelectedIsolatedElements, idCreator, getSelectedIsolatedElementsCanAddToGroup, getGroupByElement, updateForeignObjectWidth, IS_TEXT_EDITABLE } from '@plait/core';
|
|
1
|
+
import { PlaitGroupElement, getSelectionAngle, getElementsInGroup, setAngleForG, RectangleClient, drawCircle, PlaitBoard, RESIZE_HANDLE_CLASS_NAME, createG, setStrokeLinecap, drawRectangle, SELECTION_RECTANGLE_CLASS_NAME, ResizeCursorClass, RESIZE_CURSORS, setDragging, rotatePoints, isSelectionMoving, getSelectedElements, distanceBetweenPointAndPoint, Point, Direction, hotkeys, createDebugGenerator, createForeignObject, ACTIVE_STROKE_WIDTH, updateForeignObject, Transforms, getHighestSelectedElements, getRectangleByElements, MERGING, PlaitPointerType, isMainPointer, toViewBoxPoint, toHostPoint, preventTouchMove, PRESS_AND_MOVE_BUFFER, isDragging, throttleRAF, handleTouchTarget, getRectangleByGroup, ElementFlavour, isSelectedElementOrGroup, Selection, isMovingElements, getHitElementsBySelection, createGroupRectangleG, getSelectedGroups, getHighestSelectedGroups, getSelectedIsolatedElements, idCreator, getSelectedIsolatedElementsCanAddToGroup, getGroupByElement, updateForeignObjectWidth, IS_TEXT_EDITABLE } from '@plait/core';
|
|
2
2
|
import { isKeyHotkey } from 'is-hotkey';
|
|
3
3
|
import { Node, Operation, Transforms as Transforms$1, Range, Editor } from 'slate';
|
|
4
4
|
import { fromEvent, timer } from 'rxjs';
|
|
@@ -1763,20 +1763,22 @@ function withGroup(board) {
|
|
|
1763
1763
|
return drawElement(context);
|
|
1764
1764
|
};
|
|
1765
1765
|
board.pointerMove = (event) => {
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
selection
|
|
1771
|
-
|
|
1772
|
-
const pointer = PlaitBoard.getPointer(board);
|
|
1773
|
-
if (!isResizing(board) && pointer === PlaitPointerType.selection) {
|
|
1774
|
-
const hitElements = getHitElementsBySelection(board, selection);
|
|
1775
|
-
if (hitElements.length) {
|
|
1776
|
-
groupRectangleG = createGroupRectangleG(board, hitElements);
|
|
1777
|
-
groupRectangleG && PlaitBoard.getElementActiveHost(board).append(groupRectangleG);
|
|
1766
|
+
throttleRAF(board, 'with-group', () => {
|
|
1767
|
+
groupRectangleG?.remove();
|
|
1768
|
+
const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
1769
|
+
let selection = { anchor: point, focus: point };
|
|
1770
|
+
if (board.selection && !Selection.isCollapsed(board.selection)) {
|
|
1771
|
+
selection = board.selection;
|
|
1778
1772
|
}
|
|
1779
|
-
|
|
1773
|
+
const pointer = PlaitBoard.getPointer(board);
|
|
1774
|
+
if (!isResizing(board) && !isMovingElements(board) && pointer === PlaitPointerType.selection) {
|
|
1775
|
+
const hitElements = getHitElementsBySelection(board, selection);
|
|
1776
|
+
if (hitElements.length) {
|
|
1777
|
+
groupRectangleG = createGroupRectangleG(board, hitElements);
|
|
1778
|
+
groupRectangleG && PlaitBoard.getElementActiveHost(board).append(groupRectangleG);
|
|
1779
|
+
}
|
|
1780
|
+
}
|
|
1781
|
+
});
|
|
1780
1782
|
pointerMove(event);
|
|
1781
1783
|
};
|
|
1782
1784
|
board.globalPointerUp = (event) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plait-common.mjs","sources":["../../../packages/common/src/constants/default.ts","../../../packages/common/src/constants/media.ts","../../../packages/common/src/constants/resize.ts","../../../packages/common/src/generators/generator.ts","../../../packages/common/src/utils/drawing/resize-handle.ts","../../../packages/common/src/utils/drawing/rotate-handle.ts","../../../packages/common/src/generators/active.generator.ts","../../../packages/common/src/utils/resize.ts","../../../packages/common/src/utils/vector.ts","../../../packages/common/src/utils/math.ts","../../../packages/common/src/utils/line-path.ts","../../../packages/common/src/utils/direction.ts","../../../packages/common/src/utils/default-orthogonal-routing.ts","../../../packages/common/src/utils/hot-key.ts","../../../packages/common/src/utils/creation-mode.ts","../../../packages/common/src/utils/text.ts","../../../packages/common/src/utils/image.ts","../../../packages/common/src/algorithms/data-structures/priority-queue.ts","../../../packages/common/src/algorithms/a-star.ts","../../../packages/common/src/algorithms/data-structures/graph.ts","../../../packages/common/src/utils/elbow-line-route.ts","../../../packages/common/src/utils/memorize.ts","../../../packages/common/src/utils/rotate.ts","../../../packages/common/src/utils/elements.ts","../../../packages/common/src/utils/animate.ts","../../../packages/common/src/image/image.generator.ts","../../../packages/common/src/transforms/property.ts","../../../packages/common/src/transforms/align.ts","../../../packages/common/src/shapes/common.ts","../../../packages/common/src/plugins/with-resize.ts","../../../packages/common/src/generators/group.generator.ts","../../../packages/common/src/core/element-ref.ts","../../../packages/common/src/core/element-flavour.ts","../../../packages/common/src/core/group.component.ts","../../../packages/common/src/plugins/with-group.ts","../../../packages/common/src/image/image-base.component.ts","../../../packages/common/src/text/text-measure.ts","../../../packages/common/src/text/text-manage.ts","../../../packages/common/src/text/with-text.ts","../../../packages/common/src/text/types.ts","../../../packages/common/src/image/with-image.ts","../../../packages/common/src/public-api.ts","../../../packages/common/src/plait-common.ts"],"sourcesContent":["export const BASE = 4;\nexport const PRIMARY_COLOR = '#6698FF';\nexport const RESIZE_HANDLE_DIAMETER = 9;\nexport const WithTextPluginKey = 'plait-text-plugin-key';\nexport const DEFAULT_ROUTE_MARGIN = 30;\nexport const TRANSPARENT = 'transparent';\nexport const ROTATE_HANDLE_DISTANCE_TO_ELEMENT = 20;\nexport const ROTATE_HANDLE_SIZE = 18;\nexport const DEFAULT_FONT_FAMILY = 'PingFangSC-Regular, \"PingFang SC\"';\nexport const DEFAULT_FILL = 'none';\n","export enum MediaKeys {\n image = 'image'\n}\n\nexport const PICTURE_ACCEPTED_UPLOAD_SIZE = 20;\n\nexport const acceptImageTypes = ['png', 'jpeg', 'gif', 'bmp'];\n\nexport const WithCommonPluginKey = 'plait-common-plugin-key';\n","export enum ResizeHandle {\n nw = '0',\n n = '4',\n ne = '1',\n e = '5',\n se = '2',\n s = '6',\n sw = '3',\n w = '7'\n}\n","import {\n PlaitBoard,\n PlaitElement,\n PlaitGroupElement,\n RectangleClient,\n getElementsInGroup,\n getSelectionAngle,\n setAngleForG\n} from '@plait/core';\n\nexport interface GeneratorExtraData {}\n\nexport interface GeneratorOptions {\n prepend?: boolean;\n}\n\nexport abstract class Generator<\n T extends PlaitElement = PlaitElement,\n K extends GeneratorExtraData = GeneratorExtraData,\n V extends GeneratorOptions = GeneratorOptions,\n P extends PlaitBoard = PlaitBoard\n> {\n g?: SVGGElement;\n\n protected options?: V;\n\n constructor(protected board: P, options?: V) {\n this.options = options;\n }\n\n processDrawing(element: T, parentG: SVGGElement, data?: K) {\n if (this.canDraw && this.canDraw(element, data)) {\n const g = this.draw(element, data);\n if (g) {\n if (this.g && parentG.contains(this.g)) {\n this.g.replaceWith(g);\n } else {\n if (this.g) {\n this.g.remove();\n }\n if (this.options?.prepend) {\n parentG.prepend(g);\n } else {\n parentG.appendChild(g);\n }\n }\n this.g = g;\n const rect = this.board.getRectangle(element);\n if (rect) {\n let angle;\n if (PlaitGroupElement.isGroup(element)) {\n angle = getSelectionAngle(getElementsInGroup(this.board, element, true));\n } else {\n angle = element.angle;\n }\n if (angle) {\n setAngleForG(g, RectangleClient.getCenterPoint(rect), angle);\n }\n }\n } else {\n this.destroy();\n }\n if (hasAfterDraw(this)) {\n this.afterDraw(element);\n }\n } else {\n this.destroy();\n }\n }\n\n /**\n * abstract function\n */\n protected abstract canDraw(element: T, data?: K): boolean;\n\n /**\n * abstract function\n */\n protected abstract draw(element: T, data?: K): SVGGElement | undefined;\n\n destroy() {\n if (this.g) {\n this.g.remove();\n this.g = undefined;\n }\n }\n}\n\nexport interface AfterDraw<T extends PlaitElement = PlaitElement> {\n afterDraw(element: T): void;\n}\n\nexport function hasAfterDraw(value: any): value is AfterDraw {\n if (value.afterDraw) {\n return true;\n }\n return false;\n}\n","import { RESIZE_HANDLE_CLASS_NAME, PlaitBoard, Point, drawCircle } from '@plait/core';\nimport { Options } from 'roughjs/bin/core';\nimport { PRIMARY_COLOR, RESIZE_HANDLE_DIAMETER } from '../../constants/default';\n\nexport const drawHandle = (board: PlaitBoard, centerPoint: Point) => {\n const options: Options = { stroke: '#99999995', strokeWidth: 2, fill: '#FFF', fillStyle: 'solid' };\n const handleG = drawCircle(PlaitBoard.getRoughSVG(board), centerPoint, RESIZE_HANDLE_DIAMETER, options);\n handleG.classList.add(RESIZE_HANDLE_CLASS_NAME);\n return handleG;\n};\n\nexport function drawFillPrimaryHandle(board: PlaitBoard, point: Point) {\n return drawCircle(PlaitBoard.getRoughSVG(board), point, RESIZE_HANDLE_DIAMETER, {\n stroke: '#FFFFFF',\n strokeWidth: 1,\n fill: `${PRIMARY_COLOR}`,\n fillStyle: 'solid'\n });\n}\n\nexport function drawPrimaryHandle(board: PlaitBoard, point: Point) {\n return drawCircle(PlaitBoard.getRoughSVG(board), point, RESIZE_HANDLE_DIAMETER, {\n stroke: `${PRIMARY_COLOR}`,\n strokeWidth: 2,\n fill: `#FFFFFF`,\n fillStyle: 'solid'\n });\n}\n","import { PlaitBoard, RectangleClient, createG, setStrokeLinecap } from '@plait/core';\nimport { Options } from 'roughjs/bin/core';\nimport { ROTATE_HANDLE_DISTANCE_TO_ELEMENT, ROTATE_HANDLE_SIZE } from '../../constants';\n\nconst rotateHandleRadius = 6;\n\nexport const drawRotateHandle = (board: PlaitBoard, rectangle: RectangleClient) => {\n const options: Options = { stroke: '#333', strokeWidth: 1, fillStyle: 'solid' };\n const handleCenterPoint = [\n rectangle.x - ROTATE_HANDLE_DISTANCE_TO_ELEMENT - ROTATE_HANDLE_SIZE / 2,\n rectangle.y + rectangle.height + ROTATE_HANDLE_DISTANCE_TO_ELEMENT + ROTATE_HANDLE_SIZE / 2\n ];\n const rs = PlaitBoard.getRoughSVG(board);\n const handleG = createG();\n const line = rs.path(\n `M ${handleCenterPoint[0] + rotateHandleRadius} ${handleCenterPoint[1]} A ${rotateHandleRadius} ${rotateHandleRadius}, 0, 1, 0, ${\n handleCenterPoint[0]\n } ${handleCenterPoint[1] + rotateHandleRadius}`,\n options\n );\n const arrow = rs.polygon(\n [\n [handleCenterPoint[0], handleCenterPoint[1] + rotateHandleRadius - 2],\n [handleCenterPoint[0], handleCenterPoint[1] + rotateHandleRadius + 2],\n [handleCenterPoint[0] + 4.5, handleCenterPoint[1] + rotateHandleRadius]\n ],\n { ...options, fill: '#333' }\n );\n setStrokeLinecap(arrow, 'round');\n handleG.append(line, arrow);\n return handleG;\n};\n","import { PlaitBoard, PlaitElement, RectangleClient, SELECTION_RECTANGLE_CLASS_NAME, createG, drawRectangle } from '@plait/core';\nimport { Generator, GeneratorOptions } from './generator';\nimport { PRIMARY_COLOR } from '../constants/default';\nimport { drawHandle } from '../utils/drawing';\n\nexport interface ActiveGeneratorExtraData {\n selected: boolean;\n}\n\nexport interface ActiveGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getStrokeWidth: () => number;\n getStrokeOpacity: () => number;\n hasResizeHandle: () => boolean;\n}\n\nexport class ActiveGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n ActiveGeneratorExtraData,\n ActiveGeneratorOptions<T> & GeneratorOptions\n> {\n static key = 'active-generator';\n\n hasResizeHandle = false;\n\n constructor(public board: PlaitBoard, public options: ActiveGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T, data: ActiveGeneratorExtraData): boolean {\n if (data.selected) {\n return true;\n } else {\n return false;\n }\n }\n\n draw(element: T, data: ActiveGeneratorExtraData): SVGGElement {\n const activeG = createG();\n const rectangle = this.options.getRectangle(element);\n\n const delta = this.options.getStrokeWidth();\n const activeRectangle = RectangleClient.inflate(rectangle, delta);\n\n const strokeG = drawRectangle(this.board, activeRectangle, {\n stroke: PRIMARY_COLOR,\n strokeWidth: delta\n });\n\n activeG.append(strokeG);\n strokeG.classList.add(SELECTION_RECTANGLE_CLASS_NAME);\n strokeG.style.opacity = `${this.options.getStrokeOpacity()}`;\n if (this.options.hasResizeHandle()) {\n this.hasResizeHandle = true;\n // draw resize handle\n RectangleClient.getCornerPoints(activeRectangle).forEach(corner => {\n const cornerHandleG = drawHandle(this.board, corner);\n activeG.append(cornerHandleG);\n });\n } else {\n this.hasResizeHandle = false;\n }\n return activeG;\n }\n}\n","import {\n PlaitBoard,\n Point,\n RectangleClient,\n ResizeCursorClass,\n setDragging,\n RESIZE_CURSORS,\n rotatePoints,\n PlaitElement,\n getSelectedElements,\n isSelectionMoving\n} from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\nimport { PlaitElementOrArray, ResizeRef } from '../types/resize';\n\nexport const getResizeHandleByIndex = (index: number) => {\n return `${index}` as ResizeHandle;\n};\n\nexport const getIndexByResizeHandle = (resizeHandle: ResizeHandle) => {\n return Number(resizeHandle);\n};\n\nexport const getSymmetricHandleIndex = (board: PlaitBoard, index: number) => {\n const originIndex = isEdgeHandle(board, getResizeHandleByIndex(index)) ? index - 4 : index;\n let originSymmetricHandleIndex = originIndex + 2;\n if (originSymmetricHandleIndex >= 4) {\n originSymmetricHandleIndex = originSymmetricHandleIndex - 4;\n }\n return isEdgeHandle(board, getResizeHandleByIndex(index)) ? originSymmetricHandleIndex + 4 : originSymmetricHandleIndex;\n};\n\nconst getResizeCursorClassByIndex = (index: number) => {\n switch (index) {\n case 0:\n case 2:\n return ResizeCursorClass.nwse;\n case 1:\n case 3:\n return ResizeCursorClass.nesw;\n case 4:\n case 6:\n return ResizeCursorClass.ns;\n case 5:\n case 7:\n return ResizeCursorClass.ew;\n default:\n return null;\n }\n};\n\nexport const getRotatedResizeCursorClassByAngle = (cursor: ResizeCursorClass, angle: number) => {\n const index = RESIZE_CURSORS.indexOf(cursor);\n if (index >= 0) {\n const temp = Math.round(angle / (Math.PI / 4));\n cursor = RESIZE_CURSORS[(index + temp) % RESIZE_CURSORS.length] as ResizeCursorClass;\n }\n return cursor;\n};\n\nexport const getRectangleResizeHandleRefs = (rectangle: RectangleClient, diameter: number) => {\n const corners = RectangleClient.getCornerPoints(rectangle);\n const refs = corners.map((corner, index: number) => {\n return {\n rectangle: {\n x: corner[0] - diameter / 2,\n y: corner[1] - diameter / 2,\n width: diameter,\n height: diameter\n },\n handle: getResizeHandleByIndex(index) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index) as ResizeCursorClass\n };\n });\n const rectangles = getResizeSideRectangles(corners, diameter / 2);\n refs.push(\n ...rectangles.map((rectangle, index) => {\n return {\n rectangle,\n handle: getResizeHandleByIndex(index + 4) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index + 4) as ResizeCursorClass\n };\n })\n );\n return refs;\n};\n\nexport const getResizeHandlePointByIndex = (rectangle: RectangleClient, index: number) => {\n if (index <= 3) {\n const corners = RectangleClient.getCornerPoints(rectangle);\n return corners[index];\n } else {\n const edgeCenterPoints = RectangleClient.getEdgeCenterPoints(rectangle);\n return edgeCenterPoints[index - 4];\n }\n};\n\nconst getResizeSideRectangles = (cornerPoints: Point[], offset: number): RectangleClient[] => {\n const result = [];\n for (let i = 0; i < cornerPoints.length; i++) {\n let rectangle = RectangleClient.getRectangleByPoints([cornerPoints[i], cornerPoints[(i + 1) % 4]]);\n const arr = new Array(2).fill(0);\n arr[(i + 1) % 2] = offset / 2;\n rectangle = RectangleClient.expand(rectangle, arr[0], arr[1]);\n result.push(rectangle);\n }\n return result;\n};\n\nexport const IS_RESIZING = new WeakMap<PlaitBoard, ResizeRef<any, any, any>>();\n\nexport const isResizing = (board: PlaitBoard) => {\n return !!IS_RESIZING.get(board);\n};\n\nexport const isResizingByCondition = <T extends PlaitElementOrArray, K>(\n board: PlaitBoard,\n match: (resizeRef: ResizeRef<T, K>) => boolean\n) => {\n return isResizing(board) && match(IS_RESIZING.get(board)!);\n};\n\nexport const addResizing = <T extends PlaitElementOrArray, K, P>(board: PlaitBoard, resizeRef: ResizeRef<T, K, P>, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.add(`${key}-resizing`);\n IS_RESIZING.set(board, resizeRef);\n setDragging(board, true);\n};\n\nexport const removeResizing = (board: PlaitBoard, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.remove(`${key}-resizing`);\n IS_RESIZING.delete(board);\n setDragging(board, false);\n};\n\nexport const isEdgeHandle = (board: PlaitBoard, handle: ResizeHandle) => {\n const index = getIndexByResizeHandle(handle);\n if (index >= 4) {\n return true;\n } else {\n return false;\n }\n};\n\nexport const isCornerHandle = (board: PlaitBoard, handle: ResizeHandle) => {\n return !isEdgeHandle(board, handle);\n};\n\n// 处理元素先旋转后resize导致的位置偏移\nexport const resetPointsAfterResize = (\n originRectangle: RectangleClient,\n currentRectangle: RectangleClient,\n originSelectionCenterPoint: Point,\n currentSelectionCenterPoint: Point,\n angle: number\n): [Point, Point] => {\n const correctSelectionCenterPoint = rotatePoints([currentSelectionCenterPoint], originSelectionCenterPoint, angle)[0];\n const rotatedElementCenterPoint = rotatePoints(\n [RectangleClient.getCenterPoint(currentRectangle) as Point],\n originSelectionCenterPoint,\n angle\n )[0];\n\n const currentPoints = RectangleClient.getPoints(currentRectangle);\n const originRectangleCenterPoint = RectangleClient.getCenterPoint(originRectangle);\n\n const correctElementCenterPoint = rotatePoints([rotatedElementCenterPoint], correctSelectionCenterPoint, -angle)[0];\n\n const rotatedPoints = rotatePoints(currentPoints, originRectangleCenterPoint, angle);\n return rotatePoints(rotatedPoints, correctElementCenterPoint, -angle) as [Point, Point];\n};\n\nexport const canResize = (board: PlaitBoard, element: PlaitElement) => {\n if (PlaitBoard.hasBeenTextEditing(board) || isSelectionMoving(board)) {\n return false;\n }\n const selectedElements = getSelectedElements(board);\n return selectedElements.length === 1 && selectedElements[0] === element;\n};\n","import { Point, Vector } from '@plait/core';\n\nexport function getUnitVectorByPointAndPoint(point1: Point, point2: Point): Point {\n const deltaX = point2[0] - point1[0];\n const deltaY = point2[1] - point1[1];\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n // Avoid division by zero if the points are the same\n if (distance === 0) {\n throw new Error('Points must not be the same for a unit vector calculation.');\n }\n // Calculate the unit vector components\n const unitX = deltaX / distance;\n const unitY = deltaY / distance;\n\n return [unitX, unitY];\n}\n\nexport function getPointByVectorComponent(point: Point, vector: Vector, component: number): Point {\n const distance = Math.hypot(vector[0], vector[1]);\n return [point[0] + (vector[0] / distance) * component, point[1] + (vector[1] / distance) * component];\n}\n\nexport function getPointByVectorDirectionComponent(point: Point, unitVector: Vector, directionComponent: number, isHorizontal: boolean) {\n if (isHorizontal) {\n return [point[0] + directionComponent, point[1] + (directionComponent / unitVector[0]) * unitVector[1]] as Point;\n } else {\n return [point[0] + (directionComponent / unitVector[1]) * unitVector[0], point[1] + directionComponent] as Point;\n }\n}\n\nexport function rotateVectorAnti90(vector: Vector): Vector {\n const x = vector[0];\n const y = vector[1];\n const rotatedX = y;\n const rotatedY = -x;\n return [rotatedX, rotatedY];\n}\n\nexport function rotateVector(vector: Vector, angle: number): Vector {\n if (!angle) {\n return vector;\n }\n const x = vector[0];\n const y = vector[1];\n const rotatedX = x * Math.cos(angle) - y * Math.sin(angle);\n const rotatedY = x * Math.sin(angle) + y * Math.cos(angle);\n return [rotatedX, rotatedY];\n}\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\nimport { getPointByVectorDirectionComponent, getUnitVectorByPointAndPoint } from './vector';\n\nexport function isPointOnSegment(point: Point, startPoint: Point, endPoint: Point) {\n const distanceToStart = distanceBetweenPointAndPoint(point[0], point[1], startPoint[0], startPoint[1]);\n const distanceToEnd = distanceBetweenPointAndPoint(point[0], point[1], endPoint[0], endPoint[1]);\n const segmentLength = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n return Math.abs(distanceToStart + distanceToEnd - segmentLength) < 0.1;\n}\n\nexport const getCrossingPointsBetweenPointAndSegment = (point: Point, startPoint: Point, endPoint: Point) => {\n const result: Point[] = [];\n const xRange = [Math.min(startPoint[0], endPoint[0]), Math.max(startPoint[0], endPoint[0])];\n const yRange = [Math.min(startPoint[1], endPoint[1]), Math.max(startPoint[1], endPoint[1])];\n const unitVector = getUnitVectorByPointAndPoint(startPoint, endPoint);\n if (point[0] >= xRange[0] && point[0] <= xRange[1]) {\n const crossingPoint = getPointByVectorDirectionComponent(startPoint, unitVector, point[0] - startPoint[0], true) as Point;\n result.push(crossingPoint);\n } else if (point[1] >= yRange[0] && point[1] <= yRange[1]) {\n const crossingPoint = getPointByVectorDirectionComponent(startPoint, unitVector, point[1] - startPoint[1], false) as Point;\n result.push(crossingPoint);\n }\n return result;\n};\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\nimport { isPointOnSegment } from './math';\n\nexport function getPointOnPolyline(points: Point[], ratio: number) {\n const totalLength = calculatePolylineLength(points);\n const targetDistance = totalLength * ratio;\n\n let accumulatedDistance = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n const segmentLength = distanceBetweenPointAndPoint(x1, y1, x2, y2);\n\n if (accumulatedDistance + segmentLength >= targetDistance) {\n const remainingDistance = targetDistance - accumulatedDistance;\n const ratioInSegment = remainingDistance / segmentLength;\n\n const targetX = x1 + (x2 - x1) * ratioInSegment;\n const targetY = y1 + (y2 - y1) * ratioInSegment;\n return [targetX, targetY];\n }\n\n accumulatedDistance += segmentLength;\n }\n\n return points[points.length - 1];\n}\n\nexport function calculatePolylineLength(points: Point[]) {\n let length = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n length += distanceBetweenPointAndPoint(x1, y1, x2, y2);\n }\n return length;\n}\n\nexport function getRatioByPoint(points: Point[], point: Point) {\n const totalLength = calculatePolylineLength(points);\n let distance = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const isOverlap = isPointOnSegment(point, points[i], points[i + 1]);\n if (isOverlap) {\n distance += distanceBetweenPointAndPoint(point[0], point[1], points[i][0], points[i][1]);\n return distance / totalLength;\n } else {\n distance += distanceBetweenPointAndPoint(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1]);\n }\n }\n throw new Error('Cannot get ratio by point');\n}\n\nexport const removeDuplicatePoints = (points: Point[]) => {\n const newArray: Point[] = [];\n points.forEach(point => {\n const index = newArray.findIndex(otherPoint => {\n return Point.isEquals(point, otherPoint);\n });\n if (index === -1) newArray.push(point);\n });\n return newArray;\n};\n\nexport function simplifyOrthogonalPoints(points: Point[]) {\n if (points.length <= 2) return points;\n let simplifiedPoints: Point[] = [points[0]];\n for (let i = 1; i < points.length - 1; i++) {\n const previous = points[i - 1];\n const current = points[i];\n const next = points[i + 1];\n const isTurn = !(Point.isOverHorizontal([previous, current, next]) || Point.isOverVertical([previous, current, next]));\n if (isTurn) {\n simplifiedPoints.push(current);\n }\n }\n simplifiedPoints.push(points[points.length - 1]);\n return simplifiedPoints;\n}\n\nexport const getExtendPoint = (source: Point, target: Point, extendDistance: number): Point => {\n const distance = distanceBetweenPointAndPoint(...source, ...target);\n const isEqual = Point.isEquals(source, target);\n const sin = isEqual ? 1 : (target[1] - source[1]) / distance;\n const cos = isEqual ? 1 : (target[0] - source[0]) / distance;\n return [source[0] + extendDistance * cos, source[1] + extendDistance * sin];\n};\n","import { Direction, DirectionFactor, Point, PointOfRectangle, Vector } from '@plait/core';\n\nconst handleDirectionFactors = {\n [Direction.left]: { x: -1, y: 0 },\n [Direction.right]: { x: 1, y: 0 },\n [Direction.top]: { x: 0, y: -1 },\n [Direction.bottom]: { x: 0, y: 1 }\n};\n\nexport function getOppositeDirection(direction: Direction) {\n switch (direction) {\n case Direction.left:\n return Direction.right;\n case Direction.right:\n return Direction.left;\n case Direction.top:\n return Direction.bottom;\n case Direction.bottom:\n return Direction.top;\n }\n}\n\nexport function getDirectionByPointOfRectangle(point: PointOfRectangle): Direction | undefined {\n if (point[0] === 0) {\n return Direction.left;\n }\n if (point[0] === 1) {\n return Direction.right;\n }\n if (point[1] === 0) {\n return Direction.top;\n }\n if (point[1] === 1) {\n return Direction.bottom;\n }\n return undefined;\n}\n\n/**\n * this function accepts vector parameter, the vector parameter vector is based on the screen coordinate system\n * vector[0] and vector[1] are the x and y components of the vector respectively.\n * if the vector has only one direction, the function returns a string in that direction, such as 'right', 'top', 'bottom' or 'left'.\n * if the vector has two directions, the function will return the string in which direction it is closer.\n */\nexport function getDirectionByVector(vector: Vector): Direction | null {\n const x = vector[0];\n const y = vector[1];\n if (x === 0 && y === 0) {\n return null;\n }\n if (x === 0) {\n return y > 0 ? Direction.bottom : Direction.top;\n }\n if (y === 0) {\n return x > 0 ? Direction.right : Direction.left;\n }\n const angle = Math.atan2(y, x);\n if (angle > -Math.PI / 4 && angle <= Math.PI / 4) {\n return Direction.right;\n } else if (angle > Math.PI / 4 && angle <= (3 * Math.PI) / 4) {\n return Direction.bottom;\n } else if (angle > (-3 * Math.PI) / 4 && angle <= -Math.PI / 4) {\n return Direction.top;\n } else {\n return Direction.left;\n }\n}\n\nexport function getDirectionBetweenPointAndPoint(source: Point, target: Point) {\n if (source[0] === target[0]) {\n if (source[1] >= target[1]) {\n return Direction.top;\n } else {\n return Direction.bottom;\n }\n }\n if (source[1] === target[1]) {\n if (source[0] >= target[0]) {\n return Direction.left;\n } else {\n return Direction.right;\n }\n }\n throw new Error('can not match direction');\n}\n\nexport function getDirectionFactor(direction: Direction) {\n return handleDirectionFactors[direction];\n}\n\nexport function getDirectionFactorByDirectionComponent(directionComponent: number): DirectionFactor {\n const directionFactor = directionComponent === 0 ? directionComponent : directionComponent / Math.abs(directionComponent);\n return directionFactor as DirectionFactor;\n}\n","// Credits to xyflow\n// https://github.com/xyflow/xyflow/blob/main/packages/system/src/utils/edges/smoothstep-edge.ts\n\nimport { Direction, Point } from \"@plait/core\";\nimport { getDirectionFactor } from \"./direction\";\n\nexport const getPoints = (source: Point, sourcePosition: Direction, target: Point, targetPosition: Direction, offset: number) => {\n const sourceDirectionFactors = getDirectionFactor(sourcePosition);\n const targetDFs = getDirectionFactor(targetPosition);\n const sourceGapped: Point = [source[0] + sourceDirectionFactors.x * offset, source[1] + sourceDirectionFactors.y * offset];\n const targetGapped: Point = [target[0] + targetDFs.x * offset, target[1] + targetDFs.y * offset];\n const dir = getDirection(sourceGapped, sourcePosition, targetGapped);\n const dirAccessor = dir.x !== 0 ? 'x' : 'y';\n const currDir = dir[dirAccessor];\n\n let points: Point[] = [];\n let centerX, centerY;\n const [defaultCenterX, defaultCenterY] = getEdgeCenter({\n sourceX: source[0],\n sourceY: source[1],\n targetX: target[0],\n targetY: target[1]\n });\n // opposite handle positions, default case\n if (sourceDirectionFactors[dirAccessor] * targetDFs[dirAccessor] === -1) {\n centerX = defaultCenterX;\n centerY = defaultCenterY;\n // --->\n // |\n // >---\n const verticalSplit: Point[] = [\n [centerX, sourceGapped[1]],\n [centerX, targetGapped[1]]\n ];\n // |\n // ---\n // |\n const horizontalSplit: Point[] = [\n [sourceGapped[0], centerY],\n [targetGapped[0], centerY]\n ];\n if (sourceDirectionFactors[dirAccessor] === currDir) {\n points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;\n } else {\n points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;\n }\n } else {\n // sourceTarget means we take x from source and y from target, targetSource is the opposite\n const sourceTarget: Point[] = [[sourceGapped[0], targetGapped[1]]];\n const targetSource: Point[] = [[targetGapped[0], sourceGapped[1]]];\n // this handles edges with same handle positions\n if (dirAccessor === 'x') {\n points = sourceDirectionFactors.x === currDir ? targetSource : sourceTarget;\n } else {\n points = sourceDirectionFactors.y === currDir ? sourceTarget : targetSource;\n }\n\n // these are conditions for handling mixed handle positions like right -> bottom for example\n let flipSourceTarget;\n if (sourcePosition !== targetPosition) {\n const dirAccessorOpposite = dirAccessor === 'x' ? 1 : 0;\n const isSameDir = sourceDirectionFactors[dirAccessor] === targetDFs[dirAccessor === 'x' ? 'y' : 'x'];\n const sourceGtTarget = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];\n const sourceLtTarget = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];\n flipSourceTarget =\n (sourceDirectionFactors[dirAccessor] === 1 && ((!isSameDir && sourceGtTarget) || (isSameDir && sourceLtTarget))) ||\n (sourceDirectionFactors[dirAccessor] !== 1 && ((!isSameDir && sourceLtTarget) || (isSameDir && sourceGtTarget)));\n\n if (flipSourceTarget) {\n points = dirAccessor === 'x' ? sourceTarget : targetSource;\n }\n }\n }\n return [source, sourceGapped, ...points, targetGapped, target];\n};\n\nconst getDirection = (source: Point, sourcePosition = Direction.bottom, target: Point) => {\n if (sourcePosition === Direction.left || sourcePosition === Direction.right) {\n return source[0] < target[0] ? { x: 1, y: 0 } : { x: -1, y: 0 };\n }\n return source[1] < target[1] ? { x: 0, y: 1 } : { x: 0, y: -1 };\n};\n\nfunction getEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY\n}: {\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n}): [number, number, number, number] {\n const xOffset = Math.abs(targetX - sourceX) / 2;\n const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;\n\n const yOffset = Math.abs(targetY - sourceY) / 2;\n const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;\n\n return [centerX, centerY, xOffset, yOffset];\n}","import { hotkeys } from '@plait/core';\nimport { isKeyHotkey } from 'is-hotkey';\n\nexport function isVirtualKey(e: KeyboardEvent) {\n const isMod = e.ctrlKey || e.metaKey;\n const isAlt = isKeyHotkey('alt', e);\n const isShift = isKeyHotkey('shift', e);\n const isCapsLock = e.key.includes('CapsLock');\n const isTab = e.key.includes('Tab');\n const isEsc = e.key.includes('Escape');\n const isF = e.key.startsWith('F');\n const isArrow = e.key.includes('Arrow') ? true : false;\n return isCapsLock || isMod || isAlt || isArrow || isShift || isTab || isEsc || isF;\n}\n\nexport const isExpandHotkey = (event: KeyboardEvent) => {\n return isKeyHotkey('mod+/', event);\n};\n\nexport const isTabHotkey = (event: KeyboardEvent) => {\n return event.key === 'Tab';\n};\n\nexport const isEnterHotkey = (event: KeyboardEvent) => {\n return event.key === 'Enter';\n};\n\nexport const isSpaceHotkey = (event: KeyboardEvent) => {\n return event.code === 'Space';\n};\n\nexport const isDelete = (event: KeyboardEvent) => {\n return hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event);\n};\n","import { PlaitBoard } from '@plait/core';\n\nexport enum BoardCreationMode {\n 'dnd' = 'dnd',\n 'drawing' = 'drawing'\n}\n\nconst BOARD_TO_CREATION_MODE: WeakMap<PlaitBoard, BoardCreationMode> = new WeakMap();\n\nexport const getCreationMode = (board: PlaitBoard) => {\n return BOARD_TO_CREATION_MODE.get(board);\n};\n\nexport const setCreationMode = (board: PlaitBoard, mode: BoardCreationMode) => {\n BOARD_TO_CREATION_MODE.set(board, mode);\n};\n\nexport const isDndMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.dnd;\n};\n\nexport const isDrawingMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.drawing;\n};\n","import { PlaitBoard, PlaitElement, getSelectedElements } from '@plait/core';\nimport { Editor, Node, Element } from 'slate';\nimport { TextManage } from '../text/text-manage';\nimport { Alignment, CustomText, ParagraphElement } from '../text/types';\n\nexport interface TextInterface {\n getTextEditors: (board: PlaitBoard, elements?: PlaitElement[]) => Editor[] | undefined;\n findFirstTextEditor: (board: PlaitBoard) => null;\n getFirstTextEditor: (element: PlaitElement) => Editor;\n getTextEditorsByElement: (element: PlaitElement) => Editor[];\n getEditingTextEditor: (board: PlaitBoard, elements?: PlaitElement[]) => Editor | undefined\n}\n\nexport const getTextManages = (element: PlaitElement) => {\n return ELEMENT_TO_TEXT_MANAGES.get(element) || [];\n};\n\nexport const getFirstTextManage = (element: PlaitElement) => {\n const textManage = getTextManages(element)[0];\n if (!textManage) {\n console.warn('can not find textManage');\n }\n return textManage;\n};\n\nexport const getTextEditorsByElement: TextInterface['getTextEditorsByElement'] = (element: PlaitElement) => {\n return getTextManages(element).map(manage => {\n return manage.editor;\n });\n};\n\nexport const getFirstTextEditor: TextInterface['getFirstTextEditor'] = (element: PlaitElement) => {\n const textEditor = getTextEditorsByElement(element)[0];\n if (!textEditor) {\n console.warn('can not find textManage');\n }\n return textEditor;\n};\n\nexport const findFirstTextEditor: TextInterface['findFirstTextEditor'] = (board: PlaitBoard) => {\n const selectedElements = getSelectedElements(board);\n let firstEditor: Editor | null = null;\n selectedElements.forEach(element => {\n const editors = getTextEditorsByElement(element);\n if (!firstEditor && editors && editors.length > 0) {\n firstEditor = editors[0];\n }\n });\n return firstEditor;\n};\n\nexport const getElementsText = (elements: PlaitElement[]) => {\n return elements\n .map(item => {\n try {\n const editors = getTextEditorsByElement(item);\n if (editors.length) {\n return editors\n .map(editor => {\n const textsEntry = Node.texts(editor);\n return Array.from(textsEntry).reduce((total, text) => (total += text[0].text), '');\n })\n .join(' ');\n }\n return '';\n } catch (error) {\n return '';\n }\n })\n .filter(item => item)\n .join(' ');\n};\n\nexport const getTextEditors: TextInterface['getTextEditors'] = (board: PlaitBoard, elements?: PlaitElement[]) => {\n const selectedElements = elements || getSelectedElements(board);\n if (selectedElements.length) {\n const textManages: TextManage[] = [];\n selectedElements.forEach(item => {\n textManages.push(...getTextManages(item));\n });\n const editingTextManage = textManages.find(textManage => textManage.isEditing);\n if (editingTextManage) {\n return [editingTextManage.editor];\n }\n return textManages.map(item => {\n return item.editor;\n });\n }\n return undefined;\n};\n\nexport const getEditingTextEditor: TextInterface['getEditingTextEditor'] = (board: PlaitBoard, elements?: PlaitElement[]) => {\n const selectedElements = elements || getSelectedElements(board);\n const textManages: TextManage[] = [];\n selectedElements.forEach(item => {\n textManages.push(...getTextManages(item));\n });\n const editingTextManage = textManages.find(textManage => textManage.isEditing);\n if (editingTextManage) {\n return editingTextManage.editor;\n }\n return undefined;\n};\n\nexport const buildText = (text: string | Element, align?: Alignment, properties?: Partial<CustomText>) => {\n properties = properties || {};\n const plaitText = typeof text === 'string' ? { children: [{ text, ...properties }] } : text;\n if (align) {\n (plaitText as ParagraphElement).align = align;\n }\n return plaitText;\n};\n\nexport const getLineHeightByFontSize = (fontSize: number) => {\n if (fontSize === 14) {\n return 20;\n }\n if (fontSize === 18) {\n return 25;\n }\n return fontSize * 1.5;\n};\n\nexport const ELEMENT_TO_TEXT_MANAGES: WeakMap<PlaitElement, TextManage[]> = new WeakMap();\n","import { PlaitBoard, PlaitElement } from '@plait/core';\n\nexport interface CommonImageItem {\n url: string;\n width: number;\n height: number;\n}\n\nexport const selectImage = (\n board: PlaitBoard,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void,\n acceptImageTypes: string[] = ['png', 'jpeg', 'gif', 'bmp']\n) => {\n const inputFile = document.createElement('input');\n inputFile.setAttribute('type', 'file');\n const acceptImageTypesString = '.' + acceptImageTypes.join(',.');\n inputFile.setAttribute('accept', acceptImageTypesString);\n inputFile.onchange = (event: Event) => {\n buildImage(board, (event.target as any).files[0], defaultImageWidth, handle);\n };\n inputFile.click();\n};\n\nexport const buildImage = async (\n board: PlaitBoard,\n imageFile: File,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void\n) => {\n let width = 0,\n height = 0;\n await getImageSize(imageFile, defaultImageWidth).then((value: { width: number; height: number }) => {\n width = value.width;\n height = value.height;\n });\n\n let imageItem = null;\n const url = URL.createObjectURL(imageFile);\n const context = PlaitBoard.getBoardContext(board);\n context.setUploadingFile({ url, file: imageFile });\n\n imageItem = {\n url,\n width,\n height\n };\n handle(imageItem);\n};\n\nfunction getImageSize(file: File, defaultImageWidth: number): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.src = URL.createObjectURL(file);\n\n image.onload = function() {\n const width = defaultImageWidth;\n const height = (defaultImageWidth * image.naturalHeight) / image.naturalWidth;\n resolve(\n image.naturalWidth > defaultImageWidth ? { width, height } : { width: image.naturalWidth, height: image.naturalHeight }\n );\n };\n });\n}\n\nconst BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE = new WeakMap<PlaitBoard, PlaitElement>();\n\nexport const getElementOfFocusedImage = (board: PlaitBoard) => {\n return BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.get(board);\n};\n\nexport const addElementOfFocusedImage = (board: PlaitBoard, element: PlaitElement) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.set(board, element);\n};\n\nexport const removeElementOfFocusedImage = (board: PlaitBoard) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.delete(board);\n};\n","import { PointNode } from './graph';\n\nexport class PriorityQueue {\n list: { node: PointNode; priority: number }[];\n\n constructor() {\n this.list = [];\n }\n\n enqueue(item: { node: PointNode; priority: number }) {\n this.list.push(item);\n this.list = this.list.sort((item1, item2) => item1.priority - item2.priority);\n }\n\n dequeue() {\n return this.list.shift();\n }\n}\n","import { Point } from '@plait/core';\nimport { PointGraph, PointNode } from './data-structures/graph';\nimport { PriorityQueue } from './data-structures/priority-queue';\n\nexport class AStar {\n cameFrom: Map<PointNode, PointNode>;\n\n constructor(private graph: PointGraph) {\n this.cameFrom = new Map<PointNode, PointNode>();\n }\n\n heuristic(a: Point, b: Point) {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n }\n\n search(start: Point, end: Point, previousStart: Point) {\n const frontier = new PriorityQueue();\n const startNode = this.graph.get(start);\n this.cameFrom = new Map<PointNode, PointNode>();\n const costSoFar = new Map<PointNode, number>();\n costSoFar.set(startNode!, 0);\n frontier.enqueue({ node: startNode!, priority: 0 });\n while (frontier.list.length > 0) {\n var current = frontier.dequeue();\n\n if (!current) {\n throw new Error(`can't find current`);\n }\n const currentPoint = current!.node.data;\n if (currentPoint[0] === end[0] && currentPoint[1] === end[1]) {\n break;\n }\n current.node.adjacentNodes.forEach(next => {\n let newCost = costSoFar.get(current!.node)! + this.heuristic(next.data, current!.node.data);\n const previousNode = this.cameFrom.get(current!.node);\n // Inflection point weight, if an inflection point occurs, cost + 1 to avoid the inflection point path\n // Three points on a line to determine whether there is an inflection point\n const previousPoint = previousNode ? previousNode.data : previousStart;\n const x = previousPoint[0] === current?.node.data[0] && previousPoint[0] === next.data[0];\n const y = previousPoint[1] === current?.node.data[1] && previousPoint[1] === next.data[1];\n if (!x && !y) {\n newCost = newCost + 1;\n }\n if (!costSoFar.has(next) || (costSoFar.get(next) && newCost < costSoFar.get(next)!)) {\n costSoFar.set(next, newCost);\n const priority = newCost + this.heuristic(next.data, end);\n frontier.enqueue({ node: next, priority });\n this.cameFrom.set(next, current!.node);\n }\n });\n }\n }\n\n getRoute(start: Point, end: Point) {\n const result = [];\n let temp = end;\n while (temp[0] !== start[0] || temp[1] !== start[1]) {\n const node = this.graph.get(temp);\n const preNode = this.cameFrom.get(node!);\n result.unshift(preNode!.data);\n temp = preNode!.data;\n }\n return result;\n }\n}\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\n\nexport class PointNode {\n public distance = Number.MAX_SAFE_INTEGER;\n public adjacentNodes: PointNode[] = [];\n constructor(public data: Point) {}\n}\n\nexport class PointGraph {\n private index: { [x: string]: { [y: string]: PointNode } } = {};\n\n add(p: Point) {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (!(xs in this.index)) {\n this.index[xs] = {};\n }\n if (!(ys in this.index[xs])) {\n this.index[xs][ys] = new PointNode(p);\n }\n }\n connect(a: Point, b: Point) {\n const nodeA = this.get(a);\n const nodeB = this.get(b);\n\n if (!nodeA || !nodeB) {\n throw new Error(`A point was not found`);\n }\n\n nodeA.adjacentNodes.push(nodeB);\n }\n\n has(p: Point): boolean {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n return xs in this.index && ys in this.index[xs];\n }\n\n get(p: Point): PointNode | null {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (xs in this.index && ys in this.index[xs]) {\n return this.index[xs][ys];\n }\n\n return null;\n }\n}\n","import { Direction, PlaitBoard, Point, RectangleClient, createDebugGenerator, DebugGenerator } from '@plait/core';\nimport { removeDuplicatePoints, simplifyOrthogonalPoints } from '../utils';\nimport { DEFAULT_ROUTE_MARGIN } from '../constants';\nimport { AStar, PointGraph } from '../algorithms';\n\nconst debugGenerator = createDebugGenerator('debug:plait:elbow-line-routing');\n\nexport interface ElbowLineRouteOptions {\n sourcePoint: Point;\n nextSourcePoint: Point;\n sourceRectangle: RectangleClient;\n sourceOuterRectangle: RectangleClient;\n targetPoint: Point;\n nextTargetPoint: Point;\n targetOuterRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface RouteAdjustOptions {\n centerX?: number;\n centerY?: number;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface AdjustOptions {\n parallelPaths: [Point, Point][];\n pointOfHit: Point;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport const generateElbowLineRoute = (options: ElbowLineRouteOptions, board?: PlaitBoard) => {\n const { nextSourcePoint, nextTargetPoint } = options;\n const points = getGraphPoints(options);\n const graph = createGraph(points);\n const aStar = new AStar(graph);\n aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);\n let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);\n route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];\n // Centerline correction: Correct the shortest path route based on the horizontal centerline/vertical centerline\n // 1. Find the horizontal center line (centerX)/vertical center line (centerY)\n // 2. Find the point that intersects centerX/centerY in route, and find the line segment parallel to centerX/centerY in route\n // 3. Construct a rectangle based on the intersection points and parallel lines found in the previous step.\n // 4. Determine whether the rectangle intersects with the element. If it does not intersect, the center line can be mapped based on the rectangle constructed in the previous step.\n // 5. Determine whether the path after mapping the center line meets the constraints (inflection point cannot be increased)\n const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);\n const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);\n const centerX = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);\n const centerY = isHitY ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, false);\n route = routeAdjust(route, { centerX, centerY, sourceRectangle: options.sourceRectangle, targetRectangle: options.targetRectangle }, board);\n return route;\n};\n\nexport const routeAdjust = (path: Point[], options: RouteAdjustOptions, board?: PlaitBoard) => {\n const { sourceRectangle, targetRectangle, centerX, centerY } = options;\n if (board) {\n debugGenerator.clear();\n }\n if (centerX !== undefined) {\n const optionsX = getAdjustOptions(path, centerX, true);\n const resultX =\n optionsX.pointOfHit &&\n adjust(path, { parallelPaths: optionsX.parallelPaths, pointOfHit: optionsX.pointOfHit, sourceRectangle, targetRectangle }, board);\n if (resultX) {\n path = resultX;\n }\n }\n if (centerY !== undefined) {\n const optionsY = getAdjustOptions(path, centerY, false);\n const resultY =\n optionsY.pointOfHit &&\n adjust(path, { parallelPaths: optionsY.parallelPaths, pointOfHit: optionsY.pointOfHit, sourceRectangle, targetRectangle }, board);\n if (resultY) {\n path = resultY;\n }\n }\n return path;\n};\n\nconst adjust = (route: Point[], options: AdjustOptions, board?: PlaitBoard): null | Point[] => {\n const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;\n let result = null;\n parallelPaths.forEach(parallelPath => {\n // Construct a rectangle\n const tempRectPoints = [pointOfHit, parallelPath[0], parallelPath[1]];\n // directly use getCornerPoints will bring the precision issue (eg: 263.6923375175286 - 57.130859375)\n const tempRect = RectangleClient.getRectangleByPoints(tempRectPoints);\n if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {\n const tempCorners = RectangleClient.getCornerPointsByPoints(tempRectPoints);\n if (board) {\n debugGenerator.drawRectangle(board, tempRect);\n }\n const indexRangeInPath: number[] = [];\n const indexRangeInCorner: number[] = [];\n route.forEach((point, index) => {\n const cornerResult = tempCorners.findIndex(corner => Point.isEquals(point, corner));\n if (cornerResult !== -1) {\n indexRangeInPath.push(index);\n indexRangeInCorner.push(cornerResult);\n }\n });\n const newPath = [...route];\n const missCorner = tempCorners.find((c, index) => !indexRangeInCorner.includes(index)) as Point;\n const removeLength = Math.abs(indexRangeInPath[0] - indexRangeInPath[indexRangeInPath.length - 1]) + 1;\n newPath.splice(indexRangeInPath[0] + 1, removeLength - 2, missCorner);\n const turnCount = simplifyOrthogonalPoints([...route]).length - 1;\n const simplifyPoints = simplifyOrthogonalPoints([...newPath]);\n // if (board) {\n // debugGenerator.drawLine(board, simplifyPoints);\n // }\n const newTurnCount = simplifyPoints.length - 1;\n if (newTurnCount <= turnCount) {\n result = newPath;\n }\n }\n return null;\n });\n return result;\n};\n\nconst getAdjustOptions = (path: Point[], centerOfAxis: number, isHorizontal: boolean) => {\n const parallelPaths: [Point, Point][] = [];\n let start: null | Point = null;\n let pointOfHit: null | Point = null;\n const axis = isHorizontal ? 0 : 1;\n\n for (let index = 0; index < path.length; index++) {\n const previous = path[index - 1];\n const current = path[index];\n if (start === null && previous && previous[axis] === current[axis]) {\n start = previous;\n }\n if (start !== null) {\n if (previous[axis] !== current[axis]) {\n parallelPaths.push([start, previous]);\n start = null;\n }\n }\n if (current[axis] === centerOfAxis) {\n pointOfHit = current;\n }\n }\n if (start) {\n parallelPaths.push([start, path[path.length - 1]]);\n }\n return { pointOfHit, parallelPaths };\n};\n\nexport const getGraphPoints = (options: ElbowLineRouteOptions) => {\n const { nextSourcePoint, nextTargetPoint, sourceOuterRectangle, targetOuterRectangle } = options;\n const x: number[] = [];\n const y: number[] = [];\n let result: Point[] = [];\n\n [sourceOuterRectangle, targetOuterRectangle].forEach(rectangle => {\n x.push(rectangle.x, rectangle.x + rectangle.width / 2, rectangle.x + rectangle.width);\n y.push(rectangle.y, rectangle.y + rectangle.height / 2, rectangle.y + rectangle.height);\n });\n const rectanglesX = [\n sourceOuterRectangle.x,\n sourceOuterRectangle.x + sourceOuterRectangle.width,\n targetOuterRectangle.x,\n targetOuterRectangle.x + targetOuterRectangle.width\n ].sort((a, b) => a - b);\n x.push((rectanglesX[1] + rectanglesX[2]) / 2, nextSourcePoint[0], nextTargetPoint[0]);\n const rectanglesY = [\n sourceOuterRectangle.y,\n sourceOuterRectangle.y + sourceOuterRectangle.height,\n targetOuterRectangle.y,\n targetOuterRectangle.y + targetOuterRectangle.height\n ].sort((a, b) => a - b);\n y.push((rectanglesY[1] + rectanglesY[2]) / 2, nextSourcePoint[1], nextTargetPoint[1]);\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n const point: Point = [x[i], y[j]];\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n if (!isInSource && !isInTarget) {\n result.push(point);\n }\n }\n }\n result = removeDuplicatePoints(result).filter(point => {\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n return !isInSource && !isInTarget;\n });\n return result;\n};\n\nexport const createGraph = (points: Point[]) => {\n const graph = new PointGraph();\n const Xs: number[] = [];\n const Ys: number[] = [];\n points.forEach(p => {\n const x = p[0],\n y = p[1];\n if (Xs.indexOf(x) < 0) Xs.push(x);\n if (Ys.indexOf(y) < 0) Ys.push(y);\n graph.add(p);\n });\n Xs.sort((a, b) => a - b);\n Ys.sort((a, b) => a - b);\n const inHotIndex = (p: Point): boolean => graph.has(p);\n for (let i = 0; i < Xs.length; i++) {\n for (let j = 0; j < Ys.length; j++) {\n const point: Point = [Xs[i], Ys[j]];\n if (!inHotIndex(point)) continue;\n if (i > 0) {\n const otherPoint: Point = [Xs[i - 1], Ys[j]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n if (j > 0) {\n const otherPoint: Point = [Xs[i], Ys[j - 1]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n }\n }\n return graph;\n};\n\nexport const reduceRouteMargin = (sourceRectangle: RectangleClient, targetRectangle: RectangleClient) => {\n const defaultOffset = DEFAULT_ROUTE_MARGIN;\n let sourceOffset: number[] = new Array(4).fill(defaultOffset);\n let targetOffset: number[] = new Array(4).fill(defaultOffset);\n const leftToRight = sourceRectangle.x - (targetRectangle.x + targetRectangle.width);\n const rightToLeft = targetRectangle.x - (sourceRectangle.x + sourceRectangle.width);\n if (leftToRight > 0 && leftToRight < defaultOffset * 2) {\n const offset = leftToRight / 2;\n sourceOffset[3] = offset;\n targetOffset[1] = offset;\n }\n\n if (rightToLeft > 0 && rightToLeft < defaultOffset * 2) {\n const offset = rightToLeft / 2;\n targetOffset[3] = offset;\n sourceOffset[1] = offset;\n }\n\n const topToBottom = sourceRectangle.y - (targetRectangle.y + targetRectangle.height);\n const bottomToTop = targetRectangle.y - (sourceRectangle.y + sourceRectangle.height);\n if (topToBottom > 0 && topToBottom < defaultOffset * 2) {\n const offset = topToBottom / 2;\n sourceOffset[0] = offset;\n targetOffset[2] = offset;\n }\n if (bottomToTop > 0 && bottomToTop < defaultOffset * 2) {\n const offset = bottomToTop / 2;\n sourceOffset[2] = offset;\n targetOffset[0] = offset;\n }\n return { sourceOffset, targetOffset };\n};\n\nexport const getNextPoint = (point: Point, outerRectangle: RectangleClient, direction: Direction): Point => {\n switch (direction) {\n case Direction.top: {\n return [point[0], outerRectangle.y];\n }\n case Direction.bottom: {\n return [point[0], outerRectangle.y + outerRectangle.height];\n }\n case Direction.right: {\n return [outerRectangle.x + outerRectangle.width, point[1]];\n }\n default: {\n return [outerRectangle.x, point[1]];\n }\n }\n};\n\nexport const getSourceAndTargetOuterRectangle = (sourceRectangle: RectangleClient, targetRectangle: RectangleClient) => {\n const { sourceOffset, targetOffset } = reduceRouteMargin(sourceRectangle, targetRectangle);\n const sourceOuterRectangle = RectangleClient.expand(\n sourceRectangle,\n sourceOffset[3],\n sourceOffset[0],\n sourceOffset[1],\n sourceOffset[2]\n );\n const targetOuterRectangle = RectangleClient.expand(\n targetRectangle,\n targetOffset[3],\n targetOffset[0],\n targetOffset[1],\n targetOffset[2]\n );\n return {\n sourceOuterRectangle,\n targetOuterRectangle\n };\n};\n\nexport const isSourceAndTargetIntersect = (options: ElbowLineRouteOptions) => {\n const {\n sourcePoint,\n nextSourcePoint,\n sourceRectangle,\n sourceOuterRectangle,\n targetPoint,\n nextTargetPoint,\n targetRectangle,\n targetOuterRectangle\n } = options;\n\n return (\n RectangleClient.isPointInRectangle(targetRectangle, sourcePoint) ||\n RectangleClient.isPointInRectangle(targetOuterRectangle, nextSourcePoint) ||\n RectangleClient.isPointInRectangle(sourceOuterRectangle, nextTargetPoint) ||\n RectangleClient.isPointInRectangle(sourceRectangle, targetPoint)\n );\n};\n","import { PlaitElement } from '@plait/core';\n\nconst map = new Map<string, any>();\n\nexport const memorizeLatest = <T extends PlaitElement = PlaitElement>(\n memorizedKey: string,\n propertyKey: keyof T,\n propertyValue: T[keyof T]\n) => {\n let obj = map.has(memorizedKey) ? map.get(memorizedKey) : {};\n obj[propertyKey] = propertyValue;\n map.set(memorizedKey, obj);\n};\n\nexport const getMemorizedLatest = <T extends PlaitElement = PlaitElement>(memorizedKey: string): T => {\n return map.get(memorizedKey);\n};\n","import { PlaitBoard, setDragging } from '@plait/core';\nimport { RotateRef } from '../types';\n\nexport const IS_ROTATING = new WeakMap<PlaitBoard, RotateRef>();\n\nexport const isRotating = (board: PlaitBoard) => {\n return !!IS_ROTATING.get(board);\n};\n\nexport const addRotating = (board: PlaitBoard, rotateRef: RotateRef) => {\n PlaitBoard.getBoardContainer(board).classList.add(`draw-elements-rotating`);\n IS_ROTATING.set(board, rotateRef);\n setDragging(board, true);\n};\n\nexport const removeRotating = (board: PlaitBoard) => {\n PlaitBoard.getBoardContainer(board).classList.remove(`draw-elements-rotating`);\n IS_ROTATING.delete(board);\n setDragging(board, false);\n};\n","import { PlaitBoard, PlaitElement } from '@plait/core';\nimport { DEFAULT_FILL, TRANSPARENT } from '../constants';\n\nexport const getElementArea = (board: PlaitBoard, element: PlaitElement) => {\n const rectangle = board.getRectangle(element);\n if (rectangle) {\n return rectangle.width * rectangle.height;\n }\n return 0;\n};\n\nexport const sortElementsByArea = (board: PlaitBoard, elements: PlaitElement[], direction: 'desc' | 'asc' = 'asc') => {\n return elements.sort((a, b) => {\n const areaA = getElementArea(board, a);\n const areaB = getElementArea(board, b);\n return direction === 'asc' ? areaA - areaB : areaB - areaA;\n });\n};\n\nexport const isFilled = (fill: string) => {\n return fill && fill !== DEFAULT_FILL && fill !== TRANSPARENT;\n};\n","export type AnimateOption = { stop: () => void; start: () => void };\n\nexport function animate(tween: (t: number) => void, duration: number, ease: Function, callback: Function): AnimateOption {\n const start = getTimestamp();\n let stopAnimation = false;\n\n function tick(now: number) {\n if (stopAnimation) {\n return;\n }\n const elapsed = now - start;\n const t = Math.min(elapsed / duration, 1);\n tween(ease(t));\n if (t < 1) {\n requestAnimationFrame(tick);\n } else if (callback) {\n callback();\n }\n }\n\n requestAnimationFrame(tick);\n return {\n stop: () => (stopAnimation = true),\n start: () => {\n stopAnimation = false;\n requestAnimationFrame(tick);\n }\n };\n}\n\nexport function getTimestamp() {\n if (window.performance && window.performance.now) {\n return window.performance.now();\n } else {\n return Date.now();\n }\n}\n\nexport function linear(t: number) {\n return t;\n}\n","import {\n ACTIVE_STROKE_WIDTH,\n PlaitBoard,\n PlaitElement,\n RectangleClient,\n createForeignObject,\n createG,\n getSelectedElements,\n isSelectionMoving,\n setAngleForG,\n updateForeignObject\n} from '@plait/core';\nimport { Generator, GeneratorExtraData, GeneratorOptions } from '../generators/generator';\nimport { CommonImageItem, canResize, getElementOfFocusedImage } from '../utils';\nimport { ActiveGenerator } from '../generators/active.generator';\nimport { PlaitImageBoard, ImageComponentRef, ImageProps } from './with-image';\n\nexport const FOREIGN_OBJECT_IMAGE_CLASS_NAME = 'foreign-object-image';\n\nexport interface ImageGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getImageItem: (element: T) => CommonImageItem;\n}\n\nexport class ImageGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n GeneratorExtraData,\n ImageGeneratorOptions<T> & GeneratorOptions\n> {\n static key = 'image-generator';\n\n foreignObject!: SVGForeignObjectElement;\n\n imageComponentRef!: ImageComponentRef;\n\n activeGenerator!: ActiveGenerator;\n\n isFocus = false;\n\n element!: T;\n\n constructor(public board: PlaitBoard, public options: ImageGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T): boolean {\n return !!this.options.getImageItem(element);\n }\n\n draw(element: T): SVGGElement {\n this.element = element;\n const g = createG();\n const foreignRectangle = this.options.getRectangle(element);\n this.foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);\n this.foreignObject.classList.add(FOREIGN_OBJECT_IMAGE_CLASS_NAME);\n g.append(this.foreignObject);\n const props: ImageProps = {\n board: this.board,\n imageItem: this.options.getImageItem(element),\n element,\n getRectangle: () => {\n return this.options.getRectangle(element);\n }\n };\n this.imageComponentRef = ((this.board as unknown) as PlaitImageBoard).renderImage(this.foreignObject, props);\n\n this.activeGenerator = new ActiveGenerator(this.board, {\n getStrokeWidth: () => {\n const selectedElements = getSelectedElements(this.board);\n if (!(selectedElements.length === 1 && !isSelectionMoving(this.board))) {\n return ACTIVE_STROKE_WIDTH;\n } else {\n return ACTIVE_STROKE_WIDTH;\n }\n },\n getStrokeOpacity: () => {\n const selectedElements = getSelectedElements(this.board);\n if ((selectedElements.length === 1 && !isSelectionMoving(this.board)) || !selectedElements.length) {\n return 1;\n } else {\n return 0.5;\n }\n },\n getRectangle: () => {\n return this.options.getRectangle(this.element);\n },\n hasResizeHandle: () => {\n const isSelectedImageElement = canResize(this.board, this.element);\n const isSelectedImage = !!getElementOfFocusedImage(this.board);\n return isSelectedImage || isSelectedImageElement;\n }\n });\n return g;\n }\n\n updateImage(nodeG: SVGGElement, previous: T, current: T) {\n this.element = current;\n if (previous !== current && this.imageComponentRef) {\n const props = {\n imageItem: this.options.getImageItem(current),\n element: current,\n getRectangle: () => {\n return this.options.getRectangle(current);\n }\n };\n this.imageComponentRef.update(props);\n }\n const currentForeignObject = this.options.getRectangle(current);\n updateForeignObject(\n this.g!,\n currentForeignObject.width,\n currentForeignObject.height,\n currentForeignObject.x,\n currentForeignObject.y\n );\n if (currentForeignObject && current.angle) {\n setAngleForG(this.g!, RectangleClient.getCenterPoint(currentForeignObject), current.angle);\n }\n const activeG = PlaitBoard.getElementActiveHost(this.board);\n this.activeGenerator.processDrawing(current, activeG, { selected: this.isFocus });\n }\n\n setFocus(element: PlaitElement, isFocus: boolean) {\n this.isFocus = isFocus;\n const activeG = PlaitBoard.getElementActiveHost(this.board);\n this.activeGenerator.processDrawing(element, activeG, { selected: isFocus });\n const props: Partial<ImageProps> = {\n isFocus\n };\n this.imageComponentRef.update(props);\n }\n\n destroy(): void {\n super.destroy();\n this.imageComponentRef?.destroy();\n this.activeGenerator?.destroy();\n }\n}\n","import { Path, PlaitBoard, PlaitElement, Transforms, getSelectedElements } from '@plait/core';\nimport { memorizeLatest } from '../utils';\n\nexport interface SetOptions<T extends PlaitElement = PlaitElement> {\n callback?: (element: T, path: Path) => void;\n getMemorizeKey?: (element: T) => string;\n match?: (element: T) => boolean;\n}\n\nexport const setProperty = <T extends PlaitElement = PlaitElement>(board: PlaitBoard, properties: Partial<T>, options?: SetOptions<T>) => {\n const selectedElements = getSelectedElements(board) as T[];\n selectedElements.forEach(element => {\n if (options?.match && !options?.match(element)) return;\n const path = PlaitBoard.findPath(board, element);\n const memorizeKey = options?.getMemorizeKey ? options?.getMemorizeKey(element) : '';\n for (let key in properties) {\n memorizeKey && memorizeLatest(memorizeKey, key, properties[key]);\n }\n if (options?.callback) {\n options.callback(element, path);\n } else {\n Transforms.setNode(board, properties, path);\n }\n });\n};\n\nconst setStrokeStyle = (board: PlaitBoard, strokeStyle: string, options: SetOptions) => {\n setProperty(board, { strokeStyle }, options);\n};\n\nconst setFillColor = (board: PlaitBoard, fill: string, options: SetOptions) => {\n setProperty(board, { fill }, options);\n};\n\nconst setStrokeColor = (board: PlaitBoard, strokeColor: string, options: SetOptions) => {\n setProperty(board, { strokeColor }, options);\n};\n\nconst setStrokeWidth = (board: PlaitBoard, strokeWidth: number, options: SetOptions) => {\n setProperty(board, { strokeWidth }, options);\n};\n\nexport const PropertyTransforms = {\n setFillColor,\n setStrokeStyle,\n setProperty,\n setStrokeWidth,\n setStrokeColor\n};\n","import {\n MERGING,\n PlaitBoard,\n PlaitElement,\n PlaitGroupElement,\n Point,\n RectangleClient,\n Transforms,\n getElementsInGroup,\n getHighestSelectedElements,\n getRectangleByElements\n} from '@plait/core';\n\nexport const alignTop = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [0, outerRectangle.y - rectangle.y] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignBottom = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [0, outerRectangle.y + outerRectangle.height - (rectangle.y + rectangle.height)] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignLeft = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [outerRectangle.x - rectangle.x, 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignHorizontalCenter = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n const outerCenter = outerRectangle.x + outerRectangle.width / 2;\n const elementCenter = rectangle.x + rectangle.width / 2;\n return [outerCenter - elementCenter, 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignVerticalCenter = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n const outerCenter = outerRectangle.y + outerRectangle.height / 2;\n const elementCenter = rectangle.y + rectangle.height / 2;\n return [0, outerCenter - elementCenter] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignRight = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [outerRectangle.x + outerRectangle.width - (rectangle.x + rectangle.width), 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nfunction setOffset(board: PlaitBoard, getOffset: (outerRectangle: RectangleClient, rectangle: RectangleClient) => Point) {\n const elements = getHighestSelectedElements(board);\n const outerRectangle = getRectangleByElements(board, elements, false);\n elements.forEach(element => {\n if (!element.points && !PlaitGroupElement.isGroup(element)) return;\n const rectangle = board.getRectangle(element)!;\n const offset = getOffset(outerRectangle, rectangle);\n let updateElements: PlaitElement[] = [];\n if (PlaitGroupElement.isGroup(element)) {\n updateElements = getElementsInGroup(board, element, true, false);\n } else if (element.points) {\n updateElements = [element];\n }\n updateElements.forEach(item => {\n const newPoints = item.points!.map(p => [p[0] + offset[0], p[1] + offset[1]]) as Point[];\n const path = PlaitBoard.findPath(board, item);\n Transforms.setNode(\n board,\n {\n points: newPoints\n },\n path\n );\n });\n MERGING.set(board, true);\n });\n MERGING.set(board, false);\n}\n\nexport const distributeHorizontal = (board: PlaitBoard) => {\n distribute(board, true);\n};\n\nexport const distributeVertical = (board: PlaitBoard) => {\n distribute(board, false);\n};\n\nconst distribute = (board: PlaitBoard, isHorizontal: boolean) => {\n const axis = isHorizontal ? 'x' : 'y';\n const side = isHorizontal ? 'width' : 'height';\n const highestSelectedElements = getHighestSelectedElements(board);\n const refs = highestSelectedElements.map(element => {\n return { element, rectangle: board.getRectangle(element)! };\n });\n const outerRectangle = getRectangleByElements(board, highestSelectedElements, false);\n const minRectangleRef = refs.sort((a, b) => a.rectangle[axis] - b.rectangle[axis])[0];\n const maxRectangleRef = refs.sort((a, b) => b.rectangle[axis] + b.rectangle[side] - (a.rectangle[axis] + a.rectangle[side]))[0];\n const minIndex = refs.findIndex(ref => ref === minRectangleRef);\n const maxIndex = refs.findIndex(ref => ref === maxRectangleRef);\n let distributeRefs = refs.filter((element, index) => index !== minIndex && index !== maxIndex);\n const sum = distributeRefs.reduce((accumulator, current) => current.rectangle[side] + accumulator, 0);\n const offset =\n (outerRectangle[side] - minRectangleRef.rectangle[side] - maxRectangleRef.rectangle[side] - sum) / (distributeRefs.length + 1);\n distributeRefs = distributeRefs.sort((a, b) => a.rectangle[axis] - b.rectangle[axis]);\n let position = minRectangleRef.rectangle[axis] + minRectangleRef.rectangle[side] + offset;\n for (let i = 0; i < distributeRefs.length; i++) {\n const rectangle = distributeRefs[i].rectangle;\n const moveOffset = [0, 0];\n const moveAxis = isHorizontal ? 0 : 1;\n moveOffset[moveAxis] = position - rectangle[axis];\n const path = PlaitBoard.findPath(board, distributeRefs[i].element);\n const newPoints = distributeRefs[i].element.points!.map(p => [p[0] + moveOffset[0], p[1] + moveOffset[1]]) as Point[];\n Transforms.setNode(\n board,\n {\n points: newPoints\n },\n path\n );\n MERGING.set(board, true);\n position = position + rectangle[side] + offset;\n }\n MERGING.set(board, false);\n};\n\nexport interface AlignTransform {\n alignTop: (board: PlaitBoard) => void;\n alignHorizontalCenter: (board: PlaitBoard) => void;\n alignBottom: (board: PlaitBoard) => void;\n alignLeft: (board: PlaitBoard) => void;\n alignVerticalCenter: (board: PlaitBoard) => void;\n alignRight: (board: PlaitBoard) => void;\n distributeHorizontal: (board: PlaitBoard) => void;\n distributeVertical: (board: PlaitBoard) => void;\n}\n\nexport const AlignTransform: AlignTransform = {\n alignTop,\n alignHorizontalCenter,\n alignBottom,\n alignLeft,\n alignVerticalCenter,\n alignRight,\n distributeHorizontal,\n distributeVertical\n};\n","import { Point } from '@plait/core';\n\nexport const normalizeShapePoints = (points: [Point, Point], shift: boolean = false): [Point, Point] => {\n let start = points[0];\n let end = points[1];\n if (shift) {\n const width = Math.abs(start[0] - end[0]);\n const height = Math.abs(start[1] - end[1]);\n const edge = Math.max(height, width);\n end = [start[0] + (end[0] > start[0] ? edge : -edge), start[1] + (end[1] > start[1] ? edge : -edge)];\n }\n\n const leftTopPoint: Point = [Math.min(start[0], end[0]), Math.min(start[1], end[1])];\n let rightBottomPoint: Point = [Math.max(start[0], end[0]), Math.max(start[1], end[1])];\n\n return [leftTopPoint, rightBottomPoint];\n};\n","import {\n MERGING,\n PRESS_AND_MOVE_BUFFER,\n PlaitBoard,\n PlaitPointerType,\n Point,\n distanceBetweenPointAndPoint,\n isMainPointer,\n preventTouchMove,\n handleTouchTarget,\n throttleRAF,\n toViewBoxPoint,\n toHostPoint,\n isDragging\n} from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\nimport { addResizing, isResizing, removeResizing } from '../utils/resize';\nimport { PlaitElementOrArray, ResizeOptions, ResizeHitTestRef, ResizeRef, WithResizeOptions } from '../types/resize';\n\nconst generalCanResize = (board: PlaitBoard, event: PointerEvent) => {\n return (\n !PlaitBoard.isReadonly(board) && !PlaitBoard.hasBeenTextEditing(board) && PlaitBoard.isPointer(board, PlaitPointerType.selection)\n );\n};\n\nexport const withResize = <T extends PlaitElementOrArray = PlaitElementOrArray, K = ResizeHandle, P = ResizeOptions>(\n board: PlaitBoard,\n options: WithResizeOptions<T, K, P>\n) => {\n const { pointerDown, pointerMove, globalPointerUp } = board;\n let resizeHitTestRef: ResizeHitTestRef<T, K, P> | null = null;\n let resizeRef: ResizeRef<T, K, P> | null = null;\n let startPoint: Point | null = null;\n let hoverHitTestRef: ResizeHitTestRef<T, K, P> | null = null;\n\n board.pointerDown = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event) || !isMainPointer(event)) {\n pointerDown(event);\n return;\n }\n const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n resizeHitTestRef = options.hitTest(point);\n if (resizeHitTestRef) {\n if (resizeHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${resizeHitTestRef.cursorClass}`);\n }\n startPoint = [event.x, event.y];\n const path = Array.isArray(resizeHitTestRef.element)\n ? resizeHitTestRef.element.map(el => PlaitBoard.findPath(board, el))\n : PlaitBoard.findPath(board, resizeHitTestRef.element);\n resizeRef = {\n path,\n element: resizeHitTestRef.element,\n handle: resizeHitTestRef.handle,\n handleIndex: resizeHitTestRef.handleIndex,\n rectangle: resizeHitTestRef.rectangle,\n options: resizeHitTestRef.options\n };\n preventTouchMove(board, event, true);\n return;\n }\n pointerDown(event);\n };\n\n board.pointerMove = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event)) {\n clearHoverHitTestRef();\n pointerMove(event);\n return;\n }\n if (startPoint && resizeHitTestRef && !isResizing(board)) {\n const endPoint = [event.x, event.y];\n const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n if (distance > PRESS_AND_MOVE_BUFFER) {\n addResizing(board, resizeRef!, options.key);\n MERGING.set(board, true);\n options.beforeResize && options.beforeResize(resizeRef!);\n }\n }\n if (!isResizing(board) && !isDragging(board)) {\n const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n throttleRAF(board, options.key + '-common-resize-hit-test', () => {\n const hitTestRef = options.hitTest(point);\n if (hitTestRef) {\n if (hoverHitTestRef && hitTestRef.cursorClass !== hoverHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoverHitTestRef.cursorClass}`);\n }\n hoverHitTestRef = hitTestRef;\n if (hoverHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${hoverHitTestRef.cursorClass}`);\n }\n } else {\n clearHoverHitTestRef();\n }\n });\n } else {\n if (startPoint && isResizing(board)) {\n event.preventDefault();\n const endPoint = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n throttleRAF(board, 'with-common-resize', () => {\n if (startPoint && resizeRef) {\n handleTouchTarget(board);\n options.onResize(resizeRef, {\n startPoint: toViewBoxPoint(board, toHostPoint(board, startPoint[0], startPoint[1])),\n endPoint,\n isShift: !!event.shiftKey\n });\n }\n });\n return;\n }\n }\n pointerMove(event);\n };\n\n board.globalPointerUp = (event: PointerEvent) => {\n globalPointerUp(event);\n if (isResizing(board) || resizeHitTestRef) {\n options.afterResize && options.afterResize(resizeRef!);\n removeResizing(board, options.key);\n startPoint = null;\n resizeHitTestRef = null;\n resizeRef = null;\n MERGING.set(board, false);\n preventTouchMove(board, event, false);\n }\n };\n\n const clearHoverHitTestRef = () => {\n if (hoverHitTestRef) {\n if (hoverHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoverHitTestRef.cursorClass}`);\n }\n hoverHitTestRef = null;\n }\n };\n\n return board;\n};\n","import { ACTIVE_STROKE_WIDTH, PlaitGroup, RectangleClient, drawRectangle, getRectangleByGroup } from '@plait/core';\nimport { Options } from 'roughjs/bin/core';\nimport { Generator } from './generator';\n\nexport class GroupGenerator extends Generator<PlaitGroup> {\n canDraw(element: PlaitGroup): boolean {\n return true;\n }\n\n draw(element: PlaitGroup, partialSelected: boolean) {\n const options: Options = {\n stroke: '',\n strokeWidth: ACTIVE_STROKE_WIDTH,\n strokeLineDash: [5]\n };\n let rectangle: RectangleClient = { x: 0, y: 0, width: 0, height: 0 };\n if (partialSelected) {\n options.stroke = '#999';\n rectangle = getRectangleByGroup(this.board, element, true);\n }\n return drawRectangle(this.board, rectangle, options);\n }\n}\n","import { PlaitElementRef } from '@plait/core';\nimport { Generator } from '../generators';\n\nexport class PlaitCommonElementRef implements PlaitElementRef {\n private generatorMap = new Map<string, Generator | Object>();\n\n addGenerator<T extends Object = Generator>(key: string, generator: T) {\n this.generatorMap.set(key, generator);\n }\n\n getGenerator<T extends Object = Generator>(key: string) {\n return this.generatorMap.get(key) as T;\n }\n}\n","import { ElementFlavour, PlaitBoard, PlaitElement } from '@plait/core';\nimport { ELEMENT_TO_TEXT_MANAGES } from '../utils/text';\nimport { PlaitCommonElementRef } from './element-ref';\nimport { TextManage } from '../text/text-manage';\n\nexport class CommonElementFlavour<\n T extends PlaitElement = PlaitElement,\n K extends PlaitBoard = PlaitBoard,\n R extends PlaitCommonElementRef = PlaitCommonElementRef\n> extends ElementFlavour<T, K, R> {\n private textManages: TextManage[] = [];\n\n constructor(elementRef = new PlaitCommonElementRef()) {\n super(elementRef as R);\n }\n\n initializeWeakMap() {\n ELEMENT_TO_TEXT_MANAGES.set(this.element, this.textManages);\n }\n\n destroyWeakMap() {\n ELEMENT_TO_TEXT_MANAGES.delete(this.element);\n }\n\n initializeTextManages(textManages: TextManage[]) {\n this.textManages = textManages;\n this.initializeWeakMap();\n }\n\n addTextManage(textManage: TextManage) {\n this.textManages.push(textManage);\n }\n\n destroyTextManages() {\n this.getTextManages().forEach(manage => {\n manage.destroy();\n });\n this.textManages = [];\n this.destroyWeakMap();\n }\n\n getTextManages() {\n return this.textManages;\n }\n}\n","import {\n OnContextChanged,\n PlaitBoard,\n PlaitGroup,\n PlaitPluginElementContext,\n getElementsInGroup,\n getRectangleByGroup,\n isSelectedElementOrGroup,\n isSelectionMoving\n} from '@plait/core';\nimport { GroupGenerator } from '../generators/group.generator';\nimport { ActiveGenerator } from '../generators';\nimport { CommonElementFlavour } from './element-flavour';\nimport { Subscription } from 'rxjs';\n\nexport class GroupComponent extends CommonElementFlavour<PlaitGroup, PlaitBoard> implements OnContextChanged<PlaitGroup, PlaitBoard> {\n onStableSubscription?: Subscription;\n\n constructor() {\n super();\n }\n\n activeGenerator!: ActiveGenerator<PlaitGroup>;\n\n groupGenerator!: GroupGenerator;\n\n initializeGenerator() {\n this.activeGenerator = new ActiveGenerator<PlaitGroup>(this.board, {\n getRectangle: (element: PlaitGroup) => {\n return getRectangleByGroup(this.board, element);\n },\n getStrokeWidth: () => 0,\n getStrokeOpacity: () => 0,\n hasResizeHandle: () => {\n return !isSelectionMoving(this.board);\n }\n });\n this.groupGenerator = new GroupGenerator(this.board);\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGenerator();\n const contextService = PlaitBoard.getBoardContext(this.board);\n this.onStableSubscription = contextService.onStable().subscribe(() => {\n const elementsInGroup = getElementsInGroup(this.board, this.element, false, true);\n const isPartialSelectGroup =\n elementsInGroup.some(item => isSelectedElementOrGroup(this.board, item)) &&\n !elementsInGroup.every(item => isSelectedElementOrGroup(this.board, item));\n this.groupGenerator.processDrawing(this.element, this.getElementG(), isPartialSelectGroup);\n });\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<PlaitGroup, PlaitBoard>,\n previous: PlaitPluginElementContext<PlaitGroup, PlaitBoard>\n ) {}\n\n destroy(): void {\n super.destroy();\n this.onStableSubscription?.unsubscribe();\n }\n}\n","import {\n PlaitBoard,\n PlaitPluginElementContext,\n PlaitGroupElement,\n toViewBoxPoint,\n toHostPoint,\n getHitElementsBySelection,\n createGroupRectangleG,\n ClipboardData,\n getHighestSelectedGroups,\n getSelectedIsolatedElements,\n PlaitElement,\n PlaitGroup,\n getSelectedGroups,\n Selection,\n Point,\n Transforms,\n idCreator,\n getGroupByElement,\n getSelectedIsolatedElementsCanAddToGroup,\n getElementsInGroup,\n getRectangleByGroup,\n PlaitPointerType,\n WritableClipboardOperationType\n} from '@plait/core';\nimport { GroupComponent } from '../core/group.component';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { isResizing } from '../utils';\n\nexport function withGroup(board: PlaitBoard) {\n let groupRectangleG: SVGGElement | null;\n let removeGroups: PlaitGroup[] | null;\n\n const {\n drawElement,\n pointerMove,\n globalPointerUp,\n insertFragment,\n getDeletedFragment,\n deleteFragment,\n getRelatedFragment,\n getRectangle,\n keyDown\n } = board;\n\n board.drawElement = (context: PlaitPluginElementContext) => {\n if (PlaitGroupElement.isGroup(context.element)) {\n return GroupComponent;\n }\n return drawElement(context);\n };\n\n board.pointerMove = (event: PointerEvent) => {\n groupRectangleG?.remove();\n const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n let selection: Selection = { anchor: point, focus: point };\n if (board.selection && !Selection.isCollapsed(board.selection)) {\n selection = board.selection;\n }\n const pointer = PlaitBoard.getPointer(board);\n if (!isResizing(board) && pointer === PlaitPointerType.selection) {\n const hitElements = getHitElementsBySelection(board, selection);\n if (hitElements.length) {\n groupRectangleG = createGroupRectangleG(board, hitElements);\n groupRectangleG && PlaitBoard.getElementActiveHost(board).append(groupRectangleG);\n }\n }\n pointerMove(event);\n };\n\n board.globalPointerUp = (event: PointerEvent) => {\n groupRectangleG?.remove();\n groupRectangleG = null;\n globalPointerUp(event);\n };\n\n board.getRelatedFragment = (elements: PlaitElement[], originData?: PlaitElement[]) => {\n const groups = getSelectedGroups(board, elements, originData);\n return getRelatedFragment([...elements, ...groups], originData);\n };\n\n board.insertFragment = (clipboardData: ClipboardData | null, targetPoint: Point, operationType?: WritableClipboardOperationType) => {\n let elements: PlaitElement[] = [];\n if (clipboardData?.elements?.length) {\n elements = new Array(clipboardData?.elements?.length);\n const groups = getHighestSelectedGroups(board, clipboardData?.elements);\n const selectedIsolatedElements = getSelectedIsolatedElements(board, clipboardData?.elements);\n selectedIsolatedElements.forEach(item => {\n const index = clipboardData.elements!.map(element => element.id).indexOf(item.id);\n elements.splice(index, 1, !item.groupId ? item : updateGroupId(item, undefined));\n });\n if (groups.length) {\n groups.forEach(item => {\n const index = clipboardData.elements!.map(element => element.id).indexOf(item.id);\n const newGroup = { ...updateGroupId(item, undefined), id: idCreator() };\n elements.splice(index, 1, newGroup);\n updateElementsGroupId(item, clipboardData.elements!, newGroup.id, elements);\n });\n }\n clipboardData.elements = elements;\n }\n insertFragment(clipboardData, targetPoint, operationType);\n const groupElements = elements?.filter(value => PlaitGroupElement.isGroup(value)) as PlaitElement[];\n groupElements.forEach(element => {\n Transforms.insertNode(board, element, [board.children.length]);\n });\n };\n\n board.getDeletedFragment = (data: PlaitElement[]) => {\n removeGroups = getRemoveGroups(board);\n if (removeGroups && removeGroups.length) {\n data.push(...removeGroups);\n }\n return getDeletedFragment(data);\n };\n\n board.deleteFragment = (elements: PlaitElement[]) => {\n if (removeGroups?.length) {\n updateSiblingElementGroupId(board, removeGroups);\n }\n deleteFragment(elements);\n removeGroups = null;\n };\n\n board.getRectangle = (element: PlaitElement) => {\n if (PlaitGroupElement.isGroup(element)) {\n return getRectangleByGroup(board, element, true);\n }\n return getRectangle(element);\n };\n\n board.keyDown = (event: KeyboardEvent) => {\n if (!PlaitBoard.isReadonly(board)) {\n if (isKeyHotkey('mod+g', event)) {\n event.preventDefault();\n Transforms.addGroup(board);\n return;\n }\n if (isKeyHotkey('mod+shift+g', event)) {\n event.preventDefault();\n Transforms.removeGroup(board);\n return;\n }\n }\n keyDown(event);\n };\n\n return board;\n}\n\nconst updateGroupId = (element: PlaitElement, groupId?: string) => {\n return {\n ...element,\n groupId: groupId\n };\n};\n\nconst updateElementsGroupId = (group: PlaitGroup, clipboardDataElements: PlaitElement[], newGroupId: string, elements: PlaitElement[]) => {\n const elementsInGroup = clipboardDataElements.filter(item => item.groupId === group.id);\n if (elementsInGroup.length) {\n elementsInGroup.forEach(item => {\n const index = clipboardDataElements.map(item => item.id).indexOf(item.id);\n if (PlaitGroupElement.isGroup(item)) {\n const newGroup = { ...updateGroupId(item, newGroupId), id: idCreator() };\n elements.splice(index, 1, newGroup);\n updateElementsGroupId(item, clipboardDataElements, newGroup.id, elements);\n } else {\n elements.splice(index, 1, updateGroupId(item, newGroupId));\n }\n });\n }\n return elements;\n};\n\nconst getRemoveGroups = (board: PlaitBoard) => {\n const selectedGroups = board.getRelatedFragment([]) as PlaitGroup[];\n const removeGroups = [...selectedGroups];\n const highestSelectedGroups = getHighestSelectedGroups(board);\n const selectedIsolatedElements = getSelectedIsolatedElementsCanAddToGroup(board);\n const removeNodes = [...highestSelectedGroups, ...selectedIsolatedElements];\n removeNodes.forEach(item => {\n const hitElementGroups = getGroupByElement(board, item, true) as PlaitGroup[];\n if (hitElementGroups.length) {\n const elementsInGroup = getElementsInGroup(board, hitElementGroups[0], false, true);\n const siblingElements = elementsInGroup.filter(\n element => ![...removeNodes, ...removeGroups].map(item => item.id).includes(element.id)\n );\n if (siblingElements.length === 1 || siblingElements.length === 0) {\n if (!removeGroups.includes(hitElementGroups[0])) {\n removeGroups.push(hitElementGroups[0]);\n }\n if (siblingElements.length === 1) {\n if (hitElementGroups.length > 1) {\n const aboveGroup = findAboveGroupWithAnotherElement(board, hitElementGroups.slice(1, hitElementGroups.length), [\n ...removeNodes,\n ...removeGroups\n ]);\n let index = hitElementGroups.length;\n if (aboveGroup) {\n index = hitElementGroups.findIndex(item => item.id === aboveGroup.id);\n }\n [...hitElementGroups.slice(1, index)].forEach(item => {\n if (!removeGroups.includes(item)) {\n removeGroups.push(item);\n }\n });\n }\n }\n }\n }\n });\n return removeGroups;\n};\n\nconst findAboveGroupWithAnotherElement = (board: PlaitBoard, groups: PlaitGroup[], excludeNodes: PlaitElement[]) => {\n let group: PlaitGroup | null = null;\n for (let i = 0; i < groups.length; i++) {\n const elementsInGroup = getElementsInGroup(board, groups[i], false, true);\n const siblingElements = elementsInGroup.filter(element => !excludeNodes.map(item => item.id).includes(element.id));\n if (siblingElements.length > 0) {\n group = groups[i];\n break;\n }\n }\n return group;\n};\n\nconst updateSiblingElementGroupId = (board: PlaitBoard, removeGroups: PlaitGroup[]) => {\n const selectedIsolatedElements = getSelectedIsolatedElementsCanAddToGroup(board);\n const highestSelectedGroups = getHighestSelectedGroups(board);\n const isolatedElementsInGroup = selectedIsolatedElements.filter(item => item.groupId);\n [...highestSelectedGroups, ...isolatedElementsInGroup].forEach(item => {\n const hitElementGroups = getGroupByElement(board, item, true) as PlaitGroup[];\n if (hitElementGroups.length) {\n const elementsInGroup = getElementsInGroup(board, hitElementGroups[0], false, true);\n const siblingElements = elementsInGroup.filter(element => element.id !== item.id);\n if (siblingElements.length === 1) {\n const removeGroupIds = removeGroups.map(item => item.id);\n if (hitElementGroups.some(group => removeGroupIds.includes(group.id))) {\n const group = hitElementGroups.find(group => !removeGroupIds.includes(group.id));\n const path = PlaitBoard.findPath(board, siblingElements[0]);\n Transforms.setNode(board, { groupId: group?.id || undefined }, path);\n }\n }\n }\n });\n};\n","import { PlaitBoard, PlaitElement } from '@plait/core';\n\nexport abstract class ImageBaseComponent {\n _isFocus!: boolean;\n\n element!: PlaitElement;\n\n board!: PlaitBoard;\n\n set isFocus(value: boolean) {\n this._isFocus = value;\n }\n\n get isFocus() {\n return this._isFocus;\n }\n\n abstract nativeElement(): HTMLElement;\n}\n","import { Node } from 'slate';\nimport { CustomText, ParagraphElement } from './types';\nimport { getLineHeightByFontSize } from '../utils/text';\n\nexport function measureElement(\n element: ParagraphElement,\n options: {\n fontSize: number;\n fontFamily: string;\n },\n containerMaxWidth: number = 10000\n) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n const textEntries = Node.texts(element);\n const lines: CustomText[][] = [[]];\n for (const textEntry of textEntries) {\n const [text] = textEntry;\n const textString = Node.string(text);\n const textArray = textString.split('\\n');\n textArray.forEach((segmentTextString: string, index: number) => {\n const segmentText = { ...text, text: segmentTextString };\n if (index === 0) {\n const currentLine = lines[lines.length - 1];\n currentLine.push(segmentText);\n } else {\n const newLine: CustomText[] = [];\n newLine.push(segmentText);\n lines.push(newLine);\n }\n });\n }\n let width = 0;\n let height = 0;\n lines.forEach((lineTexts: CustomText[], index: number) => {\n let lineWidth = 0;\n let maxLineHeight = getLineHeightByFontSize(options.fontSize);\n lineTexts.forEach((text: CustomText, index: number) => {\n const font = getFont(text, { fontFamily: options.fontFamily, fontSize: options.fontSize });\n ctx.font = font;\n const textMetrics = ctx.measureText(text.text);\n lineWidth += textMetrics.width;\n const isLast = index === lineTexts.length - 1;\n // skip when text is empty and is not last text of line\n if (text['font-size'] && (isLast || text.text !== '')) {\n const lineHeight = getLineHeightByFontSize(parseFloat(text['font-size']));\n if (lineHeight > maxLineHeight) {\n maxLineHeight = lineHeight;\n }\n }\n });\n if (lineWidth <= containerMaxWidth) {\n if (lineWidth > width) {\n width = lineWidth;\n }\n height += maxLineHeight;\n } else {\n width = containerMaxWidth;\n const lineWrapNumber = Math.ceil(lineWidth / containerMaxWidth);\n height += maxLineHeight * lineWrapNumber;\n }\n });\n return { width, height };\n}\n\nconst getFont = (\n text: CustomText,\n options: {\n fontSize: number;\n fontFamily: string;\n }\n) => {\n return `${text.italic ? 'italic ' : ''} ${text.bold ? 'bold ' : ''} ${text['font-size'] || options.fontSize}px ${options.fontFamily} `;\n};\n","import {\n IS_TEXT_EDITABLE,\n MERGING,\n PlaitBoard,\n Point,\n RectangleClient,\n createForeignObject,\n createG,\n debounce,\n setAngleForG,\n toHostPoint,\n toViewBoxPoint,\n updateForeignObject,\n updateForeignObjectWidth\n} from '@plait/core';\nimport { fromEvent, timer } from 'rxjs';\nimport { Editor, Element, NodeEntry, Range, Text, Node, Transforms, Operation } from 'slate';\nimport { PlaitTextBoard, TextPlugin } from './with-text';\nimport { measureElement } from './text-measure';\nimport { TextChangeData, TextComponentRef, TextProps } from './with-text';\n\nexport interface TextManageChangeData {\n newText?: Element;\n operations?: Operation[];\n width: number;\n height: number;\n}\n\nexport class TextManage {\n isEditing = false;\n\n editor!: Editor;\n\n g!: SVGGElement;\n\n foreignObject!: SVGForeignObjectElement;\n\n textComponentRef!: TextComponentRef;\n\n exitCallback?: () => void;\n\n constructor(\n private board: PlaitBoard,\n private options: {\n getRectangle: () => RectangleClient;\n onChange?: (data: TextManageChangeData) => void;\n getRenderRectangle?: () => RectangleClient;\n getMaxWidth?: () => number;\n textPlugins?: TextPlugin[];\n }\n ) {\n if (!this.options.getMaxWidth) {\n this.options.getMaxWidth = () => 999;\n }\n }\n\n draw(text: Element) {\n const _rectangle = this.options.getRectangle();\n this.g = createG();\n this.foreignObject = createForeignObject(_rectangle.x, _rectangle.y, _rectangle.width, _rectangle.height);\n this.g.append(this.foreignObject);\n this.g.classList.add('text');\n const props: TextProps = {\n board: this.board,\n text,\n textPlugins: this.options.textPlugins,\n onChange: (data: TextChangeData) => {\n if (data.operations.some(op => !Operation.isSelectionOperation(op))) {\n const { width: newWidth, height: newHeight } = this.getSize();\n this.options.onChange && this.options.onChange({ ...data, width: newWidth, height: newHeight });\n MERGING.set(this.board, true);\n }\n },\n afterInit: (editor: Editor) => {\n this.editor = editor;\n },\n onComposition: (event: CompositionEvent) => {\n if (event.type === 'compositionend') {\n return;\n }\n const fakeRoot = buildCompositionData(this.editor, event.data);\n if (fakeRoot) {\n const sizeData = this.getSize(fakeRoot.children[0]);\n // invoking onChange asap to avoid blinking on typing chinese\n this.options.onChange && this.options.onChange({ ...sizeData });\n MERGING.set(this.board, true);\n }\n }\n };\n this.textComponentRef = ((this.board as unknown) as PlaitTextBoard).renderText(this.foreignObject, props);\n }\n\n updateRectangleWidth(width: number) {\n updateForeignObjectWidth(this.g, width);\n }\n\n updateAngle(centerPoint: Point, angle: number = 0) {\n setAngleForG(this.g, centerPoint, angle);\n }\n\n updateRectangle(rectangle?: RectangleClient) {\n const { x, y, width, height } = rectangle || this.options.getRectangle();\n updateForeignObject(this.g, width, height, x, y);\n }\n\n updateText(newText: Element) {\n const props = {\n text: newText\n };\n this.textComponentRef.update(props);\n }\n\n edit(callback?: () => void, exitEdit?: (event: Event) => boolean) {\n this.isEditing = true;\n IS_TEXT_EDITABLE.set(this.board, true);\n const props: Partial<TextProps> = {\n readonly: false\n };\n this.textComponentRef.update(props);\n Transforms.select(this.editor, [0]);\n const mousedown$ = fromEvent<MouseEvent>(document, 'mousedown').subscribe((event: MouseEvent) => {\n const point = toViewBoxPoint(this.board, toHostPoint(this.board, event.x, event.y));\n const textRec = this.options.getRenderRectangle ? this.options.getRenderRectangle() : this.options.getRectangle();\n const clickInText = RectangleClient.isHit(RectangleClient.getRectangleByPoints([point, point]), textRec);\n const isAttached = (event.target as HTMLElement).closest('.plait-board-attached');\n if (!clickInText && !isAttached) {\n // handle composition input state, like: Chinese IME Composition Input\n timer(0).subscribe(() => {\n exitCallback();\n });\n }\n });\n const keydown$ = fromEvent<KeyboardEvent>(document, 'keydown').subscribe((event: KeyboardEvent) => {\n if (event.isComposing) {\n return;\n }\n if (event.key === 'Escape' || event.key === 'Tab' || (exitEdit ? exitEdit(event) : false)) {\n event.preventDefault();\n event.stopPropagation();\n exitCallback();\n return;\n }\n });\n const exitCallback = () => {\n if (this.isEditing) {\n this.updateRectangle();\n mousedown$.unsubscribe();\n keydown$.unsubscribe();\n IS_TEXT_EDITABLE.set(this.board, false);\n MERGING.set(this.board, false);\n callback && callback();\n const props = {\n readonly: true\n };\n this.textComponentRef.update(props);\n this.isEditing = false;\n this.exitCallback = undefined;\n }\n };\n this.exitCallback = exitCallback;\n return exitCallback;\n }\n\n getSize = (element?: Element, maxWidth?: number) => {\n const computedStyle = window.getComputedStyle(this.foreignObject.children[0]);\n const fontFamily = computedStyle.fontFamily;\n const fontSize = parseFloat(computedStyle.fontSize);\n const target = element || (this.editor.children[0] as Element);\n return measureElement(\n target,\n {\n fontSize: fontSize,\n fontFamily\n },\n maxWidth || this.options.getMaxWidth!()\n );\n };\n\n getText = () => {\n return this.editor.children[0];\n };\n\n destroy() {\n this.g?.remove();\n this.textComponentRef?.destroy();\n this.exitCallback && this.exitCallback();\n }\n}\n\nexport const buildCompositionData = (editor: Editor, data: string) => {\n if (editor.selection && Range.isCollapsed(editor.selection)) {\n const [textNode, textPath] = Editor.node(editor, editor.selection) as NodeEntry<Text>;\n const offset = editor.selection.anchor.offset;\n const clonedElement = JSON.parse(JSON.stringify(editor.children[0]));\n const root = { children: [clonedElement] };\n const newTextString = textNode.text.slice(0, offset + 1) + data + textNode.text.slice(offset + 1);\n const clonedTextNode = Node.get(root, textPath) as Text;\n clonedTextNode.text = newTextString;\n return root;\n }\n return null;\n};\n","import { PlaitBoard, WithPluginOptions } from '@plait/core';\nimport { Editor, Operation, Element as SlateElement } from 'slate';\nimport { RenderComponentRef } from '../core/render-component';\n\nexport interface PlaitTextBoard {\n renderText: (container: Element | DocumentFragment, props: TextProps) => TextComponentRef;\n}\n\nexport const withText = <T extends PlaitBoard = PlaitBoard>(board: T) => {\n const newBoard = board as T & PlaitTextBoard;\n\n newBoard.renderText = (container: Element | DocumentFragment, props: TextProps) => {\n throw new Error('No implementation for renderText method.');\n };\n return newBoard;\n};\n\nexport type TextComponentRef = RenderComponentRef<TextProps>;\n\nexport interface TextProps {\n board: PlaitBoard;\n text: SlateElement;\n textPlugins?: TextPlugin[];\n readonly?: boolean;\n onChange?: (data: TextChangeData) => void;\n afterInit?: (data: Editor) => void;\n onComposition?: (data: CompositionEvent) => void;\n}\n\nexport type TextChangeData = { newText: SlateElement; operations: Operation[] };\n\nexport interface WithTextPluginOptions extends WithPluginOptions {\n textPlugins?: TextPlugin[];\n}\n\nexport type TextPlugin = (editor: Editor) => Editor;\n","import { BaseElement, Editor } from 'slate';\n\nexport enum Alignment {\n left = 'left',\n center = 'center',\n right = 'right'\n}\n\nexport type CustomText = {\n bold?: boolean;\n italic?: boolean;\n strike?: boolean;\n code?: boolean;\n text: string;\n underlined?: boolean;\n color?: string;\n [`font-size`]?: string;\n};\n\nexport interface LinkElement extends BaseElement {\n type: 'link';\n url: string;\n}\n\nexport interface ParagraphElement extends BaseElement {\n align?: Alignment;\n}\n\nexport type CustomElement = ParagraphElement | LinkElement;\n","import { PlaitBoard, PlaitElement, RectangleClient } from '@plait/core';\nimport { RenderComponentRef } from '../core/render-component';\nimport { CommonImageItem } from '../utils/image';\n\nexport interface PlaitImageBoard {\n renderImage: (container: Element | DocumentFragment, props: ImageProps) => ImageComponentRef;\n}\n\nexport const withImage = <T extends PlaitBoard = PlaitBoard>(board: T) => {\n const newBoard = board as T & PlaitImageBoard;\n\n newBoard.renderImage = (container: Element | DocumentFragment, props: ImageProps) => {\n throw new Error('No implementation for renderImage method.');\n };\n return newBoard;\n};\n\nexport type ImageComponentRef = RenderComponentRef<ImageProps>;\n\nexport interface ImageProps {\n board: PlaitBoard;\n imageItem: CommonImageItem;\n element: PlaitElement;\n isFocus?: boolean;\n getRectangle: () => RectangleClient;\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './constants';\nexport * from './generators';\nexport * from './transforms';\nexport * from './shapes';\nexport * from './plugins';\nexport * from './utils';\nexport * from './image/image-base.component';\nexport * from './core';\nexport * from './algorithms';\nexport * from './text';\nexport * from './image';\nexport * from './types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Transforms"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plait-common.mjs","sources":["../../../packages/common/src/constants/default.ts","../../../packages/common/src/constants/media.ts","../../../packages/common/src/constants/resize.ts","../../../packages/common/src/generators/generator.ts","../../../packages/common/src/utils/drawing/resize-handle.ts","../../../packages/common/src/utils/drawing/rotate-handle.ts","../../../packages/common/src/generators/active.generator.ts","../../../packages/common/src/utils/resize.ts","../../../packages/common/src/utils/vector.ts","../../../packages/common/src/utils/math.ts","../../../packages/common/src/utils/line-path.ts","../../../packages/common/src/utils/direction.ts","../../../packages/common/src/utils/default-orthogonal-routing.ts","../../../packages/common/src/utils/hot-key.ts","../../../packages/common/src/utils/creation-mode.ts","../../../packages/common/src/utils/text.ts","../../../packages/common/src/utils/image.ts","../../../packages/common/src/algorithms/data-structures/priority-queue.ts","../../../packages/common/src/algorithms/a-star.ts","../../../packages/common/src/algorithms/data-structures/graph.ts","../../../packages/common/src/utils/elbow-line-route.ts","../../../packages/common/src/utils/memorize.ts","../../../packages/common/src/utils/rotate.ts","../../../packages/common/src/utils/elements.ts","../../../packages/common/src/utils/animate.ts","../../../packages/common/src/image/image.generator.ts","../../../packages/common/src/transforms/property.ts","../../../packages/common/src/transforms/align.ts","../../../packages/common/src/shapes/common.ts","../../../packages/common/src/plugins/with-resize.ts","../../../packages/common/src/generators/group.generator.ts","../../../packages/common/src/core/element-ref.ts","../../../packages/common/src/core/element-flavour.ts","../../../packages/common/src/core/group.component.ts","../../../packages/common/src/plugins/with-group.ts","../../../packages/common/src/image/image-base.component.ts","../../../packages/common/src/text/text-measure.ts","../../../packages/common/src/text/text-manage.ts","../../../packages/common/src/text/with-text.ts","../../../packages/common/src/text/types.ts","../../../packages/common/src/image/with-image.ts","../../../packages/common/src/public-api.ts","../../../packages/common/src/plait-common.ts"],"sourcesContent":["export const BASE = 4;\nexport const PRIMARY_COLOR = '#6698FF';\nexport const RESIZE_HANDLE_DIAMETER = 9;\nexport const WithTextPluginKey = 'plait-text-plugin-key';\nexport const DEFAULT_ROUTE_MARGIN = 30;\nexport const TRANSPARENT = 'transparent';\nexport const ROTATE_HANDLE_DISTANCE_TO_ELEMENT = 20;\nexport const ROTATE_HANDLE_SIZE = 18;\nexport const DEFAULT_FONT_FAMILY = 'PingFangSC-Regular, \"PingFang SC\"';\nexport const DEFAULT_FILL = 'none';\n","export enum MediaKeys {\n image = 'image'\n}\n\nexport const PICTURE_ACCEPTED_UPLOAD_SIZE = 20;\n\nexport const acceptImageTypes = ['png', 'jpeg', 'gif', 'bmp'];\n\nexport const WithCommonPluginKey = 'plait-common-plugin-key';\n","export enum ResizeHandle {\n nw = '0',\n n = '4',\n ne = '1',\n e = '5',\n se = '2',\n s = '6',\n sw = '3',\n w = '7'\n}\n","import {\n PlaitBoard,\n PlaitElement,\n PlaitGroupElement,\n RectangleClient,\n getElementsInGroup,\n getSelectionAngle,\n setAngleForG\n} from '@plait/core';\n\nexport interface GeneratorExtraData {}\n\nexport interface GeneratorOptions {\n prepend?: boolean;\n}\n\nexport abstract class Generator<\n T extends PlaitElement = PlaitElement,\n K extends GeneratorExtraData = GeneratorExtraData,\n V extends GeneratorOptions = GeneratorOptions,\n P extends PlaitBoard = PlaitBoard\n> {\n g?: SVGGElement;\n\n protected options?: V;\n\n constructor(protected board: P, options?: V) {\n this.options = options;\n }\n\n processDrawing(element: T, parentG: SVGGElement, data?: K) {\n if (this.canDraw && this.canDraw(element, data)) {\n const g = this.draw(element, data);\n if (g) {\n if (this.g && parentG.contains(this.g)) {\n this.g.replaceWith(g);\n } else {\n if (this.g) {\n this.g.remove();\n }\n if (this.options?.prepend) {\n parentG.prepend(g);\n } else {\n parentG.appendChild(g);\n }\n }\n this.g = g;\n const rect = this.board.getRectangle(element);\n if (rect) {\n let angle;\n if (PlaitGroupElement.isGroup(element)) {\n angle = getSelectionAngle(getElementsInGroup(this.board, element, true));\n } else {\n angle = element.angle;\n }\n if (angle) {\n setAngleForG(g, RectangleClient.getCenterPoint(rect), angle);\n }\n }\n } else {\n this.destroy();\n }\n if (hasAfterDraw(this)) {\n this.afterDraw(element);\n }\n } else {\n this.destroy();\n }\n }\n\n /**\n * abstract function\n */\n protected abstract canDraw(element: T, data?: K): boolean;\n\n /**\n * abstract function\n */\n protected abstract draw(element: T, data?: K): SVGGElement | undefined;\n\n destroy() {\n if (this.g) {\n this.g.remove();\n this.g = undefined;\n }\n }\n}\n\nexport interface AfterDraw<T extends PlaitElement = PlaitElement> {\n afterDraw(element: T): void;\n}\n\nexport function hasAfterDraw(value: any): value is AfterDraw {\n if (value.afterDraw) {\n return true;\n }\n return false;\n}\n","import { RESIZE_HANDLE_CLASS_NAME, PlaitBoard, Point, drawCircle } from '@plait/core';\nimport { Options } from 'roughjs/bin/core';\nimport { PRIMARY_COLOR, RESIZE_HANDLE_DIAMETER } from '../../constants/default';\n\nexport const drawHandle = (board: PlaitBoard, centerPoint: Point) => {\n const options: Options = { stroke: '#99999995', strokeWidth: 2, fill: '#FFF', fillStyle: 'solid' };\n const handleG = drawCircle(PlaitBoard.getRoughSVG(board), centerPoint, RESIZE_HANDLE_DIAMETER, options);\n handleG.classList.add(RESIZE_HANDLE_CLASS_NAME);\n return handleG;\n};\n\nexport function drawFillPrimaryHandle(board: PlaitBoard, point: Point) {\n return drawCircle(PlaitBoard.getRoughSVG(board), point, RESIZE_HANDLE_DIAMETER, {\n stroke: '#FFFFFF',\n strokeWidth: 1,\n fill: `${PRIMARY_COLOR}`,\n fillStyle: 'solid'\n });\n}\n\nexport function drawPrimaryHandle(board: PlaitBoard, point: Point) {\n return drawCircle(PlaitBoard.getRoughSVG(board), point, RESIZE_HANDLE_DIAMETER, {\n stroke: `${PRIMARY_COLOR}`,\n strokeWidth: 2,\n fill: `#FFFFFF`,\n fillStyle: 'solid'\n });\n}\n","import { PlaitBoard, RectangleClient, createG, setStrokeLinecap } from '@plait/core';\nimport { Options } from 'roughjs/bin/core';\nimport { ROTATE_HANDLE_DISTANCE_TO_ELEMENT, ROTATE_HANDLE_SIZE } from '../../constants';\n\nconst rotateHandleRadius = 6;\n\nexport const drawRotateHandle = (board: PlaitBoard, rectangle: RectangleClient) => {\n const options: Options = { stroke: '#333', strokeWidth: 1, fillStyle: 'solid' };\n const handleCenterPoint = [\n rectangle.x - ROTATE_HANDLE_DISTANCE_TO_ELEMENT - ROTATE_HANDLE_SIZE / 2,\n rectangle.y + rectangle.height + ROTATE_HANDLE_DISTANCE_TO_ELEMENT + ROTATE_HANDLE_SIZE / 2\n ];\n const rs = PlaitBoard.getRoughSVG(board);\n const handleG = createG();\n const line = rs.path(\n `M ${handleCenterPoint[0] + rotateHandleRadius} ${handleCenterPoint[1]} A ${rotateHandleRadius} ${rotateHandleRadius}, 0, 1, 0, ${\n handleCenterPoint[0]\n } ${handleCenterPoint[1] + rotateHandleRadius}`,\n options\n );\n const arrow = rs.polygon(\n [\n [handleCenterPoint[0], handleCenterPoint[1] + rotateHandleRadius - 2],\n [handleCenterPoint[0], handleCenterPoint[1] + rotateHandleRadius + 2],\n [handleCenterPoint[0] + 4.5, handleCenterPoint[1] + rotateHandleRadius]\n ],\n { ...options, fill: '#333' }\n );\n setStrokeLinecap(arrow, 'round');\n handleG.append(line, arrow);\n return handleG;\n};\n","import { PlaitBoard, PlaitElement, RectangleClient, SELECTION_RECTANGLE_CLASS_NAME, createG, drawRectangle } from '@plait/core';\nimport { Generator, GeneratorOptions } from './generator';\nimport { PRIMARY_COLOR } from '../constants/default';\nimport { drawHandle } from '../utils/drawing';\n\nexport interface ActiveGeneratorExtraData {\n selected: boolean;\n}\n\nexport interface ActiveGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getStrokeWidth: () => number;\n getStrokeOpacity: () => number;\n hasResizeHandle: () => boolean;\n}\n\nexport class ActiveGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n ActiveGeneratorExtraData,\n ActiveGeneratorOptions<T> & GeneratorOptions\n> {\n static key = 'active-generator';\n\n hasResizeHandle = false;\n\n constructor(public board: PlaitBoard, public options: ActiveGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T, data: ActiveGeneratorExtraData): boolean {\n if (data.selected) {\n return true;\n } else {\n return false;\n }\n }\n\n draw(element: T, data: ActiveGeneratorExtraData): SVGGElement {\n const activeG = createG();\n const rectangle = this.options.getRectangle(element);\n\n const delta = this.options.getStrokeWidth();\n const activeRectangle = RectangleClient.inflate(rectangle, delta);\n\n const strokeG = drawRectangle(this.board, activeRectangle, {\n stroke: PRIMARY_COLOR,\n strokeWidth: delta\n });\n\n activeG.append(strokeG);\n strokeG.classList.add(SELECTION_RECTANGLE_CLASS_NAME);\n strokeG.style.opacity = `${this.options.getStrokeOpacity()}`;\n if (this.options.hasResizeHandle()) {\n this.hasResizeHandle = true;\n // draw resize handle\n RectangleClient.getCornerPoints(activeRectangle).forEach(corner => {\n const cornerHandleG = drawHandle(this.board, corner);\n activeG.append(cornerHandleG);\n });\n } else {\n this.hasResizeHandle = false;\n }\n return activeG;\n }\n}\n","import {\n PlaitBoard,\n Point,\n RectangleClient,\n ResizeCursorClass,\n setDragging,\n RESIZE_CURSORS,\n rotatePoints,\n PlaitElement,\n getSelectedElements,\n isSelectionMoving\n} from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\nimport { PlaitElementOrArray, ResizeRef } from '../types/resize';\n\nexport const getResizeHandleByIndex = (index: number) => {\n return `${index}` as ResizeHandle;\n};\n\nexport const getIndexByResizeHandle = (resizeHandle: ResizeHandle) => {\n return Number(resizeHandle);\n};\n\nexport const getSymmetricHandleIndex = (board: PlaitBoard, index: number) => {\n const originIndex = isEdgeHandle(board, getResizeHandleByIndex(index)) ? index - 4 : index;\n let originSymmetricHandleIndex = originIndex + 2;\n if (originSymmetricHandleIndex >= 4) {\n originSymmetricHandleIndex = originSymmetricHandleIndex - 4;\n }\n return isEdgeHandle(board, getResizeHandleByIndex(index)) ? originSymmetricHandleIndex + 4 : originSymmetricHandleIndex;\n};\n\nconst getResizeCursorClassByIndex = (index: number) => {\n switch (index) {\n case 0:\n case 2:\n return ResizeCursorClass.nwse;\n case 1:\n case 3:\n return ResizeCursorClass.nesw;\n case 4:\n case 6:\n return ResizeCursorClass.ns;\n case 5:\n case 7:\n return ResizeCursorClass.ew;\n default:\n return null;\n }\n};\n\nexport const getRotatedResizeCursorClassByAngle = (cursor: ResizeCursorClass, angle: number) => {\n const index = RESIZE_CURSORS.indexOf(cursor);\n if (index >= 0) {\n const temp = Math.round(angle / (Math.PI / 4));\n cursor = RESIZE_CURSORS[(index + temp) % RESIZE_CURSORS.length] as ResizeCursorClass;\n }\n return cursor;\n};\n\nexport const getRectangleResizeHandleRefs = (rectangle: RectangleClient, diameter: number) => {\n const corners = RectangleClient.getCornerPoints(rectangle);\n const refs = corners.map((corner, index: number) => {\n return {\n rectangle: {\n x: corner[0] - diameter / 2,\n y: corner[1] - diameter / 2,\n width: diameter,\n height: diameter\n },\n handle: getResizeHandleByIndex(index) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index) as ResizeCursorClass\n };\n });\n const rectangles = getResizeSideRectangles(corners, diameter / 2);\n refs.push(\n ...rectangles.map((rectangle, index) => {\n return {\n rectangle,\n handle: getResizeHandleByIndex(index + 4) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index + 4) as ResizeCursorClass\n };\n })\n );\n return refs;\n};\n\nexport const getResizeHandlePointByIndex = (rectangle: RectangleClient, index: number) => {\n if (index <= 3) {\n const corners = RectangleClient.getCornerPoints(rectangle);\n return corners[index];\n } else {\n const edgeCenterPoints = RectangleClient.getEdgeCenterPoints(rectangle);\n return edgeCenterPoints[index - 4];\n }\n};\n\nconst getResizeSideRectangles = (cornerPoints: Point[], offset: number): RectangleClient[] => {\n const result = [];\n for (let i = 0; i < cornerPoints.length; i++) {\n let rectangle = RectangleClient.getRectangleByPoints([cornerPoints[i], cornerPoints[(i + 1) % 4]]);\n const arr = new Array(2).fill(0);\n arr[(i + 1) % 2] = offset / 2;\n rectangle = RectangleClient.expand(rectangle, arr[0], arr[1]);\n result.push(rectangle);\n }\n return result;\n};\n\nexport const IS_RESIZING = new WeakMap<PlaitBoard, ResizeRef<any, any, any>>();\n\nexport const isResizing = (board: PlaitBoard) => {\n return !!IS_RESIZING.get(board);\n};\n\nexport const isResizingByCondition = <T extends PlaitElementOrArray, K>(\n board: PlaitBoard,\n match: (resizeRef: ResizeRef<T, K>) => boolean\n) => {\n return isResizing(board) && match(IS_RESIZING.get(board)!);\n};\n\nexport const addResizing = <T extends PlaitElementOrArray, K, P>(board: PlaitBoard, resizeRef: ResizeRef<T, K, P>, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.add(`${key}-resizing`);\n IS_RESIZING.set(board, resizeRef);\n setDragging(board, true);\n};\n\nexport const removeResizing = (board: PlaitBoard, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.remove(`${key}-resizing`);\n IS_RESIZING.delete(board);\n setDragging(board, false);\n};\n\nexport const isEdgeHandle = (board: PlaitBoard, handle: ResizeHandle) => {\n const index = getIndexByResizeHandle(handle);\n if (index >= 4) {\n return true;\n } else {\n return false;\n }\n};\n\nexport const isCornerHandle = (board: PlaitBoard, handle: ResizeHandle) => {\n return !isEdgeHandle(board, handle);\n};\n\n// 处理元素先旋转后resize导致的位置偏移\nexport const resetPointsAfterResize = (\n originRectangle: RectangleClient,\n currentRectangle: RectangleClient,\n originSelectionCenterPoint: Point,\n currentSelectionCenterPoint: Point,\n angle: number\n): [Point, Point] => {\n const correctSelectionCenterPoint = rotatePoints([currentSelectionCenterPoint], originSelectionCenterPoint, angle)[0];\n const rotatedElementCenterPoint = rotatePoints(\n [RectangleClient.getCenterPoint(currentRectangle) as Point],\n originSelectionCenterPoint,\n angle\n )[0];\n\n const currentPoints = RectangleClient.getPoints(currentRectangle);\n const originRectangleCenterPoint = RectangleClient.getCenterPoint(originRectangle);\n\n const correctElementCenterPoint = rotatePoints([rotatedElementCenterPoint], correctSelectionCenterPoint, -angle)[0];\n\n const rotatedPoints = rotatePoints(currentPoints, originRectangleCenterPoint, angle);\n return rotatePoints(rotatedPoints, correctElementCenterPoint, -angle) as [Point, Point];\n};\n\nexport const canResize = (board: PlaitBoard, element: PlaitElement) => {\n if (PlaitBoard.hasBeenTextEditing(board) || isSelectionMoving(board)) {\n return false;\n }\n const selectedElements = getSelectedElements(board);\n return selectedElements.length === 1 && selectedElements[0] === element;\n};\n","import { Point, Vector } from '@plait/core';\n\nexport function getUnitVectorByPointAndPoint(point1: Point, point2: Point): Point {\n const deltaX = point2[0] - point1[0];\n const deltaY = point2[1] - point1[1];\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n // Avoid division by zero if the points are the same\n if (distance === 0) {\n throw new Error('Points must not be the same for a unit vector calculation.');\n }\n // Calculate the unit vector components\n const unitX = deltaX / distance;\n const unitY = deltaY / distance;\n\n return [unitX, unitY];\n}\n\nexport function getPointByVectorComponent(point: Point, vector: Vector, component: number): Point {\n const distance = Math.hypot(vector[0], vector[1]);\n return [point[0] + (vector[0] / distance) * component, point[1] + (vector[1] / distance) * component];\n}\n\nexport function getPointByVectorDirectionComponent(point: Point, unitVector: Vector, directionComponent: number, isHorizontal: boolean) {\n if (isHorizontal) {\n return [point[0] + directionComponent, point[1] + (directionComponent / unitVector[0]) * unitVector[1]] as Point;\n } else {\n return [point[0] + (directionComponent / unitVector[1]) * unitVector[0], point[1] + directionComponent] as Point;\n }\n}\n\nexport function rotateVectorAnti90(vector: Vector): Vector {\n const x = vector[0];\n const y = vector[1];\n const rotatedX = y;\n const rotatedY = -x;\n return [rotatedX, rotatedY];\n}\n\nexport function rotateVector(vector: Vector, angle: number): Vector {\n if (!angle) {\n return vector;\n }\n const x = vector[0];\n const y = vector[1];\n const rotatedX = x * Math.cos(angle) - y * Math.sin(angle);\n const rotatedY = x * Math.sin(angle) + y * Math.cos(angle);\n return [rotatedX, rotatedY];\n}\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\nimport { getPointByVectorDirectionComponent, getUnitVectorByPointAndPoint } from './vector';\n\nexport function isPointOnSegment(point: Point, startPoint: Point, endPoint: Point) {\n const distanceToStart = distanceBetweenPointAndPoint(point[0], point[1], startPoint[0], startPoint[1]);\n const distanceToEnd = distanceBetweenPointAndPoint(point[0], point[1], endPoint[0], endPoint[1]);\n const segmentLength = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n return Math.abs(distanceToStart + distanceToEnd - segmentLength) < 0.1;\n}\n\nexport const getCrossingPointsBetweenPointAndSegment = (point: Point, startPoint: Point, endPoint: Point) => {\n const result: Point[] = [];\n const xRange = [Math.min(startPoint[0], endPoint[0]), Math.max(startPoint[0], endPoint[0])];\n const yRange = [Math.min(startPoint[1], endPoint[1]), Math.max(startPoint[1], endPoint[1])];\n const unitVector = getUnitVectorByPointAndPoint(startPoint, endPoint);\n if (point[0] >= xRange[0] && point[0] <= xRange[1]) {\n const crossingPoint = getPointByVectorDirectionComponent(startPoint, unitVector, point[0] - startPoint[0], true) as Point;\n result.push(crossingPoint);\n } else if (point[1] >= yRange[0] && point[1] <= yRange[1]) {\n const crossingPoint = getPointByVectorDirectionComponent(startPoint, unitVector, point[1] - startPoint[1], false) as Point;\n result.push(crossingPoint);\n }\n return result;\n};\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\nimport { isPointOnSegment } from './math';\n\nexport function getPointOnPolyline(points: Point[], ratio: number) {\n const totalLength = calculatePolylineLength(points);\n const targetDistance = totalLength * ratio;\n\n let accumulatedDistance = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n const segmentLength = distanceBetweenPointAndPoint(x1, y1, x2, y2);\n\n if (accumulatedDistance + segmentLength >= targetDistance) {\n const remainingDistance = targetDistance - accumulatedDistance;\n const ratioInSegment = remainingDistance / segmentLength;\n\n const targetX = x1 + (x2 - x1) * ratioInSegment;\n const targetY = y1 + (y2 - y1) * ratioInSegment;\n return [targetX, targetY];\n }\n\n accumulatedDistance += segmentLength;\n }\n\n return points[points.length - 1];\n}\n\nexport function calculatePolylineLength(points: Point[]) {\n let length = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n length += distanceBetweenPointAndPoint(x1, y1, x2, y2);\n }\n return length;\n}\n\nexport function getRatioByPoint(points: Point[], point: Point) {\n const totalLength = calculatePolylineLength(points);\n let distance = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const isOverlap = isPointOnSegment(point, points[i], points[i + 1]);\n if (isOverlap) {\n distance += distanceBetweenPointAndPoint(point[0], point[1], points[i][0], points[i][1]);\n return distance / totalLength;\n } else {\n distance += distanceBetweenPointAndPoint(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1]);\n }\n }\n throw new Error('Cannot get ratio by point');\n}\n\nexport const removeDuplicatePoints = (points: Point[]) => {\n const newArray: Point[] = [];\n points.forEach(point => {\n const index = newArray.findIndex(otherPoint => {\n return Point.isEquals(point, otherPoint);\n });\n if (index === -1) newArray.push(point);\n });\n return newArray;\n};\n\nexport function simplifyOrthogonalPoints(points: Point[]) {\n if (points.length <= 2) return points;\n let simplifiedPoints: Point[] = [points[0]];\n for (let i = 1; i < points.length - 1; i++) {\n const previous = points[i - 1];\n const current = points[i];\n const next = points[i + 1];\n const isTurn = !(Point.isOverHorizontal([previous, current, next]) || Point.isOverVertical([previous, current, next]));\n if (isTurn) {\n simplifiedPoints.push(current);\n }\n }\n simplifiedPoints.push(points[points.length - 1]);\n return simplifiedPoints;\n}\n\nexport const getExtendPoint = (source: Point, target: Point, extendDistance: number): Point => {\n const distance = distanceBetweenPointAndPoint(...source, ...target);\n const isEqual = Point.isEquals(source, target);\n const sin = isEqual ? 1 : (target[1] - source[1]) / distance;\n const cos = isEqual ? 1 : (target[0] - source[0]) / distance;\n return [source[0] + extendDistance * cos, source[1] + extendDistance * sin];\n};\n","import { Direction, DirectionFactor, Point, PointOfRectangle, Vector } from '@plait/core';\n\nconst handleDirectionFactors = {\n [Direction.left]: { x: -1, y: 0 },\n [Direction.right]: { x: 1, y: 0 },\n [Direction.top]: { x: 0, y: -1 },\n [Direction.bottom]: { x: 0, y: 1 }\n};\n\nexport function getOppositeDirection(direction: Direction) {\n switch (direction) {\n case Direction.left:\n return Direction.right;\n case Direction.right:\n return Direction.left;\n case Direction.top:\n return Direction.bottom;\n case Direction.bottom:\n return Direction.top;\n }\n}\n\nexport function getDirectionByPointOfRectangle(point: PointOfRectangle): Direction | undefined {\n if (point[0] === 0) {\n return Direction.left;\n }\n if (point[0] === 1) {\n return Direction.right;\n }\n if (point[1] === 0) {\n return Direction.top;\n }\n if (point[1] === 1) {\n return Direction.bottom;\n }\n return undefined;\n}\n\n/**\n * this function accepts vector parameter, the vector parameter vector is based on the screen coordinate system\n * vector[0] and vector[1] are the x and y components of the vector respectively.\n * if the vector has only one direction, the function returns a string in that direction, such as 'right', 'top', 'bottom' or 'left'.\n * if the vector has two directions, the function will return the string in which direction it is closer.\n */\nexport function getDirectionByVector(vector: Vector): Direction | null {\n const x = vector[0];\n const y = vector[1];\n if (x === 0 && y === 0) {\n return null;\n }\n if (x === 0) {\n return y > 0 ? Direction.bottom : Direction.top;\n }\n if (y === 0) {\n return x > 0 ? Direction.right : Direction.left;\n }\n const angle = Math.atan2(y, x);\n if (angle > -Math.PI / 4 && angle <= Math.PI / 4) {\n return Direction.right;\n } else if (angle > Math.PI / 4 && angle <= (3 * Math.PI) / 4) {\n return Direction.bottom;\n } else if (angle > (-3 * Math.PI) / 4 && angle <= -Math.PI / 4) {\n return Direction.top;\n } else {\n return Direction.left;\n }\n}\n\nexport function getDirectionBetweenPointAndPoint(source: Point, target: Point) {\n if (source[0] === target[0]) {\n if (source[1] >= target[1]) {\n return Direction.top;\n } else {\n return Direction.bottom;\n }\n }\n if (source[1] === target[1]) {\n if (source[0] >= target[0]) {\n return Direction.left;\n } else {\n return Direction.right;\n }\n }\n throw new Error('can not match direction');\n}\n\nexport function getDirectionFactor(direction: Direction) {\n return handleDirectionFactors[direction];\n}\n\nexport function getDirectionFactorByDirectionComponent(directionComponent: number): DirectionFactor {\n const directionFactor = directionComponent === 0 ? directionComponent : directionComponent / Math.abs(directionComponent);\n return directionFactor as DirectionFactor;\n}\n","// Credits to xyflow\n// https://github.com/xyflow/xyflow/blob/main/packages/system/src/utils/edges/smoothstep-edge.ts\n\nimport { Direction, Point } from \"@plait/core\";\nimport { getDirectionFactor } from \"./direction\";\n\nexport const getPoints = (source: Point, sourcePosition: Direction, target: Point, targetPosition: Direction, offset: number) => {\n const sourceDirectionFactors = getDirectionFactor(sourcePosition);\n const targetDFs = getDirectionFactor(targetPosition);\n const sourceGapped: Point = [source[0] + sourceDirectionFactors.x * offset, source[1] + sourceDirectionFactors.y * offset];\n const targetGapped: Point = [target[0] + targetDFs.x * offset, target[1] + targetDFs.y * offset];\n const dir = getDirection(sourceGapped, sourcePosition, targetGapped);\n const dirAccessor = dir.x !== 0 ? 'x' : 'y';\n const currDir = dir[dirAccessor];\n\n let points: Point[] = [];\n let centerX, centerY;\n const [defaultCenterX, defaultCenterY] = getEdgeCenter({\n sourceX: source[0],\n sourceY: source[1],\n targetX: target[0],\n targetY: target[1]\n });\n // opposite handle positions, default case\n if (sourceDirectionFactors[dirAccessor] * targetDFs[dirAccessor] === -1) {\n centerX = defaultCenterX;\n centerY = defaultCenterY;\n // --->\n // |\n // >---\n const verticalSplit: Point[] = [\n [centerX, sourceGapped[1]],\n [centerX, targetGapped[1]]\n ];\n // |\n // ---\n // |\n const horizontalSplit: Point[] = [\n [sourceGapped[0], centerY],\n [targetGapped[0], centerY]\n ];\n if (sourceDirectionFactors[dirAccessor] === currDir) {\n points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;\n } else {\n points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;\n }\n } else {\n // sourceTarget means we take x from source and y from target, targetSource is the opposite\n const sourceTarget: Point[] = [[sourceGapped[0], targetGapped[1]]];\n const targetSource: Point[] = [[targetGapped[0], sourceGapped[1]]];\n // this handles edges with same handle positions\n if (dirAccessor === 'x') {\n points = sourceDirectionFactors.x === currDir ? targetSource : sourceTarget;\n } else {\n points = sourceDirectionFactors.y === currDir ? sourceTarget : targetSource;\n }\n\n // these are conditions for handling mixed handle positions like right -> bottom for example\n let flipSourceTarget;\n if (sourcePosition !== targetPosition) {\n const dirAccessorOpposite = dirAccessor === 'x' ? 1 : 0;\n const isSameDir = sourceDirectionFactors[dirAccessor] === targetDFs[dirAccessor === 'x' ? 'y' : 'x'];\n const sourceGtTarget = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];\n const sourceLtTarget = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];\n flipSourceTarget =\n (sourceDirectionFactors[dirAccessor] === 1 && ((!isSameDir && sourceGtTarget) || (isSameDir && sourceLtTarget))) ||\n (sourceDirectionFactors[dirAccessor] !== 1 && ((!isSameDir && sourceLtTarget) || (isSameDir && sourceGtTarget)));\n\n if (flipSourceTarget) {\n points = dirAccessor === 'x' ? sourceTarget : targetSource;\n }\n }\n }\n return [source, sourceGapped, ...points, targetGapped, target];\n};\n\nconst getDirection = (source: Point, sourcePosition = Direction.bottom, target: Point) => {\n if (sourcePosition === Direction.left || sourcePosition === Direction.right) {\n return source[0] < target[0] ? { x: 1, y: 0 } : { x: -1, y: 0 };\n }\n return source[1] < target[1] ? { x: 0, y: 1 } : { x: 0, y: -1 };\n};\n\nfunction getEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY\n}: {\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n}): [number, number, number, number] {\n const xOffset = Math.abs(targetX - sourceX) / 2;\n const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;\n\n const yOffset = Math.abs(targetY - sourceY) / 2;\n const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;\n\n return [centerX, centerY, xOffset, yOffset];\n}","import { hotkeys } from '@plait/core';\nimport { isKeyHotkey } from 'is-hotkey';\n\nexport function isVirtualKey(e: KeyboardEvent) {\n const isMod = e.ctrlKey || e.metaKey;\n const isAlt = isKeyHotkey('alt', e);\n const isShift = isKeyHotkey('shift', e);\n const isCapsLock = e.key.includes('CapsLock');\n const isTab = e.key.includes('Tab');\n const isEsc = e.key.includes('Escape');\n const isF = e.key.startsWith('F');\n const isArrow = e.key.includes('Arrow') ? true : false;\n return isCapsLock || isMod || isAlt || isArrow || isShift || isTab || isEsc || isF;\n}\n\nexport const isExpandHotkey = (event: KeyboardEvent) => {\n return isKeyHotkey('mod+/', event);\n};\n\nexport const isTabHotkey = (event: KeyboardEvent) => {\n return event.key === 'Tab';\n};\n\nexport const isEnterHotkey = (event: KeyboardEvent) => {\n return event.key === 'Enter';\n};\n\nexport const isSpaceHotkey = (event: KeyboardEvent) => {\n return event.code === 'Space';\n};\n\nexport const isDelete = (event: KeyboardEvent) => {\n return hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event);\n};\n","import { PlaitBoard } from '@plait/core';\n\nexport enum BoardCreationMode {\n 'dnd' = 'dnd',\n 'drawing' = 'drawing'\n}\n\nconst BOARD_TO_CREATION_MODE: WeakMap<PlaitBoard, BoardCreationMode> = new WeakMap();\n\nexport const getCreationMode = (board: PlaitBoard) => {\n return BOARD_TO_CREATION_MODE.get(board);\n};\n\nexport const setCreationMode = (board: PlaitBoard, mode: BoardCreationMode) => {\n BOARD_TO_CREATION_MODE.set(board, mode);\n};\n\nexport const isDndMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.dnd;\n};\n\nexport const isDrawingMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.drawing;\n};\n","import { PlaitBoard, PlaitElement, getSelectedElements } from '@plait/core';\nimport { Editor, Node, Element } from 'slate';\nimport { TextManage } from '../text/text-manage';\nimport { Alignment, CustomText, ParagraphElement } from '../text/types';\n\nexport interface TextInterface {\n getTextEditors: (board: PlaitBoard, elements?: PlaitElement[]) => Editor[] | undefined;\n findFirstTextEditor: (board: PlaitBoard) => null;\n getFirstTextEditor: (element: PlaitElement) => Editor;\n getTextEditorsByElement: (element: PlaitElement) => Editor[];\n getEditingTextEditor: (board: PlaitBoard, elements?: PlaitElement[]) => Editor | undefined\n}\n\nexport const getTextManages = (element: PlaitElement) => {\n return ELEMENT_TO_TEXT_MANAGES.get(element) || [];\n};\n\nexport const getFirstTextManage = (element: PlaitElement) => {\n const textManage = getTextManages(element)[0];\n if (!textManage) {\n console.warn('can not find textManage');\n }\n return textManage;\n};\n\nexport const getTextEditorsByElement: TextInterface['getTextEditorsByElement'] = (element: PlaitElement) => {\n return getTextManages(element).map(manage => {\n return manage.editor;\n });\n};\n\nexport const getFirstTextEditor: TextInterface['getFirstTextEditor'] = (element: PlaitElement) => {\n const textEditor = getTextEditorsByElement(element)[0];\n if (!textEditor) {\n console.warn('can not find textManage');\n }\n return textEditor;\n};\n\nexport const findFirstTextEditor: TextInterface['findFirstTextEditor'] = (board: PlaitBoard) => {\n const selectedElements = getSelectedElements(board);\n let firstEditor: Editor | null = null;\n selectedElements.forEach(element => {\n const editors = getTextEditorsByElement(element);\n if (!firstEditor && editors && editors.length > 0) {\n firstEditor = editors[0];\n }\n });\n return firstEditor;\n};\n\nexport const getElementsText = (elements: PlaitElement[]) => {\n return elements\n .map(item => {\n try {\n const editors = getTextEditorsByElement(item);\n if (editors.length) {\n return editors\n .map(editor => {\n const textsEntry = Node.texts(editor);\n return Array.from(textsEntry).reduce((total, text) => (total += text[0].text), '');\n })\n .join(' ');\n }\n return '';\n } catch (error) {\n return '';\n }\n })\n .filter(item => item)\n .join(' ');\n};\n\nexport const getTextEditors: TextInterface['getTextEditors'] = (board: PlaitBoard, elements?: PlaitElement[]) => {\n const selectedElements = elements || getSelectedElements(board);\n if (selectedElements.length) {\n const textManages: TextManage[] = [];\n selectedElements.forEach(item => {\n textManages.push(...getTextManages(item));\n });\n const editingTextManage = textManages.find(textManage => textManage.isEditing);\n if (editingTextManage) {\n return [editingTextManage.editor];\n }\n return textManages.map(item => {\n return item.editor;\n });\n }\n return undefined;\n};\n\nexport const getEditingTextEditor: TextInterface['getEditingTextEditor'] = (board: PlaitBoard, elements?: PlaitElement[]) => {\n const selectedElements = elements || getSelectedElements(board);\n const textManages: TextManage[] = [];\n selectedElements.forEach(item => {\n textManages.push(...getTextManages(item));\n });\n const editingTextManage = textManages.find(textManage => textManage.isEditing);\n if (editingTextManage) {\n return editingTextManage.editor;\n }\n return undefined;\n};\n\nexport const buildText = (text: string | Element, align?: Alignment, properties?: Partial<CustomText>) => {\n properties = properties || {};\n const plaitText = typeof text === 'string' ? { children: [{ text, ...properties }] } : text;\n if (align) {\n (plaitText as ParagraphElement).align = align;\n }\n return plaitText;\n};\n\nexport const getLineHeightByFontSize = (fontSize: number) => {\n if (fontSize === 14) {\n return 20;\n }\n if (fontSize === 18) {\n return 25;\n }\n return fontSize * 1.5;\n};\n\nexport const ELEMENT_TO_TEXT_MANAGES: WeakMap<PlaitElement, TextManage[]> = new WeakMap();\n","import { PlaitBoard, PlaitElement } from '@plait/core';\n\nexport interface CommonImageItem {\n url: string;\n width: number;\n height: number;\n}\n\nexport const selectImage = (\n board: PlaitBoard,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void,\n acceptImageTypes: string[] = ['png', 'jpeg', 'gif', 'bmp']\n) => {\n const inputFile = document.createElement('input');\n inputFile.setAttribute('type', 'file');\n const acceptImageTypesString = '.' + acceptImageTypes.join(',.');\n inputFile.setAttribute('accept', acceptImageTypesString);\n inputFile.onchange = (event: Event) => {\n buildImage(board, (event.target as any).files[0], defaultImageWidth, handle);\n };\n inputFile.click();\n};\n\nexport const buildImage = async (\n board: PlaitBoard,\n imageFile: File,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void\n) => {\n let width = 0,\n height = 0;\n await getImageSize(imageFile, defaultImageWidth).then((value: { width: number; height: number }) => {\n width = value.width;\n height = value.height;\n });\n\n let imageItem = null;\n const url = URL.createObjectURL(imageFile);\n const context = PlaitBoard.getBoardContext(board);\n context.setUploadingFile({ url, file: imageFile });\n\n imageItem = {\n url,\n width,\n height\n };\n handle(imageItem);\n};\n\nfunction getImageSize(file: File, defaultImageWidth: number): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.src = URL.createObjectURL(file);\n\n image.onload = function() {\n const width = defaultImageWidth;\n const height = (defaultImageWidth * image.naturalHeight) / image.naturalWidth;\n resolve(\n image.naturalWidth > defaultImageWidth ? { width, height } : { width: image.naturalWidth, height: image.naturalHeight }\n );\n };\n });\n}\n\nconst BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE = new WeakMap<PlaitBoard, PlaitElement>();\n\nexport const getElementOfFocusedImage = (board: PlaitBoard) => {\n return BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.get(board);\n};\n\nexport const addElementOfFocusedImage = (board: PlaitBoard, element: PlaitElement) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.set(board, element);\n};\n\nexport const removeElementOfFocusedImage = (board: PlaitBoard) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.delete(board);\n};\n","import { PointNode } from './graph';\n\nexport class PriorityQueue {\n list: { node: PointNode; priority: number }[];\n\n constructor() {\n this.list = [];\n }\n\n enqueue(item: { node: PointNode; priority: number }) {\n this.list.push(item);\n this.list = this.list.sort((item1, item2) => item1.priority - item2.priority);\n }\n\n dequeue() {\n return this.list.shift();\n }\n}\n","import { Point } from '@plait/core';\nimport { PointGraph, PointNode } from './data-structures/graph';\nimport { PriorityQueue } from './data-structures/priority-queue';\n\nexport class AStar {\n cameFrom: Map<PointNode, PointNode>;\n\n constructor(private graph: PointGraph) {\n this.cameFrom = new Map<PointNode, PointNode>();\n }\n\n heuristic(a: Point, b: Point) {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n }\n\n search(start: Point, end: Point, previousStart: Point) {\n const frontier = new PriorityQueue();\n const startNode = this.graph.get(start);\n this.cameFrom = new Map<PointNode, PointNode>();\n const costSoFar = new Map<PointNode, number>();\n costSoFar.set(startNode!, 0);\n frontier.enqueue({ node: startNode!, priority: 0 });\n while (frontier.list.length > 0) {\n var current = frontier.dequeue();\n\n if (!current) {\n throw new Error(`can't find current`);\n }\n const currentPoint = current!.node.data;\n if (currentPoint[0] === end[0] && currentPoint[1] === end[1]) {\n break;\n }\n current.node.adjacentNodes.forEach(next => {\n let newCost = costSoFar.get(current!.node)! + this.heuristic(next.data, current!.node.data);\n const previousNode = this.cameFrom.get(current!.node);\n // Inflection point weight, if an inflection point occurs, cost + 1 to avoid the inflection point path\n // Three points on a line to determine whether there is an inflection point\n const previousPoint = previousNode ? previousNode.data : previousStart;\n const x = previousPoint[0] === current?.node.data[0] && previousPoint[0] === next.data[0];\n const y = previousPoint[1] === current?.node.data[1] && previousPoint[1] === next.data[1];\n if (!x && !y) {\n newCost = newCost + 1;\n }\n if (!costSoFar.has(next) || (costSoFar.get(next) && newCost < costSoFar.get(next)!)) {\n costSoFar.set(next, newCost);\n const priority = newCost + this.heuristic(next.data, end);\n frontier.enqueue({ node: next, priority });\n this.cameFrom.set(next, current!.node);\n }\n });\n }\n }\n\n getRoute(start: Point, end: Point) {\n const result = [];\n let temp = end;\n while (temp[0] !== start[0] || temp[1] !== start[1]) {\n const node = this.graph.get(temp);\n const preNode = this.cameFrom.get(node!);\n result.unshift(preNode!.data);\n temp = preNode!.data;\n }\n return result;\n }\n}\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\n\nexport class PointNode {\n public distance = Number.MAX_SAFE_INTEGER;\n public adjacentNodes: PointNode[] = [];\n constructor(public data: Point) {}\n}\n\nexport class PointGraph {\n private index: { [x: string]: { [y: string]: PointNode } } = {};\n\n add(p: Point) {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (!(xs in this.index)) {\n this.index[xs] = {};\n }\n if (!(ys in this.index[xs])) {\n this.index[xs][ys] = new PointNode(p);\n }\n }\n connect(a: Point, b: Point) {\n const nodeA = this.get(a);\n const nodeB = this.get(b);\n\n if (!nodeA || !nodeB) {\n throw new Error(`A point was not found`);\n }\n\n nodeA.adjacentNodes.push(nodeB);\n }\n\n has(p: Point): boolean {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n return xs in this.index && ys in this.index[xs];\n }\n\n get(p: Point): PointNode | null {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (xs in this.index && ys in this.index[xs]) {\n return this.index[xs][ys];\n }\n\n return null;\n }\n}\n","import { Direction, PlaitBoard, Point, RectangleClient, createDebugGenerator, DebugGenerator } from '@plait/core';\nimport { removeDuplicatePoints, simplifyOrthogonalPoints } from '../utils';\nimport { DEFAULT_ROUTE_MARGIN } from '../constants';\nimport { AStar, PointGraph } from '../algorithms';\n\nconst debugGenerator = createDebugGenerator('debug:plait:elbow-line-routing');\n\nexport interface ElbowLineRouteOptions {\n sourcePoint: Point;\n nextSourcePoint: Point;\n sourceRectangle: RectangleClient;\n sourceOuterRectangle: RectangleClient;\n targetPoint: Point;\n nextTargetPoint: Point;\n targetOuterRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface RouteAdjustOptions {\n centerX?: number;\n centerY?: number;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface AdjustOptions {\n parallelPaths: [Point, Point][];\n pointOfHit: Point;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport const generateElbowLineRoute = (options: ElbowLineRouteOptions, board?: PlaitBoard) => {\n const { nextSourcePoint, nextTargetPoint } = options;\n const points = getGraphPoints(options);\n const graph = createGraph(points);\n const aStar = new AStar(graph);\n aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);\n let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);\n route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];\n // Centerline correction: Correct the shortest path route based on the horizontal centerline/vertical centerline\n // 1. Find the horizontal center line (centerX)/vertical center line (centerY)\n // 2. Find the point that intersects centerX/centerY in route, and find the line segment parallel to centerX/centerY in route\n // 3. Construct a rectangle based on the intersection points and parallel lines found in the previous step.\n // 4. Determine whether the rectangle intersects with the element. If it does not intersect, the center line can be mapped based on the rectangle constructed in the previous step.\n // 5. Determine whether the path after mapping the center line meets the constraints (inflection point cannot be increased)\n const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);\n const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);\n const centerX = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);\n const centerY = isHitY ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, false);\n route = routeAdjust(route, { centerX, centerY, sourceRectangle: options.sourceRectangle, targetRectangle: options.targetRectangle }, board);\n return route;\n};\n\nexport const routeAdjust = (path: Point[], options: RouteAdjustOptions, board?: PlaitBoard) => {\n const { sourceRectangle, targetRectangle, centerX, centerY } = options;\n if (board) {\n debugGenerator.clear();\n }\n if (centerX !== undefined) {\n const optionsX = getAdjustOptions(path, centerX, true);\n const resultX =\n optionsX.pointOfHit &&\n adjust(path, { parallelPaths: optionsX.parallelPaths, pointOfHit: optionsX.pointOfHit, sourceRectangle, targetRectangle }, board);\n if (resultX) {\n path = resultX;\n }\n }\n if (centerY !== undefined) {\n const optionsY = getAdjustOptions(path, centerY, false);\n const resultY =\n optionsY.pointOfHit &&\n adjust(path, { parallelPaths: optionsY.parallelPaths, pointOfHit: optionsY.pointOfHit, sourceRectangle, targetRectangle }, board);\n if (resultY) {\n path = resultY;\n }\n }\n return path;\n};\n\nconst adjust = (route: Point[], options: AdjustOptions, board?: PlaitBoard): null | Point[] => {\n const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;\n let result = null;\n parallelPaths.forEach(parallelPath => {\n // Construct a rectangle\n const tempRectPoints = [pointOfHit, parallelPath[0], parallelPath[1]];\n // directly use getCornerPoints will bring the precision issue (eg: 263.6923375175286 - 57.130859375)\n const tempRect = RectangleClient.getRectangleByPoints(tempRectPoints);\n if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {\n const tempCorners = RectangleClient.getCornerPointsByPoints(tempRectPoints);\n if (board) {\n debugGenerator.drawRectangle(board, tempRect);\n }\n const indexRangeInPath: number[] = [];\n const indexRangeInCorner: number[] = [];\n route.forEach((point, index) => {\n const cornerResult = tempCorners.findIndex(corner => Point.isEquals(point, corner));\n if (cornerResult !== -1) {\n indexRangeInPath.push(index);\n indexRangeInCorner.push(cornerResult);\n }\n });\n const newPath = [...route];\n const missCorner = tempCorners.find((c, index) => !indexRangeInCorner.includes(index)) as Point;\n const removeLength = Math.abs(indexRangeInPath[0] - indexRangeInPath[indexRangeInPath.length - 1]) + 1;\n newPath.splice(indexRangeInPath[0] + 1, removeLength - 2, missCorner);\n const turnCount = simplifyOrthogonalPoints([...route]).length - 1;\n const simplifyPoints = simplifyOrthogonalPoints([...newPath]);\n // if (board) {\n // debugGenerator.drawLine(board, simplifyPoints);\n // }\n const newTurnCount = simplifyPoints.length - 1;\n if (newTurnCount <= turnCount) {\n result = newPath;\n }\n }\n return null;\n });\n return result;\n};\n\nconst getAdjustOptions = (path: Point[], centerOfAxis: number, isHorizontal: boolean) => {\n const parallelPaths: [Point, Point][] = [];\n let start: null | Point = null;\n let pointOfHit: null | Point = null;\n const axis = isHorizontal ? 0 : 1;\n\n for (let index = 0; index < path.length; index++) {\n const previous = path[index - 1];\n const current = path[index];\n if (start === null && previous && previous[axis] === current[axis]) {\n start = previous;\n }\n if (start !== null) {\n if (previous[axis] !== current[axis]) {\n parallelPaths.push([start, previous]);\n start = null;\n }\n }\n if (current[axis] === centerOfAxis) {\n pointOfHit = current;\n }\n }\n if (start) {\n parallelPaths.push([start, path[path.length - 1]]);\n }\n return { pointOfHit, parallelPaths };\n};\n\nexport const getGraphPoints = (options: ElbowLineRouteOptions) => {\n const { nextSourcePoint, nextTargetPoint, sourceOuterRectangle, targetOuterRectangle } = options;\n const x: number[] = [];\n const y: number[] = [];\n let result: Point[] = [];\n\n [sourceOuterRectangle, targetOuterRectangle].forEach(rectangle => {\n x.push(rectangle.x, rectangle.x + rectangle.width / 2, rectangle.x + rectangle.width);\n y.push(rectangle.y, rectangle.y + rectangle.height / 2, rectangle.y + rectangle.height);\n });\n const rectanglesX = [\n sourceOuterRectangle.x,\n sourceOuterRectangle.x + sourceOuterRectangle.width,\n targetOuterRectangle.x,\n targetOuterRectangle.x + targetOuterRectangle.width\n ].sort((a, b) => a - b);\n x.push((rectanglesX[1] + rectanglesX[2]) / 2, nextSourcePoint[0], nextTargetPoint[0]);\n const rectanglesY = [\n sourceOuterRectangle.y,\n sourceOuterRectangle.y + sourceOuterRectangle.height,\n targetOuterRectangle.y,\n targetOuterRectangle.y + targetOuterRectangle.height\n ].sort((a, b) => a - b);\n y.push((rectanglesY[1] + rectanglesY[2]) / 2, nextSourcePoint[1], nextTargetPoint[1]);\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n const point: Point = [x[i], y[j]];\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n if (!isInSource && !isInTarget) {\n result.push(point);\n }\n }\n }\n result = removeDuplicatePoints(result).filter(point => {\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n return !isInSource && !isInTarget;\n });\n return result;\n};\n\nexport const createGraph = (points: Point[]) => {\n const graph = new PointGraph();\n const Xs: number[] = [];\n const Ys: number[] = [];\n points.forEach(p => {\n const x = p[0],\n y = p[1];\n if (Xs.indexOf(x) < 0) Xs.push(x);\n if (Ys.indexOf(y) < 0) Ys.push(y);\n graph.add(p);\n });\n Xs.sort((a, b) => a - b);\n Ys.sort((a, b) => a - b);\n const inHotIndex = (p: Point): boolean => graph.has(p);\n for (let i = 0; i < Xs.length; i++) {\n for (let j = 0; j < Ys.length; j++) {\n const point: Point = [Xs[i], Ys[j]];\n if (!inHotIndex(point)) continue;\n if (i > 0) {\n const otherPoint: Point = [Xs[i - 1], Ys[j]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n if (j > 0) {\n const otherPoint: Point = [Xs[i], Ys[j - 1]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n }\n }\n return graph;\n};\n\nexport const reduceRouteMargin = (sourceRectangle: RectangleClient, targetRectangle: RectangleClient) => {\n const defaultOffset = DEFAULT_ROUTE_MARGIN;\n let sourceOffset: number[] = new Array(4).fill(defaultOffset);\n let targetOffset: number[] = new Array(4).fill(defaultOffset);\n const leftToRight = sourceRectangle.x - (targetRectangle.x + targetRectangle.width);\n const rightToLeft = targetRectangle.x - (sourceRectangle.x + sourceRectangle.width);\n if (leftToRight > 0 && leftToRight < defaultOffset * 2) {\n const offset = leftToRight / 2;\n sourceOffset[3] = offset;\n targetOffset[1] = offset;\n }\n\n if (rightToLeft > 0 && rightToLeft < defaultOffset * 2) {\n const offset = rightToLeft / 2;\n targetOffset[3] = offset;\n sourceOffset[1] = offset;\n }\n\n const topToBottom = sourceRectangle.y - (targetRectangle.y + targetRectangle.height);\n const bottomToTop = targetRectangle.y - (sourceRectangle.y + sourceRectangle.height);\n if (topToBottom > 0 && topToBottom < defaultOffset * 2) {\n const offset = topToBottom / 2;\n sourceOffset[0] = offset;\n targetOffset[2] = offset;\n }\n if (bottomToTop > 0 && bottomToTop < defaultOffset * 2) {\n const offset = bottomToTop / 2;\n sourceOffset[2] = offset;\n targetOffset[0] = offset;\n }\n return { sourceOffset, targetOffset };\n};\n\nexport const getNextPoint = (point: Point, outerRectangle: RectangleClient, direction: Direction): Point => {\n switch (direction) {\n case Direction.top: {\n return [point[0], outerRectangle.y];\n }\n case Direction.bottom: {\n return [point[0], outerRectangle.y + outerRectangle.height];\n }\n case Direction.right: {\n return [outerRectangle.x + outerRectangle.width, point[1]];\n }\n default: {\n return [outerRectangle.x, point[1]];\n }\n }\n};\n\nexport const getSourceAndTargetOuterRectangle = (sourceRectangle: RectangleClient, targetRectangle: RectangleClient) => {\n const { sourceOffset, targetOffset } = reduceRouteMargin(sourceRectangle, targetRectangle);\n const sourceOuterRectangle = RectangleClient.expand(\n sourceRectangle,\n sourceOffset[3],\n sourceOffset[0],\n sourceOffset[1],\n sourceOffset[2]\n );\n const targetOuterRectangle = RectangleClient.expand(\n targetRectangle,\n targetOffset[3],\n targetOffset[0],\n targetOffset[1],\n targetOffset[2]\n );\n return {\n sourceOuterRectangle,\n targetOuterRectangle\n };\n};\n\nexport const isSourceAndTargetIntersect = (options: ElbowLineRouteOptions) => {\n const {\n sourcePoint,\n nextSourcePoint,\n sourceRectangle,\n sourceOuterRectangle,\n targetPoint,\n nextTargetPoint,\n targetRectangle,\n targetOuterRectangle\n } = options;\n\n return (\n RectangleClient.isPointInRectangle(targetRectangle, sourcePoint) ||\n RectangleClient.isPointInRectangle(targetOuterRectangle, nextSourcePoint) ||\n RectangleClient.isPointInRectangle(sourceOuterRectangle, nextTargetPoint) ||\n RectangleClient.isPointInRectangle(sourceRectangle, targetPoint)\n );\n};\n","import { PlaitElement } from '@plait/core';\n\nconst map = new Map<string, any>();\n\nexport const memorizeLatest = <T extends PlaitElement = PlaitElement>(\n memorizedKey: string,\n propertyKey: keyof T,\n propertyValue: T[keyof T]\n) => {\n let obj = map.has(memorizedKey) ? map.get(memorizedKey) : {};\n obj[propertyKey] = propertyValue;\n map.set(memorizedKey, obj);\n};\n\nexport const getMemorizedLatest = <T extends PlaitElement = PlaitElement>(memorizedKey: string): T => {\n return map.get(memorizedKey);\n};\n","import { PlaitBoard, setDragging } from '@plait/core';\nimport { RotateRef } from '../types';\n\nexport const IS_ROTATING = new WeakMap<PlaitBoard, RotateRef>();\n\nexport const isRotating = (board: PlaitBoard) => {\n return !!IS_ROTATING.get(board);\n};\n\nexport const addRotating = (board: PlaitBoard, rotateRef: RotateRef) => {\n PlaitBoard.getBoardContainer(board).classList.add(`draw-elements-rotating`);\n IS_ROTATING.set(board, rotateRef);\n setDragging(board, true);\n};\n\nexport const removeRotating = (board: PlaitBoard) => {\n PlaitBoard.getBoardContainer(board).classList.remove(`draw-elements-rotating`);\n IS_ROTATING.delete(board);\n setDragging(board, false);\n};\n","import { PlaitBoard, PlaitElement } from '@plait/core';\nimport { DEFAULT_FILL, TRANSPARENT } from '../constants';\n\nexport const getElementArea = (board: PlaitBoard, element: PlaitElement) => {\n const rectangle = board.getRectangle(element);\n if (rectangle) {\n return rectangle.width * rectangle.height;\n }\n return 0;\n};\n\nexport const sortElementsByArea = (board: PlaitBoard, elements: PlaitElement[], direction: 'desc' | 'asc' = 'asc') => {\n return elements.sort((a, b) => {\n const areaA = getElementArea(board, a);\n const areaB = getElementArea(board, b);\n return direction === 'asc' ? areaA - areaB : areaB - areaA;\n });\n};\n\nexport const isFilled = (fill: string) => {\n return fill && fill !== DEFAULT_FILL && fill !== TRANSPARENT;\n};\n","export type AnimateOption = { stop: () => void; start: () => void };\n\nexport function animate(tween: (t: number) => void, duration: number, ease: Function, callback: Function): AnimateOption {\n const start = getTimestamp();\n let stopAnimation = false;\n\n function tick(now: number) {\n if (stopAnimation) {\n return;\n }\n const elapsed = now - start;\n const t = Math.min(elapsed / duration, 1);\n tween(ease(t));\n if (t < 1) {\n requestAnimationFrame(tick);\n } else if (callback) {\n callback();\n }\n }\n\n requestAnimationFrame(tick);\n return {\n stop: () => (stopAnimation = true),\n start: () => {\n stopAnimation = false;\n requestAnimationFrame(tick);\n }\n };\n}\n\nexport function getTimestamp() {\n if (window.performance && window.performance.now) {\n return window.performance.now();\n } else {\n return Date.now();\n }\n}\n\nexport function linear(t: number) {\n return t;\n}\n","import {\n ACTIVE_STROKE_WIDTH,\n PlaitBoard,\n PlaitElement,\n RectangleClient,\n createForeignObject,\n createG,\n getSelectedElements,\n isSelectionMoving,\n setAngleForG,\n updateForeignObject\n} from '@plait/core';\nimport { Generator, GeneratorExtraData, GeneratorOptions } from '../generators/generator';\nimport { CommonImageItem, canResize, getElementOfFocusedImage } from '../utils';\nimport { ActiveGenerator } from '../generators/active.generator';\nimport { PlaitImageBoard, ImageComponentRef, ImageProps } from './with-image';\n\nexport const FOREIGN_OBJECT_IMAGE_CLASS_NAME = 'foreign-object-image';\n\nexport interface ImageGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getImageItem: (element: T) => CommonImageItem;\n}\n\nexport class ImageGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n GeneratorExtraData,\n ImageGeneratorOptions<T> & GeneratorOptions\n> {\n static key = 'image-generator';\n\n foreignObject!: SVGForeignObjectElement;\n\n imageComponentRef!: ImageComponentRef;\n\n activeGenerator!: ActiveGenerator;\n\n isFocus = false;\n\n element!: T;\n\n constructor(public board: PlaitBoard, public options: ImageGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T): boolean {\n return !!this.options.getImageItem(element);\n }\n\n draw(element: T): SVGGElement {\n this.element = element;\n const g = createG();\n const foreignRectangle = this.options.getRectangle(element);\n this.foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);\n this.foreignObject.classList.add(FOREIGN_OBJECT_IMAGE_CLASS_NAME);\n g.append(this.foreignObject);\n const props: ImageProps = {\n board: this.board,\n imageItem: this.options.getImageItem(element),\n element,\n getRectangle: () => {\n return this.options.getRectangle(element);\n }\n };\n this.imageComponentRef = ((this.board as unknown) as PlaitImageBoard).renderImage(this.foreignObject, props);\n\n this.activeGenerator = new ActiveGenerator(this.board, {\n getStrokeWidth: () => {\n const selectedElements = getSelectedElements(this.board);\n if (!(selectedElements.length === 1 && !isSelectionMoving(this.board))) {\n return ACTIVE_STROKE_WIDTH;\n } else {\n return ACTIVE_STROKE_WIDTH;\n }\n },\n getStrokeOpacity: () => {\n const selectedElements = getSelectedElements(this.board);\n if ((selectedElements.length === 1 && !isSelectionMoving(this.board)) || !selectedElements.length) {\n return 1;\n } else {\n return 0.5;\n }\n },\n getRectangle: () => {\n return this.options.getRectangle(this.element);\n },\n hasResizeHandle: () => {\n const isSelectedImageElement = canResize(this.board, this.element);\n const isSelectedImage = !!getElementOfFocusedImage(this.board);\n return isSelectedImage || isSelectedImageElement;\n }\n });\n return g;\n }\n\n updateImage(nodeG: SVGGElement, previous: T, current: T) {\n this.element = current;\n if (previous !== current && this.imageComponentRef) {\n const props = {\n imageItem: this.options.getImageItem(current),\n element: current,\n getRectangle: () => {\n return this.options.getRectangle(current);\n }\n };\n this.imageComponentRef.update(props);\n }\n const currentForeignObject = this.options.getRectangle(current);\n updateForeignObject(\n this.g!,\n currentForeignObject.width,\n currentForeignObject.height,\n currentForeignObject.x,\n currentForeignObject.y\n );\n if (currentForeignObject && current.angle) {\n setAngleForG(this.g!, RectangleClient.getCenterPoint(currentForeignObject), current.angle);\n }\n const activeG = PlaitBoard.getElementActiveHost(this.board);\n this.activeGenerator.processDrawing(current, activeG, { selected: this.isFocus });\n }\n\n setFocus(element: PlaitElement, isFocus: boolean) {\n this.isFocus = isFocus;\n const activeG = PlaitBoard.getElementActiveHost(this.board);\n this.activeGenerator.processDrawing(element, activeG, { selected: isFocus });\n const props: Partial<ImageProps> = {\n isFocus\n };\n this.imageComponentRef.update(props);\n }\n\n destroy(): void {\n super.destroy();\n this.imageComponentRef?.destroy();\n this.activeGenerator?.destroy();\n }\n}\n","import { Path, PlaitBoard, PlaitElement, Transforms, getSelectedElements } from '@plait/core';\nimport { memorizeLatest } from '../utils';\n\nexport interface SetOptions<T extends PlaitElement = PlaitElement> {\n callback?: (element: T, path: Path) => void;\n getMemorizeKey?: (element: T) => string;\n match?: (element: T) => boolean;\n}\n\nexport const setProperty = <T extends PlaitElement = PlaitElement>(board: PlaitBoard, properties: Partial<T>, options?: SetOptions<T>) => {\n const selectedElements = getSelectedElements(board) as T[];\n selectedElements.forEach(element => {\n if (options?.match && !options?.match(element)) return;\n const path = PlaitBoard.findPath(board, element);\n const memorizeKey = options?.getMemorizeKey ? options?.getMemorizeKey(element) : '';\n for (let key in properties) {\n memorizeKey && memorizeLatest(memorizeKey, key, properties[key]);\n }\n if (options?.callback) {\n options.callback(element, path);\n } else {\n Transforms.setNode(board, properties, path);\n }\n });\n};\n\nconst setStrokeStyle = (board: PlaitBoard, strokeStyle: string, options: SetOptions) => {\n setProperty(board, { strokeStyle }, options);\n};\n\nconst setFillColor = (board: PlaitBoard, fill: string, options: SetOptions) => {\n setProperty(board, { fill }, options);\n};\n\nconst setStrokeColor = (board: PlaitBoard, strokeColor: string, options: SetOptions) => {\n setProperty(board, { strokeColor }, options);\n};\n\nconst setStrokeWidth = (board: PlaitBoard, strokeWidth: number, options: SetOptions) => {\n setProperty(board, { strokeWidth }, options);\n};\n\nexport const PropertyTransforms = {\n setFillColor,\n setStrokeStyle,\n setProperty,\n setStrokeWidth,\n setStrokeColor\n};\n","import {\n MERGING,\n PlaitBoard,\n PlaitElement,\n PlaitGroupElement,\n Point,\n RectangleClient,\n Transforms,\n getElementsInGroup,\n getHighestSelectedElements,\n getRectangleByElements\n} from '@plait/core';\n\nexport const alignTop = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [0, outerRectangle.y - rectangle.y] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignBottom = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [0, outerRectangle.y + outerRectangle.height - (rectangle.y + rectangle.height)] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignLeft = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [outerRectangle.x - rectangle.x, 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignHorizontalCenter = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n const outerCenter = outerRectangle.x + outerRectangle.width / 2;\n const elementCenter = rectangle.x + rectangle.width / 2;\n return [outerCenter - elementCenter, 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignVerticalCenter = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n const outerCenter = outerRectangle.y + outerRectangle.height / 2;\n const elementCenter = rectangle.y + rectangle.height / 2;\n return [0, outerCenter - elementCenter] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignRight = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [outerRectangle.x + outerRectangle.width - (rectangle.x + rectangle.width), 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nfunction setOffset(board: PlaitBoard, getOffset: (outerRectangle: RectangleClient, rectangle: RectangleClient) => Point) {\n const elements = getHighestSelectedElements(board);\n const outerRectangle = getRectangleByElements(board, elements, false);\n elements.forEach(element => {\n if (!element.points && !PlaitGroupElement.isGroup(element)) return;\n const rectangle = board.getRectangle(element)!;\n const offset = getOffset(outerRectangle, rectangle);\n let updateElements: PlaitElement[] = [];\n if (PlaitGroupElement.isGroup(element)) {\n updateElements = getElementsInGroup(board, element, true, false);\n } else if (element.points) {\n updateElements = [element];\n }\n updateElements.forEach(item => {\n const newPoints = item.points!.map(p => [p[0] + offset[0], p[1] + offset[1]]) as Point[];\n const path = PlaitBoard.findPath(board, item);\n Transforms.setNode(\n board,\n {\n points: newPoints\n },\n path\n );\n });\n MERGING.set(board, true);\n });\n MERGING.set(board, false);\n}\n\nexport const distributeHorizontal = (board: PlaitBoard) => {\n distribute(board, true);\n};\n\nexport const distributeVertical = (board: PlaitBoard) => {\n distribute(board, false);\n};\n\nconst distribute = (board: PlaitBoard, isHorizontal: boolean) => {\n const axis = isHorizontal ? 'x' : 'y';\n const side = isHorizontal ? 'width' : 'height';\n const highestSelectedElements = getHighestSelectedElements(board);\n const refs = highestSelectedElements.map(element => {\n return { element, rectangle: board.getRectangle(element)! };\n });\n const outerRectangle = getRectangleByElements(board, highestSelectedElements, false);\n const minRectangleRef = refs.sort((a, b) => a.rectangle[axis] - b.rectangle[axis])[0];\n const maxRectangleRef = refs.sort((a, b) => b.rectangle[axis] + b.rectangle[side] - (a.rectangle[axis] + a.rectangle[side]))[0];\n const minIndex = refs.findIndex(ref => ref === minRectangleRef);\n const maxIndex = refs.findIndex(ref => ref === maxRectangleRef);\n let distributeRefs = refs.filter((element, index) => index !== minIndex && index !== maxIndex);\n const sum = distributeRefs.reduce((accumulator, current) => current.rectangle[side] + accumulator, 0);\n const offset =\n (outerRectangle[side] - minRectangleRef.rectangle[side] - maxRectangleRef.rectangle[side] - sum) / (distributeRefs.length + 1);\n distributeRefs = distributeRefs.sort((a, b) => a.rectangle[axis] - b.rectangle[axis]);\n let position = minRectangleRef.rectangle[axis] + minRectangleRef.rectangle[side] + offset;\n for (let i = 0; i < distributeRefs.length; i++) {\n const rectangle = distributeRefs[i].rectangle;\n const moveOffset = [0, 0];\n const moveAxis = isHorizontal ? 0 : 1;\n moveOffset[moveAxis] = position - rectangle[axis];\n const path = PlaitBoard.findPath(board, distributeRefs[i].element);\n const newPoints = distributeRefs[i].element.points!.map(p => [p[0] + moveOffset[0], p[1] + moveOffset[1]]) as Point[];\n Transforms.setNode(\n board,\n {\n points: newPoints\n },\n path\n );\n MERGING.set(board, true);\n position = position + rectangle[side] + offset;\n }\n MERGING.set(board, false);\n};\n\nexport interface AlignTransform {\n alignTop: (board: PlaitBoard) => void;\n alignHorizontalCenter: (board: PlaitBoard) => void;\n alignBottom: (board: PlaitBoard) => void;\n alignLeft: (board: PlaitBoard) => void;\n alignVerticalCenter: (board: PlaitBoard) => void;\n alignRight: (board: PlaitBoard) => void;\n distributeHorizontal: (board: PlaitBoard) => void;\n distributeVertical: (board: PlaitBoard) => void;\n}\n\nexport const AlignTransform: AlignTransform = {\n alignTop,\n alignHorizontalCenter,\n alignBottom,\n alignLeft,\n alignVerticalCenter,\n alignRight,\n distributeHorizontal,\n distributeVertical\n};\n","import { Point } from '@plait/core';\n\nexport const normalizeShapePoints = (points: [Point, Point], shift: boolean = false): [Point, Point] => {\n let start = points[0];\n let end = points[1];\n if (shift) {\n const width = Math.abs(start[0] - end[0]);\n const height = Math.abs(start[1] - end[1]);\n const edge = Math.max(height, width);\n end = [start[0] + (end[0] > start[0] ? edge : -edge), start[1] + (end[1] > start[1] ? edge : -edge)];\n }\n\n const leftTopPoint: Point = [Math.min(start[0], end[0]), Math.min(start[1], end[1])];\n let rightBottomPoint: Point = [Math.max(start[0], end[0]), Math.max(start[1], end[1])];\n\n return [leftTopPoint, rightBottomPoint];\n};\n","import {\n MERGING,\n PRESS_AND_MOVE_BUFFER,\n PlaitBoard,\n PlaitPointerType,\n Point,\n distanceBetweenPointAndPoint,\n isMainPointer,\n preventTouchMove,\n handleTouchTarget,\n throttleRAF,\n toViewBoxPoint,\n toHostPoint,\n isDragging\n} from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\nimport { addResizing, isResizing, removeResizing } from '../utils/resize';\nimport { PlaitElementOrArray, ResizeOptions, ResizeHitTestRef, ResizeRef, WithResizeOptions } from '../types/resize';\n\nconst generalCanResize = (board: PlaitBoard, event: PointerEvent) => {\n return (\n !PlaitBoard.isReadonly(board) && !PlaitBoard.hasBeenTextEditing(board) && PlaitBoard.isPointer(board, PlaitPointerType.selection)\n );\n};\n\nexport const withResize = <T extends PlaitElementOrArray = PlaitElementOrArray, K = ResizeHandle, P = ResizeOptions>(\n board: PlaitBoard,\n options: WithResizeOptions<T, K, P>\n) => {\n const { pointerDown, pointerMove, globalPointerUp } = board;\n let resizeHitTestRef: ResizeHitTestRef<T, K, P> | null = null;\n let resizeRef: ResizeRef<T, K, P> | null = null;\n let startPoint: Point | null = null;\n let hoverHitTestRef: ResizeHitTestRef<T, K, P> | null = null;\n\n board.pointerDown = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event) || !isMainPointer(event)) {\n pointerDown(event);\n return;\n }\n const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n resizeHitTestRef = options.hitTest(point);\n if (resizeHitTestRef) {\n if (resizeHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${resizeHitTestRef.cursorClass}`);\n }\n startPoint = [event.x, event.y];\n const path = Array.isArray(resizeHitTestRef.element)\n ? resizeHitTestRef.element.map(el => PlaitBoard.findPath(board, el))\n : PlaitBoard.findPath(board, resizeHitTestRef.element);\n resizeRef = {\n path,\n element: resizeHitTestRef.element,\n handle: resizeHitTestRef.handle,\n handleIndex: resizeHitTestRef.handleIndex,\n rectangle: resizeHitTestRef.rectangle,\n options: resizeHitTestRef.options\n };\n preventTouchMove(board, event, true);\n return;\n }\n pointerDown(event);\n };\n\n board.pointerMove = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event)) {\n clearHoverHitTestRef();\n pointerMove(event);\n return;\n }\n if (startPoint && resizeHitTestRef && !isResizing(board)) {\n const endPoint = [event.x, event.y];\n const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n if (distance > PRESS_AND_MOVE_BUFFER) {\n addResizing(board, resizeRef!, options.key);\n MERGING.set(board, true);\n options.beforeResize && options.beforeResize(resizeRef!);\n }\n }\n if (!isResizing(board) && !isDragging(board)) {\n const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n throttleRAF(board, options.key + '-common-resize-hit-test', () => {\n const hitTestRef = options.hitTest(point);\n if (hitTestRef) {\n if (hoverHitTestRef && hitTestRef.cursorClass !== hoverHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoverHitTestRef.cursorClass}`);\n }\n hoverHitTestRef = hitTestRef;\n if (hoverHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${hoverHitTestRef.cursorClass}`);\n }\n } else {\n clearHoverHitTestRef();\n }\n });\n } else {\n if (startPoint && isResizing(board)) {\n event.preventDefault();\n const endPoint = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n throttleRAF(board, 'with-common-resize', () => {\n if (startPoint && resizeRef) {\n handleTouchTarget(board);\n options.onResize(resizeRef, {\n startPoint: toViewBoxPoint(board, toHostPoint(board, startPoint[0], startPoint[1])),\n endPoint,\n isShift: !!event.shiftKey\n });\n }\n });\n return;\n }\n }\n pointerMove(event);\n };\n\n board.globalPointerUp = (event: PointerEvent) => {\n globalPointerUp(event);\n if (isResizing(board) || resizeHitTestRef) {\n options.afterResize && options.afterResize(resizeRef!);\n removeResizing(board, options.key);\n startPoint = null;\n resizeHitTestRef = null;\n resizeRef = null;\n MERGING.set(board, false);\n preventTouchMove(board, event, false);\n }\n };\n\n const clearHoverHitTestRef = () => {\n if (hoverHitTestRef) {\n if (hoverHitTestRef.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoverHitTestRef.cursorClass}`);\n }\n hoverHitTestRef = null;\n }\n };\n\n return board;\n};\n","import { ACTIVE_STROKE_WIDTH, PlaitGroup, RectangleClient, drawRectangle, getRectangleByGroup } from '@plait/core';\nimport { Options } from 'roughjs/bin/core';\nimport { Generator } from './generator';\n\nexport class GroupGenerator extends Generator<PlaitGroup> {\n canDraw(element: PlaitGroup): boolean {\n return true;\n }\n\n draw(element: PlaitGroup, partialSelected: boolean) {\n const options: Options = {\n stroke: '',\n strokeWidth: ACTIVE_STROKE_WIDTH,\n strokeLineDash: [5]\n };\n let rectangle: RectangleClient = { x: 0, y: 0, width: 0, height: 0 };\n if (partialSelected) {\n options.stroke = '#999';\n rectangle = getRectangleByGroup(this.board, element, true);\n }\n return drawRectangle(this.board, rectangle, options);\n }\n}\n","import { PlaitElementRef } from '@plait/core';\nimport { Generator } from '../generators';\n\nexport class PlaitCommonElementRef implements PlaitElementRef {\n private generatorMap = new Map<string, Generator | Object>();\n\n addGenerator<T extends Object = Generator>(key: string, generator: T) {\n this.generatorMap.set(key, generator);\n }\n\n getGenerator<T extends Object = Generator>(key: string) {\n return this.generatorMap.get(key) as T;\n }\n}\n","import { ElementFlavour, PlaitBoard, PlaitElement } from '@plait/core';\nimport { ELEMENT_TO_TEXT_MANAGES } from '../utils/text';\nimport { PlaitCommonElementRef } from './element-ref';\nimport { TextManage } from '../text/text-manage';\n\nexport class CommonElementFlavour<\n T extends PlaitElement = PlaitElement,\n K extends PlaitBoard = PlaitBoard,\n R extends PlaitCommonElementRef = PlaitCommonElementRef\n> extends ElementFlavour<T, K, R> {\n private textManages: TextManage[] = [];\n\n constructor(elementRef = new PlaitCommonElementRef()) {\n super(elementRef as R);\n }\n\n initializeWeakMap() {\n ELEMENT_TO_TEXT_MANAGES.set(this.element, this.textManages);\n }\n\n destroyWeakMap() {\n ELEMENT_TO_TEXT_MANAGES.delete(this.element);\n }\n\n initializeTextManages(textManages: TextManage[]) {\n this.textManages = textManages;\n this.initializeWeakMap();\n }\n\n addTextManage(textManage: TextManage) {\n this.textManages.push(textManage);\n }\n\n destroyTextManages() {\n this.getTextManages().forEach(manage => {\n manage.destroy();\n });\n this.textManages = [];\n this.destroyWeakMap();\n }\n\n getTextManages() {\n return this.textManages;\n }\n}\n","import {\n OnContextChanged,\n PlaitBoard,\n PlaitGroup,\n PlaitPluginElementContext,\n getElementsInGroup,\n getRectangleByGroup,\n isSelectedElementOrGroup,\n isSelectionMoving\n} from '@plait/core';\nimport { GroupGenerator } from '../generators/group.generator';\nimport { ActiveGenerator } from '../generators';\nimport { CommonElementFlavour } from './element-flavour';\nimport { Subscription } from 'rxjs';\n\nexport class GroupComponent extends CommonElementFlavour<PlaitGroup, PlaitBoard> implements OnContextChanged<PlaitGroup, PlaitBoard> {\n onStableSubscription?: Subscription;\n\n constructor() {\n super();\n }\n\n activeGenerator!: ActiveGenerator<PlaitGroup>;\n\n groupGenerator!: GroupGenerator;\n\n initializeGenerator() {\n this.activeGenerator = new ActiveGenerator<PlaitGroup>(this.board, {\n getRectangle: (element: PlaitGroup) => {\n return getRectangleByGroup(this.board, element);\n },\n getStrokeWidth: () => 0,\n getStrokeOpacity: () => 0,\n hasResizeHandle: () => {\n return !isSelectionMoving(this.board);\n }\n });\n this.groupGenerator = new GroupGenerator(this.board);\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGenerator();\n const contextService = PlaitBoard.getBoardContext(this.board);\n this.onStableSubscription = contextService.onStable().subscribe(() => {\n const elementsInGroup = getElementsInGroup(this.board, this.element, false, true);\n const isPartialSelectGroup =\n elementsInGroup.some(item => isSelectedElementOrGroup(this.board, item)) &&\n !elementsInGroup.every(item => isSelectedElementOrGroup(this.board, item));\n this.groupGenerator.processDrawing(this.element, this.getElementG(), isPartialSelectGroup);\n });\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<PlaitGroup, PlaitBoard>,\n previous: PlaitPluginElementContext<PlaitGroup, PlaitBoard>\n ) {}\n\n destroy(): void {\n super.destroy();\n this.onStableSubscription?.unsubscribe();\n }\n}\n","import {\n PlaitBoard,\n PlaitPluginElementContext,\n PlaitGroupElement,\n toViewBoxPoint,\n toHostPoint,\n getHitElementsBySelection,\n createGroupRectangleG,\n ClipboardData,\n getHighestSelectedGroups,\n getSelectedIsolatedElements,\n PlaitElement,\n PlaitGroup,\n getSelectedGroups,\n Selection,\n Point,\n Transforms,\n idCreator,\n getGroupByElement,\n getSelectedIsolatedElementsCanAddToGroup,\n getElementsInGroup,\n getRectangleByGroup,\n PlaitPointerType,\n WritableClipboardOperationType,\n throttleRAF,\n isMovingElements\n} from '@plait/core';\nimport { GroupComponent } from '../core/group.component';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { isResizing } from '../utils';\n\nexport function withGroup(board: PlaitBoard) {\n let groupRectangleG: SVGGElement | null;\n let removeGroups: PlaitGroup[] | null;\n\n const {\n drawElement,\n pointerMove,\n globalPointerUp,\n insertFragment,\n getDeletedFragment,\n deleteFragment,\n getRelatedFragment,\n getRectangle,\n keyDown\n } = board;\n\n board.drawElement = (context: PlaitPluginElementContext) => {\n if (PlaitGroupElement.isGroup(context.element)) {\n return GroupComponent;\n }\n return drawElement(context);\n };\n\n board.pointerMove = (event: PointerEvent) => {\n throttleRAF(board, 'with-group', () => {\n groupRectangleG?.remove();\n const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n let selection: Selection = { anchor: point, focus: point };\n if (board.selection && !Selection.isCollapsed(board.selection)) {\n selection = board.selection;\n }\n const pointer = PlaitBoard.getPointer(board);\n if (!isResizing(board) && !isMovingElements(board) && pointer === PlaitPointerType.selection) {\n const hitElements = getHitElementsBySelection(board, selection);\n if (hitElements.length) {\n groupRectangleG = createGroupRectangleG(board, hitElements);\n groupRectangleG && PlaitBoard.getElementActiveHost(board).append(groupRectangleG);\n }\n }\n });\n pointerMove(event);\n };\n\n board.globalPointerUp = (event: PointerEvent) => {\n groupRectangleG?.remove();\n groupRectangleG = null;\n globalPointerUp(event);\n };\n\n board.getRelatedFragment = (elements: PlaitElement[], originData?: PlaitElement[]) => {\n const groups = getSelectedGroups(board, elements, originData);\n return getRelatedFragment([...elements, ...groups], originData);\n };\n\n board.insertFragment = (clipboardData: ClipboardData | null, targetPoint: Point, operationType?: WritableClipboardOperationType) => {\n let elements: PlaitElement[] = [];\n if (clipboardData?.elements?.length) {\n elements = new Array(clipboardData?.elements?.length);\n const groups = getHighestSelectedGroups(board, clipboardData?.elements);\n const selectedIsolatedElements = getSelectedIsolatedElements(board, clipboardData?.elements);\n selectedIsolatedElements.forEach(item => {\n const index = clipboardData.elements!.map(element => element.id).indexOf(item.id);\n elements.splice(index, 1, !item.groupId ? item : updateGroupId(item, undefined));\n });\n if (groups.length) {\n groups.forEach(item => {\n const index = clipboardData.elements!.map(element => element.id).indexOf(item.id);\n const newGroup = { ...updateGroupId(item, undefined), id: idCreator() };\n elements.splice(index, 1, newGroup);\n updateElementsGroupId(item, clipboardData.elements!, newGroup.id, elements);\n });\n }\n clipboardData.elements = elements;\n }\n insertFragment(clipboardData, targetPoint, operationType);\n const groupElements = elements?.filter(value => PlaitGroupElement.isGroup(value)) as PlaitElement[];\n groupElements.forEach(element => {\n Transforms.insertNode(board, element, [board.children.length]);\n });\n };\n\n board.getDeletedFragment = (data: PlaitElement[]) => {\n removeGroups = getRemoveGroups(board);\n if (removeGroups && removeGroups.length) {\n data.push(...removeGroups);\n }\n return getDeletedFragment(data);\n };\n\n board.deleteFragment = (elements: PlaitElement[]) => {\n if (removeGroups?.length) {\n updateSiblingElementGroupId(board, removeGroups);\n }\n deleteFragment(elements);\n removeGroups = null;\n };\n\n board.getRectangle = (element: PlaitElement) => {\n if (PlaitGroupElement.isGroup(element)) {\n return getRectangleByGroup(board, element, true);\n }\n return getRectangle(element);\n };\n\n board.keyDown = (event: KeyboardEvent) => {\n if (!PlaitBoard.isReadonly(board)) {\n if (isKeyHotkey('mod+g', event)) {\n event.preventDefault();\n Transforms.addGroup(board);\n return;\n }\n if (isKeyHotkey('mod+shift+g', event)) {\n event.preventDefault();\n Transforms.removeGroup(board);\n return;\n }\n }\n keyDown(event);\n };\n\n return board;\n}\n\nconst updateGroupId = (element: PlaitElement, groupId?: string) => {\n return {\n ...element,\n groupId: groupId\n };\n};\n\nconst updateElementsGroupId = (group: PlaitGroup, clipboardDataElements: PlaitElement[], newGroupId: string, elements: PlaitElement[]) => {\n const elementsInGroup = clipboardDataElements.filter(item => item.groupId === group.id);\n if (elementsInGroup.length) {\n elementsInGroup.forEach(item => {\n const index = clipboardDataElements.map(item => item.id).indexOf(item.id);\n if (PlaitGroupElement.isGroup(item)) {\n const newGroup = { ...updateGroupId(item, newGroupId), id: idCreator() };\n elements.splice(index, 1, newGroup);\n updateElementsGroupId(item, clipboardDataElements, newGroup.id, elements);\n } else {\n elements.splice(index, 1, updateGroupId(item, newGroupId));\n }\n });\n }\n return elements;\n};\n\nconst getRemoveGroups = (board: PlaitBoard) => {\n const selectedGroups = board.getRelatedFragment([]) as PlaitGroup[];\n const removeGroups = [...selectedGroups];\n const highestSelectedGroups = getHighestSelectedGroups(board);\n const selectedIsolatedElements = getSelectedIsolatedElementsCanAddToGroup(board);\n const removeNodes = [...highestSelectedGroups, ...selectedIsolatedElements];\n removeNodes.forEach(item => {\n const hitElementGroups = getGroupByElement(board, item, true) as PlaitGroup[];\n if (hitElementGroups.length) {\n const elementsInGroup = getElementsInGroup(board, hitElementGroups[0], false, true);\n const siblingElements = elementsInGroup.filter(\n element => ![...removeNodes, ...removeGroups].map(item => item.id).includes(element.id)\n );\n if (siblingElements.length === 1 || siblingElements.length === 0) {\n if (!removeGroups.includes(hitElementGroups[0])) {\n removeGroups.push(hitElementGroups[0]);\n }\n if (siblingElements.length === 1) {\n if (hitElementGroups.length > 1) {\n const aboveGroup = findAboveGroupWithAnotherElement(board, hitElementGroups.slice(1, hitElementGroups.length), [\n ...removeNodes,\n ...removeGroups\n ]);\n let index = hitElementGroups.length;\n if (aboveGroup) {\n index = hitElementGroups.findIndex(item => item.id === aboveGroup.id);\n }\n [...hitElementGroups.slice(1, index)].forEach(item => {\n if (!removeGroups.includes(item)) {\n removeGroups.push(item);\n }\n });\n }\n }\n }\n }\n });\n return removeGroups;\n};\n\nconst findAboveGroupWithAnotherElement = (board: PlaitBoard, groups: PlaitGroup[], excludeNodes: PlaitElement[]) => {\n let group: PlaitGroup | null = null;\n for (let i = 0; i < groups.length; i++) {\n const elementsInGroup = getElementsInGroup(board, groups[i], false, true);\n const siblingElements = elementsInGroup.filter(element => !excludeNodes.map(item => item.id).includes(element.id));\n if (siblingElements.length > 0) {\n group = groups[i];\n break;\n }\n }\n return group;\n};\n\nconst updateSiblingElementGroupId = (board: PlaitBoard, removeGroups: PlaitGroup[]) => {\n const selectedIsolatedElements = getSelectedIsolatedElementsCanAddToGroup(board);\n const highestSelectedGroups = getHighestSelectedGroups(board);\n const isolatedElementsInGroup = selectedIsolatedElements.filter(item => item.groupId);\n [...highestSelectedGroups, ...isolatedElementsInGroup].forEach(item => {\n const hitElementGroups = getGroupByElement(board, item, true) as PlaitGroup[];\n if (hitElementGroups.length) {\n const elementsInGroup = getElementsInGroup(board, hitElementGroups[0], false, true);\n const siblingElements = elementsInGroup.filter(element => element.id !== item.id);\n if (siblingElements.length === 1) {\n const removeGroupIds = removeGroups.map(item => item.id);\n if (hitElementGroups.some(group => removeGroupIds.includes(group.id))) {\n const group = hitElementGroups.find(group => !removeGroupIds.includes(group.id));\n const path = PlaitBoard.findPath(board, siblingElements[0]);\n Transforms.setNode(board, { groupId: group?.id || undefined }, path);\n }\n }\n }\n });\n};\n","import { PlaitBoard, PlaitElement } from '@plait/core';\n\nexport abstract class ImageBaseComponent {\n _isFocus!: boolean;\n\n element!: PlaitElement;\n\n board!: PlaitBoard;\n\n set isFocus(value: boolean) {\n this._isFocus = value;\n }\n\n get isFocus() {\n return this._isFocus;\n }\n\n abstract nativeElement(): HTMLElement;\n}\n","import { Node } from 'slate';\nimport { CustomText, ParagraphElement } from './types';\nimport { getLineHeightByFontSize } from '../utils/text';\n\nexport function measureElement(\n element: ParagraphElement,\n options: {\n fontSize: number;\n fontFamily: string;\n },\n containerMaxWidth: number = 10000\n) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n const textEntries = Node.texts(element);\n const lines: CustomText[][] = [[]];\n for (const textEntry of textEntries) {\n const [text] = textEntry;\n const textString = Node.string(text);\n const textArray = textString.split('\\n');\n textArray.forEach((segmentTextString: string, index: number) => {\n const segmentText = { ...text, text: segmentTextString };\n if (index === 0) {\n const currentLine = lines[lines.length - 1];\n currentLine.push(segmentText);\n } else {\n const newLine: CustomText[] = [];\n newLine.push(segmentText);\n lines.push(newLine);\n }\n });\n }\n let width = 0;\n let height = 0;\n lines.forEach((lineTexts: CustomText[], index: number) => {\n let lineWidth = 0;\n let maxLineHeight = getLineHeightByFontSize(options.fontSize);\n lineTexts.forEach((text: CustomText, index: number) => {\n const font = getFont(text, { fontFamily: options.fontFamily, fontSize: options.fontSize });\n ctx.font = font;\n const textMetrics = ctx.measureText(text.text);\n lineWidth += textMetrics.width;\n const isLast = index === lineTexts.length - 1;\n // skip when text is empty and is not last text of line\n if (text['font-size'] && (isLast || text.text !== '')) {\n const lineHeight = getLineHeightByFontSize(parseFloat(text['font-size']));\n if (lineHeight > maxLineHeight) {\n maxLineHeight = lineHeight;\n }\n }\n });\n if (lineWidth <= containerMaxWidth) {\n if (lineWidth > width) {\n width = lineWidth;\n }\n height += maxLineHeight;\n } else {\n width = containerMaxWidth;\n const lineWrapNumber = Math.ceil(lineWidth / containerMaxWidth);\n height += maxLineHeight * lineWrapNumber;\n }\n });\n return { width, height };\n}\n\nconst getFont = (\n text: CustomText,\n options: {\n fontSize: number;\n fontFamily: string;\n }\n) => {\n return `${text.italic ? 'italic ' : ''} ${text.bold ? 'bold ' : ''} ${text['font-size'] || options.fontSize}px ${options.fontFamily} `;\n};\n","import {\n IS_TEXT_EDITABLE,\n MERGING,\n PlaitBoard,\n Point,\n RectangleClient,\n createForeignObject,\n createG,\n debounce,\n setAngleForG,\n toHostPoint,\n toViewBoxPoint,\n updateForeignObject,\n updateForeignObjectWidth\n} from '@plait/core';\nimport { fromEvent, timer } from 'rxjs';\nimport { Editor, Element, NodeEntry, Range, Text, Node, Transforms, Operation } from 'slate';\nimport { PlaitTextBoard, TextPlugin } from './with-text';\nimport { measureElement } from './text-measure';\nimport { TextChangeData, TextComponentRef, TextProps } from './with-text';\n\nexport interface TextManageChangeData {\n newText?: Element;\n operations?: Operation[];\n width: number;\n height: number;\n}\n\nexport class TextManage {\n isEditing = false;\n\n editor!: Editor;\n\n g!: SVGGElement;\n\n foreignObject!: SVGForeignObjectElement;\n\n textComponentRef!: TextComponentRef;\n\n exitCallback?: () => void;\n\n constructor(\n private board: PlaitBoard,\n private options: {\n getRectangle: () => RectangleClient;\n onChange?: (data: TextManageChangeData) => void;\n getRenderRectangle?: () => RectangleClient;\n getMaxWidth?: () => number;\n textPlugins?: TextPlugin[];\n }\n ) {\n if (!this.options.getMaxWidth) {\n this.options.getMaxWidth = () => 999;\n }\n }\n\n draw(text: Element) {\n const _rectangle = this.options.getRectangle();\n this.g = createG();\n this.foreignObject = createForeignObject(_rectangle.x, _rectangle.y, _rectangle.width, _rectangle.height);\n this.g.append(this.foreignObject);\n this.g.classList.add('text');\n const props: TextProps = {\n board: this.board,\n text,\n textPlugins: this.options.textPlugins,\n onChange: (data: TextChangeData) => {\n if (data.operations.some(op => !Operation.isSelectionOperation(op))) {\n const { width: newWidth, height: newHeight } = this.getSize();\n this.options.onChange && this.options.onChange({ ...data, width: newWidth, height: newHeight });\n MERGING.set(this.board, true);\n }\n },\n afterInit: (editor: Editor) => {\n this.editor = editor;\n },\n onComposition: (event: CompositionEvent) => {\n if (event.type === 'compositionend') {\n return;\n }\n const fakeRoot = buildCompositionData(this.editor, event.data);\n if (fakeRoot) {\n const sizeData = this.getSize(fakeRoot.children[0]);\n // invoking onChange asap to avoid blinking on typing chinese\n this.options.onChange && this.options.onChange({ ...sizeData });\n MERGING.set(this.board, true);\n }\n }\n };\n this.textComponentRef = ((this.board as unknown) as PlaitTextBoard).renderText(this.foreignObject, props);\n }\n\n updateRectangleWidth(width: number) {\n updateForeignObjectWidth(this.g, width);\n }\n\n updateAngle(centerPoint: Point, angle: number = 0) {\n setAngleForG(this.g, centerPoint, angle);\n }\n\n updateRectangle(rectangle?: RectangleClient) {\n const { x, y, width, height } = rectangle || this.options.getRectangle();\n updateForeignObject(this.g, width, height, x, y);\n }\n\n updateText(newText: Element) {\n const props = {\n text: newText\n };\n this.textComponentRef.update(props);\n }\n\n edit(callback?: () => void, exitEdit?: (event: Event) => boolean) {\n this.isEditing = true;\n IS_TEXT_EDITABLE.set(this.board, true);\n const props: Partial<TextProps> = {\n readonly: false\n };\n this.textComponentRef.update(props);\n Transforms.select(this.editor, [0]);\n const mousedown$ = fromEvent<MouseEvent>(document, 'mousedown').subscribe((event: MouseEvent) => {\n const point = toViewBoxPoint(this.board, toHostPoint(this.board, event.x, event.y));\n const textRec = this.options.getRenderRectangle ? this.options.getRenderRectangle() : this.options.getRectangle();\n const clickInText = RectangleClient.isHit(RectangleClient.getRectangleByPoints([point, point]), textRec);\n const isAttached = (event.target as HTMLElement).closest('.plait-board-attached');\n if (!clickInText && !isAttached) {\n // handle composition input state, like: Chinese IME Composition Input\n timer(0).subscribe(() => {\n exitCallback();\n });\n }\n });\n const keydown$ = fromEvent<KeyboardEvent>(document, 'keydown').subscribe((event: KeyboardEvent) => {\n if (event.isComposing) {\n return;\n }\n if (event.key === 'Escape' || event.key === 'Tab' || (exitEdit ? exitEdit(event) : false)) {\n event.preventDefault();\n event.stopPropagation();\n exitCallback();\n return;\n }\n });\n const exitCallback = () => {\n if (this.isEditing) {\n this.updateRectangle();\n mousedown$.unsubscribe();\n keydown$.unsubscribe();\n IS_TEXT_EDITABLE.set(this.board, false);\n MERGING.set(this.board, false);\n callback && callback();\n const props = {\n readonly: true\n };\n this.textComponentRef.update(props);\n this.isEditing = false;\n this.exitCallback = undefined;\n }\n };\n this.exitCallback = exitCallback;\n return exitCallback;\n }\n\n getSize = (element?: Element, maxWidth?: number) => {\n const computedStyle = window.getComputedStyle(this.foreignObject.children[0]);\n const fontFamily = computedStyle.fontFamily;\n const fontSize = parseFloat(computedStyle.fontSize);\n const target = element || (this.editor.children[0] as Element);\n return measureElement(\n target,\n {\n fontSize: fontSize,\n fontFamily\n },\n maxWidth || this.options.getMaxWidth!()\n );\n };\n\n getText = () => {\n return this.editor.children[0];\n };\n\n destroy() {\n this.g?.remove();\n this.textComponentRef?.destroy();\n this.exitCallback && this.exitCallback();\n }\n}\n\nexport const buildCompositionData = (editor: Editor, data: string) => {\n if (editor.selection && Range.isCollapsed(editor.selection)) {\n const [textNode, textPath] = Editor.node(editor, editor.selection) as NodeEntry<Text>;\n const offset = editor.selection.anchor.offset;\n const clonedElement = JSON.parse(JSON.stringify(editor.children[0]));\n const root = { children: [clonedElement] };\n const newTextString = textNode.text.slice(0, offset + 1) + data + textNode.text.slice(offset + 1);\n const clonedTextNode = Node.get(root, textPath) as Text;\n clonedTextNode.text = newTextString;\n return root;\n }\n return null;\n};\n","import { PlaitBoard, WithPluginOptions } from '@plait/core';\nimport { Editor, Operation, Element as SlateElement } from 'slate';\nimport { RenderComponentRef } from '../core/render-component';\n\nexport interface PlaitTextBoard {\n renderText: (container: Element | DocumentFragment, props: TextProps) => TextComponentRef;\n}\n\nexport const withText = <T extends PlaitBoard = PlaitBoard>(board: T) => {\n const newBoard = board as T & PlaitTextBoard;\n\n newBoard.renderText = (container: Element | DocumentFragment, props: TextProps) => {\n throw new Error('No implementation for renderText method.');\n };\n return newBoard;\n};\n\nexport type TextComponentRef = RenderComponentRef<TextProps>;\n\nexport interface TextProps {\n board: PlaitBoard;\n text: SlateElement;\n textPlugins?: TextPlugin[];\n readonly?: boolean;\n onChange?: (data: TextChangeData) => void;\n afterInit?: (data: Editor) => void;\n onComposition?: (data: CompositionEvent) => void;\n}\n\nexport type TextChangeData = { newText: SlateElement; operations: Operation[] };\n\nexport interface WithTextPluginOptions extends WithPluginOptions {\n textPlugins?: TextPlugin[];\n}\n\nexport type TextPlugin = (editor: Editor) => Editor;\n","import { BaseElement, Editor } from 'slate';\n\nexport enum Alignment {\n left = 'left',\n center = 'center',\n right = 'right'\n}\n\nexport type CustomText = {\n bold?: boolean;\n italic?: boolean;\n strike?: boolean;\n code?: boolean;\n text: string;\n underlined?: boolean;\n color?: string;\n [`font-size`]?: string;\n};\n\nexport interface LinkElement extends BaseElement {\n type: 'link';\n url: string;\n}\n\nexport interface ParagraphElement extends BaseElement {\n align?: Alignment;\n}\n\nexport type CustomElement = ParagraphElement | LinkElement;\n","import { PlaitBoard, PlaitElement, RectangleClient } from '@plait/core';\nimport { RenderComponentRef } from '../core/render-component';\nimport { CommonImageItem } from '../utils/image';\n\nexport interface PlaitImageBoard {\n renderImage: (container: Element | DocumentFragment, props: ImageProps) => ImageComponentRef;\n}\n\nexport const withImage = <T extends PlaitBoard = PlaitBoard>(board: T) => {\n const newBoard = board as T & PlaitImageBoard;\n\n newBoard.renderImage = (container: Element | DocumentFragment, props: ImageProps) => {\n throw new Error('No implementation for renderImage method.');\n };\n return newBoard;\n};\n\nexport type ImageComponentRef = RenderComponentRef<ImageProps>;\n\nexport interface ImageProps {\n board: PlaitBoard;\n imageItem: CommonImageItem;\n element: PlaitElement;\n isFocus?: boolean;\n getRectangle: () => RectangleClient;\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './constants';\nexport * from './generators';\nexport * from './transforms';\nexport * from './shapes';\nexport * from './plugins';\nexport * from './utils';\nexport * from './image/image-base.component';\nexport * from './core';\nexport * from './algorithms';\nexport * from './text';\nexport * from './image';\nexport * from './types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Transforms"],"mappings":"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"}
|