# Motion Analysis: vmotif.com Hero
## Overview
The eight frames show the **above-the-fold hero** of vmotif.com. Across the sequence, almost everything is **static**. The hero image, headline, navigation, sound toggle and CTA do not change.
The only visible motion is the **feature ticker (marquee) along the bottom edge**. It scrolls continuously to the left. Every other keyframe in the capture belongs to sections further down the page, such as workflow graphs, loaders and feature orbits.
---
## 1. Animation Libraries Detected
| Technology | Status | Evidence |
|---|---|---|
| GSAP | Not detected | No `gsap` globals or inline transform tweens |
| Framer Motion | Not detected | No `data-projection-id` or motion-generated styles |
| Lottie | Not detected | No `lottie-player` or bodymovin JSON |
| **CSS `@keyframes`** | **Primary engine** | 28 named keyframes captured |
| **CSS transitions** | **Used for UI states** | `background` / `color` at `0.28s` |
| **CSS Houdini (`@property`)** | **Likely** | `feat-orbit` animates the custom property `--feat-angle` |
| Next.js / React | Framework only | `<!--$-->` Suspense markers; no motion library attached |
**Conclusion:** This is a pure CSS animation system. Vanilla JS probably only toggles classes, for example the sound toggle and IntersectionObserver-driven reveals.
---
## 2. CSS Keyframes & Transitions
### 2.1 Hero-relevant keyframes (visible in the frames)
The bottom ticker is driven by one of the two looping translate keyframes below.
```css
@keyframes ticker {
to { transform: translate(-25%); }
}
@keyframes marquee {
0% { transform: translate(0); }
100% { transform: translate(-50%); }
}
```
The `-25%` value implies the ticker track contains **4 identical copies** of the item list. The `-50%` marquee implies **2 copies** and is probably used by a logo or model strip elsewhere on the page.
### 2.2 Global UI transition
```css
transition:
background 0.28s cubic-bezier(0.16, 1, 0.3, 1),
color 0.28s cubic-bezier(0.16, 1, 0.3, 1);
```
This applies to the nav links, the **Sign in** button, the **Start building** button and the **Sound** pill.
### 2.3 Remaining keyframes (below-the-fold sections)
**Entrance / reveal**
- `fade-in-up`: `opacity 0 → 1`, `translateY(20px → 0)`
- `sg-land`: `opacity 0 → 1`, `translateY(6px → none)`
- `cd-spawn`: `opacity 0 → 1`, using the individual `transla…Animation Capture
Point it at any live site, capture the motion, and reverse-engineer it into a Framer Motion component and CSS.
· You bring Live URL· analysis.md· Animated.tsx· animation.css
A real run, unedited2 generations · $0.86 of walletBrand and inputs are fictional, made in Vmotif · 2026-09-24
Straight off the canvas.
Everything below is what this run returned, untouched.
- Animation Analysismarkdown
# Motion Analysis: vmotif.com Hero ## Overview The eight frames show the **above-the-fold hero** of vmotif.com. Across the sequence, almost everything is **static**. The hero image, headline, navigation, sound toggle and CTA do not change. The only visible motion is the **feature ticker (marquee) along the bottom edge**. It scrolls continuously to the left. Every other keyframe in the capture belongs to sections further down the page, such as workflow graphs, loaders and feature orbits. --- ## 1. Animation Libraries Detected | Technology | Status | Evidence | |---|---|---| - AnimatedComponent.tsxtsx
import React, { useRef, useState } from 'react'; import { motion, useAnimationFrame, useMotionValue, useReducedMotion, useTransform, } from 'framer-motion'; import './feature-ticker.css'; export interface TickerItem { /** Visible label, rendered uppercase with wide tracking */ label: string; /** Optional glyph or icon node shown before the label */ - animation.csscss
/* ========================================================================== vmotif-style Hero + Infinite Feature Ticker Pure CSS animation system (no JS motion required). Companion files (summarised here, since this deliverable is CSS only): 1) React component (HeroTicker.tsx), Framer Motion version: - Props: items: {icon: string; label: string}[], duration?: number (default 20), copies?: number (default 4), pauseOnHover?: boolean, direction?: 'left' | 'right'. - Renders .ticker > motion.div.ticker__track containing `copies` repeated ul.ticker__set. Every set after the first gets aria-hidden. - animate={{ x: ['0%', `-${100 / copies}%`] }} transition={{ duration, ease: 'linear', repeat: Infinity }}. Linear easing matches the measured constant ~17-18px per frame.
Two stages, in order.
What each stage reads, what it makes and what it cost on this run. Each stage starts once the one before it finishes.
- 01
Analyze Animation
Reads your inputsMakes Animation Analysis
- 02
Recreate Animation
Reads stage 01Makes 3 files
Or let your agent run it.
This run went through the Vmotif MCP server, the way Claude Code, Cursor or any MCP client drives it: seed the canvas, fill the inputs, run the graph.
create_canvas({ premade_workflow_id: "animation-capture" })
update_canvas({ canvas_id, updates: [/* your inputs */] })
run_workflow({ workflow_id: canvas_id })MCP docs Drop in a screenshot, a live URL, or a brand reference and get production-ready front-end code back.




