/* =============================================================================
   Fundacja Wstawaj Alicja: system.css
   Wymaga tokens.css. Tylko to, czego nie ostyluje blok GenerateBlocks.

     1. Pomocniki a11y        klasy na markup z PHP
     2. Treść wpisów          rytm akapitów w artykułach i projektach
     3. Nakładka menu         @keyframes ikony i selektory na <body>
     4. Reguły globalne       musi zostać na końcu tej grupy
     5. Strona podopiecznego  karty ze skrótkodów (po globalnych, celowo)
     6. Szukajka listingu     przycisk czyszczenia ze skrótkodu
     7. Przełącznik motywu    ikona ze skrótkodu i przejście między motywami
     8. Aktualności           meta i zdjęcie karty listingu, galeria wpisu
     9. Podgląd zdjęć         kafle i pasek miniatur nakładki GLightbox
    10. Projekty              karty i lista lat ze skrótkodów
    11. Strona 404            treść z content-404.php
    12. Pakiet ruchu          klikalność kart, wejścia, pasek, nagłówek
    13. Hero „Słowa"          nagłówek ze słów, lead z CTA, przycisk „w dół"
    14. Komunikaty GiveWP     pudełko błędu na stronach systemowych
    15. Pas logotypów         kafel partnera jasny w obu motywach
    16. Pas powitalny         komunikat nad nagłówkiem, gaszony z localStorage

   Fluent Forms: zero reguł w motywie, wygląd idzie z własnego CSS wtyczki.
   ============================================================================= */


/* =============================================================================
   1. POMOCNIKI A11Y
   ============================================================================= */

/* Widoczne tylko dla czytnika ekranu. Bez display:none i visibility:hidden,
   bo te wycinają element także z drzewa dostępności. */
.u-sr-only {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}


/* =============================================================================
   2. TREŚĆ WPISÓW
   Artykuły i projekty pisane w edytorze, nie strony składane z kontenerów GB.
   padding-block-end tylko na single-post: za treścią wpisu stoi siostrzana sekcja
   „Więcej aktualności", a strona projektu kończy się na .entry-content.
   ============================================================================= */

/* 24px bez wyjątków */
.single-post .entry-content > * + *,
.single-projekt .entry-content > * + * { margin-block-start: var(--fdn-spacing-lg); }

/* Cap na wszystkich dzieciach, bo zdjęcie w treści ma szerokość akapitu. Kolumna
   stoi przy lewej krawędzi pasa, bez centrowania; układ blokowy daje każdemu
   dziecku min(100%, cap), więc wszystkie trzymają wspólną lewą krawędź. */
.single-post .entry-content > *,
.single-projekt .entry-content > * { max-inline-size: var(--fdn-container-text); }

/* Rytm treści stoi na marginesach górnych, a GP zeruje dolny margines ostatniego
   akapitu: bez tego treść kończy się na styk z sekcją „Więcej aktualności".
   Tylko single-post, strony i profile to stos sekcji GB z własnymi paddingami. */
.single-post .entry-content { padding-block-end: var(--fdn-space-section); }

/* Pismo kolumny czytania: dziedziczenie z kontenera obejmuje akapity bez klas,
   a klasa t-body-* na elemencie wygrywa, więc lead zostaje przy 20 px. Interlinia
   jawnie: gdyby GP emitował sztywne 24 px zamiast mnożnika, pismo 18 dostałoby 1,33. */
.single-post .entry-content,
.single-projekt .entry-content {
  font-size: var(--fdn-font-size-prose);
  line-height: var(--fdn-line-height-body);
}

/* Tytuł stoi w .entry-header, siostrze .entry-content, więc cap kolumny dostaje
   osobno. Reguła na h1, nie na .entry-header: GP Premium potrafi wstawić zdjęcie
   wyróżniające do nagłówka i cap na kontenerze ścinałby kadr. */
.single-post h1.entry-title,
.single-post .entry-meta {
  max-inline-size: var(--fdn-container-text);
}

/* Tytuł wpisu i projektu na stopień 3xl: 42 px brało się z GP (h1 po nazwie
   elementu), a Customizer daje h1 tylko krój i wagę. Ten sam stopień co zdanie
   wejściowe podstrony i nazwisko na profilu; na mobile 3xl schodzi do 34 px. */
.single-post h1.entry-title,
.single-projekt h1.entry-title {
  font-size: var(--fdn-font-size-3xl);
  line-height: var(--fdn-line-height-heading);
}

/* Nagłówki w treści wpisu i projektu na drabinkę tokenów zamiast 35/29/24 px z GP.
   Specyficzność zerowa z wyboru: :where() daje (0,0,1), tyle co `h2` GP, i wygrywa
   wyłącznie kolejnością arkuszy (enqueue na priorytecie 20, po generate_scripts).
   Za to przegrywa z każdą klasą (Global Styles, presety rdzenia, style per blok):
   to domyślny rozmiar nagłówka bez klasy, nie nadpisanie wyboru redaktora.
   Interlinia jawnie, bo GP daje h1-h3 1.2em, a h4 nic. */
:where(.single-post .entry-content, .single-projekt .entry-content) :is(h1, h2, h3, h4) {
  line-height: var(--fdn-line-height-heading);
}
:where(.single-post .entry-content, .single-projekt .entry-content) h1 { font-size: var(--fdn-font-size-2xl); }
:where(.single-post .entry-content, .single-projekt .entry-content) h2 { font-size: var(--fdn-font-size-lg); }
:where(.single-post .entry-content, .single-projekt .entry-content) h3 { font-size: var(--fdn-font-size-md); }
:where(.single-post .entry-content, .single-projekt .entry-content) h4 { font-size: var(--fdn-font-size-base); }

/* Etykieta nad tytułem: u wpisu kategoria i data (element GP z bazy woła
   [fwa_wpis_meta]), u projektu rok zakończenia (hak w inc/projekty.php). Selektor
   łapie wrapper ze skrótkodu, nie klasę bloku z bazy. Zawężenie do .entry-header:
   trójka „Więcej aktualności" woła ten sam skrótkod i ma zostać przy 13 px karty.
   Kolor na kat i data wprost, bo ich klasy mają własne kolory w sekcji 8 (0,1,0),
   które wygrałyby z dziedziczeniem. Margines tylko u projektu: wrapper wpisu jest
   inline w akapicie bloku, który sam daje odstęp. */
.single-post .entry-header .fwa-akt__meta,
.single-projekt .entry-header .fwa-projekt__rok {
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-base);
  line-height: var(--fdn-line-height-body);
}
.single-post .entry-header .fwa-akt__kat,
.single-post .entry-header .fwa-akt__data { color: inherit; }
.single-projekt .entry-header .fwa-projekt__rok { margin-block: 0 var(--fdn-spacing-lg); }

/* podkreślanie włącza Customizer; tu sam offset, bo domyślny tnie ogonki w „ą" */
.entry-content a { text-underline-offset: 0.2em; }

/* Zdjęcie wyróżniające wpisu. Pozycję przestawia Customizer (Layout, Blog,
   Location); tu tylko kadr, promień i odstępy. Pola szerokości i wysokości
   w Customizerze zostają puste, bo wpisana wysokość generuje przycięty plik.
   Selektor długi z dwu powodów: GP ma `.separate-containers .inside-article >
   .featured-image` (0,3,0), więc `body` daje (0,3,1) i wygrywa niezależnie od
   kolejności; a GP Premium wstawia zdjęcie albo jako siostrę .entry-content,
   albo w samym nagłówku, więc selektor potomka łapie oba ułożenia. */
body.single-post .inside-article .featured-image {
  margin-block: var(--fdn-spacing-lg);
}

body.single-post .inside-article .featured-image img {
  display: block;
  inline-size: 100%;
  block-size: var(--fdn-post-hero);
  border-radius: var(--fdn-radius-md);
  object-fit: cover;
}

/* Odstęp pod zdjęciem ma być jeden. GP daje `.entry-content:not(:first-child)`
   margin-top 2em, który zlewa się z dolnym marginesem zdjęcia i wygrywa (32 > 24).
   Zerujemy go tylko tam, gdzie zdjęcie poprzedza treść; wpis bez zdjęcia zostaje
   przy rytmie GP. Dwie reguły, bo zdjęcie bywa siostrą .entry-content albo
   ostatnim dzieckiem nagłówka. */
body.single-post .featured-image + .entry-content { margin-block-start: 0; }

/* Osobna reguła, nie druga pozycja w liście selektorów wyżej: przeglądarka bez
   :has() unieważnia całą regułę, w której taki selektor stoi. */
body.single-post .entry-header:has(.featured-image) + .entry-content { margin-block-start: 0; }


/* =============================================================================
   3. NAKŁADKA MENU MOBILNEGO
   Reszta siedzi w Global Style u-menu-overlay. Tu tylko to, co dotyczy
   elementów poza blokiem Menu Container.
   ============================================================================= */

/* podmiana ikony hamburger <-> X */
@keyframes fwa-icon-in {
  from { opacity: 0; transform: rotate(-90deg) scale(0.7); }
  to   { opacity: 1; transform: rotate(0deg) scale(1); }
}

/* blokada przewijania tła pod otwartą nakładką, zamiast JS-a */
body:has(.gb-menu-container--toggled) {
  overflow: hidden;
}

/* Stan startowy nakładki: GB chowa ją przez display:none, więc bez tego nie ma
   od czego animować, a edytor CSS w GB nie przyjmuje @starting-style. Prefiks
   `body` jest konieczny: bez niego reguła ma tę samą specyficzność co Global Style
   i przegrywa, bo ten arkusz ładuje się wcześniej. */
@starting-style {
  body .u-menu-overlay.gb-menu-container--toggled {
    clip-path: circle(0% at calc(100% - var(--fdn-space-gutter) - 22px) calc(var(--fdn-size-header) / 2));
  }
  body .u-menu-overlay.gb-menu-container--toggled .gb-menu > li {
    opacity: 0;
    transform: translateY(12px);
  }
}

/* Bielenie przy otwartym menu. Powrót do ciemnego jest opóźniony w Global Style
   u-menu-toggle; tu tylko zdejmujemy opóźnienie na wejściu. */
body:has(.gb-menu-container--toggled) :is(.gb-menu-open-icon, .gb-menu-toggle-text) {
  color: var(--fdn-color-menu-overlay-text);
  transition-delay: 0s;
}


/* =============================================================================
   4. REGUŁY GLOBALNE
   Musi zostać na końcu tej grupy: :focus-visible pisze do box-shadow i ma taką
   samą specyficzność co zwykła klasa.
   ============================================================================= */

/* Domyślna warstwa jasna. Przełącznik motywu nie pisze color-scheme z JS: w trybie
   ciemnym wygrywa `html[data-theme="dark"]` z tokens.css (0,1,1) nad tą regułą
   (0,0,1). Tu zostaje wartość dla strony bez atrybutu, także wczytanej bez JS. */
html { color-scheme: light; }

/* zapas pod przyklejony nagłówek przy każdym przewinięciu do elementu (WCAG 2.4.11) */
html {
  scroll-padding-block-start: calc(var(--fdn-size-header) + var(--fdn-spacing-md));
}

/* Cel dotykowy 48px (WCAG 2.5.8). Nie każdy <button>: hamburger, zamknięcie modala
   i akordeony mają własne rozmiary; przyciski GB trzyma Global Style u-btn. */
.wp-block-button__link,
input[type="submit"],
button[type="submit"] { min-block-size: var(--fdn-size-control); }

/* Pozycja menu w jednej linii: w ciasnym pasku (1024-1200px) „Jak pomóc" łamało
   się na dwa wiersze i rozpychało nagłówek ponad --fdn-size-header. Razem
   z mniejszą przerwą --fdn-nav-gap, inaczej menu wyszłoby poza pasek. */
.gb-menu-link { white-space: nowrap; }

/* Odblokowanie Global Style u-input na natywnych polach. GB emituje selektor
   jednoklasowy (0,1,0), a GP styluje pola listą `input[type="text"], select,
   textarea` (0,1,1), więc .u-input przegrywa niezależnie od kolejności. Element
   w selektorze daje remis i wygrywa kolejność. Wartości zostają w Global Style;
   kolor tła i ramki, bo GP emituje je z Customizera (0,1,1). Prawy padding
   w szukajce nadpisuje sekcja 6. */
input.u-input,
select.u-input,
textarea.u-input {
  background-color: var(--fdn-color-bg);
  border-color: var(--fdn-color-border-input);
  border-radius: var(--fdn-radius-sm);
  padding: var(--fdn-spacing-sm) var(--fdn-spacing-md);
}

