/* v0.10.26 · Coordinated shared card traffic. Strictly non-interactive, visual-only. */
.game-stage #combat-fx{pointer-events:none!important}
.game-stage .ty25-flight,.game-stage .ty25-beam,.game-stage .ty25-burst{pointer-events:none!important;position:absolute;z-index:2;contain:layout paint;}
.game-stage .ty25-flight{
 left:var(--ty25-x);top:var(--ty25-y);
 width:var(--ty26-end-w,54px);height:var(--ty26-end-h,79px);
 margin:0;transform-origin:center center;
 --ty25-rotate:8deg;opacity:0;will-change:transform,opacity;
 filter:drop-shadow(0 0 9px var(--ty25-color,#87eaff));
 animation:ty26-fly var(--ty25-duration,340ms) cubic-bezier(.2,.7,.28,1) var(--ty25-delay,0ms) both;
}
.game-stage .ty25-flight .game-card{width:100%!important;height:100%!important;aspect-ratio:.685!important;border-width:2px!important;
 border-radius:7px!important;transform:none!important;transition:none!important;box-shadow:0 0 9px #090c35dd!important;}
.game-stage .ty25-flight .game-card .large{font-size:clamp(20px,3vw,36px)!important}
.game-stage .ty25-flight .game-card .corner{font-size:9px!important;left:4px!important;top:3px!important}
.game-stage .ty25-flight .game-card .corner.bottom{left:auto!important;top:auto!important;right:4px!important;bottom:3px!important}
.game-stage .ty25-flight .game-card .character-name{font-size:7px!important}
.game-stage .ty25-flight .game-card .short-effect,.game-stage .ty25-flight .game-card .color-key{font-size:5px!important}
.game-stage .ty25-flight .game-card .sigil{font-size:18px!important}
.game-stage .ty25-flight .ty25-card-back{display:block;width:100%;height:100%;border:2px solid #b5e9ff;border-radius:7px;
 background:#132246 url('/typhoon-cards/back.webp') center/cover no-repeat;
 box-shadow:inset 0 0 8px #b1e6ff45,0 5px 12px #080b2399;}
/* The card never vanishes into the empty table: at landing it is nearly
   its final size, then the old-card overlay advances to the new public face. */
@keyframes ty26-fly{
 0%{opacity:0;transform:translate(-50%,-50%) rotate(-12deg) scale(var(--ty26-start-scale,.72))}
 8%{opacity:1}82%{opacity:1}
 85%{opacity:1;transform:translate(calc(-50% + var(--ty26-mid-dx)),calc(-50% + var(--ty26-mid-dy))) rotate(var(--ty25-rotate)) scale(1.06)}
 100%{opacity:1;transform:translate(calc(-50% + var(--ty25-dx)),calc(-50% + var(--ty25-dy))) rotate(6deg) scale(1)}
}
.game-stage .ty25-beam{left:var(--ty25-x);top:var(--ty25-y);height:5px;width:var(--ty25-length);
 border-radius:99px;transform-origin:left center;
 background:linear-gradient(90deg,transparent,var(--ty25-color,#ff7392) 22%,#ffffff 83%,var(--ty25-color,#ff7392));
 box-shadow:0 0 6px var(--ty25-color,#ff7392),0 0 15px var(--ty25-color,#ff7392);
 animation:ty25-energy .34s ease-out var(--ty25-delay,0ms) both;}
.game-stage .ty25-beam:after{content:'';position:absolute;right:0;top:50%;width:10px;height:10px;
 background:white;clip-path:polygon(0 0,100% 50%,0 100%);transform:translateY(-50%);filter:drop-shadow(0 0 7px var(--ty25-color));}
.game-stage .ty25-beam-reflect{height:7px;box-shadow:0 0 10px #77fff1,0 0 22px #77fff1;}
@keyframes ty25-energy{
 0%{opacity:0;transform:rotate(var(--ty25-angle)) scaleX(0)}
 14%{opacity:1}73%{opacity:1;transform:rotate(var(--ty25-angle)) scaleX(1)}
 100%{opacity:0;transform:rotate(var(--ty25-angle)) scaleX(1)}
}
.game-stage .ty25-burst{left:var(--ty25-x);top:var(--ty25-y);width:30px;height:30px;
 border:2px solid var(--ty25-color,#ba9dff);border-radius:50%;box-shadow:0 0 10px var(--ty25-color),inset 0 0 12px var(--ty25-color);
 animation:ty25-pulse .42s cubic-bezier(.17,.7,.22,1) var(--ty25-delay,0ms) both;}
.game-stage .ty25-burst:after{content:'✦';position:absolute;inset:0;display:grid;place-items:center;
 font-size:19px;font-weight:1000;color:#fff;text-shadow:0 0 7px var(--ty25-color);}
.game-stage .ty25-burst-large{width:43px;height:43px;border-width:3px}
.game-stage .ty25-burst-reflect:after{content:'↶'}
@keyframes ty25-pulse{
 0%{opacity:0;transform:translate(-50%,-50%) scale(.25) rotate(-30deg)}
 30%{opacity:1;transform:translate(-50%,-50%) scale(.95) rotate(0deg)}
 100%{opacity:0;transform:translate(-50%,-50%) scale(1.75) rotate(32deg)}
}
/* A real visible discard stack: the previous public card peeks below the top.
   It is a separate decorative layer, so the actual active card stays on top. */
.game-stage #top-card{position:relative;isolation:isolate}
.game-stage #top-card>.game-card,.game-stage #top-card>.protection-field{position:relative;z-index:1}
.game-stage #top-card>.ty25-discard-underlay,
.game-stage .ty25-discard-placeholder>.ty25-discard-underlay{
 position:absolute;inset:0;z-index:0;pointer-events:none!important;
 transform:translate(-5px,5px) rotate(-6deg);opacity:.85;
}
.game-stage #top-card .ty25-discard-underlay>.game-card,
.game-stage .ty25-discard-placeholder .ty25-discard-underlay>.game-card{
 width:100%!important;height:100%!important;max-width:none!important;
 margin:0!important;transform:none!important;box-shadow:0 6px 10px #05061899!important;
}
/* Keep the last visible discard physically on the table while the next card flies in.
   Unlike hiding #top-card alone, this works through rerenders and online packets. */
.game-stage .ty25-discard-placeholder{
 position:absolute;z-index:1;pointer-events:none!important;contain:layout paint;
 left:var(--ty25-x);top:var(--ty25-y);width:var(--ty25-width);height:var(--ty25-height);
 transform:translate(-50%,-50%);display:grid;place-items:center;
}
.game-stage .ty25-discard-placeholder>.game-card,
.game-stage .ty25-discard-placeholder>.protection-field{
 width:100%!important;height:100%!important;max-width:none!important;
 margin:0!important;transform:rotate(6deg)!important;opacity:1!important;position:relative;z-index:1;
}
.game-stage .ty25-discard-placeholder.ty25-stack-hit>.game-card{
 animation:ty25-stacked-card .20s ease-out both;
}
@keyframes ty25-stacked-card{
 from{filter:brightness(1.55);transform:rotate(-8deg) scale(1.08)}
 to{filter:none;transform:rotate(6deg) scale(1)}
}
.game-stage #top-card.ty25-arriving>.game-card{opacity:0!important}
/* Future cards in the live state must not peek out before their flight lands. */
.game-stage #top-card.ty25-arriving>.ty25-discard-underlay{opacity:0!important}
.game-stage #top-card>.game-card.ty25-landing{animation:ty25-discard-snap .36s cubic-bezier(.15,.84,.23,1) both!important;}
@keyframes ty25-discard-snap{
 0%{opacity:.45;transform:rotate(16deg) scale(1.19);filter:brightness(2)}
 48%{opacity:1;transform:rotate(0deg) scale(.96);filter:brightness(1.2)}
 100%{opacity:1;transform:rotate(6deg) scale(1);filter:none}
}
.game-stage #hand .hand-card-cell.ty25-received{animation:ty25-drawn .43s ease-out .15s both}
@keyframes ty25-drawn{
 0%{filter:brightness(1);translate:0 0}
 45%{filter:brightness(1.5) drop-shadow(0 0 11px #87ebff);translate:0 -7px}
 100%{filter:none;translate:0 0}
}
@media(max-width:900px){
 .game-stage .ty25-beam{height:4px}.game-stage .ty25-burst-large{width:30px;height:30px}}
@media(prefers-reduced-motion:reduce){.game-stage .ty25-flight,.game-stage .ty25-beam,.game-stage .ty25-burst{display:none!important;animation:none!important}
 .game-stage #top-card.ty25-arriving>.game-card{opacity:1!important}
 .game-stage #top-card>.game-card.ty25-landing,.game-stage #hand .hand-card-cell.ty25-received{animation:none!important;filter:none!important;translate:none!important}}

/* A third real card adds depth without generating fabricated card faces. */
.game-stage #top-card>.ty26-discard-third,
.game-stage .ty25-discard-placeholder>.ty26-discard-third{
 transform:translate(3px,9px) rotate(8deg);opacity:.65;z-index:0;
}
/* Keep visual-only flights from covering controls at any viewport width. */
@media(max-width:900px){
 .game-stage .ty25-flight{width:var(--ty26-end-w,30px);height:var(--ty26-end-h,44px);margin:0}
}
@media(prefers-reduced-motion:reduce){.game-stage .ty25-discard-placeholder{display:none!important}}
