diff --git a/src/chrome/src/ui/sidepanel.js b/src/chrome/src/ui/sidepanel.js index 2686187c5..f3a89a309 100644 --- a/src/chrome/src/ui/sidepanel.js +++ b/src/chrome/src/ui/sidepanel.js @@ -601,7 +601,6 @@ const PERMISSION_REMINDER_PLACEHOLDER_KEY = 'sp.input.placeholder_tip.skip_permi let pendingAnswerSelection = null; let selectionAskActionRefreshFrame = null; let selectionAskActionRefreshTimer = null; -let keepSelectionAskActionUntil = 0; let selectionAskActionLocale = ''; let selectionAskActionLabel = ''; const SLASH_COMMANDS = [ @@ -10641,12 +10640,7 @@ function messageInfoClickIsInteractive(target) { function messageInfoClickHasTextSelection() { const selection = globalThis.getSelection?.(); - if (selection && !selection.isCollapsed) return true; - return Boolean( - pendingAnswerSelection - && selectionAskActionEl - && !selectionAskActionEl.classList.contains('hidden'), - ); + return Boolean(selection && !selection.isCollapsed); } function toggleMessageInfo(msgEl) { @@ -10755,7 +10749,6 @@ function dismissSelectionAskAction() { cancelAnimationFrame(selectionAskActionRefreshFrame); selectionAskActionRefreshFrame = null; } - keepSelectionAskActionUntil = 0; pendingAnswerSelection = null; selectionAskActionEl?.classList.add('hidden'); } @@ -10805,12 +10798,6 @@ function refreshSelectionAskAction() { showSelectionAskAction(selected); return; } - const selection = window.getSelection?.(); - if (selection && !selection.isCollapsed && selection.rangeCount >= 1) { - dismissSelectionAskAction(); - return; - } - if (pendingAnswerSelection) return; dismissSelectionAskAction(); } @@ -10822,7 +10809,6 @@ function showSelectionAskAction(selected) { ? selected.range.cloneRange() : selected.range, }; - keepSelectionAskActionUntil = Date.now() + 2000; applySelectionAskActionLabel(); selectionAskActionEl.classList.remove('hidden'); positionSelectionAskAction(pendingAnswerSelection.range); @@ -10842,12 +10828,12 @@ function scheduleSelectionAskActionRefresh() { function handleSelectionAskPointerDown(event) { if (selectionAskActionEl?.contains(event.target)) return; - if (!event.target?.closest?.('.message.assistant')) dismissSelectionAskAction(); + dismissSelectionAskAction(); } function handleSelectionAskPointerUp() { - const selected = selectedAssistantAnswer() || pendingAnswerSelection; - if (selected?.text) { + const selected = selectedAssistantAnswer(); + if (selected) { showSelectionAskAction(selected); return; } diff --git a/src/chrome/styles/sidepanel.css b/src/chrome/styles/sidepanel.css index b35879a90..c04d29d58 100644 --- a/src/chrome/styles/sidepanel.css +++ b/src/chrome/styles/sidepanel.css @@ -2348,6 +2348,7 @@ body { position: fixed; z-index: 10000; display: block; + opacity: 0.8; max-width: calc(100vw - 16px); padding: 6px 10px; border: 1px solid var(--accent); @@ -2372,6 +2373,7 @@ body { .selection-ask-action:hover { border-color: var(--accent-hover); background: var(--accent-hover); + opacity: 1; } .selection-ask-action:focus-visible { diff --git a/src/firefox/src/ui/sidepanel.js b/src/firefox/src/ui/sidepanel.js index 95c3bfc03..ad5e95e38 100644 --- a/src/firefox/src/ui/sidepanel.js +++ b/src/firefox/src/ui/sidepanel.js @@ -477,7 +477,6 @@ const PERMISSION_REMINDER_PLACEHOLDER_KEY = 'sp.input.placeholder_tip.skip_permi let pendingAnswerSelection = null; let selectionAskActionRefreshFrame = null; let selectionAskActionRefreshTimer = null; -let keepSelectionAskActionUntil = 0; let selectionAskActionLocale = ''; let selectionAskActionLabel = ''; const SLASH_COMMANDS = [ @@ -10262,12 +10261,7 @@ function messageInfoClickIsInteractive(target) { function messageInfoClickHasTextSelection() { const selection = globalThis.getSelection?.(); - if (selection && !selection.isCollapsed) return true; - return Boolean( - pendingAnswerSelection - && selectionAskActionEl - && !selectionAskActionEl.classList.contains('hidden'), - ); + return Boolean(selection && !selection.isCollapsed); } function toggleMessageInfo(msgEl) { @@ -10376,7 +10370,6 @@ function dismissSelectionAskAction() { cancelAnimationFrame(selectionAskActionRefreshFrame); selectionAskActionRefreshFrame = null; } - keepSelectionAskActionUntil = 0; pendingAnswerSelection = null; selectionAskActionEl?.classList.add('hidden'); } @@ -10426,12 +10419,6 @@ function refreshSelectionAskAction() { showSelectionAskAction(selected); return; } - const selection = window.getSelection?.(); - if (selection && !selection.isCollapsed && selection.rangeCount >= 1) { - dismissSelectionAskAction(); - return; - } - if (pendingAnswerSelection) return; dismissSelectionAskAction(); } @@ -10443,7 +10430,6 @@ function showSelectionAskAction(selected) { ? selected.range.cloneRange() : selected.range, }; - keepSelectionAskActionUntil = Date.now() + 2000; applySelectionAskActionLabel(); selectionAskActionEl.classList.remove('hidden'); positionSelectionAskAction(pendingAnswerSelection.range); @@ -10463,12 +10449,12 @@ function scheduleSelectionAskActionRefresh() { function handleSelectionAskPointerDown(event) { if (selectionAskActionEl?.contains(event.target)) return; - if (!event.target?.closest?.('.message.assistant')) dismissSelectionAskAction(); + dismissSelectionAskAction(); } function handleSelectionAskPointerUp() { - const selected = selectedAssistantAnswer() || pendingAnswerSelection; - if (selected?.text) { + const selected = selectedAssistantAnswer(); + if (selected) { showSelectionAskAction(selected); return; } diff --git a/src/firefox/styles/sidepanel.css b/src/firefox/styles/sidepanel.css index a6902f151..11c835fc5 100644 --- a/src/firefox/styles/sidepanel.css +++ b/src/firefox/styles/sidepanel.css @@ -2185,6 +2185,7 @@ body { position: fixed; z-index: 10000; display: block; + opacity: 0.8; max-width: calc(100vw - 16px); padding: 6px 10px; border: 1px solid var(--accent); @@ -2209,6 +2210,7 @@ body { .selection-ask-action:hover { border-color: var(--accent-hover); background: var(--accent-hover); + opacity: 1; } .selection-ask-action:focus-visible { diff --git a/test/run.js b/test/run.js index dd8f7e5af..ebcb9d03f 100644 --- a/test/run.js +++ b/test/run.js @@ -1275,8 +1275,8 @@ test('selection answer action wiring covers show, dismiss, and tab/conversation assert.match(source, /document\.addEventListener\('pointerdown', handleSelectionAskPointerDown/); assert.match(source, /function showSelectionAskAction\(selected\)/); assert.match(source, /function ensureSelectionAskActionEl\(\)/); - assert.match(source, /keepSelectionAskActionUntil = Date\.now\(\) \+ 2000/); - assert.match(source, /if \(pendingAnswerSelection\) return;/); + assert.match(source, /function handleSelectionAskPointerDown\(event\) \{[\s\S]*?if \(selectionAskActionEl\?\.contains\(event\.target\)\) return;[\s\S]*?dismissSelectionAskAction\(\);/); + assert.match(source, /function refreshSelectionAskAction\(\) \{[\s\S]*?const selected = selectedAssistantAnswer\(\);[\s\S]*?showSelectionAskAction\(selected\);[\s\S]*?dismissSelectionAskAction\(\);/); assert.match(source, /selection\.rangeCount < 1/); assert.match(source, /document\.addEventListener\('pointercancel', handleSelectionAskPointerUp/); assert.match(source, /document\.addEventListener\('mouseup', handleSelectionAskPointerUp/); @@ -1289,7 +1289,7 @@ test('selection answer action wiring covers show, dismiss, and tab/conversation assert.match(source, /chatContainerEl\?\.addEventListener\('scroll', handleSelectionAskScroll/); assert.match(source, /document\.body\.appendChild\(selectionAskActionEl\)/); assert.match(source, /closest\?\.\('\.message\.assistant'\)/); - assert.match(source, /function messageInfoClickHasTextSelection\(\) \{[\s\S]*?if \(selection && !selection\.isCollapsed\) return true;[\s\S]*?pendingAnswerSelection/); + assert.match(source, /function messageInfoClickHasTextSelection\(\) \{[\s\S]*?return Boolean\(selection && !selection\.isCollapsed\);/); assert.match(source, /if \(messageInfoClickHasTextSelection\(\)\) return;/); assert.match(source, /const text = selectionTextFromRange\(range\) \|\| String\(range\.toString\?\.\(\) \|\| ''\)\.trim\(\);/); assert.match(source, /function applySelectionAskActionLabel\(\)/); @@ -1309,7 +1309,7 @@ test('selection answer action wiring covers show, dismiss, and tab/conversation assert.match(sidepanelHtmlSources[index], /id="selection-ask-action"/); assert.doesNotMatch(sidepanelHtmlSources[index], /id="selection-ask-action"[^>]*aria-live/); assert.doesNotMatch(sidepanelHtmlSources[index], /