/* Stan aktywnego pola: obrys mówi „jesteś tutaj" i należy się w obu trybach
   wejścia, a pierścień niżej jest warstwą dla klawiatury. Stąd `:focus`, nie
   `:focus-visible`: przy kliknięciu myszą reguła niżej gasi pierścień, obrys zostaje.
   (0,2,1) remisuje z listą pól GP w :focus i wygrywa kolejnością. */
input.u-input:focus,
select.u-input:focus,
textarea.u-input:focus {
  border-color: var(--fdn-color-focus);
  border-width: var(--fdn-border-width-thick);
}

/* Stała wysokość pól jednolinijkowych: bez niej pole liczyło się z tekstu
   i paddingu (50 px w spoczynku, 52 z ramką 2 px), czyli skok układu przy kliknięciu.
   padding-block: 0, bo przy 48 px i 24 px tekstu 12 px groziłoby przycięciem.
   Kolejność jest istotna: to samo (0,1,1) co odblokowanie u-input wyżej, które
   ustawia skrót `padding`. textarea celowo poza selektorem. */
input.u-input,
select.u-input {
  block-size: var(--fdn-size-control);
  padding-block: 0;
}

/* Pierścień fokusu dwutonowy: żaden pojedynczy kolor nie da 3:1 wobec białego,
   niebieskiego i limonkowego tła naraz. Prefiks `:root` podnosi specyficzność
   do (0,2,0), żeby Global Style z własnym box-shadow go nie zdmuchnął. */
:root :focus-visible {
  outline: var(--fdn-border-width-focus) solid var(--fdn-color-focus);
  outline-offset: var(--fdn-border-width-focus-offset);
  box-shadow: 0 0 0 var(--fdn-border-width-focus-offset) var(--fdn-color-focus-offset);
}

/* Klik myszą w pole nie zapala obrączki: przeglądarka dopasowuje :focus-visible
   do pól także przy kliknięciu i tylko reguła może to cofnąć. Tryb wejścia pisze
   fwa.js na <html>; przy Tabie pierścień wraca (WCAG 2.4.7). Karetka i ramka zostają. */
:root[data-fwa-input="mouse"] :is(input, textarea, select):focus-visible {
  outline: none;
  box-shadow: none;
}

/* „Ogranicz ruch" przez podmianę tokenów: jedna reguła na cały system, działa tylko
   dla przejść używających var(--fdn-duration-ms-*). W kontrolce Transition w GB
   zawsze wpisywać zmienną, nie liczbę. */
@media (prefers-reduced-motion: reduce) {
  :root {
    --fdn-duration-ms-fast: 0.01ms;
    --fdn-duration-ms-base: 0.01ms;
    --fdn-duration-ms-slow: 0.01ms;
    --fdn-duration-ms-hero-kiw: 0.01ms;
    --fdn-duration-ms-enter: 0.01ms;
  }

  /* transition-delay nie bierze się z tokenu czasu, trzeba zdjąć osobno */
  .gb-menu-container--toggled .gb-menu > li { transition-delay: 0s !important; }

  /* kiwanie przycisku „w dół" (sekcja 13) to pętla nieskończona: zero tokenu jej
     nie gasi, tylko próbkuje w przypadkowej fazie i przycisk drga. !important,
     bo reguła animacji w sekcji 13 stoi po tej i ma wyższą specyficzność. */
  .fwa-hero__dalej { animation: none !important; }
}

/* Karty podopiecznego i zbiórki: treść wchodzi ze skrótkodu, więc odstępy
   prowadzi gap karty, a nie marginesy akapitów motywu. */
.fwa-person__text p,
.fwa-zbiorka__text p { margin-block: 0; }

/* Siatka listingu: auto-fit zwija puste tory i jedna karta rozpychała się na
   całą szerokość, auto-fill trzyma rozmiar karty. min(320px, 100%) jest sufitem
   toru: bez niego przy oknie 320px strona przewija się w poziomie. */
.fwa-people__results .gb-looper {
  grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr));
}

/* Stała wysokość tytułu karty (dwa wiersze): tytuł na jeden wiersz podciągał kwotę
   i pasek, a karta obok w tym samym rzędzie miała je niżej. 2lh, nie piksele: jedna
   reguła obsługuje różne stopnie i schodzi sama na mobile; calc() wyżej to zapas
   dla przeglądarek bez `lh`. overflow: hidden przycina trzeci wiersz i zdejmuje
   minimalny rozmiar elementu flex (line-clamp nie działa na elemencie flex).
   .fwa-people__grid i kafle fwa-pomoc__* poza listą: tam tytuły mieszczą się
   w jednym wierszu i reguła dodałaby 24 px pustki. :not(.fwa-projekty--skrot)
   z tego samego powodu; podnosi specyficzność całej reguły do (0,2,2), a między
   (0,1,2) i (0,2,2) nic nie ustawia block-size na tych h3. Uchwyty `__srodek` to
   siatki strony głównej z blokami z bazy, gdzie równa wysokość może przyjść tylko
   z arkusza. */
body :is(
  .fwa-zbiorki__grid,
  .fwa-zb__najblizej,
  .fwa-akt__grid,
  .fwa-rezultaty__siatka,
  .fwa-projekty:not(.fwa-projekty--skrot),
  .fwa-zbiorki__srodek,
  .fwa-news__srodek
) h3 {
  block-size: calc(2em * var(--fdn-line-height-heading));
  block-size: 2lh;
  overflow: hidden;
}

/* Sekcję „Najbliżej celu" fwa.js chowa atrybutem hidden przy niepustej frazie.
   Element to kontener GB, a display z jego reguły (jedna klasa) wygrywa z [hidden]
   arkusza przeglądarki; klasa+atrybut daje wyższą specyficzność. Znika cały box. */
.fwa-zb__najblizej[hidden] { display: none; }

/* Karty rezultatów przychodzą w całości ze skrótkodu [fwa_rezultaty_siatka], więc
   żaden blok GB nie niesie tu CSS: layout musi stać tutaj. Prefiks `body` daje
   (0,1,1), bo Global Styles (u-card, u-placeholder) ładują się po tym arkuszu. */
body .fwa-rezultaty__siatka {
  display: grid;
  gap: var(--fdn-spacing-xl);
  grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr));
}

body .fwa-rezultat {
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

body .fwa-rezultat__zdjecie {
  background-color: var(--fdn-color-bg-tint-blue);
  border-radius: 0;
  flex-shrink: 0;
  min-block-size: 193px;
  overflow: hidden;
  padding-inline: var(--fdn-spacing-md);
  position: relative;
}

body .fwa-rezultat__tresc {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
  gap: var(--fdn-spacing-sm);
  padding: var(--fdn-spacing-md);
}

/* Dwa kształty karty rezultatu (warunki przy fwa_rezultat_karta_html). Bez zdjęcia
   w miejsce slotu wchodzi panel o tej samej powierzchni i wysokości (193) z etykietą
   „Zbiórka zakończona" i kwotą; ze zdjęciem para „Zebrano" + kwota stoi w treści
   nad tytułem. Etykieta musi brać text-secondary: na bg-tint-blue daje 6,40 i 5,30,
   a text-muted 4,31 i 3,30 przy progu 4,5. Kwota stopniem xl, ale nie nagłówkiem:
   h3 wpadłoby pod regułę 2lh wyżej. Oba wrappery to <p>, marginesy zerujemy. */
body .fwa-rezultat__panel {
  background-color: var(--fdn-color-bg-tint-blue);
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  gap: var(--fdn-spacing-2xs);
  justify-content: center;
  margin: 0;
  min-block-size: 193px;
  padding: var(--fdn-spacing-md);
}

body .fwa-rezultat__zebrano {
  display: flex;
  flex-direction: column;
  gap: var(--fdn-spacing-2xs);
  margin: 0;
}

body .fwa-rezultat__etykieta {
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-sm);
  font-weight: 600;
  line-height: var(--fdn-line-height-body);
}

body .fwa-rezultat__kwota {
  color: var(--fdn-color-text-primary);
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-xl);
  font-weight: 700;
  line-height: var(--fdn-line-height-heading);
}

/* Link w nagłówku karty rezultatu niesie nakładkę u-container-link, bo CTA ma
   u-btn z transformem i ::before zwinęłoby się do przycisku. Ma wyglądać jak
   nagłówek: (0,1,3) bije `a:hover, a:focus, a:active` GP (0,1,1). */
body .fwa-rezultat h3 a {
  color: inherit;
  text-decoration: none;
}

body .fwa-rezultat h3 a:hover { text-decoration: underline; }

/* Jedna szerokość treści na wszystkich podstronach: strona główna ma 1120px
   (full-width-content), podstrona 1056, bo w one-container padding 32px siedzi na
   #content i przychodzi z Customizera, czyli z bazy. Zdejmujemy go tam, gdzie już
   przed niczym nie chroni. Próg 1184 = 1120 + 2 x 32; poniżej reguła śpi i gutter
   zostaje z panelu. Specyficzność (1,2,1) bije `.one-container .site-content`
   z Customizera i `.single-podopieczny #content.site-content` z sekcji 5 naraz.
   Breakpoint liczbą, nie tokenem: @media nie czyta var(), a wartość wynika
   z paddingu należącego do Customizera. */
@media (min-width: 1184px) {
  body.one-container #content.site-content { padding-inline: 0; }
}

/* Powietrze między nagłówkiem a treścią podstrony dokłada się do pionowego
   paddingu #content z Customizera; breakpoint niesie token (0 na mobile, 64px od
   1024). :not(.full-width-content) wyjmuje stronę główną, gdzie treść zaczyna hero. */
body:not(.full-width-content) #page.site {
  padding-block-start: var(--fdn-space-content-extra);
}


/* Pierwsza sekcja podstrony bez własnego górnego paddingu: dokładał się do odstępu
   z motywu i Customizera i tytuł startował 160px pod paskiem. Zostaje padding
   #content z Customizera (32px). Tylko body.page: wpisy mają tytuł w pełnym
   rozmiarze i zostają przy swoim oddechu; stronę główną wyjmuje :not(). */
body.page:not(.full-width-content) #content .entry-content > section:first-child {
  padding-block-start: 0;
}

/* Podłoga treści: sięga co najmniej dolnej krawędzi okna, żeby stopka nie wjeżdżała
   na pierwszy ekran na krótkich stronach. min-height, więc wyższa strona nie
   zmienia się; oba tokeny przełączają się same w tokens.css. Linia z 100vh to
   zapas dla przeglądarek bez svh. */
body:not(.full-width-content) #content.site-content {
  min-block-size: calc(100vh - var(--fdn-size-header) - var(--fdn-space-content-extra));
  min-block-size: calc(100svh - var(--fdn-size-header) - var(--fdn-space-content-extra));
}

/* Podkreślenia linków: tam, gdzie link ma podkreślenie, jest cienkie, odsunięte od
   liter i przygaszone; pełny kolor wraca na hover i fokus. Reguła nie włącza
   podkreśleń tam, gdzie są wyłączone. currentColor działa w jasnym i ciemnym. */
body a {
  text-decoration-thickness: 1px;
  text-underline-offset: 0.2em;
  text-decoration-color: color-mix(in srgb, currentcolor 45%, transparent);
}

body a:hover,
body a:focus-visible {
  text-decoration-color: currentcolor;
}

/* Nagłówek przyklejony chudnie: klasę gb-is-sticky dokłada skrypt bloku GB przy
   przewinięciu, więc góra strony zostaje na --fdn-size-header. Wysokość niesie
   min-height na nav.gb-navigation, tak jak w CSS bloku. */
header.gb-site-header.gb-is-sticky nav.gb-navigation {
  min-height: var(--fdn-size-header-sticky);
}

/* Kolumna czytania podstron. Klasę u-prose redaktor wpisuje ręcznie w pole
   „Dodatkowe klasy CSS" kontenera sekcji; definicja tu, nie w Global Styles, dla
   wersjonowania w gicie. Prefiks `body` konieczny: Global Styles ładują się po tym
   arkuszu i u-container wygrałby o max-inline-size gołą klasą. Bez margin-inline:
   auto i inline-size: 100%: kontener zostaje przy lewej krawędzi pasa. */
body .u-prose {
  font-size: var(--fdn-font-size-prose);
  line-height: var(--fdn-line-height-body);
}

/* Cap na dzieciach, nie na kontenerze: u-container centruje się sam
   (margin-inline auto), więc zwężony kontener wylądowałby na środku okna. */
