.elementor-kit-6{--e-global-color-primary:#6EC1E4;--e-global-color-secondary:#54595F;--e-global-color-text:#7A7A7A;--e-global-color-accent:#61CE70;--e-global-typography-primary-font-family:"Lora";--e-global-typography-primary-font-weight:700;--e-global-typography-secondary-font-family:"Lora";--e-global-typography-secondary-font-weight:600;--e-global-typography-text-font-family:"Public Sans";--e-global-typography-text-font-weight:400;--e-global-typography-accent-font-family:"Public Sans";--e-global-typography-accent-font-weight:600;font-family:"Public Sans", Sans-serif;font-weight:400;}.elementor-kit-6 e-page-transition{background-color:#FFBC7D;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1140px;}.e-con{--container-max-width:1140px;}.elementor-widget:not(:last-child){--kit-widget-spacing:20px;}.elementor-element{--widgets-spacing:20px 20px;--widgets-spacing-row:20px;--widgets-spacing-column:20px;}{}h1.entry-title{display:var(--page-title-display);}.site-header .site-branding{flex-direction:column;align-items:stretch;}.site-header{padding-inline-end:0px;padding-inline-start:0px;}.site-footer .site-branding{flex-direction:column;align-items:stretch;}@media(max-width:1200px){.elementor-section.elementor-section-boxed > .elementor-container{max-width:1024px;}.e-con{--container-max-width:1024px;}}@media(max-width:767px){.elementor-section.elementor-section-boxed > .elementor-container{max-width:767px;}.e-con{--container-max-width:767px;}}:root { --zielen-800:#122E22; --font-naglowki:Lora; --e-gv-3fdb896:#123456; --zielen-900:#0D2018; --zielen-700:#1A4433; --zielen-600:#215540; --zielen-500:#2C6B51; --zielen-200:#BEDACB; --zielen-100:#DDEBE3; --zielen-050:#F0F6F2; --miedz-700:#9E5525; --miedz-500:#C46A2E; --grafit-900:#151C19; --grafit-700:#39443F; --grafit-500:#606A65; --linia-kontrolki:#808582; --linia-dekor:#D6DFDA; --biel:#FFFFFF; --tlo:#F7F9F8; --focus:#DB5309; --alarm-700:#8E1F1F; --uwaga-700:#7A4B00; --info-700:#1B4E7A; --font-tresc:Public Sans; --miedz-200:#E8B98A; --bip-700:#A31515; --bip-800:#8E1F1F; --kontrast-czern:#000000; --kontrast-biel:#FFFFFF; }
/* Start custom CSS *//* ==========================================================================
   Gmina Bobrowice — Custom CSS zestawu (Elementor → Ustawienia witryny)
   Batch 5b, COS-311. Zrodlo: _build/elementor/kit-custom-css.css

   ── DLACZEGO TO ISTNIEJE (i dlaczego to NIE jest obejscie D-06) ──────────

   Zmierzone na tej instancji 2026-09-01: Elementor emituje reguly klas
   globalnych WYLACZNIE dla klas podpietych atomic propsem `classes`. Klasa
   wpisana w `_css_classes` widgetu v3 trafia do markupu, ale jej regula
   NIE POWSTAJE — cicho, bez bledu. Markup pochodzacy ze shortcode'a wtyczki
   (pasek dostepnosci, menu, wyszukiwarka, burger, <time>) nie ma wiec zadnej
   drogi do klas globalnych.

   Drugi powod: schemat propsow atomic nie zna `top`, `white-space`,
   `text-overflow`, `flex`, `transition` ani selektorow potomka. Reguly, ktore
   ich wymagaja, nie daja sie wyrazic klasa globalna w ogole.

   D-06 mowi: „jesli zmiane da sie zrobic w panelu bez wydania wtyczki, to nie
   moze trafic do kodu". Ten plik JEST panelem — Ustawienia witryny → Custom CSS.
   Zmiana dowolnej wartosci to jedno pole w Elementorze, zero wydan wtyczki.

   ── KONTRAKT ─────────────────────────────────────────────────────────────
   1. ZERO wartosci koloru. Kazdy kolor to `var(--token)` z Variables.
   2. Rozmiary pisma w `rem` — przelacznik rozmiaru tekstu dziala przez
      `font-size` na <html>. `px` zabilby go po cichu.
   3. Zadna klasa nie jest tu definiowana rownolegle z klasa globalna.
      Wyjatki sa dwa i oba dotycza STANU, ktorego klasa globalna nie wyraza:
      `img.b-karta__foto:not([src])` i `img.b-wpis__foto:not([src])`.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Przyklejony naglowek
   Regula MUSI siedziec na <header class="elementor-location-header">, a nie
   na kontenerze w srodku: element sticky wedruje wylacznie w granicach rodzica,
   a rodzic o tej samej wysokosci daje zero dystansu — element cicho zachowuje
   sie jak `static`, mimo poprawnego `position:sticky` w getComputedStyle.

   Ujemny `top` odtwarza referencje doslownie: pasek dostepnosci ma odjechac,
   a przykleic sie ma dopiero rzad nawigacji. Wartosc = wysokosc paska.
   Desktop i tablet: 48 px. Telefon: 56 px (referencja @767).
   -------------------------------------------------------------------------- */
header.elementor-location-header {
	position: sticky;
	top: 0;
	z-index: 100;
}

@media ( max-width: 767px ) {
	header.elementor-location-header { top: 0; }
}

/* Pasek administratora WP przesuwa punkt przyklejenia. Dotyczy tylko widoku
   zalogowanego — na pomiarach QA pasek i tak jest wylaczany. */
body.admin-bar header.elementor-location-header { top: 32px; }

@media ( max-width: 782px ) {
	body.admin-bar header.elementor-location-header { top: 46px; }
}

/* `text-overflow` i `white-space` nie istnieja w schemacie propsow atomic. */
.b-marka__nazwa {
	white-space: nowrap;
	text-overflow: ellipsis;
}

/* --------------------------------------------------------------------------
   2. Pasek dostepnosci — markup ze `[bobrowice_pasek_dostepnosci]`
   Przeniesienie regul `.pasek*` z zatwierdzonej referencji v2.
   -------------------------------------------------------------------------- */
.b-pasek__wrap > .elementor-widget-shortcode {
	flex: 1 1 auto;
	min-width: 0;
}

.b-a11y {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	flex-wrap: wrap;
	width: 100%;
}

.b-a11y__grupa,
.b-a11y__rozmiar {
	display: flex;
	align-items: center;
	gap: 8px;
}

.b-a11y__etykieta {
	color: var( --zielen-200 );
	margin-inline-end: 4px;
}

.b-a11y__btn {
	background: transparent;
	border: 1px solid transparent;
	border-radius: 4px;
	color: var( --biel );
	font: inherit;
	font-weight: 600;
	cursor: pointer;
	padding: 8px 12px;
	min-height: 44px;
	display: inline-flex;
	align-items: center;
	gap: 8px;
	text-decoration: none;
}

/* 🔴 `:focus` MUSI byc tu obok `:hover`. Elementor wysyla w `reset.css`:
       [type=button]:focus, [type=button]:hover, button:focus, button:hover
       { background-color:#c36; color:#fff }
   czyli (0,1,1). Bez tej reguly KAZDY przycisk paska dostepnosci robil sie po
   kliknieciu MAGENTOWY — zmierzone na renderze 2026-09-01, `backgroundColor`
   = rgb(204,51,102). To ta sama pulapka, ktora kanon opisuje dla burgera
   („reguly kitow na golym selektorze `button` bija wlasne klasy"), tyle ze
   dotyczy takze STANU `:focus`, nie tylko stanu spoczynkowego. */
.b-a11y__btn:hover,
.b-a11y__btn:focus {
	background: var( --zielen-700 );
	border-color: var( --zielen-600 );
	color: var( --biel );
}

/* Stan wlaczony — kontrast bieli na `zielen-600` wynosi 8,61:1.
   Powtorzony z `:focus`, zeby wcisniety przycisk nie zmienial znaczenia
   koloru w chwili, w ktorej dostaje fokus. */
.b-a11y__btn[aria-pressed="true"],
.b-a11y__btn[aria-pressed="true"]:focus {
	background: var( --zielen-600 );
	border-color: var( --zielen-200 );
	color: var( --biel );
}

.b-a11y__btn--rozmiar {
	min-width: 44px;
	justify-content: center;
}

.b-a11y__ikona {
	display: inline-flex;
	align-items: center;
}

/* @767 referencja: etykieta i teksty przyciskow znikaja, zostaja ikony
   z nazwami dostepnymi; pasek trzyma jeden wiersz bez zawijania. */
@media ( max-width: 767px ) {
	.b-a11y { gap: 8px; flex-wrap: nowrap; }
	.b-a11y__etykieta { display: none; }
	.b-a11y__tekst { display: none; }
	.b-a11y__btn { padding: 8px; min-width: 44px; justify-content: center; }
}

/* --------------------------------------------------------------------------
   3. Menu glowne desktopu — markup ze `[bobrowice_menu_glowne]`
   Przeniesienie regul `nav.glowne` i `.bip` z referencji v2.
   -------------------------------------------------------------------------- */





/* BIP jest jednoczesnie pozycja menu i kaflem (SPEC S1) — jedyny element,
   dla ktorego duplikacja jest uzasadniona. Wyroznienie przyciskiem, nie kolorem.

   🔴 Czerwien, nie zielen — prosba Wojta ze spotkania 2026-09-03 (COS-69, D-21).
   Token `--bip-700` jest ODDZIELNY od `--alarm-700`, zeby czerwien ostrzegawcza
   i czerwien BIP dalo sie w przyszlosci rozjechac bez ruszania obu naraz;
   `--bip-800` (hover) celowo rowna sie wartosci alarmu, zeby nie mnozyc odcieni.

   Kontrast zmierzony na renderze publicznym 2026-09-03 (B95/B96), nie przepisany:
   wartosci w raporcie rundy. Poprzedni komentarz mowil „10,95:1" dla zieleni —
   po zmianie ta liczba juz nie opisuje tego przycisku i zostala zdjeta. */



/* --------------------------------------------------------------------------
   4. Wyszukiwarka — markup ze `[bobrowice_szukaj]`
   `--linia-kontrolki` (3,05:1), NIE `--linia-dekor`: to obramowanie NIESIE
   znaczenie, wiec obowiazuje token kontrolki (SPEC §1.1).
   -------------------------------------------------------------------------- */
.b-szukaj {
	display: flex;
	align-items: center;
	border: 2px solid var( --linia-kontrolki );
	border-radius: 4px;
	background: var( --biel );
}

/* O-115 (1.27.2): szerokość, padding i ramkę pola ustala `reset.css` motywu — `input[type="search"]` (0,1,1) bije tę
   klasę (0,1,0). Zmierzone 2026-09-17 na 1025–1920: 216 px, 8 / 16 px, 1 px #666 — dawne `width` 180 / 170 / 130,
   `padding` i `border: 0` nie działały nigdzie i zostały usunięte (kanon = render, `_build/cos327t/c-martwe.json`). */
.b-szukaj__pole {
	font: inherit;
	font-family: var( --font-tresc );
	font-size: 0.9375rem;
	min-height: 44px;
	background: transparent;
	color: var( --grafit-900 );
}

.b-szukaj__pole::placeholder { color: var( --grafit-500 ); opacity: 1; }

.b-szukaj__btn {
	border: 0;
	padding: 0;
	background: var( --zielen-700 );
	color: var( --biel );
	min-width: 48px;
	min-height: 44px;
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
}

.b-szukaj__btn:hover,
.b-szukaj__btn:focus {
	background: var( --zielen-600 );
	color: var( --biel );
}

/* --------------------------------------------------------------------------
   5. Burger — mechanika jest we wtyczce, tutaj tylko wyglad z referencji
   -------------------------------------------------------------------------- */
.b-burger {
	width: 48px;
	height: 48px;
	border: 2px solid var( --linia-kontrolki ) !important;
	border-radius: 4px !important;
	background: var( --biel ) !important;
	color: var( --zielen-800 );
}

/* --------------------------------------------------------------------------
   6. Panel off-canvas — typografia pozycji (mechanika w arkuszu wtyczki)
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   7. Karta wpisu i wpis — stany, ktorych klasa globalna nie wyraza
   -------------------------------------------------------------------------- */

/* SPEC S4: „wariant karty bez obrazu, NIE placeholder z ikona aparatu".
   Przy braku miniatury `e-image` renderuje <img> BEZ atrybutu `src` — chowamy
   dokladnie ten przypadek. Przy 1 235 wpisach z lat 2014–2026 czesc nie ma
   miniatury i to jest normalny wariant karty, nie blad. */
img.b-karta__foto:not( [src] ),
img.b-wpis__foto:not( [src] ) {
	display: none;
}

/* Tag dynamiczny `post-terms` zwraca <a rel="tag"> — pigulka znacznika ma
   wygladac tak samo, niezaleznie od tego, ze jej zawartosc jest odnosnikiem. */
.b-znacznik a {
	color: inherit;
	text-decoration: none;
}

.b-znacznik a:hover { text-decoration: underline; }

/* Data w <time> ze `[bobrowice_data]` — typografia jak `b-meta`. */
.b-data__czas {
	color: var( --grafit-500 );
	font-family: var( --font-tresc );
	font-size: 0.875rem;
	line-height: 1.5;
}

.b-data > .elementor-widget-shortcode { display: inline-flex; align-items: center; }

/* --------------------------------------------------------------------------
   8. Tresc wpisu — markup pochodzi z redakcji, nie z Elementora
   Selektorow potomka nie da sie wyrazic klasa globalna, wiec caly ten blok
   zyje tutaj. Hak to `#b-wpis-tresc` (`_cssid`), nie klasa — atomic `_cssid`
   daje `id`, a nie klase, i CSS z kropka umarlby po cichu.
   -------------------------------------------------------------------------- */
#b-wpis-tresc > *:first-child { margin-top: 0; }

/* 🔴 Rozmiary przeniesione z ZATWIERDZONEJ referencji szablonu wpisu
   (`…-prototyp-szablon-wpisu-2026-09-02.html`, blok `.wpis-tresc`), a nie
   odziedziczone po body. Zmierzone przed zmiana: tresc szla 16 px zamiast 18,
   przez co wiersz w kolumnie 712 px mial 87,7 znaku — powyzej twardego limitu
   85 z kanonu §4. Referencja miala racje, build ja gubil.
   Jednostki w `rem`, bo przelacznik rozmiaru tekstu dziala przez `font-size`
   na `<html>` (kontrakt tego pliku). */
#b-wpis-tresc p,
#b-wpis-tresc ul,
#b-wpis-tresc ol {
	font-size: 1.125rem;
	line-height: 1.6;
	color: var( --grafit-900 );
}

#b-wpis-tresc p { margin: 0 0 24px; }

#b-wpis-tresc h2 {
	font-family: var( --font-naglowki );
	font-weight: 700;
	font-size: 1.75rem;
	line-height: 1.25;
	color: var( --zielen-800 );
	margin: 40px 0 16px;
}

#b-wpis-tresc h3 {
	font-family: var( --font-naglowki );
	font-weight: 600;
	font-size: 1.3125rem;
	line-height: 1.3;
	color: var( --zielen-800 );
	margin: 32px 0 12px;
}

#b-wpis-tresc ul,
#b-wpis-tresc ol { margin: 0 0 24px; padding-inline-start: 24px; }

#b-wpis-tresc li { margin-bottom: 8px; }

#b-wpis-tresc a {
	color: var( --zielen-700 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

#b-wpis-tresc blockquote {
	border-inline-start: 3px solid var( --zielen-500 );
	padding-inline-start: 24px;
	margin: 24px 0;
	color: var( --grafit-700 );
}

/* Trzy reguly ponizej sa ochrona kryterium B3 dla TRESCI Z MIGRACJI.
   Wpisy z lat 2014–2026 niosa szerokie tabele, osadzenia i obrazy o sztywnej
   szerokosci — bez tego kazdy taki wpis wypchnalby strone poza ekran. */
#b-wpis-tresc img,
#b-wpis-tresc iframe,
#b-wpis-tresc video,
#b-wpis-tresc embed,
#b-wpis-tresc object { max-width: 100%; height: auto; }

#b-wpis-tresc img { border-radius: 8px; }

#b-wpis-tresc table {
	display: block;
	width: 100%;
	overflow-x: auto;
	border-collapse: collapse;
	margin-bottom: 24px;
	font-size: 1rem;
}

/* 🔴 `color` i `background` KOMOREK jawnie, bo bez nich dziedziczy sie
   domyslny tekst Elementora `#7A7A7A` i jego wlasne tlo `rgba(128,128,128,.07)`
   na `td`. Zmierzone przed zmiana na tabeli wpisu 8065: naglowek **3,92:1**,
   komorka **~3,7:1** — obie ponizej progu 4,5:1 (WCAG SC 1.4.3). Regula
   `font-size`/`color` obok obejmowala tylko `p`, `ul`, `ol`, wiec tabele
   z migracji nigdy nie dostaly koloru marki. */
#b-wpis-tresc th,
#b-wpis-tresc td {
	border: 1px solid var( --linia-kontrolki );
	padding: 12px 16px;
	text-align: left;
	color: var( --grafit-900 );
	background-color: transparent;
	font-size: 1rem;
	line-height: 1.6;
}

#b-wpis-tresc th { background-color: var( --zielen-050 ); font-weight: 700; }

/* ── Tabela transkrypcji skanu: ramka przewijania osiagalna Tabem (COS-69) ──
   Regula wyzej czyni scrollerem SAMA tabele. Obszar z paskiem przewijania
   musi byc osiagalny z klawiatury (WCAG 2.1.1), a `tabindex` na `<table>`
   bywa, ze odbiera mu role u czytnikow — dlatego dla tabel dopisanych
   transkrypcja przewijanie przechodzi na RAMKE, a tabela wraca do
   `display: table`. Ten sam wzorzec co `b-str__tabela-ramka` na `/gmina/`.
   Zmierzone na 390 px przed zmiana: tabela 343 px przewijala tresc szersza
   niz widok, bez zadnego elementu ogniskowalnego. */
#b-wpis-tresc .b-transkrypcja__tabela {
	overflow: auto;
	margin-bottom: 24px;
}

#b-wpis-tresc .b-transkrypcja__tabela table {
	display: table;
	overflow-x: visible;
	margin-bottom: 0;
}

/* Opis pliku doklada filtr tresci wtyczki 1.7.0 (typ i rozmiar). Wyglad —
   tutaj, bo `#b-wpis-tresc a` to selektor potomka markupu z redakcji (§4j). */
#b-wpis-tresc a[href$=".pdf"],
#b-wpis-tresc a[href$=".doc"],
#b-wpis-tresc a[href$=".docx"],
#b-wpis-tresc a[href$=".xls"],
#b-wpis-tresc a[href$=".xlsx"],
#b-wpis-tresc a[href$=".ppt"],
#b-wpis-tresc a[href$=".pptx"],
#b-wpis-tresc a[href$=".rtf"],
#b-wpis-tresc a[href$=".odt"],
#b-wpis-tresc a[href$=".zip"] { font-weight: 600; }

#b-wpis-tresc .b-plik__opis {
	font-weight: 400;
	color: var( --grafit-500 );
	text-decoration: none;
	white-space: nowrap;
}

@media (max-width: 767px) {

	#b-wpis-tresc p,
	#b-wpis-tresc ul,
	#b-wpis-tresc ol { font-size: 1rem; }
}

#b-wpis-tresc pre { overflow-x: auto; }

/* --------------------------------------------------------------------------
   8a. Lista skrotow w sidebarze wpisu — JEDNA regula, ktorej atomic nie wyraza
   `list-style` nie jest propsem (STAN-STAGING §4e). Cala reszta wygladu tego
   komponentu zyje w klasach globalnych `b-kafle-lista` / `b-kafel-lista`.
   -------------------------------------------------------------------------- */
