@excalidraw/element 0.18.0-9ba0f5d → 0.18.0-a52cd20

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 (279) hide show
  1. package/dist/dev/index.js +13141 -8453
  2. package/dist/dev/index.js.map +4 -4
  3. package/dist/prod/index.js +20 -19
  4. package/dist/types/common/debug.d.ts +21 -0
  5. package/dist/types/common/src/appEventBus.d.ts +27 -0
  6. package/dist/types/common/src/colors.d.ts +24 -2
  7. package/dist/types/common/src/constants.d.ts +70 -7
  8. package/dist/types/common/src/index.d.ts +3 -0
  9. package/dist/types/common/src/keys.d.ts +4 -0
  10. package/dist/types/common/src/points.d.ts +1 -1
  11. package/dist/types/common/src/random.d.ts +7 -0
  12. package/dist/types/common/src/utils.d.ts +10 -50
  13. package/dist/types/common/src/versionedSnapshotStore.d.ts +17 -0
  14. package/dist/types/element/src/Scene.d.ts +9 -5
  15. package/dist/types/element/src/align.d.ts +2 -2
  16. package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
  17. package/dist/types/element/src/arrowheads.d.ts +3 -0
  18. package/dist/types/element/src/arrows/focus.d.ts +30 -0
  19. package/dist/types/element/src/arrows/helpers.d.ts +5 -0
  20. package/dist/types/element/src/binding.d.ts +37 -17
  21. package/dist/types/element/src/bounds.d.ts +23 -8
  22. package/dist/types/element/src/bucketFill.d.ts +110 -0
  23. package/dist/types/element/src/collision.d.ts +7 -3
  24. package/dist/types/element/src/comparisons.d.ts +8 -5
  25. package/dist/types/element/src/convertToShape.d.ts +23 -0
  26. package/dist/types/element/src/delta.d.ts +23 -1
  27. package/dist/types/element/src/distribute.d.ts +3 -2
  28. package/dist/types/element/src/dragElements.d.ts +27 -0
  29. package/dist/types/element/src/duplicate.d.ts +64 -3
  30. package/dist/types/element/src/elbowArrow.d.ts +2 -0
  31. package/dist/types/element/src/embeddable.d.ts +2 -2
  32. package/dist/types/element/src/flowchart.d.ts +11 -7
  33. package/dist/types/element/src/fractionalIndex.d.ts +2 -2
  34. package/dist/types/element/src/frame.d.ts +11 -10
  35. package/dist/types/element/src/groups.d.ts +9 -9
  36. package/dist/types/element/src/index.d.ts +8 -1
  37. package/dist/types/element/src/linearElementEditor.d.ts +32 -10
  38. package/dist/types/element/src/mutateElement.d.ts +3 -1
  39. package/dist/types/element/src/newElement.d.ts +53 -3
  40. package/dist/types/element/src/renderElement.d.ts +21 -7
  41. package/dist/types/element/src/resizeElements.d.ts +2 -2
  42. package/dist/types/element/src/selection.d.ts +11 -7
  43. package/dist/types/element/src/shape.d.ts +28 -2
  44. package/dist/types/element/src/sizeHelpers.d.ts +6 -0
  45. package/dist/types/element/src/sortElements.d.ts +10 -0
  46. package/dist/types/element/src/stickyNote.d.ts +183 -0
  47. package/dist/types/element/src/textElement.d.ts +21 -10
  48. package/dist/types/element/src/textWrapping.d.ts +26 -0
  49. package/dist/types/element/src/transform.d.ts +26 -7
  50. package/dist/types/element/src/typeChecks.d.ts +29 -27
  51. package/dist/types/element/src/types.d.ts +48 -9
  52. package/dist/types/element/src/utils.d.ts +19 -6
  53. package/dist/types/element/src/visualdebug.d.ts +1 -2
  54. package/dist/types/element/src/zindex.d.ts +2 -2
  55. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +125 -53
  56. package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
  57. package/dist/types/excalidraw/actions/actionBoundText.d.ts +85 -37
  58. package/dist/types/excalidraw/actions/actionCanvas.d.ts +356 -1019
  59. package/dist/types/excalidraw/actions/actionClipboard.d.ts +84 -36
  60. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +42 -18
  61. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +130 -55
  62. package/dist/types/excalidraw/actions/actionDeselect.d.ts +182 -0
  63. package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -3
  64. package/dist/types/excalidraw/actions/actionElementLink.d.ts +38 -18
  65. package/dist/types/excalidraw/actions/actionElementLock.d.ts +85 -37
  66. package/dist/types/excalidraw/actions/actionExport.d.ts +133 -359
  67. package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
  68. package/dist/types/excalidraw/actions/actionFrame.d.ts +187 -236
  69. package/dist/types/excalidraw/actions/actionGroup.d.ts +100 -52
  70. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +99 -21
  71. package/dist/types/excalidraw/actions/actionLink.d.ts +43 -19
  72. package/dist/types/excalidraw/actions/actionMenu.d.ts +38 -18
  73. package/dist/types/excalidraw/actions/actionProperties.d.ts +120 -56
  74. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +46 -22
  75. package/dist/types/excalidraw/actions/actionStyles.d.ts +43 -18
  76. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +3 -3
  77. package/dist/types/excalidraw/actions/{actionEmbeddable.d.ts → actionToggleArrowBinding.d.ts} +57 -32
  78. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +46 -23
  79. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +195 -0
  80. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +43 -19
  81. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +42 -23
  82. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
  83. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +43 -19
  84. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +44 -20
  85. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +43 -19
  86. package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
  87. package/dist/types/excalidraw/actions/index.d.ts +4 -2
  88. package/dist/types/excalidraw/actions/manager.d.ts +1 -0
  89. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  90. package/dist/types/excalidraw/actions/types.d.ts +8 -4
  91. package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
  92. package/dist/types/excalidraw/appState.d.ts +39 -13
  93. package/dist/types/excalidraw/charts/charts.bar.d.ts +2 -0
  94. package/dist/types/excalidraw/charts/charts.constants.d.ts +48 -0
  95. package/dist/types/excalidraw/charts/charts.helpers.d.ts +32 -0
  96. package/dist/types/excalidraw/charts/charts.line.d.ts +2 -0
  97. package/dist/types/excalidraw/charts/charts.parse.d.ts +10 -0
  98. package/dist/types/excalidraw/charts/charts.radar.d.ts +2 -0
  99. package/dist/types/excalidraw/charts/charts.types.d.ts +18 -0
  100. package/dist/types/excalidraw/charts/index.d.ts +7 -0
  101. package/dist/types/excalidraw/clipboard.d.ts +6 -7
  102. package/dist/types/excalidraw/components/Actions.d.ts +17 -12
  103. package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
  104. package/dist/types/excalidraw/components/App.arrowText.d.ts +70 -0
  105. package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
  106. package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
  107. package/dist/types/excalidraw/components/App.d.ts +604 -89
  108. package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
  109. package/dist/types/excalidraw/components/App.duplicate.d.ts +51 -0
  110. package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
  111. package/dist/types/excalidraw/components/App.pan.d.ts +62 -0
  112. package/dist/types/excalidraw/components/App.textTool.d.ts +140 -0
  113. package/dist/types/excalidraw/components/App.toolDrag.d.ts +63 -0
  114. package/dist/types/excalidraw/components/App.viewport.d.ts +113 -0
  115. package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
  116. package/dist/types/excalidraw/components/AppStateObserver.d.ts +37 -0
  117. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -3
  118. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
  119. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +5 -1
  120. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +9 -2
  121. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
  122. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
  123. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
  124. package/dist/types/excalidraw/components/ColorPicker/colorTopPicksDnD.d.ts +11 -0
  125. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -1
  126. package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
  127. package/dist/types/excalidraw/components/CommandPalette/types.d.ts +1 -1
  128. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -2
  129. package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
  130. package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -1
  131. package/dist/types/excalidraw/components/FileDropOverlay.d.ts +2 -0
  132. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +4 -1
  133. package/dist/types/excalidraw/components/FontPicker/FontPickerList.d.ts +6 -1
  134. package/dist/types/excalidraw/components/FontPicker/fontTopPicksDnD.d.ts +12 -0
  135. package/dist/types/excalidraw/components/IconButton.d.ts +48 -0
  136. package/dist/types/excalidraw/components/IconPicker.d.ts +14 -9
  137. package/dist/types/excalidraw/components/Island.d.ts +7 -0
  138. package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
  139. package/dist/types/excalidraw/components/LayerUI.d.ts +5 -2
  140. package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
  141. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +6 -2
  142. package/dist/types/excalidraw/components/LibraryUnit.d.ts +7 -2
  143. package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
  144. package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
  145. package/dist/types/excalidraw/components/MobileMenu.d.ts +4 -4
  146. package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
  147. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  148. package/dist/types/excalidraw/components/PasteChartDialog.d.ts +4 -5
  149. package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
  150. package/dist/types/excalidraw/components/Popover.d.ts +1 -3
  151. package/dist/types/excalidraw/components/PropertiesPopover.d.ts +1 -1
  152. package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
  153. package/dist/types/excalidraw/components/Range.d.ts +10 -4
  154. package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
  155. package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
  156. package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
  157. package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
  158. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
  159. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -2
  160. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
  161. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
  162. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
  163. package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
  164. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  165. package/dist/types/excalidraw/components/TTDDialog/Chat/ChatInterface.d.ts +2 -6
  166. package/dist/types/excalidraw/components/TTDDialog/Chat/TTDChatPanel.d.ts +2 -1
  167. package/dist/types/excalidraw/components/TTDDialog/CodeMirrorEditor.d.ts +11 -0
  168. package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +4 -4
  169. package/dist/types/excalidraw/components/TTDDialog/TTDDialog.d.ts +11 -7
  170. package/dist/types/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +3 -3
  171. package/dist/types/excalidraw/components/TTDDialog/TTDDialogOutput.d.ts +4 -1
  172. package/dist/types/excalidraw/components/TTDDialog/TTDWelcomeMessage.d.ts +1 -0
  173. package/dist/types/excalidraw/components/TTDDialog/TextToDiagram.d.ts +2 -1
  174. package/dist/types/excalidraw/components/TTDDialog/mermaid-lang-lite.d.ts +2 -0
  175. package/dist/types/excalidraw/components/TTDDialog/types.d.ts +4 -0
  176. package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +3 -3
  177. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidAutoFix.d.ts +1 -0
  178. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidError.d.ts +10 -0
  179. package/dist/types/excalidraw/components/Toast.d.ts +8 -4
  180. package/dist/types/excalidraw/components/ToolPopover.d.ts +3 -6
  181. package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
  182. package/dist/types/excalidraw/components/Tools.d.ts +151 -0
  183. package/dist/types/excalidraw/components/Tooltip.d.ts +15 -1
  184. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksContextMenu.d.ts +14 -0
  185. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksTip.d.ts +11 -0
  186. package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +58 -0
  187. package/dist/types/excalidraw/components/UserList.d.ts +3 -2
  188. package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
  189. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +4 -1
  190. package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +3 -0
  191. package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  192. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +30 -16
  193. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuContent.d.ts +3 -2
  194. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItem.d.ts +11 -12
  195. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemCheckbox.d.ts +5 -0
  196. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContent.d.ts +2 -1
  197. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -1
  198. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSub.d.ts +23 -0
  199. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSubContent.d.ts +8 -0
  200. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSubTrigger.d.ts +12 -0
  201. package/dist/types/excalidraw/components/dropdownMenu/common.d.ts +1 -1
  202. package/dist/types/excalidraw/components/dropdownMenu/dropdownMenuUtils.d.ts +2 -0
  203. package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
  204. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -2
  205. package/dist/types/excalidraw/components/icons.d.ts +30 -10
  206. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +26 -3
  207. package/dist/types/excalidraw/components/main-menu/MainMenu.d.ts +23 -14
  208. package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
  209. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
  210. package/dist/types/excalidraw/data/blob.d.ts +107 -60
  211. package/dist/types/excalidraw/data/filesystem.d.ts +3 -5
  212. package/dist/types/excalidraw/data/index.d.ts +6 -7
  213. package/dist/types/excalidraw/data/json.d.ts +62 -30
  214. package/dist/types/excalidraw/data/library.d.ts +1 -1
  215. package/dist/types/excalidraw/data/resave.d.ts +7 -2
  216. package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
  217. package/dist/types/excalidraw/eraser/index.d.ts +2 -3
  218. package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
  219. package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
  220. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  221. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
  222. package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
  223. package/dist/types/excalidraw/lasso/index.d.ts +2 -3
  224. package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
  225. package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
  226. package/dist/types/excalidraw/renderer/animation.d.ts +5 -1
  227. package/dist/types/excalidraw/renderer/helpers.d.ts +25 -0
  228. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +2 -4
  229. package/dist/types/excalidraw/scene/Renderer.d.ts +489 -20
  230. package/dist/types/excalidraw/scene/export.d.ts +3 -3
  231. package/dist/types/excalidraw/scene/index.d.ts +2 -2
  232. package/dist/types/excalidraw/scene/types.d.ts +7 -4
  233. package/dist/types/excalidraw/snapping.d.ts +7 -7
  234. package/dist/types/excalidraw/textAutoResizeHandle.d.ts +15 -0
  235. package/dist/types/excalidraw/types.d.ts +619 -42
  236. package/dist/types/excalidraw/viewport.d.ts +302 -0
  237. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +12 -3
  238. package/dist/types/fractional-indexing/src/index.d.ts +29 -0
  239. package/dist/types/laser-pointer/src/index.d.ts +2 -0
  240. package/dist/types/laser-pointer/src/math.d.ts +16 -0
  241. package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
  242. package/dist/types/laser-pointer/src/state.d.ts +36 -0
  243. package/dist/types/math/src/constants.d.ts +0 -1
  244. package/dist/types/math/src/curve.d.ts +23 -13
  245. package/dist/types/math/src/index.d.ts +1 -0
  246. package/dist/types/math/src/pca.d.ts +79 -0
  247. package/dist/types/math/src/point.d.ts +8 -2
  248. package/dist/types/math/src/polygon.d.ts +25 -1
  249. package/dist/types/math/src/segment.d.ts +6 -0
  250. package/dist/types/math/src/types.d.ts +25 -1
  251. package/dist/types/utils/src/export.d.ts +4 -3
  252. package/dist/types/utils/src/index.d.ts +1 -2
  253. package/dist/types/utils/src/shape.d.ts +2 -2
  254. package/package.json +4 -3
  255. package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
  256. package/dist/types/excalidraw/charts.d.ts +0 -27
  257. package/dist/types/excalidraw/components/DiagramToCodePlugin/DiagramToCodePlugin.d.ts +0 -4
  258. package/dist/types/excalidraw/components/ExcalidrawLogo.d.ts +0 -15
  259. package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
  260. package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
  261. package/dist/types/excalidraw/components/InitializeApp.d.ts +0 -10
  262. package/dist/types/excalidraw/components/MobileToolBar.d.ts +0 -10
  263. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +0 -8
  264. package/dist/types/excalidraw/components/TTDDialog/utils/TTDStreamFetch.d.ts +0 -24
  265. package/dist/types/excalidraw/components/ToolButton.d.ts +0 -49
  266. package/dist/types/excalidraw/components/footer/FooterCenter.d.ts +0 -8
  267. package/dist/types/excalidraw/components/live-collaboration/LiveCollaborationTrigger.d.ts +0 -11
  268. package/dist/types/excalidraw/components/shapes.d.ts +0 -190
  269. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.Center.d.ts +0 -58
  270. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.Hints.d.ts +0 -19
  271. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.d.ts +0 -84
  272. package/dist/types/excalidraw/cursor.d.ts +0 -5
  273. package/dist/types/excalidraw/data/reconcile.d.ts +0 -7
  274. package/dist/types/excalidraw/index.d.ts +0 -46
  275. package/dist/types/excalidraw/polyfill.d.ts +0 -2
  276. package/dist/types/excalidraw/scene/scroll.d.ts +0 -18
  277. package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
  278. package/dist/types/utils/src/bbox.d.ts +0 -9
  279. package/dist/types/utils/src/withinBounds.d.ts +0 -19
