diff --git a/entrypoints/content.ts b/entrypoints/content.ts index be76ab3..649fd9f 100644 --- a/entrypoints/content.ts +++ b/entrypoints/content.ts @@ -16,9 +16,13 @@ export default defineContentScript({ let storedElement: HTMLTextAreaElement | HTMLInputElement | null = null; let storedRange: Range | null = null; + // Lock flag — prevents mouseup from resetting stored selection while modal is open + let selectionLocked = false; + // ─── Selection capture (called immediately on mouseup) ──────────────────── function captureSelectionNow(): boolean { + if (selectionLocked) return true; // selection is locked — don't reset const el = document.activeElement; // 1) textarea / input — grab positions while they're still valid @@ -247,6 +251,7 @@ export default defineContentScript({ async function runAction(action: string) { if (!selectedText) return; const textToProcess = selectedText; + selectionLocked = true; // lock stored selection — modal interaction won't reset it // Guard: extension may have been reloaded/updated if (!isExtensionValid()) { @@ -404,6 +409,7 @@ export default defineContentScript({ replaceBtn.addEventListener('mousedown', (e) => e.preventDefault()); // keep stored selection intact replaceBtn.addEventListener('click', () => { replaceText(resultText); + selectionLocked = false; // unlock after replace overlay.remove(); modal!.remove(); modal = null; @@ -443,6 +449,7 @@ export default defineContentScript({ cursor: 'pointer', }); dismissBtn.addEventListener('click', () => { + selectionLocked = false; // unlock on dismiss overlay.remove(); modal!.remove(); modal = null; diff --git a/lexai-chrome-mv3.zip b/lexai-chrome-mv3.zip index 6e7b9ae..274bb87 100644 Binary files a/lexai-chrome-mv3.zip and b/lexai-chrome-mv3.zip differ