text-motion
Skill1 starsChanged 4 months agoMITView on GitHub
Kinetic text-motion + gradient + transition toolkit for HTML/CSS motion-graphics videos — the polished "launch reel" look: keyword glow-highlight sweeps, gradient-filled hero words, scramble-decode headlines, ticker-roll word swaps, living color-arc gradient backgrounds with drifting blobs, concentric ring ripples, blueprint grids, and glass UI accents (pills, cursors, prompt cards). Use when making an animated title/heading feel dynamic and varied, adding a moving gradient background, giving each scene its own heading entrance, or matching a reference reel's text motion. Triggers: "make the headings more dynamic", "text motion", "highlight the keyword", "gradient background through the video", "animate the title like that reel", "scramble/decode text", "words rolling like a ticker", "make it more graphic". Complements kinetic-typography (word cascade / hero-push) and smooth-render (capture).
In this repository16 other files it gives its agents.
- aesthetic-presetsSkill
- audio-stemsSkill
- backgrounds-gradientsSkill
- element-motionSkill
- explainer-videoSkill
- glass-cardsSkill
- kinetic-typographySkill
- mark-driven-groundSkill
- motion-graphicsSkill
- product-motionSkill
- scene-transitionsSkill
- smooth-renderSkill
- travelling-markSkill
- ui-data-motionSkill
- vo-syncSkill
- walkthrough-filmSkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 2 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 23
All CSS timing scales by --R so effects survive slow-clock rendering.
- Very specific: line 114
Use .tm-sc on every scene layer for the fade plus a visibility flip after it — this lets scene backgrounds be transparent (so the gradient …
- Distinctive: line 119
When something is already travelling through the frame — a logo, a dot, the spark from a reference reel — the text can belong to it: the …
- Distinctive: line 137
Ask for "the platter" to get the whole menu.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Text Motion
Drop-in building blocks (assets/textmotion.css + assets/textmotion.js) for varied, dynamic
text motion and living backgrounds in plain HTML — distilled from launch-reel references and a
full documentary build. The point: stop every heading animating the same way, and give the
frame constant subtle motion (gradient + blobs) so nothing feels like a static slide.
All CSS timing scales by --R so effects survive slow-clock rendering. Every JS updater takes a
logical time t (your clock, in seconds) — call them from your render/rAF loop, never off
wall-clock, or motion speeds up under capture.
<link rel="stylesheet" href="assets/textmotion.css">
<script src="assets/textmotion.js"></script>Pick a different entrance per heading (variety is the fix)
Reference reels never repeat one text move. Assign each scene its own:
| Effect | When to use | How |
| Word-rise | default, calm lines | tmSplit(el) then tmReveal(el,t0,t1,t) |
| Scramble-decode | crypto/tech/reveal beats | tmScramble(el,'PLAIN',t0,t1,t,'<em>final</em>') |
| Keyword sweep | the one word that matters | wrap it <span class="tm-kw">word</span>, tmSweep(kw,at,t) |
| Gradient-fill hero | big single-word hero | <span class="tm-grad">Online</span> |
| Ticker-roll | a slot cycling synonyms | .tm-ticker>.tm-roll>i…, tmTicker(roll,t0,t) |
| Punch | quick emphasis pop | <span class="tm-punch">, tmPunch(el,at,t) |
| Typewriter + cursor | a mark/dot is already travelling the frame | tmTypeBuild(el,words,{pay}) then tmType(el,t) + tmTypeCursor(el,t) |
| Highlighter pill | the payoff word of a typed line | wrap it as the pay run — it lands in an accent pill that wipes in, white letters, 6° tilt settle |
Keyword glow-highlight sweep (ref: "Truly highlight what matters", "promotion?")
The strongest, most-copied move: a light bar sweeps behind the key word, which then stays lit.
<h3>Encryption ends where usefulness begins:
<span class="tm-kw warm">in use</span></h3>tmSweep(document.querySelector('.tm-kw'), /*cue*/ 1.2, t); // per frameVariants: .tm-kw (mint), .tm-kw.purple, .tm-kw.warm. Add .lit fires automatically 0.35s after the sweep.
Scramble-decode headline (ref: cipher reels)
tmScramble($('#h'),'Could a machine compute on what it cannot read?',
0.1, 1.5, t, 'Could a machine compute on what it <em>cannot read?</em>');Ticker-roll (ref: single-word heroes swapping)
Your <span class="tm-ticker"><span class="tm-roll" id="rl">
<i>intelligence</i><i>code</i><i>secrets</i><i>data</i><i>prompts</i></span></span> flows out.tmTicker(document.getElementById('rl'), /*scene t0*/ 0, t); // holds word 1, then rolls; mask width tracks each wordLiving gradient background (ref: mesh / radial / ripple reels)
A background that narrates: a color arc across the film + slow drift = constant motion with zero "busy" feeling.
<div class="tm-gradbg" id="bg">
<div class="tm-blob b1"></div><div class="tm-blob b2"></div><div class="tm-blob b3"></div>
</div>
<!-- your content sits above with z-index > 0 -->const ARC = { // one palette per scene = the story turn
problem:{ga:'#0e1622',gb:'#070a12',b1:'#26375e',b2:'#1a3a4e',b3:'#2a2a44'},
cost: {ga:'#161008',gb:'#0a0806',b1:'#6e5220',b2:'#3a2f5e',b3:'#7a4a1a'}, // warm/amber
answer: {ga:'#0b1512',gb:'#080a12',b1:'#1e5a4e',b2:'#3a2f6e',b3:'#2a5a4a'}, // teal
brand: {ga:'#1a1206',gb:'#0a0708',b1:'#8a6522',b2:'#6e3f6e',b3:'#a05a2a'}, // gold reveal
};
tmGrad(bg, ARC[scene]); // on scene change (CSS blends it)
tmDrift(bg, t); // every frame (logical time)Extras: .tm-rings + tmRings(host) for concentric ripples (ref: "AI SaaS Animation");
.tm-grid for a blueprint field (ref: "Introducing").
Critical for rendering: softness comes from radial-gradient falloff, never
filter:blur()— blur is ~10× slower in headless Chromium/Edge (software-rasterized) and drops capture to ~5fps. This one rule is why the blobs are gradient-only.
Glass UI accents (ref: prompt card, "Let's go" pill, live cursors)
The "design-tool" motif: a glass pill/button, a prompt card, or named collaborator cursors gliding to the text.
<span class="tm-pill">Let's go ✦</span>
<img class="tm-cursor" id="cur" src="cursor.svg">
<div class="tm-tag" style="background:#e8552e">Sarah</div>tmCursor(cur, [[0.3,50,46],[1.0,36,44,true]], t); // path: [t, x%, y%, click?]Transitions between scenes (no more plain cross-fades)
- The shared
.tm-gradbgpersists, so a scene change is a content cross-dissolve over a moving gradient — already feels intentional. - Use
.tm-scon every scene layer for the fade plus a visibility flip after it — this lets scene backgrounds be transparent (so the gradient shows) without the previous scene ever bleeding through. Toggle.onon the active scene each frame.
Spark-driven text (typewriter · cursor · pill · echoes)
When something is already travelling through the frame — a logo, a dot, the spark from a reference reel — the text can belong to it: the line types, the travelling element is the cursor, the payoff word lands in a highlighter pill, and ghost echoes ripple off it.
tmTypeBuild(line, [{w:'Block',at:0},{w:'it,',at:.31},{w:'in',at:.52},
{w:'real',at:.64},{w:'time.',at:.88}], {pay:[4,4], echo:true});
tmType(line, t); // per frame
const c = tmTypeCursor(line, t, {space: stage}); // {x,y} of the typing edge — ride your mark thereThe whole family (A17–A22) is written up in PLATTER.md under "A″ · Spark-driven text". The background half of the move — the rings the mark flew along, the lit arc behind it, the glow where it landed — is the mark-driven-ground skill.
Part of the motion-graphics super-skill
This skill is family A (text) of the motion-graphics umbrella. The full named menu of ~40
moves across all families (backgrounds, elements, glass/UI, transitions, UI/data) lives in
motion-graphics/PLATTER.md, and the shared building-block library (24 helpers) is mirrored in
motion-graphics/assets/motion.{css,js} (same source as this skill's assets/textmotion.{css,js}).
Ask for "the platter" to get the whole menu.
Composes with
- kinetic-typography — word-cascade + hero-push staging (this skill is the effect library).
- smooth-render — render to MP4; scale CSS durations by
1/ratevia--R, drive JS updaters by logical time, and keep thefilter:blurrule above or capture starves. Pause ambient animations when idle:document.documentElement.classList.toggle('tm-paused', !playing). - vo-sync — set each effect's cue time from VO word timestamps so the sweep/scramble/punch land on the spoken word.
Notes
- Units in the assets are
%/emso blocks scale to any container; set the accent palette via--tm-accent / --tm-accent2 / --tm-warmon:rootor a wrapper. - Give each scene a distinct entrance — the whole reason this skill exists is that identical headings read as a slideshow.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

