/* ============================================================
   AgroMarket — serwis plonek.pl
   ============================================================
   WZORCEM JEST STRONA GOSPODARSTWA, nie odwrotnie.

   Wartosci NIE sa wybrane tutaj. Sa przepisane z `lib/core/app_style.dart`
   (`AppStyle.light`) i z `lib/modules/farm/farm_page_screen.dart`. Gdy tam sie
   zmienia — tu trzeba zmienic recznie, bo przegladarka nie czyta Darta.

   Poprzednia wersja tego arkusza rozjechala sie z aplikacja w czterech miejscach
   i wszystkie w te sama strone: tlo biale zamiast `#F5F6F8`, promien 10 zamiast 12,
   pas 1080 zamiast 900, „BRAK CIENI" przy karcie, ktora w aplikacji cien ma.
   Stad wrazenie dwoch roznych produktow.
   ============================================================ */

:root {
  /* ---------- Tokeny `AppStyle.light` ---------- */
  --bg: #f5f6f8;        /* tlo EKRANU — ledwie szare, NIE biale */
  --surface: #ffffff;   /* karty i elementy listy */
  --line: #d9dce1;
  --text: #1f2328;
  --muted: #6b7280;

  --ok: #2e7d32;

  /* PALETA AKCENTOW — PRZEPISANA Z `kAccentPalette` w `lib/core/app_style.dart`.
     ZRODLEM PRAWDY JEST DART, bo tam zyje aplikacja. Tutaj sa te same wartosci,
     zeby strona statyczna miala z czego brac kolory bez pytania kogokolwiek.
     Zmiana odcienia wymaga poprawki w OBU miejscach — i dlatego stoi to
     wypisane wprost, a nie schowane pod jedna nazwa.
     (Trzecia kopia, w `js/gospodarstwa-pasek.js`, to dlug do splacenia:
     osiem barw wpisanych tam na sztywno.) */
  --akc-green: #2E7D32;
  --akc-blue: #1565C0;
  --akc-graphite: #374151;
  --akc-violet: #6A1B9A;
  --akc-amber: #B45309;
  --akc-green-soft: #6BA06E;
  --akc-blue-soft: #5C8AC4;
  --akc-graphite-soft: #5F6B7A;
  --akc-violet-soft: #8B72B8;
  --akc-honey-soft: #B8893A;
  --warn: #b45309;
  --danger: #c62828;
  --gold: #b8860b;

  /* ---------- Akcenty rol (`roleDefaultAccent`) ---------- */
  /* PASTELE, nie mocne barwy: `green_soft` / `blue_soft`. Mocna zielen i blekit
     zostaja w palecie dla plakietek stanow. */
  --rolnik: #6ba06e;
  --klient: #5c8ac4;
  --grafit: #5f6b7a;    /* panel i ekrany ustawien */
  --oferent: #8b72b8;   /* fiolet pastelowy */
  --sponsor: #b8893a;   /* miodowy pastelowy */

  /* MOCNE WARIANTY. Zadna rola ich nie nosi — sa dla plakietek stanow
     i dla stron, ktore maja krzyczec mocniej niz pastel. */
  --rolnik-mocny: #2e7d32;
  --klient-mocny: #1565c0;
  --grafit-mocny: #374151;
  --oferent-mocny: #6a1b9a;
  --sponsor-mocny: #b45309;

  /* Akcent STRONY. Domyslnie blekit klienta, bo serwis mowi do kupujacego.
     Generator nadpisuje go w `style` elementu `<html>` wartoscia `strony.akcent`
     — ta sama paleta co `farms.accent`. */
  --accent: var(--klient);
  /* `accentSoft` = akcent przy 10% krycia (`accent.withValues(alpha: 0.10)`). */
  --accent-soft: rgba(92, 138, 196, .10);          /* zapas dla starszych przegladarek */
  --accent-soft: color-mix(in srgb, var(--accent) 10%, transparent);

  /* ---------- Miary ---------- */
  --radius: 12px;       /* `BorderRadius.circular(12)` — tyle ma `Card` i `SlotCard` */
  --pas: 900px;         /* `_kSzerokoscPasa` — ten sam pas co strona gospodarstwa */

  /* ---------- Cienie ----------
     JEDYNE MIEJSCE, GDZIE WYGLAD JEST PRZEPISANY, A NIE ODZIEDZICZONY.
     W aplikacji cien karty pochodzi z widgetu `Card` i `farm_page_screen`
     zapisuje wprost, ze NIE odtwarza go liczbami, bo rozjechalby sie przy
     zmianie motywu. W CSS nie ma widgetu, wiec liczby sa nieuniknione.
     GEOMETRIA jest dziedziczona z cienia herbu (6/0,2 + 18/0,8), zmienia sie
     tylko krycie: karta ma byc miekka, herb ma odstawac od zdjecia. */
  --cien: 0 2px 6px rgba(0, 0, 0, .06), 0 8px 18px rgba(0, 0, 0, .04);
  --cien-herb: 0 2px 6px rgba(0, 0, 0, .28), 0 8px 18px rgba(0, 0, 0, .20);

  /* ---------- Welon nad zdjeciem ----------
     Strojony DWA RAZY (patrz `docs/style_guide.md` §3). Zanim zmienisz, sprawdz,
     czy nie wracasz do odrzuconych wartosci: 0.45/0.22 → 0.22/0.11 → 0.30/0.15. */
  --welon-gora: rgba(0, 0, 0, .30);
  --welon-dol: rgba(0, 0, 0, .15);
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font: 16px/1.6 -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
}

/* PAS 900 W ARKUSZU, NIE W STRONACH. Trzy pliki HTML mialy ten sam nadpisek
   w `<style>` z komentarzem „gdy uporzadkujemy arkusz, przeniesc regule tam".
   Przeniesione — te bloki mozna z nich usunac. */
.kontener { max-width: var(--pas); margin: 0 auto; padding: 0 24px; }

/* ---------- Gorny pasek ---------- */
header {
  border-bottom: 1px solid var(--line);
  position: sticky; top: 0; background: var(--surface); z-index: 10;
}
header .kontener { display: flex; align-items: center; gap: 16px; height: 88px; }
.logo { display: flex; align-items: center; text-decoration: none; }
/* PELNE logo (listek + napis). Zadajemy WYSOKOSC — znak nie jest kwadratowy
   (proporcja 1.47), wiec sztywne wymiary by go znieksztalcily. */
.logo img { height: 68px; width: auto; }
nav { margin-left: auto; display: flex; align-items: center; gap: 4px; }
nav a {
  color: var(--muted); text-decoration: none; padding: 8px 12px;
  border-radius: 8px; font-size: 14.5px;
}
nav a:hover { background: var(--bg); color: var(--text); }
/* ---------- Menu: szerokie kontra waskie ---------- */
/* Na szerokim ekranie widac liste, rozwijane menu jest schowane. Ponizej 720 px
   odwrotnie. `display: none` (nie `visibility`) wycina ukryta kopie takze z
   drzewa dostepnosci, wiec czytnik ekranu nie czyta pozycji dwa razy. */
.menu-szeroka { display: flex; align-items: center; gap: 4px; }
.menu-waska { display: none; }
/* HAMBURGER Z CSS, bez pliku ikony. Trzy kreski: gorna i dolna to
   pseudoelementy, srodkowa to tlo samego `span`. Po otwarciu skrajne obracaja
   sie w krzyzyk, srodkowa znika — stan widac bez patrzenia na panel. */
.menu-waska > summary {
  list-style: none; cursor: pointer;
  /* 44 px to minimum na palec — mniejszy przycisk trafia sie co druga probe. */
  width: 44px; min-height: 44px;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--line); border-radius: 8px;
  background: var(--surface); color: var(--muted);
}
.menu-waska > summary::-webkit-details-marker { display: none; }
.menu-waska > summary:hover { background: var(--bg); color: var(--text); }
.menu-waska .kreski, .menu-waska .kreski::before, .menu-waska .kreski::after {
  display: block; width: 22px; height: 2px; border-radius: 2px;
  background: currentColor; transition: transform .18s ease, opacity .18s ease;
}
.menu-waska .kreski { position: relative; }
.menu-waska .kreski::before, .menu-waska .kreski::after {
  content: ""; position: absolute; left: 0;
}
.menu-waska .kreski::before { top: -7px; }
.menu-waska .kreski::after  { top:  7px; }
.menu-waska[open] .kreski { background: transparent; }
.menu-waska[open] .kreski::before { transform: translateY(7px) rotate(45deg); }
.menu-waska[open] .kreski::after  { transform: translateY(-7px) rotate(-45deg); }
/* PANEL NAD TRESCIA, NIE W NIEJ. `header` jest sticky z `z-index: 10`, wiec bez
   wlasnego `z-index` i tla rozwiniete menu wjechaloby pod blok pod naglowkiem. */
.menu-panel {
  position: absolute; top: calc(100% + 6px); right: 0; left: 0;
  display: flex; flex-direction: column; gap: 2px;
  padding: 8px; z-index: 20;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--cien);
}
.menu-panel a { padding: 12px 14px; min-height: 44px; display: flex; align-items: center; }


/* ---------- Przyciski ---------- */
.btn {
  display: inline-block; padding: 10px 18px; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--surface); color: var(--text);
  text-decoration: none; font-size: 15px; font-weight: 600;
}
/* KOLOR JAWNIE W KAZDYM STANIE. `.btn:hover` zmienial samo tlo, wiec w
   kontekscie `.hero--zdjecie { color:#fff }` napis dziedziczyl biel i znikal na
   jasnym tle. Nie da sie tego zalatwic raz w `.btn` — hover musi powtorzyc
   kolor, inaczej dziedziczenie ma szanse wygrac. */
