/* Gravity-led hop timing shared by desktop and mobile. */
.player {
  --jump-apex: -118px;
  --jump-rise: -58px;
  --hop-mid: 0px;
  --hop-late: 0px;
  --hop-forward: 0px;
  will-change: transform;
}

.player.hop {
  animation: weightedHopNatural var(--flight-ms,680ms) linear var(--flight-delay,0ms) both !important;
}

.track.hop-scroll {
  transition-duration: .18s !important;
  transition-timing-function: cubic-bezier(.2,.7,.25,1) !important;
}

@keyframes weightedHopNatural {
  0% { transform: translateX(-50%) translateY(0) scale(1); }
  7% { transform: translateX(-50%) translateY(5px) scaleX(1.055) scaleY(.945); animation-timing-function: cubic-bezier(.3,0,.7,.3); }
  20% { transform: translateX(-50%) translateY(calc(var(--jump-rise) + var(--hop-mid))) scaleX(.985) scaleY(1.025); animation-timing-function: cubic-bezier(.2,.55,.35,1); }
  48% { transform: translateX(-50%) translateY(calc(var(--jump-apex) + var(--hop-mid))) scale(.95) rotate(-.7deg); animation-timing-function: cubic-bezier(.55,0,.82,.45); }
  74% { transform: translateX(-50%) translateY(calc(var(--jump-rise) + var(--hop-late))) scale(.975) rotate(.35deg); animation-timing-function: cubic-bezier(.35,.1,.7,.8); }
  91% { transform: translateX(-50%) translateY(calc(-3px + var(--hop-forward))) scaleX(1.025) scaleY(.975); }
  96% { transform: translateX(-50%) translateY(calc(3px + var(--hop-forward))) scaleX(1.045) scaleY(.955); }
  100% { transform: translateX(-50%) translateY(var(--hop-forward)) scale(1); }
}

.stage.landing-impact {
  animation: landingCameraNatural .26s ease-out;
}

.lane.landing-flash .square {
  animation: landingEdgeGlow .56s ease-out !important;
}

@keyframes landingEdgeGlow {
  0% {
    border-color: var(--c);
    box-shadow: inset 0 0 0 1px #ffffff20, 0 0 10px color-mix(in srgb, var(--c) 40%, transparent);
  }
  28% {
    border-color: color-mix(in srgb, var(--c) 82%, white);
    box-shadow: inset 0 0 0 2px #ffffff38, 0 0 12px var(--c), 0 0 30px var(--c), 0 0 54px color-mix(in srgb, var(--c) 68%, transparent);
  }
  100% {
    border-color: var(--c);
    box-shadow: inset 0 0 0 1px #ffffff20, 0 0 16px color-mix(in srgb, var(--c) 44%, transparent);
  }
}

@keyframes landingCameraNatural {
  0% { transform: translateY(-1px) scale(1.002); }
  28% { transform: translateY(4px) scale(.998); }
  65% { transform: translateY(-1px); }
  100% { transform: none; }
}

@media (max-width: 650px) {
  .player {
    --jump-apex: -88px;
    --jump-rise: -44px;
  }
}

