@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
@@ -19,7 +19,7 @@ export declare const actionFinalize: {
19
19
  errorMessage: import("react").ReactNode;
20
20
  activeEmbeddable: {
21
21
  element: import("../element/types").NonDeletedExcalidrawElement;
22
- state: "active" | "hover";
22
+ state: "hover" | "active";
23
23
  } | null;
24
24
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
25
25
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -65,7 +65,7 @@ export declare const actionFinalize: {
65
65
  scrollX: number;
66
66
  scrollY: number;
67
67
  scrolledOutside: boolean;
68
- name: string;
68
+ name: string | null;
69
69
  isResizing: boolean;
70
70
  isRotating: boolean;
71
71
  zoom: Readonly<{
@@ -85,7 +85,7 @@ export declare const actionFinalize: {
85
85
  tab: "text-to-diagram" | "diagram-to-code";
86
86
  } | {
87
87
  name: "ttd";
88
- tab: "mermaid" | "text-to-diagram";
88
+ tab: "text-to-diagram" | "mermaid";
89
89
  } | null;
90
90
  defaultSidebarDockedPreference: boolean;
91
91
  lastPointerDownWith: import("../element/types").PointerType;
@@ -142,7 +142,7 @@ export declare const actionFinalize: {
142
142
  data: import("../charts").Spreadsheet;
143
143
  };
144
144
  pendingImageElementId: string | null;
145
- showHyperlinkPopup: false | "editor" | "info";
145
+ showHyperlinkPopup: false | "info" | "editor";
146
146
  selectedLinearElement: LinearElementEditor | null;
147
147
  snapLines: readonly import("../snapping").SnapLine[];
148
148
  originSnapOffset: {
@@ -217,7 +217,7 @@ export declare const actionFinalize: {
217
217
  scrollX: number;
218
218
  scrollY: number;
219
219
  scrolledOutside: boolean;
220
- name: string;
220
+ name: string | null;
221
221
  isResizing: boolean;
222
222
  isRotating: boolean;
223
223
  zoom: Readonly<{
@@ -237,7 +237,7 @@ export declare const actionFinalize: {
237
237
  tab: "text-to-diagram" | "diagram-to-code";
238
238
  } | {
239
239
  name: "ttd";
240
- tab: "mermaid" | "text-to-diagram";
240
+ tab: "text-to-diagram" | "mermaid";
241
241
  } | null;
242
242
  defaultSidebarDockedPreference: boolean;
243
243
  lastPointerDownWith: import("../element/types").PointerType;
@@ -290,7 +290,7 @@ export declare const actionFinalize: {
290
290
  shown: true;
291
291
  data: import("../charts").Spreadsheet;
292
292
  };
293
- showHyperlinkPopup: false | "editor" | "info";
293
+ showHyperlinkPopup: false | "info" | "editor";
294
294
  snapLines: readonly import("../snapping").SnapLine[];
295
295
  originSnapOffset: {
296
296
  x: number;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { KEYS } from "../keys";
3
3
  import { isInvisiblySmallElement } from "../element";
4
- import { updateActiveTool } from "../utils";
4
+ import { arrayToMap, updateActiveTool } from "../utils";
5
5
  import { ToolButton } from "../components/ToolButton";
6
6
  import { done } from "../components/icons";
7
7
  import { t } from "../i18n";
@@ -17,12 +17,13 @@ export const actionFinalize = register({
17
17
  name: "finalize",
18
18
  trackEvent: false,
19
19
  perform: (elements, appState, _, { interactiveCanvas, focusContainer, scene }) => {
20
+ const elementsMap = scene.getNonDeletedElementsMap();
20
21
  if (appState.editingLinearElement) {
21
22
  const { elementId, startBindingElement, endBindingElement } = appState.editingLinearElement;
22
- const element = LinearElementEditor.getElement(elementId);
23
+ const element = LinearElementEditor.getElement(elementId, elementsMap);
23
24
  if (element) {
24
25
  if (isBindingElement(element)) {
25
- bindOrUnbindLinearElement(element, startBindingElement, endBindingElement);
26
+ bindOrUnbindLinearElement(element, startBindingElement, endBindingElement, elementsMap);
26
27
  }
27
28
  return {
28
29
  elements: element.points.length < 2 || isInvisiblySmallElement(element)
@@ -85,8 +86,8 @@ export const actionFinalize = register({
85
86
  if (isBindingElement(multiPointElement) &&
86
87
  !isLoop &&
87
88
  multiPointElement.points.length > 1) {
88
- const [x, y] = LinearElementEditor.getPointAtIndexGlobalCoordinates(multiPointElement, -1);
89
- maybeBindLinearElement(multiPointElement, appState, Scene.getScene(multiPointElement), { x, y });
89
+ const [x, y] = LinearElementEditor.getPointAtIndexGlobalCoordinates(multiPointElement, -1, arrayToMap(elements));
90
+ maybeBindLinearElement(multiPointElement, appState, Scene.getScene(multiPointElement), { x, y }, elementsMap);
90
91
  }
91
92
  }
92
93
  if ((!appState.activeTool.locked &&
@@ -134,7 +135,7 @@ export const actionFinalize = register({
134
135
  : appState.selectedElementIds,
135
136
  // To select the linear element when user has finished mutipoint editing
136
137
  selectedLinearElement: multiPointElement && isLinearElement(multiPointElement)
137
- ? new LinearElementEditor(multiPointElement, scene)
138
+ ? new LinearElementEditor(multiPointElement)
138
139
  : appState.selectedLinearElement,
139
140
  pendingImageElementId: null,
140
141
  },
@@ -7,7 +7,7 @@ export declare const actionFlipHorizontal: {
7
7
  category: "element";
8
8
  };
9
9
  perform: (elements: readonly ExcalidrawElement[], appState: Readonly<AppState>, _: any, app: import("../types").AppClassProperties) => {
10
- elements: import("../scene/Scene").ExcalidrawElementsIncludingDeleted;
10
+ elements: ExcalidrawElement[];
11
11
  appState: Readonly<AppState>;
12
12
  commitToHistory: true;
13
13
  };
@@ -22,7 +22,7 @@ export declare const actionFlipVertical: {
22
22
  category: "element";
23
23
  };
24
24
  perform: (elements: readonly ExcalidrawElement[], appState: Readonly<AppState>, _: any, app: import("../types").AppClassProperties) => {
25
- elements: import("../scene/Scene").ExcalidrawElementsIncludingDeleted;
25
+ elements: ExcalidrawElement[];
26
26
  appState: Readonly<AppState>;
27
27
  commitToHistory: true;
28
28
  };
@@ -12,7 +12,7 @@ export const actionFlipHorizontal = register({
12
12
  trackEvent: { category: "element" },
13
13
  perform: (elements, appState, _, app) => {
14
14
  return {
15
- elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, appState, "horizontal"), appState, app),
15
+ elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, app.scene.getNonDeletedElementsMap(), appState, "horizontal"), appState, app),
16
16
  appState,
17
17
  commitToHistory: true,
18
18
  };
@@ -25,7 +25,7 @@ export const actionFlipVertical = register({
25
25
  trackEvent: { category: "element" },
26
26
  perform: (elements, appState, _, app) => {
27
27
  return {
28
- elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, appState, "vertical"), appState, app),
28
+ elements: updateFrameMembershipOfSelectedElements(flipSelectedElements(elements, app.scene.getNonDeletedElementsMap(), appState, "vertical"), appState, app),
29
29
  appState,
30
30
  commitToHistory: true,
31
31
  };
@@ -33,20 +33,20 @@ export const actionFlipVertical = register({
33
33
  keyTest: (event) => event.shiftKey && event.code === CODES.V && !event[KEYS.CTRL_OR_CMD],
34
34
  contextItemLabel: "labels.flipVertical",
35
35
  });
36
- const flipSelectedElements = (elements, appState, flipDirection) => {
36
+ const flipSelectedElements = (elements, elementsMap, appState, flipDirection) => {
37
37
  const selectedElements = getSelectedElements(getNonDeletedElements(elements), appState, {
38
38
  includeBoundTextElement: true,
39
39
  includeElementsInFrames: true,
40
40
  });
41
- const updatedElements = flipElements(selectedElements, appState, flipDirection);
41
+ const updatedElements = flipElements(selectedElements, elements, elementsMap, appState, flipDirection);
42
42
  const updatedElementsMap = arrayToMap(updatedElements);
43
43
  return elements.map((element) => updatedElementsMap.get(element.id) || element);
44
44
  };
45
- const flipElements = (elements, appState, flipDirection) => {
46
- const { minX, minY, maxX, maxY } = getCommonBoundingBox(elements);
47
- resizeMultipleElements({ originalElements: arrayToMap(elements) }, elements, "nw", true, flipDirection === "horizontal" ? maxX : minX, flipDirection === "horizontal" ? minY : maxY);
48
- (isBindingEnabled(appState)
49
- ? bindOrUnbindSelectedElements
50
- : unbindLinearElements)(elements);
51
- return elements;
45
+ const flipElements = (selectedElements, elements, elementsMap, appState, flipDirection) => {
46
+ const { minX, minY, maxX, maxY } = getCommonBoundingBox(selectedElements);
47
+ resizeMultipleElements(elementsMap, selectedElements, elementsMap, "nw", true, flipDirection === "horizontal" ? maxX : minX, flipDirection === "horizontal" ? minY : maxY);
48
+ isBindingEnabled(appState)
49
+ ? bindOrUnbindSelectedElements(selectedElements, elements, elementsMap)
50
+ : unbindLinearElements(selectedElements, elementsMap);
51
+ return selectedElements;
52
52
  };
@@ -22,7 +22,7 @@ export declare const actionRemoveAllElementsFromFrame: {
22
22
  category: "history";
23
23
  };
24
24
  perform: (elements: readonly ExcalidrawElement[], appState: Readonly<AppState>, _: any, app: AppClassProperties) => {
25
- elements: ExcalidrawElement[];
25
+ elements: readonly ExcalidrawElement[];
26
26
  appState: {
27
27
  selectedElementIds: {
28
28
  [x: string]: true;
@@ -37,7 +37,7 @@ export declare const actionRemoveAllElementsFromFrame: {
37
37
  errorMessage: import("react").ReactNode;
38
38
  activeEmbeddable: {
39
39
  element: import("../element/types").NonDeletedExcalidrawElement;
40
- state: "active" | "hover";
40
+ state: "hover" | "active";
41
41
  } | null;
42
42
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
43
43
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -85,7 +85,7 @@ export declare const actionRemoveAllElementsFromFrame: {
85
85
  scrollY: number;
86
86
  cursorButton: "up" | "down";
87
87
  scrolledOutside: boolean;
88
- name: string;
88
+ name: string | null;
89
89
  isResizing: boolean;
90
90
  isRotating: boolean;
91
91
  zoom: Readonly<{
@@ -105,7 +105,7 @@ export declare const actionRemoveAllElementsFromFrame: {
105
105
  tab: "text-to-diagram" | "diagram-to-code";
106
106
  } | {
107
107
  name: "ttd";
108
- tab: "mermaid" | "text-to-diagram";
108
+ tab: "text-to-diagram" | "mermaid";
109
109
  } | null;
110
110
  defaultSidebarDockedPreference: boolean;
111
111
  lastPointerDownWith: import("../element/types").PointerType;
@@ -159,7 +159,7 @@ export declare const actionRemoveAllElementsFromFrame: {
159
159
  data: import("../charts").Spreadsheet;
160
160
  };
161
161
  pendingImageElementId: string | null;
162
- showHyperlinkPopup: false | "editor" | "info";
162
+ showHyperlinkPopup: false | "info" | "editor";
163
163
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
164
164
  snapLines: readonly import("../snapping").SnapLine[];
165
165
  originSnapOffset: {
@@ -206,7 +206,7 @@ export declare const actionupdateFrameRendering: {
206
206
  errorMessage: import("react").ReactNode;
207
207
  activeEmbeddable: {
208
208
  element: import("../element/types").NonDeletedExcalidrawElement;
209
- state: "active" | "hover";
209
+ state: "hover" | "active";
210
210
  } | null;
211
211
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
212
212
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -248,7 +248,7 @@ export declare const actionupdateFrameRendering: {
248
248
  scrollY: number;
249
249
  cursorButton: "up" | "down";
250
250
  scrolledOutside: boolean;
251
- name: string;
251
+ name: string | null;
252
252
  isResizing: boolean;
253
253
  isRotating: boolean;
254
254
  zoom: Readonly<{
@@ -268,7 +268,7 @@ export declare const actionupdateFrameRendering: {
268
268
  tab: "text-to-diagram" | "diagram-to-code";
269
269
  } | {
270
270
  name: "ttd";
271
- tab: "mermaid" | "text-to-diagram";
271
+ tab: "text-to-diagram" | "mermaid";
272
272
  } | null;
273
273
  defaultSidebarDockedPreference: boolean;
274
274
  lastPointerDownWith: import("../element/types").PointerType;
@@ -325,7 +325,7 @@ export declare const actionupdateFrameRendering: {
325
325
  data: import("../charts").Spreadsheet;
326
326
  };
327
327
  pendingImageElementId: string | null;
328
- showHyperlinkPopup: false | "editor" | "info";
328
+ showHyperlinkPopup: false | "info" | "editor";
329
329
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
330
330
  snapLines: readonly import("../snapping").SnapLine[];
331
331
  originSnapOffset: {
@@ -365,7 +365,7 @@ export declare const actionSetFrameAsActiveTool: {
365
365
  errorMessage: import("react").ReactNode;
366
366
  activeEmbeddable: {
367
367
  element: import("../element/types").NonDeletedExcalidrawElement;
368
- state: "active" | "hover";
368
+ state: "hover" | "active";
369
369
  } | null;
370
370
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
371
371
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -409,7 +409,7 @@ export declare const actionSetFrameAsActiveTool: {
409
409
  scrollY: number;
410
410
  cursorButton: "up" | "down";
411
411
  scrolledOutside: boolean;
412
- name: string;
412
+ name: string | null;
413
413
  isResizing: boolean;
414
414
  isRotating: boolean;
415
415
  zoom: Readonly<{
@@ -429,7 +429,7 @@ export declare const actionSetFrameAsActiveTool: {
429
429
  tab: "text-to-diagram" | "diagram-to-code";
430
430
  } | {
431
431
  name: "ttd";
432
- tab: "mermaid" | "text-to-diagram";
432
+ tab: "text-to-diagram" | "mermaid";
433
433
  } | null;
434
434
  defaultSidebarDockedPreference: boolean;
435
435
  lastPointerDownWith: import("../element/types").PointerType;
@@ -486,7 +486,7 @@ export declare const actionSetFrameAsActiveTool: {
486
486
  data: import("../charts").Spreadsheet;
487
487
  };
488
488
  pendingImageElementId: string | null;
489
- showHyperlinkPopup: false | "editor" | "info";
489
+ showHyperlinkPopup: false | "info" | "editor";
490
490
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
491
491
  snapLines: readonly import("../snapping").SnapLine[];
492
492
  originSnapOffset: {
@@ -45,7 +45,7 @@ export const actionRemoveAllElementsFromFrame = register({
45
45
  const selectedElement = app.scene.getSelectedElements(appState).at(0) || null;
46
46
  if (isFrameLikeElement(selectedElement)) {
47
47
  return {
48
- elements: removeAllElementsFromFrame(elements, selectedElement, appState),
48
+ elements: removeAllElementsFromFrame(elements, selectedElement),
49
49
  appState: {
50
50
  ...appState,
51
51
  selectedElementIds: {
@@ -29,7 +29,7 @@ export declare const actionGroup: {
29
29
  errorMessage: import("react").ReactNode;
30
30
  activeEmbeddable: {
31
31
  element: import("../element/types").NonDeletedExcalidrawElement;
32
- state: "active" | "hover";
32
+ state: "hover" | "active";
33
33
  } | null;
34
34
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
35
35
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -77,7 +77,7 @@ export declare const actionGroup: {
77
77
  scrollY: number;
78
78
  cursorButton: "up" | "down";
79
79
  scrolledOutside: boolean;
80
- name: string;
80
+ name: string | null;
81
81
  isResizing: boolean;
82
82
  isRotating: boolean;
83
83
  zoom: Readonly<{
@@ -97,7 +97,7 @@ export declare const actionGroup: {
97
97
  tab: "text-to-diagram" | "diagram-to-code";
98
98
  } | {
99
99
  name: "ttd";
100
- tab: "mermaid" | "text-to-diagram";
100
+ tab: "text-to-diagram" | "mermaid";
101
101
  } | null;
102
102
  defaultSidebarDockedPreference: boolean;
103
103
  lastPointerDownWith: import("../element/types").PointerType;
@@ -147,7 +147,7 @@ export declare const actionGroup: {
147
147
  data: import("../charts").Spreadsheet;
148
148
  };
149
149
  pendingImageElementId: string | null;
150
- showHyperlinkPopup: false | "editor" | "info";
150
+ showHyperlinkPopup: false | "info" | "editor";
151
151
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
152
152
  snapLines: readonly import("../snapping").SnapLine[];
153
153
  originSnapOffset: {
@@ -196,7 +196,7 @@ export declare const actionUngroup: {
196
196
  errorMessage: import("react").ReactNode;
197
197
  activeEmbeddable: {
198
198
  element: import("../element/types").NonDeletedExcalidrawElement;
199
- state: "active" | "hover";
199
+ state: "hover" | "active";
200
200
  } | null;
201
201
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
202
202
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -244,7 +244,7 @@ export declare const actionUngroup: {
244
244
  scrollY: number;
245
245
  cursorButton: "up" | "down";
246
246
  scrolledOutside: boolean;
247
- name: string;
247
+ name: string | null;
248
248
  isResizing: boolean;
249
249
  isRotating: boolean;
250
250
  zoom: Readonly<{
@@ -264,7 +264,7 @@ export declare const actionUngroup: {
264
264
  tab: "text-to-diagram" | "diagram-to-code";
265
265
  } | {
266
266
  name: "ttd";
267
- tab: "mermaid" | "text-to-diagram";
267
+ tab: "text-to-diagram" | "mermaid";
268
268
  } | null;
269
269
  defaultSidebarDockedPreference: boolean;
270
270
  lastPointerDownWith: import("../element/types").PointerType;
@@ -314,7 +314,7 @@ export declare const actionUngroup: {
314
314
  data: import("../charts").Spreadsheet;
315
315
  };
316
316
  pendingImageElementId: string | null;
317
- showHyperlinkPopup: false | "editor" | "info";
317
+ showHyperlinkPopup: false | "info" | "editor";
318
318
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
319
319
  snapLines: readonly import("../snapping").SnapLine[];
320
320
  originSnapOffset: {
@@ -66,7 +66,7 @@ export const actionGroup = register({
66
66
  if (groupingElementsFromDifferentFrames) {
67
67
  const frameElementsMap = groupByFrameLikes(selectedElements);
68
68
  frameElementsMap.forEach((elementsInFrame, frameId) => {
69
- nextElements = removeElementsFromFrame(nextElements, elementsInFrame, appState);
69
+ removeElementsFromFrame(elementsInFrame, app.scene.getNonDeletedElementsMap());
70
70
  });
71
71
  }
72
72
  const newGroupId = randomId();
@@ -112,6 +112,7 @@ export const actionUngroup = register({
112
112
  trackEvent: { category: "element" },
113
113
  perform: (elements, appState, _, app) => {
114
114
  const groupIds = getSelectedGroupIds(appState);
115
+ const elementsMap = arrayToMap(elements);
115
116
  if (groupIds.length === 0) {
116
117
  return { appState, elements, commitToHistory: false };
117
118
  }
@@ -137,7 +138,7 @@ export const actionUngroup = register({
137
138
  const targetFrames = getFrameLikeElements(elements).filter((frame) => selectedElementFrameIds.has(frame.id));
138
139
  targetFrames.forEach((frame) => {
139
140
  if (frame) {
140
- nextElements = replaceAllElementsInFrame(nextElements, getElementsInResizingFrame(nextElements, frame, appState), frame, appState);
141
+ nextElements = replaceAllElementsInFrame(nextElements, getElementsInResizingFrame(nextElements, frame, appState, elementsMap), frame, app);
141
142
  }
142
143
  });
143
144
  // remove binded text elements from selection
@@ -20,7 +20,7 @@ export declare const actionToggleLinearEditor: {
20
20
  errorMessage: import("react").ReactNode;
21
21
  activeEmbeddable: {
22
22
  element: import("../element/types").NonDeletedExcalidrawElement;
23
- state: "active" | "hover";
23
+ state: "hover" | "active";
24
24
  } | null;
25
25
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
26
26
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -67,7 +67,7 @@ export declare const actionToggleLinearEditor: {
67
67
  scrollY: number;
68
68
  cursorButton: "up" | "down";
69
69
  scrolledOutside: boolean;
70
- name: string;
70
+ name: string | null;
71
71
  isResizing: boolean;
72
72
  isRotating: boolean;
73
73
  zoom: Readonly<{
@@ -87,7 +87,7 @@ export declare const actionToggleLinearEditor: {
87
87
  tab: "text-to-diagram" | "diagram-to-code";
88
88
  } | {
89
89
  name: "ttd";
90
- tab: "mermaid" | "text-to-diagram";
90
+ tab: "text-to-diagram" | "mermaid";
91
91
  } | null;
92
92
  defaultSidebarDockedPreference: boolean;
93
93
  lastPointerDownWith: import("../element/types").PointerType;
@@ -144,7 +144,7 @@ export declare const actionToggleLinearEditor: {
144
144
  data: import("../charts").Spreadsheet;
145
145
  };
146
146
  pendingImageElementId: string | null;
147
- showHyperlinkPopup: false | "editor" | "info";
147
+ showHyperlinkPopup: false | "info" | "editor";
148
148
  selectedLinearElement: LinearElementEditor | null;
149
149
  snapLines: readonly import("../snapping").SnapLine[];
150
150
  originSnapOffset: {
@@ -20,7 +20,7 @@ export const actionToggleLinearEditor = register({
20
20
  })[0];
21
21
  const editingLinearElement = appState.editingLinearElement?.elementId === selectedElement.id
22
22
  ? null
23
- : new LinearElementEditor(selectedElement, app.scene);
23
+ : new LinearElementEditor(selectedElement);
24
24
  return {
25
25
  appState: {
26
26
  ...appState,
@@ -1,23 +1,8 @@
1
1
  /// <reference types="react" />
2
- import { AppState, ExcalidrawProps, UIAppState } from "../types";
3
- import { NonDeletedExcalidrawElement } from "./types";
4
- import { Bounds } from "./bounds";
5
- import "./Hyperlink.scss";
6
- export declare const EXTERNAL_LINK_IMG: HTMLImageElement;
7
- export declare const Hyperlink: ({ element, setAppState, onLinkOpen, setToast, }: {
8
- element: NonDeletedExcalidrawElement;
9
- setAppState: React.Component<any, AppState>["setState"];
10
- onLinkOpen: ExcalidrawProps["onLinkOpen"];
11
- setToast: (toast: {
12
- message: string;
13
- closable?: boolean;
14
- duration?: number;
15
- } | null) => void;
16
- }) => JSX.Element | null;
17
2
  export declare const actionLink: {
18
3
  name: "hyperlink";
19
- perform: (elements: readonly import("./types").ExcalidrawElement[], appState: Readonly<AppState>) => false | {
20
- elements: readonly import("./types").ExcalidrawElement[];
4
+ perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>) => false | {
5
+ elements: readonly import("../element/types").ExcalidrawElement[];
21
6
  appState: {
22
7
  showHyperlinkPopup: "editor";
23
8
  openMenu: null;
@@ -30,17 +15,17 @@ export declare const actionLink: {
30
15
  isLoading: boolean;
31
16
  errorMessage: import("react").ReactNode;
32
17
  activeEmbeddable: {
33
- element: NonDeletedExcalidrawElement;
34
- state: "active" | "hover";
18
+ element: import("../element/types").NonDeletedExcalidrawElement;
19
+ state: "hover" | "active";
35
20
  } | null;
36
- draggingElement: NonDeletedExcalidrawElement | null;
37
- resizingElement: NonDeletedExcalidrawElement | null;
38
- multiElement: import("./types").NonDeleted<import("./types").ExcalidrawLinearElement> | null;
39
- selectionElement: NonDeletedExcalidrawElement | null;
21
+ draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
22
+ resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
23
+ multiElement: import("../element/types").NonDeleted<import("../element/types").ExcalidrawLinearElement> | null;
24
+ selectionElement: import("../element/types").NonDeletedExcalidrawElement | null;
40
25
  isBindingEnabled: boolean;
41
- startBoundElement: import("./types").NonDeleted<import("./types").ExcalidrawBindableElement> | null;
42
- suggestedBindings: import("./binding").SuggestedBinding[];
43
- frameToHighlight: import("./types").NonDeleted<import("./types").ExcalidrawFrameLikeElement> | null;
26
+ startBoundElement: import("../element/types").NonDeleted<import("../element/types").ExcalidrawBindableElement> | null;
27
+ suggestedBindings: import("../element/binding").SuggestedBinding[];
28
+ frameToHighlight: import("../element/types").NonDeleted<import("../element/types").ExcalidrawFrameLikeElement> | null;
44
29
  frameRendering: {
45
30
  enabled: boolean;
46
31
  name: boolean;
@@ -48,9 +33,9 @@ export declare const actionLink: {
48
33
  clip: boolean;
49
34
  };
50
35
  editingFrame: string | null;
51
- elementsToHighlight: import("./types").NonDeleted<import("./types").ExcalidrawElement>[] | null;
52
- editingElement: NonDeletedExcalidrawElement | null;
53
- editingLinearElement: import("./linearElementEditor").LinearElementEditor | null;
36
+ elementsToHighlight: import("../element/types").NonDeleted<import("../element/types").ExcalidrawElement>[] | null;
37
+ editingElement: import("../element/types").NonDeletedExcalidrawElement | null;
38
+ editingLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
54
39
  activeTool: {
55
40
  lastActiveTool: import("../types").ActiveTool | null;
56
41
  locked: boolean;
@@ -63,23 +48,23 @@ export declare const actionLink: {
63
48
  exportScale: number;
64
49
  currentItemStrokeColor: string;
65
50
  currentItemBackgroundColor: string;
66
- currentItemFillStyle: import("./types").FillStyle;
51
+ currentItemFillStyle: import("../element/types").FillStyle;
67
52
  currentItemStrokeWidth: number;
68
- currentItemStrokeStyle: import("./types").StrokeStyle;
53
+ currentItemStrokeStyle: import("../element/types").StrokeStyle;
69
54
  currentItemRoughness: number;
70
55
  currentItemOpacity: number;
71
56
  currentItemFontFamily: number;
72
57
  currentItemFontSize: number;
73
58
  currentItemTextAlign: string;
74
- currentItemStartArrowhead: import("./types").Arrowhead | null;
75
- currentItemEndArrowhead: import("./types").Arrowhead | null;
76
- currentItemRoundness: import("./types").StrokeRoundness;
59
+ currentItemStartArrowhead: import("../element/types").Arrowhead | null;
60
+ currentItemEndArrowhead: import("../element/types").Arrowhead | null;
61
+ currentItemRoundness: import("../element/types").StrokeRoundness;
77
62
  viewBackgroundColor: string;
78
63
  scrollX: number;
79
64
  scrollY: number;
80
65
  cursorButton: "up" | "down";
81
66
  scrolledOutside: boolean;
82
- name: string;
67
+ name: string | null;
83
68
  isResizing: boolean;
84
69
  isRotating: boolean;
85
70
  zoom: Readonly<{
@@ -98,10 +83,10 @@ export declare const actionLink: {
98
83
  tab: "text-to-diagram" | "diagram-to-code";
99
84
  } | {
100
85
  name: "ttd";
101
- tab: "mermaid" | "text-to-diagram";
86
+ tab: "text-to-diagram" | "mermaid";
102
87
  } | null;
103
88
  defaultSidebarDockedPreference: boolean;
104
- lastPointerDownWith: import("./types").PointerType;
89
+ lastPointerDownWith: import("../element/types").PointerType;
105
90
  selectedElementIds: Readonly<{
106
91
  [id: string]: true;
107
92
  }>;
@@ -116,7 +101,7 @@ export declare const actionLink: {
116
101
  duration?: number | undefined;
117
102
  } | null;
118
103
  zenModeEnabled: boolean;
119
- theme: import("./types").Theme;
104
+ theme: import("../element/types").Theme;
120
105
  gridSize: number | null;
121
106
  viewModeEnabled: boolean;
122
107
  selectedGroupIds: {
@@ -146,7 +131,7 @@ export declare const actionLink: {
146
131
  isCurrentUser?: boolean | undefined;
147
132
  }>>;
148
133
  showStats: boolean;
149
- currentChartType: import("./types").ChartType;
134
+ currentChartType: import("../element/types").ChartType;
150
135
  pasteDialog: {
151
136
  shown: false;
152
137
  data: null;
@@ -155,7 +140,7 @@ export declare const actionLink: {
155
140
  data: import("../charts").Spreadsheet;
156
141
  };
157
142
  pendingImageElementId: string | null;
158
- selectedLinearElement: import("./linearElementEditor").LinearElementEditor | null;
143
+ selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
159
144
  snapLines: readonly import("../snapping").SnapLine[];
160
145
  originSnapOffset: {
161
146
  x: number;
@@ -172,16 +157,9 @@ export declare const actionLink: {
172
157
  action: string;
173
158
  };
174
159
  keyTest: (event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean;
175
- contextItemLabel: (elements: readonly import("./types").ExcalidrawElement[], appState: Readonly<AppState>) => "labels.link.editEmbed" | "labels.link.edit" | "labels.link.createEmbed" | "labels.link.create";
176
- predicate: (elements: readonly import("./types").ExcalidrawElement[], appState: AppState) => boolean;
177
- PanelComponent: ({ elements, appState, updateData }: import("../actions/types").PanelComponentProps) => JSX.Element;
160
+ contextItemLabel: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>) => "labels.link.editEmbed" | "labels.link.edit" | "labels.link.createEmbed" | "labels.link.create";
161
+ predicate: (elements: readonly import("../element/types").ExcalidrawElement[], appState: import("../types").AppState) => boolean;
162
+ PanelComponent: ({ elements, appState, updateData }: import("./types").PanelComponentProps) => JSX.Element;
178
163
  } & {
179
164
  keyTest?: ((event: import("react").KeyboardEvent<Element> | KeyboardEvent) => boolean) | undefined;
180
165
  };
181
- export declare const getContextMenuLabel: (elements: readonly NonDeletedExcalidrawElement[], appState: AppState) => "labels.link.editEmbed" | "labels.link.edit" | "labels.link.createEmbed" | "labels.link.create";
182
- export declare const getLinkHandleFromCoords: ([x1, y1, x2, y2]: Bounds, angle: number, appState: Pick<UIAppState, "zoom">) => Bounds;
183
- export declare const isPointHittingLinkIcon: (element: NonDeletedExcalidrawElement, appState: AppState, [x, y]: readonly [number, number]) => boolean;
184
- export declare const isPointHittingLink: (element: NonDeletedExcalidrawElement, appState: AppState, [x, y]: readonly [number, number], isMobile: boolean) => boolean;
185
- export declare const showHyperlinkTooltip: (element: NonDeletedExcalidrawElement, appState: AppState) => void;
186
- export declare const hideHyperlinkToolip: () => void;
187
- export declare const shouldHideLinkPopup: (element: NonDeletedExcalidrawElement, appState: AppState, [clientX, clientY]: readonly [number, number]) => Boolean;
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { getContextMenuLabel } from "../components/hyperlink/Hyperlink";
3
+ import { LinkIcon } from "../components/icons";
4
+ import { ToolButton } from "../components/ToolButton";
5
+ import { isEmbeddableElement } from "../element/typeChecks";
6
+ import { t } from "../i18n";
7
+ import { KEYS } from "../keys";
8
+ import { getSelectedElements } from "../scene";
9
+ import { getShortcutKey } from "../utils";
10
+ import { register } from "./register";
11
+ export const actionLink = register({
12
+ name: "hyperlink",
13
+ perform: (elements, appState) => {
14
+ if (appState.showHyperlinkPopup === "editor") {
15
+ return false;
16
+ }
17
+ return {
18
+ elements,
19
+ appState: {
20
+ ...appState,
21
+ showHyperlinkPopup: "editor",
22
+ openMenu: null,
23
+ },
24
+ commitToHistory: true,
25
+ };
26
+ },
27
+ trackEvent: { category: "hyperlink", action: "click" },
28
+ keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.K,
29
+ contextItemLabel: (elements, appState) => getContextMenuLabel(elements, appState),
30
+ predicate: (elements, appState) => {
31
+ const selectedElements = getSelectedElements(elements, appState);
32
+ return selectedElements.length === 1;
33
+ },
34
+ PanelComponent: ({ elements, appState, updateData }) => {
35
+ const selectedElements = getSelectedElements(elements, appState);
36
+ return (_jsx(ToolButton, { type: "button", icon: LinkIcon, "aria-label": t(getContextMenuLabel(elements, appState)), title: `${isEmbeddableElement(elements[0])
37
+ ? t("labels.link.labelEmbed")
38
+ : t("labels.link.label")} - ${getShortcutKey("CtrlOrCmd+K")}`, onClick: () => updateData(null), selected: selectedElements.length === 1 && !!selectedElements[0].link }));
39
+ },
40
+ });