| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | 
							- import {
 
-   isTextElement,
 
-   isExcalidrawElement,
 
-   redrawTextBoundingBox,
 
- } from "../element";
 
- import { CODES, KEYS } from "../keys";
 
- import { t } from "../i18n";
 
- import { register } from "./register";
 
- import { newElementWith } from "../element/mutateElement";
 
- import {
 
-   DEFAULT_FONT_SIZE,
 
-   DEFAULT_FONT_FAMILY,
 
-   DEFAULT_TEXT_ALIGN,
 
- } from "../constants";
 
- import { getBoundTextElement } from "../element/textElement";
 
- import { hasBoundTextElement } from "../element/typeChecks";
 
- import { getSelectedElements } from "../scene";
 
- // `copiedStyles` is exported only for tests.
 
- export let copiedStyles: string = "{}";
 
- export const actionCopyStyles = register({
 
-   name: "copyStyles",
 
-   trackEvent: { category: "element" },
 
-   perform: (elements, appState) => {
 
-     const elementsCopied = [];
 
-     const element = elements.find((el) => appState.selectedElementIds[el.id]);
 
-     elementsCopied.push(element);
 
-     if (element && hasBoundTextElement(element)) {
 
-       const boundTextElement = getBoundTextElement(element);
 
-       elementsCopied.push(boundTextElement);
 
-     }
 
-     if (element) {
 
-       copiedStyles = JSON.stringify(elementsCopied);
 
-     }
 
-     return {
 
-       appState: {
 
-         ...appState,
 
-         toast: { message: t("toast.copyStyles") },
 
-       },
 
-       commitToHistory: false,
 
-     };
 
-   },
 
-   contextItemLabel: "labels.copyStyles",
 
-   keyTest: (event) =>
 
-     event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.C,
 
- });
 
- export const actionPasteStyles = register({
 
-   name: "pasteStyles",
 
-   trackEvent: { category: "element" },
 
-   perform: (elements, appState) => {
 
-     const elementsCopied = JSON.parse(copiedStyles);
 
-     const pastedElement = elementsCopied[0];
 
-     const boundTextElement = elementsCopied[1];
 
-     if (!isExcalidrawElement(pastedElement)) {
 
-       return { elements, commitToHistory: false };
 
-     }
 
-     const selectedElements = getSelectedElements(elements, appState, true);
 
-     const selectedElementIds = selectedElements.map((element) => element.id);
 
-     return {
 
-       elements: elements.map((element) => {
 
-         if (selectedElementIds.includes(element.id)) {
 
-           let elementStylesToCopyFrom = pastedElement;
 
-           if (isTextElement(element) && element.containerId) {
 
-             elementStylesToCopyFrom = boundTextElement;
 
-           }
 
-           if (!elementStylesToCopyFrom) {
 
-             return element;
 
-           }
 
-           let newElement = newElementWith(element, {
 
-             backgroundColor: elementStylesToCopyFrom?.backgroundColor,
 
-             strokeWidth: elementStylesToCopyFrom?.strokeWidth,
 
-             strokeColor: elementStylesToCopyFrom?.strokeColor,
 
-             strokeStyle: elementStylesToCopyFrom?.strokeStyle,
 
-             fillStyle: elementStylesToCopyFrom?.fillStyle,
 
-             opacity: elementStylesToCopyFrom?.opacity,
 
-             roughness: elementStylesToCopyFrom?.roughness,
 
-             roundness: elementStylesToCopyFrom?.roundness,
 
-           });
 
-           if (isTextElement(newElement)) {
 
-             newElement = newElementWith(newElement, {
 
-               fontSize: elementStylesToCopyFrom?.fontSize || DEFAULT_FONT_SIZE,
 
-               fontFamily:
 
-                 elementStylesToCopyFrom?.fontFamily || DEFAULT_FONT_FAMILY,
 
-               textAlign:
 
-                 elementStylesToCopyFrom?.textAlign || DEFAULT_TEXT_ALIGN,
 
-             });
 
-             let container = null;
 
-             if (newElement.containerId) {
 
-               container =
 
-                 selectedElements.find(
 
-                   (element) =>
 
-                     isTextElement(newElement) &&
 
-                     element.id === newElement.containerId,
 
-                 ) || null;
 
-             }
 
-             redrawTextBoundingBox(newElement, container);
 
-           }
 
-           if (newElement.type === "arrow") {
 
-             newElement = newElementWith(newElement, {
 
-               startArrowhead: elementStylesToCopyFrom.startArrowhead,
 
-               endArrowhead: elementStylesToCopyFrom.endArrowhead,
 
-             });
 
-           }
 
-           return newElement;
 
-         }
 
-         return element;
 
-       }),
 
-       commitToHistory: true,
 
-     };
 
-   },
 
-   contextItemLabel: "labels.pasteStyles",
 
-   keyTest: (event) =>
 
-     event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.V,
 
- });
 
 
  |