@excalidraw/excalidraw 0.18.0-a30e1b2 → 0.18.0-a8acc82

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 (175) hide show
  1. package/dist/dev/chunk-6MX365WZ.js +5666 -0
  2. package/dist/dev/chunk-6MX365WZ.js.map +7 -0
  3. package/dist/dev/chunk-CP5DND7P.js +7 -0
  4. package/dist/dev/chunk-CP5DND7P.js.map +7 -0
  5. package/dist/dev/{chunk-CARD3WJZ.js → chunk-QF5FRM6O.js} +7 -2
  6. package/dist/dev/chunk-QF5FRM6O.js.map +7 -0
  7. package/dist/dev/data/{image-AYLHSOBV.js → image-GQCFJKGM.js} +3 -3
  8. package/dist/dev/index.css +187 -21
  9. package/dist/dev/index.css.map +3 -3
  10. package/dist/dev/index.js +15073 -16288
  11. package/dist/dev/index.js.map +4 -4
  12. package/dist/dev/locales/{en-E3O5XSXJ.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-A66AFZZU.js +7 -0
  16. package/dist/prod/chunk-I4UNSFV6.js +12 -0
  17. package/dist/prod/chunk-R2M7VUMD.js +4 -0
  18. package/dist/prod/data/image-JWK7QZ22.js +1 -0
  19. package/dist/prod/index.css +1 -1
  20. package/dist/prod/index.js +27 -20
  21. package/dist/prod/locales/{en-44IKVKYT.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 +38 -7
  25. package/dist/types/common/src/utils.d.ts +7 -5
  26. package/dist/types/element/src/Scene.d.ts +10 -6
  27. package/dist/types/element/src/align.d.ts +3 -2
  28. package/dist/types/element/src/binding.d.ts +11 -8
  29. package/dist/types/element/src/bounds.d.ts +12 -4
  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 +41 -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/dragElements.d.ts +1 -1
  36. package/dist/types/element/src/flowchart.d.ts +1 -1
  37. package/dist/types/element/src/fractionalIndex.d.ts +8 -2
  38. package/dist/types/element/src/frame.d.ts +2 -2
  39. package/dist/types/element/src/groups.d.ts +1 -0
  40. package/dist/types/element/src/index.d.ts +42 -0
  41. package/dist/types/element/src/linearElementEditor.d.ts +15 -24
  42. package/dist/types/element/src/mutateElement.d.ts +1 -1
  43. package/dist/types/element/src/newElement.d.ts +3 -2
  44. package/dist/types/element/src/positionElementsOnGrid.d.ts +2 -0
  45. package/dist/types/element/src/renderElement.d.ts +4 -1
  46. package/dist/types/element/src/resizeElements.d.ts +2 -1
  47. package/dist/types/element/src/selection.d.ts +0 -5
  48. package/dist/types/element/src/shape.d.ts +42 -0
  49. package/dist/types/element/src/sizeHelpers.d.ts +2 -1
  50. package/dist/types/element/src/store.d.ts +19 -9
  51. package/dist/types/element/src/textElement.d.ts +2 -2
  52. package/dist/types/element/src/transformHandles.d.ts +2 -2
  53. package/dist/types/element/src/typeChecks.d.ts +16 -1
  54. package/dist/types/element/src/types.d.ts +10 -4
  55. package/dist/types/element/src/utils.d.ts +16 -6
  56. package/dist/types/element/src/zindex.d.ts +3 -3
  57. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +24 -15
  58. package/dist/types/excalidraw/actions/actionAlign.d.ts +8 -8
  59. package/dist/types/excalidraw/actions/actionBoundText.d.ts +16 -10
  60. package/dist/types/excalidraw/actions/actionCanvas.d.ts +134 -94
  61. package/dist/types/excalidraw/actions/actionClipboard.d.ts +53 -33
  62. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +8 -5
  63. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +27 -17
  64. package/dist/types/excalidraw/actions/actionDistribute.d.ts +4 -4
  65. package/dist/types/excalidraw/actions/actionDuplicateSelection.d.ts +2 -2
  66. package/dist/types/excalidraw/actions/actionElementLink.d.ts +8 -5
  67. package/dist/types/excalidraw/actions/actionElementLock.d.ts +31 -26
  68. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +8 -5
  69. package/dist/types/excalidraw/actions/actionExport.d.ts +94 -67
  70. package/dist/types/excalidraw/actions/actionFinalize.d.ts +66 -19
  71. package/dist/types/excalidraw/actions/actionFlip.d.ts +4 -4
  72. package/dist/types/excalidraw/actions/actionFrame.d.ts +81 -69
  73. package/dist/types/excalidraw/actions/actionGroup.d.ts +20 -14
  74. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +534 -7
  75. package/dist/types/excalidraw/actions/actionLink.d.ts +10 -7
  76. package/dist/types/excalidraw/actions/actionMenu.d.ts +26 -17
  77. package/dist/types/excalidraw/actions/actionNavigate.d.ts +16 -10
  78. package/dist/types/excalidraw/actions/actionProperties.d.ts +145 -83
  79. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +10 -7
  80. package/dist/types/excalidraw/actions/actionStyles.d.ts +12 -9
  81. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +10 -7
  82. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +10 -7
  83. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +10 -7
  84. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +10 -7
  85. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +10 -7
  86. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +10 -7
  87. package/dist/types/excalidraw/actions/actionZindex.d.ts +10 -10
  88. package/dist/types/excalidraw/actions/index.d.ts +1 -1
  89. package/dist/types/excalidraw/actions/types.d.ts +3 -2
  90. package/dist/types/excalidraw/appState.d.ts +20 -10
  91. package/dist/types/excalidraw/clipboard.d.ts +64 -1
  92. package/dist/types/excalidraw/components/Actions.d.ts +8 -5
  93. package/dist/types/excalidraw/components/App.d.ts +22 -21
  94. package/dist/types/excalidraw/components/ButtonIcon.d.ts +1 -0
  95. package/dist/types/excalidraw/components/ColorPicker/ColorInput.d.ts +2 -1
  96. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +7 -2
  97. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +1 -1
  98. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +2 -3
  99. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +2 -3
  100. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +2 -2
  101. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +1 -1
  102. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
  103. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +1 -1
  104. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -28
  105. package/dist/types/excalidraw/components/ElementLinkDialog.d.ts +1 -1
  106. package/dist/types/excalidraw/components/Ellipsify.d.ts +4 -0
  107. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +2 -1
  108. package/dist/types/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +2 -1
  109. package/dist/types/excalidraw/components/PropertiesPopover.d.ts +1 -0
  110. package/dist/types/excalidraw/components/{ButtonIconSelect.d.ts → RadioSelection.d.ts} +1 -1
  111. package/dist/types/excalidraw/components/Range.d.ts +3 -3
  112. package/dist/types/excalidraw/components/Stats/Angle.d.ts +1 -1
  113. package/dist/types/excalidraw/components/Stats/CanvasGrid.d.ts +1 -1
  114. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +1 -1
  115. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +12 -2
  116. package/dist/types/excalidraw/components/Stats/FontSize.d.ts +1 -1
  117. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +1 -1
  118. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +1 -1
  119. package/dist/types/excalidraw/components/Stats/MultiFontSize.d.ts +1 -1
  120. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +1 -1
  121. package/dist/types/excalidraw/components/Stats/Position.d.ts +1 -1
  122. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  123. package/dist/types/excalidraw/components/UnlockPopup.d.ts +8 -0
  124. package/dist/types/excalidraw/components/hyperlink/Hyperlink.d.ts +1 -1
  125. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -1
  126. package/dist/types/excalidraw/components/icons.d.ts +9 -0
  127. package/dist/types/excalidraw/components/shapes.d.ts +129 -1
  128. package/dist/types/excalidraw/data/blob.d.ts +3 -7
  129. package/dist/types/excalidraw/data/reconcile.d.ts +1 -0
  130. package/dist/types/excalidraw/data/restore.d.ts +6 -1
  131. package/dist/types/excalidraw/data/transform.d.ts +1 -1
  132. package/dist/types/excalidraw/data/types.d.ts +4 -1
  133. package/dist/types/excalidraw/eraser/index.d.ts +0 -2
  134. package/dist/types/excalidraw/fonts/Fonts.d.ts +1 -1
  135. package/dist/types/excalidraw/history.d.ts +21 -5
  136. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +14 -0
  137. package/dist/types/excalidraw/index.d.ts +11 -10
  138. package/dist/types/excalidraw/lasso/index.d.ts +1 -0
  139. package/dist/types/excalidraw/lasso/utils.d.ts +2 -1
  140. package/dist/types/excalidraw/renderer/helpers.d.ts +4 -4
  141. package/dist/types/excalidraw/renderer/staticScene.d.ts +4 -1
  142. package/dist/types/excalidraw/scene/Renderer.d.ts +1 -2
  143. package/dist/types/excalidraw/scene/index.d.ts +2 -2
  144. package/dist/types/excalidraw/snapping.d.ts +2 -2
  145. package/dist/types/excalidraw/types.d.ts +24 -13
  146. package/dist/types/math/src/angle.d.ts +2 -0
  147. package/dist/types/math/src/constants.d.ts +3 -0
  148. package/dist/types/math/src/curve.d.ts +32 -0
  149. package/dist/types/math/src/index.d.ts +1 -0
  150. package/dist/types/math/src/point.d.ts +1 -1
  151. package/dist/types/math/src/rectangle.d.ts +2 -0
  152. package/dist/types/math/src/segment.d.ts +1 -0
  153. package/dist/types/math/src/vector.d.ts +4 -2
  154. package/dist/types/utils/src/bbox.d.ts +1 -1
  155. package/dist/types/utils/src/index.d.ts +1 -1
  156. package/dist/types/utils/src/withinBounds.d.ts +1 -1
  157. package/history.ts +108 -45
  158. package/package.json +13 -10
  159. package/dist/dev/chunk-CARD3WJZ.js.map +0 -7
  160. package/dist/dev/chunk-ETWEPOFC.js +0 -18701
  161. package/dist/dev/chunk-ETWEPOFC.js.map +0 -7
  162. package/dist/dev/chunk-RS23HYC4.js +0 -7
  163. package/dist/dev/chunk-RS23HYC4.js.map +0 -7
  164. package/dist/prod/chunk-6BSJPDKJ.js +0 -33
  165. package/dist/prod/chunk-FGHASORR.js +0 -12
  166. package/dist/prod/chunk-SBKTMZM7.js +0 -7
  167. package/dist/prod/data/image-VAYKYPXV.js +0 -1
  168. package/dist/types/element/src/Shape.d.ts +0 -17
  169. package/dist/types/element/src/ShapeCache.d.ts +0 -25
  170. package/dist/types/element/src/shapes.d.ts +0 -23
  171. package/dist/types/excalidraw/components/ButtonSelect.d.ts +0 -9
  172. package/dist/types/excalidraw/visualdebug.d.ts +0 -41
  173. package/dist/types/utils/src/collision.d.ts +0 -8
  174. /package/dist/dev/data/{image-AYLHSOBV.js.map → image-GQCFJKGM.js.map} +0 -0
  175. /package/dist/dev/locales/{en-E3O5XSXJ.js.map → en-SMAPCEOQ.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import type { IMAGE_MIME_TYPES, UserIdleState, throttleRAF, MIME_TYPES } from "@excalidraw/common";
2
- import type { SuggestedBinding } from "@excalidraw/element/binding";
3
- import type { LinearElementEditor } from "@excalidraw/element/linearElementEditor";
4
- import type { MaybeTransformHandleType } from "@excalidraw/element/transformHandles";
5
- import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, Arrowhead, ChartType, FontFamilyValues, FileId, ExcalidrawImageElement, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement } from "@excalidraw/element/types";
2
+ import type { SuggestedBinding } from "@excalidraw/element";
3
+ import type { LinearElementEditor } from "@excalidraw/element";
4
+ import type { MaybeTransformHandleType } from "@excalidraw/element";
5
+ import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, Arrowhead, ChartType, FontFamilyValues, FileId, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement } from "@excalidraw/element/types";
6
6
  import type { Merge, MaybePromise, ValueOf, MakeBrand } from "@excalidraw/common/utility-types";
7
- import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement } from "@excalidraw/element/store";
7
+ import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement } from "@excalidraw/element";
8
8
  import type { Action } from "./actions/types";
