@excalidraw/excalidraw 0.17.1-7441-4e2c539 → 0.17.1-a38e82f

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 (249) hide show
  1. package/CHANGELOG.md +52 -2
  2. package/dist/browser/dev/excalidraw-assets-dev/chunk-5VWQDKDR.js +20279 -0
  3. package/dist/browser/dev/excalidraw-assets-dev/chunk-5VWQDKDR.js.map +7 -0
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-2W5GQUR4.js → chunk-IM4WTX2M.js} +12 -6
  5. package/dist/browser/dev/excalidraw-assets-dev/chunk-IM4WTX2M.js.map +7 -0
  6. package/dist/browser/dev/excalidraw-assets-dev/{en-OC6JWP3X.js → en-IOBA4CS2.js} +4 -2
  7. package/dist/browser/dev/excalidraw-assets-dev/image-LK4UNFRZ.css +6 -0
  8. package/dist/browser/dev/excalidraw-assets-dev/image-LK4UNFRZ.css.map +7 -0
  9. package/dist/browser/dev/excalidraw-assets-dev/{image-HYNUJ3XL.js → image-VKDAL6BQ.js} +2 -4
  10. package/dist/browser/dev/excalidraw-assets-dev/roundRect-T5BX56ZF.js +161 -0
  11. package/dist/browser/dev/excalidraw-assets-dev/roundRect-T5BX56ZF.js.map +7 -0
  12. package/dist/browser/dev/index.css +189 -129
  13. package/dist/browser/dev/index.css.map +3 -3
  14. package/dist/browser/dev/index.js +34707 -26
  15. package/dist/browser/dev/index.js.map +4 -4
  16. package/dist/browser/prod/excalidraw-assets/chunk-LIG3S5TN.js +11 -0
  17. package/dist/browser/prod/excalidraw-assets/chunk-N2C5DK3B.js +55 -0
  18. package/dist/browser/prod/excalidraw-assets/en-WFZVQ7I6.js +1 -0
  19. package/dist/browser/prod/excalidraw-assets/image-4AT7LYMR.js +1 -0
  20. package/dist/browser/prod/excalidraw-assets/image-X66R2EM5.css +1 -0
  21. package/dist/browser/prod/excalidraw-assets/roundRect-2ACQK4DA.js +1 -0
  22. package/dist/browser/prod/index.css +1 -1
  23. package/dist/browser/prod/index.js +203 -1
  24. package/dist/{prod/en-RLIAOBCI.json → dev/en-TDNWCAOT.json} +9 -5
  25. package/dist/dev/index.css +189 -129
  26. package/dist/dev/index.css.map +3 -3
  27. package/dist/dev/index.js +38445 -39402
  28. package/dist/dev/index.js.map +4 -4
  29. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +12 -12
  30. package/dist/excalidraw/actions/actionAlign.d.ts +6 -6
  31. package/dist/excalidraw/actions/actionAlign.js +2 -1
  32. package/dist/excalidraw/actions/actionBoundText.d.ts +8 -8
  33. package/dist/excalidraw/actions/actionBoundText.js +8 -8
  34. package/dist/excalidraw/actions/actionCanvas.d.ts +46 -46
  35. package/dist/excalidraw/actions/actionClipboard.d.ts +27 -27
  36. package/dist/excalidraw/actions/actionClipboard.js +9 -2
  37. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +12 -12
  38. package/dist/excalidraw/actions/actionDeleteSelected.js +3 -2
  39. package/dist/excalidraw/actions/actionDistribute.d.ts +2 -2
  40. package/dist/excalidraw/actions/actionDistribute.js +1 -1
  41. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +1 -1
  42. package/dist/excalidraw/actions/actionDuplicateSelection.js +4 -3
  43. package/dist/excalidraw/actions/actionElementLock.d.ts +8 -8
  44. package/dist/excalidraw/actions/actionExport.d.ts +35 -35
  45. package/dist/excalidraw/actions/actionExport.js +4 -4
  46. package/dist/excalidraw/actions/actionFinalize.d.ts +7 -7
  47. package/dist/excalidraw/actions/actionFinalize.js +7 -6
  48. package/dist/excalidraw/actions/actionFlip.d.ts +2 -2
  49. package/dist/excalidraw/actions/actionFlip.js +11 -11
  50. package/dist/excalidraw/actions/actionFrame.d.ts +13 -13
  51. package/dist/excalidraw/actions/actionFrame.js +1 -1
  52. package/dist/excalidraw/actions/actionGroup.d.ts +8 -8
  53. package/dist/excalidraw/actions/actionGroup.js +3 -2
  54. package/dist/excalidraw/actions/actionLinearEditor.d.ts +4 -4
  55. package/dist/excalidraw/actions/actionLinearEditor.js +1 -1
  56. package/dist/excalidraw/{element/Hyperlink.d.ts → actions/actionLink.d.ts} +28 -50
  57. package/dist/excalidraw/actions/actionLink.js +40 -0
  58. package/dist/excalidraw/actions/actionMenu.d.ts +11 -11
  59. package/dist/excalidraw/actions/actionNavigate.d.ts +8 -8
  60. package/dist/excalidraw/actions/actionNavigate.js +1 -1
  61. package/dist/excalidraw/actions/actionProperties.d.ts +64 -64
  62. package/dist/excalidraw/actions/actionProperties.js +32 -27
  63. package/dist/excalidraw/actions/actionSelectAll.d.ts +4 -4
  64. package/dist/excalidraw/actions/actionSelectAll.js +1 -1
  65. package/dist/excalidraw/actions/actionStyles.d.ts +6 -6
  66. package/dist/excalidraw/actions/actionStyles.js +4 -4
  67. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +4 -4
  68. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +4 -4
  69. package/dist/excalidraw/actions/actionToggleStats.d.ts +4 -4
  70. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +4 -4
  71. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +4 -4
  72. package/dist/excalidraw/actions/index.d.ts +1 -1
  73. package/dist/excalidraw/actions/index.js +1 -1
  74. package/dist/excalidraw/actions/manager.js +2 -1
  75. package/dist/excalidraw/align.d.ts +2 -2
  76. package/dist/excalidraw/align.js +2 -2
  77. package/dist/excalidraw/animated-trail.d.ts +33 -0
  78. package/dist/excalidraw/animated-trail.js +96 -0
  79. package/dist/excalidraw/animation-frame-handler.d.ts +16 -0
  80. package/dist/excalidraw/animation-frame-handler.js +55 -0
  81. package/dist/excalidraw/appState.d.ts +1 -1
  82. package/dist/excalidraw/appState.js +1 -3
  83. package/dist/excalidraw/clipboard.js +5 -5
  84. package/dist/excalidraw/components/Actions.d.ts +3 -3
  85. package/dist/excalidraw/components/Actions.js +18 -7
  86. package/dist/excalidraw/components/App.d.ts +32 -17
  87. package/dist/excalidraw/components/App.js +474 -339
  88. package/dist/excalidraw/components/Button.d.ts +1 -1
  89. package/dist/excalidraw/components/FilledButton.d.ts +2 -2
  90. package/dist/excalidraw/components/FilledButton.js +27 -3
  91. package/dist/excalidraw/components/FollowMode/FollowMode.js +1 -1
  92. package/dist/excalidraw/components/ImageExportDialog.d.ts +2 -1
  93. package/dist/excalidraw/components/ImageExportDialog.js +16 -12
  94. package/dist/excalidraw/components/JSONExportDialog.js +1 -1
  95. package/dist/excalidraw/components/{LaserTool/LaserPointerButton.d.ts → LaserPointerButton.d.ts} +1 -1
  96. package/dist/excalidraw/components/{LaserTool/LaserPointerButton.js → LaserPointerButton.js} +2 -2
  97. package/dist/excalidraw/components/LayerUI.js +3 -3
  98. package/dist/excalidraw/components/MobileMenu.js +1 -1
  99. package/dist/excalidraw/components/ProjectName.d.ts +0 -1
  100. package/dist/excalidraw/components/ProjectName.js +1 -1
  101. package/dist/excalidraw/components/SVGLayer.d.ts +8 -0
  102. package/dist/excalidraw/components/SVGLayer.js +20 -0
  103. package/dist/excalidraw/components/ShareableLinkDialog.js +10 -10
  104. package/dist/excalidraw/components/Stack.d.ts +2 -2
  105. package/dist/excalidraw/components/TTDDialog/common.js +10 -1
  106. package/dist/excalidraw/components/TextField.d.ts +5 -2
  107. package/dist/excalidraw/components/TextField.js +6 -3
  108. package/dist/excalidraw/components/Toast.d.ts +3 -2
  109. package/dist/excalidraw/components/Toast.js +2 -2
  110. package/dist/excalidraw/components/ToolButton.js +2 -1
  111. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +2 -2
  112. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +6 -5
  113. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +4 -3
  114. package/dist/excalidraw/components/canvases/StaticCanvas.js +7 -5
  115. package/dist/excalidraw/components/dropdownMenu/DropdownMenuContent.js +22 -2
  116. package/dist/excalidraw/components/dropdownMenu/common.d.ts +1 -1
  117. package/dist/excalidraw/components/hyperlink/Hyperlink.d.ts +19 -0
  118. package/dist/excalidraw/{element → components/hyperlink}/Hyperlink.js +40 -115
  119. package/dist/excalidraw/components/hyperlink/helpers.d.ts +7 -0
  120. package/dist/excalidraw/components/hyperlink/helpers.js +49 -0
  121. package/dist/excalidraw/components/icons.d.ts +2 -1
  122. package/dist/excalidraw/components/icons.js +2 -1
  123. package/dist/excalidraw/components/live-collaboration/LiveCollaborationTrigger.js +3 -2
  124. package/dist/excalidraw/components/main-menu/DefaultItems.js +5 -2
  125. package/dist/excalidraw/constants.d.ts +8 -0
  126. package/dist/excalidraw/constants.js +10 -0
  127. package/dist/excalidraw/data/blob.js +13 -14
  128. package/dist/excalidraw/data/filesystem.d.ts +1 -1
  129. package/dist/excalidraw/data/index.d.ts +2 -1
  130. package/dist/excalidraw/data/index.js +20 -16
  131. package/dist/excalidraw/data/json.d.ts +1 -1
  132. package/dist/excalidraw/data/json.js +5 -3
  133. package/dist/excalidraw/data/resave.d.ts +1 -1
  134. package/dist/excalidraw/data/resave.js +2 -2
  135. package/dist/excalidraw/data/restore.js +8 -13
  136. package/dist/excalidraw/data/transform.js +13 -9
  137. package/dist/excalidraw/distribute.d.ts +2 -2
  138. package/dist/excalidraw/distribute.js +2 -2
  139. package/dist/excalidraw/element/ElementCanvasButtons.d.ts +3 -2
  140. package/dist/excalidraw/element/ElementCanvasButtons.js +4 -4
  141. package/dist/excalidraw/element/binding.d.ts +9 -9
  142. package/dist/excalidraw/element/binding.js +61 -59
  143. package/dist/excalidraw/element/bounds.d.ts +5 -5
  144. package/dist/excalidraw/element/bounds.js +29 -32
  145. package/dist/excalidraw/element/collision.d.ts +11 -11
  146. package/dist/excalidraw/element/collision.js +49 -46
  147. package/dist/excalidraw/element/containerCache.d.ts +11 -0
  148. package/dist/excalidraw/element/containerCache.js +14 -0
  149. package/dist/excalidraw/element/dragElements.js +10 -19
  150. package/dist/excalidraw/element/embeddable.d.ts +11 -12
  151. package/dist/excalidraw/element/embeddable.js +17 -27
  152. package/dist/excalidraw/element/image.js +1 -2
  153. package/dist/excalidraw/element/index.d.ts +0 -1
  154. package/dist/excalidraw/element/index.js +0 -1
  155. package/dist/excalidraw/element/linearElementEditor.d.ts +35 -35
  156. package/dist/excalidraw/element/linearElementEditor.js +79 -80
  157. package/dist/excalidraw/element/newElement.d.ts +4 -6
  158. package/dist/excalidraw/element/newElement.js +11 -16
  159. package/dist/excalidraw/element/resizeElements.d.ts +6 -6
  160. package/dist/excalidraw/element/resizeElements.js +40 -46
  161. package/dist/excalidraw/element/resizeTest.d.ts +3 -3
  162. package/dist/excalidraw/element/resizeTest.js +4 -4
  163. package/dist/excalidraw/element/sizeHelpers.d.ts +2 -2
  164. package/dist/excalidraw/element/sizeHelpers.js +2 -2
  165. package/dist/excalidraw/element/textElement.d.ts +18 -20
  166. package/dist/excalidraw/element/textElement.js +80 -111
  167. package/dist/excalidraw/element/textWysiwyg.d.ts +1 -6
  168. package/dist/excalidraw/element/textWysiwyg.js +15 -37
  169. package/dist/excalidraw/element/transformHandles.d.ts +4 -4
  170. package/dist/excalidraw/element/transformHandles.js +6 -6
  171. package/dist/excalidraw/element/typeChecks.js +4 -1
  172. package/dist/excalidraw/element/types.d.ts +24 -11
  173. package/dist/excalidraw/emitter.d.ts +5 -9
  174. package/dist/excalidraw/emitter.js +12 -12
  175. package/dist/excalidraw/frame.d.ts +26 -20
  176. package/dist/excalidraw/frame.js +157 -84
  177. package/dist/excalidraw/groups.d.ts +3 -3
  178. package/dist/excalidraw/groups.js +11 -3
  179. package/dist/excalidraw/history.d.ts +1 -1
  180. package/dist/excalidraw/index.d.ts +7 -3
  181. package/dist/excalidraw/index.js +14 -5
  182. package/dist/excalidraw/laser-trails.d.ts +19 -0
  183. package/dist/excalidraw/laser-trails.js +95 -0
  184. package/dist/excalidraw/locales/en.json +9 -5
  185. package/dist/excalidraw/reactUtils.d.ts +14 -0
  186. package/dist/excalidraw/reactUtils.js +45 -0
  187. package/dist/excalidraw/renderer/helpers.d.ts +13 -0
  188. package/dist/excalidraw/renderer/helpers.js +39 -0
  189. package/dist/excalidraw/renderer/interactiveScene.d.ts +20 -0
  190. package/dist/excalidraw/renderer/{renderScene.js → interactiveScene.js} +199 -474
  191. package/dist/excalidraw/renderer/renderElement.d.ts +6 -6
  192. package/dist/excalidraw/renderer/renderElement.js +54 -366
  193. package/dist/excalidraw/renderer/staticScene.d.ts +11 -0
  194. package/dist/excalidraw/renderer/staticScene.js +205 -0
  195. package/dist/excalidraw/renderer/staticSvgScene.d.ts +5 -0
  196. package/dist/excalidraw/renderer/staticSvgScene.js +385 -0
  197. package/dist/excalidraw/scene/Fonts.js +2 -1
  198. package/dist/excalidraw/scene/Renderer.d.ts +1 -1
  199. package/dist/excalidraw/scene/Renderer.js +32 -20
  200. package/dist/excalidraw/scene/Scene.d.ts +10 -9
  201. package/dist/excalidraw/scene/Scene.js +45 -21
  202. package/dist/excalidraw/scene/Shape.d.ts +3 -1
  203. package/dist/excalidraw/scene/Shape.js +7 -5
  204. package/dist/excalidraw/scene/ShapeCache.d.ts +2 -1
  205. package/dist/excalidraw/scene/ShapeCache.js +1 -0
  206. package/dist/excalidraw/scene/comparisons.js +2 -1
  207. package/dist/excalidraw/scene/export.d.ts +3 -0
  208. package/dist/excalidraw/scene/export.js +20 -40
  209. package/dist/excalidraw/scene/index.d.ts +0 -1
  210. package/dist/excalidraw/scene/index.js +0 -1
  211. package/dist/excalidraw/scene/scrollbars.d.ts +1 -1
  212. package/dist/excalidraw/scene/scrollbars.js +1 -1
  213. package/dist/excalidraw/scene/selection.d.ts +5 -5
  214. package/dist/excalidraw/scene/selection.js +16 -14
  215. package/dist/excalidraw/scene/types.d.ts +11 -5
  216. package/dist/excalidraw/snapping.d.ts +7 -7
  217. package/dist/excalidraw/snapping.js +21 -20
  218. package/dist/excalidraw/types.d.ts +11 -12
  219. package/dist/excalidraw/utility-types.d.ts +5 -0
  220. package/dist/excalidraw/utils.d.ts +25 -16
  221. package/dist/excalidraw/utils.js +52 -45
  222. package/dist/{dev/en-RLIAOBCI.json → prod/en-TDNWCAOT.json} +9 -5
  223. package/dist/prod/index.css +1 -1
  224. package/dist/prod/index.js +45 -45
  225. package/dist/utils/export.d.ts +0 -6
  226. package/dist/utils/export.js +0 -6
  227. package/dist/utils/index.d.ts +3 -0
  228. package/dist/utils/index.js +3 -0
  229. package/dist/utils/withinBounds.js +2 -1
  230. package/package.json +4 -4
  231. package/dist/browser/dev/excalidraw-assets-dev/chunk-2W5GQUR4.js.map +0 -7
  232. package/dist/browser/dev/excalidraw-assets-dev/chunk-SUHLFFEF.js +0 -53449
  233. package/dist/browser/dev/excalidraw-assets-dev/chunk-SUHLFFEF.js.map +0 -7
  234. package/dist/browser/dev/excalidraw-assets-dev/image-NOPDRTTM.css +0 -5797
  235. package/dist/browser/dev/excalidraw-assets-dev/image-NOPDRTTM.css.map +0 -7
  236. package/dist/browser/prod/excalidraw-assets/chunk-HE2P7BQ6.js +0 -257
  237. package/dist/browser/prod/excalidraw-assets/chunk-OWLL6VOG.js +0 -11
  238. package/dist/browser/prod/excalidraw-assets/en-ERQOR3OC.js +0 -1
  239. package/dist/browser/prod/excalidraw-assets/image-DZ6B4AID.js +0 -1
  240. package/dist/browser/prod/excalidraw-assets/image-J2QCCYAR.css +0 -1
  241. package/dist/excalidraw/components/LaserTool/LaserPathManager.d.ts +0 -28
  242. package/dist/excalidraw/components/LaserTool/LaserPathManager.js +0 -225
  243. package/dist/excalidraw/components/LaserTool/LaserTool.d.ts +0 -8
  244. package/dist/excalidraw/components/LaserTool/LaserTool.js +0 -15
  245. package/dist/excalidraw/renderer/renderScene.d.ts +0 -25
  246. package/dist/excalidraw/vite.config.d.mts +0 -2
  247. package/dist/excalidraw/vite.config.mjs +0 -13
  248. /package/dist/browser/dev/excalidraw-assets-dev/{en-OC6JWP3X.js.map → en-IOBA4CS2.js.map} +0 -0
  249. /package/dist/browser/dev/excalidraw-assets-dev/{image-HYNUJ3XL.js.map → image-VKDAL6BQ.js.map} +0 -0
