|
@@ -1,10 +1,26 @@
|
|
|
+import {
|
|
|
+ clamp,
|
|
|
+ pointFrom,
|
|
|
+ pointDistance,
|
|
|
+ vector,
|
|
|
+ pointRotateRads,
|
|
|
+ vectorScale,
|
|
|
+ vectorFromPoint,
|
|
|
+ vectorSubtract,
|
|
|
+ vectorDot,
|
|
|
+ vectorNormalize,
|
|
|
+} from "@excalidraw/math";
|
|
|
+import { isPointInShape } from "@excalidraw/utils/collision";
|
|
|
+import { getSelectionBoxShape } from "@excalidraw/utils/geometry/shape";
|
|
|
+import clsx from "clsx";
|
|
|
+import throttle from "lodash.throttle";
|
|
|
+import { nanoid } from "nanoid";
|
|
|
import React, { useContext } from "react";
|
|
|
import { flushSync } from "react-dom";
|
|
|
-
|
|
|
-import type { RoughCanvas } from "roughjs/bin/canvas";
|
|
|
import rough from "roughjs/bin/rough";
|
|
|
-import clsx from "clsx";
|
|
|
-import { nanoid } from "nanoid";
|
|
|
+
|
|
|
+import type { LocalPoint, Radians } from "@excalidraw/math";
|
|
|
+
|
|
|
import {
|
|
|
actionAddToLibrary,
|
|
|
actionBringForward,
|
|
@@ -37,17 +53,29 @@ import {
|
|
|
actionToggleObjectsSnapMode,
|
|
|
actionToggleCropEditor,
|
|
|
} from "../actions";
|
|
|
+import { actionWrapTextInContainer } from "../actions/actionBoundText";
|
|
|
+import { actionToggleHandTool, zoomToFit } from "../actions/actionCanvas";
|
|
|
+import { actionPaste } from "../actions/actionClipboard";
|
|
|
+import { actionCopyElementLink } from "../actions/actionElementLink";
|
|
|
+import { actionUnlockAllElements } from "../actions/actionElementLock";
|
|
|
+import {
|
|
|
+ actionRemoveAllElementsFromFrame,
|
|
|
+ actionSelectAllElementsInFrame,
|
|
|
+ actionWrapSelectionInFrame,
|
|
|
+} from "../actions/actionFrame";
|
|
|
import { createRedoAction, createUndoAction } from "../actions/actionHistory";
|
|
|
+import { actionTextAutoResize } from "../actions/actionTextAutoResize";
|
|
|
+import { actionToggleViewMode } from "../actions/actionToggleViewMode";
|
|
|
import { ActionManager } from "../actions/manager";
|
|
|
import { actions } from "../actions/register";
|
|
|
-import type { Action, ActionResult } from "../actions/types";
|
|
|
+import { getShortcutFromShortcutName } from "../actions/shortcuts";
|
|
|
import { trackEvent } from "../analytics";
|
|
|
+import { AnimationFrameHandler } from "../animation-frame-handler";
|
|
|
import {
|
|
|
getDefaultAppState,
|
|
|
isEraserActive,
|
|
|
isHandToolActive,
|
|
|
} from "../appState";
|
|
|
-import type { PastedMixedContent } from "../clipboard";
|
|
|
import { copyTextToSystemClipboard, parseClipboard } from "../clipboard";
|
|
|
import {
|
|
|
APP_NAME,
|
|
@@ -92,7 +120,6 @@ import {
|
|
|
isSafari,
|
|
|
type EXPORT_IMAGE_TYPES,
|
|
|
} from "../constants";
|
|
|
-import type { ExportedElements } from "../data";
|
|
|
import { exportCanvas, loadFromBlob } from "../data";
|
|
|
import Library, { distributeLibraryItemsOnSquareGrid } from "../data/library";
|
|
|
import { restore, restoreElements } from "../data/restore";
|
|
@@ -167,30 +194,6 @@ import {
|
|
|
isFlowchartNodeElement,
|
|
|
isBindableElement,
|
|
|
} from "../element/typeChecks";
|
|
|
-import type {
|
|
|
- ExcalidrawBindableElement,
|
|
|
- ExcalidrawElement,
|
|
|
- ExcalidrawFreeDrawElement,
|
|
|
- ExcalidrawGenericElement,
|
|
|
- ExcalidrawLinearElement,
|
|
|
- ExcalidrawTextElement,
|
|
|
- NonDeleted,
|
|
|
- InitializedExcalidrawImageElement,
|
|
|
- ExcalidrawImageElement,
|
|
|
- FileId,
|
|
|
- NonDeletedExcalidrawElement,
|
|
|
- ExcalidrawTextContainer,
|
|
|
- ExcalidrawFrameLikeElement,
|
|
|
- ExcalidrawMagicFrameElement,
|
|
|
- ExcalidrawIframeLikeElement,
|
|
|
- IframeData,
|
|
|
- ExcalidrawIframeElement,
|
|
|
- ExcalidrawEmbeddableElement,
|
|
|
- Ordered,
|
|
|
- MagicGenerationData,
|
|
|
- ExcalidrawNonSelectionElement,
|
|
|
- ExcalidrawArrowElement,
|
|
|
-} from "../element/types";
|
|
|
import { getCenter, getDistance } from "../gesture";
|
|
|
import {
|
|
|
editGroupForSelectedElement,
|
|
@@ -224,10 +227,6 @@ import {
|
|
|
isSomeElementSelected,
|
|
|
} from "../scene";
|
|
|
import Scene from "../scene/Scene";
|
|
|
-import type {
|
|
|
- RenderInteractiveSceneCallback,
|
|
|
- ScrollBars,
|
|
|
-} from "../scene/types";
|
|
|
import { getStateForZoom } from "../scene/zoom";
|
|
|
import {
|
|
|
findShapeByKey,
|
|
@@ -236,36 +235,6 @@ import {
|
|
|
getElementShape,
|
|
|
isPathALoop,
|
|
|
} from "../shapes";
|
|
|
-import { getSelectionBoxShape } from "@excalidraw/utils/geometry/shape";
|
|
|
-import { isPointInShape } from "@excalidraw/utils/collision";
|
|
|
-import type {
|
|
|
- AppClassProperties,
|
|
|
- AppProps,
|
|
|
- AppState,
|
|
|
- BinaryFileData,
|
|
|
- DataURL,
|
|
|
- ExcalidrawImperativeAPI,
|
|
|
- BinaryFiles,
|
|
|
- Gesture,
|
|
|
- GestureEvent,
|
|
|
- LibraryItems,
|
|
|
- PointerDownState,
|
|
|
- SceneData,
|
|
|
- Device,
|
|
|
- FrameNameBoundsCache,
|
|
|
- SidebarName,
|
|
|
- SidebarTabName,
|
|
|
- KeyboardModifiersObject,
|
|
|
- CollaboratorPointer,
|
|
|
- ToolType,
|
|
|
- OnUserFollowedPayload,
|
|
|
- UnsubscribeCallback,
|
|
|
- EmbedsValidationStatus,
|
|
|
- ElementsPendingErasure,
|
|
|
- GenerateDiagramToCode,
|
|
|
- NullableGridSize,
|
|
|
- Offsets,
|
|
|
-} from "../types";
|
|
|
import {
|
|
|
debounce,
|
|
|
distance,
|
|
@@ -299,11 +268,6 @@ import {
|
|
|
maybeParseEmbedSrc,
|
|
|
getEmbedLink,
|
|
|
} from "../element/embeddable";
|
|
|
-import type { ContextMenuItems } from "./ContextMenu";
|
|
|
-import { ContextMenu, CONTEXT_MENU_SEPARATOR } from "./ContextMenu";
|
|
|
-import LayerUI from "./LayerUI";
|
|
|
-import { Toast } from "./Toast";
|
|
|
-import { actionToggleViewMode } from "../actions/actionToggleViewMode";
|
|
|
import {
|
|
|
dataURLToFile,
|
|
|
dataURLToString,
|
|
@@ -326,8 +290,6 @@ import {
|
|
|
normalizeSVG,
|
|
|
updateImageCache as _updateImageCache,
|
|
|
} from "../element/image";
|
|
|
-import throttle from "lodash.throttle";
|
|
|
-import type { FileSystemHandle } from "../data/filesystem";
|
|
|
import { fileOpen } from "../data/filesystem";
|
|
|
import {
|
|
|
bindTextToShapeAfterDuplication,
|
|
@@ -343,7 +305,6 @@ import {
|
|
|
} from "../components/hyperlink/Hyperlink";
|
|
|
import { isLocalLink, normalizeLink, toValidURL } from "../data/url";
|
|
|
import { shouldShowBoundingBox } from "../element/transformHandles";
|
|
|
-import { actionUnlockAllElements } from "../actions/actionElementLock";
|
|
|
import { Fonts, getLineHeight } from "../fonts";
|
|
|
import {
|
|
|
getFrameChildren,
|
|
@@ -366,15 +327,7 @@ import {
|
|
|
excludeElementsInFramesFromSelection,
|
|
|
makeNextSelectedElementIds,
|
|
|
} from "../scene/selection";
|
|
|
-import { actionPaste } from "../actions/actionClipboard";
|
|
|
-import {
|
|
|
- actionRemoveAllElementsFromFrame,
|
|
|
- actionSelectAllElementsInFrame,
|
|
|
- actionWrapSelectionInFrame,
|
|
|
-} from "../actions/actionFrame";
|
|
|
-import { actionToggleHandTool, zoomToFit } from "../actions/actionCanvas";
|
|
|
import { editorJotaiStore } from "../editor-jotai";
|
|
|
-import { activeConfirmDialogAtom } from "./ActiveConfirmDialog";
|
|
|
import { ImageSceneDataError } from "../errors";
|
|
|
import {
|
|
|
getSnapLinesAtPointer,
|
|
@@ -389,17 +342,9 @@ import {
|
|
|
isGridModeEnabled,
|
|
|
getGridPoint,
|
|
|
} from "../snapping";
|
|
|
-import { actionWrapTextInContainer } from "../actions/actionBoundText";
|
|
|
-import BraveMeasureTextError from "./BraveMeasureTextError";
|
|
|
-import { activeEyeDropperAtom } from "./EyeDropper";
|
|
|
-import type { ExcalidrawElementSkeleton } from "../data/transform";
|
|
|
import { convertToExcalidrawElements } from "../data/transform";
|
|
|
-import type { ValueOf } from "../utility-types";
|
|
|
-import { isSidebarDockedAtom } from "./Sidebar/Sidebar";
|
|
|
-import { StaticCanvas, InteractiveCanvas } from "./canvases";
|
|
|
import { Renderer } from "../scene/Renderer";
|
|
|
import { ShapeCache } from "../scene/ShapeCache";
|
|
|
-import { SVGLayer } from "./SVGLayer";
|
|
|
import {
|
|
|
setEraserCursor,
|
|
|
setCursor,
|
|
@@ -409,11 +354,7 @@ import {
|
|
|
import { Emitter } from "../emitter";
|
|
|
import { ElementCanvasButtons } from "../element/ElementCanvasButtons";
|
|
|
import { COLOR_PALETTE } from "../colors";
|
|
|
-import { ElementCanvasButton } from "./MagicButton";
|
|
|
-import { MagicIcon, copyIcon, fullscreenIcon } from "./icons";
|
|
|
-import FollowMode from "./FollowMode/FollowMode";
|
|
|
import { Store, CaptureUpdateAction } from "../store";
|
|
|
-import { AnimationFrameHandler } from "../animation-frame-handler";
|
|
|
import { AnimatedTrail } from "../animated-trail";
|
|
|
import { LaserTrails } from "../laser-trails";
|
|
|
import { withBatchedUpdates, withBatchedUpdatesThrottled } from "../reactUtils";
|
|
@@ -426,37 +367,15 @@ import {
|
|
|
import { textWysiwyg } from "../element/textWysiwyg";
|
|
|
import { isOverScrollBars } from "../scene/scrollbars";
|
|
|
import { syncInvalidIndices, syncMovedIndices } from "../fractionalIndex";
|
|
|
-import {
|
|
|
- isPointHittingLink,
|
|
|
- isPointHittingLinkIcon,
|
|
|
-} from "./hyperlink/helpers";
|
|
|
-import { getShortcutFromShortcutName } from "../actions/shortcuts";
|
|
|
-import { actionTextAutoResize } from "../actions/actionTextAutoResize";
|
|
|
import { getVisibleSceneBounds } from "../element/bounds";
|
|
|
import { isMaybeMermaidDefinition } from "../mermaid";
|
|
|
-import NewElementCanvas from "./canvases/NewElementCanvas";
|
|
|
import {
|
|
|
FlowChartCreator,
|
|
|
FlowChartNavigator,
|
|
|
getLinkDirectionFromKey,
|
|
|
} from "../element/flowchart";
|
|
|
-import { searchItemInFocusAtom } from "./SearchMenu";
|
|
|
-import type { LocalPoint, Radians } from "@excalidraw/math";
|
|
|
-import {
|
|
|
- clamp,
|
|
|
- pointFrom,
|
|
|
- pointDistance,
|
|
|
- vector,
|
|
|
- pointRotateRads,
|
|
|
- vectorScale,
|
|
|
- vectorFromPoint,
|
|
|
- vectorSubtract,
|
|
|
- vectorDot,
|
|
|
- vectorNormalize,
|
|
|
-} from "@excalidraw/math";
|
|
|
import { cropElement } from "../element/cropElement";
|
|
|
import { wrapText } from "../element/textWrapping";
|
|
|
-import { actionCopyElementLink } from "../actions/actionElementLink";
|
|
|
import { isElementLink, parseElementLinkFromURL } from "../element/elementLink";
|
|
|
import {
|
|
|
isMeasureTextSupported,
|
|
@@ -468,6 +387,90 @@ import {
|
|
|
getMinTextElementWidth,
|
|
|
} from "../element/textMeasurements";
|
|
|
|
|
|
+import { activeConfirmDialogAtom } from "./ActiveConfirmDialog";
|
|
|
+import BraveMeasureTextError from "./BraveMeasureTextError";
|
|
|
+import { ContextMenu, CONTEXT_MENU_SEPARATOR } from "./ContextMenu";
|
|
|
+import { activeEyeDropperAtom } from "./EyeDropper";
|
|
|
+import FollowMode from "./FollowMode/FollowMode";
|
|
|
+import LayerUI from "./LayerUI";
|
|
|
+import { ElementCanvasButton } from "./MagicButton";
|
|
|
+import { SVGLayer } from "./SVGLayer";
|
|
|
+import { searchItemInFocusAtom } from "./SearchMenu";
|
|
|
+import { isSidebarDockedAtom } from "./Sidebar/Sidebar";
|
|
|
+import { StaticCanvas, InteractiveCanvas } from "./canvases";
|
|
|
+import NewElementCanvas from "./canvases/NewElementCanvas";
|
|
|
+import {
|
|
|
+ isPointHittingLink,
|
|
|
+ isPointHittingLinkIcon,
|
|
|
+} from "./hyperlink/helpers";
|
|
|
+import { MagicIcon, copyIcon, fullscreenIcon } from "./icons";
|
|
|
+import { Toast } from "./Toast";
|
|
|
+
|
|
|
+import type { Action, ActionResult } from "../actions/types";
|
|
|
+import type { PastedMixedContent } from "../clipboard";
|
|
|
+import type { ExportedElements } from "../data";
|
|
|
+import type { ContextMenuItems } from "./ContextMenu";
|
|
|
+import type { FileSystemHandle } from "../data/filesystem";
|
|
|
+import type { ExcalidrawElementSkeleton } from "../data/transform";
|
|
|
+import type {
|
|
|
+ ExcalidrawBindableElement,
|
|
|
+ ExcalidrawElement,
|
|
|
+ ExcalidrawFreeDrawElement,
|
|
|
+ ExcalidrawGenericElement,
|
|
|
+ ExcalidrawLinearElement,
|
|
|
+ ExcalidrawTextElement,
|
|
|
+ NonDeleted,
|
|
|
+ InitializedExcalidrawImageElement,
|
|
|
+ ExcalidrawImageElement,
|
|
|
+ FileId,
|
|
|
+ NonDeletedExcalidrawElement,
|
|
|
+ ExcalidrawTextContainer,
|
|
|
+ ExcalidrawFrameLikeElement,
|
|
|
+ ExcalidrawMagicFrameElement,
|
|
|
+ ExcalidrawIframeLikeElement,
|
|
|
+ IframeData,
|
|
|
+ ExcalidrawIframeElement,
|
|
|
+ ExcalidrawEmbeddableElement,
|
|
|
+ Ordered,
|
|
|
+ MagicGenerationData,
|
|
|
+ ExcalidrawNonSelectionElement,
|
|
|
+ ExcalidrawArrowElement,
|
|
|
+} from "../element/types";
|
|
|
+import type {
|
|
|
+ RenderInteractiveSceneCallback,
|
|
|
+ ScrollBars,
|
|
|
+} from "../scene/types";
|
|
|
+import type {
|
|
|
+ AppClassProperties,
|
|
|
+ AppProps,
|
|
|
+ AppState,
|
|
|
+ BinaryFileData,
|
|
|
+ DataURL,
|
|
|
+ ExcalidrawImperativeAPI,
|
|
|
+ BinaryFiles,
|
|
|
+ Gesture,
|
|
|
+ GestureEvent,
|
|
|
+ LibraryItems,
|
|
|
+ PointerDownState,
|
|
|
+ SceneData,
|
|
|
+ Device,
|
|
|
+ FrameNameBoundsCache,
|
|
|
+ SidebarName,
|
|
|
+ SidebarTabName,
|
|
|
+ KeyboardModifiersObject,
|
|
|
+ CollaboratorPointer,
|
|
|
+ ToolType,
|
|
|
+ OnUserFollowedPayload,
|
|
|
+ UnsubscribeCallback,
|
|
|
+ EmbedsValidationStatus,
|
|
|
+ ElementsPendingErasure,
|
|
|
+ GenerateDiagramToCode,
|
|
|
+ NullableGridSize,
|
|
|
+ Offsets,
|
|
|
+} from "../types";
|
|
|
+import type { ValueOf } from "../utility-types";
|
|
|
+import type { RoughCanvas } from "roughjs/bin/canvas";
|
|
|
+
|
|
|
const AppContext = React.createContext<AppClassProperties>(null!);
|
|
|
const AppPropsContext = React.createContext<AppProps>(null!);
|
|
|
|