@excalidraw/element 0.18.0-2b0e4c9 → 0.18.0-2b1c2a9

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 (193) hide show
  1. package/dist/dev/index.js +5650 -3215
  2. package/dist/dev/index.js.map +4 -4
  3. package/dist/prod/index.js +19 -18
  4. package/dist/types/common/src/colors.d.ts +20 -1
  5. package/dist/types/common/src/constants.d.ts +12 -7
  6. package/dist/types/common/src/keys.d.ts +2 -0
  7. package/dist/types/common/src/points.d.ts +1 -1
  8. package/dist/types/common/src/utils.d.ts +1 -43
  9. package/dist/types/element/src/Scene.d.ts +6 -4
  10. package/dist/types/element/src/align.d.ts +2 -2
  11. package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
  12. package/dist/types/element/src/arrows/focus.d.ts +5 -2
  13. package/dist/types/element/src/binding.d.ts +17 -8
  14. package/dist/types/element/src/bounds.d.ts +22 -7
  15. package/dist/types/element/src/bucketFill.d.ts +110 -0
  16. package/dist/types/element/src/collision.d.ts +1 -1
  17. package/dist/types/element/src/comparisons.d.ts +5 -4
  18. package/dist/types/element/src/convertToShape.d.ts +23 -0
  19. package/dist/types/element/src/distribute.d.ts +2 -2
  20. package/dist/types/element/src/dragElements.d.ts +27 -0
  21. package/dist/types/element/src/duplicate.d.ts +4 -3
  22. package/dist/types/element/src/embeddable.d.ts +2 -2
  23. package/dist/types/element/src/flowchart.d.ts +7 -7
  24. package/dist/types/element/src/fractionalIndex.d.ts +2 -2
  25. package/dist/types/element/src/frame.d.ts +9 -8
  26. package/dist/types/element/src/groups.d.ts +9 -9
  27. package/dist/types/element/src/index.d.ts +4 -1
  28. package/dist/types/element/src/linearElementEditor.d.ts +27 -10
  29. package/dist/types/element/src/newElement.d.ts +15 -0
  30. package/dist/types/element/src/renderElement.d.ts +0 -3
  31. package/dist/types/element/src/resizeElements.d.ts +2 -2
  32. package/dist/types/element/src/selection.d.ts +11 -7
  33. package/dist/types/element/src/shape.d.ts +13 -1
  34. package/dist/types/element/src/sortElements.d.ts +10 -0
  35. package/dist/types/element/src/textElement.d.ts +14 -10
  36. package/dist/types/element/src/textWrapping.d.ts +26 -0
  37. package/dist/types/element/src/transform.d.ts +2 -2
  38. package/dist/types/element/src/typeChecks.d.ts +26 -25
  39. package/dist/types/element/src/types.d.ts +15 -1
  40. package/dist/types/element/src/utils.d.ts +7 -3
  41. package/dist/types/element/src/visualdebug.d.ts +1 -2
  42. package/dist/types/element/src/zindex.d.ts +2 -2
  43. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +48 -21
  44. package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
  45. package/dist/types/excalidraw/actions/actionBoundText.d.ts +33 -15
  46. package/dist/types/excalidraw/actions/actionCanvas.d.ts +174 -947
  47. package/dist/types/excalidraw/actions/actionClipboard.d.ts +32 -14
  48. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +16 -7
  49. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +50 -22
  50. package/dist/types/excalidraw/actions/{actionEmbeddable.d.ts → actionDeselect.d.ts} +30 -36
  51. package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -3
  52. package/dist/types/excalidraw/actions/actionElementLink.d.ts +16 -7
  53. package/dist/types/excalidraw/actions/actionElementLock.d.ts +33 -15
  54. package/dist/types/excalidraw/actions/actionExport.d.ts +34 -16
  55. package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
  56. package/dist/types/excalidraw/actions/actionFrame.d.ts +61 -205
  57. package/dist/types/excalidraw/actions/actionGroup.d.ts +48 -30
  58. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +21 -9
  59. package/dist/types/excalidraw/actions/actionLink.d.ts +17 -8
  60. package/dist/types/excalidraw/actions/actionMenu.d.ts +16 -7
  61. package/dist/types/excalidraw/actions/actionProperties.d.ts +62 -32
  62. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +21 -12
  63. package/dist/types/excalidraw/actions/actionStyles.d.ts +17 -7
  64. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +3 -3
  65. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +17 -8
  66. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +20 -12
  67. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +17 -8
  68. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +17 -8
  69. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +20 -12
  70. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
  71. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +17 -8
  72. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +18 -9
  73. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +17 -8
  74. package/dist/types/excalidraw/actions/index.d.ts +2 -2
  75. package/dist/types/excalidraw/actions/manager.d.ts +1 -0
  76. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  77. package/dist/types/excalidraw/actions/types.d.ts +8 -4
  78. package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
  79. package/dist/types/excalidraw/appState.d.ts +12 -5
  80. package/dist/types/excalidraw/components/Actions.d.ts +17 -12
  81. package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
  82. package/dist/types/excalidraw/components/App.arrowText.d.ts +104 -0
  83. package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
  84. package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
  85. package/dist/types/excalidraw/components/App.d.ts +391 -68
  86. package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
  87. package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
  88. package/dist/types/excalidraw/components/App.viewport.d.ts +73 -0
  89. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -3
  90. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
  91. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +3 -1
  92. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +9 -2
  93. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
  94. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
  95. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
  96. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -1
  97. package/dist/types/excalidraw/components/ColorPicker/topPicksDnD.d.ts +31 -0
  98. package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
  99. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -2
  100. package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
  101. package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -1
  102. package/dist/types/excalidraw/components/{ToolButton.d.ts → IconButton.d.ts} +16 -19
  103. package/dist/types/excalidraw/components/Island.d.ts +7 -0
  104. package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
  105. package/dist/types/excalidraw/components/LayerUI.d.ts +5 -2
  106. package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
  107. package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
  108. package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
  109. package/dist/types/excalidraw/components/MobileMenu.d.ts +4 -4
  110. package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
  111. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  112. package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
  113. package/dist/types/excalidraw/components/Popover.d.ts +1 -3
  114. package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
  115. package/dist/types/excalidraw/components/Range.d.ts +10 -4
  116. package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
  117. package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
  118. package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
  119. package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
  120. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
  121. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -2
  122. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
  123. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
  124. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
  125. package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
  126. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  127. package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +4 -4
  128. package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +3 -3
  129. package/dist/types/excalidraw/components/ToolPopover.d.ts +3 -6
  130. package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
  131. package/dist/types/excalidraw/components/Tools.d.ts +146 -0
  132. package/dist/types/excalidraw/components/UserList.d.ts +3 -2
  133. package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
  134. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +4 -1
  135. package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +1 -0
  136. package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  137. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -1
  138. package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
  139. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -2
  140. package/dist/types/excalidraw/components/icons.d.ts +6 -1
  141. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +8 -4
  142. package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
  143. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
  144. package/dist/types/excalidraw/data/blob.d.ts +36 -18
  145. package/dist/types/excalidraw/data/index.d.ts +4 -4
  146. package/dist/types/excalidraw/data/json.d.ts +24 -15
  147. package/dist/types/excalidraw/data/library.d.ts +1 -1
  148. package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
  149. package/dist/types/excalidraw/eraser/index.d.ts +2 -3
  150. package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
  151. package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
  152. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  153. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
  154. package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
  155. package/dist/types/excalidraw/lasso/index.d.ts +2 -3
  156. package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
  157. package/dist/types/excalidraw/renderer/animation.d.ts +5 -1
  158. package/dist/types/excalidraw/renderer/helpers.d.ts +7 -0
  159. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +1 -3
  160. package/dist/types/excalidraw/scene/Renderer.d.ts +427 -19
  161. package/dist/types/excalidraw/scene/export.d.ts +3 -3
  162. package/dist/types/excalidraw/scene/index.d.ts +2 -2
  163. package/dist/types/excalidraw/scene/types.d.ts +4 -3
  164. package/dist/types/excalidraw/snapping.d.ts +7 -7
  165. package/dist/types/excalidraw/textAutoResizeHandle.d.ts +15 -0
  166. package/dist/types/excalidraw/types.d.ts +436 -24
  167. package/dist/types/excalidraw/viewport.d.ts +275 -0
  168. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +6 -3
  169. package/dist/types/fractional-indexing/src/index.d.ts +29 -0
  170. package/dist/types/laser-pointer/src/index.d.ts +2 -0
  171. package/dist/types/laser-pointer/src/math.d.ts +16 -0
  172. package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
  173. package/dist/types/laser-pointer/src/state.d.ts +36 -0
  174. package/dist/types/math/src/constants.d.ts +0 -1
  175. package/dist/types/math/src/curve.d.ts +23 -13
  176. package/dist/types/math/src/index.d.ts +1 -0
  177. package/dist/types/math/src/pca.d.ts +79 -0
  178. package/dist/types/math/src/point.d.ts +2 -1
  179. package/dist/types/math/src/polygon.d.ts +25 -1
  180. package/dist/types/math/src/segment.d.ts +6 -0
  181. package/dist/types/utils/src/export.d.ts +3 -3
  182. package/dist/types/utils/src/index.d.ts +1 -2
  183. package/package.json +4 -3
  184. package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
  185. package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
  186. package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
  187. package/dist/types/excalidraw/components/MobileToolBar.d.ts +0 -10
  188. package/dist/types/excalidraw/components/shapes.d.ts +0 -263
  189. package/dist/types/excalidraw/cursor.d.ts +0 -5
  190. package/dist/types/excalidraw/scene/scroll.d.ts +0 -18
  191. package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
  192. package/dist/types/utils/src/bbox.d.ts +0 -9
  193. package/dist/types/utils/src/withinBounds.d.ts +0 -19