@@ -23,11 +23,11 @@ const getNonDeletedElements = (scene, ids) => {
23
23
  });
24
24
  return result;
25
25
  };
26
- export const bindOrUnbindLinearElement = (linearElement, startBindingElement, endBindingElement) => {
26
+ export const bindOrUnbindLinearElement = (linearElement, startBindingElement, endBindingElement, elementsMap) => {
27
27
  const boundToElementIds = new Set();
28
28
  const unboundFromElementIds = new Set();
29
- bindOrUnbindLinearElementEdge(linearElement, startBindingElement, endBindingElement, "start", boundToElementIds, unboundFromElementIds);
30
- bindOrUnbindLinearElementEdge(linearElement, endBindingElement, startBindingElement, "end", boundToElementIds, unboundFromElementIds);
29
+ bindOrUnbindLinearElementEdge(linearElement, startBindingElement, endBindingElement, "start", boundToElementIds, unboundFromElementIds, elementsMap);
30
+ bindOrUnbindLinearElementEdge(linearElement, endBindingElement, startBindingElement, "end", boundToElementIds, unboundFromElementIds, elementsMap);
31
31
  const onlyUnbound = Array.from(unboundFromElementIds).filter((id) => !boundToElementIds.has(id));
32
32
  getNonDeletedElements(Scene.getScene(linearElement), onlyUnbound).forEach((element) => {
33
33
  mutateElement(element, {
@@ -39,7 +39,7 @@ const bindOrUnbindLinearElementEdge = (linearElement, bindableElement, otherEdge
39
39
  // Is mutated
40
40
  boundToElementIds,
41
41
  // Is mutated
42
- unboundFromElementIds) => {
42
+ unboundFromElementIds, elementsMap) => {
43
43
  if (bindableElement !== "keep") {
44
44
  if (bindableElement != null) {
45
45
  // Don't bind if we're trying to bind or are already bound to the same
@@ -49,7 +49,7 @@ unboundFromElementIds) => {
49
49
  ? !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(linearElement, bindableElement, startOrEnd)
50
50
  : startOrEnd === "start" ||
51
51
  otherEdgeBindableElement.id !== bindableElement.id)) {
52
- bindLinearElement(linearElement, bindableElement, startOrEnd);
52
+ bindLinearElement(linearElement, bindableElement, startOrEnd, elementsMap);
53
53
  boundToElementIds.add(bindableElement.id);
54
54
  }
55
55
  }
@@ -61,34 +61,34 @@ unboundFromElementIds) => {
61
61
  }
62
62
  }
63
63
  };
64
- export const bindOrUnbindSelectedElements = (elements) => {
65
- elements.forEach((element) => {
66
- if (isBindingElement(element)) {
67
- bindOrUnbindLinearElement(element, getElligibleElementForBindingElement(element, "start"), getElligibleElementForBindingElement(element, "end"));
64
+ export const bindOrUnbindSelectedElements = (selectedElements, elements, elementsMap) => {
65
+ selectedElements.forEach((selectedElement) => {
66
+ if (isBindingElement(selectedElement)) {
67
+ bindOrUnbindLinearElement(selectedElement, getElligibleElementForBindingElement(selectedElement, "start", elements, elementsMap), getElligibleElementForBindingElement(selectedElement, "end", elements, elementsMap), elementsMap);
68
68
  }
69
- else if (isBindableElement(element)) {
70
- maybeBindBindableElement(element);
69
+ else if (isBindableElement(selectedElement)) {
70
+ maybeBindBindableElement(selectedElement, elementsMap);
71
71
  }
72
72
  });
73
73
  };
74
- const maybeBindBindableElement = (bindableElement) => {
75
- getElligibleElementsForBindableElementAndWhere(bindableElement).forEach(([linearElement, where]) => bindOrUnbindLinearElement(linearElement, where === "end" ? "keep" : bindableElement, where === "start" ? "keep" : bindableElement));
74
+ const maybeBindBindableElement = (bindableElement, elementsMap) => {
75
+ getElligibleElementsForBindableElementAndWhere(bindableElement, elementsMap).forEach(([linearElement, where]) => bindOrUnbindLinearElement(linearElement, where === "end" ? "keep" : bindableElement, where === "start" ? "keep" : bindableElement, elementsMap));
76
76
  };
77
- export const maybeBindLinearElement = (linearElement, appState, scene, pointerCoords) => {
77
+ export const maybeBindLinearElement = (linearElement, appState, scene, pointerCoords, elementsMap) => {
78
78
  if (appState.startBoundElement != null) {
79
- bindLinearElement(linearElement, appState.startBoundElement, "start");
79
+ bindLinearElement(linearElement, appState.startBoundElement, "start", elementsMap);
80
80
  }
81
- const hoveredElement = getHoveredElementForBinding(pointerCoords, scene);
81
+ const hoveredElement = getHoveredElementForBinding(pointerCoords, scene.getNonDeletedElements(), elementsMap);
82
82
  if (hoveredElement != null &&
83
83
  !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(linearElement, hoveredElement, "end")) {
84
- bindLinearElement(linearElement, hoveredElement, "end");
84
+ bindLinearElement(linearElement, hoveredElement, "end", elementsMap);
85
85
  }
86
86
  };
87
- export const bindLinearElement = (linearElement, hoveredElement, startOrEnd) => {
87
+ export const bindLinearElement = (linearElement, hoveredElement, startOrEnd, elementsMap) => {
88
88
  mutateElement(linearElement, {
89
89
  [startOrEnd === "start" ? "startBinding" : "endBinding"]: {
90
90
  elementId: hoveredElement.id,
91
- ...calculateFocusAndGap(linearElement, hoveredElement, startOrEnd),
91
+ ...calculateFocusAndGap(linearElement, hoveredElement, startOrEnd, elementsMap),
92
92
  },
93
93
  });
94
94
  const boundElementsMap = arrayToMap(hoveredElement.boundElements || []);
@@ -109,10 +109,10 @@ const isLinearElementSimpleAndAlreadyBoundOnOppositeEdge = (linearElement, binda
109
109
  export const isLinearElementSimpleAndAlreadyBound = (linearElement, alreadyBoundToId, bindableElement) => {
110
110
  return (alreadyBoundToId === bindableElement.id && linearElement.points.length < 3);
111
111
  };
112
- export const unbindLinearElements = (elements) => {
112
+ export const unbindLinearElements = (elements, elementsMap) => {
113
113
  elements.forEach((element) => {
114
114
  if (isBindingElement(element)) {
115
- bindOrUnbindLinearElement(element, null, null);
115
+ bindOrUnbindLinearElement(element, null, null, elementsMap);
116
116
  }
117
117
  });
118
118
  };
@@ -125,20 +125,20 @@ const unbindLinearElement = (linearElement, startOrEnd) => {
125
125
  mutateElement(linearElement, { [field]: null });
126
126
  return binding.elementId;
127
127
  };
128
- export const getHoveredElementForBinding = (pointerCoords, scene) => {
129
- const hoveredElement = getElementAtPosition(scene.getNonDeletedElements(), (element) => isBindableElement(element, false) &&
130
- bindingBorderTest(element, pointerCoords));
128
+ export const getHoveredElementForBinding = (pointerCoords, elements, elementsMap) => {
129
+ const hoveredElement = getElementAtPosition(elements, (element) => isBindableElement(element, false) &&
130
+ bindingBorderTest(element, pointerCoords, elementsMap));
131
131
  return hoveredElement;
132
132
  };
133
- const calculateFocusAndGap = (linearElement, hoveredElement, startOrEnd) => {
133
+ const calculateFocusAndGap = (linearElement, hoveredElement, startOrEnd, elementsMap) => {
134
134
  const direction = startOrEnd === "start" ? -1 : 1;
135
135
  const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;
136
136
  const adjacentPointIndex = edgePointIndex - direction;
137
- const edgePoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, edgePointIndex);
138
- const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, adjacentPointIndex);
137
+ const edgePoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, edgePointIndex, elementsMap);
138
+ const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, adjacentPointIndex, elementsMap);
139
139
  return {
140
- focus: determineFocusDistance(hoveredElement, adjacentPoint, edgePoint),
141
- gap: Math.max(1, distanceToBindableElement(hoveredElement, edgePoint)),
140
+ focus: determineFocusDistance(hoveredElement, adjacentPoint, edgePoint, elementsMap),
141
+ gap: Math.max(1, distanceToBindableElement(hoveredElement, edgePoint, elementsMap)),
142
142
  };
143
143
  };
144
144
  // Supports translating, rotating and scaling `changedElement` with bound
@@ -146,14 +146,15 @@ const calculateFocusAndGap = (linearElement, hoveredElement, startOrEnd) => {
146
146
  // Because scaling involves moving the focus points as well, it is
147
147
  // done before the `changedElement` is updated, and the `newSize` is passed
148
148
  // in explicitly.
149
- export const updateBoundElements = (changedElement, options) => {
149
+ export const updateBoundElements = (changedElement, elementsMap, options) => {
150
150
  const boundLinearElements = (changedElement.boundElements ?? []).filter((el) => el.type === "arrow");
151
151
  if (boundLinearElements.length === 0) {
152
152
  return;
153
153
  }
154
154
  const { newSize, simultaneouslyUpdated } = options ?? {};
155
155
  const simultaneouslyUpdatedElementIds = getSimultaneouslyUpdatedElementIds(simultaneouslyUpdated);
156
- getNonDeletedElements(Scene.getScene(changedElement), boundLinearElements.map((el) => el.id)).forEach((element) => {
156
+ const scene = Scene.getScene(changedElement);
157
+ getNonDeletedElements(scene, boundLinearElements.map((el) => el.id)).forEach((element) => {
157
158
  if (!isLinearElement(element)) {
158
159
  return;
159
160
  }
@@ -169,11 +170,11 @@ export const updateBoundElements = (changedElement, options) => {
169
170
  mutateElement(element, { startBinding, endBinding });
170
171
  return;
171
172
  }
172
- updateBoundPoint(element, "start", startBinding, changedElement);
173
- updateBoundPoint(element, "end", endBinding, changedElement);
174
- const boundText = getBoundTextElement(element);
173
+ updateBoundPoint(element, "start", startBinding, changedElement, elementsMap);
174
+ updateBoundPoint(element, "end", endBinding, changedElement, elementsMap);
175
+ const boundText = getBoundTextElement(element, scene.getNonDeletedElementsMap());
175
176
  if (boundText) {
176
- handleBindTextResize(element, false);
177
+ handleBindTextResize(element, scene.getNonDeletedElementsMap(), false);
177
178
  }
178
179
  });
179
180
  };
@@ -184,7 +185,7 @@ const doesNeedUpdate = (boundElement, changedElement) => {
184
185
  const getSimultaneouslyUpdatedElementIds = (simultaneouslyUpdated) => {
185
186
  return new Set((simultaneouslyUpdated || []).map((element) => element.id));
186
187
  };
187
- const updateBoundPoint = (linearElement, startOrEnd, binding, changedElement) => {
188
+ const updateBoundPoint = (linearElement, startOrEnd, binding, changedElement, elementsMap) => {
188
189
  if (binding == null ||
189
190
  // We only need to update the other end if this is a 2 point line element
190
191
  (binding.elementId !== changedElement.id && linearElement.points.length > 2)) {
@@ -198,8 +199,8 @@ const updateBoundPoint = (linearElement, startOrEnd, binding, changedElement) =>
198
199
  const direction = startOrEnd === "start" ? -1 : 1;
199
200
  const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;
200
201
  const adjacentPointIndex = edgePointIndex - direction;
201
- const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, adjacentPointIndex);
202
- const focusPointAbsolute = determineFocusPoint(bindingElement, binding.focus, adjacentPoint);
202
+ const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, adjacentPointIndex, elementsMap);
203
+ const focusPointAbsolute = determineFocusPoint(bindingElement, binding.focus, adjacentPoint, elementsMap);
203
204
  let newEdgePoint;
204
205
  // The linear element was not originally pointing inside the bound shape,
205
206
  // we can point directly at the focus point
@@ -207,7 +208,7 @@ const updateBoundPoint = (linearElement, startOrEnd, binding, changedElement) =>
207
208
  newEdgePoint = focusPointAbsolute;
208
209
  }
209
210
  else {
210
- const intersections = intersectElementWithLine(bindingElement, adjacentPoint, focusPointAbsolute, binding.gap);
211
+ const intersections = intersectElementWithLine(bindingElement, adjacentPoint, focusPointAbsolute, binding.gap, elementsMap);
211
212
  if (intersections.length === 0) {
212
213
  // This should never happen, since focusPoint should always be
213
214
  // inside the element, but just in case, bail out
@@ -221,7 +222,7 @@ const updateBoundPoint = (linearElement, startOrEnd, binding, changedElement) =>
221
222
  LinearElementEditor.movePoints(linearElement, [
222
223
  {
223
224
  index: edgePointIndex,
224
- point: LinearElementEditor.pointFromAbsoluteCoords(linearElement, newEdgePoint),
225
+ point: LinearElementEditor.pointFromAbsoluteCoords(linearElement, newEdgePoint, elementsMap),
225
226
  },
226
227
  ], { [startOrEnd === "start" ? "startBinding" : "endBinding"]: binding });
227
228
  };
@@ -236,36 +237,37 @@ const maybeCalculateNewGapWhenScaling = (changedElement, currentBinding, newSize
236
237
  return { elementId, gap: newGap, focus };
237
238
  };
238
239
  // TODO: this is a bottleneck, optimise
239
- export const getEligibleElementsForBinding = (elements) => {
240
- const includedElementIds = new Set(elements.map(({ id }) => id));
241
- return elements.flatMap((element) => isBindingElement(element, false)
242
- ? getElligibleElementsForBindingElement(element).filter((element) => !includedElementIds.has(element.id))
243
- : isBindableElement(element, false)
244
- ? getElligibleElementsForBindableElementAndWhere(element).filter((binding) => !includedElementIds.has(binding[0].id))
240
+ export const getEligibleElementsForBinding = (selectedElements, elements, elementsMap) => {
241
+ const includedElementIds = new Set(selectedElements.map(({ id }) => id));
242
+ return selectedElements.flatMap((selectedElement) => isBindingElement(selectedElement, false)
243
+ ? getElligibleElementsForBindingElement(selectedElement, elements, elementsMap).filter((element) => !includedElementIds.has(element.id))
244
+ : isBindableElement(selectedElement, false)
245
+ ? getElligibleElementsForBindableElementAndWhere(selectedElement, elementsMap).filter((binding) => !includedElementIds.has(binding[0].id))
245
246
  : []);
246
247
  };
247
- const getElligibleElementsForBindingElement = (linearElement) => {
248
+ const getElligibleElementsForBindingElement = (linearElement, elements, elementsMap) => {
248
249
  return [
249
- getElligibleElementForBindingElement(linearElement, "start"),
250
- getElligibleElementForBindingElement(linearElement, "end"),
250
+ getElligibleElementForBindingElement(linearElement, "start", elements, elementsMap),
251
+ getElligibleElementForBindingElement(linearElement, "end", elements, elementsMap),
251
252
  ].filter((element) => element != null);
252
253
  };
253
- const getElligibleElementForBindingElement = (linearElement, startOrEnd) => {
254
- return getHoveredElementForBinding(getLinearElementEdgeCoors(linearElement, startOrEnd), Scene.getScene(linearElement));
254
+ const getElligibleElementForBindingElement = (linearElement, startOrEnd, elements, elementsMap) => {
255
+ return getHoveredElementForBinding(getLinearElementEdgeCoors(linearElement, startOrEnd, elementsMap), elements, elementsMap);
255
256
  };
256
- const getLinearElementEdgeCoors = (linearElement, startOrEnd) => {
257
+ const getLinearElementEdgeCoors = (linearElement, startOrEnd, elementsMap) => {
257
258
  const index = startOrEnd === "start" ? 0 : -1;
258
- return tupleToCoors(LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, index));
259
+ return tupleToCoors(LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, index, elementsMap));
259
260
  };
260
- const getElligibleElementsForBindableElementAndWhere = (bindableElement) => {
261
- return Scene.getScene(bindableElement)
261
+ const getElligibleElementsForBindableElementAndWhere = (bindableElement, elementsMap) => {
262
+ const scene = Scene.getScene(bindableElement);
263
+ return scene
262
264
  .getNonDeletedElements()
263
265
  .map((element) => {
264
266
  if (!isBindingElement(element, false)) {
265
267
  return null;
266
268
  }
267
- const canBindStart = isLinearElementEligibleForNewBindingByBindable(element, "start", bindableElement);
268
- const canBindEnd = isLinearElementEligibleForNewBindingByBindable(element, "end", bindableElement);
269
+ const canBindStart = isLinearElementEligibleForNewBindingByBindable(element, "start", bindableElement, elementsMap);
270
+ const canBindEnd = isLinearElementEligibleForNewBindingByBindable(element, "end", bindableElement, elementsMap);
269
271
  if (!canBindStart && !canBindEnd) {
270
272
  return null;
271
273
  }
@@ -277,11 +279,11 @@ const getElligibleElementsForBindableElementAndWhere = (bindableElement) => {
277
279
  })
278
280
  .filter((maybeElement) => maybeElement != null);
279
281
  };
280
- const isLinearElementEligibleForNewBindingByBindable = (linearElement, startOrEnd, bindableElement) => {
282
+ const isLinearElementEligibleForNewBindingByBindable = (linearElement, startOrEnd, bindableElement, elementsMap) => {
281
283
  const existingBinding = linearElement[startOrEnd === "start" ? "startBinding" : "endBinding"];
282
284
  return (existingBinding == null &&
283
285
  !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(linearElement, bindableElement, startOrEnd) &&
284
- bindingBorderTest(bindableElement, getLinearElementEdgeCoors(linearElement, startOrEnd)));
286
+ bindingBorderTest(bindableElement, getLinearElementEdgeCoors(linearElement, startOrEnd, elementsMap), elementsMap));
285
287
  };
286
288
  // We need to:
287
289
  // 1: Update elements not selected to point to duplicated elements
@@ -1,4 +1,4 @@
1
- import { ExcalidrawElement, ExcalidrawLinearElement, Arrowhead, ExcalidrawFreeDrawElement, NonDeleted } from "./types";
1
+ import { ExcalidrawElement, ExcalidrawLinearElement, Arrowhead, ExcalidrawFreeDrawElement, NonDeleted, ElementsMap } from "./types";
2
2
  import { Drawable, Op } from "roughjs/bin/core";
3
3
  import { AppState, Point } from "../types";
4
4
  export type RectangleBox = {
@@ -25,11 +25,11 @@ export type SceneBounds = readonly [
25
25
  ];
26
26
  export declare class ElementBounds {
27
27
  private static boundsCache;
28
- static getBounds(element: ExcalidrawElement): Bounds;
28
+ static getBounds(element: ExcalidrawElement, elementsMap: ElementsMap): Bounds;
29
29
  private static calculateBounds;
30
30
  }
31
- export declare const getElementAbsoluteCoords: (element: ExcalidrawElement, includeBoundText?: boolean) => [number, number, number, number, number, number];
32
- export declare const getElementLineSegments: (element: ExcalidrawElement) => [Point, Point][];
31
+ export declare const getElementAbsoluteCoords: (element: ExcalidrawElement, elementsMap: ElementsMap, includeBoundText?: boolean) => [number, number, number, number, number, number];
32
+ export declare const getElementLineSegments: (element: ExcalidrawElement, elementsMap: ElementsMap) => [Point, Point][];
33
33
  /**
34
34
  * Scene -> Scene coords, but in x1,x2,y1,y2 format.
35
35
  *
@@ -46,7 +46,7 @@ export declare const getArrowheadSize: (arrowhead: Arrowhead) => number;
46
46
  /** @returns number in degrees */
47
47
  export declare const getArrowheadAngle: (arrowhead: Arrowhead) => number;
48
48
  export declare const getArrowheadPoints: (element: ExcalidrawLinearElement, shape: Drawable[], position: "start" | "end", arrowhead: Arrowhead) => number[] | null;
49
- export declare const getElementBounds: (element: ExcalidrawElement) => Bounds;
49
+ export declare const getElementBounds: (element: ExcalidrawElement, elementsMap: ElementsMap) => Bounds;
50
50
  export declare const getCommonBounds: (elements: readonly ExcalidrawElement[]) => Bounds;
51
51
  export declare const getDraggedElementsBounds: (elements: ExcalidrawElement[], dragOffset: {
52
52
  x: number;
@@ -6,10 +6,10 @@ import { rescalePoints } from "../points";
6
6
  import { getBoundTextElement, getContainerElement } from "./textElement";
7
7
  import { LinearElementEditor } from "./linearElementEditor";
8
8
  import { ShapeCache } from "../scene/ShapeCache";
9
- import Scene from "../scene/Scene";
9
+ import { arrayToMap } from "../utils";
10
10
  export class ElementBounds {
11
11
  static boundsCache = new WeakMap();
12
- static getBounds(element) {
12
+ static getBounds(element, elementsMap) {
13
13
  const cachedBounds = ElementBounds.boundsCache.get(element);
14
14
  if (cachedBounds?.version &&
15
15
  cachedBounds.version === element.version &&
@@ -18,22 +18,16 @@ export class ElementBounds {
18
18
  !isBoundToContainer(element)) {
19
19
  return cachedBounds.bounds;
20
20
  }
21
- const bounds = ElementBounds.calculateBounds(element);
22
- // hack to ensure that downstream checks could retrieve element Scene
23
- // so as to have correctly calculated bounds
24
- // FIXME remove when we get rid of all the id:Scene / element:Scene mapping
25
- const shouldCache = Scene.getScene(element);
26
- if (shouldCache) {
27
- ElementBounds.boundsCache.set(element, {
28
- version: element.version,
29
- bounds,
30
- });
31
- }
21
+ const bounds = ElementBounds.calculateBounds(element, elementsMap);
22
+ ElementBounds.boundsCache.set(element, {
23
+ version: element.version,
24
+ bounds,
25
+ });
32
26
  return bounds;
33
27
  }
34
- static calculateBounds(element) {
28
+ static calculateBounds(element, elementsMap) {
35
29
  let bounds;
36
- const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);
30
+ const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element, elementsMap);
37
31
  if (isFreeDrawElement(element)) {
38
32
  const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => rotate(x, y, cx - element.x, cy - element.y, element.angle)));
39
33
  return [
@@ -44,7 +38,7 @@ export class ElementBounds {
44
38
  ];
45
39
  }
46
40
  else if (isLinearElement(element)) {
47
- bounds = getLinearElementRotatedBounds(element, cx, cy);
41
+ bounds = getLinearElementRotatedBounds(element, cx, cy, elementsMap);
48
42
  }
49
43
  else if (element.type === "diamond") {
50
44
  const [x11, y11] = rotate(cx, y1, cx, cy, element.angle);
@@ -84,17 +78,19 @@ export class ElementBounds {
84
78
  //
85
79
  // If the element is created from right to left, the width is going to be negative
86
80
  // This set of functions retrieves the absolute position of the 4 points.
87
- export const getElementAbsoluteCoords = (element, includeBoundText = false) => {
81
+ export const getElementAbsoluteCoords = (element, elementsMap, includeBoundText = false) => {
88
82
  if (isFreeDrawElement(element)) {
89
83
  return getFreeDrawElementAbsoluteCoords(element);
90
84
  }
91
85
  else if (isLinearElement(element)) {
92
- return LinearElementEditor.getElementAbsoluteCoords(element, includeBoundText);
86
+ return LinearElementEditor.getElementAbsoluteCoords(element, elementsMap, includeBoundText);
93
87
  }
94
88
  else if (isTextElement(element)) {
95
- const container = getContainerElement(element);
89
+ const container = elementsMap
90
+ ? getContainerElement(element, elementsMap)
91
+ : null;
96
92
  if (isArrowElement(container)) {
97
- const coords = LinearElementEditor.getBoundTextElementPosition(container, element);
93
+ const coords = LinearElementEditor.getBoundTextElementPosition(container, element, elementsMap);
98
94
  return [
99
95
  coords.x,
100
96
  coords.y,
@@ -119,8 +115,8 @@ export const getElementAbsoluteCoords = (element, includeBoundText = false) => {
119
115
  * that can be used for visual collision detection (useful for frames)
120
116
  * as opposed to bounding box collision detection
121
117
  */
122
- export const getElementLineSegments = (element) => {
123
- const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);
118
+ export const getElementLineSegments = (element, elementsMap) => {
119
+ const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element, elementsMap);
124
120
  const center = [cx, cy];
125
121
  if (isLinearElement(element) || isFreeDrawElement(element)) {
126
122
  const segments = [];
@@ -459,14 +455,14 @@ const generateLinearElementShape = (element) => {
459
455
  })();
460
456
  return generator[method](element.points, options);
461
457
  };
462
- const getLinearElementRotatedBounds = (element, cx, cy) => {
458
+ const getLinearElementRotatedBounds = (element, cx, cy, elementsMap) => {
459
+ const boundTextElement = getBoundTextElement(element, elementsMap);
463
460
  if (element.points.length < 2) {
464
461
  const [pointX, pointY] = element.points[0];
465
462
  const [x, y] = rotate(element.x + pointX, element.y + pointY, cx, cy, element.angle);
466
463
  let coords = [x, y, x, y];
467
- const boundTextElement = getBoundTextElement(element);
468
464
  if (boundTextElement) {
469
- const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(element, [x, y, x, y], boundTextElement);
465
+ const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(element, elementsMap, [x, y, x, y], boundTextElement);
470
466
  coords = [
471
467
  coordsWithBoundText[0],
472
468
  coordsWithBoundText[1],
@@ -483,9 +479,8 @@ const getLinearElementRotatedBounds = (element, cx, cy) => {
483
479
  const transformXY = (x, y) => rotate(element.x + x, element.y + y, cx, cy, element.angle);
484
480
  const res = getMinMaxXYFromCurvePathOps(ops, transformXY);
485
481
  let coords = [res[0], res[1], res[2], res[3]];
486
- const boundTextElement = getBoundTextElement(element);
487
482
  if (boundTextElement) {
488
- const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(element, coords, boundTextElement);
483
+ const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(element, elementsMap, coords, boundTextElement);
489
484
  coords = [
490
485
  coordsWithBoundText[0],
491
486
  coordsWithBoundText[1],
@@ -495,8 +490,8 @@ const getLinearElementRotatedBounds = (element, cx, cy) => {
495
490
  }
496
491
  return coords;
497
492
  };
498
- export const getElementBounds = (element) => {
499
- return ElementBounds.getBounds(element);
493
+ export const getElementBounds = (element, elementsMap) => {
494
+ return ElementBounds.getBounds(element, elementsMap);
500
495
  };
501
496
  export const getCommonBounds = (elements) => {
502
497
  if (!elements.length) {
@@ -506,8 +501,9 @@ export const getCommonBounds = (elements) => {
506
501
  let maxX = -Infinity;
507
502
  let minY = Infinity;
508
503
  let maxY = -Infinity;
504
+ const elementsMap = arrayToMap(elements);
509
505
  elements.forEach((element) => {
510
- const [x1, y1, x2, y2] = getElementBounds(element);
506
+ const [x1, y1, x2, y2] = getElementBounds(element, elementsMap);
511
507
  minX = Math.min(minX, x1);
512
508
  minY = Math.min(minY, y1);
513
509
  maxX = Math.max(maxX, x2);
@@ -577,15 +573,16 @@ export const getClosestElementBounds = (elements, from) => {
577
573
  }
578
574
  let minDistance = Infinity;
579
575
  let closestElement = elements[0];
576
+ const elementsMap = arrayToMap(elements);
580
577
  elements.forEach((element) => {
581
- const [x1, y1, x2, y2] = getElementBounds(element);
578
+ const [x1, y1, x2, y2] = getElementBounds(element, elementsMap);
582
579
  const distance = distance2d((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);
583
580
  if (distance < minDistance) {
584
581
  minDistance = distance;
585
582
  closestElement = element;
586
583
  }
587
584
  });
588
- return getElementBounds(closestElement);
585
+ return getElementBounds(closestElement, elementsMap);
589
586
  };
590
587
  export const getCommonBoundingBox = (elements) => {
591
588
  const [minX, minY, maxX, maxY] = getCommonBounds(elements);
@@ -1,21 +1,21 @@
1
1
  import * as GA from "../ga";
2
- import { NonDeletedExcalidrawElement, ExcalidrawBindableElement, ExcalidrawElement, ExcalidrawRectangleElement, ExcalidrawDiamondElement, ExcalidrawTextElement, ExcalidrawEllipseElement, NonDeleted, ExcalidrawImageElement, ExcalidrawFrameLikeElement, ExcalidrawIframeLikeElement } from "./types";
2
+ import { NonDeletedExcalidrawElement, ExcalidrawBindableElement, ExcalidrawElement, ExcalidrawRectangleElement, ExcalidrawDiamondElement, ExcalidrawTextElement, ExcalidrawEllipseElement, NonDeleted, ExcalidrawImageElement, ExcalidrawFrameLikeElement, ExcalidrawIframeLikeElement, ElementsMap } from "./types";
3
3
  import { FrameNameBoundsCache, Point } from "../types";
4
4
  import { AppState } from "../types";
5
- export declare const hitTest: (element: NonDeletedExcalidrawElement, appState: AppState, frameNameBoundsCache: FrameNameBoundsCache, x: number, y: number) => boolean;
6
- export declare const isHittingElementBoundingBoxWithoutHittingElement: (element: NonDeletedExcalidrawElement, appState: AppState, frameNameBoundsCache: FrameNameBoundsCache, x: number, y: number) => boolean;
7
- export declare const isHittingElementNotConsideringBoundingBox: (element: NonDeletedExcalidrawElement, appState: AppState, frameNameBoundsCache: FrameNameBoundsCache | null, point: readonly [number, number]) => boolean;
8
- export declare const isPointHittingElementBoundingBox: (element: NonDeleted<ExcalidrawElement>, [x, y]: readonly [number, number], threshold: number, frameNameBoundsCache: FrameNameBoundsCache | null) => boolean;
5
+ export declare const hitTest: (element: NonDeletedExcalidrawElement, appState: AppState, frameNameBoundsCache: FrameNameBoundsCache, x: number, y: number, elementsMap: ElementsMap) => boolean;
6
+ export declare const isHittingElementBoundingBoxWithoutHittingElement: (element: NonDeletedExcalidrawElement, appState: AppState, frameNameBoundsCache: FrameNameBoundsCache, x: number, y: number, elementsMap: ElementsMap) => boolean;
7
+ export declare const isHittingElementNotConsideringBoundingBox: (element: NonDeletedExcalidrawElement, appState: AppState, frameNameBoundsCache: FrameNameBoundsCache | null, point: readonly [number, number], elementsMap: ElementsMap) => boolean;
8
+ export declare const isPointHittingElementBoundingBox: (element: NonDeleted<ExcalidrawElement>, elementsMap: ElementsMap, [x, y]: readonly [number, number], threshold: number, frameNameBoundsCache: FrameNameBoundsCache | null) => boolean;
9
9
  export declare const bindingBorderTest: (element: NonDeleted<ExcalidrawBindableElement>, { x, y }: {
10
10
  x: number;
11
11
  y: number;
12
- }) => boolean;
12
+ }, elementsMap: ElementsMap) => boolean;
13
13
  export declare const maxBindingGap: (element: ExcalidrawElement, elementWidth: number, elementHeight: number) => number;
14
- export declare const distanceToBindableElement: (element: ExcalidrawBindableElement, point: readonly [number, number]) => number;
15
- export declare const pointInAbsoluteCoords: (element: ExcalidrawElement, point: readonly [number, number]) => readonly [number, number];
16
- export declare const determineFocusDistance: (element: ExcalidrawBindableElement, a: readonly [number, number], b: readonly [number, number]) => number;
17
- export declare const determineFocusPoint: (element: ExcalidrawBindableElement, focus: number, adjecentPoint: readonly [number, number]) => readonly [number, number];
18
- export declare const intersectElementWithLine: (element: ExcalidrawBindableElement, a: readonly [number, number], b: readonly [number, number], gap?: number) => Point[];
14
+ export declare const distanceToBindableElement: (element: ExcalidrawBindableElement, point: readonly [number, number], elementsMap: ElementsMap) => number;
15
+ export declare const pointInAbsoluteCoords: (element: ExcalidrawElement, elementsMap: ElementsMap, point: readonly [number, number]) => readonly [number, number];
16
+ export declare const determineFocusDistance: (element: ExcalidrawBindableElement, a: readonly [number, number], b: readonly [number, number], elementsMap: ElementsMap) => number;
17
+ export declare const determineFocusPoint: (element: ExcalidrawBindableElement, focus: number, adjecentPoint: readonly [number, number], elementsMap: ElementsMap) => readonly [number, number];
18
+ export declare const intersectElementWithLine: (element: ExcalidrawBindableElement, a: readonly [number, number], b: readonly [number, number], gap: number | undefined, elementsMap: ElementsMap) => Point[];
19
19
  export declare const getCircleIntersections: (center: readonly [number, number, number, number, number, number, number, number], radius: number, line: readonly [number, number, number, number, number, number, number, number]) => GA.Point[];
20
20
  export declare const findFocusPointForEllipse: (ellipse: ExcalidrawEllipseElement, relativeDistance: number, point: readonly [number, number, number, number, number, number, number, number]) => readonly [number, number, number, number, number, number, number, number];
21
21
  export declare const findFocusPointForRectangulars: (element: ExcalidrawRectangleElement | ExcalidrawImageElement | ExcalidrawDiamondElement | ExcalidrawTextElement | ExcalidrawIframeLikeElement | ExcalidrawFrameLikeElement, relativeDistance: number, point: readonly [number, number, number, number, number, number, number, number]) => readonly [number, number, number, number, number, number, number, number];