@excalidraw/excalidraw 0.17.1-890ed9f → 0.17.1-96eeec5

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 (451) hide show
  1. package/CHANGELOG.md +15 -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-WQFMSDPT.js → chunk-DEYXWPUO.js} +7503 -2575
  8. package/dist/browser/dev/excalidraw-assets-dev/chunk-DEYXWPUO.js.map +7 -0
  9. package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js → chunk-EFLPX7NE.js} +6 -6
  10. package/dist/browser/dev/excalidraw-assets-dev/{chunk-XOM7LNOU.js → chunk-EM6LVGFW.js} +27 -4
  11. package/dist/browser/dev/excalidraw-assets-dev/chunk-EM6LVGFW.js.map +7 -0
  12. package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js → chunk-JYIQCNWV.js} +2 -2
  13. package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js → chunk-LVIQQW6F.js} +2 -2
  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-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-TR4QLF5E.js → en-AZFA5HJJ.js} +4 -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-OIPMBJGR.js → image-5XCR4WHS.js} +2 -2
  32. package/dist/browser/dev/excalidraw-assets-dev/{image-OFRRV5MB.css → image-O66MQ7WQ.css} +1 -1
  33. package/dist/browser/dev/excalidraw-assets-dev/image-O66MQ7WQ.css.map +7 -0
  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 +199 -77
  47. package/dist/browser/dev/index.css.map +3 -3
  48. package/dist/browser/dev/index.js +12477 -8028
  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-5SYIAZGL.js → chunk-7DXALCB2.js} +5 -5
  54. package/dist/browser/prod/excalidraw-assets/{chunk-P5M3G2RP.js → chunk-AIKXYJX3.js} +1 -1
  55. package/dist/browser/prod/excalidraw-assets/{chunk-E2YLWFZX.js → chunk-CR7VMNWC.js} +1 -1
  56. package/dist/browser/prod/excalidraw-assets/{chunk-WEYK4A2L.js → chunk-FFF2CSVG.js} +1 -1
  57. package/dist/browser/prod/excalidraw-assets/{chunk-R3HAIP6R.js → chunk-G4WDCSPE.js} +1 -1
  58. package/dist/browser/prod/excalidraw-assets/{chunk-HFOXJM22.js → chunk-HKZSHFLX.js} +1 -1
  59. package/dist/browser/prod/excalidraw-assets/{chunk-XIMFFJTE.js → chunk-IKCDYWMW.js} +1 -1
  60. package/dist/browser/prod/excalidraw-assets/{chunk-AHLLBBVJ.js → chunk-L5DS24G6.js} +1 -1
  61. package/dist/browser/prod/excalidraw-assets/{chunk-CQJF3C6G.js → chunk-MUNOKHUD.js} +1 -1
  62. package/dist/browser/prod/excalidraw-assets/chunk-ODWTVSS7.js +68 -0
  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-6E7MYLWO.js +1 -0
  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-LQAMCFQI.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 +69 -51
  90. package/dist/{prod/en-XW4JO6VX.json → dev/en-EB2MBPAV.json} +24 -3
  91. package/dist/dev/index.css +199 -77
  92. package/dist/dev/index.css.map +3 -3
  93. package/dist/dev/index.js +15120 -11334
  94. package/dist/dev/index.js.map +4 -4
  95. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +16 -7
  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 +18 -12
  100. package/dist/excalidraw/actions/actionBoundText.js +7 -4
  101. package/dist/excalidraw/actions/actionCanvas.d.ts +100 -64
  102. package/dist/excalidraw/actions/actionCanvas.js +17 -14
  103. package/dist/excalidraw/actions/actionClipboard.d.ts +52 -31
  104. package/dist/excalidraw/actions/actionClipboard.js +14 -13
  105. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +22 -13
  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 +4 -4
  111. package/dist/excalidraw/actions/actionElementLock.d.ts +17 -11
  112. package/dist/excalidraw/actions/actionElementLock.js +3 -2
  113. package/dist/excalidraw/actions/actionExport.d.ts +68 -41
  114. package/dist/excalidraw/actions/actionExport.js +15 -11
  115. package/dist/excalidraw/actions/actionFinalize.d.ts +17 -11
  116. package/dist/excalidraw/actions/actionFinalize.js +7 -3
  117. package/dist/excalidraw/actions/actionFlip.d.ts +10 -10
  118. package/dist/excalidraw/actions/actionFlip.js +9 -9
  119. package/dist/excalidraw/actions/actionFrame.d.ts +186 -21
  120. package/dist/excalidraw/actions/actionFrame.js +7 -6
  121. package/dist/excalidraw/actions/actionGroup.d.ts +24 -18
  122. package/dist/excalidraw/actions/actionGroup.js +7 -11
  123. package/dist/excalidraw/actions/actionHistory.d.ts +4 -3
  124. package/dist/excalidraw/actions/actionHistory.js +27 -31
  125. package/dist/excalidraw/actions/actionLinearEditor.d.ts +10 -5
  126. package/dist/excalidraw/actions/actionLinearEditor.js +21 -5
  127. package/dist/excalidraw/actions/actionLink.d.ts +9 -6
  128. package/dist/excalidraw/actions/actionLink.js +2 -1
  129. package/dist/excalidraw/actions/actionMenu.d.ts +20 -11
  130. package/dist/excalidraw/actions/actionMenu.js +4 -3
  131. package/dist/excalidraw/actions/actionNavigate.d.ts +12 -6
  132. package/dist/excalidraw/actions/actionNavigate.js +3 -2
  133. package/dist/excalidraw/actions/actionProperties.d.ts +86 -47
  134. package/dist/excalidraw/actions/actionProperties.js +19 -14
  135. package/dist/excalidraw/actions/actionSelectAll.d.ts +9 -6
  136. package/dist/excalidraw/actions/actionSelectAll.js +2 -1
  137. package/dist/excalidraw/actions/actionStyles.d.ts +15 -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 +9 -6
  142. package/dist/excalidraw/actions/actionToggleGridMode.js +2 -1
  143. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +8 -5
  144. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.js +2 -1
  145. package/dist/excalidraw/actions/actionToggleStats.d.ts +9 -5
  146. package/dist/excalidraw/actions/actionToggleStats.js +6 -4
  147. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +8 -5
  148. package/dist/excalidraw/actions/actionToggleViewMode.js +2 -1
  149. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +8 -5
  150. package/dist/excalidraw/actions/actionToggleZenMode.js +2 -1
  151. package/dist/excalidraw/actions/actionZindex.d.ts +20 -16
  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/types.d.ts +8 -8
  157. package/dist/excalidraw/align.d.ts +1 -1
  158. package/dist/excalidraw/animated-trail.d.ts +2 -2
  159. package/dist/excalidraw/appState.d.ts +9 -6
  160. package/dist/excalidraw/appState.js +6 -3
  161. package/dist/excalidraw/change.d.ts +191 -0
  162. package/dist/excalidraw/change.js +901 -0
  163. package/dist/excalidraw/charts.d.ts +1 -1
  164. package/dist/excalidraw/clients.d.ts +2 -2
  165. package/dist/excalidraw/clients.js +1 -1
  166. package/dist/excalidraw/clipboard.d.ts +3 -3
  167. package/dist/excalidraw/colors.d.ts +1 -1
  168. package/dist/excalidraw/components/Actions.d.ts +3 -3
  169. package/dist/excalidraw/components/Actions.js +9 -6
  170. package/dist/excalidraw/components/App.d.ts +19 -20
  171. package/dist/excalidraw/components/App.js +323 -195
  172. package/dist/excalidraw/components/ButtonIconSelect.js +1 -1
  173. package/dist/excalidraw/components/CheckboxItem.js +1 -1
  174. package/dist/excalidraw/components/ColorPicker/ColorInput.d.ts +1 -1
  175. package/dist/excalidraw/components/ColorPicker/ColorInput.js +1 -1
  176. package/dist/excalidraw/components/ColorPicker/ColorPicker.d.ts +4 -4
  177. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +1 -1
  178. package/dist/excalidraw/components/ColorPicker/Picker.d.ts +3 -3
  179. package/dist/excalidraw/components/ColorPicker/PickerColorList.d.ts +1 -1
  180. package/dist/excalidraw/components/ColorPicker/PickerHeading.d.ts +1 -1
  181. package/dist/excalidraw/components/ColorPicker/ShadeList.d.ts +1 -1
  182. package/dist/excalidraw/components/ColorPicker/TopPicks.d.ts +1 -1
  183. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +2 -2
  184. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.js +1 -1
  185. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -2
  186. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.js +1 -1
  187. package/dist/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -1
  188. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +5 -5
  189. package/dist/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -1
  190. package/dist/excalidraw/components/CommandPalette/types.d.ts +3 -3
  191. package/dist/excalidraw/components/ConfirmDialog.d.ts +1 -1
  192. package/dist/excalidraw/components/ContextMenu.d.ts +2 -2
  193. package/dist/excalidraw/components/ContextMenu.js +2 -2
  194. package/dist/excalidraw/components/DarkModeToggle.d.ts +1 -1
  195. package/dist/excalidraw/components/DefaultSidebar.d.ts +2 -2
  196. package/dist/excalidraw/components/Dialog.js +1 -1
  197. package/dist/excalidraw/components/DialogActionButton.d.ts +1 -1
  198. package/dist/excalidraw/components/EyeDropper.d.ts +2 -2
  199. package/dist/excalidraw/components/FollowMode/FollowMode.d.ts +1 -1
  200. package/dist/excalidraw/components/FollowMode/FollowMode.js +1 -1
  201. package/dist/excalidraw/components/HelpDialog.js +1 -1
  202. package/dist/excalidraw/components/HintViewer.d.ts +1 -1
  203. package/dist/excalidraw/components/IconPicker.js +2 -2
  204. package/dist/excalidraw/components/ImageExportDialog.d.ts +1 -1
  205. package/dist/excalidraw/components/InitializeApp.d.ts +2 -2
  206. package/dist/excalidraw/components/JSONExportDialog.d.ts +3 -3
  207. package/dist/excalidraw/components/LayerUI.d.ts +4 -4
  208. package/dist/excalidraw/components/LayerUI.js +10 -7
  209. package/dist/excalidraw/components/LibraryMenu.d.ts +2 -2
  210. package/dist/excalidraw/components/LibraryMenuBrowseButton.d.ts +1 -1
  211. package/dist/excalidraw/components/LibraryMenuControlButtons.d.ts +1 -1
  212. package/dist/excalidraw/components/LibraryMenuHeaderContent.d.ts +2 -2
  213. package/dist/excalidraw/components/LibraryMenuItems.d.ts +1 -1
  214. package/dist/excalidraw/components/LibraryMenuSection.d.ts +5 -4
  215. package/dist/excalidraw/components/LibraryUnit.d.ts +2 -2
  216. package/dist/excalidraw/components/LoadingMessage.d.ts +1 -1
  217. package/dist/excalidraw/components/MagicSettings.js +2 -2
  218. package/dist/excalidraw/components/MobileMenu.d.ts +3 -3
  219. package/dist/excalidraw/components/MobileMenu.js +2 -6
  220. package/dist/excalidraw/components/Modal.d.ts +1 -1
  221. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  222. package/dist/excalidraw/components/PasteChartDialog.d.ts +1 -1
  223. package/dist/excalidraw/components/PasteChartDialog.js +1 -1
  224. package/dist/excalidraw/components/PublishLibrary.d.ts +1 -1
  225. package/dist/excalidraw/components/SVGLayer.d.ts +1 -1
  226. package/dist/excalidraw/components/Sidebar/Sidebar.d.ts +2 -2
  227. package/dist/excalidraw/components/Sidebar/Sidebar.js +1 -1
  228. package/dist/excalidraw/components/Sidebar/SidebarTab.d.ts +1 -1
  229. package/dist/excalidraw/components/Sidebar/SidebarTabTrigger.d.ts +1 -1
  230. package/dist/excalidraw/components/Sidebar/SidebarTrigger.d.ts +1 -1
  231. package/dist/excalidraw/components/Sidebar/common.d.ts +1 -1
  232. package/dist/excalidraw/components/Stack.d.ts +2 -2
  233. package/dist/excalidraw/components/Stats/Angle.d.ts +12 -0
  234. package/dist/excalidraw/components/Stats/Angle.js +52 -0
  235. package/dist/excalidraw/components/Stats/Collapsible.d.ts +9 -0
  236. package/dist/excalidraw/components/Stats/Collapsible.js +12 -0
  237. package/dist/excalidraw/components/Stats/Dimension.d.ts +12 -0
  238. package/dist/excalidraw/components/Stats/Dimension.js +67 -0
  239. package/dist/excalidraw/components/Stats/DragInput.d.ts +32 -0
  240. package/dist/excalidraw/components/Stats/DragInput.js +174 -0
  241. package/dist/excalidraw/components/Stats/FontSize.d.ts +12 -0
  242. package/dist/excalidraw/components/Stats/FontSize.js +50 -0
  243. package/dist/excalidraw/components/Stats/MultiAngle.d.ts +12 -0
  244. package/dist/excalidraw/components/Stats/MultiAngle.js +66 -0
  245. package/dist/excalidraw/components/Stats/MultiDimension.d.ts +15 -0
  246. package/dist/excalidraw/components/Stats/MultiDimension.js +197 -0
  247. package/dist/excalidraw/components/Stats/MultiFontSize.d.ts +13 -0
  248. package/dist/excalidraw/components/Stats/MultiFontSize.js +72 -0
  249. package/dist/excalidraw/components/Stats/MultiPosition.d.ts +15 -0
  250. package/dist/excalidraw/components/Stats/MultiPosition.js +100 -0
  251. package/dist/excalidraw/components/Stats/Position.d.ts +13 -0
  252. package/dist/excalidraw/components/Stats/Position.js +39 -0
  253. package/dist/excalidraw/components/Stats/index.d.ts +16 -0
  254. package/dist/excalidraw/components/Stats/index.js +78 -0
  255. package/dist/excalidraw/components/Stats/utils.d.ts +25 -0
  256. package/dist/excalidraw/components/Stats/utils.js +158 -0
  257. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +1 -1
  258. package/dist/excalidraw/components/TTDDialog/TTDDialog.js +2 -2
  259. package/dist/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +1 -1
  260. package/dist/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +1 -1
  261. package/dist/excalidraw/components/TTDDialog/TTDDialogPanels.d.ts +1 -1
  262. package/dist/excalidraw/components/TTDDialog/TTDDialogTabs.d.ts +1 -1
  263. package/dist/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -1
  264. package/dist/excalidraw/components/TTDDialog/common.d.ts +4 -4
  265. package/dist/excalidraw/components/TextField.d.ts +1 -1
  266. package/dist/excalidraw/components/Toast.d.ts +1 -1
  267. package/dist/excalidraw/components/ToolButton.d.ts +4 -2
  268. package/dist/excalidraw/components/ToolButton.js +1 -1
  269. package/dist/excalidraw/components/Trans.d.ts +1 -1
  270. package/dist/excalidraw/components/UserList.d.ts +1 -1
  271. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +5 -3
  272. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +5 -2
  273. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +2 -2
  274. package/dist/excalidraw/components/canvases/StaticCanvas.js +2 -2
  275. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +2 -2
  276. package/dist/excalidraw/components/footer/Footer.d.ts +2 -2
  277. package/dist/excalidraw/components/hyperlink/Hyperlink.d.ts +2 -2
  278. package/dist/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  279. package/dist/excalidraw/components/icons.d.ts +6 -2
  280. package/dist/excalidraw/components/icons.js +22 -6
  281. package/dist/excalidraw/constants.d.ts +11 -2
  282. package/dist/excalidraw/constants.js +14 -1
  283. package/dist/excalidraw/context/ui-appState.d.ts +1 -1
  284. package/dist/excalidraw/cursor.d.ts +1 -1
  285. package/dist/excalidraw/data/EditorLocalStorage.d.ts +2 -2
  286. package/dist/excalidraw/data/blob.d.ts +5 -5
  287. package/dist/excalidraw/data/filesystem.d.ts +2 -1
  288. package/dist/excalidraw/data/index.d.ts +4 -4
  289. package/dist/excalidraw/data/json.d.ts +3 -3
  290. package/dist/excalidraw/data/library.d.ts +3 -3
  291. package/dist/excalidraw/data/magic.d.ts +3 -3
  292. package/dist/excalidraw/data/reconcile.d.ts +3 -3
  293. package/dist/excalidraw/data/reconcile.js +1 -1
  294. package/dist/excalidraw/data/resave.d.ts +2 -2
  295. package/dist/excalidraw/data/restore.d.ts +3 -3
  296. package/dist/excalidraw/data/restore.js +17 -2
  297. package/dist/excalidraw/data/transform.d.ts +3 -3
  298. package/dist/excalidraw/data/types.d.ts +3 -3
  299. package/dist/excalidraw/element/ElementCanvasButtons.d.ts +1 -1
  300. package/dist/excalidraw/element/binding.d.ts +48 -20
  301. package/dist/excalidraw/element/binding.js +354 -168
  302. package/dist/excalidraw/element/bounds.d.ts +3 -3
  303. package/dist/excalidraw/element/collision.d.ts +3 -3
  304. package/dist/excalidraw/element/collision.js +1 -1
  305. package/dist/excalidraw/element/containerCache.d.ts +1 -1
  306. package/dist/excalidraw/element/dragElements.d.ts +4 -4
  307. package/dist/excalidraw/element/dragElements.js +27 -3
  308. package/dist/excalidraw/element/embeddable.d.ts +10 -7
  309. package/dist/excalidraw/element/embeddable.js +2 -1
  310. package/dist/excalidraw/element/image.d.ts +2 -2
  311. package/dist/excalidraw/element/index.d.ts +2 -2
  312. package/dist/excalidraw/element/index.js +1 -1
  313. package/dist/excalidraw/element/linearElementEditor.d.ts +10 -7
  314. package/dist/excalidraw/element/linearElementEditor.js +9 -6
  315. package/dist/excalidraw/element/mutateElement.d.ts +3 -4
  316. package/dist/excalidraw/element/mutateElement.js +1 -1
  317. package/dist/excalidraw/element/newElement.d.ts +5 -8
  318. package/dist/excalidraw/element/newElement.js +16 -14
  319. package/dist/excalidraw/element/resizeElements.d.ts +12 -4
  320. package/dist/excalidraw/element/resizeElements.js +174 -98
  321. package/dist/excalidraw/element/resizeTest.d.ts +7 -7
  322. package/dist/excalidraw/element/resizeTest.js +53 -8
  323. package/dist/excalidraw/element/showSelectedShapeActions.d.ts +2 -2
  324. package/dist/excalidraw/element/sizeHelpers.d.ts +2 -2
  325. package/dist/excalidraw/element/sizeHelpers.js +3 -0
  326. package/dist/excalidraw/element/sortElements.d.ts +1 -1
  327. package/dist/excalidraw/element/textElement.d.ts +6 -5
  328. package/dist/excalidraw/element/textElement.js +16 -7
  329. package/dist/excalidraw/element/textWysiwyg.d.ts +12 -6
  330. package/dist/excalidraw/element/textWysiwyg.js +38 -17
  331. package/dist/excalidraw/element/transformHandles.d.ts +24 -6
  332. package/dist/excalidraw/element/transformHandles.js +22 -11
  333. package/dist/excalidraw/element/typeChecks.d.ts +5 -5
  334. package/dist/excalidraw/element/types.d.ts +16 -8
  335. package/dist/excalidraw/emitter.d.ts +1 -1
  336. package/dist/excalidraw/fractionalIndex.d.ts +1 -1
  337. package/dist/excalidraw/fractionalIndex.js +2 -4
  338. package/dist/excalidraw/frame.d.ts +3 -3
  339. package/dist/excalidraw/gatransforms.d.ts +1 -1
  340. package/dist/excalidraw/gesture.d.ts +1 -1
  341. package/dist/excalidraw/groups.d.ts +6 -4
  342. package/dist/excalidraw/groups.js +17 -0
  343. package/dist/excalidraw/history.d.ts +35 -47
  344. package/dist/excalidraw/history.js +100 -167
  345. package/dist/excalidraw/hooks/useEmitter.d.ts +2 -0
  346. package/dist/excalidraw/hooks/useEmitter.js +13 -0
  347. package/dist/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  348. package/dist/excalidraw/i18n.d.ts +1 -1
  349. package/dist/excalidraw/index.d.ts +3 -1
  350. package/dist/excalidraw/index.js +2 -0
  351. package/dist/excalidraw/jotai.d.ts +1 -1
  352. package/dist/excalidraw/laser-trails.d.ts +3 -2
  353. package/dist/excalidraw/locales/en.json +24 -3
  354. package/dist/excalidraw/math.d.ts +4 -2
  355. package/dist/excalidraw/math.js +6 -0
  356. package/dist/excalidraw/mermaid.d.ts +2 -0
  357. package/dist/excalidraw/mermaid.js +28 -0
  358. package/dist/excalidraw/points.d.ts +1 -1
  359. package/dist/excalidraw/queue.d.ts +1 -1
  360. package/dist/excalidraw/renderer/helpers.d.ts +2 -2
  361. package/dist/excalidraw/renderer/interactiveScene.d.ts +2 -2
  362. package/dist/excalidraw/renderer/interactiveScene.js +38 -11
  363. package/dist/excalidraw/renderer/renderElement.d.ts +4 -4
  364. package/dist/excalidraw/renderer/renderElement.js +5 -5
  365. package/dist/excalidraw/renderer/renderSnaps.d.ts +1 -1
  366. package/dist/excalidraw/renderer/staticScene.d.ts +1 -1
  367. package/dist/excalidraw/renderer/staticScene.js +1 -1
  368. package/dist/excalidraw/renderer/staticSvgScene.d.ts +4 -4
  369. package/dist/excalidraw/scene/Fonts.d.ts +2 -4
  370. package/dist/excalidraw/scene/Fonts.js +12 -15
  371. package/dist/excalidraw/scene/Renderer.d.ts +4 -4
  372. package/dist/excalidraw/scene/Renderer.js +2 -3
  373. package/dist/excalidraw/scene/Scene.d.ts +17 -8
  374. package/dist/excalidraw/scene/Scene.js +19 -10
  375. package/dist/excalidraw/scene/Shape.d.ts +1 -1
  376. package/dist/excalidraw/scene/ShapeCache.d.ts +4 -4
  377. package/dist/excalidraw/scene/comparisons.d.ts +2 -2
  378. package/dist/excalidraw/scene/export.d.ts +2 -2
  379. package/dist/excalidraw/scene/export.js +2 -2
  380. package/dist/excalidraw/scene/scroll.d.ts +2 -2
  381. package/dist/excalidraw/scene/scrollbars.d.ts +3 -3
  382. package/dist/excalidraw/scene/selection.d.ts +2 -2
  383. package/dist/excalidraw/scene/types.d.ts +7 -8
  384. package/dist/excalidraw/scene/zoom.d.ts +1 -1
  385. package/dist/excalidraw/shapes.d.ts +7 -0
  386. package/dist/excalidraw/shapes.js +40 -0
  387. package/dist/excalidraw/snapping.d.ts +4 -4
  388. package/dist/excalidraw/snapping.js +2 -1
  389. package/dist/excalidraw/store.d.ts +129 -0
  390. package/dist/excalidraw/store.js +296 -0
  391. package/dist/excalidraw/types.d.ts +38 -20
  392. package/dist/excalidraw/utils.d.ts +10 -4
  393. package/dist/excalidraw/utils.js +7 -0
  394. package/dist/excalidraw/zindex.d.ts +2 -2
  395. package/dist/{dev/en-XW4JO6VX.json → prod/en-EB2MBPAV.json} +24 -3
  396. package/dist/prod/index.css +1 -1
  397. package/dist/prod/index.js +39 -39
  398. package/dist/utils/bbox.d.ts +2 -2
  399. package/dist/utils/collision.d.ts +1 -1
  400. package/dist/utils/export.d.ts +2 -2
  401. package/dist/utils/geometry/geometry.d.ts +1 -1
  402. package/dist/utils/geometry/shape.d.ts +2 -1
  403. package/dist/utils/geometry/shape.js +19 -0
  404. package/dist/utils/withinBounds.d.ts +1 -1
  405. package/history.ts +163 -218
  406. package/package.json +2 -2
  407. package/dist/browser/dev/excalidraw-assets-dev/chunk-WQFMSDPT.js.map +0 -7
  408. package/dist/browser/dev/excalidraw-assets-dev/chunk-XOM7LNOU.js.map +0 -7
  409. package/dist/browser/dev/excalidraw-assets-dev/chunk-Z3PH3V2B.js.map +0 -7
  410. package/dist/browser/dev/excalidraw-assets-dev/dist-Z46EOVOL.js.map +0 -7
  411. package/dist/browser/dev/excalidraw-assets-dev/image-OFRRV5MB.css.map +0 -7
  412. package/dist/browser/prod/excalidraw-assets/chunk-U3COIHDW.js +0 -55
  413. package/dist/browser/prod/excalidraw-assets/dist-PIPZXALV.js +0 -6
  414. package/dist/browser/prod/excalidraw-assets/en-7GPZE2Y2.js +0 -1
  415. package/dist/browser/prod/excalidraw-assets/image-ZLNYKWVQ.js +0 -1
  416. package/dist/excalidraw/components/Stats.d.ts +0 -11
  417. package/dist/excalidraw/components/Stats.js +0 -13
  418. /package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-ACFH36JV.js.map → blockDiagram-91b80b7a-H47FTXHA.js.map} +0 -0
  419. /package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-QZ27YR47.js.map → c4Diagram-b2a90758-NNJK6GKC.js.map} +0 -0
  420. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-HO2HMSK7.js.map → chunk-4KQVEBHW.js.map} +0 -0
  421. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-USGV265L.js.map → chunk-53YI56GV.js.map} +0 -0
  422. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-EDFX3S7X.js.map → chunk-A2WCJI4I.js.map} +0 -0
  423. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js.map → chunk-EFLPX7NE.js.map} +0 -0
  424. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js.map → chunk-JYIQCNWV.js.map} +0 -0
  425. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js.map → chunk-LVIQQW6F.js.map} +0 -0
  426. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-6U7GQNJT.js.map → chunk-PXLO3FOU.js.map} +0 -0
  427. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-7DACDEY3.js.map → chunk-TO2AW5PW.js.map} +0 -0
  428. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-NJ77ZFNJ.js.map → chunk-VURILHLY.js.map} +0 -0
  429. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-2T2GU7NF.js.map → chunk-ZAYGSUHF.js.map} +0 -0
  430. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-QSLMH4JW.js.map → classDiagram-30eddba6-CUYIJICN.js.map} +0 -0
  431. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-DY4DYQ5P.js.map → classDiagram-v2-f2df5561-K6WW6K73.js.map} +0 -0
  432. /package/dist/browser/dev/excalidraw-assets-dev/{en-TR4QLF5E.js.map → en-AZFA5HJJ.js.map} +0 -0
  433. /package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-SOOJRTCB.js.map → erDiagram-47591fe2-XGAD7EEP.js.map} +0 -0
  434. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-AHGL4KPK.js.map → flowDiagram-5540d9b9-B6EOVNNO.js.map} +0 -0
  435. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-56LDZZWY.js.map → flowDiagram-v2-3b53844e-NUG24FJH.js.map} +0 -0
  436. /package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-27LUKRI6.js.map → flowchart-elk-definition-5fe447d6-25Y7PCBL.js.map} +0 -0
  437. /package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-EHGYGNG6.js.map → ganttDiagram-9a3bba1f-GNL6ZDTC.js.map} +0 -0
  438. /package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-AJQNBDW5.js.map → gitGraphDiagram-96e6b4ee-HNW52NVO.js.map} +0 -0
  439. /package/dist/browser/dev/excalidraw-assets-dev/{image-OIPMBJGR.js.map → image-5XCR4WHS.js.map} +0 -0
  440. /package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-SWLLQVES.js.map → infoDiagram-bcd20f53-FWEUVFLT.js.map} +0 -0
  441. /package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-7UAVCWOZ.js.map → journeyDiagram-4fe6b3dc-RZIUI7UG.js.map} +0 -0
  442. /package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-SROW5KGM.js.map → mindmap-definition-f354de21-GBVN45GU.js.map} +0 -0
  443. /package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-QKCI6NCB.js.map → pieDiagram-79897490-ECENNII6.js.map} +0 -0
  444. /package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-LNYJZFC5.js.map → quadrantDiagram-62f64e94-ZMEOFVNL.js.map} +0 -0
  445. /package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZZD7ZHFA.js.map → requirementDiagram-05bf5f74-FHZSFHCR.js.map} +0 -0
  446. /package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-L75ZZ4UM.js.map → sankeyDiagram-97764748-VDKIKTA6.js.map} +0 -0
  447. /package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-6PCU7TDK.js.map → sequenceDiagram-acc0e65c-6JUSPVKX.js.map} +0 -0
  448. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-WM76WOPR.js.map → stateDiagram-0ff1cf1a-L3AKWENF.js.map} +0 -0
  449. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-N4HZW3O2.js.map → stateDiagram-v2-9a9d610d-NU3GGMCH.js.map} +0 -0
  450. /package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-ZHGCAXGP.js.map → timeline-definition-fea2a41d-JGP7XCHW.js.map} +0 -0
  451. /package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-2DLOVRAZ.js.map → xychartDiagram-ab372869-HLFHHF2I.js.map} +0 -0
