gsap_tween_tail counts GSAP's force3D and autoRound flags as properties
Maintainers usually reply within 1 day
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 78/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- cli, typescript
- Domain
- cli
Research direction
The warning comes from packages/cli/src/utils/gsapTweenTails.ts: the NOT_PROPERTIES list (around lines 77-113) lacks force3D and autoRound, and plainProperties (around line 133) keeps them. Add both keys to the list, then check that the reproduction in the issue no longer emits gsap_tween_tail while a real shared property such as two opacity tweens still does. Done when the reproduction is clean and the existing tween-tail tests still pass.
Written by the indexing model from the issue text.
Description
Describe the bug
check's runtime warning gsap_tween_tail treats GSAP's force3D and autoRound flags as tweened properties.
collectTweenRecords leaves out GSAP's special keys (NOT_PROPERTIES: duration, ease, overwrite, immediateRender, ...) but not force3D or autoRound. So tailBetween finds a shared "property" in any two overlapping tweens of one element that both pass them, whatever they animate, whenever the earlier one ends up to 0.25 s after the later one.
A composition that passes force3D: false, autoRound: false on every tween (ours does, for crisp scaled text) gets a warning for every such pair: about 60 on a 65 s composition, every one naming only force3D, autoRound, none a real property.
That hides the case the warning is for. We had two genuine pairs (two tweens of opacity on one element at once), found by their frames once 0.8.158's seek drew them in another order, and they were lost among the flag-only warnings.
Measured on 0.8.158 (0.8.152 has the same list). The code is unchanged in v0.8.162: NOT_PROPERTIES has neither key (packages/cli/src/utils/gsapTweenTails.ts, lines 77-113), and plainProperties keeps every other key of vars (line 133).
Minimal reproduction
npx hyperframes init repro --non-interactive --example blank
Then replace repro/index.html with the file below. Only the <script> differs from the blank template: one element, two overlapping tweens of different properties (x, then opacity), both with force3D: false, autoRound: false. The earlier tween ends 0.1 s after the later one.
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #0a0a0a;
}
#root {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-family: Inter, ui-sans-serif, system-ui, sans-serif;
}
#title {
color: #f4f4f5;
font-size: 72px;
font-weight: 600;
letter-spacing: -0.03em;
}
</style>
</head>
<body>
<div
id="root"
data-composition-id="main"
data-start="0"
data-duration="10"
data-width="1920"
data-height="1080"
>
<h1 id="title" class="clip" data-start="0" data-duration="10" data-track-index="0">Title</h1>
</div>
<script>
const tl = gsap.timeline({ paused: true });
// One element, two overlapping tweens of different properties (x, then opacity).
// The earlier tween ends 0.1 s after the later one. Both pass force3D and autoRound.
tl.to("#title", { x: 200, duration: 1, force3D: false, autoRound: false }, 0);
tl.to("#title", { opacity: 0.5, duration: 0.4, force3D: false, autoRound: false }, 0.5);
window.__timelines["main"] = tl;
tl.seek(0);
</script>
</body>
</html>
Steps to reproduce
- Set up the reproduction above.
- In
repro, runnpx [email protected] check --json. - Look at
runtime.findings: onegsap_tween_tailwarning namingforce3D, autoRound. - For comparison, remove
, force3D: false, autoRound: falsefrom both tweens and run the check again:runtime.findingsis empty.
Expected behavior
No gsap_tween_tail warning. The two tweens share no tweened property (x and opacity). force3D and autoRound are GSAP flags, not properties a tween animates, so they should be left out as ease and overwrite are, and the warning should name only properties two tweens really share.
Actual behavior
check --json exits 0 with this runtime finding (other fields trimmed):
{
"code": "gsap_tween_tail",
"severity": "warning",
"message": "In timeline \"main\", a tween on force3D, autoRound of #title ends at 1.000 s, 0.100 s after a later tween on force3D, autoRound ends at 0.900 s. For that tail the earlier tween takes force3D, autoRound back and leaves its own end value on screen, so the later tween's end never shows. End the earlier tween by 0.500 s, or add overwrite: \"auto\" to the later tween.",
"sourceFile": "index.html",
"time": 0.9
}
The same composition without the two flags has no runtime findings.
Environment
OS: Windows 11 (build 26200)
Node.js: v24.14.0
HyperFrames: 0.8.158 (0.8.152 has the same NOT_PROPERTIES; code unchanged at v0.8.162)
Chrome: Chrome Headless Shell 152.0.7977.30
Additional context
Request: add force3D and autoRound to NOT_PROPERTIES (or leave out every GSAP flag that is not a tweened property), so the warning names only properties two tweens really share.
- Dominant language
- TypeScript
- Stars
- 54.1k
- Forks
- 4.9k
- Avg merge
- 9h 46m
- Merged PRs (30d)
- 652
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from heygen-com/hyperframes
-
Player: speed button's accessible name doesn't include its visible textPossibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
heygen-com/hyperframes#6021 ·
Maintainers usually reply within 1 day
-
inspector: build.mjs resolves paths with URL#pathname, fails ENOENT (F:\\F:\\...) and aborts bun run build on WindowsPossibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 1/5 Under an hour Newbie friendliness 88/100
heygen-com/hyperframes#5863 · 1 comment ·
Maintainers usually reply within 1 day
-
product-launch-video: assemble-index.mjs is not idempotent — a second run drops every approved frame videoPossibly taken @Dante-dan claimed this 5 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
heygen-com/hyperframes#5733 ·
Maintainers usually reply within 1 day
-
Timeline: show a clip's full name when its label is cut offPossibly taken @DanielMcSheehy claimed this 3 days ago. Opendesktop-candidate difficulty/easy enhancement good first issue help wanted triage/ready
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
heygen-com/hyperframes#5582 · 2 comments ·
Maintainers usually reply within 1 day
-
Studio: press ? to open the keyboard shortcuts panelMay be free again @B-Payal claimed this 7 days ago, and no pull request is open. Opendesktop-candidate difficulty/easy enhancement good first issue help wanted triage/ready
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
heygen-com/hyperframes#5580 · 1 comment ·
Maintainers usually reply within 1 day
All issues in heygen-com/hyperframes
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
Maintainers usually reply within 1 day
-
Difficulty 1/5 1-3 hours Newbie friendliness 72/100
zts212653/clowder-ai#1678 ·
Maintainers usually reply within 1 day
-
good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
Progressive-Victory/the-website#680 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100