.b-kafle-lista { list-style: none; }

/* --------------------------------------------------------------------------
   9. Paginacja archiwum (widget Loop Grid)
   -------------------------------------------------------------------------- */
.elementor-pagination {
	margin-top: 48px;
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	align-items: center;
}

.elementor-pagination .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 44px;
	min-height: 44px;
	padding: 0 12px;
	border: 1px solid var( --linia-kontrolki );
	border-radius: 4px;
	color: var( --zielen-800 );
	font-family: var( --font-tresc );
	font-weight: 600;
	text-decoration: none;
	background: var( --biel );
}

.elementor-pagination .page-numbers:hover {
	border-color: var( --zielen-600 );
	color: var( --zielen-700 );
}

.elementor-pagination .page-numbers.current {
	background: var( --zielen-700 );
	border-color: var( --zielen-700 );
	color: var( --biel );
}

/* --------------------------------------------------------------------------
   10. Pierscien fokusu — jeden kolor na cala witryne (SPEC §1.5 pkt 2, D-15a)

   🔴 DLACZEGO SELEKTOR JEST WYPISANY, A NIE ZWINIETY W `:where()`
   Elementor wysyla w `reset.css` wlasna regule:
       a:focus-visible, button:focus-visible, input:focus-visible, …
       { box-shadow:0 0 0 4px #fff; outline:2px solid #000; outline-offset:2px }
   Jej specyficznosc to (0,1,1). Poprzednia wersja tej reguly (wtyczka 1.2.1)
   uzywala `:where(…)`, ktore ma z definicji ZEROWA specyficznosc — cale
   (0,1,0) — i przegrywala. Zmierzone Tabem na renderze 2026-09-01: pierscien
   byl czarny 2 px z bialym halo, a nie miedziany 3 px. Pierscien marki nie
   pojawial sie na ZADNYM odnosniku, przycisku ani polu.

   Wypisany selektor daje (0,1,1) — remis ze specyficznoscia Elementora,
   rozstrzygany KOLEJNOSCIA arkuszy. `post-6.css` (Custom CSS zestawu) jest
   emitowany PO frameworku, wiec wygrywa. To jest powod, dla ktorego regula
   mieszka tutaj, a nie we wtyczce.

   `box-shadow: none` zdejmuje biale halo Elementora — kontrast policzony
   w D-15a dotyczy pierscienia na tle SEKCJI (dodatni `outline-offset`),
   a halo zmienialoby to odniesienie.

   Kontrast #DB5309 na pieciu tlach serwisu: biel 4,00 · tlo 3,78 ·
   zielen-050 3,65 · zielen-800 3,65 · zielen-900 4,25. Prog 3:1 (SC 1.4.11).
   -------------------------------------------------------------------------- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:not( [tabindex="-1"] ):focus-visible {
	outline: 3px solid var( --focus );
	outline-offset: 3px;
	border-radius: 2px;
	box-shadow: none;
}

/* --------------------------------------------------------------------------
   11. Pierscien fokusu na WLASNYCH kontrolkach chrome'u — wyzsza specyficznosc

   🔴 Zmierzone 2026-09-01 po wdrozeniu bloku 10: odnosniki dostaly pierscien
   marki (#DB5309, offset 3 px), ale `.b-a11y__btn` (button) i `.b-szukaj__pole`
   (input) NIE — mialy `outline-color` rowny WLASNEMU `color` elementu
   (bialy na pasku, grafitowy w polu) i offset 0 / −2 px. Czyli wygrywala je
   regula bardziej szczegolowa od naszej (0,1,1).

   Zamiast szukac jej po arkuszach osob trzecich — a ta lista rosnie z kazda
   aktualizacja Elementora — podnosimy wage TAM, GDZIE MAMY WLASNA KLASE:
   `.b-…:focus-visible` wazy (0,2,0) i bije kazda regule elementowa.
   To jest tanszy i trwalszy zapis niz `!important`, bo nie odbiera nikomu
   mozliwosci nadpisania na wyzszym poziomie.
   -------------------------------------------------------------------------- */
.b-a11y__btn:focus-visible,
.b-szukaj__pole:focus-visible,
.b-szukaj__btn:focus-visible,
.b-burger:focus-visible,
.b-oc__zamknij:focus-visible,
.b-oc__lista a:focus-visible,
.b-oc__lista button:focus-visible,
.b-menu > li > a:focus-visible,
.b-menu > li > button:focus-visible,
.b-podmenu a:focus-visible,
.b-podmenu button:focus-visible,
.b-oc__szukaj button:focus-visible,
.b-bip:focus-visible,
.b-stopka__link:focus-visible,
.b-skip__link:focus-visible {
	outline-style: solid;
	outline-width: 3px;
	/* 🔴 `!important` UZYTE ŚWIADOMIE — powod jest zmierzony, nie domyslony. Po podniesieniu wagi do (0,2,0) `<button>` i `<input>` nadal
	   pokazywaly `outline-style: solid` i `outline-width` Z NASZEJ reguly, ale
	   `outline-color` rowny wlasnemu `color` elementu (czyli wartosci poczatkowej
	   `currentColor`) i `outline-offset` 0 albo −2 px. Skoro szerokosc i styl sa
	   nasze, a kolor i offset nie, to znaczy, ze konkurent nadpisuje DOKLADNIE TE
	   DWA LONGHANDY i robi to pozniej. Specyficznoscia tego nie wygramy inaczej niz
	   licytujac sie w nieskonczonosc z arkuszami, ktore zmieniaja sie z kazda
	   aktualizacja Elementora — a pierscien fokusu na kontrolce formularza to
	   kryterium odbioru (WCAG 2.2 SC 2.4.11), nie detal.
	   Zakres jest waski: tylko WLASNE klasy `b-*`, tylko te dwie wlasnosci.
	   (Drugie miejsce z `!important` w tym pliku to `.b-burger` — tam powod jest
	   inny i przeniesiony z kanonu: reguly kitow na golym selektorze `button`
	   bija wlasne klasy, wiec burger i ✕ musza sie z nich wypiac.) */
	outline-color: var( --focus ) !important;
	outline-offset: 3px !important;
	border-radius: 2px;
	box-shadow: none;
}


/* --------------------------------------------------------------------------
   13. Szablon strony informacyjnej — JEDENAŚCIE reguł, których atomic nie wyraża
   Cała reszta wyglądu tego szablonu (39 klas) żyje w Global Classes. Tutaj
   siedzi wyłącznie to, czego nie ma w schemacie propsów (STAN-STAGING §4e):
   `top`, `list-style`, `border-*-width` per bok, pseudoelement, `border-collapse`,
   `white-space`, `vertical-align` oraz reguły stanu `:last-child`.
   -------------------------------------------------------------------------- */

/* `position: sticky` jest propsem, `top` NIE — bez tego kolumna się nie klei.
   🔴 184, nie 120 — PRZELICZONE 2026-09-05 (COS-327). Pierwotne 120 = przyklejony
   nagłówek 96 + 24 ze skali odstępów. Pakiet A zadania COS-326 (nagłówek
   trzyrzędowy, D-29c) podniósł przyklejone chrome do 155,3 px, a tej liczby
   nikt nie przeliczył — zmierzone na renderze: 35,3 px kolumny bocznej chowało
   się za paskiem. 155,3 + 24 = 179,3, w górę do wielokrotności 8 → 184.
   ⚠ Ta sama przeszkoda rządzi `scroll-margin-top` klas `b-str__sekcja`
   i `b-h2--strona` (tam 184 / 168 / 96 per breakpoint). Przy każdej zmianie
   wysokości nagłówka trzeba przeliczyć WSZYSTKIE TRZY. */
/* D-75 D3+D4: `top` liczony od `--b-przeszkoda` — reguła na końcu arkusza (blok D-75 D3+D4). */
.b-str__bok { top: calc( var( --b-przeszkoda, var( --b-przeszkoda-zapas, 224px ) ) + 24px ); }

@media (max-width: 1200px) {

	.b-str__bok { top: auto; }
}

/* ── D-74 (B256) — prawy sidebar WPISU klei się tak samo jak sidebar STRONY.
   Zmierzone anonimowo 2026-09-15 (Playwright, realne okno): strona `NAV.b-str__bok`
   = `sticky / top:232px`, wpis `ASIDE.b-wpis__bok` = `relative` — nie kleił się wcale.

   🔴 Dlaczego waga (0,4,0), a nie zwykłe `.b-wpis__bok`: `position` JEST propsem,
   więc klasa globalna wpisu niesie własne `position: relative`
   (`.elementor .b-wpis__bok`, waga (0,2,0), plik `global-8162-frontend-desktop.css`),
   a ten plik ładuje się PO arkuszu zestawu. Reguła o równej wadze przegrywa
   KOLEJNOŚCIĄ — zmierzone: (0,2,0) zostawia `relative` na 12 z 12 pomiarów,
   (0,4,0) daje `sticky` na 12 z 12. Ta sama logika co kotwica `#b-stopka` niżej:
   wyższa waga zamiast `!important`, bo `!important` w tym arkuszu jest
   zarezerwowane dla reguł niosących WYBÓR UŻYTKOWNIKA (`html[data-b-linki]`).

   ⚠ Próg jednej kolumny zmierzony co 1 px w paśmie 1240–900: **1200 px** dla
   OBU szablonów (strona i wpis). Poniżej progu sidebar schodzi pod treść, więc
   `position` wraca do `static` — dokładnie jak `.b-str__bok`, któremu robi to
   `global-8508-frontend-tablet.css`. Lustro zmierzone na 6 szerokościach
   (1440 / 1201 / 1200 / 1100 / 768 / 390): 6 z 6 wartości wyliczonych zgodnych
   ze stroną. ⚠ `top` zmienia się RAZEM z `.b-str__bok` wyżej — to czwarte
   miejsce w tej rodzinie (obok `scroll-margin-top` klas `b-str__sekcja`
   i `b-h2--strona`). ── */
.elementor .b-wpis .b-reset.b-wpis__bok { position: sticky; top: calc( var( --b-przeszkoda, var( --b-przeszkoda-zapas, 224px ) ) + 24px ); }

@media (max-width: 1200px) {

	.elementor .b-wpis .b-reset.b-wpis__bok { position: static; top: auto; }
}

/* ── D-60d (R3 pkt 3) — <h1> treści w `--grafit-900` zamiast `#333` motywu.
   Parametr wyznaczony pomiarem 2026-09-15 (`_build/pomiary/wsad-r2-2026-09-15/r3_d60d_h1.py`,
   anonimowo, 10 typów stron x 2 szerokości, 20 nagłówków): waga (0,0,1) WYSTARCZA —
   18 z 18 nagłówków treściowych w `rgb(21,28,25)`, hero zostaje białe 2 z 2
   (klasa hero ma wyższą wagę). Warianty (0,2,3) i `!important` zabarwiały hero
   na grafit (0 z 2 białych) — odrzucone. K−: zdjęcie reguły przywraca `#333`
   (9 z 9 nagłówków, na których reguła coś zmieniała). Kontrast `/samorzad/urzad-gminy/`
   11,95 → 16,39 : 1. ── */
h1 { color: var( --grafit-900 ); }

/* ── D-63a (R3 pkt 4, B235) — strony KLASYCZNE (bez `elementor-page-*`: 5 zakładek zbiorczych,
   `/turystyka/ciekawe-miejsca/`, `/tablica-ogloszen/`, 404) dostają oś POZIOMĄ systemu `.b-wrap`:
   `max-width: 1200px` i `padding-inline` 32 / 24 / 16 px. Pionowa połowa tego pudełka — sekcja 21.
   Parametr wyznaczony pomiarem 2026-09-16 (`_build/pomiary/wsad-r2-2026-09-15/r3_d63a_gutter.py`,
   anonimowo, Chromium headed `--force-device-scale-factor=1` — z paskiem przewijania):
   · stan zastany (K+ odtwarza rejestr 4 z 4): `/samorzad/` gutter 10 / 76,5 / 105 / 142,5 px przy
     390 / 768 / 1025 / 1440 wobec 16 / 24 / 24 / 144,5 na stronach Elementora; w paśmie 576–767
     30,5 → 126 px — drabina `max-width` motywu Hello, nie tylko jego `padding-inline: 10px`;
   · 4 adresy klasyczne × 7 szerokości × pismo 100 / 200 % = 56 par, tolerancja 0 px, krawędzie treści i H1:
     W1 `body:has(.b-zb__siatka) .site-main` 132 błędy (nie obejmuje stron klasycznych bez siatki) ·
     W2 j.w. z `main` 132 · W3 `:not([class*=elementor-page-]) main.site-main` 40 (H1 ma własną drabinę
     `max-width` motywu) · **W3 + neutralizacja H1: 0 błędów / 56 par — PRZYJĘTY**;
   · zasięg (`r3_d63a_zasieg.py`): 45 stron `publish` → 7 klasycznych + 404; po regule 44 z 44 par
     = `.b-wrap` co do piksela; wyszukiwanie i archiwa kategorii (dokumenty Elementora) bez zmian.
   Waga (0,2,2) > `theme.css` `body:not([class*=elementor-page-]) .site-main` (0,2,1) — wygrywa WAGĄ. ── */
body:not([class*="elementor-page-"]) main.site-main {
	max-width: 1200px;
	padding-inline: var( --s32 );
}

body:not([class*="elementor-page-"]) .page-header .entry-title {
	max-width: none;
	padding-inline: 0;
}

@media (max-width: 1200px) {

	body:not([class*="elementor-page-"]) main.site-main { padding-inline: var( --s24 ); }
}

@media (max-width: 767px) {

	body:not([class*="elementor-page-"]) main.site-main { padding-inline: var( --s16 ); }
}

/* Listy: `list-style` nie jest propsem. */
.b-spis__lista,
.b-lista-solectw,
.b-lista-zabytkow { list-style: none; }

/* Podkreślenia pozycji: `border-*-width` per bok nie istnieje w schemacie. */
.b-spis__link { border-bottom: 1px solid var( --linia-kontrolki ); }

.b-spis__lista li:last-child .b-spis__link { border-bottom: 0; }

.b-solectwo { border-bottom: 1px solid var( --linia-kontrolki ); }

/* Kwadracik przy pozycji wykazu zabytków — pseudoelement nie jest propsem. */
.b-zabytek::before {
	content: "";
	position: absolute;
	inset-inline-start: 0;
	top: 11px;
	width: 8px;
	height: 8px;
	background: var( --zielen-500 );
	border-radius: 2px;
}

/* Tabele danych — `border-collapse`, `vertical-align` i `white-space` poza schematem.
   ⚠ `display:block; overflow-x:auto` NIE jest tu powtórzone: to propsy i siedzą
   w klasie `b-str__tabela`. Reguła obok byłaby definicją równoległą do klasy
   globalnej, czego ten plik unika (kontrakt z §5f). */
/* --- 13a. Uklad tabeli danych ------------------------------------------------
   🔴 `.elementor .e-div-block-base { display: block }` obowiazuje KAZDY element
   atomic niezaleznie od tagu, wiec `table`, `thead`, `tbody`, `tr`, `th` i `td`
   traca uklad tabelaryczny i skladaja sie w pionowy stos. Sam fakt, ze tag sie
   RENDERUJE (sonda 13 tagow, §5j pkt 1), nie znaczy, ze zachowuje sie jak tabela.
   Zmierzone 2026-09-03: `display` = `block` na wszystkich trzech tabelach strony 44.

   Dlaczego tutaj, a nie w klasie globalnej: `display: table-row` i `table-cell`
   musza trafic w `tr`/`th`/`td`, ktore klas nie niosa (wiersze sa generowane),
   a kwalifikator tagu podnosi specyficznosc (0,2,1) ponad `.e-div-block-base`
   (0,2,0) — klasa globalna o tej samej specyficznosci zalezalaby od kolejnosci
   arkuszy, ktora jest rozna per dokument (§4h). Regula zestawu obsluguje przy
   okazji szablon biblioteki 8277, ktory niesie te same klasy. */
.elementor table.b-str__tabela { display: table; }
.elementor .b-str__tabela > thead { display: table-header-group; }
.elementor .b-str__tabela > tbody { display: table-row-group; }
.elementor .b-str__tabela tr { display: table-row; }
.elementor .b-str__tabela th { display: table-cell; }
.elementor .b-str__tabela td { display: table-cell; }

/* 🔴 Drugie polowa tej samej wady, i grozniejsza, bo nie widac jej po tagach.
   `.e-con { width: var(--width) }` przy `--width: 100%` obowiazuje KAZDY element
   atomic, wiec kazda komorka zada pelnej szerokosci tabeli. Algorytm auto rozdziela
   wtedy szerokosci miedzy rownie zachlanne kolumny i przestaje patrzec na tresc:
   zmierzone 2026-09-03 na kalendarium — kolumna `Rok` (tresc „1329", `nowrap`)
   dostawala 579 px, a kolumna `Wydarzenie` ze zdaniem na 8 wierszy 133 px.
   Po `width:auto` te same kolumny to 160 i 551 px. Liczby nie reagowaly na zadna
   zmiane tresci ani `white-space` — staly sztywno, bo o wszystkim decydowal `--width`. */
.elementor .b-str__tabela > thead,
.elementor .b-str__tabela > tbody,
.elementor .b-str__tabela tr,
.elementor .b-str__tabela th,
.elementor .b-str__tabela td { width: auto; }

.b-str__tabela { border-collapse: collapse; }

.b-str__th,
.b-str__td { vertical-align: top; }

.b-str__rok { white-space: nowrap; }

/* Obraz sekcji: `height: auto` przy `width: 100%` — bez tego proporcja
   pliku 3 : 2 nie przenosi się na wysokość pudełka. */
.b-str__foto { height: auto; }

/* Stany `:last-child` — nie do wyrażenia klasą, a bez nich ostatnia sekcja
   i ostatni akapit dokładają odstęp, którego referencja nie ma. */
.b-str__tresc > section:last-child { margin-block-end: 0; }

.b-str__akapit:last-child { margin-block-end: 0; }

/* --------------------------------------------------------------------------
   14. Kafle S3 — znacznik odnosnika zewnetrznego w narozniku (COS-69, D-23)

   Wojt poprosil o zdjecie napisow „otwiera sie w nowej karcie" i „strona
   serwisu gminy". Referencja v6 zostawia sam znacznik i przenosi go do
   PRAWEGO GORNEGO naroznika kafla. `position` jest propsem atomic i siedzi
   w klasie globalnej `b-kafel__zewn`; `top` i `right` NIE ISTNIEJA w schemacie
   (STAN-STAGING §4e — zmierzone, zapisza sie bez bledu i znikna), wiec same
   przesuniecia musza zyc tutaj. To ta sama przyczyna, co przy przyklejonym
   naglowku w sekcji 1.

   Drugi powod tej sekcji: `:hover` RODZICA zmieniajacy kolor DZIECKA nie jest
   stanem klasy globalnej — klasa wyraza wylacznie stan wlasnego elementu.

   ⚠ Osobna klasa, a nie `b-zewn__ikona`: ta ostatnia jest uzywana w TRZECH
   dokumentach (strona 11, stopka 135, szablon wpisu 137) — zmierzone przed
   zmiana. Przestawienie jej na `absolute` wyjelo by znacznik z ukladu stopki
   i sidebara wpisu.
   -------------------------------------------------------------------------- */
.b-kafel__zewn {
	top: 16px;
	right: 16px;
}

.b-kafel:hover .b-kafel__zewn {
	color: var( --zielen-600 );
}

/* --------------------------------------------------------------------------
   12. Druk — wartosc jest w tym, JAK strona sie drukuje, a nie w tym, ze jest
   przycisk „Drukuj" (D-18c). Chowamy wszystko, co na papierze nie niesie
   informacji: chrome, sidebar, sekcje „Najnowsze aktualnosci", stopke.
   Kontrakt pliku obowiazuje takze tutaj: zero literalow koloru, zero `px`
   w `font-size`.
   -------------------------------------------------------------------------- */
@media print {

	.b-pasek,
	.b-chrome-wrap,
	header.elementor-location-header,
	footer.elementor-location-footer,
	.b-wpis__bok,
	.b-wpis__dalej,
	.b-str__bok,
	.b-dalej,
	.b-skip__link,
	#b-panel,
	#b-overlay,
	.b-burger { display: none !important; }

	/* Siatka wpisu przestaje byc siatka — na papierze nie ma drugiej kolumny. */
	.b-wpis {
		display: block !important;
		max-width: none !important;
	}

	header.elementor-location-header { position: static !important; }

	.b-wrap {
		max-width: none !important;
		padding-left: 0 !important;
		padding-right: 0 !important;
	}

	.b-sekcja { padding-block-start: 0 !important; padding-block-end: 0 !important; }

	/* Adres odnosnika obok jego tresci — na papierze sam odnosnik jest slepy. */
	#b-wpis-tresc a[href^="http"]::after {
		content: " (" attr( href ) ")";
		font-size: 0.75rem;
		word-break: break-all;
	}

	#b-wpis-tresc table { display: table !important; overflow-x: visible !important; }

	#b-wpis-tresc h2,
	#b-wpis-tresc h3 { break-after: avoid; }

	#b-wpis-tresc img { break-inside: avoid; }
}

/* --------------------------------------------------------------------------
   15. Archiwum aktualnosci — JEDEN markup, DWA uklady pod [data-uklad]
       (COS-311, D-25; referencja: _output/…-prototyp-archiwum-2026-09-03-v3.html)

   ── Dlaczego to nie moze byc klasa globalna ─────────────────────────────
   Przelacznik jest selektorem ATRYBUTU na <html>. Klasa globalna nie ma
   zadnego sposobu, zeby powiedziec „ta wartosc obowiazuje, gdy <html> ma
   data-uklad=siatka" — wariant klasy zna wylacznie breakpoint i stan
   interakcji (STAN-STAGING §5, ksztalt `meta`). Do tego `grid-template-areas`,
   `grid-area`, `grid-column`, `line-clamp` i `object-position` nie istnieja
   w schemacie propsow (§4e), a markup ze shortcode'ow wtyczki nie ma zadnej
   drogi do klas globalnych (§4j).

   ⚠ Zmierzone 2026-09-04, KOREKTA wobec zapisu w §5h: `aspect-ratio` DZIALA
   kanalem klasy globalnej — `g-karta-foto` niesie go dzis na instancji
   („3 / 2") i emituje sie poprawnie. Zostaje tu mimo to, bo w ukladzie
   siatki proporcja jest INNA niz domyslna i musi byc przelaczalna atrybutem.

   ── 🔴 PODZIAL, KTORY TRZEBA UTRZYMAC ────────────────────────────────────
   Klasa globalna emituje `.elementor .b-karta` — specyficznosc (0,2,0).
   Regula z tego arkusza pisana na sama klase wazy (0,1,0) i PRZEGRYWA.
   Dlatego kazda wlasciwosc, ktora umie wyrazic props, siedzi w klasie
   globalnej, a tutaj zostaje wylacznie to, czego props nie zna. Reguly
   ukladow archiwum wygrywaja, bo maja (0,3,0) — i to jest jedyny powod,
   dla ktorego dzialaja.

   ── Trzy prezentacje, jeden markup ──────────────────────────────────────
   A. domyslna (strona glowna S4, sidebar wpisu) — poza `.b-archiwum`;
   B. archiwum + [data-uklad="lista"]  — uklad DOMYSLNY archiwum;
   C. archiwum + [data-uklad="siatka"].
   Kolejnosc w DOM jest jedna: media, data, glowna, meta. Roznica miedzy
   prezentacjami to WYLACZNIE mapa obszarow i odstepy — zero elementow
   dokladanych i zero usuwanych (B104).
   -------------------------------------------------------------------------- */

/* --- A. Kafel wpisu — JEDNA prezentacja na calym serwisie -------------- */
/* 🔴 Runda poprawek 2026-09-04 (polecenie Patryka). Wczesniej kafel na stronie
   glownej i w sidebarze wpisu wygladal inaczej niz w archiwum: pigulka
   kategorii stala obok daty, padding byl 32 zamiast 24. Teraz mapa obszarow
   jest JEDNA, a uklad listy (`[data-uklad="lista"]`) zostaje jedynym
   odstepstwem — i wlasnie dlatego jest odstepstwem jawnym, opisanym nizej.

   ⚠ To jest swiadome odejscie od referencji strony glownej v7, ktora stawia
   pigulke obok daty. Polecenie Patryka jest tu nadrzedne wobec kontraktu 5;
   do wpisania jako decyzja w `REJESTR-USTALEN.md`.

   Rzedy: `auto auto 1fr auto`. Rzad tresci pochlania nadmiar wysokosci, wiec
   pigulki wyrownuja sie do DOLU kafla — to jest cala mechanika rownej
   wysokosci, bez jednej linii skryptu. Reszta (siatka, `height: 100%`,
   `position: relative`) siedzi w klasie globalnej `b-karta`. */
.b-karta {
	grid-template-areas:
		"media"
		"data"
		"glowna"
		"meta";
}

.b-karta__media  { grid-area: media; }
.b-data          { grid-area: data; }
.b-karta__tresc  { grid-area: glowna; }
.b-karta__meta   { grid-area: meta; }

/* Rowna wysokosc w rzedzie: pozycja petli musi ROZCIAGNAC sie na wysokosc
   rzedu, zeby `height: 100%` na kaflu mialo do czego sie odniesc. Elementor
   nie robi tego sam — pozycje maja wysokosc wlasnej tresci. */
.elementor-loop-container > .e-loop-item { display: flex; }
.elementor-loop-container > .e-loop-item > .b-karta { width: 100%; }

/* 🔴 CALY KAFEL KLIKALNY — rozciagniety odnosnik zamiast drugiego znacznika.
   Pseudoelement odnosnika tytulu przykrywa kafel, wiec klikniecie w dowolne
   miejsce prowadzi do wpisu, a w drzewie dostepnosci nadal jest DOKLADNIE
   JEDEN odnosnik z tytulem jako nazwa. Opakowanie calego kafla w `<a>` daloby
   ten sam efekt wizualny i gorszy dla czytnika: nazwa odnosnika obejmowalaby
   date, zajawke i pigulki.

   ⚠ `inset` nie istnieje w schemacie propsow (§4e), wiec pseudoelement musi
   zyc tutaj. Kotwica (`position: relative`) idzie klasa globalna. */
.b-karta__tresc > a::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
}

/* ⚠ Kontenery atomic potrafia niesc wlasne pozycjonowanie — pseudoelement
   zaczepilby sie wtedy o nie, a nie o kafel, i przykryl tylko blok tresci.
   Zerujemy je jawnie (znana pulapka rozciagnietego odnosnika). */
.b-karta > .b-karta__media,
.b-karta > .b-data,
.b-karta > .b-karta__tresc,
.b-karta > .b-karta__meta { position: static; }

/* 🔴 I sam odnosnik tytulu takze — to on byl przyczyna. Zmierzone 2026-09-04:
   `<a>` jest kontenerem atomic, wiec dziedziczy `position: relative` z bazy
   `.e-con`, przez co pseudoelement kotwiczyl sie o NIEGO, nie o kafel, i mial
   39,3 px wysokosci zamiast pelnej karty. Hit-test w pieciu punktach kafla
   zwracal wtedy "BRAK" — regula wygladala na wdrozona i nie dzialala. */
.b-karta__tresc > a { position: static; }

/* Pigulka kategorii jest osobnym celem i musi zostac klikalna PONAD warstwa
   rozciagnietego odnosnika.
   ⚠ Podnosimy SAM ODNOSNIK, nie caly pasek znacznikow. Przy podniesieniu
   paska caly jego prostokat — takze puste miejsce obok pigulki — przestawal
   prowadzic do wpisu; zmierzone hit-testem: 4/5 punktow kafla zamiast 5/5. */
.b-karta__meta > a,
.b-karta__meta .b-znacznik a { position: relative; z-index: 2; }

/* Data czyta sie jednym ciagiem („30 lipca 2026"), stopniem `b-meta`. */
.b-data__czas--czesci {
	display: flex;
	flex-direction: row;
	align-items: baseline;
	flex-wrap: wrap;
	gap: 8px;
}

.b-data__dzien,
.b-data__mies,
.b-data__rok {
	font-family: var( --font-tresc );
	font-size: 0.875rem;
	font-weight: 400;
	color: var( --grafit-500 );
}

.b-karta__opis {
	margin: 0;
	color: var( --grafit-700 );
	font-family: var( --font-tresc );
	font-size: 0.9375rem;
	line-height: 1.6;
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 3;
	line-clamp: 3;
	overflow: hidden;
}

.b-karta__tytul { font-size: 1.1875rem; }

/* ⚠ Kadr kafla zostaje 3 : 2 — czyli DOKLADNIE proporcja pliku
   `bobrowice-karta`, wiec przy `object-fit: cover` nie ma zadnego
   przyciecia. Referencja archiwum v3 ma tu 1 : 1, ale ona powstala przy
   zalozeniu, ze miniatury sa pionami; realne zrodlo jest twardo 3 : 2, wiec
   1 : 1 obcinalo plakaty PO BOKACH i ucinalo im tytuly (zgloszone w raporcie
   QA 2026-09-04 jako pozycja do rozstrzygniecia). Ujednolicenie kafla zamyka
   ja przy okazji: jeden kadr, zero przyciecia, wszedzie tak samo. */

/* Znacznik formy odroznia sie od pigulki kategorii ODWROTNA relacja tla
   i obrysu, nie samym kolorem — referencja v3, `.znacznik--dok`.
   Baze (`.b-znacznik`) niesie klasa globalna, tu stoi sam modyfikator. */
.b-znacznik--forma {
	background: var( --biel );
	border: 1px solid var( --linia-kontrolki );
	color: var( --grafit-700 );
	text-transform: none;
	letter-spacing: normal;
	font-weight: 600;
}

/* Okladka z data — wpis BEZ obrazu wyrozniajacego. Nie jest zdjeciem ani
   ilustracja, wiec niczego nie udaje (SPEC §2 poz. 6). W ukladzie listy
   znika, w siatce wchodzi na miejsce obrazu. */
.b-karta__okladka {
	display: flex;
	flex-direction: column;
	justify-content: flex-end;
	background: var( --zielen-800 );
	color: var( --biel );
	padding: 32px;
	border-bottom: 1px solid var( --linia-dekor );
}

.b-karta__kreska {
	display: block;
	width: 64px;
	height: 4px;
	background: var( --zielen-500 );
	margin-bottom: 24px;
}

.b-karta__ok-mies {
	font-family: var( --font-naglowki );
	font-weight: 700;
	font-size: 2.125rem;
	line-height: 1.1;
}

.b-karta__ok-rok {
	color: var( --zielen-100 );
	font-size: 1rem;
	margin-top: 4px;
	font-variant-numeric: tabular-nums;
}

/* Pasek wyniku — reszta pudelka idzie klasa globalna `b-wynik`; tutaj sam
   obrys od dolu, bo `border-*-width` per bok nie istnieje w schemacie (§4e). */
.b-wynik { border-bottom: 2px solid var( --zielen-200 ); }

/* --- Przelacznik widoku ------------------------------------------------- */
/* 🔴 Bez JS przelacznika NIE MA: ani widocznego, ani ogniskowalnego (B109).
   Kontrolka, ktora nie dziala, jest gorsza niz jej brak. `data-js` ustawia
   skrypt blokujacy z <head> — ten sam, ktory odtwarza zapamietany uklad. */
.b-widok { display: none; align-items: center; gap: 8px; }
[data-js="1"] .b-widok { display: flex; }

.b-widok__etykieta {
	font-family: var( --font-tresc );
	font-size: 0.9375rem;
	color: var( --grafit-700 );
	margin-right: 4px;
}

/* 🔴 Odstep 8 px, nie 4. Pierscien fokusu ma `outline-offset: 3px` i grubosc
   3 px, wiec siega 6 px poza przycisk. Przy 4 px pierscien przycisku
   NIEWCISNIETEGO ladowalby czesciowo na sasiednim przycisku WCISNIETYM
   (`--zielen-700`), gdzie `--focus` daje 2,74:1 — ponizej progu 3:1 z
   SC 1.4.11. Przy 8 px pierscien laduje w calosci na tle sekcji (3,78:1).
   Zmierzone 2026-09-03; D-25, warunek wykonawczy 2. To jest zaleznosc
   miedzy dwiema wartosciami, wiec zmieniajac jedna, przelicz druga. */
.b-widok__grupa { display: flex; gap: 8px; }

/* ⚠ `reset.css` Elementora maluje `button:hover` i `button:focus` regula
   o wyzszej specyficznosci niz klasa — kazda wlasna kontrolka musi wypisac
   WSZYSTKIE stany, nie tylko spoczynkowy (§5f). */
.b-widok__btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	min-height: 44px;
	padding: 8px 16px;
	border: 2px solid var( --linia-kontrolki );
	border-radius: 4px;
	background: var( --biel );
	color: var( --zielen-800 );
	font-family: var( --font-tresc );
	font-size: 0.9375rem;
	font-weight: 600;
	line-height: 1.3;
	cursor: pointer;
}

.b-widok__btn:hover,
.b-widok__btn:focus {
	background: var( --zielen-100 );
	border-color: var( --zielen-600 );
	color: var( --zielen-800 );
}

.b-widok__btn svg { flex: none; }

/* Stan wcisniety idzie za ATRYBUTEM NA <html>, nie za `aria-pressed`.
   Powod jest pomiarowy: `aria-pressed` domyka JavaScript po zbudowaniu DOM,
   a `data-uklad` stoi na <html> juz przed pierwszym malowaniem — dzieki temu
   uzytkownik, ktory wybral siatke, nie oglada mignienia wcisnietej „Listy".
   `aria-pressed` i tak jest poprawiany, bo to on niesie stan dla czytnika. */
[data-uklad="lista"]  .b-widok__btn[data-b-uklad="lista"],
[data-uklad="siatka"] .b-widok__btn[data-b-uklad="siatka"] {
	background: var( --zielen-700 );
	border-color: var( --zielen-700 );
	color: var( --biel );
}

[data-uklad="lista"]  .b-widok__btn[data-b-uklad="lista"]:hover,
[data-uklad="siatka"] .b-widok__btn[data-b-uklad="siatka"]:hover {
	background: var( --zielen-800 );
	border-color: var( --zielen-800 );
	color: var( --biel );
}

/* --- Naglowek miesiaca -------------------------------------------------- */
/* Wstrzykiwany filtrem MIEDZY pozycje petli, wiec jest dzieckiem kontenera
   siatki — stad `grid-column: 1 / -1` (B111). W ukladzie listy kontener ma
   jedna kolumne i regula nie robi nic. Markup nie pochodzi z Elementora,
   wiec klasa globalna go nie obsluzy. */
.b-miesiac {
	grid-column: 1 / -1;
	font-family: var( --font-naglowki );
	font-size: 1.3125rem;
	font-weight: 700;
	color: var( --zielen-800 );
	padding-bottom: 12px;
	border-bottom: 1px solid var( --linia-dekor );
	margin: 48px 0 0;
}

.b-miesiac:first-child { margin-top: 0; }

/* --- B. Archiwum, uklad LISTY (domyslny — D-25) ------------------------- */
/* Kontener petli przestaje byc siatka: jedna kolumna, zero odstepu miedzy
   wierszami — rozdziela je kreska pod kazda pozycja, jak w referencji. */
[data-uklad="lista"] .b-archiwum .elementor-loop-container {
	display: block;
}

[data-uklad="lista"] .b-archiwum .b-karta {
	grid-template-columns: 96px minmax( 0, 1fr ) 160px;
	grid-template-areas:
		"data glowna media"
		"data meta   media";
	column-gap: 32px;
	row-gap: 0;
	background: none;
	border: 0;
	border-bottom: 1px solid var( --linia-dekor );
	border-radius: 0;
	overflow: visible;
	padding: 32px 0;
}

[data-uklad="lista"] .b-archiwum .b-karta:hover { background: var( --zielen-050 ); }

[data-uklad="lista"] .b-archiwum .b-data {
	padding: 4px 0 0;
	align-self: start;
}

/* Dzien duzy, pod nim miesiac i rok — kolumna, nie wiersz. */
[data-uklad="lista"] .b-archiwum .b-data__czas--czesci {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	line-height: 1.1;
}

[data-uklad="lista"] .b-archiwum .b-data__dzien {
	font-family: var( --font-naglowki );
	font-weight: 700;
	font-size: 2.125rem;
	color: var( --zielen-700 );
}

[data-uklad="lista"] .b-archiwum .b-data__mies {
	font-size: 0.9375rem;
	color: var( --grafit-700 );
	margin-top: 4px;
}

[data-uklad="lista"] .b-archiwum .b-data__rok {
	font-size: 0.875rem;
	color: var( --grafit-500 );
}

[data-uklad="lista"] .b-archiwum .b-karta__tresc { padding: 0; gap: 4px; }

/* 🔴 Uklad listy cofa TRZY rzeczy, ktore od 2026-09-04 sa domyslne dla kafla.
   Wypisuje je jawnie, bo kazda z nich milczy, gdy jej zabraknie: zajawka
   zostalaby przycieta do trzech wierszy takze w liscie, data staleby w wiersz
   zamiast kolumny, a rzedy siatki kafla trzymalyby uklad czterowierszowy. */
[data-uklad="lista"] .b-archiwum .b-karta {
	grid-template-rows: auto auto;
	height: auto;
}

[data-uklad="lista"] .b-archiwum .b-karta__opis {
	display: block;
	-webkit-line-clamp: none;
	line-clamp: none;
	overflow: visible;
	font-size: 1rem;
	max-width: 68ch;
}

[data-uklad="lista"] .b-archiwum .elementor-loop-container > .e-loop-item { display: block; }
[data-uklad="lista"] .b-archiwum .b-karta__meta   { padding: 12px 0 0; align-self: start; }
[data-uklad="lista"] .b-archiwum .b-karta__tytul  { font-size: 1.3125rem; }
[data-uklad="lista"] .b-archiwum .b-karta__opis   { max-width: 68ch; }

[data-uklad="lista"] .b-archiwum .b-karta__media {
	display: flex;
	justify-content: flex-end;
	align-items: flex-start;
}

/* 🔴 Miniatura w liscie NIE JEST przycinana: ograniczony jest dluzszy bok,
   nie proporcja — kryterium B70 mierzy odchylenie proporcji od pliku. */
[data-uklad="lista"] .b-archiwum img.b-karta__foto {
	width: auto;
	height: auto;
	max-width: 160px;
	max-height: 160px;
	aspect-ratio: auto;
	object-fit: contain;
	border: 1px solid var( --linia-dekor );
	border-radius: 4px;
}

[data-uklad="lista"] .b-archiwum .b-karta__okladka { display: none; }

/* Wiersz bez obrazu ma DWIE kolumny, nie trzy z pusta — realizacja B69
   konstrukcja, a nie zerowaniem szerokosci. `:has()` zastepuje modyfikator
   klasy, ktorego atomic nie potrafi nadac warunkowo. */
[data-uklad="lista"] .b-archiwum .b-karta:not( :has( img.b-karta__foto[src] ) ) {
	grid-template-columns: 96px minmax( 0, 1fr );
	grid-template-areas:
		"data glowna"
		"data meta";
}

