From bc297e5e496d9f48ef77581b7fb41fdf328a62cf Mon Sep 17 00:00:00 2001 From: kj_sh604 Date: Sun, 15 Mar 2026 16:19:35 -0400 Subject: refactor: dev-docs/ --- .../excalidraw/api/utils/utils-intro.md | 479 +++++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md (limited to 'dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md') diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md b/dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md new file mode 100644 index 0000000..69bd88a --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md @@ -0,0 +1,479 @@ +--- +slug: /@excalidraw/excalidraw/api/utils +--- + +# Utils + +These are pure Javascript functions exported from the @excalidraw/excalidraw [`@excalidraw/excalidraw`](https://npmjs.com/@excalidraw/excalidraw). If you want to export your drawings in different formats eg `png`, `svg` and more you can check out [Export Utilities](/docs/@excalidraw/excalidraw/API/utils/export). If you want to restore your drawings you can check out [Restore Utilities](/docs/@excalidraw/excalidraw/API/utils/restore). + +### serializeAsJSON + +Takes the scene elements and state and returns a JSON string. `Deleted` elements as well as most properties from `AppState` are removed from the resulting JSON. (see [`serializeAsJSON()`](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/data/json.ts#L42) source for details). + +If you want to overwrite the `source` field in the `JSON` string, you can set `window.EXCALIDRAW_EXPORT_SOURCE` to the desired value. + +**_Signature_** + +
+serializeAsJSON({
+ elements: ExcalidrawElement[],
+ appState: AppState,
+}): string
+
+
+**How to use**
+
+```js
+import { serializeAsJSON } from "@excalidraw/excalidraw";
+```
+
+### serializeLibraryAsJSON
+
+Takes the `library` items and returns a `JSON` string.
+
+If you want to overwrite the source field in the JSON string, you can set `window.EXCALIDRAW_EXPORT_SOURCE` to the desired value.
+
+**_Signature_**
+
++serializeLibraryAsJSON( + libraryItems: LibraryItems[]) ++ +**How to use** + +```js +import { serializeLibraryAsJSON } from "@excalidraw/excalidraw"; +``` + +#### isInvisiblySmallElement + +Returns `true` if element is invisibly small (e.g. width & height are zero). + +**_Signature_** + +
+isInvisiblySmallElement(element: ExcalidrawElement): boolean ++ +**How to use** + +```js +import { isInvisiblySmallElement } from "@excalidraw/excalidraw"; +``` + +### loadFromBlob + +This function loads the scene data from the blob (or file). If you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`. Throws if blob doesn't contain valid scene data. + +**How to use** + +```js +import { loadFromBlob } from "@excalidraw/excalidraw"; + +const scene = await loadFromBlob(file, null, null); +excalidrawAPI.updateScene(scene); +``` + +**Signature** + +
+loadFromBlob(+ +### loadLibraryFromBlob + +This function loads the library from the blob. Additonally takes `defaultStatus` param which sets the default status for library item if not present, defaults to `unpublished`. + +**How to use ** + +```js +import { loadLibraryFromBlob } from "@excalidraw/excalidraw"; +``` + +**_Signature_** + +
+ blob: Blob,
+ localAppState: AppState | null,
+ localElements: ExcalidrawElement[] | null,
+ fileHandle?: FileSystemHandle | null
+) => Promise<RestoredDataState> +
+loadLibraryFromBlob(blob: Blob, defaultStatus: "published" | "unpublished") ++ +### loadSceneOrLibraryFromBlob + +This function loads either scene or library data from the supplied blob. If the blob contains scene data, and you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`. + +:::caution + +Throws if blob doesn't contain valid `scene` data or `library` data. + +::: + +**How to use** + +```js showLineNumbers +import { loadSceneOrLibraryFromBlob, MIME_TYPES } from "@excalidraw/excalidraw"; + +const contents = await loadSceneOrLibraryFromBlob(file, null, null); +if (contents.type === MIME_TYPES.excalidraw) { + excalidrawAPI.updateScene(contents.data); +} else if (contents.type === MIME_TYPES.excalidrawlib) { + excalidrawAPI.updateLibrary(contents.data); +} +``` + +**_Signature_** + +
+loadSceneOrLibraryFromBlob(+ +### getFreeDrawSvgPath + +This function returns the `free draw` svg path for the element. + +**How to use** + +```js +import { getFreeDrawSvgPath } from "@excalidraw/excalidraw"; +``` + +**Signature** + +
+ blob: Blob,
+ localAppState: AppState | null,
+ localElements: ExcalidrawElement[] | null,
+ fileHandle?: FileSystemHandle | null
+) => Promise<{ type: string, data: RestoredDataState | ImportedLibraryState}> +
+getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement) ++ +### isLinearElement + +This function returns true if the element is `linear` type (`arrow` |`line`) else returns `false`. + +**How to use** + +```js +import { isLinearElement } from "@excalidraw/excalidraw"; +``` + +**Signature** + +
+isLinearElement(elementType?: ExcalidrawElement): boolean ++ +### getNonDeletedElements + +This function returns an array of `deleted` elements. + +**How to use** + +```js +import { getNonDeletedElements } from "@excalidraw/excalidraw"; +``` + +**Signature** + +
+getNonDeletedElements(elements: readonly ExcalidrawElement[]): as readonly NonDeletedExcalidrawElement[] ++ +### mergeLibraryItems + +This function merges two `LibraryItems` arrays, where unique items from `otherItems` are sorted first in the returned array. + +```js +import { mergeLibraryItems } from "@excalidraw/excalidraw"; +``` + +**_Signature_** + +
+mergeLibraryItems(+ +### parseLibraryTokensFromUrl + +Parses library parameters from URL if present (expects the `#addLibrary` hash key), and returns an object with the `libraryUrl` and `idToken`. Returns `null` if `#addLibrary` hash key not found. + +**How to use** + +```js +import { parseLibraryTokensFromUrl } from "@excalidraw/excalidraw"; +``` + +**Signature** + +```tsx +parseLibraryTokensFromUrl(): { + libraryUrl: string; + idToken: string | null; +} | null +``` + +### useHandleLibrary + +A hook that automatically imports library from url if `#addLibrary` hash key exists on initial load, or when it changes during the editing session (e.g. when a user installs a new library), and handles initial library load if `getInitialLibraryItems` getter is supplied. + +**How to use** + +```js +import { useHandleLibrary } from "@excalidraw/excalidraw"; + +export const App = () => { + // ... + useHandleLibrary({ excalidrawAPI }); +}; +``` + +**Signature** + +
+ localItems: LibraryItems,
+ otherItems: LibraryItems
+): LibraryItems +
+useHandleLibrary(opts: {
+ excalidrawAPI: ExcalidrawAPI,
+ getInitialLibraryItems?: () => LibraryItemsSource
+});
+
+
+In the future, we will be adding support for handling `library` persistence to `browser storage` (or elsewhere).
+
+### getSceneVersion
+
+This function returns the current `scene` version.
+
+**_Signature_**
+
++getSceneVersion(elements: ExcalidrawElement[]) ++ +**How to use** + +```js +import { getSceneVersion } from "@excalidraw/excalidraw"; +``` + +### sceneCoordsToViewportCoords + +This function returns equivalent `viewport` coords for the provided `scene` coords in params. + +```js +import { sceneCoordsToViewportCoords } from "@excalidraw/excalidraw"; +``` + +**_Signature_** + +
+sceneCoordsToViewportCoords({ sceneX: number, sceneY: number },
+ appState: AppState
): { x: number, y: number }
+
+
+### viewportCoordsToSceneCoords
+
+This function returns equivalent `scene` coords for the provided `viewport` coords in params.
+
+```js
+import { viewportCoordsToSceneCoords } from "@excalidraw/excalidraw";
+```
+
+**_Signature_**
+
+
+viewportCoordsToSceneCoords({ clientX: number, clientY: number },
+ appState: AppState
): {x: number, y: number}
+
+
+### useDevice
+
+This hook can be used to check the type of device which is being used. It can only be used inside the `children` of `Excalidraw` component.
+
+Open the `main menu` in the below example to view the footer.
+
+```jsx live noInline
+const MobileFooter = ({}) => {
+ const device = useDevice();
+ if (device.editor.isMobile) {
+ return (
+
+ );
+ }
+ return null;
+};
+const App = () => (
+ +elementsOverlappingBBox(+ +**_How to use_** + +```js +import { elementsOverlappingBBox } from "@excalidraw/excalidraw"; +``` + +### isElementInsideBBox + +Lower-level API than `elementsOverlappingBBox` to check if a single `element` is inside `bounds`. If `eitherDirection=true`, returns `true` if `element` is fully inside `bounds` rectangle, or vice versa. When `false`, it returns `true` only for the former case. + +**_Signature_** + +
+ elements: readonly NonDeletedExcalidrawElement[];
+ bounds: Bounds | ExcalidrawElement;
+ errorMargin?: number;
+ type: "overlap" | "contain" | "inside";
+): NonDeletedExcalidrawElement[]; +
+isElementInsideBBox(+ +**_How to use_** + +```js +import { isElementInsideBBox } from "@excalidraw/excalidraw"; +``` + +### elementPartiallyOverlapsWithOrContainsBBox + +Checks if `element` is overlapping the `bounds` rectangle, or is fully inside. + +**_Signature_** + +
+ element: NonDeletedExcalidrawElement,
+ bounds: Bounds,
+ eitherDirection = false,
+): boolean +
+elementPartiallyOverlapsWithOrContainsBBox(+ +**_How to use_** + +```js +import { elementPartiallyOverlapsWithOrContainsBBox } from "@excalidraw/excalidraw"; +``` -- cgit v1.2.3
+ element: NonDeletedExcalidrawElement,
+ bounds: Bounds,
+): boolean +