/* ============================================================================
   oc.css — system wizualny modułu oc-crm.

   To nie jest strona, tylko narzędzie pracy: handlowiec siedzi w nim osiem godzin,
   patrzy na gęste tabele i na liczby. Stąd trzy decyzje, które przenikają całość:

   1. Płótno jest ciche. Kolor niesie DANE (etap lejka, stan zadania), nie ozdoby.
      Akcent jest jeden i znaczy „tu można kliknąć" — nigdy nie służy dekoracji.
   2. Rytm zamiast ramek. Wiersz ma 32 px, linie są włoskowate. Sekcje rozdziela
      odstęp i kreska, nie pudełko w pudełku.
   3. Liczby są kolumną. `tabular-nums` plus wyrównanie do prawej, żeby rzędy
      wielkości dało się porównać wzrokiem, bez czytania cyfra po cyfrze.

   Motyw: jasny domyślnie, ciemny z ustawień systemu, atrybut `data-motyw`
   na <html> ("jasny" | "ciemny") wygrywa z systemem w obie strony.
   Przełącznik: `ustawMotyw()` z wspolne.js.
   ========================================================================= */

/* --- Znaczniki: paleta jasna (pełna definicja, nigdy tylko w media query) --- */
:root {
  /* płótno i powierzchnie */
  --oc-tlo:            #f6f6f4;
  --oc-powierzchnia:   #ffffff;
  --oc-powierzchnia-2: #f0f0ec;   /* najechanie, pasek narzędzi, komórka w edycji */
  --oc-powierzchnia-3: #e7e7e1;   /* wciśnięte, aktywna zakładka na tle paska */
  --oc-zaslona:        rgba(24, 24, 20, 0.34);

  /* tekst */
  --oc-tekst:        #1a1a18;
  --oc-tekst-slaby:  #67675f;
  --oc-tekst-blady:  #93938b;
  --oc-tekst-na-akcencie: #ffffff;

  /* kreski */
  --oc-kreska:       #e3e3dd;
  --oc-kreska-mocna: #cdcdc5;

  /* akcent — jeden, zarezerwowany dla interakcji */
  --oc-akcent:        #1f5f4f;
  --oc-akcent-jasny:  #2a7a66;
  --oc-akcent-tlo:    #e6f0ec;   /* podkład: zaznaczony wiersz, aktywna zakładka */
  --oc-akcent-kreska: #a9cfc2;

  /* stany semantyczne */
  --oc-sukces:      #1f6b3f;   --oc-sukces-tlo:      #e4f1e8;
  --oc-ostrzezenie: #8a5600;   --oc-ostrzezenie-tlo: #f7eddb;
  --oc-alarm:       #a3352e;   --oc-alarm-tlo:       #f7e6e4;
  --oc-info:        #1d5a7a;   --oc-info-tlo:        #e3eef4;

  /* rampa etapów lejka — kolory liczone, nie wypisane ręcznie.
     Klasa .oc-etap--N ustawia tylko numer kroku; barwę wylicza hsl(). */
  --oc-etap-h0:     198;   /* barwa pierwszego etapu: chłodny błękit */
  --oc-etap-krok:   17;    /* przesunięcie barwy na etap — lejek ociepla się do końca */
  --oc-etap-s:      44%;
  --oc-etap-l-tlo:  91%;
  --oc-etap-l-txt:  27%;
  --oc-etap-l-kreska: 78%;
  --oc-etap-l-krok:   45%;   /* wypełnienie paska lejka; osobno, bo liczone z l-txt
                                wychodziło w ciemnym motywie prawie białe i gubiło barwę */

  /* odstępy */
  --oc-o-1: 2px;  --oc-o-2: 4px;  --oc-o-3: 6px;  --oc-o-4: 8px;
  --oc-o-5: 12px; --oc-o-6: 16px; --oc-o-7: 24px; --oc-o-8: 32px;

  /* promienie */
  --oc-r-1: 4px; --oc-r-2: 6px; --oc-r-3: 10px; --oc-r-pigulka: 999px;

  /* typografia */
  --oc-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
             system-ui, sans-serif;
  --oc-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  --oc-t-mikro: 11px; --oc-t-maly: 12px; --oc-t-baza: 13px;
  --oc-t-tresc: 14px; --oc-t-naglowek: 16px; --oc-t-duzy: 20px;

  /* wymiary siatki — rytm gęsty, ale bez ściskania */
  --oc-h-wiersz:    32px;
  --oc-h-naglowek:  34px;
  --oc-h-filtry:    34px;
  --oc-h-kontrolka: 28px;

  /* cienie: minimalne, wyłącznie dla warstw unoszących się nad treścią */
  --oc-cien-1: 0 1px 2px rgba(0,0,0,.06), 0 1px 1px rgba(0,0,0,.04);
  --oc-cien-2: 0 4px 12px rgba(0,0,0,.10), 0 1px 3px rgba(0,0,0,.06);
  --oc-cien-3: 0 16px 40px rgba(0,0,0,.18), 0 2px 8px rgba(0,0,0,.08);

  color-scheme: light dark;
}

