@excalidraw/excalidraw 0.17.1-d2f67e6 → 0.17.1-e63dd02

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 (252) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/browser/dev/excalidraw-assets-dev/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  3. package/dist/browser/dev/excalidraw-assets-dev/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  4. package/dist/browser/dev/excalidraw-assets-dev/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  5. package/dist/browser/dev/excalidraw-assets-dev/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  6. package/dist/browser/dev/excalidraw-assets-dev/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  7. package/dist/browser/dev/excalidraw-assets-dev/{chunk-EM6LVGFW.js → chunk-IT7T3AIK.js} +23 -5
  8. package/dist/browser/dev/excalidraw-assets-dev/chunk-IT7T3AIK.js.map +7 -0
  9. package/dist/browser/dev/excalidraw-assets-dev/{chunk-B4UMSLQQ.js → chunk-RNHSD5AR.js} +7451 -2098
  10. package/dist/browser/dev/excalidraw-assets-dev/chunk-RNHSD5AR.js.map +7 -0
  11. package/dist/browser/dev/excalidraw-assets-dev/{dist-6QVAH5JA.js → dist-DNSPZDOZ.js} +31 -19
  12. package/dist/browser/dev/excalidraw-assets-dev/dist-DNSPZDOZ.js.map +7 -0
  13. package/dist/browser/dev/excalidraw-assets-dev/{en-AZFA5HJJ.js → en-XV7OZCPP.js} +6 -2
  14. package/dist/browser/dev/excalidraw-assets-dev/{image-V7E6IT6R.js → image-77HZYGLG.js} +2 -2
  15. package/dist/browser/dev/excalidraw-assets-dev/{image-O66MQ7WQ.css → image-WDHYGKKP.css} +1 -1
  16. package/dist/browser/dev/excalidraw-assets-dev/{image-O66MQ7WQ.css.map → image-WDHYGKKP.css.map} +2 -2
  17. package/dist/browser/dev/index.css +449 -114
  18. package/dist/browser/dev/index.css.map +3 -3
  19. package/dist/browser/dev/index.js +4143 -5956
  20. package/dist/browser/dev/index.js.map +4 -4
  21. package/dist/browser/prod/excalidraw-assets/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  22. package/dist/browser/prod/excalidraw-assets/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  23. package/dist/browser/prod/excalidraw-assets/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  24. package/dist/browser/prod/excalidraw-assets/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  25. package/dist/browser/prod/excalidraw-assets/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  26. package/dist/browser/prod/excalidraw-assets/chunk-OYEADJSR.js +63 -0
  27. package/dist/browser/prod/excalidraw-assets/{chunk-7DXALCB2.js → chunk-PDYFZJMS.js} +3 -3
  28. package/dist/browser/prod/excalidraw-assets/dist-NLUQPPQQ.js +7 -0
  29. package/dist/browser/prod/excalidraw-assets/en-YVAVVILW.js +1 -0
  30. package/dist/browser/prod/excalidraw-assets/image-X3GFZHNN.js +1 -0
  31. package/dist/browser/prod/index.css +1 -1
  32. package/dist/browser/prod/index.js +40 -50
  33. package/dist/dev/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  34. package/dist/dev/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  35. package/dist/dev/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  36. package/dist/dev/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  37. package/dist/dev/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  38. package/dist/dev/{en-EB2MBPAV.json → en-YNVBSAIL.json} +18 -4
  39. package/dist/dev/index.css +449 -114
  40. package/dist/dev/index.css.map +3 -3
  41. package/dist/dev/index.js +21626 -18122
  42. package/dist/dev/index.js.map +4 -4
  43. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +9 -3
  44. package/dist/excalidraw/actions/actionBoundText.d.ts +6 -2
  45. package/dist/excalidraw/actions/actionCanvas.d.ts +36 -12
  46. package/dist/excalidraw/actions/actionClipboard.d.ts +22 -7
  47. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +12 -5
  48. package/dist/excalidraw/actions/actionDeleteSelected.js +24 -5
  49. package/dist/excalidraw/actions/actionDuplicateSelection.js +1 -2
  50. package/dist/excalidraw/actions/actionElementLock.d.ts +6 -2
  51. package/dist/excalidraw/actions/actionExport.d.ts +27 -9
  52. package/dist/excalidraw/actions/actionFinalize.d.ts +6 -2
  53. package/dist/excalidraw/actions/actionFinalize.js +2 -2
  54. package/dist/excalidraw/actions/actionFlip.js +2 -2
  55. package/dist/excalidraw/actions/actionFrame.d.ts +12 -4
  56. package/dist/excalidraw/actions/actionGroup.d.ts +6 -2
  57. package/dist/excalidraw/actions/actionHistory.js +4 -4
  58. package/dist/excalidraw/actions/actionLinearEditor.d.ts +3 -1
  59. package/dist/excalidraw/actions/actionLinearEditor.js +3 -2
  60. package/dist/excalidraw/actions/actionLink.d.ts +3 -1
  61. package/dist/excalidraw/actions/actionMenu.d.ts +9 -3
  62. package/dist/excalidraw/actions/actionNavigate.d.ts +6 -2
  63. package/dist/excalidraw/actions/actionProperties.d.ts +411 -56
  64. package/dist/excalidraw/actions/actionProperties.js +383 -58
  65. package/dist/excalidraw/actions/actionSelectAll.d.ts +3 -1
  66. package/dist/excalidraw/actions/actionStyles.d.ts +3 -1
  67. package/dist/excalidraw/actions/actionStyles.js +3 -2
  68. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +3 -1
  69. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +3 -1
  70. package/dist/excalidraw/actions/actionToggleStats.d.ts +3 -1
  71. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +3 -1
  72. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +3 -1
  73. package/dist/excalidraw/actions/types.d.ts +1 -1
  74. package/dist/excalidraw/analytics.js +9 -7
  75. package/dist/excalidraw/appState.d.ts +1 -0
  76. package/dist/excalidraw/appState.js +9 -1
  77. package/dist/excalidraw/binaryheap.d.ts +12 -0
  78. package/dist/excalidraw/binaryheap.js +93 -0
  79. package/dist/excalidraw/change.d.ts +2 -1
  80. package/dist/excalidraw/change.js +6 -4
  81. package/dist/excalidraw/charts.js +0 -10
  82. package/dist/excalidraw/components/Actions.js +7 -5
  83. package/dist/excalidraw/components/App.d.ts +5 -9
  84. package/dist/excalidraw/components/App.js +218 -161
  85. package/dist/excalidraw/components/ButtonIcon.d.ts +15 -0
  86. package/dist/excalidraw/components/ButtonIcon.js +8 -0
  87. package/dist/excalidraw/components/ButtonIconSelect.js +2 -3
  88. package/dist/excalidraw/components/ButtonSeparator.d.ts +2 -0
  89. package/dist/excalidraw/components/ButtonSeparator.js +7 -0
  90. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +47 -79
  91. package/dist/excalidraw/components/ColorPicker/Picker.js +1 -1
  92. package/dist/excalidraw/components/FontPicker/FontPicker.d.ts +21 -0
  93. package/dist/excalidraw/components/FontPicker/FontPicker.js +49 -0
  94. package/dist/excalidraw/components/FontPicker/FontPickerList.d.ts +25 -0
  95. package/dist/excalidraw/components/FontPicker/FontPickerList.js +119 -0
  96. package/dist/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +7 -0
  97. package/dist/excalidraw/components/FontPicker/FontPickerTrigger.js +13 -0
  98. package/dist/excalidraw/components/FontPicker/keyboardNavHandlers.d.ts +14 -0
  99. package/dist/excalidraw/components/FontPicker/keyboardNavHandlers.js +38 -0
  100. package/dist/excalidraw/components/HelpDialog.js +1 -1
  101. package/dist/excalidraw/components/HintViewer.js +6 -3
  102. package/dist/excalidraw/components/PropertiesPopover.d.ts +15 -0
  103. package/dist/excalidraw/components/PropertiesPopover.js +31 -0
  104. package/dist/excalidraw/components/QuickSearch.d.ts +9 -0
  105. package/dist/excalidraw/components/QuickSearch.js +8 -0
  106. package/dist/excalidraw/components/ScrollableList.d.ts +9 -0
  107. package/dist/excalidraw/components/ScrollableList.js +8 -0
  108. package/dist/excalidraw/components/Stats/Angle.d.ts +7 -3
  109. package/dist/excalidraw/components/Stats/Angle.js +39 -31
  110. package/dist/excalidraw/components/Stats/Dimension.d.ts +6 -3
  111. package/dist/excalidraw/components/Stats/Dimension.js +51 -49
  112. package/dist/excalidraw/components/Stats/DragInput.d.ts +15 -6
  113. package/dist/excalidraw/components/Stats/DragInput.js +59 -26
  114. package/dist/excalidraw/components/Stats/FontSize.d.ts +8 -4
  115. package/dist/excalidraw/components/Stats/FontSize.js +39 -36
  116. package/dist/excalidraw/components/Stats/MultiAngle.d.ts +5 -3
  117. package/dist/excalidraw/components/Stats/MultiAngle.js +43 -34
  118. package/dist/excalidraw/components/Stats/MultiDimension.d.ts +5 -3
  119. package/dist/excalidraw/components/Stats/MultiDimension.js +101 -99
  120. package/dist/excalidraw/components/Stats/MultiFontSize.d.ts +6 -3
  121. package/dist/excalidraw/components/Stats/MultiFontSize.js +47 -32
  122. package/dist/excalidraw/components/Stats/MultiPosition.d.ts +3 -1
  123. package/dist/excalidraw/components/Stats/MultiPosition.js +52 -48
  124. package/dist/excalidraw/components/Stats/Position.d.ts +5 -1
  125. package/dist/excalidraw/components/Stats/Position.js +31 -29
  126. package/dist/excalidraw/components/Stats/index.js +5 -17
  127. package/dist/excalidraw/components/Stats/utils.d.ts +14 -3
  128. package/dist/excalidraw/components/Stats/utils.js +48 -9
  129. package/dist/excalidraw/components/TTDDialog/common.d.ts +2 -2
  130. package/dist/excalidraw/components/TTDDialog/common.js +3 -7
  131. package/dist/excalidraw/components/UserList.js +22 -22
  132. package/dist/excalidraw/components/canvases/StaticCanvas.js +1 -0
  133. package/dist/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +12 -3
  134. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.d.ts +24 -4
  135. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +55 -14
  136. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContent.d.ts +2 -1
  137. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContent.js +2 -2
  138. package/dist/excalidraw/components/dropdownMenu/common.d.ts +1 -1
  139. package/dist/excalidraw/components/dropdownMenu/common.js +3 -2
  140. package/dist/excalidraw/components/icons.d.ts +4 -0
  141. package/dist/excalidraw/components/icons.js +7 -0
  142. package/dist/excalidraw/components/main-menu/MainMenu.d.ts +12 -3
  143. package/dist/excalidraw/components/welcome-screen/WelcomeScreen.Center.js +2 -2
  144. package/dist/excalidraw/components/welcome-screen/WelcomeScreen.Hints.js +3 -3
  145. package/dist/excalidraw/constants.d.ts +17 -2
  146. package/dist/excalidraw/constants.js +21 -4
  147. package/dist/excalidraw/data/reconcile.js +18 -1
  148. package/dist/excalidraw/data/restore.js +55 -9
  149. package/dist/excalidraw/data/transform.js +8 -5
  150. package/dist/excalidraw/element/binding.d.ts +28 -9
  151. package/dist/excalidraw/element/binding.js +303 -71
  152. package/dist/excalidraw/element/collision.d.ts +1 -1
  153. package/dist/excalidraw/element/collision.js +4 -1
  154. package/dist/excalidraw/element/dragElements.d.ts +2 -2
  155. package/dist/excalidraw/element/dragElements.js +13 -3
  156. package/dist/excalidraw/element/embeddable.d.ts +3 -1
  157. package/dist/excalidraw/element/heading.d.ts +11 -0
  158. package/dist/excalidraw/element/heading.js +81 -0
  159. package/dist/excalidraw/element/index.d.ts +1 -1
  160. package/dist/excalidraw/element/index.js +1 -1
  161. package/dist/excalidraw/element/linearElementEditor.d.ts +21 -13
  162. package/dist/excalidraw/element/linearElementEditor.js +133 -56
  163. package/dist/excalidraw/element/newElement.d.ts +8 -3
  164. package/dist/excalidraw/element/newElement.js +15 -2
  165. package/dist/excalidraw/element/resizeElements.d.ts +4 -3
  166. package/dist/excalidraw/element/resizeElements.js +47 -23
  167. package/dist/excalidraw/element/routing.d.ts +13 -0
  168. package/dist/excalidraw/element/routing.js +641 -0
  169. package/dist/excalidraw/element/textElement.d.ts +3 -26
  170. package/dist/excalidraw/element/textElement.js +54 -110
  171. package/dist/excalidraw/element/textWysiwyg.js +39 -47
  172. package/dist/excalidraw/element/transformHandles.js +7 -2
  173. package/dist/excalidraw/element/typeChecks.d.ts +5 -2
  174. package/dist/excalidraw/element/typeChecks.js +17 -0
  175. package/dist/excalidraw/element/types.d.ts +12 -1
  176. package/dist/excalidraw/fonts/ExcalidrawFont.d.ts +21 -0
  177. package/dist/excalidraw/fonts/ExcalidrawFont.js +112 -0
  178. package/dist/excalidraw/fonts/index.d.ts +58 -0
  179. package/dist/excalidraw/fonts/index.js +240 -0
  180. package/dist/excalidraw/fonts/metadata.d.ts +36 -0
  181. package/dist/excalidraw/fonts/metadata.js +91 -0
  182. package/dist/excalidraw/fractionalIndex.d.ts +11 -4
  183. package/dist/excalidraw/fractionalIndex.js +38 -6
  184. package/dist/excalidraw/frame.d.ts +1 -1
  185. package/dist/excalidraw/frame.js +3 -3
  186. package/dist/excalidraw/history.d.ts +4 -3
  187. package/dist/excalidraw/history.js +8 -8
  188. package/dist/excalidraw/index.d.ts +1 -1
  189. package/dist/excalidraw/index.js +3 -3
  190. package/dist/excalidraw/locales/en.json +18 -4
  191. package/dist/excalidraw/math.d.ts +43 -0
  192. package/dist/excalidraw/math.js +110 -0
  193. package/dist/excalidraw/mermaid.js +4 -3
  194. package/dist/excalidraw/renderer/interactiveScene.js +33 -17
  195. package/dist/excalidraw/renderer/renderElement.d.ts +2 -0
  196. package/dist/excalidraw/renderer/renderElement.js +74 -54
  197. package/dist/excalidraw/renderer/staticSvgScene.js +2 -1
  198. package/dist/excalidraw/scene/Scene.js +9 -3
  199. package/dist/excalidraw/scene/Shape.js +56 -5
  200. package/dist/excalidraw/scene/comparisons.d.ts +1 -0
  201. package/dist/excalidraw/scene/comparisons.js +1 -1
  202. package/dist/excalidraw/scene/export.d.ts +2 -1
  203. package/dist/excalidraw/scene/export.js +33 -35
  204. package/dist/excalidraw/scene/types.d.ts +1 -4
  205. package/dist/excalidraw/shapes.d.ts +8 -0
  206. package/dist/excalidraw/shapes.js +57 -0
  207. package/dist/excalidraw/types.d.ts +8 -3
  208. package/dist/excalidraw/utils.d.ts +11 -1
  209. package/dist/excalidraw/utils.js +22 -0
  210. package/dist/prod/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  211. package/dist/prod/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  212. package/dist/prod/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  213. package/dist/prod/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  214. package/dist/prod/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  215. package/dist/prod/{en-EB2MBPAV.json → en-YNVBSAIL.json} +18 -4
  216. package/dist/prod/index.css +1 -1
  217. package/dist/prod/index.js +49 -53
  218. package/dist/utils/export.d.ts +2 -1
  219. package/dist/utils/export.js +2 -1
  220. package/dist/utils/geometry/geometry.d.ts +2 -1
  221. package/dist/utils/geometry/geometry.js +5 -1
  222. package/dist/utils/index.d.ts +1 -0
  223. package/dist/utils/index.js +1 -0
  224. package/history.ts +9 -2
  225. package/package.json +2 -2
  226. package/dist/browser/dev/Cascadia-CYPE3OJC.woff2 +0 -0
  227. package/dist/browser/dev/Virgil-UZN6MUT6.woff2 +0 -0
  228. package/dist/browser/dev/excalidraw-assets-dev/chunk-B4UMSLQQ.js.map +0 -7
  229. package/dist/browser/dev/excalidraw-assets-dev/chunk-EM6LVGFW.js.map +0 -7
  230. package/dist/browser/dev/excalidraw-assets-dev/dist-6QVAH5JA.js.map +0 -7
  231. package/dist/browser/prod/Cascadia-CYPE3OJC.woff2 +0 -0
  232. package/dist/browser/prod/Virgil-UZN6MUT6.woff2 +0 -0
  233. package/dist/browser/prod/excalidraw-assets/chunk-EGOLGOLD.js +0 -55
  234. package/dist/browser/prod/excalidraw-assets/dist-567JAXHK.js +0 -7
  235. package/dist/browser/prod/excalidraw-assets/en-6E7MYLWO.js +0 -1
  236. package/dist/browser/prod/excalidraw-assets/image-SI7BKULC.js +0 -1
  237. package/dist/dev/Cascadia-CYPE3OJC.woff2 +0 -0
  238. package/dist/dev/Virgil-UZN6MUT6.woff2 +0 -0
  239. package/dist/excalidraw/scene/Fonts.d.ts +0 -19
  240. package/dist/excalidraw/scene/Fonts.js +0 -66
  241. package/dist/prod/Cascadia-CYPE3OJC.woff2 +0 -0
  242. package/dist/prod/Virgil-UZN6MUT6.woff2 +0 -0
  243. /package/dist/browser/dev/{Assistant-Bold-ZDZZ6JHA.woff2 → excalidraw-assets-dev/Assistant-Bold-ZDZZ6JHA.woff2} +0 -0
  244. /package/dist/browser/dev/{Assistant-Medium-DZ25RZU3.woff2 → excalidraw-assets-dev/Assistant-Medium-DZ25RZU3.woff2} +0 -0
  245. /package/dist/browser/dev/{Assistant-Regular-PLF2XOGW.woff2 → excalidraw-assets-dev/Assistant-Regular-PLF2XOGW.woff2} +0 -0
  246. /package/dist/browser/dev/{Assistant-SemiBold-CZ5MX6FK.woff2 → excalidraw-assets-dev/Assistant-SemiBold-CZ5MX6FK.woff2} +0 -0
  247. /package/dist/browser/dev/excalidraw-assets-dev/{en-AZFA5HJJ.js.map → en-XV7OZCPP.js.map} +0 -0
  248. /package/dist/browser/dev/excalidraw-assets-dev/{image-V7E6IT6R.js.map → image-77HZYGLG.js.map} +0 -0
  249. /package/dist/browser/prod/{Assistant-Bold-ZDZZ6JHA.woff2 → excalidraw-assets/Assistant-Bold-ZDZZ6JHA.woff2} +0 -0
  250. /package/dist/browser/prod/{Assistant-Medium-DZ25RZU3.woff2 → excalidraw-assets/Assistant-Medium-DZ25RZU3.woff2} +0 -0
  251. /package/dist/browser/prod/{Assistant-Regular-PLF2XOGW.woff2 → excalidraw-assets/Assistant-Regular-PLF2XOGW.woff2} +0 -0
  252. /package/dist/browser/prod/{Assistant-SemiBold-CZ5MX6FK.woff2 → excalidraw-assets/Assistant-SemiBold-CZ5MX6FK.woff2} +0 -0
