/* ==========================================================================
   nis2-strona-glowna.css - warstwa wizualna strony głównej (`index.html`)

   Do 03.08.2026 plik nazywał się `landing-v5.css` (a wyrósł z `landing-v4.css`);
   nazwa opisuje teraz rolę, wersje żyją w gicie i w `_archiwum/`.

   Treść: scalenie `landing-v2-do-wyslania.html` i `landing-czysty.html`.
   Warstwa wizualna: przeniesiona z `landing-czysty.html`, bo to ona jest
   bliższa kanonowi elev8 i temu, co opisała Teresa 27.07.2026.

   Zasady, z których ta strona wyrasta:
   1. Trzy tła: biel, cichy wariant #FAF9F7 i granat. Zero cieni.
      Granat wchodzi trzy razy (28.07.2026), bo strona jasna od góry
      do dołu czytała się jak jeden ciąg bez kręgosłupa.
      Zaokrąglenia weszły 28.07.2026 na prośbę Teresy, wbrew kanonowi,
      i siedzą w jednym tokenie `--promien`.
   2. Każda sekcja ma inny rytm. Podział lewo/prawo tylko tam, gdzie treść
      jest długa i potrzebuje kotwicy. Nigdzie indziej.
   3. Jeden kolor akcentu plus przełamanie na terminy i liczby.
      Grafit robi całą resztę roboty.
   4. Powietrze zamiast ramek. Granice to włos 1px.
   5. Sekcje nie są numerowane.
   6. Rozmiar tekstu bierze się wyłącznie ze skali niżej. Żadnych wartości
      wprost w regule, żadnych połówek piksela (decyzja 28.07.2026: strona
      miała 32 różne rozmiary, w tym sześć nieodróżnialnych rozmiarów
      nagłówka sekcji).

   Paleta jedzie z dwóch zmiennych podmienianych atrybutem `data-akcent`
   na <html>, więc zmiana wariantu to jedno słowo w HTML.
   ========================================================================== */

/* --- wartosci: patrz assets/css/nis2-marka.css -----------------------------
   Do 09.08.2026 stal tutaj wlasny `:root` z 26 tokenami o wartosciach co do
   znaku identycznych z tymi w nis2-marka.css, plus oba warianty `data-akcent`.
   Ten arkusz laduje sie po marce, wiec kazdy z tych tokenow ja nadpisywal.
   Marka byla wiec zrodlem prawdy tylko z nazwy: zmiana wartosci w niej nie
   robila na tej stronie nic, a przestawienie czegokolwiek wymagalo poprawki
   w dwoch plikach naraz.

   Wartosci przeniesione bez zmiany. Doszly tam takze `--t-liczba`,
   `--t-liczba-xl`, `--akcent-baza` i `--przelamanie-baza`, ktore stały
   wylacznie tutaj, wiec podstrony nie mialy do nich dostepu.

   Ten plik od tego dnia MALUJE strone glowna i nie deklaruje zadnej wartosci
   marki. Nowy token zaklada sie w nis2-marka.css, nie tutaj.
   -------------------------------------------------------------------------- */


*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--tlo);
  color: var(--atrament);
  font: 400 var(--t-tekst)/1.65 Outfit, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  font-feature-settings: "kern", "liga";
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 { margin: 0; font-weight: 600; letter-spacing: -.024em; line-height: 1.16; }
p { margin: 0; }
a { color: inherit; }
img, svg { max-width: 100%; display: block; }
ul, ol, dl, dd { margin: 0; padding: 0; }
ul, ol { list-style: none; }

:focus-visible { outline: 2px solid var(--akcent); outline-offset: 3px; }

.miara { max-width: var(--miara); margin-inline: auto; padding-inline: clamp(20px, 5vw, 48px); }

.omin { position: absolute; left: -9999px; }
.omin:focus {
  position: fixed; left: 16px; top: 16px; z-index: 99;
  background: var(--atrament); color: #fff; padding: 12px 20px;
}

/* Etykieta wraca 12 razy przez cala strone, wiec to ona niesie przelamanie.
   Byla burgundowa i to przez nia czerwien czytala sie jako kolor wiodacy;
   burgund zostaje przy przyciskach. Odcien ciemniejszy z pary turkusowej,
   bo tekst jest maly i wersalikowy: #087F78 daje na bieli 4.86, a ten 5.47. */
.brew {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .15em;
  text-transform: uppercase; color: var(--wynik-ciemny);
}

/* --- pasek górny --------------------------------------------------------- */

.postep {
  position: fixed; top: 0; left: 0;
  height: 2px; width: 0;
  background: var(--akcent);
  z-index: 60;
}

.gora {
  position: sticky; top: 0; z-index: 40;
  background: rgba(255, 255, 255, .93);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--wlos);
}
.gora .miara {
  position: relative;
  display: flex; align-items: center;
  gap: clamp(16px, 2.4vw, 32px);
  min-height: 71px;
}
.gora .dzialanie--maly { flex: none; }

/* Waga 500 i tracking .55em (09.08.2026, Dominik: "popraw to tak by to bylo
   podobne jak logo, by to szlo ciagiem").

   Znak stoi w parze z sygnatura "BY elev8" i ma z nia trzymac jeden rytm.
   Przy wadze 600 i trackingu .1em para czytala sie jak dwa napisy z dwoch
   roznych systemow: jeden gesty i ciezki, drugi lekki i rozstrzelony.

   Tracking nie jest dobrany na oko. W `elev8-logo-navy.svg` odstepy miedzy
   literami wynosza 1198, 1160, 1198 i 1296 jednostek przy wersaliku 694, wiec
   kazda litera zajmuje 1.748 wysokosci wersalika. Przy 14 px wersalik ma
   okolo 10 px, czyli docelowy advance to 17.5 px. Zmierzone na zywym znaku:
   .5em daje 16.9 px, .55em trafia w 17.5. Stad ta wartosc, a nie okragle .5.

   Waga schodzi po stronie znaku, bo logo jest plikiem marki i jego kroju
   nie ruszamy. */
.znak {
  text-decoration: none; font-weight: 500; font-size: var(--t-nota);
  letter-spacing: .55em; text-transform: uppercase;
  /* Tracking dokleja odstep takze za ostatnia litera. Bez tego znak konczy sie
     8 px pustki i odstep do sygnatury czyta sie jak dziura. */
  margin-right: -.55em;
  white-space: nowrap; flex: none;
  /* Cel dotykowy min. 24 px: sam tekst ma 17 px wysokości. */
  display: inline-flex; align-items: center; min-height: 26px;
}

/* Sygnatura marki-matki obok znaku sekcji (09.08.2026, prosba Dominika).
   Logo bierze `elev8-logo-navy.svg` z kanonu marki, a nie png ze stopki:
   plik ma fill #17233D, czyli dokladnie `--atrament` tej strony, wiec to ten
   sam kolor marki, nie odcien dobrany na oko. SVG zamiast png takze dlatego,
   ze w pasku o wysokosci 70 px logo stoi na 15 px i rastr sie tam sypie.

   Slowo "by" jest o stopien nizej i w kolorze szeptu: to spojka miedzy dwiema
   nazwami, nie trzecia nazwa. Gdyby wzielo wage i kolor `.znak`, w pasku
   staloby obok siebie troje rownorzednego tekstu.

   Kreska pionowa zdjeta 09.08.2026 ("by to szlo ciagiem"). Stala tu, gdy znak
   mial tracking .1em i byl gestym blokiem, od ktorego sygnature trzeba bylo
   czyms odciac. Odkad znak ma rytm logo, kreska tnie jeden ciag na dwie
   polowy i robi dokladnie to, czego ma nie byc. Rozdziela teraz sam odstep. */
/* Sygnatura stoi POD znakiem, nie obok (09.08.2026, Dominik: "to BY (logo)
   moglo by byc pod NIS2"). Pion rozwiazuje przy okazji konflikt o szerokosc
   paska: dwa napisy w jednej linii mialy razem 261 px i wypychaly przycisk. */
.znak-blok {
  display: flex; flex-direction: column; align-items: flex-start;
  gap: 2px; flex: none;
}

.znak-by {
  display: inline-flex; align-items: center; gap: 6px;
  flex: none; text-decoration: none;
  /* Cel dotykowy min. 24 px (WCAG 2.5.8): sama para "by" plus logo ma 18 px.
     Zgubione przy przejsciu na uklad pionowy, zlapane przez kontrola.js. */
  min-height: 24px;
}
.znak-by__slowo {
  font-size: 11px; font-weight: 500;
  letter-spacing: .1em; text-transform: uppercase; color: var(--szept);
}
/* Logo na 12 px: tyle trzeba, zeby jego litery mialy dokladnie ta sama
   wysokosc co litery znaku nad nim (09.08.2026, "nie wyglada to tak samo").

   Rachunek: w pliku wersalik ma 694 jednostek przy wysokosci obrazka 832,
   czyli zajmuje 83.4% kadru — reszta to swiatlo nad znakiem "R" i pod linia
   pisma. Znak na 14 px ma wersalik okolo 10.1 px, wiec obrazek musi miec
   10.1 / 0.834 = 12.1 px. Przy wczesniejszych 11 px litery logo mialy 9.2 px
   przy 10.1 px znaku i para czytala sie jak dwa rozne stopnie pisma.

   Wczesniej logo bylo scisniete do 11 px, zeby sygnatura nie byla szersza od
   znaku stojacego OBOK. Odkad stoi pod spodem, ten powod znika: w pionie
   szerokosci nie konkuruja. */
.znak-by img { height: 12px; width: auto; display: block; }

/* Sygnatura znika w pasmie, w ktorym pasek jest najciasniejszy: od 921 px
   nawigacja stoi pozioma i razem z "Umow rozmowe" zajmuje caly pasek.
   Zmierzone: na 1024 px sygnatura wypychala przycisk poza kadr i dawala
   76 px przewijania w poziomie, ktorego bez niej nie ma wcale.

   Ponizej 921 px nawigacja chowa sie do menu i miejsce wraca, wiec sygnatura
   tez wraca. */
@media (min-width: 921px) and (max-width: 1160px) {
  .znak-by { display: none; }
  /* Razem z sygnatura schodzi tracking znaku. Tracking .55em istnieje po to,
     zeby znak trzymal rytm z logo elev8 — a w tym pasmie logo nie ma, wiec
     rytm nie ma z czym wspolgrac. Zmierzone: przy .55em znak ma 160 px i na
     960 px wypycha "Umow rozmowe" poza pasek, dajac 19 px przewijania.
     Przy .2em ma 106 px, co starcza na 960, ale na samym progu 921 px wciaz
     zostawia 1 px przewijania. Znak wraca wiec do pierwotnego .1em i 91 px:
     w pasmie bez logo nie ma czego dopasowywac, a wartosc posrednia trzeba by
     bylo pilnowac przy kazdej zmianie w pasku. */
  .znak { letter-spacing: .1em; margin-right: -.1em; }
}

.nawi {
  display: flex; gap: clamp(14px, 1.7vw, 24px);
  margin-left: auto; font-size: var(--t-nota); white-space: nowrap;
}
.nawi a {
  text-decoration: none; color: var(--atrament-2);
  padding-block: 6px; border-bottom: 1px solid transparent; transition: .15s;
}
.nawi a:hover { color: var(--atrament); border-bottom-color: var(--akcent); }

/* Menu mobilne: ten sam <nav>, rozwijany spod paska. */
.menu {
  display: none; margin-left: auto;
  width: 42px; height: 42px; padding: 0;
  background: transparent; border: 1px solid var(--wlos-mocny);
  cursor: pointer; position: relative;
}
.menu span, .menu span::before, .menu span::after {
  content: ""; position: absolute; left: 50%;
  width: 18px; height: 1.5px; background: var(--atrament);
  transform: translateX(-50%); transition: .18s;
}
.menu span { top: 50%; margin-top: -1px; }
.menu span::before { top: -6px; left: 0; transform: none; }
.menu span::after { top: 6px; left: 0; transform: none; }
.menu[aria-expanded="true"] span { background: transparent; }
.menu[aria-expanded="true"] span::before { top: 0; transform: rotate(45deg); }
.menu[aria-expanded="true"] span::after { top: 0; transform: rotate(-45deg); }

@media (max-width: 920px) {
  .menu { display: block; }
  .gora .miara { gap: 16px; }
  .nawi {
    position: absolute; left: 0; right: 0; top: 100%;
    display: grid; gap: 0; margin: 0;
    background: var(--tlo); border-bottom: 1px solid var(--wlos);
    padding: 8px clamp(20px, 5vw, 48px) 20px; font-size: var(--t-tekst);
  }
  .nawi[hidden] { display: none; }
  .nawi a { padding-block: 14px; border-bottom: 1px solid var(--wlos); }
  .nawi a:hover { border-bottom-color: var(--wlos); }
  .gora .dzialanie--maly { order: 3; }
}
@media (min-width: 921px) { .nawi[hidden] { display: flex; } }

/* --- przyciski ----------------------------------------------------------- */