/* --- Paleta ciemna z ustawień systemu (ustąpi jawnemu data-motyw="jasny") --- */
@media (prefers-color-scheme: dark) {
  :root:not([data-motyw="jasny"]) {
    --oc-tlo:            #131417;
    --oc-powierzchnia:   #1b1d21;
    --oc-powierzchnia-2: #23262b;
    --oc-powierzchnia-3: #2c3036;
    --oc-zaslona:        rgba(0, 0, 0, 0.58);

    --oc-tekst:        #e9e9e4;
    --oc-tekst-slaby:  #9d9d95;
    --oc-tekst-blady:  #74746d;
    --oc-tekst-na-akcencie: #0d1a16;

    --oc-kreska:       #2c3036;
    --oc-kreska-mocna: #3d434b;

    --oc-akcent:        #58b89a;
    --oc-akcent-jasny:  #74cbb0;
    --oc-akcent-tlo:    #1a2f2a;
    --oc-akcent-kreska: #2f5a4d;

    --oc-sukces:      #6cc38c;   --oc-sukces-tlo:      #172b1e;
    --oc-ostrzezenie: #d9a53f;   --oc-ostrzezenie-tlo: #2e2415;
    --oc-alarm:       #e2756c;   --oc-alarm-tlo:       #331b19;
    --oc-info:        #6ab0d0;   --oc-info-tlo:        #16262e;

    --oc-etap-s:        38%;
    --oc-etap-l-tlo:    21%;
    --oc-etap-l-txt:    76%;
    --oc-etap-l-kreska: 32%;
    --oc-etap-l-krok:   58%;

    --oc-cien-1: 0 1px 2px rgba(0,0,0,.4);
    --oc-cien-2: 0 4px 12px rgba(0,0,0,.5);
    --oc-cien-3: 0 16px 40px rgba(0,0,0,.6);
  }
}

/* --- Paleta ciemna wymuszona przełącznikiem --- */
:root[data-motyw="ciemny"] {
  --oc-tlo:            #131417;
  --oc-powierzchnia:   #1b1d21;
  --oc-powierzchnia-2: #23262b;
  --oc-powierzchnia-3: #2c3036;
  --oc-zaslona:        rgba(0, 0, 0, 0.58);

  --oc-tekst:        #e9e9e4;
  --oc-tekst-slaby:  #9d9d95;
  --oc-tekst-blady:  #74746d;
  --oc-tekst-na-akcencie: #0d1a16;

  --oc-kreska:       #2c3036;
  --oc-kreska-mocna: #3d434b;

  --oc-akcent:        #58b89a;
  --oc-akcent-jasny:  #74cbb0;
  --oc-akcent-tlo:    #1a2f2a;
  --oc-akcent-kreska: #2f5a4d;

  --oc-sukces:      #6cc38c;   --oc-sukces-tlo:      #172b1e;
  --oc-ostrzezenie: #d9a53f;   --oc-ostrzezenie-tlo: #2e2415;
  --oc-alarm:       #e2756c;   --oc-alarm-tlo:       #331b19;
  --oc-info:        #6ab0d0;   --oc-info-tlo:        #16262e;

  --oc-etap-s:        38%;
  --oc-etap-l-tlo:    21%;
  --oc-etap-l-txt:    76%;
  --oc-etap-l-kreska: 32%;
  --oc-etap-l-krok:   58%;

  --oc-cien-1: 0 1px 2px rgba(0,0,0,.4);
  --oc-cien-2: 0 4px 12px rgba(0,0,0,.5);
  --oc-cien-3: 0 16px 40px rgba(0,0,0,.6);
}

/* ==========================================================================
   Podstawa
   ========================================================================== */
*, *::before, *::after { box-sizing: border-box; }

/* Atrybut `hidden` MUSI wygrywać z `display` nadanym przez klasę.
   Reguła przeglądarki `[hidden] { display: none }` pochodzi z arkusza domyślnego,
   więc każda nasza klasa z `display: flex` ją przebija i element ustawiony przez
   `el.hidden = true` zostaje widoczny. Kosztowało to pasek akcji zbiorczych,
   który wyświetlał „Zaznaczono 0 wierszy". Chowaj elementy przez `el.hidden`. */
[hidden] { display: none !important; }

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

body {
  margin: 0;
  background: var(--oc-tlo);
  color: var(--oc-tekst);
  font: var(--oc-t-tresc)/1.5 var(--oc-font);
  /* Liczby mają stałą szerokość w CAŁEJ aplikacji, nie tylko w tabelach —
     inaczej kwota w karcie i ta sama kwota w siatce wyglądają jak dwie różne. */
  font-variant-numeric: tabular-nums;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 { margin: 0; font-weight: 600; letter-spacing: -0.011em; }
h1 { font-size: var(--oc-t-duzy); }
h2 { font-size: var(--oc-t-naglowek); }
h3 { font-size: var(--oc-t-tresc); }
h4 {
  font-size: var(--oc-t-maly); text-transform: uppercase; letter-spacing: .06em;
  color: var(--oc-tekst-slaby);
}

a { color: var(--oc-akcent); text-decoration-color: var(--oc-akcent-kreska); }
a:hover { color: var(--oc-akcent-jasny); }

code, kbd, .oc-mono { font-family: var(--oc-font-mono); font-size: .92em; }
kbd {
  border: 1px solid var(--oc-kreska-mocna); border-bottom-width: 2px;
  border-radius: var(--oc-r-1); padding: 0 4px; background: var(--oc-powierzchnia-2);
  color: var(--oc-tekst-slaby);
}

/* Jeden pierścień ogniskowej na całą aplikację. Widoczny, ale nie krzykliwy. */
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--oc-akcent);
  outline-offset: 1px;
  border-radius: var(--oc-r-1);
}

