@excalidraw/element 0.18.0-4872083 → 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 +5645 -3994
- package/dist/dev/index.js.map +4 -4
- package/dist/prod/index.js +16 -15
- package/dist/types/common/src/colors.d.ts +13 -7
- package/dist/types/common/src/constants.d.ts +54 -0
- package/dist/types/common/src/keys.d.ts +2 -0
- package/dist/types/common/src/random.d.ts +7 -0
- package/dist/types/common/src/utils.d.ts +5 -0
- package/dist/types/element/src/Scene.d.ts +1 -1
- package/dist/types/element/src/binding.d.ts +13 -7
- package/dist/types/element/src/collision.d.ts +14 -5
- package/dist/types/element/src/comparisons.d.ts +5 -3
- package/dist/types/element/src/delta.d.ts +23 -1
- package/dist/types/element/src/duplicate.d.ts +60 -0
- package/dist/types/element/src/flowchart.d.ts +5 -1
- package/dist/types/element/src/frame.d.ts +2 -2
- package/dist/types/element/src/index.d.ts +2 -0
- package/dist/types/element/src/linearElementEditor.d.ts +10 -0
- 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 +39 -3
- package/dist/types/element/src/renderElement.d.ts +21 -4
- package/dist/types/element/src/shape.d.ts +15 -1
- package/dist/types/element/src/sizeHelpers.d.ts +6 -0
- package/dist/types/element/src/stickyNote.d.ts +183 -0
- package/dist/types/element/src/textElement.d.ts +9 -1
- package/dist/types/element/src/transform.d.ts +25 -6
- package/dist/types/element/src/typeChecks.d.ts +3 -2
- package/dist/types/element/src/types.d.ts +35 -6
- package/dist/types/element/src/utils.d.ts +15 -4
- package/dist/types/element/src/zindex.d.ts +1 -1
- package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +60 -3
- package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
- package/dist/types/excalidraw/actions/actionBoundText.d.ts +40 -2
- package/dist/types/excalidraw/actions/actionCanvas.d.ts +140 -7
- package/dist/types/excalidraw/actions/actionClipboard.d.ts +40 -2
- package/dist/types/excalidraw/actions/actionCropEditor.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +61 -4
- package/dist/types/excalidraw/actions/actionDeselect.d.ts +23 -1
- package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -2
- package/dist/types/excalidraw/actions/actionElementLink.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionElementLock.d.ts +40 -2
- package/dist/types/excalidraw/actions/actionExport.d.ts +40 -2
- package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
- package/dist/types/excalidraw/actions/actionFrame.d.ts +111 -4
- package/dist/types/excalidraw/actions/actionGroup.d.ts +40 -2
- package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +71 -2
- package/dist/types/excalidraw/actions/actionLink.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionMenu.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionProperties.d.ts +50 -8
- package/dist/types/excalidraw/actions/actionSelectAll.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionStyles.d.ts +21 -2
- package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionToggleShowHints.d.ts +197 -0
- package/dist/types/excalidraw/actions/actionToggleStats.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +20 -1
- package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +20 -1
- package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
- package/dist/types/excalidraw/actions/index.d.ts +1 -0
- package/dist/types/excalidraw/actions/types.d.ts +1 -1
- package/dist/types/excalidraw/appState.d.ts +23 -1
- package/dist/types/excalidraw/components/App.arrowText.d.ts +28 -30
- package/dist/types/excalidraw/components/App.bucketFill.d.ts +10 -0
- package/dist/types/excalidraw/components/App.clipboard.d.ts +31 -0
- package/dist/types/excalidraw/components/App.cursor.d.ts +8 -0
- package/dist/types/excalidraw/components/App.d.ts +110 -199
- package/dist/types/excalidraw/components/App.duplicate.d.ts +101 -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 +41 -1
- package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
- package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +6 -2
- package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
- package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +4 -1
- package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +4 -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/colorTopPicksDnD.d.ts +11 -0
- 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 +2 -0
- 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/Tools.d.ts +7 -2
- 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/canvases/NewElementCanvas.d.ts +2 -0
- package/dist/types/excalidraw/components/icons.d.ts +2 -0
- package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +2 -0
- package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +2 -2
- package/dist/types/excalidraw/data/blob.d.ts +40 -2
- package/dist/types/excalidraw/data/json.d.ts +20 -1
- package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
- package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
- package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
- package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
- package/dist/types/excalidraw/renderer/helpers.d.ts +25 -0
- package/dist/types/excalidraw/renderer/interactiveScene.d.ts +1 -1
- package/dist/types/excalidraw/scene/Renderer.d.ts +64 -2
- package/dist/types/excalidraw/scene/index.d.ts +1 -1
- package/dist/types/excalidraw/scene/types.d.ts +3 -1
- package/dist/types/excalidraw/types.d.ts +140 -18
- package/dist/types/excalidraw/viewport.d.ts +33 -1
- package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +12 -1
- package/dist/types/math/src/curve.d.ts +19 -12
- package/dist/types/math/src/segment.d.ts +6 -0
- package/dist/types/utils/src/export.d.ts +1 -0
- package/dist/types/utils/src/shape.d.ts +2 -2
- package/package.json +4 -4
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const applyDarkModeFilter: (color: string, enable?: boolean) => string;
|
|
2
|
+
export declare const removeDarkModeFilter: (color: string) => string;
|
|
2
3
|
export type ColorTuple = readonly [string, string, string, string, string];
|
|
3
4
|
export type ColorPaletteCustom = {
|
|
4
5
|
[key: string]: ColorTuple | string;
|
|
@@ -28,9 +29,16 @@ export declare const COLOR_PALETTE: {
|
|
|
28
29
|
};
|
|
29
30
|
export type ColorPalette = typeof COLOR_PALETTE;
|
|
30
31
|
export type ColorPickerColor = keyof typeof COLOR_PALETTE;
|
|
32
|
+
/** number of slots in the color-picker top-picks strip — the strip layout is
|
|
33
|
+
* sized for exactly this many swatches, and pick customization (replace /
|
|
34
|
+
* reorder) preserves it */
|
|
35
|
+
export declare const COLOR_TOP_PICKS_SLOTS = 5;
|
|
31
36
|
export declare const DEFAULT_ELEMENT_STROKE_PICKS: ColorTuple;
|
|
32
37
|
export declare const DEFAULT_ELEMENT_BACKGROUND_PICKS: ColorTuple;
|
|
33
38
|
export declare const BUCKET_FILL_BACKGROUND_PICKS: ColorTuple;
|
|
39
|
+
export declare const DEFAULT_STICKY_NOTE_BG = "#ffdf6b";
|
|
40
|
+
export declare const STICKY_NOTE_STROKE_PICKS: ColorTuple;
|
|
41
|
+
export declare const STICKY_NOTE_BACKGROUND_PICKS: ColorTuple;
|
|
34
42
|
export declare const DEFAULT_CANVAS_BACKGROUND_PICKS: ColorTuple;
|
|
35
43
|
export declare const DEFAULT_ELEMENT_STROKE_COLOR_PALETTE: {
|
|
36
44
|
readonly cyan: readonly ["#e3fafc", "#99e9f2", "#3bc9db", "#15aabf", "#0c8599"];
|
|
@@ -66,15 +74,13 @@ export declare const DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE: {
|
|
|
66
74
|
readonly black: "#1e1e1e";
|
|
67
75
|
readonly bronze: readonly ["#f8f1ee", "#eaddd7", "#d2bab0", "#a18072", "#846358"];
|
|
68
76
|
};
|
|
69
|
-
/**
|
|
70
|
-
* The color the bucket fill tool actually fills with: the shared
|
|
71
|
-
* `currentItemBackgroundColor`, falling back to green when that is
|
|
72
|
-
* transparent (the tool's picker doesn't offer transparent, but the shared
|
|
73
|
-
* state can hold it from the generic shape picker).
|
|
74
|
-
*/
|
|
75
|
-
export declare const getBucketFillBackgroundColor: (backgroundColor: string) => string;
|
|
76
77
|
export declare const getAllColorsSpecificShade: (index: 0 | 1 | 2 | 3 | 4) => ("#fff5f5" | "#ffc9c9" | "#ff8787" | "#fa5252" | "#e03131" | "#fff0f6" | "#fcc2d7" | "#f783ac" | "#e64980" | "#c2255c" | "#f8f0fc" | "#eebefa" | "#da77f2" | "#be4bdb" | "#9c36b5" | "#f3f0ff" | "#d0bfff" | "#9775fa" | "#7950f2" | "#6741d9" | "#e7f5ff" | "#a5d8ff" | "#4dabf7" | "#228be6" | "#1971c2" | "#e3fafc" | "#99e9f2" | "#3bc9db" | "#15aabf" | "#0c8599" | "#e6fcf5" | "#96f2d7" | "#38d9a9" | "#12b886" | "#099268" | "#ebfbee" | "#b2f2bb" | "#69db7c" | "#40c057" | "#2f9e44" | "#fff9db" | "#ffec99" | "#ffd43b" | "#fab005" | "#f08c00" | "#fff4e6" | "#ffd8a8" | "#ffa94d" | "#fd7e14" | "#e8590c")[];
|
|
77
78
|
export declare const rgbToHex: (r: number, g: number, b: number, a?: number) => string;
|
|
79
|
+
/**
|
|
80
|
+
* @returns the color with its alpha replaced by `alpha` (as #RRGGBBAA), or the
|
|
81
|
+
* input unchanged if it's not a valid color
|
|
82
|
+
*/
|
|
83
|
+
export declare const setColorAlpha: (color: string, alpha: number) => string;
|
|
78
84
|
/**
|
|
79
85
|
* @returns #RRGGBB or #RRGGBBAA based on color containing non-opaque alpha,
|
|
80
86
|
* null if not valid color
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { ExcalidrawElement, FontFamilyValues } from "@excalidraw/element/types";
|
|
2
2
|
import type { AppProps, AppState } from "@excalidraw/excalidraw/types";
|
|
3
|
+
export { DEFAULT_STICKY_NOTE_BG } from "./colors";
|
|
3
4
|
export declare const supportsResizeObserver: boolean;
|
|
4
5
|
export declare const APP_NAME = "Excalidraw";
|
|
5
6
|
export declare const TEXT_AUTOWRAP_THRESHOLD = 36;
|
|
7
|
+
export declare const TEXT_VIEWPORT_PADDING = 20;
|
|
8
|
+
export declare const TEXT_MAX_WRAP_WIDTH = 800;
|
|
6
9
|
export declare const DRAGGING_THRESHOLD = 10;
|
|
7
10
|
export declare const MINIMUM_ARROW_SIZE = 20;
|
|
8
11
|
export declare const LINE_CONFIRM_THRESHOLD = 8;
|
|
@@ -52,6 +55,7 @@ export declare enum EVENT {
|
|
|
52
55
|
POINTER_MOVE = "pointermove",
|
|
53
56
|
POINTER_DOWN = "pointerdown",
|
|
54
57
|
POINTER_UP = "pointerup",
|
|
58
|
+
POINTER_CANCEL = "pointercancel",
|
|
55
59
|
STATE_CHANGE = "statechange",
|
|
56
60
|
WHEEL = "wheel",
|
|
57
61
|
TOUCH_START = "touchstart",
|
|
@@ -150,7 +154,53 @@ export declare const FRAME_STYLE: {
|
|
|
150
154
|
};
|
|
151
155
|
export declare const MIN_FONT_SIZE = 1;
|
|
152
156
|
export declare const DEFAULT_FONT_SIZE = 20;
|
|
157
|
+
export declare const STICKY_NOTE_MIN_FONT_SIZE = 16;
|
|
158
|
+
export declare const STICKY_NOTE_MAX_FONT_SIZE = 512;
|
|
159
|
+
export declare const STICKY_NOTE_FALLBACK_FONT_SIZE = 28;
|
|
160
|
+
export declare const STICKY_NOTE_FONT_STEP = 2;
|
|
161
|
+
export declare const STICKY_NOTE_PADDING = 16;
|
|
162
|
+
/**
|
|
163
|
+
* The creation-date footer: a 20px text row under the label body plus a 12px
|
|
164
|
+
* gap above it, inside the note's bottom padding. Reserved for every note —
|
|
165
|
+
* also when `created` is unknown — so geometry never depends on data
|
|
166
|
+
* availability. The label is chosen by width bucket, never measured, so
|
|
167
|
+
* painting stays measurement-free (the server has no text measurer):
|
|
168
|
+
* `minBodyWidthForYear` is the worst case ("30 May 2026") in the system sans
|
|
169
|
+
* stack at 12px, with margin for wider fallbacks such as DejaVu Sans.
|
|
170
|
+
*/
|
|
171
|
+
/**
|
|
172
|
+
* The creation-date footer of a sticky note. The label body ends `height`
|
|
173
|
+
* above the note's bottom padding, and the date's baseline sits
|
|
174
|
+
* `baselineFromBottom` above the note's bottom edge — so the 12px glyphs
|
|
175
|
+
* (~9px above the baseline, ~3px below) end up roughly 11px from the edge
|
|
176
|
+
* with a ~13px gap to the label body above them.
|
|
177
|
+
*/
|
|
178
|
+
export declare const STICKY_NOTE_FOOTER: {
|
|
179
|
+
readonly height: 20;
|
|
180
|
+
readonly fontSize: 12;
|
|
181
|
+
readonly fontFamily: "Helvetica, Arial, sans-serif";
|
|
182
|
+
readonly baselineFromBottom: 14;
|
|
183
|
+
readonly opacity: 1;
|
|
184
|
+
readonly minBodyWidthForYear: 80;
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* outer height → label body height: top + bottom padding + footer. The body
|
|
188
|
+
* is what the label is fitted into; a middle-aligned label is still centered
|
|
189
|
+
* in the whole padded note when it fits (see `computeBoundTextPosition`).
|
|
190
|
+
*/
|
|
191
|
+
export declare const STICKY_NOTE_BODY_INSET_Y: number;
|
|
192
|
+
export declare const DEFAULT_STICKY_NOTE_SIZE = 250;
|
|
193
|
+
export declare const STICKY_NOTE_MIN_SIZE = 75;
|
|
194
|
+
export declare const STICKY_NOTE_SHADOW_OFFSET = 3;
|
|
195
|
+
export declare const STICKY_NOTE_SHADOW_OPACITY = 0.16;
|
|
196
|
+
export declare const STICKY_NOTE_EDGE_SHADOW_WIDTH = 0.5;
|
|
197
|
+
export declare const STICKY_NOTE_EDGE_SHADOW_OPACITY = 0.08;
|
|
153
198
|
export declare const DEFAULT_FONT_FAMILY: FontFamilyValues;
|
|
199
|
+
/** number of slots in the font-picker top-picks strip — pick customization
|
|
200
|
+
* (replace / reorder) preserves it. Must equal `DEFAULT_FONTS.length` in
|
|
201
|
+
* `packages/excalidraw/components/FontPicker/FontPicker.tsx` (enforced by
|
|
202
|
+
* `fontTopPicks.test.ts`) */
|
|
203
|
+
export declare const FONT_TOP_PICKS_SLOTS = 3;
|
|
154
204
|
export declare const DEFAULT_TEXT_ALIGN = "left";
|
|
155
205
|
export declare const DEFAULT_VERTICAL_ALIGN = "top";
|
|
156
206
|
export declare const DEFAULT_VERSION = "{version}";
|
|
@@ -224,9 +274,12 @@ export declare const TOUCH_CTX_MENU_TIMEOUT = 500;
|
|
|
224
274
|
export declare const TITLE_TIMEOUT = 10000;
|
|
225
275
|
export declare const VERSION_TIMEOUT = 30000;
|
|
226
276
|
export declare const SCROLL_TIMEOUT = 100;
|
|
277
|
+
export declare const ZEN_MODE_TRANSITION_DURATION = 250;
|
|
227
278
|
export declare const ZOOM_STEP = 0.1;
|
|
228
279
|
export declare const MIN_ZOOM = 0.1;
|
|
229
280
|
export declare const MAX_ZOOM = 30;
|
|
281
|
+
/** 100% zoom, for computations that have no editor zoom to go by */
|
|
282
|
+
export declare const DEFAULT_ZOOM: AppState["zoom"];
|
|
230
283
|
export declare const HYPERLINK_TOOLTIP_DELAY = 300;
|
|
231
284
|
export declare const IDLE_THRESHOLD = 60000;
|
|
232
285
|
export declare const ACTIVE_THRESHOLD = 3000;
|
|
@@ -313,6 +366,7 @@ export declare const TOOL_TYPE: {
|
|
|
313
366
|
readonly hand: "hand";
|
|
314
367
|
readonly frame: "frame";
|
|
315
368
|
readonly magicframe: "magicframe";
|
|
369
|
+
readonly stickynote: "stickynote";
|
|
316
370
|
readonly embeddable: "embeddable";
|
|
317
371
|
readonly laser: "laser";
|
|
318
372
|
readonly autoshape: "autoshape";
|
|
@@ -55,6 +55,7 @@ export declare const KEYS: {
|
|
|
55
55
|
readonly H: "h";
|
|
56
56
|
readonly I: "i";
|
|
57
57
|
readonly L: "l";
|
|
58
|
+
readonly N: "n";
|
|
58
59
|
readonly O: "o";
|
|
59
60
|
readonly P: "p";
|
|
60
61
|
readonly Q: "q";
|
|
@@ -111,6 +112,7 @@ export declare const KeyCodeMap: Map<ValueOf<{
|
|
|
111
112
|
readonly H: "h";
|
|
112
113
|
readonly I: "i";
|
|
113
114
|
readonly L: "l";
|
|
115
|
+
readonly N: "n";
|
|
114
116
|
readonly O: "o";
|
|
115
117
|
readonly P: "p";
|
|
116
118
|
readonly Q: "q";
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
export declare const randomInteger: () => number;
|
|
2
2
|
export declare const reseed: (seed: number) => void;
|
|
3
3
|
export declare const randomId: () => string;
|
|
4
|
+
/**
|
|
5
|
+
* Deterministic PRNG (mulberry32) for a given seed: same seed, same
|
|
6
|
+
* sequence — used where a render must be stable across frames and clients
|
|
7
|
+
* (e.g. the sticky note's corner jitter) and roughjs's `Random` is
|
|
8
|
+
* unsuitable (it degenerates for seed 0). Returns numbers in [0, 1).
|
|
9
|
+
*/
|
|
10
|
+
export declare const seededRandom: (seed: number) => () => number;
|
|
@@ -87,6 +87,11 @@ export declare const getGlobalCSSVariable: (name: string) => string;
|
|
|
87
87
|
* See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171
|
|
88
88
|
*/
|
|
89
89
|
export declare const isRTL: (text: string) => boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Checks whether the text has any RTL character, i.e. whether it may be laid
|
|
92
|
+
* out bidirectionally.
|
|
93
|
+
*/
|
|
94
|
+
export declare const hasRTLChars: (text: string) => boolean;
|
|
90
95
|
export declare const tupleToCoors: (xyTuple: readonly [number, number]) => {
|
|
91
96
|
x: number;
|
|
92
97
|
y: number;
|
|
@@ -72,7 +72,7 @@ export declare class Scene {
|
|
|
72
72
|
getElementIndex(elementId: string): number;
|
|
73
73
|
getContainerElement: (element: (ExcalidrawElement & {
|
|
74
74
|
containerId: ExcalidrawElement["id"] | null;
|
|
75
|
-
}) | null) => import("@excalidraw/element/types").ExcalidrawLinearElement | import("@excalidraw/element/types").ExcalidrawSelectionElement | import("@excalidraw/element/types").ExcalidrawRectangleElement | import("@excalidraw/element/types").ExcalidrawDiamondElement | import("@excalidraw/element/types").ExcalidrawEllipseElement | import("@excalidraw/element/types").ExcalidrawEmbeddableElement | import("@excalidraw/element/types").ExcalidrawIframeElement | import("@excalidraw/element/types").ExcalidrawImageElement | import("@excalidraw/element/types").ExcalidrawFrameElement | import("@excalidraw/element/types").ExcalidrawMagicFrameElement | import("@excalidraw/element/types").ExcalidrawTextElement | import("@excalidraw/element/types").ExcalidrawFreeDrawElement | null;
|
|
75
|
+
}) | null) => import("@excalidraw/element/types").ExcalidrawLinearElement | import("@excalidraw/element/types").ExcalidrawSelectionElement | import("@excalidraw/element/types").ExcalidrawRectangleElement | import("@excalidraw/element/types").ExcalidrawStickyNoteElement | import("@excalidraw/element/types").ExcalidrawDiamondElement | import("@excalidraw/element/types").ExcalidrawEllipseElement | import("@excalidraw/element/types").ExcalidrawEmbeddableElement | import("@excalidraw/element/types").ExcalidrawIframeElement | import("@excalidraw/element/types").ExcalidrawImageElement | import("@excalidraw/element/types").ExcalidrawFrameElement | import("@excalidraw/element/types").ExcalidrawMagicFrameElement | import("@excalidraw/element/types").ExcalidrawTextElement | import("@excalidraw/element/types").ExcalidrawFreeDrawElement | null;
|
|
76
76
|
getElementsFromId: (id: string) => ExcalidrawElement[];
|
|
77
77
|
mutateElement<TElement extends Mutable<ExcalidrawElement>>(element: TElement, updates: ElementUpdate<TElement>, options?: {
|
|
78
78
|
informMutation: boolean;
|
|
@@ -25,10 +25,9 @@ export type BindingStrategy = {
|
|
|
25
25
|
* IMPORTANT: currently must be > 0 (this also applies to the computed gap)
|
|
26
26
|
*/
|
|
27
27
|
export declare const BASE_BINDING_GAP = 5;
|
|
28
|
-
export declare const BASE_BINDING_GAP_ELBOW = 5;
|
|
29
28
|
export declare const BASE_ARROW_MIN_LENGTH = 10;
|
|
30
29
|
export declare const FOCUS_POINT_SIZE: number;
|
|
31
|
-
export declare const getBindingGap: (bindTarget: Pick<ExcalidrawBindableElement, "strokeWidth"
|
|
30
|
+
export declare const getBindingGap: (bindTarget: Pick<ExcalidrawBindableElement, "strokeWidth">) => number;
|
|
32
31
|
export declare const maxBindingDistance_simple: (zoom?: AppState["zoom"]) => number;
|
|
33
32
|
export declare const isBindingEnabled: (appState: {
|
|
34
33
|
isBindingEnabled: AppState["isBindingEnabled"];
|
|
@@ -49,16 +48,17 @@ export declare const getBindingStrategyForDraggingBindingElementEndpoints: (arro
|
|
|
49
48
|
altKey?: boolean;
|
|
50
49
|
finalize?: boolean;
|
|
51
50
|
initialBinding?: boolean;
|
|
52
|
-
zoom?: AppState["zoom"];
|
|
53
51
|
gridSize?: NullableGridSize;
|
|
54
52
|
}) => {
|
|
55
53
|
start: BindingStrategy;
|
|
56
54
|
end: BindingStrategy;
|
|
57
55
|
};
|
|
58
56
|
export declare const bindOrUnbindBindingElements: (selectedArrows: NonDeleted<ExcalidrawArrowElement>[], scene: Scene, appState: AppState) => void;
|
|
59
|
-
export declare const bindBindingElement: (arrow: NonDeleted<ExcalidrawArrowElement>, hoveredElement: NonDeleted<ExcalidrawBindableElement>, mode: BindMode, startOrEnd: "start" | "end", scene: Scene, focusPoint?: GlobalPoint, shouldSnapToOutline?: boolean, isMidpointSnappingEnabled?: boolean) => void;
|
|
57
|
+
export declare const bindBindingElement: (arrow: NonDeleted<ExcalidrawArrowElement>, hoveredElement: NonDeleted<ExcalidrawBindableElement>, mode: BindMode, startOrEnd: "start" | "end", scene: Scene, zoom: AppState["zoom"], focusPoint?: GlobalPoint, shouldSnapToOutline?: boolean, isMidpointSnappingEnabled?: boolean) => void;
|
|
60
58
|
export declare const unbindBindingElement: (arrow: ExcalidrawArrowElement, startOrEnd: "start" | "end", scene: Scene) => ExcalidrawBindableElement["id"] | null;
|
|
59
|
+
export declare const reanchorBindingsToOutline: (changedElement: NonDeleted<ExcalidrawBindableElement>, scene: Scene, zoom: AppState["zoom"]) => void;
|
|
61
60
|
export declare const updateBoundElements: (changedElement: NonDeletedExcalidrawElement, scene: Scene, options?: {
|
|
61
|
+
/** see `getSimultaneouslyUpdatedElementIds` for how to pass it */
|
|
62
62
|
simultaneouslyUpdated?: readonly NonDeletedExcalidrawElement[];
|
|
63
63
|
changedElements?: Map<string, ExcalidrawElement>;
|
|
64
64
|
}) => void;
|
|
@@ -69,12 +69,18 @@ export declare const updateBindings: (latestElement: NonDeletedExcalidrawElement
|
|
|
69
69
|
height: number;
|
|
70
70
|
};
|
|
71
71
|
}) => void;
|
|
72
|
+
/**
|
|
73
|
+
* The id set of `simultaneouslyUpdated`, shared by every `updateBoundElements()`
|
|
74
|
+
* call given the same array. Pass one array instance for all elements of an
|
|
75
|
+
* operation, and don't change its membership after the first lookup, or the
|
|
76
|
+
* cached ids go stale.
|
|
77
|
+
*/
|
|
78
|
+
export declare const getSimultaneouslyUpdatedElementIds: (simultaneouslyUpdated: readonly ExcalidrawElement[] | undefined) => ReadonlySet<ExcalidrawElement["id"]>;
|
|
72
79
|
export declare const getHeadingForElbowArrowSnap: (p: Readonly<GlobalPoint>, otherPoint: Readonly<GlobalPoint>, bindableElement: ExcalidrawBindableElement | undefined | null, aabb: Bounds | undefined | null, origPoint: GlobalPoint, elementsMap: ElementsMap, zoom?: AppState["zoom"]) => Heading;
|
|
73
|
-
export declare const bindPointToSnapToElementOutline: (arrowElement: ExcalidrawArrowElement, bindableElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap, customIntersector?: LineSegment<GlobalPoint>, isMidpointSnappingEnabled?: boolean) => GlobalPoint;
|
|
80
|
+
export declare const bindPointToSnapToElementOutline: (arrowElement: ExcalidrawArrowElement, bindableElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap, zoom: AppState["zoom"], customIntersector?: LineSegment<GlobalPoint>, isMidpointSnappingEnabled?: boolean) => GlobalPoint;
|
|
74
81
|
export declare const avoidRectangularCorner: (arrowElement: ExcalidrawArrowElement, bindTarget: ExcalidrawBindableElement, elementsMap: ElementsMap, p: GlobalPoint) => GlobalPoint;
|
|
75
|
-
export declare const snapToMid: (bindTarget: ExcalidrawBindableElement, elementsMap: ElementsMap, p: GlobalPoint, tolerance?: number, arrowElement?: ExcalidrawArrowElement) => GlobalPoint | undefined;
|
|
76
82
|
export declare const updateBoundPoint: (arrow: NonDeleted<ExcalidrawArrowElement>, startOrEnd: "startBinding" | "endBinding", binding: FixedPointBinding | null | undefined, bindableElement: ExcalidrawBindableElement, elementsMap: ElementsMap, dragging?: boolean) => LocalPoint | null;
|
|
77
|
-
export declare const calculateFixedPointForElbowArrowBinding: (linearElement: NonDeleted<ExcalidrawElbowArrowElement>, hoveredElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap, shouldSnapToOutline?: boolean, isMidpointSnappingEnabled?: boolean) => {
|
|
83
|
+
export declare const calculateFixedPointForElbowArrowBinding: (linearElement: NonDeleted<ExcalidrawElbowArrowElement>, hoveredElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap, zoom: AppState["zoom"], shouldSnapToOutline?: boolean, isMidpointSnappingEnabled?: boolean) => {
|
|
78
84
|
fixedPoint: FixedPoint;
|
|
79
85
|
};
|
|
80
86
|
export declare const calculateFixedPointForNonElbowArrowBinding: (linearElement: NonDeleted<ExcalidrawArrowElement>, hoveredElement: NonDeleted<ExcalidrawBindableElement>, startOrEnd: "start" | "end", elementsMap: ElementsMap, focusPoint?: GlobalPoint) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { GlobalPoint, LineSegment } from "@excalidraw/math";
|
|
2
|
-
import type { FrameNameBounds } from "@excalidraw/excalidraw/types";
|
|
3
|
-
import type { ElementsMap,
|
|
2
|
+
import type { AppState, FrameNameBounds } from "@excalidraw/excalidraw/types";
|
|
3
|
+
import type { ElementsMap, ExcalidrawBindableElement, ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement, NonDeletedSceneElementsMap, Ordered } from "./types";
|
|
4
4
|
export declare const shouldTestInside: (element: ExcalidrawElement) => boolean;
|
|
5
5
|
export type HitTestArgs = {
|
|
6
6
|
point: GlobalPoint;
|
|
@@ -14,9 +14,18 @@ export declare const hitElementItself: ({ point, element, threshold, elementsMap
|
|
|
14
14
|
export declare const hitElementBoundingBox: (point: GlobalPoint, element: ExcalidrawElement, elementsMap: ElementsMap, tolerance?: number) => boolean;
|
|
15
15
|
export declare const hitElementBoundingBoxOnly: (hitArgs: HitTestArgs, elementsMap: ElementsMap) => boolean;
|
|
16
16
|
export declare const hitElementBoundText: (point: GlobalPoint, element: ExcalidrawElement, elementsMap: ElementsMap) => boolean;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Whether the element hides what is behind it from binding — an arrow's or a
|
|
19
|
+
* text label's. Images count as opaque, and frames once they support a
|
|
20
|
+
* background.
|
|
21
|
+
*/
|
|
22
|
+
export declare const isOpaqueForBinding: (element: ExcalidrawElement) => boolean;
|
|
23
|
+
/**
|
|
24
|
+
* All elements an arrow endpoint at the point could bind to. Always includes
|
|
25
|
+
* the result of `getHoveredElementForBinding` for the same arguments.
|
|
26
|
+
*/
|
|
27
|
+
export declare const getAllHoveredElementAtPoint: (point: Readonly<GlobalPoint>, elements: readonly Ordered<NonDeletedExcalidrawElement>[], elementsMap: NonDeletedSceneElementsMap, zoom: AppState["zoom"]) => NonDeleted<ExcalidrawBindableElement>[];
|
|
28
|
+
export declare const getHoveredElementForBinding: (point: Readonly<GlobalPoint>, elements: readonly Ordered<NonDeletedExcalidrawElement>[], elementsMap: NonDeletedSceneElementsMap, zoom: AppState["zoom"]) => NonDeleted<ExcalidrawBindableElement> | null;
|
|
20
29
|
/**
|
|
21
30
|
* Intersect a line with an element for binding test
|
|
22
31
|
*
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { ElementOrToolType } from "@excalidraw/excalidraw/types";
|
|
2
|
-
export declare const hasBackground: (type: ElementOrToolType) => type is "line" | "rectangle" | "diamond" | "ellipse" | "embeddable" | "iframe" | "freedraw" | "autoshape" | "bucketfill";
|
|
3
|
-
export declare const
|
|
2
|
+
export declare const hasBackground: (type: ElementOrToolType) => type is "line" | "rectangle" | "stickynote" | "diamond" | "ellipse" | "embeddable" | "iframe" | "freedraw" | "autoshape" | "bucketfill";
|
|
3
|
+
export declare const hasFillStyle: (type: ElementOrToolType) => type is "line" | "rectangle" | "diamond" | "ellipse" | "embeddable" | "iframe" | "freedraw" | "autoshape" | "bucketfill";
|
|
4
|
+
export declare const hasStrokeColor: (type: ElementOrToolType) => type is "line" | "arrow" | "text" | "rectangle" | "stickynote" | "diamond" | "ellipse" | "embeddable" | "freedraw" | "autoshape";
|
|
4
5
|
export declare const hasStrokeWidth: (type: ElementOrToolType) => type is "line" | "arrow" | "rectangle" | "diamond" | "ellipse" | "embeddable" | "iframe" | "freedraw" | "autoshape";
|
|
5
6
|
export declare const hasStrokeStyle: (type: ElementOrToolType) => type is "line" | "arrow" | "rectangle" | "diamond" | "ellipse" | "embeddable" | "iframe" | "autoshape";
|
|
7
|
+
export declare const hasRoughness: (type: ElementOrToolType) => type is "line" | "arrow" | "rectangle" | "stickynote" | "diamond" | "ellipse" | "embeddable" | "iframe" | "autoshape";
|
|
6
8
|
export declare const hasFreedrawMode: (type: ElementOrToolType) => type is "freedraw";
|
|
7
|
-
export declare const canChangeRoundness: (type: ElementOrToolType) => type is "line" | "rectangle" | "diamond" | "embeddable" | "iframe" | "image";
|
|
9
|
+
export declare const canChangeRoundness: (type: ElementOrToolType) => type is "line" | "rectangle" | "stickynote" | "diamond" | "embeddable" | "iframe" | "image";
|
|
8
10
|
export declare const toolIsArrow: (type: ElementOrToolType) => type is "arrow";
|
|
9
11
|
export declare const canHaveArrowheads: (type: ElementOrToolType) => type is "arrow";
|
|
@@ -192,7 +192,29 @@ export declare class ElementsDelta implements DeltaContainer<SceneElementsMap> {
|
|
|
192
192
|
private static createGetter;
|
|
193
193
|
private static applyDelta;
|
|
194
194
|
/**
|
|
195
|
-
*
|
|
195
|
+
* Whether an element looks different after the delta — and the layout that
|
|
196
|
+
* followed it — was applied. The input to history's "skip entries with no
|
|
197
|
+
* visible change" loop.
|
|
198
|
+
*
|
|
199
|
+
* Both sides are first reduced to what actually paints:
|
|
200
|
+
* - a missing or deleted element paints nothing;
|
|
201
|
+
* - an empty text element paints nothing either — unless it carries arrow
|
|
202
|
+
* bindings (an arrow may end at it) or sits on an arrow (an empty label
|
|
203
|
+
* still cuts the arrow's gap);
|
|
204
|
+
* so an empty label's deletion or restoration compares as nothing against
|
|
205
|
+
* nothing. Two painting elements are then compared property by property:
|
|
206
|
+
* - `version`, `versionNonce`, `updated`, `created` are metadata, and
|
|
207
|
+
* `index` is covered by the separate z-order check (`reorderElements`);
|
|
208
|
+
* - `boundElements` is compared as `type:id` references with references to
|
|
209
|
+
* empty labels dropped, so adding or removing an empty label's reference
|
|
210
|
+
* is not visible on its own, and binding repair that rebuilt equal
|
|
211
|
+
* objects is not either;
|
|
212
|
+
* - everything else counts. Nested arrays (`points`, binding fixed points)
|
|
213
|
+
* compare by reference, which can only over-report a change — the safe
|
|
214
|
+
* direction, where undo stops one entry early.
|
|
215
|
+
*
|
|
216
|
+
* `previousElements` holds only `idsToCheck` (see `applyTo`); the label
|
|
217
|
+
* lookups it serves are for elements whose labels are in that set.
|
|
196
218
|
*/
|
|
197
219
|
private static checkForVisibleDifference;
|
|
198
220
|
/**
|
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
import type { Mutable } from "@excalidraw/common/utility-types";
|
|
2
2
|
import type { AppState } from "@excalidraw/excalidraw/types";
|
|
3
3
|
import type { ExcalidrawElement, GroupId, NonDeletedExcalidrawElement } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* Lookups supplied to the host's `props.onDuplicate`, covering just the
|
|
6
|
+
* elements taking part in the duplication.
|
|
7
|
+
*/
|
|
8
|
+
export type OnDuplicateData = {
|
|
9
|
+
/** the duplicates, by their id */
|
|
10
|
+
duplicateElements: ReadonlyMap<ExcalidrawElement["id"], ExcalidrawElement>;
|
|
11
|
+
/**
|
|
12
|
+
* The elements the duplicates were made from, by their id.
|
|
13
|
+
*
|
|
14
|
+
* On paste and library insert these are the inserted elements, which aren't
|
|
15
|
+
* part of the scene (though they may share ids with the scene elements they
|
|
16
|
+
* were copied from).
|
|
17
|
+
*/
|
|
18
|
+
originalElements: ReadonlyMap<ExcalidrawElement["id"], ExcalidrawElement>;
|
|
19
|
+
/**
|
|
20
|
+
* id of an original -> id of its duplicate (e.g. to remap element ids you
|
|
21
|
+
* keep in `customData`, which the duplicate copied from its original)
|
|
22
|
+
*/
|
|
23
|
+
origIdToDuplicateId: ReadonlyMap<ExcalidrawElement["id"], ExcalidrawElement["id"]>;
|
|
24
|
+
/**
|
|
25
|
+
* id of a duplicate -> id of its original (e.g. to look up the original in
|
|
26
|
+
* `originalElements` while modifying the duplicate)
|
|
27
|
+
*/
|
|
28
|
+
duplicateIdToOrigId: ReadonlyMap<ExcalidrawElement["id"], ExcalidrawElement["id"]>;
|
|
29
|
+
};
|
|
4
30
|
/**
|
|
5
31
|
* Duplicate an element, often used in the alt-drag operation.
|
|
6
32
|
* Note that this method has gotten a bit complicated since the
|
|
@@ -49,8 +75,42 @@ export declare const duplicateElements: (opts: {
|
|
|
49
75
|
})) => {
|
|
50
76
|
duplicatedElements: NonDeletedExcalidrawElement[];
|
|
51
77
|
duplicateElementsMap: Map<string, NonDeletedExcalidrawElement>;
|
|
78
|
+
origElementsMap: Map<string, ExcalidrawElement>;
|
|
52
79
|
elementsWithDuplicates: ExcalidrawElement[];
|
|
53
80
|
origIdToDuplicateId: Map<string, string>;
|
|
81
|
+
duplicateIdToOrigId: Map<string, string>;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Folds the elements returned by the host (`props.onDuplicate`) back into the
|
|
85
|
+
* duplicates the editor created, so that everything that follows (frame
|
|
86
|
+
* assignment, bound text redraw, selection, alt-drag handover) can keep
|
|
87
|
+
* working with the editor's own objects, whether the host mutated the
|
|
88
|
+
* duplicates or returned new objects for them.
|
|
89
|
+
*
|
|
90
|
+
* - A returned element with a duplicate's id is shallow-merged into that
|
|
91
|
+
* duplicate, which takes its place in the returned array. Properties the
|
|
92
|
+
* host omits are kept, so that a partial element can't invalidate the
|
|
93
|
+
* duplicate. Safe only because the duplicates are fresh (not in the scene or
|
|
94
|
+
* the store snapshot yet), which is why nothing but the passed duplicates is
|
|
95
|
+
* ever merged into. Since the merge goes around `mutateElement`, what may
|
|
96
|
+
* have been cached for the duplicate by then is invalidated here.
|
|
97
|
+
* - A duplicate missing from the returned array (or returned as deleted) is
|
|
98
|
+
* vetoed. So is the bound text of a vetoed container. What the remaining
|
|
99
|
+
* duplicates reference of the vetoed ones is cleared, as if those were never
|
|
100
|
+
* part of the duplication (see `fixDuplicatedBindingsAfterDuplication`).
|
|
101
|
+
* - Any other returned element is used as is (existing elements must not be
|
|
102
|
+
* mutated, so the host replaces them).
|
|
103
|
+
* - `false` vetoes all the duplicates.
|
|
104
|
+
*
|
|
105
|
+
* @returns next elements, and the duplicates that weren't vetoed
|
|
106
|
+
*/
|
|
107
|
+
export declare const reconcileDuplicatedElements: <TDuplicate extends ExcalidrawElement>(
|
|
108
|
+
/** what the host returned from `props.onDuplicate`, if anything */
|
|
109
|
+
hostElements: readonly ExcalidrawElement[] | void | false,
|
|
110
|
+
/** elements that were passed to the host */
|
|
111
|
+
nextElements: ExcalidrawElement[], duplicatedElements: TDuplicate[]) => {
|
|
112
|
+
elements: ExcalidrawElement[];
|
|
113
|
+
duplicatedElements: TDuplicate[];
|
|
54
114
|
};
|
|
55
115
|
/**
|
|
56
116
|
* Clones ExcalidrawElement data structure. Does not regenerate id, nonce, or
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { AppState, PendingExcalidrawElements } from "@excalidraw/excalidraw/types";
|
|
2
|
-
import { type NonDeleted, type ElementsMap, type ExcalidrawElement, type ExcalidrawFlowchartNodeElement } from "./types";
|
|
2
|
+
import { type NonDeleted, type ElementsMap, type ExcalidrawElement, type ExcalidrawFlowchartNodeElement, type NonDeletedExcalidrawElement } from "./types";
|
|
3
3
|
import type { Scene } from "./Scene";
|
|
4
4
|
export type LinkDirection = "up" | "right" | "down" | "left";
|
|
5
|
+
export declare const addNewNodes: (startNode: NonDeleted<ExcalidrawFlowchartNodeElement>, appState: AppState, direction: LinkDirection, scene: Scene, numberOfNodes: number, stickyCrossStart?: number | null) => {
|
|
6
|
+
nodes: NonDeletedExcalidrawElement[];
|
|
7
|
+
crossStart: number;
|
|
8
|
+
};
|
|
5
9
|
export declare class FlowChartNavigator {
|
|
6
10
|
isExploring: boolean;
|
|
7
11
|
private sameLevelNodes;
|
|
@@ -31,8 +31,8 @@ export declare const getFrameLikeElements: (allElements: ExcalidrawElementsInclu
|
|
|
31
31
|
*/
|
|
32
32
|
export declare const getRootElements: <T extends ExcalidrawElement>(allElements: readonly T[]) => T[];
|
|
33
33
|
export declare const getElementsInResizingFrame: (allElements: ExcalidrawElementsIncludingDeleted, frame: ExcalidrawFrameLikeElement, appState: AppState, elementsMap: ElementsMap) => ExcalidrawElement[];
|
|
34
|
-
export declare const getElementsInNewFrame: (elements: ExcalidrawElementsIncludingDeleted, frame: ExcalidrawFrameLikeElement, elementsMap: ElementsMap) => (import("./types").ExcalidrawLinearElement | import("./types").ExcalidrawSelectionElement | import("./types").ExcalidrawRectangleElement | import("./types").ExcalidrawDiamondElement | import("./types").ExcalidrawEllipseElement | import("./types").ExcalidrawEmbeddableElement | import("./types").ExcalidrawIframeElement | import("./types").ExcalidrawImageElement | import("./types").ExcalidrawFrameElement | import("./types").ExcalidrawMagicFrameElement | import("./types").ExcalidrawTextElement | import("./types").ExcalidrawFreeDrawElement)[];
|
|
35
|
-
export declare const omitPartialGroups: (elements: ExcalidrawElement[], frame: ExcalidrawFrameLikeElement, allElementsMap: ElementsMap) => (import("./types").ExcalidrawLinearElement | import("./types").ExcalidrawSelectionElement | import("./types").ExcalidrawRectangleElement | import("./types").ExcalidrawDiamondElement | import("./types").ExcalidrawEllipseElement | import("./types").ExcalidrawEmbeddableElement | import("./types").ExcalidrawIframeElement | import("./types").ExcalidrawImageElement | import("./types").ExcalidrawFrameElement | import("./types").ExcalidrawMagicFrameElement | import("./types").ExcalidrawTextElement | import("./types").ExcalidrawFreeDrawElement)[];
|
|
34
|
+
export declare const getElementsInNewFrame: (elements: ExcalidrawElementsIncludingDeleted, frame: ExcalidrawFrameLikeElement, elementsMap: ElementsMap) => (import("./types").ExcalidrawLinearElement | import("./types").ExcalidrawSelectionElement | import("./types").ExcalidrawRectangleElement | import("./types").ExcalidrawStickyNoteElement | import("./types").ExcalidrawDiamondElement | import("./types").ExcalidrawEllipseElement | import("./types").ExcalidrawEmbeddableElement | import("./types").ExcalidrawIframeElement | import("./types").ExcalidrawImageElement | import("./types").ExcalidrawFrameElement | import("./types").ExcalidrawMagicFrameElement | import("./types").ExcalidrawTextElement | import("./types").ExcalidrawFreeDrawElement)[];
|
|
35
|
+
export declare const omitPartialGroups: (elements: ExcalidrawElement[], frame: ExcalidrawFrameLikeElement, allElementsMap: ElementsMap) => (import("./types").ExcalidrawLinearElement | import("./types").ExcalidrawSelectionElement | import("./types").ExcalidrawRectangleElement | import("./types").ExcalidrawStickyNoteElement | import("./types").ExcalidrawDiamondElement | import("./types").ExcalidrawEllipseElement | import("./types").ExcalidrawEmbeddableElement | import("./types").ExcalidrawIframeElement | import("./types").ExcalidrawImageElement | import("./types").ExcalidrawFrameElement | import("./types").ExcalidrawMagicFrameElement | import("./types").ExcalidrawTextElement | import("./types").ExcalidrawFreeDrawElement)[];
|
|
36
36
|
export declare const getContainingFrame: (element: ExcalidrawElement, elementsMap: ElementsMap) => ExcalidrawFrameLikeElement | null;
|
|
37
37
|
/** */
|
|
38
38
|
export declare const filterElementsEligibleAsFrameChildren: (elements: readonly ExcalidrawElement[], frame: ExcalidrawFrameLikeElement) => ExcalidrawElement[];
|
|
@@ -36,6 +36,7 @@ export * from "./groups";
|
|
|
36
36
|
export * from "./heading";
|
|
37
37
|
export * from "./image";
|
|
38
38
|
export * from "./linearElementEditor";
|
|
39
|
+
export * from "./listMarker";
|
|
39
40
|
export * from "./mutateElement";
|
|
40
41
|
export * from "./newElement";
|
|
41
42
|
export * from "./positionElementsOnGrid";
|
|
@@ -49,6 +50,7 @@ export * from "./showSelectedShapeActions";
|
|
|
49
50
|
export * from "./sizeHelpers";
|
|
50
51
|
export * from "./sortElements";
|
|
51
52
|
export * from "./store";
|
|
53
|
+
export * from "./stickyNote";
|
|
52
54
|
export * from "./textElement";
|
|
53
55
|
export * from "./textMeasurements";
|
|
54
56
|
export * from "./textWrapping";
|
|
@@ -65,6 +65,8 @@ export declare class LinearElementEditor {
|
|
|
65
65
|
}, linearElementEditor: LinearElementEditor, scene: Scene): {
|
|
66
66
|
didAddPoint: boolean;
|
|
67
67
|
hitElement: NonDeleted<ExcalidrawElement> | null;
|
|
68
|
+
/** the pointer went down on the arrow's label, grabbing it for a drag */
|
|
69
|
+
hitBoundText: boolean;
|
|
68
70
|
linearElementEditor: LinearElementEditor | null;
|
|
69
71
|
};
|
|
70
72
|
static arePointsEqual<Point extends LocalPoint | GlobalPoint>(point1: Point | null, point2: Point | null): boolean;
|
|
@@ -76,6 +78,11 @@ export declare class LinearElementEditor {
|
|
|
76
78
|
static getPointAtIndexGlobalCoordinates(element: ExcalidrawLinearElement, indexMaybeFromEnd: number, // -1 for last element
|
|
77
79
|
elementsMap: ElementsMap): GlobalPoint;
|
|
78
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;
|
|
79
86
|
static getPointIndexUnderCursor(element: ExcalidrawLinearElement, elementsMap: ElementsMap, zoom: AppState["zoom"], x: number, y: number): number;
|
|
80
87
|
static createPointAt(element: ExcalidrawLinearElement, elementsMap: ElementsMap, scenePointerX: number, scenePointerY: number, gridSize: NullableGridSize): LocalPoint;
|
|
81
88
|
/**
|
|
@@ -114,10 +121,13 @@ export declare class LinearElementEditor {
|
|
|
114
121
|
* segment.
|
|
115
122
|
*/
|
|
116
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;
|
|
117
126
|
static getBoundTextElementPosition: (element: ExcalidrawLinearElement, boundTextElement: ExcalidrawTextElementWithContainer, elementsMap: ElementsMap) => {
|
|
118
127
|
x: number;
|
|
119
128
|
y: number;
|
|
120
129
|
};
|
|
130
|
+
private static computeBoundTextElementPosition;
|
|
121
131
|
static getMinMaxXYWithBoundText: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, elementBounds: Bounds, boundTextElement: ExcalidrawTextElementWithContainer) => [number, number, number, number, number, number];
|
|
122
132
|
static getElementAbsoluteCoords: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, includeBoundText?: boolean) => [number, number, number, number, number, number];
|
|
123
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>;
|
|
@@ -39,8 +59,24 @@ export declare const newTextElement: (opts: {
|
|
|
39
59
|
containerId?: ExcalidrawTextContainer["id"] | null;
|
|
40
60
|
lineHeight?: ExcalidrawTextElement["lineHeight"];
|
|
41
61
|
autoResize?: ExcalidrawTextElement["autoResize"];
|
|
62
|
+
labelPosition?: ExcalidrawTextElement["labelPosition"];
|
|
63
|
+
baseFontSize?: ExcalidrawTextElement["baseFontSize"];
|
|
42
64
|
} & ElementConstructorOpts) => NonDeleted<ExcalidrawTextElement>;
|
|
43
|
-
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
|
+
} | {
|
|
44
80
|
x: number;
|
|
45
81
|
y: number;
|
|
46
82
|
width: number;
|