body .u-prose > * { max-inline-size: var(--fdn-container-text); }

/* Wyjątek od capu: nagłówki i zdanie wejściowe wychodzą z kolumny czytania na
   pełną szerokość pasa, bo nagłówek sekcji kończący się w połowie kontenera robił
   wrażenie pustej strony. Dzieci bezpośrednie, nie potomkowie: nagłówek w karcie
   czy kolumnie zostaje przy szerokości swojego bloku. `none`, nie liczba, więc
   zmiana --fdn-container-lg jedzie sama. :is() liczy się jak najmocniejszy
   argument (klasa), więc (0,2,1) bije cap `body .u-prose > *` (0,1,1) i 26ch
   z `body .fwa-tytul__haslo`: w prozie zdanie łamie się na pełnym pasie.
   Zielona kreska nagłówka nie rusza się, bo ::before jest inline przy wierszu. */
body .u-prose > :is(h1, h2, h3, h4, h5, h6, .fwa-tytul__haslo) { max-inline-size: none; }

/* t-body-base niesie rozmiar na elemencie i bije dziedziczenie, więc bez tej reguły
   akapity z tą klasą zostałyby w prozie na 16. (0,2,1) bije (0,1,0) Global Styles.
   t-body-lead celowo bez reguły: lead zostaje przy 20 px. */
body .u-prose .t-body-base { font-size: var(--fdn-font-size-prose); }

/* Osłona podpisów: figcaption dziedziczył 1rem z body i ma przy nim zostać,
   nie wjechać na 18 razem z prozą. */
body .u-prose figcaption { font-size: var(--fdn-font-size-base); }

/* Wiersz „etykieta - wartość": Global Style u-row-split to sam flex i marginesów
   dzieciom nie zeruje, więc rytm wiersza zależał od tego, czy blok wyzerował je
   sam (te same wiersze były o 24 px wyższe na stronie bez stylów bloku). Dzieci
   bezpośrednie, nie potomkowie. W motywie nic nie zmienia (dzieci to strong
   i span), to dopełnienie Global Style, nie jego kopia. */
body .u-row-split > * { margin-block: 0; }

/* Tytuł podstrony w roli etykiety; nagłówkiem wizualnym jest zdanie wejściowe
   pod nim. h1 zostaje h1, zmienia się tylko rozmiar. Hero głównej ma
   fwa-hero__title i tu nie wchodzi. */
body .t-heading-h1 {
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-base);
  font-weight: 700;
  letter-spacing: 0.1em;
  margin-block-end: var(--fdn-spacing-lg);
  text-transform: uppercase;
}

/* Zdanie wejściowe. Klasę niesie akapit w treści, nie kolejność w DOM: selektor
   h1 + p złamałby się przy pierwszej zmianie układu. Stopień 3xl, bo zdanie ma być
   większe od nagłówka sekcji (2xl). 26ch trzyma zdanie w dwóch wierszach na każdej
   szerokości, bo ch skaluje się z pismem. */
body .fwa-tytul__haslo {
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-3xl);
  font-weight: 700;
  line-height: 1.18;
  margin-block: 0;
  max-inline-size: 26ch;
}

/* Blok limonki na jednym słowie zdania; słowo wskazuje redakcja, więc span siedzi
   w treści. Kolor tekstu jawnie z roli „tekst na limonce", nie dziedziczony:
   w ciemnym jasny tekst dawałby na limonce 1,27. Padding tylko poziomy, ujemny
   margines zdejmuje go z układu, więc blok nie przesuwa tekstu. */
body .fwa-tytul__slowo {
  padding: 0 0.12em;
  margin-inline: -0.12em;
  border-radius: var(--fdn-radius-lg);
  background: var(--fdn-color-brand-secondary);
  color: var(--fdn-color-text-on-donate);
}

/* Nagłówek sekcji na 2xl (39). Rozmiar tutaj, nie w Global Style .t-heading-section,
   bo prefiks `body` (0,1,1) bije klasę (0,1,0) ładowaną po tym arkuszu. Global
   Style zostaje na xl jako zapas, gdyby ktoś zdjął tę regułę. Global Style
   .t-heading-h2 nie ma już zastosowania i czeka w bazie na skasowanie. */
body .t-heading-section {
  font-size: var(--fdn-font-size-2xl);
}

/* Zielona kreska przed nagłówkiem sekcji. ::before jest inline, nie flexem:
   nagłówek może mieć w środku link, a przy zawijaniu kreska zostaje przy pierwszym
   wierszu. Wysokość i odstęp w em, szerokość sztywna 5px, bo w em wychodziłby
   ułamek piksela i kreska byłaby rozmyta. Prefiks `body` bije Global Style. */
body .t-heading-section::before {
  background: var(--fdn-color-brand-secondary);
  block-size: 0.72em;
  content: "";
  display: inline-block;
  inline-size: 5px;
  margin-inline-end: 0.5em;
}

/* Liczby w sekcji „Nasza pomoc w liczbach": typografia tutaj, nie w atrybutach
   bloków, które niosły sześć tych samych deklaracji każdy poza gitem. Kolor z roli
   tekstowej, nie z --fdn-color-brand: brand to blue-500, 2,91 na bieli. */
body .fwa-liczba {
  color: var(--fdn-color-text-accent);
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-3xl);
  font-weight: 700;
  line-height: var(--fdn-line-height-heading);
  margin-block: 0;
}

/* Pole zdjęcia wypełnia się każdym obrazkiem bez ustawień w edytorze. Klasę
   fwa-foto redaktor wpisuje ręcznie na bloku elementu GB z tłem, promieniem,
   overflow: hidden i aspect-ratio. Reguła obejmuje cały łańcuch (figure, a, img),
   bo rdzeń pakuje obrazek w <figure class="wp-block-image"> z marginesem, a przy
   linku w <a>: samo dopasowanie img nic nie da, procentowa wysokość nie miałaby od
   czego się policzyć. Prefiks `body` konieczny: rdzeń pisze `.wp-block-image img`
   i `.wp-block-image > a` (0,1,1). margin: 0, bo marginesu figure rdzeń nie zeruje.
   Podpisu w takim polu być nie może: overflow: hidden utnie figcaption. */
body .fwa-foto figure,
body .fwa-foto figure > a,
body .fwa-foto img {
  block-size: 100%;
  display: block;
  inline-size: 100%;
  margin: 0;
  object-fit: cover;
  object-position: center;
}


/* =============================================================================
   5. STRONA PODOPIECZNEGO
   Karty, historia i galeria przychodzą ze skrótkodu, więc rytm i kadr muszą być
   tutaj: blok GB nie dosięgnie tego, czego sam nie wyrenderował. Sekcja stoi po
   regułach globalnych, tak samo jak poprawki kart wyżej.
   ============================================================================= */

/* Strona osoby siedzi w kontenerze GP (1120px + 32px paddingu), a nie na pełnej
   szerokości jak główna. Bez tych reguł gutter liczył się dwa razy (GP 32 + sekcja
   64) i treść zwężała się do 928px. */
.single-podopieczny #content.site-content { padding-inline: var(--fdn-spacing-md); }

/* Reguła zeruje też górny padding pierwszej sekcji profilu: jako jedyna nosi
   globalną klasę sekcji z Global Styles (skrót padding z --fdn-space-section)
   i pierwszy tekst stał 208 px od góry okna, gdy każdy inny szablon ma 152.
   Longhandy, nie skrót: padding-block-end ma zostać z tamtej klasy. (0,2,0) bije
   (0,1,0) niezależnie od kolejności arkuszy. */
.single-podopieczny .fwa-profile {
  padding-inline: 0;
  padding-block-start: 0;
}

/* Nagłówek profilu: h1 z nazwiskiem nosił t-heading-h1, która stała się etykietą
   podstrony (16 px), i był najmniejszym tekstem na własnej stronie. Klasy
   fwa-profile__nazwisko i __metryczka niesie element GP z bazy, reguły stoją tutaj.
   Stopień 3xl jak zdanie wejściowe podstrony. Waga literalna 700, bo drabinka
   nie ma tokenu wagi. */
body .fwa-profile__nazwisko {
  margin-block: 0;
  color: var(--fdn-color-text-primary);
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-3xl);
  font-weight: 700;
  line-height: var(--fdn-line-height-heading);
}

/* Metryczka pod nazwiskiem ze skrótkodu [fwa_podopieczny_metryczka]: stopień md,
   kolor drugorzędny (7,41 w jasnym, 8,24 w ciemnym). :empty chowa kontener, gdy
   skrótkod odda pusty string; biały znak w środku unieważnia dopasowanie. */
body .fwa-profile__metryczka {
  margin-block: 0;
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-md);
  line-height: var(--fdn-line-height-body);
}
body .fwa-profile__metryczka:empty { display: none; }

/* karty w kolumnie bocznej: własny padding, bo Global Style u-card go nie ma
   (na listingu daje go blok GB), plus jeden rytm między wierszami (16px) */
.fwa-profile__card { padding: var(--fdn-spacing-lg); }
.fwa-profile__card > * + * { margin-block-start: var(--fdn-spacing-md); }

/* Sekcje warunkowe zwracają pusty ciąg, ale blok, który je opakowuje, zostaje
   w DOM i w gridzie zajmuje komórkę razem z gap. Dwie pułapki: :empty nie łapie
   elementu z samym białym znakiem, a elementy puste z definicji (hr, img, iframe,
   spacer GB) są :empty zawsze, więc żaden nie może stanąć wprost pod .fwa-profile__main. */
.fwa-profile__main > :empty { display: none; }

/* nagłówki sekcji w kolumnie głównej: t-heading-section ma marginesy 0, bo na
   stronie głównej odstęp daje gap bloku, tutaj musi go dać arkusz */
.fwa-profile__main h2 { margin-block: 0 var(--fdn-spacing-sm); }

/* Ramka formularza GiveWP na pełną szerokość karty. Bez marginesu pod ramką: jest
   ostatnim elementem karty, a rytm daje reguła `> * + *` wyżej. */
.fwa-profile__card .root-data-givewp-embed {
  margin-inline: calc(-1 * var(--fdn-spacing-lg));
}

/* iframe jest liniowy z definicji, siada na linii bazowej i zostawia pod sobą kilka
   pikseli na zejścia liter. Blok je kasuje. */
.fwa-profile__card .root-data-givewp-embed iframe { display: block; }

/* Łata na sposób osadzania formularza GiveWP: rezerwacja miejsca pod ramkę, której
   w HTML z serwera nie ma. Skrótkod kampanii oddaje pusty div, ramkę tworzy React
   wtyczki, a wysokość dopisuje iframe-resizer; do tego momentu treść pod kartą
   przeskakiwała o 470 px. Rezerwacja na kontenerze, nie na :empty: ramka wchodzi
   bez wysokości w style, więc zdjęcie rezerwacji przy wstawieniu dałoby dwa skoki.
   min-block-size, żeby wyższy formularz rozepchnął kontener sam.
   Warunek usunięcia: wtyczka odda ramkę już w HTML albo sama zarezerwuje miejsce
   (sprawdzić w źródle strony po aktualizacji GiveWP). 470px to wynik pomiaru, nie wartość z projektu. */
.fwa-profile__card .root-data-givewp-embed { min-block-size: 470px; }

/* Stan pusty tej łaty: komunikat na czas ładowania żyje na :empty i gaśnie sam, gdy
   React wstawi ramkę. text-secondary na bg-raised-2 daje 6,95 i 6,46 przy progu 4,5.
   Napis w arkuszu, bo div jest cudzy i nie da się w niego wstawić tekstu ani
   atrybutu; ogonki wprost, arkusz jest w UTF-8. */
.fwa-profile__card .root-data-givewp-embed:empty {
  display: grid;
  place-items: center;
  background-color: var(--fdn-color-bg-raised-2);
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-base);
}

.fwa-profile__card .root-data-givewp-embed:empty::before {
  content: "Ładowanie formularza wpłaty…";
}

/* Przy wyłączonym JS ramka nie powstanie nigdy i :empty zostałoby na stałe: 470 px
   płyty z „ładowanie". Tu cała łata schodzi, karta zostaje z samym nagłówkiem.
   Awarii skryptu wtyczki przy włączonym JS żadna reguła CSS nie złapie. */
@media (scripting: none) {
  .fwa-profile__card .root-data-givewp-embed:empty { display: none; }
}

