/* bold — assets/css/styles.css
   PLIK GENEROWANY z partiali w template-parts/scss.
   Nie edytuj go ręcznie — poprawki idą do partiala, potem:
   python3 narzedzia/zbuduj-arkusz.py
   Kolejność partiali: main.scss */

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* =========================================================
   BOLD — HOME
   Makieta statyczna strony głównej. Reset, zmienne i komponenty
   przeniesione dokładnie ze styleguide'u (bold-styleguide.html) —
   zero nowych wartości projektowych. Czysty HTML5 + CSS (Custom
   Properties). Zero JS, zero bibliotek, dwa kroje z Google Fonts (Anton + Archivo).
   Mobile first — breakpointy wyłącznie 600px / 1024px.
   ========================================================= */

/* ---------- 1. ZMIENNE (identyczne ze styleguide'em) ---------- */
:root{
  /* Kolory */
  --color-black:#111111;
  --color-white:#ffffff;
  --color-neon:#e8ff00;
  --color-gray:#666666;
  --color-bg-section:#f2f2f2;

  /* Obramowania */
  --border-standard:2px;
  --border-container:3px;
  --border-divider:3px;

  /* Cienie — wyłącznie twarde, zero rozmycia */
  --shadow-offset:4px;
  --focus-offset:3px;
  --shadow-hard: var(--shadow-offset) var(--shadow-offset) 0 0 var(--color-black);
  --shadow-hard-sm: 2px 2px 0 0 var(--color-black);
  --shadow-hard-lg: 8px 8px 0 0 var(--color-black);

  /* Zaokrąglenia — brak, zawsze 0 */
  --radius-none:0;

  /* Skala odstępów */
  --space-1:4px;
  --space-2:8px;
  --space-3:12px;
  --space-4:16px;
  --space-5:24px;
  --space-6:32px;
  --space-7:48px;
  --space-8:64px;
  --space-9:96px;

  /* Asymetria — wysunięcie poza siatkę */
  --overlap-title:40px;

  /* Typografia */
  /* Kroje: Anton (display, jedna waga 400, wersaliki) + Archivo (tekst, 400-700).
     Anton zawiera subset latin-ext — polskie diakrytyki bez fallbacku. */
  --font-display: "Anton", "Arial Narrow", Impact, sans-serif;
  --font-family-base: "Archivo", system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;

  --fs-h1:36px;
  --fs-h2:28px;
  --fs-h3:20px;
  --fs-h4:18px;
  --fs-lead:20px;
  --fs-body:16px;
  --fs-meta:14px;
  --fs-micro:12px;

  --lh-tight:1.22;
  --lh-display:1.3;
  --lh-normal:1.75;

  --tracking-tight:-0.02em;
  --tracking-display:-0.01em;
  --tracking-normal:0;
  --tracking-wide:0.08em;

  /* Wagi ograniczone do zakresu wczytywanego z Archivo (400-700).
     Nagłówki displayowe idą na Anton, który ma wyłącznie wagę 400. */
  --fw-regular:400;
  --fw-medium:500;
  --fw-bold:600;
  --fw-heavy:700;
  --fw-black:700;

  /* Siatka */
  --container-max:1200px;
  --text-col-max:780px;

  /* Sloty reklamowe — rezerwacja wysokości, zero CLS */
  --ad-mobile-w:300;
  --ad-mobile-h:50;
  --ad-tablet-w:728;
  --ad-tablet-h:90;
  --ad-desktop-w:1150;
  --ad-desktop-h:90;

  --ad-footer-w:300;
  --ad-footer-h:50;
}

:root{
  --fs-caption: 11px;
  --color-gray-light: #d9d9d9;
}


/* ===== z makiety: 404.html ===== */