@@ -1,6 +1,6 @@
1
1
  import type { Mutable } from "@excalidraw/common/utility-types";
2
2
  import type { AppState } from "@excalidraw/excalidraw/types";
3
- import type { ExcalidrawElement, GroupId } from "./types";
3
+ import type { ExcalidrawElement, GroupId, NonDeletedExcalidrawElement } from "./types";
4
4
  /**
5
5
  * Duplicate an element, often used in the alt-drag operation.
6
6
  * Note that this method has gotten a bit complicated since the
@@ -31,6 +31,7 @@ export declare const duplicateElements: (opts: {
31
31
  * user interaction.
32
32
  */
33
33
  type: "everything";
34
+ preserveFrameChildrenOrder?: boolean;
34
35
  } | {
35
36
  /**
36
37
  * Duplicates specified elements and inserts them back into the array
@@ -46,8 +47,8 @@ export declare const duplicateElements: (opts: {
46
47
  selectedGroupIds: AppState["selectedGroupIds"];
47
48
  };
48
49
  })) => {
49
- duplicatedElements: ExcalidrawElement[];
50
- duplicateElementsMap: Map<string, ExcalidrawElement>;
50
+ duplicatedElements: NonDeletedExcalidrawElement[];
51
+ duplicateElementsMap: Map<string, NonDeletedExcalidrawElement>;
51
52
  elementsWithDuplicates: ExcalidrawElement[];
52
53
  origIdToDuplicateId: Map<string, string>;
53
54
  };
@@ -1,10 +1,10 @@
1
1
  import type { ExcalidrawProps } from "@excalidraw/excalidraw/types";
2
2
  import type { MarkRequired } from "@excalidraw/common/utility-types";
3
- import type { ExcalidrawElement, ExcalidrawIframeLikeElement, IframeData } from "./types";
3
+ import type { ExcalidrawIframeLikeElement, IframeData, NonDeletedExcalidrawElement } from "./types";
4
4
  type IframeDataWithSandbox = MarkRequired<IframeData, "sandbox">;
5
5
  export declare const createSrcDoc: (body: string) => string;
6
6
  export declare const getEmbedLink: (link: string | null | undefined) => IframeDataWithSandbox | null;
7
- export declare const createPlaceholderEmbeddableLabel: (element: ExcalidrawIframeLikeElement) => ExcalidrawElement;
7
+ export declare const createPlaceholderEmbeddableLabel: (element: ExcalidrawIframeLikeElement) => NonDeletedExcalidrawElement;
8
8
  export declare const maybeParseEmbedSrc: (str: string) => string;
9
9
  export declare const embeddableURLValidator: (url: string | null | undefined, validateEmbeddable: ExcalidrawProps["validateEmbeddable"]) => boolean;
10
10
  export {};
@@ -1,10 +1,7 @@
1
1
  import type { AppState, PendingExcalidrawElements } from "@excalidraw/excalidraw/types";
2
- import { type ElementsMap, type ExcalidrawBindableElement, type ExcalidrawElement, type ExcalidrawFlowchartNodeElement } from "./types";
2
+ import { type NonDeleted, type ElementsMap, type ExcalidrawElement, type ExcalidrawFlowchartNodeElement } from "./types";
3
3
  import type { Scene } from "./Scene";
4
- type LinkDirection = "up" | "right" | "down" | "left";
5
- export declare const getLinkDirectionFromKey: (key: string) => LinkDirection;
6
- export declare const getPredecessors: (node: ExcalidrawBindableElement, elementsMap: ElementsMap, direction: LinkDirection) => ExcalidrawBindableElement[];
7
- export declare const addNewNodes: (startNode: ExcalidrawFlowchartNodeElement, appState: AppState, direction: LinkDirection, scene: Scene, numberOfNodes: number) => ExcalidrawElement[];
4
+ export type LinkDirection = "up" | "right" | "down" | "left";
8
5
  export declare class FlowChartNavigator {
9
6
  isExploring: boolean;
10
7
  private sameLevelNodes;
@@ -13,14 +10,17 @@ export declare class FlowChartNavigator {
13
10
  private visitedNodes;
14
11
  clear(): void;
15
12
  exploreByDirection(element: ExcalidrawElement, elementsMap: ElementsMap, direction: LinkDirection): ExcalidrawElement["id"] | null;
13
+ private static getNodeRelatives;
14
+ private static getSuccessors;
15
+ private static getPredecessors;
16
16
  }
17
17
  export declare class FlowChartCreator {
18
18
  isCreatingChart: boolean;
19
19
  private numberOfNodes;
20
20
  private direction;
21
+ private clusterCrossStart;
21
22
  pendingNodes: PendingExcalidrawElements | null;
22
- createNodes(startNode: ExcalidrawFlowchartNodeElement, appState: AppState, direction: LinkDirection, scene: Scene): void;
23
+ createNodes(startNode: NonDeleted<ExcalidrawFlowchartNodeElement>, appState: AppState, direction: LinkDirection, scene: Scene): void;
23
24
  clear(): void;
24
25
  }
25
26
  export declare const isNodeInFlowchart: (element: ExcalidrawFlowchartNodeElement, elementsMap: ElementsMap) => boolean;
26
- export {};
@@ -1,4 +1,4 @@
1
- import type { ElementsMap, ExcalidrawElement, OrderedExcalidrawElement, SceneElementsMap } from "./types";
1
+ import type { ElementsMap, ExcalidrawElement, Ordered, OrderedExcalidrawElement, SceneElementsMap } from "./types";
2
2
  export declare class InvalidFractionalIndexError extends Error {
3
3
  code: "ELEMENT_HAS_INVALID_INDEX";
4
4
  }
@@ -48,7 +48,7 @@ export declare const syncMovedIndices: (elements: readonly ExcalidrawElement[],
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
- export declare const syncInvalidIndices: (elements: readonly ExcalidrawElement[]) => OrderedExcalidrawElement[];
51
+ export declare const syncInvalidIndices: <T extends ExcalidrawElement>(elements: readonly T[]) => Ordered<T>[];
52
52
  /**
53
53
  * Synchronizes all invalid fractional indices within the array order by creating new instances of elements with corrected indices.
54
54
  *
@@ -29,24 +29,25 @@ export declare const getFrameLikeElements: (allElements: ExcalidrawElementsInclu
29
29
  *
30
30
  * Considers non-frame bound elements (container or arrow labels) as root.
31
31
  */
32
- export declare const getRootElements: (allElements: ExcalidrawElementsIncludingDeleted) => ExcalidrawElement[];
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
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
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[];
39
+ export declare const getCommonFrameId: (elements: readonly ExcalidrawElement[]) => string | null;
40
+ export declare const getFrameChildrenInsertionIndex: (elements: readonly ExcalidrawElement[], frameId: ExcalidrawFrameLikeElement["id"]) => number | null;
39
41
  /**
40
- * Retains (or repairs for target frame) the ordering invriant where children
41
- * elements come right before the parent frame:
42
- * [el, el, child, child, frame, el]
42
+ * Adds elements and their bound elements to frame. Reorders added elements to
43
+ * be just below frame, or just above its highest child (whichever is higher).
43
44
  *
44
45
  * @returns mutated allElements (same data structure)
45
46
  */
46
- export declare const addElementsToFrame: <T extends ElementsMapOrArray>(allElements: T, elementsToAdd: NonDeletedExcalidrawElement[], frame: ExcalidrawFrameLikeElement, appState: AppState) => T;
47
- export declare const removeElementsFromFrame: (elementsToRemove: ReadonlySetLike<NonDeletedExcalidrawElement>, elementsMap: ElementsMap) => void;
47
+ export declare const addElementsToFrame: <T extends ElementsMapOrArray>(allElements: T, elementsToAdd: ExcalidrawElement[], frame: ExcalidrawFrameLikeElement) => T;
48
+ export declare const removeElementsFromFrame: (elementsToRemove: ReadonlySetLike<ExcalidrawElement>, elementsMap: ElementsMap) => void;
48
49
  export declare const removeAllElementsFromFrame: <T extends ExcalidrawElement>(allElements: readonly T[], frame: ExcalidrawFrameLikeElement) => readonly T[];
49
- export declare const replaceAllElementsInFrame: <T extends ExcalidrawElement>(allElements: readonly T[], nextElementsInFrame: ExcalidrawElement[], frame: ExcalidrawFrameLikeElement, app: AppClassProperties) => T[];
50
+ export declare const replaceAllElementsInFrame: <T extends ExcalidrawElement>(allElements: readonly T[], nextElementsInFrame: ExcalidrawElement[], frame: ExcalidrawFrameLikeElement) => T[];
50
51
  /** does not mutate elements, but returns new ones */
51
52
  export declare const updateFrameMembershipOfSelectedElements: <T extends ElementsMapOrArray>(allElements: T, appState: AppState, app: AppClassProperties) => T;
52
53
  /**
@@ -70,5 +71,5 @@ export declare const isElementInFrame: (element: ExcalidrawElement, allElementsM
70
71
  export declare const shouldApplyFrameClip: (element: ExcalidrawElement, frame: ExcalidrawFrameLikeElement, appState: StaticCanvasAppState, elementsMap: ElementsMap, checkedGroups?: Map<string, boolean>) => boolean;
71
72
  export declare const getDefaultFrameName: (element: ExcalidrawFrameLikeElement) => "Frame" | "AI Frame";
72
73
  export declare const getFrameLikeTitle: (element: ExcalidrawFrameLikeElement) => string;
73
- export declare const getElementsOverlappingFrame: (elements: readonly ExcalidrawElement[], frame: ExcalidrawFrameLikeElement) => NonDeletedExcalidrawElement[];
74
+ export declare const getElementsOverlappingFrame: <T extends ExcalidrawElement>(elements: readonly T[], frame: ExcalidrawFrameLikeElement, elementsMap: ElementsMap) => T[];
74
75
  export declare const frameAndChildrenSelectedTogether: (selectedElements: readonly ExcalidrawElement[]) => boolean;
@@ -1,7 +1,7 @@
1
1
  import type { AppClassProperties, AppState, InteractiveCanvasAppState } from "@excalidraw/excalidraw/types";
2
2
  import type { Mutable } from "@excalidraw/common/utility-types";
3
- import type { GroupId, ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement, ElementsMapOrArray, ElementsMap } from "./types";
4
- export declare const selectGroup: (groupId: GroupId, appState: InteractiveCanvasAppState, elements: readonly NonDeleted<ExcalidrawElement>[]) => Pick<InteractiveCanvasAppState, "selectedGroupIds" | "selectedElementIds" | "editingGroupId">;
3
+ import type { GroupId, ExcalidrawElement, NonDeleted, ElementsMapOrArray, ElementsMap, NonDeletedExcalidrawElement, NonDeletedElementsMapOrArray } from "./types";
4
+ export declare const selectGroup: (groupId: GroupId, appState: InteractiveCanvasAppState, elements: readonly NonDeletedExcalidrawElement[]) => Pick<InteractiveCanvasAppState, "selectedGroupIds" | "selectedElementIds" | "editingGroupId">;
5
5
  export declare const selectGroupsForSelectedElements: {
6
6
  (appState: Pick<AppState, "selectedElementIds" | "editingGroupId">, elements: readonly NonDeletedExcalidrawElement[], prevAppState: InteractiveCanvasAppState, app: AppClassProperties | null): Mutable<Pick<InteractiveCanvasAppState, "selectedGroupIds" | "editingGroupId" | "selectedElementIds">>;
7
7
  clearCache(): void;
@@ -10,15 +10,15 @@ export declare const selectGroupsForSelectedElements: {
10
10
  * If the element's group is selected, don't render an individual
11
11
  * selection border around it.
12
12
  */
13
- export declare const isSelectedViaGroup: (appState: InteractiveCanvasAppState, element: ExcalidrawElement) => boolean;
13
+ export declare const isSelectedViaGroup: (appState: Pick<InteractiveCanvasAppState, "editingGroupId" | "selectedGroupIds">, element: ExcalidrawElement) => boolean;
14
14
  export declare const getSelectedGroupForElement: (appState: Pick<InteractiveCanvasAppState, "editingGroupId" | "selectedGroupIds">, element: ExcalidrawElement) => string | undefined;
15
- export declare const getSelectedGroupIds: (appState: InteractiveCanvasAppState) => GroupId[];
16
- export declare const selectGroupsFromGivenElements: (elements: readonly NonDeleted<ExcalidrawElement>[], appState: InteractiveCanvasAppState) => {
15
+ export declare const getSelectedGroupIds: (appState: Pick<InteractiveCanvasAppState, "selectedGroupIds">) => GroupId[];
16
+ export declare const selectGroupsFromGivenElements: (elements: readonly NonDeletedExcalidrawElement[], appState: InteractiveCanvasAppState) => {
17
17
  [groupId: string]: boolean;
18
18
  };
19
19
  export declare const editGroupForSelectedElement: (appState: AppState, element: NonDeleted<ExcalidrawElement>) => AppState;
20
20
  export declare const isElementInGroup: (element: ExcalidrawElement, groupId: string) => boolean;
21
- export declare const getElementsInGroup: (elements: ElementsMapOrArray, groupId: string) => ExcalidrawElement[];
21
+ export declare const getElementsInGroup: <P extends NonDeletedExcalidrawElement | ExcalidrawElement>(elements: P extends NonDeletedExcalidrawElement ? NonDeletedElementsMapOrArray : ElementsMapOrArray, groupId: string) => P[];
22
22
  export declare const getSelectedGroupIdForElement: (element: ExcalidrawElement, selectedGroupIds: {
23
23
  [groupId: string]: boolean;
24
24
  }) => string | undefined;
@@ -26,9 +26,9 @@ export declare const addToGroup: (prevGroupIds: ExcalidrawElement["groupIds"], n
26
26
  export declare const removeFromSelectedGroups: (groupIds: ExcalidrawElement["groupIds"], selectedGroupIds: {
27
27
  [groupId: string]: boolean;
28
28
  }) => string[];
29
- export declare const getMaximumGroups: (elements: ExcalidrawElement[], elementsMap: ElementsMap) => ExcalidrawElement[][];
29
+ export declare const getMaximumGroups: <T extends NonDeletedExcalidrawElement | ExcalidrawElement>(elements: T[], elementsMap: ElementsMap) => T[][];
30
30
  export declare const getNonDeletedGroupIds: (elements: ElementsMap) => Set<string>;
31
31
  export declare const elementsAreInSameGroup: (elements: readonly ExcalidrawElement[]) => boolean;
32
- export declare const isInGroup: (element: NonDeletedExcalidrawElement) => boolean;
32
+ export declare const isInGroup: (element: ExcalidrawElement) => 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[][];
34
+ export declare const getSelectedElementsByGroup: (selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap, appState: Readonly<Pick<AppState, "selectedGroupIds" | "editingGroupId">>) => NonDeletedExcalidrawElement[][];
@@ -8,12 +8,14 @@ export declare const getSceneVersion: (elements: readonly ExcalidrawElement[]) =
8
8
  */
9
9
  export declare const hashElementsVersion: (elements: ElementsMapOrArray) => number;
10
10
  export declare const hashString: (s: string) => number;
11
+ export declare const isNonDeletedElement: <T extends ExcalidrawElement>(element: T) => element is NonDeleted<T>;
11
12
  export declare const getVisibleElements: (elements: readonly ExcalidrawElement[]) => readonly NonDeletedExcalidrawElement[];
12
13
  export declare const getNonDeletedElements: <T extends ExcalidrawElement>(elements: readonly T[]) => readonly NonDeleted<T>[];
13
- export declare const isNonDeletedElement: <T extends ExcalidrawElement>(element: T) => element is NonDeleted<T>;
14
14
  export * from "./align";
15
+ export * from "./arrowEndpointText";
15
16
  export * from "./binding";
16
17
  export * from "./bounds";
18
+ export * from "./bucketFill";
17
19
  export * from "./collision";
18
20
  export * from "./comparisons";
19
21
  export * from "./containerCache";
@@ -57,3 +59,4 @@ export * from "./utils";
57
59
  export * from "./zindex";
58
60
  export * from "./arrows/helpers";
59
61
  export * from "./arrowheads";
62
+ export * from "./convertToShape";
@@ -22,6 +22,7 @@ export declare class LinearElementEditor {
22
22
  };
23
23
  arrowStartIsInside: boolean;
24
24
  altFocusPoint: Readonly<GlobalPoint> | null;
25
+ arrowOtherEndpointInitialBinding: FixedPointBinding | null;
25
26
  }>;
26
27
  /** whether you're dragging a point */
27
28
  readonly isDragging: boolean;
@@ -45,18 +46,18 @@ export declare class LinearElementEditor {
45
46
  * @param id the `elementId` from the instance of this class (so that we can
46
47
  * statically guarantee this method returns an ExcalidrawLinearElement)
47
48
  */
48
- static getElement<T extends ExcalidrawLinearElement>(id: InstanceType<typeof LinearElementEditor>["elementId"], elementsMap: ElementsMap): T | null;
49
+ static getElement<T extends ExcalidrawLinearElement>(id: InstanceType<typeof LinearElementEditor>["elementId"], elementsMap: ElementsMap): NonDeleted<T> | null;
49
50
  static handleBoxSelection(event: PointerEvent, appState: AppState, setState: React.Component<any, AppState>["setState"], elementsMap: NonDeletedSceneElementsMap): false | undefined;
50
51
  static handlePointerMove(event: PointerEvent, app: AppClassProperties, scenePointerX: number, scenePointerY: number, linearElementEditor: LinearElementEditor): Pick<AppState, "suggestedBinding" | "selectedLinearElement"> | null;
51
52
  static handlePointDragging(event: PointerEvent, app: AppClassProperties, scenePointerX: number, scenePointerY: number, linearElementEditor: LinearElementEditor): Pick<AppState, "suggestedBinding" | "selectedLinearElement"> | null;
52
53
  static handlePointerUp(event: PointerEvent, editingLinearElement: LinearElementEditor, appState: AppState, scene: Scene): LinearElementEditor;
53
- static getEditorMidPoints: (element: NonDeleted<ExcalidrawLinearElement>, elementsMap: ElementsMap, appState: InteractiveCanvasAppState) => (GlobalPoint | null)[];
54
+ static getEditorMidPoints: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, appState: InteractiveCanvasAppState) => (GlobalPoint | null)[];
54
55
  static getSegmentMidpointHitCoords: (linearElementEditor: LinearElementEditor, scenePointer: {
55
56
  x: number;
56
57
  y: number;
57
58
  }, appState: AppState, elementsMap: ElementsMap) => GlobalPoint | null;
58
- static isSegmentTooShort<P extends GlobalPoint | LocalPoint>(element: NonDeleted<ExcalidrawLinearElement>, startPoint: P, endPoint: P, index: number, zoom: Zoom): boolean;
59
- static getSegmentMidPoint(element: NonDeleted<ExcalidrawLinearElement>, index: number): GlobalPoint;
59
+ static isSegmentTooShort<P extends GlobalPoint | LocalPoint>(element: ExcalidrawLinearElement, startPoint: P, endPoint: P, index: number, zoom: Zoom, elementsMap: ElementsMap): boolean;
60
+ static getSegmentMidPoint(element: ExcalidrawLinearElement, index: number, elementsMap: ElementsMap): GlobalPoint;
60
61
  static getSegmentMidPointIndex(linearElementEditor: LinearElementEditor, appState: AppState, midPoint: GlobalPoint, elementsMap: ElementsMap): number;
61
62
  static handlePointerDown(event: React.PointerEvent<HTMLElement>, app: AppClassProperties, store: Store, scenePointer: {
62
63
  x: number;
@@ -64,19 +65,26 @@ export declare class LinearElementEditor {
64
65
  }, linearElementEditor: LinearElementEditor, scene: Scene): {
65
66
  didAddPoint: boolean;
66
67
  hitElement: NonDeleted<ExcalidrawElement> | null;
68
+ /** the pointer went down on the arrow's label, grabbing it for a drag */
69
+ hitBoundText: boolean;
67
70
  linearElementEditor: LinearElementEditor | null;
68
71
  };
69
72
  static arePointsEqual<Point extends LocalPoint | GlobalPoint>(point1: Point | null, point2: Point | null): boolean;
70
73
  static handlePointerMoveInEditMode(event: React.PointerEvent<HTMLCanvasElement>, scenePointerX: number, scenePointerY: number, app: AppClassProperties): LinearElementEditor | null;
71
74
  /** scene coords */
72
- static getPointGlobalCoordinates(element: NonDeleted<ExcalidrawLinearElement>, p: LocalPoint, elementsMap: ElementsMap): GlobalPoint;
75
+ static getPointGlobalCoordinates(element: ExcalidrawLinearElement, p: LocalPoint, elementsMap: ElementsMap): GlobalPoint;
73
76
  /** scene coords */
74
- static getPointsGlobalCoordinates(element: NonDeleted<ExcalidrawLinearElement>, elementsMap: ElementsMap): GlobalPoint[];
75
- static getPointAtIndexGlobalCoordinates(element: NonDeleted<ExcalidrawLinearElement>, indexMaybeFromEnd: number, // -1 for last element
77
+ static getPointsGlobalCoordinates(element: ExcalidrawLinearElement, elementsMap: ElementsMap): GlobalPoint[];
78
+ static getPointAtIndexGlobalCoordinates(element: ExcalidrawLinearElement, indexMaybeFromEnd: number, // -1 for last element
76
79
  elementsMap: ElementsMap): GlobalPoint;
77
- static pointFromAbsoluteCoords(element: NonDeleted<ExcalidrawLinearElement>, absoluteCoords: GlobalPoint, elementsMap: ElementsMap): LocalPoint;
78
- static getPointIndexUnderCursor(element: NonDeleted<ExcalidrawLinearElement>, elementsMap: ElementsMap, zoom: AppState["zoom"], x: number, y: number): number;
79
- static createPointAt(element: NonDeleted<ExcalidrawLinearElement>, elementsMap: ElementsMap, scenePointerX: number, scenePointerY: number, gridSize: NullableGridSize): LocalPoint;
80
+ static pointFromAbsoluteCoords(element: ExcalidrawLinearElement, absoluteCoords: GlobalPoint, elementsMap: ElementsMap): LocalPoint;
81
+ /**
82
+ * Whether the point at `index` is an interactive handle. Elbow arrows only
83
+ * expose their endpoints; their intermediate route points are not draggable.
84
+ */
85
+ static isPointHandle(element: ExcalidrawLinearElement, index: number): boolean;
86
+ static getPointIndexUnderCursor(element: ExcalidrawLinearElement, elementsMap: ElementsMap, zoom: AppState["zoom"], x: number, y: number): number;
87
+ static createPointAt(element: ExcalidrawLinearElement, elementsMap: ElementsMap, scenePointerX: number, scenePointerY: number, gridSize: NullableGridSize): LocalPoint;
80
88
  /**
81
89
  * Normalizes line points so that the start point is at [0,0]. This is
82
90
  * expected in various parts of the codebase.
@@ -107,10 +115,19 @@ export declare class LinearElementEditor {
107
115
  } | undefined;
108
116
  private static _updatePoints;
109
117
  private static _getShiftLockedDelta;
118
+ /**
119
+ * The point a bound text label is centered on — the middle of the linear
120
+ * element, whether that's an actual point or the midpoint of the middle
121
+ * segment.
122
+ */
123
+ static getBoundTextElementCenter: (element: ExcalidrawLinearElement, elementsMap: ElementsMap) => GlobalPoint;
124
+ static handleBoundTextDragging(linearElementEditor: LinearElementEditor, scene: Scene, pointerX: number, pointerY: number): LinearElementEditor | null;
125
+ static getPointAtPathParameter(container: ExcalidrawLinearElement, pathParameter: number, elementsMap: ElementsMap): GlobalPoint | null;
110
126
  static getBoundTextElementPosition: (element: ExcalidrawLinearElement, boundTextElement: ExcalidrawTextElementWithContainer, elementsMap: ElementsMap) => {
111
127
  x: number;
112
128
  y: number;
113
129
  };
130
+ private static computeBoundTextElementPosition;
114
131
  static getMinMaxXYWithBoundText: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, elementBounds: Bounds, boundTextElement: ExcalidrawTextElementWithContainer) => [number, number, number, number, number, number];
115
132
  static getElementAbsoluteCoords: (element: ExcalidrawLinearElement, elementsMap: ElementsMap, includeBoundText?: boolean) => [number, number, number, number, number, number];
116
133
  static moveFixedSegment(linearElement: LinearElementEditor, index: number, x: number, y: number, scene: Scene): Pick<LinearElementEditor, "segmentMidPointHoveredCoords" | "initialState">;
@@ -16,6 +16,19 @@ export declare const newFrameElement: (opts: {
16
16
  export declare const newMagicFrameElement: (opts: {
17
17
  name?: string;
18
18
  } & ElementConstructorOpts) => NonDeleted<ExcalidrawMagicFrameElement>;
19
+ /**
20
+ * The point of the text box its alignment pins, as ratios of width/height.
21
+ *
22
+ * This is the point that stays put as the text grows — see the sides passed to
23
+ * `adjustXYWithRotation` in `getAdjustedDimensions`.
24
+ */
25
+ export declare const getTextAnchorRatios: (opts: {
26
+ textAlign: ExcalidrawTextElement["textAlign"];
27
+ verticalAlign: ExcalidrawTextElement["verticalAlign"];
28
+ }) => {
29
+ x: number;
30
+ y: number;
31
+ };
19
32
  export declare const newTextElement: (opts: {
20
33
  text: string;
21
34
  originalText?: string;
@@ -26,6 +39,7 @@ export declare const newTextElement: (opts: {
26
39
  containerId?: ExcalidrawTextContainer["id"] | null;
27
40
  lineHeight?: ExcalidrawTextElement["lineHeight"];
28
41
  autoResize?: ExcalidrawTextElement["autoResize"];
42
+ labelPosition?: ExcalidrawTextElement["labelPosition"];
29
43
  } & ElementConstructorOpts) => NonDeleted<ExcalidrawTextElement>;
30
44
  export declare const refreshTextDimensions: (textElement: ExcalidrawTextElement, container: ExcalidrawTextContainer | null, elementsMap: ElementsMap, text?: string) => {
31
45
  x: number;
@@ -38,6 +52,7 @@ export declare const newFreeDrawElement: (opts: {
38
52
  type: "freedraw";
39
53
  points?: ExcalidrawFreeDrawElement["points"];
40
54
  simulatePressure: boolean;
55
+ strokeOptions?: ExcalidrawFreeDrawElement["strokeOptions"];
41
56
  pressures?: ExcalidrawFreeDrawElement["pressures"];
42
57
  } & ElementConstructorOpts) => NonDeleted<ExcalidrawFreeDrawElement>;
43
58
  export declare const newLinearElement: (opts: {
@@ -9,14 +9,11 @@ export interface ExcalidrawElementWithCanvas {
9
9
  canvas: HTMLCanvasElement;
10
10
  theme: AppState["theme"];
11
11
  scale: number;
12
- angle: number;
13
12
  zoomValue: AppState["zoom"]["value"];
14
13
  canvasOffsetX: number;
15
14
  canvasOffsetY: number;
16
- boundTextElementVersion: number | null;
17
15
  imageCrop: ExcalidrawImageElement["crop"] | null;
18
16
  containingFrameOpacity: number;
19
- boundTextCanvas: HTMLCanvasElement;
20
17
  }
21
18
  export declare const DEFAULT_LINK_SIZE = 14;
22
19
  export declare const elementWithCanvasCache: WeakMap<ExcalidrawElement, ExcalidrawElementWithCanvas>;
@@ -3,7 +3,7 @@ import type { PointerDownState } from "@excalidraw/excalidraw/types";
3
3
  import type { Scene } from "./Scene";
4
4
  import type { BoundingBox } from "./bounds";
5
5
  import type { MaybeTransformHandleType, TransformHandleDirection } from "./transformHandles";
6
- import type { ExcalidrawLinearElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, NonDeleted, ExcalidrawElement, ElementsMap } from "./types";
6
+ import type { ExcalidrawLinearElement, ExcalidrawTextElement, NonDeletedExcalidrawElement, NonDeleted, ElementsMap } from "./types";
7
7
  export declare const transformElements: (originalElements: PointerDownState["originalElements"], transformHandleType: MaybeTransformHandleType, selectedElements: readonly NonDeletedExcalidrawElement[], scene: Scene, shouldRotateWithDiscreteAngle: boolean, shouldResizeFromCenter: boolean, shouldMaintainAspectRatio: boolean, pointerX: number, pointerY: number, centerX: number, centerY: number) => boolean;
8
8
  export declare const rescalePointsInElement: (element: NonDeletedExcalidrawElement, width: number, height: number, normalizePoints: boolean) => {
9
9
  points: LocalPoint[];
@@ -16,7 +16,7 @@ export declare const measureFontSizeFromWidth: (element: NonDeleted<ExcalidrawTe
16
16
  export declare const resizeSingleTextElement: (origElement: NonDeleted<ExcalidrawTextElement>, element: NonDeleted<ExcalidrawTextElement>, scene: Scene, transformHandleType: TransformHandleDirection, shouldResizeFromCenter: boolean, nextWidth: number, nextHeight: number) => void;
17
17
  export declare const getResizeOffsetXY: (transformHandleType: MaybeTransformHandleType, selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap, x: number, y: number) => [number, number];
18
18
  export declare const getResizeArrowDirection: (transformHandleType: MaybeTransformHandleType, element: NonDeleted<ExcalidrawLinearElement>) => "origin" | "end";
19
- export declare const resizeSingleElement: (nextWidth: number, nextHeight: number, latestElement: ExcalidrawElement, origElement: ExcalidrawElement, originalElementsMap: ElementsMap, scene: Scene, handleDirection: TransformHandleDirection, { shouldInformMutation, shouldMaintainAspectRatio, shouldResizeFromCenter, }?: {
19
+ export declare const resizeSingleElement: (nextWidth: number, nextHeight: number, latestElement: NonDeletedExcalidrawElement, origElement: NonDeletedExcalidrawElement, originalElementsMap: ElementsMap, scene: Scene, handleDirection: TransformHandleDirection, { shouldInformMutation, shouldMaintainAspectRatio, shouldResizeFromCenter, }?: {
20
20
  shouldMaintainAspectRatio?: boolean;
21
21
  shouldResizeFromCenter?: boolean;
22
22
  shouldInformMutation?: boolean;
@@ -1,6 +1,6 @@
1
- import type { AppState, InteractiveCanvasAppState } from "@excalidraw/excalidraw/types";
1
+ import type { AppState, BoxSelectionMode, InteractiveCanvasAppState } from "@excalidraw/excalidraw/types";
2
2
  import { LinearElementEditor } from "./linearElementEditor";
3
- import type { ElementsMap, ElementsMapOrArray, ExcalidrawElement, NonDeletedExcalidrawElement } from "./types";
3
+ import type { ElementsMap, ElementsMapOrArray, ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement } from "./types";
4
4
  /**
5
5
  * Frames and their containing elements are not to be selected at the same time.
6
6
  * Given an array of selected elements, if there are frames and their containing elements
@@ -8,8 +8,8 @@ import type { ElementsMap, ElementsMapOrArray, ExcalidrawElement, NonDeletedExca
8
8
  * @param selectedElements
9
9
  */
10
10
  export declare const excludeElementsInFramesFromSelection: <T extends ExcalidrawElement>(selectedElements: readonly T[]) => T[];
11
- export declare const getElementsWithinSelection: (elements: readonly NonDeletedExcalidrawElement[], selection: NonDeletedExcalidrawElement, elementsMap: ElementsMap, excludeElementsInFrames?: boolean) => NonDeletedExcalidrawElement[];
12
- export declare const getVisibleAndNonSelectedElements: (elements: readonly NonDeletedExcalidrawElement[], selectedElements: readonly NonDeletedExcalidrawElement[], appState: AppState, elementsMap: ElementsMap) => NonDeletedExcalidrawElement[];
11
+ export declare const getElementsWithinSelection: <T extends ExcalidrawElement>(elements: readonly T[], selection: ExcalidrawElement, elementsMap: ElementsMap, excludeElementsInFrames?: boolean, boxSelectionMode?: BoxSelectionMode) => T[];
12
+ export declare const getVisibleAndNonSelectedElements: <T extends NonDeletedExcalidrawElement>(elements: readonly T[], selectedElements: readonly ExcalidrawElement[], appState: AppState, elementsMap: ElementsMap) => T[];
13
13
  export declare const isSomeElementSelected: {
14
14
  (elements: readonly NonDeletedExcalidrawElement[], appState: Pick<AppState, "selectedElementIds">): boolean;
15
15
  clearCache(): void;
@@ -17,8 +17,8 @@ export declare const isSomeElementSelected: {
17
17
  export declare const getSelectedElements: (elements: ElementsMapOrArray, appState: Pick<InteractiveCanvasAppState, "selectedElementIds">, opts?: {
18
18
  includeBoundTextElement?: boolean;
19
19
  includeElementsInFrames?: boolean;
20
- }) => ExcalidrawElement[];
21
- export declare const getTargetElements: (elements: ElementsMapOrArray, appState: Pick<AppState, "selectedElementIds" | "editingTextElement" | "newElement">) => ExcalidrawElement[];
20
+ }) => NonDeletedExcalidrawElement[];
21
+ export declare const getTargetElements: (elements: ElementsMapOrArray, appState: Pick<AppState, "selectedElementIds" | "editingTextElement" | "newElement" | "activeTool">) => NonDeletedExcalidrawElement[] | import("./types").ExcalidrawTextElement[];
22
22
  /**
23
23
  * returns prevState's selectedElementids if no change from previous, so as to
24
24
  * retain reference identity for memoization
@@ -26,9 +26,13 @@ export declare const getTargetElements: (elements: ElementsMapOrArray, appState:
26
26
  export declare const makeNextSelectedElementIds: (nextSelectedElementIds: AppState["selectedElementIds"], prevState: Pick<AppState, "selectedElementIds">) => Readonly<{
27
27
  [id: string]: true;
28
28
  }>;
29
- export declare const getSelectionStateForElements: (targetElements: readonly ExcalidrawElement[], allElements: readonly NonDeletedExcalidrawElement[], appState: AppState) => {
29
+ export declare const getSelectionStateForElements: (targetElements: readonly NonDeletedExcalidrawElement[], allElements: readonly NonDeletedExcalidrawElement[], appState: AppState) => {
30
30
  editingGroupId: AppState["editingGroupId"];
31
31
  selectedElementIds: AppState["selectedElementIds"];
32
32
  selectedGroupIds: AppState["selectedGroupIds"];
33
33
  selectedLinearElement: LinearElementEditor | null;
34
34
  };
35
+ /**
36
+ * Returns editing or single-selected text element, if any.
37
+ */
38
+ export declare const getActiveTextElement: (selectedElements: readonly NonDeleted<ExcalidrawElement>[], appState: Pick<AppState, "editingTextElement">) => import("./types").ExcalidrawTextElement | null;
@@ -27,7 +27,7 @@ export declare class ShapeCache {
27
27
  } | null) => ((T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] | undefined : ElementShape | undefined) & {}) | (T["type"] extends keyof ElementShapes ? ElementShapes[T["type"]] : Drawable | null);
28
28
  }
29
29
  export declare const generateRoughOptions: (element: ExcalidrawElement, continuousPath?: boolean, isDarkMode?: boolean) => Options;
30
- export declare const generateLinearCollisionShape: (element: ExcalidrawLinearElement | ExcalidrawFreeDrawElement) => {
30
+ export declare const generateLinearCollisionShape: (element: ExcalidrawLinearElement | ExcalidrawFreeDrawElement, elementsMap: ElementsMap) => {
31
31
  op: string;
32
32
  data: number[];
33
33
  }[];
@@ -41,3 +41,15 @@ export declare const toggleLinePolygonState: (element: ExcalidrawLineElement, ne
41
41
  points: ExcalidrawLineElement["points"];
42
42
  } | null;
43
43
  export declare const getFreedrawOutlinePoints: (element: ExcalidrawFreeDrawElement) => [number, number][];
44
+ /**
45
+ * The streamline-smoothed centerline the freedraw stroke is rendered
46
+ * around, in element-local coordinates. Boundary-sensitive consumers (e.g.
47
+ * bucket fill) should use this instead of `element.points`: raw input
48
+ * points can sit 20px+ apart and the rendered stroke is smoothed between
49
+ * them, so raw chords visibly deviate from what's on screen.
50
+ *
51
+ * Constant-width ("laser geometry") strokes technically smooth via
52
+ * `LaserPointer` instead; the perfect-freehand centerline with the same
53
+ * `streamline` is a close approximation the stroke width hides.
54
+ */
55
+ export declare const getFreedrawStrokeCenterPoints: (element: ExcalidrawFreeDrawElement) => [number, number][];
@@ -1,2 +1,12 @@
1
1
  import type { ExcalidrawElement } from "./types";
2
+ /**
3
+ * In theory, when we have text elements bound to a container, they
4
+ * should be right after the container element in the elements array.
5
+ * However, this is not guaranteed due to old and potential future bugs.
6
+ *
7
+ * This function sorts containers and their bound texts together. It prefers
8
+ * original z-index of container (i.e. it moves bound text elements after
9
+ * containers).
10
+ */
11
+ export declare const normalizeBoundElementsOrder: <T extends ExcalidrawElement>(elements: readonly T[]) => readonly T[];
2
12
  export declare const normalizeElementOrder: (elements: readonly ExcalidrawElement[]) => readonly ExcalidrawElement[];
@@ -1,23 +1,26 @@
1
1
  import { type Radians } from "@excalidraw/math";
2
- import type { AppState } from "@excalidraw/excalidraw/types";
3
2
  import type { ExtractSetType } from "@excalidraw/common/utility-types";
4
3
  import type { Scene } from "./Scene";
5
4
  import type { MaybeTransformHandleType } from "./transformHandles";
6
- import type { ElementsMap, ExcalidrawElement, ExcalidrawElementType, ExcalidrawTextContainer, ExcalidrawTextElement, ExcalidrawTextElementWithContainer, NonDeletedExcalidrawElement } from "./types";
5
+ import type { ElementsMap, ExcalidrawElement, ExcalidrawElementType, ExcalidrawTextContainer, ExcalidrawTextElement, ExcalidrawTextElementWithContainer, NonDeleted } from "./types";
7
6
  export declare const redrawTextBoundingBox: (textElement: ExcalidrawTextElement, container: ExcalidrawElement | null, scene: Scene) => void;
8
- export declare const handleBindTextResize: (container: NonDeletedExcalidrawElement, scene: Scene, transformHandleType: MaybeTransformHandleType, shouldMaintainAspectRatio?: boolean) => void;
7
+ export declare const handleBindTextResize: (container: ExcalidrawElement, scene: Scene, transformHandleType: MaybeTransformHandleType, shouldMaintainAspectRatio?: boolean, shouldResizeFromCenter?: boolean) => void;
9
8
  export declare const computeBoundTextPosition: (container: ExcalidrawElement, boundTextElement: ExcalidrawTextElementWithContainer, elementsMap: ElementsMap) => {
10
9
  x: number;
11
10
  y: number;
12
11
  };
13
12
  export declare const getBoundTextElementId: (container: ExcalidrawElement | null) => string | null;
14
- export declare const getBoundTextElement: (element: ExcalidrawElement | null, elementsMap: ElementsMap) => ExcalidrawTextElementWithContainer | null;
15
- export declare const getContainerElement: (element: ExcalidrawTextElement | null, elementsMap: ElementsMap) => ExcalidrawTextContainer | null;
16
- export declare const getContainerCenter: (container: ExcalidrawElement, appState: AppState, elementsMap: ElementsMap) => {
13
+ export declare const getBoundTextElement: (element: ExcalidrawElement | null, elementsMap: ElementsMap) => NonDeleted<ExcalidrawTextElementWithContainer> | null;
14
+ export declare const getContainerElement: <T extends ExcalidrawTextElement, R extends ExcalidrawTextContainer>(element: T | null, elementsMap: ElementsMap) => R | null;
15
+ /**
16
+ * The point a text bound to this container centers on — and, for arrows, the
17
+ * point the text tool snaps a new label to.
18
+ */
19
+ export declare const getContainerCenter: (container: ExcalidrawElement, elementsMap: ElementsMap) => {
17
20
  x: number;
18
21
  y: number;
19
22
  };
20
- export declare const getContainerCoords: (container: NonDeletedExcalidrawElement) => {
23
+ export declare const getContainerCoords: (container: ExcalidrawElement) => {
21
24
  x: number;
22
25
  y: number;
23
26
  };
@@ -26,15 +29,16 @@ export declare const getBoundTextElementPosition: (container: ExcalidrawElement,
26
29
  x: number;
27
30
  y: number;
28
31
  } | undefined;
29
- export declare const shouldAllowVerticalAlign: (selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap) => boolean;
30
- export declare const suppportsHorizontalAlign: (selectedElements: NonDeletedExcalidrawElement[], elementsMap: ElementsMap) => boolean;
32
+ export declare const shouldAllowVerticalAlign: (selectedElements: readonly ExcalidrawElement[], elementsMap: ElementsMap) => boolean;
33
+ export declare const suppportsHorizontalAlign: (selectedElements: readonly ExcalidrawElement[], elementsMap: ElementsMap) => boolean;
31
34
  declare const VALID_CONTAINER_TYPES: Set<string>;
32
35
  export declare const isValidTextContainer: (element: {
33
36
  type: ExcalidrawElementType;
34
- }) => boolean;
37
+ }) => element is ExcalidrawTextContainer;
35
38
  export declare const computeContainerDimensionForBoundText: (dimension: number, containerType: ExtractSetType<typeof VALID_CONTAINER_TYPES>) => number;
36
39
  export declare const getBoundTextMaxWidth: (container: ExcalidrawElement, boundTextElement: ExcalidrawTextElement | null) => number;
37
40
  export declare const getBoundTextMaxHeight: (container: ExcalidrawElement, boundTextElement: ExcalidrawTextElementWithContainer) => number;
38
41
  /** retrieves text from text elements and concatenates to a single string */
39
42
  export declare const getTextFromElements: (elements: readonly ExcalidrawElement[], separator?: string) => string;
43
+ export declare const DEFAULT_BOUND_TEXT_LABEL_POSITION = 0.5;
40
44
  export {};
@@ -5,9 +5,35 @@ import type { FontString } from "./types";
5
5
  export declare const containsCJK: (text: string) => boolean;
6
6
  /**
7
7
  * Breaks the line into the tokens based on the found line break opporutnities.
8
+ *
9
+ * Note: tokenization normalizes to NFC first so decomposed graphemes are treated as
10
+ * their composed variants for wrapping. Any code that needs exact source offsets should
11
+ * keep in mind that this assumes the input text is already NFC-normalized.
8
12
  */
9
13
  export declare const parseTokens: (line: string) => string[];
10
14
  /**
11
15
  * Wraps the original text into the lines based on the given width.
16
+ *
17
+ * This is a convenience adapter over `getWrappedTextLines()` for call sites
18
+ * that only need the rendered wrapped string and not the source offsets.
12
19
  */
13
20
  export declare const wrapText: (text: string, font: FontString, maxWidth: number) => string;
21
+ /**
22
+ * A single rendered visual line produced from the original text.
23
+ *
24
+ * `start` and `end` are end-exclusive code-unit offsets into the original text, and do
25
+ * not include synthetic soft line breaks inserted by this module. If trailing whitespace
26
+ * was trimmed away at a wrap boundary, `end` points to the last rendered character.
27
+ */
28
+ export type WrappedTextLine = {
29
+ text: string;
30
+ start: number;
31
+ end: number;
32
+ };
33
+ /**
34
+ * Returns the rendered visual lines together with their source offsets.
35
+ *
36
+ * This is the source-of-truth wrapping pipeline for callers that need more than the
37
+ * final wrapped string, for example caret placement or future editor/rich-text mapping.
38
+ */
39
+ export declare const getWrappedTextLines: (text: string, font: FontString, maxWidth: number) => WrappedTextLine[];
@@ -1,6 +1,6 @@
1
1
  import type { MarkOptional } from "@excalidraw/common/utility-types";
2
2
  import { type ElementConstructorOpts } from "./newElement";
3
- import type { ExcalidrawBindableElement, ExcalidrawElement, ExcalidrawFrameElement, ExcalidrawFreeDrawElement, ExcalidrawGenericElement, ExcalidrawIframeLikeElement, ExcalidrawImageElement, ExcalidrawLinearElement, ExcalidrawMagicFrameElement, ExcalidrawSelectionElement, ExcalidrawTextElement, FileId, FontFamilyValues, TextAlign, VerticalAlign } from "./types";
3
+ import type { ExcalidrawBindableElement, ExcalidrawElement, ExcalidrawFrameElement, ExcalidrawFreeDrawElement, ExcalidrawGenericElement, ExcalidrawIframeLikeElement, ExcalidrawImageElement, ExcalidrawLinearElement, ExcalidrawMagicFrameElement, ExcalidrawSelectionElement, ExcalidrawTextElement, FileId, FontFamilyValues, NonDeletedExcalidrawElement, Ordered, TextAlign, VerticalAlign } from "./types";
4
4
  export type ValidLinearElement = {
5
5
  type: "arrow" | "line";
6
6
  x: number;
@@ -78,4 +78,4 @@ export type ExcalidrawElementSkeleton = Extract<Exclude<ExcalidrawElement, Excal
78
78
  } & Partial<ExcalidrawMagicFrameElement>);
79
79
  export declare const convertToExcalidrawElements: (elementsSkeleton: ExcalidrawElementSkeleton[] | null, opts?: {
80
80
  regenerateIds: boolean;
81
- }) => import("./types").OrderedExcalidrawElement[];
81
+ }) => Ordered<NonDeletedExcalidrawElement>[];