/* ==========================================================================
   PION — język wizualny ewidencji sprzętu.
   Metafora: rysunek techniczny i przyrząd pomiarowy. Ciemny granatowy korpus,
   indygo jak linia na kalce, numer inwentarzowy jak odczyt dalmierza.
   Niebieski nie jest przypadkowy: to barwa oznaczania sieci wodociągowych,
   czyli tego, co ta firma buduje.
   Zasady: jedna kolorowa rzecz na ekran, głębia niesie informację,
   telefon dolnocentryczny, ruch tylko tam, gdzie tłumaczy.
   Kroje pakowane lokalnie — font, który się nie doładował w wykopie,
   to pusty ekran.
   ========================================================================== */

/* KROJE (5.61.0, wybór Sławka 05.10.2026: zestaw „Warsztat”).
   Chivo — cały tekst. „Kod Warsztat” — Chivo Mono z PRZEKREŚLONYM ZEREM (przerobione u nas, licencja OFL
   wymaga innej nazwy): numery inwentarzowe, rejestracyjne, seryjne. Zero i O nie do pomylenia. */
@font-face{font-family:"Chivo";font-style:normal;font-weight:400;font-display:swap;src:url(/fonty/chivo-latin-400-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Chivo";font-style:normal;font-weight:400;font-display:swap;src:url(/fonty/chivo-latin-ext-400-normal.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Chivo";font-style:normal;font-weight:500;font-display:swap;src:url(/fonty/chivo-latin-500-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Chivo";font-style:normal;font-weight:500;font-display:swap;src:url(/fonty/chivo-latin-ext-500-normal.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Chivo";font-style:normal;font-weight:600;font-display:swap;src:url(/fonty/chivo-latin-600-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Chivo";font-style:normal;font-weight:600;font-display:swap;src:url(/fonty/chivo-latin-ext-600-normal.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Chivo";font-style:normal;font-weight:700;font-display:swap;src:url(/fonty/chivo-latin-700-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Chivo";font-style:normal;font-weight:700;font-display:swap;src:url(/fonty/chivo-latin-ext-700-normal.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Kod Warsztat";font-style:normal;font-weight:500;font-display:swap;src:url(/fonty/kod-warsztat-latin-500-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Kod Warsztat";font-style:normal;font-weight:500;font-display:swap;src:url(/fonty/kod-warsztat-latin-ext-500-normal.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Kod Warsztat";font-style:normal;font-weight:600;font-display:swap;src:url(/fonty/kod-warsztat-latin-600-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Kod Warsztat";font-style:normal;font-weight:600;font-display:swap;src:url(/fonty/kod-warsztat-latin-ext-600-normal.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Kod Warsztat";font-style:normal;font-weight:700;font-display:swap;src:url(/fonty/kod-warsztat-latin-700-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Kod Warsztat";font-style:normal;font-weight:700;font-display:swap;src:url(/fonty/kod-warsztat-latin-ext-700-normal.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
/* ---------------------------------------------------------------- kroje --- */
/* DWA KROJE NA CAŁY PROGRAM. Nie trzy.
   Archivo (od 5.61.0; wcześniej Wix Madefor Text) — WSZYSTKO, co jest słowem: szyna,
     nagłówki, treść, przyciski, plakietki. Groteska o rodowodzie technicznym, pasuje
     do napisu w logo; jedna odmiana zmienna (grubość i szerokość) zamiast ośmiu plików.
   Martian Mono — WYŁĄCZNIE numery inwentarzowe i to, co się przy nich czyta cyfra
     po cyfrze. Szeroki, o mocno rozróżnialnych znakach: N-0201 nie da się pomylić
     z N-O2Ol. Tam, gdzie pomyłka w znaku kosztuje wyjazd na budowę, to ma sens;
     wszędzie indziej mono tylko udaje technikę.

   Wix Madefor Display został WYCOFANY (5.17.0). Był krojem nagłówków — węższym,
   mocniej ściśniętym — przez co lewa szyna i prawa treść wyglądały jak dwa różne
   programy zszyte w jeden ekran. Zgłoszenie brzmiało dokładnie tak: „czcionka
   na lewym panelu mi się podoba, na prawym jest zła, lepiej żeby była podobna".
   Nagłówek nie potrzebuje innego kroju, żeby być nagłówkiem — wystarczy stopień
   i grubość. Jeden krój na wszystkie słowa to jedna decyzja mniej przy każdym
   nowym elemencie i o jeden plik mniej do pobrania w wykopie.

   Wszystko na licencji OFL, spakowane lokalnie w public/fonty. */

/* ---------------------------------------------------------------- barwy --- */
/* JASNY jest domyślny. Ciemny wchodzi przełącznikiem w rogu ekranu.
   Oba motywy projektowane osobno — żaden nie jest odwróceniem drugiego,
   dlatego oba komplety zmiennych są wypisane w całości. */
:root{
  /* ŚWIAT: kwit z narzędziowni. Papier, kalka, ołówek kopiowy, zielony stempel
     „wydano", czerwony tusz na awarii. Nie jest to szarość neutralna — wszystko
     ma ciepły podkład, żeby ekran nie świecił jak arkusz kalkulacyjny.
     Wersja ciemna to ten sam papier w nocy: ciepły brąz, nie granat. */
  --tlo:#14120F;        /* korpus       */
  --p0:#1A1714;         /* tło treści   */
  --p1:#211D19;         /* karta        */
  --p2:#2A2521;         /* nakładka, hover */
  --wklesle:#100E0C;    /* pole wprowadzania, skaner */

  --t0:#F4F0E9; --t1:#B8B0A5; --t2:#A1998F; --t3:#5E574F;   /* t2: 5.64.1 — było #8A8279, 4,4:1 na karcie */

  --kr:rgba(255,255,255,.09);
  --kr2:rgba(255,255,255,.16);
  --kr3:rgba(255,255,255,.05);

  --akcent:#3E9C7C; --na-akcencie:#0C1512;
  --akcent-t:#63C4A2;   /* akcent użyty jako TEKST/kontur — jaśniejszy, bo na ciemnym */
  --baza:#9AA593; --droga:#8E9BD6; --awaria:#E0736A; --uwaga:#DDA24A;
  --baza-tlo:rgba(154,165,147,.13); --droga-tlo:rgba(142,155,214,.14);
  --awaria-tlo:rgba(224,115,106,.13); --akcent-tlo:rgba(62,156,124,.16);
  --uwaga-tlo:rgba(221,162,74,.13);

  --f:"Chivo","Segoe UI",system-ui,Arial,sans-serif;
  --fm:"Kod Warsztat","Cascadia Mono",Consolas,ui-monospace,monospace;

  --r-s:6px; --r-m:10px; --r-l:16px; --r-xl:22px;
  --e:cubic-bezier(.23,1,.32,1);
  --cien:0 1px 2px rgba(0,0,0,.5), 0 14px 32px -14px rgba(0,0,0,.7);
  --szyna:250px;
  color-scheme:dark;
}
:root[data-motyw="jasny"]{
  --tlo:#F3F1EC; --p0:#FAF8F4; --p1:#FFFFFF; --p2:#FFFFFF; --wklesle:#EFEBE3;
  --t0:#1A1712; --t1:#57514A; --t2:#6F685F; --t3:#B5ADA2;   /* t2: 5.64.1 — było #8A8279, 3,6:1 */
  --kr:rgba(26,23,18,.11); --kr2:rgba(26,23,18,.20); --kr3:rgba(26,23,18,.06);
  /* Zielony stempel „wydano" — jedyny kolor akcji w całej aplikacji.
     Na papierze musi być ciemny, żeby biały napis na przycisku miał kontrast. */
  --akcent:#1D5C4A; --na-akcencie:#FFFFFF;
  --akcent-t:#17513F;   /* jako tekst na papierze */
  --baza:#5E6A5A;       /* leży w bazie — nic się nie dzieje, kolor stonowany (5.64.1: ciemniej, było 4,2:1) */
  --droga:#4A5A94;      /* w drodze / czeka na potwierdzenie — niebieski tusz */
  --awaria:#A32B22;     /* czerwony tusz */
  --uwaga:#9A5B12;      /* ołówek kopiowy */
  --baza-tlo:rgba(111,122,107,.11); --droga-tlo:rgba(74,90,148,.10);
  --awaria-tlo:rgba(163,43,34,.09); --akcent-tlo:rgba(29,92,74,.10);
  --uwaga-tlo:rgba(154,91,18,.10);
  --cien:0 1px 2px -1px rgba(26,23,18,.10), 0 12px 28px -20px rgba(26,23,18,.35);
  color-scheme:light;
}

/* ============================================================== motyw „Żółty" ===
   DOMYŚLNY od 5.15.0. Barwy odczytane z pikseli zrzutów panelu, który użytkownik wskazał
   jako wzór — nie dobrane z oka: żółty #FFD741, czerń nawigacji #100E10, tło treści #F2F2F2.

   DLACZEGO TO NIE JEST MODA. Czarny napis na tym żółtym ma kontrast 13,8:1. Poprzedni
   zielony przycisk z białym napisem miał 7,8:1 — też dobrze, ale nie tak. Na telefonie
   w pełnym słońcu, w rękawicy, ta różnica decyduje o tym, czy w ogóle widać, gdzie nacisnąć.
   To zresztą barwa tej branży: koparka, kamizelka odblaskowa, taśma ostrzegawcza —
   kolory, które istnieją po to, żeby rzucały się w oczy tam, gdzie jest jasno i brudno.

   CZERŃ TRZYMA NAWIGACJĘ, NIE TREŚĆ. Szyna, dolny pasek
   i belka telefonu są czarne, bo są stałe. Tabela na sto wierszy zostaje na papierze.
   ============================================================================== */
:root[data-motyw="zolty"]{
  --tlo:#100E10;        /* nawigacja: boczna szyna, dolny pasek, belka telefonu */
  --p0:#F2F2F2;         /* tło treści — dokładnie ich szarość */
  --p1:#FFFFFF; --p2:#FAFAFA; --wklesle:#EFEFEF;
  --t0:#100E10; --t1:#4A4A4C; --t2:#7C7C7F; --t3:#B0B0B3;
  --kr:rgba(16,14,16,.12); --kr2:rgba(16,14,16,.22); --kr3:rgba(16,14,16,.06);
  --akcent:#FFD741; --na-akcencie:#100E10;   /* czarny NA żółtym — 13,8:1 */
  --akcent-t:#6B4A00;   /* akcent użyty jako TEKST na białym: żółty jest nieczytelny
                           (1,4:1), więc rolę tekstu bierze ciemny bursztyn — 8,1:1 */
  --baza:#4F6B52;       /* leży w magazynie */
  --droga:#2F4B8F;      /* w drodze, czeka na potwierdzenie */
  --awaria:#C0271F;
  --uwaga:#8A5A00;
  --baza-tlo:rgba(79,107,82,.11); --droga-tlo:rgba(47,75,143,.10);
  --awaria-tlo:rgba(192,39,31,.09); --akcent-tlo:rgba(255,215,65,.26);
  --uwaga-tlo:rgba(138,90,0,.11);
  --r-s:4px; --r-m:8px; --r-l:12px; --r-xl:18px;   /* ostrzejsze rogi — narzędzie, nie aplikacja */
  --cien:0 1px 2px -1px rgba(16,14,16,.10), 0 12px 28px -20px rgba(16,14,16,.40);
  color-scheme:light;
}

/* Nawigacja na czerni — jedyne miejsce, gdzie treść leży na ciemnym tle.
   Aktywna pozycja to PEŁNE ŻÓŁTE POLE z czarnym napisem, nie podświetlenie:
   w szynie na osiemnaście pozycji delikatne tło gubi się po dwóch sekundach. */
:root[data-motyw="zolty"] .szyna{background:var(--tlo);border-right:0}
:root[data-motyw="zolty"] .szyna .marka b{color:#fff}
:root[data-motyw="zolty"] .szyna .marka small,
:root[data-motyw="zolty"] .szyna .wersja{color:rgba(255,255,255,.45)}
:root[data-motyw="zolty"] .szyna .marka .znak{background:var(--akcent);box-shadow:none}
:root[data-motyw="zolty"] .szyna .marka .znak i{background:#100E10}
:root[data-motyw="zolty"] .szyna .marka .znak i::after{background:#100E10}
:root[data-motyw="zolty"] .szyna .sekcja-menu{color:rgba(255,255,255,.38)}
:root[data-motyw="zolty"] .szyna nav a{color:rgba(255,255,255,.80)}
:root[data-motyw="zolty"] .szyna nav a:hover{background:rgba(255,255,255,.10);color:#fff}
:root[data-motyw="zolty"] .szyna nav a[aria-current="page"]{
  background:var(--akcent);color:#100E10;font-weight:600;box-shadow:none}
:root[data-motyw="zolty"] .szyna nav a[aria-current="page"] svg{opacity:1}
:root[data-motyw="zolty"] .szyna .kto{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.14)}
:root[data-motyw="zolty"] .szyna .kto b{color:#fff}
:root[data-motyw="zolty"] .szyna .kto span{color:rgba(255,255,255,.50)}
:root[data-motyw="zolty"] .szyna .motyw,
:root[data-motyw="zolty"] .szyna .wyjscie{
  background:rgba(255,255,255,.08);color:rgba(255,255,255,.80);border-color:rgba(255,255,255,.16);
}
:root[data-motyw="zolty"] .szyna .motyw:hover,
:root[data-motyw="zolty"] .szyna .wyjscie:hover{background:rgba(255,255,255,.16);color:#fff}

@media (max-width:900px){
  :root[data-motyw="zolty"] .gora{background:var(--tlo);border-bottom-color:rgba(255,255,255,.12)}
  :root[data-motyw="zolty"] .gora .marka b{color:#fff}
  :root[data-motyw="zolty"] .gora .marka small{color:rgba(255,255,255,.45)}
  :root[data-motyw="zolty"] .gora .marka .znak{background:var(--akcent)}
  :root[data-motyw="zolty"] .gora .marka .znak i,
  :root[data-motyw="zolty"] .gora .marka .znak i::after{background:#100E10}
  :root[data-motyw="zolty"] .gora .motyw{
    background:rgba(255,255,255,.10);color:#fff;border-color:rgba(255,255,255,.18);
  }
  :root[data-motyw="zolty"] .dol{background:var(--tlo);border-top-color:rgba(255,255,255,.12)}
  :root[data-motyw="zolty"] .dol a,:root[data-motyw="zolty"] .dol summary{color:rgba(255,255,255,.62)}
  :root[data-motyw="zolty"] .dol a[aria-current="page"],
  :root[data-motyw="zolty"] .dol summary.aktywna{color:var(--akcent)}
  :root[data-motyw="zolty"] .dol a[aria-current="page"]::before,
  :root[data-motyw="zolty"] .dol summary.aktywna::before{background:var(--akcent)}
  :root[data-motyw="zolty"] .dol .arkusz{background:var(--tlo);border-color:rgba(255,255,255,.14)}
  :root[data-motyw="zolty"] .dol .arkusz a{color:rgba(255,255,255,.82)}
  :root[data-motyw="zolty"] .dol .arkusz .sekcja-menu{color:rgba(255,255,255,.38)}
  :root[data-motyw="zolty"] .dol .arkusz a:hover{background:rgba(255,255,255,.10);color:#fff}
  :root[data-motyw="zolty"] .dol .arkusz a[aria-current="page"]{background:var(--akcent);color:#100E10}
}

*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}

/* `hidden` MA CHOWAĆ. Przeglądarka ma własną regułę `[hidden]{display:none}`, ale leży
   ona w arkuszu przeglądarki — a nasza `.osoba-kafel{display:grid}` jest tak samo
   szczegółowa i pochodzi z arkusza strony, więc wygrywa. Skutek: filtr osób ustawiał
   `hidden` na dwudziestu kafelkach i wszystkie DALEJ BYŁY WIDAĆ. Wyszło dopiero w teście
   sprawdzającym widoczność, nie samo istnienie atrybutu. Jedno `!important` na całą
   aplikację jest tańsze niż pamiętanie o tym przy każdym nowym `display:` w tym pliku. */
[hidden]{display:none !important}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--tlo);color:var(--t0);
  font-family:var(--f);font-size:15px;line-height:1.55;
  font-variant-numeric:tabular-nums;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
a{color:inherit}
::selection{background:var(--akcent);color:var(--na-akcencie)}
:focus-visible{outline:2px solid var(--akcent-t);outline-offset:2px;border-radius:3px}

/* ================================================== pola wyboru (checkbox) ===
   Natywny kwadracik przeglądarki jest najszybszym sygnałem, że interfejsu nikt nie
   projektował: ma inny kształt w każdym systemie, nie zna naszej palety i jest
   o połowę za mały na dotyk w rękawicy. Rysujemy własny — 20 px, z polem trafienia
   rozszerzonym do 44 px pseudoelementem, żeby wielkość celu nie zależała od wyglądu. */
input[type=checkbox],input[type=radio]{
  appearance:none;-webkit-appearance:none;position:relative;flex:none;
  width:20px;height:20px;margin:0;cursor:pointer;
  background:var(--p1);border:1.5px solid var(--kr2);border-radius:5px;
  transition:background .12s var(--e),border-color .12s var(--e);
}
input[type=radio]{border-radius:50%}
input[type=checkbox]::after{
  content:"";position:absolute;inset:-12px;                /* pole trafienia 44 px */
}
input[type=checkbox]:hover,input[type=radio]:hover{border-color:var(--t2)}
input[type=checkbox]:checked,input[type=radio]:checked{
  background:var(--akcent);border-color:var(--akcent);
}
/* Ptaszek rysowany tłem, nie znakiem — znak zależałby od kroju pisma. */
input[type=checkbox]:checked{
  background-image:linear-gradient(var(--akcent),var(--akcent)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.2 8.4l3 3 6.4-7' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-size:100% 100%,13px 13px;background-position:center,center;background-repeat:no-repeat;
}
input[type=radio]:checked{box-shadow:inset 0 0 0 4px var(--p1)}
input[type=checkbox]:indeterminate{
  background:var(--akcent);border-color:var(--akcent);
  background-image:linear-gradient(var(--akcent),var(--akcent)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 8h8' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round'/%3E%3C/svg%3E");
  background-size:100% 100%,13px 13px;background-position:center,center;background-repeat:no-repeat;
}
input[type=checkbox]:focus-visible,input[type=radio]:focus-visible{
  outline:2px solid var(--akcent-t);outline-offset:2px;
}

/* ============================================== paski przewijania ============
   Natywny pasek Windowsa na czarnej szynie to biała rynna z przyciskami-strzałkami.
   Nie da się go „prawie nie zauważyć" — a pasek przewijania ma być właśnie
   niezauważalny, dopóki nie jest potrzebny.

   PUŁAPKA, PRZEZ KTÓRĄ TE STYLE NIE DZIAŁAŁY (naprawione w 5.17.0).
   Były tu naraz dwa sposoby opisania paska: nowy standardowy (`scrollbar-width`,
   `scrollbar-color`) i stary `::-webkit-scrollbar`, który jako jedyny pozwala
   podać szerokość, zaokrąglenie i przezroczystą rynnę. Chrome i Edge od wersji 121
   **wyłączają `::-webkit-scrollbar` na elemencie, który ma ustawione którekolwiek
   z dwóch pierwszych** — i robią to po cichu. Użytkownik na Windowsie oglądał więc
   systemowy pasek, mimo że własny był napisany od początku do końca.

   Dlatego standardowe własności siedzą w `@supports not selector(::-webkit-scrollbar)`:
   dostaje je wyłącznie przeglądarka, która starego sposobu nie zna (Firefox).
   Jedna droga na jedną przeglądarkę — nigdy obie naraz na tym samym elemencie. */
*::-webkit-scrollbar{width:9px;height:9px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:var(--kr2);border-radius:99px;
  border:2px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:var(--t3);background-clip:content-box}
*::-webkit-scrollbar-corner{background:transparent}
.szyna nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,.22);background-clip:content-box}
.szyna nav::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.36);background-clip:content-box}
@supports not selector(::-webkit-scrollbar){
  *{scrollbar-width:thin;scrollbar-color:var(--kr2) transparent}
  .szyna nav{scrollbar-color:rgba(255,255,255,.22) transparent}
}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important;scroll-behavior:auto!important}}

/* ================================================================ powłoka === */
.powloka{display:grid;grid-template-columns:var(--szyna) 1fr;min-height:100vh}

/* --- szyna boczna (biuro) --- */
.szyna{
  position:sticky;top:0;align-self:start;height:100vh;
  background:var(--p0);border-right:1px solid var(--kr);
  display:flex;flex-direction:column;padding:16px 12px 12px;
}
.marka{
  display:flex;align-items:center;gap:11px;text-decoration:none;color:inherit;
  padding:0 8px 14px;margin-bottom:2px;
}
.marka .znak{
  flex:none;width:34px;height:34px;border-radius:9px;background:var(--p2);
  border:1px solid var(--kr2);display:grid;place-items:center;
}
.marka .znak i{display:block;width:2px;height:15px;background:var(--akcent);border-radius:1px}
.marka .znak i::after{content:"";display:block;width:8px;height:8px;margin:13px 0 0 -3px;
  background:var(--akcent);border-radius:0 0 3px 3px;clip-path:polygon(50% 100%,0 0,100% 0)}
.marka > span{min-width:0}
.marka b{font-size:var(--t-b);font-weight:700;letter-spacing:-.02em;line-height:1.15;display:block}
.marka small{display:block;font-family:var(--fm);font-size:var(--t-xs);font-weight:500;
  letter-spacing:.07em;text-transform:uppercase;color:var(--t2);margin-top:2px}

.szyna nav{display:flex;flex-direction:column;gap:2px;flex:1;min-height:0;overflow-y:auto}
.szyna nav a{
  display:flex;align-items:center;gap:11px;padding:6px 12px;border-radius:var(--r-m);text-decoration:none;
  color:var(--t1);font-size:var(--t-m);font-weight:500;letter-spacing:-.005em;
  transition:background .15s var(--e),color .15s var(--e);
}
.szyna nav a svg{flex:none;width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.6;
  stroke-linecap:round;stroke-linejoin:round;opacity:.85}
.szyna nav a:hover{background:var(--p1);color:var(--t0)}
/* Wybrana pozycja: całe pole w lekkim kolorze akcentu, bez kreski z boku. Kreska na zaokrąglonym
   polu wyglądała jak nawias „(" — zgłoszenie Sławka 30.09.2026 (5.49.2). */
.szyna nav a[aria-current="page"]{background:color-mix(in srgb,var(--akcent) 14%,var(--p1));color:var(--t0);font-weight:600;
  box-shadow:none}
.szyna nav a[aria-current="page"] svg{color:var(--akcent-t)}
.szyna nav a[aria-current="page"] svg{opacity:1}
.szyna nav a .licznik{margin-left:auto}

/* Nagłówek sekcji menu. Ma dzielić, a nie konkurować z pozycjami — stąd mały stopień,
   kolor najsłabszego tekstu i odstęp NAD, nie pod: odstęp jest tym, co naprawdę
   oddziela grupy, napis tylko je nazywa. Pierwszy nagłówek bez odstępu, bo nad nim
   jest już linia marki. */
.sekcja-menu{
  margin:9px 0 2px;padding:0 12px;
  font:600 var(--t-xs)/1 var(--f);letter-spacing:.1em;text-transform:uppercase;color:var(--t3);
}
.sekcja-menu:first-child{margin-top:0}

/* Gdy pozycji jest więcej, niż mieści okno, szyna przewija się — i musi to WYGLĄDAĆ
   na zamierzone. Ścięta w połowie pozycja przy dolnej krawędzi wygląda jak błąd;
   ta sama pozycja rozpływająca się w nic mówi „jest tego więcej, przewiń".
   Maska działa tylko wtedy, gdy jest co przewijać — stąd `mask-image` na kontenerze,
   który przy braku nadmiaru i tak niczego nie przycina. */
.szyna nav{mask-image:linear-gradient(to bottom,#000 calc(100% - 22px),transparent 100%);
  -webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 22px),transparent 100%)}

/* Licznik przy „Moje" i „Koszyk" — liczba rzeczy czekających na człowieka. */
.licznik{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:19px;height:19px;padding:0 5px;border-radius:999px;
  background:var(--akcent);color:var(--na-akcencie);
  font-family:var(--fm);font-size:var(--t-xs);font-weight:600;font-style:normal;line-height:1;
}

/* Stopka szyny: przelacznik motywu i wylogowanie stoja OBOK SIEBIE, nie jeden pod drugim.
   Ustawione pionowo zabieraly osiemdziesiat pikseli — czyli dwie pozycje menu — na rzeczy,
   po ktore siega sie raz dziennie i raz na tydzien. */
/* Stopka szyny w JEDNYM rzędzie. Trzy piętra (karta z nazwiskiem, przycisk motywu,
   wylogowanie) zajmowały 108 px — tyle, co trzy pozycje menu — na rzeczy, po które
   sięga się raz dziennie i raz na tydzień. */
.stopka-szyny{border-top:1px solid var(--kr);padding-top:8px;margin-top:8px;display:flex;
  align-items:center;gap:6px;flex-wrap:wrap}
/* Numer wersji: własna linia nad kontem. W rzędzie z nazwiskiem, motywem i wyjściem
   nie ma dla niego 226 px, a urwany numer wersji jest gorszy niż jego brak. */
.wersja{flex:1 0 100%;order:-1;padding:0 6px 6px;font-size:var(--t-xs);color:var(--t2);
  text-decoration:none;letter-spacing:.02em}
.wersja b{font-family:var(--fm);font-weight:600;letter-spacing:.04em}
.wersja:hover{color:var(--t0)}
.stopka-szyny .kto{flex:1 1 auto;min-width:0;padding:4px 6px;background:transparent;border:0;
  display:flex;align-items:center;gap:8px}
.stopka-szyny .kto:hover{background:var(--p1)}
.stopka-szyny .kto span.inicjaly{
  flex:none;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;
  background:var(--akcent);color:var(--na-akcencie);
  font:600 var(--t-xs)/1 var(--fm);letter-spacing:0;text-transform:none;
}
.stopka-szyny .kto b{flex:1 1 auto;min-width:0;font-size:var(--t-s)}
.stopka-szyny .rzad-konta{display:flex;gap:4px;flex:none}
/* Przycisk motywu schodzi do samej ikony: podpis „Jasny / Granat" i tak mówił tylko,
   co będzie po kliknięciu, a to widać po ikonie. Nazwa została w `aria-label`. */
.stopka-szyny .motyw{width:38px;padding:0}
.stopka-szyny .motyw b{display:none}
.stopka-szyny .motyw span{gap:0}
.stopka-szyny .wyjscie{width:38px;padding:0}
.stopka-szyny .wyjscie svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round}
.kto{
  flex:1;min-width:0;display:block;text-decoration:none;padding:8px 10px;border-radius:var(--r-m);
  background:var(--p1);border:1px solid var(--kr);transition:border-color .15s var(--e);
}
.kto:hover{border-color:var(--kr2)}
.kto span{display:block;font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.07em;
  text-transform:uppercase;color:var(--t2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.kto b{display:block;font-size:var(--t-m);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.motyw{
  width:100%;min-height:38px;border:1px solid var(--kr);border-radius:var(--r-m);
  background:var(--p1);color:var(--t1);cursor:pointer;padding:0 12px;
  font:inherit;transition:color .15s var(--e),border-color .15s var(--e);
}
.motyw span{display:flex;align-items:center;justify-content:center;gap:9px;min-height:36px}
.motyw b{font-size:var(--t-m);font-weight:600}
.motyw svg{width:16px;height:16px;flex:none;stroke:currentColor;fill:none;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round}
.motyw:hover{color:var(--t0);border-color:var(--kr2)}
/* Podpis mówi, co się stanie po kliknięciu, nie jaki motyw jest teraz.
   Trzy motywy chodzą w kółko: żółty → jasny → ciemny → żółty. */
.motyw > span{display:none}
:root[data-motyw="zolty"] .m-jasny{display:flex}
:root[data-motyw="jasny"] .m-ciemny{display:flex}
:root[data-motyw="ciemny"] .m-zolty{display:flex}
:root:not([data-motyw="zolty"]):not([data-motyw="jasny"]):not([data-motyw="ciemny"]) .m-jasny{display:flex}

.wyjscie{
  display:flex;align-items:center;justify-content:center;min-height:38px;padding:0 10px;
  border:1px solid var(--kr);border-radius:var(--r-m);background:var(--p1);text-decoration:none;
  color:var(--t2);font-size:var(--t-s);font-weight:500;transition:color .15s var(--e),border-color .15s var(--e);
}
.wyjscie:hover{color:var(--t0);border-color:var(--kr2)}

/* --- pasek górny (telefon) --- */
.gora{display:none}

/* --- obszar treści --- */
.plotno{background:var(--p0);min-width:0}
main{max-width:1120px;margin:0 auto;padding:30px 30px 72px;display:flex;flex-direction:column;gap:20px}

/* --- pasek dolny (telefon) --- */
.dol{display:none}

/* Na telefonie wszystko o stopień większe: ekran ogląda się w słońcu,
   w rękawicach i z odległości wyciągniętej ręki, a nie na biurku. */
@media (max-width:900px){
  body{font-size:16.5px}
  .pod{font-size:var(--t-m)}
  .oko,label,thead th,.kv dt,.kafel span,.odczyt-kto dt{font-size:var(--t-xs)}
  .plakietka{font-size:var(--t-xs);padding:4px 10px 4px 9px}
  .kv dd,.odczyt-kto dd{font-size:var(--t-l)}
  .powloka{grid-template-columns:1fr}
  .szyna{display:none}
  .gora{
    display:flex;align-items:center;gap:12px;position:sticky;top:0;z-index:30;
    padding:10px 16px;background:color-mix(in srgb, var(--p0) 88%, transparent);
    backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
    border-bottom:1px solid var(--kr);
  }
  .gora .marka{padding:0;margin:0;flex:1}
  /* 5.58.2: na telefonie sama ikonka (44 px). Napis „Jasny" zajmował najlepsze miejsce
     na górze ekranu, a w terenie motyw zmienia się raz, nie codziennie. */
  .gora .motyw{width:44px;min-height:44px;flex:none;padding:0;background:var(--p1)}
  .gora .motyw b{display:none}
  .gora .motyw span{gap:0}
  main{padding:20px 16px calc(96px + env(safe-area-inset-bottom))}
  .dol{
    display:grid;grid-auto-flow:column;grid-auto-columns:1fr;
    position:fixed;left:0;right:0;bottom:0;z-index:40;
    background:color-mix(in srgb, var(--p0) 90%, transparent);
    backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
    border-top:1px solid var(--kr);padding-bottom:env(safe-area-inset-bottom);
  }
  .dol a,.dol summary{
    position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    min-height:60px;text-decoration:none;color:var(--t2);cursor:pointer;list-style:none;
    font-family:var(--f);font-size:var(--t-xs);letter-spacing:-.005em;font-weight:600;
  }
  .dol a::marker,.dol summary::marker,.dol summary::-webkit-details-marker{display:none;content:""}
  .dol a svg,.dol summary svg{width:21px;height:21px;stroke:currentColor;fill:none;stroke-width:1.7;
    stroke-linecap:round;stroke-linejoin:round}
  /* Licznik siada na ikonie, nie pod podpisem — tak samo na pozycji i na „Więcej".
     Od 5.18.0 „Moje" jest w menu, więc to na trzech kropkach wisi liczba
     „ktoś Ci przekazał sprzęt i czeka na Twoje potwierdzenie". */
  .dol a .licznik,.dol summary .licznik{position:absolute;top:7px;left:calc(50% + 4px);
    min-width:17px;height:17px;font-size:var(--t-xs)}
  .dol a[aria-current="page"]{color:var(--akcent-t)}
  .dol a[aria-current="page"]::before{content:"";position:absolute;top:0;left:22%;right:22%;height:2px;
    background:var(--akcent);border-radius:0 0 2px 2px}
  .dol details[open] summary{color:var(--t0)}
  .dol summary.aktywna{color:var(--akcent-t)}
  .dol summary.aktywna::before{content:"";position:absolute;top:0;left:22%;right:22%;height:2px;
    background:var(--akcent);border-radius:0 0 2px 2px}
  .dol .arkusz{
    position:fixed;left:0;right:0;bottom:calc(60px + env(safe-area-inset-bottom));
    background:var(--p2);border-top:1px solid var(--kr2);box-shadow:var(--cien);
    padding:8px;display:flex;flex-direction:column;gap:2px;
    animation:wjedz .22s var(--e);
    /* Administrator ma w schowku czternascie pozycji — bez tego arkusz wychodzil
       poza ekran gora i dolne pozycje bylyby nieklikalne. */
    max-height:calc(100dvh - 130px);overflow-y:auto;
  }
  .dol .arkusz a{
    flex-direction:row;justify-content:flex-start;gap:12px;min-height:48px;padding:0 14px;
    border-radius:var(--r-m);font-family:var(--f);font-size:var(--t-b);letter-spacing:0;
    text-transform:none;color:var(--t0);font-weight:500;
  }
  .dol .arkusz a:hover{background:var(--p1)}
}
@keyframes wjedz{from{transform:translateY(12px);opacity:0}to{transform:none;opacity:1}}

/* ============================================================== typografia === */
h1{font-family:var(--f);font-size:clamp(1.5rem,1.12rem + 1.5vw,1.95rem);font-weight:700;letter-spacing:-.018em;line-height:1.1;margin:0;text-wrap:balance}
h2{font-family:var(--f);font-size:var(--t-l);font-weight:700;letter-spacing:-.008em;margin:0}
h3{font-size:var(--t-m);font-weight:600;margin:0}
p{margin:0 0 10px;max-width:68ch;color:var(--t1);text-wrap:pretty}
p:last-child{margin-bottom:0}
/* Tekst pomocniczy zwykłym krojem — monospace do zdań jest ciężki i szeroki,
   a na telefonie łamie każde zdanie na pięć linijek. Mono zostaje przy
   numerach, etykietach i nagłówkach tabel. */
.pod{font-size:var(--t-m);line-height:1.6;color:var(--t2)}
.oko{font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--t2)}
strong,b{font-weight:600}
main > h1{margin-bottom:-6px}

/* ================================================================== karty === */
/* Karta to kartka papieru położona na blacie, nie prostokąt obrysowany kreską.
   Uniesienie robi cień (pierścień 1px + dwie miękkie warstwy), nie ramka —
   dzięki temu przy pięciu kartach pod sobą ekran nie zamienia się w kratkę. */
.karta{
  background:var(--p1);border-radius:var(--r-l);
  box-shadow:0 0 0 1px var(--kr), 0 2px 4px -2px rgba(26,23,18,.09), 0 12px 26px -22px rgba(26,23,18,.30);
  padding:22px 24px;display:flex;flex-direction:column;gap:14px;
}
:root:not([data-motyw="jasny"]) .karta{box-shadow:0 0 0 1px var(--kr)}
.karta > h2 + p{margin-top:-8px}
.rzad{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.siatka{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}

/* --------- kafle liczbowe: odczyt z przyrządu, nie kartka z tabelką ------- */
.kafle{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(158px,1fr))}
a.kafel{text-decoration:none;color:inherit;transition:border-color .15s var(--e)}
a.kafel:hover{border-color:var(--kr2)}
.kafel{
  position:relative;background:var(--p1);border:1px solid var(--kr);border-radius:var(--r-l);
  padding:18px 18px 16px;overflow:hidden;
}
.kafel::before{content:"";position:absolute;left:18px;right:18px;top:0;height:2px;
  background:var(--kr2);border-radius:0 0 2px 2px}
.kafel b{
  display:block;font-family:var(--f);font-size:2.05rem;font-weight:700;letter-spacing:-.022em;line-height:1;
  font-variant-numeric:tabular-nums;
}
.kafel span{display:block;font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--t2);margin-top:9px}
.kafel.ost::before{background:var(--awaria)}
.kafel.ost b{color:var(--awaria)}

/* ============================================================== formularze === */
/* Etykieta pola ma się CZYTAĆ, a nie wyglądać technicznie. Kapitaliki w mono
   przy „Kiedy naprawdę (wpis wsteczny)" dawały napis nie do przeczytania. */
label{display:block;font-family:var(--f);font-size:var(--t-s);font-weight:600;letter-spacing:0;
  text-transform:none;color:var(--t1);margin-bottom:6px}
.pole{margin-bottom:14px}
.pole:last-child{margin-bottom:0}
/* Uwaga: `<input>` bez atrybutu type NIE pasuje do `input[type=text]`.
   Dlatego wybieramy przez wykluczenie — inaczej jedno pole zostaje szare.

   Wykluczenia siedzą w `:where()`, bo `:where()` NIE PODNOSI szczegółowości. Pięć gołych
   `:not()` dawało tej regule wagę (0,5,1) — więcej, niż da się napisać na pojedyncze pole.
   Skutek: lupa dostawiona do pola szukania osoby nie miała jak zrobić sobie miejsca
   (`padding-left` z reguły na to jedno pole przegrywał ze skrótem `padding` stąd)
   i wjeżdżała pod napis. Po zmianie ta reguła waży tyle, co samo `input` — czyli jest
   tym, czym miała być: ustawieniem domyślnym, które każda konkretniejsza reguła bije. */
input:where(:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=hidden])),
select,textarea{
  width:100%;background-color:var(--wklesle);color:var(--t0);
  border:1px solid var(--kr);border-radius:var(--r-m);
  padding:11px 13px;font:inherit;font-size:var(--t-b);
  transition:border-color .15s var(--e),box-shadow .15s var(--e);
}
input::placeholder,textarea::placeholder{color:var(--t3)}
input:hover,select:hover,textarea:hover{border-color:var(--kr2)}
input:focus,select:focus,textarea:focus{
  outline:none;border-color:var(--akcent);box-shadow:0 0 0 3px var(--akcent-tlo);
}
input[type=file]{padding:8px 10px;cursor:pointer}
input[type=file]::file-selector-button{
  margin-right:12px;min-height:30px;padding:0 13px;border-radius:var(--r-s);
  background:var(--p2);color:var(--t0);border:1px solid var(--kr2);
  font:inherit;font-size:var(--t-m);font-weight:600;cursor:pointer;
}
input[type=file]::file-selector-button:hover{background:var(--p1)}
select{appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,var(--t2) 50%),linear-gradient(135deg,var(--t2) 50%,transparent 50%);
  background-position:calc(100% - 17px) 50%,calc(100% - 12px) 50%;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:34px}

/* ============================================================== przyciski === */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:42px;padding:0 17px;border-radius:var(--r-m);
  background:var(--p1);color:var(--t0);border:1px solid var(--kr2);
  font-family:var(--f);font-size:var(--t-b);font-weight:600;letter-spacing:-.005em;
  box-shadow:0 1px 2px -1px rgba(26,23,18,.10);
  text-decoration:none;cursor:pointer;white-space:nowrap;
  transition:background .15s var(--e),border-color .15s var(--e),transform .1s var(--e);
}
.btn:hover{background:var(--p2);border-color:var(--t3)}
.btn:active{transform:scale(.975)}
.btn.pri{background:var(--akcent);color:var(--na-akcencie);border-color:transparent;font-weight:700;
  box-shadow:0 2px 6px -2px color-mix(in srgb,var(--akcent) 55%,transparent)}
.btn.pri:hover{filter:brightness(1.07);background:var(--akcent)}
.btn.zly{color:var(--awaria);border-color:color-mix(in srgb,var(--awaria) 45%,transparent);background:transparent}
.btn.zly:hover{background:var(--awaria-tlo)}
/* Nieaktywny przycisk NIE jest przygaszonym przyciskiem akcji. `opacity:.4` na żółtym
   dawało bladożółtą plamę, która wygląda na zepsuty element, a nie na „jeszcze nie teraz".
   Nieaktywny = obojętny: szare tło, szary napis, zero koloru akcji. */
.btn[disabled],.btn[aria-disabled="true"]{
  background:var(--wklesle);color:var(--t3);border-color:var(--kr);
  box-shadow:none;cursor:default;pointer-events:none;filter:none;
}
.btn.pri[disabled]{background:var(--wklesle);color:var(--t3);border-color:var(--kr)}
/* Karta i formularz to kolumny flex — pojedynczy przycisk rozciągałby się
   na całą szerokość i wyglądał jak pas. Trzyma się lewej krawędzi. */
.karta > .btn,.karta > form > .btn,form.karta > .btn{align-self:flex-start}
@media (max-width:900px){.btn{min-height:48px;padding:0 18px}.btn.pri{min-height:52px}}

/* Filtry to nie akcje — wybór, nie „zrób to teraz”. Bursztyn zostaje
   przy jednej akcji na ekranie, filtr dostaje jasny stan wybrania. */
/* `gap`, a nie spacja w HTML: pojemnik `inline-flex` POMIJA węzły tekstowe złożone
   z samych spacji, więc „Z magazynu <b>0</b>" sklejało się w „Z magazynu0". */
.chip{
  display:inline-flex;align-items:center;gap:5px;min-height:34px;padding:0 13px;border-radius:999px;
  background:transparent;color:var(--t2);border:1px solid var(--kr);
  font-size:var(--t-m);font-weight:500;text-decoration:none;white-space:nowrap;
  transition:color .15s var(--e),border-color .15s var(--e),background .15s var(--e);
}
.chip:hover{color:var(--t0);border-color:var(--kr2)}
.chip.wybrany{background:var(--p2);color:var(--t0);border-color:var(--kr2);font-weight:600;
  box-shadow:inset 0 0 0 1px var(--kr2)}
@media (max-width:900px){.chip{min-height:40px}}

/* ================================================================= tabele === */
.tabela{
  background:var(--p1);border:1px solid var(--kr);border-radius:var(--r-l);
  overflow-x:auto;overflow-y:hidden;
}
table{width:100%;border-collapse:collapse;font-size:var(--t-b)}
th,td{text-align:left;padding:12px 16px;vertical-align:middle}
/* Nagłówek kolumny: krój TREŚCI, nie mono. Mono w wersalikach na 9,5 px daje napis,
   który się rozpoznaje z kształtu, a nie czyta — a nagłówek kolumny czyta się raz,
   przy pierwszym spotkaniu z tabelą, i wtedy musi być jednoznaczny. */
thead th{
  font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.055em;text-transform:uppercase;
  color:var(--t2);white-space:nowrap;padding-top:13px;padding-bottom:11px;
  border-bottom:1px solid var(--kr);
}
tbody tr{border-bottom:1px solid var(--kr3)}
tbody tr:last-child{border-bottom:0}
tbody tr:hover{background:var(--p2)}
tbody td{color:var(--t1)}
td.nr,th.nr{font-family:var(--fm);font-size:var(--t-m);font-weight:600;color:var(--t0);white-space:nowrap;letter-spacing:.02em}
td.gdzie{color:var(--t2);font-size:var(--t-m)}
td a{text-decoration:none;color:var(--t0);font-weight:600}
td a:hover{color:var(--akcent-t)}
tbody tr:hover td.nr a{color:var(--akcent-t)}

/* Na telefonie tabela przestaje być tabelą. Cztery kolumny na 390 px to
   łamanie każdej nazwy na trzy linie — zamiast tego jeden wiersz to jedna
   kartka, z numerem inwentarzowym na górze. */
@media (max-width:640px){
  .tabela{border-radius:var(--r-l);overflow:hidden}
  table,tbody,tr,td{display:block;width:auto}
  thead{display:none}
  tbody tr{padding:14px 16px}
  th,td{padding:0}
  td.nr{font-size:var(--t-l);margin-bottom:3px}
  td.nr a{color:var(--t0)}
  tbody td{color:var(--t1);font-size:var(--t-b)}
  tbody td:empty{display:none}
  td.gdzie{margin-top:4px;font-size:var(--t-s);letter-spacing:0}
  tbody td + td{margin-top:5px}
  /* Skoro nagłówki tabeli znikają, kolumna musi powiedzieć sama, czym jest. */
  td[data-l]::before{content:attr(data-l);display:block;
    font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.06em;text-transform:uppercase;
    color:var(--t2);margin-bottom:2px}
  td.nr[data-l]::before{margin-bottom:1px}
  th.pr,td.pr{text-align:left}
}

/* =============================================================== plakietki === */
/* Plakietka stanu pisana KROJEM TREŚCI, normalną pisownią.
   Mono wersalikami („AWARIA", „28 DNI PO TERMINIE") było trzecim krojem na ekranie
   i przy pięciu plakietkach w jednej tabeli robiło się głośno — a wersaliki czyta się
   wolniej, bo słowo traci kształt. Mono zostaje tam, gdzie zarabia na siebie:
   przy numerze inwentarzowym, gdzie pomyłka 0 z O kosztuje wyjazd na budowę. */
.plakietka{
  display:inline-flex;align-items:center;gap:5px;
  font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:0;text-transform:none;
  padding:3px 9px 3px 8px;border-radius:var(--r-s);white-space:nowrap;
  background:var(--p2);color:var(--t1);border:1px solid var(--kr);
}
.plakietka::before{content:"";width:5px;height:5px;border-radius:50%;background:currentColor;flex:none}
.p-baza{color:var(--baza);background:var(--baza-tlo);border-color:color-mix(in srgb,var(--baza) 25%,transparent)}
.p-poj{color:var(--droga);background:var(--droga-tlo);border-color:color-mix(in srgb,var(--droga) 25%,transparent)}
.p-aw{color:var(--awaria);background:var(--awaria-tlo);border-color:color-mix(in srgb,var(--awaria) 30%,transparent)}
.p-a{color:var(--t1);background:var(--p2);border-color:var(--kr2)}
.p-uwaga{color:var(--uwaga);background:var(--uwaga-tlo);border-color:color-mix(in srgb,var(--uwaga) 28%,transparent)}

/* =============================================================== komunikat === */
.komunikat{
  position:relative;background:var(--p1);border:1px solid var(--kr);border-radius:var(--r-l);
  padding:15px 18px 15px 20px;font-size:var(--t-b);color:var(--t1);overflow:hidden;
}
.komunikat::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--akcent)}
.komunikat.ok::before{background:var(--baza)}
.komunikat.zly::before{background:var(--awaria)}
/* Tylko PIERWSZY <b> jest nagłówkiem komunikatu. Bez `:first-child` każde
   pogrubienie w treści przechodziło do nowej linii i rozbijało zdanie. */
.komunikat > b:first-child{display:block;font-family:var(--f);font-size:var(--t-xs);font-weight:600;
  letter-spacing:.06em;text-transform:uppercase;color:var(--t2);margin-bottom:6px}
.komunikat a{color:var(--akcent-t);font-weight:600;text-decoration:underline;text-underline-offset:3px}
code{font-family:var(--fm);font-size:.88em;background:var(--wklesle);border:1px solid var(--kr);
  border-radius:var(--r-s);padding:1px 6px;color:var(--t0);overflow-wrap:anywhere}

/* ================================================== odczyt (karta pozycji) === */
.wroc{
  display:inline-flex;align-items:center;gap:7px;text-decoration:none;color:var(--t2);
  font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  transition:color .15s var(--e);margin-bottom:-8px;
}
.wroc::before{content:"←";font-family:var(--f);font-size:var(--t-s);letter-spacing:0}
.wroc:hover{color:var(--t0)}

.odczyt{
  background:var(--p1);border:1px solid var(--kr);border-radius:var(--r-l);
  padding:24px;display:grid;grid-template-columns:1fr auto;gap:28px;align-items:start;
}
.odczyt .numer{
  font-family:var(--fm);font-weight:600;font-size:clamp(2.1rem,1.2rem + 3.4vw,3.1rem);
  letter-spacing:.005em;line-height:1;margin:6px 0 10px;color:var(--t0);
}
.odczyt h1{font-size:var(--t-xl);font-weight:600;letter-spacing:-.012em;color:var(--t1);line-height:1.35}
.odczyt .rzad{margin-top:12px}
.odczyt .rzad:empty{display:none}
.odczyt-kto{
  margin:0;display:flex;flex-direction:column;gap:14px;min-width:210px;
  padding-left:24px;border-left:1px solid var(--kr);
}
.odczyt-kto dt{font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--t2);margin-bottom:3px}
.odczyt-kto dd{margin:0;font-size:var(--t-l);font-weight:600;color:var(--t0)}
/* Rzecz leżąca w magazynie nie ma ani budowy, ani daty wydania — wtedy ta kolumna
   jest pusta i zostawałaby po niej sama kreska. Pusta ramka udaje informację. */
.odczyt-kto:empty{display:none}
@media (max-width:760px){
  .odczyt{grid-template-columns:1fr;gap:20px;padding:20px}
  .odczyt-kto{flex-direction:row;flex-wrap:wrap;gap:18px 28px;padding:18px 0 0;
    border-left:0;border-top:1px solid var(--kr);min-width:0}
}

/* ========================================================= dane pozycji ===== */
.kv{display:grid;grid-template-columns:auto 1fr;gap:9px 20px;margin:0;align-items:baseline}
.kv dt{font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--t2)}
.kv dd{margin:0;font-size:var(--t-b);font-weight:500;color:var(--t0)}

.hist{display:flex;flex-direction:column;gap:0;position:relative}
.hist div{display:grid;grid-template-columns:132px 1fr;gap:14px;padding:9px 0 9px 18px;position:relative;
  border-bottom:1px solid var(--kr3);font-size:var(--t-m);color:var(--t1)}
.hist div:last-child{border-bottom:0}
.hist div::before{content:"";position:absolute;left:3px;top:16px;width:5px;height:5px;border-radius:50%;
  background:var(--t3)}
.hist div:first-child::before{background:var(--akcent)}
.hist div::after{content:"";position:absolute;left:5px;top:21px;bottom:-9px;width:1px;background:var(--kr)}
.hist div:last-child::after{display:none}
.hist time{font-family:var(--fm);font-size:var(--t-xs);color:var(--t2);white-space:nowrap}
.hist a{text-decoration:none;color:var(--t0);font-weight:600;transition:color .15s var(--e)}
.hist a:hover{color:var(--akcent-t)}
@media (max-width:600px){.hist div{grid-template-columns:1fr;gap:2px}}

/* ============================================== etap 2: skaner i przekazania === */
.btn.duzy{min-height:52px;padding:0 24px;font-size:var(--t-l)}
@media (max-width:900px){.btn.duzy{min-height:58px;width:100%}}
.btn.szeroki{width:100%;justify-content:center}
.btn.maly{min-height:32px;padding:0 11px;font-size:var(--t-s);font-weight:500}

.skaner-karta{padding:16px}
.skaner{
  position:relative;aspect-ratio:4/3;border-radius:var(--r-l);overflow:hidden;
  background:var(--wklesle);border:1px solid var(--kr);display:grid;place-items:center;
}
.skaner video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;
  transition:opacity .3s var(--e)}
.skaner.aktywny video{opacity:1}
.skaner-info{
  position:relative;z-index:2;max-width:32ch;text-align:center;color:var(--t1);font-size:var(--t-b);
  background:color-mix(in srgb,var(--p1) 82%,transparent);padding:9px 14px;border-radius:var(--r-m);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);margin:0;
}
.skaner-info.ok{color:var(--baza)} .skaner-info.zle{color:var(--awaria)}
/* Celownik: cztery narożniki, nie ramka. Ramka zasłania to, co się skanuje. */
.celownik{position:absolute;inset:16% 14%;z-index:1;pointer-events:none;opacity:0;transition:opacity .3s var(--e)}
.skaner.aktywny .celownik{opacity:1;animation:oddech 2.4s var(--e) infinite}
.celownik i{position:absolute;width:26px;height:26px;border:2px solid var(--akcent)}
.celownik i:nth-child(1){top:0;left:0;border-right:0;border-bottom:0;border-radius:8px 0 0 0}
.celownik i:nth-child(2){top:0;right:0;border-left:0;border-bottom:0;border-radius:0 8px 0 0}
.celownik i:nth-child(3){bottom:0;left:0;border-right:0;border-top:0;border-radius:0 0 0 8px}
.celownik i:nth-child(4){bottom:0;right:0;border-left:0;border-top:0;border-radius:0 0 8px 0}
@keyframes oddech{0%,100%{opacity:1}50%{opacity:.45}}
.skaner.trafiony{box-shadow:inset 0 0 0 3px var(--baza)}

.przelacz{display:flex;align-items:flex-start;gap:11px;color:var(--t1);font-size:var(--t-b);
  cursor:pointer;padding:11px 13px;text-transform:none;letter-spacing:0;font-family:var(--f);
  border:1px solid var(--kr);border-radius:var(--r-m);background:var(--p0);margin-bottom:8px;
  transition:border-color .15s var(--e),background .15s var(--e)}
.przelacz:hover{border-color:var(--kr2)}
.przelacz:has(input:checked){border-color:var(--akcent);background:var(--akcent-tlo)}
.przelacz input{width:20px;height:20px;accent-color:var(--akcent);margin:2px 0 0;flex:none}
.przelacz b{color:var(--t0);font-weight:600}
.przelacz .pod{font-size:var(--t-s);line-height:1.45}

.zebrany{
  display:flex;align-items:baseline;gap:12px;padding:11px 16px;background:var(--p1);
  border:1px solid var(--kr);border-radius:var(--r-m);margin-top:8px;animation:wjedz .2s var(--e);
}
.zebrany b{font-family:var(--fm);font-size:var(--t-m);font-weight:600}
.zebrany span{color:var(--t1);font-size:var(--t-b)}

.lista-potw{display:flex;flex-direction:column;gap:10px}
.potw{
  display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;
  padding:14px 16px;background:var(--p2);border:1px solid var(--kr);border-radius:var(--r-l);
  border-left:3px solid var(--droga);
}
.potw > div:first-child{display:flex;flex-direction:column;gap:2px;min-width:0}
.potw span{color:var(--t1);font-size:var(--t-b)}
.numer-mini{font-family:var(--fm);font-size:var(--t-b);font-weight:600;color:var(--t0)}
.spozniony{color:var(--uwaga)!important}

.rozwin{border-top:1px solid var(--kr3);padding-top:14px}
.rozwin > summary{
  cursor:pointer;list-style:none;color:var(--t1);font-weight:600;font-size:var(--t-b);
  display:flex;align-items:center;gap:8px;padding:6px 0;min-height:40px;
}
.rozwin > summary::-webkit-details-marker{display:none}
.rozwin > summary::before{content:"+";font-family:var(--fm);color:var(--t2);font-size:var(--t-l)}
.rozwin[open] > summary::before{content:"–"}
.rozwin > summary:hover{color:var(--t0)}
.rozwin > form{padding-top:8px}
/* Rozwijane W KOMÓRCE TABELI nie rysuje kreski nad sobą — tam kreski robi tabela,
   a nasza wisiała jako urwany odcinek nad słowem „Zmień". */
.tabela .rozwin{border-top:0;padding-top:0}
.tabela .rozwin > summary{justify-content:flex-end;min-height:34px;white-space:nowrap}
.tabela .rozwin[open] > summary{color:var(--t0)}
.tabela .rozwin form{text-align:left;white-space:normal}
/* Rozwijane, którego podgląd MA wyglądać jak zwykły przycisk (details+summary
   tylko po to, żeby kliknięcie otworzyło formularz obok) — bez znaczka +/– i
   bez rozciągania na całą szerokość, którego .rozwin normalnie chce dla
   podpisów w stylu "pokaż więcej". */
.rozwin > summary.btn{display:inline-flex;width:auto}
.rozwin > summary.btn::before{content:none}
.tabela .rozwin > summary.btn{justify-content:center}
/* `.rozwin > summary` waży więcej niż `.btn` i zabierał przyciskowi boczne odstępy
   (padding 6px 0), a w tabeli wysokość (34px). Wymiary wracają do tych z `.btn`. */
.rozwin > summary.btn, .tabela .rozwin > summary.btn{padding:0 17px;min-height:42px;font-size:var(--t-b)}
/* Rozwijane, które JEST czynnością, a nie przypisem. Na karcie sprzętu „Przekaż
   komuś innemu" wyglądało jak szary podpis obok wielkiego „Przejmuję" i ginęło —
   a to jest jedna z trzech rzeczy, które się na tej karcie robi. */
.rozwin.przycisk{border-top:0;padding-top:0;margin-top:10px}
.rozwin.przycisk > summary{
  justify-content:center;gap:10px;min-height:48px;padding:0 20px;
  border:1px solid var(--kr2);border-radius:var(--r-m);background:var(--p1);
  color:var(--t0);font-size:var(--t-l);
  transition:border-color .18s var(--e),background .18s var(--e);
}
.rozwin.przycisk > summary:hover{border-color:var(--akcent);background:var(--akcent-tlo)}
.rozwin.przycisk[open] > summary{border-bottom-left-radius:0;border-bottom-right-radius:0;background:var(--wklesle)}
.rozwin.przycisk[open] > form{
  border:1px solid var(--kr2);border-top:0;border-radius:0 0 var(--r-m) var(--r-m);
  padding:16px;margin-top:-1px;
}
.akcje-karty{gap:10px}
.akcje-karty > form{flex:1 1 220px;margin:0}
.akcje-karty .btn{width:100%}

.wstep{max-width:70ch;color:var(--t1);font-size:var(--t-l);margin:-4px 0 2px}
.kroki{margin:0;padding-left:1.3em;color:var(--t1);display:flex;flex-direction:column;gap:8px}
.kroki li{padding-left:4px}
.kroki b{color:var(--t0)}

/* ============================================== pulpit: sprawy i wykresy === */
/* Pulpit nie jest tablicą liczb, tylko listą spraw do załatwienia. Siedem
   jednakowych kafelków („12 pozycji" tak samo głośno jak „3 w awarii") nie mówiło
   nic — teraz każdy wiersz ma czynność i przycisk, a liczby są tłem, nie treścią. */
.pas-gorny{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;flex-wrap:wrap}
.pas-gorny h1{margin-bottom:2px}

.sprawy{gap:0;padding:0}
.sprawy > .rzad{padding:18px 24px 14px;border-bottom:1px dashed var(--kr2)}
.sprawa{display:grid;grid-template-columns:48px 1fr auto;align-items:center;gap:18px;
  padding:15px 24px;border-bottom:1px solid var(--kr3)}
.sprawa:last-child{border-bottom:0}
.sprawa .bel{width:48px;height:48px;border-radius:var(--r-m);display:grid;place-items:center;
  font-family:var(--fm);font-weight:600;font-size:var(--t-l);font-variant-numeric:tabular-nums;
  background:var(--p2);color:var(--t1);border:1px solid var(--kr)}
.sprawa.zle .bel{background:var(--awaria-tlo);color:var(--awaria);border-color:transparent}
.sprawa.uwaga .bel{background:var(--uwaga-tlo);color:var(--uwaga);border-color:transparent}
.sprawa.akcja .bel{background:var(--akcent-tlo);color:var(--akcent-t);border-color:transparent}
.sprawa .tresc{min-width:0}
.sprawa .tresc b{display:block;font-size:var(--t-l);font-weight:600;letter-spacing:-.012em}
.sprawa .tresc span{display:block;color:var(--t2);font-size:var(--t-m);overflow-wrap:anywhere}
.sprawa .btn{min-height:38px;padding:0 14px;font-size:var(--t-m)}
@media (max-width:620px){
  .sprawa{grid-template-columns:40px 1fr;gap:12px;padding:14px 18px}
  .sprawa .bel{width:40px;height:40px;font-size:var(--t-b)}
  .sprawa .btn{grid-column:1 / -1;justify-self:stretch;min-height:44px}
  .sprawy > .rzad{padding:16px 18px 12px}
}

/* Pasek proporcji: jedno spojrzenie i wiadomo, ile majątku jest w terenie. */
.proporcja{display:flex;height:44px;border-radius:var(--r-m);overflow:hidden;gap:3px}
.proporcja div{display:flex;align-items:center;padding-left:13px;min-width:0;
  font-size:var(--t-s);font-weight:600;white-space:nowrap;
  font-variant-numeric:tabular-nums}
/* Tło i napis chodzą PARAMI. Kolor napisu wpisany raz dla całego paska znaczy, że
   przy zmianie akcentu jeden kawałek robi się nieczytelny i nikt tego nie zauważa,
   bo pozostałe trzy wyglądają dobrze. Ta sama para obsługuje kwadracik w legendzie. */
.p-ludzi{background:var(--akcent);color:var(--na-akcencie)}
.p-w-bazie{background:var(--baza);color:#fff}
.p-w-naprawie{background:var(--awaria);color:#fff}
.p-wycofane{background:var(--t3);color:var(--t0)}
.legenda{display:flex;gap:8px 26px;flex-wrap:wrap;margin-top:-2px}
.legenda a{display:flex;align-items:center;gap:9px;font-size:var(--t-m);color:var(--t1);text-decoration:none;
  padding:4px 0;transition:color .15s var(--e)}
.legenda a:hover{color:var(--t0)}
.legenda s{width:9px;height:9px;border-radius:3px;text-decoration:none;flex:none}
.legenda b{font-family:var(--fm);font-weight:600;color:var(--t0);font-variant-numeric:tabular-nums}

/* `min-width:0` na dzieciach siatki. Bez tego element siatki nie schodzi poniżej
   szerokości swojej treści (domyślne `min-width:auto`) — wykres słupkowy rozpychał
   kartę do 413 px na ekranie szerokim na 390 i cała strona jechała w bok. */
.dwie{display:grid;grid-template-columns:1.08fr 1fr;gap:16px}
.dwie > *{min-width:0}
@media (max-width:900px){.dwie{grid-template-columns:1fr}}

.wielka{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:-4px 0 2px}
.wielka > b{font-family:var(--f);font-size:2rem;font-weight:700;letter-spacing:-.022em;line-height:1;
  font-variant-numeric:tabular-nums}
.wielka span{font-size:var(--t-m);color:var(--t2)}
.wielka span b{font-family:var(--fm);font-size:var(--t-l);color:var(--t0);font-variant-numeric:tabular-nums}
.wielka .wyr-uwaga{color:var(--uwaga)}

.wykres{display:block;width:100%;overflow:visible}
:root{--akcent-slaby:color-mix(in srgb,var(--akcent) 34%,var(--p1))}
.osx{display:flex;justify-content:space-between;font-family:var(--fm);font-size:var(--t-xs);color:var(--t3);margin-top:-4px}
.najdrozsze{border-top:1px solid var(--kr3);padding-top:12px;display:flex;flex-direction:column;gap:8px}
.najdrozsze a{display:flex;justify-content:space-between;gap:14px;text-decoration:none;font-size:var(--t-m);color:var(--t1)}
.najdrozsze a:hover em{color:var(--akcent-t)}
.najdrozsze em{font-style:normal;color:var(--t0);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.najdrozsze b{font-family:var(--fm);font-weight:600;color:var(--t0);white-space:nowrap;font-variant-numeric:tabular-nums}

/* Stan pusty ma mówić, co zrobić dalej — a nie „brak danych". */
.pusto{padding:18px 0;text-align:left}
.pusto b{display:block;font-size:var(--t-l);font-weight:600;margin-bottom:3px}
.pusto span{display:block;color:var(--t2);font-size:var(--t-m)}
.pusto a{color:var(--akcent-t);font-weight:600;text-decoration:underline;text-underline-offset:3px}

/* Podpowiedź pod polem: po co to pole i co się stanie, jak zostawić puste. */
.podpowiedz{font-size:var(--t-s);line-height:1.45;color:var(--t2);margin:6px 0 0;max-width:60ch}
.pole .podpowiedz{margin-bottom:0}

/* ================================================== pasek postępu spisu === */
/* Przy stu pozycjach jedyne, co się liczy w terenie, to „ile jeszcze zostało". */
.postep{display:flex;flex-direction:column;gap:9px}
.postep-pasek{height:12px;border-radius:999px;background:var(--wklesle);overflow:hidden;
  box-shadow:inset 0 0 0 1px var(--kr)}
.postep-pasek i{display:block;height:100%;background:var(--akcent);border-radius:999px;
  transition:width .3s var(--e)}
.postep-opis{font-size:var(--t-b);color:var(--t1)}
.postep-opis b{font-family:var(--fm);font-weight:600;color:var(--t0);font-variant-numeric:tabular-nums}
.wyr-uwaga{color:var(--uwaga);font-weight:600}
.wyr-droga{color:var(--droga);font-weight:600}
.protokol-sekcja{font-family:var(--f);font-size:var(--t-l);font-weight:700;letter-spacing:-.015em;
  margin:22px 0 4px;display:flex;align-items:baseline;gap:9px}
.protokol-sekcja span{font-family:var(--fm);font-size:var(--t-xs);font-weight:600;color:var(--t2);
  background:var(--p2);border:1px solid var(--kr);border-radius:999px;padding:1px 8px}
.protokol-podsumowanie{font-size:var(--t-l);color:var(--t1)}
.protokol-podsumowanie b{font-family:var(--fm);color:var(--t0);font-variant-numeric:tabular-nums}

/* ================================================= usterki i naprawy === */
/* Otwarta usterka to nie wiersz tabeli, tylko rzecz do załatwienia — dostaje
   własne pudełko z paskiem po lewej. Czerwony pasek = sprzęt stoi,
   pomarańczowy = pracuje, ale czeka na warsztat. */
.usterka{
  position:relative;background:var(--p1);border:1px solid var(--kr);border-radius:var(--r-l);
  padding:14px 16px 12px;margin-bottom:10px;overflow:hidden;
}
.usterka::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--uwaga)}
.usterka.blok::before{background:var(--awaria)}
.usterka > .rzad > div{min-width:0}
.usterka b{color:var(--t0);font-weight:600}
.usterka-nr{margin:0 0 3px}
.usterka-nr a{font-family:var(--fm);font-size:var(--t-b);font-weight:600;color:var(--t0);
  text-decoration:none;letter-spacing:.02em}
.usterka-nr a:hover{color:var(--akcent-t)}
.usterka-nr .pod{margin-left:8px}
.usterka .rozwin{border-top:1px solid var(--kr3)}
.usterka .rozwin > summary{font-size:var(--t-m)}

/* Wybór jeden z dwóch, opisany słowami. Sam napis „blokuje" nic nie znaczy
   człowiekowi, który stoi w błocie i chce wiedzieć, czy może dalej pracować. */
.wybor{display:flex;flex-direction:column;gap:8px}
.wybor > label{
  display:flex;gap:10px;align-items:flex-start;cursor:pointer;
  padding:10px 12px;border:1px solid var(--kr);border-radius:var(--r-m);background:var(--p0);
  transition:border-color .15s var(--e),background .15s var(--e);
}
.wybor > label:hover{border-color:var(--kr2)}
.wybor > label:has(input:checked){border-color:var(--akcent);background:var(--akcent-tlo)}
.wybor input{margin-top:3px;flex:none}
.wybor .pod{font-size:var(--t-s)}

th.pr,td.pr{text-align:right}

/* ================================================================ naklejki === */
.naklejki{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(215px,1fr))}
/* Naklejka jest zawsze biało-czarna, niezależnie od motywu aplikacji — drukarka
   nie zna zmiennych CSS, a naklejka ma być czytelna po roku w błocie.
   Bohaterem jest NUMER: w terenie pada „gdzie jest N-0201", nie „gdzie jest zagęszczarka".
   Reszta linijek jest opcjonalna i włącza się w panelu nad wydrukiem. */
.nak{
  background:#fff;color:#000;border:1px solid #9aa2a0;border-radius:6px;
  padding:9px;display:flex;gap:10px;align-items:center;break-inside:avoid;
}
.nak svg{flex:none;width:76px;height:76px}
.nak.duza svg{width:104px;height:104px}
.nak.mala svg{width:58px;height:58px}
.nak .t{font-family:var(--fm);min-width:0;overflow-wrap:anywhere;line-height:1.25}
.nak .t b{display:block;font-size:var(--t-xl);font-weight:700;letter-spacing:.01em;color:#000}
.nak.duza .t b{font-size:25px}
.nak.mala .t b{font-size:var(--t-b)}
.nak .firma{display:block;font-size:var(--t-xs);font-weight:600;letter-spacing:.09em;
  text-transform:uppercase;color:#000;margin-bottom:2px}
.nak .t span{display:block;font-size:var(--t-xs);margin-top:3px;color:#333}
.nak .drobne{font-size:var(--t-xs);color:#555;margin-top:2px}

/* Panel „co ma się wydrukować" — na ekranie, nigdy na papierze. */
.nak-pola{display:flex;flex-wrap:wrap;gap:10px 18px;margin-bottom:14px}
.nak-pola label{display:flex;align-items:center;gap:7px;margin:0;
  font-family:var(--f);font-size:var(--t-b);letter-spacing:0;text-transform:none;color:var(--t1);cursor:pointer}
.nak-pola input{flex:none}
.nak-podglad{display:flex;gap:16px;align-items:center;flex-wrap:wrap;
  padding:14px;border:1px dashed var(--kr2);border-radius:var(--r-m);background:var(--wklesle)}

/* ==================================== zaznaczanie wielu pozycji na liście === */
th.zazn,td.zazn{width:44px;padding-right:0}
td.zazn input,th.zazn input{width:20px;height:20px;accent-color:var(--akcent);margin:0;cursor:pointer}
.zaznaczanie tbody tr:has(input:checked){background:var(--akcent-tlo)}
.pasek-zazn{
  position:sticky;bottom:0;z-index:20;margin-top:-1px;
  display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
  padding:12px 16px;border:1px solid var(--kr);border-top:0;
  border-radius:0 0 var(--r-l) var(--r-l);
  /* NIEPRZEZROCZYSTY. Mleczna szyba z rozmyciem przepuszczała czerwoną plakietkę
     „awaria" z wiersza pod spodem — wyglądało to na błąd rysowania, a nie na efekt.
     Pasek stoi NAD listą i ma zasłaniać to, co pod nim; cień mówi, że coś tam jest. */
  background:var(--p1);
  box-shadow:0 -10px 20px -14px rgba(0,0,0,.35);
}
/* ============================================================ terminy ==== */
/* Termin to nie wiersz tabeli, tylko kartka z badania: data jest bohaterem,
   a pilność widać z odległości po lewej krawędzi — bez czytania. */
.terminy-lista{display:flex;flex-direction:column;gap:12px}
.termin{
  border:1px solid var(--kr);border-left:4px solid var(--baza);border-radius:var(--r-m);
  padding:14px 16px;display:flex;flex-direction:column;gap:10px;background:var(--p1);
}
.termin.zbliza-sie{border-left-color:var(--uwaga);background:var(--uwaga-tlo)}
.termin.po-terminie{border-left-color:var(--awaria);background:var(--awaria-tlo)}
.termin-glowa{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:space-between}
.termin-glowa b{font:700 var(--t-l)/1.2 var(--f);color:var(--t0)}
.termin .kv{margin:0}
.data-mocna{font-family:var(--fm);font-weight:600;font-variant-numeric:tabular-nums;color:var(--t0)}
.btn.maly{min-height:36px;padding:0 12px;font-size:var(--t-m)}

/* ======================================================= kody obce ======= */
/* Surowa treść naklejki. Idzie monospacem i łamie się w dowolnym miejscu —
   kod Hilti bywa długim adresem, a obcięcie go wielokropkiem znaczyłoby,
   że nie da się porównać tego, co na ekranie, z tym, co na sprzęcie. */
.kod-surowy{
  font:600 var(--t-b)/1.45 var(--fm);color:var(--t0);margin:4px 0 0;
  word-break:break-all;overflow-wrap:anywhere;
}
.kod-wpis{
  display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap;
  border:1px solid var(--kr);border-left:4px solid var(--droga);border-radius:var(--r-m);
  padding:12px 14px;background:var(--p1);
}
.kod-wpis > div{min-width:0;flex:1 1 240px}

/* ======================================================= własne pola ===== */
/* Pary nazwa-wartość. Dwie równe kolumny na komputerze, jedna pod drugą na telefonie —
   pole nazwy ma być tak samo szerokie jak wartość, bo „Wysokość podnoszenia"
   to nie jest krótsza etykieta niż „Kolor". */
.cechy{display:flex;flex-direction:column;gap:8px}
.cecha{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.3fr);gap:8px}
@media (max-width:620px){.cecha{grid-template-columns:1fr}}
.cecha input{width:100%}

/* ============================================================== grupy ==== */
/* Podział rzeczowy przeniesiony z arkusza: nagłówek szuflady w tabeli i pigułki
   z licznikami nad listą. Nagłówek ma być czytelny jako PRZERWA, nie jako wiersz
   danych — stąd wcięcie na kolumnę zaznaczania i ciepłe tło. */
.grupa-naglowek td{
  background:var(--wklesle);border-top:1px solid var(--kr);border-bottom:1px solid var(--kr);
  font:600 var(--t-xs)/1 var(--f);letter-spacing:.07em;text-transform:uppercase;color:var(--t1);
  padding:9px 16px 9px 60px!important;
}
.grupa-naglowek td span{font-weight:500;color:var(--t2);text-transform:none;letter-spacing:.02em;margin-left:8px}
.grupa-naglowek td::before{content:none!important}
@media (max-width:900px){
  .grupa-naglowek td{padding-left:16px!important}
  .grupa-naglowek{display:block}
}
.chipy-grup{gap:6px;flex-wrap:wrap;margin:-6px 0 2px}
.chipy-grup .chip b{font-family:var(--fm);font-weight:600;color:var(--t2);margin-left:4px}
.chipy-grup .chip.wybrany b{color:var(--t0)}

/* =============================================================== kroki === */
/* Pasek kroków dla wydania i zwrotu. Powód: „Krok 1 z 2" napisane szarym tekstem
   w akapicie nie jest widoczne — człowiek nie wie, ile jeszcze przed nim ani że
   na końcu czeka protokół do podpisu. Krok zrobiony jest KLIKALNY i wraca do siebie. */
.krok-pasek{
  flex-direction:row;
  display:flex;align-items:center;gap:4px;flex-wrap:nowrap;
  list-style:none;margin:0 0 4px;padding:0;overflow-x:auto;-webkit-overflow-scrolling:touch;
}
.krok-pasek::-webkit-scrollbar{display:none}
.krok-pasek li{display:flex;align-items:center;gap:4px;flex:0 0 auto}
.krok-pasek li::after{
  content:"";width:7px;height:7px;flex:0 0 7px;margin:0 6px;
  border-right:2px solid var(--t3);border-top:2px solid var(--t3);transform:rotate(45deg);
}
.krok-pasek li:last-child::after{display:none}
.krok-pasek .krok{
  display:flex;align-items:center;gap:8px;padding:6px 12px 6px 6px;
  border-radius:999px;font:600 var(--t-s)/1 var(--f);color:var(--t2);
  text-decoration:none;white-space:nowrap;
}
.krok-pasek .n{
  width:24px;height:24px;flex:0 0 24px;border-radius:50%;
  display:grid;place-items:center;font:600 var(--t-xs)/1 var(--fm);
  background:var(--wklesle);color:var(--t2);border:1px solid var(--kr);
}
.krok-pasek .zrobiony .krok{color:var(--akcent-t)}
.krok-pasek .zrobiony .n{background:var(--akcent);color:var(--na-akcencie);border-color:transparent}
.krok-pasek .zrobiony .krok:hover{background:var(--akcent-tlo)}
.krok-pasek .teraz .krok{background:var(--p1);color:var(--t0);box-shadow:var(--cien-maly,0 1px 2px rgba(0,0,0,.06)),inset 0 0 0 1px var(--kr2)}
.krok-pasek .teraz .n{background:var(--akcent);color:var(--na-akcencie);border-color:transparent}
@media (max-width:520px){
  .krok-pasek .krok{font-size:var(--t-xs);padding:5px 10px 5px 5px;gap:6px}
  .krok-pasek .n{width:21px;height:21px;flex-basis:21px;font-size:var(--t-xs)}
  .krok-pasek li::after{margin:0 2px}
  /* Na telefonie trzy nazwy kroków nie mieszczą się w szerokości ekranu i ostatnia
     kończyła się urwanym „Protokó…". Urwane słowo wygląda na zepsuty program.
     Nazwę nosi krok, w którym się stoi; pozostałe zostają samymi numerami —
     i tak mówią to, co trzeba: ile kroków jest i który to z kolei. */
  .krok-pasek li:not(.teraz) .nazwa{display:none}
  .krok-pasek li:not(.teraz) .krok{padding:5px}
}

/* ================================================== kafelek akcji ======== */
/* JEDNA wspólna klasa dla KAŻDEGO klikalnego kafelka-akcji w całej aplikacji —
   pulpit, tankowanie, tablet przy pompie, panel czynności na karcie sprzętu.
   Zgłoszenie wprost: „kafelki są stylowane każdy z osobna, więc się różnią —
   inne rogi, inne odstępy, inne rozmiary liter, czasem brakuje ikony. Chcę to
   raz a porządnie ujednolicić." Wcześniej to samo miejsce miało DWIE osobne
   definicje (`.akcja-duza` i `.czyn-btn`), które się rozjeżdżały niezależnie —
   ta sama treść z dwoma różnymi rogami i odstępami, zależnie od tego, na który
   ekran trafiłeś. Teraz jest jedna definicja, a różnicę niesie WYŁĄCZNIE
   modyfikator `--glowny`.

   IKONA JEST OBOWIĄZKOWA — żaden kafelek nie wychodzi bez niej w tym samym
   okrągłym tle. Element może być `<a>` (przejście) albo `<button>` w `<form>`
   (akcja POST) — jedna klasa obsługuje oba, stąd `border:0;font:inherit`. */
.kafelki-akcji{display:flex;flex-direction:column;gap:12px}
.kafelki-akcji--dwie{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@media (max-width:560px){.kafelki-akcji--dwie{grid-template-columns:1fr}}

.kafelek-akcji{
  display:flex;align-items:flex-start;gap:14px;padding:20px;width:100%;
  border:0;border-radius:var(--r-xl);text-align:left;text-decoration:none;
  background:var(--p1);color:inherit;font:inherit;cursor:pointer;
  box-shadow:0 1px 2px rgba(0,0,0,.05),0 3px 8px rgba(0,0,0,.06);
  transition:transform .18s var(--e),box-shadow .18s var(--e);
}
a.kafelek-akcji{display:flex}
.kafelek-akcji:hover{box-shadow:0 1px 2px rgba(0,0,0,.06),0 6px 16px rgba(0,0,0,.10)}
.kafelek-akcji:active{transform:scale(.985)}
.kafelek-akcji:focus-visible{outline:2px solid var(--akcent);outline-offset:2px}
.kafelek-akcji__ikona{
  width:44px;height:44px;flex:0 0 44px;border-radius:50%;
  background:var(--kr3);color:var(--t0);
  display:flex;align-items:center;justify-content:center;
}
.kafelek-akcji__ikona svg{width:22px;height:22px;stroke:currentColor;fill:none;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.kafelek-akcji__tresc{min-width:0}
.kafelek-akcji__tytul{display:block;font:700 var(--t-l)/1.25 var(--f);color:var(--t0);margin-bottom:4px}
.kafelek-akcji__opis{display:block;font:400 var(--t-s)/1.45 var(--f);color:var(--t2);overflow-wrap:anywhere}

.kafelek-akcji--glowny{background:var(--akcent);box-shadow:none}
.kafelek-akcji--glowny .kafelek-akcji__ikona{background:rgba(0,0,0,.14);color:var(--na-akcencie)}
.kafelek-akcji--glowny .kafelek-akcji__tytul{color:var(--na-akcencie)}
.kafelek-akcji--glowny .kafelek-akcji__opis{color:var(--na-akcencie);opacity:.72}
.kafelek-akcji--glowny:hover{filter:brightness(1.05)}

/* ======================================= pole słownikowe: lista + przycisk ===
   „Myślałem, że zrobisz przycisk dodaj kategorię czy dodaj grupę" — pole tekstowe
   z pigułkami pod spodem było formalnie otwarte, ale człowiek szuka na ekranie
   CZYNNOŚCI, nie czyta podpowiedzi pod polem. Lista mówi „tu się wybiera",
   przycisk obok mówi „a tu się dokłada". Rozwinięcie to zwykły `<details>`,
   więc działa bez JavaScriptu. */
.nowa-wartosc{margin-top:8px}
.nowa-wartosc > summary{min-height:38px;font-size:var(--t-m)}
.nowa-wartosc[open]{background:var(--wklesle);border-radius:var(--r-m);padding:0 12px 12px}
.nowa-wartosc[open] > summary{background:transparent;border:0;margin-bottom:2px}
.nowa-wartosc .pole{margin:0}

/* Numer nadany przez program: podpis zmienia ton, żeby było widać, że pole
   zostało wypełnione samo — inaczej wygląda, jakby ktoś je wpisał wcześniej. */
.podpowiedz.numer-nadany{color:var(--akcent-t);font-weight:600}

/* ========================================================== paliwo: tankowanie ===
   „Trochę za trudne to wpisywanie tego paliwa, musi być to szybkie. Duże tabele,
   bo nie każdy dobrze widzi."

   Dlatego POWIĘKSZONA TYPOGRAFIA ŻYJE TYLKO TUTAJ, pod `.tank`. To jedyny ekran
   w programie wypełniany w rękawicy, przy pompie, często po zmroku i przez kogoś,
   kto nie siedzi przy biurku. Powiększenie całego programu byłoby gorsze niż brak
   powiększenia: w tabeli sprzętu większa czcionka znaczy mniej wierszy na ekranie,
   a tam liczy się, ile pozycji widać bez przewijania.

   Dwa pola są wielkie, bo dwa są obowiązkowe: litry i licznik. Reszta schodzi
   pod rozwinięcie — pole, które trzeba minąć wzrokiem, kosztuje tyle samo czasu
   co pole, które trzeba wypełnić. */
.tank h1{font-size:2rem;margin-bottom:6px}
.tank .wstep{font-size:var(--t-l);line-height:1.5}
.tank .karta{padding:20px}
.tank label{font-size:var(--t-l);font-weight:600;color:var(--t0)}
.tank .podpowiedz{font-size:var(--t-b);line-height:1.45}
.tank .pod{font-size:var(--t-b)}
.tank h2{font-size:var(--t-2xl)}
.tank .oko{font-size:var(--t-s);margin-top:18px}
.tank select,.tank input:where(:not([type=radio]):not([type=checkbox])){min-height:56px;font-size:var(--t-xl)}

/* Pole wielkie: litry i licznik. Cyfry krojem technicznym i rozstrzelone, bo tu
   pomyłka w jednym znaku kosztuje wyjazd na budowę. */
.pole-wielkie label{font-size:var(--t-xl)}
.pole-wielkie input{min-height:74px !important;font-size:2rem !important;font-weight:600;
  font-family:var(--fm);letter-spacing:.04em;text-align:center}
.pole-duze-select{min-height:60px !important;font-size:var(--t-xl) !important}

/* Wybór źródła paliwa: duże pola dotyku zamiast listy rozwijanej. Widać wszystkie
   możliwości naraz i trafia się w nie kciukiem. Zwykłe `radio`, więc działa bez JS. */
.wybor-duzy{display:grid;gap:8px;margin-top:4px}
.opcja-duza{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;align-items:center;
  padding:14px 16px;border:1px solid var(--kr);border-radius:var(--r-m);background:var(--p1);
  cursor:pointer;min-height:64px}
.opcja-duza input{grid-row:span 2;margin:0}
.opcja-duza b{font-size:var(--t-xl);color:var(--t0)}
.opcja-duza span{font-size:var(--t-b);color:var(--t1);grid-column:2}
.opcja-duza:has(input:checked){border-color:var(--akcent);background:var(--akcent-tlo);
  box-shadow:inset 0 0 0 1px var(--akcent)}

/* Kafle sprzętu do wyboru przy pompie: numer jest bohaterem, nazwa pod spodem,
   całość na tyle duża, żeby trafić w rękawicy. */
.kafle-sprzetu{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;margin-top:10px}
.kafle-sprzetu a{display:block;padding:14px 16px;border:1px solid var(--kr);border-radius:var(--r-m);
  background:var(--p1);text-decoration:none;min-height:64px}
.kafle-sprzetu .nr{display:block;font-family:var(--fm);font-size:var(--t-xl);font-weight:600;
  letter-spacing:.04em;color:var(--t0)}
.kafle-sprzetu span{display:block;font-size:var(--t-b);color:var(--t1);margin-top:2px}
.kafle-sprzetu a:hover{border-color:var(--akcent);background:var(--akcent-tlo)}

.tankowanie-co{padding-bottom:16px}
.nr-duzy{font-family:var(--fm);font-size:2.1rem;font-weight:600;letter-spacing:.04em;
  margin:2px 0 0;color:var(--t0)}
.nazwa-duza{font-size:var(--t-xl);font-weight:600;margin:4px 0 6px;color:var(--t0)}
.btn.wielki{min-height:66px;font-size:var(--t-xl);padding:0 28px}

@media (max-width:640px){
  .tank h1{font-size:1.7rem}
  .kafle-sprzetu{grid-template-columns:1fr}
  .btn.wielki{width:100%;justify-content:center}
}

/* Wiersz tabeli, który się nie domyka — pojemnik z ujemnym stanem. Kolor sam nie
   niesie znaczenia: obok stoi zawsze liczba i zdanie na ekranie nieścisłości. */
.zly-wiersz td{background:var(--awaria-tlo,rgba(192,39,31,.06))}
.zly-wiersz td:last-child b{color:var(--awaria)}

/* ============================================================ nieścisłości paliwa ===
   Waga niesie kolor, ale nie sama: każdy wiersz mówi SŁOWAMI, co jest nie tak.
   Kolor bez słowa to wykres, a nie zgłoszenie. */
.sygnal{border-left:3px solid var(--kr2);padding-left:11px}
.sygnal.wysoka{border-left-color:var(--awaria)}
.sygnal.srednia{border-left-color:var(--uwaga)}
.sygnal.niska{border-left-color:var(--kr2)}
.sygnal .rodzaj-nazwa b{color:var(--t0)}
.sygnal.wysoka .rodzaj-nazwa b{color:var(--awaria)}

/* ==================================================== słownik rodzajów =====
   Każdy rodzaj to ROZWIJANY WIERSZ, nie wiersz tabeli z formularzem w ostatniej
   komórce. Tamto dawało wiersz wysoki na siedemset pikseli i pustkę obok — ten sam
   błąd co „lista pozycji na telefonie to lista, a nie tabela". Zamknięty wiersz
   pokazuje liczby, otwarty rozkłada formularz na całą szerokość. */
.rodzaje{border-top:1px solid var(--kr3)}
.rodzaj{border-bottom:1px solid var(--kr3)}
.rodzaj > summary{
  display:flex;align-items:center;gap:20px;justify-content:space-between;flex-wrap:wrap;
  cursor:pointer;list-style:none;padding:14px 2px;min-height:56px;
}
.rodzaj > summary::-webkit-details-marker{display:none}
.rodzaj > summary:hover{background:var(--p2)}
.rodzaj-nazwa{flex:1 1 280px;min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.rodzaj-nazwa b{font:600 var(--t-l)/1.3 var(--f);color:var(--t0)}
.rodzaj-nazwa .pod{flex:1 1 100%;font-size:var(--t-m);margin:0}
.rodzaj-liczby{display:flex;gap:24px;flex:none;font-size:var(--t-m);color:var(--t2);flex-wrap:wrap}
.rodzaj-liczby b{font-family:var(--fm);font-weight:600;color:var(--t0);font-variant-numeric:tabular-nums}
.rodzaj[open] > summary{background:var(--wklesle)}
.rodzaj.wycofany > summary{opacity:.55}
.rodzaj-sredek,.rodzaj-srodek{padding:16px 2px 22px;display:flex;flex-direction:column;gap:16px}
.slownik-kolumna + .slownik-kolumna{margin-top:26px}
.slownik-kolumna .osoby-naglowek{margin:0 0 6px}
.rodzaj-koniec{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0;
  border-top:1px solid var(--kr3);padding-top:16px}
.rodzaj-koniec .pod{flex:1 1 240px;margin:0}
@media (max-width:640px){
  .rodzaj > summary{gap:8px}
  .rodzaj-liczby{gap:14px;font-size:var(--t-s);flex:1 1 100%}
}

/* ================================================== pulpit — układ „Tablica" ==
   (5.18.0) Pulpit był pięcioma białymi pudełkami jedno pod drugim, każde tej samej
   wagi, w każdym parę słów. Użytkownik nazwał to wprost: „wygląda amatorsko".
   Detale były poprawne — to KOMPOZYCJA była płaska: nic nie prowadziło oka.

   Trzy ruchy, wszystkie w tę samą stronę:
   1. Liczby zeszły z karty NA STRONĘ. Rubryka, która jest samym odczytem, nie
      potrzebuje pudełka — wystarczą dwie włosowe kreski i pion rozdzielający.
   2. Jedna liczba dominuje (2 rem), reszta jest przy niej o połowę mniejsza,
      a ZERA są zgaszone — liczba, której nie ma, nie zabiera uwagi.
   3. Jedna czynność jest wypełniona akcentem i jest jedynym kolorowym polem
      na ekranie. Oko ma gdzie wylądować. */

/* Rubryka stanu: liczby stoją na stronie, bez karty. */
.stan-pas{display:flex;align-items:stretch;border-top:1px solid var(--kr);border-bottom:1px solid var(--kr)}
.stan-pas > *{padding:16px 26px;display:flex;flex-direction:column;border-left:1px solid var(--kr3);
  text-decoration:none;min-width:0;color:inherit}
.stan-pas > *:first-child{padding-left:0;border-left:0}
.stan-pas b{font:600 2rem/1 var(--f);letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--t0)}
.stan-pas small{font:600 var(--t-xs)/1.2 var(--f);letter-spacing:.07em;text-transform:uppercase;
  color:var(--t2);margin-top:6px}
/* Zero jest informacją, ale nie wiadomością. Zgaszone i mniejsze. */
.stan-pas .zero b{color:var(--t2);font-weight:500}
.stan-pas a:hover b{color:var(--akcent-t)}
.stan-pas .stan-kiedy{margin-left:auto;justify-content:center;border-left:0;padding-right:0;text-align:right}
.stan-pas .stan-kiedy small{margin:0}
/* Szyna pod liczbami: proporcja bez legendy i bez czterech kolorów. */
.rail{display:flex;height:4px;border-radius:99px;overflow:hidden;gap:2px;margin-top:-1px}
.rail i{display:block;min-width:2px}
.rail .r-ludzi{background:var(--akcent)}
.rail .r-baza{background:var(--t0)}
.rail .r-naprawa{background:var(--awaria)}
.rail .r-wycofane{background:var(--kr2)}
.rail .r-wylaczone{background:var(--uwaga)}

/* „Do zrobienia", gdy nie ma nic do zrobienia: JEDNA LINIA, nie karta na 170 px.
   Karta rośnie dopiero wtedy, gdy naprawdę jest robota. */
.czysto-linia{display:flex;align-items:center;gap:11px;padding:13px 0;
  border-top:1px solid var(--kr);border-bottom:1px solid var(--kr);font-size:var(--t-b);color:var(--t1)}
.czysto-linia i{width:7px;height:7px;border-radius:50%;background:var(--baza);flex:none}
.czysto-linia b{color:var(--t0);font-weight:600}
.czysto-linia .etykieta{margin-left:auto;font-size:var(--t-s);color:var(--t3);white-space:nowrap}

@media (max-width:640px){
  /* Bohater dostaje własną linię — cztery liczby w rzędzie nie mieszczą się w 390 px.
     Trzy pozostałe stoją pod nim w rzędzie rozdzielonym włosem. */
  .stan-pas{display:grid;grid-template-columns:1fr 1fr 1fr;border-top:0}
  .stan-pas > *{padding:12px 0 12px 14px}
  .stan-pas > *:first-child{grid-column:1 / -1;padding:0 0 14px;border-left:0;
    border-bottom:1px solid var(--kr3);margin-bottom:12px}
  .stan-pas > *:first-child b{font-size:2.9rem}
  .stan-pas > *:first-child small{font-size:var(--t-xs)}
  .stan-pas > *:nth-child(2){padding-left:0;border-left:0}
  .stan-pas b{font-size:var(--t-2xl)}
  .stan-pas small{font-size:var(--t-xs);letter-spacing:.06em;margin-top:5px}
  .stan-pas .stan-kiedy{display:none}
  /* Podpis łamany na dwie linie rozjeżdżał linię bazową trzech liczb. */
  .stan-pas .dopisek{display:none}
  .rail{margin-top:14px}
  .czysto-linia{flex-wrap:wrap;gap:8px 10px;font-size:var(--t-m)}
  .czysto-linia .etykieta{display:none}
}

/* ================================================= lista do zaznaczania == */
/* Wydanie i zwrot: na telefonie wiersz ma być jednym wielkim celem do dotknięcia,
   a nie tabelą z podpisami NUMER / NAZWA / GDZIE / STAN przy każdej pozycji.
   Cały wiersz przełącza pole wyboru (patrz zaznaczanie.js). */
/* Szerokości kolumn. Bez nich przeglądarka rozdziela miejsce po równo i „GDZIE LEŻY"
   dostaje 190 px na słowo „Baza", a nazwa sprzętu — na którą się patrzy — zostaje
   ściśnięta. Kolumny krótkie biorą tyle, ile trzeba; nazwa bierze resztę. */
.wybor-lista td.zazn,.wybor-lista th.zazn{width:44px;padding-right:0}
.wybor-lista td.nr{width:1%;white-space:nowrap}
.wybor-lista td.gdzie{width:1%;white-space:nowrap;color:var(--t2)}
.wybor-lista td.stan{width:1%;white-space:nowrap;text-align:right}
.wybor-lista td.co{width:auto}
.wybor-lista tbody tr{cursor:pointer}
.wybor-lista tbody tr:has(input:checked){background:var(--akcent-tlo)}
.wybor-lista .nr{font-family:var(--fm)}
.rodzaj-liczby .nr{font-family:var(--fm);letter-spacing:.03em}
.nr-wersji{font-family:var(--fm);letter-spacing:.04em}
@media (max-width:900px){
  /* Wiersz na telefonie: KAŻDA KOMÓRKA MA WSKAZANE MIEJSCE W SIATCE.
     Wcześniej komórki układały się same, przez co kwadracik do zaznaczania lądował
     w osobnym wierszu, a jedna pozycja zajmowała trzysta pikseli — dwie rzeczy
     wypełniały cały ekran telefonu. Teraz: numer i stan w pierwszej linii,
     nazwa w drugiej, miejsce w trzeciej; kwadracik z boku, na środku wysokości. */
  .wybor-lista thead{display:none}
  .wybor-lista tbody tr{
    display:grid;grid-template-columns:26px 1fr auto;gap:1px 12px;align-items:center;
    padding:11px 14px;border-bottom:1px solid var(--kr3);
  }
  /* WAŻNE: kasujemy szerokości z układu tabelarycznego. `width:1%` i `width:44px`
     są sensowne dla <table>, ale w siatce znaczą „pudełko szerokie na 1% pola" —
     plakietka „awaria" wystawała wtedy poza ekran i urywała się na krawędzi,
     a numer inwentarzowy siedział w komórce szerokiej na dwa piksele. */
  .wybor-lista tbody td,.wybor-lista tbody td.zazn,.wybor-lista tbody td.nr,
  .wybor-lista tbody td.gdzie,.wybor-lista tbody td.stan,.wybor-lista tbody td.co{width:auto}
  .wybor-lista tbody td{display:block;padding:0;border:0;min-width:0}
  .wybor-lista tbody td::before{content:none!important}
  .wybor-lista td.zazn{grid-column:1;grid-row:1 / span 2;align-self:center}
  .wybor-lista td.nr{grid-column:2;grid-row:1;font-size:var(--t-l);font-weight:600;letter-spacing:.04em}
  .wybor-lista td.stan{grid-column:3;grid-row:1;justify-self:end}
  .wybor-lista td.co{grid-column:2 / -1;grid-row:2;font-size:var(--t-m);color:var(--t1);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .wybor-lista td.gdzie{grid-column:2 / -1;grid-row:3;font-size:var(--t-s);color:var(--t2)}
  .wybor-lista td.gdzie:empty,.wybor-lista td.stan:empty{display:none}
}

/* ============================================================ awaryjne === */
/* Wyjście awaryjne: usunięcie mimo historii. Ma wyglądać jak coś, co się otwiera
   świadomie — nie jak druga, równorzędna opcja obok zwykłego usuwania.
   Pierwsza wersja korzystała z `.sprawa`, a to jest siatka trzykolumnowa z pulpitu:
   napis „Usuń mimo historii" wpadał w wąską kolumnę na ikonę i łamał się na pięć
   linijek obok pól formularza. Stąd własny blok, a nie recykling cudzej klasy. */
.awaryjne{
  margin-top:18px;border:1px solid color-mix(in srgb,var(--awaria) 30%,transparent);
  border-radius:var(--r-m);background:var(--awaria-tlo);overflow:hidden;
}
.awaryjne>summary{
  display:flex;align-items:center;gap:10px;min-height:48px;padding:12px 14px;
  cursor:pointer;list-style:none;font-weight:600;color:var(--awaria);
}
.awaryjne>summary::-webkit-details-marker{display:none}
.awaryjne>summary::marker{content:""}
.awaryjne>summary::before{
  content:"";width:8px;height:8px;flex:0 0 8px;
  border-right:2px solid currentColor;border-bottom:2px solid currentColor;
  transform:rotate(-45deg);transition:transform .2s var(--e);margin-left:2px;
}
.awaryjne[open]>summary::before{transform:rotate(45deg)}
.awaryjne>summary .kto-moze{
  margin-left:auto;font:500 var(--t-xs)/1 var(--f);letter-spacing:.02em;
  color:var(--t2);white-space:nowrap;
}
.awaryjne-tresc{padding:2px 14px 16px;display:flex;flex-direction:column;gap:16px}
.awaryjne-tresc .pole{gap:6px}
.awaryjne-tresc .btn.zly{width:100%;background:var(--p1)}
@media (min-width:640px){
  .awaryjne-tresc .btn.zly{width:auto;align-self:flex-start;min-width:220px}
}
@media (max-width:520px){
  .awaryjne>summary .kto-moze{display:none}
}

.pasek-zazn.puste .pasek-akcje{display:none}
.pasek-akcje{gap:8px}
@media (max-width:900px){
  .pasek-zazn{bottom:calc(60px + env(safe-area-inset-bottom));border-radius:var(--r-l);border-top:1px solid var(--kr);margin-top:10px}
  .pasek-zazn>.btn{width:100%}
  /* Akcje na telefonie: pierwsza przez całą szerokość, groźne dwie obok siebie.
     Trzy przyciski jeden pod drugim zasłaniały listę, nad którą stoją. */
  .pasek-akcje{width:100%}
  .pasek-akcje .btn{flex:1 1 44%;width:auto}
  .pasek-akcje .btn.pri{flex:1 1 100%}
}
.uwagi{margin:6px 0 0;padding-left:1.2em;display:flex;flex-direction:column;gap:5px}

/* ============================================================== protokół === */
/* Dokument powierzenia mienia. Na ekranie wygląda jak kartka, na drukarce
   jest kartką — dlatego ma własne, papierowe reguły i nie dziedziczy motywu. */
.protokol{
  background:var(--p1);border:1px solid var(--kr);border-radius:var(--r-l);
  padding:32px;display:flex;flex-direction:column;gap:22px;
}
.protokol-glowa{display:grid;grid-template-columns:1fr auto;gap:28px;align-items:start;
  padding-bottom:20px;border-bottom:2px solid var(--kr2)}
.protokol-glowa h1{font-size:var(--t-2xl);margin:6px 0 4px}
.protokol-strony{margin:0;display:grid;gap:12px;min-width:230px}
.protokol-strony dt{font-family:var(--fm);font-size:var(--t-xs);font-weight:500;letter-spacing:.06em;
  text-transform:uppercase;color:var(--t2);margin-bottom:2px}
.protokol-strony dd{margin:0;font-weight:600;font-size:var(--t-l)}
@media (max-width:760px){.protokol{padding:20px}.protokol-glowa{grid-template-columns:1fr;gap:18px}}

.protokol-tabela{width:100%;border-collapse:collapse;font-size:var(--t-b)}
.protokol-tabela th{font-family:var(--fm);font-size:var(--t-xs);font-weight:500;letter-spacing:.06em;
  text-transform:uppercase;color:var(--t2);text-align:left;padding:0 12px 8px;border-bottom:1px solid var(--kr2)}
.protokol-tabela td{padding:9px 12px;border-bottom:1px solid var(--kr3);vertical-align:top}
.protokol-tabela tfoot td{border-top:2px solid var(--kr2);border-bottom:0;padding-top:12px;font-weight:600}
.protokol-uwagi{color:var(--t1);font-size:var(--t-b);margin:0}
.protokol-klauzula{font-size:var(--t-m);color:var(--t2);line-height:1.6;margin:0;max-width:none;
  padding:14px 16px;background:var(--p0);border-radius:var(--r-m);border:1px solid var(--kr3)}

.podpisy{display:grid;grid-template-columns:1fr 1fr;gap:40px;margin-top:26px}
.podpisy span{display:block;border-bottom:1px solid var(--t3);height:52px}
.podpisy p{margin:8px 0 0;font-size:var(--t-s);color:var(--t2);text-align:center}
@media (max-width:600px){.podpisy{grid-template-columns:1fr;gap:26px}}

/* =================================================================== druk === */
@media print{
  .szyna,.gora,.dol,.bezdruku,.komunikat,.pasek-zazn{display:none!important}
  .powloka{display:block}
  body,.plotno{background:#fff;color:#000}
  main{max-width:none;padding:0;gap:0;display:block}
  .naklejki{grid-template-columns:repeat(3,1fr);gap:4px}
  .nak{border-color:#888}
  /* Protokół drukujemy jak dokument, nie jak zrzut ekranu aplikacji. */
  .protokol{border:0;padding:0;background:#fff;color:#000;gap:18px}
  .protokol h1,.protokol b,.protokol dd{color:#000}
  .protokol .oko,.protokol .pod,.protokol-strony dt,.protokol-tabela th{color:#444}
  .protokol-glowa{border-bottom:2px solid #000}
  .protokol-tabela th{border-bottom:1px solid #000}
  .protokol-tabela td{border-bottom:1px solid #bbb}
  .protokol-tabela tfoot td{border-top:2px solid #000}
  .protokol-klauzula{background:#fff;border:1px solid #bbb;color:#333}
  .podpisy span{border-bottom:1px solid #000}
  .protokol-tabela tr{break-inside:avoid}
  .protokol-sekcja{break-after:avoid}
  .protokol-sekcja span{border-color:#888;background:#fff;color:#333}
  .podpisy{break-inside:avoid}
  @page{margin:14mm}
}

/* ================================================================ logowanie === */
.brama{min-height:100dvh;display:grid;place-items:center;padding:24px;background:var(--tlo)}
.brama main{padding:0;width:100%;max-width:420px;gap:14px}
.brama .karta{box-shadow:var(--cien);padding:26px}
.brama .karta h1{font-size:var(--t-2xl)}

/* ================================================ czynności: stan i przyciski === */
/* Wszystko poniżej powstało po zgłoszeniu: „mało intuicyjne jest przekazywanie
   i przyjmowanie, słabo widoczne jest, kto ma narzędzie". Zasada: czynność ma być
   przyciskiem wielkości kciuka, z nazwą w pierwszej osobie i zdaniem skutku,
   a stan pozycji ma być widoczny z odległości ręki, nie po wczytaniu się w tabelkę. */

.pas-stanu{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding:14px 18px;border-radius:var(--r-m);margin-bottom:14px;
  background:var(--p1);box-shadow:inset 0 0 0 1px var(--kr);
}
.pas-kropka{width:12px;height:12px;border-radius:50%;flex:none;background:var(--t3)}
.pas-tresc{min-width:0;flex:1 1 220px}
.pas-tresc b{display:block;font:700 var(--t-l)/1.25 var(--f);letter-spacing:-.015em;color:var(--t0)}
.pas-tresc span{display:block;margin-top:2px;font-size:var(--t-m);color:var(--t2);overflow-wrap:anywhere}
.pas-stanu.st-magazyn{background:var(--baza-tlo);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--baza) 26%,transparent)}
.pas-stanu.st-magazyn .pas-kropka{background:var(--baza)}
.pas-stanu.st-moje{background:var(--akcent-tlo);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--akcent) 28%,transparent)}
.pas-stanu.st-moje .pas-kropka{background:var(--akcent)}
.pas-stanu.st-uosoby{background:var(--droga-tlo);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--droga) 26%,transparent)}
.pas-stanu.st-uosoby .pas-kropka{background:var(--droga)}
.pas-stanu.st-wycofany .pas-kropka{background:var(--t3)}

.czyn-form{margin:0}

/* ---- „Mam u siebie" na pulpicie pracownika ----
   Lista, nie tabela. Tabela o trzech kolumnach rozpada się na telefonie na kafle
   z podpisami kolumn i jedna pozycja zajmuje trzysta pikseli. Numer inwentarzowy
   jest bohaterem — w terenie pada „gdzie jest N-0201", nie „gdzie jest ta pompa". */
.rzeczy{display:flex;flex-direction:column}
.rzecz{
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:6px 14px;
  padding:11px 6px;text-decoration:none;color:var(--t0);
  border-bottom:1px solid var(--kr3);transition:background .15s var(--e);
}
.rzecz:last-child{border-bottom:0}
.rzecz:hover{background:var(--wklesle)}
.rzecz-nr{font-family:var(--fm);font-size:var(--t-b);font-weight:600;letter-spacing:.04em;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.rzecz-nazwa{min-width:0;font-size:var(--t-b);color:var(--t1);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rzecz-stan{display:flex;align-items:center;gap:6px;justify-self:end;white-space:nowrap}
.rzecz-stan .pod{font-size:var(--t-s)}
@media (max-width:560px){
  /* Na wąskim ekranie numer i stan trzymają górny wiersz, nazwa dostaje cały drugi —
     inaczej nazwa sprzętu urywa się po trzech słowach. */
  .rzecz{grid-template-columns:1fr auto;padding:10px 4px}
  .rzecz-nazwa{grid-column:1 / -1;grid-row:2;white-space:normal}
}

/* ---- dorzucanie pozycji: skan i numer z ręki, wewnątrz czynności ----
   Nie jest to osobny ekran ani osobna zakładka, tylko pasek nad listą do zaznaczania.
   Ma wyglądać na narzędzie do tej listy, a nie na drugą, konkurencyjną drogę. */
.dorzuc{padding:14px;display:flex;flex-direction:column;gap:10px}
/* Dwa sposoby znalezienia rzeczy stoją OBOK SIEBIE. W słupku dawały nad listą trzy
   bloki o tej samej wadze, a lista — czyli to, po co człowiek tu wszedł — zaczynała się
   pod nimi. Na wąskim ekranie siatka zwija się do jednej kolumny. */
.dorzuc-siatka{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px;align-items:start}
@media (max-width:900px){.dorzuc-siatka{grid-template-columns:1fr}}
.dorzuc-rzad{gap:8px;margin:0}
/* Pole tekstowe na tysiąc pikseli wygląda jak pomyłka, a nie jak pole: szukana fraza
   ma pięć znaków, a kursor stoi metr od napisu. Miara pola bierze się z treści,
   którą się w nie wpisuje, nie z tego, ile miejsca akurat zostało. */
.dorzuc-rzad .pole-z-lupa{flex:1 1 200px;max-width:none}
.dorzuc .podpowiedz,.dorzuc .chipy-gdzie{margin:0}
.dorzuc .skaner-karta{box-shadow:none;border:0;padding:12px 0 0}
/* Trzeci sposób — aparat — jest DROGĄ ALTERNATYWNĄ, nie trzecim równorzędnym blokiem.
   Rozciągnięty na całą szerokość, wyśrodkowany, w ramce, ważył tyle samo co karta
   z listą i tyle samo co pola wyżej: trzy prostokąty jeden pod drugim, każdy krzyczy
   równie głośno. Teraz stoi w jednym rzędzie z podpowiedzią, po lewej, szeroki na tyle,
   ile ma napisu — a cała reszta miejsca zostaje liście. */
.dorzuc-stopka{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.dorzuc-stopka .podpowiedz{flex:1 1 260px;font-size:var(--t-s)}
.dorzuc .rozwin.przycisk{margin:0;flex:none;order:-1}
.dorzuc .rozwin.przycisk > summary{
  justify-content:flex-start;min-height:38px;padding:0 14px;font-size:var(--t-m);
  color:var(--t1);background:transparent;border-color:var(--kr);
}
.dorzuc .rozwin.przycisk > summary:hover{color:var(--t0);background:var(--p2)}
.dorzuc .rozwin.przycisk[open]{flex:1 1 100%;order:0}
.dorzuc .rozwin.przycisk[open] > summary{background:var(--wklesle);color:var(--t0)}
.echo-skanu{
  margin:0;padding:8px 11px;border-radius:var(--r-m);font-size:var(--t-m);
  background:var(--wklesle);color:var(--t1);
}
.echo-skanu.ok{background:var(--akcent-tlo);color:var(--akcent-t);font-weight:600}
.echo-skanu.zle{background:color-mix(in srgb,var(--awaria) 12%,transparent);color:var(--awaria);font-weight:600}

/* Wiersz dorzucony skanem błyska, żeby było widać, że skan wszedł. Bez tego człowiek
   skanuje drugi raz „na wszelki wypadek" — a przy operacji zbiorczej to jest ta sama
   pozycja policzona dwa razy w głowie, choć nie w formularzu. */
@keyframes blysk{from{background:var(--akcent-tlo)}to{background:transparent}}
.wybor-lista tbody tr.dorzucony{animation:blysk 1.6s var(--e)}
@media (prefers-reduced-motion:reduce){.wybor-lista tbody tr.dorzucony{animation:none;background:var(--akcent-tlo)}}

/* „Magazyn" jako cel przekazania — to nie jest osoba, więc nie udaje osoby:
   kwadratowy znak z ikoną zamiast okrągłych inicjałów. */
.osoba-kafel.magazyn{background:var(--wklesle);border-bottom:1px solid var(--kr2)}
.osoba-kafel.magazyn:hover{background:var(--p2)}
.osoba-kafel.magazyn .osoba-znak{border-radius:var(--r-m);background:var(--p1);color:var(--t1)}
.osoba-kafel.magazyn .osoba-znak svg{width:21px;height:21px;fill:none;stroke:currentColor}
.osoba-kafel.magazyn .osoba-tresc > span{white-space:normal}

/* ---- wybór osoby kafelkami ---- */
/* Szukanie stoi NAD listą i jest przyklejone do góry ekranu. Przy trzydziestu
   kafelkach przewinięcie do połowy listy zabierało pole szukania z widoku i jedyną
   drogą powrotu było przewinięcie na samą górę. */
.osoby-blok{display:flex;flex-direction:column;gap:10px}
.osoby-szukanie{position:sticky;top:8px;z-index:3;padding:10px 12px;display:flex;
  flex-direction:column;gap:8px}
/* Lupa. Bez niej pole wygląda na wyszarzony, nieczynny prostokąt — a to jedyna rzecz
   na tym ekranie, w którą trzeba kliknąć, żeby szukać. */
.pole-z-lupa{position:relative;display:flex;flex:1 1 180px;min-width:0}
.pole-z-lupa .lupa{
  position:absolute;left:12px;top:50%;transform:translateY(-50%);
  width:18px;height:18px;color:var(--t2);pointer-events:none;
}
.pole-z-lupa input{padding-left:38px}
/* Brygady jednym rzędem, który przewija się w bok. Zawijane zajmowały na telefonie
   PIĘĆ rzędów — tyle, co trzy osoby — i spychały pierwszą osobę poniżej krawędzi
   ekranu. Pionowe miejsce jest tu droższe niż poziome. */
.osoby-brygady{display:flex;gap:6px;flex-wrap:wrap}
@media (max-width:640px){
  .osoby-brygady{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
    margin:0 -12px;padding:2px 12px;scrollbar-width:none}
  .osoby-brygady::-webkit-scrollbar{display:none}
  .osoby-brygady .chip{flex:0 0 auto}
}
.osoby-brygady .chip{cursor:pointer;font-family:var(--f)}
.osoby-brygady .chip b{font-family:var(--fm);font-weight:600;color:var(--t3);margin-left:5px}
.osoby-brygady .chip.wybrany b{color:var(--t1)}
.osoby-licznik{margin:0;font-size:var(--t-s);color:var(--t2)}
.osoby-naglowek{
  margin:6px 0 0;font:600 var(--t-xs)/1 var(--f);letter-spacing:.08em;text-transform:uppercase;
  color:var(--t3);padding:0 4px;
}
.osoby-naglowek:first-child{margin-top:0}
/* JEDNA karta, ludzie oddzieleni włosową kreską — nie dwadzieścia osiem osobnych
   pudełek z ramką i przerwą. Każde pudełko miało tę samą wagę co karta, w której
   stało: na ekranie było widać osiem osób i siedem przerw, a lista dwudziestu ośmiu
   ludzi wyglądała jak dwadzieścia osiem oddzielnych spraw. Teraz na tym samym
   ekranie mieści się jedenaście osób, a struktura bierze się z odstępu i kreski,
   nie z ramki wokół wszystkiego. */
.osoby-wybor{display:flex;flex-direction:column;gap:0;padding:0;overflow:hidden}
.osoba-kafel{
  display:grid;grid-template-columns:auto 1fr auto auto;align-items:center;gap:14px;
  width:100%;min-height:58px;padding:9px 16px;border-radius:0;text-align:left;
  border:0;border-bottom:1px solid var(--kr3);background:transparent;
  color:var(--t0);cursor:pointer;font-family:var(--f);
  transition:background .13s var(--e);
}
.osoba-kafel:last-of-type{border-bottom:0}
.osoba-kafel:hover{background:var(--p2)}
.osoba-kafel:focus-visible{outline:2px solid var(--akcent);outline-offset:-2px}
.osoba-kafel:active{background:var(--akcent-tlo)}
/* Nagłówek grupy zachowuje się jak nagłówek w kartotece: pasek na całą szerokość
   karty, a nie napis wiszący w powietrzu nad pudełkami. */
.osoby-wybor .osoby-naglowek{margin:0;padding:9px 16px;background:var(--wklesle);
  border-bottom:1px solid var(--kr3)}
.osoby-wybor .pusto{margin:20px}
/* Rzeczy nieobowiązkowe pod listą (budowa, termin) mają własny margines — karta
   sama go już nie daje, bo wiersze osób mają dotykać jej krawędzi. */
.osoby-wybor > details,.osoby-wybor > .rzad{margin:12px 16px}
.osoby-wybor > details{border-top:1px solid var(--kr3);padding-top:12px;margin-top:0}
.osoba-znak{
  width:42px;height:42px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:var(--p2);box-shadow:inset 0 0 0 1px var(--kr2);
  font-family:var(--fm);font-size:var(--t-m);font-weight:700;color:var(--t1);letter-spacing:.02em;
}
.osoba-tresc{min-width:0}
.osoba-tresc b{display:block;font:600 var(--t-l)/1.25 var(--f);color:var(--t0)}
.osoba-tresc > span{display:block;margin-top:1px;font-size:var(--t-s);color:var(--t2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.osoba-ile{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:22px;height:22px;padding:0 6px;border-radius:999px;
  background:var(--wklesle);box-shadow:inset 0 0 0 1px var(--kr);
  font-family:var(--fm);font-size:var(--t-xs);font-weight:600;color:var(--t1);white-space:nowrap;
}
.osoba-strzalka{color:var(--t3);font-size:var(--t-xl)}
@media (max-width:520px){
  .osoba-kafel{grid-template-columns:auto 1fr auto;gap:11px;padding:10px 12px}
  .osoba-strzalka{display:none}
  .osoba-ile{font-size:var(--t-xs)}
}

/* ---- kto co ma ---- */
.kto-ma{padding:8px}
.kto-ma-osoba{border-bottom:1px solid var(--kr3)}
.kto-ma-osoba:last-child{border-bottom:0}
.kto-ma-osoba > summary{
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:14px;
  padding:12px 10px;cursor:pointer;list-style:none;border-radius:var(--r-m);
}
.kto-ma-osoba > summary::-webkit-details-marker{display:none}
.kto-ma-osoba > summary:hover{background:var(--p1)}
.kto-ma-ile{
  font-family:var(--fm);font-size:var(--t-xl);font-weight:700;color:var(--t0);
  display:flex;align-items:center;gap:10px;font-variant-numeric:tabular-nums;white-space:nowrap;
}
.kto-ma-strzalka{display:flex;align-items:center}
.kto-ma-ile i, .kto-ma-strzalka i{font-style:normal;font-size:var(--t-2xl);color:var(--t3);transition:transform .15s var(--e)}
.kto-ma-osoba[open] > summary .kto-ma-ile i,
.kto-ma-osoba[open] > summary .kto-ma-strzalka i{transform:rotate(90deg)}
.kto-ma-osoba > summary{align-items:start}
.kto-ma-osoba .osoba-tresc .plakietka{margin-top:6px;width:max-content;max-width:100%}
.kto-ma-spis{display:flex;flex-direction:column;gap:0;padding:0 10px 14px 66px}
.kto-ma-spis a{
  display:grid;grid-template-columns:88px 1fr auto;gap:12px;align-items:baseline;
  padding:8px 0;border-bottom:1px dashed var(--kr3);text-decoration:none;color:var(--t0);font-size:var(--t-b);
}
.kto-ma-spis a:last-of-type{border-bottom:0}
.kto-ma-spis a:hover span:nth-child(2){color:var(--akcent-t)}
/* .btn w środku .kto-ma-spis dziedziczył styl zwykłych linków z listy (siatka,
   zerowy odstęp) i wyglądał połamany — tekst wystawał poza tło przycisku.
   To przywraca normalny wygląd .btn, niezależnie od tego, w jakiej liście stoi.
   align-items i gap też z listy: „baseline" przyklejał tekst do górnej krawędzi. */
.kto-ma-spis a.btn{
  display:inline-flex;grid-template-columns:none;padding:0 17px;
  border:1px solid var(--kr2);border-bottom:1px solid var(--kr2);text-decoration:none;
  align-items:center;gap:8px;
}
@media (max-width:560px){
  .kto-ma-spis{padding-left:14px}
  .kto-ma-spis a{grid-template-columns:1fr;gap:1px}
}

/* ---- kto ma na liście sprzętu ---- */
.ma-kto{display:inline-flex;align-items:center;gap:8px;min-width:0}
.ma-kto i{
  width:24px;height:24px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:var(--droga-tlo);color:var(--droga);font-style:normal;
  font-family:var(--fm);font-size:var(--t-xs);font-weight:700;letter-spacing:.02em;
}
.ma-kto b{font-weight:600;color:var(--t0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chipy-gdzie{margin:2px 0 6px}

/* ---- skaner: rada i droga zapasowa ---- */
.skaner-rada{
  margin:12px 0 0;padding:12px 14px;border-radius:var(--r-m);
  background:var(--uwaga-tlo);color:var(--t1);font-size:var(--t-m);line-height:1.55;
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--uwaga) 28%,transparent);
}
.skaner-rada b{color:var(--t0)}
.skaner-rada code{font-family:var(--fm);font-size:.85em;overflow-wrap:anywhere}
.zdjecie-kodu{cursor:pointer}
.skaner-recznie{border-top:1px solid var(--kr3);margin-top:16px;padding-top:14px}
.skaner-recznie h3{font:700 var(--t-l)/1.2 var(--f);margin:0 0 10px;letter-spacing:-.015em}
.czyn-uwaga{
  display:block;margin:-2px 0 12px;padding:12px 14px;border-radius:var(--r-m);
  background:var(--awaria-tlo);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--awaria) 30%,transparent);
}
.czyn-uwaga b{display:block;font:700 var(--t-b)/1.3 var(--f);color:var(--awaria);letter-spacing:-.01em}
.czyn-uwaga span{display:block;margin-top:3px;font-size:var(--t-m);line-height:1.5;color:var(--t1);overflow-wrap:anywhere}

/* ==================================================================== zdjęcia === */
/* Miniatury, nie pełne pliki: sześćdziesiąt zdjęć po 250 kB na jednym ekranie to
   piętnaście megabajtów na każde wejście w kartę. Pełne ładuje się po dotknięciu. */
.zdjecia-siatka{display:grid;gap:10px;grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.zdjecie{margin:0;border-radius:var(--r-m);overflow:hidden;background:var(--wklesle);
  box-shadow:inset 0 0 0 1px var(--kr)}
.zdjecie a{display:block;aspect-ratio:4/3;background:var(--wklesle)}
.zdjecie img{display:block;width:100%;height:100%;object-fit:cover}
.zdjecie figcaption{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:7px 10px;font-size:var(--t-xs);color:var(--t2);min-height:38px}
.zdjecie figcaption form{margin:0}
.zdjecie figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.zdjecie-wybierz{cursor:pointer}
.zdjecia-stan,.zdjecie-stan{margin:10px 0 0;font-size:var(--t-m);color:var(--t1)}
.zdjecia-stan.zle,.zdjecie-stan.zle{color:var(--awaria);font-weight:600}
.zdjecie-pole .zdjecie-podglad{margin-top:10px;max-width:280px;border-radius:var(--r-m);
  overflow:hidden;box-shadow:inset 0 0 0 1px var(--kr)}
.zdjecie-pole .zdjecie-podglad img{display:block;width:100%;height:auto}
.zdjecia-plakietka{display:inline-flex;align-items:center;gap:4px;
  font-size:var(--t-xs);font-weight:500;color:var(--t2)}
.usterka-zdjecia{margin-top:10px;grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}
.usterka-zdjecia .zdjecie figcaption{display:none}

/* ============================================================== instrukcja A4 === */
/* Kartka do powieszenia w magazynie. Na ekranie wygląda jak kartka, na drukarce
   JEST kartką: bez menu, bez przycisków, czarne na białym, mieści się na jednej stronie. */
.instrukcja{
  background:var(--p1);border-radius:var(--r-xl);padding:28px 30px;
  box-shadow:var(--cien);display:flex;flex-direction:column;gap:20px;
}
.instr-glowa{display:flex;justify-content:space-between;align-items:flex-start;gap:24px;
  flex-wrap:wrap;border-bottom:2px solid var(--t0);padding-bottom:14px}
.instr-glowa h2{font:700 var(--t-2xl)/1.15 var(--f);letter-spacing:-.012em;margin:4px 0 0;color:var(--t0)}
.instr-adres{text-align:right}
.instr-link{font-family:var(--fm);font-size:var(--t-l);font-weight:600;color:var(--t0);margin:4px 0 0;
  overflow-wrap:anywhere}
.instr-wstep{margin:0;font-size:var(--t-l);color:var(--t1)}
.instr-kolumny{display:grid;grid-template-columns:1fr 1fr;gap:20px 28px}
.instr-kolumny h3{font:700 var(--t-l)/1.2 var(--f);margin:0 0 8px;color:var(--akcent-t);letter-spacing:-.01em}
.instr-kroki{margin:0;padding-left:1.1em;display:flex;flex-direction:column;gap:7px}
.instr-kroki li{font-size:var(--t-b);color:var(--t1)}
/* Tylko BEZPOŚREDNIE pogrubienie w punkcie jest osobną linią — nazwa kroku.
   Bez `>` pogrubienia w zdaniu opisu („zakładka Skanuj") też robiły się blokami
   i jedno zdanie rozpadało się na pięć linijek. */
.instr-kroki > li > b{display:block;color:var(--t0);font-weight:600}
.instr-kroki b{color:var(--t0);font-weight:600}
.instr-kroki span{display:block;font-size:var(--t-m);line-height:1.45}
.instr-uwaga{margin:9px 0 0;font-size:var(--t-m);color:var(--t2);line-height:1.5;
  border-left:3px solid var(--kr2);padding-left:10px}
.instr-stopka{display:grid;grid-template-columns:1fr 1fr;gap:20px 28px;
  border-top:1px solid var(--kr2);padding-top:16px}
.instr-stopka h3{font:700 var(--t-b)/1.2 var(--f);margin:0 0 5px;color:var(--t0)}
.instr-stopka p{margin:0;font-size:var(--t-m);line-height:1.55;color:var(--t1)}
@media (max-width:700px){
  .instr-kolumny,.instr-stopka{grid-template-columns:1fr}
  .instr-adres{text-align:left}
}
@media print{
  .instrukcja{box-shadow:none;padding:0;border-radius:0;gap:14px;background:#fff;color:#000}
  .instrukcja h2,.instrukcja h3,.instr-kroki b,.instr-link,.instr-stopka h3{color:#000}
  .instr-kroki > li > b{display:block}
  .instrukcja p,.instr-kroki li,.instr-kroki span,.instr-stopka p{color:#222}
  .instr-uwaga{color:#444;border-left-color:#999}
  .instr-glowa{border-bottom:2px solid #000}
  .instr-stopka{border-top:1px solid #999}
  .instr-kolumny section{break-inside:avoid}
  .instrukcja .oko{color:#555}
}

/* ==================================================== TRYB STACJI (tablet) ===
   Osobny ekran dla urządzenia stojącego przy pompie. Nie jest to „aplikacja
   z ukrytym menu", tylko jeden ekran do jednej czynności — użytkownik postawił
   sprawę wprost: „tylko tankowanie, nic więcej".

   Trzy rzeczy, które decydują o tym, czy to działa w terenie:
   1. WSZYSTKO JEST WIĘKSZE NIŻ W PROGRAMIE. Tablet wisi na ścianie albo leży
      na blacie, patrzy się na niego z pół metra, często po zmroku i w rękawicy.
   2. NIC NIE PROWADZI POZA TEN EKRAN — stąd brak szyny, paska i marki.
   3. KAŻDE POLE DOTYKU MA CO NAJMNIEJ 72 px. Kafelek nazwiska mniejszy od dłoni
      znaczy, że co dziesiąty wpis idzie na sąsiada z listy. */

.stacja-body{background:var(--p0)}
/* Płótno jest JASNE, a czerń zostaje na belce. To nie jest wybór estetyczny, tylko
   ta sama zasada, co w reszcie programu: „czerń trzyma nawigację, nie treść".
   Pierwsza wersja tego ekranu miała całe tło w kolorze szyny i nagłówek „Kto tankuje?"
   zniknął — bo napisy treści mają kolor do jasnego tła i na czerni po prostu ich nie ma.
   Widać to było dopiero na zrzucie ekranu, nie w kodzie. */
.stacja{min-height:100dvh;display:flex;flex-direction:column;background:var(--p0)}
.stacja > main{width:100%;max-width:1100px;margin:0 auto;padding:20px 20px 48px;
  display:flex;flex-direction:column;gap:16px}
/* Formularz tankowania to KOLUMNA, nie pas na całą szerokość tabletu: pole „Ile litrów"
   rozciągnięte na 1000 px wygląda jak pomyłka, a oko i tak wraca do lewej krawędzi. */
.stacja .tank{width:100%;max-width:780px;margin:0 auto;display:flex;flex-direction:column;gap:16px}

/* Belka górna jest cienka i obojętna: to nie nawigacja, tylko podpis, gdzie się stoi.
   Nazwisko po prawej pojawia się dopiero wtedy, gdy ktoś się przedstawił — i wtedy
   od razu z wyjściem, bo „to nie ja" musi być dostępne w każdej chwili. */
.stacja-gora{display:flex;align-items:center;justify-content:space-between;gap:16px;
  flex-wrap:wrap;padding:12px 20px;background:var(--tlo);color:var(--t3)}
/* Belka jest ciemna, więc jej napisy NIE MOGĄ brać kolorów treści — te są zrobione
   pod jasne tło. Para tło+napis stoi w jednej regule, tak jak przy paskach stanu. */
.stacja-marka{margin:0;font:600 var(--t-b)/1.2 var(--f);letter-spacing:.06em;
  text-transform:uppercase;color:rgba(255,255,255,.62)}
.stacja-marka b{color:rgba(255,255,255,.3)}
.stacja-wersja{font:500 var(--t-m)/1 var(--fm);color:rgba(255,255,255,.34)}
.stacja-kto{display:flex;align-items:center;gap:10px;color:#fff}
.stacja-kto b{font-size:var(--t-l);color:#fff}
.stacja-kto .inicjaly{flex:none;width:34px;height:34px;border-radius:50%;
  display:grid;place-items:center;font:600 var(--t-xs)/1 var(--fm);letter-spacing:0;
  background:rgba(255,255,255,.16);color:#fff}
.stacja-kto .btn{background:rgba(255,255,255,.12);color:#fff;box-shadow:none;border:0}

.stacja-h1{font-size:2.3rem;margin:4px 0 0}
.stacja-wstep{font-size:var(--t-l);line-height:1.5;color:var(--t1);margin:0;max-width:60ch}
.stacja .oko{font-size:var(--t-b);margin-top:10px}
.stacja .karta{padding:20px}
.stacja label{font-size:var(--t-xl);font-weight:600;color:var(--t0)}
/* 72 px i 1,4 rem od 5.32.0 — patrz „duże litery i pola" niżej. */
.stacja select,.stacja input:where(:not([type=radio]):not([type=checkbox])){min-height:72px;font-size:var(--t-2xl)}

/* Kafelki z nazwiskami. Inicjały są duże, bo z pół metra celuje się w plamę,
   a nie w napis — nazwisko potwierdza wybór, ale go nie prowadzi. */
.kafle-ludzi{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px}
.kafel-osoby{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:2px 14px;
  min-height:86px;padding:14px 18px;border-radius:var(--r-m);background:var(--p1);
  box-shadow:inset 0 0 0 1px var(--kr);text-decoration:none}
.kafel-osoby i{grid-row:span 2;display:grid;place-items:center;width:52px;height:52px;
  border-radius:50%;background:var(--wklesle);color:var(--t1);
  font:600 var(--t-l)/1 var(--f);font-style:normal;letter-spacing:.02em}
.kafel-osoby b{font-size:var(--t-xl);color:var(--t0);align-self:end}
.kafel-osoby span{font-size:var(--t-m);color:var(--t2);align-self:start}
.kafel-osoby:hover,.kafel-osoby:focus-visible{box-shadow:inset 0 0 0 2px var(--akcent);
  background:var(--akcent-tlo);outline:none}
/* Kafelek zamknięty po złych PIN-ach zostaje NA SWOIM MIEJSCU i mówi dlaczego.
   Zniknięcie nazwiska z listy wyglądałoby na usterkę programu. */
.kafel-osoby.zamkniety{opacity:.55;cursor:not-allowed}
.kafel-osoby.zamkniety i{background:var(--kr3)}
.kafel-osoby.zamkniety span{color:var(--awaria)}

/* Litery zamiast pola szukania — klawiatura systemowa zasłania na tablecie pół ekranu. */
.litery{display:flex;flex-wrap:wrap;gap:6px}
.litery a{min-width:56px;min-height:56px;display:grid;place-items:center;padding:0 12px;
  border-radius:var(--r-s);background:var(--p1);box-shadow:inset 0 0 0 1px var(--kr);
  font:600 var(--t-xl)/1 var(--f);color:var(--t1);text-decoration:none}
.litery a.teraz{background:var(--akcent);color:var(--na-akcencie);box-shadow:none}

.stacja-pin{max-width:520px;width:100%;margin:0 auto;display:flex;flex-direction:column;gap:14px}
.stacja-pin .stacja-h1,.stacja-pin .oko{text-align:center}
/* Kropki pokazuje samo pole hasła — 2 rem, wyśrodkowane, krojem technicznym.
   Osobna linijka z kropkami pod polem mówiła dokładnie to samo drugi raz,
   a pusta („wpisz PIN" rozstrzelone w mono) wyglądała jak resztka po debugowaniu. */

/* Klawiatura: dziesięć cyfr wielkości kciuka. Dorysowuje ją skrypt — bez skryptu
   zostaje zwykłe pole i klawiatura systemowa, więc ekran nigdy nie jest martwy. */
.klawiatura{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px}
/* Klawisz ma być WKLĘSŁY względem karty, nie białym prostokątem na białym:
   inaczej dwanaście pól tego samego koloru co tło czyta się jak siatka, a nie
   jak przyciski. Ta sama zasada głębi, co przy polach formularza. */
.kl{min-height:78px;border:0;border-radius:var(--r-m);background:var(--wklesle);
  box-shadow:inset 0 0 0 1px var(--kr);cursor:pointer;
  font:600 1.9rem/1 var(--fm);color:var(--t0);transition:transform .12s var(--e)}
.kl:active{transform:scale(.97);box-shadow:inset 0 0 0 2px var(--kr2)}
.kl-inny{font:600 var(--t-l)/1 var(--f);color:var(--t1)}

.stacja-pusto{max-width:560px;margin:8vh auto 0;display:flex;flex-direction:column;gap:14px;
  text-align:center;align-items:center}
.stacja-pusto p{font-size:var(--t-l);line-height:1.55;color:var(--t1)}

/* Potwierdzenie. JEDNA LICZBA, wielka — to jedyna rzecz, którą człowiek sprawdza
   wzrokiem, zanim odejdzie od pompy: czy zapisało tyle, ile nalał. */
/* Potwierdzenie stoi W ŚRODKU EKRANU, nie przy górnej krawędzi: to jedyna rzecz
   na tej stronie, a przyklejona do góry zostawiała pod sobą pół metra pustego tabletu. */
.stacja-koniec{max-width:560px;margin:auto;display:flex;flex-direction:column;gap:10px;
  text-align:center;align-items:center;padding:24px 0}
.stacja > main:has(.stacja-koniec){flex:1;justify-content:center}
/* Liczba jest czarna, a nie w akcencie: żółty zostaje na przycisku, bo na ekran
   przypada jedna rzecz w kolorze akcji (patrz CLAUDE.md). */
.zapisano-litry{margin:0;font:600 4.6rem/1 var(--fm);letter-spacing:.02em;color:var(--t0);
  display:flex;align-items:baseline;gap:10px}
.zapisano-litry small{font:600 var(--t-2xl)/1 var(--f);letter-spacing:0;color:var(--t2)}
.zapisano-co{margin:0;font:600 var(--t-2xl)/1.2 var(--fm);letter-spacing:.04em;color:var(--t0)}

/* „Nalewam do pojemnika" jest na tablecie PEŁNOEKRANOWYM kaflem, nie wierszem:
   na 1280 px wiersz rozciąga opis na całą szerokość i czyta się jak stopka,
   a to jest jedna z dwóch rzeczy, które da się tu zrobić. */
/* Droga alternatywna nie wygląda jak droga główna: „Anuluj" rozciągnięty na całą
   szerokość pod przyciskiem zapisu ważył więcej niż sam zapis. Szeroki na tyle,
   ile ma napisu — ta sama zasada, co przy „włącz aparat" w skanerze. */
.stacja .rzad{align-items:stretch}
.stacja .rzad > .btn{flex:0 0 auto}
.stacja .rzad > .btn.pri{flex:0 1 auto}

/* Tablet: cel większy pod palcem w rękawicy, ale ikona zostaje po lewej jak
   wszędzie indziej — kafelek-akcja bez ikony nie istnieje (patrz definicja wyżej). */
.stacja .kafelek-akcji{padding:22px}
.stacja .kafelek-akcji__ikona{width:52px;height:52px;flex:0 0 52px}
.stacja .kafelek-akcji__ikona svg{width:26px;height:26px}
.stacja .kafelek-akcji__tytul{font-size:var(--t-xl)}
.stacja .kafelek-akcji__opis{font-size:var(--t-b);color:var(--t1)}

/* DUŻE LITERY I POLA NA CAŁYM EKRANIE STACJI (5.32.0). Zgłoszenie po próbach:
   „duże litery i pola, bo ktoś może mieć słabszy wzrok". Tablet stoi przy pompie
   i czyta się go z odległości wyciągniętej ręki, w rękawicy — kafel sprzętu to tu
   główny cel pod palcem, nie przypis. Ta sama logika, co przy .kafelek-akcji wyżej,
   tylko mocniej, bo numer maszyny jest jedyną rzeczą, którą trzeba rozpoznać. */
.stacja .kafle-sprzetu{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin-top:12px}
.stacja .kafle-sprzetu a{min-height:96px;padding:18px 22px;border-width:2px}
.stacja .kafle-sprzetu .nr{font-size:1.65rem}
.stacja .kafle-sprzetu span{font-size:var(--t-xl);margin-top:4px}
.stacja .pod{font-size:var(--t-l)}
.stacja-wybor .stacja-wstep{margin-bottom:14px}
.stacja-wybor__pojazd{margin-bottom:16px}

/* Własne tankowania po PIN-ie i ostatnie dostawy: wiersze faktów, bez przycisków.
   Krótkie z założenia (10 wierszy, 3 dostawy) — to sprawdzenie „czy się zgadza",
   a nie historia; lista, która spycha wybór sprzętu pod zgięcie, przestaje być czytana. */
.stacja-moje__lista{list-style:none;margin:8px 0 0;padding:0}
.stacja-moje__lista li{display:grid;grid-template-columns:auto auto 1fr;align-items:baseline;
  gap:4px 18px;padding:10px 0;border-top:1px solid var(--kr3);font-size:var(--t-xl)}
.stacja-moje__kiedy{font-family:var(--fm);color:var(--t1)}
.stacja-moje__litry{font-family:var(--fm);color:var(--t0);text-align:right;min-width:5.5ch}
.stacja-moje__co{color:var(--t1);min-width:0}
.stacja-moje__co .nr{font-family:var(--fm);letter-spacing:.04em;color:var(--t0)}
.stacja-moje .pod{margin-top:10px}

.stacja-stopka{margin-top:22px;font-size:var(--t-m);color:var(--t3)}
.stacja-stopka a{color:var(--t3)}

.stacja-obietnica{margin-top:10px;color:var(--t2);font-size:var(--t-b)}

/* Na telefonie pionowe miejsce jest droższe niż poziome — a ten ekran ma jedno
   zadanie: pokazać jak najwięcej nazwisk bez przewijania. Stąd litery jednym rzędem
   w bok (zamiast trzech rzędów), niższe kafelki i mniejsze kółka z inicjałami.
   Przed poprawką bez przewijania widać było dwa nazwiska, po — sześć. */
@media (max-width:640px){
  .stacja-gora{flex-wrap:nowrap;padding:10px 16px}
  .stacja-marka{font-size:var(--t-s);letter-spacing:.04em;white-space:nowrap}
  .stacja-marka span{display:none}
  .stacja-wersja{font-size:var(--t-xs);white-space:nowrap}
  .stacja > main{padding:14px 16px 40px;gap:12px}
  .stacja-h1{font-size:1.7rem}
  .stacja-wstep{font-size:var(--t-l)}
  .litery{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;
    scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .litery::-webkit-scrollbar{display:none}
  .litery a{flex:0 0 auto;min-width:52px;min-height:52px}
  .kafle-ludzi{grid-template-columns:1fr;gap:8px}
  .kafel-osoby{min-height:68px;padding:10px 14px}
  .kafel-osoby i{width:42px;height:42px;font-size:var(--t-b)}
  .kafel-osoby b{font-size:var(--t-l)}
  .zapisano-litry{font-size:3.2rem}
  .stacja .kafle-sprzetu{grid-template-columns:1fr}
  .stacja .kafle-sprzetu a{min-height:84px}
  .stacja-moje__lista li{grid-template-columns:auto 1fr;font-size:var(--t-l)}
  .stacja-moje__co{grid-column:1 / -1}
}

/* Adres, pod którym widać serwer z telefonu. Kod QR i adres stoją OBOK SIEBIE:
   aparat jest drogą krótszą, ale nie każdy telefon czyta kody z automatu, więc
   przepisanie z ekranu musi być tak samo dostępne, a nie schowane pod spodem. */
.adres-lan{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap;margin-top:12px}
.adres-kod{flex:none;width:148px;height:148px;padding:10px;border-radius:var(--r-m);
  background:#fff;box-shadow:inset 0 0 0 1px var(--kr)}
.adres-kod svg{width:100%;height:100%;display:block}
.adres-url{margin:0 0 6px;font:600 var(--t-2xl)/1.2 var(--fm);letter-spacing:.02em;
  color:var(--t0);word-break:break-all}
@media (max-width:640px){ .adres-url{font-size:var(--t-xl)} }

/* „Twoje dzisiejsze wpisy" na ekranie tankowania. Wiersze, nie karty: to lista rzeczy
   do ewentualnego poprawienia, a nie pięć kartek papieru pod sobą. */
.moje-wpisy{display:flex;flex-direction:column;margin-top:8px}
.moj-wpis{display:flex;align-items:center;gap:12px;padding:10px 0;
  border-top:1px solid var(--kr3)}
.moj-wpis .nr{font-family:var(--fm);font-weight:600;letter-spacing:.04em;color:var(--t0)}
.moj-wpis span{flex:1;min-width:0;color:var(--t1);font-size:var(--t-b)}

/* Wiersz anulowanego tankowania. Przekreślenie, nie samo zgaszenie: zgaszony wiersz
   czyta się jako „mniej ważny", a ten wpis nie jest mniej ważny — on NIE LICZY SIĘ
   do bilansu, i to trzeba zobaczyć z odległości ręki. Plakietka mówi to słowami,
   bo kolor ani krój nigdy nie niosą znaczenia same. */
.wpis-anulowany td{color:var(--t3)}
.wpis-anulowany td:nth-child(3),.wpis-anulowany td:nth-child(4){text-decoration:line-through}
.wpis-anulowany .nr{color:var(--t3)}
.opis-wpisu{margin:-6px 0 4px}

/* 5.45.0 — cofnięcie pomyłkowego ruchu (admin) */
.cofnij-ruch > summary{list-style:none;cursor:pointer}
.cofnij-ruch > summary::-webkit-details-marker{display:none}
.cofnij-ruch[open] > summary{display:none}
.cofnij-ruch form{gap:8px;flex-wrap:nowrap}
.cofnij-ruch input{min-width:200px}

/* =========================================================================
   5.45.0 — AUDYT WYGLĄDU (29.09.2026)
   Zewnętrzny przegląd znalazł: 59 różnych rozmiarów liter (w tym 9,5 i 10 px),
   przyciski w sześciu wysokościach, za wąską szynę i treść uciętą do 1120 px
   na monitorze 1920 px, maszynowe nagłówki kolumn liczbowych i „20 l" czytane
   jak „20 1". Ta sekcja stoi NA KOŃCU z rozmysłem: to ona ma ostatnie słowo.
   ========================================================================= */

/* --- jedna skala liter. Nic poniżej 12 px: program czytają ludzie po
       pięćdziesiątce, na budowie, w słońcu. Rozmiary w arkuszu używają tylko
       tych zmiennych (plus wielkie liczby na kafelkach). --- */
:root{
  --t-xs:12px; --t-s:13px; --t-m:14px; --t-b:15px; --t-l:16px; --t-xl:18px; --t-2xl:22px;
}

/* --- szyna i szerokość treści. Na dużym monitorze szyna rośnie, litery w menu
       też; treść nie jest już ucinana do wąskiego słupka pośrodku. --- */
main{max-width:1440px;padding:32px 40px 72px}
@media (min-width:1440px){
  :root{--szyna:288px}
  .szyna{padding:18px 14px 14px}
  .szyna nav a{font-size:var(--t-l);padding:9px 14px;gap:13px}
  .szyna nav a svg{width:20px;height:20px}
  .marka b{font-size:var(--t-l)}
}
.szyna nav a{min-height:38px}
.sekcja-menu{font-size:var(--t-xs);margin:12px 0 4px;color:var(--t2)}

/* Zwijana grupa „Administracja" — nagłówek jest przyciskiem, ze strzałką. */
.grupa-menu > summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;
  min-height:32px;border-radius:var(--r-s)}
.grupa-menu > summary::-webkit-details-marker{display:none}
.grupa-menu > summary::after{content:"";width:7px;height:7px;margin-left:auto;margin-right:4px;
  border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;transform:rotate(-45deg);
  transition:transform .15s var(--e)}
.grupa-menu[open] > summary::after{transform:rotate(45deg)}
.grupa-menu > summary:hover{color:var(--t0)}
:root[data-motyw="zolty"] .szyna .grupa-menu > summary:hover{color:#fff}
.grupa-menu > summary .licznik{margin-left:4px}
.grupa-menu{display:flex;flex-direction:column;gap:2px}
.grupa-menu:not([open]) > a{display:none}

/* --- tabele: nagłówek kolumny z liczbą wygląda jak każdy inny nagłówek.
       Wcześniej `th.nr` dostawał krój maszynowy 14 px i krzyczał „SPRZĘTU NA SOBIE". --- */
thead th.nr{font-family:var(--f);font-size:var(--t-xs);font-weight:600;letter-spacing:.055em;color:var(--t2)}
/* Liczby w tabelach: zwykły krój z cyframi równej szerokości. Litera „l" w kroju
   maszynowym wyglądała jak jedynka („20 1"), a zero było przekreślone. Krój maszynowy
   zostaje przy KODACH — numer inwentarzowy, seryjny, rejestracyjny (`.kod`). */
td.nr{font-family:var(--f);font-size:var(--t-b);font-variant-numeric:tabular-nums;letter-spacing:0}
.kod,td.nr.kod,dd.nr.kod{font-family:var(--fm);letter-spacing:.02em}
td.nr.kod{font-size:var(--t-m)}

/* --- przyciski: jedna wysokość na komputerze, jedna na telefonie. --- */
.btn{min-height:44px}
.btn.maly{min-height:36px;padding:0 13px;font-size:var(--t-m);font-weight:600}
@media (max-width:900px){
  .btn,.btn.maly{min-height:48px}
  .btn.pri{min-height:52px}
}
/* „Dodaj coś" — jeden wygląd w całym programie: obrys na całą szerokość z plusem,
   tak jak „Dopisz badanie", „Wpisz dostawę", „Zgłoś usterkę". */
.btn.dodaj{width:100%;min-height:48px;justify-content:center;border-style:solid;border-color:var(--kr2);
  font-size:var(--t-l);font-weight:600;background:var(--p1);box-shadow:none}
.btn.dodaj::before{content:"+";font-family:var(--fm);color:var(--t2);font-size:var(--t-l)}
.btn.dodaj:hover{border-color:var(--akcent);background:var(--akcent-tlo)}

/* --- link „wróć": ten sam wzór na każdym ekranie, czytelny i łatwy do trafienia. --- */
.wroc{font-size:var(--t-xs);min-height:32px;margin-bottom:-12px}

/* --- formularz okresu (statystyki, spalanie, nieścisłości, ewidencja odzieży):
       pola obok siebie od lewej, przycisk w tym samym rzędzie. Karta jest kolumną,
       więc bez tego pola stały jedno pod drugim na środku szerokiej karty. --- */
.karta.rzad{flex-direction:row;align-items:flex-end;justify-content:flex-start;flex-wrap:wrap;gap:14px}
.karta.rzad > .pole{margin:0;flex:0 1 220px}
.karta.rzad > .pole .btn{width:auto}

/* --- szukanie na żywo: przycisk „Pokaż" jest potrzebny tylko bez JavaScriptu. --- */
.js .szukajka .bez-js{display:none}
#wyniki-sprzetu{transition:opacity .15s var(--e)}
#wyniki-sprzetu.laduje{opacity:.55}

/* --- pulpit: legenda wykresu kolorem, nie słowami „ciemne/jasne". --- */
.legenda{display:flex;gap:16px;flex-wrap:wrap}
.legenda span{display:inline-flex;align-items:center;gap:6px}
.legenda i{width:10px;height:10px;border-radius:2px;display:inline-block}

/* --- licznik (kółko z liczbą) mieści 12 px. --- */
.licznik{min-width:20px;height:20px;font-size:var(--t-xs)}
@media (max-width:900px){.dol a .licznik,.dol summary .licznik{min-width:20px;height:20px;font-size:var(--t-xs)}}

/* --- telefon: lista sprzętu zwarta. Jeden wiersz = numer i nazwa, pod spodem
       „u kogo · gdzie" małym szarym. Było ~230 px na pozycję z podpisami GRUPA /
       U KOGO przy każdej — sześćdziesiąt pozycji to był kilometr przewijania. --- */
@media (max-width:640px){
  .lista-sprzetu tbody tr:not(.grupa-naglowek){display:grid;grid-template-columns:auto 1fr;
    column-gap:12px;row-gap:2px;align-items:center;padding:11px 14px}
  .lista-sprzetu tbody td{grid-column:2;margin:0 !important}
  .lista-sprzetu tbody td.zazn{grid-column:1;grid-row:1 / span 3;align-self:center}
  .lista-sprzetu td[data-l]::before{display:none}
  .lista-sprzetu td[data-l="Grupa"]{display:none}
  .lista-sprzetu td.nr{font-size:var(--t-b)}
  .lista-sprzetu td.ukogo,.lista-sprzetu td.gdzie{font-size:var(--t-s);color:var(--t2)}
  .lista-sprzetu td.ukogo .plakietka{font-size:var(--t-xs)}
}
@media (max-width:640px){
  /* Filtry zajmowały cały pierwszy ekran: pole i trzy listy jedna pod drugą. */
  .szukajka .rzad{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .szukajka input[type=search]{grid-column:1 / -1}
  .szukajka select{width:100% !important;min-width:0}
  .szukajka .btn{grid-column:1 / -1}
  .szukajka.karta{padding:14px}
  /* Rzędy przycisków-filtrów przewijają się w bok zamiast łamać na pięć linijek. */
  .chipy-grup{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;scrollbar-width:none}
  .chipy-grup::-webkit-scrollbar{display:none}
  .chipy-grup .chip{flex:none}
}
dd.nr.kod{font-size:var(--t-b);font-weight:600}
@media (max-width:900px){.chip{min-height:44px}}
.kod .pod,.kod span.pod{font-family:var(--f);letter-spacing:0;font-weight:400;font-size:var(--t-s)}
/* Szeroki, ale niski ekran (np. 1440×900): większe pozycje menu nie mieszczą się
   w pionie — zostaje większa litera, ale mniejszy odstęp między pozycjami. */
@media (min-width:1440px) and (max-height:1000px){
  .szyna nav a{padding:6px 14px;min-height:34px}
  .sekcja-menu{margin:8px 0 2px}
}

/* =========================================================================
   5.46.2 — FILTRY NA LIŚCIE SPRZĘTU: jeden przełącznik stanu i RÓWNA siatka grup.
   Zgłoszenie: „nierówno rozłożone kategorie sprzętów — muszą być lepiej posegregowane
   i wyrównane". Pigułki o różnych szerokościach łamały się w poszarpane rzędy.
   ========================================================================= */
.pas-filtrow{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
/* Przełącznik stanu: jeden pasek z przyciskami sklejonymi w całość — to jest JEDEN wybór
   („gdzie jest sprzęt"), więc wygląda jak jedna rzecz, a nie luźne pigułki. */
.filtr-stanu{display:inline-flex;flex-wrap:wrap;background:var(--wklesle);border:1px solid var(--kr);
  border-radius:var(--r-m);padding:3px;gap:2px}
.filtr-stanu .seg{display:inline-flex;align-items:center;gap:8px;min-height:38px;padding:0 14px;
  border-radius:calc(var(--r-m) - 3px);text-decoration:none;color:var(--t1);font-size:var(--t-m);font-weight:600;
  white-space:nowrap}
.filtr-stanu .seg b{font-weight:600;color:var(--t2);font-variant-numeric:tabular-nums}
.filtr-stanu .seg:hover{color:var(--t0);background:var(--p1)}
.filtr-stanu .seg.wybrany{background:var(--p1);color:var(--t0);box-shadow:0 0 0 1px var(--kr2),0 1px 2px rgba(0,0,0,.08)}
.filtr-stanu .seg.wybrany b{color:var(--t0)}
.filtr-stanu .seg.zly b{color:var(--awaria)}
.filtr-stanu .seg.uwaga b{color:var(--uwaga)}

/* Grupy: kafelki tej samej szerokości; nazwa z lewej, liczba wyrównana do prawej. */
.grupy{display:flex;flex-direction:column;gap:10px}
.grupy > .oko,.grupy-naglowek .oko{margin:0}
.grupy-naglowek{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.grupy-siatka{display:grid;gap:8px;grid-template-columns:repeat(var(--k6,6),minmax(0,1fr))}
@media (max-width:1500px){.grupy-siatka{grid-template-columns:repeat(var(--k4,4),minmax(0,1fr))}}
/* Blok wyników jest osobnym pudełkiem (szukanie na żywo) — musi mieć te same odstępy co reszta strony. */
#wyniki-sprzetu{display:flex;flex-direction:column;gap:18px}
#wyniki-sprzetu > .pod{margin:0}
.grupa-kafel{display:flex;align-items:center;justify-content:space-between;gap:10px;
  min-height:48px;padding:0 16px;background:var(--p1);border:1px solid var(--kr);border-radius:var(--r-m);
  text-decoration:none;color:var(--t0);font-size:var(--t-b);font-weight:600;
  transition:border-color .15s var(--e),background .15s var(--e)}
.grupa-kafel span{min-width:0;line-height:1.25;padding:8px 0}
.grupa-kafel b{flex:none;min-width:40px;text-align:right;font-weight:600;color:var(--t2);font-variant-numeric:tabular-nums}
.grupa-kafel:hover{border-color:var(--akcent);background:var(--akcent-tlo)}
.grupa-kafel.wybrany{border-color:var(--t0);box-shadow:inset 0 0 0 1px var(--t0)}
.grupa-kafel.wybrany b{color:var(--t0)}
.grupa-kafel.brak span{color:var(--t2);font-style:italic}
@media (max-width:640px){
  /* 5.58.2: przyciski stanu łamią się w rzędy zamiast przewijać w bok — „U ludzi"
     chował się za prawą krawędzią i nic nie mówiło, że tam jest. */
  .filtr-stanu{display:flex;width:100%;flex-wrap:wrap}
  .filtr-stanu .seg{flex:1 1 auto;justify-content:center;min-height:44px}
  .grupy-siatka{grid-template-columns:repeat(var(--k2,2),minmax(0,1fr))}
  .grupa-kafel{padding:0 12px;font-size:var(--t-m)}
}

/* =========================================================================
   5.46.3 — WSZYSTKIE FILTRY „JEDEN Z KILKU" WYGLĄDAJĄ TAK SAMO.
   Po zgłoszeniu o nierównych kategoriach na liście sprzętu: ten sam przełącznik
   (sklejone przyciski w jednej ramce) na Terminach, Wydaniach i zwrotach, w spisie,
   w Usterkach, na Naklejkach, przy „Biorę / Wydaj" i przy brygadach. Luźne pigułki
   o różnych szerokościach zostały tylko tam, gdzie to NIE jest wybór jednego z kilku.
   ========================================================================= */
.segmenty,.chipy-gdzie,.osoby-brygady{display:inline-flex;flex-wrap:wrap;align-self:flex-start;align-items:center;
  gap:2px;padding:3px;margin:0;background:var(--wklesle);border:1px solid var(--kr);border-radius:var(--r-m)}
.segmenty .chip,.chipy-gdzie .chip,.osoby-brygady .chip{min-height:38px;padding:0 14px;border:0;background:transparent;
  border-radius:calc(var(--r-m) - 3px);color:var(--t1);font-size:var(--t-m);font-weight:600;box-shadow:none}
.segmenty .chip:hover,.chipy-gdzie .chip:hover,.osoby-brygady .chip:hover{background:var(--p1);color:var(--t0)}
.segmenty .chip.wybrany,.chipy-gdzie .chip.wybrany,.osoby-brygady .chip.wybrany{background:var(--p1);color:var(--t0);
  box-shadow:0 0 0 1px var(--kr2),0 1px 2px rgba(0,0,0,.08)}
.segmenty .chip b,.chipy-gdzie .chip b,.osoby-brygady .chip b{font-family:var(--f);font-weight:600;color:var(--t2);margin-left:6px}
.segmenty .chip.wybrany b,.chipy-gdzie .chip.wybrany b,.osoby-brygady .chip.wybrany b{color:var(--t0)}
.osoby-brygady[hidden]{display:none}
@media (max-width:640px){
  .segmenty,.chipy-gdzie,.osoby-brygady{display:flex;width:100%;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
  .segmenty::-webkit-scrollbar,.chipy-gdzie::-webkit-scrollbar,.osoby-brygady::-webkit-scrollbar{display:none}
  .segmenty .chip,.chipy-gdzie .chip,.osoby-brygady .chip{flex:none;min-height:44px}
}

/* =========================================================================
   5.47.0 — WIĘCEJ FILTRÓW I SORTOWANIE PO KOLUMNIE na liście sprzętu.
   ========================================================================= */
.wiecej-filtrow{margin-top:12px;border-top:1px solid var(--kr3);padding-top:12px}
.wiecej-filtrow > summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:8px;
  min-height:40px;font-weight:600;color:var(--t1)}
.wiecej-filtrow > summary::-webkit-details-marker{display:none}
.wiecej-filtrow > summary::before{content:"";width:8px;height:8px;border-right:1.8px solid currentColor;
  border-bottom:1.8px solid currentColor;transform:rotate(-45deg);transition:transform .15s var(--e);margin-right:4px}
.wiecej-filtrow[open] > summary::before{transform:rotate(45deg)}
.wiecej-filtrow > summary:hover{color:var(--t0)}
.filtry-siatka{display:grid;gap:14px 16px;margin:10px 0 14px;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));align-items:end}
.filtry-siatka .pole{margin:0}
.zakres{border:0;padding:0;margin:0;min-width:0;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:8px}
.zakres legend{grid-column:1 / -1;padding:0;margin-bottom:6px;font-size:var(--t-s);font-weight:600;color:var(--t1)}
.zakres span{color:var(--t2)}
.zakres input{min-width:0}

/* Nagłówek, w który się klika, żeby posortować. Strzałka mówi po czym i w którą stronę. */
thead th a.sort{display:inline-flex;align-items:center;gap:6px;color:inherit;text-decoration:none;font:inherit;
  letter-spacing:inherit;text-transform:inherit;min-height:28px}
thead th a.sort i{font-style:normal;font-size:var(--t-s);color:var(--t3);letter-spacing:0}
thead th a.sort:hover{color:var(--t0)}
thead th a.sort:hover i{color:var(--t1)}
thead th a.sort.teraz{color:var(--t0)}
thead th a.sort.teraz i{color:var(--t0)}
th.pr a.sort{flex-direction:row-reverse}
@media (max-width:640px){.filtry-siatka{grid-template-columns:1fr}}

/* ---- 5.49.0: znak programu = łyżka koparki (jak ikona na telefonie) ---- */
.marka .znak svg{display:block;width:21px;height:21px;color:var(--akcent)}
:root[data-motyw="zolty"] .marka .znak svg{color:#100E10}

/* ---- 5.49.2: pasek koloru z lewej strony karty ma być PROSTY, nie wygięty jak nawias.
   Gruba lewa krawędź na zaokrąglonym rogu zakrzywia się w „(" — lewe rogi są więc proste,
   prawe zostają zaokrąglone. Kolor paska (pilność, stan) działa jak dotąd. */
.potw,.termin,.kod-wpis{border-top-left-radius:0;border-bottom-left-radius:0}

/* ---- 5.50.0: stan zbiornika paliwa (tylko dla uprawnionych do paliwa) ---- */
.zbiornik-karta h2{margin-bottom:10px}
.zbiornik-liczba{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin:0 0 10px}
.zbiornik-liczba b{font-size:var(--t-2xl);font-weight:700;letter-spacing:-.02em;color:var(--t0)}
.zbiornik-liczba span{color:var(--t2);font-size:var(--t-m)}
.zbiornik-pasek{height:12px;border-radius:999px;background:var(--wklesle);border:1px solid var(--kr);overflow:hidden;margin:0 0 10px}
.zbiornik-pasek i{display:block;height:100%;background:var(--baza);border-radius:999px}
.zbiornik-pasek.niski i{background:var(--awaria)}
.zbiornik-skrot{display:grid;grid-template-columns:auto 1fr;align-items:baseline;gap:4px 14px;
  padding:14px 16px;border:1px solid var(--kr);border-radius:var(--r-l);background:var(--p1);
  text-decoration:none;color:var(--t0)}
.zbiornik-skrot .oko{grid-column:1 / -1;margin:0}
.zbiornik-skrot b{font-size:var(--t-xl);font-weight:700}
.zbiornik-skrot small{color:var(--t2);font-size:var(--t-s)}
.zbiornik-skrot .zbiornik-pasek{grid-column:1 / -1;margin:6px 0 0}
.zbiornik-skrot:hover{border-color:var(--kr2)}
.zbiornik-skrot.niski{border-color:var(--awaria)}
/* Komunikat ma kolorowy pasek z lewej — na zaokrąglonym rogu zakrzywiał się w „(", jak
   menu i karty poprawione w 5.49.2. Lewe rogi proste, prawe zaokrąglone; kolor bez zmian. */
.komunikat{border-top-left-radius:0;border-bottom-left-radius:0}

/* ---- 5.51.0: wybór maszyny do tankowania (tablet, telefon, „Tankuję komuś") ----
   Zgłoszenie ze zrzutem tabletu: „bardziej widoczne, miejsce do wpisywania lepiej zrobione,
   lepsze kafelki, lepiej widoczne maszyny, szukanie po literze bez Enter". */
.wybor-maszyny{display:flex;flex-direction:column;gap:6px;margin-top:14px}
.szukaj-maszyny{margin:6px 0 8px}
.szukaj-maszyny label{display:block;font-size:var(--t-l);font-weight:700;color:var(--t0);margin:0 0 8px;
  letter-spacing:0;text-transform:none}
.szukaj-maszyny .rzad{flex-wrap:nowrap;gap:10px}
.szukaj-maszyny .pole-z-lupa{flex:1 1 auto}
.szukaj-maszyny input[type=search]{width:100%;min-height:64px;font-size:var(--t-xl);font-weight:600;
  padding:0 18px 0 54px;border:2px solid var(--kr2);border-radius:var(--r-l);background:var(--p1);color:var(--t0)}
.szukaj-maszyny input[type=search]::placeholder{font-weight:400;color:var(--t2)}
.szukaj-maszyny input[type=search]:focus{outline:none;border-color:var(--akcent);
  box-shadow:0 0 0 4px color-mix(in srgb,var(--akcent) 30%,transparent)}
.szukaj-maszyny .pole-z-lupa .lupa{left:18px;width:24px;height:24px;color:var(--t1)}
.js .szukaj-maszyny .bez-js{display:none}
.wyniki-maszyn{transition:opacity .15s}
.wyniki-maszyn.laduje{opacity:.55}
.wybor-maszyny__oko{margin:14px 0 0;font-size:var(--t-s);font-weight:700;color:var(--t1)}
.wybor-maszyny__nic{font-size:var(--t-l);color:var(--t1);margin:12px 0}
.wybor-maszyny__nic b{color:var(--t0)}

/* Kafel maszyny: numer bohaterem, nazwa wyraźnie, tablica i rodzaj drobniej. Mocna ramka
   i strzałka — ma wyglądać na coś, w co się stuka, a nie na ramkę z tekstem. */
.kafle-sprzetu{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px}
.kafle-sprzetu a.kafel-sprzet{position:relative;display:flex;flex-direction:column;gap:2px;
  min-height:96px;padding:16px 44px 16px 18px;border:2px solid var(--kr2);border-radius:var(--r-l);
  background:var(--p1);color:var(--t0);transition:border-color .12s,background .12s,transform .08s}
.kafle-sprzetu a.kafel-sprzet::after{content:"›";position:absolute;right:16px;top:50%;transform:translateY(-52%);
  font-size:2rem;line-height:1;color:var(--t2)}
.kafle-sprzetu a.kafel-sprzet .nr{font-size:1.55rem;font-weight:700;letter-spacing:.03em;color:var(--t0)}
.kafle-sprzetu a.kafel-sprzet span{font-size:var(--t-b);font-weight:600;color:var(--t0);margin-top:2px;line-height:1.3}
.kafle-sprzetu a.kafel-sprzet small{font-size:var(--t-s);color:var(--t2);margin-top:2px}
.kafle-sprzetu a.kafel-sprzet:hover,.kafle-sprzetu a.kafel-sprzet:focus-visible{border-color:var(--akcent);background:var(--akcent-tlo)}
.kafle-sprzetu a.kafel-sprzet:hover::after{color:var(--akcent-t)}
.kafle-sprzetu a.kafel-sprzet:active{transform:scale(.985)}

/* Tablet przy pompie: wszystko jeszcze o stopień większe — czytane z odległości ręki. */
.stacja .szukaj-maszyny label{font-size:var(--t-xl)}
.stacja .szukaj-maszyny input[type=search]{min-height:76px;font-size:1.6rem}
.stacja .szukaj-maszyny .pole-z-lupa .lupa{width:28px;height:28px}
.stacja .wybor-maszyny__oko{font-size:var(--t-m)}
.stacja .kafle-sprzetu{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}
.stacja .kafle-sprzetu a.kafel-sprzet{min-height:112px;padding:18px 48px 18px 22px}
.stacja .kafle-sprzetu a.kafel-sprzet .nr{font-size:1.9rem}
.stacja .kafle-sprzetu a.kafel-sprzet span{font-size:var(--t-l)}
.stacja .kafle-sprzetu a.kafel-sprzet small{font-size:var(--t-m)}
@media (max-width:640px){
  .szukaj-maszyny input[type=search]{min-height:58px;font-size:var(--t-l)}
  .kafle-sprzetu a.kafel-sprzet{min-height:84px}
}
/* Telefon: „Ostatnio tankowane" stoi nad szukaniem — ale gdy ktoś już pisze, chowa się,
   żeby wyniki były tuż pod polem, a nie ekran niżej. */
.wybor-maszyny:has(input[type=search]:not(:placeholder-shown)) .wybor-maszyny__nad{display:none}
.stacja-wybor .wybor-maszyny{margin-top:0}

/* 5.52.0 — FIRMA: uprawnienia na karcie osoby pogrupowane według modułów. Nagłówek grupy
   to ten sam drobny, rozstrzelony napis co „Gotowe zestawy", z oddechem nad sobą, żeby
   było widać, gdzie kończy się jeden moduł, a zaczyna drugi. */
.grupa-upr{margin:20px 0 8px;padding-top:12px;border-top:1px solid var(--kr3);max-width:none}
.historia-zmian .tabela{margin-top:10px}

/* 5.55.0 — PLIKI WPIĘTE W KARTY. Lista nazw z plakietką „PDF/Zdjęcie", usuń po prawej.
   Wersja `pliki-male` siedzi w komórce tabeli i w bloku terminu — bez opisu, ciasno. */
.pliki{display:flex;flex-direction:column;gap:8px;align-items:flex-start}
.pliki-lista{list-style:none;margin:0;padding:0;width:100%;display:flex;flex-direction:column;gap:6px}
.pliki-lista li{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:6px 0;border-bottom:1px solid var(--kr3)}
.pliki-lista li:last-child{border-bottom:0}
.pliki-lista li > a{font-weight:600;color:var(--t0);text-decoration:none;display:inline-flex;align-items:center;gap:8px;min-width:0;overflow-wrap:anywhere}
.pliki-lista li > a:hover{text-decoration:underline}
.pliki-lista li > form{margin-left:auto}
.pliki-male .pliki-lista li{padding:2px 0;border:0;gap:6px}
.pliki-male .pliki-lista li > a{font-weight:500;font-size:var(--t-s)}
.zal-stan{margin:0}

/* 5.56.0 — EKSPORT I WYDRUK Z LIST. Dwa małe przyciski nad listą. Wydruk ma własną, czystą
   stronę (`?eksport=druk`, serwer.js → oddajListe) — nie drukujemy ekranu z filtrami i kratkami. */
.eksport{gap:8px;margin:2px 0 4px}

/* 5.57.0 — WYSZUKIWARKA PRZEZ CAŁY PROGRAM: okienko w szynie nad menu i ekran wyników /szukaj. */
.szukaj-wszedzie{padding:0 4px 10px}
.szukaj-wszedzie input{width:100%;min-height:36px;font-size:var(--t-s);padding:6px 10px;border-radius:var(--r-m)}
.wyniki-grupa{display:flex;flex-direction:column;gap:6px}
.wyniki-grupa h2{display:flex;align-items:baseline;gap:10px}
.wyniki-grupa h2 small{font-size:var(--t-s);font-weight:500;color:var(--t2)}
.wyniki-lista{list-style:none;margin:0;padding:0}
.wyniki-lista li{padding:8px 0;border-bottom:1px solid var(--kr3);display:flex;gap:12px;align-items:baseline;flex-wrap:wrap}
.wyniki-lista li:last-child{border-bottom:0}
.wyniki-lista a{font-weight:600;color:var(--t0);text-decoration:none}
.wyniki-lista a:hover{text-decoration:underline}
.wyniki-lista .nr{min-width:70px}
mark{background:color-mix(in srgb,var(--akcent) 35%,transparent);color:inherit;border-radius:3px;padding:0 1px}

/* 5.58.0 — WYGLĄD POD FIRMĘ. Logo klienta w miejscu znaku programu: ta sama wysokość co znak,
   szerokość wolna (logotypy bywają podłużne), na białym podkładzie, żeby ciemne logo nie ginęło
   w ciemnej szynie. Nazwa firmy może być długa — łamie się, zamiast urywać w pół słowa. */
.logo-firmy{flex:none;height:34px;max-width:96px;object-fit:contain;border-radius:7px;background:#fff;padding:2px}
.marka-firmy b{overflow-wrap:anywhere}
.firma-druk{display:flex;align-items:center;gap:12px;margin:0 0 10px}
.firma-druk img{height:40px;max-width:160px;object-fit:contain}
.firma-druk b{font-size:var(--t-l)}
.logo-podglad{height:56px;max-width:220px;object-fit:contain;border:1px solid var(--kr2);border-radius:8px;background:#fff;padding:4px}
/* Podpis programu pod nazwą firmy — zwykłym krojem, bez rozstrzelenia: mono wielkimi literami
   „EWIDENCJA SPRZĘTU" łamało się na dwie linie obok logo. */
.marka-firmy small{font-family:var(--f);text-transform:none;letter-spacing:0;white-space:nowrap}

/* =========================================================================
   5.58.2 — LISTA SPRZĘTU NA TELEFONIE: najpierw lista, nie filtry biura.
   Recenzja „oczami nowego klienta" (05.10.2026): pierwsza pozycja listy stała
   1100 px pod górą ekranu — pod czterema polami wyboru, „Więcej filtrów",
   kafelkami grup i przyciskami eksportu. Zasada Sławka: na telefonie tylko to,
   co konieczne; rozbudowanie na komputerze. Nic nie znika z komputera.
   - „gdzie" (lista) dubluje przyciski stanu tuż pod spodem → na telefonie chowamy listę;
   - kolejność i „Więcej filtrów" to praca biurowa → na telefonie schowane
     (chyba że filtr jest włączony — wtedy „Więcej filtrów" zostaje otwarte i widoczne);
   - kafelki grup → wybór grupy zostaje w liście „wszystkie grupy" przez całą szerokość;
   - eksport do Excela i wydruk → tylko komputer.
   ========================================================================= */
@media (max-width:640px){
  .szukajka select[name="gdzie"],.szukajka select[name="sortuj"]{display:none}
  .szukajka select{grid-column:1 / -1}
  .szukajka .wiecej-filtrow:not([open]){display:none}
  .grupy-start{display:none}
  .eksport{display:none}
}

/* 5.58.2 — pasek „Zaznacz pozycje…" przykleja się do dołu ekranu TYLKO, gdy coś jest
   zaznaczone. Pusty stał na pierwszym wierszu listy i go zasłaniał. */
.pasek-zazn.puste{position:static;box-shadow:none}

/* =========================================================================
   5.60.0 — GÓRNY PASEK BIURA: wyszukiwarka + CZYNNOŚCI widoczne na każdym ekranie.
   Wzór: Fleetio (szukanie i „szybkie dodawanie" w górnym pasku), Builtly (czynności
   jako przyciski nad listą). Boczne menu zostaje do przechodzenia między miejscami.
   ========================================================================= */
.pasek-biura{position:sticky;top:0;z-index:25;display:flex;align-items:center;gap:16px;
  padding:12px 30px;background:color-mix(in srgb,var(--p0) 92%,transparent);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--kr)}
.pasek-biura .szukaj-wszedzie{padding:0;flex:0 1 300px;min-width:180px}
.pasek-biura .szukaj-wszedzie input{min-height:40px;font-size:var(--t-m);background:var(--p1)}
.czynnosci-gora{display:flex;flex-wrap:wrap;gap:8px;margin-left:auto;justify-content:flex-end}
.czyn-gora{display:inline-flex;align-items:center;gap:8px;min-height:40px;padding:0 14px;
  border:1px solid var(--kr2);border-radius:var(--r-m);background:var(--p1);color:var(--t0);
  text-decoration:none;font-size:var(--t-m);font-weight:600;white-space:nowrap;
  transition:border-color .15s var(--e),background .15s var(--e)}
.czyn-gora svg{width:18px;height:18px;flex:none;stroke:currentColor;fill:none;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round}
.czyn-gora:hover{border-color:var(--akcent);background:var(--akcent-tlo)}
.czyn-gora[aria-current="page"]{background:var(--akcent);border-color:var(--akcent);color:var(--na-akcencie)}
/* Węższy ekran biurowy: same ikony z podpisem w dymku nie — skracamy odstępy, napisy zostają. */
@media (max-width:1280px){.pasek-biura{gap:10px;padding:10px 20px}.czyn-gora{padding:0 10px}}
@media (max-width:900px){.pasek-biura{display:none}}

/* =========================================================================
   5.59.0 — SZYBKIE CZYNNOŚCI NA TELEFONIE (zgłoszenie Sławka 05.10.2026:
   „szybka akcja = szybki przycisk, bez zbędnego rozwijania list").
   ========================================================================= */
@media (max-width:640px){
  /* Pulpit: najpierw przyciski czynności, potem liczby. Liczby się ogląda, czynność się robi. */
  main > .pas-gorny{order:-2}
  main > .kafelki-akcji--dwie{order:-1}
  /* Tankowanie: przycisk „Zapisz" zawsze widoczny nad dolnym paskiem — bez przewijania. */
  .tank form.karta > .rzad:last-child{position:sticky;bottom:calc(66px + env(safe-area-inset-bottom));z-index:5;
    background:var(--p1);margin:0 -20px -20px;padding:12px 20px;border-top:1px solid var(--kr);
    box-shadow:0 -10px 20px -14px rgba(0,0,0,.35)}
  .tank form.karta > .rzad:last-child .btn.duzy{display:none}
  /* Skąd paliwo: TRZY przyciski obok siebie (Stacja firmowa · Z kanistra · Stacja zewnętrzna),
     wszystkie widoczne naraz nad „Zapisz". Trzy karty z akapitami zajmowały pół ekranu,
     a dwie ostatnie chowały się pod przyciskiem. Wyjaśnienia zostają na komputerze. */
  .tank .wybor-duzy{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
  .tank .opcja-duza{position:relative;padding:10px 8px;min-height:56px;display:flex;align-items:center;justify-content:center;text-align:center}
  .tank .opcja-duza input{position:absolute;opacity:0;pointer-events:none}
  .tank .opcja-duza b{font-size:var(--t-s);line-height:1.2}
  .tank .opcja-duza span{display:none}
  /* Nagłówek maszyny zwarty: numer i nazwa w dwóch linijkach, „Zmień" obok — pola litrów
     wchodzą na pierwszy ekran zamiast pod kciuk. */
  .tank .tankowanie-co{display:grid;grid-template-columns:1fr auto;align-items:center;column-gap:12px;row-gap:2px;padding:14px 16px}
  .tank .tankowanie-co .oko,.tank .tankowanie-co .pod{display:none}
  .tank .tankowanie-co .nr-duzy{font-size:1.5rem;margin:0}
  .tank .tankowanie-co .nazwa-duza{grid-column:1;font-size:var(--t-b);margin:0}
  .tank .tankowanie-co .btn{grid-column:2;grid-row:1 / span 2;min-height:44px}
}

/* 5.59.0 — zwroty bez magazyniera do sprawdzenia: baner na karcie i lista. */
.zwrot-sprawdz{border-left:4px solid var(--akcent);gap:12px}
.zwrot-sprawdz b{display:block;font-size:var(--t-b)}
.zwrot-sprawdz span{color:var(--t1)}
.lista-zwrotow{gap:0;padding:6px 20px}
.zwrot-wiersz{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  padding:14px 0;border-bottom:1px solid var(--kr3)}
.zwrot-wiersz:last-child{border-bottom:0}
.zwrot-wiersz .nr{font-weight:600}
.zwrot-wiersz form{margin:0}
@media (max-width:640px){.zwrot-wiersz > .rzad{width:100%}.zwrot-wiersz > .rzad > form{flex:1}.zwrot-wiersz > .rzad .btn.pri{width:100%}}
.zwrot-wiersz details[open]{flex:1 1 100%}
.zwrot-wiersz details form{flex-wrap:wrap;margin-top:8px}
.zwrot-wiersz details input{flex:1 1 100%;min-width:0}
.zwrot-wiersz details .btn.zly{flex:1 1 100%}

/* =========================================================================
   5.60.0 — PODPOWIEDZI DO WYŁĄCZENIA („Mój stan” → Podpowiedzi). Chowamy wyłącznie
   objaśnienia: podpowiedzi przy polach, wstępy pod tytułami, opisy na kafelkach i
   oznaczone `objasnienie`. Komunikaty, błędy, ostrzeżenia i dane zostają zawsze.
   ========================================================================= */
html[data-podpowiedzi="ukryte"] .podpowiedz:not([data-numer-podpis]),
html[data-podpowiedzi="ukryte"] .wstep,
html[data-podpowiedzi="ukryte"] .objasnienie,
html[data-podpowiedzi="ukryte"] .kafelek-akcji__opis{display:none}

/* 5.60.1 — wąskie ekrany (iPhone SE: 320–375 px). Długa nazwa bez spacji (numer seryjny, VIN)
   łamie się zamiast rozpychać stronę w bok; długi napis przycisku schodzi do drugiej linii. */
h1,h2,h3{overflow-wrap:anywhere}
@media (max-width:600px){.btn{white-space:normal;text-align:center}}
/* Siatka „etykieta — wartość” na karcie: wartość (numer seryjny, VIN) może się łamać. */
.kv{grid-template-columns:fit-content(40%) minmax(0,1fr)}
.kv > *{min-width:0}
.kv dd{overflow-wrap:anywhere}
.kv dt{min-width:auto;overflow-wrap:normal}
/* Rubryka stanu na wąskim telefonie: trzy kolumny po ~110 px — napis „Przekazane, niepotwierdzone”
   nie mieścił się i wypychał stronę w bok. Ciaśniejsze litery, dzielenie tylko na spacjach. */
@media (max-width:480px){
  .stan-pas > *{min-width:0}
  .stan-pas small{letter-spacing:.02em;font-size:10.5px}
  .stan-pas > *:not(:first-child){padding-left:10px}
  .stan-pas > *:nth-child(2){padding-left:0}
}

/* =====================================================================================
   SYSTEM WIZUALNY 5.61.0 — „Tabliczka znamionowa”
   Zgłoszenie Sławka 05.10.2026: „wygląda jak pisany przez model językowy”, „zapanuj nad
   czcionkami”, „wykresy bardzo słabe”. Zasady (pełny opis: DECYZJE.md, sekcja „Wygląd”):
   • JEDEN krój na cały program: Archivo (odmiana zmienna, OFL, leży w public/fonty).
     Martian Mono WYŁĄCZNIE dla kodów: numer inwentarzowy, nr rejestracyjny, seryjny.
     Żadnych wersalików z rozstrzeleniem poza nagłówkiem tabeli.
   • Skala 1,25 od 15 px: 12 · 13 · 15 · 17 · 20 · 24 · 30 · 44 (liczba główna).
   • Barwy z logo: grafit (nawigacja), bursztyn TYLKO na tym, co się naciska lub wymaga
     uwagi; tło jasny beton, karty białe, kreski 1 px półprzezroczyste, bez cieni.
   • Sześciokąt (nakrętka z logo) — znak programu i plakietki liczb. Nic więcej.
   ===================================================================================== */

:root{
  --f:"Chivo","Segoe UI",system-ui,Arial,sans-serif;
  --t-xs:12px; --t-s:13px; --t-m:14px; --t-b:15px; --t-l:17px; --t-xl:20px; --t-2xl:24px;
}
:root[data-motyw="zolty"]{
  --tlo:#17171A;                       /* grafit: szyna, belka telefonu, dolny pasek */
  --p0:#F4F3F0; --p1:#FFFFFF; --p2:#FAF9F7; --wklesle:#F1F0EC;
  --t0:#17150F; --t1:#4A463F; --t2:#6E695F; --t3:#ABA69D;   /* t2: 5.64.1 — było #77726A, 4,3:1 */
  --kr:rgba(23,21,15,.10); --kr2:rgba(23,21,15,.18); --kr3:rgba(23,21,15,.06);
  --akcent:#F6B40E; --na-akcencie:#17150F; --akcent-t:#7A5300; --akcent-tlo:rgba(246,180,14,.16);
  --baza:#3F7A55; --droga:#2E5AA6; --awaria:#C23A2E; --uwaga:#A8650A;
  --r-s:4px; --r-m:6px; --r-l:8px; --r-xl:10px; --cien:none;
}
body{font-size:15px;line-height:1.5;font-variant-numeric:normal;font-feature-settings:"ss01" 0}
h1{font-size:30px;font-weight:700;letter-spacing:-.022em;line-height:1.1}
h2{font-size:17px;font-weight:650;letter-spacing:-.01em}
h3{font-size:15px;font-weight:650}
.pod{font-size:14px;color:var(--t2)}
.oko{font-family:var(--f);font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:none;color:var(--t2)}
td,.tabela td{font-variant-numeric:tabular-nums}
@media (max-width:900px){h1{font-size:26px}}

/* karty: kartka na betonie — kreska 1 px, bez cienia, ten sam promień wszędzie */
.karta,:root:not([data-motyw="jasny"]) .karta{box-shadow:none;border:1px solid var(--kr);border-radius:var(--r-l);padding:20px 22px}
.kafelek-akcji{box-shadow:none;border:1px solid var(--kr);border-radius:var(--r-l)}
.kafelek-akcji:hover{box-shadow:none;border-color:var(--kr2)}
.kafelek-akcji__tytul{font-weight:650;font-size:17px;letter-spacing:-.01em}
.kafelek-akcji__ikona{border-radius:var(--r-m)}

/* przyciski: wysokość jak pole tekstowe, waga 600, bursztyn tylko na głównym */
.btn{border-radius:var(--r-m);font-weight:600;letter-spacing:-.005em;box-shadow:none}
.btn.pri{font-weight:650}

/* szyna: grafit, wybrana pozycja = bursztynowy znacznik + jaśniejsze pole, nie żółta plama */
:root[data-motyw="zolty"] .szyna nav a{font-size:14.5px;font-weight:500;border-radius:var(--r-m);padding:7px 12px}
:root[data-motyw="zolty"] .szyna nav a[aria-current="page"]{background:rgba(255,255,255,.09);color:#fff;font-weight:600;
  box-shadow:inset 3px 0 0 var(--akcent)}
:root[data-motyw="zolty"] .szyna nav a[aria-current="page"] svg{color:var(--akcent)}
:root[data-motyw="zolty"] .szyna .sekcja-menu{font:600 11px/1 var(--f);letter-spacing:.08em;color:rgba(255,255,255,.36);margin-top:14px}
.szyna nav a svg,.czyn-gora svg{stroke-width:1.8}
.marka .znak,:root[data-motyw="zolty"] .szyna .marka .znak,:root[data-motyw="zolty"] .gora .marka .znak{
  border-radius:0;border:0;clip-path:polygon(25% 3%,75% 3%,100% 50%,75% 97%,25% 97%,0 50%)}
.marka b{font-weight:700;letter-spacing:-.015em}
.licznik{font-family:var(--f);font-weight:700;border-radius:0;min-width:20px;height:18px;padding:0 6px;
  clip-path:polygon(4px 0,calc(100% - 4px) 0,100% 50%,calc(100% - 4px) 100%,4px 100%,0 50%)}

/* górny pasek biura: spokojny, przyciski jak narzędzia na tablicy */
.pasek-biura{background:var(--p0);border-bottom:1px solid var(--kr)}
.czyn-gora{border-radius:var(--r-m);border:1px solid var(--kr);background:var(--p1);font-weight:600;font-size:14px;box-shadow:none}
.czyn-gora:hover{border-color:var(--kr2);background:var(--p1)}

/* PULPIT — na komputerze czynności są w górnym pasku, duże kafle byłyby dublem */
@media (min-width:901px){.kafelki-pulpitu{display:none}}
.sprawy > .rzad{border-bottom:1px solid var(--kr3);padding:16px 22px 12px}
.sprawy .rzad .oko{color:var(--t2)}
.sprawa{padding:14px 22px}
.sprawa .bel{border-radius:0;border:0;width:40px;height:40px;font:700 17px/1 var(--f);
  clip-path:polygon(25% 2%,75% 2%,100% 50%,75% 98%,25% 98%,0 50%)}
.sprawa.akcja .bel{background:var(--akcent);color:var(--na-akcencie)}
.sprawa .tresc b{font-size:15px;font-weight:650}
.sprawa .tresc span{font-size:13.5px}

/* rubryka stanu: liczby stoją na stronie, etykiety zwykłym zdaniem, nie wersalikami */
.stan-pas{border-top:0;border-bottom:1px solid var(--kr)}
.stan-pas > *{padding:4px 28px 16px;border-left:1px solid var(--kr3)}
.stan-pas b{font:650 30px/1.05 var(--f);letter-spacing:-.025em}
.stan-pas > *:first-child b{font-size:44px;font-weight:700}
.stan-pas small{font:500 13px/1.3 var(--f);letter-spacing:0;text-transform:none;color:var(--t2);margin-top:6px}
.stan-pas .stan-kiedy small{font-size:12px;color:var(--t3)}
.rail{height:6px;border-radius:0;gap:2px;margin-top:0}
.rail i{border-radius:0}
@media (max-width:900px){
  .stan-pas{border-bottom:0}
  .stan-pas > *{padding:10px 0 12px 12px}
  .stan-pas > *:first-child b{font-size:44px}
  .stan-pas b{font-size:24px}
  .stan-pas small{font-size:12.5px;letter-spacing:0}
}
@media (max-width:480px){.stan-pas small{font-size:12px;letter-spacing:0}}

/* ---------------- WYKRESY (dataviz: jedna oś, osie ciche, dane głośne) ---------------- */
.wyk-glowa{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
.wyk-liczby{display:flex;gap:28px;flex-wrap:wrap;align-items:flex-end}
.wyk-liczby > div{display:grid;grid-template-columns:auto auto;column-gap:8px;align-items:baseline}
.wyk-liczby b{font:700 30px/1 var(--f);letter-spacing:-.025em;color:var(--t0)}
.wyk-liczby small{grid-column:1 / -1;font-size:13px;color:var(--t2);margin-top:4px}
.wyk-liczby .wyk-klucz{display:none}
.wyk-liczby > div:has(.wyk-klucz){grid-template-columns:10px auto}
.wyk-liczby .wyk-klucz{display:block;width:10px;height:10px;align-self:center}
.wyk-klucz-g{background:var(--t0)}
.wyk-klucz-d{background:var(--akcent)}
.wyk-liczby > div:has(.wyk-klucz) small{grid-column:2}
.wyk-saldo b{font-size:20px;color:var(--t1)}
.wyk{margin:4px 0 0;display:grid;grid-template-columns:auto 1fr;column-gap:10px}
.wyk-os-y{display:flex;flex-direction:column;justify-content:space-between;font-size:11px;color:var(--t2);
  text-align:right;font-variant-numeric:tabular-nums;padding:0}
.wyk-pole{position:relative;display:grid;grid-template-columns:repeat(var(--n),1fr);gap:2px;height:160px;
  background:linear-gradient(var(--kr3),var(--kr3)) 0 0/100% 1px no-repeat,
             linear-gradient(var(--kr3),var(--kr3)) 0 100%/100% 1px no-repeat}
.wyk-os-x{grid-column:2;display:grid;grid-template-columns:repeat(var(--n),1fr);gap:2px;margin-top:6px;
  font-size:11px;color:var(--t2);font-variant-numeric:tabular-nums}
.wyk-os-x span{white-space:nowrap;overflow:visible}
.wk{position:relative;display:flex;flex-direction:column;min-width:0;outline:0;cursor:default}
.wk.wolny{background:rgba(23,21,15,.025)}
/* lustro: góra = wydania (grafit) rośnie od osi w górę, dół = zwroty (bursztyn) w dół */
.wyk-ruch .wk-g,.wyk-ruch .wk-d{flex:1;display:flex;justify-content:center}
.wyk-ruch .wk-g{align-items:flex-end;border-bottom:1px solid var(--kr2)}
.wyk-ruch .wk-d{align-items:flex-start}
.wk i{display:block;width:min(100%,14px);background:var(--t0)}
.wyk-ruch .wk-g i{border-radius:3px 3px 0 0}
.wyk-ruch .wk-d i{background:var(--akcent);border-radius:0 0 3px 3px}
.wyk-mies .wk{justify-content:flex-end}
.wyk-mies .wk-g{flex:1;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid var(--kr2)}
.wyk-mies .wk i{width:min(70%,26px);border-radius:3px 3px 0 0}
.wyk-mies .wk b{position:absolute;left:50%;transform:translateX(-50%);top:-2px;font-size:12px;font-weight:650;white-space:nowrap}
.wyk-mies{grid-template-columns:1fr}
.wyk-mies .wyk-os-x{grid-column:1;text-align:center}
.wk.dzis .wk-g i{background:var(--t0)}
.wk:hover i,.wk:focus-visible i{filter:brightness(1.25)}
.wk:hover,.wk:focus-visible{background:rgba(23,21,15,.05)}
.wk[data-tip]:hover::after,.wk[data-tip]:focus-visible::after{content:attr(data-tip);position:absolute;z-index:5;
  bottom:calc(100% + 6px);left:50%;transform:translateX(-50%);white-space:nowrap;
  background:var(--tlo);color:#fff;font-size:12px;font-weight:500;padding:6px 9px;border-radius:var(--r-s);pointer-events:none}
.wyk-ruch .wk:first-child:hover::after{left:0;transform:none}
.wyk-ruch .wk:last-child:hover::after{left:auto;right:0;transform:none}
@media (max-width:600px){.wyk-pole{height:120px}.wyk-liczby{gap:18px}.wyk-liczby b{font-size:24px}}

/* kody — jedyne miejsce dla kroju monospace */
.numer,.odczyt-nr .numer,td.nr{font-family:var(--fm);letter-spacing:.01em}
.karta.sprawy{padding:0;gap:0}
:root .karta.sprawy{padding:0;gap:0}
.wk.wolny{background:none}
.wyk-ruch .wk-g{border-bottom:0}
.wyk-ruch .wyk-pole{background:
  linear-gradient(var(--kr3),var(--kr3)) 0 0/100% 1px no-repeat,
  linear-gradient(var(--kr2),var(--kr2)) 0 50%/100% 1px no-repeat,
  linear-gradient(var(--kr3),var(--kr3)) 0 100%/100% 1px no-repeat}
.wyk-ruch .wk i{width:min(100%,10px)}
.wyk-liczby{align-items:flex-start}
.wyk-saldo{align-self:stretch;border-left:1px solid var(--kr);padding-left:24px}
.wyk-saldo b{font:650 20px/1.5 var(--f);color:var(--t1)}
.rail{height:4px}
.rail .r-baza{background:#5B5750}
.wyk-mies .wk-g{border-bottom:0}
.wyk-mies .wyk-pole{background:linear-gradient(var(--kr2),var(--kr2)) 0 100%/100% 1px no-repeat}
.wyk-mies .wyk-pole{padding-top:22px;height:182px}
.wyk-mies .wk-g{flex-direction:column;align-items:center;justify-content:flex-end}
.wyk-mies .wk b{position:static;transform:none;margin-bottom:5px;font-size:12px;font-weight:650;color:var(--t0)}
.najdrozsze b{font-family:var(--f);font-weight:650}
.najdrozsze{border-top:1px solid var(--kr);padding-top:14px}

/* Wersaliki z rozstrzeleniem zostają TYLKO w nagłówku tabeli i nagłówku grupy menu.
   Wszędzie indziej etykieta to zwykłe zdanie: 13 px, kolor drugorzędny. */
.kafel span,.komunikat > b:first-child,.kto span,.kv dt,.odczyt-kto dt,.oko,.osoby-naglowek,.wroc,td[data-l]::before{
  text-transform:none;letter-spacing:0;font-family:var(--f);font-size:13px;font-weight:500}
.kv dt,.odczyt-kto dt{color:var(--t2)}
.wroc{font-weight:600;color:var(--t1)}

/* =========================== 5.61.0 — wykresy, tabele, pasek stanu (runda 2) =========================== */
/* Pasek stanu: każdy odcinek ma swój klucz przy liczbie — kolor coś znaczy, nie zdobi. */
.rail{height:8px;gap:2px;border-radius:2px;overflow:hidden}
.rail .r-baza,.klucz.r-baza{background:#55524B}
.rail .r-ludzi,.klucz.r-ludzi{background:var(--akcent)}
.rail .r-naprawa,.klucz.r-naprawa{background:var(--awaria)}
.rail .r-wycofane,.klucz.r-wycofane{background:#CFCBC3}
.rail .r-wylaczone,.klucz.r-wylaczone{background:var(--uwaga)}
.stan-pas small{display:flex;align-items:center;gap:7px}
.klucz{display:inline-block;width:9px;height:9px;border-radius:2px;flex:none}
.stan-pas .zero .klucz{opacity:.35}

/* Wykresy: siatka co pół skali, podpisy osi przy liniach, słupek z zaokrąglonym końcem od osi */
.wyk{grid-template-columns:auto minmax(0,1fr);column-gap:10px;margin-top:6px}
.wyk-os-y{display:flex;flex-direction:column;justify-content:space-between;font-size:11.5px;color:var(--t2);
  text-align:right;font-variant-numeric:tabular-nums;min-width:22px;line-height:1;margin:-5px 0}
.wyk-ruch .wyk-pole{height:170px;background:
  linear-gradient(var(--kr3),var(--kr3)) 0 0/100% 1px no-repeat,
  linear-gradient(var(--kr3),var(--kr3)) 0 25%/100% 1px no-repeat,
  linear-gradient(var(--kr2),var(--kr2)) 0 50%/100% 1px no-repeat,
  linear-gradient(var(--kr3),var(--kr3)) 0 75%/100% 1px no-repeat,
  linear-gradient(var(--kr3),var(--kr3)) 0 100%/100% 1px no-repeat}
.wyk-ruch .wk.pon{box-shadow:inset 1px 0 0 var(--kr3)}
.wyk-ruch .wk i{width:min(76%,11px)}
.wyk-ruch .wk-g i{border-radius:3px 3px 0 0;background:#2B2925}
.wyk-ruch .wk-d i{border-radius:0 0 3px 3px}
.wk.dzis{background:rgba(246,180,14,.10)}
.wyk-os-x .dzis{color:var(--t0);font-weight:600}
.wyk-mies{grid-template-columns:auto minmax(0,1fr)}
.wyk-mies .wyk-os-x{grid-column:2}
.wyk-mies .wyk-pole{height:170px;padding-top:0;background:
  linear-gradient(var(--kr3),var(--kr3)) 0 0/100% 1px no-repeat,
  linear-gradient(var(--kr3),var(--kr3)) 0 50%/100% 1px no-repeat,
  linear-gradient(var(--kr2),var(--kr2)) 0 100%/100% 1px no-repeat}
.wyk-mies .wk i{width:min(62%,28px);background:#2B2925;border-radius:3px 3px 0 0}
.wyk-mies .wk.szczyt i{background:var(--t0)}
.wyk-mies .wk.dzis i{background:var(--akcent)}
.wyk-mies .wk b{position:absolute;bottom:calc(var(--h,0%) + 4px);font-size:12px;font-weight:700;white-space:nowrap}
.wyk-mies .wk-g{position:relative}
.wyk-mies .wk b{position:static;margin-bottom:4px}
.wk[data-tip]:hover::after,.wk[data-tip]:focus-visible::after{font-family:var(--f);font-size:12.5px;font-weight:500;padding:7px 10px;
  border-radius:6px;box-shadow:0 6px 16px -6px rgba(0,0,0,.35)}
.wyk-mies .wk:first-child:hover::after,.wyk-mies .wk:first-child:focus-visible::after{left:0;transform:none}
.wyk-mies .wk:last-child:hover::after,.wyk-mies .wk:last-child:focus-visible::after{left:auto;right:0;transform:none}

/* TABELE: wiersz 52 px, nagłówek na lekkim tle, liczby do prawej, kody krojem z przekreślonym zerem */
.tabela{border-radius:var(--r-l);border:1px solid var(--kr)}
thead th{background:var(--p2);font-size:11.5px;letter-spacing:.07em;color:var(--t2);padding-top:11px;padding-bottom:10px;border-bottom:1px solid var(--kr)}
th,td{padding:13px 16px}
tbody tr{border-bottom:1px solid var(--kr3);transition:background .12s}
tbody tr:hover{background:#FBF7EC}
tbody td{color:var(--t1);font-size:14.5px}
td a{font-weight:600}
td.nr{font-family:var(--f);font-weight:500;color:var(--t1);font-size:14.5px}
td[data-l="Rok"],th.nr{text-align:right}
td.nr.kod,.kod,dd.nr.kod{font-family:var(--fm);font-weight:600;color:var(--t0);letter-spacing:.01em;font-size:14px}
.grupa-naglowek td{background:var(--p0);font-size:11.5px;letter-spacing:.08em;color:var(--t1);padding-top:9px;padding-bottom:9px;border-bottom:1px solid var(--kr)}
.plakietka{border-radius:4px;font-weight:600;font-size:12.5px}
p.wyk-saldo{margin:-4px 0 0;font-size:13px;color:var(--t2);border:0;padding:0}
p.wyk-saldo b{font:700 13px var(--f);color:var(--t0)}
body{letter-spacing:-.003em}
/* W tabeli „W magazynie” to stan spoczynku — zwykły tekst z kropką, nie ramka w każdym wierszu.
   Wyróżnia się tylko to, co odbiega: sprzęt u ludzi, awaria, po terminie. */
td.ukogo .plakietka.p-baza{background:none;border:0;padding:0;color:var(--t2);font-weight:500;font-size:14px}
td.ukogo .plakietka.p-baza::before{background:var(--baza)}
td a{font-weight:500;color:var(--t0)}
td.nr:not(.kod){font-weight:400;color:var(--t2)}

/* 5.61.0 runda 3 (zgłoszenie Sławka 05.10.2026, 21:07):
   „przyciski na górze bardzo słabe, niewidoczne, a to podstawowe funkcje”; „żółty pasek przy pozycji menu
   wygląda jak pisane przez AI”. Czynności = jedna grafitowa listwa narzędzi, ikona nad… obok napisu,
   biały tekst; wybrana pozycja menu = jaśniejsze pole i biały pogrubiony napis, bez paska. */
.czynnosci-gora{display:flex;gap:0;background:var(--tlo);border-radius:8px;padding:3px;box-shadow:0 1px 0 rgba(0,0,0,.04)}
.czyn-gora{background:transparent;border:0;color:#fff;font-weight:600;font-size:14.5px;min-height:42px;padding:0 16px;border-radius:6px;gap:9px}
.czyn-gora + .czyn-gora{position:relative}
.czyn-gora + .czyn-gora::before{content:"";position:absolute;left:0;top:11px;bottom:11px;width:1px;background:rgba(255,255,255,.14)}
.czyn-gora svg{width:19px;height:19px;stroke-width:2;color:var(--akcent)}
.czyn-gora:hover{background:rgba(255,255,255,.10);border:0}
.czyn-gora:hover::before,.czyn-gora:hover + .czyn-gora::before{opacity:0}
.czyn-gora:active{transform:scale(.98)}
.czyn-gora[aria-current="page"]{background:var(--akcent);color:var(--na-akcencie)}
.czyn-gora[aria-current="page"] svg{color:var(--na-akcencie)}
.czyn-gora:focus-visible{outline:2px solid var(--akcent);outline-offset:1px}

:root[data-motyw="zolty"] .szyna nav a[aria-current="page"]{background:#2C2C31;box-shadow:none;color:#fff;font-weight:650}
:root[data-motyw="zolty"] .szyna nav a[aria-current="page"] svg{color:#fff}

/* =========================== 5.62.0 — opinie Gemini/Grok/DeepSeek, wybór Sławka =========================== */
/* 1. ŻÓŁTY TYLKO NA JEDNĄ CZYNNOŚĆ GŁÓWNĄ. Liczniki, sprawy, wykresy — grafit i szarości. */
.licznik,:root[data-motyw="zolty"] .licznik{background:rgba(255,255,255,.16);color:#fff}
.tresc .licznik,.plotno .licznik{background:var(--t0);color:#fff}
.sprawa .bel,.sprawa.akcja .bel{background:var(--t0);color:#fff}
.sprawa.zle .bel{background:var(--awaria);color:#fff}
.sprawa.uwaga .bel{background:#E9E4D8;color:var(--t0)}

/* 2. LISTWA: jedna główna (żółta), reszta grafit z jasną ikoną; litera skrótu przy nazwie */
.czyn-gora svg{color:rgba(255,255,255,.75)}
.czyn-gora.glowna{background:var(--akcent);color:var(--na-akcencie)}
.czyn-gora.glowna svg{color:var(--na-akcencie)}
.czyn-gora.glowna::before,.czyn-gora.glowna + .czyn-gora::before{opacity:0}
.czyn-gora kbd{font:600 11px/1 var(--fm);padding:3px 5px;border-radius:3px;background:rgba(255,255,255,.12);color:rgba(255,255,255,.7);margin-left:2px}
.czyn-gora.glowna kbd{background:rgba(0,0,0,.12);color:var(--na-akcencie)}
.czyn-gora[aria-current="page"]:not(.glowna){background:rgba(255,255,255,.16);color:#fff}

/* 3. PULPIT: bez paska proporcji i kwadracików; zera małe; zadania listą bez ramki */
.rail,.klucz{display:none}
.stan-pas{border-bottom:1px solid var(--kr)}
.stan-pas .zero b{font-size:20px;font-weight:600;color:var(--t3);margin-top:10px}
:root .karta.sprawy{background:transparent;border:0;border-radius:0;border-top:2px solid var(--t0)}
.karta.sprawy > .rzad{padding:12px 0 10px;border-bottom:1px solid var(--kr)}
.karta.sprawy .sprawa{padding:12px 0;border-bottom:1px solid var(--kr3)}
.karta.sprawy h2{font-size:20px}

/* wykresy w grafitach: wydania ciemny grafit, zwroty jasny grafit; „dziś” szarym tłem */
.wyk-klucz-d,.wyk-ruch .wk-d i{background:#A39E94}
.wyk-klucz-g{background:#2B2925}
.wk.dzis{background:rgba(23,21,15,.05)}
.wyk-mies .wk.dzis i{background:#2B2925}

/* nagłówki sekcji: „Paliwo w zbiorniku” to nagłówek, nie podpis */
.zbiornik-skrot .oko{font-size:17px;font-weight:650;color:var(--t0);letter-spacing:-.01em}

/* 4. TELEFON i karta: jedna czynność główna (grafit, żółta ikona), reszta listą z „›” */
.kafelek-akcji--glowny{background:var(--t0);border-color:var(--t0)}
.kafelek-akcji--glowny .kafelek-akcji__tytul,.kafelek-akcji--glowny .kafelek-akcji__opis{color:#fff}
.kafelek-akcji--glowny .kafelek-akcji__opis{opacity:.72}
.kafelek-akcji--glowny .kafelek-akcji__ikona{background:var(--akcent);color:var(--na-akcencie)}
.kafelek-akcji{min-height:56px}
.kafelki-akcji{gap:0}
.kafelki-akcji .kafelek-akcji--glowny{margin-bottom:10px}
.kafelki-akcji .kafelek-akcji:not(.kafelek-akcji--glowny){border-radius:0;border:0;border-bottom:1px solid var(--kr);background:transparent;
  padding:12px 4px;position:relative;padding-right:28px}
.kafelki-akcji .kafelek-akcji:not(.kafelek-akcji--glowny)::after{content:"›";position:absolute;right:6px;top:50%;transform:translateY(-52%);
  font-size:26px;line-height:1;color:var(--t3)}
.kafelki-akcji .kafelek-akcji:not(.kafelek-akcji--glowny) .kafelek-akcji__ikona{width:40px;height:40px;background:var(--wklesle)}
.kafelki-akcji .kafelek-akcji:not(.kafelek-akcji--glowny) .kafelek-akcji__tytul{font-size:16px}
.kafelki-akcji--dwie{display:flex;flex-direction:column}
.btn{min-height:48px}
@media (max-width:900px){.btn{min-height:52px}.btn.pri{min-height:56px}}

/* dolny pasek: wybrana pozycja = jasne tło pod ikoną, nie kreska */
@media (max-width:900px){
  :root .dol a[aria-current="page"]::before,:root .dol summary.aktywna::before{display:none}
  :root[data-motyw="zolty"] .dol a[aria-current="page"],:root[data-motyw="zolty"] .dol summary.aktywna{color:#fff}
  .dol a[aria-current="page"] svg,.dol summary.aktywna svg{background:rgba(255,255,255,.16);border-radius:999px;padding:4px 16px;box-sizing:content-box}
  .dol a svg,.dol summary svg{stroke-width:2}
}

/* 5. Ikony grubszą kreską */
.szyna nav a svg,.czyn-gora svg,.kafelek-akcji__ikona svg{stroke-width:2.1}

/* 6. Numer inwentarzowy na karcie = tabliczka znamionowa: grafitowa blacha, nity w rogach */
.odczyt .numer{display:inline-block;background:var(--t0);color:#F4F3F0;padding:10px 22px 8px;border-radius:5px;line-height:1;
  box-shadow:inset 0 0 0 2px #17150F,inset 0 0 0 3px rgba(255,255,255,.18);
  background-image:radial-gradient(circle at 7px 7px,rgba(255,255,255,.35) 1.6px,transparent 2.2px),
    radial-gradient(circle at calc(100% - 7px) 7px,rgba(255,255,255,.35) 1.6px,transparent 2.2px),
    radial-gradient(circle at 7px calc(100% - 7px),rgba(255,255,255,.35) 1.6px,transparent 2.2px),
    radial-gradient(circle at calc(100% - 7px) calc(100% - 7px),rgba(255,255,255,.35) 1.6px,transparent 2.2px)}

/* 7. Tabela: rodzaj przy grupie po kropce, spokojniej */
.grupa-naglowek td span{color:var(--t2);font-weight:500;letter-spacing:.04em}

/* skala liter (ustalona): 11 · 13 · 14 · 15 · 17 · 20 · 24 · 30 · 44 */
@media (min-width:901px){.kafelki-akcji.kafelki-pulpitu{display:none}}

/* =========================== 5.62.0 — pulpit jako briefing (Grok), poprawki DeepSeeka =========================== */
/* nagłówek: mniejszy, w jednej linii ze stanem połączenia i godziną */
.brief-glowa{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}
.brief-glowa h1{font-size:24px;letter-spacing:-.015em}
.brief-glowa .pod{margin-top:2px;font-size:13.5px}
.brief-stan{display:flex;flex-direction:column;align-items:flex-end;gap:3px;font-size:12.5px;color:var(--t2)}
.polaczenie{display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--baza)}
.polaczenie::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}
.polaczenie.brak{color:var(--awaria)}
@media (max-width:900px){.brief-glowa h1{font-size:22px}.brief-stan{align-items:flex-start}}

/* Wymaga uwagi: pierwsza sekcja, max 4 sprawy, reszta pod „Pokaż wszystkie” */
.uwaga-sekcja h2{font-size:18px}
.uwaga-wiecej summary{cursor:pointer;padding:12px 0;font-weight:600;font-size:14px;color:var(--t1);list-style:none}
.uwaga-wiecej summary::-webkit-details-marker{display:none}
.uwaga-wiecej summary::before{content:"+ "}
.uwaga-wiecej[open] summary::before{content:"− "}
.sprawa .bel,.sprawa.akcja .bel{background:var(--akcent);color:var(--na-akcencie)}

/* stan sprzętu w jednej linii */
.stan-linia{display:flex;align-items:baseline;gap:8px 22px;flex-wrap:wrap;padding:2px 0 14px;border-bottom:1px solid var(--kr)}
.stan-linia h2{font-size:14px;font-weight:650;color:var(--t2);margin-right:4px}
.stan-linia > div{display:flex;flex-wrap:wrap;gap:6px 0}
.stan-linia a{display:inline-flex;align-items:baseline;gap:6px;text-decoration:none;color:var(--t1);padding:0 16px;border-left:1px solid var(--kr)}
.stan-linia a:first-child{padding-left:0;border-left:0}
.stan-linia b{font-size:20px;font-weight:700;color:var(--t0);letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.stan-linia small{font-size:13.5px;color:var(--t2)}
.stan-linia a.zero b{font-size:15px;color:var(--t3);font-weight:600}
.stan-linia a:hover small{color:var(--t0)}
@media (max-width:600px){.stan-linia a{padding:0 10px}.stan-linia b{font-size:18px}}

/* paliwo na końcu, spokojnie: jedna linia, bez karty */
.zbiornik-skrot{background:transparent;border:0;border-top:1px solid var(--kr);border-radius:0;padding:12px 0;box-shadow:none}
.zbiornik-skrot .oko{font-size:14px;font-weight:650;color:var(--t2)}
.zbiornik-skrot b{font-size:17px}

/* wykresy lżejsze: cieńsze słupki, wydania średni grafit */
.wyk-ruch .wk i{width:min(60%,8px)}
.wyk-ruch .wk-g i,.wyk-klucz-g{background:#4A463F}
.wyk-mies .wk i{width:min(50%,20px);background:#4A463F}
.wyk-mies .wk.szczyt i{background:var(--t0)}

/* JEDNA czynność główna = żółta, wszędzie (komputer, telefon, karta) */
.kafelek-akcji--glowny{background:var(--akcent);border-color:var(--akcent)}
.kafelek-akcji--glowny .kafelek-akcji__tytul,.kafelek-akcji--glowny .kafelek-akcji__opis{color:var(--na-akcencie)}
.kafelek-akcji--glowny .kafelek-akcji__opis{opacity:.75}
.kafelek-akcji--glowny .kafelek-akcji__ikona{background:var(--t0);color:var(--akcent)}

/* karta sprzętu: „W magazynie” to stan spoczynku — mała linijka, nie zielona karta.
   Karta zostaje dla stanów, które coś znaczą (u pracownika, awaria, wycofany). */
.pas-stanu.st-magazyn{background:none;border:0;padding:0 4px;min-height:0}
.pas-stanu.st-magazyn .pas-tresc{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}
.pas-stanu.st-magazyn b{font-size:14px;color:var(--baza)}
.pas-stanu.st-magazyn .pas-tresc span{font-size:13.5px}
.pas-stanu.st-magazyn .pas-kropka{width:8px;height:8px}

/* wyszukiwarka: lupa i klawisz „/” */
.szukaj-wszedzie{position:relative;display:flex;align-items:center}
.szukaj-wszedzie svg{position:absolute;left:12px;width:17px;height:17px;stroke:var(--t2);fill:none;stroke-width:2;pointer-events:none}
.szukaj-wszedzie input{padding-left:38px;padding-right:34px}
.szukaj-wszedzie kbd{position:absolute;right:10px;font:600 11px/1 var(--fm);padding:3px 6px;border-radius:4px;border:1px solid var(--kr);color:var(--t2);background:var(--p2)}
.szukaj-wszedzie input:focus ~ kbd{display:none}

/* tabela: najechanie podświetla wiersz, tekst nie zmienia koloru */
td a:hover,tbody tr:hover td.nr a{color:inherit}
tbody tr:hover td a{text-decoration:underline;text-decoration-color:var(--kr2);text-underline-offset:3px}

/* wersja programu cichsza */
.wersja{font-size:11px;opacity:.7}
.wersja b{font-weight:500}
.pasek-biura .szukaj-wszedzie{flex:0 1 320px}
.szukaj-wszedzie input::placeholder{font-size:14px}
.pasek-biura .szukaj-wszedzie{flex:1 1 220px;min-width:180px;max-width:320px}
.czynnosci-gora{flex-wrap:nowrap;flex-shrink:0}
.pas-stanu.st-magazyn{border:0 !important;box-shadow:none !important;background:transparent !important;outline:0}
@media (max-width:900px){.brief-glowa{flex-direction:row;align-items:flex-start}.brief-glowa h1{font-size:21px}
  .stan-pas > *:first-child b{font-size:34px}}
@media (max-width:900px){main > .brief-glowa{order:-2}}

/* =========================== 5.63.0 — plan Sławka przed pilotem (uwagi ChatGPT) =========================== */
/* 1. SPRAWY WEDŁUG PILNOŚCI: etykieta grupy zwykłym zdaniem (bez wersalików — reguła 17),
      kropka mówi kolorem to samo, co słowo: pilne = czerwień awarii, ważne = brąz ostrzeżenia, informacja = szarość. */
.sprawy-grupa + .sprawy-grupa{margin-top:6px}
.sprawy-etykieta{display:flex;align-items:center;gap:8px;margin:12px 0 0;padding-bottom:6px;
  font:600 13px/1.2 var(--f);color:var(--t1);border-bottom:1px solid var(--kr3)}
.sprawy-etykieta i{width:8px;height:8px;border-radius:50%;background:var(--t3);flex:none}
.sprawy-etykieta b{font-weight:600;color:var(--t2)}
.p-pilne .sprawy-etykieta{color:var(--awaria)}
.p-pilne .sprawy-etykieta i{background:var(--awaria)}
.p-wazne .sprawy-etykieta i{background:var(--uwaga)}
.p-info .sprawy-etykieta{color:var(--t2)}
.p-info .sprawa .bel{background:var(--wklesle);color:var(--t1)}
.karta.sprawy .sprawy-grupa .sprawa:last-child{border-bottom:0}
.uwaga-wiecej .sprawy-etykieta{margin-top:4px}

/* 2. OD OSTATNIEJ WIZYTY: odczyt, nie karta — jak „Stan sprzętu”. Wiersz = godzina · co · kto. */
.zmiany{display:flex;flex-direction:column;gap:6px;padding:2px 0 12px;border-bottom:1px solid var(--kr)}
.zmiany-glowa{display:flex;align-items:baseline;gap:6px 14px;flex-wrap:wrap}
.zmiany-glowa h2{font-size:18px}
.zmiany-suma{margin:0;font-size:14px;color:var(--t2)}
.zmiany-suma b{color:var(--t0);font-weight:700;font-variant-numeric:tabular-nums}
.zmiany-lista{display:flex;flex-direction:column}
.zmiana{display:grid;grid-template-columns:96px minmax(0,1fr) auto;gap:14px;align-items:baseline;
  padding:9px 0;border-bottom:1px solid var(--kr3);text-decoration:none;color:var(--t1);font-size:14.5px}
.zmiana:last-child{border-bottom:0}
.zmiana time{font-size:13px;color:var(--t2);font-variant-numeric:tabular-nums;white-space:nowrap}
.zmiana .zm-co{min-width:0;overflow-wrap:anywhere}
.zmiana .zm-co b{color:var(--t0);font-weight:600}
.zmiana .kod{font-size:13.5px}
.zmiana q{color:var(--t2);font-style:normal}
.zmiana .zm-kto{font-size:13.5px;color:var(--t2);white-space:nowrap}
.zmiana:hover .zm-co b{text-decoration:underline;text-decoration-color:var(--kr2);text-underline-offset:3px}
.zmiany .uwaga-wiecej summary{padding:8px 0}
@media (max-width:640px){
  .zmiana{grid-template-columns:1fr auto;gap:2px 10px;padding:10px 0}
  .zmiana .zm-co{grid-column:1 / -1;grid-row:2}
  .zmiana .zm-kto{grid-row:1;grid-column:2}
}

/* 3. COFNIJ: zwykły przycisk (żółta jest jedna czynność na ekranie), z odliczaniem obok napisu. */
.cofnij-pasek{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;margin-top:12px}
.cofnij-btn{min-height:48px;padding:0 18px;background:var(--p1);border:1px solid var(--t0);color:var(--t0);font-weight:650}
.cofnij-btn:hover{background:var(--t0);color:#fff}
.cofnij-sek{display:inline-block;min-width:3.2em;margin-left:8px;padding:2px 8px;border-radius:999px;
  background:var(--wklesle);color:var(--t1);font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;text-align:center}
.cofnij-btn:hover .cofnij-sek{background:rgba(255,255,255,.16);color:#fff}
.cofnij-opis{font-size:13px;color:var(--t2)}
.cofnij-minelo{display:block;margin-top:10px;font-size:13px;color:var(--t2)}
@media (max-width:640px){.cofnij-btn{width:100%;min-height:52px;justify-content:center}}
.protokol-tabela tr.cofniety td{color:var(--t3);text-decoration:line-through}
.protokol-tabela tr.cofniety .plakietka{text-decoration:none}

/* 4. ZGŁOŚ USTERKĘ — osobna strona */
.usterka-co{margin:-6px 0 4px;font-size:15px;color:var(--t1)}
.usterka-co .kod{margin-right:6px}

/* 5. HISTORIA Z FILTRAMI: nagłówek i przełącznik w jednym rzędzie; tankowanie wyróżnione kroplą koloru, anulowane przekreślone */
.historia-glowa{display:flex;align-items:center;justify-content:space-between;gap:10px 16px;flex-wrap:wrap;margin-bottom:12px}
.historia-filtry .chip{min-height:36px}
.hist .hist-anulowane > span > a{text-decoration:line-through;color:var(--t2)}
@media (max-width:640px){.historia-glowa{flex-direction:column;align-items:stretch}}
/* poprawki po zrzutach 5.63.0: etykieta grupy i podsumowanie to linie przez całą szerokość (p ma 68ch),
   a przełącznik historii na telefonie — dwa na dwa zamiast paska, w którym wybrany filtr uciekał za krawędź */
.sprawy-etykieta,.zmiany-suma{max-width:none}
@media (max-width:640px){
  .segmenty.historia-filtry{display:grid;grid-template-columns:1fr 1fr;overflow:visible}
  .segmenty.historia-filtry .chip{justify-content:center}
}

/* ================================================================= 5.64.0 IMPORT Z PLIKU ===
   Tabela „Kolumny w pliku”: po lewej nagłówek z pliku i przykład, po prawej rubryka programu.
   Na telefonie jedno pod drugim — bez przewijania w bok (wybór z listy musi mieścić się w kciuku). */
.opcje-importu{display:grid;gap:12px;margin:2px 0 16px}
.opcje-importu:not(:has(> :not([hidden]))){display:none}
.opcje-importu [hidden]{display:none !important}  /* .przelacz ma display:flex — bez tego [hidden] by nie działał */
.mapa-kolumn .mk-lista{border-top:1px solid var(--kr);margin-top:6px}
.mk-wiersz{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1.1fr);align-items:center;gap:4px 14px;
  padding:10px 0;border-bottom:1px solid var(--kr)}
.mk-plik{min-width:0}
.mk-plik b{display:block;color:var(--t0);font-weight:600;overflow-wrap:anywhere}
.mk-plik span{display:block;font-size:var(--t-s);color:var(--t2);overflow-wrap:anywhere}
.mk-strzalka{color:var(--t3);font-size:18px}
.mk-wiersz select{width:100%;min-height:44px;max-width:none}
.mk-pomin .mk-plik b,.mk-pomin select{color:var(--t2)}
.mk-reczne select{border-color:var(--akcent);box-shadow:inset 0 0 0 1px var(--akcent)}
.mk-uwaga{grid-column:1 / -1;font-size:var(--t-s);color:var(--awaria)}
.mk-brak{margin:8px 0 0;padding:10px 12px;border-radius:var(--r-m);background:var(--uwaga-tlo);color:var(--t0);max-width:none}
.mk-stopka{margin-top:10px;display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px}
.import-info,.import-uwaga{margin:8px 0 0;max-width:none}
.import-pominiete{margin-top:10px}
.import-pominiete summary{cursor:pointer}
.import-pominiete ul,.import-protokoly{margin:6px 0 0 18px;padding:0}
.import-probka th,.import-probka td{padding:9px 12px}
.import-probka th{white-space:normal;min-width:7em;vertical-align:bottom}
.import-probka td{font-size:var(--t-s)}
@media (min-width:641px){.import-probka td{max-width:20em}}
.lista-importow{list-style:none;margin:0 0 6px;padding:0}
.lista-importow li{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 12px;padding:9px 0;border-bottom:1px solid var(--kr)}
@media (max-width:640px){
  .mk-wiersz{grid-template-columns:1fr;gap:6px}
  .mk-strzalka{display:none}
  /* próbka na telefonie: kartka na wiersz, „etykieta: wartość” w jednej linii — inaczej 8 wierszy × 10 rubryk to metry ekranu */
  .import-probka tbody td + td{margin-top:2px}
  .import-probka td[data-l]::before{display:inline;margin:0 6px 0 0}
  .import-probka td{white-space:normal;overflow-wrap:anywhere}
  .import-probka tbody tr{border-bottom:1px solid var(--kr)}
}

/* ================================================================= 5.64.1 KONTRAST ===
   Pomiar axe-core (reguła color-contrast, WCAG AA 4,5:1) na ekranach terenowych w trzech motywach,
   przed pilotem. Tekst pomocniczy (--t2) był w każdym motywie poniżej progu — w słońcu na budowie
   to pierwsza rzecz, której nie widać. Poprawione w tokenach wyżej; tu tylko wyjątek głównego kafelka. */
:root[data-motyw="ciemny"] .kafelek-akcji--glowny .kafelek-akcji__opis{opacity:.9}

/* ================================================================= 5.65.0 TELEFON ===
   Zgłoszenie Sławka 08.10.2026, pierwszy dzień programu na serwerze: „na telefonie wszystko
   jest za małe i za słabo widoczne — ktoś, kto ma słabszy wzrok, będzie miał trudność
   z odczytaniem; wersja na komputer jest dobra”.
   Pomiar przed zmianą (szerokość 360 px, 15 ekranów, motyw żółty): 89% liter poniżej 16 px,
   31% poniżej 14 px; 23 pola z literami poniżej 16 px (iPhone powiększa wtedy stronę przy
   dotknięciu pola). Przyczyna: blok „SYSTEM WIZUALNY” (5.61.0) ustawił skalę 12–15 px bez
   wyjątku dla telefonu i — stojąc niżej w pliku — nadpisał starsze „na telefonie o stopień
   większe” (body 16,5 px).
   ZASADA od 5.65.0 (CLAUDE.md, zasada 21): na telefonie (≤ 900 px, tam gdzie dolny pasek)
   NIC poniżej 14 px; zwykły tekst 17 px; objaśnienia 15–16 px; pola 17 px i 52 px wysokości;
   wszystko, co się naciska, min. 48 px (zasada 6); tekst pomocniczy ciemniejszy niż na
   komputerze. Ten blok stoi NA KOŃCU pliku celowo — ma wygrać z każdą wcześniejszą regułą.
   Komputer (> 900 px) bez zmian. */
@media (max-width:900px){
  :root{--t-xs:14px;--t-s:15px;--t-m:16px;--t-b:17px;--t-l:18px;--t-xl:21px;--t-2xl:26px}
  /* ciemniejszy tekst pomocniczy: w słońcu i dla słabszego wzroku szarość 4,5:1 to za mało */
  :root[data-motyw="zolty"]{--t1:#34302A;--t2:#4B463E;--t3:#706A60}
  :root[data-motyw="jasny"]{--t1:#3E3933;--t2:#4F4943;--t3:#78716A}
  :root[data-motyw="ciemny"]{--t1:#D6CEC2;--t2:#C4BCB1;--t3:#968E84}

  body{font-size:17px;line-height:1.5}
  h1{font-size:28px;line-height:1.15}
  h2{font-size:20px}
  h3{font-size:18px}
  p,li,dd,td{font-size:inherit}
  .pod,.podpowiedz,.wstep,.objasnienie,.kafelek-akcji__opis,p.pod,span.pod{font-size:16px;line-height:1.45}
  small,time,label,dt,.kv dt,.odczyt-kto dt,.oko,thead th,.kafel span,.osoby-naglowek,td[data-l]::before,
  .sekcja-menu,.plakietka,.stan-pas small,.stan-pas .stan-kiedy small,.wyk-os-y,.wyk-os-x,.wyk-mies .wk b,
  .wyk-liczby small,.osx,.czysto-linia .etykieta,.uwaga-wiecej summary{font-size:14px}
  .kafelek-akcji__opis{font-weight:500}
  .pod,.podpowiedz{font-weight:500}
  td,.tabela td,td.gdzie,td.nr,td.nr.kod,.kod,dd.nr.kod,td.ukogo .plakietka.p-baza{font-size:16px}
  .kv dd,.odczyt-kto dd{font-size:18px}

  /* górna belka: nazwa firmy w jednej linii (było 3 linie i 90 px ekranu) */
  .gora{padding:8px 14px}
  .gora .marka b{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .gora .marka small{letter-spacing:.04em}

  /* pola: 17 px (iPhone nie powiększa strony) i 52 px wysokości */
  input:where(:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=hidden])),
  select,textarea{font-size:17px;min-height:52px}
  input::placeholder,textarea::placeholder{color:var(--t3)}
  input[type=checkbox],input[type=radio]{width:24px;height:24px}
  input[type=checkbox]:checked{background-size:100% 100%,16px 16px}

  /* wszystko, co się naciska: min. 48 px (zasada 6) */
  .btn,button,summary,.czyn-gora,.przelacz{min-height:48px}
  .wroc{font-size:15px;min-height:44px;display:inline-flex;align-items:center;margin-bottom:-8px}
  a.plakietka{min-height:44px;display:inline-flex;align-items:center;padding:6px 12px}
  .plakietka{padding:5px 11px}

  /* dolny pasek: większe podpisy i ikony, wyraźniejsze */
  .dol a,.dol summary{font-size:14px;font-weight:650;min-height:62px;gap:4px}
  .dol a svg,.dol summary svg{width:24px;height:24px;stroke-width:2.1}
  :root[data-motyw="zolty"] .dol a,:root[data-motyw="zolty"] .dol summary{color:rgba(255,255,255,.80)}
  .dol .arkusz,.pasek-zazn{bottom:calc(62px + env(safe-area-inset-bottom))}
  .dol .arkusz a{font-size:17px}
  .dol a .licznik,.dol summary .licznik{min-width:22px;height:22px;font-size:14px}
  .licznik{font-size:14px;min-width:22px;height:22px}

  /* miejsca z rozmiarem wpisanym na sztywno (wyłapane pomiarem, wąski ekran 360 px) */
  .gora .marka{min-width:0;min-height:44px}
  .gora .marka > span{min-width:0;overflow:hidden}
  .gora .marka small{font-size:14px}
  .brief-glowa h1{font-size:24px}
  .brief-glowa .pod{font-size:16px}
  .brief-stan{font-size:14px}
  .pas-tresc span,.pas-stanu .pas-tresc span,.pas-stanu.st-magazyn .pas-tresc span{font-size:16px}
  .komunikat b,.komunikat > b:first-child{font-size:inherit}
  .wyk-saldo,p.wyk-saldo{font-size:15px}
  p.wyk-saldo b{font-size:15px}
  .stan-linia h2{font-size:15px}
  .stan-linia small{font-size:15px}
  .stan-linia b{font-size:20px}
  .stan-linia a.zero b{font-size:17px}
  .stan-linia a{min-height:44px;align-items:center}
  .chip,.segmenty .chip,.chipy-gdzie .chip,.osoby-brygady .chip,.historia-filtry .chip{min-height:44px}
  .dorzuc .rozwin.przycisk > summary,.rozwin.przycisk > summary{min-height:48px}
  .wyniki-lista li{align-items:center}
  .wyniki-lista a{min-height:44px;display:inline-flex;align-items:center}
}
