/* === Architektura warstw: vendor < components < utilities (bez !important) === */
@layer tokens, vendor, components, utilities;
/* Tokeny (marka, kolory, skale) - jedyne źródło; patrz app/static/tokens.css */
@import url("/static/tokens.css?v=2") 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=11") 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-cobalt 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 → Inter; 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 = Inter
   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; }
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);  }
.nav-item.disabled { opacity: 0.45; cursor: not-allowed; pointer-events: none; }
.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; }

/* ---------- 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; }

.crumbs strong { color: var(--text); font-weight: var(--fw-medium); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 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: 0.08em;
  font-weight: var(--fw-medium); 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); }
.stat-value     {
  font-size: 32px; font-weight: var(--fw-semibold); letter-spacing: -0.03em;
  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;
}
.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: 32px;
  border: 1px solid var(--outline);
  border-radius: var(--shape-sm);
  background: var(--surface);
  color: var(--text-2); font-size: var(--fs-base); font-weight: var(--fw-medium);
  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); }
.chip.active {
  background: var(--primary-container);
  color: var(--on-primary-container);
  border-color: transparent;
}
.chip.active .material-symbols-outlined { font-variation-settings: 'FILL' 1, 'wght' 500; }
.chip .count { font-family: "Inter"; 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(--outline-variant);
  border-radius: var(--shape-md);
  overflow: hidden;
}
table.leads { width: 100%; border-collapse: collapse; font-size: var(--fs-base); }
.tbl-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.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: 8px; 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); }
@media (max-width: 900px) {
  /* Tabele owinięte w .tbl-scroll: jeden rekord = jedna linia (override mobilnego stackingu table.leads); całość przewija się w bok. */
  .tbl-scroll table.leads { display: table; width: auto; min-width: 100%; }   /* nagłówek na całą szerokość karty, nie tylko pod widocznymi kolumnami */
  .tbl-scroll table.leads thead { display: table-header-group; }
  .tbl-scroll table.leads tbody { display: table-row-group; }
  .tbl-scroll table.leads tr,
  .tbl-scroll table.leads tr.row { display: table-row; }
  .tbl-scroll table.leads td,
  .tbl-scroll table.leads th { display: table-cell; white-space: nowrap; vertical-align: middle; }
  .tbl-scroll table.leads td::before { content: none; }
  /* Uszanuj hide-mobile (override nie może odkrywać tych kolumn) + schowaj akcje na mobile (akcje w drawerze po kliknięciu wiersza). */
  .tbl-scroll table.leads .hide-mobile { display: none; }
  .tbl-scroll table.leads .col-actions { display: none; }
}
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: "Inter"; 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-medium);
  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-medium);
}
.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); }
.status-select.status-new  { background-color: var(--c-new-bg);  color: var(--c-new);  border-left: 3px solid var(--c-new); }
.status-select.status-prog { background-color: var(--c-prog-bg); color: var(--c-prog); border-left: 3px solid var(--c-prog); }
.status-select.status-ok   { background-color: var(--c-ok-bg);   color: var(--c-ok);   border-left: 3px solid var(--c-ok); }
.status-select.status-rej  { background-color: var(--c-rej-bg);  color: var(--c-rej);  border-left: 3px solid var(--c-rej); }

/* ---------- 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-sm); color: var(--text-2); font-weight: var(--fw-medium); }
.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-section {
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  padding: 8px 12px; margin-bottom: 8px;
}
.rodo-section summary { cursor: pointer; font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--text-2); padding: 4px 0; }
.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 { background: oklch(0.97 0.015 90); border-color: oklch(0.88 0.06 90); }
.dr-danger { background: oklch(0.98 0.012 25); border-color: oklch(0.88 0.05 25); }
.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; }
.login-wrap { min-height: 100vh; display: grid; place-items: center; background: var(--bg); padding: 24px; }

.login-brand { display: flex; gap: 12px; margin-bottom: 24px; align-items: center; }
.login-title { margin: 0 0 6px; font-size: 20px; font-weight: var(--fw-semibold); letter-spacing: -0.015em; }
.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. */
.legal-card { max-width: 760px; }
.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); }

/* CTA na logowaniu rodzica — link do strony szkoły (darmowa lekcja próbna) */
.login-cta {
  margin-top: 22px; padding-top: 18px;
  border-top: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 12px;
  text-align: center;
}
.login-cta-txt { font-size: var(--fs-sm); color: var(--text-3); line-height: 1.55; }
.login-cta-txt strong { color: var(--text); }
.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, 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: "Inter", ui-monospace, monospace;
  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: 4px;
  background: none; border: none;
  color: var(--text-3); font-size: var(--fs-2xs); font-weight: var(--fw-medium);
  text-decoration: none; cursor: pointer;
  padding: 8px 2px 6px;
  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: linear-gradient(135deg,
    oklch(0.58 0.19 258 / 0.20),
    oklch(0.72 0.13 212 / 0.16));
}
.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); }

/* FAB — wystaje 14px nad pasek, 48x48, nie zwiększa szerokości slotu */
.bnav-fab {
  position: relative;
  /* FAB w pasku, nie nad nim — koniec z 'wylewającą się' lupką */
  margin-top: 0;
  padding-top: 0; padding-bottom: 0;
  justify-content: center;
  gap: 0;
}
.bnav-fab .bnav-ico {
  width: 44px; height: 44px;
  border-radius: var(--shape-full);
  background: var(--primary); color: var(--on-primary);
  display: grid; place-items: center;
  font-size: var(--fs-2xl); font-weight: var(--fw-regular);
  box-shadow: var(--elev-1);
  transition: box-shadow var(--motion-fast) var(--ease-std),
              transform var(--motion-fast) var(--ease-std);
}
.bnav-fab.active .bnav-ico { background: var(--primary); }
.bnav-fab:active .bnav-ico {
  box-shadow: var(--elev-1);
  transform: scale(0.96);
}