.dzialanie {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 15px 26px;
  background: var(--akcent); color: #fff; text-decoration: none;
  font-weight: 500; font-size: var(--t-tekst);
  border: 1px solid var(--akcent); transition: .15s;
  font-family: inherit; cursor: pointer;
  border-radius: var(--promien-maly);
}
.dzialanie:hover { background: var(--akcent-ciemny); border-color: var(--akcent-ciemny); }
.dzialanie--pusty { background: transparent; color: var(--atrament); border-color: var(--wlos-mocny); }
.dzialanie--pusty:hover { background: var(--atrament); color: #fff; border-color: var(--atrament); }
.dzialanie--maly { padding: 11px 19px; font-size: var(--t-nota); }

/* ==========================================================================
   HERO: asymetria, tekst kontra panel terminu
   ========================================================================== */

/* Otwarcie dostaje wiecej miejsca u gory: jedyne uzasadnione odstepstwo,
   bo pod paskiem nawigacji potrzeba powietrza. */
.hero { padding-block: calc(var(--rytm) * 1.3) var(--rytm); position: relative; overflow: hidden; }
/* Otwarcie bez panelu z prawej (Teresa, nagranie 28.07: "to z prawej
   strony moim zdaniem niepotrzebne, ten najbliższy termin"). Licznik dni
   i tak stał drugi raz w pasie liczb bezpośrednio pod otwarciem, więc
   znikł duplikat, a nie informacja. */
.hero__uklad {
  display: grid; grid-template-columns: 1.4fr .8fr;
  gap: clamp(40px, 6vw, 80px); align-items: start;
}
/* Grafika siedzi w tle sekcji, treascia po prawej stronie kadru, wiec
   tekst trzyma sie lewej polowy. Ponizej 981px grafika znika: przy waskim
   ekranie wchodzi pod tekst i psuje czytelnosc. */
/* Grafika jako warstwa pod trescia, nie jako wklejony prostokat: maska
   rozpuszcza jej lewa krawedz w bieli, zeby nie bylo widac gdzie sie
   zaczyna. Kadr trzyma sie prawej strony, bo tam siedzi cala tresc
   zdjecia, a lewa polowa jest pusta i jasna. */
.hero::after {
  content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  /* cover, zeby zdjecie wypelnilo cala wysokosc sekcji: przy dopasowaniu
     do szerokosci zostawaly ostre krawedzie u gory i u dolu. Maska rozpuszcza
     tylko lewa strone, gdzie zdjecie spotyka sie z tekstem. */
  /* v4 (generacja 02.08, brief w docs/BRIEF-GRAFIKI-webinar-i-hero-v4.md):
     iteracja izometrii z wyraznym turkusowym checkmarkiem. Uwaga z pomiaru:
     burgund 0.38% vs 1.1% w v3 tym samym detektorem; jesli pieczatka
     blednie przy opacity .5, wracamy na hero.webp (v3) jedna linijka. */
  background: url("../img/hero-strona-glowna.webp") right top / auto 88% no-repeat;
  /* przygaszona: "grafiki tutaj mniejsza role beda odgrywaly, nie az tak
     rzucajace sie w oczy" (Teresa 28.07), scisniete jeszcze raz 06.08
     (Dominik: grafika ma byc mniejsza i mniej rzucac sie w oczy).
     Zmiana idzie maska i przezroczystoscia, nie rozmiarem tla: przy
     `contain` zdjecie dostawalo ostra krawedz u gory i u dolu, bo kadr
     jest jasny tylko po lewej. Maska zaczyna sie dalej w prawo, wiec
     widoczny kawalek grafiki jest wezszy, a nigdzie nie ma ciecia. */
  opacity: .34;
  /* Dwie maski naraz: lewa rozpuszcza grafike w tekscie, dolna scina ciemny
     rog biurka, ktory przy mniejszym kadrze konczyl sie ostra krawedzia.
     `intersect` bierze czesc wspolna obu, wiec kadr gasnie w dwie strony. */
  -webkit-mask-image: linear-gradient(to right, transparent 52%, #000 88%),
                      linear-gradient(to bottom, #000 58%, transparent 97%);
          mask-image: linear-gradient(to right, transparent 52%, #000 88%),
                      linear-gradient(to bottom, #000 58%, transparent 97%);
  -webkit-mask-composite: source-in;
          mask-composite: intersect;
}
.hero > .miara { position: relative; z-index: 1; }
.hero__uklad--sam { grid-template-columns: 1fr; }
/* 52ch i 26ch zamiast 44ch i 19ch: przy dlugim naglowku SEO hero mialo
   1000 px na ekranie 900 px i glowny przycisk wypadal poza pierwszy ekran
   (pomiar 02.08). Szersze kolumny schodza do 828 px; tekst wchodzi tylko
   w blada strefe maski grafiki. */
.hero__uklad--sam .hero__lid { max-width: 52ch; }
@media (min-width: 981px) {
  .hero__uklad--sam h1 { max-width: 26ch; }
}
@media (max-width: 980px) {
  .hero::after { display: none; }
  .hero__uklad--sam .hero__lid { max-width: 58ch; }
}
@media (max-width: 980px) { .hero__uklad { grid-template-columns: 1fr; gap: 44px; } }

.hero .brew { margin-bottom: 26px; }
.hero h1 { font-size: var(--t-hero); letter-spacing: -.032em; }
/* „Sprawdź, czy to Ciebie dotyczy" idzie na turkus, nie na czerwień:
   Teresa wprost, że ten tekst nie ma być czerwony, bo czerwień jest
   agresywna i ma zostać przy przyciskach. */
.hero h1 em { font-style: normal; color: var(--wynik); display: block; }
.hero__lid {
  margin-top: 24px; font-size: var(--t-lid); line-height: 1.6;
  color: var(--atrament-2); max-width: 50ch;
}
.hero__akcje { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 36px; }
.hero__pod { margin-top: 18px; font-size: var(--t-nota); color: var(--szept); }

.zegar { border: 1px solid var(--wlos); padding: 28px 26px; background: var(--tlo-cichy);   border-radius: var(--promien);
}
.zegar__co {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .13em;
  text-transform: uppercase; color: var(--szept);
}
.zegar__ile { display: flex; align-items: baseline; gap: 11px; margin-top: 12px; }
.zegar__ile b {
  font-size: var(--t-liczba); font-weight: 600; letter-spacing: -.04em; line-height: 1;
  color: var(--przelamanie); font-variant-numeric: tabular-nums;
}
.zegar__ile span { font-size: var(--t-nota); color: var(--atrament-2); }
.zegar__data {
  margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--wlos);
  font-size: var(--t-nota); line-height: 1.55; color: var(--atrament-2);
}
.zegar__data b { font-weight: 600; color: var(--atrament); }
.zegar__nast { margin-top: 14px; font-size: var(--t-nota); color: var(--szept); line-height: 1.6; }

/* Wariant poziomy: zegar zszedl z hero na dol strony, przed rezerwacje.
   Tam ma cala szerokosc kolumny, wiec liczba i opis stoja obok siebie
   zamiast jedno pod drugim. */
/* Cala szerokosc sekcji, nie prawa kolumna: zegar stoi miedzy danymi kontaktu
   a formularzem, wiec jako waski kafel z pustka obok wygladal na zgubiony.
   Jego zadanie to ostatnie przypomnienie terminu tuz przed akcja. */
.zegar--pas { grid-column: 1 / -1; margin-bottom: 0; }
@media (min-width: 720px) {
  .zegar--pas {
    display: grid; grid-template-columns: auto 1fr; gap: 34px;
    align-items: center; padding: 30px 32px;
  }
  .zegar--pas .zegar__co { grid-column: 1 / -1; }
  .zegar--pas .zegar__ile { margin-top: 0; display: block; }
  .zegar--pas .zegar__ile span { display: block; margin-top: 4px; }
  .zegar--pas .zegar__data {
    margin-top: 0; padding-top: 0; padding-left: 34px;
    border-top: 0; border-left: 1px solid var(--wlos);
  }
}

/* ==========================================================================
   LICZBY: pas trzech wartości. Rytm inny niż wszystko wokół.
   ========================================================================== */

/* Pas liczb i os terminow to sekcje-przerywniki: dostaja czesc rytmu,
   ale liczona z tej samej zmiennej, a nie z osobnego clamp.

   Pas stoi na turkusie `--wynik-ciemny` #0F766E (06.08.2026, decyzja
   Dominika; wczesniej tego samego dnia byl granat). Powod jest rytmiczny,
   nie ozdobny: hero i os terminow sa jasne, wiec dwa jasne pasy z liczbami
   czytaly sie jak jedna siatka bez hierarchii. Kolorowy pas je rozdziela
   i robi z licznika pierwsza rzecz, ktora widac.

   Turkus to kolor WYNIKU w tej palecie, nie terminu, wiec licznik nie moze
   tu stac na zlocie: zloto #B9852F na tym tle daje 2,0 i czyta sie jak
   wylaczone. Na turkusie role terminu niesie skala i pozycja, a nie kolor,
   a liczba idzie w biel. Pelny zestaw tokenow podmieniony niżej, zeby
   reszta pliku nie musiala wiedziec, ze stoi na kolorze.

   Kolorowy pas dostaje wiecej powietrza niz jasny, bo na pelnym tle ta sama
   wysokosc czyta sie ciasniej. */
.liczby {
  border-top: 0;
  padding-block: calc(var(--rytm) * .62);
}
.liczby--turkus {
  --tlo:        var(--wynik-ciemny);
  --tlo-cichy:  var(--wynik-ciemny);
  --atrament:   #FFFFFF;
  --atrament-2: #FFFFFF;
  --szept:      #FFFFFF;
  --wlos:       rgba(255, 255, 255, .28);
  --wlos-mocny: rgba(255, 255, 255, .5);
  --przelamanie: #FFFFFF;

  background: var(--wynik-ciemny);
  color: #FFFFFF;
}
/* Jedna pozycja, nie trzy. "4 terminy w przepisach" liczylo kropki widoczne
   na osi pod spodem, a 24 h i 72 h to obowiazek incydentowy, nie termin
   ustawowy: obie pozycje zdjete na prosbe Dominika 06.08.2026. Zostaje pas
   z jedna rzecza, ktora sie zmienia, czyli licznik. */
.liczby__uklad { display: grid; grid-template-columns: minmax(0, 1fr); }
/* Licznik i zdanie obok siebie, cala para wysrodkowana w pasie (prosba
   Dominika 08.08.2026). Wczesniej uklad trzymal lewa krawedz `.miara`, bo
   zdanie bylo dluzsze i wypelnialo pas az do prawej strony. Po skroceniu
   tekstu zostawalo po prawej pol pasa pustego koloru, wiec calosc wygladala
   jak zepchnieta w rog.

   Kolumna ze zdaniem zwezona z 48ch do 34ch i mniejszy odstep miedzy
   kolumnami: liczba i jej opis maja sie czytac jako jedna rzecz, a nie dwie
   polowy pasa. Ponizej 820 px wraca uklad pionowy, bo dwie kolumny nie
   mieszcza sie bez lamania liczby. */
@media (min-width: 821px) {
  .liczby--turkus .liczby__poz {
    display: grid; grid-template-columns: max-content minmax(0, 34ch);
    justify-content: center;
    column-gap: clamp(20px, 2.4vw, 34px); align-items: center;
    padding-right: 0;
  }
  .liczby--turkus .liczby__poz > span {
    grid-column: 2; grid-row: 1;
    margin-top: 0; font-size: var(--t-lid); max-width: none;
    /* Zdanie miesci sie w dwoch wierszach i tak ma zostac, bo w jednym
       rozpycha blok o 120 px i pas przestaje byc wezszy niz `.miara`.
       `balance` dzieli je na rowne polowy zamiast zostawiac w pierwszym
       wierszu wszystko, a w drugim koncowke. Bez wsparcia przegladarki
       lamie sie normalnie i to nadal dziala. */
    text-wrap: balance;
  }
}
.liczby__poz { padding-right: 32px; border-right: 1px solid var(--wlos); }
.liczby__poz:last-child { border-right: 0; }
.liczby__poz:not(:first-child) { padding-left: 32px; }
/* Jeden ciag na jednej linii bazowej: "58 dni 04 godz 12 min". Wczesniej
   godziny i minuty stały w osobnym <b> pod dniami i o stopien nizej, wiec
   ten sam odczyt czasu byl zlozony z dwoch roznych krojow w dwoch wierszach.
   Teraz kazda liczba ma stopien liczby, kazda jednostka stopien jednostki,
   a calosc idzie w rzedzie.

   Zwykly przeplyw tekstu, nie flex: odstepy sa prawdziwymi spacjami, wiec
   czytnik ekranu i kopiowanie daja "55 dni 07 godz 58 min". We flexie
   spacje miedzy elementami znikaja i zostaje "55dni07godz58min". Linia
   bazowa i tak sie zgadza, bo to jeden wiersz inline. */
.liczby__poz b {
  display: block;
  font-size: var(--t-liczba); font-weight: 600;
  letter-spacing: -.04em; line-height: 1;
  color: var(--przelamanie); font-variant-numeric: tabular-nums;
}
/* Liczba i jej jednostka trzymaja sie razem: zlamanie moze wypasc tylko
   na spacji miedzy czlonami, nigdy w srodku pary. */
.liczby__czlon { white-space: nowrap; }
/* Jednostki: "dni", "godz", "min" traktowane tak samo. Schodza o stopien
   i traca swiatlo miedzyliterowe, ktore ma liczba. */
.liczby__poz b i {
  font-style: normal; font-size: var(--t-lid); font-weight: 500;
  letter-spacing: 0;
}
/* Bezposrednie dziecko, bo licznik siedzi w <b> jako <span id="ile2">
   i przy selektorze potomka dostawal 14,5 px zamiast rozmiaru liczby. */
.liczby__poz > span {
  display: block; margin-top: 10px; font-size: var(--t-nota); line-height: 1.55;
  color: var(--atrament-2); max-width: 30ch;
}
.liczby__poz b span { font: inherit; color: inherit; }
@media (max-width: 820px) {
  .liczby__uklad { grid-template-columns: 1fr; gap: 0; }
  .liczby__poz {
    padding: 20px 0; border-right: 0; border-bottom: 1px solid var(--wlos);
  }
  .liczby__poz:last-child { border-bottom: 0; }
  .liczby__poz:not(:first-child) { padding-left: 0; }
  /* Ten sam srodek co na szerokim ekranie. W ukladzie pionowym licznik
     i zdanie stalyby przy lewej krawedzi, wiec pas mialby dwa rozne
     wyrownania zaleznie od szerokosci. `margin-inline` bo zdanie ma
     wlasna miare 30ch i samo `text-align` zostawiloby je po lewej. */
  .liczby--turkus .liczby__poz { text-align: center; }
  .liczby--turkus .liczby__poz > span { margin-inline: auto; }
}

/* ==========================================================================
   OŚ TERMINÓW: cztery daty ustawowe na jednej linii, najbliższa podświetlona.
   Niesie treść, nie jest dekoracją.
   ========================================================================== */

.os {
  border-top: 1px solid var(--wlos); border-bottom: 1px solid var(--wlos);
  padding-block: calc(var(--rytm) * .58);
}
.os__tytul {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .15em;
  text-transform: uppercase; color: var(--szept); margin-bottom: 34px;
}
/* Naglowek osi zszedl z klasy `.os__tytul` na zwykle `<h2>` (zmiana Dominika
   08.08.2026), a globalna regula dla naglowkow ustawia tylko `margin: 0`
   i grubosc, bez stopnia. Bez tego h2 spadal na 24 px domyslne z przegladarki,
   czyli mniej niz naglowek kazdej innej sekcji, i siedzial tuz nad torem.
   Stopien `--t-dzial` to ten sam, ktory nioslo `.doba h2` i `.koniec h2`.

   Odstep nad naglowkiem taki sam jak w `.szyld h2`, bo etykieta nad nim jest
   teraz ta sama ramka. */
.os h2 {
  margin-top: 16px; font-size: var(--t-dzial); letter-spacing: -.026em;
  margin-bottom: clamp(28px, 3vw, 44px);
}
/* Stopka osi: zdanie po lewej, odnosnik po prawej jako przycisk w ramce
   (prosba Dominika 08.08.2026). Wczesniej odnosnik siedzial w srodku zdania
   jako `<strong>` i przy dlugim tekscie ladowal w polowie wiersza, przez co
   nie bylo widac, ze to wyjscie do osobnej strony.

   Ponizej 760 px wraca uklad pionowy: przycisk na pelnej szerokosci zdania
   nie miesci sie obok niego bez lamania etykiety w srodku. */
.stopka-sekcji {
  display: flex; align-items: center;
  gap: clamp(24px, 4vw, 48px);
  /* Odsuniete od tresci (08.08.2026): przy 26 px zdanie i przycisk siedzialy
     tuz pod etykietami punktow i czytaly sie jak piaty element osi, a nie
     jak podsumowanie pod nia. */
  margin-top: clamp(34px, 3.6vw, 56px);
}
.stopka-sekcji .zrodlo { margin-top: 0; }
/* `margin-left: auto` zamiast `justify-content: space-between`, bo stopka
   wystepuje w dwoch wariantach: ze zdaniem po lewej (os terminow) i z samym
   przyciskiem (sekcja "Od czego zaczac"). Auto dziala w obu, `space-between`
   przy jednym dziecku zostawialoby przycisk po lewej. */
.stopka-sekcji__link { flex: none; margin-left: auto; }
@media (max-width: 760px) {
  .stopka-sekcji { flex-direction: column; align-items: flex-start; gap: 18px; }
  /* W kolumnie `auto` zepchnelby przycisk na prawa krawedz. */
  .stopka-sekcji__link { margin-left: 0; }
  /* Pierwszy .kotwica miedzy .szyld a .domkniecie jest display:block height:0,
     wiec w gridzie .koniec__uklad dostaje pusty wiersz i gap naklada sie
     podwojnie. Kompensujemy tu, zostawiajac reszte serwisu w spokoju. */
  #kontakt .koniec__uklad { gap: 16px; }
  #kontakt .szyld { margin-bottom: 0; }
  #kontakt .domkniecie { margin-top: 0; padding-top: 24px; }
}
.os__tor { display: grid; grid-template-columns: repeat(4, 1fr); position: relative; }
.os__tor::before {
  content: ""; position: absolute; left: 0; right: 0; top: 7px;
  height: 1px; background: var(--wlos);
}
@media (max-width: 820px) {
  .os__tor { grid-template-columns: 1fr; gap: 26px; }
  .os__tor::before { left: 7px; right: auto; top: 0; bottom: 0; width: 1px; height: auto; }
}

/* Kolumna, zeby etykieta pod spodem mogla sie dokleic do dolu. Opisy
   punktow maja po zmianie tresci od 3 do 5 wierszy (08.08.2026), wiec
   etykiety plynace z tekstem staly na czterech roznych wysokosciach.
   W siatce wszystkie punkty i tak sa rownej wysokosci, wiec wystarczy
   zepchnac etykiete na dol. */
.punkt {
  position: relative; padding-right: 24px;
  display: flex; flex-direction: column;
}
@media (max-width: 820px) { .punkt { padding-left: 30px; padding-right: 0; } }
.punkt::before {
  content: ""; position: absolute; top: 0; left: 0;
  width: 15px; height: 15px;
  /* Obrys w zlocie, bo pusta kropka to punkt bez modyfikatora, czyli termin
     dalszy, a te ida zlotem razem ze swoja etykieta. Minione i najblizszy
     nadpisuja to nizej. */
  border: 1px solid var(--przelamanie); background: var(--tlo-cichy); border-radius: 50%;
}
@media (max-width: 820px) { .punkt::before { top: 4px; } }
.punkt__data {
  display: block; margin-top: 26px; font-size: var(--t-karta); font-weight: 600;
  letter-spacing: -.02em; font-variant-numeric: tabular-nums;
}
@media (max-width: 820px) { .punkt__data { margin-top: 0; } }
/* Miara podniesiona z 26ch na 32ch (08.08.2026). Kolumna ma na 1440 px
   271 px, a tekst siedzial w 230 px, wiec 41 px kolumny stalo puste i kazdy
   opis lamal sie o wiersz za wczesnie. Na szerokim ekranie 32ch jest szersze
   niz kolumna, wiec limit przestaje dzialac i tekst wypelnia to, co ma; na
   waskim nadal tnie linie, zeby nie robilo sie 46 znakow w wierszu.

   Interlinia 1.55 -> 1.48, bo to jest nota 14 px w czterech kolumnach obok
   siebie, a nie akapit do czytania ciagiem. */
.punkt__co {
  margin-top: 7px; font-size: var(--t-nota); line-height: 1.48;
  color: var(--atrament-2); max-width: 32ch;
}
/* `margin-top: auto` dociska etykiete do dolu kolumny, `align-self` trzyma
   ja przy lewej, bo w kolumnie flex `inline-block` rozciagnalby sie na cala
   szerokosc. Na waskim ekranie punkty nie sa rownej wysokosci, wiec `auto`
   nie ma czego rozpychac i etykieta zostaje tuz pod tekstem. */
.punkt__tag {
  display: inline-block; align-self: start;
  margin-top: auto; padding-top: 11px;
  font-size: var(--t-etyk); font-weight: 500;
  letter-spacing: .1em; text-transform: uppercase; color: var(--przelamanie);
}

/* Kolory na osi przestawione 08.08.2026 na prosbe Dominika: minione szare,
   najblizszy termin zielony, dalsze zlote. Kropka, data i etykieta jednego
   punktu ida zawsze tym samym kolorem; inaczej punkt mowilby dwie rzeczy
   naraz, np. zlota kropka nad zielona etykieta.

   Zloto siedzi w domyslnych regulach `.punkt__tag` i `.punkt::before` wyzej,
   bo dalsze terminy to punkty bez zadnego modyfikatora. */

/* Bez `opacity`. Przygaszenie calego punktu i tak nie moglo zostac: szarosc
   #646B78 ma na bieli 4.83, a przepuszczona przez 78 proc. krycia spada do
   3.1 i etykieta przestaje przechodzic AA. Rolę "to juz bylo" niesie teraz
   sam kolor, a nie krycie. */
.punkt--minal::before { background: var(--szept); border-color: var(--szept); }
.punkt--minal .punkt__tag { color: var(--szept); }

.punkt--teraz::before {
  background: var(--wynik-ciemny); border-color: var(--wynik-ciemny);
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--wynik-ciemny) 16%, transparent);
}
.punkt--teraz .punkt__data { color: var(--wynik-ciemny); }
.punkt--teraz .punkt__tag { color: var(--wynik-ciemny); }

/* ==========================================================================
   Nagłówek sekcji. Uwaga dosunięta do prawej, linia pod spodem.
   Sekcje nie są numerowane.
   ========================================================================== */

.pas { border-top: 1px solid var(--wlos); padding-block: var(--rytm); }
/* NIE UZYWANE na landingu od 29.07.2026. Wszystkie sekcje sa biale: decyzja
   Teresy ("sekcje na bialo widzialabym tlo") powtorzona przez Dominika.
   Przelamanie niesie kolor akcentow i ksztalty w tle, nie zmiana tla sekcji.
   Reguly nie usuwam, bo korzystaja z niej podstrony. */
.pas--cichy { background: var(--tlo-cichy); }

/* Oferta ma lapac oko, gdy ktos zjedzie na dol (prosba Teresy 28.07).
   Kolor siedzi NA kaflach, nie pod nimi: "kafelki tej oferty moglyby byc
   inaczej, na przyklad kolorem, na przyklad tlo" (Teresa 28.07). Sekcja
   zostaje biala, zeby kolorowe kafle mialy sie od czego odbic.
   NIE rozcienczac tu zadnego koloru biela: burgund z biela daje roz,
   zloto daje bez, a bez Teresa odrzucila ("nie bezowy ten majtkowy"). */

/* ==========================================================================
   PAS NA GRANACIE (28.07.2026)

   Trzy wystąpienia na stronie: zegar incydentowy, zasady współpracy,
   domknięcie z kontaktem. Rozstawione mniej więcej co pięć sekcji, żeby
   czytelnik miał gdzie zaczepić wzrok na osiemnastu blokach treści.

   Blok podmienia tokeny powierzchni, a nie style poszczególnych elementów:
   reszta pliku nie musi wiedzieć, że stoi na ciemnym. Wyjątki niżej są
   tylko tam, gdzie odwrócenie tła zmienia rolę elementu, a nie jego kolor.

   Zmierzone na #17233D: biel 15.62, tekst drugorzędny 9.59, szept 6.14,
   akcent 8.09, przełamanie 6.36. Wszystko powyżej 4.5.
   ========================================================================== */

.ciemny {
  --tlo:        #17233D;
  --tlo-cichy:  #111A2E;
  --atrament:   #FFFFFF;
  --atrament-2: #C6CBD4;
  --szept:      #9BA3B0;
  --wlos:       rgba(255, 255, 255, .16);
  --wlos-mocny: rgba(255, 255, 255, .42);

  --akcent:        color-mix(in srgb, var(--akcent-baza) 45%, #FFFFFF);
  --akcent-ciemny: color-mix(in srgb, var(--akcent-baza) 28%, #FFFFFF);
  --przelamanie:   color-mix(in srgb, var(--przelamanie-baza) 45%, #FFFFFF);

  background: #17233D;
  color: #FFFFFF;
  border-top-color: #17233D;
}

/* Sąsiadujące pasy nie mogą się stykać włosem: granica między jasnym
   a ciemnym jest już zrobiona kontrastem tła. */
.ciemny + .pas, .ciemny + .koniec, .ciemny + .zdanie,
.ciemny + .os, .liczby--turkus + .os { border-top-color: transparent; }

/* Zieleń rozjaśniona do granatu przestaje czytać się jako kolor i zaczyna
   jako jasny szary, więc link na ciemnym potrzebuje drugiego sygnału.
   Podkreślenie od razu, nie dopiero na kursorze. */
.ciemny .kontakt a,
.ciemny .zrodlo a,
.ciemny .rezerwacja__zapas a { border-bottom-color: var(--akcent); }

/* Przycisk na granacie odwraca się w papier. Zieleń na granacie miałaby
   1.9 kontrastu do tła i czytałaby się jak wyłączona, mimo że biała
   etykieta na niej jest legalna. Wersja pusta dostaje białą krawędź. */
.ciemny .dzialanie {
  background: #F7F5F1; color: #17233D; border-color: #F7F5F1;
}
.ciemny .dzialanie:hover {
  background: #FFFFFF; border-color: #FFFFFF;
}
.ciemny .dzialanie--pusty {
  background: transparent; color: #FFFFFF; border-color: var(--wlos-mocny);
}
.ciemny .dzialanie--pusty:hover {
  background: #FFFFFF; color: #17233D; border-color: #FFFFFF;
}

/* Bez kreski pod szyldem (08.08.2026, decyzja Dominika). Ta sama linia wracala
   pod naglowkiem dziewieciu sekcji, a kazda sekcja ma juz wlasna kreske u gory
   (`.pas`), wiec strona miala po dwie poziome linie na sekcje. Odstep zostaje
   ten sam, tylko caly w marginesie: bez kreski dolny padding nie ma czego
   odsuwac. */
.szyld {
  display: grid; grid-template-columns: 1fr auto; gap: 32px; align-items: end;
  margin-bottom: 62px;
}
@media (max-width: 760px) { .szyld { grid-template-columns: 1fr; align-items: start; gap: 16px; } }
/* Nagłówek sekcji w kolorze akcentu (28.07.2026, Teresa: "sekcje na biało
   widziałabym tło, ale żeby nagłówki miały inne kolory albo akcenty, żeby
   to oddzielenie sekcji było widoczne").

   Tło wszystkich sekcji wróciło na biel, więc granicę niesie teraz sam
   nagłówek: kolor akcentu i etykieta nad nim. Wcześniej próbowaliśmy tego
   kreską nad tytułem i kreską pod szyldem, obie odrzucone. */
.szyld h2 {
  margin-top: 16px; font-size: var(--t-dzial);
  letter-spacing: -.03em; max-width: 20ch;
  /* Pierwszy .kotwica miedzy .szyld a .domkniecie jest display:block height:0,
     wiec w gridzie .koniec__uklad dostaje pusty wiersz i gap naklada sie
     podwojnie. Kompensujemy tu, zostawiajac reszte serwisu w spokoju. */
  #kontakt .koniec__uklad { gap: 16px; }
  #kontakt .szyld { margin-bottom: 0; }
  #kontakt .domkniecie { margin-top: 0; padding-top: 24px; }
}
/* Jedyny naglowek sekcji dluzszy niz reszta: 78 znakow, gdy pozostale osiem
   ma od 33 do 51. Przy wspolnej mierze 20ch schodzil na trzy wiersze i byl
   jedynym trzywierszowym na stronie. Miara podniesiona tylko tutaj, bo
   podniesiona globalnie zrobilaby z czesci pozostalych naglowkow jednowiersze
   i rozbila rytm, ktory dzis jest rowny.

   Kolumna po lewej ma na 1440 px 1052 px, wiec 30ch (okolo 740 px) nadal
   zostawia miejsce uwadze po prawej. `balance` dzieli tekst na dwa rowne
   wiersze zamiast zostawiac w drugim koncowke. */
#praktyka .szyld h2 { max-width: 30ch; text-wrap: balance; }

/* Granicę sekcji niesie etykieta w ramce, nie tło ani kreska.
   Teresa 28.07: "sekcje na biało widziałabym tło, ale żeby nagłówki miały
   inne kolory albo akcenty albo w ramkach, żeby to oddzielenie sekcji było
   widoczne". Z trzech wariantów pokazanych do wyboru ten jest jedynym,
   który daje twardy punkt zaczepienia, a nie odbiera wagi nagłówkowi:
   kolorowy tytuł konkurował z treścią, a ramka wokół całej sekcji zamieniała
   stronę w zestaw szesnastu pudełek.

   Etykieta pojawia się raz na sekcję i działa jak zakładka w segregatorze. */
/* Oś terminów dopisana 08.08.2026: jej etykieta ma wygladac jak etykieta
   sekcji "Od czego zaczac", a nie jak goly napis. Sekcja nie uzywa `.szyld`,
   bo nie ma uwagi po prawej, wiec sam selektor dochodzi tutaj zamiast
   przebudowy jej naglowka. */
.szyld .brew, .dwie__kotwica .brew, .os .brew {
  display: inline-block;
  color: var(--wynik-ciemny);
  border: 1px solid color-mix(in srgb, var(--wynik-ciemny) 42%, #fff);
  border-radius: var(--promien-maly);
  padding: 5px 11px;
  letter-spacing: .09em;
}
/* ==========================================================================
   PASEK ISO pod hero (09.08.2026).

   Stoi miedzy hero a licznikiem terminu, wiec musi byc cichy: maly znak plus
   nazwa, nie kolejna pelna sekcja.
   ========================================================================== */
.pas-iso { padding-block: clamp(20px, 2.5vw, 30px); border-block: 1px solid var(--wlos); }
.pas-iso__uklad {
  display: block;
}
.pas-iso__lista {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  align-items: center; gap: clamp(12px, 3vw, 48px);
  margin: 0; padding: 0; list-style: none;
}
.pas-iso__poz {
  display: flex; align-items: center; justify-content: center;
  min-height: 44px; color: var(--atrament-2); text-align: center;
}
.pas-iso__poz b {
  display: block; color: var(--atrament); font-size: var(--t-lid);
  font-weight: 600; letter-spacing: .01em; line-height: 1.15;
}
.pas-iso__poz small {
  display: block; margin-top: 3px; color: var(--szept);
  font-size: 12px; line-height: 1.2;
}
@media (max-width: 560px) {
  .pas-iso { padding-block: 0; }
  .pas-iso__lista { grid-template-columns: 1fr; gap: 0; }
  .pas-iso__poz { min-height: 44px; }
  .pas-iso__poz + .pas-iso__poz { border-top: 1px solid var(--wlos); }
}

/* ==========================================================================
   KAFLE PROSTE: sama nazwa, ikona w tle, link (09.08.2026, Dominik: "ma byc
   prosto szkolenia webinary baza wiedzy bez jakiegos nadmiernego tekstu,
   mozesz to jakas ikonami spojnymi wyroznic w tle").

   Opisy wylecialy w calosci, nie zostaly skrocone. Kafel niesie teraz jedna
   informacje: dokad prowadzi. Etykieta kategorii tez znika, bo powtarzala
   tytul ("SZKOLENIA" nad "Szkolenia").

   Znak w tle to `.znak-tla` z `kwalifikator.html`, nie nowy pomysl: ten sam
   zestaw ikon (Tabler, stroke 1.1), ta sama zasada, czyli znak wodny
   wychodzacy za rog karty i przyciety przez `overflow: hidden`. AGENTS.md
   opisuje to zgloszenie w `kontrola.js` jako znany wyjatek, wiec wzorzec jest
   juz w projekcie ustalony i nie ma powodu robic drugiego.
   ========================================================================== */
.wejscia--proste .wejscie--prosty {
  position: relative; overflow: hidden;
  justify-content: space-between;
  gap: 22px;
}
/* Tytul i link musza stanac nad znakiem wodnym, inaczej ikona przechodzi
   przez litery. Ten sam zabieg co w `.werdykt-karta` na kwalifikatorze. */
.wejscie--prosty > *:not(.znak-tla) { position: relative; }
.wejscie--prosty .znak-tla {
  position: absolute; right: -18px; bottom: -22px;
  width: 108px; height: 108px;
  color: var(--wynik-ciemny); opacity: .11; pointer-events: none;
}
.wejscie--prosty h3 { margin: 0; }

/* Wprowadzenie pod naglowkiem sekcji (09.08.2026, tekst Teresy do sekcji
   materialow). Pierwszy taki akapit na tej stronie: dotad zaden `.szyld` nie
   mial nic miedzy naglowkiem a trescia sekcji.

   Nie uzywa `.szyld__uwaga` nizej, mimo ze ta klasa stoi w drugiej kolumnie
   tego samego gridu i na tej stronie jest wolna. Uwaga to przypis: prawa
   kolumna, wyrownanie do prawej, kolor szeptu. Ten akapit czyta sie zaraz po
   naglowku i niesie sens sekcji, wiec zostaje w lewej kolumnie i bierze kolor
   tekstu.

   Miara 58ch, a nie 20ch naglowka: naglowek ma byc waski, zeby lamal sie na
   dwa wiersze, akapit przy tej samej mierze schodzilby na siedem. */
.szyld__lead {
  margin-top: 18px;
  font-size: var(--t-tekst); line-height: 1.6;
  color: var(--atrament-2); max-width: 58ch;
}

.szyld__uwaga {
  font-size: var(--t-tekst); line-height: 1.6; color: var(--szept);
  max-width: 38ch; text-align: right;
}
@media (max-width: 760px) { .szyld__uwaga { text-align: left; } }

/* ==========================================================================
   TRZY DECYZJE: trzy kolumny, duży wyblakły numer nad nagłówkiem.
   Numer niesie kolejność, więc zostaje.
   ========================================================================== */

.trojka { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(20px, 2.6vw, 32px); }
@media (max-width: 820px) { .trojka { grid-template-columns: 1fr; gap: 20px; } }
/* Pełna ramka zamiast samej górnej krawędzi: karta ma być zamknięta,
   tak jak w v3. Odstęp między kartami zszedł, bo ramka sama je rozdziela. */
.decyzja {
  padding: 24px;
  border: 1px solid var(--wlos);
  transition: border-color .16s ease;
  border-radius: var(--promien);
  /* Pierwszy .kotwica miedzy .szyld a .domkniecie jest display:block height:0,
     wiec w gridzie .koniec__uklad dostaje pusty wiersz i gap naklada sie
     podwojnie. Kompensujemy tu, zostawiajac reszte serwisu w spokoju. */
  #kontakt .koniec__uklad { gap: 16px; }
  #kontakt .szyld { margin-bottom: 0; }
  #kontakt .domkniecie { margin-top: 0; padding-top: 24px; }
}
.decyzja:hover { border-color: var(--wlos-mocny); }
.decyzja__nr {
  font-size: var(--t-liczba); font-weight: 600; line-height: 1; letter-spacing: -.05em;
  color: var(--wynik-ciemny); font-variant-numeric: tabular-nums; opacity: .28;
}
.decyzja h3 { margin-top: 14px; font-size: var(--t-karta); letter-spacing: -.02em; }
/* `:not([class])` w całym pliku celowo: selektor `.blok p` ma wyższą
   specyficzność niż `.blok__element`, więc bez tego nadpisywał numery,
   podpisy i noty, które są akapitami z własną klasą. */
.decyzja p:not([class]) { margin-top: 13px; font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); }

/* Ramka ostrzegawcza. Jedyne miejsce, gdzie treść dostaje własny obrys
   w środku sekcji: niesie fakt, który najczęściej jest przekręcany. */
.uwaga {
  margin-top: clamp(32px, 4vw, 48px);
  padding: 26px 28px;
  border: 1px solid var(--wlos-mocny);
  /* Bez paska po lewej: ten sam zabieg co w bloku wpisu, gruba kreska
     z boku wygladala jak element z innego ukladu. Ostrzezenie niesie teraz
     ikona i kolor etykiety. Burgund zostaje tu jako jedyne miejsce poza
     przyciskami (decyzja Teresy 28.07: czerwien w naglowku dopuszczona). */
  border-radius: var(--promien);
  background: var(--tlo-cichy);
}
/* Pelna szerokosc sekcji, ale tekst nie rozciaga sie na 140 znakow w linii:
   etykieta siada w osobnej kolumnie po lewej, tresc trzyma czytelna miare. */
/* Ikona pracuje jako znak w tle kolumny z etykieta: przy pelnej szerokosci
   bloku po lewej stronie zostawalo duzo pustego pola, a mala ikonka przy
   napisie tego nie wypelniala. */
/* Ikona nad etykieta, nie pod nia: jako znak wodny w tle napis wchodzil
   na kreski trojkata i oba przestawaly byc czytelne. Kolumna po lewej ma
   duzo miejsca, wiec ikona moze byc duza i pelna. */
.uwaga__szyld { display: grid; justify-items: start; gap: 10px; }
/* Ikona powiekszona z 40 do 112 px (08.08.2026): po zdjeciu naglowka "Czesty
   blad" to ona jest jedynym znakiem, ze blok mowi o pomylce, wiec musi byc
   czytelna jako znak, a nie jako ozdoba przy tekscie. Nazwa bloku zostaje
   w `aria-label` na `<aside>`, bo czytnik ekranu nie widzi trojkata.

   Kreska scienia sie razem ze wzrostem: `stroke-width` w SVG jest liczony
   w jednostkach viewBox, wiec przy tej skali 1.6 daje gruby, ciezki obrys. */
.uwaga__ikona {
  width: clamp(64px, 6.2vw, 88px); height: clamp(64px, 6.2vw, 88px);
  color: var(--akcent); flex: none; stroke-width: 1.2;
}
/* Wyjscie z bledu w srodku uwagi (08.08.2026): przycisk "Sprawdz kryteria"
   mowi dokladnie o tym, czym zastapic kwalifikacje po PKD, wiec stoi w tym
   samym bloku co opis bledu, a nie nad nim jako osobna stopka sekcji.
   Uklad waski: przycisk pod akapitem. Uklad szeroki nadpisuje to nizej,
   wiec ta regula musi stac PRZED media query, nie po nim. */
.uwaga__tresc { display: grid; justify-items: start; }
.uwaga__akcja { margin-top: 20px; }

/* Na szerokim ekranie kafel idzie na trzy czesci: znak, tresc, wyjscie
   (08.08.2026). Wczesniej przycisk stal pod tekstem i miedzy ikona a trescia
   zostawal pusty pas koloru na cala wysokosc bloku. Trzecia kolumna zabiera
   ten pas i daje akcji wlasne miejsce, zamiast doklejac ja do akapitu.

   `display: contents` na `.uwaga__tresc`: opakowanie znika z ukladu, a jego
   dzieci, akapit i przycisk, staja sie bezposrednimi elementami siatki
   i trafiaja do kolumny drugiej i trzeciej. Bez tego trzeba by rozbijac
   markup, ktory na waskim ekranie ma zostac jednym blokiem. */
@media (min-width: 860px) {
  .uwaga {
    display: grid; grid-template-columns: minmax(0, auto) minmax(0, 1fr);
    gap: clamp(24px, 3.4vw, 48px); align-items: center;
  }
  .uwaga__szyld { padding-top: 0; justify-items: center; }
  .uwaga h3 { margin-bottom: 0; }
}
/* Trzecia kolumna dopiero od 1180 px. Przycisk ma stala szerokosc okolo
   410 px, wiec przy 880 px kolumna tekstu schodzila do 200 px i akapit lamal
   sie po trzy slowa. Ponizej tego progu wyjscie zostaje pod tekstem. */
@media (min-width: 1180px) {
  .uwaga {
    grid-template-columns: minmax(0, auto) minmax(0, 1fr) minmax(0, auto);
  }
  .uwaga__tresc { display: contents; }
  .uwaga__akcja { margin-top: 0; }
}
.uwaga h3 {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .13em;
  text-transform: uppercase; color: var(--akcent); margin-bottom: 10px;
}
.uwaga p { font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); max-width: 68ch; }
/* Biel w stanie spoczynku, nie obrys: na wypelnionym turkusie przycisk musi
   byc widoczny sam z siebie, a nie dopiero po najechaniu. Etykieta w kolorze
   plaszczyzny daje na bieli 5.47. Na najechanie odwrocenie: przycisk oddaje
   wypelnienie i zostaje sam obrys. */
.uwaga--turkus .uwaga__akcja {
  background: #FFFFFF; color: var(--wynik-ciemny); border-color: #FFFFFF;
}
.uwaga--turkus .uwaga__akcja:hover {
  background: transparent; color: #FFFFFF; border-color: rgba(255, 255, 255, .7);
}
/* Wariant na turkusie `--wynik-ciemny` #0F766E, tym samym co pas z licznikiem
   (prosba Dominika 08.08.2026). Ten sam mechanizm co w `.liczby--turkus`:
   podmieniony zestaw tokenow, zeby reguly wyzej nie musialy wiedziec, ze
   stoja na kolorze.

   Burgund schodzi z etykiety i ikony, bo #991919 na #0F766E daje 1,7 i czyta
   sie jak wylaczone. Decyzja Teresy z 28.07 dopuszczala czerwien w naglowku
   tego bloku na jasnym tle; na kolorze nie ma jej gdzie postawic, wiec role
   ostrzezenia niesie sam kolor plaszczyzny i ikona. Biel na tym turkusie
   daje 5,5, czyli AA dla tekstu podstawowego.

   Obrys zostaje w rozmiarze, ale w kolorze tla: bez tego wypelniony kaflik
   dostawalby jasna obwodke, ktorej nie ma zaden inny blok na stronie. */
.uwaga--turkus {
  --tlo:        var(--wynik-ciemny);
  --tlo-cichy:  var(--wynik-ciemny);
  --atrament:   #FFFFFF;
  --atrament-2: #FFFFFF;
  --szept:      #FFFFFF;
  --akcent:     #FFFFFF;
  --wlos:       rgba(255, 255, 255, .28);
  --wlos-mocny: var(--wynik-ciemny);

  background: var(--wynik-ciemny);
  color: #FFFFFF;
}

/* ==========================================================================
   CO TO ZNACZY W PRAKTYCE: dwie kolumny wierszy bez ramek, linie poziome.
   Układ przeniesiony z v2, bo czytelnik czyta tu wszystko: to lista zmian
   w firmie, więc rytm jest gęsty.
   ========================================================================== */

/* Byly to wiersze rozdzielone kreskami. Teraz karty, bo ikona potrzebuje
   pola, na ktorym moze usiasc. Ikona idzie w tlo, nie przed tekst: ma byc
   znakiem rozpoznawczym karty, a nie ozdobnikiem przy etykiecie. */
.siatka { display: grid; gap: 14px; }
@media (min-width: 760px) { .siatka { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.siatka > li {
  position: relative; overflow: hidden;
  padding: 22px 24px;
  border: 1px solid var(--wlos);
  border-radius: var(--promien);
  background: var(--tlo);
}
.klucz__ikona {
  /* Pelny kolor zamiast znaku wodnego: turkus przy 20% krycia skladal sie
     z biala kartka do 13% nasycenia, czyli czytal sie jako szarosc. Mniejsza
     i wyrazna pracuje lepiej niz duza i wyblakla. */
  position: absolute; right: 20px; top: 20px;
  width: 34px; height: 34px;
  color: var(--wynik); opacity: 1;
  pointer-events: none;
}
/* Tekst ustepuje ikonie miejsca, zeby nie lezala na slowach. */
.siatka .klucz, .siatka .odp { padding-right: 46px; }
.siatka .klucz {
  position: relative;
  display: block; margin-bottom: 8px;
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .1em;
  text-transform: uppercase; color: var(--wynik-ciemny);
  font-variant-numeric: tabular-nums;
}
.siatka .odp, .siatka > li > p { position: relative; }
.siatka .odp { font-size: var(--t-tekst); font-weight: 500; color: var(--atrament); margin-bottom: 7px; }
.siatka p:not(.odp) { font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); }
.siatka h3 { font-size: var(--t-karta); margin-bottom: 6px; }

/* Wczesniej byly to wiersze w dwoch kolumnach, wiec druga pozycja jako
   pierwsza w prawej kolumnie nie miala miec kreski nad soba. W ukladzie
   kartowym ta sama regula zabierala jednej karcie gorny padding. */
@media (min-width: 900px) {
  .siatka { column-gap: 18px; }
}

/* ==========================================================================
   ŚCIEŻKA: jedyna sekcja z podziałem lewo/prawo. Lista jest długa,
   więc nagłówek zostaje przyklejony jako kotwica.
   ========================================================================== */

.dwie {
  display: grid; grid-template-columns: minmax(240px, 1fr) 2.1fr;
  gap: clamp(32px, 5vw, 72px); align-items: start;
}
@media (max-width: 980px) { .dwie { grid-template-columns: 1fr; gap: 34px; } }
.dwie__kotwica { position: sticky; top: 102px; }
@media (max-width: 980px) { .dwie__kotwica { position: static; } }
.dwie__kotwica h2 { margin-top: 16px; font-size: var(--t-dzial); letter-spacing: -.03em; }
.dwie__kotwica p {
  margin-top: 16px; font-size: var(--t-tekst); line-height: 1.62;
  color: var(--szept); max-width: 34ch;
}

/* Etapy sa nastepstwem, nie zbiorem, wiec przez medaliony biegnie pionowa os.
   Kazdy odcinek nalezy do swojego etapu i siega srodka nastepnej ikony, wiec
   linia nie zalezy od tego, co stoi pod ostatnim etapem. Ostatni etap odcinka
   nie ma, inaczej os wychodzilaby w pustke. */
.etapy { border-top: 1px solid var(--wlos); }
.etap {
  display: grid; grid-template-columns: 54px 1fr; gap: 22px;
  padding-block: 24px; border-bottom: 1px solid var(--wlos);
}
.etap__znak {
  position: relative;
  display: grid; justify-items: center; align-content: start; gap: 7px;
}
/* Pionowa kreska laczaca ikony zdjeta 08.08.2026 (prosba Dominika). Kolejnosc
   niosa juz numery pod ikonami i kreski miedzy etapami, wiec linia dokladala
   trzeci sposob mowienia tego samego. `position: relative` na .etap__znak
   i `z-index` na ikonie zostaja: pierwsze trzyma uklad, drugie wyprowadza
   ikone nad kreske dolna etapu. */
.etap__ikona {
  position: relative; z-index: 1;
  width: 44px; height: 44px;
  display: grid; place-items: center;
  border-radius: 50%; background: #fff;
  border: 1.5px solid color-mix(in srgb, var(--wynik) 38%, #fff);
  color: var(--wynik-ciemny);
  transition: border-color .2s ease, color .2s ease;
}
.etap__ikona svg { width: 21px; height: 21px; }
.etap:hover .etap__ikona { border-color: var(--wynik); color: var(--akcent); }
@media (prefers-reduced-motion: reduce) { .etap__ikona { transition: none; } }
@media (max-width: 620px) {
  .etap { grid-template-columns: 44px 1fr; gap: 14px; }
}
/* Bez opacity: numer to tekst, a przy polprzezroczystosci kontrast na bieli
   spadal do okolic 2.4, wiec ponizej progu czytelnosci. */
.etap__nr {
  font-size: var(--t-etyk); font-weight: 600; color: var(--szept); line-height: 1;
  letter-spacing: .04em; font-variant-numeric: tabular-nums;
}

/* Pasek pod etapami: ile to trwa i kto prowadzi. Dwa pytania, ktore padaja
   przed pytaniem o cene, wiec stoja od razu po opisie pracy. */
/* Kafel na turkusie zamiast dwoch szarych wierszy pod lista etapow
   (08.08.2026, prosba Dominika). Ten sam mechanizm co w `.liczby--turkus`,
   `.uwaga--turkus` i `.zdanie--turkus`: podmieniony zestaw tokenow, zeby
   reguly nizej nie musialy wiedziec, ze stoja na kolorze.

   Powod: te dwa fakty odpowiadaja na pytania, ktore padaja przed pytaniem
   o cene, a stojac na bieli w kolorze szeptu wygladaly jak przypis do
   ostatniego etapu. Kolor odcina je od listy i robi z nich osobna rzecz.

   Biel na #0F766E daje 5,47, wiec 14 px przechodzi AA. Fiolet ikon schodzi
   do bieli: #4B2E57 na tym tle ma 1,5 i znika. */
.sciezka__fakty {
  --atrament: #FFFFFF;
  --szept:    #FFFFFF;

  /* Kolumna po lewej jest przyklejona (`.dwie__kotwica`, position: sticky),
     a ten kafel rozciaga sie na obie kolumny tej samej siatki. Bez wlasnego
     kontekstu ukladania przyklejony naglowek malowal sie NA kaflu i przy
     przewijaniu oba teksty nakladaly sie na siebie (zgloszone 09.08.2026,
     odtworzone przy scrollY 5613-6513). Kafel ma byc na wierzchu: naglowek
     chowa sie pod nim, tak jak chowa sie pod kazda kolejna sekcja. */
  position: relative; z-index: 1;

  /* Kafel wychodzi z prawej kolumny na cala szerokosc `.miara`, tak jak
     `.uwaga--turkus` i `.zdanie--turkus`. Lista jest teraz dzieckiem
     `.miara.dwie`, nie `.etapy`: siedzac w kolumnie etapow czytala sie jako
     ich ciag dalszy, a ma byc przerwa miedzy lista pracy a cennikiem. */
  grid-column: 1 / -1;

  display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 22px 30px; margin-top: clamp(32px, 4vw, 48px);
  padding: 26px 28px; list-style: none;
  background: var(--wynik-ciemny); color: #FFFFFF;
  border-radius: var(--promien);
}
.sciezka__fakty li {
  display: grid; grid-template-columns: 22px 1fr; gap: 12px; align-items: start;
  font-size: var(--t-nota); color: var(--szept); line-height: 1.6;
}
.sciezka__fakty svg { width: 22px; height: 22px; color: #FFFFFF; }
.sciezka__fakty b { display: block; color: var(--atrament); font-weight: 600; }
.etap h3 { font-size: var(--t-karta); letter-spacing: -.02em; }
.etap p:not([class]) { margin-top: 10px; color: var(--atrament-2); font-size: var(--t-tekst); max-width: 62ch; }
/* Wynik etapu miał własną linię górną. Przy pięciu etapach dawało to
   trzy poziome linie na wiersz i strona czytała się jak krata. Linia
   idzie z poziomu na pion: wcięcie z kreską akcentu po lewej. */
.etap__wynik {
  margin-top: 15px; padding: 2px 0 2px 14px;
  border-left: 2px solid var(--wynik);
  font-size: var(--t-nota); color: var(--szept);
}
.etap__wynik b {
  display: block; margin-bottom: 5px;
  font-weight: 500; color: var(--wynik-ciemny); font-size: var(--t-etyk);
  letter-spacing: .12em; text-transform: uppercase;
}

/* ==========================================================================
   ZEGAR INCYDENTOWY: dwie liczby na dużą skalę plus tabela terminów.
   Rozbija rytm tekstu.
   ========================================================================== */

.doba {
  display: grid; grid-template-columns: auto 1fr;
  gap: clamp(32px, 6vw, 72px); align-items: center;
}
@media (max-width: 820px) { .doba { grid-template-columns: 1fr; gap: 26px; } }
.doba__liczby { display: flex; align-items: baseline; gap: 18px; }
.doba__liczby b {
  font-size: var(--t-liczba-xl); font-weight: 600; line-height: .9;
  letter-spacing: -.05em; color: var(--akcent); font-variant-numeric: tabular-nums;
}
/* Ukośnik między liczbami: na włosie miał kontrast 1.27, więc idzie na szept. */
.doba__liczby i {
  font-style: normal; font-size: var(--t-liczba);
  color: var(--szept); font-weight: 300;
}
.doba__liczby span {
  font-size: var(--t-nota); color: var(--szept); align-self: flex-end; padding-bottom: 8px;
}
.doba h2 { font-size: var(--t-dzial); letter-spacing: -.026em; }
.doba p:not([class]) { margin-top: 14px; font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); max-width: 56ch; }

.tabela-przewijana { overflow-x: auto; margin-top: 44px; }
table.terminy { width: 100%; border-collapse: collapse; font-size: var(--t-tekst); }
table.terminy caption {
  text-align: left; padding-bottom: 14px;
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .12em;
  text-transform: uppercase; color: var(--szept);
}
table.terminy th, table.terminy td {
  text-align: left; padding: 14px 16px 14px 0;
  border-bottom: 1px solid var(--wlos); vertical-align: top;
}
table.terminy thead th {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .1em;
  text-transform: uppercase; color: var(--szept);
  white-space: nowrap;
}
table.terminy tbody th {
  width: 120px; white-space: nowrap; font-weight: 600;
  color: var(--przelamanie); font-variant-numeric: tabular-nums;
}
table.terminy td { color: var(--atrament-2); }

.zrodlo { margin-top: 22px; font-size: var(--t-nota); line-height: 1.6; color: var(--szept); max-width: 72ch; }
.zrodlo a { color: var(--akcent); text-decoration: none; border-bottom: 1px solid transparent; }
.zrodlo a:hover { border-bottom-color: var(--akcent); }

/* ==========================================================================
   PRZERYWNIK: jedno zdanie na dużą skalę, z przypisem obok. Klasa była
   w landing-czysty.html i nie została użyta. Rozbija rytm tekstu i daje
   oku miejsce, w którym nic nie trzeba czytać ze zrozumieniem.
   ========================================================================== */

.zdanie { border-top: 1px solid var(--wlos); padding-block: var(--rytm); }
.zdanie__uklad {
  display: grid; grid-template-columns: auto 1fr;
  gap: clamp(28px, 5vw, 64px); align-items: start;
}
@media (max-width: 820px) { .zdanie__uklad { grid-template-columns: 1fr; gap: 22px; } }
/* Wykluczony przypis, nie „bez klasy": duze zdanie nosi klase `wchodzi`,
   wiec `:not([class])` zabraloby styl jemu, a nie przypisowi. */
/* Stopien nizej niz naglowek sekcji i lzejszy rysunek (08.08.2026). Na
   `--t-dzial` w grubosci 500 zdanie wazylo tyle co h2 obok, przez co pas
   przerywnika konkurowal z naglowkami sekcji zamiast je rozdzielac. */
.zdanie p:not(.zdanie__zrodlo) {
  font-size: clamp(21px, 2.3vw, 27px); line-height: 1.34;
  letter-spacing: -.028em; font-weight: 400; max-width: 24ch;
}
.zdanie p b { font-weight: 500; color: var(--akcent); }
/* Cale zdanie siedzi dzis w <b>, wiec grubosc niesie regula wyzej. */
.zdanie p > b:only-child { font-weight: inherit; }
/* Szersza miara i nizsze osadzenie (08.08.2026). 30ch lamalo przypis po trzy
   slowa przy zdaniu, ktore obok ma cztery wiersze; 44ch mieszcza go w dwoch.
   `margin-top` zdejmuje go z gornej krawedzi kafla - przy `align-items: start`
   stal rowno z pierwszym wierszem zdania i czytal sie jak jego ciag dalszy. */
.zdanie__zrodlo {
  font-size: var(--t-tekst); line-height: 1.6; font-weight: 400; letter-spacing: 0;
  color: var(--szept); max-width: 44ch;
  margin-top: clamp(14px, 2vw, 28px);
  padding-top: 10px; border-top: 1px solid var(--wlos);
}
/* Zdanie-przerywnik jako KAFEL na turkusie, nie pas na cala szerokosc
   (08.08.2026, decyzja Dominika po obejrzeniu wersji pelnoekranowej).

   Pas przez cala szerokosc mial dwa problemy: prawa dolna cwiartka ziala
   pustka, bo zdanie ma cztery wiersze a przypis trzy, i trzeci mocny kolor
   w zasiegu jednego przewiniecia zaczynal konkurowac z pasem licznika oraz
   z kaflem "Czesty blad". Kafel siedzi w bialej sekcji, wiec kolor pracuje
   na mniejszej powierzchni i nie rozdziela strony na dwie polowy.

   Tokeny podmieniane na kaflu, nie na sekcji - reszta sekcji zostaje biala.
   Ten sam mechanizm co w `.liczby--turkus` i `.uwaga--turkus`. */
.zdanie--turkus .zdanie__uklad {
  --tlo:        var(--wynik-ciemny);
  --tlo-cichy:  var(--wynik-ciemny);
  --atrament:   #FFFFFF;
  --atrament-2: #FFFFFF;
  /* Przypis to 16 px, czyli tekst zwykly w rozumieniu WCAG: prog 4,5.
     Biel na 82 proc. dawala 4,24 i nie przechodzila; 92 proc. daje 4,93. */
  --szept:      rgba(255, 255, 255, .92);
  --wlos:       rgba(255, 255, 255, .28);
  --wlos-mocny: rgba(255, 255, 255, .5);
  --przelamanie: #FFFFFF;

  background: var(--wynik-ciemny);
  color: #FFFFFF;
  border-radius: var(--promien);
  padding: clamp(28px, 3.6vw, 52px);
}
.zdanie--turkus p:not(.zdanie__zrodlo) { color: rgba(255, 255, 255, .92); }
.zdanie--turkus p b { color: #FFFFFF; }

/* Sylwetki w trzeciej kolumnie kafla (08.08.2026, prosba Dominika).

   Komentarz wyzej opisywal, ze w wersji pelnoekranowej prawa dolna cwiartka
   ziala pustka. Na kaflu problem wrocil w mniejszej skali: przypis konczy sie
   wczesniej niz zdanie i po prawej zostawal pusty turkus. Trzecia kolumna to
   wypelnia trescia, ktora mowi to samo co zdanie: grupa, z ktorej jedna osoba
   wychodzi na pierwszy plan.

   Ponizej 820 px kolumna znika. Na waskim ekranie szesc sylwetek w rzedzie
   schodzi do 18 px i przestaje cokolwiek znaczyc, a zdanie ma zostac zdaniem. */
/* Srodkowa kolumna z przypisem dostaje dolna granice: przy samym `1fr`
   zostawalo jej 216 px miedzy zdaniem a grupka ludzikow i przypis lamal sie
   po trzy slowa. `minmax` zabiera brakujace piksele kolumnie ze zdaniem,
   ktora ma wlasny `max-width` i moze zejsc nizej bez szkody. */
.zdanie--turkus .zdanie__uklad {
  grid-template-columns: minmax(0, auto) minmax(300px, 1fr) auto;
  column-gap: clamp(24px, 3.4vw, 48px);
}

/* Siatka 3x2 czytala sie jak tabelka pracownikow, nie jak zespol. Kolka stoja
   teraz na wlasnych pozycjach i zachodza na siebie jak na zdjeciu grupowym.
   Wspolrzedne i srednice sa w procentach pola 190x130, wiec cala grupa skaluje
   sie jednym `width` i nie rozjezdza sie na posrednich szerokosciach. */
.zdanie__ludzie {
  position: relative; align-self: center;
  width: clamp(148px, 13.5vw, 190px); aspect-ratio: 190 / 130;
}
.zdanie__ludzik {
  position: absolute; display: grid; place-items: center;
  aspect-ratio: 1; border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, .34);
  background: rgba(255, 255, 255, .07);
  color: rgba(255, 255, 255, .62);
  /* Obwodka w kolorze kafla: bez niej stykajace sie kolka zlewaja sie w plame
     i grupa traci policzalnosc. Kolor musi byc ten sam co tlo kafla. */
  box-shadow: 0 0 0 3px var(--wynik-ciemny);
}
.zdanie__ludzik svg { width: 54%; height: auto; }
.zdanie__ludzik:nth-child(1) { left: 0;     top: 20%;   width: 24.2%; }
.zdanie__ludzik:nth-child(2) { left: 21.1%; top: 0;     width: 23.2%; }
.zdanie__ludzik:nth-child(3) { left: 34.7%; top: 38.5%; width: 33.7%; }
.zdanie__ludzik:nth-child(4) { left: 48.4%; top: 6.2%;  width: 25.3%; }
.zdanie__ludzik:nth-child(5) { left: 7.4%;  top: 60%;   width: 24.2%; }
.zdanie__ludzik:nth-child(6) { left: 73.7%; top: 47.7%; width: 24.2%; }
/* Ta jedna osoba: najwieksze kolko, pelna biel, sylwetka w kolorze kafla.
   Stoi na wierzchu, bo to ona wychodzi z grupy, a nie grupa zaslania ja. */
.zdanie__ludzik--ten {
  z-index: 2; border-color: #FFFFFF;
  background: #FFFFFF; color: var(--wynik-ciemny);
}
@media (max-width: 820px) {
  .zdanie--turkus .zdanie__uklad { grid-template-columns: 1fr; }
  .zdanie__ludzie { display: none; }
}

/* ==========================================================================
   ZRÓŻNICOWANIE UKŁADÓW (28.07.2026)

   Inwentaryzacja wykazała, że schemat „szyld plus trzy elementy w rzędzie"
   powtarzał się pięć razy: decyzje, kto-co, zakres, uzupełniające, materiały.
   Dwie ostatnie używały wręcz tego samego komponentu. SYSTEM-WIZUALNY pkt 4.1
   nazywa to wprost przyczyną oceny „jedna długa ściana".

   Trzy sekcje dostają układy, których nie ma nigdzie indziej na stronie,
   wszystkie trzy wymienione w dokumentacji jako sprawdzone warianty.
   ========================================================================== */

/* FAQ w wąskiej kolumnie czytania. Akordeon na pełnej szerokości zmuszał
   oko do przebiegania 1180 px w poszukiwaniu początku następnego pytania. */
/* FAQ używa `<details class="pyt">` bez wspólnego kontenera, więc wąską
   kolumnę wymusza się na samych elementach. */
#faq .pyt,
#faq .zrodlo,
#faq .szyld { max-width: 760px; }

/* Materiały: poziome wiersze zamiast trzeciej z rzędu siatki kafli.
   Etykieta po lewej, treść po prawej, link na końcu wiersza. */
/* `grid-template-columns` musi byc nadpisane wprost: klasa bazowa
   `.wejscia` ustawia repeat(3, 1fr) i bez tego kazdy wiersz probowal
   zmiescic sie w jednej trzeciej szerokosci, co dawalo 254 px
   przewijania w poziomie. */
.wejscia.wejscia--wiersze { display: grid; grid-template-columns: 1fr; gap: 0; }
/* Kazdy wiersz mial wlasna siatke, wiec kolumna tytulu raz miala 108 px,
   raz 245: szerokosc wynikala z dlugosci tekstu obok, nie z ukladu. Tytul
   "Trzy szkolenia, trzy rozne grupy" lamal sie przez to na piec linii.
   Teraz rozmieszczenie jest jawne: etykieta, tytul z opisem, przycisk. */
.wejscia.wejscia--wiersze .wejscie {
  display: grid;
  grid-template-columns: 170px minmax(0, 1fr) auto;
  grid-template-rows: auto auto;
  align-items: start;
  column-gap: clamp(20px, 3vw, 40px);
  row-gap: 6px;
  border: 0;
  border-top: 1px solid var(--wlos);
  border-radius: 0;
  padding: 26px 0;
}
.wejscia.wejscia--wiersze .wejscie__co { grid-column: 1; grid-row: 1 / -1; align-self: center; margin: 0; }
.wejscia.wejscia--wiersze .wejscie h3 { grid-column: 2; grid-row: 1; }
.wejscia.wejscia--wiersze .wejscie p:not(.wejscie__co) { grid-column: 2; grid-row: 2; max-width: 62ch; }
.wejscia.wejscia--wiersze .wejscie .dzialanie { grid-column: 3; grid-row: 1 / -1; align-self: center; white-space: nowrap; }
.wejscia.wejscia--wiersze .wejscie:last-child { border-bottom: 1px solid var(--wlos); }
.wejscia.wejscia--wiersze .wejscie:hover { border-color: var(--wlos); background: transparent; }
.wejscia.wejscia--wiersze h3 { margin: 0 0 4px; }
.wejscia.wejscia--wiersze p { margin: 0; flex: none; }
.wejscia.wejscia--wiersze .dzialanie { margin: 0; }

@media (max-width: 820px) {
  .wejscia.wejscia--wiersze .wejscie {
    grid-template-columns: 1fr;
    grid-template-rows: none;
    gap: 10px;
    align-items: start;
  }
  .wejscia.wejscia--wiersze .wejscie__co,
  .wejscia.wejscia--wiersze .wejscie h3,
  .wejscia.wejscia--wiersze .wejscie p:not(.wejscie__co),
  .wejscia.wejscia--wiersze .wejscie .dzialanie { grid-column: 1; grid-row: auto; }
  .wejscia.wejscia--wiersze .dzialanie { margin-top: 8px; }
}

/* Zasady współpracy: wąska kolumna, jedna pod drugą, numer przy krawędzi.
   Siatka dwa na dwa była czwartą siatką na stronie. */
/* Kolumna 820 px plus `max-width: 24ch` na nagłówku dawały tekst szeroki
   na cztery słowa i sekcję rozciągniętą na trzy ekrany. Kolumna idzie na
   pełną szerokość treści, a nagłówek traci ograniczenie. */
.zasady.zasady--lista {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  counter-reset: zasada;
}
.zasady.zasady--lista .zasada h3 { max-width: none; margin-top: 0; }
.zasady.zasady--lista .zasada p { max-width: 78ch; margin-top: 8px; }
.zasady.zasady--lista .zasada {
  counter-increment: zasada;
  display: grid;
  grid-template-columns: 56px 1fr;
  gap: clamp(16px, 2vw, 28px);
  border: 0;
  border-top: 1px solid var(--wlos);
  border-radius: 0;
  padding: 26px 0;
}
.zasady.zasady--lista .zasada:last-child { border-bottom: 1px solid var(--wlos); }
.zasady.zasady--lista .zasada:hover { border-color: var(--wlos); }
/* Numer musi zajac wszystkie wiersze, inaczej trafia do siatki jako
   piaty element obok naglowka i dwoch akapitow, ktore rozsypuja sie
   na trzy wiersze po dwie kolumny. Sekcja miala przez to 2941 px. */
.zasady.zasady--lista .zasada > * { grid-column: 2; }
.zasady.zasady--lista .zasada::before {
  grid-column: 1; grid-row: 1 / -1;
  /* Bez zera wiodacego, jak reszta wyliczen na stronie (08.08.2026). */
  content: counter(zasada, decimal);
  font-size: var(--t-karta); font-weight: 600;
  color: var(--wlos-mocny); opacity: .28;
  font-variant-numeric: tabular-nums;
}
.zasady.zasady--lista .zasada__nr { display: none; }
/* Marginesy z wariantu kartowego dublowaly sie z przerwami siatki,
   stad zerowanie i 8px w regulach h3 i p wyzej. */
.zasady.zasady--lista .zasada .drobne { margin-top: 10px; }

@media (max-width: 620px) {
  .zasady.zasady--lista .zasada { grid-template-columns: 1fr; gap: 8px; }
  .zasady.zasady--lista .zasada::before { font-size: var(--t-etyk); }
}

/* ==========================================================================
   OŚ INCYDENTU: jedyna grafika na stronie, i niesie treść.

   Historia tłumaczy, dlaczego nie jest generowana: 27.07 weszły cztery
   obrazy z Gemini i tego samego dnia wyleciały z oceną „wklejone bez sensu,
   dekoracja udająca treść" (commit 62ca13f). `docs/SYSTEM-WIZUALNY.md`
   pkt 6.4 mówi wprost: grafiki niosące treść buduj w SVG, bo model obrazowy
   nie napisze „72 h", a zmiana terminu ma być edycją liczby, nie promptem.
   ========================================================================== */

.os-incydentu { margin: clamp(32px, 4vw, 48px) 0 0; }
.os-incydentu svg { width: 100%; height: auto; display: block; overflow: visible; }
.os-incydentu__czas {
  font-family: inherit; font-size: 15px; font-weight: 600;
  letter-spacing: -.01em;
}
.os-incydentu__co {
  font-family: inherit; font-size: 13px; fill: var(--szept);
}
.os-incydentu figcaption {
  margin-top: 18px; padding-top: 14px;
  border-top: 1px solid var(--wlos);
  font-size: var(--t-nota); line-height: 1.6; color: var(--szept);
  max-width: 62ch;
}

/* Poniżej 720 px oś kładzie się w pion: przewijanie w bok jest
   niewykrywalne dla użytkownika (SYSTEM-WIZUALNY pkt 6.4). */
@media (max-width: 720px) {
  .os-incydentu svg { display: none; }
  .os-incydentu figcaption { border-top: 0; padding-top: 0; margin-top: 0; }
}

/* ==========================================================================
   EFEKTY: wiersze, hasło po lewej, wyjaśnienie po prawej. Czytelnik skanuje
   hasła i schodzi w prawo tylko przy jednym, więc rytm jest rozstrzelony.
   ========================================================================== */

.efekty { border-top: 1px solid var(--wlos); }
.efekt {
  display: grid; grid-template-columns: minmax(220px, .9fr) 1.7fr;
  gap: clamp(20px, 4vw, 56px); padding-block: 21px;
  border-bottom: 1px solid var(--wlos); align-items: baseline;
}
@media (max-width: 760px) { .efekt { grid-template-columns: 1fr; gap: 8px; } }
.efekt h3 { font-size: var(--t-karta); letter-spacing: -.024em; color: var(--atrament); }
.efekt p { font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); max-width: 56ch; }

/* ==========================================================================
   POLA: cztery lub trzy pozycje stykające się włosem.
   Używane przy zestawieniu "kto co robi na rynku".
   ========================================================================== */

/* Osobne ramki, tak jak przy decyzjach i pakietach. Wczesniej byla to
   siatka stykajaca sie wlosem, ze wspolna ramka zewnetrzna, przez co
   trzy zestawienia na stronie mialy trzy rozne sposoby zamykania karty. */
.pola { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(20px, 2.6vw, 32px); }
@media (max-width: 900px) { .pola { grid-template-columns: 1fr; gap: 20px; } }
.pole {
  background: var(--tlo); padding: 26px 24px 28px;
  position: relative; overflow: hidden;
  display: flex; flex-direction: column;
  border: 1px solid var(--wlos);
  transition: border-color .16s ease;
  border-radius: var(--promien);
  /* Pierwszy .kotwica miedzy .szyld a .domkniecie jest display:block height:0,
     wiec w gridzie .koniec__uklad dostaje pusty wiersz i gap naklada sie
     podwojnie. Kompensujemy tu, zostawiajac reszte serwisu w spokoju. */
  #kontakt .koniec__uklad { gap: 16px; }
  #kontakt .szyld { margin-bottom: 0; }
  #kontakt .domkniecie { margin-top: 0; padding-top: 24px; }
}
.pas--cichy .pole { background: var(--tlo); }
.pole:hover { border-color: var(--wlos-mocny); }
.pole--my { border-color: var(--akcent); }
/* Ikona jako znak wodny kafla, nie jako element treści. Duża, przycięta
   krawędzią karty, bardzo jasna: ma dać kaflowi charakter, a nie kazać się
   czytać. Źródło: Tabler Icons, licencja MIT, ten sam zestaw co w menu
   z index-nowy.html, więc kreska ma tę samą grubość co reszta strony.

   `aria-hidden` na każdej: dla czytnika ekranu kategoria jest już w etykiecie
   nad tytułem, więc ikona byłaby powtórzeniem. */
.pole__ikona {
  position: absolute;
  /* Prawy dolny rog, w calosci w kadrze. Gorny odpada, bo dluzsze tytuly
     ("Dostawca infrastruktury") wchodza na ikone. Zeby nie ginela pod
     tekstem stopki, stopka ma nizej ograniczona szerokosc. */
  right: 20px; bottom: 20px;
  width: 40px; height: 40px;
  /* pelny kolor, jak w kartach praktyki: przygaszona ikona w rogu kafla
     nie czytala sie ani jako znak, ani jako tlo */
  color: var(--wynik);
  opacity: 1;
  pointer-events: none;
}
.pole--my .pole__ikona { opacity: .1; }
.pole > *:not(.pole__ikona) { position: relative; }

.pole__co {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .11em;
  text-transform: uppercase; color: var(--wynik-ciemny); margin-bottom: 12px;
}

.pole h3 { font-size: var(--t-karta); letter-spacing: -.018em; }
.pole p:not([class]) {
  margin-top: 11px; font-size: var(--t-tekst); line-height: 1.6;
  color: var(--atrament-2); flex: 1;
}
/* Domknięcie kafla: co po tej opcji nadal zostaje do zrobienia.
   Wypełnia dolną połowę treścią, a nie odstępem. */
.pole__zostaje {
  /* auto u gory: karty maja rozne dlugosci opisow, a linia nad stopka
     ma stac w kazdej na tej samej wysokosci */
  margin-top: auto;
  max-width: calc(100% - 84px);
  padding-top: 18px;
  /* Stale miejsce na trzy wiersze: bez tego kreska nad stopka stala w kazdej
     karcie na innej wysokosci, bo teksty maja rozna dlugosc. Rezerwacja
     miejsca jest uczciwsza niz naginanie tresci do ukladu. */
  min-height: calc(3 * 1.55em + 18px);
  border-top: 1px solid var(--wlos);
  font-size: var(--t-nota); line-height: 1.55; color: var(--szept);
}
/* Nie turkusem: turkus znaczy "zrobione", a te akapity mowia dokladnie
   odwrotnie ("zostaje po Waszej stronie", "czego nie zrobimy"). Wyroznia
   je waga i kreska nad nimi. */
.pole__zostaje b { font-weight: 600; color: var(--atrament); }

/* ==========================================================================
   ZAKRES: trzy pakiety w kolumnach, kreska u góry każdego
   ========================================================================== */

/* PION ZAMIAST TRZECH KOLUMN, 08.08.2026 (szkic Dominika)

   Trzy etapy stały obok siebie i czytały się jak cennik: trzy równorzędne
   opcje do wyboru. Ustawione jeden pod drugim czytają się jak kolejność,
   czyli tak, jak faktycznie działa oferta - "każdy etap zawiera poprzedni".

   Fiolet niesie tę kolejność: pionowa oś biegnie przez całą sekcję, a każdy
   etap siedzi na niej węzłem. To jedyne miejsce, gdzie fiolet wychodzi z tła
   na pierwszy plan - dotąd był wyłącznie w kształtach za treścią. Kolor ma
   tu robotę do wykonania, nie jest ozdobą: pokazuje, że to jedna ścieżka,
   a nie trzy oddzielne produkty.

   Snapshot przed zmianą: backups/2026-08-08_przed-pionowymi-pakietami/ */
.pakiety {
  display: grid; grid-template-columns: minmax(0, 1fr);
  gap: clamp(22px, 2.6vw, 34px);
  counter-reset: etap;
  position: relative;
}
/* Oś z węzłami zdjęta razem z przejściem głów na fiolet (08.08.2026). Miała
   sens, gdy kafle były turkusowe, a fiolet biegł obok jako jedyny znak, że to
   jedna ścieżka. Kiedy kolor wszedł do samych kafli, oś powtarzała ten sam
   sygnał drugi raz i przy sześciu etapach robiła z sekcji drabinę. Kolejność
   niesie teraz układ pionowy i numery.

   Gdyby oś miała wrócić: węzeł to `.pakiet[data-produkt]::before` na
   `left: -50px; top: 27px`, odcinek `::after` na `left: -43px`, a `.pakiety`
   potrzebuje `padding-left: 62px`. Kafel musi zostać bez `overflow: hidden`. */
@media (max-width: 759px) {
  /* Bez osi: przy jednej kolumnie na całą szerokość linia i węzły zjadały
     margines, który jest potrzebny treści. Kolejność niesie sam układ. */
  .pakiety { gap: 20px; }
}
/* Kafle oferty dostaja tlo (Teresa, nagranie 28.07: "kafelki tej oferty
   moglyby byc inaczej, kolorem, tlo, bo jak ktos zjedzie juz do oferty,
   to zeby sie wyroznilo i zlapalo oko"). Odcien liczony z akcentu, wiec
   chodzi za wariantem i nie trzeba go pilnowac osobno.

   Cztery procent wystarcza, zeby oko zlapalo zmiane plaszczyzny, a tekst
   nadal ma pelny kontrast wzgledem tla. */
.pakiet {
  display: flex; flex-direction: column;
  /* `position: relative` pod wezel na osi. `overflow` zdjete z kafla, bo
     wezel siedzi poza jego lewa krawedzia i bylby przyciety; zaokraglenie
     glowy niesie teraz sama glowa, nizej. */
  position: relative;
  padding: 0;
  border: 1px solid var(--wlos);
  /* Biale, nie rozcienczony burgund: burgund z biela daje roz (#F7EDED),
     ktory wyglada tanio i nie jest kolorem marki. Kafel odcina sie tlem
     sekcji, ktore jest za nim, a nie wlasnym odcieniem. */
  background: var(--tlo);
  transition: border-color .16s ease, box-shadow .16s ease;
  border-radius: var(--promien);
}
.pakiet:hover { border-color: var(--wlos-mocny); }

/* Kazdy etap ma wlasny kolor, ale tylko na glowie kafla. Cale kafle na
   pelnym kolorze odbijaly od reszty strony i czytaly sie jak cennik SaaS.
   To nie jest powrot do samej kreski u gory, ktora Teresa odrzucila:
   kafel ma pelna ramke, a kolor niesie blok z naglowkiem. */
/* Minus 1 px, bo glowa siedzi wewnatrz ramki kafla: przy rownym promieniu
   kolor wychodzilby cienkim rogiem poza obrys. */
.pakiet__glowa {
  padding: 24px 24px 22px;
  border-radius: calc(var(--promien) - 1px) calc(var(--promien) - 1px) 0 0;
}
.pakiet > ul, .pakiet > .znaczniki, .pakiet > .dzialanie { margin-left: 24px; margin-right: 24px; }
.pakiet > .dzialanie { margin-bottom: 26px; }

/* Jeden kolor na wszystkie trzy glowy, i to turkus, nie burgund.
   Burgund zostaje przy przyciskach i drobnych akcentach: jako plama na
   jednej trzeciej sekcji byl za mocny. Etapy rozroznia numer i naglowek,
   nie barwa: trzy rozne kolory obok siebie czytaly sie jak trzy obce marki. */
/* Glowa na fiolecie, nie na turkusie (08.08.2026, decyzja Dominika). Turkus
   jest na tej stronie kolorem wyniku i niesie go pas z licznikiem, kaflik
   "Czesty blad" i zdania-przerywniki. Sciezka oferty dostaje wlasny kolor,
   wiec trzy etapy nie czytaja sie jak kolejny blok wyniku.

   Ramka kafla zostaje w fiolecie rozcienczonym, nie w pelnym: pelny obrys
   wokol calego kafla plus pelna glowa dawaly dwie mocne plamy tego samego
   koloru na jednym elemencie. */
.pakiet[data-produkt] {
  border-color: color-mix(in srgb, var(--fiolet) 38%, transparent);
  counter-increment: etap;
}
.pakiet[data-produkt] .pakiet__glowa {
  background: var(--fiolet);
  position: relative; overflow: hidden;
}
/* Numer etapu jako znak wodny: rozroznia kafle bez wprowadzania trzeciego
   i czwartego koloru, ktore czytaly sie jak trzy obce marki. Licznik `etap`
   startuje w .pakiety, a podbija go kazdy .pakiet[data-produkt] wyzej. */
/* Bez zera wiodacego (08.08.2026, decyzja Dominika: zadne wyliczenie na
   stronie nie zaczyna sie od zera). */
.pakiet[data-produkt] .pakiet__glowa::before {
  content: counter(etap, decimal);
  position: absolute; right: 16px; top: 26px;
  font-size: 78px; font-weight: 600; line-height: .82;
  color: rgba(255,255,255,.14); letter-spacing: -.04em;
  pointer-events: none;
}
/* Sama liczba w tle nie mowi, czego dotyczy. Slowo nad nia domyka znak,
   a ze etykieta nad tytulem i tak niesie numer, ten w tle jest po to,
   zeby karte dalo sie rozpoznac z odleglosci. */
.pakiet[data-produkt] .pakiet__glowa::after {
  content: "ETAP";
  position: absolute; right: 20px; top: 8px;
  font-size: 11px; font-weight: 500; letter-spacing: .28em;
  color: rgba(255,255,255,.34); pointer-events: none;
}
.pakiet[data-produkt] .pakiet__glowa > * { position: relative; }

.pakiet__glowa h3,
.pakiet__glowa .pakiet__cena { color: #fff; }
/* Stopien naglowka karty, dopisany 09.08.2026. Ta regula wyzej ustawiala
   tylko kolor, wiec nazwy trzech pakietow bralY domyslne 18,72 px z
   przegladarki. Kazdy inny naglowek karty na tej stronie stoi na
   `--t-karta`, czyli 23 px przy 1280: `.decyzja`, `.etap`, `.pole`,
   `.zasada`, `.wejscie`, `.wejscie-zero` oraz `.skala__poz`, siedem
   komponentow. Nazwa pakietu byla jedynym naglowkiem karty mniejszym od
   pozostalych, i to akurat w sekcji, w ktorej klient wybiera.

   To byl brak reguly, nie inna regula: nigdzie nie ma sladu decyzji o
   mniejszym stopniu w tym miejscu. */
.pakiet__glowa h3 { font-size: var(--t-karta); letter-spacing: -.02em; }
.pakiet__glowa .pakiet__etap { color: rgba(255,255,255,.82); }

/* Bez dodatkowego tla i poswiaty: srodkowy kafel wyglada jak reszta.
   Wyroznienie mialo sens, gdy kazdy etap mial inny kolor; teraz tylko
   brudzilo. */
.pakiet--wybierany { box-shadow: none; }

/* align-content: start, bo grid z flex:1 rozciagal wiersze na cala wysokosc
   kafla. Kafel z pieciu pozycjami mial odstepy dwa razy wieksze niz kafel
   z siedmiu i lista wygladala na wybrakowana. */
.pakiet ul:not(.znaczniki) {
  display: grid; gap: 10px; align-content: start;
  margin-top: 24px; font-size: var(--t-tekst); color: var(--atrament-2); flex: 1;
}
/* Siatka ma dwie kolumny: punktor i tresc. Cokolwiek w <li> stoi luzem obok
   siebie (np. <b> i tekst po nim) laduje w osobnych komorkach i spada do
   waskiej kolumny punktora. Dlatego tresc z formatowaniem owijamy w <span>. */
.pakiet ul:not(.znaczniki) li { display: grid; grid-template-columns: 14px 1fr; gap: 11px; line-height: 1.55; }
/* Link w wypunktowaniu: pole trafienia poszerzone do 24 px pionowo bez
   zmiany ukladu (padding znosi sie z ujemnym marginesem). */
.pakiet ul:not(.znaczniki) a { padding-block: 3px; margin-block: -3px; }
.pakiet ul:not(.znaczniki) li > span { grid-column: 2; }
/* Punktor jak znacznik na osi terminow, tylko kwadratowy i mniejszy:
   ten sam jezyk co harmonogram, wiec lista czyta sie jak ciag punktow,
   a nie jak wyliczenie z myslnikami. Rog lekko sciety, zeby nie klocil
   sie z zaokraglonymi ramkami kart. */
.pakiet ul:not(.znaczniki) li::before {
  content: "";
  width: 8px; height: 8px;
  margin-top: 8px;
  border: 1px solid var(--wlos-mocny);
  border-radius: 2px;
  background: transparent;
  opacity: .42;
}
/* Punkt wypelniony tam, gdzie pozycja odsyla do etapu wczesniejszego
   ("wszystko z etapu 1"): to rzecz juz domknieta, a nie kolejna do
   zrobienia. Klasa w HTML, bo `:first-child` trafialby takze w zwykla
   pierwsza pozycje pakietu diagnostycznego. */
.pakiet ul:not(.znaczniki) li.zawiera::before { background: var(--wynik); border-color: var(--wynik); }
.pakiet .znaczniki { margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--wlos); }

/* KARTA OFERTY JAKO OFERTA, 08.08.2026

   Zarzut Dominika: sekcja z pakietami czytala sie jak kolejny blok tekstu
   opisowego, bo miala te sama fakture co reszta strony - akapity tej samej
   dlugosci, w tym samym kolorze. Trzech pakietow nie dalo sie zestawic bez
   przeczytania calosci, a oferta ma byc do porownania, nie do czytania.

   Research (Kopexa, VISTA InfoSec, ITSecOps, A1 Digital) daje jeden wspolny
   mianownik: nikt nie daje kilkudziesieciu slow prozy na pakiet. Opis to
   jedno zdanie, reszte niosa pola o stalych nazwach, ptaszki i liczby.

   Stad tutaj: dwa pola o tych samych nazwach w kazdej karcie (Kiedy, Czas)
   i lista tego, co klientowi zostaje. Oko jedzie w pionie: cena pod cena,
   czas pod czasem, punkt pod punktem.

   To NIE jest powrot do 27 punktow zamienionych rano na proze. Tamte
   wymienialy wszystko, co robimy; te wymieniaja to, co klient dostaje,
   i jest ich trzy do pieciu na karte. Proza nad nimi zostaje. */
.pakiet__pola {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 4px 20px;
  margin: 20px 24px 0; padding-top: 16px;
  border-top: 1px solid var(--wlos);
}
.pakiet__pola dt {
  font-size: var(--t-etyk); font-weight: 500;
  letter-spacing: .13em; text-transform: uppercase; color: var(--szept);
  margin-bottom: 3px;
}
.pakiet__pola dd {
  margin: 0; font-size: var(--t-nota); line-height: 1.45;
  color: var(--atrament); font-weight: 500;
}

.pakiet__nad {
  margin: 18px 24px 0;
  font-size: var(--t-etyk); font-weight: 500;
  letter-spacing: .13em; text-transform: uppercase; color: var(--szept);
}
/* Ptaszek zamiast kropki: to jest lista rzeczy, ktore klient dostaje,
   a nie wyliczenie czynnosci. Turkus, bo w tej palecie jest kolorem wyniku. */
.pakiet__daje {
  list-style: none; margin: 9px 24px 0; padding: 0;
  display: grid; gap: 9px;
}
.pakiet ul.pakiet__daje li {
  display: grid; grid-template-columns: 17px 1fr; gap: 10px;
  align-items: start;
  font-size: var(--t-nota); line-height: 1.5; color: var(--atrament-2);
}
.pakiet ul.pakiet__daje li::before { content: none; display: none; }
.pakiet__daje svg {
  width: 17px; height: 17px; margin-top: 2px;
  color: var(--wynik-ciemny); flex: none;
}


}
/* Numer w fiolecie, tym samym co glowa karty: laczy krok z etapem, do ktorego
   nalezy, bez dokladania czwartego koloru. Tabularne cyfry, zeby "01" i "05"
   mialy te sama szerokosc i nazwy zaczynaly sie w jednej linii. */
.pakiet .kroki__nr {
  color: var(--fiolet); font-weight: 600;
  font-variant-numeric: tabular-nums; letter-spacing: -.02em;
}
.pakiet .dzialanie { margin-top: 22px; align-self: start; }

/* ==========================================================================
   ZASADY WSPÓŁPRACY: siatka dwa na dwa, każda z grubą kreską u góry
   ========================================================================== */

.zasady {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: clamp(20px, 2.6vw, 32px);
}
@media (max-width: 820px) { .zasady { grid-template-columns: 1fr; gap: 20px; } }
.zasada {
  padding: 24px;
  border: 1px solid var(--wlos);
  transition: border-color .16s ease;
  border-radius: var(--promien);
}
.zasada:hover { border-color: var(--wlos-mocny); }
.zasada__nr {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .13em;
  text-transform: uppercase; color: var(--akcent);
}
.zasada h3 { margin-top: 11px; font-size: var(--t-karta); letter-spacing: -.02em; max-width: 24ch; }
.zasada p:not([class]) { margin-top: 12px; font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); }
.zasada__drobne { margin-top: 12px; font-size: var(--t-nota); color: var(--szept); }

/* ==========================================================================
   WEJŚCIA: trzy karty z własną ramką i przyciskiem na dole.
   Każda jest osobną ofertą, którą się osobno kupuje albo osobno otwiera,
   więc dostają osobne ramki, a nie wspólną siatkę stykającą się włosem.
   Używane przy usługach uzupełniających i materiałach.
   ========================================================================== */

/* `auto-fit` zamiast sztywnych trzech kolumn (08.08.2026). Po scaleniu
   wsparcia przy incydencie z godzina ekspercka zostaly dwie karty, a siatka
   na trzy kolumny trzymala pusta trzecia i sekcja wygladala na urwana.
   Teraz liczba kolumn idzie za liczba kart: dwie karty biora pol szerokosci
   kazda, trzy wracaja do ukladu sprzed zmiany. */
.wejscia {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: clamp(20px, 2.6vw, 32px);
}
@media (max-width: 820px) { .wejscia { grid-template-columns: 1fr; } }
.wejscia > .wejscie { align-self: start; }

.wejscie {
  display: flex; flex-direction: column;
  padding: 26px 24px 26px;
  border: 1px solid var(--wlos);
  background: var(--tlo);
  text-decoration: none; transition: .16s;
  border-radius: var(--promien);
}
.pas--cichy .wejscie { background: var(--tlo); }
.wejscie:hover { border-color: var(--akcent); }

.wejscie__warianty {
  overflow: hidden;
  overflow-anchor: none;
  will-change: height;
  transition: height .36s cubic-bezier(.22,.61,.36,1);
}

/* Etykieta jest akapitem, więc trzeba ją wyłączyć z `flex: 1` niżej.
   Inaczej rośnie razem z opisem i tytuły w rzędzie przestają stać na
   jednej linii: mierzone 377, 426 i 402 px przy trzech kaflach. */
.wejscie__co {
  flex: none;
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .11em;
  text-transform: uppercase; color: var(--wynik-ciemny);
}
.wejscie h3 { margin-top: 13px; font-size: var(--t-karta); letter-spacing: -.018em; }
/* Tytul jako pierwszy element karty nie potrzebuje marginesu - odstep daje
   padding karty. Wczesniej nad nim stala etykieta kategorii. */
.wejscie h3:first-child { margin-top: 0; }
.wejscie p:not(.wejscie__co) {
  margin-top: 11px; font-size: var(--t-tekst); line-height: 1.6;
  color: var(--atrament-2); flex: 1;
}
/* Cena w dwoch wierszach: kwota u gory, warunki pod spodem (08.08.2026,
   prosba Dominika). Wczesniej cala pozycja szla jednym ciagiem na 14 px
   w kolorze szeptu i czytala sie jak przypis pod opisem, mimo ze w kartach
   pakietow wyzej cena stoi w glowie karty i widac ja z odleglosci.

   Kwota bierze krok naglowka karty i krój naglowkowy, wiec w kolumnie sa
   teraz dwa punkty zaczepienia dla oka: tytul i cena. Warunki zostaja na
   14 px, bo "+ 23% VAT" nie jest informacja, ktorej ktos szuka. */
.wejscie__cennik {
  margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--wlos);
  display: grid; gap: 2px;
  font-size: var(--t-nota); color: var(--szept);
}
.wejscie__cennik b {
  font-family: var(--pismo-naglowek);
  font-size: var(--t-karta); font-weight: 600; letter-spacing: -.018em;
  line-height: 1.2; color: var(--atrament);
  font-variant-numeric: tabular-nums;
}
.wejscie .dzialanie { margin-top: 20px; align-self: start; }

/* ==========================================================================
   KTO PROWADZI: portret po lewej, tekst po prawej, wyrównanie do lewej.
   Wybór semantyczny: to są konkretne osoby z imieniem i odpowiedzialnością,
   a nie dwie równorzędne opcje do porównania, więc czyta się je w wierszu,
   nie zestawia w siatce.
   ========================================================================== */

/* Osoby idą w jednej kolumnie, bo nagłówek sekcji zajmuje lewą stronę.
   Dwie osoby obok siebie w tak wąskiej kolumnie łamałyby opisy. */
.role { display: grid; border-top: 1px solid var(--wlos); }

.rola {
  display: grid; grid-template-columns: 132px 1fr; gap: 26px;
  align-items: start;
  padding-block: 28px;
  border-bottom: 1px solid var(--wlos);
}
@media (max-width: 480px) { .rola { grid-template-columns: 1fr; gap: 14px; } }

.rola__inicjal {
  /* Nie kwadrat i nie kolo: nieregularna figura z oplatajaca linia. Teresa
     wskazala iod-x.pl jako punkt odniesienia ("zdjecie nie jest w kwadracie,
     tylko w jakiejs figurze, opleconej"). Rozwiazanie przeniesione z wariantu
     index-kimi-v1. Proporcja portretowa, bo twarz w kwadracie zawsze wymaga
     ciecia gory albo dolu kadru. */
  position: relative;
  width: 132px; height: 150px; margin: 0;
  display: block; overflow: visible;
  border: 0; background: none;
  font-size: var(--t-karta); font-weight: 600; color: var(--atrament);
}
.rola__inicjal img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  border-radius: 46% 54% 52% 48% / 38% 42% 58% 62%;
}
/* Linia oplatajaca: celowo przesunieta i o innym promieniu niz zdjecie,
   zeby nie wygladala na obrys, tylko na drugi ksztalt obok. */
.rola__inicjal::before {
  content: ""; position: absolute; inset: -9px -11px -11px -9px;
  border: 1.5px solid var(--wynik-ciemny); opacity: .55;
  border-radius: 52% 48% 45% 55% / 44% 58% 42% 56%;
  pointer-events: none;
}
/* Kropka: jedyny burgund w tej sekcji, po to zeby oko zaczepilo o zdjecie. */
.rola__inicjal::after {
  content: ""; position: absolute; top: -13px; right: 18%;
  width: 9px; height: 9px; border-radius: 50%;
  background: var(--akcent);
}
/* pozycjonowany bezwzglednie, bo przy place-items:center grid nie rozciaga
   dziecka i obrazek wystawal 29 px ponizej kola */

.rola h3 { font-size: var(--t-karta); letter-spacing: -.018em; }
.rola__co {
  margin-top: 5px; font-size: var(--t-etyk); font-weight: 500;
  letter-spacing: .04em; color: var(--wynik-ciemny);
}
.rola p:not([class]) { margin-top: 12px; font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); }

