@dwelle/excalidraw 0.5.0-3bc80da → 0.5.0-3f1f8dd

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 (427) hide show
  1. package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-AV5QRETN.js → blockDiagram-91b80b7a-ILS6OLW7.js} +6 -6
  2. package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-76KP7R2J.js → c4Diagram-b2a90758-ZOMIZS7C.js} +4 -4
  3. package/dist/browser/dev/excalidraw-assets-dev/{chunk-VC5KAH7K.js → chunk-2NKYQ7YO.js} +7 -7
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-5A2HLTCS.js → chunk-6MVAKZD7.js} +3 -3
  5. package/dist/browser/dev/excalidraw-assets-dev/{chunk-ETW42MP7.js → chunk-A3JTYPH7.js} +3 -3
  6. package/dist/browser/dev/excalidraw-assets-dev/{chunk-72BUNPBM.js → chunk-BUWJGA2Q.js} +1814 -1411
  7. package/dist/browser/dev/excalidraw-assets-dev/chunk-BUWJGA2Q.js.map +7 -0
  8. package/dist/browser/dev/excalidraw-assets-dev/{chunk-LQ6UJQPH.js → chunk-F3FIDJD4.js} +38 -16
  9. package/dist/browser/dev/excalidraw-assets-dev/chunk-F3FIDJD4.js.map +7 -0
  10. package/dist/browser/dev/excalidraw-assets-dev/{chunk-EGR52Q6D.js → chunk-FPTNVFSO.js} +3 -3
  11. package/dist/browser/dev/excalidraw-assets-dev/{chunk-NZKR3TXM.js → chunk-HPTO4BUO.js} +28 -28
  12. package/dist/browser/dev/excalidraw-assets-dev/chunk-HPTO4BUO.js.map +7 -0
  13. package/dist/browser/dev/excalidraw-assets-dev/{chunk-RT5XHPGC.js → chunk-JAMLJD7O.js} +3 -3
  14. package/dist/browser/dev/excalidraw-assets-dev/{chunk-7V2SB4RU.js → chunk-LOACNU4P.js} +4 -4
  15. package/dist/browser/dev/excalidraw-assets-dev/{chunk-RC7ANJ5H.js → chunk-QGBZMLTJ.js} +3 -3
  16. package/dist/browser/dev/excalidraw-assets-dev/{chunk-BHIY32T7.js → chunk-RLV4E4WN.js} +3 -3
  17. package/dist/browser/dev/excalidraw-assets-dev/{chunk-ASZRDHCI.js → chunk-SHPKYTPS.js} +5 -5
  18. package/dist/browser/dev/excalidraw-assets-dev/{chunk-ADIHRQXG.js → chunk-WYUX2CK4.js} +4 -4
  19. package/dist/browser/dev/excalidraw-assets-dev/{chunk-LSPV6OUU.js → chunk-YAYXS7DC.js} +2 -2
  20. package/dist/browser/dev/excalidraw-assets-dev/{chunk-AKQDHN2W.js → chunk-YGAE3YWH.js} +5 -3
  21. package/dist/browser/dev/excalidraw-assets-dev/chunk-YGAE3YWH.js.map +7 -0
  22. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-KKFMJDII.js → classDiagram-30eddba6-YGYWOEDS.js} +6 -6
  23. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-H6OLRXIM.js → classDiagram-v2-f2df5561-4ZZOSFAG.js} +9 -9
  24. package/dist/browser/dev/excalidraw-assets-dev/{directory-open-01563666-JDTB6SPR.js → directory-open-01563666-QTUC5QKS.js} +2 -2
  25. package/dist/browser/dev/excalidraw-assets-dev/{directory-open-4ed118d0-JL7GGNMJ.js → directory-open-4ed118d0-EAOFXSXO.js} +2 -2
  26. package/dist/browser/dev/excalidraw-assets-dev/dist-V4ZSY6BC.js +10 -0
  27. package/dist/browser/dev/excalidraw-assets-dev/{en-PSBMWL4S.js → en-RSUSLGPV.js} +2 -2
  28. package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-N5L7DKGN.js → erDiagram-47591fe2-JIHVWX3W.js} +5 -5
  29. package/dist/browser/dev/excalidraw-assets-dev/{file-open-002ab408-YDSARWPZ.js → file-open-002ab408-UPAWPTEF.js} +2 -2
  30. package/dist/browser/dev/excalidraw-assets-dev/{file-open-7c801643-EROXTFSX.js → file-open-7c801643-N5N32MHQ.js} +2 -2
  31. package/dist/browser/dev/excalidraw-assets-dev/{file-save-3189631c-TL6V2OEY.js → file-save-3189631c-PRH4NPQ5.js} +2 -2
  32. package/dist/browser/dev/excalidraw-assets-dev/{file-save-745eba88-6WWZFABL.js → file-save-745eba88-5GM4HHWQ.js} +2 -2
  33. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-VRM36QCA.js → flowDiagram-5540d9b9-6CLLUMWF.js} +10 -10
  34. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-3CAUSA7W.js → flowDiagram-v2-3b53844e-NBMLQH3M.js} +10 -10
  35. package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-ODK3QXSV.js → flowchart-elk-definition-5fe447d6-UEQSCXLT.js} +6 -6
  36. package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-KKXGBNQI.js → ganttDiagram-9a3bba1f-WK2H7LFS.js} +3 -3
  37. package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-TMH7E2V3.js → gitGraphDiagram-96e6b4ee-KDAA2U2K.js} +3 -3
  38. package/dist/browser/dev/excalidraw-assets-dev/{image-DTHOT6RB.js → image-IPNHMJTL.js} +6 -6
  39. package/dist/browser/dev/excalidraw-assets-dev/{image-FDQLNM24.css → image-JYKIJPJC.css} +11 -14
  40. package/dist/browser/dev/excalidraw-assets-dev/image-JYKIJPJC.css.map +7 -0
  41. package/dist/browser/dev/excalidraw-assets-dev/{image-blob-reduce.esm-COPHY4CW.js → image-blob-reduce.esm-LQUP674P.js} +2 -2
  42. package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-VF34AT6C.js → infoDiagram-bcd20f53-JHVEGFM5.js} +3 -3
  43. package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-I4SJ2IBL.js → journeyDiagram-4fe6b3dc-LELHHHNL.js} +4 -4
  44. package/dist/browser/dev/excalidraw-assets-dev/{katex-SVKNABMQ.js → katex-24LMEI2S.js} +2 -2
  45. package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-PZW6XTRC.js → mindmap-definition-f354de21-EIYHHYCX.js} +4 -4
  46. package/dist/browser/dev/excalidraw-assets-dev/{pica-KKOK34SZ.js → pica-AEP6VYOH.js} +2 -2
  47. package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-JATUFGKC.js → pieDiagram-79897490-LKE2EHUL.js} +3 -3
  48. package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-V5FY6DEM.js → quadrantDiagram-62f64e94-HZHJFQUT.js} +3 -3
  49. package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZHT5V47S.js → requirementDiagram-05bf5f74-FXXIEN7J.js} +5 -5
  50. package/dist/browser/dev/excalidraw-assets-dev/{roundRect-ZX3RASBO.js → roundRect-5PHKZGUZ.js} +2 -2
  51. package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-ELYQDLSC.js → sankeyDiagram-97764748-KKTB5UYB.js} +3 -3
  52. package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-GEO2ZAH2.js → sequenceDiagram-acc0e65c-KPIADG32.js} +4 -4
  53. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-BLHQKXOS.js → stateDiagram-0ff1cf1a-IQUWRAPJ.js} +6 -6
  54. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-XFLTR7I5.js → stateDiagram-v2-9a9d610d-3OAKVFDX.js} +9 -9
  55. package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-6DNHPFX5.js → timeline-definition-fea2a41d-TRDW4746.js} +3 -3
  56. package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-4S5CTHTW.js → xychartDiagram-ab372869-IMLIZWMU.js} +4 -4
  57. package/dist/browser/dev/index.css +10 -13
  58. package/dist/browser/dev/index.css.map +2 -2
  59. package/dist/browser/dev/index.js +5 -5
  60. package/dist/browser/prod/excalidraw-assets/{blockDiagram-91b80b7a-JEM7KGWA.js → blockDiagram-91b80b7a-U252OY5I.js} +1 -1
  61. package/dist/browser/prod/excalidraw-assets/{c4Diagram-b2a90758-MPCOLKKP.js → c4Diagram-b2a90758-PZHH3D6H.js} +1 -1
  62. package/dist/browser/prod/excalidraw-assets/{chunk-U2OTJT7X.js → chunk-2Q2CONEB.js} +1 -1
  63. package/dist/browser/prod/excalidraw-assets/{chunk-6AI4F5QL.js → chunk-673OVD3J.js} +1 -1
  64. package/dist/browser/prod/excalidraw-assets/{chunk-OVXHC22A.js → chunk-6WNOLTTI.js} +1 -1
  65. package/dist/browser/prod/excalidraw-assets/{chunk-HSQV5QPE.js → chunk-74OJXQQW.js} +1 -1
  66. package/dist/browser/prod/excalidraw-assets/{chunk-6EO6NUHK.js → chunk-AFIKGZ5K.js} +1 -1
  67. package/dist/browser/prod/excalidraw-assets/{chunk-722XS4R3.js → chunk-BEIT5EF6.js} +1 -1
  68. package/dist/browser/prod/excalidraw-assets/{chunk-7P65EP4L.js → chunk-BZSIRHFI.js} +1 -1
  69. package/dist/browser/prod/excalidraw-assets/chunk-DIQBR7TD.js +7 -0
  70. package/dist/browser/prod/excalidraw-assets/{chunk-VVPLNHF7.js → chunk-EHJPIGV7.js} +1 -1
  71. package/dist/browser/prod/excalidraw-assets/{chunk-JVAZGNHG.js → chunk-JP7OGUWY.js} +21 -21
  72. package/dist/browser/prod/excalidraw-assets/{chunk-Y5GBBDDT.js → chunk-LJU3KBAH.js} +1 -1
  73. package/dist/browser/prod/excalidraw-assets/chunk-MZQB665Y.js +335 -0
  74. package/dist/browser/prod/excalidraw-assets/{chunk-VMMEDW7P.js → chunk-NN5GPCYQ.js} +1 -1
  75. package/dist/browser/prod/excalidraw-assets/{chunk-ICDT7GZX.js → chunk-PLOZZA4H.js} +1 -1
  76. package/dist/browser/prod/excalidraw-assets/{chunk-BJTCWAK5.js → chunk-SCZE4QLN.js} +2 -2
  77. package/dist/browser/prod/excalidraw-assets/{chunk-Q6QP4TRB.js → chunk-VVOVJRKV.js} +2 -2
  78. package/dist/browser/prod/excalidraw-assets/{classDiagram-30eddba6-L5O4YQR4.js → classDiagram-30eddba6-F55Z2E53.js} +1 -1
  79. package/dist/browser/prod/excalidraw-assets/{classDiagram-v2-f2df5561-FEFNEE7Y.js → classDiagram-v2-f2df5561-BT5JNEDE.js} +1 -1
  80. package/dist/browser/prod/excalidraw-assets/{directory-open-01563666-AYWCK7BJ.js → directory-open-01563666-6YO3OQDX.js} +1 -1
  81. package/dist/browser/prod/excalidraw-assets/{directory-open-4ed118d0-QI47HV3G.js → directory-open-4ed118d0-4LV3RSSM.js} +1 -1
  82. package/dist/browser/prod/excalidraw-assets/dist-4LC2UFYB.js +1 -0
  83. package/dist/browser/prod/excalidraw-assets/{en-MPFDZHEH.js → en-GM5O55AO-LNPCBS7J.js} +1 -1
  84. package/dist/browser/prod/excalidraw-assets/{en-Q552WR7L-QAV42NF3.js → en-SOC7FEW5.js} +1 -1
  85. package/dist/browser/prod/excalidraw-assets/{erDiagram-47591fe2-BI5PYUZN.js → erDiagram-47591fe2-XG2ZEMCB.js} +1 -1
  86. package/dist/browser/prod/excalidraw-assets/{file-open-002ab408-55ZWRNMG.js → file-open-002ab408-A6LI262V.js} +1 -1
  87. package/dist/browser/prod/excalidraw-assets/{file-open-7c801643-HBAOEEFX.js → file-open-7c801643-BBGJO4PI.js} +1 -1
  88. package/dist/browser/prod/excalidraw-assets/{file-save-3189631c-FJ75SUZ7.js → file-save-3189631c-7RDEYICA.js} +1 -1
  89. package/dist/browser/prod/excalidraw-assets/{file-save-745eba88-RAVXYEAW.js → file-save-745eba88-4PPFVJWD.js} +1 -1
  90. package/dist/browser/prod/excalidraw-assets/{flowDiagram-5540d9b9-CYU56524.js → flowDiagram-5540d9b9-2SENIXRT.js} +1 -1
  91. package/dist/browser/prod/excalidraw-assets/flowDiagram-v2-3b53844e-KLBTW5WV.js +1 -0
  92. package/dist/browser/prod/excalidraw-assets/{flowchart-elk-definition-5fe447d6-PECNKVTE.js → flowchart-elk-definition-5fe447d6-TLXFCSNW.js} +1 -1
  93. package/dist/browser/prod/excalidraw-assets/{ganttDiagram-9a3bba1f-CED7COSZ.js → ganttDiagram-9a3bba1f-5JR6PUBI.js} +1 -1
  94. package/dist/browser/prod/excalidraw-assets/{gitGraphDiagram-96e6b4ee-JKIKIQ6K.js → gitGraphDiagram-96e6b4ee-6A6CZ3PI.js} +1 -1
  95. package/dist/browser/prod/excalidraw-assets/image-MFUVVFOH.js +1 -0
  96. package/dist/browser/prod/excalidraw-assets/{image-blob-reduce.esm-JZQK2EOW.js → image-blob-reduce.esm-MLHV7PI7.js} +1 -1
  97. package/dist/browser/prod/excalidraw-assets/{infoDiagram-bcd20f53-FN22PGWX.js → infoDiagram-bcd20f53-AV3OBV2N.js} +1 -1
  98. package/dist/browser/prod/excalidraw-assets/{journeyDiagram-4fe6b3dc-4YOSXQFH.js → journeyDiagram-4fe6b3dc-BLHDTOGZ.js} +1 -1
  99. package/dist/browser/prod/excalidraw-assets/{katex-VZTZSNIY.js → katex-WDF2YXSQ.js} +1 -1
  100. package/dist/browser/prod/excalidraw-assets/{mindmap-definition-f354de21-F3HVRHRH.js → mindmap-definition-f354de21-ZETPFZUU.js} +1 -1
  101. package/dist/browser/prod/excalidraw-assets/{pica-UIPUQYNH.js → pica-EKWSA7DQ.js} +1 -1
  102. package/dist/browser/prod/excalidraw-assets/{pieDiagram-79897490-2EPJDOIF.js → pieDiagram-79897490-YIGOGIGU.js} +1 -1
  103. package/dist/browser/prod/excalidraw-assets/{quadrantDiagram-62f64e94-DOUD6GJY.js → quadrantDiagram-62f64e94-PKU6OGXK.js} +1 -1
  104. package/dist/browser/prod/excalidraw-assets/{requirementDiagram-05bf5f74-6SN5DKRA.js → requirementDiagram-05bf5f74-ZS6DWQXC.js} +1 -1
  105. package/dist/browser/prod/excalidraw-assets/{roundRect-KPNU7DEE.js → roundRect-LMXTT73M.js} +1 -1
  106. package/dist/browser/prod/excalidraw-assets/{sankeyDiagram-97764748-UWC7MPXQ.js → sankeyDiagram-97764748-BAQTPNXW.js} +1 -1
  107. package/dist/browser/prod/excalidraw-assets/{sequenceDiagram-acc0e65c-F6IOZYAD.js → sequenceDiagram-acc0e65c-ZGG6MEZO.js} +1 -1
  108. package/dist/browser/prod/excalidraw-assets/{stateDiagram-0ff1cf1a-BFMFLWOS.js → stateDiagram-0ff1cf1a-FF7QI5F7.js} +1 -1
  109. package/dist/browser/prod/excalidraw-assets/{stateDiagram-v2-9a9d610d-5VQQPAQD.js → stateDiagram-v2-9a9d610d-K3KQFXGQ.js} +1 -1
  110. package/dist/browser/prod/excalidraw-assets/{timeline-definition-fea2a41d-7E3BGOKT.js → timeline-definition-fea2a41d-2A5Y4OLK.js} +1 -1
  111. package/dist/browser/prod/excalidraw-assets/{xychartDiagram-ab372869-THLWKJ2H.js → xychartDiagram-ab372869-RKDU5XOA.js} +1 -1
  112. package/dist/browser/prod/index.css +1 -1
  113. package/dist/browser/prod/index.js +15 -15
  114. package/dist/{prod/en-Q552WR7L.json → dev/en-GM5O55AO.json} +4 -2
  115. package/dist/dev/index.css +10 -13
  116. package/dist/dev/index.css.map +2 -2
  117. package/dist/dev/index.js +1606 -1192
  118. package/dist/dev/index.js.map +4 -4
  119. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +3 -3
  120. package/dist/excalidraw/actions/actionAlign.d.ts +8 -8
  121. package/dist/excalidraw/actions/actionBoundText.d.ts +6 -6
  122. package/dist/excalidraw/actions/actionBoundText.js +3 -1
  123. package/dist/excalidraw/actions/actionCanvas.d.ts +16 -16
  124. package/dist/excalidraw/actions/actionClipboard.d.ts +12 -12
  125. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +5 -5
  126. package/dist/excalidraw/actions/actionDistribute.d.ts +4 -4
  127. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +3 -3
  128. package/dist/excalidraw/actions/actionElementLock.d.ts +3 -3
  129. package/dist/excalidraw/actions/actionExport.d.ts +12 -12
  130. package/dist/excalidraw/actions/actionFinalize.d.ts +3 -3
  131. package/dist/excalidraw/actions/actionFlip.d.ts +4 -4
  132. package/dist/excalidraw/actions/actionFlip.js +6 -7
  133. package/dist/excalidraw/actions/actionFrame.d.ts +314 -6
  134. package/dist/excalidraw/actions/actionGroup.d.ts +314 -4
  135. package/dist/excalidraw/actions/actionHistory.d.ts +3 -3
  136. package/dist/excalidraw/actions/actionHistory.js +4 -4
  137. package/dist/excalidraw/actions/actionLinearEditor.d.ts +5 -3
  138. package/dist/excalidraw/actions/actionLinearEditor.js +19 -4
  139. package/dist/excalidraw/actions/actionLink.d.ts +1 -1
  140. package/dist/excalidraw/actions/actionMenu.d.ts +3 -3
  141. package/dist/excalidraw/actions/actionNavigate.d.ts +3 -3
  142. package/dist/excalidraw/actions/actionProperties.d.ts +15 -15
  143. package/dist/excalidraw/actions/actionProperties.js +1 -1
  144. package/dist/excalidraw/actions/actionSelectAll.d.ts +2 -2
  145. package/dist/excalidraw/actions/actionStyles.d.ts +5 -2
  146. package/dist/excalidraw/actions/actionTextAutoResize.d.ts +17 -0
  147. package/dist/excalidraw/actions/actionTextAutoResize.js +38 -0
  148. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +2 -2
  149. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +1 -1
  150. package/dist/excalidraw/actions/actionToggleStats.d.ts +1 -1
  151. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +1 -1
  152. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +1 -1
  153. package/dist/excalidraw/actions/actionZindex.d.ts +8 -4
  154. package/dist/excalidraw/actions/actionZindex.js +4 -0
  155. package/dist/excalidraw/actions/manager.d.ts +3 -3
  156. package/dist/excalidraw/actions/register.d.ts +1 -1
  157. package/dist/excalidraw/actions/shortcuts.d.ts +2 -2
  158. package/dist/excalidraw/actions/types.d.ts +6 -6
  159. package/dist/excalidraw/align.d.ts +1 -1
  160. package/dist/excalidraw/animated-trail.d.ts +2 -2
  161. package/dist/excalidraw/appState.d.ts +1 -1
  162. package/dist/excalidraw/change.d.ts +4 -4
  163. package/dist/excalidraw/change.js +14 -7
  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 +10 -11
  172. package/dist/excalidraw/components/App.js +187 -95
  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 +5 -5
  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/DefaultSidebar.d.ts +2 -2
  197. package/dist/excalidraw/components/Dialog.js +1 -1
  198. package/dist/excalidraw/components/DialogActionButton.d.ts +1 -1
  199. package/dist/excalidraw/components/EyeDropper.d.ts +2 -2
  200. package/dist/excalidraw/components/FollowMode/FollowMode.d.ts +1 -1
  201. package/dist/excalidraw/components/FollowMode/FollowMode.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 +2 -2
  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 +1 -1
  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.d.ts +2 -2
  234. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +1 -1
  235. package/dist/excalidraw/components/TTDDialog/TTDDialog.js +2 -2
  236. package/dist/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +1 -1
  237. package/dist/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +1 -1
  238. package/dist/excalidraw/components/TTDDialog/TTDDialogPanels.d.ts +1 -1
  239. package/dist/excalidraw/components/TTDDialog/TTDDialogTabs.d.ts +1 -1
  240. package/dist/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -1
  241. package/dist/excalidraw/components/TTDDialog/common.d.ts +4 -4
  242. package/dist/excalidraw/components/TextField.d.ts +1 -1
  243. package/dist/excalidraw/components/Toast.d.ts +1 -1
  244. package/dist/excalidraw/components/ToolButton.d.ts +3 -2
  245. package/dist/excalidraw/components/Trans.d.ts +1 -1
  246. package/dist/excalidraw/components/UserList.d.ts +1 -1
  247. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +5 -3
  248. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +5 -2
  249. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +2 -2
  250. package/dist/excalidraw/components/canvases/StaticCanvas.js +2 -2
  251. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +2 -2
  252. package/dist/excalidraw/components/footer/Footer.d.ts +2 -2
  253. package/dist/excalidraw/components/hyperlink/Hyperlink.d.ts +2 -2
  254. package/dist/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  255. package/dist/excalidraw/components/icons.d.ts +3 -2
  256. package/dist/excalidraw/components/icons.js +19 -6
  257. package/dist/excalidraw/constants.d.ts +5 -2
  258. package/dist/excalidraw/constants.js +10 -0
  259. package/dist/excalidraw/context/ui-appState.d.ts +1 -1
  260. package/dist/excalidraw/cursor.d.ts +1 -1
  261. package/dist/excalidraw/data/EditorLocalStorage.d.ts +2 -2
  262. package/dist/excalidraw/data/blob.d.ts +5 -5
  263. package/dist/excalidraw/data/filesystem.d.ts +2 -1
  264. package/dist/excalidraw/data/index.d.ts +4 -4
  265. package/dist/excalidraw/data/json.d.ts +3 -3
  266. package/dist/excalidraw/data/library.d.ts +3 -3
  267. package/dist/excalidraw/data/magic.d.ts +3 -3
  268. package/dist/excalidraw/data/reconcile.d.ts +3 -3
  269. package/dist/excalidraw/data/resave.d.ts +2 -2
  270. package/dist/excalidraw/data/resave.js +1 -1
  271. package/dist/excalidraw/data/restore.d.ts +3 -3
  272. package/dist/excalidraw/data/restore.js +3 -0
  273. package/dist/excalidraw/data/transform.d.ts +3 -3
  274. package/dist/excalidraw/data/types.d.ts +3 -3
  275. package/dist/excalidraw/element/ElementCanvasButtons.d.ts +1 -1
  276. package/dist/excalidraw/element/binding.d.ts +5 -19
  277. package/dist/excalidraw/element/binding.js +109 -90
  278. package/dist/excalidraw/element/bounds.d.ts +3 -3
  279. package/dist/excalidraw/element/collision.d.ts +3 -3
  280. package/dist/excalidraw/element/collision.js +1 -1
  281. package/dist/excalidraw/element/containerCache.d.ts +1 -1
  282. package/dist/excalidraw/element/dragElements.d.ts +4 -4
  283. package/dist/excalidraw/element/dragElements.js +27 -3
  284. package/dist/excalidraw/element/embeddable.d.ts +4 -4
  285. package/dist/excalidraw/element/image.d.ts +2 -2
  286. package/dist/excalidraw/element/index.d.ts +2 -2
  287. package/dist/excalidraw/element/index.js +1 -1
  288. package/dist/excalidraw/element/linearElementEditor.d.ts +4 -4
  289. package/dist/excalidraw/element/mutateElement.d.ts +3 -3
  290. package/dist/excalidraw/element/mutateElement.js +5 -3
  291. package/dist/excalidraw/element/newElement.d.ts +5 -8
  292. package/dist/excalidraw/element/newElement.js +16 -14
  293. package/dist/excalidraw/element/resizeElements.d.ts +4 -4
  294. package/dist/excalidraw/element/resizeElements.js +172 -96
  295. package/dist/excalidraw/element/resizeTest.d.ts +7 -7
  296. package/dist/excalidraw/element/resizeTest.js +53 -8
  297. package/dist/excalidraw/element/showSelectedShapeActions.d.ts +2 -2
  298. package/dist/excalidraw/element/sizeHelpers.d.ts +2 -2
  299. package/dist/excalidraw/element/sortElements.d.ts +1 -1
  300. package/dist/excalidraw/element/textElement.d.ts +5 -4
  301. package/dist/excalidraw/element/textElement.js +11 -3
  302. package/dist/excalidraw/element/textWysiwyg.d.ts +12 -6
  303. package/dist/excalidraw/element/textWysiwyg.js +38 -17
  304. package/dist/excalidraw/element/transformHandles.d.ts +22 -4
  305. package/dist/excalidraw/element/transformHandles.js +22 -11
  306. package/dist/excalidraw/element/typeChecks.d.ts +3 -3
  307. package/dist/excalidraw/element/types.d.ts +11 -4
  308. package/dist/excalidraw/emitter.d.ts +1 -1
  309. package/dist/excalidraw/fractionalIndex.d.ts +1 -1
  310. package/dist/excalidraw/fractionalIndex.js +2 -4
  311. package/dist/excalidraw/frame.d.ts +3 -3
  312. package/dist/excalidraw/gatransforms.d.ts +1 -1
  313. package/dist/excalidraw/gesture.d.ts +1 -1
  314. package/dist/excalidraw/groups.d.ts +4 -3
  315. package/dist/excalidraw/groups.js +3 -0
  316. package/dist/excalidraw/history.d.ts +4 -4
  317. package/dist/excalidraw/hooks/useEmitter.d.ts +1 -1
  318. package/dist/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  319. package/dist/excalidraw/i18n.d.ts +1 -1
  320. package/dist/excalidraw/index.d.ts +1 -1
  321. package/dist/excalidraw/jotai.d.ts +1 -1
  322. package/dist/excalidraw/laser-trails.d.ts +3 -2
  323. package/dist/excalidraw/locales/en.json +4 -2
  324. package/dist/excalidraw/math.d.ts +2 -2
  325. package/dist/excalidraw/mermaid.d.ts +2 -0
  326. package/dist/excalidraw/mermaid.js +28 -0
  327. package/dist/excalidraw/points.d.ts +1 -1
  328. package/dist/excalidraw/queue.d.ts +1 -1
  329. package/dist/excalidraw/renderer/helpers.d.ts +2 -2
  330. package/dist/excalidraw/renderer/interactiveScene.d.ts +2 -2
  331. package/dist/excalidraw/renderer/interactiveScene.js +38 -11
  332. package/dist/excalidraw/renderer/renderElement.d.ts +4 -4
  333. package/dist/excalidraw/renderer/renderElement.js +4 -4
  334. package/dist/excalidraw/renderer/renderSnaps.d.ts +1 -1
  335. package/dist/excalidraw/renderer/staticScene.d.ts +1 -1
  336. package/dist/excalidraw/renderer/staticSvgScene.d.ts +4 -4
  337. package/dist/excalidraw/scene/Fonts.d.ts +2 -4
  338. package/dist/excalidraw/scene/Fonts.js +6 -12
  339. package/dist/excalidraw/scene/Renderer.d.ts +4 -4
  340. package/dist/excalidraw/scene/Renderer.js +2 -3
  341. package/dist/excalidraw/scene/Scene.d.ts +13 -7
  342. package/dist/excalidraw/scene/Scene.js +14 -8
  343. package/dist/excalidraw/scene/Shape.d.ts +1 -1
  344. package/dist/excalidraw/scene/ShapeCache.d.ts +5 -4
  345. package/dist/excalidraw/scene/comparisons.d.ts +2 -2
  346. package/dist/excalidraw/scene/export.d.ts +3 -3
  347. package/dist/excalidraw/scene/export.js +2 -2
  348. package/dist/excalidraw/scene/scroll.d.ts +2 -2
  349. package/dist/excalidraw/scene/scrollbars.d.ts +3 -3
  350. package/dist/excalidraw/scene/selection.d.ts +2 -2
  351. package/dist/excalidraw/scene/types.d.ts +7 -5
  352. package/dist/excalidraw/scene/zoom.d.ts +1 -1
  353. package/dist/excalidraw/snapping.d.ts +4 -4
  354. package/dist/excalidraw/snapping.js +2 -1
  355. package/dist/excalidraw/store.d.ts +34 -4
  356. package/dist/excalidraw/store.js +27 -0
  357. package/dist/excalidraw/types.d.ts +18 -17
  358. package/dist/excalidraw/utils.d.ts +4 -4
  359. package/dist/excalidraw/zindex.d.ts +2 -2
  360. package/dist/{dev/en-Q552WR7L.json → prod/en-GM5O55AO.json} +4 -2
  361. package/dist/prod/index.css +1 -1
  362. package/dist/prod/index.js +41 -41
  363. package/dist/utils/bbox.d.ts +2 -2
  364. package/dist/utils/collision.d.ts +1 -1
  365. package/dist/utils/export.d.ts +1 -1
  366. package/dist/utils/geometry/geometry.d.ts +1 -1
  367. package/dist/utils/geometry/shape.d.ts +1 -1
  368. package/dist/utils/withinBounds.d.ts +1 -1
  369. package/history.ts +4 -4
  370. package/package.json +2 -2
  371. package/dist/browser/dev/excalidraw-assets-dev/chunk-72BUNPBM.js.map +0 -7
  372. package/dist/browser/dev/excalidraw-assets-dev/chunk-AKQDHN2W.js.map +0 -7
  373. package/dist/browser/dev/excalidraw-assets-dev/chunk-LQ6UJQPH.js.map +0 -7
  374. package/dist/browser/dev/excalidraw-assets-dev/chunk-NZKR3TXM.js.map +0 -7
  375. package/dist/browser/dev/excalidraw-assets-dev/dist-QD4SCHJY.js +0 -10
  376. package/dist/browser/dev/excalidraw-assets-dev/image-FDQLNM24.css.map +0 -7
  377. package/dist/browser/prod/excalidraw-assets/chunk-MJ44PPVZ.js +0 -335
  378. package/dist/browser/prod/excalidraw-assets/chunk-W5Q65S7S.js +0 -6
  379. package/dist/browser/prod/excalidraw-assets/dist-5RJKYEVC.js +0 -1
  380. package/dist/browser/prod/excalidraw-assets/flowDiagram-v2-3b53844e-SDQRTWTZ.js +0 -1
  381. package/dist/browser/prod/excalidraw-assets/image-IBX4GOPW.js +0 -1
  382. /package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-AV5QRETN.js.map → blockDiagram-91b80b7a-ILS6OLW7.js.map} +0 -0
  383. /package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-76KP7R2J.js.map → c4Diagram-b2a90758-ZOMIZS7C.js.map} +0 -0
  384. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-VC5KAH7K.js.map → chunk-2NKYQ7YO.js.map} +0 -0
  385. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-5A2HLTCS.js.map → chunk-6MVAKZD7.js.map} +0 -0
  386. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-ETW42MP7.js.map → chunk-A3JTYPH7.js.map} +0 -0
  387. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-EGR52Q6D.js.map → chunk-FPTNVFSO.js.map} +0 -0
  388. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-RT5XHPGC.js.map → chunk-JAMLJD7O.js.map} +0 -0
  389. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-7V2SB4RU.js.map → chunk-LOACNU4P.js.map} +0 -0
  390. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-RC7ANJ5H.js.map → chunk-QGBZMLTJ.js.map} +0 -0
  391. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-BHIY32T7.js.map → chunk-RLV4E4WN.js.map} +0 -0
  392. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-ASZRDHCI.js.map → chunk-SHPKYTPS.js.map} +0 -0
  393. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-ADIHRQXG.js.map → chunk-WYUX2CK4.js.map} +0 -0
  394. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-LSPV6OUU.js.map → chunk-YAYXS7DC.js.map} +0 -0
  395. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-KKFMJDII.js.map → classDiagram-30eddba6-YGYWOEDS.js.map} +0 -0
  396. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-H6OLRXIM.js.map → classDiagram-v2-f2df5561-4ZZOSFAG.js.map} +0 -0
  397. /package/dist/browser/dev/excalidraw-assets-dev/{directory-open-01563666-JDTB6SPR.js.map → directory-open-01563666-QTUC5QKS.js.map} +0 -0
  398. /package/dist/browser/dev/excalidraw-assets-dev/{directory-open-4ed118d0-JL7GGNMJ.js.map → directory-open-4ed118d0-EAOFXSXO.js.map} +0 -0
  399. /package/dist/browser/dev/excalidraw-assets-dev/{dist-QD4SCHJY.js.map → dist-V4ZSY6BC.js.map} +0 -0
  400. /package/dist/browser/dev/excalidraw-assets-dev/{en-PSBMWL4S.js.map → en-RSUSLGPV.js.map} +0 -0
  401. /package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-N5L7DKGN.js.map → erDiagram-47591fe2-JIHVWX3W.js.map} +0 -0
  402. /package/dist/browser/dev/excalidraw-assets-dev/{file-open-002ab408-YDSARWPZ.js.map → file-open-002ab408-UPAWPTEF.js.map} +0 -0
  403. /package/dist/browser/dev/excalidraw-assets-dev/{file-open-7c801643-EROXTFSX.js.map → file-open-7c801643-N5N32MHQ.js.map} +0 -0
  404. /package/dist/browser/dev/excalidraw-assets-dev/{file-save-3189631c-TL6V2OEY.js.map → file-save-3189631c-PRH4NPQ5.js.map} +0 -0
  405. /package/dist/browser/dev/excalidraw-assets-dev/{file-save-745eba88-6WWZFABL.js.map → file-save-745eba88-5GM4HHWQ.js.map} +0 -0
  406. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-VRM36QCA.js.map → flowDiagram-5540d9b9-6CLLUMWF.js.map} +0 -0
  407. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-3CAUSA7W.js.map → flowDiagram-v2-3b53844e-NBMLQH3M.js.map} +0 -0
  408. /package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-ODK3QXSV.js.map → flowchart-elk-definition-5fe447d6-UEQSCXLT.js.map} +0 -0
  409. /package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-KKXGBNQI.js.map → ganttDiagram-9a3bba1f-WK2H7LFS.js.map} +0 -0
  410. /package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-TMH7E2V3.js.map → gitGraphDiagram-96e6b4ee-KDAA2U2K.js.map} +0 -0
  411. /package/dist/browser/dev/excalidraw-assets-dev/{image-DTHOT6RB.js.map → image-IPNHMJTL.js.map} +0 -0
  412. /package/dist/browser/dev/excalidraw-assets-dev/{image-blob-reduce.esm-COPHY4CW.js.map → image-blob-reduce.esm-LQUP674P.js.map} +0 -0
  413. /package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-VF34AT6C.js.map → infoDiagram-bcd20f53-JHVEGFM5.js.map} +0 -0
  414. /package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-I4SJ2IBL.js.map → journeyDiagram-4fe6b3dc-LELHHHNL.js.map} +0 -0
  415. /package/dist/browser/dev/excalidraw-assets-dev/{katex-SVKNABMQ.js.map → katex-24LMEI2S.js.map} +0 -0
  416. /package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-PZW6XTRC.js.map → mindmap-definition-f354de21-EIYHHYCX.js.map} +0 -0
  417. /package/dist/browser/dev/excalidraw-assets-dev/{pica-KKOK34SZ.js.map → pica-AEP6VYOH.js.map} +0 -0
  418. /package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-JATUFGKC.js.map → pieDiagram-79897490-LKE2EHUL.js.map} +0 -0
  419. /package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-V5FY6DEM.js.map → quadrantDiagram-62f64e94-HZHJFQUT.js.map} +0 -0
  420. /package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZHT5V47S.js.map → requirementDiagram-05bf5f74-FXXIEN7J.js.map} +0 -0
  421. /package/dist/browser/dev/excalidraw-assets-dev/{roundRect-ZX3RASBO.js.map → roundRect-5PHKZGUZ.js.map} +0 -0
  422. /package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-ELYQDLSC.js.map → sankeyDiagram-97764748-KKTB5UYB.js.map} +0 -0
  423. /package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-GEO2ZAH2.js.map → sequenceDiagram-acc0e65c-KPIADG32.js.map} +0 -0
  424. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-BLHQKXOS.js.map → stateDiagram-0ff1cf1a-IQUWRAPJ.js.map} +0 -0
  425. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-XFLTR7I5.js.map → stateDiagram-v2-9a9d610d-3OAKVFDX.js.map} +0 -0
  426. /package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-6DNHPFX5.js.map → timeline-definition-fea2a41d-TRDW4746.js.map} +0 -0
  427. /package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-4S5CTHTW.js.map → xychartDiagram-ab372869-IMLIZWMU.js.map} +0 -0
@@ -10,13 +10,14 @@ import { ActionManager } from "../actions/manager";
10
10
  import { actions } from "../actions/register";
11
11
  import { trackEvent } from "../analytics";
12
12
  import { getDefaultAppState, isEraserActive, isHandToolActive, } from "../appState";
13
- import { copyTextToSystemClipboard, parseClipboard, } from "../clipboard";
14
- import { APP_NAME, CURSOR_TYPE, DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT, DEFAULT_VERTICAL_ALIGN, DRAGGING_THRESHOLD, ELEMENT_SHIFT_TRANSLATE_AMOUNT, ELEMENT_TRANSLATE_AMOUNT, ENV, EVENT, FRAME_STYLE, GRID_SIZE, IMAGE_MIME_TYPES, IMAGE_RENDER_TIMEOUT, isBrave, LINE_CONFIRM_THRESHOLD, MAX_ALLOWED_FILE_BYTES, MIME_TYPES, MQ_MAX_HEIGHT_LANDSCAPE, MQ_MAX_WIDTH_LANDSCAPE, MQ_MAX_WIDTH_PORTRAIT, MQ_RIGHT_SIDEBAR_MIN_WIDTH, POINTER_BUTTON, ROUNDNESS, SCROLL_TIMEOUT, TAP_TWICE_TIMEOUT, TEXT_TO_CENTER_SNAP_THRESHOLD, THEME, THEME_FILTER, TOUCH_CTX_MENU_TIMEOUT, VERTICAL_ALIGN, YOUTUBE_STATES, ZOOM_STEP, POINTER_EVENTS, TOOL_TYPE, EDITOR_LS_KEYS, isIOS, supportsResizeObserver, } from "../constants";
13
+ import { copyTextToSystemClipboard, parseClipboard } from "../clipboard";
14
+ import { DEFAULT_FONT_SIZE } from "../constants";
15
+ import { APP_NAME, CURSOR_TYPE, DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT, DEFAULT_VERTICAL_ALIGN, DRAGGING_THRESHOLD, ELEMENT_SHIFT_TRANSLATE_AMOUNT, ELEMENT_TRANSLATE_AMOUNT, ENV, EVENT, FRAME_STYLE, GRID_SIZE, IMAGE_MIME_TYPES, IMAGE_RENDER_TIMEOUT, isBrave, LINE_CONFIRM_THRESHOLD, MAX_ALLOWED_FILE_BYTES, MIME_TYPES, MQ_MAX_HEIGHT_LANDSCAPE, MQ_MAX_WIDTH_LANDSCAPE, MQ_MAX_WIDTH_PORTRAIT, MQ_RIGHT_SIDEBAR_MIN_WIDTH, POINTER_BUTTON, ROUNDNESS, SCROLL_TIMEOUT, TAP_TWICE_TIMEOUT, TEXT_TO_CENTER_SNAP_THRESHOLD, THEME, THEME_FILTER, TOUCH_CTX_MENU_TIMEOUT, VERTICAL_ALIGN, YOUTUBE_STATES, ZOOM_STEP, POINTER_EVENTS, TOOL_TYPE, EDITOR_LS_KEYS, isIOS, supportsResizeObserver, DEFAULT_COLLISION_THRESHOLD, DEFAULT_TEXT_ALIGN, } from "../constants";
15
16
  import { exportAsImage, loadFromBlob } from "../data";
