From 9d55e34bda1cff1adc7d80920b12549917b77e9c Mon Sep 17 00:00:00 2001 From: Abhishek-kumarsingh Date: Tue, 8 Sep 2026 11:05:55 +0530 Subject: [PATCH] fix(lint): dedupe CSS transform text in gsap_css_transform_conflict When one declaration (e.g. transform: scale(1.08) translate3d(1.5%, 0, 0)) matches both the translate and scale selector maps, cssFromTranslate and cssFromScale end up equal, and join(" ") concatenated the identical string with itself in both the finding message and fixHint. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01LQXJUdfkq6CGWh6KNfVXyw --- packages/lint/src/rules/gsap.test.ts | 25 +++++++++++++++++++++++++ packages/lint/src/rules/gsap.ts | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/lint/src/rules/gsap.test.ts b/packages/lint/src/rules/gsap.test.ts index e0866686f7..d6da7ecdfa 100644 --- a/packages/lint/src/rules/gsap.test.ts +++ b/packages/lint/src/rules/gsap.test.ts @@ -565,6 +565,31 @@ describe("GSAP rules", () => { expect(conflicts[0]?.message).toMatch(/x\/scale|scale\/x/); }); + it("does not duplicate the CSS transform text when one declaration matches both translate and scale", async () => { + const html = ` + +
+
hi
+
+ + +`; + const result = await lintHyperframeHtml(html); + const conflict = result.findings.find((f) => f.code === "gsap_css_transform_conflict"); + expect(conflict).toBeDefined(); + const doubled = "scale(1.08) translate3d(1.5%, 0, 0) scale(1.08) translate3d(1.5%, 0, 0)"; + expect(conflict?.message).not.toContain(doubled); + expect(conflict?.fixHint).not.toContain(doubled); + expect(conflict?.message).toContain("transform: scale(1.08) translate3d(1.5%, 0, 0)"); + }); + // --- Inline style transform detection tests --- it("warns when inline style transform: translateX conflicts with GSAP x", async () => { diff --git a/packages/lint/src/rules/gsap.ts b/packages/lint/src/rules/gsap.ts index 3860658eb2..384555e6aa 100644 --- a/packages/lint/src/rules/gsap.ts +++ b/packages/lint/src/rules/gsap.ts @@ -1351,7 +1351,7 @@ export const gsapRules: LintRule[] = [ scaleProps.length > 0 ? matchCssTransform(sel, cssScaleSelectors) : undefined; if (!cssFromTranslate && !cssFromScale) continue; const existing = conflicts.get(sel) ?? { - cssTransform: [cssFromTranslate, cssFromScale].filter(Boolean).join(" "), + cssTransform: [...new Set([cssFromTranslate, cssFromScale].filter(Boolean))].join(" "), props: new Set(), raw: call.raw, };