:root{
  --fs-404: 120px;
}

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* ---------- 2. RESET (identyczny ze styleguide'em) ---------- */
*, *::before, *::after{ box-sizing:border-box; margin:0; padding:0; border-radius:var(--radius-none); }

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

body{
  font-family:var(--font-family-base);
  font-size:var(--fs-body);
  line-height:var(--lh-normal);
  color:var(--color-black);
  background:var(--color-white);
  -webkit-font-smoothing:antialiased;
}

img, picture{ max-width:100%; display:block; }

ul, ol{ list-style:none; }

a{ color:inherit; text-decoration:none; }

button{ font:inherit; color:inherit; background:none; border:0; cursor:pointer; }

input, textarea, select{ font:inherit; color:inherit; }

/* ---------- 3. STAN FOCUS (WYMAGANE WE WSZYSTKICH MAKIETACH) ---------- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
.btn-solid:focus-visible,
.btn-outline:focus-visible,
.pagination a:focus-visible{
  outline:3px solid var(--color-neon);
  outline-offset:var(--focus-offset);
}

.site-header a:focus-visible{ outline-color:var(--color-neon); }

.news-ticker__list a:hover,
.news-ticker__list a:focus-visible { color: var(--color-neon); border-bottom-color: var(--color-neon); }

/* 2. Badge kategorii jako odsyłacz do archiwum działu. */
a.tag { text-decoration: none; }

a.tag:hover { background: var(--color-neon); color: var(--color-black); }

/* ============================================================
   V3 — POPRAWKI PO AUDYCIE WYTYCZNYCH TRAFFIC PEAKS
   Dopisane na końcu, żeby łatwo było zobaczyć różnicę względem v2.
   Przy przenoszeniu do style.css motywu — wtopić w odpowiednie sekcje.
   ============================================================ */

/* Kadry bez plików graficznych (podgląd makiety) nie zapadają się na płasko. */
img{ background:repeating-linear-gradient(45deg,#f2f2f2 0 8px,#eaeaea 8px 16px); }

.visually-hidden{
  position:absolute; width:1px; height:1px; margin:-1px; padding:0;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
}

/* ---------- V3: klikalne zdjęcia w listingach (wytyczna 18) ----------
   Jeśli tytuł wpisu jest linkiem, kadr obok też prowadzi do wpisu.
   Link na obrazku jest pomocniczy: aria-hidden + tabindex="-1", żeby
   czytnik ekranu i Tab nie dostawały tego samego celu dwa razy. */
a.media-link{ display:block; height:100%; }

a.media-link img{ display:block; width:100%; height:100%; object-fit:cover; }

.hero-latest__arrow:focus-visible, .hero-latest__dots button:focus-visible{ outline:var(--border-container) solid var(--color-black); outline-offset:2px; }

.hero-latest .hero-latest__arrow:focus-visible,
.hero-latest .hero-latest__dots button:focus-visible{ outline-color:var(--color-neon); }


/* ===== z makiety: single.html ===== */

.post-toc__list a:focus-visible{ outline-color:var(--color-neon); }

/* 8. Tabela danych technicznych w treści wpisu — .post-table.
   Ta sama konwencja co .wp-block-table w blocks-comments.html:
   ramka kontenerowa 3 px, nagłówek na czerni w wersalikach, wiersze
   parzyste na tle sekcji. Wrapper przewija się w poziomie, żeby
   tabela nigdy nie rozpychała dokumentu na wąskich ekranach. */
.visually-hidden{
  position:absolute;
  width:1px;
  height:1px;
  overflow:hidden;
  clip:rect(0,0,0,0);
  white-space:nowrap;
}


/* ===== z makiety: category.html ===== */

/* ---------- 3. STAN FOCUS (WYMAGANE WE WSZYSTKICH MAKIETACH) ---------- */
a:focus-visible,
button:focus-visible,
.pagination a:focus-visible{
  outline:3px solid var(--color-neon);
  outline-offset:var(--focus-offset);
}


/* ===== z makiety: 404.html ===== */

input{ font:inherit; color:inherit; }

/* ---------- 3. STAN FOCUS (WYMAGANE WE WSZYSTKICH MAKIETACH) ---------- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
.pagination a:focus-visible{
  outline:3px solid var(--color-neon);
  outline-offset:var(--focus-offset);
}


/* ===== z makiety: author.html ===== */

/* ---------- 3. STAN FOCUS (WYMAGANE WE WSZYSTKICH MAKIETACH) ---------- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
.pagination a:focus-visible{
  outline:3px solid var(--color-neon);
  outline-offset:var(--focus-offset);
}

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

h1,h2,h3,h4{ line-height:var(--lh-tight); }

/* ---------- 5. TYPOGRAFIA ---------- */
h1{
  font-family:var(--font-display);
  font-size:var(--fs-h1);
  font-weight:400;
  letter-spacing:var(--tracking-display);
  line-height:var(--lh-display);
  text-transform:uppercase;
}

h2{
  font-family:var(--font-display);
  font-size:var(--fs-h2);
  font-weight:400;
  letter-spacing:var(--tracking-display);
  line-height:var(--lh-display);
  text-transform:uppercase;
}

h3{
  font-size:var(--fs-h3);
  font-weight:var(--fw-heavy);
}

h4{
  font-size:var(--fs-h4);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  color:var(--color-gray);
}

p{ font-size:var(--fs-body); }

.meta{
  font-size:var(--fs-meta);
  font-weight:var(--fw-bold);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  color:var(--color-gray);
}

.meta a{ color:var(--color-black); border-bottom:var(--border-standard) solid var(--color-neon); }

.meta a:hover{ background:var(--color-neon); }

/* ---------- 7. TAG KATEGORII ---------- */
.tag{
  display:inline-block;
  background:var(--color-black);
  color:var(--color-white);
  border:var(--border-standard) solid var(--color-black);
  padding:var(--space-1) var(--space-3);
  font-size:var(--fs-micro);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
}

.tag--outline{ background:var(--color-white); color:var(--color-black); }

/* Neon jest zdarzeniem, nie tłem — maksymalnie dwa wystąpienia na ekran.
   Modyfikator .tag--neon zarezerwowany dla wpisu wiodącego i etykiety
   materiału sponsorowanego. */
.tag--neon{ background:var(--color-neon); color:var(--color-black); border-color:var(--color-black); }

.tag--outline:hover{ background:var(--color-neon); }


/* ===== z makiety: category.html ===== */

.meta a:hover{ background:var(--color-neon); color:var(--color-black); }


/* ===== z makiety: 404.html ===== */

table{ border-collapse:collapse; width:100%; }


/* ===== z makiety: author.html ===== */

/* --- WIDOK 2: archiwum tagu --- */
.tag-head{ margin-bottom:var(--space-6); }

.tag-head__title{ text-transform:uppercase; }

.tag-head__prefix{
  display:block;
  font-size:var(--fs-meta);
  font-weight:var(--fw-heavy);
  letter-spacing:var(--tracking-wide);
  color:var(--color-gray);
  margin-bottom:var(--space-2);
}

.tag-head__count{ margin-top:var(--space-2); }

.tag-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:var(--space-5);
}

.tag-tile{ border:var(--border-standard) solid var(--color-black); }

.tag-tile__media{ aspect-ratio:3/2; overflow:hidden; }

.tag-tile__media img{ width:100%; height:100%; object-fit:cover; }

.tag-tile__body{ padding:var(--space-4); }

.tag-tile__tag{ margin-bottom:var(--space-2); }

.tag-tile__title{
  font-size:var(--fs-h4);
  font-weight:var(--fw-heavy);
  line-height:1.25;
  margin-bottom:var(--space-2);
}

.tag-tile__title a:hover{ background:var(--color-neon); }

.tag-tile__meta{ display:flex; flex-wrap:wrap; gap:var(--space-3); }

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* ---------- 4. SIATKA / KONTENERY ---------- */
.container{
  max-width:var(--container-max);
  margin-inline:auto;
  padding-inline:var(--space-4);
}

.col-text{ max-width:var(--text-col-max); }

/* ---------- 11. SEPARATOR ---------- */
.divider{
  border:0;
  height:var(--border-divider);
  background:var(--color-black);
  margin-block:var(--space-7);
}

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* ---------- 6. PRZYCISKI ---------- */
.btn-solid, .btn-outline{
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
  padding:var(--space-3) var(--space-5);
  font-size:var(--fs-meta);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  border:var(--border-standard) solid var(--color-black);
  border-radius:var(--radius-none);
  transition:transform .05s linear;
}

.btn-solid{
  background:var(--color-black);
  color:var(--color-white);
  box-shadow:var(--shadow-hard);
}

.btn-solid:hover{ background:var(--color-neon); color:var(--color-black); }

.btn-solid:active{ transform:translate(var(--shadow-offset), var(--shadow-offset)); box-shadow:0 0 0 0 var(--color-black); }

.btn-outline{
  background:var(--color-white);
  color:var(--color-black);
  box-shadow:none;
}

.btn-outline:hover{ background:var(--color-neon); border-color:var(--color-black); }

.btn-outline:active{ transform:translate(var(--border-standard), var(--border-standard)); }

/* 14. Powrót na górę. Twardy kwadrat, bez zaokrągleń — jak reszta
   motywu. Pojawia się po przewinięciu jednego ekranu. */
.to-top {
  position: fixed; right: var(--space-4); bottom: var(--space-4); z-index: 70;
  width: 48px; height: 48px; display: grid; place-items: center;
  background: var(--color-white); color: var(--color-black);
  border: var(--border-container) solid var(--color-black);
  box-shadow: var(--shadow-hard);
  font-family: var(--font-display); font-size: 20px; line-height: 1;
  opacity: 0; visibility: hidden; transition: opacity 140ms linear;
}

.to-top:hover { background: var(--color-neon); }

.to-top.is-visible { opacity: 1; visibility: visible; }


/* ===== z makiety: single.html ===== */

/* ---------- 6. PRZYCISKI ---------- */
.btn-outline{
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
  padding:var(--space-3) var(--space-5);
  font-size:var(--fs-meta);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  border:var(--border-standard) solid var(--color-black);
  border-radius:var(--radius-none);
  background:var(--color-white);
  color:var(--color-black);
}


/* ===== z makiety: 404.html ===== */

/* ---------- 6. PRZYCISKI ---------- */
.btn-solid{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  background:var(--color-black);
  color:var(--color-white);
  border:var(--border-standard) solid var(--color-black);
  padding:var(--space-3) var(--space-5);
  font-size:var(--fs-meta);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  box-shadow:var(--shadow-hard);
}

.btn-solid:hover{ background:var(--color-white); color:var(--color-black); }

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* ---------- 13. SLOTY REKLAMOWE (rezerwacja wysokości = zero CLS) ---------- */
.ad-slot{
  display:flex;
  align-items:center;
  justify-content:center;
  background:var(--color-bg-section);
  border:var(--border-standard) solid var(--color-black);
  overflow:hidden;
  margin-block:var(--space-4);
}

.ad-slot img{ width:100%; height:100%; object-fit:cover; }

.ad-breakout{ margin-inline:calc(-1 * var(--space-4)); }

.ad-slot--header{
  width:100%;
  max-width:calc(var(--ad-mobile-w) * 1px);
  aspect-ratio:var(--ad-mobile-w) / var(--ad-mobile-h);
  margin-inline:auto;
}

.ad-slot--footer{
  width:100%;
  max-width:calc(var(--ad-footer-w) * 1px);
  aspect-ratio:var(--ad-footer-w) / var(--ad-footer-h);
  margin-inline:auto;
}

/* 21. Do pięciu banerów w stopce, w jednym rzędzie na desktopie. */
.footer-ads {
  display: grid; gap: var(--space-3);
  grid-template-columns: 1fr;
  margin-bottom: var(--space-7);
}

.ad-slot--footer { min-height: 90px; }

.site-logo img, .footer-logo img, .footer-ai-graphic, .ad-slot img, .footer-contact-figure img{ background:none; }

.footer-ads .ad-slot--footer{ display:block; padding:0; border:none; min-height:50px; }

.footer-ads .ad-slot--footer img{ display:block; width:100%; height:auto; max-width:300px; }

/* --- V3: baner stopki dokładnie 300×50 ---
   Slot dziedziczył width:100% i rozciągał grafikę ponad 300 px, a pod nią
   zostawał pusty pas tła. Sloty mają teraz sztywne 300×50 — dokładnie
   rozmiar z dokumentacji — i zawijają się w kolejny rząd na wąskim ekranie. */
.footer-ads{
  display:flex; flex-wrap:wrap; gap:var(--space-4);
  margin-bottom:var(--space-7);
}

.footer-ads .ad-slot--footer{
  flex:0 0 auto; width:300px; height:50px;
  padding:0; border:none; min-height:0; background:none;
}

.footer-ads .ad-slot--footer a{ display:block; width:300px; height:50px; }

.footer-ads .ad-slot--footer img{
  display:block; width:300px; height:50px; max-width:100%; object-fit:contain;
}

/* --- pasmo banerów (środkowa część stopki — dok „Baner w stopce") --- */
.footer-ads{
  display:flex; flex-wrap:wrap; gap:var(--space-3);
  margin:0 0 var(--space-7); padding-bottom:var(--space-7);
  border-bottom:var(--border-standard) solid var(--color-black);
}

.footer-ads::before{
  content:"Reklama"; flex:0 0 100%;
  font-size:var(--fs-micro); font-weight:var(--fw-bold);
  text-transform:uppercase; letter-spacing:var(--tracking-wide);
  color:var(--color-black); margin-bottom:var(--space-3);
}

.footer-ads .ad-slot--footer a,
.footer-ads .ad-slot--footer img{ display:block; width:300px; height:50px; }

.footer-ads .ad-slot--footer img{ object-fit:contain; }

/* --- V3 fix: stopka na wąskim desktopie ---
   1. Sloty banerów dziedziczyły margin:16px auto z bazowej reguły .ad-slot;
      auto w kontenerze flex zjada całą wolną przestrzeń, więc rząd banerów
      się rozjeżdżał. Zerujemy margines — odstęp niesie gap.
   2. Kolumna opisowa rozciągała się na całą szerokość już od 620 px,
      przez co „Partnerzy" spadali do osobnego rzędu z dziurą obok.
      Rozpięcie działa tylko w układzie dwukolumnowym (620–899 px),
      a od 900 px wchodzą cztery kolumny. */
.footer-ads .ad-slot--footer{ margin:0; }

.footer-logo,
.site-footer .footer-grid,
.footer-ads{
  margin:0 0 var(--space-6);
  padding-bottom:var(--space-6);
  border-bottom:var(--border-standard) solid var(--color-black);
}

.footer-ads{ gap:var(--space-3); }

.footer-ads::before{ margin-bottom:var(--space-3); }

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* =========================================================
   14. KOMPONENTY STRONY GŁÓWNEJ
   Poniższe klasy budują WYŁĄCZNIE ze zmiennych zdefiniowanych
   powyżej — żadna nowa wartość liczbowa/kolor/krój nie jest
   wprowadzana. Tam gdzie da się użyć komponentu ze styleguide'u
   bezpośrednio (.tag, .box-shadow, .btn-outline, .meta, .divider,
   .ad-slot, h1–h4) — jest on użyty bez modyfikacji.
   ========================================================= */

/* --- Header --- */
/* Header — stale czarny pasek przyklejony do górnej krawędzi.
   Wybrano stałą inwersję zamiast przełączania po wyjściu poza hero:
   makiety są bez JS, a scroll-driven animations nie mają jeszcze
   wystarczającego wsparcia przeglądarek. Wysokość pozostaje 71px. */
.site-header{
  background:var(--color-black);
  color:var(--color-white);
  border-bottom:var(--border-standard) solid var(--color-black);
}

.site-header a{ color:var(--color-white); }

.site-header a:hover{ background:var(--color-neon); color:var(--color-black); }

.site-header__row{
  display:flex;
  align-items:center;
  justify-content:space-between;
  flex-wrap:wrap;
  gap:var(--space-4);
  padding-block:var(--space-4);
}

.site-logo{
  font-family:var(--font-display);
  font-size:var(--fs-h3);
  font-weight:400;
  text-transform:uppercase;
  letter-spacing:var(--tracking-display);
  line-height:var(--lh-normal); /* utrzymuje wysokość paska na 71px */
}

.site-logo:hover{ background:var(--color-neon); }

.site-nav{ flex:1 1 auto; }

.site-nav ul{ display:flex; flex-wrap:wrap; gap:var(--space-5); }

.site-nav a, .site-search{
  font-size:var(--fs-meta);
  font-weight:var(--fw-bold);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
}

.site-nav a:hover, .site-search:hover{ background:var(--color-neon); }

/* 6 + 18. Menu: na tablecie zawija się, na mobile chowa pod hamburger.
   Liczba kategorii nie jest ograniczona — lista zawija się w kolejne
   wiersze, zamiast wypychać logo i wyszukiwanie z paska. */
.site-nav ul { flex-wrap: wrap; row-gap: var(--space-2); }

.site-nav-mobile { display: none; }

/* ---------- MENU DWUPOZIOMOWE ---------- */
.site-nav__list{ display:flex; align-items:center; gap:var(--space-5); list-style:none; }

.site-nav__list > li{ position:relative; }

.site-nav .has-sub > a::after{ content:"\25BE"; margin-left:6px; font-size:.75em; }

.site-nav__sub{
  position:absolute; top:100%; left:calc(var(--space-3) * -1); min-width:230px;
  display:none; list-style:none; padding:var(--space-2);
  background:var(--color-white);
  border:var(--border-container) solid var(--color-black);
  box-shadow:var(--shadow-hard); z-index:90;
}

.site-nav .has-sub:hover > .site-nav__sub,
.site-nav .has-sub:focus-within > .site-nav__sub{ display:block; }

.site-nav__sub a{
  display:block; padding:var(--space-2) var(--space-3);
  color:var(--color-black); font-size:var(--fs-meta);
  text-transform:uppercase; letter-spacing:var(--tracking-wide);
  border-bottom:var(--border-standard) solid transparent;
}

.site-nav__sub a:hover{ background:var(--color-neon); }

/* Mobilne podmenu — zagnieżdżone <details> w panelu menu. */
.site-nav-mobile .mobile-sub > summary{
  list-style:none; cursor:pointer; padding:var(--space-2) 0;
  font-family:var(--font-display); text-transform:uppercase;
  letter-spacing:var(--tracking-wide); color:var(--color-black);
}

.site-nav-mobile .mobile-sub > summary::-webkit-details-marker{ display:none; }

.site-nav-mobile .mobile-sub > summary::after{ content:" +"; }

.site-nav-mobile .mobile-sub[open] > summary::after{ content:" \2212"; }

.site-nav-mobile .mobile-sub > ul{
  margin:var(--space-2) 0 var(--space-3) var(--space-4);
  border-left:var(--border-standard) solid var(--color-black);
  padding-left:var(--space-3); display:grid; gap:var(--space-2);
}

/* --- V3 fix: .site-nav ul (0,1,1) wygrywało z .site-nav__sub (0,1,0),
       więc panel podmenu był zawsze rozwinięty. Podnosimy specyficzność. --- */
.site-nav ul.site-nav__sub{ display:none; }

.site-nav .has-sub:hover > ul.site-nav__sub,
.site-nav .has-sub:focus-within > ul.site-nav__sub{ display:block; }

/* ---------- V3 fix: JASNY PASEK NAGŁÓWKA (wytyczna 13) ----------
   Logo portali Traffic Peaks jest w czarnym foncie, więc pasek nagłówka
   nie może być czarny — logo byłoby niewidoczne. Pasek dostaje białe tło
   i grubą czarną krawędź dolną; charakter motywu (twarde krawędzie, neon
   jako akcent) zostaje bez zmian. Ten sam warunek dotyczy stopki. */
.site-header{
  background:var(--color-white); color:var(--color-black);
  border-bottom:var(--border-divider) solid var(--color-black);
}

.site-header a{ color:var(--color-black); }

.site-nav a, .site-search{ color:var(--color-black); }

.site-logo{ display:inline-flex; align-items:center; }

.site-logo img{ display:block; height:32px; width:auto; background:none; }

/* ============================================================
   V3 — MENU PRZEPROJEKTOWANE
   Co się zmieniło i dlaczego:
   · linki serwisowe (redakcja, mapa, kontakt) zeszły do cienkiego
     paska nad logiem — w menu głównym zostają tylko kategorie;
   · pozycja menu to pełnowysokościowy cel kliknięcia (72 px), nie
     sam tekst; stan aktywny i hover niesie neonowy pasek u dołu,
     więc widać, gdzie jesteś (heurystyka „widoczność stanu");
   · panel podmenu dostał etykietę, neonową krawędź górną łączącą
     go z pozycją i pozycję „Wszystko w dziale" — wejście do
     kategorii nadrzędnej nie ginie;
   · link partnera ma własną etykietę „partner" i ramkę, więc nie
     udaje kategorii redakcyjnej;
   · wyszukiwanie to kwadratowy przycisk z ikoną i podpisem,
     a nie kolejny link w rzędzie;
   · menu mobilne: panel na pełną szerokość, pozycje 52 px.
   ============================================================ */

/* --- pasek użytkowy --- */
.site-topbar{ background:var(--color-black); color:var(--color-white); }

.site-topbar__row{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--space-4); min-height:34px; flex-wrap:wrap;
}

.site-topbar__tagline{
  font-size:var(--fs-micro); letter-spacing:var(--tracking-wide);
  text-transform:uppercase; color:var(--color-white); opacity:.75;
}

.site-topbar__links{ display:flex; list-style:none; gap:var(--space-4); }

.site-header .site-topbar__links a{
  color:var(--color-white); font-size:var(--fs-micro);
  letter-spacing:var(--tracking-wide); text-transform:uppercase;
  padding:var(--space-2) 0; border-bottom:var(--border-standard) solid transparent;
}

.site-header .site-topbar__links a:hover{ border-bottom-color:var(--color-neon); background:none; }

/* --- pasek główny --- */
.site-header__row{
  display:flex; align-items:stretch; gap:var(--space-5);
  min-height:72px;
}

.site-logo{ display:inline-flex; align-items:center; flex:0 0 auto; }

.site-logo img{ display:block; height:30px; width:auto; background:none; }

/* --- menu --- */
.site-nav{ margin-left:auto; }

.site-nav ul.site-nav__list{ display:flex; align-items:stretch; gap:0; list-style:none; flex-wrap:wrap; }

.site-nav__item{ position:relative; display:flex; align-items:stretch; }

.site-header .site-nav a.nav-link{
  display:flex; align-items:center; gap:6px;
  padding:0 var(--space-4); min-height:72px;
  font-family:var(--font-display); font-size:var(--fs-h4);
  letter-spacing:var(--tracking-wide); text-transform:uppercase;
  color:var(--color-black); position:relative; background:none;
}

.site-header .site-nav a.nav-link::after{
  content:""; position:absolute; left:var(--space-3); right:var(--space-3); bottom:0;
  height:var(--shadow-offset); background:var(--color-neon);
  transform:scaleX(0); transform-origin:left center;
  transition:transform .12s linear;
}

.site-header .site-nav a.nav-link:hover{ background:var(--color-bg-section); }

.site-header .site-nav a.nav-link:hover::after,
.site-nav__item:focus-within > a.nav-link::after{ transform:scaleX(1); }

.site-header .site-nav a.nav-link[aria-current="page"]{ background:var(--color-bg-section); }

.site-header .site-nav a.nav-link[aria-current="page"]::after{ transform:scaleX(1); }

.nav-link__chev{
  width:7px; height:7px; border-right:var(--border-standard) solid currentColor;
  border-bottom:var(--border-standard) solid currentColor;
  transform:rotate(45deg) translateY(-2px);
}

/* --- panel podmenu --- */
.site-nav__panel{
  position:absolute; top:100%; left:0; min-width:250px; display:none; z-index:90;
  background:var(--color-white);
  border:var(--border-container) solid var(--color-black);
  border-top:var(--shadow-offset) solid var(--color-neon);
  box-shadow:var(--shadow-hard); padding:var(--space-3);
}

.site-nav .has-sub:hover > .site-nav__panel,
.site-nav .has-sub:focus-within > .site-nav__panel{ display:block; }

.site-nav__panel-label{
  font-size:var(--fs-micro); letter-spacing:var(--tracking-wide);
  text-transform:uppercase; color:var(--color-gray);
  padding:0 var(--space-2) var(--space-2);
}

.site-nav ul.site-nav__sub{ display:block; list-style:none; padding:0; border:0; box-shadow:none; position:static; min-width:0; }

.site-header .site-nav ul.site-nav__sub a{
  display:flex; align-items:center; min-height:44px;
  padding:0 var(--space-3); color:var(--color-black);
  font-family:var(--font-family-base); font-weight:var(--fw-bold);
  font-size:var(--fs-meta); text-transform:none; letter-spacing:var(--tracking-normal);
  border-bottom:0;
}

.site-header .site-nav ul.site-nav__sub a:hover{ background:var(--color-neon); }

.site-nav__sub-all{ border-top:var(--border-standard) solid var(--color-black); margin-top:var(--space-2); }

.site-header .site-nav .site-nav__sub-all a{
  font-family:var(--font-display); text-transform:uppercase;
  font-size:var(--fs-micro); letter-spacing:var(--tracking-wide);
}

/* --- wyszukiwanie --- */
.site-header a.site-search{
  align-self:center; display:inline-flex; align-items:center; gap:var(--space-2);
  min-height:44px; padding:0 var(--space-3);
  border:var(--border-container) solid var(--color-black);
  background:var(--color-white); color:var(--color-black);
  font-family:var(--font-display); font-size:var(--fs-micro);
  letter-spacing:var(--tracking-wide); text-transform:uppercase;
  flex:0 0 auto;
}

.site-header a.site-search:hover{ background:var(--color-neon); }

.site-search .icon{ width:16px; height:16px; stroke-linecap:square; }

/* --- V3: nagłówek w trzech pasmach (pasek użytkowy / logo / kategorie) ---
   Przy 4–6 kategoriach i linku partnera jeden rząd pękał i menu zawijało się
   pod logo przypadkiem. Rozdzielenie na pasmo marki i pasmo kategorii daje
   stały układ na każdej szerokości — i miejsce na kolejne działy. */
.site-header__row{ display:flex; align-items:center; gap:var(--space-5); min-height:64px; flex-wrap:nowrap; }

.site-header__brandside{ margin-left:auto; display:flex; align-items:center; gap:var(--space-4); }

.site-navbar{ border-top:var(--border-standard) solid var(--color-black); }

.site-navbar__row{ display:flex; align-items:stretch; }

.site-nav{ margin-left:0; }

.site-nav ul.site-nav__list{ flex-wrap:wrap; }

.site-header .site-nav a.nav-link{ min-height:56px; padding:0 var(--space-4); }

.site-header .site-nav a.nav-link:first-child{ padding-left:0; }

.site-nav__item:first-child > a.nav-link{ padding-left:0; }

.site-nav__item:first-child > a.nav-link::after{ left:0; }

/* --- V3: wyrównanie pasma kategorii ---
   Wszystkie pozycje mają równy padding (spójne prostokąty podświetlenia),
   a cała lista jest przesunięta o ten padding w lewo, więc pierwsza pozycja
   zaczyna się w linii logo. Link partnera trzyma się prawej krawędzi. */
.site-navbar__row{ justify-content:space-between; }

.site-nav{ width:100%; }

.site-nav ul.site-nav__list{ margin-left:calc(-1 * var(--space-4)); width:100%; }

.site-header .site-nav a.nav-link,
.site-nav__item:first-child > a.nav-link{ padding:0 var(--space-4); }

.site-nav__item:first-child > a.nav-link::after{ left:var(--space-3); }

/* --- V3: czytelność menu ---
   Anton to font wąski, wersalikowy i o mocno zwartym oczku — przy 18px
   i rozstrzeleniu 0.08em pozycje menu czytały się z trudem. Nawigacja
   przechodzi na Archivo (font treści) w grubości 700, wielkością i małymi
   literami: wyraźne różnice między znakami i normalne odstępy.
   Anton zostaje tam, gdzie pracuje dobrze — w nagłówkach. */
.site-header .site-nav a.nav-link{
  font-family:var(--font-family-base);
  font-weight:var(--fw-heavy);
  font-size:17px;
  letter-spacing:var(--tracking-normal);
  text-transform:none;
}

.site-header .site-nav .site-nav__sub-all a{
  font-family:var(--font-family-base);
  font-weight:var(--fw-heavy);
  font-size:var(--fs-meta);
  letter-spacing:var(--tracking-normal);
  text-transform:none;
}

.site-nav-mobile .mobile-sub > summary,
.site-nav-mobile > ul > li > a{
  font-family:var(--font-family-base);
  font-weight:var(--fw-heavy);
  font-size:17px;
  letter-spacing:var(--tracking-normal);
  text-transform:none;
}

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

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

.section--tinted{ background:var(--color-bg-section); }

.section--tinted + .section--tinted{ border-top:var(--border-standard) solid var(--color-black); }

/* ---------- 9. BOX Z TWARDYM CIENIEM ---------- */
.box-shadow{
  background:var(--color-white);
  border:var(--border-standard) solid var(--color-black);
  box-shadow:var(--shadow-hard-lg);
  padding:var(--space-6);
}

/* --- Kafelek siatki (obraz flush z ramką, bez marginesu wewnętrznego) --- */
.grid-tile{
  border:var(--border-standard) solid var(--color-black);
  display:flex;
  flex-direction:column;
  background:var(--color-white);
}

.grid-tile__media{ aspect-ratio:3/2; overflow:hidden; }

.grid-tile__media img{ width:100%; height:100%; object-fit:cover; display:block; }

.grid-tile__body{ padding:var(--space-4); }

.grid-tile__tag{ margin-bottom:var(--space-2); }

.grid-tile__title{
  font-size:var(--fs-h3);
  font-weight:var(--fw-heavy);
  line-height:1.2;
  margin-bottom:var(--space-2);
}

.grid-tile__title a:hover{ background:var(--color-neon); }

.grid-tile__meta{ display:flex; flex-wrap:wrap; gap:var(--space-3); margin-bottom:var(--space-3); }

/* Raster asymetryczny na siatce 12-kolumnowej. Żadne dwa kafle obok
   siebie nie mają tej samej szerokości: 8/4, 5/7, 7/5 na desktopie
   i 7/5, 5/7, 7/5 na tablecie. */
.home-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:var(--space-5);
  /* stretch, nie start — inaczej kafle o różnej wysokości
     zostawiają rwane dziury i siatka wygląda na zepsutą */
  align-items:stretch;
}

