
@font-face {
    font-family: 'Onest';
    src: url('/assets/fonts/onest.woff2') format('woff2');
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
}

@font-face {
    font-family: 'SF Pro Expanded';
    src: url('/assets/fonts/sf-pro-expanded-medium.woff2') format('woff2');
    font-style: normal;
    font-weight: 500;
    font-display: swap;
}

@font-face {
    font-family: 'Nunito Sans Light Wide';
    src: url('/assets/fonts/nunito-sans-light-wide-v2.woff2') format('woff2');
    font-style: normal;
    font-weight: 300;
    font-stretch: 105%;
    font-display: swap;
}

@font-face {
    font-family: 'Nunito Sans Medium';
    src: url('/assets/fonts/nunito-sans-medium-v2.woff2') format('woff2');
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-display: swap;
}

@property --weather-rain-mix {
    syntax: '<percentage>';
    inherits: true;
    initial-value: 0%;
}

@property --weather-snow-mix {
    syntax: '<percentage>';
    inherits: true;
    initial-value: 0%;
}

@property --audio-guide-rim-mix {
    syntax: '<percentage>';
    inherits: true;
    initial-value: 0%;
}

:root {
    --ink: #14202A;
    --accent: #0FA5D8;
    --brand-blue: #0400FA;
    --brand-green: #00E5B7;
    --brand-green-rgb: 0, 229, 183;
    --page: #FFFFFF;
    --hero-scene-background: #0A1722 url('/assets/media/hero-background.webp') center / cover no-repeat;
    --pad: clamp(24px, 5vw, 96px); /* боковые отступы страницы */
    /* заголовки разделов: Climate Crisis с Google Fonts, фолбэк системный */
    --display: 'Onest', system-ui, sans-serif;
    --display-cc: 'Onest', system-ui, sans-serif; /* прежний шрифт заголовков */
    --heading: 'SF Pro Expanded', 'Onest', system-ui, sans-serif;
    --font-nunito-light-wide: 'Nunito Sans Light Wide', 'Onest', system-ui, sans-serif;
    --font-nunito-medium: 'Nunito Sans Medium', 'Onest', system-ui, sans-serif;
    --hero-copy-size: clamp(20px, 1.35vw, 28px);
    --mobile-section-title-size: clamp(34px, 9.5vw, 54px);
    --face-side: #12202B;
    /* Ракурс третьего экрана: больше perspective = меньше искажение. */
    --cap0-camera-perspective: 1600px;
    --cap0-camera-origin-x: 50%;
    --cap0-camera-origin-y: 45%;
}

/* Проектные имена начертаний. Оси wdth и YTLC уже зафиксированы в WOFF2. */
.font-nunito-light-wide {
    font-family: var(--font-nunito-light-wide);
    font-style: normal;
    font-weight: 300;
    font-stretch: 105%;
    font-synthesis: none;
}

.font-nunito-medium {
    font-family: var(--font-nunito-medium);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-synthesis: none;
}

* {
    box-sizing: border-box
}

html {
    background: #0A1722;
    overscroll-behavior-y: none;
}

body {
    margin: 0;
    font: 16px/1.4 'Onest', system-ui, sans-serif;
    color: var(--ink);
    background: var(--page);
    overscroll-behavior-y: none;
}

/* Один фиксированный слой продолжает фон «Заряжаем» под CTA и футером. */
.final-backdrop {
    position: fixed;
    inset: 0;
    z-index: 0;
    opacity: 0;
    pointer-events: none;
    background: var(--hero-scene-background);
}

.scene {
    position: sticky;
    top: 0;
    height: 100vh;
    display: grid;
    place-items: center;
    perspective: 1050px;
    perspective-origin: 50% 45%;
    overflow: hidden;
}

/* На естественном финальном скролле корпус больше не режется нижней
     границей бывшего sticky-контейнера. Предыдущие сцены остаются закрытыми. */
body.is-final-flow .scene {
    overflow-x: clip;
    overflow-y: visible
}

body.is-final-flow .stage {
    z-index: 8
}

/* После sticky-сцены фон рисует только fixed-подложка: две копии
     одного WEBP расходились по координатам и давали горизонтальный стык. */
body.is-final-flow .charge-bg,
body.is-final-flow .veil {
    visibility: hidden
}

body.cap0-layout .scene {
    perspective: var(--cap0-camera-perspective);
    perspective-origin: var(--cap0-camera-origin-x) var(--cap0-camera-origin-y);
}

/* Слой остаётся на GPU во время движения телефона; will-change снимается
     только в финальном приближении, где важна резкость экранных медиа. */
/* roll вынесен наружу: внутри одного элемента GSAP применяет rotate(z)
     раньше rotationX/Y, и крен считался бы в системе объекта, а не экрана */
.roll-layer, .scroll-layer, .tilt-layer, .intro-layer {
    transform-style: preserve-3d
}

/* корпус выше свечения: без индекса он рисовался под .aura (z-index 1),
     потому что положительный индекс всегда выше auto */
.roll-layer {
    position: relative;
    z-index: 6;
    pointer-events: none;
    transition: opacity .24s cubic-bezier(.4, 0, .2, 1), visibility 0s linear 0s;
}

.roll-layer.is-transition-hidden {
    opacity: 0 !important;
    visibility: hidden;
    pointer-events: none;
}

.roll-layer.is-charge-visible {
    opacity: 1;
    visibility: visible;
    transition: none;
}

.scroll-layer {
    position: relative;
    z-index: 6
}

body.weather-active .idle-r {
    --idle-yaw: 15deg
}

/* Ускорение включается, пока телефон ещё скрыт. На время въезда вертикальную
     фазу замораживаем и затем продолжаем её без сброса позиции по Y. */
body.is-charge-motion .idle-y {
    animation-duration: 2.8s
}

body.is-charge-motion .idle-r {
    animation-duration: 4.55s;
    animation-delay: -1.15s
}

body.is-charge-entering .idle-y,
body.is-charge-entering .idle-r {
    animation-play-state: paused
}

.roll-layer.is-transition-hidden .idle-y,
.roll-layer.is-transition-hidden .idle-r,
.roll-layer.is-transition-hidden .box,
.roll-layer.is-transition-hidden .second-screen-glow::before,
.roll-layer.is-transition-hidden .second-screen-glow::after {
    animation-play-state: paused
}

/* На втором экране вдвое ускоряем текущий темп цветного ободка. */
.box.is-second-screen {
    animation-duration: 22s, 2s
}

/* Финальный телефон перед футером возвращается к спокойному темпу
     ободка первого экрана, несмотря на состояние второго экрана. */
body.is-charge .box {
    animation-duration: 22s, 12s;
    animation-play-state: running
}

body.phone-ambient-paused .idle-y,
body.phone-ambient-paused .idle-r,
body.phone-ambient-paused .box,
body.phone-ambient-paused .second-screen-glow::before,
body.phone-ambient-paused .second-screen-glow::after {
    animation-play-state: paused
}

/* Свечение начинается точно от корпуса: без отрицательного inset и
     отдельной светлой кромки, которая раньше выглядела второй рамкой. */
.second-screen-glow {
    position: absolute;
    inset: 0;
    z-index: 0;
    border-radius: var(--r);
    opacity: 0;
    pointer-events: none;
    transform: translateZ(-1px);
}

.second-screen-glow::before,
.second-screen-glow::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    opacity: .38;
    animation: secondScreenPhoneGlow 2.2s ease-in-out infinite;
    animation-play-state: paused;
}

.second-screen-glow.is-active::before,
.second-screen-glow.is-active::after {
    animation-play-state: running
}

.second-screen-glow::before {
    box-shadow: 0 0 calc(var(--h) * .055) rgba(var(--rim-cyan), .92),
    0 0 calc(var(--h) * .14) rgba(var(--rim-cyan), .66),
    0 0 calc(var(--h) * .27) rgba(var(--rim-cyan), .36);
}

.second-screen-glow::after {
    box-shadow: 0 0 calc(var(--h) * .070) rgba(var(--rim-green), .86),
    0 0 calc(var(--h) * .18) rgba(var(--rim-green), .54),
    0 0 calc(var(--h) * .32) rgba(var(--rim-green), .28);
    animation-delay: -1.1s;
}

@keyframes secondScreenPhoneGlow {
    0%, 100% {
        opacity: .38
    }
    50% {
        opacity: 1
    }
}

/* Импульс вынесен из 3D-иерархии корпуса: остаётся правильным кругом при
     любом наклоне телефона и свободно выходит за границы viewport. */
.plan-complete-wave {
    --rim-cyan: 72, 211, 226;
    --rim-green: 61, 255, 136;
    position: fixed;
    inset: 0;
    z-index: 6;
    pointer-events: none;
    overflow: visible;
}

.plan-complete-wave i {
    position: absolute;
    left: 0;
    top: 0;
    width: 320px;
    height: 320px;
    border-radius: 50%;
    background: radial-gradient(circle closest-side,
    transparent 0%,
    transparent 34%,
    rgba(var(--rim-cyan), .035) 46%,
    rgba(var(--rim-cyan), .14) 58%,
    rgba(var(--rim-green), .24) 70%,
    rgba(var(--rim-cyan), .12) 84%,
    transparent 100%);
    opacity: 0;
    transform: translate3d(-50%, -50%, 0) scale(.72);
}

.plan-complete-particles {
    --particle-burst-glow: rgba(0, 229, 183, .32);
    position: absolute;
    left: 0;
    top: 0;
    z-index: 1;
    width: 1px;
    height: 1px;
    pointer-events: none;
}

/* На светлой теме — стабильная mint/cyan-палитра из референса.
     В тёмных главах остаётся медленная футуристичная смена hue. */
body.header-on-dark .box {
    --rim-hue: var(--ghost-hue)
}

/* --- поток по рамке ---
     пятно света физически идёт по контуру корпуса через offset-path.
     два пятна: одно поднимается по правой стороне, второе по левой,
     оба стартуют снизу и сходятся у верхней кромки */
.flow {
    position: absolute;
    inset: 0;
    z-index: 5;
    opacity: 0;
    pointer-events: none;
    transform: translateZ(calc(var(--d) / 2 + 1px));
}

.flow i {
    position: absolute;
    left: 0;
    top: 0;
    width: calc(var(--h) * 0.30);
    height: calc(var(--h) * 0.30);
    margin: calc(var(--h) * -0.15) 0 0 calc(var(--h) * -0.15);
    border-radius: 50%;
    background: radial-gradient(circle,
    rgba(255, 255, 255, .95) 0%,
    rgba(209, 255, 250, .75) 26%,
    rgba(15, 165, 216, .45) 52%,
    rgba(15, 165, 216, 0) 78%);
    filter: blur(14px);
    mix-blend-mode: screen;
    offset-rotate: 0deg;
}

/* поток внутри экрана: свет входит сверху и уходит вглубь */
.inflow {
    position: absolute;
    inset: 0;
    z-index: 6;
    border-radius: inherit;
    opacity: 0;
    pointer-events: none;
    overflow: hidden;
    mix-blend-mode: screen;
}

/* только вход у верхней кромки, без ровной шапки на весь экран */
.inflow::before {
    content: '';
    position: absolute;
    left: 6%;
    right: 6%;
    top: 0;
    height: 26%;
    background: linear-gradient(180deg,
    rgba(255, 255, 255, .80) 0%,
    rgba(209, 255, 250, .50) 34%,
    rgba(15, 165, 216, .14) 72%,
    rgba(15, 165, 216, 0) 100%);
    filter: blur(14px);
}

/* мягкая волна, стекающая вниз по экрану */
.inflow::after {
    content: '';
    position: absolute;
    left: -20%;
    right: -20%;
    top: -30%;
    height: 46%;
    background: radial-gradient(50% 60% at 50% 40%, rgba(255, 255, 255, .55), rgba(209, 255, 250, .20) 55%, rgba(209, 255, 250, 0) 100%);
    filter: blur(20px);
    animation: flowDown 4.2s cubic-bezier(.35, 0, .4, 1) infinite;
    animation-play-state: paused;
}

@keyframes flowDown {
    0% {
        transform: translateY(-10%);
        opacity: 0
    }
    16% {
        opacity: .9
    }
    100% {
        transform: translateY(210%);
        opacity: 0
    }
}

@media (prefers-reduced-motion: reduce) {
    .inflow::after {
        animation: none
    }

    .box {
        animation: none
    }

    .roll-layer {
        transition: none
    }
}

html[data-performance-mode='lite'] *,
html[data-performance-mode='lite'] *::before,
html[data-performance-mode='lite'] *::after {
    animation: none !important;
    transition: none !important;
}

html[data-performance-mode='lite'] {
    scroll-behavior: auto !important;
}

body.weather-active .rim::before,
body.weather-rim-active .rim::before {
    background: conic-gradient(from var(--rim-spin),
    color-mix(in srgb,
            color-mix(in srgb,
                    color-mix(in srgb, rgba(112, 211, 255, .30), rgba(10, 18, 32, .96) var(--weather-rain-mix)),
                    rgba(246, 252, 255, .92) var(--weather-snow-mix)),
            rgba(var(--rim-cyan), .78) var(--audio-guide-rim-mix)) 0deg,
    color-mix(in srgb,
            color-mix(in srgb,
                    color-mix(in srgb, rgba(112, 211, 255, .50), rgba(26, 40, 61, .98) var(--weather-rain-mix)),
                    rgba(220, 240, 255, .94) var(--weather-snow-mix)),
            rgba(var(--rim-cyan), .92) var(--audio-guide-rim-mix)) 70deg,
    color-mix(in srgb,
            color-mix(in srgb,
                    color-mix(in srgb, rgba(201, 242, 255, .76), rgba(70, 88, 115, .92) var(--weather-rain-mix)),
                    rgba(255, 255, 255, 1) var(--weather-snow-mix)),
            rgba(var(--rim-green), .98) var(--audio-guide-rim-mix)) 154deg,
    color-mix(in srgb,
            color-mix(in srgb,
                    color-mix(in srgb, rgba(112, 211, 255, .54), rgba(16, 28, 48, .98) var(--weather-rain-mix)),
                    rgba(204, 228, 246, .92) var(--weather-snow-mix)),
            rgba(var(--rim-cyan), .94) var(--audio-guide-rim-mix)) 232deg,
    color-mix(in srgb,
            color-mix(in srgb,
                    color-mix(in srgb, rgba(201, 242, 255, .38), rgba(93, 111, 139, .84) var(--weather-rain-mix)),
                    rgba(249, 253, 255, .98) var(--weather-snow-mix)),
            rgba(var(--rim-green), .84) var(--audio-guide-rim-mix)) 310deg,
    color-mix(in srgb,
            color-mix(in srgb,
                    color-mix(in srgb, rgba(112, 211, 255, .30), rgba(10, 18, 32, .96) var(--weather-rain-mix)),
                    rgba(246, 252, 255, .92) var(--weather-snow-mix)),
            rgba(var(--rim-cyan), .78) var(--audio-guide-rim-mix)) 360deg),
    linear-gradient(125deg,
            color-mix(in srgb,
                    color-mix(in srgb,
                            color-mix(in srgb, rgba(255, 255, 255, .18), rgba(135, 151, 176, .18) var(--weather-rain-mix)),
                            rgba(255, 255, 255, .72) var(--weather-snow-mix)),
                    transparent var(--audio-guide-rim-mix)),
            color-mix(in srgb,
                    color-mix(in srgb,
                            color-mix(in srgb, rgba(255, 255, 255, .035), rgba(15, 24, 39, .26) var(--weather-rain-mix)),
                            rgba(233, 246, 255, .30) var(--weather-snow-mix)),
                    transparent var(--audio-guide-rim-mix)) 34%,
            color-mix(in srgb,
                    color-mix(in srgb,
                            color-mix(in srgb, rgba(54, 137, 176, .07), rgba(0, 5, 13, .46) var(--weather-rain-mix)),
                            rgba(173, 204, 228, .18) var(--weather-snow-mix)),
                    transparent var(--audio-guide-rim-mix)) 72%,
            color-mix(in srgb,
                    color-mix(in srgb,
                            color-mix(in srgb, rgba(255, 255, 255, .10), rgba(100, 119, 149, .12) var(--weather-rain-mix)),
                            rgba(255, 255, 255, .58) var(--weather-snow-mix)),
                    transparent var(--audio-guide-rim-mix)));
    filter: none;
    opacity: 1;
}