.znaczniki { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
/* Znaczniki opisuja to, co pakiet juz zawiera, wiec ida na zielen. */
.znaczniki li {
  font-size: var(--t-etyk); color: var(--wynik-ciemny);
  padding: 4px 10px; border: 1px solid var(--wlos);
  border-radius: var(--promien-maly);
}

/* ==========================================================================
   FAQ: lista na pełnej szerokości pod nagłówkiem
   ========================================================================== */

.pyt { border-bottom: 1px solid var(--wlos); }
.pyt:first-child { border-top: 1px solid var(--wlos); }
/* Pytanie schodzi z `--t-karta` na `--t-lid` i dostaje wlasna interlinie
   (09.08.2026, Teresa: "to FAQ jest jakies za duze strasznie, rozstrzelone
   i ta czcionka za duza").

   Interlinia byla bledem, nie decyzja: `line-height` nie stalo tu wcale, wiec
   pytanie dziedziczylo 1.65 z `body` i jedna linijka tekstu rosla do 38 px,
   gdy kazdy inny naglowek 23 px na stronie ma 26.7. Jedna pozycja zajmowala
   84 px wysokosci na jeden wiersz tresci.

   Stopien: pytanie nie jest tytulem karty, tylko pozycja listy. W kartach
   `--t-karta` dziala, bo tuz obok stoi opis na 16 px i widac roznice stopni.
   W FAQ pytanie stoi samo na kolumnie 708 px, wiec ten sam stopien czyta sie
   jak naglowek sekcji. `--t-lid` to istniejacy stopien skali, nie nowa
   wartosc dobrana na oko.

   Padding 22 -> 18: przy ciasniejszej interlinii dawny odstep zostawialby
   pytania w tej samej odleglosci od siebie mimo mniejszego tekstu. */
.pyt summary {
  display: flex; justify-content: space-between; align-items: center; gap: 24px;
  padding-block: 18px; cursor: pointer;
  font-size: var(--t-lid); line-height: 1.3;
  font-weight: 500; letter-spacing: -.015em; list-style: none;
}
.pyt summary::-webkit-details-marker { display: none; }
.pyt summary::after {
  content: ""; flex: none; width: 11px; height: 11px;
  border-right: 1.5px solid var(--akcent); border-bottom: 1.5px solid var(--akcent);
  transform: rotate(45deg) translateY(-3px); transition: transform .18s;
}
.pyt[open] summary::after { transform: rotate(-135deg) translateY(-3px); }
.pyt__tresc { padding-bottom: 26px; max-width: 72ch; color: var(--atrament-2); font-size: var(--t-tekst); }
.pyt__tresc p + p { margin-top: 12px; }

/* ==========================================================================
   DOMKNIĘCIE I KONTAKT
   ========================================================================== */

.koniec { border-top: 1px solid var(--wlos); padding-block: var(--rytm); }
.koniec__uklad {
  display: grid; grid-template-columns: 1.1fr .9fr;
  gap: clamp(36px, 6vw, 76px); align-items: start;
}
@media (max-width: 900px) { .koniec__uklad { grid-template-columns: 1fr; gap: 36px; } }
.koniec h2 { margin-top: 18px; font-size: var(--t-dzial); letter-spacing: -.03em; }
.koniec__lid { margin-top: 20px; font-size: var(--t-lid); line-height: 1.6; color: var(--atrament-2); max-width: 46ch; }
.koniec__akcje { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 32px; }

.kontakt { border: 1px solid var(--wlos); padding: 28px 26px; }
.kontakt dt {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .12em;
  text-transform: uppercase; color: var(--szept);
}
.kontakt dd { margin: 7px 0 22px; font-size: var(--t-tekst); }
.kontakt dd:last-child { margin-bottom: 0; }
.kontakt a {
  color: var(--akcent); text-decoration: none;
  border-bottom: 1px solid transparent;
  display: inline-block; min-height: 26px;
}
.kontakt a:hover { border-bottom-color: var(--akcent); }
.kontakt small { display: block; margin-top: 2px; font-size: var(--t-nota); color: var(--szept); }

/* --- rezerwacja terminu --------------------------------------------------
   Kalendarz jest osadzeniem zewnętrznym i stawia własne cookies, więc ramka
   nie wstaje sama. Użytkownik dostaje informację i decyduje. */

.rezerwacja { border: 1px solid var(--wlos); background: var(--tlo); }
.pas--cichy .rezerwacja { background: var(--tlo-cichy); }
.rezerwacja__brama {
  padding: clamp(32px, 5vw, 56px) clamp(24px, 4vw, 44px);
  display: grid; justify-items: start; gap: 24px; max-width: 64ch;
}
.rezerwacja__info { font-size: var(--t-tekst); line-height: 1.62; color: var(--atrament-2); }
.rezerwacja__info b { font-weight: 600; color: var(--atrament); }
.rezerwacja__akcje { display: flex; flex-wrap: wrap; gap: 14px; }
/* Klasa siedzi teraz na samej ramce, nie na kontenerze wokol niej: kalendarz
   wstaje od razu. Wysokosc i biale tlo jak na elev8.pl/staging/kontakt.
   (Bez slowa z ostrymi nawiasami w komentarzu: kontrola pliku do wyslania
   szuka go jako znacznika i zglaszalaby falszywy alarm.) */
.rezerwacja__ramka {
  width: 100%; height: 720px;
  border: 0; display: block; background: #fff;
}
@media (max-width: 620px) { .rezerwacja__ramka { height: 900px; } }
/* display na klasie ma wyzsza specyficznosc niz wbudowane [hidden]{display:none},
   wiec bez tej reguly ukryta ramka dalej zajmowalaby 720 px szarego pola. */
.rezerwacja__ramka[hidden] { display: none; }
/* Drugie wyjscie, nie komunikat o bledzie: widoczne zawsze, cicho pod ramka. */
.rezerwacja__zapas {
  margin-top: 12px;
  font-size: var(--t-nota); line-height: 1.6; color: var(--szept);
}
.rezerwacja__zapas a { color: var(--akcent); text-decoration: none; border-bottom: 1px solid transparent; }
.rezerwacja__zapas a:hover { border-bottom-color: var(--akcent); }

/* ==========================================================================
   STOPKA

   Uklad i wyglad stopki zyje w assets/css/nis2-stopka.css. Ten plik mial
   wlasna, rownolegla kopie tych regul (08.08.2026 usunieta): laduje sie po
   nis2-stopka.css, wiec po cichu nadpisywal uklad kolumn - kreska nad
   zrodlami i pozioma lista odnosnikow. Nie dopisuj tu regul dla `.stopka`.
   ========================================================================== */

/* ==========================================================================
   RUCH
   ========================================================================== */

.js .wchodzi { opacity: 0; translate: 0 14px; transition: opacity .5s ease, translate .5s ease; }
.js .wchodzi.widoczne { opacity: 1; translate: 0 0; }

/* Nagłówek otwarcia wchodzi na dwa takty: najpierw zdanie warunkowe,
   potem sedno pytania. Druga linia jest tą, na której ma się zatrzymać
   wzrok, więc dostaje własne wejście zamiast przyjeżdżać razem. */
.js .hero h1 em { display: block; opacity: 0; translate: 0 12px; transition: opacity .5s ease .22s, translate .5s ease .22s; }
.js .hero h1.widoczne em { opacity: 1; translate: 0 0; }

/* Kresek akcentu przy nagłówkach sekcji nie ma. Były dwa razy: raz nad
   tytułem (v3), raz pod nim jako pseudoelement szyldu. Obie odrzucone.
   Sekcję oddziela linia i odstęp, nic więcej. */

/* Oś terminów: linia rysuje się od lewej, bo sekcja jest o upływie czasu.
   Obserwowany jest rodzic, nie sama linia: pseudoelement o zerowej skali
   nie ma mierzalnej powierzchni i obserwator nigdy by go nie zobaczył. */
.js .os__tor::before { transform: scaleX(0); transform-origin: left center; transition: transform .9s cubic-bezier(.22,.61,.36,1); }
.js .os__tor.widoczne::before { transform: scaleX(1); }
@media (max-width: 820px) {
  .js .os__tor::before { transform: scaleY(0); transform-origin: center top; }
  .js .os__tor.widoczne::before { transform: scaleY(1); }
}

/* Punkty osi wchodzą po kolei, za linią. Opacity 1 nadpisuje stan
   startowy `.js .os__tor .punkt { opacity: 0 }` dzieki wyzszej
   szczegolowosci selektora, wiec kolejnosc regul nie gra roli. */
.js .os__tor.widoczne .punkt { animation: punktWchodzi .45s ease both; opacity: 1; }
.js .os__tor.widoczne .punkt:nth-child(1) { animation-delay: .18s; }
.js .os__tor.widoczne .punkt:nth-child(2) { animation-delay: .34s; }
.js .os__tor.widoczne .punkt:nth-child(3) { animation-delay: .50s; }
.js .os__tor.widoczne .punkt:nth-child(4) { animation-delay: .66s; }
@keyframes punktWchodzi { from { opacity: 0; translate: 0 8px; } to { opacity: 1; translate: 0 0; } }
.js .os__tor .punkt { opacity: 0; }

/* Wiersze reagują na kursor: podkreślenie biegnie od lewej. */
.etap, .efekt { position: relative; }
.etap::after, .efekt::after {
  content: "";
  position: absolute; left: 0; bottom: -1px;
  width: 100%; height: 1px;
  background: var(--akcent);
  transform: scaleX(0); transform-origin: left center;
  transition: transform .3s ease;
}
.etap:hover::after, .efekt:hover::after { transform: scaleX(1); }

/* Wyróżnienie w tekście ciągłym. Podkreślenie zamiast pogrubienia,
   bo pogrubienie w akapicie zaczyna konkurować z nagłówkiem.

   Poprzednia wersja rysowała podkład akcentem na 14 procent krycia, co
   dawało 1.21 kontrastu do tła: reguła istniała, a na ekranie nie było
   jej widać. Teraz to prawdziwa linia.
   `text-decoration` zamiast wewnętrznego cienia, bo wyróżnienie potrafi
   złamać się na dwie linie, a cień rysuje wtedy jeden prostokąt przez
   całą wysokość.

   Kolor linii to złoto, nie burgund (28.07, po rozmowie z Teresą). Dwa
   powody, zbieżne. Teresa wprost: czerwieni nie stosować w podkreśleniu,
   ma zostać przy przyciskach, bo jest agresywna. Niezależnie od tego
   jedyne wyróżnienie na stronie obejmuje datę wejścia ustawy w życie, a
   rola daty to `--przelamanie` (KIEDY), nie `--akcent` (ZRÓB TO).
   Grubość z 2px na 1px: uwaga „podkreślenie już za duże" z tej samej
   rozmowy. Przy jednym wyróżnieniu na całą stronę linia nie musi krzyczeć. */
.js mark, mark {
  background: none;
  color: inherit;
  font-weight: 500;
  text-decoration: underline;
  text-decoration-color: var(--przelamanie);
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
  text-decoration-skip-ink: auto;
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .js .wchodzi { opacity: 1; translate: 0 0; transition: none; }
  .js .hero h1 em { opacity: 1; translate: 0 0; transition: none; }
  .postep { display: none; }
  .js .os__tor::before { transform: none; transition: none; }
  .js .os__tor .punkt,
  .js .os__tor.widoczne .punkt { opacity: 1; animation: none; }
  .etap::after, .efekt::after { transition: none; }
  .wejscie__warianty { transition: none; }
}

[id] { scroll-margin-top: 90px; }


/* Odnosniki w biegnacym tekscie mialy 18 px wysokosci celu. Prog WCAG 2.5.8
   to 24 px, wiec powiekszamy sam obszar trafienia, nie tekst. */
.zdanie__zrodlo a, .stopka a, p a:not(.dzialanie) {
  display: inline-block; padding-block: 3px;
}


/* ==========================================================================
   PUNKT WEJSCIA (etap 0): wpis w Wykazie KSC
   Nie kafel, bo nie nalezy do ciagu trzech etapow. Pasek nad nimi, zeby bylo
   widac, ze to krok wczesniejszy i mozliwy osobno.
   ========================================================================== */

.wejscie-zero {
  display: grid; gap: 22px; align-items: center;
  /* Pod kaflami, nie nad: to krok obok drabinki, nie jej poczatek.
     Bez paska po lewej, bo w sekcji z kaflami bez ramek bocznych
     wygladal jak element z innego ukladu. */
  margin-top: 22px; padding: 22px 26px;
  border: 1px solid var(--wlos);
  border-radius: var(--promien);
  background: var(--tlo-cichy);
}
@media (min-width: 820px) { .wejscie-zero { grid-template-columns: 1fr auto; gap: 34px; } }
.wejscie-zero__etyk {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .13em;
  text-transform: uppercase; color: var(--wynik-ciemny); margin-bottom: 7px;
}
.wejscie-zero h3 { font-size: var(--t-karta); margin-bottom: 8px; }
.wejscie-zero p {
  font-size: var(--t-nota); line-height: 1.6; color: var(--atrament-2);
  /* balance zamiast pretty i szersza miara: przy 68ch akapit konczyl sie
     260 px przed krawedzia kolumny, wiec druga linia wygladala na urwana */
  max-width: 84ch; text-wrap: balance;
}
.wejscie-zero .dzialanie { white-space: nowrap; }


/* ==========================================================================
   KOTWICE ZGODNOSCI I NAWIGACJA DO PODSTRON
   ========================================================================== */

/* Puste kotwice pod stare adresy (/#pakiety, /#szkolenia, /#sprawdz), ktorych
   uzywaja podstrony i ktore moga siedziec w podpisach mailowych. Odsuniete
   o wysokosc przyklejonego paska, zeby naglowek sekcji nie chowal sie pod nim. */
.kotwica { display: block; height: 0; scroll-margin-top: 92px; }

/* Pozycje prowadzace poza te strone: cienka kreska oddziela je od kotwic
   do sekcji, zeby bylo widac, ze klikniecie zabiera gdzie indziej. */
.nawi__poza:first-of-type { border-left: 1px solid var(--wlos); padding-left: 16px; margin-left: 6px; }


/* ==========================================================================
   FORMULARZ W SEKCJI KONTAKTU (osadzony w .domkniecie__kolumna nizej)
   ========================================================================== */

/* Rezerwacja miejsca pojawia sie dopiero wtedy, gdy loader HubSpota startuje.
   Gdy formularz nie wstaje, zostaje zwykla sciezka mailowa bez pustego prostokata. */
#formularzHubspot { min-height: 0; }
#formularzHubspot.laduje,
#formularzHubspot.aktywny { min-height: 640px; margin-top: 18px; }
@media (max-width: 620px) {
  #formularzHubspot.laduje,
  #formularzHubspot.aktywny { min-height: 870px; }
}

/* Zapas widoczny, gdy HubSpot nie wstaje. */
.zapas { display: none; font-size: var(--t-nota); color: var(--atrament-2); }
.zapas.widoczny {
  display: block; margin-top: 14px; padding: 14px 16px;
  border: 1px solid var(--wlos); border-radius: var(--promien);
  background: var(--tlo-cichy);
}


/* Zdanie nad kaflami: mowi, co laczy wszystkie trzy etapy, zeby nie trzeba
   bylo powtarzac tego w kazdym kaflu z osobna. */
.pakiety__zasada {
  max-width: 62ch; margin-bottom: 22px;
  font-size: var(--t-nota); line-height: 1.6; color: var(--atrament-2);
}


/* ==========================================================================
   DOMKNIECIE: formularz i kalendarz obok siebie
   Wczesniej kalendarz byl osobna sekcja pod formularzem i kto wypelnil
   formularz, nigdy do niego nie docieral. Teraz to jeden wybor: napisz
   albo umow od razu.
   ========================================================================== */


/* 10.08.2026: w sekcji kontaktu naglowek "Napisz albo wybierz termin
   rozmowy" lamie sie na telefonie na "termin / rozmowy", bo globalny
   .szyld h2 trzyma 20ch, a tekst ma 36 znakow. Globalny .szyld
   { margin-bottom: 62px } razem z .domkniecie { margin-top: var(--rytm);
   padding-top: clamp(28px, 3vw, 40px); border-top } daje ~143 px
   pustej przestrzeni miedzy naglowkiem a kolumnami - za duzo.
   Nadpisanie tylko dla #kontakt, zeby rytm pozostalych sekcji sie
   nie zmienial. */
@media (max-width: 760px) {
  #kontakt .szyld h2 { max-width: none; }
  /* Pierwszy .kotwica miedzy .szyld a .domkniecie jest display:block height:0,
     wiec w gridzie .koniec__uklad dostaje pusty wiersz i gap naklada sie
     podwojnie. Kompensujemy tu, zostawiajac reszte serwisu w spokoju. */
  #kontakt .koniec__uklad { gap: 16px; }
  #kontakt .szyld { margin-bottom: 0; }
  #kontakt .domkniecie { margin-top: 0; padding-top: 24px; }
}

.domkniecie {
  grid-column: 1 / -1;
  margin-top: var(--rytm);
  padding-top: clamp(28px, 3vw, 40px);
  border-top: 1px solid var(--wlos);
  display: grid; gap: clamp(28px, 4vw, 52px); align-items: start;
}
@media (min-width: 900px) { .domkniecie { grid-template-columns: 1fr 1fr; } }
.domkniecie__kolumna h3 { font-size: var(--t-karta); margin-bottom: 8px; }
.domkniecie__lid {
  font-size: var(--t-nota); line-height: 1.6; color: var(--atrament-2);
  margin-bottom: 20px; max-width: 46ch;
}
/* Kalendarz w kolumnie: brama zgody nie moze rozpychac ukladu. */
.domkniecie .rezerwacja { margin-top: 0; }
.domkniecie .rezerwacja__akcje { flex-wrap: wrap; }


/* ==========================================================================
   SKALA INCYDENTU: dwa przypadki obok siebie
   Dwa realne zdarzenia zamiast slowa "incydent". Drugi kafel jest cieplejszy
   wizualnie, bo to on niesie koszt: rozne wagi, nie rowne kolumny.
   ========================================================================== */

.skala { display: grid; gap: 18px; }
@media (min-width: 860px) { .skala { grid-template-columns: 1fr 1.15fr; align-items: start; } }
.skala__poz {
  padding: 24px 26px;
  border: 1px solid var(--wlos);
  border-radius: var(--promien);
  background: var(--tlo);
}
.skala__poz--duzy { border-color: color-mix(in srgb, var(--akcent) 34%, #fff); }
.skala__etyk {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .13em;
  text-transform: uppercase; color: var(--szept); margin-bottom: 10px;
}
.skala__poz--duzy .skala__etyk { color: var(--akcent); }
.skala__poz h3 { font-size: var(--t-karta); margin-bottom: 10px; }
.skala__poz p { font-size: var(--t-nota); line-height: 1.6; color: var(--atrament-2); }
.skala__wniosek {
  margin-top: 14px; padding-top: 12px;
  border-top: 1px solid var(--wlos);
}
.skala__wniosek b { color: var(--atrament); font-weight: 600; }
.skala__nota {
  margin-top: 22px; max-width: 78ch;
  font-size: var(--t-nota); line-height: 1.6; color: var(--atrament-2);
}


/* ==========================================================================
   WYROZNIENIE W BIEGNACYM TEKSCIE
   Teresa 28.07: teksty maja miec kolor i kontrast. Klasa jest jedna i uzywana
   oszczednie: wyroznia sie zdanie, ktore niesie sedno akapitu, nie kazda fraza,
   ktora brzmi wazniej. Kiedy wszystko jest wyroznione, nic nie jest.
   ========================================================================== */

.wazne {
  font-weight: 600;
  color: var(--wynik-ciemny);
}
/* Na ciemnym tle kafla turkus by zniknal, wiec tam samo pogrubienie. */
.pakiet__glowa .wazne, .skala__poz--duzy .wazne { color: inherit; }


/* ==========================================================================
   PODCAST, 11.08.2026 - osiem odcinkow w poziomej szynie
   ========================================================================== */

.podcast { min-width: 0; }
.podcast__gora { margin-bottom: 22px; }
.podcast__gora > p {
  max-width: 54ch; margin: 0; color: var(--atrament-2);
  font-size: var(--t-nota); line-height: 1.55;
}
.podcast__rama { position: relative; }
.podcast__sterowanie {
  position: absolute; z-index: 2; inset: 50% -18px auto;
  display: flex; justify-content: space-between; gap: 8px;
  transform: translateY(-50%); pointer-events: none; opacity: .58;
}
.podcast__przycisk {
  width: 42px; height: 42px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--wlos-mocny); border-radius: var(--promien-maly);
  background: var(--tlo); color: var(--atrament); cursor: pointer;
  font-size: 20px; line-height: 1;
  transition: background .16s ease, color .16s ease, border-color .16s ease;
  pointer-events: auto;
}
.podcast__przycisk:hover:not(:disabled),
.podcast__przycisk:focus-visible {
  border-color: var(--atrament); background: var(--atrament); color: #fff; opacity: 1;
}
.podcast__przycisk:focus-visible { outline: 2px solid var(--akcent); outline-offset: 2px; }
.podcast__przycisk:disabled { opacity: .35; cursor: not-allowed; }
.podcast__pasek { display: none; }
.podcast__widok {
  overflow-x: auto; overflow-y: hidden; scroll-snap-type: x mandatory;
  scrollbar-width: thin; scrollbar-color: var(--wlos-mocny) transparent;
  overscroll-behavior-inline: contain; padding-bottom: 8px;
}
.podcast__szyna { display: flex; gap: 18px; width: max-content; }
.podcast__odcinek {
  width: clamp(260px, 31vw, 360px); flex: 0 0 auto; scroll-snap-align: start;
  margin: 0;
}

@media (min-width: 821px) {
  .podcast--3d .podcast__widok {
    height: 400px; overflow: hidden; perspective: 1400px;
    scroll-snap-type: none; scrollbar-width: none;
  }
  .podcast--3d .podcast__rama { margin-top: 24px; }
  .podcast--3d .podcast__odcinek { width: clamp(360px, 36vw, 480px); }
  .podcast--3d .podcast__szyna {
    position: relative; width: 100%; height: 100%; display: block;
    transform-style: preserve-3d;
  }
  .podcast--3d .podcast__odcinek {
    position: absolute; top: 0; left: 50%;
    transform-style: preserve-3d; backface-visibility: hidden;
    transition: transform .64s cubic-bezier(.22,.61,.36,1), opacity .42s ease, filter .42s ease;
  }
  .podcast--3d .podcast__odcinek:not([aria-current="true"]) .podcast__opis { opacity: .45; }
  .podcast--3d .podcast__odcinek[aria-current="true"] .podcast__opis { opacity: 1; }
  .podcast--3d .podcast__odcinek:not([aria-current="true"]) .podcast__zewnetrzne { display: none; }
}
.podcast__kadr {
  position: relative; aspect-ratio: 16 / 9; display: grid; place-items: center;
  overflow: hidden; border: 1px solid var(--wlos-mocny);
  border-radius: var(--promien); background: var(--tlo-cichy);
  color: var(--szept); font-size: var(--t-nota);
}
.podcast__kadr > iframe {
  width: 100%; height: 100%; border: 0; display: block;
}
.podcast__odtworz {
  position: absolute; inset: 50% auto auto 50%; z-index: 1;
  width: 58px; height: 58px; padding: 0; transform: translate(-50%, -50%);
  display: grid; place-items: center; border: 1px solid rgba(255,255,255,.78);
  border-radius: 50%; background: rgba(23,35,61,.88); color: #fff;
  cursor: pointer; box-shadow: 0 8px 24px rgba(10,18,34,.24);
  transition: transform .18s ease, background .18s ease;
}
.podcast__odtworz:hover, .podcast__odtworz:focus-visible {
  transform: translate(-50%, -50%) scale(1.07); background: var(--czerwien);
}
.podcast__odtworz:focus-visible { outline: 2px solid var(--akcent); outline-offset: 3px; }
.podcast__odtworz span { margin-left: 3px; font-size: 1.1rem; }
.podcast__modal[hidden] { display: none; }
.podcast__modal {
  position: fixed; inset: 0; z-index: 1000; display: grid; place-items: center;
  padding: clamp(18px, 4vw, 64px); background: rgba(15, 25, 45, .84);
}
.podcast__modal-panel {
  position: relative; width: min(1100px, 100%); aspect-ratio: 16 / 9;
  background: #0f192d; box-shadow: 0 24px 80px rgba(8,15,28,.42);
}
.podcast__modal-media, .podcast__modal-media iframe, .podcast__modal-media video {
  width: 100%; height: 100%; display: block; border: 0;
}
.podcast__modal-zamknij {
  position: absolute; z-index: 1; top: -46px; right: 0; width: 38px; height: 38px;
  padding: 0; border: 1px solid rgba(255,255,255,.72); border-radius: 50%;
  background: transparent; color: #fff; cursor: pointer; font-size: 1.65rem;
  line-height: 1;
}
.podcast__modal-zamknij:hover, .podcast__modal-zamknij:focus-visible { background: #fff; color: var(--atrament); }
.podcast__modal-zamknij:focus-visible { outline: 2px solid var(--akcent); outline-offset: 3px; }
html.podcast-modal-open { overflow: hidden; }
.podcast__miniatura {
  width: 100%; height: 100%; display: block; object-fit: cover;
}
.podcast__opis {
  display: flex; align-items: flex-start; gap: 12px; margin-top: 12px;
}
.podcast__opis > span {
  color: var(--wynik-ciemny); font-size: var(--t-etyk);
  font-variant-numeric: tabular-nums; letter-spacing: .1em;
}
.podcast__opis h3 { margin: 0; font-size: var(--t-karta); }
.podcast__zewnetrzne {
  display: inline-flex; align-items: center; min-height: 24px; margin-top: 10px;
  color: var(--szept); font-size: var(--t-nota); font-weight: 500;
  text-decoration: underline; text-underline-offset: 3px;
  transition: color .16s ease;
}
.podcast__zewnetrzne[hidden] { display: none; }
.podcast__zewnetrzne:hover { color: var(--atrament); }
.podcast__zewnetrzne::after {
  content: '↗'; margin-left: 5px; font-size: .82em;
}

@media (max-width: 620px) {
  .podcast__gora > p { max-width: 30ch; }
  .podcast__sterowanie {
    position: static; inset: auto; width: 100%; margin-top: 14px;
    transform: none; opacity: 1;
  }
  .podcast__przycisk {
    width: 46px; height: 46px; border-radius: 50%; font-size: 22px;
  }
  .podcast__pasek {
    display: flex; align-items: center; justify-content: center;
    gap: 6px; min-width: 0;
  }
  .podcast__kropka {
    width: 7px; height: 7px; border-radius: 999px;
    background: var(--szept); opacity: .32;
    transition: width .22s ease, opacity .22s ease, background .22s ease;
  }
  .podcast__kropka--czynna {
    width: 24px; opacity: 1; background: var(--akcent);
  }
  .podcast__szyna { gap: 0; }
  .podcast__odcinek {
    width: calc(100vw - 40px); scroll-snap-align: center;
  }
  .podcast__zewnetrzne { margin-top: 8px; }
  .podcast__modal { padding: 54px 12px 18px; }
  .podcast__modal-panel { width: 100%; }
  .podcast__modal-zamknij { top: -46px; right: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .podcast__przycisk { transition: none; }
  .podcast__widok { scroll-behavior: auto; }
}

/* ==========================================================================
   KSZTALTY W TLE
   Nie ozdobnik i nie powtorka: to jeden luk, ktory przechodzi przez strone
   i za kazdym razem pokazuje inny swoj fragment. Dlatego kazda sekcja ma
   wlasny wariant, a promienie sa tak dobrane, zeby luk z jednej sekcji
   trafial w miejsce, z ktorego wychodzi luk w nastepnej.
   Fiolet #4B2E57 z kanonu, wylacznie w tle, nigdy pod tekstem.
   ========================================================================== */

.pas--ksztalty { position: relative; overflow: hidden; }
.pas--ksztalty > .miara { position: relative; z-index: 1; }
.pas--ksztalty::before,
.pas--ksztalty::after { content: ""; position: absolute; z-index: 0; pointer-events: none; }

/* Wariant A: luk wchodzi z prawej i schodzi w dol, urwany krawedzia sekcji.
   Otwarty od dolu, wiec oko prowadzi dalej, w strone nastepnej sekcji. */
.ksztalt--luk::before {
  width: 480px; height: 480px;
  right: -150px; top: -130px;
  border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--fiolet) 62%, transparent);
  border-top-color: transparent; border-right-color: transparent;
}
/* Trzy punkty na torze luku: rytm zamiast drugiej plamy. */
.ksztalt--luk::after {
  width: 7px; height: 7px; border-radius: 50%;
  right: 128px; top: 232px;
  background: color-mix(in srgb, var(--fiolet) 55%, transparent);
  box-shadow: -52px 74px 0 -1px color-mix(in srgb, var(--fiolet) 38%, transparent),
              -88px 156px 0 -2px color-mix(in srgb, var(--fiolet) 24%, transparent);
}

/* Wariant B: ten sam luk podjety z lewej, nizej i wiekszy. Razem z wariantem A
   czyta sie jak jedna linia biegnaca przez dwie sekcje, nie jak dwa kola. */
.ksztalt--podjecie::before {
  width: 620px; height: 620px;
  left: -300px; bottom: -320px;
  border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--fiolet) 52%, transparent);
  border-bottom-color: transparent; border-left-color: transparent;
}
/* Wycinek kola wypelniony, przyciety krawedzia: masa rownowazaca cienki luk. */
.ksztalt--podjecie::after {
  width: 240px; height: 240px;
  right: -120px; bottom: -120px;
  border-radius: 50%;
  background: color-mix(in srgb, var(--fiolet) 11%, transparent);
}

