@excalidraw/math 0.18.0-4ce38fb → 0.18.0-4ce8305

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.
Files changed (82) hide show
  1. package/dist/types/common/src/utils.d.ts +7 -1
  2. package/dist/types/element/src/align.d.ts +4 -1
  3. package/dist/types/element/src/binding.d.ts +36 -0
  4. package/dist/types/element/src/bounds.d.ts +10 -2
  5. package/dist/types/element/src/collision.d.ts +7 -0
  6. package/dist/types/element/src/cropElement.d.ts +36 -4
  7. package/dist/types/element/src/delta.d.ts +7 -1
  8. package/dist/types/element/src/distribute.d.ts +4 -1
  9. package/dist/types/element/src/dragElements.d.ts +8 -3
  10. package/dist/types/element/src/elbowArrow.d.ts +5 -0
  11. package/dist/types/element/src/embeddable.d.ts +2 -1
  12. package/dist/types/element/src/groups.d.ts +1 -6
  13. package/dist/types/element/src/image.d.ts +5 -2
  14. package/dist/types/element/src/index.d.ts +1 -0
  15. package/dist/types/element/src/linearElementEditor.d.ts +4 -1
  16. package/dist/types/element/src/listMarker.d.ts +7 -2
  17. package/dist/types/element/src/newElement.d.ts +3 -1
  18. package/dist/types/element/src/renderElement.d.ts +10 -0
  19. package/dist/types/element/src/renderEnvironment.d.ts +66 -0
  20. package/dist/types/element/src/resizeElements.d.ts +15 -5
  21. package/dist/types/element/src/selection.d.ts +1 -7
  22. package/dist/types/element/src/shape.d.ts +2 -0
  23. package/dist/types/element/src/stickyNote.d.ts +8 -0
  24. package/dist/types/element/src/textElement.d.ts +3 -2
  25. package/dist/types/element/src/textMeasurements.d.ts +15 -11
  26. package/dist/types/element/src/textWrapping.d.ts +3 -2
  27. package/dist/types/element/src/transform.d.ts +5 -1
  28. package/dist/types/excalidraw/actions/actionBoundText.d.ts +46 -221
  29. package/dist/types/excalidraw/actions/actionCanvas.d.ts +6 -6
  30. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +4 -588
  31. package/dist/types/excalidraw/actions/actionDeselect.d.ts +1 -1
  32. package/dist/types/excalidraw/actions/actionExport.d.ts +7 -7
  33. package/dist/types/excalidraw/actions/actionFrame.d.ts +41 -525
  34. package/dist/types/excalidraw/actions/actionGroup.d.ts +2 -2
  35. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +1 -1
  36. package/dist/types/excalidraw/actions/actionToggleWrap.d.ts +12 -0
  37. package/dist/types/excalidraw/actions/index.d.ts +1 -0
  38. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  39. package/dist/types/excalidraw/actions/types.d.ts +1 -1
  40. package/dist/types/excalidraw/appState.d.ts +7 -7
  41. package/dist/types/excalidraw/charts/charts.bar.d.ts +2 -1
  42. package/dist/types/excalidraw/charts/charts.helpers.d.ts +6 -5
  43. package/dist/types/excalidraw/charts/charts.line.d.ts +2 -1
  44. package/dist/types/excalidraw/charts/charts.radar.d.ts +2 -1
  45. package/dist/types/excalidraw/charts/index.d.ts +2 -1
  46. package/dist/types/excalidraw/components/App.d.ts +34 -20
  47. package/dist/types/excalidraw/components/App.host.d.ts +102 -0
  48. package/dist/types/excalidraw/components/App.modifiers.d.ts +38 -0
  49. package/dist/types/excalidraw/components/App.selection.d.ts +265 -0
  50. package/dist/types/excalidraw/components/App.selectionTool.d.ts +93 -0
  51. package/dist/types/excalidraw/components/App.viewport.d.ts +13 -3
  52. package/dist/types/excalidraw/components/App.wrap.d.ts +31 -0
  53. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -1
  54. package/dist/types/excalidraw/components/Stats/utils.d.ts +4 -2
  55. package/dist/types/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +2 -1
  56. package/dist/types/excalidraw/components/TTDDialog/TTDDialogOutput.d.ts +5 -2
  57. package/dist/types/excalidraw/components/TTDDialog/TTDPreviewPanel.d.ts +5 -2
  58. package/dist/types/excalidraw/components/TTDDialog/TextToDiagram.d.ts +2 -1
  59. package/dist/types/excalidraw/components/TTDDialog/common.d.ts +4 -1
  60. package/dist/types/excalidraw/components/TTDDialog/hooks/useTextGeneration.d.ts +3 -2
  61. package/dist/types/excalidraw/components/TTDDialog/types.d.ts +14 -1
  62. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidError.d.ts +27 -1
  63. package/dist/types/excalidraw/components/Tooltip.d.ts +11 -1
  64. package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +1 -1
  65. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +0 -1
  66. package/dist/types/excalidraw/components/hyperlink/Hyperlink.d.ts +3 -2
  67. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +13 -2
  68. package/dist/types/excalidraw/data/blob.d.ts +14 -14
  69. package/dist/types/excalidraw/data/index.d.ts +3 -3
  70. package/dist/types/excalidraw/data/json.d.ts +7 -7
  71. package/dist/types/excalidraw/fonts/Fonts.d.ts +9 -6
  72. package/dist/types/excalidraw/history.d.ts +10 -4
  73. package/dist/types/excalidraw/reactUtils.d.ts +1 -1
  74. package/dist/types/excalidraw/renderer/animation.d.ts +11 -4
  75. package/dist/types/excalidraw/renderer/staticScene.d.ts +11 -6
  76. package/dist/types/excalidraw/scene/Renderer.d.ts +1 -1
  77. package/dist/types/excalidraw/scene/export.d.ts +343 -20
  78. package/dist/types/excalidraw/scene/types.d.ts +23 -1
  79. package/dist/types/excalidraw/types.d.ts +49 -1
  80. package/dist/types/utils/src/index.d.ts +3 -1
  81. package/package.json +2 -2
  82. package/dist/types/utils/src/export.d.ts +0 -36
