/* Base, Kamila Radzioch. Reset + typografia + layout + komponenty globalne.
   Nazwy tokenów z tokens.css, zero hexów tutaj (budowa-strony.md). */

*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
html, body { overflow-x: hidden; max-width: 100%; }
body {
  margin: 0;
  font-family: var(--font-text);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  background: var(--surface-cream);
  color: var(--text-on-light);
}
img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }

/* Decyzja Jakuba 14.09.2026: kontener 90% szerokosci viewportu (nie stale
   1304px), spojne z proporcja projektu graficznego (1304/1440 = 90.5%) na
   kazdej szerokosci, nie tylko na kanonicznych 1440px. Gorny limit 1728px
   (=90% z 1920px) zeby linia tekstu nie robila sie absurdalnie szeroka na
   ultra-wide/4K, gdzie makieta i tak nie ma odniesienia. */
.container {
  width: 90%;
  max-width: 1728px;
  margin-inline: auto;
}

section { padding-block: var(--space-section); }

h1, h2, h3 {
  font-family: var(--font-display);
  font-weight: 400;
  line-height: var(--lh-display);
  margin: 0;
}
h1 { font-size: var(--fs-display-1); }
h2 { font-size: var(--fs-display-2); }
h3 { font-size: var(--fs-display-3); }
em, i { font-style: italic; }
p { margin: 0 0 var(--space-4); }
p:last-child { margin-bottom: 0; }

.eyebrow {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  row-gap: 4px;
  gap: var(--space-3);
  font-size: var(--fs-eyebrow);
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--accent-ctx, var(--gold));
  margin-bottom: var(--space-5);
}
.eyebrow__num { opacity: .7; }
.eyebrow__line { flex: none; width: 40px; height: 1px; background: currentColor; opacity: .5; }

/* --- Przyciski --------------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  height: var(--control-h-desktop);
  padding-inline: var(--space-6);
  font-family: var(--font-text);
  font-size: var(--fs-small);
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  cursor: pointer;
  /* D41 audyt hover (RADZIOCH_DESIGN_SYSTEM.md sekcja 7/20): transform/box-shadow
     byly na 120ms bez shadow w ogole - dokument chce translateY(-2px) +
     shadow-soft na hover, 180-320ms. --dur-base=320ms (token juz istnial,
     dodany wczesniej w tej sesji, nieuzywany do teraz).
     15.09.2026 (D46): transform/box-shadow przestawione z --dur-base (320ms) na --dur
     (500ms), ten sam czas co kolor/tlo/obwodka - Jakub na zywo: najechanie na przycisk
     czuc jako gwaltowne, nie delikatne. Rozjazd dwoch predkosci w jednej interakcji
     (kolor konczy sie 180ms pozniej niz uniesienie+cien) dawal wrazenie "dwuetapowego"
     hover zamiast jednego, spokojnego ruchu - teraz wszystko w tym samym tempie. */
  transition: background-color var(--dur) var(--ease), color var(--dur) var(--ease), border-color var(--dur) var(--ease), transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
  white-space: nowrap;
}
.btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-karta); }
.btn:active { transform: scale(0.96); box-shadow: none; }
.btn[disabled] { transform: none; box-shadow: none; }
.btn svg { width: 16px; height: 16px; flex: none; }
.btn::after {
  content: "";
  width: 14px; height: 14px; flex: none;
  background: currentColor;
  -webkit-mask: url("../img/ikony/arrow-up-right.svg") center / contain no-repeat;
  mask: url("../img/ikony/arrow-up-right.svg") center / contain no-repeat;
  transition: transform var(--dur-fast) var(--ease);
}
/* D41: strzalka CTA (ukosna, arrow-up-right) nie reagowala na hover w ogole.
   implementation-guide.md sekcja 21: "ikona CTA... reaguje na hover ruchem
   4px". Ruch po przekatnej (ta sama forma co juz istniejacy wzorzec w
   dropdown-linkach headera: translate(2px,-2px)), tu nieco wiekszy zeby
   wypelnic "4px" doslownie (sqrt(3^2+3^2)~4.24px). */
.btn:hover::after { transform: translate(3px, -3px); }
.btn--bez-strzalki::after, .site-header__cta::after { display: none; }
.btn--solid {
  background: var(--btn-solid-bg);
  color: var(--btn-solid-fg);
  border-color: var(--btn-solid-bg);
}
.btn--solid:hover { background: var(--accent-ctx-hover, var(--gold-hover)); border-color: var(--accent-ctx-hover, var(--gold-hover)); }
.btn--outline {
  background: transparent;
  color: var(--btn-outline-fg);
  border-color: var(--line-ctx);
}
.btn--outline:hover {
  /* 15.09.2026 (D44): bylo background:var(--line-ctx) - to token linii (bardzo niska
     nieprzezroczystosc, myslany do subtelnych obwodek, nie wypelnien), na hover dawal
     ledwo widoczne, szare wypelnienie zamiast wyraznego stanu. Jakub zglosil na zrzutach
     ("Zobacz platforme", "TikTok" na ciemnym tle) - ledwo widoczne. Teraz pelna inwersja:
     wypelnienie = kolor dotychczasowego tekstu/obwodki (--btn-outline-fg), tekst = kolor
     czytelny NA TYM wypelnieniu (--accent-ctx-fg, juz istniejacy token per kontekst:
     on-dark->czarny, on-light->bialy, on-wine->czarny) - klasyczny odwrocony hover,
     zawsze pelny kontrast niezaleznie od kontekstu, bez nowych tokenow. */
  background: var(--btn-outline-fg, var(--surface-dark));
  border-color: var(--btn-outline-fg, var(--surface-dark));
  color: var(--accent-ctx-fg, var(--surface-white));
}
/* D41 audyt hover, RADZIOCH_DESIGN_SYSTEM.md sekcja 8: outline-offset uniform
   4px w calym dokumencie - bylo 3px tutaj, jedyne odstepstwo warte ujednolicenia
   (pozostale focus-visible w kodzie header/dropdown mialy juz 2px/4px/-2px z
   powodow geometrycznych lokalnych, te zostawione bez zmian). */
.btn:focus-visible { outline: 2px solid var(--accent-ctx, var(--gold)); outline-offset: 4px; }
.btn[disabled] { opacity: .5; cursor: not-allowed; }
@media (max-width: 767px) {
  .btn { height: var(--control-h-mobile); padding-inline: var(--space-5); }
}

/* --- Nagłówek ------------------------------------------------------------ */
.site-header {
  position: sticky;
  top: 0;
  z-index: var(--z-header); /* D41: bylo 50 (kolidowalo z rbt-z-sticky ogolnym), RADZIOCH_DESIGN_SYSTEM.md chce header=100, osobna warstwa od zwyklego sticky */
  padding-block: var(--space-5);
  background: var(--surface-dark); /* zawsze ciemny: makieta kładzie menu na ciemnym pasie nad hero, a body jest kremowe */
  transition: background-color var(--dur) var(--ease), padding-block var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.site-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-6);
}
.site-header.is-scrolled {
  background: var(--surface-dark);
  padding-block: var(--space-3);
  box-shadow: 0 12px 32px rgba(12, 9, 11, 0.35);
}
/* Lockup logo jak w makiecie: monogram NAD napisem, wyśrodkowane. */
/* Rozmiar i kolor logo zmierzone 1:1 z paczka-projekt/01-strona-glowna (i potwierdzone
   w menu_architektura.pdf), 14.09.2026: monogram ~59px wysokosci, wordmark RADZIOCH
   ZLOTY (nie bialy jak bylo), z liniami po obu stronach podpisu BUSINESS TRAINING. */
.site-header__logo { display: flex; flex-direction: column; align-items: center; gap: 8px; color: var(--text-on-dark); text-align: center; }
.site-header__logo img { height: 56px; width: auto; }
.site-header__logo-text { display: flex; flex-direction: column; align-items: center; line-height: 1.1; }
.site-header__logo-text strong { font-family: var(--font-display); font-size: 20px; letter-spacing: 0.3em; text-transform: uppercase; font-weight: 400; padding-left: 0.3em; color: var(--gold); }
.site-header__logo-text span {
  display: flex; align-items: center; gap: 8px;
  font-size: 9px; letter-spacing: 0.28em; color: var(--gold-light); text-transform: uppercase; margin-top: 5px; padding-left: 0.28em;
}
.site-header__logo-text span::before,
.site-header__logo-text span::after { content: ""; display: block; width: 16px; height: 1px; background: currentColor; flex: none; }
.site-header__nav {
  display: flex; align-items: center; gap: var(--space-7);
  align-self: stretch; /* 15.09.2026 (D44): nav sam siega pelnej wysokosci .site-header__inner
    (~101px), zeby moc podac te wysokosc dalej pojedynczym dzieciom przez align-self (nizej). */
}
.site-header__nav-item--dropdown {
  align-self: stretch; /* 15.09.2026 (D44): TYLKO itemy z dropdownem rozciagaja sie do pelnej
    wysokosci nav (~101px) - dropdown kotwiczony do LI (top:100%) wychodzi wtedy dokladnie spod
    calego paska naglowka, nie spod samego tekstu triggera (bez tego panel startowal ~50px za
    wysoko, nakladal sie na dolna czesc headera, zglosil Jakub na zywo). Nav-item ma wlasny
    wewnetrzny align-items:center wiec trigger nadal centrowany w tym wyzszym pudelku.
    UWAGA, poprzednia wersja tego fixa dala align-items:stretch calemu .site-header__nav -
    to rozciagalo TEZ gole linki "O nas"/"Kontakt" (bezposrednie dzieci <a> bez wlasnego
    centrowania), ktore wtedy wyjezdzaly wizualnie w gore (tekst do gory pudelka zamiast na
    srodku) - zglosil Jakub na zywo jako "nawigacja sie rozjechala". Scope'owanie tylko na
    --dropdown naprawia to bez psucia zwyklych linkow. */
  pointer-events: none; /* 15.09.2026 (D44): LI rozciagniete do ~101px ma teraz duzo PUSTEGO
    miejsca nad/pod samym triggerem (naglowek jest wyzszy niz tekst "KURSY"). Bez tego cale
    puste pudelko LI liczylo sie jako hover i otwieralo dropdown nawet przy najechaniu na
    ciemne tlo obok tekstu, nie tylko na sam napis/chevron - zglosil Jakub na zywo. Zamiast
    tego LI samo w sobie NIE reaguje na wskaznik, reaguja tylko jego potomkowie z jawnym
    pointer-events:auto nizej (trigger, most-hover, otwarty panel) - :hover na LI nadal dziala
    poprawnie w tych miejscach, bo trafienie w potomka z auto propaguje :hover do przodkow. */
}
.site-header__nav-item--dropdown .site-header__nav-trigger { pointer-events: auto; }
.site-header__nav a {
  position: relative;
  line-height: 1.15; /* 15.09.2026 (D44): bylo dziedziczone z body (--lh-body:1.6), dawalo ~4px
    niewidocznego "halo" nad i pod tekstem gdzie hover/klik sie tez liczyl - zglosil Jakub na
    zywo na WSZYSTKICH pozycjach nawigacji naraz (spojny problem, bo wszystkie dziedziczyly to
    samo). 1.15 zamiast 1 zeby nie obcinac znakow z ogonkami (np. bez tego "ą","ę" na dole albo
    wersaliki z akcentem u gory potrafia sie docinac przy scisle 1). Trigger dziedziczy (D27),
    wiec zmiana obejmuje oba automatycznie. */
  font-size: var(--fs-small); /* 14.09 D27: bylo hardkodowane 12px, niezalezne od tokenu, przez co token nie dotykal nav mimo ze byl czescia flagi D25 */
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  /* D43 audyt hover: bylo --text-on-dark-muted (.68), dokument chce .72
     konkretnie dla tego linku - patrz token dedykowany --text-nav-link w
     tokens.css, "dokument wygrywa" (decyzja Jakuba przekazana przez
     koordynatora 15.09.2026). */
  color: var(--text-nav-link);
  transition: color var(--dur) var(--ease);
}
.site-header__nav a:hover, .site-header__nav a[aria-current="page"] { color: var(--text-on-dark); }
/* D41 audyt hover, RADZIOCH_DESIGN_SYSTEM.md sekcja 6, wzorzec .rbt-nav-link:
   linia champagne rysujaca sie od lewej do prawej pod tekstem. Wczesniej link
   headera mial WYLACZNIE zmiane koloru, zero linii. */
.site-header__nav a::after {
  content: ""; position: absolute; left: 0; right: 100%; bottom: -10px;
  height: 1px; background: var(--gold);
  transition: right var(--dur-base) var(--ease);
}
.site-header__nav a:hover::after, .site-header__nav a[aria-current="page"]::after { right: 0; }
.site-header__nav a:focus-visible { outline: 2px solid var(--gold-light); outline-offset: 4px; }
.site-header .site-header__dropdown a::after { content: none; } /* 15.09.2026 (D44): linia champagne
  z .site-header__nav a::after (wyzej) lapala TEZ linki wewnatrz otwartego dropdownu (flagowa karta,
  "Zobacz pelna biblioteke") bo to ten sam bug specyficznosci co przy kolorze - dropdown fizycznie
  siedzi w .site-header__nav. Karta i link maja wlasny hover (zmiana tla/koloru), linia pod spodem
  byla zbedna i niezamierzona - zglosil Jakub na zywo ("usuwamy linie ktora daje na hover pod
  boxem"). content:none kasuje pseudoelement bez dotykania oryginalnej reguly dla zwyklych linkow
  headera (O nas/Kontakt), ktore linie maja zostac. */
/* CTA naglowka: tekst pelny z makiety (promuje kurs flagowy, D25) na szerokim desktopie,
   krotszy fallback w przedziale 1025-1384px, bo pelny tekst wypycha nawigacje do zawijania
   (zmierzone Playwright: laptop 1280px realnie sie psul, 1300px juz nie). Prog byl chwilowo
   1479 (D27, gdy --fs-small stal na 16px), skorygowany 14.09 D27 amendment na **1384** po
   powrocie --fs-small do 14px (Jakub zobaczyl 16px na zywo, nav wygladal za duzy) - nav a
   i nav-trigger nadal uzywaja var(--fs-small), wiec przy 14px sa 2px szersze niz oryginalne
   hardkodowane 12px z D26/wczesniej, prog wiec NIE wraca do oryginalnych 1319. Binarnie
   zmierzone Playwright na 14px: 1360px jeszcze sie zawija ("O"/"NAS" dwie linie), 1365px juz
   nie, 1384 zostawia margines bezpieczenstwa. */
.site-header__cta-short { display: none; }
@media (max-width: 1384px) {
  .site-header__cta-full { display: none; }
  .site-header__cta-short { display: inline; }
}
.site-header__toggle { display: none; }
/* Dekoracja: wielkie R monogramu w tle sekcji (makieta, sekcje 01/06/11/12 - poprawka
   D41: "02" tu wczesniej wypisane bylo bledne, sekcja Misja NIE ma tej dekoracji w
   makiecie, sprawdzone wektorowym renderem PDF przy 10x wzmocnieniu kontrastu, zero
   sladu w calym obszarze sekcji. Klasa `deko-r` zdjeta z `#misja` w front-page.php). */
