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