@@ -242,6 +242,36 @@ const MIN_RESIZE_DELTA_PX = 1;
242242let rafId = null;
243243let isUnmounted = false;
244244
245+ function removeInteractionCancelListeners() {
246+ window.removeEventListener('blur', onInteractionCancel);
247+ document.removeEventListener('visibilitychange', onInteractionCancel);
248+ }
249+
250+ function cancelActiveResizeDrag() {
251+ if (!dragState.value && !rowDragState.value) return;
252+
253+ forcedCleanup.value = true;
254+ if (dragState.value) {
255+ onDocumentMouseUp(new MouseEvent('mouseup'));
256+ }
257+ if (rowDragState.value) {
258+ onRowDocumentMouseUp();
259+ }
260+ forcedCleanup.value = false;
261+ }
262+
263+ function onInteractionCancel(event) {
264+ if (!dragState.value && !rowDragState.value) return;
265+ if (event?.type === 'visibilitychange' && document.visibilityState === 'visible') {
266+ return;
267+ }
268+ if (document.visibilityState && document.visibilityState !== 'visible') {
269+ cancelActiveResizeDrag();
270+ return;
271+ }
272+ cancelActiveResizeDrag();
273+ }
274+
245275/**
246276 * Starts continuous RAF-based tracking of the overlay position.
247277 *
@@ -763,6 +793,8 @@ function onHandleMouseDown(event, resizableBoundaryIndex) {
763793 try {
764794 document.addEventListener('mousemove', onDocumentMouseMove);
765795 document.addEventListener('mouseup', onDocumentMouseUp);
796+ window.addEventListener('blur', onInteractionCancel);
797+ document.addEventListener('visibilitychange', onInteractionCancel);
766798
767799 emit('resize-start', {
768800 columnIndex: boundary.index,
@@ -890,6 +922,7 @@ function onDocumentMouseUp(event) {
890922 // Clean up event listeners and restore pointer events
891923 document.removeEventListener('mousemove', onDocumentMouseMove);
892924 document.removeEventListener('mouseup', onDocumentMouseUp);
925+ removeInteractionCancelListeners();
893926
894927 if (props.editor?.view?.dom) {
895928 const pmView = props.editor.view.dom;
@@ -1130,6 +1163,8 @@ function onRowHandleMouseDown(event, rowBoundaryIndex) {
11301163
11311164 document.addEventListener('mousemove', onRowDocumentMouseMove);
11321165 document.addEventListener('mouseup', onRowDocumentMouseUp);
1166+ window.addEventListener('blur', onInteractionCancel);
1167+ document.addEventListener('visibilitychange', onInteractionCancel);
11331168
11341169 emit('resize-start', { rowIndex: rowBoundary.i });
11351170}
@@ -1165,6 +1200,7 @@ function onRowDocumentMouseUp() {
11651200
11661201 document.removeEventListener('mousemove', onRowDocumentMouseMove);
11671202 document.removeEventListener('mouseup', onRowDocumentMouseUp);
1203+ removeInteractionCancelListeners();
11681204
11691205 if (props.editor?.view?.dom) {
11701206 props.editor.view.dom.style.pointerEvents = 'auto';
@@ -1286,16 +1322,7 @@ watch(
12861322 } else {
12871323 stopOverlayTracking();
12881324 // Clean up drag state if overlay is hidden
1289- if (dragState.value) {
1290- forcedCleanup.value = true;
1291- onDocumentMouseUp(new MouseEvent('mouseup'));
1292- forcedCleanup.value = false;
1293- }
1294- if (rowDragState.value) {
1295- forcedCleanup.value = true;
1296- onRowDocumentMouseUp();
1297- forcedCleanup.value = false;
1298- }
1325+ cancelActiveResizeDrag();
12991326 }
13001327 },
13011328);
@@ -1333,6 +1360,7 @@ onBeforeUnmount(() => {
13331360 props.editor.view.dom.style.pointerEvents = 'auto';
13341361 }
13351362
1363+ removeInteractionCancelListeners();
13361364 window.removeEventListener('scroll', updateOverlayRect, true);
13371365 window.removeEventListener('resize', updateOverlayRect);
13381366});
0 commit comments