@@ -1,22 +1,24 @@
1
- import type { IMAGE_MIME_TYPES, UserIdleState, throttleRAF, MIME_TYPES, EditorInterface } from "@excalidraw/common";
1
+ import type { IMAGE_MIME_TYPES, UserIdleState, throttleRAF, MIME_TYPES, EditorInterface, StrokeWidthKey } from "@excalidraw/common";
2
2
  import type { LinearElementEditor } from "@excalidraw/element";
3
3
  import type { MaybeTransformHandleType } from "@excalidraw/element";
4
- import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, Arrowhead, ChartType, FontFamilyValues, FileId, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement, BindMode } from "@excalidraw/element/types";
4
+ import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, ExcalidrawArrowElement, Arrowhead, FontFamilyValues, FileId, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement, BindMode, ExcalidrawTextElement, StrokeVariability } from "@excalidraw/element/types";
5
5
  import type { Merge, MaybePromise, ValueOf, MakeBrand } from "@excalidraw/common/utility-types";
6
- import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement } from "@excalidraw/element";
6
+ import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement, OnDuplicateData } from "@excalidraw/element";
7
+ import type { GlobalPoint } from "@excalidraw/math";
7
8
  import type { Action } from "./actions/types";
8
9
  import type { Spreadsheet } from "./charts";
