|
@@ -38,6 +38,7 @@ export const textWysiwyg = ({
|
|
|
onSubmit,
|
|
|
getViewportCoords,
|
|
|
element,
|
|
|
+ canvas,
|
|
|
}: {
|
|
|
id: ExcalidrawElement["id"];
|
|
|
appState: AppState;
|
|
@@ -45,6 +46,7 @@ export const textWysiwyg = ({
|
|
|
onSubmit: (text: string) => void;
|
|
|
getViewportCoords: (x: number, y: number) => [number, number];
|
|
|
element: ExcalidrawElement;
|
|
|
+ canvas: HTMLCanvasElement | null;
|
|
|
}) => {
|
|
|
const updateWysiwygStyle = () => {
|
|
|
const updatedElement = Scene.getScene(element)?.getElement(id);
|
|
@@ -151,6 +153,10 @@ export const textWysiwyg = ({
|
|
|
editable.oninput = null;
|
|
|
editable.onkeydown = null;
|
|
|
|
|
|
+ if (observer) {
|
|
|
+ observer.disconnect();
|
|
|
+ }
|
|
|
+
|
|
|
window.removeEventListener("resize", updateWysiwygStyle);
|
|
|
window.removeEventListener("wheel", stopEvent, true);
|
|
|
window.removeEventListener("pointerdown", onPointerDown);
|
|
@@ -197,9 +203,19 @@ export const textWysiwyg = ({
|
|
|
let isDestroyed = false;
|
|
|
|
|
|
editable.onblur = handleSubmit;
|
|
|
- // reposition wysiwyg in case of window resize. Happens on mobile when
|
|
|
- // device keyboard is opened.
|
|
|
- window.addEventListener("resize", updateWysiwygStyle);
|
|
|
+
|
|
|
+ // reposition wysiwyg in case of canvas is resized. Using ResizeObserver
|
|
|
+ // is preferred so we catch changes from host, where window may not resize.
|
|
|
+ let observer: ResizeObserver | null = null;
|
|
|
+ if (canvas && "ResizeObserver" in window) {
|
|
|
+ observer = new window.ResizeObserver(() => {
|
|
|
+ updateWysiwygStyle();
|
|
|
+ });
|
|
|
+ observer.observe(canvas);
|
|
|
+ } else {
|
|
|
+ window.addEventListener("resize", updateWysiwygStyle);
|
|
|
+ }
|
|
|
+
|
|
|
window.addEventListener("pointerdown", onPointerDown);
|
|
|
window.addEventListener("wheel", stopEvent, {
|
|
|
passive: false,
|