::selection { background: var(--oc-akcent-tlo); color: var(--oc-tekst); }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

/* ==========================================================================
   Układ strony
   ========================================================================== */
.oc-naglowek-strony {
  display: flex; align-items: center; gap: var(--oc-o-6);
  padding: var(--oc-o-5) var(--oc-o-6);
  background: var(--oc-powierzchnia);
  border-bottom: 1px solid var(--oc-kreska);
  position: sticky; top: 0; z-index: 40;
}
.oc-naglowek-strony h1 { font-size: var(--oc-t-naglowek); }
.oc-rozpychacz { flex: 1 1 auto; }

.oc-tresc { padding: var(--oc-o-6); }
.oc-stos  { display: grid; gap: var(--oc-o-5); }
.oc-rzad  { display: flex; gap: var(--oc-o-4); align-items: center; flex-wrap: wrap; }
.oc-rzad--scisly { gap: var(--oc-o-3); }

/* ==========================================================================
   Karta
   ========================================================================== */
.oc-karta {
  background: var(--oc-powierzchnia);
  border: 1px solid var(--oc-kreska);
  border-radius: var(--oc-r-3);
  overflow: hidden;
}
.oc-karta__naglowek {
  display: flex; align-items: center; gap: var(--oc-o-4);
  padding: var(--oc-o-5) var(--oc-o-6);
  border-bottom: 1px solid var(--oc-kreska);
}
.oc-karta__tytul {
  font-size: var(--oc-t-maly); font-weight: 600; text-transform: uppercase;
  letter-spacing: .06em; color: var(--oc-tekst-slaby); margin: 0;
}
.oc-karta__tresc  { padding: var(--oc-o-6); }
.oc-karta__stopka {
  padding: var(--oc-o-4) var(--oc-o-6);
  border-top: 1px solid var(--oc-kreska);
  background: var(--oc-powierzchnia-2);
}
.oc-karta--plaska { border-radius: 0; border-left: 0; border-right: 0; }

/* ==========================================================================
   Przyciski — trzy odmiany: główny, cichy, groźny
   ========================================================================== */
.oc-przycisk {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--oc-o-3);
  min-height: var(--oc-h-kontrolka);
  padding: 0 var(--oc-o-5);
  font: 600 var(--oc-t-baza)/1 var(--oc-font);
  color: var(--oc-tekst);
  background: var(--oc-powierzchnia);
  border: 1px solid var(--oc-kreska-mocna);
  border-radius: var(--oc-r-2);
  cursor: pointer;
  white-space: nowrap;
  transition: background .1s ease, border-color .1s ease, color .1s ease;
}
.oc-przycisk:hover:not(:disabled)  { background: var(--oc-powierzchnia-2); }
.oc-przycisk:active:not(:disabled) { background: var(--oc-powierzchnia-3); }
.oc-przycisk:disabled { opacity: .45; cursor: not-allowed; }

.oc-przycisk--glowny {
  background: var(--oc-akcent); border-color: var(--oc-akcent);
  color: var(--oc-tekst-na-akcencie);
}
.oc-przycisk--glowny:hover:not(:disabled)  { background: var(--oc-akcent-jasny); border-color: var(--oc-akcent-jasny); }
.oc-przycisk--glowny:active:not(:disabled) { filter: brightness(.94); }

/* Cichy: bez ramki i bez tła, dopóki nie dotkniesz. Do akcji, które nie mają
   ciągnąć wzroku — „pokaż", „więcej", ikony w pasku narzędzi. */
.oc-przycisk--cichy {
  background: transparent; border-color: transparent; color: var(--oc-tekst-slaby);
  font-weight: 500;
}
.oc-przycisk--cichy:hover:not(:disabled) { background: var(--oc-powierzchnia-2); color: var(--oc-tekst); }

.oc-przycisk--grozny { color: var(--oc-alarm); border-color: var(--oc-kreska-mocna); }
.oc-przycisk--grozny:hover:not(:disabled) { background: var(--oc-alarm-tlo); border-color: var(--oc-alarm); }
.oc-przycisk--grozny.oc-przycisk--glowny {
  background: var(--oc-alarm); border-color: var(--oc-alarm); color: #fff;
}

.oc-przycisk--maly { min-height: 22px; padding: 0 var(--oc-o-4); font-size: var(--oc-t-maly); }
.oc-przycisk--ikona { padding: 0; width: var(--oc-h-kontrolka); }
.oc-przycisk--szeroki { width: 100%; }

