diff options
| author | kj_sh604 | 2026-03-15 16:19:35 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-03-15 16:19:35 -0400 |
| commit | 6ec259a0e71174651bae95d4628138bf6fd68742 (patch) | |
| tree | 5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/actions/types.ts | |
| parent | 16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff) | |
refactor: packages/
Diffstat (limited to 'packages/excalidraw/actions/types.ts')
| -rw-r--r-- | packages/excalidraw/actions/types.ts | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/packages/excalidraw/actions/types.ts b/packages/excalidraw/actions/types.ts new file mode 100644 index 0000000..71ac9f4 --- /dev/null +++ b/packages/excalidraw/actions/types.ts @@ -0,0 +1,207 @@ +import type React from "react"; +import type { + ExcalidrawElement, + OrderedExcalidrawElement, +} from "../element/types"; +import type { + AppClassProperties, + AppState, + ExcalidrawProps, + BinaryFiles, + UIAppState, +} from "../types"; +import type { CaptureUpdateActionType } from "../store"; + +export type ActionSource = + | "ui" + | "keyboard" + | "contextMenu" + | "api" + | "commandPalette"; + +/** if false, the action should be prevented */ +export type ActionResult = + | { + elements?: readonly ExcalidrawElement[] | null; + appState?: Partial<AppState> | null; + files?: BinaryFiles | null; + captureUpdate: CaptureUpdateActionType; + replaceFiles?: boolean; + } + | false; + +type ActionFn = ( + elements: readonly OrderedExcalidrawElement[], + appState: Readonly<AppState>, + formData: any, + app: AppClassProperties, +) => ActionResult | Promise<ActionResult>; + +export type UpdaterFn = (res: ActionResult) => void; +export type ActionFilterFn = (action: Action) => void; + +export type ActionName = + | "copy" + | "cut" + | "paste" + | "copyAsPng" + | "copyAsSvg" + | "copyText" + | "sendBackward" + | "bringForward" + | "sendToBack" + | "bringToFront" + | "copyStyles" + | "selectAll" + | "pasteStyles" + | "gridMode" + | "zenMode" + | "objectsSnapMode" + | "stats" + | "changeStrokeColor" + | "changeBackgroundColor" + | "changeFillStyle" + | "changeStrokeWidth" + | "changeStrokeShape" + | "changeSloppiness" + | "changeStrokeStyle" + | "changeArrowhead" + | "changeArrowType" + | "changeOpacity" + | "changeFontSize" + | "toggleCanvasMenu" + | "toggleEditMenu" + | "undo" + | "redo" + | "finalize" + | "changeProjectName" + | "changeExportBackground" + | "changeExportEmbedScene" + | "changeExportScale" + | "saveToActiveFile" + | "saveFileToDisk" + | "loadScene" + | "duplicateSelection" + | "deleteSelectedElements" + | "changeViewBackgroundColor" + | "clearCanvas" + | "zoomIn" + | "zoomOut" + | "resetZoom" + | "zoomToFit" + | "zoomToFitSelection" + | "zoomToFitSelectionInViewport" + | "changeFontFamily" + | "changeTextAlign" + | "changeVerticalAlign" + | "toggleFullScreen" + | "toggleShortcuts" + | "group" + | "ungroup" + | "goToCollaborator" + | "addToLibrary" + | "changeRoundness" + | "alignTop" + | "alignBottom" + | "alignLeft" + | "alignRight" + | "alignVerticallyCentered" + | "alignHorizontallyCentered" + | "distributeHorizontally" + | "distributeVertically" + | "flipHorizontal" + | "flipVertical" + | "viewMode" + | "exportWithDarkMode" + | "toggleTheme" + | "increaseFontSize" + | "decreaseFontSize" + | "unbindText" + | "hyperlink" + | "bindText" + | "unlockAllElements" + | "toggleElementLock" + | "toggleLinearEditor" + | "toggleEraserTool" + | "toggleHandTool" + | "selectAllElementsInFrame" + | "removeAllElementsFromFrame" + | "updateFrameRendering" + | "setFrameAsActiveTool" + | "setEmbeddableAsActiveTool" + | "createContainerFromText" + | "wrapTextInContainer" + | "commandPalette" + | "autoResize" + | "elementStats" + | "searchMenu" + | "copyElementLink" + | "linkToElement" + | "cropEditor" + | "wrapSelectionInFrame"; + +export type PanelComponentProps = { + elements: readonly ExcalidrawElement[]; + appState: AppState; + updateData: <T = any>(formData?: T) => void; + appProps: ExcalidrawProps; + data?: Record<string, any>; + app: AppClassProperties; +}; + +export interface Action { + name: ActionName; + label: + | string + | (( + elements: readonly ExcalidrawElement[], + appState: Readonly<AppState>, + app: AppClassProperties, + ) => string); + keywords?: string[]; + icon?: + | React.ReactNode + | (( + appState: UIAppState, + elements: readonly ExcalidrawElement[], + ) => React.ReactNode); + PanelComponent?: React.FC<PanelComponentProps>; + perform: ActionFn; + keyPriority?: number; + keyTest?: ( + event: React.KeyboardEvent | KeyboardEvent, + appState: AppState, + elements: readonly ExcalidrawElement[], + app: AppClassProperties, + ) => boolean; + predicate?: ( + elements: readonly ExcalidrawElement[], + appState: AppState, + appProps: ExcalidrawProps, + app: AppClassProperties, + ) => boolean; + checked?: (appState: Readonly<AppState>) => boolean; + trackEvent: + | false + | { + category: + | "toolbar" + | "element" + | "canvas" + | "export" + | "history" + | "menu" + | "collab" + | "hyperlink" + | "search_menu"; + action?: string; + predicate?: ( + appState: Readonly<AppState>, + elements: readonly ExcalidrawElement[], + value: any, + ) => boolean; + }; + /** if set to `true`, allow action to be performed in viewMode. + * Defaults to `false` */ + viewMode?: boolean; +} |