9
9
  import type { Spreadsheet } from "./charts";
10
10
  import type { ClipboardData } from "./clipboard";
@@ -113,7 +113,6 @@ type _CommonCanvasAppState = {
113
113
  offsetLeft: AppState["offsetLeft"];
114
114
  offsetTop: AppState["offsetTop"];
115
115
  theme: AppState["theme"];
116
- pendingImageElementId: AppState["pendingImageElementId"];
117
116
  };
118
117
  export type StaticCanvasAppState = Readonly<_CommonCanvasAppState & {
119
118
  shouldCacheIgnoreZoom: AppState["shouldCacheIgnoreZoom"];
@@ -130,7 +129,6 @@ export type StaticCanvasAppState = Readonly<_CommonCanvasAppState & {
130
129
  }>;
131
130
  export type InteractiveCanvasAppState = Readonly<_CommonCanvasAppState & {
132
131
  activeEmbeddable: AppState["activeEmbeddable"];
133
- editingLinearElement: AppState["editingLinearElement"];
134
132
  selectionElement: AppState["selectionElement"];
135
133
  selectedGroupIds: AppState["selectedGroupIds"];
136
134
  selectedLinearElement: AppState["selectedLinearElement"];
@@ -146,6 +144,7 @@ export type InteractiveCanvasAppState = Readonly<_CommonCanvasAppState & {
146
144
  isCropping: AppState["isCropping"];
147
145
  croppingElementId: AppState["croppingElementId"];
148
146
  searchMatches: AppState["searchMatches"];
147
+ activeLockedId: AppState["activeLockedId"];
149
148
  }>;
150
149
  export type ObservedAppState = ObservedStandaloneAppState & ObservedElementsAppState;
151
150
  export type ObservedStandaloneAppState = {
@@ -156,9 +155,13 @@ export type ObservedElementsAppState = {
156
155
  editingGroupId: AppState["editingGroupId"];
157
156
  selectedElementIds: AppState["selectedElementIds"];
158
157
  selectedGroupIds: AppState["selectedGroupIds"];
159
- editingLinearElementId: LinearElementEditor["elementId"] | null;
160
- selectedLinearElementId: LinearElementEditor["elementId"] | null;
158
+ selectedLinearElement: {
159
+ elementId: LinearElementEditor["elementId"];
160
+ isEditing: boolean;
161
+ } | null;
161
162
  croppingElementId: AppState["croppingElementId"];
163
+ lockedMultiSelections: AppState["lockedMultiSelections"];
164
+ activeLockedId: AppState["activeLockedId"];
162
165
  };
163
166
  export interface AppState {
164
167
  contextMenu: {
@@ -209,7 +212,6 @@ export interface AppState {
209
212
  * set when a new text is created or when an existing text is being edited
210
213
  */
211
214
  editingTextElement: NonDeletedExcalidrawElement | null;
212
- editingLinearElement: LinearElementEditor | null;
213
215
  activeTool: {
214
216
  /**
215
217
  * indicates a previous tool we should revert back to if we deselect the
@@ -250,7 +252,7 @@ export interface AppState {
250
252
  isRotating: boolean;
251
253
  zoom: Zoom;
252
254
  openMenu: "canvas" | "shape" | null;
253
- openPopup: "canvasBackground" | "elementBackground" | "elementStroke" | "fontFamily" | null;
255
+ openPopup: "canvasBackground" | "elementBackground" | "elementStroke" | "fontFamily" | "compactTextProperties" | "compactStrokeStyles" | "compactOtherProperties" | "compactArrowProperties" | null;
254
256
  openSidebar: {
255
257
  name: SidebarName;
256
258
  tab?: SidebarTabName;
@@ -324,8 +326,6 @@ export interface AppState {
324
326
  shown: true;
325
327
  data: Spreadsheet;
326
328
  };
327
- /** imageElement waiting to be placed on canvas */
328
- pendingImageElementId: ExcalidrawImageElement["id"] | null;
329
329
  showHyperlinkPopup: false | "info" | "editor";
330
330
  selectedLinearElement: LinearElementEditor | null;
331
331
  snapLines: readonly SnapLine[];
@@ -346,6 +346,13 @@ export interface AppState {
346
346
  focusedId: ExcalidrawElement["id"] | null;
347
347
  matches: readonly SearchMatch[];
348
348
  }> | null;
349
+ /** the locked element/group that's active and shows unlock popup */
350
+ activeLockedId: string | null;
351
+ lockedMultiSelections: {
352
+ [groupId: string]: true;
353
+ };
354
+ /** properties sidebar mode - determines whether to show compact or complete sidebar */
355
+ stylesPanelMode: "compact" | "full";
349
356
  }
350
357
  export type SearchMatch = {
351
358
  id: string;
@@ -552,6 +559,7 @@ export type AppClassProperties = {
552
559
  excalidrawContainerValue: App["excalidrawContainerValue"];
553
560
  onPointerUpEmitter: App["onPointerUpEmitter"];
554
561
  updateEditorAtom: App["updateEditorAtom"];
562
+ defaultSelectionTool: "selection" | "lasso";
555
563
  };
556
564
  export type PointerDownState = Readonly<{
557
565
  origin: Readonly<{
@@ -599,6 +607,7 @@ export type PointerDownState = Readonly<{
599
607
  x: number;
600
608
  y: number;
601
609
  };
610
+ blockDragging: boolean;
602
611
  };
603
612
  eventListeners: {
604
613
  onMove: null | ReturnType<typeof throttleRAF>;
@@ -613,10 +622,12 @@ export type PointerDownState = Readonly<{
613
622
  export type UnsubscribeCallback = () => void;
614
623
  export interface ExcalidrawImperativeAPI {
615
624
  updateScene: InstanceType<typeof App>["updateScene"];
625
+ applyDeltas: InstanceType<typeof App>["applyDeltas"];
616
626
  mutateElement: InstanceType<typeof App>["mutateElement"];
617
627
  updateLibrary: InstanceType<typeof Library>["updateLibrary"];
618
628
  resetScene: InstanceType<typeof App>["resetScene"];
619
629
  getSceneElementsIncludingDeleted: InstanceType<typeof App>["getSceneElementsIncludingDeleted"];
630
+ getSceneElementsMapIncludingDeleted: InstanceType<typeof App>["getSceneElementsMapIncludingDeleted"];
620
631
  history: {
621
632
  clear: InstanceType<typeof App>["resetHistory"];
622
633
  };
@@ -15,3 +15,5 @@ export declare function radiansToDegrees(degrees: Radians): Degrees;
15
15
  * @returns TRUE if the provided angle is a right angle
16
16
  */
17
17
  export declare function isRightAngleRads(rads: Radians): boolean;
18
+ export declare function radiansBetweenAngles(a: Radians, min: Radians, max: Radians): boolean;
19
+ export declare function radiansDifference(a: Radians, b: Radians): Radians;
@@ -0,0 +1,3 @@
1
+ export declare const PRECISION = 0.0001;
2
+ export declare const LegendreGaussN24TValues: number[];
3
+ export declare const LegendreGaussN24CValues: number[];
@@ -40,3 +40,35 @@ export declare function curvePointDistance<Point extends GlobalPoint | LocalPoin
40
40
  */
41
41
  export declare function isCurve<P extends GlobalPoint | LocalPoint>(v: unknown): v is Curve<P>;
42
42
  export declare function curveTangent<Point extends GlobalPoint | LocalPoint>([p0, p1, p2, p3]: Curve<Point>, t: number): import("./types").Vector;
43
+ export declare function curveCatmullRomQuadraticApproxPoints(points: GlobalPoint[], tension?: number): [GlobalPoint, GlobalPoint][] | undefined;
44
+ export declare function curveCatmullRomCubicApproxPoints<Point extends GlobalPoint | LocalPoint>(points: Point[], tension?: number): Curve<Point>[] | undefined;
45
+ export declare function curveOffsetPoints([p0, p1, p2, p3]: Curve<GlobalPoint>, offset: number, steps?: number): GlobalPoint[];
46
+ export declare function offsetPointsForQuadraticBezier(p0: GlobalPoint, p1: GlobalPoint, p2: GlobalPoint, offsetDist: number, steps?: number): GlobalPoint[];
47
+ /**
48
+ * Implementation based on Legendre-Gauss quadrature for more accurate arc
49
+ * length calculation.
50
+ *
51
+ * Reference: https://pomax.github.io/bezierinfo/#arclength
52
+ *
53
+ * @param c The curve to calculate the length of
54
+ * @returns The approximated length of the curve
55
+ */
56
+ export declare function curveLength<P extends GlobalPoint | LocalPoint>(c: Curve<P>): number;
57
+ /**
58
+ * Calculates the curve length from t=0 to t=parameter using the same
59
+ * Legendre-Gauss quadrature method used in curveLength
60
+ *
61
+ * @param c The curve to calculate the partial length for
62
+ * @param t The parameter value (0 to 1) to calculate length up to
63
+ * @returns The length of the curve from beginning to parameter t
64
+ */
65
+ export declare function curveLengthAtParameter<P extends GlobalPoint | LocalPoint>(c: Curve<P>, t: number): number;
66
+ /**
67
+ * Calculates the point at a specific percentage of a curve's total length
68
+ * using binary search for improved efficiency and accuracy.
69
+ *
70
+ * @param c The curve to calculate point on
71
+ * @param percent A value between 0 and 1 representing the percentage of the curve's length
72
+ * @returns The point at the specified percentage of curve length
73
+ */
74
+ export declare function curvePointAtLength<P extends GlobalPoint | LocalPoint>(c: Curve<P>, percent: number): P;
@@ -1,5 +1,6 @@
1
1
  export * from "./angle";
2
2
  export * from "./curve";
3
+ export * from "./ellipse";
3
4
  export * from "./line";
4
5
  export * from "./point";
5
6
  export * from "./polygon";
@@ -43,7 +43,7 @@ export declare function isPoint(p: unknown): p is LocalPoint | GlobalPoint;
43
43
  * @param b Point The second point to compare
44
44
  * @returns TRUE if the points are sufficiently close to each other
45
45
  */
46
- export declare function pointsEqual<Point extends GlobalPoint | LocalPoint>(a: Point, b: Point): boolean;
46
+ export declare function pointsEqual<Point extends GlobalPoint | LocalPoint>(a: Point, b: Point, tolerance?: number): boolean;
47
47
  /**
48
48
  * Rotate a point by [angle] radians.
49
49
  *
@@ -1,3 +1,5 @@
1
1
  import type { GlobalPoint, LineSegment, LocalPoint, Rectangle } from "./types";
2
2
  export declare function rectangle<P extends GlobalPoint | LocalPoint>(topLeft: P, bottomRight: P): Rectangle<P>;
3
+ export declare function rectangleFromNumberSequence<Point extends LocalPoint | GlobalPoint>(minX: number, minY: number, maxX: number, maxY: number): Rectangle<Point>;
3
4
  export declare function rectangleIntersectLineSegment<Point extends LocalPoint | GlobalPoint>(r: Rectangle<Point>, l: LineSegment<Point>): Point[];
5
+ export declare function rectangleIntersectRectangle<Point extends LocalPoint | GlobalPoint>(rectangle1: Rectangle<Point>, rectangle2: Rectangle<Point>): boolean;
@@ -37,3 +37,4 @@ export declare const distanceToLineSegment: <Point extends GlobalPoint | LocalPo
37
37
  * @returns
38
38
  */
39
39
  export declare function lineSegmentIntersectionPoints<Point extends GlobalPoint | LocalPoint>(l: LineSegment<Point>, s: LineSegment<Point>, threshold?: number): Point | null;
40
+ export declare function lineSegmentsDistance<Point extends GlobalPoint | LocalPoint>(s1: LineSegment<Point>, s2: LineSegment<Point>): number;
@@ -12,9 +12,11 @@ export declare function vector(x: number, y: number, originX?: number, originY?:
12
12
  *
13
13
  * @param p The point to turn into a vector
14
14
  * @param origin The origin point in a given coordiante system
15
- * @returns The created vector from the point and the origin
15
+ * @param threshold The threshold to consider the vector as 'undefined'
16
+ * @param defaultValue The default value to return if the vector is 'undefined'
17
+ * @returns The created vector from the point and the origin or default
16
18
  */
17
- export declare function vectorFromPoint<Point extends GlobalPoint | LocalPoint>(p: Point, origin?: Point): Vector;
19
+ export declare function vectorFromPoint<Point extends GlobalPoint | LocalPoint>(p: Point, origin?: Point, threshold?: number, defaultValue?: Vector): Vector;
18
20
  /**
19
21
  * Cross product is a binary operation on two vectors in 2D space.
20
22
  * It results in a vector that is perpendicular to both vectors.
@@ -1,5 +1,5 @@
1
1
  import { type GlobalPoint, type LocalPoint } from "@excalidraw/math";
2
- import type { Bounds } from "@excalidraw/element/bounds";
2
+ import type { Bounds } from "@excalidraw/element";
3
3
  export type LineSegment<P extends LocalPoint | GlobalPoint> = [P, P];
4
4
  export declare function getBBox<P extends LocalPoint | GlobalPoint>(line: LineSegment<P>): Bounds;
5
5
  export declare function doBBoxesIntersect(a: Bounds, b: Bounds): boolean;
@@ -1,4 +1,4 @@
1
1
  export * from "./export";
2
2
  export * from "./withinBounds";
3
3
  export * from "./bbox";
4
- export { getCommonBounds } from "@excalidraw/element/bounds";
4
+ export { getCommonBounds } from "@excalidraw/element";
@@ -1,4 +1,4 @@
1
- import type { Bounds } from "@excalidraw/element/bounds";
1
+ import type { Bounds } from "@excalidraw/element";
2
2
  import type { ExcalidrawElement, NonDeletedExcalidrawElement } from "@excalidraw/element/types";
3
3
  type Element = NonDeletedExcalidrawElement;
4
4
  type Elements = readonly NonDeletedExcalidrawElement[];
package/history.ts CHANGED
@@ -4,14 +4,81 @@ import {
4
4
  CaptureUpdateAction,
5
5
  StoreChange,
6
6
  StoreDelta,
7
- type Store,
8
- } from "@excalidraw/element/store";
7
+ } from "@excalidraw/element";
8
+
9
+ import type { StoreSnapshot, Store } from "@excalidraw/element";
9
10
 
10
11
  import type { SceneElementsMap } from "@excalidraw/element/types";
11
12
 
12
13
  import type { AppState } from "./types";
13
14
 
14
- class HistoryEntry extends StoreDelta {}
15
+ export class HistoryDelta extends StoreDelta {
16
+ /**
17
+ * Apply the delta to the passed elements and appState, does not modify the snapshot.
18
+ */
19
+ public applyTo(
20
+ elements: SceneElementsMap,
21
+ appState: AppState,
22
+ snapshot: StoreSnapshot,
23
+ ): [SceneElementsMap, AppState, boolean] {
24
+ const [nextElements, elementsContainVisibleChange] = this.elements.applyTo(
25
+ elements,
26
+ // used to fallback into local snapshot in case we couldn't apply the delta
27
+ // due to a missing (force deleted) elements in the scene
28
+ snapshot.elements,
29
+ // we don't want to apply the `version` and `versionNonce` properties for history
30
+ // as we always need to end up with a new version due to collaboration,
31
+ // approaching each undo / redo as a new user action
32
+ {
33
+ excludedProperties: new Set(["version", "versionNonce"]),
34
+ },
35
+ );
36
+
37
+ const [nextAppState, appStateContainsVisibleChange] = this.appState.applyTo(
38
+ appState,
39
+ nextElements,
40
+ );
41
+
42
+ const appliedVisibleChanges =
43
+ elementsContainVisibleChange || appStateContainsVisibleChange;
44
+
45
+ return [nextElements, nextAppState, appliedVisibleChanges];
46
+ }
47
+
48
+ /**
49
+ * Overriding once to avoid type casting everywhere.
50
+ */
51
+ public static override calculate(
52
+ prevSnapshot: StoreSnapshot,
53
+ nextSnapshot: StoreSnapshot,
54
+ ) {
55
+ return super.calculate(prevSnapshot, nextSnapshot) as HistoryDelta;
56
+ }
57
+
58
+ /**
59
+ * Overriding once to avoid type casting everywhere.
60
+ */
61
+ public static override inverse(delta: StoreDelta): HistoryDelta {
62
+ return super.inverse(delta) as HistoryDelta;
63
+ }
64
+
65
+ /**
66
+ * Overriding once to avoid type casting everywhere.
67
+ */
68
+ public static override applyLatestChanges(
69
+ delta: StoreDelta,
70
+ prevElements: SceneElementsMap,
71
+ nextElements: SceneElementsMap,
72
+ modifierOptions?: "deleted" | "inserted",
73
+ ) {
74
+ return super.applyLatestChanges(
75
+ delta,
76
+ prevElements,
77
+ nextElements,
78
+ modifierOptions,
79
+ ) as HistoryDelta;
80
+ }
81
+ }
15
82
 
16
83
  export class HistoryChangedEvent {
17
84
  constructor(
@@ -25,8 +92,8 @@ export class History {
25
92
  [HistoryChangedEvent]
26
93
  >();
27
94
 
28
- public readonly undoStack: HistoryEntry[] = [];
29
- public readonly redoStack: HistoryEntry[] = [];
95
+ public readonly undoStack: HistoryDelta[] = [];
96
+ public readonly redoStack: HistoryDelta[] = [];
30
97
 
31
98
  public get isUndoStackEmpty() {
32
99
  return this.undoStack.length === 0;
@@ -48,16 +115,16 @@ export class History {
48
115
  * Do not re-record history entries, which were already pushed to undo / redo stack, as part of history action.
49
116
  */
50
117
  public record(delta: StoreDelta) {
51
- if (delta.isEmpty() || delta instanceof HistoryEntry) {
118
+ if (delta.isEmpty() || delta instanceof HistoryDelta) {
52
119
  return;
53
120
  }
54
121
 
55
122
  // construct history entry, so once it's emitted, it's not recorded again
56
- const entry = HistoryEntry.inverse(delta);
123
+ const historyDelta = HistoryDelta.inverse(delta);
57
124
 
58
- this.undoStack.push(entry);
125
+ this.undoStack.push(historyDelta);
59
126
 
60
- if (!entry.elements.isEmpty()) {
127
+ if (!historyDelta.elements.isEmpty()) {
61
128
  // don't reset redo stack on local appState changes,
62
129
  // as a simple click (unselect) could lead to losing all the redo entries
63
130
  // only reset on non empty elements changes!
@@ -74,7 +141,7 @@ export class History {
74
141
  elements,
75
142
  appState,
76
143
  () => History.pop(this.undoStack),
77
- (entry: HistoryEntry) => History.push(this.redoStack, entry, elements),
144
+ (entry: HistoryDelta) => History.push(this.redoStack, entry),
78
145
  );
79
146
  }
80
147
 
@@ -83,20 +150,20 @@ export class History {
83
150
  elements,
84
151
  appState,
85
152
  () => History.pop(this.redoStack),
86
- (entry: HistoryEntry) => History.push(this.undoStack, entry, elements),
153
+ (entry: HistoryDelta) => History.push(this.undoStack, entry),
87
154
  );
88
155
  }
89
156
 
90
157
  private perform(
91
158
  elements: SceneElementsMap,
92
159
  appState: AppState,
93
- pop: () => HistoryEntry | null,
94
- push: (entry: HistoryEntry) => void,
160
+ pop: () => HistoryDelta | null,
161
+ push: (entry: HistoryDelta) => void,
95
162
  ): [SceneElementsMap, AppState] | void {
96
163
  try {
97
- let historyEntry = pop();
164
+ let historyDelta = pop();
98
165
 
99
- if (historyEntry === null) {
166
+ if (historyDelta === null) {
100
167
  return;
101
168
  }
102
169
 
@@ -109,40 +176,46 @@ export class History {
109
176
  let containsVisibleChange = false;
110
177
 
111
178
  // iterate through the history entries in case they result in no visible changes
112
- while (historyEntry) {
179
+ while (historyDelta) {
113
180
  try {
114
181
  [nextElements, nextAppState, containsVisibleChange] =
115
- StoreDelta.applyTo(
116
- historyEntry,
117
- nextElements,
118
- nextAppState,
119
- prevSnapshot,
120
- );
182
+ historyDelta.applyTo(nextElements, nextAppState, prevSnapshot);
121
183
 
184
+ const prevElements = prevSnapshot.elements;
122
185
  const nextSnapshot = prevSnapshot.maybeClone(
123
186
  action,
124
187
  nextElements,
125
188
  nextAppState,
126
189
  );
127
190
 
128
- // schedule immediate capture, so that it's emitted for the sync purposes
129
- this.store.scheduleMicroAction({
130
- action,
131
- change: StoreChange.create(prevSnapshot, nextSnapshot),
132
- delta: historyEntry,
133
- });
191
+ const change = StoreChange.create(prevSnapshot, nextSnapshot);
192
+ const delta = HistoryDelta.applyLatestChanges(
193
+ historyDelta,
194
+ prevElements,
195
+ nextElements,
196
+ );
197
+
198
+ if (!delta.isEmpty()) {
199
+ // schedule immediate capture, so that it's emitted for the sync purposes
200
+ this.store.scheduleMicroAction({
201
+ action,
202
+ change,
203
+ delta,
204
+ });
205
+
206
+ historyDelta = delta;
207
+ }
134
208
 
135
209
  prevSnapshot = nextSnapshot;
136
210
  } finally {
137
- // make sure to always push, even if the delta is corrupted
138
- push(historyEntry);
211
+ push(historyDelta);
139
212
  }
140
213
 
141
214
  if (containsVisibleChange) {
142
215
  break;
143
216
  }
144
217
 
145
- historyEntry = pop();
218
+ historyDelta = pop();
146
219
  }
147
220
 
148
221
  return [nextElements, nextAppState];
@@ -155,7 +228,7 @@ export class History {
155
228
  }
156
229
  }
157
230
 
158
- private static pop(stack: HistoryEntry[]): HistoryEntry | null {
231
+ private static pop(stack: HistoryDelta[]): HistoryDelta | null {
159
232
  if (!stack.length) {
160
233
  return null;
161
234
  }
@@ -169,18 +242,8 @@ export class History {
169
242
  return null;
170
243
  }
171
244
 
172
- private static push(
173
- stack: HistoryEntry[],
174
- entry: HistoryEntry,
175
- prevElements: SceneElementsMap,
176
- ) {
177
- const inversedEntry = HistoryEntry.inverse(entry);
178
- const updatedEntry = HistoryEntry.applyLatestChanges(
179
- inversedEntry,
180
- prevElements,
181
- "inserted",
182
- );
183
-
184
- return stack.push(updatedEntry);
245
+ private static push(stack: HistoryDelta[], entry: HistoryDelta) {
246
+ const inversedEntry = HistoryDelta.inverse(entry);
247
+ return stack.push(inversedEntry);
185
248
  }
186
249
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@excalidraw/excalidraw",
3
- "version": "0.18.0-a30e1b2",
3
+ "version": "0.18.0-a8acc82",
4
4
  "type": "module",
5
5
  "types": "./dist/types/excalidraw/index.d.ts",
6
6
  "main": "./dist/prod/index.js",
@@ -66,14 +66,24 @@
66
66
  "last 1 safari version"
67
67
  ]
68
68
  },
69
+ "repository": "https://github.com/excalidraw/excalidraw",
70
+ "bugs": "https://github.com/excalidraw/excalidraw/issues",
71
+ "homepage": "https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw",
72
+ "scripts": {
73
+ "gen:types": "rimraf types && tsc",
74
+ "build:esm": "rimraf dist && node ../../scripts/buildPackage.js && yarn gen:types"
75
+ },
69
76
  "peerDependencies": {
70
77
  "react": "^17.0.2 || ^18.2.0 || ^19.0.0",
71
78
  "react-dom": "^17.0.2 || ^18.2.0 || ^19.0.0"
72
79
  },
73
80
  "dependencies": {
74
81
  "@braintree/sanitize-url": "6.0.2",
82
+ "@excalidraw/common": "0.18.0-a8acc82",
83
+ "@excalidraw/element": "0.18.0-a8acc82",
84
+ "@excalidraw/math": "0.18.0-a8acc82",
75
85
  "@excalidraw/laser-pointer": "1.3.1",
76
- "@excalidraw/mermaid-to-excalidraw": "1.1.2",
86
+ "@excalidraw/mermaid-to-excalidraw": "1.1.3",
77
87
  "@excalidraw/random-username": "1.1.0",
78
88
  "@radix-ui/react-popover": "1.1.6",
79
89
  "@radix-ui/react-tabs": "1.1.3",
@@ -124,12 +134,5 @@
124
134
  "harfbuzzjs": "0.3.6",
125
135
  "jest-diff": "29.7.0",
126
136
  "typescript": "4.9.4"
127
- },
128
- "repository": "https://github.com/excalidraw/excalidraw",
129
- "bugs": "https://github.com/excalidraw/excalidraw/issues",
130
- "homepage": "https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw",
131
- "scripts": {
132
- "gen:types": "rimraf types && tsc",
133
- "build:esm": "rimraf dist && node ../../scripts/buildPackage.js && yarn gen:types"
134
137
  }
135
- }
138
+ }