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.