/* ============================================================
   RUCHOMY PASEK „DALEJ W NAJNOWSZYCH"
   Domknięcie sekcji Najnowsze: to, co nie zmieściło się na kartach,
   jedzie tytułami. Ruch jest tu informacją — pokazuje, że lista
   jest dłuższa niż widoczny wycinek.

   Dostępność: lista jest zduplikowana, żeby pętla nie miała szwu;
   druga kopia ma aria-hidden, więc czytnik ekranu czyta tytuły raz.
   Pasek staje przy najechaniu i przy fokusie z klawiatury, żeby dało
   się kliknąć odsyłacz. Przy systemowym ograniczeniu ruchu animacja
   nie startuje wcale — zostaje lista przewijana w poziomie.
   ============================================================ */
.news-ticker {
  background: var(--color-black); color: var(--color-white);
  border-block: var(--border-container) solid var(--color-black);
  display: flex; align-items: center; gap: var(--space-4);
  padding-block: var(--space-3); overflow: hidden;
}

.news-ticker__label {
  flex: none; margin: 0; padding-left: var(--space-4);
  font-family: var(--font-display); font-size: var(--fs-micro);
  letter-spacing: var(--tracking-wide); text-transform: uppercase;
  color: var(--color-neon);
}

.news-ticker__viewport { flex: 1 1 auto; overflow: hidden; min-width: 0; }

.news-ticker__track { display: flex; width: max-content; animation: ticker 45s linear infinite; }

.news-ticker:hover .news-ticker__track,
.news-ticker:focus-within .news-ticker__track { animation-play-state: paused; }

.news-ticker__list { display: flex; align-items: baseline; gap: var(--space-5); padding-right: var(--space-5); }

.news-ticker__list li { flex: none; display: flex; align-items: baseline; gap: var(--space-5); }

.news-ticker__list li::after { content: "\002022"; color: var(--color-neon); }

.news-ticker__list a {
  white-space: nowrap; font-size: var(--fs-meta);
  border-bottom: 2px solid transparent;
}

@keyframes ticker { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* ============================================================
   DZIAŁY NA STRONIE GŁÓWNEJ
   Każdy dział to skrzynka: czarny pasek z nazwą i trzy wpisy.
   Pasek jest czarny, kafle na bieli — cztery pełne czarne bloki
   pod sobą byłyby ścianą, a nie rytmem.
   ============================================================ */
.section-eyebrow {
  font-family: var(--font-display); font-size: var(--fs-micro);
  letter-spacing: var(--tracking-wide); text-transform: uppercase;
  margin-bottom: var(--space-5);
}

.cat-band { border: var(--border-container) solid var(--color-black); background: var(--color-white); margin-bottom: var(--space-6); }

.cat-band:last-child { margin-bottom: 0; }

.cat-band__head {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-3) var(--space-4);
  background: var(--color-black); color: var(--color-white);
  padding: var(--space-3) var(--space-4);
}

.cat-band__name {
  font-family: var(--font-display); font-size: var(--fs-h3);
  line-height: var(--lh-display); letter-spacing: var(--tracking-display);
  text-transform: uppercase; color: var(--color-white); margin: 0;
}

.cat-band__count { font-size: var(--fs-micro); color: var(--color-gray-light); font-variant-numeric: tabular-nums; }

.cat-band__link {
  margin-left: auto; font-family: var(--font-display); font-size: var(--fs-micro);
  letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--color-neon);
  border-bottom: 2px solid transparent;
}

.cat-band__link:hover { border-bottom-color: var(--color-neon); }

.cat-band__grid { display: grid; grid-template-columns: 1fr; }

.cat-tile { display: flex; flex-direction: column; border-top: var(--border-standard) solid var(--color-black); }

.cat-tile__media { aspect-ratio: 3 / 2; overflow: hidden; border-bottom: var(--border-standard) solid var(--color-black); }

.cat-tile__media img { width: 100%; height: 100%; object-fit: cover; }

.cat-tile__body { padding: var(--space-3) var(--space-4) var(--space-4); display: grid; gap: var(--space-2); }

.cat-tile__title { font-family: var(--font-family-base); font-size: var(--fs-h4); font-weight: var(--fw-heavy); line-height: var(--lh-tight); }

.cat-tile__title a:hover { background: var(--color-neon); }

/* ============================================================
   POPRAWKI Z LISTY KLIENTA — 25.08.2026
   ============================================================ */

/* 5. Odstęp baner → zdjęcie główne. Było 115 px: 64 px paddingu
   pierwszej sekcji + 32 px marginesu wpisu wiodącego + 16 px slotu.
   Pierwsza sekcja po banerze nie potrzebuje pełnego paddingu, bo
   baner sam już oddziela ją od nagłówka. Zostaje 32 px. */
main > .section:first-child { padding-top: var(--space-4); }

/* Sekcja materiałów sponsorowanych — bez cieni, bez neonu, bez ramek.
   Wygląda jak zwykła lista wpisów, bo taka ma być (wytyczna 12). */
.sponsored-grid{ display:grid; grid-template-columns:1fr; gap:var(--space-6); }

.sponsored-grid .grid-tile__body p{ font-size:var(--fs-meta); color:var(--color-gray); margin-bottom:var(--space-3); }

/* --- V3: odstęp nad paskiem „Dalej w najnowszych" ---
   Pasek stykał się z kartami sekcji nad nim (reguła .ticker-section
   nie dotyczyła tego elementu — w makiecie nazywa się .news-ticker). */
.news-ticker{ margin-top:var(--space-8); }

/* ============================================================
   V3 — „NAJNOWSZE" JAKO HERO-SLIDER
   Za inspiracjami: duży tytuł w lewej kolumnie, jedno mocne zdjęcie
   po prawej z twardym cieniem, dużo powietrza, jeden przycisk,
   wskaźniki 01/02/03. W języku Bold: Anton w tytule, neon jako
   podkreślenie jednej frazy, czarne ramki i cień offsetowy.
   ============================================================ */
.hero-latest__head{
  display:flex; align-items:baseline; justify-content:space-between; gap:var(--space-4);
  margin-bottom:var(--space-5);
}

.hero-latest__head .section-eyebrow{ margin:0; }

.hero-latest__stage{ position:relative; }

.hero-slide{
  display:grid; grid-template-columns:1fr; gap:var(--space-6);
  align-items:center;
}

.hero-slide[hidden]{ display:none; }

.hero-slide__text{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--space-4); }

.hero-slide__kicker{ display:flex; align-items:center; gap:var(--space-4); }

.hero-slide__title{
  font-family:var(--font-display); font-weight:400; text-transform:uppercase;
  font-size:clamp(34px, 5vw, 68px); line-height:.98; letter-spacing:var(--tracking-display);
  margin:0; max-width:14ch;
}

.hero-slide__title a{ color:var(--color-black); }

.hero-slide__title a:hover{ background:none; }

/* neon jest zdarzeniem: jedna fraza tytułu, nie całe tło */
.hero-slide__title mark{
  background:var(--color-neon); color:var(--color-black);
  padding:0 .12em; box-decoration-break:clone; -webkit-box-decoration-break:clone;
}

.hero-slide__lead{ font-size:var(--fs-lead); line-height:var(--lh-normal); max-width:42ch; margin:0; }

.hero-slide__actions{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-5); margin-top:var(--space-2); }

.hero-slide__media{
  position:relative; overflow:visible; aspect-ratio:4 / 3;
  border:var(--border-container) solid var(--color-black);
  box-shadow:var(--shadow-offset) var(--shadow-offset) 0 0 var(--color-black);
  background:var(--color-bg-section);
}

.hero-slide__media img{ width:100%; height:100%; object-fit:cover; display:block; }

.hero-slide__media .media-link{ display:block; height:100%; }

/* --- nawigacja slajdera --- */
.hero-latest__nav{
  display:flex; align-items:center; gap:var(--space-4);
  margin-top:var(--space-6);
}

.hero-latest__arrow{
  width:44px; height:44px; display:inline-grid; place-items:center;
  border:var(--border-standard) solid var(--color-black); background:var(--color-white);
  font-family:var(--font-display); font-size:var(--fs-h4); cursor:pointer; color:var(--color-black);
}

.hero-latest__arrow:hover{ background:var(--color-black); color:var(--color-white); }

.hero-latest__dots{ display:flex; gap:var(--space-2); }

.hero-latest__dots button{
  min-width:44px; height:44px; padding:0 var(--space-3);
  border:var(--border-standard) solid transparent; background:none;
  font-family:var(--font-family-base); font-weight:var(--fw-heavy); font-size:var(--fs-meta);
  letter-spacing:var(--tracking-wide); color:var(--color-black); cursor:pointer;
}

.hero-latest__dots button:hover{ border-color:var(--color-black); }

.hero-latest__dots button[aria-selected="true"]{ background:var(--color-neon); border-color:var(--color-black); }

/* --- V3: „Najnowsze" na czerni ---
   Sekcja otwierająca odwraca kolory: czarne tło, biały tekst, neon jako
   jedyny akcent (fraza w tytule, aktywny wskaźnik, cień kadru). Pasek
   „Dalej w najnowszych" pod nią jest też czarny, więc razem tworzą jedno
   ciemne pasmo otwarcia; oddziela je cienka biała linia. */
.hero-latest{
  background:var(--color-black); color:var(--color-white);
  padding-block:var(--space-7) var(--space-7) !important;
}

.hero-latest .section-eyebrow,
.hero-latest .meta,
.hero-latest .hero-slide__lead,
.hero-latest .hero-slide__title a,
.hero-latest .hero-latest__all{ color:var(--color-white); }

.hero-latest .hero-latest__all:hover{ color:var(--color-neon); }

.hero-latest .hero-slide__kicker .tag{ background:var(--color-white); color:var(--color-black); border-color:var(--color-white); }

.hero-latest .hero-slide__kicker .tag:hover{ background:var(--color-neon); border-color:var(--color-neon); }

.hero-latest .hero-slide__title a:hover mark{ background:var(--color-white); }

.hero-latest .btn-solid{ background:var(--color-neon); color:var(--color-black); border-color:var(--color-neon); }

.hero-latest .btn-solid:hover{ background:var(--color-white); border-color:var(--color-white); }

.hero-latest .hero-slide__media{
  border-color:var(--color-white);
  box-shadow:var(--shadow-offset) var(--shadow-offset) 0 0 var(--color-neon);
}

.hero-latest .hero-latest__arrow{ background:var(--color-black); color:var(--color-white); border-color:var(--color-white); }

.hero-latest .hero-latest__arrow:hover{ background:var(--color-white); color:var(--color-black); }

.hero-latest .hero-latest__dots button{ color:var(--color-white); }

.hero-latest .hero-latest__dots button:hover{ border-color:var(--color-white); }

.hero-latest .hero-latest__dots button[aria-selected="true"]{ background:var(--color-neon); color:var(--color-black); border-color:var(--color-neon); }

/* tytuł: wiersze nachodziły na siebie przy .98 — Anton potrzebuje ok. 1.05 */
.hero-slide__title{ line-height:1.05; }

.hero-slide__title mark{ padding:0 .1em; line-height:inherit; }