/* Стартовый экран уходит вместе с нырком корпуса. */
.screen .hero-shot {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center top;
    display: block;
    z-index: 2;
}

.screen .hero-shot {
    background: #000
}

/* Финальный ролик перекрывает прежний статичный экран только в фазе
     зарядки; до неё браузер не загружает видео благодаря preload="none". */
.final-phone-video {
    position: absolute;
    top: 0;
    left: 1%;
    z-index: 8;
    display: none;
    width: 98%;
    height: 98%;
    border-radius: inherit;
    object-fit: fill;
    object-position: center top;
    background: #000;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
}

body.is-charge .final-phone-video {
    display: block;
    opacity: 1;
    visibility: visible;
    height: 100%;
}

/* Перед финальным входом корпус ещё скрыт, поэтому можно без скачка
     укоротить только его низ. Верх и фактический размер видео сохраняются. */
body.is-charge-motion .box.device-iphone-14-pro {
    height: calc(var(--h) * .98);
    top: calc(var(--h) * -.01);
}

/* Новый план собирается из PNG-блоков внутри рамки телефона. Белая
     подложка остаётся видна ниже контента, пока владелец не задаст следующий экран. */
.plan-reveal {
    position: absolute;
    inset: 0;
    z-index: 4;
    overflow: hidden;
    background: #fff;
    filter: none;
    mix-blend-mode: normal;
    pointer-events: none;
}

.plan-reveal__content {
    width: 98%;
    margin-inline: auto;
}

.plan-reveal img {
    display: block;
    width: 100%;
    height: auto;
    filter: none;
    mix-blend-mode: normal;
}

/* Второй экран: до сборки нового плана видна стеклянная подложка корпуса. */
.screen-placeholder {
    position: absolute;
    inset: 0;
    z-index: 3;
    overflow: hidden;
    /* Мягко смешиваем заливку экрана с цветным корпусом только в сцене
       прилёта изображений, не размывая сам силуэт телефона. */
    box-shadow: inset 0 0 calc(var(--h) * .018) rgba(var(--rim-cyan), .42),
    inset 0 0 calc(var(--h) * .007) rgba(var(--rim-green), .24);
    opacity: 0;
    pointer-events: none;
}

/* Временный экран аудиогида: белая плоскость остаётся поверх всего
     содержимого телефона до завершения его вылета в следующую главу. */
.screen-placeholder.is-audio-guide,
body.split-active .screen-placeholder,
body.trip-hub-active .screen-placeholder {
    z-index: 9;
    background: #FFF;
    box-shadow: none;
}

.screen-placeholder.is-audio-guide::before,
.screen-placeholder.is-audio-guide::after,
body.split-active .screen-placeholder::before,
body.split-active .screen-placeholder::after,
body.trip-hub-active .screen-placeholder::before,
body.trip-hub-active .screen-placeholder::after {
    display: none
}

.audio-guide-player {
    position: absolute;
    left: 50%;
    bottom: 0;
    z-index: 1;
    display: none;
    width: 100%;
    height: auto;
    transform: translateX(-50%);
    opacity: 0;
    pointer-events: none;
}

.screen-placeholder.is-audio-guide .audio-guide-player,
body.split-active .audio-guide-player,
body.trip-hub-active .audio-guide-player {
    display: block;
    opacity: 1
}

.plan-complete-check {
    position: absolute;
    inset: 0;
    z-index: 7;
    display: grid;
    place-items: center;
    opacity: 0;
    pointer-events: none;
}

.plan-complete-check svg {
    display: block;
    width: 48%;
    height: auto;
    overflow: visible;
}

.plan-complete-check path {
    fill: none;
    stroke: #fff;
    stroke-width: 10;
    stroke-linecap: round;
    stroke-linejoin: round;
}

/* Шар попадает в локальный центр экрана. Две круговые волны
     продолжают движение внутри его скруглённой маски. */
.prompt-impact {
    position: absolute;
    inset: 0;
    z-index: 6;
    overflow: hidden;
    opacity: 0;
    pointer-events: none;
}

.prompt-impact__drop,
.prompt-impact__ring {
    position: absolute;
    left: 50%;
    top: 50%;
    display: block;
    pointer-events: none;
}

.prompt-impact__drop {
    width: 6.5%;
    aspect-ratio: 1;
    border-radius: 50%;
    background: #00E5B7;
    box-shadow: 0 0 calc(var(--h) * .025) rgba(0, 229, 183, .72);
}

.prompt-impact__ring {
    width: 112%;
    height: auto;
    aspect-ratio: 1;
    border: 3px solid rgba(255, 255, 255, .86);
    border-radius: 50%;
    box-shadow: 0 0 calc(var(--h) * .10) rgba(255, 255, 255, .8);
}

/* --- градиент первого экрана: уходит вместе с героем --- */
/* исходит из-под корпуса, смещено вниз: цвета больше в кадре */
/* градиентная полоса главного экрана: во всю ширину, гаснет к низу */
.hero-band {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    /* Запас снизу нужен для GSAP-сдвига сцены: край уезжает за кадр,
       пока слой мягко растворяется, а не открывает белую полосу. */
    height: calc(100vh + clamp(120px, 14vh, 220px));
    z-index: 0;
    opacity: 0;
    pointer-events: none;
    transform-origin: 50% 0;
    background: #0A1722;
    -webkit-mask-image: none;
    mask-image: none;
}

