@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
@@ -11,7 +11,7 @@ import { ArrowheadArrowIcon, ArrowheadBarIcon, ArrowheadCircleIcon, ArrowheadTri
11
11
  import { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, FONT_FAMILY, ROUNDNESS, STROKE_WIDTH, VERTICAL_ALIGN, } from "../constants";
12
12
  import { getNonDeletedElements, isTextElement, redrawTextBoundingBox, } from "../element";
13
13
  import { mutateElement, newElementWith } from "../element/mutateElement";
14
- import { getBoundTextElement, getContainerElement, getDefaultLineHeight, } from "../element/textElement";
14
+ import { getBoundTextElement, getDefaultLineHeight, } from "../element/textElement";
15
15
  import { isBoundToContainer, isLinearElement, isUsingAdaptiveRadius, } from "../element/typeChecks";
16
16
  import { getLanguage, t } from "../i18n";
17
17
  import { KEYS } from "../keys";
@@ -73,7 +73,7 @@ const offsetElementAfterFontResize = (prevElement, nextElement) => {
73
73
  y: prevElement.y + (prevElement.height - nextElement.height) / 2,
74
74
  }, false);
75
75
  };
76
- const changeFontSize = (elements, appState, getNewFontSize, fallbackValue) => {
76
+ const changeFontSize = (elements, appState, app, getNewFontSize, fallbackValue) => {
77
77
  const newFontSizes = new Set();
78
78
  return {
79
79
  elements: changeProperty(elements, appState, (oldElement) => {
@@ -83,7 +83,7 @@ const changeFontSize = (elements, appState, getNewFontSize, fallbackValue) => {
83
83
  let newElement = newElementWith(oldElement, {
84
84
  fontSize: newFontSize,
85
85
  });
86
- redrawTextBoundingBox(newElement, getContainerElement(oldElement));
86
+ redrawTextBoundingBox(newElement, app.scene.getContainerElement(oldElement), app.scene.getNonDeletedElementsMap());
87
87
  newElement = offsetElementAfterFontResize(oldElement, newElement);
88
88
  return newElement;
89
89
  }
@@ -301,10 +301,10 @@ export const actionChangeOpacity = register({
301
301
  export const actionChangeFontSize = register({
302
302
  name: "changeFontSize",
303
303
  trackEvent: false,
304
- perform: (elements, appState, value) => {
305
- return changeFontSize(elements, appState, () => value, value);
304
+ perform: (elements, appState, value, app) => {
305
+ return changeFontSize(elements, appState, app, () => value, value);
306
306
  },
307
- PanelComponent: ({ elements, appState, updateData }) => (_jsxs("fieldset", { children: [_jsx("legend", { children: t("labels.fontSize") }), _jsx(ButtonIconSelect, { group: "font-size", options: [
307
+ PanelComponent: ({ elements, appState, updateData, app }) => (_jsxs("fieldset", { children: [_jsx("legend", { children: t("labels.fontSize") }), _jsx(ButtonIconSelect, { group: "font-size", options: [
308
308
  {
309
309
  value: 16,
310
310
  text: t("labels.small"),
@@ -333,20 +333,21 @@ export const actionChangeFontSize = register({
333
333
  if (isTextElement(element)) {
334
334
  return element.fontSize;
335
335
  }
336
- const boundTextElement = getBoundTextElement(element);
336
+ const boundTextElement = getBoundTextElement(element, app.scene.getNonDeletedElementsMap());
337
337
  if (boundTextElement) {
338
338
  return boundTextElement.fontSize;
339
339
  }
340
340
  return null;
341
- }, (element) => isTextElement(element) || getBoundTextElement(element) !== null, (hasSelection) => hasSelection
341
+ }, (element) => isTextElement(element) ||
342
+ getBoundTextElement(element, app.scene.getNonDeletedElementsMap()) !== null, (hasSelection) => hasSelection
342
343
  ? null
343
344
  : appState.currentItemFontSize || DEFAULT_FONT_SIZE), onChange: (value) => updateData(value) })] })),
344
345
  });
345
346
  export const actionDecreaseFontSize = register({
346
347
  name: "decreaseFontSize",
347
348
  trackEvent: false,
348
- perform: (elements, appState, value) => {
349
- return changeFontSize(elements, appState, (element) => Math.round(
349
+ perform: (elements, appState, value, app) => {
350
+ return changeFontSize(elements, appState, app, (element) => Math.round(
350
351
  // get previous value before relative increase (doesn't work fully
351
352
  // due to rounding and float precision issues)
352
353
  (1 / (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)) * element.fontSize));
@@ -361,8 +362,8 @@ export const actionDecreaseFontSize = register({
361
362
  export const actionIncreaseFontSize = register({
362
363
  name: "increaseFontSize",
363
364
  trackEvent: false,
364
- perform: (elements, appState, value) => {
365
- return changeFontSize(elements, appState, (element) => Math.round(element.fontSize * (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)));
365
+ perform: (elements, appState, value, app) => {
366
+ return changeFontSize(elements, appState, app, (element) => Math.round(element.fontSize * (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)));
366
367
  },
367
368
  keyTest: (event) => {
368
369
  return (event[KEYS.CTRL_OR_CMD] &&
@@ -374,7 +375,7 @@ export const actionIncreaseFontSize = register({
374
375
  export const actionChangeFontFamily = register({
375
376
  name: "changeFontFamily",
376
377
  trackEvent: false,
377
- perform: (elements, appState, value) => {
378
+ perform: (elements, appState, value, app) => {
378
379
  return {
379
380
  elements: changeProperty(elements, appState, (oldElement) => {
380
381
  if (isTextElement(oldElement)) {
@@ -382,7 +383,7 @@ export const actionChangeFontFamily = register({
382
383
  fontFamily: value,
383
384
  lineHeight: getDefaultLineHeight(value),
384
385
  });
385
- redrawTextBoundingBox(newElement, getContainerElement(oldElement));
386
+ redrawTextBoundingBox(newElement, app.scene.getContainerElement(oldElement), app.scene.getNonDeletedElementsMap());
386
387
  return newElement;
387
388
  }
388
389
  return oldElement;
@@ -394,7 +395,7 @@ export const actionChangeFontFamily = register({
394
395
  commitToHistory: true,
395
396
  };
396
397
  },
397
- PanelComponent: ({ elements, appState, updateData }) => {
398
+ PanelComponent: ({ elements, appState, updateData, app }) => {
398
399
  const options = [
399
400
  {
400
401
  value: FONT_FAMILY.Virgil,
@@ -419,12 +420,13 @@ export const actionChangeFontFamily = register({
419
420
  if (isTextElement(element)) {
420
421
  return element.fontFamily;
421
422
  }
422
- const boundTextElement = getBoundTextElement(element);
423
+ const boundTextElement = getBoundTextElement(element, app.scene.getNonDeletedElementsMap());
423
424
  if (boundTextElement) {
424
425
  return boundTextElement.fontFamily;
425
426
  }
426
427
  return null;
427
- }, (element) => isTextElement(element) || getBoundTextElement(element) !== null, (hasSelection) => hasSelection
428
+ }, (element) => isTextElement(element) ||
429
+ getBoundTextElement(element, app.scene.getNonDeletedElementsMap()) !== null, (hasSelection) => hasSelection
428
430
  ? null
429
431
  : appState.currentItemFontFamily || DEFAULT_FONT_FAMILY), onChange: (value) => updateData(value) })] }));
430
432
  },
@@ -432,12 +434,12 @@ export const actionChangeFontFamily = register({
432
434
  export const actionChangeTextAlign = register({
433
435
  name: "changeTextAlign",
434
436
  trackEvent: false,
435
- perform: (elements, appState, value) => {
437
+ perform: (elements, appState, value, app) => {
436
438
  return {
437
439
  elements: changeProperty(elements, appState, (oldElement) => {
438
440
  if (isTextElement(oldElement)) {
439
441
  const newElement = newElementWith(oldElement, { textAlign: value });
440
- redrawTextBoundingBox(newElement, getContainerElement(oldElement));
442
+ redrawTextBoundingBox(newElement, app.scene.getContainerElement(oldElement), app.scene.getNonDeletedElementsMap());
441
443
  return newElement;
442
444
  }
443
445
  return oldElement;
@@ -449,7 +451,8 @@ export const actionChangeTextAlign = register({
449
451
  commitToHistory: true,
450
452
  };
451
453
  },
452
- PanelComponent: ({ elements, appState, updateData }) => {
454
+ PanelComponent: ({ elements, appState, updateData, app }) => {
455
+ const elementsMap = app.scene.getNonDeletedElementsMap();
453
456
  return (_jsxs("fieldset", { children: [_jsx("legend", { children: t("labels.textAlign") }), _jsx(ButtonIconSelect, { group: "text-align", options: [
454
457
  {
455
458
  value: "left",
@@ -473,23 +476,24 @@ export const actionChangeTextAlign = register({
473
476
  if (isTextElement(element)) {
474
477
  return element.textAlign;
475
478
  }
476
- const boundTextElement = getBoundTextElement(element);
479
+ const boundTextElement = getBoundTextElement(element, elementsMap);
477
480
  if (boundTextElement) {
478
481
  return boundTextElement.textAlign;
479
482
  }
480
483
  return null;
481
- }, (element) => isTextElement(element) || getBoundTextElement(element) !== null, (hasSelection) => hasSelection ? null : appState.currentItemTextAlign), onChange: (value) => updateData(value) })] }));
484
+ }, (element) => isTextElement(element) ||
485
+ getBoundTextElement(element, elementsMap) !== null, (hasSelection) => hasSelection ? null : appState.currentItemTextAlign), onChange: (value) => updateData(value) })] }));
482
486
  },
483
487
  });
484
488
  export const actionChangeVerticalAlign = register({
485
489
  name: "changeVerticalAlign",
486
490
  trackEvent: { category: "element" },
487
- perform: (elements, appState, value) => {
491
+ perform: (elements, appState, value, app) => {
488
492
  return {
489
493
  elements: changeProperty(elements, appState, (oldElement) => {
490
494
  if (isTextElement(oldElement)) {
491
495
  const newElement = newElementWith(oldElement, { verticalAlign: value });
492
- redrawTextBoundingBox(newElement, getContainerElement(oldElement));
496
+ redrawTextBoundingBox(newElement, app.scene.getContainerElement(oldElement), app.scene.getNonDeletedElementsMap());
493
497
  return newElement;
494
498
  }
495
499
  return oldElement;
@@ -500,7 +504,7 @@ export const actionChangeVerticalAlign = register({
500
504
  commitToHistory: true,
501
505
  };
502
506
  },
503
- PanelComponent: ({ elements, appState, updateData }) => {
507
+ PanelComponent: ({ elements, appState, updateData, app }) => {
504
508
  return (_jsx("fieldset", { children: _jsx(ButtonIconSelect, { group: "text-align", options: [
505
509
  {
506
510
  value: VERTICAL_ALIGN.TOP,
@@ -524,12 +528,13 @@ export const actionChangeVerticalAlign = register({
524
528
  if (isTextElement(element) && element.containerId) {
525
529
  return element.verticalAlign;
526
530
  }
527
- const boundTextElement = getBoundTextElement(element);
531
+ const boundTextElement = getBoundTextElement(element, app.scene.getNonDeletedElementsMap());
528
532
  if (boundTextElement) {
529
533
  return boundTextElement.verticalAlign;
530
534
  }
531
535
  return null;
532
- }, (element) => isTextElement(element) || getBoundTextElement(element) !== null, (hasSelection) => (hasSelection ? null : VERTICAL_ALIGN.MIDDLE)), onChange: (value) => updateData(value) }) }));
536
+ }, (element) => isTextElement(element) ||
537
+ getBoundTextElement(element, app.scene.getNonDeletedElementsMap()) !== null, (hasSelection) => (hasSelection ? null : VERTICAL_ALIGN.MIDDLE)), onChange: (value) => updateData(value) }) }));
533
538
  },
534
539
  });
535
540
  export const actionChangeRoundness = register({
@@ -26,7 +26,7 @@ export declare const actionSelectAll: {
26
26
  errorMessage: import("react").ReactNode;
27
27
  activeEmbeddable: {
28
28
  element: import("../element/types").NonDeletedExcalidrawElement;
29
- state: "active" | "hover";
29
+ state: "hover" | "active";
30
30
  } | null;
31
31
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
32
32
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -74,7 +74,7 @@ export declare const actionSelectAll: {
74
74
  scrollY: number;
75
75
  cursorButton: "up" | "down";
76
76
  scrolledOutside: boolean;
77
- name: string;
77
+ name: string | null;
78
78
  isResizing: boolean;
79
79
  isRotating: boolean;
80
80
  zoom: Readonly<{
@@ -94,7 +94,7 @@ export declare const actionSelectAll: {
94
94
  tab: "text-to-diagram" | "diagram-to-code";
95
95
  } | {
96
96
  name: "ttd";
97
- tab: "mermaid" | "text-to-diagram";
97
+ tab: "text-to-diagram" | "mermaid";
98
98
  } | null;
99
99
  defaultSidebarDockedPreference: boolean;
100
100
  lastPointerDownWith: import("../element/types").PointerType;
@@ -144,7 +144,7 @@ export declare const actionSelectAll: {
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
  snapLines: readonly import("../snapping").SnapLine[];
149
149
  originSnapOffset: {
150
150
  x: number;
@@ -29,7 +29,7 @@ export const actionSelectAll = register({
29
29
  // single linear element selected
30
30
  Object.keys(selectedElementIds).length === 1 &&
31
31
  isLinearElement(elements[0])
32
- ? new LinearElementEditor(elements[0], app.scene)
32
+ ? new LinearElementEditor(elements[0])
33
33
  : null,
34
34
  },
35
35
  commitToHistory: true,
@@ -5,7 +5,7 @@ export declare const actionCopyStyles: {
5
5
  trackEvent: {
6
6
  category: "element";
7
7
  };
8
- perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>) => {
8
+ perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>, formData: any, app: import("../types").AppClassProperties) => {
9
9
  appState: {
10
10
  toast: {
11
11
  message: string;
@@ -20,7 +20,7 @@ export declare const actionCopyStyles: {
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;
@@ -68,7 +68,7 @@ export declare const actionCopyStyles: {
68
68
  scrollY: number;
69
69
  cursorButton: "up" | "down";
70
70
  scrolledOutside: boolean;
71
- name: string;
71
+ name: string | null;
72
72
  isResizing: boolean;
73
73
  isRotating: boolean;
74
74
  zoom: Readonly<{
@@ -88,7 +88,7 @@ export declare const actionCopyStyles: {
88
88
  tab: "text-to-diagram" | "diagram-to-code";
89
89
  } | {
90
90
  name: "ttd";
91
- tab: "mermaid" | "text-to-diagram";
91
+ tab: "text-to-diagram" | "mermaid";
92
92
  } | null;
93
93
  defaultSidebarDockedPreference: boolean;
94
94
  lastPointerDownWith: import("../element/types").PointerType;
@@ -140,7 +140,7 @@ export declare const actionCopyStyles: {
140
140
  data: import("../charts").Spreadsheet;
141
141
  };
142
142
  pendingImageElementId: string | null;
143
- showHyperlinkPopup: false | "editor" | "info";
143
+ showHyperlinkPopup: false | "info" | "editor";
144
144
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
145
145
  snapLines: readonly import("../snapping").SnapLine[];
146
146
  originSnapOffset: {
@@ -163,7 +163,7 @@ export declare const actionPasteStyles: {
163
163
  trackEvent: {
164
164
  category: "element";
165
165
  };
166
- perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>) => {
166
+ perform: (elements: readonly import("../element/types").ExcalidrawElement[], appState: Readonly<import("../types").AppState>, formData: any, app: import("../types").AppClassProperties) => {
167
167
  elements: readonly import("../element/types").ExcalidrawElement[];
168
168
  commitToHistory: false;
169
169
  } | {
@@ -12,12 +12,12 @@ export let copiedStyles = "{}";
12
12
  export const actionCopyStyles = register({
13
13
  name: "copyStyles",
14
14
  trackEvent: { category: "element" },
15
- perform: (elements, appState) => {
15
+ perform: (elements, appState, formData, app) => {
16
16
  const elementsCopied = [];
17
17
  const element = elements.find((el) => appState.selectedElementIds[el.id]);
18
18
  elementsCopied.push(element);
19
19
  if (element && hasBoundTextElement(element)) {
20
- const boundTextElement = getBoundTextElement(element);
20
+ const boundTextElement = getBoundTextElement(element, app.scene.getNonDeletedElementsMap());
21
21
  elementsCopied.push(boundTextElement);
22
22
  }
23
23
  if (element) {
@@ -37,7 +37,7 @@ export const actionCopyStyles = register({
37
37
  export const actionPasteStyles = register({
38
38
  name: "pasteStyles",
39
39
  trackEvent: { category: "element" },
40
- perform: (elements, appState) => {
40
+ perform: (elements, appState, formData, app) => {
41
41
  const elementsCopied = JSON.parse(copiedStyles);
42
42
  const pastedElement = elementsCopied[0];
43
43
  const boundTextElement = elementsCopied[1];
@@ -91,7 +91,7 @@ export const actionPasteStyles = register({
91
91
  selectedElements.find((element) => isTextElement(newElement) &&
92
92
  element.id === newElement.containerId) || null;
93
93
  }
94
- redrawTextBoundingBox(newElement, container);
94
+ redrawTextBoundingBox(newElement, container, app.scene.getNonDeletedElementsMap());
95
95
  }
96
96
  if (newElement.type === "arrow" &&
97
97
  isArrowElement(elementStylesToCopyFrom)) {
@@ -21,7 +21,7 @@ export declare const actionToggleGridMode: {
21
21
  errorMessage: import("react").ReactNode;
22
22
  activeEmbeddable: {
23
23
  element: import("../element/types").NonDeletedExcalidrawElement;
24
- state: "active" | "hover";
24
+ state: "hover" | "active";
25
25
  } | null;
26
26
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
27
27
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -69,7 +69,7 @@ export declare const actionToggleGridMode: {
69
69
  scrollY: number;
70
70
  cursorButton: "up" | "down";
71
71
  scrolledOutside: boolean;
72
- name: string;
72
+ name: string | null;
73
73
  isResizing: boolean;
74
74
  isRotating: boolean;
75
75
  zoom: Readonly<{
@@ -89,7 +89,7 @@ export declare const actionToggleGridMode: {
89
89
  tab: "text-to-diagram" | "diagram-to-code";
90
90
  } | {
91
91
  name: "ttd";
92
- tab: "mermaid" | "text-to-diagram";
92
+ tab: "text-to-diagram" | "mermaid";
93
93
  } | null;
94
94
  defaultSidebarDockedPreference: boolean;
95
95
  lastPointerDownWith: import("../element/types").PointerType;
@@ -145,7 +145,7 @@ export declare const actionToggleGridMode: {
145
145
  data: import("../charts").Spreadsheet;
146
146
  };
147
147
  pendingImageElementId: string | null;
148
- showHyperlinkPopup: false | "editor" | "info";
148
+ showHyperlinkPopup: false | "info" | "editor";
149
149
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
150
150
  snapLines: readonly import("../snapping").SnapLine[];
151
151
  originSnapOffset: {
@@ -20,7 +20,7 @@ export declare const actionToggleObjectsSnapMode: {
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;
@@ -68,7 +68,7 @@ export declare const actionToggleObjectsSnapMode: {
68
68
  scrollY: number;
69
69
  cursorButton: "up" | "down";
70
70
  scrolledOutside: boolean;
71
- name: string;
71
+ name: string | null;
72
72
  isResizing: boolean;
73
73
  isRotating: boolean;
74
74
  zoom: Readonly<{
@@ -88,7 +88,7 @@ export declare const actionToggleObjectsSnapMode: {
88
88
  tab: "text-to-diagram" | "diagram-to-code";
89
89
  } | {
90
90
  name: "ttd";
91
- tab: "mermaid" | "text-to-diagram";
91
+ tab: "text-to-diagram" | "mermaid";
92
92
  } | null;
93
93
  defaultSidebarDockedPreference: boolean;
94
94
  lastPointerDownWith: import("../element/types").PointerType;
@@ -144,7 +144,7 @@ export declare const actionToggleObjectsSnapMode: {
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: import("../element/linearElementEditor").LinearElementEditor | null;
149
149
  snapLines: readonly import("../snapping").SnapLine[];
150
150
  originSnapOffset: {
@@ -18,7 +18,7 @@ export declare const actionToggleStats: {
18
18
  errorMessage: import("react").ReactNode;
19
19
  activeEmbeddable: {
20
20
  element: import("../element/types").NonDeletedExcalidrawElement;
21
- state: "active" | "hover";
21
+ state: "hover" | "active";
22
22
  } | null;
23
23
  draggingElement: import("../element/types").NonDeletedExcalidrawElement | null;
24
24
  resizingElement: import("../element/types").NonDeletedExcalidrawElement | null;
@@ -66,7 +66,7 @@ export declare const actionToggleStats: {
66
66
  scrollY: number;
67
67
  cursorButton: "up" | "down";
68
68
  scrolledOutside: boolean;
69
- name: string;
69
+ name: string | null;
70
70
  isResizing: boolean;
71
71
  isRotating: boolean;
72
72
  zoom: Readonly<{
@@ -86,7 +86,7 @@ export declare const actionToggleStats: {
86
86
  tab: "text-to-diagram" | "diagram-to-code";
87
87
  } | {
88
88
  name: "ttd";
89
- tab: "mermaid" | "text-to-diagram";
89
+ tab: "text-to-diagram" | "mermaid";
90
90
  } | null;
91
91
  defaultSidebarDockedPreference: boolean;
92
92
  lastPointerDownWith: import("../element/types").PointerType;
@@ -142,7 +142,7 @@ export declare const actionToggleStats: {
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: import("../element/linearElementEditor").LinearElementEditor | null;
147
147
  snapLines: readonly import("../snapping").SnapLine[];
148
148
  originSnapOffset: {
@@ -19,7 +19,7 @@ export declare const actionToggleViewMode: {
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;
@@ -67,7 +67,7 @@ export declare const actionToggleViewMode: {
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 actionToggleViewMode: {
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;
@@ -143,7 +143,7 @@ export declare const actionToggleViewMode: {
143
143
  data: import("../charts").Spreadsheet;
144
144
  };
145
145
  pendingImageElementId: string | null;
146
- showHyperlinkPopup: false | "editor" | "info";
146
+ showHyperlinkPopup: false | "info" | "editor";
147
147
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
148
148
  snapLines: readonly import("../snapping").SnapLine[];
149
149
  originSnapOffset: {
@@ -19,7 +19,7 @@ export declare const actionToggleZenMode: {
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;
@@ -67,7 +67,7 @@ export declare const actionToggleZenMode: {
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 actionToggleZenMode: {
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;
@@ -143,7 +143,7 @@ export declare const actionToggleZenMode: {
143
143
  data: import("../charts").Spreadsheet;
144
144
  };
145
145
  pendingImageElementId: string | null;
146
- showHyperlinkPopup: false | "editor" | "info";
146
+ showHyperlinkPopup: false | "info" | "editor";
147
147
  selectedLinearElement: import("../element/linearElementEditor").LinearElementEditor | null;
148
148
  snapLines: readonly import("../snapping").SnapLine[];
149
149
  originSnapOffset: {
@@ -20,6 +20,6 @@ export { actionToggleZenMode } from "./actionToggleZenMode";
20
20
  export { actionToggleObjectsSnapMode } from "./actionToggleObjectsSnapMode";
21
21
  export { actionToggleStats } from "./actionToggleStats";
22
22
  export { actionUnbindText, actionBindText } from "./actionBoundText";
23
- export { actionLink } from "../element/Hyperlink";
23
+ export { actionLink } from "./actionLink";
24
24
  export { actionToggleElementLock } from "./actionElementLock";
25
25
  export { actionToggleLinearEditor } from "./actionLinearEditor";
@@ -20,6 +20,6 @@ export { actionToggleZenMode } from "./actionToggleZenMode";
20
20
  export { actionToggleObjectsSnapMode } from "./actionToggleObjectsSnapMode";
21
21
  export { actionToggleStats } from "./actionToggleStats";
22
22
  export { actionUnbindText, actionBindText } from "./actionBoundText";
23
- export { actionLink } from "../element/Hyperlink";
23
+ export { actionLink } from "./actionLink";
24
24
  export { actionToggleElementLock } from "./actionElementLock";
25
25
  export { actionToggleLinearEditor } from "./actionLinearEditor";
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { trackEvent } from "../analytics";
3
+ import { isPromiseLike } from "../utils";
3
4
  const trackAction = (action, source, appState, elements, app, value) => {
4
5
  if (action.trackEvent) {
5
6
  try {
@@ -25,7 +26,7 @@ export class ActionManager {
25
26
  app;
26
27
  constructor(updater, getAppState, getElementsIncludingDeleted, app) {
27
28
  this.updater = (actionResult) => {
28
- if (actionResult && "then" in actionResult) {
29
+ if (isPromiseLike(actionResult)) {
29
30
  actionResult.then((actionResult) => {
30
31
  return updater(actionResult);
31
32
  });
@@ -1,6 +1,6 @@
1
- import { ExcalidrawElement } from "./element/types";
1
+ import { ElementsMap, ExcalidrawElement } from "./element/types";
2
2
  export interface Alignment {
3
3
  position: "start" | "center" | "end";
4
4
  axis: "x" | "y";
5
5
  }
6
- export declare const alignElements: (selectedElements: ExcalidrawElement[], alignment: Alignment) => ExcalidrawElement[];
6
+ export declare const alignElements: (selectedElements: ExcalidrawElement[], elementsMap: ElementsMap, alignment: Alignment) => ExcalidrawElement[];
@@ -1,8 +1,8 @@
1
1
  import { newElementWith } from "./element/mutateElement";
2
2
  import { getCommonBoundingBox } from "./element/bounds";
3
3
  import { getMaximumGroups } from "./groups";
4
- export const alignElements = (selectedElements, alignment) => {
5
- const groups = getMaximumGroups(selectedElements);
4
+ export const alignElements = (selectedElements, elementsMap, alignment) => {
5
+ const groups = getMaximumGroups(selectedElements, elementsMap);
6
6
  const selectionBoundingBox = getCommonBoundingBox(selectedElements);
7
7
  return groups.flatMap((group) => {
8
8
  const translation = calculateTranslation(group, selectionBoundingBox, alignment);
@@ -0,0 +1,33 @@
1
+ import { LaserPointerOptions } from "@excalidraw/laser-pointer";
2
+ import { AnimationFrameHandler } from "./animation-frame-handler";
3
+ import type App from "./components/App";
4
+ export interface Trail {
5
+ start(container: SVGSVGElement): void;
6
+ stop(): void;
7
+ startPath(x: number, y: number): void;
8
+ addPointToPath(x: number, y: number): void;
9
+ endPath(): void;
10
+ }
11
+ export interface AnimatedTrailOptions {
12
+ fill: (trail: AnimatedTrail) => string;
13
+ }
14
+ export declare class AnimatedTrail implements Trail {
15
+ private animationFrameHandler;
16
+ private app;
17
+ private options;
18
+ private currentTrail?;
19
+ private pastTrails;
20
+ private container?;
21
+ private trailElement;
22
+ constructor(animationFrameHandler: AnimationFrameHandler, app: App, options: Partial<LaserPointerOptions> & Partial<AnimatedTrailOptions>);
23
+ get hasCurrentTrail(): boolean;
24
+ hasLastPoint(x: number, y: number): boolean;
25
+ start(container?: SVGSVGElement): void;
26
+ stop(): void;
27
+ startPath(x: number, y: number): void;
28
+ addPointToPath(x: number, y: number): void;
29
+ endPath(): void;
30
+ private update;
31
+ private onFrame;
32
+ private drawTrail;
33
+ }