/* Wariant C: kula wchodzaca z gory sekcji, wypelniona (prosba Dominika
   08.08.2026). Warianty A i B pokazuja luk jako cienka linie; ten pokazuje
   go jako mase. Polowa kola siedzi nad gorna krawedzia sekcji i jest przez
   nia przycieta, wiec czyta sie jak ciag dalszy ksztaltu z sekcji wyzej,
   a nie jak kolo doklejone w rogu.

   Wypelnienie jest slabe (9 proc.), bo to plaszczyzna, nie kreska: ten sam
   fiolet w mocy kreski zrobilby z tego plame zaslaniajaca sekcje. Cienki
   pierscien na wiekszym promieniu zostaje jako slad linii, zeby wariant
   trzymal sie systemu, a nie zaczynal wlasnego. */
.ksztalt--kula::before {
  width: clamp(360px, 44vw, 660px); height: clamp(360px, 44vw, 660px);
  right: clamp(-140px, -6vw, -60px);
  top: clamp(-330px, -22vw, -180px);
  border-radius: 50%;
  background: color-mix(in srgb, var(--fiolet) 9%, transparent);
}
.ksztalt--kula::after {
  width: clamp(460px, 56vw, 840px); height: clamp(460px, 56vw, 840px);
  right: clamp(-240px, -11vw, -110px);
  top: clamp(-420px, -28vw, -230px);
  border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--fiolet) 34%, transparent);
}

