Skip to content

Add setting to disable menu card hover highlight - #4414

Open
cynicalight wants to merge 1 commit into
steipete:mainfrom
cynicalight:feat/disable-menu-card-hover-highlight
Open

cynicalight wants to merge 1 commit into
steipete:mainfrom
cynicalight:feat/disable-menu-card-hover-highlight

Conversation

@cynicalight

@cynicalight cynicalight commented Oct 10, 2026 •

Copy link
Copy Markdown

Summary

  • Add a Highlight menu cards on hover switch in Settings → Menu. It is on by default, so existing behavior stays the same until a user turns it off.
  • When off, suppress the blue selection background and selected-text tint on both regular menu cards and the GPU-rendered overview cards. Apply the same choice to the Refresh row. Card clicks and submenus continue to work.

Why

The current hover treatment recolors the whole selected card. On the Codex overview card, this turns colored text and the Weekly left remaining-progress bar white. It makes the color cues harder to read and can be visually distracting.

I previously proposed custom hover color and opacity in #4412. Local testing showed that approach did not change the Codex card as intended, and it added more settings and rendering changes than this issue needs. I closed that PR and replaced it with this smaller opt-out.

Validation

  • Red/green regression test for both card rendering paths: the test failed against the original behavior and passes with this change.
  • PATH=/opt/homebrew/bin:$PATH make check — passed.
  • PATH=/opt/homebrew/bin:$PATH make test — passed: 150/150 groups, 0 failures, 0 timeouts.
  • Local debug app — packaged, signature verified, and launched with CODEXBAR_DISABLE_KEYCHAIN_ACCESS=1; the new setting is off in the debug preference domain for manual hover inspection.

Screenshot

Live menu capture pending from the locally running debug build.

@clawsweeper

clawsweeper Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-10T17:06:12.221898Z 4e6a964 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@clawsweeper clawsweeper Bot added P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Oct 10, 2026
@clawsweeper

clawsweeper Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge.

What this changes

This PR adds a default-on setting that controls selection backgrounds and text tinting for menu cards and Refresh.

Example: Turn off “Highlight menu cards on hover” and point at the Codex Overview card.

  • Before: The card receives a blue selection background and selected-text tint.
  • After: The card retains its normal background and content colors.

Review scores

Measure Result What it means
Overall readiness 🧂 unranked krab (1/6) The implementation is focused, but an introduced keyboard-selection regression blocks correctness and required runtime proof is missing.
Proof confidence 🧂 unranked krab (1/6) Real behavior proof is necessary before merge. See Before merge.
Patch quality 🦪 silver shellfish (2/6) 1 actionable review finding remain.

Product

Kind: Preference · Worth it: Needs a maintainer decision · Fix scope: Complete
User problem: Hovering the Codex card replaces useful content colors with selected-text tint, reducing readability for the contributor.
Reason: This changes an owner-confirmed selection treatment through a new persistent setting, so its value and product direction need an owner decision.

Merge readiness

⛔ Blocked before merge - 4 items remain

Keep this PR open for an owner decision on the appearance preference; the patch also removes visual keyboard selection when the setting is disabled.

Priority: P3
Reviewed head: 4e6a964ffc535fafb25d8680096c7ac9d449bbff
Owner decision: Required. See Decision needed.

Decision needed

  • Question: Should CodexBar offer a persistent opt-out from pointer-hover selection for menu cards and Refresh?
  • Recommendation: Approve a hover-only opt-out: Accept the readability preference with the existing default preserved and keyboard selection remaining visible.
  • Why: The owner confirmed the current selection appearance is intentional, but has not decided whether this optional preference belongs in the product.

Before merge

  • Add real behavior proof - The added test exercises the production card factory and selection delegate in process, but the complete body and discussion provide no artifact showing the changed appearance through the shipped app; launching the debug bundle does not establish the hover result. Fresh-install, v0.74.0 upgrade and restart-persistence evidence also remain absent; redact account details, IPs, API keys and non-public endpoints from supplied captures. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • Preserve visible keyboard selection when hover highlighting is disabled (P2) - With the setting off, arrow-key navigation still reaches menu(_:willHighlight:), but this predicate forces both card rendering paths to remain visually unselected. MenuCardMenuItem.isHighlighted is always false, so there is no native fallback and users cannot see which card will open its submenu. The Refresh renderer applies the same unconditional gate. Distinguish pointer hover from keyboard selection and retain a visible keyboard cue. This also corroborates Add setting to disable menu card hover highlight #4414 (comment). This concern was equally visible at the unchanged head reviewed earlier and was missed in that review.
  • Resolve maintainer decision - Resolve the maintainer decision shown above before merge.
  • Add data-model compatibility proof - The review found that existing stored data may not work after upgrade. Show that existing data still loads and works with this change.