16
17
  import Library, { distributeLibraryItemsOnSquareGrid } from "../data/library";
17
18
  import { restore, restoreElements } from "../data/restore";
18
- import { dragNewElement, dragSelectedElements, duplicateElement, getCommonBounds, getCursorForResizingElement, getDragOffsetXY, getElementWithTransformHandleType, getNormalizedDimensions, getResizeArrowDirection, getResizeOffsetXY, getLockedLinearCursorAlignSize, getTransformHandleTypeFromCoords, isInvisiblySmallElement, isNonDeletedElement, isTextElement, newElement, newLinearElement, newTextElement, newImageElement, transformElements, updateTextElement, redrawTextBoundingBox, getElementAbsoluteCoords, } from "../element";
19
- import { bindOrUnbindLinearElement, bindOrUnbindSelectedElements, fixBindingsAfterDeletion, fixBindingsAfterDuplication, getEligibleElementsForBinding, getHoveredElementForBinding, isBindingEnabled, isLinearElementSimpleAndAlreadyBound, maybeBindLinearElement, shouldEnableBindingForPointerEvent, unbindLinearElements, updateBoundElements, } from "../element/binding";
19
+ import { dragNewElement, dragSelectedElements, duplicateElement, getCommonBounds, getCursorForResizingElement, getDragOffsetXY, getElementWithTransformHandleType, getNormalizedDimensions, getResizeArrowDirection, getResizeOffsetXY, getLockedLinearCursorAlignSize, getTransformHandleTypeFromCoords, isInvisiblySmallElement, isNonDeletedElement, isTextElement, newElement, newLinearElement, newTextElement, newImageElement, transformElements, refreshTextDimensions, redrawTextBoundingBox, getElementAbsoluteCoords, } from "../element";
20
+ import { bindOrUnbindLinearElement, bindOrUnbindLinearElements, fixBindingsAfterDeletion, fixBindingsAfterDuplication, getHoveredElementForBinding, isBindingEnabled, isLinearElementSimpleAndAlreadyBound, maybeBindLinearElement, shouldEnableBindingForPointerEvent, updateBoundElements, getSuggestedBindingsForArrows, } from "../element/binding";
20
21
  import { LinearElementEditor } from "../element/linearElementEditor";
