@plait/common 0.1.0-next.1 → 0.1.0-next.10
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.
- package/constants/default.d.ts +1 -0
- package/constants/media.d.ts +3 -0
- package/constants/resize.d.ts +1 -1
- package/core/image-base.component.d.ts +29 -0
- package/core/plugin-element.d.ts +7 -0
- package/{esm2020 → esm2022}/constants/default.mjs +2 -1
- package/esm2022/constants/media.mjs +8 -0
- package/esm2022/constants/resize.mjs +19 -0
- package/esm2022/core/image-base.component.mjs +93 -0
- package/esm2022/core/plugin-element.mjs +14 -0
- package/esm2022/generators/active.generator.mjs +46 -0
- package/esm2022/generators/generator.mjs +42 -0
- package/esm2022/generators/image.generator.mjs +54 -0
- package/esm2022/generators/index.mjs +4 -0
- package/esm2022/plugins/index.mjs +3 -0
- package/esm2022/plugins/text-options.mjs +2 -0
- package/esm2022/plugins/with-resize.mjs +101 -0
- package/esm2022/public-api.mjs +12 -0
- package/esm2022/shapes/common.mjs +14 -0
- package/esm2022/shapes/index.mjs +2 -0
- package/esm2022/transforms/common.mjs +15 -0
- package/esm2022/transforms/index.mjs +2 -0
- package/esm2022/transforms/property.mjs +21 -0
- package/esm2022/utils/creation-mode.mjs +19 -0
- package/esm2022/utils/direction.mjs +95 -0
- package/esm2022/utils/hot-key.mjs +29 -0
- package/esm2022/utils/image.mjs +40 -0
- package/esm2022/utils/index.mjs +9 -0
- package/esm2022/utils/line-path.mjs +146 -0
- package/esm2022/utils/rectangle.mjs +16 -0
- package/esm2022/utils/resize.mjs +61 -0
- package/esm2022/utils/text.mjs +11 -0
- package/fesm2022/plait-common.mjs +840 -0
- package/fesm2022/plait-common.mjs.map +1 -0
- package/{generator → generators}/active.generator.d.ts +4 -2
- package/{generator → generators}/generator.d.ts +1 -0
- package/generators/image.generator.d.ts +23 -0
- package/{generator → generators}/index.d.ts +1 -0
- package/package.json +7 -12
- package/plugins/index.d.ts +1 -0
- package/plugins/text-options.d.ts +5 -0
- package/plugins/with-resize.d.ts +12 -14
- package/public-api.d.ts +4 -3
- package/{shape → shapes}/common.d.ts +1 -1
- package/transforms/common.d.ts +2 -0
- package/transforms/index.d.ts +1 -3
- package/transforms/property.d.ts +8 -0
- package/utils/creation-mode.d.ts +9 -0
- package/utils/direction.d.ts +29 -0
- package/utils/hot-key.d.ts +6 -0
- package/utils/image.d.ts +12 -0
- package/utils/index.d.ts +7 -0
- package/utils/line-path.d.ts +17 -0
- package/utils/rectangle.d.ts +7 -0
- package/utils/resize.d.ts +12 -10
- package/utils/text.d.ts +3 -0
- package/esm2020/constants/media.mjs +0 -5
- package/esm2020/constants/resize.mjs +0 -19
- package/esm2020/generator/active.generator.mjs +0 -40
- package/esm2020/generator/generator.mjs +0 -29
- package/esm2020/generator/index.mjs +0 -3
- package/esm2020/plugins/index.mjs +0 -2
- package/esm2020/plugins/with-resize.mjs +0 -93
- package/esm2020/public-api.mjs +0 -11
- package/esm2020/rectangle.mjs +0 -16
- package/esm2020/shape/common.mjs +0 -6
- package/esm2020/shape/index.mjs +0 -2
- package/esm2020/transforms/element.mjs +0 -17
- package/esm2020/transforms/index.mjs +0 -5
- package/esm2020/utils/index.mjs +0 -2
- package/esm2020/utils/resize.mjs +0 -69
- package/fesm2015/plait-common.mjs +0 -304
- package/fesm2015/plait-common.mjs.map +0 -1
- package/fesm2020/plait-common.mjs +0 -304
- package/fesm2020/plait-common.mjs.map +0 -1
- package/rectangle.d.ts +0 -4
- package/transforms/element.d.ts +0 -2
- /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plait-common.mjs +0 -0
- /package/{shape → shapes}/index.d.ts +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { setProperty } from './common';
|
|
2
|
+
const setStrokeStyle = (board, strokeStyle) => {
|
|
3
|
+
setProperty(board, { strokeStyle });
|
|
4
|
+
};
|
|
5
|
+
const setFillColor = (board, fill) => {
|
|
6
|
+
setProperty(board, { fill });
|
|
7
|
+
};
|
|
8
|
+
const setStrokeColor = (board, strokeColor) => {
|
|
9
|
+
setProperty(board, { strokeColor });
|
|
10
|
+
};
|
|
11
|
+
const setStrokeWidth = (board, strokeWidth) => {
|
|
12
|
+
setProperty(board, { strokeWidth });
|
|
13
|
+
};
|
|
14
|
+
export const PropertyTransforms = {
|
|
15
|
+
setFillColor,
|
|
16
|
+
setStrokeStyle,
|
|
17
|
+
setProperty,
|
|
18
|
+
setStrokeWidth,
|
|
19
|
+
setStrokeColor
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3RyYW5zZm9ybXMvcHJvcGVydHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2QyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQzlELFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBaUIsRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUNyRCxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQzlELFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBaUIsRUFBRSxXQUFtQixFQUFFLEVBQUU7SUFDOUQsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDeEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDOUIsWUFBWTtJQUNaLGNBQWM7SUFDZCxXQUFXO0lBQ1gsY0FBYztJQUNkLGNBQWM7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhdGgsIFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudCwgUGxhaXRQbHVnaW5FbGVtZW50Q29tcG9uZW50LCBUcmFuc2Zvcm1zLCBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgc2V0UHJvcGVydHkgfSBmcm9tICcuL2NvbW1vbic7XG5cbmNvbnN0IHNldFN0cm9rZVN0eWxlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBzdHJva2VTdHlsZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0UHJvcGVydHkoYm9hcmQsIHsgc3Ryb2tlU3R5bGUgfSk7XG59O1xuXG5jb25zdCBzZXRGaWxsQ29sb3IgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGZpbGw6IHN0cmluZykgPT4ge1xuICAgIHNldFByb3BlcnR5KGJvYXJkLCB7IGZpbGwgfSk7XG59O1xuXG5jb25zdCBzZXRTdHJva2VDb2xvciA9IChib2FyZDogUGxhaXRCb2FyZCwgc3Ryb2tlQ29sb3I6IHN0cmluZykgPT4ge1xuICAgIHNldFByb3BlcnR5KGJvYXJkLCB7IHN0cm9rZUNvbG9yIH0pO1xufTtcblxuY29uc3Qgc2V0U3Ryb2tlV2lkdGggPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHN0cm9rZVdpZHRoOiBudW1iZXIpID0+IHtcbiAgICBzZXRQcm9wZXJ0eShib2FyZCwgeyBzdHJva2VXaWR0aCB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBQcm9wZXJ0eVRyYW5zZm9ybXMgPSB7XG4gICAgc2V0RmlsbENvbG9yLFxuICAgIHNldFN0cm9rZVN0eWxlLFxuICAgIHNldFByb3BlcnR5LFxuICAgIHNldFN0cm9rZVdpZHRoLFxuICAgIHNldFN0cm9rZUNvbG9yXG59O1xuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export var BoardCreationMode;
|
|
2
|
+
(function (BoardCreationMode) {
|
|
3
|
+
BoardCreationMode["dnd"] = "dnd";
|
|
4
|
+
BoardCreationMode["drawing"] = "drawing";
|
|
5
|
+
})(BoardCreationMode || (BoardCreationMode = {}));
|
|
6
|
+
const BOARD_TO_CREATION_MODE = new WeakMap();
|
|
7
|
+
export const getCreationMode = (board) => {
|
|
8
|
+
return BOARD_TO_CREATION_MODE.get(board);
|
|
9
|
+
};
|
|
10
|
+
export const setCreationMode = (board, mode) => {
|
|
11
|
+
BOARD_TO_CREATION_MODE.set(board, mode);
|
|
12
|
+
};
|
|
13
|
+
export const isDndMode = (board) => {
|
|
14
|
+
return getCreationMode(board) === BoardCreationMode.dnd;
|
|
15
|
+
};
|
|
16
|
+
export const isDrawingMode = (board) => {
|
|
17
|
+
return getCreationMode(board) === BoardCreationMode.drawing;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRpb24tbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvY3JlYXRpb24tbW9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQU4sSUFBWSxpQkFHWDtBQUhELFdBQVksaUJBQWlCO0lBQ3pCLGdDQUFhLENBQUE7SUFDYix3Q0FBcUIsQ0FBQTtBQUN6QixDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QjtBQUVELE1BQU0sc0JBQXNCLEdBQTJDLElBQUksT0FBTyxFQUFFLENBQUM7QUFFckYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQ2pELE9BQU8sc0JBQXNCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWlCLEVBQUUsSUFBdUIsRUFBRSxFQUFFO0lBQzFFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQzNDLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztBQUM1RCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDL0MsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssaUJBQWlCLENBQUMsT0FBTyxDQUFDO0FBQ2hFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5cbmV4cG9ydCBlbnVtIEJvYXJkQ3JlYXRpb25Nb2RlIHtcbiAgICAnZG5kJyA9ICdkbmQnLFxuICAgICdkcmF3aW5nJyA9ICdkcmF3aW5nJ1xufVxuXG5jb25zdCBCT0FSRF9UT19DUkVBVElPTl9NT0RFOiBXZWFrTWFwPFBsYWl0Qm9hcmQsIEJvYXJkQ3JlYXRpb25Nb2RlPiA9IG5ldyBXZWFrTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRDcmVhdGlvbk1vZGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICByZXR1cm4gQk9BUkRfVE9fQ1JFQVRJT05fTU9ERS5nZXQoYm9hcmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENyZWF0aW9uTW9kZSA9IChib2FyZDogUGxhaXRCb2FyZCwgbW9kZTogQm9hcmRDcmVhdGlvbk1vZGUpID0+IHtcbiAgICBCT0FSRF9UT19DUkVBVElPTl9NT0RFLnNldChib2FyZCwgbW9kZSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNEbmRNb2RlID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuIGdldENyZWF0aW9uTW9kZShib2FyZCkgPT09IEJvYXJkQ3JlYXRpb25Nb2RlLmRuZDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0RyYXdpbmdNb2RlID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuIGdldENyZWF0aW9uTW9kZShib2FyZCkgPT09IEJvYXJkQ3JlYXRpb25Nb2RlLmRyYXdpbmc7XG59O1xuIl19
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Direction, distanceBetweenPointAndPoint } from '@plait/core';
|
|
2
|
+
const handleDirectionFactors = {
|
|
3
|
+
[Direction.left]: { x: -1, y: 0 },
|
|
4
|
+
[Direction.right]: { x: 1, y: 0 },
|
|
5
|
+
[Direction.top]: { x: 0, y: -1 },
|
|
6
|
+
[Direction.bottom]: { x: 0, y: 1 }
|
|
7
|
+
};
|
|
8
|
+
export function getDirectionByPointOfRectangle(point) {
|
|
9
|
+
if (point[0] === 0) {
|
|
10
|
+
return Direction.left;
|
|
11
|
+
}
|
|
12
|
+
if (point[0] === 1) {
|
|
13
|
+
return Direction.right;
|
|
14
|
+
}
|
|
15
|
+
if (point[1] === 0) {
|
|
16
|
+
return Direction.top;
|
|
17
|
+
}
|
|
18
|
+
if (point[1] === 1) {
|
|
19
|
+
return Direction.bottom;
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* this function accepts vector parameter, the vector parameter vector is based on the screen coordinate system
|
|
25
|
+
* vector[0] and vector[1] are the x and y components of the vector respectively.
|
|
26
|
+
* if the vector has only one direction, the function returns a string in that direction, such as 'right', 'top', 'bottom' or 'left'.
|
|
27
|
+
* if the vector has two directions, the function will return the string in which direction it is closer.
|
|
28
|
+
*/
|
|
29
|
+
export function getDirectionByVector(vector) {
|
|
30
|
+
const x = vector[0];
|
|
31
|
+
const y = vector[1];
|
|
32
|
+
if (x === 0 && y === 0) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (x === 0) {
|
|
36
|
+
return y > 0 ? Direction.bottom : Direction.top;
|
|
37
|
+
}
|
|
38
|
+
if (y === 0) {
|
|
39
|
+
return x > 0 ? Direction.right : Direction.left;
|
|
40
|
+
}
|
|
41
|
+
const angle = Math.atan2(y, x);
|
|
42
|
+
if (angle > -Math.PI / 4 && angle <= Math.PI / 4) {
|
|
43
|
+
return Direction.right;
|
|
44
|
+
}
|
|
45
|
+
else if (angle > Math.PI / 4 && angle <= (3 * Math.PI) / 4) {
|
|
46
|
+
return Direction.bottom;
|
|
47
|
+
}
|
|
48
|
+
else if (angle > (-3 * Math.PI) / 4 && angle <= -Math.PI / 4) {
|
|
49
|
+
return Direction.top;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return Direction.left;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function getPointByVector(point, vector, offset) {
|
|
56
|
+
const distance = Math.hypot(vector[0], vector[1]);
|
|
57
|
+
return [point[0] + (vector[0] / distance) * offset, point[1] + (vector[1] / distance) * offset];
|
|
58
|
+
}
|
|
59
|
+
export function rotateVectorAnti90(vector) {
|
|
60
|
+
const x = vector[0];
|
|
61
|
+
const y = vector[1];
|
|
62
|
+
const rotatedX = y;
|
|
63
|
+
const rotatedY = -x;
|
|
64
|
+
return [rotatedX, rotatedY];
|
|
65
|
+
}
|
|
66
|
+
export function getDirectionBetweenPointAndPoint(source, target) {
|
|
67
|
+
if (source[0] === target[0]) {
|
|
68
|
+
if (source[1] >= target[1]) {
|
|
69
|
+
return Direction.top;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return Direction.bottom;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (source[1] === target[1]) {
|
|
76
|
+
if (source[0] >= target[0]) {
|
|
77
|
+
return Direction.left;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return Direction.right;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
throw new Error('can not match direction');
|
|
84
|
+
}
|
|
85
|
+
export function getDirectionFactor(direction) {
|
|
86
|
+
return handleDirectionFactors[direction];
|
|
87
|
+
}
|
|
88
|
+
export function getFactorByPoints(source, target) {
|
|
89
|
+
const distance = distanceBetweenPointAndPoint(...source, ...target);
|
|
90
|
+
return {
|
|
91
|
+
x: (target[0] - source[0]) / distance,
|
|
92
|
+
y: (target[1] - source[1]) / distance
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9kaXJlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBbUMsNEJBQTRCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkcsTUFBTSxzQkFBc0IsR0FBRztJQUMzQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDaEMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDckMsQ0FBQztBQUVGLE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxLQUF1QjtJQUNsRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDaEIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDO0tBQ3pCO0lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQztLQUMxQjtJQUNELElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUM7S0FDeEI7SUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDaEIsT0FBTyxTQUFT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Q0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUM7U0FDeEI7YUFBTTtZQUNILE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztTQUMzQjtLQUNKO0lBQ0QsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3pCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUM7U0FDekI7YUFBTTtZQUNILE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQztTQUMxQjtLQUNKO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBb0I7SUFDbkQsT0FBTyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQWEsRUFBRSxNQUFhO0lBQzFELE1BQU0sUUFBUSxHQUFHLDRCQUE0QixDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDcEUsT0FBTztRQUNILENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRO1FBQ3JDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRO0tBQ3hDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aW9uLCBQb2ludCwgUG9pbnRPZlJlY3RhbmdsZSwgVmVjdG9yLCBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuXG5jb25zdCBoYW5kbGVEaXJlY3Rpb25GYWN0b3JzID0ge1xuICAgIFtEaXJlY3Rpb24ubGVmdF06IHsgeDogLTEsIHk6IDAgfSxcbiAgICBbRGlyZWN0aW9uLnJpZ2h0XTogeyB4OiAxLCB5OiAwIH0sXG4gICAgW0RpcmVjdGlvbi50b3BdOiB7IHg6IDAsIHk6IC0xIH0sXG4gICAgW0RpcmVjdGlvbi5ib3R0b21dOiB7IHg6IDAsIHk6IDEgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpcmVjdGlvbkJ5UG9pbnRPZlJlY3RhbmdsZShwb2ludDogUG9pbnRPZlJlY3RhbmdsZSk6IERpcmVjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHBvaW50WzBdID09PSAwKSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24ubGVmdDtcbiAgICB9XG4gICAgaWYgKHBvaW50WzBdID09PSAxKSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24ucmlnaHQ7XG4gICAgfVxuICAgIGlmIChwb2ludFsxXSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gRGlyZWN0aW9uLnRvcDtcbiAgICB9XG4gICAgaWYgKHBvaW50WzFdID09PSAxKSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24uYm90dG9tO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIHRoaXMgZnVuY3Rpb24gYWNjZXB0cyB2ZWN0b3IgcGFyYW1ldGVyLCB0aGUgdmVjdG9yIHBhcmFtZXRlciB2ZWN0b3IgaXMgYmFzZWQgb24gdGhlIHNjcmVlbiBjb29yZGluYXRlIHN5c3RlbVxuICogdmVjdG9yWzBdIGFuZCB2ZWN0b3JbMV0gYXJlIHRoZSB4IGFuZCB5IGNvbXBvbmVudHMgb2YgdGhlIHZlY3RvciByZXNwZWN0aXZlbHkuXG4gKiBpZiB0aGUgdmVjdG9yIGhhcyBvbmx5IG9uZSBkaXJlY3Rpb24sIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIGluIHRoYXQgZGlyZWN0aW9uLCBzdWNoIGFzICdyaWdodCcsICd0b3AnLCAnYm90dG9tJyBvciAnbGVmdCcuXG4gKiBpZiB0aGUgdmVjdG9yIGhhcyB0d28gZGlyZWN0aW9ucywgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgaW4gd2hpY2ggZGlyZWN0aW9uIGl0IGlzIGNsb3Nlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpcmVjdGlvbkJ5VmVjdG9yKHZlY3RvcjogVmVjdG9yKTogRGlyZWN0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgeCA9IHZlY3RvclswXTtcbiAgICBjb25zdCB5ID0gdmVjdG9yWzFdO1xuICAgIGlmICh4ID09PSAwICYmIHkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB5ID4gMCA/IERpcmVjdGlvbi5ib3R0b20gOiBEaXJlY3Rpb24udG9wO1xuICAgIH1cbiAgICBpZiAoeSA9PT0gMCkge1xuICAgICAgICByZXR1cm4geCA+IDAgPyBEaXJlY3Rpb24ucmlnaHQgOiBEaXJlY3Rpb24ubGVmdDtcbiAgICB9XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKHksIHgpO1xuICAgIGlmIChhbmdsZSA+IC1NYXRoLlBJIC8gNCAmJiBhbmdsZSA8PSBNYXRoLlBJIC8gNCkge1xuICAgICAgICByZXR1cm4gRGlyZWN0aW9uLnJpZ2h0O1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPiBNYXRoLlBJIC8gNCAmJiBhbmdsZSA8PSAoMyAqIE1hdGguUEkpIC8gNCkge1xuICAgICAgICByZXR1cm4gRGlyZWN0aW9uLmJvdHRvbTtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlID4gKC0zICogTWF0aC5QSSkgLyA0ICYmIGFuZ2xlIDw9IC1NYXRoLlBJIC8gNCkge1xuICAgICAgICByZXR1cm4gRGlyZWN0aW9uLnRvcDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRGlyZWN0aW9uLmxlZnQ7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnRCeVZlY3Rvcihwb2ludDogUG9pbnQsIHZlY3RvcjogVmVjdG9yLCBvZmZzZXQ6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguaHlwb3QodmVjdG9yWzBdLCB2ZWN0b3JbMV0pO1xuICAgIHJldHVybiBbcG9pbnRbMF0gKyAodmVjdG9yWzBdIC8gZGlzdGFuY2UpICogb2Zmc2V0LCBwb2ludFsxXSArICh2ZWN0b3JbMV0gLyBkaXN0YW5jZSkgKiBvZmZzZXRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlVmVjdG9yQW50aTkwKHZlY3RvcjogVmVjdG9yKTogVmVjdG9yIHtcbiAgICBjb25zdCB4ID0gdmVjdG9yWzBdO1xuICAgIGNvbnN0IHkgPSB2ZWN0b3JbMV07XG4gICAgY29uc3Qgcm90YXRlZFggPSB5O1xuICAgIGNvbnN0IHJvdGF0ZWRZID0gLXg7XG4gICAgcmV0dXJuIFtyb3RhdGVkWCwgcm90YXRlZFldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uQmV0d2VlblBvaW50QW5kUG9pbnQoc291cmNlOiBQb2ludCwgdGFyZ2V0OiBQb2ludCkge1xuICAgIGlmIChzb3VyY2VbMF0gPT09IHRhcmdldFswXSkge1xuICAgICAgICBpZiAoc291cmNlWzFdID49IHRhcmdldFsxXSkge1xuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi50b3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLmJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc291cmNlWzFdID09PSB0YXJnZXRbMV0pIHtcbiAgICAgICAgaWYgKHNvdXJjZVswXSA+PSB0YXJnZXRbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24ubGVmdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24ucmlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IG1hdGNoIGRpcmVjdGlvbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uRmFjdG9yKGRpcmVjdGlvbjogRGlyZWN0aW9uKSB7XG4gICAgcmV0dXJuIGhhbmRsZURpcmVjdGlvbkZhY3RvcnNbZGlyZWN0aW9uXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhY3RvckJ5UG9pbnRzKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQpIHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uc291cmNlLCAuLi50YXJnZXQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6ICh0YXJnZXRbMF0gLSBzb3VyY2VbMF0pIC8gZGlzdGFuY2UsXG4gICAgICAgIHk6ICh0YXJnZXRbMV0gLSBzb3VyY2VbMV0pIC8gZGlzdGFuY2VcbiAgICB9O1xufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { hotkeys } from '@plait/core';
|
|
2
|
+
import { isKeyHotkey } from 'is-hotkey';
|
|
3
|
+
export function isVirtualKey(e) {
|
|
4
|
+
const isMod = e.ctrlKey || e.metaKey;
|
|
5
|
+
const isAlt = isKeyHotkey('alt', e);
|
|
6
|
+
const isShift = isKeyHotkey('shift', e);
|
|
7
|
+
const isCapsLock = e.key.includes('CapsLock');
|
|
8
|
+
const isTab = e.key.includes('Tab');
|
|
9
|
+
const isEsc = e.key.includes('Escape');
|
|
10
|
+
const isF = e.key.startsWith('F');
|
|
11
|
+
const isArrow = e.key.includes('Arrow') ? true : false;
|
|
12
|
+
return isCapsLock || isMod || isAlt || isArrow || isShift || isTab || isEsc || isF;
|
|
13
|
+
}
|
|
14
|
+
export const isExpandHotkey = (event) => {
|
|
15
|
+
return isKeyHotkey('mod+/', event);
|
|
16
|
+
};
|
|
17
|
+
export const isTabHotkey = (event) => {
|
|
18
|
+
return event.key === 'Tab';
|
|
19
|
+
};
|
|
20
|
+
export const isEnterHotkey = (event) => {
|
|
21
|
+
return event.key === 'Enter';
|
|
22
|
+
};
|
|
23
|
+
export const isSpaceHotkey = (event) => {
|
|
24
|
+
return event.code === 'Space';
|
|
25
|
+
};
|
|
26
|
+
export const isDelete = (event) => {
|
|
27
|
+
return hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event);
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90LWtleS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvaG90LWtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEMsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFnQjtJQUN6QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN2RCxPQUFPLFVBQVUsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxHQUFHLENBQUM7QUFDdkYsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtJQUNuRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO0lBQ2hELE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO0lBQ2xELE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUM7QUFDakMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO0lBQ2xELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO0lBQzdDLE9BQU8sT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0UsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaG90a2V5cyB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IGlzS2V5SG90a2V5IH0gZnJvbSAnaXMtaG90a2V5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlydHVhbEtleShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgaXNNb2QgPSBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5O1xuICAgIGNvbnN0IGlzQWx0ID0gaXNLZXlIb3RrZXkoJ2FsdCcsIGUpO1xuICAgIGNvbnN0IGlzU2hpZnQgPSBpc0tleUhvdGtleSgnc2hpZnQnLCBlKTtcbiAgICBjb25zdCBpc0NhcHNMb2NrID0gZS5rZXkuaW5jbHVkZXMoJ0NhcHNMb2NrJyk7XG4gICAgY29uc3QgaXNUYWIgPSBlLmtleS5pbmNsdWRlcygnVGFiJyk7XG4gICAgY29uc3QgaXNFc2MgPSBlLmtleS5pbmNsdWRlcygnRXNjYXBlJyk7XG4gICAgY29uc3QgaXNGID0gZS5rZXkuc3RhcnRzV2l0aCgnRicpO1xuICAgIGNvbnN0IGlzQXJyb3cgPSBlLmtleS5pbmNsdWRlcygnQXJyb3cnKSA/IHRydWUgOiBmYWxzZTtcbiAgICByZXR1cm4gaXNDYXBzTG9jayB8fCBpc01vZCB8fCBpc0FsdCB8fCBpc0Fycm93IHx8IGlzU2hpZnQgfHwgaXNUYWIgfHwgaXNFc2MgfHwgaXNGO1xufVxuXG5leHBvcnQgY29uc3QgaXNFeHBhbmRIb3RrZXkgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICByZXR1cm4gaXNLZXlIb3RrZXkoJ21vZCsvJywgZXZlbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVGFiSG90a2V5ID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgcmV0dXJuIGV2ZW50LmtleSA9PT0gJ1RhYic7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFbnRlckhvdGtleSA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIHJldHVybiBldmVudC5rZXkgPT09ICdFbnRlcic7XG59O1xuXG5leHBvcnQgY29uc3QgaXNTcGFjZUhvdGtleSA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIHJldHVybiBldmVudC5jb2RlID09PSAnU3BhY2UnO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRGVsZXRlID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgcmV0dXJuIGhvdGtleXMuaXNEZWxldGVCYWNrd2FyZChldmVudCkgfHwgaG90a2V5cy5pc0RlbGV0ZUZvcndhcmQoZXZlbnQpO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PlaitBoard, PlaitContextService } from '@plait/core';
|
|
2
|
+
export const selectImage = (board, defaultImageWidth, handle, acceptImageTypes = ['png', 'jpeg', 'gif', 'bmp']) => {
|
|
3
|
+
const inputFile = document.createElement('input');
|
|
4
|
+
inputFile.setAttribute('type', 'file');
|
|
5
|
+
const acceptImageTypesString = '.' + acceptImageTypes.join(',.');
|
|
6
|
+
inputFile.setAttribute('accept', acceptImageTypesString);
|
|
7
|
+
inputFile.onchange = (event) => {
|
|
8
|
+
buildImage(board, event.target.files[0], defaultImageWidth, handle);
|
|
9
|
+
};
|
|
10
|
+
inputFile.click();
|
|
11
|
+
};
|
|
12
|
+
export const buildImage = async (board, imageFile, defaultImageWidth, handle) => {
|
|
13
|
+
let width = 0, height = 0;
|
|
14
|
+
await getImageSize(imageFile, defaultImageWidth).then((value) => {
|
|
15
|
+
width = value.width;
|
|
16
|
+
height = value.height;
|
|
17
|
+
});
|
|
18
|
+
let imageItem = null;
|
|
19
|
+
const url = URL.createObjectURL(imageFile);
|
|
20
|
+
const context = PlaitBoard.getComponent(board).viewContainerRef.injector.get(PlaitContextService);
|
|
21
|
+
context.setUploadingFile({ url, file: imageFile });
|
|
22
|
+
imageItem = {
|
|
23
|
+
url,
|
|
24
|
+
width,
|
|
25
|
+
height
|
|
26
|
+
};
|
|
27
|
+
handle(imageItem);
|
|
28
|
+
};
|
|
29
|
+
function getImageSize(file, defaultImageWidth) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const image = new Image();
|
|
32
|
+
image.src = URL.createObjectURL(file);
|
|
33
|
+
image.onload = function () {
|
|
34
|
+
const width = defaultImageWidth;
|
|
35
|
+
const height = (defaultImageWidth * image.naturalHeight) / image.naturalWidth;
|
|
36
|
+
resolve(image.naturalWidth > defaultImageWidth ? { width, height } : { width: image.naturalWidth, height: image.naturalHeight });
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2ltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsVUFBVSxFQUFFLG1CQUFtQixFQUF1QixNQUFNLGFBQWEsQ0FBQztBQWFsRyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDdkIsS0FBaUIsRUFDakIsaUJBQXlCLEVBQ3pCLE1BQThDLEVBQzlDLG1CQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUM1RCxFQUFFO0lBQ0EsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2QyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN6RCxTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7UUFDbEMsVUFBVSxDQUFDLEtBQUssRUFBRyxLQUFLLENBQUMsTUFBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRixDQUFDLENBQUM7SUFDRixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFDM0IsS0FBaUIsRUFDakIsU0FBZSxFQUNmLGlCQUF5QixFQUN6QixNQUE4QyxFQUNoRCxFQUFFO0lBQ0EsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUNULE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixNQUFNLFlBQVksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUF3QyxFQUFFLEVBQUU7UUFDL0YsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDcEIsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDckIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFbkQsU0FBUyxHQUFHO1FBQ1IsR0FBRztRQUNILEtBQUs7UUFDTCxNQUFNO0tBQ1QsQ0FBQztJQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFFRixTQUFTLFlBQVksQ0FBQyxJQUFVLEVBQUUsaUJBQXlCO0lBQ3ZELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsS0FBSyxDQUFDLE1BQU0sR0FBRztZQUNYLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDOUUsT0FBTyxDQUNILEtBQUssQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQzFILENBQUM7UUFDTixDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRUeXBlLCBQbGFpdEJvYXJkLCBQbGFpdENvbnRleHRTZXJ2aWNlLCBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9pbWFnZS1iYXNlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uSW1hZ2VJdGVtIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhDb21tb25QbHVnaW5PcHRpb25zIHtcbiAgICBpbWFnZUNvbXBvbmVudFR5cGU/OiBDb21wb25lbnRUeXBlPEltYWdlQmFzZUNvbXBvbmVudD47XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RJbWFnZSA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBkZWZhdWx0SW1hZ2VXaWR0aDogbnVtYmVyLFxuICAgIGhhbmRsZTogKGNvbW1vbkltYWdlOiBDb21tb25JbWFnZUl0ZW0pID0+IHZvaWQsXG4gICAgYWNjZXB0SW1hZ2VUeXBlczogc3RyaW5nW10gPSBbJ3BuZycsICdqcGVnJywgJ2dpZicsICdibXAnXVxuKSA9PiB7XG4gICAgY29uc3QgaW5wdXRGaWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnB1dEZpbGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2ZpbGUnKTtcbiAgICBjb25zdCBhY2NlcHRJbWFnZVR5cGVzU3RyaW5nID0gJy4nICsgYWNjZXB0SW1hZ2VUeXBlcy5qb2luKCcsLicpO1xuICAgIGlucHV0RmlsZS5zZXRBdHRyaWJ1dGUoJ2FjY2VwdCcsIGFjY2VwdEltYWdlVHlwZXNTdHJpbmcpO1xuICAgIGlucHV0RmlsZS5vbmNoYW5nZSA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgYnVpbGRJbWFnZShib2FyZCwgKGV2ZW50LnRhcmdldCBhcyBhbnkpLmZpbGVzWzBdLCBkZWZhdWx0SW1hZ2VXaWR0aCwgaGFuZGxlKTtcbiAgICB9O1xuICAgIGlucHV0RmlsZS5jbGljaygpO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSW1hZ2UgPSBhc3luYyAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgaW1hZ2VGaWxlOiBGaWxlLFxuICAgIGRlZmF1bHRJbWFnZVdpZHRoOiBudW1iZXIsXG4gICAgaGFuZGxlOiAoY29tbW9uSW1hZ2U6IENvbW1vbkltYWdlSXRlbSkgPT4gdm9pZFxuKSA9PiB7XG4gICAgbGV0IHdpZHRoID0gMCxcbiAgICAgICAgaGVpZ2h0ID0gMDtcbiAgICBhd2FpdCBnZXRJbWFnZVNpemUoaW1hZ2VGaWxlLCBkZWZhdWx0SW1hZ2VXaWR0aCkudGhlbigodmFsdWU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICB3aWR0aCA9IHZhbHVlLndpZHRoO1xuICAgICAgICBoZWlnaHQgPSB2YWx1ZS5oZWlnaHQ7XG4gICAgfSk7XG5cbiAgICBsZXQgaW1hZ2VJdGVtID0gbnVsbDtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGltYWdlRmlsZSk7XG4gICAgY29uc3QgY29udGV4dCA9IFBsYWl0Qm9hcmQuZ2V0Q29tcG9uZW50KGJvYXJkKS52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yLmdldChQbGFpdENvbnRleHRTZXJ2aWNlKTtcbiAgICBjb250ZXh0LnNldFVwbG9hZGluZ0ZpbGUoeyB1cmwsIGZpbGU6IGltYWdlRmlsZSB9KTtcblxuICAgIGltYWdlSXRlbSA9IHtcbiAgICAgICAgdXJsLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgfTtcbiAgICBoYW5kbGUoaW1hZ2VJdGVtKTtcbn07XG5cbmZ1bmN0aW9uIGdldEltYWdlU2l6ZShmaWxlOiBGaWxlLCBkZWZhdWx0SW1hZ2VXaWR0aDogbnVtYmVyKTogUHJvbWlzZTx7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWFnZS5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuXG4gICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBkZWZhdWx0SW1hZ2VXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IChkZWZhdWx0SW1hZ2VXaWR0aCAqIGltYWdlLm5hdHVyYWxIZWlnaHQpIC8gaW1hZ2UubmF0dXJhbFdpZHRoO1xuICAgICAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICAgICAgICBpbWFnZS5uYXR1cmFsV2lkdGggPiBkZWZhdWx0SW1hZ2VXaWR0aCA/IHsgd2lkdGgsIGhlaWdodCB9IDogeyB3aWR0aDogaW1hZ2UubmF0dXJhbFdpZHRoLCBoZWlnaHQ6IGltYWdlLm5hdHVyYWxIZWlnaHQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './resize';
|
|
2
|
+
export * from './line-path';
|
|
3
|
+
export * from './hot-key';
|
|
4
|
+
export * from './rectangle';
|
|
5
|
+
export * from './creation-mode';
|
|
6
|
+
export * from './direction';
|
|
7
|
+
export * from './text';
|
|
8
|
+
export * from './image';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3Jlc2l6ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpbmUtcGF0aCc7XG5leHBvcnQgKiBmcm9tICcuL2hvdC1rZXknO1xuZXhwb3J0ICogZnJvbSAnLi9yZWN0YW5nbGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGlvbi1tb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vdGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlJztcbiJdfQ==
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Direction, distanceBetweenPointAndPoint } from '@plait/core';
|
|
2
|
+
import { getDirectionFactor } from './direction';
|
|
3
|
+
export function getOppositeDirection(direction) {
|
|
4
|
+
switch (direction) {
|
|
5
|
+
case Direction.left:
|
|
6
|
+
return Direction.right;
|
|
7
|
+
case Direction.right:
|
|
8
|
+
return Direction.left;
|
|
9
|
+
case Direction.top:
|
|
10
|
+
return Direction.bottom;
|
|
11
|
+
case Direction.bottom:
|
|
12
|
+
return Direction.top;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const getPoints = (source, sourcePosition, target, targetPosition, offset) => {
|
|
16
|
+
const sourceDir = getDirectionFactor(sourcePosition);
|
|
17
|
+
const targetDir = getDirectionFactor(targetPosition);
|
|
18
|
+
const sourceGapped = [source[0] + sourceDir.x * offset, source[1] + sourceDir.y * offset];
|
|
19
|
+
const targetGapped = [target[0] + targetDir.x * offset, target[1] + targetDir.y * offset];
|
|
20
|
+
const dir = getDirection(sourceGapped, sourcePosition, targetGapped);
|
|
21
|
+
const dirAccessor = dir.x !== 0 ? 'x' : 'y';
|
|
22
|
+
const currDir = dir[dirAccessor];
|
|
23
|
+
let points = [];
|
|
24
|
+
let centerX, centerY;
|
|
25
|
+
const [defaultCenterX, defaultCenterY] = getEdgeCenter({
|
|
26
|
+
sourceX: source[0],
|
|
27
|
+
sourceY: source[1],
|
|
28
|
+
targetX: target[0],
|
|
29
|
+
targetY: target[1]
|
|
30
|
+
});
|
|
31
|
+
// opposite handle positions, default case
|
|
32
|
+
if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) {
|
|
33
|
+
centerX = defaultCenterX;
|
|
34
|
+
centerY = defaultCenterY;
|
|
35
|
+
// --->
|
|
36
|
+
// |
|
|
37
|
+
// >---
|
|
38
|
+
const verticalSplit = [
|
|
39
|
+
[centerX, sourceGapped[1]],
|
|
40
|
+
[centerX, targetGapped[1]]
|
|
41
|
+
];
|
|
42
|
+
// |
|
|
43
|
+
// ---
|
|
44
|
+
// |
|
|
45
|
+
const horizontalSplit = [
|
|
46
|
+
[sourceGapped[0], centerY],
|
|
47
|
+
[targetGapped[0], centerY]
|
|
48
|
+
];
|
|
49
|
+
if (sourceDir[dirAccessor] === currDir) {
|
|
50
|
+
points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// sourceTarget means we take x from source and y from target, targetSource is the opposite
|
|
58
|
+
const sourceTarget = [[sourceGapped[0], targetGapped[1]]];
|
|
59
|
+
const targetSource = [[targetGapped[0], sourceGapped[1]]];
|
|
60
|
+
// this handles edges with same handle positions
|
|
61
|
+
if (dirAccessor === 'x') {
|
|
62
|
+
points = sourceDir.x === currDir ? targetSource : sourceTarget;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
points = sourceDir.y === currDir ? sourceTarget : targetSource;
|
|
66
|
+
}
|
|
67
|
+
// these are conditions for handling mixed handle positions like right -> bottom for example
|
|
68
|
+
let flipSourceTarget;
|
|
69
|
+
if (sourcePosition !== targetPosition) {
|
|
70
|
+
const dirAccessorOpposite = dirAccessor === 'x' ? 1 : 0;
|
|
71
|
+
const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessor === 'x' ? 'y' : 'x'];
|
|
72
|
+
const sourceGtTargetOppo = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];
|
|
73
|
+
const sourceLtTargetOppo = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];
|
|
74
|
+
flipSourceTarget =
|
|
75
|
+
(sourceDir[dirAccessor] === 1 && ((!isSameDir && sourceGtTargetOppo) || (isSameDir && sourceLtTargetOppo))) ||
|
|
76
|
+
(sourceDir[dirAccessor] !== 1 && ((!isSameDir && sourceLtTargetOppo) || (isSameDir && sourceGtTargetOppo)));
|
|
77
|
+
if (flipSourceTarget) {
|
|
78
|
+
points = dirAccessor === 'x' ? sourceTarget : targetSource;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return [source, sourceGapped, ...points, targetGapped, target];
|
|
83
|
+
};
|
|
84
|
+
export const getDirection = (source, sourcePosition = Direction.bottom, target) => {
|
|
85
|
+
if (sourcePosition === Direction.left || sourcePosition === Direction.right) {
|
|
86
|
+
return source[0] < target[0] ? { x: 1, y: 0 } : { x: -1, y: 0 };
|
|
87
|
+
}
|
|
88
|
+
return source[1] < target[1] ? { x: 0, y: 1 } : { x: 0, y: -1 };
|
|
89
|
+
};
|
|
90
|
+
export function getEdgeCenter({ sourceX, sourceY, targetX, targetY }) {
|
|
91
|
+
const xOffset = Math.abs(targetX - sourceX) / 2;
|
|
92
|
+
const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;
|
|
93
|
+
const yOffset = Math.abs(targetY - sourceY) / 2;
|
|
94
|
+
const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;
|
|
95
|
+
return [centerX, centerY, xOffset, yOffset];
|
|
96
|
+
}
|
|
97
|
+
export function getPointOnPolyline(points, ratio) {
|
|
98
|
+
const totalLength = calculatePolylineLength(points);
|
|
99
|
+
const targetDistance = totalLength * ratio;
|
|
100
|
+
let accumulatedDistance = 0;
|
|
101
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
102
|
+
const [x1, y1] = points[i];
|
|
103
|
+
const [x2, y2] = points[i + 1];
|
|
104
|
+
const segmentLength = distanceBetweenPointAndPoint(x1, y1, x2, y2);
|
|
105
|
+
if (accumulatedDistance + segmentLength >= targetDistance) {
|
|
106
|
+
const remainingDistance = targetDistance - accumulatedDistance;
|
|
107
|
+
const ratioInSegment = remainingDistance / segmentLength;
|
|
108
|
+
const targetX = x1 + (x2 - x1) * ratioInSegment;
|
|
109
|
+
const targetY = y1 + (y2 - y1) * ratioInSegment;
|
|
110
|
+
return [targetX, targetY];
|
|
111
|
+
}
|
|
112
|
+
accumulatedDistance += segmentLength;
|
|
113
|
+
}
|
|
114
|
+
return points[points.length - 1];
|
|
115
|
+
}
|
|
116
|
+
export function calculatePolylineLength(points) {
|
|
117
|
+
let length = 0;
|
|
118
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
119
|
+
const [x1, y1] = points[i];
|
|
120
|
+
const [x2, y2] = points[i + 1];
|
|
121
|
+
length += distanceBetweenPointAndPoint(x1, y1, x2, y2);
|
|
122
|
+
}
|
|
123
|
+
return length;
|
|
124
|
+
}
|
|
125
|
+
export function getRatioByPoint(points, point) {
|
|
126
|
+
const totalLength = calculatePolylineLength(points);
|
|
127
|
+
let distance = 0;
|
|
128
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
129
|
+
const isOverlap = isPointOnLineSegment(point, points[i], points[i + 1]);
|
|
130
|
+
if (isOverlap) {
|
|
131
|
+
distance += distanceBetweenPointAndPoint(point[0], point[1], points[i][0], points[i][1]);
|
|
132
|
+
return distance / totalLength;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
distance += distanceBetweenPointAndPoint(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
throw new Error('Cannot get ratio by point');
|
|
139
|
+
}
|
|
140
|
+
export function isPointOnLineSegment(point, startPoint, endPoint) {
|
|
141
|
+
const distanceToStart = distanceBetweenPointAndPoint(point[0], point[1], startPoint[0], startPoint[1]);
|
|
142
|
+
const distanceToEnd = distanceBetweenPointAndPoint(point[0], point[1], endPoint[0], endPoint[1]);
|
|
143
|
+
const segmentLength = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
|
|
144
|
+
return Math.abs(distanceToStart + distanceToEnd - segmentLength) < 0.1;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9saW5lLXBhdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBUyw0QkFBNEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFNBQW9CO0lBQ3JELFFBQVEsU0FBUyxFQUFFO1FBQ2YsS0FBSyxTQUFTLENBQUMsSUFBSTtZQUNmLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQztRQUMzQixLQUFLLFNBQVMsQ0FBQyxLQUFLO1lBQ2hCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQztRQUMxQixLQUFLLFNBQVMsQ0FBQyxHQUFHO1lBQ2QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzVCLEtBQUssU0FBUyxDQUFDLE1BQU07WUFDakIsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDO0tBQzVCO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWEsRUFBRSxjQUF5QixFQUFFLE1BQWEsRUFBRSxjQUF5QixFQUFFLE1BQWMsRUFBRSxFQUFFO0lBQzVILE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sWUFBWSxHQUFVLENBQUMsTUFBTSxDQUFDLENBQUMs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Y2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb24sIFBvaW50LCBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgZ2V0RGlyZWN0aW9uRmFjdG9yIH0gZnJvbSAnLi9kaXJlY3Rpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uOiBEaXJlY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlIERpcmVjdGlvbi5sZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5yaWdodDtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24ucmlnaHQ6XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLmxlZnQ7XG4gICAgICAgIGNhc2UgRGlyZWN0aW9uLnRvcDpcbiAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24uYm90dG9tO1xuICAgICAgICBjYXNlIERpcmVjdGlvbi5ib3R0b206XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLnRvcDtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQb2ludHMgPSAoc291cmNlOiBQb2ludCwgc291cmNlUG9zaXRpb246IERpcmVjdGlvbiwgdGFyZ2V0OiBQb2ludCwgdGFyZ2V0UG9zaXRpb246IERpcmVjdGlvbiwgb2Zmc2V0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBzb3VyY2VEaXIgPSBnZXREaXJlY3Rpb25GYWN0b3Ioc291cmNlUG9zaXRpb24pO1xuICAgIGNvbnN0IHRhcmdldERpciA9IGdldERpcmVjdGlvbkZhY3Rvcih0YXJnZXRQb3NpdGlvbik7XG4gICAgY29uc3Qgc291cmNlR2FwcGVkOiBQb2ludCA9IFtzb3VyY2VbMF0gKyBzb3VyY2VEaXIueCAqIG9mZnNldCwgc291cmNlWzFdICsgc291cmNlRGlyLnkgKiBvZmZzZXRdO1xuICAgIGNvbnN0IHRhcmdldEdhcHBlZDogUG9pbnQgPSBbdGFyZ2V0WzBdICsgdGFyZ2V0RGlyLnggKiBvZmZzZXQsIHRhcmdldFsxXSArIHRhcmdldERpci55ICogb2Zmc2V0XTtcbiAgICBjb25zdCBkaXIgPSBnZXREaXJlY3Rpb24oc291cmNlR2FwcGVkLCBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0R2FwcGVkKTtcbiAgICBjb25zdCBkaXJBY2Nlc3NvciA9IGRpci54ICE9PSAwID8gJ3gnIDogJ3knO1xuICAgIGNvbnN0IGN1cnJEaXIgPSBkaXJbZGlyQWNjZXNzb3JdO1xuXG4gICAgbGV0IHBvaW50czogUG9pbnRbXSA9IFtdO1xuICAgIGxldCBjZW50ZXJYLCBjZW50ZXJZO1xuICAgIGNvbnN0IFtkZWZhdWx0Q2VudGVyWCwgZGVmYXVsdENlbnRlclldID0gZ2V0RWRnZUNlbnRlcih7XG4gICAgICAgIHNvdXJjZVg6IHNvdXJjZVswXSxcbiAgICAgICAgc291cmNlWTogc291cmNlWzFdLFxuICAgICAgICB0YXJnZXRYOiB0YXJnZXRbMF0sXG4gICAgICAgIHRhcmdldFk6IHRhcmdldFsxXVxuICAgIH0pO1xuICAgIC8vIG9wcG9zaXRlIGhhbmRsZSBwb3NpdGlvbnMsIGRlZmF1bHQgY2FzZVxuICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdICogdGFyZ2V0RGlyW2RpckFjY2Vzc29yXSA9PT0gLTEpIHtcbiAgICAgICAgY2VudGVyWCA9IGRlZmF1bHRDZW50ZXJYO1xuICAgICAgICBjZW50ZXJZID0gZGVmYXVsdENlbnRlclk7XG4gICAgICAgIC8vICAgIC0tLT5cbiAgICAgICAgLy8gICAgfFxuICAgICAgICAvLyA+LS0tXG4gICAgICAgIGNvbnN0IHZlcnRpY2FsU3BsaXQ6IFBvaW50W10gPSBbXG4gICAgICAgICAgICBbY2VudGVyWCwgc291cmNlR2FwcGVkWzFdXSxcbiAgICAgICAgICAgIFtjZW50ZXJYLCB0YXJnZXRHYXBwZWRbMV1dXG4gICAgICAgIF07XG4gICAgICAgIC8vICAgIHxcbiAgICAgICAgLy8gIC0tLVxuICAgICAgICAvLyAgfFxuICAgICAgICBjb25zdCBob3Jpem9udGFsU3BsaXQ6IFBvaW50W10gPSBbXG4gICAgICAgICAgICBbc291cmNlR2FwcGVkWzBdLCBjZW50ZXJZXSxcbiAgICAgICAgICAgIFt0YXJnZXRHYXBwZWRbMF0sIGNlbnRlclldXG4gICAgICAgIF07XG4gICAgICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSBjdXJyRGlyKSB7XG4gICAgICAgICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gdmVydGljYWxTcGxpdCA6IGhvcml6b250YWxTcGxpdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyBob3Jpem9udGFsU3BsaXQgOiB2ZXJ0aWNhbFNwbGl0O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc291cmNlVGFyZ2V0IG1lYW5zIHdlIHRha2UgeCBmcm9tIHNvdXJjZSBhbmQgeSBmcm9tIHRhcmdldCwgdGFyZ2V0U291cmNlIGlzIHRoZSBvcHBvc2l0ZVxuICAgICAgICBjb25zdCBzb3VyY2VUYXJnZXQ6IFBvaW50W10gPSBbW3NvdXJjZUdhcHBlZFswXSwgdGFyZ2V0R2FwcGVkWzFdXV07XG4gICAgICAgIGNvbnN0IHRhcmdldFNvdXJjZTogUG9pbnRbXSA9IFtbdGFyZ2V0R2FwcGVkWzBdLCBzb3VyY2VHYXBwZWRbMV1dXTtcbiAgICAgICAgLy8gdGhpcyBoYW5kbGVzIGVkZ2VzIHdpdGggc2FtZSBoYW5kbGUgcG9zaXRpb25zXG4gICAgICAgIGlmIChkaXJBY2Nlc3NvciA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBwb2ludHMgPSBzb3VyY2VEaXIueCA9PT0gY3VyckRpciA/IHRhcmdldFNvdXJjZSA6IHNvdXJjZVRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cyA9IHNvdXJjZURpci55ID09PSBjdXJyRGlyID8gc291cmNlVGFyZ2V0IDogdGFyZ2V0U291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlc2UgYXJlIGNvbmRpdGlvbnMgZm9yIGhhbmRsaW5nIG1peGVkIGhhbmRsZSBwb3NpdGlvbnMgbGlrZSByaWdodCAtPiBib3R0b20gZm9yIGV4YW1wbGVcbiAgICAgICAgbGV0IGZsaXBTb3VyY2VUYXJnZXQ7XG4gICAgICAgIGlmIChzb3VyY2VQb3NpdGlvbiAhPT0gdGFyZ2V0UG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRpckFjY2Vzc29yT3Bwb3NpdGUgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gMSA6IDA7XG4gICAgICAgICAgICBjb25zdCBpc1NhbWVEaXIgPSBzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSB0YXJnZXREaXJbZGlyQWNjZXNzb3IgPT09ICd4JyA/ICd5JyA6ICd4J107XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VHdFRhcmdldE9wcG8gPSBzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV0gPiB0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMdFRhcmdldE9wcG8gPSBzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV0gPCB0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBmbGlwU291cmNlVGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAoc291cmNlRGlyW2RpckFjY2Vzc29yXSA9PT0gMSAmJiAoKCFpc1NhbWVEaXIgJiYgc291cmNlR3RUYXJnZXRPcHBvKSB8fCAoaXNTYW1lRGlyICYmIHNvdXJjZUx0VGFyZ2V0T3BwbykpKSB8fFxuICAgICAgICAgICAgICAgIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdICE9PSAxICYmICgoIWlzU2FtZURpciAmJiBzb3VyY2VMdFRhcmdldE9wcG8pIHx8IChpc1NhbWVEaXIgJiYgc291cmNlR3RUYXJnZXRPcHBvKSkpO1xuXG4gICAgICAgICAgICBpZiAoZmxpcFNvdXJjZVRhcmdldCkge1xuICAgICAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyBzb3VyY2VUYXJnZXQgOiB0YXJnZXRTb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtzb3VyY2UsIHNvdXJjZUdhcHBlZCwgLi4ucG9pbnRzLCB0YXJnZXRHYXBwZWQsIHRhcmdldF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0aW9uID0gKHNvdXJjZTogUG9pbnQsIHNvdXJjZVBvc2l0aW9uID0gRGlyZWN0aW9uLmJvdHRvbSwgdGFyZ2V0OiBQb2ludCkgPT4ge1xuICAgIGlmIChzb3VyY2VQb3NpdGlvbiA9PT0gRGlyZWN0aW9uLmxlZnQgfHwgc291cmNlUG9zaXRpb24gPT09IERpcmVjdGlvbi5yaWdodCkge1xuICAgICAgICByZXR1cm4gc291cmNlWzBdIDwgdGFyZ2V0WzBdID8geyB4OiAxLCB5OiAwIH0gOiB7IHg6IC0xLCB5OiAwIH07XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VbMV0gPCB0YXJnZXRbMV0gPyB7IHg6IDAsIHk6IDEgfSA6IHsgeDogMCwgeTogLTEgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlQ2VudGVyKHtcbiAgICBzb3VyY2VYLFxuICAgIHNvdXJjZVksXG4gICAgdGFyZ2V0WCxcbiAgICB0YXJnZXRZXG59OiB7XG4gICAgc291cmNlWDogbnVtYmVyO1xuICAgIHNvdXJjZVk6IG51bWJlcjtcbiAgICB0YXJnZXRYOiBudW1iZXI7XG4gICAgdGFyZ2V0WTogbnVtYmVyO1xufSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCB4T2Zmc2V0ID0gTWF0aC5hYnModGFyZ2V0WCAtIHNvdXJjZVgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJYID0gdGFyZ2V0WCA8IHNvdXJjZVggPyB0YXJnZXRYICsgeE9mZnNldCA6IHRhcmdldFggLSB4T2Zmc2V0O1xuXG4gICAgY29uc3QgeU9mZnNldCA9IE1hdGguYWJzKHRhcmdldFkgLSBzb3VyY2VZKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IHRhcmdldFkgPCBzb3VyY2VZID8gdGFyZ2V0WSArIHlPZmZzZXQgOiB0YXJnZXRZIC0geU9mZnNldDtcblxuICAgIHJldHVybiBbY2VudGVyWCwgY2VudGVyWSwgeE9mZnNldCwgeU9mZnNldF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludE9uUG9seWxpbmUocG9pbnRzOiBQb2ludFtdLCByYXRpbzogbnVtYmVyKSB7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBjYWxjdWxhdGVQb2x5bGluZUxlbmd0aChwb2ludHMpO1xuICAgIGNvbnN0IHRhcmdldERpc3RhbmNlID0gdG90YWxMZW5ndGggKiByYXRpbztcblxuICAgIGxldCBhY2N1bXVsYXRlZERpc3RhbmNlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgW3gxLCB5MV0gPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IFt4MiwgeTJdID0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoeDEsIHkxLCB4MiwgeTIpO1xuXG4gICAgICAgIGlmIChhY2N1bXVsYXRlZERpc3RhbmNlICsgc2VnbWVudExlbmd0aCA+PSB0YXJnZXREaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nRGlzdGFuY2UgPSB0YXJnZXREaXN0YW5jZSAtIGFjY3VtdWxhdGVkRGlzdGFuY2U7XG4gICAgICAgICAgICBjb25zdCByYXRpb0luU2VnbWVudCA9IHJlbWFpbmluZ0Rpc3RhbmNlIC8gc2VnbWVudExlbmd0aDtcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0WCA9IHgxICsgKHgyIC0geDEpICogcmF0aW9JblNlZ21lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRZID0geTEgKyAoeTIgLSB5MSkgKiByYXRpb0luU2VnbWVudDtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0WCwgdGFyZ2V0WV07XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1bXVsYXRlZERpc3RhbmNlICs9IHNlZ21lbnRMZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVQb2x5bGluZUxlbmd0aChwb2ludHM6IFBvaW50W10pIHtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgW3gxLCB5MV0gPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IFt4MiwgeTJdID0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgbGVuZ3RoICs9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoeDEsIHkxLCB4MiwgeTIpO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmF0aW9CeVBvaW50KHBvaW50czogUG9pbnRbXSwgcG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBjYWxjdWxhdGVQb2x5bGluZUxlbmd0aChwb2ludHMpO1xuXG4gICAgbGV0IGRpc3RhbmNlID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBpc092ZXJsYXAgPSBpc1BvaW50T25MaW5lU2VnbWVudChwb2ludCwgcG9pbnRzW2ldLCBwb2ludHNbaSArIDFdKTtcblxuICAgICAgICBpZiAoaXNPdmVybGFwKSB7XG4gICAgICAgICAgICBkaXN0YW5jZSArPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHBvaW50WzBdLCBwb2ludFsxXSwgcG9pbnRzW2ldWzBdLCBwb2ludHNbaV1bMV0pO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlIC8gdG90YWxMZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXN0YW5jZSArPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHBvaW50c1tpXVswXSwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaSArIDFdWzBdLCBwb2ludHNbaSArIDFdWzFdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgcmF0aW8gYnkgcG9pbnQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9pbnRPbkxpbmVTZWdtZW50KHBvaW50OiBQb2ludCwgc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCkge1xuICAgIGNvbnN0IGRpc3RhbmNlVG9TdGFydCA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdLCBzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdKTtcbiAgICBjb25zdCBkaXN0YW5jZVRvRW5kID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChwb2ludFswXSwgcG9pbnRbMV0sIGVuZFBvaW50WzBdLCBlbmRQb2ludFsxXSk7XG5cbiAgICBjb25zdCBzZWdtZW50TGVuZ3RoID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdLCBlbmRQb2ludFswXSwgZW5kUG9pbnRbMV0pO1xuXG4gICAgcmV0dXJuIE1hdGguYWJzKGRpc3RhbmNlVG9TdGFydCArIGRpc3RhbmNlVG9FbmQgLSBzZWdtZW50TGVuZ3RoKSA8IDAuMTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const getRectangleByPoints = (points) => {
|
|
2
|
+
let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
|
|
3
|
+
points.forEach(point => {
|
|
4
|
+
minX = Math.min(point[0], minX);
|
|
5
|
+
maxX = Math.max(point[0], maxX);
|
|
6
|
+
minY = Math.min(point[1], minY);
|
|
7
|
+
maxY = Math.max(point[1], maxY);
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
x: minX,
|
|
11
|
+
y: minY,
|
|
12
|
+
width: maxX - minX,
|
|
13
|
+
height: maxY - minY
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdGFuZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9yZWN0YW5nbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtJQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLEVBQ2YsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUNoQixJQUFJLEdBQUcsUUFBUSxFQUNmLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ25CLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDSCxDQUFDLEVBQUUsSUFBSTtRQUNQLENBQUMsRUFBRSxJQUFJO1FBQ1AsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLEdBQUcsSUFBSTtLQUN0QixDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9pbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRSZWN0YW5nbGVCeVBvaW50cyA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBsZXQgbWluWCA9IEluZmluaXR5LFxuICAgICAgICBtYXhYID0gLUluZmluaXR5LFxuICAgICAgICBtaW5ZID0gSW5maW5pdHksXG4gICAgICAgIG1heFkgPSAtSW5maW5pdHk7XG4gICAgcG9pbnRzLmZvckVhY2gocG9pbnQgPT4ge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4ocG9pbnRbMF0sIG1pblgpO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgocG9pbnRbMF0sIG1heFgpO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4ocG9pbnRbMV0sIG1pblkpO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgocG9pbnRbMV0sIG1heFkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogbWluWCxcbiAgICAgICAgeTogbWluWSxcbiAgICAgICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZXG4gICAgfTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { PlaitBoard, RectangleClient } from '@plait/core';
|
|
2
|
+
import { ResizeCursorClass, ResizeHandle } from '../constants/resize';
|
|
3
|
+
const getResizeHandleByIndex = (index) => {
|
|
4
|
+
switch (index) {
|
|
5
|
+
case 0:
|
|
6
|
+
return ResizeHandle.nw;
|
|
7
|
+
case 1:
|
|
8
|
+
return ResizeHandle.ne;
|
|
9
|
+
case 2:
|
|
10
|
+
return ResizeHandle.se;
|
|
11
|
+
case 3:
|
|
12
|
+
return ResizeHandle.sw;
|
|
13
|
+
default:
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const getResizeCursorClassByIndex = (index) => {
|
|
18
|
+
switch (index) {
|
|
19
|
+
case 0:
|
|
20
|
+
return ResizeCursorClass.nwse;
|
|
21
|
+
case 1:
|
|
22
|
+
return ResizeCursorClass.nesw;
|
|
23
|
+
case 2:
|
|
24
|
+
return ResizeCursorClass.nwse;
|
|
25
|
+
case 3:
|
|
26
|
+
return ResizeCursorClass.nesw;
|
|
27
|
+
default:
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
export const getRectangleResizeHandleRefs = (rectangle, diameter) => {
|
|
32
|
+
const centers = RectangleClient.getCornerPoints(rectangle);
|
|
33
|
+
return centers.map((center, index) => {
|
|
34
|
+
return {
|
|
35
|
+
rectangle: {
|
|
36
|
+
x: center[0] - diameter / 2,
|
|
37
|
+
y: center[1] - diameter / 2,
|
|
38
|
+
width: diameter,
|
|
39
|
+
height: diameter
|
|
40
|
+
},
|
|
41
|
+
handle: getResizeHandleByIndex(index),
|
|
42
|
+
cursorClass: getResizeCursorClassByIndex(index)
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
export const IS_RESIZING = new WeakMap();
|
|
47
|
+
export const isResizing = (board) => {
|
|
48
|
+
return !!IS_RESIZING.get(board);
|
|
49
|
+
};
|
|
50
|
+
export const isResizingByCondition = (board, match) => {
|
|
51
|
+
return isResizing(board) && match(IS_RESIZING.get(board));
|
|
52
|
+
};
|
|
53
|
+
export const addResizing = (board, resizeRef, key) => {
|
|
54
|
+
PlaitBoard.getBoardContainer(board).classList.add(`${key}-resizing`);
|
|
55
|
+
IS_RESIZING.set(board, resizeRef);
|
|
56
|
+
};
|
|
57
|
+
export const removeResizing = (board, key) => {
|
|
58
|
+
PlaitBoard.getBoardContainer(board).classList.remove(`${key}-resizing`);
|
|
59
|
+
IS_RESIZING.delete(board);
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9yZXNpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFRLFVBQVUsRUFBdUIsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVF0RSxNQUFNLHNCQUFzQixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDN0MsUUFBUSxLQUFLLEVBQUU7UUFDWCxLQUFLLENBQUM7WUFDRixPQUFPLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDO1lBQ0YsT0FBTyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQztZQUNGLE9BQU8sWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUMzQixLQUFLLENBQUM7WUFDRixPQUFPLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDM0I7WUFDSSxPQUFPLElBQUksQ0FBQztLQUNuQjtBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUNsRCxRQUFRLEtBQUssRUFBRTtRQUNYLEtBQUssQ0FBQztZQUNGLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ2xDLEtBQUssQ0FBQztZQUNGLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ2xDLEtBQUssQ0FBQztZQUNGLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ2xDLEtBQUssQ0FBQztZQUNGLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ2xDO1lBQ0ksT0FBTyxJQUFJLENBQUM7S0FDbkI7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFNBQTBCLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO0lBQ3pGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQWEsRUFBRSxFQUFFO1FBQ3pDLE9BQU87WUFDSCxTQUFTLEVBQUU7Z0JBQ1AsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQztnQkFDM0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDbkI7WUFDRCxNQUFNLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxDQUFpQjtZQUNyRCxXQUFXLEVBQUUsMkJBQTJCLENBQUMsS0FBSyxDQUFzQjtTQUN2RSxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQW1DLENBQUM7QUFFMUUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQzVDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBNEIsS0FBaUIsRUFBRSxLQUE4QyxFQUFFLEVBQUU7SUFDbEksT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFFLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBNEIsS0FBaUIsRUFBRSxTQUEwQixFQUFFLEdBQVcsRUFBRSxFQUFFO0lBQ2pILFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUNyRSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEdBQVcsRUFBRSxFQUFFO0lBQzdELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN4RSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhdGgsIFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFJlc2l6ZUN1cnNvckNsYXNzLCBSZXNpemVIYW5kbGUgfSBmcm9tICcuLi9jb25zdGFudHMvcmVzaXplJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNpemVSZWY8VCBleHRlbmRzIFBsYWl0RWxlbWVudCA9IFBsYWl0RWxlbWVudCwgSyA9IFJlc2l6ZUhhbmRsZT4ge1xuICAgIGVsZW1lbnQ6IFQ7XG4gICAgcGF0aDogUGF0aDtcbiAgICBoYW5kbGU6IEs7XG59XG5cbmNvbnN0IGdldFJlc2l6ZUhhbmRsZUJ5SW5kZXggPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUhhbmRsZS5udztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUhhbmRsZS5uZTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUhhbmRsZS5zZTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUhhbmRsZS5zdztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5cbmNvbnN0IGdldFJlc2l6ZUN1cnNvckNsYXNzQnlJbmRleCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgc3dpdGNoIChpbmRleCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gUmVzaXplQ3Vyc29yQ2xhc3MubndzZTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUN1cnNvckNsYXNzLm5lc3c7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBSZXNpemVDdXJzb3JDbGFzcy5ud3NlO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gUmVzaXplQ3Vyc29yQ2xhc3MubmVzdztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzID0gKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBkaWFtZXRlcjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY2VudGVycyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICByZXR1cm4gY2VudGVycy5tYXAoKGNlbnRlciwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVjdGFuZ2xlOiB7XG4gICAgICAgICAgICAgICAgeDogY2VudGVyWzBdIC0gZGlhbWV0ZXIgLyAyLFxuICAgICAgICAgICAgICAgIHk6IGNlbnRlclsxXSAtIGRpYW1ldGVyIC8gMixcbiAgICAgICAgICAgICAgICB3aWR0aDogZGlhbWV0ZXIsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBkaWFtZXRlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZTogZ2V0UmVzaXplSGFuZGxlQnlJbmRleChpbmRleCkgYXMgUmVzaXplSGFuZGxlLFxuICAgICAgICAgICAgY3Vyc29yQ2xhc3M6IGdldFJlc2l6ZUN1cnNvckNsYXNzQnlJbmRleChpbmRleCkgYXMgUmVzaXplQ3Vyc29yQ2xhc3NcbiAgICAgICAgfTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBJU19SRVNJWklORyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFJlc2l6ZVJlZjxhbnksIGFueT4+KCk7XG5cbmV4cG9ydCBjb25zdCBpc1Jlc2l6aW5nID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuICEhSVNfUkVTSVpJTkcuZ2V0KGJvYXJkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Jlc2l6aW5nQnlDb25kaXRpb24gPSA8VCBleHRlbmRzIFBsYWl0RWxlbWVudCwgSz4oYm9hcmQ6IFBsYWl0Qm9hcmQsIG1hdGNoOiAocmVzaXplUmVmOiBSZXNpemVSZWY8VCwgSz4pID0+IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gaXNSZXNpemluZyhib2FyZCkgJiYgbWF0Y2goSVNfUkVTSVpJTkcuZ2V0KGJvYXJkKSEpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFJlc2l6aW5nID0gPFQgZXh0ZW5kcyBQbGFpdEVsZW1lbnQsIEs+KGJvYXJkOiBQbGFpdEJvYXJkLCByZXNpemVSZWY6IFJlc2l6ZVJlZjxULCBLPiwga2V5OiBzdHJpbmcpID0+IHtcbiAgICBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5jbGFzc0xpc3QuYWRkKGAke2tleX0tcmVzaXppbmdgKTtcbiAgICBJU19SRVNJWklORy5zZXQoYm9hcmQsIHJlc2l6ZVJlZik7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlUmVzaXppbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LnJlbW92ZShgJHtrZXl9LXJlc2l6aW5nYCk7XG4gICAgSVNfUkVTSVpJTkcuZGVsZXRlKGJvYXJkKTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PlaitElement } from '@plait/core';
|
|
2
|
+
export const getTextManages = (element) => {
|
|
3
|
+
const component = PlaitElement.getComponent(element);
|
|
4
|
+
return component.getTextManages();
|
|
5
|
+
};
|
|
6
|
+
export const getTextEditors = (element) => {
|
|
7
|
+
return getTextManages(element).map(manage => {
|
|
8
|
+
return manage.componentRef.instance.editor;
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzNDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQXFCLEVBQUUsRUFBRTtJQUNwRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBd0IsQ0FBQztJQUM1RSxPQUFPLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxPQUFxQixFQUFFLEVBQUU7SUFDcEQsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3hDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRFbGVtZW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uUGx1Z2luRWxlbWVudCB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWVsZW1lbnQnO1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dE1hbmFnZXMgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudChlbGVtZW50KSBhcyBDb21tb25QbHVnaW5FbGVtZW50O1xuICAgIHJldHVybiBjb21wb25lbnQuZ2V0VGV4dE1hbmFnZXMoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0RWRpdG9ycyA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gZ2V0VGV4dE1hbmFnZXMoZWxlbWVudCkubWFwKG1hbmFnZSA9PiB7XG4gICAgICAgIHJldHVybiBtYW5hZ2UuY29tcG9uZW50UmVmLmluc3RhbmNlLmVkaXRvcjtcbiAgICB9KTtcbn07XG4iXX0=
|