Skip to content

fix(profiles): open avatar previews on hover in compact density - #3510

Merged
kalvinnchau merged 1 commit into
mainfrom
fix/compact-profile-peek-hover
Nov 13, 2026
Merged

kalvinnchau merged 1 commit into
mainfrom
fix/compact-profile-peek-hover

Conversation

@kalvinnchau

Copy link
Copy Markdown
Contributor

Problem

In compact message density, resting the pointer on a message avatar never opens the profile preview. Clicking the avatar and keyboard focus still work.

ProfilePeek cancels a hover open while the avatar's row has [data-actions-revealed]. That guard came in #1438 to stop a preview opening when the pointer crosses an avatar on its way to the row's hover toolbar. Compact density (#2547) made the whole row the toolbar's hover area (useFloatingActionBar.ts:138), and the avatar is inside that row. So in compact density the attribute is set whenever the pointer is on the avatar, and every hover open is cancelled.

Change

ProfilePeek reads the existing useMessageDensity() store, the same one useFloatingActionBar uses, and skips the guard in compact density. Default density is unchanged. In compact density the toolbar is pinned to the row's trailing edge and the avatar starts the row, so no toolbar route crosses the avatar. The 300ms rest delay still keeps a passing pointer from opening a preview.

Evidence

  • New ProfilePeek.test.tsx case: with the row's toolbar showing, resting on the avatar for the rest delay keeps the preview closed in default density and opens it in compact density.
    • It fails without the fix, at the compact assertion.
    • It also fails if the guard is removed for every density, at the default assertion.
  • vitest run of ProfilePeek.test.tsx, MessageRow.test.tsx and MessageActionBar.test.tsx: 238/238 pass.
  • bin/pnpm check and tsc --noEmit pass.
  • Browser check in Chromium and WebKit against the production frontend, with disposable keys. It used a harness outside this PR; no browser spec was added.
    • Both densities open the card after 300ms and not at 299ms. In compact density it opens with the real row toolbar showing.
    • The card stays while the pointer is on it and closes when the pointer leaves.
    • A brief avatar crossing opens nothing.
    • The More menu is not covered.
    • Changing channels removes the row and card.

Not yet exercised: native desktop app, and the human test step.

compact density reveals the row toolbar anywhere in the row, avatar
included, so the safe-route guard in profilepeek cancelled every hover
open. skip that guard in compact density; default density is unchanged.

Co-authored-by: Claude Opus 5.5 <[email protected]>
Signed-off-by: Kalvin Chau <[email protected]>
@kalvinnchau
kalvinnchau marked this pull request as ready for review November 13, 2026 21:04
@kalvinnchau
kalvinnchau requested a review from a team as a code owner November 13, 2026 21:04

@kazemek21 kazemek21 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.

Kyle reviewed this PR and the Nexus review-tracker notes and approved with no comments.

Posted by Codex (gpt-6.1-sol) on behalf of kylez

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord automated source review via Wes’s account. Reviewed head c1c6927b192338d4e46cac4526f73e3568809ec7 against base 71e868973e238561cc05866e9ff43191c34fb7ec.

No actionable findings. The compact-only exception matches the toolbar’s whole-row hover behavior while retaining the default-density route guard, shared hover timing, return-focus handling and pending-message cancellation. The new test exercises default refusal and compact opening through the existing density store.

Source inspection covered the changed component/test, MessageRow and toolbar callers, density subscription cleanup, shared preview/overlay behavior, and error/retry paths. No tests, builds or apps were run for this review. Hosted checks report success, with Windows native validation skipped. The author’s test and Chromium/WebKit claims were not independently reproduced; real toolbar reachability in narrow panes, mid-delay density transitions, and native/human acceptance remain unverified.

@kalvinnchau
kalvinnchau merged commit cf54f49 into main Nov 13, 2026
66 checks passed
@kalvinnchau
kalvinnchau deleted the fix/compact-profile-peek-hover branch November 13, 2026 22:52
wpfleger96 added a commit that referenced this pull request Nov 14, 2026
…y-unreads

* origin/main: (24 commits)
  [1/2] feat(agents): add a recommended agent setup (core) (#3344)
  test(browser): survive the live-stream restart a page-clock jump causes (#3442)
  chore(renovate): hold rusqlite below 0.41 for mesh-llm (#3438)
  test(browser): serve the diffs and CLI reload fixtures outside the navigation budget (#3445)
  test(browser): play the draft clip at rate 0 instead of looping it before the Play click (#3446)
  fix(status): reopen a status whose preset deadlines coincide as Today (#3449)
  fix(messages): tolerate a cancelled reaction-name chunk load (#3450)
  fix(pairing): tolerate /proc/net/tcp rows printed twice or missed (#3451)
  test(browser): wait on the signal each test asserts in local-agent-activity and message-navigation (#3444)
  Expose native channel headings to Solo sources (#3523)
  test(browser-host): run the 100,000-channel broker scale check alone in the measurements lane (#3447)
  fix(solo): keep every contributed destination action (#3516)
  fix(identity): report an issuer that keeps rate-limiting an agent as a limit (#2365)
  fix(identity): let a stuck at-launch sign-in copy its link (#2453)
  fix(profiles): open avatar previews on hover in compact density (#3510)
  feat(solo): smooth chat recency reordering (#3502)
  Reject self-mentions that cannot wake another session (#3513)
  feat(status): offer don't clear for every status (#3515)
  Let plugin panels name their tab with panels.useTabTitle (#3251)
  fix(agents): report a conversation wake that fails before its turn starts (#2192)
  ...

# Conflicts:
#	tests/browser/message-management.spec.mjs
wpfleger96 added a commit that referenced this pull request Nov 14, 2026
* origin/main: (27 commits)
  [2/2] feat(agents): offer Automatic (Recommended) in Create agent and Identity (#3345)
  fix(solo): preserve and resume unsent chat drafts (#3525)
  fix(builderlab): give refused app sign-ins and Identity links a route to Organization sign-in (#3078)
  fix(agents): say why Import an agent can't import here, and link Manage plugins (#3073)
  [1/2] feat(agents): add a recommended agent setup (core) (#3344)
  test(browser): survive the live-stream restart a page-clock jump causes (#3442)
  chore(renovate): hold rusqlite below 0.41 for mesh-llm (#3438)
  test(browser): serve the diffs and CLI reload fixtures outside the navigation budget (#3445)
  test(browser): play the draft clip at rate 0 instead of looping it before the Play click (#3446)
  fix(status): reopen a status whose preset deadlines coincide as Today (#3449)
  fix(messages): tolerate a cancelled reaction-name chunk load (#3450)
  fix(pairing): tolerate /proc/net/tcp rows printed twice or missed (#3451)
  test(browser): wait on the signal each test asserts in local-agent-activity and message-navigation (#3444)
  Expose native channel headings to Solo sources (#3523)
  test(browser-host): run the 100,000-channel broker scale check alone in the measurements lane (#3447)
  fix(solo): keep every contributed destination action (#3516)
  fix(identity): report an issuer that keeps rate-limiting an agent as a limit (#2365)
  fix(identity): let a stuck at-launch sign-in copy its link (#2453)
  fix(profiles): open avatar previews on hover in compact density (#3510)
  feat(solo): smooth chat recency reordering (#3502)
  ...

# Conflicts:
#	src-tauri/src/federated_identity/agent/tests.rs
#	src-tauri/src/federated_identity/mod.rs
#	src-tauri/src/federated_identity/protocol.rs
joahg added a commit to joahg/buzz-app that referenced this pull request Nov 14, 2026
* origin/main: (133 commits)
  Expose ordinary chats without workspace headings (block#3530)
  [2/2] feat(agents): offer Automatic (Recommended) in Create agent and Identity (block#3345)
  fix(solo): preserve and resume unsent chat drafts (block#3525)
  fix(builderlab): give refused app sign-ins and Identity links a route to Organization sign-in (block#3078)
  fix(agents): say why Import an agent can't import here, and link Manage plugins (block#3073)
  [1/2] feat(agents): add a recommended agent setup (core) (block#3344)
  test(browser): survive the live-stream restart a page-clock jump causes (block#3442)
  chore(renovate): hold rusqlite below 0.41 for mesh-llm (block#3438)
  test(browser): serve the diffs and CLI reload fixtures outside the navigation budget (block#3445)
  test(browser): play the draft clip at rate 0 instead of looping it before the Play click (block#3446)
  fix(status): reopen a status whose preset deadlines coincide as Today (block#3449)
  fix(messages): tolerate a cancelled reaction-name chunk load (block#3450)
  fix(pairing): tolerate /proc/net/tcp rows printed twice or missed (block#3451)
  test(browser): wait on the signal each test asserts in local-agent-activity and message-navigation (block#3444)
  Expose native channel headings to Solo sources (block#3523)
  test(browser-host): run the 100,000-channel broker scale check alone in the measurements lane (block#3447)
  fix(solo): keep every contributed destination action (block#3516)
  fix(identity): report an issuer that keeps rate-limiting an agent as a limit (block#2365)
  fix(identity): let a stuck at-launch sign-in copy its link (block#2453)
  fix(profiles): open avatar previews on hover in compact density (block#3510)
  ...

Signed-off-by: Joah Gerstenberg <[email protected]>

# Conflicts:
#	src/bundled/codex/prompt.test.ts
#	src/bundled/goose/runtime.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants