@excalidraw/math 0.18.0-b7aac689a → 0.18.0-c0ad61c

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 (355) hide show
  1. package/dist/dev/index.js +355 -161
  2. package/dist/dev/index.js.map +4 -4
  3. package/dist/prod/index.js +1 -1
  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/bounds.d.ts +10 -0
  7. package/dist/types/common/src/colors.d.ts +81 -39
  8. package/dist/types/common/src/constants.d.ts +94 -33
  9. package/dist/types/common/src/editorInterface.d.ts +34 -0
  10. package/dist/types/common/src/font-metadata.d.ts +1 -3
  11. package/dist/types/common/src/index.d.ts +5 -0
  12. package/dist/types/common/src/keys.d.ts +5 -1
  13. package/dist/types/common/src/points.d.ts +1 -1
  14. package/dist/types/common/src/random.d.ts +7 -0
  15. package/dist/types/common/src/utility-types.d.ts +0 -1
  16. package/dist/types/common/src/utils.d.ts +47 -77
  17. package/dist/types/common/src/versionedSnapshotStore.d.ts +17 -0
  18. package/dist/types/element/src/Scene.d.ts +18 -10
  19. package/dist/types/element/src/align.d.ts +3 -2
  20. package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
  21. package/dist/types/element/src/arrowheads.d.ts +3 -0
  22. package/dist/types/element/src/arrows/focus.d.ts +30 -0
  23. package/dist/types/element/src/arrows/helpers.d.ts +5 -0
  24. package/dist/types/element/src/binding.d.ts +79 -51
  25. package/dist/types/element/src/bounds.d.ts +26 -19
  26. package/dist/types/element/src/bucketFill.d.ts +110 -0
  27. package/dist/types/element/src/collision.d.ts +7 -2
  28. package/dist/types/element/src/comparisons.d.ts +10 -7
  29. package/dist/types/element/src/convertToShape.d.ts +23 -0
  30. package/dist/types/element/src/delta.d.ts +39 -5
  31. package/dist/types/element/src/distribute.d.ts +4 -2
  32. package/dist/types/element/src/dragElements.d.ts +30 -3
  33. package/dist/types/element/src/duplicate.d.ts +7 -6
  34. package/dist/types/element/src/elbowArrow.d.ts +2 -0
  35. package/dist/types/element/src/embeddable.d.ts +2 -2
  36. package/dist/types/element/src/flowchart.d.ts +11 -7
  37. package/dist/types/element/src/fractionalIndex.d.ts +4 -4
  38. package/dist/types/element/src/frame.d.ts +16 -11
  39. package/dist/types/element/src/groups.d.ts +9 -8
  40. package/dist/types/element/src/heading.d.ts +2 -1
  41. package/dist/types/element/src/image.d.ts +1 -11
  42. package/dist/types/element/src/index.d.ts +10 -4
  43. package/dist/types/element/src/linearElementEditor.d.ts +50 -31
  44. package/dist/types/element/src/mutateElement.d.ts +6 -2
  45. package/dist/types/element/src/newElement.d.ts +44 -8
  46. package/dist/types/element/src/positionElementsOnGrid.d.ts +2 -0
  47. package/dist/types/element/src/renderElement.d.ts +23 -12
  48. package/dist/types/element/src/resizeElements.d.ts +12 -12
  49. package/dist/types/element/src/resizeTest.d.ts +6 -5
  50. package/dist/types/element/src/selection.d.ts +14 -14
  51. package/dist/types/element/src/shape.d.ts +21 -8
  52. package/dist/types/element/src/sizeHelpers.d.ts +6 -0
  53. package/dist/types/element/src/sortElements.d.ts +10 -0
  54. package/dist/types/element/src/stickyNote.d.ts +183 -0
  55. package/dist/types/element/src/store.d.ts +6 -1
  56. package/dist/types/element/src/textElement.d.ts +15 -11
  57. package/dist/types/element/src/textMeasurements.d.ts +1 -3
  58. package/dist/types/element/src/textWrapping.d.ts +26 -0
  59. package/dist/types/{excalidraw/data → element/src}/transform.d.ts +27 -8
  60. package/dist/types/element/src/transformHandles.d.ts +8 -27
  61. package/dist/types/element/src/typeChecks.d.ts +30 -31
  62. package/dist/types/element/src/types.d.ts +55 -20
  63. package/dist/types/element/src/utils.d.ts +15 -6
  64. package/dist/types/element/src/zindex.d.ts +7 -1
  65. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +221 -222
  66. package/dist/types/excalidraw/actions/actionAlign.d.ts +12 -13
  67. package/dist/types/excalidraw/actions/actionBoundText.d.ts +132 -133
  68. package/dist/types/excalidraw/actions/actionCanvas.d.ts +481 -1576
  69. package/dist/types/excalidraw/actions/actionClipboard.d.ts +159 -904
  70. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +64 -65
  71. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +210 -214
  72. package/dist/types/excalidraw/actions/actionDeselect.d.ts +170 -0
  73. package/dist/types/excalidraw/actions/actionDistribute.d.ts +4 -6
  74. package/dist/types/excalidraw/actions/actionDuplicateSelection.d.ts +3 -4
  75. package/dist/types/excalidraw/actions/actionElementLink.d.ts +71 -78
  76. package/dist/types/excalidraw/actions/actionElementLock.d.ts +131 -132
  77. package/dist/types/excalidraw/actions/actionExport.d.ts +210 -1423
  78. package/dist/types/excalidraw/actions/actionFinalize.d.ts +11 -395
  79. package/dist/types/excalidraw/actions/actionFlip.d.ts +2 -3
  80. package/dist/types/excalidraw/actions/actionFrame.d.ts +333 -508
  81. package/dist/types/excalidraw/actions/actionGroup.d.ts +142 -151
  82. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +235 -191
  83. package/dist/types/excalidraw/actions/actionLink.d.ts +77 -78
  84. package/dist/types/excalidraw/actions/actionMenu.d.ts +66 -441
  85. package/dist/types/excalidraw/actions/actionNavigate.d.ts +18 -361
  86. package/dist/types/excalidraw/actions/actionProperties.d.ts +220 -2548
  87. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +71 -76
  88. package/dist/types/excalidraw/actions/actionStyles.d.ts +65 -65
  89. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +4 -4
  90. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +186 -0
  91. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +79 -81
  92. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +186 -0
  93. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +78 -79
  94. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +67 -75
  95. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +2 -2
  96. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +77 -78
  97. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +78 -79
  98. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +78 -79
  99. package/dist/types/excalidraw/actions/actionZindex.d.ts +8 -9
  100. package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
  101. package/dist/types/excalidraw/actions/index.d.ts +5 -3
  102. package/dist/types/excalidraw/actions/manager.d.ts +1 -0
  103. package/dist/types/excalidraw/actions/register.d.ts +2 -2
  104. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  105. package/dist/types/excalidraw/actions/types.d.ts +11 -7
  106. package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
  107. package/dist/types/excalidraw/appState.d.ts +55 -26
  108. package/dist/types/excalidraw/charts/charts.bar.d.ts +2 -0
  109. package/dist/types/excalidraw/charts/charts.constants.d.ts +48 -0
  110. package/dist/types/excalidraw/charts/charts.helpers.d.ts +32 -0
  111. package/dist/types/excalidraw/charts/charts.line.d.ts +2 -0
  112. package/dist/types/excalidraw/charts/charts.parse.d.ts +10 -0
  113. package/dist/types/excalidraw/charts/charts.radar.d.ts +2 -0
  114. package/dist/types/excalidraw/charts/charts.types.d.ts +18 -0
  115. package/dist/types/excalidraw/charts/index.d.ts +7 -0
  116. package/dist/types/excalidraw/clipboard.d.ts +57 -19
  117. package/dist/types/excalidraw/components/Actions.d.ts +32 -14
  118. package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
  119. package/dist/types/excalidraw/components/App.arrowText.d.ts +104 -0
  120. package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
  121. package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
  122. package/dist/types/excalidraw/components/App.d.ts +579 -132
  123. package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
  124. package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
  125. package/dist/types/excalidraw/components/App.pan.d.ts +54 -0
  126. package/dist/types/excalidraw/components/App.toolDrag.d.ts +63 -0
  127. package/dist/types/excalidraw/components/App.viewport.d.ts +73 -0
  128. package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
  129. package/dist/types/excalidraw/components/AppStateObserver.d.ts +37 -0
  130. package/dist/types/excalidraw/components/Card.d.ts +1 -3
  131. package/dist/types/excalidraw/components/ColorPicker/ColorInput.d.ts +2 -4
  132. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -4
  133. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
  134. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +5 -1
  135. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +10 -2
  136. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +5 -2
  137. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
  138. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -2
  139. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -2
  140. package/dist/types/excalidraw/components/ColorPicker/topPicksDnD.d.ts +31 -0
  141. package/dist/types/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -0
  142. package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
  143. package/dist/types/excalidraw/components/CommandPalette/types.d.ts +2 -4
  144. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +4 -4
  145. package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
  146. package/dist/types/excalidraw/components/DarkModeToggle.d.ts +1 -1
  147. package/dist/types/excalidraw/components/DefaultSidebar.d.ts +9 -13
  148. package/dist/types/excalidraw/components/ElementLinkDialog.d.ts +1 -1
  149. package/dist/types/excalidraw/components/Ellipsify.d.ts +3 -0
  150. package/dist/types/excalidraw/components/ErrorDialog.d.ts +1 -1
  151. package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -2
  152. package/dist/types/excalidraw/components/FilledButton.d.ts +2 -1
  153. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +2 -1
  154. package/dist/types/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +3 -1
  155. package/dist/types/excalidraw/components/FontPicker/keyboardNavHandlers.d.ts +0 -1
  156. package/dist/types/excalidraw/components/HelpDialog.d.ts +1 -1
  157. package/dist/types/excalidraw/components/HintViewer.d.ts +4 -3
  158. package/dist/types/excalidraw/components/IconButton.d.ts +48 -0
  159. package/dist/types/excalidraw/components/IconPicker.d.ts +14 -9
  160. package/dist/types/excalidraw/components/InlineIcon.d.ts +3 -1
  161. package/dist/types/excalidraw/components/Island.d.ts +7 -0
  162. package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
  163. package/dist/types/excalidraw/components/LayerUI.d.ts +6 -2
  164. package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
  165. package/dist/types/excalidraw/components/LibraryMenuControlButtons.d.ts +1 -1
  166. package/dist/types/excalidraw/components/LibraryMenuHeaderContent.d.ts +1 -2
  167. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +1 -1
  168. package/dist/types/excalidraw/components/LibraryUnit.d.ts +2 -3
  169. package/dist/types/excalidraw/components/LoadingMessage.d.ts +0 -1
  170. package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
  171. package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
  172. package/dist/types/excalidraw/components/MobileMenu.d.ts +5 -7
  173. package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
  174. package/dist/types/excalidraw/components/Modal.d.ts +0 -1
  175. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirm.d.ts +1 -1
  176. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  177. package/dist/types/excalidraw/components/PasteChartDialog.d.ts +4 -5
  178. package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
  179. package/dist/types/excalidraw/components/Popover.d.ts +2 -3
  180. package/dist/types/excalidraw/components/PropertiesPopover.d.ts +2 -1
  181. package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
  182. package/dist/types/excalidraw/components/RadioGroup.d.ts +0 -1
  183. package/dist/types/excalidraw/components/RadioSelection.d.ts +4 -4
  184. package/dist/types/excalidraw/components/Range.d.ts +10 -4
  185. package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
  186. package/dist/types/excalidraw/components/ScrollableList.d.ts +0 -1
  187. package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
  188. package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +16 -22
  189. package/dist/types/excalidraw/components/Sidebar/SidebarHeader.d.ts +1 -1
  190. package/dist/types/excalidraw/components/Sidebar/SidebarTab.d.ts +1 -2
  191. package/dist/types/excalidraw/components/Sidebar/SidebarTabTrigger.d.ts +1 -2
  192. package/dist/types/excalidraw/components/Sidebar/SidebarTabTriggers.d.ts +1 -2
  193. package/dist/types/excalidraw/components/Sidebar/SidebarTabs.d.ts +1 -2
  194. package/dist/types/excalidraw/components/Spinner.d.ts +4 -4
  195. package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
  196. package/dist/types/excalidraw/components/Stats/CanvasGrid.d.ts +0 -1
  197. package/dist/types/excalidraw/components/Stats/Collapsible.d.ts +0 -1
  198. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
  199. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -3
  200. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
  201. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
  202. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
  203. package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
  204. package/dist/types/excalidraw/components/Stats/index.d.ts +7 -8
  205. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  206. package/dist/types/excalidraw/components/TTDDialog/Chat/ChatHistoryMenu.d.ts +15 -0
  207. package/dist/types/excalidraw/components/TTDDialog/Chat/ChatInterface.d.ts +23 -0
  208. package/dist/types/excalidraw/components/TTDDialog/Chat/ChatMessage.d.ts +14 -0
  209. package/dist/types/excalidraw/components/TTDDialog/Chat/TTDChatPanel.d.ts +27 -0
  210. package/dist/types/excalidraw/components/TTDDialog/Chat/index.d.ts +3 -0
  211. package/dist/types/excalidraw/components/TTDDialog/Chat/useChatAgent.d.ts +8 -0
  212. package/dist/types/excalidraw/components/TTDDialog/CodeMirrorEditor.d.ts +11 -0
  213. package/dist/types/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +3 -2
  214. package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +13 -0
  215. package/dist/types/excalidraw/components/TTDDialog/TTDDialog.d.ts +12 -29
  216. package/dist/types/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +3 -3
  217. package/dist/types/excalidraw/components/TTDDialog/TTDDialogOutput.d.ts +5 -2
  218. package/dist/types/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +13 -9
  219. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTab.d.ts +1 -2
  220. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTabTrigger.d.ts +1 -2
  221. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTabTriggers.d.ts +1 -2
  222. package/dist/types/excalidraw/components/TTDDialog/TTDPreviewPanel.d.ts +9 -0
  223. package/dist/types/excalidraw/components/TTDDialog/TTDWelcomeMessage.d.ts +1 -0
  224. package/dist/types/excalidraw/components/TTDDialog/TextToDiagram.d.ts +9 -0
  225. package/dist/types/excalidraw/components/TTDDialog/common.d.ts +16 -16
  226. package/dist/types/excalidraw/components/TTDDialog/hooks/useChatManagement.d.ts +13 -0
  227. package/dist/types/excalidraw/components/TTDDialog/hooks/useMermaidRenderer.d.ts +14 -0
  228. package/dist/types/excalidraw/components/TTDDialog/hooks/useTextGeneration.d.ts +7 -0
  229. package/dist/types/excalidraw/components/TTDDialog/mermaid-lang-lite.d.ts +2 -0
  230. package/dist/types/excalidraw/components/TTDDialog/types.d.ts +95 -0
  231. package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +22 -0
  232. package/dist/types/excalidraw/components/TTDDialog/utils/chat.d.ts +10 -0
  233. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidAutoFix.d.ts +1 -0
  234. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidError.d.ts +10 -0
  235. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidValidation.d.ts +1 -0
  236. package/dist/types/excalidraw/components/TextField.d.ts +1 -0
  237. package/dist/types/excalidraw/components/Toast.d.ts +11 -7
  238. package/dist/types/excalidraw/components/ToolPopover.d.ts +22 -0
  239. package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
  240. package/dist/types/excalidraw/components/Tools.d.ts +151 -0
  241. package/dist/types/excalidraw/components/Trans.d.ts +2 -2
  242. package/dist/types/excalidraw/components/UserList.d.ts +3 -2
  243. package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
  244. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +10 -4
  245. package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +3 -0
  246. package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  247. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +47 -35
  248. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuContent.d.ts +7 -5
  249. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuGroup.d.ts +3 -3
  250. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItem.d.ts +13 -22
  251. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemCheckbox.d.ts +5 -0
  252. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContent.d.ts +5 -4
  253. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -2
  254. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemCustom.d.ts +2 -2
  255. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemLink.d.ts +6 -6
  256. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSub.d.ts +23 -0
  257. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSubContent.d.ts +8 -0
  258. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSubTrigger.d.ts +12 -0
  259. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuTrigger.d.ts +3 -4
  260. package/dist/types/excalidraw/components/dropdownMenu/common.d.ts +2 -2
  261. package/dist/types/excalidraw/components/dropdownMenu/dropdownMenuUtils.d.ts +2 -0
  262. package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
  263. package/dist/types/excalidraw/components/hoc/withInternalFallback.d.ts +1 -1
  264. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  265. package/dist/types/excalidraw/components/icons.d.ts +56 -22
  266. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +25 -3
  267. package/dist/types/excalidraw/components/main-menu/MainMenu.d.ts +39 -35
  268. package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
  269. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
  270. package/dist/types/excalidraw/data/blob.d.ts +355 -12
  271. package/dist/types/excalidraw/data/encode.d.ts +4 -4
  272. package/dist/types/excalidraw/data/encryption.d.ts +5 -5
  273. package/dist/types/excalidraw/data/filesystem.d.ts +5 -7
  274. package/dist/types/excalidraw/data/index.d.ts +8 -9
  275. package/dist/types/excalidraw/data/json.d.ts +183 -3
  276. package/dist/types/excalidraw/data/library.d.ts +25 -10
  277. package/dist/types/excalidraw/data/resave.d.ts +7 -2
  278. package/dist/types/excalidraw/data/restore.d.ts +27 -7
  279. package/dist/types/excalidraw/data/types.d.ts +4 -1
  280. package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
  281. package/dist/types/excalidraw/editor-jotai.d.ts +11 -11
  282. package/dist/types/excalidraw/eraser/index.d.ts +2 -3
  283. package/dist/types/excalidraw/errors.d.ts +14 -0
  284. package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
  285. package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
  286. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +2 -2
  287. package/dist/types/excalidraw/hooks/useOutsideClick.d.ts +4 -3
  288. package/dist/types/excalidraw/hooks/useScrollPosition.d.ts +1 -2
  289. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +14 -0
  290. package/dist/types/excalidraw/i18n.d.ts +2 -2
  291. package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
  292. package/dist/types/excalidraw/lasso/index.d.ts +2 -3
  293. package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
  294. package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
  295. package/dist/types/excalidraw/renderer/animation.d.ts +16 -0
  296. package/dist/types/excalidraw/renderer/helpers.d.ts +31 -8
  297. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +7 -15
  298. package/dist/types/excalidraw/renderer/staticScene.d.ts +4 -1
  299. package/dist/types/excalidraw/scene/Renderer.d.ts +491 -19
  300. package/dist/types/excalidraw/scene/export.d.ts +4 -4
  301. package/dist/types/excalidraw/scene/index.d.ts +2 -2
  302. package/dist/types/excalidraw/scene/types.d.ts +28 -8
  303. package/dist/types/excalidraw/shortcut.d.ts +1 -0
  304. package/dist/types/excalidraw/snapping.d.ts +12 -12
  305. package/dist/types/excalidraw/subset/harfbuzz/harfbuzz-bindings.d.ts +1 -1
  306. package/dist/types/excalidraw/subset/harfbuzz/harfbuzz-loader.d.ts +1 -1
  307. package/dist/types/excalidraw/subset/harfbuzz/harfbuzz-wasm.d.ts +1 -1
  308. package/dist/types/excalidraw/subset/woff2/woff2-loader.d.ts +2 -2
  309. package/dist/types/excalidraw/subset/woff2/woff2-wasm.d.ts +1 -1
  310. package/dist/types/excalidraw/textAutoResizeHandle.d.ts +15 -0
  311. package/dist/types/excalidraw/types.d.ts +611 -59
  312. package/dist/types/excalidraw/viewport.d.ts +280 -0
  313. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +8 -5
  314. package/dist/types/fractional-indexing/src/index.d.ts +29 -0
  315. package/dist/types/laser-pointer/src/index.d.ts +2 -0
  316. package/dist/types/laser-pointer/src/math.d.ts +16 -0
  317. package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
  318. package/dist/types/laser-pointer/src/state.d.ts +36 -0
  319. package/dist/types/math/src/constants.d.ts +0 -1
  320. package/dist/types/math/src/curve.d.ts +23 -13
  321. package/dist/types/math/src/index.d.ts +1 -0
  322. package/dist/types/math/src/pca.d.ts +79 -0
  323. package/dist/types/math/src/point.d.ts +8 -2
  324. package/dist/types/math/src/polygon.d.ts +26 -2
  325. package/dist/types/math/src/range.d.ts +1 -3
  326. package/dist/types/math/src/segment.d.ts +10 -3
  327. package/dist/types/math/src/types.d.ts +25 -1
  328. package/dist/types/utils/src/export.d.ts +9 -8
  329. package/dist/types/utils/src/index.d.ts +1 -2
  330. package/dist/types/utils/src/shape.d.ts +8 -8
  331. package/package.json +2 -2
  332. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +0 -186
  333. package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
  334. package/dist/types/excalidraw/charts.d.ts +0 -27
  335. package/dist/types/excalidraw/components/DiagramToCodePlugin/DiagramToCodePlugin.d.ts +0 -4
  336. package/dist/types/excalidraw/components/ExcalidrawLogo.d.ts +0 -16
  337. package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
  338. package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
  339. package/dist/types/excalidraw/components/InitializeApp.d.ts +0 -10
  340. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +0 -9
  341. package/dist/types/excalidraw/components/ToolButton.d.ts +0 -49
  342. package/dist/types/excalidraw/components/footer/FooterCenter.d.ts +0 -8
  343. package/dist/types/excalidraw/components/live-collaboration/LiveCollaborationTrigger.d.ts +0 -10
  344. package/dist/types/excalidraw/components/shapes.d.ts +0 -62
  345. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.Center.d.ts +0 -58
  346. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.Hints.d.ts +0 -19
  347. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.d.ts +0 -85
  348. package/dist/types/excalidraw/cursor.d.ts +0 -5
  349. package/dist/types/excalidraw/data/reconcile.d.ts +0 -6
  350. package/dist/types/excalidraw/index.d.ts +0 -46
  351. package/dist/types/excalidraw/polyfill.d.ts +0 -2
  352. package/dist/types/excalidraw/scene/scroll.d.ts +0 -23
  353. package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
  354. package/dist/types/utils/src/bbox.d.ts +0 -9
  355. package/dist/types/utils/src/withinBounds.d.ts +0 -19