.oc-grupa-przyciskow { display: inline-flex; }
.oc-grupa-przyciskow .oc-przycisk { border-radius: 0; margin-left: -1px; }
.oc-grupa-przyciskow .oc-przycisk:first-child { border-radius: var(--oc-r-2) 0 0 var(--oc-r-2); margin-left: 0; }
.oc-grupa-przyciskow .oc-przycisk:last-child  { border-radius: 0 var(--oc-r-2) var(--oc-r-2) 0; }
.oc-grupa-przyciskow .oc-przycisk[aria-pressed="true"] {
  background: var(--oc-akcent-tlo); border-color: var(--oc-akcent-kreska); color: var(--oc-akcent);
  z-index: 1;
}

/* ==========================================================================
   Pola formularza
   ========================================================================== */
.oc-pole, .oc-wybor, .oc-obszar {
  display: block; width: 100%;
  min-height: var(--oc-h-kontrolka);
  padding: 0 var(--oc-o-4);
  font: var(--oc-t-baza)/1 var(--oc-font);
  font-variant-numeric: tabular-nums;
  color: var(--oc-tekst);
  background: var(--oc-powierzchnia);
  border: 1px solid var(--oc-kreska-mocna);
  border-radius: var(--oc-r-2);
}
.oc-obszar { padding: var(--oc-o-3) var(--oc-o-4); line-height: 1.45; min-height: 64px; resize: vertical; }
.oc-pole::placeholder, .oc-obszar::placeholder { color: var(--oc-tekst-blady); }
.oc-pole:disabled, .oc-wybor:disabled, .oc-obszar:disabled {
  background: var(--oc-powierzchnia-2); color: var(--oc-tekst-blady); cursor: not-allowed;
}
.oc-pole[aria-invalid="true"], .oc-wybor[aria-invalid="true"] { border-color: var(--oc-alarm); }

.oc-wybor {
  appearance: none; padding-right: var(--oc-o-7); cursor: pointer;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
                    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 12px center, right 7px center;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}

.oc-etykieta {
  display: block; margin-bottom: var(--oc-o-2);
  font-size: var(--oc-t-maly); font-weight: 600; color: var(--oc-tekst-slaby);
}
.oc-podpowiedz { margin-top: var(--oc-o-2); font-size: var(--oc-t-maly); color: var(--oc-tekst-blady); }
.oc-blad-pola  { margin-top: var(--oc-o-2); font-size: var(--oc-t-maly); color: var(--oc-alarm); }
.oc-formularz  { display: grid; gap: var(--oc-o-5); }
.oc-formularz--dwie { grid-template-columns: 1fr 1fr; }
@media (max-width: 620px) { .oc-formularz--dwie { grid-template-columns: 1fr; } }

.oc-ptaszek { display: inline-flex; align-items: center; gap: var(--oc-o-3); cursor: pointer; font-size: var(--oc-t-baza); }
.oc-ptaszek input { accent-color: var(--oc-akcent); width: 15px; height: 15px; margin: 0; cursor: pointer; }

/* ==========================================================================
   Znacznik / etykieta
   ========================================================================== */
.oc-znacznik {
  display: inline-flex; align-items: center; gap: var(--oc-o-2);
  padding: 1px var(--oc-o-4);
  font-size: var(--oc-t-mikro); font-weight: 600; line-height: 18px;
  letter-spacing: .01em; white-space: nowrap;
  color: var(--oc-tekst-slaby);
  background: var(--oc-powierzchnia-2);
  border: 1px solid var(--oc-kreska);
  border-radius: var(--oc-r-pigulka);
}
.oc-znacznik--sukces      { color: var(--oc-sukces);      background: var(--oc-sukces-tlo);      border-color: transparent; }
.oc-znacznik--ostrzezenie { color: var(--oc-ostrzezenie); background: var(--oc-ostrzezenie-tlo); border-color: transparent; }
.oc-znacznik--alarm       { color: var(--oc-alarm);       background: var(--oc-alarm-tlo);       border-color: transparent; }
.oc-znacznik--info        { color: var(--oc-info);        background: var(--oc-info-tlo);        border-color: transparent; }
.oc-znacznik--akcent      { color: var(--oc-akcent);      background: var(--oc-akcent-tlo);      border-color: var(--oc-akcent-kreska); }

.oc-kropka { width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex: 0 0 auto; }

/* --- Etapy lejka: barwa LICZONA z rampy, nie wypisana ---------------------
   .oc-etap--1 … --9 idą po lejku. Dodanie etapu w ziarnie nie wymaga tu nic
   poza jedną linijką z numerem; odcień wynika ze zmiennych na :root.
   Kody domknięte (wygrany / przegrany) wyłamują się z rampy świadomie —
   „wygrany" ma znaczyć to samo co sukces w całej aplikacji.              */
