@excalidraw/excalidraw 0.17.1-3e334a6 → 0.17.1-4689a6b
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/CHANGELOG.md +1 -0
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-M7HSOQ7X.js → chunk-23CKV3WP.js} +3 -1
- package/dist/browser/dev/excalidraw-assets-dev/chunk-23CKV3WP.js.map +7 -0
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-RWZVJAQU.js → chunk-7D5BMEAB.js} +2227 -1976
- package/dist/browser/dev/excalidraw-assets-dev/chunk-7D5BMEAB.js.map +7 -0
- package/dist/browser/dev/excalidraw-assets-dev/{en-R45KN4KN.js → en-W7TECCRB.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js → image-JKT6GXZD.js} +2 -2
- package/dist/browser/dev/index.css +20 -0
- package/dist/browser/dev/index.css.map +2 -2
- package/dist/browser/dev/index.js +766 -580
- package/dist/browser/dev/index.js.map +4 -4
- package/dist/browser/prod/excalidraw-assets/chunk-DWOM5R6H.js +55 -0
- package/dist/browser/prod/excalidraw-assets/{chunk-DIHRGRYX.js → chunk-SK23VHAR.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{en-H6IY7PV6.js → en-SMMH575S.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/image-WDEQS5RL.js +1 -0
- package/dist/browser/prod/index.css +1 -1
- package/dist/browser/prod/index.js +22 -22
- package/dist/{prod/en-N2RZZLK5.json → dev/en-CVBEBUBY.json} +2 -0
- package/dist/dev/index.css +20 -0
- package/dist/dev/index.css.map +2 -2
- package/dist/dev/index.js +2379 -2069
- package/dist/dev/index.js.map +4 -4
- package/dist/excalidraw/actions/actionBoundText.js +4 -1
- package/dist/excalidraw/actions/actionCanvas.js +3 -1
- package/dist/excalidraw/actions/actionDuplicateSelection.js +4 -0
- package/dist/excalidraw/actions/actionExport.d.ts +1 -1
- package/dist/excalidraw/actions/actionFinalize.d.ts +1 -1
- package/dist/excalidraw/actions/actionFinalize.js +3 -3
- package/dist/excalidraw/actions/actionFlip.d.ts +3 -3
- package/dist/excalidraw/actions/actionFlip.js +6 -6
- package/dist/excalidraw/actions/actionGroup.js +4 -2
- package/dist/excalidraw/actions/actionHistory.js +3 -0
- package/dist/excalidraw/actions/actionZindex.d.ts +11 -11
- package/dist/excalidraw/analytics.js +1 -1
- package/dist/excalidraw/components/App.d.ts +13 -3
- package/dist/excalidraw/components/App.js +211 -81
- package/dist/excalidraw/components/CommandPalette/CommandPalette.js +24 -10
- package/dist/excalidraw/components/DarkModeToggle.js +3 -1
- package/dist/excalidraw/components/HelpDialog.js +2 -2
- package/dist/excalidraw/components/RadioGroup.d.ts +2 -1
- package/dist/excalidraw/components/RadioGroup.js +1 -1
- package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.js +6 -2
- package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +18 -0
- package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.js +9 -0
- package/dist/excalidraw/components/hyperlink/Hyperlink.js +3 -3
- package/dist/excalidraw/components/hyperlink/helpers.js +2 -3
- package/dist/excalidraw/components/icons.d.ts +3 -0
- package/dist/excalidraw/components/icons.js +5 -1
- package/dist/excalidraw/components/main-menu/DefaultItems.d.ts +12 -2
- package/dist/excalidraw/components/main-menu/DefaultItems.js +38 -7
- package/dist/excalidraw/constants.d.ts +0 -3
- package/dist/excalidraw/constants.js +0 -3
- package/dist/excalidraw/data/magic.js +2 -1
- package/dist/excalidraw/data/reconcile.d.ts +6 -0
- package/dist/excalidraw/data/reconcile.js +49 -0
- package/dist/excalidraw/data/restore.d.ts +3 -3
- package/dist/excalidraw/data/restore.js +5 -6
- package/dist/excalidraw/data/transform.d.ts +1 -1
- package/dist/excalidraw/data/transform.js +12 -3
- package/dist/excalidraw/element/binding.d.ts +22 -9
- package/dist/excalidraw/element/binding.js +403 -26
- package/dist/excalidraw/element/bounds.d.ts +0 -1
- package/dist/excalidraw/element/bounds.js +0 -3
- package/dist/excalidraw/element/collision.d.ts +14 -19
- package/dist/excalidraw/element/collision.js +36 -713
- package/dist/excalidraw/element/embeddable.js +18 -43
- package/dist/excalidraw/element/index.d.ts +0 -1
- package/dist/excalidraw/element/index.js +0 -1
- package/dist/excalidraw/element/linearElementEditor.d.ts +10 -10
- package/dist/excalidraw/element/linearElementEditor.js +6 -4
- package/dist/excalidraw/element/newElement.d.ts +1 -1
- package/dist/excalidraw/element/newElement.js +2 -1
- package/dist/excalidraw/element/textElement.d.ts +0 -1
- package/dist/excalidraw/element/textElement.js +0 -30
- package/dist/excalidraw/element/types.d.ts +17 -2
- package/dist/excalidraw/errors.d.ts +3 -0
- package/dist/excalidraw/errors.js +3 -0
- package/dist/excalidraw/fractionalIndex.d.ts +40 -0
- package/dist/excalidraw/fractionalIndex.js +241 -0
- package/dist/excalidraw/frame.d.ts +1 -1
- package/dist/excalidraw/hooks/useCreatePortalContainer.js +2 -1
- package/dist/excalidraw/locales/en.json +2 -0
- package/dist/excalidraw/renderer/helpers.js +2 -2
- package/dist/excalidraw/renderer/interactiveScene.js +1 -1
- package/dist/excalidraw/renderer/renderElement.js +3 -3
- package/dist/excalidraw/renderer/renderSnaps.js +2 -1
- package/dist/excalidraw/scene/Scene.d.ts +7 -6
- package/dist/excalidraw/scene/Scene.js +28 -13
- package/dist/excalidraw/scene/export.js +4 -3
- package/dist/excalidraw/types.d.ts +4 -3
- package/dist/excalidraw/utils.d.ts +1 -0
- package/dist/excalidraw/utils.js +1 -0
- package/dist/excalidraw/zindex.d.ts +2 -2
- package/dist/excalidraw/zindex.js +9 -13
- package/dist/{dev/en-N2RZZLK5.json → prod/en-CVBEBUBY.json} +2 -0
- package/dist/prod/index.css +1 -1
- package/dist/prod/index.js +36 -36
- package/dist/utils/collision.d.ts +4 -0
- package/dist/utils/collision.js +48 -0
- package/dist/utils/geometry/geometry.d.ts +71 -0
- package/dist/utils/geometry/geometry.js +674 -0
- package/dist/utils/geometry/shape.d.ts +55 -0
- package/dist/utils/geometry/shape.js +149 -0
- package/package.json +2 -1
- package/dist/browser/dev/excalidraw-assets-dev/chunk-M7HSOQ7X.js.map +0 -7
- package/dist/browser/dev/excalidraw-assets-dev/chunk-RWZVJAQU.js.map +0 -7
- package/dist/browser/prod/excalidraw-assets/chunk-LL4GORAM.js +0 -55
- package/dist/browser/prod/excalidraw-assets/image-EFCJDJH3.js +0 -1
- /package/dist/browser/dev/excalidraw-assets-dev/{en-R45KN4KN.js.map → en-W7TECCRB.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js.map → image-JKT6GXZD.js.map} +0 -0
|
@@ -4,8 +4,9 @@ import { mutateElement } from "../element/mutateElement";
|
|
|
4
4
|
import { computeBoundTextPosition, computeContainerDimensionForBoundText, getBoundTextElement, measureText, redrawTextBoundingBox, } from "../element/textElement";
|
|
5
5
|
import { getOriginalContainerHeightFromCache, resetOriginalContainerCache, updateOriginalContainerCache, } from "../element/containerCache";
|
|
6
6
|
import { hasBoundTextElement, isTextBindableContainer, isUsingAdaptiveRadius, } from "../element/typeChecks";
|
|
7
|
-
import { getFontString } from "../utils";
|
|
7
|
+
import { arrayToMap, getFontString } from "../utils";
|
|
8
8
|
import { register } from "./register";
|
|
9
|
+
import { syncMovedIndices } from "../fractionalIndex";
|
|
9
10
|
export const actionUnbindText = register({
|
|
10
11
|
name: "unbindText",
|
|
11
12
|
label: "labels.unbindText",
|
|
@@ -113,6 +114,7 @@ const pushTextAboveContainer = (elements, container, textElement) => {
|
|
|
113
114
|
updatedElements.splice(textElementIndex, 1);
|
|
114
115
|
const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);
|
|
115
116
|
updatedElements.splice(containerIndex + 1, 0, textElement);
|
|
117
|
+
syncMovedIndices(updatedElements, arrayToMap([container, textElement]));
|
|
116
118
|
return updatedElements;
|
|
117
119
|
};
|
|
118
120
|
const pushContainerBelowText = (elements, container, textElement) => {
|
|
@@ -121,6 +123,7 @@ const pushContainerBelowText = (elements, container, textElement) => {
|
|
|
121
123
|
updatedElements.splice(containerIndex, 1);
|
|
122
124
|
const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);
|
|
123
125
|
updatedElements.splice(textElementIndex, 0, container);
|
|
126
|
+
syncMovedIndices(updatedElements, arrayToMap([container, textElement]));
|
|
124
127
|
return updatedElements;
|
|
125
128
|
};
|
|
126
129
|
export const actionWrapTextInContainer = register({
|
|
@@ -289,7 +289,9 @@ export const actionZoomToFit = register({
|
|
|
289
289
|
export const actionToggleTheme = register({
|
|
290
290
|
name: "toggleTheme",
|
|
291
291
|
label: (_, appState) => {
|
|
292
|
-
return appState.theme ===
|
|
292
|
+
return appState.theme === THEME.DARK
|
|
293
|
+
? "buttons.lightMode"
|
|
294
|
+
: "buttons.darkMode";
|
|
293
295
|
},
|
|
294
296
|
keywords: ["toggle", "dark", "light", "mode", "theme"],
|
|
295
297
|
icon: (appState) => (appState.theme === THEME.LIGHT ? MoonIcon : SunIcon),
|
|
@@ -16,6 +16,7 @@ import { normalizeElementOrder } from "../element/sortElements";
|
|
|
16
16
|
import { DuplicateIcon } from "../components/icons";
|
|
17
17
|
import { bindElementsToFramesAfterDuplication, getFrameChildren, } from "../frame";
|
|
18
18
|
import { excludeElementsInFramesFromSelection, getSelectedElements, } from "../scene/selection";
|
|
19
|
+
import { syncMovedIndices } from "../fractionalIndex";
|
|
19
20
|
export const actionDuplicateSelection = register({
|
|
20
21
|
name: "duplicateSelection",
|
|
21
22
|
label: "labels.duplicateSelection",
|
|
@@ -51,11 +52,13 @@ const duplicateElements = (elements, appState) => {
|
|
|
51
52
|
const newElements = [];
|
|
52
53
|
const oldElements = [];
|
|
53
54
|
const oldIdToDuplicatedId = new Map();
|
|
55
|
+
const duplicatedElementsMap = new Map();
|
|
54
56
|
const duplicateAndOffsetElement = (element) => {
|
|
55
57
|
const newElement = duplicateElement(appState.editingGroupId, groupIdMap, element, {
|
|
56
58
|
x: element.x + GRID_SIZE / 2,
|
|
57
59
|
y: element.y + GRID_SIZE / 2,
|
|
58
60
|
});
|
|
61
|
+
duplicatedElementsMap.set(newElement.id, newElement);
|
|
59
62
|
oldIdToDuplicatedId.set(element.id, newElement.id);
|
|
60
63
|
oldElements.push(element);
|
|
61
64
|
newElements.push(newElement);
|
|
@@ -160,6 +163,7 @@ const duplicateElements = (elements, appState) => {
|
|
|
160
163
|
}
|
|
161
164
|
// step (3)
|
|
162
165
|
const finalElements = finalElementsReversed.reverse();
|
|
166
|
+
syncMovedIndices(finalElements, arrayToMap([...oldElements, ...newElements]));
|
|
163
167
|
// ---------------------------------------------------------------------------
|
|
164
168
|
bindTextToShapeAfterDuplication(elementsWithClones, oldElements, oldIdToDuplicatedId);
|
|
165
169
|
fixBindingsAfterDuplication(elementsWithClones, oldElements, oldIdToDuplicatedId);
|
|
@@ -996,7 +996,7 @@ export declare const actionLoadScene: {
|
|
|
996
996
|
};
|
|
997
997
|
predicate: (elements: readonly import("../element/types").ExcalidrawElement[], appState: import("../types").AppState, props: import("../types").ExcalidrawProps, app: import("../types").AppClassProperties) => boolean;
|
|
998
998
|
perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>, _: any, app: import("../types").AppClassProperties) => Promise<false | {
|
|
999
|
-
elements: import("../element/types").
|
|
999
|
+
elements: import("../element/types").OrderedExcalidrawElement[];
|
|
1000
1000
|
appState: {
|
|
1001
1001
|
contextMenu: {
|
|
1002
1002
|
items: import("../components/ContextMenu").ContextMenuItems;
|
|
@@ -5,7 +5,7 @@ export declare const actionFinalize: {
|
|
|
5
5
|
name: "finalize";
|
|
6
6
|
label: string;
|
|
7
7
|
trackEvent: false;
|
|
8
|
-
perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<AppState>, _: any,
|
|
8
|
+
perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<AppState>, _: any, app: import("../types").AppClassProperties) => {
|
|
9
9
|
elements: import("../element/types").ExcalidrawElement[] | undefined;
|
|
10
10
|
appState: {
|
|
11
11
|
cursorButton: "up";
|
|
@@ -9,7 +9,6 @@ import { register } from "./register";
|
|
|
9
9
|
import { mutateElement } from "../element/mutateElement";
|
|
10
10
|
import { isPathALoop } from "../math";
|
|
11
11
|
import { LinearElementEditor } from "../element/linearElementEditor";
|
|
12
|
-
import Scene from "../scene/Scene";
|
|
13
12
|
import { maybeBindLinearElement, bindOrUnbindLinearElement, } from "../element/binding";
|
|
14
13
|
import { isBindingElement, isLinearElement } from "../element/typeChecks";
|
|
15
14
|
import { resetCursor } from "../cursor";
|
|
@@ -17,7 +16,8 @@ export const actionFinalize = register({
|
|
|
17
16
|
name: "finalize",
|
|
18
17
|
label: "",
|
|
19
18
|
trackEvent: false,
|
|
20
|
-
perform: (elements, appState, _,
|
|
19
|
+
perform: (elements, appState, _, app) => {
|
|
20
|
+
const { interactiveCanvas, focusContainer, scene } = app;
|
|
21
21
|
const elementsMap = scene.getNonDeletedElementsMap();
|
|
22
22
|
if (appState.editingLinearElement) {
|
|
23
23
|
const { elementId, startBindingElement, endBindingElement } = appState.editingLinearElement;
|
|
@@ -88,7 +88,7 @@ export const actionFinalize = register({
|
|
|
88
88
|
!isLoop &&
|
|
89
89
|
multiPointElement.points.length > 1) {
|
|
90
90
|
const [x, y] = LinearElementEditor.getPointAtIndexGlobalCoordinates(multiPointElement, -1, arrayToMap(elements));
|
|
91
|
-
maybeBindLinearElement(multiPointElement, appState,
|
|
91
|
+
maybeBindLinearElement(multiPointElement, appState, { x, y }, app);
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
if ((!appState.activeTool.locked &&
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { ExcalidrawElement } from "../element/types";
|
|
3
|
-
import { AppState } from "../types";
|
|
3
|
+
import { AppClassProperties, AppState } from "../types";
|
|
4
4
|
export declare const actionFlipHorizontal: {
|
|
5
5
|
name: "flipHorizontal";
|
|
6
6
|
label: string;
|
|
@@ -8,7 +8,7 @@ export declare const actionFlipHorizontal: {
|
|
|
8
8
|
trackEvent: {
|
|
9
9
|
category: "element";
|
|
10
10
|
};
|
|
11
|
-
perform: (elements: readonly ExcalidrawElement[], appState: Readonly<AppState>, _: any, app:
|
|
11
|
+
perform: (elements: readonly ExcalidrawElement[], appState: Readonly<AppState>, _: any, app: AppClassProperties) => {
|
|
12
12
|
elements: ExcalidrawElement[];
|
|
13
13
|
appState: Readonly<AppState>;
|
|
14
14
|
commitToHistory: true;
|
|
@@ -24,7 +24,7 @@ export declare const actionFlipVertical: {
|
|
|
24
24
|
trackEvent: {
|
|
25
25
|
category: "element";
|
|
26
26
|
};
|
|
27
|
-
perform: (elements: readonly ExcalidrawElement[], appState: Readonly<AppState>, _: any, app:
|
|
27
|
+
perform: (elements: readonly ExcalidrawElement[], appState: Readonly<AppState>, _: any, app: AppClassProperties) => {
|
|
28
28
|
elements: ExcalidrawElement[];
|
|
29
29
|
appState: Readonly<AppState>;
|
|
30
30
|
commitToHistory: true;
|
|
@@ -15,7 +15,7 @@ export const actionFlipHorizontal = register({
|
|
|
15
15
|
trackEvent: { category: "element" },
|
|
16
16
|
perform: (elements, appState, _, app) => {
|
|
17
17
|
return {
|
|
18
|
-
elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, app.scene.getNonDeletedElementsMap(), appState, "horizontal"), appState, app),
|
|
18
|
+
elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, app.scene.getNonDeletedElementsMap(), appState, "horizontal", app), appState, app),
|
|
19
19
|
appState,
|
|
20
20
|
commitToHistory: true,
|
|
21
21
|
};
|
|
@@ -29,27 +29,27 @@ export const actionFlipVertical = register({
|
|
|
29
29
|
trackEvent: { category: "element" },
|
|
30
30
|
perform: (elements, appState, _, app) => {
|
|
31
31
|
return {
|
|
32
|
-
elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, app.scene.getNonDeletedElementsMap(), appState, "vertical"), appState, app),
|
|
32
|
+
elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, app.scene.getNonDeletedElementsMap(), appState, "vertical", app), appState, app),
|
|
33
33
|
appState,
|
|
34
34
|
commitToHistory: true,
|
|
35
35
|
};
|
|
36
36
|
},
|
|
37
37
|
keyTest: (event) => event.shiftKey && event.code === CODES.V && !event[KEYS.CTRL_OR_CMD],
|
|
38
38
|
});
|
|
39
|
-
const flipSelectedElements = (elements, elementsMap, appState, flipDirection) => {
|
|
39
|
+
const flipSelectedElements = (elements, elementsMap, appState, flipDirection, app) => {
|
|
40
40
|
const selectedElements = getSelectedElements(getNonDeletedElements(elements), appState, {
|
|
41
41
|
includeBoundTextElement: true,
|
|
42
42
|
includeElementsInFrames: true,
|
|
43
43
|
});
|
|
44
|
-
const updatedElements = flipElements(selectedElements, elements, elementsMap, appState, flipDirection);
|
|
44
|
+
const updatedElements = flipElements(selectedElements, elements, elementsMap, appState, flipDirection, app);
|
|
45
45
|
const updatedElementsMap = arrayToMap(updatedElements);
|
|
46
46
|
return elements.map((element) => updatedElementsMap.get(element.id) || element);
|
|
47
47
|
};
|
|
48
|
-
const flipElements = (selectedElements, elements, elementsMap, appState, flipDirection) => {
|
|
48
|
+
const flipElements = (selectedElements, elements, elementsMap, appState, flipDirection, app) => {
|
|
49
49
|
const { minX, minY, maxX, maxY } = getCommonBoundingBox(selectedElements);
|
|
50
50
|
resizeMultipleElements(elementsMap, selectedElements, elementsMap, "nw", true, flipDirection === "horizontal" ? maxX : minX, flipDirection === "horizontal" ? minY : maxY);
|
|
51
51
|
isBindingEnabled(appState)
|
|
52
|
-
? bindOrUnbindSelectedElements(selectedElements,
|
|
52
|
+
? bindOrUnbindSelectedElements(selectedElements, app)
|
|
53
53
|
: unbindLinearElements(selectedElements, elementsMap);
|
|
54
54
|
return selectedElements;
|
|
55
55
|
};
|
|
@@ -12,6 +12,7 @@ import { randomId } from "../random";
|
|
|
12
12
|
import { ToolButton } from "../components/ToolButton";
|
|
13
13
|
import { isBoundToContainer } from "../element/typeChecks";
|
|
14
14
|
import { getElementsInResizingFrame, getFrameLikeElements, groupByFrameLikes, removeElementsFromFrame, replaceAllElementsInFrame, } from "../frame";
|
|
15
|
+
import { syncMovedIndices } from "../fractionalIndex";
|
|
15
16
|
const allElementsInSameGroup = (elements) => {
|
|
16
17
|
if (elements.length >= 2) {
|
|
17
18
|
const groupIds = elements[0].groupIds;
|
|
@@ -90,17 +91,18 @@ export const actionGroup = register({
|
|
|
90
91
|
const elementsBeforeGroup = nextElements
|
|
91
92
|
.slice(0, lastGroupElementIndex)
|
|
92
93
|
.filter((updatedElement) => !isElementInGroup(updatedElement, newGroupId));
|
|
93
|
-
|
|
94
|
+
const reorderedElements = [
|
|
94
95
|
...elementsBeforeGroup,
|
|
95
96
|
...elementsInGroup,
|
|
96
97
|
...elementsAfterGroup,
|
|
97
98
|
];
|
|
99
|
+
syncMovedIndices(reorderedElements, arrayToMap(elementsInGroup));
|
|
98
100
|
return {
|
|
99
101
|
appState: {
|
|
100
102
|
...appState,
|
|
101
103
|
...selectGroup(newGroupId, { ...appState, selectedGroupIds: {} }, getNonDeletedElements(nextElements)),
|
|
102
104
|
},
|
|
103
|
-
elements:
|
|
105
|
+
elements: reorderedElements,
|
|
104
106
|
commitToHistory: true,
|
|
105
107
|
};
|
|
106
108
|
},
|
|
@@ -7,6 +7,7 @@ import { newElementWith } from "../element/mutateElement";
|
|
|
7
7
|
import { fixBindingsAfterDeletion } from "../element/binding";
|
|
8
8
|
import { arrayToMap } from "../utils";
|
|
9
9
|
import { isWindows } from "../constants";
|
|
10
|
+
import { syncInvalidIndices } from "../fractionalIndex";
|
|
10
11
|
const writeData = (prevElements, appState, updater) => {
|
|
11
12
|
const commitToHistory = false;
|
|
12
13
|
if (!appState.multiElement &&
|
|
@@ -25,6 +26,8 @@ const writeData = (prevElements, appState, updater) => {
|
|
|
25
26
|
.map((nextElement) => newElementWith(prevElementMap.get(nextElement.id) || nextElement, nextElement))
|
|
26
27
|
.concat(deletedElements.map((prevElement) => newElementWith(prevElement, { isDeleted: true })));
|
|
27
28
|
fixBindingsAfterDeletion(elements, deletedElements);
|
|
29
|
+
// TODO: will be replaced in #7348
|
|
30
|
+
syncInvalidIndices(elements);
|
|
28
31
|
return {
|
|
29
32
|
elements,
|
|
30
33
|
appState: { ...appState, ...data.appState },
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="react" />
|
|
2
2
|
export declare const actionSendBackward: {
|
|
3
3
|
name: "sendBackward";
|
|
4
4
|
label: string;
|
|
@@ -7,15 +7,15 @@ export declare const actionSendBackward: {
|
|
|
7
7
|
category: "element";
|
|
8
8
|
};
|
|
9
9
|
perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>) => {
|
|
10
|
-
elements: import("../element/types").ExcalidrawElement[];
|
|
10
|
+
elements: readonly import("../element/types").ExcalidrawElement[];
|
|
11
11
|
appState: Readonly<import("../types").AppState>;
|
|
12
12
|
commitToHistory: true;
|
|
13
13
|
};
|
|
14
14
|
keyPriority: number;
|
|
15
|
-
keyTest: (event:
|
|
15
|
+
keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
|
|
16
16
|
PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
|
|
17
17
|
} & {
|
|
18
|
-
keyTest?: ((event:
|
|
18
|
+
keyTest?: ((event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
|
|
19
19
|
};
|
|
20
20
|
export declare const actionBringForward: {
|
|
21
21
|
name: "bringForward";
|
|
@@ -25,15 +25,15 @@ export declare const actionBringForward: {
|
|
|
25
25
|
category: "element";
|
|
26
26
|
};
|
|
27
27
|
perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>) => {
|
|
28
|
-
elements: import("../element/types").ExcalidrawElement[];
|
|
28
|
+
elements: readonly import("../element/types").ExcalidrawElement[];
|
|
29
29
|
appState: Readonly<import("../types").AppState>;
|
|
30
30
|
commitToHistory: true;
|
|
31
31
|
};
|
|
32
32
|
keyPriority: number;
|
|
33
|
-
keyTest: (event:
|
|
33
|
+
keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
|
|
34
34
|
PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
|
|
35
35
|
} & {
|
|
36
|
-
keyTest?: ((event:
|
|
36
|
+
keyTest?: ((event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
|
|
37
37
|
};
|
|
38
38
|
export declare const actionSendToBack: {
|
|
39
39
|
name: "sendToBack";
|
|
@@ -47,10 +47,10 @@ export declare const actionSendToBack: {
|
|
|
47
47
|
appState: Readonly<import("../types").AppState>;
|
|
48
48
|
commitToHistory: true;
|
|
49
49
|
};
|
|
50
|
-
keyTest: (event:
|
|
50
|
+
keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
|
|
51
51
|
PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
|
|
52
52
|
} & {
|
|
53
|
-
keyTest?: ((event:
|
|
53
|
+
keyTest?: ((event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
|
|
54
54
|
};
|
|
55
55
|
export declare const actionBringToFront: {
|
|
56
56
|
name: "bringToFront";
|
|
@@ -64,8 +64,8 @@ export declare const actionBringToFront: {
|
|
|
64
64
|
appState: Readonly<import("../types").AppState>;
|
|
65
65
|
commitToHistory: true;
|
|
66
66
|
};
|
|
67
|
-
keyTest: (event:
|
|
67
|
+
keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
|
|
68
68
|
PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
|
|
69
69
|
} & {
|
|
70
|
-
keyTest?: ((event:
|
|
70
|
+
keyTest?: ((event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
|
|
71
71
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// place here categories that you want to track. We want to track just a
|
|
2
2
|
// small subset of categories at a given time.
|
|
3
|
-
const ALLOWED_CATEGORIES_TO_TRACK = ["ai"];
|
|
3
|
+
const ALLOWED_CATEGORIES_TO_TRACK = ["ai", "command_palette"];
|
|
4
4
|
export const trackEvent = (category, action, label, value) => {
|
|
5
5
|
try {
|
|
6
6
|
// prettier-ignore
|
|
@@ -4,9 +4,10 @@ import { ActionManager } from "../actions/manager";
|
|
|
4
4
|
import { EXPORT_IMAGE_TYPES } from "../constants";
|
|
5
5
|
import { ExportedElements } from "../data";
|
|
6
6
|
import { LinearElementEditor } from "../element/linearElementEditor";
|
|
7
|
-
import { ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement, ExcalidrawFrameLikeElement, ExcalidrawIframeElement, ExcalidrawEmbeddableElement } from "../element/types";
|
|
7
|
+
import { ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement, ExcalidrawFrameLikeElement, ExcalidrawIframeElement, ExcalidrawEmbeddableElement, Ordered } from "../element/types";
|
|
8
8
|
import History from "../history";
|
|
9
9
|
import Scene from "../scene/Scene";
|
|
10
|
+
import { GeometricShape } from "../../utils/geometry/shape";
|
|
10
11
|
import { AppClassProperties, AppProps, AppState, ExcalidrawImperativeAPI, BinaryFiles, LibraryItems, SceneData, Device, FrameNameBoundsCache, SidebarName, SidebarTabName, ToolType, OnUserFollowedPayload } from "../types";
|
|
11
12
|
import { FileSystemHandle } from "../data/filesystem";
|
|
12
13
|
import { Renderer } from "../scene/Renderer";
|
|
@@ -232,8 +233,8 @@ declare class App extends React.Component<AppProps, AppState> {
|
|
|
232
233
|
private toggleOverscrollBehavior;
|
|
233
234
|
render(): JSX.Element;
|
|
234
235
|
focusContainer: AppClassProperties["focusContainer"];
|
|
235
|
-
getSceneElementsIncludingDeleted: () => readonly
|
|
236
|
-
getSceneElements: () => readonly NonDeletedExcalidrawElement[];
|
|
236
|
+
getSceneElementsIncludingDeleted: () => readonly import("../element/types").OrderedExcalidrawElement[];
|
|
237
|
+
getSceneElements: () => readonly Ordered<NonDeletedExcalidrawElement>[];
|
|
237
238
|
onInsertElements: (elements: readonly ExcalidrawElement[]) => void;
|
|
238
239
|
onExportImage: (type: keyof typeof EXPORT_IMAGE_TYPES, elements: ExportedElements, opts: {
|
|
239
240
|
exportingFrame: ExcalidrawFrameLikeElement | null;
|
|
@@ -382,8 +383,17 @@ declare class App extends React.Component<AppProps, AppState> {
|
|
|
382
383
|
private handleTextWysiwyg;
|
|
383
384
|
private deselectElements;
|
|
384
385
|
private getTextElementAtPosition;
|
|
386
|
+
/**
|
|
387
|
+
* get the pure geometric shape of an excalidraw element
|
|
388
|
+
* which is then used for hit detection
|
|
389
|
+
*/
|
|
390
|
+
getElementShape(element: ExcalidrawElement): GeometricShape;
|
|
391
|
+
private getBoundTextShape;
|
|
385
392
|
private getElementAtPosition;
|
|
386
393
|
private getElementsAtPosition;
|
|
394
|
+
private getHitThreshold;
|
|
395
|
+
private hitElement;
|
|
396
|
+
private getTextBindableContainerAtPosition;
|
|
387
397
|
private startTextEditing;
|
|
388
398
|
private handleCanvasDoubleClick;
|
|
389
399
|
private getElementLinkAtPosition;
|