Skip to content

Agent chat: hover-revealed transcript controls fade in and out instead of blinking - #27560

Merged
teamleaderleo merged 3 commits into
feat-cmux-nextfrom
fade-hover-controls
Oct 29, 2026
Merged

teamleaderleo merged 3 commits into
feat-cmux-nextfrom
fade-hover-controls

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Leo (2026-10-28), on the agent chat's hover rows:

"I feel like, okay, honestly some of these hoverable icon situations, they should be— there should be, like, a fast fade-in fade-out. Right now they're just appearing and disappearing. Like they're just blinking in and out of existence, and it's a bit jarring, to be honest. I feel like the fade-in fade-out is probably not that bad here."

His screenshots showed another agent's message line pointed at (its age, Copy, Pin, ⋯ and "Read after this step" at the line's end) and "Sent message to …" command lines with their chevrons and the Raw toggle under an opened one.

What changed

Every control the transcript shows only on hover now takes the message hover row's fade (#23769, #24049; --cv-actions-in, --cv-actions-in-delay, --cv-actions-out in conversation.css): out quickly at rest (80 ms), in after a 100 ms beat under the pointer (120 ms), in at once from the keyboard. Fades only: nothing shows that did not show before, and nothing moves.

Blinked before (no transition at all):

  • another agent's message line: Reply and the "Read after this step" tag (the age, Copy, Pin and ⋯ beside them already faded, so the row came in in two pieces);
  • a tool call's output: Wrap lines (and the hover-actions experiment's Copy) in its corner.

Faded on their own one-off timings, now the shared fade:

  • a reply's table: Open and Copy (120 ms ease-out, no beat);
  • a sent message's Copy (120 ms ease-out);
  • Open chat on a message or sub-session line (100 ms ease);
  • an image or video's Open in tab and Expand (--cmux-motion-micro, no out timing);
  • a finished subagent line's actions (120 ms ease-out);
  • the live line's "⌃B to run in background" (180 ms, and it ran under Reduce Motion too);
  • a sent message line's check now comes in at once from the keyboard, as a tool row's does.

All of it sits under prefers-reduced-motion: no-preference, as the existing hover-row fade does. Files outside conversation.css read the tokens with fallbacks, so a page without conversation.css still fades.

Checked and left alone:

  • The received message selectors match the DOM: .cv-received is the DisclosureRow root and the actions sit in its line (IncomingMessageCard.tsx, DisclosureRow.tsx).
  • Tool-row and command-line chevrons (.cv-tool__chevron), the "Sent message to" chevron, code-block corner actions and the Raw toggle are always shown; none of them is revealed on hover, so they have nothing to fade (Raw only lights its text on hover).
  • No transcript control swaps display or visibility on hover.
  • Menus and popovers are untouched: they open on the click with no fade (popover-instant-open.test.ts).

Holding it

webviews/test/transcript-hover-fade.test.ts reads every transcript stylesheet (acpmux conversation/, subagents/, chips/), finds each class hidden at rest (opacity: 0 or visibility: hidden) and shown under :hover, :focus-within, :focus-visible or [data-turn-revealed], and fails unless it transitions opacity on var(--cv-actions-out) at rest and on var(--cv-actions-in) after var(--cv-actions-in-delay) under :hover. It also checks that the scan still finds the rows Leo pointed at, and that a synthetic blinking control is reported. On the base it reports .cv-received__queued, .cv-received__reply, .cv-tool-output__actions and the six one-off timings above.

Screenshots

Gallery entry agent-pane.hover-fade (new): each state pointed at and settled, and caught partway into its fade in (the fade slowed to 2 s with no beat and held 300 ms in, a little under half strength on the snap curve). A control that blinks has no fade to hold and shows at full strength there; one that fades shows faint.

Before (base CSS, the entry-only commit 5945706): gallery advisory run 40949511459, artifact gallery-advisory-27560-594570601a2db76da9318ce621bc9a3e3c6570c6. In received-fading-in the age, Copy and ⋯ are faint, but Reply, "Read after this step" and Open chat are at full strength; in tool-output-fading-in Wrap lines is at full strength.

After (head 51b30b7): run 40950830711, artifact gallery-advisory-27560-51b30b733b504ce1820bb64b84f619b1994ba40f. The same frames show Reply, "Read after this step", Open chat and Wrap lines faint with the rest of their row. The settled received and tool-output states are the same as before.

