/* ENERSTORE v2 — dark cinematic.
   Tokeny i typografia wg briefu koncept_cinematic (decyzja MTR 2026-07-28).
   Jeden plik: strona ma kilkanascie sekcji, a rozbicie na moduly bez bundlera
   oznaczaloby kilkanascie zadan HTTP na starcie. */

:root{
  --bg:#070b0a;
  --graphite:#131817;
  --panel:#0d1210;
  --ink:#eef2ee;
  --dim:#aeb8b2;
  --mut:#858f8a;   /* było #5c6662 (~3:1 na tle) — drobne etykiety 11 px były poniżej 4,5:1; audyt czytelności 19.09 */
  --amber:#E6A93A;
  --hi:#F7D774;
  --teal:#2E6F95;
  --line:rgba(238,242,238,.10);
  --line-soft:rgba(238,242,238,.06);

  --disp:'Montserrat',system-ui,sans-serif;
  --body:'Lato',system-ui,sans-serif;
  --mono:ui-monospace,'Cascadia Mono','Consolas','JetBrains Mono',monospace;

  --pad:clamp(20px,5vw,64px);
  --maxw:1240px;
}

*{margin:0;padding:0;box-sizing:border-box}
/* scroll-behavior MUSI byc auto, kiedy dziala Lenis: Lenis przewija przez
   window.scrollTo, a przegladarka animowalaby kazde takie wywolanie drugi raz.
   Efekt to scroll, ktory lapie wheel i nie rusza z miejsca.
   Gdy Lenis nie wstal (brak pliku, prefers-reduced-motion, wylaczony JS),
   klasy .lenis nie ma i wraca natywne wygladzanie. */
html{scroll-behavior:auto;-webkit-text-size-adjust:100%}
html:not(.lenis){scroll-behavior:smooth}
@media(prefers-reduced-motion:reduce){html:not(.lenis){scroll-behavior:auto}}

/* Kotwice maja ladowac pod przyklejona nawigacja, takze bez JS. */
section[id],main[id]{scroll-margin-top:84px}
body{
  background:var(--bg);
  color:var(--ink);
  font-family:var(--body);
  font-size:16px;
  line-height:1.7;
  /* clip, nie hidden: overflow-x:hidden robi z <body> kontener przewijania,
     a wtedy position:sticky w sekcjach forge i model potrafi przestac trzymac.
     clip obcina tak samo, ale nie tworzy scrollportu. */
  overflow-x:clip;
}
img,svg{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
::selection{background:var(--amber);color:var(--bg)}

/* Sekcje ponizej folda nie musza byc liczone przy pierwszym renderze.
   contain-intrinsic-size trzyma zarezerwowana wysokosc, zeby pasek przewijania
   nie skakal przy dojezdzaniu do nich. */
.lazy-sec{content-visibility:auto;contain-intrinsic-size:auto 900px}

/* ---------------------------------------------------------------- warstwy */

/* width/height sa konieczne: canvas to element zastepowany, wiec samo inset:0
   go nie rozciaga — bez nich ma rozmiar bufora (okno x DPR) i przy skali
   ekranu innej niz 100% nie pokrywa okna albo z niego wystaje.
   100lvh (najwiekszy viewport): na iOS pasek adresu chowa sie przy przewijaniu
   i wysokosc okna skacze — przy 100% canvas bylby za kazdym razem czyszczony
   i przeliczany (field.js pomija resize, gdy jego wymiar sie nie zmienil). */
canvas#field{position:fixed;inset:0;width:100%;height:100%;height:100lvh;display:block;z-index:0;transition:opacity .3s linear}
.vignette{
  position:fixed;inset:0;pointer-events:none;z-index:1;
  background:radial-gradient(130% 100% at 50% 45%,transparent 40%,rgba(2,4,3,.78) 100%);
}
.grain{
  position:fixed;inset:0;pointer-events:none;z-index:2;opacity:.055;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
.progress{position:fixed;top:0;left:0;height:2px;width:0;z-index:60;background:linear-gradient(90deg,var(--amber),var(--hi))}

section{position:relative;z-index:10}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--pad)}

/* ------------------------------------------------------------- nawigacja */

.nav{
  position:fixed;top:0;left:0;right:0;z-index:50;
  display:flex;align-items:center;justify-content:space-between;gap:24px;
  padding:18px var(--pad);
  font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--mut);
  transition:background .4s,backdrop-filter .4s,border-color .4s;
  border-bottom:.5px solid transparent;
}
.nav.stuck{background:rgba(7,11,10,.82);backdrop-filter:blur(14px);border-bottom-color:var(--line-soft)}
.nav-logo{color:var(--ink);display:flex;align-items:center;transition:color .3s}
.nav-logo:hover{color:var(--hi)}
.nav-links{display:flex;gap:26px;text-transform:uppercase}
.nav-links a{position:relative;padding:4px 0;transition:color .25s}
.nav-links a:hover{color:var(--ink)}
.nav-links a::after{
  content:"";position:absolute;left:0;right:100%;bottom:0;height:1px;
  background:var(--amber);transition:right .3s cubic-bezier(.2,.8,.2,1);
}
.nav-links a:hover::after{right:0}
.nav-right{display:flex;align-items:center;gap:18px}
.nav-status{display:flex;align-items:center;gap:8px;text-transform:uppercase}
.nav-status i{width:6px;height:6px;border-radius:50%;background:#4ade80;animation:blink 2.2s infinite}
@keyframes blink{50%{opacity:.25}}
.nav-cta{
  color:var(--bg);background:var(--amber);border-radius:40px;
  padding:9px 18px;font-weight:700;text-transform:uppercase;letter-spacing:.16em;
  transition:box-shadow .3s,transform .3s;
}
.nav-cta:hover{box-shadow:0 0 34px rgba(230,169,58,.5);transform:translateY(-1px)}

/* ------------------------------------------------------- wspolne elementy */

.eyebrow{
  display:inline-flex;align-items:center;gap:10px;
  font-family:var(--mono);font-size:11px;letter-spacing:.3em;text-transform:uppercase;
  color:var(--hi);margin-bottom:22px;
}
.eyebrow .mark{width:12px;height:12px;color:var(--amber);flex:none}
h1,h2,h3{font-family:var(--disp);font-weight:800;letter-spacing:-.02em;line-height:1.05;text-transform:uppercase}
h2{font-size:clamp(28px,3.6vw,50px)}
h2 em,h3 em{font-style:normal;color:var(--hi)}
.lead{color:var(--dim);font-size:17px;max-width:56ch;margin-top:18px}
.lead b{color:var(--ink);font-weight:700}
.note{font-family:var(--mono);font-size:11px;line-height:1.8;letter-spacing:.04em;color:var(--mut);margin-top:26px;max-width:80ch}

.btn{
  display:inline-flex;align-items:center;gap:14px;
  font-family:var(--disp);font-weight:700;font-size:13px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--bg);background:var(--amber);padding:19px 36px;border-radius:60px;
  border:0;cursor:pointer;transition:box-shadow .35s;will-change:transform;
}
.btn:hover{box-shadow:0 0 70px rgba(230,169,58,.55)}
.btn .arr{transition:transform .3s}
.btn:hover .arr{transform:translateX(5px)}
.btn-ghost{
  background:transparent;color:var(--ink);border:1px solid var(--line);
  box-shadow:none;transition:border-color .3s,color .3s;
}
.btn-ghost:hover{border-color:var(--hi);color:var(--hi);box-shadow:none}

/* Tresc wylacznie dla czytnikow ekranu (podpisy tabel, etykiety pomocnicze). */
.visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* Stan wyjsciowy TYLKO pod html.js. Bez tej bramki strona z wylaczonym
   skryptem zostawala pusta ponizej hero: klase `on` dopina obserwator z ui.js,
   wiec bez JS-a nic nigdy nie wychodzilo z opacity 0. */
html.js .reveal{opacity:0;transform:translateY(28px);transition:opacity .9s,transform .9s cubic-bezier(.2,.8,.2,1)}
/* UWAGA NA SPECYFICZNOSC: regula odslaniajaca MUSI byc w tym samym kontekscie
   `html.js`. Samo `.reveal.on` to (0,2,0) i przegrywa z bramka (0,2,1) — cala
   tresc zostaje wtedy na opacity 0 mimo poprawnie dopietej klasy `on`.
   Wariant bez `html.js` zostaje dla porzadku: przy wylaczonym skrypcie stan
   wyjsciowy i tak nie obowiazuje. */