[data-uklad="lista"] .b-archiwum .b-karta:not( :has( img.b-karta__foto[src] ) ) .b-karta__media {
	display: none;
}

/* --- Tablet i telefon --------------------------------------------------- */
@media ( max-width: 1200px ) {
	[data-uklad="lista"] .b-archiwum .b-karta {
		grid-template-columns: 96px minmax( 0, 1fr ) 120px;
		column-gap: 24px;
	}

	[data-uklad="lista"] .b-archiwum img.b-karta__foto { max-width: 120px; max-height: 120px; }
}

@media ( max-width: 767px ) {
	/* ⚠  na samym przelaczniku NIE wystarcza: shortcode renderuje
	   sie w kontenerze widgetu v3, wiec procent mierzy sie wzgledem TEGO
	   wrappera, a nie paska wyniku. Zmierzone na 390 px: 271 px zamiast 343. */
	.b-wynik > .elementor-widget-shortcode { width: 100%; }
	.b-widok { width: 100%; }
	.b-widok__grupa { flex: 1; }
	.b-widok__btn { flex: 1 1 0; }

	.b-miesiac { margin-top: 32px; }

	/* Kolumna daty na telefonie schodzi do wiersza nad tytulem — 96 px obok
	   tresci zostawialoby jej ponizej 200 px, czyli wiersz krotszy niz
	   45 znakow. Referencja v3 robi dokladnie to samo. */
	[data-uklad="lista"] .b-archiwum .b-karta {
		grid-template-columns: minmax( 0, 1fr ) 96px;
		grid-template-areas:
			"data   media"
			"glowna media"
			"meta   media";
		column-gap: 16px;
		padding: 24px 0;
	}

	[data-uklad="lista"] .b-archiwum .b-karta:not( :has( img.b-karta__foto[src] ) ) {
		grid-template-columns: minmax( 0, 1fr );
		grid-template-areas: "data" "glowna" "meta";
	}

	[data-uklad="lista"] .b-archiwum .b-data__czas--czesci {
		flex-direction: row;
		align-items: baseline;
		gap: 8px;
		flex-wrap: wrap;
	}

	[data-uklad="lista"] .b-archiwum .b-data__dzien { font-size: 1.1875rem; }

	[data-uklad="lista"] .b-archiwum .b-data__mies,
	[data-uklad="lista"] .b-archiwum .b-data__rok { font-size: 0.9375rem; margin-top: 0; }

	[data-uklad="lista"] .b-archiwum .b-karta__tytul { font-size: 1.1875rem; }
	[data-uklad="lista"] .b-archiwum img.b-karta__foto { max-width: 96px; max-height: 120px; }

	.b-karta__okladka { padding: 24px; }

	/* D-65 / 65d (COS-327, 2026-09-10) — na telefonie kafel listy jest jednokolumnowy
	   także przy wpisie ze zdjęciem: nośnik obrazu nie zajmuje toru. Odejście od
	   referencji v3 (L365–372) z decyzją. MUSI stać za regułami tego bloku. */
	[data-uklad="lista"] .b-archiwum .b-karta {
		grid-template-columns: minmax( 0, 1fr );
		grid-template-areas: "data" "glowna" "meta";
	}

	[data-uklad="lista"] .b-archiwum .b-karta__media { display: none; }
}

/* --------------------------------------------------------------------------
   16. Hero strony glownej — wariant C (COS-311, D-24)
       Referencja: _output/…-prototyp-strona-glowna-2026-09-04-v7.html

   Zdjecie na pelnej szerokosci, tresc w zielonym pasie POD nim. Na zdjeciu
   nie lezy nic poza podpisem miejsca w prawym dolnym rogu (B113) — to jest
   bezposrednia odpowiedz na uwage Wojta ze spotkania 2026-09-03, ze plyta
   zaslaniala elektrownie (budynek lezy na 0,42–0,58 szerokosci kadru).

   ── Co tu jest i dlaczego akurat tu ─────────────────────────────────────
   `object-position`  — kanal klasy globalnej odrzuca go bledem HTTP 400
                        (§4e, zmierzone na dwoch przypadkach);
   `right` / `bottom` — nie istnieja w schemacie propsow w zadnym ksztalcie,
                        wiec podpis moze byc `position:absolute` klasa
                        globalna, ale przesuniecie musi byc tutaj (ta sama
                        przyczyna, co przy znaczniku w narozniku kafla, §14);
   wysokosc kadru     — trzyma ja JEDNA zmienna, bo to nie jest wartosc
                        estetyczna, tylko PARAMETR STEROWANIA LINIA ZGIECIA.

   🔴 Zaleznosc jest liniowa i wypisuje ja tutaj, zeby nastepna sesja nie
   musiala jej odkrywac: gorna krawedz kafli = chrome + wysokosc kadru +
   wysokosc pasa. Chrome zmierzony na tej instancji to 144 px na desktopie
   i 121 px na telefonie (§5f). Podnoszac kadr, sprawdz B114 i B115 na
   wszystkich pieciu szerokosciach — nie na jednej.
   -------------------------------------------------------------------------- */

/* 🔴 Pakiet B (COS-326, D-29b): kadr oplaca chrome trzeciego pasa.
   Wartosci dobrane POMIAREM na renderze publicznym, nie oszacowaniem.
   Zaleznosc jest liniowa: gora kafli = stala + kadr, wiec kazdy piksel
   pasa 3 trzeba oddac pikselem kadru.

   Pas 3 chowa sie dopiero ponizej 1025 px, a kadr przelaczal sie juz przy
   1200 px — wiec przedzial 1025–1200 tez placi za pas 3, mimo ze ma juz
   kadr „tabletowy". Stad CZTERY progi zamiast trzech.

   zmierzone 2026-09-04, odniesienie = build sprzed Pakietu A:
     >=1201 : pas 3 = 59,3 px · gora kafli 1118,0 -> kadr 380 daje 1117,3
     1025-1200: pas 3 = 57,8 px · gora kafli  943,8 -> kadr 222 daje  943,6
     <=1024 : pas 3 ukryty, chrome bez zmian  -> kadr zostaje 280
     <=767  : jw.                             -> kadr zostaje 240 */
:root { --b-hero-kadr: 600px; }

@media ( max-width: 1200px ) { :root { --b-hero-kadr: 222px; } }
@media ( max-width: 1024px ) { :root { --b-hero-kadr: 280px; } }
@media ( max-width: 767px )  { :root { --b-hero-kadr: 240px; } }

/* `line-height: 0` zdejmuje pasek pod obrazem, ktory bierze sie z tego, ze
   <img> jest elementem inline-block i siada na linii bazowej. */
.b-hero__obraz { line-height: 0; }

/* 🔴 Zakotwiczenie pionowe 70 %. Dobrane pomiarem na pliku, nie na oko
   (polecenie Patryka 2026-09-04: elektrownia w scislym centrum, zbiornik
   ponizej bardziej widoczny).

   Zmierzone: budynek elektrowni lezy na 500–560 px pliku 1600 x 900, czyli
   srodkiem na 0,589 jego wysokosci. Na 1440 px widoczny wycinek ma 494 px,
   wiec zakres przesuniecia to 406 px. Zeby srodek budynku wypadl w polowie
   kadru, gora wycinka musi stanac na 283 px — to jest 70 % zakresu.

   Skutek na 1440: widoczne 284–778 px pliku, elektrownia na 0,498 wysokosci
   kadru (bylo 0,695), a wody ponizej zapory 128 px zamiast 31. Cena: znika
   niebo i linia horyzontu — kadr zaczyna sie polami. Swiadoma, bo pas ma
   440 px i puste niebo bylo w nim najmniej wartosciowa czescia.

   Kryterium B117 mierzy SKUTEK (czy budynek zostal w widocznym wycinku),
   nie ten zapis. */
img.b-hero__img {
	height: var( --b-hero-kadr );
	object-position: center 70%;
}

/* Podpis miejsca — JEDYNY element, ktoremu wolno lezec na zdjeciu (B113). */
.b-hero__podpis {
	right: 24px;
	bottom: 16px;
	margin: 0;
	padding: 8px 12px;
	border-radius: 3px;
	background: color-mix( in srgb, var( --zielen-900 ) 82%, transparent );
	color: var( --biel );
	font-family: var( --font-tresc );
	font-size: 0.8125rem;
	line-height: 1.4;
}

@media ( max-width: 767px ) {
	.b-hero__podpis {
		right: 16px;
		bottom: 12px;
		font-size: 0.75rem;
	}
}

/* ==========================================================================
   17. Naglowek trzyrzedowy — PRZENIESIENIE prototypu D-29c (Pakiet A, COS-326)
   Zrodlo: _output/gmina-bobrowice-prototyp-menu-3-pasy-2026-09-04.html
   Wyciete programowo przez _build/elementor/gen_naglowek.py — nie recznie,
   bo reczny wybor gubi dokladnie te regule, o ktorej sie nie pamieta
   (antywzorzec 22). Generator raportuje, co pominal i co przeliczyl.
   ========================================================================== */

/* Mostek Elementora: `<nav>` pasa 3 siedzi w widgecie shortcode wewnatrz
   kontenera atomic, wiec opakowanie musi oddac mu cala szerokosc — inaczej
   `flex: 1 1 0` na pozycjach menu liczy sie wzgledem opakowania, nie pasa.
   Ten sam wzorzec co `.b-pasek__wrap > .elementor-widget-shortcode`. */
.b-pas-menu .elementor-widget-shortcode,
.b-pas-menu .b-nav-glowna {
	flex: 1 1 auto;
	min-width: 0;
	width: 100%;
}

/* --------------------------------------------------------------------------
   1–6. NAGLOWEK TRZYRZEDOWY (COS-326, Pakiet A, D-29c)
   Zrodlo: _output/gmina-bobrowice-prototyp-menu-3-pasy-2026-09-04.html

   🔴 Te sekcje sa WYCIETE Z PLIKU REFERENCJI programowo, przez
   `_build/elementor/gen_naglowek.py` — nie przepisane recznie. Powod:
   antywzorzec 22 (CLAUDE.md v2.7 §9). Generator przerywa, gdy w prototypie
   pojawi sie selektor, ktorego nikt jawnie nie zakwalifikowal, i zdejmuje
   deklaracje zakazane przez rejestr (`transform`, `transition` — D-15c).

   ⚠ Nie edytuj tych regul recznie. Zmiana idzie w prototypie albo w mapie
   nazw generatora, potem `python gen_naglowek.py` i ponowny zapis arkusza.
   -------------------------------------------------------------------------- */

.b-skip {
	position:absolute;left:var(--s16);top:var(--s8);z-index:140;display:flex;gap:var(--s8)
}

.b-skip__link {
	position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;
	  background:var(--biel);color:var(--zielen-800);padding:var(--s12) var(--s20);
	  border:2px solid var(--zielen-700);border-radius:4px;font-weight:600;text-decoration:none
}

.b-skip__link:focus {
	position:static;width:auto;height:auto;overflow:visible;clip-path:none
}

.b-pasek .b-chrome-wrap {
	max-width:1440px;display:flex;align-items:center;justify-content:space-between;
	  gap:var(--s24);min-height:48px;flex-wrap:wrap
}

.b-godziny {
	display:flex;align-items:center;gap:var(--s12);flex:none;color:var(--grafit-700);
	  font-size: 0.875rem;line-height:1.35
}

.b-godziny__ikona {
	width:24px;height:24px;flex:none;border:2px solid var(--zielen-700);border-radius:50%
}

.b-godziny__nag {
	display:block;color:var(--zielen-800);font-size: 0.8125rem;
	  font-weight:700;letter-spacing:.04em;text-transform:uppercase
}

.b-bip {
	background:var(--bip-700);color:var(--biel);border-radius:4px;
	  padding:var(--s12) var(--s20);font-weight:700;text-decoration:none;flex:none;
	  display:inline-flex;align-items:center;min-height:44px
}

.b-bip:hover {
	background:var(--bip-800)
}

.b-szukaj {
	display:flex;align-items:center;border:2px solid var(--linia-kontrolki);border-radius:4px;
	  background:var(--biel);flex:none
}

.b-szukaj__pole {
	font:inherit;font-size: 0.9375rem;
	  min-height:44px;background:transparent;color:var(--grafit-900)
}

.b-szukaj__pole::placeholder {
	color:var(--grafit-500)
}

.b-szukaj__btn {
	border:0;padding:0;background:var(--zielen-700);color:var(--biel);
	  min-width:48px;min-height:44px;cursor:pointer;display:flex;align-items:center;justify-content:center
}

.b-pas-menu {
	background:var(--zielen-800);border-bottom:1px solid var(--zielen-900)
}

.b-pas-menu .b-chrome-wrap {
	max-width:1440px
}

.b-menu {
	display:flex;align-items:stretch;list-style:none;margin:0;padding:0;
	  gap:0;flex-wrap:nowrap;min-height:56px
}

.b-menu > li {
	position:relative;display:flex;flex:1 1 0;min-width:0
}

html[data-menu="pomiar"] .b-menu > li {
	flex:0 0 auto
}

.b-menu > li + li {
	box-shadow:inset 1px 0 0 var(--zielen-700)
}

.b-menu > li > a,.b-menu > li > button {
	flex:1;justify-content:center;
	  background:transparent;border:0;border-bottom:3px solid transparent;color:var(--biel);
	  font:inherit;font-size: 1rem;font-weight:600;cursor:pointer;
	  padding:var(--s16) var(--s12);display:inline-flex;align-items:center;gap:var(--s8);
	  min-height:56px;white-space:nowrap;text-decoration:none
}

.b-menu > li > a:hover,.b-menu > li > button:hover {
	background:var(--zielen-700);border-bottom-color:var(--zielen-200)
}

.b-menu > li > button[aria-expanded="true"] {
	background:var(--zielen-700);border-bottom-color:var(--zielen-200)
}

.b-menu > li > a[aria-current="page"] {
	border-bottom-color:var(--zielen-200)
}

.b-strzalka {
	width:10px;height:10px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;
	  transform:rotate(45deg) translate(-2px,-2px);flex:none;transition:transform .15s
}

[aria-expanded="true"] > .b-strzalka {
	transform:rotate(-135deg) translate(-2px,-2px)
}

.b-podmenu {
	position:absolute;top:100%;left:0;min-width:280px;background:var(--biel);
	  border:1px solid var(--linia-dekor);border-top:3px solid var(--zielen-600);
	  box-shadow:0 8px 24px color-mix( in srgb, var( --zielen-900 ) 18%, transparent );list-style:none;margin:0;padding:var(--s8) 0;z-index:120
}

.b-podmenu[hidden] {
	display:none
}

.b-podmenu li {
	position:relative
}

.b-podmenu a,.b-podmenu button {
	display:flex;align-items:center;justify-content:space-between;gap:var(--s16);
	  width:100%;background:transparent;border:0;color:var(--grafit-900);font:inherit;
	  font-size: 0.9375rem;text-align:left;cursor:pointer;
	  padding:var(--s12) var(--s20);min-height:44px;text-decoration:none
}

.b-podmenu a:hover,.b-podmenu button:hover {
	background:var(--zielen-050);color:var(--zielen-700)
}

.b-podmenu .b-podmenu__dzial {
	font-weight:700;color:var(--zielen-700);border-bottom:1px solid var(--linia-dekor);
	  margin-bottom:var(--s8);padding-bottom:var(--s12)
}

.b-podmenu .b-strzalka {
	transform:rotate(-45deg) translate(-2px,2px)
}

.b-podmenu [aria-expanded="true"] .b-strzalka {
	transform:rotate(-45deg) translate(-2px,2px)
}

.b-podmenu--prawo {
	left:auto;right:0
}

.b-podmenu .b-podmenu.b-podmenu--prawo {
	left:auto;right:100%;border-left:1px solid var(--linia-dekor);
	  border-right:3px solid var(--zielen-600)
}

.b-podmenu .b-podmenu {
	top:-9px;left:100%;min-width:250px;border-top:1px solid var(--linia-dekor);
	  border-left:3px solid var(--zielen-600)
}

.b-zewn::after {
	content:"";width:12px;height:12px;flex:none;margin-left:var(--s8);
	  border:2px solid currentColor;border-left:0;border-bottom:0;
	  background:linear-gradient(to bottom left,transparent 45%,currentColor 45%,currentColor 55%,transparent 55%)
}

html[data-menu="zwiniete"] .b-pas-menu {
	display:none
}

html[data-menu="zwiniete"] .b-szukaj {
	display:none
}

html[data-menu="zwiniete"] .b-burger {
	display:inline-flex
}

.b-burger {
	display:none;width:48px;height:48px;border:2px solid var(--linia-kontrolki);border-radius:4px;
	  background:var(--biel);cursor:pointer;align-items:center;justify-content:center;flex:none
}

.b-oc__overlay {
	position:fixed;inset:0;background:color-mix( in srgb, var( --zielen-900 ) 55%, transparent );z-index:150
}

.b-oc__overlay[hidden] {
	display:none
}

.b-oc {
	position:fixed;top:0;right:0;height:100dvh;width:min(86vw,340px);background:var(--biel);
	  z-index:160;display:flex;flex-direction:column;overflow-y:auto
}

.b-oc[hidden] {
	display:none
}

.b-oc__gora {
	display:flex;align-items:center;justify-content:space-between;gap:var(--s16);
	  padding:var(--s16);border-bottom:1px solid var(--linia-dekor)
}

.b-oc__szukaj {
	padding:var(--s16);border-bottom:1px solid var(--linia-dekor)
}

.b-oc__szukaj label {
	display:block;font-size: 0.8125rem;font-weight:700;
	  color:var(--zielen-800);text-transform:uppercase;letter-spacing:.04em;margin-bottom:var(--s8)
}

.b-oc__szukaj > div {
	display:flex;border:2px solid var(--linia-kontrolki);border-radius:4px;background:var(--biel)
}

.b-oc__szukaj input {
	flex:1;min-width:0;border:0;background:transparent;font:inherit;
	  font-size: 0.9375rem;padding:var(--s12);min-height:44px;color:var(--grafit-900)
}

.b-oc__szukaj button {
	border:0;background:var(--zielen-700);color:var(--biel);
	  min-width:48px;min-height:44px;cursor:pointer;font-size: 1.125rem
}

.b-oc__godziny {
	padding:var(--s16);background:var(--zielen-050);border-bottom:1px solid var(--linia-dekor);
	  font-size: 0.875rem;color:var(--grafit-700)
}

.b-oc__godziny b {
	display:block;color:var(--zielen-800);font-size: 0.8125rem;
	  text-transform:uppercase;letter-spacing:.04em
}

.b-oc button.b-oc__zamknij {
	width:44px;height:44px;border:2px solid var(--linia-kontrolki);border-radius:4px;
	  background:var(--biel);cursor:pointer;font-size: 1.25rem;line-height:1;color:var(--grafit-900)
}

.b-oc ul {
	list-style:none;margin:0;padding:0
}

.b-oc li > a,.b-oc li > button {
	display:flex;align-items:center;justify-content:space-between;gap:var(--s16);
	  width:100%;background:transparent;border:0;border-bottom:1px solid var(--linia-dekor);
	  color:var(--grafit-900);font:inherit;font-weight:600;text-align:left;cursor:pointer;
	  padding:var(--s12) var(--s16);min-height:48px;text-decoration:none
}

.b-oc .b-oc__p2 > li > a,.b-oc .b-oc__p2 > li > button {
	padding-left:var(--s32);font-weight:500;background:var(--zielen-050)
}

.b-oc .b-oc__p3 > li > a {
	padding-left:var(--s48);font-weight:400;background:var(--zielen-100)
}


@media (max-width:1200px) {

	.b-godziny {
		display:none
	}

	.b-menu > li > a,.b-menu > li > button {
		padding-left:var(--s8);padding-right:var(--s8);
		    font-size: 0.9375rem
	}

}


