@dwelle/excalidraw 0.3.73 → 0.3.76-react18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dwelle/excalidraw",
3
- "version": "0.3.73",
3
+ "version": "0.3.76-react18",
4
4
  "main": "main.js",
5
5
  "types": "types/packages/excalidraw/index.d.ts",
6
6
  "files": [
@@ -1,11 +1,12 @@
1
1
  import React from "react";
2
2
  import { RoughCanvas } from "roughjs/bin/canvas";
3
3
  import { ActionManager } from "../actions/manager";
4
- import { ExcalidrawElement, NonDeletedExcalidrawElement } from "../element/types";
4
+ import { ExcalidrawElement, NonDeleted, NonDeletedExcalidrawElement } from "../element/types";
5
5
  import History from "../history";
6
6
  import Scene from "../scene/Scene";
7
7
  import { AppClassProperties, AppProps, AppState, ExcalidrawImperativeAPI, BinaryFiles, LibraryItems, SceneData, Device } from "../types";
8
8
  import { FileSystemHandle } from "../data/filesystem";
9
+ import { Emitter } from "../emitter";
9
10
  export declare const useDevice: () => Readonly<{
10
11
  isSmScreen: boolean;
11
12
  isMobile: boolean;
@@ -43,6 +44,163 @@ declare class App extends React.Component<AppProps, AppState> {
43
44
  x: number;
44
45
  y: number;
45
46
  } | null;
47
+ onChangeEmitter: Emitter<[elements: readonly ExcalidrawElement[], appState: AppState, files: BinaryFiles]>;
48
+ onPointerDownEmitter: Emitter<[activeTool: {
49
+ type: "line" | "arrow" | "text" | "selection" | "rectangle" | "diamond" | "ellipse" | "image" | "freedraw" | "eraser";
50
+ lastActiveToolBeforeEraser: import("../types").LastActiveToolBeforeEraser;
51
+ locked: boolean;
52
+ customType: null;
53
+ } | {
54
+ type: "custom";
55
+ customType: string;
56
+ lastActiveToolBeforeEraser: import("../types").LastActiveToolBeforeEraser;
57
+ locked: boolean;
58
+ }, pointerDownState: Readonly<{
59
+ origin: Readonly<{
60
+ x: number;
61
+ y: number;
62
+ }>;
63
+ originInGrid: Readonly<{
64
+ x: number;
65
+ y: number;
66
+ }>;
67
+ scrollbars: {
68
+ isOverEither: boolean;
69
+ isOverHorizontal: boolean;
70
+ isOverVertical: boolean;
71
+ };
72
+ lastCoords: {
73
+ x: number;
74
+ y: number;
75
+ };
76
+ originalElements: Map<string, NonDeleted<ExcalidrawElement>>;
77
+ resize: {
78
+ handleType: import("../element/transformHandles").MaybeTransformHandleType;
79
+ isResizing: boolean;
80
+ offset: {
81
+ x: number;
82
+ y: number;
83
+ };
84
+ arrowDirection: "end" | "origin";
85
+ center: {
86
+ x: number;
87
+ y: number;
88
+ };
89
+ };
90
+ hit: {
91
+ element: NonDeleted<ExcalidrawElement> | null;
92
+ allHitElements: NonDeleted<ExcalidrawElement>[];
93
+ wasAddedToSelection: boolean;
94
+ hasBeenDuplicated: boolean;
95
+ hasHitCommonBoundingBoxOfSelectedElements: boolean;
96
+ hasHitElementInside: boolean;
97
+ };
98
+ withCmdOrCtrl: boolean;
99
+ drag: {
100
+ hasOccurred: boolean;
101
+ offset: {
102
+ x: number;
103
+ y: number;
104
+ } | null;
105
+ };
106
+ eventListeners: {
107
+ onMove: {
108
+ (...args: any[]): void;
109
+ flush(): void;
110
+ cancel(): void;
111
+ } | null;
112
+ onUp: ((event: PointerEvent) => void) | null;
113
+ onKeyDown: ((event: KeyboardEvent) => void) | null;
114
+ onKeyUp: ((event: KeyboardEvent) => void) | null;
115
+ };
116
+ boxSelection: {
117
+ hasOccurred: boolean;
118
+ };
119
+ elementIdsToErase: {
120
+ [key: string]: {
121
+ opacity: number;
122
+ erase: boolean;
123
+ };
124
+ };
125
+ }>, event: React.PointerEvent<HTMLCanvasElement>]>;
126
+ onPointerUpEmitter: Emitter<[activeTool: {
127
+ type: "line" | "arrow" | "text" | "selection" | "rectangle" | "diamond" | "ellipse" | "image" | "freedraw" | "eraser";
128
+ lastActiveToolBeforeEraser: import("../types").LastActiveToolBeforeEraser;
129
+ locked: boolean;
130
+ customType: null;
131
+ } | {
132
+ type: "custom";
133
+ customType: string;
134
+ lastActiveToolBeforeEraser: import("../types").LastActiveToolBeforeEraser;
135
+ locked: boolean;
136
+ }, pointerDownState: Readonly<{
137
+ origin: Readonly<{
138
+ x: number;
139
+ y: number;
140
+ }>;
141
+ originInGrid: Readonly<{
142
+ x: number;
143
+ y: number;
144
+ }>;
145
+ scrollbars: {
146
+ isOverEither: boolean;
147
+ isOverHorizontal: boolean;
148
+ isOverVertical: boolean;
149
+ };
150
+ lastCoords: {
151
+ x: number;
152
+ y: number;
153
+ };
154
+ originalElements: Map<string, NonDeleted<ExcalidrawElement>>;
155
+ resize: {
156
+ handleType: import("../element/transformHandles").MaybeTransformHandleType;
157
+ isResizing: boolean;
158
+ offset: {
159
+ x: number;
160
+ y: number;
161
+ };
162
+ arrowDirection: "end" | "origin";
163
+ center: {
164
+ x: number;
165
+ y: number;
166
+ };
167
+ };
168
+ hit: {
169
+ element: NonDeleted<ExcalidrawElement> | null;
170
+ allHitElements: NonDeleted<ExcalidrawElement>[];
171
+ wasAddedToSelection: boolean;
172
+ hasBeenDuplicated: boolean;
173
+ hasHitCommonBoundingBoxOfSelectedElements: boolean;
174
+ hasHitElementInside: boolean;
175
+ };
176
+ withCmdOrCtrl: boolean;
177
+ drag: {
178
+ hasOccurred: boolean;
179
+ offset: {
180
+ x: number;
181
+ y: number;
182
+ } | null;
183
+ };
184
+ eventListeners: {
185
+ onMove: {
186
+ (...args: any[]): void;
187
+ flush(): void;
188
+ cancel(): void;
189
+ } | null;
190
+ onUp: ((event: PointerEvent) => void) | null;
191
+ onKeyDown: ((event: KeyboardEvent) => void) | null;
192
+ onKeyUp: ((event: KeyboardEvent) => void) | null;
193
+ };
194
+ boxSelection: {
195
+ hasOccurred: boolean;
196
+ };
197
+ elementIdsToErase: {
198
+ [key: string]: {
199
+ opacity: number;
200
+ erase: boolean;
201
+ };
202
+ };
203
+ }>, event: PointerEvent]>;
46
204
  constructor(props: AppProps);
47
205
  private renderCanvas;
48
206
  render(): JSX.Element;
@@ -84,7 +242,6 @@ declare class App extends React.Component<AppProps, AppState> {
84
242
  removePointer: (event: React.PointerEvent<HTMLElement> | PointerEvent) => void;
85
243
  toggleLock: (source?: "keyboard" | "ui") => void;
86
244
  togglePenMode: () => void;
87
- toggleZenMode: () => void;
88
245
  scrollToContent: (target?: ExcalidrawElement | readonly ExcalidrawElement[]) => void;
89
246
  setToast: (toast: {
90
247
  message: string;
@@ -3,4 +3,5 @@ import OpenColor from "open-color";
3
3
  import "./Card.scss";
4
4
  export declare const Card: React.FC<{
5
5
  color: keyof OpenColor | "primary";
6
+ children?: React.ReactNode;
6
7
  }>;
@@ -4,4 +4,5 @@ export declare const CheckboxItem: React.FC<{
4
4
  checked: boolean;
5
5
  onChange: (checked: boolean, event: React.MouseEvent) => void;
6
6
  className?: string;
7
+ children?: React.ReactNode;
7
8
  }>;
@@ -18,16 +18,13 @@ interface LayerUIProps {
18
18
  onLockToggle: () => void;
19
19
  onPenModeToggle: () => void;
20
20
  onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void;
21
- zenModeEnabled: boolean;
22
21
  showExitZenModeBtn: boolean;
23
22
  showThemeBtn: boolean;
24
- toggleZenMode: () => void;
25
23
  langCode: Language["code"];
26
24
  isCollaborating: boolean;
27
25
  renderTopRightUI?: ExcalidrawProps["renderTopRightUI"];
28
26
  renderCustomFooter?: ExcalidrawProps["renderFooter"];
29
27
  renderCustomStats?: ExcalidrawProps["renderCustomStats"];
30
- viewModeEnabled: boolean;
31
28
  libraryReturnUrl: ExcalidrawProps["libraryReturnUrl"];
32
29
  UIOptions: AppProps["UIOptions"];
33
30
  focusContainer: () => void;
@@ -37,5 +34,5 @@ interface LayerUIProps {
37
34
  insertOnCanvasDirectly: boolean;
38
35
  }) => void;
39
36
  }
40
- declare const _default: React.MemoExoticComponent<({ onHomeButtonClick, actionManager, appState, files, setAppState, canvas, elements, onCollabButtonClick, onLockToggle, onPenModeToggle, onInsertElements, zenModeEnabled, showExitZenModeBtn, showThemeBtn, toggleZenMode, isCollaborating, renderTopRightUI, renderCustomFooter, renderCustomStats, viewModeEnabled, libraryReturnUrl, UIOptions, focusContainer, library, id, onImageAction, }: LayerUIProps) => JSX.Element>;
37
+ declare const _default: React.MemoExoticComponent<({ onHomeButtonClick, actionManager, appState, files, setAppState, canvas, elements, onCollabButtonClick, onLockToggle, onPenModeToggle, onInsertElements, showExitZenModeBtn, showThemeBtn, isCollaborating, renderTopRightUI, renderCustomFooter, renderCustomStats, libraryReturnUrl, UIOptions, focusContainer, library, id, onImageAction, }: LayerUIProps) => JSX.Element>;
41
38
  export default _default;
@@ -17,7 +17,6 @@ declare type MobileMenuProps = {
17
17
  canvas: HTMLCanvasElement | null;
18
18
  isCollaborating: boolean;
19
19
  renderCustomFooter?: (isMobile: boolean, appState: AppState) => JSX.Element | null;
20
- viewModeEnabled: boolean;
21
20
  showThemeBtn: boolean;
22
21
  onImageAction: (data: {
23
22
  insertOnCanvasDirectly: boolean;
@@ -26,5 +25,5 @@ declare type MobileMenuProps = {
26
25
  renderStats: () => JSX.Element | null;
27
26
  UIOptions: AppProps["UIOptions"];
28
27
  };
29
- export declare const MobileMenu: ({ onHomeButtonClick, appState, elements, libraryMenu, actionManager, renderJSONExportDialog, renderImageExportDialog, setAppState, onCollabButtonClick, onLockToggle, onPenModeToggle, canvas, isCollaborating, renderCustomFooter, viewModeEnabled, showThemeBtn, onImageAction, renderTopRightUI, renderStats, UIOptions, }: MobileMenuProps) => JSX.Element;
28
+ export declare const MobileMenu: ({ onHomeButtonClick, appState, elements, libraryMenu, actionManager, renderJSONExportDialog, renderImageExportDialog, setAppState, onCollabButtonClick, onLockToggle, onPenModeToggle, canvas, isCollaborating, renderCustomFooter, showThemeBtn, onImageAction, renderTopRightUI, renderStats, UIOptions, }: MobileMenuProps) => JSX.Element;
30
29
  export {};
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
- interface SectionProps extends React.HTMLProps<HTMLElement> {
2
+ export declare const Section: React.FC<{
3
3
  heading: string;
4
- children: React.ReactNode | ((header: React.ReactNode) => React.ReactNode);
5
- }
6
- export declare const Section: ({ heading, children, ...props }: SectionProps) => JSX.Element;
7
- export {};
4
+ children?: React.ReactNode | ((heading: React.ReactNode) => React.ReactNode);
5
+ className?: string;
6
+ }>;
@@ -0,0 +1,21 @@
1
+ declare type Subscriber<T extends any[]> = (...payload: T) => void;
2
+ export declare class Emitter<T extends any[] = []> {
3
+ subscribers: Subscriber<T>[];
4
+ value: T | undefined;
5
+ private updateOnChangeOnly;
6
+ constructor(opts?: {
7
+ initialState?: T;
8
+ updateOnChangeOnly?: boolean;
9
+ });
10
+ /**
11
+ * Attaches subscriber
12
+ *
13
+ * @returns unsubscribe function
14
+ */
15
+ on(...handlers: Subscriber<T>[] | Subscriber<T>[][]): () => void;
16
+ once(...handlers: Subscriber<T>[] | Subscriber<T>[][]): () => void;
17
+ off(...handlers: Subscriber<T>[] | Subscriber<T>[][]): void;
18
+ trigger(...payload: T): any[];
19
+ destroy(): void;
20
+ }
21
+ export {};
@@ -3,7 +3,7 @@ import { RoughSVG } from "roughjs/bin/svg";
3
3
  import { AppState, BinaryFiles } from "../types";
4
4
  import { NonDeletedExcalidrawElement } from "../element/types";
5
5
  import { RenderConfig } from "../scene/types";
6
- export declare const renderScene: (elements: readonly NonDeletedExcalidrawElement[], appState: AppState, selectionElement: NonDeletedExcalidrawElement | null, scale: number, rc: RoughCanvas, canvas: HTMLCanvasElement, renderConfig: RenderConfig) => {
6
+ export declare const _renderScene: (elements: readonly NonDeletedExcalidrawElement[], appState: AppState, selectionElement: NonDeletedExcalidrawElement | null, scale: number, rc: RoughCanvas, canvas: HTMLCanvasElement, renderConfig: RenderConfig) => {
7
7
  atLeastOneVisibleElement: boolean;
8
8
  scrollBars?: undefined;
9
9
  } | {
@@ -11,10 +11,12 @@ export declare const renderScene: (elements: readonly NonDeletedExcalidrawElemen
11
11
  scrollBars: import("../scene/types").ScrollBars | undefined;
12
12
  };
13
13
  /** renderScene throttled to animation framerate */
14
- export declare const renderSceneThrottled: {
15
- (elements: readonly NonDeletedExcalidrawElement[], appState: AppState, selectionElement: NonDeletedExcalidrawElement | null, scale: number, rc: RoughCanvas, canvas: HTMLCanvasElement, renderConfig: RenderConfig, callback?: ((data: ReturnType<typeof renderScene>) => void) | undefined): void;
16
- flush(): void;
17
- cancel(): void;
14
+ export declare const renderScene: <T extends boolean = false>(elements: readonly NonDeletedExcalidrawElement[], appState: AppState, selectionElement: NonDeletedExcalidrawElement | null, scale: number, rc: RoughCanvas, canvas: HTMLCanvasElement, renderConfig: RenderConfig, callback?: ((data: ReturnType<typeof _renderScene>) => void) | undefined, throttle?: T | undefined) => T extends true ? void : {
15
+ atLeastOneVisibleElement: boolean;
16
+ scrollBars?: undefined;
17
+ } | {
18
+ atLeastOneVisibleElement: boolean;
19
+ scrollBars: import("../scene/types").ScrollBars | undefined;
18
20
  };
19
21
  export declare const renderSceneToSvg: (elements: readonly NonDeletedExcalidrawElement[], rsvg: RoughSVG, svgRoot: SVGElement, files: BinaryFiles, { offsetX, offsetY, exportWithDarkMode, }?: {
20
22
  offsetX?: number | undefined;
package/types/types.d.ts CHANGED
@@ -356,6 +356,7 @@ export declare type PointerDownState = Readonly<{
356
356
  };
357
357
  };
358
358
  }>;
359
+ declare type UnsubscribeCallback = () => void;
359
360
  export declare type ExcalidrawImperativeAPI = {
360
361
  updateScene: InstanceType<typeof App>["updateScene"];
361
362
  updateLibrary: InstanceType<typeof Library>["updateLibrary"];
@@ -378,6 +379,9 @@ export declare type ExcalidrawImperativeAPI = {
378
379
  setCursor: InstanceType<typeof App>["setCursor"];
379
380
  resetCursor: InstanceType<typeof App>["resetCursor"];
380
381
  app: InstanceType<typeof App>;
382
+ onChange: (callback: (elements: readonly ExcalidrawElement[], appState: AppState, files: BinaryFiles) => void) => UnsubscribeCallback;
383
+ onPointerDown: (callback: (activeTool: AppState["activeTool"], pointerDownState: PointerDownState, event: React.PointerEvent<HTMLCanvasElement>) => void) => UnsubscribeCallback;
384
+ onPointerUp: (callback: (activeTool: AppState["activeTool"], pointerDownState: PointerDownState, event: PointerEvent) => void) => UnsubscribeCallback;
381
385
  };
382
386
  export declare type Device = Readonly<{
383
387
  isSmScreen: boolean;