/* pasek pod sekcją: jedno ciemne pasmo, rozdzielone cienką białą linią */
.news-ticker{ margin-top:0; border-top-color:var(--color-white); }

/* baner nad menu nie styka się z czarnym pasmem otwarcia */
.hero-latest{ margin-top:var(--space-6); }

/* --- V3: czytelny tytuł w hero ---
   Anton wersalikami w tej skali nie działa: wąskie oczko, ogonki ą/ż
   wchodzą w wiersz poniżej, a neonowe tło frazy zasłania poprzedni
   wiersz. Długi tytuł SEO (60–70 znaków) rozbijałby się na 5–6 wierszy.
   Tytuł idzie na Archivo 700, małymi literami, w skali 28–44 px
   z interlinią 1.12 — sześćdziesięcioznakowy tytuł mieści się w 3
   wierszach. Neon zostaje jako podkreślenie frazy, nie jako blok. */
.hero-slide__title{
  font-family:var(--font-family-base); font-weight:var(--fw-heavy);
  text-transform:none; letter-spacing:var(--tracking-tight);
  font-size:clamp(28px, 3.4vw, 44px); line-height:1.12;
  max-width:24ch; text-wrap:balance;
}

.hero-slide__title mark{
  background:none; color:inherit; padding:0;
  box-shadow:inset 0 -0.28em 0 0 var(--color-neon);
}

.hero-latest .hero-slide__title a:hover mark{ box-shadow:inset 0 -1em 0 0 var(--color-neon); color:var(--color-black); }

.hero-slide__lead{ font-size:var(--fs-body); max-width:48ch; }

/* --- V3: stała wysokość sceny slidera ---
   Slajdy były przełączane przez display:none, więc czarne pasmo
   dostosowywało wysokość do bieżącego wpisu i skakało przy klikaniu.
   Wszystkie trzy slajdy leżą teraz w tej samej komórce siatki —
   scena ma wysokość najwyższego z nich i nie zmienia jej wcale.
   Slajdy nieaktywne są niewidoczne i wyjęte z nawigacji (inert),
   więc Tab i czytnik ekranu widzą tylko ten na wierzchu. */
.hero-latest__stage{ display:grid; grid-template-areas:"slide"; align-items:center; }

.hero-slide{ grid-area:slide; }

.hero-slide:not(.is-active){ visibility:hidden; pointer-events:none; }

.hero-slide[hidden]{ display:grid; }

/* --- V3: przyciski „Zobacz artykuł" w jednej linii ---
   Przycisk stał zaraz pod lidem, więc jego wysokość zależała od długości
   opisu i w trzech kartach wypadał na trzech różnych poziomach. Karta jest
   kolumną flex, opis się rozciąga, a przycisk jest dociśnięty do dna —
   przyciski leżą w jednej linii niezależnie od długości tekstów. */
.sponsored-grid{ align-items:stretch; }

.sponsored-grid .grid-tile{ display:flex; flex-direction:column; }

.sponsored-grid .grid-tile__body{ display:flex; flex-direction:column; flex:1 1 auto; }

.sponsored-grid .grid-tile__body p{ flex:1 1 auto; }

.sponsored-grid .grid-tile__body .btn-outline{ align-self:flex-start; margin-top:var(--space-4); }


/* ===== z makiety: single.html ===== */

.grid-tile__meta{ display:flex; flex-wrap:wrap; gap:var(--space-3); }

.home-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:var(--space-5);
}


/* ===== z makiety: author.html ===== */

/* ---------- 8. BOX Z TWARDYM CIENIEM ---------- */
.box-shadow{
  border:var(--border-container) solid var(--color-black);
  box-shadow:var(--shadow-hard-lg);
  padding:var(--space-6);
}

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

.lead{
  font-size:var(--fs-lead);
  font-weight:var(--fw-regular);
  line-height:1.45;
  max-width:var(--text-col-max);
}

.post-lead .lead{ margin-bottom:var(--space-5); }

main > .section:first-child > .container > .post-lead { margin-top: 0; }

/* 12. Odstęp po opisie redakcji / boksie autora. */
.author-box, .editorial-note, .redakcja-note { margin-bottom: var(--space-8); }

.author-box__link{
  font-family:var(--font-display); text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  border-bottom:var(--border-standard) solid var(--color-neon);
}


/* ===== z makiety: single.html ===== */

/* --- Breadcrumbs --- */
.breadcrumbs{ margin-block:var(--space-5); }

.breadcrumbs ol{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--space-2);
}

.breadcrumbs a{
  font-size:var(--fs-micro);
  font-weight:var(--fw-bold);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  color:var(--color-gray);
}

.breadcrumbs a:hover{ background:var(--color-neon); color:var(--color-black); }

.breadcrumbs .is-sep{ font-size:var(--fs-micro); color:var(--color-gray); }

.breadcrumbs .is-current{
  font-size:var(--fs-micro);
  font-weight:var(--fw-bold);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  color:var(--color-black);
}

/* --- Nagłówek wpisu --- */
.post-tag{ margin-bottom:var(--space-4); }

/* H1 na pełnej szerokości kontenera (1200px), nie w kolumnie tekstu */
.post-title{ max-width:none; margin-bottom:var(--space-5); }

.post-lead-text{ margin-bottom:var(--space-5); }

.post-meta-row{
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-4);
  padding-bottom:var(--space-5);
  border-bottom:var(--border-standard) solid var(--color-black);
  margin-bottom:var(--space-6);
}

/* Data publikacji i data aktualizacji jako dwie osobne pozycje meta.
   Etykieta zostaje w konwencji .meta (szare wersaliki, tracking 0.08em),
   sama data idzie czernią i wagą 700 — kontrast bez dodatkowego koloru. */
.post-date{ display:inline-flex; align-items:baseline; gap:var(--space-2); }

.post-date time{ color:var(--color-black); font-weight:var(--fw-heavy); }

/* --- Spis treści --- */
/* Twardy czarny blok w strumieniu treści (bez position:sticky — sticky jest
   sygnaturą innych motywów paczki). Numeracja odpowiada kolejności czytania.
   Neon pojawia się wyłącznie na numerze pozycji pod kursorem i w obrysie
   :focus-visible — na statycznym ekranie limit dwóch wystąpień neonu
   zajmuje wyłącznie tag kategorii. */
.post-toc{
  background:var(--color-black);
  color:var(--color-white);
  border:var(--border-container) solid var(--color-black);
  padding:var(--space-5);
  margin-bottom:var(--space-7);
}

.post-toc__title{
  font-family:var(--font-display);
  font-size:var(--fs-h3);
  font-weight:400;
  line-height:var(--lh-display);
  letter-spacing:var(--tracking-display);
  text-transform:uppercase;
  padding-bottom:var(--space-3);
  border-bottom:var(--border-container) solid var(--color-white);
}

.post-toc__list li + li{ border-top:var(--border-standard) solid var(--color-white); }

.post-toc__list a{
  display:flex;
  align-items:center;
  gap:var(--space-4);
  padding-block:var(--space-3);
  color:var(--color-white);
}

.post-toc__num{
  flex-shrink:0;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:var(--space-6);
  height:var(--space-6);
  background:var(--color-white);
  color:var(--color-black);
  font-size:var(--fs-micro);
  font-weight:var(--fw-heavy);
  letter-spacing:var(--tracking-wide);
}

.post-toc__label{
  font-size:var(--fs-meta);
  font-weight:var(--fw-bold);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  line-height:1.3;
}

.post-toc__list a:hover .post-toc__num{ background:var(--color-neon); }

.post-toc__list a:hover .post-toc__label{ text-decoration:underline; text-underline-offset:var(--space-1); }

/* --- Obraz wyróżniający i obraz wide (pełna szerokość kontenera) --- */
.post-figure{ margin-bottom:var(--space-6); }

.post-figure__media{
  position:relative;
  border:var(--border-container) solid var(--color-black);
  aspect-ratio:3/2;
  overflow:hidden;
  margin-bottom:0;
}

/* Podpis wewnątrz kadru — czarny pasek w dolnym rogu zdjęcia */
.post-figure__caption{
  position:absolute;
  left:0;
  bottom:0;
  max-width:100%;
  background:var(--color-black);
  color:var(--color-white);
  padding:var(--space-2) var(--space-4);
  font-size:var(--fs-caption);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  line-height:1.3;
}

.post-figure__media--wide{ aspect-ratio:21/9; border:var(--border-standard) solid var(--color-black); margin-bottom:0; }

.post-figure__media img{ width:100%; height:100%; object-fit:cover; }

/* --- Treść wpisu --- */
.post-body{ margin-bottom:var(--space-6); }

.post-body p{ margin-bottom:var(--space-5); }

.post-body h2{ margin-top:var(--space-7); margin-bottom:var(--space-4); }

.post-body h3{ margin-top:var(--space-5); margin-bottom:var(--space-3); }

.post-body ul{ margin-bottom:var(--space-5); display:flex; flex-direction:column; gap:var(--space-3); }

.post-body ul li{ padding-left:var(--space-5); position:relative; }

.post-body ul li::before{
  content:"■";
  position:absolute;
  left:0;
  color:var(--color-black);
  font-size:var(--fs-micro);
}

/* --- Cytat blokowy --- */
.pull-quote{
  border-left:var(--border-container) solid var(--color-black);
  box-shadow:var(--shadow-hard);
  background:var(--color-white);
  padding:var(--space-5);
  margin-bottom:var(--space-5);
  font-size:var(--fs-lead);
  font-weight:var(--fw-bold);
  line-height:1.4;
}

/* --- Box „Warto wiedzieć” --- */
.box-tip{
  border:var(--border-standard) solid var(--color-black);
  padding:var(--space-5);
  margin-bottom:var(--space-5);
}

.box-tip__label{ display:inline-block; margin-bottom:var(--space-3); }

.box-tip p{ margin-bottom:0; }

/* --- FAQ --- */
/* Seria twardych bloków, wszystko odsłonięte od razu — bez <details>,
   bo motyw niczego nie chowa (rozwijane akordeony to wzorzec focused/glam/journal).
   Pytanie: Anton, wersaliki, biel na czarnym pasku. Odpowiedź: Archivo
   na bieli. Bloki rozdzielone ramką 3px. Zero neonu. */
.post-faq{ margin-bottom:var(--space-6); }

.post-faq__list{ display:flex; flex-direction:column; gap:var(--space-5); }

.post-faq__item{
  border:var(--border-container) solid var(--color-black);
  background:var(--color-white);
}

/* Specyficzność podniesiona ponad `.post-body h3`, żeby zdjąć marginesy
   nagłówka wewnątrz paska pytania. */
.post-faq .post-faq__q{
  display:flex;
  align-items:flex-start;
  gap:var(--space-4);
  margin:0;
  padding:var(--space-3) var(--space-4);
  background:var(--color-black);
  color:var(--color-white);
  font-family:var(--font-display);
  font-size:var(--fs-h3);
  font-weight:400;
  /* Pytania łamią się na 2-3 wersy. Wcześniej stało tu 1.15; pomiar
     rysunku glifów (Range.getBoundingClientRect + TextMetrics) pokazał,
     że przy 390 px ogonek Ą pierwszego wersu wchodzi w kreskę Ż/Ó wersu
     poniżej o ok. 6 px. Obowiązuje więc ten sam token co w pozostałych
     nagłówkach Antona — 1.3 to minimum dla polskich diakrytyków. */
  line-height:var(--lh-display);
  letter-spacing:var(--tracking-display);
  text-transform:uppercase;
}

.post-faq__index{
  flex-shrink:0;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:var(--space-6);
  height:var(--space-6);
  background:var(--color-white);
  color:var(--color-black);
  font-family:var(--font-family-base);
  font-size:var(--fs-micro);
  font-weight:var(--fw-heavy);
  letter-spacing:var(--tracking-wide);
}

.post-faq__a{ padding:var(--space-4); }

.post-faq__a p{ margin-bottom:var(--space-3); }

.post-faq__a p:last-child{ margin-bottom:0; }

/* --- Box autora --- */
.author-box__name{
  font-size:var(--fs-body);
  font-weight:var(--fw-heavy);
  margin-bottom:var(--space-2);
}

.author-box p{ margin-bottom:0; }

.post-table{ margin-bottom:var(--space-6); }

.post-table__scroll{
  overflow-x:auto;
  border:var(--border-container) solid var(--color-black);
  box-shadow:var(--shadow-hard);
}

.post-table table{ width:100%; min-width:560px; border-collapse:collapse; }

.post-table th,
.post-table td{
  border:var(--border-standard) solid var(--color-black);
  padding:var(--space-3) var(--space-4);
  text-align:left;
  font-size:var(--fs-meta);
  line-height:var(--lh-normal);
}

.post-table thead th{
  background:var(--color-black);
  color:var(--color-white);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  font-weight:var(--fw-heavy);
}

.post-table tbody th{ font-weight:var(--fw-heavy); }

/* Liczby w stałej szerokości znaku — kolumny parametrów czytają się
   w pionie, bez „skakania” przecinków. */
.post-table td{ font-variant-numeric:tabular-nums; }

.post-table tbody tr:nth-child(even){ background:var(--color-bg-section); }

.post-table__caption{
  margin-top:var(--space-3);
  font-size:var(--fs-meta);
  color:var(--color-gray);
}

/* 9. Osadzony film — .post-video. Proporcja 16:9 rezerwowana przez
   aspect-ratio, więc layout nie przeskakuje po wczytaniu iframe'a.
   Ramka 3 px jak przy pozostałych mediach wpisu. */
.post-video{ margin-bottom:var(--space-6); }

.post-video__frame{
  position:relative;
  aspect-ratio:16/9;
  border:var(--border-container) solid var(--color-black);
  background:var(--color-black);
  overflow:hidden;
}

.post-video__frame iframe{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  border:0;
  display:block;
}

.post-video__caption{
  margin-top:var(--space-3);
  font-size:var(--fs-meta);
  color:var(--color-gray);
}

/* ============================================================
   WIDOK WPISU — JEDNA SZEROKOŚĆ KOLUMNY
   Decyzja klienta: w widoku wpisu nic nie jest szersze od tekstu.
   Okruszki, tytuł, zdjęcia, tabele, film i FAQ trzymają tę samą
   krawędź co akapity — czytelnik ma jedną oś, a nie trzy.
   Wcześniej tekst miał 780 px, a zdjęcia i tytuł 1072 px, więc
   kolumna „rozjeżdżała się" przy każdej ilustracji.
   ============================================================ */
main .breadcrumbs ol,
main .post-title,
main .post-figure,
main .post-video,
main .post-table,
main .post-toc,
main .post-faq,
main .author-box,
main .tag-list {
  max-width: var(--text-col-max);
}


/* ===== z makiety: 404.html ===== */

.lead{ font-size:var(--fs-lead); font-weight:var(--fw-regular); max-width:var(--text-col-max); }

/* Krótkie info o autorze — ten sam komponent co archiwum autora
   w search-archives.html (.author-box + ramka kontenerowa
   z twardym cieniem). Bez avatara — zgodnie z briefem. */
.author-box{
  max-width:var(--text-col-max);
  border:var(--border-container) solid var(--color-black);
  box-shadow:var(--shadow-hard-lg);
  padding:var(--space-6);
}

.author-box__bio{ margin-bottom:0; }

