types.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. export type Point = Readonly<RoughPoint>;
  24. export type Collaborator = {
  25. pointer?: {
  26. x: number;
  27. y: number;
  28. };
  29. button?: "up" | "down";
  30. selectedElementIds?: AppState["selectedElementIds"];
  31. username?: string | null;
  32. };
  33. export type AppState = {
  34. isLoading: boolean;
  35. errorMessage: string | null;
  36. draggingElement: NonDeletedExcalidrawElement | null;
  37. resizingElement: NonDeletedExcalidrawElement | null;
  38. multiElement: NonDeleted<ExcalidrawLinearElement> | null;
  39. selectionElement: NonDeletedExcalidrawElement | null;
  40. isBindingEnabled: boolean;
  41. startBoundElement: NonDeleted<ExcalidrawBindableElement> | null;
  42. suggestedBindings: SuggestedBinding[];
  43. // element being edited, but not necessarily added to elements array yet
  44. // (e.g. text element when typing into the input)
  45. editingElement: NonDeletedExcalidrawElement | null;
  46. editingLinearElement: LinearElementEditor | null;
  47. elementType: typeof SHAPES[number]["value"];
  48. elementLocked: boolean;
  49. exportBackground: boolean;
  50. exportEmbedScene: boolean;
  51. shouldAddWatermark: boolean;
  52. currentItemStrokeColor: string;
  53. currentItemBackgroundColor: string;
  54. currentItemFillStyle: ExcalidrawElement["fillStyle"];
  55. currentItemStrokeWidth: number;
  56. currentItemStrokeStyle: ExcalidrawElement["strokeStyle"];
  57. currentItemRoughness: number;
  58. currentItemOpacity: number;
  59. currentItemFontFamily: FontFamily;
  60. currentItemFontSize: number;
  61. currentItemTextAlign: TextAlign;
  62. currentItemStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  63. currentItemStartArrowhead: Arrowhead | null;
  64. currentItemEndArrowhead: Arrowhead | null;
  65. currentItemLinearStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  66. viewBackgroundColor: string;
  67. scrollX: number;
  68. scrollY: number;
  69. cursorButton: "up" | "down";
  70. scrolledOutside: boolean;
  71. name: string;
  72. isResizing: boolean;
  73. isRotating: boolean;
  74. zoom: Zoom;
  75. openMenu: "canvas" | "shape" | null;
  76. lastPointerDownWith: PointerType;
  77. selectedElementIds: { [id: string]: boolean };
  78. previousSelectedElementIds: { [id: string]: boolean };
  79. shouldCacheIgnoreZoom: boolean;
  80. showHelpDialog: boolean;
  81. toastMessage: string | null;
  82. zenModeEnabled: boolean;
  83. appearance: "light" | "dark";
  84. gridSize: number | null;
  85. viewModeEnabled: boolean;
  86. /** top-most selected groups (i.e. does not include nested groups) */
  87. selectedGroupIds: { [groupId: string]: boolean };
  88. /** group being edited when you drill down to its constituent element
  89. (e.g. when you double-click on a group's element) */
  90. editingGroupId: GroupId | null;
  91. width: number;
  92. height: number;
  93. offsetTop: number;
  94. offsetLeft: number;
  95. isLibraryOpen: boolean;
  96. fileHandle: import("browser-fs-access").FileSystemHandle | null;
  97. collaborators: Map<string, Collaborator>;
  98. showStats: boolean;
  99. currentChartType: ChartType;
  100. pasteDialog:
  101. | {
  102. shown: false;
  103. data: null;
  104. }
  105. | {
  106. shown: true;
  107. data: Spreadsheet;
  108. };
  109. };
  110. export type NormalizedZoomValue = number & { _brand: "normalizedZoom" };
  111. export type Zoom = Readonly<{
  112. value: NormalizedZoomValue;
  113. translation: Readonly<{
  114. x: number;
  115. y: number;
  116. }>;
  117. }>;
  118. export type PointerCoords = Readonly<{
  119. x: number;
  120. y: number;
  121. }>;
  122. export type Gesture = {
  123. pointers: Map<number, PointerCoords>;
  124. lastCenter: { x: number; y: number } | null;
  125. initialDistance: number | null;
  126. initialScale: number | null;
  127. };
  128. export declare class GestureEvent extends UIEvent {
  129. readonly rotation: number;
  130. readonly scale: number;
  131. }
  132. export type LibraryItem = readonly NonDeleted<ExcalidrawElement>[];
  133. export type LibraryItems = readonly LibraryItem[];
  134. // NOTE ready/readyPromise props are optional for host apps' sake (our own
  135. // implem guarantees existence)
  136. export type ExcalidrawAPIRefValue =
  137. | ExcalidrawImperativeAPI
  138. | {
  139. readyPromise?: ResolvablePromise<ExcalidrawImperativeAPI>;
  140. ready?: false;
  141. };
  142. export interface ExcalidrawProps {
  143. width?: number;
  144. height?: number;
  145. /** if not supplied, calculated by Excalidraw */
  146. offsetLeft?: number;
  147. /** if not supplied, calculated by Excalidraw */
  148. offsetTop?: number;
  149. onChange?: (
  150. elements: readonly ExcalidrawElement[],
  151. appState: AppState,
  152. ) => void;
  153. initialData?: ImportedDataState | null | Promise<ImportedDataState | null>;
  154. user?: {
  155. name?: string | null;
  156. };
  157. excalidrawRef?: ForwardRef<ExcalidrawAPIRefValue>;
  158. onCollabButtonClick?: () => void;
  159. isCollaborating?: boolean;
  160. onPointerUpdate?: (payload: {
  161. pointer: { x: number; y: number };
  162. button: "down" | "up";
  163. pointersMap: Gesture["pointers"];
  164. }) => void;
  165. onExportToBackend?: (
  166. exportedElements: readonly NonDeletedExcalidrawElement[],
  167. appState: AppState,
  168. canvas: HTMLCanvasElement | null,
  169. ) => void;
  170. renderFooter?: (isMobile: boolean) => JSX.Element;
  171. langCode?: Language["code"];
  172. viewModeEnabled?: boolean;
  173. }
  174. export type SceneData = {
  175. elements?: ImportedDataState["elements"];
  176. appState?: ImportedDataState["appState"];
  177. collaborators?: Map<string, Collaborator>;
  178. commitToHistory?: boolean;
  179. };