@excalidraw/element 0.18.0-4a5c9e9 → 0.18.0-4ce38fb
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/dist/dev/index.js +11944 -8172
- package/dist/dev/index.js.map +4 -4
- package/dist/prod/index.js +21 -20
- package/dist/types/common/src/colors.d.ts +23 -1
- package/dist/types/common/src/constants.d.ts +66 -7
- package/dist/types/common/src/keys.d.ts +4 -0
- package/dist/types/common/src/points.d.ts +1 -1
- package/dist/types/common/src/random.d.ts +7 -0
- package/dist/types/common/src/utils.d.ts +6 -43
- package/dist/types/element/src/Scene.d.ts +7 -5
- package/dist/types/element/src/align.d.ts +2 -2
- package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
- package/dist/types/element/src/arrows/focus.d.ts +5 -2
- package/dist/types/element/src/binding.d.ts +28 -13
- package/dist/types/element/src/bounds.d.ts +22 -7
- package/dist/types/element/src/bucketFill.d.ts +110 -0
- package/dist/types/element/src/collision.d.ts +14 -5
- package/dist/types/element/src/comparisons.d.ts +8 -5
- package/dist/types/element/src/convertToShape.d.ts +23 -0
- package/dist/types/element/src/delta.d.ts +23 -1
- package/dist/types/element/src/distribute.d.ts +2 -2
- package/dist/types/element/src/dragElements.d.ts +27 -0
- package/dist/types/element/src/duplicate.d.ts +64 -3
- package/dist/types/element/src/embeddable.d.ts +2 -2
- package/dist/types/element/src/flowchart.d.ts +11 -7
- package/dist/types/element/src/fractionalIndex.d.ts +2 -2
- package/dist/types/element/src/frame.d.ts +11 -10
- package/dist/types/element/src/groups.d.ts +9 -9
- package/dist/types/element/src/index.d.ts +6 -1
- package/dist/types/element/src/linearElementEditor.d.ts +27 -10
- package/dist/types/element/src/listMarker.d.ts +34 -0
- package/dist/types/element/src/mutateElement.d.ts +1 -1
- package/dist/types/element/src/newElement.d.ts +53 -3
- package/dist/types/element/src/renderElement.d.ts +21 -7
- package/dist/types/element/src/resizeElements.d.ts +2 -2
- package/dist/types/element/src/selection.d.ts +6 -6
- package/dist/types/element/src/shape.d.ts +27 -1
- package/dist/types/element/src/sizeHelpers.d.ts +6 -0
- package/dist/types/element/src/sortElements.d.ts +10 -0
- package/dist/types/element/src/stickyNote.d.ts +183 -0
- package/dist/types/element/src/textElement.d.ts +20 -9
- package/dist/types/element/src/transform.d.ts +26 -7
- package/dist/types/element/src/typeChecks.d.ts +29 -27
- package/dist/types/element/src/types.d.ts +43 -7
- package/dist/types/element/src/utils.d.ts +15 -4
- package/dist/types/element/src/visualdebug.d.ts +1 -2
- package/dist/types/element/src/zindex.d.ts +2 -2
- package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +87 -18
- package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
- package/dist/types/excalidraw/actions/actionBoundText.d.ts +58 -12
- package/dist/types/excalidraw/actions/actionCanvas.d.ts +265 -940
- package/dist/types/excalidraw/actions/actionClipboard.d.ts +58 -12
- package/dist/types/excalidraw/actions/actionCropEditor.d.ts +29 -6
- package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +89 -19
- package/dist/types/excalidraw/actions/actionDeselect.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -3
- package/dist/types/excalidraw/actions/actionElementLink.d.ts +29 -6
- package/dist/types/excalidraw/actions/actionElementLock.d.ts +59 -13
- package/dist/types/excalidraw/actions/actionExport.d.ts +60 -14
- package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
- package/dist/types/excalidraw/actions/actionFrame.d.ts +150 -203
- package/dist/types/excalidraw/actions/actionGroup.d.ts +73 -27
- package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +84 -9
- package/dist/types/excalidraw/actions/actionLink.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionMenu.d.ts +29 -6
- package/dist/types/excalidraw/actions/actionProperties.d.ts +96 -34
- package/dist/types/excalidraw/actions/actionSelectAll.d.ts +34 -11
- package/dist/types/excalidraw/actions/actionStyles.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +1 -1
- package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +33 -11
- package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +33 -11
- package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
- package/dist/types/excalidraw/actions/{actionEmbeddable.d.ts → actionToggleShowHints.d.ts} +45 -19
- package/dist/types/excalidraw/actions/actionToggleStats.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +31 -8
- package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +30 -7
- package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
- package/dist/types/excalidraw/actions/index.d.ts +2 -2
- package/dist/types/excalidraw/actions/manager.d.ts +1 -0
- package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
- package/dist/types/excalidraw/actions/types.d.ts +8 -4
- package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
- package/dist/types/excalidraw/appState.d.ts +30 -6
- package/dist/types/excalidraw/components/Actions.d.ts +17 -12
- package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
- package/dist/types/excalidraw/components/App.arrowText.d.ts +70 -0
- package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
- package/dist/types/excalidraw/components/App.clipboard.d.ts +31 -0
- package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
- package/dist/types/excalidraw/components/App.d.ts +301 -93
- package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
- package/dist/types/excalidraw/components/App.duplicate.d.ts +101 -0
- package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
- package/dist/types/excalidraw/components/App.pan.d.ts +62 -0
- package/dist/types/excalidraw/components/App.text.d.ts +146 -0
- package/dist/types/excalidraw/components/App.textTool.d.ts +140 -0
- package/dist/types/excalidraw/components/App.toolDrag.d.ts +63 -0
- package/dist/types/excalidraw/components/App.viewport.d.ts +113 -0
- package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
- package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -3
- package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
- package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +5 -1
- package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +9 -2
- package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
- package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
- package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
- package/dist/types/excalidraw/components/ColorPicker/colorTopPicksDnD.d.ts +11 -0
- package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -1
- package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
- package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -2
- package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
- package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -1
- package/dist/types/excalidraw/components/FileDropOverlay.d.ts +2 -0
- package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +4 -1
- package/dist/types/excalidraw/components/FontPicker/FontPickerList.d.ts +6 -1
- package/dist/types/excalidraw/components/FontPicker/fontTopPicksDnD.d.ts +12 -0
- package/dist/types/excalidraw/components/IconButton.d.ts +48 -0
- package/dist/types/excalidraw/components/Island.d.ts +7 -0
- package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
- package/dist/types/excalidraw/components/LayerUI.d.ts +5 -2
- package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
- package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +6 -2
- package/dist/types/excalidraw/components/LibraryUnit.d.ts +7 -2
- package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
- package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
- package/dist/types/excalidraw/components/MobileMenu.d.ts +4 -4
- package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
- package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
- package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
- package/dist/types/excalidraw/components/Popover.d.ts +1 -3
- package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
- package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
- package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
- package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
- package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
- package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
- package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +4 -4
- package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +3 -3
- package/dist/types/excalidraw/components/ToolPopover.d.ts +3 -6
- package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
- package/dist/types/excalidraw/components/Tools.d.ts +151 -0
- package/dist/types/excalidraw/components/Tooltip.d.ts +15 -1
- package/dist/types/excalidraw/components/TopPicksDnD/TopPicksContextMenu.d.ts +14 -0
- package/dist/types/excalidraw/components/TopPicksDnD/TopPicksTip.d.ts +11 -0
- package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +58 -0
- package/dist/types/excalidraw/components/UserList.d.ts +3 -2
- package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
- package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -1
- package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +3 -0
- package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
- package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -1
- package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
- package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -2
- package/dist/types/excalidraw/components/icons.d.ts +7 -1
- package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +10 -4
- package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
- package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
- package/dist/types/excalidraw/data/blob.d.ts +62 -16
- package/dist/types/excalidraw/data/index.d.ts +4 -4
- package/dist/types/excalidraw/data/json.d.ts +37 -14
- package/dist/types/excalidraw/data/library.d.ts +1 -1
- package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
- package/dist/types/excalidraw/eraser/index.d.ts +2 -3
- package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
- package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
- package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
- package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
- package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
- package/dist/types/excalidraw/lasso/index.d.ts +2 -3
- package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
- package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
- package/dist/types/excalidraw/renderer/animation.d.ts +5 -1
- package/dist/types/excalidraw/renderer/helpers.d.ts +25 -0
- package/dist/types/excalidraw/renderer/interactiveScene.d.ts +2 -4
- package/dist/types/excalidraw/scene/Renderer.d.ts +489 -20
- package/dist/types/excalidraw/scene/export.d.ts +3 -3
- package/dist/types/excalidraw/scene/index.d.ts +2 -2
- package/dist/types/excalidraw/scene/types.d.ts +7 -4
- package/dist/types/excalidraw/snapping.d.ts +7 -7
- package/dist/types/excalidraw/types.d.ts +531 -29
- package/dist/types/excalidraw/viewport.d.ts +302 -0
- package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +13 -3
- package/dist/types/fractional-indexing/src/index.d.ts +29 -0
- package/dist/types/laser-pointer/src/index.d.ts +2 -0
- package/dist/types/laser-pointer/src/math.d.ts +16 -0
- package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
- package/dist/types/laser-pointer/src/state.d.ts +36 -0
- package/dist/types/math/src/constants.d.ts +0 -1
- package/dist/types/math/src/curve.d.ts +23 -13
- package/dist/types/math/src/index.d.ts +1 -0
- package/dist/types/math/src/pca.d.ts +79 -0
- package/dist/types/math/src/point.d.ts +1 -0
- package/dist/types/math/src/polygon.d.ts +25 -1
- package/dist/types/math/src/segment.d.ts +6 -0
- package/dist/types/utils/src/export.d.ts +4 -3
- package/dist/types/utils/src/index.d.ts +1 -2
- package/dist/types/utils/src/shape.d.ts +2 -2
- package/package.json +4 -3
- package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
- package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
- package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
- package/dist/types/excalidraw/components/MobileToolBar.d.ts +0 -10
- package/dist/types/excalidraw/components/ToolButton.d.ts +0 -49
- package/dist/types/excalidraw/components/shapes.d.ts +0 -263
- package/dist/types/excalidraw/cursor.d.ts +0 -5
- package/dist/types/excalidraw/scene/scroll.d.ts +0 -18
- package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
- package/dist/types/utils/src/bbox.d.ts +0 -9
- package/dist/types/utils/src/withinBounds.d.ts +0 -19
|
@@ -22,6 +22,7 @@ export declare class LinearElementEditor {
|
|
|
22
22
|
};
|
|
23
23
|
arrowStartIsInside: boolean;
|
|
24
24
|
altFocusPoint: Readonly<GlobalPoint> | null;
|
|
25
|
+
arrowOtherEndpointInitialBinding: FixedPointBinding | null;
|
|
25
26
|
}>;
|
|
26
27
|
/** whether you're dragging a point */
|
|
27
28
|
readonly isDragging: boolean;
|
|
@@ -45,18 +46,18 @@ export declare class LinearElementEditor {
|
|
|
45
46
|
* @param id the `elementId` from the instance of this class (so that we can
|
|
46
47
|
* statically guarantee this method returns an ExcalidrawLinearElement)
|
|
47
48
|
*/
|
|
48
|
-
static getElement<T extends ExcalidrawLinearElement>(id: InstanceType<typeof LinearElementEditor>["elementId"], elementsMap: ElementsMap): T | null;
|
|
49
|
+
static getElement<T extends ExcalidrawLinearElement>(id: InstanceType<typeof LinearElementEditor>["elementId"], elementsMap: ElementsMap): NonDeleted<T> | null;
|
|
49
50
|
static handleBoxSelection(event: PointerEvent, appState: AppState, setState: React.Component<any, AppState>["setState"], elementsMap: NonDeletedSceneElementsMap): false | undefined;
|
|
50
51
|
static handlePointerMove(event: PointerEvent, app: AppClassProperties, scenePointerX: number, scenePointerY: number, linearElementEditor: LinearElementEditor): Pick<AppState, "suggestedBinding" | "selectedLinearElement"> | null;
|
|
51
52
|
static handlePointDragging(event: PointerEvent, app: AppClassProperties, scenePointerX: number, scenePointerY: number, linearElementEditor: LinearElementEditor): Pick<AppState, "suggestedBinding" | "selectedLinearElement"> | null;
|
|
52
53
|
static handlePointerUp(event: PointerEvent, editingLinearElement: LinearElementEditor, appState: AppState, scene: Scene): LinearElementEditor;
|
|
53
|
-
static getEditorMidPoints: (element:
|
|
54
|
+
static getEditorMidPoints: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, appState: InteractiveCanvasAppState) => (GlobalPoint | null)[];
|
|
54
55
|
static getSegmentMidpointHitCoords: (linearElementEditor: LinearElementEditor, scenePointer: {
|
|
55
56
|
x: number;
|
|
56
57
|
y: number;
|
|
57
58
|
}, appState: AppState, elementsMap: ElementsMap) => GlobalPoint | null;
|
|
58
|
-
static isSegmentTooShort<P extends GlobalPoint | LocalPoint>(element:
|
|
59
|
-
static getSegmentMidPoint(element:
|
|
59
|
+
static isSegmentTooShort<P extends GlobalPoint | LocalPoint>(element: ExcalidrawLinearElement, startPoint: P, endPoint: P, index: number, zoom: Zoom, elementsMap: ElementsMap): boolean;
|
|
60
|
+
static getSegmentMidPoint(element: ExcalidrawLinearElement, index: number, elementsMap: ElementsMap): GlobalPoint;
|
|
60
61
|
static getSegmentMidPointIndex(linearElementEditor: LinearElementEditor, appState: AppState, midPoint: GlobalPoint, elementsMap: ElementsMap): number;
|
|
61
62
|
static handlePointerDown(event: React.PointerEvent<HTMLElement>, app: AppClassProperties, store: Store, scenePointer: {
|
|
62
63
|
x: number;
|
|
@@ -64,19 +65,26 @@ export declare class LinearElementEditor {
|
|
|
64
65
|
}, linearElementEditor: LinearElementEditor, scene: Scene): {
|
|
65
66
|
didAddPoint: boolean;
|
|
66
67
|
hitElement: NonDeleted<ExcalidrawElement> | null;
|
|
68
|
+
/** the pointer went down on the arrow's label, grabbing it for a drag */
|
|
69
|
+
hitBoundText: boolean;
|
|
67
70
|
linearElementEditor: LinearElementEditor | null;
|
|
68
71
|
};
|
|
69
72
|
static arePointsEqual<Point extends LocalPoint | GlobalPoint>(point1: Point | null, point2: Point | null): boolean;
|
|
70
73
|
static handlePointerMoveInEditMode(event: React.PointerEvent<HTMLCanvasElement>, scenePointerX: number, scenePointerY: number, app: AppClassProperties): LinearElementEditor | null;
|
|
71
74
|
/** scene coords */
|
|
72
|
-
static getPointGlobalCoordinates(element:
|
|
75
|
+
static getPointGlobalCoordinates(element: ExcalidrawLinearElement, p: LocalPoint, elementsMap: ElementsMap): GlobalPoint;
|
|
73
76
|
/** scene coords */
|
|
74
|
-
static getPointsGlobalCoordinates(element:
|
|
75
|
-
static getPointAtIndexGlobalCoordinates(element:
|
|
77
|
+
static getPointsGlobalCoordinates(element: ExcalidrawLinearElement, elementsMap: ElementsMap): GlobalPoint[];
|
|
78
|
+
static getPointAtIndexGlobalCoordinates(element: ExcalidrawLinearElement, indexMaybeFromEnd: number, // -1 for last element
|
|
76
79
|
elementsMap: ElementsMap): GlobalPoint;
|
|
77
|
-
static pointFromAbsoluteCoords(element:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
static pointFromAbsoluteCoords(element: ExcalidrawLinearElement, absoluteCoords: GlobalPoint, elementsMap: ElementsMap): LocalPoint;
|
|
81
|
+
/**
|
|
82
|
+
* Whether the point at `index` is an interactive handle. Elbow arrows only
|
|
83
|
+
* expose their endpoints; their intermediate route points are not draggable.
|
|
84
|
+
*/
|
|
85
|
+
static isPointHandle(element: ExcalidrawLinearElement, index: number): boolean;
|
|
86
|
+
static getPointIndexUnderCursor(element: ExcalidrawLinearElement, elementsMap: ElementsMap, zoom: AppState["zoom"], x: number, y: number): number;
|
|
87
|
+
static createPointAt(element: ExcalidrawLinearElement, elementsMap: ElementsMap, scenePointerX: number, scenePointerY: number, gridSize: NullableGridSize): LocalPoint;
|
|
80
88
|
/**
|
|
81
89
|
* Normalizes line points so that the start point is at [0,0]. This is
|
|
82
90
|
* expected in various parts of the codebase.
|
|
@@ -107,10 +115,19 @@ export declare class LinearElementEditor {
|
|
|
107
115
|
} | undefined;
|
|
108
116
|
private static _updatePoints;
|
|
109
117
|
private static _getShiftLockedDelta;
|
|
118
|
+
/**
|
|
119
|
+
* The point a bound text label is centered on — the middle of the linear
|
|
120
|
+
* element, whether that's an actual point or the midpoint of the middle
|
|
121
|
+
* segment.
|
|
122
|
+
*/
|
|
123
|
+
static getBoundTextElementCenter: (element: ExcalidrawLinearElement, elementsMap: ElementsMap) => GlobalPoint;
|
|
124
|
+
static handleBoundTextDragging(linearElementEditor: LinearElementEditor, scene: Scene, pointerX: number, pointerY: number): LinearElementEditor | null;
|
|
125
|
+
static getPointAtPathParameter(container: ExcalidrawLinearElement, pathParameter: number, elementsMap: ElementsMap): GlobalPoint | null;
|
|
110
126
|
static getBoundTextElementPosition: (element: ExcalidrawLinearElement, boundTextElement: ExcalidrawTextElementWithContainer, elementsMap: ElementsMap) => {
|
|
111
127
|
x: number;
|
|
112
128
|
y: number;
|
|
113
129
|
};
|
|
130
|
+
private static computeBoundTextElementPosition;
|
|
114
131
|
static getMinMaxXYWithBoundText: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, elementBounds: Bounds, boundTextElement: ExcalidrawTextElementWithContainer) => [number, number, number, number, number, number];
|
|
115
132
|
static getElementAbsoluteCoords: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, includeBoundText?: boolean) => [number, number, number, number, number, number];
|
|
116
133
|
static moveFixedSegment(linearElement: LinearElementEditor, index: number, x: number, y: number, scene: Scene): Pick<LinearElementEditor, "segmentMidPointHoveredCoords" | "initialState">;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Scene } from "./Scene";
|
|
2
|
+
import type { ExcalidrawElement, ExcalidrawTextElement } from "./types";
|
|
3
|
+
/** a list marker advanced by duplication, to go back and forth */
|
|
4
|
+
export type ListMarkerAdvance = {
|
|
5
|
+
elementId: ExcalidrawTextElement["id"];
|
|
6
|
+
prevOriginalText: string;
|
|
7
|
+
nextOriginalText: string;
|
|
8
|
+
/**
|
|
9
|
+
* where the item's text (after the marker and whitespace) starts in
|
|
10
|
+
* `nextOriginalText` (its length if there's none)
|
|
11
|
+
*/
|
|
12
|
+
contentStart: number;
|
|
13
|
+
/** the label's container before the label (may have) grown it */
|
|
14
|
+
prevContainerSize: {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
} | null;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Advances the list markers of the duplicated texts and labels, so that
|
|
21
|
+
* duplicating `1. foo` gives `2. foo` (and `1` gives `2`).
|
|
22
|
+
*
|
|
23
|
+
* Duplicating several list items at once continues the list from the
|
|
24
|
+
* highest of them: duplicating `1.`, `3.`, `5.` gives `6.`, `7.`, `8.` (only
|
|
25
|
+
* if they're just markers, i.e. without text).
|
|
26
|
+
*
|
|
27
|
+
* Only if nothing but list items (texts, or containers with list item labels)
|
|
28
|
+
* is duplicated.
|
|
29
|
+
*/
|
|
30
|
+
export declare const advanceDuplicatedListMarkers: (duplicatedElements: readonly ExcalidrawElement[], scene: Scene) => ListMarkerAdvance[];
|
|
31
|
+
/**
|
|
32
|
+
* Sets the advanced list markers back (`"prev"`), or forth again (`"next"`).
|
|
33
|
+
*/
|
|
34
|
+
export declare const applyListMarkerAdvances: (advances: readonly ListMarkerAdvance[], direction: "prev" | "next", scene: Scene) => void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Mutable } from "@excalidraw/common/utility-types";
|
|
2
2
|
import type { ElementsMap, ExcalidrawElement } from "./types";
|
|
3
|
-
export type ElementUpdate<TElement extends ExcalidrawElement> = Omit<Partial<TElement>, "id" | "updated">;
|
|
3
|
+
export type ElementUpdate<TElement extends ExcalidrawElement> = Omit<Partial<TElement>, "id" | "updated" | "created">;
|
|
4
4
|
/**
|
|
5
5
|
* This function tracks updates of text elements for the purposes for collaboration.
|
|
6
6
|
* The version is used to compare updates when more than one user is working in
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import type { MarkOptional } from "@excalidraw/common/utility-types";
|
|
2
|
-
import type { ExcalidrawImageElement, ExcalidrawTextElement, ExcalidrawLinearElement, ExcalidrawGenericElement, NonDeleted, TextAlign, VerticalAlign, Arrowhead, ExcalidrawFreeDrawElement, FontFamilyValues, ExcalidrawTextContainer, ExcalidrawFrameElement, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawIframeElement, ElementsMap, ExcalidrawArrowElement, ExcalidrawElbowArrowElement, ExcalidrawLineElement } from "./types";
|
|
3
|
-
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">;
|
|
2
|
+
import type { ExcalidrawImageElement, ExcalidrawTextElement, ExcalidrawLinearElement, ExcalidrawGenericElement, NonDeleted, TextAlign, VerticalAlign, Arrowhead, ExcalidrawFreeDrawElement, FontFamilyValues, ExcalidrawTextContainer, ExcalidrawFrameElement, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawIframeElement, ElementsMap, ExcalidrawArrowElement, ExcalidrawElbowArrowElement, ExcalidrawLineElement, ExcalidrawStickyNoteElement } from "./types";
|
|
3
|
+
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" | "created">;
|
|
4
4
|
export declare const newElement: (opts: {
|
|
5
5
|
type: ExcalidrawGenericElement["type"];
|
|
6
6
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawGenericElement>;
|
|
7
|
+
/**
|
|
8
|
+
* Style invariants of a sticky note: never-transparent colors, solid fill.
|
|
9
|
+
* Applied by the constructor and by every normalization pass. Returns the
|
|
10
|
+
* same object when nothing needs fixing.
|
|
11
|
+
*/
|
|
12
|
+
export declare const normalizeStickyNoteStyle: <T extends ExcalidrawStickyNoteElement>(element: T) => T;
|
|
13
|
+
/**
|
|
14
|
+
* Geometry invariants of a *finalized* sticky note: minimum size and
|
|
15
|
+
* `baseHeight ≤ height`. Deliberately not part of the constructor — a
|
|
16
|
+
* pointer-down draft starts at 0×0 like every other tool and is previewed at
|
|
17
|
+
* its true dragged size; pointer-up, restore, the skeleton path and the
|
|
18
|
+
* action post-passes enforce this.
|
|
19
|
+
*/
|
|
20
|
+
export declare const normalizeStickyNoteGeometry: <T extends ExcalidrawStickyNoteElement>(element: T) => T;
|
|
21
|
+
/** all sticky note invariants (style + finalized geometry) */
|
|
22
|
+
export declare const normalizeStickyNote: <T extends ExcalidrawStickyNoteElement>(element: T) => T;
|
|
23
|
+
export declare const newStickyNoteElement: (opts: {
|
|
24
|
+
type: "stickynote";
|
|
25
|
+
baseHeight?: number;
|
|
26
|
+
} & ElementConstructorOpts) => NonDeleted<ExcalidrawStickyNoteElement>;
|
|
7
27
|
export declare const newEmbeddableElement: (opts: {
|
|
8
28
|
type: "embeddable";
|
|
9
29
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawEmbeddableElement>;
|
|
@@ -16,6 +36,19 @@ export declare const newFrameElement: (opts: {
|
|
|
16
36
|
export declare const newMagicFrameElement: (opts: {
|
|
17
37
|
name?: string;
|
|
18
38
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawMagicFrameElement>;
|
|
39
|
+
/**
|
|
40
|
+
* The point of the text box its alignment pins, as ratios of width/height.
|
|
41
|
+
*
|
|
42
|
+
* This is the point that stays put as the text grows — see the sides passed to
|
|
43
|
+
* `adjustXYWithRotation` in `getAdjustedDimensions`.
|
|
44
|
+
*/
|
|
45
|
+
export declare const getTextAnchorRatios: (opts: {
|
|
46
|
+
textAlign: ExcalidrawTextElement["textAlign"];
|
|
47
|
+
verticalAlign: ExcalidrawTextElement["verticalAlign"];
|
|
48
|
+
}) => {
|
|
49
|
+
x: number;
|
|
50
|
+
y: number;
|
|
51
|
+
};
|
|
19
52
|
export declare const newTextElement: (opts: {
|
|
20
53
|
text: string;
|
|
21
54
|
originalText?: string;
|
|
@@ -26,8 +59,24 @@ export declare const newTextElement: (opts: {
|
|
|
26
59
|
containerId?: ExcalidrawTextContainer["id"] | null;
|
|
27
60
|
lineHeight?: ExcalidrawTextElement["lineHeight"];
|
|
28
61
|
autoResize?: ExcalidrawTextElement["autoResize"];
|
|
62
|
+
labelPosition?: ExcalidrawTextElement["labelPosition"];
|
|
63
|
+
baseFontSize?: ExcalidrawTextElement["baseFontSize"];
|
|
29
64
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawTextElement>;
|
|
30
|
-
export declare const refreshTextDimensions: (textElement: ExcalidrawTextElement, container: ExcalidrawTextContainer | null, elementsMap: ElementsMap, text?: string
|
|
65
|
+
export declare const refreshTextDimensions: (textElement: ExcalidrawTextElement, container: ExcalidrawTextContainer | null, elementsMap: ElementsMap, text?: string,
|
|
66
|
+
/**
|
|
67
|
+
* For a free text that grows with its content (`autoResize`): the widest
|
|
68
|
+
* it may grow to. Crossing it, the text stops growing and wraps at this
|
|
69
|
+
* width from then on (`autoResize: false`), anchored as its growth was. A
|
|
70
|
+
* text that is already wider keeps growing.
|
|
71
|
+
*/
|
|
72
|
+
maxWidth?: number) => {
|
|
73
|
+
x: number;
|
|
74
|
+
y: number;
|
|
75
|
+
width: number;
|
|
76
|
+
height: number;
|
|
77
|
+
text: string;
|
|
78
|
+
autoResize: boolean;
|
|
79
|
+
} | {
|
|
31
80
|
x: number;
|
|
32
81
|
y: number;
|
|
33
82
|
width: number;
|
|
@@ -38,6 +87,7 @@ export declare const newFreeDrawElement: (opts: {
|
|
|
38
87
|
type: "freedraw";
|
|
39
88
|
points?: ExcalidrawFreeDrawElement["points"];
|
|
40
89
|
simulatePressure: boolean;
|
|
90
|
+
strokeOptions?: ExcalidrawFreeDrawElement["strokeOptions"];
|
|
41
91
|
pressures?: ExcalidrawFreeDrawElement["pressures"];
|
|
42
92
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawFreeDrawElement>;
|
|
43
93
|
export declare const newLinearElement: (opts: {
|
|
@@ -1,25 +1,39 @@
|
|
|
1
1
|
import { type GlobalPoint } from "@excalidraw/math";
|
|
2
|
-
import type { AppState, StaticCanvasAppState, InteractiveCanvasAppState,
|
|
2
|
+
import type { AppState, StaticCanvasAppState, InteractiveCanvasAppState, ElementRenderOverrides } from "@excalidraw/excalidraw/types";
|
|
3
3
|
import type { StaticCanvasRenderConfig, RenderableElementsMap, InteractiveCanvasRenderConfig } from "@excalidraw/excalidraw/scene/types";
|
|
4
|
-
import type { ExcalidrawElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, ExcalidrawFreeDrawElement, ExcalidrawImageElement,
|
|
4
|
+
import type { ExcalidrawElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, ExcalidrawFreeDrawElement, ExcalidrawImageElement, NonDeletedSceneElementsMap, ElementsMap } from "./types";
|
|
5
5
|
import type { RoughCanvas } from "roughjs/bin/canvas";
|
|
6
|
-
export
|
|
6
|
+
export type RenderPositionOffset = Readonly<{
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
}>;
|
|
10
|
+
/** Bound labels follow their container; a label's own offset is ignored. */
|
|
11
|
+
export declare const getElementRenderOffset: (element: ExcalidrawElement, elementsMap: ElementsMap, overrides: ElementRenderOverrides | undefined) => RenderPositionOffset | undefined;
|
|
12
|
+
export declare const getRenderElementWithPositionOverride: <TElement extends ExcalidrawElement>(element: TElement, positionOffset: RenderPositionOffset) => TElement;
|
|
13
|
+
export type ElementRenderState = Readonly<{
|
|
14
|
+
/** Alpha including frame opacity and pending erasure; selection dimming is separate. */
|
|
15
|
+
opacity: number;
|
|
16
|
+
offset: RenderPositionOffset;
|
|
17
|
+
}>;
|
|
18
|
+
/** Resolve visual state at the drawing boundary, preserving document cache keys. */
|
|
19
|
+
export declare const resolveElementRenderState: (element: ExcalidrawElement, elementsMap: ElementsMap, renderConfig: Pick<StaticCanvasRenderConfig, "elementRenderOverrides" | "elementsPendingErasure" | "pendingFlowchartNodes">, allElementsMap?: ElementsMap) => ElementRenderState;
|
|
7
20
|
export interface ExcalidrawElementWithCanvas {
|
|
8
21
|
element: ExcalidrawElement | ExcalidrawTextElement;
|
|
9
22
|
canvas: HTMLCanvasElement;
|
|
10
23
|
theme: AppState["theme"];
|
|
11
24
|
scale: number;
|
|
12
|
-
angle: number;
|
|
13
25
|
zoomValue: AppState["zoom"]["value"];
|
|
14
26
|
canvasOffsetX: number;
|
|
15
27
|
canvasOffsetY: number;
|
|
16
|
-
boundTextElementVersion: number | null;
|
|
17
28
|
imageCrop: ExcalidrawImageElement["crop"] | null;
|
|
18
29
|
containingFrameOpacity: number;
|
|
19
|
-
boundTextCanvas: HTMLCanvasElement;
|
|
20
30
|
}
|
|
21
31
|
export declare const DEFAULT_LINK_SIZE = 14;
|
|
22
32
|
export declare const elementWithCanvasCache: WeakMap<ExcalidrawElement, ExcalidrawElementWithCanvas>;
|
|
23
33
|
export declare const renderSelectionElement: (element: NonDeletedExcalidrawElement, context: CanvasRenderingContext2D, appState: InteractiveCanvasAppState, selectionColor: InteractiveCanvasRenderConfig["selectionColor"]) => void;
|
|
24
|
-
export declare const renderElement: (element: NonDeletedExcalidrawElement, elementsMap: RenderableElementsMap, allElementsMap: NonDeletedSceneElementsMap, rc: RoughCanvas, context: CanvasRenderingContext2D, renderConfig: StaticCanvasRenderConfig, appState: StaticCanvasAppState | InteractiveCanvasAppState
|
|
34
|
+
export declare const renderElement: (element: NonDeletedExcalidrawElement, elementsMap: RenderableElementsMap, allElementsMap: NonDeletedSceneElementsMap, rc: RoughCanvas, context: CanvasRenderingContext2D, renderConfig: StaticCanvasRenderConfig, appState: StaticCanvasAppState | InteractiveCanvasAppState, renderState?: Readonly<{
|
|
35
|
+
/** Alpha including frame opacity and pending erasure; selection dimming is separate. */
|
|
36
|
+
opacity: number;
|
|
37
|
+
offset: RenderPositionOffset;
|
|
38
|
+
}>) => void;
|
|
25
39
|
export declare function getFreedrawOutlineAsSegments(element: ExcalidrawFreeDrawElement, points: [number, number][], elementsMap: ElementsMap): import("@excalidraw/math").LineSegment<GlobalPoint>[];
|
|
@@ -3,7 +3,7 @@ import type { PointerDownState } from "@excalidraw/excalidraw/types";
|
|
|
3
3
|
import type { Scene } from "./Scene";
|
|
4
4
|
import type { BoundingBox } from "./bounds";
|
|
5
5
|
import type { MaybeTransformHandleType, TransformHandleDirection } from "./transformHandles";
|
|
6
|
-
import type { ExcalidrawLinearElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, NonDeleted,
|
|
6
|
+
import type { ExcalidrawLinearElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, NonDeleted, ElementsMap } from "./types";
|
|
7
7
|
export declare const transformElements: (originalElements: PointerDownState["originalElements"], transformHandleType: MaybeTransformHandleType, selectedElements: readonly NonDeletedExcalidrawElement[], scene: Scene, shouldRotateWithDiscreteAngle: boolean, shouldResizeFromCenter: boolean, shouldMaintainAspectRatio: boolean, pointerX: number, pointerY: number, centerX: number, centerY: number) => boolean;
|
|
8
8
|
export declare const rescalePointsInElement: (element: NonDeletedExcalidrawElement, width: number, height: number, normalizePoints: boolean) => {
|
|
9
9
|
points: LocalPoint[];
|
|
@@ -16,7 +16,7 @@ export declare const measureFontSizeFromWidth: (element: NonDeleted<ExcalidrawTe
|
|
|
16
16
|
export declare const resizeSingleTextElement: (origElement: NonDeleted<ExcalidrawTextElement>, element: NonDeleted<ExcalidrawTextElement>, scene: Scene, transformHandleType: TransformHandleDirection, shouldResizeFromCenter: boolean, nextWidth: number, nextHeight: number) => void;
|
|
17
17
|
export declare const getResizeOffsetXY: (transformHandleType: MaybeTransformHandleType, selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap, x: number, y: number) => [number, number];
|
|
18
18
|
export declare const getResizeArrowDirection: (transformHandleType: MaybeTransformHandleType, element: NonDeleted<ExcalidrawLinearElement>) => "origin" | "end";
|
|
19
|
-
export declare const resizeSingleElement: (nextWidth: number, nextHeight: number, latestElement:
|
|
19
|
+
export declare const resizeSingleElement: (nextWidth: number, nextHeight: number, latestElement: NonDeletedExcalidrawElement, origElement: NonDeletedExcalidrawElement, originalElementsMap: ElementsMap, scene: Scene, handleDirection: TransformHandleDirection, { shouldInformMutation, shouldMaintainAspectRatio, shouldResizeFromCenter, }?: {
|
|
20
20
|
shouldMaintainAspectRatio?: boolean;
|
|
21
21
|
shouldResizeFromCenter?: boolean;
|
|
22
22
|
shouldInformMutation?: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AppState, InteractiveCanvasAppState } from "@excalidraw/excalidraw/types";
|
|
1
|
+
import type { AppState, BoxSelectionMode, InteractiveCanvasAppState } from "@excalidraw/excalidraw/types";
|
|
2
2
|
import { LinearElementEditor } from "./linearElementEditor";
|
|
3
3
|
import type { ElementsMap, ElementsMapOrArray, ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement } from "./types";
|
|
4
4
|
/**
|
|
@@ -8,8 +8,8 @@ import type { ElementsMap, ElementsMapOrArray, ExcalidrawElement, NonDeleted, No
|
|
|
8
8
|
* @param selectedElements
|
|
9
9
|
*/
|
|
10
10
|
export declare const excludeElementsInFramesFromSelection: <T extends ExcalidrawElement>(selectedElements: readonly T[]) => T[];
|
|
11
|
-
export declare const getElementsWithinSelection: (elements: readonly
|
|
12
|
-
export declare const getVisibleAndNonSelectedElements: (elements: readonly
|
|
11
|
+
export declare const getElementsWithinSelection: <T extends ExcalidrawElement>(elements: readonly T[], selection: ExcalidrawElement, elementsMap: ElementsMap, excludeElementsInFrames?: boolean, boxSelectionMode?: BoxSelectionMode) => T[];
|
|
12
|
+
export declare const getVisibleAndNonSelectedElements: <T extends NonDeletedExcalidrawElement>(elements: readonly T[], selectedElements: readonly ExcalidrawElement[], appState: AppState, elementsMap: ElementsMap) => T[];
|
|
13
13
|
export declare const isSomeElementSelected: {
|
|
14
14
|
(elements: readonly NonDeletedExcalidrawElement[], appState: Pick<AppState, "selectedElementIds">): boolean;
|
|
15
15
|
clearCache(): void;
|
|
@@ -17,8 +17,8 @@ export declare const isSomeElementSelected: {
|
|
|
17
17
|
export declare const getSelectedElements: (elements: ElementsMapOrArray, appState: Pick<InteractiveCanvasAppState, "selectedElementIds">, opts?: {
|
|
18
18
|
includeBoundTextElement?: boolean;
|
|
19
19
|
includeElementsInFrames?: boolean;
|
|
20
|
-
}) =>
|
|
21
|
-
export declare const getTargetElements: (elements: ElementsMapOrArray, appState: Pick<AppState, "selectedElementIds" | "editingTextElement" | "newElement">) =>
|
|
20
|
+
}) => NonDeletedExcalidrawElement[];
|
|
21
|
+
export declare const getTargetElements: (elements: ElementsMapOrArray, appState: Pick<AppState, "selectedElementIds" | "editingTextElement" | "newElement" | "activeTool">) => NonDeletedExcalidrawElement[] | import("./types").ExcalidrawTextElement[];
|
|
22
22
|
/**
|
|
23
23
|
* returns prevState's selectedElementids if no change from previous, so as to
|
|
24
24
|
* retain reference identity for memoization
|
|
@@ -26,7 +26,7 @@ export declare const getTargetElements: (elements: ElementsMapOrArray, appState:
|
|
|
26
26
|
export declare const makeNextSelectedElementIds: (nextSelectedElementIds: AppState["selectedElementIds"], prevState: Pick<AppState, "selectedElementIds">) => Readonly<{
|
|
27
27
|
[id: string]: true;
|
|
28
28
|
}>;
|
|
29
|
-
export declare const getSelectionStateForElements: (targetElements: readonly
|
|
29
|
+
export declare const getSelectionStateForElements: (targetElements: readonly NonDeletedExcalidrawElement[], allElements: readonly NonDeletedExcalidrawElement[], appState: AppState) => {
|
|
30
30
|
editingGroupId: AppState["editingGroupId"];
|
|
31
31
|
selectedElementIds: AppState["selectedElementIds"];
|
|
32
32
|
selectedGroupIds: AppState["selectedGroupIds"];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type GeometricShape } from "@excalidraw/utils/shape";
|
|
2
2
|
import { type LocalPoint } from "@excalidraw/math";
|
|
3
|
-
import type { GlobalPoint } from "@excalidraw/math";
|
|
3
|
+
import type { GlobalPoint, Polygon } from "@excalidraw/math";
|
|
4
4
|
import type { AppState, EmbedsValidationStatus } from "@excalidraw/excalidraw/types";
|
|
5
5
|
import type { ElementShape, ElementShapes } from "@excalidraw/excalidraw/scene/types";
|
|
6
6
|
import type { ExcalidrawElement, ExcalidrawSelectionElement, ExcalidrawLinearElement, ExcalidrawFreeDrawElement, ElementsMap, ExcalidrawLineElement } from "./types";
|
|
@@ -27,6 +27,11 @@ export declare class ShapeCache {
|
|
|
27
27
|
} | null) => ((T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] | undefined : ElementShape | undefined) & {}) | (T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] : Drawable | null);
|
|
28
28
|
}
|
|
29
29
|
export declare const generateRoughOptions: (element: ExcalidrawElement, continuousPath?: boolean, isDarkMode?: boolean) => Options;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the flattened fill contour of a freedraw loop in local, unrotated
|
|
32
|
+
* coordinates, following the rendered fill rather than the stroke outline.
|
|
33
|
+
*/
|
|
34
|
+
export declare const getFreedrawFillPolygon: (element: ExcalidrawFreeDrawElement) => Polygon<LocalPoint>;
|
|
30
35
|
export declare const generateLinearCollisionShape: (element: ExcalidrawLinearElement | ExcalidrawFreeDrawElement, elementsMap: ElementsMap) => {
|
|
31
36
|
op: string;
|
|
32
37
|
data: number[];
|
|
@@ -41,3 +46,24 @@ export declare const toggleLinePolygonState: (element: ExcalidrawLineElement, ne
|
|
|
41
46
|
points: ExcalidrawLineElement["points"];
|
|
42
47
|
} | null;
|
|
43
48
|
export declare const getFreedrawOutlinePoints: (element: ExcalidrawFreeDrawElement) => [number, number][];
|
|
49
|
+
/**
|
|
50
|
+
* Upper bound on how far a freedraw stroke's ink reaches past its centerline
|
|
51
|
+
* points. Both stroke generators scale the stroke size by at most 1 (easing
|
|
52
|
+
* or pressure), so the size itself bounds the radius, except for
|
|
53
|
+
* perfect-freehand's short strokes: under 3px long, the start cap is drawn
|
|
54
|
+
* around the first point from an outline point of the last one (reaching
|
|
55
|
+
* sqrt(size² + 3²)), and a single point gets a synthetic neighbor 1px away.
|
|
56
|
+
*/
|
|
57
|
+
export declare const getFreedrawMaxStrokeRadius: (element: ExcalidrawFreeDrawElement) => number;
|
|
58
|
+
/**
|
|
59
|
+
* The streamline-smoothed centerline the freedraw stroke is rendered
|
|
60
|
+
* around, in element-local coordinates. Boundary-sensitive consumers (e.g.
|
|
61
|
+
* bucket fill) should use this instead of `element.points`: raw input
|
|
62
|
+
* points can sit 20px+ apart and the rendered stroke is smoothed between
|
|
63
|
+
* them, so raw chords visibly deviate from what's on screen.
|
|
64
|
+
*
|
|
65
|
+
* Constant-width ("laser geometry") strokes technically smooth via
|
|
66
|
+
* `LaserPointer` instead; the perfect-freehand centerline with the same
|
|
67
|
+
* `streamline` is a close approximation the stroke width hides.
|
|
68
|
+
*/
|
|
69
|
+
export declare const getFreedrawStrokeCenterPoints: (element: ExcalidrawFreeDrawElement) => [number, number][];
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { AppState, Offsets, Zoom } from "@excalidraw/excalidraw/types";
|
|
2
2
|
import type { ElementsMap, ExcalidrawElement } from "./types";
|
|
3
|
+
export type VerticalResizeAnchor = "top" | "bottom" | "center";
|
|
4
|
+
/** Keeps the chosen edge or center fixed when an element's height changes. */
|
|
5
|
+
export declare const getPositionAfterHeightChange: (element: Pick<ExcalidrawElement, "x" | "y" | "height" | "angle">, nextHeight: number, anchor?: VerticalResizeAnchor) => {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
};
|
|
3
9
|
export declare const INVISIBLY_SMALL_ELEMENT_SIZE = 0.1;
|
|
4
10
|
export declare const isInvisiblySmallElement: (element: ExcalidrawElement) => boolean;
|
|
5
11
|
export declare const isElementInViewport: (element: ExcalidrawElement, width: number, height: number, viewTransformations: {
|
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
import type { ExcalidrawElement } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* In theory, when we have text elements bound to a container, they
|
|
4
|
+
* should be right after the container element in the elements array.
|
|
5
|
+
* However, this is not guaranteed due to old and potential future bugs.
|
|
6
|
+
*
|
|
7
|
+
* This function sorts containers and their bound texts together. It prefers
|
|
8
|
+
* original z-index of container (i.e. it moves bound text elements after
|
|
9
|
+
* containers).
|
|
10
|
+
*/
|
|
11
|
+
export declare const normalizeBoundElementsOrder: <T extends ExcalidrawElement>(elements: readonly T[]) => readonly T[];
|
|
2
12
|
export declare const normalizeElementOrder: (elements: readonly ExcalidrawElement[]) => readonly ExcalidrawElement[];
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import type { Scene } from "./Scene";
|
|
2
|
+
import type { VerticalResizeAnchor } from "./sizeHelpers";
|
|
3
|
+
import type { TransformHandleDirection } from "./transformHandles";
|
|
4
|
+
import type { ElementsMap, ExcalidrawElement, ExcalidrawStickyNoteElement, ExcalidrawTextElement, NonDeletedExcalidrawElement } from "./types";
|
|
5
|
+
export type StickyNoteRenderPoint = {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
};
|
|
9
|
+
export type StickyNotePathCommand = {
|
|
10
|
+
type: "move";
|
|
11
|
+
point: StickyNoteRenderPoint;
|
|
12
|
+
} | {
|
|
13
|
+
type: "line";
|
|
14
|
+
point: StickyNoteRenderPoint;
|
|
15
|
+
} | {
|
|
16
|
+
type: "quadratic";
|
|
17
|
+
control: StickyNoteRenderPoint;
|
|
18
|
+
point: StickyNoteRenderPoint;
|
|
19
|
+
};
|
|
20
|
+
export declare const normalizeStickyNoteStrokeColor: (strokeColor: string | null | undefined) => string;
|
|
21
|
+
export declare const normalizeStickyNoteBackgroundColor: (backgroundColor: string | null | undefined) => string;
|
|
22
|
+
/**
|
|
23
|
+
* The update that applies a picked color to an element under the sticky
|
|
24
|
+
* note policy: a note is always filled and its label — the visible text,
|
|
25
|
+
* which the note's own `strokeColor` seeds — never goes transparent. Every
|
|
26
|
+
* color surface (actions, both eyedroppers, paste styles, bind) routes
|
|
27
|
+
* through this instead of re-deriving the rule.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* The element a color pick on `element` lands on. A note's label has no fill
|
|
31
|
+
* of its own, so a background pick on the label — the styles panel while
|
|
32
|
+
* editing it — goes to the note; everything else colors itself.
|
|
33
|
+
*/
|
|
34
|
+
export declare const getColorTargetElement: (element: ExcalidrawElement, property: "strokeColor" | "backgroundColor", elementsMap: ElementsMap) => ExcalidrawElement;
|
|
35
|
+
export declare const getColorUpdate: (element: ExcalidrawElement, property: "strokeColor" | "backgroundColor", color: string, elementsMap: ElementsMap) => {
|
|
36
|
+
strokeColor: string;
|
|
37
|
+
} | {
|
|
38
|
+
backgroundColor: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* A note's ink is one color: the container's `strokeColor` — the seed for a
|
|
42
|
+
* new label and what the creation-date footer paints with — and its label's.
|
|
43
|
+
* Run after a property write to copy the side that changed onto the other;
|
|
44
|
+
* when both changed, or neither (data that drifted), the label wins: it is
|
|
45
|
+
* the text the user styled. A transparent label always takes the note's
|
|
46
|
+
* color. Returns the same array when nothing needs to change.
|
|
47
|
+
*/
|
|
48
|
+
export declare const syncStickyNoteInk: <T extends ExcalidrawElement>(elements: readonly T[], prevElementsMap: ElementsMap) => readonly T[];
|
|
49
|
+
export declare const getStickyNoteCornerRadius: (element: ExcalidrawStickyNoteElement) => number;
|
|
50
|
+
export declare const getStickyNoteRenderPoints: (element: ExcalidrawStickyNoteElement, { offsetX, offsetY, seedOffset, }?: {
|
|
51
|
+
offsetX?: number;
|
|
52
|
+
offsetY?: number;
|
|
53
|
+
seedOffset?: number;
|
|
54
|
+
}) => StickyNoteRenderPoint[];
|
|
55
|
+
export declare const getStickyNotePathCommands: (element: ExcalidrawStickyNoteElement, { shadow }?: {
|
|
56
|
+
shadow?: boolean;
|
|
57
|
+
}) => StickyNotePathCommand[];
|
|
58
|
+
export declare const normalizeStickyNoteFontSize: (fontSize: number) => number;
|
|
59
|
+
/** whether the text element is the label of a sticky note */
|
|
60
|
+
export declare const isStickyNoteBoundText: (textElement: ExcalidrawTextElement, elementsMap: ElementsMap) => boolean;
|
|
61
|
+
/**
|
|
62
|
+
* The font size the user picked: the ceiling the auto-fit shrinks from for a
|
|
63
|
+
* sticky note label, plain `fontSize` for any other text.
|
|
64
|
+
*
|
|
65
|
+
* Container-aware on purpose — generic binding repair (duplication, history)
|
|
66
|
+
* rewrites `containerId` without touching the ceiling, so a numeric
|
|
67
|
+
* `baseFontSize` alone does not prove the text is still sticky-bound.
|
|
68
|
+
*/
|
|
69
|
+
export declare const getBaseFontSize: (textElement: ExcalidrawTextElement, elementsMap: ElementsMap) => number;
|
|
70
|
+
/** the update that applies a user-picked font size (see `getBaseFontSize`) */
|
|
71
|
+
export declare const getBaseFontSizeUpdate: (textElement: ExcalidrawTextElement, fontSize: number, elementsMap: ElementsMap) => {
|
|
72
|
+
fontSize: number;
|
|
73
|
+
} | {
|
|
74
|
+
baseFontSize: number;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* The creation-date label: absolute, so painting needs no clock and exports
|
|
78
|
+
* don't go stale, and short ("7 Sep") while the year is the current one.
|
|
79
|
+
* `null` when the note has no usable timestamp (files restored without one).
|
|
80
|
+
* Fixed English in the viewer's local time zone — the element package has no
|
|
81
|
+
* locale, and the footer is chosen by width bucket rather than measured.
|
|
82
|
+
*/
|
|
83
|
+
export declare const getStickyNoteDateLabel: (created: ExcalidrawStickyNoteElement["created"], { short, now }?: {
|
|
84
|
+
short?: boolean;
|
|
85
|
+
now?: number;
|
|
86
|
+
}) => string | null;
|
|
87
|
+
/**
|
|
88
|
+
* What the footer paints and where, in note-local coordinates — shared by the
|
|
89
|
+
* canvas and SVG renderers, which take the font and opacity from
|
|
90
|
+
* `STICKY_NOTE_FOOTER`. `null` for the 0×0 creation draft and anything under
|
|
91
|
+
* the data floor, where the band would overlap the top padding.
|
|
92
|
+
*/
|
|
93
|
+
export declare const getStickyNoteFooter: (element: Pick<ExcalidrawStickyNoteElement, "created" | "width" | "height">, now?: number) => {
|
|
94
|
+
text: string;
|
|
95
|
+
x: number;
|
|
96
|
+
y: number;
|
|
97
|
+
} | null;
|
|
98
|
+
/**
|
|
99
|
+
* The smallest note the UI lets a user create or resize to: one line at the
|
|
100
|
+
* label's font ceiling plus padding (and, vertically, the footer), never below
|
|
101
|
+
* `STICKY_NOTE_MIN_SIZE`. Without the font term a fresh note would grow on
|
|
102
|
+
* the very first keystroke. Data-level passes (restore, action post-passes)
|
|
103
|
+
* only enforce the constant floor — the layout grows a note as needed.
|
|
104
|
+
*/
|
|
105
|
+
export declare const getStickyNoteMinSize: ({ fontSize, fontFamily, }: Pick<ExcalidrawTextElement, "fontSize" | "fontFamily">) => {
|
|
106
|
+
width: number;
|
|
107
|
+
height: number;
|
|
108
|
+
};
|
|
109
|
+
export type StickyNoteLayoutAnchor = VerticalResizeAnchor;
|
|
110
|
+
export type StickyNoteLayoutOpts = {
|
|
111
|
+
/** unwrapped text to lay out; defaults to the label's `originalText` */
|
|
112
|
+
originalText?: string;
|
|
113
|
+
/**
|
|
114
|
+
* absolute base-height intent — the gesture-start value to preserve, or the
|
|
115
|
+
* height a resize asked for. Omitted = keep the note's live `baseHeight`
|
|
116
|
+
* (typing, style changes, restore).
|
|
117
|
+
*/
|
|
118
|
+
baseHeight?: number;
|
|
119
|
+
/**
|
|
120
|
+
* absolute font-ceiling intent (a proportional resize passes
|
|
121
|
+
* `gesture-start ceiling × scale`). Omitted = keep the label's live ceiling.
|
|
122
|
+
* Never a multiplier on the live value — that compounds across pointer-moves.
|
|
123
|
+
*/
|
|
124
|
+
baseFontSize?: number;
|
|
125
|
+
/** the edge that stays put when the content correction changes the height */
|
|
126
|
+
anchor?: StickyNoteLayoutAnchor;
|
|
127
|
+
};
|
|
128
|
+
export type StickyNoteLayout = {
|
|
129
|
+
container: Pick<ExcalidrawStickyNoteElement, "x" | "y" | "width" | "height" | "baseHeight">;
|
|
130
|
+
text: Pick<ExcalidrawTextElement, "text" | "fontSize" | "baseFontSize" | "width" | "height" | "x" | "y" | "angle"> | null;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* The single source of truth for a sticky note's geometry: wraps the label at
|
|
134
|
+
* the note's width, fits the font under the ceiling, grows the note past
|
|
135
|
+
* `baseHeight` only when the text still overflows at the minimum size, and
|
|
136
|
+
* positions the label inside. Pure — returns the updates for both elements.
|
|
137
|
+
*/
|
|
138
|
+
export declare const getStickyNoteLayout: (container: ExcalidrawStickyNoteElement, textElement: ExcalidrawTextElement | null, opts?: StickyNoteLayoutOpts) => StickyNoteLayout;
|
|
139
|
+
/**
|
|
140
|
+
* Resize intents for a sticky note — the §3.3 matrix of the plan. Every value
|
|
141
|
+
* is absolute and derived from the gesture-start snapshot on each pointer-move,
|
|
142
|
+
* so releasing Shift (or Alt) mid-gesture restores the original base height
|
|
143
|
+
* and ceiling instead of keeping values a previous move scaled.
|
|
144
|
+
*
|
|
145
|
+
* - width-only gestures (free E/W, Stats W) preserve the base height
|
|
146
|
+
* - height-changing gestures use the requested height as the new base
|
|
147
|
+
* - proportional gestures (Shift on any handle, aspect-locked multi-select,
|
|
148
|
+
* Stats group) additionally scale the font ceiling with the note
|
|
149
|
+
* - flips preserve everything
|
|
150
|
+
* - the content correction anchors at the edge the gesture holds still
|
|
151
|
+
*/
|
|
152
|
+
export declare const getStickyNoteResizeIntent: (
|
|
153
|
+
/** the note with the requested geometry already applied */
|
|
154
|
+
container: ExcalidrawStickyNoteElement, originalElementsMap: ElementsMap, handleDirection: TransformHandleDirection, { proportional, fromCenter, flip, }: {
|
|
155
|
+
proportional: boolean;
|
|
156
|
+
fromCenter: boolean;
|
|
157
|
+
flip?: boolean;
|
|
158
|
+
}) => Pick<StickyNoteLayoutOpts, "baseHeight" | "baseFontSize" | "anchor">;
|
|
159
|
+
/**
|
|
160
|
+
* Applies `getStickyNoteLayout` to a live scene, then runs the bound-arrow
|
|
161
|
+
* pass unless the caller already owns one (`bindings: false`) or needs to
|
|
162
|
+
* forward its context (`bindings: { simultaneouslyUpdated }` — arrows resized
|
|
163
|
+
* in the same gesture must not be moved by the pass, `updateBoundElements`
|
|
164
|
+
* skips them only when told).
|
|
165
|
+
*/
|
|
166
|
+
export declare const updateStickyNoteLayout: (container: ExcalidrawStickyNoteElement, scene: Scene, { text, bindings, ...layoutOpts }?: StickyNoteLayoutOpts & {
|
|
167
|
+
/** the label to lay out when it is an uncommitted clone (font actions clone before install) */
|
|
168
|
+
text?: ExcalidrawTextElement | null;
|
|
169
|
+
bindings?: {
|
|
170
|
+
simultaneouslyUpdated?: readonly NonDeletedExcalidrawElement[];
|
|
171
|
+
} | false;
|
|
172
|
+
}) => StickyNoteLayout;
|
|
173
|
+
/**
|
|
174
|
+
* Applies `getStickyNoteLayout` inside an immutable elements array (property
|
|
175
|
+
* actions, paste styles, restore): the notes among `affectedIds` — or the
|
|
176
|
+
* notes whose labels are — get both halves merged into their clones. Elements
|
|
177
|
+
* that need no change keep their identity and version; when `prevElementsMap`
|
|
178
|
+
* is given, notes whose layout inputs did not change skip the fit entirely.
|
|
179
|
+
* Bound arrows are the caller's job once the result is installed.
|
|
180
|
+
*/
|
|
181
|
+
export declare const relayoutStickyNotes: <T extends ExcalidrawElement>(elements: readonly T[], affectedIds: ReadonlySet<ExcalidrawElement["id"]>, opts?: {
|
|
182
|
+
prevElementsMap?: ElementsMap;
|
|
183
|
+
}) => readonly T[];
|