/* One flight clock drives character and camera; outcome remains precommitted. */
.player{--hop-mid:0px;--hop-late:0px;--hop-forward:0px;transition:bottom 680ms cubic-bezier(.3,0,.3,1),opacity .15s}
.track{transition:transform 680ms cubic-bezier(.3,0,.3,1)}
.ground-shadow{position:absolute;z-index:10;left:50%;bottom:60px;width:90px;height:13px;border-radius:50%;background:#0009;filter:blur(4px);transform:translateX(-50%);pointer-events:none;transition:bottom 680ms}
.stage:has(.player[style*="135px"]) .ground-shadow{bottom:135px}
.stage:has(.player[style*="--landing-bottom: 0px"]) .ground-shadow{bottom:2px}
.in-flight .ground-shadow{animation:hopShadow 680ms ease-in-out}
@keyframes hopShadow{50%{opacity:.28;transform:translateX(-50%) scale(.6)}100%{opacity:1}}
.player.landed{animation:landingWeight 200ms ease-out}
@keyframes landingWeight{0%{transform:translateX(-50%) scale(1.045,.955)}100%{transform:translateX(-50%) scale(1)}}
.dust{bottom:60px;pointer-events:none}.stage:has(.player[style*="135px"]) .dust{bottom:135px}
.roundbar{grid-template-columns:1.25fr 1fr}.cash{box-shadow:0 0 24px #43e5bc30}.pill:has(#winRead){border-color:#50e5c080;background:#0c302c}.pill strong{font-variant-numeric:tabular-nums}
.timer{top:44px}
.horizon strong{font-size:clamp(25px,4vw,48px);letter-spacing:-.04em}.resultBig{font-size:clamp(24px,6vw,52px);overflow-wrap:anywhere}.mini .pill{min-width:0;flex:1;max-width:205px}.pill strong{overflow-wrap:anywhere}
.setup,.result{overflow:auto}.card{max-height:100%;overflow:auto}.polish-card{max-height:90dvh;overflow:auto}
button:focus-visible,a:focus-visible,input:focus-visible{outline:3px solid #fff;outline-offset:3px}
@media(max-width:650px){
 .lane-x{left:calc(50% + 103px);min-width:0;max-width:calc(50vw - 108px);padding:5px 3px;font-size:10px;overflow-wrap:anywhere;backdrop-filter:none}
 .polish-actions{top:114px;left:8px;right:auto}.timer{top:52px;right:8px;width:145px}.roundbar button{font-size:12px;min-height:52px;padding:8px}.game{grid-template-rows:62px minmax(180px,1fr) auto}
 .stat strong{font-size:12px;overflow-wrap:anywhere}.stat{max-width:132px}.card{padding:18px}.setup .card{padding-top:60px}
}
@media(max-height:600px){
 html,body{overflow:auto}.game{min-height:520px;height:100dvh}.setup,.result{position:fixed}.card{max-height:calc(100dvh - 24px)}.horizon strong{font-size:25px}.timer{top:45px}
}
@media(orientation:landscape) and (max-height:500px){
 .game{min-height:360px;grid-template-columns:minmax(0,1fr) 260px;grid-template-rows:52px minmax(0,1fr)}
 .game>header{grid-column:1/-1}.game>.stage{grid-column:1;grid-row:2}.game>footer{grid-column:2;grid-row:2;align-self:end}
 .roundbar{grid-template-columns:1fr}.mini{flex-wrap:wrap}.mini .pill{flex-basis:40%}.player,.player[data-stance="pair"]{height:135px;width:100px}.player[data-stance="pair"][data-player]{width:155px}
 .horizon{left:22%;top:8px}.horizon strong{font-size:18px}.horizon span{font-size:7px}.timer{top:4px;right:6px;width:145px}.polish-actions{top:64px;left:auto;right:12px}.player{--jump-apex:-60px;--jump-rise:-30px}
}
@media(prefers-reduced-motion:reduce){
 *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
 .player.hop{animation:none!important}.stage.landing-impact{animation:none!important}.in-flight .ground-shadow{animation:none}.cash-celebration{display:none!important}
}

/* Round setup lives on the court, never in an entry overlay. */
.game{grid-template-rows:72px minmax(210px,1fr) auto}
.setup.inline-setup{position:static;inset:auto;display:grid;grid-template-columns:1fr 1fr;gap:8px 16px;max-width:650px;margin:auto;padding:0;background:none;backdrop-filter:none;overflow:visible;z-index:auto}
.inline-setup .section-label{margin:0 0 5px;font-size:8px}.inline-setup .pick{height:auto;gap:6px}.inline-setup .pick button{height:42px;padding:4px 4px 4px 36px;font-size:10px;border-radius:10px;min-width:0}.inline-setup .pick img{height:62px;left:0;right:auto;bottom:-10px}.inline-setup .betbox{grid-template-columns:36px minmax(0,1fr) 36px;gap:4px}.inline-setup .betbox input{width:100%;min-width:0}.inline-setup .betbox button,.inline-setup .betbox input{height:42px}.inline-setup .chips{grid-column:2;margin:0;gap:4px}.inline-setup .chips button{padding:5px 3px}.inline-setup button:disabled,.inline-setup input:disabled{opacity:.5;cursor:not-allowed}
.bet-hint{max-width:650px;margin:5px auto;color:#9baec0;font-size:10px;min-height:14px;text-align:center}.inline-start{display:block;max-width:650px;margin:8px auto 0;min-height:48px}.game>footer{display:flex;flex-direction:column;padding-top:6px}.game>footer .inline-setup,.game>footer .mini,.game>footer .roundbar{width:100%;max-width:650px}.game>footer .mini{order:2;margin:7px auto}.game>footer .roundbar,.game>footer .inline-start{order:3}.roundbar{display:none}.bet-hint{order:1}
@media(max-width:650px){.game{grid-template-rows:62px minmax(180px,1fr) auto}.setup.inline-setup{gap:5px 8px}.inline-setup .pick button{font-size:8px;padding-left:25px}.inline-setup .pick img{left:-5px;height:54px}.inline-setup .betbox{grid-template-columns:28px minmax(0,1fr) 28px}.inline-setup .betbox input{font-size:13px}.game>footer{padding:6px 10px max(8px,env(safe-area-inset-bottom))}.game>footer .mini{margin:5px auto}.bet-hint{font-size:9px}.inline-start{margin-top:0}.inline-setup .chips{grid-column:1/-1}.pill strong{font-size:12px}.pill{padding:4px!important}}
@media(orientation:landscape) and (max-height:500px){.game{grid-template-rows:52px minmax(0,1fr)}.game>footer{max-height:calc(100dvh - 52px);overflow:auto}.setup.inline-setup{grid-template-columns:1fr}.inline-setup .chips{grid-column:1}.game>footer .mini{display:none}.bet-hint{font-size:9px}}
@media(orientation:portrait) and (max-height:650px){.player,.player[data-stance="pair"]{height:130px;--jump-apex:-55px;--jump-rise:-28px}}

/* Hold the incorrect foot contact on screen before revealing the loss dialog. */
.player.loss-landing{animation:failedFootContact 500ms ease-out var(--loss-delay,0ms) both!important;opacity:1;transition:none}
@keyframes failedFootContact{0%{transform:translateX(calc(-50% + var(--miss-x))) translateY(0)}65%{transform:translateX(calc(-50% + var(--miss-x))) translateY(3px) rotate(7deg) scaleY(.96)}100%{transform:translateX(calc(-50% + var(--miss-x))) rotate(5deg)}}
.landing-marker{display:none;position:absolute;z-index:16;left:calc(50% + var(--miss-x));transform:translate(-50%,50%);width:44px;height:25px;border:3px solid #fff;border-radius:50%;background:#ff214ecc;box-shadow:0 0 0 7px #ff214e55,0 0 24px #ff214e;color:#fff;font-size:8px;font-weight:900;text-align:center;line-height:19px;pointer-events:none}
.landing-marker.show{display:block}.landing-marker.outside{border-style:dashed}.fault.show{bottom:auto;top:145px;font-size:11px}.lane.miss-line .square:before{display:none}.lane.miss-line .square{border-color:#fff!important;outline:3px solid #ff214e;outline-offset:0}
@media(prefers-reduced-motion:reduce){.player.loss-landing{animation:none!important;transform:translateX(calc(-50% + var(--miss-x)))} }

/* A failed hop reaches its contact point during descent, not after landing. */
.player.hop.failed-hop{animation-name:failedHopNatural!important}
@keyframes failedHopNatural{
  0%{transform:translateX(-50%) translateY(0) scale(1)}
  7%{transform:translateX(-50%) translateY(5px) scale(1.055,.945)}
  20%{transform:translateX(calc(-50% + var(--miss-x)*.12)) translateY(var(--jump-rise)) scale(.985,1.025)}
  48%{transform:translateX(calc(-50% + var(--miss-x)*.55)) translateY(var(--jump-apex)) scale(.95)}
  74%{transform:translateX(calc(-50% + var(--miss-x)*.9)) translateY(var(--jump-rise)) scale(.975)}
  91%{transform:translateX(calc(-50% + var(--miss-x))) translateY(-3px) scale(1.025,.975)}
  96%{transform:translateX(calc(-50% + var(--miss-x))) translateY(3px) scale(1.045,.955)}
  100%{transform:translateX(calc(-50% + var(--miss-x))) translateY(0) scale(1)}
}
@media(prefers-reduced-motion:reduce){.player.hop.failed-hop{animation:none!important;transform:translateX(calc(-50% + var(--miss-x)))}}

/* Preserve sprite proportions; paired feet remain inside the two squares. */
.player{object-position:center bottom}
.player[data-stance="pair"]{width:auto!important;object-fit:contain}
.horizon strong{font-size:clamp(20px,3vw,32px)}
.lane-x{font-size:12px;padding:5px 7px;min-width:60px}
@media(max-width:650px){.horizon strong{font-size:24px}.lane-x{font-size:10px;min-width:0;padding:4px 3px}}
