/* v0.10.22 — TRI-PANIC Impact. Decorative: never captures a tap or adds a toast.
   Everything stays clipped to the table, seated players and discard slot. */
.game-stage .combat-fx .ty22-impact{position:absolute;left:var(--ty22-x);top:var(--ty22-y);width:0;height:0;overflow:visible;z-index:1;pointer-events:none;isolation:isolate}
/* TriPanic's triangular energy mark is intentionally localized to the seat,
   not a screen-wide effect borrowed from the competitor. */
.game-stage .combat-fx .ty22-impact:before{content:"△";position:absolute;left:-25px;top:-39px;width:50px;height:65px;display:grid;place-items:center;
 color:var(--ty22-mark,#8ceefd);font:900 64px/1.1 system-ui,sans-serif;text-shadow:0 0 14px var(--ty22-mark,#8ceefd);opacity:.7;animation:ty22-triangle .55s ease-out both}
.game-stage .combat-fx .ty22-impact-attack,.game-stage .combat-fx .ty22-impact-penalty{--ty22-mark:#ff8b8f}
.game-stage .combat-fx .ty22-impact-fox{--ty22-mark:#82f7ef}
.game-stage .combat-fx .ty22-impact-quack{--ty22-mark:#8ef2cb}
.game-stage .combat-fx .ty22-impact-panic{--ty22-mark:#ffd18b}
.game-stage .combat-fx .ty22-impact-victory{--ty22-mark:#c9f9b5}
.game-stage .combat-fx .ty22-impact-order{--ty22-mark:#c3a3ff}
.game-stage .combat-fx .ty22-return-arc:before{content:none}
@keyframes ty22-triangle{0%{opacity:0;transform:scale(.44) rotate(-17deg)}30%{opacity:.75;transform:scale(1.10) rotate(3deg)}100%{opacity:0;transform:scale(1.48) rotate(0)}}
.game-stage .combat-fx .ty22-impact .ty22-shard{--ty22-paint:#65def7;position:absolute;left:-20px;top:-3px;width:40px;height:6px;border-radius:99px;
 transform:rotate(calc(var(--ty22-i)*120deg)) translateX(2px);transform-origin:50% 50%;background:linear-gradient(90deg,transparent,var(--ty22-paint),transparent);box-shadow:0 0 12px var(--ty22-paint);animation:ty22-shard-fly .48s cubic-bezier(.12,.7,.35,1) both}
.game-stage .combat-fx .ty22-impact-attack .ty22-shard,.game-stage .combat-fx .ty22-impact-penalty .ty22-shard{--ty22-paint:#ff8b8f}
.game-stage .combat-fx .ty22-impact-fox .ty22-shard{--ty22-paint:#7ffbf1}
.game-stage .combat-fx .ty22-impact-shield .ty22-shard{--ty22-paint:#ffdf86}
.game-stage .combat-fx .ty22-impact-order .ty22-shard{--ty22-paint:#b99cff}
.game-stage .combat-fx .ty22-impact-panic .ty22-shard{--ty22-paint:#ffc772}
.game-stage .combat-fx .ty22-impact-victory .ty22-shard{--ty22-paint:#e6fbb7}
@keyframes ty22-shard-fly{0%{opacity:0;scale:.35}16%{opacity:1;scale:1}70%{opacity:.9;scale:1.65}100%{opacity:0;scale:1.95}}
/* Fox uses a crossing return stroke between the rebound seat and the next victim. */
.game-stage .combat-fx .ty22-return-arc{height:3px;width:var(--ty22-length);transform-origin:left center;
 background:linear-gradient(90deg,transparent,#8cf4ff 32%,#fff 52%,#a4f5e3 76%,transparent);box-shadow:0 0 13px #71edff;animation:ty22-return .58s ease-out both}
@keyframes ty22-return{0%{opacity:0;transform:rotate(var(--ty22-angle)) scaleX(0)}27%{opacity:1}60%{transform:rotate(var(--ty22-angle)) scaleX(1);opacity:1}100%{transform:rotate(var(--ty22-angle)) scaleX(1);opacity:0}}
/* Quack fires a tight rapid volley at the actor's position; not over hand cards. */
.game-stage .combat-fx .ty22-impact-quack .ty22-stack-leaf{position:absolute;left:0;top:0;width:16px;height:23px;border:2px solid #87f2d5;border-radius:4px;background:#155c67bf;
 box-shadow:0 0 7px #68eeca82;transform-origin:center;animation:ty22-flight-stack .61s cubic-bezier(.2,.77,.3,1) both;animation-delay:calc(var(--ty22-i)*45ms)}
@keyframes ty22-flight-stack{0%{opacity:0;transform:translate(-8px,12px) rotate(-19deg) scale(.6)}30%{opacity:1;transform:translate(calc(var(--ty22-i)*6px),calc(var(--ty22-i)*-7px)) rotate(-9deg) scale(1)}72%{opacity:1;transform:translate(calc(var(--ty22-i)*6px + 16px),calc(var(--ty22-i)*-7px - 10px)) rotate(10deg)}100%{opacity:0;transform:translate(calc(var(--ty22-i)*6px + 25px),calc(var(--ty22-i)*-7px - 20px)) rotate(16deg) scale(.65)}}
/* The heavier card lands, settles once, then returns all visual ownership. */
.game-stage #top-card .game-card.ty-card-arrival.ty22-slam,.game-stage #top-card .game-card.ty22-slam{animation:ty22-card-hit .33s cubic-bezier(.2,.8,.2,1) both;transform-origin:50% 50%;will-change:transform,filter}
@keyframes ty22-card-hit{0%{transform:translateY(-12px) rotate(-5deg) scale(1.055);filter:brightness(1.55)}44%{transform:translateY(3px) rotate(2deg) scale(.972);filter:brightness(1.21)}77%{transform:translateY(-2px) rotate(-1deg) scale(1.017)}100%{transform:translateY(0) rotate(0) scale(1);filter:none}}
/* The table edge responds rather than shaking the entire phone or moving buttons. */
.game-stage.ty22-force:after{content:"";position:absolute;inset:0;z-index:4;border:3px solid #f3899780;box-shadow:inset 0 0 26px #ff527733;pointer-events:none;animation:ty22-edge-pulse .42s ease-out both}
.game-stage.ty22-fox:after{content:"";position:absolute;inset:0;z-index:4;border:2px solid #65effb80;box-shadow:inset 0 0 25px #28a5e744;pointer-events:none;animation:ty22-edge-pulse .48s ease-out both}
.game-stage.ty22-quack:after{content:"";position:absolute;inset:0;z-index:4;border:2px solid #8dedca77;pointer-events:none;animation:ty22-edge-pulse .51s ease-out both}
.game-stage.ty22-panic-cue:after{content:"";position:absolute;inset:0;z-index:4;border:3px solid #edb45a88;box-shadow:inset 0 0 28px #eeaa5b55;pointer-events:none;animation:ty22-edge-pulse .62s ease-out both}
.game-stage.ty22-victory:after{content:"";position:absolute;inset:0;z-index:4;border:3px solid #cbf8ce99;box-shadow:inset 0 0 33px #8beeb544;pointer-events:none;animation:ty22-edge-pulse .73s ease-out both}
@keyframes ty22-edge-pulse{0%{opacity:0}17%{opacity:.86}55%{opacity:.62}100%{opacity:0}}
@media (pointer:coarse) and (orientation:landscape) and (max-height:760px){
 .game-stage .combat-fx .ty22-impact .ty22-shard{width:26px;left:-13px;height:3px}
 .game-stage .combat-fx .ty22-impact-quack .ty22-stack-leaf{width:12px;height:17px}
}
@media (prefers-reduced-motion:reduce){
 .game-stage .combat-fx .ty22-impact{display:none!important;animation:none!important}
 .game-stage #top-card .game-card.ty22-slam{animation:none!important;transform:none!important;filter:none!important}
 .game-stage.ty22-force:after,.game-stage.ty22-fox:after,.game-stage.ty22-quack:after,.game-stage.ty22-panic-cue:after,.game-stage.ty22-victory:after{display:none!important;animation:none!important}
}
