github meursyphus/ssgoi v7.3.0
SSGOI 7.3.0 — Continuous motion across interrupted navigations

3 hours ago

SSGOI 7.3.0 moves the 7.3.0 beta series to stable. Its main change is interrupted navigation. When a new navigation cuts into a running transition, pages now continue from the pose they had on screen instead of snapping to the end. All eight @ssgoi/* packages ship together at 7.3.0.

Interrupted transitions

  • Motion handoff. A new navigation no longer force-completes the running transition. Each transition scope keeps its active and retiring targets. The next transition starts from the current on-screen position and velocity and eases into its own authored path. Hero flights can continue across DOM instances. Double springs keep their internal state when reversing. A→B→C→A reclaims older retiring pages, and at most eight retiring runs are kept. #414
  • Pending sequences and cleanup. Pending sequence phases are cancelled, and pause/resume state is preserved. onComplete is now separate from an ownership-checked onDispose, and async prepare is guarded by generations and AbortSignal. Every built-in web effect has an explicit release path. Incompatible CSS falls back to a snapshot crossfade, and handoff diagnostic events are emitted. #414
  • Interrupting a page that is still entering. Starting a new navigation while a page is still entering (for example, going back 120 ms into A→B) no longer makes it jump. Page boxes are now measured when the run starts, at the run's resting scroll. Before this fix, unmounted pages measured as a 0×0 box, and Activity / cacheComponents pages measured below their sibling, so the page jumped by hundreds of px or its full height. It now continues at the speed it had on either side of the interruption. A page re-entering during a fade sequence no longer blinks to opacity 0. #425

Playback

  • WAAPI plays natively from the first frame. The rAF clock that held new runs paused for two frames at startup has been removed. Work in the task that creates a run, such as mount effects or forced layout, is not charged to the animation. Runs in throttled or hidden documents are no longer stuck at 0 ms. The only startup adjustment left is a one-frame seek, so a handoff doesn't repeat the frame already on screen. @ssgoi/core is 184 lines smaller. #424
Headless Chromium, currentTime per frame (ms) 7.2.0 7.3.0
150 ms stall in the task that creates the run 16.7 → 50 → 66.7 16.7 → 16.7 → 33.4
150 ms stall after the first painted frame 33.4 → 166.7 16.7 → 166.6

Presets

  • zoom({ type: "blur" }) retuned against the Airbnb app. Timing was measured from a recording with the motion analyzer. Enter is a doubleSpring 500/49 ×2 with a soft start, and exit is a spring 280/33.5. Both directions settle in about 0.5 s with no overshoot. The zoom background strategy can now take a separate exitPhysics, chosen by mode (enter/exit); static and expand are unchanged. #426
7.2.0 7.3.0
enter 50 % / 90 % / end 167 / 300 / 550 ms 100 / 250 / 567 ms
exit 50 % / 90 % / end 167 / 300 / 550 ms 100 / 250 / 500 ms

Tooling (repository only, not published)

  • Motion analyzer. apps/dev/tools/motion-analyzer turns screen recordings into element motion curves and fits spring/double-spring/inertia physics, which are checked against the current TypeScript engine. It exports a preset override and includes a synchronized video/timing viewer. It also infers start and end positions the recording never showed, and its closed-loop tests use synthetic fixtures. #412

Upgrade

npm install @ssgoi/react@7.3.0

Install the matching 7.3.0 version of any other @ssgoi/* packages in use. There are no public API changes, but custom transitions that do cleanup on completion should move it to onDispose to get the stronger interruption guarantees. React Native is still experimental, and native playback has not been moved to the handoff model.

Full changelog: v7.2.0...v7.3.0

Validation

  • Eight package builds and the pnpm release --dry rehearsal passed.
  • Unit tests: core 288, React 29, Angular 3, Svelte 6, React Native 20. Core ESLint is clean.
  • Browser tests: 19 passed across Chromium and WebKit (interrupted re-entry and scroll lock), with 1 skipped, the Chromium-only touch case.

Not verified: behavior on physical iOS Safari. The motion-continuity.html matrix still uses its pre-#424 criterion (a synchronous read right after attach), so the 1 px check needs updating.

Don't miss a new ssgoi release

NewReleases is sending notifications on new releases.