(Images stay in the run artifacts, not on the public PR: #21400.)

Gallery: agent-pane.hover-fade

Risk

Low: CSS transitions on opacity only, under no-preference motion. The one behavior change beyond timing: "⌃B to run in background" no longer fades under Reduce Motion (it now matches every other hover row, which snaps there).

🤖 Generated with Claude Code

Agent session: agent session

A new gallery entry (agent-pane.hover-fade) points at another agent's
waiting message line and at a finished call's output, each settled and
caught partway into its fade in, so the fade (or its absence) shows in a
still capture.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review ea18962: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr27560 -f ref=fade-hover-controls -f platform=macos -f backend_mode=local

Unclear: web / react-apps-check failed: no known signature; failed step: Check webview test shards.

CI failed on ea189624a5 (run 40958733467 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (3) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs MarkdownMath.test.tsx keeps shell command dollar signs as plain text without dropping content: failed (job)
  • seen on other PRs queuedMessages.test.ts each agent message is a received-card row, in the queue's order, with its promptId: failed (job)
  • seen on other PRs rowSummary.test.tsx no description line on any Settings page is over 60 characters, in any language: failed (job)
  • seen on other PRs rowSummary.test.tsx every schema summary fits 60 characters in every language: failed (job)
  • seen on other PRs themePane.test.tsx the Theme page draws each theme key once, in one card, with no second App Theme group: failed (job)
  • seen on other PRs agent-pane-pending-steer.test.tsx Send now on a waiting steer asks queue_edit send_now for its promptId, and goes once it is read: failed (job)
  • seen on other PRs bare-ref-repo.test.tsx an agent's message: its own address names the repository of its bare #N: failed (job)
  • seen on other PRs classic-new-tab-trust.test.tsx a start refused after a while keeps the prompt ahead of what was typed in the composer meanwhile: failed (job)
Matched log lines
web / react-apps-base-check (3): (fail) keeps shell command dollar signs as plain text without dropping content [4.23ms]

Not re-run automatically: web / react-apps-base-check (3), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 719c550 to compare; do not merge until green; see lane-rules
red: web / Web status; base red: the same failure on the base 719c550; does not block
red: web / react-apps-base-check (3); no finished base run on 719c550 to compare; do not merge until green; see lane-rules
red: web / react-apps-check; base red: the same failure on the base 719c550; does not block

Gallery before/after for ea18962: the capture produced no images (run).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Found 22 test failures on Blacksmith runners:

Failures

Test View Logs
src/agent-session/acpmux/conversation/MarkdownMath.test.tsx/MarkdownMath.test.tsx View Logs
src/agent-session/acpmux/conversation/MarkdownMath.test.tsx/MarkdownMath.test.tsx View Logs
src/agent-session/acpmux/conversation/queuedMessages.test.ts/queuedMessages.test View Logs
src/agent-session/acpmux/conversation/queuedMessages.test.ts/queuedMessages.test View Logs
src/pages/settings/rowSummary.test.tsx/rowSummary.test.tsx View Logs
src/pages/settings/rowSummary.test.tsx/rowSummary.test.tsx View Logs
src/pages/settings/themePane.test.tsx/themePane.test.tsx View Logs
src/pages/settings/themePane.test.tsx/themePane.test.tsx View Logs
test/agent-pane-pending-steer.test.tsx/agent-pane-pending-steer.test.tsx View Logs
test/agent-pane-pending-steer.test.tsx/agent-pane-pending-steer.test.tsx View Logs

...and 12 more test failures. View all on Blacksmith

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

Leo (2026-10-28): "there should be, like, a fast fade-in fade-out. Right
now they're just appearing and disappearing. Like they're just blinking
in and out of existence, and it's a bit jarring".

Every control the transcript shows only on hover now takes the message
hover row's fade (#23769, --cv-actions-in/-in-delay/-out): out quickly at
rest, in after a beat under the pointer, at once from the keyboard.

- No fade before: another agent's message line's Reply and "Read after
  this step" tag, and a tool output's corner actions (Wrap lines).
- One-off timings before, now the shared fade: table Open/Copy, a sent
  message's Copy, Open chat on a disclosure line, media Open/Expand, a
  finished subagent line's actions, the live line's background hint.

test/transcript-hover-fade.test.ts fails when a transcript stylesheet
reveals a class on hover or focus without that fade.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at 51b30b7

SHIP

No actionable findings. Reviewed the CSS transitions and gallery integration. Tests could not run because Bun is unavailable in the box.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026

@cmux-bot cmux-bot 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.

cmux-bot approves 51b30b7: an independent review passed this exact head (review box review-27560-hover-fade receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

… Reduce Motion

The page asked Playwright for reduced motion, but the gallery frame
emulates its own media from its URL, so the actions' new fade in had
just started when their opacity was read ("0", not "1"). The frame now
gets reducedMotion=1 as well.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at ea18962

SHIP

No actionable findings. Source-level checks passed; repository tests could not run because Bun is unavailable.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026

@cmux-bot cmux-bot 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.

cmux-bot approves ea18962: an independent review passed this exact head (review box review-27560-ea189624 receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@teamleaderleo
teamleaderleo merged commit 9a721b5 into feat-cmux-next Oct 29, 2026
190 of 200 checks passed
@teamleaderleo
teamleaderleo deleted the fade-hover-controls branch October 29, 2026 22:46
teamleaderleo added a commit that referenced this pull request Oct 29, 2026
DisclosureRow.css: keep this branch's clickable line; the base's fade on the
hidden Open chat word (#27560) has no element to apply to here. The hover-fade
test stops expecting cv-disclosure__open among hover-revealed controls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-a4efd6c1314eb5a4fc3e
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

This branch was previously deployed

1 inactive deployment
ci-routing-agent — ea189624 Deployed Oct 29, 2026 by teamleaderleo via cmux-tui tree preflight #78310
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant