@excalidraw/excalidraw 0.17.1-1d71f84 → 0.17.1-1ed53b1

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 (426) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-ACFH36JV.js → blockDiagram-91b80b7a-H47FTXHA.js} +5 -5
  3. package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-QZ27YR47.js → c4Diagram-b2a90758-NNJK6GKC.js} +3 -3
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-HO2HMSK7.js → chunk-4KQVEBHW.js} +3 -3
  5. package/dist/browser/dev/excalidraw-assets-dev/{chunk-USGV265L.js → chunk-53YI56GV.js} +4 -4
  6. package/dist/browser/dev/excalidraw-assets-dev/{chunk-EDFX3S7X.js → chunk-A2WCJI4I.js} +3 -3
  7. package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js → chunk-EFLPX7NE.js} +6 -6
  8. package/dist/browser/dev/excalidraw-assets-dev/{chunk-AK7SWNLN.js → chunk-JKPJV7MZ.js} +6 -4
  9. package/dist/browser/dev/excalidraw-assets-dev/chunk-JKPJV7MZ.js.map +7 -0
  10. package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js → chunk-JYIQCNWV.js} +2 -2
  11. package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js → chunk-LVIQQW6F.js} +2 -2
  12. package/dist/browser/dev/excalidraw-assets-dev/{chunk-RWZVJAQU.js → chunk-OKAZAA6U.js} +4494 -2647
  13. package/dist/browser/dev/excalidraw-assets-dev/chunk-OKAZAA6U.js.map +7 -0
  14. package/dist/browser/dev/excalidraw-assets-dev/{chunk-6U7GQNJT.js → chunk-PXLO3FOU.js} +2 -2
  15. package/dist/browser/dev/excalidraw-assets-dev/{chunk-7DACDEY3.js → chunk-TO2AW5PW.js} +2 -2
  16. package/dist/browser/dev/excalidraw-assets-dev/{chunk-NJ77ZFNJ.js → chunk-VURILHLY.js} +2 -2
  17. package/dist/browser/dev/excalidraw-assets-dev/{chunk-2T2GU7NF.js → chunk-ZAYGSUHF.js} +2 -2
  18. package/dist/browser/dev/excalidraw-assets-dev/{chunk-Z3PH3V2B.js → chunk-ZQR5ML6Y.js} +26 -26
  19. package/dist/browser/dev/excalidraw-assets-dev/chunk-ZQR5ML6Y.js.map +7 -0
  20. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-QSLMH4JW.js → classDiagram-30eddba6-CUYIJICN.js} +5 -5
  21. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-DY4DYQ5P.js → classDiagram-v2-f2df5561-K6WW6K73.js} +8 -8
  22. package/dist/browser/dev/excalidraw-assets-dev/{dist-Z46EOVOL.js → dist-ITJNUBZF.js} +2 -2
  23. package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js → en-BF4XUPIZ.js} +2 -2
  24. package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-SOOJRTCB.js → erDiagram-47591fe2-XGAD7EEP.js} +4 -4
  25. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-AHGL4KPK.js → flowDiagram-5540d9b9-B6EOVNNO.js} +9 -9
  26. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-56LDZZWY.js → flowDiagram-v2-3b53844e-NUG24FJH.js} +9 -9
  27. package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-27LUKRI6.js → flowchart-elk-definition-5fe447d6-25Y7PCBL.js} +5 -5
  28. package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-EHGYGNG6.js → ganttDiagram-9a3bba1f-GNL6ZDTC.js} +2 -2
  29. package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-AJQNBDW5.js → gitGraphDiagram-96e6b4ee-HNW52NVO.js} +2 -2
  30. package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js → image-LVS32KQQ.js} +2 -2
  31. package/dist/browser/dev/excalidraw-assets-dev/{image-OFRRV5MB.css → image-O66MQ7WQ.css} +1 -1
  32. package/dist/browser/dev/excalidraw-assets-dev/image-O66MQ7WQ.css.map +7 -0
  33. package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-SWLLQVES.js → infoDiagram-bcd20f53-FWEUVFLT.js} +2 -2
  34. package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-7UAVCWOZ.js → journeyDiagram-4fe6b3dc-RZIUI7UG.js} +3 -3
  35. package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-SROW5KGM.js → mindmap-definition-f354de21-GBVN45GU.js} +3 -3
  36. package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-QKCI6NCB.js → pieDiagram-79897490-ECENNII6.js} +2 -2
  37. package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-LNYJZFC5.js → quadrantDiagram-62f64e94-ZMEOFVNL.js} +2 -2
  38. package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZZD7ZHFA.js → requirementDiagram-05bf5f74-FHZSFHCR.js} +4 -4
  39. package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-L75ZZ4UM.js → sankeyDiagram-97764748-VDKIKTA6.js} +2 -2
  40. package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-6PCU7TDK.js → sequenceDiagram-acc0e65c-6JUSPVKX.js} +3 -3
  41. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-WM76WOPR.js → stateDiagram-0ff1cf1a-L3AKWENF.js} +5 -5
  42. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-N4HZW3O2.js → stateDiagram-v2-9a9d610d-NU3GGMCH.js} +8 -8
  43. package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-ZHGCAXGP.js → timeline-definition-fea2a41d-JGP7XCHW.js} +2 -2
  44. package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-2DLOVRAZ.js → xychartDiagram-ab372869-HLFHHF2I.js} +3 -3
  45. package/dist/browser/dev/index.css +72 -28
  46. package/dist/browser/dev/index.css.map +3 -3
  47. package/dist/browser/dev/index.js +2064 -1830
  48. package/dist/browser/dev/index.js.map +4 -4
  49. package/dist/browser/prod/excalidraw-assets/{blockDiagram-91b80b7a-ONPS22AM.js → blockDiagram-91b80b7a-FVCRVGN5.js} +1 -1
  50. package/dist/browser/prod/excalidraw-assets/{c4Diagram-b2a90758-XMIQY7ZT.js → c4Diagram-b2a90758-56CXO7GA.js} +1 -1
  51. package/dist/browser/prod/excalidraw-assets/{chunk-GCHQBOKV.js → chunk-635MQ3CK.js} +1 -1
  52. package/dist/browser/prod/excalidraw-assets/{chunk-P5M3G2RP.js → chunk-AIKXYJX3.js} +1 -1
  53. package/dist/browser/prod/excalidraw-assets/{chunk-E2YLWFZX.js → chunk-CR7VMNWC.js} +1 -1
  54. package/dist/browser/prod/excalidraw-assets/{chunk-WEYK4A2L.js → chunk-FFF2CSVG.js} +1 -1
  55. package/dist/browser/prod/excalidraw-assets/{chunk-R3HAIP6R.js → chunk-G4WDCSPE.js} +1 -1
  56. package/dist/browser/prod/excalidraw-assets/{chunk-HFOXJM22.js → chunk-HKZSHFLX.js} +1 -1
  57. package/dist/browser/prod/excalidraw-assets/{chunk-XIMFFJTE.js → chunk-IKCDYWMW.js} +1 -1
  58. package/dist/browser/prod/excalidraw-assets/{chunk-AHLLBBVJ.js → chunk-L5DS24G6.js} +1 -1
  59. package/dist/browser/prod/excalidraw-assets/{chunk-CQJF3C6G.js → chunk-MUNOKHUD.js} +1 -1
  60. package/dist/browser/prod/excalidraw-assets/{chunk-CTYINSWT.js → chunk-O4AI3NNG.js} +2 -2
  61. package/dist/browser/prod/excalidraw-assets/{chunk-NI6SYCUG.js → chunk-QOQYOOQ4.js} +1 -1
  62. package/dist/browser/prod/excalidraw-assets/chunk-SXBDZOS3.js +55 -0
  63. package/dist/browser/prod/excalidraw-assets/{chunk-I2PZFXTK.js → chunk-ZTIWFPBM.js} +21 -21
  64. package/dist/browser/prod/excalidraw-assets/{classDiagram-30eddba6-IEJXXCVX.js → classDiagram-30eddba6-BCUTAUMD.js} +1 -1
  65. package/dist/browser/prod/excalidraw-assets/{classDiagram-v2-f2df5561-7LZDSWOS.js → classDiagram-v2-f2df5561-6SOXSGQ2.js} +1 -1
  66. package/dist/browser/prod/excalidraw-assets/{dist-PIPZXALV.js → dist-54276HPL.js} +1 -1
  67. package/dist/browser/prod/excalidraw-assets/{en-LROPV2RN.js → en-N7CLNF6C.js} +1 -1
  68. package/dist/browser/prod/excalidraw-assets/{erDiagram-47591fe2-E5V666CF.js → erDiagram-47591fe2-RE6HB7RM.js} +1 -1
  69. package/dist/browser/prod/excalidraw-assets/{flowDiagram-5540d9b9-GMBRCYVF.js → flowDiagram-5540d9b9-ZNJZBERW.js} +1 -1
  70. package/dist/browser/prod/excalidraw-assets/{flowDiagram-v2-3b53844e-Z4HUWP6B.js → flowDiagram-v2-3b53844e-LY44JLQJ.js} +1 -1
  71. package/dist/browser/prod/excalidraw-assets/{flowchart-elk-definition-5fe447d6-5ZCYTX5N.js → flowchart-elk-definition-5fe447d6-TMTJ6Z7O.js} +1 -1
  72. package/dist/browser/prod/excalidraw-assets/{ganttDiagram-9a3bba1f-WM32OMT5.js → ganttDiagram-9a3bba1f-5O6EA6LX.js} +1 -1
  73. package/dist/browser/prod/excalidraw-assets/{gitGraphDiagram-96e6b4ee-CAKZ2U6E.js → gitGraphDiagram-96e6b4ee-UHYNM5DI.js} +1 -1
  74. package/dist/browser/prod/excalidraw-assets/image-VAGBVQ3G.js +1 -0
  75. package/dist/browser/prod/excalidraw-assets/{infoDiagram-bcd20f53-MUIKXGC4.js → infoDiagram-bcd20f53-BP77NQEH.js} +1 -1
  76. package/dist/browser/prod/excalidraw-assets/{journeyDiagram-4fe6b3dc-NYRV4HK2.js → journeyDiagram-4fe6b3dc-XMGKCMES.js} +1 -1
  77. package/dist/browser/prod/excalidraw-assets/{mindmap-definition-f354de21-MY55DRSM.js → mindmap-definition-f354de21-ZQRRBRWF.js} +1 -1
  78. package/dist/browser/prod/excalidraw-assets/{pieDiagram-79897490-47L6J6L2.js → pieDiagram-79897490-IGXEC2KX.js} +1 -1
  79. package/dist/browser/prod/excalidraw-assets/{quadrantDiagram-62f64e94-DF5C2GDT.js → quadrantDiagram-62f64e94-WTHHDYJL.js} +1 -1
  80. package/dist/browser/prod/excalidraw-assets/{requirementDiagram-05bf5f74-C4IMUBDN.js → requirementDiagram-05bf5f74-MV4OFRVW.js} +1 -1
  81. package/dist/browser/prod/excalidraw-assets/{sankeyDiagram-97764748-YHW7EUST.js → sankeyDiagram-97764748-ZGYUHEJT.js} +1 -1
  82. package/dist/browser/prod/excalidraw-assets/{sequenceDiagram-acc0e65c-H3XEHT32.js → sequenceDiagram-acc0e65c-IBSENK6W.js} +1 -1
  83. package/dist/browser/prod/excalidraw-assets/{stateDiagram-0ff1cf1a-Z5WB6Q3P.js → stateDiagram-0ff1cf1a-DB73XNZH.js} +1 -1
  84. package/dist/browser/prod/excalidraw-assets/{stateDiagram-v2-9a9d610d-T7OZETQC.js → stateDiagram-v2-9a9d610d-2OOBUPNR.js} +1 -1
  85. package/dist/browser/prod/excalidraw-assets/{timeline-definition-fea2a41d-VVC22BWF.js → timeline-definition-fea2a41d-P3NQQVDU.js} +1 -1
  86. package/dist/browser/prod/excalidraw-assets/{xychartDiagram-ab372869-JAXODQF7.js → xychartDiagram-ab372869-HI3XLK3Y.js} +1 -1
  87. package/dist/browser/prod/index.css +1 -1
  88. package/dist/browser/prod/index.js +24 -24
  89. package/dist/dev/{en-II4GK66F.json → en-UQDDYCH7.json} +5 -3
  90. package/dist/dev/index.css +72 -28
  91. package/dist/dev/index.css.map +3 -3
  92. package/dist/dev/index.js +5352 -3354
  93. package/dist/dev/index.js.map +4 -4
  94. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +4 -4
  95. package/dist/excalidraw/actions/actionAddToLibrary.js +4 -3
  96. package/dist/excalidraw/actions/actionAlign.d.ts +22 -22
  97. package/dist/excalidraw/actions/actionAlign.js +7 -6
  98. package/dist/excalidraw/actions/actionBoundText.d.ts +10 -10
  99. package/dist/excalidraw/actions/actionBoundText.js +8 -4
  100. package/dist/excalidraw/actions/actionCanvas.d.ts +52 -52
  101. package/dist/excalidraw/actions/actionCanvas.js +19 -14
  102. package/dist/excalidraw/actions/actionClipboard.d.ts +24 -24
  103. package/dist/excalidraw/actions/actionClipboard.js +14 -13
  104. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +10 -10
  105. package/dist/excalidraw/actions/actionDeleteSelected.js +6 -3
  106. package/dist/excalidraw/actions/actionDistribute.d.ts +10 -10
  107. package/dist/excalidraw/actions/actionDistribute.js +3 -2
  108. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +7 -8
  109. package/dist/excalidraw/actions/actionDuplicateSelection.js +7 -3
  110. package/dist/excalidraw/actions/actionElementLock.d.ts +9 -9
  111. package/dist/excalidraw/actions/actionElementLock.js +3 -2
  112. package/dist/excalidraw/actions/actionExport.d.ts +33 -33
  113. package/dist/excalidraw/actions/actionExport.js +15 -11
  114. package/dist/excalidraw/actions/actionFinalize.d.ts +9 -9
  115. package/dist/excalidraw/actions/actionFinalize.js +9 -5
  116. package/dist/excalidraw/actions/actionFlip.d.ts +10 -10
  117. package/dist/excalidraw/actions/actionFlip.js +12 -12
  118. package/dist/excalidraw/actions/actionFrame.d.ts +16 -171
  119. package/dist/excalidraw/actions/actionFrame.js +7 -6
  120. package/dist/excalidraw/actions/actionGroup.d.ts +12 -322
  121. package/dist/excalidraw/actions/actionGroup.js +9 -11
  122. package/dist/excalidraw/actions/actionHistory.d.ts +4 -3
  123. package/dist/excalidraw/actions/actionHistory.js +27 -28
  124. package/dist/excalidraw/actions/actionLinearEditor.d.ts +6 -4
  125. package/dist/excalidraw/actions/actionLinearEditor.js +21 -5
  126. package/dist/excalidraw/actions/actionLink.d.ts +5 -5
  127. package/dist/excalidraw/actions/actionLink.js +2 -1
  128. package/dist/excalidraw/actions/actionMenu.d.ts +8 -8
  129. package/dist/excalidraw/actions/actionMenu.js +4 -3
  130. package/dist/excalidraw/actions/actionNavigate.d.ts +4 -4
  131. package/dist/excalidraw/actions/actionNavigate.js +3 -2
  132. package/dist/excalidraw/actions/actionProperties.d.ts +34 -34
  133. package/dist/excalidraw/actions/actionProperties.js +18 -13
  134. package/dist/excalidraw/actions/actionSelectAll.d.ts +5 -5
  135. package/dist/excalidraw/actions/actionSelectAll.js +2 -1
  136. package/dist/excalidraw/actions/actionStyles.d.ts +9 -12
  137. package/dist/excalidraw/actions/actionStyles.js +4 -3
  138. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +7 -5
  139. package/dist/excalidraw/actions/actionToggleGridMode.js +6 -2
  140. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +4 -4
  141. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.js +2 -1
  142. package/dist/excalidraw/actions/actionToggleStats.d.ts +4 -4
  143. package/dist/excalidraw/actions/actionToggleStats.js +2 -1
  144. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +4 -4
  145. package/dist/excalidraw/actions/actionToggleViewMode.js +2 -1
  146. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +4 -4
  147. package/dist/excalidraw/actions/actionToggleZenMode.js +2 -1
  148. package/dist/excalidraw/actions/actionZindex.d.ts +23 -19
  149. package/dist/excalidraw/actions/actionZindex.js +9 -4
  150. package/dist/excalidraw/actions/manager.d.ts +5 -5
  151. package/dist/excalidraw/actions/register.d.ts +1 -1
  152. package/dist/excalidraw/actions/shortcuts.d.ts +2 -2
  153. package/dist/excalidraw/actions/shortcuts.js +1 -1
  154. package/dist/excalidraw/actions/types.d.ts +7 -7
  155. package/dist/excalidraw/align.d.ts +1 -1
  156. package/dist/excalidraw/analytics.js +1 -1
  157. package/dist/excalidraw/animated-trail.d.ts +2 -2
  158. package/dist/excalidraw/appState.d.ts +5 -5
  159. package/dist/excalidraw/change.d.ts +191 -0
  160. package/dist/excalidraw/change.js +894 -0
  161. package/dist/excalidraw/charts.d.ts +1 -1
  162. package/dist/excalidraw/clients.d.ts +2 -2
  163. package/dist/excalidraw/clients.js +1 -1
  164. package/dist/excalidraw/clipboard.d.ts +3 -3
  165. package/dist/excalidraw/colors.d.ts +1 -1
  166. package/dist/excalidraw/components/Actions.d.ts +3 -3
  167. package/dist/excalidraw/components/Actions.js +8 -5
  168. package/dist/excalidraw/components/App.d.ts +27 -13
  169. package/dist/excalidraw/components/App.js +362 -157
  170. package/dist/excalidraw/components/ColorPicker/ColorInput.d.ts +1 -1
  171. package/dist/excalidraw/components/ColorPicker/ColorInput.js +1 -1
  172. package/dist/excalidraw/components/ColorPicker/ColorPicker.d.ts +4 -4
  173. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +1 -1
  174. package/dist/excalidraw/components/ColorPicker/Picker.d.ts +3 -3
  175. package/dist/excalidraw/components/ColorPicker/PickerColorList.d.ts +1 -1
  176. package/dist/excalidraw/components/ColorPicker/PickerHeading.d.ts +1 -1
  177. package/dist/excalidraw/components/ColorPicker/ShadeList.d.ts +1 -1
  178. package/dist/excalidraw/components/ColorPicker/TopPicks.d.ts +1 -1
  179. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +2 -2
  180. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.js +1 -1
  181. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -2
  182. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.js +1 -1
  183. package/dist/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -1
  184. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +28 -13
  185. package/dist/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -1
  186. package/dist/excalidraw/components/CommandPalette/types.d.ts +3 -3
  187. package/dist/excalidraw/components/ConfirmDialog.d.ts +1 -1
  188. package/dist/excalidraw/components/ContextMenu.d.ts +2 -2
  189. package/dist/excalidraw/components/ContextMenu.js +1 -1
  190. package/dist/excalidraw/components/DarkModeToggle.d.ts +1 -1
  191. package/dist/excalidraw/components/DarkModeToggle.js +3 -1
  192. package/dist/excalidraw/components/DefaultSidebar.d.ts +2 -2
  193. package/dist/excalidraw/components/DialogActionButton.d.ts +1 -1
  194. package/dist/excalidraw/components/EyeDropper.d.ts +2 -2
  195. package/dist/excalidraw/components/FollowMode/FollowMode.d.ts +1 -1
  196. package/dist/excalidraw/components/HelpDialog.js +8 -6
  197. package/dist/excalidraw/components/HintViewer.d.ts +1 -1
  198. package/dist/excalidraw/components/ImageExportDialog.d.ts +1 -1
  199. package/dist/excalidraw/components/InitializeApp.d.ts +2 -2
  200. package/dist/excalidraw/components/JSONExportDialog.d.ts +3 -3
  201. package/dist/excalidraw/components/LayerUI.d.ts +4 -4
  202. package/dist/excalidraw/components/LibraryMenu.d.ts +2 -2
  203. package/dist/excalidraw/components/LibraryMenuBrowseButton.d.ts +1 -1
  204. package/dist/excalidraw/components/LibraryMenuControlButtons.d.ts +1 -1
  205. package/dist/excalidraw/components/LibraryMenuHeaderContent.d.ts +2 -2
  206. package/dist/excalidraw/components/LibraryMenuItems.d.ts +1 -1
  207. package/dist/excalidraw/components/LibraryMenuSection.d.ts +5 -4
  208. package/dist/excalidraw/components/LibraryUnit.d.ts +2 -2
  209. package/dist/excalidraw/components/LoadingMessage.d.ts +1 -1
  210. package/dist/excalidraw/components/MagicSettings.js +2 -2
  211. package/dist/excalidraw/components/MobileMenu.d.ts +3 -3
  212. package/dist/excalidraw/components/Modal.d.ts +1 -1
  213. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  214. package/dist/excalidraw/components/PasteChartDialog.d.ts +1 -1
  215. package/dist/excalidraw/components/PublishLibrary.d.ts +1 -1
  216. package/dist/excalidraw/components/RadioGroup.d.ts +2 -1
  217. package/dist/excalidraw/components/RadioGroup.js +1 -1
  218. package/dist/excalidraw/components/SVGLayer.d.ts +1 -1
  219. package/dist/excalidraw/components/Sidebar/Sidebar.d.ts +2 -2
  220. package/dist/excalidraw/components/Sidebar/Sidebar.js +1 -1
  221. package/dist/excalidraw/components/Sidebar/SidebarTab.d.ts +1 -1
  222. package/dist/excalidraw/components/Sidebar/SidebarTabTrigger.d.ts +1 -1
  223. package/dist/excalidraw/components/Sidebar/SidebarTrigger.d.ts +1 -1
  224. package/dist/excalidraw/components/Sidebar/common.d.ts +1 -1
  225. package/dist/excalidraw/components/Stack.d.ts +2 -2
  226. package/dist/excalidraw/components/Stats.d.ts +2 -2
  227. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +1 -1
  228. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.js +6 -2
  229. package/dist/excalidraw/components/TTDDialog/TTDDialog.js +2 -2
  230. package/dist/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +1 -1
  231. package/dist/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +1 -1
  232. package/dist/excalidraw/components/TTDDialog/TTDDialogPanels.d.ts +1 -1
  233. package/dist/excalidraw/components/TTDDialog/TTDDialogTabs.d.ts +1 -1
  234. package/dist/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -1
  235. package/dist/excalidraw/components/TTDDialog/common.d.ts +4 -4
  236. package/dist/excalidraw/components/TextField.d.ts +1 -1
  237. package/dist/excalidraw/components/Toast.d.ts +1 -1
  238. package/dist/excalidraw/components/ToolButton.d.ts +4 -2
  239. package/dist/excalidraw/components/ToolButton.js +1 -1
  240. package/dist/excalidraw/components/Trans.d.ts +1 -1
  241. package/dist/excalidraw/components/UserList.d.ts +1 -1
  242. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +2 -1
  243. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +1 -0
  244. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  245. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +2 -2
  246. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +18 -0
  247. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.js +9 -0
  248. package/dist/excalidraw/components/footer/Footer.d.ts +2 -2
  249. package/dist/excalidraw/components/hyperlink/Hyperlink.d.ts +2 -2
  250. package/dist/excalidraw/components/hyperlink/Hyperlink.js +3 -3
  251. package/dist/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  252. package/dist/excalidraw/components/hyperlink/helpers.js +2 -3
  253. package/dist/excalidraw/components/icons.d.ts +6 -1
  254. package/dist/excalidraw/components/icons.js +19 -5
  255. package/dist/excalidraw/components/main-menu/DefaultItems.d.ts +12 -2
  256. package/dist/excalidraw/components/main-menu/DefaultItems.js +38 -7
  257. package/dist/excalidraw/constants.d.ts +5 -5
  258. package/dist/excalidraw/constants.js +6 -3
  259. package/dist/excalidraw/context/ui-appState.d.ts +1 -1
  260. package/dist/excalidraw/cursor.d.ts +1 -1
  261. package/dist/excalidraw/data/EditorLocalStorage.d.ts +2 -2
  262. package/dist/excalidraw/data/blob.d.ts +5 -5
  263. package/dist/excalidraw/data/filesystem.d.ts +2 -1
  264. package/dist/excalidraw/data/index.d.ts +4 -4
  265. package/dist/excalidraw/data/json.d.ts +3 -3
  266. package/dist/excalidraw/data/library.d.ts +3 -3
  267. package/dist/excalidraw/data/magic.d.ts +3 -3
  268. package/dist/excalidraw/data/magic.js +2 -1
  269. package/dist/excalidraw/data/reconcile.d.ts +6 -0
  270. package/dist/excalidraw/data/reconcile.js +49 -0
  271. package/dist/excalidraw/data/resave.d.ts +2 -2
  272. package/dist/excalidraw/data/restore.d.ts +5 -5
  273. package/dist/excalidraw/data/restore.js +6 -7
  274. package/dist/excalidraw/data/transform.d.ts +4 -4
  275. package/dist/excalidraw/data/transform.js +12 -3
  276. package/dist/excalidraw/data/types.d.ts +3 -3
  277. package/dist/excalidraw/data/url.d.ts +1 -0
  278. package/dist/excalidraw/data/url.js +4 -1
  279. package/dist/excalidraw/element/ElementCanvasButtons.d.ts +1 -1
  280. package/dist/excalidraw/element/binding.d.ts +50 -9
  281. package/dist/excalidraw/element/binding.js +712 -155
  282. package/dist/excalidraw/element/bounds.d.ts +3 -4
  283. package/dist/excalidraw/element/bounds.js +0 -3
  284. package/dist/excalidraw/element/collision.d.ts +14 -19
  285. package/dist/excalidraw/element/collision.js +36 -713
  286. package/dist/excalidraw/element/containerCache.d.ts +1 -1
  287. package/dist/excalidraw/element/dragElements.d.ts +3 -3
  288. package/dist/excalidraw/element/embeddable.d.ts +9 -6
  289. package/dist/excalidraw/element/embeddable.js +98 -62
  290. package/dist/excalidraw/element/image.d.ts +2 -2
  291. package/dist/excalidraw/element/index.d.ts +1 -2
  292. package/dist/excalidraw/element/index.js +0 -1
  293. package/dist/excalidraw/element/linearElementEditor.d.ts +12 -12
  294. package/dist/excalidraw/element/linearElementEditor.js +7 -5
  295. package/dist/excalidraw/element/mutateElement.d.ts +3 -4
  296. package/dist/excalidraw/element/newElement.d.ts +4 -4
  297. package/dist/excalidraw/element/newElement.js +2 -1
  298. package/dist/excalidraw/element/resizeElements.d.ts +4 -4
  299. package/dist/excalidraw/element/resizeElements.js +110 -86
  300. package/dist/excalidraw/element/resizeTest.d.ts +7 -7
  301. package/dist/excalidraw/element/resizeTest.js +55 -8
  302. package/dist/excalidraw/element/showSelectedShapeActions.d.ts +2 -2
  303. package/dist/excalidraw/element/sizeHelpers.d.ts +2 -2
  304. package/dist/excalidraw/element/sizeHelpers.js +3 -0
  305. package/dist/excalidraw/element/sortElements.d.ts +1 -1
  306. package/dist/excalidraw/element/textElement.d.ts +5 -6
  307. package/dist/excalidraw/element/textElement.js +5 -34
  308. package/dist/excalidraw/element/textWysiwyg.d.ts +2 -2
  309. package/dist/excalidraw/element/transformHandles.d.ts +24 -6
  310. package/dist/excalidraw/element/transformHandles.js +24 -3
  311. package/dist/excalidraw/element/typeChecks.d.ts +4 -4
  312. package/dist/excalidraw/element/types.d.ts +26 -10
  313. package/dist/excalidraw/emitter.d.ts +1 -1
  314. package/dist/excalidraw/errors.d.ts +3 -0
  315. package/dist/excalidraw/errors.js +3 -0
  316. package/dist/excalidraw/fractionalIndex.d.ts +40 -0
  317. package/dist/excalidraw/fractionalIndex.js +241 -0
  318. package/dist/excalidraw/frame.d.ts +4 -4
  319. package/dist/excalidraw/gatransforms.d.ts +1 -1
  320. package/dist/excalidraw/gesture.d.ts +1 -1
  321. package/dist/excalidraw/groups.d.ts +5 -3
  322. package/dist/excalidraw/groups.js +17 -0
  323. package/dist/excalidraw/history.d.ts +35 -47
  324. package/dist/excalidraw/history.js +100 -167
  325. package/dist/excalidraw/hooks/useCreatePortalContainer.js +2 -1
  326. package/dist/excalidraw/hooks/useEmitter.d.ts +2 -0
  327. package/dist/excalidraw/hooks/useEmitter.js +13 -0
  328. package/dist/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  329. package/dist/excalidraw/i18n.d.ts +1 -1
  330. package/dist/excalidraw/index.d.ts +3 -1
  331. package/dist/excalidraw/index.js +2 -0
  332. package/dist/excalidraw/jotai.d.ts +1 -1
  333. package/dist/excalidraw/laser-trails.d.ts +3 -2
  334. package/dist/excalidraw/locales/en.json +5 -3
  335. package/dist/excalidraw/math.d.ts +2 -2
  336. package/dist/excalidraw/points.d.ts +1 -1
  337. package/dist/excalidraw/queue.d.ts +1 -1
  338. package/dist/excalidraw/renderer/helpers.d.ts +2 -2
  339. package/dist/excalidraw/renderer/helpers.js +2 -2
  340. package/dist/excalidraw/renderer/interactiveScene.d.ts +2 -2
  341. package/dist/excalidraw/renderer/interactiveScene.js +8 -7
  342. package/dist/excalidraw/renderer/renderElement.d.ts +3 -3
  343. package/dist/excalidraw/renderer/renderElement.js +5 -5
  344. package/dist/excalidraw/renderer/renderSnaps.d.ts +1 -1
  345. package/dist/excalidraw/renderer/renderSnaps.js +2 -1
  346. package/dist/excalidraw/renderer/staticScene.d.ts +1 -1
  347. package/dist/excalidraw/renderer/staticScene.js +14 -3
  348. package/dist/excalidraw/renderer/staticSvgScene.d.ts +4 -4
  349. package/dist/excalidraw/renderer/staticSvgScene.js +10 -0
  350. package/dist/excalidraw/scene/Fonts.d.ts +1 -1
  351. package/dist/excalidraw/scene/Renderer.d.ts +3 -3
  352. package/dist/excalidraw/scene/Scene.d.ts +9 -8
  353. package/dist/excalidraw/scene/Scene.js +31 -16
  354. package/dist/excalidraw/scene/Shape.d.ts +1 -1
  355. package/dist/excalidraw/scene/ShapeCache.d.ts +4 -4
  356. package/dist/excalidraw/scene/comparisons.d.ts +2 -2
  357. package/dist/excalidraw/scene/export.d.ts +2 -2
  358. package/dist/excalidraw/scene/export.js +5 -4
  359. package/dist/excalidraw/scene/scroll.d.ts +2 -2
  360. package/dist/excalidraw/scene/scrollbars.d.ts +3 -3
  361. package/dist/excalidraw/scene/selection.d.ts +2 -2
  362. package/dist/excalidraw/scene/types.d.ts +5 -4
  363. package/dist/excalidraw/scene/zoom.d.ts +1 -1
  364. package/dist/excalidraw/snapping.d.ts +4 -4
  365. package/dist/excalidraw/store.d.ts +99 -0
  366. package/dist/excalidraw/store.js +269 -0
  367. package/dist/excalidraw/types.d.ts +33 -19
  368. package/dist/excalidraw/utils.d.ts +11 -4
  369. package/dist/excalidraw/utils.js +8 -0
  370. package/dist/excalidraw/zindex.d.ts +4 -4
  371. package/dist/excalidraw/zindex.js +9 -13
  372. package/dist/prod/{en-II4GK66F.json → en-UQDDYCH7.json} +5 -3
  373. package/dist/prod/index.css +1 -1
  374. package/dist/prod/index.js +44 -44
  375. package/dist/utils/bbox.d.ts +2 -2
  376. package/dist/utils/collision.d.ts +4 -0
  377. package/dist/utils/collision.js +48 -0
  378. package/dist/utils/export.d.ts +2 -2
  379. package/dist/utils/geometry/geometry.d.ts +71 -0
  380. package/dist/utils/geometry/geometry.js +674 -0
  381. package/dist/utils/geometry/shape.d.ts +56 -0
  382. package/dist/utils/geometry/shape.js +168 -0
  383. package/dist/utils/withinBounds.d.ts +1 -1
  384. package/history.ts +163 -218
  385. package/package.json +2 -1
  386. package/dist/browser/dev/excalidraw-assets-dev/chunk-AK7SWNLN.js.map +0 -7
  387. package/dist/browser/dev/excalidraw-assets-dev/chunk-RWZVJAQU.js.map +0 -7
  388. package/dist/browser/dev/excalidraw-assets-dev/chunk-Z3PH3V2B.js.map +0 -7
  389. package/dist/browser/dev/excalidraw-assets-dev/image-OFRRV5MB.css.map +0 -7
  390. package/dist/browser/prod/excalidraw-assets/chunk-LL4GORAM.js +0 -55
  391. package/dist/browser/prod/excalidraw-assets/image-EFCJDJH3.js +0 -1
  392. /package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-ACFH36JV.js.map → blockDiagram-91b80b7a-H47FTXHA.js.map} +0 -0
  393. /package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-QZ27YR47.js.map → c4Diagram-b2a90758-NNJK6GKC.js.map} +0 -0
  394. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-HO2HMSK7.js.map → chunk-4KQVEBHW.js.map} +0 -0
  395. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-USGV265L.js.map → chunk-53YI56GV.js.map} +0 -0
  396. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-EDFX3S7X.js.map → chunk-A2WCJI4I.js.map} +0 -0
  397. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js.map → chunk-EFLPX7NE.js.map} +0 -0
  398. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js.map → chunk-JYIQCNWV.js.map} +0 -0
  399. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js.map → chunk-LVIQQW6F.js.map} +0 -0
  400. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-6U7GQNJT.js.map → chunk-PXLO3FOU.js.map} +0 -0
  401. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-7DACDEY3.js.map → chunk-TO2AW5PW.js.map} +0 -0
  402. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-NJ77ZFNJ.js.map → chunk-VURILHLY.js.map} +0 -0
  403. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-2T2GU7NF.js.map → chunk-ZAYGSUHF.js.map} +0 -0
  404. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-QSLMH4JW.js.map → classDiagram-30eddba6-CUYIJICN.js.map} +0 -0
  405. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-DY4DYQ5P.js.map → classDiagram-v2-f2df5561-K6WW6K73.js.map} +0 -0
  406. /package/dist/browser/dev/excalidraw-assets-dev/{dist-Z46EOVOL.js.map → dist-ITJNUBZF.js.map} +0 -0
  407. /package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js.map → en-BF4XUPIZ.js.map} +0 -0
  408. /package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-SOOJRTCB.js.map → erDiagram-47591fe2-XGAD7EEP.js.map} +0 -0
  409. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-AHGL4KPK.js.map → flowDiagram-5540d9b9-B6EOVNNO.js.map} +0 -0
  410. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-56LDZZWY.js.map → flowDiagram-v2-3b53844e-NUG24FJH.js.map} +0 -0
  411. /package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-27LUKRI6.js.map → flowchart-elk-definition-5fe447d6-25Y7PCBL.js.map} +0 -0
  412. /package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-EHGYGNG6.js.map → ganttDiagram-9a3bba1f-GNL6ZDTC.js.map} +0 -0
  413. /package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-AJQNBDW5.js.map → gitGraphDiagram-96e6b4ee-HNW52NVO.js.map} +0 -0
  414. /package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js.map → image-LVS32KQQ.js.map} +0 -0
  415. /package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-SWLLQVES.js.map → infoDiagram-bcd20f53-FWEUVFLT.js.map} +0 -0
  416. /package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-7UAVCWOZ.js.map → journeyDiagram-4fe6b3dc-RZIUI7UG.js.map} +0 -0
  417. /package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-SROW5KGM.js.map → mindmap-definition-f354de21-GBVN45GU.js.map} +0 -0
  418. /package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-QKCI6NCB.js.map → pieDiagram-79897490-ECENNII6.js.map} +0 -0
  419. /package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-LNYJZFC5.js.map → quadrantDiagram-62f64e94-ZMEOFVNL.js.map} +0 -0
  420. /package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZZD7ZHFA.js.map → requirementDiagram-05bf5f74-FHZSFHCR.js.map} +0 -0
  421. /package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-L75ZZ4UM.js.map → sankeyDiagram-97764748-VDKIKTA6.js.map} +0 -0
  422. /package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-6PCU7TDK.js.map → sequenceDiagram-acc0e65c-6JUSPVKX.js.map} +0 -0
  423. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-WM76WOPR.js.map → stateDiagram-0ff1cf1a-L3AKWENF.js.map} +0 -0
  424. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-N4HZW3O2.js.map → stateDiagram-v2-9a9d610d-NU3GGMCH.js.map} +0 -0
  425. /package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-ZHGCAXGP.js.map → timeline-definition-fea2a41d-JGP7XCHW.js.map} +0 -0
  426. /package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-2DLOVRAZ.js.map → xychartDiagram-ab372869-HLFHHF2I.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { MIN_FONT_SIZE, SHIFT_LOCKING_ANGLE } from "../constants";