@media (max-width: 720px) {
  /* Na waskim ekranie zostaje sam luk: punkty i plama wchodzily pod tekst. */
  .pas--ksztalty::after { display: none; }
  .ksztalt--luk::before { width: 320px; height: 320px; right: -160px; top: -130px; }
  .ksztalt--podjecie::before { width: 380px; height: 380px; left: -230px; bottom: -240px; }
  .ksztalt--kula::before { width: 300px; height: 300px; right: -110px; top: -160px; }
}


/* ==========================================================================
   FAQ: pytania i przyklejona kolumna kontaktu
   Lista pytan jest dluga, wiec kontakt na jej koncu widzi tylko ten, kto
   doczyta do dolu. Przyklejony panel jedzie razem z lista i jest pod reka
   w momencie, w ktorym ktos nie znajduje swojego pytania.
   ========================================================================== */

.faq__uklad { display: grid; gap: clamp(28px, 4vw, 56px); }
@media (min-width: 940px) { .faq__uklad { grid-template-columns: 1fr 320px; align-items: start; } }

.faq__panel-w {
  padding: 26px 26px 28px;
  border: 1px solid var(--wlos);
  border-radius: var(--promien);
  background: var(--tlo);
}
@media (min-width: 940px) {
  /* 92 px to wysokosc przyklejonego paska u gory plus oddech */
  .faq__panel-w { position: sticky; top: 92px; }
}
.faq__etyk {
  font-size: var(--t-etyk); font-weight: 500; letter-spacing: .13em;
  text-transform: uppercase; color: var(--wynik-ciemny); margin-bottom: 8px;
}
.faq__panel h3 { font-size: var(--t-karta); margin-bottom: 10px; }
.faq__panel > .faq__panel-w > p {
  font-size: var(--t-nota); line-height: 1.6; color: var(--atrament-2);
  margin-bottom: 20px;
}
.faq__panel .dzialanie { width: 100%; justify-content: center; }


