Drop icons, images, or anything else on a closed path and let them drift. The default path is a stretched ellipse tilted on a diagonal, not a perfect circle.
Icons
Orbit
22s
42%
26%
-32°
tsx
import { Orbit } from "@/components/motion/orbit"import { PiCameraBold, PiChatCircleBold, PiHeartBold, PiLightningBold, PiSparkleBold, PiStarBold,} from "react-icons/pi"export function Example() { return ( <Orbit className="size-72" duration={22} radiusX={42} radiusY={26} rotate={-32} showPath center={ <span className="text-sm font-medium tracking-wide text-foreground"> Orbit </span> } > <span className="flex size-10 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm"> <PiSparkleBold className="size-4" /> </span> <span className="flex size-10 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm"> <PiHeartBold className="size-4" /> </span> <span className="flex size-10 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm"> <PiStarBold className="size-4" /> </span> <span className="flex size-10 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm"> <PiLightningBold className="size-4" /> </span> <span className="flex size-10 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm"> <PiCameraBold className="size-4" /> </span> <span className="flex size-10 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm"> <PiChatCircleBold className="size-4" /> </span> </Orbit> )}Images






Gallery
26s
42%
24%
-32°
tsx
import { Orbit } from "@/components/motion/orbit"const IMAGES = [ "/assets/brand/demos/attachments/attachment-1.png", "/assets/brand/demos/attachments/attachment-2.png", "/assets/brand/demos/attachments/attachment-3.png", "/assets/brand/demos/attachments/attachment-4.png", "/assets/brand/demos/attachments/attachment-5.png", "/assets/brand/demos/attachments/attachment-2.png"]export function Example() { return ( <Orbit className="size-80" duration={26} radiusX={42} radiusY={24} rotate={-32} showPath center={ <span className="text-sm font-medium tracking-wide text-foreground"> Gallery </span> } > {IMAGES.map((src, index) => ( <img key={src + index} src={src} alt="" className="size-12 rounded-xl border border-border object-cover shadow-sm sm:size-16" /> ))} </Orbit> )}Installation
npx @arctis-sh/@arctis-sh/ui@latest add orbitUsage
import { Orbit } from "@/components/motion/orbit"<Orbit className="size-72" duration={22} radiusX={42} radiusY={26} rotate={-32} showPath center={<span>Orbit</span>}> <img src="/a.png" alt="" className="size-12 rounded-xl object-cover" /> <img src="/b.png" alt="" className="size-12 rounded-xl object-cover" /></Orbit>API Reference
Orbit
| Prop | Type | Default |
|---|---|---|
| duration | number | 22 |
| radiusX | number | 42 |
| radiusY | number | 26 |
| rotate | number | -32 |
| reverse | boolean | false |
| pauseOnHover | boolean | false |
| showPath | boolean | false |
| center | ReactNode | — |
| className | string | — |
| children | ReactNode | — |
Also accepts the other native div attributes. radiusX and radiusY are percentages of the frame. rotate tilts the path in degrees.