fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(web): close reasoning picker after selection - #4523

Closed
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection
Closed

fix(web): close reasoning picker after selection#4523
eimexdev wants to merge 1 commit into
pingdotgg:mainfrom
eimexdev:agent/close-reasoning-picker-after-selection

Conversation

@eimexdev

@eimexdeveimexdev commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#4522

What Changed

  • Close the traits picker after selecting a reasoning level.
  • Apply the same behavior to boolean and prompt-injected traits, including Ultrathink.
  • Keep the close callback optional for standalone TraitsMenuContent consumers.

Why

Selecting a reasoning level updates the value, but the controlled picker remains open. The selection handlers update the underlying state without requesting that the parent menu close.

Passing an optional close callback into the menu content keeps the change scoped to the picker while restoring the expected single-selection menu behavior.

UI Changes

Before

reasoning-picker-before.mp4

After

reasoning-picker-after.mp4

Verified in the web client with both Claude and Codex reasoning options.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Close reasoning picker menu after trait selection

The traits picker menu previously stayed open after a user selected a value. Now, TraitsMenuContent calls an optional onRequestClose callback after any selection (trait value, boolean toggle, or prompt-injected value), and TraitsPicker passes a handler that sets menu open state to false.

Macroscope summarized e18344b.


Note

Low Risk
Small UX fix in composer trait menus with no auth, data, or API changes; optional callback preserves existing standalone consumers.

Overview
Fixes the traits/reasoning picker staying open after a choice when the menu is controlled via isMenuOpencloseOnClick alone did not dismiss it.

TraitsMenuContent now accepts an optional onRequestClose and invokes it after a select trait change, boolean on/off change, or prompt-injected option (e.g. Ultrathink). TraitsPicker wires this to setIsMenuOpen(false). Standalone TraitsMenuContent usage can omit the callback with no behavior change.

Reviewed by Cursor Bugbot for commit e18344b. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8fa8aee-c0fc-4587-980a-3efaa4b02823

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 25, 2026
@eimexdev
eimexdev marked this pull request as ready for review July 25, 2026 15:37
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward UI fix adding an optional onRequestClose callback to close the traits picker after selection. Self-contained change following a standard dropdown pattern with no runtime risk.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the agent/close-reasoning-picker-after-selection branch from c92f401 to e18344bCompareAugust 15, 2026 11:00

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the traits menu now has two competing close paths. The shared Menu primitive already owns closing via closeOnClick; see the inline comment.

Posted via Macroscope — UI Consistency

onPromptChange={onPromptChange}
modelOptions={modelOptions}
allowPromptInjectedEffort={allowPromptInjectedEffort}
onRequestClose={() => setIsMenuOpen(false)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The radio items already close this menu through the shared primitive: MenuRadioItem is rendered with closeOnClick at lines 336 and 377 (added in d432100, "trait menu closes after you pick a level", for this same issue), and Base UI emits the close synchronously on item press, which flows through this Menu's onOpenChange into setIsMenuOpen(false).

Adding onRequestClose therefore introduces a second, component-local close path for behavior the primitive already owns, and only for this consumer — CompactComposerControlsMenu renders TraitsMenuContent without the callback and keeps relying on closeOnClick, so the two menus that show the same content now close by different mechanisms. It also makes the primitive's close props no longer the single source of truth for menu dismissal.

Suggest dropping the onRequestClose prop and the TraitsMenuContentImplProps alias and letting closeOnClick remain the single owner. If you have a repro where closeOnClick does not dismiss (e.g. the prompt-injected Ultrathink path), fixing it in MenuRadioItem/Menu would keep both consumers consistent rather than special-casing TraitsPicker.

Posted via Macroscope — UI Consistency

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5879, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Reasoning picker remains open after selecting a reasoning level

2 participants

@eimexdev@juliusmarminge