.deko-r { position: relative; overflow: hidden; }
.deko-r > .container { position: relative; z-index: 1; }
.deko-r::after {
  content: ""; position: absolute; z-index: 0; pointer-events: none;
  right: 0; top: 50%; transform: translateY(-50%);
  width: 380px; height: 500px; opacity: .05;
  background: url("../img/logo/monogram-ivory@2x.png") right -80px center / 460px 500px no-repeat;
}
.deko-r.on-light::after, .deko-r--ink::after { background-image: url("../img/logo/monogram-ink.png"); opacity: .06; }
.deko-r--hero::after {
  /* D41 poprawka pozycji: bylo right:220px/width:620/top:0, co centrowalo widoczny
     tusz litery R (monogram-ivory@2x.png ma padding wewnatrz canvasu 1200x1300,
     tresc x:159-1111/y:167-1259) w okolicy x~700-950 canonical, nad kolumna tekstu.
     Pomiar wektorowy makiety (radzioch_home_desktop.pdf, ten sam sposob co watermark
     BEAUTY) pokazuje R przy PRAWEJ krawedzi hero, dosuniete do/za zdjecie, czesciowo
     wychodzace poza krawedz sekcji - nie wysrodkowane nad tekstem. Przesuniete w prawo
     i powiekszone tak zeby widoczny tusz siegal krawedzi. Pomiar mniej pewny niz przy
     watermarku (element ma tylko .04 opacity, trudniej o pikselowa precyzje nawet w
     wektorze) - do potwierdzenia na zywym zrzucie. */
  top: -16px; transform: none; right: 0; width: 400px; height: 500px; opacity: .04;
  /* Box zostaje W GRANICACH .hero (right:0, nie ujemny) zeby nie psuc scrollWidth na
     .hero mimo overflow:hidden (ten sam problem co przy watermarku BEAUTY) - "bleed" w
     prawo osiagniety przez background-position (ten sam wzorzec co bazowe .deko-r::after
     ktore juz uzywa "right -80px" do tego samego efektu), nie przez sam box. */
  background-position: right -150px top -20px; background-size: 550px auto;
}
@media (max-width: 1024px) {
  .site-header__nav { display: none; }
  /* D31 14.09, trzecia poprawka: header fizycznie schowany (visibility, nie display, zeby
     nie zmienial layoutu/wysokosci sticky) na czas otwartego panelu mobile. Jakub zglosil
     "duch"-box przy X w rogu, nieodtworzony w Chromium/Playwright, ale sticky+fixed maja
     znany problem kompozytowania na mobile Safari (element sticky potrafi wygrac z fixed o
     wyzszym z-index podczas scrolla mimo poprawnej specyfikacji). Zamiast polegac na samym
     z-index, `.is-menu-open` (main.js, dodawane/usuwane przy otwarciu/zamknieciu) fizycznie
     eliminuje kazde mozliwe przebicie header-u przez panel, niezaleznie od przyczyny. */
  .site-header.is-menu-open { visibility: hidden; }
  /* D30 14.09: logo mobile bylo identyczne z desktopowym (56px monogram, 20px wordmark,
     zero mobile-specific rule), Jakub zobaczyl na zywo ze jest za duze. Zmierzone pikselowo
     z paczka-projekt/15-menu/00-full-mobile.png (naglowek zamkniety, lewy gorny rog),
     canvas 1080px szerokosci, przeliczone proporcja 390/1080=0.3611 (PRZEKAZANIE.md, "Makieta
     mobile 1080 nie 390"): monogram 63x73px -> 23x26px. Pierwsza proba: przeskalowac caly
     lockup (monogram+wordmark+podpis) proporcjonalnie z makiety - Jakub po zrzucie zdecydowal
     INACZEJ niz makieta (ktora pokazuje pelny lockup): na mobile zostaje WYLACZNIE monogram R,
     wordmark "RADZIOCH"/"BUSINESS TRAINING" schowany calkowicie, zeby oszczedzic miejsce w
     rzedzie z ikonkami i triggerem MENU. Swiadome odejscie od makiety na zywo, ten sam wzorzec
     co D27/D29/D31pkt1. Po schowaniu wordmarku 26px okazalo sie za male (bez tekstu obok
     brakowalo mu wizualnej wagi) - Jakub na zywo: podbic do 36px (polowa drogi miedzy 26 a
     oryginalnym 56, rozsadny start bez pomiaru z rastra, bo makieta pokazuje inny lockup niz
     to co faktycznie renderujemy). 36px = dokladnie wysokosc sasiednich `.site-header__icon`
     (36x36px). Jeszcze jedna tura: Jakub na zywo, 36px odrobine za male, podbite do **42px**
     (158px luzu do ikonek przy 36px, z zapasem starcza i na 42px). */
  .site-header__logo img { height: 42px; }
  /* D32 14.09: selektor byl bez zawezenia (".site-header__logo-text"), wiec gasil
     TEZ wordmark w stopce (".site-footer__brand .site-header__logo-text" dzieli te sama
     klase, celowo - stopka MA pokazywac pelny lockup na mobile, zgodnie z makieta 01-strona-
     glowna/00-full-mobile.png). Zawezone do samego naglowka. */
  .site-header__logo > .site-header__logo-text { display: none; }
  .site-header__toggle {
    /* D29 14.09: makieta 00-full-mobile.png pokazuje "MENU" nad DWIEMA zlotymi kreskami
       (rozne dlugosci, wyrownane do prawej), nie klasyczny 3-liniowy hamburger z podkresleniem
       calego przycisku. Podkreslenie (border-bottom) zdjete, bylo pozostaloscia wczesniejszej
       proby, koliduje wizualnie z nowymi kreskami. */
    display: inline-flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 7px;
    width: auto; height: auto; padding: 0;
    background: transparent; border: 0;
    color: var(--text-on-dark);
    font-family: var(--font-text); font-size: 11px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase;
    cursor: pointer;
    transition: opacity var(--dur) var(--ease);
  }
  .site-header__toggle-lines { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
  .site-header__toggle-line { display: block; height: 2px; background: var(--gold); transition: background-color var(--dur) var(--ease); }
  .site-header__toggle-line--1 { width: 28px; }
  .site-header__toggle-line--2 { width: 18px; }
  .site-header__toggle:hover { opacity: .7; }
  .site-header__toggle:active { opacity: .5; }
  .site-header__toggle:focus-visible { outline: 2px solid var(--gold); outline-offset: 3px; }
  .site-header__cta { display: none; }
}
.site-header__mobile {
  /* D29 14.09: off-canvas prawdziwe (wjazd translateX), nie display:none/:flex.
     Wzorzec: wiki/komponenty/naglowek-kapsula.md, sekcja "Pulapki szuflady"
     (visibility bez transition-delay zabija animacje zamkniecia). */
  position: fixed; inset: 0;
  background: var(--surface-dark);
  z-index: var(--z-dropdown); /* D41: bylo 60, podbite bo header teraz 100 (RADZIOCH_DESIGN_SYSTEM.md), panel musi zostac nad headerem */
  padding: var(--space-6) var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
  transform: translateX(100%);
  visibility: hidden;
  pointer-events: none;
  transition: transform var(--dur) var(--ease), visibility 0s linear var(--dur);
}
.site-header__mobile.is-open {
  transform: translateX(0);
  visibility: visible;
  pointer-events: auto;
  transition: transform var(--dur) var(--ease), visibility 0s linear 0s;
}
/* D29 14.09: martwa regula ".site-header__mobile a" (font 28px, kolor jasny) z pierwszej,
   ciemnej wersji panelu (przed redesignem na jasny 13.09) usunieta - przez wyzsza
   specyficznosc (klasa+tag vs sam .site-header__mobile-row) wygrywala z nowym resetem
   wiersza i nadpisywala kolor na text-on-dark (bialy tekst na kremowym tle, prawie
   niewidoczny) na liniach "O nas"/"Kontakt", ktore nie maja klasy -trigger. */
.site-header__mobile-close {
  align-self: flex-end;
  width: 44px; height: 44px;
  background: transparent; border: 1px solid var(--line-on-dark); color: var(--text-on-dark);
  cursor: pointer;
  transition: background-color var(--dur) var(--ease), transform 120ms var(--ease);
}
.site-header__mobile-close:hover { background: var(--line-on-dark); }
.site-header__mobile-close:active { transform: scale(0.9); }
.site-header__mobile-close:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }

/* --- Hero ------------------------------------------------------------------ */
.hero {
  position: relative;
  /* D41 rebuild: tlo to realny plik paczka-projekt/00-global/decorations/dark-gradient.svg
     (nie przyblizenie plaskim tokenem), zmierzone pikselowo z makiety - lewa krawedz
     hero wyraznie chlodniejsza/ciemniejsza niz prawa (13,10,11 vs 28,20,16 w probkach
     marginesu), zgodne z diagonalnym gradientem svg #090708 -> #17110F -> #2A1A16.
     --surface-dark zostaje jako fallback/kolor tla pod SVG (gdyby obrazek nie zaladowal
     sie), nie jako jedyne zrodlo koloru. */
  background: var(--surface-dark) url("../img/dekoracje/dark-gradient.svg") center / cover no-repeat;
  color: var(--text-on-dark);
  padding-top: var(--space-9);
  padding-bottom: 0;
  overflow: hidden;
}
.hero::before {
  /* D41 rebuild: watermark "BEAUTY" z paczka-projekt/00-global/backgrounds/beauty-outline.svg,
     wczesniej calkowicie pominiety w kodzie (grep potwierdzil zero uzyc). Widoczny w makiecie
     kontrastowo wzmocnionej jako duzy obrys tekstu w lewym dolnym rogu hero, za przyciskami CTA,
     ucziety lewa krawedzia viewportu. Pozycja/rozmiar dobrane pomiarem + wizualnym zestawieniem
     ze zrzutem (nie czysta matematyka z niskokontrastowego zrodla). */
  content: "";
  position: absolute; z-index: 0; pointer-events: none;
  /* D41 poprawka pozycji/rozmiaru: pierwsza wersja (left:-40px, width 780px) byla za waska
     i za mocno wsuniata w lewo. Ponowny pomiar na wektorowym PDF (paczka-projekt/zrodla/
     pdf-desktop/radzioch_home_desktop.pdf, renderowany PyMuPDF - odporny na artefakty
     kompresji PNG, w przeciwienstwie do wczesniejszego rastra) z segmentacja liter
     B-E-A-U-T-Y w natywnym viewBox (0-1400): litera B zaczyna sie w viewBox x=3 (~lewa
     krawedz hero, offset ~0), U konczy sie x=704, skala wyliczona z dopasowania do
     pozycji liter w makiecie ~0.83-0.86 canonical-px/native-unit (dwie niezalezne miary
     zbiezne). Pelny viewBox (1400 szer. x 320 wys.) w skali ~0.845 daje ~1183x270
     canonical na 1440. Dolna krawedz (baseline liter, native y=250) zmierzona wzgledem
     dolu hero na ~179px. Litera Y (ostatnia) wychodzi poza lewa krawedz zdjecia (~817
     canonical) i jest celowo schowana pod fotografia (z-index nizszy niz .container). */
  left: -4px; bottom: 179px;
  /* Mobile: makieta mobilna (paczka-projekt/zrodla/pdf-mobile/radzioch_home_mobile.pdf)
     NIE pokazuje watermarku BEAUTY w ogole (sprawdzone 3x wzmocnienie kontrastu, zero
     sladu) - tylko monogram R zostaje. Dlatego chowany ponizej 1024px zamiast skalowany,
     zgodnie z tym co makieta faktycznie pokazuje, nie z domyslu ze "powinien gdzies byc". */
  width: min(1183px, 82vw); aspect-ratio: 1400 / 320;
  background: url("../img/dekoracje/beauty-outline.svg") left bottom / contain no-repeat;
  /* stroke="currentColor" w svg: CSS `color` hosta NIE propaguje sie do zewnetrznego
     zasobu SVG uzytego jako background-image (tylko mask-image/inline <use> to robia),
     wiec przegladarka renderuje domyslny czarny. Na ciemnym tle hero czarny obrys jest
     niewidoczny (proba z jawnym `color:` na tym elemencie potwierdzila brak efektu).
     Filter:invert odwraca czern na jasny odcien bez modyfikacji verbatim pliku zrodlowego.
     Dodatkowe opacity .5 (poza stroke-opacity .08 juz w pliku): przy samym invert(1)
     napis byl czytelny gola oka, w makiecie wymagal 3.2x wzmocnienia kontrastu zeby go
     w ogole dostrzec (rownie subtelny jak monogram .04, D34) - .5 przyblizylo subtelnosc. */
  filter: invert(1);
  opacity: .3;
}
@media (max-width: 1024px) {
  .hero::before { display: none; }
}
.hero__grid {
  display: grid;
  /* korekta 16.09.2026 (D68): bylo 1.05fr 0.85fr (zdjecie 551x689, "ogromne").
     korekta 2 tego samego dnia (D71): 1.3fr 0.6fr dalo 389x486, Jakub zywym okiem
     "teraz za male". Ustawione posrodku (zdjecie ok. 486x608). */
  grid-template-columns: 1.15fr 0.75fr;
  gap: var(--space-9);
  align-items: center;
}
.hero__grid > * { min-width: 0; }
.hero__kicker { font-size: var(--fs-eyebrow); /* 14.09 D27 amendment: bylo hardkodowane 12px, niezalezne od tokenu, wiec eyebrow hero rozjezdzal sie z eyebrow innych sekcji (16px) */ letter-spacing: 0.16em; text-transform: uppercase; color: var(--gold); margin-bottom: var(--space-4); font-weight: 700; }
.hero h1 { font-size: var(--fs-display-1); }
.hero__h1-pre { display: block; font-family: var(--font-text); font-size: 12px; font-weight: 700; letter-spacing: .32em; text-transform: uppercase; color: var(--text-on-dark-muted); margin-bottom: var(--space-4); }
.hero h1 em { color: var(--gold-light); }
.hero__lead { margin-top: var(--space-5); max-width: 46ch; color: var(--text-on-dark-muted); font-size: 18px; }
.hero__actions { display: flex; gap: var(--space-4); margin-top: var(--space-7); flex-wrap: wrap; }
.hero__note { margin-top: var(--space-4); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-on-dark-muted); }

.hero__photo { position: relative; }
.hero__photo::before {
  /* D41 poprawka: bylo left:14px/top:-14px, ramka wizualnie przesunieta wzgledem maski
     o 14px w kazda strone (potwierdzone getBoundingClientRect - dwa identyczne
     prostokaty przesuniete o (14,-14), nie pokrywajace sie). Wektorowy render PDF
     makiety (radzioch_home_desktop.pdf) pokazuje JEDNĄ, pojedynczą zlota linie
     dokladnie na krawedzi maski, bez przesuniecia/efektu podwojnej linii - frame i
     mask uzywaja tego samego viewBox i tej samej krzywej, wiec przy identycznym
     rozmiarze/pozycji pokrywaja sie z definicji. */
  content: ""; position: absolute; z-index: 0; pointer-events: none;
  left: 0; top: 0; width: 100%; height: 100%;
  background: url("../img/global/hero-photo-frame.svg") center / contain no-repeat;
}
.hero__photo-mask { z-index: 1; }
.hero__photo-mask {
  position: relative;
  aspect-ratio: 4 / 5;
  -webkit-mask-image: url("../img/global/hero-photo-mask.svg");
  mask-image: url("../img/global/hero-photo-mask.svg");
  -webkit-mask-size: contain;
  mask-size: contain;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
}
.hero__photo-mask img { width: 100%; height: 100%; object-fit: cover; }
.hero__photo-card {
  position: absolute; z-index: 2;
  right: 0; bottom: 40px;
  background: var(--surface-dark);
  border: 1px solid var(--line-on-dark);
  padding: var(--space-5) var(--space-6);
}
.hero__photo-card strong { display: block; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gold); margin-bottom: 4px; }
.hero__photo-card em { display: block; font-family: var(--font-display); font-size: 20px; margin-bottom: 6px; }
.hero__photo-card p { font-size: 13px; color: var(--text-on-dark-muted); max-width: 30ch; }

.hero__stats {
  margin-top: var(--space-9);
  border-top: 1px solid var(--line-on-dark);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}
.hero__stat { padding: var(--space-6) var(--gutter); border-right: 1px solid var(--line-on-dark); display: flex; align-items: baseline; gap: var(--space-4); }
.hero__stat:last-child { border-right: 0; }
.hero__stat-num { font-family: var(--font-display); font-style: italic; font-size: 40px; color: var(--gold); white-space: nowrap; }
.hero__stat-label { font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-on-dark-muted); line-height: 1.4; }

@media (max-width: 1024px) {
  .hero__grid { grid-template-columns: 1fr; }
  .hero__photo-card { bottom: 16px; right: 0; padding: var(--space-4) var(--space-5); }
  .hero__stats { grid-template-columns: 1fr; }
  .hero__stat { border-right: 0; border-bottom: 1px solid var(--line-on-dark); }
  .hero__stat:last-child { border-bottom: 0; }
}

/* --- Sekcja generyczna, dwie kolumny ----------------------------------- */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-9); align-items: start; }
@media (max-width: 900px) { .split { grid-template-columns: 1fr; } }

.misja__body p + p { margin-top: var(--space-4); }
/* D41 sekcja 02 Misja: h2 em bylo bez koloru (dziedziczylo domyslny ciemny atrament
   naglowka), pomiar wektorowy makiety (radzioch_home_desktop.pdf) pokazal wyrazny
   wineowy odcien (~112,41,59, dokladnie --accent) na "z Twojego zycia i biznesu.",
   ten sam wzorzec co juz istniejace .opinie__text em / .dla-kogo__item em. */
#misja h2 em { color: var(--accent-ctx); }
/* Dywider miedzy H2 a tagline: paczka-projekt/00-global/decorations/section-label-divider.svg,
   wczesniej zero uzyc w calym motywie (grep), a w makiecie wyraznie widoczny (zmierzony
   ~168px szerokosci, wineowy kolor). mask-image zamiast background-image, bo SVG ma
   stroke="currentColor" ktory NIE dziedziczy CSS color hosta przy background-image
   (ta sama pulapka co przy watermarku Hero) - maska omija problem, kolor bierze sie
   wprost z background-color. */
.misja__divider {
  width: 168px; aspect-ratio: 180 / 8; margin-top: var(--space-6);
  background-color: var(--accent-ctx);
  -webkit-mask: url("../img/dekoracje/section-label-divider.svg") left center / contain no-repeat;
  mask: url("../img/dekoracje/section-label-divider.svg") left center / contain no-repeat;
}
.misja__tagline { margin-top: var(--space-5); font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-on-light-muted); }
.misja__cta { margin-top: var(--space-6); }

.card-highlight {
  background: var(--accent);
  color: var(--text-on-dark);
  padding: var(--card-pad-featured); /* D41: bylo --space-7=40px, RADZIOCH_DESIGN_SYSTEM.md chce 48px na kartach wyroznionych/sprzedazowych */
}
@media (max-width: 767px) {
  .card-highlight { padding: var(--card-pad-featured-mobile); }
}
.misja__card { margin-top: var(--space-6); }
.card-highlight strong { display: block; font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold-light); margin-bottom: var(--space-3); }
.card-highlight p { font-family: var(--font-display); font-size: 22px; font-style: italic; }
/* D41 sekcja 02: pomiar wektorowy makiety pokazal PODZIAL stylu w obrebie zdania karty -
   pierwsza czesc prostym pismem, druga (po przecinku) kursywa - nie caly akapit kursywa
   jak w bazowej regule .card-highlight p (ktora nadal dotyczy card-highlight--ink w
   sekcji Osiagnij, nietknietej w tej turze). Scoped tylko do .misja__card. */
.misja__card p { font-style: normal; }
/* D41 sekcja 03: BUG znaleziony przy budowie Osiagnij - .card-highlight--ink stalo
   PRZED bazowa regula .card-highlight w zrodle, wiec przy rownej specyficznosci
   (jedna klasa kontra jedna klasa) .card-highlight (pozniej w pliku) WYGRYWALO i
   nadpisywalo tlo/kolor etykiety na wine zamiast ciemnego - karta Osiagnij od dawna
   renderowala sie zlym kolorem, zlapane dopiero teraz przy zrzucie tej sekcji.
   Przeniesione PO bazowej regule zeby cascade byl poprawny. Tresc reguly bez zmian,
   tylko pozycja w pliku. */
.card-highlight--ink {
  background: rgba(12, 9, 11, 0.82);
  /* Pomiar wektorowy makiety pokazal ramke i etykiete karty w odcieniu ZLOTA
     (~90,75,63 na krawedzi, ~181,149,100 na etykiecie - obie blizej --gold niz
     --line-on-dark/--gold-light), nie biale linie jak reszta kart --ink w motywie. */
  border: 1px solid var(--gold);
}
.card-highlight--ink strong { color: var(--gold); }

/* D41 sekcja 03, Osiagnij w rok wiecej. Tlo: zdjecie z konferencji Kamili
   (copy.md wskazuje IMG_9133.JPG albo IMG_9135.JPG, oba istnieja w materialach,
   uzyty pierwszy - zdjecie potwierdzone jako ta sama scena co w makiecie:
   kurtyny, publicznosc, Kamila z mikrofonem). Wczesniej inline style z
   zahardkodowanymi rgba - teraz przez tokeny --overlay-soft/--overlay-dark
   (RADZIOCH_DESIGN_SYSTEM.md, wartosci .46/.72 ~ identyczne z poprzednimi
   recznymi .45/.7). */
.osiagnij {
  position: relative;
  background-image: linear-gradient(var(--overlay-soft), var(--overlay-dark)), url("../img/zdjecia/IMG_9133.JPG");
  background-size: cover;
  background-position: center;
}
.osiagnij__meta { margin-top: var(--space-5); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-on-dark-muted); }
/* Pomiar wektorowy: zdanie karty jest PODZIELONE - poczatek prostym pismem
   (bialy, jak reszta tekstu na ciemnym tle), dalsza czesc (po "w ktorej")
   kursywa w kolorze zlota. Base ".card-highlight p" (klasa+element, specyficznosc
   0-1-1) ustawia 22px/italic/Bodoni dla calego akapitu - selektor jednoklasowy
   ".osiagnij__lead" (0-1-0) PRZEGRYWAL z nim mimo zapisu pozniej w pliku (bug
   zlapany dopiero pomiarem getComputedStyle, na oko wygladalo OK). Podniesione
   do ".card-highlight .osiagnij__lead" (0-2-0) zeby realnie wygrac. */
.card-highlight .osiagnij__lead { font-size: 20px; font-style: normal; color: var(--text-on-dark); }
.card-highlight .osiagnij__lead em { color: var(--gold); }
.card-highlight .osiagnij__body {
  font-family: var(--font-text); font-size: 14px; font-style: normal;
  margin-top: var(--space-4); color: var(--text-on-dark-muted);
}
.osiagnij__cta { margin-top: var(--space-6); }

