From 1248639e71e08fd87722f9e5b186cf3fc514ca07 Mon Sep 17 00:00:00 2001 From: miga-heygen Date: Fri, 2 Oct 2026 12:06:17 +0000 Subject: [PATCH] fix(lint): point the repeated fromTo baseline hint at immediateRender: false (#3895) The repeated fromTo baseline lint hint now points at immediateRender: false. Hint text only; rule logic unchanged. --- packages/lint/src/rules/gsap.test.ts | 23 +++++++++++++++++++++++ packages/lint/src/rules/gsap.ts | 7 ++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/lint/src/rules/gsap.test.ts b/packages/lint/src/rules/gsap.test.ts index e4a0798cd2..0f8dc49499 100644 --- a/packages/lint/src/rules/gsap.test.ts +++ b/packages/lint/src/rules/gsap.test.ts @@ -3056,6 +3056,29 @@ describe("SVG draw-on rules", () => { expect(finding?.severity).toBe("warning"); expect(finding?.selector).toBe("#ring"); + expect(finding?.fixHint).toContain("every fromTo except the earliest-positioned one (at 5s)"); + expect(finding?.fixHint).toContain("gsap_timeline_set_initial_hide"); + }); + + it("gsap_repeated_fromto_without_baseline: accepts the hinted shape when the later tween is authored first", async () => { + const html = ` + +
+ + +`; + const result = await lintHyperframeHtml(html); + const finding = result.findings.find( + (candidate) => candidate.code === "gsap_repeated_fromto_without_baseline", + ); + + expect(finding).toBeUndefined(); }); it("gsap_repeated_fromto_without_baseline: accepts explicit immediateRender false", async () => { diff --git a/packages/lint/src/rules/gsap.ts b/packages/lint/src/rules/gsap.ts index 215669de77..721d282578 100644 --- a/packages/lint/src/rules/gsap.ts +++ b/packages/lint/src/rules/gsap.ts @@ -1148,9 +1148,10 @@ export const gsapRules: LintRule[] = [ `(immediateRender), not at tween position.`, selector, fixHint: - `Add \`immediateRender: false\` to the destination vars of each future fromTo, or set a safe ` + - `resting state with an earlier \`tl.set("${selector}", { ... }, 0)\`. Pre-first-tween seeks must not ` + - `inherit whichever fromTo call happened to author last.`, + `Add \`immediateRender: false\` to every fromTo except the earliest-positioned one ` + + `(at ${firstFromToPosition}s), so pre-first-tween seeks keep its "from" values. ` + + `A hiding \`tl.set(..., 0)\` baseline trips gsap_timeline_set_initial_hide, and a \`gsap.set\` ` + + `authored before the fromTo calls is overwritten by them.`, snippet: truncateSnippet(fromToWindows.map((win) => win.raw).join("\n")), }); }