@excalidraw/excalidraw 0.17.1-1d71f84 → 0.17.1-22b3927

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 (447) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-ACFH36JV.js → blockDiagram-91b80b7a-H47FTXHA.js} +5 -5
  3. package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-QZ27YR47.js → c4Diagram-b2a90758-NNJK6GKC.js} +3 -3
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-HO2HMSK7.js → chunk-4KQVEBHW.js} +3 -3
  5. package/dist/browser/dev/excalidraw-assets-dev/{chunk-USGV265L.js → chunk-53YI56GV.js} +4 -4
  6. package/dist/browser/dev/excalidraw-assets-dev/{chunk-EDFX3S7X.js → chunk-A2WCJI4I.js} +3 -3
  7. package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js → chunk-EFLPX7NE.js} +6 -6
  8. package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js → chunk-JYIQCNWV.js} +2 -2
  9. package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js → chunk-LVIQQW6F.js} +2 -2
  10. package/dist/browser/dev/excalidraw-assets-dev/{chunk-6U7GQNJT.js → chunk-PXLO3FOU.js} +2 -2
  11. package/dist/browser/dev/excalidraw-assets-dev/{chunk-AK7SWNLN.js → chunk-Q6A4M3MN.js} +9 -5
  12. package/dist/browser/dev/excalidraw-assets-dev/chunk-Q6A4M3MN.js.map +7 -0
  13. package/dist/browser/dev/excalidraw-assets-dev/{chunk-7DACDEY3.js → chunk-TO2AW5PW.js} +2 -2
  14. package/dist/browser/dev/excalidraw-assets-dev/{chunk-RWZVJAQU.js → chunk-VC7RRIDZ.js} +4657 -2673
  15. package/dist/browser/dev/excalidraw-assets-dev/chunk-VC7RRIDZ.js.map +7 -0
  16. package/dist/browser/dev/excalidraw-assets-dev/{chunk-NJ77ZFNJ.js → chunk-VURILHLY.js} +2 -2
  17. package/dist/browser/dev/excalidraw-assets-dev/{chunk-2T2GU7NF.js → chunk-ZAYGSUHF.js} +2 -2
  18. package/dist/browser/dev/excalidraw-assets-dev/{chunk-Z3PH3V2B.js → chunk-ZQR5ML6Y.js} +26 -26
  19. package/dist/browser/dev/excalidraw-assets-dev/chunk-ZQR5ML6Y.js.map +7 -0
  20. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-QSLMH4JW.js → classDiagram-30eddba6-CUYIJICN.js} +5 -5
  21. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-DY4DYQ5P.js → classDiagram-v2-f2df5561-K6WW6K73.js} +8 -8
  22. package/dist/browser/dev/excalidraw-assets-dev/{dist-Z46EOVOL.js → dist-6QVAH5JA.js} +37 -15
  23. package/dist/browser/dev/excalidraw-assets-dev/dist-6QVAH5JA.js.map +7 -0
  24. package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js → en-Y27YPU72.js} +2 -2
  25. package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-SOOJRTCB.js → erDiagram-47591fe2-XGAD7EEP.js} +4 -4
  26. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-AHGL4KPK.js → flowDiagram-5540d9b9-B6EOVNNO.js} +9 -9
  27. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-56LDZZWY.js → flowDiagram-v2-3b53844e-NUG24FJH.js} +9 -9
  28. package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-27LUKRI6.js → flowchart-elk-definition-5fe447d6-25Y7PCBL.js} +5 -5
  29. package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-EHGYGNG6.js → ganttDiagram-9a3bba1f-GNL6ZDTC.js} +2 -2
  30. package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-AJQNBDW5.js → gitGraphDiagram-96e6b4ee-HNW52NVO.js} +2 -2
  31. package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js → image-J7S3ALXP.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 +72 -28
  47. package/dist/browser/dev/index.css.map +3 -3
  48. package/dist/browser/dev/index.js +2387 -1934
  49. package/dist/browser/dev/index.js.map +4 -4
  50. package/dist/browser/prod/excalidraw-assets/{blockDiagram-91b80b7a-ONPS22AM.js → blockDiagram-91b80b7a-FVCRVGN5.js} +1 -1
  51. package/dist/browser/prod/excalidraw-assets/{c4Diagram-b2a90758-XMIQY7ZT.js → c4Diagram-b2a90758-56CXO7GA.js} +1 -1
  52. package/dist/browser/prod/excalidraw-assets/{chunk-GCHQBOKV.js → chunk-635MQ3CK.js} +1 -1
  53. package/dist/browser/prod/excalidraw-assets/{chunk-P5M3G2RP.js → chunk-AIKXYJX3.js} +1 -1
  54. package/dist/browser/prod/excalidraw-assets/{chunk-E2YLWFZX.js → chunk-CR7VMNWC.js} +1 -1
  55. package/dist/browser/prod/excalidraw-assets/chunk-CWO763YJ.js +55 -0
  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-CTYINSWT.js → chunk-IZMZ6RPD.js} +2 -2
  61. package/dist/browser/prod/excalidraw-assets/{chunk-AHLLBBVJ.js → chunk-L5DS24G6.js} +1 -1
  62. package/dist/browser/prod/excalidraw-assets/{chunk-CQJF3C6G.js → chunk-MUNOKHUD.js} +1 -1
  63. package/dist/browser/prod/excalidraw-assets/{chunk-NI6SYCUG.js → chunk-QOQYOOQ4.js} +1 -1
  64. package/dist/browser/prod/excalidraw-assets/{chunk-I2PZFXTK.js → chunk-ZTIWFPBM.js} +21 -21
  65. package/dist/browser/prod/excalidraw-assets/{classDiagram-30eddba6-IEJXXCVX.js → classDiagram-30eddba6-BCUTAUMD.js} +1 -1
  66. package/dist/browser/prod/excalidraw-assets/{classDiagram-v2-f2df5561-7LZDSWOS.js → classDiagram-v2-f2df5561-6SOXSGQ2.js} +1 -1
  67. package/dist/browser/prod/excalidraw-assets/dist-567JAXHK.js +7 -0
  68. package/dist/browser/prod/excalidraw-assets/{en-LROPV2RN.js → en-GSUSWMSH.js} +1 -1
  69. package/dist/browser/prod/excalidraw-assets/{erDiagram-47591fe2-E5V666CF.js → erDiagram-47591fe2-RE6HB7RM.js} +1 -1
  70. package/dist/browser/prod/excalidraw-assets/{flowDiagram-5540d9b9-GMBRCYVF.js → flowDiagram-5540d9b9-ZNJZBERW.js} +1 -1
  71. package/dist/browser/prod/excalidraw-assets/{flowDiagram-v2-3b53844e-Z4HUWP6B.js → flowDiagram-v2-3b53844e-LY44JLQJ.js} +1 -1
  72. package/dist/browser/prod/excalidraw-assets/{flowchart-elk-definition-5fe447d6-5ZCYTX5N.js → flowchart-elk-definition-5fe447d6-TMTJ6Z7O.js} +1 -1
  73. package/dist/browser/prod/excalidraw-assets/{ganttDiagram-9a3bba1f-WM32OMT5.js → ganttDiagram-9a3bba1f-5O6EA6LX.js} +1 -1
  74. package/dist/browser/prod/excalidraw-assets/{gitGraphDiagram-96e6b4ee-CAKZ2U6E.js → gitGraphDiagram-96e6b4ee-UHYNM5DI.js} +1 -1
  75. package/dist/browser/prod/excalidraw-assets/image-SZBFRCU2.js +1 -0
  76. package/dist/browser/prod/excalidraw-assets/{infoDiagram-bcd20f53-MUIKXGC4.js → infoDiagram-bcd20f53-BP77NQEH.js} +1 -1
  77. package/dist/browser/prod/excalidraw-assets/{journeyDiagram-4fe6b3dc-NYRV4HK2.js → journeyDiagram-4fe6b3dc-XMGKCMES.js} +1 -1
  78. package/dist/browser/prod/excalidraw-assets/{mindmap-definition-f354de21-MY55DRSM.js → mindmap-definition-f354de21-ZQRRBRWF.js} +1 -1
  79. package/dist/browser/prod/excalidraw-assets/{pieDiagram-79897490-47L6J6L2.js → pieDiagram-79897490-IGXEC2KX.js} +1 -1
  80. package/dist/browser/prod/excalidraw-assets/{quadrantDiagram-62f64e94-DF5C2GDT.js → quadrantDiagram-62f64e94-WTHHDYJL.js} +1 -1
  81. package/dist/browser/prod/excalidraw-assets/{requirementDiagram-05bf5f74-C4IMUBDN.js → requirementDiagram-05bf5f74-MV4OFRVW.js} +1 -1
  82. package/dist/browser/prod/excalidraw-assets/{sankeyDiagram-97764748-YHW7EUST.js → sankeyDiagram-97764748-ZGYUHEJT.js} +1 -1
  83. package/dist/browser/prod/excalidraw-assets/{sequenceDiagram-acc0e65c-H3XEHT32.js → sequenceDiagram-acc0e65c-IBSENK6W.js} +1 -1
  84. package/dist/browser/prod/excalidraw-assets/{stateDiagram-0ff1cf1a-Z5WB6Q3P.js → stateDiagram-0ff1cf1a-DB73XNZH.js} +1 -1
  85. package/dist/browser/prod/excalidraw-assets/{stateDiagram-v2-9a9d610d-T7OZETQC.js → stateDiagram-v2-9a9d610d-2OOBUPNR.js} +1 -1
  86. package/dist/browser/prod/excalidraw-assets/{timeline-definition-fea2a41d-VVC22BWF.js → timeline-definition-fea2a41d-P3NQQVDU.js} +1 -1
  87. package/dist/browser/prod/excalidraw-assets/{xychartDiagram-ab372869-JAXODQF7.js → xychartDiagram-ab372869-HI3XLK3Y.js} +1 -1
  88. package/dist/browser/prod/index.css +1 -1
  89. package/dist/browser/prod/index.js +24 -24
  90. package/dist/dev/{en-II4GK66F.json → en-OIPCBIOA.json} +8 -4
  91. package/dist/dev/index.css +72 -28
  92. package/dist/dev/index.css.map +3 -3
  93. package/dist/dev/index.js +5866 -3499
  94. package/dist/dev/index.js.map +4 -4
  95. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +4 -4
  96. package/dist/excalidraw/actions/actionAddToLibrary.js +4 -3
  97. package/dist/excalidraw/actions/actionAlign.d.ts +22 -22
  98. package/dist/excalidraw/actions/actionAlign.js +7 -6
  99. package/dist/excalidraw/actions/actionBoundText.d.ts +10 -10
  100. package/dist/excalidraw/actions/actionBoundText.js +11 -5
  101. package/dist/excalidraw/actions/actionCanvas.d.ts +52 -52
  102. package/dist/excalidraw/actions/actionCanvas.js +19 -14
  103. package/dist/excalidraw/actions/actionClipboard.d.ts +24 -24
  104. package/dist/excalidraw/actions/actionClipboard.js +14 -13
  105. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +10 -10
  106. package/dist/excalidraw/actions/actionDeleteSelected.js +6 -3
  107. package/dist/excalidraw/actions/actionDistribute.d.ts +10 -10
  108. package/dist/excalidraw/actions/actionDistribute.js +3 -2
  109. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +7 -8
  110. package/dist/excalidraw/actions/actionDuplicateSelection.js +7 -3
  111. package/dist/excalidraw/actions/actionElementLock.d.ts +9 -9
  112. package/dist/excalidraw/actions/actionElementLock.js +3 -2
  113. package/dist/excalidraw/actions/actionExport.d.ts +33 -33
  114. package/dist/excalidraw/actions/actionExport.js +15 -11
  115. package/dist/excalidraw/actions/actionFinalize.d.ts +9 -9
  116. package/dist/excalidraw/actions/actionFinalize.js +9 -5
  117. package/dist/excalidraw/actions/actionFlip.d.ts +10 -10
  118. package/dist/excalidraw/actions/actionFlip.js +12 -12
  119. package/dist/excalidraw/actions/actionFrame.d.ts +171 -18
  120. package/dist/excalidraw/actions/actionFrame.js +7 -6
  121. package/dist/excalidraw/actions/actionGroup.d.ts +16 -16
  122. package/dist/excalidraw/actions/actionGroup.js +9 -11
  123. package/dist/excalidraw/actions/actionHistory.d.ts +4 -3
  124. package/dist/excalidraw/actions/actionHistory.js +27 -28
  125. package/dist/excalidraw/actions/actionLinearEditor.d.ts +6 -4
  126. package/dist/excalidraw/actions/actionLinearEditor.js +21 -5
  127. package/dist/excalidraw/actions/actionLink.d.ts +5 -5
  128. package/dist/excalidraw/actions/actionLink.js +2 -1
  129. package/dist/excalidraw/actions/actionMenu.d.ts +8 -8
  130. package/dist/excalidraw/actions/actionMenu.js +4 -3
  131. package/dist/excalidraw/actions/actionNavigate.d.ts +4 -4
  132. package/dist/excalidraw/actions/actionNavigate.js +3 -2
  133. package/dist/excalidraw/actions/actionProperties.d.ts +34 -34
  134. package/dist/excalidraw/actions/actionProperties.js +19 -14
  135. package/dist/excalidraw/actions/actionSelectAll.d.ts +5 -5
  136. package/dist/excalidraw/actions/actionSelectAll.js +2 -1
  137. package/dist/excalidraw/actions/actionStyles.d.ts +11 -11
  138. package/dist/excalidraw/actions/actionStyles.js +4 -3
  139. package/dist/excalidraw/actions/actionTextAutoResize.d.ts +17 -0
  140. package/dist/excalidraw/actions/actionTextAutoResize.js +38 -0
  141. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +7 -5
  142. package/dist/excalidraw/actions/actionToggleGridMode.js +6 -2
  143. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +4 -4
  144. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.js +2 -1
  145. package/dist/excalidraw/actions/actionToggleStats.d.ts +4 -4
  146. package/dist/excalidraw/actions/actionToggleStats.js +2 -1
  147. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +4 -4
  148. package/dist/excalidraw/actions/actionToggleViewMode.js +2 -1
  149. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +4 -4
  150. package/dist/excalidraw/actions/actionToggleZenMode.js +2 -1
  151. package/dist/excalidraw/actions/actionZindex.d.ts +23 -19
  152. package/dist/excalidraw/actions/actionZindex.js +9 -4
  153. package/dist/excalidraw/actions/manager.d.ts +5 -5
  154. package/dist/excalidraw/actions/register.d.ts +1 -1
  155. package/dist/excalidraw/actions/shortcuts.d.ts +2 -2
  156. package/dist/excalidraw/actions/shortcuts.js +1 -1
  157. package/dist/excalidraw/actions/types.d.ts +8 -8
  158. package/dist/excalidraw/align.d.ts +1 -1
  159. package/dist/excalidraw/analytics.js +1 -1
  160. package/dist/excalidraw/animated-trail.d.ts +2 -2
  161. package/dist/excalidraw/appState.d.ts +5 -5
  162. package/dist/excalidraw/change.d.ts +191 -0
  163. package/dist/excalidraw/change.js +901 -0
  164. package/dist/excalidraw/charts.d.ts +1 -1
  165. package/dist/excalidraw/clients.d.ts +2 -2
  166. package/dist/excalidraw/clients.js +1 -1
  167. package/dist/excalidraw/clipboard.d.ts +3 -3
  168. package/dist/excalidraw/colors.d.ts +1 -1
  169. package/dist/excalidraw/components/Actions.d.ts +3 -3
  170. package/dist/excalidraw/components/Actions.js +9 -6
  171. package/dist/excalidraw/components/App.d.ts +28 -14
  172. package/dist/excalidraw/components/App.js +491 -204
  173. package/dist/excalidraw/components/ButtonIconSelect.js +1 -1
  174. package/dist/excalidraw/components/CheckboxItem.js +1 -1
  175. package/dist/excalidraw/components/ColorPicker/ColorInput.d.ts +1 -1
  176. package/dist/excalidraw/components/ColorPicker/ColorInput.js +1 -1
  177. package/dist/excalidraw/components/ColorPicker/ColorPicker.d.ts +4 -4
  178. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +1 -1
  179. package/dist/excalidraw/components/ColorPicker/Picker.d.ts +3 -3
  180. package/dist/excalidraw/components/ColorPicker/PickerColorList.d.ts +1 -1
  181. package/dist/excalidraw/components/ColorPicker/PickerHeading.d.ts +1 -1
  182. package/dist/excalidraw/components/ColorPicker/ShadeList.d.ts +1 -1
  183. package/dist/excalidraw/components/ColorPicker/TopPicks.d.ts +1 -1
  184. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +2 -2
  185. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.js +1 -1
  186. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -2
  187. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.js +1 -1
  188. package/dist/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -1
  189. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +30 -15
  190. package/dist/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -1
  191. package/dist/excalidraw/components/CommandPalette/types.d.ts +3 -3
  192. package/dist/excalidraw/components/ConfirmDialog.d.ts +1 -1
  193. package/dist/excalidraw/components/ContextMenu.d.ts +2 -2
  194. package/dist/excalidraw/components/ContextMenu.js +2 -2
  195. package/dist/excalidraw/components/DarkModeToggle.d.ts +1 -1
  196. package/dist/excalidraw/components/DarkModeToggle.js +3 -1
  197. package/dist/excalidraw/components/DefaultSidebar.d.ts +2 -2
  198. package/dist/excalidraw/components/Dialog.js +1 -1
  199. package/dist/excalidraw/components/DialogActionButton.d.ts +1 -1
  200. package/dist/excalidraw/components/EyeDropper.d.ts +2 -2
  201. package/dist/excalidraw/components/FollowMode/FollowMode.d.ts +1 -1
  202. package/dist/excalidraw/components/FollowMode/FollowMode.js +1 -1
  203. package/dist/excalidraw/components/HelpDialog.js +8 -6
  204. package/dist/excalidraw/components/HintViewer.d.ts +1 -1
  205. package/dist/excalidraw/components/IconPicker.js +2 -2
  206. package/dist/excalidraw/components/ImageExportDialog.d.ts +1 -1
  207. package/dist/excalidraw/components/InitializeApp.d.ts +2 -2
  208. package/dist/excalidraw/components/JSONExportDialog.d.ts +3 -3
  209. package/dist/excalidraw/components/LayerUI.d.ts +4 -4
  210. package/dist/excalidraw/components/LayerUI.js +2 -2
  211. package/dist/excalidraw/components/LibraryMenu.d.ts +2 -2
  212. package/dist/excalidraw/components/LibraryMenuBrowseButton.d.ts +1 -1
  213. package/dist/excalidraw/components/LibraryMenuControlButtons.d.ts +1 -1
  214. package/dist/excalidraw/components/LibraryMenuHeaderContent.d.ts +2 -2
  215. package/dist/excalidraw/components/LibraryMenuItems.d.ts +1 -1
  216. package/dist/excalidraw/components/LibraryMenuSection.d.ts +5 -4
  217. package/dist/excalidraw/components/LibraryUnit.d.ts +2 -2
  218. package/dist/excalidraw/components/LoadingMessage.d.ts +1 -1
  219. package/dist/excalidraw/components/MagicSettings.js +2 -2
  220. package/dist/excalidraw/components/MobileMenu.d.ts +3 -3
  221. package/dist/excalidraw/components/MobileMenu.js +1 -1
  222. package/dist/excalidraw/components/Modal.d.ts +1 -1
  223. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  224. package/dist/excalidraw/components/PasteChartDialog.d.ts +1 -1
  225. package/dist/excalidraw/components/PasteChartDialog.js +1 -1
  226. package/dist/excalidraw/components/PublishLibrary.d.ts +1 -1
  227. package/dist/excalidraw/components/RadioGroup.d.ts +2 -1
  228. package/dist/excalidraw/components/RadioGroup.js +1 -1
  229. package/dist/excalidraw/components/SVGLayer.d.ts +1 -1
  230. package/dist/excalidraw/components/Sidebar/Sidebar.d.ts +2 -2
  231. package/dist/excalidraw/components/Sidebar/Sidebar.js +1 -1
  232. package/dist/excalidraw/components/Sidebar/SidebarTab.d.ts +1 -1
  233. package/dist/excalidraw/components/Sidebar/SidebarTabTrigger.d.ts +1 -1
  234. package/dist/excalidraw/components/Sidebar/SidebarTrigger.d.ts +1 -1
  235. package/dist/excalidraw/components/Sidebar/common.d.ts +1 -1
  236. package/dist/excalidraw/components/Stack.d.ts +2 -2
  237. package/dist/excalidraw/components/Stats.d.ts +2 -2
  238. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +1 -1
  239. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.js +6 -2
  240. package/dist/excalidraw/components/TTDDialog/TTDDialog.js +2 -2
  241. package/dist/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +1 -1
  242. package/dist/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +1 -1
  243. package/dist/excalidraw/components/TTDDialog/TTDDialogPanels.d.ts +1 -1
  244. package/dist/excalidraw/components/TTDDialog/TTDDialogTabs.d.ts +1 -1
  245. package/dist/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -1
  246. package/dist/excalidraw/components/TTDDialog/common.d.ts +4 -4
  247. package/dist/excalidraw/components/TextField.d.ts +1 -1
  248. package/dist/excalidraw/components/Toast.d.ts +1 -1
  249. package/dist/excalidraw/components/ToolButton.d.ts +4 -2
  250. package/dist/excalidraw/components/ToolButton.js +1 -1
  251. package/dist/excalidraw/components/Trans.d.ts +1 -1
  252. package/dist/excalidraw/components/UserList.d.ts +1 -1
  253. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +5 -3
  254. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +5 -2
  255. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +2 -2
  256. package/dist/excalidraw/components/canvases/StaticCanvas.js +2 -2
  257. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +2 -2
  258. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +18 -0
  259. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.js +9 -0
  260. package/dist/excalidraw/components/footer/Footer.d.ts +2 -2
  261. package/dist/excalidraw/components/hyperlink/Hyperlink.d.ts +2 -2
  262. package/dist/excalidraw/components/hyperlink/Hyperlink.js +3 -3
  263. package/dist/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  264. package/dist/excalidraw/components/hyperlink/helpers.js +2 -3
  265. package/dist/excalidraw/components/icons.d.ts +6 -1
  266. package/dist/excalidraw/components/icons.js +23 -5
  267. package/dist/excalidraw/components/main-menu/DefaultItems.d.ts +12 -2
  268. package/dist/excalidraw/components/main-menu/DefaultItems.js +38 -7
  269. package/dist/excalidraw/constants.d.ts +6 -5
  270. package/dist/excalidraw/constants.js +11 -3
  271. package/dist/excalidraw/context/ui-appState.d.ts +1 -1
  272. package/dist/excalidraw/cursor.d.ts +1 -1
  273. package/dist/excalidraw/data/EditorLocalStorage.d.ts +2 -2
  274. package/dist/excalidraw/data/blob.d.ts +5 -5
  275. package/dist/excalidraw/data/filesystem.d.ts +2 -1
  276. package/dist/excalidraw/data/index.d.ts +4 -4
  277. package/dist/excalidraw/data/json.d.ts +3 -3
  278. package/dist/excalidraw/data/library.d.ts +3 -3
  279. package/dist/excalidraw/data/magic.d.ts +3 -3
  280. package/dist/excalidraw/data/magic.js +2 -1
  281. package/dist/excalidraw/data/reconcile.d.ts +6 -0
  282. package/dist/excalidraw/data/reconcile.js +49 -0
  283. package/dist/excalidraw/data/resave.d.ts +2 -2
  284. package/dist/excalidraw/data/restore.d.ts +5 -5
  285. package/dist/excalidraw/data/restore.js +9 -7
  286. package/dist/excalidraw/data/transform.d.ts +4 -4
  287. package/dist/excalidraw/data/transform.js +12 -3
  288. package/dist/excalidraw/data/types.d.ts +3 -3
  289. package/dist/excalidraw/data/url.d.ts +1 -0
  290. package/dist/excalidraw/data/url.js +4 -1
  291. package/dist/excalidraw/element/ElementCanvasButtons.d.ts +1 -1
  292. package/dist/excalidraw/element/binding.d.ts +50 -9
  293. package/dist/excalidraw/element/binding.js +712 -155
  294. package/dist/excalidraw/element/bounds.d.ts +3 -4
  295. package/dist/excalidraw/element/bounds.js +0 -3
  296. package/dist/excalidraw/element/collision.d.ts +14 -19
  297. package/dist/excalidraw/element/collision.js +36 -713
  298. package/dist/excalidraw/element/containerCache.d.ts +1 -1
  299. package/dist/excalidraw/element/dragElements.d.ts +4 -4
  300. package/dist/excalidraw/element/dragElements.js +27 -3
  301. package/dist/excalidraw/element/embeddable.d.ts +9 -6
  302. package/dist/excalidraw/element/embeddable.js +98 -62
  303. package/dist/excalidraw/element/image.d.ts +2 -2
  304. package/dist/excalidraw/element/index.d.ts +2 -3
  305. package/dist/excalidraw/element/index.js +1 -2
  306. package/dist/excalidraw/element/linearElementEditor.d.ts +12 -12
  307. package/dist/excalidraw/element/linearElementEditor.js +7 -5
  308. package/dist/excalidraw/element/mutateElement.d.ts +4 -5
  309. package/dist/excalidraw/element/mutateElement.js +5 -3
  310. package/dist/excalidraw/element/newElement.d.ts +6 -9
  311. package/dist/excalidraw/element/newElement.js +18 -15
  312. package/dist/excalidraw/element/resizeElements.d.ts +4 -4
  313. package/dist/excalidraw/element/resizeElements.js +172 -96
  314. package/dist/excalidraw/element/resizeTest.d.ts +7 -7
  315. package/dist/excalidraw/element/resizeTest.js +53 -8
  316. package/dist/excalidraw/element/showSelectedShapeActions.d.ts +2 -2
  317. package/dist/excalidraw/element/sizeHelpers.d.ts +2 -2
  318. package/dist/excalidraw/element/sizeHelpers.js +3 -0
  319. package/dist/excalidraw/element/sortElements.d.ts +1 -1
  320. package/dist/excalidraw/element/textElement.d.ts +6 -6
  321. package/dist/excalidraw/element/textElement.js +16 -37
  322. package/dist/excalidraw/element/textWysiwyg.d.ts +12 -6
  323. package/dist/excalidraw/element/textWysiwyg.js +38 -17
  324. package/dist/excalidraw/element/transformHandles.d.ts +24 -6
  325. package/dist/excalidraw/element/transformHandles.js +22 -11
  326. package/dist/excalidraw/element/typeChecks.d.ts +4 -4
  327. package/dist/excalidraw/element/types.d.ts +33 -10
  328. package/dist/excalidraw/emitter.d.ts +1 -1
  329. package/dist/excalidraw/errors.d.ts +3 -0
  330. package/dist/excalidraw/errors.js +3 -0
  331. package/dist/excalidraw/fractionalIndex.d.ts +40 -0
  332. package/dist/excalidraw/fractionalIndex.js +239 -0
  333. package/dist/excalidraw/frame.d.ts +4 -4
  334. package/dist/excalidraw/gatransforms.d.ts +1 -1
  335. package/dist/excalidraw/gesture.d.ts +1 -1
  336. package/dist/excalidraw/groups.d.ts +5 -3
  337. package/dist/excalidraw/groups.js +17 -0
  338. package/dist/excalidraw/history.d.ts +35 -47
  339. package/dist/excalidraw/history.js +100 -167
  340. package/dist/excalidraw/hooks/useCreatePortalContainer.js +2 -1
  341. package/dist/excalidraw/hooks/useEmitter.d.ts +2 -0
  342. package/dist/excalidraw/hooks/useEmitter.js +13 -0
  343. package/dist/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  344. package/dist/excalidraw/i18n.d.ts +1 -1
  345. package/dist/excalidraw/index.d.ts +3 -1
  346. package/dist/excalidraw/index.js +2 -0
  347. package/dist/excalidraw/jotai.d.ts +1 -1
  348. package/dist/excalidraw/laser-trails.d.ts +3 -2
  349. package/dist/excalidraw/locales/en.json +8 -4
  350. package/dist/excalidraw/math.d.ts +2 -2
  351. package/dist/excalidraw/mermaid.d.ts +2 -0
  352. package/dist/excalidraw/mermaid.js +28 -0
  353. package/dist/excalidraw/points.d.ts +1 -1
  354. package/dist/excalidraw/queue.d.ts +1 -1
  355. package/dist/excalidraw/renderer/helpers.d.ts +2 -2
  356. package/dist/excalidraw/renderer/helpers.js +2 -2
  357. package/dist/excalidraw/renderer/interactiveScene.d.ts +2 -2
  358. package/dist/excalidraw/renderer/interactiveScene.js +38 -11
  359. package/dist/excalidraw/renderer/renderElement.d.ts +4 -4
  360. package/dist/excalidraw/renderer/renderElement.js +7 -7
  361. package/dist/excalidraw/renderer/renderSnaps.d.ts +1 -1
  362. package/dist/excalidraw/renderer/renderSnaps.js +2 -1
  363. package/dist/excalidraw/renderer/staticScene.d.ts +1 -1
  364. package/dist/excalidraw/renderer/staticScene.js +14 -3
  365. package/dist/excalidraw/renderer/staticSvgScene.d.ts +4 -4
  366. package/dist/excalidraw/renderer/staticSvgScene.js +10 -0
  367. package/dist/excalidraw/scene/Fonts.d.ts +2 -4
  368. package/dist/excalidraw/scene/Fonts.js +6 -12
  369. package/dist/excalidraw/scene/Renderer.d.ts +4 -4
  370. package/dist/excalidraw/scene/Renderer.js +2 -3
  371. package/dist/excalidraw/scene/Scene.d.ts +19 -12
  372. package/dist/excalidraw/scene/Scene.js +44 -23
  373. package/dist/excalidraw/scene/Shape.d.ts +1 -1
  374. package/dist/excalidraw/scene/ShapeCache.d.ts +4 -4
  375. package/dist/excalidraw/scene/comparisons.d.ts +2 -2
  376. package/dist/excalidraw/scene/export.d.ts +2 -2
  377. package/dist/excalidraw/scene/export.js +6 -5
  378. package/dist/excalidraw/scene/scroll.d.ts +2 -2
  379. package/dist/excalidraw/scene/scrollbars.d.ts +3 -3
  380. package/dist/excalidraw/scene/selection.d.ts +2 -2
  381. package/dist/excalidraw/scene/types.d.ts +7 -5
  382. package/dist/excalidraw/scene/zoom.d.ts +1 -1
  383. package/dist/excalidraw/snapping.d.ts +4 -4
  384. package/dist/excalidraw/snapping.js +2 -1
  385. package/dist/excalidraw/store.d.ts +129 -0
  386. package/dist/excalidraw/store.js +296 -0
  387. package/dist/excalidraw/types.d.ts +34 -19
  388. package/dist/excalidraw/utils.d.ts +11 -4
  389. package/dist/excalidraw/utils.js +8 -0
  390. package/dist/excalidraw/zindex.d.ts +4 -4
  391. package/dist/excalidraw/zindex.js +9 -13
  392. package/dist/prod/{en-II4GK66F.json → en-OIPCBIOA.json} +8 -4
  393. package/dist/prod/index.css +1 -1
  394. package/dist/prod/index.js +44 -44
  395. package/dist/utils/bbox.d.ts +2 -2
  396. package/dist/utils/collision.d.ts +4 -0
  397. package/dist/utils/collision.js +48 -0
  398. package/dist/utils/export.d.ts +2 -2
  399. package/dist/utils/geometry/geometry.d.ts +71 -0
  400. package/dist/utils/geometry/geometry.js +674 -0
  401. package/dist/utils/geometry/shape.d.ts +56 -0
  402. package/dist/utils/geometry/shape.js +168 -0
  403. package/dist/utils/withinBounds.d.ts +1 -1
  404. package/history.ts +163 -218
  405. package/package.json +3 -2
  406. package/dist/browser/dev/excalidraw-assets-dev/chunk-AK7SWNLN.js.map +0 -7
  407. package/dist/browser/dev/excalidraw-assets-dev/chunk-RWZVJAQU.js.map +0 -7
  408. package/dist/browser/dev/excalidraw-assets-dev/chunk-Z3PH3V2B.js.map +0 -7
  409. package/dist/browser/dev/excalidraw-assets-dev/dist-Z46EOVOL.js.map +0 -7
  410. package/dist/browser/dev/excalidraw-assets-dev/image-OFRRV5MB.css.map +0 -7
  411. package/dist/browser/prod/excalidraw-assets/chunk-LL4GORAM.js +0 -55
  412. package/dist/browser/prod/excalidraw-assets/dist-PIPZXALV.js +0 -6
  413. package/dist/browser/prod/excalidraw-assets/image-EFCJDJH3.js +0 -1
  414. /package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-ACFH36JV.js.map → blockDiagram-91b80b7a-H47FTXHA.js.map} +0 -0
  415. /package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-QZ27YR47.js.map → c4Diagram-b2a90758-NNJK6GKC.js.map} +0 -0
  416. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-HO2HMSK7.js.map → chunk-4KQVEBHW.js.map} +0 -0
  417. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-USGV265L.js.map → chunk-53YI56GV.js.map} +0 -0
  418. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-EDFX3S7X.js.map → chunk-A2WCJI4I.js.map} +0 -0
  419. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js.map → chunk-EFLPX7NE.js.map} +0 -0
  420. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js.map → chunk-JYIQCNWV.js.map} +0 -0
  421. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js.map → chunk-LVIQQW6F.js.map} +0 -0
  422. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-6U7GQNJT.js.map → chunk-PXLO3FOU.js.map} +0 -0
  423. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-7DACDEY3.js.map → chunk-TO2AW5PW.js.map} +0 -0
  424. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-NJ77ZFNJ.js.map → chunk-VURILHLY.js.map} +0 -0
  425. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-2T2GU7NF.js.map → chunk-ZAYGSUHF.js.map} +0 -0
  426. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-QSLMH4JW.js.map → classDiagram-30eddba6-CUYIJICN.js.map} +0 -0
  427. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-DY4DYQ5P.js.map → classDiagram-v2-f2df5561-K6WW6K73.js.map} +0 -0
  428. /package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js.map → en-Y27YPU72.js.map} +0 -0
  429. /package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-SOOJRTCB.js.map → erDiagram-47591fe2-XGAD7EEP.js.map} +0 -0
  430. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-AHGL4KPK.js.map → flowDiagram-5540d9b9-B6EOVNNO.js.map} +0 -0
  431. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-56LDZZWY.js.map → flowDiagram-v2-3b53844e-NUG24FJH.js.map} +0 -0
  432. /package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-27LUKRI6.js.map → flowchart-elk-definition-5fe447d6-25Y7PCBL.js.map} +0 -0
  433. /package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-EHGYGNG6.js.map → ganttDiagram-9a3bba1f-GNL6ZDTC.js.map} +0 -0
  434. /package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-AJQNBDW5.js.map → gitGraphDiagram-96e6b4ee-HNW52NVO.js.map} +0 -0
  435. /package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js.map → image-J7S3ALXP.js.map} +0 -0
  436. /package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-SWLLQVES.js.map → infoDiagram-bcd20f53-FWEUVFLT.js.map} +0 -0
  437. /package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-7UAVCWOZ.js.map → journeyDiagram-4fe6b3dc-RZIUI7UG.js.map} +0 -0
  438. /package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-SROW5KGM.js.map → mindmap-definition-f354de21-GBVN45GU.js.map} +0 -0
  439. /package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-QKCI6NCB.js.map → pieDiagram-79897490-ECENNII6.js.map} +0 -0
  440. /package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-LNYJZFC5.js.map → quadrantDiagram-62f64e94-ZMEOFVNL.js.map} +0 -0
  441. /package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZZD7ZHFA.js.map → requirementDiagram-05bf5f74-FHZSFHCR.js.map} +0 -0
  442. /package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-L75ZZ4UM.js.map → sankeyDiagram-97764748-VDKIKTA6.js.map} +0 -0
  443. /package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-6PCU7TDK.js.map → sequenceDiagram-acc0e65c-6JUSPVKX.js.map} +0 -0
  444. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-WM76WOPR.js.map → stateDiagram-0ff1cf1a-L3AKWENF.js.map} +0 -0
  445. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-N4HZW3O2.js.map → stateDiagram-v2-9a9d610d-NU3GGMCH.js.map} +0 -0
  446. /package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-ZHGCAXGP.js.map → timeline-definition-fea2a41d-JGP7XCHW.js.map} +0 -0
  447. /package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-2DLOVRAZ.js.map → xychartDiagram-ab372869-HLFHHF2I.js.map} +0 -0