.oc-etap {
  --n: 0;
  display: inline-flex; align-items: center;
  padding: 1px var(--oc-o-4);
  font-size: var(--oc-t-mikro); font-weight: 600; line-height: 18px; white-space: nowrap;
  border-radius: var(--oc-r-pigulka);
  color:      hsl(calc(var(--oc-etap-h0) + var(--n) * var(--oc-etap-krok)) var(--oc-etap-s) var(--oc-etap-l-txt));
  background: hsl(calc(var(--oc-etap-h0) + var(--n) * var(--oc-etap-krok)) var(--oc-etap-s) var(--oc-etap-l-tlo));
  border: 1px solid hsl(calc(var(--oc-etap-h0) + var(--n) * var(--oc-etap-krok)) var(--oc-etap-s) var(--oc-etap-l-kreska));
}
.oc-etap--1 { --n: 0; }  .oc-etap--2 { --n: 1; }  .oc-etap--3 { --n: 2; }
.oc-etap--4 { --n: 3; }  .oc-etap--5 { --n: 4; }  .oc-etap--6 { --n: 5; }
.oc-etap--7 { --n: 6; }  .oc-etap--8 { --n: 7; }  .oc-etap--9 { --n: 8; }
.oc-etap--wygrany  { color: var(--oc-sukces); background: var(--oc-sukces-tlo); border-color: transparent; }
.oc-etap--przegrany{ color: var(--oc-tekst-slaby); background: var(--oc-powierzchnia-2); border-color: var(--oc-kreska);
                     text-decoration: line-through; text-decoration-thickness: 1px; }

/* Pasek etapów lejka — ta sama rampa, użyta jako ciąg. */
.oc-lejek { display: flex; gap: 2px; }
.oc-lejek__krok {
  --n: 0; flex: 1; height: 4px; border-radius: 2px;
  background: hsl(calc(var(--oc-etap-h0) + var(--n) * var(--oc-etap-krok)) var(--oc-etap-s) var(--oc-etap-l-tlo));
}
.oc-lejek__krok--osiagniety {
  background: hsl(calc(var(--oc-etap-h0) + var(--n) * var(--oc-etap-krok)) var(--oc-etap-s) var(--oc-etap-l-krok));
}

/* ==========================================================================
   Zakładki
   ========================================================================== */
.oc-zakladki {
  display: flex; gap: var(--oc-o-2);
  border-bottom: 1px solid var(--oc-kreska);
  padding: 0 var(--oc-o-4);
}
.oc-zakladki__zakladka {
  appearance: none; background: none; border: 0; cursor: pointer;
  padding: var(--oc-o-4) var(--oc-o-5);
  margin-bottom: -1px;
  font: 600 var(--oc-t-baza)/1 var(--oc-font);
  color: var(--oc-tekst-slaby);
  border-bottom: 2px solid transparent;
}
.oc-zakladki__zakladka:hover { color: var(--oc-tekst); }
.oc-zakladki__zakladka[aria-selected="true"] { color: var(--oc-akcent); border-bottom-color: var(--oc-akcent); }
.oc-zakladki__licznik {
  margin-left: var(--oc-o-3); padding: 0 5px; border-radius: var(--oc-r-pigulka);
  background: var(--oc-powierzchnia-3); color: var(--oc-tekst-slaby);
  font-size: var(--oc-t-mikro); font-weight: 600;
}

/* ==========================================================================
   Okno modalne
   ========================================================================== */
.oc-zaslona-tla {
  position: fixed; inset: 0; z-index: 100;
  background: var(--oc-zaslona);
  display: flex; align-items: center; justify-content: center;
  padding: var(--oc-o-6);
}
.oc-modal {
  background: var(--oc-powierzchnia);
  border: 1px solid var(--oc-kreska);
  border-radius: var(--oc-r-3);
  box-shadow: var(--oc-cien-3);
  width: min(560px, 100%);
  max-height: min(80vh, 720px);
  display: flex; flex-direction: column;
  animation: oc-wejscie-modal .12s ease-out;
}
.oc-modal--szeroki { width: min(900px, 100%); }
.oc-modal__naglowek {
  display: flex; align-items: center; gap: var(--oc-o-4);
  padding: var(--oc-o-5) var(--oc-o-6); border-bottom: 1px solid var(--oc-kreska);
}
.oc-modal__tytul  { font-size: var(--oc-t-tresc); font-weight: 600; margin: 0; flex: 1; }
.oc-modal__tresc  { padding: var(--oc-o-6); overflow: auto; flex: 1; }
.oc-modal__stopka {
  display: flex; gap: var(--oc-o-4); justify-content: flex-end;
  padding: var(--oc-o-5) var(--oc-o-6); border-top: 1px solid var(--oc-kreska);
  background: var(--oc-powierzchnia-2);
}
@keyframes oc-wejscie-modal { from { opacity: 0; transform: translateY(-6px) scale(.99); } }

/* ==========================================================================
   Szuflada boczna
   ========================================================================== */
.oc-szuflada {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 101;
  width: min(480px, 100vw);
  background: var(--oc-powierzchnia);
  border-left: 1px solid var(--oc-kreska);
  box-shadow: var(--oc-cien-3);
  display: flex; flex-direction: column;
  animation: oc-wysuw .16s ease-out;
}
.oc-szuflada--szeroka { width: min(720px, 100vw); }
.oc-szuflada--lewa { right: auto; left: 0; border-left: 0; border-right: 1px solid var(--oc-kreska);
                     animation-name: oc-wysuw-lewy; }
