/* Astronaut scroll-scrubbed sekcja - kosmonauta z tabletem, kamera orbituje wokol
   niego i wjezdza w ekran tabletu (193 klatki, nowy material z 2026-08-26), obok
   pojawiaja sie krotkie hasla, na koncu wchodza dwa przyciski wyboru sciezki.
   Wysokosc 440vh = 772vh * 0.5705 - ta sama proporcja co w hero-scroll-video.css
   (Lenis wheelMultiplier: 0.55 spowalnia efektywny scroll o polowe, wiec sekcje
   scroll-scrub skrocone zeby zachowac dawne tempo). Tlo #000408 (nie stare cieple
   #100904) - nowy material jest chlodny/czarny, zgodnie z reszta strony.

   Nachodzenie NA POCZATKU (manifesto->astronaut) zostalo WYCOFANE: margin-top:-50vh
   bez bufora "hold" spowodowal ze sticky pin odpinal sie 50vh za wczesnie wzgledem
   wlasnej matematyki progresu klatek - to "kradlo" 50vh z aktywnego czasu pina, ktore
   niewidocznie nachodzilo na sekcje uslug, tworzac "martwa strefe" i psujac caly dalszy
   scroll. Nachodzenie NA KONCU (astronaut->uslugi) robimy poprawnie, tym samym trikiem
   co hero->manifesto: +100vh "hold" TUTAJ (bylo 40vh - za krotko, cale
   zoom+fade-to-black+podmiana czulo sie "na szybko"; 100vh daje wiecej przestrzeni
   zeby to wybrzmialo) - pin zostaje przypiety dluzej, JS w astronaut-scroll.js
   odejmuje ten bufor z liczenia progresu klatek) + margin-top na .section-moduly w
   services-moduly.css (uslugi "wjezdzaja" na koncowke wjazdu w tablet, margin tam
   przeliczony pod nowy HOLD_VH=100). Hold bez brakujacej kompensacji to byl
   dokladny powod poprzedniej awarii - tym razem jest, wiec nie powinno sie powtorzyc. */
.astronaut-scroll {
    position: relative;
    width: 100%;
    /* 260vh + 45vh holdu (bylo 440vh + 100vh) - po usunieciu WSZYSTKICH hasel
       nie ma czego trzymac na ekranie; user chce, zeby po wjezdzie w tablet
       "NASZE USŁUGI" pojawialy sie od razu, bez czarnej przerwy.
       UWAGA: bufor holdu musi byc rowny HOLD_VH w astronaut-scroll.js. */
    height: calc(260vh + 45vh);
    background: #000408;
    overflow: visible;
}

/* Prosty "fade to black" (jak w filmie) - w polowie "hold" bufora ekran jest w pelni
   czarny, co CHOWA moment podmiany tresci (astronaut znika, usługi sie odslaniaja) -
   zero potrzeby na piksel-perfekcyjna synchronizacje pozycji/skali, czern wybacza
   kazda niedokladnosc w timingu. Opacity sterowane z JS (trojkatna krzywa 0->1->0
   w astronaut-scroll.js). */