21
22
  import { mutateElement, newElementWith } from "../element/mutateElement";
22
23
  import { deepCopyElement, duplicateElements, newFrameElement, newFreeDrawElement, newEmbeddableElement, newMagicFrameElement, newIframeElement, } from "../element/newElement";
@@ -37,7 +38,7 @@ import { getClosedCurveShape, getCurveShape, getEllipseShape, getFreedrawShape,
37
38
  import { isPointInShape } from "../../utils/collision";
38
39
  import { debounce, distance, getFontString, getNearestScrollableContainer, isInputLike, isToolIcon, isWritableElement, sceneCoordsToViewportCoords, tupleToCoors, viewportCoordsToSceneCoords, wrapEvent, updateObject, updateActiveTool, getShortcutKey, isTransparent, easeToValuesRAF, muteFSAbortError, isTestEnv, easeOut, updateStable, addEventListener, normalizeEOL, getDateTime, isShallowEqual, arrayToMap, } from "../utils";
39
40
  import { createSrcDoc, embeddableURLValidator, maybeParseEmbedSrc, getEmbedLink, } from "../element/embeddable";
40
- import { ContextMenu, CONTEXT_MENU_SEPARATOR, } from "./ContextMenu";
41
+ import { ContextMenu, CONTEXT_MENU_SEPARATOR } from "./ContextMenu";
41
42
  import LayerUI from "./LayerUI";
42
43
  import { Toast } from "./Toast";
43
44
  import { actionToggleViewMode } from "../actions/actionToggleViewMode";
@@ -45,7 +46,7 @@ import { dataURLToFile, generateIdFromFile, getDataURL, getFileFromEvent, ImageU
45
46
  import { getInitializedImageElements, loadHTMLImageElement, normalizeSVG, updateImageCache as _updateImageCache, } from "../element/image";
46
47
  import throttle from "lodash.throttle";
47
48
  import { fileOpen } from "../data/filesystem";
48
- import { bindTextToShapeAfterDuplication, getApproxMinLineHeight, getApproxMinLineWidth, getBoundTextElement, getContainerCenter, getContainerElement, getDefaultLineHeight, getLineHeightInPx, isMeasureTextSupported, isValidTextContainer, } from "../element/textElement";
49
+ import { bindTextToShapeAfterDuplication, getApproxMinLineHeight, getApproxMinLineWidth, getBoundTextElement, getContainerCenter, getContainerElement, getDefaultLineHeight, getLineHeightInPx, getMinTextElementWidth, isMeasureTextSupported, isValidTextContainer, measureText, wrapText, } from "../element/textElement";
49
50
  import { showHyperlinkTooltip, hideHyperlinkToolip, Hyperlink, } from "../components/hyperlink/Hyperlink";
50
51
  import { isLocalLink, normalizeLink, toValidURL } from "../data/url";
51
52
  import { shouldShowBoundingBox } from "../element/transformHandles";
@@ -63,7 +64,7 @@ import { getSnapLinesAtPointer, snapDraggedElements, isActiveToolNonLinearSnappa
63
64
  import { actionWrapTextInContainer } from "../actions/actionBoundText";
64
65
  import BraveMeasureTextError from "./BraveMeasureTextError";
65
66
  import { activeEyeDropperAtom } from "./EyeDropper";
66
- import { convertToExcalidrawElements, } from "../data/transform";
67
+ import { convertToExcalidrawElements } from "../data/transform";
67
68
  import { isSidebarDockedAtom } from "./Sidebar/Sidebar";
68
69
  import { StaticCanvas, InteractiveCanvas } from "./canvases";
69
70
  import { Renderer } from "../scene/Renderer";
@@ -91,6 +92,9 @@ import { isOverScrollBars } from "../scene/scrollbars";
91
92
  import { syncInvalidIndices, syncMovedIndices } from "../fractionalIndex";
92
93
  import { isPointHittingLink, isPointHittingLinkIcon, } from "./hyperlink/helpers";
93
94
  import { getShortcutFromShortcutName } from "../actions/shortcuts";
95
+ import { actionTextAutoResize } from "../actions/actionTextAutoResize";
96
+ import { getVisibleSceneBounds } from "../element/bounds";
97
+ import { isMaybeMermaidDefinition } from "../mermaid";
94
98
  const AppContext = React.createContext(null);
95
99
  const AppPropsContext = React.createContext(null);
96
100
  const deviceContextInitialValue = {
@@ -288,10 +292,7 @@ class App extends React.Component {
288
292
  container: this.excalidrawContainerRef.current,
289
293
  id: this.id,
290
294
  };
291
- this.fonts = new Fonts({
292
- scene: this.scene,
293
- onSceneUpdated: this.onSceneUpdated,
294
- });
295
+ this.fonts = new Fonts({ scene: this.scene });
295
296
  this.history = new History();
296
297
  this.actionManager.registerAll(actions);
297
298
  this.actionManager.registerAction(createUndoAction(this.history, this.store));
@@ -446,7 +447,7 @@ class App extends React.Component {
446
447
  return false;
447
448
  });
448
449
  if (updated) {
449
- this.scene.informMutation();
450
+ this.scene.triggerUpdate();
450
451
  }
451
452
  // GC
452
453
  this.iFrameRefs.forEach((ref, id) => {
@@ -805,9 +806,9 @@ class App extends React.Component {
805
806
  render() {
806
807
  const selectedElements = this.scene.getSelectedElements(this.state);
807
808
  const { renderTopRightUI, renderCustomStats } = this.props;
808
- const versionNonce = this.scene.getVersionNonce();
809
+ const sceneNonce = this.scene.getSceneNonce();
809
810
  const { elementsMap, visibleElements } = this.renderer.getRenderableElements({
810
- versionNonce,
811
+ sceneNonce,
811
812
  zoom: this.state.zoom,
812
813
  offsetLeft: this.state.offsetLeft,
813
814
  offsetTop: this.state.offsetTop,
@@ -879,14 +880,14 @@ class App extends React.Component {
879
880
  this.focusContainer();
880
881
  callback?.();
881
882
  });
882
- } })), _jsx(StaticCanvas, { canvas: this.canvas, rc: this.rc, elementsMap: elementsMap, allElementsMap: allElementsMap, visibleElements: visibleElements, versionNonce: versionNonce, selectionNonce: this.state.selectionElement?.versionNonce, scale: window.devicePixelRatio, appState: this.state, renderConfig: {
883
+ } })), _jsx(StaticCanvas, { canvas: this.canvas, rc: this.rc, elementsMap: elementsMap, allElementsMap: allElementsMap, visibleElements: visibleElements, sceneNonce: sceneNonce, selectionNonce: this.state.selectionElement?.versionNonce, scale: window.devicePixelRatio, appState: this.state, renderConfig: {
883
884
  imageCache: this.imageCache,
884
885
  isExporting: false,
885
886
  renderGrid: true,
886
887
  canvasBackgroundColor: this.state.viewBackgroundColor,
887
888
  embedsValidationStatus: this.embedsValidationStatus,
888
889
  elementsPendingErasure: this.elementsPendingErasure,
889
- } }), _jsx(InteractiveCanvas, { containerRef: this.excalidrawContainerRef, canvas: this.interactiveCanvas, elementsMap: elementsMap, visibleElements: visibleElements, selectedElements: selectedElements, versionNonce: versionNonce, selectionNonce: this.state.selectionElement?.versionNonce, scale: window.devicePixelRatio, appState: this.state, renderInteractiveSceneCallback: this.renderInteractiveSceneCallback, handleCanvasRef: this.handleInteractiveCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick }), this.state.userToFollow && (_jsx(FollowMode, { width: this.state.width, height: this.state.height, userToFollow: this.state.userToFollow, onDisconnect: this.maybeUnfollowRemoteUser })), this.renderFrameNames()] }), this.renderEmbeddables()] }) }) }) }) }) }) }) }));
890
+ } }), _jsx(InteractiveCanvas, { containerRef: this.excalidrawContainerRef, canvas: this.interactiveCanvas, elementsMap: elementsMap, visibleElements: visibleElements, allElementsMap: allElementsMap, selectedElements: selectedElements, sceneNonce: sceneNonce, selectionNonce: this.state.selectionElement?.versionNonce, scale: window.devicePixelRatio, appState: this.state, device: this.device, renderInteractiveSceneCallback: this.renderInteractiveSceneCallback, handleCanvasRef: this.handleInteractiveCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick }), this.state.userToFollow && (_jsx(FollowMode, { width: this.state.width, height: this.state.height, userToFollow: this.state.userToFollow, onDisconnect: this.maybeUnfollowRemoteUser })), this.renderFrameNames()] }), this.renderEmbeddables()] }) }) }) }) }) }) }) }));
890
891
  }
