waapi
Web Animations API adapter patterns for FrameVideo. Use when authoring element.animate() motion, Animation currentTime seeking, document.getAnimations(), KeyframeEffect timing, fill modes, or native browser animations that must render deterministically in FrameVideo.
How do I install this agent skill?
npx skills add https://github.com/chanjing-ai/framevideo --skill waapiIs this agent skill safe to install?
- Gen Agent Trust Hubpass
The skill provides architectural patterns and code examples for using the Web Animations API (WAAPI) within the FrameVideo framework. It includes standard development validation commands and references to official documentation.
- Socketpass
No alerts
- Snykpass
Risk: LOW · No issues
What does this agent skill do?
Web Animations API for FrameVideo
When To Use
Use WAAPI for:
- Zero-dependency animations — no external libraries needed
- Lightweight DOM motion — simple transforms and opacity changes
- Native browser performance — browser-optimized keyframe engine
- Generated animations — creating animations from structured data
- Minimal bundle size — when every KB counts
Do NOT Use
Avoid WAAPI for:
- Complex timeline sequencing — use
gsap(better timeline control) - Default choice — use
gsapunless you specifically want zero dependencies - CSS-only decoration — use
css-animations(simpler) - 3D/WebGL — use
three - Designer exports — use
lottie
Quick Start
Basic WAAPI animation in FrameVideo:
<div id="orb" class="clip orb" data-start="2" data-duration="3">Animate me</div>
<script>
const orb = document.getElementById("orb");
const animation = orb.animate(
[
{ transform: "translateX(-160px) scale(0.8)", opacity: 0 },
{ transform: "translateX(0) scale(1)", opacity: 1, offset: 0.35 },
{ transform: "translateX(120px) scale(1.08)", opacity: 1 },
],
{
duration: 3000,
delay: 2000,
easing: "cubic-bezier(0.2, 0, 0, 1)",
fill: "both", // REQUIRED for FrameVideo
iterations: 1,
},
);
animation.pause(); // Pause immediately
</script>
Key points:
- Use
fill: "both"to hold seeked states - Call
animation.pause()after creation - Use finite
iterations
Contract
- Create animations synchronously during composition initialization.
- Use
element.animate(...)with finitedurationanditerations. - Use
fill: "both"so seeked states persist. - Pause animations after creation or let the adapter pause them on first seek.
- Avoid callbacks and promises for render-critical state.
The adapter calls document.getAnimations(), sets each animation's currentTime to FrameVideo time in milliseconds, then pauses it.
Basic Pattern
<div id="orb" class="clip orb" data-start="2" data-duration="3" data-track-index="2"></div>
<script>
const orb = document.getElementById("orb");
const animation = orb.animate(
[
{ transform: "translate3d(-160px, 0, 0) scale(0.8)", opacity: 0 },
{ transform: "translate3d(0, 0, 0) scale(1)", opacity: 1, offset: 0.35 },
{ transform: "translate3d(120px, 0, 0) scale(1.08)", opacity: 1 },
],
{
duration: 3000,
delay: 2000,
easing: "cubic-bezier(0.2, 0, 0, 1)",
fill: "both",
iterations: 1,
},
);
animation.pause();
</script>
Stagger Pattern
document.querySelectorAll(".token").forEach((token, index) => {
const animation = token.animate(
[
{ transform: "translateY(24px)", opacity: 0 },
{ transform: "translateY(0)", opacity: 1 },
],
{
duration: 620,
delay: index * 80,
easing: "cubic-bezier(0.2, 0, 0, 1)",
fill: "both",
iterations: 1,
},
);
animation.pause();
});
Good Uses
- Lightweight DOM motion where CSS keyframes are too rigid and GSAP is unnecessary.
- Generated animations from structured data.
- Simple timelines that can be represented as keyframes, delays, and offsets.
Avoid
- Infinite
iterations. - Depending on
animation.finishedto mutate render-critical DOM. - Running separate clocks with
requestAnimationFrame, timers, orperformance.now(). - Animating layout properties when transforms and opacity can express the motion.
- Assuming clip-local start time is automatic. WAAPI adapter seeks document-level animation time; model clip offsets with
delayor create the animation on an element whose visibility is controlled by FrameVideo timing.
Validation
After editing a WAAPI composition:
npx framevideo lint # Check structure
npx framevideo validate # Check runtime errors
npx framevideo preview # Scrub timeline to verify seekability
Manual checks:
- Fill mode — all animations use
fill: "both" - Paused state — animations paused after creation
- Finite iterations — no infinite loops
- Seekability — scrub preview, animation holds at any frame
- Performance — prefer transform/opacity over layout properties
Credits And References
- FrameVideo adapter source:
packages/core/src/runtime/adapters/waapi.ts. - MDN Web Animations API guide: https://developer.mozilla.org/docs/Web/API/Web_Animations_API/Using_the_Web_Animations_API
- MDN
Animation.currentTime: https://developer.mozilla.org/en-US/docs/Web/API/Animation/currentTime
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/chanjing-ai/framevideo/waapi">View waapi on skillZs</a>