@@ -1,18 +1,18 @@
1
- import { getElementAbsoluteCoords, OMIT_SIDES_FOR_MULTIPLE_ELEMENTS, getTransformHandlesFromCoords, getTransformHandles, getCommonBounds, } from "../element";
1
+ import { getElementAbsoluteCoords, getTransformHandlesFromCoords, getTransformHandles, getCommonBounds, } from "../element";
2
2
  import { roundRect } from "../renderer/roundRect";
3
3
  import { getScrollBars, SCROLLBAR_COLOR, SCROLLBAR_WIDTH, } from "../scene/scrollbars";
4
4
  import { renderSelectionElement } from "../renderer/renderElement";
5
5
  import { getClientColor, renderRemoteCursors } from "../clients";
6
6
  import { isSelectedViaGroup, getSelectedGroupIds, getElementsInGroup, selectGroupsFromGivenElements, } from "../groups";
7
- import { OMIT_SIDES_FOR_FRAME, shouldShowBoundingBox, } from "../element/transformHandles";
7
+ import { getOmitSidesForDevice, shouldShowBoundingBox, } from "../element/transformHandles";
8
8
  import { arrayToMap, throttleRAF } from "../utils";
9
9
  import { DEFAULT_TRANSFORM_HANDLE_SPACING, FRAME_STYLE } from "../constants";
10
10
  import { renderSnaps } from "../renderer/renderSnaps";
11
- import { maxBindingGap } from "../element/collision";
11
+ import { maxBindingGap } from "../element/binding";
12
12
  import { LinearElementEditor } from "../element/linearElementEditor";
13
13
  import { bootstrapCanvas, fillCircle, getNormalizedCanvasDimensions, } from "./helpers";
14
14
  import oc from "open-color";
15
- import { isFrameLikeElement, isLinearElement } from "../element/typeChecks";
15
+ import { isFrameLikeElement, isLinearElement, isTextElement, } from "../element/typeChecks";
16
16
  const renderLinearElementPointHighlight = (context, appState, elementsMap) => {
17
17
  const { elementId, hoverPointIndex } = appState.selectedLinearElement;
18
18
  if (appState.editingLinearElement?.selectedPointsIndices?.includes(hoverPointIndex)) {
@@ -124,10 +124,11 @@ const renderBindingHighlightForSuggestedPointBinding = (context, suggestedBindin
124
124
  fillCircle(context, x, y, threshold);
125
125
  });
126
126
  };
127
- const renderSelectionBorder = (context, appState, elementProperties, padding = DEFAULT_TRANSFORM_HANDLE_SPACING * 2) => {
127
+ const renderSelectionBorder = (context, appState, elementProperties) => {
128
128
  const { angle, elementX1, elementY1, elementX2, elementY2, selectionColors, cx, cy, dashed, activeEmbeddable, } = elementProperties;
129
129
  const elementWidth = elementX2 - elementX1;
130
130
  const elementHeight = elementY2 - elementY1;
131
+ const padding = DEFAULT_TRANSFORM_HANDLE_SPACING * 2;
131
132
  const linePadding = padding / appState.zoom.value;
132
133
  const lineWidth = 8 / appState.zoom.value;
133
134
  const spaceWidth = 4 / appState.zoom.value;
@@ -264,7 +265,23 @@ const renderTransformHandles = (context, renderConfig, appState, transformHandle
264
265
  }
265
266
  });
266
267
  };
267
- const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selectedElements, scale, appState, renderConfig, }) => {
268
+ const renderTextBox = (text, context, appState, selectionColor) => {
269
+ context.save();
270
+ const padding = (DEFAULT_TRANSFORM_HANDLE_SPACING * 2) / appState.zoom.value;
271
+ const width = text.width + padding * 2;
272
+ const height = text.height + padding * 2;
273
+ const cx = text.x + width / 2;
274
+ const cy = text.y + height / 2;
275
+ const shiftX = -(width / 2 + padding);
276
+ const shiftY = -(height / 2 + padding);
277
+ context.translate(cx + appState.scrollX, cy + appState.scrollY);
278
+ context.rotate(text.angle);
279
+ context.lineWidth = 1 / appState.zoom.value;
280
+ context.strokeStyle = selectionColor;
281
+ context.strokeRect(shiftX, shiftY, width, height);
282
+ context.restore();
283
+ };
284
+ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selectedElements, allElementsMap, scale, appState, renderConfig, device, }) => {
268
285
  if (canvas === null) {
269
286
  return { atLeastOneVisibleElement: false, elementsMap };
270
287
  }
@@ -295,12 +312,18 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
295
312
  // Paint selection element
296
313
  if (appState.selectionElement) {
297
314
  try {
298
- renderSelectionElement(appState.selectionElement, context, appState);
315
+ renderSelectionElement(appState.selectionElement, context, appState, renderConfig.selectionColor);
299
316
  }
300
317
  catch (error) {
301
318
  console.error(error);
302
319
  }
303
320
  }
321
+ if (appState.editingElement && isTextElement(appState.editingElement)) {
322
+ const textElement = allElementsMap.get(appState.editingElement.id);
323
+ if (textElement && !textElement.autoResize) {
324
+ renderTextBox(textElement, context, appState, renderConfig.selectionColor);
325
+ }
326
+ }
304
327
  if (appState.isBindingEnabled) {
305
328
  appState.suggestedBindings
306
329
  .filter((binding) => binding != null)
@@ -403,8 +426,12 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
403
426
  context.translate(appState.scrollX, appState.scrollY);
404
427
  if (selectedElements.length === 1) {
405
428
  context.fillStyle = oc.white;
406
- const transformHandles = getTransformHandles(selectedElements[0], appState.zoom, elementsMap, "mouse");
407
- if (!appState.viewModeEnabled && showBoundingBox) {
429
+ const transformHandles = getTransformHandles(selectedElements[0], appState.zoom, elementsMap, "mouse", // when we render we don't know which pointer type so use mouse,
430
+ getOmitSidesForDevice(device));
431
+ if (!appState.viewModeEnabled &&
432
+ showBoundingBox &&
433
+ // do not show transform handles when text is being edited
434
+ !isTextElement(appState.editingElement)) {
408
435
  renderTransformHandles(context, renderConfig, appState, transformHandles, selectedElements[0].angle);
409
436
  }
410
437
  }
@@ -421,8 +448,8 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
421
448
  context.lineWidth = lineWidth;
422
449
  context.setLineDash(initialLineDash);
423
450
  const transformHandles = getTransformHandlesFromCoords([x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2], 0, appState.zoom, "mouse", isFrameSelected
424
- ? OMIT_SIDES_FOR_FRAME
425
- : OMIT_SIDES_FOR_MULTIPLE_ELEMENTS);
451
+ ? { ...getOmitSidesForDevice(device), rotation: true }
452
+ : getOmitSidesForDevice(device));
426
453
  if (selectedElements.some((element) => !element.locked)) {
427
454
  renderTransformHandles(context, renderConfig, appState, transformHandles, 0);
428
455
  }
@@ -1,7 +1,7 @@
1
- import { ExcalidrawElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, ExcalidrawFreeDrawElement, ExcalidrawFrameLikeElement, NonDeletedSceneElementsMap } from "../element/types";
1
+ import type { ExcalidrawElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, ExcalidrawFreeDrawElement, ExcalidrawFrameLikeElement, NonDeletedSceneElementsMap } from "../element/types";
2
2
  import type { RoughCanvas } from "roughjs/bin/canvas";
3
- import { StaticCanvasRenderConfig, RenderableElementsMap } from "../scene/types";
4
- import { AppState, StaticCanvasAppState, InteractiveCanvasAppState, ElementsPendingErasure } from "../types";
3
+ import type { StaticCanvasRenderConfig, RenderableElementsMap, InteractiveCanvasRenderConfig } from "../scene/types";
4
+ import type { AppState, StaticCanvasAppState, InteractiveCanvasAppState, ElementsPendingErasure } from "../types";
5
5
  export declare const IMAGE_INVERT_FILTER = "invert(100%) hue-rotate(180deg) saturate(1.25)";
6
6
  export declare const getRenderOpacity: (element: ExcalidrawElement, containingFrame: ExcalidrawFrameLikeElement | null, elementsPendingErasure: ElementsPendingErasure) => number;
7
7
  export interface ExcalidrawElementWithCanvas {
@@ -17,7 +17,7 @@ export interface ExcalidrawElementWithCanvas {
17
17
  }
18
18
  export declare const DEFAULT_LINK_SIZE = 14;
19
19
  export declare const elementWithCanvasCache: WeakMap<ExcalidrawElement, ExcalidrawElementWithCanvas>;
20
- export declare const renderSelectionElement: (element: NonDeletedExcalidrawElement, context: CanvasRenderingContext2D, appState: InteractiveCanvasAppState) => void;
20
+ export declare const renderSelectionElement: (element: NonDeletedExcalidrawElement, context: CanvasRenderingContext2D, appState: InteractiveCanvasAppState, selectionColor: InteractiveCanvasRenderConfig["selectionColor"]) => void;
21
21
  export declare const renderElement: (element: NonDeletedExcalidrawElement, elementsMap: RenderableElementsMap, allElementsMap: NonDeletedSceneElementsMap, rc: RoughCanvas, context: CanvasRenderingContext2D, renderConfig: StaticCanvasRenderConfig, appState: StaticCanvasAppState) => void;
22
22
  export declare const pathsCache: WeakMap<ExcalidrawFreeDrawElement, Path2D>;
23
23
  export declare function generateFreeDrawShape(element: ExcalidrawFreeDrawElement): Path2D;
@@ -4,7 +4,7 @@ import { distance, getFontString, isRTL } from "../utils";
4
4
  import { getCornerRadius, isRightAngle } from "../math";
5
5
  import rough from "roughjs/bin/rough";
6
6
  import { getDefaultAppState } from "../appState";
7
- import { BOUND_TEXT_PADDING, ELEMENT_READY_TO_ERASE_OPACITY, FRAME_STYLE, MIME_TYPES, } from "../constants";
7
+ import { BOUND_TEXT_PADDING, ELEMENT_READY_TO_ERASE_OPACITY, FRAME_STYLE, MIME_TYPES, THEME, } from "../constants";
8
8
  import { getStroke } from "perfect-freehand";
9
9
  import { getBoundTextElement, getContainerCoords, getContainerElement, getLineHeightInPx, getBoundTextMaxHeight, getBoundTextMaxWidth, getVerticalOffset, } from "../element/textElement";
10
10
  import { LinearElementEditor } from "../element/linearElementEditor";
@@ -19,7 +19,7 @@ const defaultAppState = getDefaultAppState();
19
19
  const isPendingImageElement = (element, renderConfig) => isInitializedImageElement(element) &&
20
20
  !renderConfig.imageCache.has(element.fileId);
21
21
  const shouldResetImageFilter = (element, renderConfig, appState) => {
22
- return (appState.theme === "dark" &&
22
+ return (appState.theme === THEME.DARK &&
23
23
  isInitializedImageElement(element) &&
24
24
  !isPendingImageElement(element, renderConfig) &&
25
25
  renderConfig.imageCache.get(element.fileId)?.mimeType !== MIME_TYPES.svg);
@@ -119,7 +119,7 @@ const IMAGE_PLACEHOLDER_IMG = document.createElement("img");
119
119
  IMAGE_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(`<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="image" class="svg-inline--fa fa-image fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#888" d="M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z"></path></svg>`)}`;
120
120
  const IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement("img");
121
121
  IMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(`<svg viewBox="0 0 668 668" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48ZM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56ZM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48Z" style="fill:#888;fill-rule:nonzero" transform="matrix(.81709 0 0 .81709 124.825 145.825)"/><path d="M256 8C119.034 8 8 119.033 8 256c0 136.967 111.034 248 248 248s248-111.034 248-248S392.967 8 256 8Zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676ZM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676Z" style="fill:#888;fill-rule:nonzero" transform="matrix(.30366 0 0 .30366 506.822 60.065)"/></svg>`)}`;
122
- const drawImagePlaceholder = (element, context, zoomValue) => {
122
+ const drawImagePlaceholder = (element, context) => {
123
123
  context.fillStyle = "#E7E7E7";
124
124
  context.fillRect(0, 0, element.width, element.height);
125
125
  const imageMinWidthOrHeight = Math.min(element.width, element.height);
@@ -176,7 +176,7 @@ const drawElementOnCanvas = (element, rc, context, renderConfig, appState) => {
176
176
  context.drawImage(img, 0 /* hardcoded for the selection box*/, 0, element.width, element.height);
177
177
  }
178
178
  else {
179
- drawImagePlaceholder(element, context, appState.zoom.value);
179
+ drawImagePlaceholder(element, context);
180
180
  }
181
181
  break;
182
182
  }
@@ -323,7 +323,7 @@ const drawElementFromCanvas = (elementWithCanvas, context, renderConfig, appStat
323
323
  context.restore();
324
324
  // Clear the nested element we appended to the DOM
325
325
  };
326
- export const renderSelectionElement = (element, context, appState) => {
326
+ export const renderSelectionElement = (element, context, appState, selectionColor) => {
327
327
  context.save();
328
328
  context.translate(element.x + appState.scrollX, element.y + appState.scrollY);
329
329
  context.fillStyle = "rgba(0, 0, 200, 0.04)";
@@ -334,7 +334,7 @@ export const renderSelectionElement = (element, context, appState) => {
334
334
  const offset = 0.5 / appState.zoom.value;
335
335
  context.fillRect(offset, offset, element.width, element.height);
336
336
  context.lineWidth = 1 / appState.zoom.value;
337
- context.strokeStyle = " rgb(105, 101, 219)";
337
+ context.strokeStyle = selectionColor;
338
338
  context.strokeRect(offset, offset, element.width, element.height);
339
339
  context.restore();
340
340
  };
@@ -352,7 +352,7 @@ export const renderElement = (element, elementsMap, allElementsMap, rc, context,
352
352
  // TODO change later to only affect AI frames
353
353
  if (isMagicFrameElement(element)) {
354
354
  context.strokeStyle =
355
- appState.theme === "light" ? "#7affd7" : "#1d8264";
355
+ appState.theme === THEME.LIGHT ? "#7affd7" : "#1d8264";
356
356
  }
357
357
  if (FRAME_STYLE.radius && context.roundRect) {
358
358
  context.beginPath();
@@ -1,2 +1,2 @@
1
- import { InteractiveCanvasAppState } from "../types";
1
+ import type { InteractiveCanvasAppState } from "../types";
2
2
  export declare const renderSnaps: (context: CanvasRenderingContext2D, appState: InteractiveCanvasAppState) => void;
@@ -1,3 +1,4 @@
1
+ import { THEME } from "../constants";
1
2
  const SNAP_COLOR_LIGHT = "#ff6b6b";
2
3
  const SNAP_COLOR_DARK = "#ff0000";
3
4
  const SNAP_WIDTH = 1;
@@ -9,7 +10,7 @@ export const renderSnaps = (context, appState) => {
9
10
  // in dark mode, we need to adjust the color to account for color inversion.
10
11
  // Don't change if zen mode, because we draw only crosses, we want the
11
12
  // colors to be more visible
12
- const snapColor = appState.theme === "light" || appState.zenModeEnabled
13
+ const snapColor = appState.theme === THEME.LIGHT || appState.zenModeEnabled
13
14
  ? SNAP_COLOR_LIGHT
14
15
  : SNAP_COLOR_DARK;
15
16
  // in zen mode make the cross more visible since we don't draw the lines
@@ -1,4 +1,4 @@
1
- import { StaticSceneRenderConfig } from "../scene/types";
1
+ import type { StaticSceneRenderConfig } from "../scene/types";
2
2
  /** throttled to animation framerate */
3
3
  export declare const renderStaticSceneThrottled: {
4
4
  (config: StaticSceneRenderConfig): void;
@@ -1,12 +1,13 @@
1
1
  import { FRAME_STYLE } from "../constants";
2
2
  import { getElementAbsoluteCoords } from "../element";
3
3
  import { elementOverlapsWithFrame, getTargetFrame, isElementInFrame, } from "../frame";
4
- import { isEmbeddableElement, isIframeLikeElement, } from "../element/typeChecks";
4
+ import { isEmbeddableElement, isIframeLikeElement, isTextElement, } from "../element/typeChecks";
5
5
  import { renderElement } from "../renderer/renderElement";
6
6
  import { createPlaceholderEmbeddableLabel } from "../element/embeddable";
7
7
  import { EXTERNAL_LINK_IMG, getLinkHandleFromCoords, } from "../components/hyperlink/helpers";
8
8
  import { bootstrapCanvas, getNormalizedCanvasDimensions } from "./helpers";
9
9
  import { throttleRAF } from "../utils";
10
+ import { getBoundTextElement } from "../element/textElement";
10
11
  const strokeGrid = (context, gridSize, scrollX, scrollY, zoom, width, height) => {
11
12
  const BOLD_LINE_FREQUENCY = 5;
12
13
  let GridLineColor;
@@ -121,21 +122,31 @@ const _renderStaticScene = ({ canvas, rc, elementsMap, allElementsMap, visibleEl
121
122
  .forEach((element) => {
122
123
  try {
123
124
  const frameId = element.frameId || appState.frameToHighlight?.id;
125
+ if (isTextElement(element) &&
126
+ element.containerId &&
127
+ elementsMap.has(element.containerId)) {
128
+ // will be rendered with the container
129
+ return;
130
+ }
131
+ context.save();
124
132
  if (frameId &&
125
133
  appState.frameRendering.enabled &&
126
134
  appState.frameRendering.clip) {
127
- context.save();
128
135
  const frame = getTargetFrame(element, elementsMap, appState);
129
136
  // TODO do we need to check isElementInFrame here?
130
137
  if (frame && isElementInFrame(element, elementsMap, appState)) {
131
138
  frameClip(frame, context, renderConfig, appState);
132
139
  }
133
140
  renderElement(element, elementsMap, allElementsMap, rc, context, renderConfig, appState);
134
- context.restore();
135
141
  }
136
142
  else {
137
143
  renderElement(element, elementsMap, allElementsMap, rc, context, renderConfig, appState);
138
144
  }
145
+ const boundTextElement = getBoundTextElement(element, elementsMap);
146
+ if (boundTextElement) {
147
+ renderElement(boundTextElement, elementsMap, allElementsMap, rc, context, renderConfig, appState);
148
+ }
149
+ context.restore();
139
150
  if (!isExporting) {
140
151
  renderLinkIcon(element, context, appState, elementsMap);
141
152
  }
@@ -1,5 +1,5 @@
1
- import { RoughSVG } from "roughjs/bin/svg";
2
- import { NonDeletedExcalidrawElement } from "../element/types";
3
- import { RenderableElementsMap, SVGRenderConfig } from "../scene/types";
4
- import { BinaryFiles } from "../types";
1
+ import type { RoughSVG } from "roughjs/bin/svg";
2
+ import type { NonDeletedExcalidrawElement } from "../element/types";
3
+ import type { RenderableElementsMap, SVGRenderConfig } from "../scene/types";
4
+ import type { BinaryFiles } from "../types";
5
5
  export declare const renderSceneToSvg: (elements: readonly NonDeletedExcalidrawElement[], elementsMap: RenderableElementsMap, rsvg: RoughSVG, svgRoot: SVGElement, files: BinaryFiles, renderConfig: SVGRenderConfig) => void;
@@ -361,8 +361,18 @@ export const renderSceneToSvg = (elements, elementsMap, rsvg, svgRoot, files, re
361
361
  .filter((el) => !isIframeLikeElement(el))
362
362
  .forEach((element) => {
363
363
  if (!element.isDeleted) {
364
+ if (isTextElement(element) &&
365
+ element.containerId &&
366
+ elementsMap.has(element.containerId)) {
367
+ // will be rendered with the container
368
+ return;
369
+ }
364
370
  try {
365
371
  renderElementToSvg(element, elementsMap, rsvg, svgRoot, files, element.x + renderConfig.offsetX, element.y + renderConfig.offsetY, renderConfig);
372
+ const boundTextElement = getBoundTextElement(element, elementsMap);
373
+ if (boundTextElement) {
374
+ renderElementToSvg(boundTextElement, elementsMap, rsvg, svgRoot, files, boundTextElement.x + renderConfig.offsetX, boundTextElement.y + renderConfig.offsetY, renderConfig);
375
+ }
366
376
  }
367
377
  catch (error) {
368
378
  console.error(error);
@@ -1,11 +1,9 @@
1
- import { ExcalidrawElement } from "../element/types";
1
+ import type { ExcalidrawElement } from "../element/types";
2
2
  import type Scene from "./Scene";
3
3
  export declare class Fonts {
4
4
  private scene;
5
- private onSceneUpdated;
6
- constructor({ scene, onSceneUpdated, }: {
5
+ constructor({ scene }: {
7
6
  scene: Scene;
8
- onSceneUpdated: () => void;
9
7
  });
10
8
  private static loadedFontFaces;
11
9
  /**
@@ -1,15 +1,11 @@
1
- import { isTextElement, refreshTextDimensions } from "../element";
1
+ import { isTextElement } from "../element";
2
2
  import { newElementWith } from "../element/mutateElement";
3
- import { getContainerElement } from "../element/textElement";
4
- import { isBoundToContainer } from "../element/typeChecks";
5
3
  import { getFontString } from "../utils";
6
4
  import { ShapeCache } from "./ShapeCache";
7
5
  export class Fonts {
8
6
  scene;
9
- onSceneUpdated;
10
- constructor({ scene, onSceneUpdated, }) {
7
+ constructor({ scene }) {
11
8
  this.scene = scene;
12
- this.onSceneUpdated = onSceneUpdated;
13
9
  }
14
10
  // it's ok to track fonts across multiple instances only once, so let's use
15
11
  // a static member to reduce memory footprint
@@ -39,17 +35,15 @@ export class Fonts {
39
35
  }
40
36
  let didUpdate = false;
41
37
  this.scene.mapElements((element) => {
42
- if (isTextElement(element) && !isBoundToContainer(element)) {
43
- ShapeCache.delete(element);
38
+ if (isTextElement(element)) {
44
39
  didUpdate = true;
45
- return newElementWith(element, {
46
- ...refreshTextDimensions(element, getContainerElement(element, this.scene.getNonDeletedElementsMap()), this.scene.getNonDeletedElementsMap()),
47
- });
40
+ ShapeCache.delete(element);
41
+ return newElementWith(element, {}, true);
48
42
  }
49
43
  return element;
50
44
  });
51
45
  if (didUpdate) {
52
- this.onSceneUpdated();
46
+ this.scene.triggerUpdate();
53
47
  }
54
48
  };
55
49
  loadFontsForElements = async (elements) => {
@@ -1,6 +1,6 @@
1
- import { NonDeletedExcalidrawElement } from "../element/types";
2
- import { AppState } from "../types";
3
- import Scene from "./Scene";
1
+ import type { NonDeletedExcalidrawElement } from "../element/types";
2
+ import type { AppState } from "../types";
3
+ import type Scene from "./Scene";
4
4
  export declare class Renderer {
5
5
  private scene;
6
6
  constructor(scene: Scene);
@@ -14,7 +14,7 @@ export declare class Renderer {
14
14
  width: AppState["width"];
15
15
  editingElement: AppState["editingElement"];
16
16
  pendingImageElementId: AppState["pendingImageElementId"];
17
- versionNonce: ReturnType<InstanceType<typeof Scene>["getVersionNonce"]>;
17
+ sceneNonce: ReturnType<InstanceType<typeof Scene>["getSceneNonce"]>;
18
18
  }) => {
19
19
  elementsMap: Map<string, NonDeletedExcalidrawElement> & import("../utility-types").MakeBrand<"NonDeletedElementsMap"> & import("../utility-types").MakeBrand<"RenderableElementsMap">;
20
20
  visibleElements: readonly NonDeletedExcalidrawElement[];
@@ -45,9 +45,8 @@ export class Renderer {
45
45
  return elementsMap;
46
46
  };
47
47
  return memoize(({ zoom, offsetLeft, offsetTop, scrollX, scrollY, height, width, editingElement, pendingImageElementId,
48
- // unused but serves we cache on it to invalidate elements if they
49
- // get mutated
50
- versionNonce: _versionNonce, }) => {
48
+ // cache-invalidation nonce
49
+ sceneNonce: _sceneNonce, }) => {
51
50
  const elements = this.scene.getNonDeletedElements();
52
51
  const elementsMap = getRenderableElements({
53
52
  elements,
@@ -1,6 +1,6 @@
1
- import { ExcalidrawElement, NonDeletedExcalidrawElement, NonDeleted, ExcalidrawFrameLikeElement, ElementsMapOrArray } from "../element/types";
2
- import { LinearElementEditor } from "../element/linearElementEditor";
3
- import { AppState } from "../types";
1
+ import type { ExcalidrawElement, NonDeletedExcalidrawElement, NonDeleted, ExcalidrawFrameLikeElement, ElementsMapOrArray, OrderedExcalidrawElement, Ordered } from "../element/types";
2
+ import type { LinearElementEditor } from "../element/linearElementEditor";
3
+ import type { AppState } from "../types";
4
4
  type ElementIdKey = InstanceType<typeof LinearElementEditor>["elementId"];
5
5
  type ElementKey = ExcalidrawElement | ElementIdKey;
6
6
  type SceneStateCallback = () => void;
@@ -19,11 +19,18 @@ declare class Scene {
19
19
  private frames;
20
20
  private elementsMap;
21
21
  private selectedElementsCache;
22
- private versionNonce;
23
- getElementsMapIncludingDeleted(): Map<string, ExcalidrawElement> & import("../utility-types").MakeBrand<"SceneElementsMap">;
24
- getNonDeletedElementsMap(): Map<string, NonDeletedExcalidrawElement> & import("../utility-types").MakeBrand<"NonDeletedSceneElementsMap">;
25
- getElementsIncludingDeleted(): readonly ExcalidrawElement[];
26
- getNonDeletedElements(): readonly NonDeletedExcalidrawElement[];
22
+ /**
23
+ * Random integer regenerated each scene update.
24
+ *
25
+ * Does not relate to elements versions, it's only a renderer
26
+ * cache-invalidation nonce at the moment.
27
+ */
28
+ private sceneNonce;
29
+ getSceneNonce(): number | undefined;
30
+ getNonDeletedElementsMap(): Map<string, Ordered<NonDeletedExcalidrawElement>> & import("../utility-types").MakeBrand<"NonDeletedSceneElementsMap">;
31
+ getElementsIncludingDeleted(): readonly OrderedExcalidrawElement[];
32
+ getElementsMapIncludingDeleted(): Map<string, Ordered<ExcalidrawElement>> & import("../utility-types").MakeBrand<"SceneElementsMap">;
33
+ getNonDeletedElements(): readonly Ordered<NonDeletedExcalidrawElement>[];
27
34
  getFramesIncludingDeleted(): readonly ExcalidrawFrameLikeElement[];
28
35
  getSelectedElements(opts: {
29
36
  selectedElementIds: AppState["selectedElementIds"];
@@ -38,7 +45,6 @@ declare class Scene {
38
45
  }): NonDeleted<ExcalidrawElement>[];
39
46
  getNonDeletedFramesLikes(): readonly NonDeleted<ExcalidrawFrameLikeElement>[];
40
47
  getElement<T extends ExcalidrawElement>(id: T["id"]): T | null;
41
- getVersionNonce(): number | undefined;
42
48
  getNonDeletedElement(id: ExcalidrawElement["id"]): NonDeleted<ExcalidrawElement> | null;
43
49
  /**
44
50
  * A utility method to help with updating all scene elements, with the added
@@ -54,12 +60,13 @@ declare class Scene {
54
60
  */
55
61
  mapElements(iteratee: (element: ExcalidrawElement) => ExcalidrawElement): boolean;
56
62
  replaceAllElements(nextElements: ElementsMapOrArray): void;
57
- informMutation(): void;
58
- addCallback(cb: SceneStateCallback): SceneStateCallbackRemover;
63
+ triggerUpdate(): void;
64
+ onUpdate(cb: SceneStateCallback): SceneStateCallbackRemover;
59
65
  destroy(): void;
60
66
  insertElementAtIndex(element: ExcalidrawElement, index: number): void;
61
67
  insertElementsAtIndex(elements: ExcalidrawElement[], index: number): void;
62
- addNewElement: (element: ExcalidrawElement) => void;
68
+ insertElement: (element: ExcalidrawElement) => void;
69
+ insertElements: (elements: ExcalidrawElement[]) => void;
63
70
  getElementIndex(elementId: string): number;
64
71
  getContainerElement: (element: (ExcalidrawElement & {
65
72
  containerId: ExcalidrawElement["id"] | null;
@@ -2,7 +2,10 @@ import { isNonDeletedElement } from "../element";
2
2
  import { isFrameLikeElement } from "../element/typeChecks";
3
3
  import { getSelectedElements } from "./selection";
4
4
  import { randomInteger } from "../random";
5
+ import { syncInvalidIndices, syncMovedIndices, validateFractionalIndices, } from "../fractionalIndex";
6
+ import { arrayToMap } from "../utils";
5
7
  import { toBrandedType } from "../utils";
8
+ import { ENV } from "../constants";
6
9
  const getNonDeletedElements = (allElements) => {
7
10
  const elementsMap = new Map();
8
11
  const elements = [];
@@ -59,6 +62,7 @@ class Scene {
59
62
  callbacks = new Set();
60
63
  nonDeletedElements = [];
61
64
  nonDeletedElementsMap = toBrandedType(new Map());
65
+ // ideally all elements within the scene should be wrapped around with `Ordered` type, but right now there is no real benefit doing so
62
66
  elements = [];
63
67
  nonDeletedFramesLikes = [];
64
68
  frames = [];
@@ -68,9 +72,15 @@ class Scene {
68
72
  elements: null,
69
73
  cache: new Map(),
70
74
  };
71
- versionNonce;
72
- getElementsMapIncludingDeleted() {
73
- return this.elementsMap;
75
+ /**
76
+ * Random integer regenerated each scene update.
77
+ *
78
+ * Does not relate to elements versions, it's only a renderer
79
+ * cache-invalidation nonce at the moment.
80
+ */
81
+ sceneNonce;
82
+ getSceneNonce() {
83
+ return this.sceneNonce;
74
84
  }
75
85
  getNonDeletedElementsMap() {
76
86
  return this.nonDeletedElementsMap;
@@ -78,6 +88,9 @@ class Scene {
78
88
  getElementsIncludingDeleted() {
79
89
  return this.elements;
80
90
  }
91
+ getElementsMapIncludingDeleted() {
92
+ return this.elementsMap;
93
+ }
81
94
  getNonDeletedElements() {
82
95
  return this.nonDeletedElements;
83
96
  }
@@ -114,9 +127,6 @@ class Scene {
114
127
  getElement(id) {
115
128
  return this.elementsMap.get(id) || null;
116
129
  }
117
- getVersionNonce() {
118
- return this.versionNonce;
119
- }
120
130
  getNonDeletedElement(id) {
121
131
  const element = this.getElement(id);
122
132
  if (element && isNonDeletedElement(element)) {
@@ -151,12 +161,17 @@ class Scene {
151
161
  return didChange;
152
162
  }
153
163
  replaceAllElements(nextElements) {
154
- this.elements =
155
- // ts doesn't like `Array.isArray` of `instanceof Map`
156
- nextElements instanceof Array
157
- ? nextElements
158
- : Array.from(nextElements.values());
164
+ const _nextElements =
165
+ // ts doesn't like `Array.isArray` of `instanceof Map`
166
+ nextElements instanceof Array
167
+ ? nextElements
168
+ : Array.from(nextElements.values());
159
169
  const nextFrameLikes = [];
170
+ if (import.meta.env.DEV || import.meta.env.MODE === ENV.TEST) {
171
+ // throw on invalid indices in test / dev to potentially detect cases were we forgot to sync moved elements
172
+ validateFractionalIndices(_nextElements.map((x) => x.index));
173
+ }
174
+ this.elements = syncInvalidIndices(_nextElements);
160
175
  this.elementsMap.clear();
161
176
  this.elements.forEach((element) => {
162
177
  if (isFrameLikeElement(element)) {
@@ -170,15 +185,15 @@ class Scene {
170
185
  this.nonDeletedElementsMap = nonDeletedElements.elementsMap;
171
186
  this.frames = nextFrameLikes;
172
187
  this.nonDeletedFramesLikes = getNonDeletedElements(this.frames).elements;
173
- this.informMutation();
188
+ this.triggerUpdate();
174
189
  }
175
- informMutation() {
176
- this.versionNonce = randomInteger();
190
+ triggerUpdate() {
191
+ this.sceneNonce = randomInteger();
177
192
  for (const callback of Array.from(this.callbacks)) {
178
193
  callback();
179
194
  }
180
195
  }
181
- addCallback(cb) {
196
+ onUpdate(cb) {
182
197
  if (this.callbacks.has(cb)) {
183
198
  throw new Error();
184
199
  }
@@ -191,8 +206,8 @@ class Scene {
191
206
  };
192
207
  }
193
208
  destroy() {
194
- this.nonDeletedElements = [];
195
209
  this.elements = [];
210
+ this.nonDeletedElements = [];
196
211
  this.nonDeletedFramesLikes = [];
197
212
  this.frames = [];
198
213
  this.elementsMap.clear();
@@ -217,6 +232,7 @@ class Scene {
217
232
  element,
218
233
  ...this.elements.slice(index),
219
234
  ];
235
+ syncMovedIndices(nextElements, arrayToMap([element]));
220
236
  this.replaceAllElements(nextElements);
221
237
  }
222
238
  insertElementsAtIndex(elements, index) {
@@ -228,15 +244,20 @@ class Scene {
228
244
  ...elements,
229
245
  ...this.elements.slice(index),
230
246
  ];
247
+ syncMovedIndices(nextElements, arrayToMap(elements));
231
248
  this.replaceAllElements(nextElements);
232
249
  }
233
- addNewElement = (element) => {
234
- if (element.frameId) {
235
- this.insertElementAtIndex(element, this.getElementIndex(element.frameId));
236
- }
237
- else {
238
- this.replaceAllElements([...this.elements, element]);
239
- }
250
+ insertElement = (element) => {
251
+ const index = element.frameId
252
+ ? this.getElementIndex(element.frameId)
253
+ : this.elements.length;
254
+ this.insertElementAtIndex(element, index);
255
+ };
256
+ insertElements = (elements) => {
257
+ const index = elements[0].frameId
258
+ ? this.getElementIndex(elements[0].frameId)
259
+ : this.elements.length;
260
+ this.insertElementsAtIndex(elements, index);
240
261
  };
241
262
  getElementIndex(elementId) {
242
263
  return this.elements.findIndex((element) => element.id === elementId);
@@ -1,7 +1,7 @@
1
1
  import type { Drawable, Options } from "roughjs/bin/core";
2
2
  import type { RoughGenerator } from "roughjs/bin/generator";
3
3
  import type { ExcalidrawElement, NonDeletedExcalidrawElement, ExcalidrawSelectionElement } from "../element/types";
4
- import { EmbedsValidationStatus } from "../types";
4
+ import type { EmbedsValidationStatus } from "../types";
5
5
  export declare const generateRoughOptions: (element: ExcalidrawElement, continuousPath?: boolean) => Options;
6
6
  /**
7
7
  * Generates the roughjs shape for given element.
@@ -1,7 +1,7 @@
1
- import { Drawable } from "roughjs/bin/core";
2
- import { ExcalidrawElement } from "../element/types";
3
- import { ElementShape, ElementShapes } from "./types";
4
- import { AppState, EmbedsValidationStatus } from "../types";
1
+ import type { Drawable } from "roughjs/bin/core";
2
+ import type { ExcalidrawElement } from "../element/types";
3
+ import type { ElementShape, ElementShapes } from "./types";
4
+ import type { AppState, EmbedsValidationStatus } from "../types";
5
5
  export declare class ShapeCache {
6
6
  private static rg;
7
7
  private static cache;
@@ -1,5 +1,5 @@
1
- import { NonDeletedExcalidrawElement } from "../element/types";
2
- import { ElementOrToolType } from "../types";
1
+ import type { NonDeletedExcalidrawElement } from "../element/types";
2
+ import type { ElementOrToolType } from "../types";
3
3
  export declare const hasBackground: (type: ElementOrToolType) => boolean;
4
4
  export declare const hasStrokeColor: (type: ElementOrToolType) => boolean;
5
5
  export declare const hasStrokeWidth: (type: ElementOrToolType) => boolean;
@@ -1,5 +1,5 @@
1
- import { ExcalidrawFrameLikeElement, NonDeletedExcalidrawElement } from "../element/types";
2
- import { AppState, BinaryFiles } from "../types";
1
+ import type { ExcalidrawFrameLikeElement, NonDeletedExcalidrawElement } from "../element/types";
2
+ import type { AppState, BinaryFiles } from "../types";
3
3
  export declare const exportToCanvas: (elements: readonly NonDeletedExcalidrawElement[], appState: AppState, files: BinaryFiles, { exportBackground, exportPadding, viewBackgroundColor, exportingFrame, }: {
4
4
  exportBackground: boolean;
5
5
  exportPadding?: number | undefined;