891
892
  focusContainer = () => {
892
893
  this.excalidrawContainerRef.current?.focus();
@@ -944,7 +945,7 @@ class App extends React.Component {
944
945
  mutateElement(frameElement, { customData: { generationData: data } }, false);
945
946
  }
946
947
  this.magicGenerations.set(frameElement.id, data);
947
- this.onSceneUpdated();
948
+ this.triggerRender();
948
949
  };
949
950
  getTextFromElements(elements) {
950
951
  const text = elements
@@ -1464,7 +1465,7 @@ class App extends React.Component {
1464
1465
  this.store.onStoreIncrementEmitter.on((increment) => {
1465
1466
  this.history.record(increment.elementsChange, increment.appStateChange);
1466
1467
  });
1467
- this.scene.addCallback(this.onSceneUpdated);
1468
+ this.scene.onUpdate(this.triggerRender);
1468
1469
  this.addEventListeners();
1469
1470
  if (this.props.autoFocus && this.excalidrawContainerRef.current) {
1470
1471
  this.focusContainer();
@@ -1502,6 +1503,7 @@ class App extends React.Component {
1502
1503
  componentWillUnmount() {
1503
1504
  this.renderer.destroy();
1504
1505
  this.scene = new Scene();
1506
+ this.fonts = new Fonts({ scene: this.scene });
1505
1507
  this.renderer = new Renderer(this.scene);
1506
1508
  this.files = {};
1507
1509
  this.imageCache.clear();
@@ -1573,7 +1575,7 @@ class App extends React.Component {
1573
1575
  this.onRemoveEventListenersEmitter.once(addEventListener(document, EVENT.KEYDOWN, this.onKeyDown, false));
1574
1576
  }
1575
1577
  this.onRemoveEventListenersEmitter.once(addEventListener(this.excalidrawContainerRef.current, EVENT.WHEEL, this.onWheel, { passive: false }), addEventListener(window, EVENT.MESSAGE, this.onWindowMessage, false), addEventListener(document, EVENT.POINTER_UP, this.removePointer), // #3553
1576
- addEventListener(document, EVENT.COPY, this.onCopy), addEventListener(document, EVENT.KEYUP, this.onKeyUp, { passive: true }), addEventListener(document, EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition),
1578
+ addEventListener(document, EVENT.COPY, this.onCopy), addEventListener(document, EVENT.KEYUP, this.onKeyUp, { passive: true }), addEventListener(document, EVENT.POINTER_MOVE, this.updateCurrentCursorPosition),
1577
1579
  // rerender text elements on font load to fix #637 && #1553
1578
1580
  addEventListener(document.fonts, "loadingdone", (event) => {
1579
1581
  const loadedFontFaces = event.fontfaces;
@@ -1582,6 +1584,9 @@ class App extends React.Component {
1582
1584
  // Safari-only desktop pinch zoom
1583
1585
  addEventListener(document, EVENT.GESTURE_START, this.onGestureStart, false), addEventListener(document, EVENT.GESTURE_CHANGE, this.onGestureChange, false), addEventListener(document, EVENT.GESTURE_END, this.onGestureEnd, false), addEventListener(window, EVENT.FOCUS, () => {
1584
1586
  this.maybeCleanupAfterMissingPointerUp(null);
1587
+ // browsers (chrome?) tend to free up memory a lot, which results
1588
+ // in canvas context being cleared. Thus re-render on focus.
1589
+ this.triggerRender(true);
1585
1590
  }));
1586
1591
  if (this.state.viewModeEnabled) {
1587
1592
  return;
@@ -1907,6 +1912,26 @@ class App extends React.Component {
1907
1912
  });
1908
1913
  }
1909
1914
  else if (data.text) {
1915
+ if (data.text && isMaybeMermaidDefinition(data.text)) {
1916
+ const api = await import("@excalidraw/mermaid-to-excalidraw");
1917
+ try {
1918
+ const { elements: skeletonElements, files } = await api.parseMermaidToExcalidraw(data.text, {
1919
+ fontSize: DEFAULT_FONT_SIZE,
1920
+ });
1921
+ const elements = convertToExcalidrawElements(skeletonElements, {
1922
+ regenerateIds: true,
1923
+ });
1924
+ this.addElementsFromPasteOrLibrary({
1925
+ elements,
1926
+ files,
1927
+ position: "cursor",
1928
+ });
1929
+ return;
1930
+ }
1931
+ catch (err) {
1932
+ console.warn(`parsing pasted text as mermaid definition failed: ${err.message}`);
1933
+ }
1934
+ }
1910
1935
  const nonEmptyLines = normalizeEOL(data.text)
1911
1936
  .split(/\n+/)
1912
1937
  .map((s) => s.trim())
@@ -2111,27 +2136,46 @@ class App extends React.Component {
2111
2136
  text,
2112
2137
  fontSize: this.state.currentItemFontSize,
2113
2138
  fontFamily: this.state.currentItemFontFamily,
2114
- textAlign: this.state.currentItemTextAlign,
2139
+ textAlign: DEFAULT_TEXT_ALIGN,
2115
2140
  verticalAlign: DEFAULT_VERTICAL_ALIGN,
2116
2141
  locked: false,
2117
2142
  };
2143
+ const fontString = getFontString({
2144
+ fontSize: textElementProps.fontSize,
2145
+ fontFamily: textElementProps.fontFamily,
2146
+ });
2147
+ const lineHeight = getDefaultLineHeight(textElementProps.fontFamily);
2148
+ const [x1, , x2] = getVisibleSceneBounds(this.state);
2149
+ // long texts should not go beyond 800 pixels in width nor should it go below 200 px
2150
+ const maxTextWidth = Math.max(Math.min((x2 - x1) * 0.5, 800), 200);
2118
2151
  const LINE_GAP = 10;
2119
2152
  let currentY = y;
2120
2153
  const lines = isPlainPaste ? [text] : text.split("\n");
2121
2154
  const textElements = lines.reduce((acc, line, idx) => {
2122
- const text = line.trim();
2123
- const lineHeight = getDefaultLineHeight(textElementProps.fontFamily);
2124
- if (text.length) {
2155
+ const originalText = line.trim();
2156
+ if (originalText.length) {
2125
2157
  const topLayerFrame = this.getTopLayerFrameAtSceneCoords({
2126
2158
  x,
2127
2159
  y: currentY,
2128
2160
  });
2161
+ let metrics = measureText(originalText, fontString, lineHeight);
2162
+ const isTextWrapped = metrics.width > maxTextWidth;
2163
+ const text = isTextWrapped
2164
+ ? wrapText(originalText, fontString, maxTextWidth)
2165
+ : originalText;
2166
+ metrics = isTextWrapped
2167
+ ? measureText(text, fontString, lineHeight)
2168
+ : metrics;
2169
+ const startX = x - metrics.width / 2;
2170
+ const startY = currentY - metrics.height / 2;
2129
2171
  const element = newTextElement({
2130
2172
  ...textElementProps,
2131
- x,
2132
- y: currentY,
2173
+ x: startX,
2174
+ y: startY,
2133
2175
  text,
2176
+ originalText,
2134
2177
  lineHeight,
2178
+ autoResize: !isTextWrapped,
2135
2179
  frameId: topLayerFrame ? topLayerFrame.id : null,
2136
2180
  });
2137
2181
  acc.push(element);
@@ -2350,7 +2394,7 @@ class App extends React.Component {
2350
2394
  ShapeCache.delete(element);
2351
2395
  }
2352
2396
  });
2353
- this.scene.informMutation();
2397
+ this.scene.triggerUpdate();
2354
2398
  this.addNewImagesToImageCache();
2355
2399
  });
2356
2400
  updateScene = withBatchedUpdates((sceneData) => {
@@ -2384,8 +2428,15 @@ class App extends React.Component {
2384
2428
  this.setState({ collaborators: sceneData.collaborators });
2385
2429
  }
2386
2430
  });
2387
- onSceneUpdated = () => {
2388
- this.setState({});
2431
+ triggerRender = (
2432
+ /** force always re-renders canvas even if no change */
2433
+ force) => {
2434
+ if (force === true) {
2435
+ this.scene.triggerUpdate();
2436
+ }
2437
+ else {
2438
+ this.setState({});
2439
+ }
2389
2440
  };
2390
2441
  /**
2391
2442
  * @returns whether the menu was toggled on or off
@@ -2552,7 +2603,9 @@ class App extends React.Component {
2552
2603
  simultaneouslyUpdated: selectedElements,
2553
2604
  });
2554
2605
  });
2555
- this.maybeSuggestBindingForAll(selectedElements);
2606
+ this.setState({
2607
+ suggestedBindings: getSuggestedBindingsForArrows(selectedElements, this),
2608
+ });
2556
2609
  event.preventDefault();
2557
2610
  }
2558
2611
  else if (event.key === KEYS.ENTER) {
@@ -2690,11 +2743,7 @@ class App extends React.Component {
2690
2743
  this.setState({ isBindingEnabled: true });
2691
2744
  }
2692
2745
  if (isArrowKey(event.key)) {
2693
- const selectedElements = this.scene.getSelectedElements(this.state);
2694
- const elementsMap = this.scene.getNonDeletedElementsMap();
2695
- isBindingEnabled(this.state)
2696
- ? bindOrUnbindSelectedElements(selectedElements, this)
2697
- : unbindLinearElements(selectedElements, elementsMap);
2746
+ bindOrUnbindLinearElements(this.scene.getSelectedElements(this.state).filter(isLinearElement), this, isBindingEnabled(this.state), this.state.selectedLinearElement?.selectedPointsIndices ?? []);
2698
2747
  this.setState({ suggestedBindings: [] });
2699
2748
  }
2700
2749
  });
@@ -2726,6 +2775,9 @@ class App extends React.Component {
2726
2775
  originSnapOffset: null,
2727
2776
  activeEmbeddable: null,
2728
2777
  };
2778
+ if (nextActiveTool.type === "freedraw") {
2779
+ this.store.shouldCaptureIncrement();
2780
+ }
2729
2781
  let nextState;
2730
2782
  if (nextActiveTool.type !== "selection") {
2731
2783
  nextState = {
@@ -2842,15 +2894,16 @@ class App extends React.Component {
2842
2894
  });
2843
2895
  handleTextWysiwyg(element, { isExistingElement = false, }) {
2844
2896
  const elementsMap = this.scene.getElementsMapIncludingDeleted();
2845
- const updateElement = (text, originalText, isDeleted) => {
2897
+ const updateElement = (nextOriginalText, isDeleted) => {
2846
2898
  this.scene.replaceAllElements([
2847
2899
  // Not sure why we include deleted elements as well hence using deleted elements map
2848
2900
  ...this.scene.getElementsIncludingDeleted().map((_element) => {
2849
2901
  if (_element.id === element.id && isTextElement(_element)) {
2850
- return updateTextElement(_element, getContainerElement(_element, elementsMap), elementsMap, {
2851
- text,
2852
- isDeleted,
2853
- originalText,
2902
+ return newElementWith(_element, {
2903
+ originalText: nextOriginalText,
2904
+ isDeleted: isDeleted ?? _element.isDeleted,
2905
+ // returns (wrapped) text and new dimensions
2906
+ ...refreshTextDimensions(_element, getContainerElement(_element, elementsMap), elementsMap, nextOriginalText),
2854
2907
  });
2855
2908
  }
2856
2909
  return _element;
@@ -2870,15 +2923,15 @@ class App extends React.Component {
2870
2923
  viewportY - this.state.offsetTop,
2871
2924
  ];
2872
2925
  },
2873
- onChange: withBatchedUpdates((text) => {
2874
- updateElement(text, text, false);
2926
+ onChange: withBatchedUpdates((nextOriginalText) => {
2927
+ updateElement(nextOriginalText, false);
2875
2928
  if (isNonDeletedElement(element)) {
2876
2929
  updateBoundElements(element, elementsMap);
2877
2930
  }
2878
2931
  }),
2879
- onSubmit: withBatchedUpdates(({ text, viaKeyboard, originalText }) => {
2880
- const isDeleted = !text.trim();
2881
- updateElement(text, originalText, isDeleted);
2932
+ onSubmit: withBatchedUpdates(({ viaKeyboard, nextOriginalText }) => {
2933
+ const isDeleted = !nextOriginalText.trim();
2934
+ updateElement(nextOriginalText, isDeleted);
2882
2935
  // select the created text element only if submitting via keyboard
2883
2936
  // (when submitting via click it should act as signal to deselect)
2884
2937
  if (!isDeleted && viaKeyboard) {
@@ -2912,12 +2965,17 @@ class App extends React.Component {
2912
2965
  element,
2913
2966
  excalidrawContainer: this.excalidrawContainerRef.current,
2914
2967
  app: this,
2968
+ // when text is selected, it's hard (at least on iOS) to re-position the
2969
+ // caret (i.e. deselect). There's not much use for always selecting
2970
+ // the text on edit anyway (and users can select-all from contextmenu
2971
+ // if needed)
2972
+ autoSelect: !this.device.isTouchScreen,
2915
2973
  });
2916
2974
  // deselect all other elements when inserting text
2917
2975
  this.deselectElements();
2918
2976
  // do an initial update to re-initialize element position since we were
2919
2977
  // modifying element's x/y for sake of editor (case: syncing to remote)
2920
- updateElement(element.text, element.originalText, false);
2978
+ updateElement(element.originalText, false);
2921
2979
  }
2922
2980
  deselectElements() {
2923
2981
  this.setState({
@@ -3007,7 +3065,7 @@ class App extends React.Component {
3007
3065
  shape: this.getElementShape(elementWithHighestZIndex),
3008
3066
  // when overlapping, we would like to be more precise
3009
3067
  // this also avoids the need to update past tests
3010
- threshold: this.getHitThreshold() / 2,
3068
+ threshold: this.getElementHitThreshold() / 2,
3011
3069
  frameNameBound: isFrameLikeElement(elementWithHighestZIndex)
3012
3070
  ? this.frameNameBoundsCache.get(elementWithHighestZIndex)
3013
3071
  : null,
@@ -3054,15 +3112,15 @@ class App extends React.Component {
3054
3112
  .concat(iframeLikes);
3055
3113
  return elements;
3056
3114
  }
3057
- getHitThreshold() {
3058
- return 10 / this.state.zoom.value;
3115
+ getElementHitThreshold() {
3116
+ return DEFAULT_COLLISION_THRESHOLD / this.state.zoom.value;
3059
3117
  }
3060
3118
  hitElement(x, y, element, considerBoundingBox = true) {
3061
3119
  // if the element is selected, then hit test is done against its bounding box
3062
3120
  if (considerBoundingBox &&
3063
3121
  this.state.selectedElementIds[element.id] &&
3064
3122
  shouldShowBoundingBox([element], this.state)) {
3065
- const selectionShape = getSelectionBoxShape(element, this.scene.getNonDeletedElementsMap(), this.getHitThreshold());
3123
+ const selectionShape = getSelectionBoxShape(element, this.scene.getNonDeletedElementsMap(), this.getElementHitThreshold());
3066
3124
  return isPointInShape([x, y], selectionShape);
3067
3125
  }
3068
3126
  // take bound text element into consideration for hit collision as well
@@ -3075,7 +3133,7 @@ class App extends React.Component {
3075
3133
  y,
3076
3134
  element,
3077
3135
  shape: this.getElementShape(element),
3078
- threshold: this.getHitThreshold(),
3136
+ threshold: this.getElementHitThreshold(),
3079
3137
  frameNameBound: isFrameLikeElement(element)
3080
3138
  ? this.frameNameBoundsCache.get(element)
3081
3139
  : null,
@@ -3102,7 +3160,7 @@ class App extends React.Component {
3102
3160
  y,
3103
3161
  element: elements[index],
3104
3162
  shape: this.getElementShape(elements[index]),
3105
- threshold: this.getHitThreshold(),
3163
+ threshold: this.getElementHitThreshold(),
3106
3164
  })) {
3107
3165
  hitElement = elements[index];
3108
3166
  break;
@@ -3114,7 +3172,7 @@ class App extends React.Component {
3114
3172
  }
3115
3173
  return isTextBindableContainer(hitElement, false) ? hitElement : null;
3116
3174
  }
3117
- startTextEditing = ({ sceneX, sceneY, insertAtParentCenter = true, container, }) => {
3175
+ startTextEditing = ({ sceneX, sceneY, insertAtParentCenter = true, container, autoEdit = true, }) => {
3118
3176
  let shouldBindToContainer = false;
3119
3177
  let parentCenterPosition = insertAtParentCenter &&
3120
3178
  this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, container);
@@ -3215,12 +3273,17 @@ class App extends React.Component {
3215
3273
  this.scene.insertElement(element);
3216
3274
  }
3217
3275
  }
3218
- this.setState({
3219
- editingElement: element,
3220
- });
3221
- this.handleTextWysiwyg(element, {
3222
- isExistingElement: !!existingTextElement,
3223
- });
3276
+ if (autoEdit || existingTextElement || container) {
3277
+ this.handleTextWysiwyg(element, {
3278
+ isExistingElement: !!existingTextElement,
3279
+ });
3280
+ }
3281
+ else {
3282
+ this.setState({
3283
+ draggingElement: element,
3284
+ multiElement: null,
3285
+ });
3286
+ }
3224
3287
  };
3225
3288
  handleCanvasDoubleClick = (event) => {
3226
3289
  // case: double-clicking with arrow/line tool selected would both create
@@ -3281,7 +3344,7 @@ class App extends React.Component {
3281
3344
  y: sceneY,
3282
3345
  element: container,
3283
3346
  shape: this.getElementShape(container),
3284
- threshold: this.getHitThreshold(),
3347
+ threshold: this.getElementHitThreshold(),
3285
3348
  })) {
3286
3349
  const midPoint = getContainerCenter(container, this.state, this.scene.getNonDeletedElementsMap());
3287
3350
  sceneX = midPoint.x;
@@ -3390,8 +3453,11 @@ class App extends React.Component {
3390
3453
  }, state);
3391
3454
  this.translateCanvas({
3392
3455
  zoom: zoomState.zoom,
3393
- scrollX: zoomState.scrollX + deltaX / nextZoom,
3394
- scrollY: zoomState.scrollY + deltaY / nextZoom,
3456
+ // 2x multiplier is just a magic number that makes this work correctly
3457
+ // on touchscreen devices (note: if we get report that panning is slower/faster
3458
+ // than actual movement, consider swapping with devicePixelRatio)
3459
+ scrollX: zoomState.scrollX + 2 * (deltaX / nextZoom),
3460
+ scrollY: zoomState.scrollY + 2 * (deltaY / nextZoom),
3395
3461
  shouldCacheIgnoreZoom: true,
3396
3462
  });
3397
3463
  });
@@ -3556,15 +3622,23 @@ class App extends React.Component {
3556
3622
  if (selectedElements.length === 1 &&
3557
3623
  !isOverScrollBar &&
3558
3624
  !this.state.editingLinearElement) {
3559
- const elementWithTransformHandleType = getElementWithTransformHandleType(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType, this.scene.getNonDeletedElementsMap());
3560
- if (elementWithTransformHandleType &&
3561
- elementWithTransformHandleType.transformHandleType) {
3562
- setCursor(this.interactiveCanvas, getCursorForResizingElement(elementWithTransformHandleType));
3563
- return;
3625
+ // for linear elements, we'd like to prioritize point dragging over edge resizing
3626
+ // therefore, we update and check hovered point index first
3627
+ if (this.state.selectedLinearElement) {
3628
+ this.handleHoverSelectedLinearElement(this.state.selectedLinearElement, scenePointerX, scenePointerY);
3629
+ }
3630
+ if (!this.state.selectedLinearElement ||
3631
+ this.state.selectedLinearElement.hoverPointIndex === -1) {
3632
+ const elementWithTransformHandleType = getElementWithTransformHandleType(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType, this.scene.getNonDeletedElementsMap(), this.device);
3633
+ if (elementWithTransformHandleType &&
3634
+ elementWithTransformHandleType.transformHandleType) {
3635
+ setCursor(this.interactiveCanvas, getCursorForResizingElement(elementWithTransformHandleType));
3636
+ return;
3637
+ }
3564
3638
  }
3565
3639
  }
3566
3640
  else if (selectedElements.length > 1 && !isOverScrollBar) {
3567
- const transformHandleType = getTransformHandleTypeFromCoords(getCommonBounds(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);
3641
+ const transformHandleType = getTransformHandleTypeFromCoords(getCommonBounds(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType, this.device);
3568
3642
  if (transformHandleType) {
3569
3643
  setCursor(this.interactiveCanvas, getCursorForResizingElement({
3570
3644
  transformHandleType,
@@ -3668,7 +3742,7 @@ class App extends React.Component {
3668
3742
  }
3669
3743
  };
3670
3744
  const distance = distance2d(pointerDownState.lastCoords.x, pointerDownState.lastCoords.y, scenePointer.x, scenePointer.y);
3671
- const threshold = this.getHitThreshold();
3745
+ const threshold = this.getElementHitThreshold();
3672
3746
  const point = { ...pointerDownState.lastCoords };
3673
3747
  let samplingInterval = 0;
3674
3748
  while (samplingInterval <= distance) {
@@ -3704,7 +3778,7 @@ class App extends React.Component {
3704
3778
  }
3705
3779
  }
3706
3780
  this.elementsPendingErasure = new Set(this.elementsPendingErasure);
3707
- this.onSceneUpdated();
3781
+ this.triggerRender();
3708
3782
  }
3709
3783
  };
3710
3784
  // set touch moving for mobile context menu
@@ -3732,7 +3806,7 @@ class App extends React.Component {
3732
3806
  if (hoverPointIndex >= 0 || segmentMidPointHoveredCoords) {
3733
3807
  setCursor(this.interactiveCanvas, CURSOR_TYPE.POINTER);
3734
3808
  }
3735
- else {
3809
+ else if (this.hitElement(scenePointerX, scenePointerY, element)) {
3736
3810
  setCursor(this.interactiveCanvas, CURSOR_TYPE.MOVE);
3737
3811
  }
3738
3812
  }
@@ -3918,7 +3992,6 @@ class App extends React.Component {
3918
3992
  }
3919
3993
  if (this.state.activeTool.type === "text") {
3920
3994
  this.handleTextOnPointerDown(event, pointerDownState);
3921
- return;
3922
3995
  }
3923
3996
  else if (this.state.activeTool.type === "arrow" ||
3924
3997
  this.state.activeTool.type === "line") {
@@ -4246,8 +4319,11 @@ class App extends React.Component {
4246
4319
  const elements = this.scene.getNonDeletedElements();
4247
4320
  const elementsMap = this.scene.getNonDeletedElementsMap();
4248
4321
  const selectedElements = this.scene.getSelectedElements(this.state);
4249
- if (selectedElements.length === 1 && !this.state.editingLinearElement) {
4250
- const elementWithTransformHandleType = getElementWithTransformHandleType(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType, this.scene.getNonDeletedElementsMap());
4322
+ if (selectedElements.length === 1 &&
4323
+ !this.state.editingLinearElement &&
4324
+ !(this.state.selectedLinearElement &&
4325
+ this.state.selectedLinearElement.hoverPointIndex !== -1)) {
4326
+ const elementWithTransformHandleType = getElementWithTransformHandleType(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType, this.scene.getNonDeletedElementsMap(), this.device);
4251
4327
  if (elementWithTransformHandleType != null) {
4252
4328
  this.setState({
4253
4329
  resizingElement: elementWithTransformHandleType.element,
@@ -4257,7 +4333,7 @@ class App extends React.Component {
4257
4333
  }
4258
4334
  }
4259
4335
  else if (selectedElements.length > 1) {
4260
- pointerDownState.resize.handleType = getTransformHandleTypeFromCoords(getCommonBounds(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);
4336
+ pointerDownState.resize.handleType = getTransformHandleTypeFromCoords(getCommonBounds(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType, this.device);
4261
4337
  }
4262
4338
  if (pointerDownState.resize.handleType) {
4263
4339
  pointerDownState.resize.isResizing = true;
@@ -4432,7 +4508,7 @@ class App extends React.Component {
4432
4508
  return false;
4433
4509
  }
4434
4510
  // How many pixels off the shape boundary we still consider a hit
4435
- const threshold = this.getHitThreshold();
4511
+ const threshold = this.getElementHitThreshold();
4436
4512
  const [x1, y1, x2, y2] = getCommonBounds(selectedElements);
4437
4513
  return (point.x > x1 - threshold &&
4438
4514
  point.x < x2 + threshold &&
@@ -4463,6 +4539,7 @@ class App extends React.Component {
4463
4539
  sceneY,
4464
4540
  insertAtParentCenter: !event.altKey,
4465
4541
  container,
4542
+ autoEdit: false,
4466
4543
  });
4467
4544
  resetCursor(this.interactiveCanvas);
4468
4545
  if (!this.state.activeTool.locked) {
@@ -4979,7 +5056,9 @@ class App extends React.Component {
4979
5056
  // able to select and interact with the text input
4980
5057
  !this.state.editingFrame &&
4981
5058
  dragSelectedElements(pointerDownState, selectedElements, dragOffset, this.state, this.scene, snapOffset, event[KEYS.CTRL_OR_CMD] ? null : this.state.gridSize);
4982
- this.maybeSuggestBindingForAll(selectedElements);
5059
+ this.setState({
5060
+ suggestedBindings: getSuggestedBindingsForArrows(selectedElements, this),
5061
+ });
4983
5062
  // We duplicate the selected element if alt is pressed on pointer move
4984
5063
  if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {
4985
5064
  // Move the currently selected elements to the top of the z index stack, and
@@ -5352,6 +5431,21 @@ class App extends React.Component {
5352
5431
  }
5353
5432
  return;
5354
5433
  }
5434
+ if (isTextElement(draggingElement)) {
5435
+ const minWidth = getMinTextElementWidth(getFontString({
5436
+ fontSize: draggingElement.fontSize,
5437
+ fontFamily: draggingElement.fontFamily,
5438
+ }), draggingElement.lineHeight);
5439
+ if (draggingElement.width < minWidth) {
5440
+ mutateElement(draggingElement, {
5441
+ autoResize: true,
5442
+ });
5443
+ }
5444
+ this.resetCursor();
5445
+ this.handleTextWysiwyg(draggingElement, {
5446
+ isExistingElement: true,
5447
+ });
5448
+ }
5355
5449
  if (activeTool.type !== "selection" &&
5356
5450
  draggingElement &&
5357
5451
  isInvisiblySmallElement(draggingElement)) {
@@ -5387,7 +5481,7 @@ class App extends React.Component {
5387
5481
  groupIds: [],
5388
5482
  });
5389
5483
  removeElementsFromFrame([linearElement], this.scene.getNonDeletedElementsMap());
5390
- this.scene.informMutation();
5484
+ this.scene.triggerUpdate();
5391
5485
  }
5392
5486
  }
5393
5487
  }
@@ -5621,7 +5715,7 @@ class App extends React.Component {
5621
5715
  y: pointerDownState.origin.y,
5622
5716
  element: hitElement,
5623
5717
  shape: this.getElementShape(hitElement),
5624
- threshold: this.getHitThreshold(),
5718
+ threshold: this.getElementHitThreshold(),
5625
5719
  frameNameBound: isFrameLikeElement(hitElement)
5626
5720
  ? this.frameNameBoundsCache.get(hitElement)
5627
5721
  : null,
@@ -5664,9 +5758,12 @@ class App extends React.Component {
5664
5758
  this.store.shouldCaptureIncrement();
5665
5759
  }
5666
5760
  if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {
5667
- isBindingEnabled(this.state)
5668
- ? bindOrUnbindSelectedElements(this.scene.getSelectedElements(this.state), this)
5669
- : unbindLinearElements(this.scene.getSelectedElements(this.state), elementsMap);
5761
+ // We only allow binding via linear elements, specifically via dragging
5762
+ // the endpoints ("start" or "end").
5763
+ const linearElements = this.scene
5764
+ .getSelectedElements(this.state)
5765
+ .filter(isLinearElement);
5766
+ bindOrUnbindLinearElements(linearElements, this, isBindingEnabled(this.state), this.state.selectedLinearElement?.selectedPointsIndices ?? []);
5670
5767
  }
5671
5768
  if (activeTool.type === "laser") {
5672
5769
  this.laserTrails.endPath();
@@ -5701,7 +5798,7 @@ class App extends React.Component {
5701
5798
  }
5702
5799
  restoreReadyToEraseElements = () => {
5703
5800
  this.elementsPendingErasure = new Set();
5704
- this.onSceneUpdated();
5801
+ this.triggerRender();
5705
5802
  };
5706
5803
  eraseElements = () => {
5707
5804
  let didChange = false;
@@ -5993,7 +6090,7 @@ class App extends React.Component {
5993
6090
  if (uncachedImageElements.length) {
5994
6091
  const { updatedFiles } = await this.updateImageCache(uncachedImageElements, files);
5995
6092
  if (updatedFiles.size) {
5996
- this.scene.informMutation();
6093
+ this.scene.triggerUpdate();
5997
6094
  }
5998
6095
  }
5999
6096
  };
@@ -6033,13 +6130,6 @@ class App extends React.Component {
6033
6130
  }, []);
6034
6131
  this.setState({ suggestedBindings });
6035
6132
  };
6036
- maybeSuggestBindingForAll(selectedElements) {
6037
- if (selectedElements.length > 50) {
6038
- return;
6039
- }
6040
- const suggestedBindings = getEligibleElementsForBinding(selectedElements, this);
6041
- this.setState({ suggestedBindings });
6042
- }
6043
6133
  clearSelection(hitElement) {
6044
6134
  this.setState((prevState) => ({
6045
6135
  selectedElementIds: makeNextSelectedElementIds({}, prevState),
@@ -6282,7 +6372,7 @@ class App extends React.Component {
6282
6372
  }
6283
6373
  if (draggingElement.type === "selection" &&
6284
6374
  this.state.activeTool.type !== "eraser") {
6285
- dragNewElement(draggingElement, this.state.activeTool.type, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, distance(pointerDownState.origin.x, pointerCoords.x), distance(pointerDownState.origin.y, pointerCoords.y), shouldMaintainAspectRatio(event), shouldResizeFromCenter(event));
6375
+ dragNewElement(draggingElement, this.state.activeTool.type, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, distance(pointerDownState.origin.x, pointerCoords.x), distance(pointerDownState.origin.y, pointerCoords.y), shouldMaintainAspectRatio(event), shouldResizeFromCenter(event), this.state.zoom.value);
6286
6376
  }
6287
6377
  else {
6288
6378
  let [gridX, gridY] = getGridPoint(pointerCoords.x, pointerCoords.y, event[KEYS.CTRL_OR_CMD] ? null : this.state.gridSize);
@@ -6308,8 +6398,7 @@ class App extends React.Component {
6308
6398
  });
6309
6399
  dragNewElement(draggingElement, this.state.activeTool.type, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, distance(pointerDownState.originInGrid.x, gridX), distance(pointerDownState.originInGrid.y, gridY), isImageElement(draggingElement)
6310
6400
  ? !shouldMaintainAspectRatio(event)
6311
- : shouldMaintainAspectRatio(event), shouldResizeFromCenter(event), aspectRatio, this.state.originSnapOffset);
6312
- this.maybeSuggestBindingForAll([draggingElement]);
6401
+ : shouldMaintainAspectRatio(event), shouldResizeFromCenter(event), this.state.zoom.value, aspectRatio, this.state.originSnapOffset);
6313
6402
  // highlight elements that are to be added to frames on frames creation
6314
6403
  if (this.state.activeTool.type === TOOL_TYPE.frame ||
6315
6404
  this.state.activeTool.type === TOOL_TYPE.magicframe) {
@@ -6363,16 +6452,17 @@ class App extends React.Component {
6363
6452
  snapLines,
6364
6453
  });
6365
6454
  }
6366
- if (transformElements(pointerDownState.originalElements, transformHandleType, selectedElements, this.scene.getElementsMapIncludingDeleted(), shouldRotateWithDiscreteAngle(event), shouldResizeFromCenter(event), selectedElements.length === 1 && isImageElement(selectedElements[0])
6455
+ if (transformElements(pointerDownState.originalElements, transformHandleType, selectedElements, this.scene.getElementsMapIncludingDeleted(), shouldRotateWithDiscreteAngle(event), shouldResizeFromCenter(event), selectedElements.some((element) => isImageElement(element))
6367
6456
  ? !shouldMaintainAspectRatio(event)
6368
6457
  : shouldMaintainAspectRatio(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {
6369
- this.maybeSuggestBindingForAll(selectedElements);
6458
+ const suggestedBindings = getSuggestedBindingsForArrows(selectedElements, this);
6370
6459
  const elementsToHighlight = new Set();
6371
6460
  selectedFrames.forEach((frame) => {
6372
6461
  getElementsInResizingFrame(this.scene.getNonDeletedElements(), frame, this.state, this.scene.getNonDeletedElementsMap()).forEach((element) => elementsToHighlight.add(element));
6373
6462
  });
6374
6463
  this.setState({
6375
6464
  elementsToHighlight: [...elementsToHighlight],
6465
+ suggestedBindings,
6376
6466
  });
6377
6467
  return true;
6378
6468
  }
@@ -6417,6 +6507,7 @@ class App extends React.Component {
6417
6507
  return [actionCopy, ...options];
6418
6508
  }
6419
6509
  return [
6510
+ CONTEXT_MENU_SEPARATOR,
6420
6511
  actionCut,
6421
6512
  actionCopy,
6422
6513
  actionPaste,
@@ -6429,6 +6520,7 @@ class App extends React.Component {
6429
6520
  actionPasteStyles,
6430
6521
  CONTEXT_MENU_SEPARATOR,
6431
6522
  actionGroup,
6523
+ actionTextAutoResize,
6432
6524
  actionUnbindText,
6433
6525
  actionBindText,
6434
6526
  actionWrapTextInContainer,