|
@@ -11,7 +11,7 @@ import {
|
|
|
isBoundToContainer,
|
|
|
isTextElement,
|
|
|
} from "./typeChecks";
|
|
|
-import { CLASSES, isSafari } from "../constants";
|
|
|
+import { CLASSES, isSafari, POINTER_BUTTON } from "../constants";
|
|
|
import type {
|
|
|
ExcalidrawElement,
|
|
|
ExcalidrawLinearElement,
|
|
@@ -38,7 +38,11 @@ import {
|
|
|
actionDecreaseFontSize,
|
|
|
actionIncreaseFontSize,
|
|
|
} from "../actions/actionProperties";
|
|
|
-import { actionZoomIn, actionZoomOut } from "../actions/actionCanvas";
|
|
|
+import {
|
|
|
+ actionResetZoom,
|
|
|
+ actionZoomIn,
|
|
|
+ actionZoomOut,
|
|
|
+} from "../actions/actionCanvas";
|
|
|
import type App from "../components/App";
|
|
|
import { LinearElementEditor } from "./linearElementEditor";
|
|
|
import { parseClipboard } from "../clipboard";
|
|
@@ -379,6 +383,10 @@ export const textWysiwyg = ({
|
|
|
event.preventDefault();
|
|
|
app.actionManager.executeAction(actionZoomOut);
|
|
|
updateWysiwygStyle();
|
|
|
+ } else if (!event.shiftKey && actionResetZoom.keyTest(event)) {
|
|
|
+ event.preventDefault();
|
|
|
+ app.actionManager.executeAction(actionResetZoom);
|
|
|
+ updateWysiwygStyle();
|
|
|
} else if (actionDecreaseFontSize.keyTest(event)) {
|
|
|
app.actionManager.executeAction(actionDecreaseFontSize);
|
|
|
} else if (actionIncreaseFontSize.keyTest(event)) {
|
|
@@ -593,6 +601,7 @@ export const textWysiwyg = ({
|
|
|
window.removeEventListener("blur", handleSubmit);
|
|
|
window.removeEventListener("beforeunload", handleSubmit);
|
|
|
unbindUpdate();
|
|
|
+ unbindOnScroll();
|
|
|
|
|
|
editable.remove();
|
|
|
};
|
|
@@ -619,10 +628,29 @@ export const textWysiwyg = ({
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ const temporarilyDisableSubmit = () => {
|
|
|
+ editable.onblur = null;
|
|
|
+ window.addEventListener("pointerup", bindBlurEvent);
|
|
|
+ // handle edge-case where pointerup doesn't fire e.g. due to user
|
|
|
+ // alt-tabbing away
|
|
|
+ window.addEventListener("blur", handleSubmit);
|
|
|
+ };
|
|
|
+
|
|
|
// prevent blur when changing properties from the menu
|
|
|
const onPointerDown = (event: MouseEvent) => {
|
|
|
const target = event?.target;
|
|
|
|
|
|
+ // panning canvas
|
|
|
+ if (event.button === POINTER_BUTTON.WHEEL) {
|
|
|
+ // trying to pan by clicking inside text area itself -> handle here
|
|
|
+ if (target instanceof HTMLTextAreaElement) {
|
|
|
+ event.preventDefault();
|
|
|
+ app.handleCanvasPanUsingWheelOrSpaceDrag(event);
|
|
|
+ }
|
|
|
+ temporarilyDisableSubmit();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
const isPropertiesTrigger =
|
|
|
target instanceof HTMLElement &&
|
|
|
target.classList.contains("properties-trigger");
|
|
@@ -630,17 +658,14 @@ export const textWysiwyg = ({
|
|
|
if (
|
|
|
((event.target instanceof HTMLElement ||
|
|
|
event.target instanceof SVGElement) &&
|
|
|
- event.target.closest(`.${CLASSES.SHAPE_ACTIONS_MENU}`) &&
|
|
|
+ event.target.closest(
|
|
|
+ `.${CLASSES.SHAPE_ACTIONS_MENU}, .${CLASSES.ZOOM_ACTIONS}`,
|
|
|
+ ) &&
|
|
|
!isWritableElement(event.target)) ||
|
|
|
isPropertiesTrigger
|
|
|
) {
|
|
|
- editable.onblur = null;
|
|
|
- window.addEventListener("pointerup", bindBlurEvent);
|
|
|
- // handle edge-case where pointerup doesn't fire e.g. due to user
|
|
|
- // alt-tabbing away
|
|
|
- window.addEventListener("blur", handleSubmit);
|
|
|
+ temporarilyDisableSubmit();
|
|
|
} else if (
|
|
|
- event.target instanceof HTMLElement &&
|
|
|
event.target instanceof HTMLCanvasElement &&
|
|
|
// Vitest simply ignores stopPropagation, capture-mode, or rAF
|
|
|
// so without introducing crazier hacks, nothing we can do
|
|
@@ -659,7 +684,7 @@ export const textWysiwyg = ({
|
|
|
};
|
|
|
|
|
|
// handle updates of textElement properties of editing element
|
|
|
- const unbindUpdate = Scene.getScene(element)!.onUpdate(() => {
|
|
|
+ const unbindUpdate = app.scene.onUpdate(() => {
|
|
|
updateWysiwygStyle();
|
|
|
const isPopupOpened = !!document.activeElement?.closest(
|
|
|
".properties-content",
|
|
@@ -669,6 +694,10 @@ export const textWysiwyg = ({
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+ const unbindOnScroll = app.onScrollChangeEmitter.on(() => {
|
|
|
+ updateWysiwygStyle();
|
|
|
+ });
|
|
|
+
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
let isDestroyed = false;
|
|
@@ -699,10 +728,6 @@ export const textWysiwyg = ({
|
|
|
requestAnimationFrame(() => {
|
|
|
window.addEventListener("pointerdown", onPointerDown, { capture: true });
|
|
|
});
|
|
|
- window.addEventListener("wheel", stopEvent, {
|
|
|
- passive: false,
|
|
|
- capture: true,
|
|
|
- });
|
|
|
window.addEventListener("beforeunload", handleSubmit);
|
|
|
excalidrawContainer
|
|
|
?.querySelector(".excalidraw-textEditorContainer")!
|