9
10
  import type { ClipboardData } from "./clipboard";
10
11
  import type App from "./components/App";
11
12
  import type Library from "./data/library";
12
- import type { FileSystemHandle } from "./data/filesystem";
13
13
  import type { ContextMenuItems } from "./components/ContextMenu";
14
14
  import type { SnapLine } from "./snapping";
15
15
  import type { ImportedDataState } from "./data/types";
16
+ import type { SetViewportOptions } from "./viewport";
16
17
  import type { Language } from "./i18n";
17
18
  import type { isOverScrollBars } from "./scene/scrollbars";
18
19
  import type React from "react";
19
20
  import type { JSX } from "react";
21
+ export type { App };
20
22
  export type SocketId = string & {
21
23
  _brand: "SocketId";
22
24
  };
@@ -83,7 +85,7 @@ export type BinaryFileData = {
83
85
  };
84
86
  export type BinaryFileMetadata = Omit<BinaryFileData, "dataURL">;
85
87
  export type BinaryFiles = Record<ExcalidrawElement["id"], BinaryFileData>;
86
- export type ToolType = "selection" | "lasso" | "rectangle" | "diamond" | "ellipse" | "arrow" | "line" | "freedraw" | "text" | "image" | "eraser" | "hand" | "frame" | "magicframe" | "embeddable" | "laser";
88
+ export type ToolType = "selection" | "lasso" | "rectangle" | "diamond" | "ellipse" | "arrow" | "line" | "freedraw" | "text" | "image" | "eraser" | "hand" | "frame" | "magicframe" | "stickynote" | "embeddable" | "laser" | "autoshape" | "bucketfill";
87
89
  export type ElementOrToolType = ExcalidrawElementType | ToolType | "custom";
