/* ============================================================================
   02-typografia.css — wygląd TEKSTU. Bez układu, bez ramek, bez teł.
   Krój, rozmiar bazowy i interlinia są ustawione na <body> w 01-reset.css;
   tutaj tylko odstępstwa od nich.
   ============================================================================ */
/* ---------------------------------------------------------------------------
   DM Sans — LOKALNIE, z public/assets/fonts/ (dodane 11.08.2026).
   Te same cztery pliki, ktorych uzywa juz generator ofert
   (src/server/offerHtmlGenerator/buildOfferHtml.js, LOCAL_DM_SANS_FONT_PATHS).
   Aplikacja przestaje zalezec od fonts.googleapis.com — dziala offline.
   Pliki sa ZMIENNE: jedna os `wght` 100-1000, wiec jeden plik obsluguje
   wszystkie grubosci 400-900, ktorych uzywa aplikacja.
   KOLEJNOSC MA ZNACZENIE: w obrebie jednego font-style latin-ext MUSI stac
   PRZED latin. Odwrotnie przegladarka ciagnie plik latin-ext dla zwyklego „A"
   i spacji, ktore sa w obu podzbiorach.
   Polskie znaki: a/c/e/l/n/s/z/z siedza w latin-ext, o w latin — polski
   interfejs ciagnie oba pliki (~55 KB razem). */
@font-face {
  font-family: "DM Sans";
  font-style: normal;
  font-weight: 100 1000;
  font-display: swap;
  src: url("/assets/fonts/dm-sans-normal-latin-ext.woff2?v=1") 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: "DM Sans";
  font-style: normal;
  font-weight: 100 1000;
  font-display: swap;
  src: url("/assets/fonts/dm-sans-normal-latin.woff2?v=1") 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: "DM Sans";
  font-style: italic;
  font-weight: 100 1000;
  font-display: swap;
  src: url("/assets/fonts/dm-sans-italic-latin-ext.woff2?v=1") 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: "DM Sans";
  font-style: italic;
  font-weight: 100 1000;
  font-display: swap;
  src: url("/assets/fonts/dm-sans-italic-latin.woff2?v=1") 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;
}
/* ---------------------------------------------------------------------------
   CZCIONKI WZORU (RM3, v15 b14, 04.10.2026): „Onest” (tekst, --font) i „Bricolage Grotesque” (tytuły, --font-tytul).
   Wzór bierze je z Google Fonts; program nie łączy się z obcymi serwerami (CSP: font-src 'self'), więc pliki muszą
   leżeć w public/assets/fonts/. Dogrywa je JEDNO polecenie (pobiera 4 pliki woff2, wpisuje tu bloki @font-face
   i preloady do index.html):   node tools/czcionki-wzoru.mjs
   Dopóki plików nie ma, --font spada na „DM Sans” (niżej w stosie) — rozmiary, wagi i układ są już ze wzoru. */
/* CZCIONKI-WZORU-START */
@font-face {
  font-family: "Onest";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/assets/fonts/onest-latin-ext.woff2?v=1") 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: "Onest";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/assets/fonts/onest-latin.woff2?v=1") 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: "Bricolage Grotesque";
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url("/assets/fonts/bricolage-grotesque-latin-ext.woff2?v=1") 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: "Bricolage Grotesque";
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url("/assets/fonts/bricolage-grotesque-latin.woff2?v=1") 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;
}
/* CZCIONKI-WZORU-KONIEC */
/* Nagłówki dzielą jeden krój i ciasną interlinię. Na gęstym ekranie roboczym
   tytuł ma ODDZIELAĆ sekcje, a nie zabierać pół widoku — stąd mała skala. */
h1, h2, h3, h4 { font-weight: var(--w-bold); line-height: var(--lh-tight); text-wrap: balance; }
h1 { font-size: var(--t-xl); }
h2 { font-size: var(--t-lg); }
h3 { font-size: var(--t-md); }
h4 { font-size: var(--t-base); }
/* Treść drugorzędna (opisy, podpisy, puste stany) — czytelna, ale nie
   konkuruje wzrokowo z danymi. */
.muted { color: var(--text-muted); }
/* Kwoty, ilości, numery. Cyfry o STAŁEJ szerokości: kolumna kosztorysu
   układa się w pion, więc różnicę rzędu wielkości widać bez czytania liczby.
   Zakaz łamania — „1 250,00 €" nie może się rozjechać na dwa wiersze. */
.money { font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Zwykłe „0" wszędzie (właściciel, 14.09.2026): przeglądarka domyślnie pisze code/kbd/pre/samp czcionką o stałej
   szerokości, która ma przekreślone zero. Te elementy biorą krój interfejsu (--font-mono = --font). */
code, kbd, pre, samp { font-family: var(--font-mono); }
/* Dopiski przy wartościach: jednostka, data, „z 12 pozycji".
   Tekst pomocniczy POD kontrolką formularza ma własną klasę .field-hint
   (03-kontrolki.css) — tam odpowiada za niego układ pola. */
small { font-size: var(--t-sm); color: var(--text-muted); }
/* Wyróżnienie w zdaniu robimy GRUBOŚCIĄ, nie kolorem — kolor w tej aplikacji
   niesie znaczenie (status, etap, ostrzeżenie) i nie wolno go zużyć na akcent.
   CELOWO BEZ REGUŁY na `strong`/`b`: monolit też jej nie ma, więc obowiązuje
   domyślna grubość przeglądarki (700). Nadpisanie na 600 ścieniało wszystkie
   54 wystąpienia w aplikacji — zmierzone wobec monolitu, nie zgadywane. */
/* Etykieta pola: mniejsza i stonowana. Nazwa pola jest zwykle znana, więc
   wzrok ma trafiać w WARTOŚĆ, a nie w opis nad nią. */
/* Etykieta pola: 10 px, grubość 800, kolor ciemniejszy od wyszarzenia —
   1:1 z monolitem (`.field label`, linia 1257). Nasze 12 px / 500 sprawiało,
   że etykiety konkurowały wzrokowo z WARTOŚCIĄ pola. Dotyczy każdego
   formularza i każdego okna w aplikacji. */
/* RM3 (v15 b14): etykieta pola jak we wzorze (`.pole-f label`): 13 px, 600, kolor tekstu drugorzędnego. */
label { font-size: var(--t-sm); font-weight: var(--w-bold); color: var(--text-muted); }