@media (max-width:1024px) {

	.b-pasek .b-chrome-wrap {
		gap:var(--s8);min-height:56px;flex-wrap:nowrap;justify-content:space-between
	}

	.b-pas-menu {
		display:none
	}

	.b-burger {
		display:inline-flex
	}

	.b-szukaj {
		display:none
	}

}


@media (max-width:480px) {

	.b-bip {
		padding:var(--s12) var(--s16)
	}

}


/* --- Pakiet A: skala odstepow.
       W Variables Elementora sa tylko kolory, wiec te tokeny musialy trafic
       do arkusza — bez nich 39 deklaracji odstepow rozwiazuje sie do zera. --- */
:root {
	--s4: 4px;
	--s8: 8px;
	--s12: 12px;
	--s16: 16px;
	--s20: 20px;
	--s24: 24px;
	--s32: 32px;
	--s40: 40px;
	--s48: 48px;
	--s56: 56px;
	--s64: 64px;
	--s80: 80px;
	--s96: 96px;
}


/* --- Pakiet A · DO WKLEJENIA W REGULE GRUPOWEJ D-15a (sekcja 10/11) -------
   🔴 To jest NOTATKA, nie zywy CSS. Emitowana jako wiszaca lista selektorow
   bez klamry POLKNELA nastepna regule w arkuszu (zmierzone 2026-09-04:
   `.b-bip:focus-visible .b-head__prawa`), przez co `.b-head__prawa`
   nie dostala zadnych deklaracji. Dlatego caly blok jest w komentarzu,
   a selektory do reguly D-15a dokłada skrypt scalajacy.

   .b-menu > li > a:focus-visible,
   .b-menu > li > button:focus-visible,
   .b-podmenu a:focus-visible,
   .b-podmenu button:focus-visible,
   .b-oc li > a:focus-visible,
   .b-oc li > button:focus-visible,
   .b-oc__szukaj input:focus-visible,
   .b-oc__szukaj button:focus-visible,
   .b-bip:focus-visible
   ------------------------------------------------------------------------ */


/* --- Pakiet A: grupa prawej strony pasa 2. NIE pochodzi z prototypu —
       zastepuje jego rozpychacz `.dopelniacz`, bo build uklada pas 2
       siatka z panelu, a nie flexem. Rendering ten sam, DOM inny. --- */
.b-head__prawa {
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: var( --s32 );
	min-width: 0;
}

@media (max-width: 1200px) {
	.b-head__prawa { gap: var( --s16 ); }
}

/* Godzin NIE chowamy tutaj — referencja robi to sama, regula
   `.b-godziny { display:none }` w bloku (max-width:1200px). Moja
   wersja siedziala na progu 1024 i byla drugim, sprzecznym zrodlem
   tej samej decyzji. Jedno zrodlo: przeniesiony prototyp. */

/* ==========================================================================
   18. Zakladka zbiorcza galezi — PRZENIESIENIE prototypu D-30 (Pakiet E)
   Zrodlo: _output/gmina-bobrowice-prototyp-zakladka-zbiorcza-2026-09-04.html
   Wyciete programowo przez _build/elementor/gen_zakladka.py (antywzorzec 22).

   🔴 Siatka jest SZESCIOTOROWA i to jest mechanizm kryterium B131:
   `repeat(6, minmax(0,1fr))` z `span 2` daje trzy karty w rzedzie, a reguly
   `:nth-child` rozciagaja ostatni NIEPELNY rzad na cala szerokosc. Cztery
   stale kolumny (`.b-dalej__siatka` ze szablonu 8277) zostawialyby przy
   dwoch albo trzech kartach pusty tor przy prawej krawedzi.
   ========================================================================== */

.b-zb__naglowek {
	margin-bottom:var(--s48)
}

.b-zb__siatka {
	display:grid;grid-template-columns:repeat(6,minmax(0,1fr));
	  gap:var(--s24);list-style:none;margin:0;padding:0
}

.b-zb__siatka > li {
	grid-column:span 2;display:flex
}

.b-zb__siatka > li:nth-child(3n+1):last-child {
	grid-column:span 6
}

.b-zb__siatka > li:nth-child(3n+1):nth-last-child(2) {
	grid-column:span 3
}

.b-zb__siatka > li:nth-child(3n+2):last-child {
	grid-column:span 3
}

.b-zb__kafel {
	display:flex;flex-direction:column;gap:var(--s8);width:100%;
	  background:var(--biel);border:1px solid var(--linia-kontrolki);border-radius:8px;
	  padding:var(--s32);min-height:160px;text-decoration:none;color:var(--grafit-900)
}

.b-zb__kafel b {
	font-family:Lora,Georgia,'Times New Roman',serif;
	  font-size: 1.3125rem;line-height:1.25;color:var(--zielen-800)
}

.b-zb__kafel span {
	font-size: 1rem;line-height:1.5;color:var(--grafit-700)
}

.b-zb__kafel:hover {
	border-color:var(--zielen-600);box-shadow:0 12px 24px -8px color-mix( in srgb, var( --zielen-900 ) 22%, transparent )
}

.b-zb__kafel:hover b {
	text-decoration:underline;text-underline-offset:3px
}

/* D-75 D7 (B244 v1.5): zdjęte 4 martwe reguły — `.b-zb__kafel .b-zb__cel`, `.b-zb__proza p`
   (+ `:last-child`), `.b-zb__prowadzi`. Klasy nie występują w renderze 53 adresów ani w treści bazy;
   zdjęcie w renderze 5 zakładek × 1440/390 — 0 różnic wyliczonych stylów (`_build/pomiary/d75-2026-09-16/d7-martwe.json`). */

.b-zb--waski {
	max-width:calc(736px + 2 * var(--s32))
}


@media (max-width:1200px) {

	.b-zb__siatka > li {
		grid-column:span 3
	}

	.b-zb__siatka > li:nth-child(3n+1):last-child, .b-zb__siatka > li:nth-child(3n+1):nth-last-child(2), .b-zb__siatka > li:nth-child(3n+2):last-child {
		grid-column:span 3
	}

	.b-zb__siatka > li:nth-child(2n+1):last-child {
		grid-column:span 6
	}

}


@media (max-width:767px) {

	.b-zb__siatka > li, .b-zb__siatka > li:nth-child(3n+1):last-child, .b-zb__siatka > li:nth-child(3n+1):nth-last-child(2), .b-zb__siatka > li:nth-child(3n+2):last-child, .b-zb__siatka > li:nth-child(2n+1):last-child {
		grid-column:span 6
	}

	.b-zb__kafel {
		padding:var(--s24);min-height:0
	}

}

/* --------------------------------------------------------------------------
   19. Podstrony galezi Turystyka — DWIE reguly, ktorych atomic nie wyraza
   (COS-327; D-31, D-33a). Reszta wygladu tych szescu stron to szablon 8277
   i jego 148 klas globalnych — przeniesienie, nie odtworzenie (kontrakt 5).
   -------------------------------------------------------------------------- */

/* Odnosnik WEWNATRZ zdania. Referencja szablonu informacyjnego takiego nie ma,
   ale ten arkusz ma juz gotowy wzorzec dla tresci redakcyjnej — `#b-wpis-tresc a`
   z sekcji 8. Przeniesiony 1:1, bo dwa rodzaje prozy w jednym serwisie nie moga
   podkreslac odnosnikow inaczej. Samo podkreslenie jest wymogiem SC 1.4.1:
   odnosnika nie wolno rozroznic wylacznie kolorem. */
.elementor .b-str__akapit a {
	color: var( --zielen-700 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

/* Ramka rozbieznosci (Historia, sekcja „Co zostalo z tej przeszlosci").
   `border-inline-start` to `border-*-width` per bok — poza schematem propsow
   (§4e), tak samo jak `top` dla `b-str__bok`. Klasa `b-str__ramka` niesie
   wciecie i odstep; kreska musi byc tutaj. Wartosci 1:1 z `#b-wpis-tresc
   blockquote`. */
.b-str__ramka {
	border-inline-start: 3px solid var( --zielen-500 );
}

/* --------------------------------------------------------------------------
   20. Karta glowna rozdzielnika — jedna karta na pelna szerokosc
   (COS-327 batch D; D-27e, D-30). PRZENIESIENIE mechanizmu z sekcji 18:
   tam `:nth-child(3n+1):last-child{grid-column:span 6}` dopina niepelny rzad
   siatki szesciotorowej, tutaj to samo robi `:only-child` w siatce
   czterotorowej szablonu 8277.
   -------------------------------------------------------------------------- */

.b-dalej__siatka > :only-child {
	grid-column: 1 / -1;
}

/* 🔴 Karta zakladki zbiorczej byla PODKRESLONA W STANIE SPOCZYNKU na wszystkich
   trzech zbudowanych zakladkach — wbrew referencji D-30, ktora podkresla tytul
   dopiero przy `:hover` (`.b-zb__kafel:hover b`). Zmierzone 2026-09-05 na
   `/samorzad/`, `/inwestycje/` i `/mieszkaniec/`: `textDecorationLine` = underline.

   Przyczyna: zakladka zbiorcza jest strona KLASYCZNA (tresc + shortcode), a nie
   dokumentem Elementora, wiec jej tresc renderuje sie wewnatrz `.page-content`
   motywu. `hello-elementor/theme.css` ma tam `.page-content a{text-decoration:
   underline}` o specyficznosci (0,1,1), ktora bije `.b-zb__kafel` (0,1,0)
   z sekcji 18. Na stronach Elementora `.page-content` nie wystepuje — stad wada
   widoczna wylacznie na zakladkach i niewidoczna nigdzie indziej.

   Kwalifikator `a` i kontekst `.page-content` daja (0,2,1) — wygrana bez remisu.
   Remisu swiadomie unikam: rozstrzygalaby go kolejnosc arkuszy, rozna per
   dokument (STAN-STAGING §4h, §13c pkt 2). */
.page-content a.b-zb__kafel {
	text-decoration: none;
}


/* --------------------------------------------------------------------------
   21. Odstep sekcyjny zakladki zbiorczej (COS-327 batch E, polecenie Patryka
       2026-09-06). STANDARD — Design i odstepy §1: padding pionowy sekcji
       96 / 64 / 48 px (desktop / tablet / telefon).

   🔴 To nie jest korekta wartosci, tylko BRAKUJACE PUDELKO. Zakladka zbiorcza
   nie jest dokumentem Elementora (STAN-STAGING §15b) — shortcode renderuje sie
   wprost w `.page-content` motywu Hello, wiec zaden kontener sekcji z paddingiem
   nie powstaje. Zmierzone 2026-09-06 na czterech zakladkach i szesciu
   szerokosciach: `main.site-main` ma `padding-block: 0px` w kazdym z 24
   pomiarow, a nad H1 zostaje 8 px z marginesu naglowka.

   ── Trzy rzeczy, ktore ustala WYBOR MECHANIZMU ──────────────────────────

   1. Pudelkiem jest `main.site-main`, a NIE `.page-content`: H1 stoi
      w `.page-header`, czyli POZA `.page-content`, wiec padding gorny wypadlby
      POD naglowkiem strony zamiast nad nim.

   2. Zakres wyznacza `:has(.b-zb__siatka)`, czyli OBECNOSC SIATKI KART, a nie
      lista `page-id-*`. Lista zestarzalaby sie przy pierwszej nowej zakladce,
      a `.b-zb__siatka` jest jedynym markupem, ktory ten komponent emituje.
      To takze powod, dla ktorego regula NIE idzie do wtyczki jako filtr
      `body_class`: D-06 mowi wprost, ze zmiana wykonalna bez wydania wtyczki
      do jej kodu trafic nie moze.
      ⚠ Przegladarka bez `:has()` (Chrome < 105, Safari < 15.4, Firefox < 121)
      dostanie stan sprzed poprawki — czyli dzisiejszy. Nic nie przestaje
      dzialac, odstep jest ciasniejszy. Swiadomie.

   3. Margines gorny H1 zerujemy, bo padding blokuje jego zlewanie: bez tego
      odstep zmierzony wynosilby 96 + 8 = 104 px i STANDARD bylby spelniony
      „prawie". Progi 1200/767 sa progami TEGO zestawu (§5e), nie domyslnymi
      Elementora.
   -------------------------------------------------------------------------- */

body:has(.b-zb__siatka) .site-main {
	padding-block: var( --s96 );
}

body:has(.b-zb__siatka) .page-header h1 {
	margin-top: 0;
}

@media (max-width: 1200px) {
	body:has(.b-zb__siatka) .site-main { padding-block: var( --s64 ); }
}

@media (max-width: 767px) {
	body:has(.b-zb__siatka) .site-main { padding-block: var( --s48 ); }
}

/* --------------------------------------------------------------------------
   22. Opis pliku w tabeli tresci — dla czytnika, nie dla oka
   (COS-327 batch H).

   Funkcja `opisz_pliki` z `includes/pliki.php` doklada do KAZDEGO odnosnika warstwe
   `(PDF, 275 kB)`. W tej galezi pliki stoja w TABELACH, ktore wlasna kolumna
   podaja „Format i rozmiar" — ten sam ciag znakow wychodzil wiec DWA RAZY
   w jednym wierszu. Zmierzone na 16 pozycjach plikowych stron 8604 i 8605.

   🔴 Warstwa NIE JEST usuwana, tylko odsuwana z widoku. Dla uzytkownika
   czytnika ekranu jest jedynym sygnalem, ze odnosnik prowadzi do pliku,
   a nie do strony; kolumna tabeli tej roli nie pelni, bo czytnik dochodzi
   do niej dopiero PO odnosniku. `display: none` zdjelby ja takze z drzewa
   dostepnosci i zamienil poprawke wizualna w regresje dostepnosci.

   Mechanizm PRZENIESIONY z `.b-skip__link` (sekcja 12): `clip-path: inset(50%)`,
   nie `left: -9999px` — element odsuniety o 100 000 px potrafi rozciagnac
   obszar przewijania.

   Zakres: wylacznie tabele tresci. Odnosnik do pliku stojacy w prozie albo
   w bloku odnosnikow opis widoczny ZACHOWUJE, bo tam nic go nie powtarza.
   -------------------------------------------------------------------------- */

.b-str__tabela .b-plik__opis {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset( 50% );
	white-space: nowrap;
}


/* --------------------------------------------------------------------------
   23. Stopka, wariant A — wlasciwosci spoza schematu propsow atomic
   (COS-327 wsad F; D-48 pkt 1, prototyp `_build/prototyp/stopka-v3.baza.html`
   wariant `#wA`).

   Osiem klas stopki niesie w Elementorze wszystko, co schemat propsow potrafi
   wyrazic. Ponizej stoi WYLACZNIE reszta — te same powody, dla ktorych
   `list-style` stoi tu dla `.kafle-lista`, a `white-space` dla `.b-marka__nazwa`
   (STAN-STAGING §5f).

   🔴 `<dt>` i `<dd>` sa KONTENERAMI, nie akapitami. Zmierzone 2026-09-09:
   `e-paragraph` z `tag: "dt"` renderuje `<div class="b-godziny__dt">` — klasa
   i tekst na miejscu, semantyki nie ma, bo nieznana wartosc propsu jest
   odrzucana po cichu (§4c pkt 3). Selektory ponizej celuja wiec w element
   semantyczny, ktory naprawde stoi w markupie.
   -------------------------------------------------------------------------- */

/* 🔴 CALA TA SEKCJA STOI POD `#b-stopka` — specyficznosc (1,1,0), nie (0,1,0).
   Powod ZMIERZONY 2026-09-09: regula `.b-godziny{column-gap:16px}` nie doszla,
   bo klasa globalna daje ten sam ciezar (0,1,0), a kolejnosc arkuszy MIEDZY
   dokumentami nie jest stala (§4h — najdrozsza pulapka batcha 5b). Remisu
   trzeba unikac, a nie liczyc na to, ze rozstrzygnie sie po naszej mysli.
   Ten sam wzorzec, ktorym arkusz rozstrzyga juz `#b-wpis-tresc`. */

/* Pozycja listy: `display` na `li` — element pochodzi z kontenera bez klasy. */
#b-stopka .b-stopka__lista li { display: flex; }

/* Dwuwartosciowy `gap` i cyfry o rownej szerokosci — oba poza schematem.
   ⚠ Etykieta `b-stopka__godziny`, NIE `b-godziny`: ta druga jest zajeta przez
   komponent godzin w pasie naglowka (Pakiet A). Kolizja zmierzona na renderze
   psula OBA komponenty — naglowek dostawal `display:grid` i kolor stopki. */
#b-stopka .b-stopka__godziny {
	column-gap: var( --s16 );
	font-variant-numeric: tabular-nums;
}

/* `white-space` nie istnieje w schemacie propsow (§4e) — godzina nie moze sie
   lamac w polowie zakresu. */
#b-stopka .b-stopka__godziny-dd { white-space: nowrap; }

/* Adres do e-Doreczen jest identyfikatorem: `letter-spacing` rozluznia go,
   `overflow-wrap` pozwala mu sie zlamac zamiast rozpychac kolumne. */
#b-stopka .b-ae {
	letter-spacing: 0.02em;
	overflow-wrap: anywhere;
}

/* Dlugi adres e-mail i dluga nazwa BIP-u nie moga rozpychac kolumny. */
#b-stopka .b-stopka__link,
#b-stopka .b-stopka__bip { overflow-wrap: anywhere; }

/* Herb i copyright stoja obok siebie jako jedna grupa pasa dolnego.

   🔴 `width: auto` jest WARUNKIEM, nie ozdoba. Kontener atomic bez niego bierze
   PELNA szerokosc pasa (zmierzone: 1136 px przy oknie 1440), przez co
   `justify-content: space-between` spycha odnosnik BIP do drugiego wiersza
   i pas dolny rosnie ze 76 do 140 px. Na calej stopce to +64 px, czyli +11,4 %
   wobec referencji — poza tolerancja B196.

   ⚠ WSAD R (2026-09-11) ZDJAL `flex: none` z tej grupy: blok R nizej nadaje
   `#b-stopka #stopka-znak { flex: 0 1 auto }` waga (2,0,0), wieksza niz (1,0,0)
   tutaj. Powod: `flex: none` nie pozwalalo grupie sie ZWEZIC, wiec przy 320–388 px
   i pismie 200 % wypychalo ja 69 px poza pas. Grupa ma sie zwezac (tekst
   „© 2026 Gmina Bobrowice" sie lamie), ale nie rozciagac — stad `0 1 auto`,
   nie `1 1 auto`. Ta deklaracja ponizej jest wiec MARTWA i zostaje wylacznie
   po to, zeby historia reguly byla czytelna.
   `_cssid` zamiast klasy globalnej: jeden element, jedna regula — klasa
   kosztowalaby pelny zapis kolekcji 158 pozycji. */
#stopka-znak {
	display: flex;
	align-items: center;
	gap: var( --s12 );
	width: auto;
	flex: none;
}

/* --------------------------------------------------------------------------
   24. Siatka „Dalej w tej sekcji" na PODSTRONACH — tory ida za liczba kafli
   (COS-327 wsad F; D-53, pozycja O-55, kryterium B230).

   🔴 Zmierzony stan zastany (2026-09-08, 1440 px): klasa `.b-dalej__siatka`
   stoi na 23 z 42 stron opublikowanych, w 27 blokach, wszystkie czterotorowe.
   Luka przy prawej krawedzi w 8 z 27 blokow: **584 px** przy dwoch kaflach,
   **292 px** przy trzech. Pozostale 19 blokow ma luke 0,00 px — pietnascie
   z czterema kaflami i cztery z jednym, bo `:only-child` z sekcji 20 rozciaga
   pojedynczy kafel na cala szerokosc.

   🔴 To jest KONTYNUACJA reguly, ktora w tym komponencie juz stoi, a nie nowy
   pomysl: `:only-child { grid-column: 1 / -1 }` rozstrzygnelo dawno, ze kafel
   wypelnia rzad. Wysrodkowanie rzedu wymagaloby zamiany torow `1fr` na stale
   i dolozenia `justify-content` — wiecej kodu i drugi mechanizm w tym samym
   komponencie (D-53 §53b).

   ⚠ Zakres to WYLACZNIE podstrony. Blok „Dalej" na zakladkach zbiorczych
   przestal istniec w 1.24.0 (D-40), a pustej kolumny i tak nie zostawial —
   0,00 px w 15 z 15 pomiarow.
   -------------------------------------------------------------------------- */