88
90
  export type ActiveTool = {
89
91
  type: ToolType;
@@ -128,6 +130,7 @@ export type StaticCanvasAppState = Readonly<_CommonCanvasAppState & {
128
130
  croppingElementId: AppState["croppingElementId"];
129
131
  }>;
130
132
  export type InteractiveCanvasAppState = Readonly<_CommonCanvasAppState & {
133
+ activeTool: AppState["activeTool"];
131
134
  activeEmbeddable: AppState["activeEmbeddable"];
132
135
  selectionElement: AppState["selectionElement"];
133
136
  selectedGroupIds: AppState["selectedGroupIds"];
@@ -135,7 +138,10 @@ export type InteractiveCanvasAppState = Readonly<_CommonCanvasAppState & {
135
138
  multiElement: AppState["multiElement"];
136
139
  newElement: AppState["newElement"];
137
140
  isBindingEnabled: AppState["isBindingEnabled"];
141
+ isMidpointSnappingEnabled: AppState["isMidpointSnappingEnabled"];
142
+ gridModeEnabled: AppState["gridModeEnabled"];
138
143
  suggestedBinding: AppState["suggestedBinding"];
144
+ textToolHover: AppState["textToolHover"];
139
145
  isRotating: AppState["isRotating"];
140
146
  elementsToHighlight: AppState["elementsToHighlight"];
141
147
  collaborators: AppState["collaborators"];
@@ -150,6 +156,7 @@ export type InteractiveCanvasAppState = Readonly<_CommonCanvasAppState & {
150
156
  frameRendering: AppState["frameRendering"];
151
157
  shouldCacheIgnoreZoom: AppState["shouldCacheIgnoreZoom"];
152
158
  exportScale: AppState["exportScale"];
159
+ currentItemArrowType: AppState["currentItemArrowType"];
153
160
  }>;
154
161
  export type ObservedAppState = ObservedStandaloneAppState & ObservedElementsAppState;
155
162
  export type ObservedStandaloneAppState = {
@@ -168,6 +175,47 @@ export type ObservedElementsAppState = {
168
175
  lockedMultiSelections: AppState["lockedMultiSelections"];
169
176
  activeLockedId: AppState["activeLockedId"];
170
177
  };
178
+ export type BoxSelectionMode = "contain" | "overlap";
179
+ /**
180
+ * The pointing device the wheel mappings are tuned for. `auto` is reserved
181
+ * for detecting it from the wheel events; see `resolveInputDevice`.
182
+ */
183
+ export type InputDevice = "auto" | "mouse" | "trackpad";
184
+ /**
185
+ * A box, in scene coordinates, that pan & zoom are constrained to.
186
+ *
187
+ * This is a private type. For public API, only use specific properties,
188
+ * needed.
189
+ */
190
+ export type ScrollConstraints = {
191
+ x: number;
192
+ y: number;
193
+ width: number;
194
+ height: number;
195
+ /** when set, panning is constrained so the viewport stays within the box */
196
+ lockScroll: boolean;
197
+ /** when set, the viewport cannot zoom out below `zoom` */
198
+ lockZoom: boolean;
199
+ /**
200
+ * The zoom resolved after the `setViewport` navigation settled.
201
+ */
202
+ zoom: number;
203
+ /**
204
+ * Pixel amount the viewport may overscroll past its resting clamp before
205
+ * snapping back (rubberband). Screen pixels, zoom-independent. Resolved
206
+ * from `lock.overscroll` at the time the lock was installed (`true` →
207
+ * default give, `false` → 0).
208
+ */
209
+ overscroll: number;
210
+ /**
211
+ * Extra scrollable margin around the box (CSS-style), letting the viewport
212
+ * scroll past each box edge to reveal that much empty space. Values are
213
+ * viewport pixels and zoom-independent (a fixed on-screen distance).
214
+ * Resolved from the `offsets` passed to `setViewport` (see
215
+ * {@link ViewportOffsets}) at the time the lock was installed.
216
+ */
217
+ offsets?: Offsets;
218
+ };
171
219
  export interface AppState {
172
220
  contextMenu: {
173
221
  items: ContextMenuItems;
@@ -201,9 +249,53 @@ export interface AppState {
201
249
  * - set on pointer down, updated during pointer move
202
250
  */
203
251
  selectionElement: NonDeletedExcalidrawElement | null;
252
+ /**
253
+ * tracking current arrow binding editor state (takes into account
254
+ * `bindingPreference` and keyboard modifiers (ctrl/alt)
255
+ */
204
256
  isBindingEnabled: boolean;
205
- startBoundElement: NonDeleted<ExcalidrawBindableElement> | null;
206
- suggestedBinding: NonDeleted<ExcalidrawBindableElement> | null;
257
+ /** user box selection preference; defaults to "contain" when unset */
258
+ boxSelectionMode: BoxSelectionMode;
259
+ /** user arrow binding preference */
260
+ bindingPreference: "enabled" | "disabled";
261
+ /** user preference whether arrow snap to midpoints while binding */
262
+ isMidpointSnappingEnabled: boolean;
263
+ /** user preference whether to show contextual hints above the toolbar */
264
+ showHints: boolean;
265
+ /**
266
+ * user preference for what the wheel does: with a `trackpad` a plain wheel
267
+ * pans; with a `mouse` a plain wheel zooms. Ctrl/cmd+wheel (how a pinch is
268
+ * delivered) zooms with either device. Shift+wheel pans horizontally;
269
+ * ctrl/cmd+shift+wheel pans vertically. `auto` resolves to `trackpad` until
270
+ * device detection exists — see `resolveInputDevice`
271
+ */
272
+ inputDevice: InputDevice;
273
+ /**
274
+ * The bindable element the UI highlights for the user when an arrow is
275
+ * dragged or otherwise its endpoint being close to said element.
276
+ */
277
+ suggestedBinding: {
278
+ element: NonDeleted<ExcalidrawBindableElement>;
279
+ midPoint?: GlobalPoint;
280
+ } | null;
281
+ /**
282
+ * What a text-tool click at the hovered position would act on — the text
283
+ * it would edit, the empty container it would label, or the arrow anchor
284
+ * (a free endpoint, or the midpoint for a label) it would attach text to.
285
+ * `null` when the click would create free text, or the tool isn't active.
286
+ * Drives the hover affordance only.
287
+ */
288
+ textToolHover: {
289
+ type: "text";
290
+ elementId: ExcalidrawElement["id"];
291
+ } | {
292
+ type: "container";
293
+ elementId: ExcalidrawElement["id"];
294
+ } | {
295
+ type: "arrow";
296
+ elementId: ExcalidrawArrowElement["id"];
297
+ anchor: "start" | "end" | "label";
298
+ } | null;
207
299
  frameToHighlight: NonDeleted<ExcalidrawFrameLikeElement> | null;
208
300
  frameRendering: {
209
301
  enabled: boolean;
@@ -211,12 +303,19 @@ export interface AppState {
211
303
  outline: boolean;
212
304
  clip: boolean;
213
305
  };
214
- editingFrame: string | null;
215
- elementsToHighlight: NonDeleted<ExcalidrawElement>[] | null;
306
+ /**
307
+ * frame-like element whose name is currently being edited
308
+ */
309
+ editingFrame: ExcalidrawFrameLikeElement["id"] | null;
310
+ /**
311
+ * Elements the UI highlights with a bounding-box outline — those that
312
+ * would get added to a frame being dragged/resized.
313
+ */
314
+ elementsToHighlight: readonly NonDeletedExcalidrawElement[] | null;
216
315
  /**
217
316
  * set when a new text is created or when an existing text is being edited
218
317
  */
219
- editingTextElement: NonDeletedExcalidrawElement | null;
318
+ editingTextElement: ExcalidrawTextElement | null;
220
319
  activeTool: {
221
320
  /**
222
321
  * indicates a previous tool we should revert back to if we deselect the
@@ -237,11 +336,14 @@ export interface AppState {
237
336
  exportWithDarkMode: boolean;
238
337
  exportScale: number;
239
338
  currentItemStrokeColor: string;
339
+ currentItemStickynoteStrokeColor: string;
340
+ currentItemStickynoteBackgroundColor: string;
240
341
  currentItemBackgroundColor: string;
241
342
  currentItemFillStyle: ExcalidrawElement["fillStyle"];
242
- currentItemStrokeWidth: number;
343
+ currentItemStrokeWidthKey: StrokeWidthKey;
243
344
  currentItemStrokeStyle: ExcalidrawElement["strokeStyle"];
244
345
  currentItemRoughness: number;
346
+ currentItemStrokeVariability: StrokeVariability;
245
347
  currentItemOpacity: number;
246
348
  currentItemFontFamily: FontFamilyValues;
247
349
  currentItemFontSize: number;
@@ -254,6 +356,7 @@ export interface AppState {
254
356
  viewBackgroundColor: string;
255
357
  scrollX: number;
256
358
  scrollY: number;
359
+ scrollConstraints: ScrollConstraints | null;
257
360
  cursorButton: "up" | "down";
258
361
  scrolledOutside: boolean;
259
362
  name: string | null;
@@ -278,6 +381,10 @@ export interface AppState {
278
381
  } | {
279
382
  name: "elementLinkSelector";
280
383
  sourceElementId: ExcalidrawElement["id"];
384
+ } | {
385
+ name: "charts";
386
+ data: Spreadsheet;
387
+ rawText: string;
281
388
  };
282
389
  /**
283
390
  * Reflects user preference for whether the default sidebar should be docked.
@@ -300,7 +407,7 @@ export interface AppState {
300
407
  selectedElementsAreBeingDragged: boolean;
301
408
  shouldCacheIgnoreZoom: boolean;
302
409
  toast: {
303
- message: string;
410
+ message: React.ReactNode;
304
411
  closable?: boolean;
305
412
  duration?: number;
306
413
  } | null;
@@ -322,21 +429,13 @@ export interface AppState {
322
429
  height: number;
323
430
  offsetTop: number;
324
431
  offsetLeft: number;
325
- fileHandle: FileSystemHandle | null;
432
+ fileHandle: FileSystemFileHandle | null;
326
433
  collaborators: Map<SocketId, Collaborator>;
327
434
  stats: {
328
435
  open: boolean;
329
436
  /** bitmap. Use `STATS_PANELS` bit values */
330
437
  panels: number;
331
438
  };
332
- currentChartType: ChartType;
333
- pasteDialog: {
334
- shown: false;
335
- data: null;
336
- } | {
337
- shown: true;
338
- data: Spreadsheet;
339
- };
340
439
  showHyperlinkPopup: false | "info" | "editor";
341
440
  selectedLinearElement: LinearElementEditor | null;
342
441
  snapLines: readonly SnapLine[];
@@ -345,10 +444,6 @@ export interface AppState {
345
444
  y: number;
346
445
  } | null;
347
446
  objectsSnapModeEnabled: boolean;
348
- /** the user's socket id & username who is being followed on the canvas */
349
- userToFollow: UserToFollow | null;
350
- /** the socket ids of the users following the current user */
351
- followedBy: Set<SocketId>;
352
447
  /** image cropping */
353
448
  isCropping: boolean;
354
449
  croppingElementId: ExcalidrawElement["id"] | null;
@@ -363,6 +458,23 @@ export interface AppState {
363
458
  [groupId: string]: true;
364
459
  };
365
460
  bindMode: BindMode;
461
+ /** user-customized color-picker top picks (pinned via drag & drop from the
462
+ * color picker popup). `null` means no customization (defaults, or
463
+ * host-supplied `topPicks`, are used). Kept per picker. */
464
+ colorTopPicks: {
465
+ elementStroke: readonly string[] | null;
466
+ elementBackground: readonly string[] | null;
467
+ /** the bucket-fill tool keeps a list separate from `elementBackground`
468
+ * even though both drive `currentItemBackgroundColor` (its defaults and
469
+ * use case differ — no transparent) */
470
+ bucketFill: readonly string[] | null;
471
+ /** sticky notes are their own color domain (own defaults, own picks) */
472
+ stickyNoteStroke: readonly string[] | null;
473
+ stickyNoteBackground: readonly string[] | null;
474
+ };
475
+ /** user-customized font-picker top picks (pinned via drag & drop from the
476
+ * font picker popup). `null` means no customization (defaults are used) */
477
+ fontTopPicks: readonly FontFamilyValues[] | null;
366
478
  }
367
479
  export type SearchMatch = {
368
480
  id: string;
@@ -375,7 +487,7 @@ export type SearchMatch = {
375
487
  showOnCanvas: boolean;
376
488
  }[];
377
489
  };
378
- export type UIAppState = Omit<AppState, "startBoundElement" | "cursorButton" | "scrollX" | "scrollY">;
490
+ export type UIAppState = Omit<AppState, "cursorButton" | "scrollX" | "scrollY" | "zoom" | "shouldCacheIgnoreZoom" | "snapLines" | "originSnapOffset" | "suggestedBinding" | "textToolHover" | "frameToHighlight" | "elementsToHighlight">;
379
491
  export type NormalizedZoomValue = number & {
380
492
  _brand: "normalizedZoom";
381
493
  };
@@ -419,15 +531,192 @@ export type LibraryItemsSource = ((currentLibraryItems: LibraryItems) => MaybePr
419
531
  export type ExcalidrawInitialDataState = Merge<ImportedDataState, {
420
532
  libraryItems?: MaybePromise<Required<ImportedDataState>["libraryItems"]>;
421
533
  }>;
534
+ export type ExcalidrawInitialState = {
535
+ viewport?: Omit<SetViewportOptions, "animation">;
536
+ };
422
537
  export type OnUserFollowedPayload = {
423
538
  userToFollow: UserToFollow;
424
539
  action: "FOLLOW" | "UNFOLLOW";
425
540
  };
541
+ export type ViewportStatusFrame = {
542
+ /** the badge (bottom-center pill) */
543
+ label?: {
544
+ label: React.ReactNode;
545
+ icon?: React.ReactNode;
546
+ /** badge background; defaults to var(--color-primary-hover) */
547
+ background?: string;
548
+ /** badge text color; defaults to var(--color-primary-light) */
549
+ color?: string;
550
+ /** makes the badge label interactive */
551
+ onClick?: () => void;
552
+ /** renders a close button when set */
553
+ onClose?: () => void;
554
+ };
555
+ /** viewport-edge border: CSS color, or `false` for none */
556
+ border: false | string;
557
+ };
558
+ export type OnExportProgress = {
559
+ type: "progress";
560
+ message?: React.ReactNode;
561
+ /** 0-1 range */
562
+ progress?: number;
563
+ };
564
+ export type InteractionConfig = {
565
+ /**
566
+ * Interactions that stay enabled while the editor is otherwise
567
+ * non-interactive. Opt-in: anything omitted or `false` is disabled.
568
+ */
569
+ enabled?: {
570
+ /**
571
+ * Element links render their link icon and stay clickable — clicking
572
+ * anywhere on a linked element opens the link, same as in view mode.
573
+ * When disabled, link icons are not rendered at all.
574
+ *
575
+ * @default false
576
+ */
577
+ links?: boolean;
578
+ /**
579
+ * Embeddable & iframe elements stay interactive — hovering & clicking
580
+ * activates them so their content can be used, same as in view mode.
581
+ *
582
+ * @default false
583
+ */
584
+ embeds?: boolean;
585
+ /**
586
+ * Umbrella for all interactive content on canvas — shorthand for
587
+ * enabling `links` & `embeds` (and future interactive content kinds)
588
+ * together. Additive: `interactiveContent: true` enables them
589
+ * regardless of their individual values.
590
+ *
591
+ * @default false
592
+ */
593
+ interactiveContent?: boolean;
594
+ /**
595
+ * Canvas navigation — panning (pointer drag, wheel, PageUp/PageDown)
596
+ * and zooming (ctrl/cmd + wheel, pinch, and the canvas zoom &
597
+ * zoom-to-fit shortcuts: ctrl/cmd +/-/0, shift+1/2/3), same as in view
598
+ * mode. Respects `appState.scrollConstraints` if set, so it composes
599
+ * with viewport locking. The rest of the keyboard stays disabled. Note
600
+ * the editor consumes wheel & touch input again when enabled, so the
601
+ * page no longer scrolls over the editor.
602
+ *
603
+ * @default false
604
+ */
605
+ navigation?: boolean;
606
+ /**
607
+ * Whether the browser's own zoom remains available over the editor —
608
+ * ctrl/cmd + wheel, pinch, and (while the editor has focus)
609
+ * ctrl/cmd +/-/0 shortcuts. Prevented by default, mirroring the
610
+ * interactive editor. Regular page scrolling stays available either way.
611
+ * With `navigation` enabled, the zoom input (wheel, pinch, keyboard
612
+ * shortcuts) zooms the canvas instead either way, making this moot.
613
+ *
614
+ * @default false
615
+ */
616
+ browserZoom?: boolean;
617
+ /**
618
+ * Tools that stay user-driven while the editor is otherwise
619
+ * non-interactive: pointer input keeps driving the listed tool when it's
620
+ * the active tool. Does not enable user-driven tool *switching* — the
621
+ * keyboard stays disabled and tool selection remains host-driven
622
+ * (`ExcalidrawAPI.setActiveTool`).
623
+ *
624
+ * Composes with `navigation`: the enabled tool wins the primary-pointer
625
+ * drag, while wheel input (and wheel-button drag) still pans/zooms.
626
+ */
627
+ tools?: {
628
+ /**
629
+ * The laser pointer stays usable — pointer strokes draw laser trails
630
+ * and pointer positions keep broadcasting via `onPointerUpdate`, so
631
+ * e.g. collaborators see a presenter's laser & cursor.
632
+ *
633
+ * @default false
634
+ */
635
+ laser?: boolean;
636
+ /**
637
+ * Custom tools (`activeTool.type === "custom"`) stay usable — the
638
+ * editor keeps dispatching `onPointerDown` / `onPointerUp` for them.
639
+ * Tool behavior is host-implemented; activate custom tools with
640
+ * `locked: true` or they revert to the selection tool (and go inert)
641
+ * after the first pointer interaction.
642
+ *
643
+ * @default false
644
+ */
645
+ custom?: boolean;
646
+ };
647
+ };
648
+ };
649
+ export type UIConfig = {
650
+ /**
651
+ * Default UI controls that stay enabled while the rest of Excalidraw's
652
+ * default UI is hidden. Opt-in: anything omitted or `false` is disabled.
653
+ */
654
+ enabled: {
655
+ /**
656
+ * The zoom-out, reset-zoom, and zoom-in controls.
657
+ *
658
+ * @default false
659
+ */
660
+ zoom?: boolean;
661
+ /**
662
+ * The button shown when the viewport is scrolled away from all content.
663
+ *
664
+ * @default false
665
+ */
666
+ scrollBackToContent?: boolean;
667
+ };
668
+ };
669
+ /** Supported visual changes. Geometry, content, bindings and styles are not overridable. */
670
+ export type ElementRenderOverride = Readonly<{
671
+ /** Absolute render opacity (0–100, clamped). Omitted: use element.opacity. */
672
+ opacity?: number;
673
+ /** Translation in scene units. Bound labels inherit their container's offset and ignore this field. */
674
+ offset?: Readonly<{
675
+ x: number;
676
+ y: number;
677
+ }>;
678
+ }>;
679
+ /** see {@link ExcalidrawImperativeAPI.setElementRenderOverrides} for details */
680
+ export type ElementRenderOverrides = ReadonlyMap<ExcalidrawElement["id"], ElementRenderOverride>;
681
+ /** The translation part of a snapshot: only the entries that carry an offset. */
682
+ export type ElementRenderOffsets = ReadonlyMap<ExcalidrawElement["id"], NonNullable<ElementRenderOverride["offset"]>>;
426
683
  export interface ExcalidrawProps {
684
+ className?: string;
685
+ /**
686
+ * Document that owns Excalidraw's mounted DOM.
687
+ *
688
+ * Set only when it differs from the global `document`, such as when code
689
+ * executing in a parent window mounts Excalidraw into an iframe document.
690
+ * The value must remain stable for the editor's lifetime.
691
+ *
692
+ * @default document
693
+ */
694
+ ownerDocument?: Document;
427
695
  onChange?: (elements: readonly OrderedExcalidrawElement[], appState: AppState, files: BinaryFiles) => void;
696
+ onThemeChange?: (theme: Theme | "system") => void;
697
+ /**
698
+ * note: only subscribes if the props.onIncrement is defined on initial render
699
+ */
428
700
  onIncrement?: (event: DurableIncrement | EphemeralIncrement) => void;
429
701
  initialData?: (() => MaybePromise<ExcalidrawInitialDataState | null>) | MaybePromise<ExcalidrawInitialDataState | null>;
430
- excalidrawAPI?: (api: ExcalidrawImperativeAPI) => void;
702
+ initialState?: ExcalidrawInitialState;
703
+ /**
704
+ * Invoked as soon as the Excalidraw API is available
705
+ * NOTE editor is not yet mounted, and state is not yet initialized
706
+ */
707
+ onExcalidrawAPI?: (api: ExcalidrawImperativeAPI | null) => void;
708
+ /**
709
+ * Invoked once the editor root is mounted.
710
+ */
711
+ onMount?: (payload: ExcalidrawMountPayload) => void;
712
+ /**
713
+ * Invoked when the editor root is unmounted.
714
+ */
715
+ onUnmount?: () => void;
716
+ /**
717
+ * Invoked once the initial scene is loaded.
718
+ */
719
+ onInitialize?: (api: ExcalidrawImperativeAPI) => void;
431
720
  isCollaborating?: boolean;
432
721
  onPointerUpdate?: (payload: {
433
722
  pointer: {
@@ -448,15 +737,95 @@ export interface ExcalidrawProps {
448
737
  *
449
738
  * Returned elements will be used in place of the next elements
450
739
  * (you should return all elements, including deleted, and not mutate
451
- * the element if changes are made)
740
+ * the element if changes are made).
741
+ *
742
+ * The duplicates are the elements in `nextElements` which are not in
743
+ * `prevElements` (see also `data.duplicateElements`). When pasting or
744
+ * inserting onto a frame, their `frameId` is already set. To change a
745
+ * duplicate, return a new object with the same `id`. It is shallow-merged
746
+ * into the duplicate (omitted properties are kept), and your changes are
747
+ * part of the duplication itself (same undo entry, same durable increment).
748
+ *
749
+ * To prevent an element from being duplicated, omit its duplicate from the
750
+ * returned array. References to it from the remaining duplicates are
751
+ * cleared, and a bound text isn't duplicated without its container. To
752
+ * prevent the duplication as a whole, return `false`. If no duplicate
753
+ * remains, the duplication is cancelled and the returned elements are
754
+ * ignored (alt-drag then moves the original elements instead).
452
755
  */
453
756
  onDuplicate?: (nextElements: readonly ExcalidrawElement[],
454
757
  /** excludes the duplicated elements */
455
- prevElements: readonly ExcalidrawElement[]) => ExcalidrawElement[] | void;
758
+ prevElements: readonly ExcalidrawElement[],
759
+ /** lookups covering just the elements taking part in the duplication */
760
+ data: OnDuplicateData) => ExcalidrawElement[] | void | false;
456
761
  renderTopLeftUI?: (isMobile: boolean, appState: UIAppState) => JSX.Element | null;
457
762
  renderTopRightUI?: (isMobile: boolean, appState: UIAppState) => JSX.Element | null;
458
763
  langCode?: Language["code"];
459
764
  viewModeEnabled?: boolean;
765
+ /**
766
+ * Whether the editor accepts user input (pointer, keyboard, wheel, touch,
767
+ * clipboard, drag&drop). When `false`, the scene still renders and reacts
768
+ * to programmatic updates (imperative API), but the user cannot affect it
769
+ * in any way. Implies view mode.
770
+ *
771
+ * Pass a config object to keep specific interactions enabled while the
772
+ * editor is otherwise non-interactive (see `InteractionConfig`):
773
+ *
774
+ * ```tsx
775
+ * <Excalidraw interaction={{ enabled: { links: true } }} />
776
+ * ```
777
+ *
778
+ * @default true
779
+ */
780
+ interaction?: boolean | InteractionConfig;
781
+ /**
782
+ * Whether Excalidraw's default UI is rendered — toolbar, default menus,
783
+ * footer controls, sidebars, and canvas popups. Host UI passed through
784
+ * children (including exported components such as `MainMenu` and `Footer`)
785
+ * or render props continues to render, together with any supporting dialogs
786
+ * it opens.
787
+ *
788
+ * Canvas content (elements, text editing surface, frame names, embeds) still
789
+ * renders, and the editor remains interactive unless `interaction` is set to
790
+ * `false`.
791
+ *
792
+ * Pass a config object to keep specific default controls rendered while the
793
+ * rest of the default UI is hidden (see `UIConfig`):
794
+ *
795
+ * ```tsx
796
+ * <Excalidraw ui={{ enabled: { zoom: true } }} />
797
+ * ```
798
+ *
799
+ * NOTE: this is WIP and what default UI is/is not rendered when ui=false
800
+ * may yet change.
801
+ *
802
+ * @default true
803
+ */
804
+ ui?: boolean | UIConfig;
805
+ /**
806
+ * Forces the active editor tool (controlled). While set, user- and
807
+ * API-driven tool switching is ignored — `setActiveTool` refuses with a
808
+ * console warning, non-forced toolbar buttons render disabled — and the
809
+ * editor snaps back if internal flows reset the tool. The forced tool
810
+ * behaves as if locked (see the tool lock / padlock): it doesn't revert to
811
+ * the selection tool after use, and elements drawn with it aren't
812
+ * auto-selected — without mutating `appState.activeTool.locked`, so the
813
+ * user's persisted padlock preference stays untouched. Unset to return
814
+ * tool control to the editor (the current tool stays active).
815
+ *
816
+ * The forced tool must be activatable to take effect: not disabled via
817
+ * `UIOptions.tools`, and — while the editor is non-interactive — allowed
818
+ * via `interaction.enabled.tools`. Otherwise the editor stays on (or, when
819
+ * non-interactive, resets to) the `selection` tool, and the forced tool is
820
+ * applied once it becomes activatable. `image` cannot be forced (its
821
+ * activation opens the file picker).
822
+ */
823
+ activeTool?: {
824
+ type: Exclude<ToolType, "image">;
825
+ } | {
826
+ type: "custom";
827
+ customType: string;
828
+ };
460
829
  zenModeEnabled?: boolean;
461
830
  gridModeEnabled?: boolean;
462
831
  objectsSnapModeEnabled?: boolean;
@@ -465,6 +834,10 @@ export interface ExcalidrawProps {
465
834
  name?: string;
466
835
  renderCustomStats?: (elements: readonly NonDeletedExcalidrawElement[], appState: UIAppState) => JSX.Element;
467
836
  UIOptions?: Partial<UIOptions>;
837
+ /**
838
+ * dimensions and size constraints for inserted images
839
+ */
840
+ imageOptions?: ImageOptions;
468
841
  detectScroll?: boolean;
469
842
  handleKeyboardGlobally?: boolean;
470
843
  onLibraryChange?: (libraryItems: LibraryItems) => void | Promise<any>;
@@ -484,9 +857,48 @@ export interface ExcalidrawProps {
484
857
  aiEnabled?: boolean;
485
858
  showDeprecatedFonts?: boolean;
486
859
  renderScrollbars?: boolean;
860
+ viewportStatusFrame?: ViewportStatusFrame | null;
861
+ /**
862
+ * Rendered inside the UserList "who's here" dropdown (desktop) and inline
863
+ * in the mobile menu's collaborators section, below a divider. Accepts a
864
+ * render function — called with `isMobile` so hosts can render different
865
+ * UI for each surface — in addition to a plain node.
866
+ */
867
+ currentUserControls?: React.ReactNode | ((isMobile: boolean) => React.ReactNode);
868
+ /**
869
+ * The user being followed on the canvas, if any. Controlled by the host —
870
+ * the editor never sets it; it emits follow/unfollow intents via
871
+ * `onUserFollow` (prop or imperative API) and renders the followed
872
+ * user's avatar highlight from this value.
873
+ */
874
+ userToFollow?: UserToFollow | null;
875
+ /**
876
+ * Called before exporting to a file.
877
+ *
878
+ * Allows the host app to intercept and delay saving until async operations
879
+ * (e.g., images are loaded) complete.
880
+ *
881
+ * If Promise/AsyncGenerator is returned, a progress toast will be shown
882
+ * until the operation completes. Generator can yield progress updates.
883
+ */
884
+ onExport?: (
885
+ /** type of export. Currently we only call for JSON exports or
886
+ * JSON-embedded PNG (which is also identified as `json` type here)*/
887
+ type: "json", data: {
888
+ elements: readonly ExcalidrawElement[];
889
+ appState: AppState;
890
+ files: BinaryFiles;
891
+ }, options: {
892
+ /** signal that gets aborted if user cancels the export (e.g. closes
893
+ * the native file picker dialog). In that case, you can either
894
+ * return immediately, or throw AbortError.
895
+ */
896
+ signal: AbortSignal;
897
+ }) => MaybePromise<void> | AsyncGenerator<OnExportProgress, void>;
487
898
  }
488
899
  export type SceneData = {
489
- elements?: ImportedDataState["elements"];
900
+ /** Expects normalized elements; restore imported data before updating the scene. */
901
+ elements?: readonly ExcalidrawElement[] | null;
490
902
  appState?: ImportedDataState["appState"];
491
903
  collaborators?: Map<SocketId, Collaborator>;
492
904
  captureUpdate?: CaptureUpdateActionType;
@@ -496,12 +908,21 @@ export type ExportOpts = {
496
908
  onExportToBackend?: (exportedElements: readonly NonDeletedExcalidrawElement[], appState: UIAppState, files: BinaryFiles) => void;
497
909
  renderCustomUI?: (exportedElements: readonly NonDeletedExcalidrawElement[], appState: UIAppState, files: BinaryFiles, canvas: HTMLCanvasElement) => JSX.Element;
498
910
  };
911
+ export type ImageOptions = Partial<{
912
+ maxWidthOrHeight: number;
913
+ maxFileSizeBytes: number;
914
+ }>;
499
915
  export type CanvasActions = Partial<{
500
916
  changeViewBackgroundColor: boolean;
501
917
  clearCanvas: boolean;
502
918
  export: false | ExportOpts;
503
919
  loadScene: boolean;
504
920
  saveToActiveFile: boolean;
921
+ /**
922
+ * defaults to true if `props.theme` is omitted or `props.onThemeChange`
923
+ * is supplied (at which point the theme is considered as host-app controlled),
924
+ * else default to false
925
+ * */
505
926
  toggleTheme: boolean | null;
506
927
  saveAsImage: boolean;
507
928
  }>;
@@ -525,6 +946,7 @@ export type AppProps = Merge<ExcalidrawProps, {
525
946
  export: ExportOpts;
526
947
  };
527
948
  }>;
949
+ imageOptions: Required<ImageOptions>;
528
950
  detectScroll: boolean;
529
951
  handleKeyboardGlobally: boolean;
530
952
  isCollaborating: boolean;
@@ -536,6 +958,10 @@ export type AppProps = Merge<ExcalidrawProps, {
536
958
  export type AppClassProperties = {
537
959
  props: AppProps;
538
960
  state: AppState;
961
+ readonly ownerDocument: Document;
962
+ readonly ownerWindow: Window & typeof globalThis;
963
+ api: App["api"];
964
+ sessionExportThemeOverride: App["sessionExportThemeOverride"];
539
965
  interactiveCanvas: HTMLCanvasElement | null;
540
966
  /** static canvas */
541
967
  canvas: HTMLCanvasElement;
@@ -554,8 +980,7 @@ export type AppClassProperties = {
554
980
  id: App["id"];
555
981
  onInsertElements: App["onInsertElements"];
556
982
  onExportImage: App["onExportImage"];
557
- lastViewportPosition: App["lastViewportPosition"];
558
- scrollToContent: App["scrollToContent"];
983
+ viewport: App["viewport"];
559
984
  addFiles: App["addFiles"];
560
985
  addElementsFromPasteOrLibrary: App["addElementsFromPasteOrLibrary"];
561
986
  togglePenMode: App["togglePenMode"];
@@ -566,17 +991,34 @@ export type AppClassProperties = {
566
991
  onMagicframeToolSelect: App["onMagicframeToolSelect"];
567
992
  getName: App["getName"];
568
993
  dismissLinearEditor: App["dismissLinearEditor"];
569
- flowChartCreator: App["flowChartCreator"];
994
+ flowchart: App["flowchart"];
995
+ drawShape: App["drawShape"];
996
+ arrowText: App["arrowText"];
997
+ textTool: App["textTool"];
998
+ cursor: App["cursor"];
999
+ bucketFill: App["bucketFill"];
1000
+ duplicate: App["duplicate"];
1001
+ toolDrag: App["toolDrag"];
1002
+ activeResizeHandle: App["activeResizeHandle"];
1003
+ isToolLocked: App["isToolLocked"];
570
1004
  getEffectiveGridSize: App["getEffectiveGridSize"];
571
1005
  setPlugins: App["setPlugins"];
572
1006
  plugins: App["plugins"];
573
- getEditorUIOffsets: App["getEditorUIOffsets"];
574
1007
  visibleElements: App["visibleElements"];
575
1008
  excalidrawContainerValue: App["excalidrawContainerValue"];
576
1009
  onPointerUpEmitter: App["onPointerUpEmitter"];
577
1010
  updateEditorAtom: App["updateEditorAtom"];
578
1011
  onPointerDownEmitter: App["onPointerDownEmitter"];
1012
+ onEvent: App["onEvent"];
1013
+ onStateChange: App["onStateChange"];
1014
+ lastPointerMoveCoords: App["lastPointerMoveCoords"];
1015
+ lastPointerMoveEvent: App["lastPointerMoveEvent"];
579
1016
  bindModeHandler: App["bindModeHandler"];
1017
+ emitUserFollowIntent: App["emitUserFollowIntent"];
1018
+ requestUnfollow: App["requestUnfollow"];
1019
+ setAppState: App["setAppState"];
1020
+ isInteractionEnabled: App["isInteractionEnabled"];
1021
+ isNavigationEnabled: App["isNavigationEnabled"];
580
1022
  };
581
1023
  export type PointerDownState = Readonly<{
582
1024
  origin: Readonly<{
@@ -612,6 +1054,7 @@ export type PointerDownState = Readonly<{
612
1054
  wasAddedToSelection: boolean;
613
1055
  hasBeenDuplicated: boolean;
614
1056
  hasHitCommonBoundingBoxOfSelectedElements: boolean;
1057
+ arrowLabel: boolean;
615
1058
  };
616
1059
  withCmdOrCtrl: boolean;
617
1060
  drag: {
@@ -637,7 +1080,18 @@ export type PointerDownState = Readonly<{
637
1080
  };
638
1081
  }>;
639
1082
  export type UnsubscribeCallback = () => void;
1083
+ export type ExcalidrawMountPayload = {
1084
+ excalidrawAPI: ExcalidrawImperativeAPI;
1085
+ container: HTMLDivElement | null;
1086
+ };
1087
+ export type ExcalidrawImperativeAPIEventMap = {
1088
+ "editor:mount": [payload: ExcalidrawMountPayload];
1089
+ "editor:initialize": [api: ExcalidrawImperativeAPI];
1090
+ "editor:unmount": [];
1091
+ };
640
1092
  export interface ExcalidrawImperativeAPI {
1093
+ /** Whether the editor has been unmounted and the API is no longer usable. */
1094
+ isDestroyed: boolean;
641
1095
  updateScene: InstanceType<typeof App>["updateScene"];
642
1096
  applyDeltas: InstanceType<typeof App>["applyDeltas"];
643
1097
  mutateElement: InstanceType<typeof App>["mutateElement"];
@@ -652,15 +1106,32 @@ export interface ExcalidrawImperativeAPI {
652
1106
  getAppState: () => InstanceType<typeof App>["state"];
653
1107
  getFiles: () => InstanceType<typeof App>["files"];
654
1108
  getName: InstanceType<typeof App>["getName"];
655
- scrollToContent: InstanceType<typeof App>["scrollToContent"];
1109
+ setViewport: InstanceType<typeof App>["viewport"]["setViewport"];
1110
+ getViewportOffsets: InstanceType<typeof App>["viewport"]["getOffsets"];
1111
+ /**
1112
+ * Atomically replaces all transient visual overrides. Values are copied;
1113
+ * omitted IDs/fields use document values, except for inherited label offsets.
1114
+ * null clears the snapshot.
1115
+ * Repaints without document changes, history entries or onChange events;
1116
+ * an equivalent snapshot may still repaint (clearing an already clear
1117
+ * snapshot does not), so submit only when something changed.
1118
+ * Finite opacity is clamped to 0–100; non-finite values reject the snapshot.
1119
+ * Unknown/deleted IDs are ignored when rendering. Reset/unmount clears it.
1120
+ * Bound labels inherit their container's offset; offsets targeting them are
1121
+ * ignored. Label opacity remains independent. Target frame children explicitly.
1122
+ * Frame opacity still multiplies child opacity. Decorations follow their owner.
1123
+ * Exports and interactive geometry (hit tests, selection, editing) use document
1124
+ * values, including while authoring an animation preview in edit mode.
1125
+ */
1126
+ setElementRenderOverrides: InstanceType<typeof App>["setElementRenderOverrides"];
656
1127
  registerAction: (action: Action) => void;
657
1128
  refresh: InstanceType<typeof App>["refresh"];
658
1129
  setToast: InstanceType<typeof App>["setToast"];
659
1130
  addFiles: (data: BinaryFileData[]) => void;
660
1131
  id: string;
661
1132
  setActiveTool: InstanceType<typeof App>["setActiveTool"];
662
- setCursor: InstanceType<typeof App>["setCursor"];
663
- resetCursor: InstanceType<typeof App>["resetCursor"];
1133
+ setCursor: InstanceType<typeof App>["cursor"]["set"];
1134
+ resetCursor: InstanceType<typeof App>["cursor"]["reset"];
664
1135
  toggleSidebar: InstanceType<typeof App>["toggleSidebar"];
665
1136
  getEditorInterface: () => EditorInterface;
666
1137
  /**
@@ -675,13 +1146,14 @@ export interface ExcalidrawImperativeAPI {
675
1146
  onPointerUp: (callback: (activeTool: AppState["activeTool"], pointerDownState: PointerDownState, event: PointerEvent) => void) => UnsubscribeCallback;
676
1147
  onScrollChange: (callback: (scrollX: number, scrollY: number, zoom: Zoom) => void) => UnsubscribeCallback;
677
1148
  onUserFollow: (callback: (payload: OnUserFollowedPayload) => void) => UnsubscribeCallback;
1149
+ onStateChange: InstanceType<typeof App>["onStateChange"];
1150
+ onEvent: InstanceType<typeof App>["onEvent"];
678
1151
  }
679
1152
  export type FrameNameBounds = {
680
1153
  x: number;
681
1154
  y: number;
682
1155
  width: number;
683
1156
  height: number;
684
- angle: number;
685
1157
  };
686
1158
  export type FrameNameBoundsCache = {
687
1159
  get: (frameElement: ExcalidrawFrameLikeElement | ExcalidrawMagicFrameElement) => FrameNameBounds | null;
@@ -700,12 +1172,18 @@ export type Primitive = number | string | boolean | bigint | symbol | null | und
700
1172
  export type JSONValue = string | number | boolean | null | object;
701
1173
  export type EmbedsValidationStatus = Map<ExcalidrawIframeLikeElement["id"], boolean>;
702
1174
  export type ElementsPendingErasure = Set<ExcalidrawElement["id"]>;
703
- export type PendingExcalidrawElements = ExcalidrawElement[];
1175
+ export type PendingExcalidrawElements = NonDeletedExcalidrawElement[];
704
1176
  /** Runtime gridSize value. Null indicates disabled grid. */
705
1177
  export type NullableGridSize = (AppState["gridSize"] & MakeBrand<"NullableGridSize">) | null;
706
1178
  export type GenerateDiagramToCode = (props: {
707
- frame: ExcalidrawMagicFrameElement;
708
- children: readonly ExcalidrawElement[];
1179
+ frame: NonDeleted<ExcalidrawMagicFrameElement>;
1180
+ children: readonly NonDeletedExcalidrawElement[];
1181
+ /**
1182
+ * Optional streaming hook. Call with the accumulated response text as it
1183
+ * streams in so the editor can progressively render the partial HTML
1184
+ * inside the generated frame.
1185
+ */
1186
+ onPartial?: (html: string) => void;
709
1187
  }) => MaybePromise<{
710
1188
  html: string;
711
1189
  }>;
@@ -715,4 +1193,103 @@ export type Offsets = Partial<{
715
1193
  bottom: number;
716
1194
  left: number;
717
1195
  }>;
718
- export {};
1196
+ /**
1197
+ * Value of the `data-viewport-ui` attribute, marking a DOM node as a UI
1198
+ * surface that occludes the canvas. Such nodes are measured by
1199
+ * `getViewportOffsets` to compute the default per-side viewport offsets:
1200
+ *
1201
+ * - `top` / `bottom` — offsets that side by the node's bottom/top edge
1202
+ * - `side` — a panel hugging the left or right edge. Which side is not
1203
+ * declared but resolved geometrically: if the node's horizontal center
1204
+ * lies in the left half of the viewport it counts against the left
1205
+ * offset (by its right edge), otherwise against the right offset (by
1206
+ * `viewportWidth - left edge`). Measuring the rendered position instead
1207
+ * of declaring a side means RTL layouts and host-configurable docking
1208
+ * (e.g. sidebar side) are handled for free — but it assumes the surface
1209
+ * actually hugs one edge; don't mark a centered/near-full-width node as
1210
+ * `side` (its midpoint would classify it to one side and the offset
1211
+ * would swallow most of the viewport).
1212
+ *
1213
+ * The attribute should only be present while the surface is actually
1214
+ * rendered — omit it (don't just hide the node) when the surface shouldn't
1215
+ * push the viewport around.
1216
+ */
1217
+ export type ViewportUIDock = "top" | "bottom" | "side";
1218
+ /**
1219
+ * Options for `getViewportOffsets` (and the `ui` key of
1220
+ * {@link ViewportOffsets}), controlling how offsets are derived from the
1221
+ * currently rendered editor UI.
1222
+ *
1223
+ * NOTE unlike the physical sides of {@link Offsets}, the horizontal values
1224
+ * here are logical, i.e. flipped in RTL layouts (`left` refers to the
1225
+ * reading-direction start side).
1226
+ */
1227
+ export type ViewportOffsetsOptions = {
1228
+ /** padding added to each measured side (default 24) */
1229
+ padding?: number;
1230
+ paddingTop?: number;
1231
+ paddingRight?: number;
1232
+ paddingBottom?: number;
1233
+ paddingLeft?: number;
1234
+ /** final value for the given side, replacing the measured UI size
1235
+ * (padding is not added on top) */
1236
+ top?: number;
1237
+ bottom?: number;
1238
+ left?: number;
1239
+ right?: number;
1240
+ /**
1241
+ * Reserve space for the given conditionally-rendered surfaces even while
1242
+ * they're hidden, so the resulting offsets don't shift when they
1243
+ * (dis)appear. Uses the surface's last-measured footprint, falling back
1244
+ * to an approximate default if it hasn't been rendered yet. Ignored on
1245
+ * phones (where these surfaces never occlude the canvas).
1246
+ */
1247
+ reserve?: {
1248
+ /** styles panel (rendered when a tool or selection is active) */
1249
+ stylesPanel?: boolean;
1250
+ /** sidebar (e.g. library) */
1251
+ sidebar?: boolean;
1252
+ };
1253
+ };
1254
+ /**
1255
+ * Viewport offsets accepted by the `setViewport`-family APIs (`setViewport`,
1256
+ * `props.initialState.viewport`), insetting the usable viewport area per
1257
+ * side so the target isn't fitted/centered underneath overlaid UI.
1258
+ *
1259
+ * Two (combinable) ways to specify:
1260
+ *
1261
+ * - **Static sides** (`top`/`right`/`bottom`/`left`) — absolute pixel
1262
+ * values, used as-is: physical (not flipped in RTL), zoom-independent,
1263
+ * no padding added. Sides not specified default to `0` (unless `ui` is
1264
+ * set, see below).
1265
+ *
1266
+ * - **`ui`** — derive the offsets from the editor UI (toolbar, styles
1267
+ * panel, sidebar...) as rendered at the time the viewport is set,
1268
+ * equivalent to calling `getViewportOffsets()`. Pass `true` for the
1269
+ * defaults, or options ({@link ViewportOffsetsOptions}) to customize
1270
+ * padding or reserve space for currently-hidden surfaces.
1271
+ *
1272
+ * When both are given, a static side always wins for that side — it
1273
+ * replaces whatever `ui` would yield (including `ui`'s own side overrides,
1274
+ * which — unlike the physical static sides — are RTL-relative). The
1275
+ * remaining sides fall back to the `ui`-derived values.
1276
+ *
1277
+ * @example
1278
+ * { top: 40 } // top 40px, other sides 0
1279
+ * { ui: true } // measured UI + default padding
1280
+ * { ui: { reserve: { stylesPanel: true } } } // + keep space for hidden panel
1281
+ * { top: 40, ui: true } // top exactly 40px, rest from UI
1282
+ */
1283
+ export type ViewportOffsets = Offsets & {
1284
+ ui?: true | ViewportOffsetsOptions;
1285
+ };
1286
+ /**
1287
+ * Value of the `data-viewport-ui-name` attribute, identifying a
1288
+ * conditionally-rendered surface (marked with `data-viewport-ui`) so that
1289
+ * it can be measured on its own, and so that `getViewportOffsets` can
1290
+ * reserve space for it while it's hidden (see the `reserve` option).
1291
+ * Whenever a named surface is rendered, its measured footprint is
1292
+ * remembered; reserving uses that remembered footprint, or an approximate
1293
+ * default if the surface hasn't been rendered yet.
1294
+ */
1295
+ export type ViewportUIName = "sidebar" | "stylesPanel" | "stats";