@excalidraw/excalidraw 0.17.1-d9bbf1e → 0.17.1-e63dd02

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 (416) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/browser/dev/excalidraw-assets-dev/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  3. package/dist/browser/dev/excalidraw-assets-dev/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  4. package/dist/browser/dev/excalidraw-assets-dev/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  5. package/dist/browser/dev/excalidraw-assets-dev/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  6. package/dist/browser/dev/excalidraw-assets-dev/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  7. package/dist/browser/dev/excalidraw-assets-dev/{chunk-XOM7LNOU.js → chunk-IT7T3AIK.js} +49 -8
  8. package/dist/browser/dev/excalidraw-assets-dev/chunk-IT7T3AIK.js.map +7 -0
  9. package/dist/browser/dev/excalidraw-assets-dev/{chunk-BLEB3M62.js → chunk-RNHSD5AR.js} +7668 -2142
  10. package/dist/browser/dev/excalidraw-assets-dev/chunk-RNHSD5AR.js.map +7 -0
  11. package/dist/browser/dev/excalidraw-assets-dev/{dist-ITJNUBZF.js → dist-DNSPZDOZ.js} +66 -32
  12. package/dist/browser/dev/excalidraw-assets-dev/dist-DNSPZDOZ.js.map +7 -0
  13. package/dist/browser/dev/excalidraw-assets-dev/{en-TR4QLF5E.js → en-XV7OZCPP.js} +8 -2
  14. package/dist/browser/dev/excalidraw-assets-dev/{image-ZGDDRBEN.js → image-77HZYGLG.js} +2 -2
  15. package/dist/browser/dev/excalidraw-assets-dev/{image-O66MQ7WQ.css → image-WDHYGKKP.css} +1 -1
  16. package/dist/browser/dev/excalidraw-assets-dev/{image-O66MQ7WQ.css.map → image-WDHYGKKP.css.map} +2 -2
  17. package/dist/browser/dev/index.css +610 -180
  18. package/dist/browser/dev/index.css.map +3 -3
  19. package/dist/browser/dev/index.js +13306 -8006
  20. package/dist/browser/dev/index.js.map +4 -4
  21. package/dist/browser/prod/excalidraw-assets/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  22. package/dist/browser/prod/excalidraw-assets/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  23. package/dist/browser/prod/excalidraw-assets/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  24. package/dist/browser/prod/excalidraw-assets/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  25. package/dist/browser/prod/excalidraw-assets/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  26. package/dist/browser/prod/excalidraw-assets/chunk-OYEADJSR.js +63 -0
  27. package/dist/browser/prod/excalidraw-assets/{chunk-5SYIAZGL.js → chunk-PDYFZJMS.js} +5 -5
  28. package/dist/browser/prod/excalidraw-assets/dist-NLUQPPQQ.js +7 -0
  29. package/dist/browser/prod/excalidraw-assets/en-YVAVVILW.js +1 -0
  30. package/dist/browser/prod/excalidraw-assets/image-X3GFZHNN.js +1 -0
  31. package/dist/browser/prod/index.css +1 -1
  32. package/dist/browser/prod/index.js +70 -51
  33. package/dist/dev/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  34. package/dist/dev/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  35. package/dist/dev/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  36. package/dist/dev/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  37. package/dist/dev/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  38. package/dist/dev/{en-XW4JO6VX.json → en-YNVBSAIL.json} +42 -7
  39. package/dist/dev/index.css +610 -180
  40. package/dist/dev/index.css.map +3 -3
  41. package/dist/dev/index.js +22165 -16833
  42. package/dist/dev/index.js.map +4 -4
  43. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +24 -9
  44. package/dist/excalidraw/actions/actionAlign.d.ts +8 -8
  45. package/dist/excalidraw/actions/actionBoundText.d.ts +20 -10
  46. package/dist/excalidraw/actions/actionBoundText.js +3 -1
  47. package/dist/excalidraw/actions/actionCanvas.d.ts +100 -40
  48. package/dist/excalidraw/actions/actionCanvas.js +1 -1
  49. package/dist/excalidraw/actions/actionClipboard.d.ts +62 -26
  50. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +28 -12
  51. package/dist/excalidraw/actions/actionDeleteSelected.js +24 -5
  52. package/dist/excalidraw/actions/actionDistribute.d.ts +4 -4
  53. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +3 -3
  54. package/dist/excalidraw/actions/actionDuplicateSelection.js +1 -2
  55. package/dist/excalidraw/actions/actionElementLock.d.ts +17 -7
  56. package/dist/excalidraw/actions/actionExport.d.ts +75 -30
  57. package/dist/excalidraw/actions/actionFinalize.d.ts +17 -7
  58. package/dist/excalidraw/actions/actionFinalize.js +2 -2
  59. package/dist/excalidraw/actions/actionFlip.d.ts +4 -4
  60. package/dist/excalidraw/actions/actionFlip.js +2 -2
  61. package/dist/excalidraw/actions/actionFrame.d.ts +338 -10
  62. package/dist/excalidraw/actions/actionGroup.d.ts +324 -4
  63. package/dist/excalidraw/actions/actionHistory.d.ts +3 -3
  64. package/dist/excalidraw/actions/actionHistory.js +8 -8
  65. package/dist/excalidraw/actions/actionLinearEditor.d.ts +12 -5
  66. package/dist/excalidraw/actions/actionLinearEditor.js +21 -5
  67. package/dist/excalidraw/actions/actionLink.d.ts +8 -3
  68. package/dist/excalidraw/actions/actionMenu.d.ts +24 -9
  69. package/dist/excalidraw/actions/actionNavigate.d.ts +17 -7
  70. package/dist/excalidraw/actions/actionProperties.d.ts +476 -82
  71. package/dist/excalidraw/actions/actionProperties.js +384 -59
  72. package/dist/excalidraw/actions/actionSelectAll.d.ts +9 -4
  73. package/dist/excalidraw/actions/actionStyles.d.ts +12 -4
  74. package/dist/excalidraw/actions/actionStyles.js +3 -2
  75. package/dist/excalidraw/actions/actionTextAutoResize.d.ts +17 -0
  76. package/dist/excalidraw/actions/actionTextAutoResize.js +38 -0
  77. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +9 -4
  78. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +8 -3
  79. package/dist/excalidraw/actions/actionToggleStats.d.ts +9 -3
  80. package/dist/excalidraw/actions/actionToggleStats.js +4 -3
  81. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +8 -3
  82. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +8 -3
  83. package/dist/excalidraw/actions/actionZindex.d.ts +8 -4
  84. package/dist/excalidraw/actions/actionZindex.js +4 -0
  85. package/dist/excalidraw/actions/manager.d.ts +3 -3
  86. package/dist/excalidraw/actions/register.d.ts +1 -1
  87. package/dist/excalidraw/actions/shortcuts.d.ts +2 -2
  88. package/dist/excalidraw/actions/types.d.ts +6 -6
  89. package/dist/excalidraw/align.d.ts +1 -1
  90. package/dist/excalidraw/analytics.js +9 -7
  91. package/dist/excalidraw/animated-trail.d.ts +2 -2
  92. package/dist/excalidraw/appState.d.ts +6 -2
  93. package/dist/excalidraw/appState.js +14 -3
  94. package/dist/excalidraw/binaryheap.d.ts +12 -0
  95. package/dist/excalidraw/binaryheap.js +93 -0
  96. package/dist/excalidraw/change.d.ts +6 -5
  97. package/dist/excalidraw/change.js +20 -11
  98. package/dist/excalidraw/charts.d.ts +1 -1
  99. package/dist/excalidraw/charts.js +0 -10
  100. package/dist/excalidraw/clients.d.ts +2 -2
  101. package/dist/excalidraw/clients.js +1 -1
  102. package/dist/excalidraw/clipboard.d.ts +3 -3
  103. package/dist/excalidraw/colors.d.ts +1 -1
  104. package/dist/excalidraw/components/Actions.d.ts +3 -3
  105. package/dist/excalidraw/components/Actions.js +14 -9
  106. package/dist/excalidraw/components/App.d.ts +14 -17
  107. package/dist/excalidraw/components/App.js +356 -217
  108. package/dist/excalidraw/components/ButtonIcon.d.ts +15 -0
  109. package/dist/excalidraw/components/ButtonIcon.js +8 -0
  110. package/dist/excalidraw/components/ButtonIconSelect.js +2 -3
  111. package/dist/excalidraw/components/ButtonSeparator.d.ts +2 -0
  112. package/dist/excalidraw/components/ButtonSeparator.js +7 -0
  113. package/dist/excalidraw/components/CheckboxItem.js +1 -1
  114. package/dist/excalidraw/components/ColorPicker/ColorInput.d.ts +1 -1
  115. package/dist/excalidraw/components/ColorPicker/ColorInput.js +1 -1
  116. package/dist/excalidraw/components/ColorPicker/ColorPicker.d.ts +4 -4
  117. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +48 -80
  118. package/dist/excalidraw/components/ColorPicker/Picker.d.ts +3 -3
  119. package/dist/excalidraw/components/ColorPicker/Picker.js +1 -1
  120. package/dist/excalidraw/components/ColorPicker/PickerColorList.d.ts +1 -1
  121. package/dist/excalidraw/components/ColorPicker/PickerHeading.d.ts +1 -1
  122. package/dist/excalidraw/components/ColorPicker/ShadeList.d.ts +1 -1
  123. package/dist/excalidraw/components/ColorPicker/TopPicks.d.ts +1 -1
  124. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +2 -2
  125. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.js +1 -1
  126. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -2
  127. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.js +1 -1
  128. package/dist/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -1
  129. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +5 -5
  130. package/dist/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -1
  131. package/dist/excalidraw/components/CommandPalette/types.d.ts +3 -3
  132. package/dist/excalidraw/components/ConfirmDialog.d.ts +1 -1
  133. package/dist/excalidraw/components/ContextMenu.d.ts +2 -2
  134. package/dist/excalidraw/components/ContextMenu.js +2 -2
  135. package/dist/excalidraw/components/DarkModeToggle.d.ts +1 -1
  136. package/dist/excalidraw/components/DefaultSidebar.d.ts +2 -2
  137. package/dist/excalidraw/components/Dialog.js +1 -1
  138. package/dist/excalidraw/components/DialogActionButton.d.ts +1 -1
  139. package/dist/excalidraw/components/EyeDropper.d.ts +2 -2
  140. package/dist/excalidraw/components/FollowMode/FollowMode.d.ts +1 -1
  141. package/dist/excalidraw/components/FollowMode/FollowMode.js +1 -1
  142. package/dist/excalidraw/components/FontPicker/FontPicker.d.ts +21 -0
  143. package/dist/excalidraw/components/FontPicker/FontPicker.js +49 -0
  144. package/dist/excalidraw/components/FontPicker/FontPickerList.d.ts +25 -0
  145. package/dist/excalidraw/components/FontPicker/FontPickerList.js +119 -0
  146. package/dist/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +7 -0
  147. package/dist/excalidraw/components/FontPicker/FontPickerTrigger.js +13 -0
  148. package/dist/excalidraw/components/FontPicker/keyboardNavHandlers.d.ts +14 -0
  149. package/dist/excalidraw/components/FontPicker/keyboardNavHandlers.js +38 -0
  150. package/dist/excalidraw/components/HelpDialog.js +2 -2
  151. package/dist/excalidraw/components/HintViewer.d.ts +1 -1
  152. package/dist/excalidraw/components/HintViewer.js +6 -3
  153. package/dist/excalidraw/components/IconPicker.js +2 -2
  154. package/dist/excalidraw/components/ImageExportDialog.d.ts +1 -1
  155. package/dist/excalidraw/components/InitializeApp.d.ts +2 -2
  156. package/dist/excalidraw/components/JSONExportDialog.d.ts +3 -3
  157. package/dist/excalidraw/components/LayerUI.d.ts +4 -4
  158. package/dist/excalidraw/components/LayerUI.js +10 -7
  159. package/dist/excalidraw/components/LibraryMenu.d.ts +2 -2
  160. package/dist/excalidraw/components/LibraryMenuBrowseButton.d.ts +1 -1
  161. package/dist/excalidraw/components/LibraryMenuControlButtons.d.ts +1 -1
  162. package/dist/excalidraw/components/LibraryMenuHeaderContent.d.ts +2 -2
  163. package/dist/excalidraw/components/LibraryMenuItems.d.ts +1 -1
  164. package/dist/excalidraw/components/LibraryMenuSection.d.ts +5 -4
  165. package/dist/excalidraw/components/LibraryUnit.d.ts +2 -2
  166. package/dist/excalidraw/components/LoadingMessage.d.ts +1 -1
  167. package/dist/excalidraw/components/MagicSettings.js +2 -2
  168. package/dist/excalidraw/components/MobileMenu.d.ts +3 -3
  169. package/dist/excalidraw/components/MobileMenu.js +2 -6
  170. package/dist/excalidraw/components/Modal.d.ts +1 -1
  171. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  172. package/dist/excalidraw/components/PasteChartDialog.d.ts +1 -1
  173. package/dist/excalidraw/components/PasteChartDialog.js +1 -1
  174. package/dist/excalidraw/components/PropertiesPopover.d.ts +15 -0
  175. package/dist/excalidraw/components/PropertiesPopover.js +31 -0
  176. package/dist/excalidraw/components/PublishLibrary.d.ts +1 -1
  177. package/dist/excalidraw/components/QuickSearch.d.ts +9 -0
  178. package/dist/excalidraw/components/QuickSearch.js +8 -0
  179. package/dist/excalidraw/components/SVGLayer.d.ts +1 -1
  180. package/dist/excalidraw/components/ScrollableList.d.ts +9 -0
  181. package/dist/excalidraw/components/ScrollableList.js +8 -0
  182. package/dist/excalidraw/components/Sidebar/Sidebar.js +1 -1
  183. package/dist/excalidraw/components/Sidebar/SidebarTab.d.ts +1 -1
  184. package/dist/excalidraw/components/Sidebar/SidebarTabTrigger.d.ts +1 -1
  185. package/dist/excalidraw/components/Sidebar/SidebarTrigger.d.ts +1 -1
  186. package/dist/excalidraw/components/Sidebar/common.d.ts +1 -1
  187. package/dist/excalidraw/components/Stats/Angle.d.ts +12 -0
  188. package/dist/excalidraw/components/Stats/Angle.js +53 -0
  189. package/dist/excalidraw/components/Stats/Collapsible.d.ts +9 -0
  190. package/dist/excalidraw/components/Stats/Collapsible.js +12 -0
  191. package/dist/excalidraw/components/Stats/Dimension.d.ts +12 -0
  192. package/dist/excalidraw/components/Stats/Dimension.js +68 -0
  193. package/dist/excalidraw/components/Stats/DragInput.d.ts +32 -0
  194. package/dist/excalidraw/components/Stats/DragInput.js +174 -0
  195. package/dist/excalidraw/components/Stats/FontSize.d.ts +12 -0
  196. package/dist/excalidraw/components/Stats/FontSize.js +50 -0
  197. package/dist/excalidraw/components/Stats/MultiAngle.d.ts +12 -0
  198. package/dist/excalidraw/components/Stats/MultiAngle.js +66 -0
  199. package/dist/excalidraw/components/Stats/MultiDimension.d.ts +15 -0
  200. package/dist/excalidraw/components/Stats/MultiDimension.js +199 -0
  201. package/dist/excalidraw/components/Stats/MultiFontSize.d.ts +13 -0
  202. package/dist/excalidraw/components/Stats/MultiFontSize.js +72 -0
  203. package/dist/excalidraw/components/Stats/MultiPosition.d.ts +15 -0
  204. package/dist/excalidraw/components/Stats/MultiPosition.js +101 -0
  205. package/dist/excalidraw/components/Stats/Position.d.ts +13 -0
  206. package/dist/excalidraw/components/Stats/Position.js +40 -0
  207. package/dist/excalidraw/components/Stats/index.d.ts +16 -0
  208. package/dist/excalidraw/components/Stats/index.js +79 -0
  209. package/dist/excalidraw/components/Stats/utils.d.ts +26 -0
  210. package/dist/excalidraw/components/Stats/utils.js +162 -0
  211. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +1 -1
  212. package/dist/excalidraw/components/TTDDialog/TTDDialog.js +2 -2
  213. package/dist/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +1 -1
  214. package/dist/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +1 -1
  215. package/dist/excalidraw/components/TTDDialog/TTDDialogPanels.d.ts +1 -1
  216. package/dist/excalidraw/components/TTDDialog/TTDDialogTabs.d.ts +1 -1
  217. package/dist/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -1
  218. package/dist/excalidraw/components/TTDDialog/common.d.ts +5 -5
  219. package/dist/excalidraw/components/TTDDialog/common.js +3 -7
  220. package/dist/excalidraw/components/TextField.d.ts +1 -1
  221. package/dist/excalidraw/components/Toast.d.ts +1 -1
  222. package/dist/excalidraw/components/ToolButton.d.ts +3 -2
  223. package/dist/excalidraw/components/Trans.d.ts +1 -1
  224. package/dist/excalidraw/components/UserList.d.ts +1 -1
  225. package/dist/excalidraw/components/UserList.js +22 -22
  226. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -2
  227. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +4 -2
  228. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +2 -2
  229. package/dist/excalidraw/components/canvases/StaticCanvas.js +3 -2
  230. package/dist/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +12 -3
  231. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.d.ts +24 -4
  232. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +55 -14
  233. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContent.d.ts +2 -1
  234. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContent.js +2 -2
  235. package/dist/excalidraw/components/dropdownMenu/common.d.ts +1 -1
  236. package/dist/excalidraw/components/dropdownMenu/common.js +3 -2
  237. package/dist/excalidraw/components/footer/Footer.d.ts +2 -2
  238. package/dist/excalidraw/components/hyperlink/Hyperlink.d.ts +2 -2
  239. package/dist/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  240. package/dist/excalidraw/components/icons.d.ts +10 -2
  241. package/dist/excalidraw/components/icons.js +29 -6
  242. package/dist/excalidraw/components/main-menu/MainMenu.d.ts +12 -3
  243. package/dist/excalidraw/components/welcome-screen/WelcomeScreen.Center.js +2 -2
  244. package/dist/excalidraw/components/welcome-screen/WelcomeScreen.Hints.js +3 -3
  245. package/dist/excalidraw/constants.d.ts +24 -3
  246. package/dist/excalidraw/constants.js +28 -4
  247. package/dist/excalidraw/context/ui-appState.d.ts +1 -1
  248. package/dist/excalidraw/cursor.d.ts +1 -1
  249. package/dist/excalidraw/data/EditorLocalStorage.d.ts +2 -2
  250. package/dist/excalidraw/data/blob.d.ts +5 -5
  251. package/dist/excalidraw/data/filesystem.d.ts +2 -1
  252. package/dist/excalidraw/data/index.d.ts +4 -4
  253. package/dist/excalidraw/data/json.d.ts +3 -3
  254. package/dist/excalidraw/data/library.d.ts +3 -3
  255. package/dist/excalidraw/data/magic.d.ts +3 -3
  256. package/dist/excalidraw/data/reconcile.d.ts +3 -3
  257. package/dist/excalidraw/data/reconcile.js +18 -1
  258. package/dist/excalidraw/data/resave.d.ts +2 -2
  259. package/dist/excalidraw/data/restore.d.ts +3 -3
  260. package/dist/excalidraw/data/restore.js +58 -9
  261. package/dist/excalidraw/data/transform.d.ts +3 -3
  262. package/dist/excalidraw/data/transform.js +8 -5
  263. package/dist/excalidraw/data/types.d.ts +3 -3
  264. package/dist/excalidraw/element/ElementCanvasButtons.d.ts +1 -1
  265. package/dist/excalidraw/element/binding.d.ts +29 -10
  266. package/dist/excalidraw/element/binding.js +303 -71
  267. package/dist/excalidraw/element/bounds.d.ts +3 -3
  268. package/dist/excalidraw/element/collision.d.ts +4 -4
  269. package/dist/excalidraw/element/collision.js +5 -2
  270. package/dist/excalidraw/element/containerCache.d.ts +1 -1
  271. package/dist/excalidraw/element/dragElements.d.ts +6 -6
  272. package/dist/excalidraw/element/dragElements.js +39 -5
  273. package/dist/excalidraw/element/embeddable.d.ts +11 -6
  274. package/dist/excalidraw/element/heading.d.ts +11 -0
  275. package/dist/excalidraw/element/heading.js +81 -0
  276. package/dist/excalidraw/element/image.d.ts +2 -2
  277. package/dist/excalidraw/element/index.d.ts +2 -2
  278. package/dist/excalidraw/element/index.js +1 -1
  279. package/dist/excalidraw/element/linearElementEditor.d.ts +27 -16
  280. package/dist/excalidraw/element/linearElementEditor.js +133 -56
  281. package/dist/excalidraw/element/mutateElement.d.ts +3 -3
  282. package/dist/excalidraw/element/mutateElement.js +5 -3
  283. package/dist/excalidraw/element/newElement.d.ts +12 -10
  284. package/dist/excalidraw/element/newElement.js +31 -16
  285. package/dist/excalidraw/element/resizeElements.d.ts +15 -6
  286. package/dist/excalidraw/element/resizeElements.js +122 -46
  287. package/dist/excalidraw/element/resizeTest.d.ts +4 -4
  288. package/dist/excalidraw/element/resizeTest.js +2 -4
  289. package/dist/excalidraw/element/routing.d.ts +13 -0
  290. package/dist/excalidraw/element/routing.js +641 -0
  291. package/dist/excalidraw/element/showSelectedShapeActions.d.ts +2 -2
  292. package/dist/excalidraw/element/sizeHelpers.d.ts +2 -2
  293. package/dist/excalidraw/element/sortElements.d.ts +1 -1
  294. package/dist/excalidraw/element/textElement.d.ts +6 -28
  295. package/dist/excalidraw/element/textElement.js +64 -112
  296. package/dist/excalidraw/element/textWysiwyg.d.ts +12 -6
  297. package/dist/excalidraw/element/textWysiwyg.js +75 -62
  298. package/dist/excalidraw/element/transformHandles.d.ts +3 -3
  299. package/dist/excalidraw/element/transformHandles.js +7 -12
  300. package/dist/excalidraw/element/typeChecks.d.ts +7 -4
  301. package/dist/excalidraw/element/typeChecks.js +17 -0
  302. package/dist/excalidraw/element/types.d.ts +22 -4
  303. package/dist/excalidraw/emitter.d.ts +1 -1
  304. package/dist/excalidraw/fonts/ExcalidrawFont.d.ts +21 -0
  305. package/dist/excalidraw/fonts/ExcalidrawFont.js +112 -0
  306. package/dist/excalidraw/fonts/index.d.ts +58 -0
  307. package/dist/excalidraw/fonts/index.js +240 -0
  308. package/dist/excalidraw/fonts/metadata.d.ts +36 -0
  309. package/dist/excalidraw/fonts/metadata.js +91 -0
  310. package/dist/excalidraw/fractionalIndex.d.ts +12 -5
  311. package/dist/excalidraw/fractionalIndex.js +40 -10
  312. package/dist/excalidraw/frame.d.ts +4 -4
  313. package/dist/excalidraw/frame.js +3 -3
  314. package/dist/excalidraw/gatransforms.d.ts +1 -1
  315. package/dist/excalidraw/gesture.d.ts +1 -1
  316. package/dist/excalidraw/groups.d.ts +4 -4
  317. package/dist/excalidraw/history.d.ts +8 -7
  318. package/dist/excalidraw/history.js +8 -8
  319. package/dist/excalidraw/hooks/useEmitter.d.ts +1 -1
  320. package/dist/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  321. package/dist/excalidraw/i18n.d.ts +1 -1
  322. package/dist/excalidraw/index.d.ts +2 -2
  323. package/dist/excalidraw/index.js +3 -3
  324. package/dist/excalidraw/jotai.d.ts +1 -1
  325. package/dist/excalidraw/laser-trails.d.ts +3 -2
  326. package/dist/excalidraw/locales/en.json +42 -7
  327. package/dist/excalidraw/math.d.ts +47 -2
  328. package/dist/excalidraw/math.js +116 -0
  329. package/dist/excalidraw/mermaid.d.ts +2 -0
  330. package/dist/excalidraw/mermaid.js +29 -0
  331. package/dist/excalidraw/points.d.ts +1 -1
  332. package/dist/excalidraw/queue.d.ts +1 -1
  333. package/dist/excalidraw/renderer/helpers.d.ts +2 -2
  334. package/dist/excalidraw/renderer/interactiveScene.d.ts +2 -2
  335. package/dist/excalidraw/renderer/interactiveScene.js +64 -22
  336. package/dist/excalidraw/renderer/renderElement.d.ts +6 -4
  337. package/dist/excalidraw/renderer/renderElement.js +78 -58
  338. package/dist/excalidraw/renderer/renderSnaps.d.ts +1 -1
  339. package/dist/excalidraw/renderer/staticScene.d.ts +1 -1
  340. package/dist/excalidraw/renderer/staticSvgScene.d.ts +4 -4
  341. package/dist/excalidraw/renderer/staticSvgScene.js +2 -1
  342. package/dist/excalidraw/scene/Renderer.d.ts +4 -4
  343. package/dist/excalidraw/scene/Renderer.js +2 -3
  344. package/dist/excalidraw/scene/Scene.d.ts +16 -7
  345. package/dist/excalidraw/scene/Scene.js +26 -11
  346. package/dist/excalidraw/scene/Shape.d.ts +1 -1
  347. package/dist/excalidraw/scene/Shape.js +56 -5
  348. package/dist/excalidraw/scene/ShapeCache.d.ts +4 -4
  349. package/dist/excalidraw/scene/comparisons.d.ts +3 -2
  350. package/dist/excalidraw/scene/comparisons.js +1 -1
  351. package/dist/excalidraw/scene/export.d.ts +4 -3
  352. package/dist/excalidraw/scene/export.js +34 -36
  353. package/dist/excalidraw/scene/scroll.d.ts +2 -2
  354. package/dist/excalidraw/scene/scrollbars.d.ts +3 -3
  355. package/dist/excalidraw/scene/selection.d.ts +2 -2
  356. package/dist/excalidraw/scene/types.d.ts +6 -8
  357. package/dist/excalidraw/scene/zoom.d.ts +1 -1
  358. package/dist/excalidraw/shapes.d.ts +8 -0
  359. package/dist/excalidraw/shapes.js +57 -0
  360. package/dist/excalidraw/snapping.d.ts +4 -4
  361. package/dist/excalidraw/snapping.js +2 -1
  362. package/dist/excalidraw/store.d.ts +34 -4
  363. package/dist/excalidraw/store.js +27 -0
  364. package/dist/excalidraw/types.d.ts +32 -21
  365. package/dist/excalidraw/utils.d.ts +15 -5
  366. package/dist/excalidraw/utils.js +22 -0
  367. package/dist/excalidraw/zindex.d.ts +2 -2
  368. package/dist/prod/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  369. package/dist/prod/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  370. package/dist/prod/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  371. package/dist/prod/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  372. package/dist/prod/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  373. package/dist/prod/{en-XW4JO6VX.json → en-YNVBSAIL.json} +42 -7
  374. package/dist/prod/index.css +1 -1
  375. package/dist/prod/index.js +49 -53
  376. package/dist/utils/bbox.d.ts +2 -2
  377. package/dist/utils/collision.d.ts +1 -1
  378. package/dist/utils/export.d.ts +4 -3
  379. package/dist/utils/export.js +2 -1
  380. package/dist/utils/geometry/geometry.d.ts +3 -2
  381. package/dist/utils/geometry/geometry.js +5 -1
  382. package/dist/utils/geometry/shape.d.ts +1 -1
  383. package/dist/utils/index.d.ts +1 -0
  384. package/dist/utils/index.js +1 -0
  385. package/dist/utils/withinBounds.d.ts +1 -1
  386. package/history.ts +13 -6
  387. package/package.json +2 -2
  388. package/dist/browser/dev/Cascadia-CYPE3OJC.woff2 +0 -0
  389. package/dist/browser/dev/Virgil-UZN6MUT6.woff2 +0 -0
  390. package/dist/browser/dev/excalidraw-assets-dev/chunk-BLEB3M62.js.map +0 -7
  391. package/dist/browser/dev/excalidraw-assets-dev/chunk-XOM7LNOU.js.map +0 -7
  392. package/dist/browser/dev/excalidraw-assets-dev/dist-ITJNUBZF.js.map +0 -7
  393. package/dist/browser/prod/Cascadia-CYPE3OJC.woff2 +0 -0
  394. package/dist/browser/prod/Virgil-UZN6MUT6.woff2 +0 -0
  395. package/dist/browser/prod/excalidraw-assets/chunk-UWBW5SR2.js +0 -55
  396. package/dist/browser/prod/excalidraw-assets/dist-54276HPL.js +0 -6
  397. package/dist/browser/prod/excalidraw-assets/en-7GPZE2Y2.js +0 -1
  398. package/dist/browser/prod/excalidraw-assets/image-35KQQ5EN.js +0 -1
  399. package/dist/dev/Cascadia-CYPE3OJC.woff2 +0 -0
  400. package/dist/dev/Virgil-UZN6MUT6.woff2 +0 -0
  401. package/dist/excalidraw/components/Stats.d.ts +0 -11
  402. package/dist/excalidraw/components/Stats.js +0 -13
  403. package/dist/excalidraw/scene/Fonts.d.ts +0 -21
  404. package/dist/excalidraw/scene/Fonts.js +0 -72
  405. package/dist/prod/Cascadia-CYPE3OJC.woff2 +0 -0
  406. package/dist/prod/Virgil-UZN6MUT6.woff2 +0 -0
  407. /package/dist/browser/dev/{Assistant-Bold-ZDZZ6JHA.woff2 → excalidraw-assets-dev/Assistant-Bold-ZDZZ6JHA.woff2} +0 -0
  408. /package/dist/browser/dev/{Assistant-Medium-DZ25RZU3.woff2 → excalidraw-assets-dev/Assistant-Medium-DZ25RZU3.woff2} +0 -0
  409. /package/dist/browser/dev/{Assistant-Regular-PLF2XOGW.woff2 → excalidraw-assets-dev/Assistant-Regular-PLF2XOGW.woff2} +0 -0
  410. /package/dist/browser/dev/{Assistant-SemiBold-CZ5MX6FK.woff2 → excalidraw-assets-dev/Assistant-SemiBold-CZ5MX6FK.woff2} +0 -0
  411. /package/dist/browser/dev/excalidraw-assets-dev/{en-TR4QLF5E.js.map → en-XV7OZCPP.js.map} +0 -0
  412. /package/dist/browser/dev/excalidraw-assets-dev/{image-ZGDDRBEN.js.map → image-77HZYGLG.js.map} +0 -0
  413. /package/dist/browser/prod/{Assistant-Bold-ZDZZ6JHA.woff2 → excalidraw-assets/Assistant-Bold-ZDZZ6JHA.woff2} +0 -0
  414. /package/dist/browser/prod/{Assistant-Medium-DZ25RZU3.woff2 → excalidraw-assets/Assistant-Medium-DZ25RZU3.woff2} +0 -0
  415. /package/dist/browser/prod/{Assistant-Regular-PLF2XOGW.woff2 → excalidraw-assets/Assistant-Regular-PLF2XOGW.woff2} +0 -0
  416. /package/dist/browser/prod/{Assistant-SemiBold-CZ5MX6FK.woff2 → excalidraw-assets/Assistant-SemiBold-CZ5MX6FK.woff2} +0 -0