.astronaut-scroll__fade-black {
    position: absolute;
    inset: 0;
    z-index: 5;
    /* Ten sam kolor co WSZYSTKIE ciemne sekcje (--color-bg) - "wejscie w
       tablet" przechodzi w usługi, a usługi w realizacje bez widocznego
       odciecia (prosba usera). */
    background: var(--color-bg, #000408);
    opacity: 0;
    pointer-events: none;
}

/* Dodawane w astronaut-scroll.js dokladnie w momencie gdy czern jest w pelni
   nieprzezroczysta - chowa caly reszte pina (kanwa+teksty), zeby po odpieciu pina
   (kiedy czern juz zaczyna znikac) nie bylo widac starej tresci przebijajacej sie
   z powrotem. */
.astronaut-scroll.is-done .astronaut-scroll__pin > *:not(.astronaut-scroll__fade-black) {
    opacity: 0;
}

/* Powyzsza regula chowa DZIECI pina (kanwa, hasla), ale nie tlo PINA
   SAMEGO - a to wlasnie tlo (statyczna klatka kosmonauty, ustawione
   background-image nizej) zostawalo widoczne az do momentu odpiecia
   sticky pina na koncu sekcji. Efekt zgloszony przez usera: "poprzednia
   sekcja zaczepia sie i jedzie w gore" - to bylo dokladnie to tlo, ktore
   nagle zaczynalo sie przesuwac razem ze scrollem, gdy pin przestawal byc
   przypiety, mimo ze caly swap juz dawno sie skonczyl. */
.astronaut-scroll.is-done .astronaut-scroll__pin {
    background-image: none;
}

.astronaut-scroll__pin {
    position: sticky;
    top: 0;
    left: 0;
    width: 100%;
    height: 100vh;
    overflow: hidden;
    /* PIERWSZA KLATKA JAKO STALE TLO SEKCJI.
       Platno (canvas) rysuje sie NAD tym tlem, wiec gdy klatki jeszcze nie
       dojechaly albo skrypt nie zaczal jeszcze sledzic scrolla, uzytkownik
       i tak widzi kosmonaute zamiast czarnego ekranu. Wczesniej sekcja byla
       pusta do momentu, az doladuje sie komplet klatek - zgloszone kilka razy
       jako "czarny ekran, astronauta pojawia sie dopiero na koncu".
       To rozwiazanie nie zalezy od JS ani od tego, kiedy skoncza sie pobrania:
       tlo jest w CSS, wiec jest zawsze. Klatka wazy 18 kB. */
    background-color: #000408;
    background-image: url('../videos/astronaut-frames-sm/frame_001.webp');
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
}

/* Na waskich ekranach bierzemy wersje pionowa - ta sama klatka, kadr 9:16. */
@media (max-width: 768px) {
    .astronaut-scroll__pin {
        background-image: url('../videos/astronaut-frames-p/frame_001.webp');
    }
}

.astronaut-scroll__canvas {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    display: block;
    z-index: 1;
    /* Skalowane z JS w "hold" oknie (astronaut-scroll.js) - cyfrowy zoom na ostatniej
       klatce, symuluje kamere dojezdzajaca blizej ekranu tabletu (material zrodlowy
       nie ma dodatkowych klatek zoomu, wiec doklejamy to CSS transformem zamiast
       nowego wideo). transform-origin przyblizony punkt gdzie w ostatniej klatce jest
       ekran tabletu. */
    transform-origin: 62% 66%;
    will-change: transform;
}

/* Tekst po lewej (nie prawej) - kosmonauta siedzi w prawej czesci kadru, po lewej
   jest pusta przestrzen kolo Ziemi. Nizej (flex-end + padding-bottom), nie na srodku
   ekranu - postac tez siedzi w dolnej czesci kadru, wyzsrodkowany tekst wisial w
   pustce nad nia. Zostaje odstep od strefy CTA (ktora tez jest flex-end, nizej). */
.astronaut-scroll__lines {
    position: absolute;
    inset: 0;
    z-index: 2;
    display: flex;
    align-items: flex-end;
    justify-content: flex-start;
    pointer-events: none;
    /* Lewe wciecie zgrane z sekcja uslug (services-cine) - tresc omija logo
       dosuniete do krawedzi ekranu. */
    padding: 0 clamp(24px, 13vw, 190px);
    padding-bottom: clamp(180px, 26vh, 260px);
}

.astronaut-scroll__line {
    position: absolute;
    left: clamp(24px, 8vw, 120px);
    max-width: clamp(280px, 34vw, 520px);
    font-family: var(--font-heading, 'Poppins'), sans-serif;
    font-weight: 800;
    font-size: clamp(26px, 3.4vw, 52px);
    line-height: 1.1;
    text-transform: uppercase;
    letter-spacing: 0.01em;
    color: #ffffff;
    text-align: left;
    text-shadow: 0 4px 24px rgba(0, 0, 0, 0.6);

    opacity: 0;
    filter: blur(8px);
    transform: translateX(24px);
    transition:
        opacity 600ms cubic-bezier(0.22, 1, 0.36, 1),
        transform 600ms cubic-bezier(0.22, 1, 0.36, 1),
        filter 600ms cubic-bezier(0.22, 1, 0.36, 1);
}
.astronaut-scroll__line.is-active {
    opacity: 1;
    filter: blur(0);
    transform: translateX(0);
}

/* Nakladka "wejscia" w usługi - pojawia sie stacjonarnie (fade+scale, srodek ekranu)
   w oknie "hold" bufora na koncu sekcji (astronaut-scroll.js), NIE przez fizyczny
   ruch/wjazd elementu. Poczatkowy stan (opacity:0) ustawiany tu w CSS zeby nie bylo
   FOUC zanim JS przejmie kontrole. Ten sam tekst co naglowek sekcji uslug
   (section-moduly__heading) - gdy pin sie odepnie i prawdziwa sekcja zacznie sie
   normalnie, wyglada to jak ciagle to samo, nie jak nowy element. */
.astronaut-scroll__reveal {
    position: absolute;
    top: 50%;
    left: 50%;
    z-index: 4;
    transform: translate(-50%, -50%) scale(0.85);
    opacity: 0;
    text-align: center;
    pointer-events: none;
    padding: 0 24px;
}

.astronaut-scroll__reveal-heading {
    font-family: var(--font-heading, 'Poppins'), sans-serif;
    font-size: clamp(1.5rem, 3.5vw, 2.5rem);
    font-weight: 800;
    letter-spacing: .02em;
    color: #fff;
    margin: 0;
    line-height: 1.2;
    text-shadow: 0 4px 24px rgba(0, 0, 0, 0.6);
}

.astronaut-scroll__line-word--accent {
    background: linear-gradient(135deg, var(--color-primary, #cc00a6) 0%, #7338ea 100%);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}

.astronaut-scroll__cta {
    position: absolute;
    inset: 0;
    z-index: 3;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    gap: 20px;
    padding-bottom: clamp(48px, 8vh, 96px);
    pointer-events: none;
}

.astronaut-scroll__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: clamp(16px, 1.6vw, 20px) clamp(28px, 3vw, 44px);
    border-radius: 999px;
    text-decoration: none;
    font-family: var(--font-body, 'Inter'), sans-serif;
    font-weight: 700;
    font-size: clamp(13px, 1vw, 15px);
    letter-spacing: 0.08em;
    text-transform: uppercase;

    opacity: 0;
    transform: translateY(24px) scale(0.92);
    filter: blur(6px);
    pointer-events: none;
    transition:
        opacity 650ms cubic-bezier(0.22, 1, 0.36, 1),
        transform 650ms cubic-bezier(0.22, 1, 0.36, 1),
        filter 650ms cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 300ms ease;
}
.astronaut-scroll__cta.is-revealed .astronaut-scroll__btn {
    opacity: 1;
    transform: translateY(0) scale(1);
    filter: blur(0);
    pointer-events: auto;
}
.astronaut-scroll__cta.is-revealed .astronaut-scroll__btn--primary { transition-delay: 60ms; }
.astronaut-scroll__cta.is-revealed .astronaut-scroll__btn--secondary { transition-delay: 180ms; }

.astronaut-scroll__btn--primary {
    background: linear-gradient(135deg, #cc00a6 0%, #7338ea 100%);
    color: #ffffff;
    box-shadow: 0 20px 50px -18px rgba(204, 0, 166, 0.55);
}
.astronaut-scroll__btn--primary:hover { box-shadow: 0 26px 60px -14px rgba(115, 56, 234, 0.65); }

.astronaut-scroll__btn--secondary {
    background: transparent;
    color: #ffffff;
    border: 2px solid rgba(255, 255, 255, 0.6);
}
.astronaut-scroll__btn--secondary:hover { border-color: #ffffff; }

@media (max-width: 1024px) and (min-width: 768px) {
    .astronaut-scroll { height: calc(342vh + 100vh); }
}

@media (max-width: 767px) {
    /* USUNIETE: overscroll-behavior-y: contain (tu i na __pin nizej) - ten sam
       blad co w hero-scroll-video.css, patrz tamtejszy komentarz. Pin ma
       overflow:hidden bez wlasnej tresci do przewiniecia, wiec "contain"
       blokowal przekazanie scrolla do dokumentu i sekcja stawala sie
       nieprzewijalna na telefonie. */
    .astronaut-scroll {
        height: calc(562vh + 100vh);
        min-height: 100vh;
    }
    .astronaut-scroll__lines { justify-content: center; padding: 0 24px; }
    /* Hasla na GORZE kadru (prosba usera) - astronauta w pionowym cropie
       siedzi na dole/po prawej, wolna przestrzen nieba jest u gory. Sztywny
       top zamiast flex-end + padding-bottom z desktopu. */
    .astronaut-scroll__line {
        left: 24px;
        right: 24px;
        top: calc(var(--nav-height, 64px) + clamp(36px, 9svh, 96px));
        text-align: center;
        max-width: none;
        font-size: clamp(22px, 8vw, 34px);
    }
    .astronaut-scroll__cta { flex-direction: column; align-items: center; gap: 12px; }
    .astronaut-scroll__btn { font-size: 12px; padding: 14px 26px; }
}

@media (prefers-reduced-motion: reduce) {
    .astronaut-scroll { height: 100vh; }
    .astronaut-scroll__pin { position: relative; }
    .astronaut-scroll__line { position: static; opacity: 1; filter: none; transform: none; display: block; margin-bottom: 8px; }
    .astronaut-scroll__lines { flex-direction: column; align-items: flex-end; gap: 8px; }
    .astronaut-scroll__btn { opacity: 1; transform: none; filter: none; pointer-events: auto; }
}