/* 🔴 D-63c (R3 pkt 4, B237 — zastępuje B230): obie reguły dostają ZAKRES `(min-width: 768px)`.
   Bez zakresu `:has()` waży (0,3,0) i bije mobilną klasę globalną `.elementor .b-dalej__siatka
   { grid-template-columns: 1fr }` (0,2,0) na KAŻDEJ szerokości — zmierzone 2026-09-16 na stanie
   zastanym: bloki 3-kaflowe w 3 torach po 80–104 px, 2-kaflowe w 2 po 128–164 px na 390 / 360 / 320.
   Parametr wyznaczony pomiarem (`_build/pomiary/wsad-r2-2026-09-15/r3_d63c_media.py`, inwentarz
   1 280 adresów → 40 bloków na 34 stronach, 7 szerokości × pismo 100 / 200 % = 560 par,
   Chromium headed `--force-device-scale-factor=1`):
     V0 bez zakresu ........ (a) luka 0   · telefon: tory 104 / 164 px
     V1 `min-width: 1201px` .. (a) luka 78 — przy 1200–768 trzy kafle w 2 torach zostawiają sierotę
     **V2 `min-width: 768px` .. (a) luka 0 / 560 · telefon 1 tor, kafel = kafel zakładki zbiorczej — PRZYJĘTY**
     V3 tylko 3-kaflowa .... (a) luka 0   · telefon: 2 kafle dalej po 164 px
   K+ odtwarza 3 tory / 104 px @390; K−1 (zakres zdjęty) i K−2 (reguła 2-kaflowa zdjęta, luka 584 px) łapią.
   ⚠ Klauzula B237 (b) „kafel Dalej ≥ kafel zakładki zbiorczej” oblewa przy ≥ 768 px w KAŻDYM wariancie
   (222 z 560 par, identycznie jak stan zastany): blok stoi w kolumnie treści 736 px i ma 4 stałe kolumny
   (D-40a), siatka zakładki — 1136 px. To kolizja kryterium z układem, nie parametr — zgłoszone Coworkowi. */
@media (min-width: 768px) {

	.b-dalej__siatka:has( > :nth-child(2):last-child ) {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}

	.b-dalej__siatka:has( > :nth-child(3):last-child ) {
		grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	}
}

/* --------------------------------------------------------------------------
   25. Listy w tresci stron informacyjnych
   (COS-327 wsad F).

   PRZENIESIENIE wzorca `#b-wpis-tresc ul/ol/li` z sekcji 8 — dwa rodzaje prozy
   w jednym serwisie nie moga formatowac list inaczej. `list-style` nie jest
   propsem atomic (§4e), a kontener `e-div-block` z tagiem `ul` dostaje
   `g-reset`, wiec bez tej reguly lista traci punktory i wciecie.

   Zakres: sekcje stron informacyjnych i blok tresci strony prawnej.
   -------------------------------------------------------------------------- */

.b-str__sekcja ul,
.b-str__tresc > ul {
	list-style: disc;
	margin: 0 0 var( --s24 );
	padding-inline-start: var( --s24 );
}

.b-str__sekcja ol,
.b-str__tresc > ol {
	list-style: decimal;
	margin: 0 0 var( --s24 );
	padding-inline-start: var( --s24 );
}

.b-str__sekcja li,
.b-str__tresc > ul li,
.b-str__tresc > ol li { margin-bottom: var( --s8 ); }

/* Spis tresci ma wlasna liste i wlasne reguly — nie dziedziczy punktorow. */
.b-str__bok ol { list-style: none; padding-inline-start: 0; margin: 0; }

/* --------------------------------------------------------------------------
   26. Mapa witryny (COS-327 wsad F; D-45)

   Markup pochodzi ze skrotu `[bobrowice_mapa]` wtyczki 1.24.0, wiec klasy
   globalne sie dla niego NIE EMITUJA (§4j) — caly wyglad musi byc tutaj.
   Blok autorski dzialu „Aktualnosci" niesie `_cssid`, zeby jedna regula
   zrownala go z dzialami generowanymi.
   -------------------------------------------------------------------------- */

.b-mapa__dzial,
#mapa-aktualnosci { margin-bottom: var( --s48 ); }

.b-mapa__naglowek,
#mapa-aktualnosci h2 { margin: 0 0 var( --s16 ); }

/* 🔴 Kolor i stopien naglowka dzialu NIE przychodza znikad: `[bobrowice_mapa]`
   emituje goly `<h2>`, wiec bez tej reguly dziedziczy `#333` i 32 px z motywu
   zamiast `--zielen-800` i 1,75 rem, ktore ma `b-h2--strona` na kazdej innej
   stronie. Zmierzone 2026-09-09 w ramce anonimowej: piec naglowkow dzialow
   w `rgb(51,51,51)`, a `a{color:inherit}` ponizej przenosilo te wade na piec
   odnosnikow — jedyne pozostale wady B183 na trzynastu stronach.

   ⚠ Regula stoi OSOBNO, nie dolaczona do selektora z `#mapa-aktualnosci h2`
   wyzej: tamten czlon ma wage (1,0,1) i pobilby klase globalna `b-h2--strona`,
   ktora blok autorski dzialu „Aktualnosci" juz poprawnie niesie. */
.b-mapa__naglowek {
	color: var( --zielen-800 );
	font-size: 1.75rem;
	line-height: 1.25em;
}

.b-mapa__naglowek a { color: inherit; text-decoration: none; }

.b-mapa__naglowek a:hover { text-decoration: underline; text-underline-offset: 3px; }

.b-mapa__lista {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: var( --s8 );
}

.b-mapa__lista .b-mapa__lista {
	margin-top: var( --s8 );
	padding-inline-start: var( --s24 );
}