@@ -1,31 +1,299 @@
1
- import type { ExcalidrawFrameLikeElement, NonDeleted, NonDeletedExcalidrawElement } from "@excalidraw/element/types";
1
+ import { MIME_TYPES } from "@excalidraw/common";
2
+ import type { RenderEnvironment } from "@excalidraw/element";
3
+ import type { ExcalidrawFrameLikeElement, NonDeleted, NonDeletedExcalidrawElement, Theme } from "@excalidraw/element/types";
4
+ import { cleanAppStateForExport } from "../appState";
2
5
  import type { AppState, BinaryFiles } from "../types";
3
- export declare const exportToCanvas: (elements: readonly NonDeletedExcalidrawElement[], appState: AppState, files: BinaryFiles, { exportBackground, exportPadding, viewBackgroundColor, exportingFrame, }: {
4
- exportBackground: boolean;
5
- exportPadding?: number;
6
- viewBackgroundColor: string;
6
+ export type ExportSceneData = {
7
+ elements: readonly NonDeletedExcalidrawElement[];
8
+ /**
9
+ * The scene settings a `.excalidraw` file stores (`viewBackgroundColor`,
10
+ * grid settings) — not editor state. Used as the default background
11
+ * (`canvasBackgroundColor`) and embedded with the scene (`embedScene`).
12
+ * Anything else passed in is ignored; rendering options go to `config`.
13
+ */
14
+ appState?: ReturnType<typeof cleanAppStateForExport>;
15
+ files?: BinaryFiles | null;
16
+ };
17
+ /**
18
+ * The host capabilities an export uses, shared by every format: e.g. for test
19
+ * environments, Node.js or another window.
20
+ *
21
+ * Unlike the editor's `renderEnvironment` prop, this needn't be the same
22
+ * object across exports (e.g. on a server): exports draw without the element
23
+ * caches keyed by an environment, and measure little text. Passing a complete
24
+ * one (`createCanvas` and `createImage`) as-is, as the editor does, only keeps
25
+ * its measuring caches warm.
26
+ */
27
+ type ExportEnvironment = {
28
+ /**
29
+ * Creates the canvas a canvas/PNG/JPEG export renders into, and any canvas
30
+ * the export measures text with (e.g. frame labels, embed placeholders).
31
+ *
32
+ * Do not set `canvas.width/height` or modify the canvas context as that's
33
+ * handled by Excalidraw.
34
+ *
35
+ * Defaults to `document.createElement("canvas")`.
36
+ */
37
+ createCanvas?: RenderEnvironment["createCanvas"];
38
+ /**
39
+ * Creates the images that image elements are decoded into.
40
+ *
41
+ * Defaults to `new Image()`.
42
+ */
43
+ createImage?: RenderEnvironment["createImage"];
44
+ /**
45
+ * Creates the paths that freedraw elements are filled through.
46
+ *
47
+ * Defaults to the global `Path2D`.
48
+ */
49
+ createPath?: RenderEnvironment["createPath"];
50
+ /**
51
+ * The document an SVG export is built in, e.g. a popout window's or,
52
+ * outside the browser, a DOM implementation's (such as `linkedom`).
53
+ *
54
+ * Defaults to the global `document`.
55
+ */
56
+ document?: RenderEnvironment["document"];
57
+ /**
58
+ * Measures text (frame labels, embed placeholders), e.g. where there is no
59
+ * canvas to measure on.
60
+ *
61
+ * Defaults to the global provider set with `setCustomTextMetricsProvider`,
62
+ * else to measuring on a canvas from `createCanvas`.
63
+ */
64
+ textMetrics?: RenderEnvironment["textMetrics"];
65
+ /**
66
+ * Loads the fonts the exported elements use, before rendering.
67
+ *
68
+ * Defaults to loading them through the browser's
69
+ * [FontFace API](https://developer.mozilla.org/en-US/docs/Web/API/FontFace).
70
+ */
71
+ loadFonts?: () => Promise<void>;
72
+ };
73
+ type ExportSceneBaseConfig = {
74
+ /**
75
+ * @default "light"
76
+ */
77
+ theme?: Theme;
78
+ /**
79
+ * Canvas background. Valid values are:
80
+ *
81
+ * - `undefined` - the background of "appState.viewBackgroundColor" is used.
82
+ * - `false` - no background is used (transparent). Not supported for JPEG,
83
+ * which falls back to the default.
84
+ * - `string` - should be a valid CSS color.
85
+ *
86
+ * Specified in light-theme terms: `theme: "dark"` transforms it like any
87
+ * other scene color. Only affects the rendered image, not the embedded
88
+ * scene (`embedScene`).
89
+ *
90
+ * @default undefined
91
+ */
92
+ canvasBackgroundColor?: string | false;
93
+ /**
94
+ * Canvas padding in pixels. Affected by `scale`.
95
+ *
96
+ * When `fit` is `none`, padding is added around the content bounding box,
97
+ * or around the `width`/`height` frame if set — in which case the content
98
+ * may overflow the frame, thus right or bottom padding may be ignored.
99
+ *
100
+ * When `fit` is `contain`, or `maxWidthOrHeight`/`widthOrHeight` is set,
101
+ * padding is subtracted from the target size (so the export doesn't exceed
102
+ * it, `scale` aside), and serves as a minimum distance between the content
103
+ * and the canvas edges — it may be exceeded on one axis to maintain the
104
+ * aspect ratio. It is recommended to set `position` to `center` when using
105
+ * `fit: "contain"`.
106
+ *
107
+ * @default 10
108
+ */
109
+ padding?: number;
110
+ /**
111
+ * A multiplier to increase/decrease the frame dimensions
112
+ * (content resolution).
113
+ *
114
+ * For example, if your canvas is 300x150 and you set scale to 2, the
115
+ * resulting size will be 600x300.
116
+ *
117
+ * Can be a function, which receives the export dimensions at scale 1
118
+ * (padding included) and returns the multiplier — e.g. to cap the output
119
+ * by a pixel budget.
120
+ *
121
+ * @default 1
122
+ */
123
+ scale?: number | ((width: number, height: number) => number);
124
+ /**
125
+ * Host environment overrides, e.g. for test environments or Node.js.
126
+ */
127
+ environment?: ExportEnvironment;
7
128
  exportingFrame?: NonDeleted<ExcalidrawFrameLikeElement> | null;
8
- }, createCanvas?: (width: number, height: number) => {
9
- canvas: HTMLCanvasElement;
129
+ /**
130
+ * Which frame decorations to render. Ignored when exporting a single frame
131
+ * (`exportingFrame`), which renders neither its name nor outline, and clips
132
+ * to it.
133
+ *
134
+ * @default { name: true, outline: true, clip: true }
135
+ */
136
+ frames?: {
137
+ name?: boolean;
138
+ outline?: boolean;
139
+ clip?: boolean;
140
+ };
141
+ };
142
+ /**
143
+ * The ways to size the export — only one can be used. The positioning options
144
+ * (`fit`, `position`, `x`, `y`, `origin`) belong to `width`/`height` (or no
145
+ * size option).
146
+ */
147
+ type ExportSizeOptions = {
148
+ /**
149
+ * Makes sure the canvas content fits into a frame of width/height no larger
150
+ * than this value, while maintaining the aspect ratio.
151
+ *
152
+ * Final dimensions can get smaller/larger if used in conjunction with
153
+ * `scale`.
154
+ *
155
+ * Can't be combined with `width`/`height`, `widthOrHeight`, or the
156
+ * positioning options (`fit`, `position`, `x`, `y`, `origin`).
157
+ */
158
+ maxWidthOrHeight?: number;
159
+ /**
160
+ * Scale the canvas content to be exactly this many pixels wide/tall,
161
+ * maintaining the aspect ratio.
162
+ *
163
+ * Final dimensions can get smaller/larger if used in conjunction with
164
+ * `scale`.
165
+ *
166
+ * Can't be combined with `width`/`height`, `maxWidthOrHeight`, or the
167
+ * positioning options (`fit`, `position`, `x`, `y`, `origin`).
168
+ */
169
+ widthOrHeight?: number;
170
+ /**
171
+ * Width of the frame. Supply `x` or `y` if you want to offset the canvas
172
+ * content.
173
+ *
174
+ * If `width` omitted but `height` supplied, `width` is calculated from the
175
+ * content's aspect ratio when `fit` is `contain` (the default), or is the
176
+ * content bounding box width when `fit` is `none`.
177
+ *
178
+ * Defaults to the content bounding box width when both `width` and `height`
179
+ * are omitted.
180
+ *
181
+ * Can't be combined with `maxWidthOrHeight` or `widthOrHeight`.
182
+ */
183
+ width?: number;
184
+ /**
185
+ * Height of the frame.
186
+ *
187
+ * If `height` omitted but `width` supplied, `height` is calculated from the
188
+ * content's aspect ratio when `fit` is `contain` (the default), or is the
189
+ * content bounding box height when `fit` is `none`.
190
+ *
191
+ * Defaults to the content bounding box height when both `width` and `height`
192
+ * are omitted.
193
+ *
194
+ * Can't be combined with `maxWidthOrHeight` or `widthOrHeight`.
195
+ */
196
+ height?: number;
197
+ /**
198
+ * Left edge of the exported region (`padding` is added around it). By
199
+ * default the coordinate is relative to the canvas. You can switch to
200
+ * content coordinates by setting `origin` to `content`.
201
+ *
202
+ * Defaults to the `x` position of the content bounding box.
203
+ *
204
+ * Can't be combined with `maxWidthOrHeight` or `widthOrHeight`, and is
205
+ * ignored with `fit: "contain"`, so setting `x` or `y` makes `fit` default
206
+ * to `none` (cropping the region).
207
+ */
208
+ x?: number;
209
+ /**
210
+ * Top edge of the exported region (`padding` is added around it). By
211
+ * default the coordinate is relative to the canvas. You can switch to
212
+ * content coordinates by setting `origin` to `content`.
213
+ *
214
+ * Defaults to the `y` position of the content bounding box.
215
+ *
216
+ * Can't be combined with `maxWidthOrHeight` or `widthOrHeight`, and is
217
+ * ignored with `fit: "contain"`, so setting `x` or `y` makes `fit` default
218
+ * to `none` (cropping the region).
219
+ */
220
+ y?: number;
221
+ /**
222
+ * Indicates the coordinate system of the `x` and `y` values.
223
+ *
224
+ * - `canvas` - `x` and `y` are relative to the canvas [0, 0] position.
225
+ * - `content` - `x` and `y` are relative to the content bounding box.
226
+ *
227
+ * Can't be combined with `maxWidthOrHeight` or `widthOrHeight`.
228
+ *
229
+ * @default "canvas"
230
+ */
231
+ origin?: "canvas" | "content";
232
+ /**
233
+ * How the content should be scaled into the `width`/`height` frame.
234
+ *
235
+ * Behavior aligns with the `object-fit` CSS property.
236
+ *
237
+ * - `none` - no scaling.
238
+ * - `contain` - scale to fit the frame. Includes `padding`.
239
+ *
240
+ * Can't be combined with `maxWidthOrHeight` or `widthOrHeight`.
241
+ *
242
+ * @default "contain" if `width` or `height` is set (and `x`/`y` aren't),
243
+ * otherwise "none"
244
+ */
245
+ fit?: "none" | "contain";
246
+ /**
247
+ * When either `x` or `y` are not specified, indicates how the canvas should
248
+ * be aligned on the respective axis.
249
+ *
250
+ * - `topLeft` - canvas aligned to top left.
251
+ * - `center` - canvas is centered on the axis which is not specified
252
+ * (or both).
253
+ *
254
+ * Can't be combined with `maxWidthOrHeight` or `widthOrHeight`.
255
+ *
256
+ * @default "center"
257
+ */
258
+ position?: "center" | "topLeft";
259
+ };
260
+ type ExportSizeOption<K extends keyof ExportSizeOptions> = Pick<ExportSizeOptions, K> & {
261
+ [P in keyof ExportSizeOptions as P extends K ? never : P]?: never;
262
+ };
263
+ type ExportSizeConfig = ExportSizeOption<"width" | "height" | "fit" | "position" | "x" | "y" | "origin"> | ExportSizeOption<"maxWidthOrHeight"> | ExportSizeOption<"widthOrHeight">;
264
+ export type ExportSceneConfig = ExportSceneBaseConfig & ExportSizeConfig;
265
+ /**
266
+ * The export config the editor's export settings translate to. Internal: hosts
267
+ * pass their own config.
268
+ */
269
+ export declare const getExportConfigFromAppState: (appState: Pick<AppState, "exportWithDarkMode" | "exportBackground" | "viewBackgroundColor" | "exportScale" | "frameRendering">) => {
270
+ theme: "light" | "dark";
271
+ canvasBackgroundColor: string | false;
10
272
  scale: number;
11
- }, loadFonts?: () => Promise<void>) => Promise<HTMLCanvasElement>;
12
- export declare const exportToSvg: (elements: readonly NonDeletedExcalidrawElement[], appState: {
13
- exportBackground: boolean;
14
- exportPadding?: number;
15
- exportScale?: number;
16
- viewBackgroundColor: string;
17
- exportWithDarkMode?: boolean;
18
- exportEmbedScene?: boolean;
19
- frameRendering?: AppState["frameRendering"];
20
- }, files: BinaryFiles | null, opts?: {
273
+ frames: {
274
+ enabled: boolean;
275
+ name: boolean;
276
+ outline: boolean;
277
+ clip: boolean;
278
+ } | {
279
+ name: boolean;
280
+ outline: boolean;
281
+ clip: boolean;
282
+ };
283
+ };
284
+ type ExportToSvgConfig = Pick<ExportSceneBaseConfig, "canvasBackgroundColor" | "padding" | "theme" | "exportingFrame" | "scale" | "frames" | "environment"> & ExportSizeConfig & {
21
285
  /**
22
286
  * if true, all embeddables passed in will be rendered when possible.
23
287
  */
24
288
  renderEmbeddables?: boolean;
25
- exportingFrame?: NonDeleted<ExcalidrawFrameLikeElement> | null;
26
289
  skipInliningFonts?: true;
27
290
  reuseImages?: boolean;
28
- }) => Promise<SVGSVGElement>;
291
+ /**
292
+ * Embeds the scene into the SVG, so that it can be imported back into
293
+ * Excalidraw.
294
+ */
295
+ embedScene?: boolean;
296
+ };
29
297
  export declare const encodeSvgBase64Payload: ({ payload, metadataElement, }: {
30
298
  payload: string;
31
299
  metadataElement: SVGMetadataElement;
@@ -33,4 +301,59 @@ export declare const encodeSvgBase64Payload: ({ payload, metadataElement, }: {
33
301
  export declare const decodeSvgBase64Payload: ({ svg }: {
34
302
  svg: string;
35
303
  }) => string;
36
- export declare const getExportSize: (elements: readonly NonDeletedExcalidrawElement[], exportPadding: number, scale: number) => [number, number];
304
+ export { MIME_TYPES };
305
+ type ExportToPngConfig = ExportSceneConfig & {
306
+ /**
307
+ * Embeds the scene into the PNG metadata, so that it can be imported back
308
+ * into Excalidraw.
309
+ */
310
+ embedScene?: boolean;
311
+ };
312
+ type ExportToJpegConfig = ExportSceneConfig & {
313
+ /**
314
+ * Encoding quality between 0 and 1.
315
+ *
316
+ * @default 0.92
317
+ */
318
+ quality?: number;
319
+ };
320
+ export type ExportSceneOptions = {
321
+ data: ExportSceneData;
322
+ } & ({
323
+ type: "canvas";
324
+ config?: ExportSceneConfig;
325
+ } | {
326
+ type: "png";
327
+ config?: ExportToPngConfig;
328
+ } | {
329
+ type: "jpeg";
330
+ config?: ExportToJpegConfig;
331
+ } | {
332
+ type: "svg";
333
+ config?: ExportToSvgConfig;
334
+ });
335
+ /**
336
+ * Exports the scene to a canvas, a PNG or JPEG blob, or an SVG element.
337
+ */
338
+ export declare function exportScene(opts: Extract<ExportSceneOptions, {
339
+ type: "canvas";
340
+ }>): Promise<HTMLCanvasElement>;
341
+ export declare function exportScene(opts: Extract<ExportSceneOptions, {
342
+ type: "png" | "jpeg";
343
+ }>): Promise<Blob>;
344
+ export declare function exportScene(opts: Extract<ExportSceneOptions, {
345
+ type: "svg";
346
+ }>): Promise<SVGSVGElement>;
347
+ export declare function exportScene(opts: ExportSceneOptions): Promise<HTMLCanvasElement | Blob | SVGSVGElement>;
348
+ export declare const exportToClipboard: (opts: {
349
+ data: ExportSceneData;
350
+ } & ({
351
+ type: "png";
352
+ config?: ExportToPngConfig;
353
+ } | {
354
+ type: "svg";
355
+ config?: ExportToSvgConfig;
356
+ } | {
357
+ type: "json";
358
+ config?: never;
359
+ })) => Promise<void>;
@@ -1,12 +1,28 @@
1
1
  import type { UserIdleState, EditorInterface } from "@excalidraw/common";
2
- import type { ExcalidrawElement, NonDeletedElementsMap, NonDeletedExcalidrawElement, NonDeletedSceneElementsMap } from "@excalidraw/element/types";
2
+ import type { ExcalidrawElement, ExcalidrawFrameLikeElement, NonDeletedElementsMap, NonDeletedExcalidrawElement, NonDeletedSceneElementsMap } from "@excalidraw/element/types";
3
3
  import type { MakeBrand } from "@excalidraw/common/utility-types";
4
+ import type { RenderEnvironment } from "@excalidraw/element/renderEnvironment";
4
5
  import type { AppClassProperties, AppState, EmbedsValidationStatus, ElementRenderOverrides, ElementsPendingErasure, InteractiveCanvasAppState, StaticCanvasAppState, SocketId, PendingExcalidrawElements } from "../types";
5
6
  import type { RoughCanvas } from "roughjs/bin/canvas";
6
7
  import type { Drawable } from "roughjs/bin/core";
7
8
  export type RenderableElementsMap = NonDeletedElementsMap & MakeBrand<"RenderableElementsMap">;
8
9
  export type StaticCanvasRenderConfig = {
9
10
  canvasBackgroundColor: AppState["viewBackgroundColor"];
11
+ /**
12
+ * Backing-store scale the target canvas was bootstrapped with -- the owner
13
+ * window's devicePixelRatio when rendering into the editor, exportScale when
14
+ * exporting. Element caches are built and blitted at this ratio, so it must
15
+ * be the same value passed as `StaticSceneRenderConfig["scale"]`.
16
+ */
17
+ scale: number;
18
+ /**
19
+ * Host environment that creates the canvases and images this render
20
+ * rasterizes (per-editor owner window in the app; the export's
21
+ * `config.environment` when exporting). Defaults to the browser's.
22
+ */
23
+ renderEnvironment?: RenderEnvironment;
24
+ /** export only: clips everything drawn to this frame (square corners) */
25
+ clipToFrame?: ExcalidrawFrameLikeElement | null;
10
26
  imageCache: AppClassProperties["imageCache"];
11
27
  renderGrid: boolean;
12
28
  /** whether to render link icons on elements with links (never rendered
@@ -22,6 +38,12 @@ export type StaticCanvasRenderConfig = {
22
38
  elementRenderOverrides?: ElementRenderOverrides;
23
39
  };
24
40
  export type SVGRenderConfig = {
41
+ /**
42
+ * Host environment used for the text measurements this render needs (the
43
+ * SVG itself is built through `exportToSvg`'s owner document). Defaults to
44
+ * the browser's.
45
+ */
46
+ renderEnvironment?: RenderEnvironment;
25
47
  offsetX: number;
26
48
  offsetY: number;
27
49
  isExporting: boolean;
@@ -3,7 +3,7 @@ import type { LinearElementEditor } from "@excalidraw/element";
3
3
  import type { ListMarkerAdvance, MaybeTransformHandleType } from "@excalidraw/element";
4
4
  import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, ExcalidrawArrowElement, Arrowhead, FontFamilyValues, FileId, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement, BindMode, ExcalidrawTextElement, StrokeVariability } from "@excalidraw/element/types";
5
5
  import type { Merge, MaybePromise, ValueOf, MakeBrand } from "@excalidraw/common/utility-types";
6
- import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement, OnDuplicateData } from "@excalidraw/element";
6
+ import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement, RenderEnvironment, OnDuplicateData } from "@excalidraw/element";
7
7
  import type { GlobalPoint } from "@excalidraw/math";
8
8
  import type { Action } from "./actions/types";
9
9
  import type { Spreadsheet } from "./charts";
@@ -692,6 +692,30 @@ export interface ExcalidrawProps {
692
692
  * @default document
693
693
  */
694
694
  ownerDocument?: Document;
695
+ /**
696
+ * Host environment used by the renderer and export pipeline to create
697
+ * canvases and images. Supply a custom implementation to redirect canvas
698
+ * creation and image decoding to e.g. a host canvas pool, an
699
+ * `OffscreenCanvas`, or a non-DOM image decoder. When omitted, canvas and
700
+ * image creation fall back to `ownerDocument` / `ownerWindow`.
701
+ *
702
+ * The value must be referentially stable -- every render cache (element
703
+ * canvases, text metrics, char widths, link icons) is keyed by this
704
+ * object's identity, so a new identity is a full cache miss. Passing an
705
+ * inline object literal mints a fresh identity on every React render,
706
+ * which silently re-rasterizes every element on every frame; hoist it to a
707
+ * module constant or memoize it (e.g. `useMemo`) instead.
708
+ *
709
+ * Only `createCanvas` and `createImage` are required. `createPath` (used to
710
+ * fill freedraw strokes) falls back to the global `Path2D`, which every
711
+ * browser has -- a non-browser host without one must supply it. Pass
712
+ * `document` (the owner document) for SVG exports to be built in it rather
713
+ * than in the global `document`, and `textMetrics` to measure the editor's
714
+ * text with your own provider.
715
+ *
716
+ * @default { createCanvas: () => ownerDocument.createElement("canvas"), createImage: () => new ownerWindow.Image(), createPath: (d) => new ownerWindow.Path2D(d), document: ownerDocument }
717
+ */
718
+ renderEnvironment?: RenderEnvironment;
695
719
  onChange?: (elements: readonly OrderedExcalidrawElement[], appState: AppState, files: BinaryFiles) => void;
696
720
  onThemeChange?: (theme: Theme | "system") => void;
697
721
  /**
@@ -960,6 +984,7 @@ export type AppClassProperties = {
960
984
  state: AppState;
961
985
  readonly ownerDocument: Document;
962
986
  readonly ownerWindow: Window & typeof globalThis;
987
+ renderEnvironment: RenderEnvironment;
963
988
  api: App["api"];
964
989
  sessionExportThemeOverride: App["sessionExportThemeOverride"];
965
990
  interactiveCanvas: HTMLCanvasElement | null;
@@ -1000,6 +1025,9 @@ export type AppClassProperties = {
1000
1025
  duplicate: App["duplicate"];
1001
1026
  toolDrag: App["toolDrag"];
1002
1027
  activeResizeHandle: App["activeResizeHandle"];
1028
+ selectionTool: App["selectionTool"];
1029
+ wrap: App["wrap"];
1030
+ modifiers: App["modifiers"];
1003
1031
  isToolLocked: App["isToolLocked"];
1004
1032
  getEffectiveGridSize: App["getEffectiveGridSize"];
1005
1033
  setPlugins: App["setPlugins"];
@@ -1052,6 +1080,7 @@ export type PointerDownState = Readonly<{
1052
1080
  element: NonDeleted<ExcalidrawElement> | null;
1053
1081
  allHitElements: NonDeleted<ExcalidrawElement>[];
1054
1082
  wasAddedToSelection: boolean;
1083
+ cycleTarget: NonDeleted<ExcalidrawElement> | null;
1055
1084
  hasBeenDuplicated: boolean;
1056
1085
  advancedListMarkers: readonly ListMarkerAdvance[];
1057
1086
  editedTextId: ExcalidrawTextElement["id"] | null;
@@ -1069,6 +1098,10 @@ export type PointerDownState = Readonly<{
1069
1098
  x: number;
1070
1099
  y: number;
1071
1100
  };
1101
+ lastOffset: {
1102
+ x: number;
1103
+ y: number;
1104
+ };
1072
1105
  blockDragging: boolean;
1073
1106
  };
1074
1107
  eventListeners: {
@@ -1104,6 +1137,21 @@ export interface ExcalidrawImperativeAPI {
1104
1137
  history: {
1105
1138
  clear: InstanceType<typeof App>["resetHistory"];
1106
1139
  };
1140
+ /**
1141
+ * Selects elements (or their ids — one or many), adds them to or removes
1142
+ * them from the selection, or clears it — as the editor does: an element is
1143
+ * selected with its group (unless `deep`), a frame and its children aren't
1144
+ * selected at the same time, and locked elements are skipped (unless
1145
+ * `includeLocked`). Text editing and cropping end, and the link popup of a
1146
+ * lone selected element shows. Missing and deleted elements are skipped.
1147
+ *
1148
+ * By default the change is recorded for undo along with the next undoable
1149
+ * change — pass `captureUpdate` as for `updateScene()` otherwise. Like
1150
+ * `updateScene()`, it applies on the next render: read it back through
1151
+ * `onChange()` or `getAppState()` after that. Works in view mode too, where
1152
+ * the selection shows without transform handles.
1153
+ */
1154
+ selection: Pick<InstanceType<typeof App>["selection"], "select" | "add" | "remove" | "clear">;
1107
1155
  getSceneElements: InstanceType<typeof App>["getSceneElements"];
1108
1156
  getAppState: () => InstanceType<typeof App>["state"];
1109
1157
  getFiles: () => InstanceType<typeof App>["files"];
@@ -1,3 +1,5 @@
1
- export * from "./export";
1
+ export { exportScene, exportToClipboard, MIME_TYPES, } from "@excalidraw/excalidraw/scene/export";
2
+ export type { ExportSceneData, ExportSceneConfig, ExportSceneOptions, } from "@excalidraw/excalidraw/scene/export";
2
3
  export { elementsOverlappingBBox } from "@excalidraw/element";
3
4
  export { getCommonBounds } from "@excalidraw/element";
5
+ export type { RenderEnvironment } from "@excalidraw/element";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@excalidraw/math",
3
- "version": "0.18.0-4ce38fb",
3
+ "version": "0.18.0-4ce8305",
4
4
  "type": "module",
5
5
  "types": "./dist/types/math/src/index.d.ts",
6
6
  "main": "./dist/prod/index.js",
@@ -61,6 +61,6 @@
61
61
  "build:esm": "rimraf dist && node ../../scripts/buildBase.js && yarn gen:types"
62
62
  },
63
63
  "dependencies": {
64
- "@excalidraw/common": "0.18.0-4ce38fb"
64
+ "@excalidraw/common": "0.18.0-4ce8305"
65
65
  }
66
66
  }
@@ -1,36 +0,0 @@
1
- import { MIME_TYPES } from "@excalidraw/common";
2
- import type { ExcalidrawFrameLikeElement, NonDeleted, NonDeletedExcalidrawElement } from "@excalidraw/element/types";
3
- import type { AppState, BinaryFiles } from "@excalidraw/excalidraw/types";
4
- export { MIME_TYPES };
5
- type ExportOpts = {
6
- /** restored before exporting */
7
- elements: readonly NonDeletedExcalidrawElement[];
8
- appState?: Partial<Omit<AppState, "offsetTop" | "offsetLeft">>;
9
- files: BinaryFiles | null;
10
- maxWidthOrHeight?: number;
11
- exportingFrame?: NonDeleted<ExcalidrawFrameLikeElement> | null;
12
- getDimensions?: (width: number, height: number) => {
13
- width: number;
14
- height: number;
15
- scale?: number;
16
- };
17
- };
18
- export declare const exportToCanvas: ({ elements, appState, files, maxWidthOrHeight, getDimensions, exportPadding, exportingFrame, }: ExportOpts & {
19
- exportPadding?: number;
20
- }) => Promise<HTMLCanvasElement>;
21
- export declare const exportToBlob: (opts: ExportOpts & {
22
- mimeType?: string;
23
- quality?: number;
24
- exportPadding?: number;
25
- }) => Promise<Blob>;
26
- export declare const exportToSvg: ({ elements, appState, files, exportPadding, renderEmbeddables, exportingFrame, skipInliningFonts, reuseImages, }: Omit<ExportOpts, "getDimensions"> & {
27
- exportPadding?: number;
28
- renderEmbeddables?: boolean;
29
- skipInliningFonts?: true;
30
- reuseImages?: boolean;
31
- }) => Promise<SVGSVGElement>;
32
- export declare const exportToClipboard: (opts: ExportOpts & {
33
- mimeType?: string;
34
- quality?: number;
35
- type: "png" | "svg" | "json";
36
- }) => Promise<void>;