/* --- тёмная тема с раздела «ИИ-идеи» --- */
.veil {
    position: absolute;
    inset: 0;
    z-index: 0;
    background: radial-gradient(120% 90% at 50% 32%, #131820 0%, #05070A 72%);
    opacity: 0;
    pointer-events: none;
}

.assistant-bg {
    position: absolute;
    inset: 0;
    z-index: 1;
    opacity: 0;
    overflow: hidden;
    pointer-events: none;
    background: #070D11;
}

.assistant-bg::after {
    content: '';
    position: absolute;
    inset: -3%;
    opacity: var(--assistant-glow, 0);
    transform: scale(var(--assistant-glow-scale, 1.055));
    transform-origin: 68% 18%;
    background: url('/assets/generated/assistant-blue-glow.svg') center/cover no-repeat;
}

@media (max-width: 900px) {
    .assistant-bg::after {
        inset: -7%;
        background-position: 58% 14%
    }
}

/* --- магический свет по периметру ---
     приём из панели агента в приложении: под кадром крутится большой
     сплющенный конический эллипс, поверх лежит размытая плита цвета фона.
     плита закрывает середину, но её размытый край не доходит до границы —
     там и виден свет. толщину полосы задаёт радиус блюра плиты */
.aura {
    position: absolute;
    inset: 0;
    z-index: 1; /* под контентом: на 11 плита закрывала телефон и текст */
    opacity: 0;
    pointer-events: none;
    overflow: hidden;
}

/* свет: эллипс шире кадра, цвет меняется по периметру.
     стопов много, поэтому по каждой стороне свой оттенок, как на референсе */
/* палитра как у световых пятен на рамке: белое ядро, мятный, голубой, акцент */
.aura::before, .aura i {
    content: '';
    position: absolute;
    left: 50%;
    top: 50%;
    translate: -50% -50%;
    width: 168%;
    aspect-ratio: 1/1;
    border-radius: 50%;
    background: conic-gradient(
            rgba(255, 255, 255, .55) 0deg,
            rgba(209, 255, 250, .92) 38deg,
            rgba(124, 228, 255, .88) 86deg,
            rgba(15, 165, 216, .86) 134deg,
            rgba(255, 255, 255, .50) 180deg,
            rgba(209, 255, 250, .86) 226deg,
            rgba(124, 228, 255, .90) 278deg,
            rgba(15, 165, 216, .70) 324deg,
            rgba(255, 255, 255, .55) 360deg);
    filter: blur(52px);
}

/* вращение с покачиванием: одна скорость читалась как ровный ореол */
.aura::before {
    animation: auraSpin 9s linear infinite
}

/* второй слой крутится в обратную сторону: свет перетекает, а не просто едет */
.aura i {
    width: 150%;
    filter: blur(64px);
    opacity: .7;
    animation: auraSpinBack 13s linear infinite;
}

.aura::before, .aura i {
    animation-play-state: paused
}

/* плита цвета фона: её скругление и есть форма рамки, а радиус блюра —
     толщина видимой полосы. на референсе рамка скруглённая, отсюда 30px */
.aura::after {
    content: '';
    position: absolute;
    inset: 40px;
    border-radius: 30px;
    background: #05070A;
    filter: blur(34px);
}

@keyframes auraSpin {
    0% {
        transform: rotate(0deg);
        scale: 1 .62
    }
    25% {
        scale: 1.08 .54
    }
    50% {
        transform: rotate(180deg);
        scale: .94 .70
    }
    75% {
        scale: 1.06 .56
    }
    100% {
        transform: rotate(360deg);
        scale: 1 .62
    }
}

@keyframes auraSpinBack {
    0% {
        transform: rotate(360deg);
        scale: 1 .58
    }
    50% {
        transform: rotate(180deg);
        scale: 1.05 .66
    }
    100% {
        transform: rotate(0deg);
        scale: 1 .58
    }
}

@media (prefers-reduced-motion: reduce) {
    .aura::before, .aura i {
        animation: none
    }
}

body.is-dark .caption {
    color: #FFFFFF
}

body.is-dark .hero h1 {
    color: #FFFFFF
}

body.is-dark .hero p {
    color: #C9D3DA
}

body.is-dark .caption em {
    color: #8B959D
}

body.is-dark .hdr {
    color: #EDF3F8
}

.hdr, .caption, .caption em,
.hero h1, .hero p {
    transition: color .6s, background-color .6s;
}

/* --- шапка --- */
.hdr {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 20;
    display: flex;
    align-items: center;
    gap: 24px;
    padding: 26px var(--pad);
    font-family: 'Geologica', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
}

@media (min-width: 700px) {
    .box {
        --h: clamp(500px, min(78vh, 54vw), 1000px)
    }
}

.site-shell {
    position: relative
}

.hero-cursor-trail {
    position: absolute;
    inset: 0;
    z-index: 1;
    overflow: hidden;
    pointer-events: none;
}

.hero-particles {
    position: absolute;
    inset: 0;
    z-index: 2;
    overflow: hidden;
    opacity: 0;
    pointer-events: none;
}

body.is-loading .hero-particles {
    animation: heroParticlesLoadFade 1s ease-out both
}

@keyframes heroParticlesLoadFade {
    from {
        opacity: 0
    }
    to {
        opacity: 1
    }
}

.hero-particles i {
    position: absolute;
    display: block;
    left: calc(var(--particle-x, 50%) + var(--particle-offset, 0%));
    top: 0;
    width: var(--particle-size, 4px);
    height: var(--particle-size, 4px);
    animation: heroParticleRise var(--particle-duration, 18s) linear var(--particle-delay, 0s) infinite;
    animation-play-state: paused;
}

.hero-particles i::before {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: 50%;
    background: radial-gradient(circle, #C7FFFC 0 10%, rgba(199, 255, 252, 0) 58%);
    animation: heroParticlePulse var(--particle-pulse, 2.8s) ease-in-out var(--particle-pulse-delay, 0s) infinite;
    animation-play-state: paused;
}

body.is-loading #heroParticles i,
body.is-loading #heroParticles i::before,
body.hero-rim-blue #heroParticles i,
body.hero-rim-blue #heroParticles i::before {
    animation-play-state: running
}

.hero-particles i:nth-child(10n+1) {
    --particle-x: 48%;
    --particle-drift: -39vw;
    --particle-size: 7px;
    --particle-duration: 21.2s;
    --particle-pulse: 3.5s
}

.hero-particles i:nth-child(10n+2) {
    --particle-x: 87%;
    --particle-drift: -55vw;
    --particle-size: 6px;
    --particle-duration: 16.4s;
    --particle-pulse: 2.4s
}

.hero-particles i:nth-child(10n+3) {
    --particle-x: 15%;
    --particle-drift: -1vw;
    --particle-size: 9px;
    --particle-duration: 19.8s;
    --particle-pulse: 2.6s
}

.hero-particles i:nth-child(10n+4) {
    --particle-x: 53%;
    --particle-drift: 11vw;
    --particle-size: 8px;
    --particle-duration: 15.6s;
    --particle-pulse: 3.2s
}

.hero-particles i:nth-child(10n+5) {
    --particle-x: 9%;
    --particle-drift: 85vw;
    --particle-size: 5px;
    --particle-duration: 15.2s;
    --particle-pulse: 3.4s
}

.hero-particles i:nth-child(10n+6) {
    --particle-x: 65%;
    --particle-drift: -34vw;
    --particle-size: 2px;
    --particle-duration: 17.4s;
    --particle-pulse: 2.2s
}

.hero-particles i:nth-child(10n+7) {
    --particle-x: 11%;
    --particle-drift: 3vw;
    --particle-size: 3px;
    --particle-duration: 21.8s;
    --particle-pulse: 2.8s
}

.hero-particles i:nth-child(10n+8) {
    --particle-x: 61%;
    --particle-drift: -28vw;
    --particle-size: 5px;
    --particle-duration: 21.6s;
    --particle-pulse: 3.4s
}

.hero-particles i:nth-child(10n+9) {
    --particle-x: 77%;
    --particle-drift: -68vw;
    --particle-size: 5px;
    --particle-duration: 17.6s;
    --particle-pulse: 2.9s
}

.hero-particles i:nth-child(10n) {
    --particle-x: 51%;
    --particle-drift: 31vw;
    --particle-size: 2px;
    --particle-duration: 20.4s;
    --particle-pulse: 2.6s
}

.hero-particles i:nth-child(7n+1) {
    --particle-offset: -4%;
    --particle-jitter: 9vw;
    --particle-delay: -2.4s;
    --particle-pulse-delay: -.4s
}

.hero-particles i:nth-child(7n+2) {
    --particle-offset: 6%;
    --particle-jitter: -7vw;
    --particle-delay: -5s;
    --particle-pulse-delay: -1.1s
}

.hero-particles i:nth-child(7n+3) {
    --particle-offset: -9%;
    --particle-jitter: 13vw;
    --particle-delay: -7.6s;
    --particle-pulse-delay: -1.8s
}

.hero-particles i:nth-child(7n+4) {
    --particle-offset: 11%;
    --particle-jitter: -16vw;
    --particle-delay: -10.2s;
    --particle-pulse-delay: -2.5s
}

.hero-particles i:nth-child(7n+5) {
    --particle-offset: -13%;
    --particle-jitter: 20vw;
    --particle-delay: -12.8s;
    --particle-pulse-delay: -3.2s
}

.hero-particles i:nth-child(7n+6) {
    --particle-offset: 3%;
    --particle-jitter: -11vw;
    --particle-delay: -15.4s;
    --particle-pulse-delay: -.8s
}

.hero-particles i:nth-child(7n) {
    --particle-offset: 14%;
    --particle-jitter: 6vw;
    --particle-delay: -18s;
    --particle-pulse-delay: -2.2s
}

@keyframes heroParticleRise {
    from {
        transform: translate3d(0, 110vh, 0)
    }
    to {
        transform: translate3d(calc(var(--particle-drift, 0) + var(--particle-jitter, 0)), -135vh, 0)
    }
}

@keyframes heroParticlePulse {
    0%, 100% {
        transform: scale3d(.4, .4, 1);
        opacity: .72
    }
    50% {
        transform: scale3d(2.2, 2.2, 1);
        opacity: 1
    }
}

@media (prefers-reduced-motion: reduce) {
    .hero-particles i,
    .hero-particles i::before {
        animation: none
    }
}

.hero-cursor-trail i {
    position: absolute;
    left: 0;
    top: 0;
    display: block;
    width: clamp(320px, 38vw, 560px);
    aspect-ratio: 1;
    border-radius: 50%;
    opacity: 0;
    pointer-events: none;
}

.hero-cursor-trail i:nth-child(1) {
    background: radial-gradient(circle, rgba(4, 0, 250, .58) 0%, rgba(4, 0, 250, .26) 38%, transparent 72%);
}

.hero-cursor-trail i:nth-child(2) {
    width: clamp(280px, 32vw, 470px);
    background: radial-gradient(circle, rgba(255, 0, 184, .46) 0%, rgba(255, 0, 184, .20) 40%, transparent 72%);
}

.hero-cursor-trail i:nth-child(3) {
    width: clamp(220px, 25vw, 370px);
    background: radial-gradient(circle, rgba(58, 220, 255, .40) 0%, rgba(58, 220, 255, .16) 42%, transparent 72%);
}

.logo-slot {
    opacity: 0
}

/* --- герой --- */
.hero {
    position: absolute;
    left: var(--pad);
    top: 15vh;
    z-index: 2; /* выше свечения */
    pointer-events: none;
    max-width: min(70vw, 1240px);
    padding-right: 24px;
    font-family: 'Onest', system-ui, sans-serif;
}

.hdr, .hdr * {
    font-family: 'Onest', system-ui, sans-serif
}

.hero {
    font-family: var(--heading)
}

.hero h1 {
    margin: 0;
    font-kerning: normal;
    text-rendering: optimizeLegibility;
    transform: translateZ(0);
    font-family: var(--heading);
    font-weight: 500;
    text-transform: none;
    font-size: clamp(62px, 6.84vw, 102.61px);
    /* внутри маски строчный бокс полный, иначе overflow срезает буквы.
       расстояние между строками задаёт --lead */
    line-height: .83;
    --lead: .62em; /* строки прижаты сильнее: .78 -> .70 -> .62em */
    letter-spacing: -.02em;
    color: var(--ink);
}

.hero p {
    margin: 40px 0 0;
    max-width: 660px;
    font-size: clamp(20px, 1.75vw, 26px);
    line-height: 1.45;
    color: var(--ink);
}

.hero h1, .hero p {
    opacity: 0
}

/* --- первый экран: тёмная сцена с цветным свечением --- */
.hero-band {
    background: var(--hero-scene-background);
    overflow: hidden;
}

.hdr {
    color: #fff
}

.hero {
    left: 0;
    right: 0;
    top: 20vh;
    z-index: 5;
    max-width: none;
    padding: 0 var(--pad);
    text-align: left;
}

.hero h1 {
    color: rgba(255, 255, 255, .6);
    font-family: var(--font-nunito-light-wide);
    font-style: normal;
    font-weight: 300;
    font-stretch: 105%;
    font-size: clamp(96px, 9vw, 130px);
    line-height: .88;
    letter-spacing: -.035em;
    white-space: nowrap;
    text-align: left;
}

.hero p,
.hero p * {
    font-family: var(--font-nunito-medium);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
}

.hero p {
    margin: 32px 0 0;
    max-width: 28vw;
    color: rgba(255, 255, 255, .4);
    font-size: var(--hero-copy-size);
    line-height: 1.35;
    letter-spacing: -.01em;
    text-align: left;
}

.hero-download-zone {
    --hero-cta-height: clamp(92px, 7vw, 120px);
    display: flex;
    align-items: stretch;
    gap: clamp(12px, 1vw, 18px);
    width: max-content;
    height: var(--hero-cta-height);
    margin-top: clamp(34px, 3vw, 52px);
    pointer-events: auto;
}

.hero:not(.is-interactive) .hero-download-zone,
.hero:not(.is-interactive) .hero-download,
.hero:not(.is-interactive) .hero-scroll {
    pointer-events: none
}

.hero-download {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: min(440px, 31vw);
    height: 100%;
    border-radius: 999px;
    background: #0400FA;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .32),
    inset 0 0 28px rgba(125, 205, 255, .28),
    0 20px 62px rgba(4, 0, 250, .48),
    0 0 30px rgba(54, 73, 255, .24);
    color: #fff;
    font-family: var(--font-nunito-medium);
    font-size: var(--hero-copy-size);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    line-height: 1;
    text-decoration: none;
    pointer-events: auto;
    transform-origin: 50% 50%;
    transition: box-shadow .85s cubic-bezier(.22, .61, .36, 1), background .3s;
}

.hero-download__label {
    display: inline-flex;
    align-items: center;
    gap: .42em
}

.hero-download__label,
.hero-download__apple,
.scroll-cue-arrows {
    transition: text-shadow .5s ease, filter .5s ease
}

.hero-download__apple {
    display: block;
    width: auto;
    height: 1em;
    flex: 0 0 auto;
    filter: brightness(0) invert(1);
}

@keyframes blueButtonInnerPulse {
    0%, 100% {
        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .62),
        inset 0 0 46px rgba(154, 221, 255, .62),
        inset 0 0 82px rgba(86, 84, 255, .32),
        0 28px 78px rgba(4, 0, 250, .58),
        0 0 64px rgba(255, 0, 184, .36);
    }
    50% {
        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .82),
        inset 0 0 64px rgba(182, 235, 255, .92),
        inset 0 0 112px rgba(108, 91, 255, .56),
        0 28px 78px rgba(4, 0, 250, .58),
        0 0 64px rgba(255, 0, 184, .36);
    }
}

.hero-download:hover,
.hero-scroll:hover {
    animation: blueButtonInnerPulse 2.5s ease-in-out infinite;
}

.hero-download:hover,
.hero-scroll:hover {
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .56),
    inset 0 0 44px rgba(154, 221, 255, .48),
    0 28px 78px rgba(4, 0, 250, .60),
    0 0 64px rgba(255, 0, 184, .40),
    0 0 120px rgba(255, 0, 184, .24);
}

.hero-download:hover .hero-download__label {
    text-shadow: 0 0 8px rgba(255, 255, 255, .95), 0 0 20px rgba(128, 218, 255, .78);
}

.hero-download:hover .hero-download__apple {
    filter: brightness(0) invert(1) drop-shadow(0 0 7px rgba(255, 255, 255, .95)) drop-shadow(0 0 15px rgba(128, 218, 255, .7));
}

.hero-scroll:hover .scroll-cue-arrows {
    filter: drop-shadow(0 0 7px rgba(255, 255, 255, .95)) drop-shadow(0 0 16px rgba(128, 218, 255, .76));
}

.hero-download:focus-visible,
.hero-scroll:focus-visible {
    outline: 3px solid #fff;
    outline-offset: 5px
}

.scroll-cue {
    flex: 0 0 var(--hero-cta-height);
    width: var(--hero-cta-height);
    height: var(--hero-cta-height);
    margin: 0;
    padding: 0;
    display: grid;
    place-items: center;
    border: 0;
    border-radius: 50%;
    background: #0400FA;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .32),
    inset 0 0 28px rgba(125, 205, 255, .28),
    0 20px 62px rgba(4, 0, 250, .48),
    0 0 30px rgba(54, 73, 255, .24);
    color: #fff;
    cursor: pointer;
    pointer-events: auto;
    transition: box-shadow .85s cubic-bezier(.22, .61, .36, 1), background .3s;
}

.scroll-cue-arrows {
    width: 40px;
    height: 18px;
    overflow: visible;
}

.scroll-chevron {
    fill: none;
    stroke: currentColor;
    stroke-width: 4;
    stroke-linecap: round;
    stroke-linejoin: round;
    opacity: 0;
}

@media (min-width: 901px) and (max-height: 700px) {
    .hero-download-zone {
        --hero-cta-height: 72px;
        gap: 10px;
        margin-top: 24px
    }

    .hero-download {
        width: min(320px, 30vw);
        font-size: 24px
    }
}

@media (max-width: 900px) {
    .scene {
        height: 100svh;
        height: 100dvh
    }

    .hero {
        --hero-mobile-copy-size: clamp(17px, 4.6vw, 20px);
        left: 20px;
        right: 20px;
        top: clamp(94px, 13svh, 122px);
        max-width: none;
        padding: 0;
    }

    .hero h1 {
        white-space: normal;
        font-size: clamp(40px, 11.2vw, 64px);
        line-height: .94
    }

    .hero p {
        max-width: 620px;
        margin-top: 24px;
        font-size: var(--hero-mobile-copy-size);
        line-height: 1.38
    }

    .hero-download-zone {
        --hero-cta-height: 76px;
        width: 100%;
        gap: 10px;
        margin-top: 20px;
    }

    .hero-download {
        flex: 1 1 auto;
        width: auto;
        font-size: var(--hero-mobile-copy-size)
    }

    .scroll-cue-arrows {
        width: 20px;
        height: 9.5px
    }

    #heroParticles > i:nth-child(n+25),
    .go-particles > i:nth-child(n+25) {
        display: none
    }

    .hero-band {
        height: calc(100svh + 120px);
        height: calc(100dvh + 120px)
    }
}

/* Планшеты и невысокие окна ноутбуков: учитываем доступную высоту браузера.
   Компактная типографика оставляет место кнопкам и сохраняет строки заголовка. */
@media (min-width: 761px) and (max-width: 1366px), (min-width: 1367px) and (max-height: 900px) {
    .hero {
        left: 0;
        right: 0;
        top: clamp(116px, 15svh, 180px);
        padding: 0 var(--pad);
    }

    .hero h1 {
        font-size: clamp(56px, min(7.2vw, 10svh), 96px);
    }

    .hero p {
        max-width: min(44vw, 560px);
        margin-top: clamp(18px, 3svh, 28px);
        font-size: clamp(18px, 1.8vw, 22px);
    }

    .hero-download-zone {
        --hero-cta-height: clamp(60px, 9svh, 80px);
        width: min(100%, 480px);
        gap: 12px;
        margin-top: clamp(18px, 3svh, 28px);
    }

    .hero-download {
        flex: 1 1 auto;
        width: auto;
        font-size: clamp(18px, 1.8vw, 22px);
    }
}

@media (prefers-reduced-motion: reduce) {
    .hero-download, .hero-scroll {
        transition: none
    }
}

/* маска включена: буквы поднимаются из-за нижнего края строки.
     padding с отрицательным margin оставляет место выносным, край клипа ниже базовой линии */
.m-line {
    display: block;
    overflow: hidden;
    padding: .42em .16em .34em 0;
    margin: -.42em -.16em -.34em 0
}

.m-line + .m-line {
    margin-top: calc(-.42em - (1em - var(--lead, 1em)))
}

.m-line > span {
    display: inline-block;
    white-space: pre
}

.m-word {
    display: inline-block;
    white-space: nowrap
}

.m-word > span {
    display: inline-block
}

/* --- прелоадер: синий Lu появляется на чёрном и уезжает в шапку --- */
.pre {
    position: fixed;
    inset: 0;
    z-index: 50;
    background: #000;
    pointer-events: none;
    overflow: hidden;
}

.pre-gradient {
    position: absolute;
    inset: auto -12vw -32vh;
    height: 82vh;
    background: radial-gradient(ellipse at 50% 100%, rgba(4, 0, 250, .92) 0%, rgba(4, 0, 250, .46) 33%, rgba(4, 0, 250, 0) 72%);
    opacity: 0;
    transform: scaleY(.72);
    transform-origin: 50% 100%;
    pointer-events: none;
}

.pre-logo {
    position: absolute;
    z-index: 3;
    left: 50%;
    top: 50%;
    width: min(22vw, 402px);
    aspect-ratio: 189/81;
    color: #0400FA;
}

body.is-loading {
    overflow: hidden
}