/* --- Program, dwa etapy -------------------------------------------------- */
.program__head { display: flex; justify-content: space-between; align-items: flex-end; gap: var(--space-6); flex-wrap: wrap; }
.program__intro { max-width: 34ch; font-size: 14px; color: var(--fg-muted); }
.program__intro .btn { margin-top: var(--space-5); }
/* D41 sekcja 04, pomiar wektorowy makiety: "Konkretna droga." (H2, nie H3 karty)
   jest w kolorze --blush (zmierzone ~208,178,168, dokladnie #D7B6AA), inny od
   kart nizej (.etapa h3 em uzywa gold-light, potwierdzone poprawne). Wczesniej
   brak reguly = dziedziczylo biale --text-on-dark. */
#program h2 em { color: var(--blush); }
.etapy { display: grid; grid-template-columns: 1fr 1fr; gap: var(--card-gap); margin-top: var(--space-8); }
@media (max-width: 900px) { .etapy { grid-template-columns: 1fr; } }
.etapa {
  position: relative;
  padding: var(--space-8) var(--space-7);
  overflow: hidden;
  border-left: 4px solid var(--gold);
}
.etapa--dark { background: var(--surface-espresso); color: var(--text-on-dark); }
/* D41: border-left-color bylo var(--gold) (kopiowane z bazowej .etapa), pomiar
   wektorowy pokazal dokladnie --blush (#D7B6AA, zmierzone 215,182,170, piksel w
   piksel) na lewej krawedzi karty wine - gold zostaje tylko na karcie --dark. */
.etapa--wine { background: var(--accent-deep); color: var(--text-on-dark); border-left-color: var(--blush); }
.etapa__num {
  position: absolute; right: var(--space-6); top: var(--space-5);
  font-family: var(--font-display); font-size: 90px; font-style: italic;
  color: rgba(255,253,248,0.06);
  line-height: 1;
}
.etapa__kicker { font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold-light); margin-bottom: var(--space-4); }
.etapa h3 { font-size: 30px; margin-bottom: var(--space-6); }
.etapa h3 em { color: var(--gold-light); }
.etapa__list { list-style: none; margin: 0 0 var(--space-7); padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3) var(--space-5); border-top: 1px solid var(--line-on-dark); padding-top: var(--space-5); }
.etapa__list--flush { border-top: 0; padding-top: 0; } /* D41: bylo inline style na Etapie 2 */
.etapa__list li { font-size: 13px; display: flex; gap: var(--space-2); }
/* D41: numery listy (01-08) byly bez koloru (dziedziczyly biale --text-on-dark
   przez opacity .55 = szarawy), pomiar wektorowy pokazal cieply zloty odcien
   (~156,127,88, blisko --gold-light stlumionego). */
.etapa__list li::before { content: attr(data-i); color: var(--gold-light); opacity: .7; }
.etapa p.etapa__lead { font-size: 14px; color: var(--text-on-dark-muted); margin-bottom: var(--space-6); }
.etapa__actions { display: flex; align-items: center; gap: var(--space-5); flex-wrap: wrap; }
.etapa__actions a.link { font-size: 12px; text-decoration: underline; text-underline-offset: 4px; color: var(--text-on-dark-muted); }

/* --- Platforma mockup ------------------------------------------------- */
.platforma { position: relative; background: var(--surface-paper); overflow: hidden; }
/* D41 sekcja 06, dograne po zgloszeniu przy Social: watermark "PLATFORM" byl
   pominiety tym samym wzorcem co "BEAUTY"/"SOCIAL", zauwazone dopiero na
   zrzutach Pas CTA (fragment gornej krawedzi tamtej sekcji). Pomiar wektorowy
   makiety: sekcja on-light, wiec obrys WINEOWY (~92,50,56, rodzina --accent),
   nie bialy jak na sekcjach on-dark. Pozycja wyzej nad dolna krawedzia sekcji
   niz w Social (bottom ~65px vs 30px - mierzone relatywnie do dolnej krawedzi
   sekcji, nie viewportu). */
.platforma__watermark {
  position: absolute; z-index: 0; pointer-events: none;
  left: -10px; bottom: 65px;
  /* "PLATFORM" (8 znakow) jest szersze niz "SOCIAL" (6) - 21vw przy 768px dawalo
     878px szerokosci watermarku (scrollWidth>clientWidth), skorygowane do 17vw
     zeby zmiescic sie przy tej samej dlugosci slowa na wezszych ekranach. */
  font-family: var(--font-display); font-size: min(210px, 17vw); font-weight: 400; line-height: 1;
  letter-spacing: 0.02em;
  color: transparent;
  -webkit-text-stroke: 1px rgba(112, 41, 59, 0.08);
  text-stroke: 1px rgba(112, 41, 59, 0.08);
  white-space: nowrap;
}
.platforma > .container { position: relative; z-index: 1; }
/* D41 sekcja 06: pomiar wektorowy makiety pokazal kolumny NIE 1fr/1fr (domyslne
   .split) - lewa (tekst+sciezka) ~448px, prawa (mockup) ~848px na kontenerze
   1296px, stosunek ~1:1.9. Osobna klasa zamiast modyfikacji generycznego .split
   (uzywanego przez inne sekcje z rowna kolumna, nie ruszane). */
.platforma__split { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1.9fr); gap: var(--space-9); align-items: start; }
@media (max-width: 900px) { .platforma__split { grid-template-columns: 1fr; } }
.platforma__intro-text { margin-top: var(--space-5); color: var(--text-on-light-muted); }
.platforma__cta { margin-top: var(--space-6); }
.platforma__mockup {
  background: var(--surface-dark);
  color: var(--text-on-dark);
  padding: var(--space-3);
  border-radius: 18px; /* ramka urządzenia z makiety, nie element UI */
  box-shadow: 0 30px 70px rgba(12, 9, 11, 0.28);
}
.platforma__mockup-bar { display: flex; align-items: center; justify-content: space-between; padding: var(--space-2) var(--space-4) var(--space-3); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-on-dark-muted); }
.platforma__mockup-bar::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--gold); box-shadow: 14px 0 0 var(--blush), 28px 0 0 rgba(255,253,248,.35); margin-right: 32px; }
.platforma__mockup-media { position: relative; margin-bottom: var(--space-5); }
.platforma__mockup-media img { margin-bottom: 0; }
.platforma__mockup-play { position: absolute; inset: 0; margin: auto; width: 56px; height: 56px; border-radius: 50%; background: rgba(12, 9, 11, 0.72); color: var(--text-on-dark); display: flex; align-items: center; justify-content: center; }
.platforma__mockup-play svg { width: 18px; height: 18px; margin-left: 3px; }
.sciezka { margin-top: var(--space-8); }
/* D41: bylo var(--gold-hover) (brazowy zloty), pomiar wektorowy pokazal wyraznie
   wineowy odcien (~134,74,86, rodzina --accent), nie zloty. */
.sciezka__label { font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--accent-ctx); font-weight: 700; margin-bottom: var(--space-3); }
.sciezka h3 { font-size: var(--fs-display-3); }
.sciezka__bar { position: relative; height: 2px; background: rgba(12, 9, 11, 0.28); margin: var(--space-6) 6px var(--space-3); }
.sciezka__dot { position: absolute; top: 50%; width: 12px; height: 12px; border-radius: 50%; transform: translate(-50%, -50%); background: var(--surface-dark); }
.sciezka__dot--start { left: 0; background: var(--accent); }
.sciezka__dot--srodek { left: 50%; background: var(--gold); }
.sciezka__dot--koniec { left: 100%; }
.sciezka__labels { display: flex; justify-content: space-between; font-size: 10px; letter-spacing: .14em; text-transform: uppercase; font-weight: 700; color: var(--text-on-light-muted); }
.sciezka .btn { margin-top: var(--space-6); }
.sciezka__cta { --btn-solid-bg: var(--accent); --btn-solid-fg: var(--surface-white); }
.platforma__mockup-body { display: grid; grid-template-columns: 240px 1fr; gap: 0; background: var(--surface-espresso); }
.platforma__mockup-side { padding: var(--space-6) var(--space-5); display: flex; flex-direction: column; min-height: 100%; }
.platforma__mockup-logo { margin-bottom: var(--space-5); }
.platforma__mockup-logo img { height: 34px; width: auto; }
.platforma__mockup-course { font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold-light); margin-bottom: var(--space-1); }
.platforma__mockup-course strong { display: block; font-family: var(--font-text); font-size: 13px; color: var(--text-on-dark); text-transform: none; letter-spacing: 0; margin-top: 2px; }
.platforma__mockup-list { list-style: none; margin: var(--space-5) 0 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.platforma__mockup-list li { font-size: 12px; padding: var(--space-3) var(--space-3); color: var(--text-on-dark-muted); }
.platforma__mockup-list li.active { background: var(--accent); color: var(--text-on-dark); font-weight: 700; }
/* D41: element z makiety calkowicie pominiety wczesniej ("POSTĘP 38%" + pasek
   pod lista modulow w panelu bocznym mockupu). Czysto dekoracyjny UI chrome
   mockupu (nie realna funkcja LearnDash na tej stronie), liczba 38% nie jest
   faktem o kliencie tylko przykladowa wartoscia demo w screenie makiety. */
.platforma__mockup-progress { margin-top: auto; padding-top: var(--space-6); }
.platforma__mockup-progress p { font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-on-dark-muted); margin-bottom: var(--space-2); }
.platforma__mockup-progress-bar { height: 3px; background: rgba(255,253,248,.14); }
.platforma__mockup-progress-bar span { display: block; height: 100%; background: var(--gold); }
.platforma__mockup-main { background: var(--surface-cream); color: var(--text-on-light); padding: var(--space-6); }
.platforma__mockup-main img { width: 100%; aspect-ratio: 16/9; object-fit: cover; margin-bottom: var(--space-5); }
.platforma__mockup-main .lekcja-label { font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent); margin-bottom: var(--space-2); }
.platforma__mockup-etap { margin-bottom: var(--space-4); }
.platforma__mockup-main h4 { font-family: var(--font-display); font-size: 20px; margin: 0 0 var(--space-3); font-weight: 400; }
.platforma__mockup-desc { font-size: 13px; color: var(--text-on-light-muted); }
/* D41: przycisk "DALEJ" w rogu karty lekcji, wczesniej pominiety. Dekoracyjny
   (mockup nie jest prawdziwa nawigacja LearnDash), stad button bez href,
   aria-hidden+tabindex=-1 tak jak juz istniejacy .platforma__mockup-play. */
.platforma__mockup-lesson-row { display: flex; justify-content: space-between; align-items: flex-end; gap: var(--space-5); }
.platforma__mockup-next {
  flex: none; display: inline-flex; align-items: center; gap: var(--space-2);
  background: var(--surface-dark); color: var(--text-on-dark);
  border: 0; padding: var(--space-3) var(--space-5);
  font-family: var(--font-text); font-size: 12px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  cursor: default;
}
@media (max-width: 767px) { .platforma__mockup-body { grid-template-columns: 1fr; } }

/* --- Pas CTA prosty -------------------------------------------------- */
/* D41 sekcja 07: tlo bylo --surface-dark (przez .on-dark), pomiar wektorowy
   makiety pokazal cieplejszy odcien (~41,26,22), dokladnie --surface-espresso
   (#271914), nie czarny .on-dark. .on-dark zostaje na sekcji (tekst/przycisk/
   kontekst gold poprawne), --bg nadpisany osobno. Deko-r bylo calkowicie
   pominiete - kontrastowy zoom makiety pokazal wyrazny luk monogramu R przy
   prawej krawedzi, ten sam wzorzec co inne sekcje on-dark (01/06/11/12). */
.pas-cta-sekcja { background: var(--surface-espresso); padding-block: var(--space-9); }
.pas-cta__h2 { font-size: var(--fs-display-3); }
.pas-cta { display: flex; align-items: center; justify-content: space-between; gap: var(--space-6); flex-wrap: wrap; }
/* D41: bylo var(--text-on-dark-muted) (biel stlumiona), pomiar wektorowy
   pokazal wyrazny zloty odcien (~162,132,89, rodzina --gold). */
.pas-cta__meta { font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold); margin-top: var(--space-3); }

/* --- Dla kogo ---------------------------------------------------------- */
.dla-kogo { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-9); align-items: start; }
/* D41 sekcja 08: pomiar wektorowy makiety pokazal cienka pionowa linie miedzy
   kolumna tekstu a kolumna listy (render x~1399 na kontenerze 72-1368, blisko
   srodka - potwierdza ze podzial 1fr/1fr juz jest poprawny, brakowalo tylko
   samej linii). Kolor bardzo subtelny (delta ~30 od tla), --line-ctx pasuje. */
.dla-kogo__col--list { border-left: 1px solid var(--line-ctx); padding-left: var(--space-9); }
.dla-kogo__intro { margin-top: var(--space-5); color: var(--text-on-dark-muted); }
.dla-kogo__cta { margin-top: var(--space-6); }
.dla-kogo__list { display: flex; flex-direction: column; gap: var(--space-3); }
.dla-kogo__item { display: flex; gap: var(--space-6); align-items: baseline; padding: var(--space-5) var(--space-6); border: 1px solid var(--line-ctx); background: rgba(255, 253, 248, 0.03); }
/* D41: bylo var(--accent-ctx) (=gold na on-dark, juz OK), h2 em obok bylo BEZ
   koloru w ogole - pomiar wektorowy H2 em pokazal cieply zloty (~203,178,142,
   rodzina --gold-light), dziedziczylo biel. */
.dla-kogo__item em { font-family: var(--font-display); font-style: italic; font-size: 26px; color: var(--accent-ctx); width: 40px; flex: none; }
.dla-kogo__item strong { display: block; font-size: 12px; letter-spacing: .08em; text-transform: uppercase; margin-bottom: 4px; }
.dla-kogo__item span { font-size: 13px; color: var(--fg-muted); }
#dla-kogo h2 em { color: var(--gold-light); }
@media (max-width: 900px) {
  .dla-kogo { grid-template-columns: 1fr; }
  .dla-kogo__col--list { border-left: 0; padding-left: 0; border-top: 1px solid var(--line-ctx); padding-top: var(--space-7); margin-top: var(--space-2); }
}

/* --- Pakiety ------------------------------------------------------------- */
.pakiety { display: grid; grid-template-columns: 1fr 1fr; gap: var(--card-gap); margin-top: var(--space-8); }
@media (max-width: 900px) { .pakiety { grid-template-columns: 1fr; } }
.pakiety__head { display: flex; justify-content: space-between; align-items: flex-end; gap: var(--space-6); flex-wrap: wrap; }
.pakiety__intro { max-width: 34ch; font-size: 14px; color: var(--fg-muted); }
/* D41 sekcja 09: border-left bylo 4px, pomiar wektorowy makiety (trzy niezalezne
   probki y) pokazal ~7-7.5px canonical, zaokraglone do 8px. */
.pakiet { padding: var(--space-8) var(--space-7); background: var(--surface-white); border-left: 8px solid var(--surface-dark); box-shadow: var(--shadow-karta); }
.pakiet--premium { background: linear-gradient(135deg, var(--accent) 0%, var(--accent-deep) 100%); color: var(--text-on-dark); border-left-color: var(--gold); --btn-solid-bg: var(--gold); --btn-solid-fg: var(--surface-dark); }
.pakiet--premium .btn--solid:hover {
  /* 15.09.2026 (D44): karta nadpisuje --btn-solid-bg na zloto (dobry kontrast na winnym
     tle w spoczynku), ale NIE nadpisywala --accent-ctx-hover - hover dziedziczyl go z
     zewnetrznego kontekstu sekcji (.on-light, --accent-ctx-hover:var(--accent-hover)
     =#491923), ktory przypadkiem jest PRAWIE IDENTYCZNY z koncem gradientu tej karty
     (--accent-deep, tez #491923) - przycisk na hover znikal w tle karty. Zgloszone przez
     Jakuba zrzutem. Zamiast kolejnego koloru wypelnienia: transparent + biala obwodka/tekst
     (tlo karty ciemne winne, bialy zawsze czytelny), spojne z zasada "primary na tle
     primary -> transparent+outline" ustalona z Jakubem. */
  background: transparent;
  border-color: var(--surface-white);
  color: var(--surface-white);
}
.pakiet__list-intro { font-size: 13px; margin-bottom: var(--space-4); }
.pakiet__label { font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 700; margin-bottom: var(--space-4); }
.pakiet--premium .pakiet__label { color: var(--gold-light); }
.pakiet__desc { font-size: 13px; color: var(--text-on-light-muted); margin-bottom: var(--space-6); }
.pakiet--premium .pakiet__desc { color: var(--text-on-dark-muted); }
.pakiet__price { display: flex; align-items: baseline; gap: var(--space-2); font-family: var(--font-display); margin-bottom: var(--space-6); border-bottom: 1px solid var(--line-on-light); padding-bottom: var(--space-6); }
.pakiet--premium .pakiet__price { border-color: var(--line-on-dark); }
.pakiet__price strong { font-size: 48px; font-weight: 400; }
/* D41: dziedziczylo font-display (Bodoni) z rodzica .pakiet__price - etykieta
   jednostki ("zł") to maly uppercase label, ten sam typ co eyebrow/kicker/meta
   sitewide (zawsze Manrope), nie liczba ceny. Jawny reset. */
.pakiet__price span { font-family: var(--font-text); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; }
.pakiet__list { list-style: none; margin: 0 0 var(--space-7); padding: 0; display: flex; flex-direction: column; gap: var(--space-3); counter-reset: pakiet; }
.pakiet__list li { font-size: 13px; padding-left: var(--space-6); position: relative; counter-increment: pakiet; }
/* D41: numery listy byly bez koloru (dziedziczyly tekst rodzica x opacity .55),
   pomiar wektorowy Basic pokazal wyrazny wineowy odcien (~137,79,93, rodzina
   --accent), nie zwykla stlumiona czern. --accent-ctx dziala jednakowo w obu
   kartach (sekcja on-light), na Premium (tlo gradient wine) nadal daje
   widoczny, tylko cichszy kontrast - zgodne z makieta. */
.pakiet__list li::before { content: counter(pakiet, decimal-leading-zero); position: absolute; left: 0; top: 1px; font-size: 11px; letter-spacing: .06em; color: var(--accent-ctx); opacity: .85; }
/* --accent-ctx na sekcji on-light = wine, nieczytelne na wine-gradient tle
   Premium (pierwsza proba, zlapane od razu na zrzucie - wine-na-wine). Premium
   dostaje gold-light, ten sam ton co juz .pakiet--premium .pakiet__label. */
.pakiet--premium .pakiet__list li::before { color: var(--gold-light); opacity: .9; }
.pakiet__meta { font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; margin-top: var(--space-4); opacity: .7; }
.pakiet__meta--premium { text-transform: none; letter-spacing: 0; font-size: 12px; opacity: .85; }

/* --- Zespół -------------------------------------------------------------- */
.zespol__head { display: flex; justify-content: space-between; align-items: flex-end; flex-wrap: wrap; gap: var(--space-4); }
/* D41 sekcja 10: bylo var(--text-on-dark-muted) (biel stlumiona), pomiar
   wektorowy pokazal wyrazny zloty odcien (~169,139,93, rodzina --gold). */
