๐ŸŽฎ A type is all that's missing

Both sides run identical CSS โ€” same var(), same transition, same @keyframes. The only difference: the right side's variables are registered with @property. Click and watch what a type unlocks.

1 ยท Transition a color

plain variable
--hue
the browser sees text โ†’ snaps
@property <number>
--hue
the browser sees a number โ†’ eases

2 ยท Animate a conic gradient

plain variable
unregistered <angle> โ†’ frozen
@property <angle>
typed <angle> โ†’ spins
Show the CSS โ€” the entire difference is these two blocks
/* Register the variables. That's the whole fix. */
@property --hue {
  syntax: "<number>"; inherits: false; initial-value: 220;
}
@property --spin {
  syntax: "<angle>"; inherits: false; initial-value: 0deg;
}

/* ...and the rest is the CSS you already wrote. */
.swatch { background: hsl(var(--hue) 78% 62%); transition: --hue .6s ease; }
.orb    { background: conic-gradient(from var(--spin), โ€ฆ); animation: spin 2s linear infinite; }
@keyframes spin { to { --spin: 360deg; } }