Orbit

Icons or images riding a soft diagonal ellipse.

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 orbit

Usage

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

PropTypeDefault
durationnumber22
radiusXnumber42
radiusYnumber26
rotatenumber-32
reversebooleanfalse
pauseOnHoverbooleanfalse
showPathbooleanfalse
centerReactNode—
classNamestring—
childrenReactNode—

Also accepts the other native div attributes. radiusX and radiusY are percentages of the frame. rotate tilts the path in degrees.