@excalidraw/excalidraw 0.17.1-1d71f84 → 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.
Files changed (111) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/browser/dev/excalidraw-assets-dev/{chunk-AK7SWNLN.js → chunk-23CKV3WP.js} +4 -2
  3. package/dist/browser/dev/excalidraw-assets-dev/chunk-23CKV3WP.js.map +7 -0
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-RWZVJAQU.js → chunk-7D5BMEAB.js} +2227 -1976
  5. package/dist/browser/dev/excalidraw-assets-dev/chunk-7D5BMEAB.js.map +7 -0
  6. package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js → en-W7TECCRB.js} +2 -2
  7. package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js → image-JKT6GXZD.js} +2 -2
  8. package/dist/browser/dev/index.css +20 -0
  9. package/dist/browser/dev/index.css.map +2 -2
  10. package/dist/browser/dev/index.js +770 -585
  11. package/dist/browser/dev/index.js.map +4 -4
  12. package/dist/browser/prod/excalidraw-assets/chunk-DWOM5R6H.js +55 -0
  13. package/dist/browser/prod/excalidraw-assets/{chunk-CTYINSWT.js → chunk-SK23VHAR.js} +2 -2
  14. package/dist/browser/prod/excalidraw-assets/{en-LROPV2RN.js → en-SMMH575S.js} +1 -1
  15. package/dist/browser/prod/excalidraw-assets/image-WDEQS5RL.js +1 -0
  16. package/dist/browser/prod/index.css +1 -1
  17. package/dist/browser/prod/index.js +22 -22
  18. package/dist/{prod/en-II4GK66F.json → dev/en-CVBEBUBY.json} +3 -1
  19. package/dist/dev/index.css +20 -0
  20. package/dist/dev/index.css.map +2 -2
  21. package/dist/dev/index.js +2383 -2074
  22. package/dist/dev/index.js.map +4 -4
  23. package/dist/excalidraw/actions/actionBoundText.js +4 -1
  24. package/dist/excalidraw/actions/actionCanvas.js +3 -1
  25. package/dist/excalidraw/actions/actionDuplicateSelection.js +4 -0
  26. package/dist/excalidraw/actions/actionExport.d.ts +1 -1
  27. package/dist/excalidraw/actions/actionFinalize.d.ts +1 -1
  28. package/dist/excalidraw/actions/actionFinalize.js +3 -3
  29. package/dist/excalidraw/actions/actionFlip.d.ts +3 -3
  30. package/dist/excalidraw/actions/actionFlip.js +6 -6
  31. package/dist/excalidraw/actions/actionGroup.js +4 -2
  32. package/dist/excalidraw/actions/actionHistory.js +3 -0
  33. package/dist/excalidraw/actions/actionZindex.d.ts +11 -11
  34. package/dist/excalidraw/actions/shortcuts.js +1 -1
  35. package/dist/excalidraw/analytics.js +1 -1
  36. package/dist/excalidraw/components/App.d.ts +13 -3
  37. package/dist/excalidraw/components/App.js +212 -83
  38. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +24 -10
  39. package/dist/excalidraw/components/DarkModeToggle.js +3 -1
  40. package/dist/excalidraw/components/HelpDialog.js +8 -6
  41. package/dist/excalidraw/components/RadioGroup.d.ts +2 -1
  42. package/dist/excalidraw/components/RadioGroup.js +1 -1
  43. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.js +6 -2
  44. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +18 -0
  45. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.js +9 -0
  46. package/dist/excalidraw/components/hyperlink/Hyperlink.js +3 -3
  47. package/dist/excalidraw/components/hyperlink/helpers.js +2 -3
  48. package/dist/excalidraw/components/icons.d.ts +3 -0
  49. package/dist/excalidraw/components/icons.js +5 -1
  50. package/dist/excalidraw/components/main-menu/DefaultItems.d.ts +12 -2
  51. package/dist/excalidraw/components/main-menu/DefaultItems.js +38 -7
  52. package/dist/excalidraw/constants.d.ts +0 -3
  53. package/dist/excalidraw/constants.js +0 -3
  54. package/dist/excalidraw/data/magic.js +2 -1
  55. package/dist/excalidraw/data/reconcile.d.ts +6 -0
  56. package/dist/excalidraw/data/reconcile.js +49 -0
  57. package/dist/excalidraw/data/restore.d.ts +3 -3
  58. package/dist/excalidraw/data/restore.js +5 -6
  59. package/dist/excalidraw/data/transform.d.ts +1 -1
  60. package/dist/excalidraw/data/transform.js +12 -3
  61. package/dist/excalidraw/element/binding.d.ts +22 -9
  62. package/dist/excalidraw/element/binding.js +403 -26
  63. package/dist/excalidraw/element/bounds.d.ts +0 -1
  64. package/dist/excalidraw/element/bounds.js +0 -3
  65. package/dist/excalidraw/element/collision.d.ts +14 -19
  66. package/dist/excalidraw/element/collision.js +36 -713
  67. package/dist/excalidraw/element/embeddable.js +18 -43
  68. package/dist/excalidraw/element/index.d.ts +0 -1
  69. package/dist/excalidraw/element/index.js +0 -1
  70. package/dist/excalidraw/element/linearElementEditor.d.ts +10 -10
  71. package/dist/excalidraw/element/linearElementEditor.js +6 -4
  72. package/dist/excalidraw/element/newElement.d.ts +1 -1
  73. package/dist/excalidraw/element/newElement.js +2 -1
  74. package/dist/excalidraw/element/textElement.d.ts +0 -1
  75. package/dist/excalidraw/element/textElement.js +0 -30
  76. package/dist/excalidraw/element/types.d.ts +17 -2
  77. package/dist/excalidraw/errors.d.ts +3 -0
  78. package/dist/excalidraw/errors.js +3 -0
  79. package/dist/excalidraw/fractionalIndex.d.ts +40 -0
  80. package/dist/excalidraw/fractionalIndex.js +241 -0
  81. package/dist/excalidraw/frame.d.ts +1 -1
  82. package/dist/excalidraw/hooks/useCreatePortalContainer.js +2 -1
  83. package/dist/excalidraw/locales/en.json +3 -1
  84. package/dist/excalidraw/renderer/helpers.js +2 -2
  85. package/dist/excalidraw/renderer/interactiveScene.js +1 -1
  86. package/dist/excalidraw/renderer/renderElement.js +3 -3
  87. package/dist/excalidraw/renderer/renderSnaps.js +2 -1
  88. package/dist/excalidraw/scene/Scene.d.ts +7 -6
  89. package/dist/excalidraw/scene/Scene.js +28 -13
  90. package/dist/excalidraw/scene/export.js +4 -3
  91. package/dist/excalidraw/types.d.ts +4 -3
  92. package/dist/excalidraw/utils.d.ts +1 -0
  93. package/dist/excalidraw/utils.js +1 -0
  94. package/dist/excalidraw/zindex.d.ts +2 -2
  95. package/dist/excalidraw/zindex.js +9 -13
  96. package/dist/{dev/en-II4GK66F.json → prod/en-CVBEBUBY.json} +3 -1
  97. package/dist/prod/index.css +1 -1
  98. package/dist/prod/index.js +36 -36
  99. package/dist/utils/collision.d.ts +4 -0
  100. package/dist/utils/collision.js +48 -0
  101. package/dist/utils/geometry/geometry.d.ts +71 -0
  102. package/dist/utils/geometry/geometry.js +674 -0
  103. package/dist/utils/geometry/shape.d.ts +55 -0
  104. package/dist/utils/geometry/shape.js +149 -0
  105. package/package.json +2 -1
  106. package/dist/browser/dev/excalidraw-assets-dev/chunk-AK7SWNLN.js.map +0 -7
  107. package/dist/browser/dev/excalidraw-assets-dev/chunk-RWZVJAQU.js.map +0 -7
  108. package/dist/browser/prod/excalidraw-assets/chunk-LL4GORAM.js +0 -55
  109. package/dist/browser/prod/excalidraw-assets/image-EFCJDJH3.js +0 -1
  110. /package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js.map → en-W7TECCRB.js.map} +0 -0
  111. /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 === "dark" ? "buttons.lightMode" : "buttons.darkMode";
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").ExcalidrawElement[];
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, { interactiveCanvas, focusContainer, scene }: import("../types").AppClassProperties) => {
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, _, { interactiveCanvas, focusContainer, scene }) => {
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, Scene.getScene(multiPointElement), { x, y }, elementsMap);
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: import("../types").AppClassProperties) => {
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: import("../types").AppClassProperties) => {
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, elements, elementsMap)
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
- nextElements = [
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: nextElements,
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
- import React from "react";
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: React.KeyboardEvent<Element> | KeyboardEvent) => boolean;
15
+ keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
16
16
  PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