@@ -1,23 +1,24 @@
1
- import type { IMAGE_MIME_TYPES, UserIdleState, throttleRAF, MIME_TYPES } from "@excalidraw/common";
2
- import type { SuggestedBinding } from "@excalidraw/element";
1
+ import type { IMAGE_MIME_TYPES, UserIdleState, throttleRAF, MIME_TYPES, EditorInterface, StrokeWidthKey } from "@excalidraw/common";
3
2
  import type { LinearElementEditor } from "@excalidraw/element";
4
3
  import type { MaybeTransformHandleType } from "@excalidraw/element";
5
- import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, Arrowhead, ChartType, FontFamilyValues, FileId, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement } 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";
6
5
  import type { Merge, MaybePromise, ValueOf, MakeBrand } from "@excalidraw/common/utility-types";
7
6
  import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement } from "@excalidraw/element";
7
+ import type { GlobalPoint } from "@excalidraw/math";
8
8
  import type { Action } from "./actions/types";
9
9
  import type { Spreadsheet } from "./charts";
10
10
  import type { ClipboardData } from "./clipboard";
11
11
  import type App from "./components/App";
12
12
  import type Library from "./data/library";
13
- import type { FileSystemHandle } from "./data/filesystem";
14
13
  import type { ContextMenuItems } from "./components/ContextMenu";
