Merge pull request #648 from webadderallorg/fix/animate-zoom-region-transition

animate zoom region transition
This commit is contained in:
webadderall
2026-06-04 20:46:07 +10:00
committed by GitHub
2 changed files with 15 additions and 14 deletions
@@ -380,15 +380,11 @@ describe("findDominantRegion", () => {
{ id: "b", startMs: 3500, endMs: 6000, depth: 3, focus: { cx: 0.8, cy: 0.8 } },
];
// During the connected transition (between a.endMs + 200 and a.endMs + 1200)
// During the connected handoff, the next region becomes the spring target.
const result = findDominantRegion(regions, 3200, { connectZooms: true });
expect(result.strength).toBe(1);
expect(result.transition).not.toBeNull();
// Focus should be blending between the two
if (result.region) {
expect(result.region.focus.cx).toBeGreaterThan(0.2);
}
expect(result.transition).toBeNull();
expect(result.region?.id).toBe("b");
});
it("keeps the outgoing region active until the connected transition begins", () => {
@@ -124,8 +124,18 @@ function getActiveRegion(
const activeRegions = regions
.map((region) => {
const outgoingPair = connectedPairs.find((pair) => pair.currentRegion.id === region.id);
if (outgoingPair && timeMs >= outgoingPair.transitionStart) {
return { region, strength: 0 };
if (outgoingPair) {
if (timeMs >= outgoingPair.transitionStart) {
return { region, strength: 0 };
}
const zoomOutStart =
outgoingPair.currentRegion.endMs -
ZOOM_OUT_EARLY_START_MS +
ZOOM_ANIMATION_LEAD_MS;
if (timeMs >= zoomOutStart) {
return { region, strength: 1 };
}
}
const incomingPair = connectedPairs.find((pair) => pair.nextRegion.id === region.id);
@@ -240,11 +250,6 @@ export function findDominantRegion(
const connectedPairs = options.connectZooms ? getConnectedRegionPairs(regions) : [];
if (options.connectZooms) {
const connectedTransition = getConnectedRegionTransition(connectedPairs, timeMs);
if (connectedTransition) {
return connectedTransition;
}
const connectedHold = getConnectedRegionHold(timeMs, connectedPairs);
if (connectedHold) {
return { ...connectedHold, transition: null };