/* Presentation only: the server's immutable winners determine these classes. */
.candidate{position:relative;isolation:isolate;transition:opacity .9s ease,filter .9s ease,border-color .4s ease}
.candidate.faded{filter:saturate(.25)}
.candidate.winner{z-index:1;animation:elected-arrival 1s cubic-bezier(.16,1,.3,1) both,elected-glow 2.6s 1s ease-in-out 3}
.candidate.winner::before{content:'★ ELECTED ★';position:absolute;z-index:4;left:50%;top:17%;transform:translateX(-50%) rotate(-8deg);padding:12px 20px;border:3px solid #fff4ca;outline:2px solid #16845b;background:#16845bf2;color:#fffdf0;box-shadow:0 8px 25px #102c3560;font:900 clamp(14px,1.6vw,30px)/1.1 Arial,sans-serif;letter-spacing:.12em;white-space:nowrap;pointer-events:none;animation:elected-stamp 1.1s cubic-bezier(.16,1,.3,1) both}
.candidate.winner::after{content:'';position:absolute;inset:0;z-index:3;pointer-events:none;background:linear-gradient(115deg,transparent 30%,#fff8 48%,transparent 65%);transform:translateX(-150%);animation:elected-shine 1.5s .6s ease-out both}
.candidate.winner .candidate-top{background:#16845b;color:white;transition:background .4s}
.candidate.winner .candidate-top b,.candidate.winner .candidate-top span:last-child{color:#fff4ca}
.candidate.winner progress{animation:elected-count 1.4s ease-out both;transform-origin:left}
.broadcast .candidate.winner::before{top:15%;font-size:clamp(18px,2vw,42px);padding:1.5vh 1.1vw;border-width:4px}
.broadcast:has(.candidate.winner) .headline{position:relative}
.broadcast:has(.candidate.winner) .headline::after{content:'★ THE PEOPLE HAVE CHOSEN ★';position:absolute;inset:0;display:flex;align-items:center;background:var(--paper);color:#16845b;font:900 3.7vw/1 Impact,'Arial Narrow',sans-serif;letter-spacing:.02em;pointer-events:none;animation:elected-headline 4s ease both}
.broadcast:has(.candidate.winner) .candidates::after{content:'';position:fixed;z-index:8;inset:0;pointer-events:none;opacity:0;background-image:radial-gradient(ellipse,#df2638 0 35%,transparent 40%),radial-gradient(ellipse,#2953ba 0 35%,transparent 40%),radial-gradient(ellipse,#e2b640 0 35%,transparent 40%),radial-gradient(ellipse,#16845b 0 35%,transparent 40%);background-size:117px 173px,193px 137px,157px 211px,227px 181px;background-position:0 0,60px 35px,90px 70px,30px 100px;background-repeat:repeat;mask-image:repeating-linear-gradient(90deg,#000 0 9px,transparent 9px 90px);animation:elected-confetti 3.8s ease-out both}
@keyframes elected-arrival{0%{transform:translateY(16px) scale(.94)}60%{transform:translateY(-5px) scale(1.015)}100%{transform:none}}
@keyframes elected-stamp{0%,20%{opacity:0;transform:translateX(-50%) rotate(-18deg) scale(2)}55%{opacity:1;transform:translateX(-50%) rotate(-6deg) scale(.94)}100%{opacity:1;transform:translateX(-50%) rotate(-8deg) scale(1)}}
@keyframes elected-glow{0%,100%{box-shadow:0 0 0 2px #16845b30,0 5px 16px #16845b20}50%{box-shadow:0 0 0 5px #16845b50,0 0 30px #16845b55}}
@keyframes elected-shine{to{transform:translateX(150%)}}
@keyframes elected-count{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes elected-headline{0%{opacity:0;transform:translateY(12px)}15%,75%{opacity:1;transform:none}100%{opacity:0;transform:translateY(-8px)}}
@keyframes elected-confetti{0%{opacity:0;transform:translateY(-70vh) rotate(-6deg)}10%{opacity:.65}75%{opacity:.4}100%{opacity:0;transform:translateY(65vh) rotate(8deg)}}
@media(prefers-reduced-motion:reduce){.candidate.winner,.candidate.winner::before,.candidate.winner::after,.candidate.winner progress,.broadcast:has(.candidate.winner) .headline::after,.broadcast:has(.candidate.winner) .candidates::after{animation:none!important}.candidate.winner::after,.broadcast:has(.candidate.winner) .headline::after,.broadcast:has(.candidate.winner) .candidates::after{display:none}.candidate{transition:none}}
