aboutsummaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/element/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/excalidraw/element/index.ts')
-rw-r--r--packages/excalidraw/element/index.ts122
1 files changed, 122 insertions, 0 deletions
diff --git a/packages/excalidraw/element/index.ts b/packages/excalidraw/element/index.ts
new file mode 100644
index 0000000..a9b7476
--- /dev/null
+++ b/packages/excalidraw/element/index.ts
@@ -0,0 +1,122 @@
+import type {
+ ExcalidrawElement,
+ NonDeletedExcalidrawElement,
+ NonDeleted,
+} from "./types";
+import { isInvisiblySmallElement } from "./sizeHelpers";
+import { isLinearElementType } from "./typeChecks";
+
+export {
+ newElement,
+ newTextElement,
+ refreshTextDimensions,
+ newLinearElement,
+ newArrowElement,
+ newImageElement,
+ duplicateElement,
+} from "./newElement";
+export {
+ getElementAbsoluteCoords,
+ getElementBounds,
+ getCommonBounds,
+ getDiamondPoints,
+ getArrowheadPoints,
+ getClosestElementBounds,
+} from "./bounds";
+
+export {
+ OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,
+ getTransformHandlesFromCoords,
+ getTransformHandles,
+} from "./transformHandles";
+export {
+ resizeTest,
+ getCursorForResizingElement,
+ getElementWithTransformHandleType,
+ getTransformHandleTypeFromCoords,
+} from "./resizeTest";
+export {
+ transformElements,
+ getResizeOffsetXY,
+ getResizeArrowDirection,
+} from "./resizeElements";
+export {
+ dragSelectedElements,
+ getDragOffsetXY,
+ dragNewElement,
+} from "./dragElements";
+export { isTextElement, isExcalidrawElement } from "./typeChecks";
+export { redrawTextBoundingBox, getTextFromElements } from "./textElement";
+export {
+ getPerfectElementSize,
+ getLockedLinearCursorAlignSize,
+ isInvisiblySmallElement,
+ resizePerfectLineForNWHandler,
+ getNormalizedDimensions,
+} from "./sizeHelpers";
+export { showSelectedShapeActions } from "./showSelectedShapeActions";
+
+/**
+ * @deprecated unsafe, use hashElementsVersion instead
+ */
+export const getSceneVersion = (elements: readonly ExcalidrawElement[]) =>
+ elements.reduce((acc, el) => acc + el.version, 0);
+
+/**
+ * Hashes elements' versionNonce (using djb2 algo). Order of elements matters.
+ */
+export const hashElementsVersion = (
+ elements: readonly ExcalidrawElement[],
+): number => {
+ let hash = 5381;
+ for (let i = 0; i < elements.length; i++) {
+ hash = (hash << 5) + hash + elements[i].versionNonce;
+ }
+ return hash >>> 0; // Ensure unsigned 32-bit integer
+};
+
+// string hash function (using djb2). Not cryptographically secure, use only
+// for versioning and such.
+export const hashString = (s: string): number => {
+ let hash: number = 5381;
+ for (let i = 0; i < s.length; i++) {
+ const char: number = s.charCodeAt(i);
+ hash = (hash << 5) + hash + char;
+ }
+ return hash >>> 0; // Ensure unsigned 32-bit integer
+};
+
+export const getVisibleElements = (elements: readonly ExcalidrawElement[]) =>
+ elements.filter(
+ (el) => !el.isDeleted && !isInvisiblySmallElement(el),
+ ) as readonly NonDeletedExcalidrawElement[];
+
+export const getNonDeletedElements = <T extends ExcalidrawElement>(
+ elements: readonly T[],
+) =>
+ elements.filter((element) => !element.isDeleted) as readonly NonDeleted<T>[];
+
+export const isNonDeletedElement = <T extends ExcalidrawElement>(
+ element: T,
+): element is NonDeleted<T> => !element.isDeleted;
+
+const _clearElements = (
+ elements: readonly ExcalidrawElement[],
+): ExcalidrawElement[] =>
+ getNonDeletedElements(elements).map((element) =>
+ isLinearElementType(element.type)
+ ? { ...element, lastCommittedPoint: null }
+ : element,
+ );
+
+export const clearElementsForDatabase = (
+ elements: readonly ExcalidrawElement[],
+) => _clearElements(elements);
+
+export const clearElementsForExport = (
+ elements: readonly ExcalidrawElement[],
+) => _clearElements(elements);
+
+export const clearElementsForLocalStorage = (
+ elements: readonly ExcalidrawElement[],
+) => _clearElements(elements);