.zespol__social { display: flex; gap: var(--space-5); font-size: 11px; letter-spacing: .1em; text-transform: uppercase; font-weight: 700; color: var(--gold); }
/* D41 audyt hover, RADZIOCH_DESIGN_SYSTEM.md pkt 4: strzalka linku tekstowego
   przesuwa sie 4px w osi X na hover, 180ms, bez zmiany skali calego linku.
   .link-arrow to wspolny span uzyty we wszystkich linkach-strzalkach na home
   (Zespol, Inne szkolenia, karty szkolen). */
.link-arrow { display: inline-block; transition: transform var(--dur-fast) var(--ease); }
.zespol__social a:hover .link-arrow, .inne__link:hover .link-arrow, .szkolenie-card__link:hover .link-arrow { transform: translateX(4px); }
.zespol__social a { transition: color var(--dur-base) var(--ease); }
.zespol__social a:hover { color: var(--gold-light); }
.zespol__social a:focus-visible { outline: 2px solid var(--gold-light); outline-offset: 4px; }
.zespol { display: grid; grid-template-columns: 1fr 1fr; gap: var(--card-gap); margin-top: var(--space-8); }
.osoba { display: grid; grid-template-columns: 38% 1fr; border: 1px solid var(--line-on-dark); background: rgba(255, 253, 248, 0.02); }
.osoba img { width: 100%; height: 100%; min-height: 380px; object-fit: cover; margin: 0; }
.osoba__body { padding: var(--space-6); display: flex; flex-direction: column; }
.osoba__name { font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold); margin-bottom: var(--space-2); }
.osoba h3 { font-size: 24px; margin-bottom: var(--space-4); }
.osoba h3 em { color: var(--gold-light); }
.osoba p { font-size: 13px; color: var(--text-on-dark-muted); margin-bottom: var(--space-4); }
.osoba__bio-full { display: none; }
.osoba.is-open .osoba__bio-full { display: block; }
.osoba.is-open .osoba__bio-short { display: none; }
.osoba .btn { margin-top: auto; align-self: flex-start; }
@media (max-width: 1024px) { .zespol { grid-template-columns: 1fr; } }
@media (max-width: 700px) {
  .osoba { grid-template-columns: 40% 1fr; }
  .osoba img { min-height: 0; }
  .osoba__body { padding: var(--space-4); min-width: 0; }
  .osoba h3 { font-size: 20px; }
  .osoba .btn { width: 100%; padding-inline: var(--space-3); font-size: 11px; white-space: normal; text-align: center; }
}

/* --- Social -------------------------------------------------------------- */
/* D41 sekcja 11: tlo bylo inline var(--surface-espresso) - teraz klasa. Watermark
   "SOCIAL" byl calkowicie pominiety w kodzie (zero uzyc), kontrastowy zoom makiety
   ujawnil wielki obrysowy napis w lewym dolnym rogu, ten sam wzorzec co "BEAUTY"
   w Hero (D41 wczesniej) - tam realny plik SVG istnial w paczce, tutaj NIE MA
   gotowego assetu "social-outline.svg" w 00-global, wiec zaimplementowane jako
   prawdziwy tekst HTML (zgodne z implementation-guide "tekst jako HTML, nie
   raster") ostylowany konturem zamiast wypelnienia. Ten sam wzorzec (Bodoni,
   opacity ~.06-.08) prawdopodobnie dotyczy tez sekcji 06 Platforma ("PLATFORM"
   widoczne w tle na zrzutach z tamtej tury, wtedy nie zlapane) - zgloszone w
   raporcie do Jakuba, nie naprawiane wstecznie bez zgody. */
.social-sekcja { position: relative; background: var(--surface-espresso); overflow: hidden; }
.social-sekcja__watermark {
  position: absolute; z-index: 0; pointer-events: none;
  left: -20px; bottom: 30px;
  /* D41: bylo font-size stale 220px + media query skok przy 767px - 768px (tuz
     POZA progiem max-width:767) renderowal desktopowy rozmiar w wezszym
     viewporcie i psul scrollWidth na sekcji (ten sam wzorzec co watermark
     Hero/monogram R wczesniej w tej sesji). Skalowanie plynne przez vw eliminuje
     luke miedzy 767 a 768 zamiast kolejnego twardego progu. */
  font-family: var(--font-display); font-size: min(220px, 22vw); font-weight: 400; line-height: 1;
  letter-spacing: 0.02em;
  color: transparent;
  -webkit-text-stroke: 1px rgba(255, 253, 248, 0.045);
  text-stroke: 1px rgba(255, 253, 248, 0.045);
  white-space: nowrap;
}
.social-sekcja > .container { position: relative; z-index: 1; }
.social__intro { margin-top: var(--space-4); color: var(--text-on-dark-muted); max-width: 40ch; }
.social__actions { display: flex; gap: var(--space-4); margin-top: var(--space-7); flex-wrap: wrap; }
.social { display: grid; grid-template-columns: 1fr 1.25fr; gap: var(--space-9); align-items: center; }
@media (max-width: 900px) { .social { grid-template-columns: 1fr; gap: var(--space-7); } }
.social__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-4); }
.social__item { position: relative; aspect-ratio: 3/4; overflow: hidden; }
.social__item img { width: 100%; height: 100%; object-fit: cover; }
.social__item span { position: absolute; left: var(--space-4); bottom: var(--space-4); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-on-dark); background: rgba(12,9,11,0.55); padding: 6px 10px; }
@media (max-width: 767px) { .social__grid { gap: var(--space-2); } .social__item span { font-size: 8px; left: var(--space-2); bottom: var(--space-2); padding: 4px 6px; } }

/* --- Inne szkolenia -------------------------------------------------------- */
/* D41 sekcja 12: h2 em ("w wybranym formacie.") byl bez koloru (dziedziczyl
   ciemny atrament), pomiar wektorowy pokazal dokladnie --accent (113,43,60 vs
   token 112,41,59, prawie zero odchylenia). */
.inne h2 em { color: var(--accent-ctx); }
.inne { display: grid; grid-template-columns: 1fr 2.2fr; gap: var(--space-9); align-items: start; }
.inne__intro { margin-top: var(--space-5); color: var(--text-on-light-muted); max-width: 32ch; }
.inne__link { display: inline-block; margin-top: var(--space-5); font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--accent); text-decoration: underline; text-underline-offset: 4px; transition: color var(--dur-base) var(--ease); }
.inne__link:hover { color: var(--accent-hover, var(--accent-deep)); }
.inne__link:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
.inne-szkolenia { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-5); }
@media (max-width: 900px) {
  .inne { grid-template-columns: 1fr; gap: var(--space-7); }
  .inne-szkolenia { grid-template-columns: 1fr; gap: var(--space-3); }
  .szkolenie-card { display: grid; grid-template-columns: 112px 1fr; grid-template-rows: auto auto; }
  .szkolenie-card img { grid-row: 1 / 3; height: 100%; aspect-ratio: auto; }
  .szkolenie-card__body, .szkolenie-card__link { grid-column: 2; }
  .szkolenie-card__link { padding-top: 0; }
}
/* D41 sekcja 12: akcentowa linia wine byla na SPODZIE calej karty (pod linkiem
   "Zobacz"), pomiar wektorowy makiety pokazal ja MIEDZY zdjeciem a tekstem, nie
   na dole. Przeniesiona z .szkolenie-card na sam obrazek. */
.szkolenie-card { background: var(--surface-white); }
.szkolenie-card img { aspect-ratio: 4/3; object-fit: cover; border-bottom: 3px solid var(--accent); }
.szkolenie-card__body { padding: var(--space-5); }
.szkolenie-card__body strong { display: block; font-size: 14px; margin-bottom: var(--space-2); }
/* D41: podpis (np. "90 LEKCJI / 6 MIESIĘCY") byl w stlumionej szarosci, pomiar
   wektorowy pokazal wyrazny wineowy kolor (rodzina --accent). */
.szkolenie-card__body span { font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--accent); }
.szkolenie-card__link { display: flex; justify-content: flex-end; padding: var(--space-3) var(--space-5) var(--space-5); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--accent); transition: color var(--dur-base) var(--ease); }
.szkolenie-card__link:hover { color: var(--accent-deep); }
.szkolenie-card__link:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }

/* --- Opinie karuzela ------------------------------------------------------- */
/* D41 15.09: sekcja odkryta (Jakub odwraca D16pkt11), pelny pomiar wektorowy
   pierwszy raz (wczesniej tylko D33, przed RADZIOCH_DESIGN_SYSTEM.md). */
.opinie__h2 { margin-bottom: var(--space-8); }
.opinie__slide { max-width: 780px; margin-inline: auto; background: var(--surface-cream); color: var(--text-on-light); padding: var(--space-8); position: relative; }
/* D41: bez font-family, dziedziczylo Manrope. implementation-guide.md: Bodoni
   dla "wyroznionych cytatow" - ten duzy cudzyslow to dokladnie ten przypadek. */
.opinie__quote { font-family: var(--font-display); font-size: 40px; color: var(--accent); margin-bottom: var(--space-4); }
.opinie__text { font-family: var(--font-display); font-size: 20px; }
.opinie__text em { color: var(--accent); }
.opinie__meta { margin-top: var(--space-6); padding-top: var(--space-5); border-top: 1px solid var(--line-on-light); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-on-light-muted); }
.opinie__nav { display: flex; align-items: center; justify-content: center; gap: var(--space-8); margin-top: var(--space-6); }
/* D41: strzalki byly kwadratowe, jednakowo stylowane - pomiar wektorowy pokazal
   OKRAGLE przyciski, "poprzednia" = kontur, "nastepna" = pelne zloto (ten sam
   wzorzec solid/outline co przyciski btn--solid/outline gdzie indziej, tu
   zastosowany do nawigacji karuzeli). Jedyny drugi wyjatek od "kanciastej"
   makiety poza maska zdjecia hero (tokens.css komentarz do zaktualizowania
   przy kolejnej rundzie audytu tokenow). Wylaczone (disabled) bo jest tylko
   1 realny slajd (placeholder) - nie udajemy dzialajacej karuzeli bez tresci
   do przewijania (D11/braki-materialy: brak JS, statyczny uklad na start). */
.opinie__arrow {
  width: 44px; height: 44px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; border: 1px solid var(--line-on-dark);
  background: transparent; color: var(--text-on-dark);
}
.opinie__arrow--next { background: var(--gold); border-color: var(--gold); color: var(--surface-dark); }
.opinie__arrow[disabled] { opacity: .55; cursor: not-allowed; }
.opinie__dots { display: flex; gap: var(--space-2); }
.opinie__dots span { width: 8px; height: 8px; border-radius: 50%; background: var(--line-on-dark); }
.opinie__dots span.active { background: var(--gold); }

/* --- CTA końcowe ------------------------------------------------------------- */
.cta-koncowe-sekcja { position: relative; overflow: hidden; color: var(--surface-dark); background: url("../img/dekoracje/gold-gradient.svg") center / cover no-repeat, var(--gold-light); }
.cta-koncowe-sekcja::after { content: ""; position: absolute; right: 0; top: 0; width: 400px; height: 440px; pointer-events: none; color: var(--surface-dark); background: url("../img/dekoracje/editorial-rings.svg") right -120px top -80px / 520px 520px no-repeat; opacity: .9; }
.cta-koncowe-sekcja > .container { position: relative; z-index: 1; }
/* D41 sekcja 14 (dograna po CTA koncowe D33, przed RADZIOCH_DESIGN_SYSTEM.md):
   11 inline styli usuniete. Kolory H2/em/eyebrow byly juz poprawne co do
   tokenu (accent-deep/surface-dark), tylko zapisane inline - przeniesione do
   klas bez zmiany wartosci. */
.cta-koncowe__eyebrow { color: var(--accent-deep); }
.cta-koncowe__h2 { color: var(--surface-dark); }
.cta-koncowe__h2 em { color: var(--accent-deep); }
.cta-koncowe__lead { margin-top: var(--space-4); }
.cta-koncowe__actions { display: flex; gap: var(--space-4); margin-top: var(--space-7); flex-wrap: wrap; }
.cta-koncowe__cta-primary { --btn-solid-bg: var(--surface-dark); --btn-solid-fg: var(--surface-white); }
.cta-koncowe__cta-primary.btn--solid:hover {
  /* 15.09.2026 (D44): sekcja ma zlote tlo (gold-gradient.svg + --gold-light), przycisk w
     spoczynku jest celowo ciemny (dobry kontrast), ale hover dziedziczyl domyslny fallback
     --gold-hover (sekcja nie ma klasy kontekstu .on-*) - zloty hover na zlotym tle sekcji,
     przycisk znikal. Zgloszone przez Jakuba zrzutem. transparent + czarna obwodka/tekst,
     ta sama zasada co .pakiet--premium wyzej, tu czarny bo tlo sekcji jasne/zlote. */
  background: transparent;
  border-color: var(--surface-dark);
  color: var(--surface-dark);
}
.cta-koncowe__cta-secondary { border-color: var(--surface-dark); color: var(--surface-dark); }
.cta-koncowe__cta-secondary:hover {
  /* 15.09.2026 (D44): sekcja bez klasy .on-* (kontekst nieustawiony), wiec generyczny
     .btn--outline:hover polegalby na fallbackach - tu jawnie, spojnie z sasiednim
     przyciskiem primary: ciemne wypelnienie, biale tekst, dobry kontrast na zlotym tle. */
  background: var(--surface-dark);
  border-color: var(--surface-dark);
  color: var(--surface-white);
}
.cta-koncowe { display: grid; grid-template-columns: 1.1fr 0.9fr; gap: var(--space-9); }
@media (max-width: 900px) { .cta-koncowe { grid-template-columns: 1fr; } }
/* D41: pionowy dywider miedzy kolumnami calkowicie pominiety, pomiar wektorowy
   pokazal cienka linie (~167,137,97 na tle ~206,170,119, przyciemniony wariant
   tla, nie osobny jasny/ciemny token) - rgba(12,9,11,.2) daje wizualnie ten
   sam efekt przyciemnienia zlotego tla. */
.cta-koncowe__col--list { border-left: 1px solid rgba(12, 9, 11, 0.2); padding-left: var(--space-9); }
@media (max-width: 900px) { .cta-koncowe__col--list { border-left: 0; padding-left: 0; border-top: 1px solid rgba(12,9,11,.2); padding-top: var(--space-7); margin-top: var(--space-2); } }
.cta-koncowe__list-label { font-size: 11px; letter-spacing: .08em; text-transform: uppercase; margin-bottom: var(--space-5); }
.cta-koncowe__list { border-top: 1px solid rgba(12,9,11,0.18); padding-top: var(--space-5); }
.cta-koncowe__item { display: flex; gap: var(--space-4); align-items: baseline; padding: var(--space-3) 0; }
/* D41: numery listy (01-03) byly bez koloru (dziedziczyly --surface-dark z
   sekcji), pomiar wektorowy pokazal wyrazny wineowy odcien, ta sama rodzina
   co H2 em w tej samej sekcji (--accent-deep, juz uzywane obok). */
.cta-koncowe__item em { font-family: var(--font-display); font-style: italic; font-size: 20px; width: 28px; flex: none; color: var(--accent-deep); }
.cta-koncowe__disclaimer { font-size: 11px; margin-top: var(--space-5); opacity: .75; }

/* --- Stopka ------------------------------------------------------------------ */
.site-footer { background: var(--surface-dark); color: var(--text-on-dark); padding-block: var(--space-9); }
.site-footer__top { display: grid; grid-template-columns: 1.4fr repeat(4, 1fr); gap: var(--space-6); padding-bottom: var(--space-8); border-bottom: 1px solid var(--line-on-dark); }
.site-footer__brand { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
/* D32 14.09: logo stopki bylo 44px, zmierzone z paczka-projekt/01-strona-glowna/00-full-desktop.png
   (canvas 1:1 z realnym px, kanon 1440) na ~65px wysokosci monogramu - blisko juz zweryfikowanego
   w D24 rozmiaru monogramu naglowka (56px, ta sama miara pikselowa co header). Wybrane 56px
   zamiast surowej wartosci 65 z tego pomiaru: dwie niezalezne miary (nowy pomiar stopki vs
   juz zatwierdzony pomiar naglowka) powinny sie zgadzac dla tego samego assetu logo, 56px jest
   bardziej wiarygodne (D24 mial pelna, dedykowana sesje pomiarowa). */
.site-footer__brand img { height: 56px; }
.site-footer__brand .site-header__logo-text { align-items: flex-start; }
.site-footer__brand .site-header__logo-text strong { font-size: 15px; padding-left: 0; }
.site-footer__brand .site-header__logo-text span { font-size: 7px; padding-left: 0; }
.site-footer__col strong { display: block; font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold-light); margin-bottom: var(--space-4); }
/* D41 audyt hover, RADZIOCH_DESIGN_SYSTEM.md sekcja 18, cytat doslowny: "linki:
   14px, kolor rgba(255,253,248,.68), hover do --rbt-white z przesunieciem/
   krotka linia maksymalnie 4 px". Jakub zglosil wprost: zero hover na tych
   linkach do dzisiaj (bylo 13px, brak jakiegokolwiek :hover). Rozmiar
   poprawiony na 14px, dodany hover: kolor + przesuniecie 4px + podkreslenie
   (nie sama zmiana koloru, zgodnie z proba "nie tylko kolor"). */
.site-footer__col a, .site-footer__col span { display: block; font-size: 14px; color: var(--text-on-dark-muted); margin-bottom: var(--space-2); }
.site-footer__col a { text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 3px; transition: color var(--dur-base) var(--ease), transform var(--dur-base) var(--ease), text-decoration-color var(--dur-base) var(--ease); }
.site-footer__col a:hover { color: var(--text-on-dark); transform: translateX(4px); text-decoration-color: currentColor; }
.site-footer__col a:focus-visible { outline: 2px solid var(--gold-light); outline-offset: 4px; }
/* D32 14.09: dodane text-transform+letter-spacing - makieta (00-full-desktop.png, wszystkie
   sprawdzone podstrony) pokazuje caly dolny rzad (copyright/regulamin/polityka) wersalikami,
   live renderowal sie normalnym tekstem (brak wlasciwosci w ogole). */
.site-footer__bottom { display: flex; justify-content: space-between; align-items: center; padding-top: var(--space-6); font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-on-dark-muted); flex-wrap: wrap; gap: var(--space-3); }
.site-footer__bottom a {
  text-decoration: underline; text-underline-offset: 3px;
  transition: color var(--dur-base) var(--ease), transform var(--dur-base) var(--ease);
  display: inline-block;
}
.site-footer__bottom a:hover { color: var(--text-on-dark); transform: translateX(4px); }
.site-footer__bottom a:focus-visible { outline: 2px solid var(--gold-light); outline-offset: 4px; }
@media (max-width: 900px) {
  /* D32 14.09: makieta mobile (01-strona-glowna/00-full-mobile.png ORAZ 15-menu/00-full-mobile.png,
     dwa niezalezne zrodla, zgodne ze soba) pokazuje na mobile TYLKO logo pelnej szerokosci +
     Kontakt + Social media - kolumny Oferta i Studio znikaja calkowicie, nie tylko sie zawijaja.
     Wczesniej live pokazywal wszystkie 4 kolumny w siatce 2 kolumn (w tym Oferta/Studio),
     rozjazd z makieta. */
  .site-footer__top { grid-template-columns: 1fr 1fr; }
  .site-footer__brand { grid-column: 1 / -1; }
  .site-footer__col--oferta,
  .site-footer__col--studio { display: none; }
}
@media (max-width: 600px) {
  .site-footer__bottom { flex-direction: column; align-items: flex-start; }
}

