/* Wygląd własnych klas smyrcu.net. Kolory i typografia komponentów Bootstrapa siedzą
   w Theme/theme.scss — tutaj jest to, czego tokenami się nie da: układ stron, kamienne
   ramki i powierzchnie z tekstur.

   Tekstury (skóra, piasek, kamień) generuje js/h3-textures.js do zmiennych --h3-* na <html>.
   Każde ich użycie ma kolor zastępczy, więc bez JS-a strona zostaje tym samym motywem,
   tylko na płaskich barwach. */

body { background: var(--h3-leather, none) 0 0 / 512px 512px, #4a3018; }

/* Ani Cinzel, ani Figtree nie mają u Google subsetu cyrylickiego — wygenerowany arkusz ma
   wyłącznie `latin` i `latin-ext` — więc na /ru i /uk glify cyrylickie bierze dalsza pozycja
   stosu. Gdyby treść tych wersji szła rodziną marki, w jednym zdaniu stałyby obok siebie
   kapitaliki Cinzela na wtrąceniach łacińskich („HotA", „AI value") i szeryfowy zastępnik
   (Georgia albo to, co poda system) na cyrylicy — dwa różne rysunki pisma w jednej linii.
   Rodzina do czytania trzyma oba pisma bliżej siebie, więc treść tych dwóch języków zostaje
   przy niej — razem z wagą 400, bo 500 w bazie jest odpowiedzią na cienki rys Cinzela.
   Nagłówki biorą rodzinę z własnej reguły, nie z tej zmiennej — zostają w kroju marki
   tak samo jak wcześniej. Zapasowe `sans-serif` w var() jest na wypadek nieaktualnego
   theme.min.css (plik generowany, poza gitem): bez niego cała deklaracja byłaby nieważna
   i treść spadłaby do domyślnego szeryfowego kroju przeglądarki. */
:root:lang(ru), :root:lang(uk) { --bs-body-font-family: var(--h3-font-reading, sans-serif); --bs-body-font-weight: 400; }

/* Gorset treści — ta sama szerokość dla paska nawigacji, stron i stopki. Wyłącznie longhandy:
   klasę noszą elementy z własnym paddingiem pionowym (stopka, pasek zgody), a skrót `padding`
   wyzerowałby im go, bo stoi w arkuszu niżej. */
.shell { width: 100%; max-width: 1120px; margin: 0 auto; padding-left: 40px; padding-right: 40px; }
.page { display: flex; flex-direction: column; min-height: 100vh; }
.page__body { flex: 1 0 auto; padding-top: 24px; padding-bottom: 8px; }

/* ── Kamień: wspólna ramka pergaminowych powierzchni ──
   Gdy tekstury nie ma, zostaje lita krawędź w kolorze z tokenów Bootstrapa.
   Krawędź zawsze longhandami: skrót `border` resetuje border-image do wartości początkowej,
   więc postawiony po tej regule zdjąłby kamień i zostawił gołą kreskę. */
.card,
.modal-content,
.hero--framed,
.legal,
.lightbox__content {
    border-image-source: var(--h3-frame, none);
    border-image-slice: 18;
    border-image-repeat: round;
    box-shadow: 0 0 0 1px #241f17, 0 6px 18px rgba(20, 8, 5, .45);
}

.card,
.modal-content,
.legal,
.lightbox__content { background: var(--h3-sand, none) 0 0 / 340px 340px, #c9b789; }

/* ── Nawigacja ── */
/* HxNavbar dostaje własną klasę gorsetu, więc reguła Bootstrapa dla .container-fluid go nie obejmuje. */
.navbar > .shell { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; }
/* Nazwa serwisu, kody języków i nazwy systemów są zawsze łacińskie, więc trzymają rodzinę
   marki także tam, gdzie treść z niej rezygnuje (patrz wyjątek dla ru/uk wyżej). */
.brand, .lang__link, .platform__name { font-family: var(--h3-font-brand, serif); }
.brand { font-weight: 700; font-size: 17px; color: #f7efdd; text-shadow: 0 1px 2px rgba(40, 26, 12, .6); }
.brand__accent { color: #f2c25a; }
.brand__muted { color: #dccfb6; font-weight: 500; }
.lang { display: flex; flex-wrap: wrap; }
.lang__link { padding: 5px 11px; border: 1px solid #8f7c5c; border-left-width: 0; font-size: 12.5px; font-weight: 600; color: #f7efdd; background: rgba(32, 21, 10, .45); text-shadow: 0 1px 2px rgba(40, 26, 12, .6); }
.lang__link:first-child { border-left-width: 1px; border-radius: 8px 0 0 8px; }
.lang__link:last-child { border-radius: 0 8px 8px 0; }
.lang__link:hover, .lang__link:focus-visible { color: #ffffff; background: rgba(32, 21, 10, .7); }
.lang__link[aria-current="page"] { background: #4a3009; color: #f7efdd; border-color: #4a3009; }

/* ── Nagłówki stron ── */
.hero { position: relative; padding: 48px 0 40px; display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: 48px; align-items: center; }
.hero--single { grid-template-columns: minmax(0, 1fr); padding: 56px 0 44px; }
.hero__body { display: flex; flex-direction: column; gap: 18px; }
.hero__kicker { font-size: 13.5px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: #f2c25a; }
.hero h1 { margin: 0; max-width: 20ch; color: #f7efdd; text-shadow: 0 2px 4px rgba(40, 26, 12, .6); }
.hero__lead { margin: 0; max-width: 60ch; font-size: 17px; line-height: 1.65; color: #dccfb6; text-wrap: pretty; }
.hero__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; }
/* $primary (#4a3009) w theme.scss jest dobrany pod kontrast na piasku kart (biel na nim 11,6:1),
   nie na skórze hero — ciemny brąz na ciemnej skórze (#4a3018) prawie znika. Ten sam przycisk
   (HxButton .btn-primary) na piasku karty zostaje bez zmian, nadpisujemy tylko zmienne
   Bootstrapa 5.3 w kontekście hero, wariantem złota z .hero__kicker/.brand__accent —
   przyciemnienie hover/active to mechaniczne -15%/-25% tego samego tokenu, nie nowy kolor. */
.hero__actions .btn-primary {
    --bs-btn-color: #211d17;
    --bs-btn-bg: #f2c25a;
    --bs-btn-border-color: #f2c25a;
    --bs-btn-hover-color: #211d17;
    --bs-btn-hover-bg: #ce9f45;
    --bs-btn-hover-border-color: #ce9f45;
    --bs-btn-active-color: #211d17;
    --bs-btn-active-bg: #b78b38;
    --bs-btn-active-border-color: #b78b38;
    --bs-btn-focus-shadow-rgb: 242, 194, 90;
    --bs-btn-disabled-color: #211d17;
    --bs-btn-disabled-bg: #f2c25a;
    --bs-btn-disabled-border-color: #f2c25a;
}
/* Metadane wydania stoją raz na karcie (piasek), a raz w nagłówku strony (skóra) —
   ten sam kolor nie zadziała na obu, więc na skórze bierzemy jasny wariant. */
.hero .meta { color: #dccfb6; text-shadow: 0 1px 2px rgba(40, 26, 12, .6); }

/* Baner huba: pergaminowa tablica w kamiennej ramce. Przyciemnienie idzie przez całą wysokość,
   więc tablica czyta się jako skończony element także bez grafiki — a gdy owner ją poda,
   wystarczy podmienić .hero__art i podpis nadal będzie miał na czym leżeć. */
/* Wysokość jest minimalna, nie sztywna: przy wąskim ekranie albo powiększonej czcionce
   podpis ma urosnąć razem z banerem, a nie zostać przycięty przez overflow. */
.hero--framed { display: flex; flex-direction: column; justify-content: flex-end; align-items: stretch; position: relative; min-height: 280px; padding: 0; margin-top: 10px; overflow: hidden; border-width: 8px; border-style: solid; border-color: #5c5448; border-radius: 2px; }
.hero__art { display: block; position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; background: var(--h3-sand, none) 0 0 / 340px 340px, #c9b789; }
/* Dwa przyciemnienia: pierwsze stonowuje cały baner, drugie robi pas pod podpisem.
   Pas jedzie razem z tekstem, więc krem leży na ciemnym tle niezależnie od tego,
   na ile linii rozjedzie się nagłówek. */
.hero--framed::before { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(20, 13, 6, .55), rgba(20, 13, 6, .3)); }
/* Przejście zamknięte w górnym marginesie pasa: tekst zaczyna się dopiero tam, gdzie
   przyciemnienie jest już pełne, więc wtopienie nic nie kosztuje czytelności. */
.hero__caption { position: relative; padding: 36px 32px 28px; background: linear-gradient(to top, rgba(20, 13, 6, .86), rgba(20, 13, 6, .78) calc(100% - 32px), rgba(20, 13, 6, 0)); }
.hero--framed h1 { margin: 0 0 6px; }
.hero--framed .hero__lead { font-size: 16px; }

/* ── Sekcje i karty ── */
.sections { display: flex; flex-direction: column; gap: 20px; }
.two-col { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
.card-head { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-bottom: 6px; }
.card__kicker { font-size: 13px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: #4a3009; }
/* Bez własnego rozmiaru i interlinii: to są „opisy" ze zgłoszenia, czyli dokładnie ten tekst,
   dla którego baza urosła do 16 px i 1,7 — sztywne 15 px trzymałoby je poza tą decyzją. */
.card-lead { margin: 0; color: #3a2f1e; text-wrap: pretty; }
/* Karty polityki mają po kilka akapitów — bez tego zlewałyby się w jeden blok */
.card-lead + .card-lead { margin-top: 12px; }
.card-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; margin-top: 16px; }
/* 13,5 px, nie 12,5 px — i tak samo w każdym drobnym podpisie niżej (.sections th,
   .example__label, .platform__note/meta/badge, .shot figcaption, .cookie-table th):
   Cinzel ma niższą wysokość x, więc te same 12,5 px dawało realnie drobniejsze minuskuły
   niż w kroju, który zastępuje. Przełącznik języka zostaje przy 12,5 px — to dwuliterowe
   kody wersalikami, których wysokość x nie dotyczy. */
.meta { font-size: 13.5px; color: #403320; font-variant-numeric: tabular-nums; }
.cta-primary { display: inline-flex; align-items: center; justify-content: center; padding: 11px 22px; border-radius: 8px; background: #4a3009; color: #f7efdd; font-size: 16px; font-weight: 600; text-decoration: none; }
.cta-primary:hover, .cta-primary:focus-visible { background: #352206; color: #ffffff; text-decoration: none; }
/* Wariant drugorzędny: ten sam kształt i wysokość co .cta-primary (obrys 1 px zjada po pikselu
   z paddingu), ale bez wypełnienia — obok głównego wezwania nie ma z nim konkurować.
   Ubiera zarówno <a> (hub, hero), jak i <button> na /h3/bugs — stąd jawny kursor i tło. */
.cta-secondary { display: inline-flex; align-items: center; justify-content: center; padding: 10px 21px; cursor: pointer; border: 1px solid #4a3009; border-radius: 8px; background: transparent; color: #4a3009; font-size: 16px; font-weight: 600; text-decoration: none; }
.cta-secondary:hover, .cta-secondary:focus-visible { background: rgba(74, 48, 9, .08); color: #352206; border-color: #352206; text-decoration: none; }
/* Na skórze hero ciemny brąz znika (ten sam problem co .hero__actions .btn-primary wyżej),
   więc obrys idzie w złocie z .hero__kicker, a hover rozjaśnia do bieli zamiast przyciemniać. */
.hero__actions .cta-secondary { border-color: #f2c25a; color: #f2c25a; text-shadow: 0 1px 2px rgba(40, 26, 12, .6); }
.hero__actions .cta-secondary:hover, .hero__actions .cta-secondary:focus-visible { background: rgba(242, 194, 90, .14); color: #ffffff; border-color: #ffffff; }

/* ── Treść kart ── */
.sections table { width: 100%; border-collapse: collapse; }
.sections th { font-size: 13.5px; color: #403320; font-weight: 600; text-align: left; padding: 4px 16px 4px 0; }
.sections td { padding: 12px 16px 12px 0; border-top: 1px solid #a8905f; }
/* Bez odstępu z prawej sąsiednie komórki sklejają się na wąskim ekranie w jedno słowo. */
.sections th:last-child, .sections td:last-child { padding-right: 0; }
.mono { display: inline-block; max-width: 100%; overflow-x: auto; font-family: ui-monospace, "JetBrains Mono", Consolas, monospace; font-size: 13.5px; background: #efe3c2; border: 1px solid #a8905f; border-radius: 6px; padding: 2px 8px; white-space: pre; vertical-align: top; }
.steps { display: flex; flex-direction: column; gap: 16px; }
.step { display: flex; gap: 14px; align-items: baseline; }
.step__num { display: inline-flex; align-items: center; justify-content: center; min-width: 28px; height: 28px; border-radius: 14px; background: #4a3009; color: #f7efdd; font-size: 14px; font-weight: 600; }
/* Kontener na cala tresc kroku: .step jest flex row (numer + tresc), a krok macOS ma
   dwa akapity (opis + komenda xattr). Bez tego drugiego poziomu drugi <p> trafialby
   do tego samego wiersza co numer i zgniatal pierwszy akapit do jednego slowa na linie. */
.step__body { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.step__body p { margin: 0; }
.example { display: grid; grid-template-columns: 1fr 36px 1fr; align-items: center; gap: 8px; }
.example__side { display: flex; flex-direction: column; gap: 3px; }
.example__label { font-size: 13.5px; color: #403320; }
.example__label--after { color: #4a3009; font-weight: 600; }
.example__value { font-size: 21px; font-weight: 600; white-space: nowrap; }
.example__value--before { color: #3a2f1e; }

/* ── Wybór platformy do pobrania (H3Assist) ── */
/* Kafle zamiast jednego przycisku: wydanie ma cztery pliki i użytkownik musi zobaczyć,
   że jego system jest obsługiwany, zanim kliknie. Kafel bez pliku zostaje widoczny, ale wygaszony. */
.platforms { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
.platform { position: relative; display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 14px 16px; border: 1px solid #a8905f; border-radius: 8px; background: #dccfb6; color: #211d17; text-align: left; cursor: pointer; }
.platform:hover:not([aria-disabled]), .platform:focus-visible:not([aria-disabled]) { background: #efe3c2; border-color: #4a3009; }
/* Kafel bez wydania wygaszamy kolorem, nie `opacity`: przezroczystość zbijała kontrast napisu
   „brak wydania" do 3,5:1, a to jedyny nośnik informacji, że pliku nie ma. */
.platform[aria-disabled] { background: #c4b69c; border-style: dashed; cursor: default; }
.platform[aria-disabled] .platform__name, .platform[aria-disabled] .platform__note { color: #3a2f1e; }
.platform--suggested { border-width: 2px; border-color: #4a3009; }
.platform__name { font-weight: 600; font-size: 16px; }
.platform__note { font-size: 13.5px; color: #3a2f1e; }
.platform__meta { font-size: 13.5px; color: #403320; font-variant-numeric: tabular-nums; }
.platform__badge { margin-top: 6px; font-size: 12.5px; font-weight: 600; color: #4a3009; text-transform: uppercase; letter-spacing: .04em; }
.platforms--empty { display: block; }

/* ── Zrzuty ekranu aplikacji ── */
.shots { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
.shot { margin: 0; }
.shot img { width: 100%; height: auto; display: block; border: 1px solid #5c5448; border-radius: 4px; background: #211d17; }
.shot figcaption { margin-top: 8px; font-size: 13.5px; color: #403320; }
.shot__trigger { display: block; width: 100%; padding: 0; border: 0; background: none; cursor: zoom-in; }
.shot__trigger:focus-visible { outline: 2px solid #f2c25a; outline-offset: 2px; }

/* ── Lightbox zrzutów ── */
/* Bez JS: <dialog open> renderowany przez stan Blazor zamiast showModal(), więc sam sobie
   robi ::backdrop jako fixed overlay. Ramka i tło treści to te same tokeny co .card/.legal
   (border-image + sand) — inny układ, ten sam motyw. */
.lightbox { position: fixed; inset: 0; width: 100vw; height: 100vh; max-width: none; max-height: none; margin: 0; padding: 24px; display: none; align-items: center; justify-content: center; border: 0; background: rgba(20, 12, 5, .85); z-index: 950; }
.lightbox[open] { display: flex; }
.lightbox__content { position: relative; box-sizing: border-box; max-width: min(1100px, 92vw); max-height: 92vh; border-width: 14px; border-style: solid; border-color: #5c5448; padding: 14px; }
.lightbox__content img { display: block; max-width: 100%; max-height: calc(92vh - 28px); width: auto; height: auto; border-radius: 2px; }
.lightbox__close { position: absolute; top: -14px; right: -14px; width: 32px; height: 32px; border-radius: 50%; border: 1px solid #5c5448; background: #f2c25a; color: #211d17; font-size: 20px; line-height: 1; cursor: pointer; }
.lightbox__close:hover, .lightbox__close:focus-visible { background: #ce9f45; outline: 2px solid #f7efdd; outline-offset: 2px; }

/* Podnagłówek w hero — oddziela wybór platformy od leadu, gdy nie ma jednego przycisku CTA. */
.hero__subhead { margin: 24px 0 12px; font-size: 17px; }

/* ── Formularz zgłoszenia błędu ──
   Pola to komponenty HxInput* (form-control/form-select z motywu), tutaj tylko układ: dwie kolumny
   na szerokim ekranie, jedna na telefonie. Honeypot poza ekranem, nie display:none — część botów
   pomija pola niewidoczne w układzie, a te poza kadrem wypełnia jak każde inne. */
.bug-form { display: flex; flex-direction: column; gap: 18px; }
.bug-form__row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.bug-form .form-label { font-weight: 600; color: #211d17; margin-bottom: 4px; }
.bug-form .form-text { color: #403320; font-size: 13.5px; }
.bug-form__consent { display: flex; flex-direction: column; gap: 10px; }
.honeypot { position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden; }
.turnstile { min-height: 65px; }
.form-hint--error { margin: 8px 0 0; font-size: 13.5px; font-weight: 600; color: #7a2a1a; }
.form-state--error { padding: 12px 16px; border: 1px solid #8a3a2a; border-radius: 8px; background: #efd9c9; color: #4a1c10; }
.form-state--sent h2 { margin-top: 0; }
.report-id { font-size: 15px; }

/* ── Stopka ── */
.footer { flex-shrink: 0; margin-top: 64px; border-top: 1px solid rgba(58, 44, 28, .55); }
.footer__inner { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 16px; padding-top: 20px; padding-bottom: 36px; font-size: 13.5px; color: #dccfb6; text-shadow: 0 1px 2px rgba(40, 26, 12, .6); }
.footer__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; }
.footer__link { color: #f7efdd; text-decoration: none; }
.footer__link:hover, .footer__link:focus-visible { color: #ffffff; text-decoration: underline; }

/* ── Pasek zgody na cookies — widoczny tylko do pierwszej decyzji, pod paskiem błędu Blazora ── */
.consent { position: fixed; left: 0; bottom: 0; width: 100%; z-index: 900; border-top: 3px solid #5c5448; background: var(--h3-sand, none) 0 0 / 340px 340px, #c9b789; box-shadow: 0 -4px 18px rgba(20, 8, 5, .45); }
.consent__inner { display: flex; align-items: center; justify-content: space-between; gap: 24px; padding-top: 14px; padding-bottom: 14px; }
.consent__text { font-size: 14px; line-height: 20px; color: #211d17; }
.consent__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; flex-shrink: 0; }
/* Trzecia opcja na pasku — tekst, nie przycisk, żeby nie konkurowała z właściwym wyborem */
.consent__more { background: none; border: 0; padding: 0; color: #4a3009; font-size: 14px; font-weight: 600; cursor: pointer; }
.consent__more:hover, .consent__more:focus-visible { color: #352206; text-decoration: underline; }
/* Pasek jest fixed, więc sam nie zajmuje miejsca — rezerwujemy je na czas, gdy jest w DOM,
   inaczej zasłaniałby koniec treści. Zapas liczony dla najdłuższego tekstu (ru/uk). */
body:has(.consent) .page { padding-bottom: 104px; }

/* ── Panel ustawień cookies ── */
.cookie-panel { display: flex; flex-direction: column; gap: 20px; }
.cookie-cat { display: flex; flex-direction: column; gap: 4px; }
.cookie-cat__row { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.cookie-cat__name { font-size: 16px; font-weight: 600; }
.cookie-cat__desc { margin: 0; font-size: 13.5px; line-height: 20px; color: #3a2f1e; }
.cookie-details > summary { font-size: 13.5px; font-weight: 600; color: #4a3009; cursor: pointer; }
.cookie-table { width: 100%; border-collapse: collapse; margin-top: 12px; font-size: 13.5px; }
.cookie-table th { font-size: 13.5px; color: #403320; font-weight: 600; text-align: left; padding: 4px 8px 4px 0; }
.cookie-table td { padding: 10px 8px 10px 0; border-top: 1px solid #a8905f; color: #3a2f1e; vertical-align: top; }

/* ── Focus ──
   Bootstrap gasi outline i zostawia po sobie cień w kolorze motywu (rgba(99,64,12,.25)),
   który ginie i na ciemnej skórze, i na piasku. Rysujemy własny wskaźnik z dwóch pierścieni:
   jasny w środku, ciemny na zewnątrz — jeden z nich kontrastuje z każdym tłem w motywie. */
.brand-link:focus-visible,
.lang__link:focus-visible,
.cta-primary:focus-visible,
.cta-secondary:focus-visible,
.platform:focus-visible,
.footer__link:focus-visible,
.consent__more:focus-visible,
.cookie-details > summary:focus-visible,
.btn:focus-visible {
    outline: 2px solid #f7efdd;
    outline-offset: 2px;
    box-shadow: 0 0 0 4px #241f17;
}

/* Pasek błędu Blazora — Blazor sam przełącza display na 'block' */
#blazor-error-ui { position: fixed; left: 0; bottom: 0; width: 100%; padding: 12px 24px; background: #4a1c10; color: #f7efdd; box-shadow: 0 -1px 2px rgba(0, 0, 0, .4); z-index: 1000; }
#blazor-error-ui a { color: #f2c25a; }

/* ── Dokument prawny (polityka prywatności) ──
   Nie kafle, tylko jedna pergaminowa kartka: ciągły tekst w jednej kolumnie o szerokości
   ograniczonej do ~75 znaków, bo dłuższy wiersz gubi się przy powrocie do początku linii.
   Ramka i tło z tych samych tokenów co .card — inny układ, ten sam motyw. */
.legal {
    /* Szerokość liczona w pikselach, nie w ch: przy border-box max-width obejmuje też padding
       i kamienną ramkę, więc jednostka względna dawałaby kolumnę o połowę za wąską.
       715px minus padding i ramka to ~565px tekstu, czyli ~76 znaków w tym kroju (zmierzone). */
    max-width: 715px;
    margin: 24px auto 56px;
    /* Margines boczny płynny, nie skokowy: przy stałym paddingu wiersz na progu 700px robił się
       dłuższy (70 → 77 znaków), bo .shell i kartka zwężały marginesy naraz. clamp trzyma
       długość wiersza w okolicy 75–77 znaków na każdej szerokości. */
    padding: 52px clamp(20px, 5vw, 56px) 44px;
    border-width: 18px;
    border-style: solid;
    border-color: #5c5448;
    color: #3a2f1e;
    /* Jedyny wyjątek od rodziny marki: kilkanaście akapitów tekstu prawnego. Cinzel rysuje
       minuskuły jako kapitaliki, więc ciągły dokument czyta się w nim wyraźnie gorzej niż
       pojedyncze zdania na stronach produktu. Tytuł dokumentu zostaje w rodzinie marki —
       daje go reguła nagłówków, nie dziedziczenie.
       Waga bazowa 500 jest odpowiedzią na cienki rys Cinzela, więc razem z rodziną wraca
       tu wartość, na którą ten krój był rysowany. */
    font-family: var(--h3-font-reading, sans-serif);
    font-weight: 400;
}

.legal__head { margin-bottom: 32px; padding-bottom: 20px; border-bottom: 2px solid #a8905f; }
.legal__head h1 { margin: 0 0 10px; font-size: 30px; color: #3a2f1e; text-shadow: none; }
/* Data obowiązywania tuż pod tytułem — tak robią to polityki, na których się wzorowaliśmy. */
.legal__meta { margin: 0; font-size: 13.5px; font-weight: 600; letter-spacing: .02em; color: #403320; text-transform: uppercase; }
.legal__lead { margin: 0 0 28px; font-size: 16.5px; line-height: 1.7; color: #3a2f1e; text-wrap: pretty; }

.legal__section + .legal__section { margin-top: 30px; }
/* Nagłówki paragrafów zostają w rodzinie do czytania razem z tekstem, który otwierają —
   bez `inherit` wzięłyby rodzinę marki z reguły nagłówków i rozbiły spójność kartki. */
.legal__section h2 {
    margin: 0 0 12px;
    font-family: inherit;
    font-size: 17px;
    font-weight: 700;
    letter-spacing: .01em;
    color: #4a3009;
    text-shadow: none;
}
/* Selektor zawężony do sekcji: „.legal p" ma wyższą specyficzność niż .legal__meta
   i .legal__lead, więc nadpisywał im rozmiar i marginesy, kasując hierarchię dokumentu. */
.legal__section p { margin: 0 0 12px; font-size: 15.5px; line-height: 1.75; text-wrap: pretty; }
.legal__section p:last-child { margin-bottom: 0; }

/* Prawa osoby jako lista numerowana — wymóg dokumentu, nie ozdoba. */
.legal__list { margin: 0 0 12px; padding-left: 26px; }
.legal__list li { margin-bottom: 8px; font-size: 15.5px; line-height: 1.75; text-wrap: pretty; }
.legal__list li:last-child { margin-bottom: 0; }

.legal .cookie-table { margin-bottom: 20px; }

@media (max-width: 900px) {
    .hero, .two-col, .bug-form__row { grid-template-columns: minmax(0, 1fr); }
    .platforms { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .shots { grid-template-columns: minmax(0, 1fr); }
    .example { grid-template-columns: minmax(0, 1fr); }
    .example svg { display: none; }
}

@media (max-width: 700px) {
    .shell { padding-left: 20px; padding-right: 20px; }
    /* Na telefonie kartka traci ozdobne marginesy — liczy się szerokość wiersza, nie ramka. */
    .legal { margin-top: 8px; padding-top: 28px; padding-bottom: 24px; border-width: 12px; border-image-slice: 12; }
    .legal__head { margin-bottom: 24px; }
    .legal__head h1 { font-size: 24px; }
    .page__body { padding-top: 16px; }
    /* Ścieżka instalacji jest szersza niż telefon — na wąskim ekranie pozwalamy jej się złamać,
       inaczej rozpycha stronę w poziomie. */
    .mono { white-space: normal; overflow-wrap: anywhere; }
    .platforms { grid-template-columns: minmax(0, 1fr); }
    .hero--framed { min-height: 240px; }
    .hero__caption { padding: 28px 20px 20px; }
    .consent__inner { flex-direction: column; align-items: flex-start; gap: 12px; }
    body:has(.consent) .page { padding-bottom: 200px; }
}