/* Bardzo wąskie ekrany — zwężamy pill i font, żeby na 320px nadal się mieściło */

/* ============================================================
   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 oklch(0.78 0.18 75); 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; }
.daily-empty {
  padding: 20px; text-align: center; color: var(--text-3);
  background: var(--surface-2); border-radius: var(--radius-sm);
  font-size: var(--fs-base);
}ack { 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);
}ard-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: "Inter"; 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: "Inter";
}

.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);
  background: linear-gradient(135deg, oklch(0.7 0.12 258), oklch(0.55 0.15 290));
  color: white; display: grid; place-items: center;
  font-weight: var(--fw-semibold); 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-semibold); letter-spacing: -0.02em; }
.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-timeline { display: flex; flex-direction: column; gap: 0; position: relative; }
.lesson-timeline::before {
  content: ""; position: absolute; top: 8px; bottom: 8px; left: 11px;
  width: 1px; background: var(--border);
}
.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-dot {
  width: 22px; height: 22px; border-radius: var(--shape-full);
  border: 2px solid var(--border);
  background: var(--surface);
  display: grid; place-items: center;
  font-size: var(--fs-xs);
  z-index: 1;
  margin-top: 4px;
}
.lesson-dot.done { background: var(--c-ok); border-color: var(--c-ok); color: var(--bg); }
.lesson-dot.pending { background: var(--surface); }
.lesson-dot.skipped { background: var(--c-rej-bg); border-color: var(--c-rej); color: var(--c-rej); }
.lesson-dot.rescheduled { background: var(--c-prog-bg); border-color: var(--c-prog); color: var(--c-prog); }

.lesson-body { min-width: 0; }
.lesson-date {
  font-size: var(--fs-xs); color: var(--text-3);
  font-family: "Inter"; letter-spacing: -0.01em;
}
.lesson-topic {
  font-size: var(--fs-md); font-weight: var(--fw-medium); margin-top: 2px;
}
.lesson-topic-cat { color: var(--text-3); font-weight: var(--fw-regular); font-size: var(--fs-sm); }
.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;
}
.lesson-attachments {
  display: flex; gap: 6px; flex-wrap: wrap; margin-top: 4px;
}
.lesson-attachment {
  display: inline-flex; align-items: center; gap: 4px;
  background: var(--surface-2); border: 1px solid var(--border);
  padding: 3px 8px; border-radius: var(--radius-sm);
  font-size: var(--fs-xs); color: var(--text-2);
}
.lesson-attachment::before { content: "📎"; font-size: var(--fs-xs); }
.lesson-actions { display: flex; gap: 4px; flex-shrink: 0; }

/* ---------- 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: "Inter"; 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: "Inter";
}
.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: "Inter"; 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.selected { border-color: var(--text); box-shadow: 0 0 0 1px var(--text); }
.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); }






/* ---------- Lesson card (in plan view) ---------- */
.lesson-cards { display: flex; flex-direction: column; gap: 10px; }
.lesson-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 14px 16px;
  display: grid; grid-template-columns: 56px 1fr auto; gap: 14px; align-items: start;
  transition: box-shadow 0.12s;
}
/* Wersja sortowalna — z dodatkowa kolumna 18px na drag handle ⋮⋮ */
.lessons-sortable .lesson-card { grid-template-columns: 18px 56px 1fr auto; }
.lesson-card:hover { box-shadow: var(--shadow-1); }
.lesson-card.done { background: oklch(0.985 0.01 155 / 0.6); }
html.dark .lesson-card.done { background: oklch(0.22 0.02 155 / 0.5); }
.lesson-card-date {
  text-align: center;
  font-family: "Inter"; font-size: var(--fs-xs); color: var(--text-3);
  line-height: 1.3;
  padding-top: 2px;
}
.lesson-card-date .day { font-size: var(--fs-2xl); color: var(--text); font-weight: var(--fw-semibold); display: block; line-height: 1.1; }
.lesson-card-body { min-width: 0; }
.lesson-card-title {
  font-size: var(--fs-md); font-weight: var(--fw-medium);
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
}
.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; }
.lesson-card-actions { display: flex; gap: 4px; flex-direction: column; }

/* 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: "Inter"; 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: 8px;
  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: "Inter"; 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: oklch(0.78 0.18 75);
}
.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: oklch(0.82 0.18 75);
}
.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: oklch(0.78 0.18 75); }
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 oklch(0.78 0.18 75);
  white-space: pre-wrap;
}
.lesson-feedback-inline {
  margin-top: 6px; padding: 6px 10px;
  background: var(--surface-2); border-radius: var(--radius-sm);
  display: flex; flex-direction: column; gap: 4px;
}
.pres-feedback-note {
  border-left: 3px solid oklch(0.78 0.18 75);
  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; }
.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-2xl); font-weight: var(--fw-semibold); letter-spacing: -0.02em;
  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); }

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

/* ---------- Print-friendly plan ---------- */
@media print {
  .lesson-card-actions, .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 .ico-big { font-size: var(--fs-2xl); line-height: 1.1; }
.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: "Inter"; 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: "Inter";
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.resource-actions { display: flex; gap: 4px; flex-shrink: 0; } ---------- Billing card ---------- */
.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: "Inter";
}