/* Wariant C: pionowa kreska z punktem, przy osi terminow. Kierunek pionowy,
   bo sama sekcja jest osia czasu i kreska ja przedluza poza kadr. */
.ksztalt--os::before {
  width: 2px; height: 260px;
  right: 13%; top: -80px;
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--fiolet) 58%, transparent),
    transparent);
}
.ksztalt--os::after {
  width: 11px; height: 11px; border-radius: 50%;
  right: calc(13% - 5px); top: 176px;
  background: color-mix(in srgb, var(--fiolet) 70%, transparent);
}

/* Wariant D: trzy luki jeden w drugim, jak fala. Do sekcji uzupelniajacych,
   ktore same sa "poza ciagiem", wiec ksztalt tez odbiega od pozostalych. */
.ksztalt--fala::before {
  width: 300px; height: 300px;
  left: -150px; top: 40px;
  border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--fiolet) 54%, transparent);
  border-top-color: transparent; border-left-color: transparent;
  box-shadow: 0 0 0 26px transparent,
              22px 0 0 -1px color-mix(in srgb, var(--fiolet) 22%, transparent) inset;
}
.ksztalt--fala::after {
  width: 150px; height: 150px;
  right: 6%; bottom: -75px;
  border-radius: 50%;
  background: color-mix(in srgb, var(--fiolet) 9%, transparent);
}

