/* Tapatahi ECG loader (assets/js/ecg-loader.js): the app's loading symbol. */
.ecg { display: inline-flex; align-items: center; justify-content: center; line-height: 0; vertical-align: middle; animation: ecg-in 280ms ease-out 200ms both; }
.ecg svg { overflow: visible; display: block; }
.ecg__breathe { animation: ecg-breathe 2.2s ease-in-out infinite; }
@keyframes ecg-breathe { 0%, 100% { opacity: 1; } 50% { opacity: .45; } }
@keyframes ecg-in { from { opacity: 0; } to { opacity: 1; } }
.ecg-block { display: flex; justify-content: center; align-items: center; padding: 40px 0; }
.ecg-block[hidden] { display: none; }
/* Busy buttons keep their size: label goes invisible, the ECG sits on top. */
.btn.is-busy { position: relative; color: transparent !important; pointer-events: none; }
.btn.is-busy .ecg-btn { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: #fff; }
.btn.is-busy .ecg-btn .ecg { animation: none; }