/* ---------- 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-body.loading::before {
  content: "💭 Generuję podsumowanie…";
  color: var(--text-3);
}
.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: "Inter"; 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: 8px;
  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: "Inter"; 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: "Inter";
  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);
}

/* ---------- 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;
  width: 100%; max-width: 480px;
  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: "Inter"; 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;
  grid-template-columns: repeat(4, 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: color-mix(in oklch, var(--surface) 85%, transparent);
  backdrop-filter: blur(18px) saturate(180%);
  -webkit-backdrop-filter: blur(18px) saturate(180%);
  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);
}

/* ============================================================
   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; }
.parent-dash-grid .parent-card-h.pz-card-h-13      { margin-bottom: 10px; }

/* ── 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-st-ring-pct, .pz-st-exam-days, .pz-sv-exam-days,
.pz-st-countdown-num, .pz-st-lesson-day, .pz-st-exam-today, .pz-st-countdown-today,
.pz-billing-total, .kanban-col-count, .tab-count, .pz-st-streak-val {
  font-family: inherit;   /* jedna rodzina: Inter */
  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: .07em;
  font-weight: var(--fw-semibold);
  color: var(--text-3);
}
@media (min-width: 901px) {
  table.leads td { padding-top: 13px; padding-bottom: 13px; }
}

/* ── 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: color-mix(in oklch, var(--surface) 88%, transparent);
  backdrop-filter: blur(14px) saturate(160%);
  -webkit-backdrop-filter: blur(14px) saturate(160%);
}
.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(--elev-3);
}

/* ── Topbar crumbs: spokojniejsze ── */
.crumbs {
  color: var(--text-3);
  display: flex;
  gap: 6px;
  align-items: center;
  min-width: 0;
  font-size: var(--fs-base);
}
.crumbs-sep {
  color: var(--text-3);
  opacity: .5;
}

/* ── 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 oklch, var(--c-prog) 45%, transparent); }
  50%      { box-shadow: 0 0 0 5px color-mix(in oklch, 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;
}
.page-head::before {
  content: '';
  position: absolute; inset: -28px -24px auto -24px; height: 150px;
  background:
    radial-gradient(420px 120px at 12% 0%, color-mix(in oklch, var(--primary) 7%, transparent), transparent 70%),
    radial-gradient(360px 100px at 85% 10%, color-mix(in oklch, var(--accent) 5%, transparent), transparent 70%);
  pointer-events: none;
  z-index: -1;
}

@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 oklch, 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 oklch, 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, #fff) !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 oklch, 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-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:8px; 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 oklch, 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 oklch, 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:12px; 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:8px; 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 oklch, 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:8px; }
.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 oklch, 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-select { width: 100%; min-height: 132px; padding: 4px; line-height: 1.6; }
.lesson-topics-select option { padding: 6px 8px; border-radius: var(--shape-xs); }
.lesson-topics-select option:checked { background: var(--primary-container); color: var(--text); font-weight: var(--fw-medium); }
.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 { width: 16px; height: 16px; flex-shrink: 0; cursor: pointer; accent-color: var(--primary); }
.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) */
.lesson-section { margin-bottom: 12px; border: 1px solid var(--border);
  border-radius: var(--shape-md); background: var(--surface); overflow: hidden; }
.lesson-section > summary.lesson-section-h { list-style: none; cursor: pointer;
  padding: 12px 16px; font-weight: var(--fw-semibold); font-size: 15px; display: flex; align-items: center;
  gap: 8px; background: var(--surface-1); }
.lesson-section > summary.lesson-section-h::-webkit-details-marker { display: none; }
.lesson-section > summary.lesson-section-h::before { content: "▸"; color: var(--text-3);
  transition: transform var(--motion-fast) var(--ease-std); }
.lesson-section[open] > summary.lesson-section-h::before { transform: rotate(90deg); }
.lesson-section .lesson-cards { padding: 12px 16px 16px; }

/* 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: 8px; 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: 12px;
  background: var(--surface, #fff);
}
.ple-date {
  flex: 0 0 auto; min-width: 52px; text-align: center;
  background: color-mix(in oklch, 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;
  margin-top: 12px; 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; }

/* Lewy pasek rodzica — zwijana grupa dziecka */
.parent-child-nav { margin: 0; }
.parent-child-summary {
  list-style: none; cursor: pointer; user-select: none;
  display: flex; align-items: center; gap: 4px;
}
.parent-child-summary::-webkit-details-marker { display: none; }
.parent-child-chev { font-size: var(--fs-xl); transition: transform .15s ease; opacity: .7; }
.parent-child-nav[open] .parent-child-chev { transform: rotate(180deg); }

/* Przycisk WhatsApp — markowy zielony + ikona SVG (bez wylewania czcionki ikon) */
.btn-whatsapp {
  background: var(--c-whatsapp);
  border-color: var(--c-whatsapp);
  color: #fff;
  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 oklch, 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 oklch, 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: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  /* 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 —
   Inter 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%) — Inter, gruby, elegancki */
.page-title,
.profile-stat-value,
[class*="stat-value"],
.pct-label {
  font-family: 'Inter', sans-serif;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.03em;
}

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

/* ═══════════════════════════════════════════════════════════
   BODY — gradient mesh background
   ═══════════════════════════════════════════════════════════ */
body {
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  background: var(--bg);
  color: var(--text);
  font-size: var(--fs-md);
  line-height: var(--lh-base);
  font-variant-numeric: tabular-nums;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  background-color: var(--bg);
  background-image: radial-gradient(ellipse at 15% 15%, oklch(0.84 0.08 260 / 0.28) 0px, transparent 55%),
    radial-gradient(ellipse at 85% 85%, oklch(0.82 0.07 310 / 0.20) 0px, transparent 55%),
    radial-gradient(ellipse at 50% 5%,  oklch(0.86 0.05 240 / 0.15) 0px, transparent 45%);
  background-attachment: fixed;
}
html.dark body {
  background-image:
    radial-gradient(ellipse at 15% 15%, oklch(0.22 0.10 260 / 0.50) 0px, transparent 55%),
    radial-gradient(ellipse at 85% 85%, oklch(0.20 0.08 310 / 0.35) 0px, transparent 55%),
    radial-gradient(ellipse at 50% 5%,  oklch(0.18 0.06 240 / 0.25) 0px, transparent 45%);
}

/* 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 {
  background: rgba(255,255,255,0.90);
  backdrop-filter: blur(32px) saturate(200%);
  -webkit-backdrop-filter: blur(32px) saturate(200%);
  border: 1px solid rgba(255,255,255,0.60);
  border-radius: var(--shape-xl);
  box-shadow:
    0 24px 64px oklch(0.505 0.240 260 / 0.15),
    0 8px 24px oklch(0 0 0 / 0.10);
}
html.dark .modal,
html.dark dialog.modal {
  background: rgba(20, 16, 36, 0.90);
  border-color: rgba(255,255,255,0.08);
  box-shadow:
    0 24px 64px oklch(0 0 0 / 0.50),
    0 8px 24px oklch(0 0 0 / 0.30);
}

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

.btn:hover {
  border-color: var(--outline);
  transform: translateY(-1px);
  box-shadow: 0 2px 12px oklch(0 0 0 / 0.10);
}
.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: rgba(255,255,255,0.85);
  border: 1px solid var(--border-strong);
  border-radius: var(--shape-sm);
  transition: border-color 140ms ease, box-shadow 140ms ease;
}
.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 oklch(0.505 0.240 260 / 0.18);
}
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: rgba(20, 16, 36, 0.70);
}

/* ═══════════════════════════════════════════════════════════
   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: "Inter";
  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: -0.03em;
  font-weight: var(--fw-bold);
  font-size: 17px;
  background: linear-gradient(135deg, var(--text) 0%, oklch(0.505 0.240 260) 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
html.dark .brand-name {
  background: linear-gradient(135deg, oklch(0.96 0.005 260), oklch(0.75 0.180 260));
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
.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: 12px;
}
html.dark img.brand-mark {
  background:
    linear-gradient(oklch(0.15 0.022 260), oklch(0.15 0.022 260)) padding-box,
    linear-gradient(135deg, oklch(0.750 0.180 260), oklch(0.74 0.15 215)) border-box;
}

/* Nav section labels */
.nav-label {
  text-transform: uppercase;
  padding: 12px 16px 6px;
  font-size: var(--fs-2xs);
  font-weight: var(--fw-bold);
  letter-spacing: 0.08em;
  color: var(--text-3);
}

/* Nav items */

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

/* Active state — indigo gradient */

html.dark .nav-item.active {
  background: linear-gradient(135deg,
    oklch(0.750 0.180 258 / 0.20),
    oklch(0.78 0.13 212 / 0.14));
  color: oklch(0.830 0.140 260);
  border-color: oklch(0.750 0.180 260 / 0.22);
}
html.dark .nav-item.active .nav-ico { color: oklch(0.830 0.140 260); }

/* 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: 12px;
  align-items: center;
  font-size: var(--fs-base);
  background: var(--surface-tint);
  border-radius: var(--shape-sm);
  border-top: none;
  margin: 0 4px 4px;
  padding: 10px 12px;
}

/* Avatar gradient — indigo marki, biały tekst (inicjały) */
.avatar, .who-avatar {
  background: linear-gradient(135deg,
    oklch(0.505 0.240 260),
    oklch(0.64 0.16 215)) !important;
  color: #fff;
  font-weight: var(--fw-bold);
  text-shadow: 0 1px 2px rgba(0,0,0,0.25);
}

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

html.dark .page-title {
  background: linear-gradient(135deg,
    oklch(0.96 0.005 260) 0%,
    oklch(0.80 0.150 260) 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

/* ═══════════════════════════════════════════════════════════
   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 oklch, var(--c-ok) 10%, var(--surface-2));
  border-color: color-mix(in oklch, var(--c-ok) 30%, var(--border));
  color: oklch(0.55 0.18 145);
}
.parent-toast--err {
  background: color-mix(in oklch, var(--c-rej) 8%, var(--surface-2));
  border-color: color-mix(in oklch, var(--c-rej) 25%, var(--border));
  color: oklch(0.55 0.20 25);
}
.parent-toast--info {
  background: color-mix(in oklch, oklch(0.60 0.18 250) 8%, var(--surface-2));
  border-color: color-mix(in oklch, 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 oklch, 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-semibold);
  margin: 0 0 12px;
  letter-spacing: -0.015em;
  font-size: var(--fs-lg);
  display: flex;
  align-items: center;
  gap: 8px;
}
.daily-h .material-symbols-outlined{color:var(--primary);font-size:20px}

/* ===== 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 (ten sam ciepły Inter) */

/* Delikatny, markowy scrollbar w obszarze treści */
.content::-webkit-scrollbar,main::-webkit-scrollbar{ width:10px;height:10px; }
.content::-webkit-scrollbar-thumb,main::-webkit-scrollbar-thumb{
  background:linear-gradient(180deg, oklch(0.55 0.19 258), oklch(0.70 0.14 212)); border-radius: var(--shape-full); }
.content::-webkit-scrollbar-thumb:hover,main::-webkit-scrollbar-thumb:hover{
  background:linear-gradient(180deg, oklch(0.50 0.21 258), oklch(0.64 0.16 212)); }
/* Paski postępu (plany/cele) — gradient marki, jeśli używają width inline */
.progress-fill,.plan-progress-fill,.bar-fill,.pct-fill,[data-progress] > span{
  background:var(--grad); }

/* 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);
  border-radius: 18px;
  box-shadow: 0 1px 2px oklch(0 0 0 / 0.04), 0 14px 30px -16px oklch(0.45 0.12 260 / 0.22);
  transition: transform var(--motion-fast) var(--ease-std), box-shadow var(--motion-fast) var(--ease-std);
}
.card:hover, .parent-card:hover {
  transform: translateY(-1px);
  box-shadow: 0 2px 6px oklch(0 0 0 / 0.05), 0 22px 44px -18px oklch(0.45 0.12 260 / 0.28);
}
html.dark .card, html.dark .parent-card, html.dark .form-card, html.dark .stat {
  background: var(--surface);
  border-color: var(--border);
  box-shadow: 0 1px 2px oklch(0 0 0 / 0.3), 0 16px 32px -18px oklch(0 0 0 / 0.5);
}
/* 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: 4px 0 32px oklch(0.505 0.240 260 / 0.06);
}
.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);
  background: oklch(1 0 0 / 0.88);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--border);
  box-shadow: 0 1px 20px oklch(0.505 0.240 260 / 0.05);
}
html.dark .sidebar, html.dark .topbar { background: var(--surface); }
html.dark .sidebar { box-shadow: 4px 0 32px oklch(0 0 0 / 0.30); }
html.dark .topbar { box-shadow: 0 1px 20px oklch(0 0 0 / 0.30); }
/* Typografia: mocniejsze nagłówki (jak w mockupie) */
.page-title {
  font-size: var(--fs-3xl);
  margin: 0;
  color: var(--text);
  letter-spacing: -0.03em;
  background: linear-gradient(135deg,
    oklch(0.20 0.025 260) 0%,
    oklch(0.505 0.240 260) 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  font-weight: var(--fw-bold);
}
.card-h, .parent-card-h {
  margin-bottom: 12px;
  font-weight: var(--fw-semibold);
}
/* Paski postępu: pełne zaokrąglenie + gradient marki */
.progress {
  height: 6px;
  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: trochę bardziej zaokrąglone (spójnie z kartami) */
.btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  border: 1px solid var(--outline);
  background: var(--surface);
  color: var(--text);
  padding: 0 18px;
  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),
    transform var(--motion-fast) var(--ease-std),
    box-shadow var(--motion-fast) var(--ease-std);
  border-radius: 12px;
}

/* ===== HERO (mockup rodzica) — gradient + pierścień postępu + pigułki. Reużywalny. ===== */
.solve-hero{ display:flex; align-items:center; gap:24px; padding:22px 26px; border-radius: var(--shape-lg);
  background:var(--grad); color:#fff; margin-bottom:12px;
  box-shadow:0 18px 40px -18px oklch(0.45 0.15 260 / 0.5), inset 0 1px 0 rgba(255,255,255,.18); }
.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-bold); line-height:1; }
.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-sm); opacity:.88; font-weight: var(--fw-medium); }
.solve-hero-title{ font-size:23px; font-weight: var(--fw-bold); letter-spacing:-.02em; margin:3px 0 13px; line-height:1.15; }
.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:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.24); 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 */
.content, 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); }
.lesson-item:hover, .les:hover, .lead:hover { background: oklch(0.62 0.06 260 / 0.05); border-radius: 12px; }

/* ===== 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(--grad); color:#fff; border-radius: var(--shape-md); padding:15px 18px; margin:12px 0;
  box-shadow:0 12px 26px -14px oklch(0.45 0.15 260 / 0.5); }
.pay-banner-lbl{ font-size: var(--fs-sm); opacity:.86; }
.pay-banner-val{ font-size:25px; font-weight: var(--fw-bold); letter-spacing:-.02em; line-height:1.1; }
.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); }
/* 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: gradient marki zamiast pomarańczu (też na hover!) */
.btn.accent {
  background: var(--grad);
  background-image: var(--grad);
  border-color: transparent;
  color: #fff;
  box-shadow: 0 8px 18px -8px oklch(0.50 0.16 260 / 0.5);
}
.btn.accent:hover {
  background: var(--grad);
  filter: brightness(1.05) saturate(1.04);
  box-shadow: 0 12px 26px -10px oklch(0.50 0.16 260 / 0.62);
}
html.dark .btn.accent{ box-shadow: 0 8px 18px -8px oklch(0.55 0.16 260 / 0.45); }
/* 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: 8px;
  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: 12px;
  font-weight: var(--fw-regular);
}
.nav-item.active {
  background: linear-gradient(135deg,
    oklch(0.58 0.19 258 / 0.16),
    oklch(0.72 0.13 212 / 0.14));
  color: oklch(0.42 0.16 255);
  border: 1px solid oklch(0.58 0.18 250 / 0.22);
  box-shadow: 0 8px 20px -12px oklch(0.58 0.15 235 / 0.45);
  font-weight: var(--fw-semibold);
}

/* A3 — ikony nawigacji monochromatyczne (jak w mockupie), aktywna biała */
.nav-item .nav-ico {
  color: var(--text-3);
}
.nav-item:hover .nav-ico {
  color: var(--text);
}
.nav-item.active .nav-ico {
  color: oklch(0.50 0.20 256);
}

/* 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 w kolorze marki (mockup ma niebieskie ikony przy etykietach) */
.card-h > .material-symbols-outlined:first-child,
.parent-card-h > .material-symbols-outlined:first-child { color: var(--primary); }
/* Liczby w tabelach — tabularne (równe kolumny kwot/godzin) */
table.leads, table.leads td, table.students td { font-variant-numeric: tabular-nums; }
/* Empty-state: ikona w kolorze marki + delikatne kółko */
.empty-ico, .pz-empty-ico { color: var(--primary); }
.empty-ico .material-symbols-outlined, .pz-empty-ico .material-symbols-outlined { color: var(--primary); }

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

@media (max-width: 360px) {
  .bnav-item { font-size: var(--fs-2xs); padding: 6px 1px 4px; }
  .bnav-item .bnav-ico { width: 48px; height: 28px; font-size: var(--fs-2xl); }
  .bnav-fab .bnav-ico { width: 40px; height: 40px; font-size: 20px; }
}

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

@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; }
  .crumbs-root, .crumbs-sep { display: none; }
}


@media (max-width: 600px) {
  .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. */
  .lesson-card, .lessons-sortable .lesson-card { display: block; }
  .lesson-card-date {
    text-align: left; margin-bottom: 8px; padding-top: 0;
    display: inline-flex; gap: 6px; align-items: baseline;
    color: var(--text-2); font-size: var(--fs-base);
  }
  .lesson-card-date br { display: none; }
  .lesson-card-date .day { font-size: 15px; display: inline; }
  .lesson-card-actions { flex-direction: row; justify-content: flex-end; margin-top: 4px; }   /* 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: 12px; }
  .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; } }

@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) {
  .bottom-nav {
    padding-top: 8px;
    padding-bottom: max(10px, 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: 26px;
    width: 54px; height: 32px;
  }
  .bnav-item .bnav-label {
    font-size: var(--fs-xs);
    margin-top: 3px;
  }
  .bnav-fab .bnav-ico {
    width: 52px; height: 52px;
    font-size: 26px;
  }
  /* 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; }
  .icon-btn { min-width: 44px; }
  .tab, .chip { display: inline-flex; align-items: center; }
}

@media (max-width: 900px) {
  .btn, .icon-btn { 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;
  }
  /* Sloty rezerwacji i czasy trwania — główne cele dotyku rodzica */
  .pz-slot-free, .pz-slot-booked { padding: 10px 14px; min-height: 42px; display: inline-flex; align-items: center; }
  .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-abs-center { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }
.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-card-h-13 { font-size: var(--fs-base); margin-bottom: 10px; }
.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-week-card    { margin-bottom: 10px; padding: 0; overflow: hidden; }
.pz-week-summary {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 16px; cursor: pointer; list-style: none;
  font-weight: var(--fw-semibold); font-size: var(--fs-base); }
.pz-week-chevron { font-size: var(--fs-xl); color: var(--text-2); }
.pz-week-body    { padding: 0 16px 14px; }
.pz-day-label    { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-2); margin-bottom: 6px; }
.pz-slot-booked {
  padding: 6px 12px; border-radius: var(--radius-sm); background: var(--surface-2);
  border: 1px solid var(--border); font-size: var(--fs-sm); color: var(--text-3);
  text-decoration: line-through; }
.pz-slot-free {
  padding: 6px 12px; border-radius: var(--radius-sm);
  background: color-mix(in oklch,var(--accent) 10%,var(--surface));
  border: 1px solid color-mix(in oklch,var(--accent) 30%,var(--border));
  font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--accent); cursor: pointer; }
.pz-slot-free--anim { transition: transform .1s ease, box-shadow .1s ease, background-color .1s ease, border-color .1s ease, color .1s ease, opacity .1s ease; }
.pz-slot-free--selected { background: var(--accent); border-color: var(--accent); color: white; }
.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 oklch,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 oklch,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 oklch,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); }
.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 oklch,var(--accent) 12%,var(--surface));
  border: 2px solid color-mix(in oklch,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 oklch,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 oklch,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 oklch,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: oklch(0.68 0.18 55); }
.pz-st-pending-row {
  display: flex; align-items: center; gap: 10px; padding: 10px 12px;
  background: color-mix(in oklch,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; }
.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 oklch,var(--c-ok) 12%,var(--surface-2)),var(--surface-2));
  border: 1px solid color-mix(in oklch,var(--c-ok) 30%,var(--border)); }
