gsap-interact — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited gsap-interact (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-interact → gsap-optimise → gsap-test
Companion: For GSAP core tween API, invoke gsap-core. For performance methods, invoke gsap-performance. This skill covers interaction recipes only. Requires: greensock/gsap-skillsAll patterns assume gsap.context() cleanup is in place (see gsap-animate skill).
const rect = card.getBoundingClientRect()
const xPct = ((e.clientX - rect.left) / rect.width - 0.5) * 2
const yPct = ((e.clientY - rect.top) / rect.height - 0.5) * 2const TILT_IN = { duration: 0.35, ease: 'power2.out', overwrite: 'auto' }
const TILT_OUT = { duration: 0.7, ease: 'elastic.out(1, 0.4)', overwrite: 'auto' }
ctx = gsap.context((self) => {
gsap.set(card, { transformPerspective: 900, force3D: true })
self.add('applyTilt', (xPct, yPct) => {
card.style.willChange = 'transform'
gsap.to(card, { rotationY: xPct * 14, rotationX: -yPct * 14, ...TILT_IN })
gsap.to(inner, { x: xPct * 10, y: yPct * 10, force3D: true, ...TILT_IN })
})
self.add('resetTilt', () => {
gsap.to(card, { rotationX: 0, rotationY: 0, ...TILT_OUT,
onComplete: () => { card.style.willChange = 'auto' } })
gsap.to(inner, { x: 0, y: 0, force3D: true, ...TILT_OUT })
})
}, scopeRef.value)Required CSS: .tilt-wrapper { perspective: 1000px; } .tilt-shell { transform-style: preserve-3d; }
// 1. ALL event-handler tweens inside ctx.add for cleanup
self.add('onHover', (el) => { gsap.to(el, { scale: 1.05, overwrite: 'auto' }) })
// 2. overwrite: 'auto' on EVERY rapid-fire tween
gsap.to(el, { x: 100, overwrite: 'auto' })
// 3. will-change: set on start, release onComplete
el.style.willChange = 'transform'
gsap.to(el, { x: 0, onComplete: () => { el.style.willChange = 'auto' } })
// 4. force3D: true on repeatedly animated elements
gsap.set(el, { force3D: true })See gsap-performance skill for tool selection guidance.
ctx.add('name', fn)ctx.revert() called in onUnmountedtransformPerspective set via gsap.set (not per-frame)quickTo instances created in onMounted, not in handlerswill-change released in onComplete, never permanentreferences/interaction-patterns.md — Draggable with liveSnap for SVG point editing, macOS Dock magnification effect~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.