.oc-szuflada__naglowek {
  display: flex; align-items: center; gap: var(--oc-o-4);
  padding: var(--oc-o-5) var(--oc-o-6); border-bottom: 1px solid var(--oc-kreska);
}
.oc-szuflada__tytul  { font-size: var(--oc-t-tresc); font-weight: 600; flex: 1; margin: 0; }
.oc-szuflada__tresc  { padding: var(--oc-o-6); overflow: auto; flex: 1; }
.oc-szuflada__stopka {
  display: flex; gap: var(--oc-o-4); justify-content: flex-end;
  padding: var(--oc-o-5) var(--oc-o-6); border-top: 1px solid var(--oc-kreska);
  background: var(--oc-powierzchnia-2);
}
@keyframes oc-wysuw      { from { transform: translateX(100%); } }
@keyframes oc-wysuw-lewy { from { transform: translateX(-100%); } }

/* ==========================================================================
   Powiadomienia
   ========================================================================== */
.oc-powiadomienia {
  position: fixed; right: var(--oc-o-6); bottom: var(--oc-o-6); z-index: 200;
  display: flex; flex-direction: column; gap: var(--oc-o-4);
  width: min(380px, calc(100vw - 2 * var(--oc-o-6)));
  pointer-events: none;
}
.oc-powiadomienie {
  pointer-events: auto;
  display: flex; align-items: flex-start; gap: var(--oc-o-4);
  padding: var(--oc-o-5);
  background: var(--oc-powierzchnia);
  border: 1px solid var(--oc-kreska);
  border-left: 3px solid var(--oc-tekst-slaby);
  border-radius: var(--oc-r-2);
  box-shadow: var(--oc-cien-2);
  font-size: var(--oc-t-baza);
  animation: oc-wejscie-powiadomienia .14s ease-out;
}
.oc-powiadomienie--sukces { border-left-color: var(--oc-sukces); }
.oc-powiadomienie--blad   { border-left-color: var(--oc-alarm); }
.oc-powiadomienie--uwaga  { border-left-color: var(--oc-ostrzezenie); }
.oc-powiadomienie--info   { border-left-color: var(--oc-info); }
.oc-powiadomienie__tresc  { flex: 1; }
.oc-powiadomienie__zamknij {
  appearance: none; background: none; border: 0; cursor: pointer;
  color: var(--oc-tekst-blady); font-size: 15px; line-height: 1; padding: 2px 4px;
}
.oc-powiadomienie__zamknij:hover { color: var(--oc-tekst); }
.oc-powiadomienie--znika { opacity: 0; transform: translateX(8px); transition: opacity .16s, transform .16s; }
@keyframes oc-wejscie-powiadomienia { from { opacity: 0; transform: translateY(8px); } }

/* ==========================================================================
   Stan pusty i stan ładowania
   ========================================================================== */
.oc-pusto {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--oc-o-3);
  padding: var(--oc-o-8) var(--oc-o-6);
  text-align: center;
  color: var(--oc-tekst-slaby);
}
.oc-pusto__tytul { font-size: var(--oc-t-tresc); font-weight: 600; color: var(--oc-tekst); }
.oc-pusto__opis  { font-size: var(--oc-t-baza); max-width: 42ch; }

.oc-obrotek {
  display: inline-block; width: 15px; height: 15px; flex: 0 0 auto;
  border: 2px solid var(--oc-kreska-mocna);
  border-top-color: var(--oc-akcent);
  border-radius: 50%;
  animation: oc-obrot .7s linear infinite;
}
.oc-obrotek--duzy { width: 26px; height: 26px; border-width: 3px; }
@keyframes oc-obrot { to { transform: rotate(360deg); } }

.oc-ladowanie {
  display: flex; align-items: center; justify-content: center; gap: var(--oc-o-4);
  padding: var(--oc-o-7); color: var(--oc-tekst-slaby); font-size: var(--oc-t-baza);
}

/* Szkielet — dla list, które mają swój rozmiar zanim przyjdą dane. */
.oc-szkielet {
  background: linear-gradient(90deg, var(--oc-powierzchnia-2) 25%,
              var(--oc-powierzchnia-3) 37%, var(--oc-powierzchnia-2) 63%);
  background-size: 400% 100%;
  border-radius: var(--oc-r-1);
  animation: oc-migot 1.3s ease-in-out infinite;
  height: 1em;
}
@keyframes oc-migot { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }

/* ==========================================================================
   SIATKA — tabela robocza
   Rytm: wiersz 32 px. Nagłówek i wiersz filtrów przyklejone u góry,
   pierwsza kolumna (i kolumna zaznaczania) przyklejone z lewej.
   ========================================================================== */
.oc-siatka {
  display: flex; flex-direction: column;
  background: var(--oc-powierzchnia);
  border: 1px solid var(--oc-kreska);
  border-radius: var(--oc-r-3);
  overflow: hidden;
  min-height: 0;
  font-size: var(--oc-t-baza);
}
.oc-siatka--bez-ramki { border: 0; border-radius: 0; }

