@excalidraw/excalidraw 0.18.0-864353b → 0.18.0-8fc71066d

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 (114) hide show
  1. package/dist/dev/{chunk-BBNNHA7I.js → chunk-CP5DND7P.js} +2 -2
  2. package/dist/dev/{chunk-BBNNHA7I.js.map → chunk-CP5DND7P.js.map} +1 -1
  3. package/dist/dev/chunk-CRKRRBMD.js +5677 -0
  4. package/dist/dev/chunk-CRKRRBMD.js.map +7 -0
  5. package/dist/dev/{chunk-7YMZV3TY.js → chunk-QF5FRM6O.js} +2 -2
  6. package/dist/dev/{chunk-7YMZV3TY.js.map → chunk-QF5FRM6O.js.map} +2 -2
  7. package/dist/dev/data/{image-OFYK7EOY.js → image-IWGLHPIX.js} +3 -3
  8. package/dist/dev/index.css +4 -0
  9. package/dist/dev/index.css.map +2 -2
  10. package/dist/dev/index.js +6345 -4110
  11. package/dist/dev/index.js.map +4 -4
  12. package/dist/dev/locales/{en-KIY5SGI3.js → en-SMAPCEOQ.js} +2 -2
  13. package/dist/dev/subset-shared.chunk.js +1 -1
  14. package/dist/dev/subset-worker.chunk.js +1 -1
  15. package/dist/prod/{chunk-UH6Q3EIV.js → chunk-A66AFZZU.js} +1 -1
  16. package/dist/prod/chunk-HHV2PJKY.js +4 -0
  17. package/dist/prod/{chunk-OUULIERA.js → chunk-I4UNSFV6.js} +3 -3
  18. package/dist/prod/data/image-4SM4COIL.js +1 -0
  19. package/dist/prod/index.css +1 -1
  20. package/dist/prod/index.js +25 -18
  21. package/dist/prod/locales/{en-GCLCIHXH.js → en-TYY6KWIJ.js} +1 -1
  22. package/dist/prod/subset-shared.chunk.js +1 -1
  23. package/dist/prod/subset-worker.chunk.js +1 -1
  24. package/dist/types/common/src/constants.d.ts +12 -2
  25. package/dist/types/common/src/utils.d.ts +3 -5
  26. package/dist/types/element/src/Scene.d.ts +7 -3
  27. package/dist/types/element/src/align.d.ts +2 -1
  28. package/dist/types/element/src/binding.d.ts +10 -7
  29. package/dist/types/element/src/bounds.d.ts +11 -3
  30. package/dist/types/element/src/collision.d.ts +18 -12
  31. package/dist/types/element/src/cropElement.d.ts +1 -1
  32. package/dist/types/element/src/delta.d.ts +42 -9
  33. package/dist/types/element/src/distance.d.ts +2 -2
  34. package/dist/types/element/src/distribute.d.ts +2 -1
  35. package/dist/types/element/src/fractionalIndex.d.ts +8 -2
  36. package/dist/types/element/src/frame.d.ts +2 -2
  37. package/dist/types/element/src/groups.d.ts +1 -0
  38. package/dist/types/element/src/index.d.ts +1 -3
  39. package/dist/types/element/src/linearElementEditor.d.ts +5 -7
  40. package/dist/types/element/src/mutateElement.d.ts +1 -1
  41. package/dist/types/element/src/resizeElements.d.ts +1 -0
  42. package/dist/types/element/src/selection.d.ts +1 -1
  43. package/dist/types/element/src/shape.d.ts +42 -0
  44. package/dist/types/element/src/store.d.ts +14 -9
  45. package/dist/types/element/src/transformHandles.d.ts +4 -4
  46. package/dist/types/element/src/typeChecks.d.ts +4 -0
  47. package/dist/types/element/src/types.d.ts +1 -1
  48. package/dist/types/element/src/utils.d.ts +16 -6
  49. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +9 -15
  50. package/dist/types/excalidraw/actions/actionAlign.d.ts +8 -8
  51. package/dist/types/excalidraw/actions/actionBoundText.d.ts +6 -10
  52. package/dist/types/excalidraw/actions/actionCanvas.d.ts +129 -155
  53. package/dist/types/excalidraw/actions/actionClipboard.d.ts +25 -36
  54. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +3 -5
  55. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +14 -20
  56. package/dist/types/excalidraw/actions/actionDistribute.d.ts +4 -4
  57. package/dist/types/excalidraw/actions/actionDuplicateSelection.d.ts +2 -2
  58. package/dist/types/excalidraw/actions/actionElementLink.d.ts +2 -4
  59. package/dist/types/excalidraw/actions/actionElementLock.d.ts +8 -12
  60. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +3 -5
  61. package/dist/types/excalidraw/actions/actionExport.d.ts +112 -130
  62. package/dist/types/excalidraw/actions/actionFinalize.d.ts +9 -12
  63. package/dist/types/excalidraw/actions/actionFlip.d.ts +4 -4
  64. package/dist/types/excalidraw/actions/actionFrame.d.ts +62 -70
  65. package/dist/types/excalidraw/actions/actionGroup.d.ts +12 -16
  66. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +84 -55
  67. package/dist/types/excalidraw/actions/actionLink.d.ts +4 -6
  68. package/dist/types/excalidraw/actions/actionMenu.d.ts +10 -16
  69. package/dist/types/excalidraw/actions/actionNavigate.d.ts +6 -10
  70. package/dist/types/excalidraw/actions/actionProperties.d.ts +49 -79
  71. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +6 -8
  72. package/dist/types/excalidraw/actions/actionStyles.d.ts +7 -9
  73. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +5 -7
  74. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +5 -7
  75. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +4 -6
  76. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +5 -7
  77. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +5 -7
  78. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +5 -7
  79. package/dist/types/excalidraw/actions/actionZindex.d.ts +8 -8
  80. package/dist/types/excalidraw/appState.d.ts +20 -20
  81. package/dist/types/excalidraw/components/Actions.d.ts +0 -4
  82. package/dist/types/excalidraw/components/App.d.ts +17 -18
  83. package/dist/types/excalidraw/components/Ellipsify.d.ts +4 -0
  84. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +11 -1
  85. package/dist/types/excalidraw/components/shapes.d.ts +1 -1
  86. package/dist/types/excalidraw/data/blob.d.ts +1 -1
  87. package/dist/types/excalidraw/data/reconcile.d.ts +1 -0
  88. package/dist/types/excalidraw/data/restore.d.ts +6 -1
  89. package/dist/types/excalidraw/eraser/index.d.ts +0 -2
  90. package/dist/types/excalidraw/history.d.ts +21 -5
  91. package/dist/types/excalidraw/index.d.ts +2 -1
  92. package/dist/types/excalidraw/lasso/utils.d.ts +2 -1
  93. package/dist/types/excalidraw/renderer/helpers.d.ts +3 -3
  94. package/dist/types/excalidraw/renderer/staticScene.d.ts +4 -1
  95. package/dist/types/excalidraw/scene/Renderer.d.ts +0 -1
  96. package/dist/types/excalidraw/types.d.ts +9 -9
  97. package/dist/types/math/src/constants.d.ts +3 -0
  98. package/dist/types/math/src/curve.d.ts +32 -0
  99. package/dist/types/math/src/index.d.ts +1 -0
  100. package/dist/types/math/src/rectangle.d.ts +2 -0
  101. package/dist/types/math/src/vector.d.ts +4 -2
  102. package/history.ts +107 -44
  103. package/package.json +12 -9
  104. package/dist/dev/chunk-LL55DS44.js +0 -23677
  105. package/dist/dev/chunk-LL55DS44.js.map +0 -7
  106. package/dist/prod/chunk-F44EGBV2.js +0 -33
  107. package/dist/prod/data/image-CUOH64HE.js +0 -1
  108. package/dist/types/element/src/Shape.d.ts +0 -17
  109. package/dist/types/element/src/ShapeCache.d.ts +0 -25
  110. package/dist/types/element/src/shapes.d.ts +0 -27
  111. package/dist/types/excalidraw/visualdebug.d.ts +0 -41
  112. package/dist/types/utils/src/collision.d.ts +0 -8
  113. /package/dist/dev/data/{image-OFYK7EOY.js.map → image-IWGLHPIX.js.map} +0 -0
  114. /package/dist/dev/locales/{en-KIY5SGI3.js.map → en-SMAPCEOQ.js.map} +0 -0