/* --- облако тегов: расходится, освобождая центр под промт --- */
.tags {
    --tag-accent: var(--brand-green);
    --tag-blue: var(--brand-blue);
    position: absolute;
    inset: 0;
    z-index: 6;
    pointer-events: none;
}

.tag-pos {
    --tag-pad-y: 10.53px;
    --tag-pad-x: 19.89px;
    --tag-font-size: clamp(14.04px, 1.1349vw, 18.72px);
    position: absolute;
    transform: translate(-50%, -50%);
}

.tag-pos:nth-child(1) {
    left: 11.7%;
    top: 95%
}

.tag-pos:nth-child(2) {
    left: 87.9%;
    top: 28%
}

.tag-pos:nth-child(3) {
    left: 92%;
    top: 16.5%
}

.tag-pos:nth-child(4) {
    left: 49.1%;
    top: 60.4%
}

.tag-pos:nth-child(5) {
    left: 50.8%;
    top: 82.9%
}

.tag-pos:nth-child(6) {
    left: 62.8%;
    top: 49.4%
}

.tag-pos:nth-child(7) {
    left: 75.1%;
    top: 84.1%
}

.tag-pos:nth-child(8) {
    left: 24.3%;
    top: 16.6%
}

.tag-pos:nth-child(9) {
    left: 86.9%;
    top: 71.5%
}

.tag-pos:nth-child(10) {
    left: 36.4%;
    top: 94.3%
}

.tag-pos:nth-child(11) {
    left: 50.6%;
    top: 38.7%
}

.tag-pos:nth-child(12) {
    left: 12.4%;
    top: 50.4%
}

.tag-pos:nth-child(13) {
    left: 63.2%;
    top: 27.9%
}

.tag-pos:nth-child(14) {
    left: 86.7%;
    top: 49.7%
}

.tag-pos:nth-child(15) {
    left: 92%;
    top: 61.7%
}

.tag-pos:nth-child(16) {
    left: 87.9%;
    top: 95%
}

.tag-pos:nth-child(17) {
    left: 12.1%;
    top: 72%
}

.tag-pos:nth-child(18) {
    left: 25.8%;
    top: 60.6%
}

.tag-pos:nth-child(19) {
    left: 37.2%;
    top: 27%
}

.tag-pos:nth-child(20) {
    left: 92%;
    top: 84.1%
}

.tag-pos:nth-child(21) {
    left: 63.2%;
    top: 72.3%
}

.tag-pos:nth-child(22) {
    left: 37.7%;
    top: 49.9%
}

.tag-pos:nth-child(23) {
    left: 75.2%;
    top: 39.2%
}

.tag-pos:nth-child(24) {
    left: 12.5%;
    top: 28.2%
}

.tag-pos:nth-child(25) {
    left: 62.7%;
    top: 5.4%
}

.tag-pos:nth-child(26) {
    left: 38.4%;
    top: 5%
}

.tag-pos:nth-child(27) {
    left: 73.9%;
    top: 15.9%
}

.tag-pos:nth-child(28) {
    left: 92%;
    top: 38.1%
}

.tag-pos:nth-child(29) {
    left: 26.1%;
    top: 38.6%
}

.tag-pos:nth-child(30) {
    left: 37%;
    top: 71.9%
}

.tag-pos:nth-child(31) {
    left: 13.5%;
    top: 6.4%
}

.tag-pos:nth-child(32) {
    left: 73.9%;
    top: 60.7%
}

.tag-pos:nth-child(33) {
    left: 49.3%;
    top: 16.6%
}

.tag-pos:nth-child(34) {
    left: 25.7%;
    top: 83.7%
}

.tag-pos:nth-child(35) {
    left: 61.4%;
    top: 95%
}

.tag-pos:nth-child(36) {
    left: 87.6%;
    top: 5%
}

.tag-pos:nth-child(37) {
    left: 4.8%;
    top: 15%
}

.tag-pos:nth-child(38) {
    left: 5.5%;
    top: 34%
}

.tag-pos:nth-child(39) {
    left: 4%;
    top: 53%
}

.tag-pos:nth-child(40) {
    left: 6%;
    top: 74%
}

.tag-pos:nth-child(41) {
    left: 4.5%;
    top: 89%
}

.tag-pos:nth-child(42) {
    left: 95.2%;
    top: 13%
}

.tag-pos:nth-child(43) {
    left: 94.5%;
    top: 33%
}

.tag-pos:nth-child(44) {
    left: 96%;
    top: 52%
}

.tag-pos:nth-child(45) {
    left: 94%;
    top: 73%
}

.tag-pos:nth-child(46) {
    left: 95.5%;
    top: 89%
}

.tag-pos:nth-child(47) {
    left: 25%;
    top: 5%
}

.tag-pos:nth-child(48) {
    left: 77%;
    top: 5%
}

.tag-pos:nth-child(49) {
    left: 23%;
    top: 27%
}

.tag-pos:nth-child(50) {
    left: 9%;
    top: 63%
}

.tag-pos:nth-child(51) {
    left: 76%;
    top: 94%
}

.tag-pos--micro {
    --tag-pad-y: 8.19px;
    --tag-pad-x: 15.21px;
    --tag-font-size: clamp(12.87px, .9126vw, 16.38px);
}

.tag-pos:nth-child(7),
.tag-pos:nth-child(8),
.tag-pos:nth-child(18),
.tag-pos:nth-child(23),
.tag-pos:nth-child(27),
.tag-pos:nth-child(29),
.tag-pos:nth-child(32),
.tag-pos:nth-child(34),
.tag-pos:nth-child(47),
.tag-pos:nth-child(48),
.tag-pos:nth-child(49),
.tag-pos:nth-child(50),
.tag-pos:nth-child(51) {
    --tag-pad-y: 15.21px;
    --tag-pad-x: 26.91px;
    --tag-font-size: clamp(17.55px, 1.6146vw, 25.74px);
}

.tag-pos:nth-child(6),
.tag-pos:nth-child(10),
.tag-pos:nth-child(13),
.tag-pos:nth-child(19),
.tag-pos:nth-child(21),
.tag-pos:nth-child(22),
.tag-pos:nth-child(25),
.tag-pos:nth-child(26),
.tag-pos:nth-child(30),
.tag-pos:nth-child(35) {
    --tag-pad-y: 21.06px;
    --tag-pad-x: 35.1px;
    --tag-font-size: clamp(22.23px, 2.1645vw, 35.1px);
}

.tag-pos:nth-child(4),
.tag-pos:nth-child(5),
.tag-pos:nth-child(11),
.tag-pos:nth-child(33) {
    --tag-pad-y: 29px;
    --tag-pad-x: 48px;
    --tag-font-size: clamp(29px, 3vw, 48px);
}

.tag {
    display: inline-block;
    white-space: nowrap;
    padding: var(--tag-pad-y) var(--tag-pad-x);
    border-radius: 1000px;
    background: #fff;
    color: var(--tag-accent);
    box-shadow: inset 0 0 0 2px var(--tag-accent);
    font-family: var(--font-nunito-medium);
    font-style: normal;
    font-size: var(--tag-font-size);
    font-weight: 500;
    font-stretch: 100%;
    font-synthesis: none;
    letter-spacing: -.01em;
    opacity: 0;
}

.tag-pos:nth-child(2) .tag,
.tag-pos:nth-child(5) .tag,
.tag-pos:nth-child(8) .tag,
.tag-pos:nth-child(12) .tag,
.tag-pos:nth-child(15) .tag,
.tag-pos:nth-child(18) .tag,
.tag-pos:nth-child(22) .tag,
.tag-pos:nth-child(25) .tag,
.tag-pos:nth-child(29) .tag,
.tag-pos:nth-child(32) .tag,
.tag-pos:nth-child(34) .tag,
.tag-pos:nth-child(36) .tag {
    background: var(--tag-accent);
    color: #fff;
    box-shadow: none;
}

.tag-pos .tag.tag--blue {
    background: var(--tag-blue);
    color: #fff;
    box-shadow: none;
}

.tag-pos .tag.tag--green {
    background: var(--tag-accent);
    color: #fff;
    box-shadow: none;
}

.tag-pos .tag.tag--gradient {
    background: linear-gradient(135deg, var(--tag-accent), var(--tag-blue));
    color: #fff;
    box-shadow: none;
}

.tag-pos .tag.tag--blue-outline {
    background: #fff;
    color: var(--tag-blue);
    box-shadow: inset 0 0 0 2px var(--tag-blue);
}

@media (max-width: 900px) {
    /* На узком экране оставляем разреженное облако. Размер зависит только
       от вертикального пояса: максимум в центре, минимум у краёв. */
    .tag-pos {
        visibility: hidden
    }

    .tag-pos:is(
      :nth-child(4),
      :nth-child(6),
      :nth-child(7),
      :nth-child(9),
      :nth-child(10),
      :nth-child(11),
      :nth-child(13),
      :nth-child(15),
      :nth-child(17),
      :nth-child(18),
      :nth-child(21),
      :nth-child(22),
      :nth-child(24),
      :nth-child(27),
      :nth-child(30),
      :nth-child(32),
      :nth-child(34),
      :nth-child(35),
      :nth-child(37),
      :nth-child(38),
      :nth-child(39),
      :nth-child(40),
      :nth-child(41),
      :nth-child(42),
      :nth-child(43),
      :nth-child(44),
      :nth-child(46),
      :nth-child(47),
      :nth-child(48),
      :nth-child(51)
    ) {
        visibility: visible
    }

    .tag-pos:is(:nth-child(37),:nth-child(47),:nth-child(48),:nth-child(39),:nth-child(40),:nth-child(41),:nth-child(46)) {
        --tag-pad-y: 7px;
        --tag-pad-x: 13px;
        --tag-font-size: 17px;
    }

    .tag-pos:is(:nth-child(27),:nth-child(42),:nth-child(43),:nth-child(10),:nth-child(35),:nth-child(51)) {
        --tag-pad-y: 9px;
        --tag-pad-x: 14px;
        --tag-font-size: 18px;
    }

    .tag-pos:is(:nth-child(9),:nth-child(38),:nth-child(44),:nth-child(7),:nth-child(17),:nth-child(34)) {
        --tag-pad-y: 10px;
        --tag-pad-x: 16px;
        --tag-font-size: 19px;
    }

    .tag-pos:is(:nth-child(4),:nth-child(15),:nth-child(18),:nth-child(24),:nth-child(30),:nth-child(32)) {
        --tag-pad-y: 12px;
        --tag-pad-x: 18px;
        --tag-font-size: 22px;
    }

    .tag-pos:is(:nth-child(6),:nth-child(11),:nth-child(13),:nth-child(21)) {
        --tag-pad-y: 12px;
        --tag-pad-x: 19px;
        --tag-font-size: 22px;
    }

    .tag-pos:nth-child(22) {
        --tag-pad-y: 16px;
        --tag-pad-x: 37px;
        --tag-font-size: 28px;
    }

    .tag-pos:nth-child(37) {
        left: 7%;
        top: 7%
    }

    .tag-pos:nth-child(47) {
        left: 50%;
        top: 7%
    }

    .tag-pos:nth-child(48) {
        left: 93%;
        top: 7%
    }

    .tag-pos:nth-child(42) {
        left: 10%;
        top: 14%
    }

    .tag-pos:nth-child(27) {
        left: 50%;
        top: 14%
    }

    .tag-pos:nth-child(43) {
        left: 90%;
        top: 14%
    }

    .tag-pos:nth-child(38) {
        left: 0;
        top: 22%
    }

    .tag-pos:nth-child(9) {
        left: 50%;
        top: 22%
    }

    .tag-pos:nth-child(44) {
        left: 100%;
        top: 22%
    }

    .tag-pos:nth-child(24) {
        left: -6%;
        top: 30%
    }

    .tag-pos:nth-child(4) {
        left: 50%;
        top: 30%
    }

    .tag-pos:nth-child(15) {
        left: 106%;
        top: 30%
    }

    .tag-pos:nth-child(11) {
        left: 10%;
        top: 40%
    }

    .tag-pos:nth-child(13) {
        left: 90%;
        top: 40%
    }

    .tag-pos:nth-child(22) {
        left: 43%;
        top: 50%
    }

    .tag-pos:nth-child(6) {
        left: 10%;
        top: 60%
    }

    .tag-pos:nth-child(21) {
        left: 90%;
        top: 60%
    }

    .tag-pos:nth-child(18) {
        left: -10%;
        top: 70%
    }

    .tag-pos:nth-child(30) {
        left: 50%;
        top: 70%
    }

    .tag-pos:nth-child(32) {
        left: 110%;
        top: 70%
    }

    .tag-pos:nth-child(34) {
        left: -2%;
        top: 78%
    }

    .tag-pos:nth-child(17) {
        left: 50%;
        top: 78%
    }

    .tag-pos:nth-child(7) {
        left: 102%;
        top: 78%
    }

    .tag-pos:nth-child(10) {
        left: 2%;
        top: 86%
    }

    .tag-pos:nth-child(35) {
        left: 50%;
        top: 86%
    }

    .tag-pos:nth-child(51) {
        left: 98%;
        top: 86%
    }

    .tag-pos:nth-child(39) {
        left: -1%;
        top: 93%
    }

    .tag-pos:nth-child(40) {
        left: 31%;
        top: 93%
    }

    .tag-pos:nth-child(41) {
        left: 67%;
        top: 93%
    }

    .tag-pos:nth-child(46) {
        left: 103%;
        top: 93%
    }
}

/* --- промт пользователя на пустом экране --- */
.prompt {
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    z-index: 7;
    display: flex;
    align-items: center;
    justify-content: center; /* центр держит раскладка, а не отрицательный margin */
    text-align: center;
    font-family: var(--font-nunito-medium);
    /* кегль от ширины окна: строка не должна разбиваться на две */
    font-size: min(4.1vw, 58px);
    line-height: 1.04;
    letter-spacing: -.03em;
    font-weight: 500;
    color: var(--ink);
    opacity: 0;
    pointer-events: none;
}

.prompt-q {
    position: relative;
    display: inline-block;
    padding: .46em .92em;
    border-radius: 1000px;
    background: transparent;
    color: #fff;
    white-space: nowrap;
    transform-origin: 50% 50%;
}

.prompt-q::before {
    content: '';
    position: absolute;
    z-index: 0;
    inset: 0 var(--pill-inset, 0px);
    border-radius: 1000px;
    background: var(--prompt-bg, var(--brand-blue));
    pointer-events: none;
}

.prompt-text {
    position: relative;
    z-index: 1;
    display: inline-block;
}

.prompt-line {
    display: contents
}

.prompt-char {
    white-space: pre
}