.pz-st-complete-ico   { font-size: 36px; margin-bottom: 8px; }
.pz-st-complete-title { font-size: var(--fs-lg); font-weight: var(--fw-bold); margin-bottom: 4px; }
.pz-st-ring-row  { display: flex; align-items: center; gap: 16px; margin-bottom: 14px; }
.pz-st-ring-wrap { flex-shrink: 0; position: relative; width: 72px; height: 72px; }
.pz-st-ring-svg  { transform: rotate(-90deg); display: block; }
.pz-st-ring-arc  { transition: stroke-dasharray .6s ease; }
.pz-st-ring-pct  { font-size: 15px; font-weight: var(--fw-black); line-height: 1; }
.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-stat-frac  { font-size: var(--fs-sm); font-weight: var(--fw-regular); color: var(--text-2); }
.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 oklch,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 oklch,var(--accent) 7%,var(--surface-2)),var(--surface-2));
  border: 1px solid color-mix(in oklch,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 oklch,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 oklch,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 oklch,var(--c-rej) 8%,var(--surface-2));
  border: 1px solid color-mix(in oklch,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 oklch,var(--c-ok) 12%,var(--surface-2)), var(--surface-2));
  border: 1px solid color-mix(in oklch,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-bc-border { border-color: var(--border); }
.pz-bc-text { border-color: var(--text); }
.pz-bg-surface-2 { background: var(--surface-2); }
.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-100 { max-width: 100px; }
.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-op-4 { opacity: 0.4; }
.pz-op-6 { opacity: 0.6; }
.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: 8px; 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); }
.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-info-strip  { background: var(--surface-2); padding: 10px 12px; border-radius: var(--radius-sm); border-left: 3px solid oklch(0.70 0.10 230); }
.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-mono-hint   { margin-top: 4px; font-family: 'Inter'; font-size: var(--fs-xs); display: none; }
.pz-pw-num-input   { width: 50px; padding: 3px 6px; font-size: var(--fs-sm); text-align: center; border: 1px solid var(--border); border-radius: 4px; background: var(--surface); color: var(--text); font-family: 'Inter'; }
.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-pw-lessons-wrap          { display: none; align-items: center; gap: 4px; }
.pz-pw-lessons-wrap--visible { display: flex; }
.pz-ai-start { align-items: flex-start; }
.pz-fs-24 { font-size: 24px; }
.pz-fs-26 { font-size: 26px; }
.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-36 { width: 36px; }
.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 oklch,var(--accent) 6%,var(--surface-2)); }
.pz-meta-strip  { display: flex; gap: 8px; padding: 5px 8px; background: var(--surface-2); border-radius: 4px; font-size: var(--fs-sm); }
.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-h-page      { font-size: 20px; font-weight: var(--fw-bold); margin: 0 0 2px; }
.pz-h-page-4    { font-size: 20px; font-weight: var(--fw-bold); margin: 0 0 4px; }
.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: oklch(0.60 0.18 250); }
.pz-strong-warn { font-weight: var(--fw-semibold); font-size: var(--fs-base); color: oklch(0.62 0.18 55); }
.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 oklch,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-bg-warn     { background: var(--c-warn); }
.pz-card-ok-outline  { margin-bottom: 14px; border: 1px solid color-mix(in oklch,var(--c-ok) 35%,var(--border)); background: color-mix(in oklch,var(--c-ok) 6%,var(--surface-2)); }
.pz-banner-ok        { padding: 10px 14px; background: color-mix(in oklch,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 oklch,var(--c-ok) 12%,var(--surface-2)); border: 1px solid color-mix(in oklch,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 oklch,var(--c-warn) 10%,var(--surface-2)); border: 1px solid color-mix(in oklch,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 oklch,var(--c-warn) 10%,var(--surface-2)); border: 1px solid color-mix(in oklch,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 oklch,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 oklch,var(--accent) 8%,var(--surface-2)); border: 1px solid color-mix(in oklch,var(--accent) 20%,var(--border)); border-radius: var(--radius-sm); text-align: center; flex-shrink: 0; }
.pz-card-accent-l    { margin-bottom: 14px; padding: 14px 16px; border-left: 3px solid var(--accent); }
.pz-card-warn-l      { padding: 14px 16px; border-left: 3px solid var(--c-warn); }
.pz-card-warn-l4     { border-left: 4px 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-mv-16-20    { margin: 16px 0 20px; }
.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; }
.pz-kpi-num          { font-size: 26px; font-weight: var(--fw-bold); color: var(--accent); }
.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-db-day-label         { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); text-transform: uppercase; letter-spacing: .05em; margin-top: 0; }
.pz-db-day-label--gap    { margin-top: 6px; }
.pz-status-glyph         { color: var(--text-3); }
.pz-status-glyph--done   { 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-mt-20 { margin-top: 20px; }
.pz-p-1-6 { padding: 1px 6px; }
.pz-p-10 { padding: 10px; }
.pz-p-10-10 { padding: 10px 10px; }
.pz-p-20 { padding: 20px; }
.pz-p-6-8 { padding: 6px 8px; }
.pz-p-8 { padding: 8px; }
.pz-p-8-10 { padding: 8px 10px; }
.pz-p-8-8 { padding: 8px 8px; }
.pz-ta-left { text-align: left; }
.pz-ta-right { text-align: right; }
.pz-bb-1       { border-bottom: 1px solid var(--border); }
.pz-bb-2       { border-bottom: 2px solid var(--border); }
.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  { width: 16px; height: 16px; accent-color: var(--accent); }
.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-list-hint-2  { font-size: var(--fs-sm); color: var(--text-2); margin: 0; padding-left: 16px; line-height: 2; }
.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 oklch,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; }
.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-p-8-6 { padding: 8px 6px; }
.pz-self-end { align-self: flex-end; }
.pz-w-120 { width: 120px; }
.pz-w-140 { width: 140px; }
.pz-w-24 { width: 24px; }
.pz-w-64 { width: 64px; }
.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 oklch, 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"] { accent-color: var(--accent); width: 15px; height: 15px; 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  { width: 18px; height: 18px; accent-color: var(--accent); }
.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-mt-n8-4      { margin-top: -8px; margin-bottom: 4px; }
.pz-mt-n8        { margin-top: -8px; }
.pz-float-right  { margin-left: auto; float: right; margin-top: -2px; }
.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); }pz-textarea-grow    { flex: 1; resize: none; font-size: var(--fs-base); }
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: 8px; font-size: var(--fs-sm); }
.pz-meta-wrap-12 { display: flex; flex-wrap: wrap; gap: 12px; padding: 12px; background: var(--surface-2); border-radius: 8px; 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: "Inter"; 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 oklch, var(--primary) 65%, oklch(0.72 0.16 200)));
}
.pz-st-hero {
  background: linear-gradient(135deg,color-mix(in oklch,var(--accent) 9%,var(--surface-2)),var(--surface-2));
  border: 1px solid color-mix(in oklch,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; }
.pz-slot-free, .pz-slot-booked { border-radius: var(--shape-sm); }

/* ===== 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; }
  /* 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; }
  table.leads tr.row > td:first-child { flex: 1 1 100%; }
  /* 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, .pz-pw-num-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; }

  /* Tabele oznaczone .pz-cards -> karty z etykietami zamiast scrolla (czytelne na telefonie) */
  .pz-tbl.pz-cards { display: block; white-space: normal; overflow: visible; }
  .pz-tbl.pz-cards thead { display: none; }
  .pz-tbl.pz-cards tbody, .pz-tbl.pz-cards tr { display: block; }
  .pz-tbl.pz-cards tr { border: 1px solid var(--border); border-radius: var(--shape-md); background: var(--surface); padding: 4px 12px; margin-bottom: 10px; box-shadow: var(--elev-1); }
  .pz-tbl.pz-cards td { display: flex; justify-content: space-between; align-items: center; gap: 14px; padding: 7px 0; border: none; text-align: right; }
  .pz-tbl.pz-cards td::before { content: attr(data-label); font-weight: var(--fw-semibold); color: var(--text-3); text-align: left; white-space: nowrap; }
  .pz-tbl.pz-cards td.pz-tbl-actions { justify-content: flex-end; padding-top: 8px; }
  .pz-tbl.pz-cards td.pz-tbl-actions::before { content: none; }
}
}

