ai-infrastructure-hugg…
Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation,…
CSS animation patterns - transitions, keyframes, scroll-driven timelines, @property, compositor-friendly properties, prefers-reduced-motion
$ npx -y skills add agents-inc/skills --skill web-animation-css-animations --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/web-animation-css-animationsContext preview
The summary Claude sees to decide when to auto-load this skill.
CSS animation patterns - transitions, keyframes, scroll-driven timelines, @property, compositor-friendly properties, prefers-reduced-motion
name: web-animation-css-animations description: CSS animation patterns - transitions, keyframes, scroll-driven timelines, @property, compositor-friendly properties, prefers-reduced-motion
> **Quick Guide:** Transitions carry state changes (hover, focus, a toggled attribute); `@keyframes` > carries motion that loops, auto-plays, or has more than two steps; `animation-timeline` carries > scroll- and viewport-linked progress. Confining animation to `transform` and `opacity` keeps the > frames on the compositor thread, and every animation gets a `prefers-reduced-motion` branch.
**Detailed Resources:**
---
then a `transition` on the base rule is the whole mechanism; follow [examples/transitions.md](examples/transitions.md).
`@keyframes` and an `animation` shorthand; follow [examples/keyframes.md](examples/keyframes.md).
`animation-timeline: scroll()` or `view()` rather than time, and the keyframes describe progress from 0 to 1; follow [examples/keyframes.md](examples/keyframes.md).
---
<critical_requirements>
**Animate `transform` and `opacity`.** Both are composited, so the frames run off the main thread and survive a busy tab; `width`, `top` and `margin` re-run layout on every frame instead.
**Give every animation a `prefers-reduced-motion` branch.** The preference is a vestibular safety setting rather than an off switch — an opacity fade at a shorter duration usually satisfies it while keeping the state change legible.
**Use `ease-out` on enter and `ease-in` on exit.** An element arriving decelerates into place and one leaving accelerates away; `linear` reads as mechanical for anything but continuous rotation.
**Scope `will-change` to the interaction that needs it.** Each declaration holds a compositing layer for as long as the rule applies, so a blanket selector holds one per element on the page at once.
</critical_requirements>
---
**Auto-detection:** @keyframes, transition-property, transition-duration, animation-timeline, scroll-timeline, view-timeline, animation-range, animation-fill-mode, prefers-reduced-motion, will-change, cubic-bezier, linear(), @property, steps(), transform-origin
**Applies to:**
**Handled elsewhere:**
handle; the Web Animations API is where one comes from, either `element.animate()` or `element.getAnimations()` over what CSS already declared
---
<decision_framework>
Element entering -> ease-out (fast start, slow settle) Element exiting -> ease-in (slow start, fast departure) Symmetric motion -> ease-in-out Continuous rotation -> linear Playful, overshooting -> cubic-bezier with a control point past 1 Anything else -> ease-out
`ease`, the browser default, is generic enough that two adjacent animations using it read as unrelated; name the curve instead.
`animation-range` deciding where progress starts and ends
`backwards` fill so the pre-animation state holds during the delay
declarative and reads the property each frame
point list for a curve no cubic can express
</decision_framework>
---
<patterns>
Durations, easings and travel distances defined once as custom properties, so motion stays consistent across components and is retunable in one place.
:root {
--duration-fast: 150ms;
--duration-normal: 250ms;
--ease-out: cubic-bezier(0, 0, 0.2, 1); /* enter */
--ease-in: cubic-bezier(0.4, 0, 1, 1); /* exit */
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275); /* overshoot */
--lift-md: -4px;
}Full code: [examples/core.md](examples/core.md)
---
Name each property being transitioned, and express movement and size as `transform` so no frame triggers layout.
.card {
transition:
transform var(--duration-fast) var(--ease-out),
opacity var(--duration-fast) var(--ease-out);
}
.card:hover {
transform: translateY(var(--lift-md)) scale(1.02);
}`translate()` replaces `top`/`left`, `scale()` replaces `width`/`height`, and a pseudo-elem
The official skills marketplace for Agents Inc. 150+ skills covering everything from React and Prisma to Redis, ElevenLabs, and infrastructure tooling. Pick the skills that match your stack and install them via Claude Code. Need more control?
Repo: agents-inc/skills
Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation,…
LiteLLM proxy server setup, TypeScript client patterns via OpenAI SDK, model routing, fallbacks, load balancing, spend tracking, virtual keys, and production…
Serverless GPU compute platform for AI model deployment — web endpoints, GPU functions, model serving, and TypeScript client patterns
Local LLM inference with the Ollama JavaScript client -- chat, streaming, tool calling, vision, embeddings, structured output, model management, and…
Replicate SDK patterns for TypeScript/Node.js -- client setup, predictions, streaming, webhooks, file handling, model versioning, deployments, and training
Together AI SDK patterns for TypeScript — client setup, chat completions, streaming, structured output, function calling, embeddings, image generation,…