@media (max-width: 900px) {
    .prompt {
        top: 44%;
        font-size: min(6.396vw, 90.48px);
        line-height: .65;
    }

    .prompt-q {
        padding: 1.025em .92em
    }

    .prompt-line {
        display: block
    }

    .prompt-char--separator {
        font-size: 0;
        line-height: 0
    }
}

/* --- влёт превью в телефон: поток фотографий сходится к корпусу --- */
.influx {
    position: absolute;
    inset: 0;
    z-index: 5;
    pointer-events: none;
    overflow: hidden
}

.influx i {
    position: absolute;
    left: 50%;
    top: 50%;
    width: clamp(132px, 20vmin, 340px);
    aspect-ratio: 1/1;
    border-radius: 14%;
    background-color: transparent;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    opacity: 0;
    transform-origin: center;
    contain: layout paint style;
    backface-visibility: hidden;
}

.influx i.is-photo {
    background-size: cover;
    background-color: #E4E8EC
}

.influx i.is-object {
    border-radius: 0
}

/* Canvas покрывает viewport и запас снизу, пока sticky-сцена отпускается.
     Сами звёзды рисуются из прежнего центра и сохраняют размер 150vmax. */
.final-stars {
    position: absolute;
    left: 0;
    top: 0;
    z-index: 5;
    width: 100%;
    height: max(150vh, calc(115vh + 350px));
    overflow: hidden;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    contain: strict;
}

.final-stars__canvas {
    display: block;
    width: 100%;
    height: 100%;
}

@media (max-width: 900px) {
    .final-stars {
        height: 100vh;
        height: 100dvh
    }
}

/* Фиксированная синяя подложка фазы зарядки: над тёмной вуалью, под контентом. */
.charge-bg {
    position: absolute;
    inset: 0;
    z-index: 1;
    background: var(--hero-scene-background);
    opacity: 0;
    pointer-events: none;
}

/* --- загрузка внутри экрана --- */
.loader {
    position: absolute;
    inset: calc(var(--h) * 0.0129);
    /* тот же радиус, что у экрана: без него белые углы вылезали на рамку */
    border-radius: calc(var(--r) - var(--h) * 0.0129);
    overflow: hidden;
    z-index: 5;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background: transparent;
    opacity: 0;
    pointer-events: none;
}

.loader-t {
    position: relative;
    display: grid;
    place-items: center;
    width: 82%;
    min-height: 2.2em;
    font-family: var(--font-nunito-medium);
    font-size: clamp(22px, calc(var(--h) * .036), 34px);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-synthesis: none;
    line-height: 1.08;
    letter-spacing: -.02em;
    color: #fff;
}

.loader-t > span {
    grid-area: 1 / 1;
    display: block;
    width: 100%;
    text-align: center;
    text-wrap: balance;
    white-space: normal;
    opacity: 0;
}

.loader-t .m-word {
    overflow: hidden;
    vertical-align: bottom;
    padding: .18em .04em .18em 0;
    margin: -.18em -.04em -.18em 0;
}

/* надписи по сторонам корпуса, чередуются лево-право */
.caption {
    position: absolute;
    top: 50%;
    width: min(42vw, 760px);
    font-family: 'Onest', system-ui, sans-serif;
    font-size: clamp(76px, 7.5vw, 126px);
    line-height: .84;
    letter-spacing: -.055em;
    font-weight: 700;
    text-transform: none;
    color: var(--ink);
    opacity: 0;
    pointer-events: none;
    z-index: 4; /* под корпусом: телефон идёт поверх надписи */
}

/* маска слова: как у .m-line в герое. padding оставляет место выносным,
     отрицательный margin возвращает вёрстку, край клипа ниже базовой линии */
.caption .cw {
    display: inline-block;
    overflow: hidden;
    vertical-align: bottom;
    padding: .30em .12em .26em .05em;
    margin: -.30em -.12em -.26em -.05em;
}

.caption .cw > i {
    display: inline-block;
    font-style: normal;
}

.caption-heading {
    display: block;
    font-family: var(--heading);
    font-weight: 500;
}

#cap0 {
    font-family: var(--font-nunito-light-wide);
    font-style: normal;
    font-weight: 300;
    font-stretch: 105%;
    font-synthesis: none;
    line-height: .88;
}

.caption.left {
    right: calc(50% + 190px);
    text-align: right
}

.caption.right {
    left: calc(50% + 190px);
    text-align: left
}

/* «Чем заняться»: блок правее и ниже центра, как на фото */
#cap1 {
    top: 50%;
    transform: translateY(-50%); /* блок центрируется: чипсы больше не уезжают за кадр */
    left: calc(50% + 12px);
    width: min(43vw, 740px);
    font-size: clamp(70px, 6.25vw, 108px);
    line-height: .82;
}

#cap1 em {
    margin-top: 28px;
    max-width: 25em
}

#cap1 .cchips {
    margin-top: 26px
}

/* «Помощник»: оставляем короткое пояснение, основной сюжет идёт сообщениями. */
#cap2 {
    top: 24vh;
    transform: none;
    left: clamp(72px, 8vw, 150px);
    right: auto;
    text-align: left;
    width: min(38vw, 540px);
    font-size: inherit;
}

#cap2 .caption-heading {
    display: flex;
    flex-wrap: wrap;
    column-gap: .25em;
    color: rgba(255, 255, 255, .5);
    font-family: var(--font-nunito-light-wide);
    font-style: normal;
    font-weight: 300;
    font-stretch: 105%;
    font-synthesis: none;
    font-size: min(7.2vw, 104px);
    line-height: .80;
    letter-spacing: 0;
}

#cap2 .caption-heading > span {
    display: inline-block;
    /* Маска сохраняет ширину всей строки, включая неразрывные группы RU/EN. */
    flex-shrink: 0;
    overflow: hidden;
    vertical-align: bottom;
    padding: .30em .12em .26em .05em;
    margin: -.30em -.12em -.26em -.05em;
}

#cap2 .caption-heading > span > i {
    display: inline-block;
    font-style: normal;
    white-space: pre;
}

#cap2 .caption-nowrap {
    white-space: nowrap
}

#cap2 em {
    margin: 30px 0 0;
    max-width: min(30vw, 510px);
    color: rgba(255, 255, 255, .5);
    font-family: var(--font-nunito-medium);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-synthesis: none;
    font-size: var(--hero-copy-size);
    line-height: 1.35;
    letter-spacing: -.01em;
}

body.is-dark #cap2 .caption-heading,
body.is-dark #cap2 em {
    color: rgba(255, 255, 255, .5)
}

@media (max-width: 900px) {
    #cap2 {
        left: 24px;
        right: 24px;
        top: 15vh;
        bottom: auto !important;
        width: auto
    }

    #cap2 .caption-heading {
        font-size: var(--mobile-section-title-size);
        line-height: .94
    }
    #cap2 em {
        margin-top: 12px;
        font-size: var(--hero-copy-size);
        max-width: 25em
    }
}

/* «куда сходить»: заголовок и абзац собраны в одну колонку. */
.cap0-copy {
    --cap0-detail-width: min(28vw, 520px);
    display: contents;
}

#cap0 {
    text-align: left;
    font-size: clamp(76.8px, 7.2vw, 104px);
    line-height: .80;
    --lead: .66em;
}

@media (min-width: 901px) {
    .cap0-copy {
        position: absolute;
        left: 55vw;
        top: 50%;
        z-index: 4;
        display: block;
        width: min(40vw, 720px);
        transform: translateY(-50%);
        pointer-events: none;
    }

    #cap0 {
        position: relative;
        left: auto;
        right: auto;
        top: auto;
        width: max-content;
        max-width: none
    }

    #side0 {
        position: relative;
        left: auto;
        top: auto;
        width: var(--cap0-detail-width);
        margin-top: 30px
    }
}

#side0 p {
    margin: 0;
    font-family: var(--font-nunito-medium);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-synthesis: none;
    font-size: var(--hero-copy-size);
    line-height: 1.35;
    letter-spacing: -.01em;
}

/* чипсы внутри заголовков */
.cchips {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 26px
}

.cchip {
    display: inline-block;
    padding: 14px 21px;
    border-radius: 1000px;
    background: #F1F3F5;
    color: var(--ink);
    font-family: 'Geologica', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
    font-size: clamp(16px, 1.28vw, 21px);
    font-weight: 600;
    letter-spacing: -.01em;
    line-height: 1.2;
    text-transform: none;
    white-space: nowrap;
}

.cchip.acc {
    background: linear-gradient(135deg, #D1FFEB, #D1FFFA)
}

@media (max-aspect-ratio: 4/3) and (min-width: 1181px) {
    #cap1 {
        left: calc(50% + 205px);
        width: min(32vw, 570px);
        font-size: clamp(76px, 5.7vw, 94px)
    }
}

/* боковой блок: пояснение справа от корпуса */
.sidebox {
    position: absolute;
    top: 50%;
    left: calc(50% + 300px);
    width: min(30vw, 420px);
    z-index: 4;
    opacity: 0;
    pointer-events: none;
    font-family: 'Geologica', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
}

.sidebox b {
    display: block;
    font-size: clamp(19px, 1.7vw, 26px);
    font-weight: 600;
    letter-spacing: -.02em;
    color: var(--ink);
}

.sidebox p {
    margin: 18px 0 0;
    font-size: clamp(18px, 1.45vw, 22px);
    line-height: 1.42;
    letter-spacing: -.02em;
    font-weight: 500;
    color: #26333D;
}

body.is-dark .sidebox b {
    color: #fff
}

body.is-dark .sidebox p {
    color: #9AA4AC
}

@media (max-width: 900px) {
    .sidebox {
        display: none
    }
}

/* подпись под заголовком раздела */
.caption em {
    display: block;
    margin-top: 28px;
    max-width: 28em;
    font-family: 'Onest', system-ui, sans-serif;
    font-style: normal;
    font-size: clamp(18px, 1.45vw, 22px);
    font-weight: 500;
    line-height: 1.42;
    letter-spacing: -.02em;
    text-transform: none;
    color: #26333D;
}

.caption.right em {
    margin-left: 0
}

@media (max-width: 900px) {
    .caption, .caption.left, .caption.right {
        width: auto;
        left: 0;
        right: 0;
        top: auto;
        bottom: 7vh;
        text-align: center;
        font-size: 34px;
    }

    #cap1 {
        font-size: var(--mobile-section-title-size)
    }

    .cap0-copy {
        position: absolute;
        z-index: 4;
        display: block;
        left: 20px;
        right: 20px;
        top: clamp(96px, 12svh, 122px);
        pointer-events: none;
    }

    #cap0 {
        position: relative;
        left: auto;
        right: auto;
        top: auto;
        bottom: auto;
        width: 100%;
        max-width: none;
        font-size: var(--mobile-section-title-size);
        line-height: 1.02;
        text-align: left;
    }

    #cap0 .m-line {
        display: inline;
        overflow: visible;
        padding: 0;
        margin: 0;
    }

    #cap0 .m-line + .m-line {
        margin-top: 0
    }

    #cap0 .m-line + .m-line::before {
        content: ' '
    }

    #side0 {
        position: relative;
        display: block;
        left: auto;
        top: auto;
        width: 100%;
        margin-top: 12px;
    }

    #side0 p {
        max-width: 620px;
        font-size: clamp(17px, 4.6vw, 20px);
        line-height: 1.38;
    }
}

/* После зарядки pinned-сцена заканчивается: удалён прежний финальный отрезок
     с волной, плашками и разлётом объектов. */
.spacer {
    height: 1828vh
}

html[data-performance-mode='lite'] .spacer {
    height: 1600vh;
}

/* сцена и спейсер в одной обёртке: sticky заканчивается на её границе,
     дальше страница идёт обычным потоком */
.stage {
    position: relative
}

/* Погода продолжает pinned-сцену «Куда сходить». Фон находится в том же
     stacking context, поэтому один живой телефон проходит поверх него без дубля. */
.weather-story {
    position: absolute;
    inset: 0;
    z-index: 4;
    overflow: hidden;
    color: #14202A;
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
    isolation: isolate;
    contain: layout paint;
}

.weather-layer {
    position: absolute;
    inset: -1px;
    pointer-events: none
}

.weather-picture {
    z-index: 1;
    display: block;
    margin: 0;
    overflow: hidden
}

.weather-picture--dark {
    z-index: 2;
    opacity: 0
}

.weather-picture--freezing {
    z-index: 3;
    opacity: 0
}

.weather-picture img {
    width: 100%;
    height: 100%;
    display: block;
    object-fit: cover;
    object-position: center;
    transform: scale(1.015);
}

.weather-sun {
    --sun-size: clamp(1332px, 162vmin, 2160px);
    --sun-warm: 255 232 164;
    --sun-pale: 255 250 224;
    position: absolute;
    z-index: 4;
    left: 88%;
    top: 7%;
    width: var(--sun-size);
    aspect-ratio: 1;
    pointer-events: none;
    transform: translate(-50%, -50%);
}

.weather-sun__visual {
    position: absolute;
    inset: 0;
    transform: translate3d(0, 0, 0);
    backface-visibility: hidden;
}

.weather-sun__visual::before {
    content: "";
    position: absolute;
    inset: -68%;
    border-radius: 50%;
    background: radial-gradient(circle,
    transparent 0 24%,
    rgb(255 255 255 / .11) 31%,
    rgb(var(--sun-warm) / .18) 40%,
    rgb(var(--sun-pale) / .12) 49%,
    rgb(255 255 255 / .08) 57%,
    transparent 68%);
}

.weather-sun__disc {
    position: absolute;
    z-index: 3;
    inset: 43%;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 18px 10px rgb(255 255 255),
    0 0 54px 26px rgb(var(--sun-warm) / .96),
    0 0 138px 62px rgb(var(--sun-warm) / .68),
    0 0 320px 150px rgb(255 225 135 / .38),
    0 0 560px 260px rgb(255 248 215 / .20);
}

.weather-sun__visual::after,
.weather-sun__disc::after {
    content: "";
    position: absolute;
    left: 50%;
    top: 50%;
    pointer-events: none;
}

