types.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. import {
  2. PointerType,
  3. ExcalidrawLinearElement,
  4. NonDeletedExcalidrawElement,
  5. NonDeleted,
  6. TextAlign,
  7. ExcalidrawElement,
  8. FontFamily,
  9. GroupId,
  10. ExcalidrawBindableElement,
  11. Arrowhead,
  12. ChartType,
  13. } from "./element/types";
  14. import { SHAPES } from "./shapes";
  15. import { Point as RoughPoint } from "roughjs/bin/geometry";
  16. import { LinearElementEditor } from "./element/linearElementEditor";
  17. import { SuggestedBinding } from "./element/binding";
  18. import { ImportedDataState } from "./data/types";
  19. import { ExcalidrawImperativeAPI } from "./components/App";
  20. import type { ResolvablePromise } from "./utils";
  21. import { Spreadsheet } from "./charts";
  22. import { Language } from "./i18n";
  23. import { ClipboardData } from "./clipboard";
  24. export type Point = Readonly<RoughPoint>;
  25. export type Collaborator = {
  26. pointer?: {
  27. x: number;
  28. y: number;
  29. };
  30. button?: "up" | "down";
  31. selectedElementIds?: AppState["selectedElementIds"];
  32. username?: string | null;
  33. userState?: UserIdleState;
  34. color?: {
  35. background: string;
  36. stroke: string;
  37. };
  38. };
  39. export type AppState = {
  40. isLoading: boolean;
  41. errorMessage: string | null;
  42. draggingElement: NonDeletedExcalidrawElement | null;
  43. resizingElement: NonDeletedExcalidrawElement | null;
  44. multiElement: NonDeleted<ExcalidrawLinearElement> | null;
  45. selectionElement: NonDeletedExcalidrawElement | null;
  46. isBindingEnabled: boolean;
  47. startBoundElement: NonDeleted<ExcalidrawBindableElement> | null;
  48. suggestedBindings: SuggestedBinding[];
  49. // element being edited, but not necessarily added to elements array yet
  50. // (e.g. text element when typing into the input)
  51. editingElement: NonDeletedExcalidrawElement | null;
  52. editingLinearElement: LinearElementEditor | null;
  53. elementType: typeof SHAPES[number]["value"];
  54. elementLocked: boolean;
  55. exportBackground: boolean;
  56. exportEmbedScene: boolean;
  57. exportWithDarkMode: boolean;
  58. shouldAddWatermark: boolean;
  59. currentItemStrokeColor: string;
  60. currentItemBackgroundColor: string;
  61. currentItemFillStyle: ExcalidrawElement["fillStyle"];
  62. currentItemStrokeWidth: number;
  63. currentItemStrokeStyle: ExcalidrawElement["strokeStyle"];
  64. currentItemRoughness: number;
  65. currentItemOpacity: number;
  66. currentItemFontFamily: FontFamily;
  67. currentItemFontSize: number;
  68. currentItemTextAlign: TextAlign;
  69. currentItemStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  70. currentItemStartArrowhead: Arrowhead | null;
  71. currentItemEndArrowhead: Arrowhead | null;
  72. currentItemLinearStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  73. viewBackgroundColor: string;
  74. scrollX: number;
  75. scrollY: number;
  76. cursorButton: "up" | "down";
  77. scrolledOutside: boolean;
  78. name: string;
  79. isResizing: boolean;
  80. isRotating: boolean;
  81. zoom: Zoom;
  82. openMenu: "canvas" | "shape" | null;
  83. lastPointerDownWith: PointerType;
  84. selectedElementIds: { [id: string]: boolean };
  85. previousSelectedElementIds: { [id: string]: boolean };
  86. shouldCacheIgnoreZoom: boolean;
  87. showHelpDialog: boolean;
  88. toastMessage: string | null;
  89. zenModeEnabled: boolean;
  90. theme: "light" | "dark";
  91. gridSize: number | null;
  92. viewModeEnabled: boolean;
  93. /** top-most selected groups (i.e. does not include nested groups) */
  94. selectedGroupIds: { [groupId: string]: boolean };
  95. /** group being edited when you drill down to its constituent element
  96. (e.g. when you double-click on a group's element) */
  97. editingGroupId: GroupId | null;
  98. width: number;
  99. height: number;
  100. offsetTop: number;
  101. offsetLeft: number;
  102. isLibraryOpen: boolean;
  103. fileHandle: import("browser-fs-access").FileSystemHandle | null;
  104. collaborators: Map<string, Collaborator>;
  105. showStats: boolean;
  106. currentChartType: ChartType;
  107. pasteDialog:
  108. | {
  109. shown: false;
  110. data: null;
  111. }
  112. | {
  113. shown: true;
  114. data: Spreadsheet;
  115. };
  116. };
  117. export type NormalizedZoomValue = number & { _brand: "normalizedZoom" };
  118. export type Zoom = Readonly<{
  119. value: NormalizedZoomValue;
  120. translation: Readonly<{
  121. x: number;
  122. y: number;
  123. }>;
  124. }>;
  125. export type PointerCoords = Readonly<{
  126. x: number;
  127. y: number;
  128. }>;
  129. export type Gesture = {
  130. pointers: Map<number, PointerCoords>;
  131. lastCenter: { x: number; y: number } | null;
  132. initialDistance: number | null;
  133. initialScale: number | null;
  134. };
  135. export declare class GestureEvent extends UIEvent {
  136. readonly rotation: number;
  137. readonly scale: number;
  138. }
  139. export type LibraryItem = readonly NonDeleted<ExcalidrawElement>[];
  140. export type LibraryItems = readonly LibraryItem[];
  141. // NOTE ready/readyPromise props are optional for host apps' sake (our own
  142. // implem guarantees existence)
  143. export type ExcalidrawAPIRefValue =
  144. | ExcalidrawImperativeAPI
  145. | {
  146. readyPromise?: ResolvablePromise<ExcalidrawImperativeAPI>;
  147. ready?: false;
  148. };
  149. export interface ExcalidrawProps {
  150. onChange?: (
  151. elements: readonly ExcalidrawElement[],
  152. appState: AppState,
  153. ) => void;
  154. initialData?: ImportedDataState | null | Promise<ImportedDataState | null>;
  155. excalidrawRef?: ForwardRef<ExcalidrawAPIRefValue>;
  156. onCollabButtonClick?: () => void;
  157. isCollaborating?: boolean;
  158. onPointerUpdate?: (payload: {
  159. pointer: { x: number; y: number };
  160. button: "down" | "up";
  161. pointersMap: Gesture["pointers"];
  162. }) => void;
  163. onExportToBackend?: (
  164. exportedElements: readonly NonDeletedExcalidrawElement[],
  165. appState: AppState,
  166. canvas: HTMLCanvasElement | null,
  167. ) => void;
  168. onPaste?: (
  169. data: ClipboardData,
  170. event: ClipboardEvent | null,
  171. ) => Promise<boolean> | boolean;
  172. renderTopRight?: (isMobile: boolean, appState: AppState) => JSX.Element;
  173. renderFooter?: (isMobile: boolean) => JSX.Element;
  174. langCode?: Language["code"];
  175. viewModeEnabled?: boolean;
  176. zenModeEnabled?: boolean;
  177. gridModeEnabled?: boolean;
  178. libraryReturnUrl?: string;
  179. theme?: "dark" | "light";
  180. name?: string;
  181. renderCustomStats?: (
  182. elements: readonly NonDeletedExcalidrawElement[],
  183. appState: AppState,
  184. ) => JSX.Element;
  185. UIOptions?: UIOptions;
  186. detectScroll?: boolean;
  187. handleKeyboardGlobally?: boolean;
  188. onLibraryChange?: (libraryItems: LibraryItems) => void | Promise<any>;
  189. }
  190. export type SceneData = {
  191. elements?: ImportedDataState["elements"];
  192. appState?: ImportedDataState["appState"];
  193. collaborators?: Map<string, Collaborator>;
  194. commitToHistory?: boolean;
  195. };
  196. export enum UserIdleState {
  197. ACTIVE = "active",
  198. AWAY = "away",
  199. IDLE = "idle",
  200. }
  201. type CanvasActions = {
  202. changeViewBackgroundColor?: boolean;
  203. clearCanvas?: boolean;
  204. export?: boolean;
  205. loadScene?: boolean;
  206. saveAsScene?: boolean;
  207. saveScene?: boolean;
  208. theme?: boolean;
  209. };
  210. export type UIOptions = {
  211. canvasActions?: CanvasActions;
  212. };
  213. export type AppProps = ExcalidrawProps & {
  214. UIOptions: {
  215. canvasActions: Required<CanvasActions>;
  216. };
  217. detectScroll: boolean;
  218. handleKeyboardGlobally: boolean;
  219. };