html.js .reveal.on,.reveal.on{opacity:1;transform:none}

.sec{padding:clamp(80px,10vh,140px) 0;background:var(--graphite);border-top:.5px solid var(--line-soft)}
.sec--void{background:transparent;border-top:0}
.sec--deep{background:var(--panel)}

/* -------------------------------------------------------------- 01 hero */

.hero{
  min-height:100svh;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:120px var(--pad) 130px;
}
.hero .tag{font-family:var(--mono);font-size:12px;letter-spacing:.42em;text-transform:uppercase;color:var(--amber);margin-bottom:26px}
.hero h1{font-size:clamp(42px,8.2vw,124px);line-height:.95;letter-spacing:-.015em}
.hero h1 .row{display:block}
/* Odslanianie naglowka (ui.js): komorka litery. .scr-f to znak docelowy —
   trzyma szerokosc i zawijanie wiersza; .scr-r (losowy) lezy nad nim poza
   przeplywem, wiec mieszanka nie moze zawinac wiersza ani przesunac hero. */
.scr-c{position:relative}
.scr-c .scr-f{visibility:hidden}
.scr-c .scr-r{position:absolute;left:50%;top:0;transform:translateX(-50%)}
.scr-c.is-set .scr-f{visibility:visible}
.scr-c.is-set .scr-r{display:none}
.hero h1 .ghost{color:transparent;-webkit-text-stroke:1px rgba(238,242,238,.35)}
.hero h1 .solid em{font-style:normal;color:var(--hi);text-shadow:0 0 46px rgba(247,215,116,.45)}
.hero .sub{margin-top:28px;max-width:540px;color:var(--dim);font-size:17px}
.hero .sub b{color:var(--ink);font-weight:700}
.hero-cta{display:flex;gap:16px;flex-wrap:wrap;justify-content:center;margin-top:38px}
.hud-row{
  position:absolute;bottom:26px;left:var(--pad);right:var(--pad);
  display:flex;justify-content:space-between;align-items:flex-end;gap:20px;
  font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--mut);
}
.hud{display:flex;flex-direction:column;gap:6px;text-align:left}
.hud .l{display:flex;gap:10px}
.hud .k{color:#7d8a83}
.hud .v{color:var(--ink)}
.hud .v.a{color:var(--amber)}
.hint{display:flex;align-items:center;gap:10px;text-transform:uppercase;letter-spacing:.22em}
.hint .pulse{width:26px;height:1px;background:var(--mut);position:relative;overflow:hidden}
.hint .pulse::after{content:"";position:absolute;inset:0;background:var(--hi);transform:translateX(-100%);animation:sw 1.8s infinite}
@keyframes sw{50%{transform:translateX(0)}100%{transform:translateX(100%)}}

/* ------------------------------------------------------------- 02 forge */

.forge{height:190vh}
.forge .pin{position:sticky;top:0;height:100svh;display:flex;align-items:center}
/* width jawnie: kroki są absolute, więc jako element flex blok miał szerokość 0 — a na jego obrysie
   stoją podkład pod tekstem i strefa ciszy pola cząstek (field.js). */
.forge-copy{position:relative;isolation:isolate;margin-left:clamp(20px,7vw,110px);width:min(360px,40vw);max-width:360px;height:240px}
.forge-copy .step{position:absolute;top:0;left:0;opacity:0;will-change:opacity,transform}
/* Podkład pod tekstem kroków — pole cząstek płynie obok, nie przez tekst (zgłoszenie testera 19.09). */
.forge-copy::before{content:"";position:absolute;inset:-70px -90px -90px -70px;z-index:-1;pointer-events:none;
  background:radial-gradient(closest-side,rgba(7,11,10,.82),rgba(7,11,10,.55) 60%,rgba(7,11,10,0))}
.forge-copy .num{font-family:var(--mono);font-size:12px;letter-spacing:.3em;color:var(--amber);margin-bottom:14px}
.forge-copy h3{font-size:clamp(24px,2.6vw,38px);font-weight:700;margin-bottom:14px}
.forge-copy p{color:var(--dim);font-size:15px}
.forge-copy p b{color:var(--ink);font-weight:700}

/* ------------------------------------------------------------- 03 model */

.model{height:260vh;background:transparent}
.model .pin{position:sticky;top:0;height:100svh;display:grid;grid-template-columns:1fr 1fr;align-items:center;gap:40px;padding:0 var(--pad)}
.model-stage{position:relative;height:min(78svh,680px)}
.model-stage canvas{position:absolute;inset:0;width:100%;height:100%}
.model-fallback{position:absolute;inset:0;margin:auto;object-fit:contain;opacity:0;transition:opacity .6s}
.model-stage.is-static .model-fallback{opacity:1}
.model-stage.is-static canvas{display:none}
.model-info h2{margin-bottom:18px}
.model-layers{margin-top:34px;display:flex;flex-direction:column;gap:1px;background:var(--line-soft);border:.5px solid var(--line-soft);border-radius:14px;overflow:hidden}
.model-layer{
  background:var(--graphite);padding:18px 22px;display:flex;gap:16px;align-items:baseline;
  transition:background .4s,color .4s;
}
.model-layer.active{background:#19211e}
.model-layer .idx{font-family:var(--mono);font-size:11px;letter-spacing:.24em;color:var(--amber);flex:none;width:34px}
.model-layer .nm{font-family:var(--disp);font-weight:700;font-size:14px;letter-spacing:.06em;text-transform:uppercase}
.model-layer .ds{color:var(--mut);font-size:13px;margin-left:auto;text-align:right;font-family:var(--mono)}
.model-hint{font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--mut);margin-top:22px}

/* ------------------------------------------------- 03b prezentacja produktu */

.prezentacja .lead{max-width:64ch}
.shot{margin-top:40px}
.shot-frame{
  /* --seq-max: szerokosc kadru sekwencji w CSS. Zrodlo ma 1280 px, wiec przy
     640 px i DPR 2 rysujemy 1:1 — na retinie bez miekkosci. */
  --seq-max:640px;
  position:relative;max-width:980px;margin:0 auto;
  /* Wciecie z bokow to miejsce na spec-tagi: bez niego znaczniki po prawej
     ladowaly NA renderze, bo obraz siegal do krawedzi kadru. */
  padding-inline:clamp(60px,13%,150px);
  /* Poswiata pod produktem — ten sam zabieg co w kadrze Open Graph. */
  background:radial-gradient(50% 55% at 50% 55%,rgba(230,169,58,.12),transparent 70%);
}
.shot-frame img{width:100%;height:auto}
.shot figcaption{
  margin-top:18px;text-align:center;
  font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--mut);
}

/* Spec-tagi wokol renderu. Pozycja pionowa wchodzi stylem z PHP, bo to jedyna
   rzecz, ktora sie rozni miedzy nimi — reszta jest wspolna. */
.spec-tag{
  position:absolute;display:flex;flex-direction:column;gap:2px;
  font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--mut);white-space:nowrap;
}
.spec-tag .v{color:var(--ink);font-size:13px;letter-spacing:.06em}
.spec-tag--left{left:0;text-align:right;align-items:flex-end}
.spec-tag--right{right:0;text-align:left;align-items:flex-start}
/* Linia-leader biegnie od znacznika w strone produktu. */
.spec-tag .lead-line{
  position:absolute;top:50%;width:34px;height:1px;background:var(--line);
}
.spec-tag--left .lead-line{left:100%;margin-left:10px}
.spec-tag--right .lead-line{right:100%;margin-right:10px}
.spec-tag .lead-line::after{
  content:"";position:absolute;top:-2px;width:5px;height:5px;border-radius:50%;
  background:var(--amber);
}
.spec-tag--left .lead-line::after{right:-2px}
.spec-tag--right .lead-line::after{left:-2px}

.stage-note{
  margin-top:20px;text-align:center;color:var(--mut);font-size:14px;
}
.stage-note a{color:var(--ink);border-bottom:1px solid var(--line)}

