Primitives
146 named, searchable animation units — each carrying usage rules, personality affinity, composability flags, and AI guidance — that the toolchain selects, validates, and compiles into production CSS on your behalf.
What are primitives?
A primitive is the smallest named unit of motion in Animatic. It describes a single animation behavior — a fade entrance, a blur reveal, a typewriter text effect, a camera truck — with enough metadata that an AI assistant can select, validate, and compile it without ambiguity.
Primitives are not CSS snippets you copy-paste. They are structured definitions that carry intent: when to use them, when to avoid them, which personalities they work with, and how they compose with other primitives. The AI reads this metadata to make informed decisions about your animation.
Every primitive has:
- A name and slug for identification
- A category that describes its role (entrance, exit, emphasis, etc.)
- Timing and easing defaults calibrated to its personality
- CSS output — keyframes and/or transition properties
- Personality affinity — which personalities approve this primitive
- AI guidance — natural-language instructions for the AI on how to use it correctly
Anatomy of a primitive
Here is the full definition of the ed-slide-stagger primitive — the editorial personality's signature entrance:
{
"name": "Slide + Fade Stagger",
"slug": "ed-slide-stagger",
"category": "entrance",
"description": "Elements slide up 10px while fading in, with 120ms stagger intervals between siblings. The editorial signature entrance.",
"default_duration": "400ms",
"default_easing": "cubic-bezier(0.25, 0.46, 0.45, 0.94)",
"composable": true,
"stagger_compatible": true,
"stagger_offset": "120ms",
"css_class": "anim-ed-slide-stagger",
"keyframes": {
"slide-fade-in": {
"0%": { "opacity": "0", "transform": "translateY(10px)" },
"100%": { "opacity": "1", "transform": "translateY(0)" }
}
},
"css_properties": {
"initial": "opacity: 0; transform: translateY(10px)",
"visible": "opacity: 1; transform: translateY(0)"
},
"when_to_use": ["Content item entrances", "List reveals", "Card grid staggers", "Feature showcases"],
"when_to_avoid": ["Hero moments (use blur-reveal)", "Phase transitions (use crossfade)"],
"ai_guidance": "Default editorial entrance. Use with data-stagger-group attribute and engine.runSlideStagger(). Stagger timing: 80-150ms between siblings, 400-600ms per element. No blur, no 3D — just translateY + opacity.",
"personality_affinity": ["editorial"],
"source": "engine"
}
Field reference
- Name
name- Type
- string
- Description
Human-readable name. Used in search results and recommendations.
- Name
slug- Type
- string
- Description
Unique identifier. Prefixed by personality or source:
cd-(cinematic-dark),ed-(editorial),nl-(neutral-light),ct-(cinematic technique),as-(animate.style),bd-(breakdown).
- Name
category- Type
- string
- Description
The primitive's role in a sequence. See Categories below.
- Name
description- Type
- string
- Description
Plain-language description of what the primitive does and how it behaves.
- Name
default_duration- Type
- string
- Description
Default duration in milliseconds. Overridable at compile time. Calibrated to the primitive's personality.
- Name
default_easing- Type
- string
- Description
Default CSS easing function. Usually a
cubic-bezier()matched to the personality's curve set.
- Name
composable- Type
- boolean
- Description
Whether this primitive can be layered with other primitives on the same element. Non-composable primitives take exclusive control of the element.
- Name
stagger_compatible- Type
- boolean
- Description
Whether this primitive supports staggered application across sibling elements.
- Name
stagger_offset- Type
- string | null
- Description
Default delay between staggered siblings. Only present when
stagger_compatibleis true.
- Name
css_class- Type
- string
- Description
The CSS class name assigned to the element. Format:
anim-{slug}.
- Name
keyframes- Type
- object | null
- Description
CSS
@keyframesdefinitions. Null for primitives that use CSS transitions or JavaScript animation (like typewriter or count-up).
- Name
css_properties- Type
- object
- Description
CSS property values for the initial and visible states, or element/container setup requirements.
- Name
when_to_use- Type
- string[]
- Description
Contexts where this primitive is appropriate. The AI uses this for selection.
- Name
when_to_avoid- Type
- string[]
- Description
Contexts where this primitive should not be used. The AI uses this to filter out bad matches.
- Name
ai_guidance- Type
- string
- Description
Free-form instructions for the AI. Describes implementation details, common pairings, and constraints that don't fit in other fields.
- Name
personality_affinity- Type
- string[]
- Description
Which personalities this primitive is compatible with. The AI filters search results by this field when a personality is active.
- Name
source- Type
- string
- Description
Where this primitive originated. See Sources below.
Categories
Each primitive belongs to one category that describes its role in an animation sequence.
| Category | Count | Purpose |
|---|---|---|
entrance | ~25 | Elements appearing on screen — fades, slides, blur reveals, scale-ins, focus pulls |
exit | ~8 | Elements leaving — fade-outs, slide-aways, scale-downs |
emphasis | ~15 | Drawing attention to existing elements — pulses, shakes, glows, highlights |
transition | ~20 | Moving between phases or states — wipes, crossfades, camera moves, morph effects |
continuous | ~12 | Looping or long-running effects — progress bars, content cycling, breathing, ambient drift |
attention | ~8 | Tutorial-specific focus direction — spotlights, cursor simulation, step indicators, tooltips |
text | ~6 | Text-specific animations — typewriter reveals, character staggers, word-by-word fades |
data | ~5 | Data visualization motion — count-up numbers, bar chart reveals, stat pops |
reveal | ~10 | Content uncovering effects — clip-path reveals, image wipes, scroll-triggered shows |
Categories map directly to choreography phases. When you describe a sequence beat like "hero section enters," the AI searches the entrance category. When you say "transition to the next section," it searches transition. This mapping is automatic — you describe intent, not categories.
Try asking your AI
"Show me all entrance primitives compatible with cinematic-dark"
"What emphasis primitives work for editorial personality?"
"Find attention primitives for a tutorial walkthrough"
Sources
Primitives come from four distinct sources. Each source contributes different kinds of motion knowledge.
engine (31 primitives)
Built-in primitives that ship with each personality. These are the core motion vocabulary — every personality's signature entrance, default transition, and standard interactions. Engine primitives are the most thoroughly tested and carry the most detailed AI guidance.
Examples: cd-focus-stagger (cinematic-dark's signature entrance), ed-slide-stagger (editorial's default), nl-cursor-to (neutral-light's cursor simulation), ed-content-cycle (editorial's content cycling).
research (50 primitives)
Derived from cinematic camera and motion techniques adapted for UI. These translate film language — dolly shots, truck moves, crane lifts, rack focus — into CSS transforms and transitions. Research primitives tend to be higher-complexity and are concentrated in the transition category.
Examples: ct-camera-truck (horizontal dolly slide), ct-camera-crane (vertical lift), ct-rack-focus (blur shift between depth layers).
{
"name": "Camera Truck",
"slug": "ct-camera-truck",
"category": "transition",
"description": "Horizontal camera slide left or right, simulating a truck move on a dolly track.",
"default_duration": "1200ms",
"default_easing": "cubic-bezier(0.16, 1, 0.3, 1)",
"css_properties": {
"rig": "perspective: 600px; perspective-origin: 50% 40%",
"scene": "transform-style: preserve-3d; transition: transform 1.2s cubic-bezier(0.16, 1, 0.3, 1)"
},
"personality_affinity": ["cinematic-dark"],
"source": "research"
}
animate.style (17 primitives)
Curated selections from Animate.css, adapted to work within Animatic's personality system. These are familiar effects — bounce, flash, rubber band, swing — that have been re-timed and re-eased to match personality constraints. Not every Animate.css effect is included; only those that pass personality validation.
Examples: as-bounce-in, as-fade-in-up, as-zoom-in, as-swing.
breakdown (48 primitives)
Extracted from the 20 reference breakdowns — detailed analyses of exemplary animations from Linear, Notion, Vercel, and other sources. When a breakdown identifies a novel motion pattern, that pattern gets formalized as a primitive. Breakdown primitives tend to be the most specific and contextual.
Examples: Metaball merge effects from the liquid-metaball-merge breakdown, dot-grid breathing from the sparse-dot-breathing analysis, isometric card flips from the 3d-card-cascade study.
Source distribution
| Source | Count | Strength |
|---|---|---|
| engine | 31 | Core vocabulary, highest AI guidance detail |
| research | 50 | Cinematic techniques, camera-aware |
| animate.style | 17 | Familiar effects, personality-adapted |
| breakdown | 48 | Novel patterns from real-world analysis |
| Total | 146 |
The breakdown source is the fastest-growing. Each new reference analysis typically contributes 2-4 new primitives to the catalog.
Personality affinity
Every primitive declares which personalities it works with via the personality_affinity array. This is not a suggestion — it is an enforcement boundary.
When you (or your AI) select a personality, all primitive searches are automatically filtered to show only compatible primitives. A cinematic-dark session will never surface nl-spotlight or ed-content-cycle. An editorial session will never surface cd-focus-stagger or camera truck moves.
How filtering works
- You set a personality (explicitly or via the brief)
- The AI calls
search_primitiveswith your query - Results are filtered to primitives where
personality_affinityincludes your active personality - The AI selects from the filtered set
- Choreography validation double-checks personality compatibility before compilation
This two-layer check — filter at search time, validate at compile time — prevents personality drift even when the AI improvises.
Affinity distribution
| Personality | Compatible primitives | Exclusive primitives |
|---|---|---|
cinematic-dark | ~55 | Camera moves, focus-pull blur, clip-path wipes |
editorial | ~35 | Content cycling, tab crossfade, count-up numbers |
neutral-light | ~25 | Spotlight, cursor simulation, step indicators, tooltips |
montage | ~20 | Scale entrances, stat pops, whip-wipes, hard cuts |
Some primitives have multiple affinities. The ed-count-up number animation works in both editorial and neutral-light. The typewriter reveal works in cinematic-dark and editorial. These cross-personality primitives tend to be functional rather than stylistic.
Try asking your AI
"List all primitives shared between editorial and neutral-light"
"Which cinematic-dark primitives are exclusive — not available in any other personality?"
"How many entrance primitives does montage have?"
Searching and filtering
The search_primitives MCP tool searches the full 146-primitive catalog by name, category, personality, source, tags, or natural-language description.
Search strategies
| You want | Search approach |
|---|---|
| All entrances for a personality | Filter by category entrance + personality |
| A specific effect by name | Search by name or slug |
| Something that "feels like X" | Describe the motion in natural language |
| Primitives from a specific breakdown | Filter by source breakdown + breakdown ref |
| Composable primitives only | Filter by composable: true |
| Stagger-compatible effects | Filter by stagger_compatible: true |
Try asking your AI
"Search for blur-related primitives in cinematic-dark"
"Find stagger-compatible entrance primitives for editorial"
"Show me all primitives extracted from the Linear homepage breakdown"
"What ambient/continuous primitives are available for cinematic-dark backgrounds?"
"Find composable primitives I can layer on top of a slide-fade entrance"
Using primitives in choreography
Primitives are building blocks. On their own, they define a single motion. Combined into a choreography, they define a complete animated sequence.
The typical flow:
- Search — Find primitives that match your intent and personality
- Recommend — Use
recommend_choreographyto get an AI-composed sequence of primitives with timing - Validate — The choreography is checked against personality constraints, primitive compatibility, and timing guardrails
- Compile — Use
compile_motionto generate production CSS from the validated choreography
At each step, the primitive's metadata does the work. The AI reads when_to_use and when_to_avoid to select. It reads composable and stagger_compatible to plan layering. It reads default_duration and default_easing as starting points, then adjusts based on the personality's timing tiers. It reads ai_guidance for implementation specifics.
You do not need to memorize primitives. Describe what you want, name your personality, and the tools handle selection.
Try asking your AI
"I need a 5-phase product demo using cinematic-dark. Recommend choreography with focus-pull entrances, a camera orbit in the middle, and a blur-reveal hero moment."
"Build an editorial feature showcase: slide-fade stagger for the list items, content cycling for the benefits section, count-up for the stats."
"Create a neutral-light onboarding tutorial with spotlight highlights, cursor simulation moving between three input fields, and step progress indicators."