/* Pole formularza — arkusz partu `template-parts/pole-formularza.php` (0.11).
 *
 * Wartości pochodzą z dwóch klatek `canvas:Kontakt Makieta Finalna`:
 * **1F** (ton ciemny, sekcja na Smoked Tencie) i **2E** (ton jasny, sekcja
 * na Pergaminie). Pole hasła — z `canvas:Logowanie Wrota Finalny`.
 *
 * Ton jest zestawem lokalnych zmiennych, nie drugim kompletem reguł: między
 * 1F a 2E różnią się WYŁĄCZNIE kolory i jeden stopień etykiety, a geometria
 * (52 px wysokości, róg 2 px, padding 14 px) jest wspólna. Gdyby ton robił
 * własne reguły, każda przyszła poprawka geometrii musiałaby trafić w dwa
 * miejsca — i po którejś trafiłaby w jedno.
 *
 * Krycia idą przez `color-mix()` na tokenie, nie przez `rgba()` z rozpisanymi
 * składowymi: `rgba(245,233,211,0.06)` z canvasu to surowy Parchment
 * w przebraniu, a surowych kolorów w tym motywie nie ma (CLAUDE.md, reguła 3).
 *
 * ─── PRZEMIAR TYPOGRAFICZNY — 20.08.2026 (`/domknij-otwarte W6b`) ────
 *
 * Arkusz **nie należał do żadnego z siedmiu pakietów naprawy typografii** —
 * rozpiska `docs/TYPOGRAFIA.md` §5 dzieli pracę arkuszami, a ten stoi na kilku
 * powierzchniach naraz, więc nie miał właściciela. Przemierzony osobno, po
 * zamknięciu pakietów 1–6. Ekwiwalent liczy się wzorem
 * `font-size × wysokość x / 0,50`: Source Serif 4 ma x 49,5, Literata 51.
 *
 *   reguła                 było   ekw.    rola             szczebel   jest
 *   __etykieta             12 SS   12,2   mikroetykieta     mikro 12   12  ✓
 *   __licznik              12 SS   12,2   plakietka         mikro 12   12  ✓
 *   __kontrolka            15 SSF  14,85  wpisana wartość   —          15  ✓
 *   __tresc                14 SSF  13,86  etykieta zgody    pomoc. 14  14  ✓
 *   __pomoc                13 SSF  12,87  nota              pomoc. 14  14  ←
 *   __blad                 13 SSF  12,87  komunikat błędu   pomoc. 14  14  ←
 *   __caps                 13 SSF  12,87  ostrzeżenie       pomoc. 14  14  ←
 *
 * (SS = Literata przez `--font-ui`, SSF = Source Serif 4 przez `--font-body`.)
 *
 * ⚠︎ **`__kontrolka` NIE ROSNIE do 16 px i to jest wynik pomiaru, nie
 * przeoczenie.** Ekwiwalent 14,85 leży między szczeblami — powyżej
 * `pomocniczy`, poniżej `czytelny` — więc żadnej podłogi nie łamie, a podniesienie
 * ma zmierzoną cenę po drugiej stronie: przy 390 px adres 46-znakowy nie mieści
 * się w polu bramy konta **już dziś** (`scrollWidth` 406 px wobec `clientWidth`
 * 340 px). Rosnący krój pogłębia dokładnie ten jeden zmierzony problem.
 *
 * ⚠︎ **`__tresc` też zostaje, choć niesie DWIE role naraz** — i to jest jedyna
 * rzecz w arkuszu, której pomiar nie rozstrzyga. Ta sama klasa wypisuje krótką
 * etykietę kontrolki („Zapamiętaj mnie na tym urządzeniu", „Tylko dostępne"
 * w panelu filtrów) **i zdanie zgody prawnej** (regulamin w bramie konta,
 * zgoda RODO w kasie). Pierwsza rola to `pomocniczy` 14, druga według definicji
 * skali to `czytelny` 16 („każda informacja, którą trzeba zrozumieć"). Rozdzielić
 * je da się wyłącznie modyfikatorem w parcie, czyli zmianą API — pozycja stoi
 * w `docs/PO-PORCIE.md` §D. **Nie podnoś tego bez modyfikatora**: 16 px zrobiłoby
 * z „Tylko dostępne" największy napis panelu filtrów.
 *
 * ⚠︎ **Ton jasny `.szewko-pole--jasny` (klatka 2E) nie renderuje się dziś
 * NIGDZIE** — żaden wywołujący nie podaje `'ton' => 'jasny'` (zmierzone na
 * pięciu powierzchniach: wszystkie etykiety mają 12 px, nigdy 13). Zostaje jako
 * zapisana klatka canvasu i działające API partu, ale **jego liczb nie traktuj
 * jak stanu witryny**.
 */