@@ -1 +1 @@
1
- import{A,B,C,D,E,F,G,H,I,J,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}from"../chunk-OUULIERA.js";import"../chunk-SRAX5OIU.js";export{f as alerts,e as buttons,l as canvasError,s as clearCanvasDialog,C as colorPicker,A as colors,I as commandPalette,v as confirmDialog,J as default,i as element,b as elementLink,x as encrypted,p as errorDialog,m as errorSplash,g as errors,q as exportDialog,G as fontList,j as headings,r as helpDialog,k as hints,w as imageExportDialog,a as labels,c as library,E as mermaid,D as overwriteConfirm,t as publishDialog,u as publishSuccessDialog,F as quickSearch,o as roomDialog,d as search,n as shareDialog,y as stats,z as toast,h as toolBar,H as userList,B as welcomeScreen};
1
+ import{A,B,C,D,E,F,G,H,I,J,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}from"../chunk-I4UNSFV6.js";import"../chunk-SRAX5OIU.js";export{f as alerts,e as buttons,l as canvasError,s as clearCanvasDialog,C as colorPicker,A as colors,I as commandPalette,v as confirmDialog,J as default,i as element,b as elementLink,x as encrypted,p as errorDialog,m as errorSplash,g as errors,q as exportDialog,G as fontList,j as headings,r as helpDialog,k as hints,w as imageExportDialog,a as labels,c as library,E as mermaid,D as overwriteConfirm,t as publishDialog,u as publishSuccessDialog,F as quickSearch,o as roomDialog,d as search,n as shareDialog,y as stats,z as toast,h as toolBar,H as userList,B as welcomeScreen};
@@ -1 +1 @@
1
- import{a,b,c,d}from"./chunk-LS7FJGPW.js";import"./chunk-UH6Q3EIV.js";import"./chunk-SRAX5OIU.js";export{a as Commands,b as subsetToBase64,c as subsetToBinary,d as toBase64};
1
+ import{a,b,c,d}from"./chunk-LS7FJGPW.js";import"./chunk-A66AFZZU.js";import"./chunk-SRAX5OIU.js";export{a as Commands,b as subsetToBase64,c as subsetToBinary,d as toBase64};
@@ -1 +1 @@
1
- import{a as r,c as t}from"./chunk-LS7FJGPW.js";import"./chunk-UH6Q3EIV.js";import"./chunk-SRAX5OIU.js";var s=import.meta.url?new URL(import.meta.url):void 0;typeof window>"u"&&typeof self<"u"&&(self.onmessage=async e=>{switch(e.data.command){case r.Subset:let a=await t(e.data.arrayBuffer,e.data.codePoints);self.postMessage(a,{transfer:[a]});break}});export{s as WorkerUrl};
1
+ import{a as r,c as t}from"./chunk-LS7FJGPW.js";import"./chunk-A66AFZZU.js";import"./chunk-SRAX5OIU.js";var s=import.meta.url?new URL(import.meta.url):void 0;typeof window>"u"&&typeof self<"u"&&(self.onmessage=async e=>{switch(e.data.command){case r.Subset:let a=await t(e.data.arrayBuffer,e.data.codePoints);self.postMessage(a,{transfer:[a]});break}});export{s as WorkerUrl};
@@ -12,6 +12,7 @@ export declare const supportsResizeObserver: boolean;
12
12
  export declare const APP_NAME = "Excalidraw";
13
13
  export declare const TEXT_AUTOWRAP_THRESHOLD = 36;
14
14
  export declare const DRAGGING_THRESHOLD = 10;
15
+ export declare const MINIMUM_ARROW_SIZE = 20;
15
16
  export declare const LINE_CONFIRM_THRESHOLD = 8;
16
17
  export declare const ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;
17
18
  export declare const ELEMENT_TRANSLATE_AMOUNT = 1;
@@ -111,10 +112,19 @@ export declare const FONT_FAMILY: {
111
112
  "Liberation Sans": number;
112
113
  Assistant: number;
113
114
  };
115
+ export declare const SANS_SERIF_GENERIC_FONT = "sans-serif";
116
+ export declare const MONOSPACE_GENERIC_FONT = "monospace";
117
+ export declare const FONT_FAMILY_GENERIC_FALLBACKS: {
118
+ "sans-serif": number;
119
+ monospace: number;
120
+ };
114
121
  export declare const FONT_FAMILY_FALLBACKS: {
115
- Xiaolai: number;
116
122
  "Segoe UI Emoji": number;
123
+ "sans-serif": number;
124
+ monospace: number;
125
+ Xiaolai: number;
117
126
  };
127
+ export declare function getGenericFontFamilyFallback(fontFamily: number): keyof typeof FONT_FAMILY_GENERIC_FALLBACKS;
118
128
  export declare const getFontFamilyFallbacks: (fontFamily: number) => Array<keyof typeof FONT_FAMILY_FALLBACKS>;
