AI CSS Animations

AI Generating Badge Loader

A 'Generating' pill whose border carries two bright arcs chasing around it while a sparkle turns inside. The arcs are a conic gradient spun by a registered @property angle, masked to the border.

Also known as: copilot loading pill, ai badge gradient border, generating pill animation.

Generating

HTML

<div class="ldr-ai-generating-badge" role="status">
  <svg class="ldr-ai-generating-badge-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 0C13 7 17 11 24 12C17 13 13 17 12 24C11 17 7 13 0 12C7 11 11 7 12 0Z"/></svg>
  Generating
</div>

CSS

@property --ldr-ai-generating-badge-a {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}
.ldr-ai-generating-badge {
  --s: var(--ldr-size, 48px);
  --c: var(--ldr-color, #3b82f6);
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0.45em;
  padding: 0.65em 1.15em 0.65em 0.95em;
  border-radius: 2em;
  background: color-mix(in srgb, var(--ldr-color, #3b82f6) 8%, transparent);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ldr-color, #3b82f6) 20%, transparent);
  font: 600 calc(var(--s) / 3) / 1 system-ui, sans-serif;
  color: var(--c);
}
.ldr-ai-generating-badge::before {
  content: "";
  position: absolute;
  inset: 0;
  padding: max(1px, calc(var(--s) / 24));
  border-radius: inherit;
  background: conic-gradient(from var(--ldr-ai-generating-badge-a), transparent 0 8%, var(--c) 25%, transparent 38% 58%, var(--c) 75%, transparent 88%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
  animation: ldr-ai-generating-badge-turn 2.4s linear infinite;
}
.ldr-ai-generating-badge-icon {
  width: 1.05em;
  height: 1.05em;
  fill: currentColor;
  animation: ldr-ai-generating-badge-twinkle 2.4s cubic-bezier(0.45, 0, 0.55, 1) infinite;
}
@keyframes ldr-ai-generating-badge-turn {
  to { --ldr-ai-generating-badge-a: 360deg; }
}
@keyframes ldr-ai-generating-badge-twinkle {
  0%   { transform: scale(1) rotate(0deg); }
  50%  { transform: scale(0.7) rotate(45deg); }
  100% { transform: scale(1) rotate(90deg); }
}

@media (prefers-reduced-motion: reduce) {
  .ldr-ai-generating-badge, .ldr-ai-generating-badge *, .ldr-ai-generating-badge::before, .ldr-ai-generating-badge::after, .ldr-ai-generating-badge *::before, .ldr-ai-generating-badge *::after {
    animation-duration: 3s;
  }
}

Customizing this loader

  • Color: set --ldr-color on the element or a parent. Currently previewing #3b82f6.
  • Size: set --ldr-size. Every dimension in the snippet is derived from it. Currently previewing 64px.
  • Speed: change the duration on the animation shorthand. Delays on the children are relative, so they keep their rhythm.
  • Accessibility: the root carries role="status" and an aria-label so screen readers announce the wait. The reduced-motion rule at the end slows the animation for users who asked for less motion.

Similar loaders