@plait/mind 0.77.2 → 0.78.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/fesm2022/plait-mind.mjs +2 -2
  2. package/fesm2022/plait-mind.mjs.map +1 -1
  3. package/package.json +1 -3
  4. package/esm2022/constants/abstract-node.mjs +0 -5
  5. package/esm2022/constants/default.mjs +0 -17
  6. package/esm2022/constants/index.mjs +0 -5
  7. package/esm2022/constants/node-style.mjs +0 -19
  8. package/esm2022/constants/node-topic-style.mjs +0 -7
  9. package/esm2022/constants/theme.mjs +0 -73
  10. package/esm2022/emoji/emoji-base.component.mjs +0 -6
  11. package/esm2022/emoji/index.mjs +0 -3
  12. package/esm2022/emoji/with-emoji.mjs +0 -8
  13. package/esm2022/generators/node-active.generator.mjs +0 -46
  14. package/esm2022/generators/node-collapse.generator.mjs +0 -108
  15. package/esm2022/generators/node-emojis.generator.mjs +0 -63
  16. package/esm2022/generators/node-plus.generator.mjs +0 -100
  17. package/esm2022/generators/node-shape.generator.mjs +0 -22
  18. package/esm2022/interfaces/element-data.mjs +0 -2
  19. package/esm2022/interfaces/element.mjs +0 -103
  20. package/esm2022/interfaces/index.mjs +0 -8
  21. package/esm2022/interfaces/layout.mjs +0 -19
  22. package/esm2022/interfaces/node.mjs +0 -14
  23. package/esm2022/interfaces/options.mjs +0 -2
  24. package/esm2022/interfaces/pointer.mjs +0 -5
  25. package/esm2022/interfaces/theme-color.mjs +0 -57
  26. package/esm2022/interfaces/types.mjs +0 -13
  27. package/esm2022/mind-node.component.mjs +0 -193
  28. package/esm2022/mind.component.mjs +0 -34
  29. package/esm2022/plait-mind.mjs +0 -5
  30. package/esm2022/plugins/with-abstract-resize.board.mjs +0 -12
  31. package/esm2022/plugins/with-abstract-resize.mjs +0 -112
  32. package/esm2022/plugins/with-mind-create.mjs +0 -104
  33. package/esm2022/plugins/with-mind-extend.mjs +0 -7
  34. package/esm2022/plugins/with-mind-fragment.mjs +0 -101
  35. package/esm2022/plugins/with-mind-hotkey.mjs +0 -62
  36. package/esm2022/plugins/with-mind.board.mjs +0 -2
  37. package/esm2022/plugins/with-mind.mjs +0 -148
  38. package/esm2022/plugins/with-node-dnd.mjs +0 -176
  39. package/esm2022/plugins/with-node-hover-hit-test.mjs +0 -23
  40. package/esm2022/plugins/with-node-image-resize.mjs +0 -46
  41. package/esm2022/plugins/with-node-image.mjs +0 -113
  42. package/esm2022/plugins/with-node-resize.mjs +0 -69
  43. package/esm2022/public-api.mjs +0 -16
  44. package/esm2022/queries/get-available-sublayouts-by-element.mjs +0 -23
  45. package/esm2022/queries/get-branch-layouts.mjs +0 -18
  46. package/esm2022/queries/get-correct-layout-by-element.mjs +0 -48
  47. package/esm2022/queries/get-layout-by-element.mjs +0 -18
  48. package/esm2022/queries/index.mjs +0 -11
  49. package/esm2022/transforms/abstract-node.mjs +0 -73
  50. package/esm2022/transforms/emoji.mjs +0 -41
  51. package/esm2022/transforms/image.mjs +0 -31
  52. package/esm2022/transforms/index.mjs +0 -30
  53. package/esm2022/transforms/layout.mjs +0 -19
  54. package/esm2022/transforms/node.mjs +0 -99
  55. package/esm2022/transforms/property.mjs +0 -34
  56. package/esm2022/utils/abstract/common.mjs +0 -170
  57. package/esm2022/utils/abstract/resize.mjs +0 -194
  58. package/esm2022/utils/clipboard.mjs +0 -108
  59. package/esm2022/utils/common.mjs +0 -26
  60. package/esm2022/utils/dnd/common.mjs +0 -59
  61. package/esm2022/utils/dnd/detector.mjs +0 -176
  62. package/esm2022/utils/draw/abstract-outline.mjs +0 -118
  63. package/esm2022/utils/draw/node-dnd.mjs +0 -164
  64. package/esm2022/utils/draw/node-link/abstract-link.mjs +0 -60
  65. package/esm2022/utils/draw/node-link/draw-link.mjs +0 -9
  66. package/esm2022/utils/draw/node-link/indented-link.mjs +0 -46
  67. package/esm2022/utils/draw/node-link/logic-link.mjs +0 -76
  68. package/esm2022/utils/draw/node-shape.mjs +0 -26
  69. package/esm2022/utils/index.mjs +0 -17
  70. package/esm2022/utils/layout.mjs +0 -105
  71. package/esm2022/utils/mind.mjs +0 -98
  72. package/esm2022/utils/node/adjust-node.mjs +0 -36
  73. package/esm2022/utils/node/common.mjs +0 -15
  74. package/esm2022/utils/node/create-node.mjs +0 -46
  75. package/esm2022/utils/node/dynamic-width.mjs +0 -14
  76. package/esm2022/utils/node/image.mjs +0 -15
  77. package/esm2022/utils/node/index.mjs +0 -6
  78. package/esm2022/utils/node/right-node-count.mjs +0 -45
  79. package/esm2022/utils/node-hover/extend.mjs +0 -50
  80. package/esm2022/utils/node-style/branch.mjs +0 -63
  81. package/esm2022/utils/node-style/common.mjs +0 -4
  82. package/esm2022/utils/node-style/index.mjs +0 -4
  83. package/esm2022/utils/node-style/shape.mjs +0 -37
  84. package/esm2022/utils/normalize.mjs +0 -40
  85. package/esm2022/utils/path.mjs +0 -12
  86. package/esm2022/utils/point-placement.mjs +0 -119
  87. package/esm2022/utils/position/emoji.mjs +0 -31
  88. package/esm2022/utils/position/image.mjs +0 -36
  89. package/esm2022/utils/position/index.mjs +0 -5
  90. package/esm2022/utils/position/node.mjs +0 -36
  91. package/esm2022/utils/position/topic.mjs +0 -16
  92. package/esm2022/utils/space/emoji.mjs +0 -20
  93. package/esm2022/utils/space/index.mjs +0 -4
  94. package/esm2022/utils/space/layout-options.mjs +0 -69
  95. package/esm2022/utils/space/node-space.mjs +0 -134
  96. package/esm2022/utils/weak-maps.mjs +0 -2
