/* Wygląd „Naukowiec” — eksperyment (Agata Homeschooling)
   Drugi wygląd ćwiczeń obok „Ucznia” (system.css): ekran jak w laboratorium, HUD-zie albo aparaturze medycznej.
   Te same nazwy klas co w system.css (.top, .brand, .progress, .stamps, .desk, .side, .stage, .panel-head, .tag,
   .btn, .link, .verdict, .row, .box), więc gra może mieć jeden HTML i dwa wyglądy.
   Nowe: .polecenie (stałe miejsce na polecenie), .n-ik (przycisk z ikoną i podpisem), .n-seg (przełącznik).
   Tryb: <html data-tryb="jasny|ciemny"> — ustawia naukowiec.js (za systemem albo z przycisku).
   Kontrast: każdy tekst ma co najmniej 7:1 do swojego tła w obu trybach (pary policzone przy projektowaniu palety).
   Akcent jest niebieski (lazur / błękit), a nie turkusowy — przyciemniony turkus wyglądał jak zieleń.
   Ozdoby — siatka, cienkie linie, poświata — nie niosą treści. */

/* --- kroje pisma: pliki w fonty/ (SIL Open Font License 1.1 — teksty licencji leżą obok plików) -------------------
   Atkinson Hyperlegible Next — do zdań (projektowany pod czytelność), Roboto Mono — etykiety, liczby, kody.
   Dwa zakresy znaków: łaciński i łaciński rozszerzony (ą ę ł ń ś ź ż ć) — przeglądarka bierze ten, którego potrzebuje. */
@font-face {
  font-family: "Atkinson Hyperlegible Next"; font-style: normal; font-weight: 200 800; font-display: swap;
  src: url("fonty/atkinson-hyperlegible-next-latin-ext.woff2") 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-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Atkinson Hyperlegible Next"; font-style: normal; font-weight: 200 800; font-display: swap;
  src: url("fonty/atkinson-hyperlegible-next-latin.woff2") 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: "Roboto Mono"; font-style: normal; font-weight: 100 700; font-display: swap;
  src: url("fonty/roboto-mono-latin-ext.woff2") 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-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Roboto Mono"; font-style: normal; font-weight: 100 700; font-display: swap;
  src: url("fonty/roboto-mono-latin.woff2") 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;
}