@@ -1,15 +1,14 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { rotate } from "../../math";
3
3
  import StatsDragInput from "./DragInput";
4
- import { getStepSizedValue, isPropertyEditable } from "./utils";
4
+ import { getAtomicUnits, getStepSizedValue, isPropertyEditable } from "./utils";
5
5
  import { getCommonBounds, isTextElement } from "../../element";
6
6
  import { useMemo } from "react";
7
7
  import { getElementsInAtomicUnit, moveElement } from "./utils";
8
8
  const STEP_SIZE = 10;
9
- const moveElements = (property, changeInTopX, changeInTopY, elements, originalElements, elementsMap, originalElementsMap) => {
9
+ const moveElements = (property, changeInTopX, changeInTopY, elements, originalElements, elementsMap, originalElementsMap, scene) => {
10
10
  for (let i = 0; i < elements.length; i++) {
11
11
  const origElement = originalElements[i];
12
- const latestElement = elements[i];
13
12
  const [cx, cy] = [
14
13
  origElement.x + origElement.width / 2,
15
14
  origElement.y + origElement.height / 2,
@@ -17,16 +16,19 @@ const moveElements = (property, changeInTopX, changeInTopY, elements, originalEl
17
16
  const [topLeftX, topLeftY] = rotate(origElement.x, origElement.y, cx, cy, origElement.angle);
18
17
  const newTopLeftX = property === "x" ? Math.round(topLeftX + changeInTopX) : topLeftX;
19
18
  const newTopLeftY = property === "y" ? Math.round(topLeftY + changeInTopY) : topLeftY;
20
- moveElement(newTopLeftX, newTopLeftY, latestElement, origElement, elementsMap, originalElementsMap, false);
19
+ moveElement(newTopLeftX, newTopLeftY, origElement, elementsMap, elements, scene, originalElementsMap, false);
21
20
  }
22
21
  };
23
- const moveGroupTo = (nextX, nextY, latestElements, originalElements, elementsMap, originalElementsMap) => {
22
+ const moveGroupTo = (nextX, nextY, originalElements, elementsMap, elements, originalElementsMap, scene) => {
24
23
  const [x1, y1, ,] = getCommonBounds(originalElements);
25
24
  const offsetX = nextX - x1;
26
25
  const offsetY = nextY - y1;
27
- for (let i = 0; i < latestElements.length; i++) {
26
+ for (let i = 0; i < originalElements.length; i++) {
28
27
  const origElement = originalElements[i];
29
- const latestElement = latestElements[i];
28
+ const latestElement = elementsMap.get(origElement.id);
29
+ if (!latestElement) {
30
+ continue;
31
+ }
30
32
  // bound texts are moved with their containers
31
33
  if (!isTextElement(latestElement) || !latestElement.containerId) {
32
34
  const [cx, cy] = [
@@ -34,11 +36,51 @@ const moveGroupTo = (nextX, nextY, latestElements, originalElements, elementsMap
34
36
  latestElement.y + latestElement.height / 2,
35
37
  ];
36
38
  const [topLeftX, topLeftY] = rotate(latestElement.x, latestElement.y, cx, cy, latestElement.angle);
37
- moveElement(topLeftX + offsetX, topLeftY + offsetY, latestElement, origElement, elementsMap, originalElementsMap, false);
39
+ moveElement(topLeftX + offsetX, topLeftY + offsetY, origElement, elementsMap, elements, scene, originalElementsMap, false);
38
40
  }
39
41
  }
40
42
  };
41
- const MultiPosition = ({ property, elements, elementsMap, atomicUnits, scene, }) => {
43
+ const handlePositionChange = ({ accumulatedChange, originalElements, originalElementsMap, shouldChangeByStepSize, nextValue, property, scene, originalAppState, }) => {
44
+ const elementsMap = scene.getNonDeletedElementsMap();
45
+ const elements = scene.getNonDeletedElements();
46
+ if (nextValue !== undefined) {
47
+ for (const atomicUnit of getAtomicUnits(originalElements, originalAppState)) {
48
+ const elementsInUnit = getElementsInAtomicUnit(atomicUnit, elementsMap, originalElementsMap);
49
+ if (elementsInUnit.length > 1) {
50
+ const [x1, y1, ,] = getCommonBounds(elementsInUnit.map((el) => el.latest));
51
+ const newTopLeftX = property === "x" ? nextValue : x1;
52
+ const newTopLeftY = property === "y" ? nextValue : y1;
53
+ moveGroupTo(newTopLeftX, newTopLeftY, elementsInUnit.map((el) => el.original), elementsMap, elements, originalElementsMap, scene);
54
+ }
55
+ else {
56
+ const origElement = elementsInUnit[0]?.original;
57
+ const latestElement = elementsInUnit[0]?.latest;
58
+ if (origElement &&
59
+ latestElement &&
60
+ isPropertyEditable(latestElement, property)) {
61
+ const [cx, cy] = [
62
+ origElement.x + origElement.width / 2,
63
+ origElement.y + origElement.height / 2,
64
+ ];
65
+ const [topLeftX, topLeftY] = rotate(origElement.x, origElement.y, cx, cy, origElement.angle);
66
+ const newTopLeftX = property === "x" ? nextValue : topLeftX;
67
+ const newTopLeftY = property === "y" ? nextValue : topLeftY;
68
+ moveElement(newTopLeftX, newTopLeftY, origElement, elementsMap, elements, scene, originalElementsMap, false);
69
+ }
70
+ }
71
+ }
72
+ scene.triggerUpdate();
73
+ return;
74
+ }
75
+ const change = shouldChangeByStepSize
76
+ ? getStepSizedValue(accumulatedChange, STEP_SIZE)
77
+ : accumulatedChange;
78
+ const changeInTopX = property === "x" ? change : 0;
79
+ const changeInTopY = property === "y" ? change : 0;
80
+ moveElements(property, changeInTopX, changeInTopY, originalElements, originalElements, elementsMap, originalElementsMap, scene);
81
+ scene.triggerUpdate();
82
+ };
83
+ const MultiPosition = ({ property, elements, elementsMap, atomicUnits, scene, appState, }) => {
42
84
  const positions = useMemo(() => atomicUnits.map((atomicUnit) => {
43
85
  const elementsInUnit = Object.keys(atomicUnit)
44
86
  .map((id) => elementsMap.get(id))
@@ -54,44 +96,6 @@ const MultiPosition = ({ property, elements, elementsMap, atomicUnits, scene, })
54
96
  return Math.round((property === "x" ? topLeftX : topLeftY) * 100) / 100;
55
97
  }), [atomicUnits, elementsMap, property]);
56
98
  const value = new Set(positions).size === 1 ? positions[0] : "Mixed";
57
- const handlePositionChange = ({ accumulatedChange, originalElements, originalElementsMap, shouldChangeByStepSize, nextValue, }) => {
58
- if (nextValue !== undefined) {
59
- for (const atomicUnit of atomicUnits) {
60
- const elementsInUnit = getElementsInAtomicUnit(atomicUnit, elementsMap, originalElementsMap);
61
- if (elementsInUnit.length > 1) {
62
- const [x1, y1, ,] = getCommonBounds(elementsInUnit.map((el) => el.latest));
63
- const newTopLeftX = property === "x" ? nextValue : x1;
64
- const newTopLeftY = property === "y" ? nextValue : y1;
65
- moveGroupTo(newTopLeftX, newTopLeftY, elementsInUnit.map((el) => el.latest), elementsInUnit.map((el) => el.original), elementsMap, originalElementsMap);
66
- }
67
- else {
68
- const origElement = elementsInUnit[0]?.original;
69
- const latestElement = elementsInUnit[0]?.latest;
70
- if (origElement &&
71
- latestElement &&
72
- isPropertyEditable(latestElement, property)) {
73
- const [cx, cy] = [
74
- origElement.x + origElement.width / 2,
75
- origElement.y + origElement.height / 2,
76
- ];
77
- const [topLeftX, topLeftY] = rotate(origElement.x, origElement.y, cx, cy, origElement.angle);
78
- const newTopLeftX = property === "x" ? nextValue : topLeftX;
79
- const newTopLeftY = property === "y" ? nextValue : topLeftY;
80
- moveElement(newTopLeftX, newTopLeftY, latestElement, origElement, elementsMap, originalElementsMap, false);
81
- }
82
- }
83
- }
84
- scene.triggerUpdate();
85
- return;
86
- }
87
- const change = shouldChangeByStepSize
88
- ? getStepSizedValue(accumulatedChange, STEP_SIZE)
89
- : accumulatedChange;
90
- const changeInTopX = property === "x" ? change : 0;
91
- const changeInTopY = property === "y" ? change : 0;
92
- moveElements(property, changeInTopX, changeInTopY, elements, originalElements, elementsMap, originalElementsMap);
93
- scene.triggerUpdate();
94
- };
95
- return (_jsx(StatsDragInput, { label: property === "x" ? "X" : "Y", elements: elements, dragInputCallback: handlePositionChange, value: value }));
99
+ return (_jsx(StatsDragInput, { label: property === "x" ? "X" : "Y", elements: elements, dragInputCallback: handlePositionChange, value: value, property: property, scene: scene, appState: appState }));
96
100
  };
97
101
  export default MultiPosition;
@@ -1,9 +1,13 @@
1
1
  /// <reference types="react" />
2
2
  import type { ElementsMap, ExcalidrawElement } from "../../element/types";
3
+ import type Scene from "../../scene/Scene";
4
+ import type { AppState } from "../../types";
3
5
  interface PositionProps {
4
6
  property: "x" | "y";
5
7
  element: ExcalidrawElement;
6
8
  elementsMap: ElementsMap;
9
+ scene: Scene;
10
+ appState: AppState;
7
11
  }
8
- declare const Position: ({ property, element, elementsMap }: PositionProps) => JSX.Element;
12
+ declare const Position: ({ property, element, elementsMap, scene, appState, }: PositionProps) => JSX.Element;
9
13
  export default Position;
@@ -3,36 +3,38 @@ import { rotate } from "../../math";
3
3
  import StatsDragInput from "./DragInput";
4
4
  import { getStepSizedValue, moveElement } from "./utils";
5
5
  const STEP_SIZE = 10;
6
- const Position = ({ property, element, elementsMap }) => {
6
+ const handlePositionChange = ({ accumulatedChange, originalElements, originalElementsMap, shouldChangeByStepSize, nextValue, property, scene, }) => {
7
+ const elementsMap = scene.getNonDeletedElementsMap();
8
+ const elements = scene.getNonDeletedElements();
9
+ const origElement = originalElements[0];
10
+ const [cx, cy] = [
11
+ origElement.x + origElement.width / 2,
12
+ origElement.y + origElement.height / 2,
13
+ ];
14
+ const [topLeftX, topLeftY] = rotate(origElement.x, origElement.y, cx, cy, origElement.angle);
15
+ if (nextValue !== undefined) {
16
+ const newTopLeftX = property === "x" ? nextValue : topLeftX;
17
+ const newTopLeftY = property === "y" ? nextValue : topLeftY;
18
+ moveElement(newTopLeftX, newTopLeftY, origElement, elementsMap, elements, scene, originalElementsMap);
19
+ return;
20
+ }
21
+ const changeInTopX = property === "x" ? accumulatedChange : 0;
22
+ const changeInTopY = property === "y" ? accumulatedChange : 0;
23
+ const newTopLeftX = property === "x"
24
+ ? Math.round(shouldChangeByStepSize
25
+ ? getStepSizedValue(origElement.x + changeInTopX, STEP_SIZE)
26
+ : topLeftX + changeInTopX)
27
+ : topLeftX;
28
+ const newTopLeftY = property === "y"
29
+ ? Math.round(shouldChangeByStepSize
30
+ ? getStepSizedValue(origElement.y + changeInTopY, STEP_SIZE)
31
+ : topLeftY + changeInTopY)
32
+ : topLeftY;
33
+ moveElement(newTopLeftX, newTopLeftY, origElement, elementsMap, elements, scene, originalElementsMap);
34
+ };
35
+ const Position = ({ property, element, elementsMap, scene, appState, }) => {
7
36
  const [topLeftX, topLeftY] = rotate(element.x, element.y, element.x + element.width / 2, element.y + element.height / 2, element.angle);
8
37
  const value = Math.round((property === "x" ? topLeftX : topLeftY) * 100) / 100;
9
- const handlePositionChange = ({ accumulatedChange, originalElements, originalElementsMap, shouldChangeByStepSize, nextValue, }) => {
10
- const origElement = originalElements[0];
11
- const [cx, cy] = [
12
- origElement.x + origElement.width / 2,
13
- origElement.y + origElement.height / 2,
14
- ];
15
- const [topLeftX, topLeftY] = rotate(origElement.x, origElement.y, cx, cy, origElement.angle);
16
- if (nextValue !== undefined) {
17
- const newTopLeftX = property === "x" ? nextValue : topLeftX;
18
- const newTopLeftY = property === "y" ? nextValue : topLeftY;
19
- moveElement(newTopLeftX, newTopLeftY, element, origElement, elementsMap, originalElementsMap);
20
- return;
21
- }
22
- const changeInTopX = property === "x" ? accumulatedChange : 0;
23
- const changeInTopY = property === "y" ? accumulatedChange : 0;
24
- const newTopLeftX = property === "x"
25
- ? Math.round(shouldChangeByStepSize
26
- ? getStepSizedValue(origElement.x + changeInTopX, STEP_SIZE)
27
- : topLeftX + changeInTopX)
28
- : topLeftX;
29
- const newTopLeftY = property === "y"
30
- ? Math.round(shouldChangeByStepSize
31
- ? getStepSizedValue(origElement.y + changeInTopY, STEP_SIZE)
32
- : topLeftY + changeInTopY)
33
- : topLeftY;
34
- moveElement(newTopLeftX, newTopLeftY, element, origElement, elementsMap, originalElementsMap);
35
- };
36
- return (_jsx(StatsDragInput, { label: property === "x" ? "X" : "Y", elements: [element], dragInputCallback: handlePositionChange, value: value }));
38
+ return (_jsx(StatsDragInput, { label: property === "x" ? "X" : "Y", elements: [element], dragInputCallback: handlePositionChange, scene: scene, value: value, property: property, appState: appState }));
37
39
  };
38
40
  export default Position;
@@ -9,14 +9,16 @@ import Dimension from "./Dimension";
9
9
  import Angle from "./Angle";
10
10
  import FontSize from "./FontSize";
11
11
  import MultiDimension from "./MultiDimension";
12
- import { elementsAreInSameGroup, getElementsInGroup, getSelectedGroupIds, isInGroup, } from "../../groups";
12
+ import { elementsAreInSameGroup } from "../../groups";
13
13
  import MultiAngle from "./MultiAngle";
14
14
  import MultiFontSize from "./MultiFontSize";
15
15
  import Position from "./Position";
16
16
  import MultiPosition from "./MultiPosition";
17
17
  import Collapsible from "./Collapsible";
18
18
  import { useExcalidrawAppState, useExcalidrawSetAppState } from "../App";
19
+ import { getAtomicUnits } from "./utils";
19
20
  import { STATS_PANELS } from "../../constants";
21
+ import { isElbowArrow } from "../../element/typeChecks";
20
22
  const STATS_TIMEOUT = 50;
21
23
  export const Stats = (props) => {
22
24
  const appState = useExcalidrawAppState();
@@ -49,21 +51,7 @@ export const StatsInner = memo(({ scene, onClose, renderCustomStats, selectedEle
49
51
  }, [sceneNonce, elements, throttledSetSceneDimension]);
50
52
  useEffect(() => () => throttledSetSceneDimension.cancel(), [throttledSetSceneDimension]);
51
53
  const atomicUnits = useMemo(() => {
52
- const selectedGroupIds = getSelectedGroupIds(appState);
53
- const _atomicUnits = selectedGroupIds.map((gid) => {
54
- return getElementsInGroup(selectedElements, gid).reduce((acc, el) => {
55
- acc[el.id] = true;
56
- return acc;
57
- }, {});
58
- });
59
- selectedElements
60
- .filter((el) => !isInGroup(el))
61
- .forEach((el) => {
62
- _atomicUnits.push({
63
- [el.id]: true,
64
- });
65
- });
66
- return _atomicUnits;
54
+ return getAtomicUnits(selectedElements, appState);
67
55
  }, [selectedElements, appState]);
68
56
  return (_jsx("div", { className: "Stats", children: _jsxs(Island, { padding: 3, children: [_jsxs("div", { className: "title", children: [_jsx("h2", { children: t("stats.title") }), _jsx("div", { className: "close", onClick: onClose, children: CloseIcon })] }), _jsx(Collapsible, { label: _jsx("h3", { children: t("stats.generalStats") }), open: !!(appState.stats.panels & STATS_PANELS.generalStats), openTrigger: () => setAppState((state) => {
69
57
  return {
@@ -83,7 +71,7 @@ export const StatsInner = memo(({ scene, onClose, renderCustomStats, selectedEle
83
71
  panels: state.stats.panels ^ STATS_PANELS.elementProperties,
84
72
  },
85
73
  };
86
- }), children: [singleElement && (_jsxs("div", { className: "sectionContent", children: [_jsx("div", { className: "elementType", children: t(`element.${singleElement.type}`) }), _jsxs("div", { className: "statsItem", children: [_jsx(Position, { element: singleElement, property: "x", elementsMap: elementsMap }), _jsx(Position, { element: singleElement, property: "y", elementsMap: elementsMap }), _jsx(Dimension, { property: "width", element: singleElement, elementsMap: elementsMap }), _jsx(Dimension, { property: "height", element: singleElement, elementsMap: elementsMap }), _jsx(Angle, { element: singleElement, elementsMap: elementsMap }), singleElement.type === "text" && (_jsx(FontSize, { element: singleElement, elementsMap: elementsMap }))] })] })), multipleElements && (_jsxs("div", { className: "sectionContent", children: [elementsAreInSameGroup(multipleElements) && (_jsx("div", { className: "elementType", children: t("element.group") })), _jsxs("div", { className: "elementsCount", children: [_jsx("div", { children: t("stats.elements") }), _jsx("div", { children: selectedElements.length })] }), _jsxs("div", { className: "statsItem", children: [_jsx(MultiPosition, { property: "x", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene }), _jsx(MultiPosition, { property: "y", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene }), _jsx(MultiDimension, { property: "width", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene }), _jsx(MultiDimension, { property: "height", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene }), _jsx(MultiAngle, { elements: multipleElements, elementsMap: elementsMap, scene: scene }), _jsx(MultiFontSize, { elements: multipleElements, elementsMap: elementsMap, scene: scene })] })] }))] }) }))] }) }));
74
+ }), children: [singleElement && (_jsxs("div", { className: "sectionContent", children: [_jsx("div", { className: "elementType", children: t(`element.${singleElement.type}`) }), _jsxs("div", { className: "statsItem", children: [_jsx(Position, { element: singleElement, property: "x", elementsMap: elementsMap, scene: scene, appState: appState }), _jsx(Position, { element: singleElement, property: "y", elementsMap: elementsMap, scene: scene, appState: appState }), _jsx(Dimension, { property: "width", element: singleElement, scene: scene, appState: appState }), _jsx(Dimension, { property: "height", element: singleElement, scene: scene, appState: appState }), !isElbowArrow(singleElement) && (_jsx(Angle, { property: "angle", element: singleElement, scene: scene, appState: appState })), _jsx(FontSize, { property: "fontSize", element: singleElement, scene: scene, appState: appState })] })] })), multipleElements && (_jsxs("div", { className: "sectionContent", children: [elementsAreInSameGroup(multipleElements) && (_jsx("div", { className: "elementType", children: t("element.group") })), _jsxs("div", { className: "elementsCount", children: [_jsx("div", { children: t("stats.elements") }), _jsx("div", { children: selectedElements.length })] }), _jsxs("div", { className: "statsItem", children: [_jsx(MultiPosition, { property: "x", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene, appState: appState }), _jsx(MultiPosition, { property: "y", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene, appState: appState }), _jsx(MultiDimension, { property: "width", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene, appState: appState }), _jsx(MultiDimension, { property: "height", elements: multipleElements, elementsMap: elementsMap, atomicUnits: atomicUnits, scene: scene, appState: appState }), _jsx(MultiAngle, { property: "angle", elements: multipleElements, scene: scene, appState: appState }), _jsx(MultiFontSize, { property: "fontSize", elements: multipleElements, scene: scene, appState: appState, elementsMap: elementsMap })] })] }))] }) }))] }) }));
87
75
  }, (prev, next) => {
88
76
  return (prev.sceneNonce === next.sceneNonce &&
89
77
  prev.selectedElements === next.selectedElements &&
@@ -1,4 +1,7 @@
1
- import type { ElementsMap, ExcalidrawElement, NonDeletedExcalidrawElement } from "../../element/types";
1
+ import type { ElementsMap, ExcalidrawElement, NonDeletedExcalidrawElement, NonDeletedSceneElementsMap } from "../../element/types";
2
+ import type Scene from "../../scene/Scene";
3
+ import type { AppState } from "../../types";
4
+ export type StatsInputProperty = "x" | "y" | "width" | "height" | "angle" | "fontSize";
2
5
  export declare const SMALLEST_DELTA = 0.01;
3
6
  export declare const isPropertyEditable: (element: ExcalidrawElement, property: keyof ExcalidrawElement) => boolean;
4
7
  export declare const getStepSizedValue: (value: number, stepSize: number) => number;
@@ -11,5 +14,13 @@ export declare const newOrigin: (x1: number, y1: number, w1: number, h1: number,
11
14
  x: number;
12
15
  y: number;
13
16
  };
14
- export declare const resizeElement: (nextWidth: number, nextHeight: number, keepAspectRatio: boolean, latestElement: ExcalidrawElement, origElement: ExcalidrawElement, elementsMap: ElementsMap, originalElementsMap: Map<string, ExcalidrawElement>, shouldInformMutation?: boolean) => void;
15
- export declare const moveElement: (newTopLeftX: number, newTopLeftY: number, latestElement: ExcalidrawElement, originalElement: ExcalidrawElement, elementsMap: ElementsMap, originalElementsMap: ElementsMap, shouldInformMutation?: boolean) => void;
17
+ export declare const resizeElement: (nextWidth: number, nextHeight: number, keepAspectRatio: boolean, origElement: ExcalidrawElement, elementsMap: NonDeletedSceneElementsMap, elements: readonly NonDeletedExcalidrawElement[], scene: Scene, shouldInformMutation?: boolean) => void;
18
+ export declare const moveElement: (newTopLeftX: number, newTopLeftY: number, originalElement: ExcalidrawElement, elementsMap: NonDeletedSceneElementsMap, elements: readonly NonDeletedExcalidrawElement[], scene: Scene, originalElementsMap: ElementsMap, shouldInformMutation?: boolean) => void;
19
+ export declare const getAtomicUnits: (targetElements: readonly ExcalidrawElement[], appState: AppState) => AtomicUnit[];
20
+ export declare const updateBindings: (latestElement: ExcalidrawElement, elementsMap: NonDeletedSceneElementsMap, elements: readonly NonDeletedExcalidrawElement[], scene: Scene, options?: {
21
+ simultaneouslyUpdated?: readonly ExcalidrawElement[];
22
+ newSize?: {
23
+ width: number;
24
+ height: number;
25
+ };
26
+ }) => void;
@@ -1,8 +1,9 @@
1
- import { updateBoundElements } from "../../element/binding";
1
+ import { bindOrUnbindLinearElements, updateBoundElements, } from "../../element/binding";
2
2
  import { mutateElement } from "../../element/mutateElement";
3
3
  import { measureFontSizeFromWidth, rescalePointsInElement, } from "../../element/resizeElements";
4
4
  import { getApproxMinLineHeight, getApproxMinLineWidth, getBoundTextElement, getBoundTextMaxWidth, handleBindTextResize, } from "../../element/textElement";
5
- import { isFrameLikeElement, isTextElement } from "../../element/typeChecks";
5
+ import { isFrameLikeElement, isLinearElement, isTextElement, } from "../../element/typeChecks";
6
+ import { getSelectedGroupIds, getElementsInGroup, isInGroup, } from "../../groups";
6
7
  import { rotate } from "../../math";
7
8
  import { getFontString } from "../../utils";
8
9
  export const SMALLEST_DELTA = 0.01;
@@ -54,7 +55,11 @@ export const newOrigin = (x1, y1, w1, h1, w2, h2, angle) => {
54
55
  ((h2 - h1) / 2) * Math.cos(angle),
55
56
  };
56
57
  };
57
- export const resizeElement = (nextWidth, nextHeight, keepAspectRatio, latestElement, origElement, elementsMap, originalElementsMap, shouldInformMutation = true) => {
58
+ export const resizeElement = (nextWidth, nextHeight, keepAspectRatio, origElement, elementsMap, elements, scene, shouldInformMutation = true) => {
59
+ const latestElement = elementsMap.get(origElement.id);
60
+ if (!latestElement) {
61
+ return;
62
+ }
58
63
  let boundTextFont = {};
59
64
  const boundTextElement = getBoundTextElement(latestElement, elementsMap);
60
65
  if (boundTextElement) {
@@ -63,12 +68,19 @@ export const resizeElement = (nextWidth, nextHeight, keepAspectRatio, latestElem
63
68
  nextWidth = Math.max(nextWidth, minWidth);
64
69
  nextHeight = Math.max(nextHeight, minHeight);
65
70
  }
71
+ const { width: oldWidth, height: oldHeight } = latestElement;
66
72
  mutateElement(latestElement, {
67
73
  ...newOrigin(latestElement.x, latestElement.y, latestElement.width, latestElement.height, nextWidth, nextHeight, latestElement.angle),
68
74
  width: nextWidth,
69
75
  height: nextHeight,
70
76
  ...rescalePointsInElement(origElement, nextWidth, nextHeight, true),
71
77
  }, shouldInformMutation);
78
+ updateBindings(latestElement, elementsMap, elements, scene, {
79
+ newSize: {
80
+ width: nextWidth,
81
+ height: nextHeight,
82
+ },
83
+ });
72
84
  if (boundTextElement) {
73
85
  boundTextFont = {
74
86
  fontSize: boundTextElement.fontSize,
@@ -85,11 +97,8 @@ export const resizeElement = (nextWidth, nextHeight, keepAspectRatio, latestElem
85
97
  };
86
98
  }
87
99
  }
88
- updateBoundElements(latestElement, elementsMap, {
89
- newSize: {
90
- width: nextWidth,
91
- height: nextHeight,
92
- },
100
+ updateBoundElements(latestElement, elementsMap, scene, {
101
+ oldSize: { width: oldWidth, height: oldHeight },
93
102
  });
94
103
  if (boundTextElement && boundTextFont) {
95
104
  mutateElement(boundTextElement, {
@@ -98,7 +107,11 @@ export const resizeElement = (nextWidth, nextHeight, keepAspectRatio, latestElem
98
107
  }
99
108
  handleBindTextResize(latestElement, elementsMap, "e", keepAspectRatio);
100
109
  };
101
- export const moveElement = (newTopLeftX, newTopLeftY, latestElement, originalElement, elementsMap, originalElementsMap, shouldInformMutation = true) => {
110
+ export const moveElement = (newTopLeftX, newTopLeftY, originalElement, elementsMap, elements, scene, originalElementsMap, shouldInformMutation = true) => {
111
+ const latestElement = elementsMap.get(originalElement.id);
112
+ if (!latestElement) {
113
+ return;
114
+ }
102
115
  const [cx, cy] = [
103
116
  originalElement.x + originalElement.width / 2,
104
117
  originalElement.y + originalElement.height / 2,
@@ -111,6 +124,7 @@ export const moveElement = (newTopLeftX, newTopLeftY, latestElement, originalEle
111
124
  x,
112
125
  y,
113
126
  }, shouldInformMutation);
127
+ updateBindings(latestElement, elementsMap, elements, scene);
114
128
  const boundTextElement = getBoundTextElement(originalElement, originalElementsMap);
115
129
  if (boundTextElement) {
116
130
  const latestBoundTextElement = elementsMap.get(boundTextElement.id);
@@ -121,3 +135,28 @@ export const moveElement = (newTopLeftX, newTopLeftY, latestElement, originalEle
121
135
  }, shouldInformMutation);
122
136
  }
123
137
  };
138
+ export const getAtomicUnits = (targetElements, appState) => {
139
+ const selectedGroupIds = getSelectedGroupIds(appState);
140
+ const _atomicUnits = selectedGroupIds.map((gid) => {
141
+ return getElementsInGroup(targetElements, gid).reduce((acc, el) => {
142
+ acc[el.id] = true;
143
+ return acc;
144
+ }, {});
145
+ });
146
+ targetElements
147
+ .filter((el) => !isInGroup(el))
148
+ .forEach((el) => {
149
+ _atomicUnits.push({
150
+ [el.id]: true,
151
+ });
152
+ });
153
+ return _atomicUnits;
154
+ };
155
+ export const updateBindings = (latestElement, elementsMap, elements, scene, options) => {
156
+ if (isLinearElement(latestElement)) {
157
+ bindOrUnbindLinearElements([latestElement], elementsMap, elements, scene, true, []);
158
+ }
159
+ else {
160
+ updateBoundElements(latestElement, elementsMap, scene, options);
161
+ }
162
+ };
@@ -1,12 +1,12 @@
1
1
  /// <reference types="react" />
2
- import type { MermaidOptions } from "@excalidraw/mermaid-to-excalidraw";
2
+ import type { MermaidConfig } from "@excalidraw/mermaid-to-excalidraw";
3
3
  import type { MermaidToExcalidrawResult } from "@excalidraw/mermaid-to-excalidraw/dist/interfaces";
4
4
  import type { NonDeletedExcalidrawElement } from "../../element/types";
5
5
  import type { AppClassProperties, BinaryFiles } from "../../types";
6
6
  export interface MermaidToExcalidrawLibProps {
7
7
  loaded: boolean;
8
8
  api: Promise<{
9
- parseMermaidToExcalidraw: (definition: string, options: MermaidOptions) => Promise<MermaidToExcalidrawResult>;
9
+ parseMermaidToExcalidraw: (definition: string, config?: MermaidConfig) => Promise<MermaidToExcalidrawResult>;
10
10
  }>;
11
11
  }
12
12
  interface ConvertMermaidToExcalidrawFormatProps {
@@ -1,4 +1,4 @@
1
- import { DEFAULT_EXPORT_PADDING, DEFAULT_FONT_SIZE, EDITOR_LS_KEYS, } from "../../constants";
1
+ import { DEFAULT_EXPORT_PADDING, EDITOR_LS_KEYS } from "../../constants";
2
2
  import { convertToExcalidrawElements, exportToCanvas } from "../../index";
3
3
  import { canvasToBlob } from "../../data/blob";
4
4
  import { EditorLocalStorage } from "../../data/EditorLocalStorage";
@@ -30,14 +30,10 @@ export const convertMermaidToExcalidraw = async ({ canvasRef, mermaidToExcalidra
30
30
  const api = await mermaidToExcalidrawLib.api;
31
31
  let ret;
32
32
  try {
33
- ret = await api.parseMermaidToExcalidraw(mermaidDefinition, {
34
- fontSize: DEFAULT_FONT_SIZE,
35
- });
33
+ ret = await api.parseMermaidToExcalidraw(mermaidDefinition);
36
34
  }
37
35
  catch (err) {
38
- ret = await api.parseMermaidToExcalidraw(mermaidDefinition.replace(/"/g, "'"), {
39
- fontSize: DEFAULT_FONT_SIZE,
40
- });
36
+ ret = await api.parseMermaidToExcalidraw(mermaidDefinition.replace(/"/g, "'"));
41
37
  }
42
38
  const { elements, files } = ret;
43
39
  setError(null);
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import "./UserList.scss";
3
3
  import React, { useLayoutEffect } from "react";
4
4
  import clsx from "clsx";
@@ -6,13 +6,14 @@ import { Tooltip } from "./Tooltip";
6
6
  import { useExcalidrawActionManager } from "./App";
7
7
  import * as Popover from "@radix-ui/react-popover";
8
8
  import { Island } from "./Island";
9
- import { searchIcon } from "./icons";
9
+ import { QuickSearch } from "./QuickSearch";
10
10
  import { t } from "../i18n";
11
11
  import { isShallowEqual } from "../utils";
12
12
  import { supportsResizeObserver } from "../constants";
13
+ import { ScrollableList } from "./ScrollableList";
13
14
  const DEFAULT_MAX_AVATARS = 4;
14
15
  const SHOW_COLLABORATORS_FILTER_AT = 8;
15
- const ConditionalTooltipWrapper = ({ shouldWrap, children, username, }) => shouldWrap ? (_jsx(Tooltip, { label: username || "Unknown user", children: children })) : (_jsx(React.Fragment, { children: children }));
16
+ const ConditionalTooltipWrapper = ({ shouldWrap, children, username, }) => shouldWrap ? (_jsx(Tooltip, { label: username || "Unknown user", children: children })) : (_jsx(_Fragment, { children: children }));
16
17
  const renderCollaborator = ({ actionManager, collaborator, socketId, withName = false, shouldWrapWithTooltip = false, isBeingFollowed, }) => {
17
18
  const data = {
18
19
  socketId,
@@ -43,6 +44,7 @@ export const UserList = React.memo(({ className, mobile, collaborators, userToFo
43
44
  });
44
45
  const uniqueCollaboratorsArray = Array.from(uniqueCollaboratorsMap.values()).filter((collaborator) => collaborator.username?.trim());
45
46
  const [searchTerm, setSearchTerm] = React.useState("");
47
+ const filteredCollaborators = uniqueCollaboratorsArray.filter((collaborator) => collaborator.username?.toLowerCase().includes(searchTerm));
46
48
  const userListWrapper = React.useRef(null);
47
49
  useLayoutEffect(() => {
48
50
  if (userListWrapper.current) {
@@ -67,10 +69,6 @@ export const UserList = React.memo(({ className, mobile, collaborators, userToFo
67
69
  }
68
70
  }, []);
69
71
  const [maxAvatars, setMaxAvatars] = React.useState(DEFAULT_MAX_AVATARS);
70
- const searchTermNormalized = searchTerm.trim().toLowerCase();
71
- const filteredCollaborators = searchTermNormalized
72
- ? uniqueCollaboratorsArray.filter((collaborator) => collaborator.username?.toLowerCase().includes(searchTerm))
73
- : uniqueCollaboratorsArray;
74
72
  const firstNCollaborators = uniqueCollaboratorsArray.slice(0, maxAvatars - 1);
75
73
  const firstNAvatarsJSX = firstNCollaborators.map((collaborator) => renderCollaborator({
76
74
  actionManager,
@@ -85,24 +83,26 @@ export const UserList = React.memo(({ className, mobile, collaborators, userToFo
85
83
  socketId: collaborator.socketId,
86
84
  shouldWrapWithTooltip: true,
87
85
  isBeingFollowed: collaborator.socketId === userToFollow,
88
- })) })) : (_jsx("div", { className: "UserList-wrapper", ref: userListWrapper, children: _jsxs("div", { className: clsx("UserList", className), style: { [`--max-avatars`]: maxAvatars }, children: [firstNAvatarsJSX, uniqueCollaboratorsArray.length > maxAvatars - 1 && (_jsxs(Popover.Root, { onOpenChange: (isOpen) => {
89
- if (!isOpen) {
90
- setSearchTerm("");
91
- }
92
- }, children: [_jsxs(Popover.Trigger, { className: "UserList__more", children: ["+", uniqueCollaboratorsArray.length - maxAvatars + 1] }), _jsx(Popover.Content, { style: {
86
+ })) })) : (_jsx("div", { className: "UserList__wrapper", ref: userListWrapper, children: _jsxs("div", { className: clsx("UserList", className), style: { [`--max-avatars`]: maxAvatars }, children: [firstNAvatarsJSX, uniqueCollaboratorsArray.length > maxAvatars - 1 && (_jsxs(Popover.Root, { children: [_jsxs(Popover.Trigger, { className: "UserList__more", children: ["+", uniqueCollaboratorsArray.length - maxAvatars + 1] }), _jsx(Popover.Content, { style: {
93
87
  zIndex: 2,
94
88
  width: "15rem",
95
89
  textAlign: "left",
96
- }, align: "end", sideOffset: 10, children: _jsxs(Island, { style: { overflow: "hidden" }, children: [uniqueCollaboratorsArray.length >=
97
- SHOW_COLLABORATORS_FILTER_AT && (_jsxs("div", { className: "UserList__search-wrapper", children: [searchIcon, _jsx("input", { className: "UserList__search", type: "text", placeholder: t("userList.search.placeholder"), value: searchTerm, onChange: (e) => {
98
- setSearchTerm(e.target.value);
99
- } })] })), _jsxs("div", { className: "dropdown-menu UserList__collaborators", children: [filteredCollaborators.length === 0 && (_jsx("div", { className: "UserList__collaborators__empty", children: t("userList.search.empty") })), _jsx("div", { className: "UserList__hint", children: t("userList.hint.text") }), filteredCollaborators.map((collaborator) => renderCollaborator({
100
- actionManager,
101
- collaborator,
102
- socketId: collaborator.socketId,
103
- withName: true,
104
- isBeingFollowed: collaborator.socketId === userToFollow,
105
- }))] })] }) })] }))] }) }));
90
+ }, align: "end", sideOffset: 10, children: _jsxs(Island, { padding: 2, children: [uniqueCollaboratorsArray.length >=
91
+ SHOW_COLLABORATORS_FILTER_AT && (_jsx(QuickSearch, { placeholder: t("quickSearch.placeholder"), onChange: setSearchTerm })), _jsx(ScrollableList, { className: "dropdown-menu UserList__collaborators", placeholder: t("userList.empty"), children: filteredCollaborators.length > 0
92
+ ? [
93
+ _jsx("div", { className: "hint", children: t("userList.hint.text") }),
94
+ filteredCollaborators.map((collaborator) => renderCollaborator({
95
+ actionManager,
96
+ collaborator,
97
+ socketId: collaborator.socketId,
98
+ withName: true,
99
+ isBeingFollowed: collaborator.socketId === userToFollow,
100
+ })),
101
+ ]
102
+ : [] }), _jsx(Popover.Arrow, { width: 20, height: 10, style: {
103
+ fill: "var(--popup-bg-color)",
104
+ filter: "drop-shadow(rgba(0, 0, 0, 0.05) 0px 3px 2px)",
105
+ } })] }) })] }))] }) }));
106
106
  }, (prev, next) => {
107
107
  if (prev.collaborators.size !== next.collaborators.size ||
108
108
  prev.mobile !== next.mobile ||
@@ -68,6 +68,7 @@ const getRelevantAppStateProps = (appState) => ({
68
68
  selectedElementIds: appState.selectedElementIds,
69
69
  frameToHighlight: appState.frameToHighlight,
70
70
  editingGroupId: appState.editingGroupId,
71
+ currentHoveredFontFamily: appState.currentHoveredFontFamily,
71
72
  });
72
73
  const areEqual = (prevProps, nextProps) => {
73
74
  if (prevProps.sceneNonce !== nextProps.sceneNonce ||
@@ -25,17 +25,26 @@ declare const DropdownMenu: {
25
25
  displayName: string;
26
26
  };
27
27
  Item: {
28
- ({ icon, onSelect, children, shortcut, className, selected, ...rest }: {
28
+ ({ icon, value, order, children, shortcut, className, hovered, selected, textStyle, onSelect, onClick, ...rest }: {
29
29
  icon?: JSX.Element | undefined;
30
- onSelect: (event: Event) => void;
30
+ value?: string | number | undefined;
31
+ order?: number | undefined;
32
+ onSelect?: ((event: Event) => void) | undefined;
31
33
  children: React.ReactNode;
32
34
  shortcut?: string | undefined;
35
+ hovered?: boolean | undefined;
33
36
  selected?: boolean | undefined;
37
+ textStyle?: React.CSSProperties | undefined;
34
38
  className?: string | undefined;
35
39
  } & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onSelect">): JSX.Element;
36
40
  displayName: string;
37
41
  Badge: {
38
- ({ children, }: {
42
+ ({ type, children, }: {
43
+ type?: import("../../utility-types").ValueOf<{
44
+ readonly GREEN: "green";
45
+ readonly RED: "red";
46
+ readonly BLUE: "blue";
47
+ }> | undefined;
39
48
  children: React.ReactNode;
40
49
  }): JSX.Element;
41
50
  displayName: string;
@@ -1,23 +1,43 @@
1
1
  import React from "react";
2
+ import type { ValueOf } from "../../utility-types";
2
3
  declare const DropdownMenuItem: {
3
- ({ icon, onSelect, children, shortcut, className, selected, ...rest }: {
4
+ ({ icon, value, order, children, shortcut, className, hovered, selected, textStyle, onSelect, onClick, ...rest }: {
4
5
  icon?: JSX.Element | undefined;
5
- onSelect: (event: Event) => void;
6
+ value?: string | number | undefined;
7
+ order?: number | undefined;
8
+ onSelect?: ((event: Event) => void) | undefined;
6
9
  children: React.ReactNode;
7
10
  shortcut?: string | undefined;
11
+ hovered?: boolean | undefined;
8
12
  selected?: boolean | undefined;
13
+ textStyle?: React.CSSProperties | undefined;
9
14
  className?: string | undefined;
10
15
  } & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onSelect">): JSX.Element;
11
16
  displayName: string;
12
17
  Badge: {
13
- ({ children, }: {
18
+ ({ type, children, }: {
19
+ type?: ValueOf<{
20
+ readonly GREEN: "green";
21
+ readonly RED: "red";
22
+ readonly BLUE: "blue";
23
+ }> | undefined;
14
24
  children: React.ReactNode;
15
25
  }): JSX.Element;
16
26
  displayName: string;
17
27
  };
18
28
  };
29
+ export declare const DropDownMenuItemBadgeType: {
30
+ readonly GREEN: "green";
31
+ readonly RED: "red";
32
+ readonly BLUE: "blue";
33
+ };
19
34
  export declare const DropDownMenuItemBadge: {
20
- ({ children, }: {
35
+ ({ type, children, }: {
36
+ type?: ValueOf<{
37
+ readonly GREEN: "green";
38
+ readonly RED: "red";
39
+ readonly BLUE: "blue";
40
+ }> | undefined;
21
41
  children: React.ReactNode;
22
42
  }): JSX.Element;
23
43
  displayName: string;