@@ -1,14 +1,15 @@
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";
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, getMinTextElementWidth, } 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
  }
@@ -79,12 +73,12 @@ const rotateSingleElement = (element, elementsMap, pointerX, pointerY, shouldRot
79
73
  }
80
74
  }
81
75
  };
82
- const rescalePointsInElement = (element, width, height, normalizePoints) => isLinearElement(element) || isFreeDrawElement(element)
76
+ export const rescalePointsInElement = (element, width, height, normalizePoints) => isLinearElement(element) || isFreeDrawElement(element)
83
77
  ? {
84
78
  points: rescalePoints(0, width, rescalePoints(1, height, element.points, normalizePoints), normalizePoints),
85
79
  }
86
80
  : {};
87
- const measureFontSizeFromWidth = (element, elementsMap, nextWidth) => {
81
+ export const measureFontSizeFromWidth = (element, elementsMap, nextWidth) => {
88
82
  // We only use width to scale font on resize
89
83
  let width = element.width;
90
84
  const hasContainer = isBoundToContainer(element);
@@ -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,105 @@ 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 = getMinTextElementWidth(getFontString({
183
+ fontSize: element.fontSize,
184
+ fontFamily: element.fontFamily,
185
+ }), element.lineHeight);
186
+ let scaleX = atStartBoundsWidth / boundsCurrentWidth;
187
+ if (transformHandleType.includes("e")) {
188
+ scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;
189
+ }
190
+ if (transformHandleType.includes("w")) {
191
+ scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;
192
+ }
193
+ const newWidth = element.width * scaleX < minWidth ? minWidth : element.width * scaleX;
194
+ const text = wrapText(element.originalText, getFontString(element), Math.abs(newWidth));
195
+ const metrics = measureText(text, getFontString(element), element.lineHeight);
196
+ const eleNewHeight = metrics.height;
197
+ const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] = getResizedElementAbsoluteCoords(stateAtResizeStart, newWidth, eleNewHeight, true);
198
+ const newBoundsWidth = newBoundsX2 - newBoundsX1;
199
+ const newBoundsHeight = newBoundsY2 - newBoundsY1;
200
+ let newTopLeft = [...startTopLeft];
201
+ if (["n", "w", "nw"].includes(transformHandleType)) {
202
+ newTopLeft = [
203
+ startBottomRight[0] - Math.abs(newBoundsWidth),
204
+ startTopLeft[1],
205
+ ];
206
+ }
207
+ // adjust topLeft to new rotation point
208
+ const angle = stateAtResizeStart.angle;
209
+ const rotatedTopLeft = rotatePoint(newTopLeft, startCenter, angle);
210
+ const newCenter = [
211
+ newTopLeft[0] + Math.abs(newBoundsWidth) / 2,
212
+ newTopLeft[1] + Math.abs(newBoundsHeight) / 2,
213
+ ];
214
+ const rotatedNewCenter = rotatePoint(newCenter, startCenter, angle);
215
+ newTopLeft = rotatePoint(rotatedTopLeft, rotatedNewCenter, -angle);
216
+ const resizedElement = {
217
+ width: Math.abs(newWidth),
218
+ height: Math.abs(metrics.height),
219
+ x: newTopLeft[0],
220
+ y: newTopLeft[1],
221
+ text,
222
+ autoResize: false,
223
+ };
224
+ mutateElement(element, resizedElement);
225
+ }
159
226
  };
