types.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 { SocketUpdateDataSource } from "./data";
  15. import { LinearElementEditor } from "./element/linearElementEditor";
  16. import { SuggestedBinding } from "./element/binding";
  17. export type FlooredNumber = number & { _brand: "FlooredNumber" };
  18. export type Point = Readonly<RoughPoint>;
  19. export type Collaborator = {
  20. pointer?: {
  21. x: number;
  22. y: number;
  23. };
  24. button?: "up" | "down";
  25. selectedElementIds?: AppState["selectedElementIds"];
  26. username?: string | null;
  27. };
  28. export type AppState = {
  29. isLoading: boolean;
  30. errorMessage: string | null;
  31. draggingElement: NonDeletedExcalidrawElement | null;
  32. resizingElement: NonDeletedExcalidrawElement | null;
  33. multiElement: NonDeleted<ExcalidrawLinearElement> | null;
  34. selectionElement: NonDeletedExcalidrawElement | null;
  35. isBindingEnabled: boolean;
  36. startBoundElement: NonDeleted<ExcalidrawBindableElement> | null;
  37. suggestedBindings: SuggestedBinding[];
  38. // element being edited, but not necessarily added to elements array yet
  39. // (e.g. text element when typing into the input)
  40. editingElement: NonDeletedExcalidrawElement | null;
  41. editingLinearElement: LinearElementEditor | null;
  42. elementType: typeof SHAPES[number]["value"];
  43. elementLocked: boolean;
  44. exportBackground: boolean;
  45. shouldAddWatermark: boolean;
  46. currentItemStrokeColor: string;
  47. currentItemBackgroundColor: string;
  48. currentItemFillStyle: string;
  49. currentItemStrokeWidth: number;
  50. currentItemStrokeStyle: ExcalidrawElement["strokeStyle"];
  51. currentItemRoughness: number;
  52. currentItemOpacity: number;
  53. currentItemFontFamily: FontFamily;
  54. currentItemFontSize: number;
  55. currentItemTextAlign: TextAlign;
  56. currentItemStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  57. currentItemLinearStrokeSharpness: ExcalidrawElement["strokeSharpness"];
  58. viewBackgroundColor: string;
  59. scrollX: FlooredNumber;
  60. scrollY: FlooredNumber;
  61. cursorX: number;
  62. cursorY: number;
  63. cursorButton: "up" | "down";
  64. scrolledOutside: boolean;
  65. name: string;
  66. username: string;
  67. isCollaborating: boolean;
  68. isResizing: boolean;
  69. isRotating: boolean;
  70. zoom: number;
  71. openMenu: "canvas" | "shape" | null;
  72. lastPointerDownWith: PointerType;
  73. selectedElementIds: { [id: string]: boolean };
  74. previousSelectedElementIds: { [id: string]: boolean };
  75. collaborators: Map<string, Collaborator>;
  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. };
  92. export type PointerCoords = Readonly<{
  93. x: number;
  94. y: number;
  95. }>;
  96. export type Gesture = {
  97. pointers: Map<number, PointerCoords>;
  98. lastCenter: { x: number; y: number } | null;
  99. initialDistance: number | null;
  100. initialScale: number | null;
  101. };
  102. export declare class GestureEvent extends UIEvent {
  103. readonly rotation: number;
  104. readonly scale: number;
  105. }
  106. export type SocketUpdateData = SocketUpdateDataSource[keyof SocketUpdateDataSource] & {
  107. _brand: "socketUpdateData";
  108. };
  109. export type LibraryItem = NonDeleted<ExcalidrawElement>[];
  110. export type LibraryItems = readonly LibraryItem[];
  111. export interface ExcalidrawProps {
  112. width: number;
  113. height: number;
  114. }