Skip to content

Commit cfbbd59

Browse files
committed
fix(core): a keyframed fromTo also keeps its from-only values at its start
1 parent 22a52eb commit cfbbd59

2 files changed

Lines changed: 26 additions & 4 deletions

File tree

‎packages/core/src/runtime/adapters/gsap.steps.test.ts‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,30 @@ describe("gsap adapter at a tween's start", () => {
8484
expect(gsap.getProperty(box, "scaleX")).toBeCloseTo(1.4259, 3);
8585
});
8686

87+
it("keeps a keyframed fromTo's from-only values over an earlier tween's on the same element", () => {
88+
const box = document.body.appendChild(document.createElement("div"));
89+
const timeline = gsap.timeline({ paused: true });
90+
const fromTo = (origin: string, to: gsap.TweenVars, at: number) =>
91+
timeline.fromTo(
92+
box,
93+
{ scale: 1.5, transformOrigin: origin },
94+
{ scale: 1, immediateRender: false, ...to },
95+
at,
96+
);
97+
fromTo("0% 0%", { duration: 0.1 }, 0);
98+
fromTo("100% 100%", { duration: 0.1 }, 0.1);
99+
fromTo("0% 0%", { keyframes: { y: [0, 40] }, duration: 0.5 }, 0.2);
100+
timeline.set({}, {}, 1);
101+
const adapter = createGsapAdapter({
102+
getTimeline: () => timeline as unknown as RuntimeTimelineLike,
103+
});
104+
const origins = [0, 2 / 30, 0.1, 4 / 30, 0.2, 7 / 30].map((time) => {
105+
adapter.seek({ time });
106+
return box.style.transformOrigin;
107+
});
108+
expect(origins.slice(1)).toEqual(["0% 0%", "100% 100%", "100% 100%", "0% 0%", "0% 0%"]);
109+
});
110+
87111
it("still lets a set authored later on the tween's start win over its from-values", () => {
88112
const box = document.body.appendChild(document.createElement("div"));
89113
const timeline = gsap.timeline({ paused: true });

‎packages/core/src/runtime/adapters/gsap.ts‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,9 @@ function primedAtItsStart(tween: GsapAnimation): boolean {
120120
if (tween.vars?.keyframes) {
121121
tween.render(BELOW_GSAP_TIME_RESOLUTION, true);
122122
tween.render(-BELOW_GSAP_TIME_RESOLUTION, true);
123-
return true;
124123
}
125-
if (!tween._startAt) return false;
126-
tween._startAt.render(BELOW_GSAP_TIME_RESOLUTION, true, true);
127-
return true;
124+
if (tween._startAt) tween._startAt.render(BELOW_GSAP_TIME_RESOLUTION, true, true);
125+
return Boolean(tween.vars?.keyframes || tween._startAt);
128126
}
129127

130128
function primeTweensStartingAt(children: unknown[], time: number): void {

0 commit comments

Comments
 (0)