gsap-text — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited gsap-text (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Flow: gsap-setup → gsap-animate → gsap-text → gsap-optimise → gsap-test Key files:composables/useReveal.js,plugins/gsap.js,assets/css/tailwind.css
Companion: For SplitText/ScrambleText API reference, invoke gsap-plugins. This skill covers text animation recipes only. Requires: greensock/gsap-skills// Preferred — useReveal handles everything:
const { init, hero, scroll, split } = useReveal(sectionRef)
onMounted(() => init(() => scroll()))
// Manual setup:
const { $gsap: gsap, $lazyLoadSplitText, $lazyLoadScramble } = useNuxtApp()
let SplitText, ctx
const splits = []
onMounted(async () => {
await document.fonts.ready // CRITICAL: fonts before split
SplitText = await $lazyLoadSplitText()
ctx = gsap.context(() => { /* ... */ }, scopeRef.value)
})
onUnmounted(() => {
splits.forEach(s => s.revert())
splits.length = 0
ctx?.revert()
})const s = SplitText.create(el, { type: 'words', mask: 'words' })
splits.push(s)
gsap.set(s.words, { y: '100%' })
gsap.set(el, { visibility: 'visible' })The standard heading reveal used across 25+ components.
ctx = gsap.context(() => {
const s = SplitText.create(el, { type: 'words', mask: 'words' })
splits.push(s)
gsap.set(s.words, { y: '100%' })
gsap.set(el, { visibility: 'visible' })
gsap.to(s.words, {
y: '0%', duration: 0.8, ease: 'power4.out', stagger: 0.06, force3D: true,
scrollTrigger: {
trigger: el, start: 'top 85%',
toggleActions: 'play none none reverse', invalidateOnRefresh: true,
},
})
}, scopeRef.value)<div ref="sectionRef">
<div class="reveal">
<h2 class="text-reveal">HEADING TEXT</h2>
</div>
</div>const { init, scroll } = useReveal(sectionRef)
onMounted(() => init(() => scroll()))See gsap-plugins skill for ScrambleText API reference. Recipe:
gsap.to(el, {
duration: 0.8 + el.textContent.length * 0.005,
scrambleText: { text: 'FINAL TEXT', chars: '▓░▒█▀▄╬╠╣▐▌■□', revealDelay: 0.3, speed: 0.4 },
})See references/learnings.md for full details and code examples.
document.fonts.ready before SplitText.create()autoSplit: true is for lines only (responsive reflow) — words/chars don't need it. Always pair with onSplit()visibility, not autoAlphatextContent before scrambleoverwrite: false on colocated per-word tweens<span> — use :deep(div) for gradient styles.reveal + .text-reveal pre-hide classes prevent FOUC| Method | Description |
|---|---|
init(fn) | Async: waits for fonts, lazy-loads SplitText + Scramble, creates gsap.context |
hero(selector?, overrides?) | Immediate reveal for above-fold. Auto-detects .text-reveal children |
scroll(selector?, overrides?) | Per-element ScrollTrigger reveal with .reveal + .text-reveal |
split(target) | SplitText wrapper: creates masked word split, tracks for cleanup |
// Hero (above-fold, immediate)
const { init, hero } = useReveal(sectionRef)
onMounted(() => init(() => hero('.reveal', { textDelay: 0.2 })))
// Scroll (below-fold, per-element ScrollTrigger)
const { init, scroll } = useReveal(sectionRef)
onMounted(() => init(() => scroll('.reveal', { start: 'top 75%', once: true })))Cleanup is automatic — onUnmounted reverts gsap.context and all SplitText instances.
references/text-patterns.md — Combined clip+scramble, kinetic character split, elastic type assembly, rolling text (3D slot machine), horizontal text (containerAnimation), masked lines reveal, autoSplit with ScrollTriggerreferences/learnings.md — 7 critical gotchas from production debugging~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.