160
227
  export const resizeSingleElement = (originalElements, shouldMaintainAspectRatio, element, elementsMap, transformHandleDirection, shouldResizeFromCenter, pointerX, pointerY) => {
161
228
  const stateAtResizeStart = originalElements.get(element.id);
@@ -364,7 +431,7 @@ export const resizeSingleElement = (originalElements, shouldMaintainAspectRatio,
364
431
  handleBindTextResize(element, elementsMap, transformHandleDirection, shouldMaintainAspectRatio);
365
432
  }
366
433
  };
367
- export const resizeMultipleElements = (originalElements, selectedElements, elementsMap, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {
434
+ export const resizeMultipleElements = (originalElements, selectedElements, elementsMap, transformHandleType, shouldResizeFromCenter, shouldMaintainAspectRatio, pointerX, pointerY) => {
368
435
  // map selected elements to the original elements. While it never should
369
436
  // happen that pointerDownState.originalElements won't contain the selected
370
437
  // elements during resize, this coupling isn't guaranteed, so to ensure
@@ -396,29 +463,54 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
396
463
  return [...acc, { ...text, ...xy }];
397
464
  }, []);
398
465
  const { minX, minY, maxX, maxY, midX, midY } = getCommonBoundingBox(targetElements.map(({ orig }) => orig).concat(boundTextElements));
399
- // const originalHeight = maxY - minY;
400
- // const originalWidth = maxX - minX;
466
+ const width = maxX - minX;
467
+ const height = maxY - minY;
401
468
  const direction = transformHandleType;
402
- const mapDirectionsToAnchors = {
469
+ const anchorsMap = {
403
470
  ne: [minX, maxY],
404
471
  se: [minX, minY],
405
472
  sw: [maxX, minY],
406
473
  nw: [maxX, maxY],
474
+ e: [minX, minY + height / 2],
475
+ w: [maxX, minY + height / 2],
476
+ n: [minX + width / 2, maxY],
477
+ s: [minX + width / 2, minY],
407
478
  };
408
479
  // anchor point must be on the opposite side of the dragged selection handle
409
480
  // or be the center of the selection if shouldResizeFromCenter
410
481
  const [anchorX, anchorY] = shouldResizeFromCenter
411
482
  ? [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);
483
+ : anchorsMap[direction];
484
+ const resizeFromCenterScale = shouldResizeFromCenter ? 2 : 1;
485
+ const scale = Math.max(Math.abs(pointerX - anchorX) / width || 0, Math.abs(pointerY - anchorY) / height || 0) * resizeFromCenterScale;
414
486
  if (scale === 0) {
415
487
  return;
416
488
  }
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],
489
+ let scaleX = direction.includes("e") || direction.includes("w")
490
+ ? (Math.abs(pointerX - anchorX) / width) * resizeFromCenterScale
491
+ : 1;
492
+ let scaleY = direction.includes("n") || direction.includes("s")
493
+ ? (Math.abs(pointerY - anchorY) / height) * resizeFromCenterScale
494
+ : 1;
495
+ const keepAspectRatio = shouldMaintainAspectRatio ||
496
+ targetElements.some((item) => item.latest.angle !== 0 ||
497
+ isTextElement(item.latest) ||
498
+ isInGroup(item.latest));
499
+ if (keepAspectRatio) {
500
+ scaleX = scale;
501
+ scaleY = scale;
502
+ }
503
+ const flipConditionsMap = {
504
+ ne: [pointerX < anchorX, pointerY > anchorY],
505
+ se: [pointerX < anchorX, pointerY < anchorY],
506
+ sw: [pointerX > anchorX, pointerY < anchorY],
507
+ nw: [pointerX > anchorX, pointerY > anchorY],
508
+ // e.g. when resizing from the "e" side, we do not need to consider changes in the `y` direction
509
+ // and therefore, we do not need to flip in the `y` direction at all
510
+ e: [pointerX < anchorX, false],
511
+ w: [pointerX > anchorX, false],
512
+ n: [false, pointerY > anchorY],
513
+ s: [false, pointerY < anchorY],
422
514
  };
423
515
  /**
424
516
  * to flip an element:
@@ -428,7 +520,7 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
428
520
  * mirror points in the case of linear & freedraw elemenets
429
521
  * 3. adjust element angle
430
522
  */
431
- const [flipFactorX, flipFactorY] = mapDirectionsToPointerPositions[direction].map((condition) => (condition ? 1 : -1));
523
+ const [flipFactorX, flipFactorY] = flipConditionsMap[direction].map((condition) => (condition ? -1 : 1));
432
524
  const isFlippedByX = flipFactorX < 0;
433
525
  const isFlippedByY = flipFactorY < 0;
434
526
  const elementsAndUpdates = [];
@@ -437,16 +529,16 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
437
529
  if (isTextElement(orig) && isBoundToContainer(orig)) {
438
530
  continue;
439
531
  }
440
- const width = orig.width * scale;
441
- const height = orig.height * scale;
532
+ const width = orig.width * scaleX;
533
+ const height = orig.height * scaleY;
442
534
  const angle = normalizeAngle(orig.angle * flipFactorX * flipFactorY);
443
535
  const isLinearOrFreeDraw = isLinearElement(orig) || isFreeDrawElement(orig);
444
536
  const offsetX = orig.x - anchorX;
445
537
  const offsetY = orig.y - anchorY;
446
538
  const shiftX = isFlippedByX && !isLinearOrFreeDraw ? width : 0;
447
539
  const shiftY = isFlippedByY && !isLinearOrFreeDraw ? height : 0;
448
- const x = anchorX + flipFactorX * (offsetX * scale + shiftX);
449
- const y = anchorY + flipFactorY * (offsetY * scale + shiftY);
540
+ const x = anchorX + flipFactorX * (offsetX * scaleX + shiftX);
541
+ const y = anchorY + flipFactorY * (offsetY * scaleY + shiftY);
450
542
  const rescaledPoints = rescalePointsInElement(orig, width * flipFactorX, height * flipFactorY, false);
451
543
  const update = {
452
544
  x,
@@ -456,30 +548,9 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
456
548
  angle,
457
549
  ...rescaledPoints,
458
550
  };
459
- if (isImageElement(orig) && targetElements.length === 1) {
551
+ if (isImageElement(orig)) {
460
552
  update.scale = [orig.scale[0] * flipFactorX, orig.scale[1] * flipFactorY];
461
553
  }
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
554
  if (isTextElement(orig)) {
484
555
  const metrics = measureFontSizeFromWidth(orig, elementsMap, width);
485
556
  if (!metrics) {
@@ -489,11 +560,16 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
489
560
  }
490
561
  const boundTextElement = originalElements.get(getBoundTextElementId(orig) ?? "");
491
562
  if (boundTextElement) {
492
- const newFontSize = boundTextElement.fontSize * scale;
493
- if (newFontSize < MIN_FONT_SIZE) {
494
- return;
563
+ if (keepAspectRatio) {
564
+ const newFontSize = boundTextElement.fontSize * scale;
565
+ if (newFontSize < MIN_FONT_SIZE) {
566
+ return;
567
+ }
568
+ update.boundTextFontSize = newFontSize;
569
+ }
570
+ else {
571
+ update.boundTextFontSize = boundTextElement.fontSize;
495
572
  }
496
- update.boundTextFontSize = newFontSize;
497
573
  }
498
574
  elementsAndUpdates.push({
499
575
  element: latest,
@@ -517,7 +593,7 @@ export const resizeMultipleElements = (originalElements, selectedElements, eleme
517
593
  handleBindTextResize(element, elementsMap, transformHandleType, true);
518
594
  }
519
595
  }
520
- Scene.getScene(elementsAndUpdates[0].element)?.informMutation();
596
+ Scene.getScene(elementsAndUpdates[0].element)?.triggerUpdate();
521
597
  };
522
598
  const rotateMultipleElements = (originalElements, elements, elementsMap, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY) => {
523
599
  let centerAngle = (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);
@@ -550,7 +626,7 @@ const rotateMultipleElements = (originalElements, elements, elementsMap, pointer
550
626
  }, false);
551
627
  }
552
628
  });
553
- Scene.getScene(elements[0])?.informMutation();
629
+ Scene.getScene(elements[0])?.triggerUpdate();
554
630
  };
