diff --git a/projects/kit/src/lib/plugins/caret-guard.ts b/projects/kit/src/lib/plugins/caret-guard.ts index f9ccfe058..2d0dbeb6a 100644 --- a/projects/kit/src/lib/plugins/caret-guard.ts +++ b/projects/kit/src/lib/plugins/caret-guard.ts @@ -10,11 +10,22 @@ export function maskitoCaretGuard( ): MaskitoPlugin { return element => { const document = element.ownerDocument; + let isPointerDown = 0; + const onPointerDown = (): number => isPointerDown++; + const onPointerUp = (): number => isPointerDown--; + const listener = (): void => { if (getFocused(document) !== element) { return; } + if (isPointerDown) { + return document.addEventListener('mouseup', listener, { + once: true, + passive: true, + }); + } + const start = element.selectionStart || 0; const end = element.selectionEnd || 0; const [fromLimit, toLimit] = guard(element.value, [start, end]); @@ -27,8 +38,14 @@ export function maskitoCaretGuard( } }; - document.addEventListener('selectionchange', listener); + document.addEventListener('selectionchange', listener, {passive: true}); + document.addEventListener('mousedown', onPointerDown, {passive: true}); + document.addEventListener('mouseup', onPointerUp, {passive: true}); - return () => document.removeEventListener('selectionchange', listener); + return () => { + document.removeEventListener('selectionchange', listener); + document.removeEventListener('mousedown', onPointerDown); + document.removeEventListener('mouseup', onPointerUp); + }; }; }