/* Wariant E: szeroki luk domykajacy strone, przy sekcji kontaktu. Ostatni
   ksztalt jest najwiekszy: zamyka linie, ktora zaczela sie przy "Szesc rzeczy". */
.ksztalt--domkniecie::before {
  width: 880px; height: 880px;
  right: -430px; bottom: -560px;
  border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--fiolet) 40%, transparent);
  border-bottom-color: transparent; border-right-color: transparent;
}
.ksztalt--domkniecie::after {
  width: 9px; height: 9px; border-radius: 50%;
  right: 210px; bottom: 168px;
  background: color-mix(in srgb, var(--fiolet) 62%, transparent);
  box-shadow: -74px -58px 0 -1px color-mix(in srgb, var(--fiolet) 40%, transparent);
}

@media (max-width: 720px) {
  .ksztalt--os::before, .ksztalt--os::after,
  .ksztalt--fala::after, .ksztalt--domkniecie::after { display: none; }
  .ksztalt--fala::before { width: 190px; height: 190px; left: -110px; }
  .ksztalt--domkniecie::before { width: 460px; height: 460px; right: -260px; bottom: -300px; }
}


/* ==========================================================================
   USLUGI POZA CIAGIEM: fiolet jako znak "to nie jest kolejny etap"
   Sekcje sa biale, wiec kolor musi siedziec na elementach. Glowny ciag trzech
   etapow niesie turkus, uslugi obok niego dostaja fiolet: rozny kolor mowi
   od razu, ze to inna kategoria, zanim ktokolwiek przeczyta naglowek.
   ========================================================================== */