/* ------------------------------------------------- scena: sekwencja klatek

   WARSTWA PODSTAWOWA (bez JS-a): canvas znika, zostaje <img> z <noscript>,
   czyli pierwsza klatka. Sekcja nigdy nie pokazuje pustego kwadratu. */
.stage{position:relative;max-width:var(--seq-max);margin-inline:auto}
.seq{position:relative}
html:not(.js) .seq-canvas{display:none}
.seq img{width:100%;height:auto}
.inside-tag{display:none}

/* WARSTWA ANIMOWANA. Klatki rysuje prezentacja.js; CSS odpowiada wylacznie
   za wtopienie kadru w tlo i za etykiety. */
html.js .seq-canvas{display:block;width:100%;height:auto}

/* Klatki maja ciemne studyjne tlo (nie alfe), wiec kwadrat kadru bylby widoczny
   jako jasniejszy prostokat na --bg. Maska wygasza brzegi do zera, winieta
   dokłada zaciemnienie naroznikow. Maska siedzi na .seq, NIE na .stage:
   inaczej zjadlaby takze etykiety. */
.seq{
  -webkit-mask-image:radial-gradient(closest-side,#000 50%,transparent 95%);
          mask-image:radial-gradient(closest-side,#000 50%,transparent 95%);
}
/* Tlo klatek to ciemne studio (szary granat), a nie --bg strony, wiec sama
   maska zostawia szara poswiate w polowie drogi do krawedzi. Nakladka dociaga
   brzegi do koloru tla — dlatego jej kolor MUSI byc rowny --bg. */
.seq::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(closest-side,transparent 62%,rgba(7,11,10,.85) 100%);
}

/* Etykiety wnetrza. WEWNATRZ kadru nie ma dla nich miejsca — produkt wypelnia
   go niemal po brzegi i tekst ladowal na modulach albo na drzwiach. Stoja wiec
   w prawym marginesie, w tej samej kolumnie co spec-tagi (te sa odsuniete na
   12 % i 88 %, zeby zrobic miejsce), i wchodza dopiero przy otwartych drzwiach. */
html.js .inside-tag{
  display:flex;position:absolute;left:100%;margin-left:40px;flex-direction:column;gap:2px;
  align-items:flex-start;text-align:left;transform:translateY(-50%);
  font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--mut);white-space:nowrap;opacity:var(--lab,0);pointer-events:none;
  /* Etykieta przechodzi nad ciemnym tlem I nad jasna blacha obudowy — bez
     poswiaty poczatek slowa gubil sie na blasze („STEROWANIE" czytalo sie
     jako „EROWANIE"). */
  text-shadow:0 0 3px rgba(4,8,7,.95),0 1px 12px rgba(4,8,7,.9);
}
html.js .inside-tag .v{color:var(--ink);font-size:13px;letter-spacing:.06em;text-transform:none}
html.js .inside-tag .lead-line{
  position:absolute;top:50%;right:100%;margin-right:10px;width:30px;height:1px;background:var(--line);
}
html.js .inside-tag .lead-line::after{
  content:"";position:absolute;top:-2px;left:-2px;width:5px;height:5px;border-radius:50%;
  background:var(--amber);
}

@media(max-width:1200px){
  /* Waski pulpit: margines miedzy kadrem a etykietami zjada sie pierwszy,
     inaczej dluzsze napisy wychodza poza okno. */
  html.js .inside-tag{margin-left:14px}
}

@media(prefers-reduced-motion:reduce){
  /* Bez ruchu, ale i bez utraty tresci: prezentacja.js rysuje ostatnia klatke
     (produkt otwarty), etykiety stoja widoczne. */
  html.js .inside-tag{opacity:1}
}

@media(max-width:860px){
  /* Na waskim ekranie znaczniki nie maja gdzie stanac obok kadru: schodza
     pod kadr jako zwykla lista i zostaja czytelne. Etykiety wnetrza znikaja —
     w kolumnie 390 px nie maja gdzie stanac obok wiezy. */
  .spec-tag{position:static;transform:none;align-items:flex-start;text-align:left}
  .spec-tag .lead-line{display:none}
  /* Znaczniki zeszly pod kadr, wiec wciecie na nie jest juz tylko strata
     szerokosci — a kadru w kolumnie 390 px nie ma czym nadrabiac. */
  .shot-frame{display:flex;flex-direction:column;gap:14px;padding-inline:0}
  .shot-frame .stage{order:-1}
  html.js .inside-tag{display:none}
}

/* ------------------------------------------------------------ 04 detale */

/* WARSTWA PODSTAWOWA — to, co widac bez JS-a i przy prefers-reduced-motion:
   dokladnie ta sama siatka, co przed przebudowa na linie inspekcji.
   Cala mechanika pozioma siedzi nizej, pod html.js. Dzieki temu sekcja nie ma
   stanu posredniego: albo siatka, albo pelna linia. */
.detale-track{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:20px;margin-top:48px}
.detale-hud{display:none}
.detal{
  position:relative;border:.5px solid var(--line-soft);border-radius:16px;overflow:hidden;
  background:var(--panel);transition:border-color .4s,transform .4s;
}
.detal:hover{border-color:rgba(230,169,58,.45);transform:translateY(-4px)}
.detal:focus-visible{outline:2px solid var(--hi);outline-offset:3px}
/* Zdjecia sa juz przemapowane na grafit, wiec filtr tylko lekko je przygasza
   do czasu najechania — bez drugiego odbarwiania. */
.detal-media{display:block;overflow:hidden}
.detal img{width:100%;aspect-ratio:4/3;object-fit:cover;filter:brightness(.85);transition:filter .5s,transform .8s}
.detal:hover img{filter:brightness(1.05)}
.detal .cap{padding:20px 22px 24px}
.detal .cap h3{font-size:15px;font-weight:700;letter-spacing:.04em;margin-bottom:8px}
.detal .cap p{color:var(--dim);font-size:14px;line-height:1.6}
.detal .idx{
  position:absolute;top:14px;left:16px;z-index:2;
  font-family:var(--mono);font-size:11px;letter-spacing:.2em;color:var(--hi);
  background:rgba(7,11,10,.7);padding:4px 9px;border-radius:20px;backdrop-filter:blur(6px);
}
.detal-end{display:flex;align-items:center;background:var(--panel);border-color:var(--line)}
.detal-end .cap{padding:34px 30px}
.detal-end .cap h3{font-size:clamp(19px,1.7vw,26px);line-height:1.15;margin-bottom:14px}
.detal-end .cap p{margin-bottom:26px}
.detal-end:hover{transform:none}

/* ================================================== korytarz techniczny 04-11

   Osiem sekcji plus slajd domykajacy jada poziomo w jednym przyklejonym kadrze.
   Cala mechanika wisi pod html.js i powyzej 860 px — bez skryptu, na waskim
   ekranie i przy ograniczonym ruchu sekcje wracaja do pionu, a kolejnosc tresci
   w DOM jest ta sama w obu wariantach.

   Wysokosc .hchapter ustawia hchapter.js (suma odcinkow + 100vh): odcinki sa
   deklarowane per sekcja w data-span i CSS nie potrafi ich zsumowac.          */

