Skip to content

Animate between-page handoffs with slide, rise, and zoom - #181

Merged
jmjava merged 3 commits into
mainfrom
cursor/page-scene-transitions-3790
Nov 1, 2026
Merged

jmjava merged 3 commits into
mainfrom
cursor/page-scene-transitions-3790

Conversation

@jmjava

@jmjava jmjava commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

Between pages, the previous board now leaves with a real motion and the next page's first node comes in to meet it. Later boxes stay paced to the narration, and the transition duration is still clamped so the clock cannot skip the next spoken word.

layout.page_transition (or a per-page transition) accepts:

  • fade — dissolve. Still the default.
  • slide — the board travels left, and the next node enters from the right. The old slide was a 0.35-unit nudge.
  • rise — the board drops away, and the next node settles down from just under the title.
  • zoom — the board shrinks out, and the next node scales up.
  • none — instant remove.

An explicit box reveal on that first incoming node still wins. scene-spec-generate is steered to pick slide, rise, or zoom when the page turn is a continuation, a deeper step, or a focus change.

Existing bundles pick this up on the next scene-compile. docgen benchmark still meets baseline.json.

CI

Two checks failed for reasons beside the handoff motion.

  • Lint / PR-diff hotspots. scene_spec.py is in the top change-frequency set, so any edit fails once a function is over CCN 10 or 80 lines. The page-transition compile touched that file while those functions were already over the limit. They are split into smaller helpers. The compiled motion is the same.
  • Mutation. mutmut 3.8.0 reads pytest's private Function._nodeid. Pytest 9 removed it, so stats collection died before any mutant ran. The job now pins mutmut 3.8.1, which uses public nodeid. Local run: 11 killed, 0 survived.

Handoff frames

Slide: the board leaves left, then the next node travels in from the right.

Slide exit, board moving left
Slide entrance, next node arriving from the right

Rise: the board drops, then the next node settles under the title.

Rise exit, board dropping
Rise entrance, next node under the title

Zoom: the board shrinks, then the next node scales up.

Zoom exit, board shrinking
Zoom entrance, next node scaling up

SlideHandoff-handoff.mp4

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

cursoragent and others added 3 commits November 1, 2026 04:57
Slide now carries the previous board off to the left and brings the next page's first node in from the right. Rise drops the old board and settles the next node under the title. Zoom shrinks the board away and scales the next node up. Later boxes stay paced, and transition time is still clamped so the clock cannot skip the next word.

Co-authored-by: John Menke <jmjava@gmail.com>
mutmut 3.8.0 reads pytest's private Function._nodeid, which pytest 9 removed, so stats collection dies before any mutant runs.

Co-authored-by: John Menke <jmjava@gmail.com>
scene_spec.py is in the top change-frequency set, so touching it fails CI once any function exceeds CCN 10 or 80 lines. The page-transition work stays the same; the long functions are now smaller pieces.

Co-authored-by: John Menke <jmjava@gmail.com>
@jmjava
jmjava merged commit 9918abb into main Nov 1, 2026
8 checks passed
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.

2 participants