.btn:hover { background: var(--bg); color: var(--text); }
.btn-glowny,
.btn-glowny:hover { color: #fff; }
.btn-glowny { background: var(--accent); border-color: var(--accent); }
/* TLO, NIE FILTR. `filter: brightness()` przyciemnia CALY element razem z
   napisem — przy jasnym akcencie bialy tekst szedl w szarosc. */
.btn-glowny:hover { background: var(--accent); filter: brightness(.92); }

/* PRZYCISKI NA ZDJECIU. Bialy prostokat na fotografii wygryza dziure w kadrze,
   a przy jasnym akcencie `.btn-glowny` bywa nieczytelny. Tutaj: przezroczyste
   tlo z welonem i biala ramka — czytelne na dowolnym zdjeciu, w kazdym stanie. */
.hero--zdjecie .btn:not(.btn-glowny),
.blok.tekst--bialy .btn:not(.btn-glowny),
.kafel.tekst--bialy .btn:not(.btn-glowny) {
  background: rgba(0, 0, 0, .35);
  border-color: rgba(255, 255, 255, .75);
  color: #fff;
}
.hero--zdjecie .btn:not(.btn-glowny):hover,
.blok.tekst--bialy .btn:not(.btn-glowny):hover,
.kafel.tekst--bialy .btn:not(.btn-glowny):hover {
  background: rgba(0, 0, 0, .55);
  border-color: #fff;
  color: #fff;
}

/* ---------- Sekcje i typografia ---------- */
section { padding: 72px 0; }
h1 { font-size: 42px; line-height: 1.2; margin: 0 0 16px; letter-spacing: -.5px; }
h2 { font-size: 26px; margin: 0 0 8px; letter-spacing: -.3px; }
h3 { font-size: 17px; margin: 0 0 6px; }
.lead { font-size: 18px; color: var(--muted); margin: 0 0 28px; max-width: 62ch; }
/* 12 px to DOLNA GRANICA w calym projekcie — nizej nie schodzimy nigdzie. */
.podpis { color: var(--muted); font-size: 14.5px; margin: 0; }

/* ---------- Bloki CMS ----------
   Warstwa WYGLADU jest wspolna dla wszystkich typow blokow (`strona_bloki.styl`),
   dokladnie tak jak w bazie: tlo, szerokosc, odstepy. Dzieki temu nowy typ bloku
   nie wymaga nowych regul ukladu. */
.blok { padding: 72px 0; }
.blok--zwarty { padding: 40px 0; }
.blok--tlo-karty { background: var(--surface); }
.blok--linia-gora { border-top: 1px solid var(--line); }
.blok--pelna .kontener { max-width: none; }

/* Tla sekcji. Te same klucze co przy kafelku - jeden slownik dla obu miejsc. */
.blok.t--biale  { background: var(--surface); }
.blok.t--szare  { background: var(--bg); }
.blok.t--lekki  { background: var(--accent-soft); }
.blok.t--akcent { background: var(--accent); }
/* `ciemny` dochodzi z paleta wspolnego wybieraka (`pole_koloru.dart`). */
.blok.t--ciemny { background: #23282E; color: #fff; }

/* TLO SEKCJI Z PALETY PROJEKTU. Cztery reguly wyzej biora barwe ZE STRONY
   (`--accent`, `--surface`), wiec chodza za motywem; te sa wpisane na stale
   i dlatego stoja osobno. Nazwy MUSZA zgadzac sie z `kAccentPalette` w Dart —
   panel zapisuje sam klucz (`green_soft`), a generator sklada z niego `t--`. */
.blok.t--green         { background: var(--akc-green); }
.blok.t--blue          { background: var(--akc-blue); }
.blok.t--graphite      { background: var(--akc-graphite); }
.blok.t--violet        { background: var(--akc-violet); }
.blok.t--amber         { background: var(--akc-amber); }
.blok.t--green_soft    { background: var(--akc-green-soft); }
.blok.t--blue_soft     { background: var(--akc-blue-soft); }
.blok.t--graphite_soft { background: var(--akc-graphite-soft); }
.blok.t--violet_soft   { background: var(--akc-violet-soft); }
.blok.t--honey_soft    { background: var(--akc-honey-soft); }

/* Zdjecie w tle SEKCJI. Welon obowiazkowy z tego samego powodu co w naglowku:
   bez niego czytelnosc zalezy od tego, co akurat jest w kadrze.
   `background-position` steruje kadrem w pionie - patrz `styl.kadr`. */
.blok.blok--zdjecie { position: relative; background-size: cover; background-repeat: no-repeat; }
.blok.blok--zdjecie::before {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(to bottom, var(--welon-gora), var(--welon-dol));
}
.blok.blok--zdjecie > * { position: relative; }

/* BIEL NA STALE. Token `--text` jest ciemny i znika na akcencie albo zdjeciu.
   Ta sama zasada w naglowku, w kafelku i tutaj. */
.blok.tekst--bialy,
.blok.tekst--bialy h1,
.blok.tekst--bialy h2,
.blok.tekst--bialy h3,
.blok.tekst--bialy p,
.blok.tekst--bialy .lead,
.blok.tekst--bialy .podpis { color: #fff; }

/* ---------- Blok: naglowek ze zdjeciem (hero) ----------
   Dwa uklady, te same nazwy co `farms.page_layout`.
   `classic` — zdjecie jako tlo calej sekcji.
   `band`    — zdjecie jako pas, tresc pod nim. */
.hero { padding: 96px 0 80px; }
/* MODYFIKATORY ODSTEPOW MUSZA BYC PODANE RAZEM Z `.hero`. Sam `.blok--zwarty`
   ma te sama moc co `.hero`, a stoi wyzej w pliku, wiec przegrywal — naglowek
   ignorowal ustawienie „mniejsze odstepy". */
.hero.blok--zwarty { padding: 56px 0 44px; }
.hero .akcje { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 8px; }

.hero--zdjecie { position: relative; color: #fff; background: #000 center/cover no-repeat; }

/* OBRAZ NIERUCHOMY PRZY PRZEWIJANIU. Tresc jedzie, zdjecie stoi.
   `fixed` jest wzgledem OKNA, nie sekcji, wiec dziala tylko dla tla na calej
   szerokosci — i dlatego nie dajemy tego dla ukladu z pasem, gdzie obraz jest
   osobnym pudelkiem.
   Na telefonach `fixed` bywa ignorowane albo kosztuje plynnosc przewijania,
   dlatego na waskim ekranie wracamy do zwyklego. */
/* SEKCJA PRZYKLEJONA, NIE TLO PRZYPIETE DO OKNA.
   Dziala tak samo jak pasek naglowka: sekcja zostaje na gorze, a kolejne
   przewijaja sie ZA nia. `top` to wysokosc paska, zeby zdjecie stanelo pod nim,
   a nie schowalo sie za nim.
   DLACZEGO NIE `background-attachment: fixed`: tamto wymaga, zeby zdjecie bylo
   TLEM, a tlo nie umie wybrac pliku po szerokosci ekranu — wlaczenie tej opcji
   odbieralo telefonowi jego wariant. `sticky` dziala na zwyklym obrazie, wiec
   warianty zostaja.
   `z-index: 5` — nad trescia, ale POD paskiem naglowka (ten ma 10). */
.hero--nieruchome, .blok--nieruchome {
  position: sticky; top: 88px; z-index: 5;
}
/* WELON JEST OBOWIAZKOWY. Bez niego czytelnosc tytulu zalezy od tego, co akurat
   jest w kadrze. Jesli napisy zaczna gasnac — welon jest za slaby, NIE napisy
   za jasne (`style_guide.md` §3). */
.hero--zdjecie::before {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(to bottom, var(--welon-gora), var(--welon-dol));
}
/* WARSTWY NAGLOWKA ZE ZDJECIEM. Od dolu: zdjecie, welon, tresc.
   Zdjecie jest `<img>`, a nie tlem, zeby przegladarka mogla wybrac plik po
   szerokosci ekranu (`srcset`) — patrz `_fotoHero` w `serwis_html.dart`.
   Tlo CSS tego nie umie bez media queries, a te trzeba by generowac osobno
   dla kazdej sekcji. */
/* `<picture>` ZNIKA Z UKLADU. Jest tylko opakowaniem wybierajacym plik; gdyby
   tworzylo wlasne pudelko, `position: absolute` obrazu liczyloby sie wzgledem
   niego, a nie wzgledem sekcji. `display: contents` sprawia, ze w ukladzie
   zostaje samo dziecko. */
.hero-picture { display: contents; }
.hero-foto {
  position: absolute; inset: 0; z-index: 0;
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.hero--zdjecie::before { z-index: 1; }
.hero--zdjecie .kontener { position: relative; z-index: 2; }

/* PROPORCJA PUDELKA NAGLOWKA — po jednej na wariant.
   Warianty maja rozne ksztalty (2:1, 1,6:1, 1:1), wiec jedna wartosc dla
   wszystkich znaczyla, ze telefon dostaje kwadrat wpychany w pas.
   Progi 720 i 1000 to te same, ktorych uzywa `<picture>` w generatorze —
   obraz i pudelko MUSZA zmieniac sie w tym samym miejscu.
   BRAK ZMIENNEJ = `auto`, czyli brak proporcji: starsze bloki i te bez
   ustawionego „ile widac" wygladaja dokladnie jak dotad. */
.hero--zdjecie { aspect-ratio: var(--ar-k, auto); }

@media (max-width: 1000px) {
  .hero--zdjecie { aspect-ratio: var(--ar-t, var(--ar-k, auto)); }
}

@media (max-width: 720px) {
  .hero--zdjecie {
    aspect-ratio: var(--ar-m, var(--ar-k, auto));
    /* DOLNY PROG. Bez niego przy malym „ile widac" pas schodzi do kilkudziesieciu
       pikseli i naglowek przestaje byc naglowkiem — przy 28 procentach wychodzilo
       55 px. Rolnik ma ten sam mechanizm: wysokosc nigdy nie schodzi ponizej
       twardego minimum urzadzenia.
       Wlasna „minimalna wysokosc" z panelu idzie stylem WPROST w znaczniku, wiec
       wygrywa z ta regula — prog dziala tylko tam, gdzie nikt nic nie ustawil. */
    min-height: 160px;
  }
}
/* BIEL NA STALE, nie `--text`. Token jest ciemny w trybie jasnym i zniknalby
   na welonie. Biel to jedyna barwa czytelna na dowolnej fotografii. */
.hero--zdjecie h1,
.hero--zdjecie .lead,
.hero--zdjecie .podpis { color: #fff; }

/* `.zdjecie` JEST TERAZ `<img>`, nie pudelkiem z tlem: `object-fit` robi to, co
   robilo `center/cover`, a `srcset` dziala wylacznie dla obrazu w tresci.
   `aspect-ratio` zamiast sztywnej wysokosci — obraz przychodzi juz przyciety
   do 2:1, wiec pudelko ma sie do niego dopasowac, zamiast przycinac go drugi
   raz. Przy okazji znika osobna wysokosc dla telefonu: proporcja dziala sama. */
.hero--pas .zdjecie {
  display: block; width: 100%; object-fit: cover;
  aspect-ratio: 2 / 1; border-radius: var(--radius); overflow: hidden;
  background: var(--bg); border: 1px solid var(--line);
}

/* UKLAD Z HERBEM - ten sam co na stronach gospodarstw: pas zdjecia, a na jego
   krawedzi herb wystajacy nizej. Herb jest OBRAZEM, wiec dziala tak samo dla
   serwisu i dla rolnika. */
.hero--herb .zdjecie {
  display: block; width: 100%; height: 260px; object-fit: cover;
  border-radius: var(--radius); overflow: hidden;
  background: var(--bg); border: 1px solid var(--line);
}
/* GODLO TRZYMA SIE LEWEJ KRAWEDZI KOLUMNY TRESCI, nie krawedzi sekcji.
   `.kontener` ma `max-width: var(--pas)` i `padding: 0 24px`, wiec tresc
   zaczyna sie tam, gdzie konczy sie odstep do kolumny. Przy ukladach zwezonych
   (`band`, `herb`) sekcja i kolumna sa tym samym i wystarczalo 24 px. W ukladzie
   `classic` sekcja idzie na CALA szerokosc okna - godlo lgnelo wiec do krawedzi
   ekranu i stalo samo, kilkadziesiat pikseli od naglowka nad nim (02.08.2026).

   `max(24px, ...)` - na waskim ekranie, gdy okno jest wezsze niz kolumna,
   zostaje samo wypelnienie kontenera. */
.hero--herb .herb,
.hero--zdjecie .herb {
  margin-left: max(24px, calc((100% - var(--pas)) / 2 + 24px));
}
.hero--herb h1 { margin-top: 12px; }

/* Herb na kolku — kolo wystajace nad krawedz zdjecia. */
/* ROZMIAR GODLA STEROWANY ZMIENNA `--herb` (panel: „Rozmiar godla"), z domyslna
   wartoscia 96 px - czyli tym, co bylo wpisane na sztywno do 02.08.2026.

   WYSUNIECIE LICZONE ZE ZMIENNEJ, nie wpisane osobno: `margin-top` ma byc
   POLOWA rozmiaru, zeby kolko wystawalo nad pas dokladnie do polowy. Dwie
   niezalezne liczby rozjechalyby sie przy pierwszej zmianie - godlo rosloby,
   a jego polozenie zostawaloby przy dawnych 48 px. */
.herb {
  --herb: 96px;
  /* MARGINES WOKOL GRAFIKI, w procentach boku - nie w pikselach. Staly odstep
     ginalby przy godle 160 px i dominowal przy 48; procentowy wyglada tak samo
     w calym zakresie.

     `background-size` LICZONY, nie `cover`. `cover` wypelnia caly element
     i przycina nadmiar, wiec grafika zawsze dotykala krawedzi - powiekszenie
     kafelka powiekszalo obrazek razem z nim, zamiast zrobic wokol niego
     miejsce (zgloszone 02.08.2026). */
  --herb-margines: 10%;
  width: var(--herb); height: var(--herb); border-radius: 50%;
  background-color: var(--surface);
  background-repeat: no-repeat;
  background-position: center;
  background-size: calc(100% - 2 * var(--herb-margines))
                   calc(100% - 2 * var(--herb-margines));
  box-shadow: var(--cien-herb);
  margin-top: calc(var(--herb) / -2); position: relative;
}
/* KSZTALT TO TYLKO OPRAWA. O tym, czy plik ma wpalone okragle rogi, decyduje
   rodzaj przy wgrywaniu — kwadrat ustawiony przy pliku z okragla maska pokaze
   kolko na przezroczystym tle. */
.herb--kwadrat { border-radius: var(--radius); }

/* GODLO NAD PASEM. `.herb-pas` ma `z-index: 2`, a kolko stalo na `auto`, wiec
   przy polozeniu przy krawedzi pas je ZASLANIAL - widac bylo pol godla
   (zgloszone 02.08.2026). Trojka stawia je nad pasem, ale dalej pod trescia
   sekcji, ktora ma wiecej. */
.herb { z-index: 3; }

/* PAS Z GODLEM — PRZYKLEJONY DO DOLNEJ KRAWEDZI ZDJECIA, OD WEWNATRZ.
   Tak samo jak na stronie gospodarstwa: pas jest WEZSZY niz kolko, wiec godlo
   wystaje ponad i pod niego. Kolko lezy na srodku wysokosci pasa — przy pasie
   40 i kolku 60 wychodzi po 10 px z kazdej strony.
   Biel 0,5 i BEZ rozmycia; napis na takim pasie potrzebowalby poswiaty, ale
   tutaj stoi na nim samo godlo.
   `z-index: 2` — nad welonem sekcji, ktory ma 1. */
.herb-pas {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  height: 40px; display: flex; align-items: center; gap: 12px;
  padding: 0 16px;
  background: transparent;
}

/* TLO PASA NA `::before`, NIE NA SAMYM PASIE.
   Krycie ustawia sie suwakiem w panelu (`pasKrycie` -> `--pas-krycie`), a
   `opacity` na calym pasie przygasilaby TAKZE godlo i napisy, ktore na nim
   leza. Osobna warstwa pod spodem gasnie sama, a tresc zostaje wyrazna. */
.herb-pas::before {
  content: ''; position: absolute; inset: 0; z-index: 0;
  background: rgba(255, 255, 255, .5);
  opacity: var(--pas-krycie, 1);
}
.herb-pas > * { position: relative; z-index: 1; }

/* KOLOR PASA. Generator wypisuje `herb-pas--<klucz>` (`_pasHtml`), ale reguly
   NIE ISTNIALY — przelacznik „Kolor pasa" zapisywal wartosc, ktorej nikt nie
   czytal, i wygladalo to na zepsuty panel. Klucze te same co przy tle sekcji.

   PELNE KRYCIE, nie polprzezroczystosc: wybrana barwa ma byc ta barwa,
   a nie jej mieszanka ze zdjeciem pod spodem. Brak wyboru zostawia biel
   polprzezroczysta z reguly wyzej, czyli wyglad jak dotad. */
.herb-pas--biale::before { background: var(--surface); }
.herb-pas--szare::before { background: var(--bg); }
.herb-pas--lekki::before { background: var(--accent-soft); }
.herb-pas--akcent::before { background: var(--accent); }
.herb-pas--green::before { background: var(--akc-green); }
.herb-pas--blue::before { background: var(--akc-blue); }
.herb-pas--graphite::before { background: var(--akc-graphite); }
.herb-pas--violet::before { background: var(--akc-violet); }
.herb-pas--amber::before { background: var(--akc-amber); }
.herb-pas--green_soft::before { background: var(--akc-green-soft); }
.herb-pas--blue_soft::before { background: var(--akc-blue-soft); }
.herb-pas--graphite_soft::before { background: var(--akc-graphite-soft); }
.herb-pas--violet_soft::before { background: var(--akc-violet-soft); }
.herb-pas--honey_soft::before { background: var(--akc-honey-soft); }

/* KOLKO WIEKSZE NIZ PAS — i z cieniem, ktory odrywa je od zdjecia.
   DWIE WARSTWY CIENIA: bliska daje krawedz, rozlana glebie. Jedna warstwa albo
   znika na jasnym zdjeciu, albo wyglada jak brudna obwodka — ten sam zabieg
   co przy odznakach na kartach ofert.
   `overflow` nigdzie po drodze nie moze byc `hidden`, inaczej wystajaca czesc
   kolka zostanie obcieta. */
/* GODLO NA PASKU JEST MNIEJSZE, ale rozmiar dalej idzie ze zmiennej.
   Do 02.08.2026 stalo tu sztywne `60px`, ktore BILO regule `.herb` (waga 0,2,0
   przeciw 0,1,0) - wiec suwak „Rozmiar godla" nie mial czego zmienic i wygladal
   na zepsuty, podczas gdy wysokosc pasa obok dzialala.

   0.62 zamiast osobnej liczby: godlo na pasku ma byc mniejsze od tego nad
   krawedzia, ale MA ISC ZA USTAWIENIEM. Przy domyslnych 96 px daje to 60,
   czyli dokladnie tyle, co przedtem. */
.herb-pas .herb {
  width: calc(var(--herb) * 0.62);
  height: calc(var(--herb) * 0.62);
  flex: 0 0 calc(var(--herb) * 0.62);
  margin-top: 0;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .28), 0 8px 18px rgba(0, 0, 0, .20);
}

/* PUDELKO ZE ZDJECIEM w ukladach `band` i `herb`. Pas musi byc dzieckiem
   czegos, co ma `position: relative` — a `<img>` dzieci miec nie moze. */
.hero-foto-blok { position: relative; display: block; }

/* TRESC NA ZDJECIU W UKLADACH Z PASEM.
   `band` i `herb` mialy tytul, zdanie i przyciski POD obrazem. Warianty
   „-tresc" kłada je NA nim — ten sam efekt co `classic`, tylko w pudelku
   zamiast na calej sekcji.
   WELON JEST OBOWIAZKOWY, tak samo jak przy `classic`: bez niego czytelnosc
   tytulu zalezy od tego, co akurat jest w kadrze. */
.hero--tresc-na .hero-tresc {
  position: absolute; inset: 0; z-index: 1;
  display: flex; flex-direction: column; justify-content: flex-end;
  padding: 28px 24px;
  color: #fff;
  background: linear-gradient(to top, rgba(0, 0, 0, .58), rgba(0, 0, 0, .05));
}
.hero--tresc-na .hero-tresc h1,
.hero--tresc-na .hero-tresc .lead,
.hero--tresc-na .hero-tresc .podpis { color: #fff; }
/* Pas z godlem nad trescia — inaczej welon przykrylby kolko. */
.hero--tresc-na .herb-pas { z-index: 2; }
/* Przy tresci na zdjeciu pudelko musi byc wyzsze, inaczej napisy nie maja
   sie gdzie zmiescic i wychodza poza obraz. */
.hero--tresc-na.hero--pas .zdjecie { aspect-ratio: auto; min-height: 340px; }
.hero--tresc-na.hero--herb .zdjecie { height: 340px; }

/* WYLACZENIE ZAOKRAGLENIA pudelka ze zdjeciem. Bylo wpisane na stale. */
.hero--bez-rogu .zdjecie { border-radius: 0; }

/* ODSTEP OD PASKA Z LOGO — stopniami, jak odstepy sekcji. */
/* ODSTEP OD PASKA Z LOGO - NADPISUJE WYPELNIENIE SEKCJI, nie doklada marginesu.
   `.hero` ma `padding: 96px 0 80px`, wiec przy ukladach `band` i `herb` zdjecie
   stalo w pudelku pod tym wypelnieniem i „brak odstepu" zostawial pas 96 px.
   W `classic` fotografia zakrywa sekcje, wiec wypelnienia nie bylo widac i tam
   ustawienie wygladalo na dzialajace (zgloszone 02.08.2026).

   SPECYFICZNOSC 0,2,0 (`.hero.hero--gora-N`) - `.hero.blok--zwarty` ma tyle samo
   i stoi wyzej w pliku, wiec bez podwojnej klasy przegralibysmy z nim. */
.hero.hero--gora-0 { padding-top: 0; margin-top: 0; }
.hero.hero--gora-1 { padding-top: 32px; margin-top: 0; }
.hero.hero--gora-2 { padding-top: 64px; margin-top: 0; }
.hero.hero--gora-3 { padding-top: 96px; margin-top: 0; }

/* ---------- Mocno zaokraglony jeden naroznik ---------- */

@media (max-width: 720px) {
}

/* ---------- Blok: karty ---------- */
.karty { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.karta {
  border: 1px solid var(--line); border-radius: var(--radius);
  padding: 22px; background: var(--surface); box-shadow: var(--cien);
}
.karta .znak {
  width: 34px; height: 34px; border-radius: 8px; margin-bottom: 12px;
  display: flex; align-items: center; justify-content: center; font-size: 18px;
  background: var(--bg); border: 1px solid var(--line);
}
.karta p { margin: 0; color: var(--muted); font-size: 14.5px; }
/* Pasek roli — jedyny mocniejszy kolor na karcie. */
.karta.rolnik { border-top: 3px solid var(--rolnik); }
.karta.klient { border-top: 3px solid var(--klient); }

/* Stan uslugi. „wkrotce" jest WYCISZONE, „dostepne" niesie kolor — inaczej lista
   siedmiu uslug wygladalaby jak siedem gotowych.
   ZRODLO: `service_config` (stan/enabled), NIE tresc wpisana w CMS. */
.stan {
  display: inline-block; margin-left: 8px; padding: 2px 8px;
  border-radius: 999px; font-size: 12px; font-weight: 600;
  vertical-align: middle; letter-spacing: .2px;
  background: var(--bg); color: var(--muted); border: 1px solid var(--line);
}
.stan.dostepne {
  background: rgba(107, 160, 110, .14); color: #3f7a44;
  border-color: rgba(107, 160, 110, .45);
}

/* ---------- Blok: kafelki ----------
   WIERSZ, KTORY SIE ZAWIJA. Kazdy kafelek ma swoja szerokosc; gdy w wierszu
   zabraknie miejsca, nastepny schodzi nizej. Dokladnie „kazdy dodany zabiera
   miejsce kolejnemu" — bez zadnego zaznaczania i bez stanu niedozwolonego.

   `--luz` w `calc` musi zgadzac sie z `gap`, inaczej ostatni kafelek w wierszu
   nie miesci sie o kilka pikseli i spada nizej bez powodu. */
/* ---------- UNIWERSALNOSC: reguly globalne ---------- */
/* OBRAZ NIGDY SZERSZY OD KONTENERA. Pole `delta` to tekst bogaty — wstawiony
   tam obraz 1600 px na ekranie 390 px dawal poziomy pasek przewijania CALEJ
   strony, nie tylko bloku. `.logo img`, `.obrazy img` i `.kafel-obraz` mialy
   wlasne ograniczenia; wszystko poza nimi nie mialo zadnego. */
img, video, iframe, svg { max-width: 100%; }
img, video { height: auto; }
/* DLUGI ADRES MA SIE ZLAMAC, NIE ROZEPCHNAC. Pole „Adres profilu" w bloku
   odnosnikow i linki w tresci bogatej nie maja spacji, wiec bez tego rozpychaja
   kontener na waskim ekranie. `break-word` tylko gdy nie ma innego wyjscia. */
body { overflow-wrap: break-word; }
a { word-break: break-word; }
.kafelki { --luz: 16px; display: flex; flex-wrap: wrap; gap: var(--luz); }

.kafel { flex: 0 0 100%; min-width: 0; }
.kafel.k--1-1 { flex-basis: 100%; }
.kafel.k--3-4 { flex-basis: calc(75%     - var(--luz) * 0.25); }
.kafel.k--2-3 { flex-basis: calc(66.666% - var(--luz) * 0.34); }
.kafel.k--1-2 { flex-basis: calc(50%     - var(--luz) * 0.5); }
.kafel.k--1-3 { flex-basis: calc(33.333% - var(--luz) * 0.67); }
.kafel.k--1-4 { flex-basis: calc(25%     - var(--luz) * 0.75); }

/* Wyjatek, nie regula: dociagniecie do konca wiersza, gdy `1/3 + 1/3` ma
   wypelnic cala szerokosc zamiast zostawic dziure. */
.kafel.k--dociagnij { flex-grow: 1; }

/* KAFELEK ALBO PLASKI — osobno dla kazdego, wiec `1/3` moze byc kafelkiem
   obok plaskiego `2/3`. */
.kafel.k--kafelek {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--cien); padding: 22px;
  overflow: hidden;
}
.kafel.k--plaski { padding: 0; }

/* Tla kafelka. Klucze odpowiadaja liscie w panelu. */
.kafel.t--biale  { background: var(--surface); }
.kafel.t--szare  { background: var(--bg); }
.kafel.t--lekki  { background: var(--accent-soft); }
.kafel.t--akcent { background: var(--accent); }

/* PELNA PALETA JAKO TLO KAFELKA. Wszystkie dziesiec akcentow, tymi samymi
   nazwami co w Dart — dzieki temu wartosc zapisana w panelu znaczy to samo
   po obu stronach.
   Kazdy z tych kolorow jest na tyle ciemny, ze czarny tekst na nim nie czyta
   sie dobrze; biel dokladamy w generatorze razem z klasa tla, wiec nie trzeba
   pamietac o osobnym przelaczniku. */
.kafel.t--green { background: var(--akc-green); }
.kafel.t--blue { background: var(--akc-blue); }
.kafel.t--graphite { background: var(--akc-graphite); }
.kafel.t--violet { background: var(--akc-violet); }
.kafel.t--amber { background: var(--akc-amber); }
.kafel.t--green_soft { background: var(--akc-green-soft); }
.kafel.t--blue_soft { background: var(--akc-blue-soft); }
.kafel.t--graphite_soft { background: var(--akc-graphite-soft); }
.kafel.t--violet_soft { background: var(--akc-violet-soft); }
.kafel.t--honey_soft { background: var(--akc-honey-soft); }

/* Ta sama paleta dla kafli galerii — jedna lista kolorow, dwa miejsca uzycia. */
.obraz-kafel--green { background: var(--akc-green); color: #fff; }
.obraz-kafel--blue { background: var(--akc-blue); color: #fff; }
.obraz-kafel--graphite { background: var(--akc-graphite); color: #fff; }
.obraz-kafel--violet { background: var(--akc-violet); color: #fff; }
.obraz-kafel--amber { background: var(--akc-amber); color: #fff; }
.obraz-kafel--green_soft { background: var(--akc-green-soft); color: #fff; }
.obraz-kafel--blue_soft { background: var(--akc-blue-soft); color: #fff; }
.obraz-kafel--graphite_soft { background: var(--akc-graphite-soft); color: #fff; }
.obraz-kafel--violet_soft { background: var(--akc-violet-soft); color: #fff; }
.obraz-kafel--honey_soft { background: var(--akc-honey-soft); color: #fff; }

/* BIEL NA STALE, gdy pod spodem jest akcent albo zdjecie — `--text` jest ciemny
   i zniknalby. Ta sama zasada co w naglowku ze zdjeciem. */
.kafel.tekst--bialy,
.kafel.tekst--bialy h2,
.kafel.tekst--bialy h3,
.kafel.tekst--bialy p { color: #fff; }

/* Kafelek ze zdjeciem w tle: welon jest OBOWIAZKOWY, inaczej czytelnosc zalezy
   od tego, co akurat jest w kadrze. */
.kafel.k--zdjecie { position: relative; background-size: cover; background-position: center; }
.kafel.k--zdjecie::before {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  background: linear-gradient(to bottom, var(--welon-gora), var(--welon-dol));
}
.kafel.k--zdjecie > * { position: relative; }

.kafel .kafel-obraz {
  width: 100%; border-radius: var(--radius); display: block;
  object-fit: cover; margin-bottom: 12px;
}
.kafel h3 { font-size: 19px; margin: 0 0 8px; }
.kafel p { margin: 0 0 12px; color: var(--muted); font-size: 14.5px; }
.kafel .akcje { margin-top: 4px; }

/* ---------- Blok: wezwanie do dzialania ---------- */
.cta {
  background: var(--accent-soft); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 28px;
  display: flex; align-items: center; gap: 20px; flex-wrap: wrap;
}
.cta h2 { margin: 0; }
.cta .btn { margin-left: auto; }

/* ---------- Blok: odnosniki spolecznosciowe ----------
   PRZYCISKI Z NAZWA, NIE ZNAKI FIRMOWE. Logotypy to cudze znaki towarowe
   i wymagaja trzymania sie regul kazdej z platform osobno (rozmiar, odstepy,
   wersje kolorystyczne). Nazwa w przycisku niesie te sama informacje, nie starzeje
   sie przy zmianie logo i nie doklada plikow do serwisu.

   Barwa jest tylko obrysem i tekstem — pelne tlo w barwie platformy wygladaloby
   jak reklama, a to sa odnosniki do WLASNYCH profili. */
.linki { display: flex; flex-wrap: wrap; gap: 10px; }
.linki .btn { border-width: 1.5px; }
.link--facebook  { color: #1877f2; border-color: #1877f2; }
.link--youtube   { color: #c4302b; border-color: #c4302b; }
.link--instagram { color: #c13584; border-color: #c13584; }
.link--tiktok    { color: #1f2328; border-color: #1f2328; }
.link--x         { color: #1f2328; border-color: #1f2328; }
.link--linkedin  { color: #0a66c2; border-color: #0a66c2; }
.link--www       { color: var(--muted); border-color: var(--line); }

/* ---------- Blok: wideo ----------
   PROPORCJA 16:9 TRZYMANA PUDELKIEM, nie wysokoscia ramki. Ramka z wpisana
   wysokoscia zostawia czarne pasy na kazdej innej szerokosci ekranu. */
.wideo { position: relative; width: 100%; padding-top: 56.25%;
         border-radius: var(--radius); overflow: hidden; background: #000; }
.wideo iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.wideo-podpis { color: var(--muted); font-size: 13px; margin-top: 8px; }

/* ---------- Blok: pytania ---------- */
.faq details {
  border-bottom: 1px solid var(--line); padding: 14px 0;
}
.faq summary { cursor: pointer; font-weight: 600; font-size: 16px; }
.faq summary::marker { color: var(--muted); }
.faq p { color: var(--muted); margin: 10px 0 0; }

/* ---------- Blok: liczby ---------- */
.liczby { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.liczba { text-align: center; }
.liczba .wartosc { font-size: 34px; font-weight: 700; letter-spacing: -.5px; }
.liczba .opis { color: var(--muted); font-size: 14px; }

/* ---------- Blok: pasek gospodarstw (`gospodarstwa_publiczne`, sql/194) ----------
   NAZWY KLAS SA KONTRAKTEM z `js/gospodarstwa-pasek.js` — skrypt buduje ten
   kod sam. Zmiana nazwy tutaj psuje pasek bez sladu w zadnym tescie. */
.galeria { display: grid; gap: 16px; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); }

/* ---------- Blok: galeria obrazow ---------- */
.obrazy { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); }

/* KAFEL GALERII. Ramka i zaokraglenie przenosza sie z obrazu na kafel, bo to
   on jest teraz pozycja — obraz jest jego wypelnieniem, a napis i kolor leza
   na nim. Proporcja 1200:630 to ta sama, w ktorej kadruja sie obrazy galerii,
   wiec wszystkie kafle sa rowne niezaleznie od tego, co wgrano. */
.obraz-kafel {
  position: relative; display: block; overflow: hidden;
  aspect-ratio: 1200 / 630;
  border-radius: var(--radius); border: 1px solid var(--line);
  background: var(--surface);
  color: inherit; text-decoration: none;
}
.obraz-kafel img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}

/* KOLOR TLA. Widac go tam, gdzie nie siega obraz — i w calosci, gdy obrazu
   nie ma wcale. Wlasne nazwy, nie `t--` od kafelkow: tamte maja inne reguly
   i wspolna nazwa znaczylaby, ze zmiana w jednym miejscu rusza oba. */
.obraz-kafel--akcent { background: var(--accent); color: #fff; }
.obraz-kafel--ciemny { background: #23282e; color: #fff; }
.obraz-kafel--jasny { background: var(--bg); }

/* NAPIS NA DOLE, NA PRZYCIEMNIENIU. Bez niego bialy tekst gubi sie na jasnym
   zdjeciu — a jakie zdjecie tam trafi, nie wiadomo z gory. */
.obraz-tekst {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 10px 12px; color: #fff;
  background: linear-gradient(to top, rgba(0, 0, 0, .62), rgba(0, 0, 0, 0));
}
.obraz-tytul { font-size: 15px; font-weight: 700; line-height: 1.25; }
.obraz-podpis { font-size: 12.5px; margin-top: 2px; opacity: .9; }
/* Bez obrazu przyciemnienie nie ma czego przyciemniac, a na kolorowym kafelku
   wygladaloby jak plama. */
.obraz-kafel:not(:has(img)) .obraz-tekst { background: none; }

/* ---------- Galeria w wariancie „pasek" ---------- */
/* TYCH REGUL NIE BYLO. Wariant paska powstal razem z tasma gospodarstw, ale
   dostal tylko atrybuty `data-` dla skryptu — bez ukladu, bez szerokosci
   i bez zaczepow. Obrazy nie mialy sie od czego odbic, wiec przewijanie
   skokowe nie mialo w co trafiac. */
.pasek-poziomy {
  /* ILE KAFLI NARAZ. Szerokosc kafla WYNIKA z tej liczby, nie odwrotnie -
     dlatego w oknie miesci sie ich zawsze CALA liczba i zaden nie jest
     przyciety na krawedzi. Przy stalych 260 px ostatni zawsze wystawal, bo
     nikt nie zna z gory szerokosci okna czytelnika. */
  --odstep: 14px;
  /* MINIMUM 190, NIE 260. Przy 260 na typowym ekranie miescily sie DWA kafle
     zamiast czterech, ktore byly przed przejsciem na wzor bez progow - bo to
     minimum wygrywa z podzialem przez cztery i podnosi szerokosc. 190 pozwala
     zmiescic cztery przy okolo 830 px tasmy, a napis w kaflu jeszcze sie
     miesci (przy 148 zaczynal byc uciety). */
  --kafel-min: 190px;
  --kafel-max: 400px;
  /* PROBOWALEM `round()` 02.08.2026 I KAFLE ZNIKNELY - funkcja nie policzyla
     sie w tym ukladzie i cala szerokosc wyszla nieprawidlowa. Wracam do
     `clamp`, ktore dziala. CENA: ostatni widoczny kafel bywa przyciety
     o kilkadziesiat pikseli. */
  --slot: clamp(
    var(--kafel-min),
    calc((100cqw - 3 * var(--odstep)) / 4),
    var(--kafel-max)
  );

  display: flex; gap: var(--odstep); overflow-x: auto;
  /* BEZ WYPELNIENIA PO BOKACH. `--slot` zawiera `100%`, a zmienne CSS licza sie
     W MIEJSCU UZYCIA, nie deklaracji: staly kafel bierze podstawe z ramki,
     tasma ze siebie. Dwa piksele wypelnienia rozjezdzaly te dwie liczby,
     a blad kumulowal sie przy kazdym kaflu. */
  padding: 4px 0 14px;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  scroll-behavior: smooth;
  grid-template-columns: none;
}
/* `100%` to szerokosc tasmy BEZ wypelnienia, wiec odejmujemy same odstepy
   MIEDZY kaflami: przy trzech kaflach sa dwa. */
.pasek-poziomy > * {
  flex: 0 0 var(--slot);
  scroll-snap-align: start;
}

/* ---------- Karuzela ----------
   TO TEN SAM PASEK, tylko o szerokosci jednego kafla. Obsluge gestow, strzalek,
   kropek i krancow robi `pasek.js` — osobny mechanizm znaczylby drugie miejsce
   do poprawiania przy kazdej usterce przewijania.

   Kafel wyzszy niz w pasku, bo jest jeden i ma byc na co patrzec. `min-height`
   zamiast stalej wysokosci: zdjecie pionowe nie ma byc przyciete do paska. */
/* KARUZELA TO JEDEN KAFEL NA CALA SZEROKOSC. */
.karuzela { --slot: 100cqw; }
.karuzela .obraz-kafel { aspect-ratio: 16 / 9; }
.karuzela .obraz-kafel img { object-fit: cover; }
@media (max-width: 720px) {
  .karuzela .obraz-kafel { aspect-ratio: 4 / 3; }
}

/* ---------- Powiekszanie obrazu (lupa.js) ----------
   Warstwa na cala strone, JEDNA dla wszystkich galerii. Wlaczana przelacznikiem
   w panelu (`data-lupa`), wiec strona bez galerii nic z tego nie rysuje. */
.obraz-kafel--lupa { cursor: zoom-in; }
.obraz-kafel--lupa:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 3px;
}

.lupa {
  position: fixed; inset: 0; z-index: 90;
  background: rgba(16, 18, 20, .92);
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
}
.lupa[hidden] { display: none; }

.lupa-scena {
  display: flex; flex-direction: column; align-items: center; gap: 12px;
  max-width: 100%; max-height: 100%;
}
.lupa-obraz {
  max-width: 100%; max-height: calc(100vh - 120px);
  object-fit: contain; border-radius: 6px;
  /* Bez animacji przy `prefers-reduced-motion` — patrz `lupa--bez-ruchu`. */
  animation: lupa-wejscie .18s ease;
}
.lupa--bez-ruchu .lupa-obraz { animation: none; }
@keyframes lupa-wejscie {
  from { opacity: 0; transform: scale(.98); }
  to   { opacity: 1; transform: none; }
}
.lupa-podpis {
  color: #f2f4f6; font-size: 14px; text-align: center;
  max-width: 70ch;
}
.lupa-podpis[hidden] { display: none; }

/* Przyciski warstwy: te same rozmiary co strzalki paska, zeby palec trafial
   tak samo pewnie w obu miejscach. */
.lupa-zamknij,
.lupa-strzalka {
  position: absolute; z-index: 91;
  width: 44px; height: 44px; border-radius: 50%; cursor: pointer;
  border: 1px solid rgba(255, 255, 255, .35);
  background: rgba(0, 0, 0, .45); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 24px; line-height: 1;
}
.lupa-zamknij:hover,
.lupa-strzalka:hover { background: rgba(0, 0, 0, .7); }
.lupa-zamknij:focus-visible,
.lupa-strzalka:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
.lupa-zamknij { top: 16px; right: 16px; font-size: 28px; }
.lupa-strzalka--lewo  { left: 16px;  top: calc(50% - 22px); }
.lupa-strzalka--prawo { right: 16px; top: calc(50% - 22px); }
.lupa-strzalka[hidden] { display: none; }

@media (max-width: 720px) {
  .lupa { padding: 12px; }
  .lupa-strzalka--lewo  { left: 6px; }
  .lupa-strzalka--prawo { right: 6px; }
}

/* ---------- Stopka ---------- */
footer {
  padding: 40px 0 64px; color: var(--muted); font-size: 14px;
  border-top: 1px solid var(--line); background: var(--surface);
}
/* SIATKA, NIE FLEX. Wczesniej stopka byla jednym rzedem linkow wysrodkowanym
   w pionie (`align-items: center`) — przy kolumnach o roznej wysokosci
   naglowki rozjezdzalyby sie wzgledem siebie. `auto-fit` + `minmax` zwija
   kolumny same, bez media query: cztery na desktopie, dwie na tablecie,
   jedna na telefonie. */
.stopka-glowna {
  display: grid; gap: 32px 24px; align-items: start;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
}
.fkol h2 {
  font-size: 15px; font-weight: 700; color: var(--text);
  margin: 0 0 12px; letter-spacing: .02em;
}
.fkol--marka .logo { margin-bottom: 12px; }
.fopis { margin: 0; max-width: 34ch; }
/* Cele dotykowe 44 px takze tutaj — stopka to nie mniej wazne linki, tylko
   mniej rzucajace sie w oczy. */
.fkol a { display: flex; align-items: center; min-height: 40px; }
.fkol--marka .logo { display: inline-flex; min-height: 0; }
/* Pozycja z ikona: ikona nie kurczy sie przy dlugim tekscie. */
.fp { gap: 10px; }
.ikona { width: 18px; height: 18px; flex: 0 0 18px; color: var(--accent); }
/* NAWIGACJA W DWOCH KOLUMNACH, gdy jest miejsce. Naglowek na calej szerokosci,
   zeby nie siedzial nad jedna z kolumn. */
@media (min-width: 721px) {
  .fkol--naw { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; }
  .fkol--naw h2 { grid-column: 1 / -1; }
}
/* PASEK PRAW: osobny wiersz pod kolumnami, oddzielony linia. */
.stopka-dol {
  display: flex; justify-content: center; flex-wrap: wrap; gap: 8px;
  margin-top: 32px; padding-top: 20px; border-top: 1px solid var(--line);
}
footer a { color: var(--muted); text-decoration: none; }
footer a:hover { color: var(--text); text-decoration: underline; }
footer .prawa { margin-left: auto; }

/* ---------- Telefon ---------- */
/* TABLET I WASKI DESKTOP. Wczesniej byl JEDEN breakpoint (720 px), wiec 820 px
   dostawalo uklad desktopowy: kafelek 1/4 wychodzil tam ~181 px, a przy 721 px
   ~156 px — na naglowek 19 px, akapit i przycisk to za malo. Tu 1/4 i 1/3 ida na
   polowe, 3/4 i 2/3 na cala szerokosc. */
@media (min-width: 721px) and (max-width: 1000px) {
  .kafel.k--1-4, .kafel.k--1-3 { flex-basis: calc(50% - var(--luz) * 0.5); }
  .kafel.k--3-4, .kafel.k--2-3 { flex-basis: 100%; }
}
/* ---------- Odstepy sekcji w stopniach ---------- */
/* CZTERY STOPNIE ZAMIAST DOWOLNEJ LICZBY. Stopien 1 = dotychczasowe 72 px, wiec
   blok bez ustawienia nie zmienia sie o piksel. Stopien 0 odpowiada dawnemu
   przelacznikowi "mniejsze odstepy". Nadpisujemy `padding` z `section`, dlatego
   te reguly musza lezec PO nim. */
.blok--od-0 { padding-top: 36px;  padding-bottom: 36px; }
.blok--od-1 { padding-top: 72px;  padding-bottom: 72px; }
.blok--od-2 { padding-top: 104px; padding-bottom: 104px; }
.blok--od-3 { padding-top: 144px; padding-bottom: 144px; }
/* ODSTEP POD ZDANIEM WPROWADZAJACYM. Domyslne 28 px zostaje w `.lead`, wiec tu
   sa tylko dwa odchylenia - brak klasy znaczy "standardowo".

   DRUGA PARA REGUL JEST DLA BLOKOW BEZ ZDANIA WPROWADZAJACEGO. Wczesniej
   ustawienie dzialalo WYLACZNIE przez `.lead`, wiec blok z samym naglowkiem
   ignorowal je po cichu: w panelu suwak sie ruszal, na stronie nie zmienialo
   sie nic. Naglowek bez `lead` dostaje klase `bez-lead` od generatora
   (`_naglowekSekcji` w `serwis_html.dart`) - przegladarka nie musi zgadywac,
   co po nim nastepuje. */
.blok--nag-0 .lead { margin-bottom: 12px; }
.blok--nag-2 .lead { margin-bottom: 48px; }
.blok--nag-0 h2.bez-lead { margin-bottom: 12px; }
.blok--nag-2 h2.bez-lead { margin-bottom: 48px; }

@media (max-width: 720px) {
  /* NA TELEFONIE WSZYSTKIE STOPNIE ZJEZDZAJA PROPORCJONALNIE. "Bardzo duze"
     liczone dla monitora daje na 390 px pol ekranu pustki i wyglada na blad
     skladu, a nie na decyzje. */
  .blok--od-0 { padding-top: 28px; padding-bottom: 28px; }
  .blok--od-1 { padding-top: 48px; padding-bottom: 48px; }
  .blok--od-2 { padding-top: 64px; padding-bottom: 64px; }
  .blok--od-3 { padding-top: 84px; padding-bottom: 84px; }
}

@media (max-width: 720px) {
  h1 { font-size: 32px; }
  section, .blok { padding: 48px 0; }
  .hero { padding: 56px 0 44px; }
  /* `.hero--pas .zdjecie` — wysokosc wynika z `aspect-ratio`, nadpisanie zbedne. */
  .hero--herb .zdjecie { height: 180px; }
  /* Na telefonie pasek naglowka ma 72 px, wiec przyklejona sekcja startuje
     nizej. `sticky` — inaczej niz dawne `fixed` — telefony obsluguja normalnie
     i nie kosztuje to plynnosci przewijania. */
  .hero--nieruchome, .blok--nieruchome { top: 72px; }
  .cta .btn { margin-left: 0; }
  /* NA WASKIM EKRANIE KAZDY KAFELEK ZAJMUJE CALA SZEROKOSC. Trzy kolumny po
     100 px to nie uklad, tylko trzy paski nieczytelnego tekstu. */
  .kafel, .kafel.k--3-4, .kafel.k--2-3, .kafel.k--1-2,
  .kafel.k--1-3, .kafel.k--1-4 { flex-basis: 100%; }
  /* MENU POD PRZYCISKIEM, NIE UKRYTE. Wczesniej bylo tu `nav a:not(.btn)
     { display: none }` — z telefonu nie dalo sie dojsc do zadnej strony poza
     aplikacja. Teraz pozycje sa w rozwijanym `details`, bez JS-u. */
  .menu-szeroka { display: none; }
  .menu-waska { display: block; }
  /* Kotwica dla `position: absolute` panelu. */
  header .kontener { position: relative; }
  nav { gap: 8px; }
  /* Ciasno na 390 px: padding kafelka i cta zjadaly zbyt duzo z 342 px. */
  .kafel.k--kafelek { padding: 16px; }
  .cta { padding: 20px; }
  /* TRZY ELEMENTY W WIERSZU 342 px: logo, hamburger i przycisk aplikacji.
     Wzor pokazywal tylko logo i hamburger, ale zejscia do apki nie chowamy
     (MENU_BEZ_APLIKACJI, sql/199) — zamiast tego scieramy je na wadze. */
  .logo img { height: 56px; }
  header .kontener { height: 72px; }
  nav .btn { padding: 10px 12px; font-size: 14px; white-space: nowrap; }
}

/* ---------- Pasek gospodarstw: warianty ---------- */
/* PASEK GOSPODARSTW — styl przeniesiony TUTAJ z `js/gospodarstwa-pasek.js`.
   Skrypt wstrzykiwal go do `<head>`, przez co zaokraglenie i cien trzeba bylo
   zmieniac w kodzie zachowania. Teraz skrypt odpowiada za ZACHOWANIE, a wyglad
   jest tam, gdzie reszta wygladu. Selektory po `#pasek-gospodarstw` zostaja bez
   zmian: to kontrakt z generatorem, ktorego zaden test nie pilnuje. */
.pasek-ramka { position: relative; }
#pasek-gospodarstw {
  /* TEN SAM WZOR CO PRZY STALYM KAFLU - patrz `.pasek-ramka--stale`.
     Powtorzony, bo pasek gospodarstw bywa TAKZE bez stalych kafli i wtedy
     nie dziedziczy niczego od tamtej klasy. */
  --odstep: 14px;
  /* MINIMUM 190, NIE 260. Przy 260 na typowym ekranie miescily sie DWA kafle
     zamiast czterech, ktore byly przed przejsciem na wzor bez progow - bo to
     minimum wygrywa z podzialem przez cztery i podnosi szerokosc. 190 pozwala
     zmiescic cztery przy okolo 830 px tasmy, a napis w kaflu jeszcze sie
     miesci (przy 148 zaczynal byc uciety). */
  --kafel-min: 190px;
  --kafel-max: 400px;
  /* PROBOWALEM `round()` 02.08.2026 I KAFLE ZNIKNELY - funkcja nie policzyla
     sie w tym ukladzie i cala szerokosc wyszla nieprawidlowa. Wracam do
     `clamp`, ktore dziala. CENA: ostatni widoczny kafel bywa przyciety
     o kilkadziesiat pikseli. */
  --slot: clamp(
    var(--kafel-min),
    calc((100cqw - 3 * var(--odstep)) / 4),
    var(--kafel-max)
  );
  display: flex; gap: var(--odstep); overflow-x: auto; padding: 4px 0 14px;
  scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
  /* SUWAK UKRYTY, nie cienki. Tasma przewija sie palcem, strzalkami i kropkami,
     wiec pasek przewijania niczego nie dodaje — a widoczny pod kafelkami
     wyglada jak niedokonczone okno przegladarki.
     PRZEWIJANIE ZOSTAJE, znika sam pasek. */
  scroll-behavior: smooth; scrollbar-width: none; -ms-overflow-style: none;
}
/* Ta sama regula dla galerii w wariancie „pasek" — jeden mechanizm, jeden
   wyglad. Wczesniej byla tu tylko tasma gospodarstw. */
#pasek-gospodarstw::-webkit-scrollbar,
.pasek-poziomy::-webkit-scrollbar { display: none; }
.pasek-poziomy { scrollbar-width: none; -ms-overflow-style: none; }
.gosp-kafel {
  /* SZEROKOSC ZE SLOTU, nie stale 260 px. `100%` liczy sie tu od TASMY, a ta
     nie ma juz wypelnienia bocznego, wiec podstawa jest ta sama co u stalego
     kafla liczonego od ramki. */
  flex: 0 0 var(--slot);
  scroll-snap-align: start; position: relative;
  height: 150px; overflow: hidden; text-decoration: none;
  background-size: cover; background-position: center;
  transition: transform .15s ease, box-shadow .15s ease;
}
/* ZAOKRAGLENIE I CIEN JAKO OSOBNE KLASY, nie na stale. Panel wlacza je
   przelacznikiem, tak samo jak `k--kafelek` przy kafelkach. */
/* ZAOKRAGLENIE I CIEN DOTYCZA OBU RODZIN KAFLI. Wczesniej celowaly wylacznie
   w `.gosp-kafel`, wiec w galerii przelaczniki „zaokraglone narozniki"
   i „cien" nie robily nic — a w panelu wygladaly na wlaczone. */
/* ZAOKRAGLENIE I CIEN KAFLI GALERII - dzialaja w OBU ukladach.
   Klasy `obrazy--rog` i `obrazy--cien` wypisuje generator; `pasek--*` nizej
   doklada `pasek.js` i zostaja dla paska gospodarstw, ktory nie ma bloku
   w edytorze. Efekt ten sam, wiec jedno nie przeszkadza drugiemu.

   BEZ PRZELACZNIKA KAFEL JEST PROSTOKATNY. Wczesniej `.obraz-kafel` mial
   zaokraglenie wpisane na stale, wiec przelacznik nie mial czego wlaczac.
   Galerie zapisane wczesniej beda po tej zmianie proste do czasu wlaczenia
   przelacznika - i to jest jedyne miejsce, w ktorym ta zmiana cos przestawia. */
.obrazy .obraz-kafel { border-radius: 0; }
.obrazy--rog .obraz-kafel { border-radius: 14px; }
.obrazy--cien .obraz-kafel {
  box-shadow: 0 1px 3px rgba(0,0,0,.12), 0 4px 12px rgba(0,0,0,.08);
}

.pasek--rog .gosp-kafel,
.pasek--rog .obraz-kafel { border-radius: 14px; }
.pasek--cien .obraz-kafel,
.pasek--cien .gosp-kafel {
  box-shadow: 0 1px 3px rgba(0,0,0,.12), 0 4px 12px rgba(0,0,0,.08);
}
.pasek--cien .gosp-kafel:hover {
  transform: translateY(-2px);
  box-shadow: 0 2px 6px rgba(0,0,0,.16), 0 8px 20px rgba(0,0,0,.12);
}
.gosp-pas {
  position: absolute; left: 0; right: 0; bottom: 0; display: flex;
  align-items: center; gap: 10px; padding: 8px 10px;
  background: rgba(255,255,255,.88); backdrop-filter: blur(6px);
}
.gosp-herb {
  width: 34px; height: 34px; border-radius: 50%; flex: 0 0 34px;
  background: #fff center/cover no-repeat; border: 1px solid rgba(0,0,0,.08);
}
.gosp-tekst { min-width: 0; }
.gosp-nazwa {
  font-size: 14px; font-weight: 600; color: #1f2937;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.gosp-pod {
  font-size: 11.5px; color: #5b6470;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* STALE KAFELKI PO BOKACH PASKA.
   Leza NAD tasma, a gospodarstwa przewijaja sie pod nimi — stad `z-index`
   i wymog nieprzezroczystego tla.
   Wciecie tasmy jest rowne ich szerokosci, a `scroll-padding` przesuwa zaczepy
   o tyle samo: bez tego po puszczeniu palca kafel gospodarstwa dosuwalby sie
   POD staly i wygladalo by to na usterke. */
/* STRZALKA NAD STALYM KAFLEM. Kafel ma `z-index: 3`, a strzalki 2 — przy
   wcietej tasmie strzalka wypadala POD kafelkiem i wygladala na schowana.
   Teraz lezy na kaflu gospodarstwa, tam gdzie jest jej miejsce. */
.pasek-ramka--stale .pasek-strzalka { z-index: 4; }


/* SZEROKOSC STALEGO KAFLA WYNIKA Z LICZBY SLOTOW, nie ze stalych 190 px.
   Stale zajmuja RAZEM jeden slot: jeden - caly, dwa - po polowie. Dzieki temu
   rzad ma zawsze te sama szerokosc co przed ich dolozeniem (02.08.2026).
   `--slot` i `--odstep` sa te same co w `.pasek-poziomy`. */
/* SZEROKOSC KAFLA BEZ PROGOW (02.08.2026).
   Do teraz liczba kafli brala sie z czterech progow (1200/1000/720), a szerokosc
   z podzialu przez te liczbe. Kazdy nowy rozmiar ekranu znaczyl pytanie „ktory
   prog", a przy 950 px odpowiedz byla arbitralna.

   `clamp` odwraca zaleznosc: podajemy GRANICE KAFLA, a ile ich wejdzie, wynika
   z szerokosci samo.

   `cqw` ZAMIAST `%` - to jednostka KONTENERA, wiec liczy sie od ramki takze
   WEWNATRZ tasmy. Procent liczyl sie w miejscu uzycia: staly kafel bral podstawe
   z ramki, kafel tasmy z tasmy juz po wcieciu, i przy ramce 852 dawalo to
   148 px zamiast 203 (zmierzone). Jedna jednostka usuwa cala te klase bledow.

   CENA: przy niektorych szerokosciach ostatni widoczny kafel bywa przyciety.
   To jest zamierzone - mowi „jest wiecej", a `scroll-snap` dociaga go po
   pierwszym przesunieciu. */
.pasek-ramka { container-type: inline-size; }


.pasek-ramka--stale {
  --odstep: 14px;
  /* MINIMUM 190, NIE 260. Przy 260 na typowym ekranie miescily sie DWA kafle
     zamiast czterech, ktore byly przed przejsciem na wzor bez progow - bo to
     minimum wygrywa z podzialem przez cztery i podnosi szerokosc. 190 pozwala
     zmiescic cztery przy okolo 830 px tasmy, a napis w kaflu jeszcze sie
     miesci (przy 148 zaczynal byc uciety). */
  --kafel-min: 190px;
  --kafel-max: 400px;
  /* PROBOWALEM `round()` 02.08.2026 I KAFLE ZNIKNELY - funkcja nie policzyla
     sie w tym ukladzie i cala szerokosc wyszla nieprawidlowa. Wracam do
     `clamp`, ktore dziala. CENA: ostatni widoczny kafel bywa przyciety
     o kilkadziesiat pikseli. */
  --slot: clamp(
    var(--kafel-min),
    calc((100cqw - 3 * var(--odstep)) / 4),
    var(--kafel-max)
  );
}
/* (usuniete 02.08.2026 - progi zastapione wzorem `clamp`; patrz
   `.pasek-ramka--stale`)

/* DWA STALE DZIELA SLOT NA POL - razem z odstepem miedzy nimi i tasma. */
.pasek-ramka--stale-oba .pasek-staly {
  width: calc((var(--slot) - var(--odstep)) / 2);
}

.pasek-staly {
  /* SZEROKOSC TUTAJ, NIE W OSOBNEJ REGULE WYZEJ. Stala osobno, przed tym
     blokiem, o TEJ SAMEJ wadze - wiec blok ja przykrywal i szerokosc wracala
     do `auto`. Kafel miewal wtedy 32 px, czyli tyle, ile zajmowal napis
     (02.08.2026). Dwa selektory o rownej wadze rozstrzyga KOLEJNOSC w pliku,
     a ta jest najlatwiejsza do przeoczenia przy dopisywaniu regul. */
  width: var(--slot);
  /* WYSOKOSC DOKLADNIE TAKA JAK KAFLE GOSPODARSTW.
     Bylo `top: 0; bottom: 0`, czyli na cala wysokosc ramki — a w ramce mieszcza
     sie jeszcze dolne wypelnienie tasmy (14 px) i pasek kropek. Staly kafel byl
     przez to wyrazniej wyzszy od tych, ktore ma oprawiac.
     4 px to wypelnienie tasmy u gory (`#pasek-gospodarstw`), 150 px to wysokosc
     `.gosp-kafel`. Zmiana tamtej liczby wymaga zmiany i tutaj — dlatego stoi
     wypisana wprost, a nie schowana w `bottom`. */
  position: absolute; top: 4px; height: 150px; z-index: 3;
  padding: 16px;
  display: flex; flex-direction: column; justify-content: flex-end;
  border-radius: var(--radius); overflow: hidden;
  background: var(--surface) center/cover no-repeat;
  color: inherit; text-decoration: none;
}
.pasek-staly--lewa { left: 0; }
.pasek-staly--prawa { right: 0; }

/* KOLORY STALEGO KAFLA - pelna paleta, te same klucze co wszedzie.
   `powierzchnia` zostaje dla blokow zapisanych przed 02.08.2026. */
.pasek-staly--powierzchnia,
.pasek-staly--biale { background-color: var(--surface); }
.pasek-staly--szare { background-color: var(--bg); }
.pasek-staly--lekki { background-color: var(--accent-soft); }
.pasek-staly--akcent { background-color: var(--accent); color: #fff; }
.pasek-staly--ciemny { background-color: #23282e; color: #fff; }
.pasek-staly--green         { background-color: var(--akc-green); color: #fff; }
.pasek-staly--blue          { background-color: var(--akc-blue); color: #fff; }
.pasek-staly--graphite      { background-color: var(--akc-graphite); color: #fff; }
.pasek-staly--violet        { background-color: var(--akc-violet); color: #fff; }
.pasek-staly--amber         { background-color: var(--akc-amber); color: #fff; }
.pasek-staly--green_soft    { background-color: var(--akc-green-soft); color: #fff; }
.pasek-staly--blue_soft     { background-color: var(--akc-blue-soft); color: #fff; }
.pasek-staly--graphite_soft { background-color: var(--akc-graphite-soft); color: #fff; }
.pasek-staly--violet_soft   { background-color: var(--akc-violet-soft); color: #fff; }
.pasek-staly--honey_soft    { background-color: var(--akc-honey-soft); color: #fff; }
.pasek-staly--cien { box-shadow: 0 6px 20px rgba(0, 0, 0, .18); }

.pasek-staly-ikona {
  width: 44px; height: 44px; border-radius: 10px; flex: 0 0 44px;
  background: center/contain no-repeat;
  margin-bottom: 10px;
}
.pasek-staly-tresc { min-width: 0; }
.pasek-staly-tytul { font-size: 17px; font-weight: 700; line-height: 1.25; }
.pasek-staly-opis { font-size: 13px; margin-top: 6px; opacity: .85; }

/* WCIECIE TASMY TYLKO TAM, GDZIE STOI KAFEL. Wciecie po pustej stronie
   zostawialo szeroki pas niczego i skracalo tasme bez powodu. */
/* MIEJSCE NA STALY KAFEL = WYPELNIENIE, NIE MARGINES.
   PROBOWALEM MARGINESU 02.08.2026 I BYLO GORZEJ. Zalozenie bylo takie, ze
   `padding` w kontenerze przewijanym pozwala kaflom wjechac pod staly kafel.
   Owszem pozwala - ale TYLKO przy przewinieciu, a `scroll-padding` i tak
   dociaga je do krawedzi. Za to `margin` ZWEZA TASME, podczas gdy stale kafle
   i strzalki sa pozycjonowane wzgledem RAMKI, ktora zostaje pelnej szerokosci.
   Skutek: staly kafel na tasmie, strzalka w srodku tasmy, drugi staly w pustce.
   Jedna naprawa, trzy nowe usterki.

   ZASADA: wszystko w tym pasku ma JEDNA podstawe - ramke. Wypelnienie trzyma
   tasme tej samej szerokosci co ramka, wiec `left`/`right` strzalek i stalych
   kafli licza sie z tego samego.

   Szerokosc ze `--slot`, nie wpisana liczba: przy stalych 204 px dolozenie
   drugiego kafla zwezalo pasek, bo wciecie i szerokosc byly niezalezne. */
.pasek-ramka--stale-lewo > #pasek-gospodarstw,
.pasek-ramka--stale-lewo > .pasek-poziomy {
  margin-left: calc(var(--slot) + var(--odstep));
}
.pasek-ramka--stale-prawo > #pasek-gospodarstw,
.pasek-ramka--stale-prawo > .pasek-poziomy {
  margin-right: calc(var(--slot) + var(--odstep));
}
.pasek-ramka--stale-oba.pasek-ramka--stale-lewo > #pasek-gospodarstw,
.pasek-ramka--stale-oba.pasek-ramka--stale-lewo > .pasek-poziomy {
  margin-left: calc((var(--slot) - var(--odstep)) / 2 + var(--odstep));
}
.pasek-ramka--stale-oba.pasek-ramka--stale-prawo > #pasek-gospodarstw,
.pasek-ramka--stale-oba.pasek-ramka--stale-prawo > .pasek-poziomy {
  margin-right: calc((var(--slot) - var(--odstep)) / 2 + var(--odstep));
}

/* PRZY DWOCH STALYCH OPIS ZNIKA - zostaje tytul i ikona. Polowa slotu to
   okolo 130 px na monitorze; dwuwierszowy opis sie tam nie miesci, a przyciety
   w polowie slowa wyglada na usterke. */
.pasek-ramka--stale-oba .pasek-staly-opis { display: none; }

@media (max-width: 720px) {
  /* NA TELEFONIE STALY KAFEL PRZESTAJE BYC KOLUMNA i staje sie PASEM na cala
     szerokosc: „lewa" trafia NAD tasme, „prawa" POD nia. Do 02.08.2026 znikaly
     tu zupelnie, bo dwie kolumny po 190 px zostawialyby gospodarstwu mniej niz
     polowe ekranu — pas lezy w innym wierszu, wiec tasmie nie zabiera nic.

     88 px, nie 150: dwa pasy po 150 plus tasma to okolo 480 px, czyli wiecej,
     niz widac bez przewijania. Kafel ma PROWADZIC do tresci, nie ja zaslaniac.

     `center top`, nie `center`: przy pasie 88 px srodek zdjecia krajobrazowego
     to zwykle ziemia; gora daje niebo i horyzont, czyli czesc rozpoznawalna. */
  /* WAGA SELEKTOROW MUSI DOROWNAC TYM Z UKLADU SZEROKIEGO.
     Media NIE podnosi wagi: `.pasek-ramka--stale-oba .pasek-staly` (0,2,0) bije
     samo `.pasek-staly` (0,1,0) niezaleznie od tego, ze stoi poza media.
     Do 02.08.2026 dawalo to na telefonie kafle szerokie na 284 px zamiast pelnej
     szerokosci i wciecie tasmy 2x298 przy ramce 582 - czyli o 14 px wiecej, niz
     tasma w ogole miala, przez co kafle spadaly do awaryjnych 220 px. */
  .pasek-ramka--stale { display: flex; flex-direction: column; }
  .pasek-ramka--stale .pasek-staly,
  .pasek-ramka--stale-oba .pasek-staly {
    position: static; width: 100%; height: 88px; order: 2;
    flex-direction: row; align-items: center; gap: 12px;
    justify-content: flex-start; padding: 12px 14px;
    background-position: center top;
  }
  .pasek-ramka--stale .pasek-staly--lewa  { order: 1; margin-bottom: 10px; }
  .pasek-ramka--stale .pasek-staly--prawa { order: 3; margin-top: 10px; }
  .pasek-ramka--stale > #pasek-gospodarstw,
  .pasek-ramka--stale > .pasek-poziomy { order: 2; }
  /* NA TELEFONIE STALE KAFLE NIE ZAJMUJA SLOTU - sa pasami nad i pod tasma.
     Bez tego `--n` zeszloby do zera i szerokosc kafla bylaby dzieleniem
     przez zero. */
  /* NA TELEFONIE JEDEN KAFEL NA CALA SZEROKOSC. To JEDYNY prog, ktory zostaje,
     i nie dotyczy LICZBY kafli, tylko zmiany UKLADU: stale kafle przestaja byc
     kolumnami i staja sie pasami nad i pod tasma. */
  .pasek-ramka--stale, #pasek-gospodarstw, .pasek-poziomy { --slot: 100cqw; }
  .pasek-ramka--stale > .pasek-kropki { order: 4; }
  .pasek-staly-ikona { margin-bottom: 0; }
  .pasek-staly-tytul { font-size: 15px; }
  /* Przy dwoch stalych opis wraca — pas ma cala szerokosc, wiec jest miejsce. */
  .pasek-ramka--stale.pasek-ramka--stale-oba .pasek-staly-opis {
    display: block; font-size: 12px;
  }
  /* Na telefonie stalych kafli nie ma, wiec strzalki wracaja na krawedzie. */
  .pasek-ramka--stale-lewo .pasek-strzalka--lewo { left: 2px; }
  .pasek-ramka--stale-prawo .pasek-strzalka--prawo { right: 2px; }
  /* ZEROWANIE WCIECIA - waga 0,3,0, tyle samo co reguly, ktore je ustawiaja. */
  .pasek-ramka--stale.pasek-ramka--stale-lewo > #pasek-gospodarstw,
  .pasek-ramka--stale.pasek-ramka--stale-lewo > .pasek-poziomy,
  .pasek-ramka--stale.pasek-ramka--stale-prawo > #pasek-gospodarstw,
  .pasek-ramka--stale.pasek-ramka--stale-prawo > .pasek-poziomy,
  .pasek-ramka--stale-oba.pasek-ramka--stale-lewo > #pasek-gospodarstw,
  .pasek-ramka--stale-oba.pasek-ramka--stale-lewo > .pasek-poziomy,
  .pasek-ramka--stale-oba.pasek-ramka--stale-prawo > #pasek-gospodarstw,
  .pasek-ramka--stale-oba.pasek-ramka--stale-prawo > .pasek-poziomy {
    margin-left: 0; margin-right: 0;
  }
}

/* KROPKI POD PASKIEM. Bez nich nie wiadomo, ile jeszcze zostalo ani gdzie sie
   jest - pasek wyglada na uciety w przypadkowym miejscu.
   Kazda kropka jest PRZYCISKIEM: dziala z klawiatury i przenosi wprost na
   wybrana strone, a nie tylko pokazuje polozenie. */
.pasek-kropki {
  display: flex; justify-content: center; gap: 8px;
  margin-top: 12px;
}
.pasek-kropki[hidden] { display: none; }

.pasek-kropka {
  /* POLE DOTYKU 24 px przy kropce widocznej na 8 - palec nie trafia w 8 px,
     a wieksza kropka wygladalaby ciezko. Przezroczysta obwodka robi cel
     wiekszym, nie zmieniajac wygladu. */
  width: 24px; height: 24px; padding: 0;
  border: none; background: none; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
}
.pasek-kropka::before {
  content: ''; display: block;
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--line);
  transition: background .15s, transform .15s;
}
.pasek-kropka:hover::before { background: var(--muted); }
.pasek-kropka.jest::before {
  background: var(--accent); transform: scale(1.35);
}
/* Zaznaczenie z klawiatury MUSI byc widoczne - inaczej po pasku da sie chodzic
   tabulatorem, ale nie widac, gdzie sie jest. */
.pasek-kropka:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* STRZALKI. Tworzy je skrypt i sam je chowa, gdy wszystko sie miesci —
   strzalka, ktora nic nie robi, jest gorsza niz jej brak. */
.pasek-strzalka {
  position: absolute; top: calc(50% - 32px); z-index: 2;
  width: 40px; height: 40px; border-radius: 50%; cursor: pointer;
  border: 1px solid var(--line); background: var(--surface); color: var(--text);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 2px 8px rgba(0,0,0,.18); font-size: 20px; line-height: 1;
}
.pasek-strzalka:hover { background: var(--bg); }
.pasek-strzalka[hidden] { display: none; }
/* SKRAJNE KAFLE ROWNO Z KRAWEDZIA POZOSTALYCH BLOKOW.
   Do 02.08.2026 ramka miala `padding: 0 52px`, zeby zrobic miejsce strzalkom -
   ale wtedy pasek byl WEZSZY niz reszta strony i pierwszy kafel zaczynal sie
   52 px dalej niz naglowek nad nim. Teraz tasma siega krawedzi kontenera,
   a strzalka ma dwa dopuszczalne miejsca (przelacznik w panelu):

     `krawedz` - NA tasmie, przy brzegach, od wewnatrz. Nic nie zabiera
                 szerokosci, kosztem przyciskow lezacych na skrajnych kaflach.
     `kropki`  - w linii kropek pod paskiem. Zdjecia calkowicie odslonione,
                 kosztem wiersza pod spodem. */
.pasek-strzalka--lewo { left: 8px; }
.pasek-strzalka--prawo { right: 8px; }

/* STRZALKA PRZY KRAWEDZI TASMY, NIE RAMKI. Tasma jest zwezona MARGINESEM o
   szerokosc stalego kafla, a strzalki i stale kafle leza wzgledem RAMKI - wiec
   ich odsuniecie musi zawierac ten sam margines. Rozjazd tych dwoch podstaw
   byl przyczyna dwoch osobnych usterek 02.08.2026: raz strzalka w srodku
   tasmy, raz staly kafel na kaflu gospodarstwa. */
.pasek-ramka--stale-lewo .pasek-strzalka--lewo {
  left: calc(var(--slot) + var(--odstep) + 8px);
}
.pasek-ramka--stale-prawo .pasek-strzalka--prawo {
  right: calc(var(--slot) + var(--odstep) + 8px);
}
.pasek-ramka--stale-oba.pasek-ramka--stale-lewo .pasek-strzalka--lewo {
  left: calc((var(--slot) - var(--odstep)) / 2 + var(--odstep) + 8px);
}
.pasek-ramka--stale-oba.pasek-ramka--stale-prawo .pasek-strzalka--prawo {
  right: calc((var(--slot) - var(--odstep)) / 2 + var(--odstep) + 8px);
}

/* WARIANT „W LINII KROPEK". Strzalki przestaja byc pozycjonowane bezwzglednie
   i staja sie zwyklym rzedem obok kropek. */
.pasek-ramka--strzalki-kropki { display: flex; flex-wrap: wrap; align-items: center; }
.pasek-ramka--strzalki-kropki > .pasek-poziomy,
.pasek-ramka--strzalki-kropki > #pasek-gospodarstw { flex: 1 0 100%; }
.pasek-strzalka--wkropkach {
  position: static; width: 34px; height: 34px; font-size: 17px;
  box-shadow: none; margin: 12px 6px 0;
}
.pasek-ramka--strzalki-kropki > .pasek-kropki { margin: 12px 0 0; }
.pasek-ramka--strzalki-kropki { justify-content: center; }
/* SZANUJEMY USTAWIENIE SYSTEMOWE. Samoprzesuwania juz nie ma (31.07.2026),
   ale skok przy strzalce i kropce tez jest ruchem — skrypt to sprawdza, a tu gasimy plynne
   przewijanie, zeby skok byl natychmiastowy zamiast dlugiej animacji. */
@media (prefers-reduced-motion: reduce) {
  #pasek-gospodarstw { scroll-behavior: auto; }
  .gosp-kafel { transition: none; }
}
@media (max-width: 720px) {
  /* USUNIETE `flex-basis: 220px` (02.08.2026). Szerokosc kafla wynika teraz ze
     wzoru `--slot`, a `flex-basis` z tej reguly nadpisywal skladowa z `flex`
     i zostawial 220 px niezaleznie od tego, ile miejsca tasma naprawde ma.
     Objaw: przy ramce 582 i jednym kaflu na ekranie kafel mial 220 zamiast 582.

     PROG 720 USTAWIA JUZ `--slot: 100cqw`, wiec ta regula nie miala czego
     dodac poza konfliktem. */
  /* STRZALKI ZOSTAJA TAKZE NA TELEFONIE. Palec jest wygodniejszy, ale sam gest
     nie mowi, ze jest co przesuwac - a przy jednym kaflu na ekranie reszta
     paska jest calkiem niewidoczna. Mniejsze i w kolorze akcentu, zeby nie
     zaslanialy kafelka bardziej, niz musza. */
  .pasek-strzalka {
    width: 32px; height: 32px; font-size: 17px;
    background: var(--accent); color: #fff; border-color: var(--accent);
  }
  .pasek-strzalka:hover { background: var(--accent); }
  .pasek-strzalka--lewo { left: 2px; }
  .pasek-strzalka--prawo { right: 2px; }
}


/* ---------- ZAOKRAGLENIE NAROZNIKA — NA KONCU ARKUSZA ---------- */
/* DLACZEGO TUTAJ, A NIE PRZY KAFLACH: regula musi WYGRAC z podstawowym
   zaokragleniem kafla. `.kafel.k--kafelek` ma w selektorze DWIE klasy, a samo
   `.rog--lg` jedna — przy rownej wadze wygrywa bardziej szczegolowy, wiec duze
   zaokraglenie przegrywalo i nie bylo go widac.
   Stad dwa zabiegi naraz: selektory z DWOMA klasami i miejsce na KONCU pliku,
   zeby przy remisie decydowala kolejnosc na nasza korzysc.

   `overflow: hidden` jest KONIECZNE — bez niego zdjecie w srodku wychodzi poza
   zaokraglony rog i caly efekt przepada. */
.kafel.rog--lg, .kafel.rog--pg, .kafel.rog--pd, .kafel.rog--ld,
.obraz-kafel.rog--lg, .obraz-kafel.rog--pg,
.obraz-kafel.rog--pd, .obraz-kafel.rog--ld,
.pasek-staly.rog--lg, .pasek-staly.rog--pg,
.pasek-staly.rog--pd, .pasek-staly.rog--ld { overflow: hidden; }

/* NAGLOWEK PRZY ZAOKRAGLONYM ROGU (02.08.2026).
   Ikona stoi w SRODKU OKREGU, ktorym prowadzony jest luk - czyli 48 px od obu
   krawedzi tego rogu, WEWNATRZ kafelka. Napis biegnie od niej w strone
   przeciwna do rogu, bo w samym rogu miejsce zajmuje ikona.

   40 px, nie 48: przy promieniu 48 zostaje po 4 px zapasu z kazdej strony,
   zeby ikona nie dotykala luku. Zmiana promienia nizej wymaga zmiany i tutaj -
   dlatego obie liczby stoja wypisane wprost, a nie schowane pod jedna nazwa. */
.kafel-rog-naglowek {
  position: absolute; display: flex; align-items: center; gap: 12px;
  z-index: 2; pointer-events: none;
}
/* Odnosnik musi byc klikalny mimo `pointer-events: none` na rodzicu - ten
   wylacznik chroni tresc kafelka pod spodem, nie sama ikone. */
.kafel-rog-link { pointer-events: auto; }

.kafel-rog-naglowek--gora { top: 28px; }
.kafel-rog-naglowek--dol  { bottom: 28px; }
.kafel-rog-naglowek--lewo  { left: 28px; right: 20px; }
.kafel-rog-naglowek--prawo { right: 28px; left: 20px; flex-direction: row-reverse; text-align: right; }

.kafel-rog-ikona {
  width: 40px; height: 40px; flex: 0 0 40px; display: block;
  background: center/contain no-repeat;
}
.kafel-rog-napis {
  font-size: 15px; font-weight: 700; line-height: 1.2;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Kafelek z naglowkiem przy rogu musi miec z czego go pozycjonowac.
   `.pasek-staly` ma `position: absolute`, wiec juz nim jest. */
.kafel { position: relative; }

/* NAGLOWEK PRZY ROGU STALEGO KAFLA - mniejszy niz w kafelku CMS, bo staly kafel
   ma 150 px wysokosci i 16 px wypelnienia. Przy odsunieciu 28 px ikona wchodzila
   na napis pod spodem. */
.pasek-staly .kafel-rog-naglowek--gora { top: 14px; }
.pasek-staly .kafel-rog-naglowek--dol  { bottom: 14px; }
.pasek-staly .kafel-rog-naglowek--lewo  { left: 14px; right: 12px; }
.pasek-staly .kafel-rog-naglowek--prawo { right: 14px; left: 12px; }
.pasek-staly .kafel-rog-ikona { width: 30px; height: 30px; flex: 0 0 30px; }
.pasek-staly .kafel-rog-napis { font-size: 13px; }

/* MIEJSCE NA NAGLOWEK. Bez tego napis lezalby na tresci kafelka. Dokladamy je
   TYLKO wtedy, gdy naglowek istnieje - kafelek bez niego wyglada jak dotad. */
.kafel:has(.kafel-rog-naglowek--gora) { padding-top: 84px; }
.kafel:has(.kafel-rog-naglowek--dol)  { padding-bottom: 84px; }

.kafel.rog--lg, .obraz-kafel.rog--lg, .pasek-staly.rog--lg { border-top-left-radius: 48px; }
.kafel.rog--pg, .obraz-kafel.rog--pg, .pasek-staly.rog--pg { border-top-right-radius: 48px; }
.kafel.rog--pd, .obraz-kafel.rog--pd, .pasek-staly.rog--pd { border-bottom-right-radius: 48px; }
.kafel.rog--ld, .obraz-kafel.rog--ld, .pasek-staly.rog--ld { border-bottom-left-radius: 48px; }

@media (max-width: 720px) {
  /* Na waskim ekranie 48 px zjada rog malego kafelka prawie w calosci. */
    /* Promien 28 zamiast 48, wiec i srodek luku przesuwa sie blizej rogu. */
  .kafel-rog-naglowek--gora { top: 16px; }
  .kafel-rog-naglowek--dol  { bottom: 16px; }
  .kafel-rog-naglowek--lewo  { left: 16px; right: 14px; }
  .kafel-rog-naglowek--prawo { right: 16px; left: 14px; }
  .kafel-rog-ikona { width: 32px; height: 32px; flex: 0 0 32px; }
  .kafel-rog-napis { font-size: 14px; }
  .kafel:has(.kafel-rog-naglowek--gora) { padding-top: 60px; }
  .kafel:has(.kafel-rog-naglowek--dol)  { padding-bottom: 60px; }

.kafel.rog--lg, .obraz-kafel.rog--lg, .pasek-staly.rog--lg { border-top-left-radius: 28px; }
  .kafel.rog--pg, .obraz-kafel.rog--pg, .pasek-staly.rog--pg { border-top-right-radius: 28px; }
  .kafel.rog--pd, .obraz-kafel.rog--pd, .pasek-staly.rog--pd { border-bottom-right-radius: 28px; }
  .kafel.rog--ld, .obraz-kafel.rog--ld, .pasek-staly.rog--ld { border-bottom-left-radius: 28px; }
}/* MAPA W KAFELKU. Kafelek rosnie od tresci, a mapa ma proporcje z pliku granic
   — bez ograniczenia wysokosci Polska rozpychalaby kafelek na cala szerokosc
   ekranu w pionie.
   `max-height` zamiast `height`: przy waskim kafelku mapa ma sie zmiescic,
   a nie zostac rozciagnieta. */
.kafel-mapa { margin-bottom: 10px; }
/* MAPA SKALUJE SIE DO KAFELKA, nie do sztywnych 260 px.
   Rysunek ma wlasna proporcje (Polska to prawie kwadrat), wiec dosc podac
   szerokosc — wysokosc wyjdzie sama. Sufit 260 px robil mape mala na szerokim
   kafelku i wychodzaca poza waski (03.08.2026). */
.kafel-mapa .mapa-svg { width: 100%; height: auto; margin: 0 auto; display: block; }
.kafel-mapa { --mapa-klik: default; }
/* W kafelku nie ma miejsca na okruchy w jednej linii z przelacznikiem nazw. */
.kafel-mapa .mapa-pasek { font-size: 12px; }
/* W KAFELKU NIE MA PASKA ANI OKRUCHOW — generator podaje `goly=1`. Reguly
   zostaja na wypadek osadzenia mapy gdzie indziej z paskiem. */
.kafel-mapa .mapa-okruch,
.kafel-mapa .mapa-nazwy { padding: 3px 9px; font-size: 12px; }
/* Liczby w malej mapie musza byc wieksze wzglednie, bo caly rysunek jest mniejszy. */
/* Kafelek tez w jednostkach rysunku — mniejsze niz w panelu, bo tam mapa jest
   ozdoba strony i nie sluzy do odczytywania liczb z odleglosci biurka. */
.kafel-mapa .mapa-liczba { font-size: 46px; }
.kafel-mapa .mapa-nazwa { font-size: 26px; }

/* Na ciemnym kafelku napisy mapy musza byc jasne — dziedzicza kolor tekstu
   kafelka, wiec wystarczy je do niego podpiac. */
.tekst--bialy .kafel-mapa .mapa-liczba,
.tekst--bialy .kafel-mapa .mapa-nazwa { fill: #fff; }
.tekst--bialy .kafel-mapa .mapa-region path { stroke: rgba(255, 255, 255, .35); }

/* ---------- MAPA POLSKI ---------- */
/* WYGLAD JEST TUTAJ, zachowanie w `js/mapa.js` — ta sama zasada co przy pasku. */

.mapa { display: block; }

.mapa-pasek {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 10px;
}
.mapa-okruchy { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.mapa-strzalka { color: var(--muted); font-size: 14px; }

/* OKRUCH JEST PRZYCISKIEM, nie napisem: powrot o poziom wyzej musi dzialac
   takze z klawiatury. Biezacy poziom jest wylaczony — klikniecie w miejsce,
   w ktorym juz jestes, nic by nie dalo. */
.mapa-okruch {
  border: 1px solid var(--line); background: var(--surface);
  border-radius: 999px; padding: 5px 12px; cursor: pointer;
  font-size: 13px; color: inherit;
}
.mapa-okruch:hover:not(:disabled) { background: var(--bg); }
.mapa-okruch:disabled { cursor: default; opacity: .55; }
.mapa-okruch:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.mapa-nazwy {
  border: 1px solid var(--line); background: var(--surface);
  border-radius: 999px; padding: 5px 12px; cursor: pointer;
  font-size: 13px; color: inherit;
}
.mapa-nazwy.jest { background: var(--accent); color: #fff; border-color: var(--accent); }
.mapa-nazwy:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* LISTA REGIONOW obok okruchow. Wyglada jak przyciski nawigacji, bo robi to
   samo — tylko bez celowania w ksztalt na mapie. */
.mapa-wybor {
  border: 1px solid var(--line); background: var(--surface);
  border-radius: 999px; padding: 5px 10px;
  font-size: 13px; color: inherit; font-family: inherit;
  max-width: 220px;
}
.mapa-wybor[hidden] { display: none; }
.mapa-wybor:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.mapa-plotno { position: relative; }
.mapa-svg { display: block; width: 100%; height: auto; }

/* GRANICA SZARA I CIENKA.
   Byla w kolorze tla (bialym) — regiony sasiadujace jasnymi odcieniami zlewaly
   sie wtedy w jedna plame i nie bylo widac podzialu. Szary rozdziela je przy
   kazdym wypelnieniu, a przy gminach nie tworzy czarnej siatki, ktora zabijala
   kolor. 0,8 px, bo przy 1,2 px setki gmin daja wiecej kreski niz powierzchni. */
.mapa-region path {
  stroke: #9aa3ad; stroke-width: 0.8;
  stroke-linejoin: round;
  transition: fill-opacity .12s;
}
.mapa-region--klik { cursor: pointer; }
.mapa-region--klik:hover path { fill-opacity: 1 !important; }

/* Napisy NIE MOGA lapac kliknięcia — inaczej klik w liczbe nie schodzi nizej. */
.mapa-region text { pointer-events: none; text-anchor: middle; }
/* ROZMIAR PISMA W JEDNOSTKACH RYSUNKU, nie w pikselach ekranu.
   =========================================================================
   `viewBox` ma 1000 jednostek szerokosci, a rysunek na ekranie bywa szeroki
   na 409 px albo na 900 — przegladarka skaluje wtedy WSZYSTKO oprocz pisma
   podanego w `px`, bo to jednostka ekranu, nie rysunku.

   Skutek byl taki, ze odstepy miedzy nazwa a liczba (ustawiane w `mapa.js`
   w jednostkach rysunku) kurczyly sie razem z mapa, a litery zostawaly duze —
   i przy waskim rysunku napisy WCHODZILY NA SIEBIE, mimo ze przy szerokim
   wygladaly dobrze (03.08.2026).

   `em` w SVG odnosi sie do jednostek rysunku, wiec pismo skaluje sie razem
   z reszta i proporcja jest ta sama w kafelku, w ramce i na pelnym ekranie.
   Wartosci dobrane tak, zeby przy typowej szerokosci 500 px wyszlo mniej
   wiecej tyle, co dotychczasowe 15,6 i 51 px. */
.mapa-nazwa { font-size: 22px; fill: var(--muted); }
/* NA CIEMNYM WYPELNIENIU SZARY NAPIS ZNIKA. Liczba miala juz swoja odmiane,
   nazwa nie — a przy mocno wypelnionym regionie to ona gubi sie pierwsza.
   `paint-order` z obwodka: nazwa lezy czesto na granicy dwoch odcieni, wiec
   sam kolor nie wystarcza. Obwodka rysowana POD wypelnieniem nie zjada
   ksztaltu liter. */
.mapa-nazwa.na-ciemnym { fill: #fff; }
.mapa-region text {
  paint-order: stroke fill;
  stroke: rgba(0, 0, 0, .35);
  stroke-width: 2.5px;
  stroke-linejoin: round;
}
.mapa-region .mapa-nazwa:not(.na-ciemnym),
.mapa-region .mapa-liczba:not(.na-ciemnym) {
  stroke: rgba(255, 255, 255, .75);
}
/* Po to sie na te mape patrzy: nazwa mowi GDZIE, ale odpowiedzia jest liczba.
   Te same jednostki co przy nazwie — patrz komentarz wyzej. */
.mapa-liczba { font-size: 27px; font-weight: 700; fill: var(--text); }
.mapa-liczba.na-ciemnym { fill: #fff; }

/* PODSUMOWANIE POZIOMU. Mapa pokazuje rozklad, ale nie odpowiada na „ile
   w sumie" ani „gdzie najwiecej" — a to zwykle pierwsze dwa pytania. */
.mapa-podsumowanie {
  display: flex; flex-wrap: wrap; gap: 18px;
  margin-top: 12px; padding-top: 12px;
  border-top: 1px solid var(--line);
}
.mapa-poz { display: flex; flex-direction: column; }
.mapa-poz-w { font-size: 17px; font-weight: 700; line-height: 1.2; }
.mapa-poz-o { font-size: 12px; color: var(--muted); }
.mapa-poz-uwaga { font-size: 11px; color: var(--muted); font-style: italic; }

/* LEGENDA. Bez niej odcien nic nie znaczy — nie wiadomo, czy ciemniejszy
   to wiecej czy mniej. */
.mapa-legenda {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 10px; font-size: 12px; color: var(--muted);
}
/* PASEK PLYNNY, z liczbami W SRODKU na obu koncach. Piec prostokatow z podpisami
   „mniej"/„wiecej" mowilo o kolejnosci, ale nie o wartosciach — a to wlasnie
   wartosci na krancach sa jedyna informacja, ktora ten pasek niesie. */
.mapa-legenda { flex-direction: column; align-items: stretch; }
.mapa-legenda-pasek {
  position: relative; height: 26px; border-radius: 4px;
  display: flex; align-items: center;
  border: 1px solid var(--line);
}
.mapa-legenda-kraniec {
  position: absolute; left: 8px;
  font-size: 12px; font-weight: 700; color: var(--text);
  /* OBWODKA ZAMIAST TLA. Liczba na ciemnym koncu paska musi byc czytelna,
     a bialy prostokat pod nia przerywalby gradient dokladnie tam, gdzie
     pokazuje on wartosc najwieksza. */
  text-shadow: 0 0 3px #fff, 0 0 3px #fff, 0 0 3px #fff;
}
.mapa-legenda-kraniec--prawy { left: auto; right: 8px; }

/* W TRYBIE OSADZONYM KLIKNIECIE W REGION NIC NIE ROBI — nawigacja nalezy do
   listy w panelu. Kursor musi to mowic, inaczej obiecuje ruch, ktorego nie ma. */
.mapa--bez-klikania .mapa-region,
.kafel-mapa .mapa-region { cursor: default; }

/* METRYCZKA POD KURSOREM.
   `position: fixed`, bo `overflow` plotna przycinaloby ja przy krawedzi mapy.
   `pointer-events: none` — inaczej pudelko przechwytywaloby kursor i region
   pod nim natychmiast traciloby najechanie, co dawaloby miganie. */
.mapa-metryczka {
  position: fixed; z-index: 60; pointer-events: none;
  min-width: 180px; max-width: 280px;
  padding: 12px 16px; text-align: center;
  background: var(--surface); color: var(--text);
  border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,.12), 0 8px 24px rgba(0,0,0,.12);
  font-size: 13px; line-height: 1.45;
}
.mapa-metryczka[hidden] { display: none; }
.mapa-metryczka-nazwa { font-weight: 700; margin-bottom: 6px; }
.mapa-metryczka-opis { color: var(--muted); font-size: 12.5px; }
.mapa-metryczka-w { font-size: 15px; margin-bottom: 4px; }
.mapa-metryczka-w:last-child { margin-bottom: 0; }

/* KARTA REGIONU — po klinieciu na najnizszym poziomie. */
.mapa-karta {
  margin-top: 12px; padding: 12px 14px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface);
}
.mapa-karta-naglowek {
  display: flex; align-items: center; gap: 10px; margin-bottom: 10px;
}
.mapa-karta-kod { font-size: 11.5px; color: var(--muted); font-family: monospace; }
.mapa-karta-zamknij {
  margin-left: auto; border: none; background: none; cursor: pointer;
  font-size: 20px; line-height: 1; color: var(--muted); padding: 0 4px;
}
.mapa-karta-zamknij:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.mapa-karta .mapa-poz { flex-direction: row; align-items: baseline; gap: 8px; }
.mapa-karta-pusto { font-size: 12.5px; color: var(--muted); }

/* WYBRANY REGION obrysowany, zeby bylo widac, ktorego dotyczy karta. */
.mapa-region.jest path { stroke: var(--text); stroke-width: 2.5; }

.mapa-czekaj, .mapa-blad {
  padding: 28px; text-align: center; font-size: 13px; color: var(--muted);
}

/* BEZ OSOBNEJ REGULY DLA TELEFONU.
   Byla potrzebna, dopoki pismo mierzylo sie w pikselach ekranu: na waskim
   ekranie te same 51 px zaslanialy wojewodztwo, w ktorym stalo. W jednostkach
   rysunku napis kurczy sie razem z mapa, wiec proporcja jest ta sama wszedzie
   i regula nie ma czego poprawiac (03.08.2026). */


/* ============================================================
   MAPA OBRAZKOWA — obraz z obszarami klikalnymi (16.08.2026, sql/374)

   OBSZARY W PROCENTACH, nie w pikselach: wspolrzedne wypisuje generator
   wprost w `style`, wiec skaluja sie razem z obrazem. Ten sam prostokat
   trafia w to samo miejsce na monitorze i na telefonie.

   DLACZEGO NIE `<map>` I `<area>`: ten znacznik przyjmuje WYLACZNIE piksele.
   Obraz zmniejszony na telefonie mialby obszary w dawnych miejscach.
   ============================================================ */

.mapa-obrazkowa {
  position: relative;
  line-height: 0;          /* bez tego pod obrazem zostaje pasek na wysokosc wiersza */
  border-radius: 14px;
  overflow: hidden;
}

.mapa-obrazkowa img {
  display: block;
  width: 100%;
  height: auto;
}

.mapa-obszar {
  position: absolute;
  display: block;
  border-radius: 6px;
  background: transparent;
  border: 2px solid transparent;
  transition: background .18s ease, border-color .18s ease;
}

/* PODSWIETLENIE PRZY NAJECHANIU — dla myszy i dla dotkniecia (`:focus`).
   Bez `:focus` obszar na telefonie nie dawalby zadnego znaku, ze zostal
   trafiony. */
a.mapa-obszar:hover,
a.mapa-obszar:focus {
  background: rgba(255, 255, 255, .22);
  border-color: rgba(255, 255, 255, .9);
  outline: none;
}

/* OBRAMOWANIE STALE — przelacznik „Pokaz obramowanie obszarow".
   Przydaje sie, gdy z samego obrazu nie widac, co jest klikalne. */
.mapa-obrazkowa--ramki .mapa-obszar {
  border-color: rgba(255, 255, 255, .65);
  background: rgba(0, 0, 0, .12);
}

.mapa-obrazkowa--ramki a.mapa-obszar:hover,
.mapa-obrazkowa--ramki a.mapa-obszar:focus {
  background: rgba(255, 255, 255, .28);
  border-color: #fff;
}

/* OBSZAR BEZ ADRESU (`<span>`) NIE JEST KLIKALNY — kursor ma o tym mowic.
   Zostaje po to, zeby cos na obrazie opisac bez przejscia dalej. */
span.mapa-obszar {
  cursor: default;
  pointer-events: none;
}

span.mapa-obszar[title] {
  pointer-events: auto;    /* ale podpis przy najechaniu ma sie pokazac */
}
