/* Jarvi flame spirit - animations copied from the desktop app (theme.css, .fspirit block) */
.spirit { display: inline-grid; place-items: center; line-height: 0; vertical-align: middle; flex: none; }
.spirit img, .spirit svg { display: block; max-width: 100%; height: auto; }
.fspirit { overflow: visible; }
.fspirit .fs-body { transform-origin: 60px 126px; animation: fsBreathe 3.2s ease-in-out infinite; }
.fspirit .fs-outer { transform-origin: 60px 126px; animation: fsFlickerA 0.9s ease-in-out infinite alternate; }
.fspirit .fs-inner { transform-origin: 60px 122px; animation: fsFlickerB 0.6s ease-in-out infinite alternate; }
.fspirit .fs-glow { transform-origin: 60px 82px; animation: fsGlow 2.4s ease-in-out infinite; }
.fspirit .fs-face { transform-origin: 60px 90px; animation: fsFloat 3.2s ease-in-out infinite; }
.fspirit .fs-pupil { transition: transform .35s ease; animation: fsLook 7s ease-in-out infinite; }
.fspirit .fs-lids rect { animation: fsBlink 5.2s infinite; }
.fspirit .fs-mouth { transform-origin: 60px 100px; transform: scaleY(calc(0.35 + var(--talk, 0.4) * 1.6)); transition: transform .06s; }
.fspirit .fs-sparks circle { opacity: 0; animation: fsSpark 2.6s ease-out infinite; }
.fspirit .fs-sparks .sp2 { animation-delay: .7s; } .fspirit .fs-sparks .sp3 { animation-delay: 1.3s; } .fspirit .fs-sparks .sp4 { animation-delay: 1.9s; }
.fspirit .fs-z { animation: fsZ 2.4s ease-in-out infinite; }
.fspirit .fs-dots circle { animation: fsDot 1.2s infinite; } .fspirit .fs-dots circle:nth-child(2) { animation-delay: .2s; } .fspirit .fs-dots circle:nth-child(3) { animation-delay: .4s; }
.fspirit .fs-heart { transform-origin: 96px 34px; animation: fsHeart 1s ease-in-out infinite; }
.fspirit.mood-sleep .fs-outer, .fspirit.mood-sleep .fs-inner { animation-duration: 2.4s; }
.fspirit.mood-sleep .fs-body { transform: scale(.88); animation: none; }
.fspirit.mood-speak .fs-outer, .fspirit.mood-laugh .fs-outer { animation-duration: .35s; }
.fspirit.mood-listen .fs-body { animation: fsListen 1s ease-in-out infinite; }
.fspirit.mood-listen .fs-pupil { animation: none; transform: translateY(-1px) scale(1.1); }
.fspirit.mood-think .fs-pupil { animation: none; transform: translate(3px, -4px); }
.fspirit.mood-curious .fs-face { animation: fsTilt 2s ease-in-out infinite; }
.fspirit.mood-angry .fs-outer { animation: fsRage .18s infinite alternate; }
.fspirit.mood-angry .fs-sparks circle { fill: #ff3b1f; animation-duration: 1s; }
.fspirit.mood-laugh .fs-face, .fspirit.mood-happy .fs-face { animation: fsBounce .5s ease-in-out infinite; }
.fspirit.mood-proud .fs-body { animation: fsProud 1.6s ease-in-out infinite; }
.fspirit.mood-surprised .fs-body { animation: fsPop .4s ease-out; }
.fspirit.mood-worried .fs-outer { animation-duration: 1.6s; }
@keyframes fsBreathe { 50% { transform: scale(1.03, .98); } }
@keyframes fsFlickerA { 0% { transform: scale(1, 1) skewX(0deg); } 50% { transform: scale(.98, 1.04) skewX(1.5deg); } 100% { transform: scale(1.02, .97) skewX(-1.5deg); } }
@keyframes fsFlickerB { 0% { transform: scale(1, 1) skewX(-2deg); } 100% { transform: scale(.96, 1.07) skewX(2deg); } }
@keyframes fsGlow { 50% { opacity: .7; transform: scale(1.06); } }
@keyframes fsFloat { 50% { transform: translateY(-1.5px); } }
@keyframes fsLook { 0%, 22% { transform: translate(0, 0); } 28%, 45% { transform: translate(3px, 1px); } 52%, 70% { transform: translate(-3px, 0); } 76%, 90% { transform: translate(0, -2px); } 100% { transform: translate(0, 0); } }
@keyframes fsBlink { 0%, 93%, 100% { height: 0; } 96% { height: 28px; } }
@keyframes fsSpark { 0% { opacity: 0; transform: translateY(0); } 15% { opacity: .9; } 100% { opacity: 0; transform: translateY(-34px) translateX(4px); } }
@keyframes fsZ { 0% { opacity: 0; transform: translate(0, 6px); } 50% { opacity: 1; } 100% { opacity: 0; transform: translate(8px, -10px); } }
@keyframes fsDot { 50% { opacity: .2; } }
@keyframes fsHeart { 50% { transform: scale(1.25); } }
@keyframes fsListen { 50% { transform: scale(1.06, 1.02); } }
@keyframes fsTilt { 50% { transform: rotate(-6deg); } }
@keyframes fsRage { to { transform: scale(1.06, 1.1) skewX(3deg); } }
@keyframes fsBounce { 50% { transform: translateY(-3px); } }
@keyframes fsProud { 50% { transform: scale(1.08) translateY(-2px); } }
@keyframes fsPop { 0% { transform: scale(.8); } 60% { transform: scale(1.15); } 100% { transform: scale(1); } }
@media (prefers-reduced-motion: reduce) {
  .fspirit *, .fspirit .fs-lids rect { animation: none !important; }
}