/* Bez grubej kreski u gory (08.08.2026). Byla dodatkowym akcentem nad
   etykieta kategorii; etykiety zeszly z kart, a sama kreska zostawala jako
   ozdoba i podnosila odstep nad tytulem do 42 px. Kategorie niesie teraz
   sam obrys i kolor cennika. */
#uzupelniajace .wejscie {
  border-color: color-mix(in srgb, var(--fiolet) 24%, var(--wlos));
}
#uzupelniajace .wejscie__co { color: var(--fiolet); }
#uzupelniajace .wejscie:hover { border-color: color-mix(in srgb, var(--fiolet) 46%, var(--wlos)); }
#uzupelniajace .wejscie__cennik { color: var(--fiolet); font-weight: 500; }
/* Kwota bierze kolor kategorii, tak jak w kartach pakietow cena bierze kolor
   glowy karty. Fiolet #4B2E57 na bieli ma 11,3, wiec skala w gore niczego
   nie psuje po stronie kontrastu. */
#uzupelniajace .wejscie__cennik b { color: var(--fiolet); }

/* Przycisk bierze fiolet kategorii na hover (09.08.2026, decyzja Dominika).
   Wczesniej stalo tu, ze przycisk zostaje burgundowy, bo akcja to akcja
   niezaleznie od kategorii. Teraz cala karta jest fioletowa: obrys, cennik
   i reakcja przycisku, wiec kategoria niesie sie do konca sciezki wzroku.
   Bialy tekst na #4B2E57 ma 11,3, wiec hover nie rusza kontrastu. */
#uzupelniajace .wejscie .dzialanie--pusty:hover {
  background: var(--fiolet);
  border-color: var(--fiolet);
  color: #fff;
}

/* Lead-in drugiego akapitu boldem: karta ma teraz dwa akapity o roznej roli,
   opis uslugi i wynik. Bez wyroznienia czytaja sie jak jeden blok. */
#uzupelniajace .wejscie p b { font-weight: 600; color: var(--atrament); }


/* Znacznik z ikona: certyfikat to nie slowo kluczowe obok innych, tylko
   rzecz, ktora klient moze sprawdzic. Ikona odroznia go od tagow tematycznych. */
.znaczniki li.znak--cert {
  display: inline-flex; align-items: center; gap: 6px;
  border-color: color-mix(in srgb, var(--wynik-ciemny) 34%, var(--wlos));
  font-weight: 500;
}
.znak__ikona { width: 15px; height: 15px; flex: none; color: var(--wynik-ciemny); }

/* ==========================================================================
   NAGLOWKI W KROJU MARKI

   Kanon (02_MATERIALY_FIRMOWE/brand/kolory-elev8.json, sekcja typografia)
   przypisuje naglowkom Outfit, a landing trzymal je w Interze. Plik fontu
   byl przy tym pobierany przez nis2-fonty.css i nieuzywany, wiec strona
   placila za transfer bez zadnego efektu.

   Skutek uboczny byl widoczny przy przejsciu na podstrone szkolen, ktora
   Outfit stosuje: ten sam tytul mial inny krok pisma po obu stronach
   kliknięcia.
   ========================================================================== */
h1, h2, h3,
.znak,
.hero__tytul, .dwie__kotwica h2,
/* Zdanie-przerywnik stoi na `--t-dzial`, czyli w tym samym stopniu co
   naglowki sekcji, ale jest akapitem. Caly serwis w Outfit (10.08.2026),
   wiec ten akapic idzie w Outfit jak reszta naglowkow tej wielkosci. */
.zdanie p:not(.zdanie__zrodlo) {
  font-family: Outfit, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
}

/* ==========================================================================
   ZAKRES PAKIETU JAKO PROZA, 08.08.2026

   Wypunktowania w trzech kartach pakietow (27 punktow) zamienione na akapity,
   decyzja Dominika. Reguly `.pakiet ul:not(.znaczniki)` wyzej zostaja nietkniete:
   obsluguja `.znaczniki`, a gdyby trzeba bylo wrocic do punktow, wystarczy
   przywrocic <ul> w HTML, bez ruszania arkusza.

   Uwaga przy dalszej pracy: `flex: 1` musi zostac, bo to on wyrownuje wysokosc
   przyciskow w trzech kartach obok siebie. Bez niego CTA laduje tuz pod
   tekstem i trzy karty maja przycisk na trzech roznych wysokosciach.
   ========================================================================== */
.pakiet > .pakiet__zakres {
  margin: 24px 24px 0;
  font-size: var(--t-tekst);
  color: var(--atrament-2);
  line-height: 1.55;
  flex: 1;
}
.pakiet__zakres p { margin: 0 0 12px; }
.pakiet__zakres p:last-child { margin-bottom: 0; }
.pakiet__zakres a { padding-block: 3px; margin-block: -3px; }

/* Odwolanie do etapu wczesniejszego. Bylo punktem z wypelnionym znacznikiem
   (li.zawiera), teraz jest osobnym wierszem: to rzecz juz domknieta, wiec
   ma sie czytac inaczej niz reszta zakresu. */
.pakiet__zawiera {
  display: flex; align-items: center; gap: 11px;
  color: var(--atrament); font-weight: 600;
}
.pakiet__zawiera::before {
  content: "";
  flex: none;
  width: 8px; height: 8px;
  border: 1px solid var(--wynik);
  border-radius: 2px;
  background: var(--wynik);
}

/* Granice zakresu są informacją pomocniczą, nie kolejnym etapem oferty.
   Zwykły akapit z górną linią czyta się spokojniej niż zielony znacznik. */
.pakiet__ograniczenie {
  margin: 18px 24px 0;
  padding-top: 13px;
  border-top: 1px solid var(--wlos);
  font-size: var(--t-nota);
  line-height: 1.55;
  color: var(--szept);
}
.pakiet__ograniczenie b { color: var(--atrament); font-weight: 600; }

/* Wariant oferty: metadane mają opisywać moment i sposób pracy,
   dlatego dostają więcej oddechu i nie konkurują z listą rezultatów. */
.landing-wariant-oferta .pakiet__pola {
  gap: 10px 28px;
  padding-top: 18px;
}
.landing-wariant-oferta .pakiet__pola > div { min-width: 0; }
@media (max-width: 759px) {
  .landing-wariant-oferta .pakiet__pola {
    grid-template-columns: 1fr;
    gap: 14px;
  }
}
.landing-wariant-oferta .pakiet__mapa {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px;
  margin: 20px 24px 0;
}
.landing-wariant-oferta .pakiet__mapa-pole {
  min-width: 0;
  padding: 13px 14px 14px;
  border-top: 2px solid var(--wynik);
  background: var(--akcja-tlo-jasne);
}
.landing-wariant-oferta .pakiet__mapa-pole h4 {
  margin: 0 0 6px;
  color: var(--atrament);
  font-size: var(--t-etyk);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
}
.landing-wariant-oferta .pakiet__mapa-pole p {
  margin: 0;
  color: var(--atrament);
  font-size: var(--t-nota);
  line-height: 1.45;
}
@media (max-width: 759px) {
  .landing-wariant-oferta .pakiet__mapa { grid-template-columns: 1fr; }
}
.landing-wariant-oferta .pakiet__szczegoly {
  margin: 18px 24px 0;
  border-top: 1px solid var(--wlos);
}
.landing-wariant-oferta .pakiet__szczegoly summary {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 46px;
  padding: 10px 0;
  color: var(--atrament);
  font-size: var(--t-nota);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
.landing-wariant-oferta .pakiet__szczegoly summary::-webkit-details-marker { display: none; }
.landing-wariant-oferta .pakiet__szczegoly summary::before {
  content: '+';
  display: inline-grid;
  width: 22px;
  height: 22px;
  place-items: center;
  border: 1px solid var(--wlos-mocny);
  border-radius: 50%;
  color: var(--akcent);
  font-size: 17px;
  line-height: 1;
  flex: 0 0 auto;
}
.landing-wariant-oferta .pakiet__szczegoly[open] summary::before { content: '−'; }
.landing-wariant-oferta .pakiet__szczegoly summary:focus-visible {
  outline: 2px solid var(--akcent);
  outline-offset: 3px;
}
.landing-wariant-oferta .pakiet__szczegoly-tresc {
  padding: 4px 0 10px 32px;
  color: var(--szept);
  font-size: var(--t-nota);
  line-height: 1.55;
}
.landing-wariant-oferta .pakiet__szczegoly-tresc h4 {
  margin: 12px 0 5px;
  color: var(--atrament);
  font-size: var(--t-nota);
  font-weight: 600;
}
.landing-wariant-oferta .pakiet__szczegoly-tresc p { margin: 0 0 8px; }
.landing-wariant-oferta .pakiet__szczegoly-tresc ul {
  display: grid;
  gap: 4px;
  margin: 0 0 8px;
  padding-left: 20px;
  list-style: disc;
}
.landing-wariant-oferta .pakiet__szczegoly-tresc ul li {
  display: list-item;
  line-height: 1.55;
}
.landing-wariant-oferta .pakiet__szczegoly-tresc ul li::before {
  content: none;
  display: none;
}
.landing-wariant-oferta .pakiet__szczegoly-tresc a { color: var(--akcent); }

/* --- oferta godzin eksperckich (custom_hours) --------------------- */

.wejscie__godziny {
  display: contents;
}
.wejscie__godziny-wiersz {
  display: grid; gap: 10px;
  margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--wlos);
}
.wejscie__godziny-wiersz .wejscie__cta {
  margin: 0; white-space: nowrap; align-self: center;
}
.wejscie__godziny-label {
  margin: 0; font-size: var(--t-etyk); font-weight: 500;
  letter-spacing: .12em; text-transform: uppercase; color: var(--szept);
}
.wejscie__godziny-kontrolki {
  display: flex; align-items: center; gap: 4px;
  font-variant-numeric: tabular-nums;
}
.wejscie__godziny-btn {
  width: 36px; height: 36px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 1px solid var(--wlos);
  border-radius: 4px; cursor: pointer;
  font-family: var(--pismo-naglowek); font-size: 18px; font-weight: 500;
  color: var(--atrament);
  transition: background .14s ease, border-color .14s ease;
}
.wejscie__godziny-btn:hover { background: var(--tlo-2, #F3F9F8); border-color: var(--atrament, #17233D); }
.wejscie__godziny-btn:focus-visible { outline: 2px solid var(--akcent, #991919); outline-offset: 2px; }
.wejscie__godziny-btn:disabled { opacity: .35; cursor: not-allowed; }
.wejscie__godziny-pole {
  width: 64px; height: 36px;
  font-family: var(--pismo-naglowek); font-size: 22px; font-weight: 600;
  text-align: center; color: var(--atrament);
  background: transparent; border: 0; border-bottom: 1px solid var(--atrament);
  padding: 0; margin: 0; appearance: textfield;
  -moz-appearance: textfield;
}
.wejscie__godziny-pole::-webkit-outer-spin-button,
.wejscie__godziny-pole::-webkit-inner-spin-button {
  -webkit-appearance: none; margin: 0;
}
.wejscie__godziny-pole:focus { outline: 0; border-bottom-color: var(--akcent, #991919); }
.wejscie__godziny-jedn {
  font-size: 13px; color: var(--szept); margin: 0 8px 0 4px;
  text-transform: lowercase;
}
.wejscie__godziny-zakres {
  margin: 0; font-size: var(--t-nota); color: var(--szept);
  font-style: italic;
}

/* --- poziomy baner pakietu 50h (pod grid 3 kart) -------------------- */

.oferta-pakiet {
  display: grid; grid-template-columns: 1fr auto; gap: clamp(24px, 4vw, 56px);
  align-items: center; margin: 32px 0 8px; padding: 32px 36px;
  background: var(--atrament, #17233D); color: #fff; border-radius: 8px;
}
.oferta-pakiet__cialo { max-width: 64ch; }
.oferta-pakiet__eyebrow {
  margin: 0 0 10px; font-size: 11px; font-weight: 600; letter-spacing: .14em;
  text-transform: uppercase; color: var(--akcent, #991919);
  background: #fff; display: inline-block; padding: 4px 10px; border-radius: 3px;
}
.oferta-pakiet__h {
  font-size: clamp(20px, 2.4vw, 28px); font-weight: 600; line-height: 1.2;
  letter-spacing: -.018em; margin: 0 0 12px;
}
.oferta-pakiet__d { font-size: 15px; line-height: 1.55; color: rgba(255,255,255,.78); margin: 0 0 10px; }
.oferta-pakiet__zawiera { font-size: 14px; line-height: 1.5; color: rgba(255,255,255,.7); margin: 0; }
.oferta-pakiet__zawiera b { color: #fff; font-weight: 600; }
.oferta-pakiet__akcja { display: grid; gap: 12px; justify-items: end; min-width: 200px; }
.oferta-pakiet__cena {
  margin: 0; font-size: 12px; color: rgba(255,255,255,.6);
  text-transform: uppercase; letter-spacing: .08em;
}
.oferta-pakiet__akcja .dzialanie { background: var(--akcent, #991919); border-color: var(--akcent, #991919); }
.oferta-pakiet__akcja .dzialanie:hover { background: #6B0F0F; border-color: #6B0F0F; }

@media (max-width: 719px) {
  .oferta-pakiet { grid-template-columns: 1fr; gap: 20px; padding: 24px 22px; }
  .oferta-pakiet__akcja { justify-items: start; }
}

@media (min-width: 481px) and (max-width: 820px) {
  .wejscie__godziny-wiersz {
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-rows: auto auto auto;
  }
  .wejscie__godziny-label { grid-column: 1 / -1; grid-row: 1; }
  .wejscie__godziny-kontrolki { grid-column: 1; grid-row: 2; }
  .wejscie__godziny-zakres { grid-column: 1; grid-row: 3; }
  .wejscie__godziny-wiersz .wejscie__cta {
    grid-column: 2; grid-row: 2 / span 2;
  }
}

/* --- toggle trybu rozliczenia w karcie konsultacji ----------------- */

.wejscie__tryb {
  display: flex; width: 100%; margin: 18px 0 7px;
  border: 1px solid var(--wlos, #E7E4DE);
  border-radius: 6px; overflow: hidden; background: #fff;
}
.wejscie__tryb-btn {
  appearance: none; border: 0; background: transparent;
  flex: 1 1 0;
  padding: 8px 16px; font-family: var(--pismo-naglowek);
  font-size: 14px; font-weight: 500; color: var(--szept, #646B78);
  cursor: pointer; transition: background .14s ease, color .14s ease;
}
.wejscie__tryb-btn:hover { color: var(--atrament, #17233D); }
.wejscie__tryb-btn--aktywny {
  background: var(--atrament, #17233D); color: #fff;
}
.wejscie__tryb-btn[data-tryb="pakiet"]:not(.wejscie__tryb-btn--aktywny) {
  /* Lekkie wyroznienie pakietu w stanie nieaktywnym - turkus tla */
  background: var(--wynik-tlo, #EDF6F5); color: var(--wynik-ciemny, #0F766E);
  font-weight: 600;
}

.wejscie__wariant[hidden] { display: none; }
.wejscie__wariant--pakiet {
  display: grid; gap: 12px; margin-top: 0; padding: 18px 20px;
  background: var(--wynik-tlo, #EDF6F5);
  border-radius: 4px;
}
.wejscie__pakiet-metryka {
  display: flex; align-items: baseline; gap: 8px;
  color: var(--wynik-ciemny, #0F766E);
}
.wejscie__pakiet-metryka strong {
  font-family: var(--pismo-naglowek); font-size: 42px; line-height: .9;
  font-weight: 600; letter-spacing: -.04em;
}
.wejscie__pakiet-metryka span {
  font-size: 11px; line-height: 1;
  font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
}
.wejscie__pakiet-opis {
  margin: 0; font-size: 14px; line-height: 1.55; color: var(--ink-soft, #3A4557);
}
.wejscie__pakiet-cena {
  display: grid; gap: 2px; margin: 2px 0 0; padding-top: 12px;
  border-top: 1px solid color-mix(in srgb, var(--wynik-ciemny) 18%, transparent);
  color: var(--szept); font-size: var(--t-nota);
}
.wejscie__pakiet-cena b {
  color: var(--wynik-ciemny); font-family: var(--pismo-naglowek);
  font-size: var(--t-karta); font-weight: 600; letter-spacing: -.018em;
}
@media (max-width: 719px) {
  .wejscie__wariant--pakiet { gap: 10px; padding: 16px; }
  .wejscie__pakiet-metryka strong { font-size: 36px; }
}

/* Kontakt: naglowek i dwie drogi kontaktu maja tworzyc jeden blok.
   Niepotrzebna druga linia oraz rytm sekcji odsuwaly formularz i kalendarz
   zbyt nisko pod tytulem. */
#kontakt .koniec__uklad { gap: 16px; }
#kontakt .szyld { margin-bottom: 0; }
#kontakt .domkniecie {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}