/* --- Fade in wejścia, zgodnie ze standardem --------------------------- */
.fade-in-grupa > * { opacity: 0; transform: translateY(16px); transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease); }
.fade-in-grupa.is-visible > * { opacity: 1; transform: none; }
.fade-in-grupa.is-visible > *:nth-child(2) { transition-delay: 80ms; }
.fade-in-grupa.is-visible > *:nth-child(3) { transition-delay: 160ms; }
/* Bug realny zlapany pomiarem getComputedStyle 16.09.2026 (/o-nas/ build,
   D65): ".fade-in-grupa.is-visible > *" (specyficznosc 0,2,0) i ".btn:hover"
   (tez 0,2,0) walcza o wlasciwosc transform na KAZDYM przycisku ktory jest
   BEZPOSREDNIM dzieckiem revealowanego kontenera. Poniewaz regula resetu
   jest PONIZEJ .btn w pliku, wygrywa w kaskadzie i kasuje translateY(-2px)
   na hover, przycisk przestaje sie unosic. Naprawione nadpisaniem punktowym
   o wyzszej specyficznosci (0,4,0), zero zmiany zachowania dla innych typow
   dzieci (karty, teksty) w grupach reveal. Selektor NIE jest scoped do
   zadnej konkretnej klasy wrappera (.pas-cta__inner itd.) - dziala wszedzie
   tam gdzie ".btn" jest bezposrednim dzieckiem ".fade-in-grupa", bez wzgledu
   na dodatkowe klasy na wrapperze.

   AUDYT SITEWIDE dokonczony 16.09.2026 (D66, po niepelnym spot-checku z D65
   ktory objal tylko /o-nas/ i /sklep/e-booki/): zgrepowane WSZYSTKIE 8 plikow
   motywu z ".fade-in-grupa" (front-page.php, template-kontakt.php,
   template-kursy.php, template-moje-szkolenia.php, template-o-nas.php,
   template-sklep-e-booki.php, template-szkolenia-stacjonarne.php,
   template-szkolenie-instruktorskie.php), sprawdzony selektor ">" w kazdym
   miejscu. Bezposrednie dziecko .btn wystapilo na 4 stronach: strona glowna
   (sekcja 7 "PAS CTA", .container.pas-cta.fade-in-grupa - NOWO znalezione,
   nie bylo w spot-checku D65), /o-nas/ (S3 pas-cta__inner, D65),
   /sklep/e-booki/ (S3 pas-cta__inner, D65), /szkolenia-stacjonarne/ (S3
   pas-cta__inner - NOWO znalezione). Na /szkolenie-instruktorskie/ selektor
   pas-cta__inner tez wystepuje, ale tam .btn siedzi w .pas-cta__panel (jeden
   poziom glebiej), wiec bug NIE dotyczy tej strony - potwierdzone zywym
   getComputedStyle (transform po hover translateY(-2px) bez zadnej
   dodatkowej reguly, dokladnie jak przed odkryciem buga). Wszystkie 4
   dotkniete strony zweryfikowane Playwright (scroll do sekcji, realny hover
   myszka, getComputedStyle): transform po hover = "matrix(1, 0, 0, 1, 0, -2)"
   na kazdej, fade-in nadal dziala (opacity/transform osiadaja poprawnie po
   ok. 2s liczac delay+transition). Zero dodatkowych zmian CSS potrzebnych -
   selektor ponizej juz byl generyczny i pokrywal wszystkie 4 przypadki od
   momentu D65, audyt byl potwierdzeniem zywym renderem, nie nowa naprawa. */
.fade-in-grupa.is-visible > .btn:hover { transform: translateY(-2px); }

/* ==========================================================================
   F2, 14.09.2026: dropdown nawigacji, ikony konto/koszyk, mobile jasne.
   Dopisane na koncu pliku, wygrywa z regulami .site-header__nav/.site-header__mobile
   wyzej przy tej samej specyficznosci (kolejnosc w kaskadzie).
   ========================================================================== */

.site-header__nav-item { position: relative; display: inline-flex; align-items: center; }
.site-header__nav-item--dropdown:last-child .site-header__dropdown { left: auto; right: 0; }
.site-header__nav-trigger {
  display: inline-flex; align-items: center; gap: 5px;
  background: transparent; border: 0; cursor: pointer; padding: 0; margin: 0;
  font-family: var(--font-text);
  font-size: var(--fs-small); /* 14.09 D27: dopasowane do sasiedniego .site-header__nav a, ten sam token */
  font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  line-height: inherit; /* <button> nie dziedziczy line-height z UA-stylesheet (line-height:normal),
    przez co box byl 2px nizszy niz sasiedni <a> i center w .site-header__nav przesuwal
    caly trigger o 3px w dol wzgledem O Nas/Kontakt. Wymuszone dziedziczenie naprawia
    wysokosc pudelka, nie tylko wyglad tekstu. */
  color: var(--text-on-dark-muted);
  transition: color var(--dur) var(--ease);
}
.site-header__nav-chevron { flex: none; transition: transform var(--dur) var(--ease); }
.site-header__nav-item--dropdown.is-open .site-header__nav-chevron { transform: rotate(180deg); } /* 15.09.2026 (D44): .is-open z main.js, nie :hover/:has(), patrz .site-header__dropdown nizej */
.site-header__nav-trigger:hover,
.site-header__nav-item--dropdown.is-open .site-header__nav-trigger,
.site-header__nav-trigger:focus-visible { color: var(--text-on-dark); }
.site-header__nav-trigger:focus-visible { outline: 2px solid var(--gold); outline-offset: 4px; }

/* Szerokosc i pozycja zmierzone z paczka-projekt/zrodla/pdf-desktop/radzioch_menu_architektura(2).pdf,
   14.09.2026: kazdy dropdown to WLASNY box dopasowany do tresci (nie pelna
   szerokosc .container), lewa krawedz zaczyna sie mniej wiecej pod triggerem,
   nie wysrodkowany. Kolory (--surface-cream, --accent-deep) zmierzone 1:1
   z tego samego PDF, dokladnie zgodne z istniejacymi tokenami. */
.site-header__dropdown {
  position: absolute; top: calc(100% + var(--space-5)); left: 0;
  /* 15.09.2026 (D44), architektura finalna. Trzy kolejne proby czysto CSS-owe (:hover z
     roznymi "mostami" wypelniajacymi luke miedzy triggerem a panelem) padaly przy realnym,
     skosnym ruchu myszy - kazda geometrycznie poprawna wersja miala gdzies subtelna martwa
     strefe (pointer-events:none na LI dla fixu "puste tlo otwiera" plus przesuniety w czasie
     stan zamkniety/otwarty dropdownu tworzyly kombinacje, ktorych nie dawalo sie domknac samym
     CSS bez odtwarzania calego trojkata bezpieczenstwa jak w prawdziwych megamenu). Otwieranie
     / zamykanie NIE jest juz sterowane przez :hover w CSS, tylko przez klase .is-open dodawana
     w main.js z opoznieniem zamkniecia (hover-intent, 250ms) - standardowy wzorzec dla dokladnie
     tego problemu. CSS tu tylko definiuje WYGLAD otwartego/zamknietego stanu, JS decyduje KIEDY. */
  width: 360px; /* domyslnie waski (1 kolumna, 2 pozycje jak Sklep) */
  opacity: 0; visibility: hidden; pointer-events: auto; transform: translateY(-8px);
  transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease);
  box-shadow: 0 24px 54px rgba(12, 9, 11, 0.28);
}
.site-header.is-scrolled .site-header__dropdown { top: calc(100% + var(--space-3)); } /* naglowek scrolled ma padding-block var(--space-3), nie var(--space-5) */
.site-header__nav-item--dropdown.is-open .site-header__dropdown {
  /* 15.09.2026 (D44): .is-open zamiast :hover/:has(:focus-visible) - patrz main.js, funkcja
     dropdownHoverIntent. Historia problemu (po kolei, ten sam dzien): :hover samo lapalo cale
     rozciagniete LI (puste tlo); :focus-within lapalo klik mysza (przyklejony fokus);
     :has(:focus-visible) naprawilo oba, ale most miedzy triggerem a panelem (potrzebny bo LI ma
     pointer-events:none w pustych miejscach) padal przy realnym, skosnym ruchu myszy - kazda z
     trzech prob geometrycznego mostu (szerokosc triggera, szerokosc panelu, od polowy LI) miala
     gdzies edge case. Zamiast czwartej proby czysto CSS, JS (mouseenter/mouseleave z 250ms
     opoznieniem zamkniecia) - standardowy "hover intent" z prawdziwych megamenu, odporny na
     dowolna geometrie i predkosc ruchu, bo nie zalezy od pixel-perfect pokrycia. */
  opacity: 1; visibility: visible; transform: translateY(0);
}
.site-header__dropdown-inner {
  background: var(--surface-cream); color: var(--text-on-light);
  padding: var(--space-7) var(--space-7) var(--space-6); /* lewy padding zmierzony ~40px = --space-7 */
}
.site-header__dropdown--szeroki { width: 560px; } /* 2 kolumny, 4 pozycje jak Szkolenia */
.site-header__dropdown--kursy { width: 790px; } /* karta flagowa + kolumna wszystkie kursy. Bylo 640px, zmierzone blednie z rastra - poprawione 15.09.2026 pomiarem pikselowym 00-full-desktop.png (panel 520-2100px @2x = 790px), zgloszone przez Jakuba jako za waskie na zywo */
.site-header__dropdown-inner .eyebrow--dropdown {
  display: block; font-size: 11px; font-weight: 700; letter-spacing: 0.14em;
  color: var(--accent); margin-bottom: var(--space-3);
}
.site-header__dropdown-h2 { font-family: var(--font-display); font-size: 28px; color: var(--text-on-light); margin: 0 0 var(--space-5); }
.site-header__dropdown-hr { border: 0; border-top: 1px solid var(--line-on-light); margin: 0 0 var(--space-6); }

/* Grid generyczny (Szkolenia, Sklep): numer + tytul + strzalka, 1 albo 2 kolumny. */
.site-header__dropdown-grid { display: grid; grid-template-columns: 1fr; gap: 0; }
.site-header__dropdown-grid--dwie-kolumny { grid-template-columns: 1fr 1fr; column-gap: var(--space-8); }
.site-header__dropdown-link {
  display: flex; gap: var(--space-4); align-items: center;
  padding: var(--space-4) 0; border-top: 1px solid var(--line-on-light);
  color: var(--text-on-light);
}
.site-header__dropdown-grid .site-header__dropdown-link:first-child { border-top: 0; }
.site-header__dropdown-grid--dwie-kolumny .site-header__dropdown-link:nth-child(1),
.site-header__dropdown-grid--dwie-kolumny .site-header__dropdown-link:nth-child(2) { border-top: 0; }
.site-header__dropdown-link em {
  font-family: var(--font-display); font-style: italic; color: var(--accent); font-size: 17px; flex: none; width: 22px;
}
.site-header__dropdown-link > span { flex: 1; min-width: 0; }
.site-header__dropdown-link strong { display: block; font-size: 14px; font-weight: 700; color: var(--text-on-light); } /* 15.09.2026 (D44): brakowalo jawnego koloru, tytul dziedziczyl z <a> (ktory jest .site-header__nav a, jasny kolor na ciemne tlo headera) - na kremowym tle dropdownu Szkolenia/Sklep byl prawie niewidoczny w stanie spoczynku (hover mial jawny kolor osobno, wygladalo OK tylko pod kursorem) */
.site-header__dropdown-link small { display: block; font-size: 12px; color: var(--text-on-light-muted); margin-top: 2px; }
.site-header__dropdown-link svg { flex: none; color: var(--accent); transition: transform var(--dur) var(--ease); }
.site-header__dropdown-link:hover strong { color: var(--accent); }
.site-header__dropdown-link:hover svg { transform: translate(2px, -2px); }

/* Kursy: karta flagowa bordo + kolumna "wszystkie kursy". */
.site-header__dropdown-kursy { display: grid; grid-template-columns: 2.2fr 1fr; gap: var(--space-8); align-items: start; } /* 15.09.2026 (D44): bylo 1.4fr 1fr, zmierzone z makiety karta jest znacznie szersza wzgledem kolumny "wszystkie kursy" (454px:208px, nie 386px:276px) */
@media (max-width: 900px) { .site-header__dropdown-kursy { grid-template-columns: 1fr; } }
.site-header__dropdown .site-header__dropdown-flagship {
  /* 15.09.2026 (D44): selektor scope'owany o rodzica .site-header__dropdown (specyficznosc 0,2,0),
     zeby wygrac z .site-header__nav a (0,1,1) - ten drugi selektor lapie KAZDY <a> zagniezdzony
     w .site-header__nav, wliczajac linki WEWNATRZ otwartego dropdownu, bo dropdown fizycznie
     siedzi w markupie w tym samym <li>. Tu przypadkiem nieszkodliwe (--text-nav-link i
     --text-on-dark to oba jasne kolory na ciemnym tle karty), ale poprawiane dla porzadku -
     patrz nastepna regula (.site-header__dropdown-link-strong), tam TEN SAM bug byl realnie
     widoczny (jasny tekst na jasnym tle, zglosil Jakub: "zobacz pelna biblioteke" nieczytelne). */
  display: block; background: var(--accent-deep); color: var(--text-on-dark);
  padding: var(--space-5); /* 15.09.2026 (D44): bylo space-6 (32px). Karta w makiecie jest plaska/prostokatna
    (454x135), nie kwadratowa jak wychodzilo z 32px paddingu + oryginalnych odstepow - zmierzone
    pikselowo na 00-full-desktop.png (top/bottom pad ~28-29px, blizej space-5 niz space-6) */
  transition: background-color var(--dur) var(--ease);
}
.site-header__dropdown-flagship:hover { background: var(--accent-deep-hover); }
.site-header__dropdown-flagship .eyebrow--dropdown { color: var(--gold-light); margin-bottom: var(--space-2); } /* bylo space-4 (16px), zmierzony odstep eyebrow->tytul ~7.5px, blizej space-2 (8px) */
.site-header__dropdown-flagship-row { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); }
.site-header__dropdown-flagship-row strong { font-family: var(--font-display); font-size: 20px; font-weight: 400; white-space: nowrap; } /* 15.09.2026 (D44): bylo 26px - przy tym rozmiarze tytul "Beauty: Od zera do milionera" zawijal sie na 2 linie (83px wysokosci samego wiersza), stad karta wychodzila kwadratowa zamiast plaskiej jak w makiecie. Pomiar linii tytulu z 00-full-desktop.png dal wysokosc jednej linii ~31.5px, przy line-height~1.6x to font-size ~20px, nie 26px */
.site-header__dropdown-flagship-row svg { flex: none; color: var(--gold); }
.site-header__dropdown-flagship small { display: block; margin-top: var(--space-4); font-size: 12px; color: var(--text-on-dark-muted); }
.site-header__dropdown-wszystkie { padding-top: var(--space-2); }
.site-header__dropdown .site-header__dropdown-link-strong {
  /* 15.09.2026 (D44): scope'owane jak flagship wyzej. TU byl realny, widoczny bug -
     .site-header__nav a (specyficznosc 0,1,1) wygrywal z golym .site-header__dropdown-link-strong
     (0,1,0) mimo pozycji w pliku, bo specyficznosc bije kolejnosc w kaskadzie. Link renderowal
     sie kolorem --text-nav-link (jasny, rgba(255,253,248,.72)) zamiast --text-on-light (#332B2B)
     - jasny tekst na kremowym tle dropdownu, praktycznie nieczytelny. Zglosil Jakub na zywo
     ("zobacz pelna biblioteke" nieczytelne, w przeciwienstwie do makiety). */
  display: inline-flex; align-items: center; gap: var(--space-2);
  font-size: 14px; font-weight: 700; color: var(--text-on-light); margin: var(--space-1) 0 var(--space-3);
}
.site-header__dropdown-link-strong svg { color: var(--accent); }
.site-header__dropdown .site-header__dropdown-link-strong:hover { color: var(--accent); } /* 15.09.2026 (D44):
  scope'owane jak baza (linia 1122) - ten sam bug specyficznosci uderzal TEZ w hover: goly
  `.site-header__dropdown-link-strong:hover` (0,2,0) przegrywal z `.site-header__nav a:hover`
  (0,2,1, klasa+element+pseudoklasa), link na hover renderowal sie bialy (--text-on-dark)
  zamiast bordowy (--accent) - zglosil Jakub na zywo. */
.site-header__dropdown-wszystkie p { font-size: 13px; color: var(--text-on-light-muted); margin: 0; }

/* P2, 15.09.2026: header H-LD platformy (jdb_instalacja=platforma, header.php).
   Wrapper CTA "Szkolenia" + dropdown uzytkownika, sasiad .site-header__nav, chowany
   na tym samym breakpoincie co nav (ten sam wzorzec co .site-header__cta/.site-header__nav
   wyzej), zeby na mobile obie grupy przenosily sie do .site-header__mobile. */
.site-header__actions { display: flex; align-items: center; gap: var(--space-5); }
@media (max-width: 1024px) { .site-header__actions { display: none; } }
/* Awatar w .site-header__nav-trigger (dropdown uzytkownika H-LD), get_avatar() z WP. */
.site-header__nav-trigger-avatar { width: 28px; height: 28px; border-radius: 50%; object-fit: cover; flex: none; }

.site-header__icons { display: flex; align-items: center; gap: var(--space-4); }
.site-header__icon {
  /* wdroz-e8.4, 16.09.2026: 36px/svg 18px zgloszone przez Jakuba jako "malutkie
     nieczytelne" na zywym renderze. Podbite do 44px (cel dotykowy) / svg 22px,
     te same proporcje kontener:ikona (~0.5) jak wczesniej, tylko wieksza skala. */
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; color: var(--text-on-dark);
  transition: opacity var(--dur) var(--ease), transform 120ms var(--ease);
}
.site-header__icon svg { width: 22px; height: 22px; }
.site-header__icon:hover { opacity: .7; }
.site-header__icon:active { transform: scale(0.92); }
.site-header__icon:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
.site-header__icon-count {
  position: absolute; top: 2px; right: 2px;
  min-width: 16px; height: 16px; padding: 0 3px;
  background: var(--gold); color: var(--surface-dark);
  border-radius: 50%; font-size: 10px; font-weight: 700; line-height: 16px; text-align: center;
}
@media (max-width: 1024px) {
  /* D31 14.09: Jakub chce ikonki konto+koszyk WIDOCZNE na mobile, obok triggera MENU w
     prawym gornym rogu (swiadome odejscie od makiety 15-menu/00-full-mobile.png, ktora ich
     nie pokazuje - decyzja na zywo, nie z rastra, ten sam wzorzec co D27). Te same SVG i
     licznik co desktop (D25pkt4), zero nowych ikon. margin-left:auto zamiast zmiany
     justify-content na .site-header__inner: przy trzech widocznych dzieciach (logo/icons/
     toggle, nav i cta ukryte na tym breakpoincie) samo space-between rozstrzeliloby icons
     na srodek zamiast trzymac je przy togglu. */
  .site-header__icons { display: flex; margin-left: auto; }
}

