Repository navigation
fix(profiles): open avatar previews on hover in compact density - #3510
Conversation
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]>
kazemek21
left a comment
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
🤖 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.
…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
* 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
* 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
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.
ProfilePeekcancels 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
ProfilePeekreads the existinguseMessageDensity()store, the same oneuseFloatingActionBaruses, 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
ProfilePeek.test.tsxcase: 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.vitest runofProfilePeek.test.tsx,MessageRow.test.tsxandMessageActionBar.test.tsx: 238/238 pass.bin/pnpm checkandtsc --noEmitpass.Not yet exercised: native desktop app, and the human test step.