/* === Architektura warstw: vendor < components < utilities (bez !important) === */
@layer tokens, vendor, components, utilities;
/* Tokeny (marka, kolory, skale) - jedyne źródło; patrz app/static/css/tokens.css */
@import url("/static/css/tokens.css?v=25") layer(tokens);
/* Material Symbols (Google) — self-hostowane (K4: offline w Capacitor). Warstwa vendor -> komponenty nadpisuja rozmiar/centrowanie ikon bez !important */
@import url("/static/vendor/material-symbols.css?v=21") layer(vendor);

@layer components {

/* ============================================================
   Solve — style aplikacji.
   Sekcje:
     1. Tokeny
     2. Reset + typografia
     3. Layout (app shell, sidebar, topbar, page)
     4. Komponenty (buttons, stats, filters, table, modal, drawer, tags, timeline)
     5. Login
     6. Responsywność
   ============================================================ */

/* ============================================================
   SKALA BREAKPOINTÓW (konwencja projektu — używaj tych wartości)
   ------------------------------------------------------------
   CSS nie pozwala na zmienne w @media, więc to umowa, nie kod.
   Przy NOWYCH regułach @media trzymaj się tej skali:

     ≤ 360px   — bardzo małe telefony (drobne korekty, np. pill/font)
     ≤ 600px   — telefon (układ 1-kolumnowy, większe tap-targety)
     ≤ 700px   — duży telefon / mały tablet (siatki 2→1, formularze)
     ≤ 900px   — tablet / przełącznik desktop↔mobile
                 (sidebar → dolna nawigacja, większość siatek się składa)
     ≤ 1100px  — wąski desktop (siatki 4→2/1)
     ≥ 901px   — desktop (gdy potrzebny min-width)

   Dominujące w kodzie: 900px (główny przełącznik) i 700px.
   Nie wymyślaj nowych progów (768/1024 itp.) — rozjeżdża spójność.
   ============================================================ */

/* ---------- 1. Tokeny — Material 3 / Google style ---------- *
 * Hierarchia kolorów inspirowana Material You:
 *   primary        — kobalt marki (--brand-blue w tokens.css)
 *   primary-cont.  — jasny tint, używamy do aktywnych stanów (nav, chip, button-tonal)
 *   surface-N      — warstwowe powierzchnie (im wyższy numer, tym wyższa elewacja)
 *   outline        — borderry; outline-variant — subtelniejsze
 *   state-*        — overlay state layers (hover/focus/pressed) na powierzchni
 */

/* ---------- Dark mode tokens (M3 dark surface palette) ----------
   Włączamy klasą .dark na <html> (toggleTheme() w mobile-tools.js).
   Domyślnie respektuje prefers-color-scheme przy pierwszym ładowaniu. */

/* ---------- 2. Reset + typografia ---------- */
/* Jedna rodzina pisma w całym UI (zgodnie z decyzją projektową):
   • wszystko → Montserrat (--font-sans, KV-APP 08.10); liczby wyrównane przez tabular-nums
   • monospace zostaje WYŁĄCZNIE dla kodu/skrótów (code, kbd, snippet)
   Wcześniej app.css wskazywał "Geist"/"Geist Mono", których nie ładujemy —
   stąd losowe systemowe fallbacki. Teraz nazwy = realnie załadowane fonty. */

/* .mono — utility historycznie monospace; w systemie jednego kroju = --font-sans
   z tabular-nums (dziedziczone z body). Realny monospace tylko dla kodu poniżej. */
/* ============================================================
   RESET box-sizing (2026-09-11)
   ============================================================
   Do tej pory repo NIE miało tego resetu, a pięć miejsc ustawiało go
   punktowo - czyli ktoś za każdym razem odkrywał problem od nowa. Bez niego
   `width`/`left+right` ustawia szerokość TREŚCI, a padding i obramowanie
   DOKŁADAJĄ się na wierzch. Prawie nikt tak nie liczy, pisząc CSS.

   Kosztowało to konkretny błąd: dolny pasek nawigacji z `left:0; right:0;
   padding: 0 4px` miał 398px na ekranie 390px i rozpychał stronę w poziomie
   na 37 stronach (skan mobile 11.09). Maskował to `overflow-x: clip`, dopóki
   go stamtąd nie zdjęliśmy.

   Reset jest świadomie na samej górze warstwy komponentów, żeby każda reguła
   niżej mogła go nadpisać, gdyby kiedyś naprawdę potrzebowała content-box
   (dziś nie potrzebuje go nic - w pliku nie ma ani jednego `content-box`).

   Siatka bezpieczeństwa przy tej zmianie: reguła `rozjazd` w a11y/mobile_scan.py
   jest blokująca, więc gdyby reset rozjechał którąkolwiek z 51 skanowanych
   stron, CI stanie na czerwono. */
*, *::before, *::after { box-sizing: border-box; }

.mono { font-family: inherit; }
.dim  { color: var(--text-3); font-size: var(--fs-sm); }
button { font-family: inherit; cursor: pointer; }
input, select, textarea { font-family: inherit; font-size: inherit; color: inherit; }
input[type="range"], progress { accent-color: var(--primary); }
/* KV-APP-CHECKBOX (20.10, plan działań C7, spec. strony 5.6): własne pole wyboru i radio
   24 px zamiast natywnych. `:where` = specyficzność 0, więc każda klasa komponentu
   wygrywa - także ukryte wejścia kafelków / gwiazdek / przełączników (opacity 0, 1 px).
   Ptaszek rysuje ::before (clip-path) kolorem --on-primary - działa w obu motywach. */
:where(input[type="checkbox"], input[type="radio"]) {
  appearance: none; -webkit-appearance: none; margin: 0; flex: none;
  width: 24px; height: 24px; display: inline-grid; place-content: center; vertical-align: middle;
  border: 2px solid var(--field-border); border-radius: var(--shape-xs); background: var(--surface);
  color: var(--primary); cursor: pointer;
  transition: background-color var(--motion-fast), border-color var(--motion-fast);
}
:where(input[type="radio"]) { border-radius: var(--shape-full); }
:where(input[type="checkbox"], input[type="radio"])::before {
  content: ""; width: 12px; height: 12px; transform: scale(0);
  transition: transform var(--motion-fast) var(--ease-std);
}
:where(input[type="checkbox"])::before {
  background: var(--on-primary);
  clip-path: polygon(14% 44%, 0 65%, 40% 100%, 100% 22%, 84% 6%, 39% 66%);
}
:where(input[type="radio"])::before { width: 10px; height: 10px; border-radius: var(--shape-full); background: var(--primary); }
:where(input[type="checkbox"]):checked { background: var(--primary); border-color: var(--primary); }
:where(input[type="radio"]):checked { border-color: var(--primary); }
:where(input[type="checkbox"], input[type="radio"]):checked::before { transform: scale(1); }
:where(input[type="checkbox"]):indeterminate { background: var(--primary); border-color: var(--primary); }
:where(input[type="checkbox"]):indeterminate::before { clip-path: inset(40% 10%); transform: scale(1); }
:where(input[type="checkbox"], input[type="radio"]):hover:not(:disabled) { border-color: var(--primary); }
:where(input[type="checkbox"], input[type="radio"]):focus-visible { outline: 3px solid var(--primary-ring); outline-offset: 2px; }
:where(input[type="checkbox"], input[type="radio"]):disabled { opacity: 0.5; cursor: not-allowed; }
/* Cały wiersz klikalny: etykieta z polem wyboru w środku ma kursor ręki (klik i tak
   zaznacza - to natywne zachowanie <label>). */
:where(label:has(> input[type="checkbox"], > input[type="radio"])) { cursor: pointer; }
/* KV-APP-AUDYT (08.10): natywny „Choose File" wyglądał jak z innej aplikacji.
   Przycisk wyboru pliku = nasz przycisk drugorzędny; samo pole bez ramki tekstowej. */
/* KV-EKRANY-1 (15.10): pigułka w kolorze marki jak przyciski tonalne panelu. */
input[type="file"]::file-selector-button {
  font: inherit; font-weight: var(--fw-bold); color: var(--on-primary-container);
  background: var(--primary-container); border: 1.5px solid var(--primary-ring); border-radius: var(--shape-full);
  padding: 8px 16px; margin-right: 12px; cursor: pointer;
  transition: background var(--motion-fast) var(--ease-std), color var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std);
}
input[type="file"]::file-selector-button:hover { background: var(--primary); border-color: var(--primary); color: var(--on-primary); }
input[type="file"].input { padding: 6px; min-height: 0; color: var(--text-2); font-size: var(--fs-base); }
a { color: inherit; text-decoration: none; }

/* Material Symbols Outlined — bazowe ustawienia.
   Wewnątrz selektorów `font-variation-settings` jest dopisywany dla wagi/wypełnienia,
   ale tu ustawiamy sane defaults dla widoków, w których ikona nie ma dedykowanej reguły. */
.material-symbols-outlined {
  /* font-family MUSI byc tutaj: regula utility z importowanego
     vendor/material-symbols.css bywa gubiona przez parser (patrz komentarz
     w tym pliku). Bez tego ikony renderuja sie jako goly tekst ligatury. */
  font-family: 'Material Symbols Outlined';
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
  line-height: 1;
  user-select: none;
  -webkit-user-select: none;
  font-feature-settings: 'liga';
  vertical-align: middle;
}

/* ---------- 3. Layout: App shell ----------
   Flexbox zamiast Grid — deterministyczne, mniej miejsca na rozjazd.
   Sidebar ma SZTYWNĄ szerokość, main wypełnia resztę. */
.app { display: flex; min-height: 100vh; }
.app > .main { flex: 1; min-width: 0; }

.nav-overlay {
  display: none;
  position: fixed; inset: 0;
  background: oklch(0.2 0.02 250 / 0.35);
  backdrop-filter: blur(2px);
  z-index: var(--z-nav-overlay);
}

/* UX: sidebar używa GLOBALNEGO stylu scrollbara (przezroczysty track +
   gradientowy thumb — sekcja "FAZA 3+4"). Wcześniejsze lokalne reguły
   rysowały szary rowek widoczny non-stop i szary pasek w Firefoksie —
   niespójnie z obszarem treści. */
.sidebar-top { display: flex; flex-direction: column; gap: 18px; }

.brand {
  display: flex; gap: 12px; padding: 8px 12px 4px;
  align-items: center;
}
.brand-text { flex: 1; min-width: 0; }

.nav-section { display: flex; flex-direction: column; gap: 2px; padding: 0 4px; }

/* Material 3 navigation drawer item */

.nav-ico {
  width: 22px; height: 22px;
  display: inline-grid; place-items: center;
  font-size: var(--fs-2xl); line-height: 1;
  flex-shrink: 0;
  color: var(--text-3);
  transition: color var(--motion-fast) var(--ease-std);
}

.nav-item:hover {
  background: var(--state-hover);
  color: var(--text);
}
.nav-item:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}

/* ---------- Kolorowe ikony nawigacji (Material You expressive) ----------
 * Każdy link ma data-color="X" → tonalny lookup. Lekka, ale wyrazista paleta.
 * Hover: ikona robi się ciemniejsza (większy kontrast). Active: bg pill w
 * pasującym tonal container, ikona w intensywnym kolorze + filled.
 */

.nav-item[data-color="amber"]  { --ico-c: oklch(0.68 0.16 80);  --ico-bg: oklch(0.94 0.06 80);  --ico-on: oklch(0.32 0.10 80);  }
.nav-item[data-color="blue"]   { --ico-c: oklch(0.58 0.17 260); --ico-bg: oklch(0.93 0.05 260); --ico-on: oklch(0.28 0.14 260); }
.nav-item[data-color="indigo"] { --ico-c: oklch(0.55 0.18 280); --ico-bg: oklch(0.93 0.05 280); --ico-on: oklch(0.28 0.14 280); }
.nav-item[data-color="green"]  { --ico-c: oklch(0.58 0.14 155); --ico-bg: oklch(0.93 0.06 155); --ico-on: oklch(0.30 0.12 155); }
.nav-item[data-color="purple"] { --ico-c: oklch(0.56 0.18 305); --ico-bg: oklch(0.93 0.05 305); --ico-on: oklch(0.30 0.14 305); }
.nav-item[data-color="teal"]   { --ico-c: oklch(0.58 0.13 195); --ico-bg: oklch(0.93 0.06 195); --ico-on: oklch(0.30 0.10 195); }
.nav-item[data-color="red"]    { --ico-c: oklch(0.60 0.18 25);  --ico-bg: oklch(0.94 0.05 25);  --ico-on: oklch(0.32 0.16 25);  }
.nav-item[data-color="orange"] { --ico-c: oklch(0.66 0.16 50);  --ico-bg: oklch(0.94 0.07 50);  --ico-on: oklch(0.32 0.12 50);  }
.nav-item[data-color="pink"]   { --ico-c: oklch(0.62 0.17 340); --ico-bg: oklch(0.94 0.05 340); --ico-on: oklch(0.30 0.14 340); }
.nav-item[data-color="coral"]  { --ico-c: oklch(0.62 0.18 35);  --ico-bg: oklch(0.94 0.06 35);  --ico-on: oklch(0.32 0.14 35);  }
.nav-item[data-color="gray"]   { --ico-c: oklch(0.55 0.01 255); --ico-bg: var(--surface-3);     --ico-on: oklch(0.30 0.01 255); }

/* Dark mode: rozjaśniamy tonalne kolory ikon, żeby kontrast trzymał */
html.dark .nav-item[data-color="amber"]  { --ico-c: oklch(0.80 0.14 80);  --ico-bg: oklch(0.32 0.08 80);  --ico-on: oklch(0.92 0.10 80);  }
html.dark .nav-item[data-color="blue"]   { --ico-c: oklch(0.80 0.13 260); --ico-bg: oklch(0.32 0.10 260); --ico-on: oklch(0.92 0.08 260); }
html.dark .nav-item[data-color="indigo"] { --ico-c: oklch(0.78 0.14 280); --ico-bg: oklch(0.32 0.10 280); --ico-on: oklch(0.92 0.08 280); }
html.dark .nav-item[data-color="green"]  { --ico-c: oklch(0.80 0.13 155); --ico-bg: oklch(0.30 0.09 155); --ico-on: oklch(0.92 0.08 155); }
html.dark .nav-item[data-color="purple"] { --ico-c: oklch(0.80 0.13 305); --ico-bg: oklch(0.32 0.10 305); --ico-on: oklch(0.92 0.08 305); }
html.dark .nav-item[data-color="teal"]   { --ico-c: oklch(0.80 0.12 195); --ico-bg: oklch(0.30 0.09 195); --ico-on: oklch(0.92 0.08 195); }
html.dark .nav-item[data-color="red"]    { --ico-c: oklch(0.80 0.13 25);  --ico-bg: oklch(0.32 0.10 25);  --ico-on: oklch(0.92 0.10 25);  }
html.dark .nav-item[data-color="orange"] { --ico-c: oklch(0.82 0.13 50);  --ico-bg: oklch(0.32 0.10 50);  --ico-on: oklch(0.92 0.10 50);  }
html.dark .nav-item[data-color="pink"]   { --ico-c: oklch(0.80 0.13 340); --ico-bg: oklch(0.32 0.10 340); --ico-on: oklch(0.92 0.10 340); }
html.dark .nav-item[data-color="coral"]  { --ico-c: oklch(0.80 0.14 35);  --ico-bg: oklch(0.32 0.10 35);  --ico-on: oklch(0.92 0.10 35);  }
.sidebar-foot .who { flex: 1; min-width: 0; }
.avatar {
  width: 36px; height: 36px; border-radius: var(--shape-full);
  background: linear-gradient(135deg, var(--primary), oklch(0.55 0.17 290));
  color: var(--on-primary); display: grid; place-items: center;
  font-weight: var(--fw-semibold); font-size: var(--fs-base);
  flex-shrink: 0;
  box-shadow: var(--elev-1);
}
.who-name { font-weight: var(--fw-medium); line-height: var(--lh-tight); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); }
.who-role { color: var(--text-3); font-size: var(--fs-xs); margin-top: 1px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---------- Topbar (Google-search inspired) ---------- */
.main { display: flex; flex-direction: column; min-width: 0; }

/* nav-toggle: ukryty na desktopie, pokazywany w breakpoincie mobile (poniżej). bo `.icon-btn` (zdefiniowany niżej w pliku) ma `display: inline-grid` o tej samej specyficzności. */
.icon-btn.nav-toggle { display: none; }



/* Gutter strony jako token --page-gutter (deklaracja w bloku :root niżej,
   nadpisania w breakpointach). Paski pełnej szerokości (.stats, .filters)
   wychodzą poza margines ujemnym marginesem, więc MUSZĄ znać jego aktualną
   wartość - inaczej wystają poza ekran. Dokładnie to złapał skan mobile:
   przy <=480px gutter to 12px, a paski trzymały zaszyte 14px i robiły 394px
   na ekranie 390px. */
.page { padding: 28px var(--page-gutter) 80px; max-width: 1400px; width: 100%; }

.page-title-row { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; }

.page-sub   { color: var(--text-3); font-size: var(--fs-base); margin-top: 4px; }
.page-actions { display: flex; gap: 8px; flex-shrink: 0; align-items: center; }

/* ---------- 4. Komponenty — Material 3 ---------- */

/* ---------- Buttons ---------- *
 * Warianty M3:
 *   .btn               — Outlined (domyślny: border + bg surface)
 *   .btn.accent        — Filled (primary background, biały tekst)
 *   .btn.tonal         — Filled tonal (primary-container background)
 *   .btn.text          — Text only (bez bg, bez bordera)
 *   .btn.danger        — Outlined w kolorze error
 *   .btn-sm            — kompaktowy
 *   .btn.block         — full-width
 *
 * Każdy ma state layer (overlay) na hover/focus/active dla M3 feel.
 */

.btn::before {
  content: ''; position: absolute; inset: 0;
  background: currentColor;
  opacity: 0;
  transition: opacity var(--motion-fast) var(--ease-std);
  pointer-events: none;
  z-index: -1;
}
.btn:hover::before          { opacity: 0.06; }
/* N-4: outline celowo NIE jest zerowany — globalna reguła focus-visible (2px
   var(--primary), niżej w pliku) obowiązuje też przyciski. Nakładka ::before
   to tylko dodatkowy akcent. */
.btn:focus-visible::before  { opacity: 0.10; }
.btn:active::before         { opacity: 0.14; }

.btn .material-symbols-outlined {
  font-size: var(--fs-xl);
  font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 20;
}

/* Filled — Google blue */

.btn.accent:active { box-shadow: var(--elev-0); }

/* Filled tonal — light primary tint */
.btn.tonal {
  background: var(--primary-container);
  color: var(--on-primary-container);
  border-color: transparent;
}

/* Text — minimal */
.btn.text {
  background: transparent;
  border-color: transparent;
  padding: 0 12px;
}

/* Danger — outlined error */
.btn.danger {
  color: var(--c-rej);
  border-color: var(--c-rej);
  background: var(--surface);
}
.btn.danger:hover { background: var(--c-rej-bg); }

/* Block — full width pill */
.btn.block  { width: 100%; height: 44px; font-size: var(--fs-md); }
.btn-sm     { padding: 0 12px; height: 30px; font-size: var(--fs-sm); gap: 6px; }
.btn-sm .material-symbols-outlined { font-size: var(--fs-lg); }

/* Icon button — okrągły IconButton z M3 */

.icon-btn::before {
  content: ''; position: absolute; inset: 0;
  background: currentColor; border-radius: inherit;
  opacity: 0; transition: opacity var(--motion-fast) var(--ease-std);
  pointer-events: none;
}
.icon-btn:hover { color: var(--text); }
.icon-btn:hover::before  { opacity: 0.08; }
.icon-btn:active::before { opacity: 0.14; }
.icon-btn .material-symbols-outlined {
  font-size: var(--fs-2xl);
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
}

/* ---------- Stats — Material 3 filled cards ---------- */
.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-bottom: 24px; }
.stat {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-md);
  padding: 18px 20px;
  display: flex; flex-direction: column; gap: 8px;
  cursor: pointer;
  transition: background var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std),
              box-shadow var(--motion-fast) var(--ease-std),
              transform var(--motion-fast) var(--ease-std);
  overflow: hidden;
  isolation: isolate;
}
.stat::before {
  content: ''; position: absolute; inset: 0;
  background: var(--primary);
  opacity: 0;
  transition: opacity var(--motion-fast) var(--ease-std);
  pointer-events: none;
  z-index: -1;
}
.stat:hover {
  border-color: var(--outline);
  box-shadow: var(--elev-1);
}
.stat:hover::before { opacity: 0.03; }
.stat.selected {
  background: var(--primary-container);
  border-color: var(--primary);
  box-shadow: var(--elev-1);
}
.stat.selected .stat-label,
.stat.selected .stat-value { color: var(--on-primary-container); }
.stat-label     {
  font-size: var(--fs-xs); color: var(--text-3);
  text-transform: uppercase; letter-spacing: var(--ls-caps);
  font-weight: var(--fw-bold); display: flex; gap: 8px; align-items: center;
}
.stat-dot       {
  width: 8px; height: 8px; border-radius: var(--shape-full);
  display: inline-block; flex-shrink: 0;
}
.stat-dot.gray,   .gray   { background: oklch(0.62 0.01 255); }
.stat-dot.blue,   .blue   { background: var(--primary); }
.stat-dot.green,  .green  { background: oklch(0.54 0.15 155); }
.stat-dot.yellow, .yellow { background: oklch(0.76 0.14 82);  }
.stat-dot.red,    .red    { background: oklch(0.58 0.18 25);  }
.stat-dot.purple, .purple { background: oklch(0.54 0.16 295); }
.stat-dot.pink,   .pink   { background: oklch(0.64 0.16 345); }
.stat-dot.orange, .orange { background: oklch(0.68 0.15 52);  }
.c-new          { background: var(--c-new); }
.c-prog         { background: var(--c-prog); }
.c-ok           { background: var(--c-ok); }
.c-rej          { background: var(--c-rej); }
/* KV-APP-KPI (08.10): ten sam styl co .kpi-value (rozmiar z tokenów, 900, ciasne
   światło) - jedna skala liczb KPI w całym panelu. */
.stat-value     {
  font-size: var(--fs-3xl); font-weight: var(--fw-black); letter-spacing: -0.035em;
  line-height: 1.05; color: var(--text);
}
.stat-delta     { font-size: var(--fs-sm); color: var(--text-3); }  /* v3: jedna rodzina pisma */

/* ---------- Toolbar: search + filtry ---------- */
.toolbar {
  display: flex; gap: 10px; align-items: center; margin-bottom: 14px;
  flex-wrap: wrap;
}
/* KV-APP-AUDYT (08.10): filtry w pasku mają naturalną szerokość. `.select`
   ma globalnie width 100%, więc w .toolbar/.filters każdy select zajmował
   osobny wiersz (Dziennik zdarzeń, Użytkownicy, Rachunki). Telefon: pełna
   szerokość jak dotąd (reguła w bloku <=600px). */
.toolbar > .select, .filters > .select { width: auto; flex: 0 1 220px; min-width: 160px; }
.toolbar > .input, .filters > .input { width: auto; flex: 1 1 220px; }
/* Godziny i krótkie daty w wąskich kolumnach list (pulpit korepetytora, plan):
   przy Montserracie (szerszym od Intera) „14:00" w 36px łamało się na „14:0 / 0". */
.mono.pz-w-40 { width: auto; min-width: 44px; white-space: nowrap; flex: none; }
.search {
  flex: 1; min-width: 240px;
  position: relative;
  display: flex; align-items: center;
}
.search-icon {
  position: absolute; left: 14px; color: var(--text-3); pointer-events: none;
  font-size: var(--fs-xl); display: inline-flex;
}
.search-icon.material-symbols-outlined {
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 20;
}
.search-input {
  width: 100%; background: var(--surface-2);
  border: 1px solid transparent;
  border-radius: var(--shape-full);
  padding: 10px 16px 10px 42px; font-size: var(--fs-md); outline: none;
  height: 44px;
  transition: background var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std),
              box-shadow var(--motion-fast) var(--ease-std);
}
.search-input:hover  { background: var(--surface-3); }
.search-input:focus  {
  background: var(--surface);
  border-color: var(--primary);
  box-shadow: 0 0 0 3px var(--state-focus-primary);
}
.search-input::-webkit-search-cancel-button { cursor: pointer; }

.filters-popover { position: relative; }
.filters-popover summary { list-style: none; display: inline-flex; }
.filters-popover summary::-webkit-details-marker { display: none; }
.filters-popover .badge {
  background: var(--primary); color: var(--on-primary);
  font-size: var(--fs-xs); padding: 1px 7px; border-radius: var(--shape-full);
  font-weight: var(--fw-semibold); margin-left: 4px;
}
.popover {
  position: absolute; right: 0; top: calc(100% + 8px);
  width: 480px; max-width: 92vw;
  background: var(--surface); border: 1px solid var(--outline-variant);
  border-radius: var(--shape-md); box-shadow: var(--elev-3);
  padding: 18px; z-index: var(--z-popover);
}
.filter-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 14px;
}
.popover-foot {
  display: flex; gap: 8px; justify-content: flex-end; margin-top: 14px;
  padding-top: 14px; border-top: 1px solid var(--outline-variant);
}

/* ---------- Filter chips — Material 3 ---------- */
.filters { display: flex; gap: 8px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
.chip {
  position: relative;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 0 14px; height: 34px;
  border: 1px solid var(--border-strong);
  border-radius: var(--shape-full);
  background: var(--surface);
  color: var(--text-2); font-size: var(--fs-base); font-weight: var(--fw-semibold);
  cursor: pointer;
  transition: background var(--motion-fast) var(--ease-std),
              color var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std);
  overflow: hidden;
}
.chip::before {
  content: ''; position: absolute; inset: 0;
  background: currentColor; opacity: 0;
  transition: opacity var(--motion-fast) var(--ease-std);
  pointer-events: none;
}
.chip:hover::before  { opacity: 0.06; }
.chip:active::before { opacity: 0.12; }
.chip:hover  { color: var(--text); border-color: var(--border-strong); }
/* Wybrany filtr: pełny niebieski z cieniem (KV-APP 08.10; strona ma tu gradient
   do #1E74EE, ale biały na jego końcu ma 4,39:1 - zostaje pełny kolor). */
.chip.active {
  background: var(--primary);
  color: var(--on-primary);
  border-color: transparent;
  box-shadow: var(--shadow-xs);
}
.chip.active .count { opacity: 0.9; }
.chip.active .material-symbols-outlined { font-variation-settings: 'FILL' 1, 'wght' 500; }
.chip .count { font-family: inherit; font-size: var(--fs-xs); opacity: 0.7; }
.chip .material-symbols-outlined {
  font-size: var(--fs-xl);
  font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 20;
}

/* ---------- Dropdown (eksport, menus) ---------- */
.dropdown { position: relative; }
.dropdown-menu {
  display: none;
  position: absolute; right: 0; top: calc(100% + 6px);
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-sm);
  box-shadow: var(--elev-2);
  min-width: 200px; z-index: var(--z-popover);
  padding: 6px;
}
.dropdown.open .dropdown-menu { display: block; }
.dropdown-item {
  position: relative;
  display: flex; align-items: center; gap: 10px;
  padding: 8px 12px;
  font-size: var(--fs-base); color: var(--text);
  border-radius: var(--shape-xs);
  text-decoration: none;
  cursor: pointer;
}
.dropdown-item::before {
  content: ''; position: absolute; inset: 0;
  background: currentColor; opacity: 0;
  transition: opacity var(--motion-fast) var(--ease-std);
  border-radius: inherit;
  pointer-events: none;
}
.dropdown-item:hover::before { opacity: 0.06; }

/* ---------- Table — Material 3 data table ---------- */
.tbl-wrap {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--shape-lg);
  box-shadow: var(--shadow-card);
  /* KV-APP-AUDYT-2: przewijanie w poziomie zamiast ucinania ostatnich kolumn
     (Data, Ocena) przy węższym desktopie; telefon ma karty (blok <=900px). */
  overflow-x: auto;
}
table.leads { width: 100%; border-collapse: collapse; font-size: var(--fs-base); }
.pz-order-list { list-style: none; margin: 0 0 8px; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.pz-order-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border: 1px solid var(--border); border-radius: var(--shape-sm); background: var(--surface-1); }
.pz-order-item .pz-order-title { flex: 1; min-width: 0; font-size: var(--fs-base); }
/* TP-DND: uchwyt przeciągania listy kolejności. Świadomie NIE `.drag-handle`
   — tamten jest chowany na telefonie (karty lekcji są za duże na gest), a ta
   lista jest płaska i przeciąganie palcem ma na niej sens. */
.pz-order-handle { cursor: grab; color: var(--text-3); font-size: var(--fs-base); line-height: 1;
                   padding: 4px 2px; touch-action: none; user-select: none; }
.pz-order-handle:active { cursor: grabbing; }
.pz-order-ghost { opacity: 0.5; background: var(--surface-2); }
table.leads th {
  text-align: left;
  background: var(--surface-1);
  border-bottom: 1px solid var(--outline-variant);
  padding: 12px 16px;
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  color: var(--text-3);
  text-transform: uppercase; letter-spacing: 0.08em;
  white-space: nowrap;
}
table.leads td {
  padding: 14px 16px;
  border-bottom: 1px solid var(--outline-variant);
  vertical-align: middle;
}
table.leads tr.row:last-child td { border-bottom: none; }
table.leads tr.row {
  cursor: pointer;
  transition: background var(--motion-fast) var(--ease-std);
}
table.leads tr.row:hover { background: var(--state-hover); }
.col-actions  { width: 48px; text-align: right; }

.who-cell    { display: flex; align-items: center; gap: 10px; }
.who-avatar  {
  width: 28px; height: 28px; border-radius: var(--shape-full);
  background: var(--surface-2); border: 1px solid var(--border);
  display: grid; place-items: center; font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  color: var(--text-2);
  flex-shrink: 0;
}
.who-avatar.lg { width: 44px; height: 44px; font-size: var(--fs-md); }
.who-name-row { font-weight: var(--fw-medium); }
.who-extra    { color: var(--text-3); font-size: var(--fs-xs); }
td.contact    { font-family: inherit; font-size: var(--fs-sm); color: var(--text-2); }
td.contact a  { color: inherit; }
td.contact a:hover { color: var(--text); text-decoration: underline; }
td.contact .em{ display: block; color: var(--text-3); font-size: var(--fs-xs); }
td.subj .lvl  { color: var(--text-3); font-size: var(--fs-xs); display: block; margin-top: 1px; }
td.date       { white-space: nowrap; color: var(--text-2); font-size: var(--fs-sm); }

.who-mini { display: inline-flex; align-items: center; gap: 6px; }
.mini-avatar {
  width: 22px; height: 22px; border-radius: var(--shape-full);
  background: linear-gradient(135deg, oklch(0.78 0.08 258), oklch(0.62 0.12 290));
  color: white; display: grid; place-items: center;
  font-size: var(--fs-2xs); font-weight: var(--fw-semibold);
}
.mini-name { font-size: var(--fs-sm); }

/* ---------- Tagi (kolorowe) ---------- */
.tag {
  display: inline-flex; align-items: center;
  padding: 3px 10px; border-radius: var(--shape-full);
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  margin: 1px 2px 1px 0;
  white-space: nowrap; overflow-wrap: normal;
}
.tag-slate  { background: oklch(0.94 0.005 255); color: oklch(0.42 0.02 255); }
.tag-blue   { background: oklch(0.94 0.04 258); color: oklch(0.42 0.16 258); }
.tag-green  { background: oklch(0.94 0.05 155); color: oklch(0.4 0.13 155); }
.tag-amber  { background: oklch(0.94 0.06 75);  color: oklch(0.48 0.14 75); }
.tag-red    { background: oklch(0.94 0.04 25);  color: oklch(0.5 0.17 25); }
.tag-violet { background: oklch(0.94 0.04 295); color: oklch(0.46 0.16 295); }
.tag-pink   { background: oklch(0.94 0.04 350); color: oklch(0.5 0.16 350); }
.tag-teal   { background: oklch(0.94 0.04 195); color: oklch(0.46 0.12 195); }
.tag-row { display: flex; flex-wrap: wrap; gap: 4px; }

/* ---------- Status badge / select — Material 3 chips ---------- */
.badge {
  display: inline-flex; align-items: center;
  padding: 3px 10px; border-radius: var(--shape-full);
  font-size: var(--fs-xs); font-weight: var(--fw-bold);
  letter-spacing: 0.02em;
}
.st-new  { background: var(--c-new-bg);  color: var(--c-new); }
.st-prog { background: var(--c-prog-bg); color: var(--c-prog); }
.st-ok   { background: var(--c-ok-bg);   color: var(--c-ok); }
.st-rej  { background: var(--c-rej-bg);  color: var(--c-rej); }
/* 14.09: próbna „nie przyszedł"/„odwołana" miała klasę bez reguły (goła plakietka) */
.st-off  { background: var(--surface-2); color: var(--text-3); box-shadow: inset 0 0 0 1px var(--border); }

.status-form  { margin: 0; }
.status-select {
  appearance: none; -webkit-appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' stroke='currentColor' stroke-width='1.6' fill='none' stroke-linecap='round'/></svg>");
  background-position: right 10px center;
  background-repeat: no-repeat;
  background-size: 10px;
  padding: 5px 26px 5px 12px;
  border-radius: var(--shape-full); border: 1px solid transparent;
  font-size: var(--fs-sm); font-weight: var(--fw-medium); cursor: pointer;
  min-height: 28px;
  transition: filter var(--motion-fast) var(--ease-std);
}
.status-select:hover { filter: brightness(0.97); }
html.dark .status-select:hover { filter: brightness(1.1); }
/* KV-APP-AUDYT-2: status jako pigułka w kolorze statusu, bez paska z lewej
   (na zaokrąglonej pigułce wyglądał jak urwany nawias). */
.status-select.status-new  { background-color: var(--c-new-bg);  color: var(--c-new); }
.status-select.status-prog { background-color: var(--c-prog-bg); color: var(--c-prog); }
.status-select.status-ok   { background-color: var(--c-ok-bg);   color: var(--c-ok); }
.status-select.status-rej  { background-color: var(--c-rej-bg);  color: var(--c-rej); }
select.status-select, select.status-select:hover { border: 1px solid transparent; font-weight: var(--fw-semibold); }
select.status-select:focus { border-color: currentColor; }

/* ---------- Empty ---------- */
.empty { padding: 40px 24px; text-align: center; color: var(--text-3); }

.empty-body  { font-size: var(--fs-base); max-width: 360px; margin: 0 auto 14px; }

/* ---------- Modal — Material 3 dialog ----------
   WAŻNE: <dialog> jest domyślnie display:none.
   `display: flex` MUSI iść tylko gdy modal jest faktycznie otwarty.
*/

.modal[open] {
  display: flex; flex-direction: column;
  animation: m3-dialog-enter var(--motion-std) var(--ease-emph);
}
.modal::backdrop {
  background: oklch(0.10 0.02 250 / 0.40);
  backdrop-filter: blur(2px);
}
@keyframes m3-dialog-enter {
  from { opacity: 0; transform: scale(0.96) translateY(8px); }
  to   { opacity: 1; transform: scale(1) translateY(0); }
}
.modal-head {
  padding: 24px 28px 16px; border-bottom: 1px solid var(--outline-variant);
  display: flex; justify-content: space-between; align-items: center;
  flex-shrink: 0;
}
.drawer-title { font-size: var(--fs-xl); font-weight: var(--fw-semibold); letter-spacing: -0.015em; }
.drawer-sub   { font-size: var(--fs-base); color: var(--text-3); margin-top: 3px; }
.modal-body   { padding: 20px 28px 8px; flex: 1; overflow-y: auto; }
.modal-foot   {
  padding: 16px 24px;
  border-top: 1px solid var(--outline-variant);
  display: flex; justify-content: flex-end; gap: 8px;
  background: var(--surface);
  flex-shrink: 0;
}
.modal-form   { margin: 0; display: flex; flex-direction: column; max-height: 100%; flex: 1; min-height: 0; }
.modal-form .modal-body { flex: 1; }

.field        { display: flex; flex-direction: column; gap: 6px; margin-bottom: 16px; }
.field-label  { font-size: var(--fs-base); color: var(--text); font-weight: var(--fw-semibold); }
.field-label .req { color: var(--c-rej); }
.field-row    { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.input, .textarea, .select {
  width: 100%; background: var(--surface-2);
  border: 1px solid transparent;
  border-radius: var(--shape-sm);
  padding: 11px 14px; font-size: var(--fs-md); outline: none;
  min-height: 44px;
  color: var(--text);
  transition: background var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std),
              box-shadow var(--motion-fast) var(--ease-std);
}
.input:hover, .textarea:hover, .select:hover { background: var(--surface-3); }
.input:focus, .textarea:focus, .select:focus {
  background: var(--surface);
  border-color: var(--primary);
  box-shadow: 0 0 0 3px var(--state-focus-primary);
}
.textarea { resize: vertical; min-height: 92px; }

/* RODO collapsible */
.rodo-body { padding-top: 8px; }

/* Duplicate modal cards */
.dup-card {
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  padding: 10px 12px; margin-bottom: 8px;
  display: flex; flex-direction: column; gap: 4px;
}
.dup-card .btn-sm { align-self: flex-start; margin-top: 4px; }
.dup-name { font-weight: var(--fw-medium); display: flex; gap: 8px; align-items: center; }
.dup-meta { font-size: var(--fs-sm); color: var(--text-2); }

/* ============================================================
   DRAWER (z prawej) — Material 3 modal side sheet
   ============================================================ */
.drawer {
  position: fixed; top: 0; right: 0;
  width: var(--drawer-w); max-width: 96vw;
  height: 100dvh;
  background: var(--surface);
  border-left: 1px solid var(--outline-variant);
  box-shadow: var(--shadow-drawer);
  z-index: var(--z-drawer);
  display: flex; flex-direction: column;
  transform: translateX(100%);
  transition: transform var(--motion-std) var(--ease-emph);
}
.drawer-open .drawer { transform: translateX(0); }
.drawer-open .nav-overlay { display: block; z-index: calc(var(--z-drawer) - 1); }

.drawer-head-l { display: flex; gap: 12px; align-items: center; min-width: 0; }
.drawer-head-r { display: flex; gap: 8px; align-items: center; flex-shrink: 0; }
.drawer-body {
  flex: 1; overflow-y: auto; padding: 20px 24px;
  display: flex; flex-direction: column; gap: 16px;
}
.drawer-foot {
  padding: 16px 24px;
  border-top: 1px solid var(--outline-variant);
  display: flex; gap: 8px; justify-content: flex-end;
  background: var(--surface);
  flex-shrink: 0;
}

.drawer-quick {
  display: flex; gap: 8px; flex-wrap: wrap;
}

.dr-section {
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-md);
  padding: 14px 16px;
  background: var(--surface-1);
}
.dr-section-label {
  font-size: var(--fs-xs); color: var(--text-3); text-transform: uppercase;
  letter-spacing: 0.06em; font-weight: var(--fw-medium); margin-bottom: 10px;
}
.dr-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 10px 18px;
}

.dr-value { font-size: var(--fs-base); color: var(--text); word-break: break-word; }
.dr-value a:hover { text-decoration: underline; color: var(--accent); }
.dr-notes {
  font-size: var(--fs-base); color: var(--text); white-space: pre-wrap;
  background: var(--surface-2); border-radius: var(--radius-sm);
  padding: 10px 12px; line-height: 1.55;
}

/* .dr-rodo / .dr-danger: kolory na tokenach w sekcji KV-APP-RESZTKI (koniec pliku). */
.danger-row { display: flex; gap: 8px; flex-wrap: wrap; }

/* Komentarze (timeline) */
.comment-form {
  display: flex; flex-direction: column; gap: 8px;
  margin-bottom: 14px;
}
.timeline { display: flex; flex-direction: column; gap: 14px; }
.timeline-item { display: flex; gap: 10px; align-items: flex-start; }
.timeline-avatar {
  width: 28px; height: 28px; border-radius: var(--shape-full);
  background: var(--surface-2); border: 1px solid var(--border);
  display: grid; place-items: center;
  font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2);
  flex-shrink: 0;
}
.timeline-body { flex: 1; min-width: 0; }
.timeline-meta { font-size: var(--fs-sm); color: var(--text-2); display: flex; align-items: center; gap: 4px; }
.timeline-meta strong { color: var(--text); font-weight: var(--fw-medium); }
.timeline-text {
  font-size: var(--fs-base); margin-top: 4px; line-height: var(--lh-base);
  white-space: pre-wrap;
}

/* ---------- Logo na stronie logowania ---------- */
.login-brand img.brand-mark { width: 40px; height: 40px; }
/* KV-APP 08.10: tło logowania jak hero strony - dwie poświaty (niebieska, cyjanowa)
   i kratka „zeszytu" wygaszana maską. Kratka siedzi w ::before pod kartą, więc
   nigdy nie stoi za tekstem formularza (karta ma pełne białe tło). */
.login-wrap { position: relative; isolation: isolate; min-height: 100vh; display: grid; place-items: center;
  background: var(--g-glow-light), var(--bg); padding: 24px; }
.login-wrap::before { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background-image: linear-gradient(var(--grid-line) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
  background-size: 48px 48px;
  mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, black 30%, transparent 80%);
  -webkit-mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, black 30%, transparent 80%); }

.login-brand { display: flex; gap: 12px; margin-bottom: 24px; align-items: center; }
.login-title { margin: 0 0 6px; font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: var(--ls-display); line-height: 1.15; text-wrap: balance; }
.login-sub   { margin: 0 0 22px; color: var(--text-3); font-size: var(--fs-base); }
.login-form  { display: flex; flex-direction: column; gap: 4px; }
.login-foot  { margin: 22px 0 0; font-size: var(--fs-xs); color: var(--text-3); text-align: center; line-height: 1.6; }
/* Strony prawne (/regulamin, /polityka-prywatnosci): karta logowania, ale
   szersza i z typografią dokumentu - to tekst do czytania, nie formularz. */
/* REGULAMIN-SZEROKOSC (12.10): `.login-card` (400 px) stoi niżej w pliku i nadpisywał
   760 px - dokument był wąski jak formularz logowania. Para klas wygrywa. */
.login-card.legal-card { max-width: 960px; padding: 28px 20px; }
@media (min-width: 700px) { .login-card.legal-card { padding: 44px 56px; } }
.legal-seller { display: grid; grid-template-columns: 1fr; gap: 2px 18px; margin: 0 0 20px; padding: 14px 16px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface-2); font-size: var(--fs-sm); }
.legal-seller dt { color: var(--text-3); margin-top: 6px; }
.legal-seller dd { margin: 0; overflow-wrap: anywhere; }
@media (min-width: 600px) { .legal-seller { grid-template-columns: 120px minmax(0, 1fr); } .legal-seller dt { margin-top: 0; } }
.legal-nav  { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; font-size: var(--fs-sm); color: var(--text-3); }
.legal-meta { margin: 0 0 18px; color: var(--text-3); font-size: var(--fs-sm); }
.legal-doc  { font-size: var(--fs-base); line-height: 1.7; }
.legal-doc h2 { margin: 22px 0 8px; font-size: var(--fs-md); font-weight: var(--fw-semibold); }
.legal-doc p  { margin: 0 0 10px; }
.legal-doc ul, .legal-doc ol { margin: 0 0 12px; padding-left: 22px; }
.legal-doc li { margin-bottom: 6px; }
.login-forgot { margin: 12px 0 0; text-align: center; font-size: var(--fs-base); }

.alert {
  background: var(--c-rej-bg); color: var(--c-rej);
  border: 1px solid oklch(0.85 0.05 25 / 0.5);
  padding: 12px 16px; border-radius: var(--shape-sm);
  font-size: var(--fs-base); margin-bottom: 14px;
}
.alert.alert-ok { background: var(--c-ok-bg); color: var(--c-ok); border-color: oklch(0.85 0.07 155 / 0.6); }

/* ---------- Form card (admin) ---------- */
.form-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden;
  max-width: 640px;
}
.form-card .modal-form { width: 100%; }

/* ---------- Role badges ---------- */
.role-admin { background: oklch(0.94 0.04 295); color: oklch(0.42 0.16 295); }
.role-tutor { background: var(--c-new-bg);  color: var(--c-new); }
.role-staff { background: var(--c-ok-bg);   color: var(--c-ok); }

/* ---------- Audit log table ---------- */
.audit-tbl { font-size: var(--fs-sm); }
.audit-tbl code {
  font-size: var(--fs-xs); background: var(--surface-2);
  padding: 2px 6px; border-radius: 4px;
}
.audit-diff summary { cursor: pointer; font-size: var(--fs-sm); color: var(--accent); }
.audit-diff[open] summary { margin-bottom: 6px; }
.audit-diff pre {
  background: var(--surface-2); padding: 8px 10px;
  border-radius: var(--shape-xs); font-size: var(--fs-xs);
  max-width: 480px; max-height: 300px;
  overflow: auto; margin: 0;
}

/* ============================================================
   KANBAN — Material 3 vibe
   ============================================================ */
.kanban-board {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px;
  margin-bottom: 40px;
  min-height: 60vh;
}
.kanban-col {
  background: var(--surface-2);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-lg);
  display: flex; flex-direction: column;
  min-height: 200px;
}
.kanban-col-head {
  padding: 12px 14px;
  border-bottom: 1px solid var(--outline-variant);
  background: var(--surface);
  border-radius: var(--shape-lg) var(--shape-lg) 0 0;
  display: flex; align-items: center; gap: 8px;
}
.kanban-col-label { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; }
.kanban-col-name { font-weight: var(--fw-semibold); font-size: var(--fs-base); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kanban-col-count {
  margin-left: auto;
  font-family: inherit;
  font-size: var(--fs-xs); color: var(--text-3);
  background: var(--surface-2);
  padding: 1px 7px; border-radius: var(--shape-full);
}

.kanban-card:active { cursor: grabbing; transform: scale(0.99); }
.kanban-card-head { display: flex; align-items: center; gap: 8px; }

.kanban-card-meta { font-size: var(--fs-xs); color: var(--text-3); }
.kanban-card-tags { display: flex; flex-wrap: wrap; gap: 3px; }
.kanban-card-foot {
  display: flex; align-items: center; justify-content: space-between;
  margin-top: 2px; padding-top: 6px;
  border-top: 1px dashed var(--border);
}
/* Drag states (Sortable.js) */

.kanban-drag {
  box-shadow: var(--shadow-3);
  transform: rotate(1deg);
}

/* ============================================================
   ZAŁĄCZNIKI
   ============================================================ */
.attach-form { margin-bottom: 10px; }
.attach-drop {
  display: block;
  border: 1.5px dashed var(--outline);
  border-radius: var(--shape-md);
  padding: 20px;
  text-align: center;
  cursor: pointer;
  transition: border-color var(--motion-fast) var(--ease-std),
              background var(--motion-fast) var(--ease-std);
  background: var(--surface-2);
}
.attach-drop:hover {
  border-color: var(--primary);
  background: var(--primary-container);
}
.attach-drop input[type="file"] {
  display: none;
}
.attach-drop-text strong {
  display: block; font-size: var(--fs-base); color: var(--text);
}
.attach-drop-text span {
  display: block; font-size: var(--fs-xs); margin-top: 2px;
}

.attach-list { display: flex; flex-direction: column; gap: 6px; }
.attach-item {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 10px;
  background: var(--surface-2);
  border-radius: var(--radius-sm);
}
.attach-ico { font-size: var(--fs-2xl); flex-shrink: 0; }
.attach-meta { flex: 1; min-width: 0; }
.attach-name {
  font-size: var(--fs-base); font-weight: var(--fw-medium);
  display: block;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.attach-name:hover { color: var(--accent); text-decoration: underline; }
.attach-sub { font-size: var(--fs-xs); }

/* ============================================================
   BOTTOM NAV + FAB (mobile) — Material 3 navigation bar
   ============================================================ */

.bnav-item {
  flex: 1 1 0;
  min-width: 0;
  max-width: 25%;                          /* hard-cap: max 5 itemów = po 20% */
  box-sizing: border-box;
  display: flex; flex-direction: column; align-items: center; justify-content: flex-start;
  gap: 2px;
  background: none; border: none;
  color: var(--text-2); font-size: var(--fs-2xs); font-weight: var(--fw-semibold);
  text-decoration: none; cursor: pointer;
  padding: 4px 2px 2px;
  position: relative;
  transition: color var(--motion-fast) var(--ease-std),
              transform var(--motion-fast) var(--ease-std);
}
.bnav-item .bnav-ico {
  font-size: 24px; line-height: 1;
  width: 56px; height: 32px;               /* Material 3 selection indicator pill */
  max-width: 100%;
  display: inline-grid; place-items: center;
  border-radius: var(--shape-full);
  flex-shrink: 0;
  transition: background var(--motion-std) var(--ease-emph);
}
.bnav-item .bnav-ico.material-symbols-outlined {
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
  transition: font-variation-settings var(--motion-std) var(--ease-emph),
              background var(--motion-std) var(--ease-emph);
}
.bnav-item .bnav-label {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%;
  line-height: var(--lh-tight);
}
.bnav-item.active { color: var(--on-primary-container); }
.bnav-item.active .bnav-ico { background: var(--primary-container); }
.bnav-item.active .bnav-ico.material-symbols-outlined {
  font-variation-settings: 'FILL' 1, 'wght' 500, 'GRAD' 0, 'opsz' 24;
}
.bnav-item:active { transform: scale(0.94); }

/* NAV-PASEK (15.10): środkowa pozycja („Szukaj" / „Dodaj") wygląda jak pozostałe -
   dawne kółko 44-52 px wyglądało w ciemnym motywie jak jasnoniebieska plama, a podpisy
   reszty paska były ucinane. „Dodaj" (listy kadry z modalem) ma pigułkę z obwódką,
   żeby główna akcja strony nie zginęła i nie myliła się z aktywną pozycją (wypełniona). */
.bnav-fab--add { color: var(--primary); }
.bnav-fab--add .bnav-ico { box-shadow: inset 0 0 0 1.5px var(--primary); }


/* ============================================================
   TOAST
   ============================================================ */

html.dark .toast { background: oklch(0.88 0.005 255); color: oklch(0.20 0.012 255); }
.toast.visible { opacity: 1; transform: translate(-50%, 0); }

/* Warianty: success / error — kolorowy lewy pasek + ikona przez ::before */
.toast-success,
.toast-error {
  display: inline-flex; align-items: center; gap: 10px;
  padding-left: 16px;
  border-left: 4px solid var(--c-ok);
}
.toast-error   { border-left-color: var(--c-rej); }
.toast-success::before,
.toast-error::before {
  font-family: 'Material Symbols Outlined';
  font-size: var(--fs-xl); line-height: 1;
  font-variation-settings: 'FILL' 1, 'wght' 500, 'GRAD' 0, 'opsz' 24;
  flex-shrink: 0;
}
.toast-error::before   { content: 'error';        color: var(--c-rej); }
html.dark .toast-error::before   { color: oklch(0.72 0.16 25); }

/* ============================================================
   KBD — klawisze + okno pomocy skrótów
   ============================================================ */
kbd {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; height: 22px; padding: 0 6px;
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-bottom-width: 2px;
  border-radius: var(--shape-xs);
  font: 500 11.5px/1 ui-monospace, 'SF Mono', Consolas, monospace;
  color: var(--text);
  box-shadow: 0 1px 0 oklch(0 0 0 / 0.04);
}
html.dark kbd {
  background: oklch(0.24 0.012 255);
  border-color: oklch(0.32 0.012 255);
}
.kbd-section { margin-bottom: 18px; }
.kbd-section:last-child { margin-bottom: 0; }
.kbd-section-title {
  font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--text-3);
  margin-bottom: 8px;
}
.kbd-row {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 0;
  border-bottom: 1px solid var(--outline-variant);
  font-size: var(--fs-base);
}
.kbd-row:last-child { border-bottom: none; }
.kbd-row span { color: var(--text-2); margin-left: 4px; }

/* ============================================================
   PULL-TO-REFRESH indicator
   ============================================================ */
.ptr-indicator {
  position: fixed; top: -60px; left: 50%;
  transform: translateX(-50%);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--shape-full);
  padding: 8px 16px;
  font-size: var(--fs-sm); font-weight: var(--fw-medium);
  color: var(--text-2);
  box-shadow: var(--shadow-2);
  z-index: var(--z-toast);
  pointer-events: none;
  transition: opacity 0.2s ease;
}

/* ============================================================
   Voice recording state
   ============================================================ */
.recording {
  background: var(--c-rej-bg);
  color: var(--c-rej);
  border-color: oklch(0.85 0.05 25);
  animation: rec-pulse 1.2s ease-in-out infinite;
}
@keyframes rec-pulse {
  0%, 100% { box-shadow: 0 0 0 0 oklch(0.55 0.17 25 / 0.4); }
  50% { box-shadow: 0 0 0 8px oklch(0.55 0.17 25 / 0); }
}

/* ============================================================
   DAILY VIEW
   ============================================================ */

.daily-section { margin-bottom: 30px; }

.daily-list { display: flex; flex-direction: column; gap: 8px; }
.daily-card {
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-md); padding: 14px 16px;
  cursor: pointer;
  transition: box-shadow var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std),
              transform var(--motion-fast) var(--ease-std);
  display: flex; flex-direction: column; gap: 10px;
}
.daily-card:hover {
  box-shadow: var(--elev-2);
  border-color: transparent;
  transform: translateY(-1px);
}
.daily-card:active { transform: scale(0.99); }
.daily-card-head { display: flex; align-items: center; gap: 10px; }
.daily-card-actions { display: flex; gap: 6px; flex-wrap: wrap; }
.daily-card--reminder { border-left: 3px solid var(--c-prog); }
.daily-card--stale { border-left: 3px solid var(--c-rej); opacity: 0.92; }
.daily-card--rating { border-left: 3px solid var(--c-star); text-decoration: none; color: inherit; }
.daily-card-time { white-space: nowrap; margin-left: auto; }
.daily-card-meta { font-size: var(--fs-sm); margin-top: 4px; line-height: 1.45; }
.daily-card-body { font-size: var(--fs-sm); color: var(--text-2); margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); word-wrap: break-word; }
/* KV-APP 08.10: było sklejone w `}ack {` (reguła trafiała w nieistniejący element). */
.stack { display: flex; flex-direction: column; gap: 12px; }
.cluster { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.spacer { flex: 1; }
.dim-12 { font-size: var(--fs-sm); color: var(--text-3); }

/* ---------- Card (rozszerzenie) — M3 outlined / elevated ---------- */
.card {
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-md);
  padding: 18px 20px;
  transition: box-shadow var(--motion-fast) var(--ease-std);
}
/* KV-APP 08.10: było sklejone w `}ard-h {` - bazowa reguła nagłówka karty nie działała. */
.card-h {
  font-size: var(--fs-base); font-weight: var(--fw-semibold); letter-spacing: -0.01em;
  margin: 0 0 10px;
  display: flex; align-items: center; gap: 8px;
}
.card-h .dim-12 { margin-left: auto; font-weight: var(--fw-regular); }

/* ---------- Tabs — Material 3 primary tabs ---------- */
.tabs {
  display: flex; gap: 0;
  border-bottom: 1px solid var(--outline-variant);
  margin-bottom: 18px;
  overflow-x: auto;
  overflow-y: hidden;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.tabs::-webkit-scrollbar { display: none; }

.tab::before {
  content: ''; position: absolute; inset: 0;
  background: currentColor; opacity: 0;
  transition: opacity var(--motion-fast) var(--ease-std);
  pointer-events: none;
}

.tab:hover::before { opacity: 0.06; }
.tab:hover { color: var(--text); }

.tab .material-symbols-outlined {
  font-size: var(--fs-xl);
  font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 20;
}
.tab.active .material-symbols-outlined { font-variation-settings: 'FILL' 1, 'wght' 600; }
.tab-count {
  font-family: inherit; font-size: var(--fs-xs); color: var(--text-3);
  background: var(--surface-2);
  padding: 2px 8px; border-radius: var(--shape-full);
}
.tab.active .tab-count { background: var(--primary); color: var(--on-primary); }

/* ---------- Level badges ---------- */
.lvl-badge {
  display: inline-flex; align-items: center; padding: 2px 8px;
  border-radius: 4px; font-size: var(--fs-xs); font-weight: var(--fw-medium);
  letter-spacing: 0.02em;
}
/* TP1: badge klasy (SP 4-8 / kl. 1-4) przy tytule tematu */
.grade-badge {
  display: inline-flex; align-items: center; padding: 1px 6px;
  border-radius: 4px; font-size: var(--fs-2xs); font-weight: var(--fw-semibold);
  background: oklch(0.93 0.04 145); color: oklch(0.42 0.11 145);
  vertical-align: middle;
}
html.dark .grade-badge { background: oklch(0.32 0.05 145); color: oklch(0.85 0.10 145); }
/* TP8: badge zakresu — „rozsz." przy tytule tematu (rozszerzenie). Podstawa
   bez badge (to baza domyślna). Ambrowy odcień, żeby odróżnić od klasy. */
.scope-badge {
  display: inline-flex; align-items: center; padding: 1px 6px;
  border-radius: 4px; font-size: var(--fs-2xs); font-weight: var(--fw-semibold);
  background: oklch(0.93 0.05 75); color: oklch(0.48 0.13 75);
  vertical-align: middle;
}
html.dark .scope-badge { background: oklch(0.33 0.06 75); color: oklch(0.85 0.11 75); }
/* TP8: podfiltr zakresu (mniejsze chipy pod głównym filtrem poziomu) */
.filters-scope { margin-top: 6px; }
.chip-sm { padding: 3px 10px; font-size: var(--fs-sm); }
.lvl-podst   { background: oklch(0.94 0.05 188); color: oklch(0.44 0.12 188); }
.lvl-srednia { background: oklch(0.94 0.05 220); color: oklch(0.44 0.13 220); }
.lvl-matura  { background: oklch(0.94 0.06 250); color: oklch(0.45 0.15 250); }
.lvl-inne    { background: oklch(0.94 0.005 255); color: oklch(0.42 0.02 255); }
html.dark .lvl-podst   { background: oklch(0.32 0.06 188); color: oklch(0.85 0.10 188); }
html.dark .lvl-srednia { background: oklch(0.32 0.06 220); color: oklch(0.85 0.10 220); }
html.dark .lvl-matura  { background: oklch(0.32 0.07 250); color: oklch(0.85 0.11 250); }
html.dark .lvl-inne    { background: var(--surface-3); color: var(--text-2); }

/* ---------- Difficulty dots ---------- */
.diff-dots { display: inline-flex; gap: 2px; vertical-align: middle; }
.diff-dot {
  width: 6px; height: 6px; border-radius: var(--shape-full);
  background: var(--border-strong);
}
.diff-dot.on { background: var(--c-prog); }

/* ---------- STUDENTS list (uses table.leads style, no override needed) ---------- */
.students-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 12px;
}
.student-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 14px 16px;
  cursor: pointer; transition: box-shadow 0.12s, border-color 0.12s;
  display: flex; flex-direction: column; gap: 10px;
}
.student-card:hover { box-shadow: var(--shadow-1); border-color: var(--border-strong); }
.student-card-head { display: flex; align-items: center; gap: 10px; }
.student-card-head .who-avatar { width: 36px; height: 36px; font-size: var(--fs-base); }
.student-card-name { font-weight: var(--fw-medium); font-size: var(--fs-md); }
.student-card-sub  { font-size: var(--fs-xs); color: var(--text-3); }
.student-card-progress {
  display: flex; flex-direction: column; gap: 4px;
}
.student-card-progress-meta {
  display: flex; justify-content: space-between;
  font-size: var(--fs-xs); color: var(--text-3);
  font-family: inherit;
}

.progress-bar.warn { background: var(--grad); }

.student-card-foot {
  display: flex; align-items: center; justify-content: space-between;
  font-size: var(--fs-xs); color: var(--text-3);
  padding-top: 8px; border-top: 1px dashed var(--border);
}

/* ---------- Student profile ---------- */
.profile-head {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 20px 24px;
  margin-bottom: 16px;
  display: grid; grid-template-columns: auto 1fr auto; gap: 16px; align-items: center;
}
.profile-avatar {
  width: 56px; height: 56px; border-radius: var(--shape-full);
  /* KV-APP-AUDYT-2: jak pozostałe awatary - pełny niebieski marki (fioletowy
     gradient był spoza palety; biały na jaśniejszym końcu miał < 4,5:1). */
  background: var(--primary);
  color: var(--on-primary); display: grid; place-items: center;
  font-weight: var(--fw-bold); font-size: var(--fs-xl);
}
.profile-meta-main {
  display: flex; flex-direction: column; gap: 4px; min-width: 0;
}
.profile-name { font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: var(--ls-display); }
.profile-sub  { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: var(--fs-sm); color: var(--text-3); }
.profile-actions { display: flex; gap: 6px; flex-wrap: wrap; }

.profile-stat-label {
  font-size: var(--fs-2xs); color: var(--text-3); text-transform: uppercase;
  letter-spacing: 0.06em; font-weight: var(--fw-medium); margin-bottom: 4px;
}

/* ---------- Timeline (profile, lekcje history) ---------- */
.lesson-row {
  display: grid; grid-template-columns: 24px 1fr auto; gap: 12px;
  align-items: start;
  padding: 12px 0;
  border-bottom: 1px solid var(--border);
  position: relative;
}
.lesson-row:last-child { border-bottom: none; }
.lesson-notes {
  font-size: var(--fs-sm); color: var(--text-2); margin-top: 4px;
  white-space: pre-wrap;
  background: var(--surface-2); padding: 6px 10px;
  border-radius: var(--radius-sm);
}
.lesson-homework, .lesson-links {
  font-size: var(--fs-sm); color: var(--text-2); margin-top: 4px;
}
/* Praca domowa z SOLVE Lab przychodzi wielolinijkowo (tytul / link / PDF).
   Bez `pre-line` HTML sklejal to w jeden ciag i rodzic dostawal sciane tekstu. */
.lesson-homework .hw-tresc { white-space: pre-line; margin-top: 3px; }
.lesson-homework .hw-akcje { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; }
/* Status oddania na karcie KONKRETNEJ lekcji. Do 17.08 rodzic widzial tylko
   zbiorcze "Oddane 3 z 5" na pulpicie — przy pojedynczej lekcji nic. */
.lesson-homework .hw-status {
  display: inline-flex; align-items: center; gap: 3px;
  font-size: var(--fs-2xs); font-weight: var(--fw-medium); padding: 1px 7px 1px 5px;
  border-radius: var(--shape-full); border: 1px solid var(--border);
  color: var(--text-3); vertical-align: middle;
}
.lesson-homework .hw-status .material-symbols-outlined { font-size: var(--fs-base); }
.lesson-homework .hw-status--ok {
  color: var(--c-ok); border-color: transparent; background: var(--c-ok-bg);
}
.lesson-homework .lbl, .lesson-links .lbl {
  font-size: var(--fs-2xs); color: var(--text-3); text-transform: uppercase;
  letter-spacing: 0.06em; font-weight: var(--fw-medium); margin-right: 4px;
}

/* ---------- Topics tree ---------- */
.topics-tree {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden;
}
.topics-cat {
  border-bottom: 1px solid var(--border);
}
.topics-cat:last-child { border-bottom: none; }
.topics-cat-head {
  padding: 10px 16px;
  background: var(--surface-2);
  display: flex; align-items: center; gap: 8px;
  cursor: pointer;
  font-size: var(--fs-base); font-weight: var(--fw-medium);
  user-select: none;
}
.topics-cat-head .chev { transition: transform 0.16s; }
.topics-cat.open .topics-cat-head .chev { transform: rotate(90deg); }
.topics-cat-count {
  margin-left: auto; font-family: inherit; font-size: var(--fs-xs);
  color: var(--text-3);
}
.topics-list { display: none; padding: 4px 0; }
.topics-cat.open .topics-list { display: block; }
/* zbiorcza zmiana nazwy działu (admin) — ukryta, pokazuje ją ołówek w nagłówku */
.topics-cat > .pz-cat-rename { display: none; padding: 6px 16px 2px; }
.topics-cat > .pz-cat-rename.is-open { display: flex; }
.pz-cat-rename .input { max-width: 260px; }
/* TP1: sterowanie natywnym <details open> (bez zależności od klasy .open) */
.topics-cat[open] > .topics-list { display: block; }
.topics-cat[open] > .topics-cat-head .chev { transform: rotate(90deg); }

/* TP1: klasa jako zewnętrzny poziom drzewa (klasa → dział → temat) */
.topics-grade { border-bottom: 1px solid var(--border); }
.topics-grade:last-child { border-bottom: none; }
.topics-grade-head {
  padding: 11px 16px;
  background: var(--surface-2);
  display: flex; align-items: center; gap: 8px;
  cursor: pointer; user-select: none;
  font-size: var(--fs-base); font-weight: var(--fw-semibold); letter-spacing: -0.01em;
}
.topics-grade-head .chev { transition: transform 0.16s; }
.topics-grade[open] > .topics-grade-head .chev { transform: rotate(90deg); }
.topics-grade-name .dim-12 { font-weight: var(--fw-regular); }
.topics-grade-body { display: none; }
.topics-grade[open] > .topics-grade-body { display: block; }
/* dział zagnieżdżony w klasie — lekkie wcięcie dla czytelności hierarchii */
.topics-grade-body .topics-cat-head { padding-left: 28px; }
.topics-grade-body .topics-cat:last-child { border-bottom: none; }

.topic-row:hover { background: var(--surface-2); }
/* Mała kropka licznika linków + plików tematu — pokazujemy w miejscu checkboxa na liście */
.topic-row-badge {
  position: absolute;
  width: 18px; height: 18px;
  border-radius: var(--shape-full);
  background: var(--primary);
  color: var(--on-primary);
  font-size: var(--fs-2xs); font-weight: var(--fw-semibold);
  display: grid; place-items: center;
  font-family: inherit;
}
.topic-title { font-weight: var(--fw-medium); }
.topic-desc { color: var(--text-3); font-size: var(--fs-xs); margin-top: 2px; }

/* ---------- Wizard (plan nauki) ---------- */

.wizard-step-num {
  width: 24px; height: 24px; border-radius: var(--shape-full);
  background: var(--surface);
  border: 1px solid var(--border-strong);
  color: var(--text-3);
  display: grid; place-items: center;
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  flex-shrink: 0;
}

/* Level cards on step 1 */

/* Paths picker on step 2 */
.path-cards { display: flex; flex-direction: column; gap: 8px; }
.path-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 12px 14px;
  display: flex; align-items: center; gap: 12px;
  cursor: pointer;
  transition: transform 0.12s, box-shadow 0.12s, background-color 0.12s, border-color 0.12s, color 0.12s, opacity 0.12s;
}
.path-card:hover { border-color: var(--border-strong); }
.path-card.selected { border-color: var(--text); background: var(--surface-2); }
.path-card-meta { flex: 1; min-width: 0; }
.path-card-name { font-weight: var(--fw-medium); font-size: var(--fs-base); }
.path-card-stats { font-size: var(--fs-xs); color: var(--text-3); font-family: inherit; margin-top: 2px; }/* Schedule step */
.schedule-mode {
  display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
  margin-bottom: 20px;
}
.schedule-mode-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 16px;
  cursor: pointer;
  display: flex; flex-direction: column; gap: 6px;
}
.schedule-mode-card { position: relative; }
.schedule-mode-card.selected { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); background: var(--primary-container); }
.schedule-mode-card:has(input:focus-visible) { outline: 2px solid var(--primary); outline-offset: 2px; }
.schedule-mode-card .mode-name { font-weight: var(--fw-semibold); font-size: var(--fs-md); }
.schedule-mode-card .mode-desc { font-size: var(--fs-sm); color: var(--text-3); }

/* KAL-STATUS (08.10): status lekcji w oknie lekcji kalendarza - trzy duże
   przyciski (cel dotykowy 44 px), aktywny w kolorze marki. */
.cal-status { display: flex; gap: 6px; flex-wrap: wrap; }
.cal-status .btn { flex: 1 1 0; min-height: 44px; justify-content: center; white-space: nowrap; padding-inline: 10px; gap: 4px; }
.cal-status .btn.is-on { background: var(--primary); color: var(--on-primary); border-color: var(--primary); }

/* ---------- Lesson card (in plan view) ---------- */
/* Wersja sortowalna — z dodatkowa kolumna 18px na drag handle ⋮⋮ */
.lesson-card-body { min-width: 0; }
.lesson-card-cat { color: var(--text-3); font-size: var(--fs-sm); }
.lesson-card-status {
  margin-top: 8px; display: flex; gap: 6px; flex-wrap: wrap;
}
.lesson-card-status .btn { padding: 4px 9px; font-size: var(--fs-xs); min-height: 26px; }
.lesson-card-status .btn.is-on {
  background: var(--text); color: var(--bg); border-color: var(--text);
}
.lesson-card-extra { margin-top: 10px; display: flex; flex-direction: column; gap: 6px; }
.lesson-extra-row {
  display: flex; align-items: flex-start; gap: 8px;
  font-size: var(--fs-sm);
  padding: 6px 8px;
  background: var(--surface-2);
  border-radius: var(--radius-sm);
}
.lesson-extra-row .ico { flex-shrink: 0; margin-top: 1px; font-size: var(--fs-md); }
.lesson-extra-row .lbl { color: var(--text-3); margin-right: 4px; font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.04em; }

/* Tematy zajęć pod tytułem lekcji — chipy nie przepełniają się w bok.
   .chip ma sztywną wysokość i nie zawija; tu pozwalamy zawijać i ograniczamy
   szerokość do kontenera. Na mobile chipy układają się w pionie (pełna szerokość). */
.lesson-card-topics { max-width: 100%; }
.lesson-card-topics .chip {
  height: auto; min-height: 28px; padding: 5px 10px;
  white-space: normal; max-width: 100%; cursor: default; line-height: 1.3;
}

/* ---------- Plan summary header ---------- */
.plan-summary {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 16px 20px;
  margin-bottom: 16px;
  display: grid; grid-template-columns: minmax(240px, 1fr) auto; gap: 14px; align-items: center;
}
.plan-summary-meta { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.plan-summary-name { font-size: var(--fs-xl); font-weight: var(--fw-semibold); letter-spacing: -0.015em; }
.plan-summary-info { font-size: var(--fs-sm); color: var(--text-3); display: flex; gap: 12px; flex-wrap: wrap; }
.plan-summary-info span { display: inline-flex; align-items: center; gap: 4px; }
.plan-summary-actions { display: flex; gap: 6px; flex-wrap: wrap; }
.plan-progress-row {
  margin-top: 8px; display: flex; align-items: center; gap: 12px;
}
.plan-progress-row .progress { flex: 1; height: 8px; }
.plan-progress-row .pct {
  font-family: inherit; font-size: var(--fs-sm); font-weight: var(--fw-semibold);
  min-width: 80px; text-align: right;
}

/* ---------- LISTINGS table ---------- */

/* override col-actions: dla ogłoszeń mamy 3 akcje, potrzebujemy więcej miejsca */

/* ---------- Sources admin ---------- */

/* ---------- Bottom sheet (kanban mobile move) ---------- */

/* ---------- Presentation mode ---------- */
.pres-stage {
  background: var(--bg);
  min-height: 100vh;
  padding: 60px 24px 80px;
}
.pres-container {
  max-width: 820px; margin: 0 auto;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--shape-md);
  padding: 56px 64px;
  box-shadow: var(--shadow-2);
}
.pres-brand {
  display: flex; align-items: center; gap: 12px;
  margin-bottom: 32px;
  padding-bottom: 20px;
  border-bottom: 1px solid var(--border);
}
.pres-brand-mark {
  width: 36px; height: 36px; border-radius: var(--shape-sm);
  background: var(--text); color: var(--bg);
  display: grid; place-items: center;
  font-weight: var(--fw-bold); font-size: var(--fs-lg);
}
.pres-brand-name { font-weight: var(--fw-semibold); letter-spacing: -0.02em; font-size: 17px; }
.pres-brand-tag { font-size: var(--fs-xs); color: var(--text-3); text-transform: uppercase; letter-spacing: 0.06em; }

.pres-title {
  font-size: 30px; font-weight: var(--fw-semibold); letter-spacing: -0.025em;
  margin: 0 0 8px;
}
.pres-sub {
  font-size: var(--fs-md); color: var(--text-3);
  margin-bottom: 36px;
}
.pres-meta-label { font-size: var(--fs-2xs); color: var(--text-3); text-transform: uppercase; letter-spacing: 0.06em; }
.pres-meta-value { font-size: var(--fs-xl); font-weight: var(--fw-semibold); letter-spacing: -0.015em; }

.pres-section-h {
  font-size: 17px; font-weight: var(--fw-semibold); letter-spacing: -0.015em;
  margin: 36px 0 14px;
}
.pres-section-h:first-of-type { margin-top: 0; }

.pres-lesson-row {
  display: grid; grid-template-columns: 28px 80px minmax(0, 1fr); gap: 16px; align-items: start;
  padding: 12px 0;
  border-bottom: 1px dashed var(--border);
}
.pres-lesson-row:last-child { border-bottom: none; }
.pres-num {
  width: 24px; height: 24px; border-radius: var(--shape-full);
  background: var(--surface-2); border: 1px solid var(--border);
  display: grid; place-items: center;
  font-size: var(--fs-xs); color: var(--text-3); font-weight: var(--fw-semibold);
}
.pres-num.done { background: var(--c-ok); border-color: var(--c-ok); color: var(--bg); }
.pres-date { font-family: inherit; font-size: var(--fs-sm); color: var(--text-2); padding-top: 4px; }
.pres-lesson-content { min-width: 0; }
.pres-lesson-content .pres-lesson-title { font-size: var(--fs-md); font-weight: var(--fw-medium); word-break: break-word; }
.pres-lesson-content .pres-lesson-cat { font-size: var(--fs-sm); color: var(--text-3); }
.pres-lesson-content .pres-lesson-note {
  font-size: var(--fs-sm); color: var(--text-2); margin-top: 4px;
  word-wrap: break-word; overflow-wrap: break-word;
}

.pres-foot {
  margin-top: 48px; padding-top: 24px;
  border-top: 1px solid var(--border);
  display: flex; justify-content: space-between; align-items: center;
  font-size: var(--fs-xs); color: var(--text-3);
}

.pres-toolbar {
  position: fixed; top: 16px; right: 16px; left: 16px;
  display: flex; justify-content: space-between; align-items: center;
  z-index: 5;
}
.pres-toolbar .btn { box-shadow: var(--shadow-1); }

@media print {
  .pres-toolbar, .sidebar, .topbar, .bottom-nav { display: none; }
  .pres-stage { padding: 0; }
  .pres-container { box-shadow: none; border: none; border-radius: 0; padding: 24px; }
  body { background: white; }
}

/* ---------- Parent view ---------- */

/* ---------- Homework rating (ocena rodzica) ---------- */
.hw-rating {
  margin-top: 10px; padding: 0;
  background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--radius-sm); overflow: hidden;
}
.hw-rating-summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 12px; font-size: var(--fs-base);
  user-select: none;
}
.hw-rating-summary::-webkit-details-marker { display: none; }
.hw-rating-summary:hover { background: var(--surface-3, var(--surface-2)); }
.hw-rating-label { color: var(--text); }
.hw-rating-toggle { font-size: var(--fs-xs); color: var(--text-3); flex-shrink: 0; margin-left: 8px; }
.hw-rating-form {
  padding: 10px 12px 12px;
  border-top: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 8px;
  min-width: 0;
}
.hw-stars {
  display: inline-flex; flex-direction: row-reverse;
  gap: 2px; align-self: flex-start;
}
.hw-stars input[type="radio"] {
  position: absolute; opacity: 0; pointer-events: none;
}
.hw-stars label {
  font-size: 26px; line-height: 1; cursor: pointer;
  color: var(--border); transition: color .1s ease, transform .1s ease;
  padding: 2px 1px;
}
/* Hover: ta i wszystkie na lewo (czyli wyżej w DOM bo row-reverse) podświetlone */
.hw-stars label:hover,
.hw-stars label:hover ~ label,
.hw-stars input[type="radio"]:checked ~ label {
  color: var(--c-star);
}
.hw-stars label:active { transform: scale(1.15); }
html.dark .hw-stars label { color: var(--surface-3, oklch(0.3 0.01 255)); }
html.dark .hw-stars label:hover,
html.dark .hw-stars label:hover ~ label,
html.dark .hw-stars input[type="radio"]:checked ~ label {
  color: var(--c-star);
}
.hw-rating-comment {
  width: 100%; max-width: 100%; box-sizing: border-box;
  font-family: inherit; font-size: var(--fs-base);
  padding: 8px 10px; border: 1px solid var(--border);
  border-radius: var(--radius-sm); background: var(--surface);
  color: var(--text); resize: vertical; min-height: 60px;
}
.hw-rating-comment:focus {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--state-focus-primary); }
.hw-rating-actions { display: flex; gap: 8px; }

/* Read-only widok oceny — dla tutora w plans/view, students/profile, presentation */
.hw-rating-readonly {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--fs-base);
}
.hw-rating-readonly > span:not(.dim-12) {
  font-size: 15px; color: var(--border); line-height: 1;
}
.hw-rating-readonly > span.filled { color: var(--c-star); }
html.dark .hw-rating-readonly > span:not(.dim-12) { color: var(--surface-3, oklch(0.3 0.01 255)); }
html.dark .hw-rating-readonly > span.filled { color: oklch(0.82 0.18 75); }
.hw-rating-readonly strong { font-size: var(--fs-base); margin-left: 2px; }

.lesson-feedback-row .lbl { color: oklch(0.55 0.13 75); }
.lesson-feedback-comment {
  font-size: var(--fs-sm); color: var(--text-2);
  margin-top: 6px; padding: 6px 10px;
  background: var(--surface); border-radius: 4px;
  border-left: 3px solid var(--c-star);
  white-space: pre-wrap;
}
.pres-feedback-note {
  border-left: 3px solid var(--c-star);
  padding-left: 10px;
}

.lesson-tutor-grade-row .lbl { color: oklch(0.45 0.16 155); }
html.dark .lesson-tutor-grade-row .lbl { color: oklch(0.78 0.14 155); }

.parent-tutor-grade {
  margin-top: 8px; padding: 10px 12px;
  background: oklch(0.96 0.04 155);
  border: 1px solid oklch(0.86 0.06 155);
  border-radius: var(--radius-sm);
  display: flex; flex-direction: column; gap: 6px;
}
.parent-tutor-grade .lbl {
  font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.05em;
  color: oklch(0.42 0.16 155); font-weight: var(--fw-semibold);
}
html.dark .parent-tutor-grade {
  background: oklch(0.22 0.04 155);
  border-color: oklch(0.32 0.05 155);
}
html.dark .parent-tutor-grade .lbl { color: oklch(0.78 0.14 155); }

/* Materiały tematu w widoku planu (read-only z notką że to z ustawień tematu) */
.lesson-topic-materials {
  margin-top: 8px; padding: 10px 12px;
  background: oklch(0.97 0.02 280);
  border: 1px dashed oklch(0.82 0.05 280);
  border-radius: var(--radius-sm);
  display: flex; flex-direction: column; gap: 8px;
  font-size: var(--fs-base);
}
html.dark .lesson-topic-materials {
  background: oklch(0.22 0.02 280);
  border-color: oklch(0.36 0.05 280);
}
.lesson-topic-materials .lbl {
  font-size: var(--fs-xs); color: oklch(0.42 0.12 280); font-weight: var(--fw-semibold);
  display: flex; align-items: center; gap: 6px;
}
html.dark .lesson-topic-materials .lbl { color: oklch(0.78 0.12 280); }
.lesson-topic-materials .topic-edit-link {
  margin-left: auto; text-decoration: none; color: var(--text-3);
  padding: 2px 6px; border-radius: 4px;
}
.lesson-topic-materials .topic-edit-link:hover { background: var(--surface); color: var(--accent); }
.topic-mat-content {
  font-size: var(--fs-sm); color: var(--text-2); white-space: pre-wrap;
  word-wrap: break-word;
}
.topic-mat-links { display: flex; flex-wrap: wrap; gap: 6px; }
.topic-mat-files { display: flex; flex-direction: column; gap: 4px; }
.topic-mat-file {
  display: inline-block; padding: 4px 8px;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: 4px; text-decoration: none; color: var(--text);
  font-size: var(--fs-sm);
}
.topic-mat-file:hover { background: var(--surface-2); }
.parent-materials {
  margin-top: 8px; padding: 10px 12px;
  background: var(--surface-2); border-radius: var(--radius-sm);
  border: 1px solid var(--border);
}
.parent-materials-text { font-size: var(--fs-sm); color: var(--text-2); white-space: pre-wrap; }
.parent-materials-links { display: flex; flex-wrap: wrap; gap: 6px; }
.parent-materials-files { display: flex; flex-direction: column; gap: 4px; }
.parent-material-file {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 8px; background: var(--surface);
  border: 1px solid var(--border); border-radius: 4px;
  text-decoration: none; color: var(--text); font-size: var(--fs-sm);
}
.parent-material-file > .name {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  flex: 1; min-width: 0;
}
.parent-material-file > .size { flex-shrink: 0; }

.parent-lesson-link { color: var(--accent); margin-right: 6px; }
/* W-E8 (05.11): „Otwórz kartkówkę” / „Wersja PDF” to przyciski na kciuk - cel min. 44 px */
.hw-akcje .parent-lesson-link { display: inline-flex; align-items: center; gap: 4px; min-height: 44px; }
.parent-child-switcher {
  position: absolute; left: 0; top: 100%; margin-top: 4px;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  box-shadow: 0 8px 24px rgba(0,0,0,.18);
  min-width: 220px; max-width: calc(100vw - 32px);
  z-index: var(--z-sidebar); padding: 4px;
}
.parent-child-switcher-item {
  display: block; padding: 8px 12px;
  text-decoration: none; color: var(--text);
  font-size: var(--fs-base); border-radius: 4px;
}
.parent-child-switcher-divider { height: 1px; background: var(--border); margin: 4px 0; }

.parent-greeting {
  font-size: var(--fs-3xl); font-weight: var(--fw-black); letter-spacing: var(--ls-display); line-height: 1.1;
  margin: 0 0 4px;
}
.parent-greeting-sub { font-size: var(--fs-base); color: var(--text-3); }

.parent-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 18px 22px;
}
.parent-card-h {
  display: flex; align-items: center; gap: 8px;
  font-size: var(--fs-md); font-weight: var(--fw-semibold); letter-spacing: -0.01em;
  margin-bottom: 14px;
}
.parent-card-h .dim-12 { margin-left: auto; font-weight: var(--fw-regular); }/* ---------- Modal sheet (used for kanban move) ---------- */

/* ---------- Today (Dzisiaj) — overrides for nowsze layout ---------- */

.today-empty {
  padding: 20px; text-align: center;
  color: var(--text-3); font-size: var(--fs-base);
  background: var(--surface-2); border-radius: var(--radius-sm);
}

/* ---------- Tag-edit chip (used in plan lesson actions) ---------- */
.action-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 9px;
  border-radius: var(--shape-full);
  background: var(--surface-2);
  border: 1px solid var(--border);
  font-size: var(--fs-xs); color: var(--text-2);
  cursor: pointer;
}
.action-chip:hover { background: var(--surface-3); color: var(--text); }

/* ---------- Header inline title row ---------- */
.crumb-back {
  background: none; border: none;
  color: var(--text-3); font-size: var(--fs-base);
  cursor: pointer; padding: 4px 8px;
  border-radius: var(--radius-sm);
  display: inline-flex; align-items: center; gap: 4px;
}
.crumb-back:hover { background: var(--surface-2); color: var(--text); }
/* KV-APP-OKRUSZKI: na szerszym ekranie „← Sekcja" dubluje okruszki w górnym pasku -
   widoczne tylko na telefonie (blok <=600px), gdzie pasek pokazuje bieżącą stronę. */
.crumb-back { display: none; }

/* ---------- Sidebar additions (new nav items) ---------- */
.nav-item.danger { color: var(--c-rej); }
/* ---------- Mobile shell tweaks ---------- */

/* ---------- Print-friendly plan ---------- */
@media print {
  .lesson-card-status { display: none; }
}

/* ---------- Misc ---------- */
.muted { color: var(--text-3); }.spacer-y-16 { height: 16px; }
/* ============================================================
   NEW: Next-action banner, Sticky notes, Resources, Billing, Streak, Color tags
   ============================================================ */

/* ---------- Next action callout (na górze profilu) ---------- */
.next-action {
  background: linear-gradient(180deg, oklch(0.96 0.05 90 / 0.7), oklch(0.97 0.04 90 / 0.4));
  border: 1px solid oklch(0.86 0.07 90 / 0.7);
  border-left: 3px solid var(--c-prog);
  border-radius: var(--radius);
  padding: 14px 18px;
  margin-bottom: 16px;
  display: flex; gap: 14px; align-items: flex-start;
}
html.dark .next-action {
  background: oklch(0.24 0.05 90 / 0.5);
  border-color: oklch(0.45 0.08 90 / 0.5);
}
.next-action-body { flex: 1; }
.next-action-label {
  font-size: var(--fs-xs); color: var(--text-3); text-transform: uppercase;
  letter-spacing: 0.06em; font-weight: var(--fw-medium); margin-bottom: 4px;
  display: flex; align-items: center; gap: 6px;
}
.next-action-text { font-size: var(--fs-md); font-weight: var(--fw-medium); line-height: 1.4; color: var(--text); }
.next-action-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }

/* ---------- Color tag (badge u góry karty ucznia / profilu) ---------- */
.color-tag {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--fs-xs); font-weight: var(--fw-medium);
  padding: 2px 8px; border-radius: var(--shape-full);
  border: 1px solid;
}
.color-tag.color-red    { background: var(--c-rej-bg);   color: var(--c-rej);   border-color: oklch(0.85 0.05 25 / 0.6); }
.color-tag.color-amber  { background: var(--c-prog-bg);  color: var(--c-prog);  border-color: oklch(0.85 0.07 90 / 0.6); }
.color-tag.color-green  { background: var(--c-ok-bg);    color: var(--c-ok);    border-color: oklch(0.85 0.07 155 / 0.6); }
.color-tag.color-blue   { background: var(--c-new-bg);   color: var(--c-new);   border-color: oklch(0.85 0.06 258 / 0.6); }
.color-tag.color-violet { background: oklch(0.94 0.04 295); color: oklch(0.46 0.16 295); border-color: oklch(0.85 0.06 295 / 0.6); }
html.dark .color-tag.color-violet { background: oklch(0.30 0.05 295); color: oklch(0.85 0.10 295); }

/* ---------- Streak counter (płomyk z liczbą) ---------- */
.streak-badge {
  display: inline-flex; align-items: center; gap: 5px;
  background: linear-gradient(90deg, oklch(0.93 0.13 50), oklch(0.92 0.12 35));
  color: oklch(0.32 0.16 35);
  padding: 2px 8px 2px 6px;
  border-radius: var(--shape-full);
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
}
html.dark .streak-badge {
  background: linear-gradient(90deg, oklch(0.40 0.12 50 / 0.5), oklch(0.38 0.12 35 / 0.5));
  color: oklch(0.88 0.14 50);
}
.streak-badge .flame { font-size: var(--fs-sm); }

/* ---------- Sticky notes (post-it) ---------- */
.sticky-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 10px;
}
.sticky-note {
  background: oklch(0.96 0.06 90);
  border-radius: var(--shape-xs);
  padding: 12px 14px;
  min-height: 100px;
  font-size: var(--fs-base); line-height: 1.45;
  position: relative;
  box-shadow: 0 1px 3px oklch(0.2 0.02 250 / 0.06), 0 2px 6px oklch(0.2 0.02 250 / 0.04);
  transform: rotate(-0.4deg);
  transition: transform 0.16s, box-shadow 0.16s;
  display: flex; flex-direction: column; gap: 8px;
}
.sticky-note:nth-child(2n) { transform: rotate(0.4deg); }
.sticky-note:nth-child(3n) { transform: rotate(-0.2deg); }
.sticky-note:hover { transform: rotate(0) scale(1.015); box-shadow: 0 2px 6px oklch(0.2 0.02 250 / 0.1), 0 6px 16px oklch(0.2 0.02 250 / 0.08); }
.sticky-amber  { background: oklch(0.96 0.06 90); color: oklch(0.32 0.04 90); }
.sticky-red    { background: oklch(0.95 0.05 20); color: oklch(0.32 0.04 20); }
.sticky-green  { background: oklch(0.95 0.06 145); color: oklch(0.30 0.04 145); }
.sticky-blue   { background: oklch(0.95 0.05 230); color: oklch(0.32 0.04 230); }
.sticky-violet { background: oklch(0.95 0.05 295); color: oklch(0.32 0.04 295); }
html.dark .sticky-amber  { background: oklch(0.34 0.06 90); color: oklch(0.92 0.04 90); }
html.dark .sticky-red    { background: oklch(0.34 0.06 20); color: oklch(0.92 0.05 20); }
html.dark .sticky-green  { background: oklch(0.32 0.07 145); color: oklch(0.92 0.05 145); }
html.dark .sticky-blue   { background: oklch(0.32 0.06 230); color: oklch(0.92 0.04 230); }
html.dark .sticky-violet { background: oklch(0.32 0.06 295); color: oklch(0.92 0.05 295); }
.sticky-body { flex: 1; white-space: pre-wrap; word-break: break-word; }
.sticky-foot {
  display: flex; justify-content: space-between; align-items: center;
  font-size: var(--fs-2xs); opacity: 0.7;
  font-family: inherit; padding-top: 4px;
  border-top: 1px dashed currentColor;
}
.sticky-foot .x {
  background: none; border: none; padding: 0; cursor: pointer;
  color: currentColor; opacity: 0.5; font-size: var(--fs-sm);
}
.sticky-foot .x:hover { opacity: 1; }
.sticky-color-pick {
  display: flex; gap: 4px; padding: 4px 0;
}
.sticky-swatch {
  width: 16px; height: 16px; border-radius: var(--shape-full);
  border: 1.5px solid var(--border);
  cursor: pointer;
}
.sticky-swatch.checked { border-color: var(--text); transform: scale(1.1); }
.sticky-swatch.amber  { background: oklch(0.85 0.12 90); }
.sticky-swatch.red    { background: oklch(0.78 0.13 20); }
.sticky-swatch.green  { background: oklch(0.78 0.12 145); }
.sticky-swatch.blue   { background: oklch(0.78 0.10 230); }
.sticky-swatch.violet { background: oklch(0.78 0.10 295); }

.sticky-new {
  display: flex; flex-direction: column; gap: 8px;
  background: var(--surface-2); border: 1.5px dashed var(--border-strong);
  border-radius: var(--shape-xs); padding: 12px;
}
.sticky-new textarea {
  width: 100%; min-height: 70px;
  border: none; background: none; resize: vertical;
  font-family: inherit; font-size: var(--fs-base);
  color: var(--text);
}

/* ---------- Resources / external links ---------- */
.resources-list { display: flex; flex-direction: column; gap: 6px; }
.resource-item {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px;
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  text-decoration: none; color: var(--text);
  transition: transform 0.12s, box-shadow 0.12s, background-color 0.12s, border-color 0.12s, color 0.12s, opacity 0.12s;
}
.resource-item:hover {
  background: var(--surface);
  border-color: var(--border-strong);
  box-shadow: var(--shadow-1);
  /* Bez transform: przesuwanie wiersza przy hoverze powoduje że
     wewnętrzny przycisk "Usuń" odjeżdża spod kursora i klik nie łapie. */
}
.resource-ico {
  width: 36px; height: 36px;
  border-radius: var(--radius-sm);
  background: var(--surface); border: 1px solid var(--border);
  display: grid; place-items: center; font-size: var(--fs-xl);
  flex-shrink: 0;
}
.resource-meta { flex: 1; min-width: 0; }
.resource-label {
  font-size: var(--fs-base); font-weight: var(--fw-medium); line-height: 1.3;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.resource-url {
  font-size: var(--fs-xs); color: var(--text-3);
  font-family: inherit;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.resource-actions { display: flex; gap: 4px; flex-shrink: 0; }
/* ---------- Billing card ---------- (08.10: brakowało `/*` - cała reguła .billing-grid była nieważna) */
.billing-grid {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;
  margin-bottom: 14px;
}

.billing-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px;
  display: flex; flex-direction: column; gap: 4px;
}
.billing-card.highlight {
  background: oklch(0.97 0.04 155 / 0.4);
  border-color: oklch(0.85 0.07 155 / 0.5);
}
html.dark .billing-card.highlight { background: oklch(0.24 0.04 155 / 0.4); border-color: oklch(0.4 0.07 155 / 0.4); }
.billing-card-label {
  font-size: var(--fs-2xs); color: var(--text-3); text-transform: uppercase;
  letter-spacing: 0.06em; font-weight: var(--fw-medium);
}
.billing-card-value {
  font-size: 24px; font-weight: var(--fw-semibold); letter-spacing: -0.02em;
}
.billing-card-sub {
  font-size: var(--fs-xs); color: var(--text-3); font-family: inherit;
}
.billing-card--wide { grid-column: span 2; }
.billing-card-form { display: flex; gap: 8px; align-items: center; margin-top: 6px; }
.billing-card-form > :is(.input, .select) { flex: 1 1 auto; min-width: 0; max-width: 260px; }

/* ---------- AI summary card ---------- */
.ai-card {
  background: linear-gradient(135deg, oklch(0.97 0.04 290 / 0.4), oklch(0.97 0.04 220 / 0.4));
  border: 1px solid oklch(0.85 0.06 280 / 0.4);
  border-radius: var(--radius);
  padding: 18px 20px;
}
html.dark .ai-card {
  background: linear-gradient(135deg, oklch(0.26 0.05 290 / 0.5), oklch(0.26 0.05 220 / 0.5));
  border-color: oklch(0.45 0.08 280 / 0.4);
}
.ai-card-h {
  font-weight: var(--fw-semibold); font-size: var(--fs-md);
  display: flex; align-items: center; gap: 8px;
  margin-bottom: 10px;
}
.ai-card-h .sparkle { font-size: var(--fs-lg); }
.ai-card-body {
  font-size: var(--fs-base); line-height: 1.55;
  color: var(--text);
  white-space: pre-wrap;
  min-height: 60px;
}
.ai-card-foot {
  margin-top: 12px; padding-top: 10px;
  border-top: 1px dashed oklch(0.85 0.06 280 / 0.5);
  display: flex; gap: 6px; justify-content: space-between; align-items: center;
  font-size: var(--fs-xs); color: var(--text-3);
}

/* ============================================================
   COMMAND PALETTE (⌘K)
   ============================================================ */
.cmdk-backdrop {
  position: fixed; inset: 0;
  background: oklch(0.15 0.02 250 / 0.4);
  backdrop-filter: blur(4px);
  z-index: var(--z-palette);
  opacity: 0; pointer-events: none;
  transition: opacity 0.16s;
}
.cmdk-backdrop.open { opacity: 1; pointer-events: auto; }

.cmdk {
  position: fixed; left: 50%; top: 88px;
  transform: translateX(-50%) scale(0.96);
  width: 680px; max-width: 92vw;
  max-height: 70vh;
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-xl);
  box-shadow: var(--elev-5);
  z-index: calc(var(--z-palette) + 1);
  opacity: 0; pointer-events: none;
  transition: transform var(--motion-std) var(--ease-emph), box-shadow var(--motion-std) var(--ease-emph), background-color var(--motion-std) var(--ease-emph), border-color var(--motion-std) var(--ease-emph), color var(--motion-std) var(--ease-emph), opacity var(--motion-std) var(--ease-emph);
  display: flex; flex-direction: column;
  overflow: hidden;
}
.cmdk.open {
  opacity: 1; pointer-events: auto;
  transform: translateX(-50%) scale(1);
}

.cmdk-search {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 18px;
  border-bottom: 1px solid var(--border);
}
.cmdk-search .ico { color: var(--text-3); font-size: var(--fs-xl); }
.cmdk-search input {
  flex: 1;
  background: none; border: none;
  font-size: var(--fs-lg);
  color: var(--text);
  font-family: inherit;
}
.cmdk-search .esc-hint {
  font-family: inherit; font-size: var(--fs-xs);
  color: var(--text-3); background: var(--surface-2);
  border: 1px solid var(--border);
  padding: 2px 6px; border-radius: 4px;
}

.cmdk-results {
  flex: 1; overflow-y: auto;
  padding: 6px;
}
.cmdk-group {
  padding: 8px 12px 4px;
  font-size: var(--fs-2xs); color: var(--text-3);
  text-transform: uppercase; letter-spacing: 0.06em; font-weight: var(--fw-medium);
}
.cmdk-item {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 12px;
  border-radius: var(--shape-sm);
  cursor: pointer;
  font-size: var(--fs-base);
  border: none; background: none; width: 100%; text-align: left;
  color: var(--text);
  transition: background 0.08s;
}
.cmdk-item:hover, .cmdk-item.focused {
  background: var(--surface-2);
}
.cmdk-item.focused {
  outline: 1px solid var(--text);
}
.cmdk-item .icon {
  width: 28px; height: 28px;
  border-radius: var(--shape-xs);
  background: var(--surface-2);
  border: 1px solid var(--border);
  display: grid; place-items: center;
  font-size: var(--fs-md);
  flex-shrink: 0;
}
.cmdk-item .meta {
  flex: 1; min-width: 0;
  display: flex; flex-direction: column; gap: 2px;
}
.cmdk-item .label {
  font-weight: var(--fw-medium);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cmdk-item .sub {
  font-size: var(--fs-xs); color: var(--text-3);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cmdk-item .kbd {
  font-family: inherit; font-size: var(--fs-2xs);
  color: var(--text-3); background: var(--surface-2);
  border: 1px solid var(--border);
  padding: 1px 5px; border-radius: 4px;
}

.cmdk-empty {
  padding: 40px 20px; text-align: center;
  color: var(--text-3); font-size: var(--fs-base);
}
.cmdk-foot {
  border-top: 1px solid var(--border);
  padding: 8px 14px;
  display: flex; justify-content: space-between; align-items: center;
  font-size: var(--fs-xs); color: var(--text-3); font-family: inherit;
  background: var(--surface-2);
}
.cmdk-foot .kbds { display: flex; gap: 10px; }
.cmdk-foot .kbds span { display: inline-flex; align-items: center; gap: 4px; }
.cmdk-foot kbd {
  background: var(--surface); border: 1px solid var(--border);
  padding: 1px 5px; border-radius: 4px; font-size: var(--fs-2xs);
}
/* W-E4 (05.11): na dotyku bez podpowiedzi klawiszy (jak .tp-keys) */
@media (hover: none) { .cmdk-foot, .cmdk-search .esc-hint { display: none; } }

/* ---------- Student card extensions ---------- */
.student-card-tags {
  display: flex; gap: 4px; flex-wrap: wrap;
  margin-top: 4px;
}

/* ---------- Profile head extension ---------- */
.profile-head-tags {
  display: flex; gap: 6px; flex-wrap: wrap;
  margin-top: 6px;
}

/* ---------- Inline add form (Dodaj element / Dodaj checklistę / Dodaj cokolwiek) ---------- *
 * Wzorzec: <input flex:1> + <button btn-sm>. Bez tego inputy się zwijają
 * i button wylewa się poza kontener. */
.inline-add-form {
  display: flex; gap: 8px; align-items: center; flex-wrap: nowrap;
}
.inline-add-form > .input {
  flex: 1 1 auto; min-width: 0;
  min-height: 36px; height: 36px; padding: 6px 12px;
  font-size: var(--fs-base);
}
.inline-add-form > .btn { flex-shrink: 0; }
.inline-add-form > .btn .material-symbols-outlined { font-size: var(--fs-xl); }

/* ---------- Color picker (modal kolumn zadań / sticky notes itp.) ---------- */
.color-picker {
  display: flex; flex-wrap: wrap; gap: 10px;
  padding: 4px 0;
}
.color-swatch {
  cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px;
  border-radius: var(--shape-full);
  border: 2px solid transparent;
  transition: transform var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std);
}
.color-swatch:hover { transform: scale(1.08); }
.color-swatch .color-radio { display: none; }
.color-swatch .stat-dot { width: 22px; height: 22px; border-radius: var(--shape-full); display: block; }
.color-swatch:has(.color-radio:checked) {
  border-color: var(--text);
  transform: scale(1.12);
}

/* ---------- Topbar search trigger — Google-search pill ---------- */
.topbar-search {
  margin-left: auto;
  /* KV-APP-OKRUSZKI: pole wyszukiwania ustępuje miejsca okruszkom (było 480px
     i ucinało „Ustawienia szkoły › Powiadomienia" do „Ustawieni… › Powiad…"). */
  width: 100%; max-width: 360px; flex: 0 1 360px;
  cursor: pointer;
  background: var(--surface-2);
  border: 1px solid transparent;
  padding: 0 16px;
  border-radius: var(--shape-full);
  display: flex;
  align-items: center;
  gap: 12px;
  color: var(--text-3);
  font-size: var(--fs-md);
  height: 44px;
  flex-shrink: 1;
  min-width: 0;
  font-family: inherit;
  transition: background var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std),
              box-shadow var(--motion-fast) var(--ease-std);
}
.topbar-search:hover {
  background: var(--surface-3);
  color: var(--text-2);
}
.topbar-search:focus-visible {
  background: var(--surface);
  border-color: var(--primary);
  box-shadow: 0 0 0 3px var(--state-focus-primary);
  outline: none;
}
.topbar-search .material-symbols-outlined {
  font-size: 20px; color: var(--text-3);
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 20;
}
.topbar-search-text {
  flex: 1;
  text-align: left;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.topbar-search .kbd-hint {
  font-family: inherit; font-size: var(--fs-xs);
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  padding: 2px 6px; border-radius: var(--shape-xs);
  color: var(--text-3);
  flex-shrink: 0;
}

/* ============================================================
   8. Mobile fixes — Sprint 1 audytu (text overflow, safe-area).
   Naprawia konkretne miejsca z briefu: "tekst nagminnie wylewa się
   na ekranach mobilnych".
   ============================================================ */

/* M1: .search miało min-width:240px, na ekranach <360px overflow.
   Pozwalamy się zwinąć do pełnej szerokości toolbara. */

/* M3: Małe ekrany — page miało dziedziczone 24px paddingu z @1100,
   na 320-360px to za dużo (zostaje za mało miejsca na content). */

/* M4: Profile-stat-value (22px font) z długimi liczbami wylewał się
   z grid komórki. min-width:0 + ellipsis. */
.profile-stat-value {
  font-size: var(--fs-2xl);
  font-weight: var(--fw-semibold);
  letter-spacing: -0.02em;
  line-height: 1.1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.profile-stats {
  display: grid;
  /* auto-fit: 5 kafli w jednym rzędzie na desktopie (z repeat(4) piąty „Do zapłaty"
     spadał samotnie do drugiego rzędu) */
  grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 10px;
  margin-bottom: 16px;
  min-width: 0;
}
.profile-stat {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 12px 14px;
  min-width: 0;
}

/* M5: status badge cleanup — zastąpiony przez .tag w sekcji 10. */
/* M9: Mikrotypografia (12.5px inline w drawerze, daily.html itd.) jest
   nieczytelna na małych ekranach. Wymuszamy minimum 13px dla .dim-12
   i .drawer-body p na mobile. */

/* M10: iPhone z notchem zasłania bottom-nav. safe-area-inset-bottom. */
.bottom-nav {
  display: none;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  /* W repo NIE MA globalnego resetu `box-sizing: border-box`, więc `left:0
     right:0` ustawia szerokość TREŚCI na szerokość ekranu, a `padding: 0 4px`
     dokłada do niej 8px. Pasek miał więc 398px na ekranie 390px. Nie było tego
     widać, bo `overflow-x: clip` na body przycinało nadmiar; po zdjęciu clipa
     (żeby strona miała jeden kontener przewijania) skan pokazał to na 37
     stronach. Kandydat na globalny reset jest w docs/BACKLOG.md - tu wystarczy
     punktowo, bez ruszania układu całej aplikacji na koniec rundy. */
  box-sizing: border-box;
  /* Sam box-sizing nie wystarczył - pozycje paska nadal wychodziły 8px za
     krawędź. Nieważne, co je rozpycha: pasek jest `fixed`, więc NIE MA prawa
     powodować poziomego przewijania całej strony. Przycięcie u źródła jest
     tu poprawne semantycznie (to belka, nie treść) i odporne na to, co ktoś
     jeszcze do niej wstawi. */
  overflow: hidden;
  height: calc(var(--bottom-nav-h) + env(safe-area-inset-bottom, 0px));
  padding: 0 4px env(safe-area-inset-bottom, 0px);
  background: var(--surface);
  border-top: 1px solid var(--outline-variant);
  z-index: var(--z-bottom-nav);
  box-shadow: 0 -4px 24px oklch(0 0 0 / 0.06);
  align-items: stretch;
  gap: 2px;
  overflow-x: clip;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
  padding-bottom: max(8px, env(safe-area-inset-bottom));
}

/* M-extra: drawer + modal też powinny respektować safe-area na iOS,
   żeby przyciski w stopce drawera nie wpadały pod home-bar. */

/* M-extra: kolumna .contact (telefon + email) na desktopie ma długie
   maile bez break-anywhere — overflow do horizontal scroll.
   Permitujemy łamanie maila po @ i kropce. */
td.contact a,
td.contact .em a {
  word-break: break-word;
  overflow-wrap: break-word;
}
/* Polish 2026-09: numer telefonu w jednej linii (łamał się na 3 wiersze przy 1280px). */
td.contact > a[href^="tel:"] { white-space: nowrap; }

/* M-extra: kanban-card-name miał white-space:nowrap → ucinał długie
   nazwy zgłoszeń. Zmiana na clamp-2-lines (line-clamp). */
.kanban-card-name {
  font-weight: var(--fw-medium);
  font-size: var(--fs-base);
  flex: 1;
  min-width: 0;
  text-overflow: ellipsis;
  white-space: normal;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ============================================================
   9. v3 hotfixes — mobile status badge / dropdown / bottom-nav.
   ============================================================ */

/* F6: status badge — przeniesione do sekcji 10 (v4) używającej .tag. */

/* F9: dropdown menu (Eksport) na mobile lecąca z prawej strony była
   przycinana od lewej. Zmieniamy anchor na prawą krawędź + max-width 92vw. */

/* F10: bottom-nav za mały + zjadany od góry.
   - większa wysokość (62 → 72 px łącznie z safe-area),
   - większe ikony,
   - shadow z góry żeby się odcinał od scrollowanej treści. */

/* ============================================================
   10. v4 — mobile status badge dla /leady używa wprost klasy .tag
   (tej samej co /wspolprace). Zero pseudo-elementów, zero hard
   max-width. Tag jest standardowym chipem z padding i radius.
   ============================================================ */

/* Domyślnie (desktop) ukrywamy badge — select w formie jest widoczny */
.lead-status-tag { display: none; }

/* ============================================================
   11. Strony błędów (404 / 500) — standalone, bez base.html,
   żeby renderowały się nawet gdy kontekst requestu jest zepsuty.
   ============================================================ */
.error-page {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg);
  padding: 24px;
}
.error-card {
  text-align: center;
  max-width: 440px;
}
.error-code {
  font-size: 88px;
  font-weight: var(--fw-black);
  line-height: 1;
  color: var(--primary);
  letter-spacing: -0.03em;
}
.error-title {
  margin: 12px 0 8px;
  font-size: var(--fs-2xl);
  color: var(--text);
}
.error-text {
  margin: 0 0 20px;
  color: var(--text-muted);
  font-size: var(--fs-md);
  line-height: var(--lh-base);
}
.error-text code {
  font-size: var(--fs-base);
  background: var(--surface-2, var(--surface));
  padding: 2px 8px;
  border-radius: var(--shape-sm);
}
/* W-E21 (05.11): strona „Link wygasł” (errors/link.html) - ikona zamiast kodu i kontakt szkoły */
.error-card .error-link-ico { display: inline-grid; place-items: center; margin: 0 auto 4px; }
.error-contact { display: grid; gap: 6px; justify-items: center; margin: 0 0 20px; padding: 0; list-style: none; font-size: var(--fs-md); }
.error-contact li { display: inline-flex; align-items: center; gap: 6px; }
.error-contact a { display: inline-flex; align-items: center; min-height: 44px; color: var(--primary); font-weight: var(--fw-semibold); overflow-wrap: anywhere; }

/* ============================================================
   12. Pager (paginacja list — /leady)
   ============================================================ */
.pager {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 16px 0 8px;
  flex-wrap: wrap;
}
.pager-info {
  font-size: var(--fs-base);
  color: var(--text-muted);
}

/* ============================================================
   13. Strefa rodzica — klasy wyekstrahowane z inline styles (Faza 2.1)
   ============================================================ */

/* ── Utility: marginesy (przeniesione 1:1 z inline) ── */

/* ── Utility: typografia ── */

/* ── Utility: layout ── */

/* ── Nagłówek strony ── */

/* ── Empty state ── */

/* ── Karty: padding warianty ── */

/* ── Modale ── */

/* ── Kalendarz rezerwacji (book + reschedule) ── */

/* ── Pigułki statusu rezerwacji ── */

/* ── student.html (pz-st-) ── */

/* ── book.html (pz-bk-) ── */

/* ── reschedule.html (pz-rs-) ── */

/* ── reservations.html (pz-rv-) ── */

/* ── dashboard.html (pz-db-) ── */

/* ── parent/_base.html (pz-base-) ── */

/* Dashboard rodzica (sekcja Przegląd): główna treść (szeroka) + wąski rail z info.
   Definicja grida przywrócona — zaginęła w refaktorze, przez co main/side stackowały
   się na pełną szerokość. Na mobile (≤900px) wraca do jednej kolumny. */

/* ── Specyficzność: styl inline ustawiał
      `.parent-dash-main/.parent-dash-side .parent-card { padding: 20px 22px; }`
      oraz `... .parent-card-h { margin-bottom: 16px; }` (bez).
      Inline style wygrywał z tymi regułami — poniższe selektory (0-3-0)
      odtwarzają to pierwszeństwo 1:1 dla kart w siatce dashboardu rodzica. ── */
.parent-dash-grid .parent-card.pz-st-cta           { padding: 16px 20px; }
.parent-dash-grid .parent-card.pz-st-hero          { padding: 20px; }
.parent-dash-grid .parent-card.pz-st-complete-card { padding: 24px 16px; }
.parent-dash-grid .parent-card.pz-st-exam-card     { padding: 16px 18px; }
.parent-dash-grid .parent-card.pz-card-14          { padding: 14px 16px; }
.parent-dash-grid .parent-card.pz-card-16          { padding: 16px 18px; }
.parent-dash-grid .parent-card.pz-card-18          { padding: 18px 20px; }
.parent-dash-grid .parent-card.pz-empty-card       { padding: 40px 24px; }

/* ── Panel rodzica: nawigacja sekcji (Przegląd / Pozostałe / Zakończone /
      Płatności). Lewa szyna na desktop, poziome zakładki na mobile. ── */
/* Panel rodzica: nawigacja sekcji żyje w globalnym sidebarze (base.html).
   Tu zostaje sama treść sekcji — pełna szerokość, jeden lewy pasek. */
.parent-sec-shell { display: block; }
.parent-section { min-width: 0; display: flex; flex-direction: column; gap: 16px; }
/* ============================================================
   14. Plany + uczniowie — klasy wyekstrahowane z inline styles (Faza 2.2)
   ============================================================ */
/* ── wspólne ── */

/* ── profil ucznia (pz-sp-) ── */

/* ── raport ucznia (pz-sr-) ── */

/* ── widok planu (pz-pv-) ── */

/* ── wizard planu (pz-pw-) ── */

/* ── warianty warunkowe (plan view + wizard) ── */

/* ============================================================
   15. Panel korepetytora — klasy wyekstrahowane z inline styles (Faza 2.3)
   ============================================================ */
/* ── wspólne wiersze/boxy listowe ── */

/* ── gridy ── */

/* ── typografia / ellipsis ── */

/* ── badge / pigułki ── */

/* ── callouty / karty statusowe ── */

/* ── layout drobne ── */

/* ── warianty warunkowe (tutor) ── */

/* ============================================================
   16. Panel admina — klasy wyekstrahowane z inline styles (Faza 2.4)
   ============================================================ */

/* trends — wykres słupkowy */

/* ============================================================
   17. Pozostałe widoki (topics/collabs/tasks/postings/scrape/leads/auth/public)
   — klasy wyekstrahowane z inline styles (Faza 2.5)
   ============================================================ */

/* Strażnik specyficzności: styl inline ustawiał
   font-family na .input/.textarea — inline style wygrywał, klasa 0-1-0 by
   przegrała. Podwójna klasa (0-2-0) odtwarza pierwszeństwo inline'a. */
.input.pz-font-inherit, .textarea.pz-font-inherit,
.input.pz-font-inherit-0, .textarea.pz-font-inherit-0,
.input.pz-font-inherit-15, .textarea.pz-font-inherit-15 { font-family: inherit; }

/* ============================================================
   18. Polish v1 (Faza 2) — globalne dopieszczenie
   ============================================================ */
/* Nic się nie wylewa: media nigdy szersze niż kontener,
   długie słowa/URL-e łamią się zamiast rozpychać karty */
img, svg, video, canvas { max-width: 100%; }
.card, .parent-card, .modal, .drawer-body, .kanban-card { overflow-wrap: break-word; }

/* Typografia: ciaśniejsze, pewniejsze nagłówki; zbalansowane łamanie */
h1, h2, h3, .page-title, .drawer-title { letter-spacing: -0.015em; text-wrap: balance; }

/* Liczby tabelaryczne — kwoty/liczniki nie skaczą szerokością */
.mono, .stat-value, .kanban-col-count, .pager-info { font-variant-numeric: tabular-nums; }

/* Spójny, wyraźny focus dla klawiatury (nie nadpisuje .btn — ten ma własny) */
a:focus-visible, summary:focus-visible,
input:focus-visible, select:focus-visible, textarea:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
  border-radius: var(--shape-xs);
}

/* Zaznaczenie tekstu w kolorze marki */

/* Subtelne scrollbary (Firefox + WebKit) */
html { scrollbar-width: thin; scrollbar-color: oklch(0.60 0.16 245) transparent; }

/* ============================================================
   19. Design pass v2 — dane w mono, lift kart, gradientowe paski
   ============================================================ */
/* JEDNA czcionka dla wartości danych: terminy lekcji, %, liczniki,
   odliczania, kwoty. Mono + tabular = równo, technicznie, czytelnie. */
.stat-value, .pz-kpi-num, .pz-sv-exam-days,
.pz-st-countdown-num, .pz-st-countdown-today,
.pz-billing-total, .kanban-col-count, .tab-count, .pz-st-streak-val {
  font-family: inherit;   /* jedna rodzina: --font-sans */
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
}

/* Interaktywne karty — subtelny lift przy hover (desktop) */
@media (hover: hover) {
  a.parent-card, a.card, a.stat {
    transition: transform var(--motion-std) var(--ease-std),
                box-shadow var(--motion-std) var(--ease-std);
  }
  a.parent-card:hover, a.card:hover, a.stat:hover {
    transform: translateY(-2px);
    box-shadow: var(--elev-2);
  }
}

/* Paski postępu — gradient zamiast płaskiego koloru */

/* ============================================================
   20. Design pass v4 — oddech + dotyk
   Cel: większe strefy dotyku na mobile (≥44px), luźniejszy rytm
   w kluczowych widokach (hero dziecka, karty lekcji, "Dzisiaj"
   tutora, lista leadów). Nadpisuje sekcje 13-17 (,
   później w pliku = wygrywa przy równej specyficzności).
   ============================================================ */

/* ── Oddech: kluczowe karty i wiersze ── */

/* ── Dotyk: mobile ≥44px tam, gdzie się klika palcem ── */

/* ── Spokój: nagłówki sekcji w kartach oddychają ── */

/* ============================================================
   21. FINAL PASS — kompletna warstwa modernizacyjna (jedna,
   najwyższa w kaskadzie). Wszystko, co dotąd szło transzami,
   domknięte na raz: dashboardy, drawer, tabele, modale, przyciski.
   ============================================================ */

/* ── Przyciski: pill — sygnatura nowoczesnego UI ── */
.icon-btn {
  position: relative;
  width: 40px;
  height: 40px;
  display: inline-grid;
  place-items: center;
  background: none;
  border: none;
  color: var(--text-2);
  flex-shrink: 0;
  cursor: pointer;
  transition: color var(--motion-fast) var(--ease-std);
  border-radius: var(--shape-full);
}

/* ── Pola formularzy: spójne zaokrąglenie, wyraźny focus ── */
.input, .select, .textarea { border-radius: var(--shape-md); }

/* ── Tabele (desktop): nagłówki jako overline, luźniejsze wiersze ── */
table.leads th, .pz-tbl th, .pz-tbl-12 th {
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: .08em;
  font-weight: var(--fw-bold);
  color: var(--text-3);
}
@media (min-width: 901px) {
  table.leads td { padding: 12px 12px; }
  table.leads th { padding-left: 12px; padding-right: 12px; }
  /* KV-APP-AUDYT-2: Montserrat jest szerszy od Intera - imię i e-mail łamały
     się na 3-4 linie, wiersz rósł do 120 px, ostatnia kolumna wypadała za kartę.
     Nazwa w jednej linii, kontakt ucinany wielokropkiem (pełny w szufladzie). */
  table.leads .who-name-row { white-space: nowrap; }
  table.leads .who-extra { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px; }
  table.leads td.contact a { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 190px; }
  table.leads td.subj { min-width: 130px; }
}

/* ── Drawer (lead/zadanie/temat): czytelne sekcje, lepszy rytm ── */
.drawer-head {
  padding: 18px 24px;
  border-bottom: 1px solid var(--outline-variant);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  flex-shrink: 0;
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--surface);
}
.drawer-body section + section { margin-top: 4px; padding-top: 14px; border-top: 1px solid var(--outline-variant); }
.dr-label {
  margin-bottom: 2px;
  font-size: var(--fs-2xs);
  text-transform: uppercase;
  letter-spacing: .07em;
  color: var(--text-3);
  font-weight: var(--fw-semibold);
}
.timeline > div { border-radius: var(--shape-md); }

/* ── Dashboardy (tutor/admin): KPI z oddechem ── */

.stat, .card.pz-ta-center { border-radius: var(--shape-lg); }

/* ── Kanban: karty miękkie, kolumny z oddechem ── */

.kanban-col-body {
  flex: 1;
  padding: 10px;
  display: flex;
  flex-direction: column;
  min-height: 60px;
  gap: 10px;
}
.kanban-ghost {
  background: var(--c-new-bg);
  border: 1px dashed var(--accent);
  opacity: .35;
  transform: rotate(2deg);
}

/* ── Modale: większy radius, oddech w stopce ── */
.modal {
  border: none;
  padding: 0;
  width: 560px;
  max-width: 96vw;
  max-height: 90vh;
  overflow: hidden;
  background: var(--surface);
  color: var(--text);
  box-shadow: var(--elev-5);
  border-radius: var(--shape-xl);
}
.modal-foot { padding-top: 14px; gap: 10px; }

/* ── Empty states: wyśrodkowane, łagodne ── */
.empty, .pz-empty-card, .pz-empty-dashed { border-radius: var(--shape-lg); }
.empty-title {
  color: var(--text);
  margin-bottom: 6px;
  font-size: var(--fs-lg);
  font-weight: var(--fw-bold);
}

/* ── Toasty ── */
.toast {
  position: fixed;
  left: 50%;
  bottom: 90px;
  transform: translate(-50%, 60px);
  background: oklch(0.22 0.015 255);
  color: oklch(0.95 0 0);
  padding: 12px 20px;
  font-size: var(--fs-base);
  font-weight: var(--fw-medium);
  opacity: 0;
  transition: transform var(--motion-std) var(--ease-emph), box-shadow var(--motion-std) var(--ease-emph), background-color var(--motion-std) var(--ease-emph), border-color var(--motion-std) var(--ease-emph), color var(--motion-std) var(--ease-emph), opacity var(--motion-std) var(--ease-emph);
  z-index: var(--z-toast);
  pointer-events: none;
  max-width: 92vw;
  border-radius: var(--shape-full);
  box-shadow: var(--elev-3);
}

/* ── Strona logowania: karta z głębią ── */
.login-card {
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  padding: 40px 36px;
  width: 100%;
  max-width: 400px;
  border-radius: var(--shape-xl);
  box-shadow: var(--shadow-card-lg);
}

/* ── Okruszki w górnym pasku (KV-APP-OKRUSZKI 08.10) ──
   Dom (kafelek jak przyciski-ikony) › sekcja (link) › bieżąca strona (pogrubiona).
   Długie nazwy ucinane wielokropkiem - pasek nigdy się nie zawija. */
.crumbs {
  color: var(--text-3);
  display: flex;
  gap: 4px;
  align-items: center;
  min-width: 0;
  flex: 1 1 auto;
  font-size: var(--fs-base);
  font-weight: var(--fw-semibold);
}
.crumbs-home {
  display: inline-grid; place-items: center; flex: none;
  width: 32px; height: 32px; border-radius: var(--shape-md);
  color: var(--text-2); background: var(--surface); border: 1px solid var(--border);
  box-shadow: var(--shadow-xs);
  transition: color var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std);
}
.crumbs-home .material-symbols-outlined { font-size: var(--fs-xl); font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 20; }
.crumbs-home:hover { color: var(--primary); border-color: var(--primary-ring); }
.crumbs-sep {
  color: var(--text-3);
  opacity: .6;
  font-size: var(--fs-xl);
  flex: none;
}
.crumbs-link, .crumbs-mid, .crumbs-current {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  padding: 4px 6px; border-radius: var(--shape-sm);
}
.crumbs-link { color: var(--text-2); flex: 0 1 auto; }
.crumbs-link:hover { color: var(--primary); background: var(--state-hover-primary); }
.crumbs-current { color: var(--text); font-weight: var(--fw-bold); flex: 0 1 auto; }

/* ── Sticky notes / callouty: miększe rogi ── */

/* ── Dostępność ruchowa: szanujemy prefers-reduced-motion ── */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms;
    animation-iteration-count: 1;
    transition-duration: 0.01ms;
    scroll-behavior: auto;
  }
}

/* ============================================================
   22. ANTY-OVERFLOW (mobile) — twarde domknięcie poziomu strony
   ============================================================ */
/* Strona NIGDY nie scrolluje w bok — wewnętrzne scrollery (.stats,
   .pz-scroll-x, kanban) działają dalej, bo mają własny overflow-x. */
/* `overflow-x: clip` TYLKO na <html>. Wcześniej było na obu i to tworzyło DWA
   kontenery przewijania jednocześnie (gdy jedna oś to clip, druga liczy się jak
   auto - więc i html, i body stawały się scrollerami z tą samą wysokością
   treści). Skan mobile pokazał skutek: elementy z dolną krawędzią POZA
   `scrollHeight` dokumentu, przy stronie przewiniętej maksymalnie - czyli
   treść, do której nie da się dojechać. Przycinanie w poziomie na korzeniu
   wystarcza; pilnuje tego reguła `rozjazd`, która jest blokująca. */
html {
  overflow-x: clip;
}

html, body {
  margin: 0;
  padding: 0;
}

/* ============================================================
   23. Pass B — skeleton loading + lejek leadów
   ============================================================ */
.skeleton {
  background: linear-gradient(90deg, var(--surface-2) 25%, var(--surface-3, var(--surface)) 50%, var(--surface-2) 75%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.2s ease-in-out infinite;
  border-radius: var(--shape-sm);
}
@keyframes skeleton-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
.skeleton-title { height: 22px; width: 45%; margin-bottom: 16px; }
.skeleton-line  { height: 13px; margin-bottom: 10px; }
.skeleton-line.w-60 { width: 60%; }
.skeleton-block { height: 120px; margin-top: 16px; }

.funnel-row   { display: flex; align-items: center; gap: 12px; }
.funnel-label { width: 110px; flex-shrink: 0; font-size: var(--fs-base); display: flex; align-items: center; gap: 6px; }
.funnel-track { flex: 1; height: 22px; background: var(--surface-2); border-radius: var(--shape-sm); overflow: hidden; }
.funnel-bar   { height: 100%; border-radius: var(--shape-sm); transition: width .6s var(--ease-std, ease); min-width: 2px; }
.funnel-bar--new  { background: var(--c-new); }
.funnel-bar--prog { background: var(--c-prog); }
.funnel-bar--ok   { background: var(--c-ok); }
.funnel-bar--rej  { background: var(--c-rej); }
.funnel-num   { width: 44px; text-align: right; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }

/* C1: dzwoneczek w topbarze */
.topbar-bell { position: relative; }

/* ============================================================
   24. P4 Premium feel — view transitions, puls, hover, mesh
   ============================================================ */
/* Płynne przejścia między stronami (MPA cross-fade; starsze przeglądarki ignorują) */
@view-transition { navigation: auto; }
::view-transition-old(root), ::view-transition-new(root) { animation-duration: 160ms; }

/* Pulsowanie elementów "oczekujących" — delikatny oddech */
@keyframes pulse-soft {
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--c-prog) 45%, transparent); }
  50%      { box-shadow: 0 0 0 5px color-mix(in srgb, var(--c-prog) 0%, transparent); }
}

.bell-badge {
  position: absolute;
  top: 2px;
  right: 2px;
  background: var(--c-rej);
  color: #fff;
  font-size: var(--fs-2xs);
  font-weight: var(--fw-bold);
  line-height: 1;
  padding: 3px 5px;
  border-radius: var(--shape-full);
  min-width: 16px;
  text-align: center;
  font-variant-numeric: tabular-nums;
  animation: pulse-soft 2.2s ease-in-out 3;
}

/* Hover wiersza: akcentowy pasek z lewej (bez przesuwania layoutu) */
table.leads tr.row:hover td:first-child { box-shadow: inset 3px 0 0 var(--primary); }

/* Topbar nabiera cienia dopiero po scrollu */

.topbar.scrolled { box-shadow: 0 4px 18px oklch(0 0 0 / 0.08); }

/* Taby: płynniejsze przejścia wskaźnika */
.tab {
  position: relative;
  background: none;
  border: none;
  padding: 12px 18px;
  font-size: var(--fs-base);
  color: var(--text-2);
  font-weight: var(--fw-medium);
  cursor: pointer;
  margin-bottom: -1px;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 44px;
  transition: color var(--motion-std) var(--ease-std);
}
.tab::after {
  content: '';
  position: absolute;
  left: 8px;
  right: 8px;
  bottom: -1px;
  height: 3px;
  background: var(--primary);
  border-radius: 3px 3px 0 0;
  transform: scaleX(0);
  transform-origin: center;
  transition: transform var(--motion-std) var(--ease-emph, var(--ease-std)), opacity var(--motion-std) var(--ease-std);
}

/* Gradient-mesh za nagłówkiem strony — subtelna sygnatura marki */
.page-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 24px;
  margin-bottom: 24px;
  flex-wrap: wrap;
  position: relative;
}

@media (prefers-reduced-motion: reduce) {
  .pz-status-pill--pending, .bell-badge { animation: none; }
}

/* Sortowanie kolumn (leady) */
.th-sort { color: inherit; text-decoration: none; }
.th-sort:hover { color: var(--primary); }

/* ============================================================
   25. FullCalendar — theming tokenami (fix: granatowe przyciski
   FC wyglądały jak "czarne kafle" w jasnym motywie) + mobile
   ============================================================ */
#calendar {
  --fc-page-bg-color: transparent;
  --fc-border-color: var(--outline-variant);
  --fc-button-bg-color: var(--surface-2);
  --fc-button-border-color: var(--outline-variant);
  --fc-button-text-color: var(--text);
  --fc-button-hover-bg-color: color-mix(in srgb, var(--primary) 12%, var(--surface-2));
  --fc-button-hover-border-color: var(--outline-variant);
  --fc-button-active-bg-color: var(--primary);
  --fc-button-active-border-color: var(--primary);
  --fc-today-bg-color: color-mix(in srgb, var(--primary) 7%, transparent);
  --fc-event-bg-color: var(--primary);
  --fc-event-border-color: transparent;
  --fc-event-text-color: #fff;
  --fc-list-event-hover-bg-color: var(--state-hover, var(--surface-2));
  --fc-neutral-bg-color: var(--surface-2);
}
#calendar .fc-button { border-radius: var(--shape-full); text-transform: none; font-weight: var(--fw-semibold); }
/* Kontrast aktywnego przycisku toolbara (zgłoszenie: „ciemne tło, ciemny tekst").
   FullCalendar dla stanu active używa --fc-button-text-color (= ciemny var(--text)),
   więc nadpisujemy OBA stany z twardym !important — niezależnie od kolejności reguł. */
#calendar .fc-button-primary:not(:disabled).fc-button-active,
#calendar .fc-button-primary:not(:disabled):active { color: var(--on-primary) !important; }
#calendar .fc-toolbar-title { font-size: var(--fs-xl); letter-spacing: -0.01em; }
#calendar .fc-event { border-radius: var(--shape-sm); font-size: var(--fs-sm); cursor: pointer; }
#calendar .fc-col-header-cell-cushion, #calendar .fc-daygrid-day-number,
#calendar .fc-list-day-text, #calendar .fc-list-day-side-text { color: var(--text); text-decoration: none; }
#calendar .fc-timegrid-slot-label, #calendar .fc-timegrid-axis-cushion { color: var(--text-3); font-size: var(--fs-xs); }

/* Toolbar filtrów nad kalendarzem */
.cal-toolbar { display: flex; align-items: flex-end; gap: 14px; flex-wrap: wrap; }
.cal-toolbar .field { min-width: 180px; }
/* KAL-1: jeden kalendarz — menu „Warstwy", przełącznik malowania, skrót do panelu */
.cal-toolbar-sp { flex: 1 1 0; }
.cal-toolbar-card { position: relative; z-index: var(--z-sticky); }
.cal-layers { position: relative; }
.cal-layers > summary { list-style: none; }
.cal-layers > summary::-webkit-details-marker { display: none; }
.cal-layers-count { display: inline-flex; min-width: 20px; justify-content: center; padding: 0 6px; border-radius: var(--shape-full); background: var(--surface-3); color: var(--text-2); font-size: var(--fs-sm); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.cal-layers-panel { position: absolute; z-index: var(--z-dropdown); top: calc(100% + 6px); left: 0; min-width: 240px; display: grid; gap: 4px; padding: 10px 12px; border: 1px solid var(--outline-variant); border-radius: var(--shape-md); background: var(--surface); box-shadow: var(--elev-3, 0 8px 24px rgba(0,0,0,.14)); }
.cal-layers-panel .pz-check-inline { min-height: 36px; }
.cal-paint { display: inline-flex; align-items: center; gap: 10px; min-height: 40px; padding: 0 12px 0 8px; border: 1px solid var(--outline-variant); border-radius: var(--shape-sm); background: var(--surface); font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--text-2); cursor: pointer; user-select: none; }
.cal-paint input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.cal-paint-track { position: relative; width: 34px; height: 20px; border-radius: var(--shape-full); background: var(--surface-4); transition: background var(--motion-fast, .15s); flex: none; }
.cal-paint-track::after { content: ""; position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--surface); box-shadow: 0 1px 2px rgba(0,0,0,.25); transition: transform var(--motion-fast, .15s); }
.cal-paint:has(input:checked) { border-color: color-mix(in srgb, var(--c-ok) 55%, transparent); background: var(--c-ok-bg); color: var(--c-ok); }
.cal-paint input:checked + .cal-paint-track { background: var(--c-ok); }
.cal-paint input:checked + .cal-paint-track::after { transform: translateX(14px); }
.cal-paint input:focus-visible + .cal-paint-track { outline: 2px solid var(--primary); outline-offset: 2px; }
.cal-paint.is-disabled { opacity: .55; cursor: not-allowed; }
.cal-paint-hint { margin-top: 8px; }
.cal-paint-hint[hidden], .ce-error[hidden], .week-off-btn[hidden] { display: none; }
.pool-group-tutor { font-weight: var(--fw-medium); color: var(--text-3); }
.btn.cal-pool-jump { display: none; }
@media (max-width: 900px) { .btn.cal-pool-jump { display: inline-flex; } }
/* Telefon: narzędzia parami w wierszu (Warstwy + malowanie, panel + lekcja) zamiast
   czterech wierszy nad siatką. */
@media (max-width: 700px) {
  .cal-toolbar { gap: 8px; }
  .cal-toolbar-sp { display: none; }
  .cal-toolbar > .cal-layers, .cal-toolbar > .cal-paint,
  .cal-toolbar > .cal-pool-jump, .cal-toolbar > #cal-add-btn { flex: 1 1 calc(50% - 4px); justify-content: center; }
  .cal-layers > summary { width: 100%; justify-content: center; }
  .cal-paint { padding: 0 8px; gap: 8px; }
}

/* Legenda */
.cal-legend { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--outline-variant); font-size: var(--fs-sm); color: var(--text-2); }
.cal-google-refresh { margin-left: 8px; }   /* GCAL-ODSWIEZ: przycisk w legendzie */
.cal-google-refresh[hidden] { display: none; }
.cal-dot { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 5px; vertical-align: -1px; }
.cal-dot[data-c="pending"]     { background: var(--cal-pending); }
/* Tokeny zamiast hexów — legenda musi zmieniać się razem z dark mode. */
.cal-dot[data-c="done"]        { background: var(--cal-done); }
.cal-dot[data-c="rescheduled"] { background: var(--cal-rescheduled); }
.cal-dot[data-c="skipped"]     { background: var(--cal-skipped); }
.cal-dot[data-c="trial"]       { background: var(--cal-trial); }
.cal-dot[data-c="av"]          { background: var(--cal-av); border: 1px solid var(--cal-done); }
.cal-dot[data-c="busy"]        { background: repeating-linear-gradient(45deg, var(--cal-busy) 0 3px, transparent 3px 6px); border: 1px solid var(--cal-busy); }
/* TYDZIEN-1: „Mój tydzień" — przycisk dnia wolnego w nagłówku dnia + toast */
.week-off-btn { display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; margin-left:6px; border:1px solid var(--outline-variant); border-radius: var(--shape-sm); background:var(--surface); color:var(--text-3); cursor:pointer; vertical-align:middle; }
.week-off-btn .material-symbols-outlined { font-size: var(--fs-lg); }
.week-off-btn:hover, .week-off-btn:focus-visible { color:var(--c-rej); border-color:var(--c-rej); }
.week-off-btn.is-off { background:var(--c-rej-bg, color-mix(in srgb, var(--c-rej) 15%, transparent)); color:var(--c-rej); border-color:var(--c-rej); }
#calendar .fc-col-header-cell-cushion { display:inline-block; }
#calendar .fc-highlight { background: color-mix(in srgb, var(--primary) 22%, transparent); }
.week-toast { position:fixed; left:50%; bottom:calc(var(--bnav-h, 64px) + 12px); transform:translateX(-50%); max-width:min(92vw, 520px); padding:10px 14px; border-radius: var(--shape-md); background:var(--surface-2); color:var(--text); box-shadow:var(--shadow-2, 0 6px 24px rgba(0,0,0,.18)); font-size: var(--fs-base); z-index: var(--z-toast); border-left:4px solid var(--c-ok); }
.week-toast[data-kind="warn"] { border-left-color: var(--c-warn); }
.week-toast[data-kind="err"] { border-left-color: var(--c-rej); }
@media (max-width:700px) { .week-off-btn { width:36px; height:36px; } }
/* TYDZIEN-2: układ siatka + panel „Do ułożenia" */
.week-layout { display:grid; grid-template-columns: minmax(0,1fr) 280px; gap:14px; align-items:start; }
.week-pool { position:sticky; top:12px; max-height:calc(100vh - 24px); overflow:auto; }
.pool-head { margin-bottom:10px; }
.pool-group { margin-top:8px; }
.pool-group-h { display:flex; align-items:center; gap:8px; padding:8px 6px; border-radius: var(--shape-sm); font-size: var(--fs-base); font-weight: var(--fw-bold); color:var(--text); cursor:pointer; list-style:none; }
.pool-group-h::-webkit-details-marker { display:none; }
.pool-group-h::before { content:''; width:0; height:0; border-left:5px solid var(--text-3); border-top:4px solid transparent; border-bottom:4px solid transparent; transition:transform .15s; flex:none; }
.pool-group[open] > .pool-group-h::before { transform:rotate(90deg); }
.pool-group-h:hover { background:var(--surface-2); }
.pool-group-name { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pool-group-count { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color:var(--text-2); background:var(--surface-2); padding:2px 8px; border-radius: var(--shape-full); flex:none; }
.pool-item { display:flex; align-items:center; gap:4px; padding:0 4px 0 0; margin-bottom:6px; border:1px solid var(--outline-variant); border-left:4px solid var(--primary); border-radius: var(--shape-sm); background:var(--surface); cursor:grab; user-select:none; }
.pool-item:hover, .pool-item:focus-within { border-color:var(--primary); outline:none; box-shadow:0 0 0 2px color-mix(in srgb, var(--primary) 25%, transparent); }
.pool-item:active { cursor:grabbing; }
.pool-item-main { flex:1; min-width:0; min-height:44px; display:flex; flex-direction:column; justify-content:center; padding:6px 10px; border:0; background:none; color:inherit; font:inherit; text-align:left; cursor:inherit; border-radius: var(--shape-sm); }
.pool-item-main:focus-visible { outline:none; }
.pool-item-t { font-size: var(--fs-base); font-weight: var(--fw-semibold); color:var(--text); }
.pool-item-m { display:block; font-size: var(--fs-xs); color:var(--text-3); margin-top:2px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pool-item-t { display:flex; align-items:center; gap:6px; }
.pool-item-open { flex:none; display:inline-flex; width:24px; height:24px; align-items:center; justify-content:center; border-radius: var(--shape-xs); color:var(--text-3); }
.pool-item-open .material-symbols-outlined { font-size: var(--fs-lg); }
.pool-item-open:hover, .pool-item-open:focus-visible { color:var(--primary); background:var(--surface-2); }
/* Pula „Do ułożenia": na szerokim ekranie przykleja się i przewija sama
   (max-height + overflow). Na wąskim traci max-height - i wtedy `overflow:auto`
   nie daje już nic poza pudełkiem przycinającym, które sięgało pod dolny pasek
   nawigacji (skan mobile: elementy puli z dolną krawędzią na 786-872px przy
   pasku od 780px). Na telefonie pula płynie razem ze stroną. */
@media (max-width:900px) {
  .week-layout { grid-template-columns:1fr; }
  /* Element siatki ma domyślnie `min-width:auto`, więc kolumna rozpycha się do
     szerokości min-content swojego dziecka. Tu tym dzieckiem jest kalendarz,
     który ma własną minimalną szerokość - i cała strona „Mój tydzień" robiła
     się 437px na ekranie 390px (legenda, nagłówki i podpowiedź puli wystawały
     o 47px). Do momentu, aż skan zdjął z puli `overflow:auto`, ten rozjazd był
     schowany za kontenerem przycinającym, więc nikt go nie widział w raporcie
     - tylko na telefonie. */
  .week-layout > * { min-width: 0; }
  .week-pool { position:static; max-height:none; overflow:visible; }
}
.cal-dot[data-c="off"]         { background: repeating-linear-gradient(135deg, var(--cal-off) 0 3px, transparent 3px 6px); border: 1px solid var(--cal-skipped); }
/* TYDZIEN-3: rezerwacje oczekujące (nieruszalne, kreskowane — „czeka na decyzję"), dialogi lekcji/układania */
.cal-dot[data-c="booking"]     { background: repeating-linear-gradient(135deg, var(--cal-booking) 0 3px, transparent 3px 6px); border:1px dashed var(--cal-booking); }
/* Kafelki kalendarza z klas feedu (`classNames` w routes/api/calendar.py), nie z hexów:
   status lekcji, próbna, rezerwacja i tła warstw rozpoznawalne na pierwszy rzut oka. */
#calendar .cal-ev--pending     { --cal-c: var(--cal-pending); }
#calendar .cal-ev--done        { --cal-c: var(--cal-done); }
#calendar .cal-ev--rescheduled { --cal-c: var(--cal-rescheduled); }
#calendar .cal-ev--skipped     { --cal-c: var(--cal-skipped); }
#calendar .cal-ev--trial       { --cal-c: var(--cal-trial); }
/* 14.09 (zgłoszenie „zrealizowane nie są zielone, wszystko niebieskie"): app.css
   siedzi w @layer components, a style FullCalendara wstrzykuje skrypt BEZ warstwy -
   styl spoza warstw wygrywa z każdą warstwą niezależnie od specyficzności, więc
   `background` z tych reguł nigdy nie działał (kafelki brały domyślny
   --fc-event-bg-color). Kolory idą przez zmienne, które FullCalendar sam czyta. */
#calendar .fc-event.cal-ev {
  --fc-event-bg-color: var(--cal-c); --fc-event-border-color: var(--cal-c);
  --fc-event-text-color: var(--cal-ev-text);
  color: var(--cal-ev-text); font-weight: var(--fw-semibold);
}
#calendar .fc-event.cal-ev .fc-event-main, #calendar .fc-event.cal-ev .fc-event-title { color: inherit; }
#calendar .fc-event.cal-ev--done { --fc-event-bg-color: var(--cal-done); }
#calendar .fc-event.cal-ev--skipped .fc-event-title { text-decoration: line-through; text-decoration-thickness: 1px; }
#calendar .fc-event.cal-ev--booking {
  --cal-c: var(--cal-booking);
  --fc-event-bg-color: var(--surface); --fc-event-border-color: var(--cal-booking); --fc-event-text-color: var(--text);
  background-image: repeating-linear-gradient(135deg, color-mix(in srgb, var(--cal-booking) 26%, transparent) 0 6px, transparent 6px 12px);
  outline: 2px dashed var(--cal-booking); outline-offset: -2px; color: var(--text);
}
#calendar .fc-daygrid-dot-event.cal-ev { background: transparent; color: var(--text); font-weight: var(--fw-medium); }
#calendar .fc-daygrid-dot-event.cal-ev .fc-event-title, #calendar .fc-daygrid-dot-event.cal-ev .fc-event-time { color: var(--text); }
#calendar .fc-list-event.cal-ev { background: transparent; color: var(--text); border: 0; }
#calendar .fc-bg-event.cal-bg--av   { --fc-bg-event-color: var(--cal-av); --fc-bg-event-opacity: 1; box-shadow: inset 3px 0 0 var(--cal-done); border-radius: 0; }
#calendar .fc-bg-event.cal-bg--off, #calendar .fc-bg-event.cal-bg--busy { --fc-bg-event-color: transparent; --fc-bg-event-opacity: 1; border-radius: 0; }
#calendar .fc-bg-event.cal-bg--off::after, #calendar .fc-bg-event.cal-bg--busy::after { content: ""; position: absolute; inset: 0; pointer-events: none; }
#calendar .fc-bg-event.cal-bg--off::after  { background: repeating-linear-gradient(135deg, var(--cal-off) 0 8px, transparent 8px 14px); }
#calendar .fc-bg-event.cal-bg--busy::after { background: repeating-linear-gradient(45deg, var(--cal-busy) 0 6px, transparent 6px 12px); }
#week-lesson .btn[hidden], #week-lesson-hint[hidden] { display: none; }
#week-lesson .modal-foot, #week-place .modal-foot { flex-wrap: wrap; }

/* Edytor tematów lekcji — jedna lista wielokrotnego wyboru (faza 4) */
.lesson-topics-form { margin-bottom: 6px; }

/* Picker tematów lekcji (PICKER-SZUKAJ) — szukanie jest główną drogą.

   Poprzedni układ: okno 260 px z suwakiem NA STAŁE, w nim kilkadziesiąt
   zwiniętych działów o identycznej wadze, każdy wersalikami i z własną kreską
   pod spodem. Zgłoszenie właściciela brzmiało „ociężały, ciężko się na niego
   patrzy" i było trafne: wersaliki niszczą kształt słowa, czterdzieści kresek
   robi ze zwijanej listy szrafowanie, a scroll w scrollu daje lufkę na dane.
   Teraz lista trafień ma tyle wierszy, ile trzeba, a drzewo jest schowane. */
.topics-picker { display: flex; flex-direction: column; gap: 8px; margin-bottom: 4px; }

.tp-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }

/* Zakres poziomu jako segmenty: wszystkie opcje i ta aktywna widoczne naraz,
   bez otwierania listy — jeden rząd zamiast selecta plus jego rozwinięcia. */
.tp-scope { display: flex; gap: 2px; padding: 2px; background: var(--surface-2);
  border-radius: var(--shape-full); max-width: 100%; overflow-x: auto; }
.tp-scope-btn { border: 0; background: transparent; color: var(--text-2); font: inherit;
  font-size: var(--fs-sm); padding: 4px 11px; border-radius: var(--shape-full); cursor: pointer;
  white-space: nowrap; transition: background var(--motion-fast) var(--ease-std), color var(--motion-fast) var(--ease-std); }
.tp-scope-btn[aria-pressed="true"] { background: var(--surface); color: var(--text);
  font-weight: var(--fw-semibold); box-shadow: var(--elev-1); }

.tp-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.tp-chip { display: inline-flex; align-items: center; gap: 6px; border: 0;
  background: var(--primary-container); color: var(--on-primary-container);
  border-radius: var(--shape-full); padding: 5px 6px 5px 11px;
  font: inherit; font-size: var(--fs-sm); font-weight: 550; cursor: pointer; }
.tp-chip-x { display: grid; place-items: center; width: 17px; height: 17px;
  border-radius: 50%; background: oklch(0 0 0 / 0.10); font-size: var(--fs-sm); line-height: 1; }
.tp-chip:hover .tp-chip-x { background: oklch(0 0 0 / 0.20); }
html.dark .tp-chip-x { background: oklch(1 0 0 / 0.14); }
html.dark .tp-chip:hover .tp-chip-x { background: oklch(1 0 0 / 0.24); }

.tp-combo { position: relative; }
.tp-input { width: 100%; }
.tp-hits { list-style: none; margin: 6px 0 0; padding: 4px; display: flex; flex-direction: column;
  gap: 1px; border: 1px solid var(--border); border-radius: var(--shape-sm); background: var(--surface); }
.tp-hits[hidden] { display: none; }
.tp-hit { display: flex; align-items: baseline; gap: 10px; padding: 8px 10px;
  border-radius: var(--shape-xs); cursor: pointer; }
.tp-hit[data-tp-active="true"] { background: var(--state-hover); }
.tp-hit-title { font-size: var(--fs-base); }
.tp-hit-title mark { background: transparent; color: var(--primary); font-weight: var(--fw-bold); }
.tp-hit-where { margin-left: auto; font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; }
.tp-hits-empty { display: flex; flex-direction: column; gap: 8px; align-items: flex-start;
  padding: 12px 10px; font-size: var(--fs-base); color: var(--text-2); }
.tp-linkish { background: 0; border: 0; padding: 0; font: inherit; font-size: var(--fs-base);
  color: var(--primary); font-weight: var(--fw-semibold); cursor: pointer; text-align: left; }

.tp-browse > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 6px;
  font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-2); padding: 6px 0; }
.tp-browse > summary::-webkit-details-marker { display: none; }
.tp-browse > summary::before { content: "\25B8"; color: var(--text-3); font-size: var(--fs-xs);
  transition: transform var(--motion-fast) var(--ease-std); }
.tp-browse[open] > summary::before { transform: rotate(90deg); }
/* `auto`, nie `scroll`: suwak pojawia się, gdy jest co przewijać. */
.tp-tree { max-height: 46vh; overflow-y: auto; padding: 4px;
  border: 1px solid var(--border); border-radius: var(--shape-sm); background: var(--surface); }
.tp-lvl { font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--text-3); padding: 10px 8px 4px; }
/* Nazwa działu NORMALNĄ wielkością liter (numer i wersaliki ścina filtr
   `dzial`) — bez `text-transform`, bo to była połowa problemu. */
.tp-cat > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 7px;
  padding: 7px 8px; border-radius: var(--shape-xs); font-size: var(--fs-base); color: var(--text-2); }
.tp-cat > summary::-webkit-details-marker { display: none; }
.tp-cat > summary:hover { background: var(--surface-2); }
.tp-cat > summary::before { content: "\25B8"; color: var(--text-3); font-size: var(--fs-2xs);
  transition: transform var(--motion-fast) var(--ease-std); }
.tp-cat[open] > summary::before { transform: rotate(90deg); }
.tp-count { margin-left: auto; color: var(--text-3); font-size: var(--fs-sm); }
.tp-item { display: flex; align-items: center; gap: 9px; padding: 7px 8px 7px 25px;
  border-radius: var(--shape-xs); cursor: pointer; font-size: var(--fs-base); line-height: 1.3; }
.tp-item:hover { background: var(--surface-2); }
.tp-item input { flex-shrink: 0; cursor: pointer; }
.tp-item-title { flex: 1; min-width: 0; }

.tp-foot { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
/* Podpowiedź klawiszy nie ma sensu tam, gdzie nie ma klawiatury. */
@media (hover: none) { .tp-keys { display: none; } }

/* Sekcje listy lekcji: Niezrealizowane / Zrealizowane (faza 4) */

/* Mobile: mniejsze fonty, toolbar w pionie, eventy czytelne */

/* ============================================================
   26. Fala 3b — pola edycji w drawerach nie wylewają się
   (inputy mają intrinsic width; w gridach 2-kol drawera 560px
   wymuszały overflow). Obowiązuje na KAŻDEJ szerokości.
   ============================================================ */
.field .input, .field .select, .field .textarea,
.pz-grid-2-10 .input, .pz-grid-2-10 .select, .pz-grid-2-10 .textarea,
.pz-grid-2-12 .input, .pz-grid-2-12 .select, .pz-grid-2-12 .textarea {
  width: 100%;
  min-width: 0;
  max-width: 100%;
  box-sizing: border-box;
}

.drawer-body .field { min-width: 0; }
/* Wąski drawer (<=640px viewport albo zawsze w drawerze przy 2 kolumnach
   z długimi labelami): pozwól gridowi łamać do 1 kolumny gdy ciasno */
.drawer-body .pz-grid-2-10, .drawer-body .pz-grid-2-12 {
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
/* E3: lekcje w siatce — wyraźna separacja gdy obok siebie */
#calendar .fc-timegrid-event { box-shadow: 0 0 0 1.5px var(--surface); border-radius: var(--shape-sm); }
#calendar .fc-timegrid-event .fc-event-main { padding: 2px 4px; }
/* UX: skompresowany kalendarz — niższe pasy slotów (30-min slot = 22px,
   godzina = 44px zamiast ~96px przy starych 15-min slotach). */
#calendar .fc-timegrid-slot { height: 22px; }
/* UX: nazwa na kafelku zawija się w 2 linie zamiast się przycinać
   (godzina zdjęta z kafelka — displayEventTime:false; jest w dymku). */
#calendar .fc-timegrid-event .fc-event-title {
  white-space: normal; line-height: 1.25; font-weight: var(--fw-semibold);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

/* UX: rozdzielone pola data+godzina (modale kalendarza) */
.dt-split { display: flex; gap: 8px; }
.dt-split input[type="date"] { flex: 1.3; min-width: 0; }
.dt-split .dt-time { flex: 1; min-width: 84px; }

/* UX: edycja raty w wierszu — ołówek otwiera popover pod wierszem */
.pz-inst-edit { position: relative; }
.pz-inst-edit > summary { list-style: none; cursor: pointer; }
.pz-inst-edit > summary::-webkit-details-marker { display: none; }
.pz-inst-edit[open] > summary { color: var(--accent); }
.pz-inst-edit-pop {
  position: absolute; right: 0; top: calc(100% + 6px); z-index: var(--z-dropdown);
  display: flex; align-items: flex-end; gap: 10px;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--shape-sm); padding: 14px;
  box-shadow: 0 12px 28px -12px oklch(0.3 0.05 260 / 0.35);
  width: max-content;              /* zgłoszenie: kwota i „Zapisz" się ucinały */
}
.pz-inst-edit-pop .field { flex: none; }
.pz-inst-edit-pop input[name="due_date"]  { width: 160px; }
.pz-inst-edit-pop input[name="amount_pln"] { width: 120px; }
.pz-inst-edit-pop .btn { flex: none; white-space: nowrap; }
@media (max-width: 560px) {
  .pz-inst-edit-pop { width: auto; min-width: 250px; flex-wrap: wrap; left: auto; }
}

/* ============================================================
   27) Akordeony strefy rodzica + profil ucznia (fala 3, pkt 8)
   <details class="parent-card"> z summary .pz-st-acc-sum = nagłówkiem karty.
   ============================================================ */

/* Karta płatności u rodzica (fala 3) */

/* Finanse: trend wpłat (fala 3c) — stałe szerokości etykiet wykresu */

/* ============================================================
   A11y — szlif dostępności (na końcu pliku = wygrywa kolejnością)
   ============================================================ */

/* Skip-link: ukryty, pojawia się po Tab (pierwszy focus na stronie) */
.skip-link {
  position: absolute; left: 8px; top: -56px; z-index: var(--z-skip);
  background: var(--primary); color: #fff; padding: 8px 14px;
  border-radius: var(--shape-sm); font-size: var(--fs-md); font-weight: var(--fw-semibold);
  text-decoration: none; transition: top .15s ease;
}
.skip-link:focus { top: 8px; outline: 2px solid #fff; outline-offset: 2px; }
#main-content:focus { outline: none; }   /* cel skip-linku nie miga ramką */

/* Widoczny focus KLAWIATUROWY (:focus-visible) na elementach interaktywnych.
   Nie dotyczy kliknięć myszą — pojawia się tylko przy nawigacji Tab. */
a:focus-visible,
button:focus-visible,
.btn:focus-visible,
summary:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
.input:focus-visible,
.select:focus-visible,
.textarea:focus-visible,
[role="button"]:focus-visible,
[tabindex]:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}

/* ============================================================
   PANEL RODZICA — jednolity rytm odstępów + wspólny kafelek lekcji
   (przegląd / nadchodzące / zakończone / bez terminu)
   ============================================================ */

/* Odstępy: koniec zlewania się kart. Jeden rytm web + mobile. */
.parent-dash-main > .parent-card,
.parent-dash-side > .parent-card { margin-bottom: 20px; }
.parent-dash-main > .parent-card:last-child,
.parent-dash-side > .parent-card:last-child { margin-bottom: 0; }

/* Sekcje pełnej szerokości (pozostałe / zakończone) — odstęp między kartami */
#main-content .parent-card + .parent-card { margin-top: 18px; }

/* Wspólny kafelek lekcji */
.ple-list { display: flex; flex-direction: column; gap: 10px; }
.ple-item {
  display: flex; align-items: center; gap: 14px;
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: var(--shape-md);
  background: var(--surface, #fff);
}
.ple-date {
  flex: 0 0 auto; min-width: 52px; text-align: center;
  background: color-mix(in srgb, var(--primary) 12%, transparent);
  color: var(--primary);
  border-radius: var(--shape-sm); padding: 6px 8px; line-height: 1.1;
}
.ple-date--done {
  background: var(--surface-3);
  color: var(--text-3);
}
.ple-day { font-size: var(--fs-xl); font-weight: var(--fw-bold); }
.ple-mon { font-size: var(--fs-xs); text-transform: lowercase; }
.ple-time { font-size: var(--fs-xs); margin-top: 1px; }
.ple-body { flex: 1 1 auto; min-width: 0; }
.ple-title { font-size: var(--fs-md); font-weight: var(--fw-semibold); }
.ple-rail { flex: 0 0 auto; display: flex; align-items: center; gap: 8px; }

.ple-grade .material-symbols-outlined { font-size: var(--fs-md); }

/* Zwijanie długich list (zakończone / nadchodzące) — bez JS, czysty <details> */
.ple-collapse > summary {
  list-style: none; cursor: pointer; user-select: none;
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 44px; /* W-E8: było ok. 24 px */
  margin-top: 4px; font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--primary);
}
.ple-collapse > summary::-webkit-details-marker { display: none; }
.ple-collapse > summary .chev { transition: transform .15s ease; }
.ple-collapse[open] > summary .chev { transform: rotate(180deg); }
.ple-collapse[open] > summary .lbl-more { display: none; }
.ple-collapse > summary .lbl-less { display: none; }
.ple-collapse[open] > summary .lbl-less { display: inline; }
.ple-collapse .ple-list { margin-top: 10px; }

/* ---------- Menu boczne: zwijane grupy (KV-APP 08.10) ----------
   Każda grupa to <details class="nav-group"> (makro nav_group w base.html).
   Nagłówek grupy = etykieta w wersalikach jak „eyebrow" strony + strzałka;
   zwinięta grupa z licznikiem w środku (.badge) pokazuje kropkę. Rozwijanie
   animuje ::details-content tam, gdzie przeglądarka go zna (Chrome 131+),
   reszta otwiera bez animacji. */
.sidebar-top { gap: 6px; }
.sidebar-top > .brand { margin-bottom: 12px; }
.nav-group { margin: 0; interpolate-size: allow-keywords; }
.nav-group-summary {
  list-style: none; cursor: pointer; user-select: none;
  display: flex; align-items: center; gap: 8px;
  min-height: 32px; padding: 0 10px 0 16px; border-radius: var(--shape-sm);
  font-size: var(--fs-2xs); font-weight: var(--fw-bold);
  text-transform: uppercase; letter-spacing: var(--ls-caps);
  color: var(--text-3);
  transition: background var(--motion-fast) var(--ease-std), color var(--motion-fast) var(--ease-std);
}
.nav-group-summary::-webkit-details-marker { display: none; }
.nav-group-summary:hover { background: var(--state-hover); color: var(--text); }
.nav-group-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nav-group-chev {
  font-size: var(--fs-xl); opacity: .75; transform: rotate(-90deg);
  transition: transform var(--motion-std) var(--ease-std);
}
.nav-group[open] > .nav-group-summary .nav-group-chev { transform: rotate(0deg); }
.nav-group-dot { display: none; width: 7px; height: 7px; border-radius: var(--shape-full); background: var(--primary); flex: none; }
.nav-group:not([open]):has(.nav-item .badge) .nav-group-dot { display: block; }
/* Grupa z bieżącą stroną: etykieta w kolorze akcji (widać, gdzie jesteś, także po zwinięciu innych). */
.nav-group[data-has-active] > .nav-group-summary { color: var(--text-2); }
.nav-group-body { display: flex; flex-direction: column; gap: 2px; padding: 2px 0 8px; }
@supports selector(::details-content) {
  .nav-group::details-content {
    block-size: 0; overflow-y: clip;
    transition: block-size var(--motion-std) var(--ease-std), content-visibility var(--motion-std) allow-discrete;
  }
  .nav-group[open]::details-content { block-size: auto; }
}

/* Przycisk WhatsApp — markowy zielony + ikona SVG (bez wylewania czcionki ikon) */
.btn-whatsapp {
  background: var(--c-whatsapp);
  border-color: var(--c-whatsapp);
  color: var(--brand-ink);   /* biały na #25D366 miał 2:1 (audyt UI 06.10) */
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
}
.btn-whatsapp:hover { background: var(--c-whatsapp-hover); border-color: var(--c-whatsapp-hover); }
.btn-whatsapp svg { flex: 0 0 auto; }

/* Próbne — przycisk „Kontakt" zielony, gdy kontakt nastąpił */
.btn-contacted {
  background: var(--c-ok);
  border-color: var(--c-ok);
  color: #fff;
}
.btn-contacted:hover { filter: brightness(0.95); }
tr.row.is-contacted { background: color-mix(in srgb, var(--c-ok) 8%, transparent); }
/* /admin/rezerwacje: rezerwacja czeka na decyzję dłużej niż 48 h */
tr.row.is-stale { background: color-mix(in srgb, var(--c-warn) 10%, transparent); }

/* ============================================================
   MOTYW — tokeny (light/dark), typografia, akcenty marki (blue->cyan)
   ============================================================ */

/* ═══════════════════════════════════════════════════════════
   FONT
   ═══════════════════════════════════════════════════════════ */
body,
.btn, .input, .select, .textarea, select, textarea, input {
  font-family: var(--font-sans);
  /* Tabular nums — liczby zawsze tej samej szerokości (wyrównanie kolumn)
     bez potrzeby osobnej czcionki mono dla statystyk */
  font-variant-numeric: tabular-nums;
}

/* Decyzja designowa (pass v3): JEDNA rodzina pisma w całym UI.
   Mono zostaje wyłącznie dla <code>. Daty, godziny, liczniki, kwoty —
   --font-sans z tabular-nums (równe kolumny bez zmiany kroju). */
code {
  font-size: var(--fs-xs);
  background: var(--surface-2);
  padding: 1px 5px;
  border-radius: 4px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
}
.mono, input[type="datetime-local"], input[type="date"], input[type="time"] {
  font-family: inherit;
  font-variant-numeric: tabular-nums;
}

/* Duże liczby KPI (np. 42, 78%) - krój panelu, tabular-nums */
.page-title,
.profile-stat-value,
[class*="stat-value"] {
  font-family: inherit;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.03em;
}

/* ═══════════════════════════════════════════════════════════
   LIGHT MODE
   ═══════════════════════════════════════════════════════════ */
/* Tokeny (:root / html.dark) mieszkają w app/static/css/tokens.css - Etap 4
   audytu (UI-01/02). Tu tylko komponenty i utilities. */

/* ═══════════════════════════════════════════════════════════
   BODY — gradient mesh background
   ═══════════════════════════════════════════════════════════ */
body {
  font-family: var(--font-sans);
  background: var(--bg);
  color: var(--text);
  font-size: var(--fs-md);
  /* KV-APP 08.10: Montserrat 400 przy 13-14 px jest blady na ekranach bez
     retiny - tekst roboczy 500, jak akapity na stronie. */
  font-weight: var(--fw-medium);
  line-height: var(--lh-base);
  font-variant-numeric: tabular-nums;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  /* Audyt UI 06.10: bez fioletowo-niebieskiej „siatki" gradientów w tle -
     płaskie --bg, jak w makietach właściciela. */
  background-color: var(--bg);
}

/* Kanban cards — solid surface (HTML5 drag events) */
.kanban-card {
  padding: 12px 14px;
  cursor: grab;
  transition: box-shadow var(--motion-fast) var(--ease-std),
              transform var(--motion-fast) var(--ease-std),
              border-color var(--motion-fast) var(--ease-std);
  display: flex;
  flex-direction: column;
  gap: 8px;
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  box-shadow: var(--elev-1);
  border-radius: var(--shape-sm);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
.kanban-card:hover {
  box-shadow: var(--elev-2);
  border-color: var(--primary);
  transform: none;
}

/* ═══════════════════════════════════════════════════════════
   MODAL / DRAWER
   ═══════════════════════════════════════════════════════════ */
.modal,
dialog.modal {
  /* Audyt UI 06.10: pełna powierzchnia zamiast szkła (blur 32px) - czytelniej
     i taniej na telefonie; ten sam token w obu motywach. */
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-xl);
  box-shadow: var(--elev-5);
}

/* ═══════════════════════════════════════════════════════════
   BUTTONS — premium indigo
   ═══════════════════════════════════════════════════════════ */

.btn:hover {
  border-color: var(--outline);
  background: var(--surface-1);
}
.btn:active {
  transform: translateY(0px) scale(0.98);
  box-shadow: none;
}
/* .btn.accent — patrz reguła kanoniczna niżej (faza-A) */

/* ═══════════════════════════════════════════════════════════
   FORM INPUTS — premium focus ring
   ═══════════════════════════════════════════════════════════ */
/* 14.09: bez `backdrop-filter` - tworzył warstwę nad ikoną lupy wstawioną PRZED
   polem (/tematy, /plany, uczniowie: lupa niewidoczna, tekst wcięty w pustkę),
   a rozmycia za polem w 85% nieprzezroczystym i tak nie widać. */
.input, .select, .textarea, select, textarea, input:not([type="checkbox"]):not([type="radio"]) {
  background: var(--surface);
  /* KV-APP 08.10: obwódka 1.5px i promień 12 jak na stronie; kolor zostaje
     --field-border (3:1 do tła, WCAG 1.4.11, audyt UI 06.10) - jasne #C4C7CD
     ze strony miało 1,7:1. */
  border: 1.5px solid var(--field-border);
  border-radius: var(--shape-md);
  font-weight: var(--fw-medium);
  transition: border-color 140ms ease, box-shadow 140ms ease;
}
.input:hover, .select:hover, .textarea:hover { background: var(--surface); border-color: var(--text-3); }
.input:focus, .select:focus, .textarea:focus,
select:focus, textarea:focus,
input:not([type="checkbox"]):not([type="radio"]):focus {
  outline: none;
  border-color: var(--primary);
  box-shadow: 0 0 0 3px var(--primary-ring);
}
/* Pola z błędem walidacji (aria-invalid ustawia przeglądarka/skrypt strony). */
.input[aria-invalid="true"], .select[aria-invalid="true"], .textarea[aria-invalid="true"] {
  border-color: var(--c-rej); background: var(--c-rej-bg);
}
.input::placeholder, .textarea::placeholder { color: var(--text-3); font-weight: var(--fw-regular); }
html.dark .input, html.dark .select, html.dark .textarea,
html.dark select, html.dark textarea,
html.dark input:not([type="checkbox"]):not([type="radio"]) {
  background: var(--surface-1);
}

/* ═══════════════════════════════════════════════════════════
   TOPIC ROW — nowy flexbox layout (stary był CSS grid 6 kolumn)
   ═══════════════════════════════════════════════════════════ */
.topic-row {
  grid-template-columns: 18px 24px 1fr 80px 80px 32px;
  font-size: var(--fs-base);
  cursor: pointer;
  transition: background 0.08s;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 7px 14px 7px 10px;
}
.topic-row .topic-actions {
  display: flex;
  align-items: center;
  gap: 2px;
  flex-shrink: 0;
}
.topic-row .topic-actions .icon-btn {
  width: 26px;
  height: 26px;
  opacity: 0.5;
  transition: opacity 0.15s;
}
.topic-row:hover .topic-actions .icon-btn { opacity: 1; }
.topic-diff { flex-shrink: 0; }
.topic-time {
  font-family: inherit;
  color: var(--text-3);
  flex-shrink: 0;
  min-width: 32px;
  text-align: right;
  font-size: var(--fs-sm);
}

/* ═══════════════════════════════════════════════════════════
   SIDEBAR — nawigacja
   ═══════════════════════════════════════════════════════════ */

/* Brand */
.brand-name {
  color: var(--text);
  letter-spacing: var(--ls-display);
  font-weight: var(--fw-black);
  font-size: var(--fs-xl);
  line-height: 1.1;
}
.brand-tag {
  color: var(--text-3);
  text-transform: uppercase;
  margin-top: 1px;
  font-size: var(--fs-2xs);
  letter-spacing: 0.10em;
}

/* Logo ring */
img.brand-mark {
  width: 36px;
  height: 36px;
  flex-shrink: 0;
  object-fit: contain;
  border: 2px solid transparent;
  background: linear-gradient(white, white) padding-box,
    linear-gradient(135deg, oklch(0.505 0.240 260), oklch(0.66 0.16 215)) border-box;
  padding: 2px;
  border-radius: var(--shape-md);
}
html.dark img.brand-mark {
  background:
    linear-gradient(var(--surface), var(--surface)) padding-box,
    linear-gradient(135deg, oklch(0.750 0.180 260), oklch(0.74 0.15 215)) border-box;
}

/* Nav items */

.nav-item:active { transform: scale(0.98); }

/* Active state — indigo gradient */

html.dark .nav-item.active .nav-ico { color: var(--on-primary-container); }

/* Icons — thin outline na nieaktywnych, filled na aktywnych */
.nav-ico.material-symbols-outlined {
  font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 22;
  font-size: 20px;
}
.nav-item.active .nav-ico.material-symbols-outlined {
  font-variation-settings: 'FILL' 1, 'wght' 600, 'GRAD' 0, 'opsz' 22;
}

/* Sidebar foot — card-style */
.sidebar-foot {
  margin-top: auto;
  display: flex;
  gap: 10px;
  align-items: center;
  font-size: var(--fs-base);
  background: var(--surface-1);
  border: 1px solid var(--border);
  border-radius: var(--shape-lg);
  margin: 0 4px 4px;
  padding: 10px 10px 10px 12px;
}

/* Avatar gradient — indigo marki, biały tekst (inicjały) */
.avatar, .who-avatar {
  /* Audyt UI 06.10: jednolity kobalt marki zamiast gradientu z cieniem tekstu
     (biały na końcu gradientu miał 3:1). */
  background: var(--brand-blue) !important;
  color: #fff;
  font-weight: var(--fw-bold);
}

/* ═══════════════════════════════════════════════════════════
   PAGE TITLE — premium typografia
   ═══════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════
   TABS — premium underline
   ═══════════════════════════════════════════════════════════ */
.tab.active {
  color: var(--primary);
  font-weight: var(--fw-semibold);
}

/* ═══════════════════════════════════════════════════════════
   STATUS COLORS
   ═══════════════════════════════════════════════════════════ */
.tag-gray   { background: oklch(0.93 0.004 260); color: oklch(0.40 0.015 260); }
.tag-yellow { background: oklch(0.95 0.07 80);   color: oklch(0.45 0.13 70);  }
.tag-orange { background: oklch(0.94 0.07 50);   color: oklch(0.50 0.16 45);  }
.tag-purple { background: oklch(0.92 0.07 290);  color: oklch(0.40 0.20 260); }

/* ═══════════════════════════════════════════════════════════
   PROGRESS BARS — indigo gradient
   ═══════════════════════════════════════════════════════════ */
.progress-bar.ok {
  background: linear-gradient(90deg,
    oklch(0.505 0.240 260),
    oklch(0.66 0.16 215));
}

/* ═══════════════════════════════════════════════════════════
   HERO BADGES / CHIPS — premium pill
   ═══════════════════════════════════════════════════════════ */
.chip, .badge, .tab-count {
  border-radius: var(--shape-full);
}

/* ═══════════════════════════════════════════════════════════
   PAGE — parent portal
   ═══════════════════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════════════════
   PARENT PORTAL — layout dashboardu 2-kolumnowy
   ═══════════════════════════════════════════════════════════ */

/* Główny grid: 1 kolumna na mobile, 2 na desktop */
.parent-dash-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  align-items: start;
}
@media (min-width: 900px) {
  .parent-dash-grid {
    grid-template-columns: 1fr 310px;
    gap: 16px;
  }
}

/* Kolumny — zwykły blok, bez flex gap (spacing przez .ps) */
.parent-dash-main, .parent-dash-side {
  min-width: 0;
  display: block;
}

/* Na mobile side jedzie pod main */

/* Sekcja — wyraźny odstęp między grupami */

/* Karta wewnątrz sekcji — mały odstęp między sąsiadami */

/* Nagłówki sekcji — wyraźne separatory */

/* Toast banery akcji */
.parent-toast {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 12px 16px;
  border-radius: var(--shape-sm);
  border: 1px solid;
  margin-bottom: 14px;
  font-size: var(--fs-base);
}
.parent-toast--ok {
  background: color-mix(in srgb, var(--c-ok) 10%, var(--surface-2));
  border-color: color-mix(in srgb, var(--c-ok) 30%, var(--border));
  color: var(--c-ok);
}
.parent-toast--err {
  background: color-mix(in srgb, var(--c-rej) 8%, var(--surface-2));
  border-color: color-mix(in srgb, var(--c-rej) 25%, var(--border));
  color: oklch(0.55 0.20 25);
}
.parent-toast--info {
  background: color-mix(in srgb, oklch(0.60 0.18 250) 8%, var(--surface-2));
  border-color: color-mix(in srgb, oklch(0.60 0.18 250) 25%, var(--border));
  color: oklch(0.50 0.18 250);
}

/* CTA karta rezerwacji */
.parent-cta-card {
  border: 1px solid color-mix(in srgb, var(--accent) 25%, var(--border));
  transition: transform .12s ease, box-shadow .12s ease;
}
.parent-cta-card:hover {
  transform: translateY(-2px);
  border-color: var(--accent);
}

/* Karta w flex stack — gap przejmuje spacing */
.parent-dash-main .parent-card,
.parent-dash-side .parent-card {
  margin-bottom: 0;
  padding: 20px 22px;
}

/* Nagłówek wewnątrz karty — więcej powietrza */
.parent-dash-main .parent-card-h,
.parent-dash-side .parent-card-h {
  margin-bottom: 16px;
}

/* Wiersze lekcji — wyraźniejsze odstępy */
.parent-dash-main .lesson-row {
  padding-bottom: 14px;
  margin-bottom: 14px;
}

/* ═══════════════════════════════════════════════════════════
   KANBAN EMPTY STATE
   ═══════════════════════════════════════════════════════════ */
.kanban-empty {
  color: var(--text-3);
  font-size: var(--fs-sm);
  text-align: center;
  padding: 16px 8px;
}

/* ═══════════════════════════════════════════════════════════
   SELECTION
   ═══════════════════════════════════════════════════════════ */
::selection {
  background: oklch(0.505 0.240 260 / 0.20);
  color: var(--text);
}

/* ═══════════════════════════════════════════════════════════
   PRO UPLIFT (faza 4) — a11y, dotyk, ruch, szlif „real-app"
   ═══════════════════════════════════════════════════════════ */

/* Klawiaturowy focus-ring — widoczny przy nawigacji TAB-em, nie przy myszy.
   To jeden z elementów, które odróżniają dopracowaną apkę od „AI-flop". */
a:focus-visible, button:focus-visible, .btn:focus-visible, .icon-btn:focus-visible,
.nav-item:focus-visible, .tab:focus-visible, .chip:focus-visible,
summary:focus-visible, [tabindex]:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
  border-radius: var(--shape-xs);
}

/* Subtelne wciśnięcie przycisku — naturalny feedback dotyku/kliku. */
.btn:active:not(:disabled), .icon-btn:active:not(:disabled) {
  transform: translateY(0.5px) scale(0.985);
}

/* Szybszy dotyk na mobile (bez 300ms delay). */
a, button, .btn, .icon-btn, .nav-item, .tab, .chip, label, summary {
  touch-action: manipulation;
}

/* Ikona w nagłówku strony / karty (pod zamianę emoji → Material Symbols). */
.page-title .material-symbols-outlined {
  font-size: 26px; color: var(--primary); vertical-align: -5px; margin-right: 4px;
}
.card-h .material-symbols-outlined {
  font-size: 20px; color: var(--primary); vertical-align: -4px; margin-right: 2px;
}

/* ── DOTYK NA MOBILE — cele interakcji ≥44px (Apple HIG / Material) ── */

/* ── Szanuj prefers-reduced-motion (a11y + mniej „migania") ── */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms;
    animation-iteration-count: 1;
    transition-duration: 0.001ms;
    scroll-behavior: auto;
  }
}

/* ===== SPECTRUM — dashboard „Dzisiaj" polish (faza 2) ===== */

 
 
 
.daily-h {
  font-weight: var(--fw-bold);
  margin: 0 0 12px;
  letter-spacing: var(--ls-tight);
  font-size: var(--fs-xl);
  display: flex;
  align-items: center;
  gap: 8px;
}


/* ===== SPECTRUM — warstwa wykończeniowa (cały UI, faza 3) ===== */
/* Gradient marki na akcentowych przyciskach (główne CTA) */
/* Aktywna zakładka — gradientowe podkreślenie */
.tab.active::after {
  transform: scaleX(1);
  height: 3px;
  border-radius: 3px 3px 0 0;
  background: var(--grad);
}
/* Spójny, widoczny focus-visible (dostępność + sznyt premium) */
a:focus-visible,button:focus-visible,.btn:focus-visible,.tab:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{
  outline:2px solid var(--primary); outline-offset:2px;
}
/* Liczby równo w całym UI */

/* Delikatny, markowy scrollbar w obszarze treści */
main::-webkit-scrollbar{ width:10px;height:10px; }
main::-webkit-scrollbar-thumb{
  background: var(--border-strong); border-radius: var(--shape-full); }
main::-webkit-scrollbar-thumb:hover{
  background: var(--outline); }

/* FIX drag-handle tylko w sekcji sortowalnej — dziala dopiero z warstwy
   utilities (ok. linii 5495). Ta wersja w @layer components przegrywala
   z .pz-pv-drag-handle{display:flex} z utilities i nie ukrywala uchwytu.
   Zostawione jako no-op dla czytelnosci; realna regula jest w utilities. */

/* ===== FIX: checkbox zaznaczania ucznia — styl + pozycja (był goły kwadrat) ===== */
.student-card-wrap{ position:relative; display:flex; }
.student-card-wrap > .student-card{ flex:1; }
/* ===== Inline error w modalu kalendarza (toast chowa się za <dialog>) ===== */
.ce-error{ color: oklch(0.45 0.18 25); background: var(--c-rej-bg);
  border:1px solid oklch(0.80 0.10 25); border-radius: var(--shape-sm); padding:9px 12px; font-size: var(--fs-sm); }

/* ============================================================
   KARTY I POWIERZCHNIE — czyste, miękkie cienie, pełne zaokrąglenia,
   gradientowe paski postępu, pełne pigułki (wg mockupu).
   ============================================================ */
/* Karty: czyste, białe, miękki warstwowy cień (jak w mockupie) */
.card, .parent-card, .form-card, .stat {
  background: var(--surface);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: 1px solid var(--border);
  /* KV-APP 08.10: karta strony - promień 20, długi miękki cień. Unosi się tylko
     karta klikalna (link) - statyczna karta, która podskakuje pod kursorem,
     udaje przycisk. */
  border-radius: var(--shape-lg);
  box-shadow: var(--shadow-card);
  transition: transform var(--motion-std) var(--ease-std), box-shadow var(--motion-std) var(--ease-std),
    border-color var(--motion-std) var(--ease-std);
}
@media (hover: hover) {
  a.card:hover, a.parent-card:hover, a.stat:hover, .stat:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-card-hover);
    border-color: var(--primary-ring);
  }
}
html.dark .card, html.dark .parent-card, html.dark .form-card, html.dark .stat {
  background: var(--surface);
  border-color: var(--border);
}
/* Powłoka: czyste, jasne — bez szkła (mockup ma biały pasek) */
.sidebar {
  width: var(--sidebar-w);
  flex-shrink: 0;
  padding: 14px 10px;
  display: flex;
  flex-direction: column;
  gap: 20px;
  position: sticky;
  top: 0;
  height: 100vh;
  /* auto + stable: pasek pojawia się tylko gdy menu się nie mieści, a miejsce
     jest zarezerwowane (bez skoku szerokości). Kolory z globalnych reguł. */
  overflow-y: auto;
  scrollbar-gutter: stable;
  z-index: var(--z-sidebar);
  scrollbar-width: thin;
  background: var(--surface);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-right: 1px solid var(--border);
  box-shadow: none;
}
.topbar {
  height: var(--topbar-h);
  padding: 0 24px;
  display: flex;
  align-items: center;
  gap: 14px;
  position: sticky;
  top: 0;
  z-index: var(--z-topbar);
  transition: box-shadow var(--motion-std) var(--ease-std);
  /* KV-APP 08.10: szklany pasek - treść przewija się pod nim rozmyta
     (blur 12px, test 06.10 dopuszcza < 14px), bez kolorowej mgły pod spodem. */
  background: color-mix(in srgb, var(--bg) 78%, transparent);
  backdrop-filter: blur(12px) saturate(170%);
  -webkit-backdrop-filter: blur(12px) saturate(170%);
  border-bottom: 1px solid var(--border);
  box-shadow: none;
}
html.dark .sidebar { background: var(--surface); box-shadow: none; }
/* Typografia (KV-APP 08.10): nagłówki jak na stronie - pełny atrament, waga
   900, ciasne światło. Bez gradientu w tekście: w tytule z polskimi znakami
   gradient przycinał ogonki (ą, ę) na iOS, a strona używa go tylko na
   wyróżnionym słowie, nie na całym tytule. */
.page-title {
  font-size: var(--fs-3xl);
  margin: 0;
  color: var(--text);
  letter-spacing: var(--ls-display);
  font-weight: var(--fw-black);
  line-height: 1.1;
}
.card-h, .parent-card-h {
  margin-bottom: 12px;
  font-weight: var(--fw-bold);
  color: var(--text);
}
/* Paski postępu: pełne zaokrąglenie + gradient marki */
.progress {
  height: 8px;
  background: var(--surface-2);
  border-radius: var(--shape-full);
  overflow: hidden;
}
.progress-bar {
  height: 100%;
  background: var(--accent);
  transition: width 0.24s ease;
  border-radius: var(--shape-full);
}
.progress-bar:not(.ok) { background: var(--grad); }
/* Pigułki / statusy: pełne zaokrąglenie */
.badge, .chip, .tag, .lvl-badge, .color-tag { border-radius: var(--shape-full); }
/* Przyciski (KV-APP 08.10, po uwadze właściciela „premium, high-tech"):
   zaokrąglony prostokąt (10px) zamiast pigułki strony. Hierarchia jak w
   narzędziach: niebieski TYLKO na głównej akcji (.btn.accent), domyślny
   przycisk drugorzędny jest neutralny - biały, krawędź 1px, atrament, cień
   kontaktowy. Wcześniejsze niebieskie obrysy na każdym przycisku rozmywały,
   co jest główną akcją ekranu. */
.btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  border: 1px solid var(--border-strong);
  background: var(--surface);
  color: var(--text);
  box-shadow: var(--shadow-xs);
  padding: 0 16px;
  height: 40px;
  min-width: 0;
  font-size: var(--fs-base);
  cursor: pointer;
  white-space: nowrap;
  text-decoration: none;
  overflow: hidden;
  isolation: isolate;
  font-weight: var(--fw-semibold);
  letter-spacing: -0.005em;
  transition: background var(--motion-fast) var(--ease-std),
    border-color var(--motion-fast) var(--ease-std),
    transform var(--motion-fast) var(--ease-std),
    box-shadow var(--motion-fast) var(--ease-std);
  border-radius: var(--shape-md);
}

/* ===== HERO (mockup rodzica) — gradient + pierścień postępu + pigułki. Reużywalny. ===== */
/* KV-STRONA-2 (05.11): granatowa scena strony - kratka, poświata i granat z `--g-panel` (tokeny `--zs-scene-*`;
   wcześniej osobna kratka w ::before wygaszana maską). Biały tekst 16,2:1, podpisy `--zs-scene-mute`,
   dopisek, akcje i ciemny motyw w bloku KV-STRONA-2 na końcu pliku. */
.solve-hero{ position:relative; isolation:isolate; overflow:hidden;
  display:flex; align-items:center; gap:24px; padding:24px 28px; border-radius: var(--shape-xl);
  background: var(--g-panel); color: var(--zs-scene-text); margin-bottom:16px; box-shadow: var(--shadow-panel); }
.solve-hero-ring{ position:relative; flex:none; width:96px; height:96px; }
.solve-hero-ring-txt{ position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; }
.solve-hero-ring-pct{ font-size:23px; font-weight: var(--fw-heavy); line-height:1; letter-spacing: var(--ls-display); }
.solve-hero-ring-lbl{ font-size:9px; opacity:.85; text-transform:uppercase; letter-spacing:.05em; margin-top:3px; }
.solve-hero-eyebrow{ font-size: var(--fs-xs); color: var(--zs-scene-mute); font-weight: var(--fw-bold);
  text-transform: uppercase; letter-spacing: var(--ls-caps); }
.solve-hero-title{ font-size: clamp(22px, 2.6vw, 28px); font-weight: var(--fw-black); letter-spacing: var(--ls-display);
  margin:4px 0 14px; line-height:1.12; text-wrap: balance; }
.solve-hero-pills{ display:flex; gap:8px; flex-wrap:wrap; }
.solve-hero-pill{ display:inline-flex; align-items:center; gap:6px; font-size: var(--fs-sm); font-weight: var(--fw-medium);
  background:var(--zs-scene-pill); border:1px solid var(--zs-ghost-line); padding:6px 12px; border-radius: var(--shape-full); }
.solve-hero-pill .material-symbols-outlined{ font-size: var(--fs-lg); }

/* ===== Postęp wg działów (panel rodzica) ===== */
.dz-row{ margin-bottom:13px; }
.dz-row:last-child{ margin-bottom:0; }
.dz-head{ display:flex; justify-content:space-between; align-items:baseline; font-size: var(--fs-base); margin-bottom:6px; }
.dz-name{ font-weight: var(--fw-medium); color:var(--text); }
.dz-pct{ font-weight: var(--fw-semibold); color:var(--text-2); font-variant-numeric:tabular-nums; }
.dz-track{ height:8px; }

/* ===== Hero na dashboardzie (Dzisiaj) — ikona zamiast pierścienia, pigułki-linki ===== */
.solve-hero-ico{ width:72px; height:72px; border-radius:50%; flex:none; display:grid; place-items:center;
  background:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.24); }
.solve-hero-ico .material-symbols-outlined{ font-size:34px; color:#fff; }
a.solve-hero-pill{ text-decoration:none; color:#fff; transition:background var(--motion-fast) var(--ease-std); }
a.solve-hero-pill:hover{ background:rgba(255,255,255,.28); }

/* ============================================================
   FAZA 3+4: modernistyczny scrollbar + sidebar (aktywny pill) + listy
   ============================================================ */
/* Scrollbar — cienki, zaokrąglony, "pływający", niebieski akcent (cały UI).
   border:transparent + background-clip:padding-box = thumb z oddechem (modern). */
* {
  box-sizing: border-box;
  scrollbar-width: thin;
  scrollbar-color: oklch(0.60 0.16 245) transparent;
}
*::-webkit-scrollbar { width: 12px; height: 12px; }
*::-webkit-scrollbar-corner { background: transparent; }
/* Obszar treści przewija się gładko */
main { scroll-behavior: smooth; }

/* Sidebar — aktywna pozycja: czysty niebieski pill z miękkim cieniem (jak w mockupie) */

/* Listy / tabele — spójny delikatny hover wierszy (faza 3) */
table.leads tr.row:hover > td { background: oklch(0.62 0.06 260 / 0.06); }

/* ===== Płatności (wzorzec z mockupu): niebieski baner + raty ze statusem ===== */
.pay-banner{ display:flex; align-items:center; justify-content:space-between; gap:16px;
  background: var(--g-panel); color: var(--zs-scene-text); border-radius: var(--shape-lg); padding:18px 22px; margin:12px 0;
  box-shadow: var(--shadow-panel); }
.pay-banner-lbl{ font-size: var(--fs-sm); color: var(--zs-scene-mute); }
.pay-banner-val{ font-size: var(--fs-3xl); font-weight: var(--fw-heavy); letter-spacing: var(--ls-display); line-height:1.1; font-variant-numeric: tabular-nums; }
.pay-banner-meta{ text-align:right; }
.pay-banner-cnt{ font-size: var(--fs-lg); font-weight: var(--fw-semibold); }
.pay-inst{ display:flex; align-items:center; gap:12px; padding:11px 0; border-top:1px solid var(--border); }
.pay-inst:first-child{ border-top:none; }
.pay-inst-ico{ width:30px; height:30px; border-radius:50%; display:grid; place-items:center; flex:none; }
.pay-inst-ico .material-symbols-outlined{ font-size: var(--fs-xl); }
.pay-inst-ico.is-paid{ background:var(--c-ok-bg); color:var(--c-ok); }
.pay-inst-ico.is-due{ background:var(--c-prog-bg); color:var(--c-prog); }
.pay-inst-body{ flex:1; min-width:0; }
.pay-inst-name{ font-size: var(--fs-base); font-weight: var(--fw-semibold); }
.pay-inst-sub{ font-size: var(--fs-sm); color:var(--text-3); }
.pay-inst-amt{ font-weight: var(--fw-bold); font-variant-numeric:tabular-nums; }
.pay-inst-amt.is-due{ color:var(--c-prog); }
/* W-E2 (05.11): rata po terminie - czerwień zaległości zamiast pomarańczu „oczekuje” */
.pay-inst-ico.is-overdue{ background:var(--c-rej-bg); color:var(--c-rej); }
.pay-inst-amt.is-overdue{ color:var(--c-rej); }
.pay-inst-name .badge{ margin-left: var(--sp-1); vertical-align: middle; }
/* Sloty rezerwacji — większe zaokrąglenie (jak mockup) */

/* ===== FIX scrollbar: ukryj strzałki Windows (::-webkit-scrollbar-button) =====
   Bez tego Chrome/Win pokazuje natywne strzałki ▲▼ → wygląda "klasycznie". */
*::-webkit-scrollbar-button,
*::-webkit-scrollbar-button:start,
*::-webkit-scrollbar-button:end,
.sidebar::-webkit-scrollbar-button { display: none; height: 0; width: 0; }
/* lekko wyraźniejszy, w pełni zaokrąglony thumb */
*::-webkit-scrollbar-thumb { background: linear-gradient(180deg, oklch(0.55 0.19 258), oklch(0.70 0.14 212)); border: 3px solid transparent; background-clip: padding-box; border-radius: var(--shape-full); }
*::-webkit-scrollbar-thumb:hover { background: linear-gradient(180deg, oklch(0.50 0.21 258), oklch(0.64 0.16 212)); background-clip: padding-box; }
*::-webkit-scrollbar-track { background: transparent; }

/* ============================================================
   FAZA A (audyt UI/UX): pomarańcz -> niebieski, lżejsza nawigacja, mono ikony
   ============================================================ */
/* A1 - przyciski CTA. Audyt UI 06.10: pełny --primary zamiast gradientu
   (biały na cyjanowym końcu miał 2,4:1, w ciemnym motywie też). KV-APP 08.10:
   wypełnienie zostaje pełne, dochodzi niebieski cień strony pod przyciskiem. */
/* Światło u góry (gradient w obrębie jednego odcienia + wewnętrzna linia
   w --shadow-primary): biały na jaśniejszym końcu dalej >= 4,5:1. */
.btn.accent {
  background: linear-gradient(180deg, color-mix(in srgb, var(--primary) 90%, white), var(--primary));
  border-color: var(--primary-pressed);
  color: var(--on-primary);
  box-shadow: var(--shadow-primary);
}
.btn.accent:hover { background: linear-gradient(180deg, var(--primary), var(--primary-hover)); border-color: var(--primary-pressed); box-shadow: var(--shadow-primary-lg); }
.btn.accent:active { background: var(--primary-pressed); box-shadow: var(--shadow-primary); }
html.dark .btn.accent { background: var(--primary); border-color: transparent; }
/* oceny PD: amber semantyczny zamiast pomarańczu marki */
.ple-grade {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  white-space: nowrap;
  border-radius: var(--shape-sm);
  padding: 3px 8px;
  background: var(--c-prog-bg);
  color: oklch(0.46 0.13 70);
}

/* B1 — nawigacja lżejsza (feedback: pogrubienie nie pasuje) */
.nav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 0 16px;
  height: 40px;
  color: var(--text-2);
  background: none;
  border: none;
  text-align: left;
  cursor: pointer;
  text-decoration: none;
  white-space: nowrap;
  overflow: hidden;
  font-size: var(--fs-base);
  transition: background var(--motion-fast) ease, color var(--motion-fast) ease;
  border-radius: var(--shape-md);
  /* B1: pozycje bez pogrubienia (feedback właściciela); 500, bo Montserrat 400
     przy 13 px jest blady. Aktywna pozycja dostaje 700. */
  font-weight: var(--fw-medium);
}
.nav-item .badge { margin-left: auto; }
/* Aktywna pozycja (KV-APP 08.10): tło --primary-container, tekst w kolorze
   akcji i 3 px listwa po lewej - jak boczne menu ze specyfikacji strony. */
.nav-item.active {
  background: var(--primary-container);
  color: var(--on-primary-container);
  border: 1px solid transparent;
  font-weight: var(--fw-bold);
}
.nav-item.active::before {
  content: ""; position: absolute; left: 0; top: 9px; bottom: 9px; width: 3px;
  border-radius: 0 3px 3px 0; background: var(--primary);
}

/* A3 — ikony nawigacji monochromatyczne (jak w mockupie), aktywna w kolorze akcji */
.nav-item .nav-ico {
  color: var(--text-3);
}
.nav-item:hover .nav-ico {
  color: var(--text);
}
.nav-item.active .nav-ico {
  color: var(--primary);
}

/* press feedback na klikalnych kartach/linkach (uzupełnienie) */

/* Reduced-motion: bez ruchu (transform), zostaw opacity/kolor */
@media (prefers-reduced-motion: reduce){
  *, *::before, *::after{ transition-duration: 0.01ms; animation-duration: 0.01ms; animation-iteration-count: 1; scroll-behavior: auto; }
  .solve-hero, .card, .btn, .nav-item, .daily-card, .student-card { transition-property: opacity, background-color, color, border-color; }
}

/* ============================================================
   FAZA E: dopieszczenie per-ekran (szlify spójne z mockupem)
   ============================================================ */
/* Ikony nagłówków sekcji/kart (KV-APP 08.10): miękki kafelek w kolorze akcji -
   „podpis" stylu strony (kwadrat z ikoną) w wersji cichej. Gradientowy kafel
   zostaje dla pustych stanów i hero, bo przy ~170 nagłówkach kart gradient
   na każdym byłby krzykliwy. */
.card-h > .material-symbols-outlined:first-child,
.parent-card-h > .material-symbols-outlined:first-child,
.daily-h > .material-symbols-outlined:first-child,
.daily-h-btn > .material-symbols-outlined:first-child {
  display: inline-grid; place-items: center; flex: none;
  width: 30px; height: 30px; border-radius: var(--shape-sm);
  background: var(--primary-container); color: var(--primary);
  font-size: var(--fs-xl); vertical-align: middle; margin-right: 0;
  font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 20;
}
/* Liczby w tabelach — tabularne (równe kolumny kwot/godzin) */
table.leads, table.leads td, table.students td { font-variant-numeric: tabular-nums; }
/* Empty-state (KV-APP 08.10): kafel z ikoną w gradiencie marki, jak na stronie. */
.empty-ico, .pz-empty-ico {
  width: 56px; height: 56px; margin: 0 auto 14px; border-radius: var(--shape-lg);
  display: grid; place-items: center;
  background: var(--g-blue); color: #fff; box-shadow: var(--shadow-tile);
}
.empty-ico .material-symbols-outlined, .pz-empty-ico .material-symbols-outlined {
  color: #fff; font-size: var(--fs-3xl); font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;
}

/* ===== RESPONSYWNE (@media max-width) — na koncu warstwy, by nadpisywaly baze przez kolejnosc ===== */

@media (max-width: 360px) {
  .bnav-item { font-size: var(--fs-2xs); padding: 4px 1px 2px; }
}

@media (max-width: 1100px) {
  :root { --page-gutter: 24px; }
  .page { padding: 24px var(--page-gutter) 80px; }
  .stat { padding: 14px; }
  .stat-value { font-size: var(--fs-2xl); }
}

@media (max-width: 900px) {
  .app { flex-direction: column; }

  .sidebar {
    position: fixed; top: 0; left: 0;
    width: 280px; max-width: 85vw; height: 100dvh;
    transform: translateX(-105%);
    transition: transform 0.22s ease;
    box-shadow: var(--shadow-3);
  }
  .app.menu-open .sidebar { transform: translateX(0); }
  .app.menu-open .nav-overlay { display: block; }

  .icon-btn.nav-toggle { display: inline-grid; }

  .topbar { padding: 0 14px; gap: 8px; }
  :root { --page-gutter: 14px; }
  .page { padding: 16px var(--page-gutter) 80px; }

  .page-head { gap: 14px; margin-bottom: 16px; }
  .page-title { font-size: var(--fs-2xl); }
  .page-actions { width: 100%; flex-wrap: wrap; }
  .page-actions .btn { flex: 1 1 auto; min-width: 0; }
  .page-actions .dropdown { flex: 1 1 auto; }
  .page-actions .dropdown .btn { width: 100%; }
  /* Field row: na małym ekranie wszystko w jedną kolumnę żeby pola się nie ucinały */
  .field-row { grid-template-columns: 1fr; gap: 0; }

  /* Stats — poziomy scroll (zamiast zlewania się) */
  .stats {
    display: flex;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    gap: 8px;
    margin: 0 calc(-1 * var(--page-gutter)) 14px;
    padding: 0 var(--page-gutter) 8px;
  }
  .stats::-webkit-scrollbar { display: none; }
  .stat {
    flex: 0 0 auto;
    min-width: 130px;
    padding: 10px 14px;
    scroll-snap-align: start;
  }
  .stat-value { font-size: var(--fs-2xl); }
  .stat-delta { display: none; }
  .stat-label { font-size: var(--fs-2xs); }

  /* Toolbar — search pełna szerokość, filtry obok */
  .toolbar { gap: 6px; }
  .search { flex: 1 1 100%; }
  .toolbar > .btn:last-child { display: none; }   /* submit "Szukaj" — Enter w polu działa */
  /* Popover filtrów jest na telefonie `fixed`, ale nie miał żadnego
     ograniczenia od dołu: skan pokazał przyciski akcji z dolną krawędzią na
     845px przy oknie 844px, czyli tuż POD ekranem. Ograniczamy wysokość do
     miejsca nad dolnym paskiem i pozwalamy przewijać zawartość. */
  .popover {
    position: fixed; right: 8px; left: 8px; width: auto;
    max-height: calc(100vh - var(--bottom-nav-h) - 96px);
    overflow-y: auto; overscroll-behavior: contain;
  }

  /* Filtry chipy — poziomy scroll */
  .filters {
    flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden;
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;
    margin: 0 calc(-1 * var(--page-gutter)) 12px; padding: 0 var(--page-gutter) 8px;
    scrollbar-width: none;
  }
  .filters::-webkit-scrollbar { display: none; }
  .chip { flex-shrink: 0; }  /* Tabela na mobile — KOMPAKTOWE WIERSZE:
     widoczne tylko: imię | status (badge) | strzałka */
  .tbl-wrap { border-radius: var(--radius); border: 1px solid var(--border); background: var(--surface); overflow: hidden; }
  /* Tabela leadów na mobile — całkowicie rezygnujemy z table-layout
     (różne implementacje przeglądarek walczyły z grid). Flex na .row
     daje pełną kontrolę nad rozkładem i overflow nie ma jak się zdarzyć. */
  table.leads, table.leads tbody, table.leads tr.row { display: block; width: 100%; }
  table.leads { font-size: var(--fs-base); }
  table.leads thead { display: none; }
  table.leads td { padding: 12px 8px; vertical-align: middle; display: block; }
  table.leads tr.row {
    display: flex; align-items: center; gap: 8px;
    border-bottom: 1px solid var(--border);
  }
  table.leads tr.row:last-child { border-bottom: none; }
  table.leads tr.row td.who-td {
    padding: 12px 0 12px 14px;
    flex: 1 1 auto; min-width: 0; overflow: hidden;
  }
  table.leads tr.row td.status-td {
    padding: 12px 0; flex: 0 0 auto;
    text-align: right; white-space: nowrap;
  }
  table.leads tr.row td.col-actions {
    padding: 12px 10px 12px 0;
    flex: 0 0 32px; text-align: right;
  }
  table.leads tr.row td.who-td .who-cell { min-width: 0; display: flex; align-items: center; gap: 10px; }
  table.leads tr.row td.who-td .who-avatar { flex-shrink: 0; }
  table.leads tr.row td.who-td .who-meta { min-width: 0; flex: 1 1 auto; overflow: hidden; }
  table.leads tr.row td.who-td .who-name-row { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  table.leads tr.row td.who-td .who-extra { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* Ukrywamy kolumny — pokazujemy je tylko w drawerze */
  table.leads .hide-mobile { display: none; }

  /* Etykieta "Uczeń" mała wyłączona — wiersz jest sam w sobie czytelny */
  table.leads td.who-td::before { content: none; }

  /* Status na mobile — patrz sekcja 10 (Sprint 1 v4) używająca .tag z _row.html.
     Stary pseudo-element ::after wycięty (był źródłem hard-cropping z max-width 90px). */

  /* Modal pełnoekranowy na mobile ( żeby pobić inline width na <dialog>). */
  .modal {
    width: 100vw;
    max-width: 100vw;
    height: 100dvh; max-height: 100dvh;
    border-radius: 0;
    margin: 0;
  }
  .modal-body { max-height: none; flex: 1; padding-left: 18px; padding-right: 18px; }
  .modal-head { padding-left: 18px; padding-right: 18px; }
  .modal-foot { padding-left: 18px; padding-right: 18px; }

  /* Drawer pełnoekranowy */
  .drawer { width: 100vw; max-width: 100vw; box-shadow: none; }
  .drawer-body { padding: 14px; gap: 12px; }
  .drawer-head { padding: 14px; }
  .dr-grid { grid-template-columns: 1fr; gap: 8px; }
  .drawer-foot { padding: 12px 14px; }
  /* Bottom navigation widoczne tylko na mobile */
  .bottom-nav { display: flex; }

  /* Padding bottom żeby treść się nie chowała pod bottom nav */
  .page { padding-bottom: calc(var(--bottom-nav-h) + 24px + env(safe-area-inset-bottom)); }

  /* Akcje w drawerze: 2-kolumnowy grid na mobile — ikona + tekst mieszczą się
     bez ucinania. Pełna szerokość gdy nieparzysta ostatnia (default behaviour). */
  .drawer-quick {
    display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
  }
  .drawer-quick .btn {
    width: 100%; justify-content: center;
    padding: 10px 12px; font-size: var(--fs-base);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  /* Edytuj zawsze na pełną szerokość (główne CTA) */
  .drawer-quick .btn.accent { grid-column: 1 / -1; }

  /* Kanban — przewijanie poziome zamiast 4 ciasnych kolumn */
  .kanban-board {
    grid-template-columns: repeat(4, 80vw);
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    margin: 0;
    padding: 0 2px 16px;
    scroll-padding-left: 2px;
    scrollbar-width: thin;
    scroll-snap-type: x proximity;
  }
  .kanban-col { scroll-snap-align: start; }

  /* Daily summary — 1 kolumna na małych */
  
  
  
  
}

@media (max-width: 480px) {
  .field-row { grid-template-columns: 1fr; gap: 0; }
  .filter-grid { grid-template-columns: 1fr; }
  .page-title { font-size: 20px; }
}

@media (max-width: 600px) {
  /* telefon: z okruszków zostaje bieżąca strona (sekcję daje „← Sekcja" nad tytułem) */
  .crumbs-home, .crumbs-sep, .crumbs-link, .crumbs-mid { display: none; }
  .crumb-back { display: inline-flex; }
  .toolbar > .select, .filters > .select, .toolbar > .input, .filters > .input { flex: 1 1 100%; max-width: none; }
  /* KV-APP-CTA-TELEFON (08.10): główna akcja formularza w karcie na całą szerokość
     (łatwiej trafić kciukiem), w stopce okna Anuluj / Zapisz po równo. */
  :is(.card, .parent-card, .form-card) form > .btn.accent:not(.btn-sm),
  :is(.card, .parent-card, .form-card) > form > .pz-row-stretch > .btn.accent:not(.btn-sm) { width: 100%; }
  .modal-foot > .btn { flex: 1 1 0; }
  .profile-head { grid-template-columns: 1fr; padding: 16px; }
  .profile-actions { flex-direction: column; align-items: stretch; }
  .profile-actions .btn { width: 100%; }
}

@media (max-width: 900px) { .profile-stats { grid-template-columns: repeat(2, 1fr); } }

@media (max-width: 700px) {
  .topic-row { grid-template-columns: 18px 24px 1fr 50px 32px; }
  .topic-row .topic-diff { display: none; }
}

@media (max-width: 700px) { .schedule-mode { grid-template-columns: 1fr; } }

@media (max-width: 700px) {
  /* Układ blokowy — koniec wąskiej kolumny daty z pustą przestrzenią obok
     rozwiniętego formularza edycji. Data kompaktowo na górze, treść pod spodem. */   /* strzałka „→" do prawej zamiast sieroty pod tytułem */
  .drag-handle { display: none; }   /* przeciąganie i tak niepraktyczne na telefonie */
  /* ...więc i podpowiedź „przeciągnij za uchwyt ⋮⋮" nie ma tu sensu - uchwytu nie
     widać (14.09). Kolejność na telefonie wraca razem z nowym widokiem planu. */
  .hint-drag { display: none; }
}

@media (max-width: 700px) {
  .lesson-card-topics { flex-direction: column; align-items: stretch; }
  .lesson-card-topics .chip { width: 100%; }
  .tp-item { min-height: 40px; }
}

@media (max-width: 700px) {
  .plan-summary { grid-template-columns: 1fr; }
  .plan-summary-actions { flex-wrap: wrap; }
}

@media (max-width: 600px) {
  .pres-lesson-row {
    grid-template-columns: 24px 60px minmax(0, 1fr); gap: 10px;
  }
  .pres-date { font-size: var(--fs-xs); }
}

@media (max-width: 700px) {
  .pres-stage { padding: 80px 8px 60px; }
  .pres-container { padding: 28px 22px; border-radius: var(--shape-md); }
  .pres-title { font-size: var(--fs-2xl); }}

@media (max-width: 900px) {
  /* Tabs stay scrollable */
  .tabs { padding-left: 4px; padding-right: 4px; }
  .profile-head { padding: 14px; gap: 12px; }
  .profile-name { font-size: var(--fs-xl); }
  .pres-toolbar { left: 8px; right: 8px; }
}

@media (max-width: 700px) { .billing-grid { grid-template-columns: 1fr; } .billing-card--wide { grid-column: auto; } }

@media (max-width: 700px) {
  .topbar-search-text { display: none; }
  .topbar-search .kbd-hint { display: none; }
  .topbar-search { max-width: none; width: 44px; padding: 0; justify-content: center; }
}

@media (max-width: 480px) {
  .search { min-width: 0; width: 100%; flex-basis: 100%; }
  .toolbar { flex-wrap: wrap; }
}

@media (max-width: 480px) {
  :root { --page-gutter: 12px; }
  .page { padding: 14px var(--page-gutter) 90px; }
  .page-head { gap: 12px; margin-bottom: 14px; }
  .page-title { font-size: var(--fs-2xl); line-height: var(--lh-tight); }
}

@media (max-width: 480px) {
  .dim-12,
  .drawer-sub,
  .who-extra,
  .who-role { font-size: var(--fs-sm); }
}

@media (max-width: 900px) {
  .drawer { padding-bottom: max(16px, env(safe-area-inset-bottom)); }
  .modal-foot { padding-bottom: max(12px, env(safe-area-inset-bottom)); }
}

@media (max-width: 600px) {
  .dropdown-menu {
    right: 0;
    left: auto;
    max-width: calc(100vw - 24px);
    min-width: 200px;
  }
}

@media (max-width: 900px) {
  /* NAV-PASEK (15.10): 64 px paska = 4 + ikona 30 + 2 + podpis ok. 13 + 6 - wcześniej
     paddingi (8 + 10) i ikona 32 zostawiały na podpis ujemne miejsce i `overflow: hidden`
     paska ucinało wszystkie podpisy. */
  .bottom-nav {
    padding-top: 4px;
    padding-bottom: max(6px, env(safe-area-inset-bottom));
    box-shadow: 0 -1px 0 var(--border), 0 -8px 24px -12px oklch(0 0 0 / 0.15);
  }
  .bnav-item .bnav-ico {
    font-size: 24px;
    width: 56px; height: 30px;
  }
  .bnav-item .bnav-label {
    font-size: var(--fs-xs);
  }
  /* Dodatkowe padding-bottom na .page żeby content nie wchodził pod bottom-nav. */
  .page { padding-bottom: 96px; }
}

@media (max-width: 900px) {
  /* Mobile: schowaj select, pokaż badge jako standardowy .tag */
  table.leads td.status-td .status-form { display: none; }
  table.leads td.status-td .lead-status-tag {
    display: inline-flex;
    /* Cała reszta wyglądu z .tag (padding 3px 10px, border-radius, font-size 11px).
       Tag dziedziczy kolory z .tag-{slate,blue,amber,green,red,...} per status. */
  }
}

@media (max-width: 900px) {
  .parent-dash-grid { grid-template-columns: 1fr; }
}

/* UI-05 (Etap 4): cele dotykowe 44 px zależą od URZĄDZENIA, nie od szerokości
   okna - tablet w poziomie (> 900 px) też jest dotykowy. Reguły ≤ 900/700 px
   niżej zostają dla wąskich okien z myszą. */
@media (pointer: coarse) {
  .btn, .btn-sm, .icon-btn, .tab, .chip { min-height: 44px; }
  /* 02.10: przełącznik „Wysyłaj" w katalogu maili (skan mobile: 82x30 px). */
  .pz-check-inline { min-height: 44px; }
  .icon-btn { min-width: 44px; }
  .tab, .chip { display: inline-flex; align-items: center; }
}

@media (max-width: 900px) {
  .btn, .icon-btn { min-height: 44px; }
  /* 08.10: picker tematów (lekcja i „Dodaj tematy do programu") - segmenty
     zakresu i „Przeglądaj wszystkie" miały 26-30 px wysokości. */
  .tp-scope-btn { min-height: 44px; }
  .tp-browse > summary { min-height: 44px; display: flex; align-items: center; }
  .pz-check-inline { min-height: 44px; }
  .btn { padding-top: 10px; padding-bottom: 10px; }
  .icon-btn { min-width: 44px; }
  .chip { min-height: 38px; display: inline-flex; align-items: center; }
  .input, .select, .textarea, select, input:not([type="checkbox"]):not([type="radio"]) {
    min-height: 44px;
  }
  /* Czasy trwania lekcji — główne cele dotyku rodzica */
  .pz-duration-btn, .pz-duration-link { padding: 12px 18px; min-height: 44px; display: inline-flex; align-items: center; }
  /* Lista leadów (karty na mobile) — luźniejsze wiersze, łatwiejszy tap */
  table.leads td { padding: 14px 12px; }
  .pager .btn { min-width: 44%; justify-content: center; }
}

@media (max-width: 600px) {
  /* bottom-sheet feel na telefonie */
  .modal { border-radius: var(--shape-xl) var(--shape-xl) 0 0; margin-bottom: 0; width: 100vw; max-width: 100vw; }
}

@media (max-width: 900px) {
  /* Drawer (lead/zadanie/temat/współpraca) na pełną szerokość, mniejszy padding */
  .drawer { width: 100vw; max-width: 100vw; }
  .pz-drawer-body { padding: 16px; gap: 16px; }

  /* Pola formularzy nie wymuszają szerokości (flex/grid min-width fix) */
  .input, .select, .textarea, select, textarea { max-width: 100%; min-width: 0; }

  /* Komórki tabel łamią długie treści zamiast rozpychać układ */
  td, th { overflow-wrap: break-word; }
  table { max-width: 100%; }

  /* Metki w detalach (współprace/ogłoszenia) — ciaśniej, zawijają się */
  .pz-meta-wrap-16, .pz-meta-wrap-12 { gap: 10px; padding: 10px; }
}

@media (max-width: 600px) {
  /* Dwukolumnowe gridy detali → jedna kolumna na telefonie */
  .pz-grid-2-10, .pz-grid-2-12, .pz-sp-grid-2,
  .pz-grid-fit-180, .pz-grid-fit-220, .pz-grid-fit-240 {
    grid-template-columns: 1fr;
  }
  .pz-grid-2-10 > *, .pz-grid-2-12 > *, .pz-sp-grid-2 > * { min-width: 0; }
}

@media (max-width: 700px) {
  #calendar .fc-toolbar { flex-direction: column; gap: 8px; }
  #calendar .fc-toolbar-title { font-size: 15px; }
  #calendar .fc-button { padding: 6px 10px; font-size: var(--fs-sm); }
  #calendar .fc-event { font-size: var(--fs-xs); }
  #calendar .fc-timegrid-slot { height: 1.6em; }
  .cal-toolbar .field { min-width: 100%; }
}

@media (max-width: 640px) {
  .ple-item { gap: 10px; padding: 10px 12px; }
  .ple-date { min-width: 46px; }
}

@media (max-width: 899px) {
  /* Kolumny stackują się w jedną — karta boczna (np. "Zadania domowe")
     dostaje odstęp od ostatniej karty kolumny głównej (ta ma margin-bottom:0
     jako :last-child), inaczej stykają się bez przerwy. */
  .parent-dash-side { margin-top: 20px; }
}

@media (max-width: 700px) {
  .btn, .btn-sm, .icon-btn { min-height: 44px; }
  .icon-btn { min-width: 44px; }
  .nav-item { min-height: 46px; }
  .tab { min-height: 44px; display: inline-flex; align-items: center; }
  .input, .select, .textarea,
  input:not([type="checkbox"]):not([type="radio"]), select, textarea { min-height: 44px; }
  input[type="checkbox"], input[type="radio"] { min-width: 20px; min-height: 20px; }
}

@media(max-width:640px){ .solve-hero{ flex-direction:column; text-align:center; padding:22px 18px; } .solve-hero-pills{ justify-content:center; } }

}

@layer utilities {
.pz-m-0   { margin: 0; }
.pz-m-12  { margin: 12px; }
.pz-mb-0  { margin-bottom: 0; }
.pz-mb-2  { margin-bottom: 2px; }
.pz-mb-6  { margin-bottom: 6px; }
.pz-mb-8  { margin-bottom: 8px; }
.pz-mb-10 { margin-bottom: 10px; }
.pz-mb-12 { margin-bottom: 12px; }
.pz-mb-14 { margin-bottom: 14px; }
.pz-mb-16 { margin-bottom: 16px; }
.pz-mb-20 { margin-bottom: 20px; }
.pz-mt-2  { margin-top: 2px; }
.pz-mt-4  { margin-top: 4px; }
.pz-mt-6  { margin-top: 6px; }
.pz-mt-8  { margin-top: 8px; }
.pz-mt-10 { margin-top: 10px; }
.pz-mt-16 { margin-top: 16px; }
.pz-fs-11 { font-size: var(--fs-xs); }
.pz-fs-12 { font-size: var(--fs-sm); }
.pz-fs-13 { font-size: var(--fs-base); }
.pz-fs-15 { font-size: 15px; }
.pz-fs-16 { font-size: var(--fs-lg); }
.pz-fs-18 { font-size: var(--fs-xl); }
.pz-text  { color: var(--text); }
.pz-dim      { color: var(--text-2); }
.pz-dim-10   { font-size: var(--fs-2xs); color: var(--text-2); }
.pz-dim-11   { font-size: var(--fs-xs); color: var(--text-2); }
.pz-dim-12   { font-size: var(--fs-sm); color: var(--text-2); }
.pz-dim-13   { font-size: var(--fs-base); color: var(--text-2); }
.pz-faint-10 { font-size: var(--fs-2xs); color: var(--text-3); }
.pz-faint-11 { font-size: var(--fs-xs); color: var(--text-3); }
.pz-strong-13 { font-weight: var(--fw-semibold); font-size: var(--fs-base); }
.pz-strong-14 { font-weight: var(--fw-semibold); font-size: var(--fs-md); }
.pz-strong-15 { font-weight: var(--fw-semibold); font-size: 15px; }
.pz-bold-15   { font-size: 15px; font-weight: var(--fw-bold); }
.pz-btn-danger  { color: var(--c-rej); }
.pz-link-accent { color: var(--accent); }
/* a11y (link-in-text-block): link w akapicie musi się odróżniać nie tylko
   kolorem (accent vs text-2 = 1.5:1). Tylko <a> — klasa siedzi też na KPI <div>. */
a.pz-link-accent { text-decoration: underline; text-underline-offset: 2px; text-decoration-thickness: 1px; }
.pz-flex-1   { flex: 1; }
.pz-flex-min { flex: 1; min-width: 0; }
.pz-shrink-0 { flex-shrink: 0; }
.pz-rel      { position: relative; }
.pz-w-full   { width: 100%; }
.pz-w-auto   { width: auto; }
.pz-pl-18    { padding-left: 18px; }
.pz-col-4  { display: flex; flex-direction: column; gap: 4px; }
.pz-col-6  { display: flex; flex-direction: column; gap: 6px; }
.pz-col-7  { display: flex; flex-direction: column; gap: 7px; }
.pz-col-8  { display: flex; flex-direction: column; gap: 8px; }
.pz-col-10 { display: flex; flex-direction: column; gap: 10px; }
.pz-chip-row    { display: flex; flex-wrap: wrap; gap: 6px; }
.pz-chip-row-lg { display: flex; flex-wrap: wrap; gap: 8px; }
.pz-stat-row   { display: flex; justify-content: space-between; align-items: baseline; }
.pz-btn-grow  { flex: 1; justify-content: center; }
.pz-btn-block { width: 100%; text-align: center; justify-content: center; }
.pz-summary-btn { cursor: pointer; list-style: none; }
.pz-page-head  { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; gap: 10px; flex-wrap: wrap; }
.pz-page-title { font-size: 20px; }
.pz-empty-card  { text-align: center; padding: 40px 24px; }
.pz-empty-ico   { font-size: var(--fs-display); margin-bottom: 12px; }
.pz-empty-title { font-weight: var(--fw-semibold); font-size: 15px; margin-bottom: 8px; }
.pz-card-12 { padding: 12px 14px; }
.pz-card-14 { padding: 14px 16px; }
.pz-card-16 { padding: 16px 18px; }
.pz-card-18 { padding: 18px 20px; }
.pz-modal-380 { max-width: 380px; width: 95vw; }
.pz-modal-400 { max-width: 400px; width: 95vw; }
.pz-modal-420 { max-width: 420px; width: 95vw; }
.pz-modal-body-col { display: flex; flex-direction: column; gap: 14px; }
.pz-step-title       { font-weight: var(--fw-semibold); font-size: var(--fs-md); margin-bottom: 12px; }
.pz-step-title-tight { font-weight: var(--fw-semibold); font-size: var(--fs-md); margin-bottom: 10px; }
.pz-step-badge {
  display: inline-block; width: 22px; height: 22px; background: var(--accent);
  color: white; border-radius: 50%; text-align: center; line-height: 22px;
  font-size: var(--fs-sm); margin-right: 6px; }
.pz-duration-btn {
  padding: 10px 16px; border-radius: var(--radius-sm); font-size: var(--fs-base);
  cursor: pointer; transition: transform .15s ease, box-shadow .15s ease, background-color .15s ease, border-color .15s ease, color .15s ease, opacity .15s ease;
  border: 1px solid var(--border); background: var(--surface-2); }
.pz-duration-btn--active {
  border-color: var(--accent);
  background: color-mix(in srgb,var(--accent) 12%,var(--surface));
  color: var(--accent); font-weight: var(--fw-semibold); }
.pz-duration-link {
  padding: 8px 14px; border-radius: var(--radius-sm); font-size: var(--fs-base);
  text-decoration: none; border: 1px solid var(--border); background: var(--surface-2); }
.pz-duration-link--active {
  border-color: var(--accent);
  background: color-mix(in srgb,var(--accent) 12%,var(--surface));
  color: var(--accent); font-weight: var(--fw-semibold); }
.pz-status-pill { font-size: var(--fs-xs); font-weight: var(--fw-bold); padding: 3px 8px; border-radius: var(--shape-full); }
.pz-status-pill--confirmed { color: var(--c-ok); background: var(--c-ok-bg); }
.pz-status-pill--rejected  { color: var(--c-rej); background: var(--c-rej-bg); }
.pz-status-pill--cancelled { color: var(--text-2); background: var(--surface-2); }
.pz-st-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; }
.pz-st-streak-badge { margin-left: 6px; font-size: var(--fs-base); color: var(--c-warn); font-weight: var(--fw-semibold); }
.pz-st-cta { text-decoration: none; display: flex; align-items: center; gap: 14px; padding: 16px 20px; }
.pz-st-cta-ico {
  width: 40px; height: 40px; border-radius: 50%;
  background: color-mix(in srgb,var(--accent) 15%,var(--surface-2));
  display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.pz-st-cta-glyph { font-size: 20px; color: var(--accent); }
.pz-st-cta-title { font-weight: var(--fw-semibold); font-size: var(--fs-md); color: var(--accent); }
.pz-st-cta-sub   { font-size: var(--fs-sm); color: var(--text-2); margin-top: 1px; }
.pz-st-cta-arrow { font-size: var(--fs-xl); color: var(--text-3); }
/* START-UCZNIA (21.10, prośba właściciela): karta „Pierwsze kroki" zamiast „Brak planu nauki" -
   aktywny pakiet (ile lekcji do wykorzystania), rezerwacja od razu, plan ustalany z korepetytorem. */
.pz-start { display: grid; gap: 16px; }
.pz-start-head { display: flex; align-items: center; gap: 14px; }
.pz-start-ico { flex: none; display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: var(--shape-lg);
  color: var(--on-primary); background: var(--g-blue); }
.pz-start-ico .material-symbols-outlined { font-size: var(--fs-2xl); }
.pz-start-kicker { color: var(--accent); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .1em; text-transform: uppercase; }
.pz-start-title { margin: 2px 0 0; color: var(--text); font-size: var(--fs-xl); font-weight: var(--fw-heavy); letter-spacing: -0.01em; line-height: var(--lh-tight); }
.pz-start-pkg { display: flex; align-items: center; gap: 14px; padding: 14px 16px; border-radius: var(--shape-lg);
  background: var(--primary-container); color: var(--on-primary-container); }
.pz-start-num { flex: none; font-size: var(--fs-display); font-weight: var(--fw-black); letter-spacing: -0.03em; line-height: 1; font-variant-numeric: tabular-nums; }
.pz-start-pkg strong { display: block; font-size: var(--fs-lg); font-weight: var(--fw-heavy); }
.pz-start-pkg span { display: block; margin-top: 2px; font-size: var(--fs-base); opacity: .85; }
.pz-start-steps { display: grid; gap: 12px; margin: 0; padding: 0; list-style: none; }
.pz-start-steps li { display: flex; align-items: flex-start; gap: 12px; color: var(--text-2); font-size: var(--fs-md); line-height: var(--lh-base); }
.pz-start-steps strong { display: block; color: var(--text); font-weight: var(--fw-bold); }
.pz-start-step-n { flex: none; display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%;
  background: color-mix(in srgb, var(--accent) 15%, var(--surface-2)); color: var(--accent); font-size: var(--fs-base); font-weight: var(--fw-heavy); }
.pz-start-btn { justify-self: start; }
.pz-st-hero-label {
  font-size: var(--fs-xs); font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .07em;
  color: var(--accent); margin-bottom: 10px; display: flex; align-items: center; gap: 5px; }
.pz-st-countdown {
  flex-shrink: 0; width: 72px; height: 72px; border-radius: 50%;
  background: color-mix(in srgb,var(--accent) 12%,var(--surface));
  border: 2px solid color-mix(in srgb,var(--accent) 35%,var(--border));
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; }
.pz-st-countdown-today { font-size: var(--fs-2xs); font-weight: var(--fw-black); color: var(--accent); letter-spacing: .04em; }
.pz-st-countdown-soon  { font-size: var(--fs-2xs); font-weight: var(--fw-black); color: var(--accent); }
.pz-st-countdown-num   { font-size: 24px; font-weight: var(--fw-black); color: var(--accent); line-height: 1; }
.pz-st-hero-when  { font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--accent); }
.pz-st-prenote {
  margin-top: 10px; padding: 8px 12px;
  background: color-mix(in srgb,var(--accent) 6%,var(--surface-2));
  border-radius: var(--radius-sm); font-size: var(--fs-sm); font-style: italic; color: var(--accent); }
.pz-st-resched-note {
  margin-top: 8px; padding: 8px 12px;
  background: color-mix(in srgb,oklch(0.60 0.18 250) 8%,var(--surface-2));
  border-radius: var(--radius-sm); border-left: 3px solid oklch(0.60 0.18 250);
  font-size: var(--fs-sm); font-weight: var(--fw-bold); color: oklch(0.55 0.18 250); }
.pz-st-resched-note-sm {
  margin-top: 8px; padding: 6px 10px;
  background: color-mix(in srgb,oklch(0.60 0.18 250) 8%,var(--surface-2));
  border-radius: var(--radius-sm); border-left: 2px solid oklch(0.60 0.18 250);
  font-size: var(--fs-xs); font-weight: var(--fw-bold); color: oklch(0.55 0.18 250); }
.pz-st-hero-actions { margin-top: 12px; display: flex; gap: 8px; flex-wrap: wrap; }
.pz-st-pending-card  { border-left: 3px solid var(--c-warn); }
.pz-st-pending-title { color: var(--c-warn); }
.pz-st-pending-row {
  display: flex; align-items: center; gap: 10px; padding: 10px 12px;
  background: color-mix(in srgb,var(--c-warn) 6%,var(--surface-2));
  border-radius: var(--radius-sm); }
.pz-st-lesson-prenote { font-size: var(--fs-sm); color: var(--accent); margin-top: 3px; font-style: italic; }
.pz-st-lesson-actions { margin-top: 8px; display: flex; gap: 6px; flex-wrap: wrap; }
/* W-E8 (05.11): telefon - akcje nadchodzącej lekcji w jednym rzędzie pod tytułem, na całą
   szerokość kafelka (w kolumnie obok daty łamały się po jednym przycisku w wierszu).
   `display: contents` wyciąga dzieci .ple-body do siatki kafelka; od 600 px zwykły flex. */
.ple-item:has(> .ple-body > .pz-st-lesson-actions) {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; column-gap: 10px; align-items: center;
}
.ple-item:has(> .ple-body > .pz-st-lesson-actions) > .ple-body { display: contents; }
.ple-item:has(> .ple-body > .pz-st-lesson-actions) > .ple-body > * { grid-column: 1 / -1; }
.ple-item:has(> .ple-body > .pz-st-lesson-actions) > .ple-date { grid-column: 1; grid-row: 1; }
.ple-item:has(> .ple-body > .pz-st-lesson-actions) > .ple-body > .ple-title { grid-column: 2; grid-row: 1; }
.ple-item:has(> .ple-body > .pz-st-lesson-actions) > .ple-rail { grid-column: 3; grid-row: 1; }
.ple-item > .ple-body > .pz-st-lesson-actions { flex-wrap: nowrap; }
.ple-item > .ple-body > .pz-st-lesson-actions > .btn { flex: 1 1 0; min-width: 0; justify-content: center; }
@media (min-width: 600px) {
  .ple-item:has(> .ple-body > .pz-st-lesson-actions) { display: flex; }
  .ple-item:has(> .ple-body > .pz-st-lesson-actions) > .ple-body { display: block; }
  .ple-item > .ple-body > .pz-st-lesson-actions { flex-wrap: wrap; }
  .ple-item > .ple-body > .pz-st-lesson-actions > .btn { flex: 0 0 auto; }
}
.pz-st-empty-title { font-weight: var(--fw-semibold); font-size: 15px; margin-bottom: 6px; }
.pz-st-complete-card {
  text-align: center; padding: 24px 16px;
  background: linear-gradient(135deg,color-mix(in srgb,var(--c-ok) 12%,var(--surface-2)),var(--surface-2));
  border: 1px solid color-mix(in srgb,var(--c-ok) 30%,var(--border)); }
/* KV-APP-AUDYT-2: puste stany zawsze z gradientowym kafelkiem (jak .empty-ico) */
.pz-st-complete-ico   { width: 56px; height: 56px; margin: 0 auto 6px; border-radius: var(--shape-lg); display: grid; place-items: center; background: var(--g-blue); color: #fff; box-shadow: var(--shadow-tile); font-size: var(--fs-3xl); }
.pz-st-complete-ico .material-symbols-outlined { color: #fff; font-size: var(--fs-3xl); }
.pz-st-complete-title { font-size: var(--fs-lg); font-weight: var(--fw-bold); margin-bottom: 4px; }
.pz-st-plan-title {
  font-size: var(--fs-base); font-weight: var(--fw-semibold); margin-bottom: 8px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pz-st-streak-val { font-size: var(--fs-md); font-weight: var(--fw-bold); color: var(--c-warn); }
.pz-st-progress-track { height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; margin-bottom: 10px; }
.pz-st-progress-bar   { height: 6px; background: var(--accent); border-radius: 3px; transition: width .6s ease; }
.pz-st-plan-link {
  display: flex; align-items: center; gap: 8px; padding: 9px 11px;
  border-radius: var(--radius-sm); border: 1px solid var(--border);
  background: var(--surface-2); text-decoration: none; color: inherit; font-size: var(--fs-sm); }
.pz-st-plan-link--active {
  border-color: var(--accent);
  background: color-mix(in srgb,var(--accent) 10%,var(--surface-2)); }
.pz-st-plan-link-name { font-weight: var(--fw-regular); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pz-st-plan-link-name--active { font-weight: var(--fw-bold); }
.pz-st-exam-card {
  padding: 16px 18px;
  background: linear-gradient(135deg,color-mix(in srgb,var(--accent) 7%,var(--surface-2)),var(--surface-2));
  border: 1px solid color-mix(in srgb,var(--accent) 18%,var(--border)); }
.pz-st-exam-row   { display: flex; align-items: center; gap: 14px; }
.pz-st-exam-days--urgent { color: var(--c-rej); }
.pz-st-exam-days--soon   { color: var(--c-warn); }
.pz-st-resource-btn { gap: 4px; text-decoration: none; }
.pz-st-sticky {
  padding: 9px 12px; border-radius: var(--radius-sm); font-size: var(--fs-base);
  line-height: 1.6; background: var(--surface-2);
  border-left: 3px solid oklch(0.75 0.18 80); }
.pz-st-sticky--red    { border-left-color: var(--c-rej); }
.pz-st-sticky--green  { border-left-color: var(--c-ok); }
.pz-st-sticky--blue   { border-left-color: oklch(0.60 0.18 250); }
.pz-st-sticky--violet { border-left-color: oklch(0.60 0.18 300); }
.pz-st-tutor-row { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.pz-st-tutor-avatar {
  width: 42px; height: 42px; min-width: 42px; font-size: var(--fs-md); font-weight: var(--fw-bold);
  border-radius: 50%; background: color-mix(in srgb,var(--accent) 15%,var(--surface-2));
  color: var(--accent); display: flex; align-items: center; justify-content: center;
  flex-shrink: 0; }
.pz-st-cancel-info {
  padding: 12px; background: color-mix(in srgb,var(--c-rej) 8%,var(--surface-2));
  border-radius: var(--radius-sm); font-size: var(--fs-base); }
.pz-bk-empty-title  { font-weight: var(--fw-semibold); font-size: var(--fs-lg); margin-bottom: 8px; }
.pz-bk-step-hint    { font-size: var(--fs-sm); font-weight: var(--fw-regular); color: var(--text-2); margin-left: 6px; }
.pz-rs-error {
  padding: 12px 16px;
  background: color-mix(in srgb,var(--c-rej) 8%,var(--surface-2));
  border: 1px solid color-mix(in srgb,var(--c-rej) 25%,var(--border));
  border-radius: var(--radius-sm); margin-bottom: 14px; }
.pz-rs-error-title { font-weight: var(--fw-semibold); font-size: var(--fs-base); color: var(--c-rej); }
.pz-rs-empty       { text-align: center; padding: 40px 24px; }
.pz-rs-empty-ico   { font-size: var(--fs-display); margin-bottom: 12px; }
.pz-rs-empty-title { font-weight: var(--fw-semibold); margin-bottom: 6px; }
.pz-rv-success {
  padding: 16px 18px;
  background: linear-gradient(135deg, color-mix(in srgb,var(--c-ok) 12%,var(--surface-2)), var(--surface-2));
  border: 1px solid color-mix(in srgb,var(--c-ok) 35%,var(--border));
  border-radius: var(--radius); margin-bottom: 16px; }
.pz-rv-success-ico   { font-size: var(--fs-3xl); margin-bottom: 8px; }
.pz-rv-success-title { font-weight: var(--fw-bold); font-size: var(--fs-lg); color: var(--c-ok); margin-bottom: 6px; }
.pz-rv-success-when  { font-size: var(--fs-md); font-weight: var(--fw-semibold); margin-bottom: 4px; }
.pz-rv-cancelled {
  padding: 12px 16px; background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--radius-sm); margin-bottom: 14px; font-size: var(--fs-base); color: var(--text-2); }
.pz-rv-booking { padding: 14px 16px; border-left: 3px solid var(--border); }
.pz-rv-booking--pending   { border-left-color: var(--c-warn); }
.pz-rv-booking--confirmed { border-left-color: var(--c-ok); }
.pz-rv-booking--rejected  { border-left-color: var(--c-rej); }
.pz-rv-booking-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.pz-rv-note-quote  { font-size: var(--fs-sm); color: var(--text-2); margin-top: 4px; font-style: italic; }
.pz-rv-tutor-reply { font-size: var(--fs-sm); margin-top: 6px; padding: 6px 10px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-rv-actions     { display: flex; flex-direction: column; gap: 6px; align-items: flex-end; }

.pz-db-progress-track { height: 4px; background: var(--border); border-radius: 2px; overflow: hidden; margin-bottom: 3px; }
.pz-db-progress-bar   { height: 4px; background: var(--accent); border-radius: 2px; }

.pz-ai-center { align-items: center; }
.pz-ai-end { align-items: flex-end; }
.pz-bc-text { border-color: var(--text); }
.pz-bg-text { background: var(--text); }.pz-c-bg { color: var(--bg); }
.pz-c-c-rej { color: var(--c-rej); }
.pz-c-inherit { color: inherit; }
.pz-c-text-3 { color: var(--text-3); }
.pz-flex { display: flex; }
.pz-fs-10 { font-size: var(--fs-2xs); }
.pz-fs-14 { font-size: var(--fs-md); }
.pz-fs-9 { font-size: 9px; }
.pz-fw-400 { font-weight: var(--fw-regular); }
.pz-fw-500 { font-weight: var(--fw-medium); }
.pz-gap-10 { gap: 10px; }
.pz-gap-12 { gap: 12px; }
.pz-gap-16 { gap: 16px; }
.pz-gap-4 { gap: 4px; }
.pz-gap-6 { gap: 6px; }
.pz-gap-8 { gap: 8px; }
.pz-h-5 { height: 5px; }.pz-h-8 { height: 8px; }
.pz-hidden { display: none; }
.pz-inline-block { display: inline-block; }
.pz-italic { font-style: italic; }
.pz-jc-between { justify-content: space-between; }
.pz-maxw-140 { max-width: 140px; }
.pz-maxw-150 { max-width: 150px; }
.pz-maxw-200 { max-width: 200px; }
.pz-maxw-240 { max-width: 240px; }
.pz-mb-18 { margin-bottom: 18px; }
.pz-mb-4 { margin-bottom: 4px; }
.pz-ml-4 { margin-left: 4px; }
.pz-mr-4 { margin-right: 4px; }
.pz-mr-8 { margin-right: 8px; }
.pz-mt-12 { margin-top: 12px; }
.pz-nowrap { white-space: nowrap; }
.pz-p-4 { padding: 4px; }
.pz-p-40 { padding: 40px; }
.pz-pointer { cursor: pointer; }
.pz-self-start { align-self: flex-start; }
.pz-ta-center { text-align: center; }
.pz-td-none { text-decoration: none; }
.pz-btn-ghost-sm { background: none; border: none; cursor: pointer; color: var(--text-3); font-size: var(--fs-xs); }
.pz-empty-dashed { background: var(--surface); border: 1px dashed var(--border-strong); border-radius: var(--radius); padding: 40px 24px; }
.pz-sep-top      { border-top: 1px solid var(--border); padding-top: 14px; margin-top: 4px; }
.pz-c-success    { color: var(--c-ok); }
.pz-c-accent     { color: var(--accent); }
.pz-c-warn       { color: var(--c-prog); }
/* TP7: status tematu w planie (widok tutora) */
/* TP6: pełna pula tematów planu w widoku ucznia/rodzica.
   TP8: tytuł się ZAWIJA (pełna treść widoczna) zamiast ucinać ellipsis;
   wiersz wyrównany do góry, etykieta statusu nie zabiera szerokości tytułu. */
.pz-pool-list { display: flex; flex-direction: column; gap: 2px; }
.pz-pool-row {
  display: flex; align-items: flex-start; gap: 8px;
  padding: 6px 8px; border-radius: var(--shape-sm); font-size: var(--fs-base);
}
.pz-pool-row + .pz-pool-row { border-top: 1px solid var(--border); }
.pz-pool-ico { flex-shrink: 0; display: inline-flex; padding-top: 1px; }
.pz-pool-title { min-width: 0; flex: 1; overflow-wrap: anywhere; }
/* 14.09: bez przekreślenia - wieloliniowe skreślone tytuły u rodzica były nieczytelne; stan mówi ikona i „Zrealizowany" */
.pz-pool-title--done { color: var(--text-3); }
.pz-pool-row--pool { opacity: 0.85; }
.pz-pool-status { flex-shrink: 0; margin-left: auto; white-space: nowrap; padding-top: 2px; }
.pz-acc-summary        { cursor: pointer; font-weight: var(--fw-medium); padding: 8px 0; }
.pz-acc-summary-strong { cursor: pointer; padding: 8px 0; font-weight: var(--fw-semibold); font-size: var(--fs-base); }
.pz-link-contents { display: contents; color: inherit; text-decoration: none; }.pz-inline-form   { display: inline; margin: 0; }
.pz-kbd       { font-family: 'JetBrains Mono'; padding: 1px 4px; background: var(--surface-2); border-radius: 3px; }
.pz-fs-115    { font-size: var(--fs-xs); }
.pz-h-sub     { font-size: var(--fs-md); font-weight: var(--fw-semibold); margin: 18px 0 10px; }
.pz-strong-135   { font-weight: var(--fw-medium); font-size: var(--fs-base); }
.pz-callout-info        { margin-bottom: 14px; padding: 10px 12px; background: oklch(0.95 0.04 230 / 0.4); border-left: 3px solid oklch(0.70 0.10 230); border-radius: 4px; }
.pz-callout-success     { margin-bottom: 14px; padding: 10px 14px; background: oklch(0.95 0.07 155 / 0.5); border: 1px solid oklch(0.78 0.10 155); border-radius: var(--radius-sm); font-size: var(--fs-base); }
.pz-callout-success-box { margin-top: 14px; padding: 14px; background: oklch(0.95 0.07 155 / 0.5); border: 1px solid oklch(0.78 0.10 155); border-radius: var(--radius-sm); }
/* KV-APP 08.10: jasne półprzezroczyste tło callouta na jaśniejszym grafitowym
   motywie ciemnym dawało szary środek - biały tekst 4,2:1 (axe w trybie ciemnym,
   /admin/kalendarze). W ciemnym motywie callouty stoją na tokenach statusów. */
html.dark .pz-callout-info { background: var(--c-new-bg); border-left-color: var(--c-new); }
html.dark .pz-callout-success, html.dark .pz-callout-success-box { background: var(--c-ok-bg); border-color: color-mix(in srgb, var(--c-ok) 45%, transparent); }
.pz-ml-auto    { margin-left: auto; }
.pz-img-contain { object-fit: contain; background: transparent; }
.pz-logo-36    { width: 36px; height: 36px; object-fit: contain; }
.pz-modal-480  { width: 480px; max-width: 96vw; }
.pz-sp-grid-2    { background: var(--surface-2); padding: 14px; border-radius: var(--radius-sm); margin-top: 8px; display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.pz-sp-stack-box { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; padding: 12px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-sp-row-box   { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; padding: 10px 12px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-sp-code      { font-size: var(--fs-xl); font-family: 'JetBrains Mono'; background: var(--surface); padding: 4px 10px; border-radius: 4px; letter-spacing: 0.1em; }
.pz-sp-flex2     { margin: 0; flex: 2; }.pz-sr-footer { margin-top: 32px; padding-top: 16px; border-top: 1px solid var(--border); font-size: var(--fs-xs); color: var(--text-2); display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.pz-pv-hw-box    { background: var(--surface-2); padding: 10px; border-radius: var(--radius-sm); margin-top: 6px; }
/* Uchwyt drag ⋮⋮ tylko w sekcji sortowalnej (Niezrealizowane). MUSI byc w
   warstwie utilities: analogiczna regula w @layer components (ok. linii 4375)
   przegrywala z .pz-pv-drag-handle{display:flex} z tej warstwy, przez co uchwyt
   pokazywal sie tez w niesortowalnych kartach (Zrealizowane) — 4 elementy
   wpadaly w 3-kolumnowy grid i data ladowala na srodku (rozjazd ukladu). */
.pz-pv-select-compact { flex: 0 0 auto; width: auto; min-width: 110px; }
/* Podpowiedź kontekstowa (żarówka) — własne pudełko z oddechem; zgłoszenie
   właściciela 09.09: „ma słaby padding" (wcześniej gołe .dim-12 przy krawędzi). */
.hint-tip { display:flex; align-items:flex-start; gap:8px; margin:10px 0 12px; padding:10px 12px; border-radius: var(--shape-sm); background:var(--surface-2); color:var(--text-2); font-size: var(--fs-sm); line-height:1.45; }
.hint-tip .material-symbols-outlined { font-size: var(--fs-xl); color:var(--c-prog); flex:none; margin-top:-1px; }
.hint-tip .pz-kbd { margin:0 2px; }
.pz-pw-sublist     { display: flex; flex-direction: column; gap: 4px; padding-left: 16px; }
/* TP5: dział wewnątrz grupy poziom+klasa w kreatorze planu */
.pz-pw-grade > summary { margin-top: 2px; }
.pz-pw-cat { padding: 2px 0 4px; }
.pz-pw-cat-head {
  display: flex; align-items: center; gap: 8px;
  padding: 4px 0 4px 8px; font-size: var(--fs-sm);
}
.pz-pw-cat-head [data-select-cat] { flex-shrink: 0; }
.pz-pw-actions     { display: flex; gap: 8px; justify-content: flex-end; padding: 14px 0 40px; }
.pz-pw-topic-label { flex: 1; font-size: var(--fs-sm); cursor: pointer; }
.pz-pw-topic-row          { display: flex; align-items: center; gap: 8px; padding: 6px; border-radius: 4px; }
.pz-pw-topic-row--checked { background: var(--surface-2); }
.pz-ai-start { align-items: flex-start; }
.pz-fs-24 { font-size: 24px; }
.pz-fw-600 { font-weight: var(--fw-semibold); }
.pz-h-28 { height: 28px; }
.pz-h-32 { height: 32px; }
.pz-h-4 { height: 4px; }
.pz-h-44 { height: 44px; }
.pz-mb-3 { margin-bottom: 3px; }
.pz-minw-0 { min-width: 0; }
.pz-minw-130 { min-width: 130px; }
.pz-minw-180 { min-width: 180px; }
.pz-minw-200 { min-width: 200px; }
.pz-p-12 { padding: 12px; }.pz-p-14 { padding: 14px; }
.pz-p-16 { padding: 16px; }
.pz-p-24 { padding: 24px; }.pz-p-4-8 { padding: 4px 8px; }
.pz-p-6-10 { padding: 6px 10px; }
.pz-w-28 { width: 28px; }
.pz-w-32 { width: 32px; }
.pz-w-40 { width: 40px; }
.pz-w-44 { width: 44px; }
.pz-w-80 { width: 80px; }
.pz-wrap { flex-wrap: wrap; }
.pz-col-12      { display: flex; flex-direction: column; gap: 12px; }
.pz-row-box-10  { display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-row-box-sm  { display: flex; align-items: center; gap: 10px; padding: 8px 10px; background: var(--surface); border-radius: var(--radius-sm); }
.pz-row-box-12  { display: flex; align-items: center; gap: 12px; padding: 10px 12px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-row-box-12--muted { opacity: 0.8; }
.pz-row-box-ok  { display: flex; align-items: center; gap: 12px; padding: 12px 14px; background: var(--surface-2); border-radius: var(--radius-sm); border-left: 3px solid var(--c-ok); }
.pz-row-link    { display: flex; align-items: center; gap: 8px; padding: 8px 10px; background: var(--surface-2); border-radius: var(--radius-sm); text-decoration: none; color: inherit; }
.pz-row-between     { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; }
.pz-row-between-12  { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.pz-stat-strip      { display: flex; justify-content: space-between; padding: 8px 12px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-stat-strip--accent { background: color-mix(in srgb,var(--accent) 6%,var(--surface-2)); }
.pz-check-inline { display: flex; align-items: center; gap: 6px; font-size: var(--fs-sm); cursor: pointer; }.pz-grid-fill-180 { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; }
.pz-grid-kpi    { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 12px; margin-bottom: 20px; }
.pz-grid-kpi-sm { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 10px; margin-bottom: 16px; }.pz-ellipsis-dim-12 { font-size: var(--fs-sm); color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pz-ellipsis-500-12 { font-size: var(--fs-sm); font-weight: var(--fw-medium); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }.pz-overline-accent { font-size: var(--fs-xs); color: var(--accent); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: .05em; }
.pz-overline-dim    { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-2); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 8px; }
.pz-list-hint   { font-size: var(--fs-sm); color: var(--text-2); margin: 0; padding-left: 16px; line-height: 1.9; }
.pz-c-info      { color: var(--c-new); }
.pz-strong-warn { font-weight: var(--fw-semibold); font-size: var(--fs-base); color: var(--c-warn); }
.pz-count-badge { background: white; color: var(--accent); border-radius: var(--shape-full); padding: 1px 7px; font-size: var(--fs-xs); margin-left: 4px; }
.pz-pill-info   { font-size: var(--fs-2xs); font-weight: var(--fw-bold); background: color-mix(in srgb,oklch(0.60 0.18 250) 15%,var(--surface-2)); color: oklch(0.55 0.18 250); padding: 2px 8px; border-radius: var(--shape-full); }
.pz-card-ok-outline  { margin-bottom: 14px; border: 1px solid color-mix(in srgb,var(--c-ok) 35%,var(--border)); background: color-mix(in srgb,var(--c-ok) 6%,var(--surface-2)); }
.pz-banner-ok        { padding: 10px 14px; background: color-mix(in srgb,var(--c-ok) 12%,var(--surface-2)); border-radius: var(--radius-sm); margin-bottom: 12px; font-size: var(--fs-base); color: var(--c-ok); font-weight: var(--fw-semibold); }
.pz-banner-ok-bordered, .pz-banner-ok-16 { padding: 10px 14px; background: color-mix(in srgb,var(--c-ok) 12%,var(--surface-2)); border: 1px solid color-mix(in srgb,var(--c-ok) 30%,var(--border)); border-radius: var(--radius-sm); margin-bottom: 14px; font-size: var(--fs-base); color: var(--c-ok); font-weight: var(--fw-semibold); }
.pz-banner-ok-16 { margin-bottom: 16px; }  /* N-4: jedna definicja, różni się tylko marginesem */
.pz-banner-warn      { padding: 12px 16px; background: color-mix(in srgb,var(--c-warn) 10%,var(--surface-2)); border: 1px solid color-mix(in srgb,var(--c-warn) 30%,var(--border)); border-radius: var(--radius-sm); margin-bottom: 14px; }
.pz-banner-warn-row  { padding: 12px 16px; background: color-mix(in srgb,var(--c-warn) 10%,var(--surface-2)); border: 1px solid color-mix(in srgb,var(--c-warn) 30%,var(--border)); border-radius: var(--radius); margin-bottom: 14px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.pz-note-private     { padding: 10px 14px; border-radius: var(--radius-sm); font-size: var(--fs-base); line-height: 1.6; background: color-mix(in srgb,oklch(0.55 0.10 280) 8%,var(--surface-2)); border: 1px dashed oklch(0.55 0.10 280); border-left: 3px solid oklch(0.55 0.10 280); }
.pz-exam-chip   { padding: 8px 14px; background: color-mix(in srgb,var(--accent) 8%,var(--surface-2)); border: 1px solid color-mix(in srgb,var(--accent) 20%,var(--border)); border-radius: var(--radius-sm); text-align: center; flex-shrink: 0; }
.pz-card-warn-l      { padding: 14px 16px; border-left: 3px solid var(--c-warn); }
.pz-info-box-10 { margin-top: 10px; padding: 12px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-info-box-8  { margin-top: 8px; padding: 10px; background: var(--surface-2); border-radius: var(--radius-sm); }
.pz-info-box-13 { font-size: var(--fs-base); padding: 8px 12px; background: var(--surface-2); border-radius: var(--radius-sm); margin-bottom: 10px; }
.pz-card-flush  { padding: 0; overflow: hidden; margin-bottom: 16px; }
.pz-modal-440   { max-width: 440px; width: 95vw; }
.pz-av-day           { padding: 14px 18px; border-bottom: 1px solid var(--border); }
.pz-av-day--last     { border-bottom: none; }
.pz-av-day-head      { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0; }
.pz-av-day-head--open { margin-bottom: 10px; }
/* KV-APP-AUDYT-2: liczby KPI w jednym stylu w całym panelu - atrament, 800,
   ciasne światło; kolor tylko gdy niesie znaczenie (--warn, sukces). Było:
   niebieskie, zielone, pomarańczowe i czarne liczby bez reguły. */
.kpi-value, .pz-kpi-num {
  font-size: var(--fs-3xl); font-weight: var(--fw-black); letter-spacing: -0.035em;
  line-height: 1.05; color: var(--text); font-variant-numeric: tabular-nums;
}
.kpi-value--sm { font-size: var(--fs-2xl); }
.kpi-unit { font-size: var(--fs-lg); font-weight: var(--fw-semibold); color: var(--text-3); letter-spacing: 0; }
.pz-kpi-num--warn    { color: var(--c-warn); }
.pz-kpi-link         { display: block; text-decoration: none; color: inherit; }
.pz-kpi-link:hover, .pz-kpi-link:focus-visible { border-color: var(--primary); }
.pz-db-lesson-row--done  { border-left-color: var(--c-ok); }
.pz-sv-exam-days         { font-size: 20px; font-weight: var(--fw-bold); color: var(--accent); }
.pz-sv-exam-days--urgent { color: var(--c-rej); }
.pz-sv-exam-days--soon   { color: var(--c-warn); }
.pz-sv-lesson        { padding: 12px 14px; border-left: 3px solid var(--accent); }
.pz-sv-lesson--done        { border-left-color: var(--c-ok); }
.pz-sv-lesson--rescheduled { border-left-color: oklch(0.60 0.18 250); }
.pz-sv-lesson--skipped     { border-left-color: var(--text-3); }
.pz-sv-sticky { padding: 10px 14px; border-radius: var(--radius-sm); font-size: var(--fs-base); line-height: 1.6; background: var(--surface-2); border-left: 3px solid oklch(0.75 0.18 80); }
.pz-sv-sticky--red    { border-left-color: var(--c-rej); }
.pz-sv-sticky--green  { border-left-color: var(--c-ok); }
.pz-sv-sticky--blue   { border-left-color: oklch(0.60 0.18 250); }
.pz-sv-sticky--violet { border-left-color: oklch(0.60 0.18 300); }
.pz-fs-22 { font-size: var(--fs-2xl); }
.pz-fs-28 { font-size: var(--fs-3xl); }
.pz-jc-end { justify-content: flex-end; }
.pz-maxw-120 { max-width: 120px; }
.pz-minw-140 { min-width: 140px; }
.pz-ml-6 { margin-left: 6px; }
.pz-mt-14 { margin-top: 14px; }
.pz-mt-18 { margin-top: 18px; }
.pz-p-1-6 { padding: 1px 6px; }
.pz-p-20 { padding: 20px; }
.pz-p-6-8 { padding: 6px 8px; }
.pz-p-8-10 { padding: 8px 10px; }
.pz-ta-left { text-align: left; }
.pz-ta-right { text-align: right; }
.pz-bt-2-bg    { border-top: 2px solid var(--border); background: var(--surface-2); }
.pz-scroll-x   { overflow-x: auto; }
.pz-tbl        { width: 100%; border-collapse: collapse; font-size: var(--fs-base); }
.pz-tbl-12     { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
.pz-bar-mini   { width: 50px; height: 5px; display: inline-block; vertical-align: middle; }
.pz-grid-fit-140 { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; margin-bottom: 20px; }
.pz-grid-fit-160 { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 10px; }
.pz-grid-fit-180 { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; max-width: 100%; }
.pz-grid-fit-220 { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }
.pz-grid-fit-240 { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
.pz-quicklink    { padding: 14px 16px; text-decoration: none; color: inherit; display: flex; align-items: center; gap: 10px; }
.pz-checkbox-lbl { display: flex; align-items: center; gap: 8px; cursor: pointer; font-size: var(--fs-base); }
.pz-checkbox-in  { flex: none; }
.pz-row-end      { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; }
.pz-row-stretch  { display: flex; gap: 8px; align-items: stretch; }
.pz-h-m-0-10     { margin: 0 0 10px; }
.pz-box-10-12    { padding: 10px 12px; background: var(--surface-2); border-radius: var(--radius-sm); }.pz-sep-top-16   { margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); }
.pz-sep-top-fine { margin-top: 32px; padding-top: 16px; border-top: 1px solid var(--border); font-size: var(--fs-xs); color: var(--text-2); }
.pz-sep-top-flush { margin: 0; padding-top: 10px; border-top: 1px solid var(--border); }
.pz-sep-top-ok   { padding-top: 10px; border-top: 1px solid var(--border); font-size: var(--fs-base); color: var(--c-ok); }
/* .pz-banner-ok-16 — scalone z .pz-banner-ok-bordered (N-4, patrz wyżej) */
.pz-cell-ok      { padding: 14px 16px; text-align: center; border: 1px solid color-mix(in srgb,var(--c-ok) 30%,var(--border)); }
.pz-underline    { text-decoration: underline; }
.pz-tr-chip-2    { display: flex; align-items: center; gap: 10px; padding: 8px 10px; background: var(--surface-2); border-radius: var(--radius-sm); }

.pz-billing-total       { font-size: var(--fs-md); font-weight: var(--fw-bold); color: var(--c-warn); }
.pz-billing-total--paid { color: var(--c-ok); }

.pz-bc-danger { border-color: var(--danger); }
.pz-block { display: block; }
.pz-c-danger { color: var(--danger); }
.pz-c-text-muted { color: var(--text-muted); }
.pz-gap-2 { gap: 2px; }
.pz-h-24 { height: 24px; }
.pz-ls-none { list-style: none; }
.pz-maxw-160 { max-width: 160px; }
.pz-maxw-180 { max-width: 180px; }
.pz-maxw-560 { max-width: 560px; }
/* W-E20 (05.11): karta zgody w siatce .login-wrap wystawała o 4 px na telefonie (min-width: auto elementu siatki) */
.login-card.pz-consent-card { max-width: min(560px, 100%); min-width: 0; box-sizing: border-box; }
.pz-consent-sum { display: flex; align-items: center; gap: 6px; min-height: 44px; cursor: pointer; font-weight: var(--fw-semibold); list-style: none; }
.pz-consent-sum::-webkit-details-marker { display: none; }
.pz-consent-links { display: flex; flex-wrap: wrap; align-items: center; gap: 0 8px; }
.pz-consent-sum .material-symbols-outlined { transition: transform var(--motion-fast) var(--ease-std); }
.pz-consent-details[open] > .pz-consent-sum { margin-bottom: 10px; }
.pz-consent-details[open] > .pz-consent-sum .material-symbols-outlined { transform: rotate(180deg); }
@media (prefers-reduced-motion: reduce) { .pz-consent-sum .material-symbols-outlined { transition: none; } }
.pz-minw-120 { min-width: 120px; }
.pz-minw-28 { min-width: 28px; }
.pz-minw-80 { min-width: 80px; }
.pz-op-7 { opacity: .7; }
.pz-p-2-7 { padding: 2px 7px; }
.pz-p-3-8 { padding: 3px 8px; }.pz-self-end { align-self: flex-end; }
.pz-w-120 { width: 120px; }
.pz-w-140 { width: 140px; }
.pz-w-24 { width: 24px; }
.pz-span-all     { grid-column: 1/-1; }
.pz-grid-2-10    { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.pz-grid-2-12    { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.pz-drawer-body  { overflow-y: auto; padding: 20px 24px; display: flex; flex-direction: column; gap: 20px; }
.pz-mr-auto      { margin-right: auto; }
.pz-prewrap-13   { font-size: var(--fs-base); white-space: pre-wrap; line-height: 1.6; }
.pz-prewrap-13-5 { font-size: var(--fs-base); white-space: pre-wrap; line-height: var(--lh-base); }
.pz-prewrap-13-7 { font-size: var(--fs-base); white-space: pre-wrap; line-height: 1.7; font-family: inherit; }
.pz-modal-700    { width: 700px; max-width: 96vw; }
.pz-modal-560    { width: 560px; max-width: 96vw; }
.pz-modal-600    { width: 600px; max-height: 90dvh; }
.pz-modal-660    { max-width: 660px; width: 95vw; }
.pz-modal-680    { max-width: 680px; width: 95vw; }
.pz-callout-amber   { padding: 14px; background: var(--c-prog-bg); border: 1px solid color-mix(in srgb, var(--c-prog) 35%, transparent); }
.pz-sep-top-12f  { padding-top: 12px; border-top: 1px solid var(--border); }
.pz-sep-top-ov   { padding-top: 12px; border-top: 1px solid var(--outline-variant); }.pz-h-18         { font-size: var(--fs-xl); font-weight: var(--fw-semibold); margin: 0 0 4px; }
.pz-h-18-flush   { font-size: var(--fs-xl); font-weight: var(--fw-semibold); line-height: 1.4; margin: 0; }
.pz-btn-link-danger { font-size: var(--fs-xs); color: var(--danger); background: none; border: none; cursor: pointer; padding: 0; }
.pz-font-inherit    { font-family: inherit; line-height: 1.6; }
.pz-font-inherit-15 { font-family: inherit; line-height: var(--lh-base); }
.pz-font-inherit-0  { font-family: inherit; }
.pz-row-end-8    { display: flex; gap: 8px; align-items: flex-end; margin-top: 8px; }
.pz-check-row    { display: flex; align-items: center; gap: 8px; padding: 5px 8px; cursor: pointer; border-radius: var(--shape-xs); transition: background 0.12s; }
.pz-check-row:hover { background: var(--surface); }
.pz-check-row input[type="checkbox"] { flex-shrink: 0; }
.pz-check-row:has(input:checked) { background: var(--surface); }
.pz-check-row .pz-check-title { flex: 1; min-width: 0; font-size: var(--fs-sm); }
.pz-checkbox-18  { flex: none; }   /* KV-APP-CHECKBOX: 24 px jak wszędzie (nazwa historyczna) */
.pz-color-dot    { width: 24px; height: 24px; border-radius: 50%; display: inline-block; border: 2px solid transparent; cursor: pointer; }
.pz-note-muted   { margin: 10px 0 0; font-size: var(--fs-base); color: var(--text-muted); white-space: pre-wrap; }
.pz-m-0-12       { margin: 0 0 12px; }
.pz-ico-16       { font-size: var(--fs-lg); vertical-align: -3px; }
.pz-url-break    { font-size: var(--fs-base); color: var(--accent); word-break: break-all; }
.pz-fs-125-p8    { font-size: var(--fs-sm); padding: 8px 0; }
.pz-fs-125       { font-size: var(--fs-sm); }
.pz-overline-muted   { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; margin-bottom: 8px; }
.pz-overline-muted-6 { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; margin-bottom: 6px; }
.pz-overline-muted-0 { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; }
.pz-overline-dim-3   { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-3); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 8px; }
.pz-overline-amber   { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--c-prog); text-transform: uppercase; letter-spacing: .06em; margin-bottom: 8px; }
.pz-overline-amber-6 { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--c-prog); text-transform: uppercase; letter-spacing: .06em; margin-bottom: 6px; }
.pz-faint-tiny   { font-size: var(--fs-2xs); opacity: .4; }
.pz-row-14-12    { font-size: var(--fs-md); padding: 12px 0; }
.pz-hint-hidden  { font-size: var(--fs-sm); margin: -6px 0 10px; display: none; }
.pz-overline-500 { font-size: var(--fs-sm); margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.06em; font-weight: var(--fw-medium); }
a.pz-stat-link:hover { border-color: var(--primary); }
.pz-textarea-grow-60 { flex: 1; min-width: 0; resize: none; min-height: 60px; }
.pz-track-4      { flex: 1; height: 4px; background: var(--border); border-radius: 2px; overflow: hidden; }
.pz-track-3      { flex: 1; height: 3px; background: var(--border); border-radius: 2px; overflow: hidden; }
.pz-inline-mlauto    { display: inline; margin-left: auto; }
.pz-inline-check     { display: inline-flex; gap: 8px; align-items: center; padding: 6px 0; }
.pz-meta-wrap-16 { display: flex; flex-wrap: wrap; gap: 16px; padding: 12px; background: var(--surface-2); border-radius: var(--shape-sm); font-size: var(--fs-sm); }
.pz-meta-wrap-12 { display: flex; flex-wrap: wrap; gap: 12px; padding: 12px; background: var(--surface-2); border-radius: var(--shape-sm); font-size: var(--fs-sm); }
.pz-stack-box-sm { display: flex; flex-direction: column; gap: 8px; background: var(--surface-2); padding: 10px 12px; border-radius: var(--shape-sm); }
.pz-res-row      { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--border); }
.pz-row-link-grow    { display: flex; align-items: center; gap: 12px; flex: 1; min-width: 0; color: inherit; text-decoration: none; }/* TP4: picker tematów jako drzewo (poziom+klasa) → dział → temat */
.topic-tree-picker {
  max-height: 300px; overflow-y: auto;
  background: var(--surface-2); border-radius: var(--radius-sm); padding: 4px;
}
.topic-tree-picker .ttp-grade { border-bottom: 1px solid var(--border); }
.topic-tree-picker .ttp-grade:last-child { border-bottom: none; }
.topic-tree-picker .ttp-sum {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 8px; cursor: pointer; user-select: none;
  font-size: var(--fs-sm); font-weight: var(--fw-semibold); list-style: none;
}
.topic-tree-picker .ttp-sum::-webkit-details-marker { display: none; }
.topic-tree-picker .ttp-cat .ttp-sum { font-weight: var(--fw-medium); padding-left: 20px; }
.topic-tree-picker .ttp-grade-name { font-weight: var(--fw-semibold); }
.topic-tree-picker .ttp-sum .chev { transition: transform 0.16s; font-size: var(--fs-base); }
.topic-tree-picker details[open] > .ttp-sum .chev { transform: rotate(90deg); }
.topic-tree-picker .ttp-topics { padding: 2px 0 6px 26px; }
.topic-tree-picker .ttp-cat:not([open]) .ttp-sum [data-select-cat] { display: none; }

/* TP-UX: nagłówek pickera + licznik + wyszukiwarka (ścieżki/plany) */
.ttp-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 6px; }
.ttp-count {
  font-family: inherit; font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  color: var(--text-3); background: var(--surface-2);
  border-radius: var(--shape-full); padding: 2px 10px; white-space: nowrap;
}
.ttp-count.is-active { color: var(--on-primary); background: var(--primary); }
.ttp-search { position: relative; display: flex; align-items: center; margin-bottom: 6px; }
.ttp-search .material-symbols-outlined { position: absolute; left: 10px; color: var(--text-3); pointer-events: none; }
.ttp-search-input {
  width: 100%; padding: 8px 10px 8px 34px;
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: var(--surface); color: var(--text); font-size: var(--fs-base);
}
.ttp-search-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px oklch(0.62 0.16 265 / 0.16); }
.ttp-empty { padding: 16px 10px; text-align: center; color: var(--text-3); font-size: var(--fs-sm); }

/* TP-UX: wyszukiwarka w bazie tematów (poza pickerem) + polish drzewa */
.topics-search { max-width: 440px; margin: 6px 0 12px; }
.topics-grade-head, .topics-cat-head { transition: background 0.12s; }
.topics-grade-head:hover, .topics-cat-head:hover { background: var(--surface-1); }
.topics-grade[open] > .topics-grade-head { box-shadow: inset 3px 0 0 var(--accent); }
.topics-cat[open] > .topics-cat-head { box-shadow: inset 3px 0 0 oklch(0.75 0.08 265 / 0.55); }
.topics-grade-head .grade-badge { margin-left: auto; }
/* Filtr wyszukiwarki: te wiersze deklarują display:flex PO .pz-hidden, więc
   potrzebują mocniejszego selektora, by ukrycie zadziałało (TP-UX). */
.pz-check-row.pz-hidden, .pz-pw-topic-row.pz-hidden, .topic-row.pz-hidden { display: none; }
.pz-col-20       { display: flex; flex-direction: column; gap: 20px; }
.pz-drag-handle-sm   { cursor: grab; padding: 0 3px; color: var(--text-3); user-select: none; font-size: var(--fs-md); }
.pz-cursor-default   { cursor: default; }
.pz-on-accent-tiny   { color: #fff; font-size: var(--fs-2xs); line-height: 1; }
.pz-hr-flush     { border: none; border-top: 1px solid var(--border); margin: 0; }.pz-consent-box   { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px 18px; margin: 16px 0; font-size: var(--fs-base); line-height: 1.7; }
.pz-consent-check { display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm); cursor: pointer; font-size: var(--fs-base); line-height: var(--lh-base); }
.pz-consent-check--gap { margin-bottom: 14px; }
.pz-task-progress-4 { height: 4px; background: var(--accent); border-radius: 2px; }
.pz-task-progress-3 { height: 3px; background: var(--accent); border-radius: 2px; }
.pz-checklist-toggle { background: none; border: 1.5px solid var(--border); border-radius: 3px; width: 16px; height: 16px; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; padding: 0; }
.pz-checklist-toggle--done { background: var(--accent); border-color: var(--accent); }
.pz-checklist-item { font-size: var(--fs-sm); flex: 1; }
.pz-checklist-item--done { text-decoration: line-through; opacity: .5; }
.pz-due-tag { font-size: var(--fs-2xs); }
.pz-due-tag--overdue { color: var(--danger); }
.pz-stat--danger { border-color: var(--danger); }
.pz-row--overdue { background: var(--c-rej-bg); }
.pz-avatar--overdue { background: var(--danger); color: #fff; }
.pz-days--warn { color: var(--warning); }
.pz-op-3 { opacity: .3; }
.pz-modal-560w { max-width: 560px; width: 95vw; }
.pz-st-progress-bar, .pz-db-progress-bar, .pz-task-progress-3, .pz-task-progress-4 {
  background: linear-gradient(90deg,
    var(--primary),
    color-mix(in srgb, var(--primary) 65%, oklch(0.72 0.16 200)));
}
.pz-st-hero {
  background: linear-gradient(135deg,color-mix(in srgb,var(--accent) 9%,var(--surface-2)),var(--surface-2));
  border: 1px solid color-mix(in srgb,var(--accent) 25%,var(--border));
  padding: 24px;
}
.pz-st-hero-row {
  display: flex;
  align-items: flex-start;
  gap: 18px;
}
.pz-st-hero-title {
  font-weight: var(--fw-bold);
  margin-bottom: 3px;
  line-height: 1.3;
  font-size: var(--fs-xl);
}
.pz-st-lesson-row {
  display: flex;
  align-items: flex-start;
  gap: 14px;
}
.pz-db-lesson-row {
  display: flex;
  align-items: center;
  background: var(--surface-2);
  border-radius: var(--radius-sm);
  border-left: 3px solid var(--accent);
  padding: 12px 14px;
  gap: 12px;
}
.pz-row-box-10, .pz-row-box-12 { padding: 12px 14px; }
.pz-grid-kpi, .pz-grid-kpi-sm { gap: 14px; }
/* 14.09: na telefonie KPI zawsze po dwa, a nieparzysty ostatni kafel na całą
   szerokość (pulpit korepetytora: „Do ułożenia" wisiał sam z dziurą obok) */
@media (max-width: 520px) {
  .pz-grid-kpi, .pz-grid-kpi-sm { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pz-grid-kpi > :last-child:nth-child(odd), .pz-grid-kpi-sm > :last-child:nth-child(odd) { grid-column: 1 / -1; }
}
.pz-st-sticky, .pz-sv-sticky, .pz-callout-info, .pz-callout-success,
.pz-banner-ok, .pz-banner-ok-bordered, .pz-banner-ok-16, .pz-banner-warn, .pz-note-private { border-radius: var(--shape-md); }
.pz-status-pill--pending {
  color: var(--c-warn);
  background: var(--c-warn-bg);
  animation: pulse-soft 2.2s ease-in-out infinite;
}
.pz-grid-2-10 > *, .pz-grid-2-12 > * { min-width: 0; }
.pz-st-pkg {
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--shape-sm, 8px);
  background: var(--surface-2);
}
.pz-st-pkg-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  flex-wrap: wrap;
}
.pz-w-70 { width: 70px; }
.pz-w-90 { width: 90px; }

/* ===== RESPONSYWNOSC MOBILE (utilities -> wygrywa nad baza) ===== */
@media (max-width: 700px) {
  /* Siatki 2-kol -> 1 kolumna (karty menu finansow, pary pol formularza) */
  .pz-grid-2-10, .pz-grid-2-12 { grid-template-columns: 1fr; }
  /* WYCIEKI (08.10): wiersz z kwotą, opisem, plakietkami i przyciskiem
     (rozliczenia lekcji, wpłaty) nie zawijał się i poszerzał stronę o ~130 px. */
  .pz-row-box-10, .pz-row-box-12 { flex-wrap: wrap; row-gap: 8px; }
  /* Szerokie tabele -> poziomy scroll zamiast sciskania i lamania slow */
  .pz-tbl, .pz-tbl-12, .audit-tbl {
    display: block; max-width: 100%; overflow-x: auto; white-space: nowrap;
    -webkit-overflow-scrolling: touch; overscroll-behavior-x: contain;
  }
  /* Gesty wiersz dzialu (tematy): badge tematow + godziny + przyciski z oddechem */
  .topics-cat-head { flex-wrap: wrap; row-gap: 6px; }
  /* 14.09: długa nazwa działu nie spada pod strzałkę (zostawała sama w linii) -
     nazwa bierze resztę pierwszego wiersza, plakietki schodzą pod nią */
  .topics-cat-name { flex: 1 1 calc(100% - 30px); min-width: 0; }
  .topics-cat-name + .lvl-badge { margin-left: 20px; }
  .topics-cat-count { margin-left: 2px; color: var(--text-3); }
  /* KPI / staty (finanse, dashboard) -> zawijanie zamiast uciecia 3. karty */
  .stats { flex-wrap: wrap; overflow: visible; }
  .stats > .stat { flex: 1 1 140px; min-width: 0; }
  /* Tabele leads/probne: nazwa pelna szerokosc, status + akcje pod spodem (koniec sciskania) */
  table.leads tr.row { flex-wrap: wrap; row-gap: 2px; }
  /* TABELE-KV: lista z .who-td (leady, próbne, współprace) zostaje w jednej
     linii: imię się ucina, status i strzałka po prawej (wcześniej zawijały się
     pod imię i wyglądały jak nagłówek następnego wiersza). Pozostałe tabele
     są na telefonie kartami .tbl-m (core.js). */
  table.leads tr.row > td.who-td { flex: 1 1 0; min-width: 0; }
  /* Wiersz zawinięty = jedna karta: separator tylko na <tr>, nie pod każdą komórką (znikają urwane kreski pod badge'em i strzałką); akcje/strzałka do prawej. */
  table.leads tr.row > td { border-bottom: none; }
  table.leads tr.row > td.col-actions { margin-left: auto; }
  /* Komórka akcji z przyciskami (nie tylko chevron): szerokość wg treści, inaczej 32px ucina „Edytuj". */
  table.leads tr.row > td.col-actions--wide { flex: 0 0 auto; width: auto; }
  /* ── Zgłoszenie właściciela 11.09: „w wielu miejscach ten frontend nam
     leży". Skan mobile (a11y/mobile_scan.py) pokazał 602 znaleziska na 48
     stronach. Poniżej naprawa dwóch klas, które odpowiadały za większość. ──

     1) POLA FORMULARZY 16px. iOS Safari POWIĘKSZA stronę przy dotknięciu pola
     z font-size < 16px i NIE wraca do poprzedniego powiększenia. Efekt: każde
     kliknięcie w wyszukiwarkę czy filtr zostawia użytkownika w przyciętym
     układzie, który trzeba ręcznie odszczypnąć. To jest ta połowa wrażenia
     „wszystko się rozjeżdża", której nie widać na zrzucie ekranu.
     Reguła celowo dotyczy WSZYSTKICH kontrolek, nie tylko .input - jednorazowe
     pola (.search-input, .gb-review, .ttp-search-input) mają
     własne rozmiary i każde z nich zoomowało tak samo.

     `!important` jest tu na miejscu, a nie z lenistwa: pierwsze podejście bez
     niego zostawiło 61 pól, bo każda klasa jednorazowa wygrywa specyficznością
     z selektorem elementu. „Żadna kontrolka na telefonie nie ma mniej niż
     16px" to reguła bez wyjątków - system nie daje wyboru - więc zapisujemy ją
     tak, żeby nie dało się jej przypadkiem nadpisać nową klasą. */
  input, select, textarea { font-size: var(--fs-lg) !important; }

}
}

/* ---------- Gradebook / Oceny — zwijane karty uczniów ---------- */
.st-neutral { background: var(--c-new-bg); color: var(--text-3); }
/* Pionowa lista zwiniętych uczniów (zamiast siatki kart) */

/* Karta ucznia = <details>; nagłówek klikalny zwija/rozwija */
.gb-card {
  border: 1px solid var(--border); border-radius: var(--shape-lg, 14px);
  background: var(--surface); overflow: hidden;
}
.gb-card[open] { border-color: var(--primary); }
.gb-head {
  display: flex; align-items: center; gap: 12px;
  padding: 13px 16px; cursor: pointer; list-style: none;
  user-select: none;
}
.gb-head::-webkit-details-marker { display: none; }
.gb-head:hover { background: var(--primary-container); }
.gb-card[open] .gb-head { border-bottom: 1px solid var(--border); }
.gb-chevron {
  flex: none; width: 8px; height: 8px; margin-left: 2px;
  border-right: 2px solid var(--text-3); border-bottom: 2px solid var(--text-3);
  transform: rotate(-45deg); transition: transform .15s ease;
}
.gb-card[open] .gb-chevron { transform: rotate(45deg); }
.gb-who { display: flex; flex-direction: column; gap: 1px; margin-right: auto; min-width: 0; }
.gb-name { font-weight: var(--fw-semibold); font-size: 15px; }
.gb-stats { display: flex; flex-wrap: wrap; gap: 10px; justify-content: flex-end; text-align: right; }
.gb-body { padding: 4px 16px 14px; }

.gb-table { width: 100%; }
.gb-table th { text-align: left; font-size: var(--fs-xs); color: var(--text-3); font-weight: var(--fw-semibold); padding: 6px 8px; }
.gb-table td { padding: 8px; vertical-align: top; border-top: 1px solid var(--border); }
.gb-table form { margin: 0; }
.gb-task-title { font-weight: var(--fw-medium); }
.gb-task-hw { margin-top: 2px; max-width: 340px; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }

/* Pigułka Oddane / Nie oddane */
.gb-toggle {
  border: 1px solid var(--border); cursor: pointer; font-family: inherit;
  white-space: nowrap; padding: 5px 12px; border-radius: var(--shape-full);
  background: var(--c-new-bg); color: var(--text-3);
  font-size: var(--fs-sm); font-weight: var(--fw-semibold); min-height: 30px;
}
.gb-toggle.is-on { background: var(--c-ok-bg); color: var(--c-ok); border-color: transparent; }
.gb-toggle:hover { filter: brightness(0.97); }
html.dark .gb-toggle:hover { filter: brightness(1.1); }

.gb-grade-form { display: flex; gap: 8px; align-items: center; min-width: 220px; }
.gb-grade-form .gb-review { flex: 1; }
.gb-grade {
  appearance: none; -webkit-appearance: none;
  padding: 5px 12px; border-radius: var(--shape-full);
  border: 1px solid var(--border); background: var(--surface); color: var(--text);
  font-size: var(--fs-base); font-weight: var(--fw-semibold); cursor: pointer;
  min-height: 30px; min-width: 56px; text-align: center;
}
.gb-grade:hover { border-color: var(--text-3); }
/* Komentarz tutora do pracy */
.gb-review {
  width: 100%; min-width: 160px; padding: 6px 10px; min-height: 30px;
  border: 1px solid var(--border); border-radius: var(--shape-md, 10px);
  background: var(--surface); color: var(--text); font-family: inherit; font-size: var(--fs-base);
}
.gb-review:focus { border-color: var(--primary); box-shadow: 0 0 0 3px var(--state-focus-primary); outline: none; }
/* Ocena od ucznia/rodzica (read-only) */
.gb-fb { display: inline-block; font-weight: var(--fw-semibold); font-size: var(--fs-base); color: var(--c-prog); white-space: nowrap; }
.gb-empty { padding: 8px 0; }

/* Gradebook na telefonie: ogólny wzorzec kart (.tbl-m, dawniej .pz-cards: etykieta z lewej, wartość
   z prawej) tu NIE działa — zgłoszenie właściciela 11.09 („oceny się
   rozjeżdżają"). Powód: .pz-cards robi z <td> flexa, a komórki gradebooka mają
   po kilka bloków i formularze. Tytuł zadania lądował obok pracy domowej,
   a pole „Komentarz do pracy" wyjeżdżało poza ekran (poziomy scroll całej
   karty). Dlatego komórki układamy w PION, a nie w dwie kolumny.
   TABELE-KV: próg 900 px jak wspólne karty .tbl-m (core.js). */
@media (max-width: 900px) {
  .pz-tbl.pz-cards.gb-table td {
    display: block; text-align: left; padding: 6px 0; min-width: 0;
  }
  .pz-tbl.pz-cards.gb-table td::before {
    display: block; margin-bottom: 4px; font-size: var(--fs-xs);
    text-transform: uppercase; letter-spacing: .02em; white-space: normal;
  }
  /* Zadanie to nagłówek karty — etykieta „Zadanie" niczego nie wnosi. */
  .pz-tbl.pz-cards.gb-table td[data-label="Zadanie"]::before { content: none; }
  .pz-tbl.pz-cards.gb-table .gb-task-title { font-size: var(--fs-md); font-weight: var(--fw-semibold); }
  /* Praca domowa pełną szerokością — 340px z desktopu rozpychało kartę. */
  .pz-tbl.pz-cards.gb-table .gb-task-hw { max-width: none; }
  /* Status i ocena obok siebie (mieszczą się), komentarz w osobnym wierszu. */
  .pz-tbl.pz-cards.gb-table .gb-grade-form { flex-wrap: wrap; min-width: 0; }
  .pz-tbl.pz-cards.gb-table .gb-review { flex: 1 1 100%; min-width: 0; }
  .pz-tbl.pz-cards.gb-table .gb-toggle { width: 100%; }
  /* Wiersz = karta zadania: trochę więcej oddechu niż w wersji tabelarycznej. */
  .pz-tbl.pz-cards.gb-table tr { padding: 10px 12px; }

  /* Nagłówek ucznia: na telefonie nie ma miejsca na dwie kolumny (nazwisko
     łamało się na „4 LO", a staty uciekały do prawej pojedynczymi kawałkami).
     Imię w jednym wierszu, staty pod spodem, do lewej. */
  .gb-head { flex-wrap: wrap; row-gap: 4px; padding: 12px 14px; }
  .gb-who { flex: 1 1 calc(100% - 22px); }
  .gb-stats { flex: 1 1 100%; justify-content: flex-start; text-align: left; gap: 8px; }
  .gb-body { padding: 4px 10px 12px; }
}

/* Dostepnosc: tekst tylko dla czytnikow ekranu */
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
/* W-E12: ukryte pole pliku za przyciskiem-etykietą - fokus z klawiatury widać na przycisku */
.acc-file:focus-visible + .acc-file-btn { outline: 2px solid var(--primary); outline-offset: 2px; }
.acc-file-btn { cursor: pointer; }
.acc-file-name { overflow-wrap: anywhere; min-width: 0; }

/* Stawki korepetytora (users_form) — kolumny miały tylko 12px odstępu, etykiety
   niemal się stykały, a podpowiedzi różnej długości rozjeżdżały dolną krawędź.
   Szerszy gap poziomy + wyrównanie do góry = spójny rytm z resztą formularza. */
.tutor-rates-grid { gap: 16px 24px; align-items: start; }
.tutor-rates-grid .field-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ============================================================
   TP-UNI: Zunifikowana sekcja "Tematy planu" (widok planu, tab lista)
   — pula + przypisanie do lekcji + status w jednym drzewie:
   (poziom+klasa) → dział → temat. Klasy ptp-* (plan-topic-pool).
   ============================================================ */
.ptp-card { border-left: 3px solid var(--primary); }
.ptp-group { margin-top: 12px; }
.ptp-group > summary {
  cursor: pointer; font-weight: var(--fw-semibold); font-size: var(--fs-base);
  display: flex; align-items: center; gap: 8px; padding: 4px 0;
}
.ptp-group > summary:hover { color: var(--primary); }
.ptp-cat { margin: 2px 0 2px 14px; }
.ptp-cat > summary {
  cursor: pointer; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-3);
  text-transform: uppercase; letter-spacing: 0.06em;
  display: flex; align-items: center; gap: 8px; padding: 6px 0;
}
.ptp-cat > summary:hover { color: var(--text); }
.ptp-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 6px 0; border-bottom: 1px solid var(--border);
}
.ptp-cat .ptp-row:last-of-type { border-bottom: none; }
.ptp-move { display: flex; flex-direction: column; gap: 3px; flex: none; }
.ptp-move-btn {
  display: grid; place-items: center; width: 30px; height: 26px;
  border: none; background: none; cursor: pointer; color: var(--text-3);
  border-radius: 4px; padding: 0; font-size: var(--fs-sm); line-height: 1;
  font-family: inherit;
}
.ptp-move-btn:hover:not(:disabled) { background: var(--surface-2); color: var(--text); }
.ptp-move-btn:disabled { opacity: 0.3; cursor: default; }
/* UX: przesuwanie CAŁYCH bloków (klasa/dział) — strzałki w nagłówku grupy */
.ptp-grp-move { display: inline-flex; gap: 2px; margin-left: auto; }
.ptp-grp-move .ptp-move-btn { width: 26px; height: 22px; }
.ptp-title {
  display: flex; align-items: center; gap: 8px;
  flex: 1 1 220px; min-width: 0; font-size: var(--fs-base);
}
.ptp-title-text { min-width: 0; overflow-wrap: break-word; }
.ptp-assign { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.ptp-assign-form { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.ptp-lesson-chip {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--fs-sm); color: var(--text-2); text-decoration: none;
  background: var(--surface-2); border: 1px solid var(--border);
  padding: 3px 9px; border-radius: var(--shape-full); white-space: nowrap;
}
.ptp-lesson-chip:hover { border-color: var(--primary); color: var(--text); }
.ptp-lesson-chip .material-symbols-outlined { font-size: var(--fs-md); }
.ptp-status { display: flex; align-items: center; gap: 6px; flex: none; }
/* Mobile: tytuł w pierwszej linii obok strzałek; przypisanie i status łamią
   się do drugiej linii z wcięciem pod tytułem. */
@media (max-width: 600px) {
  .ptp-cat { margin-left: 6px; }
  .ptp-row { row-gap: 6px; }
  .ptp-title { flex-basis: calc(100% - 44px); }
  .ptp-assign { margin-left: 34px; }
  .ptp-assign, .ptp-status { flex: 1 1 auto; }
  .ptp-status { justify-content: flex-end; }
}

/* ── TP14: "Wszystkie tematy planu" w głównej kolumnie rodzica — grupy działów ── */
.pz-pool-group { border-top: 1px solid var(--border); }
.pz-pool-group:first-of-type { border-top: 0; }
.pz-pool-group-h {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 0; cursor: pointer; list-style: none;
  font-weight: var(--fw-semibold); font-size: var(--fs-base);
}
.pz-pool-group-h::-webkit-details-marker { display: none; }
.pz-pool-group-chev { font-size: var(--fs-xl); color: var(--text-3); transition: transform .15s ease; }
.pz-pool-group[open] > .pz-pool-group-h .pz-pool-group-chev { transform: rotate(180deg); }
.pz-pool-group .pz-pool-list { padding: 0 0 8px 26px; }
@media (max-width: 600px) { .pz-pool-group .pz-pool-list { padding-left: 8px; } }

/* ── TP14: sekcja "Tematy planu" w prezentacji ── */
.pres-topics { margin-bottom: 8px; }
.pres-topic-group { margin-bottom: 14px; }
.pres-topic-group-h {
  display: flex; align-items: center; gap: 8px;
  font-weight: var(--fw-bold); font-size: var(--fs-base); text-transform: uppercase;
  letter-spacing: .04em; color: var(--text-2);
  padding-bottom: 6px; border-bottom: 1px solid var(--border);
  margin-bottom: 4px;
}
.pres-topic-row {
  display: flex; align-items: flex-start; gap: 8px;
  padding: 6px 0; border-bottom: 1px solid var(--border);
  font-size: var(--fs-base);
}
.pres-topic-row:last-child { border-bottom: 0; }
.pres-topic-title { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.pres-topic-title--done { text-decoration: line-through; color: var(--text-3); }
.pres-topic-status { flex-shrink: 0; white-space: nowrap; }
@media print { .pres-topic-group { break-inside: avoid; } }

/* ── UX-szlif (16.07): przyciski kontaktu nie ucinają etykiet ──
   flex:1 + min-width:0 pozwalał ściskać przycisk poniżej szerokości treści
   ("WhatsApp" obcięte). max-content: przycisk trzyma naturalną szerokość,
   a przy braku miejsca ZAWIJA się do nowej linii (kontener ma flex-wrap). */
.pz-chip-row .pz-btn-grow { min-width: max-content; }

/* Hero rodzica na bardzo wąskich ekranach: mniejszy pierścień i odstępy,
   żeby nic nie wystawało poza kartę. */
@media (max-width: 400px) {
  .solve-hero { gap: 14px; padding: 16px 16px; }
  .solve-hero-ring, .solve-hero-ring svg { width: 76px; height: 76px; }
  .solve-hero-ring-pct { font-size: 19px; }
  .solve-hero-title { font-size: 19px; }
}

/* ============================================================
   QA 2026-07: definicje dla klas-widm (klasy obecne w szablonach,
   dotąd bez stylu) — leads/daily.html, parent/student.html,
   admin/dashboard.html.
   ============================================================ */

/* „Mój dzień" — siatka kart z ocenami rodziców (#oceny-rodzicow) */
.daily-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
@media (max-width: 720px) { .daily-grid { grid-template-columns: 1fr; } }
.daily-card-title { flex: 1; min-width: 0; font-weight: var(--fw-semibold); }

/* Panel rodzica — nazwa działu w nagłówku grupy tematów (TP14) */
.pz-pool-group-name { flex: 1; min-width: 0; overflow-wrap: break-word; }

/* Statystyki szkoły — podświetlenie wiersza tabeli per-korepetytor */
.table-row-hover:hover { background: var(--surface-2); }

/* ── TP17: kompaktowe kontrolki sekcji "Tematy planu" (akcje in-place, HTMX) ── */
.ptp-select {
  height: 30px; padding: 2px 26px 2px 10px; font-size: var(--fs-sm);
  max-width: 210px; border-radius: var(--shape-full);
}
.ptp-assign-form .ptp-select { color: var(--text-3); }
#tematy-planu.htmx-request { opacity: .55; transition: opacity .12s ease; }

/* ── REDESIGN 21w: raport postępów ── */
.rpt-wrap { max-width: 780px; margin: 0 auto; padding: 24px 16px 60px; }

/* Toolbar + nawigacja miesięcy */
.rpt-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 20px; flex-wrap: wrap; }
.rpt-monthnav { display: flex; align-items: center; gap: 8px; }
.rpt-monthnav-label { font-size: var(--fs-base); font-weight: var(--fw-semibold); padding: 6px 14px; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--shape-full); font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Nagłówek dokumentu (masthead) */
.rpt-mast { position: relative; overflow: hidden; background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-lg); padding: 20px 22px 18px; margin-bottom: 16px; display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; flex-wrap: wrap; }
.rpt-mast::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 4px; background: var(--grad); }
.rpt-mast-brand { display: flex; align-items: center; gap: 12px; }
.rpt-mast-name { font-size: var(--fs-lg); font-weight: var(--fw-bold); letter-spacing: -0.01em; }
.rpt-mast-sub { font-size: var(--fs-sm); color: var(--text-2); margin-top: 1px; }
.rpt-mast-meta { display: flex; gap: 20px; flex-wrap: wrap; }
.rpt-meta-item { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rpt-meta-item + .rpt-meta-item { border-left: 1px solid var(--border); padding-left: 20px; }
.rpt-meta-lbl { font-size: var(--fs-2xs); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: .07em; color: var(--text-3); }
.rpt-meta-val { font-size: var(--fs-base); font-weight: var(--fw-semibold); }

/* Stat-tile KPI */
.rpt-kpi { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 24px; }
.rpt-kpi-tile { position: relative; background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-md); padding: 14px 16px 12px; min-width: 0; }
.rpt-kpi-ico { position: absolute; top: 12px; right: 12px; font-size: var(--fs-xl); color: var(--text-3); opacity: .8; }
.rpt-kpi-val { font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: -0.035em; font-variant-numeric: tabular-nums; line-height: 1.05; }   /* KV-APP-KPI: skala .kpi-value--sm */
.rpt-kpi-val--ok { color: var(--c-ok); }
.rpt-kpi-lbl { font-size: var(--fs-xs); color: var(--text-2); margin-top: 2px; }
.rpt-kpi-ringrow { display: flex; align-items: center; gap: 10px; }

/* Mini-ring SVG (realizacja %) */
.rpt-ring { width: 34px; height: 34px; flex-shrink: 0; transform: rotate(-90deg); }
.rpt-ring-track { fill: none; stroke: var(--surface-3); stroke-width: 3.6; }
.rpt-ring-val { fill: none; stroke: var(--accent); stroke-width: 3.6; stroke-linecap: round; animation: rpt-ring-draw .8s var(--ease-decel) both; }
@keyframes rpt-ring-draw { from { stroke-dasharray: 0, 100; } }

/* Sekcje: nagłówek ikona + tytuł + licznik */
.rpt-section { margin-bottom: 24px; }
.rpt-sec-head { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }
.rpt-sec-head .material-symbols-outlined { font-size: var(--fs-xl); color: var(--accent); }
.rpt-sec-title { font-size: var(--fs-base); font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .06em; color: var(--text-2); margin: 0; }
.rpt-sec-count { font-size: var(--fs-xs); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; color: var(--text-2); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--shape-full); padding: 1px 8px; }

/* Timeline lekcji: oś + węzły statusów + data + karta */
.rpt-tl { position: relative; }
.rpt-tl::before { content: ""; position: absolute; left: 81px; top: 14px; bottom: 14px; width: 2px; background: var(--border); border-radius: 1px; }
.rpt-tl-item { position: relative; display: grid; grid-template-columns: 56px 28px 1fr; gap: 0 12px; padding-bottom: 14px; }
.rpt-tl-item:last-child { padding-bottom: 0; }
.rpt-tl-when { text-align: right; padding-top: 3px; }
.rpt-tl-day { display: block; font-size: var(--fs-base); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.rpt-tl-sub { display: block; font-size: var(--fs-2xs); color: var(--text-3); font-variant-numeric: tabular-nums; }
.rpt-tl-node { position: relative; z-index: 1; width: 28px; height: 28px; border-radius: var(--shape-full); display: flex; align-items: center; justify-content: center; background: var(--surface); border: 2px solid var(--border); color: var(--text-3); }
.rpt-tl-node .material-symbols-outlined { font-size: 15px; }
.rpt-st-done .rpt-tl-node { background: var(--c-ok); border-color: var(--c-ok); color: var(--bg); }
.rpt-st-skipped .rpt-tl-node { background: var(--c-rej-bg); border-color: var(--c-rej); color: var(--c-rej); }
.rpt-st-rescheduled .rpt-tl-node { background: var(--c-prog-bg); border-color: var(--c-prog); color: var(--c-prog); }
.rpt-tl-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-md); padding: 12px 14px; min-width: 0; }
.rpt-tl-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.rpt-tl-head > div { min-width: 0; }
.rpt-tl-title { font-size: var(--fs-base); font-weight: var(--fw-semibold); line-height: 1.35; overflow-wrap: anywhere; }
.rpt-tl-cat { font-size: var(--fs-xs); color: var(--text-3); margin-top: 2px; }
.rpt-tl-notes { font-size: var(--fs-sm); color: var(--text-2); margin-top: 6px; line-height: var(--lh-base); }
.rpt-hw { display: flex; gap: 8px; align-items: flex-start; font-size: var(--fs-sm); margin-top: 8px; padding: 8px 10px; background: var(--surface-2); border-left: 3px solid var(--accent); border-radius: var(--shape-xs); line-height: 1.45; }
.rpt-hw .material-symbols-outlined { font-size: 15px; color: var(--accent); flex-shrink: 0; margin-top: 1px; }
.rpt-fb { display: flex; gap: 6px; align-items: center; font-size: var(--fs-xs); color: var(--text-2); margin-top: 7px; }
.rpt-fb .material-symbols-outlined { font-size: var(--fs-md); color: var(--c-prog); }

/* Chipy statusów */
.rpt-chip { display: inline-flex; align-items: center; white-space: nowrap; font-size: var(--fs-2xs); font-weight: var(--fw-semibold); padding: 2px 9px; border-radius: var(--shape-full); flex-shrink: 0; }
.rpt-chip-ok { background: var(--c-ok-bg); color: var(--c-ok); }
.rpt-chip-rej { background: var(--c-rej-bg); color: var(--c-rej); }
.rpt-chip-prog { background: var(--c-prog-bg); color: var(--c-prog); }
.rpt-chip-plan { background: var(--surface-2); color: var(--text-2); border: 1px solid var(--border); }

/* Pusty miesiąc */
.rpt-empty { text-align: center; padding: 40px 20px; background: var(--surface); border: 1px dashed var(--border-strong); border-radius: var(--shape-lg); color: var(--text-2); font-size: var(--fs-base); }
.rpt-empty .material-symbols-outlined { display: block; font-size: 30px; color: var(--text-3); margin: 0 auto 8px; }

/* Mobile (konwencja projektu: telefon = 600) */
@media (max-width: 600px) {
  .rpt-kpi { grid-template-columns: repeat(2, 1fr); }
  .rpt-mast-meta { gap: 14px; }
  .rpt-meta-item + .rpt-meta-item { padding-left: 0; border-left: 0; }
  .rpt-tl::before { left: 63px; }
  .rpt-tl-item { grid-template-columns: 42px 24px 1fr; gap: 0 10px; }
  .rpt-tl-node { width: 24px; height: 24px; }
  .rpt-tl-node .material-symbols-outlined { font-size: var(--fs-base); }
}

/* Motion: respektuj prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
  .rpt-ring-val { animation: none; }
}

/* Print: kafle w rzędzie, węzły bez łamania, tła oszczędne */
@media print {
  .rpt-wrap { max-width: none; padding: 0; }
  .rpt-kpi { grid-template-columns: repeat(4, 1fr); gap: 8px; }
  .rpt-mast, .rpt-kpi-tile, .rpt-tl-item, .rpt-tl-card { break-inside: avoid; }
  .rpt-mast, .rpt-kpi-tile, .rpt-tl-card, .rpt-empty { box-shadow: none; }
  .rpt-ring-val { animation: none; }
  .rpt-mast::before, .rpt-tl-node, .rpt-chip, .rpt-hw, .rpt-ring-track, .rpt-ring-val { print-color-adjust: exact; -webkit-print-color-adjust: exact; }
}

/* ── REDESIGN 21w: panel ucznia (timeline+tematy) ── */
/* Nakładka na parent/student.html: listy lekcji dostają pionowy timeline
   (klasy pz-tl-*), a "Wszystkie tematy planu" miękkie kółka statusów
   i mini-pasek postępu działu. Wyłącznie tokeny motywu (dark mode w cenie). */

/* Timeline: oś po lewej, węzeł w kolorze statusu, karta lekcji po prawej */
.pz-tl { position: relative; padding-left: 22px; gap: 12px; }
.pz-tl::before {
  content: ""; position: absolute; left: 6px; top: 10px; bottom: 10px;
  width: 2px; border-radius: var(--shape-full); background: var(--border);
}
.pz-tl > .ple-item {
  position: relative;
  transition: transform .2s ease, background .2s ease;
}
.pz-tl > .ple-item::before {
  content: ""; position: absolute; left: -19px; top: 50%;
  width: 8px; height: 8px; margin-top: -4px;
  border-radius: var(--shape-full);
  background: var(--text-3);
  box-shadow: 0 0 0 3px var(--surface);
}
.pz-tl--up > .ple-item::before   { background: var(--accent); }
.pz-tl--done > .ple-item::before { background: var(--c-ok); }
.pz-tl > .ple-item:hover {
  transform: translateY(-1px);
  border-color: color-mix(in srgb, var(--accent) 28%, var(--border));
  box-shadow: 0 4px 14px -8px color-mix(in srgb, var(--accent) 35%, transparent);
}
/* Kompaktowy bąbel daty; zrealizowane lekcje w kolorze statusu ok */
.pz-tl .ple-date { border-radius: var(--shape-sm); min-width: 48px; }
.pz-tl--done .ple-date--done { background: var(--c-ok-bg); color: var(--c-ok); }
/* Najbliższa lekcja: delikatne wyróżnienie akcentem */
.pz-tl--next > .ple-item:first-child {
  border-color: color-mix(in srgb, var(--accent) 40%, var(--border));
  background: color-mix(in srgb, var(--accent) 6%, var(--surface));
}
.pz-tl--next > .ple-item:first-child::before {
  background: var(--accent);
  box-shadow: 0 0 0 3px var(--surface),
              0 0 0 5px color-mix(in srgb, var(--accent) 30%, transparent);
}
@media (max-width: 600px) {
  .pz-tl { padding-left: 16px; }
  .pz-tl::before { left: 3px; }
  .pz-tl > .ple-item::before { left: -16px; box-shadow: 0 0 0 2px var(--surface); }
}

/* "Wszystkie tematy planu": nagłówek działu z mini-paskiem postępu
   (licznik tekstowy "x/y zrealizowane" zostaje obok) */
.pz-pool-group-h { padding: 11px 0; }
.pz-pool-group-meter {
  flex: 0 0 auto; width: 72px; height: 5px; overflow: hidden;
  border-radius: var(--shape-full); background: var(--surface-2);
}
.pz-pool-group-meter-fill {
  display: block; height: 100%;
  border-radius: var(--shape-full); background: var(--grad);
}
.pz-pool-group-count { flex: 0 0 auto; }
@media (max-width: 600px) { .pz-pool-group-meter { width: 44px; } }

/* Wiersze tematów: ikona statusu w miękkim kółku, oddech, hover row */
.pz-pool-list { gap: 3px; }
.pz-pool-row {
  align-items: center; padding: 7px 8px; border-radius: var(--shape-sm);
  transition: background .15s ease;
}
.pz-pool-row + .pz-pool-row { border-top: 0; }
.pz-pool-row:hover { background: var(--surface-2); }
.pz-pool-ico {
  width: 26px; height: 26px; padding-top: 0;
  align-items: center; justify-content: center;
  border-radius: var(--shape-full); background: var(--surface-3);
}
.pz-pool-row--done .pz-pool-ico      { background: var(--c-ok-bg); }
.pz-pool-row--review .pz-pool-ico    { background: var(--c-prog-bg); }
.pz-pool-row--scheduled .pz-pool-ico { background: color-mix(in srgb, var(--accent) 12%, transparent); }
.pz-pool-status { padding-top: 0; }

/* Ruch wyłączony przy prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
  .pz-tl > .ple-item, .pz-pool-row,
  .pz-pool-group-chev, .ple-collapse > summary .chev { transition: none; }
  .pz-tl > .ple-item:hover { transform: none; }
}

/* ── REDESIGN 21w: prezentacja planu ── */
/* Nagłówek dokumentu: pierścień postępu tematów + pigułki meta + pasek lekcji.
   Wyłącznie tokeny (dark mode gratis), jeden akcent, radius z --shape-*. */
.pres-hero {
  background: var(--grad-soft);
  border: 1px solid var(--border);
  border-radius: var(--shape-lg);
  padding: 26px 30px;
  margin-bottom: 36px;
}
/* v2 (zgłoszenie właściciela): nagłówek u góry z ringiem po prawej,
   statystyki jako RÓWNE kafle w gridzie (pigułki o różnych szerokościach
   łamały się w poszarpany układ). */
.pres-hero-top { display: flex; align-items: center; gap: 26px; justify-content: space-between; }
.pres-hero-heading { min-width: 0; flex: 1; }
.pres-hero-ring { position: relative; flex: none; width: 138px; height: 138px; }
.pres-hero-ring svg { display: block; width: 100%; height: 100%; }
.pres-ring-track { stroke: var(--surface); }
.pres-ring-fill  { stroke: var(--accent); transition: stroke-dashoffset var(--motion-slow) var(--ease-std); }
.pres-hero-ring-txt {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px; text-align: center; padding: 0 22px;
}
.pres-hero-ring-txt .pres-meta-label { font-size: 8px; letter-spacing: 0.06em; line-height: 1.3; margin-top: 3px; max-width: 70px; }
.pres-hero-ring-txt .pres-meta-value { font-size: 27px; font-weight: var(--fw-bold); letter-spacing: -0.02em; line-height: 1; color: var(--text); }
.pres-hero .pres-title { font-size: 25px; margin: 0 0 3px; }
.pres-hero .pres-sub { margin-bottom: 0; }
.pres-hero-stats {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 20px;
}
.pres-hero-stats:has(> :nth-child(4)) { grid-template-columns: repeat(4, 1fr); }
.pres-hero-stat {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--shape-md);
  padding: 12px 14px;
  display: flex; flex-direction: column; gap: 2px;
}
.pres-hero-stat > .material-symbols-outlined { font-size: 19px; color: var(--accent); margin-bottom: 4px; }
.pres-hero-stat .pres-meta-value { font-size: 19px; font-weight: var(--fw-bold); line-height: 1.15; font-variant-numeric: tabular-nums; }
.pres-hero-stat .pres-meta-label { font-size: 9px; letter-spacing: 0.07em; }
@media (max-width: 600px) {
  .pres-hero-top { flex-direction: column-reverse; align-items: flex-start; gap: 14px; }
  .pres-hero-stats, .pres-hero-stats:has(> :nth-child(4)) { grid-template-columns: repeat(2, 1fr); }
}

.pres-hero-usage { margin-top: 16px; }
.pres-hero-usage-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 6px; }
.pres-hero-usage .pres-meta-value { font-size: var(--fs-base); }
.pres-usage-track {
  height: 6px; border-radius: var(--shape-full);
  background: var(--surface); border: 1px solid var(--border);
  overflow: hidden;
}
.pres-usage-fill { height: 100%; border-radius: var(--shape-full); background: var(--accent); }

/* Tematy planu: karty działów z mini-paskiem postępu, statusy w miękkich
   kółkach. PEŁNA szerokość dokumentu (2 kolumny były za wąskie dla długich
   maturalnych tytułów — zgłoszenie właściciela 16.07); wiersze zagęszczone. */
.pres-topics { column-gap: 22px; }
.pres-topic-group {
  break-inside: avoid; page-break-inside: avoid; -webkit-column-break-inside: avoid;
  display: inline-block; width: 100%;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--shape-md);
  padding: 14px 16px 8px;
  margin: 0 0 16px;
}
.pres-topic-group-h { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.pres-topic-group-h .dim-12 { flex: none; white-space: nowrap; }
.pres-topic-group-bar {
  height: 4px; border-radius: var(--shape-full);
  background: var(--surface-2);
  margin: 8px 0 6px; overflow: hidden;
}
.pres-topic-group-fill { height: 100%; border-radius: var(--shape-full); background: var(--accent); }
.pres-topic-row { align-items: center; gap: 9px; }
.pres-topic-ico {
  flex: none; width: 25px; height: 25px; border-radius: var(--shape-full);
  display: grid; place-items: center;
}
.pres-topic-ico .material-symbols-outlined { font-size: 15px; }
.pres-topic-ico--done      { background: var(--c-ok-bg);   color: var(--c-ok); }
.pres-topic-ico--review    { background: var(--c-prog-bg); color: var(--c-prog); }
.pres-topic-ico--scheduled { background: var(--primary-container); color: var(--accent); }
.pres-topic-ico--todo      { background: var(--surface-2); color: var(--text-3); }

/* Lekcje: pionowy timeline dokumentowy — oś, węzły, data w bąblu, treść w karcie. */
.pres-timeline { margin-bottom: 8px; }
.pres-timeline .pres-lesson-row {
  grid-template-columns: 34px minmax(0, 1fr);
  gap: 0 14px;
  padding: 0 0 20px;
  border-bottom: none;
  position: relative;
}
.pres-timeline .pres-lesson-row:last-child { padding-bottom: 4px; }
.pres-timeline .pres-lesson-row::before {
  content: ""; position: absolute;
  left: 16px; top: 36px; bottom: -2px; width: 2px;
  background: var(--border); border-radius: var(--shape-full);
}
.pres-timeline .pres-lesson-row:last-child::before { display: none; }
.pres-timeline .pres-num {
  width: 30px; height: 30px; margin: 1px 0 0 2px;
  background: var(--surface); font-size: var(--fs-sm);
  position: relative; z-index: 1;
}
.pres-timeline .pres-num .material-symbols-outlined { font-size: var(--fs-lg); }
.pres-timeline .pres-num.done { color: var(--surface); }
.pres-tl-body { min-width: 0; }
.pres-timeline .pres-date {
  display: inline-flex; align-items: baseline; gap: 6px;
  background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--shape-full);
  padding: 2px 12px; margin-bottom: 8px;
  font-size: var(--fs-sm); width: max-content; max-width: 100%;
}
.pres-timeline .pres-lesson-content {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--shape-md);
  padding: 13px 16px;
  transition: border-color 0.2s var(--ease-std);
}
.pres-timeline .pres-lesson-content:hover { border-color: var(--border-strong); }

/* Mobile: hero w kolumnie, pierścień mniejszy, tematy w 1 kolumnie (domyślnie). */
@media (max-width: 600px) {
  .pres-hero { padding: 22px 18px; }
  .pres-hero-ring { width: 116px; height: 116px; }
  .pres-hero-ring-txt .pres-meta-value { font-size: 24px; }
  
  .pres-hero-usage { margin-left: auto; margin-right: auto; }
  .pres-hero-usage-head { justify-content: center; gap: 8px; }
}

/* Reduced motion: bez przejść. */

/* Druk: zbędne tła znikają, nic nie łamie się w środku, zero animacji. */
@media print {
  .pres-container, .pres-container * { transition: none !important; animation: none !important; }
  .pres-hero { background: none; break-inside: avoid; page-break-inside: avoid; }
  .pres-ring-track { stroke: var(--border); }
  .pres-topic-group, .pres-topic-row { break-inside: avoid; page-break-inside: avoid; }
  .pres-topic-ico { background: none; border: 1px solid var(--border); }
  .pres-timeline .pres-lesson-row { break-inside: avoid; page-break-inside: avoid; }
  .pres-timeline .pres-lesson-content { background: none; }
  .pres-timeline .pres-date { background: none; }
  
}

/* ── REDESIGN 21w: prezentacja planu — korekta po weryfikacji wizualnej ──
   Mini-pasek postępu działu zastępuje starą linię pod nagłówkiem grupy
   (bez tego były dwa separatory jeden pod drugim). */
.pres-topic-group .pres-topic-group-h { border-bottom: 0; padding-bottom: 0; margin-bottom: 0; }

/* PAY-2: przycisk „Zapłać" jako <summary> (zalążek płatności online INT2) */
.pz-pay-summary { list-style: none; cursor: pointer; }
.pz-pay-summary::-webkit-details-marker { display: none; }

/* LES-BULK: pasek działań masowych w sekcji "Niezrealizowane" planu */
.pz-bulk-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px 10px; margin: 8px 0; border: 1px solid var(--border);
  border-radius: var(--shape-sm); background: var(--surface-2); }
/* Karta to GRID (18px uchwyt · 56px data · 1fr treść · auto akcje) — checkbox
   jako 5. dziecko wypychał datę do kolumny uchwytu. Karta z checkboxem
   dostaje dodatkową kolumnę (regresja zgłoszona przez właściciela). */
.pz-bulk-pick { align-self: center; cursor: pointer; flex-shrink: 0; }
/* PAY-2b UX: zaplanowana lekcja u rodzica — neutralny zegar zamiast
   zielonego "ptaszka" (zielony sugerował odbytą — uwaga właściciela). */
.pay-inst-ico.is-planned{ background:var(--c-new-bg); color:var(--c-new); }

/* ---------- Strefa bezpieczeństwa nad dolnym paskiem ----------
   Dolny pasek nawigacji jest `position: fixed`, więc zasłania ostatnie ~64px
   strony. `.page` ma na to zapas w padding-bottom, ale skan mobile pokazał
   elementy z dolną krawędzią 786-872px przy pasku od 780px i stronie
   przewiniętej DO KOŃCA (scrollTop 753 = maksimum, scrollHeight 1597,
   okno 844) - czyli treść realnie nie do kliknięcia.

   Zapas `.page` nie wystarczy, bo nie każda lista siedzi w jego przepływie -
   łatanie kontener po kontenerze zbiło liczbę z 3 do 1 na „Moim tygodniu"
   i zostawiło resztę. Zamiast gonić kolejne przypadki: pusty blok na KOŃCU
   dokumentu. Ostatnie 80px strony (64px paska + 16px oddechu) jest wtedy
   puste niezależnie od tego, w jakim kontenerze siedzi ostatni przycisk.

   `body::after` zamiast paddingu na body, bo padding na body wchodzi
   w interakcję z marginesami dzieci; pusty blok po prostu zajmuje miejsce. */
@media (max-width: 700px) {
  /* SKLEP-SPACER (08.10): tylko gdy strona ma dolny pasek. Wcześniej zapas
     dostawały też strony bez niego (sklep, próbna, logowanie) - pusty pas
     120px pod treścią na telefonie. */
  body:has(.bottom-nav)::after {
    content: "";
    display: block;
    /* 16px oddechu nie wystarczyło ostatniej karcie lekcji na /plan/1 - jej
       kontrolki nadal kończyły się 3-67px w pasie zasłoniętym przez pasek.
       56px to wysokość jednej karty z zapasem; kosztuje trochę pustego miejsca
       na dole każdej strony, co jest tańsze niż nieklikalny przycisk. */
    height: calc(var(--bottom-nav-h) + 56px + env(safe-area-inset-bottom, 0px));
  }
}

/* ---------- PLAN-2 (14.09): widok planu ucznia ----------
   Etap 2 propozycji wyglądu: nagłówek z pierścieniem postępu i menu „⋯",
   następna lekcja, wiersze lekcji w grupach (<details>), panel postępu
   w działach i liczby planu. Stare `.lesson-card` zostaje dla profilu ucznia. */
.plan-head { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; padding: 16px 18px; margin-bottom: 12px; background: var(--surface); border: 1px solid var(--outline-variant); border-radius: var(--shape-lg); box-shadow: var(--elev-1); }
.plan-ring { --p: 0; position: relative; flex: none; width: 64px; height: 64px; border-radius: 50%; display: grid; place-items: center; background: conic-gradient(var(--primary) calc(var(--p) * 1%), var(--surface-3) 0); }
.plan-ring::before { content: ""; position: absolute; inset: 7px; border-radius: 50%; background: var(--surface); }
.plan-ring b { position: relative; font-size: 15px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.plan-ring-of { font-size: var(--fs-xs); font-weight: var(--fw-medium); color: var(--text-2); }
.plan-ring--long b { font-size: var(--fs-sm); }
.pw-pack[hidden] { display: none; }
.plan-head-id { flex: 1 1 260px; min-width: 0; display: grid; gap: 4px; }
.plan-head-name { margin: 0; font-size: 21px; font-weight: var(--fw-bold); letter-spacing: -0.015em; line-height: var(--lh-tight); text-wrap: balance; }
.plan-head-meta { display: flex; align-items: center; gap: 6px 12px; flex-wrap: wrap; font-size: var(--fs-base); color: var(--text-2); }
.plan-head-acts { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.plan-menu > summary { list-style: none; }
.plan-menu > summary::-webkit-details-marker { display: none; }
.plan-menu[open] > .dropdown-menu { display: block; }
.plan-menu-list { min-width: 240px; }
.plan-menu-list .dropdown-item { width: 100%; border: 0; background: none; font: inherit; font-size: var(--fs-base); text-align: left; }

.lstat { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--shape-full); font-size: var(--fs-xs); font-weight: var(--fw-semibold); white-space: nowrap; }
.lstat--new  { background: var(--c-new-bg); color: var(--c-new); }
.lstat--ok   { background: var(--c-ok-bg); color: var(--c-ok); }
.lstat--rej  { background: var(--c-rej-bg); color: var(--c-rej); }
.lstat--prog { background: var(--c-prog-bg); color: var(--c-prog); }
.lstat--mute { background: var(--surface-2); color: var(--text-3); }

.plan-layout { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 16px; align-items: start; }
.plan-main { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; min-width: 0; }
/* W-D4 (audyt 05.11): `minmax(0, 1fr)` + `min-width: 0` - długie etykiety („Lekcji do końca programu”,
   nazwa działu) nie rozpychają kolumny 300 px poza ekran. */
.plan-side { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; position: sticky; top: 12px; min-width: 0; }
.plan-side .panel-card, .plan-side .cat-bars { grid-template-columns: minmax(0, 1fr); min-width: 0; }
.plan-side .cat-bars > li, .plan-side .cat-bars-top { min-width: 0; }

.plan-next { display: grid; gap: 12px; padding: 16px; background: var(--surface); border: 1px solid var(--outline-variant); border-radius: var(--shape-lg); box-shadow: var(--elev-1); }
.plan-next.is-due { border-color: color-mix(in srgb, var(--primary) 45%, transparent); box-shadow: 0 0 0 3px var(--state-focus-primary), var(--elev-1); }
.plan-next-top { display: flex; gap: 14px; align-items: center; }
.plan-next-date { flex: none; width: 60px; padding: 6px 0; display: grid; text-align: center; line-height: 1.15; border-radius: var(--shape-md); background: var(--primary-container); color: var(--on-primary-container); }
.plan-next-date small { font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: .04em; }
.plan-next-date b { font-size: 23px; font-weight: var(--fw-black); font-variant-numeric: tabular-nums; }
.plan-next-main { min-width: 0; display: grid; gap: 2px; }
.plan-next-eyebrow { font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: .05em; text-transform: uppercase; color: var(--primary); }
.plan-next-title { margin: 0; font-size: var(--fs-lg); font-weight: 650; line-height: 1.3; text-wrap: balance; }
.plan-next-sub { margin: 0; font-size: var(--fs-base); color: var(--text-2); }
.plan-next-status { margin-top: 0; }
.plan-next-status .btn { min-height: 38px; padding: 6px 14px; font-size: var(--fs-base); }
.plan-next-more { display: inline-flex; align-items: center; gap: 4px; min-height: 36px; font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--text-2); cursor: pointer; list-style: none; }
.plan-next-more::-webkit-details-marker { display: none; }
.plan-next-details[open] > .plan-next-more .material-symbols-outlined { transform: rotate(180deg); }
.plan-next-details > .lrow-body { padding: 10px 0 0; border-top: 1px solid var(--outline-variant); margin-top: 6px; }

.plan-bulk { border: 1px dashed var(--outline-variant); border-radius: var(--shape-md); padding: 0 12px; }
.plan-bulk[open] { border-style: solid; background: var(--surface); }
.plan-bulk-sum { display: flex; align-items: center; gap: 6px; min-height: 40px; font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--text-2); cursor: pointer; list-style: none; }
.plan-bulk-sum::-webkit-details-marker { display: none; }
.plan-bulk .pz-bulk-bar { margin: 0 0 10px; }
.plan-main .pz-bulk-pick { display: none; }
.plan-main.is-picking .pz-bulk-pick { display: inline-block; }

.plan-group { display: grid; grid-template-columns: minmax(0, 1fr); gap: 8px; }
.plan-group-h { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.plan-group-h h2 { margin: 0; font-size: var(--fs-sm); font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--text-3); display: flex; align-items: center; gap: 6px; }
.plan-group-act { margin-left: auto; }
.plan-group-sum { list-style: none; cursor: pointer; min-height: 40px; }
.plan-group-sum::-webkit-details-marker { display: none; }
.plan-group-sum .lrow-chev { margin-left: auto; }
.plan-group--finished[open] > .plan-group-sum .lrow-chev { transform: rotate(180deg); }
.plan-list { background: var(--surface); border: 1px solid var(--outline-variant); border-radius: var(--shape-md); overflow: hidden; }

.lrow { display: flex; align-items: flex-start; gap: 8px; padding: 0 12px; border-top: 1px solid var(--outline-variant); }
.lrow:first-child { border-top: 0; }
.lrow .lrow-handle { align-self: center; cursor: grab; color: var(--text-3); user-select: none; padding: 0 2px; }
.lrow .pz-bulk-pick { align-self: center; margin: 0; }
.lrow-details { flex: 1; min-width: 0; }
.lrow-sum { display: grid; grid-template-columns: 76px minmax(0, 1fr) auto auto 20px; align-items: center; gap: 12px; min-height: 52px; padding: 6px 0; cursor: pointer; list-style: none; }
.lrow-sum::-webkit-details-marker { display: none; }
.lrow-date { font-size: var(--fs-base); font-weight: 650; line-height: var(--lh-tight); font-variant-numeric: tabular-nums; }
.lrow-date small { display: block; font-size: var(--fs-xs); font-weight: var(--fw-medium); color: var(--text-3); }
.lrow-main { min-width: 0; display: grid; font-size: var(--fs-base); }
.lrow-main b { font-weight: var(--fw-semibold); }
.lrow-main small { font-size: var(--fs-sm); color: var(--text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lrow-icons { display: flex; gap: 4px; color: var(--text-3); }
.lrow-icons .material-symbols-outlined { font-size: var(--fs-xl); }
.lrow-icons .is-ok { color: var(--c-ok); }
.lrow-chev { color: var(--text-3); font-size: 20px; transition: transform var(--motion-fast, .15s); }
.lrow-details[open] > .lrow-sum .lrow-chev { transform: rotate(180deg); }
.lrow-details[open] > .lrow-sum { border-bottom: 1px dashed var(--outline-variant); }
.lrow-body { padding: 10px 0 14px; }
.lrow-body > .lesson-card-status:first-child { margin-top: 0; }
.lrow--finished .lrow-date, .lrow--finished .lrow-main b { color: var(--text-2); }
.lrow-delete { margin-top: 10px; }

.panel-card { display: grid; gap: 10px; padding: 14px; background: var(--surface); border: 1px solid var(--outline-variant); border-radius: var(--shape-md); }
.panel-card-h { display: flex; align-items: center; gap: 8px; }
.panel-card-h h2 { margin: 0; font-size: var(--fs-md); font-weight: 650; display: flex; align-items: center; gap: 6px; }
.panel-card-h a { margin-left: auto; font-size: var(--fs-sm); }
.cat-bars { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.cat-bars-top { display: flex; justify-content: space-between; gap: 8px; font-size: var(--fs-sm); margin-bottom: 4px; }
.cat-bars-top span:first-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cat-bar { display: flex; height: 7px; border-radius: var(--shape-full); background: var(--surface-3); overflow: hidden; }
.cat-bar i, .cat-key i { display: block; }
.cat-bar-ok { background: var(--c-ok); }
.cat-bar-rev { background: var(--c-prog); }
.cat-bar-plan { background: color-mix(in srgb, var(--primary) 45%, transparent); }
.cat-key { display: flex; gap: 10px; flex-wrap: wrap; font-size: var(--fs-xs); color: var(--text-3); }
.cat-key span { display: inline-flex; align-items: center; gap: 4px; }
.cat-key i { width: 9px; height: 9px; border-radius: 3px; }
.plan-kpis { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin: 0; }
.plan-kpis > div { min-width: 0; }
.plan-kpis dt { overflow-wrap: anywhere; }
.plan-kpis > div { padding: 8px 10px; border-radius: var(--shape-sm); background: var(--surface-2); }
.plan-kpis dt { font-size: var(--fs-xs); color: var(--text-3); }
.plan-kpis dd { margin: 0; font-size: 17px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }

@media (max-width: 1100px) {
  .plan-layout { grid-template-columns: 1fr; }
  .plan-side { position: static; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
}
@media (max-width: 700px) {
  .plan-head { padding: 14px; gap: 12px; }
  .plan-ring { width: 52px; height: 52px; }
  .plan-ring::before { inset: 6px; }
  .plan-ring b { font-size: var(--fs-base); }
  .plan-head-name { font-size: var(--fs-xl); }
  .plan-head-acts { width: 100%; }
  .plan-head-acts > .btn { flex: 1; justify-content: center; }
  .plan-menu .dropdown-menu { right: 0; left: auto; }
  .lrow { padding: 0 10px; }
  .lrow-sum { grid-template-columns: 58px minmax(0, 1fr) auto 20px; gap: 8px; }
  .lrow-icons { display: none; }
  .plan-next-status { display: grid; grid-template-columns: repeat(3, 1fr); }
  .plan-next-status .btn { justify-content: center; padding: 8px 4px; }
  /* 14.09: nagłówek grupy w jednej linii - kalendarz jako ikona, przyciski do prawej */
  .plan-group-h { flex-wrap: nowrap; }
  .plan-group-h .lesson-order-toggle { margin-left: auto; }
  .plan-group-h .lesson-order-toggle + .plan-group-act { margin-left: 0; }
  .plan-group-act-txt { display: none; }
}

/* ---------- PROG-3 (14.09): „Program" planu i tryb kolejności ----------
   Tryb czytania (domyślny) chowa strzałki; `is-ordering` chowa przypisania
   i statusy, a pokazuje strzałki (44px na telefonie - blok celów dotykowych)
   i płaską listę puli. Ten sam tryb dostaje /tematy (`.topics-tree.is-ordering`). */
.prog [hidden] { display: none !important; }
.prog-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap; }
.prog-title { margin: 0; font-size: 15px; font-weight: 650; display: flex; align-items: center; gap: 6px; }
.prog-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.prog-search { flex: 1 1 220px; margin: 0; }
.prog-filters { display: flex; gap: 6px; flex-wrap: wrap; }
.prog-order-toggle[aria-pressed="true"] { background: var(--primary-container); color: var(--on-primary-container); border-color: transparent; }
.prog-order-bar { display: none; align-items: center; gap: 10px; margin-top: 10px; padding: 8px 12px; border-radius: var(--shape-md); background: var(--primary-container); color: var(--on-primary-container); font-size: var(--fs-base); }
.prog-order-bar .btn { margin-left: auto; flex: none; }
.prog.is-ordering .prog-order-bar { display: flex; }
.prog .prog-only-ordering { display: none; }
.prog.is-ordering .prog-only-ordering { display: revert; }
.prog.is-ordering .ptp-move.prog-only-ordering, .prog.is-ordering .ptp-grp-move.prog-only-ordering { display: inline-flex; }
.prog.is-ordering .prog-only-reading { display: none; }
.prog.is-ordering .prog-distribute { display: none; }
.prog-distribute { margin-top: 10px; }
.prog-distribute-sum { display: inline-flex; align-items: center; gap: 6px; min-height: 36px; font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--text-2); cursor: pointer; list-style: none; }
.prog-distribute-sum::-webkit-details-marker { display: none; }
.prog .ptp-flat { margin-top: 10px; }
.prog-tree { margin-top: 4px; }
.prog-klasa > summary, .prog-dzial > summary { list-style: none; }
.prog-klasa > summary::-webkit-details-marker, .prog-dzial > summary::-webkit-details-marker { display: none; }
.prog-klasa > summary { padding: 8px 0; }
.prog-klasa-name { font-size: var(--fs-md); }
.prog-dzial > summary { font-size: var(--fs-base); text-transform: none; letter-spacing: 0; color: var(--text); padding: 8px 0; }
.prog-chev { font-size: var(--fs-xl); color: var(--text-3); transition: transform var(--motion-fast, .15s); }
.prog-dzial[open] > summary .prog-chev { transform: rotate(90deg); }
.prog-dzial-name { font-weight: var(--fw-semibold); }
.prog-bar-mini { flex: 0 0 110px; margin-left: auto; }
.prog.is-ordering .prog-bar-mini { margin-left: 0; }
.prog-row { padding: 8px 0; }
.prog-state { flex: none; width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--border-strong); display: grid; place-items: center; }
.prog-state .material-symbols-outlined { font-size: var(--fs-base); font-weight: var(--fw-bold); color: var(--on-primary); }
.prog-state--done { background: var(--c-ok); border-color: var(--c-ok); }
.prog-state--scheduled { border-color: var(--primary); background: var(--primary-container); }
.prog-state--review { border-color: var(--c-prog); background: var(--c-prog-bg); }
.prog .ptp-move { flex-direction: row; gap: 4px; }
.prog.is-ordering .prog-row { background: var(--surface-1); flex-wrap: nowrap; }
.prog-status-menu > summary { list-style: none; }
.lrow-arrows { display: none; gap: 4px; align-self: center; flex: none; }
.lesson-order-bar { display: none; align-items: center; gap: 10px; padding: 8px 12px; border-radius: var(--shape-md); background: var(--primary-container); color: var(--on-primary-container); font-size: var(--fs-base); }
.lesson-order-bar .btn { margin-left: auto; flex: none; }
.plan-main.is-lesson-ordering .lesson-order-bar { display: flex; }
.plan-main.is-lesson-ordering .lrow-arrows { display: inline-flex; }
.plan-main.is-lesson-ordering .lrow-handle { display: none; }
.lesson-order-toggle[aria-pressed="true"] { background: var(--primary-container); color: var(--on-primary-container); border-color: transparent; }
.prog-status-menu > summary::-webkit-details-marker { display: none; }
.prog-status-menu[open] > .dropdown-menu { display: block; min-width: 250px; }
.prog-status-menu .dropdown-item { width: 100%; border: 0; background: none; font: inherit; font-size: var(--fs-base); text-align: left; }
.prog-status-menu .dropdown-item[aria-pressed="true"] { color: var(--primary); font-weight: var(--fw-semibold); }
.prog-status-btn.is-manual { border-color: var(--primary); color: var(--primary); }
/* W trybie kolejności tytuł zostaje w pierwszej kolumnie, strzałki po prawej
   (bez tego na telefonie strzałki lądowały w osobnej linii NAD tytułem). */
.prog.is-ordering .prog-row .ptp-title { flex: 1 1 auto; min-width: 0; order: 1; }
.prog.is-ordering .prog-row .ptp-move { order: 2; margin-left: auto; }

/* /tematy — tryb kolejności: strzałki przy wierszu zamiast (albo obok) uchwytu */
.topics-order-bar { display: none; align-items: center; gap: 10px; margin: 0 0 10px; padding: 8px 12px; border-radius: var(--shape-md); background: var(--primary-container); color: var(--on-primary-container); font-size: var(--fs-base); }
.topics-order-bar .btn { margin-left: auto; flex: none; }
.topics-ordering .topics-order-bar { display: flex; }
.topic-order-arrows { display: none; gap: 4px; flex: none; }
.topics-ordering .topic-order-arrows { display: inline-flex; }
.topic-order-arrows .ptp-move-btn { border: 1px solid var(--outline-variant); background: var(--surface); }
.topics-order-toggle[aria-pressed="true"] { background: var(--primary-container); color: var(--on-primary-container); border-color: transparent; }
.topic-row.is-moved { animation: topic-moved .6s var(--ease-std, ease); }
@keyframes topic-moved { from { background: var(--primary-container); } to { background: transparent; } }
@media (prefers-reduced-motion: reduce) { .topic-row.is-moved { animation: none; } }
@media (max-width: 700px) {
  .prog-bar-mini { flex-basis: 64px; }
  .prog-order-bar, .topics-order-bar { flex-wrap: wrap; }
}

/* ---------- Okno potwierdzenia rezerwacji / zmiany terminu (rodzic, 14.09) ---------- */
.bk-body { display: grid; gap: 14px; align-content: start; }
.bk-when { display: flex; gap: 14px; align-items: center; padding: 14px; border-radius: var(--shape-lg); background: color-mix(in srgb, var(--primary) 6%, var(--surface)); border: 1px solid color-mix(in srgb, var(--primary) 22%, var(--outline-variant)); }
.bk-date { flex: none; width: 62px; padding: 8px 0; display: grid; text-align: center; line-height: 1.1; border-radius: var(--shape-md); background: var(--primary); color: var(--on-primary); box-shadow: var(--elev-1); }
.bk-date small { font-size: var(--fs-xs); font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .05em; opacity: .9; }
.bk-date b { font-size: 26px; font-weight: var(--fw-black); font-variant-numeric: tabular-nums; }
.bk-when-main { min-width: 0; display: grid; gap: 4px; }
.bk-when-title { font-size: 17px; font-weight: var(--fw-bold); letter-spacing: -0.01em; }
.bk-when-line { display: flex; align-items: center; gap: 6px; font-size: var(--fs-base); color: var(--text-2); font-variant-numeric: tabular-nums; }
.bk-when-line .material-symbols-outlined { font-size: 17px; color: var(--text-3); }
.bk-av { width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center; font-size: var(--fs-2xs); font-weight: var(--fw-bold); color: #fff; background: var(--grad, var(--primary)); }
.bk-status { display: flex; gap: 8px; align-items: flex-start; padding: 10px 12px; border-radius: var(--shape-md); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-base); line-height: 1.45; }
.bk-status .material-symbols-outlined { font-size: var(--fs-xl); color: var(--c-warn); flex: none; }
.bk-status.is-auto { background: var(--c-ok-bg); color: var(--c-ok); font-weight: var(--fw-semibold); }
.bk-status.is-auto .material-symbols-outlined { color: var(--c-ok); }
.bk-old { display: flex; align-items: center; gap: 6px; font-size: var(--fs-base); color: var(--text-3); }
.bk-old .material-symbols-outlined { font-size: 17px; }
.bk-body .field { margin: 0; }
@media (max-width: 700px) {
  /* Arkusz od dołu o wysokości treści - pełnoekranowy modal zostawiał pół ekranu pustki. */
  .modal.bk-sheet { height: auto; max-height: 92dvh; margin: auto 0 0; border-radius: var(--shape-xl) var(--shape-xl) 0 0; }
  .bk-foot { display: grid; grid-template-columns: 1fr 2fr; }
  .bk-foot .btn { justify-content: center; }
}

/* ---------- Rezerwacje w szkole (admin/recepcja, 14.09) ---------- */
.bkl-bar { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; border-bottom: 1px solid var(--outline-variant); }
.bkl-tabs { margin-bottom: 0; border-bottom: 0; }
.bkl-filter { display: flex; align-items: center; gap: 8px; padding-bottom: 8px; }
.bkl-filter .field-label { margin: 0; white-space: nowrap; }
.bkl-filter .select { min-width: 200px; }
.bkl-alert { display: flex; gap: 10px; align-items: flex-start; padding: 12px 14px; margin-bottom: 14px; border-radius: var(--shape-md); background: var(--c-warn-bg); color: var(--text); border: 1px solid color-mix(in srgb, var(--c-warn) 40%, transparent); font-size: var(--fs-base); }
.bkl-alert .material-symbols-outlined { color: var(--c-warn); }
.bkl-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.bkl-item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 16px; align-items: center; padding: 14px 16px; background: var(--surface); border: 1px solid var(--outline-variant); border-radius: var(--shape-lg); box-shadow: var(--elev-1); }
.bkl-item.is-stale { border-color: color-mix(in srgb, var(--c-rej) 45%, var(--outline-variant)); box-shadow: inset 4px 0 0 var(--c-rej), var(--elev-1); }
.bkl-date { width: 56px; padding: 6px 0; display: grid; text-align: center; line-height: 1.1; border-radius: var(--shape-md); background: var(--primary-container); color: var(--on-primary-container); }
.bkl-date small { font-size: var(--fs-2xs); font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .05em; }
.bkl-date b { font-size: var(--fs-2xl); font-weight: var(--fw-black); font-variant-numeric: tabular-nums; }
.bkl-main { min-width: 0; display: grid; gap: 4px; }
.bkl-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bkl-time { font-size: var(--fs-lg); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.bkl-top .lstat .material-symbols-outlined { font-size: var(--fs-md); }
.bkl-who { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; font-size: var(--fs-md); }
.bkl-student { font-weight: var(--fw-semibold); color: var(--text); text-decoration: none; }
.bkl-student:hover { color: var(--primary); text-decoration: underline; }
.bkl-tutor { font-weight: var(--fw-medium); }
.bkl-note { margin: 2px 0 0; display: flex; gap: 6px; align-items: flex-start; font-size: var(--fs-base); color: var(--text-2); font-style: italic; }
.bkl-note .material-symbols-outlined { font-size: var(--fs-lg); color: var(--text-3); font-style: normal; }
.bkl-side { display: grid; justify-items: end; gap: 6px; text-align: right; }
.bkl-wait { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: var(--shape-full); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-base); font-weight: var(--fw-semibold); white-space: nowrap; }
.bkl-wait .material-symbols-outlined { font-size: var(--fs-lg); }
.bkl-wait.is-warn { background: var(--c-warn-bg); color: var(--c-warn); }
.bkl-wait.is-late { background: var(--c-rej-bg); color: var(--c-rej); }
.bkl-empty { display: grid; justify-items: center; gap: 6px; padding: 40px 20px; color: var(--text-3); }
.bkl-empty .material-symbols-outlined { font-size: 36px; color: var(--c-ok); }
.bkl-empty p { margin: 0; }
@media (max-width: 700px) {
  .bkl-bar { align-items: stretch; }
  .bkl-filter { width: 100%; }
  .bkl-filter .select { flex: 1; min-width: 0; }
  .bkl-item { grid-template-columns: auto minmax(0, 1fr); gap: 12px; }
  .bkl-side { grid-column: 1 / -1; justify-items: start; text-align: left; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
}

/* ---------- Najbliższe lekcje w profilu ucznia (14.09) ---------- */
.up-list { list-style: none; margin: 0; padding: 0; background: var(--surface); border: 1px solid var(--outline-variant); border-radius: var(--shape-md); overflow: hidden; }
.up-list li + li { border-top: 1px solid var(--outline-variant); }
.up-row { display: grid; grid-template-columns: 76px minmax(0, 1fr) 20px; gap: 12px; align-items: center; min-height: 56px; padding: 8px 14px; color: inherit; text-decoration: none; }
.up-row:hover { background: var(--surface-2); }
.up-row:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
.up-chev { color: var(--text-3); font-size: 20px; }

/* ---------- Zdjęcie profilowe (14.09) ---------- */
img.is-photo { object-fit: cover; padding: 0; background: var(--surface-2); display: block; }
img.avatar.is-photo, img.who-avatar.is-photo, img.mini-avatar.is-photo, img.bk-av.is-photo { border: 0; }
.acc-photo { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.acc-photo-img { width: 88px; height: 88px; border-radius: 50%; flex: none; display: grid; place-items: center; font-size: var(--fs-3xl); font-weight: var(--fw-bold); color: var(--on-primary); background: var(--grad, var(--primary)); box-shadow: var(--elev-1); }
.acc-photo-body { flex: 1 1 260px; min-width: 0; display: grid; gap: 10px; }

/* ---------- Cele dotykowe ≥44px na małych ekranach ----------
   Desktop zachowuje gęstość; na dotyku małe kontrolki dostają obszar kliknięcia
   44x44 (Apple HIG, WCAG 2.5.5). Blok jest OSTATNI w pliku, więc przy tej samej
   specyficzności wygrywa z regułami wyżej - dlatego wszystkie reguły celów
   dotykowych trzymamy TUTAJ, a nie rozsypane po pliku.

   Historia: przegląd 2026-09 ustawił tu 40px. Skan mobile (11.09) pokazał, że
   to ciągle poniżej progu, a przy okazji znalazł kontrolki, o których nikt nie
   pamiętał: 28px przycisk dnia wolnego w „Moim tygodniu", 24px link otwarcia
   lekcji w puli, nagłówki rozwijanych sekcji (19-43px), przyciski
   FullCalendara (41x36, przychodzą z biblioteki). */
@media (max-width: 700px) {
  .lesson-card-status .btn { min-height: 44px; padding: 8px 12px; }
  .ptp-move-btn, .ptp-grp-move .ptp-move-btn { width: 44px; height: 44px; }
  .pz-btn-link-danger { display: inline-flex; align-items: center; min-height: 44px; padding: 8px 6px; }
  .btn, .btn-sm { min-height: 44px; min-width: 44px; }
  .chip { min-height: 44px; }
  /* `pz-nowrap` na chipie z długą etykietą („Auto-dopasuj liczbę lekcji do
     listy tematów") wypychało go 9px poza ekran - na 390px nie ma dla niej
     miejsca w jednej linii. Na telefonie chipy mogą się łamać; krótkie i tak
     zostaną w jednej linii. */
  .chip.pz-nowrap { white-space: normal; }
  .crumb-back { min-height: 44px; }
  .topbar-search { min-width: 44px; }
  /* Rozwijane sekcje (<summary>) to główny sposób nawigacji u rodzica,
     w puli tematów i na liście tematów - miały 19-43px. */
  .nav-group-summary, .pz-pool-group-h, .pz-acc-summary, .pz-pay-summary,
  .ptp-group > summary, .gb-head, .pool-group-h, .topics-grade-head,
  .topics-cat-head { min-height: 44px; }
  /* Ostatnie z rundy 4, wszystkie na widoku planu: chip akcji przy lekcji
     (75x26), odnośnik akcji w karcie (104x19) i etykieta opakowująca checkbox
     wyboru masowego (149x30). Same kontrolki, nie tekst - więc obszar dotyku
     ma prawo być większy niż to, co widać. */
  .action-chip { min-height: 44px; }
  .plan-next-more, .plan-bulk-sum, .plan-group-sum { min-height: 44px; }
  .prog-distribute-sum, .prog-klasa > summary, .prog-dzial > summary { min-height: 44px; }
  .topic-order-arrows .ptp-move-btn { width: 44px; height: 44px; }
  .dropdown-item { min-height: 44px; }
  .lrow-arrows .ptp-move-btn { width: 44px; height: 44px; }
  .lesson-order-bar { flex-wrap: wrap; }
  a.pz-link-accent { display: inline-flex; align-items: center; min-height: 44px; }
  label.pz-flex { min-height: 44px; }
  .week-off-btn { width: 44px; height: 44px; }
  .pool-item-open { width: 44px; height: 44px; }
  /* Przyciski FullCalendara („Mój tydzień", kalendarz). */
  .fc .fc-button { min-height: 44px; min-width: 44px; }
  /* Checkbox/radio: WCAG 2.5.8 (AA) wymaga 24x24, nie 44 - pod warunkiem, że
     klikalna jest też etykieta. 44px na samym kwadraciku rozwaliłoby rytm list. */
  input[type="checkbox"], input[type="radio"] { min-width: 24px; min-height: 24px; }
  /* checkbox tematu (kreator planu): sam zostaje 18px, ::before rozszerza obszar dotyku do 40px.
     Audyt CSS 10.09: reguła z 09.09 celowała w `.topic-check`, klasę, której nie ma w żadnym
     szablonie — checkbox nazywa się `.topic-cb`, więc poprawka nigdy nie działała. */
  .topic-cb { position: relative; }
  /* ::after, bo ::before rysuje ptaszek (KV-APP-CHECKBOX) */
  .topic-cb::after { content: ""; position: absolute; inset: -11px; }
}

/* ── Etap 4 / 4.5b (UI-07): klasy zamiast ostatnich inline style="" w szablonach,
   żeby CSP mógł zdjąć 'unsafe-inline' ze style-src ─────────────────────── */
@layer utilities {
  .pz-maxw-420 { max-width: 420px; }
  .pz-minw-240 { min-width: 240px; }
  .alert.alert-border-ok { border-color: var(--success); }
  .alert.alert-border-danger { border-color: var(--c-rej); }
  .pz-grade-row { padding: 7px 0; border-bottom: 1px solid var(--border); }
  .settings-logo-preview { width: 64px; height: 64px; border-radius: var(--shape-md); object-fit: contain; background: #fff; border: 1px solid var(--border); }
  .twofa-code-box { padding: 8px; border: 1px solid var(--border); border-radius: var(--shape-sm); user-select: all; }
  .twofa-secret { letter-spacing: 2px; user-select: all; }
  .twofa-uri { word-break: break-all; user-select: all; }
  .health-dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; vertical-align: middle; margin-right: 6px; background: var(--c-ok); }
  .health-dot--red { background: var(--c-rej); }
  .health-dot--amber { background: var(--c-prog); }
  .brand-mark--img { width: 38px; height: 38px; border-radius: 11px; object-fit: contain; flex: none; background: var(--surface); border: 1px solid var(--border); }
  .confirm-body { display: flex; gap: 13px; align-items: flex-start; padding: 22px 22px 6px; }
  .confirm-ico { flex: none; width: 38px; height: 38px; border-radius: 50%; background: var(--c-rej-bg); color: var(--danger); display: flex; align-items: center; justify-content: center; font-size: var(--fs-2xl); }
  .confirm-msg { margin: 6px 0 0; font-size: var(--fs-lg); font-weight: var(--fw-medium); line-height: var(--lh-base); color: var(--text); }
  /* paski postępu: szerokość z data-pct ustawia core.js; bez JS pasek jest pusty */
  [data-pct] { width: 0; }
}

/* ═══════════════════════════════════════════════════════════════════════
   19. Publiczna rezerwacja lekcji próbnej (/probna*, 17.09) - prefiks pb-.
   Strona bez menu panelu, osadzalna w iframe na stronie szkoły. Tylko
   tokeny (dark mode za darmo), mobile-first: jedna kolumna, od 900px
   kalendarz + formularz obok siebie. Bez inline style (CSP). Świadomie
   spokojnie: bez gradientów na przyciskach, bez pigułek i "eyebrow" -
   właściciel 17.09: pierwsza wersja wyglądała jak generyczna strona z AI.
   ═══════════════════════════════════════════════════════════════════════ */
.pb-body { margin: 0; background: var(--bg); color: var(--text); min-height: 100vh; display: flex; flex-direction: column; }
.pb-body--embedded { background: transparent; min-height: 0; }
.pb-body .btn.accent { background: var(--primary); color: var(--on-primary); box-shadow: none; }
.pb-body .btn.accent:hover { background: var(--primary-hover); }
.pb-top { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 12px; padding: 14px var(--page-gutter, 16px); max-width: 1040px; width: 100%; margin: 0 auto; box-sizing: border-box; }
.pb-brand { display: inline-flex; align-items: center; gap: 10px; text-decoration: none; color: var(--text); min-height: 44px; }
.pb-brand-mark { width: 34px; height: 34px; border-radius: var(--shape-sm); object-fit: contain; background: var(--surface); border: 1px solid var(--border); }
.pb-brand-name { font-weight: var(--fw-bold); letter-spacing: -0.02em; font-size: var(--fs-lg); }
.pb-top-nav { display: flex; flex-wrap: wrap; gap: 2px; }
.pb-top-nav a { color: var(--text-2); text-decoration: none; font-size: var(--fs-base); font-weight: var(--fw-medium); padding: 10px 12px; border-radius: var(--shape-full); min-height: 44px; display: inline-flex; align-items: center; white-space: nowrap; }
.pb-top-nav a:hover { background: var(--surface-2); color: var(--text); }
.pb-main { flex: 1; width: 100%; min-width: 0; max-width: 1040px; margin: 0 auto; padding: 8px var(--page-gutter, 16px) 40px; box-sizing: border-box; }
.pb-foot { border-top: 1px solid var(--border); padding: 18px var(--page-gutter, 16px); color: var(--text-3); font-size: var(--fs-sm); }
.pb-foot-row { max-width: 1040px; margin: 0 auto; display: flex; flex-wrap: wrap; gap: 8px 18px; justify-content: space-between; }
.pb-foot a { color: var(--text-2); }

/* typografia strony */
.pb-eyebrow { margin: 0 0 6px; color: var(--primary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.pb-h1 { margin: 0 0 10px; font-size: var(--fs-3xl); line-height: 1.12; letter-spacing: -0.025em; font-weight: var(--fw-bold); }
.pb-h1--sm { font-size: var(--fs-2xl); margin-bottom: 4px; }
.pb-h2 { margin: 0; font-size: var(--fs-xl); font-weight: var(--fw-semibold); letter-spacing: -0.015em; display: flex; align-items: center; gap: 10px; }
.pb-h2-n { width: 26px; height: 26px; border-radius: var(--shape-full); background: var(--text); color: var(--bg); font-size: var(--fs-sm); font-weight: var(--fw-bold); display: inline-grid; place-items: center; flex: none; }
.pb-panel-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.pb-month { color: var(--text-2); font-weight: var(--fw-medium); text-transform: capitalize; }
.pb-lead { margin: 0 0 16px; color: var(--text-2); font-size: var(--fs-lg); line-height: 1.55; max-width: 620px; }
.pb-hint { margin: 12px 0 14px; color: var(--text-3); font-size: var(--fs-sm); }
.pb-fine { margin: 10px 0 0; color: var(--text-3); font-size: var(--fs-sm); line-height: var(--lh-base); }
.pb-dim { color: var(--text-3); font-weight: var(--fw-regular); }
.pb-inline-link { color: var(--primary); font-weight: var(--fw-semibold); }

/* hero */
.pb-hero { padding: 26px 0 18px; }

/* karty korepetytorów */
.pb-grid { display: grid; grid-template-columns: 1fr; gap: 14px; }
.pb-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-lg); transition: border-color var(--motion-fast) var(--ease-std), box-shadow var(--motion-std) var(--ease-std); }
.pb-card:hover { box-shadow: var(--elev-2); border-color: var(--border-strong); }
.pb-card-link { display: flex; flex-direction: column; gap: 12px; padding: 18px; color: inherit; text-decoration: none; height: 100%; box-sizing: border-box; border-radius: inherit; }
.pb-card-link:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.pb-card-name { margin: 0; font-size: var(--fs-xl); font-weight: var(--fw-semibold); letter-spacing: -0.015em; }
.pb-card-headline { margin: 2px 0 0; color: var(--text-2); font-size: var(--fs-base); }
.pb-card-bio { margin: 0; color: var(--text-2); font-size: var(--fs-md); line-height: 1.55; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.pb-card-foot { margin-top: auto; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }
.pb-next { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); color: var(--text-2); }
.pb-next .material-symbols-outlined { font-size: var(--fs-xl); color: var(--c-ok); }
.pb-next--none { color: var(--text-3); }
.pb-next--none .material-symbols-outlined { color: var(--text-3); }
.pb-card-cta { height: 40px; padding: 0 16px; }

.pb-avatar { width: 72px; height: 72px; border-radius: 22px; object-fit: cover; flex: none; background: var(--surface-2); }
.pb-avatar--initials { display: grid; place-items: center; color: var(--primary); font-weight: var(--fw-bold); font-size: var(--fs-xl); background: var(--primary-container); letter-spacing: 0.02em; }
.pb-avatar--lg { width: 140px; height: 140px; border-radius: var(--shape-xl); font-size: var(--fs-3xl); }

/* nagłówek korepetytora na stronie terminów */
.pb-back { display: inline-flex; align-items: center; gap: 2px; color: var(--text-2); text-decoration: none; font-size: var(--fs-base); min-height: 44px; margin-left: -6px; }
.pb-back:hover { color: var(--text); }
.pb-tutor { display: flex; gap: 18px; align-items: flex-start; padding: 4px 0 22px; margin-bottom: 4px; }
.pb-tutor-text { min-width: 0; flex: 1; }
.pb-tutor-headline { margin: 0 0 6px; color: var(--text-2); font-size: var(--fs-md); font-weight: var(--fw-medium); }
.pb-tutor-bio { margin: 0; color: var(--text-2); font-size: var(--fs-md); line-height: 1.6; white-space: pre-line; max-width: 640px; }

/* układ: kalendarz + formularz */
.pb-layout { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; align-items: start; }
.pb-panel { min-width: 0; background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-lg); padding: 18px; }
.pb-panel--form .pb-h2 { margin-bottom: 14px; }

/* siatka kalendarza */
.pb-cal { display: grid; gap: 4px; }
.pb-cal-row { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; }
.pb-cal-wd { text-align: center; font-size: var(--fs-xs); color: var(--text-3); text-transform: uppercase; letter-spacing: 0.06em; padding: 4px 0 6px; }
.pb-day { position: relative; min-height: 46px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; border-radius: var(--shape-sm); border: 1px solid transparent; background: var(--surface-1); color: var(--text); cursor: pointer; font: inherit; padding: 6px 0; transition: background var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.pb-day:not(.pb-day--active):hover { background: var(--primary-container); border-color: var(--primary-container); }
.pb-day:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.pb-day-num { font-size: var(--fs-md); font-weight: var(--fw-semibold); line-height: 1; font-variant-numeric: tabular-nums; }
.pb-day-dot { width: 5px; height: 5px; border-radius: var(--shape-full); background: var(--primary); }
.pb-day--off { background: transparent; color: var(--text-3); cursor: default; font-weight: var(--fw-regular); }
.pb-day--off .pb-day-num { font-weight: var(--fw-regular); }
.pb-day--muted { color: var(--outline-variant); }
.pb-day--active { background: var(--primary); border-color: var(--primary); color: var(--on-primary); }
.pb-day--active .pb-day-dot { background: var(--on-primary); }

/* godziny wybranego dnia */
.pb-slots--hidden { display: none; }
.pb-slots-title { margin: 0 0 10px; font-weight: var(--fw-semibold); color: var(--text); text-transform: capitalize; }
.pb-slot-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(84px, 1fr)); gap: 8px; }
.pb-slot { position: relative; display: block; cursor: pointer; }
/* Wariant „button" (rezerwacja rodzica, 18.09): ten sam kafelek godziny,
   ale klik otwiera okno potwierdzenia zamiast zaznaczać radio. Reset
   domyślnego wyglądu <button>, reszta stylu leci z .pb-slot-time. */
.pb-slot--btn { width: 100%; padding: 0; border: 0; background: none; font: inherit; color: inherit; text-align: inherit; }
.pb-slot--btn:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; border-radius: var(--shape-sm); }
.pb-slot-input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }
.pb-slot-time { display: grid; place-items: center; min-height: 44px; border-radius: var(--shape-sm); border: 1px solid var(--border-strong); background: var(--surface); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; color: var(--primary); transition: background var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.pb-slot:hover .pb-slot-time { background: var(--primary-container); border-color: var(--primary); }
.pb-slot-input:focus-visible + .pb-slot-time { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.pb-slot-input:checked + .pb-slot-time { background: var(--primary); border-color: var(--primary); color: var(--on-primary); }
.pb-slot--btn.pb-slot--selected .pb-slot-time { background: var(--primary); border-color: var(--primary); color: var(--on-primary); }

/* formularz */
.pb-summary { display: flex; flex-direction: column; gap: 8px; padding: 12px 14px; margin-bottom: 16px; border-radius: var(--shape-md); background: var(--surface-2); font-size: var(--fs-base); }
.pb-summary-row { display: flex; align-items: center; gap: 10px; color: var(--text-2); }
.pb-summary-row .material-symbols-outlined { font-size: var(--fs-2xl); color: var(--text-3); flex: none; }
.pb-sum-when { color: var(--text-3); }
.pb-sum-when--set { color: var(--text); font-weight: var(--fw-semibold); }
.pb-fieldset { border: 0; padding: 0; margin: 0 0 16px; min-width: 0; }
.pb-fieldset legend { padding: 0; margin-bottom: 6px; }
.pb-segment { display: grid; grid-template-columns: 1fr; gap: 6px; }
.pb-segment[hidden] { display: none; }
.pb-segment--grades { grid-template-columns: repeat(auto-fit, minmax(52px, 1fr)); gap: 8px; }
.pb-grade-note { margin: 8px 0 0; color: var(--text-3); font-size: var(--fs-sm); }
/* ZRODLO-KLIENTA-DALEJ (23.10): „Skąd o nas wiesz?" - 2 kafelki w rzędzie, od 600 px 4;
   pole „Gdzie?" tylko przy „Inne" (bez JS, przez :has) */
.pb-segment--src { grid-template-columns: repeat(2, 1fr); }
.pb-src-note { display: none; margin: 10px 0 0; }
.pb-fieldset:has(input[name="lead_source"][value="inne"]:checked) .pb-src-note { display: block; }
.pb-seg { position: relative; display: block; cursor: pointer; }
.pb-seg-input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }
.pb-seg-label { display: grid; place-items: center; min-height: 44px; padding: 0 10px; border-radius: var(--shape-sm); border: 1px solid var(--border-strong); background: var(--surface); font-size: var(--fs-base); font-weight: var(--fw-medium); color: var(--text-2); text-align: center; transition: background var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.pb-seg:hover .pb-seg-label { background: var(--surface-2); }
.pb-seg-input:focus-visible + .pb-seg-label { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.pb-seg-input:checked + .pb-seg-label { background: var(--primary-container); border-color: var(--primary); color: var(--primary); font-weight: var(--fw-semibold); }
/* krok 1: wybrana klasa i poziom w formularzu u korepetytora (18.09) */
.pb-chosen { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px; margin-bottom: 16px; border-radius: var(--shape-md); background: var(--surface-2); border: 1px solid var(--border); }
.pb-start { display: flex; flex-direction: column; gap: 4px; max-width: 520px; margin: 0 auto; }
.pb-rest { margin-top: 28px; }
.pb-rest .pb-h2 { margin-bottom: 4px; }

/* telefon: stały +48 + kratki na 9 cyfr (17.09) */
.pb-phone { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pb-phone[hidden] { display: none; }
.pb-phone-prefix { flex: none; display: grid; place-items: center; height: 48px; padding: 0 12px; border-radius: var(--shape-sm); border: 1px solid var(--border-strong); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-base); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
.pb-phone-cells { flex: 1 1 auto; min-width: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
.pb-phone-group { min-width: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }
.pb-phone-cell { width: 100%; min-width: 0; height: 48px; padding: 0; border-radius: var(--shape-sm); border: 1px solid var(--border-strong); background: var(--surface); color: var(--text); font-size: var(--fs-lg); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; text-align: center; -moz-appearance: textfield; transition: border-color var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std); }
.pb-phone-cell:hover { border-color: var(--primary); }
.pb-phone-cell:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-container); }
.pb-phone-cell[data-filled] { border-color: var(--primary); }
@media (min-width: 600px) { .pb-phone-cells { gap: 14px; } .pb-phone-group { gap: 6px; } }
.pb-trap { position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden; }
.pb-submit { margin-top: 4px; height: 50px; font-size: var(--fs-lg); }
.pb-submit:disabled { opacity: 0.55; cursor: not-allowed; }

/* pusty stan */
.pb-empty { text-align: center; padding: 36px 18px; background: var(--surface); border: 1px dashed var(--border-strong); border-radius: var(--shape-lg); display: flex; flex-direction: column; align-items: center; gap: 10px; color: var(--text-2); }
.pb-empty--inline { padding: 26px 14px; }
.pb-empty p { margin: 0; max-width: 480px; }
.pb-empty-ico { width: 56px; height: 56px; margin: 0 auto 6px; border-radius: var(--shape-lg); display: grid; place-items: center; background: var(--g-blue); color: #fff; box-shadow: var(--shadow-tile); font-size: var(--fs-3xl); }

/* potwierdzenie */
.pb-done { max-width: 720px; margin: 0 auto; padding-top: 18px; text-align: center; }
.pb-done-ico { font-size: 64px; color: var(--c-ok); margin-bottom: 4px; font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 48; }
.pb-done-ico--off { color: var(--text-3); }
.pb-ticket { text-align: left; margin: 20px 0; background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-lg); overflow: hidden; }
.pb-ticket-who { display: flex; align-items: center; gap: 14px; padding: 18px; background: var(--surface-2); border-bottom: 1px solid var(--border); }
.pb-ticket-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; padding: 18px; }
.pb-ticket-label { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-3); margin-bottom: 2px; }
.pb-ticket-value { font-weight: var(--fw-semibold); font-size: var(--fs-md); }
.pb-ticket-actions { display: flex; flex-wrap: wrap; gap: 10px; padding: 0 18px 18px; align-items: center; }
.pb-next-steps { text-align: left; margin-top: 8px; }
.pb-list { margin: 0; padding-left: 22px; color: var(--text-2); line-height: 1.6; }
.pb-list li { margin-bottom: 8px; }
.pb-done-foot { margin-top: 22px; }

@media (min-width: 600px) {
  .pb-grid { grid-template-columns: repeat(2, 1fr); }
  .pb-segment { grid-template-columns: repeat(3, 1fr); }
  .pb-segment--src { grid-template-columns: repeat(4, 1fr); }
  .pb-h1 { font-size: var(--fs-display); }
  .pb-h1--sm { font-size: var(--fs-3xl); }
  .pb-day { min-height: 52px; }
}
@media (min-width: 900px) {
  /* PROBNA-25 (21.09): krok 3 w jednej, węższej kolumnie - kalendarz i „Twoje dane" w jednym panelu. */
  .pb-layout, .pb-tutor { max-width: 760px; margin-left: auto; margin-right: auto; }
  .pb-part { padding: 22px 26px; }
  .pb-hero { padding-top: 40px; }
}

/* Strefa rodzica: karta lekcji próbnej z rezerwacji /probna (17.09) */
.pz-db-trial { padding: 18px; margin-bottom: 16px; border-left: 4px solid var(--primary); }
.pz-db-trial-head { display: flex; gap: 14px; align-items: center; margin-bottom: 12px; }
.pz-db-trial-avatar { width: 56px; height: 56px; border-radius: 18px; object-fit: cover; flex: none; background: var(--surface-2); }
.pz-db-trial-avatar--initials { display: grid; place-items: center; color: #fff; font-weight: var(--fw-bold); background: var(--brand-blue); }
.pz-db-trial-eyebrow { color: var(--primary); font-size: var(--fs-xs); font-weight: var(--fw-semibold); letter-spacing: 0.08em; text-transform: uppercase; }
.pz-db-trial-title { margin: 2px 0; font-size: var(--fs-xl); font-weight: var(--fw-semibold); letter-spacing: -0.015em; }
.pz-db-trial-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }

/* Katalog maili (20.09): zwijane karty szablonów + picker grup. */
.tpl-card > summary.tpl-card-sum { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: var(--fs-md); color: var(--text); }
.tpl-card > summary.tpl-card-sum::-webkit-details-marker { display: none; }
.tpl-card > summary.tpl-card-sum::before { content: "chevron_right"; font-family: "Material Symbols Outlined"; font-size: var(--fs-xl); color: var(--text-3); transition: transform var(--motion-fast) var(--ease-std); }
.tpl-card[open] > summary.tpl-card-sum::before { transform: rotate(90deg); }
.tpl-card[open] > summary.tpl-card-sum { margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--border); }
.tpl-card.pz-tpl-off > summary.tpl-card-sum > strong { color: var(--text-3); }

/* PROBNA-20 (21.09): duże wizytówki korepetytorów na /probna. 21.09 wieczorem (zgłoszenie
   właściciela: za dużo scrollowania na telefonie, na monitorze karty nie mieszczą się na ekranie):
   układ poziomy - zdjęcie w stałej szerokości po lewej, tekst po prawej; na telefonie tagi,
   opis i stopka schodzą pod zdjęcie, od 700 px zdjęcie ciągnie się wzdłuż całej karty. */
.pb-card--big .pb-card-link { display: grid; grid-template-columns: 112px minmax(0, 1fr); grid-template-areas: "photo who" "tags tags" "bio bio" "foot foot"; align-items: start; column-gap: 14px; row-gap: 10px; }
.pb-card-photo { grid-area: photo; display: block; width: 100%; height: auto; aspect-ratio: 4 / 5; object-fit: cover; object-position: 50% 25%; border-radius: var(--shape-md); background: var(--surface-2); }
.pb-card-photo--initials { display: grid; place-items: center; color: var(--primary); background: var(--primary-container); font-weight: var(--fw-bold); font-size: var(--fs-2xl); }
.pb-card--big .pb-card-who { grid-area: who; align-self: center; min-width: 0; }
.pb-card--big .pb-tags { grid-area: tags; }
.pb-card--big .pb-card-bio { grid-area: bio; -webkit-line-clamp: 4; }
.pb-card--big .pb-card-foot { grid-area: foot; }
@media (min-width: 700px) {
  .pb-grid--big { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
  .pb-card--big .pb-card-link { grid-template-columns: 168px minmax(0, 1fr); grid-template-areas: "photo who" "photo tags" "photo bio" "photo foot"; }
  .pb-card--big .pb-card-who { align-self: start; }
  .pb-card--big .pb-card-name { font-size: var(--fs-2xl); }
  .pb-card--big .pb-card-bio { -webkit-line-clamp: 5; }
}
.pb-tags { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
.pb-tag { display: inline-flex; align-items: center; gap: 4px; padding: 5px 11px; border-radius: var(--shape-full); background: var(--primary-container); color: var(--primary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); line-height: var(--lh-tight); }
.pb-tag .material-symbols-outlined { font-size: var(--fs-md); }
.pb-mb-8 { margin-bottom: 8px; }

/* PROBNA-21 (21.09): krok 1 /probna jako karta (osadzany na stronie głównej zamiast Amelii),
   kafelki poziomów, wskaźnik kroków wspólny dla 3 kroków, pasek zaufania. */
.pb-start-wrap { padding: 8px 0 0; }
.pb-start-card { max-width: 640px; margin: 0 auto; background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-xl); box-shadow: var(--shadow-1); padding: 20px 18px 22px; box-sizing: border-box; }
.pb-start-head { text-align: center; margin: 14px 0 18px; }
.pb-start-head .pb-h1 { margin-bottom: 8px; }
.pb-start-head .pb-lead { margin: 0 auto; max-width: 460px; font-size: var(--fs-base); }
.pb-start-card .pb-start { max-width: none; }
/* PROBNA-AMELIA (15.10): cztery kroki z linią postępu - zrobiony = zielony kafelek z ptaszkiem,
   bieżący = niebieski z poświatą, następny = biały. Ptaszek i cyfra są w HTML (JS przełącza
   „Termin" -> „Dane" na jednej stronie), widoczność daje klasa kroku. */
.pb-steps { list-style: none; margin: 0 auto; padding: 0; display: flex; max-width: 480px; }
.pb-step { position: relative; flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 6px; color: var(--text-3); font-size: var(--fs-sm); font-weight: var(--fw-semibold); text-align: center; }
.pb-step + .pb-step::before { content: ""; position: absolute; top: 16px; left: calc(-50% + 24px); right: calc(50% + 24px); height: 2px; border-radius: var(--shape-full); background: var(--border); transition: background var(--motion-std) var(--ease-std); }
.pb-step.is-done::before { background: var(--c-ok); }
.pb-step.is-current::before { background: linear-gradient(90deg, var(--c-ok), var(--primary)); }
.pb-step-num { position: relative; z-index: 1; display: grid; place-items: center; width: 34px; height: 34px; border-radius: var(--shape-full); border: 1.5px solid var(--border-strong); background: var(--surface); color: var(--text-3); font-size: var(--fs-sm); font-weight: var(--fw-bold); line-height: 1; box-sizing: border-box; transition: background var(--motion-std) var(--ease-std), box-shadow var(--motion-std) var(--ease-std); }
.pb-step-ok { display: none; font-size: var(--fs-xl); }
.pb-step.is-done .pb-step-n { display: none; }
.pb-step.is-done .pb-step-ok { display: block; }
.pb-step.is-current { color: var(--primary); }
.pb-step.is-current .pb-step-num { background: var(--g-blue); border-color: transparent; color: var(--on-primary); box-shadow: 0 0 0 4px var(--primary-container), var(--shadow-tile); }
.pb-step.is-done { color: var(--text-2); }
.pb-step.is-done .pb-step-num { background: var(--g-green); border-color: transparent; color: var(--on-primary); }
.pb-hero .pb-steps { margin-bottom: 14px; }
.pb-steps + .pb-back { margin-top: 6px; }
.pb-segment--tiles { gap: 10px; }
.pb-tile-label { display: grid; grid-template-columns: auto 1fr; grid-template-areas: "ico title" "ico sub"; column-gap: 12px; row-gap: 2px; align-items: center; justify-items: start; text-align: left; min-height: 64px; padding: 12px 14px; border-radius: var(--shape-md); }
.pb-tile-ico { grid-area: ico; font-size: var(--fs-2xl); color: var(--primary); display: grid; place-items: center; width: 40px; height: 40px; border-radius: var(--shape-sm); background: var(--primary-container); }
.pb-tile-title { grid-area: title; font-weight: var(--fw-semibold); color: var(--text); font-size: var(--fs-base); line-height: var(--lh-tight); }
.pb-tile-sub { grid-area: sub; color: var(--text-3); font-size: var(--fs-sm); line-height: var(--lh-tight); }
.pb-seg-input:checked + .pb-tile-label { box-shadow: 0 0 0 1px var(--primary) inset; }
.pb-seg-input:checked + .pb-tile-label .pb-tile-ico { background: var(--primary); color: var(--on-primary); }
.pb-submit .material-symbols-outlined { font-size: var(--fs-xl); }
.pb-trust { list-style: none; margin: 14px 0 0; padding: 0; display: flex; flex-wrap: wrap; justify-content: center; gap: 6px 16px; color: var(--text-3); font-size: var(--fs-sm); }
.pb-trust li { display: inline-flex; align-items: center; gap: 5px; }
.pb-trust .material-symbols-outlined { font-size: var(--fs-md); color: var(--primary); }
@media (min-width: 600px) {
  .pb-start-card { padding: 26px 30px 28px; }
  .pb-segment--tiles { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .pb-tile-label { grid-template-columns: 1fr; grid-template-areas: "ico" "title" "sub"; justify-items: center; text-align: center; row-gap: 4px; padding: 16px 10px 14px; min-height: 0; }
  .pb-tile-ico { width: 46px; height: 46px; margin-bottom: 4px; }
}

/* PROBNA-24 (21.09): płynne przejścia między krokami /probna (każdy krok to nowa strona):
   treść wjeżdża z lekkim przesunięciem, a przy kliknięciu w kolejny krok gaśnie.
   prefers-reduced-motion wyłącza to globalnie (sekcja „Dostępność ruchowa"). */
.pb-main { animation: pb-in var(--motion-slow) var(--ease-std) both; }
@keyframes pb-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
/* PROBNA-SZYBKO (15.10): przy przejściu treść tylko przygasa (wcześniej znikała do zera -
   pusta ramka na czas ładowania wyglądała jak zawieszona strona), a przycisk kroku
   pokazuje kręciołek i „Szukam wolnych terminów..." / „Rezerwuję...". */
.pb-leaving .pb-main { opacity: 0.55; pointer-events: none; transition: opacity var(--motion-fast) var(--ease-std); }
/* Wysłany formularz: przygasa treść, nie przycisk z kręciołkiem (pełny kontrast napisu). */
.pb-sending .pb-main > :not(#pb-form), .pb-sending #pb-form > :not(.pb-submit):not(.pb-panel):not(.pb-action), .pb-sending #pb-form > .pb-action > :not(.pb-submit) { opacity: 0.55; transition: opacity var(--motion-fast) var(--ease-std); }
.pb-sending .pb-main { pointer-events: none; }
.pb-submit.is-busy { cursor: progress; opacity: 1; }
.pb-submit.is-busy::before {
  /* .btn::before to warstwa stanu (absolute, opacity 0, tło currentColor) - wyłączamy ją,
     inaczej kręciołek jest niewidoczny i przypięty do rogu przycisku. */
  content: ""; position: static; inset: auto; z-index: auto; opacity: 1; background: none; transition: none;
  width: 18px; height: 18px; flex: none; border-radius: 50%;
  border: 2.5px solid currentColor; border-right-color: transparent;
  animation: asys-spin 0.7s linear infinite;
}

/* PROBNA-25 (21.09): krok 3 - jeden panel, dwie części rozdzielone linią. */
.pb-panel--one { padding: 0; }
.pb-part { min-width: 0; padding: 18px; }
.pb-divider { border: 0; border-top: 1px solid var(--border); margin: 0; }
.pb-fields-2 { display: grid; gap: 0 14px; }
@media (min-width: 700px) { .pb-fields-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* PROBNA-TYPO (15.10, zgłoszenie właściciela: „w niektórych miejscach średnio wyśrodkowane
   czcionki"): kroki są wyśrodkowane w każdym kroku (w kroku 2 stały do lewej, pod
   wyśrodkowanym nagłówkiem kroku 1 i 3), w kroku 3 link „Wszyscy korepetytorzy" stoi w tej
   samej kolumnie co karta, tekst w skali strony szkoły. Sprawdzone pikselowo: cyfry
   Montserrat w pigułkach godzin są wyśrodkowane (17/18 px), `text-box` nic tu nie zmienia. */
.pb-hero { text-align: center; }
.pb-hero .pb-lead { margin-left: auto; margin-right: auto; }
@media (min-width: 900px) {
  .pb-main > .pb-back { display: flex; box-sizing: border-box; max-width: 772px; margin-left: auto; margin-right: auto; }
}
/* Skala jak na stronie szkoły (tekst 15-16 px), nie panelowa 13 px. */
.pb-start-head .pb-lead, .pb-hero .pb-lead { font-size: var(--fs-lg); }
.pb-tile-title, .pb-seg-label { font-size: var(--fs-md); }
.pb-tile-sub { font-size: var(--fs-base); }

/* PROBNA-KV (07.10): rezerwacja próbna w wyglądzie strony szkoły (korepetycjesolve.com).
   Od KV-APP (08.10) krój, kolory i cienie strony ma cały panel (tokens.css), więc skorupa
   /probna* nie przepina już tokenów - zostały tylko szlify formularza w ramce WordPressa
   (obwódki 1.5px, większe promienie kart, cięższe nagłówki kroków). */
html.pb-kv .pb-h1 { font-weight: var(--fw-black); letter-spacing: -0.03em; }
html.pb-kv .pb-h2, html.pb-kv .pb-card-name { font-weight: var(--fw-black); letter-spacing: -0.02em; }
html.pb-kv .pb-body .btn.accent { border-radius: var(--shape-full); font-weight: var(--fw-bold); }
html.pb-kv .pb-card, html.pb-kv .pb-panel, html.pb-kv .pb-start-card { border-width: 1.5px; border-radius: var(--shape-xl); }
html.pb-kv .pb-card:hover { border-color: var(--primary); }
html.pb-kv .pb-tile-label { border-width: 1.5px; border-radius: var(--shape-lg); }
html.pb-kv .pb-seg-input:checked + .pb-tile-label { box-shadow: none; }
html.pb-kv .pb-tile-title, html.pb-kv .pb-seg-label { font-weight: var(--fw-semibold); }
html.pb-kv .pb-tag { font-weight: var(--fw-bold); }

/* W ramce: stronę, nagłówek sekcji i kartę daje WordPress, więc krok 1 nie rysuje drugiej
   karty ani drugiego nagłówka (tytuł zostaje dla czytników), a pod treścią nie ma zapasu
   40px - zostawał jako pusty pas pod formularzem na stronie głównej. */
/* Boki: ramka stoi już w karcie z własnym marginesem; 6px zostaje na cień przycisków i obrys fokusu. */
.pb-embedded .pb-main { padding: 0 6px 4px; }
.pb-embedded .pb-start-wrap { padding: 0; }
/* PROBNA-KV-2 (07.10): na telefonie `body::after` rezerwuje 120px na dolną nawigację panelu
   (sekcja „mobile"). Skorupa /probna* nie ma tej nawigacji, a w ramce te 120px było pustym
   pasem pod formularzem na stronie głównej (zgłoszenie właściciela, widoczne tylko na telefonie). */
html.pb-kv body::after { content: none; }
.pb-embedded .pb-start-card { border: 0; border-radius: 0; box-shadow: none; background: transparent; padding: 4px 0 0; }
.pb-embedded .pb-start-head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
.pb-embedded .pb-start-card .pb-steps { margin-bottom: 18px; }
.pb-embedded .pb-hero { padding-top: 6px; }

/* PROBNA-AMELIA (15.10, właściciel: „trochę żywsza, jak panel w Amelii", w KV strony
   korepetycjesolve.com): kafelki poziomów z kolorowymi ikonami i ptaszkiem wyboru, klasy
   i zakres jako pigułki w szynie (jak zakładki na stronie), karty korepetytorów unoszą się
   pod kursorem, w kroku 3 kalendarz z godzinami obok, a dane osobnym krokiem
   z podsumowaniem „Twoja lekcja próbna". Tylko /probna* (html.pb-kv) - `.pb-cal`
   i `.pb-slot` dzieli z nią rezerwacja rodzica w panelu, której to nie dotyczy. */
@keyframes pb-pop { from { transform: scale(0.4); opacity: 0; } to { transform: none; opacity: 1; } }
html.pb-kv .pb-body .btn.accent { box-shadow: var(--shadow-primary); font-weight: var(--fw-black); }
html.pb-kv .pb-body .btn.accent:hover { box-shadow: var(--shadow-primary-lg); }
html.pb-kv .pb-submit { height: 54px; }

/* krok 1: poziomy */
html.pb-kv .pb-tile-label { position: relative; border-color: var(--border); background: var(--surface); transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-std) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
html.pb-kv .pb-tile:hover .pb-tile-label { transform: translateY(-2px); box-shadow: var(--elev-3); border-color: var(--primary-ring); background: var(--surface); }
html.pb-kv .pb-tile .pb-tile-ico { background: var(--g-blue); color: var(--on-primary); border-radius: var(--shape-md); box-shadow: var(--elev-2); }
html.pb-kv .pb-tile--podst .pb-tile-ico { background: var(--g-green); }
html.pb-kv .pb-tile--matura .pb-tile-ico { background: var(--g-violet); }
html.pb-kv .pb-seg-input:checked + .pb-tile-label { border-color: var(--primary); background: linear-gradient(180deg, var(--primary-container) 0%, var(--surface) 72%); box-shadow: var(--shadow-tile); color: var(--text); }
html.pb-kv .pb-seg-input:checked + .pb-tile-label::after { content: "check"; font-family: "Material Symbols Outlined"; position: absolute; top: 8px; right: 8px; width: 22px; height: 22px; border-radius: var(--shape-full); background: var(--primary); color: var(--on-primary); display: grid; place-items: center; font-size: var(--fs-md); line-height: 1; animation: pb-pop var(--motion-std) var(--ease-std) both; }

/* klasy i zakres: pigułki w szynie */
html.pb-kv .pb-segment:not(.pb-segment--tiles):not([hidden]) { display: flex; flex-wrap: wrap; gap: 4px; padding: 4px; background: var(--bg); border: 1px solid var(--border); border-radius: var(--shape-lg); }
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg { flex: 1 1 0; min-width: 48px; }
/* ZRODLO-KLIENTA-DALEJ: „Skąd o nas wiesz?" - szerokość z napisu, na wąskim telefonie zawija się do 2 rzędów */
html.pb-kv .pb-segment--src:not(.pb-segment--tiles) .pb-seg { flex: 1 0 auto; }
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg-label { min-height: 42px; border: 0; border-radius: var(--shape-full); background: transparent; color: var(--text-2); font-weight: var(--fw-bold); white-space: nowrap; }
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg:hover .pb-seg-label { background: var(--surface); color: var(--text); }
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg-input:checked + .pb-seg-label { background: var(--primary); color: var(--on-primary); box-shadow: var(--shadow-primary); }

/* krok 2: karty korepetytorów */
html.pb-kv .pb-card { transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-std) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
html.pb-kv .pb-card:hover { transform: translateY(-3px); box-shadow: var(--elev-4); }
html.pb-kv .pb-card-photo { border-radius: var(--shape-lg); }
html.pb-kv .pb-next { padding: 5px 11px 5px 8px; border-radius: var(--shape-full); background: var(--c-ok-bg); color: var(--text); }
html.pb-kv .pb-next--none { background: var(--surface-2); color: var(--text-3); }
html.pb-kv .pb-card-cta { gap: 6px; }
html.pb-kv .pb-card-cta .material-symbols-outlined { font-size: var(--fs-lg); transition: transform var(--motion-fast) var(--ease-std); }
html.pb-kv .pb-card:hover .pb-card-cta .material-symbols-outlined { transform: translateX(3px); }

/* krok 3: korepetytor, kalendarz z godzinami obok, potem dane. KV-APLIKACJA-2 (15.10): ten sam
   wygląd kalendarza i godzin u rodzica (rezerwacja i zmiana terminu, `.pb-amelia`). */
html.pb-kv .pb-tutor { align-items: center; }
html.pb-kv .pb-avatar--lg { border-radius: var(--shape-full); object-position: 50% 25%; box-shadow: 0 0 0 4px var(--surface), 0 0 0 5.5px var(--primary-ring); }
html.pb-kv .pb-tutor-bio { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; white-space: normal; }
:is(html.pb-kv, .pb-amelia) .pb-day { border: 1.5px solid var(--border); background: var(--surface); border-radius: var(--shape-md); }
:is(html.pb-kv, .pb-amelia) .pb-day-num { font-weight: var(--fw-bold); }
:is(html.pb-kv, .pb-amelia) .pb-day:not(.pb-day--active):hover { border-color: var(--primary); background: var(--primary-container); }
:is(html.pb-kv, .pb-amelia) .pb-day--off { border-color: transparent; background: transparent; }
:is(html.pb-kv, .pb-amelia) .pb-day-dot { background: var(--accent-cyan); }
:is(html.pb-kv, .pb-amelia) .pb-day--active { background: var(--primary); border-color: var(--primary); color: var(--on-primary); box-shadow: var(--shadow-primary); }
:is(html.pb-kv, .pb-amelia) .pb-day--active .pb-day-dot { background: var(--on-primary); }
:is(html.pb-kv, .pb-amelia) .pb-slots-title { font-weight: var(--fw-black); letter-spacing: -0.01em; }
:is(html.pb-kv, .pb-amelia) .pb-slot-time { border-radius: var(--shape-full); border-width: 1.5px; border-color: var(--border); color: var(--text); font-weight: var(--fw-bold); }
:is(html.pb-kv, .pb-amelia) .pb-slot:hover .pb-slot-input:not(:checked) + .pb-slot-time,
:is(html.pb-kv, .pb-amelia) .pb-slot--btn:not(.pb-slot--selected):hover .pb-slot-time { color: var(--on-primary-container); }
:is(html.pb-kv, .pb-amelia) .pb-slot-input:checked + .pb-slot-time, .pb-amelia .pb-slot--btn.pb-slot--selected .pb-slot-time { background: var(--primary); border-color: var(--primary); color: var(--on-primary); box-shadow: var(--shadow-primary); animation: pb-pop var(--motion-fast) var(--ease-std); }
.pb-when-grid { display: grid; gap: 4px 24px; }
.pb-next-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 14px; margin-top: 18px; padding: 12px 12px 12px 16px; border-radius: var(--shape-lg); background: var(--primary-container); border: 1.5px solid var(--primary-ring); animation: pb-in var(--motion-std) var(--ease-std) both; }
.pb-next-bar[hidden] { display: none; }
.pb-next-bar-when { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pb-next-bar-when strong { display: block; color: var(--text); font-size: var(--fs-md); font-weight: var(--fw-black); }
.pb-next-bar-when strong::first-letter { text-transform: uppercase; }
.pb-next-btn { flex: 1 1 auto; height: 46px; padding: 0 22px; gap: 6px; }
html.pb-kv .pb-h2-n { background: var(--g-blue); color: var(--on-primary); box-shadow: var(--shadow-tile); }
html.pb-kv .pb-card-photo--initials, html.pb-kv .pb-avatar--initials { background: var(--g-blue); color: var(--on-primary); font-weight: var(--fw-black); }
html.pb-kv .pb-avatar--lg { width: 68px; height: 68px; font-size: var(--fs-2xl); }
html.pb-kv.pb-embedded .pb-hero .pb-h1 { font-size: var(--fs-3xl); }
.pb-summary-title { margin: 0 0 2px; color: var(--text); font-size: var(--fs-lg); font-weight: var(--fw-black); letter-spacing: -0.015em; }
html.pb-kv .pb-summary { gap: 10px; padding: 16px 18px; background: linear-gradient(180deg, var(--primary-container) 0%, var(--surface) 100%); border: 1.5px solid var(--primary-ring); border-radius: var(--shape-lg); }
html.pb-kv .pb-summary-row { color: var(--text-2); }
html.pb-kv .pb-summary-row .material-symbols-outlined { color: var(--primary); }
.pb-sum-change { margin-left: auto; flex: none; min-height: 32px; padding: 0 6px; border: 0; background: none; color: var(--primary); font: inherit; font-weight: var(--fw-bold); cursor: pointer; border-radius: var(--shape-sm); }
.pb-sum-change:hover { text-decoration: underline; }
.pb-sum-change[hidden] { display: none; }
/* Przełączanie „Termin" / „Dane" (klasa na <body> z probna.js; bez JS widać oba). */
.pb-phase-termin .pb-panel--form, .pb-phase-termin .pb-divider,
.pb-phase-dane .pb-part--when, .pb-phase-dane .pb-divider, .pb-phase-dane .pb-tutor { display: none; }
.pb-phase-dane .pb-panel--form { animation: pb-in var(--motion-std) var(--ease-std) both; }
.pb-action { display: contents; }   /* PROBNA-HERO: opakowanie przycisku tylko dla ramki hero, poza nią bez wpływu na układ */

/* ── PROBNA-HERO (28.10): ramka rezerwacji w hero strony głównej (/probna?embed=hero) ────────────────
   Karta ok. 400 px obok nagłówka strony. Ramka ma STAŁĄ wysokość (probna.js: 520 px, telefon 560 px) -
   u góry przyklejony wskaźnik kroków, na dole przyklejony przycisk, środek (.pb-main) przewija się w ramce,
   więc hero strony nie skacze przy zmianie kroku. Bez własnej karty (tło, cień, ramka i zaokrąglenia są po
   stronie WordPressa), bez tytułu i ceny (są nad ramką). Kolory strony głównej: --pbh-* (tokens.css).
   Selektory `html.pb-heroframe.pb-embedded` biją reguły `.pb-embedded` i `html.pb-kv`. Bez media queries -
   wysokość to 100vh ramki, szerokość 360-420 px. */
html.pb-heroframe { --primary: var(--pbh-blue); --primary-hover: var(--pbh-blue-hover); --primary-pressed: var(--pbh-blue-hover); --primary-ring: var(--pbh-line); --border: var(--pbh-line); --border-strong: var(--pbh-line); --text: var(--pbh-navy); --sk-accent: var(--pbh-cyan); }
html.pb-heroframe, html.pb-heroframe.pb-embedded body.pb-body { height: 100%; margin: 0; overflow: hidden; background: transparent; }
html.pb-heroframe.pb-embedded body.pb-body { display: flex; flex-direction: column; height: 100vh; min-height: 0; }
html.pb-heroframe.pb-embedded body.pb-body::after { display: none; }
html.pb-heroframe.pb-embedded .pb-main { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; max-width: none; margin: 0; padding: 0 4px; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; animation: none; }
/* Kontenery kroków zawsze na szerokość ramki: `margin: 0 auto` z układu strony wyłączał rozciąganie w flexie
   i kontener rósł do najdłuższej linii (pasek dni, linia zaufania) - treść wychodziła poza ramkę. */
html.pb-heroframe.pb-embedded :is(.pb-start-wrap, .pb-start-card, .pb-start, .pb-layout, .pb-panel, .pb-part, .pb-when-grid, .pb-cal, .pb-action, .pb-grid, .pb-rest, .pb-fieldset) { width: 100%; min-width: 0; max-width: 100%; margin-left: 0; margin-right: 0; box-sizing: border-box; }
html.pb-heroframe.pb-embedded .pb-body .btn.accent { border-radius: var(--pbh-radius); box-shadow: none; font-weight: var(--fw-bold); }
html.pb-heroframe.pb-embedded .pb-body .btn.accent:hover { box-shadow: none; }
/* Wskaźnik kroków: przyklejony u góry przewijanego środka. */
html.pb-heroframe.pb-embedded .pb-steps { position: sticky; top: 0; z-index: 2; max-width: none; margin: 0; padding: 2px 0 6px; background: var(--surface); }
html.pb-heroframe.pb-embedded .pb-step { font-size: var(--fs-xs); gap: 3px; }
html.pb-heroframe.pb-embedded .pb-hero { position: sticky; top: 0; z-index: 2; padding: 0; margin: 0; background: var(--surface); text-align: left; }
html.pb-heroframe.pb-embedded .pb-hero .pb-h1 { display: none; }
html.pb-heroframe.pb-embedded .pb-hero .pb-lead { margin: 0; padding: 0 0 6px; font-size: var(--fs-sm); color: var(--text-2); }
/* Przyklejony przycisk na dole (krok 1: formularz klasy, krok 4: rezerwacja). */
html.pb-heroframe.pb-embedded .pb-action { display: block; position: sticky; bottom: 0; z-index: 2; margin-top: auto; padding: 8px 0 2px; background: var(--surface); }
html.pb-heroframe.pb-embedded .pb-submit { height: 46px; margin: 0; }
html.pb-heroframe.pb-embedded .pb-trust { margin: 6px 0 0; flex-wrap: nowrap; justify-content: center; gap: 12px; font-size: var(--fs-sm); line-height: var(--lh-tight); white-space: nowrap; overflow: hidden; }
html.pb-heroframe.pb-embedded .pb-trust .material-symbols-outlined { font-size: var(--fs-md); }
html.pb-heroframe.pb-embedded .pb-fine { margin: 4px 0 0; font-size: var(--fs-sm); line-height: var(--lh-tight); text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Krok 1: kafle poziomu niższe (56 px), klasa jako jeden rząd pod wybranym kaflem, bez nagłówków. Kafle i pola
   klasy/zakresu są rodzeństwem w jednej kolumnie (display: contents), a `order` stawia rząd klas pod kaflem. */
html.pb-heroframe.pb-embedded .pb-start-wrap, html.pb-heroframe.pb-embedded .pb-start-card, html.pb-heroframe.pb-embedded .pb-start { flex: 1 0 auto; min-height: 0; display: flex; flex-direction: column; }
html.pb-heroframe.pb-embedded .pb-start-wrap { padding: 0; }
html.pb-heroframe.pb-embedded .pb-start-card { max-width: none; margin: 0; padding: 0; background: transparent; border: 0; border-radius: 0; box-shadow: none; }
html.pb-heroframe.pb-embedded .pb-start { gap: 8px; padding: 2px 1px 0; }
html.pb-heroframe.pb-embedded .pb-start > .pb-fieldset:has(.pb-segment--tiles), html.pb-heroframe.pb-embedded .pb-segment--tiles { display: contents; }
html.pb-heroframe.pb-embedded .pb-start legend { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }   /* czytnik dalej słyszy „Poziom nauki” */
html.pb-heroframe.pb-embedded .pb-grade-note { display: none; }
html.pb-heroframe.pb-embedded .pb-tile--podst { order: 10; }
html.pb-heroframe.pb-embedded #pb-grade-field { order: 11; margin: -2px 0 2px; }
html.pb-heroframe.pb-embedded .pb-tile--srednia { order: 20; }
html.pb-heroframe.pb-embedded .pb-start:has(.pb-tile--srednia .pb-seg-input:checked) #pb-grade-field { order: 21; }
html.pb-heroframe.pb-embedded #pb-scope-field { order: 22; margin: -2px 0 2px; }
html.pb-heroframe.pb-embedded .pb-tile--matura { order: 30; }
html.pb-heroframe.pb-embedded .pb-start:has(.pb-tile--matura .pb-seg-input:checked) #pb-scope-field { order: 31; }
html.pb-heroframe.pb-embedded .pb-action { order: 100; }
html.pb-heroframe.pb-embedded .pb-tile-label { min-height: 56px; padding: 6px 12px; row-gap: 0; border-radius: var(--pbh-radius); }
html.pb-heroframe.pb-embedded .pb-tile-ico { width: 32px; height: 32px; font-size: var(--fs-xl); }
html.pb-heroframe.pb-embedded .pb-tile-title { font-size: var(--fs-md); }
html.pb-heroframe.pb-embedded .pb-tile-sub { font-size: var(--fs-xs); }
html.pb-heroframe.pb-embedded .pb-seg-input:checked + .pb-tile-label::after { top: 50%; transform: translateY(-50%); }
html.pb-heroframe.pb-embedded .pb-segment:not(.pb-segment--tiles) .pb-seg-label { min-height: 38px; }
/* Krok 2: kompaktowe karty korepetytorów (zdjęcie 48 px, imię, poziomy, najbliższy termin). */
html.pb-heroframe.pb-embedded .pb-grid--big { gap: 6px; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-link { grid-template-columns: 48px minmax(0, 1fr) auto; grid-template-areas: "photo who cta" "photo next cta"; align-items: center; gap: 2px 10px; padding: 8px 10px; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-foot { display: contents; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-next { grid-area: next; justify-self: start; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-cta { grid-area: cta; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-who { align-self: end; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-photo { width: 48px; height: 48px; aspect-ratio: 1; border-radius: var(--shape-md); font-size: var(--fs-md); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-name { font-size: var(--fs-md); margin: 0; }
html.pb-heroframe.pb-embedded .pb-card-levels { margin: 2px 0 0; font-size: var(--fs-xs); color: var(--text-2); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-headline, html.pb-heroframe.pb-embedded .pb-card--big .pb-tags, html.pb-heroframe.pb-embedded .pb-card--big .pb-card-bio { display: none; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-foot { gap: 6px; }
html.pb-heroframe.pb-embedded .pb-next { padding: 0; background: none; font-size: var(--fs-xs); color: var(--text-2); }
html.pb-heroframe.pb-embedded .pb-next .material-symbols-outlined { display: none; }
html.pb-heroframe.pb-embedded .pb-card-cta { min-height: 34px; padding: 0 12px; border-radius: var(--pbh-radius); font-size: var(--fs-sm); }
html.pb-heroframe.pb-embedded .pb-card-cta .material-symbols-outlined { display: none; }
html.pb-heroframe.pb-embedded .pb-card--big { border-radius: var(--pbh-radius); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
html.pb-heroframe.pb-embedded .pb-rest .pb-h2 { font-size: var(--fs-sm); margin: 8px 0 6px; }
html.pb-heroframe.pb-embedded .pb-rest .pb-hint { display: none; }
/* Krok 3 i 4: korepetytor w jednej linii, dni jako pasek przewijany w bok, godziny w 3 kolumnach, dane bez
   pól opcjonalnych; „Dalej" i „Rezerwuję" przyklejone do dołu. */
html.pb-heroframe.pb-embedded .pb-back { min-height: 28px; margin: 0; font-size: var(--fs-xs); }
html.pb-heroframe.pb-embedded .pb-tutor { gap: 10px; align-items: center; padding: 0 0 6px 3px; margin: 0; }
html.pb-heroframe.pb-embedded .pb-avatar--lg { width: 36px; height: 36px; border-radius: var(--shape-md); font-size: var(--fs-sm); }
html.pb-heroframe.pb-embedded .pb-h1--sm { font-size: var(--fs-md); margin: 0; }
html.pb-heroframe.pb-embedded .pb-tutor-headline, html.pb-heroframe.pb-embedded .pb-tutor-bio, html.pb-heroframe.pb-embedded .pb-tutor .pb-tags, html.pb-heroframe.pb-embedded .pb-divider { display: none; }
html.pb-heroframe.pb-embedded .pb-layout, html.pb-heroframe.pb-embedded .pb-panel, html.pb-heroframe.pb-embedded .pb-part--when, html.pb-heroframe.pb-embedded .pb-panel--form { flex: 1 0 auto; min-height: 0; display: flex; flex-direction: column; }
html.pb-heroframe.pb-embedded .pb-layout { gap: 0; }
html.pb-heroframe.pb-embedded body.pb-phase-termin :is(.pb-panel--form, .pb-divider), html.pb-heroframe.pb-embedded body.pb-phase-dane :is(.pb-part--when, .pb-divider, .pb-tutor) { display: none; }
html.pb-heroframe.pb-embedded .pb-panel { background: transparent; border: 0; border-radius: 0; padding: 0; }
html.pb-heroframe.pb-embedded .pb-panel-head { margin-bottom: 4px; }
html.pb-heroframe.pb-embedded .pb-h2 { font-size: var(--fs-sm); margin: 0; }
html.pb-heroframe.pb-embedded .pb-when-grid { display: block; }
/* PROBNA-KALENDARZ (06.11): dni w ramce hero to kalendarz miesiąca (blok PROBNA-KALENDARZ na końcu pliku),
   nie pasek kafelków z nazwą dnia. */
html.pb-heroframe.pb-embedded .pb-hint { display: none; }
/* Krok 3/4 bez nagłówków „1 Wybierz dzień i godzinę" / „2 Twoje dane" (wskaźnik kroków mówi to samo),
   podsumowanie bez wierszy powtarzających linię pod przyciskiem. */
html.pb-heroframe.pb-embedded .pb-part .pb-h2, html.pb-heroframe.pb-embedded .pb-summary-title { display: none; }
html.pb-heroframe.pb-embedded .pb-panel-head { justify-content: flex-end; margin: 0 0 2px; }
html.pb-heroframe.pb-embedded .pb-month { font-size: var(--fs-xs); color: var(--text-3); }
html.pb-heroframe.pb-embedded .pb-summary-row:nth-of-type(n+3) { display: none; }
html.pb-heroframe.pb-embedded .pb-summary-row .material-symbols-outlined { font-size: var(--fs-md); }
html.pb-heroframe.pb-embedded .pb-slots-title { font-size: var(--fs-xs); margin: 0 0 4px; }
html.pb-heroframe.pb-embedded .pb-slot-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
/* AS-01 (audyt strony 11.11): ramka hero ma stałą wysokość, a miesiąc z sześcioma wierszami (listopad 2026)
   wypychał godziny pod jej dolną krawędź - na komputerze nie było ich widać wcale. Tygodnie, które minęły
   w całości, nic nie wnoszą, więc w ramce ich nie rysujemy (pełna strona /probna zostawia cały miesiąc).
   Gdy treść mimo to się nie mieści, probna.js dosuwa .pb-main do godzin (heroReveal). */
html.pb-heroframe.pb-embedded .pb-cal-row--past { display: none; }
html.pb-heroframe.pb-embedded .pb-next-bar { position: sticky; bottom: 0; z-index: 2; margin: auto 0 0; padding: 8px 0 2px; border: 0; border-radius: 0; background: var(--surface); }
html.pb-heroframe.pb-embedded .pb-next-bar .pb-next-btn { border-radius: var(--pbh-radius); }
html.pb-heroframe.pb-embedded .pb-summary { gap: 4px; padding: 8px 10px; margin-bottom: 8px; font-size: var(--fs-xs); border-radius: var(--pbh-radius); }
html.pb-heroframe.pb-embedded .pb-summary-title { font-size: var(--fs-xs); }
html.pb-heroframe.pb-embedded .pb-chosen { padding: 8px 10px; margin-bottom: 8px; font-size: var(--fs-xs); border-radius: var(--pbh-radius); }
html.pb-heroframe.pb-embedded .field:has(> #pb-topic), html.pb-heroframe.pb-embedded .field:has(> #pb-message), html.pb-heroframe.pb-embedded [data-pb-src] { display: none; }
html.pb-heroframe.pb-embedded .pz-consent-check { font-size: var(--fs-xs); }
/* Gotowe (po rezerwacji) i inne strony w tej samej ramce: ciaśniej, bez dużej ikony. */
html.pb-heroframe.pb-embedded .pb-done { padding: 6px 0; }
html.pb-heroframe.pb-embedded .pb-done-ico { font-size: var(--fs-display); }
html.pb-heroframe.pb-embedded .pb-done .pb-h1 { font-size: var(--fs-xl); }
@media (min-width: 700px) {
  .pb-when-grid { grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); align-items: start; }
  .pb-when-grid > .pb-cal, .pb-when-grid > .pb-hint { grid-column: 1; }
  .pb-when-grid > .pb-slots { grid-column: 2; grid-row: 1 / span 2; }
  .pb-when-grid .pb-slot-grid { grid-template-columns: repeat(auto-fill, minmax(88px, 1fr)); }
  html.pb-kv .pb-avatar--lg { width: 104px; height: 104px; font-size: var(--fs-3xl); }
  .pb-next-btn { flex: none; }
}

/* RODZIC-KROTSZY (21.09): „Pokaż pozostałe" w dziale tematów planu (parent/student.html). */
.pz-pool-more-h { list-style: none; cursor: pointer; display: inline-flex; align-items: center; min-height: 44px; color: var(--primary); font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.pz-pool-more-h::-webkit-details-marker { display: none; }
.pz-pool-more[open] > .pz-pool-more-h { display: none; }

/* AVATAR-KADR (21.09): kadrowanie zdjęcia profilowego przed wysłaniem (pages/avatar-crop.js). */
.acc-crop { flex-basis: 100%; display: flex; flex-wrap: wrap; gap: 14px; align-items: center; margin-top: 4px; }
.acc-crop[hidden] { display: none; }
.acc-crop-stage { position: relative; flex: none; width: 220px; height: 220px; overflow: hidden; border-radius: var(--shape-md); background: var(--surface-2); cursor: grab; touch-action: none; user-select: none; }
.acc-crop-stage.is-dragging { cursor: grabbing; }
.acc-crop-stage:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.acc-crop-stage img { position: absolute; top: 0; left: 0; max-width: none; pointer-events: none; }
.acc-crop-stage::after { content: ""; position: absolute; inset: 0; border-radius: 50%; box-shadow: 0 0 0 220px rgba(0, 0, 0, .38); pointer-events: none; }
.acc-crop-side { flex: 1 1 200px; min-width: 0; display: grid; gap: 8px; }
.acc-crop-zoom { width: 100%; min-height: 44px; accent-color: var(--primary); }

/* SKLEP-3 (04.10): publiczny sklep /sklep (shop/*.html) - na skorupie /probna (pb-*). */
.sk-grid { display: grid; grid-template-columns: 1fr; gap: 14px; }
.sk-card { overflow: hidden; display: flex; flex-direction: column; }
.sk-card-link { display: flex; flex-direction: column; flex: 1; color: inherit; text-decoration: none; }
.sk-card-cart { padding: 0 16px 16px; }
.sk-card-link:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.sk-cover { display: block; width: 100%; height: auto; aspect-ratio: 3 / 4; object-fit: cover; background: var(--surface-2); border-radius: var(--shape-md); }
.sk-card .sk-cover { border-radius: 0; }
.sk-cover--empty { display: grid; place-items: center; color: var(--text-3); }
.sk-cover--empty .material-symbols-outlined { font-size: var(--fs-display); }
.sk-card-body { display: flex; flex-direction: column; gap: 6px; flex: 1; padding: 14px 16px 16px; }
.sk-card-title { margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-semibold); line-height: 1.3; }
.sk-card-sub { margin: 0; color: var(--text-2); font-size: var(--fs-sm); line-height: var(--lh-base); }
.sk-card-foot { margin-top: auto; padding-top: 10px; display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.sk-price { font-weight: var(--fw-bold); font-size: var(--fs-lg); white-space: nowrap; }
.sk-price--big { margin: 0 0 12px; font-size: var(--fs-2xl); }
.sk-back { margin: 12px 0 6px; }
.sk-product { display: grid; gap: 18px; padding-bottom: 12px; }
.sk-product-media { max-width: 360px; }
.sk-product-main { min-width: 0; }
.sk-facts { list-style: none; margin: 0 0 16px; padding: 0; display: grid; gap: 6px; color: var(--text-2); font-size: var(--fs-sm); }
.sk-facts li { display: flex; align-items: center; gap: 8px; }
.sk-facts .material-symbols-outlined { font-size: var(--fs-lg); color: var(--primary); }
.sk-desc { margin: 0 0 12px; line-height: var(--lh-base); max-width: 680px; }
.sk-buy { margin-top: 18px; }
.sk-buy .pb-h2 { margin-bottom: 14px; }
.sk-invoice { margin: 0 0 14px; }
.sk-invoice[hidden] { display: none; }
.sk-order { margin-bottom: 24px; display: grid; gap: 12px; }
.sk-order p { margin: 0; line-height: var(--lh-base); }
.sk-order .btn { justify-self: start; }
.sk-sep { margin: 4px 0; }
@media (min-width: 600px) { .sk-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 900px) {
  .sk-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .sk-product { grid-template-columns: minmax(0, 320px) minmax(0, 1fr); align-items: start; gap: 28px; }
}

/* SKLEP-2 (04.10): panel admina /admin/sklep. */
.sk-admin-cover { width: 48px; height: 64px; object-fit: cover; border-radius: var(--radius-sm); background: var(--surface-2); display: block; }
.sk-admin-form { display: grid; gap: 12px; max-width: 720px; }
/* SKLEP-START: lista gotowości do sprzedaży w /admin/sklep */
.sk-start { padding: 14px 16px; }
.sk-start-sum { display: flex; align-items: center; gap: 8px; cursor: pointer; min-height: 44px; }
.sk-start-list { list-style: none; margin: 8px 0 12px; padding: 0; display: grid; gap: 10px; }
.sk-start-item { display: flex; gap: 10px; align-items: flex-start; }
.sk-start-item > .material-symbols-outlined { color: var(--text-3); flex-shrink: 0; }
.sk-start-item.is-ok > .material-symbols-outlined { color: var(--success); }
.sk-start-item.is-ok .sk-start-label { color: var(--text-3); }
.sk-admin-head { padding: 14px 16px; }
.sk-admin-head .card-h { margin: 0; }
.sk-dl { display: grid; grid-template-columns: 1fr; gap: 2px 16px; margin: 0; }
.sk-dl dt { color: var(--text-3); font-size: var(--fs-sm); margin-top: 8px; }
.sk-dl dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
@media (min-width: 700px) {
  .sk-dl { grid-template-columns: 180px minmax(0, 1fr); }
  .sk-dl dt { margin-top: 0; }
}

/* SKLEP-PROMO / SKLEP-PAKIET (04.10): cena promocyjna, plakietki, skład pakietu, lista plików. */
.sk-price-wrap { display: inline-flex; align-items: baseline; flex-wrap: wrap; gap: 4px 8px; }
.sk-price-old { color: var(--text-3); font-size: var(--fs-sm); white-space: nowrap; }
.sk-price--promo { color: var(--c-rej); }
.sk-price-line { margin: 0 0 12px; display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px 12px; }
.sk-price-line .sk-price--big { margin: 0; }
.sk-promo-until { color: var(--text-2); font-size: var(--fs-sm); }
.sk-badges { display: flex; flex-wrap: wrap; gap: 6px; }
.sk-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: var(--shape-full); background: var(--primary-container); color: var(--primary); font-size: var(--fs-xs); font-weight: var(--fw-semibold); }
.sk-badge--promo { background: var(--c-rej-bg); color: var(--c-rej); }
.sk-bundle { margin: 0 0 16px; padding: 14px 16px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface-2); }
.sk-bundle-title { margin: 0 0 8px; font-size: var(--fs-base); font-weight: var(--fw-semibold); }
.sk-bundle-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.sk-bundle-list li { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 8px; }
.sk-bundle-list .material-symbols-outlined { font-size: var(--fs-lg); color: var(--primary); align-self: center; }
.sk-saving { margin: 10px 0 0; font-weight: var(--fw-semibold); color: var(--c-ok); }
.sk-files { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.sk-files li { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--shape-md); }
.sk-files-name { min-width: 0; overflow-wrap: anywhere; font-weight: var(--fw-semibold); }
.sk-admin-promo { display: grid; gap: 0 14px; }
.sk-admin-items { display: grid; gap: 8px; margin: 0; }
@media (min-width: 700px) { .sk-admin-promo { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* SKLEP-KODY (04.10): kod rabatowy na stronie produktu i w panelu. */
.sk-code { margin: 0 0 16px; padding-bottom: 14px; border-bottom: 1px solid var(--border); }
.sk-code-row { display: flex; gap: 8px; }
.sk-code-row .input { flex: 1; min-width: 0; text-transform: uppercase; }
.sk-code-msg { margin: 8px 0 0; font-size: var(--fs-sm); }
.sk-code-msg--ok { color: var(--c-ok); font-weight: var(--fw-semibold); }
.sk-code-msg--bad { color: var(--c-rej); }
.sk-code-note { margin: 6px 0 0; color: var(--text-3); font-size: var(--fs-xs); }  /* KODY-EBOOKI (20.10) */
.sk-admin-code { max-width: none; padding: 14px 16px 16px; border-top: 1px solid var(--border); }
.sk-admin-code > * { max-width: 760px; }
.sk-admin-msg { margin: 0 16px 12px; }

/* SKLEP-KV (04.10): sklep w identyfikacji marki - hero jak na stronie szkoły
   (kobalt → granat, symbole matematyczne w tle, cyjan tylko jako dekoracja). */
.sk-hero { position: relative; overflow: hidden; margin: 16px 0 22px; padding: 28px 20px 24px; border-radius: var(--shape-lg); background: var(--g-panel); box-shadow: var(--shadow-panel); color: #fff; }
.sk-hero-sym { position: absolute; font-weight: var(--fw-bold); color: oklch(0.82 0.12 215); opacity: .22; pointer-events: none; user-select: none; line-height: 1; }
.sk-hero-sym--1 { top: 10px; right: 6%; font-size: calc(var(--fs-display) * 1.6); }
.sk-hero-sym--2 { bottom: -6px; right: 22%; font-size: calc(var(--fs-display) * 1.8); }
.sk-hero-sym--3 { top: 38%; right: 40%; font-size: var(--fs-display); opacity: .14; }
.sk-hero-sym--4 { bottom: 14px; left: 4%; font-size: calc(var(--fs-display) * 1.2); opacity: .12; }
.sk-hero-eyebrow { position: relative; display: inline-flex; align-items: center; gap: 8px; padding: 4px 12px; border-radius: var(--shape-full); background: rgba(255, 255, 255, .14); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.sk-hero-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent-cyan); }
.sk-hero-title { position: relative; margin: 14px 0 10px; font-size: var(--fs-3xl); line-height: 1.12; letter-spacing: -0.025em; font-weight: var(--fw-bold); max-width: 640px; }
.sk-hero-title strong { color: oklch(0.90 0.06 230); }
.sk-hero-lead { position: relative; margin: 0 0 16px; max-width: 600px; font-size: var(--fs-lg); line-height: 1.55; color: rgba(255, 255, 255, .9); }
.sk-hero-chips { position: relative; list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.sk-hero-chips li { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: var(--shape-full); background: rgba(255, 255, 255, .12); font-size: var(--fs-sm); }
.sk-hero-chips .material-symbols-outlined { font-size: var(--fs-lg); color: oklch(0.90 0.06 230); }
.sk-card { transition: transform var(--motion-std) var(--ease-std), box-shadow var(--motion-std) var(--ease-std); }
.sk-card:hover { transform: translateY(-3px); box-shadow: var(--elev-3); }
.sk-card-cta { pointer-events: none; }
@media (min-width: 900px) {
  .sk-hero { padding: 44px 44px 36px; }
  .sk-hero-title { font-size: var(--fs-display); }
}

/* SKLEP-KV-2 (04.10): dopracowanie wizualne po zrzutach ekranu.
   Panel: formularz produktu w kartach (treść | cena, okładka, publikacja),
   pola z plikiem jako strefy „wybierz albo przeciągnij" (pages/admin-sklep.js). */
.sk-pf { display: grid; gap: 16px; align-items: start; }
.sk-pf-main, .sk-pf-side { display: grid; gap: 16px; min-width: 0; }
.sk-pf-card { margin: 0; display: grid; gap: 12px; }
.sk-pf-card .card-h { margin: 0; display: flex; align-items: center; gap: 6px; font-size: var(--fs-lg); }
.sk-pf-card .field { margin: 0; }
.sk-pf-hint { margin: 0; color: var(--text-3); font-size: var(--fs-sm); line-height: var(--lh-base); }
.sk-pf-item { align-items: center; }
.sk-pf-item-name { flex: 1; min-width: 0; }
.sk-pf-item-price { color: var(--text-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
.sk-pf-delete { margin: 16px 0 24px; }
@media (min-width: 1100px) {
  .sk-pf { grid-template-columns: minmax(0, 1fr) 340px; }
  .sk-pf-side { position: sticky; top: 76px; }
}
.sk-upload { position: relative; display: flex; align-items: center; gap: 14px; padding: 16px; border: 1.5px dashed var(--border-strong); border-radius: var(--shape-md); background: var(--surface-2); transition: border-color var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std); }
.sk-upload:hover, .sk-upload.is-drag { border-color: var(--primary); background: var(--primary-container); }
.sk-upload.is-chosen { border-style: solid; border-color: var(--c-ok); }
.sk-upload:focus-within { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.sk-upload-input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
.sk-upload-ico { flex: none; font-size: var(--fs-3xl); color: var(--primary); }
.sk-upload-body { flex: 1; min-width: 0; display: grid; gap: 2px; pointer-events: none; }
.sk-upload-title { font-weight: var(--fw-semibold); }
.sk-upload-or { font-weight: var(--fw-regular); color: var(--text-3); }
.sk-upload-name { color: var(--text-2); font-size: var(--fs-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sk-upload-btn { flex: none; pointer-events: none; }
.sk-upload-thumb { flex: none; width: 72px; height: 96px; display: grid; place-items: center; border-radius: var(--radius-sm); background: var(--surface); border: 1px solid var(--border); overflow: hidden; pointer-events: none; }
.sk-upload-thumb img { width: 100%; height: 100%; object-fit: cover; }
.sk-upload-thumb img[hidden], .sk-upload-thumb [hidden] { display: none; }
.sk-upload-thumb .material-symbols-outlined { font-size: var(--fs-3xl); color: var(--text-3); }
.sk-money { font-variant-numeric: tabular-nums; white-space: nowrap; }
.sk-nowrap { white-space: nowrap; }
.sk-code-state { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.sk-code-state form { margin: 0; }

/* Sklep publiczny: okładki jak książka na jasnym tle, zamiast okładki na całą kartę. */
.sk-card-media { display: grid; place-items: center; height: 240px; padding: 20px; background: linear-gradient(160deg, var(--primary-container) 0%, var(--surface-2) 100%); }
.sk-card-media .sk-cover { height: 200px; width: auto; max-width: 100%; aspect-ratio: 3 / 4; border-radius: var(--radius-sm); box-shadow: 0 2px 6px oklch(0.2 0.05 262 / 0.18), 0 14px 28px oklch(0.2 0.05 262 / 0.22); }
.sk-card-media .sk-cover--empty { box-shadow: none; background: var(--surface); border: 1px dashed var(--border-strong); }
.sk-card:hover .sk-card-media .sk-cover { transform: translateY(-2px) rotate(-1deg); }
.sk-card-media .sk-cover { transition: transform var(--motion-std) var(--ease-std); }
.sk-product-media { display: grid; place-items: center; padding: 18px; border-radius: var(--shape-lg); background: linear-gradient(160deg, var(--primary-container) 0%, var(--surface-2) 100%); max-width: none; }
.sk-product-media .sk-cover { height: 240px; width: auto; aspect-ratio: 3 / 4; border-radius: var(--radius-sm); box-shadow: 0 2px 6px oklch(0.2 0.05 262 / 0.18), 0 18px 36px oklch(0.2 0.05 262 / 0.24); }
.sk-product-main .pb-h1 { margin-top: 6px; }
.sk-code { margin: 0 0 16px; padding: 0; border: 0; }
.sk-code > summary { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; cursor: pointer; color: var(--primary); font-weight: var(--fw-semibold); list-style: none; }
.sk-code > summary::-webkit-details-marker { display: none; }
.sk-code[open] > summary { margin-bottom: 4px; }
.sk-code-form { display: grid; gap: 6px; max-width: 460px; }
@media (min-width: 900px) {
  .sk-product-media { position: sticky; top: 24px; aspect-ratio: 4 / 5; }
  .sk-product-media .sk-cover { height: auto; width: 78%; }
}

/* SKLEP-POZIOM (04.10): filtr poziomu i zakresu w katalogu, etykieta poziomu. */
.sk-badge--level { background: var(--surface-2); color: var(--text-2); border: 1px solid var(--border); }

/* SKLEP-SZUKAJ (04.10): wyszukiwarka nad katalogiem. */

/* SKLEP-PROMO-HURT (04.10): promocja dla zaznaczonych produktów na liście w panelu. */
/* MOBILE-KARTY (20.10): na telefonie pasek promocji jako dwie równe kolumny,
   od 600 px jeden wiersz jak wcześniej. */
.sk-bulk { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: center; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--border); background: var(--surface-2); }
.sk-bulk-label { font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.sk-bulk-label, .sk-bulk-hint { grid-column: 1 / -1; }
.sk-bulk :is(.sk-bulk-pct, .sk-bulk-date) { width: 100%; }
.sk-bulk .btn { justify-content: center; }
/* SKLEP-KOLEJNOSC (27.10): kolejność produktów na liście - uchwyt do przeciągania i strzałki. */
.sk-ord { white-space: nowrap; width: 1%; }
.sk-ord-grip { display: inline-block; padding: 0 6px; color: var(--text-3); cursor: grab; font-size: var(--fs-lg); letter-spacing: -2px; user-select: none; }
.sk-ord-btn { width: 32px; height: 32px; margin-left: 2px; padding: 0; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface); color: var(--text-2); cursor: pointer; font-size: var(--fs-xs); }
.sk-ord-btn:hover { color: var(--primary); background: var(--primary-container); }
.sk-prod-tbl tr.is-dragging { opacity: .5; }
.sk-ord-btn[disabled] { opacity: .35; cursor: default; }
.sk-ord-form .btn[hidden] { display: none; }
@media (min-width: 600px) {
  .sk-bulk { display: flex; flex-wrap: wrap; }
  .sk-bulk .sk-bulk-pct { width: 110px; }
  .sk-bulk .sk-bulk-date { width: 170px; }
  .sk-bulk-hint { flex-basis: 100%; }
}

/* SKLEP-PODGLAD / DARMOWY / OPINIE / KUP-TEZ / STATY (04.10, migracja 0095). */
.sk-product-aside { display: grid; gap: 10px; align-content: start; min-width: 0; }
.sk-item-preview { display: inline-flex; align-items: center; gap: 4px; margin-left: auto; font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.sk-item-preview .material-symbols-outlined { font-size: var(--fs-base); color: inherit; }
@media (min-width: 900px) {
  .sk-product-aside { position: sticky; top: 24px; }
  .sk-product-aside .sk-product-media { position: static; }
}
.sk-price--free { color: var(--c-ok); }
.sk-badge--free { background: var(--c-ok-bg); color: var(--c-ok); }
.sk-pf-free { padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface-2); }
.sk-pf-hint--inline { display: block; margin-top: 2px; }
.sk-stars { display: inline-flex; gap: 1px; line-height: 1; letter-spacing: 0; }
.sk-star { color: var(--border-strong); }
.sk-star.is-on { color: var(--c-star); }
.sk-rating { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 4px; font-size: var(--fs-sm); }
.sk-rating-num { font-weight: var(--fw-semibold); }
.sk-rating-line { margin: -4px 0 12px; }
.sk-rating-link { color: inherit; text-decoration: none; }
.sk-rating-link:hover .sk-rating-num { text-decoration: underline; }
.sk-reviews { margin-top: 24px; }
.sk-reviews .pb-h2 { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 12px; margin-bottom: 12px; }
.sk-reviews-avg { font-size: var(--fs-base); font-weight: var(--fw-regular); }
.sk-review-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.sk-review { padding: 12px 14px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface); }
.sk-review-head { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; }
.sk-review-body { margin: 6px 0 0; line-height: var(--lh-base); white-space: pre-line; overflow-wrap: anywhere; }
.sk-review-box { margin-bottom: 24px; display: grid; gap: 12px; }
.sk-review-box p { margin: 0; line-height: var(--lh-base); }
.sk-review-box form { display: grid; gap: 12px; max-width: 560px; }
.sk-review-box .pb-h2 .material-symbols-outlined { color: var(--c-star); }
.sk-rate { margin: 0; border: 0; padding: 0; }
.sk-rate-stars { display: inline-flex; flex-direction: row-reverse; justify-content: flex-end; gap: 2px; }
.sk-rate-input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.sk-rate-label { display: grid; place-items: center; width: 44px; height: 44px; font-size: var(--fs-2xl); line-height: 1; color: var(--border-strong); cursor: pointer; border-radius: var(--shape-full); transition: color var(--motion-fast) var(--ease-std); }
.sk-rate-input:checked ~ .sk-rate-label, .sk-rate-label:hover, .sk-rate-label:hover ~ .sk-rate-label { color: var(--c-star); }
.sk-rate-input:focus-visible + .sk-rate-label { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 1px; }
.sk-resume { margin: 0; }
.sk-related { margin: 8px 0 28px; }
.sk-related .pb-h2 { margin-bottom: 12px; }
.sk-related-grid { display: grid; grid-template-columns: 1fr; gap: 10px; }
.sk-mini { display: flex; align-items: center; gap: 14px; padding: 12px; color: inherit; text-decoration: none; transition: transform var(--motion-std) var(--ease-std), box-shadow var(--motion-std) var(--ease-std); }
.sk-mini:hover { transform: translateY(-2px); box-shadow: var(--elev-3); }
.sk-mini:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.sk-mini-cover { flex: none; width: 54px; height: 72px; object-fit: cover; border-radius: var(--radius-sm); background: var(--surface-2); box-shadow: 0 6px 14px oklch(0.2 0.05 262 / 0.18); }
.sk-mini-cover.sk-cover--empty { display: grid; place-items: center; box-shadow: none; }
.sk-mini-cover .material-symbols-outlined { font-size: var(--fs-2xl); }
.sk-mini-body { display: grid; gap: 4px; min-width: 0; }
.sk-mini-title { font-weight: var(--fw-semibold); line-height: 1.3; overflow-wrap: anywhere; }
@media (min-width: 700px) { .sk-related-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.sk-stats { display: grid; grid-template-columns: 1fr; gap: 12px; }
.sk-stat { margin: 0; display: grid; gap: 4px; }
.sk-stat-label { display: inline-flex; align-items: center; gap: 6px; color: var(--text-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.sk-stat-label .material-symbols-outlined { font-size: var(--fs-lg); color: var(--primary); }
.sk-stat-value { font-size: var(--fs-2xl); font-variant-numeric: tabular-nums; }
.sk-stats-lists { display: grid; grid-template-columns: 1fr; gap: 12px; }
.sk-stats-lists .card { margin: 0; }
.sk-admin-actions { display: flex; flex-wrap: wrap; gap: 8px; }
@media (min-width: 700px) {
  .sk-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .sk-stats-lists { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1100px) { .sk-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* SKLEP-ROZW / SKLEP-BIBLIOTEKA (04.10, migracja 0096): biblioteka ucznia
   w panelu rodzica (parent/library.html) i przypisywanie w karcie produktu. */
.sk-lib-admin { margin-top: 16px; }
.sk-lib-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.sk-lib-list li { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; padding: 8px 12px; border: 1px solid var(--border); border-radius: var(--shape-md); }
.sk-lib-list form { margin: 0; }
.sk-lib-who { min-width: 0; overflow-wrap: anywhere; }
.sk-lib-form { display: grid; gap: 12px; max-width: 560px; }
.sk-lib-form .field { margin: 0; }
.lib-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
.lib-card { margin: 0; display: flex; gap: 16px; align-items: flex-start; }
.lib-media { flex: none; padding: 10px; border-radius: var(--shape-md); background: linear-gradient(160deg, var(--primary-container) 0%, var(--surface-2) 100%); }
.lib-cover { display: block; width: 72px; height: 96px; object-fit: cover; border-radius: var(--radius-sm); box-shadow: 0 6px 14px oklch(0.2 0.05 262 / 0.2); }
.lib-cover--empty { display: grid; place-items: center; background: var(--surface); color: var(--text-3); box-shadow: none; }
.lib-cover--empty .material-symbols-outlined { font-size: var(--fs-2xl); }
.lib-body { flex: 1; min-width: 0; display: grid; gap: 6px; }
.lib-title { margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-semibold); line-height: 1.3; }
.lib-sub { margin: 0; color: var(--text-2); font-size: var(--fs-sm); }
.lib-note { margin: 0; display: flex; gap: 6px; align-items: flex-start; padding: 8px 10px; border-radius: var(--shape-sm, var(--radius-sm)); background: var(--surface-2); font-size: var(--fs-sm); }
.lib-note .material-symbols-outlined { font-size: var(--fs-lg); color: var(--primary); }
.lib-body .dim-12 { margin: 0; }
.lib-files { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.lib-empty { display: grid; justify-items: center; gap: 8px; padding: 32px 20px; text-align: center; }
.lib-empty > .material-symbols-outlined { width: 56px; height: 56px; margin: 0 auto 6px; border-radius: var(--shape-lg); display: grid; place-items: center; background: var(--g-blue); color: #fff; box-shadow: var(--shadow-tile); font-size: var(--fs-3xl); }
.lib-empty .card-h, .lib-empty p { margin: 0; max-width: 460px; }
@media (min-width: 900px) { .lib-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* SKLEP-OMNIBUS (04.10): najniższa cena z 30 dni przed obniżką. */
.sk-lowest { display: block; color: var(--text-3); font-size: var(--fs-xs); line-height: var(--lh-base); }
.sk-lowest-line { margin: -6px 0 12px; }

/* SKLEP-ANUL (05.10): notatka i anulowanie zamówienia w panelu, kontakt u klienta. */
.sk-note-text { white-space: pre-line; overflow-wrap: anywhere; }
.sk-cancel-box .card-h { margin-bottom: 6px; }
.sk-cancel-box .dim-12 { margin: 0 0 12px; line-height: var(--lh-base); max-width: 760px; }
.sk-help { margin: 4px 0 0; }

/* SKLEP-SPIS (05.10): spis treści na stronie produktu. */
.sk-toc-item { display: flex; gap: 8px; line-height: var(--lh-base); }
.sk-toc-item--sub { padding-left: 22px; color: var(--text-2); font-size: var(--fs-sm); }
.sk-toc-no { flex: none; color: var(--primary); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }

/* SKLEP-KOSZYK (05.10): koszyk na kilka materiałów. */
.sk-cart-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; margin: 0 0 14px; }
.sk-cart-head { margin-bottom: 14px; }
.sk-cart-note { flex-basis: 100%; }
.sk-cart-in { display: flex; align-items: center; gap: 6px; margin: 0; color: var(--c-ok); font-weight: var(--fw-semibold); }
.sk-cart { margin-bottom: 18px; }
.sk-cart-list { list-style: none; margin: 0 0 14px; padding: 0; display: grid; gap: 10px; }
.sk-cart-row { display: flex; align-items: flex-start; gap: 12px; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--shape-md); }
.sk-cart-media { flex: none; display: block; }
.sk-cart-cover { display: block; width: 54px; height: 72px; object-fit: cover; border-radius: var(--radius-sm); background: var(--surface-2); }
.sk-cart-cover.sk-cover--empty { display: grid; place-items: center; }
.sk-cart-cover .material-symbols-outlined { font-size: var(--fs-2xl); }
.sk-cart-body { flex: 1; min-width: 0; display: grid; gap: 4px; }
.sk-cart-title { font-weight: var(--fw-semibold); color: inherit; text-decoration: none; overflow-wrap: anywhere; }
.sk-cart-title:hover { text-decoration: underline; }
.sk-cart-side { flex: none; display: grid; gap: 4px; justify-items: end; text-align: right; }
.sk-cart-side form { margin: 0; }
.sk-cart-remove { min-height: 32px; padding: 0; border: 0; background: none; color: var(--text-3); font: inherit; font-size: var(--fs-sm); cursor: pointer; text-decoration: underline; }
.sk-cart-remove:hover { color: var(--c-rej); }
.sk-cart-sum { display: grid; gap: 4px; padding-top: 12px; border-top: 1px solid var(--border); }
.sk-cart-line { display: flex; justify-content: space-between; gap: 12px; margin: 0; font-variant-numeric: tabular-nums; }
.sk-cart-line--cut { color: var(--c-rej); }
.sk-cart-line--total { padding-top: 6px; font-size: var(--fs-lg); }
.sk-cart-sum .sk-saving { margin: 2px 0 0; font-size: var(--fs-sm); }
.sk-order-items { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 4px; }
.sk-order-items li { display: flex; gap: 8px; flex-wrap: wrap; }

/* SKLEP-BIBLIOTEKA (05.10): materiał dla wielu uczniów, pliki w karcie ucznia. */
.sk-lib-many { margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border); }
.sk-lib-many .card-h { margin: 0; }
.sk-lib-many .sk-pf-hint { margin: 0; }
.sk-lib-files { display: inline-flex; flex-wrap: wrap; gap: 6px; margin-left: 4px; }

/* SKLEP-RABAT-ILOSC (05.10): podpowiedź progu rabatu w koszyku. */
.sk-cart-hint { display: flex; align-items: flex-start; gap: 6px; margin: 8px 0 0; padding: 8px 10px; border-radius: var(--radius-sm); background: var(--primary-container); color: var(--primary); font-size: var(--fs-sm); line-height: var(--lh-base); }
.sk-cart-hint .material-symbols-outlined { font-size: var(--fs-lg); }

/* SKLEP-ELEKTRONICZNY (05.10): informacja, że produkt jest elektroniczny i bez zwrotu. */
.sk-digital-note { display: flex; align-items: flex-start; gap: 8px; margin: 0 0 14px; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-sm); line-height: var(--lh-base); }
.sk-digital-note .material-symbols-outlined { flex: none; font-size: var(--fs-lg); color: var(--primary); }
.sk-digital-note a { color: var(--primary); }

/* KURS-1 (05.10): kursy online - program w panelu, strefa kursanta, odtwarzacz. */
.kr-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.kr-sections { display: grid; gap: 14px; padding: 14px 16px; }
.kr-section { padding: 12px 14px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface-2); }
.kr-section-head { display: flex; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.kr-section-title { margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-semibold); }
.kr-section-actions, .kr-lesson-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: flex-start; }
.kr-section-actions form, .kr-lesson-actions form { margin: 0; }
.kr-section-intro { margin: 6px 0 0; color: var(--text-2); font-size: var(--fs-sm); }
.kr-lessons { margin: 10px 0 0; padding-left: 20px; display: grid; gap: 8px; }
.kr-lesson { display: flex; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.kr-lesson-main { min-width: 0; display: grid; gap: 2px; }
.kr-lesson-meta { display: block; }
.kr-edit { min-width: 0; }
.kr-edit > summary { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; list-style: none; }
.kr-edit > summary::-webkit-details-marker { display: none; }
.kr-form { display: grid; gap: 10px; max-width: 560px; margin: 10px 0 0; padding: 12px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface); }
.kr-form .field { margin: 0; }
.kr-files { list-style: none; margin: 10px 0 0; padding: 0; display: grid; gap: 6px; }
.kr-files li { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--shape-md); }
.kr-files form { margin: 0; }
.kr-files--learner { margin-top: 0; }
.kr-empty { padding: 14px 16px; }
.kr-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
.kr-card { margin: 0; display: grid; gap: 8px; align-content: start; }
.kr-card-title { margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-semibold); }
.kr-card-title a { color: inherit; text-decoration: none; }
.kr-card-title a:hover { text-decoration: underline; }
.kr-card-sub { margin: 0; color: var(--text-2); font-size: var(--fs-sm); }
.kr-card .btn { justify-self: start; }
.kr-progress { display: grid; gap: 4px; }
.kr-progress-bar { height: 10px; border-radius: var(--shape-full); background: var(--surface-2); overflow: hidden; }
.kr-progress-fill { display: block; height: 100%; border-radius: var(--shape-full); background: var(--primary); transition: width var(--motion-std) var(--ease-std); }
.kr-progress-label { color: var(--text-2); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.kr-expired { margin: 0; color: var(--c-rej); font-size: var(--fs-sm); }
.kr-head-card { display: grid; gap: 12px; }
.kr-head-card .btn { justify-self: start; }
.kr-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.kr-plan { list-style: none; margin: 0; padding: 0; display: grid; gap: 14px; }
.kr-plan-title { margin: 0 0 4px; font-size: var(--fs-base); font-weight: var(--fw-semibold); }
.kr-plan-intro { margin: 0 0 6px; color: var(--text-2); font-size: var(--fs-sm); }
.kr-plan-lessons { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.kr-plan-lesson { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding: 6px 8px; border-radius: var(--radius-sm); }
.kr-plan-lesson.is-current { background: var(--primary-container); }
.kr-plan-lesson.is-done a, .kr-plan-lesson.is-done span { color: var(--text-2); }
.kr-plan-mark { display: inline-flex; color: var(--border-strong); }
.kr-plan-lesson.is-done .kr-plan-mark { color: var(--c-ok); }
.kr-plan-mark .material-symbols-outlined { font-size: var(--fs-lg); }
.kr-lesson-layout { display: grid; grid-template-columns: 1fr; gap: 16px; align-items: start; }
.kr-lesson-main-col { display: grid; gap: 12px; min-width: 0; }
.kr-player { position: relative; width: 100%; aspect-ratio: 16 / 9; border-radius: var(--shape-md); overflow: hidden; background: var(--brand-ink, var(--surface-2)); }
.kr-player iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.kr-novideo { display: flex; align-items: center; gap: 8px; margin: 0; color: var(--text-2); }
.kr-body { margin: 0; display: grid; gap: 10px; }
.kr-body p { margin: 0; line-height: var(--lh-base); }
.kr-nav { margin: 0; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; }
.kr-nav-form { margin: 0; }
.kr-nav-links { display: flex; flex-wrap: wrap; gap: 8px; }
.kr-side { min-width: 0; }
.kr-side-card { margin: 0; display: grid; gap: 12px; }
@media (min-width: 700px) { .kr-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 900px) {
  .kr-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .kr-lesson-layout { grid-template-columns: minmax(0, 1fr) 320px; }
  .kr-side-card { position: sticky; top: 76px; }
}

/* KURS-1: program kursu na stronie produktu w sklepie. */
.sk-course-plan { margin: 0 0 18px; }
.sk-course-plan .pb-h2 { margin-bottom: 10px; }
.sk-plan { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
.sk-plan-title { margin: 0 0 4px; font-size: var(--fs-base); font-weight: var(--fw-semibold); }
.sk-plan-intro { margin: 0 0 6px; color: var(--text-2); font-size: var(--fs-sm); }
.sk-plan-lessons { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.sk-plan-lessons li { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; line-height: var(--lh-base); }
.sk-plan-lessons .material-symbols-outlined { font-size: var(--fs-lg); color: var(--primary); }

/* KURS-1: link do kursu na stronie zamówienia. */
.sk-order-courses { display: grid; gap: 10px; }
.sk-order-courses p { margin: 0; line-height: var(--lh-base); }

/* KURS-3 (05.10): quizy w panelu i u kursanta + dopracowanie wizualne kursów.
   Hero kursu w barwach marki jak sklep (SKLEP-KV), pierścień postępu jak
   w planie nauki (`data-ring` ustawia core.js, bez inline style). */
.kr-quiz-admin { margin: 10px 0 0; padding: 10px 12px; border: 1px dashed var(--border-strong); border-radius: var(--shape-md); background: var(--surface); }
.kr-quiz-h { margin: 0 0 8px; font-size: var(--fs-base); font-weight: var(--fw-semibold); }
.kr-questions { margin: 10px 0; padding-left: 20px; display: grid; gap: 10px; }
.kr-questions > li { display: grid; gap: 4px; }
.kr-questions form { margin: 0; }
.kr-answers { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
.kr-answers li { display: flex; align-items: center; gap: 4px; color: var(--text-2); font-size: var(--fs-sm); }
.kr-answers li.is-correct { color: var(--c-ok); font-weight: var(--fw-semibold); }
.kr-answers .material-symbols-outlined { font-size: var(--fs-base); }
.kr-quiz { margin: 0; display: grid; gap: 12px; }
.kr-quiz-head { display: flex; align-items: baseline; justify-content: space-between; flex-wrap: wrap; gap: 4px 12px; }
.kr-quiz-head .card-h { margin: 0; display: flex; align-items: center; gap: 6px; }
.kr-quiz-head .material-symbols-outlined { color: var(--primary); }
.kr-quiz-intro { margin: 0; color: var(--text-2); line-height: var(--lh-base); }
.kr-quiz-form, .kr-quiz-list { display: grid; gap: 14px; }
.kr-quiz-list { list-style: none; margin: 0; padding: 0; counter-reset: krq; }
.kr-quiz-item { counter-increment: krq; }
.kr-quiz-field { margin: 0; border: 0; padding: 0; display: grid; gap: 6px; }
.kr-quiz-q { margin: 0; font-weight: var(--fw-semibold); line-height: var(--lh-base); }
.kr-quiz-list .kr-quiz-q::before { content: counter(krq) ". "; color: var(--primary); }
.kr-opt { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--shape-md); cursor: pointer; transition: border-color var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std); }
.kr-opt:hover { border-color: var(--primary); background: var(--primary-container); }
.kr-opt input { margin-top: 2px; flex: none; }
.kr-opt:focus-within { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.kr-quiz-score { display: flex; align-items: center; gap: 14px; padding: 14px 16px; border-radius: var(--shape-md); background: var(--surface-2); }
.kr-quiz-score.is-pass { background: var(--c-ok-bg); }
.kr-quiz-score.is-fail { background: var(--c-prog-bg); }
.kr-quiz-score-num { font-size: var(--fs-3xl); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.kr-quiz-score.is-pass .kr-quiz-score-num { color: var(--c-ok); }
.kr-quiz-score-text { display: grid; gap: 2px; font-size: var(--fs-sm); color: var(--text-2); }
.kr-quiz-score-text strong { font-size: var(--fs-base); color: var(--text); }
.kr-quiz-review { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
.kr-quiz-review .kr-quiz-item { padding: 12px 14px; border: 1px solid var(--border); border-radius: var(--shape-md); }
.kr-quiz-review .kr-quiz-item.is-ok { border-color: var(--c-ok); }
.kr-quiz-review .kr-quiz-item.is-bad { border-color: var(--c-rej); }
.kr-quiz-review .kr-quiz-q { display: flex; align-items: flex-start; gap: 6px; }
.kr-quiz-review .is-ok .kr-quiz-q .material-symbols-outlined { color: var(--c-ok); }
.kr-quiz-review .is-bad .kr-quiz-q .material-symbols-outlined { color: var(--c-rej); }
.kr-quiz-answers { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 4px; }
.kr-quiz-answers li { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding: 6px 8px; border-radius: var(--radius-sm); color: var(--text-2); font-size: var(--fs-sm); }
.kr-quiz-answers li.is-correct { background: var(--c-ok-bg); color: var(--c-ok); font-weight: var(--fw-semibold); }
.kr-quiz-answers li.is-wrong { background: var(--c-rej-bg); color: var(--c-rej); }
.kr-tag { padding: 1px 8px; border-radius: var(--shape-full); background: var(--surface-2); color: var(--text-3); font-size: var(--fs-xs); font-weight: var(--fw-regular); }
.kr-tag--ok { background: var(--c-ok); color: #fff; }
.kr-quiz-why { display: flex; align-items: flex-start; gap: 6px; margin: 8px 0 0; padding: 8px 10px; border-radius: var(--radius-sm); background: var(--surface-2); font-size: var(--fs-sm); line-height: var(--lh-base); }
.kr-quiz-why .material-symbols-outlined { font-size: var(--fs-lg); color: var(--c-star); }
.kr-quiz-best { margin: 0; color: var(--text-2); font-size: var(--fs-sm); }
.kr-quiz-best.is-pass { color: var(--c-ok); }
.kr-lock-note { display: inline-flex; align-items: center; gap: 6px; color: var(--text-3); font-size: var(--fs-sm); }
.kr-plan-section.is-locked .kr-plan-title { color: var(--text-3); }
.kr-plan-lock { font-size: var(--fs-base); vertical-align: -2px; }
.kr-hero { position: relative; overflow: hidden; display: grid; gap: 16px; padding: 22px 20px; border-radius: var(--shape-lg); background: var(--g-panel); box-shadow: var(--shadow-panel); color: #fff; }
.kr-hero.is-finished { background: linear-gradient(135deg, oklch(0.52 0.15 150) 0%, oklch(0.38 0.13 190) 60%, var(--brand-ink) 100%); }
.kr-hero-glow { position: absolute; inset: auto -40px -60px auto; width: 220px; height: 220px; border-radius: 50%; background: radial-gradient(circle, rgba(255, 255, 255, .18), transparent 70%); pointer-events: none; }
.kr-hero-cover { position: relative; width: 96px; height: 128px; object-fit: cover; border-radius: var(--radius-sm); box-shadow: 0 10px 28px oklch(0.2 0.05 262 / 0.45); }
.kr-hero-body { position: relative; min-width: 0; display: grid; gap: 8px; align-content: start; }
.kr-hero-eyebrow { display: inline-flex; align-self: start; padding: 3px 12px; border-radius: var(--shape-full); background: rgba(255, 255, 255, .16); font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: .04em; }
.kr-hero-title { margin: 0; font-size: var(--fs-2xl); line-height: 1.15; font-weight: var(--fw-bold); letter-spacing: -0.02em; }
.kr-hero-lead { margin: 0; max-width: 60ch; color: rgba(255, 255, 255, .88); line-height: var(--lh-base); }
.kr-hero-facts { list-style: none; margin: 2px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px 8px; }
.kr-hero-facts li { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: var(--shape-full); background: rgba(255, 255, 255, .12); font-size: var(--fs-sm); }
.kr-hero-facts .material-symbols-outlined { font-size: var(--fs-base); color: oklch(0.90 0.06 230); }
.kr-hero-cta { justify-self: start; margin-top: 4px; }
.kr-hero-done { display: flex; align-items: center; gap: 6px; margin: 4px 0 0; font-weight: var(--fw-semibold); }
.kr-hero-ring { --p: 0; position: relative; justify-self: start; flex: none; width: 92px; height: 92px; border-radius: 50%; display: grid; place-items: center; align-content: center; background: conic-gradient(oklch(0.90 0.06 230) calc(var(--p) * 1%), rgba(255, 255, 255, .18) 0); }
.kr-hero-ring::before { content: ""; position: absolute; inset: 9px; border-radius: 50%; background: linear-gradient(135deg, oklch(0.33 0.14 262), var(--brand-ink)); }
.kr-hero.is-finished .kr-hero-ring::before { background: linear-gradient(135deg, oklch(0.36 0.12 165), var(--brand-ink)); }
.kr-hero-ring b { position: relative; font-size: var(--fs-lg); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.kr-hero-ring .dim-12 { position: relative; color: rgba(255, 255, 255, .75); }
.kr-card-top { display: flex; align-items: flex-start; gap: 12px; }
.kr-card-cover { flex: none; width: 60px; height: 80px; object-fit: cover; border-radius: var(--radius-sm); background: var(--surface-2); box-shadow: 0 6px 14px oklch(0.2 0.05 262 / 0.18); }
.kr-card-cover--empty { display: grid; place-items: center; color: var(--text-3); box-shadow: none; }
.kr-card-cover--empty .material-symbols-outlined { font-size: var(--fs-2xl); }
.kr-card-head { flex: 1; min-width: 0; display: grid; gap: 2px; }
.kr-card-head .dim-12 { margin: 0; }
.kr-card-ring { --p: 0; position: relative; flex: none; width: 52px; height: 52px; border-radius: 50%; display: grid; place-items: center; background: conic-gradient(var(--primary) calc(var(--p) * 1%), var(--surface-3, var(--surface-2)) 0); }
.kr-card-ring::before { content: ""; position: absolute; inset: 6px; border-radius: 50%; background: var(--surface); }
.kr-card-ring b { position: relative; font-size: var(--fs-xs); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.kr-card.is-finished { border-color: var(--c-ok); }
.kr-card.is-finished .kr-card-ring { background: conic-gradient(var(--c-ok) calc(var(--p) * 1%), var(--surface-3, var(--surface-2)) 0); }
.kr-card.is-expired { opacity: .85; }
.kr-plan-lesson a { text-decoration: none; }
.kr-plan-lesson a:hover { text-decoration: underline; }
.kr-plan-lesson.is-current { box-shadow: inset 3px 0 0 var(--primary); }
@media (min-width: 700px) {
  .kr-hero { grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; padding: 26px 28px; }
  .kr-hero-ring { justify-self: end; width: 104px; height: 104px; }
}

/* KURS-POWTORKA / KURS-CERT (05.10): znacznik lekcji stawia kursant
   (ukończona / do powtórki), a po ukończeniu kursu pobiera certyfikat.
   Decyzja właściciela: nie pilnujemy obejrzenia filmu, więc przyciski muszą
   czytać się jak wybór, nie jak wymóg. */
.kr-state-now { display: flex; align-items: center; gap: 6px; margin: 0 0 8px; color: var(--c-ok); font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.kr-state-now.is-review { color: var(--c-prog); }
.kr-state-now .material-symbols-outlined { font-size: var(--fs-lg); }
.kr-state-btns { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.kr-plan-lesson.is-review .kr-plan-mark { color: var(--c-prog); }
.kr-review .card-h { display: flex; align-items: center; gap: 8px; }
.kr-review-list { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 6px; }
.kr-review-list li { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; padding: 6px 8px; border-radius: var(--radius-sm); background: var(--surface-2); }
.kr-card-btns { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

/* KURS-QUIZ-WYNIKI (05.10): wyniki quizów w programie kursu. Zwinięte
   w <details>, bo przy kilkunastu lekcjach rozwinięte tabele zjadłyby stronę. */
.kr-quiz-res { margin: 10px 0; padding: 10px 12px; border-radius: var(--radius-sm); background: var(--surface-2); }
.kr-quiz-res > summary { display: flex; align-items: center; gap: 6px; cursor: pointer; font-weight: var(--fw-medium); font-size: var(--fs-sm); }
.kr-quiz-res > summary .material-symbols-outlined { font-size: var(--fs-lg); }
.kr-quiz-res-warn { display: flex; align-items: flex-start; gap: 6px; margin: 8px 0; color: var(--c-prog); font-size: var(--fs-sm); }
.kr-quiz-res-warn .material-symbols-outlined { font-size: var(--fs-lg); flex-shrink: 0; }

/* ═══ TABELE-KV (08.10, zgłoszenie właściciela: „tabele wyglądają średnio,
   na telefonie kiepsko") ═══════════════════════════════════════════════
   Jeden wygląd tabel danych niezależnie od klasy (.leads, .pz-tbl, .pz-tbl-12,
   .tbl): nagłówek jako etykieta, równe odstępy, cienkie linie, hover wiersza,
   cyfry tabelaryczne, wiersz sumy na tle. Odstępy komórek nie są już
   ustawiane klasami pomocniczymi w szablonach. Na telefonie (<= 900 px)
   tabele oznaczone przez core.js klasą .tbl-m stają się listą kart
   „etykieta: wartość" (etykiety z <th>; tytuł karty to komórka z
   data-card-title albo pierwsza, checkbox zaznaczania idzie w róg).
   Bez .tbl-m zostają tabele z data-no-cards i listy z kolumną .who-td (leady, próbne, współprace -
   zwarty wiersz z szufladą). Bez JS działa stary fallback: przewijanie. */
@layer components {
  :is(table.leads, .pz-tbl, .pz-tbl-12, table.tbl) { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
  :is(.pz-tbl, .pz-tbl-12, table.tbl) th {
    text-align: left; padding: 10px 14px; white-space: nowrap;
    background: var(--surface-1); border-bottom: 1px solid var(--outline-variant);
    font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--text-3);
    text-transform: uppercase; letter-spacing: .08em;
  }
  :is(.pz-tbl, .pz-tbl-12, table.tbl) td { padding: 11px 14px; border-bottom: 1px solid var(--outline-variant); vertical-align: middle; }
  :is(.pz-tbl, .pz-tbl-12, table.tbl) :is(th, td):first-child { padding-left: 18px; }
  :is(.pz-tbl, .pz-tbl-12, table.tbl) :is(th, td):last-child { padding-right: 18px; }
  :is(table.leads, .pz-tbl, .pz-tbl-12, table.tbl) > tbody > tr:last-child > td { border-bottom: none; }
  :is(table.leads, .pz-tbl, .pz-tbl-12, table.tbl) > tbody > tr:hover > td { background: var(--state-hover); }
  :is(table.leads, .pz-tbl, .pz-tbl-12, table.tbl) > tfoot > tr > td { background: var(--surface-2); font-weight: var(--fw-semibold); border-top: 1px solid var(--outline-variant); border-bottom: none; }
  /* Tabela w karcie: bez drugiej ramki i cienia (karta w karcie wyglądała ciężko). */
  .card .tbl-wrap { box-shadow: none; }
}
@layer utilities {
  @media (max-width: 900px) {
    table.tbl-m, table.tbl-m > tbody, table.tbl-m > tfoot,
    table.tbl-m tr, table.tbl-m tr.row, table.tbl-m td { display: block; width: auto; min-width: 0; max-width: 100%; }
    table.tbl-m { white-space: normal; overflow: visible; }
    table.tbl-m > thead { display: none; }
    table.tbl-m tr, table.tbl-m tr.row { padding: 12px 16px; border: none; border-bottom: 1px solid var(--outline-variant); }
    table.tbl-m > tbody > tr:last-child { border-bottom: none; }
    table.tbl-m > tfoot > tr, table.tbl-m tr.pz-bt-2-bg { background: var(--surface-2); border-top: 1px solid var(--outline-variant); }
    /* MOBILE-KARTY (20.10, „tekst się wylewa, zlewa"): wartości dosunięte do prawej,
       etykieta odpycha je marginesem - kilka odznak w komórce stoi razem, a nie
       rozrzucone po szerokości karty. */
    table.tbl-m td, table.tbl-m tr.row > td {
      display: flex; justify-content: flex-end; align-items: center; gap: 12px;
      padding: 3px 0; border: none; background: none; text-align: right;
      white-space: normal; overflow-wrap: anywhere;
    }
    table.tbl-m td::before {
      content: attr(data-label); flex: 0 0 auto; max-width: 48%; text-align: left; margin-right: auto;
      color: var(--text-3); font-size: var(--fs-sm); font-weight: var(--fw-medium); overflow-wrap: normal;
    }
    /* SKLEP-KOLEJNOSC (po review): komórka z uchwytem i strzałkami jako zwykły wiersz karty (reguła .sk-ord
       { width: 1% } spoza warstwy wygrywała i ściskała ją do 3 px), a ukryta kolumna naprawdę ukryta mimo flex. */
    table.tbl-m.sk-prod-tbl td.sk-ord { width: auto; }
    table.tbl-m td[data-ord-col][hidden] { display: none; }
    /* Tytuł karty: komórka z data-card-title albo pierwsza (core.js: .tbl-m-title). */
    /* Tytuł jako blok: nazwa i linia pod nią (adres, e-mail) jedna pod drugą,
       a nie obok siebie w wąskich kolumnach. */
    table.tbl-m tr > td.tbl-m-title { display: block; text-align: left; font-weight: var(--fw-semibold); padding-bottom: 6px; padding-right: 36px; }
    table.tbl-m tr { position: relative; }
    table.tbl-m td.tbl-m-check { position: absolute; top: 10px; right: 12px; padding: 0; }
    table.tbl-m td.tbl-m-title::before, table.tbl-m td.tbl-m-check::before,
    table.tbl-m td[data-label=""]::before, table.tbl-m td.tbl-m-full::before { content: none; }
    table.tbl-m td[data-label=""]:not(.tbl-m-title):not(.tbl-m-check) { justify-content: flex-end; padding-top: 6px; }
    table.tbl-m tr > td.tbl-m-full { display: block; text-align: left; font-weight: var(--fw-regular); color: var(--text-3); }
    /* `tr > td` w selektorach tytułu, pełnej szerokości i .hide-mobile: inaczej
       przegrywały z `table.tbl-m tr.row > td` (display: flex) - tytuł był ściśnięty
       w wiersz, a kolumny .hide-mobile widoczne (MOBILE-HIDE, 20.10: kolumny
       potrzebne na telefonie - termin próbnej, plik produktu, dokument zamówienia -
       straciły tę klasę, reszta znów się chowa). */
    table.tbl-m .hide-mobile, table.tbl-m tr > td.hide-mobile { display: none; }
    /* Lista produktów sklepu (panel): okładka z lewej, nazwa i dane obok
       (wcześniej okładka lądowała pod checkboxem w rogu, a adres /sklep/...
       łamał się na pięć linii). */
    table.tbl-m.sk-prod-tbl > tbody > tr.row { padding-left: 80px; min-height: 96px; }
    table.tbl-m.sk-prod-tbl td.sk-prod-cover { position: absolute; left: 16px; top: 14px; padding: 0; }
    table.tbl-m.sk-prod-tbl td.sk-prod-cover::before { content: none; }
    table.tbl-m.sk-prod-tbl .sk-prod-lvl::after { content: none; }
    table.tbl-m.sk-prod-tbl .sk-prod-slug { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; overflow-wrap: normal; }
    table.tbl-m td > :is(select, .select, .input) { width: auto; max-width: 60%; }
    table.tbl-m > tbody > tr:hover > td { background: none; }
  }
}

/* ═══ WYCIEKI (08.10, zgłoszenie właściciela „w wielu miejscach są wycieki") ═══
   Znalezione skanerem: element wystający poza kartę albo tekst na jej krawędzi,
   na desktopie (1280, 1024) i telefonie (390). */
@layer components {
  /* Pole w wierszu flex miało min-width: auto = szerokość wewnętrzna (w Firefoksie
     większa niż w Chromium) i wypychało przycisk obok poza kartę (reset hasła). */
  .input, .select, .textarea { min-width: 0; }
  /* Pasek kalendarza przy ~1024 px wystawał o 2 px poza kartę. */
  #calendar .fc-toolbar { flex-wrap: wrap; gap: 8px; }
}

/* SKLEP-ZAMKNIJ (08.10): pasek podglądu zamkniętego sklepu dla admina i recepcji. */
@layer components {
  .sk-preview-bar { display: flex; align-items: center; gap: 8px; margin: 0 0 14px; border-radius: var(--shape-md); font-size: var(--fs-sm); }
}

/* UI-EMOJI (08.10): wybór koloru notatki u korepetytora jako kółka (jak
   karteczki w profilu) - radio ukryte dla oka, zaznaczenie i fokus na kółku. */
@layer components {
  label.sticky-swatch:has(input:checked) { border-color: var(--text); transform: scale(1.1); }
  label.sticky-swatch:has(input:focus-visible) { outline: 2px solid var(--primary); outline-offset: 2px; }
  .resource-ico .material-symbols-outlined { font-size: var(--fs-xl); color: var(--primary); }
  .attach-ico .material-symbols-outlined, .parent-material-file > .material-symbols-outlined { font-size: var(--fs-xl); color: var(--text-2); }
}

/* SKLEP-KV-3 (12.10): sklep w identyfikacji strony szkoły (wygląd jak /cennik na
   korepetycjesolve.com): białe karty z dużym zaokrągleniem i miękkim cieniem, wyraźna
   hierarchia tytuł > cena > przycisk, środek tam, gdzie pomaga (kafelki, puste stany,
   nagłówki sekcji). Tylko warstwa wizualna - adresy, formularze i ramka bez zmian.
   PALETA SKLEPU: jedyne miejsce do zmiany kolorów. Tokeny panelu niżej są na nią
   przepięte, więc wspólne komponenty (przyciski, chipy, pola) biorą te same barwy. */
html.sk-kv {
  /* Kolory: tokens.css, sekcja „PALETA SKLEPU". Tu kształt i ruch. */
  --sk-radius:         18px;
  --sk-radius-sm:      12px;
  --sk-shadow:         0 1px 2px rgba(15, 27, 45, .04), 0 8px 24px rgba(10, 98, 199, .08);
  --sk-shadow-hover:   0 2px 6px rgba(15, 27, 45, .06), 0 18px 40px rgba(10, 98, 199, .16);
  --sk-motion:         240ms;
  --sk-ease:           cubic-bezier(.2, 0, 0, 1);

  --primary: var(--sk-primary);
  --primary-hover: var(--sk-primary-hover);
  --primary-container: var(--sk-primary-soft);
  --accent-cyan: var(--sk-accent);
  --c-ok: var(--sk-success);
  --c-ok-bg: var(--sk-success-soft);
  --bg: var(--sk-bg);
  --surface: var(--sk-card);
  --border: var(--sk-line);
  color-scheme: light;
}
html.sk-kv .pb-body { background: var(--sk-bg); }
html.sk-kv.pb-embedded .pb-body { background: transparent; }
html.sk-kv .btn { min-height: 44px; border-radius: var(--shape-full); font-weight: var(--fw-semibold); transition: background var(--sk-motion) var(--sk-ease), box-shadow var(--sk-motion) var(--sk-ease), color var(--sk-motion) var(--sk-ease); }
html.sk-kv .btn.accent { background: var(--sk-primary); border-color: var(--sk-primary); color: #fff; box-shadow: 0 6px 16px -6px rgba(10, 98, 199, .55); }
html.sk-kv .btn.accent:hover { background: var(--sk-primary-hover); border-color: var(--sk-primary-hover); }
html.sk-kv .btn.tonal { background: var(--sk-primary-soft); border-color: transparent; color: var(--sk-primary); }
html.sk-kv .btn.tonal:hover { background: var(--sk-primary-soft-hover); }
html.sk-kv .pb-top-nav a { color: var(--text-2); }
html.sk-kv .pb-top-nav a:hover { color: var(--sk-primary); }
/* SKLEP-KOSZYK-WIDOCZNY (15.10): w nagłówku koszyk to wypełniony przycisk z napisem także na telefonie. */

/* Hero: kobalt → cyjan jak na stronie szkoły, treść na środku. */
html.sk-kv .sk-hero { border-radius: var(--sk-radius); background: linear-gradient(135deg, var(--sk-primary) 0%, var(--sk-primary-deep) 55%, var(--sk-accent-deep) 100%); text-align: center; }
html.sk-kv .sk-hero-title, html.sk-kv .sk-hero-lead { margin-left: auto; margin-right: auto; }
html.sk-kv .sk-hero-chips { justify-content: center; }
html.sk-kv .sk-hero-chips .material-symbols-outlined, html.sk-kv .sk-hero-title strong { color: var(--sk-accent-light); }
html.sk-kv .sk-hero-dot { background: var(--sk-accent); }

/* Karty: wspólny wygląd kafelków, paneli, pustych stanów i ramek informacyjnych. */
html.sk-kv .sk-card, html.sk-kv .pb-panel, html.sk-kv .sk-mini, html.sk-kv .pb-empty {
  background: var(--sk-card); border: 1px solid var(--sk-line); border-radius: var(--sk-radius); box-shadow: var(--sk-shadow);
}
html.sk-kv .pb-empty { border-style: solid; padding: 40px 20px; }
html.sk-kv .pb-empty-ico { background: linear-gradient(135deg, var(--sk-primary), var(--sk-accent)); border-radius: var(--shape-lg); }
html.sk-kv .pb-panel { padding: 20px; }
html.sk-kv .sk-card { transition: transform var(--sk-motion) var(--sk-ease), box-shadow var(--sk-motion) var(--sk-ease), border-color var(--sk-motion) var(--sk-ease); }
html.sk-kv .sk-card:hover, html.sk-kv .sk-mini:hover { transform: translateY(-4px); box-shadow: var(--sk-shadow-hover); border-color: var(--sk-primary-line); }
html.sk-kv .sk-card-media { background: linear-gradient(160deg, var(--sk-primary-soft) 0%, var(--sk-accent-soft) 100%); }
html.sk-kv .sk-card-body { text-align: center; align-items: center; padding: 18px 18px 8px; gap: 8px; }
html.sk-kv .sk-card-title { font-size: var(--fs-lg); font-weight: var(--fw-bold); letter-spacing: -0.015em; }
html.sk-kv .sk-card-foot { flex-direction: column; align-items: stretch; gap: 10px; width: 100%; padding-top: 6px; }
html.sk-kv .sk-card-foot .sk-price-wrap { justify-content: center; }
html.sk-kv .sk-card-cta { width: 100%; }
html.sk-kv .sk-card-more { display: inline-flex; align-items: center; justify-content: center; gap: 4px; min-height: 32px; color: var(--sk-primary); font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
html.sk-kv .sk-card-more .material-symbols-outlined { font-size: var(--fs-xl); transition: transform var(--sk-motion) var(--sk-ease); }
html.sk-kv .sk-card:hover .sk-card-more .material-symbols-outlined { transform: translateX(3px); }
html.sk-kv .sk-card-media { height: 210px; }
html.sk-kv .sk-card-media .sk-cover { height: 170px; }
@media (min-width: 600px) { html.sk-kv .sk-card-media { height: 240px; } html.sk-kv .sk-card-media .sk-cover { height: 200px; } }
html.sk-kv .sk-card-cart { padding: 0 18px 18px; }
html.sk-kv .sk-card .sk-lowest { text-align: center; }
html.sk-kv .sk-badges { justify-content: center; }
html.sk-kv .sk-product-main .sk-badges { justify-content: flex-start; }

/* Ceny i plakietki: cena wyraźna, promocja na żółtym, stara cena obok przekreślona. */
html.sk-kv .sk-price-wrap { display: inline-flex; align-items: baseline; flex-wrap: wrap; gap: 4px 8px; }
html.sk-kv .sk-price { font-size: var(--fs-xl); font-weight: var(--fw-black); color: var(--text); letter-spacing: -0.02em; }
html.sk-kv .sk-price--big { font-size: var(--fs-3xl); }
html.sk-kv .sk-price--promo { color: var(--sk-primary); }
html.sk-kv .sk-price--free { color: var(--sk-success); }
html.sk-kv .sk-price-old { color: var(--text-3); text-decoration-color: var(--sk-highlight); text-decoration-thickness: 2px; }
html.sk-kv .sk-badge { padding: 3px 10px; font-weight: var(--fw-bold); background: var(--sk-primary-soft); color: var(--sk-primary); }
html.sk-kv .sk-badge--promo { background: var(--sk-highlight); color: var(--sk-highlight-ink); }
html.sk-kv .sk-badge--free { background: var(--sk-success-soft); color: var(--sk-success); }
html.sk-kv .sk-badge--level { background: var(--sk-bg); color: var(--text-2); border-color: var(--sk-line); }
html.sk-kv .sk-promo-until { color: var(--sk-highlight-ink); background: var(--sk-highlight-soft); padding: 2px 8px; border-radius: var(--shape-full); font-size: var(--fs-xs); font-weight: var(--fw-semibold); }

/* Ramki informacyjne i nagłówki sekcji. */
html.sk-kv .sk-digital-note { background: var(--sk-accent-soft); border-color: transparent; border-radius: var(--sk-radius-sm); color: var(--text); }
html.sk-kv .sk-digital-note .material-symbols-outlined { color: var(--sk-accent-ink); }
html.sk-kv .sk-related .pb-h2, html.sk-kv .sk-cart-head, html.sk-kv .pb-empty { text-align: center; }
html.sk-kv .sk-related .pb-h2 { justify-content: center; }
html.sk-kv .sk-cart-head .pb-lead { margin-left: auto; margin-right: auto; }
html.sk-kv .sk-product-media { border-radius: var(--sk-radius); background: linear-gradient(160deg, var(--sk-primary-soft) 0%, var(--sk-accent-soft) 100%); }
html.sk-kv .sk-cart-row { border-color: var(--sk-line); border-radius: var(--sk-radius-sm); }
html.sk-kv .sk-cart-in { color: var(--sk-success); }
html.sk-kv .sk-card-incart { background: var(--sk-success-soft); color: var(--sk-success); }

/* Zamówienie po powrocie z Przelewy24: kolor ikony mówi stan. */
html.sk-kv .sk-order .pb-h2 .material-symbols-outlined { flex: none; width: 40px; height: 40px; display: grid; place-items: center; border-radius: 50%; font-size: var(--fs-2xl); }
html.sk-kv .sk-order--paid .pb-h2 .material-symbols-outlined { background: var(--sk-success-soft); color: var(--sk-success); }
html.sk-kv .sk-order--pending .pb-h2 .material-symbols-outlined { background: var(--sk-accent-soft); color: var(--sk-accent-ink); }
html.sk-kv .sk-order--cancelled .pb-h2 .material-symbols-outlined { background: var(--sk-bg); color: var(--text-3); }

/* Ramka (?embed=1): stronę, tło i odstępy daje WordPress. Szerokość jak samodzielny
   sklep (SKLEP-SZEROKO-RAMKA, 19.10: przy 1040 px sklep w szerokiej ramce był wąski). */
html.sk-kv.pb-embedded .pb-main { padding: 0 6px 6px; max-width: 1360px; }
html.sk-kv.pb-embedded .sk-hero { margin-top: 6px; }

@media (prefers-reduced-motion: reduce) {
  html.sk-kv .sk-card, html.sk-kv .sk-mini, html.sk-kv .btn, html.sk-kv .sk-card-media .sk-cover { transition: none; }
  html.sk-kv .sk-card:hover, html.sk-kv .sk-mini:hover, html.sk-kv .sk-card:hover .sk-card-media .sk-cover { transform: none; }
  html.sk-kv .pb-main { animation: none; }
}

/* SKLEP-WERYFIKACJA (12.10): strona „Oczekujemy na weryfikację sklepu" zamiast płatności
   (formularz z ramki zostaje w ramce) i ten sam komunikat przy „Dokończ płatność". */
.sk-paused-page { margin: 16px 0 24px; }
html.sk-kv .sk-paused-page .pb-empty-ico { background: var(--sk-highlight); color: var(--sk-highlight-ink); }
.sk-paused-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-top: 6px; }
.sk-paused { display: flex; align-items: flex-start; gap: 12px; padding: 14px 16px; border-radius: var(--shape-md); background: var(--sk-highlight-soft); border: 1px solid var(--sk-highlight); color: var(--text); line-height: var(--lh-base); }
.sk-paused > .material-symbols-outlined { flex: none; color: var(--sk-highlight-ink); font-size: var(--fs-2xl); }
.sk-paused strong { display: block; margin-bottom: 2px; }
.sk-paused span { color: var(--text-2); font-size: var(--fs-sm); }

/* SKLEP-KARTA-PRODUKTU (12.10, 0111): karta produktu wg specyfikacji właściciela -
   galeria z miniaturami, krótki opis z przyciskami, odznaki, sekcje treści, autor,
   FAQ w akordeonie, „Kup razem". Panel: galeria i autorzy. */
.sk-gallery { display: grid; gap: 10px; }
.sk-thumbs { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
.sk-thumb { display: block; width: 56px; height: 75px; border-radius: var(--radius-sm); overflow: hidden; border: 2px solid transparent; background: var(--surface); box-shadow: var(--elev-1); }
.sk-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
.sk-thumb.is-active { border-color: var(--primary); }
.sk-thumb:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.sk-short { margin: 0 0 14px; font-size: var(--fs-lg); line-height: 1.55; color: var(--text); max-width: 620px; }
.sk-perks { list-style: none; margin: 4px 0 18px; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.sk-perks li { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: var(--shape-full); background: var(--surface-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text); }
.sk-perks .material-symbols-outlined { font-size: var(--fs-lg); color: var(--c-ok); }
.sk-includes { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.sk-includes li { display: flex; align-items: flex-start; gap: 8px; line-height: var(--lh-base); }
.sk-includes .material-symbols-outlined { flex: none; font-size: var(--fs-xl); color: var(--primary); }
.sk-author-card { display: flex; align-items: center; gap: 16px; }
.sk-author-photo { flex: none; width: 88px; height: 88px; border-radius: 50%; object-fit: cover; box-shadow: var(--elev-2); }
.sk-author-name { margin: 0 0 4px; font-weight: var(--fw-bold); font-size: var(--fs-lg); }
.sk-author-bio { margin: 0; color: var(--text-2); line-height: var(--lh-base); }
.sk-author-stats { list-style: none; margin: 16px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 10px; }
.sk-author-stats li { display: grid; gap: 2px; text-align: center; padding: 12px 8px; border-radius: var(--shape-md); background: var(--surface-2); }
.sk-author-stats strong { font-size: var(--fs-2xl); font-weight: var(--fw-black); color: var(--primary); letter-spacing: -0.02em; }
.sk-author-stats span { font-size: var(--fs-sm); color: var(--text-2); }
.sk-faq-item { border-bottom: 1px solid var(--border); }
.sk-faq-item > summary { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 48px; padding: 8px 0; cursor: pointer; font-weight: var(--fw-semibold); list-style: none; }
.sk-faq-item > summary::-webkit-details-marker { display: none; }
.sk-faq-item > summary::after { content: "+"; flex: none; font-size: var(--fs-xl); color: var(--primary); }
.sk-faq-item[open] > summary::after { content: "-"; }
.sk-faq-item p { margin: 0 0 12px; color: var(--text-2); line-height: var(--lh-base); }
.sk-pair { margin: 22px 0 0; display: grid; gap: 12px; }
.sk-pair-items { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; }
.sk-pair-item { display: flex; align-items: center; gap: 10px; min-width: 0; flex: 1 1 180px; color: inherit; text-decoration: none; font-weight: var(--fw-semibold); }
.sk-pair-item img { flex: none; width: 54px; height: 72px; object-fit: cover; border-radius: var(--radius-sm); box-shadow: var(--elev-2); }
.sk-pair-plus { font-size: var(--fs-2xl); font-weight: var(--fw-bold); color: var(--primary); }
.sk-pair-sum { margin: 0; font-weight: var(--fw-bold); font-size: var(--fs-lg); }
.sk-pair form { margin: 0; }
/* Panel admina: galeria i autorzy. */
.sk-gal-admin { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 12px; }
.sk-gal-admin-item { display: grid; gap: 6px; justify-items: center; }
.sk-gal-admin-item img { width: 96px; height: 128px; object-fit: cover; border-radius: var(--radius-sm); border: 1px solid var(--border); }
.sk-gal-admin-actions { display: flex; flex-wrap: wrap; gap: 4px; justify-content: center; }
.sk-gal-admin-actions form { margin: 0; }
.sk-author-admin { display: grid; gap: 12px; }
.sk-author-admin-head { display: flex; align-items: center; gap: 12px; }
.sk-author-admin-photo { width: 56px; height: 56px; border-radius: 50%; object-fit: cover; display: grid; place-items: center; background: var(--surface-2); }
/* Darmowa próbka na żywo (pages/sklep-probka.js). */
.sk-viewer { border: 1px solid var(--border); border-radius: var(--shape-lg); background: var(--surface-2); overflow: hidden; }
.sk-viewer-start { display: grid; justify-items: center; gap: 8px; padding: 28px 16px; text-align: center; }
.sk-viewer-start > .material-symbols-outlined { font-size: var(--fs-display); color: var(--primary); }
.sk-viewer-start p { margin: 0; color: var(--text-2); }
.sk-viewer-start[hidden] { display: none; }
.sk-viewer-pages { display: grid; gap: 12px; justify-items: center; max-height: min(75vh, 760px); overflow-y: auto; padding: 12px; overscroll-behavior: contain; }
.sk-viewer-pages[hidden] { display: none; }
.sk-viewer-page { display: block; width: 100%; max-width: 900px; height: auto; background: var(--surface); box-shadow: var(--elev-2); border-radius: var(--radius-sm); }
.sk-viewer-status { margin: 0; padding: 0 12px 10px; text-align: center; }
.sk-viewer-status:empty { display: none; }

/* SKLEP-KARTA-PRODUKTU - układ (12.10, uwaga właściciela: „nie mega pionowo na kompie,
   serio modern"): góra = galeria + karta zakupu na pierwszym ekranie, przyklejone menu
   sekcji, treść na całą szerokość w zmiennych układach. Mobile: jedna kolumna. */
html.sk-kv .sk-buybox { display: grid; gap: 0; align-content: start; }
html.sk-kv .sk-buybox .sk-price-line { margin: 4px 0 2px; }
.sk-body { display: grid; gap: 8px; }
.sk-side-card { margin: 0; padding: 18px; border-radius: var(--shape-lg); background: var(--surface); border: 1px solid var(--border); box-shadow: var(--elev-1); }
html.sk-kv .sk-author { padding: 22px; border-radius: var(--shape-xl); background: linear-gradient(135deg, var(--sk-primary-soft) 0%, var(--sk-accent-soft) 100%); }
.sk-facts--tiles { display: grid; grid-template-columns: 1fr; gap: 10px; margin: 0; }
.sk-facts--tiles li { padding: 12px 14px; border-radius: var(--shape-md); background: var(--surface); border: 1px solid var(--border); color: var(--text); }
.sk-faq-grid { display: grid; gap: 0 28px; align-items: start; }
.sk-buy-row { display: grid; gap: 18px; align-items: start; }
.sk-buy-aside { display: grid; gap: 16px; min-width: 0; }
.sk-buy-aside .sk-pair { margin-top: 0; }
@media (min-width: 600px) {
    .sk-facts--tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 900px) {
  html.sk-kv .sk-product { grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: 44px; align-items: center; }
  html.sk-kv .sk-product-aside { position: static; }
  html.sk-kv .sk-product-media { min-height: 380px; }
  html.sk-kv .sk-product-media img.sk-cover { max-height: 460px; }
  .sk-facts--tiles { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  html.sk-kv .sk-author { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 8px 28px; align-items: center; }
  html.sk-kv .sk-author > .pb-h2 { grid-column: 1 / -1; }
  html.sk-kv .sk-author .sk-author-stats { margin: 0; }
  .sk-buy-row { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 28px; }
  .sk-buy-aside { position: sticky; top: 76px; }
}
html.sk-kv .sk-body + .sk-related { margin-top: 36px; }

/* HOTFIX 12.10 (zgłoszenie właściciela ze zrzutem): na komputerze okładka miała
   `height: 82%` w kontenerze bez określonej wysokości - procent się nie rozwiązywał
   i prawdziwa okładka (duży plik) rysowała się w naturalnym rozmiarze na całą stronę.
   Teraz zdjęcie główne zawsze mieści się w ramce: auto + max-width/max-height
   (proporcje pliku zachowane, dowolny format okładki), kontener przycina nadmiar. */
html.sk-kv .sk-product-media { overflow: hidden; }
html.sk-kv .sk-product-media img.sk-cover { width: auto; height: auto; max-width: 100%; max-height: 320px; aspect-ratio: auto; object-fit: contain; }

/* SKLEP-WIZUALIZACJA (12.10): sklep jako samodzielna strona - nagłówek z kategoriami
   i koszykiem, katalog w sekcjach (napis nad nagłówkiem, nagłówek, wstęp; pasy tła na
   zmianę), kroki, pytania, zaproszenie na lekcję próbną, stopka z danymi sprzedawcy. */
/* Na telefonie podpis ukryty tylko wizualnie - link ikonowy dalej ma nazwę dla czytnika (axe link-name). */
html.sk-kv .sk-hero { margin-top: 20px; }
.sk-hero-actions { position: relative; display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin: 0 0 18px; }
html.sk-kv .sk-hero-btn { background: #fff; color: var(--sk-primary); border-color: #fff; font-weight: var(--fw-bold); }
html.sk-kv .sk-hero-btn:hover { background: var(--sk-primary-soft); }
html.sk-kv .sk-hero-btn--ghost { background: transparent; color: #fff; border: 1.5px solid rgba(255, 255, 255, .7); }
html.sk-kv .sk-hero-btn--ghost:hover { background: rgba(255, 255, 255, .12); color: #fff; }
.sk-block { padding: 34px 0; scroll-margin-top: 120px; }
.sk-block--tint { background: var(--surface-2); box-shadow: 0 0 0 100vmax var(--surface-2); clip-path: inset(0 -100vmax); }
html.sk-kv .sk-block--tint { background: var(--sk-primary-soft); box-shadow: 0 0 0 100vmax var(--sk-primary-soft); }
.sk-block-head { margin: 0 0 20px; text-align: center; }
.sk-eyebrow { display: inline-flex; align-items: center; gap: 6px; margin: 0 0 6px; color: var(--primary); font-size: var(--fs-sm); font-weight: var(--fw-bold); letter-spacing: .04em; text-transform: uppercase; }
.sk-eyebrow .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-block-title { margin: 0; font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: -0.025em; line-height: 1.15; }
.sk-block-lead { margin: 8px auto 0; max-width: 560px; color: var(--text-2); line-height: var(--lh-base); }
.sk-foot { margin-top: 32px; border-top: 1px solid var(--border); background: var(--surface); color: var(--text-2); font-size: var(--fs-sm); }
.sk-foot-grid { max-width: 1040px; margin: 0 auto; padding: 28px var(--page-gutter, 16px); display: grid; gap: 22px; }
.sk-foot-grid p { margin: 0 0 8px; line-height: var(--lh-base); }
.sk-foot-grid ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.sk-foot a { color: var(--text-2); }
.sk-foot a:hover { color: var(--primary); }
.sk-foot-brand { font-weight: var(--fw-black); font-size: var(--fs-lg); color: var(--text); }
.sk-foot-h { font-weight: var(--fw-bold); color: var(--text); }
/* SKLEP-DOKUMENTY (15.10): pasek dokumentów pod stopką i pod treścią w ramce WordPressa. */
.sk-foot-legal { max-width: 1040px; margin: 0 auto; padding: 14px var(--page-gutter, 16px) 18px; border-top: 1px solid var(--border);
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 18px; }
.sk-foot-legal a { text-decoration: underline; text-underline-offset: 2px; }
.sk-foot-legal span { color: var(--text-3); flex-basis: 100%; }
@media (min-width: 600px) { .sk-foot-legal span { flex-basis: auto; margin-right: auto; } }
.sk-foot--embed { margin-top: 24px; background: transparent; border-top: 0; }
.sk-buy--top { margin-top: 14px; }
.sk-buy--top .pb-h2 { font-size: var(--fs-lg); }
@media (min-width: 600px) {
  .sk-block-title { font-size: var(--fs-3xl); }
  .sk-foot-grid { grid-template-columns: 1.2fr 1fr 1.2fr; }
}
@media (min-width: 900px) {
  html.sk-kv .sk-product { align-items: start; }
  html.sk-kv .sk-product-aside { position: sticky; top: 84px; }
}
/* Sekcje katalogu z 1-2 materiałami: karty na środku zamiast przyklejonych do lewej. */
@media (min-width: 600px) {
  .sk-block .sk-grid { grid-template-columns: repeat(auto-fit, minmax(240px, 320px)); justify-content: center; }
}

/* SKLEP-POLECANE (12.10, 0112): „Pozycja miesiąca" pod hero i plakietka „Polecany"
   (kolor wyróżnienia --sk-highlight, jak „Promocja"). */
html.sk-kv .sk-badge--featured { background: var(--sk-highlight); color: var(--sk-highlight-ink); }
.sk-month { display: grid; gap: 18px; margin: 22px 0 6px; padding: 18px; border-radius: var(--shape-xl); background: var(--surface); border: 2px solid var(--sk-highlight, var(--warning)); box-shadow: var(--elev-2); }
.sk-month-media { display: grid; place-items: center; padding: 16px; border-radius: var(--shape-lg); background: linear-gradient(160deg, var(--sk-highlight-soft, var(--surface-2)) 0%, var(--surface-2) 100%); }
.sk-month-media img.sk-cover { width: auto; height: auto; max-width: 100%; max-height: 260px; object-fit: contain; border-radius: var(--radius-sm); box-shadow: var(--elev-3); }
.sk-month-media .sk-cover--empty { width: 160px; height: 214px; }
.sk-month-body { display: grid; gap: 8px; align-content: center; min-width: 0; }
.sk-month-flag { display: inline-flex; align-items: center; gap: 6px; justify-self: start; margin: 0; padding: 4px 12px; border-radius: var(--shape-full); background: var(--sk-highlight, var(--warning)); color: var(--sk-highlight-ink, var(--text)); font-size: var(--fs-sm); font-weight: var(--fw-bold); }
.sk-month-flag .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-month-note { margin: 0; color: var(--text-2); font-weight: var(--fw-semibold); }
.sk-month-title { margin: 0; font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: -0.02em; line-height: 1.15; }
.sk-month-title a { color: inherit; text-decoration: none; }
.sk-month-title a:hover { color: var(--primary); }
.sk-month-lead { margin: 0; color: var(--text-2); line-height: var(--lh-base); }
.sk-month-price { margin: 4px 0 0; }
.sk-month-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; }
.sk-month-actions form { margin: 0; }
@media (min-width: 700px) {
  .sk-month { grid-template-columns: minmax(0, 300px) minmax(0, 1fr); gap: 28px; padding: 22px; }
}

/* Ramka na WordPressie: pasek kategorii i koszyka zamiast nagłówka strony. */
.sk-embed-bar { width: 100%; box-sizing: border-box; max-width: 1360px; margin: 0 auto; padding: 4px 6px 0; display: flex; align-items: center; gap: 8px; }
.sk-embed-cats { display: flex; gap: 4px; overflow-x: auto; min-width: 0; flex: 1; scrollbar-width: none; }
.sk-embed-cats::-webkit-scrollbar { display: none; }
.sk-embed-cats a, .sk-embed-cart { flex: none; display: inline-flex; align-items: center; gap: 6px; min-height: 40px; padding: 0 14px; border-radius: var(--shape-full); border: 1px solid var(--border); background: var(--surface); color: var(--text-2); font-weight: var(--fw-semibold); font-size: var(--fs-sm); text-decoration: none; }
.sk-embed-cats a:hover, .sk-embed-cats a[aria-current] { border-color: var(--primary); color: var(--primary); background: var(--primary-container); }
/* SKLEP-KOSZYK-WIDOCZNY (15.10): koszyk wypełniony kolorem marki, z licznikiem w białej plakietce. */
.sk-embed-cart { flex: none; min-height: 44px; padding: 0 16px; color: var(--sk-on-primary); background: var(--sk-primary, var(--primary)); border-color: transparent; font-weight: var(--fw-bold); box-shadow: 0 6px 16px -6px rgba(10, 98, 199, .55); }
.sk-embed-cart:hover { background: var(--sk-primary-hover, var(--primary)); color: var(--sk-on-primary); }
.sk-embed-cart.is-here { box-shadow: none; outline: 2px solid var(--sk-primary-line, var(--primary)); outline-offset: 2px; }
.sk-embed-cart .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-cart-count { display: inline-grid; place-items: center; min-width: 22px; height: 22px; padding: 0 6px; border-radius: var(--shape-full); background: var(--sk-on-primary); color: var(--sk-primary, var(--primary)); font-size: var(--fs-xs); font-weight: var(--fw-bold); line-height: 1; }
.sk-backlink.sk-backlink--big { min-height: 48px; padding: 0 18px 0 10px; font-size: var(--fs-base); background: var(--sk-primary-soft); border-color: transparent; }
.sk-cart-more { margin-top: 12px; }

/* SKLEP-MOJE-ZAKUPY (12.10): „Moje materiały" kursanta i karta „Ucz się z korepetytorem". */
.kr-mat-list { display: grid; gap: 12px; }
.kr-mat { display: flex; align-items: flex-start; gap: 14px; }
.kr-mat-body { flex: 1; min-width: 0; display: grid; gap: 4px; }
.kr-mat-body .kr-card-title { margin: 0; }
.kr-mat-body .dim-12 { margin: 0; }
.kr-tutor-cta { display: grid; gap: 14px; margin-top: 16px; background: linear-gradient(135deg, var(--primary-container) 0%, var(--surface) 70%); }
.kr-tutor-cta-ico { width: 48px; height: 48px; display: grid; place-items: center; border-radius: var(--shape-md); background: linear-gradient(135deg, var(--primary), var(--accent-cyan)); color: #fff; font-size: var(--fs-2xl); }
.kr-tutor-cta-body .card-h { margin: 0 0 4px; }
.kr-tutor-cta-body p { margin: 0; }
.kr-tutor-cta-btns { display: flex; flex-wrap: wrap; gap: 10px; }
@media (min-width: 900px) {
  .kr-tutor-cta { grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; }
}

/* SKLEP-OKLADKA-DUZA (12.10, zrzut właściciela): na komputerze okładka miała 320 px
   (reguła z poprawki stała niżej niż 460 px z media query) w ramce o stałych
   proporcjach 4:5 - dużo pustego tła. Komputer: ramka bez stałych proporcji
   dopasowana do okładki, okładka do 580 px / 72% wysokości okna. */
@media (min-width: 900px) {
  html.sk-kv .sk-product-media { aspect-ratio: auto; min-height: 0; padding: 28px; }
  html.sk-kv .sk-product-media img.sk-cover { max-height: min(580px, 72vh); max-width: 100%; }
}

/* SKLEP-PRODUKT-PREMIUM (12.10, prośba właściciela): zakładki karty produktu z płynnym
   przejściem, przesuwane podkreślenie, panele w kartach; opis z listami. */
.sk-tabs { min-width: 0; margin-top: 30px; scroll-margin-top: 72px; }
.sk-tabbar { position: sticky; top: 0; z-index: 5; display: flex; align-items: center; gap: 12px; margin: 0 calc(-1 * var(--page-gutter, 16px)); padding: 6px var(--page-gutter, 16px); background: color-mix(in srgb, var(--bg) 94%, transparent); backdrop-filter: blur(10px); border-bottom: 1px solid var(--border); }
.pb-embedded .sk-tabbar { margin: 0 -6px; padding: 6px; }
.sk-tablist { position: relative; display: flex; gap: 2px; overflow-x: auto; min-width: 0; flex: 1; scrollbar-width: none; scroll-behavior: smooth; }
.sk-tablist::-webkit-scrollbar { display: none; }
.sk-tab { position: relative; flex: none; display: inline-flex; align-items: center; min-height: 46px; padding: 0 16px; color: var(--text-2); font-weight: var(--fw-semibold); font-size: var(--fs-base); text-decoration: none; border-radius: var(--shape-md); transition: color var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std); }
.sk-tab:hover { color: var(--text); background: var(--surface-2); }
.sk-tab[aria-selected="true"] { color: var(--primary); }
.sk-tab:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: -3px; }
.sk-tab-ink { display: none; position: absolute; left: 0; bottom: 0; height: 3px; width: 0; border-radius: 3px 3px 0 0; background: linear-gradient(90deg, var(--primary), var(--accent-cyan)); transition: transform 280ms cubic-bezier(.2, 0, 0, 1), width 280ms cubic-bezier(.2, 0, 0, 1); }
.is-tabbed .sk-tab-ink { display: block; }
.sk-tabbar-buy { flex: none; display: none; align-items: center; min-height: 40px; padding: 0 16px; border-radius: var(--shape-full); background: var(--primary); color: #fff; font-weight: var(--fw-bold); font-size: var(--fs-sm); text-decoration: none; }
.sk-tabbar-buy:hover { background: var(--primary-hover); color: #fff; }
.sk-panels { padding-top: 22px; }
.sk-panel { scroll-margin-top: 80px; margin-bottom: 28px; }
.is-tabbed .sk-panel { margin-bottom: 0; }
.sk-panel-title { margin: 0 0 14px; font-size: var(--fs-xl); font-weight: var(--fw-black); letter-spacing: -0.02em; }
.is-tabbed .sk-panel-title { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
.sk-panel.is-entering { animation: sk-panel-in 300ms cubic-bezier(.2, 0, 0, 1) both; }
@keyframes sk-panel-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
.sk-opis { display: grid; gap: 22px; }
.sk-opis-main { min-width: 0; max-width: 680px; }
.sk-opis-main .sk-desc { font-size: var(--fs-md); line-height: 1.7; color: var(--text); margin: 0 0 14px; }
.sk-desc-list { margin: 0 0 16px; padding: 0; list-style: none; display: grid; gap: 8px; }
.sk-desc-list li { position: relative; padding-left: 26px; line-height: 1.6; }
.sk-desc-list li::before { content: ""; position: absolute; left: 6px; top: .62em; width: 8px; height: 8px; border-radius: 50%; background: linear-gradient(135deg, var(--primary), var(--accent-cyan)); }
.sk-opis-side { display: grid; gap: 14px; align-content: start; }
.sk-side-card { padding: 18px; border-radius: var(--shape-lg); background: var(--surface); border: 1px solid var(--border); box-shadow: var(--elev-1); }
.sk-side-title { margin: 0 0 10px; font-size: var(--fs-md); font-weight: var(--fw-bold); }
.sk-toc-full { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
.sk-toc-full .sk-toc-item { display: flex; gap: 12px; align-items: baseline; padding: 10px 14px; border-radius: var(--shape-md); background: var(--surface); border: 1px solid var(--border); }
.sk-toc-full .sk-toc-item--sub { margin-left: 34px; background: transparent; border-color: transparent; padding: 4px 14px; color: var(--text-2); font-size: var(--fs-sm); }
.sk-toc-full .sk-toc-no { flex: none; min-width: 28px; height: 28px; display: grid; place-items: center; border-radius: 50%; background: var(--primary-container); color: var(--primary); font-weight: var(--fw-black); font-size: var(--fs-sm); }
/* SKLEP-SPIS-ROZW (19.10): spis zbioru zadań i rozwiązań obok siebie (od 900 px) */
.sk-toc-split { display: grid; gap: 28px; }
.sk-toc-part { display: flex; align-items: center; gap: 8px; margin: 0 0 6px; font-size: var(--fs-lg); font-weight: var(--fw-bold); }
.sk-toc-part .material-symbols-outlined { color: var(--primary); font-size: var(--fs-xl); }
/* SKLEP-ZAKLADKI-KARTA (19.10): „Co dostajesz" i „Dla kogo" jako zakładki */
.sk-includes--panel { max-width: 680px; gap: 10px; }
.sk-includes--panel li { padding: 12px 14px; border-radius: var(--shape-md); background: var(--surface); border: 1px solid var(--border); font-size: var(--fs-md); }
.sk-includes--panel .material-symbols-outlined { color: var(--c-ok); }
.sk-audience { max-width: 680px; }
.sk-audience .sk-desc { font-size: var(--fs-md); line-height: 1.7; margin: 0 0 14px; }
@media (min-width: 900px) {
  .sk-tabbar { top: 61px; }
  .pb-embedded .sk-tabbar { top: 0; }
  .sk-tabbar-buy { display: inline-flex; }
  .sk-opis { grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); gap: 36px; }
  .sk-toc-split { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 36px; }
  .sk-opis-side { position: sticky; top: 140px; }
}
@media (prefers-reduced-motion: reduce) {
  .sk-panel.is-entering { animation: none; }
  .sk-tab-ink { transition: none; }
}
/* Góra karty produktu (premium): tytuł, blok ceny, korzyści jako lista. */
html.sk-kv .sk-buybox .pb-h1 { font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: -0.03em; line-height: 1.1; margin: 8px 0 6px; }
/* SKLEP-PRODUKT-TYTUL-NAD (22.10): na telefonie tytuł nad zdjęciem (kopia `.sk-product-mhead`),
   w karcie zakupu tytuł, podtytuł i plakietki tylko dla czytnika - od 900 px odwrotnie. */
html.sk-kv .sk-product-mhead { margin: 0 0 12px; }
html.sk-kv .sk-product-mhead .pb-h1 { margin: 8px 0 4px; font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: -0.03em; line-height: 1.1; color: var(--sk-ink); }
html.sk-kv .sk-product-mhead .pb-lead { margin: 0; }
html.sk-kv .sk-product-mhead .sk-badges { justify-content: flex-start; }
html.sk-kv .sk-buybox > :is(.sk-badges, .pb-h1, .pb-lead) { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
@media (min-width: 900px) {
  html.sk-kv .sk-product-mhead { display: none; }
  html.sk-kv .sk-buybox > :is(.sk-badges, .pb-h1, .pb-lead) { position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; }
}
html.sk-kv .sk-buybox .pb-lead { font-size: var(--fs-md); margin-bottom: 12px; }
.sk-pricebox { margin: 4px 0 14px; padding: 12px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.sk-pricebox .sk-price-line { margin: 0; }
.sk-pricebox .sk-lowest-line { margin: 4px 0 0; }
html.sk-kv .sk-buybox .sk-short { font-size: var(--fs-md); color: var(--text-2); }
html.sk-kv .sk-buybox .sk-perks { display: grid; gap: 8px; margin: 6px 0 16px; }
html.sk-kv .sk-buybox .sk-perks li { background: none; padding: 0; border-radius: 0; font-size: var(--fs-base); font-weight: var(--fw-semibold); }
@media (min-width: 900px) {
  html.sk-kv .sk-buybox .pb-h1 { font-size: var(--fs-3xl); }
}
/* Pod zakładkami: „Kup razem" i opinie na całą szerokość (formularz zakupu jest na górze). */
@media (min-width: 900px) {
  .sk-buy-row { grid-template-columns: minmax(0, 1fr); }
  .sk-buy-aside { position: static; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); align-items: start; }
  .sk-pair { grid-template-columns: minmax(0, 1fr) auto; align-items: center; }
  .sk-pair > .pb-h2 { grid-column: 1 / -1; }
  .sk-pair-sum { text-align: right; }
}

/* SKLEP-KATALOG-PREMIUM (12.10, prośba właściciela „wybór też premium"): karty
   materiałów jak okładki na półce - okładka na miękkim świetle, cień książki,
   lekki obrót przy najechaniu, równe wysokości kart, tytuł w 2 liniach. */
html.sk-kv .sk-grid { gap: 18px; }
html.sk-kv .sk-card { display: flex; flex-direction: column; border-radius: 22px; border-color: transparent; box-shadow: 0 1px 2px rgba(15, 27, 45, .05), 0 12px 32px -12px rgba(10, 98, 199, .22); }
html.sk-kv .sk-card:hover { transform: translateY(-6px); box-shadow: 0 2px 6px rgba(15, 27, 45, .06), 0 26px 48px -18px rgba(10, 98, 199, .38); }
html.sk-kv .sk-card-media { position: relative; height: 230px; padding: 22px; background: radial-gradient(120% 90% at 50% 0%, #fff 0%, var(--sk-primary-soft) 55%, var(--sk-accent-soft) 100%); }
html.sk-kv .sk-card-media .sk-cover { height: 186px; border-radius: 4px 8px 8px 4px; box-shadow: -1px 0 0 rgba(255, 255, 255, .6) inset, 0 2px 4px rgba(15, 27, 45, .12), 0 16px 28px -8px rgba(15, 27, 45, .35); transform-origin: 50% 100%; transition: transform 320ms cubic-bezier(.2, 0, 0, 1); }
html.sk-kv .sk-card:hover .sk-card-media .sk-cover { transform: perspective(600px) rotateY(-8deg) translateY(-4px); }
html.sk-kv .sk-card-media::after { content: ""; position: absolute; left: 22%; right: 22%; bottom: 14px; height: 10px; border-radius: 50%; background: radial-gradient(closest-side, rgba(15, 27, 45, .22), transparent); }
html.sk-kv .sk-card-body { padding: 18px 20px 6px; gap: 6px; }
html.sk-kv .sk-card-title { font-size: var(--fs-lg); line-height: 1.25; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-height: 2.5em; }
html.sk-kv .sk-card-sub { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
html.sk-kv .sk-card-foot { margin-top: auto; padding-top: 10px; }
html.sk-kv .sk-card .sk-price { font-size: var(--fs-2xl); }
html.sk-kv .sk-card-cart { margin-top: auto; padding: 0 20px 20px; }
@media (min-width: 600px) {
  html.sk-kv .sk-card-media { height: 260px; }
  html.sk-kv .sk-card-media .sk-cover { height: 212px; }
}
@media (prefers-reduced-motion: reduce) {
  html.sk-kv .sk-card:hover .sk-card-media .sk-cover { transform: none; }
}
.sk-toc-count { margin: 0 0 12px; color: var(--text-2); font-weight: var(--fw-semibold); }

/* SKLEP-OKLADKA-XL (12.10, zrzut właściciela „jakby ta wizualizacja była większa"):
   okładka była ograniczona do 72% wysokości okna (na laptopie ok. 430 px) w wąskiej
   kolumnie. Teraz kolumna galerii jest szersza od kolumny zakupu, okładka wypełnia
   jej szerokość (do 520 px, wysokość z proporcji pliku), w ramce jak na półce
   z cieniem książki. Galeria przykleja się przy przewijaniu tylko na oknach dość
   wysokich, żeby duża okładka i miniatury nie uciekały pod dolną krawędź. */
html.sk-kv .sk-product-media { position: relative; background: radial-gradient(120% 90% at 50% 0%, var(--surface) 0%, var(--sk-primary-soft) 55%, var(--sk-accent-soft) 100%); }
html.sk-kv .sk-product-media img.sk-cover { max-height: 400px; border-radius: 4px 10px 10px 4px; box-shadow: -1px 0 0 rgba(255, 255, 255, .6) inset, 0 2px 6px rgba(15, 27, 45, .14), 0 26px 48px -14px rgba(15, 27, 45, .42); }
@media (min-width: 600px) {
  html.sk-kv .sk-product-media img.sk-cover { max-height: 520px; }
}
@media (min-width: 900px) {
  html.sk-kv .sk-product { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 40px; }
  html.sk-kv .sk-product-aside { position: static; }
  html.sk-kv .sk-product-media { padding: 36px 28px 40px; }
  html.sk-kv .sk-product-media img.sk-cover { width: 100%; max-width: 520px; height: auto; max-height: none; }
}

/* SKLEP-ZAKUP-KROKI (12.10, prośba właściciela „nazwa i zakup na wysokość książki,
   na jednym scrollu"): obok okładki krótka karta - cena, korzyści, „Kup teraz"
   i koszyk w jednym rzędzie, próbka i kod pod spodem. Formularz zamówienia to
   drugi krok w tym samym miejscu (pages/sklep.js), z płynnym wejściem. */
.sk-cta-main { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin: 4px 0 12px; scroll-margin-top: 84px; }
.sk-cta-main form { margin: 0; }
.sk-cta-main .sk-cart-in { flex-basis: 100%; font-size: var(--fs-sm); }
.sk-cta-buy { flex: 1 1 220px; min-height: 52px; font-size: var(--fs-md); }
html.sk-kv .sk-buybox .sk-code { margin: 0 0 6px; }
html.sk-kv .sk-buybox .sk-cart-note { margin: 4px 0 0; }
.sk-buybox.is-stepped { scroll-margin-top: 84px; }
.sk-buybox.is-stepped .sk-buy--top { margin-top: 8px; }
.sk-buybox.is-buying .pb-lead, .sk-buybox.is-buying > .sk-badges { display: none; }
.sk-buy-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: -8px 0 10px; }
.sk-buy-head .pb-h2 { margin: 0; }
.sk-buy-back { display: inline-flex; align-items: center; gap: 2px; min-height: 44px; margin-right: -8px; padding: 0 10px 0 4px; border: 0; background: none; color: var(--primary); font: inherit; font-weight: var(--fw-semibold); cursor: pointer; border-radius: var(--shape-full); }
.sk-buy-back:hover { background: var(--sk-primary-soft); }
.sk-buy-back[hidden] { display: none; }
.sk-buybox.is-stepped .sk-buy .pz-consent-check { padding: 10px 12px; font-size: var(--fs-sm); }
.sk-buybox.is-stepped .sk-buy .pz-consent-check--gap { margin-bottom: 10px; }
.sk-buybox.is-stepped .sk-buy .field { margin-bottom: 12px; }
.sk-buybox.is-stepped .sk-buy .sk-digital-note { margin-bottom: 12px; }
.sk-step-intro.is-entering, .sk-buy.is-entering { animation: sk-panel-in 300ms cubic-bezier(.2, 0, 0, 1) both; }
@media (prefers-reduced-motion: reduce) {
  .sk-step-intro.is-entering, .sk-buy.is-entering { animation: none; }
}

/* SKLEP-OKLADKA-OKNO (12.10, prośba właściciela „dopasuj okładkę do wysokości okna"):
   na komputerze okładka (z ramką i miniaturami) mieści się w oknie pod nagłówkiem -
   cała góra produktu na jednym ekranie także na niższym laptopie; galeria zawsze
   przyklejona. W ramce na WordPressie 100vh to wysokość całej ramki, więc tam stały
   limit. Szerokość wynika z proporcji okładki. */
@media (min-width: 900px) {
  html.sk-kv .sk-product-media img.sk-cover { width: auto; max-width: 100%; max-height: max(380px, calc(100vh - 230px)); }
  html.sk-kv .sk-gallery:has(.sk-thumbs) .sk-product-media img.sk-cover { max-height: max(340px, calc(100vh - 330px)); }
  html.sk-kv.pb-embedded .sk-product-aside .sk-product-media img.sk-cover { max-height: 600px; }
  html.sk-kv .sk-product-aside { position: sticky; top: 84px; }
}

/* SKLEP-PODGLAD-NA-ZYWO (12.10): w edycji produktu ramka z prawdziwą stroną produktu.
   Szeroki ekran: formularz po lewej, podgląd przyklejony po prawej (pasek boczny
   formularza schodzi pod główną kolumnę); węższy - podgląd pod formularzem. */
.sk-pf-preview { display: flex; flex-direction: column; gap: 10px; min-width: 0; height: 78vh; margin: 0; }
.sk-pf-preview[hidden] { display: none; }
.sk-pf-preview-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; }
.sk-pf-preview-bar [data-sk-preview-state] { margin-right: auto; }
.sk-pf-preview-devices { display: inline-flex; gap: 4px; }
.sk-pf-preview-devices .btn[aria-pressed="true"] { background: var(--primary-container); color: var(--primary); border-color: transparent; }
.sk-pf-preview-stage { position: relative; flex: 1; min-height: 0; overflow: hidden; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface-2); }
.sk-pf-preview-stage iframe { position: absolute; top: 0; left: 0; border: 0; background: var(--surface); transform-origin: 0 0; }
@media (min-width: 1100px) {
  .sk-pf.is-previewing { grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); }
  .sk-pf.is-previewing .sk-pf-side { position: static; grid-column: 1; }
  .sk-pf.is-previewing .sk-pf-preview { grid-column: 2; grid-row: 1 / span 2; position: sticky; top: 76px; height: calc(100vh - 96px); }
}

/* SKLEP-OPIS-W-SKROCIE (12.10, zrzut właściciela - pusto obok opisu): karta
   „W skrócie" zawsze obok opisu, długie listy (5+ punktów) w dwóch kolumnach
   jako kafelki, tekst opisu na całą szerokość swojej kolumny. */
.sk-opis-main { max-width: none; }
.sk-glance-list { margin: 0 0 4px; display: grid; }
.sk-glance-list > div { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--border); }
.sk-glance-list > div:last-child { border-bottom: 0; }
.sk-glance-list dt { color: var(--text-2); font-size: var(--fs-sm); }
.sk-glance-list dd { margin: 0; text-align: right; font-weight: var(--fw-semibold); }
.sk-glance-author { display: flex; align-items: center; gap: 10px; margin-top: 10px; padding: 10px 12px; border-radius: var(--shape-md); background: var(--surface-2); color: var(--text); text-decoration: none; }
.sk-glance-author:hover { background: var(--sk-primary-soft); }
.sk-glance-author img, .sk-glance-avatar { width: 40px; height: 40px; flex: none; border-radius: 50%; object-fit: cover; }
.sk-glance-avatar { display: grid; place-items: center; background: var(--surface); color: var(--text-3); }
.sk-glance-author > span:last-child { display: grid; line-height: 1.3; }
.sk-glance-sample { margin-top: 12px; }

/* SKLEP-FILTRY-PANEL (12.10, prośba właściciela - panel jak w sklepie Nowej Ery):
   katalog = panel filtrów po lewej (przyklejony) + nagłówek z liczbą i sortowaniem,
   aktywne filtry jako etykiety z krzyżykiem, siatka. Telefon: panel zwinięty
   pod przyciskiem „Filtry". */
.sk-shelf { display: grid; gap: 16px; margin: 28px 0 8px; scroll-margin-top: 124px; }
.sk-fpanel { min-width: 0; border-radius: var(--sk-radius); background: var(--surface); border: 1px solid var(--border); box-shadow: var(--elev-1); }
.sk-fpanel-toggle { display: flex; align-items: center; gap: 8px; min-height: 48px; padding: 0 16px; cursor: pointer; font-weight: var(--fw-bold); list-style: none; }
.sk-fpanel-toggle::-webkit-details-marker { display: none; }
.sk-fform { display: grid; padding: 4px 16px 16px; }
/* SKLEP-SZUKAJ-FILTRY (22.10): pole z lupką na górze panelu filtrów. */
.sk-fsearch { position: relative; margin: 0 0 14px; }
.sk-fsearch .material-symbols-outlined { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: var(--text-3); font-size: var(--fs-xl); pointer-events: none; }
.sk-fsearch .input { width: 100%; padding-left: 36px; }
.sk-fgroup { margin: 0; padding: 8px 0 8px; border: 0; border-top: 1px solid var(--border); min-width: 0; }
.sk-fgroup-title { padding: 0 0 6px; font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: .08em; text-transform: uppercase; color: var(--text-2); }
.sk-fopt { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 4px 8px; margin: 0 -8px; border-radius: var(--shape-md); cursor: pointer; line-height: 1.3; }
.sk-fopt:hover { background: var(--sk-primary-soft); }
.sk-fopt input { flex: none; margin: 0; }
.sk-fopt > span:first-of-type { flex: 1; min-width: 0; }
.sk-fopt:has(input:checked) { font-weight: var(--fw-semibold); color: var(--sk-primary); }
.sk-fcount { flex: none; min-width: 28px; padding: 1px 8px; border-radius: var(--shape-full); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-align: center; }
.sk-fmore > summary { min-height: 40px; display: flex; align-items: center; cursor: pointer; color: var(--sk-primary); font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.sk-fform-actions { display: grid; gap: 10px; justify-items: start; padding-top: 12px; border-top: 1px solid var(--border); }
.sk-fform-actions .btn { justify-self: stretch; }
.sk-fform-actions .btn[hidden] { display: none; }
.sk-shelf-main { min-width: 0; }
.sk-shelf-head { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 10px 16px; margin-bottom: 14px; }
.sk-shelf-title { margin: 0; font-size: var(--fs-2xl); font-weight: var(--fw-bold); letter-spacing: -0.02em; }
.sk-shelf-count { margin: 2px 0 0; color: var(--text-2); }
.sk-sort { display: flex; align-items: center; gap: 8px; font-size: var(--fs-sm); color: var(--text-2); }
.sk-sort .select { min-width: 200px; }
.sk-fchips { list-style: none; margin: 0 0 16px; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.sk-fchip { display: inline-flex; align-items: center; gap: 4px; min-height: 36px; padding: 0 8px 0 14px; border-radius: var(--shape-full); background: var(--sk-primary-soft); color: var(--sk-primary); font-weight: var(--fw-semibold); font-size: var(--fs-sm); text-decoration: none; }
.sk-fchip .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-fchip:hover { background: var(--sk-primary-soft-hover); }
/* SKLEP-FILTRY-POZIOM (27.10): na telefonie poziomy od razu, nad zwiniętym panelem „Filtry"; na szerokim
   ekranie poziom jest w otwartym panelu i pasek znika. Przewijany poziomo, bez paska przewijania. */
.sk-flevels { display: flex; gap: 8px; margin: 0 -4px; padding: 4px 4px 6px; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }   /* zapas na obwódkę fokusu */
.sk-flevels::-webkit-scrollbar { display: none; }
.sk-flevel { flex: none; display: inline-flex; align-items: center; gap: 6px; min-height: 40px; padding: 0 14px; border-radius: var(--shape-full); border: 1px solid var(--border); background: var(--surface); color: var(--text); font-size: var(--fs-sm); font-weight: var(--fw-semibold); text-decoration: none; white-space: nowrap; }
.sk-flevel.is-on { background: var(--sk-primary); border-color: var(--sk-primary); color: var(--sk-on-primary); }
.sk-flevel.is-on .sk-fcount { background: var(--sk-primary-soft); color: var(--sk-primary); }
@media (min-width: 900px) {
  .sk-flevels { display: none; }
  .sk-shelf { grid-template-columns: 260px minmax(0, 1fr); gap: 28px; align-items: start; scroll-margin-top: 84px; }
  .sk-fpanel { position: sticky; top: 84px; max-height: calc(100vh - 100px); overflow: auto; }
  .sk-fpanel-toggle { pointer-events: none; }
  .sk-fpanel-toggle .material-symbols-outlined { color: var(--sk-primary); }
  .sk-shelf .sk-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  html.sk-kv.pb-embedded .sk-fpanel { position: static; max-height: none; }
}
@media (min-width: 1100px) {
  .sk-shelf .sk-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
/* SKLEP-RZEDY-POZIOMOW (29.10, „podział jak u Pauliny"): katalog bez filtra = rzędy per poziom
   przewijane w bok (scroll-snap). Strzałki odkrywa pages/sklep.js tylko, gdy jest co przewijać;
   na dotyku zostaje przesuwanie palcem. Kolejna karta wystaje z prawej - widać, że rząd jedzie dalej. */
.sk-rail { margin: 0 0 56px; }
.sk-rail-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 8px; }
.sk-rail-title { display: inline-flex; align-items: center; gap: 8px; margin: 0; font-size: var(--fs-xl); font-weight: var(--fw-bold); letter-spacing: -0.02em; }
.sk-rail-all { display: inline-flex; align-items: center; gap: 4px; min-height: 40px; color: var(--sk-primary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); text-decoration: none; white-space: nowrap; }
.sk-rail-all .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-rail-all:hover { text-decoration: underline; }
.sk-rail-wrap { position: relative; }
.sk-rail-track { display: flex; gap: 14px; margin: -6px -12px -30px; padding: 12px 12px 44px; overflow-x: auto; scroll-snap-type: x mandatory; scroll-padding: 0 12px; overscroll-behavior-x: contain; scrollbar-width: thin; -webkit-overflow-scrolling: touch; }
.sk-rail-track > .sk-card { flex: 0 0 clamp(148px, 41%, 230px); scroll-snap-align: start; }
@media (min-width: 600px) { .sk-rail-track > .sk-card { flex-basis: 230px; } }
.sk-rail-btn { position: absolute; top: 38%; z-index: 2; width: 44px; height: 44px; display: grid; place-items: center; padding: 0; border-radius: 50%; border: 1px solid var(--border); background: var(--surface); color: var(--text); box-shadow: var(--elev-2); cursor: pointer; transform: translateY(-50%); transition: opacity var(--motion-fast) var(--ease-std), color var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.sk-rail-btn--prev { left: -12px; }
.sk-rail-btn--next { right: -12px; }
.sk-rail-btn:hover { color: var(--sk-primary); border-color: var(--sk-primary); }
.sk-rail-btn[aria-disabled="true"] { opacity: 0; pointer-events: none; }
.sk-rail-btn[aria-disabled="true"]:focus-visible { opacity: .5; }
.sk-rail-btn[hidden] { display: none; }
@media (hover: none) { .sk-rail-btn { display: none; } }
html.sk-kv .sk-rail-btn { border-color: var(--sk-site-line); box-shadow: var(--sk-shadow-card); }
@media (prefers-reduced-motion: reduce) { .sk-rail-track { scroll-behavior: auto; } }
.sk-topic-more { margin-top: 8px; }
.sk-topic-more > summary { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 12px; border-radius: var(--shape-full); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); cursor: pointer; list-style: none; }
.sk-topic-more > summary::-webkit-details-marker { display: none; }
.sk-topic-more > summary::before { content: "+"; font-weight: var(--fw-bold); color: var(--primary); }
.sk-topic-more[open] > summary::before { content: "-"; }
.sk-topic-more > summary:hover { color: var(--text); }
.sk-topic-picks { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
.sk-topic-more .sk-topic-picks { max-height: 240px; overflow-y: auto; padding: 2px; }
.sk-topic-pick { text-align: left; }
.sk-topic-pick { min-height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: var(--shape-full); background: var(--surface); color: var(--text); font: inherit; font-size: var(--fs-sm); cursor: pointer; }
.sk-topic-pick:hover { border-color: var(--primary); color: var(--primary); }

/* SKLEP-OPIS-PREMIUM (12.10, „ten opis dalej mi nie siedzi"): opis w białej karcie
   obok „W skrócie"; pierwszy akapit jako wstęp z akcentem, „W środku:" jako
   śródtytuł z linią, lista jako kafelki z ikoną (2 kolumny od 4 punktów),
   akapity do ~68 znaków w linii - czyta się jak strona książki, nie ściana tekstu. */
html.sk-kv .sk-opis-main { padding: 22px 18px; border-radius: var(--sk-radius); background: var(--surface); border: 1px solid var(--border); box-shadow: var(--elev-1); }
.sk-opis-main .sk-desc { max-width: 68ch; }
.sk-desc-h { display: flex; align-items: center; gap: 12px; margin: 26px 0 12px; font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: .08em; text-transform: uppercase; color: var(--sk-primary); }
.sk-desc-h::after { content: ""; flex: 1; height: 1px; background: var(--border); }
.sk-feats { list-style: none; margin: 0 0 22px; padding: 0; display: grid; gap: 10px; }
@media (min-width: 700px) {
  html.sk-kv .sk-opis-main { padding: 32px 36px; }
  .sk-feats--cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 900px) {
  .sk-opis { grid-template-columns: minmax(0, 1fr) 300px; gap: 28px; }
}
@media (min-width: 1100px) {
  .sk-opis { grid-template-columns: minmax(0, 1fr) 320px; }
}
/* SKLEP-FILTRY-W-MIEJSCU (12.10): podmiana wyników bez przeładowania strony. */
.sk-shelf-main { transition: opacity var(--motion-fast) var(--ease-std); }
.sk-shelf-main.is-loading { opacity: .45; pointer-events: none; }
.sk-shelf-main.is-entering { animation: sk-panel-in 260ms cubic-bezier(.2, 0, 0, 1) both; }
@media (prefers-reduced-motion: reduce) {
  .sk-shelf-main.is-entering { animation: none; }
}

/* SKLEP-PYTANIA-KARTY (12.10, prośba właściciela „pytania takim stylem jak trzy
   kroki"): każde pytanie to biała karta jak krok - numer w kółku, pytanie,
   okrągły przycisk +/-; otwarta karta z obwódką w kolorze marki. Katalog
   („Zanim kupisz") i zakładka „Pytania" produktu. */
.sk-faq-grid { gap: 12px 16px; }
.sk-faq-item { border: 1px solid var(--border); border-radius: var(--shape-lg); background: var(--surface); transition: border-color var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std); }
.sk-faq-item:hover { border-color: var(--sk-primary-line); }
.sk-faq-item[open] { border-color: var(--sk-primary-line); box-shadow: var(--elev-1); }
.sk-faq-item > summary { gap: 14px; min-height: 64px; padding: 12px 16px; }
.sk-faq-item > summary::after { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 50%; background: var(--sk-primary-soft); color: var(--sk-primary); font-size: var(--fs-lg); line-height: 1; }
.sk-faq-item[open] > summary::after { background: var(--sk-primary); color: var(--sk-card); }
.sk-faq-no { flex: none; display: grid; place-items: center; width: 28px; height: 28px; border-radius: 50%; background: var(--primary-container); color: var(--primary); font-weight: var(--fw-black); font-size: var(--fs-sm); }
.sk-faq-q { flex: 1; min-width: 0; line-height: var(--lh-base); }
.sk-faq-item p { margin: 0; padding: 0 16px 16px 58px; }

/* SKLEP-OPIS-GRAFIKA (12.10, „W środku ładniej graficznie, podrasuj opis"):
   „W środku" to sekcja na gradientowym tle z nagłówkiem i liczbą elementów;
   punkt zaczęty liczbą („200 zadań...") = kafelek ze statystyką (duża liczba),
   pozostałe = kafelek z ikoną dobraną po słowach; „Zgodny z..." = zielony
   znaczek; „Autor: ..." = pasek ze zdjęciem autora. */
.sk-inside { margin: 22px 0; padding: 18px; border-radius: var(--sk-radius); background: linear-gradient(135deg, var(--sk-primary-soft) 0%, var(--sk-accent-soft) 100%); }
.sk-inside-head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.sk-inside-ico { display: grid; place-items: center; width: 36px; height: 36px; border-radius: 50%; background: var(--sk-card); color: var(--sk-primary); font-size: var(--fs-lg); box-shadow: var(--elev-1); }
.sk-inside-title { margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-bold); }
.sk-inside-count { margin-left: auto; padding: 3px 10px; border-radius: var(--shape-full); background: var(--sk-card); color: var(--sk-primary); font-size: var(--fs-xs); font-weight: var(--fw-bold); }
.sk-inside .sk-feats { margin: 0; }
.sk-feat { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 2px 12px; padding: 14px 16px; border-radius: var(--shape-md); background: var(--sk-card); box-shadow: 0 1px 2px rgba(15, 27, 45, .06), 0 10px 22px -14px rgba(10, 98, 199, .35); line-height: var(--lh-base); }
.sk-feat-ico { grid-row: span 2; align-self: start; display: grid; place-items: center; width: 40px; height: 40px; border-radius: var(--shape-md); background: linear-gradient(135deg, var(--sk-primary), var(--sk-accent)); color: var(--sk-card); font-size: var(--fs-xl); }
.sk-feat-title { font-weight: var(--fw-semibold); }
.sk-feat-rest { grid-column: 2; color: var(--text-2); font-size: var(--fs-sm); }
.sk-feat--stat { grid-template-columns: minmax(0, 1fr); }
.sk-feat--stat .sk-feat-rest { grid-column: 1; }
.sk-feat-stat { display: flex; align-items: baseline; gap: 6px; }
.sk-feat-num { font-size: var(--fs-3xl); font-weight: var(--fw-black); line-height: 1; letter-spacing: -0.03em; background: linear-gradient(135deg, var(--sk-primary), var(--sk-accent)); -webkit-background-clip: text; background-clip: text; color: transparent; }
.sk-feat-unit { font-weight: var(--fw-bold); font-size: var(--fs-md); }
.sk-desc-note { display: inline-flex; align-items: center; gap: 8px; margin: 4px 0 16px; padding: 8px 14px; border-radius: var(--shape-full); background: var(--sk-success-soft); color: var(--sk-success); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.sk-desc-note .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-desc-author { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-top: 8px; padding: 14px 16px; border-radius: var(--shape-md); background: var(--sk-bg); }
.sk-desc-author img, .sk-desc-author-ico { flex: none; width: 48px; height: 48px; border-radius: 50%; object-fit: cover; }
.sk-desc-author-ico { display: grid; place-items: center; background: var(--sk-card); color: var(--text-3); }
.sk-desc-author p { flex: 1; min-width: 180px; margin: 0; display: grid; line-height: var(--lh-base); }
.sk-desc-author p > span:last-child:not(.dim-12) { color: var(--text-2); font-size: var(--fs-sm); }
@media (min-width: 700px) {
  .sk-inside { padding: 22px 24px; }
}

/* SKLEP-POPRAWKI-12.10 (zgłoszenia właściciela): pytania jedna pod drugą (środek,
   czytelna szerokość), więcej powietrza między katalogiem a „Trzema krokami",
   „Wróć do sklepu" ze strzałką, „Może Cię zainteresować" jako karty książek. */
.sk-faq-grid { grid-template-columns: minmax(0, 1fr); max-width: 820px; margin-inline: auto; gap: 10px; }
.sk-shelf { margin-bottom: 56px; }
.sk-backlink { display: inline-flex; align-items: center; gap: 2px; min-height: 40px; padding: 0 14px 0 6px; border-radius: var(--shape-full); background: var(--sk-card); border: 1px solid var(--border); color: var(--sk-primary); font-weight: var(--fw-semibold); font-size: var(--fs-sm); text-decoration: none; box-shadow: var(--elev-1); transition: transform var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.sk-backlink:hover { border-color: var(--sk-primary-line); transform: translateX(-2px); }
.sk-backlink .material-symbols-outlined { font-size: var(--fs-xl); }
.sk-related-head { text-align: center; margin-bottom: 18px; }
.sk-related-head .sk-eyebrow { margin: 0 0 4px; }
.sk-related-head .sk-block-title { margin: 0; }
.sk-related-grid { gap: 16px; }
html.sk-kv .sk-related-grid .sk-mini { flex-direction: column; align-items: stretch; gap: 0; padding: 0; overflow: hidden; border-radius: 22px; border-color: transparent; box-shadow: 0 1px 2px rgba(15, 27, 45, .05), 0 12px 32px -12px rgba(10, 98, 199, .22); }
.sk-related-grid .sk-mini-media { display: grid; place-items: center; height: 200px; padding: 18px; background: radial-gradient(120% 90% at 50% 0%, var(--sk-card) 0%, var(--sk-primary-soft) 55%, var(--sk-accent-soft) 100%); }
.sk-related-grid .sk-mini-cover { width: auto; height: 160px; aspect-ratio: 3 / 4; border-radius: 4px 8px 8px 4px; box-shadow: 0 2px 4px rgba(15, 27, 45, .12), 0 16px 28px -8px rgba(15, 27, 45, .35); transition: transform 320ms cubic-bezier(.2, 0, 0, 1); }
.sk-related-grid .sk-mini:hover .sk-mini-cover { transform: perspective(600px) rotateY(-8deg) translateY(-4px); }
.sk-related-grid .sk-mini-body { padding: 14px 18px 18px; text-align: center; justify-items: center; }
.sk-related-grid .sk-mini-title { font-size: var(--fs-lg); }
.sk-related-grid .sk-mini-more { display: inline-flex; align-items: center; gap: 4px; margin-top: 4px; color: var(--sk-primary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
@media (prefers-reduced-motion: reduce) {
  .sk-related-grid .sk-mini:hover .sk-mini-cover { transform: none; }
}
.sk-reviews-note { display: flex; align-items: flex-start; gap: 8px; margin: 12px 0 0; color: var(--text-2); font-size: var(--fs-sm); line-height: var(--lh-base); }
.sk-reviews-note .material-symbols-outlined { flex: none; color: var(--sk-success); font-size: var(--fs-lg); }

/* ═══════════════════════════════════════════════════════════════════════
   KV-APP-KARTY (12.10, decyzja właściciela „cały panel admina jak sklep"):
   wykończenie sklepu w panelu. Promień kart 18 i miękki niebieski cień przyszły
   z tokenów (--shape-lg, --shadow-card); tu: przyciski-pigułki (zmiana decyzji
   z 08.10 - właściciel woli wygląd sklepu), zakładki jako pigułki w jasnej
   ramce (zawijają się zamiast uciekać za krawędź), wiersze tabel podświetlane
   kolorem marki, puste stany bez przerywanej ramki. Ciemny motyw na tokenach.
   ═══════════════════════════════════════════════════════════════════════ */
.btn { border-radius: var(--shape-full); height: 42px; padding: 0 18px; border-color: var(--border); }
.btn:hover { border-color: var(--primary-ring); }
.btn-sm { height: 34px; padding: 0 14px; }
.btn.block { height: 46px; }
.btn.accent { border-color: transparent; }
/* KV-STRONA-1 (05.11): usunięty miękki niebieski cień `html:not(.dark) .btn.accent` (0-3-1) - wygrywał
   z cieniem „klawisza" PANEL-V2 (`html .btn.accent`, `--zs-key`), więc w jasnym motywie główny przycisk
   nie wyglądał jak na stronie i nie „wciskał się". */
.btn.tonal:hover { background: color-mix(in srgb, var(--primary-container) 80%, var(--primary) 8%); }
.btn.danger { border-color: color-mix(in srgb, var(--c-rej) 45%, var(--border)); }

.tabs { flex-wrap: nowrap; gap: 4px; padding: 5px; border: 1px solid var(--border); border-radius: var(--shape-lg); background: var(--surface); box-shadow: var(--shadow-card); overflow-x: auto; }
@media (min-width: 900px) {
  .tabs { flex-wrap: wrap; overflow: visible; }
}
.tab { min-height: 40px; padding: 8px 16px; margin: 0; border-radius: var(--shape-full); font-weight: var(--fw-semibold); transition: background var(--motion-fast) var(--ease-std), color var(--motion-fast) var(--ease-std); }
.tab::before { border-radius: inherit; }
.tab::after { display: none; }
.tab.active { background: var(--primary-container); color: var(--on-primary-container); }
.tab.active::before { opacity: 0; }

table.leads tr.row:hover > td { background: color-mix(in srgb, var(--primary-container) 55%, transparent); }
table.leads th { background: var(--surface-2); }

.bkl-bar { border-bottom: 0; align-items: center; }
.bkl-tabs { margin-bottom: 0; }
.pz-callout-info { padding: 12px 16px; border: 1px solid color-mix(in srgb, var(--primary) 18%, var(--border)); border-radius: var(--shape-md); background: color-mix(in srgb, var(--primary-container) 60%, var(--surface)); }
html.dark .pz-callout-info { border-color: color-mix(in srgb, var(--c-new) 35%, var(--border)); }

/* Kalendarz: przełącznik widoków i strzałki jako pigułki na jasnym torze, jak zakładki;
   lekcje z zaokrągleniem jak karty. */
#calendar .fc-button-group { gap: 2px; padding: 3px; border-radius: var(--shape-full); background: var(--surface-2); }
#calendar .fc-button-group > .fc-button { border: 0; border-radius: var(--shape-full); background: transparent; box-shadow: none; }
#calendar .fc-button-group > .fc-button:hover { background: var(--surface); }
#calendar .fc-button-group > .fc-button.fc-button-active { background: var(--primary); color: var(--on-primary); box-shadow: 0 4px 10px -4px rgba(10, 98, 199, .5); }
#calendar .fc-timegrid-event, #calendar .fc-daygrid-event { border-radius: var(--shape-sm); }
#calendar .fc-today-button { border-radius: var(--shape-full); padding-inline: 16px; }

/* KV-APP-KARTY: edycja użytkownika - formularz po lewej, zdjęcie i akcje konta
   przyklejone po prawej (szeroki ekran); karty formularza z promieniem i cieniem. */
.uf-layout { display: grid; gap: 18px; align-items: start; }
.uf-side { display: grid; gap: 18px; min-width: 0; }
.uf-main { min-width: 0; }
.uf-layout .form-card { max-width: none; border-radius: var(--shape-lg); box-shadow: var(--shadow-card); }
.uf-main .form-card { max-width: 760px; }
@media (min-width: 1100px) {
  .uf-layout--side { grid-template-columns: minmax(0, 760px) minmax(320px, 400px); }
  .uf-side { position: sticky; top: 76px; }
}
/* KV-APP-KARTY: wybory w rzędzie (np. „Czego uczę") jako pigułki - cała pigułka
   klikalna, zaznaczona w kolorze marki (krok w stronę KV-APP-CHECKBOX). */
.pz-chip-row .pz-checkbox-lbl { display: inline-flex; align-items: center; gap: 8px; min-height: 36px; padding: 4px 14px 4px 10px; border: 1px solid var(--border); border-radius: var(--shape-full); background: var(--surface); cursor: pointer; transition: background var(--motion-fast) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.pz-chip-row .pz-checkbox-lbl:hover { border-color: var(--primary-ring); }
.pz-chip-row .pz-checkbox-lbl:has(input:checked) { background: var(--primary-container); border-color: color-mix(in srgb, var(--primary) 35%, transparent); color: var(--on-primary-container); font-weight: var(--fw-semibold); }
.pz-chip-row .pz-checkbox-lbl input { accent-color: var(--primary); }
/* KV-APP-KARTY: zakładki długich stron panelu (pages/admin-zakladki.js). */
.adm-tabs { margin-bottom: 14px; }
.adm-panel.is-entering { animation: sk-panel-in 260ms cubic-bezier(.2, 0, 0, 1) both; }
@media (prefers-reduced-motion: reduce) {
  .adm-panel.is-entering { animation: none; }
}
/* SKLEP-ZAKLADKI-TELEFON (12.10): na telefonie zakładki karty produktu
   (Opis, Spis treści, Darmowa próbka...) zawijają się w dwa rzędy pigułek
   zamiast przewijania w bok, gdzie połowy nie było widać. Pasek nie przykleja
   się na telefonie - chował się pod nagłówkiem sklepu i zabierał ekran. */
.sk-tabbar { position: static; margin: 0; padding: 8px 0; background: transparent; backdrop-filter: none; border-bottom: 0; }
.pb-embedded .sk-tabbar { margin: 0; padding: 8px 0; }
.sk-tablist { flex-wrap: wrap; gap: 8px; overflow: visible; }
.sk-tab { min-height: 40px; padding: 0 14px; border-radius: var(--shape-full); background: var(--surface-2); border: 1px solid var(--border); font-size: var(--fs-sm); }
.sk-tab[aria-selected="true"] { background: var(--primary); border-color: var(--primary); color: var(--on-primary); }
.sk-tab[aria-selected="true"]:hover { background: var(--primary-hover); color: var(--on-primary); }
.is-tabbed .sk-tab-ink { display: none; }
.sk-tabs { scroll-margin-top: 120px; }
@media (min-width: 900px) {
  .sk-tabs { scroll-margin-top: 72px; }
  .sk-tabbar { position: sticky; margin: 0 calc(-1 * var(--page-gutter, 16px)); padding: 6px var(--page-gutter, 16px); background: color-mix(in srgb, var(--bg) 94%, transparent); backdrop-filter: blur(10px); border-bottom: 1px solid var(--border); }
  .pb-embedded .sk-tabbar { margin: 0 -6px; padding: 6px; }
  .sk-tablist { flex-wrap: nowrap; gap: 2px; overflow-x: auto; }
  .sk-tab { min-height: 46px; padding: 0 16px; border-radius: var(--shape-md); background: transparent; border: 0; font-size: var(--fs-base); }
  .sk-tab[aria-selected="true"] { background: transparent; color: var(--primary); }
  .sk-tab:hover, .sk-tab[aria-selected="true"]:hover { background: var(--surface-2); }
  .sk-tab[aria-selected="true"]:hover { color: var(--primary); }
  .is-tabbed .sk-tab-ink { display: block; }
}
/* KV-APP-UCZEN (12.10): profil ucznia (/uczen/{id}) i plan nauki (/plan/{id}) w wyglądzie
   kart sklepu - duże zaokrąglenie (--shape-lg) i miękki cień (--shadow-card) na każdej
   karcie i liście, ikony nagłówków w miękkim kafelku, stan pokazuje kolor ikony.
   Układ i działanie bez zmian. */

/* Nagłówek profilu i kafelki liczb: te same karty co reszta strony (był promień 10 bez cienia). */
.profile-head, .profile-stat { border-radius: var(--shape-lg); box-shadow: var(--shadow-card); }
.profile-stat { padding: 14px 16px; }
a.profile-stat { color: inherit; transition: box-shadow var(--motion-std) var(--ease-std), border-color var(--motion-std) var(--ease-std); }
@media (hover: hover) {
  a.profile-stat:hover { box-shadow: var(--shadow-card-hover); border-color: var(--primary-ring); }
}
/* „Tag i seria": <summary> z .pz-inline-block tracił flex przycisku - napis stał u góry
   wysokiego pudełka zamiast na środku. */
.profile-head summary.pz-summary-btn { display: inline-flex; align-items: center; }
.profile-head summary.pz-summary-btn::-webkit-details-marker { display: none; }

/* Następny krok: biała karta z ikoną w miękkim kółku zamiast szarej ramki z paskiem z lewej.
   Pomarańczowa ikona = krok nieustawiony, niebieska = ustawiony. */
.next-action {
  background: var(--surface); border: 1px solid var(--border); border-left-width: 1px;
  border-radius: var(--shape-lg); box-shadow: var(--shadow-card);
  padding: 16px; gap: 14px; align-items: flex-start;
}
html.dark .next-action { background: var(--surface); border-color: var(--border); }
.next-action-ico {
  flex: none; width: 44px; height: 44px; border-radius: var(--shape-full);
  display: grid; place-items: center;
  background: var(--primary-container); color: var(--primary);
}
.next-action-ico .material-symbols-outlined { font-size: var(--fs-2xl); font-variation-settings: 'FILL' 1, 'wght' 500, 'GRAD' 0, 'opsz' 24; }
.next-action--empty .next-action-ico { background: var(--c-warn-bg); color: var(--c-warn); }
.next-action-body { min-width: 0; }
.next-action-label {
  margin: 2px 0 2px; font-size: var(--fs-base); font-weight: var(--fw-bold); color: var(--text);
  text-transform: none; letter-spacing: -0.01em;
}
.next-action-text { font-size: var(--fs-base); font-weight: var(--fw-medium); line-height: var(--lh-base); overflow-wrap: anywhere; }
.next-action-text--empty { color: var(--text-2); font-weight: var(--fw-regular); }
.next-action-edit > summary { list-style: none; }
.next-action-edit > summary::-webkit-details-marker { display: none; }
.next-action-actions { margin-top: 10px; }
.next-action-edit .textarea { min-height: 80px; }
@media (min-width: 700px) {
  .next-action { padding: 18px 20px; gap: 16px; }
}

/* Puste stany w kartach profilu i planu: ikona w kółku nad tekstem, przerywana obwódka
   jak „pusty dzień" (było: szary prostokąt z samym tekstem). */
.today-empty.uc-empty {
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  padding: 22px 16px; background: var(--surface);
  border: 1.5px dashed var(--border-strong); border-radius: var(--shape-md);
  color: var(--text-2); font-size: var(--fs-base); line-height: var(--lh-base);
}
.today-empty.uc-empty > .material-symbols-outlined {
  width: 40px; height: 40px; border-radius: var(--shape-full); display: grid; place-items: center;
  background: var(--primary-container); color: var(--primary); font-size: var(--fs-xl);
}

/* Zakładka „Plan" w profilu: karta planu i lista najbliższych lekcji jak karty. */
.plan-summary, .up-list { border-radius: var(--shape-lg); box-shadow: var(--shadow-card); }
.plan-summary { border-color: var(--border); }
.up-list { border-color: var(--border); }
.up-row { padding-left: 16px; padding-right: 16px; }
.uc-sec-h { display: flex; align-items: center; gap: 8px; margin-top: 22px; font-weight: var(--fw-bold); }
.uc-sec-h > .material-symbols-outlined {
  display: inline-grid; place-items: center; flex: none; width: 30px; height: 30px;
  border-radius: var(--shape-sm); background: var(--primary-container); color: var(--primary); font-size: var(--fs-xl);
}

/* Konta rodziców: rozwijane formularze jako wiersz-przycisk z ikoną w kafelku i strzałką
   zamiast gołego trójkąta przeglądarki. */
.dr-rodo .pz-acc-summary {
  list-style: none; display: flex; align-items: center; gap: 10px;
  min-height: 48px; padding: 8px 12px; margin-top: 8px;
  border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface);
  font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--text);
  transition: border-color var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std);
}
.dr-rodo .pz-acc-summary::-webkit-details-marker { display: none; }
.dr-rodo .pz-acc-summary:hover { border-color: var(--primary-ring); background: var(--surface-2); }
.dr-rodo .pz-acc-summary > .material-symbols-outlined:first-child {
  flex: none; width: 30px; height: 30px; display: grid; place-items: center;
  border-radius: var(--shape-sm); background: var(--primary-container); color: var(--primary); font-size: var(--fs-xl);
}
.dr-rodo .uc-acc-txt { flex: 1; min-width: 0; }
.dr-rodo .uc-acc-chev { flex: none; color: var(--text-3); font-size: var(--fs-xl); transition: transform var(--motion-fast) var(--ease-std); }
.dr-rodo details[open] > .pz-acc-summary .uc-acc-chev { transform: rotate(180deg); }
.dr-rodo details[open] > .pz-sp-stack-box { margin-top: 8px; }

/* Strefa niebezpieczna: kafelek ikony w kolorze ostrzeżenia, nie niebieski jak reszta. */
.dr-danger { background: var(--surface); border-color: color-mix(in srgb, var(--c-rej) 35%, var(--border)); }
.dr-danger .card-h > .material-symbols-outlined:first-child { background: var(--c-rej-bg); color: var(--c-rej); }

/* Plan nauki: nagłówek, następna lekcja, listy lekcji i panele boczne jako jedna rodzina
   kart (było: promień 10 bez cienia na listach i panelach, 16 z cieniem na nagłówku). */
.plan-head, .plan-next { border-color: var(--border); box-shadow: var(--shadow-card); }
.plan-next.is-due { box-shadow: 0 0 0 3px var(--state-focus-primary), var(--shadow-card); }
.plan-list, .panel-card { border-color: var(--border); border-radius: var(--shape-lg); box-shadow: var(--shadow-card); }
.panel-card { padding: 16px; gap: 12px; }
.panel-card-h h2 { gap: 8px; font-weight: var(--fw-bold); }
.panel-card-h h2 > .material-symbols-outlined:first-child {
  display: inline-grid; place-items: center; flex: none; width: 30px; height: 30px;
  border-radius: var(--shape-sm); background: var(--primary-container); color: var(--primary); font-size: var(--fs-xl);
}
.plan-kpis > div { border-radius: var(--shape-md); padding: 10px 12px; }
.plan-bulk { border-radius: var(--shape-lg); border-color: var(--border-strong); background: var(--surface); }
.plan-bulk[open] { border-color: var(--border); box-shadow: var(--shadow-card); }
.plan-bulk-sum > .material-symbols-outlined { color: var(--primary); }
/* Rozwinięta lekcja: uchwyt i pole wyboru zostają przy wierszu z datą, nie w połowie formularza. */
.lrow:has(> .lrow-details[open]) > .lrow-handle,
.lrow:has(> .lrow-details[open]) > .pz-bulk-pick { align-self: flex-start; margin-top: 16px; }
/* „termin ustalony" to informacja, nie filtr: niska plakietka bez efektu najechania
   (na telefonie dziedziczyła 44 px wysokości dotykowej i wyglądała jak przycisk). */
.uc-pay-rows .chip { height: auto; min-height: 0; padding: 3px 10px; border-color: var(--border); cursor: default; font-weight: var(--fw-medium); }
.uc-pay-rows .chip::before { content: none; }
/* Licznik w nagłówku karty (Notatki, Zasoby) jako pigułka jak w zakładkach, nie samotne „0". */
.card-h .uc-count {
  margin-left: auto; padding: 2px 9px; border-radius: var(--shape-full);
  background: var(--surface-2); color: var(--text-2); font-size: var(--fs-xs); font-weight: var(--fw-semibold);
}
/* Telefon: piąty kafelek liczb („Do zapłaty") stał sam w pół szerokości - zajmuje cały rząd. */
.profile-stats > .profile-stat:last-child:nth-child(odd) { grid-column: 1 / -1; }
/* Telefon: temat lekcji w wierszu planu zawija się (do 3 linii) zamiast ucinać po 20 znakach. */
.lrow-main small { white-space: normal; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3; }
@media (min-width: 600px) {
  .profile-stats > .profile-stat:last-child:nth-child(odd) { grid-column: auto; }
}
@media (min-width: 700px) {
  .lrow-main small { display: block; white-space: nowrap; -webkit-line-clamp: none; line-clamp: none; }
}
/* Program planu: karta bez starego niebieskiego paska z lewej, ikona tytułu w kafelku
   jak w nagłówkach kart. */
.ptp-card.prog { border-left-width: 1px; border-left-color: var(--border); }
.prog-title { gap: 8px; font-weight: var(--fw-bold); }
.prog-title > .material-symbols-outlined:first-child {
  display: inline-grid; place-items: center; flex: none; width: 30px; height: 30px;
  border-radius: var(--shape-sm); background: var(--primary-container); color: var(--primary); font-size: var(--fs-xl);
}
.prog-distribute-sum > .material-symbols-outlined { color: var(--primary); }
/* KV-APP-WIADOMOSCI (12.10): „Wyślij wiadomość" i panel powiadomień e-mail.
   - grupa adresatów jako karty wyboru (było: gołe radio przeglądarki); prawdziwe
     radio zostaje w karcie - strzałki, Tab i czytnik ekranu działają jak wcześniej,
   - przełączniki „Wysyłaj" i pilotaż jako suwak (stan widać kolorem),
   - picker grup szablonów jako pigułkowy tor (na telefonie przewijany w poziomie
     zamiast sześciu wierszy przycisków),
   - nagłówek karty szablonu: kafelek ikony w kolorze stanu, tytuł nie ucieka
     pod chevron na telefonie, licznik z 30 dni po prawej na komputerze,
   - `.field[hidden]`: wybór ucznia był widoczny przy każdej grupie (display:flex
     z `.field` wygrywał z atrybutem hidden),
   - placeholdery w czcionce o stałej szerokości (JetBrains Mono nie jest w vendor,
     więc `.pz-kbd` spadał na domyślny szeryf przeglądarki). */
.pz-kbd { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 0.92em; }
.field[hidden] { display: none; }

.mp-pick-grid { display: grid; gap: 8px; }
.mp-pick { position: relative; display: flex; align-items: center; gap: 12px; min-height: 56px; padding: 10px 14px; border: 1.5px solid var(--outline-variant); border-radius: var(--shape-lg); background: var(--surface); cursor: pointer; transition: border-color var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std); }
@media (hover: hover) { .mp-pick:hover { border-color: var(--primary); } }
.mp-pick input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }
.mp-pick-ico { flex: none; width: 36px; height: 36px; display: grid; place-items: center; border-radius: var(--shape-md); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-xl); transition: background var(--motion-fast) var(--ease-std), color var(--motion-fast) var(--ease-std); }
.mp-pick-body { flex: 1; min-width: 0; display: grid; gap: 2px; }
.mp-pick-title { font-size: var(--fs-md); font-weight: var(--fw-semibold); color: var(--text); line-height: 1.3; }
.mp-pick-sub { font-size: var(--fs-sm); color: var(--text-2); }
.mp-pick-check { flex: none; font-size: var(--fs-xl); color: var(--primary); opacity: 0; transform: scale(.6); transition: opacity var(--motion-fast) var(--ease-std), transform var(--motion-fast) var(--ease-std); font-variation-settings: 'FILL' 1; }
.mp-pick:has(input:checked) { border-color: var(--primary); background: var(--primary-container); box-shadow: var(--shadow-card); }
.mp-pick:has(input:checked) .mp-pick-ico { background: var(--primary); color: var(--on-primary); }
.mp-pick:has(input:checked) .mp-pick-check { opacity: 1; transform: none; }
.mp-pick:has(input:focus-visible) { outline: 2px solid var(--primary); outline-offset: 2px; }

.mp-ph-hint { font-size: var(--fs-sm); color: var(--text-2); line-height: var(--lh-base); }
.mp-ph-hint .pz-kbd { white-space: nowrap; }
.mp-compose-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.mp-compose-actions > .btn { justify-content: center; }
.mp-compose-actions > .btn.accent { grid-column: 1 / -1; }
.mp-row-actions { white-space: nowrap; width: auto; }
.mp-row-actions > * { vertical-align: middle; }
.mp-row-actions > form { display: inline-block; margin: 0 0 0 4px; }

.mp-switch { position: relative; display: inline-flex; align-items: center; gap: 10px; min-height: 40px; font-size: var(--fs-md); font-weight: var(--fw-semibold); color: var(--text); cursor: pointer; user-select: none; }
.mp-switch input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; }
.mp-switch-track { position: relative; flex: none; width: 38px; height: 22px; border-radius: var(--shape-full); background: var(--outline); transition: background var(--motion-fast) var(--ease-std); }
.mp-switch-track::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: var(--surface); box-shadow: var(--elev-1); transition: transform var(--motion-fast) var(--ease-std); }
.mp-switch input:checked + .mp-switch-track { background: var(--c-ok); }
.mp-switch input:checked + .mp-switch-track::after { transform: translateX(16px); }
.mp-switch input:focus-visible + .mp-switch-track { outline: 2px solid var(--primary); outline-offset: 2px; }

.mp-picker { display: flex; gap: 4px; overflow-x: auto; padding: 4px; border: 1px solid var(--outline-variant); border-radius: var(--shape-full); background: var(--surface); box-shadow: var(--shadow-card); scrollbar-width: none; overscroll-behavior-x: contain; }
.mp-picker::-webkit-scrollbar { display: none; }
.mp-picker > .btn { flex: none; border-color: transparent; background: transparent; box-shadow: none; border-radius: var(--shape-full); white-space: nowrap; }
.mp-picker > .btn:hover { background: var(--surface-2); }
.mp-picker > .btn.accent { background: var(--primary); color: var(--on-primary); box-shadow: var(--elev-1); }
/* KV-STRONA-1 review (05.11): zaznaczony segment przełącznika to nie główna akcja - bez klawisza i wciskania z `html .btn.accent:hover/:active`. */
html .mp-picker > .btn.accent:is(:hover, :active) { box-shadow: var(--elev-1); transform: none; }
.mp-picker > .btn.accent .dim-12 { color: inherit; opacity: .85; }

.tpl-card > summary.mp-tpl-sum { display: grid; grid-template-columns: auto auto minmax(0, 1fr); align-items: center; gap: 10px; }
.mp-tpl-ico { width: 34px; height: 34px; display: grid; place-items: center; border-radius: var(--shape-md); background: var(--primary-container); color: var(--primary); font-size: var(--fs-lg); }
.tpl-card.pz-tpl-off .mp-tpl-ico { background: var(--surface-2); color: var(--text-3); }
.mp-tpl-main { min-width: 0; display: grid; gap: 4px; }
.mp-tpl-main > strong { line-height: 1.3; }
.tpl-card.pz-tpl-off .mp-tpl-main > strong { color: var(--text-2); }
.mp-tpl-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.mp-tpl-tools { display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 8px; }
.mp-tpl-tools > .mp-switch { grid-column: 1 / -1; }
.mp-tpl-tools > .spacer { display: none; }
.mp-tpl-tools > .btn { justify-content: center; }
@media (min-width: 700px) {
  .mp-tpl-tools { display: flex; flex-wrap: wrap; }
  .mp-tpl-tools > .spacer { display: block; flex: 1; }
  .mp-pick-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mp-compose-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; }
  .mp-picker { flex-wrap: wrap; overflow-x: visible; border-radius: var(--shape-xl); }
  .mp-head > div:first-child { flex: 1 1 420px; min-width: 0; }
}
@media (min-width: 900px) {
  .mp-tpl-main { grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 12px; }
  .mp-tpl-meta { justify-content: flex-end; flex-wrap: nowrap; }
  .mp-tpl-count { min-width: 84px; text-align: right; }
}
@media (prefers-reduced-motion: reduce) {
  .mp-pick, .mp-pick-ico, .mp-pick-check, .mp-switch-track, .mp-switch-track::after { transition: none; }
}
/* KV-APP-LEADY (12.10): lista leadów i szuflada leada w stylu sklepu.
   1) Tabela miała 9 kolumn i przy 1440 px wypadała za kartę (ostatnia kolumna
      ucięta, przy 1100 px przewijanie w bok). Teraz 6 kolumn: ocena obok imienia,
      tagi pod imieniem, przypisany pod statusem. Od 901 px stały układ kolumn
      (table-layout: fixed) - tabela zawsze ma szerokość karty, długie teksty
      kończą się wielokropkiem (pełne w szufladzie). 901-1099 px: imię, kontakt,
      status; od 1100 px dochodzą przedmiot i data.
   2) Imię jest przyciskiem z data-lead-open (szuflada także z klawiatury).
   3) Szuflada: nagłówki sekcji z ikoną w kafelku, białe karty --shape-lg na
      jasnym tle, akcje w równej siatce, puste wartości jako ciche teksty. */
.leady-toolbar { flex-wrap: nowrap; }
.leady-toolbar .search { flex: 1 1 0; min-width: 0; }
.leady-toolbar > .filters-popover { flex: none; }
.lead-caret { margin-left: -4px; }

.leady-tbl .lead-name-line { display: flex; align-items: center; gap: 6px; min-width: 0; }
.leady-tbl .lead-open-name {
  display: block; min-width: 0; max-width: 100%; padding: 0; margin: 0;
  background: none; border: 0; color: var(--text); font: inherit; font-weight: var(--fw-semibold);
  text-align: left; cursor: pointer;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.leady-tbl .lead-open-name:hover { color: var(--primary); }
.leady-tbl .lead-score { flex: none; gap: 2px; margin: 0; padding: 1px 8px 1px 6px; }
.leady-tbl .lead-score .material-symbols-outlined { font-size: var(--fs-md); font-variation-settings: 'FILL' 1; }
.leady-tbl .lead-row-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.leady-tbl .lead-row-tags .tag { margin: 0; }
.leady-tbl .lead-assignee { display: none; }
.leady-tbl .lead-col-wide { display: none; }
.leady-tbl .lead-th-score { margin-left: 10px; color: var(--text-3); }
.leady-tbl .lead-th-score:hover { color: var(--primary); }
.leady-tbl .col-actions .icon-btn { color: var(--text-3); }
.leady-tbl tr.row:hover .col-actions .icon-btn { color: var(--primary); }

@media (min-width: 901px) {
  .leady-tbl { overflow-x: hidden; }
  .leady-tbl table.leads { table-layout: fixed; }
  .leady-tbl .lead-th-contact { width: 30%; }
  .leady-tbl .lead-th-status { width: 148px; }
  .leady-tbl th.lead-th-who { white-space: normal; }
  .leady-tbl th.col-actions { width: 52px; }
  .leady-tbl td.col-actions { padding: 0 10px 0 0; }
  .leady-tbl .who-cell, .leady-tbl .who-meta { min-width: 0; }
  .leady-tbl .who-meta { flex: 1 1 auto; }
  .leady-tbl .who-extra { max-width: 100%; }
  .leady-tbl td.contact { overflow: hidden; }
  .leady-tbl td.contact a { max-width: 100%; }
  .leady-tbl td.subj { min-width: 0; overflow-wrap: anywhere; }
  .leady-tbl .lead-assignee { display: block; margin-top: 6px; padding-left: 6px; font-size: var(--fs-sm); }
  .leady-tbl .lead-assignee .mini-avatar { width: 20px; height: 20px; }
  .leady-tbl td.status-td { white-space: nowrap; }
}
@media (min-width: 1100px) {
  .leady-tbl .lead-col-wide { display: table-cell; }
  .leady-tbl .lead-th-contact { width: 19%; }
  .leady-tbl .lead-th-subj { width: 16%; }
  .leady-tbl .lead-th-date { width: 104px; }
}

/* Szuflada leada (tylko podgląd; edycja zostaje na zwykłym tle formularza). */
.lead-drawer .drawer-sub span { display: block; }
.lead-drawer-view { background: var(--surface-1); }
.lead-drawer .drawer-quick { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
.lead-drawer .drawer-quick .btn { width: 100%; justify-content: center; }
.lead-drawer .drawer-quick .btn.accent { grid-column: 1 / -1; }
.lead-drawer-view .dr-section,
.lead-drawer-view section + section {
  margin-top: 0; padding: 16px 18px;
  background: var(--surface);
  border: 1px solid var(--outline-variant);
  border-radius: var(--shape-lg);
  box-shadow: var(--shadow-card);
}
.lead-drawer-view .dr-section-label {
  display: flex; align-items: center; gap: 10px; margin-bottom: 14px;
  font-size: var(--fs-md); font-weight: var(--fw-bold); color: var(--text);
  text-transform: none; letter-spacing: -0.005em;
}
.lead-drawer-view .dr-section-label > .material-symbols-outlined {
  display: inline-grid; place-items: center; flex: none;
  width: 28px; height: 28px; border-radius: var(--shape-sm);
  background: var(--primary-container); color: var(--primary);
  font-size: var(--fs-lg);
}
.lead-drawer-view .dr-count {
  display: inline-grid; place-items: center; min-width: 22px; height: 20px; padding: 0 6px;
  border-radius: var(--shape-full); background: var(--surface-2); color: var(--text-2);
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
}
.lead-drawer-view .dr-rodo .dr-section-label > .material-symbols-outlined { background: var(--c-prog-bg); color: var(--c-prog); }
.lead-drawer-view .dr-danger .dr-section-label > .material-symbols-outlined { background: var(--c-rej-bg); color: var(--c-rej); }
.lead-drawer-view .dr-rodo { background: var(--surface); border-color: var(--outline-variant); }
.lead-drawer-view .dr-danger { background: color-mix(in srgb, var(--c-rej-bg) 40%, var(--surface)); border-color: color-mix(in srgb, var(--c-rej) 22%, var(--outline-variant)); }
.lead-drawer-view .dr-value { font-weight: var(--fw-medium); }
.lead-drawer-view .dr-empty { margin: 0; color: var(--text-3); font-size: var(--fs-sm); line-height: var(--lh-base); }
.lead-drawer-view .dr-notes { background: var(--surface-1); line-height: var(--lh-base); }
.lead-drawer-view .attach-drop-text strong { display: inline-flex; align-items: center; gap: 6px; }
.lead-drawer-view .attach-drop-text .material-symbols-outlined { font-size: var(--fs-lg); }
.lead-drawer-view .attach-drop { background: var(--surface-1); }
.lead-drawer-view .timeline { gap: 10px; }
.lead-drawer-view .timeline-avatar { width: 30px; height: 30px; background: var(--primary-container); border-color: transparent; color: var(--primary); }
.lead-drawer-view .timeline-body { background: var(--surface-1); border-radius: var(--shape-md); padding: 8px 12px 10px; }
.lead-drawer-view .timeline-meta { min-height: 28px; }
.lead-drawer-view .timeline-meta .icon-btn { width: 32px; height: 32px; margin: -4px -8px -4px 0; color: var(--text-3); }
.lead-drawer-view .timeline-meta .icon-btn:hover { color: var(--c-rej); }
.lead-drawer-view .timeline-text { margin-top: 2px; }
.lead-drawer-view .danger-row form { margin: 0; flex: 1 1 auto; }
.lead-drawer-view .danger-row .btn { width: 100%; }
@media (min-width: 600px) {
  .lead-drawer .dr-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .lead-drawer .drawer-quick { grid-template-columns: repeat(auto-fit, minmax(112px, 1fr)); }
}
/* KV-APP-KOREPETYTOR-RODZIC (12.10): przegląd ekranów korepetytora i rodzica
   w wyglądzie sklepu (karty, pigułki, stan kolorem ikony). Bez zmian układu. */

/* Telefon: pole wyszukiwania w górnym pasku to sama ikona 44 px. Szerokość
   44 px przegrywała z `flex-basis: 360px`, więc pigułka zjadała pasek
   i okruszki kurczyły się do „P…" / „K…". */
.topbar-search { flex: 0 0 44px; }
@media (min-width: 700px) {
  .topbar-search { flex: 0 1 360px; }
}

/* Karty rodzica: nagłówek <h2> miał domyślny margines przeglądarki (12 px)
   nad sobą - góra karty wyższa niż boki. W sekcji (flex z odstępem 16 px)
   karty dostawały jeszcze 18 px marginesu - podwójny odstęp. */
.parent-card-h { margin-top: 0; }
#main-content .parent-section > .parent-card + .parent-card { margin-top: 0; }
/* „Lekcje i ceny": cel dotykowy 44 px, ale tekst przyklejony do góry
   (summary to list-item) - pusta dziura nad przyciskiem „Zapłać". */
.pz-pay-summary:not(.btn) { display: flex; align-items: center; gap: 6px; }
/* Wszystkie tematy planu: na telefonie stan mówi kolor ikony, a napis
   „Zrealizowany" zostaje dla czytnika ekranu (tytuły tematów miały 3 słowa w linii). */
.pz-pool-status {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
@media (min-width: 600px) {
  .pz-pool-status {
    position: static; width: auto; height: auto; margin: 0 0 0 auto;
    overflow: visible; clip: auto;
  }
}

/* Konto: dane obok etykiet zamiast na drugim końcu szerokiej karty;
   podpowiedź o kalendarzu Google jako bursztynowa ramka (była czerwona jak błąd). */
.kp-acc-data { max-width: 560px; }
.kp-callout { border-radius: var(--shape-md); color: var(--text); }
.kp-callout > .material-symbols-outlined { color: var(--c-prog); font-size: var(--fs-lg); vertical-align: -3px; }

/* Rozliczenie: status w kafelku KPI na wysokości liczb z sąsiednich kafelków. */
.kp-kpi-status {
  display: flex; align-items: center; justify-content: center; gap: 4px;
  min-height: calc(var(--fs-3xl) * 1.05); font-size: var(--fs-xl); font-weight: var(--fw-bold);
}
.kp-kpi-status:not(.pz-billing-total) { color: var(--text-2); }
/* Podsumowanie kwot (wspólne z panelem admina): kwoty oddzielone, czytelniejsze. */
.pay-split { justify-content: flex-start; gap: 12px 28px; }
.pay-split .mono { font-size: var(--fs-lg); }
@media (min-width: 600px) {
  .pay-split > div + div { padding-left: 28px; border-left: 1px solid var(--outline-variant); }
}

/* Uczeń (widok korepetytora): stan lekcji kolorem daty i przycisku stanu
   zamiast grubego paska z lewej. Aktywny stan nie miał żadnego wyglądu
   (klasa `.is-on` stylowana tylko w `.lesson-card-status`). */
.pz-sv-lesson { border-left-width: 1px; border-left-color: var(--outline-variant); }
.pz-sv-lesson--done, .pz-sv-lesson--rescheduled, .pz-sv-lesson--skipped { border-left-color: var(--outline-variant); }
.kp-sv-date {
  padding: 6px 0; border-radius: var(--shape-sm); line-height: var(--lh-tight);
  background: color-mix(in srgb, var(--primary) 10%, transparent); color: var(--primary);
}
.kp-sv-date .pz-dim-10, .kp-sv-date .pz-faint-10 { color: inherit; }
.pz-sv-lesson--done .kp-sv-date { background: var(--c-ok-bg); color: var(--c-ok); }
.pz-sv-lesson--rescheduled .kp-sv-date { background: var(--c-new-bg); color: var(--c-new); }
.pz-sv-lesson--skipped .kp-sv-date { background: var(--surface-3); color: var(--text-3); }
.pz-sv-lesson .btn.is-on { background: var(--surface-3); border-color: var(--border-strong); color: var(--text); }
.pz-sv-lesson--done .btn.is-on { background: var(--c-ok-bg); color: var(--c-ok); border-color: color-mix(in srgb, var(--c-ok) 35%, transparent); }
.pz-sv-lesson--rescheduled .btn.is-on { background: var(--c-new-bg); color: var(--c-new); border-color: color-mix(in srgb, var(--c-new) 35%, transparent); }
.pz-sv-lesson--skipped .btn.is-on { background: var(--c-rej-bg); color: var(--c-rej); border-color: color-mix(in srgb, var(--c-rej) 35%, transparent); }
/* Ikony przy drobnym tekście (Edytuj, Zmień termin, notatka, e-mail rodzica)
   miały domyślne 24 px przy 12 px tekstu. */
.pz-sv-lesson .pz-summary-btn { display: inline-flex; align-items: center; gap: 4px; }
.pz-sv-lesson .pz-summary-btn .material-symbols-outlined,
.pz-sv-lesson .pz-dim-12 > .material-symbols-outlined,
.pz-sv-lesson .pz-fs-11 > .material-symbols-outlined,
.pz-row-box-12 .dim-12 .material-symbols-outlined { font-size: var(--fs-lg); vertical-align: -3px; }
/* Materiały do następnej lekcji: karta z poświatą marki zamiast paska z lewej. */
.kp-next-materials { background: linear-gradient(135deg, var(--primary-container) 0%, var(--surface) 70%); }

/* Kalendarz: przełącznik widoków i strzałki jako tor z pigułkami (jak .tabs). */
#calendar .fc-button-group {
  gap: 2px; padding: 3px; border-radius: var(--shape-full);
  background: var(--surface-2); border: 1px solid var(--outline-variant);
}
#calendar .fc-button-group > .fc-button {
  margin: 0; border-color: transparent; background: transparent; box-shadow: none;
  border-radius: var(--shape-full);
}
#calendar .fc-button-group > .fc-button:not(.fc-button-active):not(:disabled):hover { background: var(--surface); }
#calendar .fc-button-group > .fc-button.fc-button-active { background: var(--primary); border-color: var(--primary); box-shadow: var(--shadow-xs); }
/* Przycisk „Dzień wolny" pod datą w każdej kolumnie (krótka „śr. 14.10"
   mieściła go obok siebie, reszta pod spodem - nierówny nagłówek). */
#calendar .fc-col-header-cell .fc-scrollgrid-sync-inner:has(.week-off-btn) {
  display: flex; flex-direction: column; align-items: center; gap: 4px; padding-bottom: 6px;
}
#calendar .fc-col-header-cell .week-off-btn { margin-left: 0; }
/* Rezerwacje rodzica: stan mówi pigułka z ikoną (bez paska z lewej karty
   i bez emoji); odstęp między kartami jak w reszcie strefy rodzica. */
.pz-rv-booking, .pz-rv-booking--pending, .pz-rv-booking--confirmed, .pz-rv-booking--rejected { border-left-width: 1px; border-left-color: var(--border); }
#main-content .pz-rv-booking + .pz-rv-booking { margin-top: 4px; }
.pz-status-pill { display: inline-flex; align-items: center; gap: 4px; }
.pz-status-pill > .material-symbols-outlined { font-size: var(--fs-md); }
/* Rezerwacje korepetytora: „Potwierdź" / „Odrzuć" obok siebie, napis na środku
   przycisku (summary miało display: inline-block - tekst przy górnej krawędzi);
   rozwinięty formularz zajmuje cały wiersz. Ikony przy tekście 13 px w rozmiarze tekstu. */
.kp-bk-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-start; }
.kp-bk-actions > details[open] { flex: 1 1 100%; }
.kp-bk-actions > details > summary { list-style: none; }
.kp-bk-actions > details > summary::-webkit-details-marker { display: none; }
.kp-bk-card .pz-dim-13 > .material-symbols-outlined,
.kp-bk-card .pz-fs-12 > .material-symbols-outlined,
.kp-bk-card .pz-rv-tutor-reply > .material-symbols-outlined { font-size: var(--fs-lg); vertical-align: -3px; }
/* Tabela rozliczenia: plakietka poziomu to etykieta, nie przycisk - bez
   telefonowego minimum 44 px (pigułka rosła w koło). */
.pz-tbl-12 td .chip { min-height: 0; }
/* Ramki ostrzegawcze w panelu korepetytora (np. „2 oczekujące rezerwacje"):
   zaokrąglenie i wcięcie jak karty obok. */
.pz-banner-warn, .pz-banner-warn-row { border-radius: var(--shape-lg); padding: 14px 20px; background: var(--c-warn-bg); }
/* Strefa rodzica, „Oczekuje na potwierdzenie" / „Ostatnie decyzje": bez paska
   z lewej (stan mówi nagłówek z ikoną), tytuł w kolorze tekstu jak w innych kartach. */
.pz-st-pending-card { border-left-width: 1px; border-left-color: var(--border); }
.pz-st-pending-title { color: var(--text); }
.pz-st-pending-row { background: var(--surface-2); }
/* PD do oceny: karta bez pomarańczowego paska z lewej (zakładka mówi, co to jest). */
.pz-card-warn-l { border-left-width: 1px; border-left-color: var(--outline-variant); }
/* Konto korepetytora, wizytówka na stronie rezerwacji: na telefonie mniejsze
   zdjęcie i przycisk pod spodem (opis łamał się po jednym słowie w linii). */
#profil-publiczny .pb-chosen { flex-wrap: wrap; }
#profil-publiczny .pb-chosen .acc-photo-img { width: 56px; height: 56px; font-size: var(--fs-xl); }
#profil-publiczny .pb-chosen > .pz-flex-1 { min-width: 180px; }
@media (min-width: 600px) {
  #profil-publiczny .pb-chosen .acc-photo-img { width: 88px; height: 88px; font-size: var(--fs-3xl); }
}
/* NAWIGACJA-SZYBKA (12.10): pasek postępu przy przejściu na inną stronę
   (pages/nawigacja.js) - zamiast kręcącego się kółka w karcie przeglądarki. */
.nav-progress { position: fixed; inset: 0 0 auto 0; z-index: var(--z-skip); height: 3px; pointer-events: none; opacity: 0; overflow: hidden; transition: opacity 120ms linear; }
.nav-progress::before { content: ""; position: absolute; inset: 0; width: 40%; background: linear-gradient(90deg, var(--primary), var(--accent-cyan)); border-radius: var(--shape-full); animation: nav-progress-run 1.1s cubic-bezier(.4, 0, .2, 1) infinite; }
html.is-navigating .nav-progress { opacity: 1; }
@keyframes nav-progress-run { from { transform: translateX(-100%); } to { transform: translateX(250%); } }
@media (prefers-reduced-motion: reduce) {
  .nav-progress::before { width: 100%; animation: none; }
}

/* SKLEP-W-PANELU (12.10): sklep w ramce w panelu (/konto/sklep, courses/shop_frame.html).
   Ramka bez własnego przewijania - wysokość ustawia pages/konto-sklep.js z wiadomości
   sklepu. Tło sklepu (zawsze jasny motyw) także w ciemnym motywie panelu, a
   `color-scheme: light` na ramce, żeby przeglądarka nie malowała pod nią
   nieprzezroczystego tła innego schematu. */
.skp-wrap { background: var(--sk-bg); border-radius: var(--shape-lg); padding: 4px 0; color-scheme: light; }
/* Na telefonie pływający koszyk stoi 80-132 px (+ pasek home iPhone'a) nad dołem ekranu, a .page
   ma 96 px zapasu - bez marginesu zasłaniał stopkę z dokumentami (SKLEP-KOSZYK-DARK, 15.10).
   Mobile-first: od 900 px (bez dolnego paska) margines znika. */
.skp-wrap { margin-bottom: calc(52px + env(safe-area-inset-bottom, 0px)); }
.skp-frame { display: block; width: 100%; min-height: 70vh; border: 0; background: transparent; color-scheme: light; }
.skp-frame.is-sized { min-height: 0; }
/* SKLEP-KOSZYK-WIDOCZNY (15.10): pływający koszyk panelu - nad dolnym paskiem na telefonie. */
.skp-cart-fab { position: fixed; right: 16px; bottom: calc(var(--bottom-nav-h) + 16px + env(safe-area-inset-bottom, 0px)); z-index: var(--z-sticky);
  display: inline-flex; align-items: center; gap: 8px; min-height: 52px; padding: 0 20px; border-radius: var(--shape-full);
  background: var(--sk-primary, var(--primary)); color: var(--sk-on-primary); font-weight: var(--fw-bold); font-size: var(--fs-md); text-decoration: none;
  box-shadow: 0 10px 24px -8px rgba(10, 98, 199, .6); transition: transform var(--motion-fast) var(--ease-std); }
.skp-cart-fab:hover { background: var(--sk-primary-hover, var(--primary)); color: var(--sk-on-primary); transform: translateY(-2px); }
.skp-cart-fab[hidden] { display: none; }
.skp-cart-fab .material-symbols-outlined { font-size: var(--fs-xl); }
.skp-cart-count { display: inline-grid; place-items: center; min-width: 24px; height: 24px; padding: 0 7px; border-radius: var(--shape-full); background: var(--sk-on-primary); color: var(--sk-primary, var(--primary)); font-size: var(--fs-sm); font-weight: var(--fw-bold); line-height: 1; }
.skp-cart-count[hidden] { display: none; }
@media (min-width: 901px) { .skp-cart-fab { right: 28px; bottom: 28px; } }
@media (min-width: 600px) {
  .skp-wrap { padding: 8px 6px; }
}
@media (min-width: 900px) {
  .skp-wrap { padding: 12px 10px; margin-bottom: 0; }
}
/* KOR-DANE (12.10): notatki wewnętrzne szkoły w profilu ucznia korepetytora (tylko do odczytu). */
.kor-school-notes { margin: 0; white-space: pre-line; overflow-wrap: anywhere; }

/* KV-APP-RESZTKI (12.10): ostatnie resztki starego wyglądu po KV-APP-KARTY.
   1) KV-APP-WIERSZE-TELEFON: opis w wierszu `.pz-row-box-12` miał `flex: 1`
      (zerowa baza) i na telefonie obok kwoty, plakietek i przycisków łamał się
      litera po literze (finanse, RODO, kosz, rezerwacje, uczeń korepetytora).
      Poprawka z zakładki Płatności (`.uc-pay-rows`) teraz globalnie: opis ma bazę
      11rem i zawija się całymi słowami, reszta schodzi pod spód (wiersz zawija
      się do 700 px). Na desktopie bez zmian (nowrap, opis i tak szerszy).
   2) Bez grubych pasków z lewej: kafelki „Do ułożenia" i dostępność w siatce
      kalendarza jako przyciemniona karta z cienką ramką; callout informacyjny
      z ikoną w kolorze marki.
   3) Formularz leada (szuflada „Edytuj" i modal „Nowy lead"): sekcje jako białe
      karty z ikoną w kafelku jak podgląd leada; przyciski na dole zawsze widoczne.
   4) Szuflady: RODO i strefa niebezpieczna na tokenach (ciemny motyw miał jasne
      beżowe i różowe tło z białym tekstem).
   5) Suwaki w ciemnym motywie: gałka jasna (była w kolorze ciemnej karty). */
.pz-row-box-12 > .pz-flex-min,
.pz-row-box-12 > .pz-flex-1 { flex: 1 1 11rem; min-width: 0; }
/* Sam opis i kwota na końcu (np. „Najwyższe salda"): mieszczą się w jednej linii,
   kwota nie spada pod imię. */
.pz-row-box-12 > .pz-flex-min:nth-last-child(2):has(+ span.pz-shrink-0:last-child) { flex-basis: 6rem; }

.pool-item {
  border: 1px solid color-mix(in srgb, var(--primary) 18%, var(--outline-variant));
  border-radius: var(--shape-md);
  background: color-mix(in srgb, var(--primary-container) 40%, var(--surface));
}
.pool-item-main { border-radius: var(--shape-md); }
.pool-item-open { color: var(--primary); }
#calendar .fc-bg-event.cal-bg--av {
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--cal-done) 45%, transparent);
  border-radius: var(--shape-xs);
}

.pz-callout-info { border-left-width: 1px; line-height: var(--lh-base); }
.pz-callout-info > .material-symbols-outlined:first-child { color: var(--primary); font-size: var(--fs-lg); vertical-align: -4px; }

.drawer .dr-rodo { background: color-mix(in srgb, var(--c-prog-bg) 40%, var(--surface)); border-color: color-mix(in srgb, var(--c-prog) 22%, var(--outline-variant)); }
.drawer .dr-danger { background: color-mix(in srgb, var(--c-rej-bg) 40%, var(--surface)); border-color: color-mix(in srgb, var(--c-rej) 22%, var(--outline-variant)); }

.lead-form { display: flex; flex-direction: column; gap: 12px; background: var(--surface-1); }
.lead-form .lf-sec {
  min-width: 0; margin: 0; padding: 16px 16px 2px;
  background: var(--surface); border: 1px solid var(--outline-variant);
  border-radius: var(--shape-lg); box-shadow: var(--shadow-card);
}
.lf-sec-h {
  display: flex; align-items: center; gap: 10px; margin-bottom: 14px;
  font-size: var(--fs-md); font-weight: var(--fw-bold); color: var(--text); letter-spacing: -0.005em;
}
.lf-sec-h > .material-symbols-outlined:first-child {
  display: inline-grid; place-items: center; flex: none;
  width: 28px; height: 28px; border-radius: var(--shape-sm);
  background: var(--primary-container); color: var(--primary); font-size: var(--fs-lg);
}
.lead-form .field-row { row-gap: 0; }
.lead-form .lf-hint { margin: -8px 0 14px; }
.lead-form .lf-paste { margin-top: -4px; }
.lead-form .lf-paste .btn { max-width: 100%; height: auto; min-height: 34px; padding-block: 6px; white-space: normal; text-align: left; }
.lf-notes-label { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.lead-form .lf-rodo { padding: 0; }
.lf-rodo > .lf-sec-h { margin: 0; padding: 14px 16px; min-height: 56px; cursor: pointer; list-style: none; border-radius: var(--shape-lg); }
.lf-rodo > .lf-sec-h::-webkit-details-marker { display: none; }
.lf-rodo > .lf-sec-h > .material-symbols-outlined:first-child { background: var(--c-prog-bg); color: var(--c-prog); }
.lf-rodo-t { flex: 1; min-width: 0; }
.lf-chev { flex: none; color: var(--text-3); transition: transform var(--motion-fast) var(--ease-std); }
.lf-rodo[open] > .lf-sec-h .lf-chev { transform: rotate(180deg); }
.lf-rodo > .lf-sec-h:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.lf-rodo > .rodo-body { padding: 2px 16px 2px; }

.lead-drawer-edit { padding: 0; gap: 0; overflow: hidden; }
.lead-drawer-edit > .lead-form { flex: 1; min-height: 0; overflow-y: auto; padding: 14px; }
.lead-drawer-edit > .drawer-foot { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; padding: 12px 14px; }
.lead-drawer-edit > .drawer-foot .btn { width: 100%; justify-content: center; }
@media (min-width: 600px) {
  .lead-form .lf-sec { padding: 18px 20px 4px; }
  .lead-form .lf-rodo { padding: 0; }
  .lf-rodo > .lf-sec-h { padding: 14px 20px; }
  .lf-rodo > .rodo-body { padding: 2px 20px 4px; }
  .lead-drawer-edit > .lead-form { padding: 18px 20px; }
  .lead-drawer-edit > .drawer-foot { display: flex; justify-content: flex-end; padding: 14px 20px; }
  .lead-drawer-edit > .drawer-foot .btn { width: auto; }
}

html.dark .mp-switch-track::after,
html.dark .cal-paint-track::after { background: var(--text); }
@media (prefers-reduced-motion: reduce) {
  .lf-chev { transition: none; }
}
/* NAWIGACJA-PLYNNA (13.10, „żeby wszędzie było tak smooth jak w ustawieniach
   szkoły"): przy przejściu między stronami menu boczne, górny pasek i dolny pasek
   na telefonie zostają w miejscu (podmieniają się bez przenikania), a wjeżdża tylko
   treść - tym samym ruchem co panel zakładki (sk-panel-in). Sklep: nagłówek stoi,
   treść wjeżdża. Przeglądarki bez przejść między dokumentami po prostu ładują stronę. */
.sidebar { view-transition-name: nav-sidebar; }
.topbar { view-transition-name: nav-topbar; }
.bottom-nav { view-transition-name: nav-bottom; }
/* SKLEP-PRZEJSCIA-WWW (04.11, właściciel: „smooth przepięcia", „dodać jakieś przejścia"): sklep i strona WWW są pod
   jedną domeną, więc przejście między nimi to też przejście dokumentów. Pasek nad nagłówkiem i nagłówek mają te same
   nazwy co na WordPressie (#sp-top = sp-topbar, #sp-hdr = sp-hdr) - stoją w miejscu także przy przejściu
   sklep <-> strona; wcześniej cały blok `.sk-top` miał nazwę znaną tylko sklepowi. */
.sk-top .zs-topbar { view-transition-name: sp-topbar; }
.sk-top .zh { view-transition-name: sp-hdr; }
::view-transition-old(nav-sidebar), ::view-transition-old(nav-topbar),
::view-transition-old(nav-bottom), ::view-transition-old(sp-topbar), ::view-transition-old(sp-hdr) { display: none; }
::view-transition-new(nav-sidebar), ::view-transition-new(nav-topbar),
::view-transition-new(nav-bottom), ::view-transition-new(sp-topbar), ::view-transition-new(sp-hdr) { animation: none; }
::view-transition-group(nav-sidebar), ::view-transition-group(nav-topbar),
::view-transition-group(nav-bottom), ::view-transition-group(sp-topbar), ::view-transition-group(sp-hdr) { animation-duration: 0s; }
::view-transition-old(root) { animation: 90ms ease-out both nav-content-out; }
::view-transition-new(root) { animation: 200ms cubic-bezier(.2, 0, 0, 1) both nav-content-in; }
@keyframes nav-content-out { to { opacity: 0; } }
@keyframes nav-content-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root), ::view-transition-new(root) { animation: none; }
}
/* MENU-WYSPA (13.10, prośba właściciela: „styl bardziej jak wyspa"): menu boczne
   jako biała karta odsunięta od krawędzi ekranu, zaokrąglona, z miękkim cieniem -
   jak karty w sklepie i panelu. Aktywna pozycja: pigułka w kolorze marki bez
   paska z lewej. Pasek przewijania menu cienki i spokojny, wyraźniejszy po
   najechaniu (zamiast grubego niebieskiego). Telefon: wysuwane menu też jako wyspa. */
.sidebar {
  top: 8px; left: 8px; height: calc(100dvh - 16px);
  border: 1px solid var(--border); border-radius: var(--shape-xl);
  box-shadow: var(--shadow-3, var(--shadow-card));
  scrollbar-width: thin; scrollbar-color: transparent transparent;
}
.sidebar:hover, .sidebar:focus-within { scrollbar-color: color-mix(in srgb, var(--text-3) 45%, transparent) transparent; }
.sidebar::-webkit-scrollbar { width: 8px; }
.sidebar::-webkit-scrollbar-thumb { background: transparent; border: 2px solid transparent; background-clip: padding-box; }
.sidebar:hover::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--text-3) 45%, transparent); background-clip: padding-box; }
.nav-item.active::before { display: none; }
.nav-item.active { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--primary) 18%, transparent); }
.nav-item:hover:not(.active) { background: var(--surface-2); }
@media (min-width: 900px) {
  .sidebar {
    position: sticky; top: 12px; left: auto;
    height: calc(100vh - 24px); margin: 12px 0 12px 12px;
    box-shadow: var(--shadow-card);
  }
  html.dark .sidebar { box-shadow: var(--shadow-card); }
  /* Karta użytkownika: mniejsze przyciski konta i wylogowania, żeby imię i rola
     mieściły się w całości (na telefonie zostają 44 px - cel dotykowy). */
  .sidebar-foot { gap: 8px; padding: 8px 6px 8px 10px; }
  .sidebar-foot .icon-btn { width: 32px; height: 32px; min-width: 32px; }
}
/* SKLEP-KATALOG-WYZEJ (13.10): niższy nagłówek sklepu - katalog z filtrami widać
   od razu pod nim (wcześniej trzeba było przewinąć przez pozycję miesiąca,
   kategorie i polecane). */
html.sk-kv .sk-hero { padding: 22px 18px 18px; margin: 14px 0 18px; }
html.sk-kv .sk-hero-title { font-size: var(--fs-2xl); margin: 10px auto 8px; max-width: 760px; }
html.sk-kv .sk-hero-lead { font-size: var(--fs-base); margin-bottom: 12px; max-width: 640px; }
html.sk-kv .sk-hero-actions { margin-bottom: 12px; }
@media (min-width: 900px) {
  html.sk-kv .sk-hero { padding: 30px 40px 24px; }
  html.sk-kv .sk-hero-title { font-size: var(--fs-3xl); }
  html.sk-kv .sk-hero-lead { font-size: var(--fs-md); }
}
/* SKLEP-HERO-NIZEJ (22.10, „hero za wysoki"): na telefonie bez akapitu wstępu, „pigułki" na
   dole mniejsze i w jednym przewijanym rzędzie; od 900 px szerszy tytuł (2 linijki zamiast 3), przyciski poziomów
   doradcy w jednym rzędzie i ciaśniejsze odstępy. */
html.sk-kv .sk-hero-lead { display: none; }
html.sk-kv .sk-hero-chips { gap: 6px; flex-wrap: nowrap; justify-content: flex-start; overflow-x: auto; scrollbar-width: none; margin: 0 -18px; padding: 0 18px; }
html.sk-kv .sk-hero-chips::-webkit-scrollbar { display: none; }
html.sk-kv .sk-hero-chips li { flex: none; white-space: nowrap; padding: 4px 10px; font-size: var(--fs-xs); }
@media (min-width: 600px) {
  html.sk-kv .sk-hero-lead { display: block; }
  html.sk-kv .sk-hero-chips { gap: 8px; flex-wrap: wrap; justify-content: center; overflow: visible; margin: 0; padding: 0; }
  html.sk-kv .sk-hero-chips li { padding: 6px 12px; font-size: var(--fs-sm); }
}
@media (min-width: 900px) {
  html.sk-kv .sk-hero { padding: 24px 40px 20px; }
  html.sk-kv .sk-hero-title { max-width: 1000px; }
  html.sk-kv .sk-hero-lead { max-width: 760px; }
  html.sk-kv .sk-hero .sk-hero-ai { max-width: 940px; margin-bottom: 14px; }
}

/* KV-APP-RESZTKI-2 (13.10): ostatnie resztki starego wyglądu po KV-APP-KARTY.
   1) Bez pasków z lewej: stan mówi tło, cienka obwódka i kolor ikony.
      - /tematy: rozwinięta klasa i dział mają przyciemnione tło w kolorze marki
        (klasa mocniej, dział słabiej) i strzałkę w kolorze marki; godziny działu
        stoją tuż przed przyciskami (dwa `margin-left: auto` rozpychały „~22 h"
        na środek wiersza, w każdym dziale w innym miejscu).
      - /admin/rezerwacje: rezerwacja czekająca za długo to karta z różowym tłem
        i kafelkiem daty w kolorze ostrzeżenia.
      - tabele `table.leads` (leady, próbne, współprace): najechany wiersz ma
        samo tło.
      - plan kursu (strefa kursanta): bieżąca lekcja ma tło i obwódkę marki oraz
        ikonę filmu; tytuł obok znacznika, długość po prawej (długi tytuł nie
        spada już pod kółko).
   2) Profil ucznia korepetytora, zakładka Lekcje, telefon: przyciski stanu
      lekcji schodzą pod treść (w rzędzie, na całą szerokość), temat i notatki
      mają cały wiersz. Od 700 px układ jak dotąd (kolumna przycisków z prawej).
   3) Dostępność korepetytora: selekty godzin szerokie na treść („14:00" całe),
      wiersz zakresu zawija się zamiast ucinać.
   4) Ciemny motyw: włączony przełącznik (szablony maili, „Maluję dostępność")
      ma ciemniejszy zielony tor, jasna gałka czyta się wyraźnie. */
.topics-grade[open] > .topics-grade-head {
  box-shadow: none;
  background: color-mix(in srgb, var(--primary-container) 70%, var(--surface));
}
.topics-cat[open] > .topics-cat-head {
  box-shadow: none;
  background: color-mix(in srgb, var(--primary-container) 32%, var(--surface));
  font-weight: var(--fw-semibold);
}
.topics-grade[open] > .topics-grade-head .chev,
.topics-cat[open] > .topics-cat-head .chev { color: var(--primary); }
.topics-grade-head:hover, .topics-cat-head:hover { background: var(--state-hover); }
.topics-grade[open] > .topics-grade-head:hover { background: color-mix(in srgb, var(--primary-container) 85%, var(--surface)); }
.topics-cat[open] > .topics-cat-head:hover { background: color-mix(in srgb, var(--primary-container) 45%, var(--surface)); }

.bkl-item.is-stale {
  background: color-mix(in srgb, var(--c-rej-bg) 45%, var(--surface));
  border-color: color-mix(in srgb, var(--c-rej) 35%, var(--outline-variant));
  box-shadow: var(--elev-1);
}
.bkl-item.is-stale .bkl-date { background: var(--c-rej-bg); color: var(--c-rej); }

table.leads tr.row:hover td:first-child { box-shadow: none; }

.kr-plan-lesson {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center; column-gap: 8px;
}
.kr-plan-lesson > .dim-12 { justify-self: end; text-align: right; }
.kr-plan-lesson > .dim-12:empty { display: none; }
.kr-plan-lesson.is-current {
  background: var(--primary-container);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--primary) 30%, transparent);
}
.kr-plan-lesson.is-current .kr-plan-mark { color: var(--primary); }
.kr-plan-lesson.is-current > a { color: var(--on-primary-container); font-weight: var(--fw-semibold); }

.pz-sv-lesson > .pz-flex > .pz-col-4.pz-shrink-0 {
  flex: 1 1 100%;
  padding-top: 10px;
  border-top: 1px solid var(--outline-variant);
}
.pz-sv-lesson > .pz-flex > .pz-col-4 > form { flex-direction: row; flex-wrap: wrap; gap: 6px; }
.pz-sv-lesson > .pz-flex > .pz-col-4 > form > .btn { flex: 1 1 auto; white-space: nowrap; }
@media (min-width: 700px) {
  .pz-sv-lesson > .pz-flex > .pz-col-4.pz-shrink-0 { flex: 0 0 auto; padding-top: 0; border-top: 0; }
  .pz-sv-lesson > .pz-flex > .pz-col-4 > form { flex-direction: column; flex-wrap: nowrap; gap: 4px; }
  .pz-sv-lesson > .pz-flex > .pz-col-4 > form > .btn { flex: 0 1 auto; }
  .topics-cat-head > .topics-cat-count + .pz-ml-auto { margin-left: 6px; }
}

.range-row { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.range-row > .select { width: auto; flex: 0 0 auto; }
/* Liczba godzin „(5h)" tylko od 600 px - na telefonie zakres mieści się wtedy
   w jednym wierszu z krzyżykiem (godziny i tak widać w podsumowaniu dnia). */
.range-row > .pz-dim-12:has(+ [data-remove-range]) { display: none; }
@media (min-width: 600px) {
  .range-row { gap: 8px; }
  .range-row > .pz-dim-12:has(+ [data-remove-range]) { display: inline; }
}

html.dark .mp-switch input:checked + .mp-switch-track,
html.dark .cal-paint input:checked + .cal-paint-track {
  background: color-mix(in oklab, var(--c-ok) 45%, var(--c-ok-bg));
}
/* P24-WYMOGI (13.10): stopka sklepu ma czwartą kolumnę „Płatności i dostawa". */
@media (min-width: 600px) {
  .sk-foot-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 900px) {
  .sk-foot-grid { grid-template-columns: 1.1fr 0.9fr 1.2fr 1.1fr; }
}

/* KV-APP-AUDYT-KLIENCI (13.10): audyt wyglądu ekranów korepetytora, rodzica,
   kursanta i stron publicznych (1440/390, jasny i ciemny). Same poprawki
   punktowe, bez zmiany przepływów:
   - stopka menu: imię ucinało się do „Tome…" (dwie ikony po 40 px zjadały
     szerokość) - mniejsze ikony i imię w dwóch liniach,
   - licznik rezerwacji w menu korepetytora: klasa zamiast inline style
     (blokowanego przez CSP - była goła cyfra),
   - pusty stan w karcie (kv-empty-sm): mniejszy odstęp niż pełnoekranowy,
   - biblioteka ucznia u korepetytora: lista i formularz w kartach,
   - raport postępów na telefonie: nawigacja miesięcy wychodziła poza ekran,
   - kurs: etykieta „W trakcie" rozciągnięta na pół karty, bieżąca lekcja
     z grubym paskiem po lewej, odpowiedzi quizu jak gołe radio,
   - strona produktu: lead opisu bez grubego paska po lewej,
   - logowanie rodzica: karta szersza niż ekran 390 px (o 2 px),
   - wybór terminu: „Środa 14 Października" (capitalize na całym zdaniu),
   - rezerwacja rodzica: brakujące narzędzia pz-mt-0 / pz-mt-20,
   - strony 404/500: karta jak reszta aplikacji,
   - lekcja próbna: stopka węższa/szersza niż nagłówek i treść. */
.sidebar-foot { gap: 6px; }
.sidebar-foot .who-name {
  white-space: normal; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}

.nav-notif-badge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; padding: 0 6px; margin-left: auto;
  border-radius: var(--shape-full);
  font-size: var(--fs-xs); font-weight: var(--fw-bold); line-height: 1;
  font-variant-numeric: tabular-nums;
}
.nav-notif-badge.is-pending { background: var(--c-warn-bg); color: var(--c-warn); }

.empty.kv-empty-sm { padding: 16px 12px 8px; }
.empty.kv-empty-sm .empty-body { margin-bottom: 4px; }

.kv-lib-card .sk-lib-list li { background: var(--surface); }
.kv-lib-card .sk-lib-who { flex: 1 1 260px; }
.kv-lib-card .sk-lib-files { display: flex; margin: 8px 0 0; }

.rpt-monthnav { flex-wrap: wrap; }

.kr-hero-eyebrow { justify-self: start; }
.kr-plan-lesson.is-current { box-shadow: none; }
.kr-plan-lesson.is-current .kr-plan-mark { color: var(--primary); }
.kr-opt { align-items: center; }
.kr-opt input { margin: 0; accent-color: var(--primary); }
.kr-opt:has(input:checked) { border-color: var(--primary); background: var(--primary-container); }


.login-card { padding: 32px 24px; }

.pb-slots-title { text-transform: none; }
.pb-slots-title::first-letter { text-transform: uppercase; }

.pz-mt-0 { margin-top: 0; }
.pz-mt-20 { margin-top: 20px; }

.error-card {
  width: 100%; padding: 36px 24px;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--shape-xl); box-shadow: var(--shadow-card);
}

.pb-foot-row { max-width: calc(1040px - 2 * var(--page-gutter, 16px)); }

@media (min-width: 600px) {
  .login-card { padding: 40px 36px; }
  .error-card { padding: 44px 40px; }
}
/* MOJ-DZIEN-ZWIJANIE (13.10): nagłówki sekcji „Mojego dnia" jako przyciski
   zwijania (pages/moj-dzien.js), zwinięta sekcja zajmuje jedną linię. */
.daily-h-btn { display: flex; align-items: center; gap: 10px; width: 100%; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; border-radius: var(--shape-md); }
.daily-h-btn:focus-visible { outline: 2px solid var(--primary); outline-offset: 4px; }
.daily-h-chev { margin-left: auto; color: var(--text-3); transition: transform var(--motion-fast) ease; }
.daily-section.is-collapsed .daily-h-chev { transform: rotate(-90deg); }
.daily-section.is-collapsed { margin-bottom: 14px; }
.daily-section.is-collapsed .daily-h { margin-bottom: 0; }
.daily-more { margin-top: 8px; }
.daily-card[hidden] { display: none; }

/* KV-APP-AUDYT-ADMIN (13.10): audyt wizualny ekranów admina/kadry (1440 + 390 + dark).
   Drobne poprawki po przeglądzie zrzutów; uzasadnienie przy każdej regule. */
/* Przycisk-summary (<summary class="btn pz-summary-btn">, np. „Nowe hasło" przy koncie
   rodzica): .pz-inline-block zbijało go do inline-block, więc ikona i tekst siadały
   niżej niż w sąsiednich .btn (inline-flex). */
summary.btn.pz-summary-btn { display: inline-flex; align-items: center; }
summary.btn.pz-summary-btn::-webkit-details-marker { display: none; }

/* Raport ucznia (/uczen/{id}/raport) na telefonie: „← 9/2026 · Październik 2026 · 11/2026 →"
   nie mieściło się w 390 px (poziomy scroll o 7 px). Na wąskim ekranie etykieta miesiąca
   idzie w osobny wiersz nad strzałkami; od 600 px wraca jeden wiersz. */
.rpt-monthnav { flex-wrap: wrap; }
.rpt-monthnav-label { order: -1; flex: 1 0 100%; text-align: center; }
.rpt-monthnav > .btn { flex: 1 1 0; }
@media (min-width: 600px) {
  .rpt-monthnav { flex-wrap: nowrap; }
  .rpt-monthnav-label { order: 0; flex: none; }
  .rpt-monthnav > .btn { flex: none; }
}

/* Rozliczenia z korepetytorami: tabela leżała gołą na tle strony (jedyna taka lista
   w panelu). Biała karta jak .tbl-wrap, ale bez overflow:hidden z wersji mobilnej
   .tbl-wrap - .pz-tbl na telefonie składa się w wiersze-karty i nie może być ucięta. */
.pz-tbl-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--shape-lg); box-shadow: var(--shadow-card);
}

/* Rezerwacje w szkole: rezerwacja czekająca > 48 h miała gruby czerwony pasek z lewej
   (inset 4px). Stan pokazujemy jak wszędzie w KV-APP-KARTY: delikatnie podbarwione tło
   + czerwona plakietka „czeka 3 dni" (ta już jest), bez paska. */
.bkl-item.is-stale {
  background: color-mix(in srgb, var(--c-rej-bg) 55%, var(--surface));
  box-shadow: var(--shadow-card);
}

/* Użytkownicy: plakietki ról Rodzic / Kursant / Księgowa nie miały koloru (sam tekst
   bez tła obok kolorowych Korepetytor / Recepcja / Administrator). */
.role-parent { background: var(--c-prog-bg); color: var(--c-prog); }
.role-student { background: var(--surface-2); color: var(--text-2); }
.role-accountant { background: var(--c-warn-bg); color: var(--c-warn); }

/* Sklep → Produkty: produkt bez okładki pokazywał w kolumnie „Okładka" samo słowo
   „brak"; teraz pusty kafelek okładki z ikoną, w tym samym rozmiarze co miniatura. */
.sk-admin-cover--none { display: grid; place-items: center; color: var(--text-3); border: 1px dashed var(--border); }

/* Rezerwacje w szkole - pusty stan: goła zielona ikona zamiast kafelka jak w innych
   pustych stanach panelu; .bkl-empty .material-symbols-outlined (zielona, 36 px)
   przebijało kolor i rozmiar ikony w kafelku. */
.bkl-empty .empty-ico { margin-bottom: 4px; }
.bkl-empty .empty-ico .material-symbols-outlined { color: inherit; font-size: var(--fs-3xl); }

/* ═══ ASYSTENT-AI (13.10): czat kadry - panel z prawej i strona /asystent ═══
   Dymki jak w komunikatorze (moje po prawej na niebiesko), odpowiedź pisze się
   na żywo, karty do zatwierdzenia w stylu kart panelu. */
.asys-drawer {
  position: fixed; inset: 0 0 0 auto; z-index: var(--z-drawer);
  width: min(440px, 100vw); background: var(--surface);
  box-shadow: var(--shadow-drawer); border-left: 1px solid var(--border);
  transform: translateX(100%); transition: transform var(--motion-std) var(--ease-decel);
  display: flex; flex-direction: column;
}
.asys-drawer.open { transform: none; }
.asys-drawer-body { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.asys-loading { flex: 1; display: grid; place-items: center; }
.asys-trigger .material-symbols-outlined { color: var(--brand-blue); }

.asys { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.asys-top {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 10px 12px 10px 16px; border-bottom: 1px solid var(--border);
}
.asys-title { display: flex; align-items: center; gap: 10px; min-width: 0; }
.asys-title strong { display: block; font-size: var(--fs-md); font-weight: var(--fw-bold); }
.asys-sub { display: block; font-size: var(--fs-xs); color: var(--text-3); }
.asys-avatar {
  width: 36px; height: 36px; border-radius: var(--shape-full); display: grid; place-items: center;
  background: var(--g-blue); color: var(--on-primary); font-size: var(--fs-lg); flex: none;
}
.asys-top-actions { display: flex; align-items: center; gap: 2px; }
.asys-history { position: relative; }
.asys-history > summary { list-style: none; }
.asys-history > summary::-webkit-details-marker { display: none; }
.asys-history-list {
  position: absolute; right: 0; top: calc(100% + 4px); z-index: var(--z-popover);
  width: 280px; max-height: 320px; overflow: auto; padding: 6px;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--shape-md);
  box-shadow: var(--shadow-card-lg);
}
.asys-history-item {
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px; width: 100%;
  padding: 8px 10px; border: 0; background: none; border-radius: var(--shape-sm);
  text-align: left; cursor: pointer; color: var(--text); font: inherit;
}
.asys-history-item span { font-size: var(--fs-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.asys-history-item small { font-size: var(--fs-xs); color: var(--text-3); }
.asys-history-item:hover, .asys-history-item.active { background: var(--surface-2); }

.asys-log {
  flex: 1; min-height: 0; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 10px;
  overscroll-behavior: contain; scroll-behavior: smooth;
}
.asys-msg {
  max-width: 86%; padding: 9px 13px; border-radius: var(--shape-lg); font-size: var(--fs-sm);
  line-height: var(--lh-base); white-space: pre-wrap; overflow-wrap: anywhere;
  animation: asys-in var(--motion-fast) var(--ease-decel);
}
.asys-msg.is-user {
  align-self: flex-end; background: var(--brand-blue); color: var(--on-primary);
  border-bottom-right-radius: var(--shape-xs);
}
.asys-msg.is-bot {
  align-self: flex-start; background: var(--surface-2); color: var(--text);
  border-bottom-left-radius: var(--shape-xs);
}
.asys-msg.is-error {
  align-self: stretch; max-width: none; background: var(--c-rej-bg); color: var(--c-rej);
}
.asys-status {
  align-self: flex-start; font-size: var(--fs-xs); color: var(--text-3); padding-left: 4px;
  display: flex; align-items: center; gap: 6px;
}
.asys-status::before {
  content: ""; width: 10px; height: 10px; border-radius: var(--shape-full);
  border: 2px solid var(--brand-blue-100); border-top-color: var(--brand-blue);
  animation: asys-spin 0.8s linear infinite;
}
.asys-dots { display: inline-flex; gap: 4px; padding: 4px 2px; }
.asys-dots i {
  width: 6px; height: 6px; border-radius: var(--shape-full); background: var(--text-3);
  animation: asys-dot 1.1s var(--ease-in-out) infinite;
}
.asys-dots i:nth-child(2) { animation-delay: 0.15s; }
.asys-dots i:nth-child(3) { animation-delay: 0.3s; }
@keyframes asys-dot { 0%, 60%, 100% { opacity: 0.3; transform: none; } 30% { opacity: 1; transform: translateY(-3px); } }
@keyframes asys-spin { to { transform: rotate(360deg); } }
@keyframes asys-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

.asys-empty { margin: auto 0; text-align: center; padding: 16px 8px; }
.asys-empty-ico {
  width: 52px; height: 52px; border-radius: var(--shape-lg); display: inline-grid; place-items: center;
  background: var(--g-blue); color: var(--on-primary); font-size: var(--fs-2xl); box-shadow: var(--shadow-primary);
}
.asys-empty-title { margin: 12px 0 4px; font-size: var(--fs-lg); font-weight: var(--fw-bold); }
.asys-empty-sub { margin: 0 auto 14px; max-width: 34ch; font-size: var(--fs-sm); color: var(--text-2); }
.asys-chips { display: flex; flex-direction: column; gap: 8px; align-items: stretch; }
.asys-chip {
  padding: 9px 12px; border: 1px solid var(--border); background: var(--surface);
  border-radius: var(--shape-md); font: inherit; font-size: var(--fs-sm); color: var(--text-2);
  text-align: left; cursor: pointer; transition: border-color var(--motion-fast), background var(--motion-fast);
}
/* 20.10: --text na --brand-blue-soft w ciemnym motywie = jasne na jasnym; --brand-blue-text ma 5,87:1 w obu */
.asys-chip:hover { border-color: var(--brand-blue); background: var(--brand-blue-soft); color: var(--brand-blue-text); }

.asys-input {
  display: flex; align-items: flex-end; gap: 8px; margin: 0 12px; padding: 6px 6px 6px 14px;
  border: 1.5px solid var(--field-border); border-radius: var(--shape-xl); background: var(--surface);
  transition: border-color var(--motion-fast), box-shadow var(--motion-fast);
}
.asys-input:focus-within { border-color: var(--brand-blue); box-shadow: 0 0 0 3px var(--primary-ring); }
.asys-input .asys-textarea {
  flex: 1; min-width: 0; min-height: 0; border: 0; background: transparent; resize: none; outline: none; box-shadow: none;
  border-radius: 0;
  font: inherit; font-size: var(--fs-base); line-height: var(--lh-base); color: var(--text);
  padding: 7px 0; max-height: 160px;
}
.asys-send {
  width: 38px; height: 38px; flex: none; border: 0; border-radius: var(--shape-full); cursor: pointer;
  background: var(--brand-blue); color: var(--on-primary); display: grid; place-items: center;
  transition: background var(--motion-fast), opacity var(--motion-fast);
}
.asys-send:hover { background: var(--brand-blue-hover); }
.asys-input.is-busy .asys-send { opacity: 0.45; pointer-events: none; }
/* ASYSTENT-AI-3: mikrofon dyktowania (tylko gdy szkoła włączyła i przeglądarka umie) */
.asys-mic {
  width: 38px; height: 38px; flex: none; border: 0; border-radius: var(--shape-full); cursor: pointer;
  background: var(--brand-blue-soft); color: var(--brand-blue); display: grid; place-items: center;
  transition: background var(--motion-fast);
}
.asys-mic.is-rec { background: var(--c-rej-bg); color: var(--c-rej); animation: rec-pulse 1.2s ease-in-out infinite; }
.asys-mic[hidden] { display: none; }          /* display: grid wyżej wygrywa z [hidden] przeglądarki */
@media (pointer: coarse) { .asys-mic, .asys-send { width: 44px; height: 44px; } }
.asys-note { margin: 6px 16px 12px; font-size: var(--fs-2xs); color: var(--text-3); text-align: center; }
.asys-off { margin: 12px 16px 16px; font-size: var(--fs-sm); color: var(--text-2); }

/* Karta do zatwierdzenia */
.asys-card {
  align-self: stretch; border: 1px solid var(--border); border-radius: var(--shape-lg);
  background: var(--surface); box-shadow: var(--shadow-card); animation: asys-in var(--motion-std) var(--ease-decel);
}
.asys-card-form { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; padding: 12px; }
.asys-card-head { grid-column: 1 / -1; display: flex; align-items: center; gap: 8px; }
.asys-card-head .material-symbols-outlined {
  width: 30px; height: 30px; border-radius: var(--shape-sm); display: grid; place-items: center;
  background: var(--brand-blue-soft); color: var(--brand-blue); font-size: var(--fs-lg);
}
.asys-card-head strong { font-size: var(--fs-sm); }
.asys-card-hint { margin-left: auto; font-size: var(--fs-xs); color: var(--text-3); }
.asys-card-error { grid-column: 1 / -1; margin: 0; padding: 8px 10px; border-radius: var(--shape-sm); background: var(--c-rej-bg); color: var(--c-rej); font-size: var(--fs-sm); }
.asys-f { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.asys-f > span { font-size: var(--fs-xs); color: var(--text-2); font-weight: var(--fw-medium); }
.asys-f .input, .asys-f .select, .asys-f .textarea { width: 100%; min-height: 36px; font-size: var(--fs-sm); padding: 6px 10px; }
.asys-f-wide { grid-column: 1 / -1; }
.asys-card-actions { grid-column: 1 / -1; display: flex; gap: 8px; margin-top: 4px; }
.asys-card-done { display: flex; align-items: center; gap: 10px; padding: 10px 12px; font-size: var(--fs-sm); }
.asys-card-done > .material-symbols-outlined {
  width: 28px; height: 28px; border-radius: var(--shape-full); display: grid; place-items: center;
  background: var(--c-ok-bg); color: var(--c-ok); font-size: var(--fs-md); flex: none;
}
.asys-card-done > div { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.asys-card-done span { color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.asys-card-done.is-rejected > .material-symbols-outlined { background: var(--surface-2); color: var(--text-3); }
/* ASYSTENT-AI-2 (14.10): dopiski na kartach (kto/kiedy, co dostanie rodzic) i „Ustaw mimo to". */
.asys-card-note { margin: 0; font-size: var(--fs-xs); color: var(--text-2); line-height: 1.45; }
.asys-card-note strong { color: var(--text); }
.asys-card-override { display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-xs); color: var(--text-2); }
.asys-card-override input { margin-top: 2px; flex: none; accent-color: var(--brand-blue); }
.asys-card-override--end { align-self: end; min-height: 36px; align-items: center; }
/* ASYSTENT-AI-POMIAR (14.10): strona /asystent/przeglad */
.asys-rv-periods { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.asys-rv-grid { display: grid; gap: 16px; align-items: start; }
.asys-rv-list { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.asys-rv-list li { display: flex; flex-direction: column; gap: 4px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
.asys-rv-list li:last-child { border-bottom: 0; padding-bottom: 0; }
.asys-rv-text { font-size: var(--fs-sm); overflow-wrap: anywhere; }
.asys-rv-cell { display: flex; flex-direction: column; gap: 2px; min-width: 0; text-align: left; }
.asys-rv-h3 { margin: 14px 0 4px; font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
@media (min-width: 900px) {
  .asys-rv-grid { grid-template-columns: 1fr 1fr; }
}

/* Strona /asystent: czat w karcie, ustawienia obok (na szerokim ekranie) */
.asys-page { display: grid; gap: 16px; align-items: start; }
.asys-page-chat { padding: 0; overflow: hidden; height: min(72vh, 760px); display: flex; flex-direction: column; }
.asys-page .asys-close { display: none; }
.asys-settings { display: flex; flex-direction: column; gap: 12px; }
.asys-usage { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.asys-usage > div { padding: 10px 12px; border-radius: var(--shape-md); background: var(--surface-2); display: flex; flex-direction: column; }
.asys-usage-num { font-size: var(--fs-lg); font-weight: var(--fw-bold); }
.asys-usage-lbl { font-size: var(--fs-xs); color: var(--text-3); }
.asys-meter { height: 6px; border-radius: var(--shape-full); background: var(--surface-3); overflow: hidden; }
.asys-meter-fill { display: block; height: 100%; width: 0; background: var(--g-blue); border-radius: inherit; }
.asys-warn, .asys-privacy { display: flex; gap: 8px; align-items: flex-start; margin: 0; font-size: var(--fs-sm); color: var(--text-2); }
.asys-warn { padding: 10px 12px; border-radius: var(--shape-md); background: var(--c-warn-bg); color: var(--c-warn); }
.asys-settings-form { display: flex; flex-direction: column; gap: 12px; align-items: flex-start; }
.asys-settings-form .field { width: 100%; }
.asys-toggle { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; font-size: var(--fs-sm); }
.asys-toggle input { margin-top: 1px; }
.asys-toggle small, .asys-hint { color: var(--text-3); font-size: var(--fs-xs); }
.asys-hint { margin-top: 4px; }

@media (min-width: 900px) {
  .asys-page { grid-template-columns: minmax(0, 1fr) 320px; }
}
@media (prefers-reduced-motion: reduce) {
  .asys-drawer, .asys-msg, .asys-card { transition: none; animation: none; }
}

/* ═══ ASYSTENT-CHMURKA (13.10, prośba właściciela): na komputerze czat to okienko
   w prawym dolnym rogu („chmurka"), które przesuwa się za nagłówek i powiększa
   za róg (pozycja i rozmiar zapamiętane w przeglądarce, pages/asystent.js), a nie
   panel na całą wysokość. Na telefonie zostaje pełny ekran. Przycisk w pasku
   górnym z napisem „Asystent" (od 900 px). ═══ */
.asys-trigger-lbl { display: none; }
@media (min-width: 600px) {
  .asys-drawer {
    inset: auto 20px 20px auto; width: 400px; height: min(620px, calc(100vh - 96px));
    min-width: 320px; min-height: 380px; max-width: calc(100vw - 32px); max-height: calc(100vh - 32px);
    border: 1px solid var(--border); border-radius: var(--shape-xl); overflow: hidden; resize: both;
    box-shadow: var(--shadow-card-lg), 0 24px 60px color-mix(in srgb, var(--brand-ink) 18%, transparent);
    transform: translateY(16px) scale(0.97); transform-origin: bottom right; opacity: 0;
    transition: transform var(--motion-std) var(--ease-decel), opacity var(--motion-fast) var(--ease-decel);
  }
  .asys-drawer.open { transform: none; opacity: 1; }
  .asys-drawer .asys-top { cursor: grab; user-select: none; touch-action: none; }
  .asys-drawer .asys-top button, .asys-drawer .asys-top summary { cursor: pointer; }
  .asys-drawer.is-dragging { transition: none; }
  .asys-drawer.is-dragging .asys-top { cursor: grabbing; }
  /* Zwinięty do paska: sam nagłówek w prawym dolnym rogu, klik rozwija. */
  .asys-drawer .asys-min { display: inline-grid; }
  .asys-drawer.is-min { width: 300px; height: auto; min-height: 0; resize: none; }
  .asys-drawer.is-min .asys-top { cursor: pointer; border-bottom: 0; }
  .asys-drawer.is-min .asys-log, .asys-drawer.is-min .asys-input, .asys-drawer.is-min .asys-note,
  .asys-drawer.is-min .asys-off, .asys-drawer.is-min .asys-history, .asys-drawer.is-min [data-asys-new] { display: none; }
  .asys-drawer.is-min .asys-min .material-symbols-outlined { transform: rotate(180deg); }
  .asys-drawer.has-news .asys-avatar { box-shadow: 0 0 0 3px var(--surface), 0 0 0 5px var(--brand-blue); }
}
.asys-min { display: none; }
@media (min-width: 900px) {
  .icon-btn.asys-trigger {
    width: auto; padding: 0 14px 0 10px; gap: 6px; display: inline-flex; align-items: center;
    border-radius: var(--shape-full); background: var(--brand-blue-soft); color: var(--brand-blue-text);
    font-size: var(--fs-sm); font-weight: var(--fw-semibold);
  }
  .icon-btn.asys-trigger:hover, .icon-btn.asys-trigger[aria-expanded="true"] { background: var(--brand-blue-100); }
  .asys-trigger-lbl { display: inline; }
}

/* ═══ DORADCA-WWW (13.10): „Wirtualny Solve" - okno czatu w ramce na stronie szkoły
   (WordPress). Dymki, pole i kropki z czatu asystenta (.asys-*). ═══ */
.dor-body { margin: 0; background: var(--surface); height: 100vh; overflow: hidden; }
.dor { height: 100vh; display: flex; flex-direction: column; }
.dor-top { display: flex; align-items: center; gap: 10px; padding: 12px 10px 12px 16px; border-bottom: 1px solid var(--border); }
.dor-title { flex: 1; min-width: 0; }
.dor-title strong { display: block; font-size: var(--fs-md); font-weight: var(--fw-bold); }
.dor-title span { display: block; font-size: var(--fs-xs); color: var(--text-3); }
.dor-log { flex: 1; min-height: 0; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 10px; overscroll-behavior: contain; }
.dor-chips { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }
.dor-input { margin: 0 12px; }
.dor-actions { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 12px 0; }
.dor-actions .btn { flex: 1 1 0; justify-content: center; }
.dor-actions .btn.accent { flex-basis: 100%; }
.dor-actions .btn:not(.accent) { padding-inline: 6px; gap: 4px; font-size: var(--fs-xs); white-space: nowrap; }
.dor-note { margin: 8px 14px 12px; font-size: var(--fs-2xs); color: var(--text-3); text-align: center; }
.asys-code { display: block; margin: 4px 0 8px; padding: 10px 12px; border-radius: var(--shape-sm); background: var(--surface-2); font-size: var(--fs-xs); overflow-wrap: anywhere; user-select: all; }
@media (min-width: 900px) {
  .asys-advisor { grid-column: 1 / -1; }
}
/* DORADCA-KONTAKT: formularz kontaktu w rozmowie z Wirtualnym Solve */
.dor-contact { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; padding: 12px; }
.dor-ways { border: 0; margin: 0; padding: 0; display: flex; flex-direction: row; flex-wrap: wrap; gap: 4px 14px; font-size: var(--fs-sm); }
.dor-ways legend { width: 100%; }
.dor-ways input { margin: 0; }
.dor-ways legend { font-size: var(--fs-xs); color: var(--text-2); font-weight: var(--fw-medium); margin-bottom: 4px; padding: 0; }
.dor-ways label { display: inline-flex; align-items: center; gap: 6px; }
.dor-consent { display: flex; gap: 8px; align-items: flex-start; font-size: var(--fs-xs); color: var(--text-2); }
.dor-consent input { margin-top: 2px; flex: none; }
.dor-contact .dor-note { grid-column: 1 / -1; margin: 0; text-align: left; }
.dor-hp { position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0; }
/* DORADCA-WWW (13.10, zgłoszenie właściciela „za duża czcionka w polu"): okno na
   komputerze ma ok. 440 px, więc w ramce działa reguła telefonu (pola 16px przeciw
   powiększaniu w iOS). Przy myszy (?tryb=okno) wraca zwykły rozmiar - iOS nie dotyczy. */
.dor-okno .asys-input .asys-textarea { font-size: var(--fs-base) !important; padding: 7px 0; }
.dor-okno .dor-contact .input, .dor-okno .dor-contact .textarea { font-size: var(--fs-base) !important; }
.dor-okno .asys-msg { font-size: var(--fs-base); }
/* Telefon: wpisywany tekst zostaje 16px (iOS), ale pole jest niższe, a podpowiedź
   mniejsza - na pustym polu nie „krzyczy" względem reszty okna. */
.dor-input { padding: 4px 4px 4px 12px; }
.dor-input .asys-send { width: 34px; height: 34px; }
.dor-input .asys-textarea { padding: 5px 0; }
.dor-input .asys-textarea::placeholder { font-size: var(--fs-md); }
/* DORADCA-WWW (13.10, „na telefonie mniejsze i bardziej przejrzyste"): okienko na
   telefonie (bez ?tryb=okno) ma ok. 60% ekranu - nagłówek niższy, przyciski w jednym
   rzędzie, jedna krótka linia notki. */
.dor-note--krotka { display: none; }
.dor-body:not(.dor-okno) .dor-top { padding: 8px 6px 8px 12px; gap: 8px; }
.dor-body:not(.dor-okno) .dor-top .asys-avatar { width: 30px; height: 30px; font-size: var(--fs-md); }
.dor-body:not(.dor-okno) .dor-log { padding: 12px; gap: 8px; }
.dor-body:not(.dor-okno) .dor-chips { flex-direction: row; flex-wrap: wrap; gap: 6px; }
.dor-body:not(.dor-okno) .dor-chips .asys-chip { padding: 6px 10px; font-size: var(--fs-xs); border-radius: var(--shape-full); }
.dor-body:not(.dor-okno) .dor-actions { flex-wrap: nowrap; gap: 4px; padding: 8px 8px 0; overflow-x: auto; scrollbar-width: none; }
.dor-body:not(.dor-okno) .dor-actions .btn { flex: 0 0 auto; min-height: 32px; padding: 0 10px; font-size: var(--fs-xs); white-space: nowrap; }
.dor-body:not(.dor-okno) .dor-actions .btn.accent { flex-basis: auto; }
.dor-body:not(.dor-okno) .dor-note { display: none; }
.dor-body:not(.dor-okno) .dor-note--krotka { display: block; margin: 6px 10px 8px; }
.dor-lbl-short { display: none; }
.dor-body:not(.dor-okno) .dor-lbl-full { display: none; }
.dor-body:not(.dor-okno) .dor-lbl-short { display: inline; }
.dor-body:not(.dor-okno) .dor-actions { overflow-x: visible; }
.dor-body:not(.dor-okno) .dor-actions .btn { flex: 1 1 auto; justify-content: center; }
.dor-body:not(.dor-okno) .dor-actions .dor-act-ico { flex: 0 0 36px; padding: 0; }
/* SKLEP-DORADCA (22.10): okno w sklepie - karty polecanych materiałów w rozmowie
   (okładka, tytuł, poziom, cena, link do produktu) i tylko dwa przyciski kontaktu,
   więc na telefonie z napisami zamiast samych ikon. */
.dor-prods { display: flex; flex-direction: column; gap: 6px; align-self: stretch; }
.dor-prod { display: flex; align-items: center; gap: 10px; padding: 8px 10px 8px 8px; border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface); color: inherit; text-decoration: none; transition: border-color 120ms ease, background 120ms ease; }
.dor-prod:hover, .dor-prod:focus-visible { border-color: var(--accent); background: var(--surface-2); }
.dor-prod-cover { flex: none; width: 44px; height: 58px; border-radius: var(--shape-xs); object-fit: cover; background: var(--surface-2); display: grid; place-items: center; color: var(--text-3); font-size: var(--fs-2xl); }
.dor-prod-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.dor-prod-title { font-size: var(--fs-sm); font-weight: var(--fw-bold); line-height: 1.3; overflow-wrap: anywhere; }
.dor-prod-meta { font-size: var(--fs-2xs); color: var(--text-3); }
.dor-prod-price { font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--accent); }
.dor-prod-go { flex: none; color: var(--text-3); font-size: var(--fs-xl); }
/* SKLEP-DORADCA-KOSZYK (22.10): „Do koszyka" pod kartą materiału w czacie doradcy. */
.dor-prod-row { display: flex; flex-direction: column; gap: 4px; }
.dor-prod-cart { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 36px; padding: 0 12px; border: 0; border-radius: var(--shape-full); background: var(--accent); color: #fff; font: inherit; font-size: var(--fs-sm); font-weight: var(--fw-bold); text-decoration: none; cursor: pointer; }
.dor-prod-cart:hover { filter: brightness(1.06); color: #fff; }
.dor-prod-cart:disabled { opacity: .6; cursor: progress; }
.dor-prod-cart.is-in { background: var(--surface-2); color: var(--accent); border: 1px solid var(--border); }
.dor-prod-cart .material-symbols-outlined { font-size: var(--fs-lg); }
/* SKLEP-ZESTAWY (22.10, mockup): sekcja „Zestawy" pod hero - szerokie karty z wachlarzem
   okładek składników; na telefonie przewijane w bok. */
.sk-zestawy { margin: 0 0 26px; }
.sk-zestawy-head { text-align: center; margin-bottom: 14px; }
.sk-zestawy-eyebrow { margin: 0; font-size: var(--fs-sm); font-weight: var(--fw-bold); letter-spacing: .12em; text-transform: uppercase; color: var(--sk-primary); }
.sk-zestawy-title { margin: 4px 0 0; font-size: var(--fs-2xl); font-weight: var(--fw-heavy); letter-spacing: -0.02em; text-wrap: balance; }
.sk-zestawy-row { display: grid; grid-auto-flow: column; grid-auto-columns: min(86%, 380px); gap: 14px; overflow-x: auto; scroll-snap-type: x mandatory; padding: 4px 2px 12px; scrollbar-width: thin; }
.sk-zs { scroll-snap-align: start; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--border); border-radius: var(--sk-radius); background: var(--surface); box-shadow: var(--shadow-card); }
.sk-zs-fan { position: relative; display: block; height: 190px; background: linear-gradient(135deg, var(--sk-primary-soft) 0%, var(--surface-2) 100%); }
.sk-zs-cover { position: absolute; left: 50%; bottom: 18px; width: 96px; height: 128px; object-fit: cover; border-radius: var(--shape-xs); background: var(--surface); box-shadow: 0 2px 6px oklch(0.2 0.05 262 / 0.18), 0 12px 24px oklch(0.2 0.05 262 / 0.24); transition: transform var(--motion-std) var(--ease-std); display: grid; place-items: center; color: var(--text-3); }
/* Wachlarz: ostatnia okładka (pierwszy składnik) na wierzchu, pozostałe odchylone na boki. */
.sk-zs-fan--1 .sk-zs-cover { transform: translateX(-50%); }
.sk-zs-fan--2 .sk-zs-cover:nth-child(1) { transform: translateX(-20%) rotate(8deg); }
.sk-zs-fan--2 .sk-zs-cover:nth-child(2) { transform: translateX(-80%) rotate(-5deg); }
.sk-zs-fan--3 .sk-zs-cover:nth-child(1) { transform: translateX(5%) rotate(12deg); }
.sk-zs-fan--3 .sk-zs-cover:nth-child(2) { transform: translateX(-105%) rotate(-12deg); }
.sk-zs-fan--3 .sk-zs-cover:nth-child(3) { transform: translateX(-50%) translateY(-8px); }
.sk-zs-fan--4 .sk-zs-cover:nth-child(1) { transform: translateX(28%) rotate(16deg); }
.sk-zs-fan--4 .sk-zs-cover:nth-child(2) { transform: translateX(-128%) rotate(-16deg); }
.sk-zs-fan--4 .sk-zs-cover:nth-child(3) { transform: translateX(-12%) rotate(6deg) translateY(-6px); }
.sk-zs-fan--4 .sk-zs-cover:nth-child(4) { transform: translateX(-82%) rotate(-5deg) translateY(-10px); }
.sk-zs:hover .sk-zs-fan--3 .sk-zs-cover:nth-child(1), .sk-zs:hover .sk-zs-fan--4 .sk-zs-cover:nth-child(1) { transform: translateX(38%) rotate(20deg); }
.sk-zs:hover .sk-zs-fan--3 .sk-zs-cover:nth-child(2), .sk-zs:hover .sk-zs-fan--4 .sk-zs-cover:nth-child(2) { transform: translateX(-138%) rotate(-20deg); }
.sk-zs-pct { position: absolute; top: 12px; right: 12px; padding: 4px 10px; border-radius: var(--shape-full); background: var(--sk-accent-deep); color: #fff; font-size: var(--fs-md); font-weight: var(--fw-heavy); }
.sk-zs-body { display: flex; flex-direction: column; flex: 1; gap: 6px; padding: 14px 16px 16px; }
.sk-zs-badge { display: inline-flex; align-items: center; gap: 6px; margin: 0; font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--sk-primary); text-transform: uppercase; letter-spacing: .06em; }
.sk-zs-badge .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-zs-title { margin: 0; font-size: var(--fs-xl); font-weight: var(--fw-heavy); line-height: var(--lh-tight); }
.sk-zs-title a { color: inherit; text-decoration: none; }
.sk-zs-lead { margin: 0; font-size: var(--fs-sm); color: var(--text-2); }
.sk-zs-items { list-style: none; margin: 4px 0 0; padding: 0; display: grid; gap: 3px; font-size: var(--fs-sm); }
.sk-zs-items li { display: flex; gap: 6px; align-items: flex-start; }
.sk-zs-items .material-symbols-outlined { flex: none; font-size: var(--fs-lg); color: var(--sk-accent-deep); }
.sk-zs-more { padding-left: 24px; color: var(--text-3); }
.sk-zs-foot { margin-top: auto; padding-top: 10px; }
.sk-zs-price { margin: 0; display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 10px; }
.sk-zs-price strong { font-size: var(--fs-2xl); font-weight: var(--fw-heavy); }
.sk-zs-was { color: var(--text-3); text-decoration: line-through; font-size: var(--fs-sm); }
.sk-zs-save { margin: 2px 0 0; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--sk-accent-deep); }
.sk-zs-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.sk-zs-actions > * { flex: 1 1 auto; }
.sk-zs-actions form .btn { width: 100%; }
@media (min-width: 900px) {
  .sk-zestawy-row { grid-auto-flow: row; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); overflow: visible; }
}
/* „Taniej w zestawie" na stronie materiału i pasek oszczędności na stronie zestawu. */
.sk-zs-up { display: grid; gap: 8px; margin: 12px 0 4px; }
.sk-zs-up-item { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 1.5px solid var(--sk-primary-soft); border-radius: var(--shape-lg); background: linear-gradient(135deg, var(--sk-primary-soft) 0%, var(--surface) 70%); color: inherit; text-decoration: none; transition: border-color var(--motion-std) var(--ease-std); }
.sk-zs-up-item:hover, .sk-zs-up-item:focus-visible { border-color: var(--sk-primary); }
/* SKLEP-ZESTAWY-KOSZYK (22.10): ta sama ramka w koszyku - tytuł jako link, „Zamień na zestaw"
   pod spodem na telefonie, obok od 600 px. */
.sk-zs-cart { margin: 4px 0 14px; }
.sk-zs-cart .sk-zs-up-item { flex-wrap: wrap; }
.sk-zs-cart-title { color: var(--text); font-weight: var(--fw-bold); text-decoration: none; }
.sk-zs-cart-title:hover { color: var(--sk-primary); text-decoration: underline; }
.sk-zs-cart-form { flex: 1 1 100%; }
.sk-zs-cart-form .btn { width: 100%; }
@media (min-width: 600px) {
  .sk-zs-cart .sk-zs-up-item { flex-wrap: nowrap; }
  .sk-zs-cart-form { flex: none; }
  .sk-zs-cart-form .btn { width: auto; }
}
.sk-zs-fan--mini { flex: none; width: 108px; height: 66px; background: none; }
.sk-zs-fan--mini .sk-zs-cover { width: 40px; height: 54px; bottom: 4px; }
.sk-zs-up-body { flex: 1; min-width: 0; display: grid; gap: 1px; }
.sk-zs-up-kicker { font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--sk-accent-deep); text-transform: uppercase; letter-spacing: .05em; }
.sk-zs-up-body strong { font-size: var(--fs-md); }
.sk-zs-up-meta { font-size: var(--fs-sm); color: var(--text-2); }
.sk-zs-up-go { flex: none; color: var(--sk-primary); }
.sk-zs-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 12px 0 4px; padding: 12px 14px; border-radius: var(--shape-lg); background: var(--sk-primary-soft); }
.sk-zs-bar-was { color: var(--text-2); }
.sk-zs-bar-now strong { font-size: var(--fs-xl); font-weight: var(--fw-heavy); color: var(--sk-primary); }
.sk-zs-bar .material-symbols-outlined { color: var(--sk-primary); }
.sk-bundle-list li:has(.sk-bundle-thumb) { align-items: center; }
.sk-bundle-thumb { flex: none; width: 36px; height: 48px; object-fit: cover; border-radius: var(--shape-xs); box-shadow: 0 2px 6px oklch(0.2 0.05 262 / 0.18); }
.sk-zs-fan--card { width: 100%; height: 100%; min-height: 170px; background: none; }
/* SKLEP-OPIS-SZEROKO (22.10, prośba właściciela „ramka szeroka, a tekst do 3/4"): opis,
   „Co dostajesz" i „Dla kogo" na całą szerokość ramki; od 600 px tekst wyjustowany
   z polskim dzieleniem wyrazów (na telefonie do lewej - wąska kolumna robi dziury). */
.sk-opis-main .sk-desc, .sk-includes--panel, .sk-audience { max-width: none; }
@media (min-width: 600px) {
  .sk-opis-main .sk-desc, .sk-audience .sk-desc { text-align: justify; hyphens: auto; -webkit-hyphens: auto; }
}
@media (min-width: 900px) {
  .sk-includes--panel { grid-template-columns: 1fr 1fr; }
}
@media (prefers-reduced-motion: reduce) { .sk-zs-cover { transition: none; } }
/* SKLEP-KOSZYK-DOL (22.10): koszyk przy dolnej krawędzi ekranu (lewy róg - prawy zajmuje
   doradca). Toast „Dodano do koszyka" wchodzi nad niego, żeby się nie nakładały. */
.sk-fcart { position: fixed; left: 14px; bottom: 14px; z-index: var(--z-toast); display: inline-flex; align-items: center; gap: 8px; height: 46px; padding: 0 10px 0 14px; border-radius: var(--shape-full); background: var(--sk-primary); color: #fff; font-size: var(--fs-md); font-weight: var(--fw-bold); text-decoration: none; box-shadow: 0 10px 30px rgba(10, 98, 199, .35), 0 2px 6px rgba(13, 18, 26, .15); transition: transform 160ms ease; }
.sk-fcart[hidden] { display: none; }
.sk-fcart:hover { transform: translateY(-2px); color: #fff; }
.sk-fcart:focus-visible { outline: 3px solid var(--sk-primary-soft); outline-offset: 2px; }
.sk-fcart .material-symbols-outlined { font-size: var(--fs-xl); }
.sk-fcart-n { display: inline-grid; place-items: center; min-width: 26px; height: 26px; padding: 0 7px; border-radius: var(--shape-full); background: #fff; color: var(--sk-primary); font-size: var(--fs-sm); font-weight: var(--fw-heavy); }
html.sk-kv:has(.sk-fcart:not([hidden])) .sk-toast { bottom: 76px; }
@media (min-width: 600px) {
  .sk-fcart { left: 20px; bottom: 20px; height: 50px; padding: 0 12px 0 18px; }
}
@media (prefers-reduced-motion: reduce) { .sk-fcart { transition: none; } }
/* SKLEP-DORADCA-HERO (22.10): panel „Pomogę Ci wybrać materiał" w hero katalogu -
   przyciski poziomów otwierają czat z gotowym pytaniem. */
.sk-hero-ai { position: relative; max-width: 720px; margin: 0 auto 16px; padding: 12px 10px; border-radius: var(--shape-lg); background: rgba(255, 255, 255, .14); border: 1px solid rgba(255, 255, 255, .28); }
.sk-hero-ai[hidden] { display: none; }
/* Telefon najpierw (mobile-first): przyciski w dwóch kolumnach, ostatni na całą szerokość. */
.sk-hero-ai-q { display: flex; align-items: center; justify-content: center; gap: 8px; margin: 0 0 10px; font-size: var(--fs-sm); text-align: left; }
.sk-hero-ai-ico { display: inline-grid; place-items: center; flex: none; width: 28px; height: 28px; border-radius: 50%; background: #fff; color: var(--sk-primary); font-size: var(--fs-md); }
.sk-hero-ai-opts { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.sk-hero-ai-opt { min-height: 38px; padding: 0 8px; border: 0; border-radius: var(--shape-full); background: #fff; color: var(--sk-primary); font: inherit; font-size: var(--fs-xs); font-weight: var(--fw-bold); cursor: pointer; transition: background 120ms ease, transform 120ms ease; }
.sk-hero-ai-opt:last-child { grid-column: 1 / -1; }
.sk-hero-ai-opt:hover { background: var(--sk-primary-soft); transform: translateY(-1px); }
.sk-hero-ai-opt:focus-visible, .sk-hero-ai-free:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
.sk-hero-ai-free { margin-top: 8px; padding: 4px 8px; border: 0; background: none; color: rgba(255, 255, 255, .9); font: inherit; font-size: var(--fs-sm); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
@media (min-width: 600px) {
  .sk-hero-ai { padding: 14px 16px; }
  .sk-hero-ai-q { font-size: var(--fs-md); text-align: center; }
  .sk-hero-ai-opts { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; }
  .sk-hero-ai-opt { min-height: 40px; padding: 0 16px; font-size: var(--fs-sm); }
  .sk-hero-ai-opt:last-child { grid-column: auto; }
}
@media (prefers-reduced-motion: reduce) { .sk-hero-ai-opt { transition: none; } .sk-hero-ai-opt:hover { transform: none; } }
/* SKLEP-DORADCA-PAKIETY (22.10): ten sam panel nad cennikiem korepetycji - na jasnym tle;
   cztery cele, więc na telefonie 2 x 2 (ostatni przycisk nie na całą szerokość). */
.sk-hero-ai--light { margin: 0 auto 18px; text-align: center; background: var(--sk-primary-soft); border-color: var(--sk-primary-line); color: var(--sk-ink); }
.sk-hero-ai--light .sk-hero-ai-ico { background: var(--sk-primary); color: #fff; }
.sk-hero-ai--light .sk-hero-ai-opt { border: 1px solid var(--sk-primary-line); }
.sk-hero-ai--light .sk-hero-ai-opt:hover { background: #fff; border-color: var(--sk-primary); }
.sk-hero-ai--light .sk-hero-ai-opt:last-child:nth-child(even) { grid-column: auto; }
.sk-hero-ai--light .sk-hero-ai-free { color: var(--sk-primary); }
.sk-hero-ai--light :is(.sk-hero-ai-opt, .sk-hero-ai-free):focus-visible { outline-color: var(--sk-primary); }
.dor-filter > .material-symbols-outlined { flex: none; display: grid; place-items: center; width: 44px; height: 44px; border-radius: var(--shape-sm); background: var(--surface-2); color: var(--accent); font-size: var(--fs-2xl); }
.dor-filter .dor-prod-title { color: var(--accent); }
.dor[data-kanal="sklep"] .dor-actions .dor-act-ico { flex: 1 1 0; padding: 0 10px; }
.dor-body:not(.dor-okno) .dor[data-kanal="sklep"] .dor-act-ico .dor-lbl-full { display: inline; }

/* ═══ LABORATORIUM (LAB-1, 14.10): baza zadań przeniesiona z SOLVE Lab ═══ */
.lab-math { overflow-wrap: anywhere; line-height: 1.6; }
.lab-math .katex { font-size: 1.08em; }
.lab-math-display { margin: 6px 0; overflow-x: auto; overflow-y: hidden; }
.lab-math-error { color: var(--c-rej); background: var(--c-rej-bg); border-radius: 4px; padding: 0 3px; font-family: ui-monospace, monospace; font-size: var(--fs-sm); }
.lab-h2 { font-size: var(--fs-lg); font-weight: var(--fw-bold); margin: 20px 0 10px; display: flex; gap: 8px; align-items: baseline; }
.lab-h3 { font-size: var(--fs-md); font-weight: var(--fw-semibold); margin: 0 0 8px; }
.lab-h4 { font-size: var(--fs-sm); font-weight: var(--fw-semibold); margin: 16px 0 6px; color: var(--text-2); }
.lab-kpi { color: inherit; text-decoration: none; }
.lab-kpi:hover { border-color: var(--brand-blue-100); }
.lab-danger { color: var(--c-rej); }
.lab-notes { margin: 0 0 16px; color: var(--text-2); font-size: var(--fs-sm); white-space: pre-line; }

/* Półka: źródła jak grzbiety książek */
.lab-shelf { display: grid; gap: 12px; }
.lab-book { display: flex; gap: 12px; padding: 14px; color: inherit; text-decoration: none; align-items: stretch; }
.lab-book:hover { border-color: var(--brand-blue-100); }
.lab-book-spine { width: 8px; flex: none; border-radius: var(--shape-full); background: linear-gradient(var(--brand-blue), var(--brand-blue-100)); }
.lab-book-body { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.lab-book-count { font-size: var(--fs-sm); color: var(--text-2); }

/* Chipy przypisań */
.lab-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.lab-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 9px; border-radius: var(--shape-full); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-xs); text-decoration: none; white-space: nowrap; }
a.lab-chip:hover { background: var(--brand-blue-soft); color: var(--brand-blue-text); }
.lab-chip--type { background: var(--brand-blue-soft); color: var(--brand-blue-text); }
.lab-chip--review { background: var(--c-prog-bg); color: var(--c-prog); }
.lab-chip--exam { background: var(--c-ok-bg); color: var(--c-ok); font-weight: var(--fw-semibold); }
.lab-chip--section { font-weight: var(--fw-medium); }
.lab-chip--diff { gap: 3px; }
.lab-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--border); }
.lab-dot.is-on { background: var(--brand-blue); }

/* Przeglądarka */
.lab-browse { display: grid; gap: 16px; align-items: start; }
.lab-filters-box { padding: 0; }
.lab-filters-sum { cursor: pointer; display: flex; align-items: center; gap: 8px; padding: 12px 14px; font-weight: var(--fw-semibold); }
.lab-filters { padding: 0 14px 14px; display: flex; flex-direction: column; gap: 10px; }
.lab-filters-row { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.lab-filters-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.lab-check-line { display: flex; align-items: center; gap: 8px; font-size: var(--fs-sm); }
.lab-check-line input { flex: none; }
.lab-results { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.lab-mass { padding: 10px 14px; display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: center; }
.lab-mass-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.lab-mass-actions .select { width: auto; max-width: 100%; flex: 1 1 120px; min-height: 34px; }
.lab-mass { min-width: 0; }
.lab-mass-actions { min-width: 0; max-width: 100%; }
.lab-row { padding: 14px 16px; }
.lab-row-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
.lab-row-title { font-weight: var(--fw-bold); color: inherit; text-decoration: none; }
.lab-row-src { flex: 1; min-width: 0; font-size: var(--fs-sm); color: var(--text-2); }
.lab-check input { flex: none; }
.lab-content--clip { max-height: 6.5em; overflow: hidden; }
.lab-choices, .lab-subparts { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 4px 16px; }
.lab-choices li, .lab-subparts li { display: flex; gap: 6px; align-items: baseline; }
.lab-choice-key { font-weight: var(--fw-bold); flex: none; }
.lab-sub-pts { margin-left: auto; font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; }
.lab-empty { display: flex; flex-direction: column; align-items: center; gap: 10px; text-align: center; padding: 32px 16px; color: var(--text-2); }
.lab-empty .material-symbols-outlined { font-size: 32px; color: var(--text-3); }

/* Karta zadania */
.lab-task-grid { display: grid; gap: 16px; align-items: start; }
.lab-paper { padding: 22px 24px; font-size: var(--fs-md); }
.lab-solution { margin-top: 16px; border-top: 1px solid var(--border); padding-top: 12px; }
.lab-solution summary { cursor: pointer; display: inline-flex; gap: 6px; align-items: center; font-weight: var(--fw-semibold); color: var(--brand-blue-text); }
.lab-solution .lab-h3 { margin-top: 14px; }
.lab-steps { margin: 6px 0 0; padding-left: 22px; display: flex; flex-direction: column; gap: 6px; }
.lab-side { display: flex; flex-direction: column; gap: 12px; }
.lab-dl { display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; margin: 0; font-size: var(--fs-sm); }
.lab-dl dt { color: var(--text-3); }
.lab-dl dd { margin: 0; }
.lab-tabs { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 14px; }
.lab-tab { padding: 6px 12px; border-radius: var(--shape-full); border: 1px solid var(--border); color: var(--text-2); text-decoration: none; font-size: var(--fs-sm); }
.lab-tab.is-on { background: var(--brand-blue); border-color: var(--brand-blue); color: var(--on-primary); }
.lab-tab.is-on .pz-dim-12 { color: inherit; }

/* Formularz */
.lab-form { display: grid; gap: 16px; align-items: start; }
.lab-form-main, .lab-form-side { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.lab-form-sec { display: flex; flex-direction: column; gap: 12px; }
.lab-form-row { display: flex; flex-wrap: wrap; gap: 10px; }
.lab-form-row > .field { flex: 1 1 120px; }
.lab-form-row > .lab-grow { flex: 3 1 220px; }
.lab-form-row > .lab-narrow { flex: 0 1 110px; }
.lab-tex { font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; font-size: var(--fs-sm); }
.lab-preview { margin-top: 6px; padding: 8px 10px; border-radius: var(--shape-sm); background: var(--surface-2); font-size: var(--fs-sm); }
.lab-preview:empty { display: none; }
.lab-preview--inline { padding: 4px 8px; }
.lab-preview.has-error { box-shadow: inset 0 0 0 1px var(--c-rej); }
.lab-preview-err { margin-top: 4px; color: var(--c-rej); font-size: var(--fs-xs); }
.lab-seg { display: flex; flex-wrap: wrap; gap: 6px; }
.lab-seg label { display: inline-flex; gap: 6px; align-items: center; padding: 6px 12px; border: 1px solid var(--border); border-radius: var(--shape-full); font-size: var(--fs-sm); cursor: pointer; }
.lab-seg label:has(input:checked) { border-color: var(--brand-blue); background: var(--brand-blue-soft); color: var(--brand-blue-text); }
.lab-seg input { accent-color: var(--brand-blue); }
.lab-choices-edit { display: grid; gap: 8px; }
/* `hidden` z JS musi wygrać z display: grid/flex powyżej (warianty, tematy działu). */
.lab-choices-edit[hidden], .lab-check-line[hidden], [data-lab-topics-empty][hidden] { display: none; }
.lab-sec-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.lab-sub-edit { border: 1px solid var(--border); border-radius: var(--shape-md); padding: 10px 12px; display: flex; flex-direction: column; gap: 8px; margin-bottom: 10px; }
.lab-sub-letter { font-size: var(--fs-md); }
.lab-item-tools { display: inline-flex; gap: 2px; }
.lab-steps-edit { margin: 0; padding-left: 22px; display: flex; flex-direction: column; gap: 8px; }
.lab-step-edit { display: grid; grid-template-columns: 1fr auto; gap: 4px 6px; align-items: start; }
.lab-step-edit .lab-preview { grid-column: 1 / -1; }
.lab-fs { border: 0; padding: 0; margin: 0 0 12px; }
.lab-fs legend { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); margin-bottom: 6px; text-transform: uppercase; letter-spacing: .04em; }
.lab-grade-row { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; margin-bottom: 6px; }
.lab-grade-school { width: 42px; font-size: var(--fs-xs); color: var(--text-3); font-weight: var(--fw-semibold); }
.lab-pill { position: relative; }
.lab-pill input { position: absolute; opacity: 0; inset: 0; cursor: pointer; }
.lab-pill span { display: inline-grid; place-items: center; min-width: 32px; height: 32px; padding: 0 8px; border-radius: var(--shape-full); border: 1px solid var(--border); font-size: var(--fs-sm); }
.lab-pill input:checked + span { background: var(--brand-blue); border-color: var(--brand-blue); color: var(--on-primary); }
.lab-pill input:focus-visible + span { outline: 2px solid var(--brand-blue-100); outline-offset: 2px; }
.lab-sec-group summary { cursor: pointer; font-size: var(--fs-sm); font-weight: var(--fw-semibold); margin: 4px 0; }
.lab-sec-group .lab-check-line { padding: 3px 0; }
[data-lab-topics] .lab-check-line { padding: 3px 0; }
.lab-form-actions { display: flex; flex-direction: column; gap: 8px; }
.lab-form-actions-inline { display: flex; gap: 8px; flex-wrap: wrap; }
.lab-source-form { display: flex; flex-direction: column; gap: 12px; max-width: 760px; }

/* Statystyki */
.lab-bars { display: flex; flex-direction: column; gap: 8px; }
.lab-bar { display: grid; grid-template-columns: minmax(120px, 200px) 1fr 48px; gap: 10px; align-items: center; color: inherit; text-decoration: none; font-size: var(--fs-sm); }
.lab-bar-track { height: 10px; border-radius: var(--shape-full); background: var(--surface-2); overflow: hidden; }
.lab-bar-fill { display: block; height: 100%; background: var(--brand-blue); border-radius: inherit; }
.lab-bar-num { text-align: right; font-variant-numeric: tabular-nums; }
.lab-map-wrap { margin-top: 10px; }
.lab-map-wrap > summary { cursor: pointer; font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.lab-map { border-collapse: collapse; font-size: var(--fs-xs); margin-top: 8px; }
.lab-map th, .lab-map td { padding: 5px 7px; border: 1px solid var(--border); text-align: center; white-space: nowrap; }
.lab-map th[scope="row"] { text-align: left; font-weight: var(--fw-medium); }
.lab-map a { color: inherit; }
.lab-heat-0 { color: var(--text-3); }
.lab-heat-1 { background: var(--brand-blue-soft); }
.lab-heat-2 { background: var(--brand-blue-100); }
.lab-heat-3 { background: var(--brand-blue); color: var(--on-primary); }
.lab-heat-3 a { color: var(--on-primary); }
.lab-heat-total { font-weight: var(--fw-semibold); }
.lab-topic-stats { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 4px; }
.lab-topic-stats li { display: flex; justify-content: space-between; gap: 8px; padding: 4px 8px; border-radius: var(--shape-sm); font-size: var(--fs-sm); }

/* Ustawienia */
.lab-set-list { list-style: none; margin: 8px 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.lab-set-list > li { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.lab-inline-form { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; flex: 1; }
.lab-inline-form .input { flex: 1 1 200px; min-width: 0; }
.lab-narrow-input { flex: 0 0 64px !important; }
.lab-set-sec { border-top: 1px solid var(--border); padding: 8px 0; }
.lab-set-sec > summary { cursor: pointer; display: flex; gap: 8px; align-items: baseline; }

@media (min-width: 600px) {
  .lab-shelf { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
  .lab-choices { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 900px) {
  .lab-browse { grid-template-columns: 270px minmax(0, 1fr); }
  .lab-filters-box { position: sticky; top: 76px; max-height: calc(100vh - 92px); overflow-y: auto; }
  .lab-filters-sum { display: none; }
  .lab-filters { padding-top: 14px; }
  .lab-task-grid { grid-template-columns: minmax(0, 1fr) 300px; }
  .lab-form { grid-template-columns: minmax(0, 1fr) 320px; }
  .lab-form-side { position: sticky; top: 76px; max-height: calc(100vh - 92px); overflow-y: auto; }
}

/* ═══ LABORATORIUM - rysunki (LAB-3, 14.10): JSXGraph na planszy w bieli (kolory
   grafik są w motywie rysunku, nie w tokenach - wydruk ma wyglądać jak papier) ═══ */
.lab-figs { display: flex; flex-wrap: wrap; gap: 12px; margin: 10px 0 4px; }
.lab-fig { margin: 0; width: 100%; max-width: 520px; }
.lab-fig-board { width: 100%; aspect-ratio: 4 / 3; border-radius: var(--shape-sm); background: var(--on-primary); border: 1px solid var(--border); overflow: hidden; }
.lab-fig-scan { display: block; max-width: 100%; border-radius: var(--shape-sm); border: 1px solid var(--border); background: var(--on-primary); }
.lab-fig-missing, .lab-fig-error { padding: 12px; font-size: var(--fs-sm); color: var(--text-3); }
.lab-fig-error { color: var(--c-rej); }
.lab-fig--thumb { max-width: none; }
.lab-fig-grid { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); }
.lab-fig-card { padding: 10px; display: flex; flex-direction: column; gap: 8px; }
.lab-fig-thumb { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: contain; background: var(--on-primary); border-radius: var(--shape-sm); border: 1px solid var(--border); }
.lab-fig-meta { display: flex; flex-wrap: wrap; gap: 6px; }
.lab-fig-desc { margin: 0; font-size: var(--fs-sm); color: var(--text-2); }
.lab-fig-actions { display: flex; gap: 6px; align-items: center; justify-content: space-between; margin-top: auto; }
.lab-side-figs { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
.lab-side-fig { display: flex; align-items: center; gap: 4px; width: 100%; font-size: var(--fs-sm); }
.lab-side-fig > span { flex: 1; min-width: 0; }
/* LAB-4c-TREND (20.10): słupki skuteczności w kolejnych kartkówkach (wysokość: data-pct-h, core.js) */
.lab-trend { margin-bottom: 16px; }
.lab-trend-bars { list-style: none; margin: 0 0 6px; padding: 0; display: flex; align-items: flex-end; gap: 6px; height: 140px; overflow-x: auto; }
.lab-trend-col { flex: 1 1 0; min-width: 28px; max-width: 56px; height: 100%; display: grid; grid-template-rows: auto 1fr auto; justify-items: center; gap: 4px; }
.lab-trend-val { font-size: var(--fs-2xs); font-weight: var(--fw-semibold); color: var(--text-2); }
.lab-trend-track { width: 100%; height: 100%; display: flex; align-items: flex-end; background: var(--surface-2); border-radius: var(--shape-xs); overflow: hidden; }
.lab-trend-bar { display: block; width: 100%; background: var(--primary); border-radius: var(--shape-xs) var(--shape-xs) 0 0; }
.lab-trend-bar.lab-bar-ok { background: var(--c-ok); }
.lab-trend-bar.lab-bar-low { background: var(--c-rej); }
.lab-trend-date { font-size: var(--fs-2xs); color: var(--text-3); }
/* LAB-3-SKANY (20.10): wrzutka skanu pod listą rysunków zadania */
.lab-scan-form { display: grid; grid-template-columns: minmax(0, 1fr); gap: 6px; width: 100%; margin-top: 6px; padding-top: 10px; border-top: 1px solid var(--border); }
.lab-scan-form input[type="file"], .lab-scan-form .input { width: 100%; min-width: 0; max-width: 100%; }
.lab-scan-form .btn { justify-self: start; }

/* Edytor */
.fe { display: grid; gap: 16px; align-items: start; }
.fe-panel { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.fe-sec { padding: 14px; display: flex; flex-direction: column; gap: 10px; }
.fe-sec > summary { cursor: pointer; margin: 0; }
.fe-presets { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.fe-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.fe-grid--2 { grid-template-columns: 1fr 1fr; }
.fe-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.fe-lbl { font-size: var(--fs-2xs); font-weight: var(--fw-medium); color: var(--text-3); letter-spacing: .04em; }
.fe-input { min-height: 36px; padding: 6px 8px; }
.fe-mono { font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; }
.fe-checks { display: flex; flex-wrap: wrap; gap: 8px 18px; }
.fe-check { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); }
.fe-check input { flex: none; }
.fe-add { width: auto; min-height: 36px; }
.fe-objs { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.fe-obj { border: 1px solid var(--border); border-radius: var(--shape-md); padding: 10px; display: flex; flex-direction: column; gap: 8px; }
.fe-obj-head { display: flex; align-items: center; justify-content: space-between; }
.fe-obj-name { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--brand-blue-text); text-transform: uppercase; letter-spacing: .04em; }
.fe-fields { display: flex; flex-direction: column; gap: 8px; }
.fe-err { margin: 2px 0 0; font-size: var(--fs-xs); color: var(--c-rej); }
.fe-err:empty { display: none; }
.fe-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.fe-preview { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
/* Telefon/tablet: podgląd nad formularzem - widać efekt zmiany bez przewijania. */
@media (max-width: 1099.98px) { .fe-preview { order: -1; } }
.fe-toolbar { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.fe-seg { display: inline-flex; gap: 4px; }
.fe-seg .btn[aria-pressed="true"] { background: var(--brand-blue-soft); color: var(--brand-blue-text); border-color: var(--brand-blue-100); }
.fe-stage { position: relative; padding: 0; overflow: hidden; background: var(--on-primary); }
.fe-board { width: 100%; height: 460px; position: relative; }
.fe-board.is-tracing { background: transparent; }
.fe-scan { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; pointer-events: none; opacity: .5; }
.fe-scan[hidden] { display: none; }
.fe-empty { position: absolute; left: 0; right: 0; bottom: 12px; margin: 0; text-align: center; font-size: var(--fs-xs); color: var(--text-3); pointer-events: none; }
.fe-empty[hidden] { display: none; }

@media (min-width: 600px) {
  .fe-grid { grid-template-columns: repeat(4, 1fr); }
}
@media (min-width: 1100px) {
  .fe { grid-template-columns: 420px minmax(0, 1fr); }
  .fe-preview { position: sticky; top: 76px; }
}

/* ═══ LABORATORIUM - bryły 3D (LAB-3b, 14.10): scena three.js w bieli, sterowanie
   z lewej (na telefonie model u góry, sterowanie pod nim) ═══ */
.ls { display: grid; gap: 16px; align-items: start; }
.ls-panel { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.ls-view { min-width: 0; }
@media (max-width: 1099.98px) { .ls-view { order: -1; } }
.ls-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.ls-chip[aria-pressed="true"] { background: var(--brand-blue-soft); color: var(--brand-blue-text); border-color: var(--brand-blue-100); font-weight: var(--fw-semibold); }
.ls-sub { margin: 4px 0 0; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); }
.ls-param[hidden], [data-ls-base-wrap][hidden], .ls-range[hidden], [data-ls-net][hidden], [data-ls-nonet][hidden],
[data-ls-nowebgl][hidden], .ls-stage[hidden] { display: none; }
.ls-flags { display: flex; flex-direction: column; gap: 8px; }
.ls-range { display: flex; flex-direction: column; gap: 6px; }
.ls-range input[type="range"] { width: 100%; accent-color: var(--brand-blue); min-height: 24px; }
.ls-range-scale { display: flex; justify-content: space-between; font-size: var(--fs-xs); color: var(--text-3); }
.ls-range-scale strong { color: var(--text); }
.ls-sel { margin: 0; font-size: var(--fs-sm); color: var(--text-3); display: flex; flex-direction: column; gap: 2px; }
.ls-sel.is-on { color: var(--text); }
.ls-sel-name { color: var(--brand-blue-text); }
.ls-stage { position: relative; padding: 0; overflow: hidden; background: var(--on-primary); height: 420px; }
.ls-stage:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 2px; }
.lab-solid-canvas { display: block; touch-action: none; cursor: grab; }
.lab-solid-canvas.is-grabbing { cursor: grabbing; }
@media (min-width: 1100px) {
  .ls { grid-template-columns: 340px minmax(0, 1fr); }
  .ls-view { position: sticky; top: 76px; }
  .ls-stage { height: 600px; }
}

/* ═══ LABORATORIUM - kartkówki (LAB-4a, 14.10): koszyk, kreator, lista, karta ═══ */
.lab-basket-form { display: inline-flex; margin: 0; }
.lab-basket-btn.is-on { color: var(--brand-blue-text); background: var(--brand-blue-soft); }
.lab-basket-n { display: inline-flex; min-width: 20px; height: 20px; padding: 0 6px; align-items: center; justify-content: center;
  border-radius: var(--shape-full); background: var(--brand-blue-soft); color: var(--brand-blue-text); font-size: var(--fs-xs); font-weight: var(--fw-semibold); }
.lab-basket-list, .lab-ws-items, .lab-b-list { display: flex; flex-direction: column; gap: 10px; list-style: none; margin: 0; padding: 0; }
.lab-basket-clear { margin-top: 12px; }
.lab-empty-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
.lab-empty[hidden] { display: none; }
.lab-warn { padding: 12px 16px; border-radius: var(--shape-sm); border: 1px solid var(--c-warn);
  background: var(--c-warn-bg); color: var(--c-warn); font-size: var(--fs-base); }
.lab-hint { font-size: var(--fs-xs); color: var(--text-3); }
.lab-math.lab-inline { display: inline; }

.lab-ws-list { display: flex; flex-direction: column; gap: 8px; }
.lab-ws-row { display: flex; align-items: center; gap: 12px; padding: 12px 16px; color: inherit; text-decoration: none; }
.lab-ws-row:hover { border-color: var(--brand-blue-100); }
.lab-ws-main { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.lab-ws-title { overflow-wrap: anywhere; }
.lab-ws-meta, .lab-ws-date { font-size: var(--fs-sm); color: var(--text-2); }
.lab-ws-date { white-space: nowrap; }
.lab-ws-exports { margin-bottom: 12px; }
.lab-ws-exports-row { display: flex; flex-wrap: wrap; gap: 8px; }

.lab-builder { display: grid; gap: 16px; align-items: start; }
.lab-builder-tasks { min-width: 0; }
.lab-builder-side { display: flex; flex-direction: column; gap: 10px; }
.lab-builder-grid { display: grid; gap: 10px; grid-template-columns: 1fr; }
.lab-b-row { padding: 12px 14px; }
.lab-b-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 6px; }
.lab-b-num { font-weight: var(--fw-bold); color: var(--text-2); min-width: 1.6em; }
.lab-b-pts { display: inline-flex; align-items: center; gap: 4px; font-size: var(--fs-sm); color: var(--text-2); }
.lab-b-pts .input { width: 64px; min-height: 34px; padding: 4px 8px; }
.lab-b-tools { display: inline-flex; gap: 2px; margin-left: auto; }
.lab-b-head .lab-row-src { flex: 1 1 100%; order: 5; }
@media (min-width: 600px) { .lab-b-head .lab-row-src { flex: 1 1 auto; order: 0; } }
.lab-b-tools .icon-btn:disabled { opacity: .35; }
.lab-b-body { max-height: 220px; overflow: auto; }
.lab-b-summary { display: flex; justify-content: space-between; font-size: var(--fs-sm); color: var(--text-2);
  padding: 8px 0; border-top: 1px solid var(--border); }
.lab-pick { max-width: 900px; }
.lab-pick-grid { display: grid; gap: 12px; grid-template-columns: 1fr 1fr; }
.lab-exam-level { border: 0; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px 18px; }
.lab-builder-side { order: -1; }
@media (min-width: 600px) {
  .lab-pick-grid { grid-template-columns: repeat(3, 1fr); }
  .lab-builder-grid { grid-template-columns: 1fr 1fr 1fr; }
}
@media (min-width: 1100px) {
  .lab-builder { grid-template-columns: minmax(0, 1fr) 340px; }
  .lab-builder-side { position: sticky; top: 76px; order: 0; }
  .lab-builder-grid { grid-template-columns: 1fr; }
}

/* Wydruk A4 (karta „druk"): biel i atrament niezależnie od motywu panelu */
.lp-body { background: var(--print-desk); color: var(--print-ink); margin: 0; }
.lp-bar { position: sticky; top: 0; z-index: 2; display: flex; flex-wrap: wrap; gap: 8px; padding: 10px 16px;
  background: var(--surface); border-bottom: 1px solid var(--border); }
.lp-page { background: var(--print-paper); color: var(--print-ink); max-width: 19cm; margin: 0; padding: 16px;
  box-shadow: 0 1px 3px var(--print-shadow); font-size: 11pt; line-height: var(--lh-base); }
.lp-head { display: flex; flex-direction: column; justify-content: space-between; gap: 16px; align-items: flex-start; }
.lp-brand { flex: 1 1 auto; min-width: 0; }
.lp-logo { font-weight: var(--fw-black); letter-spacing: .02em; font-size: 15pt; }
.lp-logo span { font-weight: var(--fw-medium); color: var(--print-mute); }
.lp-kicker { font-size: 8pt; text-transform: uppercase; letter-spacing: .08em; color: var(--print-mute); margin-top: 2px; }
.lp-title { font-size: 16pt; margin: 4px 0 0; line-height: var(--lh-tight); color: var(--print-ink); }
.lp-fields { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; font-size: 9.5pt; flex: 0 0 auto; }
.lp-field { display: flex; gap: 6px; align-items: flex-end; }
.lp-dots { display: inline-block; min-width: 24mm; border-bottom: 1px dotted var(--print-ink); height: 1em; }
.lp-dots--name { min-width: 42mm; }
.lp-dots--short { min-width: 12mm; }
.lp-score { border: 1px solid var(--print-ink); border-radius: var(--shape-xs); padding: 4px 8px; margin-top: 2px; white-space: nowrap; }
.lp-rule { height: 3px; margin: 8px 0 10px; background: linear-gradient(90deg, var(--print-accent) 0 68px, var(--print-ink) 68px) bottom / 100% 1px no-repeat,
  linear-gradient(var(--print-accent), var(--print-accent)) left top / 68px 3px no-repeat; }
.lp-note { font-style: italic; font-size: 9.5pt; color: var(--print-mute); margin: 0 0 8px; }
.lp-task { break-inside: avoid; page-break-inside: avoid; padding: 8px 0 4px; }
.lp-task-head { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
.lp-badge { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: var(--shape-xs);
  background: var(--print-ink); color: var(--print-paper); font-size: 9pt; font-weight: var(--fw-bold); }
.lp-pts { color: var(--print-mute); font-size: 9.5pt; }
.lp-choices { list-style: none; padding: 0; margin: 6px 0; display: grid; grid-template-columns: 1fr; gap: 4px 16px; }
.lp-choices li, .lp-subparts li { display: flex; gap: 6px; align-items: baseline; }
.lp-subparts { list-style: none; padding: 0; margin: 6px 0; display: flex; flex-direction: column; gap: 4px; }
.lp-figs { display: flex; flex-wrap: wrap; gap: 10px; margin: 6px 0; }
.lp-fig { max-width: 12cm; }
.lp-fig .lab-fig-board { border: 0; }
.lp-space { margin-top: 6px; border: 1px solid var(--print-grid); border-radius: var(--shape-xs);
  background-image: linear-gradient(var(--print-grid) 1px, transparent 1px), linear-gradient(90deg, var(--print-grid) 1px, transparent 1px);
  background-size: 5mm 5mm; }
.lp-space--S { min-height: 3.5cm; }
.lp-space--M { min-height: 6cm; }
.lp-space--L { min-height: 9cm; }
.lp-key { margin-top: 6px; padding: 8px 10px; background: var(--print-key-bg); border-radius: var(--shape-xs); font-size: 10pt; }
.lp-steps { margin: 4px 0 0; padding-left: 1.4em; }
.lp-grading { margin-top: 4px; color: var(--print-grading); }
.lp-foot { display: flex; justify-content: space-between; gap: 12px; margin-top: 14px; padding-top: 6px; border-top: 1px solid var(--print-line);
  font-size: 8pt; color: var(--print-soft); }
@page { size: A4; margin: 12mm 13mm 16mm; }
@media print {
  .no-print { display: none !important; }
  .lp-body { background: var(--print-paper); }
  .lp-body .lp-page { box-shadow: none; margin: 0; padding: 0; max-width: none; }   /* wygrywa z min-width 600 */
  .lp-space, .lp-badge, .lp-key, .lp-rule { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
}
@media (min-width: 600px) {
  .lp-page { padding: 12mm 13mm 16mm; margin: 16px auto; }
  .lp-head { flex-direction: row; }
  .lp-fields { align-items: flex-end; }
  .lp-choices { grid-template-columns: 1fr 1fr; }
}

/* ═══ LABORATORIUM - ocenianie i strona ucznia (LAB-4b, 14.10) ═══ */
.lab-ws-students { margin-bottom: 12px; }
.lab-as-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.lab-as-row { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); }
.lab-as-row:last-child { border-bottom: 0; }
.lab-as-main { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.lab-as-meta { font-size: var(--fs-sm); color: var(--text-2); }
.lab-as-add { display: grid; gap: 10px; grid-template-columns: 1fr; align-items: end; }
.lab-mk { display: grid; gap: 16px; align-items: start; }
.lab-mk-main { min-width: 0; display: flex; flex-direction: column; gap: 10px; }
.lab-mk-side { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.lab-mk-score { font-weight: var(--fw-semibold); font-size: var(--fs-md); }
.lab-mk-banner { padding: 10px 14px; border-radius: var(--shape-sm); background: var(--c-warn-bg); color: var(--c-warn); }
.lab-mk-banner.is-good { background: var(--c-ok-bg); color: var(--c-ok); }
.lab-mk-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.lab-mk-row { padding: 12px 14px; border-left: 4px solid var(--border); }
.lab-mk--dobrze { border-left-color: var(--c-ok); }
.lab-mk--czesciowo { border-left-color: var(--c-warn); }
.lab-mk--zle { border-left-color: var(--c-rej); }
.lab-mk-body summary { cursor: pointer; font-size: var(--fs-sm); color: var(--text-2); }
.lab-mk-key, .lab-mk-answer { font-size: var(--fs-sm); margin-top: 6px; }
.lab-mk-lbl { color: var(--text-3); }
.lab-mk-subs { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.lab-mk-sub, .lab-mk-whole { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: space-between; }
.lab-mk-whole { margin-top: 8px; }
.lab-mk-btns { display: inline-flex; gap: 4px; }
.lab-mk-btns form { margin: 0; }
.lab-mk-btn { min-width: 40px; justify-content: center; }
.lab-mk-btn--dobrze.is-on { background: var(--c-ok-bg); color: var(--c-ok); border-color: var(--c-ok); }
.lab-mk-btn--czesciowo.is-on { background: var(--c-warn-bg); color: var(--c-warn); border-color: var(--c-warn); }
.lab-mk-btn--zle.is-on { background: var(--c-rej-bg); color: var(--c-rej); border-color: var(--c-rej); }
.lab-mk-grade { display: flex; flex-direction: column; gap: 10px; }
.lab-mk-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.lab-mk-actions form { margin: 0; }
.lab-ph-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 8px; }
.lab-ph { margin: 0; display: flex; flex-direction: column; gap: 4px; }
.lab-ph img { width: 100%; aspect-ratio: 3 / 4; object-fit: cover; border-radius: var(--shape-sm); border: 1px solid var(--border); }
.lab-ph figcaption { display: flex; align-items: center; justify-content: space-between; gap: 4px; font-size: var(--fs-xs); color: var(--text-3); }
.lab-ph figcaption form { margin: 0; }
@media (min-width: 600px) { .lab-as-add { grid-template-columns: 1fr 1fr auto auto; } }
@media (min-width: 1100px) {
  .lab-mk { grid-template-columns: minmax(0, 1fr) 340px; }
  .lab-mk-side { position: sticky; top: 76px; }
}

/* Strona ucznia z linku: bez nawigacji panelu, czytelna na telefonie */
.sl-body { background: var(--bg); color: var(--text); margin: 0; }
.sl-page { max-width: 760px; margin: 0 auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; }
.sl-head { padding: 8px 0; }
.sl-logo { font-weight: var(--fw-black); letter-spacing: .04em; color: var(--brand-blue-text); }
.sl-title { margin: 4px 0 2px; font-size: var(--fs-2xl); line-height: var(--lh-tight); }
.sl-sub { color: var(--text-2); font-size: var(--fs-sm); }
.sl-grade { padding: 12px 14px; }
.sl-grade-val { font-size: var(--fs-md); }
.sl-grade-comment { margin: 6px 0 0; white-space: pre-line; }
.sl-progress { display: flex; align-items: center; gap: 10px; font-size: var(--fs-sm); color: var(--text-2); }
.sl-bar { flex: 1; height: 8px; accent-color: var(--brand-blue); }
.sl-tasks { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.sl-task { padding: 14px; border-left: 4px solid var(--border); display: flex; flex-direction: column; gap: 10px; }
.sl-task--dobrze { border-left-color: var(--c-ok); }
.sl-task--czesciowo { border-left-color: var(--c-warn); }
.sl-task--zle { border-left-color: var(--c-rej); }
.sl-task-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.sl-pts { color: var(--text-3); font-size: var(--fs-sm); }
.sl-verdict { font-size: var(--fs-xs); font-weight: var(--fw-semibold); padding: 2px 8px; border-radius: var(--shape-full); }
.sl-verdict--dobrze { background: var(--c-ok-bg); color: var(--c-ok); }
.sl-verdict--czesciowo { background: var(--c-warn-bg); color: var(--c-warn); }
.sl-verdict--zle { background: var(--c-rej-bg); color: var(--c-rej); }
.sl-answer { display: flex; flex-direction: column; gap: 6px; }
.sl-answer-row { display: flex; gap: 6px; }
.sl-answer-row .input { flex: 1; min-width: 0; }
.sl-choices { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.sl-choice { display: flex; align-items: baseline; gap: 8px; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--shape-sm); cursor: pointer; }
.sl-choice.is-on { border-color: var(--brand-blue); background: var(--brand-blue-soft); }
.sl-choice input { accent-color: var(--brand-blue); }
.sl-sub-q { font-size: var(--fs-sm); }
.sl-solution summary { cursor: pointer; color: var(--brand-blue-text); font-weight: var(--fw-semibold); }
.sl-final { margin-top: 6px; }
.sl-photos { padding: 14px; display: flex; flex-direction: column; gap: 10px; }
.sl-h2 { margin: 0; font-size: var(--fs-md); }
.sl-upload { display: flex; flex-direction: column; gap: 8px; }
.sl-foot { font-size: var(--fs-xs); color: var(--text-3); padding: 8px 0 24px; }

/* ── LAB-4c: praca domowa przy lekcji, wyniki ucznia i cele ─────────────── */
.lab-lesson-note { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-radius: var(--shape-sm);
  background: var(--c-ok-bg); color: var(--text); font-size: var(--fs-base); }
.lab-lesson-note .material-symbols-outlined, .lab-mk-lesson .material-symbols-outlined { color: var(--c-ok); }
.lab-mk-lesson { display: flex; align-items: center; gap: 6px; margin: 0; font-weight: var(--fw-medium); }
.lab-pr { display: flex; flex-direction: column; gap: 16px; margin-top: 16px; }
.lab-pr-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; }
.lab-pr-head .card-h, .lab-pr-head .parent-card-h { margin: 0; flex: 1 1 auto; }
.lab-pr-total { font-size: var(--fs-base); color: var(--text-2); }
.lab-pr-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; }
.lab-pr-h3 { display: flex; align-items: center; gap: 6px; margin: 0 0 10px; font-size: var(--fs-sm);
  font-weight: var(--fw-semibold); color: var(--text-3); text-transform: uppercase; letter-spacing: .04em; }
.lab-pr-h3 .material-symbols-outlined { font-size: var(--fs-lg); color: var(--primary); }
.lab-pr-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.lab-pr-item { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 10px;
  padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--shape-sm); background: var(--surface); }
.lab-pr-item-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 200px; }
.lab-pr-item-main a, .lab-pr-title { font-weight: var(--fw-medium); color: var(--text); overflow-wrap: anywhere; }
.lab-pr-item-side { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.lab-pr-pct { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
.lab-pr-weak { margin-top: 14px; padding: 12px 14px; border-radius: var(--shape-sm); background: var(--c-warn-bg);
  display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
.lab-pr-weak p { margin: 0; font-size: var(--fs-base); }
.lab-pr-goals { border-top: 1px solid var(--border); padding-top: 14px; }
.lab-pr-goal .dz-pct { display: inline-flex; align-items: center; gap: 4px; }
.lab-pr-goal-del { display: inline; }
.lab-goal-track { position: relative; }
.lab-goal-mark { position: absolute; inset: 0 auto 0 0; border-right: 2px solid var(--text); pointer-events: none; }
.lab-pr-goal-form { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; margin-top: 12px; }
.lab-pr-goal-form .field { margin: 0; flex: 1 1 160px; }
.lab-pr-goal-form .lab-pr-goal-pct { flex: 0 1 110px; }
@media (min-width: 900px) {
  .lab-pr-grid { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); }
}
/* Kolor paska skuteczności jak w Labie: od 70% zielony, poniżej 40% czerwony, pomiędzy - gradient marki. */
.progress .progress-bar.lab-bar-ok { background: var(--c-ok); }
.progress .progress-bar.lab-bar-low { background: var(--c-rej); }

/* SKLEP-LADNIE (15.10, „zająć się ładnie sklepem"): katalog jak w porządnym sklepie.
   - Telefon: dwa materiały w rzędzie zamiast jednego na cały ekran (6 materiałów to było
     ~3200 px przewijania); niższa okładka, mniejszy tytuł, bez linku „Zobacz szczegóły"
     (cała karta jest linkiem) i bez podtytułu.
   - Wszędzie: cena, informacja o najniższej cenie z 30 dni i link stoją na dole treści
     karty, a miejsce na informację o cenie jest zarezerwowane także bez promocji - ceny
     i przyciski w jednym rzędzie są na tej samej wysokości (wcześniej karta z promocją
     miała je wyżej). Tytuł do 3 linii zamiast 2 (ucinało „...z rozwiązaniami").
   - Koszyk: odstęp nad „Dodaj jeszcze" (nagłówek kleił się do karty z formularzem). */
html.sk-kv .sk-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
html.sk-kv .sk-card-title { -webkit-line-clamp: 3; min-height: 0; }
html.sk-kv .sk-card-foot { margin-top: auto; gap: 6px; }
/* SKLEP-KARTA-LUKA (27.10, właściciel: „jak ustawiłem jedną cenę ze zniżką i jedną za darmo, wysokość
   wszystkich książek się zmieniła i jest duża luka między ceną, tytułem a koszykiem"): bez rezerwowania
   dwóch linii na „Najniższa cena z 30 dni" na każdej karcie (SKLEP-LADNIE 15.10 / SKLEP-CENA-BLIZEJ 22.10
   rezerwowały je, gdy w siatce była choć jedna promocja). Linia jest tylko na karcie z promocją; reszta
   rzędu (wspólna wysokość z siatki) ma luz nad blokiem ceny, a cena i przycisk dalej stoją na dole. */
html.sk-kv .sk-card-lowest { display: block; min-height: 0; }
html.sk-kv .sk-card-lowest:empty { display: none; }
html.sk-kv .sk-card-lowest .sk-lowest { text-align: center; }
html.sk-kv .sk-card-media { height: 168px; padding: 14px; }
html.sk-kv .sk-card-media .sk-cover { height: 136px; }
html.sk-kv .sk-card-body { padding: 12px 10px 4px; }
html.sk-kv .sk-card-title { font-size: var(--fs-md); }
html.sk-kv .sk-card .sk-price { font-size: var(--fs-xl); }
html.sk-kv .sk-card-sub, html.sk-kv .sk-card-more { display: none; }
html.sk-kv .sk-card-cart { padding: 0 10px 12px; }
html.sk-kv .sk-card-cart .btn { min-height: 40px; padding: 0 10px; font-size: var(--fs-sm); }
html.sk-kv .sk-badges { justify-content: center; }
.sk-related { margin-top: 32px; }
@media (min-width: 600px) {
  html.sk-kv .sk-grid { gap: 18px; }
  html.sk-kv .sk-card-media { height: 260px; padding: 22px; }
  html.sk-kv .sk-card-media .sk-cover { height: 212px; }
  html.sk-kv .sk-card-body { padding: 18px 20px 6px; }
  html.sk-kv .sk-card-title { font-size: var(--fs-lg); }
  html.sk-kv .sk-card .sk-price { font-size: var(--fs-2xl); }
  html.sk-kv .sk-card-sub { display: -webkit-box; }
  html.sk-kv .sk-card-more { display: inline-flex; }
  html.sk-kv .sk-card-cart { padding: 0 20px 20px; }
  html.sk-kv .sk-card-cart .btn { min-height: 44px; padding: 0 16px; font-size: var(--fs-base); }
  html.sk-kv .sk-block .sk-grid { grid-template-columns: repeat(auto-fit, minmax(240px, 320px)); justify-content: center; }
}
@media (min-width: 900px) {
  html.sk-kv .sk-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  html.sk-kv .sk-block .sk-grid { grid-template-columns: repeat(auto-fit, minmax(240px, 320px)); }
}

/* SKLEP-SZEROKO (19.10, prośba właściciela „sklep jest mega centralnie ustawiony, a strona
   ma dużo miejsca - rozciągnijmy"): samodzielny sklep do 1360 px (od 22.10: 1680 px) zamiast 1040 px
   (pasek, treść, stopka), katalog w 3-4 kolumnach (z miejsca, od 1100 px). Ramka na stronie
   szkoły (`pb-embedded`) też (SKLEP-SZEROKO-RAMKA): próg liczy się od szerokości ramki,
   więc węższa ramka zostaje przy 3 kolumnach. */
@media (min-width: 1100px) {
  /* SKLEP-SZEROKO-2 (22.10, „na kompie rozciągnąć sklep bardziej na lewo i prawo"):
     do 1680 px (było 1360) z marginesem 32 px - na 1440-1920 px 4-5 kolumn katalogu. */
  html.sk-kv:not(.pb-embedded) :is(.pb-main, .sk-foot-grid, .sk-foot-legal) { max-width: 1680px; padding-left: 32px; padding-right: 32px; }
  /* okładka zastępcza (bez obrazka) rosła z kolumną - trzymamy rozmiar jak prawdziwej okładki */
  html.sk-kv:is(.pb-embedded, :not(.pb-embedded)) .sk-product-media .sk-cover--empty { max-width: 400px; }
  /* kolumny katalogu z miejsca (min. 230 px): 3 przy 1100 px, 4 od ok. 1300 px - bez nowego progu */
  /* `:is(...)` trzyma tę samą wagę co dawne `:not(.pb-embedded)` (wygrywa z `.sk-block .sk-grid`) */
  html.sk-kv:is(.pb-embedded, :not(.pb-embedded)) .sk-grid { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); }
}

/* LOGOWANIE-KV (15.10, prośba właściciela: „logo szkoły + button na lekcję próbną
   i do sklepu"): logowanie kadry i rodzica w KV strony. Telefon: karta logowania,
   pod nią kafelki „Bezpłatna lekcja próbna" i „Sklep z materiałami". Od 900 px:
   niebieski panel marki (duże logo, hasło, kafelki) po lewej, karta po prawej -
   jedna całość. Tylko `.login-wrap--split` (inne ekrany z `.login-card`, np.
   regulamin, zmiana hasła, zostają bez zmian). */
.login-wrap--split { grid-template-columns: minmax(0, 420px); justify-content: center; align-content: center; gap: 16px; }
.login-wrap--split .login-card { max-width: none; }
.login-aside { display: grid; gap: 10px; }
.login-aside-head { display: none; }
.login-tiles { display: grid; gap: 10px; }
.login-tiles-h { margin: 6px 0 2px; text-align: center; color: var(--text-2); font-size: var(--fs-sm); font-weight: var(--fw-bold); }
.login-tile { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border-radius: var(--shape-lg); border: 1px solid var(--border); background: var(--surface); color: var(--text); text-decoration: none; box-shadow: var(--elev-1); transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-std) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.login-tile:hover { transform: translateY(-2px); box-shadow: var(--elev-3); border-color: var(--primary-ring); }
.login-tile:focus-visible { outline: 3px solid var(--state-focus-primary, var(--primary)); outline-offset: 2px; }
.login-tile-ico { flex: none; display: grid; place-items: center; width: 44px; height: 44px; border-radius: var(--shape-md); color: var(--on-primary); font-size: var(--fs-2xl); box-shadow: var(--elev-2); }
.login-tile-ico--blue { background: var(--g-blue); }
.login-tile-ico--violet { background: var(--g-violet); }
.login-tile-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.login-tile-t { font-weight: var(--fw-black); font-size: var(--fs-md); letter-spacing: -0.01em; }
.login-tile-s { color: var(--text-3); font-size: var(--fs-sm); }
.login-tile-go { flex: none; color: var(--primary); font-size: var(--fs-xl); transition: transform var(--motion-fast) var(--ease-std); }
.login-tile:hover .login-tile-go { transform: translateX(3px); }
.login-wrap--split .brand-mark { width: 52px; height: 52px; }
@media (min-width: 900px) {
  .login-wrap--split { grid-template-columns: minmax(0, 440px) minmax(0, 420px); gap: 0; align-items: stretch; }
  .login-wrap--split .login-card { border-radius: 0 var(--shape-xl) var(--shape-xl) 0; border-left: 0; }
  .login-wrap--split .login-brand { display: none; }
  .login-aside { order: -1; align-content: space-between; gap: 28px; padding: 40px 36px; border-radius: var(--shape-xl) 0 0 var(--shape-xl); background: var(--g-panel); color: var(--on-primary); box-shadow: var(--shadow-card-lg); }
  .login-aside-head { display: block; }
  .login-aside-logo { display: block; width: 72px; height: 72px; padding: 8px; border-radius: var(--shape-lg); background: var(--surface); box-shadow: var(--elev-3); }
  .login-aside-name { margin: 18px 0 0; font-size: var(--fs-sm); font-weight: var(--fw-black); letter-spacing: 0.16em; text-transform: uppercase; opacity: 0.85; }
  .login-aside-title { margin: 6px 0 10px; font-size: var(--fs-3xl); font-weight: var(--fw-black); letter-spacing: -0.03em; line-height: 1.12; text-wrap: balance; }
  .login-aside-sub { margin: 0; font-size: var(--fs-md); line-height: 1.55; opacity: 0.9; }
  .login-tiles-h { text-align: left; color: var(--on-primary); opacity: 0.85; }
  .login-aside .login-tile { background: color-mix(in srgb, var(--on-primary) 12%, transparent); border-color: color-mix(in srgb, var(--on-primary) 22%, transparent); color: var(--on-primary); box-shadow: none; }
  .login-aside .login-tile:hover { background: color-mix(in srgb, var(--on-primary) 18%, transparent); border-color: color-mix(in srgb, var(--on-primary) 40%, transparent); }
  .login-aside .login-tile-s { color: var(--on-primary); opacity: 0.8; }
  .login-aside .login-tile-go { color: var(--on-primary); }
}
/* KV-AUTH (15.10): ekrany hasła, 2FA i rejestracji w tym samym układzie co logowanie -
   panel marki bez kafelków (`.login-aside--brand`): na telefonie ukryty (logo jest w karcie),
   od 900 px niebieski panel z logo i hasłem obok karty. */
.login-aside--brand { display: none; }
@media (min-width: 900px) {
  .login-aside--brand { display: grid; align-content: center; }
}
@media (prefers-reduced-motion: reduce) {
  .login-tile, .login-tile-go { transition: none; }
  .login-tile:hover { transform: none; }
}

/* KV-APLIKACJA-1 (15.10, „całą aplikację chcę mieć taką ładną"): pasek KPI rodzica jak
   kafelki ze strony szkoły - ikona w gradiencie (kolor stały dla rodzaju liczby:
   lekcje niebieski, następna lekcja fiolet, egzamin pomarańcz, płatności zieleń), duża
   liczba obok. Gradient tylko tu i w pustych stanach - nagłówki kart zostają z cichym
   kafelkiem (decyzja KV-APP 08.10: ~170 gradientów na ekranach kadry byłoby krzykliwe). */
.kpi-tiles { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.kpi-tiles .kpi-card { display: flex; align-items: center; gap: 12px; padding: 14px; border-radius: var(--shape-lg); transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-std) var(--ease-std); }
a.kpi-card:hover { transform: translateY(-2px); box-shadow: var(--elev-3); }
.kpi-ico { flex: none; display: grid; place-items: center; width: 38px; height: 38px; border-radius: var(--shape-md); color: var(--on-primary); font-size: var(--fs-xl); box-shadow: var(--elev-2); }
.kpi-ico--blue { background: var(--g-blue); }
.kpi-ico--violet { background: var(--g-violet); }
.kpi-ico--orange { background: var(--g-orange); }
.kpi-ico--green { background: var(--g-green); }
.kpi-ico--cyan { background: var(--g-cyan); }
/* Pulpit korepetytora: liczba nad podpisem, wyrównana do lewej obok ikony. */
.kpi-tiles .pz-kpi-num { line-height: 1.1; }
.kpi-tiles .card.kpi-card .kpi-label { font-size: var(--fs-xs); white-space: normal; line-height: 1.3; }
.kpi-txt { min-width: 0; }
.kpi-label { color: var(--text-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.kpi-tiles .kpi-value { font-weight: var(--fw-black); letter-spacing: -0.02em; }
@media (min-width: 600px) {
  .kpi-tiles .kpi-card { padding: 16px 18px; gap: 14px; }
  .kpi-ico { width: 44px; height: 44px; font-size: var(--fs-2xl); }
}
@media (prefers-reduced-motion: reduce) {
  .kpi-tiles .kpi-card { transition: none; }
  a.kpi-card:hover { transform: none; }
}

/* KV-EKRANY-1 (15.10, „jedź ze wszystkimi ekranami" - przegląd 53 ekranów na 390 i 1280 px):
   - Formularz filtrów (`form.filters`: użytkownicy, rachunki) na telefonie zawija się
     zamiast przewijać w bok jak pasek chipów - pole szukania było wąskie, a przycisk
     „Szukaj" i druga lista wychodziły poza ekran.
   - Pole wyboru pliku (zdjęcie profilowe, logo szkoły): pigułka w kolorze marki (reguła
     na górze pliku, przy KV-APP-AUDYT) i bez wychodzenia poza kartę na telefonie.
   - Linki dokumentów nad regulaminem i polityką: pigułki zamiast linków z kropkami -
     na telefonie kropki zostawały same w osobnych liniach. */
form.filters { flex-wrap: wrap; overflow: visible; margin-left: 0; margin-right: 0; padding-left: 0; padding-right: 0; }
form.filters > .search { flex: 1 1 260px; min-width: 0; }
input[type="file"] { max-width: 100%; }
.legal-nav { gap: 6px; }
.legal-nav > span[aria-hidden="true"] { display: none; }
.legal-nav > a { display: inline-flex; align-items: center; min-height: 32px; padding: 0 12px; border-radius: var(--shape-full); background: var(--surface-2); border: 1px solid var(--border); text-decoration: none; font-weight: var(--fw-semibold); }
.legal-nav > a:hover { background: var(--primary-container); border-color: var(--primary-ring); }

/* KV-EKRANY-2 (15.10): kafelki z liczbami w jednym stylu na kolejnych ekranach (statystyki
   szkoły, księgowość, laboratorium, rozliczenia korepetytora - `.kpi-tiles`; profil ucznia -
   mała ikona przy podpisie). Listy z kropkami statusów (leady, ogłoszenia, współprace,
   finanse - `.stat`) zostają: tam kolor kropki niesie znaczenie. */
.kpi-tiles .kpi-card .kpi-value { line-height: 1.1; }
/* Kafelek z ikoną potrzebuje szerszej kolumny niż sama liczba - przy 5 kafelkach (księgowość)
   kwota łamała się w pionie. Telefon: 2 w rzędzie, komputer: kolumny od 210 px. */
.kpi-tiles { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
/* Telefon: kwota mniejsza i może zawinąć jednostkę („zł") do linii niżej - w kolumnie 176 px
   obok ikony zostaje ok. 100 px. Komputer: kolumny od 210 px, kwota w jednej linii. */
.kpi-tiles .pz-kpi-num { font-size: var(--fs-xl); }
@media (min-width: 600px) { .kpi-tiles .pz-kpi-num { font-size: var(--fs-2xl); } }
@media (min-width: 900px) {
  .kpi-tiles { grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
  .kpi-tiles .pz-kpi-num { white-space: nowrap; }
}
.kpi-tiles .kp-kpi-status { justify-content: flex-start; }
.kpi-tiles .kpi-card .progress { width: 100%; }
.kpi-tiles .kpi-txt { flex: 1; }
a.kpi-card { color: inherit; text-decoration: none; }
.kpi-ico--sm { width: 26px; height: 26px; border-radius: var(--shape-sm); font-size: var(--fs-md); box-shadow: none; }
.profile-stat-label { display: flex; align-items: center; gap: 8px; text-transform: none; letter-spacing: 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-2); }

/* KARTA-UZYTKOWNIKA-PRZYPIETA (16.10, prośba właściciela: „info o zalogowanym zawsze
   na dole z lewej, a nie w przewijanym pasku - uczeń/rodzic/admin zawsze widzi swoje
   logo i wylogowanie"): karta z imieniem, kontem i wylogowaniem przyklejona do dołu
   menu bocznego. Menu przewija się pod nią; pas w kolorze tła menu pod kartą
   i miękkie przejście nad nią chowają pozycje, które pod nią wjeżdżają. Karta
   zostaje w przepływie (sticky), więc po przewinięciu do końca widać całe menu. */
.sidebar-foot {
  position: sticky; bottom: 0; z-index: 2; flex-shrink: 0;
  /* Krótkie menu (kursant, księgowa, zwinięte grupy): auto-margines spycha kartę
     na dół paska (wcześniejsze `margin: 0 4px 4px` zerowało `margin-top: auto`).
     Długie menu: wolnego miejsca nie ma, kartę trzyma sticky. */
  margin-top: auto;
  box-shadow: 0 24px 0 0 var(--surface), 0 -14px 14px -6px var(--surface);
}
/* Tab w dół menu: przeglądarka przewija fokus nad kartę, nie pod nią (WCAG 2.4.11). */
.sidebar { scroll-padding-bottom: 96px; }

/* ASYSTENT-KLIK (16.10, zgłoszenie właściciela: „prawa strona aplikacji w ogóle nie jest
   klikalna, dopiero jak uruchomię asystenta i zwinę do paska"): od 600 px zamknięte
   okienko asystenta stało w prawym dolnym rogu (400 x 620 px) z opacity 0 - niewidoczne,
   ale łapało kliknięcia. Atrybut `hidden` nie działał, bo `.asys-drawer { display: flex }`
   przebija regułę przeglądarki. Zamknięte okienko: bez wyświetlania, a w trakcie
   animacji zamykania (klasa `open` zdjęta, `hidden` po 220 ms) bez łapania kliknięć. */
.asys-drawer[hidden] { display: none; }
.asys-drawer:not(.open) { pointer-events: none; }

/* SKLEP-KOSZYK-PLYNNIE (19.10): „Do koszyka" bez przeładowania (pages/sklep.js) -
   komunikat na dole ekranu z linkiem do koszyka i „podskok" licznika w pasku. */
html.sk-kv .sk-toast { position: fixed; left: 50%; bottom: 20px; z-index: var(--z-toast); transform: translate(-50%, 16px);
  display: flex; align-items: center; gap: 10px; max-width: calc(100vw - 32px); box-sizing: border-box;
  padding: 10px 12px 10px 14px; border-radius: var(--shape-full); background: var(--sk-card); color: var(--text);
  border: 1px solid var(--sk-line); box-shadow: var(--sk-shadow-hover); font-size: var(--fs-sm); font-weight: var(--fw-semibold);
  opacity: 0; pointer-events: none; transition: opacity var(--sk-motion) var(--sk-ease), transform var(--sk-motion) var(--sk-ease); }
html.sk-kv .sk-toast.is-on { opacity: 1; transform: translate(-50%, 0); pointer-events: auto; }
html.sk-kv .sk-toast .material-symbols-outlined { color: var(--sk-success); font-size: var(--fs-2xl); }
html.sk-kv .sk-toast-link { margin-left: 4px; padding: 6px 14px; border-radius: var(--shape-full); background: var(--sk-primary);
  color: var(--sk-on-primary); text-decoration: none; white-space: nowrap; }
html.sk-kv .sk-toast-link:hover { background: var(--sk-primary-hover); }
html.sk-kv .sk-toast-txt { white-space: nowrap; }
html.sk-kv :is(.sk-top-badge, .sk-cart-count).is-bump { animation: sk-bump 360ms var(--sk-ease); }
@keyframes sk-bump { 0% { transform: scale(1); } 40% { transform: scale(1.35); } 100% { transform: scale(1); } }
@media (prefers-reduced-motion: reduce) {
  html.sk-kv .sk-toast { transition: none; }
  html.sk-kv :is(.sk-top-badge, .sk-cart-count).is-bump { animation: none; }
}

/* SKLEP-NEWSLETTER-KOD (19.10): okienko „-X% za zapis do newslettera" (samodzielny
   sklep) i pasek nad katalogiem w ramce. Kod przychodzi mailem - strona tylko zapisuje. */
html.sk-kv .sk-nl { width: min(440px, calc(100vw - 32px)); max-height: calc(100dvh - 32px); padding: 0; border: 0;
  border-radius: var(--sk-radius); background: var(--sk-card); color: var(--text); box-shadow: var(--sk-shadow-hover); }
html.sk-kv .sk-nl::backdrop { background: rgba(10, 30, 60, .45); }
html.sk-kv .sk-nl[open] { animation: sk-nl-in var(--sk-motion) var(--sk-ease); }
@keyframes sk-nl-in { from { opacity: 0; transform: translateY(12px) scale(.98); } to { opacity: 1; transform: none; } }
html.sk-kv .sk-nl-in { position: relative; padding: 28px 24px 18px; text-align: center; }
html.sk-kv .sk-nl-x { position: absolute; top: 10px; right: 10px; width: 40px; height: 40px; border: 0; border-radius: var(--shape-full);
  background: transparent; color: var(--text-2); cursor: pointer; display: grid; place-items: center; }
html.sk-kv .sk-nl-x:hover { background: var(--sk-bg); }
html.sk-kv .sk-nl-badge { display: inline-grid; place-items: center; margin: 0 auto 10px; min-width: 76px; height: 76px; padding: 0 10px;
  border-radius: var(--shape-full); background: var(--g-blue); color: var(--sk-on-primary); font-size: var(--fs-2xl); font-weight: var(--fw-bold); }
html.sk-kv .sk-nl-title { margin: 0 0 8px; font-size: var(--fs-xl); line-height: 1.25; }
html.sk-kv .sk-nl-lead { margin: 0 0 16px; color: var(--text-2); font-size: var(--fs-md); }
html.sk-kv .sk-nl-form { text-align: left; display: grid; gap: 8px; }
html.sk-kv .sk-nl-row { display: flex; flex-wrap: wrap; gap: 8px; }
html.sk-kv .sk-nl-row .input { flex: 1 1 200px; min-width: 0; }
html.sk-kv .sk-nl-row .btn { flex: 0 0 auto; }
html.sk-kv .sk-nl-consent { font-size: var(--fs-sm); color: var(--text-2); }
html.sk-kv .sk-nl-msg:empty { display: none; }
html.sk-kv .sk-nl-msg:focus { outline: 2px solid var(--sk-primary); outline-offset: 2px; }
html.sk-kv .sk-nl-msg { margin: 0; padding: 10px 12px; border-radius: var(--sk-radius-sm); font-size: var(--fs-md); }
html.sk-kv .sk-nl-msg.is-ok { background: var(--sk-success-soft); color: var(--sk-success); }
html.sk-kv .sk-nl-msg.is-err { background: var(--sk-highlight-soft); color: var(--sk-highlight-ink); }
html.sk-kv .sk-nl-form.is-done :is(.field-label, .sk-nl-row, .sk-nl-consent, .sk-nl-submit) { display: none; }
html.sk-kv .sk-nl-no { margin-top: 10px; border: 0; background: none; color: var(--text-2); font: inherit; font-size: var(--fs-sm);
  text-decoration: underline; cursor: pointer; padding: 8px; }
html.sk-kv .sk-nl-bar { margin: 6px 0 16px; border: 1px solid var(--sk-primary-line); border-radius: var(--sk-radius);
  background: var(--sk-primary-soft); padding: 0 14px; }
html.sk-kv .sk-nl-bar > summary { list-style: none; cursor: pointer; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px;
  padding: 12px 0; color: var(--sk-primary); font-size: var(--fs-md); }
html.sk-kv .sk-nl-bar > summary::-webkit-details-marker { display: none; }
html.sk-kv .sk-nl-bar-cta { margin-left: auto; padding: 6px 14px; border-radius: var(--shape-full); background: var(--sk-primary);
  color: var(--sk-on-primary); font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
html.sk-kv .sk-nl-bar[open] > summary .sk-nl-bar-cta { display: none; }
html.sk-kv .sk-nl-bar[open] { padding-bottom: 14px; }
html.sk-kv .sk-nl-note { margin: 6px 0 16px; }
@media (prefers-reduced-motion: reduce) { html.sk-kv .sk-nl[open] { animation: none; } }

/* SKLEP-NAGLOWEK-TELEFON (19.10): na wąskim telefonie (390 px) nazwa szkoły + „sklep"
   + ikona szkoły + przycisk „Koszyk" nie mieściły się w rzędzie - strona przewijała
   się w bok. Nazwa może się skrócić (wielokropek), a „sklep" pokazujemy od 600 px. */
/* Tytuł okienka dostaje fokus przy otwarciu (tabindex=-1, nie do klikania) - bez obwódki. */
html.sk-kv .sk-nl-title:focus { outline: none; }

/* SKLEP-KOREPETYCJE (20.10): zakładka „Korepetycje 1:1" - karta poziomu z wariantami
   (1 lekcja / pakiety), kroki „co dalej" i formularz zakupu z danymi ucznia. */
.sk-tut-buy { max-width: 760px; margin-inline: auto; }
.sk-tut-admin-img { display: block; width: 240px; height: 135px; object-fit: cover; border-radius: var(--shape-md); }

/* SKLEP-USTAWIENIA-KARTY (20.10, prośba właściciela: „w ustawieniach sklepu wszystko się na
   siebie nachodzi"): osobne karty z ikoną, wiersze „stan + przycisk", dwie kolumny od 1100 px. */
.sk-set { display: grid; gap: 14px; align-items: start; }
.sk-set-card { display: grid; gap: 12px; }
.sk-set-head { display: flex; gap: 12px; align-items: flex-start; }
.sk-set-ico { flex: 0 0 auto; width: 40px; height: 40px; display: grid; place-items: center; border-radius: var(--shape-md); background: var(--surface-2); color: var(--primary); font-size: var(--fs-xl); }
.sk-set-title { margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-bold); }
.sk-set-sub { margin: 2px 0 0; color: var(--text-2); font-size: var(--fs-sm); }
.sk-set-row { display: flex; flex-wrap: wrap; gap: 10px 16px; align-items: center; justify-content: space-between; padding-top: 12px; border-top: 1px solid var(--border); margin: 0; }
.sk-set-state { flex: 1 1 260px; min-width: 0; }
.sk-set-state p { margin: 4px 0 0; color: var(--text-2); font-size: var(--fs-sm); }
.sk-set-form { display: grid; gap: 12px; margin: 0; }
.sk-set-form .field { margin: 0; }
.sk-set-fields { display: grid; gap: 10px; }
.sk-set-actions { display: flex; justify-content: flex-end; }
.sk-set-stats { display: flex; flex-wrap: wrap; gap: 8px; padding-top: 12px; border-top: 1px solid var(--border); }
.sk-set-stats span { padding: 6px 10px; border-radius: var(--shape-md); background: var(--surface-2); font-size: var(--fs-sm); }
.sk-set-links { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px 16px; }
.sk-set-links a { display: inline-flex; gap: 6px; align-items: center; font-size: var(--fs-sm); }
.sk-set-links .material-symbols-outlined { font-size: var(--fs-lg); }
.sk-set-foot { margin: 0; padding-top: 12px; border-top: 1px solid var(--border); }
@media (min-width: 600px) {
  .sk-set-fields { grid-template-columns: 1fr 160px; align-items: end; }
}
@media (min-width: 1100px) {
  .sk-set { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* MOBILE-KARTY (20.10): adres produktu w liście sklepu (panel); układ na
   telefonie w bloku table.tbl-m (ta sama warstwa, żeby tamte reguły wygrywały). */
@layer utilities {
  .sk-prod-slug { overflow-wrap: anywhere; }
  .sk-prod-lvl::after { content: " · "; }
}

/* OFERTA-DODAJ (20.10): formularz nowej pozycji oferty jako siatka zamiast
   jednego zawijanego wiersza (na telefonie pola miały różne szerokości). */
@layer components {
  .of-add { margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--outline-variant); }
  .of-add-title { margin: 0 0 12px; font-size: var(--fs-md); font-weight: var(--fw-semibold); }
  .of-add-grid { display: grid; gap: 12px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .of-add-grid .field { margin: 0; min-width: 0; }
  .of-add-grid :is(.input, .select) { width: 100%; }
  .of-add-wide { grid-column: 1 / -1; }
  .of-add-foot { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; justify-content: space-between; margin-top: 12px; }
  @media (min-width: 900px) {
    .of-add-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  }
  @media (min-width: 1100px) {
    .of-add-grid { grid-template-columns: 2fr repeat(3, minmax(0, 1fr)); }
    .of-add-wide { grid-column: auto; grid-row: span 2; align-self: start; }
  }
}


/* SKLEP-KV-STRONA (20.10, prośba właściciela „KV sklepu a naszej strony to dwie różne rzeczy,
   dostosuj do korepetycjesolve.com"): sklep w wyglądzie /cennik z motywu strony (style.css 3.95).
   Wartości 1:1 w tokens.css (`--sk-ink*`, `--sk-grad-*`, `--sk-hdr-bg`, `--sk-final-bg`, `--sk-ftr-bg`);
   tu tylko układ. Bez warstwy i z `html.sk-kv`, żeby wygrać z wcześniejszymi regułami sklepu.
   Mobile-first: telefon to podstawa, szersze ekrany od 600 / 900 / 1100 px. */

/* --- typografia sekcji: napis z kreskami (.sp-kick) i tytuł z gradientem w <em> --- */
html.sk-kv .pb-body { color: var(--sk-ink); }
html.sk-kv .sk-eyebrow { display: flex; align-items: center; justify-content: center; gap: 12px; margin: 0 0 14px;
  color: var(--sk-primary); font-size: var(--fs-base); font-weight: var(--fw-heavy); letter-spacing: .16em; line-height: 1.3; text-transform: uppercase; }
html.sk-kv .sk-eyebrow::before, html.sk-kv .sk-eyebrow::after { content: ""; flex: none; width: 28px; height: 3px; border-radius: 3px; background: var(--sk-grad-kick); }
html.sk-kv .sk-eyebrow::after { background: var(--sk-grad-kick-r); }
html.sk-kv .sk-eyebrow .material-symbols-outlined { display: none; }
html.sk-kv .sk-eyebrow--light { color: var(--sk-card); }
html.sk-kv .sk-eyebrow--light::before, html.sk-kv .sk-eyebrow--light::after { background: rgba(255, 255, 255, .75); }
html.sk-kv .sk-block-head { margin: 0 auto 28px; max-width: 760px; }
html.sk-kv .sk-block-title { font-size: clamp(27px, 4.2vw, 44px); font-weight: var(--fw-heavy); letter-spacing: -0.03em; line-height: 1.1; text-wrap: balance; color: var(--sk-ink); }
html.sk-kv :is(.sk-block-title, .sk-final-title, .sk-hero-title) em { font-style: normal; background-image: var(--sk-grad-text);
  -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent;
  /* zapas na ogonki i kreski polskich liter (jak 3.95 na stronie) */
  padding: .14em .04em .18em; margin: 0 -.04em; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
html.sk-kv .sk-block-lead { margin: 12px auto 0; max-width: 580px; color: var(--sk-ink-muted); font-size: clamp(15px, 2vw, 17px); line-height: 1.55; }

/* --- nagłówek jak .sp-hdr: niebieski gradient, białe pigułki, koszyk jako biały przycisk --- */
/* SKLEP-NAGLOWEK-1-LINIA (22.10, „e-booki i korepetycje w drugiej linii, header gruby"):
   na telefonie jeden rząd - logo bez nazwy, działy (od 27.10 także „Strona główna"), ikona panelu dla
   zalogowanych i koszyk z licznikiem (napis „Koszyk" ma przycisk przy dolnej krawędzi). Od 600 px nazwa
   i napis wracają. Trzy działy na wąskim ekranie przewijają się poziomo bez paska. */

/* --- przycisk główny i karty w stylu strony --- */
html.sk-kv .btn.accent { box-shadow: var(--sk-shadow-primary); font-weight: var(--fw-black); }
html.sk-kv .sk-card, html.sk-kv .pb-panel, html.sk-kv .sk-mini { border-color: var(--sk-site-line); border-radius: var(--shape-xl); box-shadow: var(--sk-shadow-card); }
html.sk-kv .sk-card:hover { border-color: var(--sk-primary); }
html.sk-kv .sk-card-title { color: var(--sk-ink); font-weight: var(--fw-black); }
html.sk-kv .sk-card-sub { color: var(--sk-ink-muted); }

/* --- Korepetycje 1:1 = cennik (CENNIK-W-PANELU, 21.10): tabela 1:1 z /cennik strony
   (.sp-tab z motywu 3.95, szkic CENNIK-TABELA), wartości w tokens.css. Mobile-first:
   wiersz jako karta z siatką "t n n" / "p p s" / "c c c", od 960 px kolumny tabeli. --- */
:is(html.sk-kv, .sk-cn-scope) .sk-cn { max-width: 1152px; margin: 0 auto; padding: clamp(28px, 6vw, 64px) 0 clamp(28px, 5vw, 48px); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-head { max-width: 760px; margin: 0 auto clamp(30px, 4vw, 44px); text-align: center; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-title { margin: 0 0 18px; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-sub { max-width: 620px; margin: 0 auto; color: var(--sk-ink-muted); font-size: clamp(15.5px, 2vw, 17.5px); line-height: 1.6; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-sub strong { color: var(--sk-ink); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-controls { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px 28px; margin: 0 0 clamp(40px, 5.4vw, 60px); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-ctl { display: flex; flex-direction: column; align-items: center; gap: 10px; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-ctl-label { color: var(--sk-ink-muted); font-size: var(--fs-sm); font-weight: var(--fw-heavy); letter-spacing: .08em; text-transform: uppercase; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-seg { display: inline-flex; padding: 4px; border-radius: var(--shape-full); background: var(--sk-card); border: 1.5px solid var(--sk-len-line); box-shadow: var(--sk-shadow-len); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-seg a { display: inline-flex; align-items: center; justify-content: center; min-width: 0; min-height: 44px; padding: 9px 14px; border-radius: var(--shape-full);
  color: var(--sk-ink-muted); font-size: var(--fs-md); font-weight: var(--fw-heavy); text-decoration: none; transition: background-color .2s, color .2s; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-seg a:hover { color: var(--sk-primary); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-seg a[aria-current] { background: var(--sk-primary); color: var(--sk-on-primary); box-shadow: var(--sk-shadow-primary); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-seg a:focus-visible { outline: 2px solid var(--sk-accent); outline-offset: 2px; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-intro { display: grid; gap: 14px; justify-items: center; max-width: 720px; margin: 0 auto 28px; text-align: center; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-intro-img { display: block; width: 100%; max-width: 420px; height: auto; aspect-ratio: 16 / 9; object-fit: cover; border-radius: var(--shape-xl); box-shadow: var(--sk-shadow-card); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-intro-h { margin: 0; color: var(--sk-ink); font-size: clamp(19px, 2.4vw, 22px); font-weight: var(--fw-black); letter-spacing: -0.02em; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-intro-p { margin: 6px 0 0; color: var(--sk-ink-muted); line-height: 1.55; }
/* nagłówek grupy (prośba właściciela 21.10: „ładniejsze nagłówki"): kafelek z ikoną, tytuł, podtytuł */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-group { display: flex; align-items: center; flex-wrap: wrap; gap: 12px 16px; margin: 0 4px 18px; padding-bottom: 16px; border-bottom: 1px solid var(--sk-site-line); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-group-ico { flex: none; display: flex; align-items: center; justify-content: center; width: 46px; height: 46px; border-radius: var(--shape-lg);
  color: var(--sk-on-primary); background: var(--g-blue); box-shadow: var(--sk-shadow-tile-blue); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-group-ico--exam { background: var(--g-orange); box-shadow: var(--sk-shadow-tile-orange); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-group-txt { flex: 1 1 240px; min-width: 0; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-group-h { margin: 0; color: var(--sk-ink); font-size: clamp(20px, 2.6vw, 24px); font-weight: var(--fw-black); letter-spacing: -0.02em; line-height: var(--lh-tight); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-group-p { margin: 4px 0 0; color: var(--sk-ink-muted); font-size: var(--fs-md); line-height: 1.45; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-chip { display: inline-flex; align-items: center; gap: 7px; padding: 6px 13px; border-radius: var(--shape-full); background: var(--sk-primary-pale);
  border: 1px solid var(--sk-primary-100); color: var(--sk-primary-deep); font-size: var(--fs-sm); font-weight: var(--fw-heavy); white-space: nowrap; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-chip svg { flex: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-cols { display: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-list { display: grid; gap: 14px; margin: 0 0 clamp(48px, 6vw, 72px); padding: 0; list-style: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row { position: relative; display: grid; grid-template-columns: 60px minmax(0, 1fr) minmax(0, 1fr); grid-template-areas: "t n n" "p p s" "c c c"; gap: 12px 14px;
  align-items: center; margin: 0; padding: 18px 16px 16px; background: var(--sk-card); border: 1px solid var(--sk-site-line); border-radius: var(--shape-xl);
  box-shadow: var(--sk-shadow-card); transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease; }
@media (hover: hover) { :is(html.sk-kv, .sk-cn-scope) .sk-cn-row:hover { transform: translateY(-3px); border-color: var(--sk-primary-100); box-shadow: var(--sk-shadow-row-hover); } }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.is-rec { margin-top: 8px; border: 2px solid var(--sk-primary); background: var(--sk-grad-rec); box-shadow: var(--sk-shadow-featured); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.is-dim { background: var(--sk-bg); box-shadow: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-badge { position: absolute; top: -13px; left: 16px; display: inline-flex; align-items: center; gap: 6px; padding: 5px 13px; border-radius: var(--shape-full);
  background: var(--sk-grad-badge); color: var(--sk-on-primary); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .1em; text-transform: uppercase; white-space: nowrap; box-shadow: var(--sk-shadow-primary); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-badge .material-symbols-outlined { font-size: var(--fs-md); font-variation-settings: "FILL" 1; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile { grid-area: t; display: flex; flex-direction: column; align-items: center; justify-content: center; width: 60px; height: 60px; border-radius: 17px;
  color: var(--sk-on-primary); background: var(--g-blue); box-shadow: var(--sk-shadow-tile-blue); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile b { font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: -0.03em; line-height: 1; font-variant-numeric: tabular-nums; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile small { margin-top: 3px; font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .06em; text-transform: uppercase; opacity: .9; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile--slate { background: var(--sk-grad-slate); box-shadow: var(--sk-shadow-tile-slate); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile--violet { background: var(--g-violet); box-shadow: var(--sk-shadow-tile-violet); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile--green { background: var(--g-green); box-shadow: var(--sk-shadow-tile-green); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile--orange { background: var(--g-orange); box-shadow: var(--sk-shadow-tile-orange); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-info { grid-area: n; min-width: 0; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.has-gets { grid-template-areas: "t n n" "p p s" "c c c" "g g g"; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-more { grid-area: g; min-width: 0; margin-top: -4px; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-more-btn { display: flex; align-items: center; justify-content: center; gap: 6px; width: fit-content; min-height: 30px; margin: 0 auto; padding: 4px 12px;
  border-radius: var(--shape-full); color: var(--sk-primary); font-size: var(--fs-base); font-weight: var(--fw-heavy); list-style: none; cursor: pointer; transition: background-color .2s; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-more-btn::-webkit-details-marker { display: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-more-btn:hover { background: var(--sk-primary-soft); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-more-btn:focus-visible { outline: 2px solid var(--sk-accent); outline-offset: 2px; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-more-btn svg { flex: none; transition: transform .2s; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-more[open] .sk-cn-more-btn svg { transform: rotate(180deg); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gets { display: grid; gap: 10px 24px; margin: 10px 0 0; padding: 16px 18px; border-radius: var(--shape-lg); background: var(--sk-primary-soft);
  border: 1px solid var(--sk-primary-line); list-style: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gets li { position: relative; margin: 0; padding-left: 18px; color: var(--sk-ink); font-size: var(--fs-md); font-weight: var(--fw-medium); line-height: 1.45; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gets li::before { content: ""; position: absolute; left: 2px; top: .5em; width: 7px; height: 7px; border-radius: 50%; background: var(--sk-grad-badge); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-name { display: block; color: var(--sk-ink); font-size: var(--fs-xl); font-weight: var(--fw-black); letter-spacing: -0.02em; line-height: var(--lh-tight); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-for { display: block; margin-top: 4px; color: var(--sk-ink-muted); font-size: var(--fs-md); line-height: 1.45; }
/* kolumny cen (prośba właściciela 21.10 „ideolo"): ten sam układ w obu - kwota, podpis tuż
   pod nią, dodatek (oszczędność / raty); wiersze o stałej wysokości, więc kwoty, podpisy
   i dodatki stoją na tych samych liniach. Telefon: cena za lekcję z lewej, całość z prawej. */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-per, :is(html.sk-kv, .sk-cn-scope) .sk-cn-total { display: grid; grid-template-rows: 40px 18px; align-content: center; white-space: nowrap; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-per { grid-area: p; justify-items: start; text-align: left; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-total { grid-area: s; justify-items: end; text-align: right; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-amt { display: flex; align-items: baseline; gap: 3px; align-self: end; line-height: 1; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-cap { align-self: start; padding-top: 4px; color: var(--sk-ink-soft); font-size: var(--fs-sm); line-height: 14px; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-per-num { color: var(--sk-ink); font-size: 34px; font-weight: var(--fw-black); letter-spacing: -0.04em; line-height: 1; font-variant-numeric: tabular-nums; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.is-rec .sk-cn-per-num { background-image: var(--sk-grad-price); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-zl { color: var(--sk-ink-muted); font-size: var(--fs-lg); font-weight: var(--fw-bold); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-total-num { color: var(--sk-ink); font-size: var(--fs-2xl); font-weight: var(--fw-heavy); letter-spacing: -0.02em; line-height: 1; font-variant-numeric: tabular-nums; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-zl--sm { font-size: var(--fs-md); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-total-note { color: var(--sk-ink-muted); font-size: var(--fs-md); font-weight: var(--fw-bold); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-save { display: inline-block; padding: 4px 10px; border-radius: var(--shape-full); background: var(--sk-success-pale); border: 1px solid var(--sk-success-line);
  color: var(--sk-success-ink); font-size: var(--fs-sm); font-weight: var(--fw-heavy); line-height: 1.3; white-space: nowrap; }
/* prośba właściciela 21.10: raty „jakimś kolorkiem" - pigułka w kolorze marki jak oszczędność w zielonym */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-raty { display: inline-block; padding: 4px 10px; border-radius: var(--shape-full); background: var(--sk-primary-pale); border: 1px solid var(--sk-primary-100);
  color: var(--sk-primary-deep); font-size: var(--fs-sm); font-weight: var(--fw-semibold); line-height: 1.3; white-space: nowrap; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-raty strong { color: var(--sk-primary-deep); font-weight: var(--fw-black); white-space: nowrap; }
/* DOKUP-WYGLAD (21.10): cena z kodem stałego ucznia (tylko „Dokup lekcje” rodzica) */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-code { display: inline-block; padding: 4px 10px; border-radius: var(--shape-full); background: var(--sk-highlight-soft);
  border: 1px solid var(--sk-highlight); color: var(--sk-highlight-ink); font-size: var(--fs-sm); font-weight: var(--fw-semibold); line-height: 1.3; white-space: nowrap; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-code strong { font-weight: var(--fw-black); }
/* „Dokup lekcje” w panelu rodzica: karty cennika (układ z telefonu) w dwóch kolumnach,
   gdy jest miejsce - panel ma węższą treść niż sklep, więc bez układu tabeli z 1100 px. */
.sk-cn-scope { color: var(--sk-ink); }
div.sk-cn-scope .sk-cn-list { grid-template-columns: repeat(auto-fill, minmax(min(100%, 330px), 1fr)); margin-bottom: 28px; }
/* DOKUP-PLATNOSCI (21.10, „każda karta jest innej wysokości"): karty w rzędzie równe -
   nadmiar wysokości bierze wiersz z nazwą, więc ceny, dodatki i przycisk stoją na jednej linii */
div.sk-cn-scope .sk-cn-row { grid-template-rows: 1fr; }
div.sk-cn-scope :is(.sk-cn-tile, .sk-cn-info) { align-self: start; }
div.sk-cn-scope .sk-cn-controls { margin-bottom: 26px; }
div.sk-cn-scope .sk-cn-group-h { margin: 0; }
/* panel w trybie ciemnym: karty cennika zostają jasne (jak sklep), a napisy poza kartami
   (nagłówki grup, etykiety przełączników) biorą kolory panelu, żeby były czytelne */
html.dark div.sk-cn-scope .sk-cn-group-h { color: var(--text); }
html.dark div.sk-cn-scope :is(.sk-cn-group-p, .sk-cn-ctl-label) { color: var(--text-2); }
html.dark div.sk-cn-scope .sk-cn-group { border-bottom-color: var(--border); }
/* CENNIK-RAMKA-POPRAWKI (21.10, „% się rozlewa na następną linię", „oszczędzanie może być na
   całym pasku"): dodatki jako pasek na całą szerokość karty, pod cenami. */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.has-extra { grid-template-areas: "t n n" "p p s" "x x x" "c c c"; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.has-extra.has-gets { grid-template-areas: "t n n" "p p s" "x x x" "c c c" "g g g"; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-extras { grid-area: x; display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-extras > * { flex: 1 1 100%; padding: 6px 12px; text-align: center; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-cta { grid-area: c; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; width: 100%; min-height: 44px; padding: 10px 16px; border-radius: var(--shape-full);
  background: var(--sk-card); border: 1.5px solid var(--sk-primary); color: var(--sk-primary); font-size: var(--fs-md); font-weight: var(--fw-heavy); text-decoration: none; white-space: nowrap;
  transition: transform .2s, background .2s, color .2s, box-shadow .2s; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-btn:hover { background: var(--sk-primary); color: var(--sk-on-primary); transform: translateY(-1px); box-shadow: var(--sk-shadow-primary); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-btn svg { flex: none; transition: transform .2s; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-btn:hover svg { transform: translateX(3px); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.is-rec .sk-cn-btn { background: var(--sk-primary); color: var(--sk-on-primary); box-shadow: var(--sk-shadow-primary); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.is-rec .sk-cn-btn:hover { background: var(--sk-primary-hover); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-btn--ghost { border-color: var(--sk-line-strong); color: var(--sk-ink-muted); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-steps { display: grid; grid-template-columns: 1fr; gap: 12px; max-width: 560px; margin: 0 auto clamp(32px, 4.4vw, 48px); padding: 0; list-style: none; counter-reset: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-step { position: relative; display: flex; align-items: flex-start; gap: 14px; margin: 0; padding: 16px 18px; text-align: left;
  background: var(--sk-card); border: 1px solid var(--sk-site-line); border-radius: var(--shape-xl); box-shadow: var(--sk-shadow-step); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-step-n { flex: none; display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 13px;
  color: var(--sk-on-primary); font-size: var(--fs-lg); font-weight: var(--fw-black); background: var(--g-violet); box-shadow: var(--sk-shadow-tile-violet); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-step:nth-child(2) .sk-cn-step-n { background: var(--g-blue); box-shadow: var(--sk-shadow-tile-blue); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-step:nth-child(3) .sk-cn-step-n { background: var(--g-green); box-shadow: var(--sk-shadow-tile-green); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-step-body { min-width: 0; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-step-h { display: block; margin: 1px 0 4px; color: var(--sk-ink); font-size: var(--fs-lg); font-weight: var(--fw-black); letter-spacing: -0.015em; line-height: 1.25; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-step-p { display: block; color: var(--sk-ink-muted); font-size: var(--fs-base); line-height: var(--lh-base); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-help { position: relative; overflow: hidden; display: flex; flex-direction: column; align-items: center; justify-content: space-between; gap: 20px 28px;
  padding: clamp(28px, 3.6vw, 40px) clamp(22px, 3.8vw, 44px); border-radius: var(--shape-xl); text-align: center; color: var(--sk-on-primary); background: var(--sk-help-bg); box-shadow: var(--sk-shadow-help); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-help-h { display: block; margin: 0 0 8px; color: var(--sk-on-primary); font-size: clamp(19px, 2.4vw, 23px); font-weight: var(--fw-black); letter-spacing: -0.02em; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-help-p { display: block; color: var(--sk-on-blue-muted); font-size: var(--fs-md); line-height: var(--lh-base); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-help-btns { display: flex; flex-direction: column; flex-wrap: wrap; gap: 12px; width: 100%; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-help-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 14px 24px; border-radius: var(--shape-full); background: var(--sk-card);
  color: var(--sk-primary); font-size: var(--fs-md); font-weight: var(--fw-heavy); text-decoration: none; white-space: nowrap; box-shadow: var(--sk-shadow-help-btn); transition: transform .2s; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-help-btn:hover { transform: translateY(-2px); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-help-btn--wa { background: var(--sk-wa); color: var(--sk-on-primary); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-empty { text-align: center; color: var(--sk-ink-muted); }
@media (min-width: 600px) {
  :is(html.sk-kv, .sk-cn-scope) .sk-cn-seg a { min-width: 96px; padding: 9px 18px; font-size: var(--fs-md); }
  :is(html.sk-kv, .sk-cn-scope) .sk-cn-badge { left: 26px; }
}
@media (min-width: 1100px) {
  html.sk-kv .sk-cn-cols { display: grid; grid-template-columns: 64px minmax(0, 1fr) 190px 190px 160px; gap: 16px; align-items: center; padding: 0 24px 4px;
    color: var(--sk-ink-soft); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .1em; text-transform: uppercase; }
  html.sk-kv .sk-cn-cols span:nth-child(3), html.sk-kv .sk-cn-cols span:nth-child(4) { text-align: center; }
  html.sk-kv .sk-cn-row { grid-template-columns: 64px minmax(0, 1fr) 190px 190px 160px; grid-template-areas: "t n p s c"; gap: 6px 16px; padding: 16px 24px; }
  html.sk-kv .sk-cn-tile { width: 64px; height: 64px; border-radius: var(--shape-lg); }
  html.sk-kv .sk-cn-tile b { font-size: var(--fs-3xl); }
  /* prośba właściciela 21.10: większe ceny („jest miejsce"), obie kolumny wyśrodkowane */
  html.sk-kv .sk-cn-per-num { font-size: var(--fs-display); }
  html.sk-kv .sk-cn-zl { font-size: var(--fs-xl); }
  html.sk-kv .sk-cn-total-num { font-size: var(--fs-3xl); }
  html.sk-kv .sk-cn-zl--sm { font-size: var(--fs-lg); }
  html.sk-kv :is(.sk-cn-per, .sk-cn-total) { grid-template-rows: 44px 18px; justify-items: center; text-align: center; }
  /* prośba właściciela 21.10: cena, całość i przycisk w pionie na środku karty (obok nazwy
     i „Co zawiera pakiet"); po rozwinięciu listy zostają przy górnym wierszu */
  html.sk-kv .sk-cn-row.has-gets { grid-template-areas: "t n p s c" "t g p s c"; }
  html.sk-kv .sk-cn-row.has-gets:has(.sk-cn-more[open]) { grid-template-areas: "t n p s c" "t g g g g"; }
  /* dodatki pod swoimi kolumnami (siatka podrzędna): oszczędność pod ceną za lekcję,
     raty i cena z kodem pod całością */
  html.sk-kv .sk-cn-extras { display: grid; grid-template-columns: subgrid; row-gap: 6px; justify-items: center; align-items: start; }
  html.sk-kv .sk-cn-extras > * { flex: none; grid-column: 2; padding: 4px 10px; }
  html.sk-kv .sk-cn-extras .sk-cn-save { grid-column: 1; grid-row: 1; }
  html.sk-kv .sk-cn-row.has-extra { grid-template-areas: "t n p s c" "t n x x c"; }
  html.sk-kv .sk-cn-row.has-extra.has-gets { grid-template-areas: "t n p s c" "t g x x c"; }
  html.sk-kv .sk-cn-row.has-extra.has-gets:has(.sk-cn-more[open]) { grid-template-areas: "t n p s c" "t . x x c" "t g g g g"; }
  html.sk-kv .sk-cn-row.has-extra :is(.sk-cn-per, .sk-cn-total) { align-self: end; }
  html.sk-kv .sk-cn-row.has-gets:has(.sk-cn-more[open]) .sk-cn-tile { align-self: start; margin-top: 4px; }
  html.sk-kv .sk-cn-more { margin-top: -6px; }
  html.sk-kv .sk-cn-more-btn { margin: 0 0 0 -12px; }
  html.sk-kv .sk-cn-gets { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); }
  html.sk-kv .sk-cn-steps { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; max-width: none; }
  /* prośba właściciela 21.10: kroki wyśrodkowane - cyfra nad tytułem, tytuł i opis pośrodku */
  html.sk-kv .sk-cn-step { flex-direction: column; align-items: center; gap: 10px; padding: 20px 18px; text-align: center; }
  html.sk-kv .sk-cn-step-h { margin: 0 0 4px; }
  html.sk-kv .sk-cn-step:not(:last-child)::after { content: ""; position: absolute; top: 50%; right: -19px; width: 9px; height: 9px; margin-top: -5px;
    border-top: 2.5px solid var(--sk-accent); border-right: 2.5px solid var(--sk-accent); transform: rotate(45deg); }
  html.sk-kv .sk-cn-help { flex-direction: row; flex-wrap: wrap; align-items: center; text-align: left; }
  html.sk-kv .sk-cn-help-btns { flex-direction: row; width: auto; }
}
@media (prefers-reduced-motion: reduce) {
  :is(html.sk-kv, .sk-cn-scope) :is(.sk-cn-row, .sk-cn-btn, .sk-cn-btn svg, .sk-cn-help-btn, .sk-cn-seg a, .sk-cn-more-btn, .sk-cn-more-btn svg) { transition: none; }
  :is(html.sk-kv, .sk-cn-scope) :is(.sk-cn-row:hover, .sk-cn-btn:hover, .sk-cn-btn:hover svg, .sk-cn-help-btn:hover) { transform: none; }
}

/* SKLEP-OK (21.10, prośba właściciela): potwierdzenie płatności jako karta sukcesu */
html.sk-kv .sk-ok { display: flex; align-items: center; gap: 16px; margin: 0 0 18px; padding: 18px 20px; border-radius: var(--shape-xl);
  background: var(--sk-success-pale); border: 1px solid var(--sk-success-line); }
html.sk-kv .sk-ok-ico { flex: none; display: flex; align-items: center; justify-content: center; width: 52px; height: 52px; border-radius: 50%;
  color: var(--sk-on-primary); background: var(--g-green); box-shadow: var(--sk-shadow-tile-green); }
html.sk-kv .sk-ok-ico .material-symbols-outlined { font-size: var(--fs-3xl); font-weight: var(--fw-bold); }
html.sk-kv .sk-ok-txt { min-width: 0; }
html.sk-kv .sk-ok-title { margin: 0; color: var(--sk-success-ink); font-size: var(--fs-xl); font-weight: var(--fw-black); letter-spacing: -0.01em; line-height: var(--lh-tight); }
html.sk-kv .sk-ok-sub { margin: 4px 0 0; color: var(--sk-ink-muted); font-size: var(--fs-md); }
html.sk-kv .sk-ok-sub strong { color: var(--sk-ink); }
html.sk-kv .sk-ok-facts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 0 0 14px; }
html.sk-kv .sk-ok-facts > div { padding: 12px 14px; border-radius: var(--shape-lg); background: var(--sk-bg); border: 1px solid var(--sk-site-line); }
html.sk-kv .sk-ok-facts dt { color: var(--sk-ink-soft); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .08em; text-transform: uppercase; }
html.sk-kv .sk-ok-facts dd { margin: 3px 0 0; color: var(--sk-ink); font-size: var(--fs-md); font-weight: var(--fw-bold); }
html.sk-kv .sk-ok-note { margin: 0 0 14px; color: var(--sk-ink-muted); font-size: var(--fs-md); }
html.sk-kv .sk-ok-h { margin: 6px 0 10px; color: var(--sk-ink); font-size: var(--fs-lg); font-weight: var(--fw-black); }
html.sk-kv .sk-ok-steps { display: grid; gap: 10px; margin: 0 0 16px; padding: 0; list-style: none; }
html.sk-kv .sk-ok-steps li { display: flex; align-items: flex-start; gap: 12px; color: var(--sk-ink-muted); font-size: var(--fs-md); line-height: var(--lh-base); }
html.sk-kv .sk-ok-steps strong { display: block; color: var(--sk-ink); font-weight: var(--fw-heavy); }
html.sk-kv .sk-ok-n { flex: none; display: flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: var(--shape-md);
  color: var(--sk-on-primary); background: var(--g-blue); font-size: var(--fs-base); font-weight: var(--fw-black); }
html.sk-kv .sk-ok-steps li:nth-child(2) .sk-ok-n { background: var(--g-violet); }
html.sk-kv .sk-ok-steps li:nth-child(3) .sk-ok-n { background: var(--g-green); }
html.sk-kv .sk-ok-btn { margin-bottom: 6px; }
@media (min-width: 600px) { html.sk-kv .sk-ok-facts { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
/* Formularz zakupu pakietu: .pz-consent-check i pola mają display flex/grid, które wygrywa
   z atrybutem hidden (zgoda na raty, pole e-mail polecającego, dopisek, kod przy ratach) */
html.sk-kv .sk-of [hidden] { display: none; }
/* SKLEP-KUP-PAKIET (21.10, prośba właściciela „wizualnie mega kiepsko"): strona zakupu pakietu -
   karta jak wiersz cennika: zdjęcie albo grafika z liczbą lekcji, nazwa, ceny, pigułki, „Co zawiera" */
html.sk-kv .sk-bp { display: grid; gap: 0; margin: 0 0 14px; overflow: hidden; background: var(--sk-card); border: 1px solid var(--sk-site-line);
  border-radius: var(--shape-xl); box-shadow: var(--sk-shadow-card); }
html.sk-kv .sk-bp-media { min-height: 180px; background: var(--sk-bg); }
html.sk-kv .sk-bp-img { display: block; width: 100%; height: 100%; min-height: 180px; max-height: 300px; object-fit: cover; }
html.sk-kv .sk-bp-art { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; height: 100%; min-height: 180px;
  color: var(--sk-on-primary); background: var(--sk-help-bg); text-align: center; }
html.sk-kv .sk-bp-art--exam { background: var(--g-orange); }
html.sk-kv .sk-bp-art--one { background: var(--sk-grad-slate); }
html.sk-kv .sk-bp-art b { font-size: 64px; font-weight: var(--fw-black); letter-spacing: -0.04em; line-height: 1; }
html.sk-kv .sk-bp-art span { font-size: var(--fs-lg); font-weight: var(--fw-heavy); letter-spacing: .08em; text-transform: uppercase; }
html.sk-kv .sk-bp-art small { margin-top: 6px; padding: 4px 12px; border-radius: var(--shape-full); background: var(--sk-on-blue-muted); color: var(--sk-primary-deep);
  font-size: var(--fs-sm); font-weight: var(--fw-heavy); }
html.sk-kv .sk-bp-body { padding: 20px 20px 22px; }
html.sk-kv .sk-bp-kicker { margin: 0 0 6px; color: var(--sk-primary); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .12em; text-transform: uppercase; }
html.sk-kv .sk-bp-title { margin: 0; color: var(--sk-ink); font-size: clamp(24px, 3.4vw, 32px); font-weight: var(--fw-black); letter-spacing: -0.02em; line-height: var(--lh-tight); }
html.sk-kv .sk-bp-meta { margin: 6px 0 0; color: var(--sk-ink-soft); font-size: var(--fs-md); font-weight: var(--fw-semibold); }
html.sk-kv .sk-bp-desc { margin: 10px 0 0; color: var(--sk-ink-muted); font-size: var(--fs-md); line-height: var(--lh-base); }
html.sk-kv .sk-bp-prices { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; margin: 16px 0 0; padding: 14px 0 0; border-top: 1px solid var(--sk-site-line); }
html.sk-kv .sk-bp-price { display: grid; grid-template-columns: auto 1fr; align-items: baseline; column-gap: 4px; }
html.sk-kv .sk-bp-num { color: var(--sk-ink); font-size: var(--fs-display); font-weight: var(--fw-black); letter-spacing: -0.04em; line-height: 1; font-variant-numeric: tabular-nums; }
/* W-E18 (05.11): cena płaskim niebieskim marki - strona szkoły nie ma gradientów w tekście */
html.sk-kv .sk-bp-price:first-child .sk-bp-num { color: var(--zs-blue); }
html.sk-kv .sk-bp-zl { color: var(--sk-ink-muted); font-size: var(--fs-xl); font-weight: var(--fw-bold); }
html.sk-kv .sk-bp-cap { grid-column: 1 / -1; margin-top: 2px; color: var(--sk-ink-soft); font-size: var(--fs-sm); }
html.sk-kv .sk-bp-chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 0; }
html.sk-kv .sk-bp-chips:empty { display: none; }
html.sk-kv :is(.sk-bp-save, .sk-bp-raty, .sk-bp-code-chip) { display: inline-block; padding: 5px 12px; border-radius: var(--shape-full); font-size: var(--fs-sm); line-height: 1.3; }
html.sk-kv .sk-bp-save { background: var(--sk-success-pale); border: 1px solid var(--sk-success-line); color: var(--sk-success-ink); font-weight: var(--fw-heavy); }
html.sk-kv .sk-bp-raty { background: var(--sk-primary-pale); border: 1px solid var(--sk-primary-100); color: var(--sk-primary-deep); font-weight: var(--fw-semibold); }
html.sk-kv .sk-bp-raty strong { font-weight: var(--fw-black); white-space: nowrap; }
html.sk-kv .sk-bp-code-chip { background: var(--sk-highlight-soft); border: 1px solid var(--sk-highlight); color: var(--sk-highlight-ink); font-weight: var(--fw-heavy); }
html.sk-kv .sk-bp-gets { margin: 16px 0 0; padding: 14px 16px; border-radius: var(--shape-lg); background: var(--sk-primary-soft); border: 1px solid var(--sk-primary-line); }
html.sk-kv .sk-bp-gets-h { margin: 0 0 8px; color: var(--sk-ink); font-size: var(--fs-md); font-weight: var(--fw-heavy); }
html.sk-kv .sk-bp-gets ul { display: grid; gap: 7px 20px; margin: 0; padding: 0; list-style: none; }
html.sk-kv .sk-bp-gets li { position: relative; padding-left: 18px; color: var(--sk-ink); font-size: var(--fs-md); line-height: 1.45; }
html.sk-kv .sk-bp-gets li::before { content: ""; position: absolute; left: 2px; top: .5em; width: 7px; height: 7px; border-radius: 50%; background: var(--sk-grad-badge); }
html.sk-kv .sk-bp-trust { display: grid; gap: 8px; margin: 0 0 18px; padding: 0; list-style: none; }
html.sk-kv .sk-bp-trust li { display: flex; align-items: center; gap: 10px; color: var(--sk-ink-muted); font-size: var(--fs-md); font-weight: var(--fw-semibold); }
html.sk-kv .sk-bp-trust .material-symbols-outlined { flex: none; display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: var(--shape-md);
  background: var(--sk-primary-pale); color: var(--sk-primary); font-size: var(--fs-lg); }
html.sk-kv .sk-bp-lead { margin: 0 0 16px; color: var(--sk-ink-muted); font-size: var(--fs-md); line-height: var(--lh-base); }
html.sk-kv .sk-bp-total { margin: 0 0 4px; color: var(--sk-ink-muted); font-size: var(--fs-md); font-weight: var(--fw-semibold); }
html.sk-kv .sk-bp-total s { color: var(--sk-ink-soft); font-weight: var(--fw-medium); }
html.sk-kv .sk-bp-total strong { color: var(--sk-ink); font-weight: var(--fw-heavy); white-space: nowrap; }
/* SKLEP-FORMULARZ (21.10, „wypełnianie danych bardziej fancy"): kroki z numerami, pola w dwóch
   kolumnach od 600 px, „Skąd o nas wiesz?" jako pigułki, raty jako kafelki z zaznaczeniem. */
html.sk-kv .sk-of { display: grid; gap: 14px; }
html.sk-kv .sk-step { margin: 0; padding: 16px 16px 18px; min-width: 0; border: 1px solid var(--sk-line); border-radius: var(--shape-lg); background: var(--sk-card); }
html.sk-kv .sk-step:focus-within { border-color: var(--sk-primary-line); box-shadow: 0 0 0 3px var(--sk-primary-pale); }
html.sk-kv .sk-step-h { display: flex; align-items: center; gap: 12px; float: left; width: 100%; margin: 0 0 14px; padding: 0; color: var(--sk-ink); font-size: var(--fs-lg); font-weight: var(--fw-heavy); }
html.sk-kv .sk-step-h + * { clear: both; }
html.sk-kv .sk-step-h small { display: block; margin-top: 1px; color: var(--sk-ink-soft); font-size: var(--fs-sm); font-weight: var(--fw-medium); }
html.sk-kv .sk-step-n { flex: none; display: grid; place-items: center; width: 32px; height: 32px; border-radius: 50%; background: var(--sk-grad-badge); color: var(--sk-on-primary); font-size: var(--fs-md); font-weight: var(--fw-black); }
html.sk-kv .sk-of-grid { display: grid; gap: 12px 14px; }
html.sk-kv .sk-of-grid .field { margin: 0; }
html.sk-kv .sk-of .input, html.sk-kv .sk-of .select, html.sk-kv .sk-of .textarea { min-height: 46px; border-radius: var(--shape-md); background: var(--sk-bg); border-color: var(--sk-line); transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; }
html.sk-kv .sk-of .input:focus, html.sk-kv .sk-of .select:focus, html.sk-kv .sk-of .textarea:focus { background: var(--sk-card); border-color: var(--sk-primary); box-shadow: 0 0 0 3px var(--sk-primary-pale); outline: none; }
html.sk-kv .sk-chips { display: flex; flex-wrap: wrap; gap: 8px; clear: both; }
html.sk-kv .sk-chip { position: relative; cursor: pointer; }
html.sk-kv .sk-chip input { position: absolute; inset: 0; opacity: 0; margin: 0; cursor: pointer; }
html.sk-kv .sk-chip span { display: inline-flex; align-items: center; min-height: 42px; padding: 0 18px; border: 1.5px solid var(--sk-line-strong); border-radius: var(--shape-full); background: var(--sk-card); color: var(--sk-ink); font-size: var(--fs-md); font-weight: var(--fw-bold); transition: border-color 150ms ease, background-color 150ms ease, color 150ms ease; }
html.sk-kv .sk-chip:hover span { border-color: var(--sk-primary); }
html.sk-kv .sk-chip input:checked + span { border-color: var(--sk-primary); background: var(--sk-primary); color: var(--sk-on-primary); }
html.sk-kv .sk-chip input:focus-visible + span { outline: 3px solid var(--sk-primary-pale); outline-offset: 2px; }
html.sk-kv .sk-src-more { margin: 12px 0 0; }
html.sk-kv .sk-payopts { display: grid; gap: 8px; clear: both; margin-bottom: 10px; }
html.sk-kv .sk-payopt { position: relative; display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1.5px solid var(--sk-line); border-radius: var(--shape-md); background: var(--sk-card); cursor: pointer; transition: border-color 150ms ease, background-color 150ms ease; }
html.sk-kv .sk-payopt:hover { border-color: var(--sk-primary-line); }
html.sk-kv .sk-payopt input { flex: none; width: 20px; height: 20px; margin: 0; accent-color: var(--sk-primary); }
html.sk-kv .sk-payopt:has(input:checked) { border-color: var(--sk-primary); background: var(--sk-primary-soft); }
html.sk-kv .sk-payopt-body { display: grid; gap: 1px; }
html.sk-kv .sk-payopt-body strong { color: var(--sk-ink); font-size: var(--fs-md); font-weight: var(--fw-heavy); }
html.sk-kv .sk-payopt-body small { color: var(--sk-ink-soft); font-size: var(--fs-sm); }
html.sk-kv .sk-step .pz-consent-check { margin-top: 10px; }
html.sk-kv .sk-step--consents .pz-consent-check:first-of-type { margin-top: 0; }
html.sk-kv .sk-invoice { margin-top: 12px; }
html.sk-kv .sk-sum-nocode { margin: 4px 0 6px; }
@media (min-width: 600px) {
  html.sk-kv .sk-step { padding: 20px 22px 22px; }
  html.sk-kv .sk-of-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  html.sk-kv .sk-span2 { grid-column: 1 / -1; }
  html.sk-kv .sk-payopts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (prefers-reduced-motion: reduce) {
  html.sk-kv :is(.sk-chip span, .sk-payopt, .sk-of .input, .sk-of .select, .sk-of .textarea) { transition: none; }
}
/* SKLEP-KUP-PAKIET-CENA (21.10): podsumowanie nad przyciskiem płatności - pozycja, kod, razem. */
html.sk-kv .sk-sum { margin: 18px 0 16px; padding: 16px 18px; border-radius: var(--shape-lg); background: var(--sk-bg); border: 1px solid var(--sk-site-line); }
html.sk-kv .sk-sum-h { margin: 0 0 10px; color: var(--sk-ink); font-size: var(--fs-lg); font-weight: var(--fw-heavy); }
html.sk-kv .sk-sum-row { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 6px 0; color: var(--sk-ink); font-size: var(--fs-md); }
html.sk-kv .sk-sum-dim { color: var(--sk-ink-soft); }
html.sk-kv .sk-sum-amt { flex: none; font-variant-numeric: tabular-nums; white-space: nowrap; }
html.sk-kv .sk-sum-row--cut { color: var(--sk-success-ink); font-weight: var(--fw-semibold); }
html.sk-kv .sk-sum-code { margin: 6px 0; padding: 12px 0; border-top: 1px dashed var(--sk-line-strong); border-bottom: 1px dashed var(--sk-line-strong); }
html.sk-kv .sk-sum-total { font-size: var(--fs-lg); font-weight: var(--fw-black); }
html.sk-kv .sk-sum-now { color: var(--sk-primary-deep); font-weight: var(--fw-bold); }
html.sk-kv .sk-bp-coderow { display: flex; gap: 8px; }
html.sk-kv .sk-bp-coderow .input { flex: 1; min-width: 0; text-transform: uppercase; }
html.sk-kv .sk-bp-code-ok { margin: 8px 0 0; color: var(--sk-success-ink); font-size: var(--fs-md); }
html.sk-kv .sk-bp-hint { margin: 6px 0 0; color: var(--sk-ink-muted); font-size: var(--fs-sm); line-height: var(--lh-base); }
html.sk-kv .sk-bp-code-err { margin: 8px 0 0; color: var(--danger); font-size: var(--fs-md); }
@media (min-width: 600px) {
  html.sk-kv .sk-bp-gets ul { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  html.sk-kv .sk-bp-trust { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 900px) {
  html.sk-kv .sk-bp { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
  html.sk-kv .sk-bp-img { max-height: none; }
  html.sk-kv .sk-bp-body { padding: 26px 28px 28px; }
  html.sk-kv .sk-bp-trust { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  html.sk-kv .sk-bp-gets ul { grid-template-columns: 1fr; }
}



/* --- pytania (.sp-faq__item v2) --- */
html.sk-kv .sk-faq-item { border: 1px solid var(--sk-site-line); border-radius: var(--shape-lg); background: var(--sk-card); box-shadow: 0 12px 26px -20px rgba(13, 18, 26, .3); }
html.sk-kv .sk-faq-item:hover, html.sk-kv .sk-faq-item[open] { border-color: var(--sk-primary); }
html.sk-kv .sk-faq-item > summary { min-height: 56px; padding: 14px 18px; color: var(--sk-ink); font-size: var(--fs-md); font-weight: var(--fw-bold); }
html.sk-kv .sk-faq-no { display: none; }
html.sk-kv .sk-faq-item > summary::after { width: 26px; height: 26px; background: var(--sk-primary-pale); color: var(--sk-primary); font-size: var(--fs-xl); font-weight: var(--fw-bold); }
html.sk-kv .sk-faq-item[open] > summary::after { content: "\2212"; background: var(--sk-primary); color: var(--sk-on-primary); }
html.sk-kv .sk-faq-item p { padding: 0 18px 18px; color: var(--sk-ink-muted); font-size: var(--fs-md); line-height: 1.65; }
html.sk-kv .sk-faq-item a { color: var(--sk-primary); font-weight: var(--fw-bold); }

/* --- niebieski pas na końcu (.sp-final--home) --- */
html.sk-kv .sk-final { position: relative; overflow: hidden; margin: 36px 0 0; padding: clamp(48px, 9vw, 88px) 20px; text-align: center; color: var(--sk-on-primary);
  background: var(--sk-final-bg); border-radius: var(--shape-xl); }
html.sk-kv .sk-final > :not(.sk-final-math) { position: relative; z-index: 1; }
html.sk-kv .sk-final-math { position: absolute; inset: 0; pointer-events: none; font-family: Georgia, "Times New Roman", serif; font-style: italic; font-weight: var(--fw-bold); }
html.sk-kv .sk-final-math span { position: absolute; line-height: 1; opacity: .07; color: var(--sk-card); }
html.sk-kv .sk-final-math span:nth-child(1) { left: -4%; top: 2%; font-size: clamp(90px, 14vw, 150px); rotate: -12deg; }
html.sk-kv .sk-final-math span:nth-child(2) { right: -3%; top: 20%; font-size: clamp(80px, 12vw, 130px); rotate: 9deg; }
html.sk-kv .sk-final-math span:nth-child(n+3) { display: none; }
html.sk-kv .sk-final-title { max-width: 720px; margin: 0 auto 12px; color: var(--sk-card); font-size: clamp(26px, 4.4vw, 44px); font-weight: var(--fw-heavy); letter-spacing: -0.028em; line-height: 1.12; text-wrap: balance; }
html.sk-kv .sk-final-title em { display: inline; background-image: var(--sk-grad-light); }
html.sk-kv .sk-final-sub { max-width: 560px; margin: 0 auto 26px; color: rgba(255, 255, 255, .88); font-size: clamp(15px, 2vw, 17px); line-height: 1.55; }
html.sk-kv .sk-final-btn { display: inline-flex; align-items: center; justify-content: center; gap: 10px; width: 100%; max-width: 420px; min-height: 52px; padding: 14px 30px;
  border-radius: var(--shape-full); background: var(--sk-card); color: var(--sk-primary); font-size: var(--fs-lg); font-weight: var(--fw-black); text-decoration: none;
  box-shadow: 0 18px 36px -12px rgba(2, 20, 60, .55); transition: transform .2s, background .2s; }
html.sk-kv .sk-final-btn:hover { background: var(--sk-primary-soft); color: var(--sk-primary-hover); transform: translateY(-2px); }
html.sk-kv .sk-final-perks { display: grid; gap: 10px; max-width: 420px; margin: clamp(28px, 4vw, 44px) auto 0; padding: 0; list-style: none; }
html.sk-kv .sk-final-perks li { display: flex; align-items: center; gap: 13px; padding: 14px 16px; text-align: left; border-radius: var(--shape-xl);
  background: rgba(255, 255, 255, .10); border: 1px solid rgba(255, 255, 255, .24); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); box-shadow: 0 20px 40px -24px rgba(2, 20, 60, .6); }
html.sk-kv .sk-final-ico { flex: none; display: grid; place-items: center; width: 44px; height: 44px; border-radius: var(--shape-lg); background: var(--sk-grad-perk-1); color: var(--sk-on-primary); box-shadow: 0 0 0 4px rgba(255, 255, 255, .14); }
html.sk-kv .sk-final-perks li:nth-child(2) .sk-final-ico { background: var(--sk-grad-perk-2); }
html.sk-kv .sk-final-perks li:nth-child(3) .sk-final-ico { background: var(--sk-grad-perk-3); }
html.sk-kv .sk-final-ico .material-symbols-outlined { font-size: var(--fs-xl); }
html.sk-kv .sk-final-perks li > span:last-child { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
html.sk-kv .sk-final-perks strong { color: var(--sk-card); font-size: var(--fs-md); font-weight: var(--fw-black); letter-spacing: -0.01em; line-height: 1.25; }
html.sk-kv .sk-final-perks li > span:last-child > span { color: rgba(255, 255, 255, .8); font-size: var(--fs-sm); line-height: 1.35; }

/* --- stopka jasna (.sp-ftr--v2, 3.91) --- */
html.sk-kv .sk-foot { margin-top: 28px; border-top: 1px solid var(--sk-site-line); background: var(--sk-ftr-bg); color: var(--sk-ink-muted); font-size: var(--fs-md); }
html.sk-kv .sk-foot--embed { background: transparent; border-top: 0; }
html.sk-kv .sk-foot-grid { padding-top: clamp(36px, 6vw, 64px); text-align: center; }
html.sk-kv .sk-foot-brand { display: inline-flex; align-items: center; gap: 12px; margin: 0 0 14px; color: var(--sk-ink); font-size: var(--fs-2xl); font-weight: var(--fw-heavy); letter-spacing: -0.02em; line-height: 1; }
html.sk-kv .sk-foot-logo { display: grid; place-items: center; width: 48px; height: 48px; border-radius: var(--shape-lg); background: var(--sk-card); border: 1px solid var(--sk-site-line); box-shadow: 0 10px 22px -10px rgba(10, 98, 199, .45); }
html.sk-kv .sk-foot-logo img { width: 34px; height: 34px; object-fit: contain; }
html.sk-kv .sk-foot-brand > span:last-child { text-align: left; }
html.sk-kv .sk-foot-tag { display: block; margin-top: 4px; color: var(--sk-ink-soft); font-size: var(--fs-base); font-weight: var(--fw-medium); letter-spacing: 0; }
html.sk-kv .sk-foot-h { margin: 0 0 12px; color: var(--sk-primary); font-size: var(--fs-xs); font-weight: var(--fw-black); letter-spacing: .16em; text-transform: uppercase; }
html.sk-kv .sk-foot-grid ul { gap: 10px; }
html.sk-kv .sk-foot-grid ul a { color: var(--sk-ink); font-weight: var(--fw-semibold); text-decoration: none; }
html.sk-kv .sk-foot a:hover { color: var(--sk-primary); }
html.sk-kv .sk-foot .pb-inline-link { display: inline-flex; align-items: center; min-height: 44px; margin-top: 4px; padding: 0 20px; border-radius: var(--shape-full);
  background: var(--sk-primary); color: var(--sk-on-primary); font-weight: var(--fw-black); text-decoration: none; box-shadow: var(--sk-shadow-primary); }
html.sk-kv .sk-foot .pb-inline-link:hover { background: var(--sk-primary-hover); color: var(--sk-on-primary); }
html.sk-kv .sk-foot-legal { border-top-color: var(--sk-site-line); color: var(--sk-ink-soft); justify-content: center; text-align: center; }
html.sk-kv .sk-hero-title { font-size: clamp(26px, 4vw, 42px); font-weight: var(--fw-heavy); letter-spacing: -0.03em; line-height: 1.1; text-wrap: balance; }

@media (min-width: 600px) {
  html.sk-kv .sk-final-perks { grid-template-columns: repeat(3, minmax(0, 1fr)); max-width: 940px; gap: 14px; }
  html.sk-kv .sk-final-btn { width: auto; }
  html.sk-kv .sk-final-math span:nth-child(n+3) { display: inline; }
  html.sk-kv .sk-final-math span:nth-child(3) { left: 14%; bottom: 8%; font-size: 84px; rotate: 7deg; }
  html.sk-kv .sk-final-math span:nth-child(4) { right: 13%; bottom: 10%; font-size: 110px; rotate: -6deg; }
}
@media (min-width: 900px) {
  html.sk-kv .sk-foot-grid { text-align: left; }
  html.sk-kv .sk-foot-legal { justify-content: flex-start; text-align: left; }
}
@media (prefers-reduced-motion: reduce) {
  html.sk-kv .sk-final-btn { transition: none; }
  html.sk-kv .sk-final-btn:hover { transform: none; }
}

/* KV-KOREPETYTOR (20.10, „panel korepetytora w KV strony"): pulpit korepetytora.
   - `.kv-grad`: imię w powitaniu (korepetytor, rodzic) z gradientem tekstu jak tytuły na
     stronie szkoły (`--sk-grad-text`; zapas na polskie ogonki).
   - „Ten tydzień": dzień jako napis z kreską w gradiencie (jak `.sp-kick`), godzina jako
     pigułka, wiersz to link do ucznia, odbyta lekcja z zielonym ptaszkiem. Wcześniej
     kilkadziesiąt szarych pasków z kółkiem „○".
   - Pięć kafelków liczb w jednym rzędzie od 1100 px (było 4 + 1 sierota). */
@layer components {
  .kv-grad { font-style: normal; background-image: var(--sk-grad-text); -webkit-background-clip: text; background-clip: text;
    -webkit-text-fill-color: transparent; color: transparent; padding: .14em .04em .18em; margin: 0 -.04em;
    -webkit-box-decoration-break: clone; box-decoration-break: clone; }
  .kv-week { display: grid; gap: 6px; }
  .kv-week-list { display: grid; gap: 6px; }
  .kv-week-day { display: flex; align-items: center; gap: 10px; margin: 12px 0 4px; color: var(--primary); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .14em; text-transform: uppercase; }
  .kv-week-day:first-child { margin-top: 0; }
  .kv-week-day::before { content: ""; flex: none; width: 22px; height: 3px; border-radius: 3px; background: var(--sk-grad-kick); }
  .kv-week-row { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 6px 12px 6px 6px; border: 1px solid var(--border); border-radius: var(--shape-md);
    background: var(--surface); color: var(--text); text-decoration: none; transition: border-color var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std); }
  .kv-week-row:hover { border-color: var(--primary); background: var(--surface-2); }
  .kv-week-time { flex: none; min-width: 58px; padding: 4px 8px; border-radius: var(--shape-full); background: var(--primary-container); color: var(--on-primary-container);
    font-size: var(--fs-sm); font-weight: var(--fw-black); text-align: center; font-variant-numeric: tabular-nums; }
  .kv-week-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--fw-semibold); }
  .kv-week-row.is-done .kv-week-time { background: var(--surface-2); color: var(--text-2); }
  .kv-week-done { flex: none; display: grid; place-items: center; width: 24px; height: 24px; border-radius: 50%; background: var(--c-ok-bg); color: var(--c-ok); }
  .kv-week-done .material-symbols-outlined { font-size: var(--fs-lg); }
  /* komputer: lekcje dnia w kolumnach - tydzień nie zajmuje kilku ekranów */
  @media (min-width: 900px) {
    .kv-week-list { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); }
  }
  @media (prefers-reduced-motion: reduce) {
    .kv-week-row { transition: none; }
  }
}
/* poza warstwą: `.kpi-tiles` (bez warstwy, KV-EKRANY-2) wygrałby z regułą w warstwie;
   tak samo `h1, h2, h3 { letter-spacing }` ściskałby rozstrzelony napis dnia */
h3.kv-week-day { letter-spacing: .14em; }
@media (min-width: 1100px) {
  .kpi-tiles.kpi-tiles--5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}

/* KV-KADRA (20.10, „jedziesz" - panel sekretariatu w KV strony):
   - „Mój dzień": karty sekcji w kolumnach od 900 px (trzy widoczne karty stoją w rzędzie,
     „Pokaż wszystkie" dokłada kolejne rzędy) - wcześniej jedna długa kolumna na całą szerokość;
   - imię w powitaniu na niebieskim pasku jasnym gradientem (od bieli, `--sk-grad-on-blue` -
     gradient z niebieskiego pasa strony miał na końcu za mały kontrast);
   - kanban leadów: kolumny `minmax(0, 1fr)` - długa treść karty rozpychała czwartą kolumnę
     poza ekran (przewijanie strony w bok o 10 px przy 1280 px). */
@layer components {
  .kv-grad--light { background-image: var(--sk-grad-on-blue); }
}
/* KV-POMOCNICZE (20.10): kod błędu (404/500) gradientem i najcięższą wagą (900, jak duże liczby
   na stronie szkoły; było 800). Jasny motyw - ciemniejszy gradient (--sk-grad-deep, kontrast
   >= 4,1:1), ciemny - ten z tytułów strony. Logowanie, „Nie pamiętam hasła", 2FA, konto i zgody
   są już w KV (KV-AUTH 15.10). */
/* W-E18 (05.11): płaski atrament zamiast gradientu w tekście (KV strony: zakreślacz, nie gradient) */
.error-code { font-weight: var(--fw-heavy); color: var(--zs-ink); padding: .06em .04em; }
html.dark .error-code { color: var(--text); }
@media (min-width: 900px) {
  .daily-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 10px; align-items: start; }
}

/* MOBILE-PRZEGLAD (20.10): skan telefonu rozszerzony o sklep, 360 px i pomiar w całym dokumencie
   znalazł ~300 celów dotykowych < 44 px i jeden rozjazd (plan nauki - `minmax(0, 1fr)` w
   `.plan-main`/`.plan-group`, wyżej). Po review: powiększenia tylko na ekranach dotykowych
   (`pointer: coarse`, jak UI-05 wyżej - tablet w poziomie też jest dotykowy), żeby na
   komputerze listy nie urosły dwukrotnie; `summary` zostaje `list-item` (trójkąt rozwijania
   i spacje między tekstem a liczbą), dorasta dopełnieniem. Ujemny margines tylko tam, gdzie
   obszar dotyku nie nachodzi na sąsiada (imię leada, temat w statystykach). */
.leady-tbl .lead-open-name { padding-block: 12px; margin-block: -12px; }
.lab-topic-stats li > a { display: inline-block; min-width: 44px; padding-block: 13px; margin-block: -13px; }
.lab-tab { display: inline-flex; align-items: center; gap: 6px; }
.lab-pill { display: inline-flex; }
.lab-seg > label { display: inline-flex; align-items: center; }
/* link w zdaniu (regulaminy, polityka) zostaje w tekście - reguła telefonu robi z każdego
   `a.pz-link-accent` blok 44 px, co w akapicie łamało zdanie na kawałki */
li > a.pz-link-accent { display: inline; min-height: 0; }
/* SKLEP-NL-KOLEJNOSC (22.10, „przy w każdej chwili linkiem w mailu jakaś przerwa"): to samo
   w treści zgody - link „Polityka prywatności" był blokiem 44 px i rozpychał linijkę. */
.pz-consent-check a.pz-link-accent { display: inline; min-height: 0; }
html.sk-kv .sk-foot-legal a { display: inline-flex; align-items: center; min-height: 44px; }
/* W-E16 (05.11): pod ostatnimi linkami sklepu miejsce na pigułkę „Zapytaj” (prawy dolny róg, ok. 56 px + 20 px
   od dołu) i pływający koszyk - na samym dole strony nie leżą już na regulaminie ani polityce. */
html.sk-kv .sk-foot-legal { padding-bottom: 92px; }
@media (pointer: coarse) {
  /* `.tab` i `.pz-check-inline` są też w UI-05 wyżej, ale późniejsze reguły (zakładki-pigułki
     KV, 40 px) wygrywały kolejnością */
  .tab, .pz-check-inline, .lab-check-line, .fe-check, .lab-tab, .daily-h-btn,
  .mp-switch, .pz-checkbox-lbl, .pz-chip-row .pz-checkbox-lbl, .cal-paint, .sk-fopt,
  .sk-backlink, .sk-tab, .sk-embed-cats a, .sk-embed-cart, .legal-nav > a, .lab-seg > label,
  .tp-chip, .solve-hero-pill { min-height: 44px; }
  .legal-nav > a { min-width: 44px; justify-content: center; }
  .lab-pill span { min-width: 44px; height: 44px; }
  /* paski statystyk: prawdziwa wysokość zamiast nachodzących obszarów dotyku */
  .lab-bars { gap: 0; }
  .lab-bar { min-height: 44px; }
  .lab-map-wrap > summary, .audit-diff > summary, .pz-acc-summary-strong,
  .lab-sec-group > summary, summary.lab-h3 { box-sizing: border-box; min-height: 44px; padding-block: 12px; }
}

/* KANBAN-STRONY (20.10): przycisk „Pokaż więcej" na dole kolumny kanbana leadów. */
.kanban-more { margin-top: 8px; }

/* SKLEP-DOKUP (21.10, „sklep wyżej, żeby dało się dokupić pakiety - coś catchy"): strony rodzica
   „Dokup lekcje" i „Poleć znajomym" - nagłówek, oferta dla stałego ucznia z kodem do skopiowania,
   karty dzieci z pakietami i kafelki odsyłające. Kolory z tokenów panelu (także ciemny motyw). */
@layer components {
  .pz-dk-hero { margin: 0 0 18px; }
  .pz-dk-hero .parent-greeting-sub { max-width: 640px; }
  .pz-dk-deal { display: flex; align-items: flex-start; gap: 14px; margin: 0 0 18px; padding: 18px 18px 16px; border-radius: var(--shape-xl);
    border: 2px solid var(--c-ok); background: linear-gradient(135deg, var(--c-ok-bg) 0%, var(--surface) 70%); box-shadow: var(--elev-1); }
  .pz-dk-deal-ico { flex: none; display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: var(--shape-lg);
    background: var(--c-ok); color: var(--surface); }
  .pz-dk-deal-ico .material-symbols-outlined { font-size: var(--fs-2xl); }
  .pz-dk-deal-kicker { margin: 0; color: var(--c-ok); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .1em; text-transform: uppercase; }
  .pz-dk-deal-title { margin: 2px 0 0; color: var(--text); font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: -0.02em; line-height: var(--lh-tight); }
  .pz-dk-deal-txt { margin: 6px 0 0; color: var(--text-2); font-size: var(--fs-md); line-height: var(--lh-base); }
  .pz-dk-code { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 12px; }
  .pz-dk-code-in { flex: 0 1 260px; min-width: 0; font-weight: var(--fw-bold); letter-spacing: .06em; }
  .pz-dk-shop { margin-bottom: 16px; }
  .pz-dk-left { margin-left: auto; padding: 2px 10px; border-radius: var(--shape-full); background: var(--c-warn-bg); color: var(--c-warn);
    font-size: var(--fs-xs); font-weight: var(--fw-bold); }
  .pz-dk-ref { display: flex; align-items: center; gap: 14px; margin: 0 0 12px; padding: 14px 16px; border: 1px solid var(--border); border-radius: var(--shape-lg);
    background: var(--surface); color: var(--text); text-decoration: none; box-shadow: var(--elev-1); transition: border-color var(--motion-fast) var(--ease-std); }
  .pz-dk-ref:hover { border-color: var(--primary); }
  .pz-dk-ref strong { display: block; font-size: var(--fs-md); font-weight: var(--fw-heavy); }
  .pz-dk-ref span span, .pz-dk-ref .pz-flex-min > span { display: block; margin-top: 2px; color: var(--text-2); font-size: var(--fs-sm); }
  .pz-dk-ref-ico { width: 40px; height: 40px; background: var(--primary-container); color: var(--primary); }
  .pz-dk-ref-ico .material-symbols-outlined { font-size: var(--fs-xl); }
  .pz-dk-ref-go { flex: none; margin-left: auto; color: var(--primary); }
  /* przegląd dziecka: pasek „zostały 2 lekcje - dokup z rabatem" */
  .pz-dk-banner { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; margin: 0 0 16px; padding: 14px 16px; border-radius: var(--shape-lg);
    border: 1px solid var(--c-ok); background: var(--c-ok-bg); color: var(--text); }
  .pz-dk-banner .material-symbols-outlined { color: var(--c-ok); }
  .pz-dk-banner p { flex: 1 1 260px; margin: 0; font-size: var(--fs-md); line-height: var(--lh-base); }
  @media (prefers-reduced-motion: reduce) {
    .pz-dk-ref { transition: none; }
  }
}

/* ZRODLO-KLIENTA (21.10): „Skąd przychodzą uczniowie" w panelu sklepu (Korepetycje 1:1). */
.sk-leads { display: grid; gap: 18px; }
.sk-lead-row { display: grid; grid-template-columns: 110px minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 4px 0; font-size: var(--fs-base); }
.sk-lead-name { font-weight: var(--fw-semibold); }
.sk-lead-bar { height: 10px; border-radius: var(--shape-full); background: var(--surface-2); overflow: hidden; }
.sk-lead-bar span { display: block; height: 100%; border-radius: inherit; background: var(--primary); }
.sk-lead-num { color: var(--text-2); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; white-space: nowrap; }
@media (min-width: 900px) {
  .sk-leads { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px; }
}

/* SKLEP-DOKUP-USTAWIENIA (21.10): procenty stałych uczniów i poleceń w panelu sklepu. */
.sk-loy-grid { display: grid; gap: 12px; margin-bottom: 10px; }
@media (min-width: 900px) {
  .sk-loy-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* SKLEP-RUCH (23.10, prośba właściciela: „animacje przy klikaniu, żeby ładnie było, smooth
   przejście"): w sklepie (1) płynne przewijanie do kotwic (#katalog, #kup, #opinie...) z odstępem
   pod przyklejonym nagłówkiem, (2) lekkie wciśnięcie przycisków, pigułek i kart przy kliknięciu
   (`scale` - nie rusza `transform` z efektów najechania), (3) karty i sekcje delikatnie wjeżdżają,
   gdy pojawiają się na ekranie - samym CSS (`animation-timeline: view()`), bez skryptu; przeglądarki
   bez tej funkcji pokazują wszystko od razu. Przejścia między stronami: NAWIGACJA-PLYNNA.
   Przy „ogranicz ruch" nic z tego nie działa. */
html.sk-kv [id] { scroll-margin-top: 76px; }
@media (prefers-reduced-motion: no-preference) {
  html.sk-kv { scroll-behavior: smooth; }
  html.sk-kv :is(.btn, .sk-hero-ai-opt, .sk-hero-ai-free, .sk-chip, .sk-cn-btn, .sk-cn-seg a,
                 .sk-fcart, .sk-fchip, .sk-toast-link, .sk-backlink, .sk-tab, .sk-fopt, .sk-zs-up-item, .dor-prod-cart):active:not(:disabled) {
    animation: sk-press 140ms cubic-bezier(.2, 0, 0, 1) both;
  }
  html.sk-kv :is(.sk-card, .sk-zs):active { animation: sk-press-card 160ms cubic-bezier(.2, 0, 0, 1) both; }
}
@keyframes sk-press { to { scale: .96; } }
@keyframes sk-press-card { to { scale: .985; } }
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    html.sk-kv:not(.pb-embedded) :is(.sk-card, .sk-zs, .sk-block-head, .sk-cn-row, .sk-cn-step, .sk-zs-up-item, .sk-review) {
      animation: sk-reveal linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 35%;
    }
    html.sk-kv:not(.pb-embedded) :is(.sk-card, .sk-zs):active { animation: sk-press-card 160ms cubic-bezier(.2, 0, 0, 1) both; }
  }
}
/* PLYNNOSC-NAGLOWKI (05.11, pomiar QA: nagłówki .sk-block-head i karty przesuwały się o 4-18 px przy dolnej krawędzi
   okna): animacja jest przypięta do położenia w oknie (`animation-timeline: view()`), a na iPhonie pasek adresu
   zmienia wysokość okna przy każdym przewinięciu - zakres animacji przeskakiwał i treść podskakiwała. Samo
   pojawienie się (przezroczystość), bez przesunięcia: geometria stoi w miejscu przy każdej wysokości okna. */
@keyframes sk-reveal { from { opacity: 0; } to { opacity: 1; } }

/* MOJ-DZIEN-PUSTE (23.10): puste sekcje „Mojego dnia" jako jeden pasek zamiast kart „Nic na dziś" */
.daily-done { display: flex; align-items: flex-start; gap: 12px; padding: 14px 18px; margin-bottom: 30px; border-radius: var(--shape-lg); border: 1px solid var(--border); background: linear-gradient(135deg, color-mix(in srgb, var(--primary-container) 50%, var(--surface)) 0%, var(--surface) 70%); scroll-margin-top: 76px; }
.daily-done-ico { flex: none; color: var(--primary); font-size: var(--fs-2xl); }
.daily-done-title { margin: 0 0 6px; font-weight: var(--fw-semibold); color: var(--text); }
.daily-done-list { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
.daily-done-list li { padding: 3px 10px; border-radius: var(--shape-full); background: var(--surface); border: 1px solid var(--border); color: var(--text-2); font-size: var(--fs-sm); }
.solve-hero-pill.is-zero { opacity: 0.72; }

/* SKLEP-WYROWNANIE (23.10, prośba właściciela: „wyśrodkowanie tekstów czasem zawodzi" - przegląd
   sklepu i cennika na 360 / 768 / 1280 px). Wyśrodkowane wielowierszowe teksty bez wiszącego
   ostatniego słowa (balance), akapity bez sierot (pretty); drobne poprawki układu niżej. */
html.sk-kv p, html.sk-kv li { text-wrap: pretty; }
html.sk-kv :is(.sk-card-title, .sk-final-sub, .sk-cn-sub, .sk-cn-help-p, .pb-lead, .sk-foot-grid p,
  .sk-badge--level, .sk-eyebrow, .sk-zs-up-meta, .sk-saving) { text-wrap: balance; }
/* nadtytuł z kreskami: na telefonie mniejszy rozstaw liter i krótsze kreski - mieści się w jednym
   wierszu, a gdy się zawija, kreski stoją przy środku tekstu */
html.sk-kv .sk-eyebrow { gap: 10px; font-size: var(--fs-xs); letter-spacing: .08em; text-align: center; }
html.sk-kv .sk-eyebrow::before, html.sk-kv .sk-eyebrow::after { width: 18px; }
/* „Wybierz pakiet," i „im więcej lekcji, tym taniej" w osobnych wierszach (nie „im" na końcu pierwszego) */
html.sk-kv .sk-cn-title em { display: block; }
/* karta materiału na telefonie: poziom jako zwykły podpis - pigułka łamana w dwa wiersze wyglądała jak błąd */
html.sk-kv .sk-card-body .sk-badge--level { padding: 0; background: none; border: 0; }
/* pasek zalet w hero (przewijany w bok na telefonie): wygaszenie przy krawędzi zamiast uciętego słowa */
html.sk-kv .sk-hero-chips { -webkit-mask-image: linear-gradient(90deg, transparent 0, black 18px, black calc(100% - 32px), transparent);
  mask-image: linear-gradient(90deg, transparent 0, black 18px, black calc(100% - 32px), transparent); }
/* karta produktu: „Dodaj do koszyka" pod „Kup teraz" na całą szerokość, jak główny przycisk */
html.sk-kv .sk-cta-main > form:has(.btn.tonal) { flex: 1 1 100%; }
html.sk-kv .sk-cta-main > form .btn.tonal { width: 100%; justify-content: center; }
/* zakładki produktu zawinięte w dwa rzędy: drugi rząd na środku, nie przy lewej krawędzi */
html.sk-kv .sk-tablist { justify-content: center; }
/* „W zestawie": miniatura po lewej, pod nazwą zawsze cena osobno (wcześniej raz w wierszu, raz pod spodem) */
html.sk-kv .sk-bundle-list li { display: grid; grid-template-columns: 36px minmax(0, 1fr); column-gap: 10px; row-gap: 2px; align-items: center; }
html.sk-kv .sk-bundle-list li > :first-child { grid-row: span 3; justify-self: center; }
html.sk-kv .sk-bundle-list li > :not(:first-child) { grid-column: 2; justify-self: start; }
/* kafelki poziomów: liczba materiałów zawsze na dole, równo w rzędzie, choć nazwa ma 1 albo 2 wiersze */
@media (min-width: 600px) {
  html.sk-kv .sk-eyebrow { gap: 12px; font-size: var(--fs-base); letter-spacing: .16em; }
  html.sk-kv .sk-eyebrow::before, html.sk-kv .sk-eyebrow::after { width: 28px; }
  html.sk-kv .sk-card-body .sk-badge--level { padding: 3px 10px; background: var(--sk-bg); border: 1px solid var(--sk-line); }
  /* cennik na tablecie: karty pakietów w dwóch kolumnach (jedna karta na 700 px miała cenę i całość
     na dwóch krańcach), kroki w trzech - równo z listą; od 1100 px układ tabeli jak dotąd */
  html.sk-kv .sk-cn-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* karty w rzędzie równej wysokości: cena tuż pod nazwą, przycisk zawsze na dole (pusty wiersz
     przed nim bierze różnicę wysokości), więc ceny i przyciski sąsiadów stoją na jednej linii */
  html.sk-kv .sk-cn-row { grid-template-areas: "t n n" "p p s" ". . ." "c c c"; grid-template-rows: auto auto 1fr auto; }
  html.sk-kv .sk-cn-row.has-gets { grid-template-areas: "t n n" "p p s" ". . ." "c c c" "g g g"; grid-template-rows: auto auto 1fr auto auto; }
  html.sk-kv .sk-cn-row.has-extra { grid-template-areas: "t n n" "p p s" "x x x" ". . ." "c c c"; grid-template-rows: auto auto auto 1fr auto; }
  html.sk-kv .sk-cn-row.has-extra.has-gets { grid-template-areas: "t n n" "p p s" "x x x" ". . ." "c c c" "g g g"; grid-template-rows: auto auto auto 1fr auto auto; }
  html.sk-kv .sk-cn-steps { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; max-width: none; }
  html.sk-kv .sk-cn-step { flex-direction: column; align-items: center; gap: 10px; padding: 20px 14px; text-align: center; }
  html.sk-kv .sk-cn-step:not(:last-child)::after { content: ""; position: absolute; top: 50%; right: -19px; width: 9px; height: 9px; margin-top: -5px;
    border-top: 2.5px solid var(--sk-accent); border-right: 2.5px solid var(--sk-accent); transform: rotate(45deg); }
}
@media (min-width: 900px) {
  html.sk-kv .sk-tablist { justify-content: flex-start; }
}
@media (min-width: 1100px) {
  /* z powrotem układ tabeli (te same obszary co w bloku 1100 px wyżej - reguły z 600 px są późniejsze) */
  html.sk-kv .sk-cn-list { grid-template-columns: minmax(0, 1fr); }
  html.sk-kv .sk-cn-row { grid-template-areas: "t n p s c"; grid-template-rows: none; }
  html.sk-kv .sk-cn-row.has-gets { grid-template-areas: "t n p s c" "t g p s c"; grid-template-rows: none; }
  html.sk-kv .sk-cn-row.has-extra { grid-template-areas: "t n p s c" "t n x x c"; grid-template-rows: none; }
  html.sk-kv .sk-cn-row.has-extra.has-gets { grid-template-areas: "t n p s c" "t g x x c"; grid-template-rows: none; }
}

/* SKLEP-POLECANE-KOSZYK (23.10): „Do koszyka" w polecanych (koszyk, karta produktu) - przycisk
   w dolnej części karty, poza linkiem (formularz nie może siedzieć w <a>) */
.sk-mini-item { position: relative; display: grid; }
.sk-mini-item .sk-mini { grid-area: 1 / 1; }
.sk-mini-item .sk-mini-body { padding-bottom: 72px; }
.sk-mini-cart { grid-area: 1 / 1; align-self: end; position: relative; z-index: 1; padding: 0 18px 18px; }
.sk-mini-cart form { margin: 0; }
html.sk-kv .sk-mini-item .sk-mini:hover { transform: none; }

/* ANALITYKA-1 (25.10): panel /admin/analityka - okres, wykres dzienny (SVG bez biblioteki),
   lejki z odsetkiem odpadających, zmiana wobec poprzedniego okresu. */
.an-period { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.an-period input[type="date"] { max-width: 160px; }
/* REKLAMA-1 (25.10): panel reklam - alerty, sezony, rekomendacje (listy bez kropek, bieżący sezon wyróżniony) */
.rk-alerts, .rk-seasons, .rk-recs { list-style: none; margin: 0; padding: 0; }
.rk-alerts > li { display: flex; gap: 10px; align-items: flex-start; }
.rk-alerts > li > .material-symbols-outlined { flex: none; font-size: var(--fs-lg); }
.rk-season, .rk-rec { padding: 10px 12px; border-top: 1px solid var(--border); display: grid; gap: 4px; }
.rk-season--now { background: color-mix(in srgb, var(--primary-container) 45%, var(--surface)); }
.an-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
.an-grid .card { margin: 0; }
@media (min-width: 900px) { .an-grid { grid-template-columns: 1fr 1fr; } }
.an-chart { display: block; width: 100%; height: 170px; }
.an-chart rect { fill: var(--primary); opacity: .9; }
.an-chart rect:hover { opacity: 1; }
.an-chart polyline { fill: none; stroke: var(--success); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
.an-axis { display: flex; justify-content: space-between; color: var(--text-2); font-size: var(--fs-xs); margin-top: 4px; }
.an-legend { display: flex; flex-wrap: wrap; gap: 14px; color: var(--text-2); font-size: var(--fs-xs); margin-top: 8px; }
.an-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; vertical-align: middle; margin-right: 4px; background: var(--primary); }
.an-dot--sale { background: var(--success); }
.an-funnel { display: grid; gap: 12px; margin: 0; padding: 0; list-style: none; }
.an-step { display: grid; grid-template-columns: 1fr auto; gap: 2px 10px; align-items: baseline; }
.an-step .progress { grid-column: 1 / -1; }
.an-step-n { font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); }
.an-step-drop { grid-column: 1 / -1; color: var(--text-2); font-size: var(--fs-xs); }
.an-delta { font-size: var(--fs-xs); font-weight: var(--fw-semibold); white-space: nowrap; }
.an-delta--up { color: var(--success); }
.an-delta--down { color: var(--danger); }
.an-num { font-variant-numeric: tabular-nums; text-align: right; }

/* PULPIT-1 (26.10, prośba właściciela: „jeden dashboard high-tech 3D, jak Power BI, wszystko
   na raz”): /admin/pulpit. Kafelki jak w analityce (.kpi-card), z warstwą „szkła” - gradientowa
   listwa u góry, poświata w rogu, uniesienie na hover. Wykresy to SVG z atrybutów (CSP bez
   style=), słupki poziome przez data-pct (core.js), pierścienie jak .rpt-ring. Kolory wyłącznie
   z tokenów; poświata = primary rozcieńczony w sRGB (nie w oklch - KV-APP-AUDYT-2). */
.pu { --pu-glow: color-mix(in srgb, var(--primary) 22%, transparent); --pu-glass: rgba(255, 255, 255, .55); }
html.dark .pu { --pu-glow: color-mix(in srgb, var(--accent-cyan) 26%, transparent); --pu-glass: rgba(255, 255, 255, .06); }
.pu-hero { margin-bottom: 14px; }
/* Aktywny okres: jasna pigułka z ciemnym tekstem (biały na półprzezroczystym tle miał 3-4:1 - ui-guard 26.10). */
.pu-hero .solve-hero-pill.is-active { background: var(--brand-blue-soft); border-color: var(--brand-blue-soft); color: var(--brand-blue-text); font-weight: var(--fw-bold); }
.pu-section { margin-bottom: 14px; }
.pu-h { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 10px; font-size: var(--fs-md); font-weight: var(--fw-bold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--text-2); }
.pu-h .material-symbols-outlined { color: var(--primary); font-size: var(--fs-xl); }
.pu-h .dim-12 { text-transform: none; letter-spacing: 0; font-weight: var(--fw-medium); }

/* Pasek „Dziś”: małe kafelki-linki z liczbą; zero = przygaszony, alarm = czerwona listwa. */
.pu-strip { display: grid; grid-template-columns: repeat(auto-fit, minmax(124px, 1fr)); gap: 8px; }
@media (min-width: 900px) { .pu-strip { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
.pu-mini { position: relative; isolation: isolate; overflow: hidden; display: flex; flex-direction: column; gap: 2px; min-height: 84px; padding: 12px 12px 10px; border-radius: var(--shape-lg); background: var(--surface); border: 1px solid var(--border); box-shadow: var(--shadow-card); text-decoration: none; color: inherit; transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-std) var(--ease-std), border-color var(--motion-fast) var(--ease-std); }
.pu-mini::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 3px; background: var(--grad); }
.pu-mini::after { content: ""; position: absolute; z-index: -1; right: -30%; top: -40%; width: 80%; aspect-ratio: 1; border-radius: 50%; background: radial-gradient(circle, var(--pu-glow), transparent 68%); pointer-events: none; }
.pu-mini:hover { transform: translateY(-2px); box-shadow: var(--shadow-card-hover); border-color: var(--primary-ring); }
.pu-mini .material-symbols-outlined { font-size: var(--fs-xl); color: var(--primary); }
.pu-mini-n { font-size: var(--fs-2xl); font-weight: var(--fw-black); letter-spacing: var(--ls-tight); line-height: 1.05; font-variant-numeric: tabular-nums; }
.pu-mini-l { font-size: var(--fs-xs); color: var(--text-2); font-weight: var(--fw-semibold); line-height: 1.25; }
.pu-mini-s { display: block; color: var(--danger); font-weight: var(--fw-bold); }
/* Zero: przygaszona liczba i ikona kolorem (opacity na całym kafelku psuło kontrast etykiety - review 26.10). */
.pu-mini.is-zero .pu-mini-n, .pu-mini.is-zero .material-symbols-outlined { color: var(--text-3); }
.pu-mini.is-zero::before, .pu-mini.is-zero::after { opacity: .3; }
.pu-mini.is-alert::before { background: var(--danger); }
.pu-mini.is-alert .material-symbols-outlined, .pu-mini.is-alert .pu-mini-n { color: var(--danger); }

/* Kafelki okresu: szkło + poświata + iskierka (sparkline) pod liczbą. */
.pu-kpis { margin-bottom: 0; }
/* 6 kafelków: 3 + 3 na komputerze (4 + 2 zostawiało pusty prawy róg); skala progów 360/600/700/900/1100. */
@media (min-width: 900px) { .pu-kpis { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* Telefon: mniejsza liczba i wolno zawinąć („12 450 zł” nie mieści się w połowie ekranu); od 600 px w jednej linii. */
.pu-kpis .kpi-value { font-size: var(--fs-2xl); }
@media (min-width: 600px) { .pu-kpis .kpi-value { font-size: var(--fs-3xl); white-space: nowrap; } }
.pu-kpis .pu-kpi { position: relative; isolation: isolate; overflow: hidden; align-items: flex-start; border: 1px solid var(--border); background: linear-gradient(160deg, var(--surface) 0%, var(--surface-2) 100%); box-shadow: var(--shadow-card), inset 0 1px 0 var(--pu-glass); }
.pu-kpis .pu-kpi::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 2px; background: var(--grad); opacity: .85; }
.pu-kpis .pu-kpi::after { content: ""; position: absolute; z-index: -1; right: -25%; top: -45%; width: 70%; aspect-ratio: 1; border-radius: 50%; background: radial-gradient(circle, var(--pu-glow), transparent 66%); pointer-events: none; }
.pu-kpis a.pu-kpi:hover { transform: perspective(900px) rotateX(2deg) translateY(-3px); box-shadow: var(--shadow-card-hover), inset 0 1px 0 var(--pu-glass); border-color: var(--primary-ring); }
.pu-kpis .pu-kpi .kpi-ico { margin-top: 2px; }
.pu-spark { display: block; width: 100%; height: 34px; margin-top: 8px; overflow: visible; }
.pu-spark polyline { fill: none; stroke: var(--primary); stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; vector-effect: non-scaling-stroke; }
.pu-spark polygon { fill: var(--primary); opacity: .12; }
.pu-spark--green polyline { stroke: var(--success); }
.pu-spark--green polygon { fill: var(--success); }
.pu-spark--cyan polyline { stroke: var(--accent-cyan); }
.pu-spark--cyan polygon { fill: var(--accent-cyan); }
.pu-spark--violet polyline { stroke: var(--c-new); }
.pu-spark--violet polygon { fill: var(--c-new); }

/* Pierścienie (obwód 100 przy r = 15.9155, jak .rpt-ring w raporcie ucznia). */
.pu-ring { width: 56px; height: 56px; flex: none; transform: rotate(-90deg); }
.pu-ring-track { fill: none; stroke: var(--surface-3); stroke-width: 3.4; }
.pu-ring-val { fill: none; stroke: var(--primary); stroke-width: 3.4; stroke-linecap: round; animation: rpt-ring-draw .9s var(--ease-decel) both; filter: drop-shadow(0 0 3px var(--pu-glow)); }
.pu-ring--green .pu-ring-val { stroke: var(--success); }
.pu-ring--cyan .pu-ring-val { stroke: var(--accent-cyan); }
.pu-kpis .pu-kpi .pu-ring { width: 44px; height: 44px; margin-top: 2px; }
.pu-gauges { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin-bottom: 12px; }
.pu-gauge { display: flex; align-items: center; gap: 10px; }
.pu-gauge-n { font-size: var(--fs-xl); font-weight: var(--fw-black); letter-spacing: var(--ls-tight); line-height: 1.05; font-variant-numeric: tabular-nums; }
.pu-gauge-l { font-size: var(--fs-xs); color: var(--text-2); font-weight: var(--fw-semibold); }

/* Fakty (liczba + podpis) i ich wariant-link w finansach. */
.pu-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; margin-bottom: 12px; }
.pu-facts--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }   /* finanse: zawsze 2 x 2, bez osieroconego czwartego */
.pu-fact { display: flex; flex-direction: column; gap: 2px; padding: 10px 12px; border-radius: var(--shape-md); background: var(--surface-2); border-left: 3px solid var(--primary); }
.pu-fact-n { font-size: var(--fs-lg); font-weight: var(--fw-black); letter-spacing: var(--ls-tight); line-height: 1.1; font-variant-numeric: tabular-nums; }
.pu-fact-l { font-size: var(--fs-xs); color: var(--text-2); font-weight: var(--fw-semibold); line-height: 1.3; }
a.pu-fact--link { text-decoration: none; color: inherit; transition: background var(--motion-fast) var(--ease-std); }
a.pu-fact--link:hover { background: var(--primary-container); }
.pu-fact.is-alert { border-left-color: var(--danger); }
.pu-fact.is-alert .pu-fact-n { color: var(--danger); }

/* Siatki sekcji i karty z listwą gradientu. */
.pu-grid { display: grid; grid-template-columns: 1fr; gap: 12px; margin-bottom: 12px; }
.pu-grid .card { margin: 0; }
.pu-card { position: relative; isolation: isolate; overflow: hidden; border: 1px solid var(--border); box-shadow: var(--shadow-card); }
.pu-card::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 2px; background: var(--grad); opacity: .8; }
.pu-head { display: flex; align-items: center; gap: 8px; margin: 0 0 10px; font-size: var(--fs-base); font-weight: var(--fw-bold); }
.pu-head .material-symbols-outlined { color: var(--primary); font-size: var(--fs-xl); }
.pu-more { margin-left: auto; font-size: var(--fs-xs); font-weight: var(--fw-semibold); white-space: nowrap; color: var(--primary); }
.pu-more:hover { text-decoration: underline; }
.pu-sub { margin: 12px 0 8px; font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--text-2); }
@media (min-width: 900px) {
  .pu-grid--2 { grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); }
  .pu-grid--2e { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .pu-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* Wykres „Dzień po dniu”: siatka co 25%, słupki z gradientem, linie zakupów i rezerwacji. */
.pu-chart { display: block; width: 100%; height: 220px; }
.pu-chart .pu-grid-line { stroke: var(--border); stroke-width: 1; stroke-dasharray: 3 4; vector-effect: non-scaling-stroke; }
.pu-chart .pu-stop-a { stop-color: var(--accent-cyan); }
.pu-chart .pu-stop-b { stop-color: var(--primary); }
.pu-chart rect { fill: url("#pu-bar-grad"); opacity: .92; }
.pu-chart rect:hover { opacity: 1; }
.pu-chart .pu-line-sales { fill: none; stroke: var(--success); stroke-width: 2; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
.pu-chart .pu-line-leads { fill: none; stroke: var(--c-prog); stroke-width: 2; stroke-dasharray: 5 4; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
.pu-dot--lead { background: var(--c-prog); }

/* Słupki poziome (lejki, źródła, korepetytorzy): szerokość z data-pct w core.js. */
.pu-bars { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.pu-bar { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 10px; align-items: baseline; font-size: var(--fs-sm); }
.pu-bar-l { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pu-bar-n { font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); white-space: nowrap; }
.pu-bar-track { grid-column: 1 / -1; display: block; height: 8px; border-radius: var(--shape-full); background: var(--surface-3); overflow: hidden; }
.pu-bar-fill { display: block; height: 100%; width: 0; border-radius: inherit; background: var(--grad); box-shadow: 0 0 8px var(--pu-glow); transition: width var(--motion-slow) var(--ease-decel); }
.pu-bar-fill--cyan { background: var(--accent-cyan); }
.pu-bar-fill--violet { background: var(--c-new); }
.pu-bar-fill--new { background: var(--c-new); }
.pu-bar-fill--prog { background: var(--c-prog); }
.pu-bar-fill--ok { background: var(--c-ok); }
.pu-bar-fill--rej { background: var(--c-rej); }

/* Alerty „Co wymaga uwagi” i listy na dziś. */
.pu-alerts { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.pu-alert { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 10px; padding: 10px 12px; border-radius: var(--shape-md); background: var(--surface-2); border-left: 3px solid var(--primary); }
.pu-alert .material-symbols-outlined { color: var(--primary); font-size: var(--fs-xl); }
.pu-alert--warn { border-left-color: var(--warning); }
.pu-alert--warn .material-symbols-outlined { color: var(--warning); }
.pu-alert--error { border-left-color: var(--danger); }
.pu-alert--error .material-symbols-outlined { color: var(--danger); }
.pu-alert-t { font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.pu-alert-x { font-size: var(--fs-xs); color: var(--text-2); line-height: 1.4; margin-top: 2px; }
.pu-list { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; }
/* Wiersz listy: godzina + nazwa w jednej linii, meta (korepetytor, status, telefon, powód) pod nazwą -
   w jednej linii nazwa ucznia była ucinana do dwóch liter (zrzut 26.10). */
.pu-row { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 1px 8px; align-items: baseline; min-width: 0; padding: 7px 10px; border-radius: var(--shape-sm); background: var(--surface-2); border-left: 3px solid var(--primary); font-size: var(--fs-sm); }
.pu-row--plain { grid-template-columns: minmax(0, 1fr); }
.pu-row-t { font-variant-numeric: tabular-nums; font-weight: var(--fw-bold); white-space: nowrap; }
.pu-row-main { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--fw-semibold); }
.pu-row-x { grid-column: 2; font-size: var(--fs-xs); color: var(--text-2); line-height: 1.35; }
.pu-row--plain .pu-row-x { grid-column: 1; }
.pu-row--done { border-left-color: var(--c-ok); }
.pu-row--skipped, .pu-row--rescheduled { border-left-color: var(--c-prog); }
.pu-row--trial { border-left-color: var(--accent-cyan); }
.pu-row--late { border-left-color: var(--danger); }
.pu-empty { display: flex; align-items: center; gap: 6px; margin: 0; color: var(--text-2); font-size: var(--fs-sm); line-height: 1.45; }
.pu-ok { color: var(--success); }
.pu-tbl td, .pu-tbl th { padding: 6px 8px; }
.pu-tbl td.an-num { white-space: nowrap; }
@media (prefers-reduced-motion: reduce) {
  .pu-mini, .pu-kpis .pu-kpi, .pu-bar-fill, a.pu-fact--link { transition: none; }
  .pu-mini:hover, .pu-kpis a.pu-kpi:hover { transform: none; }
  .pu-ring-val { animation: none; }
}

/* ══ STRONA-V2 (28.10): publiczne widoki w stylu nowej korepetycjesolve.com - „zeszyt w kratkę" ══════════
   Sklep (/sklep), cennik korepetycji (/sklep/korepetycje, także ?embed=1), strona pakietu z formularzem
   i /probna (bez parametru, ?embed=1, ?embed=hero). Barwy: tokeny --zs-* i paleta sklepu w tokens.css;
   tu tylko kształty: kratka w tle, przyciski z cieniem „klawisza", karty z obwódką 1.5px, taśma, zakreślacz,
   odręczne dopiski (Caveat). Na końcu pliku, więc przy tej samej specyficzności wygrywa ze starszymi
   blokami (SKLEP-KV-*, PROBNA-KV*). W ramce (pb-embedded) tło przezroczyste - kartę daje strona. */
html.pb-kv:not(.dark) {
  --primary: var(--zs-blue); --primary-hover: var(--zs-blue-hover); --primary-pressed: var(--zs-blue-press);
  --primary-container: var(--zs-blue-soft); --primary-ring: var(--zs-line); --text: var(--zs-ink); --text-2: var(--zs-mute);
  --border: var(--zs-line); --border-strong: var(--zs-line-strong); --bg: var(--zs-paper);
  --g-blue: var(--zs-blue); --g-green: var(--zs-teal); --g-violet: var(--zs-violet);
}
html:is(.pb-kv, .sk-kv):not(.pb-embedded) body.pb-body {
  background-color: var(--zs-paper);
  background-image: linear-gradient(var(--zs-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-grid) 1px, transparent 1px);
  background-size: 26px 26px;
}
html:is(.pb-kv, .sk-kv) body.pb-body { color: var(--zs-ink); }
/* Nagłówki: 900, ciasno, kluczowe słowo zakreślaczem (strong / em w tytule). */
html:is(.pb-kv, .sk-kv) :is(.pb-h1, .sk-hero-title, .sk-block-title, .sk-shelf-title, .sk-cn-intro-h, .sk-cn-title, .sk-final-title, .sk-month-title) { font-weight: var(--fw-black); letter-spacing: -0.03em; color: var(--zs-ink); }
html:is(.pb-kv, .sk-kv) :is(.sk-hero-title, .sk-block-title, .sk-cn-intro-h, .sk-final-title) :is(strong, em) {
  display: inline; font-style: normal; color: inherit; background-image: var(--zs-hl); -webkit-background-clip: border-box; background-clip: border-box;
  -webkit-text-fill-color: currentColor; padding: 0 2px; -webkit-box-decoration-break: clone; box-decoration-break: clone;
}
/* Odręczny dopisek (Caveat) - `.zs-hand` w szablonach. */
.zs-hand { display: inline-block; font-family: Caveat, "Caveat Fallback", cursive; font-weight: var(--fw-bold); font-size: var(--fs-2xl); line-height: 1; color: var(--zs-blue); transform: rotate(-2deg); }
/* Taśma na wyróżnionej karcie - pusty `<span class="zs-tape">` jako pierwsze dziecko karty z position: relative. */
.zs-tape { position: absolute; left: 50%; top: -14px; width: 110px; height: 30px; transform: translateX(-50%) rotate(-3deg); background: var(--zs-tape); box-shadow: 0 1px 2px rgba(0, 0, 0, .06); z-index: 2; pointer-events: none; }
/* Przyciski: główny niebieski z cieniem klawisza, drugorzędny biały z obwódką. */
html:is(.pb-kv, .sk-kv) .pb-body :is(.btn.accent, .sk-final-btn, .sk-cn-btn:not(.sk-cn-btn--ghost), .pb-next-btn) {
  background: var(--zs-blue); color: var(--sk-on-primary); border: 0; border-radius: var(--zs-r-btn); font-weight: var(--fw-black);
  box-shadow: var(--zs-key); transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std);
}
html:is(.pb-kv, .sk-kv) .pb-body :is(.btn.accent, .sk-final-btn, .sk-cn-btn:not(.sk-cn-btn--ghost), .pb-next-btn):hover { background: var(--zs-blue-hover); color: var(--sk-on-primary); box-shadow: var(--zs-key); transform: none; }
html:is(.pb-kv, .sk-kv) .pb-body :is(.btn.accent, .sk-final-btn, .sk-cn-btn:not(.sk-cn-btn--ghost), .pb-next-btn):active { transform: translateY(2px); box-shadow: var(--zs-key-down); }
html:is(.pb-kv, .sk-kv) .pb-body :is(.btn.tonal, .btn:not(.accent), .sk-cn-btn--ghost, .sk-hero-btn--ghost) {
  background: var(--sk-card); color: var(--zs-blue); border: 0; border-radius: var(--zs-r-btn); font-weight: var(--fw-black); box-shadow: 0 0 0 1.5px var(--zs-line);
}
html:is(.pb-kv, .sk-kv) .pb-body :is(.btn.tonal, .btn:not(.accent), .sk-cn-btn--ghost, .sk-hero-btn--ghost):hover { background: var(--zs-blue-soft); color: var(--zs-blue); box-shadow: 0 0 0 1.5px var(--zs-line-strong); transform: none; }
/* Karty: białe, obwódka 1.5px, promień 20 px, delikatny cień. */
html:is(.pb-kv, .sk-kv) :is(.sk-card, .sk-zs, .sk-month, .sk-fpanel, .sk-cn-row, .sk-cn-step, .sk-step, .sk-sum, .sk-of, .sk-bp, .pb-card, .pb-panel, .pb-start-card, .sk-pricebox, .sk-cn-intro) {
  background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: var(--zs-shadow);
}
html:is(.pb-kv, .sk-kv) :is(.sk-card, .pb-card, .sk-cn-row):hover { border-color: var(--zs-line-strong); box-shadow: var(--zs-shadow-lift); }
html.pb-kv .pb-start-card { border-radius: var(--zs-r-big); box-shadow: var(--zs-shadow-lift); }
/* Pola formularzy: obwódka 1.5px jak karty, fokus niebieski. */
html:is(.pb-kv, .sk-kv) :is(.input, .textarea, .select) { border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-ink); }
html:is(.pb-kv, .sk-kv) :is(.input, .textarea, .select):focus { border-color: var(--zs-blue); box-shadow: 0 0 0 3px var(--zs-blue-soft); outline: none; }
/* Sklep: jasny nagłówek z linią, baner na kratce (granat na papierze zamiast bieli na gradiencie). */
html.sk-kv .sk-hero { background: transparent; color: var(--zs-ink); border-radius: 0; box-shadow: none; }
html.sk-kv .sk-hero-sym { color: var(--zs-blue); opacity: .12; }
html.sk-kv :is(.sk-hero-lead, .sk-hero-eyebrow) { color: var(--zs-mute); }
html.sk-kv .sk-hero-eyebrow { background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line); color: var(--zs-ink); }
html.sk-kv .sk-hero-chips li { background: var(--sk-card); color: var(--zs-ink); border: 0; box-shadow: 0 0 0 1.5px var(--zs-line); }
html.sk-kv .sk-hero-chips .material-symbols-outlined { color: var(--zs-blue); }
html.sk-kv .sk-hero-btn { background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); border-radius: var(--zs-r-btn); }
html.sk-kv .sk-hero-btn:hover { background: var(--zs-blue-hover); color: var(--sk-on-primary); }
html.sk-kv .sk-hero-btn--ghost { background: var(--sk-card); color: var(--zs-blue); box-shadow: 0 0 0 1.5px var(--zs-line); }
html.sk-kv .sk-hero-btn--ghost:hover { background: var(--zs-blue-soft); color: var(--zs-blue); }
html.sk-kv .sk-hero-dot { background: var(--zs-pen); }
html.sk-kv :is(.sk-hero-hand, .sk-cn-hand) { display: block; width: max-content; max-width: 100%; margin: 6px auto 2px; }
html.sk-kv :is(.sk-zs, .sk-cn-row) { position: relative; overflow: visible; }
html.pb-kv .pb-start-card { position: relative; overflow: visible; }
/* Pas końcowy i pomoc w cenniku: granat jak ciemne sekcje strony, przycisk z cieniem klawisza. */
html.sk-kv :is(.sk-final, .sk-cn-help) { background: var(--zs-ink); color: var(--sk-on-primary); border-radius: var(--zs-r-big); box-shadow: none; }
html.sk-kv :is(.sk-final, .sk-cn-help) :is(.sk-final-title, .sk-cn-help-h) { color: var(--sk-on-primary); }
html.sk-kv :is(.sk-final, .sk-cn-help) :is(.sk-final-title, .sk-cn-help-h) :is(strong, em) { color: var(--zs-ink); }
html.sk-kv .sk-final-btn:hover { background: var(--zs-blue-hover); color: var(--sk-on-primary); transform: none; }
html.sk-kv .sk-cn-help-btn { border-radius: var(--zs-r-btn); }
/* Plakietki i liczniki: płasko, kolory strony. */
html.sk-kv :is(.sk-cn-badge, .sk-badge--featured) { background: var(--zs-mark); color: var(--zs-ink); box-shadow: none; }
html.sk-kv .sk-cn-tile { border-radius: var(--zs-r-btn); box-shadow: none; }
html.sk-kv .sk-cn-step-n, html.sk-kv .sk-step-n { background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); border-radius: var(--shape-md); }
/* /probna: kroki - bieżący niebieski klawisz, zrobione morskie z ptaszkiem, linie jak kratka. */
html.pb-kv .pb-step + .pb-step::before { background: var(--zs-line); height: 2px; }
html.pb-kv .pb-step.is-done::before { background: var(--zs-teal); }
html.pb-kv .pb-step-num { border: 1.5px solid var(--zs-line); background: var(--sk-card); color: var(--zs-mute); }
html.pb-kv .pb-step.is-current .pb-step-num { background: var(--zs-blue); color: var(--sk-on-primary); border-color: var(--zs-blue); box-shadow: var(--zs-key); }
html.pb-kv .pb-step.is-done .pb-step-num { background: var(--zs-teal); border-color: var(--zs-teal); color: var(--sk-on-primary); box-shadow: none; }
html.pb-kv .pb-step { color: var(--zs-mute); font-weight: var(--fw-bold); }
html.pb-kv .pb-step.is-current { color: var(--zs-blue); font-weight: var(--fw-black); }
/* Kafle poziomu: białe karty z obwódką, płaska ikona w kolorze poziomu, wybrany = niebieska obwódka. */
html.pb-kv .pb-tile-label { background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: none; }
html.pb-kv .pb-tile:hover .pb-tile-label { transform: none; box-shadow: 0 0 0 1.5px var(--zs-line-strong); border-color: var(--zs-line-strong); background: var(--sk-card); }
html.pb-kv .pb-tile .pb-tile-ico { background: var(--zs-blue); color: var(--sk-on-primary); border-radius: var(--zs-r-btn); box-shadow: none; }
html.pb-kv .pb-tile--podst .pb-tile-ico { background: var(--zs-teal); }
html.pb-kv .pb-tile--matura .pb-tile-ico { background: var(--zs-violet); }
html.pb-kv .pb-tile-title { color: var(--zs-ink); font-weight: var(--fw-black); }
html.pb-kv .pb-tile-sub { color: var(--zs-mute); font-weight: var(--fw-semibold); }
html.pb-kv .pb-seg-input:checked + .pb-tile-label { border-color: var(--zs-blue); background: var(--zs-blue-soft); box-shadow: 0 0 0 1.5px var(--zs-blue); }
html.pb-kv .pb-seg-input:checked + .pb-tile-label::after { background: var(--zs-blue); color: var(--sk-on-primary); }
html.pb-kv .pb-seg-input:focus-visible + .pb-tile-label { outline: 2px solid var(--zs-blue); outline-offset: 2px; }
/* Segmenty (klasa, zakres, skąd o nas wiesz): kratki-przyciski zamiast szarej pigułki. */
html.pb-kv .pb-segment:not(.pb-segment--tiles):not([hidden]) { background: transparent; border: 0; padding: 0; gap: 6px; }
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg-label { background: var(--sk-card); color: var(--zs-ink); border-radius: var(--zs-r-btn); box-shadow: 0 0 0 1.5px var(--zs-line); font-weight: var(--fw-heavy); }
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg:hover .pb-seg-label { background: var(--zs-blue-soft); color: var(--zs-blue); }
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg-input:checked + .pb-seg-label { background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); }
/* Dni i godziny w kalendarzu: kratki z obwódką, wybrane niebieskie. */
html.pb-kv .pb-day:not(.pb-day--off) { background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line); border: 0; border-radius: var(--zs-r-btn); color: var(--zs-ink); }
html.pb-kv .pb-day.pb-day--active { background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); }
html.pb-kv .pb-day-dot { background: var(--zs-cyan); }
html.pb-kv .pb-slot-time { border: 0; border-radius: var(--zs-r-btn); box-shadow: 0 0 0 1.5px var(--zs-line); background: var(--sk-card); color: var(--zs-ink); font-weight: var(--fw-heavy); }
html.pb-kv .pb-slot-input:checked + .pb-slot-time { background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); }
html.pb-kv :is(.pb-summary, .pb-chosen, .pb-next-bar) { background: var(--zs-blue-soft); border: 0; border-radius: var(--zs-r-card); box-shadow: none; }
html.pb-kv .pb-next { background: var(--zs-blue-soft); color: var(--zs-ink); }
html.pb-kv .pb-trust .material-symbols-outlined { color: var(--zs-blue); }
html.pb-kv .pb-start-hand { position: absolute; right: 18px; top: -16px; z-index: 5; pointer-events: none; }
/* Ramka hero: krok 1 wypełnia ramkę - kafle rosną do wolnego miejsca (bez pustego pasa nad przyciskiem). */
/* `.pb-tile` jest w DOM w fieldsecie i grupie z display: contents, więc selektor potomka, nie dziecka. */
html.pb-heroframe.pb-embedded .pb-start .pb-tile { flex: 1 1 56px; max-height: 118px; display: flex; }
html.pb-heroframe.pb-embedded .pb-start .pb-tile .pb-tile-label { flex: 1; min-height: 56px; align-content: center; }
/* Kafle w ramce: treść w skali kafla (większy tytuł i ikona), żeby wysoki kafel nie był pusty w środku. */
html.pb-heroframe.pb-embedded .pb-start .pb-tile .pb-tile-label { padding: 10px 16px; column-gap: 14px; }
html.pb-heroframe.pb-embedded .pb-start .pb-tile-ico { width: 44px; height: 44px; font-size: var(--fs-2xl); }
html.pb-heroframe.pb-embedded .pb-start .pb-tile-title { font-size: var(--fs-lg); font-weight: var(--fw-black); }
html.pb-heroframe.pb-embedded .pb-start .pb-tile-sub { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--zs-mute); }
/* Krok 2 w ramce: termin w jednej linii z ikoną; w ramce węższej niż 360 px (telefon) przycisk karty to sama strzałka,
   żeby imię korepetytora się nie ucinało. Cała karta i tak jest linkiem. */
html.pb-heroframe.pb-embedded .pb-card--big .pb-next { display: block; min-width: 0; font-size: var(--fs-sm); line-height: var(--lh-tight); color: var(--zs-mute); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-next .material-symbols-outlined { display: inline-block; margin-right: 4px; vertical-align: -3px; font-size: var(--fs-lg); color: var(--zs-teal); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-next strong { color: var(--zs-ink); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-cta { width: 40px; min-height: 40px; padding: 0; font-size: 0; justify-content: center; }
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-cta .material-symbols-outlined { display: inline-block; font-size: var(--fs-xl); }
/* Termin pod imieniem na całą szerokość karty (pod przyciskiem też) - długi „sobota 31 października, 09:00”
   nie wchodzi już pod przycisk; w razie czego łamie się do drugiej linii. */
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-link { grid-template-areas: "photo who cta" "photo next next"; }
/* Pasek przewijania środka ramki zawsze widoczny (właściciel 28.10). Własny ::-webkit-scrollbar wyłącza chowane
   paski macOS/Chrome; scrollbar-color/width wraca na auto, bo ustawione (także odziedziczone z html) wyłączają
   w Chrome pseudoelementy. Firefox: cienki pasek w barwach. */
html.pb-heroframe.pb-embedded .pb-main { scrollbar-width: auto; scrollbar-color: auto; }
html.pb-heroframe.pb-embedded .pb-main::-webkit-scrollbar { width: 8px; }
html.pb-heroframe.pb-embedded .pb-main::-webkit-scrollbar-track { background: var(--zs-blue-soft); border-radius: var(--shape-full); }
html.pb-heroframe.pb-embedded .pb-main::-webkit-scrollbar-thumb { background: var(--zs-blue); border-radius: var(--shape-full); border: 2px solid var(--zs-blue-soft); }
@supports not selector(::-webkit-scrollbar) {
  html.pb-heroframe.pb-embedded .pb-main { scrollbar-width: thin; scrollbar-color: var(--zs-blue) var(--zs-blue-soft); }
}
@media (min-width: 360px) {
  html.pb-heroframe.pb-embedded .pb-card--big .pb-card-cta { width: auto; min-height: 36px; padding: 0 14px; font-size: var(--fs-sm); }
  html.pb-heroframe.pb-embedded .pb-card--big .pb-card-cta .material-symbols-outlined { display: none; }
}
/* Kroki 2 i 3 w ramce hero w języku #364 (właściciel 28.10: „chcę zmiany z 364” także na stronie głównej),
   zmniejszone do ramki 520 px: okrągłe awatary, poziomy w pigułce, termin w pigułce z zakreślaczem, powrót
   jako biały klawisz, miesiąc i wybrany dzień z zakreślaczem. */
html.pb-heroframe.pb-embedded .pb-card--big .pb-card-photo, html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-photo,
html.pb-heroframe.pb-embedded .pb-avatar--lg { border-radius: 50%; }
html.pb-heroframe.pb-embedded .pb-card-levels { display: inline-block; width: fit-content; margin: 3px 0 2px; padding: 2px 8px; border-radius: var(--shape-full); background: var(--zs-blue-soft); color: var(--zs-blue); font-weight: var(--fw-black); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-next { display: inline-block; width: fit-content; max-width: 100%; margin-top: 2px; padding: 2px 8px 2px 6px; border-radius: var(--shape-full); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line); }
html.pb-heroframe.pb-embedded .pb-card--big .pb-next strong { background-image: var(--zs-hl); padding: 0 2px; }
html.pb-heroframe.pb-embedded .pb-back { display: inline-flex; align-items: center; width: fit-content; gap: 4px; min-height: 32px; margin: 0 0 6px; padding: 0 12px 0 8px; border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-ink); font-size: var(--fs-sm); font-weight: var(--fw-heavy); text-decoration: none; box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); }
html.pb-heroframe.pb-embedded .pb-back .material-symbols-outlined { color: var(--zs-blue); font-size: var(--fs-lg); }
html.pb-heroframe.pb-embedded .pb-back:hover { background: var(--zs-blue-soft); color: var(--zs-blue); }
html.pb-heroframe.pb-embedded .pb-back:active { transform: translateY(2px); box-shadow: 0 0 0 1.5px var(--zs-line), 0 1px 0 var(--zs-line); }
html.pb-heroframe.pb-embedded .pb-month { color: var(--zs-ink); font-size: var(--fs-sm); font-weight: var(--fw-black); background-image: var(--zs-hl); padding: 0 3px; }
html.pb-heroframe.pb-embedded .pb-slots-title { color: var(--zs-ink); font-weight: var(--fw-black); }
html.pb-heroframe.pb-embedded .pb-slots-title::first-line { background-image: none; }
/* Krok 2 przy 1-2 korepetytorach (właściciel 28.10: „miejsce nie jest wypełnione”): duże karty wypełniają ramkę -
   większe zdjęcie, imię i poziomy, termin pod spodem, na dole karty przycisk „Wybierz termin” na całą szerokość.
   Przy 3+ (albo z listą „Pozostali”) zostają kompaktowe wiersze z przewijaniem. Karty rosną tylko do wolnego
   miejsca (flex-grow, min-height: auto), więc treść nigdy się nie ściska. */
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) { flex: 1 1 auto; display: flex; flex-direction: column; gap: 10px; padding-bottom: 4px; }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) > .pb-card--big { flex: 1 1 auto; display: flex; }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-link {
  flex: 1; grid-template-columns: 56px minmax(0, 1fr); grid-template-areas: "photo who" "next next" "tags tags" "bio bio" "cta cta";
  align-content: center; gap: 4px 14px; padding: 16px;
}
/* W dużej karcie wraca to, co kompaktowy wiersz chowa: hasło, wyróżniki i (przy jednej osobie) krótkie bio. */
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-headline { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; margin: 2px 0 0; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--zs-ink); }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-tags { grid-area: tags; display: flex; flex-wrap: wrap; gap: 4px; max-height: 56px; overflow: hidden; margin: 2px 0 0; }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))):not(:has(> :nth-child(2))) .pb-card-bio { grid-area: bio; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; margin: 2px 0 0; font-size: var(--fs-sm); color: var(--zs-mute); }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-photo { width: 56px; height: 56px; border-radius: 50%; font-size: var(--fs-xl); }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-name { font-size: var(--fs-lg); font-weight: var(--fw-black); white-space: normal; }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-levels { font-size: var(--fs-sm); }
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-cta {
  align-self: end; width: 100%; min-height: 44px; margin-top: 10px; padding: 0 16px; font-size: var(--fs-md); gap: 6px;
}
html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-cta .material-symbols-outlined { display: inline-block; font-size: var(--fs-lg); }
html.pb-heroframe.pb-embedded :is(.pb-action, .pb-next-bar, .pb-hero) { background: var(--sk-card); }
/* Pływający koszyk (lewy dół) w tej samej linii i formie co przycisk asystenta (prawy dół, /doradca.js):
   ta sama wysokość 46 px, ten sam odstęp od dołu (telefon 18 px, szerzej 24 px), „klawisz” i promień 14. */
html.sk-kv .sk-fcart { left: 14px; bottom: 18px; height: 46px; border-radius: var(--zs-r-btn); background: var(--zs-blue); font-weight: var(--fw-black); box-shadow: var(--zs-key), 0 14px 30px rgba(20, 27, 78, .18); }
html.sk-kv .sk-fcart:hover { transform: none; background: var(--zs-blue-hover); }
html.sk-kv .sk-fcart:active { transform: translateY(2px); box-shadow: var(--zs-key-down); }
html.sk-kv .sk-fcart-n { border-radius: var(--shape-full); color: var(--zs-blue); }
html.sk-kv:has(.sk-fcart:not([hidden])) .sk-toast { bottom: 80px; }
@media (min-width: 600px) {
  html.sk-kv .sk-fcart { left: 20px; bottom: 24px; height: 46px; }
}
/* Cennik: pakiety bez drugiej ramki wokół (karty wierszy same są kartami) i z oddechem od krawędzi ramki. */
html.sk-kv.pb-embedded .sk-cn { padding-inline: 12px; }
/* Wyróżniony pakiet mocniej widoczny (właściciel 28.10): grubsza niebieska ramka z poświatą, większa
   plakietka przekrzywiona jak naklejka. */
html.sk-kv .sk-cn-row.is-rec { border: 2.5px solid var(--zs-blue); box-shadow: 0 0 0 5px var(--zs-blue-soft), 0 18px 40px rgba(20, 27, 78, .12); }
html.sk-kv .sk-cn-row.is-rec .sk-cn-badge { top: -16px; padding: 7px 14px; font-size: var(--fs-sm); transform: rotate(-2deg); box-shadow: 0 2px 0 rgba(20, 27, 78, .12); }
/* Karta wyróżnionego pakietu (poniżej 1100 px) z miejscem na plakietkę nad kafelkiem z liczbą lekcji. */
html.sk-kv .sk-cn-row.is-rec { margin-top: 22px; padding-top: 34px; }
@media (min-width: 1100px) {
  html.sk-kv .sk-cn-row.is-rec { margin-top: 14px; padding-top: 16px; }
  /* CENNIK-WSTAZKA-ODSTEP (12.11, właściciel: „tutaj za mały odstęp”): z plakietką „+4” nad kafelkiem wstążka
     „Najczęściej wybierany” prawie jej dotykała - wyróżniony pakiet z prezentem dostaje więcej miejsca u góry. */
  html.sk-kv .sk-cn-row.is-rec.has-gift { margin-top: 20px; padding-top: 30px; }
}
@media (min-width: 360px) {
  html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-link { grid-template-columns: 72px minmax(0, 1fr); grid-template-areas: "photo who" "photo next" "tags tags" "bio bio" "cta cta"; }
  html.pb-heroframe.pb-embedded .pb-main:not(:has(.pb-rest)) > .pb-grid--big:not(:has(> :nth-child(3))) .pb-card-photo { width: 72px; height: 72px; }
}
/* Taśma na wyróżnionym pakiecie tylko od 600 px - na telefonie najeżdżała na plakietkę „Najczęściej wybierany”
   (właściciel 28.10), a plakietka i tak wyróżnia wiersz. */
html.sk-kv .sk-cn-row .zs-tape { display: none; }
@media (min-width: 600px) {
  html.sk-kv .sk-cn-row .zs-tape { display: block; }
}
/* Cennik: „Pomogę dobrać pakiet” i trzy kroki jak reszta strony (właściciel 28.10: „odbiega wizualnie od reszty”) -
   biała karta z obwódką 1.5 px zamiast jasnoniebieskiego pudełka, cele jako białe klawisze z obwódką, numery kroków
   odręcznie (Caveat) zamiast kolorowych kafli, treść kroków od lewej, bez strzałek między kartami. */
html.sk-kv .sk-hero-ai--light { padding: 18px 20px; background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: var(--zs-shadow); color: var(--zs-ink); }
html.sk-kv .sk-hero-ai--light .sk-hero-ai-q { margin-bottom: 14px; font-size: var(--fs-md); }
html.sk-kv .sk-hero-ai--light .sk-hero-ai-q strong { font-weight: var(--fw-black); background: var(--zs-hl); }
html.sk-kv .sk-hero-ai--light .sk-hero-ai-ico { border-radius: var(--zs-r-btn); background: var(--zs-blue); box-shadow: var(--zs-key-down); }
html.sk-kv .sk-hero-ai--light .sk-hero-ai-opt { min-height: 44px; padding: 0 16px; border: 0; border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-ink); font-weight: var(--fw-black); box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); transition: transform 120ms ease, box-shadow 120ms ease; }
html.sk-kv .sk-hero-ai--light .sk-hero-ai-opt:hover { background: var(--zs-blue-soft); color: var(--zs-blue); transform: none; box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 3px 0 var(--zs-line-strong); }
html.sk-kv .sk-hero-ai--light .sk-hero-ai-opt:active { transform: translateY(2px); box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 1px 0 var(--zs-line-strong); }
html.sk-kv .sk-hero-ai--light .sk-hero-ai-free { margin-top: 10px; color: var(--zs-blue); font-weight: var(--fw-black); text-decoration-color: var(--zs-mark); text-decoration-thickness: 3px; }
html.sk-kv .sk-cn-step { border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: var(--zs-shadow); }
html.sk-kv .sk-cn-step .sk-cn-step-n, html.sk-kv .sk-cn-step:nth-child(n) .sk-cn-step-n {
  width: auto; height: auto; min-width: 40px; border-radius: 0; background: none; box-shadow: none; color: var(--zs-blue);
  font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-display); font-weight: var(--fw-bold); line-height: 1; transform: rotate(-4deg);
}
html.sk-kv .sk-cn-step:nth-child(3) .sk-cn-step-n { color: var(--zs-teal); }
html.sk-kv .sk-cn-step-h { font-weight: var(--fw-black); }
@media (min-width: 600px) {
  html.sk-kv .sk-cn-step { flex-direction: row; align-items: flex-start; gap: 14px; text-align: left; }
  html.sk-kv .sk-cn-step:not(:last-child)::after { display: none; }
}
/* Cena na stronie produktu jako karta: wewnętrzny margines (dawniej linia nad i pod, bez boków). */
html.sk-kv .sk-pricebox { padding: 16px 22px; }
/* Strona pakietu: kafel z liczbą lekcji w kolorach strony zamiast szarego gradientu. */
html.sk-kv .sk-bp-art { background: var(--zs-blue); }
html.sk-kv .sk-bp-art--one { background: var(--zs-ink); }
html.sk-kv .sk-bp-art--exam { background: var(--zs-violet); }
html.sk-kv .sk-bp { overflow: hidden; }
/* ══ STRONA-V2-NAGLOWEK (28.10, prośba właściciela): nagłówek, stopka i resztki starego stylu w publicznych
   widokach (sklep, e-booki, koszyk, cennik, strona pakietu, /probna z „Gotowe") dopasowane do korepetycjesolve.com.
   Wzór: #sp-top / #sp-hdr / stopka strony (granat w kratkę). Ramka hero (?embed=hero) i ramki ?embed=1 nie mają
   nagłówka ani stopki - reguły z `.pb-top`, `.sk-top`, `.zs-topbar`, `.sk-foot`, `.pb-foot` ich nie dotykają. */
/* Granatowy pasek nad nagłówkiem: żółty dopisek Caveat, jasny tekst, cyjanowy link. */
/* SKLEP-NAGLOWEK-WWW (04.11): układ jak .sp-topbar strony WWW. Od telefonu: dopisek, krótki link
   i ikonka Instagrama; od 900 px tekst i pełny link, od 1100 px podpis przy Instagramie. Linki mają
   44 px wysokości bez pogrubiania paska (ujemny margines). */
.zs-topbar { position: relative; display: flex; align-items: center; justify-content: center; padding: 9px 44px 9px 14px; background: var(--zs-ink); color: var(--sk-on-primary); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .07); font-size: var(--fs-sm); font-weight: var(--fw-medium); line-height: 1.4; }
.zs-topbar-in { margin: 0; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px 8px; }
.zs-topbar-hand { font-family: Caveat, "Caveat Fallback", cursive; font-weight: var(--fw-bold); font-size: var(--fs-xl); line-height: 1.4; color: var(--zs-mark); }
.zs-topbar-long { display: none; }
.zs-topbar a.zs-topbar-cta { display: inline-flex; align-items: center; gap: 4px; min-height: 44px; margin: -13px 0; color: var(--zs-topbar-link); font-weight: var(--fw-bold); text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; }
.zs-topbar a.zs-topbar-cta:hover { color: var(--sk-on-primary); }
.zs-topbar-arrow { display: inline-block; transition: transform .2s; }
.zs-topbar a.zs-topbar-cta:hover .zs-topbar-arrow { transform: translateX(2px); }
.zs-topbar-cta-full { display: none; }
.zs-topbar a.zs-topbar-ig { position: absolute; top: 50%; right: 2px; transform: translateY(-50%); z-index: 2; display: flex; align-items: center; justify-content: center; gap: 6px; min-width: 44px; min-height: 44px; padding: 0 10px; color: var(--sk-on-primary); font-size: var(--fs-base); font-weight: var(--fw-black); text-decoration: none; }
.zs-topbar-ig svg { width: 18px; height: 18px; flex: none; }
.zs-topbar-ig span { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
@media (min-width: 900px) {
  .zs-topbar { padding: 10px 20px; font-size: var(--fs-base); }
  .zs-topbar-in { gap: 4px 12px; }
  .zs-topbar-long { display: inline; }
  .zs-topbar-cta-full { display: inline; }
  .zs-topbar-cta-short { display: none; }
  .zs-topbar a.zs-topbar-ig { right: 8px; }
}
@media (min-width: 1100px) { .zs-topbar-ig span { position: static; width: auto; height: auto; overflow: visible; clip: auto; } }
/* Nagłówek sklepu: biały pas z linią, nazwa szkoły w niebieskim (wersaliki jak „SOLVE"), działy granatowe
   z zakreślaczem na aktywnym, „Zaloguj" biały z obwódką (od 1100 px), „Lekcja próbna" niebieski klawisz (od 700 px), koszyk drugorzędny. */
/* Telefon: „Strona główna" jako ikona domku (tekst zostaje w DOM dla czytników), żeby trzy działy i koszyk
   zmieściły się w jednym rzędzie bez ucinania „Korepetycje 1:1". */
/* Nagłówek /probna: ten sam wzór, pełna szerokość z linią, treść w 1040 px. */
html.pb-kv .pb-top { display: block; max-width: none; padding: 0; background: var(--sk-card); border-bottom: 1.5px solid var(--zs-line); }
.pb-top-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 12px; max-width: 1040px; margin: 0 auto; padding: 10px var(--page-gutter, 16px); box-sizing: border-box; }
html.pb-kv .pb-brand .pb-brand-mark { border: 0; background: transparent; }
html.pb-kv .pb-brand-name { color: var(--zs-blue); font-weight: var(--fw-heavy); font-size: var(--fs-xl); letter-spacing: .02em; text-transform: uppercase; }
html.pb-kv .pb-top-nav { align-items: center; gap: 4px; isolation: isolate; }
html.pb-kv .pb-top-nav a { position: relative; color: var(--zs-nav); font-weight: var(--fw-bold); font-size: var(--fs-md); background: transparent; padding: 0 10px; }
html.pb-kv .pb-top-nav a:hover { background: transparent; color: var(--zs-blue); }
html.pb-kv .pb-top-nav a[aria-current] { color: var(--zs-ink); }
html.pb-kv .pb-top-nav a[aria-current]::after { content: ""; position: absolute; left: 6px; right: 6px; bottom: 11px; height: 9px; background: var(--zs-mark); border-radius: 2px; z-index: -1; }
html.pb-kv .pb-top-nav a.pb-top-login { min-height: 40px; margin-left: 6px; padding: 0 14px; border-radius: var(--shape-md); color: var(--zs-blue); font-weight: var(--fw-black); background: var(--sk-card); box-shadow: inset 0 0 0 1.5px var(--zs-line); }
html.pb-kv .pb-top-nav a.pb-top-login:hover { background: var(--zs-blue-soft); }
/* Telefon: w rzędzie marka i „Strefa rodzica" - „Lekcja próbna" (bieżąca strona) i „Strona główna" (prowadzi tam
   też logo) chowamy, inaczej nawigacja spadała do drugiego rzędu. */
html.pb-kv .pb-top-nav a:not(.pb-top-login) { display: none; }
@media (min-width: 600px) { html.pb-kv .pb-top-nav a:not(.pb-top-login) { display: inline-flex; } }
/* Stopka sklepu i /probna: granat w kratkę jak stopka strony, nagłówki białe, tekst jasnoniebieski,
   linie przerywane w cyjanie, dopisek Caveat na żółto. */
html.sk-kv .sk-foot:not(.sk-foot--embed), html.pb-kv .pb-foot {
  margin-top: 40px; border-top: 0; color: var(--zs-foot-text); background-color: var(--zs-ink);
  background-image: linear-gradient(var(--zs-foot-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-foot-grid) 1px, transparent 1px);
  background-size: 26px 26px;
}
html.sk-kv .sk-foot:not(.sk-foot--embed) a, html.pb-kv .pb-foot a { color: var(--zs-foot-text); }
html.sk-kv .sk-foot:not(.sk-foot--embed) a:hover, html.pb-kv .pb-foot a:hover { color: var(--sk-on-primary); }
html.sk-kv .sk-foot:not(.sk-foot--embed) :is(.sk-foot-h, .sk-foot-brand) { color: var(--sk-on-primary); letter-spacing: 0; text-transform: none; font-size: var(--fs-lg); font-weight: var(--fw-heavy); }
html.sk-kv .sk-foot:not(.sk-foot--embed) .sk-foot-brand { font-size: var(--fs-xl); text-transform: uppercase; letter-spacing: .02em; }
html.sk-kv .sk-foot:not(.sk-foot--embed) .sk-foot-tag { display: block; font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-2xl); font-weight: var(--fw-bold); color: var(--zs-mark); text-transform: none; letter-spacing: 0; transform: rotate(-2deg); transform-origin: left; }
html.sk-kv .sk-foot:not(.sk-foot--embed) .sk-foot-logo { background: var(--sk-card); }
html.sk-kv .sk-foot:not(.sk-foot--embed) .pb-inline-link { display: inline-flex; align-items: center; min-height: 46px; padding: 0 18px; border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-blue); font-weight: var(--fw-black); text-decoration: none; box-shadow: 0 4px 0 var(--zs-key-light); }
html.sk-kv .sk-foot:not(.sk-foot--embed) .pb-inline-link:hover { color: var(--zs-blue-hover); background: var(--zs-blue-soft); }
html.sk-kv .sk-foot:not(.sk-foot--embed) .sk-foot-legal { border-top: 1.5px dashed var(--zs-foot-line); color: var(--zs-foot-mute); }
html.sk-kv .sk-foot:not(.sk-foot--embed) .sk-foot-legal span { color: var(--zs-foot-mute); }
html.pb-kv .pb-foot { padding-top: 22px; padding-bottom: 24px; font-size: var(--fs-md); }
.pb-foot-hand { display: inline-block; margin-right: 8px; font-family: Caveat, "Caveat Fallback", cursive; font-weight: var(--fw-bold); font-size: var(--fs-2xl); color: var(--zs-mark); transform: rotate(-2deg); }
/* Pas końcowy sklepu (.sk-final) jak CTA strony: niebieski w białą kratkę, wyróżnienie żółtym tekstem (zakreślacz
   na ciemnym tle zakrywał litery), biały przycisk z jasnym cieniem klawisza. Pomoc w cenniku: granat w kratkę. */
html.sk-kv .sk-final { background-color: var(--zs-blue); background-image: linear-gradient(rgba(255, 255, 255, .08) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, .08) 1px, transparent 1px); background-size: 26px 26px; }
html.sk-kv .sk-cn-help { background-color: var(--zs-ink); background-image: linear-gradient(var(--zs-foot-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-foot-grid) 1px, transparent 1px); background-size: 26px 26px; }
html.sk-kv .sk-final .sk-final-title :is(strong, em) { background: none; color: var(--zs-mark); -webkit-text-fill-color: currentColor; padding: 0; }
html.sk-kv .sk-final .sk-final-sub { color: var(--zs-final-sub); }
html.sk-kv .sk-final .sk-eyebrow--light { font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-2xl); font-weight: var(--fw-bold); letter-spacing: 0; text-transform: none; color: var(--zs-mark); }
html.sk-kv .sk-final .sk-eyebrow--light::before, html.sk-kv .sk-final .sk-eyebrow--light::after { display: none; }
html:is(.pb-kv, .sk-kv) .pb-body .sk-final .sk-final-btn, html.sk-kv .sk-cn-help .sk-cn-help-btn { background: var(--sk-card); color: var(--zs-blue); box-shadow: 0 5px 0 var(--zs-key-light); }
html:is(.pb-kv, .sk-kv) .pb-body .sk-final .sk-final-btn:hover, html.sk-kv .sk-cn-help .sk-cn-help-btn:hover { background: var(--zs-blue-soft); color: var(--zs-blue-hover); }
html.sk-kv .sk-final .sk-final-perks li { background: rgba(255, 255, 255, .1); border-color: rgba(255, 255, 255, .22); }
/* E-booki: okładki na „kartce w kratkę" zamiast gradientu niebieski-cyjan (karta katalogu i strona produktu). */
html.sk-kv :is(.sk-card-media, .sk-product-media, .sk-related-grid .sk-mini-media) {
  background-color: var(--zs-paper);
  background-image: linear-gradient(var(--zs-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-grid) 1px, transparent 1px);
  background-size: 26px 26px;
}
html.sk-kv :is(.sk-card-media, .sk-related-grid .sk-mini-media) { border-bottom: 1.5px solid var(--zs-line); }
html.sk-kv .sk-related-grid .sk-mini { border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: var(--zs-shadow); }
html.sk-kv .sk-related-grid .sk-mini-cover.sk-cover--empty { background: var(--sk-card); border: 1.5px solid var(--zs-line); color: var(--zs-blue); }
html.sk-kv .sk-product-media { border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-big); }
html.sk-kv :is(.sk-card-media, .sk-product-media) .sk-cover--empty { background: var(--sk-card); border: 1.5px solid var(--zs-line); color: var(--zs-blue); }
/* Zakładki produktu: aktywna granatowa z żółtym zakreślaczem pod spodem zamiast niebiesko-cyjanowej kreski. */
html.sk-kv .sk-tab { color: var(--zs-mute); font-weight: var(--fw-black); }
html.sk-kv .sk-tab:hover { color: var(--zs-blue); background: transparent; }
html.sk-kv .sk-tab[aria-selected="true"], html.sk-kv .sk-tab[aria-selected="true"]:hover { color: var(--zs-ink); }
html.sk-kv .sk-tab-ink { height: 6px; bottom: 8px; border-radius: 2px; background: var(--zs-mark); opacity: .9; }
/* Powrót do sklepu w koszyku: biały jak pozostałe „Wróć", pusty koszyk z płaską ikoną na niebieskim klawiszu. */
html.sk-kv .sk-backlink.sk-backlink--big { background: var(--sk-card); border: 1.5px solid var(--zs-line); }
html:is(.pb-kv, .sk-kv) .pb-empty-ico { background: var(--zs-blue); border-radius: var(--zs-r-btn); box-shadow: var(--zs-key); }
/* Formularze zamówienia (koszyk, pakiet) i dane w /probna: pola i zgody białe z obwódką 1.5 px (zostały szare). */
html:is(.pb-kv, .sk-kv) body.pb-body :is(.input, .textarea, .select) { border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-btn); background: var(--sk-card); }
html:is(.pb-kv, .sk-kv) body.pb-body :is(.input, .textarea, .select):focus { border-color: var(--zs-blue); box-shadow: 0 0 0 3px var(--zs-blue-soft); }
html:is(.pb-kv, .sk-kv) body.pb-body .pz-consent-check { background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-btn); }
html:is(.pb-kv, .sk-kv) body.pb-body .pz-consent-check:has(input:checked) { border-color: var(--zs-blue); background: var(--zs-blue-soft); }
html.sk-kv .sk-chip span { border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-ink); font-weight: var(--fw-heavy); }
html.sk-kv .sk-chip:hover span { border-color: var(--zs-line-strong); background: var(--zs-blue-soft); color: var(--zs-blue); }
html.sk-kv .sk-chip input:checked + span { border-color: var(--zs-blue); background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); }
/* Strona pakietu: trzy zalety w równych kolumnach od 600 px (tekst nie łamie się na trzy linie). */
@media (min-width: 600px) { html.sk-kv .sk-bp-trust { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } }
/* /probna „Gotowe": bilet jako karta zeszytu - nagłówek z korepetytorem na jasnoniebieskim zamiast szarego,
   akcje w rzędzie pod informacją o linku, „Co dalej" w karcie z numerami na niebieskich klawiszach. */
html.pb-kv .pb-done-ico { color: var(--zs-teal); }
html.pb-kv .pb-done .pb-eyebrow { font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-2xl); font-weight: var(--fw-bold); letter-spacing: 0; text-transform: none; color: var(--zs-blue); transform: rotate(-2deg); }
html.pb-kv .pb-ticket, html.pb-kv .pb-next-steps { background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: var(--zs-shadow); }
html.pb-kv .pb-ticket-who { background: var(--zs-blue-soft); border-bottom: 1.5px solid var(--zs-line); }
html.pb-kv .pb-ticket-label { color: var(--zs-mute); font-weight: var(--fw-bold); }
html.pb-kv .pb-ticket-value { color: var(--zs-ink); font-weight: var(--fw-black); }
html.pb-kv .pb-ticket-actions > .pb-fine { flex-basis: 100%; margin: 0; }
html.pb-kv .pb-next-steps { padding: 18px 20px 8px; }
html.pb-kv .pb-next-steps .pb-list { list-style: none; counter-reset: zs-krok; padding: 0; }
html.pb-kv .pb-next-steps .pb-list li { position: relative; counter-increment: zs-krok; padding-left: 42px; margin-bottom: 14px; }
html.pb-kv .pb-next-steps .pb-list li::before { content: counter(zs-krok); position: absolute; left: 0; top: 0; width: 28px; height: 28px; display: grid; place-items: center; border-radius: var(--shape-sm); background: var(--zs-blue); color: var(--sk-on-primary); font-weight: var(--fw-black); font-size: var(--fs-md); box-shadow: 0 3px 0 var(--zs-blue-press); }
html.sk-kv .sk-final .sk-final-perks .sk-final-ico { background: var(--sk-card); color: var(--zs-blue); box-shadow: none; }
/* Pasek działów w ramce sklepu (?embed=1): działy jak linki nagłówka strony - granat, aktywny z zakreślaczem. */
html.sk-kv .sk-embed-cats { isolation: isolate; }
html.sk-kv .sk-embed-cats a { position: relative; background: transparent; border-color: transparent; box-shadow: none; color: var(--zs-nav); font-weight: var(--fw-bold); }
html.sk-kv .sk-embed-cats a:hover { background: transparent; color: var(--zs-blue); }
html.sk-kv .sk-embed-cats a[aria-current] { background: transparent; border-color: transparent; color: var(--zs-ink); box-shadow: none; }
html.sk-kv .sk-embed-cats a[aria-current]::after { content: ""; position: absolute; left: 8px; right: 8px; bottom: 10px; height: 9px; background: var(--zs-mark); border-radius: 2px; z-index: -1; }
html.sk-kv .sk-embed-cart { border-radius: var(--zs-r-btn); background: var(--zs-blue); font-weight: var(--fw-black); box-shadow: var(--zs-key); }
html.sk-kv .sk-embed-cart:hover { background: var(--zs-blue-hover); }
/* ══ STRONA-V2-KROK23 (28.10, prośba właściciela): kroki 2 i 3 /probna jak „zeszyt w kratkę”. Wszystko pod
   html.pb-kv:not(.pb-heroframe) - ramka hero ma własny, ciasny układ (stała wysokość 522/562 px) i zostaje bez zmian;
   rezerwacja w panelu rodzica (.pb-amelia) też, bo nie ma html.pb-kv. */
/* Krok 2: zgrabna wizytówka - okrągły awatar 72-88 px obok imienia, poziomów i hasła; wyróżniki, krótki opis,
   pod przerywaną linią plakietka „najbliższy termin” z zakreślaczem i przycisk na całą szerokość. Karty mają
   własną wysokość (bez rozciągania do sąsiadki), więc w karcie bez opisu nie ma pustej dziury. */
html.pb-kv:not(.pb-heroframe) .pb-grid--big { align-items: start; }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-link {
  grid-template-columns: 72px minmax(0, 1fr); grid-template-areas: "photo who" "tags tags" "bio bio" "foot foot";
  align-items: center; column-gap: 14px; row-gap: 0; padding: 16px;
}
/* Odstępy marginesem, nie row-gap: puste wiersze (brak wyróżników albo opisu) nie zostawiają przerwy. */
html.pb-kv:not(.pb-heroframe) .pb-card--big :is(.pb-tags, .pb-card-bio) { margin-top: 12px; }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-photo {
  width: 72px; height: 72px; aspect-ratio: 1; border-radius: var(--shape-full); font-size: var(--fs-xl); letter-spacing: .02em;
  box-shadow: 0 0 0 3px var(--sk-card), 0 0 0 4.5px var(--zs-line);
}
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-who { align-self: center; }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-name { font-size: var(--fs-xl); color: var(--zs-ink); line-height: var(--lh-tight); }
html.pb-kv:not(.pb-heroframe) .pb-card-levels {
  display: inline-block; margin: 6px 0 0; padding: 2px 8px; border-radius: var(--shape-sm); background: var(--zs-blue-soft);
  color: var(--zs-blue); font-size: var(--fs-sm); font-weight: var(--fw-heavy); line-height: var(--lh-tight);
}
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-headline { margin: 6px 0 0; color: var(--zs-mute); font-size: var(--fs-base); font-weight: var(--fw-semibold); line-height: 1.4; }
html.pb-kv:not(.pb-heroframe) .pb-tag { background: var(--sk-card); color: var(--zs-ink); box-shadow: inset 0 0 0 1.5px var(--zs-line); font-weight: var(--fw-bold); }
html.pb-kv:not(.pb-heroframe) .pb-tag .material-symbols-outlined { color: var(--zs-teal); }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-bio { -webkit-line-clamp: 3; color: var(--zs-mute); }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-foot {
  flex-direction: column; align-items: stretch; flex-wrap: nowrap; gap: 12px; margin-top: 14px; padding-top: 14px; border-top: 1.5px dashed var(--zs-line);
}
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next {
  align-self: flex-start; gap: 6px; padding: 6px 12px 6px 9px; border-radius: var(--shape-full); background: var(--zs-blue-soft);
  color: var(--zs-mute); font-size: var(--fs-sm); font-weight: var(--fw-semibold);
}
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next .material-symbols-outlined { color: var(--zs-teal); }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next strong { color: var(--zs-ink); font-weight: var(--fw-black); background-image: var(--zs-hl); padding: 0 3px; }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next--none { background: var(--zs-paper); box-shadow: inset 0 0 0 1.5px var(--zs-line); }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next--none .material-symbols-outlined { color: var(--zs-mute); }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-cta { width: 100%; height: 48px; justify-content: center; font-size: var(--fs-md); }
html.pb-kv:not(.pb-heroframe) .pb-card:hover { transform: none; }
/* PROBNA-HERO-HOVER (06.11, właściciel: „jak najeżdżam na korepetytora, to od góry jego pole się przycina”): w ramce hero
   lista kart przewija się w `.pb-main` (overflow), więc uniesienie o 3 px ucinało górną krawędź, a duży cień
   `--zs-shadow-lift` urywał się ostro po bokach jako szary pas. W ramce bez uniesienia, z obwódką i małym cieniem,
   który mieści się w 4 px marginesu listy. */
html.pb-heroframe.pb-embedded .pb-card:hover { transform: none; box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 6px 12px -8px rgba(20, 27, 78, .28); }
html.pb-kv:not(.pb-heroframe) .pb-card-link:focus-visible { outline: 2px solid var(--zs-blue); outline-offset: 3px; }
@media (min-width: 700px) {
  html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-link { grid-template-columns: 88px minmax(0, 1fr); grid-template-areas: "photo who" "tags tags" "bio bio" "foot foot"; column-gap: 18px; padding: 20px; }
  html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-photo { width: 88px; height: 88px; font-size: var(--fs-2xl); }
  html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-card-name { font-size: var(--fs-2xl); }
}
/* Krok 3: numer części na niebieskim klawiszu, miesiąc i wybrany dzień z zakreślaczem, dni i godziny jako białe
   klawisze z obwódką i „podłogą” (jak „Skąd o nas wiesz”), wybrane = niebieski klawisz. Godziny oddziela od
   kalendarza przerywana linia (na telefonie nad nimi, od 700 px z lewej). */
html.pb-kv:not(.pb-heroframe) .pb-h2-n { width: 28px; height: 28px; border-radius: var(--shape-sm); background: var(--zs-blue); color: var(--sk-on-primary); font-weight: var(--fw-black); box-shadow: 0 3px 0 var(--zs-blue-press); }
html.pb-kv:not(.pb-heroframe) .pb-month { color: var(--zs-ink); font-weight: var(--fw-black); background-image: var(--zs-hl); padding: 0 3px; }
html.pb-kv:not(.pb-heroframe) .pb-cal { gap: 7px; }
html.pb-kv:not(.pb-heroframe) .pb-cal-row { gap: 6px; }
html.pb-kv:not(.pb-heroframe) .pb-cal-wd { color: var(--zs-mute); font-weight: var(--fw-bold); }
html.pb-kv:not(.pb-heroframe) .pb-day:not(.pb-day--off) { box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); transition: background var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std), transform var(--motion-fast) var(--ease-std); }
html.pb-kv:not(.pb-heroframe) .pb-day:not(.pb-day--off):not(.pb-day--active):hover { background: var(--zs-blue-soft); color: var(--zs-blue); box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 3px 0 var(--zs-line-strong); }
html.pb-kv:not(.pb-heroframe) .pb-day.pb-day--active { background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); }
html.pb-kv:not(.pb-heroframe) .pb-day:focus-visible { outline: 2px solid var(--zs-blue); outline-offset: 3px; }
html.pb-kv:not(.pb-heroframe) .pb-hint { color: var(--zs-mute); }
html.pb-kv:not(.pb-heroframe) .pb-when-grid > .pb-slots { margin-top: 10px; padding-top: 16px; border-top: 1.5px dashed var(--zs-line); }
html.pb-kv:not(.pb-heroframe) .pb-slots-title { width: fit-content; max-width: 100%; margin-bottom: 12px; color: var(--zs-ink); background-image: var(--zs-hl); padding: 0 3px; }
html.pb-kv:not(.pb-heroframe) .pb-slot-grid { gap: 10px 8px; }
html.pb-kv:not(.pb-heroframe) .pb-slot-time { min-height: 46px; box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); transition: background var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std); }
html.pb-kv:not(.pb-heroframe) .pb-slot:hover .pb-slot-input:not(:checked) + .pb-slot-time { background: var(--zs-blue-soft); color: var(--zs-blue); box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 3px 0 var(--zs-line-strong); }
html.pb-kv:not(.pb-heroframe) .pb-slot-input:checked + .pb-slot-time { background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); }
html.pb-kv:not(.pb-heroframe) .pb-slot-input:focus-visible + .pb-slot-time { outline: 2px solid var(--zs-blue); outline-offset: 3px; }
html.pb-kv:not(.pb-heroframe) .pb-divider { border-top: 1.5px dashed var(--zs-line); }
html.pb-kv:not(.pb-heroframe) .pb-next-bar .pb-ticket-label { font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-xl); font-weight: var(--fw-bold); letter-spacing: 0; text-transform: none; color: var(--zs-blue); }
/* Telefon: awatar w kroku 3 równo z imieniem, nie na środku wysokiego bloku z opisem. */
@media (max-width: 699.98px) { html.pb-kv:not(.pb-heroframe) .pb-tutor { align-items: flex-start; } }
@media (min-width: 700px) {
  html.pb-kv:not(.pb-heroframe) .pb-when-grid > .pb-slots { margin-top: 0; padding-top: 0; padding-left: 22px; border-top: 0; border-left: 1.5px dashed var(--zs-line); align-self: stretch; }
}
/* ══ STRONA-V2-POWROT (28.10, właściciel): powrót do listy w krokach 3 i 4 jako biały klawisz z obwódką 1.5 px
   i „podłogą” (jak „Skąd o nas wiesz”), 44 px, z oddechem nad i pod - imię korepetytora / „Twoje dane” nie kleją się
   do linku. Ramka hero bez zmian (stała wysokość). */
html.pb-kv:not(.pb-heroframe) .pb-back {
  display: inline-flex; width: fit-content; box-sizing: border-box; gap: 8px; min-height: 44px; margin: 22px 0 24px; padding: 0 16px 0 12px;
  border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-ink); font-size: var(--fs-md); font-weight: var(--fw-heavy);
  box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line);
  transition: background var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std), transform var(--motion-fast) var(--ease-std);
}
html.pb-kv:not(.pb-heroframe) .pb-back:hover { background: var(--zs-blue-soft); color: var(--zs-blue); box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 3px 0 var(--zs-line-strong); }
html.pb-kv:not(.pb-heroframe) .pb-back:active { transform: translateY(2px); box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 1px 0 var(--zs-line-strong); }
html.pb-kv:not(.pb-heroframe) .pb-back:focus-visible { outline: 2px solid var(--zs-blue); outline-offset: 3px; }
html.pb-kv:not(.pb-heroframe) .pb-back-ico { transform: scaleX(-1); font-size: var(--fs-xl); color: var(--zs-blue); }
/* W-E15 (05.11): w fazie „Dane” kreatora powrót do terminu zamiast „Zmień korepetytora” */
button.pb-back { border: 0; font-family: inherit; cursor: pointer; }
/* !important: klawisz powrotu ma `display` w kilku blokach o wyższej specyficzności (ramka hero, od 900 px) */
.pb-phase-dane a.pb-back, body:not(.pb-phase-dane) button.pb-back--dane { display: none !important; }
@media (min-width: 900px) {
  /* Lewa krawędź klawisza równo z kolumną kroku (760 px), nie z krawędzią strony. */
  html.pb-kv:not(.pb-heroframe) .pb-main > .pb-back { display: flex; margin-left: max(0px, calc(50% - 380px)); margin-right: 0; }
}

/* ══ DORADCA-V2 (29.10, właściciel: „jak klikam w Wirtualnego Solve, wygląd bota w środku też do zmiany") ══
   Okno asystenta (doradca/ramka.html, na stronie szkoły i w sklepie) w języku korepetycjesolve.com:
   kartka w kratkę, granatowy tekst, dymki asystenta jako białe karteczki z obwódką 1.5px, pytania
   do kliknięcia jako białe „klawisze", główny przycisk niebieski z cieniem klawisza, logo szkoły
   i odręczny dopisek (Caveat) w nagłówku. Tylko `.dor-body` - asystent w panelu (asys-*) bez zmian. */
.dor-body {
  color: var(--zs-ink); background-color: var(--zs-paper);
  background-image: linear-gradient(var(--zs-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-grid) 1px, transparent 1px);
  background-size: 22px 22px;
}
.dor-body .dor-top { background: var(--sk-card); border-bottom: 1.5px solid var(--zs-line); padding: 12px 10px 12px 14px; gap: 12px; }
.dor-logo { position: relative; flex: none; width: 40px; height: 40px; display: grid; place-items: center; border-radius: var(--shape-md); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line), 0 6px 14px -8px rgba(20, 27, 78, .35); }
.dor-logo img { width: 28px; height: 28px; object-fit: contain; }
.dor-live { position: absolute; right: -2px; bottom: -2px; width: 11px; height: 11px; border-radius: 50%; background: var(--zs-teal); box-shadow: 0 0 0 2px var(--sk-card); }
.dor-body .dor-title strong { font-size: var(--fs-md); font-weight: var(--fw-black); letter-spacing: -0.02em; color: var(--zs-ink); }
.dor-title .dor-hand { display: block; margin-top: 2px; font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-xl); font-weight: var(--fw-bold); line-height: 1; color: var(--zs-blue); transform: rotate(-1.5deg); transform-origin: left center; }
.dor-body .dor-top .icon-btn { color: var(--zs-mute); border-radius: var(--shape-md); }
.dor-body .dor-top .icon-btn:hover { background: var(--zs-blue-soft); color: var(--zs-blue); }
.dor-body .asys-msg { line-height: var(--lh-base); }
.dor-body .asys-msg.is-bot { background: var(--sk-card); color: var(--zs-ink); border: 1.5px solid var(--zs-line); border-radius: 18px 18px 18px 6px; box-shadow: var(--zs-shadow); }
.dor-body .asys-msg.is-user { background: var(--zs-blue); color: var(--sk-on-primary); border-radius: 18px 18px 6px 18px; font-weight: var(--fw-semibold); }
.dor-body .asys-dots i { background: var(--zs-blue); }
.dor-body .asys-chip { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 14px; border: 0; border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-ink); font-weight: var(--fw-bold); box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std), color var(--motion-fast) var(--ease-std); }
.dor-body .asys-chip::after { content: "\2192"; flex: none; color: var(--zs-blue); font-weight: var(--fw-black); }
.dor-body .asys-chip:hover { background: var(--zs-blue-soft); color: var(--zs-blue); box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 3px 0 var(--zs-line-strong); }
.dor-body .asys-chip:active { transform: translateY(2px); box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 1px 0 var(--zs-line-strong); }
.dor-body .dor-input { background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--shape-lg); box-shadow: var(--zs-shadow); }
.dor-body .dor-input:focus-within { border-color: var(--zs-blue); box-shadow: 0 0 0 3px var(--zs-blue-soft); }
.dor-body .dor-input .asys-textarea, .dor-body .dor-input .asys-textarea:focus { border: 0; border-radius: 0; box-shadow: none; color: var(--zs-ink); }
.dor-body .dor-input .asys-textarea::placeholder { color: var(--zs-mute); opacity: .8; }
.dor-body .asys-send { border-radius: var(--shape-md); background: var(--zs-blue); box-shadow: var(--zs-key-down); }
.dor-body .asys-send:hover { background: var(--zs-blue-hover); }
.dor-body .dor-actions { gap: 8px; padding-top: 12px; }
.dor-body .dor-actions .btn { min-height: 42px; border: 0; border-radius: var(--zs-r-btn); font-weight: var(--fw-black); background: var(--sk-card); color: var(--zs-blue); box-shadow: 0 0 0 1.5px var(--zs-line); }
.dor-body .dor-actions .btn:hover { background: var(--zs-blue-soft); box-shadow: 0 0 0 1.5px var(--zs-line-strong); }
.dor-body .dor-actions .btn.accent { min-height: 46px; margin-bottom: 4px; background: var(--zs-blue); color: var(--sk-on-primary); box-shadow: var(--zs-key); }
.dor-body .dor-actions .btn.accent:hover { background: var(--zs-blue-hover); box-shadow: var(--zs-key); }
.dor-body .dor-actions .btn:active { transform: translateY(2px); }
.dor-body .dor-actions .btn.accent:active { box-shadow: var(--zs-key-down); }
.dor-body .dor-note { color: var(--zs-mute); }
/* Karty materiałów w odpowiedzi: jak karty sklepu - biała karteczka z obwódką, cena granatem, klawisz „Do koszyka". */
.dor-body .dor-prod { border: 1.5px solid var(--zs-line); border-radius: var(--shape-lg); background: var(--sk-card); box-shadow: var(--zs-shadow); }
.dor-body .dor-prod:hover, .dor-body .dor-prod:focus-visible { border-color: var(--zs-line-strong); background: var(--sk-card); box-shadow: var(--zs-shadow-lift); }
.dor-body .dor-prod-title { color: var(--zs-ink); font-weight: var(--fw-heavy); }
.dor-body .dor-prod-price { color: var(--zs-ink); font-weight: var(--fw-black); }
.dor-body .dor-prod-go { color: var(--zs-blue); }
.dor-body .dor-prod-cart { border-radius: var(--shape-md); background: var(--zs-blue); box-shadow: var(--zs-key-down); font-weight: var(--fw-black); }
.dor-body .dor-prod-cart.is-in { background: var(--sk-card); color: var(--zs-blue); border: 0; box-shadow: 0 0 0 1.5px var(--zs-line); }
.dor-body .dor-filter > .material-symbols-outlined { background: var(--zs-blue-soft); color: var(--zs-blue); border-radius: var(--shape-md); }
/* Formularz „Zostaw kontakt": karta i pola jak w /probna. */
.dor-body .asys-card { background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: var(--zs-shadow); }
.dor-body :is(.input, .textarea) { border: 1.5px solid var(--zs-line); border-radius: var(--shape-md); color: var(--zs-ink); }
.dor-body :is(.input, .textarea):focus { border-color: var(--zs-blue); box-shadow: 0 0 0 3px var(--zs-blue-soft); outline: none; }
.dor-body .asys-card .btn.accent { border: 0; border-radius: var(--zs-r-btn); background: var(--zs-blue); box-shadow: var(--zs-key); font-weight: var(--fw-black); }
/* Mała ramka (bez trybu okna): mniejsze logo i pytania jako pigułki w rzędzie - jak dotąd. */
.dor-body:not(.dor-okno) .dor-logo { width: 32px; height: 32px; border-radius: var(--shape-md); }
.dor-body:not(.dor-okno) .dor-logo img { width: 22px; height: 22px; }
.dor-body:not(.dor-okno) .dor-title .dor-hand { font-size: var(--fs-lg); }
.dor-body:not(.dor-okno) .dor-chips .asys-chip { padding: 6px 12px; border-radius: var(--shape-md); }
.dor-body:not(.dor-okno) .dor-chips .asys-chip::after { content: none; }
.dor-body:not(.dor-okno) .dor-actions .btn { min-height: 34px; }
@media (prefers-reduced-motion: reduce) { .dor-body .asys-chip, .dor-body .dor-actions .btn { transition: none; } .dor-body :is(.asys-chip, .dor-actions .btn):active { transform: none; } }
/* ══ IKONY-ROUNDED (29.10): ikony jak na korepetycjesolve.com - zaokrąglone końcówki, grubsza kreska
   (Material Symbols Rounded 500, @font-face w vendor/material-symbols.css). Najpierw widoki publiczne,
   od PANEL-V2 (ten sam dzień, „chcę spójności w całości") cała aplikacja. */
.material-symbols-outlined { font-family: 'Material Symbols Rounded'; }

/* ══ PANEL-V2 (29.10, właściciel: „całą aplikację dostosować, sekcja po sekcji - chcę spójności w całości,
   ten motyw mi się podoba"): panel w języku korepetycjesolve.com. Barwy przyszły z tokenów marki
   (tokens.css: niebieski, granat, linie, papier, płaskie kafle, niebieski pas w kratkę); tu tylko kształty
   wspólnych komponentów - kratka zeszytu w tle, karty z obwódką 1.5 px i promieniem 20 px, przyciski
   z cieniem „klawisza", obwódki 1.5 px. Od PANEL-V2-CIEMNY (ten sam dzień) także ciemny motyw - barwy z tokenów html.dark. Sekcje (rodzic,
   korepetytor, admin) dopracowują własne bloki PANEL-V2-* niżej. */
html:not(.pb-kv) body {
  background-color: var(--bg);
  background-image: linear-gradient(var(--zs-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-grid) 1px, transparent 1px);
  background-size: 26px 26px;
}
html .sidebar { border-right: 1.5px solid var(--border); }
html .topbar { border-bottom: 1.5px solid var(--border); }
html :is(.card, .parent-card, .form-card, .stat) { border: 1.5px solid var(--border); border-radius: var(--shape-xl); box-shadow: var(--zs-shadow); }
html .btn { border-radius: var(--zs-r-btn); border-width: 1.5px; border-color: var(--border); font-weight: var(--fw-black); box-shadow: none; }
html .btn:hover { border-color: var(--border-strong); }
html .btn.accent { background: var(--primary); border-color: transparent; color: var(--on-primary); box-shadow: var(--zs-key); transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std); }
html .btn.accent:hover { background: var(--primary-hover); border-color: transparent; box-shadow: var(--zs-key); }
html .btn.accent:active { transform: translateY(2px); background: var(--primary-hover); box-shadow: var(--zs-key-down); }
@media (prefers-reduced-motion: reduce) { html .btn.accent:active { transform: none; } }
/* KV-STRONA-1 (05.11, docs/audit/KV-STRONA-2026-11-05.md): żółty = jedna główna akcja na granatowej scenie,
   niebieski (.btn.accent) = główna akcja na jasnym tle. `.btn.cta` tylko wewnątrz sceny (strażnik:
   tests/test_kv_strona_przyciski.py) - na bieli żółty ma 1,24-1,28:1. Drugi selektor przebija przycisk
   drugorzędny widoków publicznych (`.pb-body :is(.btn:not(.accent))`, 0-4-1). Fokus biały (--focus-on-scene). */
html .btn.cta, html:is(.pb-kv, .sk-kv) .pb-body .btn.cta {
  background: var(--zs-cta); border-color: transparent; color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key);
  transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std), background var(--motion-fast) var(--ease-std);
}
html .btn.cta:hover, html:is(.pb-kv, .sk-kv) .pb-body .btn.cta:hover { background: var(--zs-cta-hover); border-color: transparent; color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key); transform: none; }
html .btn.cta:active, html:is(.pb-kv, .sk-kv) .pb-body .btn.cta:active { transform: translateY(2px); box-shadow: var(--zs-cta-key-down); }
html .btn.cta:focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { html .btn.cta:active, html:is(.pb-kv, .sk-kv) .pb-body .btn.cta:active { transform: none; } }
/* `.btn.alt` - drugorzędny jak na stronie: biały, niebieski tekst, obwódka 1.5 px (domyślny .btn ma tekst granatowy).
   W widokach publicznych ten sam wygląd daje już `.pb-body .btn:not(.accent)`. */
html .btn.alt { background: var(--surface); border-color: var(--border); color: var(--primary); }
html .btn.alt:hover { border-color: var(--border-strong); }
/* ══ SKLEP-KARTA-V2 (29.10, właściciel: „e-booki odstają wizualnie od strony głównej"): karta katalogu jak
   e-booki na korepetycjesolve.com - treść od lewej, tytuł 900 granatem, cena duża granatem i przekreślona
   stara obok (po prawej), rabat czerwoną plakietką na okładce zamiast pigułki „Promocja". */
html.sk-kv .sk-card .sk-card-body { text-align: left; align-items: stretch; padding: 16px 16px 6px; gap: 6px; }
html.sk-kv .sk-card .sk-badges { justify-content: flex-start; }
html.sk-kv .sk-card .sk-badge--promo { display: none; }
html.sk-kv .sk-card .sk-card-title { font-size: var(--fs-md); font-weight: var(--fw-heavy); letter-spacing: -0.02em; line-height: 1.25; color: var(--zs-ink); }
html.sk-kv .sk-card .sk-card-foot { gap: 6px; padding-top: 8px; }
html.sk-kv .sk-card .sk-card-foot .sk-price-wrap { justify-content: flex-start; }
html.sk-kv .sk-card .sk-price { font-size: var(--fs-2xl); font-weight: var(--fw-heavy); letter-spacing: -0.03em; color: var(--zs-ink); }
html.sk-kv .sk-card .sk-price--free { color: var(--zs-teal); }
html.sk-kv .sk-card .sk-price-old { order: 2; font-weight: var(--fw-semibold); color: var(--zs-mute); text-decoration-color: currentColor; text-decoration-thickness: 1.5px; }
html.sk-kv .sk-card .sk-card-more { justify-content: flex-start; color: var(--zs-blue); font-weight: var(--fw-black); }
.sk-card-pct { position: absolute; top: 12px; right: 12px; z-index: 1; padding: 5px 11px; border-radius: var(--shape-full); background: var(--zs-pen); color: var(--sk-on-primary); font-size: var(--fs-sm); font-weight: var(--fw-heavy); letter-spacing: -0.01em; transform: rotate(4deg); box-shadow: 0 6px 14px -6px rgba(229, 72, 77, .6); }
/* PANEL-V2-WEJSCIE (29.10): logowanie i powitania jak na stronie.
   - Logowanie: czysta kratka zeszytu z body zamiast poświat w rogach i wygaszanej kratki 48 px;
     odręczny dopisek na żółto nad tytułem w niebieskim panelu (jak pasek nad nagłówkiem strony).
   - `.kv-grad` (imię w „Cześć Anna", „Dzień dobry, Tomek"): zakreślacz pod słowem zamiast niebieskiego
     gradientu w tekście - tak strona wyróżnia słowo w tytule; na niebieskim pasie żółty tekst (5,1:1). */
html .login-wrap { background: transparent; }
html .login-wrap::before { content: none; }
.login-aside-hand { display: block; margin: 14px 0 -6px; color: var(--zs-cyan); font-size: var(--fs-2xl); }   /* KV-STRONA-2: cyjan na scenie (był żółty) */
html .kv-grad { background-image: var(--zs-hl); -webkit-background-clip: border-box; background-clip: border-box;
  -webkit-text-fill-color: currentColor; color: inherit; padding: 0 .08em; margin: 0; }
html .kv-grad--light { background-image: none; color: var(--zs-mark); -webkit-text-fill-color: var(--zs-mark); }
/* PANEL-V2-RODZIC (29.10): „Następna lekcja" jako biała karteczka z taśmą (wyróżniona karta na stronie),
   zamiast niebieskawego gradientu; pasek postępu płaski niebieski (strona nie używa gradientu na paskach). */
html .pz-st-hero { position: relative; background: var(--surface); border: 1.5px solid var(--border); box-shadow: var(--zs-shadow-lift); }
html .pz-st-hero::before { content: ""; position: absolute; left: 50%; top: -13px; width: 110px; height: 28px; transform: translateX(-50%) rotate(-3deg); background: var(--zs-tape); box-shadow: 0 1px 2px rgba(0, 0, 0, .06); pointer-events: none; }
html { --grad: linear-gradient(90deg, var(--primary) 0%, var(--primary) 100%); }

/* LOGOWANIE-EBOOKI (29.10): półka z okładkami e-booków na ekranach logowania - biała karta z wachlarzem
   okładek, odręcznym „nasze e-booki" i klawiszem „Zobacz e-booki". Na komputerze w niebieskim panelu,
   na telefonie pod formularzem (jak kafelek lekcji próbnej). */
.login-shelf { display: grid; gap: 10px; padding: 16px; border-radius: var(--shape-xl); border: 1.5px solid var(--border); background: var(--surface); color: var(--text); text-decoration: none; box-shadow: var(--zs-shadow); transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-std) var(--ease-std); }
.login-shelf:hover { transform: translateY(-2px); box-shadow: var(--zs-shadow-lift); }
.login-shelf:focus-visible { outline: 3px solid var(--primary); outline-offset: 2px; }
.login-shelf-covers { display: flex; justify-content: center; padding: 6px 0 4px; }
.login-shelf-covers img { width: 66px; height: 88px; object-fit: cover; border-radius: var(--shape-xs); box-shadow: 0 10px 18px -10px rgba(20, 27, 78, .55); }
.login-shelf-covers img + img { margin-left: -14px; }
.login-shelf-covers img:nth-child(odd) { transform: rotate(-4deg); }
.login-shelf-covers img:nth-child(even) { transform: rotate(3deg) translateY(4px); }
.login-shelf-txt { display: grid; gap: 2px; text-align: center; }
.login-shelf-hand { font-size: var(--fs-xl); }
.login-shelf-cta { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 42px; border-radius: var(--zs-r-btn); background: var(--zs-blue-soft); color: var(--primary); font-weight: var(--fw-black); }
.login-shelf:hover .login-shelf-cta { background: var(--primary); color: var(--on-primary); }
.login-shelf-cta .material-symbols-outlined { font-size: var(--fs-lg); }
@media (prefers-reduced-motion: reduce) { .login-shelf { transition: none; } .login-shelf:hover { transform: none; } }
.login-aside .login-shelf .login-tile-s { color: var(--text-3); opacity: 1; }
/* PANEL-V2-KOREPETYTOR (29.10): pulpit korepetytora jak karty strony - „nowe potwierdzone rezerwacje"
   jako biała karta z zieloną ikoną (zamiast zielonkawego tła), wiersze rezerwacji i lekcji „Dziś" jako
   białe karteczki z obwódką 1.5 px (zamiast szarych pasków); lekcja dalej ma kolorową listwę po lewej
   (niebieska = do zrobienia, zielona = zrobiona). Banery ostrzeżeń: obwódka 1.5 px i promień kart. */
html .pz-card-ok-outline { background: var(--surface); border: 1.5px solid var(--border); }
html .pz-card-ok-outline > .pz-chip-row-lg .material-symbols-outlined { color: var(--c-ok); }
html :is(.pz-row-box-sm, .pz-db-lesson-row) { background: var(--surface); border: 1.5px solid var(--border); border-radius: var(--zs-r-btn); }
html .pz-db-lesson-row { border-left: 4px solid var(--primary); }
html .pz-db-lesson-row--done { border-left-color: var(--c-ok); }
html :is(.pz-banner-warn, .pz-banner-warn-row) { border: 1.5px solid color-mix(in srgb, var(--c-warn) 35%, var(--border)); border-radius: var(--shape-xl); }
html :is(.pz-st-progress-bar, .pz-db-progress-bar, .pz-task-progress-3, .pz-task-progress-4, .progress-bar.ok) { background: var(--primary); }
/* SKLEP-PRODUKT-PRZYCISKI (29.10, właściciel: „Kup teraz, pod spodem Dodaj do koszyka"): przyciski zakupu
   jeden pod drugim na całą szerokość karty także na komputerze (wcześniej od 900 px obok siebie). */
html.sk-kv .sk-cta-main { display: grid; grid-template-columns: minmax(0, 1fr); gap: 10px; }
html.sk-kv .sk-cta-main > :is(.btn, form) { width: 100%; }
html.sk-kv .sk-cta-main .btn { justify-content: center; }
html.sk-kv .sk-cta-main > .pb-inline-link { justify-self: center; }
/* SKLEP-DORZUC (29.10): „Inni dorzucają też" w formularzu zakupu - białe karteczki z polem do zaznaczenia,
   miniaturą, krótkim opisem i ceną „Dorzuć za" (zieleń oszczędności), zaznaczona z niebieską obwódką. */
.sk-bumps { display: grid; gap: 10px; margin: 6px 0 18px; padding: 0; border: 0; min-width: 0; }
.sk-bumps-h { padding: 0 0 4px; color: var(--zs-mute); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .12em; text-transform: uppercase; }
.sk-bump { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-btn); background: var(--sk-card); cursor: pointer; transition: border-color var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std); }
.sk-bump:hover { border-color: var(--zs-line-strong); }
.sk-bump:has(input:checked) { border-color: var(--zs-blue); box-shadow: 0 0 0 3px var(--zs-blue-soft); }
.sk-bump input { flex: none; width: 22px; height: 22px; margin: 0; accent-color: var(--zs-blue); }
.sk-bump-cover { flex: none; width: 48px; height: 64px; object-fit: cover; border-radius: var(--shape-xs); box-shadow: 0 6px 12px -8px rgba(20, 27, 78, .5); }
.sk-bump-body { display: grid; gap: 2px; min-width: 0; }
.sk-bump-title { color: var(--zs-ink); font-weight: var(--fw-heavy); line-height: 1.3; }
.sk-bump-sub { color: var(--zs-mute); font-size: var(--fs-sm); line-height: var(--lh-base); }
.sk-bump-price { color: var(--zs-mute); font-size: var(--fs-sm); }
.sk-bump-price strong { color: var(--sk-success); font-size: var(--fs-md); font-weight: var(--fw-heavy); }
/* SKLEP-PASEK-ZAPLATY (29.10): pasek „Do zapłaty" przyklejony do dołu strony e-booka. Pływający koszyk
   chowamy (pasek go zastępuje, „Koszyk" jest w nagłówku), asystent podnosi się nad pasek (widget.js). */
.sk-paybar { position: fixed; left: 0; right: 0; bottom: 0; z-index: var(--z-topbar); background: var(--sk-card); border-top: 1.5px solid var(--zs-line); box-shadow: 0 -12px 30px -18px rgba(20, 27, 78, .35); padding-bottom: env(safe-area-inset-bottom); }
.sk-paybar-in { display: flex; align-items: center; gap: 10px 18px; max-width: 1200px; margin: 0 auto; padding: 10px 16px; }
.sk-paybar-sum { display: flex; align-items: baseline; gap: 8px; margin: 0; color: var(--zs-mute); font-size: var(--fs-sm); }
.sk-paybar-sum strong { color: var(--zs-ink); font-size: var(--fs-xl); font-weight: var(--fw-heavy); letter-spacing: -0.02em; white-space: nowrap; }
.sk-paybar-safe { display: none; align-items: center; gap: 4px; margin: 0 0 0 auto; color: var(--zs-mute); font-size: var(--fs-xs); }
.sk-paybar-safe .material-symbols-outlined { color: var(--sk-success); font-size: var(--fs-lg); }
.sk-paybar-btn { margin-left: auto; min-height: 46px; padding: 0 22px; white-space: nowrap; }
html.sk-has-paybar .sk-fcart { display: none; }
/* W-E17 (05.11): przycisk zakupu w treści jest na ekranie - pasek zjeżdża w dół (pages/sklep.js) */
.sk-paybar { transition: transform var(--motion-std) var(--ease-std), visibility var(--motion-std); }
html.sk-paybar-off .sk-paybar { transform: translateY(110%); visibility: hidden; }
@media (prefers-reduced-motion: reduce) { .sk-paybar { transition: none; } }
html.sk-has-paybar body { padding-bottom: 76px; }
@media (min-width: 600px) {
  .sk-paybar-in { padding: 12px 24px; }
  .sk-paybar-safe { display: inline-flex; }
  .sk-paybar-btn { margin-left: 0; min-width: 220px; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) { .sk-bump { transition: none; } }
/* PROBNA-HERO-ODDECH (29.10, właściciel: „mało miejsca między 1-2-3-4, Wszyscy korepetytorzy a twarzą
   korepetytora"): w ramce hero krok 3 dostaje oddech - kroki, powrót i wizytówka w równych odstępach. */
html.pb-heroframe.pb-embedded .pb-steps { padding-bottom: 12px; }
html.pb-heroframe.pb-embedded .pb-back { margin: 2px 0 14px; }
html.pb-heroframe.pb-embedded .pb-tutor { gap: 12px; padding: 0 0 14px 3px; }
html.pb-heroframe.pb-embedded .pb-avatar--lg { width: 44px; height: 44px; }
/* SKLEP-KARTA-ZWARTA (29.10, właściciel: „strasznie dużo spacingu, jak jest jakaś promocja"): karty w rzędzie mają
   równą wysokość, więc wyższa karta z promocją rozpychała sąsiadów. „Polecany" stoi na okładce (jak „-14%"),
   a dopisek o najniższej cenie z 30 dni (Omnibus - zostaje widoczny) jest drobny, od lewej i bez zapasu. */
html.sk-kv .sk-card { position: relative; }
html.sk-kv .sk-card .sk-badge--featured { position: absolute; top: 12px; left: 12px; z-index: 1; box-shadow: 0 6px 14px -8px rgba(20, 27, 78, .45); }
html.sk-kv .sk-card .sk-card-lowest { display: block; margin: -2px 0 0; text-align: left; font-size: var(--fs-2xs); line-height: var(--lh-tight); color: var(--zs-mute); }
html.sk-kv .sk-card .sk-card-lowest:empty { display: none; }
html.sk-kv .sk-card .sk-card-lowest .sk-lowest { font-size: inherit; line-height: inherit; text-align: left; }
/* SKLEP-PANEL-GRUPY (29.10): przełącznik grup nad listą produktów w panelu sklepu. */
.sk-adm-grp { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 12px; }
.sk-adm-grp[hidden] { display: none; }
/* SKLEP-ZESTAW-ZWIN (29.10): składniki zestawu - 3 na wierzchu, reszta pod „Sprawdź wszystkie pozycje zestawu". */
.sk-bundle-more { margin: 2px 0 10px; }
.sk-bundle-more > summary { display: inline-flex; align-items: center; gap: 4px; min-height: 40px; padding: 0 14px; border-radius: var(--zs-r-btn); background: var(--sk-card); color: var(--zs-blue); font-weight: var(--fw-heavy); cursor: pointer; list-style: none; box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); }
.sk-bundle-more > summary::-webkit-details-marker { display: none; }
.sk-bundle-more > summary:hover { background: var(--zs-blue-soft); }
.sk-bundle-more > summary .material-symbols-outlined { transition: transform var(--motion-fast) var(--ease-std); }
.sk-bundle-more[open] > summary .material-symbols-outlined { transform: rotate(180deg); }
.sk-bundle-more:not([open]) .sk-bundle-more-close, .sk-bundle-more[open] .sk-bundle-more-open { display: none; }
.sk-bundle-more > .sk-bundle-list { margin-top: 10px; }
@media (prefers-reduced-motion: reduce) { .sk-bundle-more > summary .material-symbols-outlined { transition: none; } }
/* SKLEP-RZEDY-WYROZNIENIE (29.10): tytuł rzędu jak nagłówek sekcji strony - 900, większy, z kafelkiem ikony
   w kolorze poziomu (morski: podstawówka, turkus: średnia, niebieski: matura PP, fiolet: matura PR). */
.sk-rail-title { gap: 12px; color: var(--zs-ink); font-size: var(--fs-2xl); font-weight: var(--fw-heavy); letter-spacing: -0.03em; }
.sk-rail-ico { flex: none; display: grid; place-items: center; width: 40px; height: 40px; border-radius: var(--shape-md); background: var(--zs-blue); color: var(--sk-on-primary); font-size: var(--fs-xl); box-shadow: 0 8px 16px -10px rgba(20, 27, 78, .6); }
.sk-rail-ico--podst { background: var(--zs-teal); }
.sk-rail-ico--srednia { background: var(--sk-accent-ink); }
.sk-rail-ico--matura-rozsz { background: var(--zs-violet); }
.sk-rail-ico--darmowe { background: var(--sk-success); }
.sk-rail-title .sk-fcount { font-size: var(--fs-sm); }
.sk-rail-head { margin-bottom: 12px; }
/* SKLEP-PODPIS-CALY (29.10, właściciel: „podpisy są ucięte - skrócę je do jednego zdania, żeby zawsze się
   wyświetlały"): podpis karty w całości, także na telefonie (bez ucinania do 2 wierszy). */
html.sk-kv .sk-card .sk-card-sub { display: block; -webkit-line-clamp: unset; overflow: visible; }
/* PANEL-V2-ADMIN (29.10, „jedziesz" - panel admina w motywie strony): pulpit admina bez szkła i poświat.
   Kafelki „Dziś", kafelki okresu i karty sekcji jako czyste białe karty z obwódką 1.5 px i cieniem kart
   strony (jak karty „Na jakim etapie jesteś?"); bez kolorowej listwy u góry i niebieskiej plamy w rogu,
   bez obrotu 3D przy najechaniu. Alarm zostaje czerwony (liczba, ikona i listwa u góry). Fakty: białe
   karteczki zamiast szarych pasków z listwą. Oba motywy (PANEL-V2-CIEMNY). */
html :is(.pu-mini, .pu-kpis .pu-kpi, .pu-card) { background: var(--surface); border: 1.5px solid var(--border); border-radius: var(--shape-xl); box-shadow: var(--zs-shadow); }
html :is(.pu-mini, .pu-kpis .pu-kpi, .pu-card)::after { content: none; }
html :is(.pu-mini, .pu-kpis .pu-kpi, .pu-card):not(.is-alert)::before { content: none; }
html :is(.pu-mini, .pu-kpis a.pu-kpi):hover { transform: translateY(-2px); border-color: var(--border-strong); box-shadow: var(--zs-shadow-lift); }
html .pu-mini.is-alert::before { height: 4px; }
html .pu-fact { background: var(--surface); border: 1.5px solid var(--border); border-radius: var(--zs-r-btn); }
html a.pu-fact--link:hover { background: var(--zs-blue-soft); border-color: var(--border-strong); }
html .pu-ring-val { filter: none; }
@media (prefers-reduced-motion: reduce) { html :is(.pu-mini, .pu-kpis a.pu-kpi):hover { transform: none; } }
html .pu-bar-fill { box-shadow: none; }
html .pu-bar-fill--cyan { background: var(--primary); }
html .pu-alert { background: var(--surface); border: 1.5px solid var(--border); border-radius: var(--zs-r-btn); }
html .pu-alert { border-left: 4px solid var(--primary); }
html .pu-alert--warn { border-left-color: var(--warning); }
html .pu-alert--error { border-left-color: var(--danger); }
/* „Mój dzień": karty leadów z obwódką 1.5 px i promieniem kart (kolorowa listwa po lewej zostaje). */
html .daily-card { border-width: 1.5px; border-color: var(--border); border-radius: var(--shape-lg); box-shadow: var(--zs-shadow); }
html .daily-card:hover { border-color: var(--border-strong); box-shadow: var(--zs-shadow-lift); }
html :is(.daily-card--reminder, .daily-card--stale, .daily-card--rating) { border-left-width: 4px; }
html .daily-card--reminder { border-left-color: var(--c-prog); }
html .daily-card--stale { border-left-color: var(--c-rej); }
html .daily-card--rating { border-left-color: var(--c-star); }
/* ══ PANEL-V2-CIEMNY (29.10, właściciel: „przenosimy na motyw"): ciemny motyw jak granatowe sekcje strony
   (stopka, „Jak zaczynamy") - granat (tokeny --brand-navy-*) w cyjanową kratkę, te same kształty co jasny
   (bloki PANEL-V2 wyżej działają w obu). Tu tylko to, co w ciemnym musi wyglądać inaczej: kratka cyjanowa,
   cień „klawisza" z ciemniejszego niebieskiego akcji, imię w powitaniu żółtym tekstem (zakreślacz pod białym
   tekstem byłby nieczytelny), ciemniejszy cień kart. */
html.dark:not(.pb-kv) body { background-image: linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px); }
/* cień klawisza i kart w ciemnym - tokeny w tokens.css (html.dark, PANEL-V2-CIEMNY) */
html.dark .btn.accent { color: var(--on-primary); }
html.dark .kv-grad { background-image: none; color: var(--zs-mark); -webkit-text-fill-color: var(--zs-mark); }
html.dark .sidebar { border-right: 1.5px solid var(--border); }
/* Ciemny: --on-primary to granat (tekst na jasnoniebieskim przycisku), ale kafelki i pasy w kolorach marki
   (niebieski w kratkę, morski, fiolet) mają białą treść jak na stronie. */
html.dark :is(.login-aside, .login-tiles-h, .login-aside .login-tile, .login-aside .login-tile-go, .login-tile-ico, .kpi-ico, .pz-start-ico, .asys-avatar, .asys-empty-ico, .pb-step.is-current .pb-step-num, .pb-step.is-done .pb-step-num) { color: var(--sk-on-primary); }
html.dark .login-aside .login-tile-s { color: var(--sk-on-primary); }
html.dark .login-shelf-cta { background: var(--primary-container); color: var(--on-primary-container); }
html.dark .login-shelf:hover .login-shelf-cta { background: var(--primary); color: var(--on-primary); }
html.dark .login-shelf-hand { color: var(--primary); }
/* SKLEP-KARTA-TELEFON (29.10, właściciel: „na mobile słabo to wygląda - podtytuł się wylewa, dużo przestrzeni,
   może wyśrodkować teksty"): na telefonie zwarta karta - treść wyśrodkowana, długie słowa łamane z dzieleniem
   (lang="pl"), mniejsze czcionki i odstępy, cena i przycisk bliżej treści. Tytuł rzędu w jednej linii. */
html.sk-kv .sk-card :is(.sk-card-title, .sk-card-sub) { overflow-wrap: anywhere; -webkit-hyphens: auto; hyphens: auto; }
/* Mobile-first (tests/test_responsive_etap4.py): wartości telefonu domyślnie, od 600 px powrót do karty z 12315+. */
html.sk-kv .sk-card .sk-card-body { padding: 10px 10px 2px; gap: 4px; text-align: center; align-items: center; }
html.sk-kv .sk-card .sk-badges { justify-content: center; }
html.sk-kv .sk-card .sk-badge--level { font-size: var(--fs-2xs); }
html.sk-kv .sk-card .sk-card-sub { line-height: 1.35; color: var(--zs-mute); }
html.sk-kv .sk-card .sk-card-foot { gap: 2px; padding-top: 6px; }
html.sk-kv .sk-card .sk-card-foot .sk-price-wrap { justify-content: center; }
html.sk-kv .sk-card .sk-price { font-size: var(--fs-xl); }
html.sk-kv .sk-card .sk-price-old { font-size: var(--fs-xs); }
html.sk-kv .sk-card .sk-card-lowest, html.sk-kv .sk-card .sk-card-lowest .sk-lowest { text-align: center; }
html.sk-kv .sk-card .sk-card-cart { padding: 0 8px 10px; }
html.sk-kv .sk-card .sk-card-cart .btn { min-height: 38px; padding: 0 8px; gap: 4px; font-size: var(--fs-sm); }
html.sk-kv .sk-card .sk-card-cart .btn .material-symbols-outlined { font-size: var(--fs-lg); }
html.sk-kv .sk-card .sk-card-pct { top: 8px; right: 8px; padding: 3px 8px; font-size: var(--fs-xs); }
html.sk-kv .sk-card .sk-badge--featured { top: 8px; left: 8px; }
.sk-rail-track { gap: 10px; }
.sk-rail-track > .sk-card { flex-basis: clamp(148px, 44%, 190px); }
.sk-rail-title { gap: 8px; font-size: var(--fs-xl); }
.sk-rail-ico { width: 32px; height: 32px; font-size: var(--fs-lg); }
.sk-rail-head { gap: 8px; }
.sk-rail-all { font-size: var(--fs-xs); }
@media (min-width: 600px) {
  html.sk-kv .sk-card .sk-card-body { padding: 16px 16px 6px; gap: 6px; text-align: left; align-items: stretch; }
  html.sk-kv .sk-card .sk-badges { justify-content: flex-start; }
  html.sk-kv .sk-card .sk-badge--level { font-size: var(--fs-xs); }
  html.sk-kv .sk-card .sk-card-sub { line-height: var(--lh-base); color: var(--sk-ink-muted); }
  html.sk-kv .sk-card .sk-card-foot { gap: 6px; padding-top: 8px; }
  html.sk-kv .sk-card .sk-card-foot .sk-price-wrap { justify-content: flex-start; }
  html.sk-kv .sk-card .sk-price { font-size: var(--fs-2xl); }
  html.sk-kv .sk-card .sk-price-old { font-size: var(--fs-sm); }
  html.sk-kv .sk-card .sk-card-lowest, html.sk-kv .sk-card .sk-card-lowest .sk-lowest { text-align: left; }
  html.sk-kv .sk-card .sk-card-cart { padding: 0 20px 20px; }
  html.sk-kv .sk-card .sk-card-cart .btn { min-height: 44px; padding: 0 16px; gap: 8px; font-size: var(--fs-base); }
  html.sk-kv .sk-card .sk-card-cart .btn .material-symbols-outlined { font-size: var(--fs-xl); }
  html.sk-kv .sk-card .sk-card-pct { top: 12px; right: 12px; padding: 5px 11px; font-size: var(--fs-sm); }
  html.sk-kv .sk-card .sk-badge--featured { top: 12px; left: 12px; }
  .sk-rail-track { gap: 14px; }
  .sk-rail-track > .sk-card { flex-basis: 230px; }
  .sk-rail-title { gap: 12px; font-size: var(--fs-2xl); }
  .sk-rail-ico { width: 40px; height: 40px; font-size: var(--fs-xl); }
  .sk-rail-head { gap: 12px; }
  .sk-rail-all { font-size: var(--fs-sm); }
}
/* CENNIK-V2 (29.10, właściciel: „w cenniku też bym to ogarnął, bo wizualnie odbiega”, „szczególnie Co zawiera
   pakiet”, „możesz się wzorować na układzie od Pauliny”): nagłówek od lewej jak sekcje strony (odręczny nadtytuł,
   dopisek czerwonym długopisem), kroki jak „Jak zaczynamy” (kółka z numerem i przerywana linia). Pakiety zostają
   wierszami w poziomie (właściciel 29.10: „chcę mieć w poziomie te pakiety, tak jak było” - karty w kolumnach
   odrzucone). Lista „co zawiera” bez jasnoniebieskiego pudełka - czerwone ptaszki jak listy przy korepetytorach. */
html.sk-kv .sk-cn-head { display: grid; grid-template-areas: "e" "t" "s" "h"; max-width: none; margin: 0 0 clamp(26px, 3.4vw, 36px); text-align: left; }
html.sk-kv .sk-cn-head .sk-eyebrow { grid-area: e; display: block; width: max-content; max-width: 100%; margin: 0 0 8px; color: var(--zs-blue);
  font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-2xl); font-weight: var(--fw-bold); letter-spacing: 0; text-transform: none; line-height: 1; transform: rotate(-2deg); transform-origin: left center; }
html.sk-kv .sk-cn-head .sk-eyebrow::before, html.sk-kv .sk-cn-head .sk-eyebrow::after { display: none; }
html.sk-kv .sk-cn-head .sk-cn-title { grid-area: t; max-width: 820px; margin: 0 0 14px; }
html.sk-kv .sk-cn-head .sk-cn-sub { grid-area: s; max-width: 660px; margin: 0; }
html.sk-kv .sk-cn-head .sk-cn-hand { grid-area: h; margin: 12px 0 0; color: var(--zs-pen); transform: rotate(-3deg); transform-origin: left center; }
html.sk-kv .sk-cn > .sk-hero-ai--light { max-width: none; margin: 0 0 clamp(26px, 3.4vw, 36px); text-align: left; }
html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-q { justify-content: flex-start; text-align: left; }
html.sk-kv .sk-cn-controls { justify-content: flex-start; }
html.sk-kv .sk-cn-ctl { align-items: flex-start; }
/* kroki */
html.sk-kv .sk-cn-steps { gap: 18px; max-width: none; margin: 0 0 clamp(34px, 4.6vw, 52px); }
html.sk-kv .sk-cn-steps .sk-cn-step { display: grid; grid-template-columns: 44px minmax(0, 1fr); gap: 0 14px; padding: 0; text-align: left;
  background: none; border: 0; border-radius: 0; box-shadow: none; }
html.sk-kv .sk-cn-steps .sk-cn-step:not(:last-child)::before { content: ""; position: absolute; left: 21px; top: 52px; bottom: -12px; border-left: 2px dashed var(--zs-line-strong); }
html.sk-kv .sk-cn-steps .sk-cn-step:nth-child(n) .sk-cn-step-n { display: flex; width: 44px; height: 44px; min-width: 0; border-radius: 50%; border: 2px solid var(--zs-blue);
  background: var(--sk-card); color: var(--zs-blue); font-family: inherit; font-size: var(--fs-lg); font-weight: var(--fw-black); transform: none; box-shadow: none; }
html.sk-kv .sk-cn-steps .sk-cn-step:first-child .sk-cn-step-n { border-color: var(--zs-teal); background: var(--zs-teal); color: var(--sk-on-primary); }
html.sk-kv .sk-cn-steps .sk-cn-step-h { margin: 10px 0 0; }
html.sk-kv .sk-cn-step-note { display: block; width: max-content; max-width: 100%; margin: 2px 0 6px; font-size: var(--fs-xl); transform: rotate(-1.5deg); transform-origin: left center; }
html.sk-kv .sk-cn-steps .sk-cn-step:first-child .sk-cn-step-note { color: var(--zs-teal); }
/* „Co zawiera pakiet” (sklep i „Dokup lekcje” rodzica) */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gets { gap: 8px 22px; margin: 10px 0 0; padding: 14px 2px 2px; border: 0; border-top: 1.5px dashed var(--zs-line); border-radius: 0; background: none; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gets li { padding-left: 26px; color: var(--zs-ink); font-weight: var(--fw-semibold); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gets li::before { content: "check"; left: 0; top: 0; width: auto; height: auto; border-radius: 0; background: none;
  font-family: "Material Symbols Rounded"; font-size: var(--fs-xl); font-weight: normal; line-height: 1.1; color: var(--zs-pen); font-feature-settings: "liga"; -webkit-font-smoothing: antialiased; }
@media (min-width: 900px) {
  html.sk-kv .sk-cn-head { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "e e" "t t" "s h"; column-gap: 32px; align-items: end; }
  html.sk-kv .sk-cn-head .sk-cn-hand { margin: 0 12px 4px 0; }
  html.sk-kv .sk-cn > .sk-hero-ai--light { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 18px; }
  html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-q { margin: 0; }
  html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-opts { justify-content: flex-start; }
  html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-free { margin: 0; }
  html.sk-kv .sk-cn-steps { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; }
  html.sk-kv .sk-cn-steps .sk-cn-step { grid-template-columns: minmax(0, 1fr); align-content: start; }   /* CENNIK-KROKI-ROWNO (06.11): tytuły w jednej linii, nie wyśrodkowane w różnej wysokości */
  html.sk-kv .sk-cn-steps .sk-cn-step:not(:last-child)::before { left: 58px; right: -14px; top: 21px; bottom: auto; border-left: 0; border-top: 2px dashed var(--zs-line-strong); }
  html.sk-kv .sk-cn-steps .sk-cn-step-h { margin: 14px 0 0; }
}
/* PROBNA-HERO-KV (29.10, właściciel: „to też przy umawianiu imo odstaje KV” - zrzut z ramki w hero strony głównej):
   w ramce hero przyciski jak na stronie (niebieski klawisz z cieniem, promień 14 px zamiast płaskiej pigułki),
   wyróżniki korepetytora w białych pigułkach z obwódką i turkusowym ptaszkiem (jak w pełnej rezerwacji). */
html.pb-heroframe.pb-embedded .pb-body .btn.accent { border-radius: var(--zs-r-btn); box-shadow: var(--zs-key); font-weight: var(--fw-black); }
html.pb-heroframe.pb-embedded .pb-body .btn.accent:active { transform: translateY(2px); box-shadow: var(--zs-key-down); }
html.pb-heroframe.pb-embedded .pb-body .btn.tonal { border-radius: var(--zs-r-btn); box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); }
html.pb-heroframe.pb-embedded .pb-action { padding-bottom: 6px; }
html.pb-heroframe.pb-embedded .pb-card--big { border-radius: var(--zs-r-card); }
html.pb-heroframe .pb-tag { background: var(--sk-card); color: var(--zs-ink); box-shadow: inset 0 0 0 1.5px var(--zs-line); font-weight: var(--fw-bold); }
html.pb-heroframe .pb-tag .material-symbols-outlined { color: var(--zs-teal); }
/* Pełna rezerwacja na telefonie: „najbliższy termin: sobota 31 października, 09:00” łamie się jak zwykły tekst
   (wcześniej etykieta i data ściskały się w dwie wąskie kolumny), zakreślacz idzie za tekstem. */
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next { display: block; max-width: 100%; border-radius: var(--shape-md); line-height: var(--lh-base); }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next .material-symbols-outlined { display: inline-block; margin-right: 4px; vertical-align: -5px; }
html.pb-kv:not(.pb-heroframe) .pb-card--big .pb-next strong { -webkit-box-decoration-break: clone; box-decoration-break: clone; }
/* SKLEP-POLECANE-RZAD (29.10): „Polecamy na start” i „Najchętniej kupowane” jako jeden przewijany rząd (jak rzędy
   poziomów), a nie siatka, która przy wąskim oknie łamała się na kolejne wiersze. */
.sk-rail--block { margin: 0; }
/* ANALITYKA-PRZYCISKI (01.11): przyciski strony rozwijane pod tabelą „Przyciski i wyjścia”. */
.an-btns { display: grid; gap: 6px; padding: 8px 10px 0; }
.an-btns-page { border: 1px solid var(--border); border-radius: var(--shape-md); padding: 8px 10px; }
.an-btns-page > summary { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; cursor: pointer; font-weight: var(--fw-semibold); }
.an-btns-page > p { margin: 8px 0 4px; }
.an-btns-page .pz-scroll-x { margin-top: 6px; }
/* ANALITYKA-NA-ZYWO (01.11): pulsująca kropka przy „Na żywo” i plakietki postępu wizyty. */
.an-live-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; background: var(--success); box-shadow: 0 0 0 0 var(--success); animation: an-live 1.6s ease-out infinite; }
@keyframes an-live { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--success) 55%, transparent); } 100% { box-shadow: 0 0 0 8px transparent; } }
@media (prefers-reduced-motion: reduce) { .an-live-dot { animation: none; } }
.an-live-steps { display: flex; flex-wrap: wrap; gap: 4px; }

/* CELE-DOTYKOWE-2026-11 (02.11): skan mobile w CI (a11y/mobile_scan.py) - minimum 44x44 px
   dla linków dodanych przy PANEL-V2, SKLEP-NAGLOWEK-GLOWNA, PROBNA-HERO-KV i planie kampanii.
   Ujemny margines pionowy: większe pole dotyku bez rozpychania wiersza. */
.pu-more { display: inline-flex; align-items: center; justify-content: flex-end; min-width: 44px; min-height: 44px; margin-block: -14px; padding-left: 12px; }
html.pb-kv .pb-top-nav a.pb-top-login { min-height: 44px; }
.ap-plan-links a { display: inline-flex; align-items: center; min-width: 44px; min-height: 44px; }
summary.pz-pointer { padding-block: 12px; }

/* SKLEP-KARTA-KONWERSJA (02.11, analityka: 38 osób obejrzało zbiór, nikt nie zaczął płatności):
   darmowa próbka tuż pod ceną, obietnica przed liczbami, liczby z krótkiego opisu pod przyciskiem zakupu. */
.sk-sample-top { margin: 0 0 12px; }
.sk-promise { margin: 0 0 12px; max-width: 620px; color: var(--text); font-size: var(--fs-lg); font-weight: var(--fw-heavy); line-height: var(--lh-base); }
html.sk-kv .sk-buybox .sk-short.sk-short--after { margin: 12px 0 0; font-size: var(--fs-sm); }
/* SKLEP-FORM-DARMOWY: formularz bez kart kroków; zgody jako zwykłe pola wyboru, bez niebieskich ramek
   (trzy zaznaczone ramki wyglądały jak trzy przyciski i przykrywały „Wyślij mi link”). */
.sk-of-plain { min-width: 0; margin: 0; padding: 0; border: 0; }
.sk-consents { display: grid; gap: 2px; }
html:is(.pb-kv, .sk-kv) body.pb-body .sk-of .pz-consent-check,
html:is(.pb-kv, .sk-kv) body.pb-body .sk-of .pz-consent-check:has(input:checked) { min-height: 44px; margin-top: 0; padding: 8px 0; border: 0; border-radius: 0; background: none; color: var(--text-2); font-size: var(--fs-sm); }

html:is(.pb-kv, .sk-kv) .sk-of.sk-of--simple { padding: 0; border: 0; background: none; box-shadow: none; }
/* SKLEP-RAMKA-W-RAMCE (05.11, właściciel: „jak wybieram pakiet to mam ramkę w ramce i się trochę ciasno robi"):
   zakup pakietu i koszyk miały trzy karty jedna w drugiej (panel zamówienia > formularz > krok). Zostają tylko karty
   kroków na tle strony - panel i formularz bez obwódki, tła i wewnętrznego odstępu. */
html:is(.pb-kv, .sk-kv) .pb-panel.sk-buy--kroki,
html:is(.pb-kv, .sk-kv) .sk-buy--kroki > .sk-of { padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; }

/* SKLEP-NAGLOWEK-WWW (04.11, prośba właściciela: „header sklepu taki sam jak na głównej, smooth przepięcia"):
   nagłówek sklepu = #sp-hdr strony WWW (WordPress, motyw solve-v3). Wartości odczytane w przeglądarce
   z korepetycjesolve.com 04.11 (getComputedStyle, 1366 i 390 px). Pasek i nagłówek przyklejone razem,
   jak #sp-top. Od telefonu w górę: hamburger z szufladą, od 600 px WhatsApp w pasku, od 1100 px menu
   strony w nagłówku (jak na WWW) - odstępy w menu rosną płynnie z szerokością (clamp), bo od sklepu
   dochodzi koszyk. Na telefonie cele dotykowe 44 px (CELE-DOTYKOWE-STRAZ), na komputerze 40 jak na WWW. */
.sk-top { position: sticky; top: 0; z-index: var(--z-sticky); }
.zh { position: relative; background: var(--sk-card); border-bottom: 1px solid var(--zs-line); -webkit-font-smoothing: antialiased; }
.zh *, .zh *::before, .zh *::after { box-sizing: border-box; }
.zh a { text-decoration: none; }
.zh a:focus-visible, .zh button:focus-visible { outline: 2px solid var(--zs-blue); outline-offset: 2px; }
.zh-bar { display: flex; align-items: center; justify-content: space-between; gap: 4px; max-width: 1192px; min-height: 60px; margin: 0 auto; padding: 8px 14px; }
.zh-brand { display: flex; align-items: center; gap: 10px; flex: 0 1 auto; min-width: 44px; min-height: 44px; }
.zh-logo { display: flex; align-items: center; justify-content: center; flex: none; width: 40px; height: 40px; padding: 4px; border-radius: 13px; background: var(--sk-card); box-shadow: 0 8px 18px -8px rgba(0, 0, 0, .5); }
.zh-logo img { display: block; width: 32px; height: 32px; object-fit: contain; }
.zh-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--zs-blue); font-size: var(--fs-xl); font-weight: var(--fw-heavy); letter-spacing: -.02em; text-transform: uppercase; }
.zh-name--long { display: none; }
@media (min-width: 600px) { .zh-name--long { display: inline; } }
.zh-nav { display: none; align-items: center; gap: clamp(0px, calc((100vw - 1100px) / 60), 4px); }
.zh .zh-nav a { display: block; padding: 9px clamp(8px, calc(8px + (100vw - 1100px) / 40), 14px); border-radius: var(--shape-full); color: var(--zs-nav); font-size: var(--fs-md); font-weight: var(--fw-bold); white-space: nowrap; transition: background .18s, color .18s; }
.zh .zh-nav a:hover { color: var(--zs-blue); }
.zh .zh-nav a.is-current { background-image: var(--zs-hl); color: var(--zs-ink); }
.zh-ctas { display: flex; align-items: center; gap: 4px; flex: none; }
.zh a.zh-login { display: none; align-items: center; min-height: 40px; padding: 0 16px; border: 1px solid var(--zs-line); border-radius: var(--shape-full); background: var(--sk-card); color: var(--zs-blue); font-size: var(--fs-md); font-weight: var(--fw-bold); white-space: nowrap; transition: background .18s; }
.zh a.zh-login:hover { background: var(--zs-blue-soft); }
.zh a.zh-cta { display: flex; align-items: center; gap: 4px; min-height: 44px; padding: 0 12px; border-radius: 13px; background: var(--zs-blue); color: var(--sk-on-primary); font-size: var(--fs-md); font-weight: var(--fw-black); white-space: nowrap; box-shadow: 0 3px 0 var(--zs-blue-press); transition: transform .2s, box-shadow .2s; }
.zh a.zh-cta:hover { transform: translateY(-1px); color: var(--sk-on-primary); }
.zh a.zh-cta:active { transform: translateY(2px); box-shadow: 0 1px 0 var(--zs-blue-press); }
.zh-cta svg { display: block; flex: none; transition: transform .2s; }
.zh a.zh-cta:hover svg { transform: translateX(2px); }
.zh-cta-full { display: none; }
.zh a.zh-wa { display: none; align-items: center; justify-content: center; flex: none; width: 44px; height: 44px; border-radius: var(--shape-full); background: var(--zs-wa); color: var(--sk-on-primary); transition: transform .2s; }
.zh a.zh-wa:hover { transform: translateY(-1px); }
.zh-wa svg { width: 19px; height: 19px; }
.zh a.zh-cart { position: relative; display: flex; align-items: center; justify-content: center; flex: none; width: 44px; height: 44px; border: 1px solid var(--zs-line); border-radius: 13px; background: var(--sk-card); color: var(--zs-ink); transition: background .18s; }
.zh a.zh-cart:hover { background: var(--zs-blue-soft); color: var(--zs-blue); }
.zh-cart .material-symbols-outlined { font-size: var(--fs-2xl); color: var(--zs-blue); }
.zh-cart-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
.zh-badge { position: absolute; top: -6px; right: -6px; display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: var(--shape-full); background: var(--zs-mark); color: var(--zs-ink); font-size: var(--fs-xs); font-weight: var(--fw-black); }
.zh-burger { display: flex; align-items: center; justify-content: center; flex: none; width: 44px; height: 44px; padding: 0; border: 1px solid var(--zs-line); border-radius: 13px; background: var(--sk-card); color: var(--zs-ink); cursor: pointer; }
.zh-burger-icon { display: flex; flex-direction: column; gap: 4px; width: 18px; }
.zh-burger-icon span { display: block; width: 18px; height: 2px; border-radius: 2px; background: currentColor; transition: transform .2s, opacity .2s; }
.zh.is-open .zh-burger-icon span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.zh.is-open .zh-burger-icon span:nth-child(2) { opacity: 0; }
.zh.is-open .zh-burger-icon span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }
/* Szuflada jak .sp-hdr__drawer: papier w kratkę pod nagłówkiem, wysokość do dołu ekranu (zs-header.js). */
.zh-drawer { position: absolute; left: 0; right: 0; top: 100%; max-height: 0; overflow: hidden; visibility: hidden; background-color: var(--zs-paper); background-image: linear-gradient(var(--zs-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-grid) 1px, transparent 1px); background-size: 28px 28px; box-shadow: 0 30px 50px -20px rgba(4, 22, 50, .8); transition: max-height .35s, visibility 0s linear .35s; }
.zh.is-open .zh-drawer { max-height: 85vh; visibility: visible; transition: max-height .35s; }
.zh-drawer-inner { display: grid; max-height: inherit; overflow-y: auto; padding: 6px 18px 18px; overscroll-behavior: contain; }
.zh .zh-drawer-inner > a { display: flex; align-items: center; gap: 14px; min-height: 44px; padding: 5px 2px; border-bottom: 1px dashed color-mix(in srgb, var(--zs-blue) 16%, transparent); color: var(--zs-ink); font-size: var(--fs-lg); font-weight: var(--fw-black); letter-spacing: -.01em; line-height: 1.3; }
.zh-drawer-inner > a > svg { flex: none; width: 32px; height: 32px; padding: 8px; border-radius: var(--shape-md); color: var(--zs-hdr-ico); box-shadow: inset 0 0 0 1px var(--zs-line); }
.zh .zh-drawer-inner > a.is-current > svg { background: var(--sk-card); color: var(--zs-hdr-ico-cur); }
.zh .zh-drawer-inner > a.is-current::after { content: ""; width: 8px; height: 8px; margin-left: auto; border-radius: 50%; background: var(--zs-cyan); }
.zh .zh-drawer-inner > a.zh-drawer-wa { justify-content: center; gap: 14px; margin: 10px 0 0; padding: 10px 15px; border: 0; border-radius: var(--shape-full); background: var(--sk-wa); color: var(--sk-on-primary); box-shadow: 0 14px 28px -10px color-mix(in srgb, var(--sk-wa) 70%, transparent); }
.zh-drawer-wa svg { width: 18px; height: 18px; }
@media (min-width: 600px) {
  .zh-bar { gap: 16px; padding: 10px 20px; }
  .zh-ctas { gap: 8px; }
  .zh a.zh-wa { display: flex; }
  .zh a.zh-cta { padding: 0 16px; }
}
@media (min-width: 1100px) {
  .zh-bar { gap: 12px; padding: 10px clamp(12px, calc(12px + (100vw - 1100px) / 30), 20px); }
  .zh-nav { display: flex; }
  .zh-burger, .zh-drawer { display: none; }
  .zh a.zh-wa { display: none; }
  .zh a.zh-login { display: flex; }
  .zh-cta-full { display: inline; }
  .zh-cta-short { display: none; }
  .zh a.zh-cta { gap: 7px; min-height: 40px; padding: 0 20px; font-size: var(--fs-base); }
  .zh a.zh-cart { width: 40px; height: 40px; }
}
@media (prefers-reduced-motion: reduce) { .zh *, .zs-topbar * { transition: none !important; } }

/* CENNIK-1-DO-1 (04.11, decyzja właściciela: „przenieść z WordPressa do apki 1:1, potem trasa"): sekcje strony
   WWW /cennik pod tabelą pakietów - porównanie „Co dostajesz w cenie", pytania o ceny i płatności, niebieski
   pas z lekcją próbną. Wymiary i kolory odczytane w przeglądarce ze strony WWW 04.11 (1366 i 390 px);
   rozmiary płynne (clamp) zamiast progów, układ dwukolumnowy od 900 px. */
.zc-sec { padding: clamp(56px, 9vw, 96px) 0; background: var(--sk-card); }
.zc-kratka { background-color: var(--zs-paper); background-image: linear-gradient(var(--zs-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-grid) 1px, transparent 1px); background-size: 26px 26px; }
.zc-w { max-width: 1192px; margin: 0 auto; padding: 0 20px; }
/* WWW-SZEROKOSCI (11.11, audyt strony AS-11, właściciel: „dostrój wygląd cennika/sklepu"): pomiar 1440 px - nagłówek
   sklepu i cennika był o 44 px szerszy z każdej strony niż na stronie szkoły (logo 100 zamiast 144 px, .zh-bar
   1280 -> 1192), góra cennika i hero sklepu węższe niż dolne sekcje cennika (lewa krawędź 160 i 144 px na jednej
   stronie, 1120 -> 1152), a pasy .zc-sec kończyły się 32 px przed krawędzią ekranu (padding .pb-main). Na stronie
   szkoły pasy idą od brzegu do brzegu: kolor dociąga cień (jak .sk-block--tint), a pas w kratkę jest przezroczysty,
   bo ta sama kratka jest tłem całej strony - bez szwu na krawędziach. W ramce (pb-embedded) bez zmian. */
html.sk-kv:not(.pb-embedded) .zc-sec { box-shadow: 0 0 0 100vmax var(--sk-card); clip-path: inset(0 -100vmax); }
html.sk-kv:not(.pb-embedded) .zc-hist { box-shadow: 0 0 0 100vmax var(--zs-blue-soft); }
html.sk-kv:not(.pb-embedded) .zc-kratka { background: none; box-shadow: none; clip-path: none; }
.zc-split { display: grid; gap: 24px; align-items: start; }
.zc-intro { min-width: 0; }
html.sk-kv .zc-h2 { margin: 0 0 14px; font-size: clamp(30px, 4.4vw, 50px); line-height: 1.04; letter-spacing: -0.03em; text-align: left; color: var(--zs-ink); }
.zc-lead { margin: 0; color: var(--zs-mute); font-size: clamp(16px, 1.4vw, 18px); font-weight: var(--fw-semibold); line-height: 1.6; }
.zc-table { min-width: 0; overflow: hidden; border-radius: var(--shape-sm); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line), 0 24px 50px rgba(20, 27, 78, .08); }
.zc-row { display: grid; grid-template-columns: minmax(0, 1fr) clamp(70px, 11vw, 150px) clamp(70px, 11vw, 150px); }
.zc-row > span { display: flex; flex-direction: column; justify-content: center; padding: clamp(12px, 1.2vw, 15px) clamp(10px, 1.4vw, 18px); border-top: 1px solid var(--zs-line); }
.zc-row > span + span { align-items: center; text-align: center; border-left: 1px solid var(--zs-line); }
.zc-row--head { background: var(--zs-paper); color: var(--zs-ink); font-size: var(--fs-md); font-weight: var(--fw-heavy); }
.zc-row--head > span { border-top: 0; }
.zc-row--head > span:nth-child(2) { color: var(--zs-mute); }
.zc-row--head > span:nth-child(3) { color: var(--zs-blue); }
.zc-feat b { color: var(--zs-ink); font-size: var(--fs-lg); font-weight: var(--fw-black); line-height: 1.3; }
.zc-feat small { margin-top: 2px; color: var(--zs-mute); font-size: var(--fs-base); font-weight: var(--fw-semibold); line-height: 1.35; }
.zc-hand { font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-2xl); font-weight: var(--fw-bold); color: var(--zs-mute); }
.zc-no { color: var(--zs-pen); font-size: var(--fs-2xl); font-weight: var(--fw-bold); }
.zc-yes { color: var(--zs-check); font-size: var(--fs-3xl); font-weight: var(--fw-bold); line-height: 1; }
.zc-wa { display: inline-flex; align-items: center; min-height: 48px; margin-top: 24px; padding: 0 24px; border-radius: 13px; background: var(--sk-wa); color: var(--sk-on-primary); font-size: var(--fs-lg); font-weight: var(--fw-heavy); text-decoration: none; box-shadow: 0 4px 0 color-mix(in srgb, var(--sk-wa) 70%, black); transition: transform .2s; }
.zc-wa:hover { transform: translateY(-1px); color: var(--sk-on-primary); }
.zc-faq { min-width: 0; padding: 6px clamp(18px, 2.2vw, 28px); border: 1.5px solid var(--zs-line); border-radius: var(--shape-xl); background: var(--sk-card); }
.zc-faq-item { padding: 22px 0; border-bottom: 1px solid var(--zs-line); }
.zc-faq-item:last-child { border-bottom: 0; }
.zc-faq-item > summary { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; min-height: 44px; cursor: pointer; list-style: none; color: var(--zs-ink); font-size: clamp(17px, 1.5vw, 19px); font-weight: var(--fw-heavy); line-height: 1.3; }
.zc-faq-item > summary::-webkit-details-marker { display: none; }
.zc-faq-item > summary::after { content: "+"; flex: none; color: var(--zs-blue); font-size: var(--fs-2xl); font-weight: var(--fw-heavy); line-height: 1; }
.zc-faq-item[open] > summary::after { content: "-"; }
.zc-faq-item > p { margin: 12px 0 0; color: var(--zs-mute); font-size: var(--fs-lg); font-weight: var(--fw-semibold); line-height: 1.6; }
.zc-sec--cta { padding-top: 0; }
.zc-cta { position: relative; overflow: hidden; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 28px 48px; padding: clamp(32px, 5vw, 64px); border-radius: 32px; background-color: var(--zs-blue); background-image: linear-gradient(rgba(255, 255, 255, .08) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, .08) 1px, transparent 1px); background-size: 26px 26px; color: var(--sk-on-primary); }
.zc-cta-txt { max-width: 640px; }
.zc-cta-title { margin: 0 0 14px; color: var(--sk-on-primary); font-size: clamp(30px, 3.6vw, 44px); font-weight: var(--fw-heavy); line-height: 1.04; letter-spacing: -0.03em; text-wrap: balance; }
.zc-cta-sub { margin: 0; color: var(--zs-final-sub); font-size: clamp(16px, 1.4vw, 18px); font-weight: var(--fw-semibold); line-height: 1.6; }
.zc-cta-btn { display: inline-flex; align-items: center; justify-content: center; min-height: 56px; padding: 0 32px; border-radius: 13px; background: var(--sk-card); color: var(--zs-blue); font-size: var(--fs-xl); font-weight: var(--fw-heavy); text-decoration: none; box-shadow: 0 5px 0 var(--zs-key-light); transition: transform .2s; }
.zc-cta-btn:hover { transform: translateY(-1px); color: var(--zs-blue-hover); }
@media (min-width: 900px) {
  .zc-split { grid-template-columns: 340px minmax(0, 1fr); gap: 64px; }
  .zc-split--faq { grid-template-columns: 360px minmax(0, 1fr); gap: 80px; }
}
/* CENNIK-HISTORIA (06.11, właściciel: „tak, buduj historię na cenniku”): „Jak wygląda nauka z pakietem” pod tabelą -
   trzy karty jak „Twoje N dni z tym zbiorem” (`.zp-path`): etykieta-karteczka, tytuł, przekreślona myśl ucznia
   i odręczna odpowiedź. Telefon: jedna pod drugą; od 900 px trzy obok siebie ze strzałką między kartami.
   Przekreślenie w Montserrat (nie Caveat) - Caveat w 16 px był słabo czytelny (runda „Znasz to?” 05.11). */
.zc-hist { background: var(--zs-blue-soft); }
.zc-hist-head { max-width: 720px; margin: 0 0 clamp(28px, 4vw, 44px); }
.zc-hist-hand { margin: 0 0 8px; color: var(--zs-pen); }
.zc-hist-list { display: grid; gap: 16px; margin: 0; padding: 0; list-style: none; }
.zc-hist-item { position: relative; min-width: 0; padding: clamp(20px, 2.4vw, 28px); border-radius: var(--shape-xl); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line), 0 18px 40px -28px rgba(20, 27, 78, .35); }
.zc-hist-when { display: inline-block; margin: 0 0 14px; padding: 4px 12px; border-radius: 4px; background: var(--zs-tape); color: var(--zs-ink); font-size: var(--fs-sm); font-weight: var(--fw-heavy); letter-spacing: .06em; text-transform: uppercase; transform: rotate(-2deg); }
html.sk-kv .zc-hist-h { margin: 0 0 12px; color: var(--zs-ink); font-size: clamp(21px, 2vw, 24px); font-weight: var(--fw-heavy); letter-spacing: -0.02em; line-height: var(--lh-tight); }
.zc-hist-was { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 10px; margin: 0 0 12px; }
.zc-hist-was s { color: var(--zs-mute); font-size: var(--fs-md); font-style: italic; font-weight: var(--fw-medium); line-height: 1.4; text-decoration-color: var(--zs-pen); text-decoration-thickness: 2px; }
.zc-hist-fix { color: var(--zs-blue); line-height: 1.15; }
.zc-hist-p { margin: 0; color: var(--zs-mute); font-size: var(--fs-md); font-weight: var(--fw-semibold); line-height: 1.6; }
.zc-feat-note { margin-top: 4px; color: var(--zs-pen); font-size: var(--fs-2xl); line-height: 1.1; }   /* 22 px = duży tekst: czerwony 3,9:1 na bieli >= 3:1 */
@media (min-width: 900px) {
  .zc-hist-list { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px; }
  .zc-hist-item:not(:last-child)::after { content: ""; position: absolute; top: 50%; right: -21px; width: 10px; height: 10px; margin-top: -5px; border-top: 2.5px solid var(--zs-blue); border-right: 2.5px solid var(--zs-blue); transform: rotate(45deg); }
}

/* SKLEP-TEKSTY-A (04.11, prośba właściciela: „żeby uczeń widział realny zysk, że ogarnie temat sam od A do Z"):
   „Znasz to?" pod hero (sytuacje ucznia i co daje zbiór) i „Jak uczysz się z naszym zbiorem" (4 kroki metody)
   nad poleceniami. Od telefonu w górę: karty jedna pod drugą, od 900 px obok siebie, kroki 1 / 2 / 4 kolumny. */
.zk-pair { display: grid; gap: 16px; }
.zk-card { padding: clamp(20px, 3vw, 32px); border-radius: var(--shape-xl); }
.zk-card--przed { background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line), 0 18px 40px -28px rgba(20, 27, 78, .35); }
.zk-card--po { background: var(--zs-blue-soft); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--zs-blue) 18%, transparent); }
html.sk-kv .zk-title { margin: 0 0 14px; color: var(--zs-ink); font-size: clamp(26px, 3vw, 34px); font-weight: var(--fw-heavy); letter-spacing: -0.02em; line-height: 1.1; }
.zk-lead { margin: 0 0 14px; color: var(--zs-ink); font-size: var(--fs-lg); font-weight: var(--fw-black); line-height: 1.4; }
.zk-list { display: grid; gap: 12px; margin: 0; padding: 0; list-style: none; }
.zk-list li { position: relative; padding-left: 30px; color: var(--zs-mute); font-size: var(--fs-lg); font-weight: var(--fw-semibold); line-height: var(--lh-base); }
.zk-list li::before { content: "?"; position: absolute; left: 0; top: 1px; display: grid; place-items: center; width: 22px; height: 22px; border-radius: 50%; background: var(--zs-mark); color: var(--zs-ink); font-size: var(--fs-sm); font-weight: var(--fw-heavy); }
.zk-list--ok li { color: var(--zs-ink); }
.zk-list--ok li strong { font-weight: var(--fw-heavy); }
.zk-list--ok li::before { content: "\2713"; background: var(--zs-blue); color: var(--sk-on-primary); }
.zk-steps { display: grid; gap: 14px; margin: 0; padding: 0; list-style: none; counter-reset: none; }
.zk-steps li { display: grid; grid-template-columns: auto 1fr; column-gap: 14px; row-gap: 4px; align-items: start; padding: 20px; border-radius: var(--shape-lg); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line); color: var(--zs-mute); font-size: var(--fs-md); font-weight: var(--fw-semibold); line-height: var(--lh-base); }
.zk-steps li strong { grid-column: 2; color: var(--zs-ink); font-size: var(--fs-lg); font-weight: var(--fw-heavy); line-height: 1.3; }
.zk-step-no { grid-row: span 2; display: grid; place-items: center; width: 36px; height: 36px; border-radius: 13px; background: var(--zs-blue); color: var(--sk-on-primary); font-size: var(--fs-lg); font-weight: var(--fw-heavy); box-shadow: 0 3px 0 var(--zs-blue-press); }
.zk-close { max-width: 640px; margin: 20px auto 0; text-align: center; color: var(--zs-ink); font-family: Caveat, "Caveat Fallback", cursive; font-size: var(--fs-2xl); font-weight: var(--fw-bold); line-height: 1.3; }
@media (min-width: 600px) { .zk-steps { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 900px) { .zk-pair { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; } }
@media (min-width: 1100px) { .zk-steps { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* SKLEP-TEKSTY-B (04.11): karta produktu - „Twoje N dni z tym zbiorem" (droga ucznia dzień po dniu)
   nad zakładkami i zamknięcie z przyciskiem zakupu nad pytaniami. */
.zp-path { margin: 28px 0; padding: clamp(20px, 3vw, 32px); border-radius: var(--shape-xl); background: var(--zs-blue-soft); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--zs-blue) 18%, transparent); }
html.sk-kv .zp-title { margin: 0 0 18px; color: var(--zs-ink); font-size: clamp(24px, 2.8vw, 32px); font-weight: var(--fw-heavy); letter-spacing: -0.02em; line-height: 1.15; }
.zp-title em { font-style: normal; background-image: var(--zs-hl); }
.zp-steps { display: grid; gap: 12px; margin: 0; padding: 0; list-style: none; }
.zp-steps li { display: grid; gap: 4px; padding: 16px 18px; border-radius: var(--shape-lg); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line); color: var(--zs-ink); font-size: var(--fs-lg); font-weight: var(--fw-semibold); line-height: var(--lh-base); }
.zp-day { color: var(--zs-blue); font-size: var(--fs-sm); font-weight: var(--fw-heavy); letter-spacing: .06em; text-transform: uppercase; }
.zp-close { display: grid; gap: 16px; justify-items: center; margin: 28px 0; padding: clamp(24px, 4vw, 40px); border-radius: var(--shape-xl); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line), 0 18px 40px -28px rgba(20, 27, 78, .35); text-align: center; }
.zp-close-txt { max-width: 640px; margin: 0; color: var(--zs-ink); font-family: Caveat, "Caveat Fallback", cursive; font-size: clamp(24px, 2.6vw, 30px); font-weight: var(--fw-bold); line-height: 1.3; }
@media (min-width: 900px) { .zp-steps { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* SKLEP-SPRZEDAZ (04.11, właściciel: katalog jak strona sprzedażowa kursu - liczby, porównanie ze zwykłym zbiorem,
   „Sprawdź, czy to dla Ciebie", wsparcie na WhatsApp): `.zk-stats` (4 liczby ze źródłem), `.zk-vs-*` (tabela
   „Zwykły zbiór / Zbiór SOLVE"), `.zk-list--nie`, `.zk-subtitle`. Od telefonu w górę na tokenach. */
.zk-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 0; padding: 0; list-style: none; }
.zk-stats li { display: grid; gap: 6px; align-content: start; padding: clamp(16px, 2.4vw, 24px); border-radius: var(--shape-xl); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line), 0 18px 40px -28px rgba(20, 27, 78, .35); text-align: center; }
.zk-stats strong { color: var(--zs-blue); font-size: clamp(34px, 5vw, 52px); font-weight: var(--fw-heavy); letter-spacing: -0.03em; line-height: 1; }
.zk-stats li > span { color: var(--zs-mute); font-size: var(--fs-md); font-weight: var(--fw-semibold); line-height: 1.4; }
/* SKLEP-LICZBY-ALARM (04.11, właściciel: „92,7% na czerwono zgodnie z KV, jakiś wykrzyknik"): czerwony długopis
   z KV (--zs-pen) i „!" w kółku na rogu kafelka, lekko przekrzywione jak dopisek. Liczba 34-52 px to duży tekst,
   więc kontrast 3,9:1 na bieli wystarcza (AA dla dużego tekstu 3:1). */
.zk-stats li.zk-stat--alarm { position: relative; box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--zs-pen) 45%, transparent), 0 18px 40px -28px color-mix(in srgb, var(--zs-pen) 60%, transparent); }
.zk-stat--alarm strong { color: var(--zs-pen); }
.zk-stats li > .zk-alarm { position: absolute; top: -14px; right: 16px; display: grid; place-items: center; width: 34px; height: 34px; border-radius: var(--shape-full); background: var(--zs-pen); color: var(--sk-card); font-size: var(--fs-xl); font-weight: var(--fw-black); line-height: 1; rotate: 10deg; box-shadow: 0 6px 14px -6px color-mix(in srgb, var(--zs-pen) 80%, transparent); }
html.zr-on .zk-stats[data-zr] .zk-alarm { scale: 0; transition: scale .4s cubic-bezier(.3, 1.6, .5, 1) 1.1s; }
html.zr-on .zk-stats[data-zr].is-in .zk-alarm { scale: 1; }
.zk-stats-close { max-width: 640px; margin: 20px auto 0; text-align: center; color: var(--zs-ink); font-size: var(--fs-lg); font-weight: var(--fw-black); line-height: var(--lh-base); }
.zk-src { max-width: 640px; margin: 10px auto 0; text-align: center; color: var(--zs-mute); font-size: var(--fs-xs); line-height: 1.4; }
.zk-vs-table { overflow: hidden; border-radius: var(--shape-xl); background: var(--sk-card); box-shadow: 0 0 0 1.5px var(--zs-line), 0 24px 50px rgba(20, 27, 78, .08); }
.zk-vs-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
.zk-vs-row > span { display: flex; align-items: flex-start; gap: 10px; padding: clamp(12px, 1.6vw, 16px) clamp(12px, 2vw, 20px); border-top: 1px solid var(--zs-line); font-size: var(--fs-md); font-weight: var(--fw-semibold); line-height: 1.45; }
.zk-vs-row > span + span { border-left: 1px solid var(--zs-line); }
.zk-vs-row--head > span { border-top: 0; background: var(--zs-paper); font-size: var(--fs-md); font-weight: var(--fw-heavy); }
.zk-vs-row--head > span:first-child { color: var(--zs-mute); }
.zk-vs-row--head > span:last-child { color: var(--zs-blue); }
.zk-vs-no { color: var(--zs-mute); }
.zk-vs-yes { color: var(--zs-ink); background: color-mix(in srgb, var(--zs-blue-soft) 55%, transparent); }
.zk-vs-row .material-symbols-outlined { flex: none; margin-top: 1px; font-size: var(--fs-xl); }
.zk-vs-no .material-symbols-outlined { color: var(--zs-pen); }
.zk-vs-yes .material-symbols-outlined { color: var(--zs-check); }
html.sk-kv .zk-subtitle { margin: 0 0 14px; color: var(--zs-ink); font-size: var(--fs-xl); font-weight: var(--fw-heavy); line-height: 1.3; }
.zk-list--nie li::before { content: "\2715"; background: var(--sk-card); color: var(--zs-pen); box-shadow: inset 0 0 0 1.5px var(--zs-line); }
@media (min-width: 900px) { .zk-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; } }

/* SKLEP-RUCH-2 (04.11, prośba właściciela: „animacje, fajne przejścia przy scrollu"): dzieci kontenera [data-zr]
   wjeżdżają po kolei (opóźnienie z `--zr-i`), gdy kontener pojawi się na ekranie (pages/zs-ruch.js, także Safari).
   Stan ukryty tylko przy `html.zr-on` (ustawia skrypt) - bez skryptu i przy „ogranicz ruch" wszystko widać od razu.
   Do tego: karty unoszą się przy najechaniu (tylko mysz), ptaszki w porównaniu „wskakują". */
html.zr-on [data-zr] > * { opacity: 0; translate: 0 18px; transition: opacity .55s cubic-bezier(.2, .7, .2, 1), translate .55s cubic-bezier(.2, .7, .2, 1); transition-delay: calc(var(--zr-i, 0) * 90ms); }
html.zr-on [data-zr].is-in > * { opacity: 1; translate: 0 0; }
html.zr-on .zk-stats[data-zr] > * { translate: 0 0; scale: .9; transition-property: opacity, scale; }
html.zr-on .zk-stats[data-zr].is-in > * { scale: 1; }
html.zr-on .zk-vs-table[data-zr] .zk-vs-yes .material-symbols-outlined { scale: 0; transition: scale .4s cubic-bezier(.3, 1.6, .5, 1); transition-delay: calc(var(--zr-i, 0) * 90ms + 300ms); }
html.zr-on .zk-vs-table[data-zr].is-in .zk-vs-yes .material-symbols-outlined { scale: 1; }
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  :is(.zk-stats li, .zk-card, .zk-steps li, .zp-steps li) { transition: translate .25s ease, box-shadow .25s ease, opacity .55s cubic-bezier(.2, .7, .2, 1); }
  :is(.zk-stats li, .zk-steps li, .zp-steps li):hover, .zk-card:hover { translate: 0 -4px; box-shadow: 0 0 0 1.5px var(--zs-line-strong), 0 22px 44px -26px rgba(20, 27, 78, .45); }
}
@media (prefers-reduced-motion: reduce) { html.zr-on [data-zr] > * { opacity: 1; translate: none; scale: none; transition: none; } }


/* SKLEP-NOWY-WYGLAD (04.11, właściciel: „hero to hero, a reszta to reszta", „wyniki w złym świetle", „wymyśl wizualnie
   sklep od nowa"): katalog jako jedna historia. (1) Scena: hero i liczby na jednym granacie z cyjanową kratką (jak ciemny
   motyw strony WWW), pełna szerokość okna (pseudoelement 100vw; <html> ma overflow-x: clip). (2) Liczby to strata:
   czerwony długopis z KV, pasek „ile przepada", zwrot „To nie kwestia talentu" na dole sceny. (3) Nić: przerywana
   cyjanowa linia od sceny przez kolejne sekcje historii (.zk-story), żeby strona czytała się jak jedna ścieżka.
   Kontrast na granacie: biały 16:1, tekst 78% bieli 11:1, 60% bieli 6:1, żółty 13:1, czerwony 4,2:1 (tylko duży tekst). */
html.sk-kv .zk-stage { position: relative; isolation: isolate; margin: 0 0 clamp(40px, 6vw, 64px); padding: 0 0 clamp(36px, 5vw, 56px); color: var(--sk-card); }
html.sk-kv .zk-stage::before { content: ""; position: absolute; z-index: -1; inset: 0 calc(50% - 50vw); background-color: var(--zs-scene-bg);
  background-image: linear-gradient(var(--zs-scene-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--zs-scene-grid) 1px, transparent 1px), var(--zs-scene-glow);
  background-size: 28px 28px, 28px 28px, 100% 100%; }   /* KV-STRONA-2: tokeny sceny (było: własny color-mix) */
html.sk-kv .zk-stage::after { content: ""; position: absolute; left: 50%; bottom: calc(-1 * clamp(40px, 6vw, 64px)); height: calc(clamp(40px, 6vw, 64px) + 28px); border-left: 2px dashed var(--zs-cyan); translate: -1px 0; }

/* hero na scenie */
html.sk-kv .zk-stage .zk-hero { margin: 0; padding: clamp(28px, 5vw, 64px) 0 0; background: transparent; color: var(--sk-card); text-align: center; overflow: visible; }
html.sk-kv .zk-stage .sk-hero-title { color: var(--sk-card); }
html.sk-kv .zk-stage .sk-hero-title strong { background: none; -webkit-text-fill-color: currentColor; color: var(--zs-mark); }
html.sk-kv .zk-stage .sk-hero-lead { color: color-mix(in srgb, var(--sk-card) 80%, transparent); margin-inline: auto; }
html.sk-kv .zk-stage .sk-hero-eyebrow { background: color-mix(in srgb, var(--sk-card) 10%, transparent); box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 18%, transparent); color: var(--sk-card); }
html.sk-kv .zk-stage .sk-hero-hand { color: var(--zs-cyan); }
html.sk-kv .pb-body .zk-stage .sk-hero-btn { display: inline-flex; align-items: center; gap: 8px; background: var(--zs-cta); color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key); }
html.sk-kv .pb-body .zk-stage .sk-hero-btn:not(.sk-hero-btn--ghost):hover { background: var(--zs-cta-hover); color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key); }
html.sk-kv .pb-body .zk-stage .sk-hero-btn:not(.sk-hero-btn--ghost):active { transform: translateY(2px); box-shadow: var(--zs-cta-key-down); }
html.sk-kv .pb-body .zk-stage .sk-hero-btn:not(.sk-hero-btn--ghost):focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }
html.sk-kv .pb-body .zk-stage .sk-hero-btn .material-symbols-outlined { font-size: var(--fs-xl); }
html.sk-kv .pb-body .zk-stage .sk-hero-btn--ghost { background: transparent; color: var(--sk-card); box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--sk-card) 40%, transparent); }
html.sk-kv .pb-body .zk-stage .sk-hero-btn--ghost:hover { background: color-mix(in srgb, var(--sk-card) 10%, transparent); color: var(--sk-card); }
/* SKLEP-CHIPY-BEZ-PRZESUWANIA (04.11, zgłoszenie właściciela: „na telefonie mam ruchomy ekran"): w starym hero chipy na
   telefonie były przewijanym rzędem z marginesem -18 px pod wewnętrzny odstęp hero; scena go nie ma, więc rząd wystawał
   za ekran o kilka px i na iPhonie cała strona przesuwała się w bok (overflow-x: clip na <html> tego nie łapie).
   Na scenie chipy zawijają się, bez przewijania i bez maski. */
html.sk-kv .zk-stage .sk-hero-chips { flex-wrap: wrap; justify-content: center; overflow: visible; margin: 0; padding: 0; -webkit-mask-image: none; mask-image: none; }
html.sk-kv .zk-stage .sk-hero-chips li { background: color-mix(in srgb, var(--sk-card) 8%, transparent); color: var(--sk-card); box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 16%, transparent); }
html.sk-kv .zk-stage .sk-hero-chips .material-symbols-outlined { color: var(--zs-cyan); }

/* okładki w wachlarzu: środkowa z przodu, boczne przekrzywione */
html.sk-kv .zk-hero-covers { position: relative; display: block; width: min(100%, 320px); aspect-ratio: 10 / 7; margin: 20px auto 0; }
html.sk-kv .zk-hero-covers img { position: absolute; bottom: 0; left: 50%; width: 46%; height: auto; aspect-ratio: 3 / 4; object-fit: cover; border-radius: var(--shape-md); background: var(--sk-card);
  box-shadow: 0 24px 48px -16px rgba(0, 0, 0, .55), 0 0 0 1px color-mix(in srgb, var(--sk-card) 10%, transparent); transform-origin: 50% 100%; transition: rotate .35s ease, translate .35s ease; }
html.sk-kv .zk-hero-covers img:nth-child(1) { z-index: 2; translate: -50% 0; }
html.sk-kv .zk-hero-covers img:nth-child(2) { z-index: 1; translate: -96% 0; rotate: -10deg; }
html.sk-kv .zk-hero-covers img:nth-child(3) { z-index: 1; translate: -4% 0; rotate: 10deg; }
@media (hover: hover) {
  html.sk-kv .zk-hero-covers:hover img:nth-child(2) { translate: -104% -6px; rotate: -14deg; }
  html.sk-kv .zk-hero-covers:hover img:nth-child(3) { translate: 4% -6px; rotate: 14deg; }
}

/* liczby na scenie: strata */
html.sk-kv .zk-stage .zk-liczby { padding: clamp(36px, 5vw, 56px) 0 0; }
html.sk-kv .zk-stage .zk-liczby .sk-eyebrow { color: var(--zs-cyan); }
html.sk-kv .zk-stage .zk-liczby .sk-block-title { color: var(--sk-card); }
html.sk-kv .zk-stage .zk-liczby .sk-block-title em { background: none; -webkit-text-fill-color: currentColor; color: var(--zs-pen);
  text-decoration: underline wavy var(--zs-pen); text-decoration-thickness: 3px; text-underline-offset: 8px; }
html.sk-kv .zk-stage .zk-stats { grid-template-columns: minmax(0, 1fr); }
html.sk-kv .zk-stage .zk-stats li { grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 4px 16px; text-align: left;
  background: color-mix(in srgb, var(--sk-card) 6%, transparent); box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 13%, transparent); }
/* PLYNNOSC-LICZNIK (05.11, pomiar QA: przy odliczaniu „0,0%" -> „92,7%" kolumna liczby zmieniała szerokość, opis obok
   zawijał się inaczej - wysokość 53 -> 35 -> 53 px i scrollHeight skakał o 20 px): cyfry tabelaryczne i stała szerokość
   kolumny liczby (3.4ch na „50%", 4.9ch na „92,7%"), więc odliczanie niczego nie przestawia. */
html.sk-kv .zk-stage .zk-stats strong { grid-row: span 2; width: 3.4ch; min-width: 3.4ch; color: var(--zs-pen); font-variant-numeric: tabular-nums; white-space: nowrap; }
html.sk-kv .zk-stage .zk-stats li.zk-stat--alarm strong { width: 4.9ch; min-width: 4.9ch; }
html.sk-kv .zk-stage .zk-stats li > span { color: color-mix(in srgb, var(--sk-card) 78%, transparent); }
html.sk-kv .zk-stats li > .zk-bar { display: block; height: 8px; border-radius: var(--shape-full); background: color-mix(in srgb, var(--sk-card) 14%, transparent); overflow: hidden; }
html.sk-kv .zk-bar-fill { display: block; width: var(--zk-lost, 0%); height: 100%; border-radius: inherit; background: var(--zs-pen); transform-origin: 0 50%; }
html.sk-kv .zk-bar-fill[data-lost="50"] { --zk-lost: 50%; }
html.sk-kv .zk-bar-fill[data-lost="39"] { --zk-lost: 39%; }
html.sk-kv .zk-bar-fill[data-lost="67"] { --zk-lost: 67%; }
html.sk-kv .zk-bar-fill[data-lost="92-7"] { --zk-lost: 92.7%; }
html.zr-on.sk-kv .zk-stats[data-zr] .zk-bar-fill { scale: 0 1; transition: scale 1.1s cubic-bezier(.2, .7, .2, 1) .15s; }
html.zr-on.sk-kv .zk-stats[data-zr].is-in .zk-bar-fill { scale: 1 1; }
html.sk-kv .zk-stage .zk-stats li.zk-stat--alarm { background: color-mix(in srgb, var(--zs-pen) 14%, transparent); box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--zs-pen) 60%, transparent); }
html.sk-kv .zk-stage .zk-stats li > .zk-alarm { box-shadow: 0 0 0 3px var(--zs-ink); }
html.sk-kv .zk-stage .zk-stats-close { max-width: 720px; margin-top: clamp(28px, 4vw, 40px); color: var(--sk-card); font-size: var(--fs-xl); }
html.sk-kv .zk-stage .zk-stats-close em { font-style: normal; color: var(--zs-mark); }
html.sk-kv .zk-stage .zk-src { color: color-mix(in srgb, var(--sk-card) 60%, transparent); }

/* nić historii: przerywana linia nad każdą sekcją */
html.sk-kv .zk-story::before { content: ""; display: block; width: 0; height: 40px; margin: -34px auto 18px; border-left: 2px dashed color-mix(in srgb, var(--zs-cyan) 75%, transparent); }
html.sk-kv .zk-story > .sk-block-head .sk-eyebrow { position: relative; }
/* NIC-CIAGLA (06.11, właściciel o linii pod sceną /sklep: „te kreseczki to tak mają wyglądać? xd”): pod sceną rysowały się
   dwie linie naraz - `.zk-stage::after` (do górnej krawędzi następnej sekcji, pełny cyjan) i `::before` tej sekcji (od 34 px
   nad treścią, cyjan 75%, 1 px w prawo), więc kreski nachodziły na siebie albo miały przerwę i jaśniejszy koniec. Teraz linia
   sceny schodzi sama aż do treści pierwszej sekcji (odstęp sceny + padding sekcji + 24 px miejsca po jej `::before`,
   od 06.11 bez 18 px przerwy - NIC-DO-STRZALKI), `::before` tej sekcji jest niewidoczny, ale zostaje (bez zmiany odstępów), a wszystkie nici mają ten sam kolor i środek (translate -1 px jak linia sceny). */
html.sk-kv .zk-stage::after { bottom: calc(-1 * (clamp(40px, 6vw, 64px) + clamp(28px, 4vw, 40px) + 24px)); height: calc(clamp(40px, 6vw, 64px) + clamp(28px, 4vw, 40px) + 52px); }
/* NIC-DO-STRZALKI (06.11, właściciel o linii pod sceną: „ta kreska w zbiorze”): linia urywała się 18 px nad kartami „Znasz to?”,
   w szczelinie między nimi, bez celu. Teraz dochodzi do górnej krawędzi kart, a od 900 px biegnie dalej szczeliną aż do
   strzałki „przed -> po” na środku pary (strzałka jest w środkowej kolumnie, w połowie wysokości pary). */
@media (min-width: 900px) {
  html.sk-kv .zk-stage + .zk-story .zk-pair--arrow::before { content: ""; position: absolute; z-index: 1; left: 50%; top: 0; height: calc(50% - 26px); border-left: 2px dashed var(--zs-cyan); translate: -1px 0; }
}
html.sk-kv .zk-stage + .zk-story::before { visibility: hidden; }
html.sk-kv .zk-story::before { border-left-color: var(--zs-cyan); translate: -1px 0; }

@media (min-width: 600px) {
  html.sk-kv .zk-stage .zk-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  html.sk-kv .zk-hero-covers { width: 380px; }
}
@media (min-width: 900px) {
  html.sk-kv .zk-hero--covers { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, .8fr); align-items: center; gap: 48px; text-align: left; }
  html.sk-kv .zk-hero--covers .zk-hero-text, html.sk-kv .zk-hero--covers .zk-hero-text > * { text-align: left; }
  html.sk-kv .zk-hero--covers :is(.sk-hero-lead, .sk-hero-title) { margin-inline: 0; }
  html.sk-kv .zk-hero--covers :is(.sk-hero-actions, .sk-hero-chips) { justify-content: flex-start; }
  html.sk-kv .zk-hero--covers .sk-hero-hand { margin-inline: 0; }
  html.sk-kv .zk-hero--covers .zk-hero-covers { width: 100%; margin: 0; }
  html.sk-kv .zk-stage .zk-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  html.sk-kv .zk-stage .zk-stats li { grid-template-columns: minmax(0, 1fr); align-content: start; text-align: center; }
  html.sk-kv .zk-stage .zk-stats strong, html.sk-kv .zk-stage .zk-stats li.zk-stat--alarm strong { grid-row: auto; width: auto; }
}
@media (prefers-reduced-motion: reduce) { html.sk-kv .zk-hero-covers img { transition: none; } html.zr-on.sk-kv .zk-stats[data-zr] .zk-bar-fill { scale: none; transition: none; } }

/* SKLEP-NOWY-WYGLAD, reszta strony (04.11, właściciel: „hero jest zajebiste, teraz trzeba resztę dopracować"): ten sam
   język co scena - czerwony długopis = problem, żółty zakreślacz = wniosek, cyjan = ścieżka, granat = rozwiązanie.
   (1) „Znasz to?" jak kartka z zeszytu z czerwonymi „?", strzałka do granatowej karty z żółtymi ptaszkami.
   (2) Metoda jako oś: kroki spięte przerywaną cyjanową linią, ostatni (egzamin) z zakreślaczem.
   (3) Porównanie: kolumna zbioru z granatowym nagłówkiem, zwykły zbiór wyszarzony i przekreślony czerwonym długopisem.
   (4) „Raczej nie" przerywaną ramką - wyraźnie słabsza karta. */
html.sk-kv .zk-pair--arrow { position: relative; }
html.sk-kv .zk-pair-arrow { position: relative; z-index: 2; display: grid; place-items: center; justify-self: center; width: 52px; height: 52px; margin: -34px 0; border-radius: var(--shape-full);
  background: var(--zs-mark); color: var(--zs-ink); box-shadow: 0 0 0 5px var(--sk-bg), 0 12px 24px -10px rgba(20, 27, 78, .55); rotate: 90deg; }
html.sk-kv .zk-znasz .zk-card--przed { background-color: var(--sk-card); background-image: repeating-linear-gradient(transparent 0 33px, var(--zs-grid) 33px 34px); }
html.sk-kv .zk-znasz .zk-title { text-decoration: underline wavy var(--zs-pen); text-decoration-thickness: 3px; text-underline-offset: 9px; text-decoration-skip-ink: none; }
html.sk-kv .zk-card--przed .zk-list:not(.zk-list--nie) li::before { background: transparent; color: var(--zs-pen); box-shadow: inset 0 0 0 2px var(--zs-pen); }
html.sk-kv .zk-znasz .zk-card--po { position: relative; background-color: var(--zs-ink); box-shadow: 0 24px 50px -24px rgba(20, 27, 78, .7);
  background-image: linear-gradient(color-mix(in srgb, var(--zs-cyan) 12%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--zs-cyan) 12%, transparent) 1px, transparent 1px);
  background-size: 28px 28px; }
html.sk-kv .zk-znasz .zk-card--po .zk-lead { color: var(--sk-card); }
html.sk-kv .zk-znasz .zk-card--po .zk-list li { color: color-mix(in srgb, var(--sk-card) 82%, transparent); }
html.sk-kv .zk-znasz .zk-card--po .zk-list li strong { color: var(--zs-mark); }
html.sk-kv .zk-znasz .zk-card--po .zk-list li::before { background: var(--zs-mark); color: var(--zs-ink); }

html.sk-kv .zk-steps { position: relative; isolation: isolate; }
html.sk-kv .zk-steps::before { content: ""; position: absolute; z-index: -1; top: 24px; bottom: 24px; left: 37px; border-left: 2px dashed var(--zs-cyan); }
html.sk-kv .zk-steps li { position: relative; z-index: 1; }
html.sk-kv .zk-steps li:last-child { box-shadow: 0 0 0 2px var(--zs-mark), 0 18px 40px -26px rgba(20, 27, 78, .45); }
html.sk-kv .zk-steps li:last-child .zk-step-no { background: var(--zs-mark); color: var(--zs-ink); box-shadow: 0 3px 0 color-mix(in srgb, var(--zs-mark) 55%, var(--zs-ink)); }

html.sk-kv .zk-vs-row--head > span:last-child { background: var(--zs-ink); color: var(--sk-card); }
html.sk-kv .zk-vs-no { background: color-mix(in srgb, var(--zs-paper) 80%, transparent); text-decoration: line-through; text-decoration-color: color-mix(in srgb, var(--zs-pen) 50%, transparent); text-decoration-thickness: 2px; }
html.sk-kv .zk-vs-yes { background: var(--sk-card); font-weight: var(--fw-bold); }

html.sk-kv .zk-dla .zk-card--przed { background: transparent; box-shadow: none; outline: 2px dashed var(--zs-line-strong); outline-offset: -2px; }
html.sk-kv .zk-dla .zk-card--po { box-shadow: 0 0 0 2px color-mix(in srgb, var(--zs-blue) 35%, transparent), 0 18px 40px -28px rgba(20, 27, 78, .35); }

@media (min-width: 600px) {
  html.sk-kv .zk-vs-row--head > span:last-child::after { content: "polecamy"; margin-left: auto; padding: 2px 10px; border-radius: var(--shape-full); background: var(--zs-mark); color: var(--zs-ink); font-size: var(--fs-xs); font-weight: var(--fw-heavy); letter-spacing: .04em; text-transform: uppercase; }
}
@media (min-width: 900px) {
  html.sk-kv .zk-pair--arrow { grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); gap: 0 14px; align-items: center; }
  html.sk-kv .zk-pair--arrow > .zk-card { align-self: stretch; }
  html.sk-kv .zk-pair-arrow { margin: 0 -40px; rotate: none; }
  html.sk-kv .zk-steps::before { top: 38px; bottom: auto; left: 40px; right: 40px; border-left: 0; border-top: 2px dashed var(--zs-cyan); }
}

/* SKLEP-NOWY-WYGLAD, punkty 1-6 (04.11, właściciel: „chcę, żeby to było spójne wizualnie" - „możesz robić"):
   (1) pas końcowy granatowy z cyjanową kratką jak scena - strona zaczyna się i kończy tak samo (także cennik i karta
   produktu, gdzie jest ten sam pas); (2) pod okładkami kart granat z kratką, okładki świecą jak w wachlarzu hero;
   (3) „Pozycja miesiąca" jako mini-hero; (4) zestawy: „osobno" przekreślone czerwonym długopisem, „Oszczędzasz" na
   zakreślaczu; (5) FAQ z granatowymi numerkami i cyjanowym paskiem przy otwartym; (6) równy rytm sekcji historii. */
html.sk-kv .sk-final, html.sk-kv .pb-body .sk-month, html.sk-kv .sk-card .sk-card-media, html.sk-kv .sk-zs > .sk-zs-fan {
  background-color: var(--zs-scene-bg);   /* KV-STRONA-2: tokeny sceny (było: własny color-mix) */
  background-image: linear-gradient(var(--zs-scene-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--zs-scene-grid) 1px, transparent 1px), var(--zs-scene-glow);
  background-size: 28px 28px, 28px 28px, 100% 100%; }
html.sk-kv .pb-body .sk-final .sk-final-btn { background: var(--zs-cta); color: var(--zs-cta-ink); box-shadow: 0 5px 0 var(--zs-cta-press); }
html.sk-kv .pb-body .sk-final .sk-final-btn:hover { background: var(--zs-cta-hover); color: var(--zs-cta-ink); box-shadow: 0 5px 0 var(--zs-cta-press); }
html.sk-kv .pb-body .sk-final .sk-final-btn:active { transform: translateY(2px); box-shadow: var(--zs-cta-key-down); }
html.sk-kv .pb-body .sk-final .sk-final-btn:focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }
html.sk-kv .sk-final .sk-final-perks .sk-final-ico { background: var(--zs-mark); color: var(--zs-ink); }
html.sk-kv .sk-final .sk-final-sub { color: color-mix(in srgb, var(--sk-card) 80%, transparent); }

html.sk-kv .sk-card .sk-card-media { border-bottom: 0; }
html.sk-kv .sk-card .sk-card-media::after { background: radial-gradient(closest-side, rgba(0, 0, 0, .45), transparent); }
html.sk-kv .sk-card .sk-card-media .sk-cover:not(.sk-cover--empty) { box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 10%, transparent), 0 18px 34px -12px rgba(0, 0, 0, .6); }

html.sk-kv .pb-body .sk-month { border: 0; color: var(--sk-card); box-shadow: 0 30px 60px -30px rgba(20, 27, 78, .7); }
html.sk-kv .sk-month .sk-month-media { background: transparent; }
html.sk-kv .sk-month .sk-month-media img.sk-cover { box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 10%, transparent), 0 24px 48px -16px rgba(0, 0, 0, .6); rotate: -3deg; }
html.sk-kv .sk-month .sk-month-flag { background: var(--zs-mark); color: var(--zs-ink); }
html.sk-kv .sk-month :is(.sk-month-title, .sk-month-title a, .sk-price) { color: var(--sk-card); }
html.sk-kv .sk-month .sk-month-title a:hover { color: var(--zs-mark); }
html.sk-kv .sk-month :is(.sk-month-note, .sk-month-lead, .sk-lowest) { color: color-mix(in srgb, var(--sk-card) 78%, transparent); }
html.sk-kv .sk-month .sk-price-old { color: color-mix(in srgb, var(--sk-card) 62%, transparent); text-decoration-color: var(--zs-pen); }
html.sk-kv .sk-month .sk-price--promo { color: var(--zs-mark); }
html.sk-kv .pb-body .sk-month .btn.accent { background: var(--zs-cta); color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key); }
html.sk-kv .pb-body .sk-month .btn.accent:hover { background: var(--zs-cta-hover); color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key); }
html.sk-kv .pb-body .sk-month .btn.accent:active { transform: translateY(2px); box-shadow: var(--zs-cta-key-down); }
html.sk-kv .pb-body .sk-month .btn.accent:focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }
html.sk-kv .pb-body .sk-month .btn.tonal { background: transparent; color: var(--sk-card); box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--sk-card) 40%, transparent); }
html.sk-kv .pb-body .sk-month .btn.tonal:hover { background: color-mix(in srgb, var(--sk-card) 10%, transparent); color: var(--sk-card); }

html.sk-kv .pb-body .sk-zs-was { color: var(--zs-mute); text-decoration: line-through; text-decoration-color: var(--zs-pen); text-decoration-thickness: 2px; }
html.sk-kv .pb-body .sk-zs-save { justify-self: start; color: var(--zs-ink); font-weight: var(--fw-heavy); }
/* Zakreślacz pod każdym wierszem, gdy „Oszczędzasz X% względem kupowania osobno” się zawija (review 05.11) */
html.sk-kv .pb-body .sk-zs-save-hl { padding: 0 4px; background-image: var(--zs-hl); -webkit-box-decoration-break: clone; box-decoration-break: clone; }

html.sk-kv .sk-faq-item > summary { display: flex; align-items: center; gap: 12px; }
html.sk-kv .sk-faq-no { display: grid; width: 30px; height: 30px; background: var(--zs-ink); color: var(--zs-mark); font-size: var(--fs-md); }
html.sk-kv .sk-faq-item[open] { border-color: var(--zs-line-strong); box-shadow: inset 4px 0 0 var(--zs-cyan), 0 12px 26px -20px rgba(13, 18, 26, .3); }

html.sk-kv .zk-story { padding-block: clamp(28px, 4vw, 40px); }
/* nagłówek zestawów jak nagłówki sekcji historii */
html.sk-kv .sk-zestawy-title { font-size: clamp(24px, 3.4vw, 36px); font-weight: var(--fw-black); letter-spacing: -0.03em; color: var(--zs-ink); }
html.sk-kv .sk-zestawy-head { margin-bottom: clamp(16px, 2.4vw, 24px); }
html.sk-kv .zk-shelf-intro { margin: 0 auto clamp(14px, 2vw, 20px); padding-block: clamp(28px, 4vw, 40px) 0; }

/* SKLEP-NOWY-WYGLAD-KARTA (04.11, właściciel: „rób całość", „graficznie też możesz dostroić"): karta produktu,
   koszyk i cennik w tym samym języku co katalog. Granat z cyjanową kratką = scena/rozwiązanie, żółty = wniosek
   i główny przycisk w granatowych pasach, czerwony długopis = problem, cyjan = ścieżka.
   Karta: okładka na granacie, „Twoje N dni" jako oś na granacie (ostatni dzień z żółtym wyróżnieniem), „Wyobraź
   sobie..." jako granatowy pas z żółtym przyciskiem, okładki polecanych na granacie. Cennik: nagłówek jako scena
   (poza ramką), granatowy pas końcowy i granatowy nagłówek kolumny szkoły w „Co dostajesz w cenie". */
html.sk-kv :is(.sk-product-media, .sk-related-grid .sk-mini-media, .zp-path, .zp-close, .zc-cta),
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head::before {
  background-color: var(--zs-scene-bg);   /* KV-STRONA-2: tokeny sceny (było: własny color-mix) */
  background-image: linear-gradient(var(--zs-scene-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--zs-scene-grid) 1px, transparent 1px), var(--zs-scene-glow);
  background-size: 28px 28px, 28px 28px, 100% 100%; }

/* karta produktu */
html.sk-kv .sk-product-media { border: 0; }
html.sk-kv .sk-product-media img.sk-cover { box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 10%, transparent), 0 30px 60px -18px rgba(0, 0, 0, .6); }
html.sk-kv .sk-related-grid .sk-mini-media { border-bottom: 0; }

html.sk-kv .zp-path { position: relative; box-shadow: 0 30px 60px -30px rgba(20, 27, 78, .7); }
html.sk-kv .zp-path .zp-title { color: var(--sk-card); }
html.sk-kv .zp-path .zp-title em { background: none; color: var(--zs-mark); }
html.sk-kv .zp-steps { position: relative; isolation: isolate; }
html.sk-kv .zp-steps::before { content: ""; position: absolute; z-index: -1; top: 18px; bottom: 18px; left: 28px; border-left: 2px dashed var(--zs-cyan); }
html.sk-kv .zp-steps li { box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 12%, transparent), 0 18px 36px -22px rgba(0, 0, 0, .55); }
html.sk-kv .zp-steps li:last-child { box-shadow: 0 0 0 2.5px var(--zs-mark), 0 18px 36px -22px rgba(0, 0, 0, .55); }
html.sk-kv .zp-steps li:last-child .zp-day { justify-self: start; padding: 1px 8px; border-radius: var(--shape-full); background: var(--zs-mark); color: var(--zs-ink); }

html.sk-kv .zp-close { box-shadow: 0 30px 60px -30px rgba(20, 27, 78, .7); }
html.sk-kv .zp-close .zp-close-txt { color: var(--sk-card); }
html.sk-kv .pb-body .zp-close .zp-close-btn { background: var(--zs-cta); color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key); }
html.sk-kv .pb-body .zp-close .zp-close-btn:hover { background: var(--zs-cta-hover); color: var(--zs-cta-ink); box-shadow: var(--zs-cta-key); }
html.sk-kv .pb-body .zp-close .zp-close-btn:active { transform: translateY(2px); box-shadow: var(--zs-cta-key-down); }
html.sk-kv .pb-body .zp-close .zp-close-btn:focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }

/* cennik: nagłówek jako scena (tylko poza ramką) */
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head { position: relative; isolation: isolate; padding: clamp(28px, 5vw, 56px) 0 clamp(28px, 4vw, 44px); color: var(--sk-card); }
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head::before { content: ""; position: absolute; z-index: -1; inset: 0 calc(50% - 50vw); }
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-eyebrow { color: var(--zs-cyan); }
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-title { color: var(--sk-card); }
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-title :is(em, strong) { background: none; -webkit-text-fill-color: currentColor; color: var(--zs-mark); }
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-sub { color: color-mix(in srgb, var(--sk-card) 80%, transparent); }
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-sub strong { color: var(--zs-mark); }
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-hand { color: var(--zs-cyan); }

html.sk-kv .zc-cta { box-shadow: 0 30px 60px -30px rgba(20, 27, 78, .7); }
html.sk-kv .zc-cta .zc-cta-sub { color: color-mix(in srgb, var(--sk-card) 80%, transparent); }
html.sk-kv .pb-body .zc-cta .zc-cta-btn { background: var(--zs-cta); color: var(--zs-cta-ink); box-shadow: 0 5px 0 var(--zs-cta-press); }
html.sk-kv .pb-body .zc-cta .zc-cta-btn:hover { background: var(--zs-cta-hover); color: var(--zs-cta-ink); box-shadow: 0 5px 0 var(--zs-cta-press); }
html.sk-kv .pb-body .zc-cta .zc-cta-btn:active { transform: translateY(2px); box-shadow: var(--zs-cta-key-down); }
html.sk-kv .pb-body .zc-cta .zc-cta-btn:focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) {
  html.sk-kv .pb-body :is(.zk-stage .sk-hero-btn, .sk-final .sk-final-btn, .sk-month .btn.accent, .zp-close .zp-close-btn, .zc-cta .zc-cta-btn):active { transform: none; }
}
html.sk-kv .zc-row--head > span:last-child { background: var(--zs-ink); color: var(--sk-card); }

@media (min-width: 900px) {
  html.sk-kv .zp-steps::before { top: 30px; bottom: auto; left: 40px; right: 40px; border-left: 0; border-top: 2px dashed var(--zs-cyan); }
}
html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn { padding-top: 0; }

/* CENNIK-PROBNA-BOX (04.11): karta próbnej w hero cennika - biała karta na granacie jak w hero strony głównej. */
html.sk-kv .sk-cn-head { grid-template-areas: "e" "t" "s" "h" "b"; }
html.sk-kv .zc-trial { grid-area: b; margin: 22px 0 0; padding: 20px; border-radius: var(--shape-xl); background: var(--sk-card); color: var(--zs-ink);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 20%, transparent), 0 30px 60px -24px rgba(0, 0, 0, .55); }
html.sk-kv .zc-trial-top { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 0; }
html.sk-kv .zc-trial-h { font-size: var(--fs-xl); font-weight: var(--fw-black); letter-spacing: -0.02em; }
html.sk-kv .zc-trial-price s { color: var(--zs-mute); font-size: var(--fs-md); text-decoration-color: var(--zs-pen); text-decoration-thickness: 2px; }
html.sk-kv .zc-trial-price b { color: var(--zs-blue); font-size: var(--fs-2xl); font-weight: var(--fw-black); }
html.sk-kv .zc-trial-sub { margin: 4px 0 14px; color: var(--zs-mute); font-size: var(--fs-md); font-weight: var(--fw-semibold); }
@media (min-width: 900px) {
  html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head { grid-template-columns: minmax(0, 1fr) minmax(320px, 380px); grid-template-rows: 1fr auto auto auto auto 1fr; grid-template-areas: ". b" "e b" "t b" "s b" "h b" ". b"; column-gap: clamp(32px, 5vw, 64px); align-items: start; }
  html.sk-kv .zc-trial { margin: 0; }
  html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-hand { justify-self: start; margin: 14px 0 0; }
}
/* SKLEP-NOWY-WYGLAD-KARTA: miniatury w koszyku na granacie jak karty katalogu (ta sama okładka w tym samym otoczeniu). */
html.sk-kv .sk-cart-media { display: grid; place-items: center; padding: 6px; border-radius: var(--shape-md);
  background-color: var(--zs-scene-bg); background-image: linear-gradient(var(--zs-scene-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--zs-scene-grid) 1px, transparent 1px); background-size: 14px 14px; }   /* KV-STRONA-2: barwy z tokenów sceny, gęstsza kratka bez poświaty (miniatura) */

/* SKLEP-OKLADKI-UNOSZA (04.11, właściciel: „bądź bardziej odważny, dodaj przejścia"): okładki w hero lekko unoszą się
   w spoczynku, każda w swoim rytmie (transform - osobno od `translate`/`rotate`, którymi stoją w wachlarzu). */
@media (prefers-reduced-motion: no-preference) {
  html.sk-kv .zk-hero-covers img { animation: zk-float 6s ease-in-out infinite; }
  html.sk-kv .zk-hero-covers img:nth-child(2) { animation-duration: 7s; animation-delay: -2s; }
  html.sk-kv .zk-hero-covers img:nth-child(3) { animation-duration: 6.5s; animation-delay: -4s; }
}
@keyframes zk-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }

/* DORADCA-KV (04.11, właściciel: „żeby ta ramka była dopasowana do KV strony"): nagłówek okna Wirtualnego Solve na
   granacie z cyjanową kratką jak hero strony i sklepu - okno wygląda jak część strony, nie obcy widżet. */
.dor-body .dor-top { position: relative; border-bottom: 0; color: var(--sk-card); background-color: var(--zs-scene-bg);
  background-image: linear-gradient(var(--zs-scene-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--zs-scene-grid) 1px, transparent 1px),
    /* KV-STRONA-2: kratka i granat z tokenów sceny; poświata szersza niż --zs-scene-glow, bo nagłówek okna jest niski */
    radial-gradient(80% 120% at 90% 0%, color-mix(in srgb, var(--zs-blue) 45%, transparent), transparent 70%);
  background-size: 28px 28px, 28px 28px, 100% 100%; }
.dor-body .dor-top .dor-title strong { color: var(--sk-card); }
.dor-body .dor-title .dor-hand { color: var(--zs-mark); }
.dor-body .dor-logo { box-shadow: 0 0 0 1px color-mix(in srgb, var(--sk-card) 20%, transparent), 0 8px 18px -8px rgba(0, 0, 0, .5); }
.dor-body .dor-live { box-shadow: 0 0 0 2px var(--zs-ink); }
.dor-body .dor-top .icon-btn { color: var(--sk-card); }
.dor-body .dor-top .icon-btn:hover { background: color-mix(in srgb, var(--sk-card) 12%, transparent); color: var(--sk-card); }
.dor-body .dor-top .icon-btn:focus-visible { outline: 3px solid var(--zs-mark); outline-offset: 2px; }

/* PROBNA-HERO-KV (04.11, właściciel: „hero na głównej - ta ramka z umawianiem jest średnia, jakieś rozwiązanie
   wizualne?"): kroki jak „Jak zaczynamy" na stronie (przerywana cyjanowa linia, bieżący krok żółty z granatową
   cyfrą i cieniem klawisza), zwarte kafelki poziomów ze strzałką (widać, że to wybór; wybrany - niebieska obwódka
   i ptaszek zamiast strzałki), odręczny dopisek nad kafelkami. Dotyczy wszystkich kroków /probna (pb-kv). */
html.pb-kv .pb-step + .pb-step::before { height: 0; border-radius: 0; background: none; border-top: 2px dashed color-mix(in srgb, var(--zs-cyan) 70%, transparent); }
html.pb-kv .pb-step.is-done + .pb-step::before, html.pb-kv .pb-step.is-done::before { border-top-color: var(--zs-teal); }
html.pb-kv .pb-step.is-current .pb-step-num { background: var(--zs-mark); border-color: var(--zs-mark); color: var(--zs-ink); box-shadow: 0 3px 0 color-mix(in srgb, var(--zs-mark) 55%, var(--zs-ink)); }
html.pb-kv .pb-step.is-current { color: var(--zs-ink); }
html.pb-heroframe.pb-embedded .pb-hero-hand { order: 5; display: block; margin: 0 0 6px; color: var(--zs-blue); font-size: var(--fs-xl); line-height: 1.1; transform: rotate(-2deg); transform-origin: left center; }
html.pb-heroframe.pb-embedded .pb-start .pb-tile { flex: 0 0 auto; max-height: none; }
html.pb-heroframe.pb-embedded .pb-start .pb-tile .pb-tile-label { position: relative; min-height: 62px; padding: 8px 52px 8px 14px; }
html.pb-heroframe.pb-embedded .pb-start .pb-tile .pb-tile-label::after { content: "arrow_forward"; font-family: "Material Symbols Outlined"; position: absolute; top: 50%; right: 14px; transform: translateY(-50%);
  display: grid; place-items: center; width: 28px; height: 28px; border-radius: var(--shape-full); background: var(--zs-blue-soft); color: var(--zs-blue); font-size: var(--fs-lg); font-feature-settings: "liga"; transition: background 120ms ease, color 120ms ease; }
html.pb-heroframe.pb-embedded .pb-start .pb-tile:hover .pb-tile-label::after { background: var(--zs-blue); color: var(--sk-on-primary); }
html.pb-heroframe.pb-embedded .pb-start .pb-seg-input:checked + .pb-tile-label::after { content: "check"; background: var(--zs-blue); color: var(--sk-on-primary); }
html.pb-heroframe.pb-embedded .pb-hero-info { order: 90; margin: 4px 0 0; padding: 9px 12px; border-radius: var(--zs-r-card, var(--shape-lg)); background: var(--zs-blue-soft); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--zs-blue) 14%, transparent); }
html.pb-heroframe.pb-embedded .pb-hero-info-h { margin: 0 0 4px; color: var(--zs-pen); font-size: var(--fs-xl); line-height: 1; transform: rotate(-2deg); transform-origin: left center; }
html.pb-heroframe.pb-embedded .pb-hero-info ul { display: grid; gap: 3px; margin: 0; padding: 0; list-style: none; }
html.pb-heroframe.pb-embedded .pb-hero-info li { display: flex; align-items: center; gap: 10px; color: var(--zs-ink); font-size: var(--fs-sm); font-weight: var(--fw-bold); }
html.pb-heroframe.pb-embedded .pb-hero-info .material-symbols-outlined { display: grid; place-items: center; flex: none; width: 22px; height: 22px; border-radius: var(--shape-sm); background: var(--sk-card); color: var(--zs-blue); font-size: var(--fs-md); }
html.pb-heroframe.pb-embedded .pb-start:has(.pb-seg-input:checked) .pb-hero-info { display: none; }
/* CENNIK-PROBNA-RAMKA: ramka rezerwacji w karcie próbnej cennika - wysokość jak zgłasza panel (520 komputer, 560 telefon). */
html.sk-kv .zc-trial-frame { display: block; width: 100%; height: 562px; margin: 6px 0 0; border: 0; background: transparent; }
html.sk-kv .zc-trial-alt { margin: 6px 0 0; color: var(--zs-mute); font-size: var(--fs-sm); text-align: center; }
html.sk-kv .zc-trial-alt a { color: var(--zs-blue); font-weight: var(--fw-bold); }
@media (min-width: 600px) { html.sk-kv .zc-trial-frame { height: 522px; } }

/* CENNIK-RATY-KV (04.11, właściciel: „raty i oszczędzanie trzeba dopasować do naszego KV, bo jest stare jeszcze"):
   zielona i jasnoniebieska pigułka z pierwszego cennika -> język strony: oszczędność jako żółta naklejka
   (zakreślacz = zysk), raty jako biała pigułka z przerywaną niebieską obwódką (ścieżka). Też w „Dokup lekcje". */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-save { border: 0; border-radius: var(--shape-sm); background: var(--zs-mark); color: var(--zs-ink);
  box-shadow: 0 2px 0 color-mix(in srgb, var(--zs-mark) 55%, var(--zs-ink)); transform: rotate(-1deg); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-raty { border: 1.5px dashed color-mix(in srgb, var(--zs-blue) 45%, transparent); background: var(--sk-card); color: var(--zs-blue); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-raty strong { color: var(--zs-ink); }
/* PROBNA-HERO-KV (przegląd na telefonie 04.11): w wąskiej ramce (karta w hero na telefonie, ok. 320 px) pasek
   „30 minut gratis · Bez karty · Link do Meet" był ucięty po bokach - w ramce hero (najwyżej ok. 400 px) pasek bez ikon. */
html.pb-heroframe.pb-embedded .pb-trust { gap: 10px; }
html.pb-heroframe.pb-embedded .pb-trust .material-symbols-outlined { display: none; }
html.pb-heroframe.pb-embedded .pb-start .pb-tile .pb-tile-label { padding-right: 46px; }
/* PROBNA-HERO-KV (właściciel 04.11: „co Cię czeka na próbnej a Wybierz korepetytora dalej ma przerwę"): blok
   rośnie i wypełnia wolne miejsce stałej wysokości ramki aż do przycisku, treść wyśrodkowana w pionie. */
html.pb-heroframe.pb-embedded .pb-hero-info { flex: 1 0 auto; display: flex; flex-direction: column; justify-content: center; max-height: 180px; }
/* W-E14 (05.11): ramka hero ma 520/560 px - tam blok dorasta do ok. 140-180 px. Otwarta wprost (albo ramka wyższa
   niż zgłasza panel) rosła do całego ekranu: ok. 450 px pustego niebieskiego prostokąta na telefonie 390 px.
   Sufit wzrostu; reszta wolnego miejsca zostaje nad przyklejonym przyciskiem (`.pb-action` ma margin-top: auto). */
html.pb-heroframe.pb-embedded .pb-trust li + li::before { content: "·"; margin-right: 10px; color: var(--zs-line-strong); font-weight: var(--fw-black); }

/* AUDYT-W-D (05.11, przegląd wyglądu kadry - docs/audit/AUDYT-2026-11-05.md, poprawki [M]). */
/* W-D3 / W-D20: skróty klawiszowe (G D, ⌘K, Esc) nic nie znaczą na ekranie dotykowym. */
@media (pointer: coarse) {
  .cmdk-item .kbd, .cmdk-foot, .cmdk-search .esc-hint, .topbar-search .kbd-hint, .nav-kbd-hint { display: none; }
}
/* W-D20: jedno „dodaj” na telefonie - przycisk nagłówka chowa się, gdy dolny pasek ma „Dodaj” (fab_modal). */
.btn.page-act-fab { display: none; }
@media (min-width: 900px) { .btn.page-act-fab { display: inline-flex; } }
/* W-D13: „Usuń kolumnę” w oknie edycji kolumny zadań - widoczne tylko przy edycji. */
#status-modal-delete[hidden] { display: none; }
/* W-D15: „148 / 1150” na pulpicie nie łamie się w środku liczby. */
.pu-gauge-n { white-space: nowrap; }
.pu-chart-empty { margin-top: 4px; }
/* W-D23: licznik „PD do oceny” - para tokenów ostrzeżenia (tekst --c-warn na --c-warn-bg, oba motywy). */
.tab-count.tab-count--warn { background: var(--c-warn-bg); color: var(--c-warn); font-weight: var(--fw-bold); }
/* W-D2: kafel z kłódką na stronie 403. */
.error-card .error-ico { margin: 0 auto 8px; }
/* W-D26: przycisk „Zapisz dostępność” przyklejony nad dolnym menu na telefonie; „Kopiuj” i „Wyczyść” pod nim. */
.avail-savebar {
  position: sticky; bottom: calc(var(--bottom-nav-h) + env(safe-area-inset-bottom, 0px) + 8px); z-index: 2;
  margin-top: 12px; padding: 8px; border: 1px solid var(--border); border-radius: var(--shape-lg);
  background: var(--surface); box-shadow: var(--shadow-card);
}
.avail-savebar .btn { width: 100%; justify-content: center; }
.avail-more { display: flex; margin-top: 10px; }
@media (min-width: 900px) {
  .avail-savebar { position: static; display: inline-flex; margin: 0 6px 0 0; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; vertical-align: middle; }
  .avail-savebar .btn { width: auto; }
  .avail-more { display: inline-flex; margin-top: 0; vertical-align: middle; }
}

/* CENNIK-HERO-WIEKSZY (05.11, właściciel: „w cenniku w hero tekst jest trochę mały w nagłówku - pewnie przez
   wysokość ramki, pasuje tekst dopasować”): hero ma wysokość ramki próbnej (ok. 760 px), a tytuł miał najwyżej
   44 px - obok ramki zostawało dużo pustego granatu. Od 900 px tytuł jak hero strony WWW (ok. 62 px), opis 19 px,
   dopiski odręczne większe. Telefon bez zmian. */
@media (min-width: 900px) {
  html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-title { font-size: calc(var(--fs-display) * 1.55); line-height: 1.04; letter-spacing: -0.035em; max-width: 680px; margin-bottom: 22px; }
  html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-sub { font-size: calc(var(--fs-lg) * 1.2); max-width: 600px; }
  html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head .sk-cn-hand { font-size: calc(var(--fs-2xl) * 1.35); }
}

/* ══ KV-STRONA-2 (05.11, właściciel: „Chcemy żeby KV aplikacji był jak strony", plan docs/audit/KV-STRONA-2026-11-05.md):
   hero panelu (`.solve-hero`: przegląd rodzica, pulpit admina, Mój dzień, pulpit korepetytora) i baner płatności
   (`.pay-banner`) to granatowa scena strony - tło z `--g-panel` (tokeny `--zs-scene-*`). Na scenie: nad tytułem
   odręczny cyjanowy dopisek (prawdziwa treść: data albo nazwa sekcji, bez obietnic), imię żółte (`.kv-grad--light`),
   główna akcja żółta `.btn.cta` (najwyżej jedna na scenę), druga przezroczysta `.btn.ghost` (biały tekst, obwódka
   `--zs-ghost-line`), fokus biały `--focus-on-scene`. Strażnik miejsca obu przycisków: tests/test_kv_strona_przyciski.py. */
.solve-hero .solve-hero-hand { margin: 0 0 4px; color: var(--zs-cyan); transform: rotate(-3deg); }   /* inline-block: wyrównanie jak tytuł */
.solve-hero :is(a, button):focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }
/* nagłówek strony jako scena (pulpit korepetytora): tytuł i akcje w jednym rzędzie */
.solve-hero--head { justify-content: space-between; flex-wrap: wrap; gap: 14px 24px; }
.solve-hero--head .solve-hero-title { margin: 0; }
.solve-hero-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
html .btn.ghost { background: transparent; border-color: var(--zs-ghost-line); color: var(--zs-scene-text); box-shadow: none; }
html .btn.ghost:hover { background: var(--zs-ghost-hover); border-color: var(--zs-scene-text); color: var(--zs-scene-text); }
html .btn.ghost:focus-visible { outline: 2px solid var(--focus-on-scene); outline-offset: 2px; }
/* licznik w żółtym przycisku: granat z żółtą liczbą 12,7:1 (biała pigułka z `--accent` miała w ciemnym motywie
   jasnoniebieską liczbę na bieli) */
html .btn.cta .pz-count-badge { background: var(--zs-cta-ink); color: var(--zs-cta); }
/* Telefon: scena nie spycha treści - bez dekoracyjnej ikony w kółku (72 px + odstęp) i bez ikon w przyciskach sceny
   (dwa przyciski mieszczą się w jednym rzędzie od 360 px). Od 600 px wracają. */
.solve-hero .solve-hero-ico, .solve-hero-actions .btn > .material-symbols-outlined { display: none; }
@media (min-width: 600px) {
  .solve-hero .solve-hero-ico { display: grid; }
  .solve-hero-actions .btn > .material-symbols-outlined { display: inline-block; }
}
@media (min-width: 900px) {
  .solve-hero--head { padding: 20px 28px; }   /* niższy niż hero z pigułkami; telefon: odstępy z reguł hero wyżej */
}
/* Ciemny motyw: granat sceny (#141B4E) na tle #0E1442 ma tylko 1,08:1 - obwódka jak karty, żółty CTA bez zmian (tokeny
   `--zs-cta*` i `--zs-scene-*` nie mają wersji html.dark). Panel logowania jest sceną dopiero od 900 px. */
html.dark :is(.solve-hero, .pay-banner, .kr-hero) { border: 1.5px solid var(--border-strong); }
@media (min-width: 900px) {
  html.dark .login-aside { border: 1.5px solid var(--border-strong); border-right: 0; }
}

/* PLYNNOSC-CZYTELNOSC (05.11, pomiar QA na telefonie: w sklepie 10-12 px - poziom na karcie 84 razy, „Najniższa cena
   z 30 dni" 63 razy, chipy, „Źródła"; w cenniku „lekcji" w kafelku 11 px, przyciski AI 11 px, „Nie widzisz formularza?"
   12 px): w sklepie i cenniku tekst co najmniej 14 px, krótkie etykiety wersalikami 13 px. Na końcu pliku i z tą samą
   lub wyższą specyficznością co starsze reguły (także te w @media), więc wygrywa na każdej szerokości. */
html.sk-kv :is(.sk-badge, .sk-card .sk-badge, .sk-card .sk-badge--level) { font-size: var(--fs-md); line-height: var(--lh-tight); }
html.sk-kv .sk-card .sk-badge--level { font-size: var(--fs-md); }
html.sk-kv .sk-lowest, html.sk-kv .sk-card .sk-card-lowest, html.sk-kv .sk-card .sk-card-lowest .sk-lowest { font-size: var(--fs-md); line-height: var(--lh-base); }
html.sk-kv .sk-card .sk-card-lowest { margin-top: 2px; }
html.sk-kv .sk-card-sub, html.sk-kv .sk-price-old, html.sk-kv .sk-card .sk-price-old { font-size: var(--fs-md); }
html.sk-kv .sk-card .sk-card-pct { font-size: var(--fs-md); }
html.sk-kv .zk-stage .sk-hero-chips li, html.sk-kv .sk-hero-chips li { font-size: var(--fs-md); }
html.sk-kv .zk-src, html.sk-kv .zk-stage .zk-src { font-size: var(--fs-md); line-height: var(--lh-base); }
html.sk-kv :is(.sk-zs-was, .sk-zs-save, .sk-flevel, .sk-card-cta, .sk-zs-items li, .dim-12) { font-size: var(--fs-md); }
html.sk-kv .pb-body .sk-card .btn, html.sk-kv .sk-card .sk-card-cta { font-size: var(--fs-md); }
html.sk-kv :is(.sk-eyebrow, .sk-fgroup-title, .sk-zs-badge, .sk-fcount) { font-size: var(--fs-base); }
html.sk-kv .sk-rail-title .sk-fcount { font-size: var(--fs-base); }
/* cennik korepetycji (/sklep/korepetycje = /cennik) */
html.sk-kv :is(.sk-hero-ai-opt, .sk-hero-ai-free, .sk-cn-step-p, .sk-cn-save, .zc-feat small, .zc-trial-alt) { font-size: var(--fs-md); }
html.sk-kv .sk-cn-cap { font-size: var(--fs-md); line-height: var(--lh-tight); }
html.sk-kv :is(.sk-cn-tile small, .sk-cn-ctl-label) { font-size: var(--fs-base); }
/* okienko newslettera i pasek zgody na newsletter */
html.sk-kv :is(.sk-nl-no, .sk-nl .pz-consent-check span, .sk-nl .field-label) { font-size: var(--fs-md); }
/* pasek nad nagłówkiem jak #sp-top strony (tam od rundy 4 też 14 px), pigułka nad tytułem hero, sortowanie */
:is(html.sk-kv, html.pb-kv) .zs-topbar, html.sk-kv :is(.sk-hero-eyebrow, .sk-sort) { font-size: var(--fs-md); }
html.sk-kv .sk-zestawy-eyebrow { font-size: var(--fs-base); }
.sk-zs-lowest { margin: 2px 0 0; }   /* SKLEP-OMNIBUS-PCT: najniższa cena z 30 dni pod ceną zestawu */
html.sk-kv :is(.sk-zs-actions, .pb-empty) .btn, html.sk-kv .pb-body .zk-stage .sk-hero-btn { font-size: var(--fs-md); }
html.sk-kv .sk-final-perks li > span:last-child > span, html.sk-kv .sk-digital-note, html.sk-kv .sk-related-grid .sk-mini-more { font-size: var(--fs-md); }
/* PLYNNOSC-IKONY (05.11): zanim przyjdzie font ikon (font-display: block), ikona to niewidoczne SŁOWO ligatury
   („download", „school") - na pierwszym rysowaniu chipy hero były szersze i zawijały się w więcej rzędów, a po
   doczytaniu fontu hero się kurczyło i okładki oraz liczby podjeżdżały (CLS). W widokach publicznych ikona od początku
   zajmuje swoje 1em. Specyficzność zero (:where) - każda reguła z własną szerokością ikony wygrywa. */
:where(html.sk-kv, html.pb-kv) :where(.material-symbols-outlined) { width: 1em; overflow: hidden; }

/* SKLEP-STICKY-POD-NAGLOWKIEM (06.11, właściciel: „strona z filtrem zatrzymuje się na górze, znów headera nie doliczasz"):
   nagłówek sklepu `.sk-top` jest przyklejony i ma 110 px (pasek „Egzaminy 2027” 45 px + nagłówek 65 px, zmierzone
   przy 1100-1920 px), a przyklejone panele miały `top` 76-84 px, więc ok. 30 px panelu chowało się pod nagłówkiem.
   Jedna zmienna: wysokość nagłówka + 16 px odstępu. W ramce na WordPressie (`pb-embedded`) nagłówka nie ma - bez zmian.
   `top` działa tylko przy `position: sticky`; tam, gdzie panel jest statyczny, nic nie przesuwa. */
@media (min-width: 900px) {
  html.sk-kv:not(.pb-embedded) { --sk-sticky-top: 126px; }
  html.sk-kv:not(.pb-embedded) :is(.sk-fpanel, .sk-product-aside, .sk-buy-aside) { top: var(--sk-sticky-top); }
  html.sk-kv:not(.pb-embedded) .sk-fpanel { max-height: calc(100vh - var(--sk-sticky-top) - 16px); }
  html.sk-kv:not(.pb-embedded) .sk-shelf { scroll-margin-top: var(--sk-sticky-top); }
}

/* ══ PROBNA-ZMIEN-POZIOM, PROBNA-KROKI-LINKI, PROBNA-KALENDARZ (06.11, prośby właściciela ze zrzutów ramki hero) ══
   1) krok 2: „Twój wybór: ..." z klawiszem „Zmień poziom" (44 px, jak „Wszyscy korepetytorzy") zamiast małego linku;
   2) pasek kroków: ukończony krok jest linkiem / przyciskiem powrotu (`.pb-step-link`), przyszłe zostają napisem;
   3) krok 3: kalendarz miesiąca (nagłówek „Listopad 2026", strzałki do miesięcy z wolnymi terminami, tydzień od
      poniedziałku, dni bez terminów wyszarzone, dziś obwiedzione przerywaną linią). Dni z terminami to te same
      klawisze `.pb-day` co dotąd; w ramce hero komórki niższe (36 px), godziny przewijają się w `.pb-main`. */
.pb-choice { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px 14px; margin: 0 0 16px; }
.pb-choice .pb-choice-text { margin: 0; }
html.pb-kv .pb-choice .pb-choice-btn { min-height: 44px; margin: 0; }
html.pb-kv .pb-choice .pb-choice-btn .material-symbols-outlined { color: var(--zs-blue); font-size: var(--fs-lg); }
html.pb-heroframe.pb-embedded .pb-choice { justify-content: space-between; flex-wrap: nowrap; gap: 10px; margin: 0; padding: 4px 2px 8px 0; }
html.pb-heroframe.pb-embedded .pb-choice .pb-choice-text { min-width: 0; padding: 0; font-size: var(--fs-sm); line-height: var(--lh-tight); }
html.pb-heroframe.pb-embedded .pb-choice .pb-choice-btn { flex: none; padding: 0 14px 0 10px; white-space: nowrap; }

.pb-step-in { display: flex; flex-direction: column; align-items: center; gap: inherit; min-width: 0; max-width: 100%; color: inherit; text-decoration: none; }
.pb-step-link { min-width: 44px; min-height: 44px; padding: 0 4px; border: 0; border-radius: var(--shape-sm); background: none; font: inherit; color: inherit; cursor: pointer; }
.pb-step-link:hover .pb-step-label { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 3px; }
html.pb-kv .pb-step-link:hover .pb-step-num { box-shadow: 0 0 0 4px var(--zs-blue-soft); }
.pb-step-link:focus-visible { outline: 2px solid var(--zs-blue); outline-offset: 2px; }

.pb-mcal { display: grid; gap: 6px; min-width: 0; }
.pb-mcal-head { display: grid; grid-template-columns: 44px minmax(0, 1fr) 44px; align-items: center; min-height: 44px; }
.pb-mcal-title { grid-column: 2; margin: 0; text-align: center; color: var(--text); font-size: var(--fs-lg); font-weight: var(--fw-black); }
.pb-mcal-nav { display: grid; place-items: center; width: 44px; height: 44px; padding: 0; border: 0; border-radius: var(--shape-md); background: var(--surface); color: var(--primary); font: inherit; cursor: pointer; box-shadow: 0 0 0 1.5px var(--border); }
.pb-mcal-nav .material-symbols-outlined { font-size: var(--fs-2xl); }
.pb-mcal-nav--prev { grid-column: 1; }
.pb-mcal-nav--next { grid-column: 3; }
.pb-mcal-nav:hover { background: var(--primary-container); }
.pb-mcal-nav:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.pb-mcal .pb-mcal-nav[hidden], .pb-mcal .pb-cal[hidden] { display: none; }
.pb-when-grid > .pb-mcal { grid-column: 1; min-width: 0; }
html.pb-kv .pb-mcal-title { color: var(--zs-ink); }
html.pb-kv .pb-mcal-nav { background: var(--sk-card); color: var(--zs-blue); border-radius: var(--zs-r-btn); box-shadow: 0 0 0 1.5px var(--zs-line), 0 3px 0 var(--zs-line); }
html.pb-kv .pb-mcal-nav:hover { background: var(--zs-blue-soft); }
html.pb-kv .pb-mcal-nav:active { transform: translateY(2px); box-shadow: 0 0 0 1.5px var(--zs-line), 0 1px 0 var(--zs-line); }
html.pb-kv .pb-cal--month .pb-day--off .pb-day-num { color: var(--zs-mute); opacity: .5; }
.pb-cal--month .pb-day--blank { visibility: hidden; }
html.pb-kv .pb-cal--month .pb-day { min-height: 44px; }   /* pełny miesiąc (do 6 tygodni) niższy niż siatka 2 tygodni */
html.pb-kv .pb-choice { padding-top: 2px; }
.pb-cal--month .pb-day--today { outline: 1.5px dashed var(--border-strong); outline-offset: -4px; }
html.pb-kv .pb-cal--month .pb-day--today { outline-color: var(--zs-line-strong); }
html.pb-kv .pb-cal--month .pb-day--today .pb-day-num { opacity: 1; color: var(--zs-blue); font-weight: var(--fw-black); }
/* ramka hero: kompaktowo, żeby pod kalendarzem było widać pierwsze godziny */
html.pb-heroframe.pb-embedded .pb-mcal { gap: 2px; }
html.pb-heroframe.pb-embedded .pb-mcal-title { font-size: var(--fs-md); }
html.pb-heroframe.pb-embedded .pb-cal--month { gap: 4px; padding: 2px; }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-cal-row { gap: 4px; }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-cal-wd { padding: 0 0 2px; font-size: var(--fs-2xs); color: var(--zs-mute); font-weight: var(--fw-bold); }
html.pb-heroframe.pb-embedded .pb-part--when { padding-top: 0; }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-day { min-width: 0; min-height: 36px; padding: 0; border-radius: var(--pbh-radius); }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-day-num { font-size: var(--fs-md); font-weight: var(--fw-black); }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-day--off .pb-day-num { font-weight: var(--fw-semibold); }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-day-dot { position: absolute; bottom: 5px; left: 50%; width: 4px; height: 4px; margin-left: -2px; }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-day:not(.pb-day--off):not(.pb-day--active):hover { background: var(--zs-blue-soft); color: var(--zs-blue); }
html.pb-heroframe.pb-embedded .pb-cal--month .pb-day:focus-visible { outline: 2px solid var(--zs-blue); outline-offset: 2px; }
html.pb-heroframe.pb-embedded .pb-mcal ~ .pb-slots { margin-top: 8px; }

/* ══ PROBNA-SKAN-KROKI (06.11): skan telefonu objął kroki 2-4 rezerwacji próbnej (dotąd tylko krok 1) i wyłapał
   cele dotykowe poniżej 44 px. Tekstowe „Zmień" rosną do 44 px z ujemnym marginesem (wygląd i wysokość wiersza bez
   zmian, większy jest tylko obszar dotyku); pigułki klas, zakresu i „Skąd o nas wiesz?" 42 -> 44 px; „Wszyscy
   korepetytorzy" w ramce hero 32 -> 44 px jak „Zmień poziom" obok. Kalendarz miesiąca na wąskim telefonie: rząd
   7 dni miał 310 px przy odstępie 6 px, czyli dzień 39 px - kalendarz wchodzi w margines sekcji (18 -> 8 px)
   i odstęp 3 px, dzień ok. 44 px na 360. W ramce hero komórki zostają 36 px (przyjęte przez właściciela 06.11). */
html.pb-kv .pb-segment:not(.pb-segment--tiles) .pb-seg-label { min-height: 44px; }
.pb-sum-change { min-height: 44px; margin-block: -6px; }
.pb-chosen .pb-inline-link { display: inline-flex; align-items: center; min-height: 44px; margin-block: -10px; padding: 0 8px; margin-right: -8px; }
html.pb-heroframe.pb-embedded .pb-back { min-height: 44px; }
html:not(.pb-heroframe) .pb-part--when .pb-mcal { margin-inline: -10px; }
html:not(.pb-heroframe) .pb-part--when .pb-cal--month .pb-cal-row { gap: 3px; }
@media (min-width: 600px) {
  html:not(.pb-heroframe) .pb-part--when .pb-mcal { margin-inline: 0; }
  html:not(.pb-heroframe) .pb-part--when .pb-cal--month .pb-cal-row { gap: 6px; }
}

/* BW-PASEK-BANER (10.11): pasek, baner i plakietka w motywie trwającej promocji (Sklep -> Promocje).
   Barwy tylko z tokenów `--promo-*`; motyw wybiera klasa `sk-promo--<motyw>` na <html> sklepu
   i `zs-topbar--<motyw>` na pasku. Bez promocji żadna z tych reguł nie ma do czego pasować. */
.zs-topbar--promo { background: var(--promo-bg); color: var(--promo-ink); }
.zs-topbar--promo .zs-topbar-hand { color: var(--promo-accent); }
.zs-topbar--promo .zs-topbar-long { display: inline; }
.zs-topbar--promo a.zs-topbar-cta { color: var(--promo-accent); }
.zs-topbar--blackweek { --promo-bg: var(--promo-blackweek-bg); --promo-accent: var(--promo-blackweek-accent); }
.zs-topbar--mikolaj { --promo-bg: var(--promo-mikolaj-bg); --promo-accent: var(--promo-mikolaj-accent); }
.sk-promo-banner { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 6px 10px; margin: 10px 12px 0; padding: 10px 12px; max-width: 1120px; border-radius: var(--shape-lg); background: var(--promo-bg); color: var(--promo-ink); font-size: var(--fs-sm); font-weight: var(--fw-bold); line-height: 1.35; text-align: center; }
.sk-promo-banner .material-symbols-outlined { color: var(--promo-accent); font-size: 20px; }
.sk-promo-banner-until { padding: 2px 10px; border-radius: var(--shape-full); background: var(--promo-accent); color: var(--promo-bg); font-size: var(--fs-sm); white-space: nowrap; }
.sk-promo-banner--blackweek { --promo-bg: var(--promo-blackweek-bg); --promo-accent: var(--promo-blackweek-accent); }
.sk-promo-banner--mikolaj { --promo-bg: var(--promo-mikolaj-bg); --promo-accent: var(--promo-mikolaj-accent); }
html.sk-promo--blackweek .sk-card-pct, html.sk-promo--blackweek .sk-zs-pct { background: var(--promo-blackweek-bg); color: var(--promo-blackweek-accent); }
html.sk-promo--mikolaj .sk-card-pct, html.sk-promo--mikolaj .sk-zs-pct { background: var(--promo-mikolaj-bg); color: var(--promo-mikolaj-accent); }
@media (min-width: 600px) {
  .sk-promo-banner { margin: 12px auto 0; padding: 12px 16px; font-size: var(--fs-md); }
}

/* SKLEP-HERO-SRODEK (10.11, właściciel: „tekst jest maksymalnie od lewej do prawej, trzeba to wycentrować,
   a liczby przenieść sekcję niżej - słabo to wygląda"). Hero trzyma szerokość nagłówka (1120 px, na środku)
   zamiast całego ekranu, zajmuje pierwszy ekran sam, a „Liczby" zaczynają się pod nim, za cienką linią.
   Tekst dostaje szerszą kolumnę (tytuł w trzech liniach), okładki węższą. */
html.sk-kv .zk-stage .zk-hero { padding-bottom: 28px; }
@media (min-width: 900px) {
  html.sk-kv .zk-stage .zk-hero { box-sizing: border-box; max-width: 1152px; margin-inline: auto; min-height: min(620px, calc(100svh - 150px)); align-content: center; padding-block: clamp(40px, 5vw, 72px); }
  html.sk-kv .zk-hero--covers { grid-template-columns: minmax(0, 1.4fr) minmax(0, .6fr); gap: clamp(32px, 4vw, 56px); }
  html.sk-kv .zk-hero--covers .sk-hero-lead { max-width: 54ch; }
  html.sk-kv .zk-hero--covers .zk-hero-covers { max-width: 400px; justify-self: end; }
  html.sk-kv .zk-stage .zk-liczby { max-width: 1152px; margin-inline: auto; }
}

/* ─── BW-PAKIETY (10.11): prezent z promocji przy pakiecie lekcji (cennik, „Dokup lekcje”, strona zakupu) ───
   Lekcje gratis albo komplet zbiorów - tylko przy płatności z góry, stąd dopisek pod tekstem.
   Barwy z tokenów `--promo-*`, motyw przez modyfikator na samym elemencie (strony korepetycji nie
   mają klasy motywu na <html>, bo pasek promocji zbiorów może mieć inny motyw). */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gift, html.sk-kv .sk-bp-gift { display: inline-flex; align-items: center; gap: 8px; border-radius: var(--shape-md); background: var(--promo-bg); color: var(--promo-ink); font-size: var(--fs-sm); line-height: 1.3; text-align: left; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gift strong { color: var(--promo-accent); font-weight: var(--fw-black); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gift .material-symbols-outlined, html.sk-kv .sk-bp-gift .material-symbols-outlined { flex: none; color: var(--promo-accent); font-size: var(--fs-xl); }
html.sk-kv .sk-bp-gift { padding: 5px 12px; font-weight: var(--fw-heavy); }
.sk-cn-gift--blackweek, .sk-bp-gift--blackweek { --promo-bg: var(--promo-blackweek-bg); --promo-accent: var(--promo-blackweek-accent); }
.sk-cn-gift--mikolaj, .sk-bp-gift--mikolaj { --promo-bg: var(--promo-mikolaj-bg); --promo-accent: var(--promo-mikolaj-accent); }
html.sk-kv .sk-sum-row--gift { color: var(--sk-success-ink); font-weight: var(--fw-semibold); }
html.sk-kv .sk-payopt-gift { color: var(--sk-success-ink); font-weight: var(--fw-heavy); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-info .sk-cn-gift { width: fit-content; max-width: 100%; margin-top: 8px; padding: 5px 12px; }

/* ─── CENNIK-PODRASOWANIE (10.11, właściciel: „cennik tak samo trochę bym graficznie podrasował”, potem
   „możemy go podrasować zgodnie z KV? bo mam wrażenie, że on odstaje od reszty”) ───
   Te same znaki co na stronie głównej: żółta taśma na kartach, odręczny dopisek, żółte kółko pierwszego
   kroku i cyjanowa przerywana nitka między krokami (jak pasek kroków w karcie lekcji próbnej i „Jak
   zaczynamy”). Pole doradcy ma dwie strony (pytanie po lewej, odpowiedzi po prawej) zamiast treści
   przyklejonej do lewej krawędzi, a kroki siedzą w jednej karcie z równymi kolumnami. */
html.sk-kv .zc-trial { position: relative; }
html.sk-kv .zc-trial > .zs-tape { top: -15px; width: 120px; transform: translateX(-50%) rotate(2deg); }
html.sk-kv .sk-cn > .sk-hero-ai--light { position: relative; padding: 24px 18px 18px; }
html.sk-kv .sk-cn > .sk-hero-ai--light > .zs-tape { left: 56px; top: -13px; width: 92px; height: 26px; transform: rotate(-4deg); }
html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-q { align-items: center; gap: 14px; margin: 0 0 14px; font-size: var(--fs-md); line-height: 1.35; color: var(--sk-ink-muted); }
html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-q strong { display: table; margin-bottom: 2px; color: var(--zs-ink); font-size: var(--fs-xl); letter-spacing: -0.015em; }
html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-ico { width: 46px; height: 46px; font-size: var(--fs-xl); box-shadow: var(--zs-key); }
html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-free { display: inline-flex; align-items: center; min-height: 44px; }
html.sk-kv .sk-hero-ai-hand { display: none; }
html.sk-kv .sk-cn .sk-cn-steps { gap: 0; padding: 8px 18px; background: var(--sk-card); border: 1.5px solid var(--zs-line); border-radius: var(--zs-r-card); box-shadow: var(--zs-shadow); }
html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step { padding: 14px 0; }
html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step:not(:last-child)::before { left: 21px; top: 64px; bottom: -8px; border-left: 2px dashed var(--zs-cyan); }
html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step:first-child .sk-cn-step-n { border-color: var(--zs-mark); background: var(--zs-mark); color: var(--zs-ink); box-shadow: 0 3px 0 color-mix(in srgb, var(--zs-mark) 62%, var(--zs-ink)); }
html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step:first-child .sk-cn-step-note { color: var(--zs-blue); }
html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step-h { margin: 9px 0 0; }
@media (min-width: 900px) {
  html.sk-kv .sk-cn > .sk-hero-ai--light { display: grid; grid-template-columns: minmax(260px, auto) minmax(0, 1fr); grid-template-areas: "q o" "q f"; align-items: center; gap: 6px 32px; padding: 26px 28px 20px; }
  html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-q { grid-area: q; margin: 0; }
  html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-opts { grid-area: o; justify-content: flex-end; }
  html.sk-kv .sk-cn > .sk-hero-ai--light .sk-hero-ai-free { grid-area: f; justify-self: end; margin: 0; min-height: 32px; }
  html.sk-kv .sk-hero-ai-hand { display: block; position: absolute; right: 34px; top: -22px; color: var(--zs-pen); font-size: var(--fs-2xl); transform: rotate(-3deg); pointer-events: none; }
  html.sk-kv .sk-cn .sk-cn-steps { gap: 0; padding: 30px 10px 26px; }
  html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step { grid-template-columns: minmax(0, 1fr); justify-items: center; align-content: start; gap: 0; padding: 0 22px; text-align: center; }
  html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step:not(:last-child)::before { left: calc(50% + 32px); right: calc(-50% + 32px); top: 21px; bottom: auto; border-left: 0; border-top: 2px dashed var(--zs-cyan); }
  html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step-h { margin: 14px 0 0; }
  html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step-note { margin-inline: auto; transform-origin: center; }
  html.sk-kv .sk-cn .sk-cn-steps .sk-cn-step-p { max-width: 34ch; margin-inline: auto; }
}
/* BW-PAKIETY: „+1” na kafelku liczby lekcji - prezent widać już w liście, zanim klient wejdzie w pakiet */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile { position: relative; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-tile-plus { position: absolute; top: -9px; right: -11px; min-width: 30px; padding: 3px 6px; border-radius: var(--shape-full); background: var(--zs-mark); color: var(--zs-ink); font-size: var(--fs-sm); font-style: normal; font-weight: var(--fw-black); line-height: var(--lh-tight); text-align: center; box-shadow: 0 2px 0 color-mix(in srgb, var(--zs-mark) 62%, var(--zs-ink)); transform: rotate(6deg); }
/* BW-PASEK-BANER: baner promocji poza sklepem (pulpit i logowanie rodzica) - cały jest linkiem do sklepu */
.pz-promo-note { margin: 0 0 16px; }

/* ─── PROMO-EFEKTY (10.11, właściciel: „motyw na całą aplikację, takie dodatki mikro, padający śnieg itp.”) ───
   Warstwa nad stroną, która niczego nie zasłania i nie łapie kliknięć. Motyw Mikołaj: dwa rzędy płatków
   spadających w różnym tempie (sam CSS, przesuwany `transform`, więc bez przerysowywania treści). Przy
   „ogranicz ruch” płatki stoją. Kolejny motyw = własna klasa `.promo-fx--<motyw>`. */
.promo-fx { position: fixed; inset: 0; overflow: hidden; pointer-events: none; z-index: var(--z-sticky); }
.promo-fx--mikolaj::before, .promo-fx--mikolaj::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; background-repeat: repeat; }
.promo-fx--mikolaj::before { top: -240px; background-image: radial-gradient(circle at 30px 40px, var(--promo-snow) 0 3px, transparent 3.5px), radial-gradient(circle at 150px 170px, var(--promo-snow) 0 2px, transparent 2.5px); background-size: 240px 240px; opacity: .8; animation: promo-snow-a 16s linear infinite; }
.promo-fx--mikolaj::after { top: -170px; background-image: radial-gradient(circle at 90px 20px, var(--promo-snow) 0 2px, transparent 2.5px), radial-gradient(circle at 20px 120px, var(--promo-snow) 0 1.5px, transparent 2px); background-size: 170px 170px; opacity: .55; animation: promo-snow-b 10s linear infinite; }
@keyframes promo-snow-a { to { transform: translate3d(0, 240px, 0); } }
@keyframes promo-snow-b { to { transform: translate3d(0, 170px, 0); } }
@media (prefers-reduced-motion: reduce) { .promo-fx--mikolaj::before, .promo-fx--mikolaj::after { animation: none; } }

/* PASEK-PRZYCISKI + ODLICZANIE (10.11): odliczanie do końca promocji (cyfry stałej szerokości, żeby pasek
   nie drgał co sekundę) i przyciski „Zbiory zadań” / „Korepetycje 1:1” na pasku i banerze. */
.zs-topbar-until, .sk-promo-banner-until { font-variant-numeric: tabular-nums; white-space: nowrap; }
.zs-topbar-until { padding: 2px 10px; border-radius: var(--shape-full); background: var(--promo-accent); color: var(--promo-bg); font-size: var(--fs-sm); font-weight: var(--fw-heavy); }
.zs-topbar--promo .zs-topbar-long { display: none; }
.sk-promo-banner-btn { display: inline-flex; align-items: center; min-height: 44px; padding: 0 16px; border-radius: var(--shape-full); background: var(--promo-ink); color: var(--promo-bg); font-weight: var(--fw-heavy); text-decoration: none; white-space: nowrap; }
.sk-promo-banner-btn:hover { background: var(--promo-accent); }
.sk-promo-banner-btn:focus-visible { outline: 3px solid var(--promo-accent); outline-offset: 2px; }
@media (min-width: 600px) {
  .zs-topbar--promo .zs-topbar-long { display: inline; }
}

/* PROMOCJA-W-HERO (12.11, właściciel o telefonie: „patrz, jak to wygląda w cenniku i zbiorach zadań”, „a możemy ten
   baner przenieść do hero?”). Trzy rzeczy:
   1) pasek nad nagłówkiem: przyciski łamią się razem; na telefonie, gdy promocja ma baner, zostaje samo hasło
      i odliczanie w jednej linii (przyciski są niżej);
   2) baner na stronach bez hero (produkt, koszyk): tekst, pod nim przyciski równej szerokości w jednym rzędzie -
      bez „schodków”; odliczania nie powtarzamy, bo stoi na pasku kilkadziesiąt pikseli wyżej;
   3) sklep i cennik: promocja jako część hero (`.sk-hero-promo`), nie osobna karta między nagłówkiem a hero. */
.zs-topbar-links { display: inline-flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px 14px; }
html.sk-promo-baner .zs-topbar--promo .zs-topbar-links { display: none; }
html.sk-promo-baner:not(.pb-embedded) .sk-promo-banner-until { display: none; }
.sk-promo-banner { display: grid; grid-template-columns: 1fr 1fr; justify-items: center; gap: 10px; margin-bottom: 10px; padding: 16px; text-align: center; }
.sk-promo-banner > * { grid-column: 1 / -1; }
.sk-promo-banner > .sk-promo-banner-btn { grid-column: auto; justify-self: stretch; justify-content: center; padding: 0 10px; }
.sk-promo-banner > .sk-promo-banner-btn:only-of-type { grid-column: 1 / -1; justify-self: center; padding: 0 22px; }
.sk-promo-banner .sk-hero-promo-tag .material-symbols-outlined { font-size: var(--fs-xl); }
/* Poza sklepem (pulpit rodzica, logowanie): baner ma szerokość pozostałych sekcji strony, nie 1120 px od lewej. */
.sk-promo-banner.pz-promo-note { max-width: none; margin: 0 0 16px; }
.sk-hero-promo { --promo-bg: var(--zs-ink); position: relative; display: grid; justify-items: center; gap: 10px; width: 100%; max-width: 100%; box-sizing: border-box; margin: 0 auto 22px; padding: 16px 18px; border: 1px solid color-mix(in srgb, var(--promo-accent) 55%, transparent); border-radius: var(--shape-lg); background: var(--promo-bg); color: var(--promo-ink); font-size: var(--fs-md); font-weight: var(--fw-bold); line-height: 1.35; text-align: center; }
.sk-hero-promo--blackweek { --promo-bg: var(--promo-blackweek-bg); --promo-accent: var(--promo-blackweek-accent); }
.sk-hero-promo--mikolaj { --promo-bg: var(--promo-mikolaj-bg); --promo-accent: var(--promo-mikolaj-accent); }
.sk-hero-promo-tag { display: inline-flex; align-items: center; gap: 6px; color: var(--promo-accent); font-size: var(--fs-sm); font-weight: var(--fw-heavy); letter-spacing: .06em; text-transform: uppercase; }
.sk-hero-promo-tag .material-symbols-outlined { font-size: var(--fs-xl); }
.sk-hero-promo-text { color: var(--promo-ink); }
.sk-hero-promo a.sk-hero-promo-link { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; padding: 0 18px; border-radius: var(--shape-full); background: var(--promo-accent); color: var(--promo-bg); font-weight: var(--fw-heavy); text-decoration: none; white-space: nowrap; }
.sk-hero-promo a.sk-hero-promo-link:hover { background: var(--promo-ink); }
.sk-hero-promo a.sk-hero-promo-link:focus-visible { outline: 3px solid var(--promo-ink); outline-offset: 2px; }
/* Cennik: nagłówek jest siatką z nazwanymi polami (CENNIK-PROBNA-BOX) - promocja ma własne pole „p” na górze, żeby
   nie wpadała w puste komórki siatki. Samo pole jest dopisane w ostatniej definicji siatki (SEZON-APLIKACJA, niżej),
   bo to ona obowiązuje. */
html.sk-kv .sk-cn-head .sk-hero-promo { grid-area: p; justify-self: stretch; width: auto; min-width: 0; margin: 0 0 26px; }
@media (min-width: 600px) {
  .sk-promo-banner:not(.sk-promo-banner--stack) { display: flex; gap: 8px 14px; margin-bottom: 0; padding: 12px 16px; }
  .sk-promo-banner:not(.sk-promo-banner--stack) > .sk-promo-banner-btn { padding: 0 18px; }
  .sk-promo-banner.pz-promo-note:not(.sk-promo-banner--stack) { margin-bottom: 16px; }
  /* na całą szerokość treści hero (właściciel 12.11): etykieta, tekst, przycisk przy prawej krawędzi */
  .sk-hero-promo { grid-template-columns: auto minmax(0, 1fr) auto; justify-items: start; align-items: center; gap: 6px 16px; padding: 10px 12px 10px 18px; text-align: left; }
}
@media (min-width: 900px) {
  html.sk-promo-baner .zs-topbar--promo .zs-topbar-links { display: inline-flex; }
}
/* PROMOCJE-KROKI (10.11, właściciel: „w niektórych miejscach jest za mało spacingu”): formularze promocji
   w panelu - równe odstępy między polami, pola w rzędach, które same łamią się na wąskim ekranie. */
.pr-form { display: grid; gap: 18px; max-width: 880px; }
.pr-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px 18px; align-items: start; }
.pr-form .field { display: grid; gap: 6px; margin: 0; }
.pr-form .dim-12 { line-height: var(--lh-base); }
.pr-check { display: flex; align-items: flex-start; gap: 10px; min-height: 28px; line-height: var(--lh-base); }
.pr-check input[type="checkbox"] { flex: none; margin-top: 3px; }
.pr-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 16px; padding-top: 4px; }
.pr-card-note { margin: 0 0 14px; }
/* PROMO-EFEKTY: czapka Mikołaja na logo (sklep i cennik: `.zh-logo`, panel: `.brand`) - tylko w motywie Mikołaj,
   narysowana w CSS (trójkąt z dwóch gradientów, biały otok, pompon). Nie zmienia logo ani układu. */
html.sk-promo--mikolaj .zh-logo, body:has(.promo-fx--mikolaj) .brand { position: relative; overflow: visible; }
html.sk-promo--mikolaj .zh-logo::before, body:has(.promo-fx--mikolaj) .brand::before { content: ""; position: absolute; left: -7px; top: -13px; width: 26px; height: 18px; transform: rotate(-16deg); border-bottom: 5px solid var(--promo-ink); border-radius: 0 0 4px 4px; background: linear-gradient(to bottom right, transparent 50%, var(--promo-mikolaj-bg) 51%) left / 50% 100% no-repeat, linear-gradient(to bottom left, transparent 50%, var(--promo-mikolaj-bg) 51%) right / 50% 100% no-repeat; filter: drop-shadow(0 1px 1px rgba(0, 0, 0, .28)); z-index: 2; pointer-events: none; }
html.sk-promo--mikolaj .zh-logo::after, body:has(.promo-fx--mikolaj) .brand::after { content: ""; position: absolute; left: 2px; top: -19px; width: 9px; height: 9px; border-radius: 50%; background: var(--promo-ink); box-shadow: 0 1px 1px rgba(0, 0, 0, .25); z-index: 2; pointer-events: none; }
.card > .pr-form { margin-top: 14px; }
.pr-left { margin-left: 8px; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* ─── SKLEP-LICZBY-ODDZIELONE (10.11, właściciel: „pasuje oddzielić hero od liczb, bo liczby są też w granacie
   i trochę nam się to zlewa… mamy jakiś zjeżdżający niebieski pasek na środku, to też chcemy usunąć”) ───
   „Liczby” dostają własny, ciemniejszy pas na całą szerokość ze skośną górną krawędzią (jak przejścia sekcji
   na stronie szkoły) - hero kończy się wyraźnie przed nim. Przerywana cyjanowa nitka na środku między
   sekcjami sklepu (scena -> „Znasz to?” -> historia) znika. */
html.sk-kv .zk-stage .zk-liczby { position: relative; isolation: isolate; margin-top: clamp(28px, 4vw, 56px); padding-top: clamp(64px, 8vw, 104px); }
html.sk-kv .zk-stage .zk-liczby::before { content: ""; position: absolute; z-index: -1; top: 0; bottom: calc(-1 * clamp(36px, 5vw, 56px)); left: calc(50% - 50vw); right: calc(50% - 50vw); background-color: color-mix(in srgb, var(--zs-ink) 72%, black); background-image: linear-gradient(var(--zs-scene-grid) 1px, transparent 1px), linear-gradient(90deg, var(--zs-scene-grid) 1px, transparent 1px); background-size: 28px 28px; clip-path: polygon(0 clamp(18px, 3vw, 44px), 100% 0, 100% 100%, 0 100%); }
html.sk-kv .zk-stage::after, html.sk-kv .zk-story::before, html.sk-kv .zk-stage + .zk-story .zk-pair--arrow::before { display: none; }

/* AS-02 (11.11, audyt strony): pod godzinami lekcji próbnej link „Żaden termin nie pasuje? Napisz do nas".
   Stoi za paskiem „Dalej" i znika, gdy pasek się pokaże (godzina wybrana) - w ramce hero o stałej wysokości
   nie może wypchnąć przycisku poza widok. Link jest w zdaniu, więc nie jest osobnym celem dotykowym. */
.pb-noslot { margin: 12px 0 0; color: var(--text-3); font-size: var(--fs-sm); text-align: center; }
.pb-noslot a { color: var(--primary); font-weight: var(--fw-bold); text-decoration: underline; text-underline-offset: 2px; }
.pb-next-bar:not([hidden]) + .pb-noslot { display: none; }
html.pb-kv .pb-noslot { color: var(--zs-mute); }
html.pb-kv .pb-noslot a { color: var(--zs-blue); }
html.pb-heroframe.pb-embedded .pb-noslot { margin: 8px 0 0; }

/* SKLEP-HERO-OKLADKI (11.11, właściciel: „w zbiorach na hero książki są trochę małe"): okładka w hero sklepu
   miała 151 px szerokości przy 1440 px (kolumna 0,6fr, obraz 46% pola), a w kolumnie tekstu zostawało ponad 100 px
   pustego miejsca. Teraz kolumna okładek bierze to, co zostaje po 720 px dla tekstu i odstępu (250-440 px), a obraz
   ma 48% pola: ok. 207 px przy 1440 i 1280 px (o 37% szersza), telefon 163 zamiast 147 px. Boczne okładki chowają się trochę głębiej za środkową
   (84% zamiast 96%), żeby obrócony róg nie wyszedł poza ekran. Szerokość kolumny liczona z miejsca, a nie z nowego
   progu (skala progów 600/900/1100): tekst ma zawsze co najmniej tyle, żeby tytuł został w 3 liniach. */
html.sk-kv .zk-hero-covers { width: min(100%, 340px); aspect-ratio: 10 / 7.4; }
html.sk-kv .zk-hero-covers img { width: 48%; }
html.sk-kv .zk-hero-covers img:nth-child(2) { translate: -84% 0; }
html.sk-kv .zk-hero-covers img:nth-child(3) { translate: -16% 0; }
@media (hover: hover) {
  html.sk-kv .zk-hero-covers:hover img:nth-child(2) { translate: -90% -6px; rotate: -12deg; }
  html.sk-kv .zk-hero-covers:hover img:nth-child(3) { translate: -10% -6px; rotate: 12deg; }
}
@media (min-width: 600px) { html.sk-kv .zk-hero-covers { width: 420px; } }
@media (min-width: 900px) {
  html.sk-kv .zk-hero--covers { grid-template-columns: minmax(0, 1fr) clamp(250px, calc(100% - 720px), 440px); }
  html.sk-kv .zk-hero--covers .zk-hero-covers { width: 100%; max-width: none; }
}
/* WWW-SZEROKOSCI, poprawka (11.11): po zwężeniu nagłówka do 1192 px na stronach z koszykiem (sklep) zabrakło 35 px
   i nazwa obok logo skracała się do „S...". Tam, gdzie jest koszyk, linki menu mają ciaśniejsze boki (11 zamiast 14 px).
   Klasa z szablonu (`_site_header.html`), nie `:has()`, żeby działało też w starszych przeglądarkach. */
.zh .zh-bar--cart .zh-nav a { padding-inline: clamp(8px, calc(8px + (100vw - 1100px) / 60), 11px); }

/* SEZON-APLIKACJA (11.11, właściciel: „możemy dodać motyw jesieni/wiosny/zimy, jak promocje nie będą aktywne? + lata"):
   żółta karteczka z tekstem pory roku i rysunek obok - w hero sklepu, w hero cennika i pod powitaniem na pulpicie
   rodzica. Wygląd jak karteczka w hero strony szkoły (zakreślacz, odręczny krój, lekki obrót). Na telefonie
   rysunek mniejszy, karteczka się zwęża. Przy „ogranicz ruch" nic się tu nie rusza. */
.sk-sezon { display: flex; align-items: flex-end; justify-content: center; gap: 12px; margin-top: 20px; }
.sk-sezon-note { margin: 0; padding: 10px 14px 11px; background: var(--zs-mark); color: var(--zs-ink); font-family: Caveat, "Caveat Fallback", cursive; font-weight: var(--fw-bold); font-size: var(--fs-xl); line-height: 1.15; text-align: left; rotate: -2deg; box-shadow: 0 10px 22px -14px rgba(0, 0, 0, .55); }
.sk-sezon-img { flex: none; width: 92px; height: auto; }
.sk-sezon--panel { justify-content: flex-start; margin-top: 14px; }
.sk-sezon--panel .sk-sezon-note { padding: 8px 14px 9px; }
.sk-sezon--panel .sk-sezon-img { width: 72px; }
@media (min-width: 600px) {
  .sk-sezon { gap: 16px; margin-top: 24px; }
  .sk-sezon-note { padding: 12px 18px 13px; font-size: var(--fs-2xl); }
  .sk-sezon-img { width: 120px; }
  .sk-sezon--panel { gap: 12px; margin-top: 14px; }
  .sk-sezon--panel .sk-sezon-note { padding: 8px 14px 9px; font-size: var(--fs-xl); }
  .sk-sezon--panel .sk-sezon-img { width: 84px; }
}
@media (min-width: 900px) { html.sk-kv .sk-sezon { justify-content: flex-start; } }
/* cennik: karteczka ma własne pole siatki pod odręcznym dopiskiem (telefon: nad kartą lekcji próbnej) */
html.sk-kv .sk-cn-head { grid-template-areas: "p" "e" "t" "s" "h" "z" "b"; }   /* „p” = promocja w hero (PROMOCJA-W-HERO) */
html.sk-kv .sk-cn-head .sk-sezon { grid-area: z; justify-content: flex-start; margin-bottom: 12px; }
@media (min-width: 900px) {
  html.sk-kv .pb-body:not(.pb-body--embedded) .sk-cn-head { grid-template-rows: 1fr auto auto auto auto auto auto 1fr; grid-template-areas: ". b" "p b" "e b" "t b" "s b" "h b" "z b" ". b"; }
}

/* SKLEP-W-PANELU-SZEROKO (12.11, właściciel: „jest wąsko trochę, możemy tam osadzić po prostu stronę 1:1?”):
   ramka sklepu w panelu (/konto/sklep) sięga od menu do prawej krawędzi okna - bez marginesów strony
   i limitu 1400 px, więc sklep ma w panelu te same proporcje co na stronie szkoły. */
.page:has(> .skp-wrap) { max-width: none; padding-left: 0; padding-right: 0; padding-top: 0; }
.page:has(> .skp-wrap) .skp-wrap { border-radius: 0; padding: 0; }
/* Pasek działów i koszyka w ramce: u rodzica zbędny (menu ma „Dokup lekcje”, koszyk pływa w rogu) i odsuwał
   sklep od góry („a tutaj ten nagłówek musi być?”). Klasę na <html> ramki ustawia pages/sklep-w-panelu.js
   (tylko rodzic - kursant nie ma „Dokup lekcje”, pasek jest jego wejściem do korepetycji); element zostaje
   w dokumencie, bo panel czyta z niego liczbę rzeczy w koszyku. */
html.sk-w-panelu .sk-embed-bar { display: none; }

/* DOKUP-WIERSZE (12.11, właściciel: „dokup lekcje: lepiej zrobić wybór poziomy, tak jak w cenniku”):
   gdy karta z cennikiem ma dość miejsca, pakiety stoją jeden pod drugim jako poziome wiersze (kafelek,
   nazwa, cena lekcji, całość, przycisk) - ten sam układ co cennik sklepu od 1100 px. Próg liczy się od
   szerokości KARTY (zapytanie kontenerowe), bo treść panelu jest węższa od okna o menu boczne; w węższej
   karcie i w przeglądarce bez zapytań kontenerowych zostają karty jak dotąd. Wcześniej trzy karty w rzędzie
   zostawiały czwartą samą w drugim. */
div.sk-cn-scope { container-type: inline-size; }
/* żółta taśma to ozdoba sklepu (tam chowa ją reguła html.sk-kv); w panelu wychodziła zza etykiety „Najczęściej wybierany” */
div.sk-cn-scope .zs-tape { display: none; }
@container (min-width: 940px) {
  div.sk-cn-scope .sk-cn-list { grid-template-columns: minmax(0, 1fr); }
  div.sk-cn-scope .sk-cn-row { grid-template-columns: 64px minmax(0, 1fr) 190px 190px 160px; grid-template-areas: "t n p s c";
    grid-template-rows: none; gap: 6px 16px; padding: 16px 24px; }
  div.sk-cn-scope :is(.sk-cn-tile, .sk-cn-info) { align-self: center; }
  div.sk-cn-scope .sk-cn-tile { width: 64px; height: 64px; border-radius: var(--shape-lg); }
  div.sk-cn-scope .sk-cn-tile b { font-size: var(--fs-3xl); }
  div.sk-cn-scope .sk-cn-per-num { font-size: var(--fs-display); }
  div.sk-cn-scope .sk-cn-zl { font-size: var(--fs-xl); }
  div.sk-cn-scope .sk-cn-total-num { font-size: var(--fs-3xl); }
  div.sk-cn-scope .sk-cn-zl--sm { font-size: var(--fs-lg); }
  div.sk-cn-scope :is(.sk-cn-per, .sk-cn-total) { grid-template-rows: 44px 18px; justify-items: center; text-align: center; }
  div.sk-cn-scope .sk-cn-row.has-gets { grid-template-areas: "t n p s c" "t g p s c"; }
  div.sk-cn-scope .sk-cn-row.has-gets:has(.sk-cn-more[open]) { grid-template-areas: "t n p s c" "t g g g g"; }
  div.sk-cn-scope .sk-cn-extras { display: grid; grid-template-columns: subgrid; row-gap: 6px; justify-items: center; align-items: start; }
  div.sk-cn-scope .sk-cn-extras > * { flex: none; grid-column: 2; padding: 4px 10px; }
  div.sk-cn-scope .sk-cn-extras .sk-cn-save { grid-column: 1; grid-row: 1; }
  div.sk-cn-scope .sk-cn-row.has-extra { grid-template-areas: "t n p s c" "t n x x c"; }
  div.sk-cn-scope .sk-cn-row.has-extra.has-gets { grid-template-areas: "t n p s c" "t g x x c"; }
  div.sk-cn-scope .sk-cn-row.has-extra.has-gets:has(.sk-cn-more[open]) { grid-template-areas: "t n p s c" "t . x x c" "t g g g g"; }
  div.sk-cn-scope .sk-cn-row.has-extra :is(.sk-cn-per, .sk-cn-total) { align-self: end; }
  div.sk-cn-scope .sk-cn-row.has-gets:has(.sk-cn-more[open]) .sk-cn-tile { align-self: start; margin-top: 4px; }
  div.sk-cn-scope .sk-cn-more { margin-top: -6px; }
  div.sk-cn-scope .sk-cn-more-btn { margin: 0 0 0 -12px; }
  div.sk-cn-scope .sk-cn-gets { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); }
}

/* LEKCJA-DO-POTWIERDZENIA (12.11, właściciel: „dajmy jej jakiś kolor, że wymaga potwierdzenia”): zaplanowana
   lekcja, której czas minął, a nikt jej nie oznaczył. Od wyłączenia nocnego zdejmowania terminu zostaje
   w kalendarzu - bursztynowa ramka i jasne tło odróżniają ją od zaplanowanej (niebieska) i od prośby
   o rezerwację (kreskowana). Kolory przez zmienne FullCalendara, jak reszta kafelków. */
#calendar .fc-event.cal-ev--overdue {
  --cal-c: var(--cal-booking);
  --fc-event-bg-color: color-mix(in srgb, var(--cal-booking) 24%, var(--surface)); --fc-event-border-color: var(--cal-booking);
  --fc-event-text-color: var(--text);
  color: var(--text); border-left-width: 4px;
}
.cal-dot[data-c="overdue"] { background: color-mix(in srgb, var(--cal-booking) 24%, var(--surface)); border: 2px solid var(--cal-booking); }
/* LEKCJA-POPRZEDNI-TERMIN (12.11): stary termin przełożonej albo odwołanej lekcji - mały, przekreślony */
.lt-prev { display: block; margin-top: 2px; color: var(--text-3); font-size: var(--fs-xs); font-weight: var(--fw-regular); }
.lt-prev s { text-decoration-thickness: 1.5px; }

/* PANEL-RODZIC-CZYTELNOSC (12.11, przegląd wyglądu, zgoda właściciela): drobne szare podpisy w panelu rodzica
   o stopień większe i ciemniejsze - 11 -> 12 px, 12 -> 13 px, kolor podpisów pomocniczych z `--text-3` na
   `--text-2`. Rodzic czyta panel głównie na telefonie; kadra zostaje przy gęstszym układzie. Zakres: karty
   i sekcje panelu rodzica (`.parent-card`, `.parent-section`, `.pz-dk-hero`), nic poza nimi. */
:is(.parent-card, .parent-section, .pz-dk-hero) :is(.dim-12, .pz-dim-12, .pz-fs-12, .lt-prev) { font-size: var(--fs-base); }
:is(.parent-card, .parent-section, .pz-dk-hero) .pz-dim-11 { font-size: var(--fs-sm); }
:is(.parent-card, .parent-section, .pz-dk-hero) :is(.dim-12, .lt-prev) { color: var(--text-2); }
:is(.parent-card, .parent-section) :is(.ple-mon, .ple-time) { font-size: var(--fs-sm); }

/* SKLEP-HERO-RAMKA (12.11, przegląd wyglądu): w ramce (panel rodzica, strona szkoły) nagłówek sklepu ma wysokość
   treści. Reguła „hero zajmuje pierwszy ekran” (min. 620 px, prośba właściciela dla strony) liczy ekran od
   wysokości okna, a w ramce „okno” to cała wysoka ramka - zostawał pas ok. 200 px pustego granatu pod
   przyciskami. Poza ramką bez zmian. */
@media (min-width: 900px) {
  html.sk-kv.pb-embedded .zk-stage .zk-hero { min-height: 0; }
}

/* CENNIK-CENA-Z-PROMOCJA (12.11, właściciel: „przekreślona cena standardowa i dodana w kolorze nowa + za cały pakiet
   cena też przeliczona”): przy lekcjach gratis zwykła cena lekcji i wartość wszystkich lekcji są przekreślone
   czerwonym długopisem, a cena z prezentem stoi w kolorze promocji (ten sam czerwony co skreślenie). */
/* Na telefonie i tablecie przekreślona kwota stoi NAD nową (nie obok): kolumny cen są wąskie i dwie kwoty w jednym
   wierszu rozpychały kartę, aż nazwa pakietu łamała się po słowie. Od 1100 px obie mieszczą się obok siebie. */
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.has-promo-price :is(.sk-cn-per, .sk-cn-total) .sk-cn-amt { position: relative; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row.has-promo-price { row-gap: 14px; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-old { position: absolute; left: 0; bottom: calc(100% - 2px); margin: 0; color: var(--sk-ink-muted); font-size: var(--fs-sm); font-weight: var(--fw-bold); text-decoration: line-through; text-decoration-color: var(--zs-pen); text-decoration-thickness: 2px; white-space: nowrap; }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-row .sk-cn-per--promo .sk-cn-per-num { background: none; -webkit-text-fill-color: currentColor; color: var(--zs-pen); }
:is(html.sk-kv, .sk-cn-scope) .sk-cn-gets-promo strong { color: var(--zs-pen); }
@media (min-width: 1100px) {
  :is(html.sk-kv, .sk-cn-scope) .sk-cn-old { position: static; align-self: center; margin-right: 6px; }
}
/* Przyciski banera trzymają się razem (wcześniej drugi spadał sam do nowej linii). */
.sk-promo-banner-btns { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 10px; justify-self: stretch; }
.sk-promo-banner-btns .sk-promo-banner-btn { justify-content: center; padding: 0 12px; }
@media (min-width: 600px) {
  .sk-promo-banner:not(.sk-promo-banner--stack) .sk-promo-banner-btns { display: inline-flex; flex: none; }
  .sk-promo-banner:not(.sk-promo-banner--stack) .sk-promo-banner-btns .sk-promo-banner-btn { padding: 0 18px; }
}

/* SKLEP-LICZBY-POD-ZNASZ (12.11): liczby jako osobna scena pod „Znasz to?” - własny odstęp od góry (wcześniej dawało go hero). */
html.sk-kv .zk-stage--liczby { margin-top: clamp(40px, 6vw, 64px); }
/* SKLEP-ZESTAWY-ODSTEP (12.11, właściciel: „więcej miejsca między zestawy a górą”) */
html.sk-kv .sk-zestawy { padding-top: clamp(32px, 5vw, 56px); }

/* CENNIK-CENY-PION (12.11, właściciel: „tutaj brak wyśrodkowania w pionie”): przy wysokim opisie pakietu (linia promocji)
   ceny z dodatkami stały przy dolnej krawędzi karty, a przycisk na środku. Opis zajmuje teraz dwa równe wiersze siatki:
   ceny kończą pierwszy, dodatki zaczynają drugi, więc cała grupa stoi na środku wysokości opisu. Rozwinięte „Co zawiera
   pakiet” zostaje przy dotychczasowym układzie. */
@media (min-width: 1100px) {
  html.sk-kv .sk-cn-row.has-extra:not(.has-gets) { grid-template-rows: 1fr 1fr; }
  /* z „Co zawiera pakiet”: dodatki zajmują drugi i trzeci wiersz (obok końca opisu i linku), więc karta nie rośnie
     o pusty pas pod cenami (właściciel 12.11: „czemu to tak dużo spacingu ma?”) */
  html.sk-kv .sk-cn-row.has-extra.has-gets:not(:has(.sk-cn-more[open])) { grid-template-rows: auto auto auto; grid-template-areas: "t n p s c" "t n x x c" "t g x x c"; }
  html.sk-kv .sk-cn-row.has-extra.has-gets:not(:has(.sk-cn-more[open])) .sk-cn-extras { align-self: center; }
}
