/* ==========================================================================
   IBM Plex Sans - self-hosted (ZERO Google Fonts).

   Do 2026-08-31 panel ciągnął ten krój z dwóch obcych hostów: arkusz
   z fonts.googleapis.com, a pliki woff2 z fonts.gstatic.com. Docelowa polityka
   CSP (style-src 'self', font-src 'self') blokuje oba, a stacja przyjmująca
   alarmy nie ma powodu zależeć od cudzego serwera przy renderowaniu własnego
   interfejsu. Ten sam ruch, co przy Tailwindzie (static/vendor/tailwind).

   Skąd pliki i jak je odtworzyć: README.md obok.
   Licencja: OFL-1.1, treść w LICENSE-IBMPlexSans-OFL.txt obok.

   --------------------------------------------------------------------------
   Dlaczego font-display: swap, a nie optional

   `optional` daje przeglądarce ~100 ms na pobranie fontu; jeśli się nie wyrobi,
   CAŁY ten widok renderuje się fallbackiem systemowym i już nie podmienia go do
   końca życia strony (zero przeskoku układu). Kuszące na ekranie patrolowca
   w terenie - ale właśnie tam kosztuje najwięcej, bo układ panelu jest liczony
   pod metryki IBM Plex Sans, a nie pod szerszy systemowy Helvetica/Arial/Roboto.
   Jest to udokumentowane wprost: `#gr-topbar` ma kilka elementów ze świadomym
   `white-space: nowrap` OBOK SIEBIE, dobranych pod węższy IBM Plex
   (static/css/soc.css, sekcja "Typografia") - w szerszym kroju zaczynają na
   siebie nachodzić. `optional` zamroziłby taki widok w złym kroju na całą sesję
   oglądania strony, i to najchętniej na najsłabszym łączu, czyli dokładnie tam,
   gdzie patrolowiec ma najmniej czasu na zgadywanie, co się z czym nakłada.

   `swap` też pokazuje tekst natychmiast (fallbackiem), ale podmienia go, gdy
   font dojdzie. Złe metryki są więc przejściowe, nie utrwalone. Na stanowisku
   dyżurnym font i tak jest w cache po pierwszym wejściu, więc swap nie kosztuje
   tam nic; w terenie patrolowiec czyta treść od razu, a poprawny układ dostaje
   chwilę później. Tego samego wyboru trzyma się już @font-face fontu mono
   w static/css/soc.css.

   --------------------------------------------------------------------------
   Dlaczego akurat te wagi

   Dokładnie te, które panel realnie stawia na ekranie (i dokładnie te, które
   wypisywał stary URL do Google Fonts - podmiana nie zmienia wyglądu):

     300 Light     - wordmark "Grade ONE" (login.html, base.html x2)
     400 Regular   - tekst domyślny (body)
     500 Medium    - font-medium, 21 wystąpień + font-weight:500
     600 SemiBold  - font-semibold, 180 wystąpień + font-weight:600
     700 Bold      - font-bold, 192 wystąpienia + font-weight:700
     400 kursywa   - <span class="italic"> w templates/patrole.html

   Czego celowo NIE ma:
   - IBM Plex Mono. `font-mono` (53 wystąpienia) to utility Tailwinda wskazujące
     systemowy monospace, a motyw NOC/SOC ma własny GradeOneMono (JetBrains Mono)
     w static/css/soc.css. IBM Plex Mono nie jest używany nigdzie.
   - Wagi 800 i 900 (`font-black`, `font-weight: 800/900` w wall.html,
     pulpit-operator.css, base.html). Rodzina IBM Plex Sans kończy się na 700 -
     oś `wght` fontu zmiennego to 100..700 - więc te miejsca już dziś renderują
     się wagą 700. Nic się nie zmienia.
   - Waga 200 (`.zegar-duzy` w wall.html). Stary URL do Google Fonts też jej nie
     zamawiał, więc zegar ściany już dziś rysuje się najbliższą dostępną, czyli
     300. Dołożenie 200 byłoby zmianą wyglądu, a nie vendorowaniem.
   - Waga 650 (`.gr-md-h2/h3`, `strong` w instrukcja.html). Jak wyżej: przy
     dostępnych 600 i 700 przeglądarka wybiera 700, tak samo jak dziś.

   --------------------------------------------------------------------------
   Podzbiór znaków

   Każdy plik to latin + latin-ext złączone w JEDNYM woff2, czyli suma tego, co
   Google serwował w dwóch osobnych plikach na wagę. Polskie znaki (ą ć ę ł ń ó
   ś ź ż i wersaliki) siedzą w latin-ext, więc rozdzielanie tych zakresów przez
   unicode-range dawało tu zawsze dwa pobrania zamiast jednego. Ekran patrolowca
   pobiera teraz 3 pliki (400/600/700) zamiast 6, i to z tego samego hosta co
   reszta strony, bez osobnego DNS i TLS do dwóch domen Google.

   Adresy plików są WZGLĘDNE wobec tego arkusza i celowo bez parametru wersji:
   nazwa pliku jest przypisana do konkretnej wersji kroju (3.201), a przy zmianie
   kroju zmieni się też ten arkusz, ładowany już z parametrem wersji z szablonu.
   ========================================================================== */

@font-face {
  font-family: "IBM Plex Sans";
  src: url("IBMPlexSans-Light.woff2") format("woff2");
  font-weight: 300;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "IBM Plex Sans";
  src: url("IBMPlexSans-Regular.woff2") format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "IBM Plex Sans";
  src: url("IBMPlexSans-Italic.woff2") format("woff2");
  font-weight: 400;
  font-style: italic;
  font-display: swap;
}

@font-face {
  font-family: "IBM Plex Sans";
  src: url("IBMPlexSans-Medium.woff2") format("woff2");
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "IBM Plex Sans";
  src: url("IBMPlexSans-SemiBold.woff2") format("woff2");
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "IBM Plex Sans";
  src: url("IBMPlexSans-Bold.woff2") format("woff2");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