119
129
  export declare const THEME: {
120
130
  readonly LIGHT: "light";
@@ -280,7 +290,7 @@ export declare const DEFAULT_SIDEBAR: {
280
290
  readonly name: "default";
281
291
  readonly defaultTab: "library";
282
292
  };
283
- export declare const LIBRARY_DISABLED_TYPES: Set<"embeddable" | "image" | "iframe">;
293
+ export declare const LIBRARY_DISABLED_TYPES: Set<"embeddable" | "iframe" | "image">;
284
294
  export declare const TOOL_TYPE: {
285
295
  readonly selection: "selection";
286
296
  readonly lasso: "lasso";
@@ -1,5 +1,4 @@
1
- import { type GlobalPoint } from "@excalidraw/math";
2
- import type { ExcalidrawBindableElement, FontFamilyValues, FontString, ExcalidrawElement } from "@excalidraw/element/types";
1
+ import type { ExcalidrawBindableElement, FontFamilyValues, FontString } from "@excalidraw/element/types";
3
2
  import type { ActiveTool, AppState, ToolType, UnsubscribeCallback, Zoom } from "@excalidraw/excalidraw/types";
4
3
  import type { MaybePromise } from "./utility-types";
5
4
  import type { EVENT } from "./constants";
@@ -7,9 +6,9 @@ export declare const setDateTimeForTests: (dateTime: string) => void;
7
6
  export declare const getDateTime: () => string;
8
7
  export declare const capitalizeString: (str: string) => string;
9
8
  export declare const isToolIcon: (target: Element | EventTarget | null) => target is HTMLElement;
10
- export declare const isInputLike: (target: Element | EventTarget | null) => target is HTMLInputElement | HTMLSelectElement | HTMLBRElement | HTMLDivElement | HTMLTextAreaElement;
9
+ export declare const isInputLike: (target: Element | EventTarget | null) => target is HTMLBRElement | HTMLDivElement | HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
11
10
  export declare const isInteractive: (target: Element | EventTarget | null) => boolean;
12
- export declare const isWritableElement: (target: Element | EventTarget | null) => target is HTMLInputElement | HTMLBRElement | HTMLDivElement | HTMLTextAreaElement;
11
+ export declare const isWritableElement: (target: Element | EventTarget | null) => target is HTMLBRElement | HTMLDivElement | HTMLInputElement | HTMLTextAreaElement;
13
12
  export declare const getFontFamilyString: ({ fontFamily, }: {
14
13
  fontFamily: FontFamilyValues;
15
14
  }) => string;
@@ -261,7 +260,6 @@ export declare const safelyParseJSON: (json: string) => Record<string, any> | nu
261
260
  */
262
261
  export declare const escapeDoubleQuotes: (str: string) => string;
263
262
  export declare const castArray: <T>(value: T | T[]) => T[];
264
- export declare const elementCenterPoint: (element: ExcalidrawElement, xOffset?: number, yOffset?: number) => GlobalPoint;
265
263
  /** hack for Array.isArray type guard not working with readonly value[] */
266
264
  export declare const isReadonlyArray: (value?: any) => value is readonly any[];
267
265
  export declare const sizeOf: (value: readonly unknown[] | Readonly<Map<string, unknown>> | Readonly<Record<string, unknown>> | ReadonlySet<unknown>) => number;
@@ -27,7 +27,9 @@ export declare class Scene {
27
27
  getElementsMapIncludingDeleted(): Map<string, Ordered<ExcalidrawElement>> & import("@excalidraw/common/utility-types").MakeBrand<"SceneElementsMap">;
28
28
  getNonDeletedElements(): readonly Ordered<NonDeletedExcalidrawElement>[];
29
29
  getFramesIncludingDeleted(): readonly ExcalidrawFrameLikeElement[];
30
- constructor(elements?: ElementsMapOrArray | null);
30
+ constructor(elements?: ElementsMapOrArray | null, options?: {
31
+ skipValidation?: true;
32
+ });
31
33
  getSelectedElements(opts: {
32
34
  selectedElementIds: AppState["selectedElementIds"];
33
35
  /**
@@ -55,7 +57,9 @@ export declare class Scene {
55
57
  * @returns whether a change was made
56
58
  */
57
59
  mapElements(iteratee: (element: ExcalidrawElement) => ExcalidrawElement): boolean;
58
- replaceAllElements(nextElements: ElementsMapOrArray): void;
60
+ replaceAllElements(nextElements: ElementsMapOrArray, options?: {
61
+ skipValidation?: true;
62
+ }): void;
59
63
  triggerUpdate(): void;
60
64
  onUpdate(cb: SceneStateCallback): SceneStateCallbackRemover;
61
65
  destroy(): void;
@@ -66,7 +70,7 @@ export declare class Scene {
66
70
  getElementIndex(elementId: string): number;
67
71
  getContainerElement: (element: (ExcalidrawElement & {
68
72
  containerId: ExcalidrawElement["id"] | null;
69
- }) | null) => import("@excalidraw/element/types").ExcalidrawSelectionElement | import("@excalidraw/element/types").ExcalidrawRectangleElement | import("@excalidraw/element/types").ExcalidrawDiamondElement | import("@excalidraw/element/types").ExcalidrawEllipseElement | import("@excalidraw/element/types").ExcalidrawTextElement | import("@excalidraw/element/types").ExcalidrawLinearElement | import("@excalidraw/element/types").ExcalidrawFreeDrawElement | import("@excalidraw/element/types").ExcalidrawImageElement | import("@excalidraw/element/types").ExcalidrawFrameElement | import("@excalidraw/element/types").ExcalidrawMagicFrameElement | import("@excalidraw/element/types").ExcalidrawIframeElement | import("@excalidraw/element/types").ExcalidrawEmbeddableElement | null;
73
+ }) | 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;
70
74
  getElementsFromId: (id: string) => ExcalidrawElement[];
71
75
  mutateElement<TElement extends Mutable<ExcalidrawElement>>(element: TElement, updates: ElementUpdate<TElement>, options?: {
72
76
  informMutation: boolean;
@@ -1,7 +1,8 @@
1
+ import type { AppState } from "@excalidraw/excalidraw/types";
1
2
  import type { Scene } from "./Scene";
2
3
  import type { ExcalidrawElement } from "./types";
3
4
  export interface Alignment {
4
5
  position: "start" | "center" | "end";
5
6
  axis: "x" | "y";
6
7
  }
7
- export declare const alignElements: (selectedElements: ExcalidrawElement[], alignment: Alignment, scene: Scene) => ExcalidrawElement[];
8
+ export declare const alignElements: (selectedElements: ExcalidrawElement[], alignment: Alignment, scene: Scene, appState: Readonly<AppState>) => ExcalidrawElement[];
@@ -16,10 +16,13 @@ export declare const shouldEnableBindingForPointerEvent: (event: React.PointerEv
16
16
  export declare const isBindingEnabled: (appState: AppState) => boolean;
17
17
  export declare const FIXED_BINDING_DISTANCE = 5;
18
18
  export declare const BINDING_HIGHLIGHT_THICKNESS = 10;
19
- export declare const BINDING_HIGHLIGHT_OFFSET = 4;
20
19
  export declare const bindOrUnbindLinearElement: (linearElement: NonDeleted<ExcalidrawLinearElement>, startBindingElement: ExcalidrawBindableElement | null | "keep", endBindingElement: ExcalidrawBindableElement | null | "keep", scene: Scene) => void;
21
20
  export declare const bindOrUnbindLinearElements: (selectedElements: NonDeleted<ExcalidrawLinearElement>[], isBindingEnabled: boolean, draggingPoints: readonly number[] | null, scene: Scene, zoom?: AppState["zoom"]) => void;
22
21
  export declare const getSuggestedBindingsForArrows: (selectedElements: NonDeleted<ExcalidrawElement>[], elementsMap: NonDeletedSceneElementsMap, zoom: AppState["zoom"]) => SuggestedBinding[];
22
+ export declare const maybeSuggestBindingsForLinearElementAtCoords: (linearElement: NonDeleted<ExcalidrawLinearElement>, pointerCoords: {
23
+ x: number;
24
+ y: number;
25
+ }[], scene: Scene, zoom: AppState["zoom"], oppositeBindingBoundElement?: ExcalidrawBindableElement | null) => ExcalidrawBindableElement[];
23
26
  export declare const maybeBindLinearElement: (linearElement: NonDeleted<ExcalidrawLinearElement>, appState: AppState, pointerCoords: {
24
27
  x: number;
25
28
  y: number;
@@ -46,11 +49,11 @@ export declare const updateBindings: (latestElement: ExcalidrawElement, scene: S
46
49
  };
47
50
  zoom?: AppState["zoom"];
48
51
  }) => void;
49
- export declare const getHeadingForElbowArrowSnap: (p: Readonly<GlobalPoint>, otherPoint: Readonly<GlobalPoint>, bindableElement: ExcalidrawBindableElement | undefined | null, aabb: Bounds | undefined | null, origPoint: GlobalPoint, zoom?: AppState["zoom"]) => Heading;
50
- export declare const bindPointToSnapToElementOutline: (arrow: ExcalidrawElbowArrowElement, bindableElement: ExcalidrawBindableElement, startOrEnd: "start" | "end") => GlobalPoint;
51
- export declare const avoidRectangularCorner: (element: ExcalidrawBindableElement, p: GlobalPoint) => GlobalPoint;
52
- export declare const snapToMid: (element: ExcalidrawBindableElement, p: GlobalPoint, tolerance?: number) => GlobalPoint;
53
- export declare const calculateFixedPointForElbowArrowBinding: (linearElement: NonDeleted<ExcalidrawElbowArrowElement>, hoveredElement: ExcalidrawBindableElement, startOrEnd: "start" | "end") => {
52
+ 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;
53
+ export declare const bindPointToSnapToElementOutline: (arrow: ExcalidrawElbowArrowElement, bindableElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap) => GlobalPoint;
54
+ export declare const avoidRectangularCorner: (element: ExcalidrawBindableElement, elementsMap: ElementsMap, p: GlobalPoint) => GlobalPoint;
55
+ export declare const snapToMid: (element: ExcalidrawBindableElement, elementsMap: ElementsMap, p: GlobalPoint, tolerance?: number) => GlobalPoint;
56
+ export declare const calculateFixedPointForElbowArrowBinding: (linearElement: NonDeleted<ExcalidrawElbowArrowElement>, hoveredElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap) => {
54
57
  fixedPoint: FixedPoint;
55
58
  };
56
59
  export declare const fixDuplicatedBindingsAfterDuplication: (duplicatedElements: ExcalidrawElement[], origIdToDuplicateId: Map<ExcalidrawElement["id"], ExcalidrawElement["id"]>, duplicateElementsMap: NonDeletedSceneElementsMap) => void;
@@ -101,7 +104,7 @@ export declare class BindableElement {
101
104
  */
102
105
  static rebindAffected: (elements: ElementsMap, bindableElement: ExcalidrawElement | undefined, updateElementWith: (affected: ExcalidrawElement, updates: ElementUpdate<ExcalidrawElement>) => void) => void;
103
106
  }
104
- export declare const getGlobalFixedPointForBindableElement: (fixedPointRatio: [number, number], element: ExcalidrawBindableElement) => GlobalPoint;
107
+ export declare const getGlobalFixedPointForBindableElement: (fixedPointRatio: [number, number], element: ExcalidrawBindableElement, elementsMap: ElementsMap) => GlobalPoint;
105
108
  export declare const getGlobalFixedPoints: (arrow: ExcalidrawElbowArrowElement, elementsMap: ElementsMap) => [GlobalPoint, GlobalPoint];
106
109
  export declare const getArrowLocalFixedPoints: (arrow: ExcalidrawElbowArrowElement, elementsMap: ElementsMap) => LocalPoint[];
107
110
  export declare const normalizeFixedPoint: <T extends FixedPoint | null>(fixedPoint: T) => T extends null ? null : FixedPoint;
@@ -1,4 +1,4 @@
1
- import type { Degrees, GlobalPoint, LineSegment } from "@excalidraw/math";
1
+ import type { Degrees, GlobalPoint, LineSegment, LocalPoint } from "@excalidraw/math";
2
2
  import type { AppState } from "@excalidraw/excalidraw/types";
3
3
  import type { Drawable, Op } from "roughjs/bin/core";
4
4
  import type { Arrowhead, ElementsMap, ElementsMapOrArray, ExcalidrawElement, ExcalidrawFreeDrawElement, ExcalidrawLinearElement, NonDeleted } from "./types";
@@ -26,7 +26,8 @@ export type SceneBounds = readonly [
26
26
  ];
27
27
  export declare class ElementBounds {
28
28
  private static boundsCache;
29
- static getBounds(element: ExcalidrawElement, elementsMap: ElementsMap): Bounds;
29
+ private static nonRotatedBoundsCache;
30
+ static getBounds(element: ExcalidrawElement, elementsMap: ElementsMap, nonRotated?: boolean): Bounds;
30
31
  private static calculateBounds;
31
32
  }
32
33
  export declare const getElementAbsoluteCoords: (element: ExcalidrawElement, elementsMap: ElementsMap, includeBoundText?: boolean) => [number, number, number, number, number, number];
@@ -43,6 +44,7 @@ export declare const getElementLineSegments: (element: ExcalidrawElement, elemen
43
44
  */
44
45
  export declare const getRectangleBoxAbsoluteCoords: (boxSceneCoords: RectangleBox) => number[];
45
46
  export declare const getDiamondPoints: (element: ExcalidrawElement) => number[];
47
+ export declare const getCubicBezierCurveBound: (p0: GlobalPoint, p1: GlobalPoint, p2: GlobalPoint, p3: GlobalPoint) => Bounds;
46
48
  export declare const getMinMaxXYFromCurvePathOps: (ops: Op[], transformXY?: ((p: GlobalPoint) => GlobalPoint) | undefined) => Bounds;
47
49
  export declare const getBoundsFromPoints: (points: ExcalidrawFreeDrawElement["points"]) => Bounds;
48
50
  /** @returns number in pixels */
@@ -50,7 +52,7 @@ export declare const getArrowheadSize: (arrowhead: Arrowhead) => number;
50
52
  /** @returns number in degrees */
51
53
  export declare const getArrowheadAngle: (arrowhead: Arrowhead) => Degrees;
52
54
  export declare const getArrowheadPoints: (element: ExcalidrawLinearElement, shape: Drawable[], position: "start" | "end", arrowhead: Arrowhead) => number[] | null;
53
- export declare const getElementBounds: (element: ExcalidrawElement, elementsMap: ElementsMap) => Bounds;
55
+ export declare const getElementBounds: (element: ExcalidrawElement, elementsMap: ElementsMap, nonRotated?: boolean) => Bounds;
54
56
  export declare const getCommonBounds: (elements: ElementsMapOrArray, elementsMap?: ElementsMap) => Bounds;
55
57
  export declare const getDraggedElementsBounds: (elements: ExcalidrawElement[], dragOffset: {
56
58
  x: number;
@@ -78,4 +80,10 @@ export declare const getCommonBoundingBox: (elements: ExcalidrawElement[] | read
78
80
  */
79
81
  export declare const getVisibleSceneBounds: ({ scrollX, scrollY, width, height, zoom, }: AppState) => SceneBounds;
80
82
  export declare const getCenterForBounds: (bounds: Bounds) => GlobalPoint;
83
+ /**
84
+ * Get the axis-aligned bounding box for a given element
85
+ */
86
+ export declare const aabbForElement: (element: Readonly<ExcalidrawElement>, elementsMap: ElementsMap, offset?: [number, number, number, number]) => Bounds;
87
+ export declare const pointInsideBounds: <P extends GlobalPoint | LocalPoint>(p: P, bounds: Bounds) => boolean;
81
88
  export declare const doBoundsIntersect: (bounds1: Bounds | null, bounds2: Bounds | null) => boolean;
89
+ export declare const elementCenterPoint: (element: ExcalidrawElement, elementsMap: ElementsMap, xOffset?: number, yOffset?: number) => GlobalPoint;
@@ -1,20 +1,18 @@
1
- import { type GeometricShape } from "@excalidraw/utils/shape";
2
- import type { GlobalPoint, LineSegment, LocalPoint } from "@excalidraw/math";
1
+ import type { GlobalPoint, LineSegment } from "@excalidraw/math";
3
2
  import type { FrameNameBounds } from "@excalidraw/excalidraw/types";
4
3
  import type { ElementsMap, ExcalidrawElement } from "./types";
5
4
  export declare const shouldTestInside: (element: ExcalidrawElement) => boolean;
6
- export type HitTestArgs<Point extends GlobalPoint | LocalPoint> = {
7
- x: number;
8
- y: number;
5
+ export type HitTestArgs = {
6
+ point: GlobalPoint;
9
7
  element: ExcalidrawElement;
10
- shape: GeometricShape<Point>;
11
- threshold?: number;
8
+ threshold: number;
9
+ elementsMap: ElementsMap;
12
10
  frameNameBound?: FrameNameBounds | null;
13
11
  };
14
- export declare const hitElementItself: <Point extends GlobalPoint | LocalPoint>({ x, y, element, shape, threshold, frameNameBound, }: HitTestArgs<Point>) => boolean;
15
- export declare const hitElementBoundingBox: (x: number, y: number, element: ExcalidrawElement, elementsMap: ElementsMap, tolerance?: number) => boolean;
16
- export declare const hitElementBoundingBoxOnly: <Point extends GlobalPoint | LocalPoint>(hitArgs: HitTestArgs<Point>, elementsMap: ElementsMap) => boolean;
17
- export declare const hitElementBoundText: <Point extends GlobalPoint | LocalPoint>(x: number, y: number, textShape: GeometricShape<Point> | null) => boolean;
12
+ export declare const hitElementItself: ({ point, element, threshold, elementsMap, frameNameBound, }: HitTestArgs) => boolean;
13
+ export declare const hitElementBoundingBox: (point: GlobalPoint, element: ExcalidrawElement, elementsMap: ElementsMap, tolerance?: number) => boolean;
14
+ export declare const hitElementBoundingBoxOnly: (hitArgs: HitTestArgs, elementsMap: ElementsMap) => boolean;
15
+ export declare const hitElementBoundText: (point: GlobalPoint, element: ExcalidrawElement, elementsMap: ElementsMap) => boolean;
18
16
  /**
19
17
  * Intersect a line with an element for binding test
20
18
  *
@@ -23,4 +21,12 @@ export declare const hitElementBoundText: <Point extends GlobalPoint | LocalPoin
23
21
  * @param offset
24
22
  * @returns
25
23
  */
26
- export declare const intersectElementWithLineSegment: (element: ExcalidrawElement, line: LineSegment<GlobalPoint>, offset?: number) => GlobalPoint[];
24
+ export declare const intersectElementWithLineSegment: (element: ExcalidrawElement, elementsMap: ElementsMap, line: LineSegment<GlobalPoint>, offset?: number, onlyFirst?: boolean) => GlobalPoint[];
25
+ /**
26
+ * Check if the given point is considered inside the element's border
27
+ *
28
+ * @param point
29
+ * @param element
30
+ * @returns
31
+ */
32
+ export declare const isPointInElement: (point: GlobalPoint, element: ExcalidrawElement, elementsMap: ElementsMap) => boolean;
@@ -1,7 +1,7 @@
1
1
  import type { TransformHandleType } from "./transformHandles";
2
2
  import type { ElementsMap, ExcalidrawImageElement, ImageCrop } from "./types";
3
3
  export declare const MINIMAL_CROP_SIZE = 10;
4
- export declare const cropElement: (element: ExcalidrawImageElement, transformHandle: TransformHandleType, naturalWidth: number, naturalHeight: number, pointerX: number, pointerY: number, widthAspectRatio?: number) => {
4
+ export declare const cropElement: (element: ExcalidrawImageElement, elementsMap: ElementsMap, transformHandle: TransformHandleType, naturalWidth: number, naturalHeight: number, pointerX: number, pointerY: number, widthAspectRatio?: number) => {
5
5
  x: number;
6
6
  y: number;
7
7
  width: number;
@@ -1,7 +1,7 @@
1
1
  import type { ExcalidrawElement, Ordered, OrderedExcalidrawElement, SceneElementsMap } from "@excalidraw/element/types";
2
2
  import type { DTO, ValueOf } from "@excalidraw/common/utility-types";
3
3
  import type { AppState, ObservedAppState } from "@excalidraw/excalidraw/types";
4
- import type { ElementUpdate } from "./mutateElement";
4
+ import { StoreSnapshot } from "./store";
5
5
  /**
6
6
  * Represents the difference between two objects of the same type.
7
7
  *
@@ -15,7 +15,7 @@ export declare class Delta<T> {
15
15
  readonly deleted: Partial<T>;
16
16
  readonly inserted: Partial<T>;
17
17
  private constructor();
18
- static create<T>(deleted: Partial<T>, inserted: Partial<T>, modifier?: (delta: Partial<T>) => Partial<T>, modifierOptions?: "deleted" | "inserted"): Delta<T>;
18
+ static create<T>(deleted: Partial<T>, inserted: Partial<T>, modifier?: (delta: Partial<T>, partialType: "deleted" | "inserted") => Partial<T>, modifierOptions?: "deleted" | "inserted" | "both"): Delta<T>;
19
19
  /**
20
20
  * Calculates the delta between two objects.
21
21
  *
@@ -29,6 +29,10 @@ export declare class Delta<T> {
29
29
  }>(prevObject: T, nextObject: T, modifier?: (partial: Partial<T>) => Partial<T>, postProcess?: (deleted: Partial<T>, inserted: Partial<T>) => [Partial<T>, Partial<T>]): Delta<T>;
30
30
  static empty(): Delta<unknown>;
31
31
  static isEmpty<T>(delta: Delta<T>): boolean;
32
+ /**
33
+ * Merges two deltas into a new one.
34
+ */
35
+ static merge<T>(delta1: Delta<T>, delta2: Delta<T>): Delta<T>;
32
36
  /**
33
37
  * Merges deleted and inserted object partials.
34
38
  */
@@ -55,6 +59,14 @@ export declare class Delta<T> {
55
59
  * Compares if object2 contains any different value compared to the object1.
56
60
  */
57
61
  static isRightDifferent<T extends {}>(object1: T, object2: T, skipShallowCompare?: boolean): boolean;
62
+ /**
63
+ * Compares if shared properties of object1 and object2 contain any different value (aka inner join).
64
+ */
65
+ static isInnerDifferent<T extends {}>(object1: T, object2: T, skipShallowCompare?: boolean): boolean;
66
+ /**
67
+ * Compares if any properties of object1 and object2 contain any different value (aka full join).
68
+ */
69
+ static isDifferent<T extends {}>(object1: T, object2: T, skipShallowCompare?: boolean): boolean;
58
70
  /**
59
71
  * Returns sorted object1 keys that have distinct values.
60
72
  */
@@ -63,6 +75,14 @@ export declare class Delta<T> {
63
75
  * Returns sorted object2 keys that have distinct values.
64
76
  */
65
77
  static getRightDifferences<T extends {}>(object1: T, object2: T, skipShallowCompare?: boolean): string[];
78
+ /**
79
+ * Returns sorted keys of shared object1 and object2 properties that have distinct values (aka inner join).
80
+ */
81
+ static getInnerDifferences<T extends {}>(object1: T, object2: T, skipShallowCompare?: boolean): string[];
82
+ /**
83
+ * Returns sorted keys that have distinct values between object1 and object2 (aka full join).
84
+ */
85
+ static getDifferences<T extends {}>(object1: T, object2: T, skipShallowCompare?: boolean): string[];
66
86
  /**
67
87
  * Iterator comparing values of object properties based on the passed joining strategy.
68
88
  *
@@ -85,19 +105,25 @@ export interface DeltaContainer<T> {
85
105
  *
86
106
  * @returns a tuple of the next object `T` with applied `Delta`s, and `boolean`, indicating whether the applied deltas resulted in a visible change.
87
107
  */
88
- applyTo(previous: T, ...options: unknown[]): [T, boolean];
108
+ applyTo(previous: T, ...options: unknown[]): [T, boolean, ...unknown[]];
109
+ /**
110
+ * Squashes the current delta with the given one.
111
+ */
112
+ squash(delta: DeltaContainer<T>): this;
89
113
  /**
90
114
  * Checks whether all `Delta`s are empty.
91
115
  */
92
116
  isEmpty(): boolean;
93
117
  }
94
118
  export declare class AppStateDelta implements DeltaContainer<AppState> {
95
- readonly delta: Delta<ObservedAppState>;
119
+ delta: Delta<ObservedAppState>;
96
120
  private constructor();
121
+ static create(delta: Delta<ObservedAppState>): AppStateDelta;
97
122
  static calculate<T extends ObservedAppState>(prevAppState: T, nextAppState: T): AppStateDelta;
98
123
  static restore(appStateDeltaDTO: DTO<AppStateDelta>): AppStateDelta;
99
124
  static empty(): AppStateDelta;
100
125
  inverse(): AppStateDelta;
126
+ squash(delta: AppStateDelta): this;
101
127
  applyTo(appState: AppState, nextElements: SceneElementsMap): [AppState, boolean];
102
128
  isEmpty(): boolean;
103
129
  /**
@@ -106,7 +132,6 @@ export declare class AppStateDelta implements DeltaContainer<AppState> {
106
132
  * @returns `true` if a visible change is found, `false` otherwise.
107
133
  */
108
134
  private filterInvisibleChanges;
109
- private static convertToAppStateKey;
110
135
  private static filterSelectedElements;
111
136
  private static filterSelectedGroups;
112
137
  private static stripElementsProps;
@@ -118,7 +143,11 @@ export declare class AppStateDelta implements DeltaContainer<AppState> {
118
143
  private static postProcess;
119
144
  private static orderAppStateKeys;
120
145
  }
121
- type ElementPartial<T extends ExcalidrawElement = ExcalidrawElement> = Omit<ElementUpdate<Ordered<T>>, "seed">;
146
+ type ElementPartial<TElement extends ExcalidrawElement = ExcalidrawElement> = Omit<Partial<Ordered<TElement>>, "id" | "updated" | "seed">;
147
+ export type ApplyToOptions = {
148
+ excludedProperties?: Set<keyof ElementPartial>;
149
+ skipRedraw?: true;
150
+ };
122
151
  /**
123
152
  * Elements change is a low level primitive to capture a change between two sets of elements.
124
153
  * It does so by encapsulating forward and backward `Delta`s, allowing to time-travel in both directions.
@@ -135,6 +164,7 @@ export declare class ElementsDelta implements DeltaContainer<SceneElementsMap> {
135
164
  private static satisfiesAddition;
136
165
  private static satisfiesRemoval;
137
166
  private static satisfiesUpdate;
167
+ private static satisfiesCommmonInvariants;
138
168
  private static validate;
139
169
  /**
140
170
  * Calculates the `Delta`s between the previous and next set of elements.
@@ -151,12 +181,13 @@ export declare class ElementsDelta implements DeltaContainer<SceneElementsMap> {
151
181
  /**
152
182
  * Update delta/s based on the existing elements.
153
183
  *
154
- * @param elements current elements
184
+ * @param nextElements current elements
155
185
  * @param modifierOptions defines which of the delta (`deleted` or `inserted`) will be updated
156
186
  * @returns new instance with modified delta/s
157
187
  */
158
- applyLatestChanges(elements: SceneElementsMap, modifierOptions: "deleted" | "inserted"): ElementsDelta;
159
- applyTo(elements: SceneElementsMap, elementsSnapshot: Map<string, OrderedExcalidrawElement>): [SceneElementsMap, boolean];
188
+ applyLatestChanges(prevElements: SceneElementsMap, nextElements: SceneElementsMap, modifierOptions?: "deleted" | "inserted"): ElementsDelta;
189
+ applyTo(elements: SceneElementsMap, snapshot?: StoreSnapshot["elements"], options?: ApplyToOptions): [SceneElementsMap, boolean];
190
+ squash(delta: ElementsDelta): this;
160
191
  private static createApplier;
161
192
  private static createGetter;
162
193
  private static applyDelta;
@@ -183,6 +214,7 @@ export declare class ElementsDelta implements DeltaContainer<SceneElementsMap> {
183
214
  * should be rebound (if possible) with the current element ~ bindings should be bidirectional.
184
215
  */
185
216
  private static rebindAffected;
217
+ static redrawElements(nextElements: SceneElementsMap, changedElements: Map<string, OrderedExcalidrawElement>): SceneElementsMap;
186
218
  private static redrawTextBoundingBoxes;
187
219
  private static redrawBoundArrows;
188
220
  private static reorderElements;
@@ -192,5 +224,6 @@ export declare class ElementsDelta implements DeltaContainer<SceneElementsMap> {
192
224
  */
193
225
  private static postProcess;
194
226
  private static stripIrrelevantProps;
227
+ private static stripVersionProps;
195
228
  }
196
229
  export {};
@@ -1,3 +1,3 @@
1
1
  import type { GlobalPoint } from "@excalidraw/math";
2
- import type { ExcalidrawBindableElement } from "./types";
3
- export declare const distanceToBindableElement: (element: ExcalidrawBindableElement, p: GlobalPoint) => number;
2
+ import type { ElementsMap, ExcalidrawElement } from "./types";
3
+ export declare const distanceToElement: (element: ExcalidrawElement, elementsMap: ElementsMap, p: GlobalPoint) => number;
@@ -1,6 +1,7 @@
1
+ import type { AppState } from "@excalidraw/excalidraw/types";
1
2
  import type { ElementsMap, ExcalidrawElement } from "./types";
2
3
  export interface Distribution {
3
4
  space: "between";
4
5
  axis: "x" | "y";
5
6
  }
6
- export declare const distributeElements: (selectedElements: ExcalidrawElement[], elementsMap: ElementsMap, distribution: Distribution) => ExcalidrawElement[];
7
+ export declare const distributeElements: (selectedElements: ExcalidrawElement[], elementsMap: ElementsMap, distribution: Distribution, appState: Readonly<AppState>) => ExcalidrawElement[];
@@ -1,4 +1,4 @@
1
- import type { ElementsMap, ExcalidrawElement, OrderedExcalidrawElement } from "./types";
1
+ import type { ElementsMap, ExcalidrawElement, OrderedExcalidrawElement, SceneElementsMap } from "./types";
2
2
  export declare class InvalidFractionalIndexError extends Error {
3
3
  code: "ELEMENT_HAS_INVALID_INDEX";
4
4
  }
@@ -44,8 +44,14 @@ export declare const orderByFractionalIndex: (elements: OrderedExcalidrawElement
44
44
  */
45
45
  export declare const syncMovedIndices: (elements: readonly ExcalidrawElement[], movedElements: ElementsMap) => OrderedExcalidrawElement[];
46
46
  /**
47
- * Synchronizes all invalid fractional indices with the array order by mutating passed elements.
47
+ * Synchronizes all invalid fractional indices within the array order by mutating elements in the passed array.
48
48
  *
49
49
  * WARN: in edge cases it could modify the elements which were not moved, as it's impossible to guess the actually moved elements from the elements array itself.
50
50
  */
51
51
  export declare const syncInvalidIndices: (elements: readonly ExcalidrawElement[]) => OrderedExcalidrawElement[];
52
+ /**
53
+ * Synchronizes all invalid fractional indices within the array order by creating new instances of elements with corrected indices.
54
+ *
55
+ * WARN: in edge cases it could modify the elements which were not moved, as it's impossible to guess the actually moved elements from the elements array itself.
56
+ */
57
+ export declare const syncInvalidIndicesImmutable: (elements: readonly ExcalidrawElement[]) => SceneElementsMap | undefined;
@@ -31,8 +31,8 @@ export declare const getFrameLikeElements: (allElements: ExcalidrawElementsInclu
31
31
  */
32
32
  export declare const getRootElements: (allElements: ExcalidrawElementsIncludingDeleted) => ExcalidrawElement[];
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").ExcalidrawSelectionElement | import("./types").ExcalidrawRectangleElement | import("./types").ExcalidrawDiamondElement | import("./types").ExcalidrawEllipseElement | import("./types").ExcalidrawTextElement | import("./types").ExcalidrawLinearElement | import("./types").ExcalidrawFreeDrawElement | import("./types").ExcalidrawImageElement | import("./types").ExcalidrawFrameElement | import("./types").ExcalidrawMagicFrameElement | import("./types").ExcalidrawIframeElement | import("./types").ExcalidrawEmbeddableElement)[];
35
- export declare const omitPartialGroups: (elements: ExcalidrawElement[], frame: ExcalidrawFrameLikeElement, allElementsMap: ElementsMap) => (import("./types").ExcalidrawSelectionElement | import("./types").ExcalidrawRectangleElement | import("./types").ExcalidrawDiamondElement | import("./types").ExcalidrawEllipseElement | import("./types").ExcalidrawTextElement | import("./types").ExcalidrawLinearElement | import("./types").ExcalidrawFreeDrawElement | import("./types").ExcalidrawImageElement | import("./types").ExcalidrawFrameElement | import("./types").ExcalidrawMagicFrameElement | import("./types").ExcalidrawIframeElement | import("./types").ExcalidrawEmbeddableElement)[];
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)[];
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[];
@@ -31,3 +31,4 @@ export declare const getNonDeletedGroupIds: (elements: ElementsMap) => Set<strin
31
31
  export declare const elementsAreInSameGroup: (elements: readonly ExcalidrawElement[]) => boolean;
32
32
  export declare const isInGroup: (element: NonDeletedExcalidrawElement) => boolean;
33
33
  export declare const getNewGroupIdsForDuplication: (groupIds: ExcalidrawElement["groupIds"], editingGroupId: AppState["editingGroupId"], mapper: (groupId: GroupId) => GroupId) => string[];
34
+ export declare const getSelectedElementsByGroup: (selectedElements: ExcalidrawElement[], elementsMap: ElementsMap, appState: Readonly<AppState>) => ExcalidrawElement[][];
@@ -43,9 +43,7 @@ export * from "./resizeElements";
43
43
  export * from "./resizeTest";
44
44
  export * from "./Scene";
45
45
  export * from "./selection";
46
- export * from "./Shape";
47
- export * from "./ShapeCache";
48
- export * from "./shapes";
46
+ export * from "./shape";
49
47
  export * from "./showSelectedShapeActions";
50
48
  export * from "./sizeHelpers";
51
49
  export * from "./sortElements";
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { type GlobalPoint, type LocalPoint } from "@excalidraw/math";
3
- import type { Store } from "@excalidraw/element";
3
+ import { type Store } from "@excalidraw/element";
4
4
  import type { AppState, PointerCoords, InteractiveCanvasAppState, AppClassProperties, NullableGridSize, Zoom } from "@excalidraw/excalidraw/types";
5
5
  import type { Scene } from "./Scene";
6
6
  import type { Bounds } from "./bounds";
@@ -39,7 +39,8 @@ export declare class LinearElementEditor {
39
39
  readonly segmentMidPointHoveredCoords: GlobalPoint | null;
40
40
  readonly elbowed: boolean;
41
41
  readonly customLineAngle: number | null;
42
- constructor(element: NonDeleted<ExcalidrawLinearElement>, elementsMap: ElementsMap);
42
+ readonly isEditing: boolean;
43
+ constructor(element: NonDeleted<ExcalidrawLinearElement>, elementsMap: ElementsMap, isEditing?: boolean);
43
44
  static POINT_HANDLE_SIZE: number;
44
45
  /**
45
46
  * @param id the `elementId` from the instance of this class (so that we can
@@ -50,10 +51,7 @@ export declare class LinearElementEditor {
50
51
  /**
51
52
  * @returns whether point was dragged
52
53
  */
53
- static handlePointDragging(event: PointerEvent, app: AppClassProperties, scenePointerX: number, scenePointerY: number, maybeSuggestBinding: (element: NonDeleted<ExcalidrawLinearElement>, pointSceneCoords: {
54
- x: number;
55
- y: number;
56
- }[]) => void, linearElementEditor: LinearElementEditor, scene: Scene): LinearElementEditor | null;
54
+ static handlePointDragging(event: PointerEvent, app: AppClassProperties, scenePointerX: number, scenePointerY: number, linearElementEditor: LinearElementEditor): Pick<AppState, keyof AppState> | null;
57
55
  static handlePointerUp(event: PointerEvent, editingLinearElement: LinearElementEditor, appState: AppState, scene: Scene): LinearElementEditor;
58
56
  static getEditorMidPoints: (element: NonDeleted<ExcalidrawLinearElement>, elementsMap: ElementsMap, appState: InteractiveCanvasAppState) => (GlobalPoint | null)[];
59
57
  static getSegmentMidpointHitCoords: (linearElementEditor: LinearElementEditor, scenePointer: {
@@ -61,7 +59,7 @@ export declare class LinearElementEditor {
61
59
  y: number;
62
60
  }, appState: AppState, elementsMap: ElementsMap) => GlobalPoint | null;
63
61
  static isSegmentTooShort<P extends GlobalPoint | LocalPoint>(element: NonDeleted<ExcalidrawLinearElement>, startPoint: P, endPoint: P, index: number, zoom: Zoom): boolean;
64
- static getSegmentMidPoint(element: NonDeleted<ExcalidrawLinearElement>, startPoint: GlobalPoint, endPoint: GlobalPoint, endPointIndex: number, elementsMap: ElementsMap): GlobalPoint;
62
+ static getSegmentMidPoint(element: NonDeleted<ExcalidrawLinearElement>, index: number): GlobalPoint;
65
63
  static getSegmentMidPointIndex(linearElementEditor: LinearElementEditor, appState: AppState, midPoint: GlobalPoint, elementsMap: ElementsMap): number;
66
64
  static handlePointerDown(event: React.PointerEvent<HTMLElement>, app: AppClassProperties, store: Store, scenePointer: {
67
65
  x: number;
@@ -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" | "version" | "versionNonce" | "updated">;
3
+ export type ElementUpdate<TElement extends ExcalidrawElement> = Omit<Partial<TElement>, "id" | "updated">;
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
@@ -13,6 +13,7 @@ export declare const rescalePointsInElement: (element: NonDeletedExcalidrawEleme
13
13
  export declare const measureFontSizeFromWidth: (element: NonDeleted<ExcalidrawTextElement>, elementsMap: ElementsMap, nextWidth: number) => {
14
14
  size: number;
15
15
  } | null;
16
+ export declare const resizeSingleTextElement: (origElement: NonDeleted<ExcalidrawTextElement>, element: NonDeleted<ExcalidrawTextElement>, scene: Scene, transformHandleType: TransformHandleDirection, shouldResizeFromCenter: boolean, nextWidth: number, nextHeight: number) => void;
16
17
  export declare const getResizeOffsetXY: (transformHandleType: MaybeTransformHandleType, selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap, x: number, y: number) => [number, number];
17
18
  export declare const getResizeArrowDirection: (transformHandleType: MaybeTransformHandleType, element: NonDeleted<ExcalidrawLinearElement>) => "origin" | "end";
18
19
  export declare const resizeSingleElement: (nextWidth: number, nextHeight: number, latestElement: ExcalidrawElement, origElement: ExcalidrawElement, originalElementsMap: ElementsMap, scene: Scene, handleDirection: TransformHandleDirection, { shouldInformMutation, shouldMaintainAspectRatio, shouldResizeFromCenter, }?: {
@@ -27,12 +27,12 @@ export declare const makeNextSelectedElementIds: (nextSelectedElementIds: AppSta
27
27
  [id: string]: true;
28
28
  }>;
29
29
  export declare const getSelectionStateForElements: (targetElements: readonly ExcalidrawElement[], allElements: readonly NonDeletedExcalidrawElement[], appState: AppState) => {
30
+ editingGroupId: string | null;
30
31
  selectedElementIds: Readonly<{
31
32
  [id: string]: true;
32
33
  }>;
33
34
  selectedGroupIds: {
34
35
  [groupId: string]: boolean;
35
36
  };
36
- editingGroupId: string | null;
37
37
  selectedLinearElement: LinearElementEditor | null;
38
38
  };
@@ -0,0 +1,42 @@
1
+ import { type GeometricShape } from "@excalidraw/utils/shape";
2
+ import { type LocalPoint } from "@excalidraw/math";
3
+ import type { GlobalPoint } from "@excalidraw/math";
4
+ import type { AppState, EmbedsValidationStatus } from "@excalidraw/excalidraw/types";
5
+ import type { ElementShape, ElementShapes } from "@excalidraw/excalidraw/scene/types";
6
+ import type { ExcalidrawElement, ExcalidrawLinearElement, ExcalidrawFreeDrawElement, ElementsMap, ExcalidrawLineElement } from "./types";
7
+ import type { Drawable, Options } from "roughjs/bin/core";
8
+ export declare class ShapeCache {
9
+ private static rg;
10
+ private static cache;
11
+ /**
12
+ * Retrieves shape from cache if available. Use this only if shape
13
+ * is optional and you have a fallback in case it's not cached.
14
+ */
15
+ static get: <T extends ExcalidrawElement>(element: T) => T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] | undefined : ElementShape | undefined;
16
+ static set: <T extends ExcalidrawElement>(element: T, shape: T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] : Drawable) => WeakMap<ExcalidrawElement, ElementShape>;
17
+ static delete: (element: ExcalidrawElement) => boolean;
18
+ static destroy: () => void;
19
+ /**
20
+ * Generates & caches shape for element if not already cached, otherwise
21
+ * returns cached shape.
22
+ */
23
+ static generateElementShape: <T extends ExcalidrawLinearElement | 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 | ExcalidrawFreeDrawElement | import("./types").ExcalidrawArrowElement>(element: T, renderConfig: {
24
+ isExporting: boolean;
25
+ canvasBackgroundColor: AppState["viewBackgroundColor"];
26
+ embedsValidationStatus: EmbedsValidationStatus;
27
+ } | null) => ((T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] | undefined : ElementShape | undefined) & ({} | null)) | (T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] : Drawable | null);
28
+ }
29
+ export declare const generateRoughOptions: (element: ExcalidrawElement, continuousPath?: boolean) => Options;
30
+ export declare const generateLinearCollisionShape: (element: ExcalidrawLinearElement | ExcalidrawFreeDrawElement) => {
31
+ op: string;
32
+ data: number[];
33
+ }[];
34
+ /**
35
+ * get the pure geometric shape of an excalidraw elementw
36
+ * which is then used for hit detection
37
+ */
38
+ export declare const getElementShape: <Point extends GlobalPoint | LocalPoint>(element: ExcalidrawElement, elementsMap: ElementsMap) => GeometricShape<Point>;
39
+ export declare const toggleLinePolygonState: (element: ExcalidrawLineElement, nextPolygonState: boolean) => {
40
+ polygon: ExcalidrawLineElement["polygon"];
41
+ points: ExcalidrawLineElement["points"];
42
+ } | null;