.weather-sun__visual::after {
    z-index: 1;
    width: 100.8%;
    aspect-ratio: 1;
    transform: translate(-50%, -50%) rotate(10deg);
    background: conic-gradient(from 0deg,
    transparent 0 7deg, rgb(255 248 216 / .62) 9deg, transparent 12deg 42deg,
    rgb(255 248 216 / .22) 44deg, transparent 47deg 82deg,
    rgb(255 248 216 / .52) 85deg, transparent 89deg 127deg,
    rgb(255 248 216 / .20) 130deg, transparent 133deg 172deg,
    rgb(255 248 216 / .62) 175deg, transparent 179deg 217deg,
    rgb(255 248 216 / .22) 220deg, transparent 223deg 262deg,
    rgb(255 248 216 / .52) 265deg, transparent 269deg 307deg,
    rgb(255 248 216 / .20) 310deg, transparent 313deg 352deg,
    rgb(255 248 216 / .62) 355deg, transparent 360deg);
    clip-path: polygon(48.5% 0, 51.5% 0, 53% 42%, 100% 48.5%, 100% 51.5%, 53% 58%, 51.5% 100%, 48.5% 100%, 47% 58%, 0 51.5%, 0 48.5%, 47% 42%);
    opacity: .74;
}

.weather-sun__disc::after {
    z-index: -2;
    width: 1320%;
    aspect-ratio: 1;
    transform: translate(-50%, -50%);
    border-radius: 50%;
    background: radial-gradient(circle,
    rgb(255 255 255 / .52) 0 2%,
    rgb(var(--sun-warm) / .24) 8%,
    rgb(255 223 152 / .08) 24%,
    transparent 58%);
}

.weather-sun__flare {
    position: absolute;
    z-index: 2;
    border-radius: 50%;
    opacity: .9;
    transform-origin: 50% 50%;
}

.weather-sun__flare--wide {
    width: 38%;
    aspect-ratio: 1;
    left: 16%;
    top: 66%;
    border: 2px solid rgb(255 255 255 / .54);
    background: radial-gradient(circle,
    transparent 48%,
    rgb(255 255 255 / .22) 58%,
    rgb(var(--sun-warm) / .30) 67%,
    transparent 74%);
    box-shadow: 0 0 42px rgb(255 255 255 / .26),
    0 0 92px rgb(var(--sun-warm) / .22),
    -74px 78px 0 -18px rgb(255 246 213 / .42);
}

.weather-sun__flare--small {
    width: 10%;
    aspect-ratio: 1;
    left: 21%;
    top: 90%;
    background: rgb(255 255 255 / .88);
    box-shadow: 0 0 38px rgb(255 255 255 / .54),
    -96px 94px 0 8px rgb(255 250 226 / .22),
    46px -42px 0 -3px rgb(var(--sun-warm) / .44),
    46px -42px 34px 8px rgb(var(--sun-warm) / .28),
    82px -76px 0 15px rgb(255 255 255 / .10);
}

.weather-precipitation {
    position: absolute;
    inset: -12% -8%;
    z-index: 4;
    overflow: hidden;
    opacity: 0;
    pointer-events: none;
    transition: opacity .18s ease;
}

.weather-precipitation i {
    position: absolute;
    display: block;
    left: var(--x);
    top: var(--y);
    animation-play-state: paused;
}

.weather-rain i {
    width: 1px;
    height: calc(var(--length) * 1.35);
    background: linear-gradient(180deg, transparent, rgb(220 239 255 / .74));
    animation: weather-rain-fall var(--d) linear var(--delay) infinite;
    animation-play-state: paused;
}

.weather-snow i {
    width: calc(var(--size) * 2);
    height: calc(var(--size) * 2);
    border-radius: 50%;
    background: #fff;
    box-shadow: none;
    animation: weather-snow-fall var(--d) linear var(--delay) infinite;
    animation-play-state: paused;
}

body.weather-storm .weather-rain {
    opacity: .62
}

body.weather-storm .weather-rain i,
body.weather-freezing .weather-snow i {
    animation-play-state: running
}

body.weather-freezing .weather-snow {
    opacity: .96
}

@keyframes weather-rain-fall {
    from {
        transform: translate3d(7vw, -125vh, 0) rotate(8deg)
    }
    to {
        transform: translate3d(-7vw, 125vh, 0) rotate(8deg)
    }
}

@keyframes weather-snow-fall {
    0% {
        transform: translate3d(calc(0px - var(--drift)), -80vh, 0) rotate(0deg)
    }
    50% {
        transform: translate3d(var(--drift), 0, 0) rotate(180deg)
    }
    100% {
        transform: translate3d(calc(0px - var(--drift)), 100vh, 0) rotate(360deg)
    }
}

.weather-noise {
    z-index: 3;
    opacity: .25;
    background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.92' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.62'/%3E%3C/svg%3E");
    background-size: 180px 180px;
}

.weather-composition {
    position: absolute;
    inset: 0;
    z-index: 5
}

