Le composant repose sur deux classes de base. .skel-bone-circle (l'avatar, 48 × 48 px, border-radius: 50%) et .skel-bone (six surfaces rectangulaires) partagent le même fond gris fantôme rgba(255, 255, 255, 0.08), un position: relative et un overflow: hidden. La carte .card-skel mesure 280 px de contenu intérieur avec 20 px de padding — rendu à 322 px une fois les bordures comptées. La ligne d'en-tête utilise display: flex; gap: 14px : l'avatar occupe 48 px fixes, le div restant (flex: 1, soit 218 px) accueille le titre (14 px de haut, 65 % = 142 px) et le sous-titre (10 px, 45 % = 98 px).
Le reflet est porté par le pseudo-élément ::after de chaque zone. Il est positionné en position: absolute; inset: 0 et porte background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.10) 50%, transparent 100%) / 200% 100%. @keyframes shimmerSlide anime background-position de -200% 0 à 200% 0 en 1,8 s ease-in-out infini. Avec un fond d'image large de 200 % et une formule de position en pourcentage (décalage = p/100 × (W − 2W)), le centre lumineux part de 3 × la largeur de l'élément à droite et finit à 1 × la largeur à gauche — le reflet traverse donc de droite à gauche. Il est visible environ 25 % du cycle (≈ 0,45 s).
Les sept zones scintillent en phase : aucune règle animation-delay n'est présente, toutes partagent le même delay: 0s. Les largeurs des trois lignes de corps sont 100 %, 100 % et 60 % (168 px). La deuxième ligne devrait afficher 92 % d'après la règle .card-skel-line:nth-child(2) du CSS, mais cette règle ne s'applique jamais : les lignes occupent les positions 3, 4 et 5 dans .card-skel (derrière .card-skel-header et .card-skel-img). La règle :last-child à 60 %, elle, s'applique correctement. Le code ne contient aucun JavaScript.
Repose sur @keyframes, linear-gradient, background-size, background-position animée, position: relative/absolute, inset et overflow: hidden. Aucune variable CSS du site (var(--…)) — fonctionne sur une page vierge sans contexte externe.
Sans animation CSS (navigateur très ancien ou accélération matérielle désactivée), les zones s'affichent comme des blocs statiques semi-transparents — la structure de chargement reste compréhensible. La propriété inset requiert Chrome 87 / Firefox 87 / Safari 14.1 ; sur les navigateurs antérieurs, remplacez par top: 0; right: 0; bottom: 0; left: 0.