/* 12. Odstęp po boksie autora. */
.author-box { margin-bottom: var(--space-8); }


/* ===== z makiety: author.html ===== */

/* --- WIDOK 3: archiwum autora --- */
.author-box{ margin-bottom:var(--space-7); max-width:var(--text-col-max); }

.author-box__name{
  font-size:var(--fs-h2);
  font-weight:var(--fw-black);
  margin-bottom:var(--space-3);
}

.author-box__bio{ }

.author-box__count{ margin-top:var(--space-3); }


/* ===== z makiety: authors.html ===== */

.page-head .lead{ max-width:var(--text-col-max); }

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* ---------- 12. PAGINACJA ---------- */
.pagination{
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-2);
}

.pagination a, .pagination span{
  display:flex;
  align-items:center;
  justify-content:center;
  width:44px;
  height:44px;
  border:var(--border-standard) solid var(--color-black);
  font-weight:var(--fw-heavy);
  font-size:var(--fs-meta);
}

.pagination a:hover{ background:var(--color-neon); }

.pagination .is-current{ background:var(--color-neon); color:var(--color-black); }

.pagination .is-next{ width:auto; padding-inline:var(--space-4); text-transform:uppercase; letter-spacing:var(--tracking-wide); font-size:var(--fs-micro); }

/* 7. Odstęp przed paginacją. */
.pagination, nav[aria-label*="aginacj"], nav[aria-label*="strono"] { margin-top: var(--space-8); }

/* ---------- PANEL BOCZNY (kategoria, wyszukiwanie, archiwum autora) ----------
   Wytyczna 7: panel dopuszczalny na archiwach, bez treści sponsorowanych,
   i NIE wchodzi do hierarchii nagłówków — dlatego etykieta to <p>, a dostępną
   nazwę regionu nosi aria-label na <aside>. Na artykule panelu nie ma wcale. */
.archive-layout{ display:grid; grid-template-columns:1fr; gap:var(--space-7); }

.sidebar{ display:grid; gap:var(--space-6); align-content:start; }

.sidebar-box{
  border:var(--border-container) solid var(--color-black);
  background:var(--color-white); padding:var(--space-4);
  box-shadow:var(--shadow-hard);
}

.sidebar-box__head{
  font-family:var(--font-display); font-size:var(--fs-h4);
  text-transform:uppercase; letter-spacing:var(--tracking-wide);
  border-bottom:var(--border-divider) solid var(--color-black);
  padding-bottom:var(--space-2); margin-bottom:var(--space-4);
}

.sidebar-list{ list-style:none; display:grid; gap:var(--space-4); }

.sidebar-list li{ display:grid; gap:4px; }

.sidebar-list a{
  font-weight:var(--fw-bold); line-height:var(--lh-tight);
  border-bottom:var(--border-standard) solid transparent;
}

.sidebar-list a:hover{ border-bottom-color:var(--color-neon); }


/* ===== z makiety: category.html ===== */

.pagination .is-prev, .pagination .is-next{
  width:auto;
  padding-inline:var(--space-4);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  font-size:var(--fs-micro);
}

/* --- Nagłówek archiwum: h1 na neonowym pasku --- */
.archive-head{ margin-bottom:var(--space-6); }

.archive-head__title{
  display:inline-block;
  background:var(--color-black);
  color:var(--color-white);
  text-transform:uppercase;
  padding:var(--space-3) var(--space-5);
  margin-bottom:var(--space-4);
}

.archive-head__desc{ max-width:var(--text-col-max); margin-bottom:var(--space-3); }

/* --- Pasek podkategorii --- */
.subcat-bar{
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-3);
  margin-bottom:var(--space-7);
}

/* --- Lista wpisów --- */
.archive-list{ display:flex; flex-direction:column; }

.archive-item{
  display:flex;
  flex-direction:column;
  gap:var(--space-4);
  padding-block:var(--space-6);
  border-bottom:var(--border-standard) solid var(--color-black);
}

.archive-item:first-child{ padding-top:0; }

.archive-item:last-child{ border-bottom:0; padding-bottom:0; }

.archive-item__media{
  border:var(--border-standard) solid var(--color-black);
  aspect-ratio:3/2;
  overflow:hidden;
}

.archive-item__media img{ width:100%; height:100%; object-fit:cover; }

.archive-item__body{ flex:1 1 auto; min-width:0; }

.archive-item__tag{ margin-bottom:var(--space-2); }

.archive-item__title{
  font-size:var(--fs-h3);
  font-weight:var(--fw-heavy);
  line-height:1.2;
  margin-bottom:var(--space-2);
}

.archive-item__title a:hover{ background:var(--color-neon); }

.archive-item__excerpt{ max-width:var(--text-col-max); margin-bottom:var(--space-3); }

.archive-item__meta{ display:flex; flex-wrap:wrap; gap:var(--space-3); }

/* --- V3: odstęp pod paginacją ---
   Paginacja stykała się z krawędzią stopki. Blok nawigacji dostaje
   odstęp dolny na poziomie odstępu sekcji. */
.pagination{ margin-bottom:0; }

nav[aria-label="Paginacja"], .pagination-wrap, .pagination{ padding-bottom:var(--space-8); }

/* --- V3: pasek podkategorii ---
   Było: linki do innych, równorzędnych kategorii pod opisem — czytało się
   jak nawigacja główna powtórzona w treści. Teraz: podkategorie tego
   działu, z liczbą wpisów, poprzedzone etykietą (jako <p>, więc pasek
   nie wchodzi do hierarchii nagłówków — wytyczna 7). */
.subcat-bar{ display:block; margin-bottom:var(--space-7); }

.subcat-bar__label{
  font-size:var(--fs-micro); font-weight:var(--fw-heavy);
  text-transform:uppercase; letter-spacing:var(--tracking-wide);
  color:var(--color-black); margin-bottom:var(--space-3);
}

.subcat-bar__list{ display:flex; flex-wrap:wrap; gap:var(--space-3); list-style:none; }

.subcat-bar__list .tag{ display:inline-flex; align-items:center; gap:var(--space-2); }

.subcat-bar__count{
  font-size:9px; font-weight:var(--fw-heavy); letter-spacing:var(--tracking-normal);
  background:var(--color-black); color:var(--color-white); padding:1px 5px;
}

.subcat-bar__list .tag--outline:hover .subcat-bar__count{ background:var(--color-black); color:var(--color-white); }

/* --- V3: tag wpisu na archiwum kategorii ---
   Na widoku kategorii tag wskazywał tę samą kategorię, w której
   użytkownik już jest — link prowadził w to samo miejsce. Jest teraz
   zwykłą etykietą (bez linku); gdy wpis należy do podkategorii innej
   niż przeglądana, etykieta jest linkiem do tej podkategorii. */
.archive-item__tag--static{
  display:inline-block; background:var(--color-bg-section); color:var(--color-black);
  border:var(--border-standard) solid var(--color-black);
  padding:var(--space-1) var(--space-3);
  font-size:var(--fs-micro); font-weight:var(--fw-heavy);
  text-transform:uppercase; letter-spacing:var(--tracking-wide);
  margin-bottom:var(--space-3);
}


/* ===== z makiety: 404.html ===== */

/* --- Pole wyszukiwania (identyczne z search-archives.html) --- */
.search-form{ max-width:var(--text-col-max); }

.search-form__label{
  display:block;
  font-size:var(--fs-meta);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  margin-bottom:var(--space-2);
}

.search-form__row{ display:flex; flex-wrap:wrap; gap:var(--space-3); }

.search-form__input{
  flex:1 1 240px;
  border:var(--border-container) solid var(--color-black);
  padding:var(--space-3) var(--space-4);
  font-size:var(--fs-body);
  background:var(--color-white);
}

.search-form__input::placeholder{ color:var(--color-gray); }

.archive-item__title{
  /* W category.html tytuł pozycji to <h2> bez własnej reguły h2 —
     dziedziczy Archivo. W pages.html reguła h2{} nadaje Anton, więc
     tu trzeba ją cofnąć, żeby obie listy wyglądały identycznie. */
  font-family:var(--font-family-base);
  letter-spacing:normal;
  text-transform:none;
  font-size:var(--fs-h3);
  font-weight:var(--fw-heavy);
  line-height:1.2;
  margin-bottom:var(--space-2);
}


/* ===== z makiety: author.html ===== */

/* --- WIDOK 1: wyszukiwanie --- */
.search-form{ max-width:var(--text-col-max); margin-bottom:var(--space-7); }

.search-head{ margin-bottom:var(--space-6); }

.search-head__title{
  font-size:var(--fs-h2);
  font-weight:var(--fw-black);
  text-transform:uppercase;
  letter-spacing:var(--tracking-tight);
  margin-bottom:var(--space-2);
}

.search-head__query{ background:var(--color-neon); padding-inline:var(--space-1); }

.search-results{ display:flex; flex-direction:column; }

.search-result{
  padding-block:var(--space-5);
  border-bottom:var(--border-standard) solid var(--color-black);
}

.search-result:first-child{ padding-top:0; }

.search-result:last-child{ border-bottom:0; padding-bottom:0; }

.search-result__tag{ margin-bottom:var(--space-2); }

.search-result__title{
  font-size:var(--fs-h3);
  font-weight:var(--fw-heavy);
  margin-bottom:var(--space-2);
}

.search-result__title a:hover{ background:var(--color-neon); }

.search-result__excerpt{ max-width:var(--text-col-max); margin-bottom:var(--space-2); }

.search-highlight{ background:var(--color-black); color:var(--color-white); }

.search-empty{
  border:var(--border-container) solid var(--color-black);
  padding:var(--space-6);
  max-width:var(--text-col-max);
}

.search-empty__title{
  font-size:var(--fs-h3);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  margin-bottom:var(--space-3);
}

.search-empty__text{ margin-bottom:var(--space-5); }

.search-empty__suggestions{ display:flex; flex-wrap:wrap; gap:var(--space-3); }

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* ---------- MAPA WITRYNY ---------- */
.sitemap-group{ margin-bottom:var(--space-8); }

.sitemap-group__head{ display:flex; align-items:baseline; gap:var(--space-3); border-bottom:var(--border-divider) solid var(--color-black); padding-bottom:var(--space-2); margin-bottom:var(--space-4); }

.sitemap-group h2{ font-size:var(--fs-h3); text-transform:uppercase; }

.sitemap-group h2 a{ border-bottom:var(--border-standard) solid var(--color-neon); }

.sitemap-links{ list-style:none; display:grid; gap:var(--space-2); grid-template-columns:1fr; }

.sitemap-links li{ padding-left:var(--space-4); position:relative; }

.sitemap-links li::before{ content:""; position:absolute; left:0; top:.65em; width:8px; height:8px; border:var(--border-standard) solid var(--color-black); }

.sitemap-sub{ list-style:none; margin:var(--space-3) 0 var(--space-5) var(--space-4); border-left:var(--border-standard) solid var(--color-black); padding-left:var(--space-4); }

.sitemap-sub > li{ margin-bottom:var(--space-4); }

/* ---------- LISTA AUTORÓW ---------- */
.authors-grid{ display:grid; grid-template-columns:1fr; gap:var(--space-6); }

.author-card{
  border:var(--border-container) solid var(--color-black);
  background:var(--color-white); padding:var(--space-5);
  box-shadow:var(--shadow-hard); display:grid; gap:var(--space-3);
}

.author-card__name{ font-size:var(--fs-h3); text-transform:uppercase; }

.author-card__role{ font-size:var(--fs-meta); color:var(--color-gray); text-transform:uppercase; letter-spacing:var(--tracking-wide); }

.author-card__cta{ font-family:var(--font-display); text-transform:uppercase; letter-spacing:var(--tracking-wide); border-bottom:var(--border-standard) solid var(--color-neon); justify-self:start; }


/* ===== z makiety: 404.html ===== */

/* --- Lista numerowana z neonowymi numerami (identyczna z home.html) --- */
.latest-list{ display:flex; flex-wrap:wrap; gap:var(--space-5); }

.latest-list li{ display:flex; align-items:center; gap:var(--space-2); }

.latest-list__num{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  background:var(--color-black);
  color:var(--color-white);
  border:var(--border-standard) solid var(--color-black);
  padding:var(--space-1) var(--space-2);
  font-size:var(--fs-meta);
  font-weight:var(--fw-black);
}

.latest-list a{
  font-size:var(--fs-meta);
  font-weight:var(--fw-bold);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
}

.latest-list a:hover{ background:var(--color-neon); }

/* --- WIDOK 3: Polityka prywatności --- */
.toc-box{
  border:var(--border-container) solid var(--color-black);
  padding:var(--space-5);
  max-width:var(--text-col-max);
}

.toc-box__title{
  font-size:var(--fs-meta);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  margin-bottom:var(--space-3);
}

.toc-box ol{ display:flex; flex-direction:column; gap:var(--space-2); counter-reset:toc; }

.toc-box li{ counter-increment:toc; }

.toc-box li::before{ content:counter(toc) ". "; font-weight:var(--fw-heavy); }

.toc-box a{ font-weight:var(--fw-bold); }

.toc-box a:hover{ background:var(--color-neon); }

.policy-body{ max-width:var(--text-col-max); }

.policy-body h2{ margin-top:var(--space-7); }

.policy-body p{ margin-bottom:var(--space-4); }

.policy-body ul{ display:flex; flex-direction:column; gap:var(--space-2); margin-bottom:var(--space-4); }

.policy-body ul li{ padding-left:var(--space-5); position:relative; }

.policy-body ul li::before{ content:"■"; position:absolute; left:0; font-size:10px; top:6px; }

.error-404{ text-align:center; padding-block:var(--space-8); }

.error-404__code{
  display:inline-block;
  background:var(--color-neon);
  color:var(--color-black);
  font-size:var(--fs-404);
  font-weight:var(--fw-black);
  line-height:1;
  padding-inline:var(--space-6);
  margin-bottom:var(--space-6);
}

.error-404__message{ max-width:var(--text-col-max); margin-inline:auto; margin-bottom:var(--space-6); }

.error-404__actions{ margin-bottom:var(--space-8); }

.error-404__search{ max-width:var(--text-col-max); margin-inline:auto; margin-bottom:var(--space-8); text-align:left; }

.error-404__popular{ max-width:var(--text-col-max); margin-inline:auto; text-align:left; }

.error-404__popular .latest-list{ flex-direction:column; align-items:flex-start; gap:var(--space-3); }

/* 12. Adnotacja nad dokumentem prawnym — szablon do zatwierdzenia
   przez prawnika. Ramka kontenerowa + twardy cień, bez neonu: to
   ostrzeżenie redakcyjne, nie akcent wizualny. */
.legal-draft-note{
  border:var(--border-container) solid var(--color-black);
  box-shadow:var(--shadow-hard);
  padding:var(--space-5);
  max-width:var(--text-col-max);
  margin-bottom:var(--space-7);
}

.legal-draft-note__label{
  display:inline-block;
  background:var(--color-black);
  color:var(--color-white);
  font-size:var(--fs-micro);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  padding:var(--space-1) var(--space-3);
  margin-bottom:var(--space-3);
}

.legal-draft-note p{ margin-bottom:var(--space-3); }

.legal-draft-note p:last-child{ margin-bottom:0; }


