chore: consolidate the skill packages under .agents/

The repository had two skill directories. `skills/` held the four written
for this project; `.agents/skills/` held the ones the agent context refers
to. Nothing said which an agent should read, and `.agents/ORCHESTRATOR.md`
only ever pointed at the second.

Move the first four into `.agents/skills/` so there is one location, and
add the vendored packages this chapter work used: `animation-vocabulary`
and `improve-animations` (emilkowalski/skills), `teach` (mattpocock/skills),
plus a local `translation` skill and `audit-translations.mjs` for the EN/PT
pairs.

`skills-lock.json` pins the vendored three by source and content hash, so a
later re-vendor is a diff rather than a guess. `.claude/skills/` is
symlinks into `.agents/skills/`, which is what makes them loadable here
without a second copy on disk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Marcos Paulo
2026-09-06 16:03:23 -03:00
parent 61de2f6270
commit ab2308441c
38 changed files with 2662 additions and 122 deletions
@@ -0,0 +1,275 @@
---
name: animation-vocabulary
description:
Reverse-lookup glossary that turns a vague description of a web animation or
motion effect into its exact term ("the bouncy thing when a popover opens" →
Pop in; "the iOS rubber-band scroll" → Rubber-banding). Use when the user asks
"what's it called when…", or describes a motion effect without knowing its
name and wants the right word to prompt an AI or designer with. For naming an
effect, not designing or building one.
---
# Animation Vocabulary
Turn a vague description of a motion or effect into the precise term, so the
user knows what to ask for.
## Quick Start
The user describes an effect loosely. You return the matching term(s) in this
format:
```
**Stagger** — Animate several items one after another with a small delay between each, creating a cascade.
```
If several terms could fit, list the best match first, then 12 alternates with
a one-line note on how they differ.
## Instructions
1. **Read for intent, not keywords.** Users describe what they _see_ or _feel_
("springy", "slides off", "draws itself in"), not the technical name. Map the
sensation to the glossary below.
2. **Quote the glossary verbatim.** Its descriptions are authoritative — use
them as-is, don't paraphrase.
3. **Disambiguate close terms.** When two compete (_Clip-path_ vs _Mask_, _Pop
in_ vs _Bounce_, _Shared element transition_ vs _Layout animation_), contrast
them so the user can pick.
4. **When nothing matches exactly,** name the closest term and say plainly it's
an approximation, or describe the effect in the glossary's vocabulary (e.g.
"that's a _stagger_ of _scale-in_ entrances").
5. **Stay within this glossary.** If a term genuinely isn't here, say so rather
than inventing one — though you may explain the concept using these words.
6. **Keep it tight.** A naming question wants a name, not an essay. Lead with
the term; expand only if asked.
## Examples
**Example 1 — feel-based** User: "What's it called when a popover seems to grow
out of the button you clicked instead of from its middle?" Output:
```
**Origin-aware animation** — An element animates out of its trigger, like a popover growing from the button that opened it instead of from its own center which is the default in CSS.
```
**Example 2 — disambiguation** User: "The thing where one image turns into
another image." Output:
```
**Morph** — One shape smoothly turns into another shape, e.g. Dynamic Island.
Close alternates:
- **Crossfade** — if they simply fade over each other in the same spot.
- **Shared element transition** — if an element travels and transforms from one position into another.
```
**Example 3 — physics feel** User: "That iOS scroll where it resists and snaps
back when you pull too far." Output:
```
**Rubber-banding** — Resistance and snap-back when you drag past a boundary (the iOS overscroll feel).
```
## Glossary
_A curated snapshot mirroring the project's `/vocabulary` page; keep the two in
sync when either changes._
### Entrances & Exits — how elements appear and disappear
- **Fade in / Fade out** — Element appears or disappears by changing opacity.
- **Slide in** — Element enters by sliding in from off-screen (left, right, top,
or bottom).
- **Scale in** — Element grows from smaller to full size as it appears, often
paired with a fade.
- **Pop in** — Element appears with a slight overshoot, like it bounces into
place.
- **Reveal** — Content is uncovered gradually, often by animating a clip-path or
mask.
- **Enter / Exit** — The animation an element plays when it's added to or
removed from the screen.
### Sequencing & Timing — coordinating multiple elements or moments
- **Keyframes** — Defined points in an animation (0%, 50%, 100%) that the
browser fills the gaps between.
- **Interpolation / Tween** — Generating all the in-between frames between a
start and end value, so motion is continuous.
- **Stagger** — Animate several items one after another with a small delay
between each, creating a cascade.
- **Orchestration** — Deliberately timing multiple animations so they feel like
one coordinated motion.
- **Delay** — Time before an animation starts.
- **Duration** — How long an animation takes.
- **Fill mode** — Whether an element keeps its first or last frame's styles
before the animation starts or after it ends (e.g. forwards).
- **Stepped animation** — An animation that is divided into discrete steps, like
a countdown timer.
### Movement & Transforms — changing an element's position, size, or angle
- **Translate** — Move an element along the X or Y axis.
- **Scale** — Make an element bigger or smaller.
- **Rotate** — Spin an element around a point.
- **Skew** — Slant an element along the X or Y axis, shearing it out of its
rectangular shape.
- **3D tilt / Flip** — Rotate in 3D space (rotateX / rotateY) to add depth.
- **Perspective** — How strong the 3D effect looks — a lower value exaggerates
depth, like the viewer is closer.
- **Transform origin** — The anchor point a scale or rotation grows or spins
from.
- **Origin-aware animation** — An element animates out of its trigger, like a
popover growing from the button that opened it instead of from its own center
which is the default in CSS.
### Transitions Between States — connecting one state, view, or element to another
- **Crossfade** — One element fades out as another fades in, in the same spot.
- **Continuity transition** — A change that keeps the user oriented by visually
connecting before and after. For example, making the same rectangle bigger and
smaller.
- **Morph** — One shape smoothly turns into another shape, e.g. Dynamic Island.
- **Shared element transition** — An element travels and transforms from one
position into another, like a thumbnail expanding into a card.
- **Layout animation** — When an element's size or position changes, it animates
to the new spot instead of snapping.
- **Accordion / Collapse** — A section smoothly expands and collapses its height
to show or hide content.
- **Direction-aware transition** — Content slides one way going forward and the
opposite way going back, so navigation has a sense of direction.
### Scroll — motion tied to scrolling or navigating between views
- **Scroll reveal** — Elements fade or slide into place as they enter the
viewport.
- **Scroll-driven animation** — An animation whose progress is tied directly to
scroll position.
- **Parallax** — Background and foreground move at different speeds while
scrolling, creating depth.
- **Page transition** — An animation that plays when navigating from one page or
route to another.
- **View transition** — The browser morphs between two states or pages,
connecting shared elements.
### Feedback & Interaction — responding to the user's actions
- **Hover effect** — Visual change when the cursor moves over an element.
- **Press / Tap feedback** — A subtle scale-down when an element is clicked, so
it feels physical.
- **Hold to confirm** — A progress effect that fills up while the user holds a
button.
- **Drag** — Moving an element by grabbing it, often with momentum when
released.
- **Drag to reorder** — Dragging items in a list to rearrange them, while the
others shift to make room.
- **Swipe to dismiss** — Dragging an element off-screen to close it, like a
drawer or toast.
- **Rubber-banding** — Resistance and snap-back when you drag past a boundary
(the iOS overscroll feel).
- **Shake / Wiggle** — A quick side-to-side jitter signaling an error or
rejected input.
- **Ripple** — A circle expanding from the point of a tap, confirming the press.
### Easing — how speed changes over an animation
- **Easing** — The rate at which an animation speeds up or slows down.
- **Ease-out** — Starts fast, ends slow. The default for most UI and anything
responding to the user.
- **Ease-in** — Starts slow, ends fast. Usually avoided; can feel sluggish.
- **Ease-in-out** — Slow, fast, slow. Good for elements already on screen moving
from A to B.
- **Linear** — Constant speed. Avoid for UI; reserve for spinners or marquees.
- **Cubic-bezier** — A custom easing curve you define for precise control.
- **Asymmetric easing** — A curve that accelerates and decelerates at different
rates. Feels more alive than a symmetric one.
### Spring Animations — physics-based motion as an alternative to fixed-duration easing
- **Spring** — Motion driven by physics (tension, mass, damping) rather than a
set duration.
- **Stiffness / Tension** — How strongly the spring pulls toward its target.
Higher feels snappier.
- **Damping** — How quickly a spring settles. Lower damping means more bounce
and oscillation.
- **Mass** — How heavy the animated element feels. More mass makes it slower and
more sluggish.
- **Bounce** — A spring that overshoots and settles, adding playfulness.
- **Perceptual duration** — How long a spring feels finished, even though it
keeps micro-settling underneath.
- **Momentum** — Motion that carries velocity, especially after a drag or
interruption.
- **Velocity** — How fast and in which direction an element is moving. A spring
carries it into the next animation when interrupted, so a flicked element
keeps its speed.
- **Interruptible animation** — An animation that can be smoothly redirected
mid-flight instead of finishing first.
### Looping & Ambient Motion — animations that run on their own
- **Marquee** — Text or content that scrolls continuously in a loop.
- **Loop** — An animation that repeats, a set number of times or infinitely.
- **Alternate (yoyo)** — A loop that plays forward then reverses each iteration,
instead of jumping back to the start.
- **Orbit** — An element circling around another in a continuous path.
- **Pulse** — A gentle repeating scale or opacity change to draw attention.
- **Float** — A gentle, continuous up-and-down drift that makes a static element
feel alive and weightless.
- **Idle animation** — Subtle motion that plays while an element is just sitting
there, waiting to be interacted with.
### Polish & Effects — the small touches that separate good from great
- **Blur** — A blur filter used to soften an element or mask tiny imperfections.
- **Clip-path** — Clipping an element to a shape, used for reveals, masks, and
before/after sliders.
- **Mask** — Hiding or revealing parts of an element using a shape or gradient —
like clip-path, but with soft, fadeable edges.
- **Before / after slider** — A draggable divider that wipes between two
overlaid images to compare them.
- **Line drawing** — An SVG path that draws itself in, like an invisible pen
tracing it.
- **Text morph** — Text that animates character by character when it changes,
drawing attention to the new value.
- **Skeleton / Shimmer** — A placeholder with a moving sheen shown while content
loads.
- **Number ticker** — Digits rolling or counting up to a value.
- **Tabular numbers** — Fixed-width digits so numbers don't shift around as they
change. Essential for tickers, timers, and counters.
- **Typewriter** — Text appearing one character at a time, as if being typed.
### Performance — what keeps motion smooth instead of stuttering
- **Frame rate (FPS)** — Frames drawn per second. 60fps is the baseline for
smooth motion; 120fps on newer displays.
- **Jank** — Visible stutter when the browser drops frames because it can't keep
up with the animation.
- **Dropped frame** — A frame the browser missed its deadline to draw, causing a
tiny hitch in motion.
- **Compositing** — Letting the GPU move or fade an element on its own layer
without redoing layout or paint.
- **will-change** — A CSS hint that an element is about to animate, so the
browser can promote it to its own layer ahead of time.
- **Layout thrashing** — Animating properties like width, height, top, or left
that force the browser to recalculate layout every frame, causing jank.
### Principles to Know — concepts that guide when and how to animate
- **Purposeful animation** — Motion should serve a function — orient, give
feedback, show relationships — not just decorate.
- **Anticipation** — A small wind-up in the opposite direction before a move,
hinting at what's about to happen.
- **Follow-through** — Parts of an element keep moving and settle slightly after
the main motion stops, adding weight.
- **Squash & stretch** — Deforming an element as it moves to convey weight,
speed, and flexibility.
- **Perceived performance** — The right animation makes an interface feel
faster, even when it isn't.
- **Frequency of use** — The more often a user sees an animation, the shorter
and subtler it should be.
- **Spatial consistency** — Animating so an element keeps its identity and
position across states, so users never lose track of where things went.
- **Hardware acceleration** — Animating transform and opacity lets the GPU keep
motion smooth.
- **Reduced motion** — Respecting the user's prefers-reduced-motion setting by
toning down or removing motion.