Fix subagent tray exit easing

Merged
TE
7d ago
+2-2

The subagent tray's ghost row and outgoing text tick accelerate into their exits because they use the menu exit ease-in curve. Both now use the existing agent ease-out token, keeping their durations, transforms, motion gates, and removal lifecycle.

Leo: “I feel like you guys could be doing more audits of the app. Like there's some amount of, like, satisfying and pretty stuff that can happen that we're not quite taking full advantage of.”

Checklist: never ease-in for these transitions; use shared motion tokens. Risk: two exit trajectories change. No new timer, observer, or animation loop; existing trayMotion lifecycle cleanup is unchanged. Gallery experiment alternatives are unchanged; capture the shipped message arm.

Observed / Not run

Fleet validation on base 1b56d73d08a7d26dfc417ee238a8177415460c90 plus this patch:

  • cd webviews && bun run check: pass; base also passes.
  • bun test test/subagent-tray-motion.test.tsx: 11 pass, 0 fail.
  • Static pre-push checks: pass.

Computed ghost and outgoing-text easing changes from cubic-bezier(0.4, 0, 1, 1) to cubic-bezier(0, 0, 0.58, 1); duration stays 80ms. Ghost opacity at 20/40ms changes from 0.901/0.675 to 0.622/0.315; it is gone at 80ms in both. Reduced Motion creates no ghost and removes the tray in the first frame.

These frames come from a Playwright probe pausing the CSS animation at currentTime. The gallery runner's freeze parameter does not freeze CSS animation, so its ordinary strips cannot establish this change. The fixture never creates an outgoing text tick; that curve was checked on a probe element, not a real tick transition. Capture details.

Before (40ms, dark)After
BeforeAfter
Before (40ms, light)After
BeforeAfter

CI warning: the existing NO-SWIFTUI check fails on unchanged HomeChatColorsPanel.swift and HomeChatColorsView.swift, the same known base findings. Run.

Changelog

Fixed: Subagent tray rows and changing labels ease out when leaving.

Agent session: agent session