@excalidraw/excalidraw 0.17.1-d2f67e6 → 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-EM6LVGFW.js → chunk-IT7T3AIK.js} +23 -5
- package/dist/browser/dev/excalidraw-assets-dev/chunk-IT7T3AIK.js.map +7 -0
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-B4UMSLQQ.js → chunk-RNHSD5AR.js} +7451 -2098
- package/dist/browser/dev/excalidraw-assets-dev/chunk-RNHSD5AR.js.map +7 -0
- package/dist/browser/dev/excalidraw-assets-dev/{dist-6QVAH5JA.js → dist-DNSPZDOZ.js} +31 -19
- package/dist/browser/dev/excalidraw-assets-dev/dist-DNSPZDOZ.js.map +7 -0
- package/dist/browser/dev/excalidraw-assets-dev/{en-AZFA5HJJ.js → en-XV7OZCPP.js} +6 -2
- package/dist/browser/dev/excalidraw-assets-dev/{image-V7E6IT6R.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 +449 -114
- package/dist/browser/dev/index.css.map +3 -3
- package/dist/browser/dev/index.js +4143 -5956
- 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-7DXALCB2.js → chunk-PDYFZJMS.js} +3 -3
- 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 +40 -50
- 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-EB2MBPAV.json → en-YNVBSAIL.json} +18 -4
- package/dist/dev/index.css +449 -114
- package/dist/dev/index.css.map +3 -3
- package/dist/dev/index.js +21626 -18122
- package/dist/dev/index.js.map +4 -4
- package/dist/excalidraw/actions/actionAddToLibrary.d.ts +9 -3
- package/dist/excalidraw/actions/actionBoundText.d.ts +6 -2
- package/dist/excalidraw/actions/actionCanvas.d.ts +36 -12
- package/dist/excalidraw/actions/actionClipboard.d.ts +22 -7
- package/dist/excalidraw/actions/actionDeleteSelected.d.ts +12 -5
- package/dist/excalidraw/actions/actionDeleteSelected.js +24 -5
- package/dist/excalidraw/actions/actionDuplicateSelection.js +1 -2
- package/dist/excalidraw/actions/actionElementLock.d.ts +6 -2
- package/dist/excalidraw/actions/actionExport.d.ts +27 -9
- package/dist/excalidraw/actions/actionFinalize.d.ts +6 -2
- package/dist/excalidraw/actions/actionFinalize.js +2 -2
- package/dist/excalidraw/actions/actionFlip.js +2 -2
- package/dist/excalidraw/actions/actionFrame.d.ts +12 -4
- package/dist/excalidraw/actions/actionGroup.d.ts +6 -2
- package/dist/excalidraw/actions/actionHistory.js +4 -4
- package/dist/excalidraw/actions/actionLinearEditor.d.ts +3 -1
- package/dist/excalidraw/actions/actionLinearEditor.js +3 -2
- package/dist/excalidraw/actions/actionLink.d.ts +3 -1
- package/dist/excalidraw/actions/actionMenu.d.ts +9 -3
- package/dist/excalidraw/actions/actionNavigate.d.ts +6 -2
- package/dist/excalidraw/actions/actionProperties.d.ts +411 -56
- package/dist/excalidraw/actions/actionProperties.js +383 -58
- package/dist/excalidraw/actions/actionSelectAll.d.ts +3 -1
- package/dist/excalidraw/actions/actionStyles.d.ts +3 -1
- package/dist/excalidraw/actions/actionStyles.js +3 -2
- package/dist/excalidraw/actions/actionToggleGridMode.d.ts +3 -1
- package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +3 -1
- package/dist/excalidraw/actions/actionToggleStats.d.ts +3 -1
- package/dist/excalidraw/actions/actionToggleViewMode.d.ts +3 -1
- package/dist/excalidraw/actions/actionToggleZenMode.d.ts +3 -1
- package/dist/excalidraw/actions/types.d.ts +1 -1
- package/dist/excalidraw/analytics.js +9 -7
- package/dist/excalidraw/appState.d.ts +1 -0
- package/dist/excalidraw/appState.js +9 -1
- package/dist/excalidraw/binaryheap.d.ts +12 -0
- package/dist/excalidraw/binaryheap.js +93 -0
- package/dist/excalidraw/change.d.ts +2 -1
- package/dist/excalidraw/change.js +6 -4
- package/dist/excalidraw/charts.js +0 -10
- package/dist/excalidraw/components/Actions.js +7 -5
- package/dist/excalidraw/components/App.d.ts +5 -9
- package/dist/excalidraw/components/App.js +218 -161
- 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/ColorPicker/ColorPicker.js +47 -79
- package/dist/excalidraw/components/ColorPicker/Picker.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 +1 -1
- package/dist/excalidraw/components/HintViewer.js +6 -3
- package/dist/excalidraw/components/PropertiesPopover.d.ts +15 -0
- package/dist/excalidraw/components/PropertiesPopover.js +31 -0
- package/dist/excalidraw/components/QuickSearch.d.ts +9 -0
- package/dist/excalidraw/components/QuickSearch.js +8 -0
- package/dist/excalidraw/components/ScrollableList.d.ts +9 -0
- package/dist/excalidraw/components/ScrollableList.js +8 -0
- package/dist/excalidraw/components/Stats/Angle.d.ts +7 -3
- package/dist/excalidraw/components/Stats/Angle.js +39 -31
- package/dist/excalidraw/components/Stats/Dimension.d.ts +6 -3
- package/dist/excalidraw/components/Stats/Dimension.js +51 -49
- package/dist/excalidraw/components/Stats/DragInput.d.ts +15 -6
- package/dist/excalidraw/components/Stats/DragInput.js +59 -26
- package/dist/excalidraw/components/Stats/FontSize.d.ts +8 -4
- package/dist/excalidraw/components/Stats/FontSize.js +39 -36
- package/dist/excalidraw/components/Stats/MultiAngle.d.ts +5 -3
- package/dist/excalidraw/components/Stats/MultiAngle.js +43 -34
- package/dist/excalidraw/components/Stats/MultiDimension.d.ts +5 -3
- package/dist/excalidraw/components/Stats/MultiDimension.js +101 -99
- package/dist/excalidraw/components/Stats/MultiFontSize.d.ts +6 -3
- package/dist/excalidraw/components/Stats/MultiFontSize.js +47 -32
- package/dist/excalidraw/components/Stats/MultiPosition.d.ts +3 -1
- package/dist/excalidraw/components/Stats/MultiPosition.js +52 -48
- package/dist/excalidraw/components/Stats/Position.d.ts +5 -1
- package/dist/excalidraw/components/Stats/Position.js +31 -29
- package/dist/excalidraw/components/Stats/index.js +5 -17
- package/dist/excalidraw/components/Stats/utils.d.ts +14 -3
- package/dist/excalidraw/components/Stats/utils.js +48 -9
- package/dist/excalidraw/components/TTDDialog/common.d.ts +2 -2
- package/dist/excalidraw/components/TTDDialog/common.js +3 -7
- package/dist/excalidraw/components/UserList.js +22 -22
- package/dist/excalidraw/components/canvases/StaticCanvas.js +1 -0
- 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/icons.d.ts +4 -0
- package/dist/excalidraw/components/icons.js +7 -0
- 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 +17 -2
- package/dist/excalidraw/constants.js +21 -4
- package/dist/excalidraw/data/reconcile.js +18 -1
- package/dist/excalidraw/data/restore.js +55 -9
- package/dist/excalidraw/data/transform.js +8 -5
- package/dist/excalidraw/element/binding.d.ts +28 -9
- package/dist/excalidraw/element/binding.js +303 -71
- package/dist/excalidraw/element/collision.d.ts +1 -1
- package/dist/excalidraw/element/collision.js +4 -1
- package/dist/excalidraw/element/dragElements.d.ts +2 -2
- package/dist/excalidraw/element/dragElements.js +13 -3
- package/dist/excalidraw/element/embeddable.d.ts +3 -1
- package/dist/excalidraw/element/heading.d.ts +11 -0
- package/dist/excalidraw/element/heading.js +81 -0
- package/dist/excalidraw/element/index.d.ts +1 -1
- package/dist/excalidraw/element/index.js +1 -1
- package/dist/excalidraw/element/linearElementEditor.d.ts +21 -13
- package/dist/excalidraw/element/linearElementEditor.js +133 -56
- package/dist/excalidraw/element/newElement.d.ts +8 -3
- package/dist/excalidraw/element/newElement.js +15 -2
- package/dist/excalidraw/element/resizeElements.d.ts +4 -3
- package/dist/excalidraw/element/resizeElements.js +47 -23
- package/dist/excalidraw/element/routing.d.ts +13 -0
- package/dist/excalidraw/element/routing.js +641 -0
- package/dist/excalidraw/element/textElement.d.ts +3 -26
- package/dist/excalidraw/element/textElement.js +54 -110
- package/dist/excalidraw/element/textWysiwyg.js +39 -47
- package/dist/excalidraw/element/transformHandles.js +7 -2
- package/dist/excalidraw/element/typeChecks.d.ts +5 -2
- package/dist/excalidraw/element/typeChecks.js +17 -0
- package/dist/excalidraw/element/types.d.ts +12 -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 +11 -4
- package/dist/excalidraw/fractionalIndex.js +38 -6
- package/dist/excalidraw/frame.d.ts +1 -1
- package/dist/excalidraw/frame.js +3 -3
- package/dist/excalidraw/history.d.ts +4 -3
- package/dist/excalidraw/history.js +8 -8
- package/dist/excalidraw/index.d.ts +1 -1
- package/dist/excalidraw/index.js +3 -3
- package/dist/excalidraw/locales/en.json +18 -4
- package/dist/excalidraw/math.d.ts +43 -0
- package/dist/excalidraw/math.js +110 -0
- package/dist/excalidraw/mermaid.js +4 -3
- package/dist/excalidraw/renderer/interactiveScene.js +33 -17
- package/dist/excalidraw/renderer/renderElement.d.ts +2 -0
- package/dist/excalidraw/renderer/renderElement.js +74 -54
- package/dist/excalidraw/renderer/staticSvgScene.js +2 -1
- package/dist/excalidraw/scene/Scene.js +9 -3
- package/dist/excalidraw/scene/Shape.js +56 -5
- package/dist/excalidraw/scene/comparisons.d.ts +1 -0
- package/dist/excalidraw/scene/comparisons.js +1 -1
- package/dist/excalidraw/scene/export.d.ts +2 -1
- package/dist/excalidraw/scene/export.js +33 -35
- package/dist/excalidraw/scene/types.d.ts +1 -4
- package/dist/excalidraw/shapes.d.ts +8 -0
- package/dist/excalidraw/shapes.js +57 -0
- package/dist/excalidraw/types.d.ts +8 -3
- package/dist/excalidraw/utils.d.ts +11 -1
- package/dist/excalidraw/utils.js +22 -0
- 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-EB2MBPAV.json → en-YNVBSAIL.json} +18 -4
- package/dist/prod/index.css +1 -1
- package/dist/prod/index.js +49 -53
- package/dist/utils/export.d.ts +2 -1
- package/dist/utils/export.js +2 -1
- package/dist/utils/geometry/geometry.d.ts +2 -1
- package/dist/utils/geometry/geometry.js +5 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/history.ts +9 -2
- 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-B4UMSLQQ.js.map +0 -7
- package/dist/browser/dev/excalidraw-assets-dev/chunk-EM6LVGFW.js.map +0 -7
- package/dist/browser/dev/excalidraw-assets-dev/dist-6QVAH5JA.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-EGOLGOLD.js +0 -55
- package/dist/browser/prod/excalidraw-assets/dist-567JAXHK.js +0 -7
- package/dist/browser/prod/excalidraw-assets/en-6E7MYLWO.js +0 -1
- package/dist/browser/prod/excalidraw-assets/image-SI7BKULC.js +0 -1
- package/dist/dev/Cascadia-CYPE3OJC.woff2 +0 -0
- package/dist/dev/Virgil-UZN6MUT6.woff2 +0 -0
- package/dist/excalidraw/scene/Fonts.d.ts +0 -19
- package/dist/excalidraw/scene/Fonts.js +0 -66
- 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-AZFA5HJJ.js.map → en-XV7OZCPP.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{image-V7E6IT6R.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
|
@@ -4,11 +4,12 @@ import { getCurvePathOps, getElementPointsCoords, getMinMaxXYFromCurvePathOps, }
|
|
|
4
4
|
import { mutateElement } from "./mutateElement";
|
|
5
5
|
import { bindOrUnbindLinearElement, getHoveredElementForBinding, isBindingEnabled, } from "./binding";
|
|
6
6
|
import { tupleToCoors } from "../utils";
|
|
7
|
-
import { isBindingElement } from "./typeChecks";
|
|
7
|
+
import { isBindingElement, isElbowArrow, isFixedPointBinding, } from "./typeChecks";
|
|
8
8
|
import { KEYS, shouldRotateWithDiscreteAngle } from "../keys";
|
|
9
9
|
import { getBoundTextElement, handleBindTextResize } from "./textElement";
|
|
10
10
|
import { DRAGGING_THRESHOLD } from "../constants";
|
|
11
11
|
import { ShapeCache } from "../scene/ShapeCache";
|
|
12
|
+
import { mutateElbowArrow } from "./routing";
|
|
12
13
|
const editorMidPointsCache = { version: null, points: [], zoom: null };
|
|
13
14
|
export class LinearElementEditor {
|
|
14
15
|
elementId;
|
|
@@ -25,7 +26,9 @@ export class LinearElementEditor {
|
|
|
25
26
|
segmentMidPointHoveredCoords;
|
|
26
27
|
constructor(element) {
|
|
27
28
|
this.elementId = element.id;
|
|
28
|
-
|
|
29
|
+
if (!arePointsEqual(element.points[0], [0, 0])) {
|
|
30
|
+
console.error("Linear element is not normalized", Error().stack);
|
|
31
|
+
}
|
|
29
32
|
this.selectedPointsIndices = null;
|
|
30
33
|
this.lastUncommittedPoint = null;
|
|
31
34
|
this.isDragging = false;
|
|
@@ -35,6 +38,7 @@ export class LinearElementEditor {
|
|
|
35
38
|
this.pointerDownState = {
|
|
36
39
|
prevSelectedPointsIndices: null,
|
|
37
40
|
lastClickedPoint: -1,
|
|
41
|
+
lastClickedIsEndPoint: false,
|
|
38
42
|
origin: null,
|
|
39
43
|
segmentMidpoint: {
|
|
40
44
|
value: null,
|
|
@@ -73,7 +77,8 @@ export class LinearElementEditor {
|
|
|
73
77
|
}
|
|
74
78
|
const [selectionX1, selectionY1, selectionX2, selectionY2] = getElementAbsoluteCoords(appState.draggingElement, elementsMap);
|
|
75
79
|
const pointsSceneCoords = LinearElementEditor.getPointsGlobalCoordinates(element, elementsMap);
|
|
76
|
-
const nextSelectedPoints = pointsSceneCoords
|
|
80
|
+
const nextSelectedPoints = pointsSceneCoords
|
|
81
|
+
.reduce((acc, point, index) => {
|
|
77
82
|
if ((point[0] >= selectionX1 &&
|
|
78
83
|
point[0] <= selectionX2 &&
|
|
79
84
|
point[1] >= selectionY1 &&
|
|
@@ -82,7 +87,15 @@ export class LinearElementEditor {
|
|
|
82
87
|
acc.push(index);
|
|
83
88
|
}
|
|
84
89
|
return acc;
|
|
85
|
-
}, [])
|
|
90
|
+
}, [])
|
|
91
|
+
.filter((index) => {
|
|
92
|
+
if (isElbowArrow(element) &&
|
|
93
|
+
index !== 0 &&
|
|
94
|
+
index !== element.points.length - 1) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
});
|
|
86
99
|
setState({
|
|
87
100
|
editingLinearElement: {
|
|
88
101
|
...editingLinearElement,
|
|
@@ -93,17 +106,35 @@ export class LinearElementEditor {
|
|
|
93
106
|
});
|
|
94
107
|
}
|
|
95
108
|
/** @returns whether point was dragged */
|
|
96
|
-
static handlePointDragging(event, appState, scenePointerX, scenePointerY, maybeSuggestBinding, linearElementEditor,
|
|
109
|
+
static handlePointDragging(event, appState, scenePointerX, scenePointerY, maybeSuggestBinding, linearElementEditor, scene) {
|
|
97
110
|
if (!linearElementEditor) {
|
|
98
111
|
return false;
|
|
99
112
|
}
|
|
100
|
-
const {
|
|
113
|
+
const { elementId } = linearElementEditor;
|
|
114
|
+
const elementsMap = scene.getNonDeletedElementsMap();
|
|
101
115
|
const element = LinearElementEditor.getElement(elementId, elementsMap);
|
|
102
116
|
if (!element) {
|
|
103
117
|
return false;
|
|
104
118
|
}
|
|
119
|
+
if (isElbowArrow(element) &&
|
|
120
|
+
!linearElementEditor.pointerDownState.lastClickedIsEndPoint &&
|
|
121
|
+
linearElementEditor.pointerDownState.lastClickedPoint !== 0) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
const selectedPointsIndices = isElbowArrow(element)
|
|
125
|
+
? linearElementEditor.selectedPointsIndices
|
|
126
|
+
?.reduce((startEnd, index) => (index === 0
|
|
127
|
+
? [0, startEnd[1]]
|
|
128
|
+
: [startEnd[0], element.points.length - 1]), [false, false])
|
|
129
|
+
.filter((idx) => typeof idx === "number")
|
|
130
|
+
: linearElementEditor.selectedPointsIndices;
|
|
131
|
+
const lastClickedPoint = isElbowArrow(element)
|
|
132
|
+
? linearElementEditor.pointerDownState.lastClickedPoint > 0
|
|
133
|
+
? element.points.length - 1
|
|
134
|
+
: 0
|
|
135
|
+
: linearElementEditor.pointerDownState.lastClickedPoint;
|
|
105
136
|
// point that's being dragged (out of all selected points)
|
|
106
|
-
const draggingPoint = element.points[
|
|
137
|
+
const draggingPoint = element.points[lastClickedPoint];
|
|
107
138
|
if (selectedPointsIndices && draggingPoint) {
|
|
108
139
|
if (shouldRotateWithDiscreteAngle(event) &&
|
|
109
140
|
selectedPointsIndices.length === 1 &&
|
|
@@ -115,18 +146,16 @@ export class LinearElementEditor {
|
|
|
115
146
|
{
|
|
116
147
|
index: selectedIndex,
|
|
117
148
|
point: [width + referencePoint[0], height + referencePoint[1]],
|
|
118
|
-
isDragging: selectedIndex ===
|
|
119
|
-
linearElementEditor.pointerDownState.lastClickedPoint,
|
|
149
|
+
isDragging: selectedIndex === lastClickedPoint,
|
|
120
150
|
},
|
|
121
|
-
]);
|
|
151
|
+
], scene);
|
|
122
152
|
}
|
|
123
153
|
else {
|
|
124
154
|
const newDraggingPointPosition = LinearElementEditor.createPointAt(element, elementsMap, scenePointerX - linearElementEditor.pointerOffset.x, scenePointerY - linearElementEditor.pointerOffset.y, event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize);
|
|
125
155
|
const deltaX = newDraggingPointPosition[0] - draggingPoint[0];
|
|
126
156
|
const deltaY = newDraggingPointPosition[1] - draggingPoint[1];
|
|
127
157
|
LinearElementEditor.movePoints(element, selectedPointsIndices.map((pointIndex) => {
|
|
128
|
-
const newPointPosition = pointIndex ===
|
|
129
|
-
linearElementEditor.pointerDownState.lastClickedPoint
|
|
158
|
+
const newPointPosition = pointIndex === lastClickedPoint
|
|
130
159
|
? LinearElementEditor.createPointAt(element, elementsMap, scenePointerX - linearElementEditor.pointerOffset.x, scenePointerY - linearElementEditor.pointerOffset.y, event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize)
|
|
131
160
|
: [
|
|
132
161
|
element.points[pointIndex][0] + deltaX,
|
|
@@ -135,10 +164,9 @@ export class LinearElementEditor {
|
|
|
135
164
|
return {
|
|
136
165
|
index: pointIndex,
|
|
137
166
|
point: newPointPosition,
|
|
138
|
-
isDragging: pointIndex ===
|
|
139
|
-
linearElementEditor.pointerDownState.lastClickedPoint,
|
|
167
|
+
isDragging: pointIndex === lastClickedPoint,
|
|
140
168
|
};
|
|
141
|
-
}));
|
|
169
|
+
}), scene);
|
|
142
170
|
}
|
|
143
171
|
const boundTextElement = getBoundTextElement(element, elementsMap);
|
|
144
172
|
if (boundTextElement) {
|
|
@@ -163,8 +191,9 @@ export class LinearElementEditor {
|
|
|
163
191
|
}
|
|
164
192
|
return false;
|
|
165
193
|
}
|
|
166
|
-
static handlePointerUp(event, editingLinearElement, appState,
|
|
167
|
-
const elementsMap =
|
|
194
|
+
static handlePointerUp(event, editingLinearElement, appState, scene) {
|
|
195
|
+
const elementsMap = scene.getNonDeletedElementsMap();
|
|
196
|
+
const elements = scene.getNonDeletedElements();
|
|
168
197
|
const { elementId, selectedPointsIndices, isDragging, pointerDownState } = editingLinearElement;
|
|
169
198
|
const element = LinearElementEditor.getElement(elementId, elementsMap);
|
|
170
199
|
if (!element) {
|
|
@@ -183,10 +212,10 @@ export class LinearElementEditor {
|
|
|
183
212
|
? element.points[element.points.length - 1]
|
|
184
213
|
: element.points[0],
|
|
185
214
|
},
|
|
186
|
-
]);
|
|
215
|
+
], scene);
|
|
187
216
|
}
|
|
188
217
|
const bindingElement = isBindingEnabled(appState)
|
|
189
|
-
? getHoveredElementForBinding(tupleToCoors(LinearElementEditor.getPointAtIndexGlobalCoordinates(element, selectedPoint, elementsMap)),
|
|
218
|
+
? getHoveredElementForBinding(tupleToCoors(LinearElementEditor.getPointAtIndexGlobalCoordinates(element, selectedPoint, elementsMap)), elements, elementsMap)
|
|
190
219
|
: null;
|
|
191
220
|
bindings[selectedPoint === 0 ? "startBindingElement" : "endBindingElement"] = bindingElement;
|
|
192
221
|
}
|
|
@@ -314,8 +343,9 @@ export class LinearElementEditor {
|
|
|
314
343
|
}
|
|
315
344
|
return -1;
|
|
316
345
|
}
|
|
317
|
-
static handlePointerDown(event, appState, store, scenePointer, linearElementEditor,
|
|
318
|
-
const elementsMap =
|
|
346
|
+
static handlePointerDown(event, appState, store, scenePointer, linearElementEditor, scene) {
|
|
347
|
+
const elementsMap = scene.getNonDeletedElementsMap();
|
|
348
|
+
const elements = scene.getNonDeletedElements();
|
|
319
349
|
const ret = {
|
|
320
350
|
didAddPoint: false,
|
|
321
351
|
hitElement: null,
|
|
@@ -335,7 +365,8 @@ export class LinearElementEditor {
|
|
|
335
365
|
segmentMidpointIndex = LinearElementEditor.getSegmentMidPointIndex(linearElementEditor, appState, segmentMidpoint, elementsMap);
|
|
336
366
|
}
|
|
337
367
|
if (event.altKey && appState.editingLinearElement) {
|
|
338
|
-
if (linearElementEditor.lastUncommittedPoint == null
|
|
368
|
+
if (linearElementEditor.lastUncommittedPoint == null ||
|
|
369
|
+
!isElbowArrow(element)) {
|
|
339
370
|
mutateElement(element, {
|
|
340
371
|
points: [
|
|
341
372
|
...element.points,
|
|
@@ -350,6 +381,7 @@ export class LinearElementEditor {
|
|
|
350
381
|
pointerDownState: {
|
|
351
382
|
prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,
|
|
352
383
|
lastClickedPoint: -1,
|
|
384
|
+
lastClickedIsEndPoint: false,
|
|
353
385
|
origin: { x: scenePointer.x, y: scenePointer.y },
|
|
354
386
|
segmentMidpoint: {
|
|
355
387
|
value: segmentMidpoint,
|
|
@@ -359,7 +391,7 @@ export class LinearElementEditor {
|
|
|
359
391
|
},
|
|
360
392
|
selectedPointsIndices: [element.points.length - 1],
|
|
361
393
|
lastUncommittedPoint: null,
|
|
362
|
-
endBindingElement: getHoveredElementForBinding(scenePointer,
|
|
394
|
+
endBindingElement: getHoveredElementForBinding(scenePointer, elements, elementsMap),
|
|
363
395
|
};
|
|
364
396
|
ret.didAddPoint = true;
|
|
365
397
|
return ret;
|
|
@@ -378,7 +410,7 @@ export class LinearElementEditor {
|
|
|
378
410
|
// the point).
|
|
379
411
|
const { startBindingElement, endBindingElement } = linearElementEditor;
|
|
380
412
|
if (isBindingEnabled(appState) && isBindingElement(element)) {
|
|
381
|
-
bindOrUnbindLinearElement(element, startBindingElement, endBindingElement, elementsMap);
|
|
413
|
+
bindOrUnbindLinearElement(element, startBindingElement, endBindingElement, elementsMap, scene);
|
|
382
414
|
}
|
|
383
415
|
}
|
|
384
416
|
const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
|
|
@@ -400,6 +432,7 @@ export class LinearElementEditor {
|
|
|
400
432
|
pointerDownState: {
|
|
401
433
|
prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,
|
|
402
434
|
lastClickedPoint: clickedPointIndex,
|
|
435
|
+
lastClickedIsEndPoint: clickedPointIndex === element.points.length - 1,
|
|
403
436
|
origin: { x: scenePointer.x, y: scenePointer.y },
|
|
404
437
|
segmentMidpoint: {
|
|
405
438
|
value: segmentMidpoint,
|
|
@@ -426,11 +459,12 @@ export class LinearElementEditor {
|
|
|
426
459
|
}
|
|
427
460
|
return arePointsEqual(point1, point2);
|
|
428
461
|
}
|
|
429
|
-
static handlePointerMove(event, scenePointerX, scenePointerY, appState,
|
|
462
|
+
static handlePointerMove(event, scenePointerX, scenePointerY, appState, scene) {
|
|
430
463
|
if (!appState.editingLinearElement) {
|
|
431
464
|
return null;
|
|
432
465
|
}
|
|
433
466
|
const { elementId, lastUncommittedPoint } = appState.editingLinearElement;
|
|
467
|
+
const elementsMap = scene.getNonDeletedElementsMap();
|
|
434
468
|
const element = LinearElementEditor.getElement(elementId, elementsMap);
|
|
435
469
|
if (!element) {
|
|
436
470
|
return appState.editingLinearElement;
|
|
@@ -439,7 +473,7 @@ export class LinearElementEditor {
|
|
|
439
473
|
const lastPoint = points[points.length - 1];
|
|
440
474
|
if (!event.altKey) {
|
|
441
475
|
if (lastPoint === lastUncommittedPoint) {
|
|
442
|
-
LinearElementEditor.deletePoints(element, [points.length - 1]);
|
|
476
|
+
LinearElementEditor.deletePoints(element, [points.length - 1], scene);
|
|
443
477
|
}
|
|
444
478
|
return {
|
|
445
479
|
...appState.editingLinearElement,
|
|
@@ -456,7 +490,9 @@ export class LinearElementEditor {
|
|
|
456
490
|
];
|
|
457
491
|
}
|
|
458
492
|
else {
|
|
459
|
-
newPoint = LinearElementEditor.createPointAt(element, elementsMap, scenePointerX - appState.editingLinearElement.pointerOffset.x, scenePointerY - appState.editingLinearElement.pointerOffset.y, event[KEYS.CTRL_OR_CMD]
|
|
493
|
+
newPoint = LinearElementEditor.createPointAt(element, elementsMap, scenePointerX - appState.editingLinearElement.pointerOffset.x, scenePointerY - appState.editingLinearElement.pointerOffset.y, event[KEYS.CTRL_OR_CMD] || isElbowArrow(element)
|
|
494
|
+
? null
|
|
495
|
+
: appState.gridSize);
|
|
460
496
|
}
|
|
461
497
|
if (lastPoint === lastUncommittedPoint) {
|
|
462
498
|
LinearElementEditor.movePoints(element, [
|
|
@@ -464,10 +500,10 @@ export class LinearElementEditor {
|
|
|
464
500
|
index: element.points.length - 1,
|
|
465
501
|
point: newPoint,
|
|
466
502
|
},
|
|
467
|
-
]);
|
|
503
|
+
], scene);
|
|
468
504
|
}
|
|
469
505
|
else {
|
|
470
|
-
LinearElementEditor.addPoints(element, appState, [{ point: newPoint }]);
|
|
506
|
+
LinearElementEditor.addPoints(element, appState, [{ point: newPoint }], scene);
|
|
471
507
|
}
|
|
472
508
|
return {
|
|
473
509
|
...appState.editingLinearElement,
|
|
@@ -509,6 +545,10 @@ export class LinearElementEditor {
|
|
|
509
545
|
: rotate(x, y, cx, cy, element.angle);
|
|
510
546
|
}
|
|
511
547
|
static pointFromAbsoluteCoords(element, absoluteCoords, elementsMap) {
|
|
548
|
+
if (isElbowArrow(element)) {
|
|
549
|
+
// No rotation for elbow arrows
|
|
550
|
+
return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];
|
|
551
|
+
}
|
|
512
552
|
const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
|
|
513
553
|
const cx = (x1 + x2) / 2;
|
|
514
554
|
const cy = (y1 + y2) / 2;
|
|
@@ -561,11 +601,12 @@ export class LinearElementEditor {
|
|
|
561
601
|
static normalizePoints(element) {
|
|
562
602
|
mutateElement(element, LinearElementEditor.getNormalizedPoints(element));
|
|
563
603
|
}
|
|
564
|
-
static duplicateSelectedPoints(appState,
|
|
604
|
+
static duplicateSelectedPoints(appState, scene) {
|
|
565
605
|
if (!appState.editingLinearElement) {
|
|
566
606
|
return false;
|
|
567
607
|
}
|
|
568
608
|
const { selectedPointsIndices, elementId } = appState.editingLinearElement;
|
|
609
|
+
const elementsMap = scene.getNonDeletedElementsMap();
|
|
569
610
|
const element = LinearElementEditor.getElement(elementId, elementsMap);
|
|
570
611
|
if (!element || selectedPointsIndices === null) {
|
|
571
612
|
return false;
|
|
@@ -601,7 +642,7 @@ export class LinearElementEditor {
|
|
|
601
642
|
index: element.points.length - 1,
|
|
602
643
|
point: [lastPoint[0] + 30, lastPoint[1] + 30],
|
|
603
644
|
},
|
|
604
|
-
]);
|
|
645
|
+
], scene);
|
|
605
646
|
}
|
|
606
647
|
return {
|
|
607
648
|
appState: {
|
|
@@ -613,7 +654,7 @@ export class LinearElementEditor {
|
|
|
613
654
|
},
|
|
614
655
|
};
|
|
615
656
|
}
|
|
616
|
-
static deletePoints(element, pointIndices) {
|
|
657
|
+
static deletePoints(element, pointIndices, scene) {
|
|
617
658
|
let offsetX = 0;
|
|
618
659
|
let offsetY = 0;
|
|
619
660
|
const isDeletingOriginPoint = pointIndices.includes(0);
|
|
@@ -634,15 +675,15 @@ export class LinearElementEditor {
|
|
|
634
675
|
}
|
|
635
676
|
return acc;
|
|
636
677
|
}, []);
|
|
637
|
-
LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);
|
|
678
|
+
LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY, scene);
|
|
638
679
|
}
|
|
639
|
-
static addPoints(element, appState, targetPoints) {
|
|
680
|
+
static addPoints(element, appState, targetPoints, scene) {
|
|
640
681
|
const offsetX = 0;
|
|
641
682
|
const offsetY = 0;
|
|
642
683
|
const nextPoints = [...element.points, ...targetPoints.map((x) => x.point)];
|
|
643
|
-
LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);
|
|
684
|
+
LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY, scene);
|
|
644
685
|
}
|
|
645
|
-
static movePoints(element, targetPoints, otherUpdates) {
|
|
686
|
+
static movePoints(element, targetPoints, scene, otherUpdates, options) {
|
|
646
687
|
const { points } = element;
|
|
647
688
|
// in case we're moving start point, instead of modifying its position
|
|
648
689
|
// which would break the invariant of it being at [0,0], we move
|
|
@@ -661,21 +702,31 @@ export class LinearElementEditor {
|
|
|
661
702
|
const nextPoints = points.map((point, idx) => {
|
|
662
703
|
const selectedPointData = targetPoints.find((p) => p.index === idx);
|
|
663
704
|
if (selectedPointData) {
|
|
664
|
-
if (
|
|
705
|
+
if (selectedPointData.index === 0) {
|
|
665
706
|
return point;
|
|
666
707
|
}
|
|
667
708
|
const deltaX = selectedPointData.point[0] - points[selectedPointData.index][0];
|
|
668
709
|
const deltaY = selectedPointData.point[1] - points[selectedPointData.index][1];
|
|
669
|
-
return [
|
|
710
|
+
return [
|
|
711
|
+
point[0] + deltaX - offsetX,
|
|
712
|
+
point[1] + deltaY - offsetY,
|
|
713
|
+
];
|
|
670
714
|
}
|
|
671
715
|
return offsetX || offsetY
|
|
672
716
|
? [point[0] - offsetX, point[1] - offsetY]
|
|
673
717
|
: point;
|
|
674
718
|
});
|
|
675
|
-
LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY, otherUpdates
|
|
719
|
+
LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY, scene, otherUpdates, {
|
|
720
|
+
isDragging: targetPoints.reduce((dragging, targetPoint) => dragging || targetPoint.isDragging === true, false),
|
|
721
|
+
changedElements: options?.changedElements,
|
|
722
|
+
});
|
|
676
723
|
}
|
|
677
724
|
static shouldAddMidpoint(linearElementEditor, pointerCoords, appState, elementsMap) {
|
|
678
725
|
const element = LinearElementEditor.getElement(linearElementEditor.elementId, elementsMap);
|
|
726
|
+
// Elbow arrows don't allow midpoints
|
|
727
|
+
if (element && isElbowArrow(element)) {
|
|
728
|
+
return false;
|
|
729
|
+
}
|
|
679
730
|
if (!element) {
|
|
680
731
|
return false;
|
|
681
732
|
}
|
|
@@ -704,7 +755,7 @@ export class LinearElementEditor {
|
|
|
704
755
|
pointerDownState: linearElementEditor.pointerDownState,
|
|
705
756
|
selectedPointsIndices: linearElementEditor.selectedPointsIndices,
|
|
706
757
|
};
|
|
707
|
-
const midpoint = LinearElementEditor.createPointAt(element, elementsMap, pointerCoords.x, pointerCoords.y, snapToGrid ? appState.gridSize : null);
|
|
758
|
+
const midpoint = LinearElementEditor.createPointAt(element, elementsMap, pointerCoords.x, pointerCoords.y, snapToGrid && !isElbowArrow(element) ? appState.gridSize : null);
|
|
708
759
|
const points = [
|
|
709
760
|
...element.points.slice(0, segmentMidpoint.index),
|
|
710
761
|
midpoint,
|
|
@@ -724,25 +775,51 @@ export class LinearElementEditor {
|
|
|
724
775
|
ret.selectedPointsIndices = [segmentMidpoint.index];
|
|
725
776
|
return ret;
|
|
726
777
|
}
|
|
727
|
-
static _updatePoints(element, nextPoints, offsetX, offsetY, otherUpdates) {
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
778
|
+
static _updatePoints(element, nextPoints, offsetX, offsetY, scene, otherUpdates, options) {
|
|
779
|
+
if (isElbowArrow(element)) {
|
|
780
|
+
const bindings = {};
|
|
781
|
+
if (otherUpdates?.startBinding !== undefined) {
|
|
782
|
+
bindings.startBinding =
|
|
783
|
+
otherUpdates.startBinding !== null &&
|
|
784
|
+
isFixedPointBinding(otherUpdates.startBinding)
|
|
785
|
+
? otherUpdates.startBinding
|
|
786
|
+
: null;
|
|
787
|
+
}
|
|
788
|
+
if (otherUpdates?.endBinding !== undefined) {
|
|
789
|
+
bindings.endBinding =
|
|
790
|
+
otherUpdates.endBinding !== null &&
|
|
791
|
+
isFixedPointBinding(otherUpdates.endBinding)
|
|
792
|
+
? otherUpdates.endBinding
|
|
793
|
+
: null;
|
|
794
|
+
}
|
|
795
|
+
mutateElbowArrow(element, scene, nextPoints, [offsetX, offsetY], bindings, options);
|
|
796
|
+
}
|
|
797
|
+
else {
|
|
798
|
+
const nextCoords = getElementPointsCoords(element, nextPoints);
|
|
799
|
+
const prevCoords = getElementPointsCoords(element, element.points);
|
|
800
|
+
const nextCenterX = (nextCoords[0] + nextCoords[2]) / 2;
|
|
801
|
+
const nextCenterY = (nextCoords[1] + nextCoords[3]) / 2;
|
|
802
|
+
const prevCenterX = (prevCoords[0] + prevCoords[2]) / 2;
|
|
803
|
+
const prevCenterY = (prevCoords[1] + prevCoords[3]) / 2;
|
|
804
|
+
const dX = prevCenterX - nextCenterX;
|
|
805
|
+
const dY = prevCenterY - nextCenterY;
|
|
806
|
+
const rotated = rotate(offsetX, offsetY, dX, dY, element.angle);
|
|
807
|
+
mutateElement(element, {
|
|
808
|
+
...otherUpdates,
|
|
809
|
+
points: nextPoints,
|
|
810
|
+
x: element.x + rotated[0],
|
|
811
|
+
y: element.y + rotated[1],
|
|
812
|
+
});
|
|
813
|
+
}
|
|
743
814
|
}
|
|
744
815
|
static _getShiftLockedDelta(element, elementsMap, referencePoint, scenePointer, gridSize) {
|
|
745
816
|
const referencePointCoords = LinearElementEditor.getPointGlobalCoordinates(element, referencePoint, elementsMap);
|
|
817
|
+
if (isElbowArrow(element)) {
|
|
818
|
+
return [
|
|
819
|
+
scenePointer[0] - referencePointCoords[0],
|
|
820
|
+
scenePointer[1] - referencePointCoords[1],
|
|
821
|
+
];
|
|
822
|
+
}
|
|
746
823
|
const [gridX, gridY] = getGridPoint(scenePointer[0], scenePointer[1], gridSize);
|
|
747
824
|
const { width, height } = getLockedLinearCursorAlignSize(referencePointCoords[0], referencePointCoords[1], gridX, gridY);
|
|
748
825
|
return rotatePoint([width, height], [0, 0], -element.angle);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExcalidrawElement, ExcalidrawImageElement, ExcalidrawTextElement, ExcalidrawLinearElement, ExcalidrawGenericElement, NonDeleted, TextAlign, GroupId, VerticalAlign, Arrowhead, ExcalidrawFreeDrawElement, FontFamilyValues, ExcalidrawTextContainer, ExcalidrawFrameElement, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawIframeElement, ElementsMap } from "./types";
|
|
1
|
+
import type { ExcalidrawElement, ExcalidrawImageElement, ExcalidrawTextElement, ExcalidrawLinearElement, ExcalidrawGenericElement, NonDeleted, TextAlign, GroupId, VerticalAlign, Arrowhead, ExcalidrawFreeDrawElement, FontFamilyValues, ExcalidrawTextContainer, ExcalidrawFrameElement, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawIframeElement, ElementsMap, ExcalidrawArrowElement } from "./types";
|
|
2
2
|
import type { AppState } from "../types";
|
|
3
3
|
import type { MarkOptional, Mutable } from "../utility-types";
|
|
4
4
|
export type ElementConstructorOpts = MarkOptional<Omit<ExcalidrawGenericElement, "id" | "type" | "isDeleted" | "updated">, "width" | "height" | "angle" | "groupIds" | "frameId" | "index" | "boundElements" | "seed" | "version" | "versionNonce" | "link" | "strokeStyle" | "fillStyle" | "strokeColor" | "backgroundColor" | "roughness" | "strokeWidth" | "roundness" | "locked" | "opacity" | "customData">;
|
|
@@ -43,10 +43,15 @@ export declare const newFreeDrawElement: (opts: {
|
|
|
43
43
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawFreeDrawElement>;
|
|
44
44
|
export declare const newLinearElement: (opts: {
|
|
45
45
|
type: ExcalidrawLinearElement["type"];
|
|
46
|
-
startArrowhead?: Arrowhead | null;
|
|
47
|
-
endArrowhead?: Arrowhead | null;
|
|
48
46
|
points?: ExcalidrawLinearElement["points"];
|
|
49
47
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawLinearElement>;
|
|
48
|
+
export declare const newArrowElement: (opts: {
|
|
49
|
+
type: ExcalidrawArrowElement["type"];
|
|
50
|
+
startArrowhead?: Arrowhead | null;
|
|
51
|
+
endArrowhead?: Arrowhead | null;
|
|
52
|
+
points?: ExcalidrawArrowElement["points"];
|
|
53
|
+
elbowed?: boolean;
|
|
54
|
+
} & ElementConstructorOpts) => NonDeleted<ExcalidrawArrowElement>;
|
|
50
55
|
export declare const newImageElement: (opts: {
|
|
51
56
|
type: ExcalidrawImageElement["type"];
|
|
52
57
|
status?: ExcalidrawImageElement["status"];
|
|
@@ -5,8 +5,9 @@ import { getNewGroupIdsForDuplication } from "../groups";
|
|
|
5
5
|
import { getElementAbsoluteCoords } from ".";
|
|
6
6
|
import { adjustXYWithRotation } from "../math";
|
|
7
7
|
import { getResizedElementAbsoluteCoords } from "./bounds";
|
|
8
|
-
import { measureText, normalizeText, wrapText, getBoundTextMaxWidth,
|
|
8
|
+
import { measureText, normalizeText, wrapText, getBoundTextMaxWidth, } from "./textElement";
|
|
9
9
|
import { DEFAULT_ELEMENT_PROPS, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_TEXT_ALIGN, DEFAULT_VERTICAL_ALIGN, VERTICAL_ALIGN, } from "../constants";
|
|
10
|
+
import { getLineHeight } from "../fonts";
|
|
10
11
|
const _newElementBase = (type, { x, y, strokeColor = DEFAULT_ELEMENT_PROPS.strokeColor, backgroundColor = DEFAULT_ELEMENT_PROPS.backgroundColor, fillStyle = DEFAULT_ELEMENT_PROPS.fillStyle, strokeWidth = DEFAULT_ELEMENT_PROPS.strokeWidth, strokeStyle = DEFAULT_ELEMENT_PROPS.strokeStyle, roughness = DEFAULT_ELEMENT_PROPS.roughness, opacity = DEFAULT_ELEMENT_PROPS.opacity, width = 0, height = 0, angle = 0, groupIds = [], frameId = null, index = null, roundness = null, boundElements = null, link = null, locked = DEFAULT_ELEMENT_PROPS.locked, ...rest }) => {
|
|
11
12
|
// assign type to guard against excess properties
|
|
12
13
|
const element = {
|
|
@@ -79,7 +80,7 @@ const getTextElementPositionOffsets = (opts, metrics) => {
|
|
|
79
80
|
export const newTextElement = (opts) => {
|
|
80
81
|
const fontFamily = opts.fontFamily || DEFAULT_FONT_FAMILY;
|
|
81
82
|
const fontSize = opts.fontSize || DEFAULT_FONT_SIZE;
|
|
82
|
-
const lineHeight = opts.lineHeight ||
|
|
83
|
+
const lineHeight = opts.lineHeight || getLineHeight(fontFamily);
|
|
83
84
|
const text = normalizeText(opts.text);
|
|
84
85
|
const metrics = measureText(text, getFontString({ fontFamily, fontSize }), lineHeight);
|
|
85
86
|
const textAlign = opts.textAlign || DEFAULT_TEXT_ALIGN;
|
|
@@ -167,6 +168,17 @@ export const newFreeDrawElement = (opts) => {
|
|
|
167
168
|
};
|
|
168
169
|
};
|
|
169
170
|
export const newLinearElement = (opts) => {
|
|
171
|
+
return {
|
|
172
|
+
..._newElementBase(opts.type, opts),
|
|
173
|
+
points: opts.points || [],
|
|
174
|
+
lastCommittedPoint: null,
|
|
175
|
+
startBinding: null,
|
|
176
|
+
endBinding: null,
|
|
177
|
+
startArrowhead: null,
|
|
178
|
+
endArrowhead: null,
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
export const newArrowElement = (opts) => {
|
|
170
182
|
return {
|
|
171
183
|
..._newElementBase(opts.type, opts),
|
|
172
184
|
points: opts.points || [],
|
|
@@ -175,6 +187,7 @@ export const newLinearElement = (opts) => {
|
|
|
175
187
|
endBinding: null,
|
|
176
188
|
startArrowhead: opts.startArrowhead || null,
|
|
177
189
|
endArrowhead: opts.endArrowhead || null,
|
|
190
|
+
elbowed: opts.elbowed || false,
|
|
178
191
|
};
|
|
179
192
|
};
|
|
180
193
|
export const newImageElement = (opts) => {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { ExcalidrawLinearElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, NonDeleted, ElementsMap } from "./types";
|
|
2
2
|
import type { MaybeTransformHandleType, TransformHandleDirection } from "./transformHandles";
|
|
3
3
|
import type { PointerDownState } from "../types";
|
|
4
|
+
import Scene from "../scene/Scene";
|
|
4
5
|
export declare const normalizeAngle: (angle: number) => number;
|
|
5
|
-
export declare const transformElements: (originalElements: PointerDownState["originalElements"], transformHandleType: MaybeTransformHandleType, selectedElements: readonly NonDeletedExcalidrawElement[], elementsMap: ElementsMap, shouldRotateWithDiscreteAngle: boolean, shouldResizeFromCenter: boolean, shouldMaintainAspectRatio: boolean, pointerX: number, pointerY: number, centerX: number, centerY: number) => boolean;
|
|
6
|
+
export declare const transformElements: (originalElements: PointerDownState["originalElements"], transformHandleType: MaybeTransformHandleType, selectedElements: readonly NonDeletedExcalidrawElement[], elementsMap: ElementsMap, shouldRotateWithDiscreteAngle: boolean, shouldResizeFromCenter: boolean, shouldMaintainAspectRatio: boolean, pointerX: number, pointerY: number, centerX: number, centerY: number, scene: Scene) => boolean;
|
|
6
7
|
export declare const rescalePointsInElement: (element: NonDeletedExcalidrawElement, width: number, height: number, normalizePoints: boolean) => {
|
|
7
8
|
points: (readonly [number, number])[];
|
|
8
9
|
} | {
|
|
@@ -11,7 +12,7 @@ export declare const rescalePointsInElement: (element: NonDeletedExcalidrawEleme
|
|
|
11
12
|
export declare const measureFontSizeFromWidth: (element: NonDeleted<ExcalidrawTextElement>, elementsMap: ElementsMap, nextWidth: number) => {
|
|
12
13
|
size: number;
|
|
13
14
|
} | null;
|
|
14
|
-
export declare const resizeSingleElement: (originalElements: PointerDownState["originalElements"], shouldMaintainAspectRatio: boolean, element: NonDeletedExcalidrawElement, elementsMap: ElementsMap, transformHandleDirection: TransformHandleDirection, shouldResizeFromCenter: boolean, pointerX: number, pointerY: number) => void;
|
|
15
|
-
export declare const resizeMultipleElements: (originalElements: PointerDownState["originalElements"], selectedElements: readonly NonDeletedExcalidrawElement[], elementsMap: ElementsMap, transformHandleType: TransformHandleDirection, shouldResizeFromCenter: boolean, shouldMaintainAspectRatio: boolean, pointerX: number, pointerY: number) => void;
|
|
15
|
+
export declare const resizeSingleElement: (originalElements: PointerDownState["originalElements"], shouldMaintainAspectRatio: boolean, element: NonDeletedExcalidrawElement, elementsMap: ElementsMap, transformHandleDirection: TransformHandleDirection, shouldResizeFromCenter: boolean, pointerX: number, pointerY: number, scene: Scene) => void;
|
|
16
|
+
export declare const resizeMultipleElements: (originalElements: PointerDownState["originalElements"], selectedElements: readonly NonDeletedExcalidrawElement[], elementsMap: ElementsMap, transformHandleType: TransformHandleDirection, shouldResizeFromCenter: boolean, shouldMaintainAspectRatio: boolean, pointerX: number, pointerY: number, scene: Scene) => void;
|
|
16
17
|
export declare const getResizeOffsetXY: (transformHandleType: MaybeTransformHandleType, selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap, x: number, y: number) => [number, number];
|
|
17
18
|
export declare const getResizeArrowDirection: (transformHandleType: MaybeTransformHandleType, element: NonDeleted<ExcalidrawLinearElement>) => "origin" | "end";
|