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.
<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>
@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;
}
}--ldr-color on the element or a parent.
Currently previewing #3b82f6.--ldr-size. Every dimension in the snippet is
derived from it. Currently previewing 64px.animation shorthand.
Delays on the children are relative, so they keep their rhythm.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.