types.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {
  2. PointerType,
  3. ExcalidrawLinearElement,
  4. NonDeletedExcalidrawElement,
  5. NonDeleted,
  6. TextAlign,
  7. ExcalidrawElement,
  8. FontFamily,
  9. GroupId,
  10. ExcalidrawBindableElement,
  11. } from "./element/types";
  12. import { SHAPES } from "./shapes";
  13. import { Point as RoughPoint } from "roughjs/bin/geometry";
  14. import { LinearElementEditor } from "./element/linearElementEditor";
  15. import { SuggestedBinding } from "./element/binding";
  16. import { ImportedDataState } from "./data/types";
  17. import { ExcalidrawImperativeAPI } from "./components/App";
  18. import type { ResolvablePromise } from "./utils";
  19. export type FlooredNumber = number & { _brand: "FlooredNumber" };
  20. export type Point = Readonly<RoughPoint>;
  21. export type Collaborator = {
  22. pointer?: {
  23. x: number;
  24. y: number;
  25. };
  26. button?: "up" | "down";
  27. selectedElementIds?: AppState["selectedElementIds"];
  28. username?: string | null;
  29. };
  30. export type AppState = {
  31. isLoading: boolean;
  32. errorMessage: string | null;
  33. draggingElement: NonDeletedExcalidrawElement | null;
  34. resizingElement: NonDeletedExcalidrawElement | null;
  35. multiElement: NonDeleted<ExcalidrawLinearElement> | null;
  36. selectionElement: NonDeletedExcalidrawElement | null;
  37. isBindingEnabled: boolean;
  38. startBoundElement: NonDeleted<ExcalidrawBindableElement> | null;
  39. suggestedBindings: SuggestedBinding[];
  40. // element being edited, but not necessarily added to elements array yet
  41. // (e.g. text element when typing into the input)
  42. editingElement: NonDeletedExcalidrawElement | null;
  43. editingLinearElement: LinearElementEditor | null;
  44. elementType: typeof SHAPES[number]["value"];
  45. elementLocked: boolean;
  46. exportBackground: boolean;
  47. exportEmbedScene: boolean;
  48. shouldAddWatermark: boolean;
  49. currentItemStrokeColor: string;
  50. currentItemBackgroundColor: string;
  51. currentItemFillStyle: string;
  52. currentItemStrokeWidth: number;
  53. currentItemStrokeStyle: ExcalidrawElement["strokeStyle"];
  54. currentItemRoughness: number;
  55. currentItemOpacity: number;
  56. currentItemFontFamily: FontFamily;
  57. currentItemFontSize: number;
  58. currentItemTextAlign: TextAlign;
  59. currentItemStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  60. currentItemLinearStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  61. viewBackgroundColor: string;
  62. scrollX: FlooredNumber;
  63. scrollY: FlooredNumber;
  64. cursorX: number;
  65. cursorY: number;
  66. cursorButton: "up" | "down";
  67. scrolledOutside: boolean;
  68. name: string;
  69. isResizing: boolean;
  70. isRotating: boolean;
  71. zoom: Zoom;
  72. openMenu: "canvas" | "shape" | null;
  73. lastPointerDownWith: PointerType;
  74. selectedElementIds: { [id: string]: boolean };
  75. previousSelectedElementIds: { [id: string]: boolean };
  76. shouldCacheIgnoreZoom: boolean;
  77. showShortcutsDialog: boolean;
  78. zenModeEnabled: boolean;
  79. appearance: "light" | "dark";
  80. gridSize: number | null;
  81. /** top-most selected groups (i.e. does not include nested groups) */
  82. selectedGroupIds: { [groupId: string]: boolean };
  83. /** group being edited when you drill down to its constituent element
  84. (e.g. when you double-click on a group's element) */
  85. editingGroupId: GroupId | null;
  86. width: number;
  87. height: number;
  88. offsetTop: number;
  89. offsetLeft: number;
  90. isLibraryOpen: boolean;
  91. fileHandle: import("browser-nativefs").FileSystemHandle | null;
  92. collaborators: Map<string, Collaborator>;
  93. };
  94. export type NormalizedZoomValue = number & { _brand: "normalizedZoom" };
  95. export type Zoom = Readonly<{
  96. value: NormalizedZoomValue;
  97. translation: Readonly<{
  98. x: number;
  99. y: number;
  100. }>;
  101. }>;
  102. export type PointerCoords = Readonly<{
  103. x: number;
  104. y: number;
  105. }>;
  106. export type Gesture = {
  107. pointers: Map<number, PointerCoords>;
  108. lastCenter: { x: number; y: number } | null;
  109. initialDistance: number | null;
  110. initialScale: number | null;
  111. };
  112. export declare class GestureEvent extends UIEvent {
  113. readonly rotation: number;
  114. readonly scale: number;
  115. }
  116. export type LibraryItem = readonly NonDeleted<ExcalidrawElement>[];
  117. export type LibraryItems = readonly LibraryItem[];
  118. export type ExcalidrawAPIRefValue =
  119. | (ExcalidrawImperativeAPI & {
  120. readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;
  121. ready: true;
  122. })
  123. | {
  124. readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;
  125. ready: false;
  126. };
  127. export interface ExcalidrawProps {
  128. width?: number;
  129. height?: number;
  130. /** if not supplied, calculated by Excalidraw */
  131. offsetLeft?: number;
  132. /** if not supplied, calculated by Excalidraw */
  133. offsetTop?: number;
  134. onChange?: (
  135. elements: readonly ExcalidrawElement[],
  136. appState: AppState,
  137. ) => void;
  138. initialData?: ImportedDataState | null | Promise<ImportedDataState | null>;
  139. user?: {
  140. name?: string | null;
  141. };
  142. excalidrawRef?: ForwardRef<ExcalidrawAPIRefValue>;
  143. onCollabButtonClick?: () => void;
  144. isCollaborating?: boolean;
  145. onPointerUpdate?: (payload: {
  146. pointer: { x: number; y: number };
  147. button: "down" | "up";
  148. pointersMap: Gesture["pointers"];
  149. }) => void;
  150. }
  151. export type SceneData = {
  152. elements?: ImportedDataState["elements"];
  153. appState?: ImportedDataState["appState"];
  154. collaborators?: Map<string, Collaborator>;
  155. commitToHistory?: boolean;
  156. };