/* ===== z makiety: author.html ===== */

.author-list{ display:flex; flex-direction:column; }

.author-item{
  display:flex;
  align-items:baseline;
  justify-content:space-between;
  gap:var(--space-4);
  flex-wrap:wrap;
  padding-block:var(--space-4);
  border-bottom:var(--border-standard) solid var(--color-black);
}

.author-item:first-child{ padding-top:0; }

.author-item:last-child{ border-bottom:0; padding-bottom:0; }

.author-item__title{ font-size:var(--fs-body); font-weight:var(--fw-heavy); }

.author-item__title a:hover{ background:var(--color-neon); }

.author-item__tag{ margin-right:var(--space-3); }


/* ===== z makiety: authors.html ===== */

.page-head{ margin-bottom:var(--space-7); }

.page-head h1{ margin-bottom:var(--space-4); }


/* ===== z makiety: kontakt.html ===== */

/* ---------- V3: strona Kontakt (wytyczna 3) ---------- */
.contact-plain{ max-width:var(--text-col-max); margin-bottom:var(--space-9); }

.contact-plain p{ font-size:var(--fs-lead); }

.contact-plain__mail{
  margin-top:var(--space-4); font-family:var(--font-display);
  font-size:var(--fs-h2); letter-spacing:var(--tracking-display);
  border-bottom:var(--border-divider) solid var(--color-neon);
  display:inline-block; padding-bottom:var(--space-2);
}

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* ============================================================
   OZNACZENIE ZDJĘĆ WYGENEROWANYCH Z POMOCĄ AI
   Znacznik w rogu kadru jest widoczny zawsze. Pełna informacja
   wjeżdża od dołu przy najechaniu i przy fokusie z klawiatury,
   a na ekranach dotykowych — gdzie najechania nie ma — stoi
   widoczna od razu. Treść siedzi w DOM niezależnie od stanu,
   więc czytnik ekranu poda ją zawsze.
   Włączane per obrazek: opakuj kadr w .media--ai.
   ============================================================ */
.media--ai { position: relative; overflow: hidden; }

.ai-tag {
  position: absolute; top: var(--space-2); right: var(--space-2); z-index: 2;
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px var(--space-2);
  background: var(--color-black); color: var(--color-white);
  font-family: var(--font-display); font-size: var(--fs-caption);
  line-height: var(--lh-display);
  letter-spacing: var(--tracking-wide); text-transform: uppercase;
  pointer-events: none;
}

.ai-tag::before { content: "\2726"; font-size: 0.9em; line-height: 1; }

.ai-note {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  padding: var(--space-2) var(--space-3);
  background: var(--color-black); color: var(--color-white);
  font-family: var(--font-display); font-size: var(--fs-caption);
  line-height: var(--lh-display);
  letter-spacing: var(--tracking-wide); text-transform: uppercase;
  transform: translateY(100%);
  transition: transform 140ms ease-out;
}

.media--ai:hover .ai-note,
.media--ai:focus-within .ai-note { transform: translateY(0); }

/* We wpisie wiodącym dół kadru zasłania tytuł (ujemny margines),
   a górny lewy róg zajmuje tag kategorii. Dlatego tam informacja
   nie jest paskiem przez całą szerokość, tylko panelem wjeżdżającym
   z prawej, tuż pod znacznikiem. Treść i kolejność bez zmian. */
.post-lead__media .ai-note {
  top: calc(var(--space-2) + 24px); bottom: auto;
  left: auto; right: 0; width: auto; max-width: 78%;
  transform: translateX(101%);
  transition: transform 160ms ease-out;
}

.post-lead__media:hover .ai-note,
.post-lead__media:focus-within .ai-note { transform: translateX(0); }


/* ===== z makiety: single.html ===== */

/* --- V3: oznaczenie AI na obrazie wyróżniającym ---
   Kadr jest kontekstem pozycjonowania dla znacznika i noty; podpis musi
   zostać pod zdjęciem, nie w nakładce, dlatego overflow zawężamy do
   samego obrazka. */
.post-figure__media.media--ai{ position:relative; overflow:visible; }

.post-figure__media.media--ai > img{ display:block; width:100%; height:auto; }

.post-figure__media.media--ai .ai-tag{ z-index:2; }

.post-figure__media.media--ai .ai-note{ z-index:2; }

.post-figure__media.media--ai .post-figure__caption{ position:relative; z-index:1; }

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

/* 1. Stopka na jednym kroju i jednej skali. Wcześniej mieszały się
   rozmiary i wagi, co czytało się jak trzy różne stopki. */
.site-footer { font-family: var(--font-family-base); }

.site-footer h4 {
  font-family: var(--font-display); font-size: var(--fs-micro);
  letter-spacing: var(--tracking-wide); text-transform: uppercase;
  margin-bottom: var(--space-3);
}

.site-footer ul { display: grid; gap: var(--space-2); }

.site-footer a, .site-footer p, .site-footer li, .site-footer figcaption {
  font-family: var(--font-family-base); font-size: var(--fs-meta);
  line-height: var(--lh-normal); color: var(--color-black);
}

.site-footer a { border-bottom: 2px solid transparent; }

.site-footer a:hover { border-bottom-color: var(--color-black); }

.footer-col--about { grid-column: span 2; }

.footer-about { max-width: 46ch; }

.footer-legal { display: grid; gap: var(--space-3); }

.footer-rights { color: var(--color-gray); }

/* Siatka stopki: opis portalu na dwóch kolumnach, potem trzy równe. */
.site-footer .footer-grid { display: grid; gap: var(--space-6); grid-template-columns: 1fr; }

/* --- Reguły bazowe przeniesione z category.html (zgubione przy cięciach CSS) --- */
.footer-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:var(--space-6);
  margin-bottom:var(--space-7);
}

.footer-col a{
  font-size:var(--fs-meta);
  font-weight:var(--fw-bold);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
}

.footer-col a:hover{ background:var(--color-neon); }

.footer-col h4{
  font-size:var(--fs-h4);
  font-weight:var(--fw-heavy);
  text-transform:uppercase;
  letter-spacing:var(--tracking-wide);
  color:var(--color-gray);
  margin-bottom:var(--space-4);
}

.footer-col ul{ display:flex; flex-direction:column; gap:var(--space-3); }

/* ---------- STOPKA ---------- */
.site-footer{ background:var(--color-white); }

.footer-logo{ margin-bottom:var(--space-6); }

.footer-logo img{ display:block; max-width:220px; height:auto; }

/* Nagłówki kolumn stopki — wygląd dawnego h4, ale poza hierarchią nagłówków. */
.footer-col__head{
  font-family:var(--font-display); font-size:var(--fs-h4);
  text-transform:uppercase; letter-spacing:var(--tracking-wide);
  color:var(--color-gray); margin-bottom:var(--space-4);
}

.footer-subcats{ margin:var(--space-2) 0 0 var(--space-4); display:grid; gap:var(--space-2); }

.footer-subcats a{ font-weight:var(--fw-regular); text-transform:none; letter-spacing:var(--tracking-normal); }

.footer-ai-graphic{ display:block; margin-top:var(--space-5); max-width:100%; height:auto; border:var(--border-standard) solid var(--color-black); }

.footer-col--partners a[rel~="sponsored"]{ font-weight:var(--fw-regular); text-transform:none; letter-spacing:var(--tracking-normal); }

/* ============================================================
   V3 — STOPKA PRZEBUDOWANA
   Problemy, które to naprawia:
   · siatka 2fr 1fr 1fr 1.2fr przy czterech kolumnach pękała i kolumna
     „Partnerzy" spadała do drugiego rzędu, zostawiając pół ekranu pustki;
   · kolumny mieszały Anton (kategorie główne) z Archivo (podkategorie),
     więc jedna lista czytała się jak dwie różne;
   · odstęp między linkami był na poziomie odstępu sekcji (36 px),
     przez co listy rozlewały się na całą wysokość ekranu;
   · nagłówki kolumn w kolorze --color-gray na bieli dawały kontrast
     poniżej 4,5:1.
   Stopka ma teraz cztery pasma: marka, kolumny, banery, nota prawna —
   każde oddzielone linią, więc struktura jest widoczna bez kolorów.
   ============================================================ */

.site-footer{
  background:var(--color-white);
  border-top:var(--shadow-offset) solid var(--color-black);
  padding-top:var(--space-7);
}

/* --- pasmo marki --- */
.footer-logo{
  margin:0 0 var(--space-6);
  padding-bottom:var(--space-5);
  border-bottom:var(--border-standard) solid var(--color-black);
}

.footer-logo img{ display:block; height:34px; width:auto; background:none; }

/* Odnośnik opakowuje znak portalu (uwaga 9). `inline-flex`, nie `block`:
   pasmo marki ma linię pod spodem i gdyby odnośnik rozciągał się na całą
   szerokość, obszar kliknięcia sięgałby pustki po prawej stronie logo. */

/* --- pasmo kolumn --- */
.site-footer .footer-grid{
  display:grid; grid-template-columns:1fr;
  gap:var(--space-7) var(--space-6);
  margin:0 0 var(--space-7); padding-bottom:var(--space-7);
  border-bottom:var(--border-standard) solid var(--color-black);
  align-items:start;
}

/* --- nagłówki kolumn (poza hierarchią nagłówków — wytyczna 15) --- */
.footer-col__head{
  font-family:var(--font-family-base);
  font-size:var(--fs-micro); font-weight:var(--fw-heavy);
  text-transform:uppercase; letter-spacing:var(--tracking-wide);
  color:var(--color-black);
  margin:0 0 var(--space-4); padding-bottom:6px;
  border-bottom:var(--shadow-offset) solid var(--color-neon);
  display:inline-block;
}

/* --- listy linków --- */
.site-footer .footer-col > ul{ list-style:none; display:grid; gap:10px; margin:0; }

.site-footer .footer-col a{
  font-family:var(--font-family-base);
  font-size:var(--fs-meta); font-weight:var(--fw-bold);
  text-transform:none; letter-spacing:var(--tracking-normal);
  color:var(--color-black);
  border-bottom:var(--border-standard) solid transparent;
  display:inline-block;
}

.site-footer .footer-col a:hover{ border-bottom-color:var(--color-neon); background:none; }

/* podkategorie — cieńsza waga i lewa linia, jeden krój z resztą listy */
.footer-subcats{
  list-style:none; display:grid; gap:8px;
  margin:10px 0 var(--space-4) 0; padding-left:var(--space-3);
  border-left:var(--border-standard) solid var(--color-black);
}

.site-footer .footer-subcats a{ font-weight:var(--fw-regular); }

/* --- kolumna opisowa --- */
.footer-about{ max-width:44ch; margin:0 0 var(--space-4); }

.footer-ai-graphic{
  display:block; max-width:320px; width:100%; height:auto;
  border:var(--border-standard) solid var(--color-black);
}

/* --- nota prawna --- */
.site-footer .divider{ display:none; }

.footer-legal{
  display:grid; gap:var(--space-3);
  padding-bottom:var(--space-7);
}

.site-footer .footer-rights{
  max-width:78ch; font-size:var(--fs-micro); line-height:var(--lh-normal);
}

.site-footer .footer-rights{ color:var(--color-black); opacity:.7; }

/* --- V3: sygnet i grafika AI w stopce ---
   Stopka dostaje ten sam jednowierszowy sygnet co nagłówek (dwuwierszowa
   wersja przy 34 px była nieczytelna), a grafika AI proporcje, w których
   tekst na obrazie da się przeczytać przy szerokości kolumny. */
.footer-logo img{ height:26px; }

.footer-ai-graphic{ max-width:420px; }

/* --- V3: jeden rytm odstępów w stopce ---
   Pasma miały różne odstępy (96 px między kolumnami a banerami, 56 px
   pod logiem, 48 px nad notą prawną), a listy mieszały 10 i 8 px.
   Cała stopka chodzi teraz na jednej skali:
   pasmo ↔ linia ↔ pasmo = 32 px, odstęp w listach = 12 px,
   nagłówek kolumny ↔ lista = 16 px. */
.site-footer{ padding-top:var(--space-6); }

.site-footer .footer-grid{ gap:var(--space-6); }

.footer-col__head{ margin:0 0 var(--space-4); }

.site-footer .footer-col > ul{ gap:var(--space-3); }

.footer-subcats{ gap:var(--space-3); margin:var(--space-3) 0 var(--space-3) 0; }

.footer-about{ margin:0 0 var(--space-4); }

.footer-legal{ gap:var(--space-3); padding:0 0 var(--space-6); }


/* ===== z makiety: single.html ===== */

/* --- Footer (z home.html) --- */
.site-footer{
  border-top:var(--border-container) solid var(--color-black);
  background:var(--color-bg-section);
  padding-block:var(--space-8);
}

.footer-col h4{ margin-bottom:var(--space-4); }

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */

/* WYGENEROWANE przez narzedzia/wyciagnij-css.py — nie edytuj ręcznie.
   Źródłem jest makieta w katalogu makieta/. Po poprawce w makiecie
   uruchom skrypt ponownie, potem narzedzia/zbuduj-arkusz.py. */



/* ===== z makiety: home.html ===== */

@media (min-width:600px){
  :root{
    --fs-h1:54px;
    --fs-h2:34px;
    --fs-h3:22px;
    --fs-lead:21px;
  }
}

@media (min-width:1024px){
  :root{
    --fs-h1:72px;
    --fs-h2:34px;
    --fs-h3:24px;
    --fs-h4:20px;
    --fs-lead:22px;
  }
}

@media (min-width:600px){ .container{ padding-inline:var(--space-6); } }

@media (min-width:1024px){ .container{ padding-inline:var(--space-8); } }

@media (min-width:600px){ .ad-breakout{ margin-inline:calc(-1 * var(--space-6)); } }

@media (min-width:1024px){ .ad-breakout{ margin-inline:calc(-1 * var(--space-8)); } }

@media (min-width:600px){
  .ad-slot--header{
    max-width:calc(var(--ad-tablet-w) * 1px);
    aspect-ratio:var(--ad-tablet-w) / var(--ad-tablet-h);
  }
}

@media (min-width:1024px){
  .ad-slot--header{
    max-width:calc(var(--ad-desktop-w) * 1px);
    aspect-ratio:var(--ad-desktop-w) / var(--ad-desktop-h);
  }
}

/* Przyklejenie dopiero od 1024px: poniżej tego progu pasek zawija się
   do 106-195px i przyklejony zjadałby połowę ekranu telefonu. */
@media (min-width:1024px){
  .site-header{ position:sticky; top:0; z-index:50; }
}

@media (min-width:1024px){
  .post-lead__title{
    margin-top:calc(-1 * var(--overlap-title));
    margin-left:var(--space-7);
    max-width:calc(100% - var(--space-7));
  }
}

@media (min-width:560px){ .home-grid{ grid-template-columns:repeat(2,1fr); } }

@media (min-width:900px){ .home-grid{ grid-template-columns:repeat(3,1fr); } }

@media (min-width:1024px){
  
  
  /* Kafel wiodący rastra dostaje typografię displayową */
  
  
}