@@ -1,176 +0,0 @@
1
- import { MindElement, PlaitMind } from '../../interfaces/element';
2
- import { PlaitBoard, depthFirstRecursion, Path, getIsRecursionFunc } from '@plait/core';
3
- import { getRectangleByNode } from '../position/node';
4
- import { MindQueries } from '../../queries';
5
- import { getRootLayout } from '../layout';
6
- import { MindLayoutType, getNonAbstractChildren, isHorizontalLogicLayout, isIndentedLayout, isStandardLayout, isTopLayout, isVerticalLogicLayout } from '@plait/layouts';
7
- import { isBottomLayout, isRightLayout, isLeftLayout, AbstractNode } from '@plait/layouts';
8
- import { isChildElement } from '../mind';
9
- export const directionCorrector = (board, node, detectResults) => {
10
- if (!node.origin.isRoot && !AbstractNode.isAbstract(node.origin)) {
11
- const parentLayout = MindQueries.getCorrectLayoutByElement(board, node?.parent.origin);
12
- if (isStandardLayout(parentLayout)) {
13
- const idx = node.parent.children.findIndex(x => x === node);
14
- const isLeft = idx >= (node.parent.origin.rightNodeCount || 0);
15
- return getAllowedDirection(detectResults, [isLeft ? 'right' : 'left']);
16
- }
17
- if (isLeftLayout(parentLayout)) {
18
- return getAllowedDirection(detectResults, ['right']);
19
- }
20
- if (isRightLayout(parentLayout)) {
21
- return getAllowedDirection(detectResults, ['left']);
22
- }
23
- if (parentLayout === MindLayoutType.upward) {
24
- return getAllowedDirection(detectResults, ['bottom']);
25
- }
26
- if (parentLayout === MindLayoutType.downward) {
27
- return getAllowedDirection(detectResults, ['top']);
28
- }
29
- }
30
- else {
31
- const layout = MindQueries.getCorrectLayoutByElement(board, node?.origin);
32
- if (isStandardLayout(layout)) {
33
- return getAllowedDirection(detectResults, ['top', 'bottom']);
34
- }
35
- if (layout === MindLayoutType.upward) {
36
- return getAllowedDirection(detectResults, ['left', 'right', 'bottom']);
37
- }
38
- if (layout === MindLayoutType.downward) {
39
- return getAllowedDirection(detectResults, ['left', 'right', 'top']);
40
- }
41
- if (isLeftLayout(layout)) {
42
- return getAllowedDirection(detectResults, ['right', 'top', 'bottom']);
43
- }
44
- if (isRightLayout(layout)) {
45
- return getAllowedDirection(detectResults, ['left', 'top', 'bottom']);
46
- }
47
- }
48
- return null;
49
- };
50
- export const getAllowedDirection = (detectResults, illegalDirections) => {
51
- const directions = detectResults;
52
- illegalDirections.forEach(item => {
53
- const bottomDirectionIndex = directions.findIndex(direction => direction === item);
54
- if (bottomDirectionIndex !== -1) {
55
- directions.splice(bottomDirectionIndex, 1);
56
- }
57
- });
58
- return directions.length ? directions : null;
59
- };
60
- export const detectDropTarget = (board, detectPoint, dropTarget, activeElements) => {
61
- let detectResult = null;
62
- depthFirstRecursion(board, element => {
63
- if (!MindElement.isMindElement(board, element) || detectResult) {
64
- return;
65
- }
66
- const node = MindElement.getNode(element);
67
- const directions = directionDetector(node, detectPoint);
68
- if (directions) {
69
- detectResult = directionCorrector(board, node, directions);
70
- }
71
- dropTarget = null;
72
- const isValid = activeElements.every(element => isValidTarget(element, node.origin));
73
- if (detectResult && isValid) {
74
- dropTarget = { target: node.origin, detectResult: detectResult[0] };
75
- }
76
- }, getIsRecursionFunc(board));
77
- return dropTarget;
78
- };
79
- export const directionDetector = (targetNode, centerPoint) => {
80
- const { x, y, width, height } = getRectangleByNode(targetNode);
81
- const yCenter = y + height / 2;
82
- const xCenter = x + width / 2;
83
- const top = targetNode.y;
84
- const bottom = targetNode.y + targetNode.height;
85
- const left = targetNode.x;
86
- const right = targetNode.x + targetNode.width;
87
- const direction = [];
88
- // x-axis
89
- if (centerPoint[1] > y && centerPoint[1] < y + height) {
90
- if (centerPoint[0] > left && centerPoint[0] < xCenter) {
91
- direction.push('left');
92
- }
93
- if (centerPoint[0] > xCenter && centerPoint[0] < right) {
94
- direction.push('right');
95
- }
96
- // Overlapping area, return in both directions
97
- if ((centerPoint[0] > x && centerPoint[0] < xCenter) || (centerPoint[0] > xCenter && centerPoint[0] < x + width)) {
98
- if (centerPoint[1] < yCenter) {
99
- direction.push('top');
100
- }
101
- else {
102
- direction.push('bottom');
103
- }
104
- }
105
- return direction.length ? direction : null;
106
- }
107
- // y-axis
108
- if (centerPoint[0] > x && centerPoint[0] < x + width) {
109
- if (centerPoint[1] > top && centerPoint[1] < yCenter) {
110
- direction.push('top');
111
- }
112
- if (centerPoint[1] > yCenter && centerPoint[1] < bottom) {
113
- direction.push('bottom');
114
- }
115
- if ((centerPoint[1] > y && centerPoint[1] < y + height) || (centerPoint[1] > yCenter && centerPoint[1] < y + height)) {
116
- if (centerPoint[0] < xCenter) {
117
- direction.push('left');
118
- }
119
- else {
120
- direction.push('right');
121
- }
122
- }
123
- return direction.length ? direction : null;
124
- }
125
- return null;
126
- };
127
- export const isValidTarget = (origin, target) => {
128
- return origin !== target && !isChildElement(origin, target);
129
- };
130
- export const getPathByDropTarget = (board, dropTarget) => {
131
- let targetPath = PlaitBoard.findPath(board, dropTarget?.target);
132
- const layout = PlaitMind.isMind(dropTarget?.target)
133
- ? getRootLayout(dropTarget?.target)
134
- : MindQueries.getCorrectLayoutByElement(board, MindElement.getParent(dropTarget?.target));
135
- const children = getNonAbstractChildren(dropTarget.target);
136
- if (isVerticalLogicLayout(layout)) {
137
- if (dropTarget.detectResult === 'top' || dropTarget.detectResult === 'bottom') {
138
- targetPath.push(children.length);
139
- }
140
- if (dropTarget.detectResult === 'right') {
141
- targetPath = Path.next(targetPath);
142
- }
143
- }
144
- if (isHorizontalLogicLayout(layout)) {
145
- if (dropTarget.detectResult === 'right') {
146
- if (PlaitMind.isMind(dropTarget?.target) && isStandardLayout(layout)) {
147
- targetPath.push(dropTarget?.target.rightNodeCount);
148
- }
149
- else {
150
- targetPath.push(children.length);
151
- }
152
- }
153
- if (dropTarget.detectResult === 'left') {
154
- targetPath.push(children.length);
155
- }
156
- if (dropTarget.detectResult === 'bottom') {
157
- targetPath = Path.next(targetPath);
158
- }
159
- }
160
- if (isIndentedLayout(layout)) {
161
- if (isTopLayout(layout) && dropTarget.detectResult === 'top') {
162
- targetPath = Path.next(targetPath);
163
- }
164
- if (isBottomLayout(layout) && dropTarget.detectResult === 'bottom') {
165
- targetPath = Path.next(targetPath);
166
- }
167
- if (isLeftLayout(layout) && dropTarget.detectResult === 'left') {
168
- targetPath.push(children.length);
169
- }
170
- if (isRightLayout(layout) && dropTarget.detectResult === 'right') {
171
- targetPath.push(children.length);
172
- }
173
- }
174
- return targetPath;
175
- };
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9kbmQvZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFTLG1CQUFtQixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUvRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUNILGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLHFCQUFxQixFQUN4QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBaUIsRUFBRSxJQUFjLEVBQUUsYUFBNkIsRUFBeUIsRUFBRTtJQUMxSCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFxQixDQUFDLENBQUM7UUFDdEcs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Q0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzQixJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNELFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pFLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQy9ELFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkLCBQb2ludCwgZGVwdGhGaXJzdFJlY3Vyc2lvbiwgUGF0aCwgZ2V0SXNSZWN1cnNpb25GdW5jIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgRGV0ZWN0UmVzdWx0LCBNaW5kTm9kZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi9wb3NpdGlvbi9ub2RlJztcbmltcG9ydCB7IE1pbmRRdWVyaWVzIH0gZnJvbSAnLi4vLi4vcXVlcmllcyc7XG5pbXBvcnQgeyBnZXRSb290TGF5b3V0IH0gZnJvbSAnLi4vbGF5b3V0JztcbmltcG9ydCB7XG4gICAgTWluZExheW91dFR5cGUsXG4gICAgZ2V0Tm9uQWJzdHJhY3RDaGlsZHJlbixcbiAgICBpc0hvcml6b250YWxMb2dpY0xheW91dCxcbiAgICBpc0luZGVudGVkTGF5b3V0LFxuICAgIGlzU3RhbmRhcmRMYXlvdXQsXG4gICAgaXNUb3BMYXlvdXQsXG4gICAgaXNWZXJ0aWNhbExvZ2ljTGF5b3V0XG59IGZyb20gJ0BwbGFpdC9sYXlvdXRzJztcbmltcG9ydCB7IGlzQm90dG9tTGF5b3V0LCBpc1JpZ2h0TGF5b3V0LCBpc0xlZnRMYXlvdXQsIEFic3RyYWN0Tm9kZSB9IGZyb20gJ0BwbGFpdC9sYXlvdXRzJztcbmltcG9ydCB7IGlzQ2hpbGRFbGVtZW50IH0gZnJvbSAnLi4vbWluZCc7XG5cbmV4cG9ydCBjb25zdCBkaXJlY3Rpb25Db3JyZWN0b3IgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIG5vZGU6IE1pbmROb2RlLCBkZXRlY3RSZXN1bHRzOiBEZXRlY3RSZXN1bHRbXSk6IERldGVjdFJlc3VsdFtdIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFub2RlLm9yaWdpbi5pc1Jvb3QgJiYgIUFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KG5vZGUub3JpZ2luKSkge1xuICAgICAgICBjb25zdCBwYXJlbnRMYXlvdXQgPSBNaW5kUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KGJvYXJkLCBub2RlPy5wYXJlbnQub3JpZ2luIGFzIE1pbmRFbGVtZW50KTtcbiAgICAgICAgaWYgKGlzU3RhbmRhcmRMYXlvdXQocGFyZW50TGF5b3V0KSkge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gbm9kZS5wYXJlbnQuY2hpbGRyZW4uZmluZEluZGV4KHggPT4geCA9PT0gbm9kZSk7XG4gICAgICAgICAgICBjb25zdCBpc0xlZnQgPSBpZHggPj0gKG5vZGUucGFyZW50Lm9yaWdpbi5yaWdodE5vZGVDb3VudCB8fCAwKTtcbiAgICAgICAgICAgIHJldHVybiBnZXRBbGxvd2VkRGlyZWN0aW9uKGRldGVjdFJlc3VsdHMsIFtpc0xlZnQgPyAncmlnaHQnIDogJ2xlZnQnXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNMZWZ0TGF5b3V0KHBhcmVudExheW91dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBbGxvd2VkRGlyZWN0aW9uKGRldGVjdFJlc3VsdHMsIFsncmlnaHQnXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNSaWdodExheW91dChwYXJlbnRMYXlvdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QWxsb3dlZERpcmVjdGlvbihkZXRlY3RSZXN1bHRzLCBbJ2xlZnQnXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyZW50TGF5b3V0ID09PSBNaW5kTGF5b3V0VHlwZS51cHdhcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBbGxvd2VkRGlyZWN0aW9uKGRldGVjdFJlc3VsdHMsIFsnYm90dG9tJ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudExheW91dCA9PT0gTWluZExheW91dFR5cGUuZG93bndhcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBbGxvd2VkRGlyZWN0aW9uKGRldGVjdFJlc3VsdHMsIFsndG9wJ10pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gTWluZFF1ZXJpZXMuZ2V0Q29ycmVjdExheW91dEJ5RWxlbWVudChib2FyZCwgbm9kZT8ub3JpZ2luIGFzIE1pbmRFbGVtZW50KTtcbiAgICAgICAgaWYgKGlzU3RhbmRhcmRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEFsbG93ZWREaXJlY3Rpb24oZGV0ZWN0UmVzdWx0cywgWyd0b3AnLCAnYm90dG9tJ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheW91dCA9PT0gTWluZExheW91dFR5cGUudXB3YXJkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QWxsb3dlZERpcmVjdGlvbihkZXRlY3RSZXN1bHRzLCBbJ2xlZnQnLCAncmlnaHQnLCAnYm90dG9tJ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheW91dCA9PT0gTWluZExheW91dFR5cGUuZG93bndhcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBbGxvd2VkRGlyZWN0aW9uKGRldGVjdFJlc3VsdHMsIFsnbGVmdCcsICdyaWdodCcsICd0b3AnXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNMZWZ0TGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBbGxvd2VkRGlyZWN0aW9uKGRldGVjdFJlc3VsdHMsIFsncmlnaHQnLCAndG9wJywgJ2JvdHRvbSddKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JpZ2h0TGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBbGxvd2VkRGlyZWN0aW9uKGRldGVjdFJlc3VsdHMsIFsnbGVmdCcsICd0b3AnLCAnYm90dG9tJ10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxsb3dlZERpcmVjdGlvbiA9IChkZXRlY3RSZXN1bHRzOiBEZXRlY3RSZXN1bHRbXSwgaWxsZWdhbERpcmVjdGlvbnM6IERldGVjdFJlc3VsdFtdKTogRGV0ZWN0UmVzdWx0W10gfCBudWxsID0+IHtcbiAgICBjb25zdCBkaXJlY3Rpb25zID0gZGV0ZWN0UmVzdWx0cztcbiAgICBpbGxlZ2FsRGlyZWN0aW9ucy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBib3R0b21EaXJlY3Rpb25JbmRleCA9IGRpcmVjdGlvbnMuZmluZEluZGV4KGRpcmVjdGlvbiA9PiBkaXJlY3Rpb24gPT09IGl0ZW0pO1xuICAgICAgICBpZiAoYm90dG9tRGlyZWN0aW9uSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb25zLnNwbGljZShib3R0b21EaXJlY3Rpb25JbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGlyZWN0aW9ucy5sZW5ndGggPyBkaXJlY3Rpb25zIDogbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBkZXRlY3REcm9wVGFyZ2V0ID0gKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGRldGVjdFBvaW50OiBQb2ludCxcbiAgICBkcm9wVGFyZ2V0OiB7IHRhcmdldDogTWluZEVsZW1lbnQ7IGRldGVjdFJlc3VsdDogRGV0ZWN0UmVzdWx0IH0gfCBudWxsLFxuICAgIGFjdGl2ZUVsZW1lbnRzOiBNaW5kRWxlbWVudFtdXG4pID0+IHtcbiAgICBsZXQgZGV0ZWN0UmVzdWx0OiBEZXRlY3RSZXN1bHRbXSB8IG51bGwgPSBudWxsO1xuICAgIGRlcHRoRmlyc3RSZWN1cnNpb24oXG4gICAgICAgIChib2FyZCBhcyB1bmtub3duKSBhcyBNaW5kRWxlbWVudCxcbiAgICAgICAgZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIU1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpIHx8IGRldGVjdFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBNaW5kRWxlbWVudC5nZXROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9ucyA9IGRpcmVjdGlvbkRldGVjdG9yKG5vZGUsIGRldGVjdFBvaW50KTtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgZGV0ZWN0UmVzdWx0ID0gZGlyZWN0aW9uQ29ycmVjdG9yKGJvYXJkLCBub2RlLCBkaXJlY3Rpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRyb3BUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IGFjdGl2ZUVsZW1lbnRzLmV2ZXJ5KGVsZW1lbnQgPT4gaXNWYWxpZFRhcmdldChlbGVtZW50LCBub2RlLm9yaWdpbikpO1xuICAgICAgICAgICAgaWYgKGRldGVjdFJlc3VsdCAmJiBpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgZHJvcFRhcmdldCA9IHsgdGFyZ2V0OiBub2RlLm9yaWdpbiwgZGV0ZWN0UmVzdWx0OiBkZXRlY3RSZXN1bHRbMF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SXNSZWN1cnNpb25GdW5jKGJvYXJkKVxuICAgICk7XG4gICAgcmV0dXJuIGRyb3BUYXJnZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgZGlyZWN0aW9uRGV0ZWN0b3IgPSAodGFyZ2V0Tm9kZTogTWluZE5vZGUsIGNlbnRlclBvaW50OiBQb2ludCk6IERldGVjdFJlc3VsdFtdIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRSZWN0YW5nbGVCeU5vZGUodGFyZ2V0Tm9kZSk7XG4gICAgY29uc3QgeUNlbnRlciA9IHkgKyBoZWlnaHQgLyAyO1xuICAgIGNvbnN0IHhDZW50ZXIgPSB4ICsgd2lkdGggLyAyO1xuXG4gICAgY29uc3QgdG9wID0gdGFyZ2V0Tm9kZS55O1xuICAgIGNvbnN0IGJvdHRvbSA9IHRhcmdldE5vZGUueSArIHRhcmdldE5vZGUuaGVpZ2h0O1xuICAgIGNvbnN0IGxlZnQgPSB0YXJnZXROb2RlLng7XG4gICAgY29uc3QgcmlnaHQgPSB0YXJnZXROb2RlLnggKyB0YXJnZXROb2RlLndpZHRoO1xuICAgIGNvbnN0IGRpcmVjdGlvbjogRGV0ZWN0UmVzdWx0W10gPSBbXTtcblxuICAgIC8vIHgtYXhpc1xuICAgIGlmIChjZW50ZXJQb2ludFsxXSA+IHkgJiYgY2VudGVyUG9pbnRbMV0gPCB5ICsgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChjZW50ZXJQb2ludFswXSA+IGxlZnQgJiYgY2VudGVyUG9pbnRbMF0gPCB4Q2VudGVyKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24ucHVzaCgnbGVmdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZW50ZXJQb2ludFswXSA+IHhDZW50ZXIgJiYgY2VudGVyUG9pbnRbMF0gPCByaWdodCkge1xuICAgICAgICAgICAgZGlyZWN0aW9uLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3ZlcmxhcHBpbmcgYXJlYSwgcmV0dXJuIGluIGJvdGggZGlyZWN0aW9uc1xuICAgICAgICBpZiAoKGNlbnRlclBvaW50WzBdID4geCAmJiBjZW50ZXJQb2ludFswXSA8IHhDZW50ZXIpIHx8IChjZW50ZXJQb2ludFswXSA+IHhDZW50ZXIgJiYgY2VudGVyUG9pbnRbMF0gPCB4ICsgd2lkdGgpKSB7XG4gICAgICAgICAgICBpZiAoY2VudGVyUG9pbnRbMV0gPCB5Q2VudGVyKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uLnB1c2goJ3RvcCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24ucHVzaCgnYm90dG9tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpcmVjdGlvbi5sZW5ndGggPyBkaXJlY3Rpb24gOiBudWxsO1xuICAgIH1cblxuICAgIC8vIHktYXhpc1xuICAgIGlmIChjZW50ZXJQb2ludFswXSA+IHggJiYgY2VudGVyUG9pbnRbMF0gPCB4ICsgd2lkdGgpIHtcbiAgICAgICAgaWYgKGNlbnRlclBvaW50WzFdID4gdG9wICYmIGNlbnRlclBvaW50WzFdIDwgeUNlbnRlcikge1xuICAgICAgICAgICAgZGlyZWN0aW9uLnB1c2goJ3RvcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZW50ZXJQb2ludFsxXSA+IHlDZW50ZXIgJiYgY2VudGVyUG9pbnRbMV0gPCBib3R0b20pIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbi5wdXNoKCdib3R0b20nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNlbnRlclBvaW50WzFdID4geSAmJiBjZW50ZXJQb2ludFsxXSA8IHkgKyBoZWlnaHQpIHx8IChjZW50ZXJQb2ludFsxXSA+IHlDZW50ZXIgJiYgY2VudGVyUG9pbnRbMV0gPCB5ICsgaGVpZ2h0KSkge1xuICAgICAgICAgICAgaWYgKGNlbnRlclBvaW50WzBdIDwgeENlbnRlcikge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbi5wdXNoKCdsZWZ0Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbi5wdXNoKCdyaWdodCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXJlY3Rpb24ubGVuZ3RoID8gZGlyZWN0aW9uIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGFyZ2V0ID0gKG9yaWdpbjogTWluZEVsZW1lbnQsIHRhcmdldDogTWluZEVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gb3JpZ2luICE9PSB0YXJnZXQgJiYgIWlzQ2hpbGRFbGVtZW50KG9yaWdpbiwgdGFyZ2V0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoQnlEcm9wVGFyZ2V0ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBkcm9wVGFyZ2V0OiB7IHRhcmdldDogTWluZEVsZW1lbnQ7IGRldGVjdFJlc3VsdDogRGV0ZWN0UmVzdWx0IH0pID0+IHtcbiAgICBsZXQgdGFyZ2V0UGF0aCA9IFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIGRyb3BUYXJnZXQ/LnRhcmdldCk7XG4gICAgY29uc3QgbGF5b3V0ID0gUGxhaXRNaW5kLmlzTWluZChkcm9wVGFyZ2V0Py50YXJnZXQpXG4gICAgICAgID8gZ2V0Um9vdExheW91dChkcm9wVGFyZ2V0Py50YXJnZXQpXG4gICAgICAgIDogTWluZFF1ZXJpZXMuZ2V0Q29ycmVjdExheW91dEJ5RWxlbWVudChib2FyZCwgTWluZEVsZW1lbnQuZ2V0UGFyZW50KGRyb3BUYXJnZXQ/LnRhcmdldCkpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0Tm9uQWJzdHJhY3RDaGlsZHJlbihkcm9wVGFyZ2V0LnRhcmdldCk7XG4gICAgaWYgKGlzVmVydGljYWxMb2dpY0xheW91dChsYXlvdXQpKSB7XG4gICAgICAgIGlmIChkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ3RvcCcgfHwgZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHRhcmdldFBhdGggPSBQYXRoLm5leHQodGFyZ2V0UGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSG9yaXpvbnRhbExvZ2ljTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgaWYgKGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0ID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBpZiAoUGxhaXRNaW5kLmlzTWluZChkcm9wVGFyZ2V0Py50YXJnZXQpICYmIGlzU3RhbmRhcmRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFBhdGgucHVzaChkcm9wVGFyZ2V0Py50YXJnZXQucmlnaHROb2RlQ291bnQhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0UGF0aC5wdXNoKGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0ID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHRhcmdldFBhdGgucHVzaChjaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIHRhcmdldFBhdGggPSBQYXRoLm5leHQodGFyZ2V0UGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW5kZW50ZWRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICBpZiAoaXNUb3BMYXlvdXQobGF5b3V0KSAmJiBkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIHRhcmdldFBhdGggPSBQYXRoLm5leHQodGFyZ2V0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQm90dG9tTGF5b3V0KGxheW91dCkgJiYgZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoID0gUGF0aC5uZXh0KHRhcmdldFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xlZnRMYXlvdXQobGF5b3V0KSAmJiBkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSaWdodExheW91dChsYXlvdXQpICYmIGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0ID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0UGF0aDtcbn07XG4iXX0=
@@ -1,118 +0,0 @@
1
- import { createG, getRectangleByElements, PlaitBoard, RectangleClient, setStrokeLinecap, toActiveRectangleFromViewBoxRectangle } from '@plait/core';
2
- import { PRIMARY_COLOR } from '../../constants';
3
- import { ABSTRACT_HANDLE_COLOR, ABSTRACT_HANDLE_LENGTH, ABSTRACT_INCLUDED_OUTLINE_OFFSET } from '../../constants/abstract-node';
4
- import { MindElement } from '../../interfaces';
5
- import { isHorizontalLayout } from '@plait/layouts';
6
- import { MindQueries } from '../../queries';
7
- import { getLayoutDirection, getPointByPlacement, moveXOfPoint, transformPlacement } from '../point-placement';
8
- import { HorizontalPlacement, VerticalPlacement } from '../../interfaces/types';
9
- import { getRectangleByResizingLocation } from '../abstract/resize';
10
- import { AbstractHandlePosition } from '../../plugins/with-abstract-resize.board';
11
- export function drawAbstractIncludedOutline(board, roughSVG, element, activeHandlePosition, resizingLocation) {
12
- const abstractIncludedG = createG();
13
- const parentElement = MindElement.getParent(element);
14
- const nodeLayout = MindQueries.getCorrectLayoutByElement(board, element);
15
- const isHorizontal = isHorizontalLayout(nodeLayout);
16
- const includedElements = parentElement.children.slice(element.start, element.end + 1);
17
- const abstractRectangle = getRectangleByElements(board, includedElements, true);
18
- const activeAbstractRectangle = toActiveRectangleFromViewBoxRectangle(board, abstractRectangle);
19
- let activeAbstractOutlineRectangle = RectangleClient.getOutlineRectangle(activeAbstractRectangle, -ABSTRACT_INCLUDED_OUTLINE_OFFSET);
20
- if (resizingLocation) {
21
- activeAbstractOutlineRectangle = getRectangleByResizingLocation(activeAbstractOutlineRectangle, resizingLocation, activeHandlePosition, isHorizontal);
22
- }
23
- const rectangle = drawAbstractRoundRectangle(roughSVG, activeAbstractOutlineRectangle.x, activeAbstractOutlineRectangle.y, activeAbstractOutlineRectangle.x + activeAbstractOutlineRectangle.width, activeAbstractOutlineRectangle.y + activeAbstractOutlineRectangle.height, isHorizontal, {
24
- stroke: PRIMARY_COLOR,
25
- strokeWidth: 1,
26
- fillStyle: 'solid'
27
- });
28
- const startPlacement = [HorizontalPlacement.center, VerticalPlacement.top];
29
- const endPlacement = [HorizontalPlacement.center, VerticalPlacement.bottom];
30
- const linkDirection = getLayoutDirection(MindElement.getNode(element), isHorizontal);
31
- transformPlacement(startPlacement, linkDirection);
32
- transformPlacement(endPlacement, linkDirection);
33
- let startCenterPoint = getPointByPlacement(activeAbstractOutlineRectangle, startPlacement);
34
- let endCenterPoint = getPointByPlacement(activeAbstractOutlineRectangle, endPlacement);
35
- const startPoint1 = moveXOfPoint(startCenterPoint, -ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
36
- const startPoint2 = moveXOfPoint(startCenterPoint, ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
37
- const endPoint1 = moveXOfPoint(endCenterPoint, -ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
38
- const endPoint2 = moveXOfPoint(endCenterPoint, ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
39
- const startHandle = roughSVG.line(startPoint1[0], startPoint1[1], startPoint2[0], startPoint2[1], getHandleOption(activeHandlePosition === AbstractHandlePosition.start));
40
- const endHandle = roughSVG.line(endPoint1[0], endPoint1[1], endPoint2[0], endPoint2[1], getHandleOption(activeHandlePosition === AbstractHandlePosition.end));
41
- handleBoardClass(board, activeHandlePosition, isHorizontal);
42
- setStrokeLinecap(startHandle, 'round');
43
- setStrokeLinecap(endHandle, 'round');
44
- abstractIncludedG.append(startHandle);
45
- abstractIncludedG.append(endHandle);
46
- abstractIncludedG.append(rectangle);
47
- return abstractIncludedG;
48
- }
49
- export function getHandleOption(isHover) {
50
- return isHover
51
- ? {
52
- stroke: PRIMARY_COLOR,
53
- strokeWidth: 4,
54
- fillStyle: 'solid'
55
- }
56
- : {
57
- stroke: ABSTRACT_HANDLE_COLOR,
58
- strokeWidth: 3,
59
- fillStyle: 'solid'
60
- };
61
- }
62
- function handleBoardClass(board, activeHandlePosition, isHorizontal) {
63
- if (activeHandlePosition) {
64
- if (isHorizontal) {
65
- PlaitBoard.getBoardContainer(board).classList.add('abstract-resizing-horizontal');
66
- }
67
- else {
68
- PlaitBoard.getBoardContainer(board).classList.add('abstract-resizing-vertical');
69
- }
70
- }
71
- else {
72
- PlaitBoard.getBoardContainer(board).classList.remove('abstract-resizing-horizontal');
73
- PlaitBoard.getBoardContainer(board).classList.remove('abstract-resizing-vertical');
74
- }
75
- }
76
- export function drawAbstractRoundRectangle(rs, x1, y1, x2, y2, isHorizontal, options) {
77
- const width = Math.abs(x1 - x2);
78
- const height = Math.abs(y1 - y2);
79
- const radius = 5;
80
- const handleGap = 4;
81
- const handleLength = 10;
82
- const handleSpace = handleLength + handleGap * 2;
83
- if (isHorizontal) {
84
- const handleSideLine = (width - handleSpace - radius * 2) / 2;
85
- const sideLine = height - radius * 2;
86
- return rs.path(`M${x1 + radius},${y1}
87
- l${handleSideLine},0
88
- m${handleSpace},0
89
- l${handleSideLine},0
90
- a${radius},${radius},0,0,1,${radius},${radius}
91
- l0,${sideLine}
92
- a${radius},${radius},0,0,1,-${radius},${radius}
93
- l-${handleSideLine},0
94
- m-${handleSpace},0
95
- l-${handleSideLine},0
96
- a${radius},${radius},0,0,1,-${radius},-${radius}
97
- l0,-${sideLine}
98
- a${radius},${radius},0,0,1,${radius},-${radius}`, options);
99
- }
100
- else {
101
- const handleSideLine = (height - handleSpace - radius * 2) / 2;
102
- const sideLine = width - radius * 2;
103
- return rs.path(`M${x1 + radius},${y1}
104
- l${sideLine},0
105
- a${radius},${radius},0,0,1,${radius},${radius}
106
- l0,${handleSideLine}
107
- m0,${handleSpace}
108
- l0,${handleSideLine}
109
- a${radius},${radius},0,0,1,-${radius},${radius}
110
- l-${sideLine},0
111
- a${radius},${radius},0,0,1,-${radius},-${radius}
112
- l0,-${handleSideLine}
113
- m0,-${handleSpace}
114
- l0,-${handleSideLine}
115
- a${radius},${radius},0,0,1,${radius},-${radius}`, options);
116
- }
117
- }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3Qtb3V0bGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3V0aWxzL2RyYXcvYWJzdHJhY3Qtb3V0bGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUscUNBQXFDLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEosT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhJLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQWtCLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0csT0FBTyxFQUFFLG1CQUFtQixFQUFrQixpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBR2xGLE1BQU0sVUFBVSwyQkFBMkIsQ0FDdkMsS0FBaUIsRUFDakIsUUFBa0IsRUFDbEIsT0FBb0IsRUFDcEIsb0JBQTZDLEVBQzdDLGdCQUF5QjtJQUV6QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxDQUFDO0lBRXBDLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENB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QUFFO2VBQ2xCLGNBQWM7ZUFDZCxXQUFXO2VBQ1gsY0FBYztlQUNkLE1BQU0sSUFBSSxNQUFNLFVBQVUsTUFBTSxJQUFJLE1BQU07aUJBQ3hDLFFBQVE7ZUFDVixNQUFNLElBQUksTUFBTSxXQUFXLE1BQU0sSUFBSSxNQUFNO2dCQUMxQyxjQUFjO2dCQUNkLFdBQVc7Z0JBQ1gsY0FBYztlQUNmLE1BQU0sSUFBSSxNQUFNLFdBQVcsTUFBTSxLQUFLLE1BQU07a0JBQ3pDLFFBQVE7ZUFDWCxNQUFNLElBQUksTUFBTSxVQUFVLE1BQU0sS0FBSyxNQUFNLEVBQUUsRUFDaEQsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO1NBQU0sQ0FBQztRQUNKLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBTSxHQUFHLFdBQVcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sUUFBUSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FDVixJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRTtlQUNsQixRQUFRO2VBQ1IsTUFBTSxJQUFJLE1BQU0sVUFBVSxNQUFNLElBQUksTUFBTTtpQkFDeEMsY0FBYztpQkFDZCxXQUFXO2lCQUNYLGNBQWM7ZUFDaEIsTUFBTSxJQUFJLE1BQU0sV0FBVyxNQUFNLElBQUksTUFBTTtnQkFDMUMsUUFBUTtlQUNULE1BQU0sSUFBSSxNQUFNLFdBQVcsTUFBTSxLQUFLLE1BQU07a0JBQ3pDLGNBQWM7a0JBQ2QsV0FBVztrQkFDWCxjQUFjO2VBQ2pCLE1BQU0sSUFBSSxNQUFNLFVBQVUsTUFBTSxLQUFLLE1BQU0sRUFBRSxFQUNoRCxPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRywgZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cywgUGxhaXRCb2FyZCwgUmVjdGFuZ2xlQ2xpZW50LCBzZXRTdHJva2VMaW5lY2FwLCB0b0FjdGl2ZVJlY3RhbmdsZUZyb21WaWV3Qm94UmVjdGFuZ2xlIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgUFJJTUFSWV9DT0xPUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBQlNUUkFDVF9IQU5ETEVfQ09MT1IsIEFCU1RSQUNUX0hBTkRMRV9MRU5HVEgsIEFCU1RSQUNUX0lOQ0xVREVEX09VVExJTkVfT0ZGU0VUIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2Fic3RyYWN0LW5vZGUnO1xuaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tICdyb3VnaGpzL2Jpbi9zdmcnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1pbmRMYXlvdXRUeXBlLCBpc0hvcml6b250YWxMYXlvdXQgfSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyBNaW5kUXVlcmllcyB9IGZyb20gJy4uLy4uL3F1ZXJpZXMnO1xuaW1wb3J0IHsgZ2V0TGF5b3V0RGlyZWN0aW9uLCBnZXRQb2ludEJ5UGxhY2VtZW50LCBtb3ZlWE9mUG9pbnQsIHRyYW5zZm9ybVBsYWNlbWVudCB9IGZyb20gJy4uL3BvaW50LXBsYWNlbWVudCc7XG5pbXBvcnQgeyBIb3Jpem9udGFsUGxhY2VtZW50LCBQb2ludFBsYWNlbWVudCwgVmVydGljYWxQbGFjZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3R5cGVzJztcbmltcG9ydCB7IGdldFJlY3RhbmdsZUJ5UmVzaXppbmdMb2NhdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0L3Jlc2l6ZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEhhbmRsZVBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vcGx1Z2lucy93aXRoLWFic3RyYWN0LXJlc2l6ZS5ib2FyZCc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3QWJzdHJhY3RJbmNsdWRlZE91dGxpbmUoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgcm91Z2hTVkc6IFJvdWdoU1ZHLFxuICAgIGVsZW1lbnQ6IE1pbmRFbGVtZW50LFxuICAgIGFjdGl2ZUhhbmRsZVBvc2l0aW9uPzogQWJzdHJhY3RIYW5kbGVQb3NpdGlvbixcbiAgICByZXNpemluZ0xvY2F0aW9uPzogbnVtYmVyXG4pIHtcbiAgICBjb25zdCBhYnN0cmFjdEluY2x1ZGVkRyA9IGNyZWF0ZUcoKTtcblxuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSBNaW5kRWxlbWVudC5nZXRQYXJlbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgbm9kZUxheW91dCA9IE1pbmRRdWVyaWVzLmdldENvcnJlY3RMYXlvdXRCeUVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpIGFzIE1pbmRMYXlvdXRUeXBlO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbExheW91dChub2RlTGF5b3V0KTtcblxuICAgIGNvbnN0IGluY2x1ZGVkRWxlbWVudHMgPSBwYXJlbnRFbGVtZW50LmNoaWxkcmVuLnNsaWNlKGVsZW1lbnQuc3RhcnQhLCBlbGVtZW50LmVuZCEgKyAxKTtcbiAgICBjb25zdCBhYnN0cmFjdFJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIGluY2x1ZGVkRWxlbWVudHMsIHRydWUpO1xuICAgIGNvbnN0IGFjdGl2ZUFic3RyYWN0UmVjdGFuZ2xlID0gdG9BY3RpdmVSZWN0YW5nbGVGcm9tVmlld0JveFJlY3RhbmdsZShib2FyZCwgYWJzdHJhY3RSZWN0YW5nbGUpO1xuICAgIGxldCBhY3RpdmVBYnN0cmFjdE91dGxpbmVSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0T3V0bGluZVJlY3RhbmdsZShhY3RpdmVBYnN0cmFjdFJlY3RhbmdsZSwgLUFCU1RSQUNUX0lOQ0xVREVEX09VVExJTkVfT0ZGU0VUKTtcblxuICAgIGlmIChyZXNpemluZ0xvY2F0aW9uKSB7XG4gICAgICAgIGFjdGl2ZUFic3RyYWN0T3V0bGluZVJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5UmVzaXppbmdMb2NhdGlvbihhY3RpdmVBYnN0cmFjdE91dGxpbmVSZWN0YW5nbGUsIHJlc2l6aW5nTG9jYXRpb24sIGFjdGl2ZUhhbmRsZVBvc2l0aW9uISwgaXNIb3Jpem9udGFsKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0YW5nbGUgPSBkcmF3QWJzdHJhY3RSb3VuZFJlY3RhbmdsZShcbiAgICAgICAgcm91Z2hTVkcsXG4gICAgICAgIGFjdGl2ZUFic3RyYWN0T3V0bGluZVJlY3RhbmdsZS54LFxuICAgICAgICBhY3RpdmVBYnN0cmFjdE91dGxpbmVSZWN0YW5nbGUueSxcbiAgICAgICAgYWN0aXZlQWJzdHJhY3RPdXRsaW5lUmVjdGFuZ2xlLnggKyBhY3RpdmVBYnN0cmFjdE91dGxpbmVSZWN0YW5nbGUud2lkdGgsXG4gICAgICAgIGFjdGl2ZUFic3RyYWN0T3V0bGluZVJlY3RhbmdsZS55ICsgYWN0aXZlQWJzdHJhY3RPdXRsaW5lUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgaXNIb3Jpem9udGFsLFxuICAgICAgICB7XG4gICAgICAgICAgICBzdHJva2U6IFBSSU1BUllfQ09MT1IsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcbiAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXJ0UGxhY2VtZW50ID0gW0hvcml6b250YWxQbGFjZW1lbnQuY2VudGVyLCBWZXJ0aWNhbFBsYWNlbWVudC50b3BdIGFzIFBvaW50UGxhY2VtZW50O1xuICAgIGNvbnN0IGVuZFBsYWNlbWVudCA9IFtIb3Jpem9udGFsUGxhY2VtZW50LmNlbnRlciwgVmVydGljYWxQbGFjZW1lbnQuYm90dG9tXSBhcyBQb2ludFBsYWNlbWVudDtcblxuICAgIGNvbnN0IGxpbmtEaXJlY3Rpb24gPSBnZXRMYXlvdXREaXJlY3Rpb24oTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KSwgaXNIb3Jpem9udGFsKTtcblxuICAgIHRyYW5zZm9ybVBsYWNlbWVudChzdGFydFBsYWNlbWVudCwgbGlua0RpcmVjdGlvbik7XG4gICAgdHJhbnNmb3JtUGxhY2VtZW50KGVuZFBsYWNlbWVudCwgbGlua0RpcmVjdGlvbik7XG5cbiAgICBsZXQgc3RhcnRDZW50ZXJQb2ludCA9IGdldFBvaW50QnlQbGFjZW1lbnQoYWN0aXZlQWJzdHJhY3RPdXRsaW5lUmVjdGFuZ2xlLCBzdGFydFBsYWNlbWVudCk7XG4gICAgbGV0IGVuZENlbnRlclBvaW50ID0gZ2V0UG9pbnRCeVBsYWNlbWVudChhY3RpdmVBYnN0cmFjdE91dGxpbmVSZWN0YW5nbGUsIGVuZFBsYWNlbWVudCk7XG5cbiAgICBjb25zdCBzdGFydFBvaW50MSA9IG1vdmVYT2ZQb2ludChzdGFydENlbnRlclBvaW50LCAtQUJTVFJBQ1RfSEFORExFX0xFTkdUSCAvIDIsIGxpbmtEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHN0YXJ0UG9pbnQyID0gbW92ZVhPZlBvaW50KHN0YXJ0Q2VudGVyUG9pbnQsIEFCU1RSQUNUX0hBTkRMRV9MRU5HVEggLyAyLCBsaW5rRGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IGVuZFBvaW50MSA9IG1vdmVYT2ZQb2ludChlbmRDZW50ZXJQb2ludCwgLUFCU1RSQUNUX0hBTkRMRV9MRU5HVEggLyAyLCBsaW5rRGlyZWN0aW9uKTtcbiAgICBjb25zdCBlbmRQb2ludDIgPSBtb3ZlWE9mUG9pbnQoZW5kQ2VudGVyUG9pbnQsIEFCU1RSQUNUX0hBTkRMRV9MRU5HVEggLyAyLCBsaW5rRGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IHN0YXJ0SGFuZGxlID0gcm91Z2hTVkcubGluZShcbiAgICAgICAgc3RhcnRQb2ludDFbMF0sXG4gICAgICAgIHN0YXJ0UG9pbnQxWzFdLFxuICAgICAgICBzdGFydFBvaW50MlswXSxcbiAgICAgICAgc3RhcnRQb2ludDJbMV0sXG4gICAgICAgIGdldEhhbmRsZU9wdGlvbihhY3RpdmVIYW5kbGVQb3NpdGlvbiA9PT0gQWJzdHJhY3RIYW5kbGVQb3NpdGlvbi5zdGFydClcbiAgICApO1xuXG4gICAgY29uc3QgZW5kSGFuZGxlID0gcm91Z2hTVkcubGluZShcbiAgICAgICAgZW5kUG9pbnQxWzBdLFxuICAgICAgICBlbmRQb2ludDFbMV0sXG4gICAgICAgIGVuZFBvaW50MlswXSxcbiAgICAgICAgZW5kUG9pbnQyWzFdLFxuICAgICAgICBnZXRIYW5kbGVPcHRpb24oYWN0aXZlSGFuZGxlUG9zaXRpb24gPT09IEFic3RyYWN0SGFuZGxlUG9zaXRpb24uZW5kKVxuICAgICk7XG5cbiAgICBoYW5kbGVCb2FyZENsYXNzKGJvYXJkLCBhY3RpdmVIYW5kbGVQb3NpdGlvbiwgaXNIb3Jpem9udGFsKTtcblxuICAgIHNldFN0cm9rZUxpbmVjYXAoc3RhcnRIYW5kbGUsICdyb3VuZCcpO1xuICAgIHNldFN0cm9rZUxpbmVjYXAoZW5kSGFuZGxlLCAncm91bmQnKTtcblxuICAgIGFic3RyYWN0SW5jbHVkZWRHLmFwcGVuZChzdGFydEhhbmRsZSk7XG4gICAgYWJzdHJhY3RJbmNsdWRlZEcuYXBwZW5kKGVuZEhhbmRsZSk7XG4gICAgYWJzdHJhY3RJbmNsdWRlZEcuYXBwZW5kKHJlY3RhbmdsZSk7XG5cbiAgICByZXR1cm4gYWJzdHJhY3RJbmNsdWRlZEc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIYW5kbGVPcHRpb24oaXNIb3ZlcjogYm9vbGVhbikge1xuICAgIHJldHVybiBpc0hvdmVyXG4gICAgICAgID8ge1xuICAgICAgICAgICAgICBzdHJva2U6IFBSSU1BUllfQ09MT1IsXG4gICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiA0LFxuICAgICAgICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgICBzdHJva2U6IEFCU1RSQUNUX0hBTkRMRV9DT0xPUixcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDMsXG4gICAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICAgIH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUJvYXJkQ2xhc3MoYm9hcmQ6IFBsYWl0Qm9hcmQsIGFjdGl2ZUhhbmRsZVBvc2l0aW9uOiBBYnN0cmFjdEhhbmRsZVBvc2l0aW9uIHwgdW5kZWZpbmVkLCBpc0hvcml6b250YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoYWN0aXZlSGFuZGxlUG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LmFkZCgnYWJzdHJhY3QtcmVzaXppbmctaG9yaXpvbnRhbCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LmFkZCgnYWJzdHJhY3QtcmVzaXppbmctdmVydGljYWwnKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5yZW1vdmUoJ2Fic3RyYWN0LXJlc2l6aW5nLWhvcml6b250YWwnKTtcbiAgICAgICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LnJlbW92ZSgnYWJzdHJhY3QtcmVzaXppbmctdmVydGljYWwnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3QWJzdHJhY3RSb3VuZFJlY3RhbmdsZShcbiAgICByczogUm91Z2hTVkcsXG4gICAgeDE6IG51bWJlcixcbiAgICB5MTogbnVtYmVyLFxuICAgIHgyOiBudW1iZXIsXG4gICAgeTI6IG51bWJlcixcbiAgICBpc0hvcml6b250YWw6IGJvb2xlYW4sXG4gICAgb3B0aW9uczogT3B0aW9uc1xuKSB7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLmFicyh4MSAtIHgyKTtcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyh5MSAtIHkyKTtcblxuICAgIGNvbnN0IHJhZGl1cyA9IDU7XG4gICAgY29uc3QgaGFuZGxlR2FwID0gNDtcbiAgICBjb25zdCBoYW5kbGVMZW5ndGggPSAxMDtcblxuICAgIGNvbnN0IGhhbmRsZVNwYWNlID0gaGFuZGxlTGVuZ3RoICsgaGFuZGxlR2FwICogMjtcblxuICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlU2lkZUxpbmUgPSAod2lkdGggLSBoYW5kbGVTcGFjZSAtIHJhZGl1cyAqIDIpIC8gMjtcbiAgICAgICAgY29uc3Qgc2lkZUxpbmUgPSBoZWlnaHQgLSByYWRpdXMgKiAyO1xuICAgICAgICByZXR1cm4gcnMucGF0aChcbiAgICAgICAgICAgIGBNJHt4MSArIHJhZGl1c30sJHt5MX1cbiAgICAgICAgICAgIGwke2hhbmRsZVNpZGVMaW5lfSwwXG4gICAgICAgICAgICBtJHtoYW5kbGVTcGFjZX0sMFxuICAgICAgICAgICAgbCR7aGFuZGxlU2lkZUxpbmV9LDBcbiAgICAgICAgICAgIGEke3JhZGl1c30sJHtyYWRpdXN9LDAsMCwxLCR7cmFkaXVzfSwke3JhZGl1c31cbiAgICAgICAgICAgIGwwLCR7c2lkZUxpbmV9XG4gICAgICAgICAgICBhJHtyYWRpdXN9LCR7cmFkaXVzfSwwLDAsMSwtJHtyYWRpdXN9LCR7cmFkaXVzfVxuICAgICAgICAgICAgbC0ke2hhbmRsZVNpZGVMaW5lfSwwXG4gICAgICAgICAgICBtLSR7aGFuZGxlU3BhY2V9LDBcbiAgICAgICAgICAgIGwtJHtoYW5kbGVTaWRlTGluZX0sMFxuICAgICAgICAgICAgYSR7cmFkaXVzfSwke3JhZGl1c30sMCwwLDEsLSR7cmFkaXVzfSwtJHtyYWRpdXN9XG4gICAgICAgICAgICBsMCwtJHtzaWRlTGluZX1cbiAgICAgICAgICAgIGEke3JhZGl1c30sJHtyYWRpdXN9LDAsMCwxLCR7cmFkaXVzfSwtJHtyYWRpdXN9YCxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBoYW5kbGVTaWRlTGluZSA9IChoZWlnaHQgLSBoYW5kbGVTcGFjZSAtIHJhZGl1cyAqIDIpIC8gMjtcbiAgICAgICAgY29uc3Qgc2lkZUxpbmUgPSB3aWR0aCAtIHJhZGl1cyAqIDI7XG4gICAgICAgIHJldHVybiBycy5wYXRoKFxuICAgICAgICAgICAgYE0ke3gxICsgcmFkaXVzfSwke3kxfVxuICAgICAgICAgICAgbCR7c2lkZUxpbmV9LDBcbiAgICAgICAgICAgIGEke3JhZGl1c30sJHtyYWRpdXN9LDAsMCwxLCR7cmFkaXVzfSwke3JhZGl1c31cbiAgICAgICAgICAgIGwwLCR7aGFuZGxlU2lkZUxpbmV9XG4gICAgICAgICAgICBtMCwke2hhbmRsZVNwYWNlfVxuICAgICAgICAgICAgbDAsJHtoYW5kbGVTaWRlTGluZX1cbiAgICAgICAgICAgIGEke3JhZGl1c30sJHtyYWRpdXN9LDAsMCwxLC0ke3JhZGl1c30sJHtyYWRpdXN9XG4gICAgICAgICAgICBsLSR7c2lkZUxpbmV9LDBcbiAgICAgICAgICAgIGEke3JhZGl1c30sJHtyYWRpdXN9LDAsMCwxLC0ke3JhZGl1c30sLSR7cmFkaXVzfVxuICAgICAgICAgICAgbDAsLSR7aGFuZGxlU2lkZUxpbmV9XG4gICAgICAgICAgICBtMCwtJHtoYW5kbGVTcGFjZX1cbiAgICAgICAgICAgIGwwLC0ke2hhbmRsZVNpZGVMaW5lfVxuICAgICAgICAgICAgYSR7cmFkaXVzfSwke3JhZGl1c30sMCwwLDEsJHtyYWRpdXN9LC0ke3JhZGl1c31gLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,164 +0,0 @@
1
- import { drawRoundRectangleByNode } from './node-shape';
2
- import { BASE, PRIMARY_COLOR, STROKE_WIDTH } from '../../constants';
3
- import { LayoutDirection, MindElement, PlaitMind } from '../../interfaces';
4
- import { getRectangleByNode } from '../position/node';
5
- import { PlaitBoard, drawRoundRectangle, createG, Path, PlaitNode, PlaitElement, updateForeignObject } from '@plait/core';
6
- import { MindQueries } from '../../queries';
7
- import { isHorizontalLayout, isIndentedLayout, isStandardLayout, isTopLayout } from '@plait/layouts';
8
- import { getTopicRectangleByNode } from '../position/topic';
9
- import { HorizontalPlacement, VerticalPlacement } from '../../interfaces/types';
10
- import { getLayoutDirection, getPointByPlacement, moveXOfPoint, moveYOfPoint, transformPlacement } from '../point-placement';
11
- import { hasPreviousOrNextOfDropPath } from '../dnd/common';
12
- import { drawLink } from './node-link/draw-link';
13
- import { getEmojiForeignRectangle } from '../position/emoji';
14
- import { getImageForeignRectangle } from '../position';
15
- import { ImageGenerator, getFirstTextManage } from '@plait/common';
16
- import { NodeEmojisGenerator } from '../../generators/node-emojis.generator';
17
- export const drawFakeDragNode = (board, element, offsetX, offsetY) => {
18
- const ref = PlaitElement.getElementRef(element);
19
- const mindNode = MindElement.getNode(element);
20
- const dragFakeNodeG = createG();
21
- dragFakeNodeG.classList.add('dragging', 'fake-node', 'plait-board-attached');
22
- const fakeDraggingNode = {
23
- ...mindNode,
24
- children: [],
25
- x: mindNode.x + offsetX,
26
- y: mindNode.y + offsetY
27
- };
28
- const textRectangle = getTopicRectangleByNode(board, mindNode);
29
- const fakeNodeG = drawRoundRectangleByNode(board, fakeDraggingNode);
30
- const richtextG = getFirstTextManage(element).g.cloneNode(true);
31
- updateForeignObject(richtextG, textRectangle.width, textRectangle.height, textRectangle.x + offsetX, textRectangle.y + offsetY);
32
- dragFakeNodeG?.append(fakeNodeG);
33
- dragFakeNodeG?.append(richtextG);
34
- // draw emojis
35
- if (MindElement.hasEmojis(element)) {
36
- const nodeEmojisGenerator = ref.getGenerator(NodeEmojisGenerator.key);
37
- const fakeEmojisG = nodeEmojisGenerator.g.cloneNode(true);
38
- const foreignRectangle = getEmojiForeignRectangle(board, element);
39
- updateForeignObject(fakeEmojisG, foreignRectangle.width, foreignRectangle.height, foreignRectangle.x + offsetX, foreignRectangle.y + offsetY);
40
- dragFakeNodeG?.append(fakeEmojisG);
41
- }
42
- if (MindElement.hasImage(element)) {
43
- const imageGenerator = ref.getGenerator(ImageGenerator.key);
44
- const fakeImageG = imageGenerator.g.cloneNode(true);
45
- const foreignRectangle = getImageForeignRectangle(board, element);
46
- updateForeignObject(fakeImageG, foreignRectangle.width, foreignRectangle.height, foreignRectangle.x + offsetX, foreignRectangle.y + offsetY);
47
- dragFakeNodeG?.append(fakeImageG);
48
- }
49
- return dragFakeNodeG;
50
- };
51
- export const drawFakeDropNode = (board, dropTarget, path) => {
52
- const target = dropTarget.target;
53
- const fakeDropNodeG = createG();
54
- const parent = PlaitNode.get(board, Path.parent(path));
55
- const layout = MindQueries.getLayoutByElement(parent);
56
- const isHorizontal = isHorizontalLayout(layout);
57
- const { hasNextNode, hasPreviousNode } = hasPreviousOrNextOfDropPath(parent, dropTarget, path);
58
- const width = 30;
59
- const height = 12;
60
- let fakeNode, centerPoint, basicNode, linkDirection;
61
- if (!hasPreviousNode && !hasNextNode) {
62
- const parentNode = MindElement.getNode(parent);
63
- const parentRect = getRectangleByNode(parentNode);
64
- linkDirection = getLayoutDirection(parentNode, isHorizontal);
65
- basicNode = parentNode;
66
- if (PlaitMind.isMind(target) && isStandardLayout(layout)) {
67
- if (dropTarget.detectResult === 'left') {
68
- linkDirection = LayoutDirection.left;
69
- basicNode.left = true;
70
- }
71
- else {
72
- linkDirection = LayoutDirection.right;
73
- basicNode.left = false;
74
- }
75
- }
76
- const placement = [HorizontalPlacement.right, VerticalPlacement.middle];
77
- transformPlacement(placement, linkDirection);
78
- const parentCenterPoint = getPointByPlacement(parentRect, placement);
79
- if (isIndentedLayout(layout)) {
80
- const placement = [
81
- HorizontalPlacement.center,
82
- isTopLayout(layout) ? VerticalPlacement.top : VerticalPlacement.bottom
83
- ];
84
- const parentCenterPoint = getPointByPlacement(parentRect, placement);
85
- centerPoint = moveXOfPoint(parentCenterPoint, height, linkDirection);
86
- centerPoint[1] = isTopLayout(layout) ? centerPoint[1] - height : centerPoint[1] + height;
87
- }
88
- else {
89
- centerPoint = moveXOfPoint(parentCenterPoint, width, linkDirection);
90
- }
91
- }
92
- else if (!hasPreviousNode && hasNextNode) {
93
- const nextElement = PlaitNode.get(board, path);
94
- basicNode = MindElement.getNode(nextElement);
95
- const nextRect = getRectangleByNode(basicNode);
96
- linkDirection = getLayoutDirection(basicNode, isHorizontal);
97
- const placement = [HorizontalPlacement.left, VerticalPlacement.top];
98
- transformPlacement(placement, linkDirection);
99
- let offset = -height;
100
- if (MindElement.isIndentedLayout(parent)) {
101
- offset = isTopLayout(layout) ? offset / 2 + basicNode.height - basicNode.vGap : 0;
102
- }
103
- centerPoint = getPointByPlacement(nextRect, placement);
104
- centerPoint = moveYOfPoint(centerPoint, offset, linkDirection);
105
- }
106
- else if (hasPreviousNode && !hasNextNode) {
107
- const previousElement = PlaitNode.get(board, Path.previous(path));
108
- basicNode = MindElement.getNode(previousElement);
109
- const previousRect = getRectangleByNode(basicNode);
110
- linkDirection = getLayoutDirection(basicNode, isHorizontal);
111
- const placement = [HorizontalPlacement.left, VerticalPlacement.bottom];
112
- transformPlacement(placement, linkDirection);
113
- let offset = height;
114
- if (MindElement.isIndentedLayout(parent)) {
115
- offset = isTopLayout(layout) ? -offset - (basicNode.height - basicNode.vGap) : offset;
116
- }
117
- centerPoint = getPointByPlacement(previousRect, placement);
118
- centerPoint = moveYOfPoint(centerPoint, offset, linkDirection);
119
- }
120
- else {
121
- const previousElement = PlaitNode.get(board, Path.previous(path));
122
- basicNode = MindElement.getNode(previousElement);
123
- const previousRect = getRectangleByNode(basicNode);
124
- const nextElement = PlaitNode.get(board, path);
125
- const nextNode = MindElement.getNode(nextElement);
126
- const nextRect = getRectangleByNode(nextNode);
127
- const beginPlacement = [HorizontalPlacement.left, VerticalPlacement.bottom];
128
- const endPlacement = [HorizontalPlacement.left, VerticalPlacement.top];
129
- linkDirection = getLayoutDirection(basicNode, isHorizontal);
130
- transformPlacement(beginPlacement, linkDirection);
131
- transformPlacement(endPlacement, linkDirection);
132
- const previousPoint = getPointByPlacement(previousRect, beginPlacement);
133
- const nextPoint = getPointByPlacement(nextRect, endPlacement);
134
- centerPoint = [(previousPoint[0] + nextPoint[0]) / 2, (previousPoint[1] + nextPoint[1]) / 2];
135
- }
136
- let cornerPoint = centerPoint, oppositePoint = centerPoint;
137
- const offsetY = isHorizontal ? height : width;
138
- const offsetX = isHorizontal ? width : height;
139
- cornerPoint = moveYOfPoint(cornerPoint, -offsetY / 2, linkDirection);
140
- oppositePoint = moveYOfPoint(oppositePoint, offsetY / 2, linkDirection);
141
- oppositePoint = moveXOfPoint(oppositePoint, offsetX, linkDirection);
142
- const x = Math.min(cornerPoint[0], oppositePoint[0]);
143
- const y = Math.min(cornerPoint[1], oppositePoint[1]);
144
- fakeNode = {
145
- ...basicNode,
146
- x,
147
- y,
148
- width,
149
- height,
150
- hGap: MindElement.isIndentedLayout(parent) ? BASE * 4 + (basicNode.origin.strokeWidth || STROKE_WIDTH) : 0,
151
- vGap: MindElement.isIndentedLayout(parent) ? BASE : 0
152
- };
153
- const fakeRectangleG = drawRoundRectangle(PlaitBoard.getRoughSVG(board), fakeNode.x, fakeNode.y, fakeNode.x + width, fakeNode.y + height, {
154
- stroke: PRIMARY_COLOR,
155
- strokeWidth: 2,
156
- fill: PRIMARY_COLOR,
157
- fillStyle: 'solid'
158
- });
159
- const link = drawLink(board, MindElement.getNode(parent), fakeNode, isHorizontal, false, PRIMARY_COLOR, STROKE_WIDTH);
160
- fakeDropNodeG?.appendChild(link);
161
- fakeDropNodeG?.appendChild(fakeRectangleG);
162
- return fakeDropNodeG;
163
- };
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1kbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9kcmF3L25vZGUtZG5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQWdCLGVBQWUsRUFBRSxXQUFXLEVBQVksU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBUyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBa0IsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTdILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUJBQW1C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QVcsQ0FBQyxLQUFLLENBQUMsRUFDN0IsUUFBUyxDQUFDLENBQUMsRUFDWCxRQUFTLENBQUMsQ0FBQyxFQUNYLFFBQVMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUNuQixRQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFDcEI7UUFDSSxNQUFNLEVBQUUsYUFBYTtRQUNyQixXQUFXLEVBQUUsQ0FBQztRQUNkLElBQUksRUFBRSxhQUFhO1FBQ25CLFNBQVMsRUFBRSxPQUFPO0tBQ3JCLENBQ0osQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdEgsYUFBYSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxhQUFhLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sYUFBYSxDQUFDO0FBQ3pCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRyYXdSb3VuZFJlY3RhbmdsZUJ5Tm9kZSB9IGZyb20gJy4vbm9kZS1zaGFwZSc7XG5pbXBvcnQgeyBCQVNFLCBQUklNQVJZX0NPTE9SLCBTVFJPS0VfV0lEVEggfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRGV0ZWN0UmVzdWx0LCBMYXlvdXREaXJlY3Rpb24sIE1pbmRFbGVtZW50LCBNaW5kTm9kZSwgUGxhaXRNaW5kIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi9wb3NpdGlvbi9ub2RlJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBkcmF3Um91bmRSZWN0YW5nbGUsIGNyZWF0ZUcsIFBhdGgsIFBsYWl0Tm9kZSwgUGxhaXRFbGVtZW50LCB1cGRhdGVGb3JlaWduT2JqZWN0IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZFF1ZXJpZXMgfSBmcm9tICcuLi8uLi9xdWVyaWVzJztcbmltcG9ydCB7IGlzSG9yaXpvbnRhbExheW91dCwgaXNJbmRlbnRlZExheW91dCwgaXNTdGFuZGFyZExheW91dCwgaXNUb3BMYXlvdXQsIE1pbmRMYXlvdXRUeXBlIH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgZ2V0VG9waWNSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi9wb3NpdGlvbi90b3BpYyc7XG5pbXBvcnQgeyBIb3Jpem9udGFsUGxhY2VtZW50LCBQb2ludFBsYWNlbWVudCwgVmVydGljYWxQbGFjZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3R5cGVzJztcbmltcG9ydCB7IGdldExheW91dERpcmVjdGlvbiwgZ2V0UG9pbnRCeVBsYWNlbWVudCwgbW92ZVhPZlBvaW50LCBtb3ZlWU9mUG9pbnQsIHRyYW5zZm9ybVBsYWNlbWVudCB9IGZyb20gJy4uL3BvaW50LXBsYWNlbWVudCc7XG5pbXBvcnQgeyBQbGFpdE1pbmRCb2FyZCB9IGZyb20gJy4uLy4uL3BsdWdpbnMvd2l0aC1taW5kLmJvYXJkJztcbmltcG9ydCB7IGhhc1ByZXZpb3VzT3JOZXh0T2ZEcm9wUGF0aCB9IGZyb20gJy4uL2RuZC9jb21tb24nO1xuaW1wb3J0IHsgZHJhd0xpbmsgfSBmcm9tICcuL25vZGUtbGluay9kcmF3LWxpbmsnO1xuaW1wb3J0IHsgZ2V0RW1vamlGb3JlaWduUmVjdGFuZ2xlIH0gZnJvbSAnLi4vcG9zaXRpb24vZW1vamknO1xuaW1wb3J0IHsgZ2V0SW1hZ2VGb3JlaWduUmVjdGFuZ2xlIH0gZnJvbSAnLi4vcG9zaXRpb24nO1xuaW1wb3J0IHsgSW1hZ2VHZW5lcmF0b3IsIFBsYWl0Q29tbW9uRWxlbWVudFJlZiwgZ2V0Rmlyc3RUZXh0TWFuYWdlIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBOb2RlRW1vamlzR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdG9ycy9ub2RlLWVtb2ppcy5nZW5lcmF0b3InO1xuXG5leHBvcnQgY29uc3QgZHJhd0Zha2VEcmFnTm9kZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogTWluZEVsZW1lbnQsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgcmVmID0gUGxhaXRFbGVtZW50LmdldEVsZW1lbnRSZWY8UGxhaXRDb21tb25FbGVtZW50UmVmPihlbGVtZW50KTtcbiAgICBjb25zdCBtaW5kTm9kZSA9IE1pbmRFbGVtZW50LmdldE5vZGUoZWxlbWVudCk7XG4gICAgY29uc3QgZHJhZ0Zha2VOb2RlRyA9IGNyZWF0ZUcoKTtcbiAgICBkcmFnRmFrZU5vZGVHLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJywgJ2Zha2Utbm9kZScsICdwbGFpdC1ib2FyZC1hdHRhY2hlZCcpO1xuXG4gICAgY29uc3QgZmFrZURyYWdnaW5nTm9kZTogTWluZE5vZGUgPSB7XG4gICAgICAgIC4uLm1pbmROb2RlLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIHg6IG1pbmROb2RlLnggKyBvZmZzZXRYLFxuICAgICAgICB5OiBtaW5kTm9kZS55ICsgb2Zmc2V0WVxuICAgIH07XG4gICAgY29uc3QgdGV4dFJlY3RhbmdsZSA9IGdldFRvcGljUmVjdGFuZ2xlQnlOb2RlKGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCBtaW5kTm9kZSk7XG4gICAgY29uc3QgZmFrZU5vZGVHID0gZHJhd1JvdW5kUmVjdGFuZ2xlQnlOb2RlKGJvYXJkLCBmYWtlRHJhZ2dpbmdOb2RlKTtcblxuICAgIGNvbnN0IHJpY2h0ZXh0RyA9IGdldEZpcnN0VGV4dE1hbmFnZShlbGVtZW50KS5nLmNsb25lTm9kZSh0cnVlKSBhcyBTVkdHRWxlbWVudDtcbiAgICB1cGRhdGVGb3JlaWduT2JqZWN0KHJpY2h0ZXh0RywgdGV4dFJlY3RhbmdsZS53aWR0aCwgdGV4dFJlY3RhbmdsZS5oZWlnaHQsIHRleHRSZWN0YW5nbGUueCArIG9mZnNldFgsIHRleHRSZWN0YW5nbGUueSArIG9mZnNldFkpO1xuXG4gICAgZHJhZ0Zha2VOb2RlRz8uYXBwZW5kKGZha2VOb2RlRyk7XG4gICAgZHJhZ0Zha2VOb2RlRz8uYXBwZW5kKHJpY2h0ZXh0Ryk7XG5cbiAgICAvLyBkcmF3IGVtb2ppc1xuICAgIGlmIChNaW5kRWxlbWVudC5oYXNFbW9qaXMoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3Qgbm9kZUVtb2ppc0dlbmVyYXRvciA9IHJlZi5nZXRHZW5lcmF0b3I8Tm9kZUVtb2ppc0dlbmVyYXRvcj4oTm9kZUVtb2ppc0dlbmVyYXRvci5rZXkpO1xuICAgICAgICBjb25zdCBmYWtlRW1vamlzRyA9IChub2RlRW1vamlzR2VuZXJhdG9yLmcgYXMgU1ZHR0VsZW1lbnQpLmNsb25lTm9kZSh0cnVlKSBhcyBTVkdHRWxlbWVudDtcbiAgICAgICAgY29uc3QgZm9yZWlnblJlY3RhbmdsZSA9IGdldEVtb2ppRm9yZWlnblJlY3RhbmdsZShib2FyZCBhcyBQbGFpdE1pbmRCb2FyZCwgZWxlbWVudCk7XG4gICAgICAgIHVwZGF0ZUZvcmVpZ25PYmplY3QoXG4gICAgICAgICAgICBmYWtlRW1vamlzRyxcbiAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUueCArIG9mZnNldFgsXG4gICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLnkgKyBvZmZzZXRZXG4gICAgICAgICk7XG4gICAgICAgIGRyYWdGYWtlTm9kZUc/LmFwcGVuZChmYWtlRW1vamlzRyk7XG4gICAgfVxuXG4gICAgaWYgKE1pbmRFbGVtZW50Lmhhc0ltYWdlKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGltYWdlR2VuZXJhdG9yID0gcmVmLmdldEdlbmVyYXRvcjxJbWFnZUdlbmVyYXRvcj4oSW1hZ2VHZW5lcmF0b3Iua2V5KTtcbiAgICAgICAgY29uc3QgZmFrZUltYWdlRyA9IChpbWFnZUdlbmVyYXRvci5nIGFzIFNWR0dFbGVtZW50KS5jbG9uZU5vZGUodHJ1ZSkgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGZvcmVpZ25SZWN0YW5nbGUgPSBnZXRJbWFnZUZvcmVpZ25SZWN0YW5nbGUoYm9hcmQgYXMgUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICB1cGRhdGVGb3JlaWduT2JqZWN0KFxuICAgICAgICAgICAgZmFrZUltYWdlRyxcbiAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUueCArIG9mZnNldFgsXG4gICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLnkgKyBvZmZzZXRZXG4gICAgICAgICk7XG4gICAgICAgIGRyYWdGYWtlTm9kZUc/LmFwcGVuZChmYWtlSW1hZ2VHKTtcbiAgICB9XG4gICAgcmV0dXJuIGRyYWdGYWtlTm9kZUc7XG59O1xuXG5leHBvcnQgY29uc3QgZHJhd0Zha2VEcm9wTm9kZSA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBkcm9wVGFyZ2V0OiB7XG4gICAgICAgIHRhcmdldDogTWluZEVsZW1lbnQ7XG4gICAgICAgIGRldGVjdFJlc3VsdDogRGV0ZWN0UmVzdWx0O1xuICAgIH0sXG4gICAgcGF0aDogUGF0aFxuKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZHJvcFRhcmdldC50YXJnZXQ7XG4gICAgY29uc3QgZmFrZURyb3BOb2RlRyA9IGNyZWF0ZUcoKTtcbiAgICBjb25zdCBwYXJlbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnBhcmVudChwYXRoKSkgYXMgTWluZEVsZW1lbnQ7XG4gICAgY29uc3QgbGF5b3V0ID0gTWluZFF1ZXJpZXMuZ2V0TGF5b3V0QnlFbGVtZW50KHBhcmVudCkgYXMgTWluZExheW91dFR5cGU7XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsTGF5b3V0KGxheW91dCk7XG4gICAgY29uc3QgeyBoYXNOZXh0Tm9kZSwgaGFzUHJldmlvdXNOb2RlIH0gPSBoYXNQcmV2aW91c09yTmV4dE9mRHJvcFBhdGgocGFyZW50LCBkcm9wVGFyZ2V0LCBwYXRoKTtcblxuICAgIGNvbnN0IHdpZHRoID0gMzA7XG4gICAgY29uc3QgaGVpZ2h0ID0gMTI7XG4gICAgbGV0IGZha2VOb2RlOiBNaW5kTm9kZSwgY2VudGVyUG9pbnQ6IFBvaW50LCBiYXNpY05vZGU6IE1pbmROb2RlLCBsaW5rRGlyZWN0aW9uOiBMYXlvdXREaXJlY3Rpb247XG5cbiAgICBpZiAoIWhhc1ByZXZpb3VzTm9kZSAmJiAhaGFzTmV4dE5vZGUpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IE1pbmRFbGVtZW50LmdldE5vZGUocGFyZW50KTtcbiAgICAgICAgY29uc3QgcGFyZW50UmVjdCA9IGdldFJlY3RhbmdsZUJ5Tm9kZShwYXJlbnROb2RlKTtcblxuICAgICAgICBsaW5rRGlyZWN0aW9uID0gZ2V0TGF5b3V0RGlyZWN0aW9uKHBhcmVudE5vZGUsIGlzSG9yaXpvbnRhbCk7XG4gICAgICAgIGJhc2ljTm9kZSA9IHBhcmVudE5vZGU7XG5cbiAgICAgICAgaWYgKFBsYWl0TWluZC5pc01pbmQodGFyZ2V0KSAmJiBpc1N0YW5kYXJkTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgbGlua0RpcmVjdGlvbiA9IExheW91dERpcmVjdGlvbi5sZWZ0O1xuICAgICAgICAgICAgICAgIGJhc2ljTm9kZS5sZWZ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGlua0RpcmVjdGlvbiA9IExheW91dERpcmVjdGlvbi5yaWdodDtcbiAgICAgICAgICAgICAgICBiYXNpY05vZGUubGVmdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhY2VtZW50OiBQb2ludFBsYWNlbWVudCA9IFtIb3Jpem9udGFsUGxhY2VtZW50LnJpZ2h0LCBWZXJ0aWNhbFBsYWNlbWVudC5taWRkbGVdO1xuICAgICAgICB0cmFuc2Zvcm1QbGFjZW1lbnQocGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcbiAgICAgICAgY29uc3QgcGFyZW50Q2VudGVyUG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KHBhcmVudFJlY3QsIHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGlzSW5kZW50ZWRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50OiBQb2ludFBsYWNlbWVudCA9IFtcbiAgICAgICAgICAgICAgICBIb3Jpem9udGFsUGxhY2VtZW50LmNlbnRlcixcbiAgICAgICAgICAgICAgICBpc1RvcExheW91dChsYXlvdXQpID8gVmVydGljYWxQbGFjZW1lbnQudG9wIDogVmVydGljYWxQbGFjZW1lbnQuYm90dG9tXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q2VudGVyUG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KHBhcmVudFJlY3QsIHBsYWNlbWVudCk7XG5cbiAgICAgICAgICAgIGNlbnRlclBvaW50ID0gbW92ZVhPZlBvaW50KHBhcmVudENlbnRlclBvaW50LCBoZWlnaHQsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICAgICAgY2VudGVyUG9pbnRbMV0gPSBpc1RvcExheW91dChsYXlvdXQpID8gY2VudGVyUG9pbnRbMV0gLSBoZWlnaHQgOiBjZW50ZXJQb2ludFsxXSArIGhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNlbnRlclBvaW50ID0gbW92ZVhPZlBvaW50KHBhcmVudENlbnRlclBvaW50LCB3aWR0aCwgbGlua0RpcmVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFoYXNQcmV2aW91c05vZGUgJiYgaGFzTmV4dE5vZGUpIHtcbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBwYXRoKSBhcyBNaW5kRWxlbWVudDtcbiAgICAgICAgYmFzaWNOb2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShuZXh0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG5leHRSZWN0ID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKGJhc2ljTm9kZSk7XG4gICAgICAgIGxpbmtEaXJlY3Rpb24gPSBnZXRMYXlvdXREaXJlY3Rpb24oYmFzaWNOb2RlLCBpc0hvcml6b250YWwpO1xuXG4gICAgICAgIGNvbnN0IHBsYWNlbWVudDogUG9pbnRQbGFjZW1lbnQgPSBbSG9yaXpvbnRhbFBsYWNlbWVudC5sZWZ0LCBWZXJ0aWNhbFBsYWNlbWVudC50b3BdO1xuXG4gICAgICAgIHRyYW5zZm9ybVBsYWNlbWVudChwbGFjZW1lbnQsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgICAgIGxldCBvZmZzZXQgPSAtaGVpZ2h0O1xuICAgICAgICBpZiAoTWluZEVsZW1lbnQuaXNJbmRlbnRlZExheW91dChwYXJlbnQpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBpc1RvcExheW91dChsYXlvdXQpID8gb2Zmc2V0IC8gMiArIGJhc2ljTm9kZS5oZWlnaHQgLSBiYXNpY05vZGUudkdhcCA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjZW50ZXJQb2ludCA9IGdldFBvaW50QnlQbGFjZW1lbnQobmV4dFJlY3QsIHBsYWNlbWVudCk7XG4gICAgICAgIGNlbnRlclBvaW50ID0gbW92ZVlPZlBvaW50KGNlbnRlclBvaW50LCBvZmZzZXQsIGxpbmtEaXJlY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAoaGFzUHJldmlvdXNOb2RlICYmICFoYXNOZXh0Tm9kZSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnByZXZpb3VzKHBhdGgpKSBhcyBNaW5kRWxlbWVudDtcbiAgICAgICAgYmFzaWNOb2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShwcmV2aW91c0VsZW1lbnQpO1xuICAgICAgICBjb25zdCBwcmV2aW91c1JlY3QgPSBnZXRSZWN0YW5nbGVCeU5vZGUoYmFzaWNOb2RlKTtcbiAgICAgICAgbGlua0RpcmVjdGlvbiA9IGdldExheW91dERpcmVjdGlvbihiYXNpY05vZGUsIGlzSG9yaXpvbnRhbCk7XG5cbiAgICAgICAgY29uc3QgcGxhY2VtZW50OiBQb2ludFBsYWNlbWVudCA9IFtIb3Jpem9udGFsUGxhY2VtZW50LmxlZnQsIFZlcnRpY2FsUGxhY2VtZW50LmJvdHRvbV07XG5cbiAgICAgICAgdHJhbnNmb3JtUGxhY2VtZW50KHBsYWNlbWVudCwgbGlua0RpcmVjdGlvbik7XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IGhlaWdodDtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50LmlzSW5kZW50ZWRMYXlvdXQocGFyZW50KSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gaXNUb3BMYXlvdXQobGF5b3V0KSA/IC1vZmZzZXQgLSAoYmFzaWNOb2RlLmhlaWdodCAtIGJhc2ljTm9kZS52R2FwKSA6IG9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBjZW50ZXJQb2ludCA9IGdldFBvaW50QnlQbGFjZW1lbnQocHJldmlvdXNSZWN0LCBwbGFjZW1lbnQpO1xuICAgICAgICBjZW50ZXJQb2ludCA9IG1vdmVZT2ZQb2ludChjZW50ZXJQb2ludCwgb2Zmc2V0LCBsaW5rRGlyZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnByZXZpb3VzKHBhdGgpKSBhcyBNaW5kRWxlbWVudDtcbiAgICAgICAgYmFzaWNOb2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShwcmV2aW91c0VsZW1lbnQpO1xuICAgICAgICBjb25zdCBwcmV2aW91c1JlY3QgPSBnZXRSZWN0YW5nbGVCeU5vZGUoYmFzaWNOb2RlKTtcblxuICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IFBsYWl0Tm9kZS5nZXQoYm9hcmQsIHBhdGgpIGFzIE1pbmRFbGVtZW50O1xuICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IE1pbmRFbGVtZW50LmdldE5vZGUobmV4dEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBuZXh0UmVjdCA9IGdldFJlY3RhbmdsZUJ5Tm9kZShuZXh0Tm9kZSk7XG5cbiAgICAgICAgY29uc3QgYmVnaW5QbGFjZW1lbnQ6IFBvaW50UGxhY2VtZW50ID0gW0hvcml6b250YWxQbGFjZW1lbnQubGVmdCwgVmVydGljYWxQbGFjZW1lbnQuYm90dG9tXTtcbiAgICAgICAgY29uc3QgZW5kUGxhY2VtZW50OiBQb2ludFBsYWNlbWVudCA9IFtIb3Jpem9udGFsUGxhY2VtZW50LmxlZnQsIFZlcnRpY2FsUGxhY2VtZW50LnRvcF07XG4gICAgICAgIGxpbmtEaXJlY3Rpb24gPSBnZXRMYXlvdXREaXJlY3Rpb24oYmFzaWNOb2RlLCBpc0hvcml6b250YWwpO1xuXG4gICAgICAgIHRyYW5zZm9ybVBsYWNlbWVudChiZWdpblBsYWNlbWVudCwgbGlua0RpcmVjdGlvbik7XG4gICAgICAgIHRyYW5zZm9ybVBsYWNlbWVudChlbmRQbGFjZW1lbnQsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KHByZXZpb3VzUmVjdCwgYmVnaW5QbGFjZW1lbnQpO1xuICAgICAgICBjb25zdCBuZXh0UG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KG5leHRSZWN0LCBlbmRQbGFjZW1lbnQpO1xuXG4gICAgICAgIGNlbnRlclBvaW50ID0gWyhwcmV2aW91c1BvaW50WzBdICsgbmV4dFBvaW50WzBdKSAvIDIsIChwcmV2aW91c1BvaW50WzFdICsgbmV4dFBvaW50WzFdKSAvIDJdO1xuICAgIH1cblxuICAgIGxldCBjb3JuZXJQb2ludCA9IGNlbnRlclBvaW50LFxuICAgICAgICBvcHBvc2l0ZVBvaW50ID0gY2VudGVyUG9pbnQ7XG5cbiAgICBjb25zdCBvZmZzZXRZID0gaXNIb3Jpem9udGFsID8gaGVpZ2h0IDogd2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0WCA9IGlzSG9yaXpvbnRhbCA/IHdpZHRoIDogaGVpZ2h0O1xuXG4gICAgY29ybmVyUG9pbnQgPSBtb3ZlWU9mUG9pbnQoY29ybmVyUG9pbnQsIC1vZmZzZXRZIC8gMiwgbGlua0RpcmVjdGlvbiEpO1xuXG4gICAgb3Bwb3NpdGVQb2ludCA9IG1vdmVZT2ZQb2ludChvcHBvc2l0ZVBvaW50LCBvZmZzZXRZIC8gMiwgbGlua0RpcmVjdGlvbiEpO1xuICAgIG9wcG9zaXRlUG9pbnQgPSBtb3ZlWE9mUG9pbnQob3Bwb3NpdGVQb2ludCwgb2Zmc2V0WCwgbGlua0RpcmVjdGlvbiEpO1xuXG4gICAgY29uc3QgeCA9IE1hdGgubWluKGNvcm5lclBvaW50WzBdLCBvcHBvc2l0ZVBvaW50WzBdKTtcbiAgICBjb25zdCB5ID0gTWF0aC5taW4oY29ybmVyUG9pbnRbMV0sIG9wcG9zaXRlUG9pbnRbMV0pO1xuXG4gICAgZmFrZU5vZGUgPSB7XG4gICAgICAgIC4uLmJhc2ljTm9kZSEsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGhHYXA6IE1pbmRFbGVtZW50LmlzSW5kZW50ZWRMYXlvdXQocGFyZW50KSA/IEJBU0UgKiA0ICsgKGJhc2ljTm9kZS5vcmlnaW4uc3Ryb2tlV2lkdGggfHwgU1RST0tFX1dJRFRIKSA6IDAsXG4gICAgICAgIHZHYXA6IE1pbmRFbGVtZW50LmlzSW5kZW50ZWRMYXlvdXQocGFyZW50KSA/IEJBU0UgOiAwXG4gICAgfTtcblxuICAgIGNvbnN0IGZha2VSZWN0YW5nbGVHID0gZHJhd1JvdW5kUmVjdGFuZ2xlKFxuICAgICAgICBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKSxcbiAgICAgICAgZmFrZU5vZGUhLngsXG4gICAgICAgIGZha2VOb2RlIS55LFxuICAgICAgICBmYWtlTm9kZSEueCArIHdpZHRoLFxuICAgICAgICBmYWtlTm9kZSEueSArIGhlaWdodCxcbiAgICAgICAge1xuICAgICAgICAgICAgc3Ryb2tlOiBQUklNQVJZX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICBmaWxsOiBQUklNQVJZX0NPTE9SLFxuICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgbGluayA9IGRyYXdMaW5rKGJvYXJkLCBNaW5kRWxlbWVudC5nZXROb2RlKHBhcmVudCksIGZha2VOb2RlLCBpc0hvcml6b250YWwsIGZhbHNlLCBQUklNQVJZX0NPTE9SLCBTVFJPS0VfV0lEVEgpO1xuICAgIGZha2VEcm9wTm9kZUc/LmFwcGVuZENoaWxkKGxpbmspO1xuICAgIGZha2VEcm9wTm9kZUc/LmFwcGVuZENoaWxkKGZha2VSZWN0YW5nbGVHKTtcblxuICAgIHJldHVybiBmYWtlRHJvcE5vZGVHO1xufTtcbiJdfQ==