/* Peek-a-Bot — Sweepy animations (v0.3.0, head only)  spec §5.
   Root state classes on <svg.sweepy>:
     idle pool   i-look i-blink2 i-yawn i-antwig i-bored i-think i-hum i-shy i-wink i-peekaboo
     peek        peek
     wince pool  w-shake w-oops w-squint w-dizzy w-raspberry
     celebrate   c-jump c-spin c-hearts c-stars c-hat c-wiggle c-sparkle c-laugh c-bounce c-sing c-proud c-giggle
     scan        scan
     sleepy      sleepy       wake  wake
     win + dance d-dance1 d-dance2 d-dance3
     fail        fail
   Every root animation is named k-<class> so sweepy.js can clear the class on animationend.
   Antenna: the tip always pulses and sways; "excited" states (peek, celebrate, win, wake) make
   it wobble fast and flicker. */

/* Palette (owner decision pending, Sep 2026): the head's colours live here so a re-skin is a few lines.
   classic = Signal Sweep blue/violet; the kids' game uses a pastel palette set on :root by app.css / the picker. */
:root{--sw-g1:#5D5FEF;--sw-gm:#4099EF;--sw-g2:#22D3EE;--sw-plate:.14;--sw-ear:#8B5CF6;--sw-tip1:#bff7ff;--sw-tip2:#22D3EE;--sw-tip3:#0891b2;--sw-glow:rgba(34,211,238,.3)}
.sweepy{width:100%;height:100%;display:block;overflow:visible;filter:drop-shadow(0 8px 18px var(--sw-glow))}
.sweepy *{transform-box:fill-box;transform-origin:center}
.sweepy .headG{transform-box:view-box;transform-origin:24px 30px}
.sweepy .ant{transform-box:view-box;transform-origin:24px 10.5px;animation:antsway 3.2s ease-in-out infinite}
.sweepy .antTip{animation:antpulse 2.2s ease-in-out infinite}
.sweepy .antHalo{animation:anthalo 2.2s ease-in-out infinite}
.sweepy .antGleam{animation:antgleam 2.2s ease-in-out infinite}
.sweepy .eye{animation:blink 4.2s infinite}
.sweepy .browL,.sweepy .browR,.sweepy .eye,.sweepy .pupil,.sweepy .cheekL,.sweepy .cheekR{transition:transform .28s,opacity .3s}
.sweepy .headG{transition:transform .3s}
.sweepy .hat,.sweepy .notes,.sweepy .happy,.sweepy .hearts,.sweepy .stars,.sweepy .spirals,.sweepy .xeyes,.sweepy .shades,.sweepy .goggles,.sweepy .sparkles,
.sweepy .mFlat,.sweepy .mO,.sweepy .mGrin,.sweepy .mLaugh,.sweepy .mFrown,.sweepy .mWobble,.sweepy .mSmirk,.sweepy .mTongue,.sweepy .mSmall,.sweepy .mSing,.sweepy .mKiss,.sweepy .mWhistle,.sweepy .zzz{display:none}
.sweepy .battery{display:none}
.sweepy.hasBattery .battery{display:block}
.sweepy .batFill{transition:width .35s,fill .35s}

@keyframes blink{0%,91%,100%{transform:scaleY(1)}94%{transform:scaleY(.1)}}
@keyframes antsway{0%,100%{transform:rotate(-4deg)}50%{transform:rotate(4deg)}}
@keyframes antpulse{0%,100%{transform:scale(1);filter:drop-shadow(0 0 2px rgba(34,211,238,.6))}50%{transform:scale(1.12);filter:drop-shadow(0 0 6px rgba(34,211,238,.95))}}
@keyframes anthalo{0%,100%{transform:scale(.85);opacity:.12}50%{transform:scale(1.2);opacity:.26}}
@keyframes antgleam{0%,100%{opacity:.5}50%{opacity:1}}
/* excited antenna: a livelier sway and a soft, quicker glow — never frantic */
@keyframes antwild{0%,100%{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}
@keyframes antflicker{0%,100%{transform:scale(1.05);filter:drop-shadow(0 0 3px var(--sw-flashglow,rgba(255,209,102,.7)))}50%{transform:scale(1.25);filter:drop-shadow(0 0 8px var(--sw-flashglow,rgba(255,209,102,1)))}}
@keyframes antburst{0%,100%{transform:scale(1);opacity:.2}50%{transform:scale(1.5);opacity:.4}}
.sweepy.peek .ant,.sweepy[class*="c-"] .ant,.sweepy.win .ant,.sweepy.wake .ant,.sweepy.i-peekaboo .ant{animation:antwild 1.1s ease-in-out infinite}
.sweepy.peek .antTip,.sweepy[class*="c-"] .antTip,.sweepy.win .antTip,.sweepy.wake .antTip,.sweepy.i-peekaboo .antTip{animation:antflicker .9s ease-in-out infinite}
.sweepy.peek .antHalo,.sweepy[class*="c-"] .antHalo,.sweepy.win .antHalo,.sweepy.wake .antHalo{animation:antburst .9s ease-in-out infinite}
.sweepy[class*="c-"] .antTip,.sweepy.win .antTip{fill:var(--sw-flash,#ffd166)}

/* shared helpers */
@keyframes tilt{0%,100%{transform:rotate(0)}50%{transform:rotate(-7deg)}}
@keyframes tiltR{0%,100%{transform:rotate(0)}50%{transform:rotate(8deg)}}
@keyframes headshake{0%,100%{transform:rotate(0)}20%{transform:rotate(-7deg)}40%{transform:rotate(6deg)}60%{transform:rotate(-4deg)}80%{transform:rotate(3deg)}}
@keyframes antwig{0%,100%{transform:rotate(0)}25%{transform:rotate(-18deg)}55%{transform:rotate(13deg)}80%{transform:rotate(-7deg)}}
@keyframes earwig{0%,100%{transform:scaleY(1)}50%{transform:scaleY(1.35)}}
@keyframes blushIn{0%{opacity:0}30%,80%{opacity:.85}100%{opacity:0}}
@keyframes noteFloat{0%{opacity:0;transform:translateY(6px) scale(.6)}30%{opacity:1}100%{opacity:0;transform:translateY(-12px) scale(1.15) rotate(8deg)}}
@keyframes pop{0%{transform:scale(0)}60%{transform:scale(1.25)}100%{transform:scale(1)}}
@keyframes heartbeat{0%,100%{transform:scale(1)}30%{transform:scale(1.25)}60%{transform:scale(1.05)}}
@keyframes starspin{0%{transform:scale(.6) rotate(0)}50%{transform:scale(1.2) rotate(180deg)}100%{transform:scale(1) rotate(360deg)}}
@keyframes spin2d{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
@keyframes dropfall{0%{opacity:0;transform:translateY(-4px)}30%{opacity:.95}100%{opacity:0;transform:translateY(9px)}}
@keyframes chatter{0%,100%{transform:scaleY(.6)}50%{transform:scaleY(1.2)}}
.sweepy .n1{transform-origin:center}.sweepy .n2{transform-origin:center}

/* ---------- idle pool ---------- */
.sweepy.i-look{animation:k-i-look 2.2s}
.sweepy.i-look .eye{animation:lookaround 2.2s}
.sweepy.i-look .browL,.sweepy.i-look .browR{animation:lookaround 2.2s}
.sweepy.i-look .headG{animation:lookhead 2.2s}
@keyframes k-i-look{to{transform:none}}
@keyframes lookaround{0%,100%{transform:none}25%{transform:translateX(-2.8px)}65%{transform:translateX(2.8px)}}
@keyframes lookhead{0%,100%{transform:rotate(0)}25%{transform:rotate(-4deg)}65%{transform:rotate(4deg)}}
.sweepy.i-blink2{animation:k-i-blink2 1.2s}
.sweepy.i-blink2 .eye{animation:blink2 .55s 2}
@keyframes k-i-blink2{to{transform:none}}
@keyframes blink2{0%,100%{transform:scaleY(1)}50%{transform:scaleY(.08)}}
.sweepy.i-yawn{animation:k-i-yawn 2s}
.sweepy.i-yawn .mSmile{display:none}.sweepy.i-yawn .mO{display:block;animation:yawn 2s}
.sweepy.i-yawn .eye{animation:none;transform:scaleY(.3) translateY(1.6px)}
.sweepy.i-yawn .browL,.sweepy.i-yawn .browR{transform:translateY(-1px)}
.sweepy.i-yawn .headG{animation:tilt 2s}
@keyframes k-i-yawn{to{transform:none}}
@keyframes yawn{0%,100%{transform:scale(.4)}40%,70%{transform:scale(1.5)}}
.sweepy.i-antwig{animation:k-i-antwig 1.9s}
.sweepy.i-antwig .ant{animation:antwig .95s ease-in-out 2}
.sweepy.i-antwig .eye{animation:none;transform:translateY(-2px)}
.sweepy.i-antwig .browL,.sweepy.i-antwig .browR{transform:translateY(-2.5px)}
@keyframes k-i-antwig{to{transform:none}}
.sweepy.i-bored{animation:k-i-bored 2.2s}
.sweepy.i-bored .eye{animation:none;transform:scaleY(.42) translateY(1.6px)}
.sweepy.i-bored .browL,.sweepy.i-bored .browR{transform:translateY(1.8px)}
.sweepy.i-bored .mSmile{display:none}.sweepy.i-bored .mFlat{display:block}
@keyframes k-i-bored{to{transform:none}}
.sweepy.i-think{animation:k-i-think 2.2s}
.sweepy.i-think .eye{animation:none;transform:translate(2.2px,-2.4px)}
.sweepy.i-think .browL{transform:translateY(-3.2px) rotate(-12deg)}.sweepy.i-think .browR{transform:translateY(1px)}
.sweepy.i-think .mSmile{display:none}.sweepy.i-think .mSmirk{display:block}
.sweepy.i-think .headG{animation:tiltR 2.2s}
@keyframes k-i-think{to{transform:none}}
.sweepy.i-hum{animation:k-i-hum 2.4s}
.sweepy.i-hum .eye{animation:none;opacity:0}.sweepy.i-hum .happy{display:block}
.sweepy.i-hum .mSmile{display:none}.sweepy.i-hum .mSmall{display:block}
.sweepy.i-hum .notes{display:block}.sweepy.i-hum .n1{animation:noteFloat 1.2s 2}.sweepy.i-hum .n2{animation:noteFloat 1.2s .6s 2}
.sweepy.i-hum .headG{animation:lookhead 2.4s}
@keyframes k-i-hum{to{transform:none}}
.sweepy.i-shy{animation:k-i-shy 2.2s}
.sweepy.i-shy .eye{animation:none;transform:translate(-1.6px,1.8px) scale(.9)}
.sweepy.i-shy .cheekL,.sweepy.i-shy .cheekR{animation:blushIn 2.2s}
.sweepy.i-shy .mSmile{display:none}.sweepy.i-shy .mSmall{display:block}
.sweepy.i-shy .headG{animation:shyhead 2.2s}
@keyframes k-i-shy{to{transform:none}}
@keyframes shyhead{0%,100%{transform:rotate(0)}40%,70%{transform:rotate(7deg) translateY(1.5px)}}
.sweepy.i-wink{animation:k-i-wink 1.4s}
.sweepy.i-wink .eyeR{animation:none;transform:scaleY(.12)}
.sweepy.i-wink .browR{transform:translateY(1.6px) rotate(6deg)}
.sweepy.i-wink .mSmile{display:none}.sweepy.i-wink .mSmirk{display:block}
.sweepy.i-wink .headG{animation:tiltR 1.4s}
@keyframes k-i-wink{to{transform:none}}
.sweepy.i-peekaboo{animation:k-i-peekaboo 1.8s}
.sweepy.i-peekaboo .eye{animation:peekeyes 1.8s}
.sweepy.i-peekaboo .browL,.sweepy.i-peekaboo .browR{animation:peekbrows 1.8s}
.sweepy.i-peekaboo .mSmile{display:none}.sweepy.i-peekaboo .mO{display:block;animation:pop 1.8s}
@keyframes k-i-peekaboo{0%,100%{transform:none}30%{transform:translateY(5px) scale(.94)}55%{transform:translateY(-5px) scale(1.08)}}
@keyframes peekeyes{0%,30%{transform:scaleY(.08)}55%,100%{transform:scale(1.3)}}
@keyframes peekbrows{0%,30%{transform:translateY(2px)}55%,100%{transform:translateY(-3.5px)}}

/* --- playful extras --- */
.sweepy.i-eyeroll{animation:k-i-eyeroll 2s}
.sweepy.i-eyeroll .eye{animation:eyeroll 2s}
.sweepy.i-eyeroll .browL,.sweepy.i-eyeroll .browR{transform:translateY(-2px)}
.sweepy.i-eyeroll .mSmile{display:none}.sweepy.i-eyeroll .mSmirk{display:block}
@keyframes k-i-eyeroll{to{transform:none}}
@keyframes eyeroll{0%,100%{transform:none}25%{transform:translate(2.6px,-1px)}50%{transform:translate(0,-2.8px)}75%{transform:translate(-2.6px,-1px)}}
.sweepy.i-kiss{animation:k-i-kiss 1.8s}
.sweepy.i-kiss .eyeR{animation:none;transform:scaleY(.12)}
.sweepy.i-kiss .browR{transform:translateY(1.4px) rotate(6deg)}
.sweepy.i-kiss .mSmile{display:none}.sweepy.i-kiss .mKiss{display:block}
.sweepy.i-kiss .kissHeart{animation:kissfloat 1.8s}
.sweepy.i-kiss .cheekL,.sweepy.i-kiss .cheekR{animation:blushIn 1.8s}
.sweepy.i-kiss .headG{animation:tiltR 1.8s}
@keyframes k-i-kiss{to{transform:none}}
@keyframes kissfloat{0%{opacity:0;transform:translate(0,0) scale(.5)}30%{opacity:1}100%{opacity:0;transform:translate(6px,-9px) scale(1.3)}}
.sweepy.i-hide{animation:k-i-hide 2.2s ease-in-out}
.sweepy.i-hide .eye{animation:none;transform:translateX(-2.4px) scale(1.15)}
.sweepy.i-hide .browL,.sweepy.i-hide .browR{transform:translateY(-2px)}
.sweepy.i-hide .mSmile{display:none}.sweepy.i-hide .mSmall{display:block}
@keyframes k-i-hide{0%,100%{transform:none}30%,65%{transform:translate(-9%,6%) rotate(-10deg)}}
.sweepy.w-whistle{animation:k-w-whistle 1.4s}
.sweepy.w-whistle .eye{animation:none;transform:translate(2.4px,-2.4px) scale(.95)}
.sweepy.w-whistle .browL,.sweepy.w-whistle .browR{transform:translateY(-2.6px)}
.sweepy.w-whistle .mSmile{display:none}.sweepy.w-whistle .mWhistle{display:block}
.sweepy.w-whistle .notes{display:block}.sweepy.w-whistle .n1{animation:noteFloat 1.1s 1 .1s}.sweepy.w-whistle .n2{animation:noteFloat 1.1s .5s 1}
.sweepy.w-whistle .headG{animation:tiltR 1.4s}
@keyframes k-w-whistle{to{transform:none}}
.sweepy.c-tonguewink{animation:k-c-tonguewink 1.1s}
.sweepy.c-tonguewink .eyeL{animation:none;transform:scaleY(.12)}
.sweepy.c-tonguewink .browL{transform:translateY(1.4px) rotate(-6deg)}
.sweepy.c-tonguewink .mGrin{display:none}.sweepy.c-tonguewink .mTongue{display:block}
.sweepy.c-tonguewink .headG{animation:tilt 1.1s}
@keyframes k-c-tonguewink{0%,100%{transform:none}40%{transform:scale(1.04) rotate(-2deg)}}
.sweepy.c-blush{animation:k-c-blush 1.2s}
.sweepy.c-blush .eye{animation:none;opacity:0}.sweepy.c-blush .happy{display:block}
.sweepy.c-blush .cheekL,.sweepy.c-blush .cheekR{opacity:.95}
.sweepy.c-blush .mGrin{display:none}.sweepy.c-blush .mSmall{display:block}
.sweepy.c-blush .headG{animation:shyhead 1.2s}
@keyframes k-c-blush{0%,100%{transform:none}50%{transform:scale(1.03)}}

/* ---------- peek: leans toward the board, eyes widen, pupils lock on ---------- */
.sweepy.peek .headG{transform:translateY(5px) rotate(6deg)}
.sweepy.peek .eye{animation:none;transform:scale(1.32)}
.sweepy.peek .pupil{opacity:1}
.sweepy.peek .browL{transform:translateY(-3px) rotate(-9deg)}
.sweepy.peek .browR{transform:translateY(-1.6px)}
.sweepy.peek .mSmile{display:none}.sweepy.peek .mO{display:block;transform:scale(.7)}

/* ---------- wince pool: comic, never sad ---------- */
.sweepy.w-shake{animation:k-w-shake .9s}
.sweepy.w-shake .headG{animation:headshake .9s}
.sweepy.w-shake .eye{animation:none;transform:scaleY(.5)}
.sweepy.w-shake .mSmile{display:none}.sweepy.w-shake .mWobble{display:block}
@keyframes k-w-shake{to{transform:none}}
.sweepy.w-oops{animation:k-w-oops 1.1s}
.sweepy.w-oops .eye{animation:none;transform:scale(1.25)}
.sweepy.w-oops .browL{transform:translateY(-3.5px) rotate(-12deg)}.sweepy.w-oops .browR{transform:translateY(-3.5px) rotate(12deg)}
.sweepy.w-oops .mSmile{display:none}.sweepy.w-oops .mO{display:block;transform:scale(.8)}
.sweepy.w-oops .drop{animation:dropfall 1.1s}
.sweepy.w-oops .cheekL,.sweepy.w-oops .cheekR{animation:blushIn 1.1s}
.sweepy.w-oops .headG{animation:tilt 1.1s}
@keyframes k-w-oops{0%,100%{transform:none}30%,70%{transform:translateY(-3px)}}
.sweepy.w-squint{animation:k-w-squint 1s}
.sweepy.w-squint .eyeL{animation:none;transform:scaleY(.18)}
.sweepy.w-squint .eyeR{animation:none;transform:scale(1.3)}
.sweepy.w-squint .browL{transform:translateY(2px) rotate(10deg)}.sweepy.w-squint .browR{transform:translateY(-3px) rotate(-14deg)}
.sweepy.w-squint .mSmile{display:none}.sweepy.w-squint .mO{display:block;transform:scale(.6) translateX(-4px)}
.sweepy.w-squint .ant{animation:antwig .7s 1}
@keyframes k-w-squint{0%,100%{transform:none}50%{transform:translateX(3px) rotate(3deg)}}
.sweepy.w-dizzy{animation:k-w-dizzy 1.2s}
.sweepy.w-dizzy .eye{animation:none;opacity:0}.sweepy.w-dizzy .spirals{display:block}
.sweepy.w-dizzy .spirals path{animation:spin2d .6s linear 2}
.sweepy.w-dizzy .mSmile{display:none}.sweepy.w-dizzy .mWobble{display:block}
.sweepy.w-dizzy .headG{animation:dizzyhead 1.2s}
@keyframes k-w-dizzy{to{transform:none}}
@keyframes dizzyhead{0%,100%{transform:rotate(0)}25%{transform:rotate(-8deg) translateX(-2px)}50%{transform:rotate(8deg) translateX(2px)}75%{transform:rotate(-5deg)}}
.sweepy.w-raspberry{animation:k-w-raspberry 1.1s}
.sweepy.w-raspberry .eye{animation:none;opacity:0}.sweepy.w-raspberry .happy{display:block}
.sweepy.w-raspberry .mSmile{display:none}.sweepy.w-raspberry .mTongue{display:block}
.sweepy.w-raspberry .mTongue path:last-child{animation:chatter .18s 5}
.sweepy.w-raspberry .headG{animation:headshake 1.1s}
@keyframes k-w-raspberry{to{transform:none}}

/* ---------- celebrate pool (≥8 distinct; §12.2) ---------- */
.sweepy[class*="c-"] .mSmile{display:none}.sweepy[class*="c-"] .mGrin{display:block}
.sweepy[class*="c-"] .cheekL,.sweepy[class*="c-"] .cheekR{opacity:.7}
.sweepy.c-jump{animation:k-c-jump .9s cubic-bezier(.3,1.4,.5,1)}
.sweepy.c-jump .eye{animation:none;transform:scale(1.2)}
.sweepy.c-jump .browL,.sweepy.c-jump .browR{transform:translateY(-3px)}
@keyframes k-c-jump{0%,100%{transform:translateY(0)}35%{transform:translateY(-9%) scale(1.04)}70%{transform:translateY(0) scale(.98,1.02)}}
.sweepy.c-spin{animation:k-c-spin 1s ease-in-out}
@keyframes k-c-spin{0%{transform:rotateY(0)}100%{transform:rotateY(360deg)}}
.sweepy.c-spin{animation-duration:1.3s}
.sweepy.c-hearts{animation:k-c-hearts 1.2s}
.sweepy.c-hearts .eye{animation:none;opacity:0}.sweepy.c-hearts .hearts{display:block}
.sweepy.c-hearts .hearts path{animation:heartbeat .4s 3}
.sweepy.c-hearts .browL,.sweepy.c-hearts .browR{transform:translateY(-3px)}
@keyframes k-c-hearts{0%,100%{transform:none}50%{transform:scale(1.06)}}
.sweepy.c-stars{animation:k-c-stars 1.1s}
.sweepy.c-stars .eye{animation:none;opacity:0}.sweepy.c-stars .stars{display:block}
.sweepy.c-stars .stars path{animation:starspin .55s 2}
.sweepy.c-stars .mGrin{display:none}.sweepy.c-stars .mO{display:block;animation:pop .5s}
@keyframes k-c-stars{0%,100%{transform:none}50%{transform:scale(1.08)}}
.sweepy.c-hat{animation:k-c-hat 1.1s}
.sweepy.c-hat .hat{display:block;animation:hatpop 1.1s}
.sweepy.c-hat .eye{animation:none;opacity:0}.sweepy.c-hat .happy{display:block}
@keyframes k-c-hat{0%,100%{transform:none}20%{transform:scale(1.05)}}
@keyframes hatpop{0%{opacity:0;transform:translateY(20px) scale(.4)}25%{opacity:1;transform:translateY(-3px) scale(1.15)}40%,85%{opacity:1;transform:none}100%{opacity:0}}
.sweepy.c-wiggle{animation:k-c-wiggle .9s}
.sweepy.c-wiggle .headG{animation:headshake .9s}
.sweepy.c-wiggle .earL,.sweepy.c-wiggle .earR{animation:earwig .3s 3}
@keyframes k-c-wiggle{0%,100%{transform:none}25%{transform:translateX(-4px) rotate(-3deg)}75%{transform:translateX(4px) rotate(3deg)}}
.sweepy.c-sparkle{animation:k-c-sparkle 1s}
.sweepy.c-sparkle .eye{animation:none;opacity:0}
.sweepy.c-sparkle .sparkles{display:block;animation:sparkle .5s 2}
@keyframes k-c-sparkle{0%,100%{transform:none}50%{transform:scale(1.06)}}
@keyframes sparkle{0%,100%{transform:scale(.7) rotate(0)}50%{transform:scale(1.25) rotate(20deg)}}
.sweepy.c-laugh{animation:k-c-laugh 1.2s}
.sweepy.c-laugh .eye{animation:none;opacity:0}.sweepy.c-laugh .happy{display:block}
.sweepy.c-laugh .mGrin{display:none}.sweepy.c-laugh .mLaugh{display:block}
.sweepy.c-laugh .headG{animation:laughhead .4s 3}
.sweepy.c-laugh .drop{animation:dropfall 1.2s}
@keyframes k-c-laugh{to{transform:none}}
@keyframes laughhead{0%,100%{transform:rotate(-4deg) translateY(0)}50%{transform:rotate(4deg) translateY(-2px)}}
.sweepy.c-bounce{animation:k-c-bounce 1s}
.sweepy.c-bounce .ant{animation:antwig .6s 2}
@keyframes k-c-bounce{0%,100%{transform:none}20%{transform:scale(1.12,.88)}40%{transform:scale(.92,1.1) translateY(-8%)}60%{transform:scale(1.06,.95)}80%{transform:scale(.98,1.02)}}
.sweepy.c-sing{animation:k-c-sing 1.4s}
.sweepy.c-sing .eye{animation:none;opacity:0}.sweepy.c-sing .happy{display:block}
.sweepy.c-sing .mGrin{display:none}.sweepy.c-sing .mSing{display:block;animation:chatter .35s 4}
.sweepy.c-sing .notes{display:block}.sweepy.c-sing .n1{animation:noteFloat .7s 2}.sweepy.c-sing .n2{animation:noteFloat .7s .35s 2}
.sweepy.c-sing .headG{animation:lookhead 1.4s}
@keyframes k-c-sing{to{transform:none}}
.sweepy.c-proud{animation:k-c-proud 1.2s}
.sweepy.c-proud .eye{animation:none;transform:scaleY(.55) translateY(-1px)}
.sweepy.c-proud .browL{transform:translateY(-1px) rotate(8deg)}.sweepy.c-proud .browR{transform:translateY(-1px) rotate(-8deg)}
.sweepy.c-proud .mGrin{display:none}.sweepy.c-proud .mSmirk{display:block}
.sweepy.c-proud .headG{animation:proudhead 1.2s}
@keyframes k-c-proud{to{transform:none}}
@keyframes proudhead{0%,100%{transform:none}30%,80%{transform:translateY(-3px) rotate(-3deg)}}
.sweepy.c-giggle{animation:k-c-giggle 1s}
.sweepy.c-giggle .eye{animation:none;transform:scaleY(.2)}
.sweepy.c-giggle .cheekL,.sweepy.c-giggle .cheekR{opacity:.9}
.sweepy.c-giggle .headG{animation:giggle .25s 4}
@keyframes k-c-giggle{to{transform:none}}
@keyframes giggle{0%,100%{transform:translateY(0) rotate(-2deg)}50%{transform:translateY(-1.5px) rotate(2deg)}}

/* ---------- scan: goggles on, beam is drawn by the board (app.css .beam) ---------- */
.sweepy.scan .goggles{display:block;animation:gogglesOn 1s}
.sweepy.scan .eye,.sweepy.scan .browL,.sweepy.scan .browR{opacity:0}
.sweepy.scan .headG{animation:scanhead 1s}
.sweepy.scan .mSmile{display:none}.sweepy.scan .mFlat{display:block}
.sweepy.scan .antTip{animation:antflicker .5s ease-in-out infinite}
@keyframes gogglesOn{0%{transform:translateY(-12px);opacity:0}20%,100%{transform:none;opacity:1}}
@keyframes scanhead{0%,100%{transform:rotate(0)}30%{transform:rotate(-12deg)}70%{transform:rotate(12deg)}}

/* ---------- sleepy (battery empty) & wake ---------- */
.sweepy.sleepy{animation:k-sleepy 2.4s ease-in-out infinite}
.sweepy.sleepy .eye{animation:none;transform:scaleY(.08) translateY(2px)}
.sweepy.sleepy .browL,.sweepy.sleepy .browR{transform:translateY(2.5px)}
.sweepy.sleepy .headG{transform:rotate(9deg) translateY(3px)}
.sweepy.sleepy .mSmile{display:none}.sweepy.sleepy .mO{display:block;transform:scale(.55)}
.sweepy.sleepy .zzz{display:block}
.sweepy.sleepy .z1{animation:zfloat 2.4s infinite}.sweepy.sleepy .z2{animation:zfloat 2.4s .8s infinite}
.sweepy.sleepy .ant{animation:none;transform:rotate(-18deg)}
.sweepy.sleepy .antTip{animation:none;fill:#3A4060;filter:none}
.sweepy.sleepy .antHalo,.sweepy.sleepy .antGleam{animation:none;opacity:0}
@keyframes k-sleepy{0%,100%{transform:translateY(0) scale(1,1)}50%{transform:translateY(2px) scale(1.02,.98)}}
@keyframes zfloat{0%{opacity:0;transform:translateY(6px) scale(.6)}30%{opacity:1}100%{opacity:0;transform:translateY(-14px) scale(1.2)}}
.sweepy.wake{animation:k-wake 1.2s}
.sweepy.wake .eye{animation:none;transform:scale(1.35)}
.sweepy.wake .browL,.sweepy.wake .browR{transform:translateY(-3.5px)}
.sweepy.wake .mSmile{display:none}.sweepy.wake .mO{display:block}
@keyframes k-wake{0%{transform:translateY(3px) scale(1,.95)}25%{transform:translateY(-8px) scale(.96,1.08)}50%{transform:translateY(0) scale(1.04,.96)}100%{transform:none}}

/* ---------- win: dance pool + sunglasses + hat ---------- */
.sweepy.win .shades{display:block}.sweepy.win .eye{animation:none;opacity:0}
.sweepy.win .mSmile{display:none}.sweepy.win .mGrin{display:block}
.sweepy.win .cheekL,.sweepy.win .cheekR{opacity:.7}
.sweepy.win.d-dance1{animation:k-d-dance1 1.1s ease-in-out infinite}
.sweepy.win.d-dance1 .headG{animation:headshake 1.6s infinite}
.sweepy.win.d-dance1 .notes{display:block}.sweepy.win.d-dance1 .n1{animation:noteFloat .8s infinite}.sweepy.win.d-dance1 .n2{animation:noteFloat .8s .4s infinite}
@keyframes k-d-dance1{0%,100%{transform:translateY(0) rotate(-4deg)}50%{transform:translateY(-7px) rotate(4deg)}}
.sweepy.win.d-dance2{animation:k-d-dance2 1.5s ease-in-out infinite}
.sweepy.win.d-dance2 .earL,.sweepy.win.d-dance2 .earR{animation:earwig .75s ease-in-out infinite}

@keyframes k-d-dance2{0%,100%{transform:translateX(-7px) rotate(-5deg)}50%{transform:translateX(7px) rotate(5deg)}}
.sweepy.win.d-dance3{animation:k-d-dance3 1.3s ease-in-out infinite}
.sweepy.win.d-dance3 .hat{display:block}
.sweepy.win.d-dance3 .ant{animation:antwild .9s ease-in-out infinite}
@keyframes k-d-dance3{0%,100%{transform:scale(1,1)}25%{transform:scale(1.04,.96)}50%{transform:scale(.97,1.04) translateY(-5px)}75%{transform:scale(1.02,.98)}}

/* ---------- fail (Hard mode only) ---------- */
.sweepy.fail .xeyes{display:block}.sweepy.fail .eye{animation:none;opacity:0}
.sweepy.fail .browL,.sweepy.fail .browR{opacity:0}
.sweepy.fail .mSmile{display:none}.sweepy.fail .mFrown{display:block}
.sweepy.fail .ant{animation:none;transform:rotate(60deg);transition:transform .6s}
.sweepy.fail .antTip{animation:none;fill:#3A4060;filter:none}
.sweepy.fail .antHalo,.sweepy.fail .antGleam{animation:none;opacity:0}

/* prefers-reduced-motion: the app stops idle loops and shortens confetti (§10);
   Sweepy's reaction animations stay — they ARE the feedback a child reads. */