.szewko-pole {
  /* ─── TON CIEMNY (klatka 1F) — domyślny ────────────────── */
  --pole-tlo: color-mix(in srgb, var(--color-parchment) 6%, transparent);
  --pole-obrys: color-mix(in srgb, var(--color-sand-gold) 30%, transparent);
  --pole-tekst: var(--color-parchment);
  --pole-podpowiedz: color-mix(in srgb, var(--color-bleached-linen) 58%, transparent);
  --pole-etykieta: color-mix(in srgb, var(--color-parchment) 85%, transparent);
  --pole-pomoc: color-mix(in srgb, var(--color-parchment) 62%, transparent);
  --pole-dopisek: color-mix(in srgb, var(--color-parchment) 55%, transparent);

  /* Odstępstwo 3 od canvasu: komunikat błędu NIE idzie w `--color-terracotta`
     (1,8:1 na Smoked Tencie), tylko w rozjaśniony wariant tokenu (5,2:1).
     Obrys pola zostaje w Terracocie, bo tak rysuje go klatka 1F — i dlatego
     znaczenia nie niesie sam kolor obrysu, tylko ikona i tekst obok niego. */
  --pole-blad: var(--color-terracotta-light);
  --pole-obrys-blad: var(--color-terracotta);
  --pole-uwaga: var(--color-sand-gold);

  /* Ikony sterujące w polu — strzałka listy i oko przy haśle. Jedna zmienna,
     bo obie są elementami nietekstowymi na tym samym tle i muszą trzymać ten
     sam próg. Na Pergaminie Sand Gold daje 1,77:1, więc ton jasny podmienia
     je na Camel Brown; bez tego oko przy haśle znikałoby na płótnie. */
  --pole-ikona: var(--color-sand-gold);
  --pole-ikona-hover: var(--color-brass-lantern);

  /* Podkład licznika ma kolor TŁA SEKCJI, nie pola — inaczej przy przewiniętym
     polu wiersz tekstu prześwituje spod liczby. */
  --pole-licznik-tlo: color-mix(in srgb, var(--color-smoked-tent) 70%, transparent);

  /* Tło ROZWINIĘTEJ listy pola wyboru. Osobna zmienna, nie `--pole-tlo`:
     tamto jest półprzezroczyste (6 % Parchmentu), bo leży na płycie sekcji,
     a panel listy rysuje system nad wszystkim i musi być KRYJĄCY. */
  --pole-lista-tlo: var(--color-dark-mahogany);

  /* Podkład pozycji ZAZNACZONEJ w rozwiniętej liście. Nie jest to `--pole-lista-tlo`,
     bo wtedy nie widać, co jest wybrane; i nie jest to podkład systemowy, bo ten
     jest jasnoszary i zabija jasny tekst (patrz reguła `option:checked`). */
  --pole-lista-zazn: color-mix(in srgb, var(--color-sand-gold) 18%, var(--color-dark-mahogany));

  /* Schemat kolorów kontrolki. Nie ma wpływu na zamknięte pole (tło, obrys
     i tekst są tu autorskie), ma za to wpływ na te części ROZWINIĘTEJ listy,
     których nie da się dosięgnąć arkuszem: podświetlenie pozycji wybranej,
     pasek przewijania panelu i jego obwódkę. Domyślnie przeglądarka rysuje je
     w schemacie jasnym, czyli jasnoszarym po jasnoszarym. */
  --pole-schemat: dark;

  /* Poświata skupienia: 1F daje rozmytą aureolę, 2E — twardy pierścień.
     Obie są tu jedną zmienną, bo różnią się wartością, nie mechanizmem. */
  --pole-poswiata: 0 0 14px color-mix(in srgb, var(--color-sand-gold) 22%, transparent);
  --pole-obrys-focus: -2px;

  display: block;

  & .szewko-pole__etykieta {
    /* Etykieta ZAWSZE widoczna nad polem. Sam placeholder odpada — znika przy
       pisaniu i zabiera kontekst temu, kto wrócił do formularza po minucie. */
    display: block;
    margin: 0 0 var(--space-sm);
    font-family: var(--font-ui);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--pole-etykieta);
  }

  /* Design znakuje pola OPCJONALNE, nie wymagane — gwiazdki nie ma nigdzie
     w projekcie. Dopisek wypada z wersalików, żeby czytał się jak nawias. */
  & .szewko-pole__dopisek {
    text-transform: none;
    letter-spacing: 0.04em;
    color: var(--pole-dopisek);
  }

  /* Węższe pole dla krótkich wartości — numer zamówienia stoi na 260 px.
     Wartość przychodzi z wywołania jako zmienna, nie jako `max-width` wprost:
     tylko wtedy media query poniżej ma czym ją zdjąć (styl w znaczniku wygrywa
     z arkuszem, więc `max-width` wpisane wprost dałoby się cofnąć wyłącznie
     przez `!important`). */
  & .szewko-pole__ramka {
    position: relative;
    max-width: var(--pole-maks-szerokosc, none);
  }

  & .szewko-pole__kontrolka {
    box-sizing: border-box;
    width: 100%;
    height: 52px;
    padding: 0 14px;
    border: 1px solid var(--pole-obrys);
    border-radius: var(--radius-sm);
    background: var(--pole-tlo);
    font-family: var(--font-body);
    font-size: 15px;
    color: var(--pole-tekst);
    outline: none;
    transition:
      box-shadow var(--duration-mid) var(--ease-sand),
      border-color var(--duration-mid) var(--ease-sand);

    &::placeholder {
      color: var(--pole-podpowiedz);
      opacity: 1; /* Firefox przygasza placeholder z urzędu. */
    }

    /* Obrys skupienia jest Sand Gold i wchodzi DO ŚRODKA pola (offset ujemny),
       żeby nie podnosił wysokości wiersza w gęstym formularzu kasy.

       ⚠︎ **To jedyne miejsce, które ŚWIADOMIE zostaje bez dwuwarstwowego
       pierścienia z K6** — i nie jest to przeoczenie. Powody są dwa:
       obwódka 5 px na zewnątrz robi dokładnie to, czemu ujemny offset ma
       zapobiegać, a pola tego motywu stoją na ciemnych płytkach, gdzie sam
       Sand Gold daje **8,31:1** (zmierzone na `/kontakt/` i w panelu filtrów).
       Własna poświata niżej i tak nadpisałaby obwódkę z `base.css`, więc
       decyzja jest tu zapisana, a nie domyślna.
       ⚠︎ Gdyby pole trafiło kiedyś na jasną płytkę, ta reguła przestaje
       wystarczać — wtedy trzeba dołożyć `var(--pierscien-ogniskowej)` przed
       poświatą, tak jak w `cart-empty.css`. */
    &:focus-visible {
      border-color: var(--color-sand-gold);
      outline: 2px solid var(--color-sand-gold);
      outline-offset: var(--pole-obrys-focus);
      box-shadow: var(--pole-poswiata);
    }

    /* Krycie należy do POLA, nie do sekcji. Na canvasie przygaszała je sekcja
       formularza, więc pole wyjęte z niej wyglądało na aktywne mimo `disabled`.
       Kursor „wait", bo w tym projekcie blokada znaczy „trwa wysyłka". */
    &:disabled {
      opacity: 0.55;
      cursor: wait;
    }

    /* Stanu „tylko do odczytu" nie ma na żadnej klatce. Rozwiązany najmniejszym
       możliwym gestem: wartość zostaje pełną czcionką i pełnym kolorem (to nadal
       treść, nie ozdoba), znika sama płytka — pole przestaje wyglądać jak studnia,
       do której można coś wpisać. Do zawetowania jedną regułą. */
    &[readonly] {
      background: transparent;
      cursor: default;

      /* ⚠︎ `none` kasowało tu poświatę pola RAZEM z obwódką ogniskowej
         z `base.css` — a pole tylko do odczytu nadal łapie ogniskową i musi ją
         pokazać (WCAG 2.4.7). Znika sama poświata, pierścień zostaje. */
      &:focus-visible {
        box-shadow: var(--pierscien-ogniskowej);
      }
    }
  }

  & .szewko-pole__kontrolka--wybor {
    appearance: none;
    padding-right: 44px;
    cursor: pointer;

    /* ⚠︎ To jest DRUGA POŁOWA poprawki podświetlenia (pierwsza — `option:checked`
       niżej) i ta połowa nie jest obejściem, tylko mechanizmem przewidzianym
       do tego celu. Panel listy rysuje przeglądarka i część jego warstw nie
       przychodzi z tego arkusza w ogóle; `color-scheme` jest jedynym wejściem,
       jakie do nich mamy. Bez niego panel zostaje w schemacie jasnym nawet
       wtedy, gdy wszystkie `option` mają ciemne tło od autora — i stąd brał się
       jasnoszary pas pod wybraną pozycją. */
    color-scheme: var(--pole-schemat);

    &:disabled {
      cursor: wait;
    }

    /* ⚠︎ ROZWINIĘTA LISTA TO OSOBNY ŚWIAT i bez tej reguły jest NIECZYTELNA.
       Zgłoszone ze zrzutu 04.08.2026 z `/kontakt`.

       Zamknięte pole stylujemy my — jasny tekst na ciemnej płytce. Ale panel,
       który rozwija się po kliknięciu, rysuje system, a nie ten arkusz: bierze
       z niego wyłącznie kolory `option`. `color` dziedziczy się z `<select>`,
       czyli Parchment, natomiast tło zostaje systemowe, czyli BIAŁE — i wychodzi
       jasny piasek na białym, praktycznie niewidoczny. Widać było tylko pozycję
       pod kursorem, bo tę system podświetla własnym kolorem.

       Dlatego `option` dostaje OBA kolory jawnie. To nie jest ozdoba, tylko
       warunek przeczytania listy.

       Reguła jest w parcie 0.11, nie w arkuszu `/kontakt`: pola wyboru wracają
       w filtrach `/sklep`, w kasie i w bramie konta, więc usterka dotyczyła
       każdego z tych miejsc, a nie jednej podstrony.

       Zakres wsparcia: Chrome, Edge i Firefox honorują te kolory na Windowsie
       i Linuksie. Safari na macOS je ignoruje i rysuje listę po swojemu —
       czarny tekst na białym, czyli czytelnie. Ustawienie ich jest więc
       w każdym przypadku lepsze niż brak. */
    & option {
      background: var(--pole-lista-tlo);
      color: var(--pole-tekst);
    }

    /* ⚠︎ POZYCJA ZAZNACZONA MA WŁASNĄ REGUŁĘ, bo reguła wyżej jej NIE DOSIĘGA.
       Zgłoszone ze zrzutu 10.08.2026 z `/kontakt`: po otwarciu listy pierwszy
       wiersz stał jasnoszary z jasnym tekstem, czyli praktycznie nieczytelny,
       podczas gdy cztery pozostałe były ciemne.

       Nie jest to usterka „pierwszej pozycji", tylko **pozycji wybranej** —
       przy pierwszym otwarciu wybrana jest pozycja zerowa („Wybierz temat"),
       więc wygląda to na wadę wiersza. Po wyborze „Pytania" szara staje się
       „Pytanie".

       Chrome maluje podświetlenie zaznaczenia własnym podkładem i `background-color`
       autora ma z nim remis, którego nie wygrywa. Honoruje natomiast
       `background-image`: gradient o jednym kolorze kładzie płaską płytkę NA
       podkładzie systemu. Firefox idzie pierwszą deklaracją (`background-color`),
       więc obie są tu potrzebne — to nie jest duplikat.

       Podkład jest ODMIENNY od reszty listy, a nie taki sam: pozycja wybrana ma
       być widoczna jako wybrana. Safari na macOS ignoruje jedno i drugie i rysuje
       listę po swojemu (czarne na białym), czyli czytelnie — patrz akapit wyżej. */
    & option:checked {
      background: var(--pole-lista-zazn) linear-gradient(var(--pole-lista-zazn), var(--pole-lista-zazn));
      color: var(--pole-tekst);
    }

    /* Pozycja zerowa („Wybierz temat") jest podpowiedzią, nie wyborem — ten sam
       przygaszony ton, co tekst w zamkniętym polu. Wariant `:checked` jest tu
       jawnie, bo reguła wyżej ma tę samą specyficzność i stoi przed tą: bez
       niego zaznaczona podpowiedź dostawałaby wagę wartości.

       `:disabled` z tego samego powodu — part wypisuje pozycję zerową
       z atrybutem `disabled`, a przeglądarka przygasza takie pozycje własnym
       szarym, spoza palety. */
    & option[value=""],
    & option[value=""]:checked,
    & option[value=""]:disabled {
      color: var(--pole-podpowiedz);
    }
  }

  /* Dopóki nic nie wybrano, tekst ma wagę podpowiedzi, nie wartości — inaczej
     „Wybierz temat" czyta się jak dokonany wybór. */
  & .szewko-pole__kontrolka--pusty {
    color: var(--pole-podpowiedz);
  }

  /* Własna strzałka, bo `appearance: none` gasi natywną. `pointer-events: none`,
     żeby kliknięcie w ikonę nadal otwierało listę. */
  & .szewko-pole__strzalka {
    position: absolute;
    top: 50%;
    right: 14px;
    transform: translateY(-50%);
    pointer-events: none;
    color: var(--pole-ikona);
  }

  & .szewko-pole__kontrolka--obszar {
    /* `min-height` i `max-height` przychodzą stylem z partu, bo są argumentem
       wywołania. Za `max-height` pole przewija się w środku — strona nie skacze
       pod kursorem, gdy ktoś pisze długą wiadomość. */
    display: block;
    height: auto;
    padding: 14px 16px 28px;
    line-height: 1.6;
    resize: none;
    overflow-y: auto;
    field-sizing: content;
  }

  & .szewko-pole__licznik {
    position: absolute;
    right: 14px;
    bottom: 10px;
    padding: 2px 6px;
    border-radius: var(--radius-sm);
    background: var(--pole-licznik-tlo);
    font-family: var(--font-ui);
    font-size: 12px;
    color: var(--pole-pomoc);
    pointer-events: none;

    &[hidden] {
      display: none;
    }
  }

  /* 14 px, nie 13: podpowiedź pod polem jest **notą**, czyli szczebel
     `pomocniczy` (ekw. 14) — nie mikroetykietą. Przy 13 px Source Serif 4
     schodziła na ekw. 12,87, czyli o oczko za nisko. Przemiar 20.08.2026. */
  & .szewko-pole__pomoc {
    margin: 6px 0 0;
    font-family: var(--font-body);
    font-size: 14px;
    color: var(--pole-pomoc);
  }

  /* 14 px z tego samego przemiaru co `__pomoc`, ale z mocniejszym powodem:
     komunikat błędu jest miejscem, w którym ktoś właśnie utknął, więc nie ma
     prawa być mniejszy od podpowiedzi, którą ten sam człowiek zignorował.
     ⚠︎ Nie schodzą tu razem z nim ROZMIAR IKONY i `line-height` — trójkąt ma
     16 px z partu i jest drugim, niekolorowym sygnałem, a nie literą. */
  & .szewko-pole__blad {
    display: flex;
    gap: 6px;
    align-items: flex-start;
    margin: 6px 0 0;
    font-family: var(--font-body);
    font-size: 14px;
    line-height: 1.5;
    color: var(--pole-blad);

    & .szewko-pole__ikona {
      flex: 0 0 auto;
      margin-top: 2px;
    }
  }

  /* Ikona w polu. Ostrzeżenie samo w sobie nie niesie treści — jest drugim,
     niekolorowym sygnałem obok obrysu i komunikatu. */
  & .szewko-pole__ikona-slot {
    position: absolute;
    top: 50%;
    right: 14px;
    display: flex;
    transform: translateY(-50%);
    pointer-events: none;
    color: var(--pole-blad);
  }
}