:root {
  color-scheme: light;
  /* --- tła i powierzchnie --- */
  --n-tlo: #E9EFF3; --n-tlo-2: #DCE5EB;
  --n-panel: #FBFCFD; --n-panel-2: #F1F5F8; --n-panel-3: #E6EEF3;
  --n-linia: #C3D0DA;          /* tylko ozdoba i podział */
  --n-linia-mocna: #42535F;    /* obrys przycisków i pól — 7:1 do paneli */
  /* --- tekst --- */
  --n-tekst: #0A1620; --n-tekst-2: #34495A;
  /* --- znaczenia --- */
  --n-akcent: #0A4580; --n-akcent-tlo: #E1ECF7; --n-na-akcencie: #FFFFFF;   /* system: aktywne, zaznaczone, „tu patrz” */
  --n-akcent-polka: color-mix(in srgb, var(--n-akcent) 60%, #000);       /* półka pod wypełnionym przyciskiem (oba tryby) */
  --n-org: #6E3800; --n-org-tlo: #FBEFE0; --n-na-org: #FFFFFF;              /* organizm, komórka */
  --n-vir: #8C1050; --n-vir-tlo: #FBE6F0; --n-na-vir: #FFFFFF;              /* wirus */
  --n-bak: #2F5400; --n-bak-tlo: #EAF3DC; --n-na-bak: #FFFFFF;              /* bakteria */
  --n-ok: #145A2E; --n-ok-tlo: #E1F2E6; --n-na-ok: #FFFFFF;
  --n-zle: #921C16; --n-zle-tlo: #FBE4E1; --n-na-zle: #FFFFFF;
  /* --- ozdoby --- */
  --n-siatka: rgba(10, 69, 128, .07);
  --n-poswiata: rgba(10, 69, 128, .10);
  --n-cien: 0 1px 2px rgba(10, 22, 32, .06), 0 10px 30px rgba(10, 22, 32, .10);
  --n-blask: 10%;              /* siła blasku zachęty — tekst trzyma 7:1 także w chwili przejścia */
  /* --- pismo: czytelne zdania + monospace do etykiet, liczb i kodów --- */
  --n-font: "Atkinson Hyperlegible Next", "Atkinson Hyperlegible", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
  --n-mono: "Roboto Mono", ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
  /* --- kształt --- */
  --n-r: 14px; --n-r-sm: 9px;
}

:root[data-tryb="ciemny"] {
  color-scheme: dark;
  --n-tlo: #05090E; --n-tlo-2: #0A1118;
  --n-panel: #0D151D; --n-panel-2: #131E28; --n-panel-3: #1A2733;
  --n-linia: #24384A; --n-linia-mocna: #8DA4B8;
  --n-tekst: #EEF4F8; --n-tekst-2: #B9C8D4;
  --n-akcent: #86C9FF; --n-akcent-tlo: #0D2238; --n-na-akcencie: #03111F;
  --n-org: #FFC56E; --n-org-tlo: #2D2A22; --n-na-org: #1A1000;
  --n-vir: #FFA3D7; --n-vir-tlo: #2E1F2B; --n-na-vir: #1A0010;
  --n-bak: #B6F36E; --n-bak-tlo: #23301F; --n-na-bak: #0E1A00;
  --n-ok: #7BF0A6; --n-ok-tlo: #13302A; --n-na-ok: #03140A;
  --n-zle: #FF9A8F; --n-zle-tlo: #36201F; --n-na-zle: #1A0503;
  --n-siatka: rgba(134, 201, 255, .045);
  --n-poswiata: rgba(134, 201, 255, .13);
  --n-cien: 0 0 0 1px rgba(134, 201, 255, .06), 0 14px 40px rgba(0, 0, 0, .45);
  --n-blask: 14%;
}

/* --- podstawy --------------------------------------------------------------------------- */
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
html, body { margin: 0; }
body {
  min-height: 100vh; min-height: 100dvh;
  display: grid; grid-template-rows: auto auto minmax(0, 1fr);
  color: var(--n-tekst); font: 400 17px/1.45 var(--n-font);
  background:
    radial-gradient(ellipse 70% 55% at 72% 0%, var(--n-poswiata), transparent 70%),
    linear-gradient(var(--n-siatka) 1px, transparent 1px) 0 0 / 32px 32px,
    linear-gradient(90deg, var(--n-siatka) 1px, transparent 1px) 0 0 / 32px 32px,
    var(--n-tlo);
}
button { font: inherit; color: inherit; cursor: pointer; }
:focus-visible { outline: 3px solid var(--n-akcent); outline-offset: 2px; }
[hidden] { display: none !important; }
svg.ik { width: 18px; height: 18px; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
@keyframes n-wjazd { from { opacity: 0; transform: translateY(6px); } }

/* --- przycisk: cienki obrys 1 px i twarda „półka” 2 px pod spodem w kolorze obrysu (Figma DS, węzeł 33:280) ----------
   Półkę ma wszystko, co da się nacisnąć, i nic poza tym — po niej dziecko poznaje przycisk na pierwszy rzut oka.
   Przycisk podaje wygląd w zmiennych: --obrys (obrys i półka), --polka (sama półka, np. ciemniejsza pod wypełnionym),
   --grubiej (stały dodatek do obrysu, który nie przesuwa treści, np. zaznaczona karta), --halo (miękka poświata wokół).
   --n-puls (0–1) to rytm zachęty: rośnie i maleje razem z pulsem, więc obrys pogrubia się w takt (dziedziczą go też
   przyciski w pulsującej karcie). Wyłączony przycisk nie ma półki — jest płaski, bo nie da się go nacisnąć.
   Pod każdym przyciskiem jest 2 px marginesu na półkę (w Figmie: dolny pas 2 px w ramce przycisku), więc układ ją liczy —
   żadna ramka jej nie przycina i nic na nią nie nachodzi. Wciśnięty przycisk zjeżdża właśnie w to miejsce. */
@property --n-puls { syntax: "<number>"; inherits: true; initial-value: 0; }
:where(button, .home, select) {
  --obrys: var(--n-linia-mocna); --polka: var(--obrys); --grubiej: 0px; --halo: 0px;
  margin-bottom: 2px;
  border: 1px solid var(--obrys);
  box-shadow:
    0 0 0 calc(var(--grubiej) + var(--n-puls, 0) * 1px) var(--obrys),
    0 2px 0 calc(var(--grubiej) + var(--n-puls, 0) * 1px) var(--polka),
    0 0 0 var(--halo) var(--n-poswiata);
}
:where(button:disabled, select:disabled) { box-shadow: none; }

/* --- nagłówek ćwiczenia ------------------------------------------------------------------- */
.top { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px 24px; padding: 12px 20px 12px; }
/* układ jak w Figmie (Podstawy v2): dwa rzędy — u góry powrót, część gry, nazwa etapu i lista „Tryb”; u dołu tytuł, ścieżka etapów
   i narzędzia. Marka ma pełną wysokość nagłówka, a tytuł stoi pośrodku dolnego pasa. */
.brand { display: flex; flex-direction: column; gap: 7px; min-width: 0; align-self: stretch; }
.brand-row { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; }
.home {
  display: inline-flex; align-items: center; gap: 4px; padding: 6px 10px 6px 6px; border-radius: var(--n-r-sm); /* węższy, jak w Figmie: strzałka bliżej krawędzi */
  background: var(--n-panel); color: var(--n-tekst); text-decoration: none; font: 600 14px/1.2 var(--n-font);
}
.home:hover { --obrys: var(--n-akcent); background: var(--n-panel-3); }
.brand h1 { margin: auto 0; font: 700 23px/1.15 var(--n-font); }
.brand h1 .n-kod { font-family: var(--n-mono); font-weight: 700; letter-spacing: .02em; text-transform: uppercase; }
.brand h1 em { font-style: normal; color: var(--n-akcent); }
.brand h1 .tyt-kropka { font-weight: 400; color: var(--n-tekst-2); } /* „ • ” po pierwszym członie nazwy gry — zasada globalna */

/* postęp: ścieżka etapów z numerami (pełna nazwa w etykiecie przycisku; bez napisu nad ścieżką — zasada globalna) */
.progress { display: flex; flex-direction: column; gap: 12px; margin: 0; }
.stamps { display: flex; align-items: center; margin: 0; padding: 0; list-style: none; }
.stamps li { display: flex; align-items: center; }
.stamps li + li::before { content: ""; width: 12px; height: 2px; margin-bottom: 2px; background: var(--n-linia); } /* margines jak pod przyciskiem — łącznik zostaje na środku kółka */
.stamps li.done + li::before { background: var(--n-akcent); }
/* łącznik nie wchodzi na kółko: kółko leży nad łącznikiem, a przy bieżącym etapie łącznik zaczyna się dopiero za jego
   poświatą (--halo 5 px + --grubiej 1 px) */
.stamps li.now::before { margin-right: 6px; }
.stamps li.now + li::before { margin-left: 6px; }
.stamps button {
  position: relative; z-index: 1; min-width: 34px; height: 34px; padding: 0 6px; display: grid; place-items: center; border-radius: 999px;
  background: var(--n-panel); color: var(--n-tekst-2); font: 700 13.5px/1 var(--n-mono);
}
.stamps button svg.ik { width: 17px; height: 17px; }
.stamps button:hover { --obrys: var(--n-akcent); color: var(--n-tekst); }
.stamps .done button { --obrys: var(--n-akcent); --polka: var(--n-akcent-polka); background: var(--n-akcent); color: var(--n-na-akcencie); }
.stamps .now button { --obrys: var(--n-akcent); --grubiej: 1px; --halo: 5px; background: var(--n-akcent-tlo); color: var(--n-tekst); }
.stamps .done.now button { background: var(--n-akcent); color: var(--n-na-akcencie); }

/* przyciski z ikoną i podpisem (narzędzia, sterowanie) */
.narzedzia { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.n-ik {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px; min-height: 38px; padding: 8px 13px; /* jak N/Przycisk z ikoną w Figmie: 9/14/11/14 razem z obrysem i półką */
  border-radius: var(--n-r-sm); background: var(--n-panel); color: var(--n-tekst);
  font: 600 14.5px/1.15 var(--n-font); white-space: nowrap;
}
.n-ik:hover { --obrys: var(--n-akcent); background: var(--n-panel-3); }
.n-ik[aria-pressed="true"] { --obrys: var(--n-akcent); background: var(--n-akcent-tlo); }
.n-ik-zle:hover { --obrys: var(--n-zle); color: var(--n-zle); }
/* nieaktywny (Figma N/Przycisk z ikoną, Stan=Wyłączony): płaski, przerywany obrys, przygaszona ikona — np. lupa „Oddal”, gdy
   widać już całą planszę, i „Przybliż” przy największym przybliżeniu (Piotr 07.11.2026) */
:is(.n-ik, .n-ik-kw):disabled, :is(.n-ik, .n-ik-kw):disabled:hover { --obrys: var(--n-linia-mocna); border-style: dashed; background: var(--n-panel-3); color: var(--n-tekst); cursor: default; }
:is(.n-ik, .n-ik-kw):disabled > :is(svg, span) { opacity: .6; }

/* przełącznik z kilku przycisków (np. część gry): półkę ma cały przełącznik, przyciski w środku są płaskie */
.n-seg {
  display: inline-flex; gap: 3px; padding: 3px; margin-bottom: 2px; border: 1px solid var(--n-linia-mocna); border-radius: var(--n-r-sm); background: var(--n-panel);
  box-shadow: 0 2px 0 var(--n-linia-mocna);
}
.n-seg button { margin: 0; padding: 5px 14px; border: 0; border-radius: 6px; background: none; box-shadow: none; color: var(--n-tekst); font: 700 13px/1.2 var(--n-mono); letter-spacing: .05em; text-transform: uppercase; }
.n-seg button[aria-pressed="true"] { background: var(--n-akcent); color: var(--n-na-akcencie); }
.n-seg button:hover:not([aria-pressed="true"]) { background: var(--n-panel-3); }

/* lista wyboru (np. „Tryb”: kolory i wygląd) — wygląda jak przycisk z półką, ze strzałką w dół; rozwija się lista systemowa
   (na iPadzie i telefonie — wygodny wybór palcem, z klawiatury — strzałki) */
.n-wybor { position: relative; display: inline-flex; align-items: center; margin-bottom: 2px; } /* margines na półkę ma pudełko, nie lista — strzałka i „Tryb:” zostają na środku */
.n-wybor select {
  -webkit-appearance: none; appearance: none; margin: 0; min-height: 38px; padding: 7px 34px 7px 12px; border-radius: var(--n-r-sm); /* prawy margines = strzałka (12 + 18 px) + 4 px odstępu od tekstu (Figma N/Lista wyboru 45:331, 29.10.2026) */
  background-color: var(--n-panel); color: var(--n-tekst); font: 600 14.5px/1.15 var(--n-font); cursor: pointer;
}
.n-wybor select:hover { --obrys: var(--n-akcent); background-color: var(--n-panel-3); }
.n-wybor option { background-color: var(--n-panel); color: var(--n-tekst); }
.n-wybor .ik { position: absolute; right: 12px; pointer-events: none; }
.n-wybor:has(select:active) .ik { transform: translateY(2px); } /* strzałka zjeżdża razem z wciśniętą listą */
/* nazwa listy w środku, przed wybraną wartością („Tryb: Ciemny, Naukowiec”): napis leży nad lewym marginesem listy
   (kliknięcie przechodzi do niej), a lista ma margines na jego szerokość — --pre-w mierzy wspolne/wyglad.js, bez skryptu: przybliżenie */
.n-wybor-pre { position: absolute; left: 13px; z-index: 1; pointer-events: none; font: 600 14.5px/1.15 var(--n-font); color: var(--n-tekst-2); }
.n-wybor-pre + select { padding-left: calc(17px + var(--pre-w, 2.5em)); }
.n-wybor:has(select:active) .n-wybor-pre { transform: translateY(2px); }
/* ekran dotykowy: lista co najmniej 16 px — mniejszą iPhone przybliża przy dotknięciu (i strona zostaje powiększona) */
@media (pointer: coarse) { .n-wybor select, .n-wybor-pre { font-size: 16px; } }

/* --- polecenie: zawsze w tym samym miejscu; przypięte u góry — oprócz telefonu, gdzie przewija się ze stroną ---
   Karta (Piotr 06–07.11.2026, najpierw w Do zamku; Figma DS v0.2 N/Polecenie): rząd 1 = etykieta i ciemny kafelek
   „Czytaj na głos” 42 × 42 w prawym górnym rogu; niżej treść. Wysokość karty nie zależy od długości tekstu, więc plansza
   pod nią nie skacze: na telefonie karta ma stałą wysokość, a treść przewija się w środku (własny pasek — systemowy iPhone
   chowa); na komputerze „jak” stoi w jednej linii, a gdy się nie mieści — „Rozwiń” / „Zwiń” (rozwinięcie to wybór dziecka).
   Obsługa: karta() w wspolne/naukowiec.js. */
.polecenie {
  --pol-x: 23px; --pol-wys: 120px; /* komputer: rząd 1 + jedna linia polecenia + jedna linia „jak” */
  position: sticky; top: 0; z-index: 30;
  display: flex; flex-direction: column; gap: 8px; min-height: var(--pol-wys); overflow: hidden;
  margin: 0 20px 14px; padding: 0 0 0 var(--pol-x);
  background: var(--n-akcent-tlo); color: var(--n-tekst);
  border: 1px solid var(--n-akcent); border-radius: var(--n-r); /* obrys 1 px dookoła, bez paska akcentu z lewej (Figma, Podstawy v2) */
  box-shadow: var(--n-cien);
}
.pol-gora { flex: none; display: flex; align-items: flex-start; gap: 10px; min-height: 42px; }
.pol-gora .pol-lbl { flex: 1 1 auto; min-width: 0; align-self: center; }
.pol-dol { flex: 1 1 auto; min-height: 0; display: flex; gap: 10px; }
/* treść przewija się w środku karty bez systemowego paska (telefon dostaje własny — .pol-pasek) */
.pol-tresc { flex: 1 1 auto; min-width: 0; min-height: 0; padding: 0 var(--pol-x) 0 0; overflow-y: auto; scrollbar-width: none; }
.pol-tresc::-webkit-scrollbar { display: none; }
/* odstęp pod tekstem jako ostatni element, nie dolny padding: Safari na iPhonie nie liczy dolnego paddingu przewijanej treści */
.pol-tresc::after { content: ""; display: block; height: 13px; }
.pol-lbl { margin: 0; font: 700 12.5px/1.25 var(--n-mono); letter-spacing: .12em; text-transform: uppercase; color: var(--n-akcent); }
.pol-tekst { margin: 0; font: 700 20px/1.3 var(--n-font); }
.pol-jak-wiersz { display: flex; align-items: baseline; gap: 10px; margin: 4px 0 0; }
.pol-jak { flex: 1 1 auto; min-width: 0; margin: 0; min-height: 1.45em; font: 500 16.5px/1.45 var(--n-font); color: var(--n-tekst-2); }
/* komputer: „jak” w jednej linii, póki dziecko nie rozwinie. Wyjątek: polecenie w lewej kolumnie obok planszy (Grzybnia, a od 07.11 Odporni i Paliwo) —
   tam jego wysokość nie rusza planszy, więc „jak” zostaje w całości */
@media (min-width: 901px) {
  .polecenie:not(.rozwiniete) .pol-jak { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .lewa > .polecenie .pol-jak { white-space: normal; overflow: visible; }
}
.polecenie.rozwiniete .pol-jak-wiersz { align-items: flex-end; }
/* „Rozwiń” / „Zwiń”: link w kolorze akcentu (Figma N/Rozwiń) */
.pol-rozwin {
  flex: none; margin: 0; padding: 0 2px; border: 0; border-radius: 4px; background: none; box-shadow: none;
  color: var(--n-akcent); font: 600 16.5px/1.45 var(--n-font); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; cursor: pointer;
}
.pol-rozwin:hover { text-decoration-thickness: 2px; }
.pol-rozwin[hidden] { display: none; }
.pol-pasek { display: none; } /* własny pasek przewijania tylko na telefonie (niżej) */
.pol-info { display: inline-block; padding: 1px 10px 2px; border: 1px solid; border-left-width: 4px; border-radius: 6px; color: var(--n-tekst); font-weight: 600; }
.pol-info.zle { background: var(--n-zle-tlo); border-color: var(--n-zle); }
.pol-info.ok { background: var(--n-ok-tlo); border-color: var(--n-ok); }
.pol-info.uwaga { background: var(--n-panel); border-color: var(--n-akcent); }
/* ostrzeżenie w poleceniu (Naukowiec.polecenie({ …, uwaga })), np. o ogniu: trzecia linijka pod „jak”, jak komunikat .pol-info.zle,
   ale stałe, póki gra je podaje */
.pol-uwaga { display: block; width: fit-content; max-width: 100%; margin: 8px 0 0; padding: 2px 10px 3px; border: 1px solid var(--n-zle); border-left-width: 4px; border-radius: 6px; background: var(--n-zle-tlo); color: var(--n-tekst); font: 600 15.5px/1.4 var(--n-font); }
.pol-uwaga[hidden] { display: none; }
/* „Czytaj na głos”: ciemny kafelek 42 × 42 wpięty w prawy górny róg karty (zaokrąglone tylko dwa rogi, Figma N/Czytaj na głos).
   Podczas czytania kafelek się odwraca (akcent, ikona „stop”). Podpisy zostają tylko dla czytników ekranu. */
.pol-czytaj {
  flex: none; position: relative; display: grid; place-items: center; width: 42px; height: 42px; margin: 0; padding: 0;
  border: 0; border-radius: 0 13px 0 13px; background: var(--n-panel); color: var(--n-tekst); box-shadow: none; cursor: pointer;
}
.pol-czytaj[hidden] { display: none; }
.pol-czytaj:hover { background: var(--n-panel-3); }
.pol-czytaj:focus-visible { outline-offset: -5px; }
.pol-czytaj[data-czyta="tak"] { background: var(--n-akcent); color: var(--n-na-akcencie); }
.pol-czytaj .ik-stop, .pol-czytaj[data-czyta="tak"] .ik-czytaj { display: none; }
.pol-czytaj[data-czyta="tak"] .ik-stop { display: inline; }
.pol-czytaj-podpis { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.pol-czytaj .stop, .pol-czytaj[data-czyta="tak"] .na-glos { display: none; }
.pol-czytaj[data-czyta="tak"] .stop { display: inline; }
/* czytanie jak karaoke: w trakcie nieprzeczytana część przygasa do --n-tekst-czeka, a przeczytane słowa wracają do --n-tekst
   (CSS Custom Highlight API — tekst nie jest dzielony na znaki). Piotr 07.11.2026: nieprzeczytane wyraźnie inne niż
   przeczytane — ok. 3:1 między nimi (z --n-tekst-2 było 1,5:1), a samo nadal czytelne (≥ 4,5:1 na tle paska).
   Klasę .czyta-tekst naukowiec.js dodaje tylko w przeglądarce z tym API — w innej tekst się nie zmienia. */
.polecenie { --n-tekst-czeka: #576B7E; }                          /* jasny: 4,6:1 na tle paska, 3,3:1 do --n-tekst */
:root[data-tryb="ciemny"] .polecenie { --n-tekst-czeka: #7A8EA1; } /* ciemny: 4,8:1 na tle paska, ok. 3:1 do --n-tekst */
.polecenie.czyta-tekst :is(.pol-tekst, .pol-jak, .pol-uwaga) { color: var(--n-tekst-czeka); }
::highlight(czytane) { color: var(--n-tekst); }

/* --- biurko: panel zadania + laboratorium -------------------------------------------------------- */
.desk { display: grid; grid-template-columns: minmax(380px, 1fr) minmax(0, 1.6fr); grid-template-rows: minmax(0, 1fr); gap: 16px; padding: 0 20px 18px; min-height: 0; }
.side {
  overflow: auto; padding: 18px 20px 20px; min-height: 0;
  background: var(--n-panel); border: 1px solid var(--n-linia); border-radius: var(--n-r); box-shadow: var(--n-cien);
}
.stage { position: relative; overflow: hidden; min-height: 0; background: var(--n-tlo-2); border: 1px solid var(--n-linia); border-radius: var(--n-r); }
.stage-label {
  display: inline-flex; flex-direction: column; gap: 2px; padding: 7px 12px 8px; pointer-events: none;
  background: var(--n-panel); border: 1px solid var(--n-linia-mocna); border-radius: var(--n-r-sm);
}
.stage-label span { font: 700 12px/1.2 var(--n-mono); letter-spacing: .12em; text-transform: uppercase; color: var(--n-akcent); }
.stage-label b { font: 700 18px/1.2 var(--n-font); color: var(--n-tekst); }

/* --- elementy paneli ----------------------------------------------------------------------- */
.panel-head { margin-bottom: 14px; }
.tag {
  display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border: 1px solid var(--n-akcent); border-radius: 6px;
  background: var(--n-akcent-tlo); color: var(--n-akcent); font: 700 12.5px/1.3 var(--n-mono); letter-spacing: .1em; text-transform: uppercase;
}
.panel-head h2 { margin: 8px 0 4px; font: 700 24px/1.2 var(--n-font); }
.panel-head p { margin: 4px 0 0; font-size: 16.5px; line-height: 1.45; color: var(--n-tekst-2); }
h3 { margin: 0 0 6px; font: 700 17px/1.3 var(--n-font); }
.box { margin-top: 12px; padding: 12px 14px; background: var(--n-panel-2); border: 1px solid var(--n-linia); border-radius: var(--n-r-sm); }
.box p { margin: 0; font-size: 16px; line-height: 1.45; }
.row { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-top: 14px; }

.btn {
  --obrys: var(--n-akcent); --polka: var(--n-akcent-polka);
  display: inline-flex; align-items: center; gap: 8px; padding: 11px 20px; border-radius: var(--n-r-sm);
  background: var(--n-akcent); color: var(--n-na-akcencie); font: 700 17px/1.2 var(--n-font);
}
.btn:hover { --halo: 4px; }
.btn:disabled { --obrys: var(--n-linia-mocna); background: var(--n-panel-3); border-style: dashed; color: var(--n-tekst-2); cursor: not-allowed; box-shadow: none; }
.link { background: none; border: 0; box-shadow: none; padding: 4px 2px; color: var(--n-akcent); font: 600 16px/1.3 var(--n-font); text-decoration: underline; text-underline-offset: 3px; }
.link:hover { color: var(--n-tekst); }

.verdict { padding: 14px 16px 16px; border: 1px solid; border-left-width: 6px; border-radius: var(--n-r-sm); animation: n-wjazd .3s ease-out both; }
.verdict.ok { background: var(--n-ok-tlo); border-color: var(--n-ok); }
.verdict.bad { background: var(--n-zle-tlo); border-color: var(--n-zle); }
.verdict h3 { margin: 0 0 4px; font: 700 20px/1.25 var(--n-font); }
.verdict p { margin: 6px 0 0; font-size: 16.5px; line-height: 1.45; }

.toast {
  position: fixed; left: 50%; bottom: 24px; z-index: 40; max-width: min(520px, 90vw); padding: 9px 16px; transform: translate(-50%, 16px); opacity: 0;
  background: var(--n-panel); color: var(--n-tekst); border: 1px solid var(--n-akcent); border-radius: var(--n-r-sm); font: 600 16px/1.35 var(--n-font);
  pointer-events: none; transition: opacity .2s, transform .2s;
}
.toast.show { opacity: 1; transform: translate(-50%, 0); }

/* --- zachęta jak w grach: to, co dziecko ma zrobić teraz, „oddycha” — lekko rośnie, a jego obrys w takt się pogrubia
   (--n-puls) — a co drugi oddech przesuwa się po nim blask. Tylko na jednej rzeczy naraz, bez dodatkowej poświaty wokół.
   Kolor blasku element podaje w --zacheta, zwykle color-mix(in srgb, <kolor> var(--n-blask), transparent).
   Blask jest tłem, więc leży pod tekstem (tekst trzyma 7:1 także w chwili przejścia).
   .n-zacheta-puls — sam puls (np. na wypełnionym przycisku, gdzie jasny blask obniżyłby kontrast). */
.n-zacheta-puls { animation: n-zacheta-puls 1.6s ease-in-out infinite; }
.n-zacheta {
  animation: n-zacheta-puls 1.6s ease-in-out infinite, n-zacheta-blask 3.2s ease-in-out .35s infinite;
  background-image: linear-gradient(105deg, transparent 32%, var(--zacheta, transparent) 50%, transparent 68%);
  background-size: 260% 100%; background-repeat: no-repeat; background-position: 160% 0;
}
@keyframes n-zacheta-puls { 50% { scale: 1.025; --n-puls: 1; } }
@keyframes n-zacheta-blask { 0% { background-position: 160% 0; } 34%, 100% { background-position: -60% 0; } }

/* --- zasada dla każdego przycisku: inny wygląd przy wciśnięciu i przy puszczeniu (system.js) ---
   Wciśnięty przycisk zjeżdża o 2 px na swoją półkę (półka znika), puszczony podskakuje i wraca na miejsce. */
button, .home, a.link, select { -webkit-tap-highlight-color: transparent; }
:is(button, .home, a.link, select):not(:disabled):active {
  transform: translateY(2px) scale(.98) !important; box-shadow: 0 0 0 var(--polka, transparent) !important;
  filter: brightness(.9); transition-duration: .04s;
}
:root[data-tryb="ciemny"] :is(button, .home, a.link, select):not(:disabled):active { filter: brightness(1.25); }
.is-released { animation: n-puszczony .26s ease-out; }
@keyframes n-puszczony { 0% { transform: translateY(2px) scale(.98); } 55% { transform: translateY(-1px) scale(1.02); } 100% { transform: none; } }

/* --- opis gry pod grą: dla nauczyciela i rodzica (<section class="o-grze">) --------------------------------
   To samo co .o-grze w system.css, w barwach „Naukowca”: czego gra uczy, dla której klasy, do których lekcji pasuje.
   Czytają go też wyszukiwarki, bo samą grę rysują skrypty. Szeroki ekran: opis leży tuż pod oknem gry (trzeba przewinąć);
   telefon i wąski tablet: zwykłym ciągiem pod grą. */
.o-grze {
  padding: 32px 20px 44px; border-top: 1px solid var(--n-linia);
  background:
    linear-gradient(var(--n-siatka) 1px, transparent 1px) 0 0 / 32px 32px,
    linear-gradient(90deg, var(--n-siatka) 1px, transparent 1px) 0 0 / 32px 32px,
    var(--n-tlo);
}
.o-grze-kartka {
  margin: 0; padding: 22px 26px 24px; /* do lewej krawędzi gry, jak biurko i polecenie (Piotr, 22.10.2026) */
  background: var(--n-panel); border: 1px solid var(--n-linia); border-radius: var(--n-r); box-shadow: var(--n-cien);
  container: o-grze / inline-size; /* kolumny i linijka klas zależą od szerokości kartki (@container o-grze niżej) */
}
.o-grze h2 { margin: 0 0 10px; font: 700 22px/1.25 var(--n-font); text-wrap: balance; }
.o-grze h3 { margin: 20px 0 6px; font: 700 12.5px/1.25 var(--n-mono); text-transform: uppercase; letter-spacing: .12em; color: var(--n-akcent); }
.o-grze p, .o-grze li { margin: 0; font: 400 17px/1.55 var(--n-font); }
.o-grze ul { margin: 0; padding-left: 20px; }
.o-grze li + li { margin-top: 4px; }
/* linki do części gry (np. Paliwo: odżywianie / oddychanie): wciśnięty zmienia kolor, jak każdy przycisk */
.o-grze .o-grze-czesci { margin-top: 12px; }
.o-grze a { color: var(--n-akcent); font-weight: 600; text-decoration: underline; text-decoration-thickness: 1.5px; text-underline-offset: 3px; -webkit-tap-highlight-color: transparent; }
.o-grze a:hover { text-decoration-thickness: 2.5px; }
.o-grze a:active { color: var(--n-tekst); }
.o-grze-stopka p { font-size: 14px; line-height: 1.45; color: var(--n-tekst-2); }
/* treść: jedna kolumna (linia do ok. 75 znaków); na szerokiej kartce dwie — gra po lewej, dorośli po prawej */
.o-grze-tresc { max-width: 760px; }
@container o-grze (min-width: 1000px) {
  .o-grze-tresc { max-width: none; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: 56px; }
  .o-grze-dla > h3:first-child { margin-top: 4px; }
}

/* --- stopka opisu „Linijka klas” (Figma DS, sekcja 409:6983; Piotr wybrał ją 30.10.2026) -------------------------
   Logo stoi na „podłodze”, która jest linijką klas 0–8; na podłodze stoją klocki z „Pasuje do” tej gry.
   Klocek w HTML: style="--od: 4; --do: 6; --rzad: 0; --rzad-w: 1" (pierwsza i ostatnia klasa, rząd na szerokiej kartce,
   rząd na wąskiej; rzędy liczone od podłogi). Liczba rzędów na .o-grze-klocki: --rzedy i --rzedy-w. Rysunek logo wstawia
   wspolne/stopka.js. Wąsko (telefon, tablet, mały laptop): sam znak, podpis obok klocka — z lewej, a z data-podpis="prawo"
   z prawej (dla klocków blisko początku linijki), każdy klocek w swoim rzędzie. Szeroko: całe logo, podpisy w klockach. */
.o-grze-stopka { margin-top: 28px; }
.o-grze-linijka { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: end; }
.o-grze-logo { grid-area: 1 / 1; display: block; width: 48px; height: 44px; margin-right: 10px; overflow: hidden; line-height: 0; color: var(--n-tekst); }
.o-grze-logo svg { display: block; width: 317px; height: 44px; fill: currentColor; }
.o-grze-logo .logo-akcent { fill: var(--n-akcent); }
.o-grze-klocki { grid-area: 1 / 2; position: relative; height: calc(var(--rzedy-w, 1) * 22px); }
.o-grze-klocek {
  position: absolute; bottom: calc(var(--rzad-w, 0) * 22px); height: 22px;
  left: calc(var(--od) * 100% / 9 + 2px); width: calc((var(--do) - var(--od) + 1) * 100% / 9 - 4px);
  display: flex; align-items: center; justify-content: center; box-sizing: border-box;
  background: var(--n-akcent-tlo); border: 1px solid var(--n-akcent); border-bottom: 0; border-radius: 5px 5px 0 0;
  font: 600 12.5px/1 var(--n-mono); letter-spacing: .03em; color: var(--n-akcent); white-space: nowrap;
}
.o-grze-klocek > span { position: absolute; right: calc(100% + 6px); }
.o-grze-klocek[data-podpis="prawo"] > span { right: auto; left: calc(100% + 6px); }
.o-grze-os, .o-grze-klasy { align-self: stretch; border-top: 2px solid var(--n-linia-mocna); padding-top: 20px; font: 600 12.5px/1.35 var(--n-mono); color: var(--n-tekst-2); }
.o-grze-os { grid-area: 2 / 1; padding-right: 8px; text-align: right; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; }
.o-grze-klasy {
  grid-area: 2 / 2; display: grid; grid-template-columns: repeat(9, minmax(0, 1fr)); margin: 0; padding-left: 0; list-style: none; text-align: center;
  --kreska: var(--n-linia-mocna); --kreska-2: var(--n-linia); --gestosc: 36; /* 4 drobne kreski na klasę, środkowa wpada na połówkę */
  background:
    linear-gradient(var(--kreska), var(--kreska)) right top / 2px 14px no-repeat,
    linear-gradient(90deg, var(--kreska) 2px, transparent 0) 0 0 / calc(100% / 9) 14px repeat-x,
    linear-gradient(90deg, var(--kreska-2) 1px, transparent 0) 0 0 / calc(100% / 18) 9px repeat-x,
    linear-gradient(90deg, var(--kreska-2) 1px, transparent 0) 0 0 / calc(100% / var(--gestosc)) 5px repeat-x;
}
.o-grze .o-grze-klasy li { margin: 0; font: inherit; }
.o-grze .o-grze-klasy .tak { color: var(--n-akcent); font-weight: 700; }
/* pod linijką: drobny druk („Pasuje do…”, autorskie) i powrót do wszystkich ćwiczeń — najpierw jeden pod drugim
   (telefon, też przeglądarki bez @container, np. Safari na iOS 15), obok siebie od 600 px kartki */
.o-grze-podpis { display: flex; flex-direction: column; align-items: stretch; gap: 16px 40px; margin-top: 24px; }
.o-grze-druk { min-width: 0; }
.o-grze .o-grze-wroc { flex: none; justify-content: center; gap: 6px; padding: 11px 14px 11px 10px; font-size: 14.5px; }
.o-grze a.o-grze-wroc { color: var(--n-tekst); text-decoration: none; }
@container o-grze (min-width: 600px) {
  .o-grze-podpis { flex-direction: row; align-items: center; }
  .o-grze-druk { flex: 1; }
  .o-grze .o-grze-wroc { padding-block: 10px; }
}
/* bardzo wąsko (320 px, powiększenie 400 %): podpisy klocków zachodziłyby na znak — znak znika, linijka zostaje */
@container o-grze (max-width: 260px) { .o-grze-logo { display: none; } }
@container o-grze (min-width: 1180px) {
  .o-grze-logo { width: 317px; margin-right: 44px; }
  .o-grze-os { padding-right: 16px; }
  .o-grze-klocki { height: calc(var(--rzedy, 1) * 26px); }
  .o-grze-klocek {
    bottom: calc(var(--rzad, 0) * 26px); height: 26px; border-radius: 6px 6px 0 0;
    left: calc(var(--od) * 100% / 9 + 3px); width: calc((var(--do) - var(--od) + 1) * 100% / 9 - 6px);
  }
  .o-grze-klocek > span { position: static; }
  .o-grze-klasy { --gestosc: 90; }
}
@media print { .o-grze { display: none !important; } }

/* --- ekran szeroki: gra mieści się w oknie (przewija się tylko panel zadania), pod oknem leży opis gry ---------- */
@media (min-width: 901px) {
  body { height: 100vh; height: 100dvh; overflow: hidden auto; } /* w bok nic nie wystaje; w dół strona przewija się tylko do opisu */
  .o-grze { position: absolute; top: 100%; left: 0; right: 0; }
  .side { overscroll-behavior: contain; } /* panel przewinięty do końca nie przesuwa strony z grą */
}

/* --- telefon i wąski tablet ------------------------------------------------------------------ */
@media (max-width: 900px) {
  body { display: block; }
  .top { flex-direction: column; align-items: flex-start; gap: 10px; padding: 12px 14px 10px; }
  .brand h1 { font-size: 21px; }
  .narzedzia { gap: 6px; }
  /* przyciski z ikoną zostają w rozmiarze z Figmy (N/Przycisk z ikoną: 38 px, 14,5 px) — jak w Do zamku (Piotr 07.11.2026;
     wcześniej telefon zmniejszał je do 36 px) */
  /* polecenie jak na szerokim ekranie (karta z obrysem i cieniem, te same rozmiary tekstu), ale o stałej wysokości (Piotr
     06.11.2026, Figma 477:9068 — wariant B): treść przewija się w środku karty, „jak” zawsze w całości, obok własny pasek
     przewijania (rynna 14 px, suwak 4 px), gdy tekst się nie mieści. 196 px = wysokość z Figmy dla Wirusów (480:10542). */
  .polecenie { --pol-x: 12px; --pol-wys: 196px; height: var(--pol-wys); min-height: 0; margin: 0 12px 12px; }
  .pol-tresc { padding: 0 12px 0 0; overscroll-behavior: contain; }
  .pol-tresc::after { height: 12px; }
  .pol-rozwin { display: none !important; }
  .pol-pasek:not([hidden]) { display: block; flex: none; width: 14px; padding: 7px 5px; overflow: hidden; background: var(--n-panel); } /* suwak nigdy poza rynną (Figma 483:10490) */
  .pol-pasek > span { display: block; width: 4px; height: 24px; border-radius: 10px; background: var(--n-akcent); will-change: transform; }
  .desk { grid-template-columns: 1fr; padding: 0 12px 16px; gap: 12px; }
  .side { padding: 16px 14px 18px; overflow: visible; }
}
/* --- telefon: polecenie nie jest przypięte u góry — przewija się razem ze stroną (przypięte zabierało ekran); tak samo
   telefon poziomo (szerszy niż 620 px, ale niski: przypięte zasłaniało pół ekranu — przegląd iPhone, 27.10.2026) --- */
@media (max-width: 620px), (max-height: 500px) {
  .polecenie { position: relative; }
}
/* --- „Pełny widok” na telefonie i tablecie: strona zablokowana, polecenie przypięte u góry, plansza na resztę ekranu, każdy
   ruch palca obraca model (Piotr, 27.10.2026). Klasę n-blokada na <html> zakłada wspolne/naukowiec.js (blokada()), gdy gra
   włączy pełny widok (lab-pelny na <body>); --n-pol-h = wysokość paska polecenia.
   Karty jak w Do zamku (Piotr 07.11.2026): polecenie i plansza zostają kartami z zaokrągleniami, 10 px od brzegów ekranu
   (albo więcej, gdy wymaga tego wcięcie ekranu) i 10 px od siebie. --- */
html.n-blokada {
  overflow: hidden; overscroll-behavior: none;
  --n-blok-g: max(10px, env(safe-area-inset-top, 0px)); --n-blok-d: max(10px, env(safe-area-inset-bottom, 0px));
  --n-blok-l: max(10px, env(safe-area-inset-left, 0px)); --n-blok-p: max(10px, env(safe-area-inset-right, 0px));
}
html.n-blokada body { position: fixed; left: 0; right: 0; width: 100%; overflow: hidden; overscroll-behavior: none; }
/* pod kartami pełne tło strony (siatka i poświata): nagłówek, panel i opis gry nie prześwitują przez odstępy między kartami —
   jak w Do zamku, gdzie cała gra leży na własnym tle (Piotr 07.11.2026) */
html.n-blokada body::before { content: ""; position: fixed; inset: 0; z-index: 58; background: inherit; }
html.n-blokada .polecenie { position: fixed; top: var(--n-blok-g); left: var(--n-blok-l); right: var(--n-blok-p); z-index: 60; margin: 0; touch-action: none; }
html.n-blokada .pol-tresc { touch-action: pan-y; } /* treść polecenia nadal przewija się palcem */
html.n-blokada #stage {
  position: fixed; top: calc(var(--n-blok-g) + var(--n-pol-h, 0px) + 10px); left: var(--n-blok-l); right: var(--n-blok-p); bottom: var(--n-blok-d); z-index: 59;
  height: auto; min-height: 0; max-height: none; margin: 0; touch-action: none;
}
html.n-blokada #stage .lab-3d { touch-action: none; } /* bez „pan-y”: ruch w pionie obraca model, a nie przewija stronę */
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important; } }