/* Karta wpłat: formularz GiveWP w <details> otwartym od wejścia, <summary> jest
   nagłówkiem karty widocznym w obu stanach i uchwytem zwijania (kursor, szewron,
   pierścień fokusu z globalnego :focus-visible). Pismo jak t-heading-h4, zapisane
   tu, nie klasą z bazy, bo Global Style ładowany po arkuszu wygrałby jedną klasą;
   nagłówka HTML w summary nie wstawiamy, czytniki traktują go niejednolicie.
   Natywny znacznik rozwijania schodzi (list-style i ::-webkit-details-marker to
   zapas na starsze Safari). Szewron w em, obrót z przejściem z tokenu. */
body .fwa-wplaty > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--fdn-spacing-sm);
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  list-style: none;
  cursor: pointer;
  color: var(--fdn-color-text-primary);
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-md);
  font-weight: 600;
  line-height: var(--fdn-line-height-heading);
}
body .fwa-wplaty > summary::-webkit-details-marker { display: none; }
body .fwa-wplaty > summary:hover { color: var(--fdn-color-link-hover); }
body .fwa-wplaty > summary::after {
  content: "";
  flex: 0 0 auto;
  inline-size: 0.5em;
  block-size: 0.5em;
  margin-inline-end: 0.25em;
  border-inline-end: var(--fdn-border-width-thick) solid currentcolor;
  border-block-end: var(--fdn-border-width-thick) solid currentcolor;
  transform: translateY(-25%) rotate(45deg);
  transition: transform var(--fdn-duration-ms-base) var(--fdn-easing-standard);
}
body .fwa-wplaty[open] > summary::after { transform: translateY(25%) rotate(-135deg); }

/* Formularz pod nagłówkiem trzyma rytm karty (16 px): reguła `> * + *` karty
   nie sięga do wnętrza details. */
body .fwa-wplaty__formularz { margin-block-start: var(--fdn-spacing-md); }

/* karta 1,5% podatku: ta sama karta, inne tło. Dwie klasy, bo Global Style .u-card
   ładuje się po tym arkuszu i przy jednej klasie wygrywa. */
.u-card.fwa-profile__card--tax { background-color: var(--fdn-color-bg-tint-lime); }

/* historia: pismo kolumny czytania jak na wpisie; wpautop renderuje akapity bez
   klas, więc dziedziczenie z kontenera obejmuje wszystko. Kolumna główna ma już
   640 z geometrii siatki, centrować nie ma czego. */
.fwa-profile__story {
  font-size: var(--fdn-font-size-prose);
  line-height: var(--fdn-line-height-body);
}

/* historia: akapity 12px, bez marginesów motywu */
.fwa-profile__story p { margin-block: 0; }
.fwa-profile__story p + p { margin-block-start: var(--fdn-spacing-sm); }

/* zdjęcie: kadr wymusza blok, nie plik, dlatego cover, nie contain */
.fwa-profile__photo img {
  position: absolute;
  inset: 0;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

/* Kafel „siatka kwadratów" zamiast zdjęcia, z tokenów zamiast pliku JPG: płyta
   bierze tło z bg-raised i przełącza się z motywem. Markup emituje
   fwa_placeholder_html(); sloty (karta, profil, zbiórki, Rezultaty) są position:
   relative + overflow: hidden. Absolute z jawnym rozmiarem, bo kafel ma wypełnić
   slot także jako bezpośrednie dziecko grida z place-items: center. Przerwy nie
   przez procentowy gap (row-gap liczy się od wysokości, column-gap od szerokości,
   więc przy różnych proporcjach slotów rozjeżdżają się), tylko marginesem spanów,
   który w obu osiach liczy się od inline-size. Radius płyty żaden: ma go slot. */
.fwa-placeholder {
  position: absolute;
  inset: 0;
  box-sizing: border-box;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: 1fr 1fr;
  inline-size: 100%;
  block-size: 100%;
  padding: 4.665%;
  background-color: var(--fdn-color-bg-raised);
}

.fwa-placeholder span {
  margin: 7.717%;
  border-radius: var(--fdn-radius-sm);
}

/* Kolory kafelków w kolejności DOM: tint, 300, tint, 500 / 400, tint, lime, 300.
   Trzy jasne na semantyczny bg-tint-blue, nie blue-50: surowa paleta nie
   przełącza się w ciemnym i kafelki świeciłyby jako najjaśniejszy punkt karty. */
.fwa-placeholder span:nth-child(1),
.fwa-placeholder span:nth-child(3),
.fwa-placeholder span:nth-child(6) { background-color: var(--fdn-color-bg-tint-blue); }
.fwa-placeholder span:nth-child(2),
.fwa-placeholder span:nth-child(8) { background-color: var(--fdn-blue-300); }
.fwa-placeholder span:nth-child(4) { background-color: var(--fdn-blue-500); }
.fwa-placeholder span:nth-child(5) { background-color: var(--fdn-blue-400); }
.fwa-placeholder span:nth-child(7) { background-color: var(--fdn-lime-500); }

/* galeria: kwadratowe miniatury 100px, auto-fill (auto-fit rozpycha pojedyncze) */
.fwa-profile__thumbs {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  gap: var(--fdn-spacing-xs);
}
.fwa-profile__thumb {
  position: relative;
  overflow: hidden;
  aspect-ratio: 1;
  border-radius: var(--fdn-radius-sm);
  background-color: var(--fdn-color-bg-tint-blue);
}
.fwa-profile__thumb img {
  display: block;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

/* ulotka: cała sekcja przychodzi ze skrótkodu jednym kawałkiem HTML, więc rytm
   daje arkusz. Kolumna flex zamiast marginesów: bez scalania marginesów, a reguła
   `.fwa-profile__main h2` (0,1,1) nie dokłada drugiego odstępu. Selektor nagłówka
   z dwiema klasami, bo Global Style .t-heading-section ładuje się po tym arkuszu. */
.fwa-profile__ulotka {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--fdn-spacing-sm);
}
.fwa-profile__ulotka .t-heading-section,
.fwa-profile__ulotka p {
  margin-block: 0;
}

/* Link do pobrania to cel dotykowy (48px, WCAG 2.5.8), nie link w zdaniu. Własna
   klasa, nie u-btn (jak przy polu kopiowania). Kolor jawnie, bo GP daje te same
   wartości inline z Customizera, czyli z bazy. `a.` i :is() na stany, bo reguła GP
   to `a:hover, a:focus, a:active` (0,1,1) w jednym bloku. */
a.fwa-ulotka {
  display: inline-flex;
  align-items: center;
  min-block-size: var(--fdn-size-control);
  color: var(--fdn-color-link);
}
a.fwa-ulotka:is(:hover, :focus, :active) {
  color: var(--fdn-color-link-hover);
}

/* Pole do skopiowania: etykieta, jedna ramka, ikona wewnątrz ramki po prawej.
   Bez u-input ani u-btn: te Global Style ładują się po tym arkuszu i przy
   jednoklasowym selektorze wygrywają (u-btn narzucał padding 24px, u-input promień 0). */
.fwa-copy__etykieta { display: block; }
.fwa-copy__box {
  display: flex;
  align-items: center;
  margin-block-start: var(--fdn-spacing-xs);
  padding-inline-start: var(--fdn-spacing-md);
  background-color: var(--fdn-color-bg);
  border: var(--fdn-border-width-hairline) solid var(--fdn-color-border-input);
  border-radius: var(--fdn-radius-sm);
}
/* Wartość to zwykły tekst, nie input: zero ramek do zdejmowania i zero obrączki
   fokusu w środku ramki. Długi ciąg ucinamy wielokropkiem. */
.fwa-copy__wartosc {
  flex: 1 1 auto;
  min-inline-size: 0;
  display: flex;
  align-items: center;
  block-size: 46px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  color: var(--fdn-color-text-primary);
}
.fwa-copy__btn {
  flex: 0 0 auto;
  /* inline-grid, nie inline-flex: obie ikony leżą w jednej komórce, więc zamiana
     ikony na ptaszek idzie kryciem zamiast display, które nie animuje. Span
     u-sr-only jest absolute, poza przepływem siatki. */
  display: inline-grid;
  place-items: center;
  inline-size: var(--fdn-size-control);
  block-size: 46px;
  padding: 0;
  border: 0;
  border-radius: 0 var(--fdn-radius-sm) var(--fdn-radius-sm) 0;
  background: none;
  color: var(--fdn-color-text-secondary);
  cursor: pointer;
  transition: color var(--fdn-duration-ms-base) var(--fdn-easing-standard);
}
/* GP maluje `button:hover` na kolor marki, stąd granatowy kwadrat pod kursorem.
   Komponent nie ma stanu hover, zmienia się tylko kolor ikony; obrączka fokusu
   zostaje z reguły globalnej. */
.fwa-copy__btn:hover,
.fwa-copy__btn:focus,
.fwa-copy__btn:active {
  background: none;
  color: var(--fdn-color-link-hover);
}

/* Potwierdzenie: ikona przechodzi w ptaszek. Klasę fwa-copy--skopiowane dokłada
   fwa.js, komunikat dla czytników idzie osobnym obszarem live. Zamiana kryciem
   i skalą, nie display. Sprężysta krzywa tylko na transform: na opacity przestrzał
   ponad 1 jest obcinany. Czasy z tokenów, więc „ogranicz ruch" je zeruje. */
.fwa-copy__ikona,
.fwa-copy__ptaszek {
  grid-area: 1 / 1;
  transition:
    opacity var(--fdn-duration-ms-base) var(--fdn-easing-standard),
    transform var(--fdn-duration-ms-base) var(--fdn-easing-spring);
}

.fwa-copy__ptaszek {
  opacity: 0;
  transform: scale(0.5);
}

.fwa-copy--skopiowane .fwa-copy__ikona { opacity: 0; }

.fwa-copy--skopiowane .fwa-copy__ptaszek {
  opacity: 1;
  transform: scale(1);
}

.fwa-copy--skopiowane .fwa-copy__btn { color: var(--fdn-color-feedback-success); }

/* Blok udostępniania zamykający kartę wpłat. Przycisk jest tu pełnowymiarowy
   (u-btn), więc trzeba zdjąć z niego rozmiar pola kopiowania: reguła wyżej daje
   ikonie w ramce stałe 48 × 46 px. Para klas to (0,2,0), czyli więcej niż (0,1,0)
   tamtej reguły; u-btn z Global Styles tych dwóch własności nie ustawia, więc
   min-block-size i obramowanie zostają jego. */
.fwa-udostepnij {
  display: flex;
  flex-direction: column;
  gap: var(--fdn-spacing-sm);
  padding-block-start: var(--fdn-spacing-md);
  border-block-start: var(--fdn-border-width-hairline) solid var(--fdn-color-border);
}

.fwa-udostepnij .fwa-copy__btn {
  inline-size: 100%;
  block-size: auto;
}

/* Ikona i ptaszek w jednej komórce. Reguła grid-area wyżej działa dopiero
   w siatce, a u-btn robi z przycisku flex, więc siatkę daje im opakowanie. */
.fwa-udostepnij__ikony {
  display: inline-grid;
  place-items: center;
}

/* Potwierdzenie widoczne, nie u-sr-only: na przycisku z napisem sama podmiana
   ikony nie mówi, że adres jest już w schowku. Wysokość wiersza zarezerwowana,
   żeby napis nie przesuwał treści pod kartą w momencie pojawienia się. */
.fwa-udostepnij__status {
  min-block-size: calc(var(--fdn-font-size-sm) * var(--fdn-line-height-body));
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-sm);
  line-height: var(--fdn-line-height-body);
}


/* =============================================================================
   6. SZUKAJKA LISTINGU
   Wygląd samego pola prowadzi Global Style u-input w bazie. Tutaj tylko to, bez
   czego nie da się osadzić własnego przycisku czyszczenia: kotwica pozycjonowania,
   miejsce na ikonę i sam przycisk.
   ============================================================================= */

/* Natywny X pola type="search": około 13 px, kursor strzałki, na telefonach nie ma
   go wcale. Zastępuje go przycisk niżej. */
.fwa-search__input::-webkit-search-cancel-button { display: none; }

/* Kotwica przycisku. Flex, nie blok, bo input jako element liniowy dokładałby
   pudełku parę pikseli na descender. inline-size: 100%, żeby pudełko zajęło
   miejsce po samym polu niezależnie od układu .u-search. */
.u-search .fwa-search__pole {
  position: relative;
  display: flex;
  inline-size: 100%;
}

