Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion webviews/src/agent-session/acpmux/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3612,7 +3612,7 @@ export function VirtualTranscript({
},
[sessionId],
);
// CHAT SWITCH MOTION (experiment chat-switch-motion, off by default): opening another chat plays
// CHAT SWITCH MOTION (experiment chat-switch-motion, stagger by default): opening another chat plays
// its rows, title and Session Info in as one movement, on the first frame the new chat's rows draw
// (cached: the frame the switch lands; cold: when its rows arrive). Not the first chat a page shows,
// and not an empty chat's first send. This effect only notes the switch (before the cold-open fade
Expand Down
14 changes: 8 additions & 6 deletions webviews/src/agent-session/acpmux/chatSwitch.experiment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ import { defineExperiment } from "../../experiments/experiment";

/// Opening another chat in the pane (chatSwitch.ts): whether the transcript, its title and Session
/// Info move as one short performance or simply appear. Leo, 2026-11-01: "honestly i just want to
/// be able to be able to eventually play full-on animations like this". Today's switch is instant,
/// which is what motion-and-polish.md rule 14 asks of a cached view ("instant if cached"), so Off
/// stays the default; to try another, set `cmux.experiments` to `{"chat-switch-motion":"stagger"}`
/// in the pane's web inspector and reload.
/// be able to be able to eventually play full-on animations like this", and 2026-11-03: "i wanted to
/// have more... nice stuff? around the app". Stagger is the default: the new chat is in the DOM on
/// the frame the switch lands (rule 14's "instant"), and the motion plays over it and adds no
/// dropped frame or long task (motion-and-polish.md, Choreography). To try another, set
/// `cmux.experiments` to `{"chat-switch-motion":"off"}` (or another arm) in the pane's web
/// inspector and reload.
export const chatSwitchMotion = defineExperiment({
id: "chat-switch-motion",
title: "Chat switch motion",
description:
"Opening another chat: the transcript's visible rows, the chat title and the Session Info body. Watch whether the switch reads as one movement and whether the reading position (the bottom rows) settles first.",
arms: {
off: { label: "Off", description: "Today: the new chat is drawn in one frame." },
off: { label: "Off", description: "The new chat is drawn in one frame, with no motion." },
fade: { label: "Fade", description: "Transcript, title and Session Info fade in together over 120 ms, no travel." },
stagger: {
label: "Stagger",
Expand All @@ -26,7 +28,7 @@ export const chatSwitchMotion = defineExperiment({
"The transcript comes forward from 98.5% as one sheet while Session Info slides 8 px in from its edge, on the same spring, in 180 ms.",
},
},
defaultArm: "off",
defaultArm: "stagger",
});

export type ChatSwitchArm = keyof typeof chatSwitchMotion.arms;
Loading