@@ -8,11 +8,12 @@ import { getOmitSidesForDevice, shouldShowBoundingBox, } from "../element/transf
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/binding";
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 { isArrowElement, isElbowArrow, isFrameLikeElement, isLinearElement, isTextElement, } from "../element/typeChecks";
16
+ import { getCornerRadius } from "../math";
16
17
  const renderLinearElementPointHighlight = (context, appState, elementsMap) => {
17
18
  const { elementId, hoverPointIndex } = appState.selectedLinearElement;
18
19
  if (appState.editingLinearElement?.selectedPointsIndices?.includes(hoverPointIndex)) {
@@ -86,12 +87,13 @@ const renderBindingHighlightForBindableElement = (context, element, elementsMap)
86
87
  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
87
88
  const width = x2 - x1;
88
89
  const height = y2 - y1;
89
- const threshold = maxBindingGap(element, width, height);
90
+ const thickness = 10;
90
91
  // So that we don't overlap the element itself
91
92
  const strokeOffset = 4;
92
93
  context.strokeStyle = "rgba(0,0,0,.05)";
93
- context.lineWidth = threshold - strokeOffset;
94
- const padding = strokeOffset / 2 + threshold / 2;
94
+ context.lineWidth = thickness - strokeOffset;
95
+ const padding = strokeOffset / 2 + thickness / 2;
96
+ const radius = getCornerRadius(Math.min(element.width, element.height), element);
95
97
  switch (element.type) {
96
98
  case "rectangle":
97
99
  case "text":
@@ -100,7 +102,7 @@ const renderBindingHighlightForBindableElement = (context, element, elementsMap)
100
102
  case "embeddable":
101
103
  case "frame":
102
104
  case "magicframe":
103
- strokeRectWithRotation(context, x1 - padding, y1 - padding, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);
105
+ strokeRectWithRotation(context, x1 - padding, y1 - padding, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle, undefined, radius);
104
106
  break;
105
107
  case "diamond":
106
108
  const side = Math.hypot(width, height);
@@ -124,10 +126,11 @@ const renderBindingHighlightForSuggestedPointBinding = (context, suggestedBindin
124
126
  fillCircle(context, x, y, threshold);
125
127
  });
126
128
  };
127
- const renderSelectionBorder = (context, appState, elementProperties, padding = DEFAULT_TRANSFORM_HANDLE_SPACING * 2) => {
129
+ const renderSelectionBorder = (context, appState, elementProperties) => {
128
130
  const { angle, elementX1, elementY1, elementX2, elementY2, selectionColors, cx, cy, dashed, activeEmbeddable, } = elementProperties;
129
131
  const elementWidth = elementX2 - elementX1;
130
132
  const elementHeight = elementY2 - elementY1;
133
+ const padding = DEFAULT_TRANSFORM_HANDLE_SPACING * 2;
131
134
  const linePadding = padding / appState.zoom.value;
132
135
  const lineWidth = 8 / appState.zoom.value;
133
136
  const spaceWidth = 4 / appState.zoom.value;
@@ -210,6 +213,9 @@ const renderLinearPointHandles = (context, appState, element, elementsMap) => {
210
213
  ? POINT_HANDLE_SIZE
211
214
  : POINT_HANDLE_SIZE / 2;
212
215
  points.forEach((point, idx) => {
216
+ if (isElbowArrow(element) && idx !== 0 && idx !== points.length - 1) {
217
+ return;
218
+ }
213
219
  const isSelected = !!appState.editingLinearElement?.selectedPointsIndices?.includes(idx);
214
220
  renderSingleLinearPoint(context, appState, point, radius, isSelected);
215
221
  });
@@ -264,7 +270,23 @@ const renderTransformHandles = (context, renderConfig, appState, transformHandle
264
270
  }
265
271
  });
266
272
  };
267
- const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selectedElements, scale, appState, renderConfig, device, }) => {
273
+ const renderTextBox = (text, context, appState, selectionColor) => {
274
+ context.save();
275
+ const padding = (DEFAULT_TRANSFORM_HANDLE_SPACING * 2) / appState.zoom.value;
276
+ const width = text.width + padding * 2;
277
+ const height = text.height + padding * 2;
278
+ const cx = text.x + width / 2;
279
+ const cy = text.y + height / 2;
280
+ const shiftX = -(width / 2 + padding);
281
+ const shiftY = -(height / 2 + padding);
282
+ context.translate(cx + appState.scrollX, cy + appState.scrollY);
283
+ context.rotate(text.angle);
284
+ context.lineWidth = 1 / appState.zoom.value;
285
+ context.strokeStyle = selectionColor;
286
+ context.strokeRect(shiftX, shiftY, width, height);
287
+ context.restore();
288
+ };
289
+ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selectedElements, allElementsMap, scale, appState, renderConfig, device, }) => {
268
290
  if (canvas === null) {
269
291
  return { atLeastOneVisibleElement: false, elementsMap };
270
292
  }
@@ -295,12 +317,18 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
295
317
  // Paint selection element
296
318
  if (appState.selectionElement) {
297
319
  try {
298
- renderSelectionElement(appState.selectionElement, context, appState);
320
+ renderSelectionElement(appState.selectionElement, context, appState, renderConfig.selectionColor);
299
321
  }
300
322
  catch (error) {
301
323
  console.error(error);
302
324
  }
303
325
  }
326
+ if (appState.editingElement && isTextElement(appState.editingElement)) {
327
+ const textElement = allElementsMap.get(appState.editingElement.id);
328
+ if (textElement && !textElement.autoResize) {
329
+ renderTextBox(textElement, context, appState, renderConfig.selectionColor);
330
+ }
331
+ }
304
332
  if (appState.isBindingEnabled) {
305
333
  appState.suggestedBindings
306
334
  .filter((binding) => binding != null)
@@ -323,7 +351,11 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
323
351
  renderLinearPointHandles(context, appState, selectedElements[0], elementsMap);
324
352
  }
325
353
  if (appState.selectedLinearElement &&
326
- appState.selectedLinearElement.hoverPointIndex >= 0) {
354
+ appState.selectedLinearElement.hoverPointIndex >= 0 &&
355
+ !(isElbowArrow(selectedElements[0]) &&
356
+ appState.selectedLinearElement.hoverPointIndex > 0 &&
357
+ appState.selectedLinearElement.hoverPointIndex <
358
+ selectedElements[0].points.length - 1)) {
327
359
  renderLinearElementPointHighlight(context, appState, elementsMap);
328
360
  }
329
361
  // Paint selected elements
@@ -343,18 +375,25 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
343
375
  const selections = [];
344
376
  for (const element of elementsMap.values()) {
345
377
  const selectionColors = [];
346
- // local user
347
- if (locallySelectedIds.has(element.id) &&
348
- !isSelectedViaGroup(appState, element)) {
349
- selectionColors.push(selectionColor);
350
- }
351
- // remote users
352
378
  const remoteClients = renderConfig.remoteSelectedElementIds.get(element.id);
353
- if (remoteClients) {
354
- selectionColors.push(...remoteClients.map((socketId) => {
355
- const background = getClientColor(socketId, appState.collaborators.get(socketId));
356
- return background;
357
- }));
379
+ if (!(
380
+ // Elbow arrow elements cannot be selected when bound on either end
381
+ (isSingleLinearElementSelected &&
382
+ isArrowElement(element) &&
383
+ isElbowArrow(element) &&
384
+ (element.startBinding || element.endBinding)))) {
385
+ // local user
386
+ if (locallySelectedIds.has(element.id) &&
387
+ !isSelectedViaGroup(appState, element)) {
388
+ selectionColors.push(selectionColor);
389
+ }
390
+ // remote users
391
+ if (remoteClients) {
392
+ selectionColors.push(...remoteClients.map((socketId) => {
393
+ const background = getClientColor(socketId, appState.collaborators.get(socketId));
394
+ return background;
395
+ }));
396
+ }
358
397
  }
359
398
  if (selectionColors.length) {
360
399
  const [elementX1, elementY1, elementX2, elementY2, cx, cy] = getElementAbsoluteCoords(element, elementsMap, true);
@@ -405,7 +444,10 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
405
444
  context.fillStyle = oc.white;
406
445
  const transformHandles = getTransformHandles(selectedElements[0], appState.zoom, elementsMap, "mouse", // when we render we don't know which pointer type so use mouse,
407
446
  getOmitSidesForDevice(device));
408
- if (!appState.viewModeEnabled && showBoundingBox) {
447
+ if (!appState.viewModeEnabled &&
448
+ showBoundingBox &&
449
+ // do not show transform handles when text is being edited
450
+ !isTextElement(appState.editingElement)) {
409
451
  renderTransformHandles(context, renderConfig, appState, transformHandles, selectedElements[0].angle);
410
452
  }
411
453
  }
@@ -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 {
@@ -9,15 +9,17 @@ export interface ExcalidrawElementWithCanvas {
9
9
  canvas: HTMLCanvasElement;
10
10
  theme: AppState["theme"];
11
11
  scale: number;
12
+ angle: number;
12
13
  zoomValue: AppState["zoom"]["value"];
13
14
  canvasOffsetX: number;
14
15
  canvasOffsetY: number;
15
16
  boundTextElementVersion: number | null;
16
17
  containingFrameOpacity: number;
18
+ boundTextCanvas: HTMLCanvasElement;
17
19
  }
18
20
  export declare const DEFAULT_LINK_SIZE = 14;
19
21
  export declare const elementWithCanvasCache: WeakMap<ExcalidrawElement, ExcalidrawElementWithCanvas>;
20
- export declare const renderSelectionElement: (element: NonDeletedExcalidrawElement, context: CanvasRenderingContext2D, appState: InteractiveCanvasAppState) => void;
22
+ export declare const renderSelectionElement: (element: NonDeletedExcalidrawElement, context: CanvasRenderingContext2D, appState: InteractiveCanvasAppState, selectionColor: InteractiveCanvasRenderConfig["selectionColor"]) => void;
21
23
  export declare const renderElement: (element: NonDeletedExcalidrawElement, elementsMap: RenderableElementsMap, allElementsMap: NonDeletedSceneElementsMap, rc: RoughCanvas, context: CanvasRenderingContext2D, renderConfig: StaticCanvasRenderConfig, appState: StaticCanvasAppState) => void;
22
24
  export declare const pathsCache: WeakMap<ExcalidrawFreeDrawElement, Path2D>;
23
25
  export declare function generateFreeDrawShape(element: ExcalidrawFreeDrawElement): Path2D;
@@ -6,10 +6,11 @@ import rough from "roughjs/bin/rough";
6
6
  import { getDefaultAppState } from "../appState";
7
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
- import { getBoundTextElement, getContainerCoords, getContainerElement, getLineHeightInPx, getBoundTextMaxHeight, getBoundTextMaxWidth, getVerticalOffset, } from "../element/textElement";
9
+ import { getBoundTextElement, getContainerCoords, getContainerElement, getLineHeightInPx, getBoundTextMaxHeight, getBoundTextMaxWidth, } from "../element/textElement";
10
10
  import { LinearElementEditor } from "../element/linearElementEditor";
11
11
  import { getContainingFrame } from "../frame";
12
12
  import { ShapeCache } from "../scene/ShapeCache";
13
+ import { getVerticalOffset } from "../fonts";
13
14
  // using a stronger invert (100% vs our regular 93%) and saturate
14
15
  // as a temp hack to make images in dark theme look closer to original
15
16
  // color scheme (it's still not quite there and the colors look slightly
@@ -24,7 +25,16 @@ const shouldResetImageFilter = (element, renderConfig, appState) => {
24
25
  !isPendingImageElement(element, renderConfig) &&
25
26
  renderConfig.imageCache.get(element.fileId)?.mimeType !== MIME_TYPES.svg);
26
27
  };
27
- const getCanvasPadding = (element) => element.type === "freedraw" ? element.strokeWidth * 12 : 20;
28
+ const getCanvasPadding = (element) => {
29
+ switch (element.type) {
30
+ case "freedraw":
31
+ return element.strokeWidth * 12;
32
+ case "text":
33
+ return element.fontSize / 2;
34
+ default:
35
+ return 20;
36
+ }
37
+ };
28
38
  export const getRenderOpacity = (element, containingFrame, elementsPendingErasure) => {
29
39
  // multiplying frame opacity with element opacity to combine them
30
40
  // (e.g. frame 50% and element 50% opacity should result in 25% opacity)
@@ -78,7 +88,7 @@ const generateElementCanvas = (element, elementsMap, zoom, renderConfig, appStat
78
88
  const { width, height, scale } = cappedElementCanvasSize(element, elementsMap, zoom);
79
89
  canvas.width = width;
80
90
  canvas.height = height;
81
- let canvasOffsetX = 0;
91
+ let canvasOffsetX = -100;
82
92
  let canvasOffsetY = 0;
83
93
  if (isLinearElement(element) || isFreeDrawElement(element)) {
84
94
  const [x1, y1] = getElementAbsoluteCoords(element, elementsMap);
@@ -102,6 +112,45 @@ const generateElementCanvas = (element, elementsMap, zoom, renderConfig, appStat
102
112
  }
103
113
  drawElementOnCanvas(element, rc, context, renderConfig, appState);
104
114
  context.restore();
115
+ const boundTextElement = getBoundTextElement(element, elementsMap);
116
+ const boundTextCanvas = document.createElement("canvas");
117
+ const boundTextCanvasContext = boundTextCanvas.getContext("2d");
118
+ if (isArrowElement(element) && boundTextElement) {
119
+ const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
120
+ // Take max dimensions of arrow canvas so that when canvas is rotated
121
+ // the arrow doesn't get clipped
122
+ const maxDim = Math.max(distance(x1, x2), distance(y1, y2));
123
+ boundTextCanvas.width =
124
+ maxDim * window.devicePixelRatio * scale + padding * scale * 10;
125
+ boundTextCanvas.height =
126
+ maxDim * window.devicePixelRatio * scale + padding * scale * 10;
127
+ boundTextCanvasContext.translate(boundTextCanvas.width / 2, boundTextCanvas.height / 2);
128
+ boundTextCanvasContext.rotate(element.angle);
129
+ boundTextCanvasContext.drawImage(canvas, -canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height);
130
+ const [, , , , boundTextCx, boundTextCy] = getElementAbsoluteCoords(boundTextElement, elementsMap);
131
+ boundTextCanvasContext.rotate(-element.angle);
132
+ const offsetX = (boundTextCanvas.width - canvas.width) / 2;
133
+ const offsetY = (boundTextCanvas.height - canvas.height) / 2;
134
+ const shiftX = boundTextCanvas.width / 2 -
135
+ (boundTextCx - x1) * window.devicePixelRatio * scale -
136
+ offsetX -
137
+ padding * scale;
138
+ const shiftY = boundTextCanvas.height / 2 -
139
+ (boundTextCy - y1) * window.devicePixelRatio * scale -
140
+ offsetY -
141
+ padding * scale;
142
+ boundTextCanvasContext.translate(-shiftX, -shiftY);
143
+ // Clear the bound text area
144
+ boundTextCanvasContext.clearRect(-(boundTextElement.width / 2 + BOUND_TEXT_PADDING) *
145
+ window.devicePixelRatio *
146
+ scale, -(boundTextElement.height / 2 + BOUND_TEXT_PADDING) *
147
+ window.devicePixelRatio *
148
+ scale, (boundTextElement.width + BOUND_TEXT_PADDING * 2) *
149
+ window.devicePixelRatio *
150
+ scale, (boundTextElement.height + BOUND_TEXT_PADDING * 2) *
151
+ window.devicePixelRatio *
152
+ scale);
153
+ }
105
154
  return {
106
155
  element,
107
156
  canvas,
@@ -112,6 +161,8 @@ const generateElementCanvas = (element, elementsMap, zoom, renderConfig, appStat
112
161
  canvasOffsetY,
113
162
  boundTextElementVersion: getBoundTextElement(element, elementsMap)?.version || null,
114
163
  containingFrameOpacity: getContainingFrame(element, elementsMap)?.opacity || 100,
164
+ boundTextCanvas,
165
+ angle: element.angle,
115
166
  };
116
167
  };
117
168
  export const DEFAULT_LINK_SIZE = 14;
@@ -119,7 +170,7 @@ const IMAGE_PLACEHOLDER_IMG = document.createElement("img");
119
170
  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
171
  const IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement("img");
121
172
  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) => {
173
+ const drawImagePlaceholder = (element, context) => {
123
174
  context.fillStyle = "#E7E7E7";
124
175
  context.fillRect(0, 0, element.width, element.height);
125
176
  const imageMinWidthOrHeight = Math.min(element.width, element.height);
@@ -176,7 +227,7 @@ const drawElementOnCanvas = (element, rc, context, renderConfig, appState) => {
176
227
  context.drawImage(img, 0 /* hardcoded for the selection box*/, 0, element.width, element.height);
177
228
  }
178
229
  else {
179
- drawImagePlaceholder(element, context, appState.zoom.value);
230
+ drawImagePlaceholder(element, context);
180
231
  }
181
232
  break;
182
233
  }
@@ -224,13 +275,21 @@ const generateElementWithCanvas = (element, elementsMap, renderConfig, appState)
224
275
  const shouldRegenerateBecauseZoom = prevElementWithCanvas &&
225
276
  prevElementWithCanvas.zoomValue !== zoom.value &&
226
277
  !appState?.shouldCacheIgnoreZoom;
227
- const boundTextElementVersion = getBoundTextElement(element, elementsMap)?.version || null;
278
+ const boundTextElement = getBoundTextElement(element, elementsMap);
279
+ const boundTextElementVersion = boundTextElement?.version || null;
228
280
  const containingFrameOpacity = getContainingFrame(element, elementsMap)?.opacity || 100;
229
281
  if (!prevElementWithCanvas ||
230
282
  shouldRegenerateBecauseZoom ||
231
283
  prevElementWithCanvas.theme !== appState.theme ||
232
284
  prevElementWithCanvas.boundTextElementVersion !== boundTextElementVersion ||
233
- prevElementWithCanvas.containingFrameOpacity !== containingFrameOpacity) {
285
+ prevElementWithCanvas.containingFrameOpacity !== containingFrameOpacity ||
286
+ // since we rotate the canvas when copying from cached canvas, we don't
287
+ // regenerate the cached canvas. But we need to in case of labels which are
288
+ // cached alongside the arrow, and we want the labels to remain unrotated
289
+ // with respect to the arrow.
290
+ (isArrowElement(element) &&
291
+ boundTextElement &&
292
+ element.angle !== prevElementWithCanvas.angle)) {
234
293
  const elementWithCanvas = generateElementCanvas(element, elementsMap, zoom, renderConfig, appState);
235
294
  elementWithCanvasCache.set(element, elementWithCanvas);
236
295
  return elementWithCanvas;
@@ -241,60 +300,21 @@ const drawElementFromCanvas = (elementWithCanvas, context, renderConfig, appStat
241
300
  const element = elementWithCanvas.element;
242
301
  const padding = getCanvasPadding(element);
243
302
  const zoom = elementWithCanvas.scale;
244
- let [x1, y1, x2, y2] = getElementAbsoluteCoords(element, allElementsMap);
245
- // Free draw elements will otherwise "shuffle" as the min x and y change
246
- if (isFreeDrawElement(element)) {
247
- x1 = Math.floor(x1);
248
- x2 = Math.ceil(x2);
249
- y1 = Math.floor(y1);
250
- y2 = Math.ceil(y2);
251
- }
303
+ const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, allElementsMap);
252
304
  const cx = ((x1 + x2) / 2 + appState.scrollX) * window.devicePixelRatio;
253
305
  const cy = ((y1 + y2) / 2 + appState.scrollY) * window.devicePixelRatio;
254
306
  context.save();
255
307
  context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);
256
308
  const boundTextElement = getBoundTextElement(element, allElementsMap);
257
309
  if (isArrowElement(element) && boundTextElement) {
258
- const tempCanvas = document.createElement("canvas");
259
- const tempCanvasContext = tempCanvas.getContext("2d");
260
- // Take max dimensions of arrow canvas so that when canvas is rotated
261
- // the arrow doesn't get clipped
262
- const maxDim = Math.max(distance(x1, x2), distance(y1, y2));
263
- tempCanvas.width =
264
- maxDim * window.devicePixelRatio * zoom +
265
- padding * elementWithCanvas.scale * 10;
266
- tempCanvas.height =
267
- maxDim * window.devicePixelRatio * zoom +
268
- padding * elementWithCanvas.scale * 10;
269
- const offsetX = (tempCanvas.width - elementWithCanvas.canvas.width) / 2;
270
- const offsetY = (tempCanvas.height - elementWithCanvas.canvas.height) / 2;
271
- tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2);
272
- tempCanvasContext.rotate(element.angle);
273
- tempCanvasContext.drawImage(elementWithCanvas.canvas, -elementWithCanvas.canvas.width / 2, -elementWithCanvas.canvas.height / 2, elementWithCanvas.canvas.width, elementWithCanvas.canvas.height);
274
- const [, , , , boundTextCx, boundTextCy] = getElementAbsoluteCoords(boundTextElement, allElementsMap);
275
- tempCanvasContext.rotate(-element.angle);
276
- // Shift the canvas to the center of the bound text element
277
- const shiftX = tempCanvas.width / 2 -
278
- (boundTextCx - x1) * window.devicePixelRatio * zoom -
279
- offsetX -
280
- padding * zoom;
281
- const shiftY = tempCanvas.height / 2 -
282
- (boundTextCy - y1) * window.devicePixelRatio * zoom -
283
- offsetY -
284
- padding * zoom;
285
- tempCanvasContext.translate(-shiftX, -shiftY);
286
- // Clear the bound text area
287
- tempCanvasContext.clearRect(-(boundTextElement.width / 2 + BOUND_TEXT_PADDING) *
288
- window.devicePixelRatio *
289
- zoom, -(boundTextElement.height / 2 + BOUND_TEXT_PADDING) *
290
- window.devicePixelRatio *
291
- zoom, (boundTextElement.width + BOUND_TEXT_PADDING * 2) *
292
- window.devicePixelRatio *
293
- zoom, (boundTextElement.height + BOUND_TEXT_PADDING * 2) *
294
- window.devicePixelRatio *
295
- zoom);
310
+ const offsetX = (elementWithCanvas.boundTextCanvas.width -
311
+ elementWithCanvas.canvas.width) /
312
+ 2;
313
+ const offsetY = (elementWithCanvas.boundTextCanvas.height -
314
+ elementWithCanvas.canvas.height) /
315
+ 2;
296
316
  context.translate(cx, cy);
297
- context.drawImage(tempCanvas, (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding, (-(y2 - y1) / 2) * window.devicePixelRatio - offsetY / zoom - padding, tempCanvas.width / zoom, tempCanvas.height / zoom);
317
+ context.drawImage(elementWithCanvas.boundTextCanvas, (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding, (-(y2 - y1) / 2) * window.devicePixelRatio - offsetY / zoom - padding, elementWithCanvas.boundTextCanvas.width / zoom, elementWithCanvas.boundTextCanvas.height / zoom);
298
318
  }
299
319
  else {
300
320
  // we translate context to element center so that rotation and scale
@@ -323,7 +343,7 @@ const drawElementFromCanvas = (elementWithCanvas, context, renderConfig, appStat
323
343
  context.restore();
324
344
  // Clear the nested element we appended to the DOM
325
345
  };
326
- export const renderSelectionElement = (element, context, appState) => {
346
+ export const renderSelectionElement = (element, context, appState, selectionColor) => {
327
347
  context.save();
328
348
  context.translate(element.x + appState.scrollX, element.y + appState.scrollY);
329
349
  context.fillStyle = "rgba(0, 0, 200, 0.04)";
@@ -334,7 +354,7 @@ export const renderSelectionElement = (element, context, appState) => {
334
354
  const offset = 0.5 / appState.zoom.value;
335
355
  context.fillRect(offset, offset, element.width, element.height);
336
356
  context.lineWidth = 1 / appState.zoom.value;
337
- context.strokeStyle = " rgb(105, 101, 219)";
357
+ context.strokeStyle = selectionColor;
338
358
  context.strokeRect(offset, offset, element.width, element.height);
339
359
  context.restore();
340
360
  };
@@ -386,7 +406,7 @@ export const renderElement = (element, elementsMap, allElementsMap, rc, context,
386
406
  context.restore();
387
407
  }
388
408
  else {
389
- const elementWithCanvas = generateElementWithCanvas(element, elementsMap, renderConfig, appState);
409
+ const elementWithCanvas = generateElementWithCanvas(element, allElementsMap, renderConfig, appState);
390
410
  drawElementFromCanvas(elementWithCanvas, context, renderConfig, appState, allElementsMap);
391
411
  }
392
412
  break;
@@ -470,7 +490,7 @@ export const renderElement = (element, elementsMap, allElementsMap, rc, context,
470
490
  // canvases)
471
491
  }
472
492
  else {
473
- const elementWithCanvas = generateElementWithCanvas(element, elementsMap, renderConfig, appState);
493
+ const elementWithCanvas = generateElementWithCanvas(element, allElementsMap, renderConfig, appState);
474
494
  const currentImageSmoothingStatus = context.imageSmoothingEnabled;
475
495
  if (
476
496
  // do not disable smoothing during zoom as blurry shapes look better
@@ -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,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,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;
@@ -3,13 +3,14 @@ import { normalizeLink, toValidURL } from "../data/url";
3
3
  import { getElementAbsoluteCoords } from "../element";
4
4
  import { createPlaceholderEmbeddableLabel, getEmbedLink, } from "../element/embeddable";
5
5
  import { LinearElementEditor } from "../element/linearElementEditor";
6
- import { getBoundTextElement, getContainerElement, getLineHeightInPx, getVerticalOffset, } from "../element/textElement";
6
+ import { getBoundTextElement, getContainerElement, getLineHeightInPx, } from "../element/textElement";
7
7
  import { isArrowElement, isIframeLikeElement, isInitializedImageElement, isTextElement, } from "../element/typeChecks";
8
8
  import { getContainingFrame } from "../frame";
9
9
  import { getCornerRadius, isPathALoop } from "../math";
10
10
  import { ShapeCache } from "../scene/ShapeCache";
11
11
  import { getFontFamilyString, isRTL, isTestEnv } from "../utils";
12
12
  import { getFreeDrawSvgPath, IMAGE_INVERT_FILTER } from "./renderElement";
13
+ import { getVerticalOffset } from "../fonts";
13
14
  const roughSVGDrawWithPrecision = (rsvg, drawable, precision) => {
14
15
  if (typeof precision === "undefined") {
15
16
  return rsvg.draw(drawable);
@@ -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, OrderedExcalidrawElement, Ordered } 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;
@@ -10,6 +10,9 @@ declare class Scene {
10
10
  private static sceneMapByElement;
11
11
  private static sceneMapById;
12
12
  static mapElementToScene(elementKey: ElementKey, scene: Scene): void;
13
+ /**
14
+ * @deprecated pass down `app.scene` and use it directly
15
+ */
13
16
  static getScene(elementKey: ElementKey): Scene | null;
14
17
  private callbacks;
15
18
  private nonDeletedElements;
@@ -19,7 +22,14 @@ declare class Scene {
19
22
  private frames;
20
23
  private elementsMap;
21
24
  private selectedElementsCache;
22
- private versionNonce;
25
+ /**
26
+ * Random integer regenerated each scene update.
27
+ *
28
+ * Does not relate to elements versions, it's only a renderer
29
+ * cache-invalidation nonce at the moment.
30
+ */
31
+ private sceneNonce;
32
+ getSceneNonce(): number | undefined;
23
33
  getNonDeletedElementsMap(): Map<string, Ordered<NonDeletedExcalidrawElement>> & import("../utility-types").MakeBrand<"NonDeletedSceneElementsMap">;
24
34
  getElementsIncludingDeleted(): readonly OrderedExcalidrawElement[];
25
35
  getElementsMapIncludingDeleted(): Map<string, Ordered<ExcalidrawElement>> & import("../utility-types").MakeBrand<"SceneElementsMap">;
@@ -38,7 +48,6 @@ declare class Scene {
38
48
  }): NonDeleted<ExcalidrawElement>[];
39
49
  getNonDeletedFramesLikes(): readonly NonDeleted<ExcalidrawFrameLikeElement>[];
40
50
  getElement<T extends ExcalidrawElement>(id: T["id"]): T | null;
41
- getVersionNonce(): number | undefined;
42
51
  getNonDeletedElement(id: ExcalidrawElement["id"]): NonDeleted<ExcalidrawElement> | null;
43
52
  /**
44
53
  * A utility method to help with updating all scene elements, with the added
@@ -54,8 +63,8 @@ declare class Scene {
54
63
  */
55
64
  mapElements(iteratee: (element: ExcalidrawElement) => ExcalidrawElement): boolean;
56
65
  replaceAllElements(nextElements: ElementsMapOrArray): void;
57
- informMutation(): void;
58
- addCallback(cb: SceneStateCallback): SceneStateCallbackRemover;
66
+ triggerUpdate(): void;
67
+ onUpdate(cb: SceneStateCallback): SceneStateCallbackRemover;
59
68
  destroy(): void;
60
69
  insertElementAtIndex(element: ExcalidrawElement, index: number): void;
61
70
  insertElementsAtIndex(elements: ExcalidrawElement[], index: number): void;
@@ -50,6 +50,9 @@ class Scene {
50
50
  this.sceneMapById.set(elementKey.id, scene);
51
51
  }
52
52
  }
53
+ /**
54
+ * @deprecated pass down `app.scene` and use it directly
55
+ */
53
56
  static getScene(elementKey) {
54
57
  if (isIdKey(elementKey)) {
55
58
  return this.sceneMapById.get(elementKey) || null;
@@ -72,7 +75,16 @@ class Scene {
72
75
  elements: null,
73
76
  cache: new Map(),
74
77
  };
75
- versionNonce;
78
+ /**
79
+ * Random integer regenerated each scene update.
80
+ *
81
+ * Does not relate to elements versions, it's only a renderer
82
+ * cache-invalidation nonce at the moment.
83
+ */
84
+ sceneNonce;
85
+ getSceneNonce() {
86
+ return this.sceneNonce;
87
+ }
76
88
  getNonDeletedElementsMap() {
77
89
  return this.nonDeletedElementsMap;
78
90
  }
@@ -118,9 +130,6 @@ class Scene {
118
130
  getElement(id) {
119
131
  return this.elementsMap.get(id) || null;
120
132
  }
121
- getVersionNonce() {
122
- return this.versionNonce;
123
- }
124
133
  getNonDeletedElement(id) {
125
134
  const element = this.getElement(id);
126
135
  if (element && isNonDeletedElement(element)) {
@@ -161,9 +170,15 @@ class Scene {
161
170
  ? nextElements
162
171
  : Array.from(nextElements.values());
163
172
  const nextFrameLikes = [];
164
- if (import.meta.env.DEV || import.meta.env.MODE === ENV.TEST) {
165
- // throw on invalid indices in test / dev to potentially detect cases were we forgot to sync moved elements
166
- validateFractionalIndices(_nextElements.map((x) => x.index));
173
+ if (import.meta.env.DEV ||
174
+ import.meta.env.MODE === ENV.TEST ||
175
+ window?.DEBUG_FRACTIONAL_INDICES) {
176
+ validateFractionalIndices(_nextElements, {
177
+ // validate everything
178
+ includeBoundTextValidation: true,
179
+ // throw only in dev & test, to remain functional on `DEBUG_FRACTIONAL_INDICES`
180
+ shouldThrow: import.meta.env.DEV || import.meta.env.MODE === ENV.TEST,
181
+ });
167
182
  }
168
183
  this.elements = syncInvalidIndices(_nextElements);
169
184
  this.elementsMap.clear();
@@ -179,15 +194,15 @@ class Scene {
179
194
  this.nonDeletedElementsMap = nonDeletedElements.elementsMap;
180
195
  this.frames = nextFrameLikes;
181
196
  this.nonDeletedFramesLikes = getNonDeletedElements(this.frames).elements;
182
- this.informMutation();
197
+ this.triggerUpdate();
183
198
  }
184
- informMutation() {
185
- this.versionNonce = randomInteger();
199
+ triggerUpdate() {
200
+ this.sceneNonce = randomInteger();
186
201
  for (const callback of Array.from(this.callbacks)) {
187
202
  callback();
188
203
  }
189
204
  }
190
- addCallback(cb) {
205
+ onUpdate(cb) {
191
206
  if (this.callbacks.has(cb)) {
192
207
  throw new Error();
193
208
  }