/* Dwie klasy, bo Global Style .u-input ładuje się po tym arkuszu i przy jednej
   wygrywa. To miejsce pod ikonę: bez tego wpisywany tekst wchodzi pod przycisk. */
.u-search .fwa-search__input {
  flex: 1 1 auto;
  min-inline-size: 0;
  padding-inline-end: var(--fdn-size-control);
}

/* Cel dotykowy 48x48 (WCAG 2.5.8). Własna klasa, nie u-btn: ten Global Style
   narzuca padding 0 24px i rozjechałby ikonę. */
.fwa-search__czysc {
  position: absolute;
  inset-inline-end: 0;
  inset-block-start: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  inline-size: var(--fdn-size-control);
  block-size: var(--fdn-size-control);
  padding: 0;
  border: 0;
  border-radius: var(--fdn-radius-sm);
  background: none;
  color: var(--fdn-color-text-secondary);
  cursor: pointer;
}

/* Przycisk wychodzi z PHP z atrybutem hidden i wraca do niego przy pustym polu,
   więc display z reguły wyżej musi ustąpić: selektor z atrybutem daje wyższą
   specyficzność bez !important. */
.fwa-search__czysc[hidden] { display: none; }

/* GP maluje `button:hover` na kolor marki. Zmienia się tylko kolor ikony,
   obrączka fokusu zostaje z reguły globalnej. */
.fwa-search__czysc:hover,
.fwa-search__czysc:focus,
.fwa-search__czysc:active {
  background: none;
  color: var(--fdn-color-link-hover);
}


/* =============================================================================
   7. PRZEŁĄCZNIK MOTYWU
   Cały markup przychodzi ze skrótkodu [fwa_przelacznik_motywu] (inc/motyw.php).
   Trzy gołe ikony obok siebie, bez toru, tła i podpisów; wybór niesie wyłącznie
   krycie ikony. Instancje są dwie (pasek nagłówka, nakładka menu), nigdy naraz:
   rozdzielają je tokeny --fdn-motyw-pasek i --fdn-motyw-nakladka.
   ============================================================================= */

/* Skrótkod jedzie w bloku Tekst GB, czyli w akapicie z marginesem dolnym; pasek
   centruje pudełko razem z marginesem i ikony szły 12 px nad środek. Celujemy
   w opakowanie przez zawartość, więc reguła działa dla obu instancji niezależnie
   od znacznika. :has() liczy się jak najmocniejszy argument, (0,2,0) wygrywa z GB. */
.gb-text:has(> .fwa-motyw) { margin-block: 0; }

/* Oddech między grupą ikon a przyciskiem „Wpłać". Margines na opakowaniu, nie na
   „Actions", które na telefonie trzyma przełącznik menu. display z tego samego
   tokenu co widoczność instancji: poniżej 1024 px znika całe opakowanie, inaczej
   zostawałby pusty akapit z 16 px marginesu. */
.gb-text:has(> .fwa-motyw--pasek) {
  display: var(--fdn-motyw-pasek, inline-flex);
  margin-inline-end: var(--fdn-spacing-md);
}

/* Nakładka jest flex-kolumną (Global Style u-menu-overlay), więc `auto` na górze
   spycha wiersz motywu do dołu; dolny padding trzyma go nad paskiem gestów.
   Selektor przez zawartość, nie uniqueId ani :last-child, przeżyje dołożenie bloku.
   (0,4,0) bije Global Style i regułę `margin-block: 0` wyżej. */
.u-menu-overlay.gb-menu-container--mobile > .gb-text:has(> .fwa-motyw--nakladka) {
  margin-block-start: auto;
}

/* `flex: 0 0 auto`, bo w pasku kontener siedzi w elemencie flex i przy ciasnym
   nagłówku skurczyłby się poniżej celu dotykowego. `color: inherit`: ikona ma być
   w kolorze paska bez osobnej reguły na breakpoint. */
.fwa-motyw {
  flex: 0 0 auto;
  align-items: center;
  color: inherit;
}

.fwa-motyw--pasek { display: var(--fdn-motyw-pasek, inline-flex); }

/* Nakładka menu ma własne tło i kolor tekstu; bez jawnego `color` ikony
   dziedziczyłyby prawie czarny na granacie. Przełącznik stoi pod menu jako osobna
   sekcja, stąd kreska nad wierszem (ta sama, którą u-menu-overlay stawia pod
   pozycjami). display z tokenu, który w nakładce ma `flex`, nie `block`. */
.fwa-motyw--nakladka {
  display: var(--fdn-motyw-nakladka, flex);
  justify-content: space-between;
  padding-block-start: var(--fdn-spacing-md);
  border-block-start: var(--fdn-border-width-hairline) solid var(--fdn-color-menu-overlay-border);
  margin-block-start: var(--fdn-spacing-md);
  color: var(--fdn-color-menu-overlay-text);
}

/* Podpis „Motyw". Kolor dziedziczy z kontenera; krycie zbija go o stopień poniżej
   pozycji menu, żeby wiersz nie konkurował z nawigacją. */
.fwa-motyw__etykieta {
  font-size: var(--fdn-font-size-sm);
  opacity: 0.85;
}

.fwa-motyw__grupa {
  display: flex;
  align-items: center;
}

/* Pozycja 26x26 przy zerowym odstępie: ponad minimum 24x24 z WCAG 2.5.8, cała
   grupa ma 78 px. Wartość wprost, bo --fdn-size-control (48) zrobiłby z trzech
   ikon pasek szeroki na 144 px. */
.fwa-motyw__opcja {
  display: grid;
  flex: 0 0 auto;
  place-items: center;
  inline-size: 26px;
  block-size: 26px;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  cursor: pointer;
}

/* GP maluje `button:hover` kolorem marki (0,1,1). Obrączka fokusu zostaje
   z reguły globalnej. */
.fwa-motyw__opcja:hover,
.fwa-motyw__opcja:focus,
.fwa-motyw__opcja:active {
  background: none;
  color: inherit;
}

/* Stan niesie krycie, a nosi je ikona, nie przycisk: krycie na przycisku
   przygaszałoby też pierścień fokusu, który musi trzymać 3:1 (WCAG 1.4.11).
   0,5 zamiast 0,38: ciemny tusz na bieli traci kontrast przy alfie szybciej niż
   biel na granacie (pasek jasny 3,4:1 przy 0,5, 2,4:1 przy 0,38). Jedna wartość
   dla obu wariantów, bo instancje nie są widoczne naraz. Kolor zamiast krycia
   wykluczony: ikona ma być tym samym tuszem co reszta paska, tylko słabszym. */
.fwa-motyw__ikona {
  flex: 0 0 auto;
  inline-size: var(--fdn-icon-size-sm);
  block-size: var(--fdn-icon-size-sm);
  opacity: 0.5;
  transition: opacity var(--fdn-duration-ms-fast) var(--fdn-easing-standard);
}

.fwa-motyw__opcja[aria-pressed="true"] .fwa-motyw__ikona { opacity: 1; }

/* Najechanie dotyczy tylko pozycji niewybranej: wybrana jest na pełnym kryciu
   i każda zmiana byłaby krokiem w dół. */
.fwa-motyw__opcja:not([aria-pressed="true"]):hover .fwa-motyw__ikona { opacity: 0.7; }

/* Układ odniesienia transformacji. Bez `fill-box` jest nim cały viewBox i ikona
   odjeżdża poza kadr. */
.fwa-motyw__tarcza,
.fwa-motyw__wycinek,
.fwa-motyw__polowa,
.fwa-motyw__promienie {
  transform-box: fill-box;
  transform-origin: center;
}

/* Stan wyjściowy = słońce (motyw jasny). Wycinek stoi poza tarczą, połowa jest
   przezroczysta. */
.fwa-motyw__wycinek { transform: translateX(0); }
.fwa-motyw__polowa { opacity: 0; }
.fwa-motyw__promienie { opacity: 1; }

/* Każda ikona ma stan wpisany w modyfikator klasy: pokazuje, co pozycja robi, nie
   co jest wybrane. Ciemny: tarcza rośnie, wycinek wjeżdża w nią i robi półksiężyc,
   promienie gasną. Auto: pół tarczy zasłania prostokąt maski. */
.fwa-motyw__ikona--dark .fwa-motyw__tarcza { transform: scale(1.75); }
.fwa-motyw__ikona--dark .fwa-motyw__wycinek { transform: translateX(-7px); }
.fwa-motyw__ikona--dark .fwa-motyw__promienie { opacity: 0; }
.fwa-motyw__ikona--auto .fwa-motyw__polowa { opacity: 1; }

/* Całym efektem zmiany motywu jest domyślne przenikanie przeglądarki, fwa.js nie
   rysuje własnej animacji. Bez resetu `animation: none`: zabiłby to, co ma być
   widać. Zostaje samo wydłużenie z 0,25 s. */
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: var(--fdn-duration-ms-slow);
}

/* „Ogranicz ruch": fwa.js nie zaczyna przejścia, ta reguła domyka temat po
   stronie przeglądarki. !important, bo animacje pseudoelementów przejścia są
   w warstwie UA. */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*),
  ::view-transition-old(*),
  ::view-transition-new(*) {
    animation: none !important;
  }
}


/* =============================================================================
   8. AKTUALNOŚCI
   Karta listingu składa się z bloków GB, ale metryczka (wrapper, kategoria, data)
   i zdjęcie przychodzą ze skrótkodów, dlatego te klasy mają tu regułę; slot zdjęcia
   jest blokiem z bazy i ma tu tylko regułę zwijającą.
   ============================================================================= */

/* Nie brand: 2,91:1 przy progu 4,5 dla 13 px. action-primary daje 4,60 w jasnym
   i 4,80 w ciemnym. */
.fwa-akt__kat { color: var(--fdn-color-action-primary); font-weight: 600; }
.fwa-akt__data { color: var(--fdn-color-text-muted); }

/* Wrapper metryczki ze skrótkodu [fwa_wpis_meta]: separator „ · " to goły tekst
   wrappera i bez własnej reguły dziedziczył prawie czarny kolor akapitu między
   dwoma jaśniejszymi napisami. Kolor jak data (text-muted), nie text-secondary:
   separator nie może być ciemniejszy od żadnej z części. Na bg-raised 4,99 i 4,57
   przy progu 4,5. Etykieta w nagłówku wpisu bierze swoje z sekcji 2 selektorem (0,3,0). */
.fwa-akt__meta { color: var(--fdn-color-text-muted); }

/* Zdjęcie kładzie się na kafel „Zdjęcie wpisu"; reszta z u-img-cover.
   pointer-events: none jest konieczne: cała karta klika przez nakładkę ::before
   pierwszego linku (u-container-link), a obrazek jest pozycjonowany z z-index: auto
   i stojąc w markupie po linku tytułu przykrywałby nakładkę. Obrazek jest dekoracją. */
.fwa-akt__img { inset: 0; pointer-events: none; position: absolute; }

/* Karta bez zdjęcia jest kartą tekstową: slot zdjęcia (blok GB z bazy,
   bg-tint-blue, 193 px) bez obrazka zwija się cały. Sygnał jest w DOM: obrazek
   nosi klasę .fwa-akt__img ze skrótkodu. Nie filtrem PHP, bo render_block wewnątrz
   pętli GB nie wie, którego wpisu dotyczy. Bez zawężenia do listingu: trójka
   „Więcej aktualności" pod wpisem ma ten sam markup bez .fwa-akt__grid. body +
   :has() dają (0,2,1) nad CSS per blok i u-placeholder (0,1,0) ładowanymi później. */
body .fwa-akt__photo:not(:has(.fwa-akt__img)) { display: none; }

/* Galeria wychodzi z limitu kolumny czytania (640). Druga klauzula konieczna:
   bento wchodzi też na typ `projekt` (inc/galeria.php). */
.single-post .entry-content > .fwa-galeria,
.single-projekt .entry-content > .fwa-galeria { max-inline-size: none; }

/* Skrót `grid-template` jest tu niemożliwy: jego składnia przeplata rozmiar rzędu
   po każdym stringu obszarów, więc z dwóch osobnych tokenów (obszary i rozmiary
   rzędów) nie da się go złożyć. Rozdzielenie na tokeny jest warunkiem tego, żeby
   układ przełączał się w tokens.css, nie media query tutaj. */