@media (min-width: 900px) {
  .lead-raster { grid-template-columns: repeat(12, 1fr); column-gap: var(--space-5); row-gap: var(--space-5); }
  .raster-a { grid-column: 1 / span 8; grid-row: 1 / span 2; }
  .raster-b { grid-column: 9 / span 4; grid-row: 1; }
  .raster-c { grid-column: 9 / span 4; grid-row: 2; }
}

@media (min-width: 1024px) {
  .raster-a__title { margin-top: calc(-1 * var(--overlap-title)); margin-left: var(--space-6); max-width: calc(100% - var(--space-6)); }
}

@media (prefers-reduced-motion: reduce) {
  .news-ticker__track { animation: none; width: auto; }
  .news-ticker__viewport { overflow-x: auto; }
  .news-ticker__list[aria-hidden="true"] { display: none; }
}

@media (min-width: 700px)  { .cat-band__grid { grid-template-columns: repeat(3, 1fr); } }

@media (min-width: 700px) {
  .cat-tile { border-top: 0; border-left: var(--border-standard) solid var(--color-black); }
  .cat-tile:first-child { border-left: 0; }
}

@media (max-width: 899px) {
  .site-nav, .site-search { display: none; }
  .site-nav-mobile { display: block; position: relative; }
  .site-nav-mobile > summary {
    list-style: none; cursor: pointer;
    display: inline-flex; align-items: center; gap: var(--space-2);
    padding: var(--space-2) var(--space-3);
    border: var(--border-container) solid var(--color-black);
    background: var(--color-white);
    font-family: var(--font-display); font-size: var(--fs-micro);
    letter-spacing: var(--tracking-wide); text-transform: uppercase;
  }
  .site-nav-mobile > summary::-webkit-details-marker { display: none; }
  .site-nav-mobile[open] > summary { background: var(--color-neon); }
  .site-nav-mobile__bars {
    width: 18px; height: 12px;
    border-top: 3px solid currentColor; border-bottom: 3px solid currentColor;
    position: relative;
  }
  .site-nav-mobile__bars::after {
    content: ""; position: absolute; left: 0; top: 4px;
    width: 100%; border-top: 3px solid currentColor;
  }
  .site-nav-mobile[open] > summary .site-nav-mobile__bars::after { display: none; }
  .site-nav-mobile > ul {
    position: absolute; right: 0; z-index: 60; min-width: 220px;
    margin-top: var(--space-2); padding: 0;
    background: var(--color-white);
    border: var(--border-container) solid var(--color-black);
    box-shadow: var(--shadow-hard);
  }
  .site-nav-mobile > ul li { border-bottom: 1px solid var(--color-gray-light); }
  .site-nav-mobile > ul li:last-child { border-bottom: 0; }
  .site-nav-mobile > ul a {
    display: block; padding: var(--space-3) var(--space-4);
    font-family: var(--font-display); font-size: var(--fs-meta);
    letter-spacing: var(--tracking-wide); text-transform: uppercase;
  }
  .site-nav-mobile > ul a:hover { background: var(--color-neon); }
  /* Panel menu jest biały, więc tekst musi wrócić do czerni —
     inaczej dziedziczy biel z czarnego paska nagłówka. */
  .site-nav-mobile > ul, .site-nav-mobile > ul a { color: var(--color-black); }
  .site-nav-mobile > summary { color: var(--color-black); }

}

@media (min-width: 700px)  { .site-footer .footer-grid { grid-template-columns: repeat(2, 1fr); } }

@media (min-width: 1024px) { .site-footer .footer-grid { grid-template-columns: 2fr 1fr 1fr 1.2fr; } }

@media (min-width: 700px)  { .footer-ads { grid-template-columns: repeat(2, 1fr); } }

@media (min-width: 1024px) { .footer-ads { grid-template-columns: repeat(5, 1fr); } }

@media (prefers-reduced-motion: reduce) { .to-top { transition: none; } }

/* Dotyk: brak najechania, więc informacja stoi odkryta. */
@media (hover: none) {
  .ai-note { transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .ai-note { transition: none; }
}

@media (hover: none) {
  .post-lead__media .ai-note { transform: translateX(0); }
}

@media (prefers-reduced-motion: reduce) {
  .post-lead__media .ai-note { transition: none; }
}

@media (min-width:1024px){ .archive-layout{ grid-template-columns:minmax(0,1fr) 300px; } }

@media (min-width:600px){ .sitemap-links{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-2) var(--space-6); } }

@media (min-width:1024px){ .sitemap-links{ grid-template-columns:repeat(3,minmax(0,1fr)); } }

@media (min-width:700px){ .authors-grid{ grid-template-columns:repeat(2,minmax(0,1fr)); } }

@media (min-width:700px){ .palette-grid{ grid-template-columns:repeat(3,minmax(0,1fr)); } }

@media (min-width:700px){ .sponsored-grid{ grid-template-columns:repeat(3,minmax(0,1fr)); } }

@media (max-width:599px){ .site-topbar__tagline{ display:none; } }

@media (prefers-reduced-motion:reduce){ .site-header .site-nav a.nav-link::after{ transition:none; } }

@media (max-width:1199px){ .site-search__word{ display:none; } }

/* --- menu mobilne --- */
@media (max-width:899px){
  .site-header__row{ min-height:60px; align-items:center; }
  .site-nav, .site-header a.site-search{ display:none; }
  .site-nav-mobile{ margin-left:auto; }
  .site-nav-mobile > summary{ min-height:44px; padding:0 var(--space-3); }
  .site-nav-mobile > ul{
    position:fixed; left:0; right:0; top:auto; min-width:0;
    margin-top:var(--space-3); border-left:0; border-right:0;
    box-shadow:0 var(--shadow-offset) 0 0 var(--color-black);
    max-height:70vh; overflow-y:auto;
  }
  .site-nav-mobile > ul > li > a,
  .site-nav-mobile .mobile-sub > summary{
    display:flex; align-items:center; min-height:52px;
    padding:0 var(--space-4); font-size:var(--fs-h4);
  }
  .site-nav-mobile .mobile-sub > ul{ margin:0 0 var(--space-3) var(--space-4); }
  .site-nav-mobile .mobile-sub > ul a{ min-height:44px; display:flex; align-items:center; }
  .site-nav-mobile__util a{ font-family:var(--font-family-base); text-transform:none; letter-spacing:var(--tracking-normal); font-weight:var(--fw-bold); }
}

@media (max-width:899px){
  .site-navbar{ display:none; }
  .site-header__row{ min-height:56px; }
}

@media (max-width:1023px){
  .site-header .site-nav a.nav-link{ font-size:var(--fs-meta); padding:0 var(--space-3); }
  .site-nav ul.site-nav__list{ margin-left:calc(-1 * var(--space-3)); }
}

@media (max-width:1023px){
  .site-header .site-nav a.nav-link{ font-size:15px; }
}

@media (max-width:359px){
  .footer-ads .ad-slot--footer,
  .footer-ads .ad-slot--footer a,
  .footer-ads .ad-slot--footer img{ width:100%; }
}