/* ─── TON JASNY (klatka 2E) ──────────────────────────────────
 *
 * Płytka pola jest JAŚNIEJSZA od sekcji: canvas daje `rgba(252,246,232,0.9)`,
 * czyli odcień spoza palety — Pergamin rozjaśniony w stronę bieli. Zapis przez
 * `color-mix()` trzyma go przy tokenie zamiast wklejać heks; różnica wobec
 * wartości z canvasu to najwyżej dwa punkty na kanał. To jedyne miejsce
 * w motywie, w którym miesza się token z bielą — opis w NOTES.md.
 */
.szewko-pole--jasny {
  --pole-plyta: color-mix(in srgb, var(--color-parchment) 50%, white);
  --pole-tlo: color-mix(in srgb, var(--pole-plyta) 90%, transparent);
  --pole-obrys: color-mix(in srgb, var(--color-camel-brown) 40%, transparent);
  --pole-tekst: var(--color-smoked-tent);
  --pole-podpowiedz: color-mix(in srgb, var(--color-smoked-tent) 45%, transparent);
  --pole-etykieta: var(--color-dark-mahogany);
  --pole-pomoc: color-mix(in srgb, var(--color-smoked-tent) 65%, transparent);
  --pole-dopisek: color-mix(in srgb, var(--color-smoked-tent) 55%, transparent);

  /* Na Pergaminie Terracotta daje 6,89:1 i niesie komunikat bez rozjaśniania. */
  --pole-blad: var(--color-terracotta);
  --pole-obrys-blad: var(--color-terracotta);
  --pole-uwaga: var(--color-camel-brown);
  --pole-licznik-tlo: color-mix(in srgb, var(--color-parchment) 85%, transparent);
  --pole-ikona: var(--color-camel-brown);
  --pole-ikona-hover: var(--color-dark-mahogany);

  /* Lista na tonie jasnym idzie płytą pola — kryjącą, bo `--pole-tlo` jest tu
     przezroczyste, a panel listy leży nad sekcją, nie w niej. */
  --pole-lista-tlo: var(--pole-plyta);

  /* Zaznaczenie przyciemnia płytę zamiast ją rozjaśniać: Sand Gold na jasnym
     tle nie odróżnia się od niego (1,77:1, ten sam powód co przy `--pole-ikona`). */
  --pole-lista-zazn: color-mix(in srgb, var(--color-camel-brown) 22%, var(--pole-plyta));

  /* Ton jasny wraca do schematu jasnego — panel listy ma tu jasną płytę. */
  --pole-schemat: light;

  /* 2E rysuje skupienie inaczej niż 1F: twardy pierścień Dark Mahogany zamiast
     rozmytej aureoli — na jasnym tle poświata Sand Gold nie byłaby widoczna. */
  --pole-poswiata: 0 0 0 4px color-mix(in srgb, var(--color-dark-mahogany) 30%, transparent);
  --pole-obrys-focus: 0px;

  /* Jedyna różnica typograficzna między klatkami: na jasnym tle etykieta stoi
     o stopień wyżej i cięższa. Przepisane z 2E, nie uśrednione. */
  & .szewko-pole__etykieta {
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 0.1em;
  }
}

