React + MotionLoaders
macOS-style spinner
Twelve rounded bars fading in turn around a circle, like the spinner you know from a Mac.
Settings
56px
1s
Code
import { motion } from "framer-motion";
interface MacOSSpinnerProps {
size?: number;
/** Segundos por vuelta. */
speed?: number;
}
export default function MacOSSpinner({
size = 56,
speed = 1,
}: MacOSSpinnerProps) {
return (
<div
role="status"
aria-label="Loading"
className="relative"
style={{ width: size, height: size }}
>
{Array.from({ length: 12 }, (_, i) => (
<motion.span
key={i}
className="absolute left-1/2 top-0 block rounded-full bg-[#1d1d1f] dark:bg-[#f5f5f7]"
style={{
width: size / 11,
height: size / 3.4,
marginLeft: -size / 22,
transformOrigin: `${size / 22}px ${size / 2}px`,
rotate: i * 30,
}}
animate={{ opacity: [0.16, 1, 0.16] }}
transition={{ duration: speed, repeat: Infinity, delay: (i * speed) / 12 }}
/>
))}
</div>
);
}
Prompt for AI
Paste it into ChatGPT, Claude or Cursor and it will adapt the block to your project with these settings, even if you don’t use React.
More in Loaders
Where to use it
This macOS style spinner feels at home in interfaces that look like desktop software: a web-based photo editor, an Electron app or the sync indicator in the toolbar of a notes tool. It takes the text color of the page, so it switches between light and dark mode on its own and never looks out of place.
It reads best at small and medium sizes, next to a label like “Syncing…” or inside a toolbar. Very large, the individual bars start to look heavy, and a lighter ring may suit you better.