.weather-temp {
    position: absolute;
    left: clamp(44px, 9.5vw, 190px);
    top: 48%;
    width: min(38vw, 760px);
    height: clamp(280px, 40vmin, 500px);
    color: #fff;
    font: 300 clamp(230px, 36vmin, 470px)/.78 var(--font-nunito-light-wide);
    font-stretch: 105%;
    font-synthesis: none;
    font-kerning: none;
    letter-spacing: 0;
    white-space: nowrap;
    overflow: hidden;
    perspective: 900px;
    perspective-origin: 50% 50%;
    translate: 0 -50%;
    scale: var(--weather-temp-scale, 1);
    text-shadow: 0 10px 45px rgba(54, 136, 183, .12);
    -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 13%, #000 87%, transparent 100%);
    mask-image: linear-gradient(180deg, transparent 0, #000 13%, #000 87%, transparent 100%);
}

.weather-temp-reel {
    width: 100%;
    height: calc(var(--weather-count) * 100%);
    display: flex;
    flex-direction: column;
    transform-style: preserve-3d;
}

.weather-temp-reel span {
    position: relative;
    inset: auto;
    display: flex;
    flex: 0 0 calc(100% / var(--weather-count));
    align-items: center;
    transform-style: preserve-3d;
    transform-origin: 50% 50%;
    backface-visibility: hidden;
}

body.weather-freezing .weather-temp {
    color: #183242
}

.weather-title {
    position: absolute;
    left: 65vw;
    right: auto;
    top: 48%;
    width: min(34vw, 620px);
    margin: 0;
    color: #183242;
    font: 300 clamp(46px, 5.1vmin, 82px)/.91 var(--font-nunito-light-wide);
    font-stretch: 105%;
    font-synthesis: none;
    letter-spacing: 0;
    transform: translateY(-42%);
}

.weather-title--sun {
    color: #fff
}

.weather-title--rain {
    color: #fff
}

.weather-title--snow {
    color: #183242
}

.weather-title span {
    display: block
}

@media (max-width: 900px) {
    .weather-picture img {
        object-position: 58% center
    }

    .weather-sun {
        --sun-size: clamp(520px, 145vmin, 680px)
    }

    .weather-sun__flare {
        display: none
    }

    .weather-noise {
        background-image: url('/assets/weather/weather-noise.webp');
        background-size: 128px 128px
    }

    .weather-precipitation {
        display: none
    }

    body.weather-storm .weather-rain,
    body.weather-freezing .weather-snow {
        display: block
    }

    .weather-rain i:nth-child(n+11),
    .weather-snow i:nth-child(n+19) {
        display: none
    }

    .rim {
        --weather-rain-mix: 0% !important;
        --weather-snow-mix: 0% !important
    }

    .weather-composition {
        --weather-copy-width: min(calc(100vw - 40px), 560px);
        --weather-temp-width: clamp(148px, 38vw, 196px);
        --weather-copy-gap: 16px;
        --weather-group-y: 1.5svh;
    }

    .weather-temp {
        left: calc(50% - var(--weather-copy-width) / 2);
        top: auto;
        bottom: calc(clamp(72px, 12svh, 112px) - var(--weather-group-y));
        width: var(--weather-temp-width);
        height: clamp(80px, 22vw, 112px);
        font-size: clamp(78px, 22vw, 112px);
        translate: none;
    }

    .weather-title {
        left: calc(50% - var(--weather-copy-width) / 2 + var(--weather-temp-width) + var(--weather-copy-gap));
        right: auto;
        top: auto;
        bottom: calc(clamp(80px, 13svh, 120px) - var(--weather-group-y));
        width: calc(var(--weather-copy-width) - var(--weather-temp-width) - var(--weather-copy-gap));
        font-family: var(--font-nunito-medium);
        font-style: normal;
        font-weight: 500;
        font-stretch: 100%;
        font-synthesis: none;
        font-size: clamp(17px, 4.6vw, 20px);
        line-height: 1.2;
        letter-spacing: -.01em;
        transform: none;
    }
}

@media (max-height: 700px) and (min-width: 901px) {
    .weather-temp {
        font-size: clamp(158px, 27vmin, 250px)
    }

    .weather-title {
        font-size: clamp(38px, 6.2vmin, 58px)
    }
}

@media (prefers-reduced-motion: reduce) {
    .weather-picture img {
        transform: none !important
    }

    .weather-sun {
        transform: translate(-50%, -50%) !important
    }

    .weather-sun__visual {
        transform: none !important
    }

    .weather-precipitation i {
        animation: none !important;
        transform: none !important
    }
}

/* Следующая глава использует тот же sticky-контекст и тот же телефон. */
.split-story {
    --split-copy-size: clamp(36px, 2.7vw, 54px);
    position: fixed;
    inset: 0;
    z-index: 5;
    display: grid;
    grid-template-columns:1fr 1fr;
    overflow: hidden;
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
    isolation: isolate;
    contain: layout paint;
    background: #FFF;
}

.split-story.is-active {
    pointer-events: auto
}

.split-half {
    position: relative;
    min-width: 0;
    overflow: hidden;
    background: #FFF;
}

.split-half--right {
    background: #FFF;
}

.split-kicker {
    position: absolute;
    z-index: 3;
    left: var(--pad);
    top: clamp(150px, 18vh, 220px);
    margin: 0;
    color: #14202A;
    font: 300 var(--split-copy-size)/.96 var(--font-nunito-light-wide);
    font-stretch: 105%;
    font-synthesis: none;
    letter-spacing: 0;
    pointer-events: none;
}

.split-heading {
    position: absolute;
    z-index: 3;
    left: var(--pad);
    bottom: clamp(58px, 9vh, 118px);
    margin: 0;
    color: #14202A;
    font: 300 var(--split-copy-size)/.92 var(--font-nunito-light-wide);
    font-stretch: 105%;
    font-synthesis: none;
    letter-spacing: 0;
    pointer-events: none;
}

.split-kicker span,
.split-heading span {
    display: block
}

.split-half--right .split-heading {
    left: auto;
    right: clamp(52px, 6vw, 118px);
    color: #14202A;
    text-align: right;
}

@media (max-width: 900px) {
    .split-story {
        --split-copy-size: clamp(28px, 4.8vw, 36px);
        --split-copy-mobile-offset: clamp(22px, 3svh, 28px);
        display: block;
    }

    .split-half {
        position: absolute;
        inset: 0;
        overflow: visible;
        background: transparent;
    }

    .split-half--right {
        background: transparent
    }

    .split-heading {
        left: clamp(22px, 4vw, 34px);
        right: clamp(22px, 4vw, 34px);
        top: calc(74svh + var(--split-copy-mobile-offset));
        bottom: auto;
        width: auto;
        max-width: none;
    }

    .split-kicker {
        left: clamp(22px, 4vw, 34px);
        right: clamp(22px, 4vw, 34px);
        top: calc(56svh + var(--split-copy-mobile-offset));
        width: auto;
        max-width: none;
    }

    .split-kicker,
    .split-heading {
        font-family: var(--font-nunito-light-wide);
        font-style: normal;
        font-weight: 300;
        font-stretch: 105%;
        font-synthesis: none;
        font-size: var(--mobile-section-title-size);
        line-height: .94;
        letter-spacing: 0;
    }

    .split-half--right .split-heading {
        left: clamp(22px, 4vw, 34px);
        right: clamp(22px, 4vw, 34px);
        text-align: left;
    }

    .split-kicker span,
    .split-heading span {
        display: inline
    }

    .split-kicker span + span::before,
    .split-heading span + span::before {
        content: ' '
    }

    .split-kicker span:last-child::after,
    .split-heading span:last-child::after {
        content: '.'
    }
}

.trip-hub {
    position: fixed;
    inset: 0;
    z-index: 5;
    overflow: hidden;
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
    contain: layout paint;
    background: #FFF;
    color: #0A1722;
}

.trip-hub.is-active {
    pointer-events: auto
}

.trip-hub__title {
    position: absolute;
    z-index: 3;
    left: 50%;
    top: clamp(132px, 16vh, 210px);
    width: min(82vw, 1100px);
    margin: 0;
    transform: translateX(-50%);
    font-family: var(--font-nunito-light-wide);
    font-style: normal;
    font-weight: 300;
    font-stretch: 105%;
    font-size: clamp(58px, min(6vw, 11vh), 112px);
    line-height: .88;
    --lead: .56em;
    letter-spacing: 0;
    text-align: center;
}

.trip-hub__content {
    position: absolute;
    z-index: 1;
    left: clamp(24px, 7vw, 140px);
    right: clamp(24px, 7vw, 140px);
    top: clamp(330px, 35vh, 500px);
    bottom: clamp(34px, 5vh, 76px);
    max-width: 1000px;
    margin: auto;
}

.trip-hub__list {
    position: absolute;
    inset: 50% 0 auto;
    z-index: 2;
    display: grid;
    row-gap: clamp(8px, 1.2vh, 14px);
    transform: translateY(-50%);
}

.trip-hub__item {
    --trip-active: 0;
    position: relative;
    isolation: isolate;
    display: grid;
    grid-template-columns:minmax(0, 1fr) auto;
    align-items: center;
    width: 100%;
    min-height: clamp(66px, 8vh, 86px);
    padding: 0;
    border: 0;
    border-bottom: 1px solid rgba(10, 23, 34, .14);
    border-radius: 0;
    background: none;
    color: rgb(10 23 34 / calc(.46 + var(--trip-active) * .54));
    font: inherit;
    text-align: left;
    cursor: default;
    -webkit-tap-highlight-color: transparent;
}

.trip-hub__item:first-child {
    border-top: 1px solid rgba(10, 23, 34, .14)
}

.trip-hub__number {
    grid-column: 2;
    grid-row: 1;
    align-self: center;
    justify-self: end;
    font-family: var(--font-nunito-medium);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-size: clamp(14px, 1vw, 17px);
    line-height: 1;
    letter-spacing: .16em;
    color: rgb(10 23 34 / calc(.46 + var(--trip-active) * .46));
}

.trip-hub__label {
    position: relative;
    z-index: 0;
    grid-column: 1;
    grid-row: 1;
    display: block;
    width: fit-content;
    max-width: 980px;
    padding: 16px 0;
    font-family: var(--font-nunito-medium);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-size: var(--hero-copy-size);
    line-height: 1.16;
    letter-spacing: -.01em;
}

.trip-hub__label::before {
    content: '';
    position: absolute;
    z-index: -1;
    left: -.15em;
    right: -.15em;
    bottom: .16em;
    height: .76em;
    border-radius: 100%;
    opacity: calc(var(--trip-active) * .9);
    background: var(--brand-green);
    box-shadow: 0 0 28px rgba(var(--brand-green-rgb), .64),
    0 0 54px rgba(var(--brand-green-rgb), .34);
    filter: blur(18px);
    transform: scaleX(calc(.72 + var(--trip-active) * .28)) scaleY(calc(.72 + var(--trip-active) * .20));
    transform-origin: center;
}

.trip-hub__preview {
    position: absolute;
    z-index: 2;
    left: 0;
    top: 0;
    width: clamp(380px, 34vw, 572px);
    aspect-ratio: 320/432;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform-style: preserve-3d;
    backface-visibility: hidden;
}

.trip-hub__preview::before {
    content: '';
    position: absolute;
    z-index: 0;
    inset: 0;
    border-radius: clamp(20px, 2vw, 30px);
    background: #F3F7F8;
    box-shadow: 0 22px 52px rgba(10, 23, 34, .14), 0 0 0 1px rgba(255, 255, 255, .7) inset;
    pointer-events: none;
}

.trip-hub__preview-shell {
    position: absolute;
    z-index: 0;
    left: 5%;
    top: 50%;
    display: none;
    width: 90%;
    aspect-ratio: 964/610;
    border-radius: clamp(28px, 2.8vw, 44px);
    background: #fff;
    box-shadow: 0 24px 52px rgba(10, 23, 34, .16);
    transform: translateY(-50%);
    pointer-events: none;
}

.trip-hub__preview-card {
    position: absolute;
    z-index: 1;
    inset: 0;
    display: block;
    overflow: hidden;
    border: 0;
    border-radius: clamp(20px, 2vw, 30px);
    background: transparent;
    opacity: 0;
    visibility: hidden;
    contain: paint;
}

.trip-hub__preview-image {
    position: absolute;
    inset: 0;
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.trip-hub__preview-video {
    position: absolute;
    z-index: 2;
    inset: 0;
    display: none;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: 0;
}

.trip-hub__preview-image--secondary {
    display: none
}

.trip-hub__preview-card.is-placeholder .trip-hub__preview-image {
    display: none
}

.trip-hub__preview-card.is-video .trip-hub__preview-video {
    display: block;
    inset: 50% auto auto 50%;
    width: 90%;
    height: 90%;
    border-radius: clamp(24px, 2.2vw, 34px);
    transform: translate(-50%, -50%);
    object-fit: contain;
}

.trip-hub__preview-card.is-video.is-media-ready .trip-hub__preview-video {
    opacity: 1
}

.trip-hub__preview-card.is-video.is-media-ready .trip-hub__preview-image {
    opacity: 0
}

.trip-hub__preview-card.is-guidebook-video .trip-hub__preview-video {
    width: 100%;
    height: 100%;
    border-radius: inherit;
}

.trip-hub__preview-card.is-ticket-video::after {
    content: '';
    position: absolute;
    z-index: 3;
    inset: 5%;
    border-radius: clamp(24px, 2.2vw, 34px);
    box-shadow: inset 0 0 10px 5px rgba(255, 255, 255, 1),
    inset 0 0 34px 18px rgba(255, 255, 255, .96);
    pointer-events: none;
}

.trip-hub__preview-card.is-flight-glass {
    inset: auto auto auto 5%;
    top: 50%;
    width: 90%;
    aspect-ratio: 964/610;
    overflow: hidden;
    border-radius: clamp(28px, 2.8vw, 44px);
    background: transparent;
    box-shadow: none;
    contain: paint;
}

.trip-hub__preview-card.is-flight-glass.is-hotel-video,
.trip-hub__preview-card.is-flight-glass.is-guidebook-video {
    aspect-ratio: 2/1;
}

.trip-hub__preview-card.is-flight-glass .trip-hub__preview-image {
    z-index: 2;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
}

.trip-hub__preview-card.is-flight-glass .trip-hub__preview-image--primary {
    left: 0;
    top: 0;
}

.trip-hub__preview-card.is-flight-glass.is-flight-art .trip-hub__preview-image--primary {
    transform: rotate(-3.0743deg);
}

.trip-hub__preview-card.is-flight-glass.is-weather-art .trip-hub__preview-image {
    box-sizing: border-box;
    padding: 0 6%;
    object-position: 50% 50%;
}

.trip-hub__preview-card.is-flight-glass.is-weather-art .trip-hub__preview-image--primary {
    transform: none;
}

.trip-hub__preview-card.is-flight-glass.is-route-art .trip-hub__preview-image--primary {
    inset: -1% auto auto 0;
    width: 78%;
    height: 78%;
}

.trip-hub__preview-card.is-flight-glass.is-route-art .trip-hub__preview-image--secondary {
    inset: auto 0 -1% auto;
    display: block;
    width: 78%;
    height: 78%;
}

.trip-hub__preview.is-flight-glass::before,
.trip-hub__preview.is-flight-glass::after {
    display: none;
}

.trip-hub__preview.is-flight-glass .trip-hub__preview-shell {
    display: block;
}

@media (max-width: 900px) {
    .trip-hub__title {
        top: clamp(104px, 15vh, 150px);
        width: 90vw;
        font-size: var(--mobile-section-title-size)
    }

    .trip-hub__content {
        top: clamp(210px, 26svh, 250px);
        bottom: auto;
    }

    .trip-hub__list {
        position: relative;
        inset: auto;
        transform: none
    }

    .trip-hub__item {
        grid-template-columns:minmax(0, 1fr) auto;
        min-height: clamp(43px, 6.4vh, 56px);
    }

    .trip-hub__item.is-active,
    .trip-hub__item.is-active .trip-hub__number {
        color: #0A1722
    }

    .trip-hub__label {
        grid-column: 1;
        padding: 9px 0;
        font-size: clamp(18px, 4.4vw, 22px);
        line-height: 1.18;
    }

    .trip-hub__preview {
        width: min(calc(100vw - 40px), 420px);
        aspect-ratio: 964/610;
    }
}

@media (max-height: 820px) and (min-width: 901px) {
    .trip-hub__title {
        top: 84px;
        font-size: clamp(54px, 8.5vh, 72px)
    }

    .trip-hub__content {
        top: 230px;
        bottom: 24px
    }

    .trip-hub__item {
        min-height: 62px
    }
}

@media (prefers-reduced-motion: reduce) {
    .trip-hub__item.is-active {
        --trip-active: 1
    }
}

/* CTA продолжает тот же закреплённый фон финальной сцены без нового экрана. */
.go-band {
    position: relative;
    z-index: 7;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    gap: clamp(40px, 6vh, 72px);
    min-height: 0;
    background: transparent;
    margin-top: 0;
    padding: clamp(220px, calc(38vh - 80px), 380px) var(--pad) clamp(96px, 14vh, 160px);
    color: #fff;
}

.go-particles {
    z-index: 0;
    opacity: 1;
}

.hero-particles.go-particles i {
    top: auto;
    bottom: 0;
    animation-name: goParticleRise;
    animation-play-state: paused;
}

.hero-particles.go-particles i::before {
    animation-play-state: paused
}

.go-band.is-particles-active .go-particles i,
.go-band.is-particles-active .go-particles i::before {
    animation-play-state: running
}

@keyframes goParticleRise {
    0% {
        transform: translate3d(0, 12vh, 0);
        opacity: 0
    }
    12%, 72% {
        opacity: 1
    }
    100% {
        transform: translate3d(calc(var(--particle-drift, 0) + var(--particle-jitter, 0)), -95vh, 0);
        opacity: 0;
    }
}

.go-title {
    position: relative;
    z-index: 1;
    max-width: 16em;
    margin: 0;
    color: rgba(255, 255, 255, .6);
    /* Размер уже используется у крупных заголовков предыдущих экранов. */
    font-size: clamp(76px, 7.5vw, 126px);
    line-height: .92;
    font-weight: 300;
    font-stretch: 105%;
    font-synthesis: none;
    text-align: center;
}

.go-title .cw {
    display: inline-block;
    overflow: hidden;
    vertical-align: bottom;
    padding: .30em .12em .26em .05em;
    margin: -.30em -.12em -.26em -.05em;
}

.go-title .cw > i {
    display: inline-block;
    font-style: normal
}

.go-btn {
    display: inline-flex;
    position: relative;
    z-index: 1;
    align-items: center;
    justify-content: center;
    width: min(1760px, 100%);
    height: clamp(320px, 42vh, 480px);
    padding: 0;
    border: 0;
    cursor: pointer;
    border-radius: 999px;
    background: #0400FA;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .32),
    inset 0 0 28px rgba(125, 205, 255, .28),
    inset 0 0 164px rgba(90, 91, 255, 0),
    0 20px 62px rgba(4, 0, 250, .48),
    0 0 30px rgba(54, 73, 255, .24),
    0 0 150px rgba(255, 0, 184, 0);
    color: #fff;
    font-family: var(--font-nunito-medium);
    font-size: clamp(72px, 9vw, 112px);
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    font-synthesis: none;
    line-height: 1;
    transform-origin: 50% 50%;
    transition: box-shadow .85s cubic-bezier(.22, .61, .36, 1), background .3s;
}

.go-btn::before,
.go-btn::after {
    content: "";
    position: absolute;
    border-radius: inherit;
    opacity: 0;
    pointer-events: none;
    transition: opacity .48s cubic-bezier(.22, .61, .36, 1);
}

.go-btn::before {
    inset: 0;
    z-index: -1;
    background: transparent;
    box-shadow: 0 0 150px 34px rgba(177, 88, 255, .70),
    0 0 280px 72px rgba(121, 52, 255, .42);
}

.go-btn::after {
    inset: 0;
    z-index: 0;
    background: transparent;
    box-shadow: inset 0 0 88px rgba(197, 239, 255, .52),
    inset 0 0 180px rgba(108, 102, 255, .28);
}

.go-btn:hover::before,
.go-btn:hover::after,
.go-btn:focus-visible::before,
.go-btn:focus-visible::after {
    opacity: 1
}

.go-t {
    display: inline-flex;
    position: relative;
    z-index: 1;
    align-items: center;
    gap: .42em
}

.go-apple {
    display: block;
    width: auto;
    height: 1em;
    flex: 0 0 auto;
    filter: brightness(0) invert(1);
    transition: filter .5s ease;
}

.go-t {
    transition: text-shadow .5s ease
}

.go-btn.is-scroll-glowing {
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .72),
    inset 0 0 76px rgba(183, 235, 255, .82),
    inset 0 0 164px rgba(90, 91, 255, .54),
    0 28px 78px rgba(4, 0, 250, .58),
    0 0 76px rgba(255, 0, 184, .34),
    0 0 150px rgba(255, 0, 184, 0);
}

@keyframes goButtonGlowPulse {
    0%, 100% {
        opacity: .16
    }
    50% {
        opacity: .28
    }
}

.go-btn:hover::after,
.go-btn:focus-visible::after {
    animation: goButtonGlowPulse 2.5s ease-in-out infinite
}

.go-btn:hover .go-t {
    text-shadow: 0 0 8px rgba(255, 255, 255, .95), 0 0 20px rgba(128, 218, 255, .78);
}

.go-btn:hover .go-apple {
    filter: brightness(0) invert(1) drop-shadow(0 0 7px rgba(255, 255, 255, .95)) drop-shadow(0 0 15px rgba(128, 218, 255, .7));
}

.go-btn:focus-visible {
    outline: 3px solid #fff;
    outline-offset: 5px
}

.letter-roll {
    display: inline-flex;
    perspective: 600px;
    white-space: pre
}

.roll-letter {
    position: relative;
    display: inline-block;
    height: 1.18em;
    overflow: hidden;
    vertical-align: bottom;
}

.roll-front, .roll-back {
    display: block;
    line-height: 1.18;
    transform-origin: 50% 50%;
}

.roll-back {
    position: absolute;
    left: 0;
    top: 100%;
    color: currentColor
}

@media (prefers-reduced-motion: reduce) {
    .roll-front, .roll-back {
    }
}

.hero h1,
.caption-heading,
#cap0,
.weather-title,
.split-kicker,
.split-heading,
.trip-hub__title {
    letter-spacing: 0
}

@media (prefers-reduced-motion: reduce) {
    .idle-y, .idle-r {
        animation: none
    }
}

/* Единый глобальный хедер: самостоятельные элементы вместо цельного SVG-макета. */
.site-header {
    --header-ink: #0A1722;
    top: 0;
    z-index: 45;
    display: block;
    padding: clamp(36px, 4.95vh, 54px) var(--pad) clamp(24px, 3.3vh, 36px);
    color: var(--header-ink);
    pointer-events: none;
    transition: color .28s ease, transform .62s cubic-bezier(.22, 1, .36, 1), translate .62s cubic-bezier(.22, 1, .36, 1);
}

/* Перебивает старое служебное правило .hdr, скрывавшее прямых потомков. */
.site-header > * {
    visibility: visible !important
}

.site-header__nav * {
    visibility: visible
}

.site-header__nav {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    min-width: 0;
}

.site-header__brand {
    position: relative;
    display: block;
    flex: 0 0 auto;
    width: clamp(92.4px, 7.56vw, 112.8px);
    color: inherit;
    background: #0400FA;
    -webkit-mask: url('/assets/ui/8ty-logo.svg') center/contain no-repeat;
    mask: url('/assets/ui/8ty-logo.svg') center/contain no-repeat;
    pointer-events: auto;
    transform-origin: left top;
    transition: background-color .34s ease, scale .62s cubic-bezier(.22, 1, .36, 1);
}

.site-header__brand img {
    display: block;
    width: 100%;
    height: auto;
    opacity: 0;
    filter: none !important;
    transition: filter .28s ease, opacity .28s ease;
}

.site-header__audience-position {
    position: absolute;
    left: 50%;
    top: 0;
    transform: translateX(-50%);
    transform-origin: center top;
    pointer-events: auto;
    transition: transform .62s cubic-bezier(.22, 1, .36, 1);
}

.site-header__audience {
    --audience-pill-left: 5px;
    --audience-pill-width: calc(62.5% - 6.25px);
    position: relative;
    isolation: isolate;
    display: flex;
    width: 380px;
    height: 70px;
    padding: 5px;
    border-radius: 999px;
    background: #F1F3F5;
    box-shadow: none;
    transition: background-color .34s ease;
}

.site-header__audience.is-hotels {
    --audience-pill-left: calc(62.5% - 1.25px);
    --audience-pill-width: calc(37.5% - 3.75px);
}

.site-header__audience::before {
    content: "";
    position: absolute;
    z-index: 0;
    top: 5px;
    bottom: 5px;
    left: var(--audience-pill-left);
    width: var(--audience-pill-width);
    border-radius: 999px;
    background: #0400FA;
    transition: left .46s cubic-bezier(.22, 1, .36, 1), width .46s cubic-bezier(.22, 1, .36, 1), background-color .34s ease;
}

.site-header__audience-tab {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 0;
    height: 60px;
    padding: 0 20px;
    border: 0;
    border-radius: 999px;
    background: transparent;
    color: #0A1722;
    font-family: var(--font-nunito-medium);
    font-size: 18px;
    font-style: normal;
    font-weight: 500;
    font-stretch: 100%;
    line-height: 1;
    white-space: nowrap;
    text-decoration: none;
    cursor: pointer;
    opacity: .42;
    transition: color .34s ease, opacity .24s ease;
}

.site-header__audience-tab > span {
    display: inline-block
}

.site-header__audience-tab:first-child {
    flex: 5
}

.site-header__audience-tab:last-child {
    flex: 3
}

.site-header__audience-tab.is-active {
    color: #fff;
    opacity: .6
}

body.is-loading .site-header__audience,
body.is-dark .site-header__audience,
body.header-on-dark .site-header__audience {
    background: #050505;
    box-shadow: none
}

body.is-loading .site-header__audience-tab:not(.is-active),
body.is-dark .site-header__audience-tab:not(.is-active),
body.header-on-dark .site-header__audience-tab:not(.is-active) {
    color: #fff;
    opacity: .6
}

.site-header__actions {
    display: flex;
    flex: 0 0 auto;
    align-items: flex-start;
    gap: clamp(18px, 1.6vw, 28px);
    transform: translateY(5px);
    pointer-events: none;
}

.site-header__download-position {
    --header-download-content-opacity: .6;
    display: flex;
    flex: 0 0 auto;
    justify-content: flex-end;
    transform-origin: right top;
    pointer-events: none;
    transition: scale .34s cubic-bezier(.22, 1, .36, 1);
}

.site-header__download-position:hover,
.site-header__download-position:focus-within {
    --header-download-content-opacity: 1
}

.site-header__download {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 154px;
    height: 60px;
    padding: 0 25px;
    border-radius: 999px;
    background: #0400FA;
    color: rgb(255 255 255 / var(--header-download-content-opacity));
    font-family: var(--font-nunito-medium);
    font-size: 18px;
    font-weight: 500;
    line-height: 1;
    text-decoration: none;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateY(-12px);
    transition: opacity .34s ease, transform .46s cubic-bezier(.22, 1, .36, 1), visibility 0s linear .46s, background-color .34s ease, color .34s ease;
}

.site-header__download-label {
    display: inline-flex;
    align-items: center;
    gap: 9px
}

.site-header__download img {
    display: block;
    width: auto;
    height: 18px;
    opacity: var(--header-download-content-opacity);
    filter: brightness(0) invert(1);
    transition: opacity .24s ease, filter .34s ease;
}

.site-header__languages {
    display: flex;
    flex: 0 0 auto;
    align-items: center;
    gap: 12px;
    height: 60px;
    color: var(--header-ink);
    font-size: 18px;
    font-weight: 500;
    line-height: 1;
    white-space: nowrap;
    pointer-events: auto;
    transition: color .28s ease, font-size .62s cubic-bezier(.22, 1, .36, 1), gap .62s cubic-bezier(.22, 1, .36, 1);
}

.site-header__language {
    display: inline-block;
    padding: 0;
    border: 0;
    background: none;
    color: inherit;
    font: inherit;
    line-height: inherit;
    cursor: pointer;
    opacity: .5;
    transition: transform .62s cubic-bezier(.22, 1, .36, 1);
}

.site-header__language:hover,
.site-header__language:focus-visible,
.site-header__language.is-active {
    opacity: 1
}

.site-header__download.is-visible {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translateY(0);
    transition-delay: 0s;
}

@media (min-width: 761px) {
    .site-header__brand {
        scale: 1.1
    }

    .site-header.is-compact {
        translate: 0 -30px
    }

    .site-header.is-compact .site-header__brand {
        scale: .84
    }

    .site-header.is-compact .site-header__audience-position {
        transform: translateX(-50%) scale(.8)
    }

    .site-header.is-compact .site-header__download-position {
        scale: .8
    }

    .site-header.is-compact .site-header__languages {
        gap: 10px;
        font-size: 14.4px
    }

    .site-header.is-compact .site-header__language {
        transform: translateY(-7px)
    }

    .site-header.is-compact .site-header__download-position:hover,
    .site-header.is-compact .site-header__download-position:focus-within {
        scale: 1
    }
}

/* Геометрия глобальной шапки едина во всех сценах.
     Состояния body ниже меняют только контрастные цвета под фон. */
body.is-loading .site-header,
body.is-dark .site-header,
body.header-on-dark .site-header {
    --header-ink: #fff;
}

/* Финальная синяя сцена сохраняет палитру предыдущей тёмной главы. */
body.is-charge .site-header {
    --header-ink: #fff;
}

body.is-charge .site-header__audience {
    background: #050505;
    box-shadow: none
}

body.is-charge .site-header__audience-tab:not(.is-active) {
    color: #fff;
    opacity: .6
}

.site-header .site-header__audience-tab:hover,
.site-header .site-header__audience-tab:focus-visible {
    opacity: 1
}

.site-header a:focus-visible,
.site-header button:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 4px
}