/* ==========================================================================
   Koszyk, szuflada off-canvas (wdroz-e8.5, 16.09.2026)
   Wzorzec wizualny: Salon Magnolia (`template-parts/koszyk-szuflada.php`),
   mechanizm otwierania/zamykania (.is-open, aria-hidden, fokus) 1:1 z
   `.site-header__mobile` w tym samym motywie zamiast atrybutu `data-otwarte`
   uzytego u Magnolii, zeby dwa panele off-canvas tej strony dzielily jedna
   konwencje. Panel kanciasty (--radius-*: 0 w tym projekcie), ciemny jak
   header/mobile panel wczesniejszej wersji (--surface-dark).
   ========================================================================== */
.koszyk-szuflada {
  position: fixed; inset: 0; z-index: var(--z-modal);
  visibility: hidden;
  transition: visibility 0s linear var(--dur);
}
.koszyk-szuflada.is-open { visibility: visible; transition-delay: 0s; }
.koszyk-szuflada__tlo {
  position: absolute; inset: 0;
  background: rgba(12, 9, 11, .6);
  opacity: 0;
  transition: opacity var(--dur) var(--ease);
}
.koszyk-szuflada.is-open .koszyk-szuflada__tlo { opacity: 1; }
.koszyk-szuflada__panel {
  position: absolute; top: 0; right: 0; bottom: 0;
  width: min(420px, 100vw);
  background: var(--surface-dark);
  color: var(--text-on-dark);
  padding: var(--space-6) var(--space-5);
  transform: translateX(100%);
  transition: transform var(--dur) var(--ease);
  overflow-y: auto;
  display: flex; flex-direction: column;
}
.koszyk-szuflada.is-open .koszyk-szuflada__panel { transform: translateX(0); }
.koszyk-szuflada__naglowek {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: var(--space-5); flex: none;
}
.koszyk-szuflada__naglowek h2 {
  font-family: var(--font-display); font-size: var(--fs-h3, 24px); color: var(--text-on-dark); margin: 0;
}
.koszyk-szuflada__zamknij {
  display: inline-flex; align-items: center; justify-content: center;
  width: 36px; height: 36px;
  background: transparent; border: 1px solid var(--line-on-dark); color: var(--text-on-dark);
  cursor: pointer; transition: background var(--dur) var(--ease), color var(--dur) var(--ease);
}
.koszyk-szuflada__zamknij:hover { background: var(--text-on-dark); color: var(--surface-dark); }
.koszyk-szuflada__zamknij:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }

.koszyk-szuflada .widget_shopping_cart_content { flex: 1; display: flex; flex-direction: column; min-height: 0; }
.koszyk-szuflada .woocommerce-mini-cart { list-style: none; margin: 0 0 var(--space-5); padding: 0; }
.koszyk-szuflada .woocommerce-mini-cart-item {
  padding: var(--space-4) 0;
  border-bottom: 1px solid var(--line-on-dark);
  position: relative;
}
.koszyk-szuflada .woocommerce-mini-cart-item:first-child { padding-top: 0; }
.koszyk-szuflada .woocommerce-mini-cart-item img {
  width: 64px; height: 64px; object-fit: cover; flex: none;
  border: 1px solid var(--line-on-dark);
}
.koszyk-szuflada .woocommerce-mini-cart-item img.woocommerce-placeholder { display: none; }
.koszyk-szuflada .woocommerce-mini-cart-item:has(img.woocommerce-placeholder) .quantity { margin-left: 0; }
.koszyk-szuflada .woocommerce-mini-cart-item a {
  display: flex; align-items: flex-start; gap: 12px;
  color: var(--text-on-dark); text-decoration: none;
  font-family: var(--font-display); font-size: 17px;
  padding-right: 28px;
}
.koszyk-szuflada .woocommerce-mini-cart-item a:hover { color: var(--gold); }
.koszyk-szuflada .woocommerce-mini-cart-item .quantity {
  display: block; margin: 4px 0 0 76px; font-size: var(--fs-small); color: var(--text-on-dark-muted);
}
.koszyk-szuflada .remove_from_cart_button {
  position: absolute; top: var(--space-4); right: 0;
  color: var(--text-on-dark-muted); text-decoration: none; font-size: 20px; line-height: 1;
}
.koszyk-szuflada .remove_from_cart_button:hover { color: var(--gold); }
.koszyk-szuflada .woocommerce-mini-cart__total {
  margin: 0 0 var(--space-4); padding-top: var(--space-4);
  font-family: var(--font-display); font-size: 22px; color: var(--text-on-dark);
  display: flex; justify-content: space-between; flex: none;
}
.koszyk-szuflada .woocommerce-mini-cart__total strong { font-weight: 500; }
.koszyk-szuflada .woocommerce-mini-cart__buttons {
  display: flex; flex-direction: column; gap: 10px; margin: auto 0 0; flex: none;
  padding-top: var(--space-5); border-top: 1px solid var(--line-on-dark);
}
.koszyk-szuflada .woocommerce-mini-cart__buttons .button {
  display: block; text-align: center; text-decoration: none;
  padding: 14px 20px; font-family: var(--font-text); font-size: var(--fs-body);
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.koszyk-szuflada .woocommerce-mini-cart__buttons .button.wc-forward:not(.checkout) {
  background: transparent; color: var(--text-on-dark); border: 1px solid var(--line-on-dark);
}
.koszyk-szuflada .woocommerce-mini-cart__buttons .button.wc-forward:not(.checkout):hover {
  background: var(--text-on-dark); color: var(--surface-dark); border-color: var(--text-on-dark);
}
.koszyk-szuflada .woocommerce-mini-cart__buttons .button.checkout {
  background: var(--gold); color: var(--surface-dark); border: 1px solid var(--gold);
}
.koszyk-szuflada .woocommerce-mini-cart__buttons .button.checkout:hover {
  background: transparent; color: var(--gold); border-color: var(--gold);
}
.koszyk-szuflada__pusty-tekst,
.koszyk-szuflada .woocommerce-mini-cart__empty-message {
  color: var(--text-on-dark-muted); margin: 0 0 var(--space-5);
}

/* Toggle: ikona hamburgera + napis "Menu" (istniejace .site-header__toggle wyzej dostaje ikone) */
.site-header__toggle { display: none; gap: var(--space-2); }
@media (max-width: 1024px) {
  .site-header__toggle { display: inline-flex; align-items: center; }
  .site-header__toggle svg { flex: none; }
}

/* --- Mobile panel: jasne tlo (makieta 13.09), nie ciemne jak w F1/wczesniejszej wersji. --- */
.site-header__mobile {
  background: var(--surface-cream);
  padding: var(--space-5) var(--space-5) var(--space-7);
  overflow-y: auto;
}
.site-header__mobile-top { display: flex; justify-content: flex-end; }
.site-header__mobile-close {
  background: transparent; border: 1px solid var(--line-on-light); color: var(--text-on-light);
}
.site-header__mobile-close:hover { background: var(--line-on-light); }
/* D31 14.09, druga poprawka: .site-header__mobile-eyebrow i .site-header__mobile-h2
   (blok "01 NAWIGACJA" / "Wszystko pod reka.") usuniete z header.php razem z tymi regulami -
   Jakub: "AI slop", panel ma zaczynac sie od razu lista, bez wstepu marketingowego. */
/* D31 14.09, trzecia poprawka: border-top zdjety - byl separatorem miedzy usunietym
   juz intro a lista, po usunieciu intro wisial osierocony zaraz pod X. Pierwsza linia
   teraz dopiero miedzy Kursy i Szkolenia (border-bottom na .site-header__mobile-row). */
.site-header__mobile-nav { display: flex; flex-direction: column; }
.site-header__mobile-row,
.site-header__mobile-row-trigger {
  /* D29 14.09: trigger (button) nie mial tego resetu wczesniej, wiec renderowal sie
     natywnym wygladem przegladarki (obramowanie 2px outset, szare tlo, wysrodkowany
     tekst, width do tresci) zamiast plaskiego wiersza jak sasiedni <a>. Reset dzielony
     z .site-header__mobile-row, klasa "site-header__mobile-row" zdjeta z opakowujacego
     diva (header.php), zeby nie dublowac paddingu/obwodki na dwoch zagniezdzonych
     poziomach. */
  display: flex; align-items: flex-start; gap: var(--space-4);
  padding: var(--space-5) 0;
  color: var(--text-on-light); text-align: left; background: transparent; border: 0;
  width: 100%; cursor: pointer; font: inherit;
}
/* D31 14.09, czwarta poprawka (submenu mobile): border-bottom przeniesiony z triggera na
   .site-header__mobile-row (link bez dzieci) i .site-header__mobile-row--parent (caly
   wrapper akordeonu), NIE na sam trigger - inaczej przy otwartym stanie linia glownego
   separatora ladowala sie MIEDZY naglowkiem "KURSY" a submenu (bo trigger byl pierwszym
   dzieckiem wrappera), zamiast po calosci (naglowek + rozwiniete submenu). Teraz separator
   miedzy glownymi pozycjami zawsze siedzi na koncu calego akordeonowego bloku. */
.site-header__mobile-row,
.site-header__mobile-row--parent { border-bottom: 1px solid var(--line-on-light); }
.site-header__mobile-row em,
.site-header__mobile-row-trigger em { font-family: var(--font-display); font-style: italic; color: var(--accent); font-size: 18px; flex: none; width: 26px; }
.site-header__mobile-row strong,
.site-header__mobile-row-trigger strong { display: block; font-size: 16px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; }
.site-header__mobile-row small,
.site-header__mobile-row-trigger small { display: block; font-size: 12px; color: var(--text-on-light-muted); margin-top: 2px; }
.site-header__mobile-row .site-header__mobile-chevron,
.site-header__mobile-row-trigger .site-header__mobile-chevron { flex: none; margin-left: auto; margin-top: 4px; color: var(--text-on-light-muted); transition: transform var(--dur) var(--ease); }
.site-header__mobile-row-trigger:hover,
.site-header__mobile-row:hover { opacity: .8; }
.site-header__mobile-row-trigger:active,
.site-header__mobile-row:active { opacity: .6; }
.site-header__mobile-row-trigger:focus-visible,
.site-header__mobile-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.site-header__mobile-row-trigger[aria-expanded="true"] .site-header__mobile-chevron { transform: rotate(90deg); }
/* D31 14.09, czwarta poprawka: submenu mobile wygladalo na niedokonczony placeholder
   (Jakub, zrzut rozwinietego "01 KURSY") - szary wyszarzony tekst bez zadnego sygnalu ze
   to klikalne, plus przypadkowy "separator" (byl to w rzeczywistosci border-bottom triggera,
   patrz komentarz wyzej przy .site-header__mobile-row--parent). Przeniesiony charakter
   desktopowego dropdownu (D20/D21: linki z podpisem, strzalka, hover-przesuniecie) w
   uproszczonej formie: karta na --surface-paper (jedyny token do tego w tokens.css, ten sam
   uzywany przez .card-highlight gdzie indziej) z lewym akcentem --accent zamiast kolejnej
   poziomej linii - inny RODZAJ separatora niz miedzy glownymi pozycjami (01/02/03), nie tylko
   cienszy/jasniejszy wariant tej samej linii, wiec hierarchia jest jednoznaczna. */
.site-header__mobile-sub {
  display: none; flex-direction: column;
  margin: var(--space-2) 0 var(--space-4) 42px;
  padding: 0 var(--space-4);
  background: var(--surface-paper);
  border-left: 2px solid var(--accent);
}
.site-header__mobile-row--parent.is-open .site-header__mobile-sub { display: flex; }
.site-header__mobile-sub a {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
  padding: var(--space-3) 0;
  font-size: 13px; font-weight: 600; color: var(--text-on-light);
  transition: color var(--dur) var(--ease);
}
.site-header__mobile-sub a:not(:last-child) { border-bottom: 1px solid var(--line-on-light); }
.site-header__mobile-sub a svg { flex: none; color: var(--accent); transition: transform var(--dur) var(--ease); }
.site-header__mobile-sub a:hover,
.site-header__mobile-sub a:active { color: var(--accent); }
.site-header__mobile-sub a:hover svg { transform: translate(2px, -2px); }
.site-header__mobile-sub a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* D31 14.09, druga poprawka: .site-header__mobile-flagship (karta "KURS FLAGOWY"/"Beauty:
   Od zera do milionera"/"Kup dostep") usunieta z header.php razem z tymi regulami - ten sam
   powod co eyebrow/H2 wyzej, Jakub: "AI slop", panel konczy sie po liscie 01-05. */

/* D31 14.09: .site-header__mobile-icons (linki tekstowe "Moje konto"/"Koszyk" w panelu)
   usuniete z header.php razem z ta regula - konto+koszyk zyja teraz wylacznie jako ikonki
   w naglowku (.site-header__icons, widoczne na mobile). Regula zostawiona wykreslona w
   komentarzu historycznym celowo pominieta, martwy kod nie wraca. */

/* ==========================================================================
   PODSTRONA: KURSY (F4 partia A, 15.09.2026, page-briefs/kursy.md)
   Wszystkie trzy sekcje tej podstrony tutaj (nie w podstrony.css, ktory trzyma
   wylacznie stare podstrony T2/T5/T6 sprzed przebudowy D41 na RADZIOCH_DESIGN_SYSTEM.md).
   ========================================================================== */

/* --- S1: hero-tekstowy [komponent NOWY, wiki/komponenty/hero-tekstowy.md] - */
.hero-tekstowy { position: relative; padding-top: var(--space-9); padding-bottom: var(--space-7); overflow: hidden; }
.hero-tekstowy > .container { position: relative; }
.hero-tekstowy__inner { max-width: 800px; }
.hero-tekstowy h1 {
  /* RADZIOCH_DESIGN_SYSTEM.md sekcja 4: "H1 podstrony" jest mniejsza od --fs-display-1
     (hero home). Pierwszy H1 podstrony w calym projekcie, patrz tokens.css. */
  font-size: var(--fs-h1-podstrona);
  line-height: .96;
}
.hero-tekstowy h1 em { color: var(--accent-ctx); font-style: italic; } /* wzorzec #misja h2 em / .inne h2 em */
.hero-tekstowy__lead { margin-top: var(--space-5); max-width: 52ch; font-size: 18px; color: var(--text-on-light-muted); }
/* D54 15.09: zdobienie rogu (.hero-tekstowy__corner, kropka+dwie linie) usuniete z markupu
   i z CSS - Jakub: "usun ten element po prawej z kropka i liniami". */
/* korekta 16.09.2026 (D69): sekcja BEZPOSREDNIO po hero-tekstowy dostawala domyslny
   `section{padding-block:var(--space-section)}` (96-152px zaleznie od szerokosci) na
   gore, do tego hero-tekstowy ma wlasny padding-bottom 40px - razem az do ~192px
   pustki pod krotkim, dwuliniowym naglowkiem bez zdjecia (Jakub zywym okiem: kontakt
   i e-booki "ogromna pusta przestrzen"). Regula generyczna zamiast punktowej - dotyczy
   KAZDEJ strony z hero-tekstowy (kontakt, o-nas, sklep-e-booki, kursy), nie tylko tych
   dwoch zgloszonych, bo przyczyna jest wspolna dla calego komponentu. Trafia TYLKO
   w pierwsza sekcje po `.hero-tekstowy` (adjacent-sibling), nie we wszystkie nastepne -
   na `/kursy/` (3 karty pod hero) karty 2/3 dostaja padding-top z osobnej reguly nizej,
   patrz D72 - poprawka blednego zalozenia ze ta linia pokrywala caly komponent. */
.hero-tekstowy + section { padding-top: var(--space-7); }

/* --- S2: karta-kurs-flagowy [komponent NOWY, page-specific, wiki/komponenty/karta-kurs-flagowy.md] */
/* D54 15.09: odstep MIEDZY kartami zmniejszony z domyslnego --space-section (~115px).
   korekta 16.09.2026 (D72): D69 "odchudzil duplikat" zakladajac ze `.hero-tekstowy + section`
   (poprzedni wpis wyzej) pokrywa TEN SAM przypadek - bledne zalozenie, ten selektor trafia
   TYLKO w pierwsza sekcje po hero, wiec karta 2. i 3. STRACILY padding-top (spadly do
   domyslnych 115.2px), gap miedzy kartami wzrosl bez zmiany do 155px zamiast pozostac 80px.
   Jakub zywym okiem zlapal "odstepy boxow" na /kursy/, zgloszone jako regresja tej samej
   sesji. Naprawa: WLASNA regula na kazda karte (specyficznosc `section.karta-kurs-flagowy-sekcja`
   wyzsza niz generyczna z D69, wygrywa niezaleznie od kolejnosci), i przy okazji dalsze
   zwezenie na zyczenie Jakuba: --space-7 (40px) -> --space-6 (32px), gap miedzy kartami
   64px zamiast 80px. Ostatnia karta (przed stopka) zostaje przy domyslnym --space-section,
   to nie jest gap "miedzy kartami". */
section.karta-kurs-flagowy-sekcja { padding-top: var(--space-6); }
.karta-kurs-flagowy-sekcja:not(:last-of-type) { padding-bottom: var(--space-6); }
.karta-kurs-flagowy {
  position: relative;
  overflow: hidden;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.62fr);
  gap: var(--space-8);
  align-items: center;
  padding: var(--card-pad-featured);
  color: var(--text-on-dark);
  /* Gradient dokladnie wg RADZIOCH_DESIGN_SYSTEM.md sekcja 3 (jedyny dozwolony gradient),
     potwierdzony pomiarem pikselowym makiety: gorny-lewy rog i srodek-prawo obydwa daja
     ~(23,14,13) = --surface-dark-warm, brak czystego --surface-dark w probce. */
  background: linear-gradient(145deg, var(--surface-dark) 0%, var(--surface-dark-warm) 58%, var(--accent-deep) 100%);
}
.karta-kurs-flagowy::after {
  /* Monogram R w tle, ten sam wzorzec co .deko-r::after ale przypiety do samej karty,
     nie calej sekcji (sekcja jest on-light, tylko karta jest ciemna). */
  content: ""; position: absolute; z-index: 0; pointer-events: none;
  right: 0; top: 50%; transform: translateY(-50%);
  width: 420px; height: 480px; opacity: .07;
  background: url("../img/logo/monogram-ivory@2x.png") right -70px center / 480px 480px no-repeat;
}
.karta-kurs-flagowy__main, .karta-kurs-flagowy__side { position: relative; z-index: 1; }
.karta-kurs-flagowy__badge { font-size: 11px; font-weight: 700; letter-spacing: var(--ls-eyebrow); text-transform: uppercase; color: var(--gold); margin-bottom: var(--space-4); }
.karta-kurs-flagowy h2 em { color: var(--gold); font-style: italic; }
.karta-kurs-flagowy__lead { margin-top: var(--space-4); max-width: 42ch; color: var(--text-on-dark-muted); font-size: 17px; }
.karta-kurs-flagowy__cta { margin-top: var(--space-6); background: var(--gold); color: var(--surface-dark); border-color: var(--gold); }
.karta-kurs-flagowy__cta:hover { background: var(--gold-hover); border-color: var(--gold-hover); }
.karta-kurs-flagowy__side {
  background: var(--accent-deep);
  padding: var(--space-6) var(--space-6);
}
.karta-kurs-flagowy__side-eyebrow { font-size: 11px; font-weight: 700; letter-spacing: var(--ls-eyebrow); text-transform: uppercase; color: var(--gold-light); margin-bottom: var(--space-3); }
.karta-kurs-flagowy__side-title { font-size: 15px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--text-on-dark); margin-bottom: var(--space-3); }
.karta-kurs-flagowy__side-text { font-size: 14px; color: rgba(255, 253, 248, .72); }
@media (max-width: 900px) {
  .karta-kurs-flagowy { grid-template-columns: 1fr; padding: var(--card-pad-featured-mobile); gap: var(--space-6); }
  .karta-kurs-flagowy::after { width: 260px; height: 320px; opacity: .06; background-position: right -40px center; background-size: 300px 300px; }
}