2
2
  import { rescalePoints } from "../points";
3
- import { rotate, adjustXYWithRotation, centerPoint, rotatePoint, } from "../math";
4
- import { getElementAbsoluteCoords, getCommonBounds, getResizedElementAbsoluteCoords, getCommonBoundingBox, getElementPointsCoords, } from "./bounds";
3
+ import { rotate, centerPoint, rotatePoint } from "../math";
4
+ import { getElementAbsoluteCoords, getCommonBounds, getResizedElementAbsoluteCoords, getCommonBoundingBox, } from "./bounds";
5
5
  import { isArrowElement, isBoundToContainer, isFrameLikeElement, isFreeDrawElement, isImageElement, isLinearElement, isTextElement, } from "./typeChecks";
6
6
  import { mutateElement } from "./mutateElement";
7
7
  import { getFontString } from "../utils";
@@ -9,6 +9,7 @@ import { updateBoundElements } from "./binding";
9
9
  import Scene from "../scene/Scene";
10
10
  import { getApproxMinLineWidth, getBoundTextElement, getBoundTextElementId, getContainerElement, handleBindTextResize, getBoundTextMaxWidth, getApproxMinLineHeight, } from "./textElement";
11
11
  import { LinearElementEditor } from "./linearElementEditor";
12
+ import { isInGroup } from "../groups";
12
13
  export const normalizeAngle = (angle) => {
13
14
  if (angle < 0) {
14
15
  return angle + 2 * Math.PI;
@@ -44,11 +45,8 @@ export const transformElements = (originalElements, transformHandleType, selecte
44
45
  rotateMultipleElements(originalElements, selectedElements, elementsMap, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY);
45
46
  return true;
46
47
  }
47
- else if (transformHandleType === "nw" ||
48
- transformHandleType === "ne" ||
49
- transformHandleType === "sw" ||
50
- transformHandleType === "se") {
51
- resizeMultipleElements(originalElements, selectedElements, elementsMap, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);
48
+ else if (transformHandleType) {
49
+ resizeMultipleElements(originalElements, selectedElements, elementsMap, transformHandleType, shouldResizeFromCenter, shouldMaintainAspectRatio, pointerX, pointerY);
52
50
  return true;
53
51
  }
54
52
  }
@@ -102,39 +100,25 @@ const measureFontSizeFromWidth = (element, elementsMap, nextWidth) => {
102
100
  size: nextFontSize,
103
101
  };
104
102
  };
105
- const getSidesForTransformHandle = (transformHandleType, shouldResizeFromCenter) => {
106
- return {
107
- n: /^(n|ne|nw)$/.test(transformHandleType) ||
108
- (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),
109
- s: /^(s|se|sw)$/.test(transformHandleType) ||
110
- (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),
111
- w: /^(w|nw|sw)$/.test(transformHandleType) ||
112
- (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),
113
- e: /^(e|ne|se)$/.test(transformHandleType) ||
114
- (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),
115
- };
116
- };
117
103
  const resizeSingleTextElement = (element, elementsMap, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {
118
- const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
119
- const cx = (x1 + x2) / 2;
120
- const cy = (y1 + y2) / 2;
104
+ const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element, elementsMap);
121
105
  // rotation pointer with reverse angle
122
106
  const [rotatedX, rotatedY] = rotate(pointerX, pointerY, cx, cy, -element.angle);
123
- let scale;
124
- switch (transformHandleType) {
125
- case "se":
126
- scale = Math.max((rotatedX - x1) / (x2 - x1), (rotatedY - y1) / (y2 - y1));
127
- break;
128
- case "nw":
129
- scale = Math.max((x2 - rotatedX) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));
130
- break;
131
- case "ne":
132
- scale = Math.max((rotatedX - x1) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));
133
- break;
134
- case "sw":
135
- scale = Math.max((x2 - rotatedX) / (x2 - x1), (rotatedY - y1) / (y2 - y1));
136
- break;
107
+ let scaleX = 0;
108
+ let scaleY = 0;
109
+ if (transformHandleType.includes("e")) {
110
+ scaleX = (rotatedX - x1) / (x2 - x1);
111
+ }
112
+ if (transformHandleType.includes("w")) {
113
+ scaleX = (x2 - rotatedX) / (x2 - x1);
114
+ }
115
+ if (transformHandleType.includes("n")) {
116
+ scaleY = (y2 - rotatedY) / (y2 - y1);
137
117
  }
118
+ if (transformHandleType.includes("s")) {
119
+ scaleY = (rotatedY - y1) / (y2 - y1);
120
+ }
121
+ const scale = Math.max(scaleX, scaleY);
138
122
  if (scale > 0) {
139
123
  const nextWidth = element.width * scale;
140
124
  const nextHeight = element.height * scale;
@@ -142,18 +126,49 @@ const resizeSingleTextElement = (element, elementsMap, transformHandleType, shou
142
126
  if (metrics === null) {
143
127
  return;
144
128
  }
145
- const [nextX1, nextY1, nextX2, nextY2] = getResizedElementAbsoluteCoords(element, nextWidth, nextHeight, false);
146
- const deltaX1 = (x1 - nextX1) / 2;
147
- const deltaY1 = (y1 - nextY1) / 2;
148
- const deltaX2 = (x2 - nextX2) / 2;
149
- const deltaY2 = (y2 - nextY2) / 2;
150
- const [nextElementX, nextElementY] = adjustXYWithRotation(getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter), element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);
129
+ const startTopLeft = [x1, y1];
130
+ const startBottomRight = [x2, y2];
131
+ const startCenter = [cx, cy];
132
+ let newTopLeft = [x1, y1];
133
+ if (["n", "w", "nw"].includes(transformHandleType)) {
134
+ newTopLeft = [
135
+ startBottomRight[0] - Math.abs(nextWidth),
136
+ startBottomRight[1] - Math.abs(nextHeight),
137
+ ];
138
+ }
139
+ if (transformHandleType === "ne") {
140
+ const bottomLeft = [startTopLeft[0], startBottomRight[1]];
141
+ newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(nextHeight)];
142
+ }
143
+ if (transformHandleType === "sw") {
144
+ const topRight = [startBottomRight[0], startTopLeft[1]];
145
+ newTopLeft = [topRight[0] - Math.abs(nextWidth), topRight[1]];
146
+ }
147
+ if (["s", "n"].includes(transformHandleType)) {
148
+ newTopLeft[0] = startCenter[0] - nextWidth / 2;
149
+ }
150
+ if (["e", "w"].includes(transformHandleType)) {
151
+ newTopLeft[1] = startCenter[1] - nextHeight / 2;
152
+ }
153
+ if (shouldResizeFromCenter) {
154
+ newTopLeft[0] = startCenter[0] - Math.abs(nextWidth) / 2;
155
+ newTopLeft[1] = startCenter[1] - Math.abs(nextHeight) / 2;
156
+ }
157
+ const angle = element.angle;
158
+ const rotatedTopLeft = rotatePoint(newTopLeft, [cx, cy], angle);
159
+ const newCenter = [
160
+ newTopLeft[0] + Math.abs(nextWidth) / 2,
161
+ newTopLeft[1] + Math.abs(nextHeight) / 2,
162
+ ];
163
+ const rotatedNewCenter = rotatePoint(newCenter, [cx, cy], angle);
164
+ newTopLeft = rotatePoint(rotatedTopLeft, rotatedNewCenter, -angle);
165
+ const [nextX, nextY] = newTopLeft;
151
166
  mutateElement(element, {
152
167
  fontSize: metrics.size,
153
168
  width: nextWidth,
154
169
  height: nextHeight,
155
- x: nextElementX,
156
- y: nextElementY,
170
+ x: nextX,
171
+ y: nextY,
157
172
  });
158
173
  }
