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.
onCompleteis now separate from an ownership-checkedonDispose, and asyncprepareis guarded by generations andAbortSignal. 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 /
cacheComponentspages 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 afadesequence 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/coreis 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 adoubleSpring500/49 ×2 with a soft start, and exit is aspring280/33.5. Both directions settle in about 0.5 s with no overshoot. The zoom background strategy can now take a separateexitPhysics, chosen by mode (enter/exit);staticandexpandare 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-analyzerturns screen recordings into element motion curves and fits spring/double-spring/inertia physics, which are checked against the current TypeScript engine. It exports a presetoverrideand 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.0Install 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 --dryrehearsal 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.