--- 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({**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_**
elements: ExcalidrawElement[],
appState: AppState,
}): string
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: {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_**
excalidrawAPI: ExcalidrawAPI,
getInitialLibraryItems?: () => LibraryItemsSource
});
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 },### viewportCoordsToSceneCoords This function returns equivalent `scene` coords for the provided `viewport` coords in params. ```js import { viewportCoordsToSceneCoords } from "@excalidraw/excalidraw"; ``` **_Signature_**
appState: AppState
): { x: number, y: number }
viewportCoordsToSceneCoords({ clientX: number, clientY: 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 = () => (
appState: AppState
): {x: number, y: number}
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"; ```
element: NonDeletedExcalidrawElement,
bounds: Bounds,
): boolean