@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.
Files changed (119) hide show
  1. package/dist/dev/index.js +5645 -3994
  2. package/dist/dev/index.js.map +4 -4
  3. package/dist/prod/index.js +16 -15
  4. package/dist/types/common/src/colors.d.ts +13 -7
  5. package/dist/types/common/src/constants.d.ts +54 -0
  6. package/dist/types/common/src/keys.d.ts +2 -0
  7. package/dist/types/common/src/random.d.ts +7 -0
  8. package/dist/types/common/src/utils.d.ts +5 -0
  9. package/dist/types/element/src/Scene.d.ts +1 -1
  10. package/dist/types/element/src/binding.d.ts +13 -7
  11. package/dist/types/element/src/collision.d.ts +14 -5
  12. package/dist/types/element/src/comparisons.d.ts +5 -3
  13. package/dist/types/element/src/delta.d.ts +23 -1
  14. package/dist/types/element/src/duplicate.d.ts +60 -0
  15. package/dist/types/element/src/flowchart.d.ts +5 -1
  16. package/dist/types/element/src/frame.d.ts +2 -2
  17. package/dist/types/element/src/index.d.ts +2 -0
  18. package/dist/types/element/src/linearElementEditor.d.ts +10 -0
  19. package/dist/types/element/src/listMarker.d.ts +34 -0
  20. package/dist/types/element/src/mutateElement.d.ts +1 -1
  21. package/dist/types/element/src/newElement.d.ts +39 -3
  22. package/dist/types/element/src/renderElement.d.ts +21 -4
  23. package/dist/types/element/src/shape.d.ts +15 -1
  24. package/dist/types/element/src/sizeHelpers.d.ts +6 -0
  25. package/dist/types/element/src/stickyNote.d.ts +183 -0
  26. package/dist/types/element/src/textElement.d.ts +9 -1
  27. package/dist/types/element/src/transform.d.ts +25 -6
  28. package/dist/types/element/src/typeChecks.d.ts +3 -2
  29. package/dist/types/element/src/types.d.ts +35 -6
  30. package/dist/types/element/src/utils.d.ts +15 -4
  31. package/dist/types/element/src/zindex.d.ts +1 -1
  32. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +60 -3
  33. package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
  34. package/dist/types/excalidraw/actions/actionBoundText.d.ts +40 -2
  35. package/dist/types/excalidraw/actions/actionCanvas.d.ts +140 -7
  36. package/dist/types/excalidraw/actions/actionClipboard.d.ts +40 -2
  37. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +20 -1
  38. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +61 -4
  39. package/dist/types/excalidraw/actions/actionDeselect.d.ts +23 -1
  40. package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -2
  41. package/dist/types/excalidraw/actions/actionElementLink.d.ts +20 -1
  42. package/dist/types/excalidraw/actions/actionElementLock.d.ts +40 -2
  43. package/dist/types/excalidraw/actions/actionExport.d.ts +40 -2
  44. package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
  45. package/dist/types/excalidraw/actions/actionFrame.d.ts +111 -4
  46. package/dist/types/excalidraw/actions/actionGroup.d.ts +40 -2
  47. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +71 -2
  48. package/dist/types/excalidraw/actions/actionLink.d.ts +20 -1
  49. package/dist/types/excalidraw/actions/actionMenu.d.ts +20 -1
  50. package/dist/types/excalidraw/actions/actionProperties.d.ts +50 -8
  51. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +20 -1
  52. package/dist/types/excalidraw/actions/actionStyles.d.ts +21 -2
  53. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +20 -1
  54. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +20 -1
  55. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +20 -1
  56. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +20 -1
  57. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +20 -1
  58. package/dist/types/excalidraw/actions/actionToggleShowHints.d.ts +197 -0
  59. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +20 -1
  60. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +20 -1
  61. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +20 -1
  62. package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
  63. package/dist/types/excalidraw/actions/index.d.ts +1 -0
  64. package/dist/types/excalidraw/actions/types.d.ts +1 -1
  65. package/dist/types/excalidraw/appState.d.ts +23 -1
  66. package/dist/types/excalidraw/components/App.arrowText.d.ts +28 -30
  67. package/dist/types/excalidraw/components/App.bucketFill.d.ts +10 -0
  68. package/dist/types/excalidraw/components/App.clipboard.d.ts +31 -0
  69. package/dist/types/excalidraw/components/App.cursor.d.ts +8 -0
  70. package/dist/types/excalidraw/components/App.d.ts +110 -199
  71. package/dist/types/excalidraw/components/App.duplicate.d.ts +101 -0
  72. package/dist/types/excalidraw/components/App.pan.d.ts +62 -0
  73. package/dist/types/excalidraw/components/App.text.d.ts +146 -0
  74. package/dist/types/excalidraw/components/App.textTool.d.ts +140 -0
  75. package/dist/types/excalidraw/components/App.toolDrag.d.ts +63 -0
  76. package/dist/types/excalidraw/components/App.viewport.d.ts +41 -1
  77. package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
  78. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +6 -2
  79. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
  80. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +4 -1
  81. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +4 -2
  82. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
  83. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
  84. package/dist/types/excalidraw/components/ColorPicker/colorTopPicksDnD.d.ts +11 -0
  85. package/dist/types/excalidraw/components/FileDropOverlay.d.ts +2 -0
  86. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +4 -1
  87. package/dist/types/excalidraw/components/FontPicker/FontPickerList.d.ts +6 -1
  88. package/dist/types/excalidraw/components/FontPicker/fontTopPicksDnD.d.ts +12 -0
  89. package/dist/types/excalidraw/components/IconButton.d.ts +2 -0
  90. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +6 -2
  91. package/dist/types/excalidraw/components/LibraryUnit.d.ts +7 -2
  92. package/dist/types/excalidraw/components/Tools.d.ts +7 -2
  93. package/dist/types/excalidraw/components/Tooltip.d.ts +15 -1
  94. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksContextMenu.d.ts +14 -0
  95. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksTip.d.ts +11 -0
  96. package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +58 -0
  97. package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +2 -0
  98. package/dist/types/excalidraw/components/icons.d.ts +2 -0
  99. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +2 -0
  100. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +2 -2
  101. package/dist/types/excalidraw/data/blob.d.ts +40 -2
  102. package/dist/types/excalidraw/data/json.d.ts +20 -1
  103. package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
  104. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
  105. package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
  106. package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
  107. package/dist/types/excalidraw/renderer/helpers.d.ts +25 -0
  108. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +1 -1
  109. package/dist/types/excalidraw/scene/Renderer.d.ts +64 -2
  110. package/dist/types/excalidraw/scene/index.d.ts +1 -1
  111. package/dist/types/excalidraw/scene/types.d.ts +3 -1
  112. package/dist/types/excalidraw/types.d.ts +140 -18
  113. package/dist/types/excalidraw/viewport.d.ts +33 -1
  114. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +12 -1
  115. package/dist/types/math/src/curve.d.ts +19 -12
  116. package/dist/types/math/src/segment.d.ts +6 -0
  117. package/dist/types/utils/src/export.d.ts +1 -0
  118. package/dist/types/utils/src/shape.d.ts +2 -2
  119. 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">, opts: Pick<ExcalidrawArrowElement, "elbowed">) => number;
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, ExcalidrawArrowElement, ExcalidrawBindableElement, ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement, NonDeletedSceneElementsMap, Ordered } from "./types";
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
- export declare const getAllHoveredElementAtPoint: (point: Readonly<GlobalPoint>, elements: readonly Ordered<NonDeletedExcalidrawElement>[], elementsMap: NonDeletedSceneElementsMap, tolerance?: number) => NonDeleted<ExcalidrawBindableElement>[];
18
- export declare const getHoveredElementForBinding: (point: Readonly<GlobalPoint>, elements: readonly Ordered<NonDeletedExcalidrawElement>[], elementsMap: NonDeletedSceneElementsMap, tolerance?: number) => NonDeleted<ExcalidrawBindableElement> | null;
19
- export declare const getHoveredElementForFocusPoint: (point: GlobalPoint, arrow: ExcalidrawArrowElement, elements: readonly Ordered<NonDeletedExcalidrawElement>[], elementsMap: NonDeletedSceneElementsMap, tolerance?: number) => NonDeleted<ExcalidrawBindableElement> | null;
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 hasStrokeColor: (type: ElementOrToolType) => type is "line" | "arrow" | "text" | "rectangle" | "diamond" | "ellipse" | "embeddable" | "freedraw" | "autoshape";
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
- * Check for visible changes regardless of whether they were removed, added or updated.
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;