|
|
|
|
@ -11,7 +11,7 @@ import {
@@ -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 {
@@ -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 = ({
@@ -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 = ({
@@ -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 = ({
@@ -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 = ({
@@ -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 = ({
@@ -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 = ({
@@ -669,6 +694,10 @@ export const textWysiwyg = ({
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const unbindOnScroll = app.onScrollChangeEmitter.on(() => { |
|
|
|
|
updateWysiwygStyle(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
let isDestroyed = false; |
|
|
|
|
@ -699,10 +728,6 @@ export const textWysiwyg = ({
@@ -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")! |
|
|
|
|
|