/* ---------- Gradebook / Oceny — zwijane karty uczniów ---------- */
.st-neutral { background: var(--c-new-bg); color: var(--text-3); }
.gb-summary { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; }
/* Pionowa lista zwiniętych uczniów (zamiast siatki kart) */
.gb-grid { display: flex; flex-direction: column; gap: 10px; max-width: 920px; }

/* 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 .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. */
@media (max-width: 700px) {
  .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; }

/* 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: 26px; font-weight: var(--fw-bold); letter-spacing: -0.03em; font-variant-numeric: tabular-nums; line-height: 1.15; }
.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 oklch, var(--accent) 28%, var(--border));
  box-shadow: 0 4px 14px -8px color-mix(in oklch, 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 oklch, var(--accent) 40%, var(--border));
  background: color-mix(in oklch, 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 oklch, 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 oklch, 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). */
.lessons-sortable .lesson-card:has(> .pz-bulk-pick) {
  grid-template-columns: 18px auto 56px 1fr auto;
}
.pz-bulk-pick { align-self: center; width: 16px; height: 16px;
  accent-color: var(--primary); 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) {
  body::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-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; gap: 14px; min-width: 0; }
.plan-side { display: grid; gap: 14px; position: sticky; top: 12px; }

.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 oklch, 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; 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 oklch, 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: 1fr 1fr; gap: 8px; margin: 0; }
.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 oklch, var(--primary) 6%, var(--surface)); border: 1px solid color-mix(in oklch, 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 oklch, 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 oklch, 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. */
  .parent-child-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; }
  .topic-cb::before { 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; }
  .pz-minw-260 { min-width: 260px; }
  .pz-bl-ok { border-left: 3px solid var(--c-ok); }
  .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: 8px; 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); }
  .brand-mark--glyph { width: 38px; height: 38px; border-radius: 11px; display: grid; place-items: center; flex: none; background: var(--grad); box-shadow: 0 8px 18px -8px oklch(0.52 0.2 262 / 0.7), inset 0 1px 0 oklch(1 0 0 / 0.45); }
  .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: 20px; }
  .confirm-msg { margin: 6px 0 0; font-size: 15px; 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: 10px; 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; 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: 1.5; }
.pb-dim { color: var(--text-3); font-weight: var(--fw-regular); }
.pb-inline-link { color: var(--primary); font-weight: var(--fw-semibold); }
.pb-meta { margin: 0 0 10px; display: flex; flex-wrap: wrap; gap: 4px 0; color: var(--text-3); font-size: var(--fs-sm); }
.pb-meta span + span::before { content: "·"; margin: 0 8px; color: var(--outline); }

/* 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-head { display: flex; gap: 14px; align-items: center; }
.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: 18px; 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: 96px; height: 96px; border-radius: 28px; font-size: var(--fs-2xl); }

/* 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: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; }
.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); }

/* 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: 20px; 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-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); }
.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 { font-size: 44px; color: var(--text-3); }

/* 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-h1 { font-size: var(--fs-display); }
  .pb-h1--sm { font-size: var(--fs-3xl); }
  .pb-day { min-height: 52px; }
}
@media (min-width: 900px) {
  .pb-layout { grid-template-columns: minmax(0, 1.3fr) minmax(320px, 1fr); gap: 20px; }
  .pb-panel--form { position: sticky; top: 16px; }
  .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(--grad); }
.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; }
