/* Полёт сквозь сыр (assets/fair-fly.js): холст влёта в сыр, ролик тоннеля во
   весь экран с крошками и тряской, кольцо загрузки, вспышка на вылете;
   прибытие — последний кадр полёта, тающий над новым миром. */
.fair-fly { position: fixed; inset: 0; z-index: 950; background: #000; opacity: 0; transition: opacity .15s ease-out; overflow: hidden; }
.fair-fly.on { opacity: 1; }
.ff-stage { position: absolute; inset: 0; will-change: transform; }
/* рамка картины: место и камера ставит fair-fly.js (o.from), затем она
   раскрывается до полного экрана — плавно, пока идёт влёт */
.ff-cam { position: absolute; inset: 0; will-change: transform; }
.ff-cam.settle { transition: transform 1.2s cubic-bezier(.4, 0, .2, 1) .35s; }
.ff-video { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; object-fit: cover; object-position: center; opacity: 0; transition: opacity .3s ease-out; }
.ff-video.on { opacity: 1; }
/* холст влёта/вылета: под ним уже играет тоннель */
.ff-dive { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; transition: opacity .35s ease-out; }
.ff-dive.gone { opacity: 0; }
/* крошки петли — поверх ролика */
.ff-fx { position: absolute; inset: 0; z-index: 3; width: 100%; height: 100%; pointer-events: none; mix-blend-mode: screen; transition: opacity .3s; }
.ff-fx.gone { opacity: 0; }
/* виньетка скорости */
.fair-fly.looping .ff-stage::after { content: ""; position: absolute; inset: 0; z-index: 4; pointer-events: none;
  background: radial-gradient(70% 70% at 50% 46%, transparent 45%, rgba(40, 16, 0, .55)); }
.ff-hud { position: absolute; z-index: 6; left: 50%; bottom: calc(28px + env(safe-area-inset-bottom, 0px)); transform: translateX(-50%); display: flex; align-items: center; gap: 12px;
  padding: 10px 16px 10px 10px; border-radius: 16px; background: rgba(30, 14, 4, .55); backdrop-filter: blur(8px); color: #fff3d9;
  font-family: "Unbounded", "Golos Text", sans-serif; font-weight: 700; font-size: 14px; opacity: 0; transition: opacity .3s; }
.fair-fly.looping .ff-hud { opacity: 1; }
.ff-ring { position: relative; width: 34px; height: 34px; border-radius: 50%; background: conic-gradient(#ffd24d calc(var(--p, 0) * 1turn), rgba(255, 243, 217, .18) 0);
  -webkit-mask: radial-gradient(circle, transparent 0 52%, #000 54%); mask: radial-gradient(circle, transparent 0 52%, #000 54%); }
.ff-flash { position: absolute; inset: 0; z-index: 7; background: #fff4cc; opacity: 0; pointer-events: none; }
/* свет в конце тоннеля вспыхивает на вылете, второй раз — при посадке */
.fair-fly.burst .ff-flash { animation: ff-burst .75s ease-out forwards; }
@keyframes ff-burst { 0% { opacity: 0; } 30% { opacity: .95; } 100% { opacity: 0; } }
.fair-fly.landing .ff-flash { animation: ff-flash .4s ease-out forwards; }
@keyframes ff-flash { 40% { opacity: .55; } 100% { opacity: 0; } }
.fair-arrive-fly { position: fixed; inset: 0; z-index: 950; background: #1b1233 center / cover no-repeat; pointer-events: none; transition: opacity .9s ease-out, transform 1s ease-out; }
.fair-arrive-fly.go { opacity: 0; transform: scale(1.06); }
/* под постером — та же картина: короткое растворение без наезда */
.fair-arrive-fly.soft { transition: opacity .45s ease-out; }
.fair-arrive-fly.soft.go { transform: none; }
@media (prefers-reduced-motion: reduce) { .ff-cam.settle { transition: none; } .fair-fly.burst .ff-flash { animation-duration: .3s; } }