159
174
  };
@@ -364,7 +379,7 @@ export const resizeSingleElement = (originalElements, shouldMaintainAspectRatio,
364
379
  handleBindTextResize(element, elementsMap, transformHandleDirection, shouldMaintainAspectRatio);
365
380
  }
366
381
  };
367
- export const resizeMultipleElements = (originalElements, selectedElements, elementsMap, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {
382
+ export const resizeMultipleElements = (originalElements, selectedElements, elementsMap, transformHandleType, shouldResizeFromCenter, shouldMaintainAspectRatio, pointerX, pointerY) => {
368
383
  // map selected elements to the original elements. While it never should
369
384
  // happen that pointerDownState.originalElements won't contain the selected
370
385
  // elements during resize, this coupling isn't guaranteed, so to ensure
@@ -396,29 +411,54 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
396
411
  return [...acc, { ...text, ...xy }];
397
412
  }, []);
398
413
  const { minX, minY, maxX, maxY, midX, midY } = getCommonBoundingBox(targetElements.map(({ orig }) => orig).concat(boundTextElements));
399
- // const originalHeight = maxY - minY;
400
- // const originalWidth = maxX - minX;
414
+ const width = maxX - minX;
415
+ const height = maxY - minY;
401
416
  const direction = transformHandleType;
402
- const mapDirectionsToAnchors = {
417
+ const anchorsMap = {
403
418
  ne: [minX, maxY],
404
419
  se: [minX, minY],
405
420
  sw: [maxX, minY],
406
421
  nw: [maxX, maxY],
422
+ e: [minX, minY + height / 2],
423
+ w: [maxX, minY + height / 2],
424
+ n: [minX + width / 2, maxY],
425
+ s: [minX + width / 2, minY],
407
426
  };
408
427
  // anchor point must be on the opposite side of the dragged selection handle
409
428
  // or be the center of the selection if shouldResizeFromCenter
410
429
  const [anchorX, anchorY] = shouldResizeFromCenter
411
430
  ? [midX, midY]
412
- : mapDirectionsToAnchors[direction];
413
- const scale = Math.max(Math.abs(pointerX - anchorX) / (maxX - minX) || 0, Math.abs(pointerY - anchorY) / (maxY - minY) || 0) * (shouldResizeFromCenter ? 2 : 1);
431
+ : anchorsMap[direction];
432
+ const resizeFromCenterScale = shouldResizeFromCenter ? 2 : 1;
433
+ const scale = Math.max(Math.abs(pointerX - anchorX) / width || 0, Math.abs(pointerY - anchorY) / height || 0) * resizeFromCenterScale;
414
434
  if (scale === 0) {
415
435
  return;
416
436
  }
417
- const mapDirectionsToPointerPositions = {
418
- ne: [pointerX >= anchorX, pointerY <= anchorY],
419
- se: [pointerX >= anchorX, pointerY >= anchorY],
420
- sw: [pointerX <= anchorX, pointerY >= anchorY],
421
- nw: [pointerX <= anchorX, pointerY <= anchorY],
437
+ let scaleX = direction.includes("e") || direction.includes("w")
438
+ ? (Math.abs(pointerX - anchorX) / width) * resizeFromCenterScale
439
+ : 1;
440
+ let scaleY = direction.includes("n") || direction.includes("s")
441
+ ? (Math.abs(pointerY - anchorY) / height) * resizeFromCenterScale
442
+ : 1;
443
+ const keepAspectRatio = shouldMaintainAspectRatio ||
444
+ targetElements.some((item) => item.latest.angle !== 0 ||
445
+ isTextElement(item.latest) ||
446
+ isInGroup(item.latest));
447
+ if (keepAspectRatio) {
448
+ scaleX = scale;
449
+ scaleY = scale;
450
+ }
451
+ const flipConditionsMap = {
452
+ ne: [pointerX < anchorX, pointerY > anchorY],
453
+ se: [pointerX < anchorX, pointerY < anchorY],
454
+ sw: [pointerX > anchorX, pointerY < anchorY],
455
+ nw: [pointerX > anchorX, pointerY > anchorY],
456
+ // e.g. when resizing from the "e" side, we do not need to consider changes in the `y` direction
457
+ // and therefore, we do not need to flip in the `y` direction at all
458
+ e: [pointerX < anchorX, false],
459
+ w: [pointerX > anchorX, false],
460
+ n: [false, pointerY > anchorY],
461
+ s: [false, pointerY < anchorY],
422
462
  };
423
463
  /**
424
464
  * to flip an element:
@@ -428,7 +468,7 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
428
468
  * mirror points in the case of linear & freedraw elemenets
429
469
  * 3. adjust element angle
430
470
  */
431
- const [flipFactorX, flipFactorY] = mapDirectionsToPointerPositions[direction].map((condition) => (condition ? 1 : -1));
471
+ const [flipFactorX, flipFactorY] = flipConditionsMap[direction].map((condition) => (condition ? -1 : 1));
432
472
  const isFlippedByX = flipFactorX < 0;
433
473
  const isFlippedByY = flipFactorY < 0;
434
474
  const elementsAndUpdates = [];
@@ -437,16 +477,16 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
437
477
  if (isTextElement(orig) && isBoundToContainer(orig)) {
438
478
  continue;
439
479
  }
440
- const width = orig.width * scale;
441
- const height = orig.height * scale;
480
+ const width = orig.width * scaleX;
481
+ const height = orig.height * scaleY;
442
482
  const angle = normalizeAngle(orig.angle * flipFactorX * flipFactorY);
443
483
  const isLinearOrFreeDraw = isLinearElement(orig) || isFreeDrawElement(orig);
444
484
  const offsetX = orig.x - anchorX;
445
485
  const offsetY = orig.y - anchorY;
446
486
  const shiftX = isFlippedByX && !isLinearOrFreeDraw ? width : 0;
447
487
  const shiftY = isFlippedByY && !isLinearOrFreeDraw ? height : 0;
448
- const x = anchorX + flipFactorX * (offsetX * scale + shiftX);
449
- const y = anchorY + flipFactorY * (offsetY * scale + shiftY);
488
+ const x = anchorX + flipFactorX * (offsetX * scaleX + shiftX);
489
+ const y = anchorY + flipFactorY * (offsetY * scaleY + shiftY);
450
490
  const rescaledPoints = rescalePointsInElement(orig, width * flipFactorX, height * flipFactorY, false);
451
491
  const update = {
452
492
  x,
@@ -456,30 +496,9 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
456
496
  angle,
457
497
  ...rescaledPoints,
458
498
  };
459
- if (isImageElement(orig) && targetElements.length === 1) {
499
+ if (isImageElement(orig)) {
460
500
  update.scale = [orig.scale[0] * flipFactorX, orig.scale[1] * flipFactorY];
461
501
  }
462
- if (isLinearElement(orig) && (isFlippedByX || isFlippedByY)) {
463
- const origBounds = getElementPointsCoords(orig, orig.points);
464
- const newBounds = getElementPointsCoords({ ...orig, x, y }, rescaledPoints.points);
465
- const origXY = [orig.x, orig.y];
466
- const newXY = [x, y];
467
- const linearShift = (axis) => {
468
- const i = axis === "x" ? 0 : 1;
469
- return ((newBounds[i + 2] -
470
- newXY[i] -
471
- (origXY[i] - origBounds[i]) * scale +
472
- (origBounds[i + 2] - origXY[i]) * scale -
473
- (newXY[i] - newBounds[i])) /
474
- 2);
475
- };
476
- if (isFlippedByX) {
477
- update.x -= linearShift("x");
478
- }
479
- if (isFlippedByY) {
480
- update.y -= linearShift("y");
481
- }
482
- }
483
502
  if (isTextElement(orig)) {
484
503
  const metrics = measureFontSizeFromWidth(orig, elementsMap, width);
485
504
  if (!metrics) {
@@ -489,11 +508,16 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
489
508
  }
490
509
  const boundTextElement = originalElements.get(getBoundTextElementId(orig) ?? "");
491
510
  if (boundTextElement) {
492
- const newFontSize = boundTextElement.fontSize * scale;
493
- if (newFontSize < MIN_FONT_SIZE) {
494
- return;
511
+ if (keepAspectRatio) {
512
+ const newFontSize = boundTextElement.fontSize * scale;
513
+ if (newFontSize < MIN_FONT_SIZE) {
514
+ return;
515
+ }
516
+ update.boundTextFontSize = newFontSize;
517
+ }
518
+ else {
519
+ update.boundTextFontSize = boundTextElement.fontSize;
495
520
  }
496
- update.boundTextFontSize = newFontSize;
497
521
  }
498
522
  elementsAndUpdates.push({
499
523
  element: latest,
@@ -1,13 +1,13 @@
1
- import { ExcalidrawElement, PointerType, NonDeletedExcalidrawElement, ElementsMap } from "./types";
2
- import { MaybeTransformHandleType } from "./transformHandles";
3
- import { AppState, Zoom } from "../types";
4
- import { Bounds } from "./bounds";
5
- export declare const resizeTest: (element: NonDeletedExcalidrawElement, elementsMap: ElementsMap, appState: AppState, x: number, y: number, zoom: Zoom, pointerType: PointerType) => MaybeTransformHandleType;
6
- export declare const getElementWithTransformHandleType: (elements: readonly NonDeletedExcalidrawElement[], appState: AppState, scenePointerX: number, scenePointerY: number, zoom: Zoom, pointerType: PointerType, elementsMap: ElementsMap) => {
1
+ import type { ExcalidrawElement, PointerType, NonDeletedExcalidrawElement, ElementsMap } from "./types";
2
+ import type { MaybeTransformHandleType } from "./transformHandles";
3
+ import type { AppState, Device, Zoom } from "../types";
4
+ import type { Bounds } from "./bounds";
5
+ export declare const resizeTest: (element: NonDeletedExcalidrawElement, elementsMap: ElementsMap, appState: AppState, x: number, y: number, zoom: Zoom, pointerType: PointerType, device: Device) => MaybeTransformHandleType;
6
+ export declare const getElementWithTransformHandleType: (elements: readonly NonDeletedExcalidrawElement[], appState: AppState, scenePointerX: number, scenePointerY: number, zoom: Zoom, pointerType: PointerType, elementsMap: ElementsMap, device: Device) => {
7
7
  element: NonDeletedExcalidrawElement;
8
8
  transformHandleType: MaybeTransformHandleType;
9
9
  } | null;
10
- export declare const getTransformHandleTypeFromCoords: ([x1, y1, x2, y2]: Bounds, scenePointerX: number, scenePointerY: number, zoom: Zoom, pointerType: PointerType) => MaybeTransformHandleType;
10
+ export declare const getTransformHandleTypeFromCoords: ([x1, y1, x2, y2]: Bounds, scenePointerX: number, scenePointerY: number, zoom: Zoom, pointerType: PointerType, device: Device) => MaybeTransformHandleType;
11
11
  export declare const getCursorForResizingElement: (resizingElement: {
12
12
  element?: ExcalidrawElement;
13
13
  transformHandleType: MaybeTransformHandleType;
@@ -1,13 +1,17 @@
1
- import { OMIT_SIDES_FOR_MULTIPLE_ELEMENTS, getTransformHandlesFromCoords, getTransformHandles, } from "./transformHandles";
1
+ import { getTransformHandlesFromCoords, getTransformHandles, getOmitSidesForDevice, canResizeFromSides, } from "./transformHandles";
2
+ import { getElementAbsoluteCoords } from "./bounds";
3
+ import { SIDE_RESIZING_THRESHOLD } from "../constants";
4
+ import { angleToDegrees, pointOnLine, pointRotate, } from "../../utils/geometry/geometry";
5
+ import { isLinearElement } from "./typeChecks";
2
6
  const isInsideTransformHandle = (transformHandle, x, y) => x >= transformHandle[0] &&
3
7
  x <= transformHandle[0] + transformHandle[2] &&
4
8
  y >= transformHandle[1] &&
5
9
  y <= transformHandle[1] + transformHandle[3];
6
- export const resizeTest = (element, elementsMap, appState, x, y, zoom, pointerType) => {
10
+ export const resizeTest = (element, elementsMap, appState, x, y, zoom, pointerType, device) => {
7
11
  if (!appState.selectedElementIds[element.id]) {
8
12
  return false;
9
13
  }
10
- const { rotation: rotationTransformHandle, ...transformHandles } = getTransformHandles(element, zoom, elementsMap, pointerType);
14
+ const { rotation: rotationTransformHandle, ...transformHandles } = getTransformHandles(element, zoom, elementsMap, pointerType, getOmitSidesForDevice(device));
11
15
  if (rotationTransformHandle &&
12
16
  isInsideTransformHandle(rotationTransformHandle, x, y)) {
13
17
  return "rotation";
@@ -22,25 +26,56 @@ export const resizeTest = (element, elementsMap, appState, x, y, zoom, pointerTy
22
26
  if (filter.length > 0) {
23
27
  return filter[0];
24
28
  }
29
+ if (canResizeFromSides(device)) {
30
+ const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element, elementsMap);
31
+ // Note that for a text element, when "resized" from the side
32
+ // we should make it wrap/unwrap
33
+ if (element.type !== "text" &&
34
+ !(isLinearElement(element) && element.points.length <= 2)) {
35
+ const SPACING = SIDE_RESIZING_THRESHOLD / zoom.value;
36
+ const sides = getSelectionBorders([x1 - SPACING, y1 - SPACING], [x2 + SPACING, y2 + SPACING], [cx, cy], angleToDegrees(element.angle));
37
+ for (const [dir, side] of Object.entries(sides)) {
38
+ // test to see if x, y are on the line segment
39
+ if (pointOnLine([x, y], side, SPACING)) {
40
+ return dir;
41
+ }
42
+ }
43
+ }
44
+ }
25
45
  return false;
26
46
  };
27
- export const getElementWithTransformHandleType = (elements, appState, scenePointerX, scenePointerY, zoom, pointerType, elementsMap) => {
47
+ export const getElementWithTransformHandleType = (elements, appState, scenePointerX, scenePointerY, zoom, pointerType, elementsMap, device) => {
28
48
  return elements.reduce((result, element) => {
29
49
  if (result) {
30
50
  return result;
31
51
  }
32
- const transformHandleType = resizeTest(element, elementsMap, appState, scenePointerX, scenePointerY, zoom, pointerType);
52
+ const transformHandleType = resizeTest(element, elementsMap, appState, scenePointerX, scenePointerY, zoom, pointerType, device);
33
53
  return transformHandleType ? { element, transformHandleType } : null;
34
54
  }, null);
35
55
  };
36
- export const getTransformHandleTypeFromCoords = ([x1, y1, x2, y2], scenePointerX, scenePointerY, zoom, pointerType) => {
37
- const transformHandles = getTransformHandlesFromCoords([x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2], 0, zoom, pointerType, OMIT_SIDES_FOR_MULTIPLE_ELEMENTS);
56
+ export const getTransformHandleTypeFromCoords = ([x1, y1, x2, y2], scenePointerX, scenePointerY, zoom, pointerType, device) => {
57
+ const transformHandles = getTransformHandlesFromCoords([x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2], 0, zoom, pointerType, getOmitSidesForDevice(device));
38
58
  const found = Object.keys(transformHandles).find((key) => {
39
59
  const transformHandle = transformHandles[key];
40
60
  return (transformHandle &&
41
61
  isInsideTransformHandle(transformHandle, scenePointerX, scenePointerY));
42
62
  });
43
- return (found || false);
63
+ if (found) {
64
+ return found;
65
+ }
66
+ if (canResizeFromSides(device)) {
67
+ const cx = (x1 + x2) / 2;
68
+ const cy = (y1 + y2) / 2;
69
+ const SPACING = SIDE_RESIZING_THRESHOLD / zoom.value;
70
+ const sides = getSelectionBorders([x1 - SPACING, y1 - SPACING], [x2 + SPACING, y2 + SPACING], [cx, cy], angleToDegrees(0));
71
+ for (const [dir, side] of Object.entries(sides)) {
72
+ // test to see if x, y are on the line segment
73
+ if (pointOnLine([scenePointerX, scenePointerY], side, SPACING)) {
74
+ return dir;
75
+ }
76
+ }
77
+ }
78
+ return false;
44
79
  };
45
80
  const RESIZE_CURSORS = ["ns", "nesw", "ew", "nwse"];
46
81
  const rotateResizeCursor = (cursor, angle) => {
@@ -93,3 +128,15 @@ export const getCursorForResizingElement = (resizingElement) => {
93
128
  }
94
129
  return cursor ? `${cursor}-resize` : "";
95
130
  };
131
+ const getSelectionBorders = ([x1, y1], [x2, y2], center, angleInDegrees) => {
132
+ const topLeft = pointRotate([x1, y1], angleInDegrees, center);
133
+ const topRight = pointRotate([x2, y1], angleInDegrees, center);
134
+ const bottomLeft = pointRotate([x1, y2], angleInDegrees, center);
135
+ const bottomRight = pointRotate([x2, y2], angleInDegrees, center);
136
+ return {
137
+ n: [topLeft, topRight],
138
+ e: [topRight, bottomRight],
139
+ s: [bottomRight, bottomLeft],
140
+ w: [bottomLeft, topLeft],
141
+ };
142
+ };
@@ -1,3 +1,3 @@
1
- import { NonDeletedExcalidrawElement } from "./types";
2
- import { UIAppState } from "../types";
1
+ import type { NonDeletedExcalidrawElement } from "./types";
2
+ import type { UIAppState } from "../types";
3
3
  export declare const showSelectedShapeActions: (appState: UIAppState, elements: readonly NonDeletedExcalidrawElement[]) => boolean;
@@ -1,5 +1,5 @@
1
- import { ElementsMap, ExcalidrawElement } from "./types";
2
- import { AppState, Zoom } from "../types";
1
+ import type { ElementsMap, ExcalidrawElement } from "./types";
2
+ import type { AppState, Zoom } from "../types";
3
3
  export declare const isInvisiblySmallElement: (element: ExcalidrawElement) => boolean;
4
4
  export declare const isElementInViewport: (element: ExcalidrawElement, width: number, height: number, viewTransformations: {
5
5
  zoom: Zoom;
@@ -3,6 +3,9 @@ import { isFreeDrawElement, isLinearElement } from "./typeChecks";
3
3
  import { SHIFT_LOCKING_ANGLE } from "../constants";
4
4
  import { getElementBounds } from "./bounds";
5
5
  import { viewportCoordsToSceneCoords } from "../utils";
6
+ // TODO: remove invisible elements consistently actions, so that invisible elements are not recorded by the store, exported, broadcasted or persisted
7
+ // - perhaps could be as part of a standalone 'cleanup' action, in addition to 'finalize'
8
+ // - could also be part of `_clearElements`
6
9
  export const isInvisiblySmallElement = (element) => {
7
10
  if (isLinearElement(element) || isFreeDrawElement(element)) {
8
11
  return element.points.length < 2;
@@ -1,2 +1,2 @@
1
- import { ExcalidrawElement } from "./types";
1
+ import type { ExcalidrawElement } from "./types";
2
2
  export declare const normalizeElementOrder: (elements: readonly ExcalidrawElement[]) => readonly ExcalidrawElement[];
@@ -1,9 +1,9 @@
1
- import { ElementsMap, ExcalidrawElement, ExcalidrawElementType, ExcalidrawTextContainer, ExcalidrawTextElement, ExcalidrawTextElementWithContainer, FontFamilyValues, FontString, NonDeletedExcalidrawElement } from "./types";
2
- import { MaybeTransformHandleType } from "./transformHandles";
3
- import { AppState } from "../types";
4
- import { ExtractSetType, MakeBrand } from "../utility-types";
1
+ import type { ElementsMap, ExcalidrawElement, ExcalidrawElementType, ExcalidrawTextContainer, ExcalidrawTextElement, ExcalidrawTextElementWithContainer, FontFamilyValues, FontString, NonDeletedExcalidrawElement } from "./types";
2
+ import type { MaybeTransformHandleType } from "./transformHandles";
3
+ import type { AppState } from "../types";
4
+ import type { ExtractSetType, MakeBrand } from "../utility-types";
5
5
  export declare const normalizeText: (text: string) => string;
6
- export declare const redrawTextBoundingBox: (textElement: ExcalidrawTextElement, container: ExcalidrawElement | null, elementsMap: ElementsMap) => void;
6
+ export declare const redrawTextBoundingBox: (textElement: ExcalidrawTextElement, container: ExcalidrawElement | null, elementsMap: ElementsMap, informMutation?: boolean) => void;
7
7
  export declare const bindTextToShapeAfterDuplication: (newElements: ExcalidrawElement[], oldElements: ExcalidrawElement[], oldIdToDuplicatedId: Map<ExcalidrawElement["id"], ExcalidrawElement["id"]>) => void;
8
8
  export declare const handleBindTextResize: (container: NonDeletedExcalidrawElement, elementsMap: ElementsMap, transformHandleType: MaybeTransformHandleType, shouldMaintainAspectRatio?: boolean) => void;
9
9
  export declare const computeBoundTextPosition: (container: ExcalidrawElement, boundTextElement: ExcalidrawTextElementWithContainer, elementsMap: ElementsMap) => {
@@ -61,7 +61,6 @@ export declare const getBoundTextElementPosition: (container: ExcalidrawElement,
61
61
  } | undefined;
62
62
  export declare const shouldAllowVerticalAlign: (selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap) => boolean;
63
63
  export declare const suppportsHorizontalAlign: (selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap) => boolean;
64
- export declare const getTextBindableContainerAtPosition: (elements: readonly ExcalidrawElement[], appState: AppState, x: number, y: number, elementsMap: ElementsMap) => ExcalidrawTextContainer | null;
65
64
  declare const VALID_CONTAINER_TYPES: Set<string>;
66
65
  export declare const isValidTextContainer: (element: {
67
66
  type: ExcalidrawElementType;
@@ -4,10 +4,6 @@ import { ARROW_LABEL_FONT_SIZE_TO_MIN_WIDTH_RATIO, ARROW_LABEL_WIDTH_FRACTION, B
4
4
  import { isTextElement } from ".";
5
5
  import { isBoundToContainer, isArrowElement } from "./typeChecks";
6
6
  import { LinearElementEditor } from "./linearElementEditor";
7
- import { isTextBindableContainer } from "./typeChecks";
8
- import { getElementAbsoluteCoords } from ".";
9
- import { getSelectedElements } from "../scene";
10
- import { isHittingElementNotConsideringBoundingBox } from "./collision";
11
7
  import { resetOriginalContainerCache, updateOriginalContainerCache, } from "./containerCache";
12
8
  export const normalizeText = (text) => {
13
9
  return (normalizeEOL(text)
@@ -17,7 +13,7 @@ export const normalizeText = (text) => {
17
13
  const splitIntoLines = (text) => {
18
14
  return normalizeText(text).split("\n");
19
15
  };
20
- export const redrawTextBoundingBox = (textElement, container, elementsMap) => {
16
+ export const redrawTextBoundingBox = (textElement, container, elementsMap, informMutation = true) => {
21
17
  let maxWidth = undefined;
22
18
  const boundTextUpdates = {
23
19
  x: textElement.x,
@@ -25,6 +21,7 @@ export const redrawTextBoundingBox = (textElement, container, elementsMap) => {
25
21
  text: textElement.text,
26
22
  width: textElement.width,
27
23
  height: textElement.height,
24
+ angle: container?.angle ?? textElement.angle,
28
25
  };
29
26
  boundTextUpdates.text = textElement.text;
30
27
  if (container) {
@@ -39,12 +36,12 @@ export const redrawTextBoundingBox = (textElement, container, elementsMap) => {
39
36
  const maxContainerWidth = getBoundTextMaxWidth(container, textElement);
40
37
  if (!isArrowElement(container) && metrics.height > maxContainerHeight) {
41
38
  const nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);
42
- mutateElement(container, { height: nextHeight });
39
+ mutateElement(container, { height: nextHeight }, informMutation);
43
40
  updateOriginalContainerCache(container.id, nextHeight);
44
41
  }
45
42
  if (metrics.width > maxContainerWidth) {
46
43
  const nextWidth = computeContainerDimensionForBoundText(metrics.width, container.type);
47
- mutateElement(container, { width: nextWidth });
44
+ mutateElement(container, { width: nextWidth }, informMutation);
48
45
  }
49
46
  const updatedTextElement = {
50
47
  ...textElement,
@@ -54,7 +51,7 @@ export const redrawTextBoundingBox = (textElement, container, elementsMap) => {
54
51
  boundTextUpdates.x = x;
55
52
  boundTextUpdates.y = y;
56
53
  }
57
- mutateElement(textElement, boundTextUpdates);
54
+ mutateElement(textElement, boundTextUpdates, informMutation);
58
55
  };
59
56
  export const bindTextToShapeAfterDuplication = (newElements, oldElements, oldIdToDuplicatedId) => {
60
57
  const newElementsMap = arrayToMap(newElements);
@@ -540,32 +537,6 @@ export const suppportsHorizontalAlign = (selectedElements, elementsMap) => {
540
537
  return isTextElement(element);
541
538
  });
542
539
  };
543
- export const getTextBindableContainerAtPosition = (elements, appState, x, y, elementsMap) => {
544
- const selectedElements = getSelectedElements(elements, appState);
545
- if (selectedElements.length === 1) {
546
- return isTextBindableContainer(selectedElements[0], false)
547
- ? selectedElements[0]
548
- : null;
549
- }
550
- let hitElement = null;
551
- // We need to to hit testing from front (end of the array) to back (beginning of the array)
552
- for (let index = elements.length - 1; index >= 0; --index) {
553
- if (elements[index].isDeleted) {
554
- continue;
555
- }
556
- const [x1, y1, x2, y2] = getElementAbsoluteCoords(elements[index], elementsMap);
557
- if (isArrowElement(elements[index]) &&
558
- isHittingElementNotConsideringBoundingBox(elements[index], appState, null, [x, y], elementsMap)) {
559
- hitElement = elements[index];
560
- break;
561
- }
562
- else if (x1 < x && x < x2 && y1 < y && y < y2) {
563
- hitElement = elements[index];
564
- break;
565
- }
566
- }
567
- return isTextBindableContainer(hitElement, false) ? hitElement : null;
568
- };
569
540
  const VALID_CONTAINER_TYPES = new Set([
570
541
  "rectangle",
571
542
  "ellipse",
@@ -1,5 +1,5 @@
1
- import { ExcalidrawElement, ExcalidrawTextElement } from "./types";
2
- import App from "../components/App";
1
+ import type { ExcalidrawElement, ExcalidrawTextElement } from "./types";
2
+ import type App from "../components/App";
3
3
  export declare const textWysiwyg: ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }: {
4
4
  id: ExcalidrawElement["id"];
5
5
  onChange?: ((text: string) => void) | undefined;
@@ -1,6 +1,6 @@
1
- import { ElementsMap, ExcalidrawElement, NonDeletedExcalidrawElement, PointerType } from "./types";
2
- import { Bounds } from "./bounds";
3
- import { InteractiveCanvasAppState, Zoom } from "../types";
1
+ import type { ElementsMap, ExcalidrawElement, NonDeletedExcalidrawElement, PointerType } from "./types";
2
+ import type { Bounds } from "./bounds";
3
+ import type { Device, InteractiveCanvasAppState, Zoom } from "../types";
4
4
  export type TransformHandleDirection = "n" | "s" | "w" | "e" | "nw" | "ne" | "sw" | "se";
5
5
  export type TransformHandleType = TransformHandleDirection | "rotation";
6
6
  export type TransformHandle = Bounds;
@@ -8,6 +8,12 @@ export type TransformHandles = Partial<{
8
8
  [T in TransformHandleType]: TransformHandle;
9
9
  }>;
10
10
  export type MaybeTransformHandleType = TransformHandleType | false;
11
+ export declare const DEFAULT_OMIT_SIDES: {
12
+ e: boolean;
13
+ s: boolean;
14
+ n: boolean;
15
+ w: boolean;
16
+ };
11
17
  export declare const OMIT_SIDES_FOR_MULTIPLE_ELEMENTS: {
12
18
  e: boolean;
13
19
  s: boolean;
@@ -21,16 +27,28 @@ export declare const OMIT_SIDES_FOR_FRAME: {
21
27
  w: boolean;
22
28
  rotation: boolean;
23
29
  };
30
+ export declare const canResizeFromSides: (device: Device) => boolean;
31
+ export declare const getOmitSidesForDevice: (device: Device) => {};
24
32
  export declare const getTransformHandlesFromCoords: ([x1, y1, x2, y2, cx, cy]: [number, number, number, number, number, number], angle: number, zoom: Zoom, pointerType: PointerType, omitSides?: {
25
33
  s?: boolean | undefined;
26
- n?: boolean | undefined;
27
- w?: boolean | undefined;
28
34
  e?: boolean | undefined;
35
+ w?: boolean | undefined;
36
+ n?: boolean | undefined;
29
37
  nw?: boolean | undefined;
30
38
  ne?: boolean | undefined;
31
39
  sw?: boolean | undefined;
32
40
  se?: boolean | undefined;
33
41
  rotation?: boolean | undefined;
34
42
  }, margin?: number) => TransformHandles;
35
- export declare const getTransformHandles: (element: ExcalidrawElement, zoom: Zoom, elementsMap: ElementsMap, pointerType?: PointerType) => TransformHandles;
43
+ export declare const getTransformHandles: (element: ExcalidrawElement, zoom: Zoom, elementsMap: ElementsMap, pointerType?: PointerType, omitSides?: {
44
+ s?: boolean | undefined;
45
+ e?: boolean | undefined;
46
+ w?: boolean | undefined;
47
+ n?: boolean | undefined;
48
+ nw?: boolean | undefined;
49
+ ne?: boolean | undefined;
50
+ sw?: boolean | undefined;
51
+ se?: boolean | undefined;
52
+ rotation?: boolean | undefined;
53
+ }) => TransformHandles;
36
54
  export declare const shouldShowBoundingBox: (elements: readonly NonDeletedExcalidrawElement[], appState: InteractiveCanvasAppState) => boolean;