/* stylelint-disable declaration-block-no-redundant-longhand-properties -- shorthand grid-template nie składa się z osobnych tokenów obszarów i rzędów */
.fwa-galeria {
  display: grid;
  gap: var(--fdn-gallery-gap);
  grid-template-areas: var(--fdn-gallery-areas);
  grid-template-columns: var(--fdn-gallery-cols);
  grid-template-rows: var(--fdn-gallery-rows);
}
/* 2-5 zdjęć: bez bento, równe kafle */
.fwa-galeria--rowna {
  grid-template-areas: none;
  grid-template-columns: repeat(auto-fill, minmax(min(240px, 100%), 1fr));
  grid-template-rows: none;
}
/* stylelint-enable declaration-block-no-redundant-longhand-properties */
.fwa-galeria--rowna .fwa-galeria__kafel { aspect-ratio: 3 / 2; }
.fwa-galeria__kafel { display: block; overflow: hidden; position: relative; }
.fwa-galeria__kafel img { block-size: 100%; display: block; inline-size: 100%; object-fit: cover; }
.fwa-galeria:not(.fwa-galeria--rowna) .fwa-galeria__kafel:nth-of-type(1) { grid-area: a; }
.fwa-galeria:not(.fwa-galeria--rowna) .fwa-galeria__kafel:nth-of-type(2) { grid-area: b; }
.fwa-galeria:not(.fwa-galeria--rowna) .fwa-galeria__kafel:nth-of-type(3) { grid-area: c; }
.fwa-galeria:not(.fwa-galeria--rowna) .fwa-galeria__kafel:nth-of-type(4) { grid-area: d; }
.fwa-galeria:not(.fwa-galeria--rowna) .fwa-galeria__kafel:nth-of-type(5) { grid-area: e; }
.fwa-galeria:not(.fwa-galeria--rowna) .fwa-galeria__kafel:nth-of-type(6) { grid-area: f; }
.fwa-galeria__ukryty { display: none; }

/* Plakietka „+N zdjęć": tekst wchodzi atrybutem z PHP. Przyciemnienie tokenem,
   nie wartością: jedynym miejscem z kolorami na sztywno ma zostać pole „Własne
   style formularza darowizn". */
.fwa-galeria__wiecej::after {
  align-items: center;
  background-color: var(--fdn-alpha-ink-62);
  color: var(--fdn-neutral-0);
  content: attr(data-fwa-wiecej);
  display: flex;
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-md);
  font-weight: 600;
  inset: 0;
  justify-content: center;
  position: absolute;
}

/* =============================================================================
   9. PODGLĄD ZDJĘĆ I FILMÓW (nakładka GLightbox)
   Kafle i kotwice renderuje PHP, licznik i pasek miniatur dokłada fwa.js do
   .glightbox-container. Kolory nakładki należą do biblioteki, tu tylko to, co
   dokładamy.
   ============================================================================= */

/* Plakietka play na kaflu filmu. Koło z tokenu alpha-ink-62 jak plakietka „+N zdjęć":
   biel na tym przyciemnieniu trzyma 8:1 także nad jasnym kadrem. Trójkąt z ramek,
   bo ikona SVG wymagałaby markupu w trzech miejscach. Rozmiar tokenem, podmienianym
   na miniaturze profilu, gdzie koło 48px na kwadracie 100px zakrywa kadr. */
.fwa-galeria__play {
  position: absolute;
  inset-block-start: 50%;
  inset-inline-start: 50%;
  display: grid;
  place-items: center;
  inline-size: var(--fdn-lightbox-play);
  block-size: var(--fdn-lightbox-play);
  transform: translate(-50%, -50%);
  border-radius: var(--fdn-radius-full);
  background-color: var(--fdn-alpha-ink-62);
}

.fwa-galeria__play::after {
  content: "";
  margin-inline-start: 12%;
  border-block: calc(var(--fdn-lightbox-play) / 6) solid transparent;
  border-inline-start: calc(var(--fdn-lightbox-play) / 3.7) solid var(--fdn-neutral-0);
}

.fwa-profile__thumb .fwa-galeria__play { --fdn-lightbox-play: 32px; }

/* Kafel filmu bez postera nie potrzebuje własnego tła: płytę wnosi ten sam
   .fwa-placeholder co karta podopiecznego bez zdjęcia (sekcja 5). Klasa zostaje
   jako czytelny sygnał w DOM, że kadru nie ma. */

/* Nakładka: licznik i pasek miniatur. z-index 10000 wystarcza, mimo że slajd ma
   w bibliotece 99999: .gcontainer jest kontekstem układania, a my jesteśmy jego
   sąsiadem. pointer-events: none na opakowaniu konieczne: pas siedzi na całej
   szerokości, a klik w tło zamyka nakładkę. */
.fwa-podglad {
  position: absolute;
  inset-block-end: 0;
  inset-inline: 0;
  z-index: 10000;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--fdn-spacing-xs);
  padding: var(--fdn-spacing-sm);
  pointer-events: none;
}

/* Biel na nakładce: tło to #000, od 769px rgba(0, 0, 0, 0.92), nawet nad białą
   stroną 18,4:1. tabular-nums, żeby licznik nie skakał przy zmianie z 9 na 10.
   margin: 0 bije `p` z GP specyficznością klasy. */
.fwa-podglad__licznik {
  margin: 0;
  color: var(--fdn-neutral-0);
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-sm);
  font-variant-numeric: tabular-nums;
  pointer-events: auto;
}

/* O widoczności paska decyduje token, nie zapytanie medialne tutaj ani JS.
   touch-action: pan-x jest zapisem intencji: .glightbox-container ma touch-action:
   none, a przeglądarka liczy gest z całego łańcucha przodków, więc na dotyku pasek
   może się nie przewijać; aktywna miniatura sama wjeżdża w widok. */
.fwa-podglad__pasek {
  display: var(--fdn-lightbox-thumbs);
  gap: var(--fdn-spacing-2xs);
  max-inline-size: 100%;
  padding-block: var(--fdn-spacing-2xs);
  overflow-x: auto;
  pointer-events: auto;
  scrollbar-width: thin;
  touch-action: pan-x;
}

/* Miniatura. Proporcja 3:2 liczona z tokenu wysokości, żeby kafle nie skakały
   przy różnych proporcjach zdjęć. Reset paddingu, ramki i tła, bo GP styluje
   `button` po nazwie elementu. */
.fwa-podglad__mini {
  flex: 0 0 auto;
  inline-size: calc(var(--fdn-lightbox-mini) * 3 / 2);
  block-size: var(--fdn-lightbox-mini);
  padding: 0;
  border: 0;
  border-radius: var(--fdn-radius-sm);
  background: none;
  opacity: 0.55;
  overflow: hidden;
  cursor: pointer;
  transition: opacity var(--fdn-duration-ms-fast) var(--fdn-easing-standard);
}

.fwa-podglad__mini img {
  display: block;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

/* GP maluje `button:hover` kolorem marki, ta sama pułapka co przy
   .fwa-motyw__opcja w sekcji 7. */
.fwa-podglad__mini:hover,
.fwa-podglad__mini:focus,
.fwa-podglad__mini:active {
  background: none;
  opacity: 1;
}

/* Miniatura filmu bez postera i zdjęcia bez miniatury. Reguła stoi po resecie tła
   wyżej i łapie też :hover, inaczej reset zdmuchnąłby płytę. */
.fwa-podglad__mini--pusto,
.fwa-podglad__mini--pusto:hover,
.fwa-podglad__mini--pusto:focus {
  background-color: var(--fdn-color-bg-raised);
}

/* Plakietka play na miniaturze filmu, ta sama konwencja co kafel, ale
   pseudoelementami: pasek składa fwa.js i jedna klasa na przycisku jest tańsza niż
   dokładany <span>. Rozmiar z osobnego tokenu, bo koło 48px na miniaturze 84x56
   zakryłoby kadr. Trójkąt nie przejmuje przesunięcia 12% z kafla: procent liczy się
   od szerokości przycisku, nie koła. Krycie: opacity na przycisku tworzy grupę
   i dziecka nie da się wyłączyć; biel przy 0,55 nad kołem trzyma 3,2:1 w najgorszym
   przypadku. */
.fwa-podglad__mini--film { position: relative; }

.fwa-podglad__mini--film::before,
.fwa-podglad__mini--film::after {
  content: "";
  position: absolute;
  inset-block-start: 50%;
  inset-inline-start: 50%;
  transform: translate(-50%, -50%);
  pointer-events: none;
}

.fwa-podglad__mini--film::before {
  inline-size: var(--fdn-lightbox-play-mini);
  block-size: var(--fdn-lightbox-play-mini);
  border-radius: var(--fdn-radius-full);
  background-color: var(--fdn-alpha-ink-62);
}

.fwa-podglad__mini--film::after {
  margin-inline-start: calc(var(--fdn-lightbox-play-mini) * 0.12);
  border-block: calc(var(--fdn-lightbox-play-mini) / 6) solid transparent;
  border-inline-start: calc(var(--fdn-lightbox-play-mini) / 3.7) solid var(--fdn-neutral-0);
}

/* Aktywna miniatura: pełne krycie i obrys, bo samo krycie 55/100% nie jest sygnałem
   dla kogoś, kto tej różnicy nie widzi. Obrys biały, bo tło nakładki jest zawsze
   czarne; outline-offset ujemny, żeby obrys był w kaflu, nie obok. */
.fwa-podglad__mini[aria-current="true"] {
  outline: var(--fdn-border-width-thick) solid var(--fdn-neutral-0);
  outline-offset: calc(-1 * var(--fdn-border-width-thick));
  opacity: 1;
}

/* Zdjęcie nie ma wchodzić pod nakładkę: biblioteka daje obrazkowi max-height 100vh
   (od 769px 97vh), zabieramy z tego zapas nakładki. Klasę wpisuje fwa.js na
   .glightbox-container: pierwszą zawsze, drugą gdy pasek powstał. (0,2,1) bije
   regułę biblioteki (0,1,1). */
.fwa-podglad-jest .gslide-image img { max-block-size: calc(100vh - var(--fdn-lightbox-reserve)); }
.fwa-podglad-pasek .gslide-image img { max-block-size: calc(100vh - var(--fdn-lightbox-reserve-pasek)); }


/* =============================================================================
   10. PROJEKTY
   Karty i lista lat przychodzą w całości ze skrótkodów [fwa_projekty_realizacja]
   i [fwa_projekty_zakonczone], więc layout musi stać tutaj. Prefiks `body`, bo
   Global Styles (u-card) ładują się po tym arkuszu. Listing stoi na siatce
   trójkowej jak pozostałe siatki kart w serwisie.
   ============================================================================= */

/* Siatka jak body .fwa-rezultaty__siatka w sekcji 4 i .fwa-zbiorki__grid (blok
   z bazy), ten sam zapis celowo: auto-fill trzyma rozmiar karty przy jednej
   pozycji, min(320px, 100%) nie przewija strony w poziomie przy 320 px okna.
   Wariant --skrot niżej nadpisuje wszystkie trzy deklaracje. */
body .fwa-projekty {
  display: grid;
  gap: var(--fdn-spacing-xl);
  grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr));
}

body .fwa-projekt {
  display: flex;
  flex-direction: column;
  gap: var(--fdn-spacing-sm);
  padding: var(--fdn-spacing-lg);
}

/* Tytuł karty jest h3, więc GP dałby mu krój nagłówkowy i własny rytm marginesów.
   Krojem zostaje body: nagłówkiem tytuł jest tylko w drzewie dokumentu. To samo
   dotyczy .fwa-lata__rok i __tytul. Stopień md (20), żeby tytuł różnił się od
   wierszy danych nie tylko wagą; stałą wysokość dwóch wierszy daje reguła 2lh
   w sekcji 4, z której kafelki --skrot są wyjęte. */
body .fwa-projekt__tytul {
  font-family: var(--fdn-font-family-body);
  font-size: var(--fdn-font-size-md);
  font-weight: 600;
  line-height: var(--fdn-line-height-body);
  margin-block: 0;
}

/* Zajawka na base (16): na sm (13) była najmniejszym tekstem w karcie, a realna
   treść pod 16 px nie jest wzorcem do powielania. Kolor drugorzędny, bo treść
   karty ma być cichsza od tytułu przy równych stopniach. */
body .fwa-projekt__zajawka {
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-base);
  margin-block: 0;
}

/* Wiersze danych: lista definicji, dt etykieta, dd wartość, para w div. Stopień
   base, bo wchodzi też w treść pojedynczego projektu, gdzie 13 px w kolumnie 640
   to za mało. Wygląd jednowierszowy: dt i dd inline, dwukropek z dt::after
   (prezentacja, w markupie go nie ma), odstęp to spacja z markupu (</dt> <dd>).
   Resety nie na zapas: GP daje dt font-weight bold, a dd margin 0 1.5em 1.5em,
   z którego inline dd wziąłby 1.5em odstępu po dwukropku. */
