@property enregistre --bg-angle comme propriété CSS de type <angle>. Sans cette déclaration, animer un gradient de 0 deg à 360 deg produirait un saut instantané — le moteur ne saurait pas interpoler un angle dans background-image. Avec @property, l'interpolation est identique à celle d'un nombre : l'animation breathingAngle (12 s, linéaire) fait alors tourner l'angle du dégradé en continu, sans accroc.
Les arrêts de couleur sont exprimés en OKLCH (oklch(L% C H)). Contrairement à HSL, OKLCH garantit une luminosité perceptuellement uniforme : un passage violet → rose → vert ne produit pas de bosse de luminosité au milieu du dégradé. Le composant H (teinte, 0–360) est le seul paramètre qui varie d'un arrêt à l'autre ; L et C restent stables, ce qui rend les transitions d'une douceur impossible en sRGB.
La seconde animation, breathingHue (8 s, ease-in-out), déplace background-position selon un trajet diagonal : 0 % 50 % → 100 % 0 % → 100 % 100 % → 0 % 100 %. Couplé à background-size: 300 % 300 % — le dégradé occupe trois fois la surface de l'élément — ce déplacement fait défiler les teintes sur toute la zone visible. Les deux durées non-multiples (8 s / 12 s) garantissent que les animations ne se resynchronisent pas dans les premières minutes, produisant un cycle long et imprévisible.
L'effet est 100 % CSS : aucun JavaScript, aucune dépendance. Il se compose naturellement avec border-radius, clip-path ou mask, et s'applique à n'importe quel élément HTML. Un overlay position: absolute avec un background: rgba(0,0,0,0.3) suffit à rendre le texte superposé lisible sans toucher au gradient.
Sur Firefox < 128, <code>@property</code> n'est pas supporté : l'angle reste à 0 deg (gradient statique), mais l'animation <code>breathingHue</code> sur <code>background-position</code> continue de fonctionner. Sur Chrome/Edge < 111 ou Safari < 15.4, <code>oklch()</code> n'est pas reconnu : le gradient est ignoré et l'élément s'affiche avec un fond uni via la couleur de secours définie dans <code>initial-value</code>.