/* --- pasek narzędzi --- */
.oc-siatka__pasek {
  display: flex; align-items: center; gap: var(--oc-o-4);
  padding: var(--oc-o-3) var(--oc-o-4);
  border-bottom: 1px solid var(--oc-kreska);
  background: var(--oc-powierzchnia);
  min-height: 38px;
}
.oc-siatka__licznik { color: var(--oc-tekst-slaby); font-size: var(--oc-t-maly); }
.oc-siatka__pasek-akcji {
  display: flex; align-items: center; gap: var(--oc-o-4);
  padding: var(--oc-o-3) var(--oc-o-4);
  background: var(--oc-akcent-tlo);
  border-bottom: 1px solid var(--oc-akcent-kreska);
  color: var(--oc-akcent);
  font-size: var(--oc-t-baza); font-weight: 600;
}

/* --- okno przewijania --- */
.oc-siatka__okno { position: relative; overflow: auto; flex: 1 1 auto; min-height: 80px; }
.oc-siatka__tabela {
  border-collapse: separate; border-spacing: 0;
  table-layout: fixed;
  font-variant-numeric: tabular-nums;
}

/* --- nagłówki --- */
.oc-siatka__naglowek {
  position: sticky; top: 0; z-index: 3;
  height: var(--oc-h-naglowek);
  padding: 0 var(--oc-o-4);
  text-align: left; vertical-align: middle;
  font-size: var(--oc-t-maly); font-weight: 600; color: var(--oc-tekst-slaby);
  background: var(--oc-powierzchnia-2);
  border-bottom: 1px solid var(--oc-kreska);
  border-right: 1px solid var(--oc-kreska);
  white-space: nowrap; overflow: hidden;
  user-select: none;
}
.oc-siatka__naglowek--sortowalny { cursor: pointer; }
.oc-siatka__naglowek--sortowalny:hover { background: var(--oc-powierzchnia-3); color: var(--oc-tekst); }
.oc-siatka__naglowek-tresc { display: flex; align-items: center; gap: var(--oc-o-3); overflow: hidden; }
.oc-siatka__naglowek-napis { overflow: hidden; text-overflow: ellipsis; }
.oc-siatka__strzalka { font-size: 9px; color: var(--oc-akcent); flex: 0 0 auto; }
.oc-siatka__naglowek--do-prawej .oc-siatka__naglowek-tresc { justify-content: flex-end; }
.oc-siatka__naglowek--przeciagany { opacity: .4; }
.oc-siatka__naglowek--cel { box-shadow: inset 2px 0 0 var(--oc-akcent); }

.oc-siatka__uchwyt {
  position: absolute; top: 0; right: 0; width: 7px; height: 100%;
  cursor: col-resize; z-index: 4;
}
.oc-siatka__uchwyt:hover, .oc-siatka__uchwyt--czynny { background: var(--oc-akcent); opacity: .55; }