.b-mapa__link {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	color: var( --zielen-700 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

.b-mapa__link:hover { color: var( --zielen-800 ); }

/* --------------------------------------------------------------------------
   27. Kolor odnosnikow — okruszki i stany
   (COS-327 wsad F; D-56, kryteria B183 i B184, pozycja O-71)

   🔴 ZMIERZONY ZASIEG, nie domyslony. Roz `#c36` wchodzi na render WYLACZNIE
   z `hello-elementor/assets/css/reset.css?ver=3.5.1` — trzy reguly, cztery
   wystapienia, zero w arkuszach projektu. Na renderze dociera do 56 elementow,
   ale WIDZI GO uzytkownik na szesciu: dwoch okruszkach widoku wpisu (x2 wpisy)
   i po jednym odnosniku w prozie `/mieszkaniec/` i `/kultura-oswiata-sport/`.
   Potwierdzone ponownie 2026-09-09 na `/samorzad/urzad-gminy/`: okruszki
   `rgb(204, 51, 102)`, proza `rgb(26, 68, 51)` — proza ma juz swoja regule
   (sekcja 8 i 19), okruszki nie mialy zadnej.

   🔴 REGULA MUSI ZYC TUTAJ, NIE W PLIKU MOTYWU. Serwis stoi na Hello Elementor
   BEZ MOTYWU POTOMNEGO — aktualizacja motywu przywroci `reset.css` i roz
   wrocilby przy pierwszej aktualizacji (D-56 §56b).

   Kontrasty policzone na trzech tlach serwisu (`--biel`, `--zielen-050`,
   `--zielen-100`):
     `--zielen-700` (spoczynek) 10,95 · 9,99 · 8,90
     `--zielen-800` (hover)     14,59 · 13,32 · 11,86
     `#c36` z motywu             4,96 ·  4,53 ·  4,03  <- OBLEWA 4,5 na `--zielen-100`
   Token hover dobrany sposrod pary z B184 (`--zielen-800`, `--zielen-600`):
   wchodzi `--zielen-800`, bo jest CIEMNIEJSZY od spoczynku — `--zielen-600`
   bylby jasniejszy i kierunek zmiany czytalby sie odwrotnie.

   ⚠ Samo podkreslenie w spoczynku juz jest (sekcja 8 i 19) i zostaje: SC 1.4.1
   zabrania rozrozniania odnosnika wylacznie kolorem.
   -------------------------------------------------------------------------- */

.b-okruszki a,
.b-okruszki--strona a {
	color: var( --zielen-700 );
	text-decoration: none;
}

.b-okruszki a:hover,
.b-okruszki a:focus-visible,
.b-okruszki--strona a:hover,
.b-okruszki--strona a:focus-visible {
	color: var( --zielen-800 );
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* 🔴 Deklaracja dostepnosci idzie WIDGETEM `html` — identyfikatory `a11y-*`
   sa wymogiem art. 12 pkt 7 ustawy i musza trafic na render znak w znak, wiec
   dokument nie moze zostac rozlozony na widgety atomowe. Skutek uboczny: jego
   odnosniki NIE MAJA ani `.b-str__akapit`, ani `.b-okruszki`, wiec zadna regula
   sekcji 27 ich nie obejmowala. Zmierzone 2026-09-09: **20 odnosnikow**
   na `/dostepnosc/` renderowalo sie w `#c36` z `reset.css` motywu — kolorze,
   ktory wg tabeli wyzej ma na `--zielen-100` kontrast **4,03** i oblewa 4,5.

   Lancuch przodkow zmierzony na renderze:
   `.b-str__tresc` > `.elementor-widget-html` > `<a>`.

   ⚠ Selektor jest zawezony do widgetu `html` WEWNATRZ tresci strony. Szersze
   `.b-str__tresc a` objeloby takze odnosniki blokowe (`.b-dalej-link`) i kafle,
   ktore maja wlasne klasy o wadze (0,1,0) — a (0,2,0) bilo by je wszystkie. */
.b-str__tresc .elementor-widget-html a {
	color: var( --zielen-700 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

.b-str__tresc .elementor-widget-html a:hover,
.b-str__tresc .elementor-widget-html a:focus-visible {
	color: var( --zielen-800 );
}

.b-str__tresc .elementor-widget-html a:visited { color: var( --zielen-700 ); }

/* 🔴 Odnosnik blokowy, ktory jest zewnetrzny, gubi trzy wlasne deklaracje.
   Zmierzone podstawieniem kontrolnym: `b-dalej-link` samo daje 16 px,
   `b-dalej-link b-zewn` daje **12 px** — czyli rozstrzyga sama obecnosc
   `b-zewn`, nie otoczenie. Obie klasy maja te sama wage, wiec wygrywa ta nizej
   w arkuszu; `b-zewn` byla projektowana jako mala szara adnotacja i nadpisuje
   odnosnikowi blokowemu stopien (0,8125 rem / 0,75 rem), kolor (`--grafit-500`)
   oraz `display`.

   ⚠ `b-zewn` NIE schodzi z tych odnosnikow — niesie `display:flex`, `gap`
   i `align-items`, ktorych potrzebuje ikona `b-zewn::after`. Przywracamy tylko
   to, co `.b-dalej-link` deklaruje sama o sobie.

   ⚠ Wagi (0,3,0) i (1,2,0) bija (0,2,0) BEZ REMISU — remisu trzeba unikac,
   bo kolejnosc arkuszy miedzy dokumentami nie jest stala (§4h). */
.b-str__tresc .b-dalej-link.b-zewn,
#b-wpis-tresc .b-dalej-link.b-zewn {
	font-size: 1rem;
	color: var( --zielen-800 );
	display: inline-flex;
}

/* Stan hover prozy redakcyjnej. Do tej pory rozstrzygal go `a:hover{color:#336}`
   z motywu — arkusz zestawu nie definiowal go W OGOLE (QA odnosnikow §6). */
#b-wpis-tresc a:hover,
#b-wpis-tresc a:focus-visible,
.b-str__akapit a:hover,
.b-str__akapit a:focus-visible {
	color: var( --zielen-800 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

/* Odnosnik odwiedzony NIE dostaje trzeciego koloru — B183 obejmuje `:visited`,
   a druga barwa w tresci urzedowej niesie znaczenie, ktorego tu nie ma. */
#b-wpis-tresc a:visited,
.b-str__akapit a:visited,
.b-okruszki a:visited { color: var( --zielen-700 ); }

/* ==========================================================================
   BLOK ZMIAN — runda Q3–Q4 (COS-327) · prototyp 2026-09-10
   Miejsce w buildzie: arkusz zestawu (Custom CSS), na końcu pliku.
   Wartości w px podane tu jako WARIANT PROTOTYPU — twarde liczby wyznacza
   Code pomiarem na DOM (kontrakt 1); kryteria: plik kryteriów v1.1 (B228, B238–B252).
   ========================================================================== */

/* ── D-67 — tryb wysokiego kontrastu: 24 tokeny przez dwa nowe tokeny Variables
   (`kontrast-czern` #000000, `kontrast-biel` #FFFFFF). --focus bez zmiany.
   Dwie reguły komponentowe referencji odrzucone (wariant C hero, D-24). ── */
html[data-b-kontrast="1"] {
	--tlo: var( --kontrast-biel );
	--biel: var( --kontrast-biel );
	--zielen-050: var( --kontrast-biel );
	--zielen-100: var( --kontrast-biel );
	--zielen-200: var( --kontrast-biel );
	--miedz-200: var( --kontrast-biel );
	--zielen-900: var( --kontrast-czern );
	--zielen-800: var( --kontrast-czern );
	--zielen-700: var( --kontrast-czern );
	--zielen-600: var( --kontrast-czern );
	--zielen-500: var( --kontrast-czern );
	--grafit-900: var( --kontrast-czern );
	--grafit-700: var( --kontrast-czern );
	--grafit-500: var( --kontrast-czern );
	--linia-kontrolki: var( --kontrast-czern );
	--linia-dekor: var( --kontrast-czern );
	--miedz-700: var( --kontrast-czern );
	--miedz-500: var( --kontrast-czern );
	--alarm-700: var( --kontrast-czern );
	--uwaga-700: var( --kontrast-czern );
	--info-700: var( --kontrast-czern );
	--bip-700: var( --kontrast-czern );
	--bip-800: var( --kontrast-czern );
}

/* ── D-66c — panel bez własnego paddingu (wcięcie niosą wiersze po 16 px, jak w
   referencji). Wariant prototypu: zmienna, którą wtyczka już czyta (L112) —
   bez wydania wtyczki. Code może zamiast tego zmienić L112. ── */
.b-oc { --b-oc-padding: 0; }

/* ── D-66a — napis „Menu” wraca do markupu jako <strong> (referencja L315). Bez własnej
   reguły: w referencji dziedziczy kolor tekstu panelu, klasa `b-oc__tytul` jest tylko uchwytem. ── */

/* ── D-66c — przycisk wyszukiwarki: ikona `→` z nazwą dostępną „Szukaj”.
   Wariant prototypu dla B239 (b): padding motywu zdjęty, szerokość = min-width,
   więc przy s = 2 przycisk ma 48 px (≤ 96). Tabela wariantów — Code. ── */
.b-oc .b-oc__szukaj button {
	padding: 0;
	min-width: 48px;
	line-height: 1;
}

/* ── D-66d — stany panelu wg dokumentu pomiarowego 09-09 §6 (14 par ≥ 4,5 : 1).
   `:hover` I `:focus` (goły), bo `[type=button]:focus` z reset.css ma wagę (0,2,0).
   Odnośniki nie zmieniają tła (pierścień na --zielen-200 dawał 2,68 : 1). ── */
.b-oc .b-oc__lista li > a:hover,
.b-oc .b-oc__lista li > a:focus {
	color: var( --zielen-700 );
	text-decoration: underline;
	text-underline-offset: 3px;
}

.b-oc .b-oc__lista > li > button:hover,
.b-oc .b-oc__lista > li > button:focus,
.b-oc .b-oc__gora .b-oc__zamknij:hover,
.b-oc .b-oc__gora .b-oc__zamknij:focus {
	background: var( --zielen-050 );
	color: var( --zielen-700 );
}

.b-oc .b-oc__p2 > li > button:hover,
.b-oc .b-oc__p2 > li > button:focus {
	background: var( --zielen-100 );
	color: var( --zielen-700 );
}

.b-oc .b-oc__szukaj button:hover,
.b-oc .b-oc__szukaj button:focus {
	background: var( --zielen-600 );
	color: var( --biel );
}

/* ── D-66c — pole wyszukiwania: interlinia jak w referencji (1,6), więc przy s = 1 pole ma
   wysokość referencji (B239 c); rośnie ze skalą, bo stopień jest w rem (B244). ── */
.b-oc .b-oc__szukaj input { line-height: 1.6; }

/* ── D-66d — pierścień fokusu pola rysowany do wewnątrz: przy odsunięciu 3 px jego prawy
   bok leżał na przycisku `--zielen-700` (2,74 : 1, B241 d). Do wewnątrz leży na bieli
   ramki (4,00 : 1). Selektor pola schodzi z listy L550–585 (pozycja w L561; zmiany-arkusza-q.json).
   `!important` jak w tej liście — arkusz L568–572: bez niego pole na stagingu brało kolor pierścienia z `color`. ── */
/* O-115 (1.27.2) — pierścień wewnętrzny pola (offset −3) przecinał w narożnikach szare obramowanie formularza:
   390 px lewy bok 1,91 : 1, 360 px góra i dół 1,07 : 1. Offset −5 też przechodził (4,0), ale pierścień idzie na CAŁY
   formularz — ten sam mechanizm co w nagłówku (O-58, VB2), niezależny od zaokrągleń ramki. Tabela wariantów:
   `_build/cos327t/c-warianty.json` (390/360/320/768/1024, Tab i klik — 0 próbek < 3 : 1, przycisk 8,61 : 1). */
.b-oc .b-oc__szukaj > div:has( input:focus-visible ) {
	outline: 3px solid var( --focus );
	outline-offset: 3px;
}
.b-oc .b-oc__szukaj input:focus-visible {
	outline-style: none !important;
	box-shadow: none;
}

/* ── D-66b / R5 — ikona ✕ na środku: `[type=button]` z reset.css (display:inline-block,
   padding .5rem 1rem) stoi w stosie za regułą wtyczki i przestawiał ✕ na blok z paddingiem 16 px —
   SVG dosuwało się do lewej o 8 px. ── */
.b-oc .b-oc__gora .b-oc__zamknij {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
}

/* ── D-66e — godziny w dwóch wierszach, zakres dni się nie łamie (panel i pas 2) ── */
.b-godziny__wiersz { display: block; }
.b-godziny__dni { white-space: nowrap; }

/* ── D-61 61c pkt 2 — odnośniki w komórkach tabel i w leadzie podkreślone w spoczynku.
   Waga (0,2,1): bije `.elementor a{text-decoration:none}` (0,1,1) i
   `.e-paragraph-base a{all:unset}` (0,1,1) bez remisu i bez względu na kolejność plików. ── */
.elementor .b-str__td a,
.elementor .b-str__lead a {
	color: var( --zielen-700 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

.elementor .b-str__td a:hover,
.elementor .b-str__td a:focus-visible,
.elementor .b-str__lead a:hover,
.elementor .b-str__lead a:focus-visible {
	color: var( --zielen-800 );
}

/* Mapa witryny: arkusz deklarował podkreślenie (L2191), render go nie miał —
   `.b-mapa__link` (0,1,0) przegrywało z `.elementor a` (0,1,1). */
.elementor .b-mapa__link { text-decoration: underline; }

/* ── D-60e — odnośnik blokowy: jawny stan, kolor + podkreślenie, bez translateY ── */
.b-str__tresc .b-dalej-link:hover,
.b-str__tresc .b-dalej-link:focus-visible,
#b-wpis-tresc .b-dalej-link:hover,
#b-wpis-tresc .b-dalej-link:focus-visible {
	color: var( --zielen-900 );
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* ── D-60f — dwuwarstwowy cień panelu faktów i spisu (nigdy domyślny cień Elementora):
   bliska warstwa krótka i ciemniejsza, daleka długa i rozmyta. ── */
.b-fakty,
.b-spis {
	box-shadow:
		0 1px 2px color-mix( in srgb, var( --zielen-900 ) 20%, transparent ),
		0 12px 24px -12px color-mix( in srgb, var( --zielen-900 ) 14%, transparent );
}

/* ══════════════════════════════════════════════════════════════════════════
   WSAD R (COS-327, 2026-09-11) — D-72a/b/c, D-73b/c. Blok przeniesiony W CAŁOŚCI
   z referencji `_build/prototyp/blok-zmian-stopka-r.css` (wariant U1, przyjęty
   przez Patryka: „U1 — przyjmuję”). ZASTĘPUJE regułę D-69 z wsadu Q wraz z jej
   komentarzem — stara reguła dawała płytkę 328,7 × 40 przy znaku 90 × 32,
   podpis 12,09 px w 22 wierszach i blok BIP 462 px zamiast 40 (raport QA W1).
   ══════════════════════════════════════════════════════════════════════════ */
/* ── D-72a — płytka BIP dopasowana do znaku (bip-logo.svg z gov.pl, viewBox 151,59 × 64,86 = 2,337 : 1).
   ZASTĘPUJE regułę `#b-stopka .b-stopka__bip-plytka` z wsadu Q (L2430–2436 arkusza 1.25.1) w całości.
   Znak 24 px wysokości + margines 8 px z każdej strony = płytka 72 × 40: wysokość płytki = wysokość herbu (40),
   szerokość wynika ze znaku, a margines jest równy na czterech bokach (siatka 8 px).
   🔴 `width: auto` jest WARUNKIEM, nie ozdobą — kontener atomowy Elementora dostaje `--width: 100%`
   (custom-frontend, `.e-con`), a przy `flex: none` nie może się zwęzić: podpis dostawał 12 px i łamał się
   po literze (raport QA 2026-09-11, W1). Ta sama pułapka co `#stopka-znak` wyżej w tym arkuszu. ── */
#b-stopka .b-stopka__bip-plytka {
	display: inline-flex;
	width: auto;
	flex: none;
	padding: var( --s8 );
	background: var( --biel );
	border-radius: 4px;
}

/* Wysokość znaku: 24 px. Klasa globalna daje 32 px regułą (0,2,0) — tu (1,1,0), bez remisu. */
#b-stopka .b-stopka__bip-img {
	height: 24px;
	width: auto;
}

/* ── D-72b — podpis „Biuletyn Informacji Publicznej” w dwóch ZAMIERZONYCH wierszach obok płytki.
   Szerokość w `em`, więc miejsce łamania nie zależy od skali tekstu: „Biuletyn Informacji” = 8,76 em,
   całość = 13,80 em (Public Sans 400, pomiar 2026-09-11) — 9 em mieści pierwszy wiersz z zapasem 0,24 em, nie mieści całości,
   a pudełko podpisu nie odsuwa ikony „nowa karta” od tekstu (przy 10 em odstęp rósł o 19 px).
   `overflow-wrap: normal` zdejmuje dziedziczone `anywhere` (L2018–2019), które pozwoliło łamać po literze.
   Przy braku miejsca (320 px, pismo 200 %) podpis zwęża się do najdłuższego słowa — trzy wiersze, nigdy litera. ── */
#b-stopka .b-stopka__bip-podpis {
	max-inline-size: 9em;
	overflow-wrap: normal;
	line-height: 1.25;
}
/* Dwa wiersze × 1,25 mieszczą się w `min-height: 44px` odnośnika przy piśmie 100 % (35 px) i 125 % (43,75 px) —
   pas dolny nie rośnie. Przy 200 % rośnie (70 px) i jest to skutek zamierzonych dwóch wierszy — raportowany z nazwy. */

/* Grupa herbu i copyrightu może się ZWĘZIĆ (tekst „© 2026 Gmina Bobrowice” łamie się), ale nie rozciągnąć:
   `flex: 0 0 auto` z L2030–2036 arkusza 1.25.1 (`#stopka-znak`) przy 320–388 px i piśmie 200 % wypychało grupę 69 px poza pas
   (pomiar prototypu R 2026-09-11 — wada stanu zastanego, nie tej rundy). `width: auto` zostaje. */
#b-stopka #stopka-znak { flex: 0 1 auto; }

/* ── D-72c / D-63b — odstępy pionowe stopki pod kotwicą `#b-stopka`. ⚠ `#b-stopka` TO SAM element
   `footer.b-stopka` (odczyt renderu 2026-09-11), więc jego własny padding stoi pod `#b-stopka` (1,0,0),
   a potomków pod `#b-stopka .…` (1,1,0) — obie wagi biją `.elementor .b-reset` (0,2,0) z każdego pliku klas
   globalnych, niezależnie od liczby i kolejności plików. Wartości = klasy globalne stopki (80/40, na telefonie
   48/32; siatka 56; pas dolny 32 — odczyt renderu `/` 2026-09-11). ── */
#b-stopka { padding-block: var( --s80 ) var( --s40 ); }
#b-stopka .b-stopka__siatka { padding-block-end: var( --s56 ); }
#b-stopka .b-stopka__dol { padding-block-start: var( --s32 ); }
@media (max-width: 767px) {
	#b-stopka { padding-block: var( --s48 ) var( --s32 ); }
}

/* 🔴 Rezerwa proporcji — odstępstwo od bloku referencyjnego, z powodu (Code, 2026-09-11).
   Znak idzie kanałem `url` (D-73a: plik `assets/logo/bip-logo.svg` z paczki wtyczki), a atomowy
   `e-image` w tym wariancie NIE emituje `width`/`height` — gałąź `url` w `Image_Transformer`
   zwraca wyłącznie `src` i `alt` (odczyt źródła Elementora 4.2.4). Bez rezerwy pudełko obrazu
   ma przed wczytaniem pliku szerokość 0 i pas dolny przeskakuje.
   `aspect-ratio` przy zadanej wysokości wyznacza szerokość z góry. Liczby to wprost `viewBox`
   pliku (151.59 × 64.86 = 2,337), nie zaokrąglenie — B228 porównuje render z plikiem. */
#b-stopka .b-stopka__bip-img {
	aspect-ratio: 151.59 / 64.86;
}

/* + 65d: dwie reguły wewnątrz @media (max-width:767px) ZA L1231 — patrz zmiany-arkusza-q.json */

/* ══════════════════════════════════════════════════════════════════════════
   WSAD R (COS-327, 2026-09-11) — D-72e/D-73e („Podkreśl linki”), D-73d (burger, „Menu”).
   Blok przeniesiony W CAŁOŚCI z referencji `_build/prototyp/blok-zmian-linki-burger-r.css`.
   ══════════════════════════════════════════════════════════════════════════ */
/* ── D-72e — „Podkreśl linki”: przełącznik użytkownika podkreśla KAŻDY odnośnik `a[href]` (menu, stopka,
   kafle, karty, okruszki, proza). Waga `html[data-b-linki] a[href]` = (0,2,2) już bije `.elementor a{text-decoration:
   none}` (0,1,1, custom-frontend) i `.e-heading-base a, .e-paragraph-base a{all:unset}` (0,1,1, styl inline
   Elementora) niezależnie od kolejności arkuszy. `!important` dokłada odporność na reguły kotwiczone na `#id`
   (arkusz świadomie ich używa — `#b-stopka …`, `#b-wpis-tresc …`, waga (1,x,x)): reguła niesie WYBÓR UŻYTKOWNIKA,
   więc żadna reguła komponentu nie może go cofnąć. Offset jak w 61c (2 px). Kolor = kolor tekstu odnośnika
   (`currentColor`), więc tryb wysokiego kontrastu działa bez osobnej reguły. ── */
html[data-b-linki="1"] a[href] {
	text-decoration-line: underline !important;
	text-underline-offset: 2px !important;
}

/* ── W2 (raport QA 2026-09-11) — burger zachowuje kolor ikony w KAŻDYM stanie. `reset.css` motywu:
   `button:focus, button:hover {background-color:#c36; color:#fff}` (0,1,1) bije `.b-burger{color}` (0,1,0);
   tło ratuje `!important` arkusza, kolor nie — ikona `stroke="currentColor"` robiła się biała na białym
   po zamknięciu panelu (fokus wraca na burgera, G10) i przy najechaniu. Ten sam wzorzec, którym arkusz już
   broni `.b-a11y__btn:hover, .b-a11y__btn:focus` (L120–126). Waga (0,2,0), bez remisu. ── */
.b-burger:hover,
.b-burger:focus,
.b-burger:active {
	color: var( --zielen-800 );
	border-color: var( --zielen-700 ) !important;
}

/* ── W4 (raport QA 2026-09-11) — napis „Menu” w panelu: kolor tekstu z referencji (prototyp menu L311–316:
   <strong> dziedziczy kolor treści `--grafit-900` na bieli), zamiast jasnego koloru z otoczenia (≈1,2 : 1). ── */
.b-oc .b-oc__tytul {
	color: var( --grafit-900 );
}

/* ── O-113 (R4 wsadu R, 2026-09-16) — przycisk „BIP” zachowuje biały napis przy najechaniu i wciśnięciu.
   `.b-bip:hover{background:var(--bip-800)}` nie ustawiał koloru, więc wygrywał `a:hover, a:active{color:#336}`
   z `reset.css` motywu (0,1,1 > `.b-bip` 0,1,0): napis `#336` na `--bip-800` = 1,31 : 1 (tryb kontrastu 1,81).
   Ten sam mechanizm co W2 burgera. Parametr z tabeli 4 wariantów (`_build/pomiary/o113-2026-09-16/o113-warianty.json`,
   20 odczytów na wariant, 5 stanów z asercją `matches`, 1440/390 × tryb zwykły/kontrastu): V0 12 błędów · V1 `:hover` 0 ·
   V2 `:hover, :active` 0 (przyjęty — `:active` z klawiatury bez kursora) · V3 + `:focus` 0 (nic nie dodaje). Waga (0,2,0). ── */
.b-bip:hover,
.b-bip:active {
	color: var( --biel );
}

/* ── D-75 D1 (B183, O-112) — odnośniki prozy w `.page-content` stron klasycznych w rodzinie 61c/D-60e
   (`--zielen-700` + podkreślenie; najechanie, wciśnięcie i `:focus-visible` `--zielen-800`), zamiast
   `a{color:#c36}` i `a:hover,a:active{color:#336}` z `reset.css` motywu. Parametr z tabeli 5 wariantów
   (`_build/pomiary/d75-2026-09-16/d1d2-warianty*.json`; 8 stron klasycznych z 404 × 1440/390, 72 odnośniki,
   560 tekstów × 4 stany kanałem stanów): V0 stan zastany 32 błędy · V1 `.page-content a` 0, ale zmienia kolor
   68 kafli `.b-zb__kafel` · V2 `:not([class])` — wynik nieważny (kanał stanów dokłada klasę do `<a>`) ·
   V3 `:is(p,li,td) > a` 0, regresja 68 · **V4 `:not([class*="b-"])` 0 błędów, 0 regresji — PRZYJĘTY**.
   Waga (0,2,1) bije `a:hover` motywu (0,1,1) i `.page-content a` z `theme.css` (0,1,1). ── */
.page-content a:not( [class*="b-"] ) {
	color: var( --zielen-700 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

.page-content a:not( [class*="b-"] ):hover,
.page-content a:not( [class*="b-"] ):active,
.page-content a:not( [class*="b-"] ):focus-visible {
	color: var( --zielen-800 );
	text-decoration: underline;
	text-underline-offset: 2px;
}

.page-content a:not( [class*="b-"] ):visited { color: var( --zielen-700 ); }

/* ── D-75 D2 (B241 e, O-114) — menu desktopowe broni się przed `[type=button]:focus` z `reset.css`
   (tło `#c36` po zwykłym kliknięciu, bez `:focus-visible`). Goły `:focus` = wygląd `:hover`, jak panel (D-66d).
   Tabela 3 wariantów (4 strony × 1440/1200/1025, 492 elementy w `.bfoc`): V0 72 błędy · V1 `:focus` = `:hover`
   0 — PRZYJĘTY (precedens panelu) · V2 `:focus` = spoczynek 0. Waga (0,2,2) / (0,2,1) > (0,2,0). ── */
.b-menu > li > a:focus,
.b-menu > li > button:focus {
	background: var( --zielen-700 );
	border-bottom-color: var( --zielen-200 );
	color: var( --biel );
}

.b-podmenu a:focus,
.b-podmenu button:focus {
	background: var( --zielen-050 );
	color: var( --zielen-700 );
}

/* ── D-75 D6 (B259 b, O-110) — strona klasyczna (404, zaślepki bez siatki) kończy się odstępem sekcji,
   nie marginesem akapitu motywu. Zmierzone 2026-09-16 (`_build/pomiary/d75-2026-09-16/b259b-warianty.json`):
   stan zastany 14,39 px na 404 i dwóch zaślepkach wobec 96 / 64 / 48 px na `/aktualnosci/`; tabela 5 wariantów —
   sam padding daje 110,39 (padding + 14,4 marginesu ostatniego akapitu); padding + zerowy margines ostatniego
   dziecka `.page-content` — 0 błędów na 24 parach, regresja 5 zakładek zbiorczych 0 / 40. Waga (0,2,2) jak D-63a. ── */
body:not( [class*="elementor-page-"] ) main.site-main { padding-bottom: var( --s96 ); }
body:not( [class*="elementor-page-"] ) main.site-main .page-content > :last-child { margin-bottom: 0; }

@media (max-width: 1200px) {

	body:not( [class*="elementor-page-"] ) main.site-main { padding-bottom: var( --s64 ); }
}

@media (max-width: 767px) {

	body:not( [class*="elementor-page-"] ) main.site-main { padding-bottom: var( --s48 ); }
}

/* ── D-75 D3+D4 (B257, O-47, K11) — skok do celu liczony od REALNEJ przeszkody nagłówka: `--b-przeszkoda`
   (wysokość + `top` + zasięg potomków) ustawia `bobrowice-a11y.js` z renderu i przelicza przy zmianie rozmiaru,
   skali tekstu i po wczytaniu fontów; cel ląduje 8 px pod przeszkodą, sidebar 24 px. Zapas bez JS = stan zastany
   (232 / 216 / 152 − 8). Tabela wariantów (`_build/pomiary/d75-2026-09-16/b257-warianty.json`; 6 stron × 7 szer.
   × 100/125/200 % = 126 kombinacji, 378 celów): V0 stan zastany 252 błędy · V1 czysty CSS (stałe per breakpoint)
   99 · V2 JS + CSS 59 — PRZYJĘTY; resztę stanowią wyłącznie skoki do `#content` przy `scrollY` 0 (strony nie da
   się przewinąć wyżej, a potomkowie nagłówka wystają 3–27 px poza jego pudełko — O-47). Przeszkoda przy 768/200 %
   = 244,61 px, wyższa niż na desktopie — stałej nie da się ustawić jednej na breakpoint. ── */
html { --b-przeszkoda-zapas: 224px; }

@media (max-width: 1200px) {

	html { --b-przeszkoda-zapas: 208px; }
}

@media (max-width: 767px) {

	html { --b-przeszkoda-zapas: 144px; }
}

/* 🔴 1.26.7 — odsunięcie idzie na CEL (`scroll-margin-top`), NIE na `html{scroll-padding-top}` (1.26.5–1.26.6).
   Zmierzone po wdrożeniu (`_build/pomiary/d75-2026-09-16/g8-diag.json`, `d75reg-panel.log`): `scroll-padding-top`
   obejmuje też fokus elementów PRZYKLEJONEGO nagłówka — po zamknięciu panelu fokus wraca na burgera, przeglądarka
   uznaje go za zasłonięty paddingiem i przewija stronę 1200 → 404 px (B246 G8 oblewał 6 / 6 na telefonach).
   Wariant „cel” (`g8-diag-w4.json`, `b257-wariant-scroll-margin.json`): G8 1200 = 1200, B257 0 / 378.
   Nagłówek i panel wyłączone z reguły — ich elementy nigdy nie chowają się pod nagłówkiem. Klasy globalne
   8508/8509 niosą własne 232 / 216 / 152 px o wadze (0,2,0) — stąd jawna reguła (0,2,1) z tą samą wartością. */
body :not( header.elementor-location-header, header.elementor-location-header *, .b-oc, .b-oc * ) {
	scroll-margin-top: calc( var( --b-przeszkoda, var( --b-przeszkoda-zapas ) ) + 8px );
}

body .elementor .b-str__sekcja,
body .elementor .b-h2--strona { scroll-margin-top: calc( var( --b-przeszkoda, var( --b-przeszkoda-zapas ) ) + 8px ); }

/* ── D-75 D5 (B258, O-109) — brak przewijania poziomego do 200 % tekstu. Tabela wariantów
   (`_build/pomiary/d75-2026-09-16/b258-warianty.json`, `b258-v5e.json`; 6 stron O-109 × 320/360/390/1440 ×
   100/125/200 % = 72 kombinacje, regresja: prostokąty 2 957 elementów tekstowych przy 100 %): V0 29 / 72 ·
   `hyphens` sam 29 · `overflow-wrap` na rodzinach 20 · `body{overflow-wrap:anywhere}` 13, ale 1 189 zmian
   geometrii przy 100 % (min-content w siatkach) — ODRZUCONE · **V5e 0 / 72, regresja 204 — PRZYJĘTY**; te 204
   zmiany to wyłącznie Informator (68 elementów × 3 szer. telefonu): „Urząd Gminy Bobrowice” w `.b-fakt__wartosc`
   wystawał z pudełka już przy 100 % i teraz się łamie.
   ⚠ Chromium 151/152 NIE dzieli polskich wyrazów przy `hyphens:auto` i `lang="pl-PL"` (sonda: angielski dzieli,
   polski nie) — `hyphens` zostaje dla przeglądarek ze słownikiem, łamanie zapewnia `overflow-wrap`.
   ⚠ Jedna deklaracja ODWRACA wcześniejszą regułę tego arkusza: `#b-stopka .b-stopka__godziny-dd` (było `nowrap` —
   przy 320/200 % zakres godzin łamie się przy półpauzie, nie wewnątrz godziny).
   ⚠ 1.26.6: `white-space: normal` na pozycjach menu (1.26.5) WYCOFANE — przy 200 % menu łamało się na dwa wiersze
   i podnosiło przyklejony nagłówek 240 → 288 px (1440). Zamiast tego `nowrap` zostaje, a `bobrowice-menu.js`
   przelicza zwijanie (B122) przy KAŻDEJ zmianie `html{font-size}` — menu zwija się do burgera (1440/200 %: 172 px).
   Tabela: `b257b-naglowek-warianty.json` (VB 0 przewijań; VC bez ponownego pomiaru — 12 kombinacji z przewijaniem). ── */
[data-elementor-type]:not( [data-elementor-type="header"] ):not( [data-elementor-type="footer"] ),
.site-main {
	-webkit-hyphens: auto;
	hyphens: auto;
}

body { overflow-wrap: break-word; }

.b-widok__grupa { flex-wrap: wrap; }

#b-stopka .b-stopka__godziny-dd { white-space: normal; }

@media (max-width: 767px) {

	body .elementor .b-cta { grid-template-columns: repeat( auto-fit, minmax( min( 100%, 7.5rem ), 1fr ) ); }
}

/* ── D-75 D3+D4 dokończenie (B257, O-47) — nagłówek OBEJMUJE swoje dzieci. `.elementor .b-head__wrap` (klasy
   globalne) ma sztywne `height` 95 / 80 / 64 px, a dwa opakowania shortcode'ów (burger, pasek po prawej) niosą
   domyślny padding atomic 10 px: dzieci 68 px na telefonie przy 100 % i do 92 px przy 200 % wystawały 1–27 px
   poza przyklejony nagłówek i ZAKRYWAŁY treść na szczycie strony — zmierzone: zdjęcie hero na `/` i tekst H1 na 404
   w 15 z 126 kombinacji (`_build/pomiary/d75-2026-09-16/b257-szczyt.json`). Tabela wariantów
   (`b257b-naglowek-warianty.json`, 6 stron × 7 szer. × 100/125/200 %): V0 zasięg 66 / zakrycie 15 · VA (ten blok)
   0 / 0 · VB = VA + menu `nowrap` z ponownym pomiarem — 0 / 0, 0 przewijań, przy 100 % jedyna zmiana to przeszkoda
   telefonu 124 → 121 (znikają 3 px O-47) — PRZYJĘTY. `min-height` = dotychczasowa wysokość, więc przy 100 %
   nagłówek się nie zmienia; rośnie tylko, gdy treść naprawdę jest wyższa. Wagi (0,4,0) i (0,2,1) bez remisu
   z `.elementor .b-head__wrap` (0,2,0), ładowanym po tym arkuszu. ── */
.elementor .b-head__wrap > .e-div-block-base:not( .b-marka ) { padding: 0; }

body .elementor .b-head__wrap {
	height: auto;
	min-height: 95px;
}

@media (max-width: 1200px) {

	body .elementor .b-head__wrap { min-height: 80px; }
}

@media (max-width: 767px) {

	body .elementor .b-head__wrap { min-height: 64px; }
}

/* ── Burger i ✕ — ikona rośnie razem z pismem (zgłoszenie Patryka 2026-09-16 — ikona burgera malała po A+, rosła po A−).
   Przyczyna (sonda `_build/pomiary/d75-2026-09-16/burger_skala_sonda.py`): pudełko `.b-burger` 48 × 48 z ramką 2 px (sekcja 5)
   dostawało `button{padding:.5rem 1rem}` z `reset.css` motywu — padding rośnie z rem, pudełko nie, a SVG 24 × 24 jako element
   flex ściskał się do content-boxu: ikona 16 px (A−) / 12 px (A, już połowa) / 4 px (A+) / 0 px (200 %).
   Tabela wariantów (`burger-warianty.json`; burger i ✕ × 390/360/320 × A− / A / A+ kliknięciem + 200 %): V0 27 błędów ·
   V1 padding 0 i ikona stała 24 px — 12 (burger 48 ≠ ✕ 44) · V2 ikona 1.5rem, pudełko 3rem — 0, ale przy 200 % burger 96 px
   i nagłówek 157 px · **V3 = V2 z limitem pudełka 64 px (wysokość nagłówka telefonu) i ikony 40 px — 0 błędów, PRZYJĘTY**:
   ikona 21 / 24 / 30 / 40 px, pudełko 44 / 48 / 60 / 64 px, przy 100 % nagłówek bez zmian, przy 200 % 133 px jak dotąd.
   ✕ dostaje tę samą ikonę co burger; pudełko ✕ przy 100 % zostaje 44 px z referencji (1.26.9). ── */
.b-burger,
.b-oc .b-oc__zamknij { padding: 0; }

.b-burger svg,
.b-oc .b-oc__zamknij svg {
	flex: none;
	width: 1.5rem;
	height: 1.5rem;
	max-width: 40px;
	max-height: 40px;
}

.b-burger {
	width: clamp( 44px, 3rem, 64px );
	height: clamp( 44px, 3rem, 64px );
}

/* 🔴 1.26.9: ✕ ma przy 100 % cel 44 × 44 z REFERENCJI (B246 R5, kontrakt 5) — w 1.26.8 zrównany z burgerem (48 px)
   i R5 oblał 3 / 154. Rośnie z pismem tak samo jak burger (2.75rem = 44 px przy 16 px), ikona identyczna.
   Regresja panelu PRZED wdrożeniem (`z_wariantem.py`, `pre1269-panel.log`): B238–B250 0 błędów, B246 0 / 154. */
.b-oc .b-oc__gora .b-oc__zamknij {
	width: clamp( 44px, 2.75rem, 64px );
	height: clamp( 44px, 2.75rem, 64px );
}

/* ── 1.27.0 (COS-327, 2026-09-16) — zgłoszenie Patryka po odbiorze L218: „brakuje odstępów przed i po nagłówkach”
   oraz „obramowanie zaznaczenia w wyszukiwarce” (O-58). Tabele wariantów: `_build/cos327s/b1-warianty/`
   (`n_r2.py`, `s_rh_r2.py`; wstrzyknięte do renderu, headed, kontrole negatywne oblewają).

   Nagłówki w treści stron prawnych (widget `html` w `.b-str__tresc`). Zastane: 8 px nad / 16 pod, czyli tyle, co
   między akapitami (14,4–16) — nagłówek nie odrywał się od poprzedniego tekstu. Rytm wzięty z treści wpisu
   (`#b-wpis-tresc` h2 40/16, h3 32/12), nie wymyślony. h3 bezpośrednio po h2 — 16 (VN w wersji bez tego wyjątku:
   7 błędów, „40 nad < 1,5 × 32 pod”). „Dokumenty do pobrania” i „Aktualności” na mapie witryny to `b-h2--strona`
   poza widgetem — zakres zawężony do tych dwóch miejsc: klasa globalna na 34 stronach informacyjnych zostaje
   (regresja 9 stron × 2 szerokości: 0 różnic). N3: 0 błędów na /dostepnosc/ i /mapa-witryny/ × 1440/1024/768/390. ── */
.b-str__tresc .elementor-widget-html h2 { margin: var( --s40 ) 0 var( --s16 ); }
.b-str__tresc .elementor-widget-html h3 { margin: var( --s32 ) 0 var( --s12 ); }
.b-str__tresc .elementor-widget-html :is( h2 + h3, h2 + section > h3:first-child, h2 + div > section:first-child > h3:first-child ) { margin-top: var( --s16 ); }
.b-str__tresc .elementor-widget-html h1 + *,
.b-str__tresc .elementor-widget-html > :is( h2, h3 ):first-child { margin-top: 0; }
.b-str__tresc .elementor-widget-html + .b-h2--strona { margin: var( --s40 ) 0 0; }
.b-str__tresc > p + #mapa-aktualnosci .b-h2--strona { margin-top: var( --s40 ); }
/* D-77 (1.27.2) — `/rodo/`: nagłówki sekcji wstawione między akapity i listy jednej sekcji, 40 nad / 16 pod jak w
   deklaracji. Sekcja ma `display: block`, marginesy się zapadają (24 zamiast 40 nie wystarcza). Zakres zmierzony na
   57 adresach: w stanie zastanym 0 trafień (`_build/cos327t/b-zakres-v2.json`, `b-warianty.json`). Waga (0,3,0), bo
   `base-desktop.css` Elementora ładuje się PO tym arkuszu i ma `.elementor .e-heading-base { margin: 0 }` (0,2,0) —
   przy (0,2,0) reguła przegrywała kolejnością (zmierzone z arkuszem podmienionym w post-6.css). */
.b-str__tresc .b-str__sekcja > * + .b-h2--strona { margin-block-start: var( --s40 ); }

/* O-58 — pierścień fokusu wyszukiwarki w nagłówku. Zastane (V0): prawy bok pierścienia pola 1,07 : 1 i nachodzi na
   przycisk o 2,67 px. 🔴 Sama przerwa pole ↔ przycisk NIE naprawia (2 / 4 / 6 / 8 / 12 px — FAIL 7 / 7 szerokości):
   pierścień pola zawsze przecina szare obramowanie 2 px samego formularza (1,07 : 1). Pierścień idzie więc na CAŁY
   formularz, a przycisk z fokusem dostaje dodatkowo biały pierścień wewnętrzny (8,61 : 1 na `--zielen-600`) —
   bez niego fokus pola i przycisku byłyby nie do odróżnienia (zmiana tła przycisku to tylko 1,27 : 1).
   VB2: pole (Tab i klik) i przycisk (Tab) — 0 błędów na 1025–1920, nagłówek bez zmian (R-H 28 / 28). ── */
.b-szukaj:has( .b-szukaj__pole:focus-visible ),
.b-szukaj:has( .b-szukaj__btn:focus-visible ) {
	outline: 3px solid var( --focus );
	outline-offset: 3px;
}
.b-szukaj .b-szukaj__pole:focus-visible { outline-style: none !important; }
.b-szukaj .b-szukaj__btn:focus-visible {
	outline-color: var( --biel ) !important;
	outline-offset: -6px !important;
}

/* Ta sama wada przycisku wyszukiwarki w panelu (V0: lewy bok 1,07 : 1 na szarym obramowaniu, 390 i 1024) —
   ten sam biały pierścień wewnętrzny; zweryfikowane pomiarem po wdrożeniu (`_build/cos327s/`). */
.b-oc .b-oc__szukaj button:focus-visible {
	outline-color: var( --biel ) !important;
	outline-offset: -6px !important;
}

/* ==========================================================================
   Strona wyników wyszukiwania `/?s=` — D-78 wariant A (COS-327, 2026-09-17)
   Markup: `includes/wyniki.php` (shortcode'y w szablonie 136 + filtr karty).
   Referencja warstwy kontekstu: `_build/prototyp/gmina-bobrowice-prototyp-wyniki-wyszukiwania-2026-09-17.html`;
   komponenty współdzielone (pasek wyniku, przełącznik, karta, paginacja) — carry-over archiwum D-25.
   Wagi (0,2,0)+: klasy globalne emitują `.elementor .b-…`, a `reset.css` motywu ma `input[type="search"]` (0,1,1).
   ========================================================================== */

/* ── Główka: H1 z frazą + licznik. Odstęp główka → pasek dziedziczy klasa `b-glowka` (jak Aktualności). ── */
.b-glowka.b-wynik-glowka { flex-direction: column; align-items: flex-start; gap: var( --s8 ); }
.b-wynik-glowka .b-wynik-tytul { margin: 0; overflow-wrap: anywhere; }
/* D-80 D2: nagłówek nie jest kontrolką — bez pierścienia przy fokusie programowym (`tabindex="-1"` zostaje na AJAX, etap 2).
   Blok 10 wyklucza `[tabindex="-1"]`, więc bez tej reguły przeglądarka rysuje własny obrys `auto` (zmierzone 2026-09-17). */
.b-wynik-glowka .b-wynik-tytul:focus { outline: none; }
.b-wynik-glowka .b-wynik-licznik { margin: 0; color: var( --grafit-700 ); }

/* ── Pasek wyniku: pole korekty frazy + przełącznik widoku (prototyp: space-between, odstęp 16). ── */
.b-wynik > .elementor-widget-shortcode:has( .b-wynik-pasek ) { flex: 1 1 100%; width: 100%; }
.b-wynik-pasek {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var( --s16 );
}

.b-wynik-pasek .b-szukaj-wynik,
.b-404 .b-szukaj-wynik {
	display: flex;
	align-items: stretch;
	max-width: 100%;
	border: 2px solid var( --linia-kontrolki );
	border-radius: 4px;
	background: var( --biel );
}

.b-szukaj-wynik .b-szukaj-wynik__pole {
	width: auto;
	min-width: 220px;
	min-height: 44px;
	margin: 0;
	padding: var( --s8 ) var( --s12 );
	border: 0;
	border-radius: 0;
	background: transparent;
	font-family: var( --font-tresc );
	font-size: 1rem;
	color: var( --grafit-900 );
}

.b-szukaj-wynik .b-szukaj-wynik__pole::placeholder { color: var( --grafit-500 ); opacity: 1; }

.b-szukaj-wynik .b-szukaj-wynik__btn,
.b-szukaj-wynik .b-szukaj-wynik__btn:hover,
.b-szukaj-wynik .b-szukaj-wynik__btn:focus {
	min-height: 44px;
	margin: 0;
	padding: 0 var( --s24 );
	border: 0;
	border-radius: 0;
	background: var( --zielen-700 );
	color: var( --biel );
	font-family: var( --font-tresc );
	font-size: 0.9375rem;
	font-weight: 600;
	cursor: pointer;
}

.b-szukaj-wynik .b-szukaj-wynik__btn:hover,
.b-szukaj-wynik .b-szukaj-wynik__btn:focus { background: var( --zielen-600 ); }

/* Pierścień na CAŁYM formularzu — ten sam mechanizm co O-58 / O-115 (pierścień pola przeciąłby obramowanie 2 px). */
.b-szukaj-wynik:has( .b-szukaj-wynik__pole:focus-visible ),
.b-szukaj-wynik:has( .b-szukaj-wynik__btn:focus-visible ) {
	outline: 3px solid var( --focus );
	outline-offset: 3px;
}
.b-szukaj-wynik .b-szukaj-wynik__pole:focus-visible { outline-style: none !important; }
.b-szukaj-wynik .b-szukaj-wynik__btn:focus-visible {
	outline-color: var( --biel ) !important;
	outline-offset: -6px !important;
}

/* ── Karta wyniku: etykieta typu jako TEKST (SC 1.4.1) + podświetlenie trafienia. ── */
.b-archiwum .b-karta__typ {
	display: inline-block;
	padding: var( --s4 ) var( --s8 );
	border: 1px solid var( --linia-kontrolki );
	border-radius: 4px;
	background: var( --biel );
	color: var( --grafit-700 );
	font-family: var( --font-tresc );
	font-size: 0.8125rem;
	line-height: 1.3;
}
.b-archiwum .b-karta__typ[data-typ="post"] {
	border-color: var( --zielen-200 );
	background: var( --zielen-050 );
	color: var( --zielen-700 );
}

/* Strona nie ma kategorii — atomowy znacznik renderuje się pusty i rysował samo tło pigułki. */
.b-archiwum .b-karta__meta .b-znacznik:empty { display: none; }

.b-archiwum mark { padding: 0; background: var( --zielen-100 ); color: inherit; }
/* Tryb kontrastu zeruje `--zielen-100` do bieli — trafienie niesie wtedy podkreślenie, nie znika. */
html[data-b-kontrast="1"] .b-archiwum mark { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 2px; }

/* ── Brak wyników / pusta fraza — w miejscu pętli. ── */
.b-archiwum .b-wynik-brak,
.b-archiwum .b-wynik-pusto {
	padding: var( --s24 );
	border: 1px solid var( --linia-dekor );
	border-radius: 8px;
	background: var( --zielen-050 );
}

.b-wynik-brak .b-wynik-brak__tytul {
	margin: 0 0 var( --s8 );
	font-family: var( --font-naglowki );
	font-size: 1.25rem;
	line-height: 1.3;
	color: var( --zielen-800 );
	overflow-wrap: anywhere;
}

.b-archiwum .b-wynik-brak p,
.b-archiwum .b-wynik-pusto p {
	margin: 0 0 var( --s16 );
	font-family: var( --font-tresc );
	font-size: 1rem;
	color: var( --grafit-700 );
	overflow-wrap: anywhere;
}

.b-archiwum .b-wynik-pomoc { margin-top: var( --s24 ); }
.b-wynik-pomoc .b-wynik-pomoc__tytul {
	margin: 0 0 var( --s8 );
	font-family: var( --font-tresc );
	font-size: 1rem;
	font-weight: 700;
	color: var( --zielen-800 );
}
.b-archiwum .b-wynik-pomoc ul { margin: 0; padding-left: var( --s24 ); }
.b-archiwum .b-wynik-pomoc li { margin: var( --s4 ) 0; font-family: var( --font-tresc ); font-size: 1rem; }
.b-archiwum .b-wynik-pomoc a { color: var( --zielen-700 ); text-decoration: underline; text-underline-offset: 3px; }

/* ≤ 1200 px pole o szerokości treści nie mieści się obok przełącznika (768: dwa rzędy, prototyp — jeden);
   formularz bierze resztę rzędu, a pole resztę formularza. */
@media ( max-width: 1200px ) {
	.b-wynik-pasek .b-szukaj-wynik { flex: 1 1 0; min-width: 0; }
	.b-szukaj-wynik .b-szukaj-wynik__pole { flex: 1 1 auto; min-width: 0; }
}

@media ( max-width: 767px ) {
	.b-wynik-pasek .b-szukaj-wynik { flex-wrap: wrap; width: 100%; }
	.b-szukaj-wynik .b-szukaj-wynik__pole { flex: 1 1 0; min-width: 0; }
}

/* ==== Strona 404 (COS-347) — reguły PRZENIESIONE programowo z referencji wiążącej

   `_build/prototyp/gmina-bobrowice-prototyp-404-2026-09-17.html` (kontrakt 5, AW 22: komponent w całości,
   razem z blokami @media). Wycięte skryptem `_build/cos347a/b1/wytnij_reguly_404.py`, nie przepisane ręcznie.
   ======================================================================== */

/* carry-over: na mobile szukajka wchodzi do panelu off-canvas (jak reszta serwisu), nie do nagłówka */

/* ==== STRONA 404 (przedmiot tej rundy) ==== */
.b-404{max-width:1200px;margin:0 auto;padding:var(--s96) var(--s24)}
.b-404__blok{max-width:720px}
/* §4b: treść wypełnia kontener; blok tekstowy ograniczony do czytelnej miary, reszta układu w tej samej kolumnie */
.b-404__kod{margin:0 0 var(--s8);font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  font-size:.875rem;color:var(--miedz-700)}
.b-404__tytul{font-family:"Lora",Georgia,serif;color:var(--zielen-800);font-size:2rem;line-height:1.2;margin:0 0 var(--s16)}
.b-404__lead{margin:0 0 var(--s8);font-size:1.125rem;color:var(--grafit-900)}
.b-404__pomoc{margin:0 0 var(--s32);color:var(--grafit-700)}
/* lista odnośników drogi powrotu */
.b-404__linki-nag{margin:0 0 var(--s12);font-size:1rem;font-weight:700;color:var(--zielen-800)}
.b-404__linki ul{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:var(--s8) var(--s24)}
.b-404__linki li{margin:0}
.b-404__linki a{display:inline-flex;align-items:center;min-height:44px;
  color:var(--zielen-700);text-decoration:none;border-bottom:2px solid transparent}
.b-404__linki a:hover{border-bottom-color:var(--zielen-500)}

@media(max-width:767px) {
	.b-404{padding:var(--s48) var(--s16)}
}

/* Pole 404 w kolumnie treści: prototyp użył wzorca nagłówka (`.b-szukaj`), którego arkusz chowa poniżej 1025 px
   i przy zwiniętym menu — dlatego 404 bierze box pola WYNIKÓW, a tu dostaje tylko szerokość w kolumnie. */
.b-404 .b-szukaj-wynik { width: 100%; max-width: 480px; margin: 0 0 var( --s32 ); }
.b-404 .b-szukaj-wynik .b-szukaj-wynik__pole { flex: 1 1 0; min-width: 0; }

/* D-87 · B289 — zaznaczenie tekstu w kolorze marki (STANDARD Design §6 pkt 5, detal brandowy).
   Tokeny, nie literały: w trybie wysokiego kontrastu zaznaczenie idzie za nadpisaniem zmiennych. */
::selection { background: var( --zielen-700 ); color: var( --biel ); }/* End custom CSS */