@excalidraw/excalidraw 0.17.1-1d71f84 → 0.17.1-2f9526d

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