17
17
  } & {
18
- keyTest?: ((event: React.KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
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: React.KeyboardEvent<Element> | KeyboardEvent) => boolean;
33
+ keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
34
34
  PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
35
35
  } & {
36
- keyTest?: ((event: React.KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
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: React.KeyboardEvent<Element> | KeyboardEvent) => boolean;
50
+ keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
51
51
  PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
52
52
  } & {
53
- keyTest?: ((event: React.KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
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: React.KeyboardEvent<Element> | KeyboardEvent) => boolean;
67
+ keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
68
68
  PanelComponent: ({ updateData, appState }: import("./types").PanelComponentProps) => JSX.Element;
69
69
  } & {
70
- keyTest?: ((event: React.KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
70
+ keyTest?: ((event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
71
71
  };
@@ -8,8 +8,8 @@ const shortcutMap = {
8
8
  clearCanvas: [getShortcutKey("CtrlOrCmd+Delete")],
9
9
  imageExport: [getShortcutKey("CtrlOrCmd+Shift+E")],
10
10
  commandPalette: [
11
- getShortcutKey("CtrlOrCmd+Shift+P"),
12
11
  getShortcutKey("CtrlOrCmd+/"),
12
+ getShortcutKey("CtrlOrCmd+Shift+P"),
13
13
  ],
14
14
  cut: [getShortcutKey("CtrlOrCmd+X")],
15
15
  copy: [getShortcutKey("CtrlOrCmd+C")],
@@ -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 ExcalidrawElement[];
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;