aboutsummaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/actions/actionTextAutoResize.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/excalidraw/actions/actionTextAutoResize.ts')
-rw-r--r--packages/excalidraw/actions/actionTextAutoResize.ts48
1 files changed, 48 insertions, 0 deletions
diff --git a/packages/excalidraw/actions/actionTextAutoResize.ts b/packages/excalidraw/actions/actionTextAutoResize.ts
new file mode 100644
index 0000000..29f54c9
--- /dev/null
+++ b/packages/excalidraw/actions/actionTextAutoResize.ts
@@ -0,0 +1,48 @@
+import { isTextElement } from "../element";
+import { newElementWith } from "../element/mutateElement";
+import { measureText } from "../element/textMeasurements";
+import { getSelectedElements } from "../scene";
+import { CaptureUpdateAction } from "../store";
+import type { AppClassProperties } from "../types";
+import { getFontString } from "../utils";
+import { register } from "./register";
+
+export const actionTextAutoResize = register({
+ name: "autoResize",
+ label: "labels.autoResize",
+ icon: null,
+ trackEvent: { category: "element" },
+ predicate: (elements, appState, _: unknown, app: AppClassProperties) => {
+ const selectedElements = getSelectedElements(elements, appState);
+ return (
+ selectedElements.length === 1 &&
+ isTextElement(selectedElements[0]) &&
+ !selectedElements[0].autoResize
+ );
+ },
+ perform: (elements, appState, _, app) => {
+ const selectedElements = getSelectedElements(elements, appState);
+
+ return {
+ appState,
+ elements: elements.map((element) => {
+ if (element.id === selectedElements[0].id && isTextElement(element)) {
+ const metrics = measureText(
+ element.originalText,
+ getFontString(element),
+ element.lineHeight,
+ );
+
+ return newElementWith(element, {
+ autoResize: true,
+ width: metrics.width,
+ height: metrics.height,
+ text: element.originalText,
+ });
+ }
+ return element;
+ }),
+ captureUpdate: CaptureUpdateAction.IMMEDIATELY,
+ };
+ },
+});