555
631
  export const getResizeOffsetXY = (transformHandleType, selectedElements, elementsMap, x, y) => {
556
632
  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) => {
@@ -87,4 +87,5 @@ export declare const FONT_METRICS: Record<number, {
87
87
  export declare const getDefaultLineHeight: (fontFamily: FontFamilyValues) => number & {
88
88
  _brand: "unitlessLineHeight";
89
89
  };
90
+ export declare const getMinTextElementWidth: (font: FontString, lineHeight: ExcalidrawTextElement["lineHeight"]) => number;
90
91
  export {};
@@ -13,7 +13,7 @@ export const normalizeText = (text) => {
13
13
  const splitIntoLines = (text) => {
14
14
  return normalizeText(text).split("\n");
15
15
  };
16
- export const redrawTextBoundingBox = (textElement, container, elementsMap) => {
16
+ export const redrawTextBoundingBox = (textElement, container, elementsMap, informMutation = true) => {
17
17
  let maxWidth = undefined;
18
18
  const boundTextUpdates = {
19
19
  x: textElement.x,
@@ -21,26 +21,32 @@ export const redrawTextBoundingBox = (textElement, container, elementsMap) => {
21
21
  text: textElement.text,
22
22
  width: textElement.width,
23
23
  height: textElement.height,
24
+ angle: container?.angle ?? textElement.angle,
24
25
  };
25
26
  boundTextUpdates.text = textElement.text;
26
- if (container) {
27
- maxWidth = getBoundTextMaxWidth(container, textElement);
27
+ if (container || !textElement.autoResize) {
28
+ maxWidth = container
29
+ ? getBoundTextMaxWidth(container, textElement)
30
+ : textElement.width;
28
31
  boundTextUpdates.text = wrapText(textElement.originalText, getFontString(textElement), maxWidth);
29
32
  }
30
33
  const metrics = measureText(boundTextUpdates.text, getFontString(textElement), textElement.lineHeight);
31
- boundTextUpdates.width = metrics.width;
34
+ // Note: only update width for unwrapped text and bound texts (which always have autoResize set to true)
35
+ if (textElement.autoResize) {
36
+ boundTextUpdates.width = metrics.width;
37
+ }
32
38
  boundTextUpdates.height = metrics.height;
33
39
  if (container) {
34
40
  const maxContainerHeight = getBoundTextMaxHeight(container, textElement);
35
41
  const maxContainerWidth = getBoundTextMaxWidth(container, textElement);
36
42
  if (!isArrowElement(container) && metrics.height > maxContainerHeight) {
37
43
  const nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);
38
- mutateElement(container, { height: nextHeight });
44
+ mutateElement(container, { height: nextHeight }, informMutation);
39
45
  updateOriginalContainerCache(container.id, nextHeight);
40
46
  }
41
47
  if (metrics.width > maxContainerWidth) {
42
48
  const nextWidth = computeContainerDimensionForBoundText(metrics.width, container.type);
43
- mutateElement(container, { width: nextWidth });
49
+ mutateElement(container, { width: nextWidth }, informMutation);
44
50
  }
45
51
  const updatedTextElement = {
46
52
  ...textElement,
@@ -50,7 +56,7 @@ export const redrawTextBoundingBox = (textElement, container, elementsMap) => {
50
56
  boundTextUpdates.x = x;
51
57
  boundTextUpdates.y = y;
52
58
  }
53
- mutateElement(textElement, boundTextUpdates);
59
+ mutateElement(textElement, boundTextUpdates, informMutation);
54
60
  };
55
61
  export const bindTextToShapeAfterDuplication = (newElements, oldElements, oldIdToDuplicatedId) => {
56
62
  const newElementsMap = arrayToMap(newElements);
@@ -660,3 +666,6 @@ export const getDefaultLineHeight = (fontFamily) => {
660
666
  }
661
667
  return DEFAULT_LINE_HEIGHT[DEFAULT_FONT_FAMILY];
662
668
  };
669
+ export const getMinTextElementWidth = (font, lineHeight) => {
670
+ return measureText("", font, lineHeight).width + BOUND_TEXT_PADDING * 2;
671
+ };