Findings

  • [P2] Preserve visible keyboard selection when hover highlighting is disabled — Sources/CodexBar/StatusItemController+MenuPresentation.swift:458-460

Tests

  • Missing end-to-end proof: Supply redacted fresh-bundle screenshots or a recording of both setting states on regular cards, Overview and Refresh, including keyboard focus, clicks and submenus, plus fresh-install and v0.74.0 upgrade/restart persistence.
Agent review details

How this fits together

SettingsStore persists the preference, menu factories pass it into custom row views, and the menu selection delegate drives their SwiftUI or GPU rendering.

flowchart TD
A[Menu settings toggle] --> B[SettingsStore preference]
B --> C[Menu row factories]
C --> D[Custom card and Refresh views]
E[Pointer and keyboard selection] --> F[Menu highlight delegate]
F --> D
D --> G[Selection background and text tint]
Loading

Technical review

Best possible solution:

If the owner approves the opt-out, suppress pointer hover while retaining a visible keyboard selection cue in the existing row renderers.

Do we have a high-confidence way to reproduce the issue?

Source inspection establishes that disabling the setting hides selection for both pointer and keyboard navigation; no runtime reproduction was performed.

Is this the best way to solve the issue?

The shared renderer is the appropriate implementation boundary, but gating every selection event is broader than the stated hover preference.

Full review comments:

  • [P2] Preserve visible keyboard selection when hover highlighting is disabled — Sources/CodexBar/StatusItemController+MenuPresentation.swift:458-460
    With the setting off, arrow-key navigation still reaches menu(_:willHighlight:), but this predicate forces both card rendering paths to remain visually unselected. MenuCardMenuItem.isHighlighted is always false, so there is no native fallback and users cannot see which card will open its submenu. The Refresh renderer applies the same unconditional gate. Distinguish pointer hover from keyboard selection and retain a visible keyboard cue. This also corroborates Add setting to disable menu card hover highlight #4414 (comment). This concern was equally visible at the unchanged head reviewed earlier and was missed in that review.
    Confidence: 0.98
    Late finding: first raised on code an earlier review cycle already covered.

Overall correctness: patch is incorrect
Overall confidence: 0.97

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 6e118bdb5782.

Provenance checked

Testing

Proof path: in-process harness.

Security

None.

Evidence

What I checked:

Likely related people:

  • Peter Steinberger: Raw commit 36610ff adds Sources/CodexBar/StatusItemController+MenuPresentation.swift:402 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 36610ffaaee0; files: Sources/CodexBar/StatusItemController+MenuPresentation.swift)
  • Zihao Qi: Raw commit ada3660 adds Sources/CodexBar/StatusItemController+MenuPresentation.swift:247 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: ada3660e9d61; files: Sources/CodexBar/StatusItemController+MenuPresentation.swift)

Root-cause cluster

Relationship: canonical
Canonical: #4414
Summary: This PR replaces the author's broader appearance proposal; the earlier blue-card report established intentional selection behavior.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Labels

Label changes:

No label changes.

Label justifications:

  • P3: The central contribution is optional appearance customization with the existing default preserved.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦪 silver shellfish.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only; repair and merge need explicit maintainer commands such as @clawsweeper autofix or @clawsweeper automerge.

History

Review history (1 earlier review cycle)
  • reviewed 2026-10-10T17:05:19.890Z sha 4e6a964 :: needs real behavior proof before merge. :: none

Reviewed October 10, 2026, 1:26 PM ET / 17:26 UTC (Revision 2).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4e6a964ffc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

}

private func applyHighlight(animated: Bool) {
let visuallyHighlighted = self.hoverHighlightEnabled && self.isRowHighlighted

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve keyboard focus when hover highlighting is off

When a user turns this setting off and navigates the menu with the arrow keys, this predicate also suppresses the keyboard-selected state because NSMenuDelegate.menu(_:willHighlight:) drives both pointer hover and keyboard selection. Since MenuCardMenuItem.isHighlighted is hard-coded to false in StatusItemController+MenuCardItems.swift, there is no native fallback, so cards (and the similarly gated Refresh row) provide no visual indication of the current keyboard target even though navigation and submenus still work; retain a focus treatment for keyboard-origin highlights while suppressing only pointer hover.

Useful? React with 👍 / 👎.

This branch has not been deployed

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

Labels

P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant