/* Animations ASCII (app web : /static/ascii.css ; panneau : ascii.css). Hauteurs réservées partout : rien ne bouge dans la page. */

/* Attente de l'estimation : journal de 4 lignes + indicateur. */
.journal { font: .8rem/1.4 var(--mono); color: var(--ambre); height: calc(5 * 1.4em); overflow: hidden; margin: 0 0 .75rem; white-space: nowrap; }
.journal .lignes { height: calc(4 * 1.4em); overflow: hidden; }
.journal .ligne { overflow: hidden; text-overflow: clip; }
.journal .barre { color: var(--ambre); }
.curseur { animation: clignote 1s steps(1) infinite; } /* un clignotement par seconde */
@keyframes clignote { 50% { opacity: 0; } }
.attente-fixe { display: none; margin: 0 0 .75rem; font: .8rem/1.4 var(--mono); color: var(--ambre); }

/* Un texte qui change sans bouger : le vrai texte reste en place, transparent ; le faux défile par-dessus (sans texte alternatif). */
.masque { position: relative; color: transparent !important; }
.masque::after { content: attr(data-decode); content: attr(data-decode) / ""; position: absolute; left: 0; top: 0; white-space: nowrap; color: var(--texte); }
.gros .valeur.masque::after { color: var(--texte); }

/* Jauge : les segments s'allument l'un après l'autre (délais posés par le script). */
.jauge.anim i.on { animation: allume .05s steps(1) backwards; }
@keyframes allume { from { background: var(--filet); } }

/* Lecture de la page : un balayage ░▒▓█▓▒░ qui passe dans une zone de largeur fixe, et le compteur. */
.lus { display: inline-flex; align-items: baseline; gap: .5rem; }
.balayage { display: inline-block; width: 14ch; height: 1.4em; overflow: hidden; font: .8rem/1.4 var(--mono); color: var(--texte-2); white-space: nowrap; }
.balayage::before { content: '░▒▓█▓▒░'; content: '░▒▓█▓▒░' / ''; display: inline-block; opacity: 0; }
.balayage.go::before { animation: balaie .7s steps(14) forwards; }
@keyframes balaie { from { transform: translateX(-7ch); opacity: 1; } 99% { opacity: 1; } to { transform: translateX(14ch); opacity: 0; } }

/* Validation : [ OK ] 500 ms puis disparaît (la place reste prise : rien ne se déplace). */
.entete .etat { display: inline-flex; align-items: center; gap: .5rem; }
.ok { font: .75rem/1 var(--mono); color: var(--vert); white-space: nowrap; animation: ok-vie .5s steps(1) forwards; }
@keyframes ok-vie { to { visibility: hidden; } }

/* États vides : scène en image fixe de 5 lignes (le script change l'image). */
pre.bol { display: block; width: 13ch; margin: 0 auto .75rem; text-align: left; font: .85rem/1.2 var(--mono); height: calc(5 * 1.2em); color: var(--texte-3); }

/* Le système demande moins de mouvement : tout est fixe, avec « Estimation en cours… » en texte à la place du journal. */
@media (prefers-reduced-motion: reduce) {
  .journal, .ok { display: none; }
  .attente-fixe { display: block; }
  .curseur, .jauge.anim i.on, .balayage.go::before { animation: none; }
}
