/* The feature wrappers keep blinks, expressions and speech independent. */
.avatar-features .eye { transform-box:fill-box; transform-origin:center; animation:kynd-eye-blink 7s ease-in-out infinite; }
.avatar-features .eye-right { animation-delay:.09s; }
.avatar-eye-shape { transform-box:fill-box; transform-origin:center; animation:kynd-eye-look 12s ease-in-out infinite; }
.avatar-features[data-eyes=sparkle] .avatar-eye-shape { animation:kynd-eye-twinkle 5.4s ease-in-out infinite; }
.avatar-features[data-eyes=happy] .avatar-eye-shape { animation:kynd-eye-delight 6s ease-in-out infinite; }
.avatar-features[data-eyes=wink] .eye-right { animation:kynd-eye-wink 6s ease-in-out infinite; }
.avatar-features[data-eyes=wink] .eye-left .avatar-eye-shape { animation:kynd-eye-delight 6s ease-in-out infinite; }
.avatar-features[data-eyes=sleepy] .avatar-eye-shape { animation:kynd-eye-dream 8s ease-in-out infinite; }
.avatar-features[data-eyes=hearts] .avatar-eye-shape { animation:kynd-eye-love 4.8s ease-in-out infinite; }
.avatar-features[data-eyes=lashes] .eye { animation:kynd-eye-flutter 6s ease-in-out infinite; }
.avatar-features[data-eyes=curious] .avatar-eye-shape { animation:kynd-eye-curious 9s ease-in-out infinite; }
.avatar-features[data-eyes=robot] .avatar-eye-shape { animation:kynd-eye-scan 5s steps(4,end) infinite; }
.avatar-features[data-eyes=monocle] .avatar-eye-shape { animation:kynd-eye-curious 9s ease-in-out infinite; }
.avatar-features[data-eyes=hero] .avatar-eye-shape { animation:kynd-eye-hero 8s ease-in-out infinite; }
.avatar-glasses { transform-origin:80px 70px; animation:kynd-glasses-bob 7s ease-in-out infinite; }
.avatar-lens-glint { animation:kynd-lens-glint 5s ease-in-out infinite; }
.avatar-monocle { transform-origin:98px 70px; animation:kynd-monocle-tilt 9s ease-in-out infinite; }
.avatar-mouth-expression { transform-box:fill-box; transform-origin:center; animation:kynd-mouth-smile 7s ease-in-out infinite; }
.avatar-features[data-mouth=grin] .avatar-mouth-expression { animation:kynd-mouth-grin 6s ease-in-out infinite; }
.avatar-features[data-mouth=tiny] .avatar-mouth-expression { animation:kynd-mouth-tiny 7s ease-in-out infinite; }
.avatar-features[data-mouth=oh] .avatar-mouth-expression { animation:kynd-mouth-wonder 5s ease-in-out infinite; }
.avatar-features[data-mouth=tongue] .avatar-mouth-expression { animation:kynd-mouth-cheeky 6s ease-in-out infinite; }
.avatar-features[data-mouth=smirk] .avatar-mouth-expression { animation:kynd-mouth-smirk 8s ease-in-out infinite; }
.avatar-features[data-mouth=kiss] .avatar-mouth-expression { transform-box:view-box; transform-origin:80px 96px; animation:kynd-mouth-kiss 6s ease-in-out infinite; }
.avatar-kiss-heart { opacity:0; transform-box:fill-box; transform-origin:center; }
.smile .avatar-kiss-heart { animation:kynd-kiss-heart 6s ease-out infinite; }
.avatar-speaking-mouth .avatar-kiss-heart { display:none; }
body.is-speaking .avatar-features[data-mouth=kiss] .avatar-speaking-mouth { transform:scaleY(calc(.9 + var(--speech,0)*.3)); }
.avatar-features[data-mouth=cat] .avatar-mouth-expression { animation:kynd-mouth-purr 5s ease-in-out infinite; }
.avatar-features[data-mouth=fang] .avatar-mouth-expression { animation:kynd-mouth-fang 7s ease-in-out infinite; }
.avatar-speaking-mouth { transform-origin:80px 94px; }
body.is-speaking .avatar-speaking-mouth { transform:scaleY(calc(.8 + var(--speech,0)*.85)); }
/* The greeting's sleepy/waking poses still own the outer lids. */
body[data-phase=sleeping] #heartAvatar .eye { animation:none; transform:scaleY(.16); }
body[data-phase=sleeping] #heartAvatar .avatar-eye-shape,
body[data-phase=sleeping] #heartAvatar .avatar-mouth-expression { animation-play-state:paused; }
body[data-phase=finding] #heartAvatar .eye { animation:open-eyes 1.6s both,kynd-eye-blink 7s 1.6s infinite; }
body[data-phase=awakening] #heartAvatar .eye { animation:delighted-eyes 1.9s both,kynd-eye-blink 7s 1.9s infinite; }