@media(min-width:861px){
  /* z-index 10 jak w regule `section` — i to nie jest ozdoba. Przyklejony .pin
     i tor z will-change:transform tworza wlasne konteksty ukladania, wiec bez
     tego caly rozdzial ladowal PONIZEJ winiety (z-index 1) i ziarna (z-index 2):
     tresc slajdow byla przygaszona, jakby nie odpalily sie wejscia. */
  html.js .hchapter{position:relative;z-index:10}
  html.js .hchapter .pin{position:sticky;top:0;height:100svh;overflow:hidden}

  html.js .htrack{
    display:flex;align-items:stretch;height:100%;width:max-content;
    will-change:transform;
  }

  /* Slajd = ta sama <section>, co w pionie. Odstepy .sec zamieniamy na kadr
     pelnoekranowy: 96 px u gory pod nawigacje, 92 px u dolu pod HUD rozdzialu. */
  html.js .hslide{
    position:relative;flex:none;width:100vw;height:100svh;overflow:hidden;
    /* `safe center`, nie zwykle `center`. Zwykle wysrodkowanie obcina nadmiar
       SYMETRYCZNIE, wiec tresc wyzsza niz kadr traci takze GORE — razem
       z naglowkiem, czyli z jedyna rzecza, ktora mowi, co to za sekcja.
       Wariant `safe` przy nadmiarze zachowuje sie jak flex-start: obciete
       zostaje tylko to, co nie miesci sie na dole.
       Silniki, ktore nie znaja slowa `safe`, odrzuca cala deklaracje i dostana
       flex-start — czyli ten sam bezpieczny kierunek, tylko bez centrowania. */
    display:flex;flex-direction:column;justify-content:safe center;
    padding:96px 0 92px;border-top:0;
  }
  /* Slajd 06 zostaje pelnoekranowy — powody w naglowku sections/dane.php. */
  html.js .hslide--wide-detale{width:200vw}

  /* Na niskich ekranach (1366x768 i podobne laptopy) kadr slajdu oddaje
     zawartosci czesc wlasnych odstepow, zamiast zmuszac do dalszego
     zmniejszania typografii. Nawigacja ma ~62 px, HUD rozdzialu ~40 px razem
     z odstepem od dolu — 84/76 nadal ich nie dotyka. */
  @media(max-height:820px){
    html.js .hslide{padding:84px 0 76px}
  }

  /* content-visibility ma sens przy pionowym przewijaniu; w korytarzu caly
     rozdzial i tak wchodzi do kadru naraz, a containment psulby pomiary. */
  html.js .hchapter .lazy-sec{content-visibility:visible;contain-intrinsic-size:auto}

  /* Ghost-typografia slajdu. Tekst bierzemy z data-ghost, wiec nie ma drugiej
     kopii w DOM (czytnik ekranu nie przeczyta jej dwa razy). Przesuniecie
     wchodzi zmienna --gx, bo pseudoelementu nie da sie dosiegnac z JS. */
  html.js .hslide::before{
    content:attr(data-ghost);
    position:absolute;left:50%;top:50%;z-index:0;pointer-events:none;
    transform:translate(calc(-50% + var(--gx,0px)),-50%);
    font-family:var(--disp);font-weight:800;font-size:24vw;line-height:.8;
    letter-spacing:-.03em;white-space:nowrap;
    color:transparent;-webkit-text-stroke:1px rgba(238,242,238,.10);
  }
  html.js .hslide > *{position:relative;z-index:1}

  /* --- slajd 06: cala specyfikacja w jednym kadrze --------------------------
     Tabela ma 16 wierszy i w domyslnym rytmie nie miesci sie w 100svh: naglowek
     wyjezdzal poza gore slajdu, a ostatnie wiersze byly przyciete. Zageszczamy
     wiersze i lekko zmniejszamy krok — tresc bez zmian. */
  html.js .hslide--dane .wrap{max-width:none;width:100%}
  html.js .hslide--dane .wrap + .wrap{margin-top:12px}
  html.js .hslide--dane .spec{grid-template-columns:1fr min(34vw,520px);gap:56px;margin-top:0}
  html.js .hslide--dane h2{font-size:clamp(24px,2.5vw,36px)}
  html.js .hslide--dane .spec-table{font-size:12.5px}
  html.js .hslide--dane .spec-table th,
  html.js .hslide--dane .spec-table td{padding:3px 0}
  html.js .hslide--dane .spec-aside{padding:22px}
  html.js .hslide--dane .spec-aside .note{display:none}

  /* --- slajd 09: panel oferty usługi ----------------------------------------
     Panel ma własny, hojny padding (do 56 px) i drugi akapit prawny — razem
     przekraczało kadr na 768 px. */
  html.js #dokumentacja .doc-panel{padding:clamp(24px,3vw,40px)}
  html.js #dokumentacja h2{font-size:clamp(24px,2.5vw,36px);max-width:30ch}
  html.js #dokumentacja .eyebrow{margin-bottom:14px}
  html.js #dokumentacja .lead{font-size:15px;max-width:80ch;margin-top:14px}
  html.js #dokumentacja .btn{margin-top:24px !important;padding:16px 30px}
  html.js #dokumentacja .note{margin-top:20px;max-width:90ch}
  /* Elementy przypiete do krawedzi kadru na slajdach panoramicznych.
     Wartosc --hpx liczy silnik: kontruje panorame slajdu, wiec naglowek stoi
     przy lewej krawedzi, a panel z cena przy prawej.
     position:sticky NIE zadziala: sticky reaguje na przewijanie kontenera,
     a tu ruch robi transform.
     transition MUSI byc bez transformu — te elementy sa takze .reveal, a
     przejscie .9 s goniloby wartosc przeliczana co klatke i element zostawalby
     o sekunde z tylu, czyli nigdy nie dojezdzal. */
  html.js .hslide [data-hpin]{
    transform:translateX(var(--hpx,0px));will-change:transform;
    transition:opacity .9s;
  }
  html.js .hslide--dane .spec-aside{position:relative;top:0;z-index:2}

  /* --- slajd 11: karty + rysunek porownawczy w jednym kadrze ---------------
     Rysunek doszedl pod karty, wiec karty musza oddac mu miejsce. Tresc bez
     zmian — schodzi wylacznie rytm pionowy. */
  html.js #warianty h2{font-size:clamp(24px,2.5vw,36px)}
  html.js #warianty .eyebrow{margin-bottom:14px}
  html.js #warianty .cards{margin-top:22px;gap:18px}
  html.js #warianty .card{padding:20px 22px}
  html.js #warianty .card h3{font-size:15px}
  html.js #warianty .card p{font-size:14px;line-height:1.5}
  html.js #warianty .rys{margin-top:16px}
  html.js #warianty .rys-svg{height:26svh;max-height:230px}
  html.js #warianty .note{margin-top:14px}

  /* --- slajd 05: termika w jednym kadrze ------------------------------------
     Ten sam zabieg co przy slajdzie 06: tresc bez zmian, gestszy rytm.
     Cel to 1366x768 z zapasem — na tej wysokosci kadr ma 768 - 96 - 92 = 580 px
     na zawartosc, a pelny rytm pionowy potrzebowal ponad 700. */
  html.js #klimat .tw{gap:40px;align-items:center}
  html.js #klimat h2{font-size:clamp(24px,2.5vw,36px)}
  html.js #klimat .eyebrow{margin-bottom:14px}
  html.js #klimat .lead{max-width:44ch;font-size:15px;margin-top:12px}
  html.js #klimat .ticks{gap:6px;margin-top:2px}
  html.js #klimat .ticks li{font-size:13.5px;line-height:1.5}
  html.js #klimat .metrics{margin-top:16px}
  html.js #klimat .metric{padding:14px 16px}
  html.js #klimat .metric .n{font-size:28px}
  html.js #klimat .metric .u{margin-top:5px;font-size:10px}
  /* Podglad termiczny ma proporcje 4/5 i przy szerokiej kolumnie rosnie wyzej
     niz kadr. Ograniczamy go przez SZEROKOSC wyliczona z dopuszczalnej
     wysokosci — samo `max-height` splaszczyloby proporcje, a `margin-inline:auto`
     bez jawnej szerokosci odbiera elementowi rozciaganie w gridzie
     (marginesy auto wygrywaja ze stretch) i panel schodzi do 2 px. */
  html.js #klimat .thermal{width:min(100%,calc(52svh * 0.8));margin-inline:auto}

  /* --- slajd 04: karty w rzedzie, bez wlasnego pinu i wlasnego toru --------- */
  html.js .hslide--wide-detale .wrap{max-width:none;width:100%}
  html.js .detale-viewport{overflow:visible;margin-top:40px}
  html.js .detale-track{
    display:flex;align-items:stretch;gap:40px;width:auto;margin:0;
    padding:0 var(--pad);transform:none;
  }
  html.js .detale-track .detal{
    flex:1 1 0;min-width:0;
    /* skala i krycie licza sie z pozycji karty w kadrze — kazda klatka ma juz
       wartosc docelowa, wiec zadnych przejsc poza obramowaniem */
    transition:border-color .4s;will-change:transform,opacity;
  }
  html.js .detale-track .detal:hover{transform:none}
  /* Kadr 4/3 przy czterech kartach w rzedzie robi ~440 px samego zdjecia —
     razem z podpisem nie miesci sie na 768 px wysokosci. Zdjecia detali sa
     zblizeniami, wiec nizszy kadr niczego nie gubi. */
  /* height:auto jest tu konieczne: atrybuty width/height na <img> dzialaja jak
     wskazowki prezentacyjne, czyli jak wysokosc w CSS. Dopoki wysokosc nie jest
     `auto`, aspect-ratio jest ignorowane — kadr zostawal 640x480 mimo reguly. */
  html.js .detale-track .detal img{aspect-ratio:15/8;height:auto}
  html.js .detale-track .detal .cap{padding:12px 16px 14px}
  html.js .detale-track .detal .cap h3{margin-bottom:6px}
  html.js .detale-track .detal .cap p{font-size:13px;line-height:1.5}
  html.js .hslide--wide-detale h2{font-size:clamp(24px,2.4vw,34px)}
  html.js .hslide--wide-detale .lead{font-size:15px;margin-top:12px;max-width:110ch}
  html.js .hslide--wide-detale .detale-viewport{margin-top:12px}
  html.js .detale-track .detal img{will-change:transform}
  html.js .hchapter .detale-hud{display:none}

  /* --- HUD rozdzialu -------------------------------------------------------- */
  html.js .hchapter .hhud{
    position:absolute;left:var(--pad);right:var(--pad);bottom:26px;z-index:5;
    display:flex;align-items:center;gap:20px;
    font-family:var(--mono);font-size:12px;letter-spacing:.24em;
    text-transform:uppercase;color:var(--mut);
  }
  html.js .hchapter .hhud-idx b{color:var(--hi);font-weight:400}
  html.js .hchapter .hhud-label{color:var(--dim);white-space:nowrap}
  html.js .hchapter .hhud-label::before{content:"\00b7\00a0";color:var(--mut)}
  html.js .hchapter .hhud-bar{flex:1;height:2px;background:var(--line);overflow:hidden}
  html.js .hchapter .hhud-bar i{display:block;height:100%;width:0;background:var(--amber)}
}