/* --- wiersz filtrów --- */
.oc-siatka__filtr {
  position: sticky; top: var(--oc-h-naglowek); z-index: 3;
  height: var(--oc-h-filtry);
  padding: 0 var(--oc-o-2);
  background: var(--oc-powierzchnia);
  border-bottom: 1px solid var(--oc-kreska);
  border-right: 1px solid var(--oc-kreska);
  vertical-align: middle;
}
.oc-siatka__filtr .oc-pole, .oc-siatka__filtr .oc-wybor {
  min-height: 22px; height: 22px; padding: 0 var(--oc-o-3);
  font-size: var(--oc-t-maly); border-color: var(--oc-kreska);
  background: var(--oc-powierzchnia-2);
}
.oc-siatka__filtr .oc-pole:focus, .oc-siatka__filtr .oc-wybor:focus { background: var(--oc-powierzchnia); }
.oc-siatka__filtr-zakres { display: flex; gap: 2px; align-items: center; }
.oc-siatka__filtr-zakres .oc-pole { min-width: 0; }
.oc-siatka__filtr--czynny .oc-pole,
.oc-siatka__filtr--czynny .oc-wybor,
.oc-siatka__filtr--czynny .oc-siatka__filtr-przycisk {
  border-color: var(--oc-akcent); background: var(--oc-akcent-tlo);
}
.oc-siatka__filtr-przycisk {
  width: 100%; height: 22px; padding: 0 var(--oc-o-3);
  font: var(--oc-t-maly)/20px var(--oc-font); text-align: left;
  color: var(--oc-tekst); background: var(--oc-powierzchnia-2);
  border: 1px solid var(--oc-kreska); border-radius: var(--oc-r-2);
  cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* --- wiersze i komórki --- */
.oc-siatka__wiersz { height: var(--oc-h-wiersz); }
.oc-siatka__wiersz:hover .oc-siatka__kom { background: var(--oc-powierzchnia-2); }
.oc-siatka__wiersz--zaznaczony .oc-siatka__kom { background: var(--oc-akcent-tlo); }
.oc-siatka__wiersz--zaznaczony:hover .oc-siatka__kom { background: var(--oc-akcent-tlo); filter: brightness(.98); }

.oc-siatka__kom {
  height: var(--oc-h-wiersz);
  padding: 0 var(--oc-o-4);
  border-bottom: 1px solid var(--oc-kreska);
  border-right: 1px solid var(--oc-kreska);
  background: var(--oc-powierzchnia);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  vertical-align: middle;
}
.oc-siatka__kom--do-prawej { text-align: right; }
.oc-siatka__kom--srodek    { text-align: center; }
.oc-siatka__kom--blady     { color: var(--oc-tekst-blady); }
.oc-siatka__kom--edytowalna { cursor: text; }
.oc-siatka__kom--czynna {
  outline: 2px solid var(--oc-akcent); outline-offset: -2px; position: relative; z-index: 1;
}
.oc-siatka__kom--zapisuje { opacity: .55; }
.oc-siatka__kom--edycja { padding: 0 2px; background: var(--oc-powierzchnia-2) !important; }
.oc-siatka__kom--edycja .oc-pole, .oc-siatka__kom--edycja .oc-wybor {
  height: calc(var(--oc-h-wiersz) - 4px); min-height: 0; font-size: var(--oc-t-baza);
}
/* Kolumna zaznaczania i kolumny przypięte — pozycję `left` liczy siatka.js,
   bo zależy od aktualnych szerokości, a te użytkownik przeciąga. */
.oc-siatka__kom--przypieta, .oc-siatka__naglowek--przypiety, .oc-siatka__filtr--przypiety {
  position: sticky; z-index: 2;
}
.oc-siatka__naglowek--przypiety, .oc-siatka__filtr--przypiety { z-index: 5; }
.oc-siatka__kom--przypieta::after,
.oc-siatka__naglowek--przypiety::after,
.oc-siatka__filtr--przypiety::after {
  content: ""; position: absolute; top: 0; right: -1px; bottom: 0; width: 1px;
  background: var(--oc-kreska-mocna);
}
.oc-siatka__kom--zaznacz, .oc-siatka__naglowek--zaznacz, .oc-siatka__filtr--zaznacz {
  padding: 0; text-align: center; width: 34px;
}
.oc-siatka__kom--zaznacz input { accent-color: var(--oc-akcent); width: 14px; height: 14px; cursor: pointer; margin: 0; }
.oc-siatka__naglowek--zaznacz input { accent-color: var(--oc-akcent); width: 14px; height: 14px; cursor: pointer; margin: 0; }

/* --- nakładki i stopka --- */
.oc-siatka__zaslona {
  position: absolute; inset: 0; z-index: 6;
  background: color-mix(in srgb, var(--oc-powierzchnia) 68%, transparent);
  display: flex; align-items: center; justify-content: center; gap: var(--oc-o-4);
  color: var(--oc-tekst-slaby); font-size: var(--oc-t-baza);
}
.oc-siatka__stopka {
  display: flex; align-items: center; gap: var(--oc-o-4);
  padding: var(--oc-o-3) var(--oc-o-4);
  border-top: 1px solid var(--oc-kreska);
  background: var(--oc-powierzchnia-2);
  font-size: var(--oc-t-maly); color: var(--oc-tekst-slaby);
}

/* --- panel kolumn --- */
.oc-siatka__panel {
  position: absolute; z-index: 60;
  min-width: 240px; max-height: 330px; overflow: auto;
  padding: var(--oc-o-3);
  background: var(--oc-powierzchnia);
  border: 1px solid var(--oc-kreska-mocna);
  border-radius: var(--oc-r-2);
  box-shadow: var(--oc-cien-2);
}
.oc-siatka__panel-wiersz {
  display: flex; align-items: center; gap: var(--oc-o-3);
  padding: var(--oc-o-2) var(--oc-o-3); border-radius: var(--oc-r-1);
  font-size: var(--oc-t-baza);
}
.oc-siatka__panel-wiersz:hover { background: var(--oc-powierzchnia-2); }
.oc-siatka__panel-wiersz label { flex: 1; display: flex; align-items: center; gap: var(--oc-o-3); cursor: pointer; }
.oc-siatka__panel-wiersz input { accent-color: var(--oc-akcent); margin: 0; }
.oc-siatka__panel-naglowek {
  display: flex; align-items: center; justify-content: space-between;
  padding: var(--oc-o-2) var(--oc-o-3) var(--oc-o-3);
  border-bottom: 1px solid var(--oc-kreska); margin-bottom: var(--oc-o-2);
}

/* ==========================================================================
   Drobiazgi pomocnicze
   ========================================================================== */
.oc-slaby   { color: var(--oc-tekst-slaby); }
.oc-blady   { color: var(--oc-tekst-blady); }
.oc-maly    { font-size: var(--oc-t-maly); }
.oc-mikro   { font-size: var(--oc-t-mikro); }
.oc-liczba  { font-variant-numeric: tabular-nums; text-align: right; }
.oc-ucieta  { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.oc-ukryty  { display: none !important; }
.oc-tylko-dla-czytnika {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