body .fwa-projekt__meta {
  color: var(--fdn-color-text-secondary);
  display: flex;
  flex-direction: column;
  font-size: var(--fdn-font-size-base);
  gap: var(--fdn-spacing-2xs);
  margin-block: 0;
}

body .fwa-projekt__meta dt,
body .fwa-projekt__meta dd {
  display: inline;
  font-weight: inherit;
  margin: 0;
}

body .fwa-projekt__meta dt::after { content: ":"; }

/* Wariant skrócony: kafelek zapowiadający sekcję projektów na innej stronie
   ([fwa_projekty_realizacja tryb="skrot"]), nieodróżnialny od bloków GB, których
   markup zastępuje. Oba selektory mają (0,2,0) jak reguły bazowe, więc muszą stać
   po nich. auto-fit, nie auto-fill: przy jednym projekcie kafel ma rozpiąć się na
   całą szerokość, bo kafelki są zapowiedzią, nie katalogiem. */
body .fwa-projekty--skrot {
  display: grid;
  gap: var(--fdn-spacing-lg);
  grid-template-columns: repeat(auto-fit, minmax(min(480px, 100%), 1fr));
}

body .fwa-projekt--skrot { gap: var(--fdn-spacing-xs); }

/* Bez reguły koloru linku w karcie: jedynym linkiem pełnej karty jest przycisk
   u-btn-secondary, któremu (0,1,1) narzucałoby kolor linku zamiast text-on-secondary
   z Global Style (0,1,0). Link w tytule kafelka --skrot ma własną regułę niżej. */

/* Tytuł kafelka skrótu jest linkiem (kafelek klikalny cały), ale wygląda jak tytuł:
   kolor tekstu, bez podkreślenia w spoczynku, wzorem body .fwa-rezultat h3 a.
   (0,2,2) bije stany GP `a:hover, a:focus, a:active` (0,1,1) i kolor z Customizera. */
body .fwa-projekt--skrot .fwa-projekt__tytul a {
  color: inherit;
  text-decoration: none;
}

body .fwa-projekt--skrot .fwa-projekt__tytul a:hover { text-decoration: underline; }

body .fwa-lata {
  display: flex;
  flex-direction: column;
  /* 40 px nie ma tokenu: skala spacing skacze 32 -> 48, a naciąganie odstępu
     między latami do najbliższego tokenu psuło rytm. */
  gap: 40px;
}

body .fwa-lata__grupa {
  display: flex;
  flex-direction: column;
  gap: var(--fdn-spacing-md);
}

body .fwa-lata__rok {
  font-family: var(--fdn-font-family-body);
  font-size: var(--fdn-font-size-base);
  font-weight: 600;
  line-height: var(--fdn-line-height-body);
  margin-block: 0;
}


body .fwa-lata__poz {
  display: flex;
  flex-direction: column;
  gap: var(--fdn-spacing-2xs);
}

body .fwa-lata__tytul {
  font-family: var(--fdn-font-family-body);
  font-size: var(--fdn-font-size-base);
  font-weight: 600;
  line-height: var(--fdn-line-height-body);
  margin-block: 0;
}

body .fwa-lata__opis {
  color: var(--fdn-color-text-secondary);
  font-size: var(--fdn-font-size-sm);
  margin-block: 0;
}


/* =============================================================================
   11. STRONA 404
   Treść przychodzi w całości z content-404.php, więc layout musi stać tutaj.
   Prefiks `body` daje (0,1,1): GP maluje `p { margin-bottom: 1.5em }` i h1 inline
   z Customizera, a klasy typografii i .u-btn to Global Styles ładowane po tym
   arkuszu. Padding 112/128 na desktopie i 80/96 na mobile z mnożników 1,75 i 2
   na --fdn-space-section (rozjazd najwyżej cztery piksele za cenę zera @media).
   ============================================================================= */

/* Pudełko artykułu na 404 nie wnosi własnego pionowego odstępu, cały liczy .fwa-404
   niżej; inaczej padding z Customizera (Content Padding, domyślnie 40/30) dokładał
   się do 112/128 wartością z bazy. Padding poziomy zostaje: w separate-containers to
   jedyny gutter treści. (0,2,1) bije `.separate-containers .inside-article` (0,2,0). */
body.error404 .inside-article { padding-block: 0; }

body .fwa-404 {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--fdn-spacing-lg);
  padding-block: calc(var(--fdn-space-section) * 1.75) calc(var(--fdn-space-section) * 2);
  text-align: center;
}

/* Cyfra „404" jest akapitem, nie nagłówkiem (h1 niesie zdanie), stąd kolor
   drugorzędny: etykieta błędu, nie tytuł (7,41 w jasnym, 8,24 w ciemnym).
   Typografia tutaj, nie klasą typograficzną: klasa t-heading-h1 stała się etykietą
   podstrony (16 px) i cyfra zjechała z nią. Akapit nie dziedziczy od GP rodziny
   ani wagi nagłówka, stąd komplet deklaracji; waga literalna 700, bo drabinka nie
   ma tokenu wagi. */
body .fwa-404__kod {
  margin: 0;
  color: var(--fdn-color-text-secondary);
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-font-size-2xl);
  font-weight: 700;
  line-height: var(--fdn-line-height-heading);
}

body .fwa-404__tytul {
  /* Rozmiar własny: xl (31 px), nie 2xl, bo to h1 wyśrodkowany, a zielona kreska
     z t-heading-section przy wyśrodkowanym nagłówku by odstawała. */
  font-size: var(--fdn-font-size-xl);
  margin: 0;
  color: var(--fdn-color-text-primary);
}

body .fwa-404__lead {
  max-inline-size: var(--fdn-container-sm);
  margin: 0;
  color: var(--fdn-color-text-secondary);
}

body .fwa-404__linki {
  margin: 0;
  color: var(--fdn-color-text-secondary);
}

/* Kolor z roli link, nie action-primary: action-primary na pasie bg-alt daje 4,32:1
   przy progu 4,5; link 6,09 i 8,09, hover 8,82 i 10,16. Stany przez :is(), bo reguła
   GP to `a:hover, a:focus, a:active` w jednym bloku. */
body .fwa-404__linki a { color: var(--fdn-color-link); }
body .fwa-404__linki a:is(:hover, :focus, :active) { color: var(--fdn-color-link-hover); }


/* =============================================================================
   12. PAKIET RUCHU
   Klikalność kart, wejścia przy scrollu, pasek zbiórki, przygaszenie siatki,
   płynny nagłówek, pierścień fokusu na całej karcie. Wszystkie czasy wyłącznie
   z tokenów --fdn-duration-ms-*, więc „ogranicz ruch" w sekcji 4 gasi całość
   podmianą tokenów. Odliczanie liczb nie ma reguły: liczy je fwa.js.
   ============================================================================= */

/* Karta z przyciskiem nie jest klikalna całą powierzchnią: klika się przycisk, tytuł
   zostaje linkiem. Klasę u-container-link niosą karty w bazie, więc gasimy samą
   nakładkę ::before. :has(.u-btn) jest treścią reguły: karta bez przycisku zostaje
   klikalna cała. Przeglądarka bez :has() odrzuca regułę i karty klikają jak dotąd. */
body .u-container-link:has(.u-btn) a:first-of-type::before { content: none; }

/* Ramka hover z Global Styles (u-container-link:hover) sygnalizuje „cała karta
   kliknie"; na karcie z przyciskiem to nieprawda, więc wraca kolor spoczynkowy.
   (0,3,1) bije Global Style (0,2,0). */
body .u-container-link:has(.u-btn):hover { border-color: var(--fdn-color-border); }

/* Pierścień fokusu na całej karcie klikalnej całą powierzchnią: obwódka na samym
   linku wygląda jak przypadek. Wygląd 1:1 z globalnym pierścieniem; box-shadow
   nadpisuje cień karty. Tylko karty bez przycisku. Bez :has() obie reguły wypadają
   i zostaje pierścień na linku, zgodny z WCAG 2.4.7. */
.u-container-link:not(:has(.u-btn)) a:first-of-type:focus-visible {
  outline: none;
  box-shadow: none;
}

.u-container-link:not(:has(.u-btn)):has(a:first-of-type:focus-visible) {
  outline: var(--fdn-border-width-focus) solid var(--fdn-color-focus);
  outline-offset: var(--fdn-border-width-focus-offset);
  box-shadow: 0 0 0 var(--fdn-border-width-focus-offset) var(--fdn-color-focus-offset);
}

/* Wejścia przy scrollu. Klasy nośne fwa-reveal, fwa-reveal--foto i fwa-reveal-grupa
   wpina redaktor w treść stron; stan ukrycia fwa-reveal--poza dokłada wyłącznie
   fwa.js, więc bez JS i przy „ogranicz ruch" nic nie jest ukryte. --fwa-krok to
   numer dziecka w grupie (pisze fwa.js); krok kaskady liczony z tokenu, więc
   „ogranicz ruch" zeruje też opóźnienia. */
.fwa-reveal {
  transition:
    opacity var(--fdn-duration-ms-enter) var(--fdn-easing-decelerate)
      calc(var(--fdn-duration-ms-fast) / 3 * var(--fwa-krok, 0)),
    transform var(--fdn-duration-ms-enter) var(--fdn-easing-decelerate)
      calc(var(--fdn-duration-ms-fast) / 3 * var(--fwa-krok, 0));
}

/* Duże zdjęcie wchodzi samą przejrzystością, ruch dużego kadru wygląda ciężko.
   Skrót transition nadpisuje także delay, więc kaskada jest policzona od nowa. */
.fwa-reveal--foto {
  transition: opacity var(--fdn-duration-ms-enter) var(--fdn-easing-standard)
    calc(var(--fdn-duration-ms-fast) / 3 * var(--fwa-krok, 0));
}

.fwa-reveal--poza {
  opacity: 0;
  transform: translateY(14px);
}

.fwa-reveal--foto.fwa-reveal--poza { transform: none; }

/* Pasek zbiórki rośnie od zera. Klasę dokłada fwa.js przy wejściu w kadr, po
   ustawieniu width na 0; pasek z serwera (AJAX, brak JS, „ogranicz ruch") stoi od
   razu na wartości docelowej. width, nie inline-size: części właściwości logicznych
   przeglądarki nie animują. aria-valuenow z PHP nietknięte. */
.u-progress-bar.fwa-pasek--gra {
  transition: width var(--fdn-duration-ms-slow) var(--fdn-easing-decelerate);
}

/* Siatka przygasa na czas ładowania wyników; obie klasy dokłada fwa.js na sekcję.
   Nośnik przejścia osobno od stanu, żeby przygaśnięcie i powrót szły tą samą krzywą. */
.fwa-listing-anim { transition: opacity var(--fdn-duration-ms-base) var(--fdn-easing-standard); }
.fwa-listing-czeka { opacity: 0.55; }

/* Przyklejony nagłówek chudnie płynnie: przejście na tym samym nośniku min-height,
   co reguła w sekcji 4. Selektor bez gb-is-sticky, żeby zejście i powrót szły
   z przejściem. */
header.gb-site-header nav.gb-navigation {
  transition: min-height var(--fdn-duration-ms-base) var(--fdn-easing-standard);
}


/* =============================================================================
   13. HERO „SŁOWA"
   Hero strony głównej bez grafiki: trzy słowa nagłówka w trzech rolach
   kolorystycznych (trzecie na bloku limonki), lead i CTA w jednym rzędzie, okrągły
   przycisk „w dół". Cała rodzina wisi na modyfikatorze .fwa-hero--slowa, bo gołe
   klasy fwa-hero* nosi też starszy markup w bazie. Breakpointy tokenami
   --fdn-hero-s-*; blok hover niżej to media możliwości wskaźnika. Przyciski to
   Global Styles u-btn-donate/u-btn-secondary bez wariantu hero.
   ============================================================================= */

/* Sekcja: co najmniej cały viewport pod nagłówkiem (min-, więc przy niskim oknie
   rośnie). Treść wyśrodkowana w pionie, dolny padding rezerwuje pas na przycisk
   „w dół". Linia z 100vh to zapas dla przeglądarek bez svh. */
.fwa-hero--slowa {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-block-size: calc(100vh - var(--fdn-size-header));
  min-block-size: calc(100svh - var(--fdn-size-header));
  padding-block: var(--fdn-space-section) calc(var(--fdn-size-control) + 2 * var(--fdn-spacing-lg));
}