/* Poza korytarzem HUD rozdzialu nie ma czego pokazywac. */
.hchapter .hhud{display:none}

/* --- ponizej 860 px: bez pinowania, natywny snap poziomy --- */

@media(max-width:860px){
  html.js .detale-viewport{
    overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;
    margin-top:40px;scrollbar-width:none;
  }
  html.js .detale-viewport::-webkit-scrollbar{display:none}
  html.js .detale-track{
    --det-w:min(78vw,420px);
    display:flex;gap:20px;margin:0;width:max-content;
    /* To samo co na desktopie: bez tego wciecia snap nie ustawi na srodku
       ani pierwszej, ani ostatniej karty. */
    padding:0 calc(50vw - var(--det-w) / 2);
  }
  html.js .detale-track .detal{flex:none;width:var(--det-w);scroll-snap-align:center}
  html.js .detale-hud{display:flex;align-items:center;gap:16px;padding:18px var(--pad) 0}
  html.js .detale-count{font-family:var(--mono);font-size:12px;letter-spacing:.24em;color:var(--mut)}
  html.js .detale-count b{color:var(--hi);font-weight:400}
  html.js .detale-bar{flex:1;height:2px;background:var(--line);display:block;overflow:hidden}
  html.js .detale-bar i{display:block;height:100%;width:0;background:var(--amber)}
}

/* ------------------------------------------------------------ 05 klimat */