15
14
  import type { SnapLine } from "./snapping";
16
15
  import type { ImportedDataState } from "./data/types";
16
+ import type { SetViewportOptions } from "./viewport";
17
17
  import type { Language } from "./i18n";
18
18
  import type { isOverScrollBars } from "./scene/scrollbars";
19
19
  import type React from "react";
20
20
  import type { JSX } from "react";
21
+ export type { App };
21
22
  export type SocketId = string & {
22
23
  _brand: "SocketId";
23
24
  };
@@ -84,7 +85,7 @@ export type BinaryFileData = {
84
85
  };
85
86
  export type BinaryFileMetadata = Omit<BinaryFileData, "dataURL">;
86
87
  export type BinaryFiles = Record<ExcalidrawElement["id"], BinaryFileData>;
87
- 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";
88
89
  export type ElementOrToolType = ExcalidrawElementType | ToolType | "custom";
89
90
  export type ActiveTool = {
90
91
  type: ToolType;
@@ -125,17 +126,22 @@ export type StaticCanvasAppState = Readonly<_CommonCanvasAppState & {
125
126
  frameRendering: AppState["frameRendering"];
126
127
  currentHoveredFontFamily: AppState["currentHoveredFontFamily"];
127
128
  hoveredElementIds: AppState["hoveredElementIds"];
129
+ suggestedBinding: AppState["suggestedBinding"];
128
130
  croppingElementId: AppState["croppingElementId"];
129
131
  }>;
130
132
  export type InteractiveCanvasAppState = Readonly<_CommonCanvasAppState & {
133
+ activeTool: AppState["activeTool"];
131
134
  activeEmbeddable: AppState["activeEmbeddable"];
132
- editingLinearElement: AppState["editingLinearElement"];
133
135
  selectionElement: AppState["selectionElement"];
134
136
  selectedGroupIds: AppState["selectedGroupIds"];
135
137
  selectedLinearElement: AppState["selectedLinearElement"];
136
138
  multiElement: AppState["multiElement"];
139
+ newElement: AppState["newElement"];
137
140
  isBindingEnabled: AppState["isBindingEnabled"];
138
- suggestedBindings: AppState["suggestedBindings"];
141
+ isMidpointSnappingEnabled: AppState["isMidpointSnappingEnabled"];
142
+ gridModeEnabled: AppState["gridModeEnabled"];
143
+ suggestedBinding: AppState["suggestedBinding"];
144
+ hoveredArrowTextAnchor: AppState["hoveredArrowTextAnchor"];
139
145
  isRotating: AppState["isRotating"];
140
146
  elementsToHighlight: AppState["elementsToHighlight"];
141
147
  collaborators: AppState["collaborators"];
@@ -146,6 +152,11 @@ export type InteractiveCanvasAppState = Readonly<_CommonCanvasAppState & {
146
152
  croppingElementId: AppState["croppingElementId"];
147
153
  searchMatches: AppState["searchMatches"];
148
154
  activeLockedId: AppState["activeLockedId"];
155
+ hoveredElementIds: AppState["hoveredElementIds"];
156
+ frameRendering: AppState["frameRendering"];
157
+ shouldCacheIgnoreZoom: AppState["shouldCacheIgnoreZoom"];
158
+ exportScale: AppState["exportScale"];
159
+ currentItemArrowType: AppState["currentItemArrowType"];
149
160
  }>;
150
161
  export type ObservedAppState = ObservedStandaloneAppState & ObservedElementsAppState;
151
162
  export type ObservedStandaloneAppState = {
@@ -156,12 +167,55 @@ export type ObservedElementsAppState = {
156
167
  editingGroupId: AppState["editingGroupId"];
157
168
  selectedElementIds: AppState["selectedElementIds"];
158
169
  selectedGroupIds: AppState["selectedGroupIds"];
159
- editingLinearElementId: LinearElementEditor["elementId"] | null;
160
- selectedLinearElementId: LinearElementEditor["elementId"] | null;
170
+ selectedLinearElement: {
171
+ elementId: LinearElementEditor["elementId"];
172
+ isEditing: boolean;
173
+ } | null;
161
174
  croppingElementId: AppState["croppingElementId"];
162
175
  lockedMultiSelections: AppState["lockedMultiSelections"];
163
176
  activeLockedId: AppState["activeLockedId"];
164
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
+ };
165
219
  export interface AppState {
166
220
  contextMenu: {
167
221
  items: ContextMenuItems;
@@ -195,9 +249,42 @@ export interface AppState {
195
249
  * - set on pointer down, updated during pointer move
196
250
  */
197
251
  selectionElement: NonDeletedExcalidrawElement | null;
252
+ /**
253
+ * tracking current arrow binding editor state (takes into account
254
+ * `bindingPreference` and keyboard modifiers (ctrl/alt)
255
+ */
198
256
  isBindingEnabled: boolean;
199
- startBoundElement: NonDeleted<ExcalidrawBindableElement> | null;
200
- suggestedBindings: SuggestedBinding[];
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
+ /**
264
+ * user preference for what the wheel does: with a `trackpad` a plain wheel
265
+ * pans; with a `mouse` a plain wheel zooms. Ctrl/cmd+wheel (how a pinch is
266
+ * delivered) zooms with either device. Shift+wheel pans horizontally;
267
+ * ctrl/cmd+shift+wheel pans vertically. `auto` resolves to `trackpad` until
268
+ * device detection exists — see `resolveInputDevice`
269
+ */
270
+ inputDevice: InputDevice;
271
+ /**
272
+ * The bindable element the UI highlights for the user when an arrow is
273
+ * dragged or otherwise its endpoint being close to said element.
274
+ */
275
+ suggestedBinding: {
276
+ element: NonDeleted<ExcalidrawBindableElement>;
277
+ midPoint?: GlobalPoint;
278
+ } | null;
279
+ /**
280
+ * Where on a hovered arrow the text tool would attach text if clicked —
281
+ * a free endpoint (binds the arrow to a new text element positioned against
282
+ * that endpoint) or the arrow's midpoint (adds a label bound to the arrow).
283
+ */
284
+ hoveredArrowTextAnchor: {
285
+ elementId: ExcalidrawArrowElement["id"];
286
+ anchor: "start" | "end" | "label";
287
+ } | null;
201
288
  frameToHighlight: NonDeleted<ExcalidrawFrameLikeElement> | null;
202
289
  frameRendering: {
203
290
  enabled: boolean;
@@ -205,13 +292,15 @@ export interface AppState {
205
292
  outline: boolean;
206
293
  clip: boolean;
207
294
  };
208
- editingFrame: string | null;
209
- elementsToHighlight: NonDeleted<ExcalidrawElement>[] | null;
295
+ /**
296
+ * frame-like element whose name is currently being edited
297
+ */
298
+ editingFrame: ExcalidrawFrameLikeElement["id"] | null;
299
+ elementsToHighlight: readonly NonDeletedExcalidrawElement[] | null;
210
300
  /**
211
301
  * set when a new text is created or when an existing text is being edited
212
302
  */
213
- editingTextElement: NonDeletedExcalidrawElement | null;
214
- editingLinearElement: LinearElementEditor | null;
303
+ editingTextElement: ExcalidrawTextElement | null;
215
304
  activeTool: {
216
305
  /**
217
306
  * indicates a previous tool we should revert back to if we deselect the
@@ -221,6 +310,10 @@ export interface AppState {
221
310
  locked: boolean;
222
311
  fromSelection: boolean;
223
312
  } & ActiveTool;
313
+ preferredSelectionTool: {
314
+ type: "selection" | "lasso";
315
+ initialized: boolean;
316
+ };
224
317
  penMode: boolean;
225
318
  penDetected: boolean;
226
319
  exportBackground: boolean;
@@ -228,11 +321,14 @@ export interface AppState {
228
321
  exportWithDarkMode: boolean;
229
322
  exportScale: number;
230
323
  currentItemStrokeColor: string;
324
+ currentItemStickynoteStrokeColor: string;
325
+ currentItemStickynoteBackgroundColor: string;
231
326
  currentItemBackgroundColor: string;
232
327
  currentItemFillStyle: ExcalidrawElement["fillStyle"];
233
- currentItemStrokeWidth: number;
328
+ currentItemStrokeWidthKey: StrokeWidthKey;
234
329
  currentItemStrokeStyle: ExcalidrawElement["strokeStyle"];
235
330
  currentItemRoughness: number;
331
+ currentItemStrokeVariability: StrokeVariability;
236
332
  currentItemOpacity: number;
237
333
  currentItemFontFamily: FontFamilyValues;
238
334
  currentItemFontSize: number;
@@ -245,14 +341,15 @@ export interface AppState {
245
341
  viewBackgroundColor: string;
246
342
  scrollX: number;
247
343
  scrollY: number;
344
+ scrollConstraints: ScrollConstraints | null;
248
345
  cursorButton: "up" | "down";
249
346
  scrolledOutside: boolean;
250
347
  name: string | null;
251
348
  isResizing: boolean;
252
349
  isRotating: boolean;
253
350
  zoom: Zoom;
254
- openMenu: "canvas" | "shape" | null;
255
- openPopup: "canvasBackground" | "elementBackground" | "elementStroke" | "fontFamily" | null;
351
+ openMenu: "canvas" | null;
352
+ openPopup: "canvasBackground" | "elementBackground" | "elementStroke" | "fontFamily" | "compactTextProperties" | "compactStrokeStyles" | "compactOtherProperties" | "compactArrowProperties" | null;
256
353
  openSidebar: {
257
354
  name: SidebarName;
258
355
  tab?: SidebarTabName;
@@ -264,9 +361,15 @@ export interface AppState {
264
361
  tab: "text-to-diagram" | "mermaid";
265
362
  } | {
266
363
  name: "commandPalette";
364
+ } | {
365
+ name: "settings";
267
366
  } | {
268
367
  name: "elementLinkSelector";
269
368
  sourceElementId: ExcalidrawElement["id"];
369
+ } | {
370
+ name: "charts";
371
+ data: Spreadsheet;
372
+ rawText: string;
270
373
  };
271
374
  /**
272
375
  * Reflects user preference for whether the default sidebar should be docked.
@@ -289,7 +392,7 @@ export interface AppState {
289
392
  selectedElementsAreBeingDragged: boolean;
290
393
  shouldCacheIgnoreZoom: boolean;
291
394
  toast: {
292
- message: string;
395
+ message: React.ReactNode;
293
396
  closable?: boolean;
294
397
  duration?: number;
295
398
  } | null;
@@ -311,21 +414,13 @@ export interface AppState {
311
414
  height: number;
312
415
  offsetTop: number;
313
416
  offsetLeft: number;
314
- fileHandle: FileSystemHandle | null;
417
+ fileHandle: FileSystemFileHandle | null;
315
418
  collaborators: Map<SocketId, Collaborator>;
316
419
  stats: {
317
420
  open: boolean;
318
421
  /** bitmap. Use `STATS_PANELS` bit values */
319
422
  panels: number;
320
423
  };
321
- currentChartType: ChartType;
322
- pasteDialog: {
323
- shown: false;
324
- data: null;
325
- } | {
326
- shown: true;
327
- data: Spreadsheet;
328
- };
329
424
  showHyperlinkPopup: false | "info" | "editor";
330
425
  selectedLinearElement: LinearElementEditor | null;
331
426
  snapLines: readonly SnapLine[];
@@ -334,10 +429,6 @@ export interface AppState {
334
429
  y: number;
335
430
  } | null;
336
431
  objectsSnapModeEnabled: boolean;
337
- /** the user's socket id & username who is being followed on the canvas */
338
- userToFollow: UserToFollow | null;
339
- /** the socket ids of the users following the current user */
340
- followedBy: Set<SocketId>;
341
432
  /** image cropping */
342
433
  isCropping: boolean;
343
434
  croppingElementId: ExcalidrawElement["id"] | null;
@@ -351,6 +442,21 @@ export interface AppState {
351
442
  lockedMultiSelections: {
352
443
  [groupId: string]: true;
353
444
  };
445
+ bindMode: BindMode;
446
+ /** user-customized color-picker top picks (pinned via drag & drop from the
447
+ * color picker popup). `null` means no customization (defaults, or
448
+ * host-supplied `topPicks`, are used). Kept per picker. */
449
+ colorTopPicks: {
450
+ elementStroke: readonly string[] | null;
451
+ elementBackground: readonly string[] | null;
452
+ /** the bucket-fill tool keeps a list separate from `elementBackground`
453
+ * even though both drive `currentItemBackgroundColor` (its defaults and
454
+ * use case differ — no transparent) */
455
+ bucketFill: readonly string[] | null;
456
+ /** sticky notes are their own color domain (own defaults, own picks) */
457
+ stickyNoteStroke: readonly string[] | null;
458
+ stickyNoteBackground: readonly string[] | null;
459
+ };
354
460
  }
355
461
  export type SearchMatch = {
356
462
  id: string;
@@ -363,7 +469,7 @@ export type SearchMatch = {
363
469
  showOnCanvas: boolean;
364
470
  }[];
365
471
  };
366
- export type UIAppState = Omit<AppState, "suggestedBindings" | "startBoundElement" | "cursorButton" | "scrollX" | "scrollY">;
472
+ export type UIAppState = Omit<AppState, "cursorButton" | "scrollX" | "scrollY" | "zoom" | "shouldCacheIgnoreZoom" | "snapLines" | "originSnapOffset" | "suggestedBinding" | "hoveredArrowTextAnchor" | "frameToHighlight" | "elementsToHighlight">;
367
473
  export type NormalizedZoomValue = number & {
368
474
  _brand: "normalizedZoom";
369
475
  };
@@ -407,15 +513,192 @@ export type LibraryItemsSource = ((currentLibraryItems: LibraryItems) => MaybePr
407
513
  export type ExcalidrawInitialDataState = Merge<ImportedDataState, {
408
514
  libraryItems?: MaybePromise<Required<ImportedDataState>["libraryItems"]>;
409
515
  }>;
516
+ export type ExcalidrawInitialState = {
517
+ viewport?: Omit<SetViewportOptions, "animation">;
518
+ };
410
519
  export type OnUserFollowedPayload = {
411
520
  userToFollow: UserToFollow;
412
521
  action: "FOLLOW" | "UNFOLLOW";
413
522
  };
523
+ export type ViewportStatusFrame = {
524
+ /** the badge (bottom-center pill) */
525
+ label?: {
526
+ label: React.ReactNode;
527
+ icon?: React.ReactNode;
528
+ /** badge background; defaults to var(--color-primary-hover) */
529
+ background?: string;
530
+ /** badge text color; defaults to var(--color-primary-light) */
531
+ color?: string;
532
+ /** makes the badge label interactive */
533
+ onClick?: () => void;
534
+ /** renders a close button when set */
535
+ onClose?: () => void;
536
+ };
537
+ /** viewport-edge border: CSS color, or `false` for none */
538
+ border: false | string;
539
+ };
540
+ export type OnExportProgress = {
541
+ type: "progress";
542
+ message?: React.ReactNode;
543
+ /** 0-1 range */
544
+ progress?: number;
545
+ };
546
+ export type InteractionConfig = {
547
+ /**
548
+ * Interactions that stay enabled while the editor is otherwise
549
+ * non-interactive. Opt-in: anything omitted or `false` is disabled.
550
+ */
551
+ enabled?: {
552
+ /**
553
+ * Element links render their link icon and stay clickable — clicking
554
+ * anywhere on a linked element opens the link, same as in view mode.
555
+ * When disabled, link icons are not rendered at all.
556
+ *
557
+ * @default false
558
+ */
559
+ links?: boolean;
560
+ /**
561
+ * Embeddable & iframe elements stay interactive — hovering & clicking
562
+ * activates them so their content can be used, same as in view mode.
563
+ *
564
+ * @default false
565
+ */
566
+ embeds?: boolean;
567
+ /**
568
+ * Umbrella for all interactive content on canvas — shorthand for
569
+ * enabling `links` & `embeds` (and future interactive content kinds)
570
+ * together. Additive: `interactiveContent: true` enables them
571
+ * regardless of their individual values.
572
+ *
573
+ * @default false
574
+ */
575
+ interactiveContent?: boolean;
576
+ /**
577
+ * Canvas navigation — panning (pointer drag, wheel, PageUp/PageDown)
578
+ * and zooming (ctrl/cmd + wheel, pinch, and the canvas zoom &
579
+ * zoom-to-fit shortcuts: ctrl/cmd +/-/0, shift+1/2/3), same as in view
580
+ * mode. Respects `appState.scrollConstraints` if set, so it composes
581
+ * with viewport locking. The rest of the keyboard stays disabled. Note
582
+ * the editor consumes wheel & touch input again when enabled, so the
583
+ * page no longer scrolls over the editor.
584
+ *
585
+ * @default false
586
+ */
587
+ navigation?: boolean;
588
+ /**
589
+ * Whether the browser's own zoom remains available over the editor —
590
+ * ctrl/cmd + wheel, pinch, and (while the editor has focus)
591
+ * ctrl/cmd +/-/0 shortcuts. Prevented by default, mirroring the
592
+ * interactive editor. Regular page scrolling stays available either way.
593
+ * With `navigation` enabled, the zoom input (wheel, pinch, keyboard
594
+ * shortcuts) zooms the canvas instead either way, making this moot.
595
+ *
596
+ * @default false
597
+ */
598
+ browserZoom?: boolean;
599
+ /**
600
+ * Tools that stay user-driven while the editor is otherwise
601
+ * non-interactive: pointer input keeps driving the listed tool when it's
602
+ * the active tool. Does not enable user-driven tool *switching* — the
603
+ * keyboard stays disabled and tool selection remains host-driven
604
+ * (`ExcalidrawAPI.setActiveTool`).
605
+ *
606
+ * Composes with `navigation`: the enabled tool wins the primary-pointer
607
+ * drag, while wheel input (and wheel-button drag) still pans/zooms.
608
+ */
609
+ tools?: {
610
+ /**
611
+ * The laser pointer stays usable — pointer strokes draw laser trails
612
+ * and pointer positions keep broadcasting via `onPointerUpdate`, so
613
+ * e.g. collaborators see a presenter's laser & cursor.
614
+ *
615
+ * @default false
616
+ */
617
+ laser?: boolean;
618
+ /**
619
+ * Custom tools (`activeTool.type === "custom"`) stay usable — the
620
+ * editor keeps dispatching `onPointerDown` / `onPointerUp` for them.
621
+ * Tool behavior is host-implemented; activate custom tools with
622
+ * `locked: true` or they revert to the selection tool (and go inert)
623
+ * after the first pointer interaction.
624
+ *
625
+ * @default false
626
+ */
627
+ custom?: boolean;
628
+ };
629
+ };
630
+ };
631
+ export type UIConfig = {
632
+ /**
633
+ * Default UI controls that stay enabled while the rest of Excalidraw's
634
+ * default UI is hidden. Opt-in: anything omitted or `false` is disabled.
635
+ */
636
+ enabled: {
637
+ /**
638
+ * The zoom-out, reset-zoom, and zoom-in controls.
639
+ *
640
+ * @default false
641
+ */
642
+ zoom?: boolean;
643
+ /**
644
+ * The button shown when the viewport is scrolled away from all content.
645
+ *
646
+ * @default false
647
+ */
648
+ scrollBackToContent?: boolean;
649
+ };
650
+ };
651
+ /** Supported visual changes. Geometry, content, bindings and styles are not overridable. */
652
+ export type ElementRenderOverride = Readonly<{
653
+ /** Absolute render opacity (0–100, clamped). Omitted: use element.opacity. */
654
+ opacity?: number;
655
+ /** Translation in scene units. Bound labels inherit their container's offset and ignore this field. */
656
+ offset?: Readonly<{
657
+ x: number;
658
+ y: number;
659
+ }>;
660
+ }>;
661
+ /** see {@link ExcalidrawImperativeAPI.setElementRenderOverrides} for details */
662
+ export type ElementRenderOverrides = ReadonlyMap<ExcalidrawElement["id"], ElementRenderOverride>;
663
+ /** The translation part of a snapshot: only the entries that carry an offset. */
664
+ export type ElementRenderOffsets = ReadonlyMap<ExcalidrawElement["id"], NonNullable<ElementRenderOverride["offset"]>>;
414
665
  export interface ExcalidrawProps {
666
+ className?: string;
667
+ /**
668
+ * Document that owns Excalidraw's mounted DOM.
669
+ *
670
+ * Set only when it differs from the global `document`, such as when code
671
+ * executing in a parent window mounts Excalidraw into an iframe document.
672
+ * The value must remain stable for the editor's lifetime.
673
+ *
674
+ * @default document
675
+ */
676
+ ownerDocument?: Document;
415
677
  onChange?: (elements: readonly OrderedExcalidrawElement[], appState: AppState, files: BinaryFiles) => void;
678
+ onThemeChange?: (theme: Theme | "system") => void;
679
+ /**
680
+ * note: only subscribes if the props.onIncrement is defined on initial render
681
+ */
416
682
  onIncrement?: (event: DurableIncrement | EphemeralIncrement) => void;
417
683
  initialData?: (() => MaybePromise<ExcalidrawInitialDataState | null>) | MaybePromise<ExcalidrawInitialDataState | null>;
418
- excalidrawAPI?: (api: ExcalidrawImperativeAPI) => void;
684
+ initialState?: ExcalidrawInitialState;
685
+ /**
686
+ * Invoked as soon as the Excalidraw API is available
687
+ * NOTE editor is not yet mounted, and state is not yet initialized
688
+ */
689
+ onExcalidrawAPI?: (api: ExcalidrawImperativeAPI | null) => void;
690
+ /**
691
+ * Invoked once the editor root is mounted.
692
+ */
693
+ onMount?: (payload: ExcalidrawMountPayload) => void;
694
+ /**
695
+ * Invoked when the editor root is unmounted.
696
+ */
697
+ onUnmount?: () => void;
698
+ /**
699
+ * Invoked once the initial scene is loaded.
700
+ */
701
+ onInitialize?: (api: ExcalidrawImperativeAPI) => void;
419
702
  isCollaborating?: boolean;
420
703
  onPointerUpdate?: (payload: {
421
704
  pointer: {
@@ -441,9 +724,74 @@ export interface ExcalidrawProps {
441
724
  onDuplicate?: (nextElements: readonly ExcalidrawElement[],
442
725
  /** excludes the duplicated elements */
443
726
  prevElements: readonly ExcalidrawElement[]) => ExcalidrawElement[] | void;
727
+ renderTopLeftUI?: (isMobile: boolean, appState: UIAppState) => JSX.Element | null;
444
728
  renderTopRightUI?: (isMobile: boolean, appState: UIAppState) => JSX.Element | null;
445
729
  langCode?: Language["code"];
446
730
  viewModeEnabled?: boolean;
731
+ /**
732
+ * Whether the editor accepts user input (pointer, keyboard, wheel, touch,
733
+ * clipboard, drag&drop). When `false`, the scene still renders and reacts
734
+ * to programmatic updates (imperative API), but the user cannot affect it
735
+ * in any way. Implies view mode.
736
+ *
737
+ * Pass a config object to keep specific interactions enabled while the
738
+ * editor is otherwise non-interactive (see `InteractionConfig`):
739
+ *
740
+ * ```tsx
741
+ * <Excalidraw interaction={{ enabled: { links: true } }} />
742
+ * ```
743
+ *
744
+ * @default true
745
+ */
746
+ interaction?: boolean | InteractionConfig;
747
+ /**
748
+ * Whether Excalidraw's default UI is rendered — toolbar, default menus,
749
+ * footer controls, sidebars, and canvas popups. Host UI passed through
750
+ * children (including exported components such as `MainMenu` and `Footer`)
751
+ * or render props continues to render, together with any supporting dialogs
752
+ * it opens.
753
+ *
754
+ * Canvas content (elements, text editing surface, frame names, embeds) still
755
+ * renders, and the editor remains interactive unless `interaction` is set to
756
+ * `false`.
757
+ *
758
+ * Pass a config object to keep specific default controls rendered while the
759
+ * rest of the default UI is hidden (see `UIConfig`):
760
+ *
761
+ * ```tsx
762
+ * <Excalidraw ui={{ enabled: { zoom: true } }} />
763
+ * ```
764
+ *
765
+ * NOTE: this is WIP and what default UI is/is not rendered when ui=false
766
+ * may yet change.
767
+ *
768
+ * @default true
769
+ */
770
+ ui?: boolean | UIConfig;
771
+ /**
772
+ * Forces the active editor tool (controlled). While set, user- and
773
+ * API-driven tool switching is ignored — `setActiveTool` refuses with a
774
+ * console warning, non-forced toolbar buttons render disabled — and the
775
+ * editor snaps back if internal flows reset the tool. The forced tool
776
+ * behaves as if locked (see the tool lock / padlock): it doesn't revert to
777
+ * the selection tool after use, and elements drawn with it aren't
778
+ * auto-selected — without mutating `appState.activeTool.locked`, so the
779
+ * user's persisted padlock preference stays untouched. Unset to return
780
+ * tool control to the editor (the current tool stays active).
781
+ *
782
+ * The forced tool must be activatable to take effect: not disabled via
783
+ * `UIOptions.tools`, and — while the editor is non-interactive — allowed
784
+ * via `interaction.enabled.tools`. Otherwise the editor stays on (or, when
785
+ * non-interactive, resets to) the `selection` tool, and the forced tool is
786
+ * applied once it becomes activatable. `image` cannot be forced (its
787
+ * activation opens the file picker).
788
+ */
789
+ activeTool?: {
790
+ type: Exclude<ToolType, "image">;
791
+ } | {
792
+ type: "custom";
793
+ customType: string;
794
+ };
447
795
  zenModeEnabled?: boolean;
448
796
  gridModeEnabled?: boolean;
449
797
  objectsSnapModeEnabled?: boolean;
@@ -452,6 +800,10 @@ export interface ExcalidrawProps {
452
800
  name?: string;
453
801
  renderCustomStats?: (elements: readonly NonDeletedExcalidrawElement[], appState: UIAppState) => JSX.Element;
454
802
  UIOptions?: Partial<UIOptions>;
803
+ /**
804
+ * dimensions and size constraints for inserted images
805
+ */
806
+ imageOptions?: ImageOptions;
455
807
  detectScroll?: boolean;
456
808
  handleKeyboardGlobally?: boolean;
457
809
  onLibraryChange?: (libraryItems: LibraryItems) => void | Promise<any>;
@@ -471,9 +823,48 @@ export interface ExcalidrawProps {
471
823
  aiEnabled?: boolean;
472
824
  showDeprecatedFonts?: boolean;
473
825
  renderScrollbars?: boolean;
826
+ viewportStatusFrame?: ViewportStatusFrame | null;
827
+ /**
828
+ * Rendered inside the UserList "who's here" dropdown (desktop) and inline
829
+ * in the mobile menu's collaborators section, below a divider. Accepts a
830
+ * render function — called with `isMobile` so hosts can render different
831
+ * UI for each surface — in addition to a plain node.
832
+ */
833
+ currentUserControls?: React.ReactNode | ((isMobile: boolean) => React.ReactNode);
834
+ /**
835
+ * The user being followed on the canvas, if any. Controlled by the host —
836
+ * the editor never sets it; it emits follow/unfollow intents via
837
+ * `onUserFollow` (prop or imperative API) and renders the followed
838
+ * user's avatar highlight from this value.
839
+ */
840
+ userToFollow?: UserToFollow | null;
841
+ /**
842
+ * Called before exporting to a file.
843
+ *
844
+ * Allows the host app to intercept and delay saving until async operations
845
+ * (e.g., images are loaded) complete.
846
+ *
847
+ * If Promise/AsyncGenerator is returned, a progress toast will be shown
848
+ * until the operation completes. Generator can yield progress updates.
849
+ */
850
+ onExport?: (
851
+ /** type of export. Currently we only call for JSON exports or
852
+ * JSON-embedded PNG (which is also identified as `json` type here)*/
853
+ type: "json", data: {
854
+ elements: readonly ExcalidrawElement[];
855
+ appState: AppState;
856
+ files: BinaryFiles;
857
+ }, options: {
858
+ /** signal that gets aborted if user cancels the export (e.g. closes
859
+ * the native file picker dialog). In that case, you can either
860
+ * return immediately, or throw AbortError.
861
+ */
862
+ signal: AbortSignal;
863
+ }) => MaybePromise<void> | AsyncGenerator<OnExportProgress, void>;
474
864
  }
475
865
  export type SceneData = {
476
- elements?: ImportedDataState["elements"];
866
+ /** Expects normalized elements; restore imported data before updating the scene. */
867
+ elements?: readonly ExcalidrawElement[] | null;
477
868
  appState?: ImportedDataState["appState"];
478
869
  collaborators?: Map<SocketId, Collaborator>;
479
870
  captureUpdate?: CaptureUpdateActionType;
@@ -483,12 +874,21 @@ export type ExportOpts = {
483
874
  onExportToBackend?: (exportedElements: readonly NonDeletedExcalidrawElement[], appState: UIAppState, files: BinaryFiles) => void;
484
875
  renderCustomUI?: (exportedElements: readonly NonDeletedExcalidrawElement[], appState: UIAppState, files: BinaryFiles, canvas: HTMLCanvasElement) => JSX.Element;
485
876
  };
877
+ export type ImageOptions = Partial<{
878
+ maxWidthOrHeight: number;
879
+ maxFileSizeBytes: number;
880
+ }>;
486
881
  export type CanvasActions = Partial<{
487
882
  changeViewBackgroundColor: boolean;
488
883
  clearCanvas: boolean;
489
884
  export: false | ExportOpts;
490
885
  loadScene: boolean;
491
886
  saveToActiveFile: boolean;
887
+ /**
888
+ * defaults to true if `props.theme` is omitted or `props.onThemeChange`
889
+ * is supplied (at which point the theme is considered as host-app controlled),
890
+ * else default to false
891
+ * */
492
892
  toggleTheme: boolean | null;
493
893
  saveAsImage: boolean;
494
894
  }>;
@@ -498,6 +898,11 @@ export type UIOptions = Partial<{
498
898
  tools: {
499
899
  image: boolean;
500
900
  };
901
+ /**
902
+ * Optionally control the editor form factor and desktop UI mode from the host app.
903
+ * If not provided, we will take care of it internally.
904
+ */
905
+ getFormFactor?: (editorWidth: number, editorHeight: number) => EditorInterface["formFactor"];
501
906
  /** @deprecated does nothing. Will be removed in 0.15 */
502
907
  welcomeScreen?: boolean;
503
908
  }>;
@@ -507,6 +912,7 @@ export type AppProps = Merge<ExcalidrawProps, {
507
912
  export: ExportOpts;
508
913
  };
509
914
  }>;
915
+ imageOptions: Required<ImageOptions>;
510
916
  detectScroll: boolean;
511
917
  handleKeyboardGlobally: boolean;
512
918
  isCollaborating: boolean;
@@ -518,6 +924,10 @@ export type AppProps = Merge<ExcalidrawProps, {
518
924
  export type AppClassProperties = {
519
925
  props: AppProps;
520
926
  state: AppState;
927
+ readonly ownerDocument: Document;
928
+ readonly ownerWindow: Window & typeof globalThis;
929
+ api: App["api"];
930
+ sessionExportThemeOverride: App["sessionExportThemeOverride"];
521
931
  interactiveCanvas: HTMLCanvasElement | null;
522
932
  /** static canvas */
523
933
  canvas: HTMLCanvasElement;
@@ -528,7 +938,7 @@ export type AppClassProperties = {
528
938
  mimeType: ValueOf<typeof IMAGE_MIME_TYPES>;
529
939
  }>;
530
940
  files: BinaryFiles;
531
- device: App["device"];
941
+ editorInterface: App["editorInterface"];
532
942
  scene: App["scene"];
533
943
  syncActionResult: App["syncActionResult"];
534
944
  fonts: App["fonts"];
@@ -536,8 +946,7 @@ export type AppClassProperties = {
536
946
  id: App["id"];
537
947
  onInsertElements: App["onInsertElements"];
538
948
  onExportImage: App["onExportImage"];
539
- lastViewportPosition: App["lastViewportPosition"];
540
- scrollToContent: App["scrollToContent"];
949
+ viewport: App["viewport"];
541
950
  addFiles: App["addFiles"];
542
951
  addElementsFromPasteOrLibrary: App["addElementsFromPasteOrLibrary"];
543
952
  togglePenMode: App["togglePenMode"];
@@ -548,15 +957,32 @@ export type AppClassProperties = {
548
957
  onMagicframeToolSelect: App["onMagicframeToolSelect"];
549
958
  getName: App["getName"];
550
959
  dismissLinearEditor: App["dismissLinearEditor"];
551
- flowChartCreator: App["flowChartCreator"];
960
+ flowchart: App["flowchart"];
961
+ drawShape: App["drawShape"];
962
+ arrowText: App["arrowText"];
963
+ cursor: App["cursor"];
964
+ bucketFill: App["bucketFill"];
965
+ toolDrag: App["toolDrag"];
966
+ activeResizeHandle: App["activeResizeHandle"];
967
+ isToolLocked: App["isToolLocked"];
552
968
  getEffectiveGridSize: App["getEffectiveGridSize"];
553
969
  setPlugins: App["setPlugins"];
554
970
  plugins: App["plugins"];
555
- getEditorUIOffsets: App["getEditorUIOffsets"];
556
971
  visibleElements: App["visibleElements"];
557
972
  excalidrawContainerValue: App["excalidrawContainerValue"];
558
973
  onPointerUpEmitter: App["onPointerUpEmitter"];
559
974
  updateEditorAtom: App["updateEditorAtom"];
975
+ onPointerDownEmitter: App["onPointerDownEmitter"];
976
+ onEvent: App["onEvent"];
977
+ onStateChange: App["onStateChange"];
978
+ lastPointerMoveCoords: App["lastPointerMoveCoords"];
979
+ lastPointerMoveEvent: App["lastPointerMoveEvent"];
980
+ bindModeHandler: App["bindModeHandler"];
981
+ emitUserFollowIntent: App["emitUserFollowIntent"];
982
+ requestUnfollow: App["requestUnfollow"];
983
+ setAppState: App["setAppState"];
984
+ isInteractionEnabled: App["isInteractionEnabled"];
985
+ isNavigationEnabled: App["isNavigationEnabled"];
560
986
  };
561
987
  export type PointerDownState = Readonly<{
562
988
  origin: Readonly<{
@@ -592,6 +1018,7 @@ export type PointerDownState = Readonly<{
592
1018
  wasAddedToSelection: boolean;
593
1019
  hasBeenDuplicated: boolean;
594
1020
  hasHitCommonBoundingBoxOfSelectedElements: boolean;
1021
+ arrowLabel: boolean;
595
1022
  };
596
1023
  withCmdOrCtrl: boolean;
597
1024
  drag: {
@@ -604,6 +1031,7 @@ export type PointerDownState = Readonly<{
604
1031
  x: number;
605
1032
  y: number;
606
1033
  };
1034
+ blockDragging: boolean;
607
1035
  };
608
1036
  eventListeners: {
609
1037
  onMove: null | ReturnType<typeof throttleRAF>;
@@ -616,8 +1044,20 @@ export type PointerDownState = Readonly<{
616
1044
  };
617
1045
  }>;
618
1046
  export type UnsubscribeCallback = () => void;
1047
+ export type ExcalidrawMountPayload = {
1048
+ excalidrawAPI: ExcalidrawImperativeAPI;
1049
+ container: HTMLDivElement | null;
1050
+ };
1051
+ export type ExcalidrawImperativeAPIEventMap = {
1052
+ "editor:mount": [payload: ExcalidrawMountPayload];
1053
+ "editor:initialize": [api: ExcalidrawImperativeAPI];
1054
+ "editor:unmount": [];
1055
+ };
619
1056
  export interface ExcalidrawImperativeAPI {
1057
+ /** Whether the editor has been unmounted and the API is no longer usable. */
1058
+ isDestroyed: boolean;
620
1059
  updateScene: InstanceType<typeof App>["updateScene"];
1060
+ applyDeltas: InstanceType<typeof App>["applyDeltas"];
621
1061
  mutateElement: InstanceType<typeof App>["mutateElement"];
622
1062
  updateLibrary: InstanceType<typeof Library>["updateLibrary"];
623
1063
  resetScene: InstanceType<typeof App>["resetScene"];
@@ -630,16 +1070,34 @@ export interface ExcalidrawImperativeAPI {
630
1070
  getAppState: () => InstanceType<typeof App>["state"];
631
1071
  getFiles: () => InstanceType<typeof App>["files"];
632
1072
  getName: InstanceType<typeof App>["getName"];
633
- scrollToContent: InstanceType<typeof App>["scrollToContent"];
1073
+ setViewport: InstanceType<typeof App>["viewport"]["setViewport"];
1074
+ getViewportOffsets: InstanceType<typeof App>["viewport"]["getOffsets"];
1075
+ /**
1076
+ * Atomically replaces all transient visual overrides. Values are copied;
1077
+ * omitted IDs/fields use document values, except for inherited label offsets.
1078
+ * null clears the snapshot.
1079
+ * Repaints without document changes, history entries or onChange events;
1080
+ * an equivalent snapshot may still repaint (clearing an already clear
1081
+ * snapshot does not), so submit only when something changed.
1082
+ * Finite opacity is clamped to 0–100; non-finite values reject the snapshot.
1083
+ * Unknown/deleted IDs are ignored when rendering. Reset/unmount clears it.
1084
+ * Bound labels inherit their container's offset; offsets targeting them are
1085
+ * ignored. Label opacity remains independent. Target frame children explicitly.
1086
+ * Frame opacity still multiplies child opacity. Decorations follow their owner.
1087
+ * Exports and interactive geometry (hit tests, selection, editing) use document
1088
+ * values, including while authoring an animation preview in edit mode.
1089
+ */
1090
+ setElementRenderOverrides: InstanceType<typeof App>["setElementRenderOverrides"];
634
1091
  registerAction: (action: Action) => void;
635
1092
  refresh: InstanceType<typeof App>["refresh"];
636
1093
  setToast: InstanceType<typeof App>["setToast"];
637
1094
  addFiles: (data: BinaryFileData[]) => void;
638
1095
  id: string;
639
1096
  setActiveTool: InstanceType<typeof App>["setActiveTool"];
640
- setCursor: InstanceType<typeof App>["setCursor"];
641
- resetCursor: InstanceType<typeof App>["resetCursor"];
1097
+ setCursor: InstanceType<typeof App>["cursor"]["set"];
1098
+ resetCursor: InstanceType<typeof App>["cursor"]["reset"];
642
1099
  toggleSidebar: InstanceType<typeof App>["toggleSidebar"];
1100
+ getEditorInterface: () => EditorInterface;
643
1101
  /**
644
1102
  * Disables rendering of frames (including element clipping), but currently
645
1103
  * the frames are still interactive in edit mode. As such, this API should be
@@ -652,24 +1110,14 @@ export interface ExcalidrawImperativeAPI {
652
1110
  onPointerUp: (callback: (activeTool: AppState["activeTool"], pointerDownState: PointerDownState, event: PointerEvent) => void) => UnsubscribeCallback;
653
1111
  onScrollChange: (callback: (scrollX: number, scrollY: number, zoom: Zoom) => void) => UnsubscribeCallback;
654
1112
  onUserFollow: (callback: (payload: OnUserFollowedPayload) => void) => UnsubscribeCallback;
1113
+ onStateChange: InstanceType<typeof App>["onStateChange"];
1114
+ onEvent: InstanceType<typeof App>["onEvent"];
655
1115
  }
656
- export type Device = Readonly<{
657
- viewport: {
658
- isMobile: boolean;
659
- isLandscape: boolean;
660
- };
661
- editor: {
662
- isMobile: boolean;
663
- canFitSidebar: boolean;
664
- };
665
- isTouchScreen: boolean;
666
- }>;
667
1116
  export type FrameNameBounds = {
668
1117
  x: number;
669
1118
  y: number;
670
1119
  width: number;
671
1120
  height: number;
672
- angle: number;
673
1121
  };
674
1122
  export type FrameNameBoundsCache = {
675
1123
  get: (frameElement: ExcalidrawFrameLikeElement | ExcalidrawMagicFrameElement) => FrameNameBounds | null;
@@ -688,12 +1136,18 @@ export type Primitive = number | string | boolean | bigint | symbol | null | und
688
1136
  export type JSONValue = string | number | boolean | null | object;
689
1137
  export type EmbedsValidationStatus = Map<ExcalidrawIframeLikeElement["id"], boolean>;
690
1138
  export type ElementsPendingErasure = Set<ExcalidrawElement["id"]>;
691
- export type PendingExcalidrawElements = ExcalidrawElement[];
1139
+ export type PendingExcalidrawElements = NonDeletedExcalidrawElement[];
692
1140
  /** Runtime gridSize value. Null indicates disabled grid. */
693
1141
  export type NullableGridSize = (AppState["gridSize"] & MakeBrand<"NullableGridSize">) | null;
694
1142
  export type GenerateDiagramToCode = (props: {
695
- frame: ExcalidrawMagicFrameElement;
696
- children: readonly ExcalidrawElement[];
1143
+ frame: NonDeleted<ExcalidrawMagicFrameElement>;
1144
+ children: readonly NonDeletedExcalidrawElement[];
1145
+ /**
1146
+ * Optional streaming hook. Call with the accumulated response text as it
1147
+ * streams in so the editor can progressively render the partial HTML
1148
+ * inside the generated frame.
1149
+ */
1150
+ onPartial?: (html: string) => void;
697
1151
  }) => MaybePromise<{
698
1152
  html: string;
699
1153
  }>;
@@ -703,4 +1157,102 @@ export type Offsets = Partial<{
703
1157
  bottom: number;
704
1158
  left: number;
705
1159
  }>;
706
- export {};
1160
+ /**
1161
+ * Value of the `data-viewport-ui` attribute, marking a DOM node as a UI
1162
+ * surface that occludes the canvas. Such nodes are measured by
1163
+ * `getViewportOffsets` to compute the default per-side viewport offsets:
1164
+ *
1165
+ * - `top` / `bottom` — offsets that side by the node's bottom/top edge
1166
+ * - `side` — a panel hugging the left or right edge. Which side is not
1167
+ * declared but resolved geometrically: if the node's horizontal center
1168
+ * lies in the left half of the viewport it counts against the left
1169
+ * offset (by its right edge), otherwise against the right offset (by
1170
+ * `viewportWidth - left edge`). Measuring the rendered position instead
1171
+ * of declaring a side means RTL layouts and host-configurable docking
1172
+ * (e.g. sidebar side) are handled for free — but it assumes the surface
1173
+ * actually hugs one edge; don't mark a centered/near-full-width node as
1174
+ * `side` (its midpoint would classify it to one side and the offset
1175
+ * would swallow most of the viewport).
1176
+ *
1177
+ * The attribute should only be present while the surface is actually
1178
+ * rendered — omit it (don't just hide the node) when the surface shouldn't
1179
+ * push the viewport around.
1180
+ */
1181
+ export type ViewportUIDock = "top" | "bottom" | "side";
1182
+ /**
1183
+ * Options for `getViewportOffsets` (and the `ui` key of
1184
+ * {@link ViewportOffsets}), controlling how offsets are derived from the
1185
+ * currently rendered editor UI.
1186
+ *
1187
+ * NOTE unlike the physical sides of {@link Offsets}, the horizontal values
1188
+ * here are logical, i.e. flipped in RTL layouts (`left` refers to the
1189
+ * reading-direction start side).
1190
+ */
1191
+ export type ViewportOffsetsOptions = {
1192
+ /** padding added to each measured side (default 24) */
1193
+ padding?: number;
1194
+ paddingTop?: number;
1195
+ paddingRight?: number;
1196
+ paddingBottom?: number;
1197
+ paddingLeft?: number;
1198
+ /** final value for the given side, replacing the measured UI size
1199
+ * (padding is not added on top) */
1200
+ top?: number;
1201
+ bottom?: number;
1202
+ left?: number;
1203
+ right?: number;
1204
+ /**
1205
+ * Reserve space for the given conditionally-rendered surfaces even while
1206
+ * they're hidden, so the resulting offsets don't shift when they
1207
+ * (dis)appear. Uses the surface's last-measured footprint, falling back
1208
+ * to an approximate default if it hasn't been rendered yet. Ignored on
1209
+ * phones (where these surfaces never occlude the canvas).
1210
+ */
1211
+ reserve?: {
1212
+ /** styles panel (rendered when a tool or selection is active) */
1213
+ stylesPanel?: boolean;
1214
+ /** sidebar (e.g. library) */
1215
+ sidebar?: boolean;
1216
+ };
1217
+ };
1218
+ /**
1219
+ * Viewport offsets accepted by the `setViewport`-family APIs (`setViewport`,
1220
+ * `props.initialState.viewport`), insetting the usable viewport area per
1221
+ * side so the target isn't fitted/centered underneath overlaid UI.
1222
+ *
1223
+ * Two (combinable) ways to specify:
1224
+ *
1225
+ * - **Static sides** (`top`/`right`/`bottom`/`left`) — absolute pixel
1226
+ * values, used as-is: physical (not flipped in RTL), zoom-independent,
1227
+ * no padding added. Sides not specified default to `0` (unless `ui` is
1228
+ * set, see below).
1229
+ *
1230
+ * - **`ui`** — derive the offsets from the editor UI (toolbar, styles
1231
+ * panel, sidebar...) as rendered at the time the viewport is set,
1232
+ * equivalent to calling `getViewportOffsets()`. Pass `true` for the
1233
+ * defaults, or options ({@link ViewportOffsetsOptions}) to customize
1234
+ * padding or reserve space for currently-hidden surfaces.
1235
+ *
1236
+ * When both are given, a static side always wins for that side — it
1237
+ * replaces whatever `ui` would yield (including `ui`'s own side overrides,
1238
+ * which — unlike the physical static sides — are RTL-relative). The
1239
+ * remaining sides fall back to the `ui`-derived values.
1240
+ *
1241
+ * @example
1242
+ * { top: 40 } // top 40px, other sides 0
1243
+ * { ui: true } // measured UI + default padding
1244
+ * { ui: { reserve: { stylesPanel: true } } } // + keep space for hidden panel
1245
+ * { top: 40, ui: true } // top exactly 40px, rest from UI
1246
+ */
1247
+ export type ViewportOffsets = Offsets & {
1248
+ ui?: true | ViewportOffsetsOptions;
1249
+ };
1250
+ /**
1251
+ * Value of the `data-viewport-ui-name` attribute, identifying a
1252
+ * conditionally-rendered surface (marked with `data-viewport-ui`) so that
1253
+ * `getViewportOffsets` can reserve space for it while it's hidden (see the
1254
+ * `reserve` option). Whenever a named surface is rendered, its measured
1255
+ * footprint is remembered; reserving uses that remembered footprint, or an
1256
+ * approximate default if the surface hasn't been rendered yet.
1257
+ */
1258
+ export type ViewportUIName = "sidebar" | "stylesPanel";