/* --- S3/S4: karta-kurs-flagowy, wariant "program" [D51, 15.09.2026, wiki/komponenty/karta-kurs-flagowy.md]
   Zastepuje D49/D50 (siatka dwoch malych kart .biblioteka-kursy/.szkolenie-card, usunieta
   calkowicie). Jakub: "nie rozdzielajmy tak tego, zróbmy w tym samym układzie co szkolenie
   od zera do milionera, w tym samym układzie pod spodem" - S3/S4 to TEN SAM markup/layout
   co S2 (badge/H2/lead/CTA + karta boczna), ulozone pod S2, nie osobna siatka. Trzy roznice
   wobec flagowego: (1) badge = nazwa typu programu zamiast "Kurs flagowy"; (2) CTA .btn--outline
   zamiast .btn--solid, zloty wypelniony zostaje unikalny dla flagowego; (3) tlo karty to
   realna okladka kursu (custom property --program-cover, inline per karta) zamiast monogramu R. */
.karta-kurs-flagowy--program::after {
  /* Okladki (materialy/okladki-ebookow/okladka-szkolenie-*.png) sa PIONOWY plakat/zdjecie
     z tekstem (~1122x1402 i 1145x1374px, ~0.8 proporcji) - inne proporcje niz kwadratowy
     monogram (480x480) ktory ta regula nadpisuje. Zero ryzyka bugu D50 (tam <img
     aspect-ratio:4/5> w gridzie wymuszal wysokosc karty ~980px) - to CSS tlo na ::after,
     position:absolute, nie wplywa w ogole na wysokosc/box karty. background-size:contain
     gwarantuje caly plakat widoczny bez obciecia niezaleznie od proporcji pudelka.

     Pierwsza proba: plaska opacity .28 na calym obrazku - odrzucona po zywym renderze,
     zdjecie (jasna bluzka, kontrastowe kolory) zostawalo zaskakujaco jasne i "plywalo"
     rozlaczone od reszty karty, bez polaczenia z ciemnym tlem. Naprawione: gradient-maska
     (pierwsza warstwa, nieprzezroczysta liniowo w --accent-deep od lewej) nad zdjeciem
     (druga warstwa) - zdjecie wtapia sie w tlo karty od lewej krawedzi zamiast twardej
     krawedzi, opacity calosci obnizone do .82 (mobile .55) dla spokojniejszego kontrastu
     z tekstem karty bocznej. */
  width: 440px; height: 480px; opacity: .82;
  background:
    linear-gradient(to left, transparent 30%, var(--accent-deep) 90%),
    var(--program-cover) right center / contain no-repeat;
}
.karta-kurs-flagowy--program .karta-kurs-flagowy__cta {
  /* Roznica 2: obrysowane, nie zlote. Nadpisuje regule .karta-kurs-flagowy__cta (zlota,
     wyzej) wieksza specyficznoscia (2 klasy), niezaleznie czy markup nosi .btn--solid
     czy .btn--outline. Pelna inwersja na hover, ten sam wzorzec co D44 (.btn--outline:hover
     sitewide) - tu jawnie na tokenach on-dark, bo karta ma wlasny hardkodowany ciemny
     kontekst (nie .on-dark), patrz Uwagi w wiki/komponenty/karta-kurs-flagowy.md. */
  background: transparent;
  color: var(--text-on-dark);
  border-color: var(--text-on-dark);
}
.karta-kurs-flagowy--program .karta-kurs-flagowy__cta:hover {
  background: var(--text-on-dark);
  color: var(--surface-dark);
  border-color: var(--text-on-dark);
}
@media (max-width: 900px) {
  .karta-kurs-flagowy--program::after { width: 240px; height: 280px; opacity: .55; }
}

/* ==========================================================================
   PODSTRONA: SZKOLENIE INSTRUKTORSKIE (D55, 15.09.2026)
   Refaktor pelnego rygoru RADZIOCH_DESIGN_SYSTEM.md nad v1 (10.09, bez
   design systemu). S1 hero-glowny wariant "landing" (wiki/komponenty/
   hero-glowny.md), S2 siatka-numerowana [NOWY], S3 karty-grid-uniwersalny
   wariant on-dark/strzalka (wiki/komponenty/karty-grid-uniwersalny.md),
   S4 pas-cta [NOWY]. Stare klasy v1 (.podstrona-hero, .moduly-grid,
   .modul-item, .card-highlight na tej podstronie) nieuzywane od tej wersji,
   zostaja w podstrony.css jako martwy kod - inne strony go moga jeszcze
   uzywac, nie kasowane bez sprawdzenia (poza zakresem tego refaktoru). */

/* --- S1: hero, wariant "landing" ----------------------------------------
   Reuzywa .hero/.hero__grid/.hero__photo z home (identyczny szkielet gridu
   55/45, maska luku, karta na zdjeciu), trzy roznice: (1) H1 mniejszy, nowy
   token --fs-h1-hero-landing (D55, pomiar wektorowy ponizej w tokens.css) -
   ani --fs-display-1 (home, 118px, za duzy) ani --fs-h1-podstrona (kursy,
   48px, za maly, to inny typ hero); (2) jedno CTA obrysowane zamiast dwoch,
   brak pasa statystyk - meta tekst w .hero__note; (3) badge bordo na zdjeciu
   (.hero__photo-badge) zamiast kremowej karty .hero__photo-card, wlasny
   watermark "INSTRUCTOR" zamiast dziedziczonego "BEAUTY" (ktory jest
   hardkodowany do geometrii hero home, D41, wiec .hero--landing::before
   jest jawnie wylaczony). */
.hero--landing { padding-bottom: var(--space-11); }
.hero--landing::before { display: none; }
.hero--landing h1 { font-size: var(--fs-h1-hero-landing); line-height: var(--lh-display); }

.hero-instruktorskie__watermark {
  /* Ten sam wzorzec co .platforma__watermark/.social-sekcja__watermark (D41 sekcja 06/07):
     literalny tekst "INSTRUCTOR" (nie SVG - makieta nie dostarcza gotowego assetu tego
     slowa, w przeciwienstwie do BEAUTY na home ktore mialo wlasny plik beauty-outline.svg),
     transparent fill + text-stroke bardzo niskiej nieprzezroczystosci. Pomiar wektorowy
     makiety (radzioch_szkolenie_instruktorskie_online.pdf): napis siega od lewej krawedzi
     hero po prawie polowe szerokosci, uciety dolna krawedzia sekcji, czesciowo pod zdjeciem
     (ten sam wzorzec "bleed" co BEAUTY na home, D41). */
  position: absolute; z-index: 0; pointer-events: none; user-select: none;
  left: -6px; bottom: -36px;
  font-family: var(--font-display); font-weight: 400; line-height: 1;
  font-size: min(230px, 19vw);
  letter-spacing: 0.01em;
  color: transparent;
  -webkit-text-stroke: 1px rgba(255, 253, 248, 0.06);
  text-stroke: 1px rgba(255, 253, 248, 0.06);
  white-space: nowrap;
}
@media (max-width: 1024px) { .hero-instruktorskie__watermark { display: none; } }

/* D55 15.09 dopisek: .hero__corner-mark (bracket+kropka, prawy gorny rog hero)
   usuniety z markupu i CSS - Jakub na zywym renderze, ten sam wzorzec co
   .hero-tekstowy__corner usuniety z /kursy/ w D54 tego samego dnia. */

.hero__photo-badge {
  /* Rozjazd wobec page-brief zgloszony w decyzje.md D55: brief opisuje "nachodzi na
     dolny LEWY rog zdjecia", pomiar wektorowy makiety pokazuje jednoznacznie prawy
     dolny rog (badge x:1118-1340 na kanonie 1440, maska konczy sie ~1300 - badge
     wystaje POZA prawa krawedz zdjecia, nie nachodzi z lewej). Poszlismy za makieta
     (dowod pikselowy), nie za opisem slownym briefu - ten sam precedens co cena
     5000 vs 1000 zl (page-brief, Dane twarde). */
  position: absolute; z-index: 2;
  right: -24px; bottom: 56px;
  max-width: 264px;
  padding: var(--space-6);
  background: var(--accent-deep);
  box-shadow: var(--shadow-karta);
}
.hero__photo-badge em {
  display: block; font-family: var(--font-display); font-style: italic;
  font-size: 32px; line-height: 1; color: var(--text-on-dark); margin-bottom: var(--space-3);
}
.hero__photo-badge span {
  display: block; font-size: 11px; font-weight: 700; letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase; color: var(--gold-light);
}
@media (max-width: 1024px) {
  /* Rozjazd zgloszony w decyzje.md D55: makieta mobilna NIE pokazuje badge'a wcale
     (sprawdzone, zero sladu na radzioch_szkolenie_instruktorskie_online_mobile.pdf).
     Poszlismy za page-briefem/copy (badge ma zostac widoczny, "naklada sie na dolny
     rog zdjecia" - copy niesie tresc badge'a jako fakt, nie ozdobnik do pominiecia),
     ten sam wzorzec co panel DOSTEP ONLINE na karcie kursu flagowego (PRZEKAZANIE.md,
     "otwarte z tej sesji"). Pozycja: dolny prawy rog zdjecia, bez ujemnego right zeby
     nie wychodzil poza viewport na waskich ekranach. */
  .hero__photo-badge { right: 0; bottom: -20px; max-width: 220px; padding: var(--space-5); }
}

/* --- S2: siatka-numerowana [NOWY, wiki/komponenty/siatka-numerowana.md] - */
.siatka-numerowana {
  display: grid; grid-template-columns: 1fr 1fr;
  column-gap: var(--space-11); row-gap: var(--space-8);
  margin-top: var(--space-9);
}
.siatka-numerowana__item { display: flex; align-items: baseline; gap: var(--space-5); padding-bottom: var(--space-5); border-bottom: 1px solid var(--line-ctx); }
.siatka-numerowana__num { flex: none; width: 30px; font-family: var(--font-display); font-style: italic; font-size: 22px; color: var(--accent-ctx); }
.siatka-numerowana__label { font-size: 13px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; }
.siatka-numerowana__domkniecie { margin-top: var(--space-8); max-width: 58ch; color: var(--fg-muted); }
@media (max-width: 767px) {
  .siatka-numerowana { grid-template-columns: 1fr; row-gap: var(--space-6); margin-top: var(--space-7); }
  .siatka-numerowana__domkniecie { margin-top: var(--space-7); }
}

/* --- S3: karty-grid-uniwersalny, wariant on-dark
   (wiki/komponenty/karty-grid-uniwersalny.md - koncepcja z Magnolii, tu
   nazwy klas remapowane na slownik tokenow projektu, karty PLASKIE bez tla/
   ramki zgodnie z makieta, ktora nie pokazuje zadnej obwodki wokol kart).
   Strzalka dekoracyjna (.karty-instruktorskie__arrow) usunieta 15.09.2026:
   Jakub na zywym renderze - karty nie linkuja nigdzie, strzalka sugerowala
   klikalnosc ktorej nie ma. padding-right na .item usuniety razem z nia,
   trzymal miejsce pod strzalke pozycjonowana absolute. */
.karty-instruktorskie { display: grid; grid-template-columns: 1fr 1fr; column-gap: var(--space-11); row-gap: var(--space-9); margin-top: var(--space-9); position: relative; z-index: 1; }
.karty-instruktorskie__item { position: relative; }
.karty-instruktorskie__num { display: block; font-family: var(--font-display); font-style: italic; font-size: 26px; color: var(--gold); margin-bottom: var(--space-3); }
.karty-instruktorskie__title { font-size: 14px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: var(--space-2); }
.karty-instruktorskie__desc { font-size: 14px; color: var(--fg-muted); }
.karty-instruktorskie__divider { position: relative; z-index: 1; margin-top: var(--space-9); padding-top: var(--space-7); border-top: 1px solid var(--line-ctx); display: flex; flex-wrap: wrap; gap: var(--space-5); align-items: baseline; }
.karty-instruktorskie__divider-label { font-size: 11px; font-weight: 700; letter-spacing: var(--ls-eyebrow); text-transform: uppercase; color: var(--gold); flex: none; }
.karty-instruktorskie__divider-list { font-size: 13px; color: var(--fg-muted); }
@media (max-width: 767px) {
  .karty-instruktorskie { grid-template-columns: 1fr; row-gap: var(--space-7); margin-top: var(--space-7); }
}
#program-instruktorskie { position: relative; overflow: hidden; }
#program-instruktorskie::after {
  /* background-rings.svg (by-view/szkolenie-instruktorskie), 3 okregi wine, widoczne
     w makiecie w prawym dolnym rogu sekcji, czesciowo poza krawedzia. */
  content: ""; position: absolute; z-index: 0; pointer-events: none;
  right: -140px; bottom: -180px; width: 640px; height: 640px;
  background: url("../img/dekoracje/background-rings-wine.svg") center / contain no-repeat;
}
@media (max-width: 767px) {
  #program-instruktorskie::after { width: 380px; height: 380px; right: -100px; bottom: -100px; }
}

/* --- S4: pas-cta [NOWY, wiki/komponenty/pas-cta.md], wariant z cena ----- */
/* D58 15.09.2026: selektor zawezony z ".pas-cta" na ".pas-cta.on-light" -
   szkolenie-instruktorskie mial ZAWSZE klase "on-light" obok "pas-cta" na tej
   samej sekcji, wiec zero zmiany zachowania tam. Zawezenie otwiera miejsce na
   wariant on-wine (szkolenia-stacjonarne S3, nizej), ktory ma dziedziczyc tlo
   z kontekstu .on-wine (--accent-deep), nie z tego hardkodu. */
.pas-cta.on-light { background: var(--surface-paper); }
#cennik-instruktorskie h2 em { color: var(--accent-ctx); } /* wzorzec #misja/.inne h2 em: kursywa druga linia w akcencie kontekstu (wine na on-light) */
.pas-cta__inner { display: grid; grid-template-columns: 1.55fr 1fr; gap: var(--space-11); align-items: center; }
.pas-cta__lead { margin-top: var(--space-5); max-width: 52ch; color: var(--text-on-light-muted); }
.pas-cta__panel { background: var(--surface-white); border: 1px solid var(--line-on-light); padding: var(--card-pad); }
.pas-cta__label { font-size: 11px; font-weight: 700; letter-spacing: var(--ls-eyebrow); text-transform: uppercase; color: var(--text-on-light-muted); margin-bottom: var(--space-5); }
.pas-cta__panel .pakiet__price { border: 0; padding-bottom: 0; margin-bottom: 0; } /* reuzycie .pakiet__price (cena), bez dividera pakietu - tu cena stoi sama */
.pas-cta__cta { margin-top: var(--space-6); width: 100%; }
@media (max-width: 900px) {
  .pas-cta__inner { grid-template-columns: 1fr; }
  .pas-cta__panel { margin-top: var(--space-2); }
}

/* ==========================================================================
   PODSTRONA: SZKOLENIA STACJONARNE (D58, 15.09.2026)
   Refaktor pelnego rygoru RADZIOCH_DESIGN_SYSTEM.md nad v1 (10.09, bez
   design systemu). S1 hero-glowny, PIERWSZE uzycie wariantu "on-light" w
   projekcie (do tej pory hero-glowny istnial tylko na on-dark - home,
   szkolenie-instruktorskie). S2 karty-grid-uniwersalny, NOWY wariant "karty
   bordowane, klikalne" (wiki/komponenty/karty-grid-uniwersalny.md). S3
   pas-cta, NOWY wariant "on-wine, lista punktow zamiast panelu ceny"
   (wiki/komponenty/pas-cta.md). Stare klasy v1 (.podstrona-hero,
   .szkolenie-blok, .cena-karta) nieuzywane od tej wersji, zostaja w
   podstrony.css jako martwy kod, nie kasowane bez sprawdzenia. */

/* --- S1: hero, wariant "on-light" [NOWY] --------------------------------
   .hero bazowe (wyzej) hardkoduje tlo/kolor do tokenow ciemnych (--surface-dark,
   --text-on-dark, --gold) niezaleznie od klasy .on-dark/.on-light na sekcji -
   dziala tak od D41 (home), bo do dzis KAZDY hero-glowny (home, landing
   szkolenie-instruktorskie) byl na ciemnym tle. Ta podstrona jest pierwszym
   przypadkiem hero-glowny na jasnym tle, wiec ".hero--on-light" nadpisuje
   punktowo wszystko, co baza hardkodowala do ciemnego kontekstu, zamiast
   polegac na dziedziczeniu z .on-light (ktore samo .hero i tak by nadpisalo).
   Pomiar wektorowy (radzioch_szkolenia_stacjonarne.pdf, kanon 1440 = natywny/2):
   tlo S1 zmierzone pikselowo = rgb(234,227,218) = --surface-paper, NIE
   --surface-cream jak S2 (page-brief pisal "S2 cieplejszy niz S1" - pomiar
   pokazuje odwrotnie, S1/paper jest tym ciezszym/cieplejszym odcieniem, S2/
   cream jest jasniejszy - ten sam wzorzec "pomiar wygrywa nad opisem" co D55
   tlo S4 szkolenia-instruktorskiego). */
.hero--on-light {
  background: var(--surface-paper);
  color: var(--text-on-light);
}
.hero--on-light .hero__kicker { color: var(--accent-ctx); } /* baza: hardkodowany --gold, tu bordo (zmierzone) */
.hero--on-light h1 { color: var(--text-on-light); }
.hero--on-light .hero__lead { color: var(--fg-muted); }
/* .hero--landing::before juz wylacza dziedziczony watermark BEAUTY (regula wyzej,
   D55) - .hero--on-light nie musi tego powtarzac. */