.tw{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:center}
.metrics{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;margin-top:42px;background:var(--line);border:.5px solid var(--line);border-radius:14px;overflow:hidden}
.metric{background:var(--graphite);padding:24px 22px}
.metric .n{font-family:var(--disp);font-weight:800;font-size:40px;color:var(--amber);line-height:1}
.metric .u{font-family:var(--mono);font-size:11px;letter-spacing:.08em;color:var(--mut);margin-top:10px}
.thermal{position:relative;aspect-ratio:4/5;border-radius:18px;background:#0d1418;border:.5px solid var(--line);overflow:hidden}
.thermal .layer{position:absolute;border-radius:12px}
.tl1{inset:8%;background:linear-gradient(135deg,#12303f,#1a4257);opacity:.9}
.tl2{inset:20%;background:linear-gradient(135deg,#2E6F95,#3a86ad)}
.tl3{inset:34%;background:linear-gradient(135deg,#F2A83B,#F7D774);box-shadow:0 0 60px rgba(247,215,116,.5)}
.tl4{inset:46%;background:radial-gradient(circle,#F7D774,#F2A83B);animation:pulse 3s ease-in-out infinite}
@keyframes pulse{50%{transform:scale(1.06)}}
.thermal .cap{position:absolute;bottom:16px;left:16px;font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:#cfd6da}
.thermal .cap b{color:var(--hi)}
.scan{position:absolute;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,#F7D774,transparent);opacity:.7;animation:scan 4s linear infinite}
@keyframes scan{0%{top:6%}100%{top:94%}}

/* -------------------------------------------------------------- 06 dane */

.spec{display:grid;grid-template-columns:1.1fr .9fr;gap:56px;margin-top:44px;align-items:start}
.spec-table{width:100%;border-collapse:collapse;font-size:14px}
.spec-table th,.spec-table td{text-align:left;padding:13px 0;border-bottom:.5px solid var(--line-soft);vertical-align:top}
.spec-table th{font-family:var(--mono);font-weight:400;font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--mut);width:44%}
.spec-table td{color:var(--ink)}

@media(max-width:560px){
  /* Na 390 px kolumna z nazwa parametru mialaby ~150 px i lamala sie na trzy
     linie, a wartosc obok na cztery. Zamiast sciskac dwie kolumny, kladziemy
     klucz NAD wartoscia — wiersz robi sie wyzszy, ale nic sie nie lamie
     w polowie slowa. Tabela zostaje tabela (semantyka i czytnik ekranu),
     zmienia sie tylko sposob wyswietlania. */
  .spec-table,.spec-table tbody,.spec-table tr,.spec-table th,.spec-table td{display:block;width:auto}
  .spec-table tr{padding:12px 0;border-bottom:.5px solid var(--line-soft)}
  .spec-table th,.spec-table td{border:0;padding:0}
  .spec-table th{width:auto;margin-bottom:5px}
  .spec-table td{font-size:15px;line-height:1.45}
}
.spec-aside{position:sticky;top:110px;border:.5px solid var(--line);border-radius:16px;padding:28px;background:var(--panel)}
.spec-aside h3{font-size:16px;margin-bottom:8px}
.spec-aside p{color:var(--dim);font-size:14px}
.spec-price{font-family:var(--mono);font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--hi);margin:20px 0 24px}
.badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:26px}
.badge{
  font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--dim);
  border:.5px solid var(--line);border-radius:40px;padding:7px 14px;
}

/* ---------------------------------------------------- 07 kompatybilnosc */

.compat{background:var(--graphite);padding:clamp(70px,9vh,120px) 0;overflow:hidden;border-top:.5px solid var(--line-soft)}
.compat .lbl{text-align:center;font-family:var(--mono);font-size:11px;letter-spacing:.3em;text-transform:uppercase;color:var(--mut);margin-bottom:26px}
.marq{display:flex;white-space:nowrap;overflow:hidden;
  mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}
.marq .track{display:flex;animation:marq 30s linear infinite}
.marq span{
  font-family:var(--disp);font-weight:800;font-size:clamp(26px,3.4vw,46px);text-transform:uppercase;
  color:transparent;-webkit-text-stroke:1px rgba(238,242,238,.28);padding:0 32px;
  transition:color .3s,-webkit-text-stroke .3s;
}
.marq span:hover{color:var(--hi);-webkit-text-stroke:1px var(--hi)}
@keyframes marq{to{transform:translateX(-50%)}}
.compat-logos{display:flex;flex-wrap:wrap;gap:34px;justify-content:center;align-items:center;margin-top:46px;padding:0 var(--pad)}
.compat-logos img{height:26px;width:auto;opacity:.45;filter:grayscale(1) brightness(2.4);transition:opacity .3s,filter .3s}
.compat-logos img:hover{opacity:.95;filter:grayscale(0) brightness(1.5)}

/* -------------------------------------------------------------- 08 ppoz */

.split{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:start}
.ticks{list-style:none;display:flex;flex-direction:column;gap:12px;margin-top:8px}
.ticks li{position:relative;padding-left:30px;color:var(--dim);font-size:15px}
.ticks li::before{
  content:"";position:absolute;left:0;top:.6em;width:12px;height:1px;background:var(--amber);
}
.ticks li b{color:var(--ink);font-weight:700}

/* ------------------------------------------------------ 09 dokumentacja */

.doc-panel{
  border:.5px solid var(--line);border-radius:20px;padding:clamp(28px,4vw,56px);
  background:linear-gradient(160deg,rgba(230,169,58,.07),transparent 55%),var(--panel);
}
.doc-panel h2{max-width:22ch}

/* ------------------------------------------------------------ 10 polska */

.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1px;margin-top:44px;background:var(--line);border:.5px solid var(--line);border-radius:16px;overflow:hidden}
.stat{background:var(--graphite);padding:26px 24px}
.stat .n{font-family:var(--disp);font-weight:800;font-size:30px;color:var(--hi)}
.stat .t{font-family:var(--mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--mut);margin:8px 0 10px}
.stat p{color:var(--dim);font-size:14px;line-height:1.6}

/* ---------------------------------------------------------- 11 warianty */

.cards{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:44px}
/* Rysunek porownawczy wariantow — geometria liczona w PHP z ES_PRODUCTS,
   tutaj wylacznie kreska. Zadnych wypelnien: to rysunek techniczny, nie ikona. */
.rys{margin-top:26px}
.rys-svg{width:100%;height:34svh;max-height:300px;display:block;overflow:visible}
.rys-korpus{fill:none;stroke:rgba(238,242,238,.8);stroke-width:1.4}
.rys-drzwi{stroke:var(--amber);stroke-width:1.2}
.rys-zawias{stroke:var(--amber);stroke-width:2}
.rys-noga{stroke:rgba(238,242,238,.8);stroke-width:1.4}
/* Krawedz niewidoczna z tylu bryly — kreskowana i przygaszona, jak na rysunku
   wykonawczym; pelna linia sugerowalaby podzial na froncie. */
.rys-ukryta{stroke:rgba(238,242,238,.28);stroke-width:1;stroke-dasharray:5 5}
.rys-baza{stroke:rgba(238,242,238,.18);stroke-width:1}
.rys-wym{stroke:var(--mut);stroke-width:1;color:var(--mut)}
.rys-etykieta,.rys-adnotacja{fill:var(--mut);font-family:var(--mono);font-size:19px;letter-spacing:.08em}
.rys-nazwa{fill:var(--ink);font-family:var(--mono);font-size:21px;letter-spacing:.16em}
.rys-roadmapa{fill:var(--hi);font-family:var(--mono);font-size:17px;letter-spacing:.22em;text-transform:uppercase}

@media(max-width:860px){
  /* Rysunek skaluje sie do szerokosci kadru, wiec na 390 px viewBox 1400
     zjezdza do skali 0.25 — etykieta 19 px stawala sie 4,8 px na ekranie.
     Rozmiary sa w jednostkach viewBoksu, wiec mnozymy je tak, zeby po skali
     wyszlo >= 10 px. Kreski tez, inaczej gina. */
  .rys-svg{height:auto;max-height:none;aspect-ratio:1400/320}
  .rys-etykieta{font-size:40px}
  .rys-nazwa{font-size:40px}
  /* Co znika na waskim ekranie i dlaczego: przy skali 0,25 wszystkie podpisy
     naraz zachodza na siebie. Zostaje to, czego nie ma gdzie indziej —
     porownanie sylwetek i szerokosc. Wysokosc, glebokosc i dopisek o roadmapie
     stoja wypisane slowami w kartach TUZ NAD rysunkiem. */
  .rys-wym--h,.rys-etykieta--h,.rys-adnotacja,.rys-roadmapa{display:none}
  .rys-korpus,.rys-noga{stroke-width:3}
  .rys-drzwi{stroke-width:2.6}
  .rys-zawias{stroke-width:4}
  .rys-ukryta{stroke-width:2;stroke-dasharray:8 8}
  .rys-wym{stroke-width:2}
  .rys-baza{stroke-width:2}
}

.card{
  border:.5px solid var(--line);border-radius:20px;padding:32px;background:var(--panel);
  transition:border-color .4s,transform .4s;
}
.card:hover{border-color:rgba(247,215,116,.4);transform:translateY(-4px)}
.card .kicker{font-family:var(--mono);font-size:11px;letter-spacing:.24em;text-transform:uppercase;color:var(--amber);margin-bottom:14px}
.card h3{font-size:20px;margin-bottom:12px}
.card p{color:var(--dim);font-size:15px}
.card .dims{font-family:var(--mono);font-size:12px;color:var(--mut);margin-top:18px;letter-spacing:.06em}
.card--soon{opacity:.82}

/* ----------------------------------------------------------- 12 partner */

.partner-panel{
  border:.5px solid var(--line);border-radius:20px;overflow:hidden;
  display:grid;grid-template-columns:1.2fr 1fr;background:var(--panel);
}
.partner-panel > div{padding:clamp(28px,4vw,52px)}
.partner-side{background:linear-gradient(180deg,rgba(46,111,149,.16),transparent);border-left:.5px solid var(--line-soft)}
.partner-side h3{font-size:15px;margin-bottom:16px}

/* --------------------------------------------------------------- 13 faq */

.faq-list{margin-top:40px;border-top:.5px solid var(--line-soft)}
.faq-item{border-bottom:.5px solid var(--line-soft)}
.faq-q{
  width:100%;background:none;border:0;cursor:pointer;color:var(--ink);text-align:left;
  font-family:var(--disp);font-weight:700;font-size:clamp(15px,1.6vw,18px);letter-spacing:-.01em;
  padding:22px 40px 22px 0;position:relative;
}
.faq-q::after{
  content:"+";position:absolute;right:6px;top:50%;transform:translateY(-50%);
  font-family:var(--mono);font-size:20px;color:var(--amber);transition:transform .3s;
}
.faq-item.open .faq-q::after{transform:translateY(-50%) rotate(45deg)}
.faq-a{max-height:0;overflow:hidden;transition:max-height .45s cubic-bezier(.2,.8,.2,1)}
.faq-a p{color:var(--dim);font-size:15px;padding-bottom:24px;max-width:76ch}

/* ------------------------------------------------------------ 14 wycena */

.form{display:grid;grid-template-columns:repeat(2,1fr);gap:18px;margin-top:40px}
.form .full{grid-column:1/-1}
.field{display:flex;flex-direction:column;gap:8px}
.field label{font-family:var(--mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--mut)}
.field input,.field select,.field textarea{
  background:rgba(238,242,238,.04);border:.5px solid var(--line);border-radius:10px;
  color:var(--ink);font-family:var(--body);font-size:15px;padding:14px 16px;
  transition:border-color .3s,background .3s;
}
.field input:focus,.field select:focus,.field textarea:focus{
  outline:none;border-color:var(--amber);background:rgba(238,242,238,.06);
}
.field textarea{resize:vertical;min-height:120px}
.field select option{background:var(--graphite);color:var(--ink)}
.consent{display:flex;gap:12px;align-items:flex-start;color:var(--mut);font-size:13px;line-height:1.6}
.consent input{margin-top:3px;accent-color:var(--amber);width:16px;height:16px;flex:none}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

/* ------------------------------------------------------------- 15 final */

.final{min-height:80svh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:clamp(90px,12vh,140px) var(--pad)}
.final h2{font-size:clamp(34px,6vw,84px);line-height:1}
.final h2 .ghost{display:block;color:transparent;-webkit-text-stroke:1px rgba(238,242,238,.3)}
.final p{margin-top:22px;color:var(--dim);max-width:460px}
.final .meta{margin-top:52px;font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--mut);display:flex;gap:32px;flex-wrap:wrap;justify-content:center}
.final .meta b{color:var(--ink);font-weight:400}

/* ------------------------------------------------------------- stopka */

.footer{position:relative;z-index:10;background:var(--bg);border-top:.5px solid var(--line-soft)}
.footer-in{
  max-width:var(--maxw);margin:0 auto;padding:60px var(--pad) 40px;
  display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr;gap:40px;
}
.footer-brand p{color:var(--mut);font-size:14px;margin-top:16px;max-width:34ch}
.footer-logo{color:var(--ink)}
.footer-col h3{font-family:var(--mono);font-weight:400;font-size:11px;letter-spacing:.24em;color:var(--hi);margin-bottom:16px;text-transform:uppercase}
.footer-col a,.footer-col span{display:block;color:var(--dim);font-size:14px;padding:4px 0;transition:color .25s}
.footer-col a:hover{color:var(--amber)}
.footer-bar{
  max-width:var(--maxw);margin:0 auto;padding:20px var(--pad) 30px;
  display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap;
  font-family:var(--mono);font-size:10px;letter-spacing:.1em;color:#3f4845;
  border-top:.5px solid var(--line-soft);
}

/* ------------------------------------------------------ strony wewnetrzne */

.page{padding:150px var(--pad) 100px;max-width:900px;margin:0 auto}
.page h1{font-size:clamp(30px,4.6vw,54px);margin-bottom:24px}
.page h2{font-size:clamp(20px,2.4vw,28px);margin:44px 0 14px}
.page h3{font-size:16px;margin:28px 0 10px;text-transform:none;letter-spacing:0}
.page p,.page li{color:var(--dim);margin-bottom:12px}
.page ul,.page ol{padding-left:22px;margin-bottom:16px}
.page a{color:var(--hi);text-decoration:underline;text-underline-offset:3px}
.page table{width:100%;border-collapse:collapse;margin:20px 0;font-size:14px}
.page th,.page td{text-align:left;padding:12px 0;border-bottom:.5px solid var(--line-soft)}
.page th{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--mut);width:42%}
.page td{color:var(--ink)}

/* ------------------------------------------------------------- mobile */

@media(max-width:1000px){
  .tw,.split,.spec,.cards,.partner-panel{grid-template-columns:1fr;gap:40px}
  .spec-aside{position:static}
  .model .pin{grid-template-columns:1fr}
  .footer-in{grid-template-columns:1fr 1fr;gap:32px}
}

/* Ponizej 860 px pole cząstek i model dostaja inny kadr: ksztalt ma byc
   MNIEJSZY i WYSRODKOWANY NAD tekstem, a nie za nim. Ustawienie kadru jest
   w JS (te same progi), tutaj tylko uklad tresci pod nim. */
/* Przycisk menu i nakladka — istnieja tylko ponizej 860 px. Na desktopie
   przycisk jest schowany, a nakladka nigdy sie nie otwiera. */
.nav-burger{display:none}
.nav-sheet[hidden]{display:none}
html.nav-open,html.nav-open body{overflow:hidden}
.nav-sheet{
  /* Nizej niz pasek (z-index 50 -> nav dostaje 70 przy otwartym menu), zeby
     przycisk zamkniecia zostal WIDOCZNY. Przy inset:0 i wyzszej warstwie
     nakladka zaslaniala wlasny X i menu nie dalo sie zamknac inaczej niz
     klawiszem Esc. */
  position:fixed;inset:0;z-index:60;
  background:rgba(7,11,10,.97);backdrop-filter:blur(16px);
  display:flex;align-items:center;justify-content:center;
}
html.nav-open .nav{z-index:70;background:rgba(7,11,10,.9)}
.nav-sheet-in{display:flex;flex-direction:column;gap:4px;width:100%;padding:0 var(--pad)}
.nav-sheet-in a{
  font-family:var(--mono);font-size:15px;letter-spacing:.18em;text-transform:uppercase;
  color:var(--mut);
  /* 56 px to cel dotyku z zapasem — pozycji jest szesc i maja stac luzno. */
  min-height:56px;display:flex;align-items:center;
  border-bottom:1px solid var(--line-soft);
}
.nav-sheet-in a:last-child{border-bottom:0}
.nav-sheet-cta{color:var(--amber) !important;margin-top:10px}

@media(max-width:860px){
  .nav-links{display:none}
  .nav-status{display:none}
  html.js .nav-burger{
    display:flex;flex-direction:column;justify-content:center;gap:4px;
    width:44px;height:44px;padding:0 10px;   /* 44 px = minimalny cel dotyku */
    background:none;border:0;cursor:pointer;
  }
  .nav-burger span{display:block;height:1.5px;background:var(--ink);transition:transform .25s,opacity .25s}
  .nav-burger[aria-expanded="true"] span:nth-child(1){transform:translateY(5.5px) rotate(45deg)}
  .nav-burger[aria-expanded="true"] span:nth-child(2){opacity:0}
  .nav-burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-5.5px) rotate(-45deg)}
  .nav-right{gap:10px}
  /* Logo, wycena i przycisk menu musza zmiescic sie w 360 px. */
  .nav-logo-svg{width:118px;height:14px}
  .nav-cta{padding:9px 16px;font-size:11px}

  /* Bez JS-a nakladki nie ma jak otworzyc, wiec przycisk znika, a odnosniki
     wracaja do paska — przewijanego, ale dostepnego. */
  /* Bez JS-a nakladki nie ma jak otworzyc, wiec przycisk znika, a odnosniki
     schodza do DRUGIEGO WIERSZA paska. W jednym wierszu nachodzily na logo:
     `.nav-links` jest elementem flex, ktory nie kurczy sie ponizej swojej
     tresci, wiec rozpychal sasiadow. */
  /* Klase `stuck` (tlo paska po przewinieciu) dopina JS, wiec bez niego pasek
     zostaje przezroczysty i tresc strony przebija przez odnosniki. */
  html:not(.js) .nav{
    flex-wrap:wrap;row-gap:10px;
    background:rgba(7,11,10,.92);backdrop-filter:blur(14px);
    border-bottom-color:var(--line-soft);
  }
  html:not(.js) .nav-links{
    display:flex;order:3;width:100%;gap:18px;
    overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
  }
  html:not(.js) .nav-links::-webkit-scrollbar{display:none}
  .hud-row{flex-direction:column;align-items:flex-start;gap:14px}
  .hud.right{display:none}
  .hint{order:-1}

  .forge{height:200vh}
  .forge .pin{align-items:flex-end}
  .forge-copy{
    margin:0 auto 8svh;max-width:none;width:100%;height:210px;
    padding:0 var(--pad);text-align:center;
  }
  .forge-copy::before{inset:-40px 0 -70px 0}   /* bez wystawania w bok — inaczej poziomy scroll na telefonie */
  .model{height:280vh}
  .model .pin{grid-template-rows:minmax(0,1fr) auto;align-content:center;gap:20px;padding-top:80px;padding-bottom:40px}
  .model-stage{height:42svh}
  .model-layer .ds{display:none}
  .form{grid-template-columns:1fr}
  /* 16 px to prog, ponizej ktorego iOS Safari sam przybliza strone przy
     wejsciu w pole — i juz z niej nie oddala. Zmierzone przed poprawka:
     wszystkie 11 pol mialo 15 px. */
  .field input,.field select,.field textarea{font-size:16px}
  /* Zapas na klawiature: pole dowozone do widoku ma nie konczyc sie tuz nad
     nia ani nie chowac pod przyklejona nawigacja. */
  .field input,.field select,.field textarea{scroll-margin:110px 0 140px}
  /* Cel dotyku: przed poprawka przycisk mial 37 px wysokosci. */
  .nav-cta{min-height:44px;display:inline-flex;align-items:center}
  .final .meta{gap:16px;flex-direction:column}
  .footer-in{grid-template-columns:1fr}
}

/* Pelny fallback dla osob z wylaczonymi animacjami: zero ruchu, model na
   statycznym renderze, tresc bez zmian. */
@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important}
  /* Ten sam problem specyficznosci co wyzej: samo `.reveal` (0,1,0) nie
     przebije bramki `html.js .reveal` (0,2,1). */
  html.js .reveal,.reveal{opacity:1;transform:none}
  .forge{height:auto}
  .forge .pin{position:static;height:auto;padding:80px 0}
  .forge-copy{height:auto;display:flex;flex-direction:column;gap:34px}
  .forge-copy .step{position:static;opacity:1 !important;transform:none !important}
  .model{height:auto}
  .model .pin{position:static;height:auto;padding-top:60px;padding-bottom:60px}
  .model-stage{height:52svh}
  .scan,.tl4{animation:none}
  .marq .track{animation:none}

  /* Korytarz techniczny schodzi do pionu — te same reguly, co bez JS-a.
     Specyfcznosc musi dorownac blokom html.js powyzej, stad ten sam prefiks;
     wygrywa kolejnoscia, bo ten blok jest na koncu pliku.
     Wysokosc .hchapter jest ustawiana inline przez silnik, wiec tutaj trzeba
     ja skasowac z !important — inny sposob nie przebije stylu z atrybutu. */
  html.js .hchapter{height:auto !important}
  html.js .hchapter .pin{position:static;height:auto;overflow:visible}
  html.js .htrack{display:block;width:auto;transform:none !important}
  html.js .hslide{
    display:block;width:auto !important;height:auto;overflow:visible;
    padding:clamp(80px,10vh,140px) 0;border-top:.5px solid var(--line-soft);
  }
  html.js .hslide::before{display:none}
  html.js .hchapter .hhud{display:none}
  html.js .hchapter .lazy-sec{content-visibility:auto}
  html.js .hslide [data-hpin]{transform:none !important}
  html.js .hslide--dane .spec-aside{position:sticky;top:110px}

  html.js .detale-hud{display:none}
  html.js .detale-viewport{overflow:visible}
  html.js .detale-track{
    display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
    gap:20px;margin-top:48px;padding:0;width:auto;transform:none !important;
  }
  html.js .detale-track .detal{
    width:auto;transform:none !important;opacity:1 !important;
  }
  html.js .detale-track .detal img{transform:none !important}
  html.js .detale-track .detal-media{clip-path:none !important}
}