/* ─── STAN BŁĘDU ─────────────────────────────────────────────
 *
 * Specyficzność jest tu celowo niższa niż `.szewko-pole .szewko-pole__kontrolka:focus-visible`
 * (0,2,0 wobec 0,3,0): pole z błędem, w którym ktoś właśnie stoi kursorem,
 * ma pokazywać obrys skupienia. Komunikat i ikona zostają.
 */
.szewko-pole--blad .szewko-pole__kontrolka {
  border-color: var(--pole-obrys-blad);
  outline: 1px solid var(--pole-obrys-blad);
  outline-offset: -1px;
}

/* Miejsce na trójkąt w polu jednowierszowym. */
.szewko-pole--blad.szewko-pole--tekst .szewko-pole__kontrolka {
  padding-right: 42px;
}

/* ─── ZGODA ──────────────────────────────────────────────────
 *
 * Odstępstwo 1 od canvasu: prawdziwy `<input type="checkbox">` schowany
 * wizualnie zamiast `<span role="checkbox" tabIndex="0">`. Input leży NA
 * kwadracie, ma zerowe krycie i pełny rozmiar rysunku — nie `display: none`
 * i nie `visibility: hidden`, bo wtedy wypada z nawigacji klawiaturą.
 */
.szewko-pole--zgoda {
  & .szewko-pole__zgoda {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    max-width: 560px;

    /* Cały wiersz jest celem dotykowym. Kwadrat ma 20 px, więc sam nie dobija
       do progu 44 px — `min-height` pilnuje progu także wtedy, gdy treść zgody
       mieści się w jednej linii. */
    min-height: 44px;
    cursor: pointer;
  }

  & .szewko-pole__pudelko-slot {
    position: relative;
    display: flex;
    flex: 0 0 auto;
    margin-top: 2px;

    /* Wzorzec „rysunek 20 px, pole trafienia 44 px" — pseudoelement z ujemnym
       `inset`, czysty CSS, zero JS. Wiersz etykiety jest klikalny i tak, ale
       przy krótkiej treści zgody to ten prostokąt trzyma próg wokół samego
       kwadratu. Siedzi na slocie, nie na `<input>`: pseudoelementy elementów
       zastąpionych się nie renderują. */
    &::before {
      content: "";
      position: absolute;
      inset: -12px;
    }
  }

  & .szewko-pole__pudelko-input {
    position: absolute;
    inset: 0;
    width: 20px;
    height: 20px;
    margin: 0;
    opacity: 0;
    cursor: inherit;

    &:checked + .szewko-pole__pudelko {
      background: var(--color-sand-gold);

      & svg {
        opacity: 1;
      }
    }

    &:focus-visible + .szewko-pole__pudelko {
      outline: 2px solid var(--color-sand-gold);
      outline-offset: 2px;
    }
  }

  & .szewko-pole__pudelko {
    display: flex;
    box-sizing: border-box;
    width: 20px;
    height: 20px;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--color-sand-gold);
    border-radius: var(--radius-sm);
    background: transparent;
    color: var(--color-smoked-tent);
    transition: background var(--duration-fast) var(--ease-sand);

    /* Kwadrat jest rysunkiem, nie kontrolką: leży NA schowanym `<input>`, więc
       bez tego przechwytuje kliknięcie w samego siebie. Etykieta i tak by je
       przekazała dalej, ale wtedy trafienie w pole zależy od tego, że rodzicem
       jest `<label>` — a to jedna zmiana znacznika od cichej awarii. */
    pointer-events: none;

    & svg {
      opacity: 0;
    }
  }

  & .szewko-pole__tresc {
    font-family: var(--font-body);
    font-size: 14px;
    line-height: 1.55;
    color: var(--pole-etykieta);
  }

  &.szewko-pole--blad .szewko-pole__pudelko {
    border-color: var(--pole-obrys-blad);
  }

  &.szewko-pole--wylaczone .szewko-pole__zgoda {
    opacity: 0.55;
    cursor: wait;
  }
}

