.cell.placed{animation:tilePlace 180ms cubic-bezier(.2,.9,.3,1)}
.cell.tap-target:after{content:"";position:absolute;inset:34%;background:var(--focus);clip-path:polygon(0 0,70% 0,100% 30%,100% 100%,0 100%);opacity:.45}
.board.bad-drop{animation:badDrop 220ms ease}.scores.combo-hot #combo{color:var(--warm);animation:comboPop 240ms ease}
@keyframes tilePlace{0%{transform:translateY(-8px);filter:brightness(1.35)}70%{transform:translateY(2px)}100%{transform:none}}
@keyframes badDrop{25%{transform:translateX(-5px)}75%{transform:translateX(5px)}}
@keyframes sparkFly{0%{opacity:1;transform:translate(-50%,-50%) rotate(var(--angle)) translateY(-15px) scaleX(1)}100%{opacity:0;transform:translate(-50%,-50%) rotate(var(--angle)) translateY(-120px) scaleX(.2)}}
@keyframes comboPop{60%{transform:scale(1.22)}}
@keyframes float{0%{opacity:0;transform:translateY(10px)}24%{opacity:1}100%{opacity:0;transform:translateY(-35px)}}

/* ---------- Очистка линии ---------- */

/* Раньше анимировался сам слот поля с режимом forwards: на месте линии на 280 мс
   возникала дыра до подложки доски. Теперь клетка обновляется сразу, а исчезает
   копия плитки поверх поля — фон пустой клетки на месте с первого кадра. */
.clear-tile{position:absolute;z-index:3;pointer-events:none;animation:tileVanish 260ms cubic-bezier(.3,.7,.3,1) forwards}
@keyframes tileVanish{0%{transform:none;filter:brightness(1)}34%{transform:scale(1.07);filter:brightness(2)}100%{transform:scale(.24);opacity:0;filter:brightness(1.5)}}

/* Световой свип вдоль очищаемой линии, синхронно с исчезновением плиток. */
.clear-sweep{position:absolute;z-index:4;pointer-events:none;border-radius:9px;opacity:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.55) 47%,rgba(255,255,255,.7) 53%,transparent);animation:sweepRow 240ms ease-out forwards}
.clear-sweep.col{background:linear-gradient(180deg,transparent,rgba(255,255,255,.55) 47%,rgba(255,255,255,.7) 53%,transparent);animation-name:sweepCol}
@keyframes sweepRow{0%{opacity:0;transform:translateX(-30%)}35%{opacity:.75}100%{opacity:0;transform:translateX(30%)}}
@keyframes sweepCol{0%{opacity:0;transform:translateY(-30%)}35%{opacity:.75}100%{opacity:0;transform:translateY(30%)}}

/* Похвала за серию: со второго комбо и выше, с усилением на 4, 7 и на чистом поле. */
.float-score.praise-series{color:var(--warm);font-size:30px}
.float-score.praise-impulse{color:var(--warm);font-size:34px;text-shadow:0 2px #000,0 0 26px rgba(246,200,90,.5)}
.float-score.praise-resonance{color:#ffe9a8;font-size:38px;text-shadow:0 2px #000,0 0 34px rgba(246,200,90,.7)}
.float-score.praise-perfect{color:#dcfff0;font-size:40px;text-shadow:0 2px #000,0 0 38px rgba(79,213,164,.75)}