@media (max-width: 760px), (max-height: 520px) and (pointer: coarse) {
    .pre-logo {
        width: min(48vw, 250px)
    }
    .site-header {
        padding: 14px 20px
    }

    .site-header__brand {
        width: 86px;
        height: 44px
    }

    .site-header__audience-position {
        top: 62px;
        transform: translateX(-50%)
    }

    .site-header__audience {
        width: min(340px, calc(100vw - 40px))
    }

    .site-header__audience-tab {
        font-size: clamp(14px, 4vw, 16px);
        padding-inline: 10px
    }

    .site-header__actions {
        display: flex;
        transform: none
    }

    .site-header__download-position {
        display: none
    }

    .site-header__languages {
        height: 48px;
        gap: 9px;
        font-size: 14px
    }

    .site-header__language {
        display: grid;
        place-items: center;
        min-width: 44px;
        height: 44px
    }

    .go-band {
        gap: 32px;
        padding: clamp(64px, 9svh, 88px) 20px calc(72px + env(safe-area-inset-bottom, 0px))
    }

    .go-title {
        font-size: clamp(40px, 11.2vw, 64px)
    }

    .go-btn {
        width: min(calc(100vw - 40px), 42svh, 340px);
        height: min(calc(100vw - 40px), 42svh, 340px);
        flex: 0 0 auto;
        border-radius: 50%;
        font-size: clamp(48px, 14vw, 72px);
    }

    .go-t {
        gap: .22em
    }
}

.roll-layer.is-desktop-safari .screen-placeholder.is-audio-guide,
body.split-active .roll-layer.is-desktop-safari .screen-placeholder,
body.trip-hub-active .roll-layer.is-desktop-safari .screen-placeholder {
    background: #fff url('/assets/audio-guide/player-poster.jpg') center bottom / 100% auto no-repeat
}

body.is-charge .roll-layer.is-desktop-safari .screen {
    background: #000 url('/assets/media/final-phone-video-poster.jpg') center top / 98% 100% no-repeat
}

.roll-layer.is-desktop-safari.is-phone-moving .audio-guide-player,
.roll-layer.is-desktop-safari.is-phone-moving .final-phone-video,
.roll-layer.is-desktop-safari .box.is-audio-guide-settled .plan-reveal,
body.is-charge .roll-layer.is-desktop-safari .plan-reveal,
body.is-charge .roll-layer.is-desktop-safari .screen-placeholder {
    display: none
}

.roll-layer.is-desktop-safari.is-phone-moving .scroll-layer,
.roll-layer.is-desktop-safari.is-phone-prewarmed .scroll-layer {
    will-change: transform, opacity
}

@media (max-width: 900px),(hover: none),(pointer: coarse) {
    body {
        overflow-x: clip
    }

    .second-screen-glow {
        display: none
    }

    .screen-placeholder {
        box-shadow: none
    }

    .box, .idle-y, .idle-r, .aura::before, .aura i {
        animation: none
    }

    .screen-placeholder.is-audio-guide,
    body.split-active .screen-placeholder,
    body.trip-hub-active .screen-placeholder {
        background: #fff url('/assets/audio-guide/player-motion-mobile.webp') center bottom / 100% auto no-repeat
    }

    body.is-charge .screen {
        background: #000 url('/assets/media/final-phone-motion-mobile.webp') center top / 98% 100% no-repeat
    }

    .roll-layer.is-phone-moving .audio-guide-player,
    .roll-layer.is-phone-moving .final-phone-video,
    .box.is-audio-guide-settled .plan-reveal,
    body.is-charge .plan-reveal,
    body.is-charge .screen-placeholder {
        display: none
    }

    .roll-layer.is-phone-moving .scroll-layer,
    .roll-layer.is-phone-prewarmed .scroll-layer {
        will-change: transform, opacity
    }

    .aura i {
        display: none
    }

    .aura::before {
        filter: blur(32px)
    }

    .aura::after {
        filter: blur(20px)
    }

    .plan-complete-wave > i {
        display: none
    }
}

@media (prefers-reduced-motion: reduce) {
    .go-particles {
        display: none
    }

    .go-btn {
        transition: none
    }

    .go-btn::before, .go-btn::after {
        transition: none
    }

    .go-btn:hover::after,
    .go-btn:focus-visible::after {
        animation: none
    }

    .site-header, .site-header * {
        transition-duration: .01ms !important
    }
}

html[data-performance-mode='lite'] .trip-hub__preview,
html[data-performance-mode='lite'] .audio-guide-player,
html[data-performance-mode='lite'] .final-phone-video {
    display: none !important;
}

html[data-performance-mode='lite'] .hero-particles,
html[data-performance-mode='lite'] .plan-complete-particles {
    display: none !important;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(n+9) {
    display: none !important;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(-n+8) {
    visibility: visible !important;
    z-index: 1;
    width: max-content;
    --tag-pad-y: clamp(12px, 1.15vw, 18px);
    --tag-pad-x: clamp(20px, 2vw, 32px);
    --tag-font-size: clamp(20px, 1.8vw, 28px);
}

html[data-performance-mode='lite'] .tag-pos:nth-child(-n+8) .tag {
    box-sizing: border-box;
    max-width: calc(50vw - 24px);
    pointer-events: auto;
    white-space: normal;
    text-align: center;
    line-height: 1.2;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(-n+8):hover,
html[data-performance-mode='lite'] .tag-pos:nth-child(-n+8):focus-within {
    z-index: 8;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(1) {
    left: 24%;
    top: 22%;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(2) {
    left: 76%;
    top: 20%;
    --tag-font-size: clamp(22px, 2.05vw, 31px);
}

html[data-performance-mode='lite'] .tag-pos:nth-child(3) {
    left: 33%;
    top: 41%;
    --tag-font-size: clamp(23px, 2.15vw, 33px);
}

html[data-performance-mode='lite'] .tag-pos:nth-child(4) {
    left: 78%;
    top: 39%;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(5) {
    left: 21%;
    top: 60%;
    --tag-font-size: clamp(22px, 2vw, 30px);
}

html[data-performance-mode='lite'] .tag-pos:nth-child(6) {
    left: 73%;
    top: 59%;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(7) {
    left: 31%;
    top: 78%;
}

html[data-performance-mode='lite'] .tag-pos:nth-child(8) {
    left: 79%;
    top: 76%;
    --tag-font-size: clamp(22px, 2vw, 30px);
}

@media (max-width: 700px) {
    html[data-performance-mode='lite'] .tag-pos:nth-child(-n+8) {
        --tag-pad-y: 10px;
        --tag-pad-x: 12px;
        --tag-font-size: clamp(16px, 4.3vw, 18px);
    }

    html[data-performance-mode='lite'] .tag-pos:nth-child(odd) {
        left: 25%;
    }

    html[data-performance-mode='lite'] .tag-pos:nth-child(-n+8) .tag {
        max-width: calc(50vw - 16px);
    }

    html[data-performance-mode='lite'] .tag-pos:nth-child(even) {
        left: 75%;
    }

    html[data-performance-mode='lite'] .tag-pos:nth-child(1),
    html[data-performance-mode='lite'] .tag-pos:nth-child(2) {
        top: 19%;
    }

    html[data-performance-mode='lite'] .tag-pos:nth-child(3),
    html[data-performance-mode='lite'] .tag-pos:nth-child(4) {
        top: 37%;
    }

    html[data-performance-mode='lite'] .tag-pos:nth-child(5),
    html[data-performance-mode='lite'] .tag-pos:nth-child(6) {
        top: 55%;
    }

    html[data-performance-mode='lite'] .tag-pos:nth-child(7),
    html[data-performance-mode='lite'] .tag-pos:nth-child(8) {
        top: 73%;
    }
}

html[data-performance-mode='lite'] .screen-placeholder.is-audio-guide {
    background: #fff url('/assets/audio-guide/player-poster.jpg') center bottom / 100% auto no-repeat;
}

html[data-performance-mode='lite'] body.split-active .screen-placeholder,
html[data-performance-mode='lite'] body.trip-hub-active .screen-placeholder {
    background: #fff url('/assets/audio-guide/player-poster.jpg') center bottom / 100% auto no-repeat;
}

html[data-performance-mode='lite'] body.is-charge .screen {
    background: #000 url('/assets/media/final-phone-video-poster.jpg') center top / 100% 100% no-repeat;
}

/* Видео финального телефона скрыто в облегченном режиме, поэтому его постер
   должен оставаться открытым: слои прежнего плана могут быть уже выгружены. */
html[data-performance-mode='lite'] body.is-charge .plan-reveal,
html[data-performance-mode='lite'] body.is-charge .screen-placeholder {
    display: none !important;
}

html[data-performance-mode='lite'] .final-stars__canvas {
    display: none;
}

html[data-performance-mode='lite'] .final-stars::before {
    position: absolute;
    inset: 0;
    background: url('/assets/final-stars/star-1.svg') center calc(50dvh - 78.75vmax) / 157.5vmax auto no-repeat;
    content: '';
    opacity: .72;
}