/* Na Pergaminie kwadrat obrysowany Sand Goldem znika (3,55:1 to za mało nawet
   na element nietekstowy) — 2E rysuje go Camel Brownem. Zaznaczenie zostaje
   złote, bo wypełniona płytka niesie kontrast sama. */
.szewko-pole--zgoda.szewko-pole--jasny .szewko-pole__pudelko {
  border-color: var(--color-camel-brown);
}

/* ─── HASŁO ──────────────────────────────────────────────────
 *
 * Przełącznik podglądu ma 44 × 44 px i siedzi w polu; pole robi mu miejsce
 * paddingiem. Ikona zmienia się selektorem na `aria-pressed`, więc stan
 * czytany przez czytnik i stan widziany oczami mają JEDNO źródło — nie da się
 * ich rozjechać zapominając o jednej linii JS-a.
 */
.szewko-pole--haslo {
  & .szewko-pole__kontrolka {
    padding-right: 56px;
    letter-spacing: 0.04em;
  }

  & .szewko-pole__podglad {
    position: absolute;
    top: 50%;
    right: 4px;
    display: flex;
    width: 44px;
    height: 44px;
    align-items: center;
    justify-content: center;
    transform: translateY(-50%);
    border: none;
    border-radius: var(--radius-sm);
    background: transparent;
    color: var(--pole-ikona);
    cursor: pointer;

    &:hover {
      color: var(--pole-ikona-hover);
    }

    &:focus-visible {
      outline: 2px solid var(--color-sand-gold);
      outline-offset: -2px;
    }

    &:disabled {
      opacity: 0.55;
      cursor: wait;
    }

    & .szewko-pole__oko--odkryte {
      display: none;
    }

    &[aria-pressed="true"] {
      & .szewko-pole__oko--zakryte {
        display: none;
      }

      & .szewko-pole__oko--odkryte {
        display: block;
      }
    }
  }

  /* Trójkąt ustępuje przełącznikowi: canvas stawia go na 52 px od prawej,
     tuż obok przycisku. Padding rośnie ponad wartość z canvasu (56 px), bo
     rysunek pokazuje krótkie hasło, a maskowane kropki dojeżdżają do ikony. */
  & .szewko-pole__ikona-slot {
    right: 52px;
  }

  &.szewko-pole--blad .szewko-pole__kontrolka {
    padding-right: 78px;
  }

  /* 14 px — ta sama rola i ten sam przemiar co `__blad`: ostrzeżenie o Caps
     Locku czyta się w chwili nieudanego logowania. ⚠︎ Stanu „Caps Lock
     wciśnięty" NIE DA SIĘ obejrzeć Playwrightem (CDP nie ustawia modyfikatora
     klawiatury systemu), więc ta reguła jest jedyną w arkuszu sprawdzoną
     rachunkiem, a nie na żywo. */
  & .szewko-pole__caps {
    display: flex;
    gap: 6px;
    align-items: flex-start;
    margin: 6px 0 0;
    font-family: var(--font-body);
    font-size: 14px;
    line-height: 1.5;
    color: var(--pole-uwaga);

    &[hidden] {
      display: none;
    }

    & .szewko-pole__ikona {
      flex: 0 0 auto;
      margin-top: 2px;
    }
  }
}

/* ─── 390 px ─────────────────────────────────────────────────
 *
 * Wysokość 52 px i cele 44 px nie zmieniają się na mobile — to one są tu
 * progiem. Zmienia się tylko to, co przy wąskiej kolumnie zaczyna łamać
 * układ: pole ograniczone `maks_szerokosc` przestaje być ograniczone,
 * bo 260 px na ekranie 390 px zostawia dziurę zamiast pola.
 */
@media (max-width: 480px) {
  .szewko-pole .szewko-pole__ramka {
    max-width: none;
  }
}