@keyframes kynd-eye-blink { 0%,42%,46%,74%,78%,100% { transform:scaleY(1); }44%,76% { transform:scaleY(.12); } }
@keyframes kynd-eye-look { 0%,18%,40%,65%,100% { transform:translate(0,0); }25%,34% { transform:translate(1.8px,-.5px); }72%,82% { transform:translate(-1.5px,.5px); } }
@keyframes kynd-eye-twinkle { 0%,35%,70%,100% { transform:rotate(0) scale(1); }45% { transform:rotate(20deg) scale(1.13); }55% { transform:rotate(-12deg) scale(.92); } }
@keyframes kynd-eye-delight { 0%,30%,80%,100% { transform:translateY(0) scale(1); }45%,65% { transform:translateY(-1.5px) scale(1.08); } }
@keyframes kynd-eye-wink { 0%,35%,55%,100% { transform:scaleY(1); }42%,48% { transform:scaleY(.35) rotate(-8deg); } }
@keyframes kynd-eye-dream { 0%,100% { transform:translateY(0) rotate(0); }50% { transform:translateY(1.3px) rotate(-7deg); } }
@keyframes kynd-eye-love { 0%,24%,45%,100% { transform:scale(1); }30% { transform:scale(1.16); }38% { transform:scale(1.09); } }
@keyframes kynd-eye-flutter { 0%,35%,43%,49%,100% { transform:scaleY(1); }39%,46% { transform:scaleY(.3); } }
@keyframes kynd-eye-curious { 0%,15%,45%,100% { transform:translate(0,0) scale(1); }24%,34% { transform:translate(2px,-1px) scale(1.05); }65%,78% { transform:translate(-2px,1px); } }
@keyframes kynd-eye-scan { 0%,100% { transform:translateX(-1.5px); opacity:1; }50% { transform:translateX(1.5px); opacity:.72; } }
@keyframes kynd-eye-hero { 0%,20%,60%,100% { transform:scaleY(1); }35%,45% { transform:translateY(1px) scaleY(.65); } }
@keyframes kynd-glasses-bob { 0%,30%,65%,100% { transform:translateY(0) rotate(0); }43%,52% { transform:translateY(-1.5px) rotate(-3deg); } }
@keyframes kynd-lens-glint { 0%,25%,75%,100% { opacity:.35; }45%,55% { opacity:1; } }
@keyframes kynd-monocle-tilt { 0%,20%,55%,100% { transform:rotate(0); }30%,40% { transform:rotate(-5deg) translateY(-1px); } }
@keyframes kynd-mouth-smile { 0%,25%,75%,100% { transform:scale(1); }45%,60% { transform:scale(1.1,1.18); } }
@keyframes kynd-mouth-grin { 0%,25%,65%,100% { transform:scale(1); }36%,52% { transform:scale(1.08,1.15) translateY(-.7px); }44% { transform:scale(1.04,.9); } }
@keyframes kynd-mouth-tiny { 0%,100% { transform:scale(1); }50% { transform:scale(1.2,1.12) translateY(-.7px); } }
@keyframes kynd-mouth-wonder { 0%,30%,80%,100% { transform:scale(1); }45%,60% { transform:scale(.85,1.2); } }
@keyframes kynd-mouth-cheeky { 0%,28%,72%,100% { transform:rotate(0) scaleY(1); }42% { transform:rotate(-7deg) scaleY(1.12); }55% { transform:rotate(5deg) scaleY(1.06); } }
@keyframes kynd-mouth-smirk { 0%,25%,80%,100% { transform:rotate(0) translateY(0); }45%,65% { transform:rotate(-5deg) translateY(-1px); } }
@keyframes kynd-mouth-kiss { 0%,30%,72%,100% { transform:scale(1); }42%,50% { transform:scale(.82,1.08); }60% { transform:scale(1.05,.97); } }
@keyframes kynd-kiss-heart { 0%,43%,76%,100% { opacity:0; transform:translate(0,0) scale(.45); }48% { opacity:.9; transform:translate(2px,-1px) scale(.7); }60% { opacity:.75; transform:translate(8px,-6px) scale(1); }74% { opacity:0; transform:translate(15px,-13px) scale(.85); } }
@keyframes kynd-mouth-purr { 0%,100% { transform:scale(1) translateY(0); }35% { transform:scale(1.1,.9) translateY(.6px); }65% { transform:scale(.97,1.12) translateY(-.6px); } }
@keyframes kynd-mouth-fang { 0%,25%,80%,100% { transform:scale(1) rotate(0); }45%,60% { transform:scale(1.09,1.12) rotate(-3deg); } }
/* History and reduced-motion views keep the selected expression at rest. */
.cmhl-static .avatar-features * { animation:none !important; transform:none !important; }
@media(prefers-reduced-motion:reduce) {
  .avatar-features *, .avatar-speaking-mouth { animation:none !important; transform:none !important; }
}

/* ── KYNDCREATE (web) ──────────────────────────────────────────────────────
   Generated by scripts/sync-web-avatar.mjs from renderer/kynd-avatar-motion.css.
   Do not edit this file; edit that one and run the script again.

   Below is the web's own addition. Nothing speaks here, so the app's second,
   lip-synced mouth would only double the expression's line. */
.avatar-speaking-mouth { display: none; }