/* ============================================ akcja przedpremierowa (v1.1) */

/* Odliczanie do premiery (inc/odliczanie.php, tyka ui.js). Cyfry tabularne:
   bez nich szerokosc „11" i „08" jest rozna i caly licznik drga co sekunde. */
.cd{display:inline-flex;flex-direction:column;gap:14px;font-family:var(--mono)}
.cd-head{display:flex;align-items:center;gap:10px;font-size:11px;letter-spacing:.22em;text-transform:uppercase}
.cd-head .k{color:#7d8a83}
.cd-head .v{color:var(--ink)}
.cd-head .v.a{color:var(--amber)}
.cd-dot{width:6px;height:6px;border-radius:50%;background:var(--amber);box-shadow:0 0 12px var(--amber);animation:blink 2.2s infinite}
.cd-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:.5px solid var(--line);border-radius:14px;
  background:linear-gradient(180deg,rgba(13,18,16,.78),rgba(7,11,10,.62));backdrop-filter:blur(6px);overflow:hidden}
.cd-cell{display:flex;flex-direction:column;align-items:center;gap:4px;padding:14px 10px 12px;min-width:84px}
.cd-cell + .cd-cell{border-left:.5px solid var(--line-soft)}
.cd-num{font-family:var(--disp);font-weight:800;font-size:clamp(28px,3.6vw,46px);line-height:1;color:var(--ink);
  font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.cd-cell:first-child .cd-num{color:var(--hi);text-shadow:0 0 34px rgba(247,215,116,.35)}
.cd-lbl{font-size:10px;letter-spacing:.28em;color:var(--mut)}
.cd--hero{margin-top:34px;align-items:center}
.cd--live .cd-head .v{font-size:13px}

/* Kotwica #premiera: sekcja final jest wyzsza od kadru, wiec skok ma trafic
   w naglowek, nie w srodek sekcji. */
.anchor{display:block;position:relative;top:-100px;visibility:hidden}
.final-cd{margin-top:34px}
.final-form{width:100%;max-width:620px;margin-top:30px;text-align:left}
.final-form .form{margin-top:0}
.final-partner{font-size:15px}
.final-partner a{color:var(--hi);text-decoration:underline;text-underline-offset:3px}

/* Formularz premierowy: pole i przycisk w jednym wierszu. */
.fp-row{display:flex;gap:14px;align-items:flex-end}
.fp-row .field{flex:1}
.fp-row .btn{padding:16px 28px;flex:none}
.fp-consents{display:flex;flex-direction:column;gap:12px}

/* ---------------------------------------------------- strona /partnerzy */

.p-hero{padding:150px 0 90px;position:relative}
.p-hero-in{display:grid;grid-template-columns:1.15fr .85fr;gap:clamp(30px,5vw,70px);align-items:center}
.p-hero h1{font-size:clamp(32px,4.4vw,62px);line-height:1.02}
.p-hero h1 em{font-style:normal;color:var(--hi)}
.p-cta{justify-content:flex-start}
.p-hero-img{margin:0;filter:drop-shadow(0 40px 80px rgba(0,0,0,.6))}
.p-hero-img img{width:100%;height:auto}
.p-types{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:44px}
.p-types .p-what{color:var(--ink);margin-top:12px}
.p-cd{margin-top:30px}
.partner-panel .cd-cell{min-width:0}

/* FAQ bez JS-a: akordeon nie ma jak sie otworzyc, wiec odpowiedzi stoja otwarte. */
html:not(.js) .faq-a{max-height:none}

/* ---------------------------------------------------------- poradnik */

.art{padding:150px var(--pad) 90px;max-width:820px;margin:0 auto}
.crumbs{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--mut);margin-bottom:26px}
.crumbs a{color:var(--dim)}
.crumbs a:hover{color:var(--hi)}
.art h1{font-size:clamp(28px,4vw,50px);line-height:1.05;margin-bottom:18px}
.art h1 em,.art-cta h2 em{font-style:normal;color:var(--hi)}
.art-meta{font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--mut);text-transform:uppercase;margin-bottom:34px}
.art-lead{font-size:19px;line-height:1.65;color:var(--ink);border-left:2px solid var(--amber);padding-left:20px;margin-bottom:10px}
.art h2{font-size:clamp(20px,2.4vw,28px);margin:48px 0 14px;text-transform:none;letter-spacing:-.01em}
.art h3{font-size:17px;margin:28px 0 10px;text-transform:none;letter-spacing:0}
.art p,.art li{color:var(--dim);margin-bottom:14px;font-size:17px}
.art ul,.art ol{padding-left:22px;margin-bottom:16px}
.art b,.art strong{color:var(--ink)}
.art a{color:var(--hi);text-decoration:underline;text-underline-offset:3px}
.art table{width:100%;border-collapse:collapse;margin:22px 0;font-size:15px}
.art th,.art td{text-align:left;padding:12px 10px 12px 0;border-bottom:.5px solid var(--line-soft);vertical-align:top}
.art th{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--mut)}
.art td{color:var(--ink)}
.art-cta{margin-top:54px;border:.5px solid var(--line);border-radius:20px;padding:clamp(24px,4vw,40px);background:var(--panel)}
.art-cta h2{margin-top:0;text-transform:uppercase}
.art-cta .hero-cta{justify-content:flex-start;margin-top:24px}
.art-list{display:grid;gap:18px;margin-top:40px}
.art-list .card h2{font-size:20px;margin:0 0 10px;text-transform:none}
.art-list .card a{text-decoration:none;color:inherit}

@media(max-width:1000px){
  .p-hero-in{grid-template-columns:1fr}
  .p-hero-img{max-width:520px}
  .p-types{grid-template-columns:1fr}
}
@media(max-width:860px){
  .cd-cell{min-width:0;padding:12px 4px 10px}
  .cd--hero{width:100%;max-width:360px}
  /* Hero urosl o licznik i drugi przycisk: pasek HUD na absolucie (bottom:26px)
     wchodzil na przycisk. Na waskim ekranie wraca do przeplywu pod trescia. */
  .hero{padding-bottom:40px}
  .hud-row{position:static;margin-top:44px;width:100%}
  .cd--hero .cd-grid{width:100%}
  .fp-row{flex-direction:column;align-items:stretch}
  .fp-row .btn{justify-content:center}
  .p-hero{padding:120px 0 60px}
  .art{padding-top:120px}
  .art p,.art li{font-size:16px}
  .art table{font-size:14px}
}
