Orbit animation
Also called orbiting icons or orbiting circles
Small icons or dots circling a central element on one or more rings, often used to show the tools a product connects to.
import { motion, useReducedMotion } from 'motion/react';
const OUTER = ['Stripe', 'GitHub', 'Slack', 'Figma'];
const INNER = ['Resend', 'Sentry', 'Linear'];
export function IntegrationsOrbit() {
return (
<div className='relative grid size-80 place-items-center'>
<Ring tools={OUTER} radius={140} seconds={32} direction={1} />
<Ring tools={INNER} radius={80} seconds={20} direction={-1} />
<img src='/logo.svg' alt='Layerwise' className='relative size-14' />
</div>
);
}
type RingProps = {
tools: string[];
radius: number;
seconds: number;
direction: 1 | -1;
};
function Ring({ tools, radius, seconds, direction }: RingProps) {
const reduceMotion = useReducedMotion();
// Linear and endless, so the ring never pauses between laps.
const loop = { duration: seconds, ease: 'linear', repeat: Infinity } as const;
const turn = (sign: number) =>
reduceMotion ? undefined : { rotate: sign * 360 };
return (
<motion.div
animate={turn(direction)}
transition={loop}
className='absolute rounded-full border border-dashed'
style={{ width: radius * 2, height: radius * 2 }}
>
{tools.map((tool, i) => {
const angle = (i / tools.length) * 2 * Math.PI;
const [x, y] = [Math.cos(angle) * radius, Math.sin(angle) * radius];
return (
<div
key={tool}
className='absolute -translate-1/2'
style={{ left: radius + x, top: radius + y }}
>
{/* Spin the other way at the same speed to stay upright. */}
<motion.img
animate={turn(-direction)}
transition={loop}
src={`/logos/${tool.toLowerCase()}.svg`}
alt={tool}
className='size-10 rounded-full border bg-background p-2'
/>
</div>
);
})}
</motion.div>
);
}Build an integrations orbit for the landing page: our logo in the center with two dashed rings, 4 tool icons on the outer ring (140px radius) and 3 on the inner ring (80px radius). Rotate the outer ring clockwise every 32s and the inner ring counterclockwise every 20s with linear timing, counter-rotate each icon so it stays upright, and keep everything still when prefers-reduced-motion is set.
Paste into Layerwise or any AI coding tool.
What is Orbit animation?
In an orbit animation, items travel around a center point on circular paths, like planets around a sun. Landing pages use it to show a product and the tools it works with: the logo sits in the middle and integration icons circle it on one or two rings.
The usual build rotates a ring with transform: rotate() on a linear, infinite loop, with the icons placed around its edge. Because the icons turn with the ring, each one also spins the opposite way at the same speed, which keeps it upright. Rings moving in opposite directions at different speeds add depth.
Keep the speed slow, 20 to 40 seconds per lap, so people can recognize the icons. Use linear timing so the motion never pauses, and stop it under prefers-reduced-motion. Rotation only touches transform, so it is cheap for the browser.
Often confused with
- Rotate
- Rotate spins an element around its own center. An orbit moves items around a separate center point, usually by rotating their parent.
Related terms
All termsRotate
A CSS transform that turns an element around its transform origin by an angle, such as `rotate(45deg)`.
Transform origin
The point an element rotates and scales around. It defaults to the center, and moving it changes where a transform seems to start.
Looping animation
An animation that plays more than once, either a set number of times or forever, set in CSS with animation-iteration-count.
Linear easing
Easing that moves at one constant speed from start to finish, with no speeding up or slowing down, drawn as a straight line on a graph.
Build it with Layerwise
Describe your app, watch it run in a live preview, and publish it with a database, storage, and sign-in built in.