@media (min-width:620px){
  .site-footer .footer-grid{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .site-footer .footer-col--about{ grid-column:1 / -1; }
}

@media (min-width:1024px){
  .site-footer .footer-grid{
    grid-template-columns:minmax(0,1.6fr) repeat(3,minmax(0,1fr));
    gap:var(--space-6);
  }
  .site-footer .footer-col--about{ grid-column:auto; }
}

@media (min-width:620px) and (max-width:899px){
  .site-footer .footer-col--about{ grid-column:1 / -1; }
}

@media (min-width:900px){
  .site-footer .footer-grid{
    grid-template-columns:minmax(0,1.5fr) repeat(3,minmax(0,1fr));
    gap:var(--space-6);
  }
  .site-footer .footer-col--about{ grid-column:auto; }
}

@media (min-width:760px){
  .raster-a{ grid-template-columns:minmax(0,1.15fr) minmax(0,1fr); gap:var(--space-6); }
  .raster-a__media{ aspect-ratio:4 / 3; }
}

/* --- dwa kolejne wpisy w równym rzędzie --- */
@media (min-width:620px){
  .lead-raster{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .raster-a{ grid-column:1 / -1; }
}

@media (min-width:860px){
  .hero-slide{ grid-template-columns:minmax(0,1fr) minmax(0,1.1fr); gap:var(--space-8); }
}

@media (min-width:860px){
  .hero-slide__media{ box-shadow:var(--space-4) var(--space-4) 0 0 var(--color-neon), var(--space-4) var(--space-4) 0 var(--border-container) var(--color-black); }
}

@media (prefers-reduced-motion:no-preference){
  .hero-slide.is-active{ animation:hero-in .24s ease-out; }
  @keyframes hero-in{ from{ opacity:0; transform:translateY(6px); } to{ opacity:1; transform:none; } }
}

@media (min-width:860px){
  .hero-latest .hero-slide__media{ box-shadow:var(--space-4) var(--space-4) 0 0 var(--color-neon); }
}

@media (prefers-reduced-motion:no-preference){
  .hero-slide{ transition:opacity .2s linear; }
  .hero-slide:not(.is-active){ opacity:0; }
  .hero-slide.is-active{ opacity:1; animation:none; }
}


/* ===== z makiety: single.html ===== */

@media (min-width:600px){ .home-grid{ grid-template-columns:repeat(2,1fr); } }

@media (min-width:1024px){ .home-grid{ grid-template-columns:repeat(3,1fr); } }

@media (min-width:600px){ .footer-grid{ grid-template-columns:repeat(2,1fr); } }

@media (min-width:1024px){ .footer-grid{ grid-template-columns:repeat(4,1fr); } }


/* ===== z makiety: category.html ===== */

@media (min-width:600px){
  .archive-item{ flex-direction:row; align-items:flex-start; gap:var(--space-6); }
  .archive-item__media{ flex:0 0 280px; width:280px; }
}


/* ===== z makiety: 404.html ===== */

@media (min-width:600px){
  :root{
    --fs-h1:54px;
    --fs-h2:34px;
    --fs-h3:22px;
    --fs-lead:21px;
    --fs-404:160px;
  }
}

@media (min-width:1024px){
  :root{
    --fs-h1:72px;
    --fs-h2:34px;
    --fs-h3:24px;
    --fs-h4:20px;
    --fs-lead:22px;
    --fs-404:200px;
  }
}


/* ===== z makiety: author.html ===== */

@media (min-width:600px){ .tag-grid{ grid-template-columns:repeat(2,1fr); } }

@media (min-width:1024px){ .tag-grid{ grid-template-columns:repeat(3,1fr); } }

/* bold — poprawki do arkusza z makiety.
   =========================================================================
   TEN PLIK PISZEMY RĘCZNIE I TYLKO TEN.

   Pozostałe partiale w tym katalogu generuje narzedzia/wyciagnij-css.py
   z plików w makieta/ — poprawka wpisana w nie zniknie przy pierwszym
   ponownym wyciągnięciu. Tutaj trafia to, co w makiecie jest BŁĘDEM, a nie
   decyzją: rzeczy złapane pomiarem, których nie da się naprawić u źródła,
   bo makieta jest zamkniętą dostawą.

   Każda reguła niżej ma przy sobie liczbę, która ją uzasadnia. Bez liczby
   nie wchodzi — inaczej ten plik w pół roku stanie się drugim arkuszem.

   Wczytywany OSTATNI (patrz main.scss), żeby wygrywał z zapytaniami
   medialnymi z makiety bez podbijania swoistości selektorów.
   ========================================================================= */

/* -------------------------------------------------------------------------
   1. MASZT PRZEWIJAŁ STRONĘ W POZIOMIE NA TELEFONIE

   Zmierzone na oryginalnej makiecie (home.html, Chromium, 320 px):
   dokument miał 402 px przy oknie 320 px.

       .site-header__row   0 … 320   padding 16, czyli 288 px treści
       .site-logo         16 … 283   267 px, flex: 0 0 auto  ← nie oddaje
       .site-header__brandside  307 … 402   95 px            ← wylewa się

   Logo ma `flex: 0 0 auto`, więc nie oddaje ani piksela. Na wyszukiwarkę
   i przycisk menu zostaje 5 px przy potrzebnych 95 — i cały blok wychodzi
   82 px poza okno. Dotyczy KAŻDEGO widoku, bo maszt jest wszędzie ten sam.

   `max-width` jest tu pewniejsze od samego `flex-shrink`: prawa strona ma
   gwarantowane miejsce niezależnie od tego, jak szerokie logo wgra klient,
   a logotypy przychodzą w proporcjach od 4:1 do 10:1.
   ------------------------------------------------------------------------- */
@media (max-width: 1023.98px) {
  .site-logo {
    flex: 0 1 auto;
    min-width: 0;
    max-width: calc(100% - 110px);
  }

  .site-logo img,
  .site-logo__img {
    max-width: 100%;
    height: auto;
  }

  /* Znak tekstowy (portal bez wgranego logotypu) ma `white-space: nowrap`,
     więc bez tego długa domena wystawałaby poza zwężoną płytę zamiast się
     przyciąć. `przyjacielezwierzat.pl` to 22 znaki. */
  .site-logo__znak {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
}

/* Na najwęższych ekranach słowo „Menu” i „Szukaj” obok ikon zabierają
   miejsce, którego nie ma: przy 320 px na logo zostaje wtedy 110 px.
   Ikony zostają, bo one niosą funkcję. */
@media (max-width: 379.98px) {
  .site-search__word,
  .site-nav-mobile__word { display: none; }

  .site-logo { max-width: calc(100% - 86px); }
}

/* -------------------------------------------------------------------------
   2. OFFSET ELEMENTÓW PRZYKLEJONYCH Z TOKENA, NIE Z LICZBY

   Makieta ma offsety wpisane liczbami, a maszt zmienia wysokość: pasek
   użytkowy znika na wąskim ekranie, a pasmo kategorii zawija się w drugi
   rząd, gdy kategorii jest dużo. Skrypt MIERZY maszt i zapisuje wynik do
   `--h-mast` (assets/js/scripts.js) — tutaj jest wartość zapasowa na czas
   przed pierwszym pomiarem i na wypadek wyłączonego JavaScriptu.
   ------------------------------------------------------------------------- */
:root { --h-mast: 150px; }

/* `scroll-margin-top` na nagłówkach treści: wejście z adresu z kotwicą
   (np. z wyników wyszukiwania) nie przechodzi przez nasz handler, więc bez
   tego nagłówek ląduje pod przyklejonym masztem. */
.post-body h2[id],
.post-body h3[id],
.post-faq h2[id] {
  scroll-margin-top: calc(var(--h-mast) + 12px);
}

/* -------------------------------------------------------------------------
   3. ELEMENTY, KTÓRYCH MAKIETA NIE POKAZYWAŁA

   Treść z produkcji ma rzeczy, których makieta nie narysowała, bo jej
   przykładowy artykuł ich nie zawierał. Bez stylu wyglądają jak usterka
   motywu — i tak zostają zgłoszone. W motywie siostrzanym cytaty i tabele
   przyszły jako reklamacja właśnie z tego powodu.
   ------------------------------------------------------------------------- */

/* Znak materiału sponsorowanego na widoku wpisu (wytyczna 12). */
.post-sponsored {
  display: inline-block;
  margin-bottom: var(--space-3);
  padding: var(--space-1) var(--space-3);
  border: var(--border-standard) solid var(--color-black);
  font-family: var(--font-display);
  font-size: var(--fs-micro);
  letter-spacing: var(--tracking-wide);
  text-transform: uppercase;
}

/* Archiwum bez wyników — makieta nie ma tego stanu, a wyszukiwarka trafia
   w niego przy pierwszym nietrafionym zapytaniu. */
.archive-empty {
  padding: var(--space-7) 0;
  border-top: var(--border-divider) solid var(--color-black);
}

.archive-empty p {
  margin-bottom: var(--space-5);
  font-size: var(--fs-lead);
}

/* Formularz wyszukiwania: makieta ma go tylko na 404, a stoi też w pustym
   archiwum. Etykieta jest widoczna, nie schowana — `placeholder` znika po
   pierwszym znaku i nie jest dostępną nazwą pola. */
.search-form__label {
  display: block;
  margin-bottom: var(--space-2);
  font-family: var(--font-display);
  font-size: var(--fs-micro);
  letter-spacing: var(--tracking-wide);
  text-transform: uppercase;
}

.search-form__row { display: flex; gap: var(--space-2); flex-wrap: wrap; }

.search-form__input {
  flex: 1 1 12em;
  min-width: 0;
  padding: var(--space-3);
  border: var(--border-standard) solid var(--color-black);
  font-family: var(--font-family-base);
  font-size: var(--fs-body);
}

/* ZAPOWIEDŹ NA KARCIE MA STAŁĄ WYSOKOŚĆ — BEZPIECZNIK, NIE GŁÓWNY LIMIT.

   Długość tnie PHP (`bld_zajawka()`, 26 słów) i to tam jest decyzja. Tutaj
   stoi tylko zabezpieczenie na wypadek, gdyby ktoś podniósł limit słów albo
   wkleił wypis bez spacji: cztery wiersze to tyle, ile zajmuje 26 słów
   w kolumnie karty przy 412 px. Zmierzone na produkcji — przed poprawką
   jedna karta miała 642 znaki przy jedenastu po ~200 i rozpychała rząd.

   `-webkit-line-clamp` z prefiksem, bo bezprefiksowe `line-clamp` jest
   świeże i na części urządzeń redakcji jeszcze go nie ma; obie deklaracje
   znaczą to samo i młodsza przeglądarka weźmie drugą. */
.archive-item__excerpt,
.search-result__excerpt {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 4;
  line-clamp: 4;
  overflow: hidden;
}

/* FAQ ROZWIJANE — WZORZEC SIECI (atelier, glam, tp-journal).

   Reguły wyglądu paska pytania stoją w _stopka/_wpis z makiety i zostają
   nietknięte: pasek ma dalej być czernią, Antonem i wersalikami. Tutaj jest
   wyłącznie to, czego makieta nie przewidziała, bo w makiecie nie było
   akordeonu — zdjęcie domyślnego wyglądu przycisku, znak stanu i obsługa
   fokusu. Partiale z makiety nadpisuje `wyciagnij-css.py`, ten plik nie.

   NAGŁÓWEK JEST TERAZ POJEMNIKIEM NA PRZYCISK. `<h3>` zostaje dla czytnika
   ekranu, ale cały wygląd niesie `<button>` w środku — stąd wyzerowane
   marginesy pojemnika. Bez tego `.post-body h3` dokłada tu 32 px odstępu
   między ramką a paskiem. */
.post-faq__naglowek { margin: 0; }

/* Przycisk przejmuje wygląd paska: reguła `.post-faq .post-faq__q` z makiety
   trafia w niego tak samo jak wcześniej w nagłówek. Zdejmujemy tylko to, co
   przeglądarka dokłada przyciskom od siebie. */
.post-faq .post-faq__q {
  -webkit-appearance: none;
  appearance: none;
  width: 100%;
  border: 0;
  border-radius: var(--radius-none);
  text-align: left;
  cursor: pointer;
}

/* Tekst pytania bierze całą wolną szerokość, żeby znak stanu stał przy
   prawej krawędzi, a nie tuż za ostatnim wyrazem. */
.post-faq__tekst { flex: 1 1 auto; }

/* ZNAK STANU DOPIERO, GDY JEST CO ROZWIJAĆ.
   Atrybut ustawia skrypt. Bez JavaScriptu blok zostaje odsłonięty i plus
   przy każdym pytaniu obiecywałby interakcję, której nie ma. */
.post-faq[data-rozwijane] .post-faq__q::after {
  content: "+";
  flex: none;
  align-self: center;
  margin-left: var(--space-3);
  font-family: var(--font-family-base);
  font-size: var(--fs-h3);
  font-weight: var(--fw-heavy);
  line-height: 1;
}

.post-faq[data-rozwijane] .post-faq__q[aria-expanded="true"]::after {
  /* Minus drukarski (U+2212), nie dywiz: dywiz przy tym stopniu pisma
     wygląda jak brud na ekranie. */
  content: "\2212";
}

/* FOKUS MUSI BYĆ WIDOCZNY NA CZARNYM PASKU. Domyślna obwódka przeglądarki
   jest ciemna i na czerni znika — bierzemy neon, czyli ten sam sygnał co
   w pozostałych stanach aktywnych motywu. */
.post-faq .post-faq__q:focus-visible {
  outline: var(--focus-offset) solid var(--color-neon);
  outline-offset: calc(var(--focus-offset) * -1);
}

.post-faq .post-faq__q:hover .post-faq__tekst { text-decoration: underline; }

/* NAGŁÓWEK DWUCZŁONOWY REGULAMINU I POLITYKI (uwaga 20).

   Wzór z „Dobrych praktyk” łamie nagłówek rozdziału na dwie linie:
   „Rozdział 1” drobnym pismem, pod spodem „§ DEFINICJE REGULAMINOWE”
   wersalikami. Oba człony są osobnymi elementami w HTML-u, bo tylko tak
   spis treści nad dokumentem może wziąć sam paragraf — numer rozdziału
   w spisie nie niesie żadnej informacji, a powtórzony czytałby się jak
   „1. Rozdział 1”.

   WERSALIKI ROBI `text-transform`, A NIE TREŚĆ. Zapisane w treści kładą
   czytniki ekranu (literują skróty) i trafiłyby w tej formie do spisu.

   Nadtytuł idzie Archivem, nie Antonem: Anton ma jedną wagę i jest wąski,
   więc przy 12 px „Rozdział 1” czyta się jak dopisek z innego dokumentu. */
.naglowek-prawny--dwuczlonowy { display: flex; flex-direction: column; gap: 2px; }

.naglowek-prawny__rozdzial {
  font-family: var(--font-family-base);
  font-size: var(--fs-micro);
  font-weight: var(--fw-bold);
  letter-spacing: var(--tracking-wide);
  text-transform: uppercase;
  color: var(--color-gray);
}

.naglowek-prawny__paragraf { text-transform: uppercase; letter-spacing: var(--tracking-display); }

/* LOGO W STOPCE JEST ODNOŚNIKIEM (uwaga 9).
   Odnośnik jest elementem liniowym, więc bez `inline-flex` pod obrazkiem
   zostaje 4 px na linię bazową — zmierzone, i widać je jako przesunięcie
   ramki wokół fokusu. Reguła stoi tutaj, a nie w _stopka.scss, bo tamten
   partial generuje się z makiety i ponowne wyciągnięcie by ją skasowało. */
.footer-logo__link { display: inline-flex; align-items: center; }

/* Obrazek noty o AI ma swoje tło wypalone w pliku — zderzenie z regułą
   `background:none` z _reklamy.scss nic nie zmienia, ale klasa z makiety
   (`.footer-ai-graphic`) nie jest już przez motyw wypisywana. */
.footer-ai__obraz { background: none; }

/* NOTA O AI JEST JEDNYM OBRAZKIEM (uwaga 9).
   Wcześniej stał tu układ „znaczek + akapit”, więc `.footer-ai` było
   flexem na dwa elementy. Teraz jest jeden, a pojemnik zostaje tylko po
   to, żeby trzymać odstęp od opisu nad nim. */
.footer-ai { margin-top: var(--space-4); }

/* OBRAZEK SKALUJE SIĘ W DÓŁ, NIGDY W GÓRĘ.
   Plik ma 1257 px szerokości przy trzykrotnej gęstości, czyli 419 px
   w układzie. `max-width: 100%` ratuje węższe ekrany, a `width` trzyma go
   w rozmiarze projektowym na szerokich, żeby zdanie na obrazku nie rosło
   nad stopień pisma reszty stopki.

   Obramowanie jest WYPALONE W PLIKU, nie dokładane tutaj — inaczej na
   portalu z przestawionym `--color-black` ramka z arkusza i ramka z pliku
   stałyby obok siebie w dwóch różnych czerniach. */
.footer-ai__obraz {
  display: block;
  width: 419px;
  max-width: 100%;
  height: auto;
}

/* Link „pomiń do treści” — widoczny dopiero po złapaniu fokusu. Bez tego
   pierwszy Tab na stronie prowadzi przez całe menu, zanim dojdzie do treści. */
.skip-link:focus {
  position: fixed;
  top: var(--space-3);
  left: var(--space-3);
  z-index: 100;
  width: auto;
  height: auto;
  clip: auto;
  clip-path: none;
  padding: var(--space-3) var(--space-4);
  background: var(--color-accent);
  color: var(--color-black);
  font-family: var(--font-display);
  text-transform: uppercase;
}

/* -------------------------------------------------------------------------
   4. DŁUGIE SŁOWA ROZPYCHAŁY UKŁAD NA TELEFONIE

   Zmierzone na makiecie (author.html, 320 px): `.author-box__name` z treścią
   „Redakcja pyrzowiceekspres.pl” miał 276 px zawartości w pudełku 282 px
   i wypychał dokument do 327 px. Nazwa autora na portalach tej sieci TO
   nazwa domeny — `przyjacielezwierzat.pl` to 22 znaki bez spacji, których
   przeglądarka nie ma gdzie złamać.

   `break-word`, nie `anywhere`: łamiemy WYŁĄCZNIE słowo, które samo nie
   mieści się w wierszu. `anywhere` pozwalałoby łamać też wtedy, gdy wiersz
   dałoby się ułożyć inaczej, i rozcinałoby krótkie wyrazy w nagłówkach.
   ------------------------------------------------------------------------- */
.post-title,
.archive-head__title,
.hero-slide__title,
.grid-tile__title,
.cat-tile__title,
.archive-item__title,
.author-box__name,
.author-item__title,
.sitemap-links a,
.post-body,
.policy-body,
.footer-about,
.footer-col a {
  overflow-wrap: break-word;
}

/* `caption.visually-hidden` w tabelach: makieta chowa podpis klasą, ale
   przeglądarka i tak układa go w jednym wierszu o szerokości 723 px
   wewnątrz kontenera przewijanego. Nie wychodzi poza ekran, ale sztucznie
   rozszerza obszar przewijania tabeli o połowę. */
.post-table__scroll caption.visually-hidden {
  white-space: nowrap;
  width: 1px;
}

/* Pasek górny: menu służbowe musi się ZAWIJAĆ, nie rozpychać strony.

   `.site-topbar__row` ma `flex-wrap:wrap`, ale sama lista odnośników już nie
   — i to ona jest za szeroka. Makieta ma tam dwie pozycje (Redakcja, Kontakt)
   plus hasło serwisu, więc problem w projekcie nie wychodzi. Na portalu lista
   bierze się z menu i potrafi mieć pięć pozycji: Redakcja, Mapa witryny,
   Kontakt, Polityka prywatności, Regulamin.

   Zmierzone na localhoście przy 390 px: dokument miał 454 px szerokości,
   czyli 64 px przewijania w poziomie na KAŻDEJ podstronie — a poziome
   przewijanie na telefonie psuje odbiór całego serwisu, nie samego paska.

   `column-gap` zostaje bez zmian, `row-gap` schodzi do zera: zawinięty wiersz
   ma dosiąść poprzedniego, a nie rozepchnąć czarnego paska na trzy wysokości. */
.site-topbar__links {
  flex-wrap: wrap;
  row-gap: 0;
  min-width: 0;
}

@media (max-width: 599px) {
  /* Hasło serwisu i tak jest tu ukryte (_zapytania.scss), więc odnośniki
     dostają całą szerokość i zaczynają od lewej — wyśrodkowanie resztką
     miejsca po haśle wyglądałoby na pomyłkę. */
  .site-topbar__row { justify-content: flex-start; }
}

/* Metryczka pozycji wyszukiwania.

   Makieta ma w tym miejscu `<p class="meta">` z samą datą. Motyw składa
   metryczkę z kilku `<span class="meta">` (data, ewentualna aktualizacja),
   więc opakowanie musi je ułożyć w wiersz — zagnieżdżenie `.meta` w `.meta`
   dałoby podwójny rozmiar i podwójny kolor. Te same reguły co
   `.archive-item__meta`, bo to ta sama rola. */
.search-result__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-3);
}

/* Pasmo działowe wypełnia szerokość niezależnie od liczby kafli.

   `_zapytania.scss` ustawia tu `repeat(3, 1fr)` na sztywno. Dział, który po
   odjęciu wpisów użytych w otwarciu i w siatce ma mniej niż trzy pozycje,
   zostawiał wtedy pustą komórkę — a `.cat-tile` ma lewą krawędź, więc
   w pustym miejscu wisiała pionowa kreska i rząd wyglądał na urwany.

   Liczbę kolumn podaje szablon (`--kolumn-pasma`), bo zna ją dopiero po
   pobraniu wpisów. Wartość zapasowa to 3 — tyle, ile wynosi BLD_PASMO_DZIALU,
   więc arkusz bez zmiennej zachowuje się jak dotąd. */
@media (min-width: 700px) {
  .cat-band__grid {
    grid-template-columns: repeat(var(--kolumn-pasma, 3), minmax(0, 1fr));
  }
}

/* Menu główne: stan niesie PODKREŚLENIE, nie plama tła.

   Dotąd najechanie i strona bieżąca podmieniały tło pozycji na szare
   (`--color-bg-section`), a pozycje podmenu na neonowe — i to obok paska
   `::after`, który już ten stan pokazuje. Dwa sygnały na raz, z czego jeden
   zamalowuje pozycję kolorem. W pasku, który stoi na białym tle i ma pod
   sobą czarną krawędź, wystarczy pasek.

   Neon zostaje tam, gdzie coś znaczy: na pasku pod pozycją. Nie jest tłem
   całego przycisku. */
.site-header .site-nav a.nav-link:hover,
.site-header .site-nav a.nav-link:focus-visible,
.site-header .site-nav a.nav-link[aria-current="page"],
.site-header .site-nav ul.site-nav__sub a:hover,
.site-header .site-nav ul.site-nav__sub a:focus-visible {
  background: none;
}

/* „Zobacz cały dział” NIE MA klasy `nav-link`, więc nie ma paska `::after`
   i po zdjęciu tła zostałoby bez żadnej odpowiedzi na najechanie. Dostaje
   podkreślenie tekstu — ten sam język, inny nośnik. */
.site-header .site-nav .site-nav__sub-all a:hover,
.site-header .site-nav .site-nav__sub-all a:focus-visible {
  background: none;
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: var(--border-standard);
}