/* Kontener treści: szerokość i gutter ustawia blok GB w bazie, motyw daje układ.
   Mobile kolumna ze stretch; desktop rząd z zawijaniem, tytuł bierze całą pierwszą
   linię, lead i CTA dzielą drugą wyrównane do dołu, a przy braku miejsca CTA
   schodzi na trzecią. */
.fwa-hero--slowa .fwa-hero__inner {
  display: flex;
  flex-flow: var(--fdn-hero-s-inner-dir) wrap;
  align-items: var(--fdn-hero-s-inner-align);
  justify-content: space-between;
  gap: var(--fdn-spacing-xl) var(--fdn-spacing-2xl);
}

/* Nagłówek: Nunito 800, interlinia 1, tracking ujemny, rozmiar tokenem. Bez
   text-wrap: balance, wybrane naturalne łamanie. Tytuł jest flexem z zawijaniem:
   słowo = element flexa, odstępy niesie gap; na zwykłym bloku pionowy padding
   słowa wchodził na wiersz obok. */
.fwa-hero--slowa .fwa-hero__title {
  display: flex;
  flex-wrap: wrap;
  gap: 0.07em 0.25em;
  inline-size: 100%;
  margin-block: 0;
  font-family: var(--fdn-font-family-heading);
  font-size: var(--fdn-hero-s-title-size);
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--fdn-color-text-primary);
}

/* Słowa są elementami flexa, więc ich pudełko liczy się do wysokości wiersza: zero
   paddingu pionowego, żeby blok tła nie wchodził na sąsiedni wiersz. Odstęp robi
   column-gap 0.12em (powyżej połowy spacji bloki sąsiednich słów by się zetknęły).
   Słowa nie są linkami, markup musi trzymać spacje między spanami. */
.fwa-hero--slowa .fwa-hero__word {
  padding: 0 0.12em;
  margin-inline: -0.12em;
  border-radius: var(--fdn-radius-lg);
  transition:
    background-color var(--fdn-duration-ms-fast) var(--fdn-easing-standard),
    color var(--fdn-duration-ms-fast) var(--fdn-easing-standard);
}

.fwa-hero--slowa .fwa-hero__word--1 { color: var(--fdn-hero-s-word-1); }
.fwa-hero--slowa .fwa-hero__word--2 { color: var(--fdn-hero-s-word-2); }

.fwa-hero--slowa .fwa-hero__word--3 {
  color: var(--fdn-hero-s-word-3);
  background-color: var(--fdn-hero-s-word-3-bg);
}

/* Hover słów tylko dla wskaźnika precyzyjnego: na dotyku hover przykleja się po
   tapnięciu. To media możliwości urządzenia, nie szerokości. */
@media (hover: hover) and (pointer: fine) {
  .fwa-hero--slowa .fwa-hero__word--1:hover {
    color: var(--fdn-hero-s-word-1-hover);
    background-color: var(--fdn-hero-s-word-1-hover-bg);
  }

  .fwa-hero--slowa .fwa-hero__word--2:hover {
    color: var(--fdn-hero-s-word-2-hover);
    background-color: var(--fdn-hero-s-word-2-hover-bg);
  }

  .fwa-hero--slowa .fwa-hero__word--3:hover {
    color: var(--fdn-hero-s-word-3-hover);
    background-color: var(--fdn-hero-s-word-3-hover-bg);
  }
}

/* Lead: limit długości linii tą samą kolumną czytania, co wpisy i podstrony.
   20/1.5 liczbą, rozmiar stały na obu progach. */
.fwa-hero--slowa .fwa-hero__lead {
  max-inline-size: var(--fdn-container-text);
  margin-block: 0;
  font-size: 1.25rem;
  line-height: var(--fdn-line-height-body);
  color: var(--fdn-color-text-secondary);
}

/* CTA: mobile kolumna (stretch daje przyciskom całą szerokość), desktop rząd.
   W DOM przycisk wpłaty stoi pierwszy; na desktopie token order przerzuca go na
   koniec rzędu. Tab idzie wpłata -> podopieczni niezależnie od progu. */
.fwa-hero--slowa .fwa-hero__cta {
  display: flex;
  flex-direction: var(--fdn-hero-s-cta-dir);
  gap: var(--fdn-spacing-md);
}

.fwa-hero--slowa .fwa-hero__cta .u-btn-donate { order: var(--fdn-hero-s-donate-order); }

/* Przycisk „w dół": koło 48px (token size-control) na środku dolnej krawędzi sekcji.
   Centrowanie insetem z calc, nie transformem, bo transform niesie pętla kiwania.
   Ramka i szewron z tokenu (kontrast >= 3,0 w obu trybach), pierścień fokusu
   z globalnego :focus-visible po promieniu koła. */
.fwa-hero--slowa .fwa-hero__dalej {
  position: absolute;
  inset-block-end: var(--fdn-spacing-lg);
  inset-inline-start: calc(50% - var(--fdn-size-control) / 2);
  display: flex;
  align-items: center;
  justify-content: center;
  inline-size: var(--fdn-size-control);
  block-size: var(--fdn-size-control);
  border: var(--fdn-border-width-thick) solid var(--fdn-hero-s-dalej-color);
  border-radius: var(--fdn-radius-full);
  background-color: transparent;
  animation: fwa-hero-kiw var(--fdn-duration-ms-hero-kiw) var(--fdn-easing-standard) infinite;
}

/* Szewron: kwadrat z prawą i dolną ramką obrócony czubkiem w dół; ujemny margines
   centruje optycznie, bo czubek ciągnie masę poniżej środka. */
.fwa-hero--slowa .fwa-hero__dalej::before {
  content: "";
  inline-size: 14px;
  block-size: 14px;
  margin-block-start: -4px;
  border-block-end: var(--fdn-border-width-thick) solid var(--fdn-hero-s-dalej-color);
  border-inline-end: var(--fdn-border-width-thick) solid var(--fdn-hero-s-dalej-color);
  rotate: 45deg;
}

/* Kiwanie w pętli: czas z tokenu; „ogranicz ruch" zdejmuje pętlę wprost w sekcji 4,
   bo zero tokenu pętli nieskończonej nie zatrzymuje. Nic nie jest ukryte na starcie. */
@keyframes fwa-hero-kiw {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(6px); }
}

/* Kotwica skoku „w dół": sekcję docelową (id i ta klasa w markupie) odsuwa od górnej
   krawędzi o wysokość przyklejonego nagłówka, bo po skoku pasek jest już chudy.
   Klasa ogólna, nie część rodziny hero. */
.fwa-anchor { scroll-margin-block-start: var(--fdn-size-header-sticky); }


/* =============================================================================
   14. KOMUNIKATY GIVEWP
   Wtyczka drukuje komunikaty na stronach systemowych jako `.give_notices >
   p.give_notice.give_error`; jej reguły mają (0,1,0) bez !important, więc para klas
   niżej wygrywa niezależnie od kolejności. Zdjęte: tło #F9F9F9 i kreska #AA0000
   (kolory spoza rampy, tło w ciemnym 1,10 pod jasnym tekstem). Wartości przepisane
   z u-alert-error, bo klasy nie da się dopisać do markupu wtyczki. Komunikaty
   sukcesu i ostrzeżenia zostają w wyglądzie wtyczki, serwis ich nie pokazuje.
   ============================================================================= */

/* stylelint-disable selector-class-pattern -- nazwy klas naleza do GiveWP */
.give_notices .give_error {
  background-color: var(--fdn-color-feedback-error-bg);
  border-inline-start: var(--fdn-border-width-thick) solid var(--fdn-color-feedback-error);
  box-shadow: none;
  margin-block: var(--fdn-spacing-md);
  padding: var(--fdn-spacing-md);
}
/* stylelint-enable selector-class-pattern */


/* =============================================================================
   15. PAS LOGOTYPÓW PARTNERÓW
   Trzy sekcje zbudowane identycznie, każda z własnym prefiksem klas: „Partnerzy" na
   stronie głównej i na O Fundacji, „Firmy, które już z nami działają" na Współpracy
   z firmami. Klasy kafli niesie baza, reguła stoi w motywie, żeby była w gicie.
   `body` w selektorze daje (0,2,0) i wygrywa z zaślepką u-placeholder oraz z CSS-em
   per blok GenerateBlocks: obie mają (0,1,0).
   ============================================================================= */

/* Powierzchnia jasna w OBU motywach: cudzego znaku towarowego nie wolno
   przerysować ani przefiltrować. 88px, bo kwadratowy logotyp schodził w kaflu
   64px do około 44px. Promień i centrowanie za u-placeholder: redaktor zdejmuje
   tę klasę razem z zaślepką. */
body .fwa-of__logo,
body .fwa-firmy__logo,
body .fwa-partnerzy__logo {
  display: grid;
  place-items: center;
  min-block-size: 88px;
  border-radius: var(--fdn-radius-md);
  background-color: var(--fdn-color-surface-logo);
}

/* Logotypy partnerów mają różne proporcje (od 430x125 do 591x543), więc kafel
   ogranicza obrazek z obu stron, a contain pilnuje proporcji. */
body .fwa-of__logo img,
body .fwa-firmy__logo img,
body .fwa-partnerzy__logo img {
  max-block-size: 64px;
  max-inline-size: 100%;
  object-fit: contain;
}


/* =============================================================================
   16. PAS POWITALNY
   Jedno zdanie nad nagłówkiem: strona jest nowa, treści się uzupełniają. Markup
   wypisuje inc/powitanie.php, nie baza — pas ma zniknąć jednym commitem. Nagłówek
   tej instalacji NIE jest przyklejony (zmierzone: position static przy
   przewinięciu), więc pas odjeżdża razem z nim i nie potrzebuje ani
   position: sticky, ani rezerwy na --fdn-size-header-sticky.
   ============================================================================= */

/* Domyślnie widoczny: bez JS pas ma stać. Odwrotna logika (domyślnie ukryty,
   pokazywany skryptem) wyłączyłaby go każdemu, komu skrypt nie doszedł. */
.fwa-powitanie {
  background-color: var(--fdn-color-feedback-info-bg);
  border-block-end: var(--fdn-border-width-hairline) solid var(--fdn-color-border);
  color: var(--fdn-color-text-primary);
  padding-inline: var(--fdn-space-gutter);
}

/* Jedyne miejsce, które ten pas chowa. Atrybut na <html> pisze skrypt z <head>
   (przed arkuszami, więc bez mignięcia) i moduł w fwa.js po kliknięciu. (0,2,0)
   bije regułę bazową (0,1,0) niezależnie od kolejności. */
[data-fwa-powitanie="off"] .fwa-powitanie { display: none; }

/* Ten sam podział co u-section + u-container: gutter na zewnątrz, cap w środku. */
.fwa-powitanie__wnetrze {
  align-items: center;
  column-gap: var(--fdn-spacing-sm);
  display: flex;
  inline-size: 100%;
  margin-inline: auto;
  max-inline-size: var(--fdn-container-lg);
  padding-block: var(--fdn-spacing-2xs);
}

/* Tekst na text-primary, nie text-secondary: na tle info-bg to 16,2 : 1 w jasnym
   i 11,6 : 1 w ciemnym, a przygaszenie zjadłoby cały zapas w trybie ciemnym.
   margin-block zerem, bo to akapit i dostałby rytm treści. */
.fwa-powitanie__tekst {
  flex: 1 1 auto;
  font-size: var(--fdn-font-size-sm);
  line-height: var(--fdn-line-height-body);
  margin-block: 0;
}

.fwa-powitanie__tekst a { color: var(--fdn-color-link); }

/* 44 px to minimum WCAG 2.5.8; ikona jest mniejsza, pole kliknięcia nie. */
.fwa-powitanie__zamknij {
  align-items: center;
  background-color: transparent;
  border: 0;
  border-radius: var(--fdn-radius-sm);
  color: var(--fdn-color-text-primary);
  cursor: pointer;
  display: inline-flex;
  flex: 0 0 auto;
  justify-content: center;
  min-block-size: var(--fdn-size-touch-min);
  min-inline-size: var(--fdn-size-touch-min);
  padding: 0;
}

.fwa-powitanie__zamknij svg {
  block-size: var(--fdn-icon-size-md);
  inline-size: var(--fdn-icon-size-md);
}

/* Na papierze komunikat o stanie serwisu nie znaczy nic. */
@media print {
  .fwa-powitanie { display: none; }
}