.hero__subtitle {
  /* NOWY element, nie istnial w wariancie on-dark (home/instruktorskie maja
     tylko H1+lead, bez osobnej linii podtytulu). Pomiar wektorowy: cap-height
     litery "P" w "Pewnosc" = 22px na kanonie 1440, wspolczynnik cap-height/
     font-size Bodoni Moda wloski 0.745-0.77 (zakres D52/D55) -> font-size
     celu ~29px, w granicy bledu pomiaru tokenu --fs-display-3 (30px na 1440,
     uzywanego juz sitewide do podobnej roli - h3, .sciezka h3, .pas-cta__h2) -
     reuzyty zamiast nowego tokenu dla pojedynczego elementu jednej podstrony. */
  margin-top: var(--space-4);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-display-3);
  line-height: var(--lh-display);
  color: var(--accent-ctx);
}

.hero-stacjonarne__watermark {
  /* Ten sam wzorzec co .hero-instruktorskie__watermark (D55): literalny tekst
     "PRACTICE" (nie SVG, brak assetu gotowego tego slowa w paczce), transparent
     fill + text-stroke bardzo niskiej nieprzezroczystosci, bleed z lewej
     krawedzi hero, czesciowo pod przyciskiem CTA. Pomiar wektorowy makiety
     potwierdza obecnosc napisu (pasek deviacji ~13/765 ponad tlem, y ok. 640-
     732 na kanonie 1440, widoczny fragment miedzy dolem przycisku i goralnym S2)
     - dokladny font-size niepewny, bo napis bleeduje pod przycisk i pod fold
     sekcji (ten sam efekt "wiekszosc slowa schowana" co INSTRUCTOR/BEAUTY),
     wiec dobrany wizualnie do tej samej rodziny co D55, nie wyliczony
     odwrotnie z cap-height jak reszta tej sekcji. Kolor bordo (nie zloty jak
     INSTRUCTOR) - ten kontekst jest on-light, zloty na kremowym tle byłby
     prawie niewidoczny, bordo na wlasnym tle-papier daje ten sam bardzo
     subtelny efekt co INSTRUCTOR na ciemnym. */
  position: absolute; z-index: 0; pointer-events: none; user-select: none;
  left: -6px; bottom: -8px;
  font-family: var(--font-display); font-weight: 400; line-height: 1;
  font-size: min(200px, 17vw);
  letter-spacing: 0.01em;
  color: transparent;
  -webkit-text-stroke: 1px rgba(112, 41, 59, 0.08);
  text-stroke: 1px rgba(112, 41, 59, 0.08);
  white-space: nowrap;
}
@media (max-width: 1024px) { .hero-stacjonarne__watermark { display: none; } }

.hero--on-light .hero__photo-mask {
  /* Pomiar wektorowy: bbox zdjecia w luku na makiecie = 551x551px na kanonie
     1440 (peak luku y=165, dol y=716, lewa x=790, prawa x=1341) - praktycznie
     1:1, wyraznie kwadratowsze niz aspect-ratio:4/5 uzywane przez baze (home/
     instruktorskie). Jedyny plik maski w paczce to hero-photo-mask.svg
     (viewBox 800x1000, natywnie 4:5) - nie ma osobnego, "kwadratowego" assetu,
     wiec reuzywamy ten sam plik z boxem 1:1 (kontener/maska renderuja sie
     szerzej wzgledem wysokosci niz na innych podstronach; krzywa luku sama
     w sobie moze nieznacznie odbiegac od precyzyjnej krzywej makiety - swiadomy
     kompromis, nie fabrykowany nowy SVG). */
  aspect-ratio: 1 / 1;
}

.hero-stacjonarne__cta {
  /* Makieta: przycisk "Sprawdz terminy" jest WYPELNIONY bordo (rgb(73,25,35) =
     --accent-deep, pomiar pikselowy dokladny), nie obrysowany jak opisuje
     page-brief slownie - pomiar wygrywa nad opisem (ten sam wzorzec co reszta
     tej sesji, D55/D57). --accent-ctx-hover bazowe on-light = --accent-hover,
     ktore JEST rownowazne --accent-deep (ten sam hex) - bez wlasnego nadpisania
     hover wygladalby identycznie jak spoczynek, zero widocznej zmiany (regula
     "Kontrast na hover", budowa-strony.md). Nadpisane na --accent-deep-hover,
     odcien o jeden stopien ciemniejszy, ten sam mechanizm co .sciezka__cta. */
  --btn-solid-bg: var(--accent-deep);
  --btn-solid-fg: var(--text-on-dark);
  --accent-ctx-hover: var(--accent-deep-hover);
}

@media (max-width: 1024px) {
  /* Pomiar wektorowy makiety mobile (radzioch_szkolenia_stacjonarne_mobile.pdf,
     natywny raster 1080px = kanon mobile 1:1): zdjecie mierzy 936x672px, ratio
     ~1.39 (SZEROKIE, nie portret) - inny ksztalt niz desktop (~1:1) i inny niz
     domyslne 4:5 komponentu. Uzyty najblizszy czysty ulamek (4:3=1.33, ~4%
     odchylenia od pomiaru) zamiast fabrykowac niestandardowa wartosc dla
     jednego zdjecia. */
  .hero--on-light .hero__photo-mask { aspect-ratio: 4 / 3; }
}

/* --- S2: karty-grid-uniwersalny, wariant "karty bordowane, klikalne" [NOWY]
   Rozni sie od wariantu on-dark/strzalka szkolenia-instruktorskiego (D55):
   tu karty MAJA tlo/ramke/cien (bialy .rbt-card, makieta pokazuje wyraznie
   obwiedzione biale karty na tle --surface-cream), SA linkiem (<a>, klik
   przewija/prowadzi dalej - page-brief "CTA poboczne: klik w kartę"), wiec
   strzalka TU jest uzasadniona (element realnie klikalny, w odroznieniu od
   instruktorskiego gdzie karty donikad nie prowadzily i strzalka zostala
   usunieta jako myslaca dekoracja - lekcja z tamtego wariantu zastosowana
   odwrotnie: strzalka wraca, bo tu klikalnosc jest prawdziwa). CTA docelowe
   nieustalone w F5 (Woo szkolen jeszcze nie istnieje) - "#" + data-cel
   placeholder, ten sam wzorzec co D56 (karta Efekty niestandardowe /kursy/). */
.karty-stacjonarne {
  display: grid; grid-template-columns: 1fr 1fr;
  column-gap: var(--space-9); row-gap: var(--card-gap);
  margin-top: var(--space-9);
}
.karty-stacjonarne__item {
  display: block;
  background: var(--surface-white);
  border: 1px solid var(--line-on-light);
  padding: var(--card-pad);
  color: inherit;
  transition: box-shadow var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.karty-stacjonarne__item:hover { box-shadow: var(--shadow-karta); transform: translateY(-2px); }
.karty-stacjonarne__item:focus-visible { outline: 2px solid var(--accent-ctx); outline-offset: 4px; }
.karty-stacjonarne__head { display: flex; align-items: baseline; gap: var(--space-4); margin-bottom: var(--space-5); }
.karty-stacjonarne__num { font-family: var(--font-display); font-style: italic; font-size: 22px; color: var(--accent-ctx); }
.karty-stacjonarne__label { font-size: 12px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--accent-ctx); }
.karty-stacjonarne__title { font-size: var(--fs-display-3); margin-bottom: var(--space-4); } /* pomiar: cap-height "S" = 20px/1440 -> ~26.5px cel, w tolerancji tokenu 30px, reuzyty */
.karty-stacjonarne__desc { font-size: 14px; color: var(--fg-muted); max-width: 38ch; }
.karty-stacjonarne__footer {
  margin-top: var(--space-6); padding-top: var(--space-5);
  border-top: 1px solid var(--line-on-light);
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-4);
}
.karty-stacjonarne__meta { font-size: 11px; font-weight: 700; letter-spacing: var(--ls-eyebrow); text-transform: uppercase; color: var(--text-on-light-muted); }
.karty-stacjonarne__arrow {
  flex: none; width: 16px; height: 16px;
  background: var(--accent-ctx);
  -webkit-mask: url("../img/ikony/arrow-up-right.svg") center / contain no-repeat;
  mask: url("../img/ikony/arrow-up-right.svg") center / contain no-repeat;
  transition: transform var(--dur-fast) var(--ease);
}
.karty-stacjonarne__item:hover .karty-stacjonarne__arrow { transform: translate(3px, -3px); }
@media (max-width: 767px) {
  .karty-stacjonarne { grid-template-columns: 1fr; row-gap: var(--space-6); margin-top: var(--space-7); }
}

/* --- S3: pas-cta, wariant "on-wine, lista punktow" [NOWY] ---------------
   Layout 3 bloki (tekst+H2 / lista / CTA) rozstawione z duzymi, elastycznymi
   odstepami (pomiar makiety: bloki zajmuja razem ok. 62% szerokosci kontenera,
   reszta to dwie przerwy) - flex zamiast sztywnego grid z ulamkami, bo
   proporcje w makiecie NIE sa rownym podzialem kolumn tylko trzema blokami
   naturalnej szerokosci rozsunietymi odstepem. Tlo dziedziczone z .on-wine
   (--accent-deep, pomiar pikselowy: rgb(73,25,35), dokladne trafienie) -
   patrz zawezenie selektora ".pas-cta.on-light" wyzej w pliku. */
.pas-cta--list .pas-cta__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-9);
}
.pas-cta--list .pas-cta__copy { max-width: 46ch; }
/* Kursywa H2 tego pasa jest blush (--blush), NIE zloty accent-ctx jak reszta
   sitewide-wzorca "#sekcja h2 em" (#misja/.inne/#cennik-instruktorskie) -
   pomiar pikselowy koloru na makiecie odbiega wyraznie od zlota (rgb zmierzony
   wyraznie rozowy/blush, nie champagne), zgloszone jako swiadome odstepstwo,
   nie przeoczenie wzorca. */
#w-cenie-spotkania h2 em { color: var(--blush); }
.pas-cta__list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: var(--space-4);
  flex: none;
}
.pas-cta__list li {
  font-size: 12px; font-weight: 700; letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase; color: var(--fg);
}
.pas-cta--list .pas-cta__cta { margin-top: 0; width: auto; flex: none; }
@media (max-width: 900px) {
  .pas-cta--list .pas-cta__inner { flex-direction: column; align-items: stretch; }
  .pas-cta--list .pas-cta__copy { max-width: none; }
  .pas-cta--list .pas-cta__cta { width: 100%; }
}

/* ==========================================================================
   PODSTRONA: SKLEP, E-BOOKI (D59, 16.09.2026)
   Ostatnia podstrona F4 partii A. Zero refaktoru v1: `template-sklep-e-booki.php`
   nie istnial przed ta sesja (jedynie martwy szkielet `.produkty-grid`/
   `.produkt-karta` w podstrony.css z ery przed RADZIOCH_DESIGN_SYSTEM.md,
   nieuzyty tutaj, zostaje NIETKNIETY jako martwy kod na wypadek gdyby inna
   podstrona po niego siegala). S1 hero-tekstowy bez zmian (dziedziczy fix
   H1 z D52). S2 karty-produktowe/karta-produktu, NOWY komponent (karty-grid-
   uniwersalny.md), dane wprost z wc_get_products()/WC_Product (D16pkt8: cena
   zyje w Woo, nie ACF). S3 pas-cta, NOWY wariant "on-wine, prosty" (pas-cta.md).
   Pomiar wektorowy PNG@2x (paczka-projekt/07-ebooki/00-full-desktop.png,
   natywny 2880px = kanon 1440px dokladny 2x-downsample): kontener 3 kart
   137-939/1039-1841/1941-2743 native -> szerokosc karty ~401px/1440, gap
   ~50px/1440 (najblizszy token --space-8=48px, w tolerancji), okladka
   inset ~51.5px z kazdej strony karty (w tolerancji --card-pad=40px, reuzyty
   zamiast nowej wartosci), aspect-ratio okladki ~1.1:1 (598x542 native).
   Cena+CTA w jednym rzedzie (nie CTA pod cena jak martwy kod v1 zakladal),
   CTA NIE pelnej szerokosci. Kolor CTA zmierzony piksel: rgb(73,25,35) =
   dokladnie --accent-deep (NIE --accent jak domyslny .btn--solid on-light,
   ktory jest --surface-dark) - wymaga lokalnego nadpisania, ten sam wzorzec
   co .hero-stacjonarne__cta (D58): --accent-hover na on-light rowna sie
   --accent-deep (ten sam hex), wiec hover bez wlasnego nadpisania bylby
   niewidoczny (regula "Kontrast na hover", budowa-strony.md) - nadpisany na
   --accent-deep-hover. */
.karty-produktowe {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: var(--space-8);
  margin-top: var(--space-9);
}
.karta-produktu {
  background: var(--surface-white);
  border: 1px solid var(--line-on-light);
  padding: var(--card-pad);
  display: flex; flex-direction: column;
  min-width: 0; /* BUG realny, zlapany pomiarem (nie "wyglada ok"): item gridowy 1fr ma
    domyslne minimum auto = min-content potomkow, tytul "Zostan profesjonalistka w
    przedluzaniu rzes 2.0" (najdluzszy z trzech) forsowal kolumne szerzej niz pozostale
    dwie (399/412/401px zamiast rownych 1fr) i przelewal .karty-produktowe poza kontener
    (scrollWidth>clientWidth, tez na 390 pojedynczej kolumnie) - klasyczna pulapka CSS
    Grid 1fr, ten sam mechanizm co inne projekty w lekcje-techniczne.md. */
}
.karta-produktu__cover { aspect-ratio: 11 / 10; overflow: hidden; }
.karta-produktu__cover img { width: 100%; height: 100%; object-fit: cover; }
.karta-produktu__title {
  margin-top: var(--space-6);
  font-size: var(--fs-display-3);
  font-style: normal;
}
.karta-produktu__footer {
  margin-top: auto;
  padding-top: var(--space-6);
  border-top: 1px solid var(--line-on-light);
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-4);
}
.karta-produktu__price { display: flex; flex-direction: column; gap: 2px; font-family: var(--font-display); }
.karta-produktu__price del { order: -1; font-family: var(--font-text); font-size: 13px; color: var(--text-on-light-muted); text-decoration-color: var(--text-on-light-muted); }
.karta-produktu__price strong { font-size: 28px; font-weight: 400; }
.karta-produktu__cta {
  /* Wzorzec .hero-stacjonarne__cta (D58): nadpisanie spoczynku BEZ nadpisania
     hover jest niedokonczone, --accent-hover on-light == --accent-deep. */
  --btn-solid-bg: var(--accent-deep);
  --btn-solid-fg: var(--text-on-dark);
  --accent-ctx-hover: var(--accent-deep-hover);
  flex: none;
}
.karty-produktowe__brak { color: var(--text-on-light-muted); margin-top: var(--space-9); }
@media (max-width: 900px) {
  .karty-produktowe { grid-template-columns: 1fr; row-gap: var(--space-7); margin-top: var(--space-7); }
  /* BUG realny zlapany pomiarem na 390 (nie na 768/1440, gdzie karta ma zapas
     szerokosci): rzad cena+CTA w jednej linii (`justify-content:space-between`,
     `nowrap`, CTA `flex-shrink:0`) NIE miesci sie w karcie waskiej mobile - CTA
     (226px stale, tekst "Dodaj do koszyka" nie zawija sie) + cena + gap dawaly
     ~298-314px na dostepnych ~269px, przycisk realnie wystawal poza karte o
     32-45px (zmierzone `getBoundingClientRect`, `body`/dokument tego nie
     pokazywal bo nadrzedny overflow ukrywal wizualny skutek - zlapane dopiero
     porownaniem `footer.right` vs `cta.right`, nie samym scrollWidth dokumentu).
     Makieta mobile (00-full-mobile.png) rozwiazuje to inaczej - lekki link
     tekstowy "ZOBACZ" zamiast pelnego przycisku - ale to zmienia tez TRESC CTA
     (copy.md wprost: "Dodaj do koszyka" na wszystkich trzech kartach, zero
     wzmianki o wariancie mobile), wiec nie poszlismy za makieta wprost (rozjazd
     zgloszony, decyzje.md D60) - zamiast tego cena i CTA ida jeden pod drugim,
     CTA pelnej szerokosci, tekst bez zmian. */
  .karta-produktu__footer { flex-direction: column; align-items: stretch; gap: var(--space-4); }
  .karta-produktu__cta { width: 100%; }
}

/* --- S3: pas-cta, wariant "on-wine, prosty" [NOWY] ------------------------
   Dwa bloki (eyebrow+lead / CTA) w jednym rzedzie na desktop, bez H2 duzy/
   kursywa i bez panelu ceny/listy punktow (te dwa warianty istniejace w
   pas-cta.md nie pasuja - ta sekcja nie sprzedaje jednej konkretnej oferty
   z cena, tylko kieruje niezdecydowanych do kontaktu). Etykieta gorna
   ("Nie wiesz, od czego zaczac?") zmierzona pikselowo jako zloty pogrubiony
   kapitalik, nie duzy serif jak w pozostalych wariantach - reuzyty gotowy
   `.eyebrow` (kolor z --accent-ctx = zloto na .on-wine automatycznie, bez
   dopisywania nowej klasy etykiety). */
.pas-cta--proste .pas-cta__inner { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-8); }
.pas-cta--proste .pas-cta__copy { max-width: 52ch; }
.pas-cta--proste .eyebrow { margin-bottom: var(--space-3); }
.pas-cta--proste .pas-cta__note { margin: 0; color: var(--fg-muted); font-size: 15px; }
.pas-cta--proste .pas-cta__cta { margin-top: 0; width: auto; flex: none; }
@media (max-width: 900px) {
  .pas-cta--proste .pas-cta__inner { flex-direction: column; align-items: stretch; }
  .pas-cta--proste .pas-cta__cta { width: 100%; }
}

/* korekta 16.09.2026 (D74), /o-nas/ S3 wyłącznie: page-brief (o-nas.md linia 58-61)
   każe "wąski, jednowierszowy pasek", nie osobny ciężki blok - sekcja jako goły
   `<section>` dziedziczyła domyślny `padding-block:var(--space-section)` (115-152px
   na stronę = do 304px total), wyglądała jak pełnoprawna sekcja, nie "pasek" zamykający
   stronę. Scoped do `--misja` (nie `--proste` generycznie, żeby nie ruszać identycznego
   wariantu na `/sklep/e-booki/`). Tło NIE ruszone: pierwsza wersja tej korekty próbowała
   nadpisać na --surface-paper zakładając błąd wobec briefu - `podstrony.css` linia 384-401
   ma to już poprawnie rozstrzygnięte pomiarem wektorowym (pasmo celowo JAŚNIEJSZE,
   --surface-cream+ramka 1px, od cieplejszego --surface-paper otoczenia), reguła z wyzszą
   specyficznością (`.pas-cta.on-light.pas-cta--misja`) i tak by to nadpisała z powrotem -
   usunięte stąd, żeby nie zostawiać martwej/mylącej deklaracji w kodzie. */
.pas-cta--misja { padding-block: var(--space-8); }
