/* MateBAC — stylesheet */

:root {
  --bg: #f7f5f0;
  --bg-card: #ffffff;
  --bg-soft: #f0ede4;
  --ink: #1b2130;
  --ink-soft: #55596b;
  --ink-faint: #8a8d9c;
  --border: #e6e1d6;
  --accent: #2455d9;
  --accent-dark: #17348f;
  --accent-soft: #e8edfb;
  --warm: #e3672f;
  --warm-soft: #fbe9de;
  --success: #1f9d55;
  --success-soft: #e7f7ed;
  --danger: #d64545;
  --danger-soft: #fbeaea;
  /* Text de insignă pe fundal *-soft (warm/success/danger) — separat de --warm/--success/--danger
     (folosite ca fundal plin sau bordură) fiindcă are nevoie de propriul contrast pe *-soft,
     nu pe --bg-card; vezi redefinirea lor în dark mode mai jos. */
  --warm-ink: #a2481c;
  --success-ink: #146332;
  --danger-ink: #8f2b2b;
  /* Albastru închis fix, NU theme-aware — folosit doar pe câteva pastile/accente mereu
     „întunecate cu text alb" (logo-mark, subject-roman, hover-ul butoanelor primare), nu pe
     fundaluri mari de pagină (acelea folosesc --accent-soft, theme-aware). */
  --hero-g1: #17348f;
  --dot-color: rgba(27, 33, 48, 0.08);
  --header-bg: rgba(247, 245, 240, 0.92);
  /* Fundal fix, aproape negru — pentru pastile/insigne decorative gândite mereu "întunecate cu
     text alb" (profile-slider, subject-roman, feedback-fab etc.), NU pentru --ink (rolul ei
     principal e text, iar în dark mode devine deschisă — folosită ca fundal acolo ar întoarce
     complet contrastul). */
  --chip-dark: #1b2130;
  --radius-lg: 22px;
  --radius-md: 14px;
  --radius-sm: 9px;
  --shadow: 0 10px 30px rgba(27, 33, 48, 0.06);
  --shadow-sm: 0 4px 14px rgba(27, 33, 48, 0.05);
  --maxw: 1180px;
  /* Nu Space Grotesk — probabil cel mai reciclat font de titlu în site-uri "indie/generate cu
     AI" din ultimii ani, exact tell-ul vizual pe care îl scoatem din site (vezi restul
     schimbărilor din această sesiune). Fraunces e un serif de display cu caracter propriu
     (optical sizing — se îngroașă/ornamentează la corp mare), care se leagă vizual de
     --font-serif (deja folosit la glifele de capitol) în loc să introducă o a treia familie. */
  --font-display: "Fraunces", "Iowan Old Style", "Palatino Linotype", Georgia, serif;
  --font-serif: "Iowan Old Style", "Palatino Linotype", Georgia, serif;
  /* Curbă comună pentru sliderele de navigație (nav-indicator, profile-slider) — aceeași
     formă de easing, folosită identic în ambele locuri, centralizată ca să nu se dubleze
     valoarea "de mână" de fiecare dată. */
  --ease-standard: cubic-bezier(0.65, 0, 0.35, 1);
}

/* ---------- Dark mode (implicit după tema sistemului; togglu manual în header o suprapune) --- */
/* Redefinește doar tokenii semantici — restul fișierului îi consumă deja prin var(), deci nu
   mai e nevoie de reguli separate per componentă. Excepție deliberată care NU se redefinește
   aici: --hero-g1 (fix, vezi comentariul de la :root) — --accent-dark de mai jos e gândită
   doar pentru rolul ei de text.
   --accent-dark își schimbă complet rolul de la "text închis pe fundal deschis" la "text
   deschis pe fundal închis" — de-aia valoarea nu e doar "mai deschisă", ci o culoare nouă,
   aleasă pentru contrast pe --bg/--bg-card, nu o inversare mecanică.
   Două căi separate spre aceleași valori: media query (urmărește sistemul), suprimată explicit
   dacă utilizatorul a ales manual "light" din toggle (`:not([data-theme="light"])`); și atributul
   [data-theme="dark"], pentru cazul opus — utilizator pe sistem light care alege manual dark.
   `applyTheme()` din main.js pune/scoate atributul pe <html> înainte de primul paint vizibil
   (rulează sincron, înainte de DOMContentLoaded — body oricum pornește opacity:0), deci nu apare
   niciun flash de temă greșită la încărcare. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --bg: #0f121a;
    --bg-card: #171b26;
    --bg-soft: #1e2432;
    --ink: #eceef4;
    --ink-soft: #b8bccc;
    --ink-faint: #838a9e;
    --border: #2b3142;
    --accent: #4d80ff;
    --accent-dark: #9fbdff;
    --accent-soft: #223257;
    --warm: #ff8f5c;
    --warm-soft: #3a2416;
    --warm-ink: #ffb37a;
    --success: #3ecf7e;
    --success-soft: #123625;
    --success-ink: #7be3a8;
    --danger: #ff6b6b;
    --danger-soft: #3a1a1a;
    --danger-ink: #ff9d9d;
    --dot-color: rgba(255, 255, 255, 0.05);
    --header-bg: rgba(15, 18, 26, 0.85);
    --shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
    --shadow-sm: 0 4px 14px rgba(0, 0, 0, 0.4);
  }
}
:root[data-theme="dark"] {
  --bg: #0f121a;
  --bg-card: #171b26;
  --bg-soft: #1e2432;
  --ink: #eceef4;
  --ink-soft: #b8bccc;
  --ink-faint: #838a9e;
  --border: #2b3142;
  --accent: #4d80ff;
  --accent-dark: #9fbdff;
  --accent-soft: #223257;
  --warm: #ff8f5c;
  --warm-soft: #3a2416;
  --warm-ink: #ffb37a;
  --success: #3ecf7e;
  --success-soft: #123625;
  --success-ink: #7be3a8;
  --danger: #ff6b6b;
  --danger-soft: #3a1a1a;
  --danger-ink: #ff9d9d;
  --dot-color: rgba(255, 255, 255, 0.05);
  --header-bg: rgba(15, 18, 26, 0.85);
  --shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
  --shadow-sm: 0 4px 14px rgba(0, 0, 0, 0.4);
}

/* ---------- Print ---------- */
/* Zero reguli de print existau înainte — orice Cmd/Ctrl+P scotea header/footer/widget-uri
   incluse și, cu dark mode pornit, o pagină aproape neagră. Cel mai vizibil pe formule.html
   (o "fișă de recapitulare rapidă" care chiar merită printată înainte de BAC), dar regulile de
   mai jos sunt generale, nu specifice unei pagini — orice conținut nou beneficiază automat.
   Reia paleta light din :root, indiferent de [data-theme]/prefers-color-scheme — hârtia nu are
   temă întunecată, iar reutilizarea tokenilor (nu un set nou de culori doar pentru print)
   înseamnă că orice componentă care citește deja var(--bg-card) etc. arată corect fără nicio
   regulă suplimentară per componentă. */
@media print {
  /* Nu doar :root — trebuie cel puțin la fel de specific ca :root:not([data-theme="light"])
     (regula care aplică dark mode după sistem, din @media prefers-color-scheme) ȘI ca
     :root[data-theme="dark"] (togglul manual), altfel oricare din ele tot câștigă în interiorul
     acestui @media — imbricarea în print nu schimbă specificitatea. :not() contează specificitatea
     argumentului ei, deci :root:not([data-theme="light"]) e (0,0,2,0), nu (0,0,1,0) ca un simplu
     :root. Găsit direct testând cu dark mode pornit din sistem (fără toggle manual): textul din
     hero rămânea alb pe fundal alb, invizibil — --ink tot rezolva la valoarea din dark mode. */
  :root:not([data-theme="light"]), :root[data-theme="light"] {
    --bg: #f7f5f0;
    --bg-card: #ffffff;
    --bg-soft: #f0ede4;
    --ink: #1b2130;
    --ink-soft: #55596b;
    --ink-faint: #8a8d9c;
    --border: #e6e1d6;
    --accent: #2455d9;
    --accent-dark: #17348f;
    --accent-soft: #e8edfb;
    --warm: #e3672f;
    --warm-soft: #fbe9de;
    --warm-ink: #a2481c;
    --success: #1f9d55;
    --success-soft: #e7f7ed;
    --success-ink: #146332;
    --danger: #d64545;
    --danger-soft: #fbeaea;
    --danger-ink: #8f2b2b;
    --dot-color: transparent;
    --shadow: none;
    --shadow-sm: none;
  }
  .site-header, footer, .feedback-widget, .nav-toggle, .theme-toggle,
  .locked-card, .locked-overlay, .formula-quicknav, .btn, .expand-btn,
  .hero-math-bg, .demo-card {
    display: none !important;
  }
  body { padding-top: 0; opacity: 1 !important; }
  body::before { display: none; } /* glow-ul ambiental de fundal (doar desktop) — irelevant pe hârtie */
  * { box-shadow: none !important; text-shadow: none !important; }
  /* .hero/.page-hero folosesc deja tokeni theme-aware, deci ar printa corect oricum — scoatem
     totuși pata difuză de accent (irelevantă pe hârtie) și fixăm explicit culoarea, ca oricine
     printează cu dark mode pornit din sistem să nu depindă de cascada de mai sus. */
  .hero, .page-hero { background: none !important; padding: 20px 0 !important; }
  .hero *, .page-hero * { color: var(--ink) !important; }
  .hero .eyebrow, .page-hero .eyebrow { background: var(--bg-soft) !important; }
  .theory-box, .formula-item, .chapter-progress-item { break-inside: avoid; }
}

* { box-sizing: border-box; }
/* Fundal implicit pentru orice câmp de formular, indiferent de pagină — fără asta, un
   input/textarea nestilizat explicit rămâne pe albul implicit al browserului (corect în light
   mode, dar o cutie albă stridentă în dark mode, fiindcă --ink/--bg nu se moștenesc automat pe
   controale de formular). Regulile per-componentă mai specifice (.graph-input etc.) tot câștigă
   unde există. */
input, textarea, select { background: var(--bg-card); color: var(--ink); }
/* NU scroll-behavior:smooth global — browserul îl aplică și la sărituri automate spre o
   ancoră la încărcarea paginii (ex. "index.html#atlas"), ceea ce transformă un jump instant
   într-un scroll animat de câteva sute de ms peste tot conținutul intermediar; combinat cu
   reveal-ul pe scroll (IntersectionObserver), cardurile "apar" în cascadă pe parcursul acelui
   scroll, dând senzația de glitch semnalată explicit. Sări instant la încărcare; scroll-ul
   animat pentru click-uri intenționate pe ancore e făcut explicit din JS (initPageTransitions). */
[id] { scroll-margin-top: 84px; } /* header fix (68px) + puțină respirație, pentru orice ancoră */

html { background: var(--bg); }

/* Fundalul cu simboluri matematice (nu puncte în grilă — prea aproape de un tipar comun la alte
   site-uri din aceeași categorie, semnalat direct) e un SVG inline, nu elemente DOM: se
   întinde pe toată pagina, oricât de lungă, fără cost de randare suplimentar la scroll.
   fill="currentColor" + fill-opacity mic (nu var(--dot-color)) înseamnă că urmărește automat
   --ink, deci se reface corect în dark mode fără nicio regulă separată. */
body {
  margin: 0;
  padding-top: 68px; /* înălțimea .site-header, acum fixed — compensează spațiul scos din flux */
  background-color: var(--bg);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='280' height='280'%3E%3Ctext x='20' y='55' font-family='Georgia,serif' font-size='30' fill='currentColor' fill-opacity='0.055' transform='rotate(-10 20 55)'%3E%CF%80%3C/text%3E%3Ctext x='150' y='45' font-family='Georgia,serif' font-size='26' fill='currentColor' fill-opacity='0.05' transform='rotate(8 150 45)'%3E%E2%88%AB%3C/text%3E%3Ctext x='225' y='90' font-family='Georgia,serif' font-size='26' fill='currentColor' fill-opacity='0.055'%3E%E2%88%9A%3C/text%3E%3Ctext x='55' y='140' font-family='Georgia,serif' font-size='24' fill='currentColor' fill-opacity='0.05' transform='rotate(-6 55 140)'%3E%CE%A3%3C/text%3E%3Ctext x='185' y='160' font-family='Georgia,serif' font-size='22' fill='currentColor' fill-opacity='0.055'%3E%E2%88%9E%3C/text%3E%3Ctext x='20' y='215' font-family='Georgia,serif' font-size='20' fill='currentColor' fill-opacity='0.05' transform='rotate(6 20 215)'%3E%CE%94%3C/text%3E%3Ctext x='135' y='230' font-family='Georgia,serif' font-size='22' fill='currentColor' fill-opacity='0.055'%3E%C3%97%3C/text%3E%3Ctext x='235' y='245' font-family='Georgia,serif' font-size='20' fill='currentColor' fill-opacity='0.05'%3E%E2%88%82%3C/text%3E%3Ctext x='98' y='18' font-family='Georgia,serif' font-size='18' fill='currentColor' fill-opacity='0.05' transform='rotate(5 98 18)'%3Esin%3C/text%3E%3Ctext x='250' y='22' font-family='Georgia,serif' font-size='18' fill='currentColor' fill-opacity='0.045' transform='rotate(-4 250 22)'%3E%CE%B8%3C/text%3E%3Ctext x='8' y='100' font-family='Georgia,serif' font-size='17' fill='currentColor' fill-opacity='0.05' transform='rotate(-8 8 100)'%3Elim%3C/text%3E%3Ctext x='150' y='118' font-family='Georgia,serif' font-size='16' fill='currentColor' fill-opacity='0.045' transform='rotate(4 150 118)'%3E%C2%BD%3C/text%3E%3Ctext x='252' y='190' font-family='Georgia,serif' font-size='17' fill='currentColor' fill-opacity='0.05' transform='rotate(3 252 190)'%3Ecos%3C/text%3E%3Ctext x='95' y='270' font-family='Georgia,serif' font-size='18' fill='currentColor' fill-opacity='0.045' transform='rotate(-3 95 270)'%3E%E2%89%A4%3C/text%3E%3C/svg%3E");
  background-size: 280px 280px;
  color: var(--ink);
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, Roboto, Arial, sans-serif;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  opacity: 0;
  transition: opacity 0.2s ease;
}
body.page-ready { opacity: 1; }

/* Lumină albastră ambientă care "te urmărește" la scroll. Inițial parte din background-image-ul
   lui <body> cu background-attachment:fixed — corect vizual, dar costisitor: fixed pe un element
   cu MULT conținut deasupra (tot site-ul) obligă browserul să re-deseneze acel strat la fiecare
   cadru de scroll, fiindcă e tot una cu restul fundalului lui body, nu un layer separat. Simțit
   direct ca lipsă de fluiditate la scroll, semnalat imediat după primul deploy cu paleta lărgită
   (140% viewport, mai mult de re-desenat decât varianta inițială de 80%).
   Reparat mutând gradientul într-un pseudo-element propriu, fixed, fără alt conținut — browserul
   îl promovează într-un layer separat pe GPU și doar îl compune la scroll, fără să-l redeseneze;
   vizual identic, cost aproape de zero. Doar desktop — fixed are un istoric de glitch-uri pe
   Safari mobil, iar pe ecrane mici efectul nu se vede oricum (viewport prea îngust). */
@media (min-width: 900px) {
  body::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background: radial-gradient(ellipse 140% 100% at 50% 0%, rgba(36, 85, 217, 0.24), transparent 92%);
    will-change: transform;
  }
}

@media (prefers-reduced-motion: reduce) {
  body { opacity: 1; transition: none; }
}

h1, h2, h3, .logo { font-family: var(--font-display); letter-spacing: -0.01em; }

a { color: inherit; text-decoration: none; }
/* Inel de focus vizibil doar la navigare cu tastatura (:focus-visible, nu :focus) — mouse-ul nu
   declanșează inelul, dar Tab da. Elementele cu propriul stil de focus (input-uri, mai sus în
   fișier) rămân neafectate, regula lor e mai specifică. */
a:focus-visible, button:focus-visible, summary:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: 4px;
}
.chapter-card:focus-visible, .topic-card:focus-visible { transform: translateY(-3px); box-shadow: var(--shadow); }
img, svg { display: block; max-width: 100%; }
/* color: inherit lipsea — spre deosebire de text obișnuit (p, span, div), un <button> nu
   moștenește culoarea din browser, are propriul negru implicit din foaia de stil a agentului
   utilizator. Găsit direct: .quiz-opt (buton, fără color propriu) rezolva la rgb(0,0,0) în dark
   mode — text negru pe fundal aproape negru, aproape ilizibil. Afectează orice buton fără
   culoare explicită, nu doar grilele. */
button { font: inherit; cursor: pointer; color: inherit; }
ul { list-style: none; margin: 0; padding: 0; }

.wrap {
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 0 28px;
}

/* ---------- Header ---------- */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 50;
  background: var(--header-bg);
  backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--border);
}
.site-header .wrap {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 68px;
  /* Mai lat decât --maxw (1180px) — doar aici, nu și pe restul paginii. Cu 7 linkuri de
     navigare + comutator de profil + temă + buton de cont, conținutul chiar are nevoie de mai
     mult spațiu decât restul paginii (unde 1180px rămâne lățimea potrivită) — mai ales logat,
     când "Contul meu" mai adaugă câțiva pixeli. Vezi și breakpoint-ul ridicat la 1300px mai jos
     (media query-ul care ascunde .nav-main) — cele două merg împreună, nu separat: fără al
     doilea, un ecran de laptop obișnuit (1280px) ar ajunge exact în punctul mort dintre "prea
     îngust pentru 1220px" și "prea larg pentru hamburger". */
  max-width: 1220px;
}
.logo {
  display: flex;
  align-items: center;
  gap: 10px;
  font-weight: 800;
  font-size: 1.15rem;
  letter-spacing: -0.02em;
}
.logo-mark {
  width: 34px;
  height: 34px;
  border-radius: 10px;
  background: linear-gradient(135deg, var(--accent), var(--hero-g1));
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.05rem;
  font-weight: 800;
}
.logo .accent { color: var(--accent); }

.nav-main {
  position: relative;
  display: flex;
  align-items: center;
  gap: 4px;
}
.nav-indicator {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  background: var(--bg-soft);
  border-radius: var(--radius-sm);
  opacity: 0;
  /* S-a încercat aici doar transform (translateX + scaleX pe un element de 1px), ca să evite
     reflow-ul de la animarea `width` — dar orice border-radius nenul pe un element lat de 1px se
     clampează (per spec) la min(width,height)/2 pe AMBELE axe deopotrivă, deci rotunjimea
     verticală rămânea înghețată la ~0.5px indiferent de scaleX ulterior — colțurile sus/jos
     ieșeau practic drepte ("pătratice", semnalat direct). Revenit la animarea reală a `width`:
     reflow-ul e neglijabil pe un element atât de mic, izolat (position:absolute, nu afectează
     alte elemente din flux), iar corectitudinea vizuală a formei (acum colțuri rotunjite, nu
     pastilă) contează mai mult. */
  transition: transform 0.3s var(--ease-standard), width 0.3s var(--ease-standard), opacity 0.18s ease;
  will-change: transform, width;
  z-index: 0;
  pointer-events: none;
}
.nav-indicator.visible { opacity: 1; }
.nav-main a {
  position: relative;
  z-index: 1;
  padding: 9px 12px;
  border-radius: var(--radius-sm);
  font-size: 0.94rem;
  font-weight: 600;
  color: var(--ink-soft);
  white-space: nowrap;
  transition: color 0.15s;
}
.nav-main a.active {
  background: var(--bg-soft);
  color: var(--ink);
}
.nav-main a:hover { color: var(--ink); }
/* Fundalul static de mai sus e doar rezervă (mobil, unde .nav-main e display:none și
   indicatorul culisant nu poate calcula o poziție validă). Odată ce JS confirmă că poate
   poziționa indicatorul (desktop), îl dezactivăm aici, ca să nu apară dublu — o pastilă
   statică pe pagina activă ȘI indicatorul culisant pe link-ul aflat sub cursor. */
.nav-main.has-indicator a.active { background: none; }

.header-cta {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0; /* fără asta, .header-switchers de mai jos nu se poate micșora la rândul lui — vezi comentariul de-acolo */
}

/* Grupul de comutatoare (profil/generație/clasă) — pot ajunge la 3 grupuri de pastile deodată.
   Elementele flex NU se micșorează sub lățimea propriului conținut implicit (min-width:auto),
   ceea ce împingea #nav-toggle complet în afara ecranului pe orice viewport sub ~770px, odată
   cu al treilea comutator (clasa IX-XII) — prins direct testând la lățimi de telefon, nu doar
   citind codul. `min-width: 0` permite acestui grup să se micșoreze sub conținutul lui și să
   deruleze orizontal în loc să forțeze restul rândului (nav-toggle, auth-status) în afara
   ecranului — la fel ca orice bară de tab-uri responsivă. */
.header-switchers {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  row-gap: 8px;
  min-width: 0;
}
.header-switchers .profile-switch { flex-shrink: 0; }
/* Comutatorul de clasă (IX-XII) stă mereu pe rândul de sub cel de profil (M1/M2/M3) — nu doar
   când nu mai încape pe același rând (cerut explicit, ca cele două alegeri să nu se confunde
   vizual ca un singur grup). Universal, nu doar pe hamburger — și în sidebar-ul îngust de
   ≥1300px, unde acest rând ar fi derulat orizontal, ascuns, la fel ca bug-ul reparat mai jos. */
#liceu-grade-switcher { flex-basis: 100%; }

/* Iconițe SVG mici, monocrome — folosite peste tot în locul emoji-urilor colorate ca iconițe
   funcționale (meniu, temă, feedback, lacăt etc.); currentColor le leagă direct de culoarea
   textului/butonului care le conține, deci urmăresc automat tema, fără reguli separate. */
.icon {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  vertical-align: -3px; /* aliniere fină lângă text în context inline; ignorat, inofensiv, în containere flex */
}

.nav-toggle {
  display: none;
  background: none;
  border: 1px solid var(--border);
  border-radius: 10px;
  width: 40px;
  height: 40px;
  align-items: center;
  justify-content: center;
}

/* Link "Sări la conținut", injectat de initSkipLink() (main.js) — vizibil DOAR la focus de
   tastatură (:focus, nu :focus-visible — orice tip de focus pe un element altfel invizibil ar
   trebui să-l arate, indiferent cum a ajuns focusul acolo). Poziționat în afara ecranului până
   atunci, nu display:none — un element display:none nu poate primi niciodată focus prin Tab. */
.skip-link {
  position: fixed;
  top: -60px;
  left: 12px;
  z-index: 100;
  background: var(--accent);
  color: #fff;
  padding: 12px 20px;
  border-radius: var(--radius-sm);
  font-weight: 700;
  font-size: 0.92rem;
  transition: top 0.15s ease;
}
.skip-link:focus {
  top: 12px;
}
/* Buton de temă, injectat de initThemeToggle() (main.js) în .header-cta pe orice pagină —
   nemarcat static în HTML, ca să nu fie de adăugat manual pe cele 11 pagini cu header propriu. */
.theme-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  flex-shrink: 0;
  background: none;
  border: 1px solid var(--border);
  border-radius: 10px;
  font-size: 1.05rem;
  line-height: 1;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.theme-toggle:hover { border-color: var(--accent); background: var(--bg-soft); }

/* ---------- Profile switch (M1 / M2 / M3) ---------- */
.profile-switch {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 2px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 3px;
}
.profile-slider {
  position: absolute;
  top: 3px;
  left: 0;
  bottom: 3px;
  background: var(--chip-dark);
  border-radius: var(--radius-sm);
  /* Vezi comentariul din .nav-indicator (style.css) — same bug, same revenire la `width`. */
  transition: transform 0.32s var(--ease-standard), width 0.32s var(--ease-standard);
  will-change: transform, width;
  z-index: 0;
}
.profile-slider.no-transition { transition: none; }
.profile-pill {
  position: relative;
  z-index: 1;
  border: none;
  background: transparent;
  color: var(--ink-soft);
  font-weight: 800;
  font-size: 0.78rem;
  letter-spacing: 0.02em;
  padding: 7px 13px;
  border-radius: var(--radius-sm);
  transition: color 0.2s ease 0.05s;
}
.profile-pill:hover { color: var(--ink); }
.profile-pill.active { color: #fff; }

/* ---------- Popover compact pentru comutatoare (profil/generație/clasă) ----------
   Înainte, cele 2-3 pastile (.profile-switch) stăteau direct în antet, ca 1-2 rânduri întregi
   pe fiecare pagină — greutate vizuală mare, semnalată direct. Acum un singur buton compact
   ("M1 · XII") deschide un mic panou cu aceleași pastile, neschimbate — comportamentul lor
   (culisare, click, reload) rămâne identic, doar containerul e altul. */
.switcher-popover {
  position: relative;
  flex-shrink: 0;
}
.switcher-trigger {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 8px 12px;
  font-weight: 800;
  font-size: 0.78rem;
  letter-spacing: 0.02em;
  color: var(--ink);
  white-space: nowrap;
}
.switcher-trigger:hover { border-color: var(--accent); }
.switcher-trigger .icon-sm { width: 14px; height: 14px; transition: transform 0.15s ease; }
.switcher-trigger[aria-expanded="true"] .icon-sm { transform: rotate(180deg); }
.switcher-panel {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 20;
  flex-direction: column;
  align-items: flex-start !important;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md, 0 8px 24px rgba(0,0,0,0.12));
  padding: 12px;
  min-width: 220px;
}
.switcher-panel[hidden] { display: none; }
#liceu-grade-switcher.profile-switch { flex-basis: auto; } /* nu mai are nevoie de rând propriu, forțat, în interiorul panoului */

/* Bulă de tooltip proprie pentru [data-tooltip] — vezi initDataTooltips() în main.js.
   position:fixed + coordonate calculate în JS (nu CSS :hover::after), ca să nu depindă de
   containerul .header-switchers (overflow-x:auto — un absolute ar fi fost tăiat vertical). */
.data-tooltip-bubble {
  display: none;
  position: fixed;
  z-index: 999;
  background: var(--bg-card);
  color: var(--ink);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 8px 12px;
  font-size: 0.78rem;
  font-weight: 600;
  line-height: 1.4;
  max-width: 260px;
  box-shadow: var(--shadow);
  pointer-events: none;
}

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 12px 22px;
  border-radius: var(--radius-md);
  font-weight: 700;
  font-size: 0.96rem;
  border: 1px solid transparent;
  transition: transform 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;
  white-space: nowrap;
}
.btn:active { transform: translateY(1px); }
.btn-primary {
  background: var(--accent);
  color: #fff;
  box-shadow: 0 8px 20px rgba(36, 85, 217, 0.28);
}
.btn-primary:hover { background: var(--hero-g1); }
.btn-outline {
  background: transparent;
  color: var(--ink);
  border-color: var(--border);
}
.btn-outline:hover { background: var(--bg-soft); }
.btn-ghost {
  background: var(--bg-soft);
  color: var(--ink);
}
.btn-sm { padding: 8px 16px; font-size: 0.85rem; }
.btn-block { width: 100%; }
.btn[disabled] { opacity: 0.5; cursor: not-allowed; }

/* ---------- Hero ---------- */
/* Fundal deschis, theme-aware — o pată difuză de accent (--accent-soft, deja urmărește tema)
   peste fundalul normal al paginii, nu un panou opac fix indiferent de temă. Motivul matematic
   (.hero-math-bg) rămâne elementul vizual distinctiv, nu un gradient de tip "hero de SaaS". */
.hero {
  padding: 88px 0 96px;
  background: radial-gradient(ellipse 120% 70% at 50% 0%, var(--accent-soft), transparent 75%);
}
.hero .demo-card {
  box-shadow: var(--shadow);
}
.hero .wrap {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  gap: 56px;
  align-items: center;
}
/* Nu mai e pastilă plină, uppercase — exact tiparul folosit de alte site-uri din aceeași
   categorie (elearno.ro, semnalat direct). Bordură stângă colorată, ca la .theory-box/
   .formula-item — etichetă legată de restul limbajului vizual al site-ului, nu un "badge" generic
   împrumutat din alt loc. */
.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: none;
  border-left: 3px solid var(--accent);
  color: var(--accent-dark);
  font-weight: 800;
  font-size: 0.85rem;
  letter-spacing: 0.01em;
  padding: 2px 0 2px 12px;
  border-radius: 0;
  margin-bottom: 20px;
}
.hero h1 {
  font-size: clamp(2.2rem, 4.2vw, 3.4rem);
  line-height: 1.08;
  letter-spacing: -0.02em;
  margin: 0 0 20px;
  font-weight: 800;
}
.hero h1 .underline {
  position: relative;
  white-space: nowrap;
}
.hero h1 .underline::after {
  content: "";
  position: absolute;
  left: 2px;
  right: 2px;
  bottom: 6px;
  height: 10px;
  background: var(--warm);
  opacity: 0.35;
  border-radius: 6px;
  z-index: -1;
  transform: scaleX(0);
  transform-origin: left;
  animation: underline-in 0.4s cubic-bezier(.3,.8,.3,1) forwards;
  animation-delay: 0.5s;
}

/* Animație text: cuvintele titlului intră pe rând */
.hero h1 .word {
  display: inline-block;
  opacity: 0;
  transform: translateY(0.4em);
  animation: word-in 0.4s cubic-bezier(.2,.8,.2,1) forwards;
  animation-delay: calc(var(--i, 0) * 0.035s);
}
@keyframes word-in {
  to { opacity: 1; transform: translateY(0); }
}
@keyframes underline-in {
  to { transform: scaleX(1); }
}

/* ---------- Scroll reveal ---------- */
.reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.55s cubic-bezier(.2,.7,.2,1), transform 0.55s cubic-bezier(.2,.7,.2,1);
}
.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}
/* elemente deja vizibile chiar la încărcarea paginii — apar odată cu fade-ul paginii, nu
   cu propria animație de 0.55s (vezi initScrollReveal din main.js) */
.reveal.reveal-instant { transition: none; }

@media (prefers-reduced-motion: reduce) {
  .hero h1 .word { animation: none; opacity: 1; transform: none; }
  .hero h1 .underline::after { animation: none; transform: scaleX(1); }
  .reveal { opacity: 1; transform: none; transition: none; }
  .quiz-opt.is-correct, .quiz-opt.is-wrong, .quiz-result { animation: none; }
  .confetti-piece { display: none; }
  .skeleton-block { animation: none; background: var(--bg-soft); }
}
.hero p.lead {
  font-size: 1.12rem;
  color: var(--ink-soft);
  max-width: 46ch;
  margin: 0 0 28px;
}
.hero-ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 26px;
}
.hero-badges {
  display: flex;
  gap: 22px;
  flex-wrap: wrap;
}
.hero-badges .badge-item {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.88rem;
  color: var(--ink-soft);
  font-weight: 600;
}
.hero-badges .dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--success);
}

.countdown-strip {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 18px;
  padding: 10px 16px;
  background: var(--accent-soft);
  color: var(--accent-dark);
  border-radius: var(--radius-md);
  font-size: 0.9rem;
  font-weight: 700;
  width: fit-content;
}
/* Cifre "old-style" (înălțime variabilă, cu unele coborând sub linia de bază — ca-n cărțile
   tipărite clasic) în loc de cifrele tabulare, uniforme, din fontul sans implicit — Fraunces le
   are ca feature OpenType nativă (nu funcționează pe fontul sans, care n-o suportă). Aplicat DOAR
   pe cifre mari, "de vitrină" (countdown, scor), NU pe cifre din tabele/UI dens (admin, PAS 1/3
   etc.), unde înălțimea variabilă ar strica alinierea. */
.countdown-strip strong { font-size: 1.05rem; font-family: var(--font-display); font-variant-numeric: oldstyle-nums; }
.countdown-strip .countdown-note {
  font-weight: 500;
  font-size: 0.76rem;
  color: var(--ink-faint);
}

/* ---------- Hero demo card ---------- */
/* Ușor rotit, nu perfect drept — o pagină reală de caiet nu stă niciodată perfect aliniată la
   grid; se îndreaptă la hover (o pagină pe care "o ridici" să te uiți la ea). Ajută cardul să nu
   mai citească ca un mockup de aplicație generic (tiparul de "quiz plutitor în hero" e aproape
   identic la pbmate.ro, semnalat direct) — rotația singură schimbă senzația fără să atingă
   funcționalitatea reală a quiz-ului de dedesubt. */
/* Liniatură orizontală + margine roșie verticală, ca pe o foaie de caiet reală — DOAR aici, nu
   pe .quiz-card (interfața reală de exersat): acesta e un moment demonstrativ din hero, nu
   instrumentul serios pe care un elev îl citește cu atenție, sub presiune de timp. O textură
   decorativă în spatele unui enunț real ar fi un compromis de lizibilitate nejustificat acolo. */
.demo-card {
  background-color: var(--bg-card);
  background-image:
    linear-gradient(to right, transparent 15px, var(--warm) 15px, var(--warm) 16px, transparent 16px),
    repeating-linear-gradient(var(--bg-card), var(--bg-card) 25px, var(--border) 26px);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  padding: 22px;
  position: relative;
  transform: rotate(-1.4deg);
  transition: transform 0.25s ease;
  animation: demo-card-settle 0.5s cubic-bezier(.2,.8,.2,1) 0.55s both;
}
/* "Se deschide caietul": cardul pornește drept și puțin ridicat, se așază pe rotația lui finală
   chiar când titlul din stânga își termină animația cuvânt-cu-cuvânt (ultimul cuvânt + linia
   de subliniere termină în jur de 0.55-0.9s, vezi .hero h1 .word/.underline::after mai jos) —
   nu un efect separat, artificial, ci parte din aceeași intrare în pagină. O singură dată per
   încărcare, la fel ca restul animației din hero — nu la fiecare click intern (initPageTransitions
   nu re-rulează CSS-ul paginii, doar navighează normal). */
@keyframes demo-card-settle {
  from { transform: rotate(0deg) translateY(-8px); opacity: 0; }
  to { transform: rotate(-1.4deg) translateY(0); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .demo-card { animation: none; }
}
.demo-card:hover { transform: rotate(0deg); }
@media (prefers-reduced-motion: reduce) {
  .demo-card { transition: none; }
}
.demo-card-top {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 14px;
}
.demo-tag {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: var(--accent-soft);
  color: var(--accent-dark);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding: 5px 10px;
  border-radius: var(--radius-sm);
}
.demo-meta { font-size: 0.78rem; color: var(--ink-faint); font-weight: 600; }

.demo-progress {
  height: 6px;
  border-radius: 999px;
  background: var(--bg-soft);
  overflow: hidden;
  margin-bottom: 18px;
}
.demo-progress > div {
  height: 100%;
  background: var(--accent);
  border-radius: 999px;
  transition: width 0.25s ease;
}

.demo-question {
  font-family: var(--font-display);
  font-size: 1.4rem;
  font-weight: 700;
  margin: 4px 0 6px;
  letter-spacing: -0.01em;
}
.demo-subtext { color: var(--ink-faint); font-size: 0.85rem; margin-bottom: 16px; }

.demo-options {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.demo-opt {
  border: 1.5px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 13px 14px;
  font-weight: 700;
  font-size: 0.95rem;
  background: var(--bg-card);
  text-align: left;
  transition: border-color 0.15s, background 0.15s;
}
.demo-opt:hover { border-color: var(--accent); }
.demo-opt.is-correct { background: var(--success-soft); border-color: var(--success); color: var(--success-ink); }
.demo-opt.is-wrong { background: var(--danger-soft); border-color: var(--danger); color: var(--danger-ink); }

.demo-footer {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px dashed var(--border);
  font-size: 0.82rem;
  color: var(--ink-faint);
  display: flex;
  justify-content: space-between;
}

/* ---------- Section shell ---------- */
section { padding: 72px 0; }
.section-head {
  max-width: 620px;
  margin: 0 0 44px;
}
.section-kicker {
  color: var(--accent);
  font-weight: 800;
  font-size: 0.82rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  margin-bottom: 10px;
}
.section-head h2 {
  font-size: clamp(1.7rem, 2.6vw, 2.3rem);
  letter-spacing: -0.02em;
  margin: 0 0 12px;
  font-weight: 800;
}
.section-head p {
  color: var(--ink-soft);
  font-size: 1.03rem;
  margin: 0;
}
.section-alt { background: var(--bg-card); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }

/* ---------- Steps ---------- */
.steps {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 22px;
}
.step-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 26px;
  box-shadow: var(--shadow-sm);
  display: flex;
  flex-direction: column;
  gap: 12px;
  transition: transform 0.18s ease, box-shadow 0.18s ease;
}
.step-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); }
.step-num {
  width: 34px;
  height: 34px;
  border-radius: 10px;
  background: var(--accent-soft);
  color: var(--accent-dark);
  font-weight: 800;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.95rem;
}
.step-card:nth-child(2) .step-num { background: var(--warm-soft); color: var(--warm); }
.step-card:nth-child(3) .step-num { background: var(--success-soft); color: var(--success); }
.step-eyebrow { font-size: 0.72rem; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-faint); }
.step-card h3 { margin: 0; font-size: 1.15rem; font-weight: 800; }
.step-card p { margin: 0; color: var(--ink-soft); font-size: 0.94rem; }
.step-card .step-visual { margin-top: 6px; }
.step-card .btn { margin-top: auto; align-self: flex-start; }

.mini-quiz-preview {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 12px;
  background: var(--bg-soft);
  font-size: 0.85rem;
}
.mini-quiz-preview .row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 6px 8px;
  border-radius: 8px;
  font-weight: 600;
}
.mini-quiz-preview .row.correct { background: var(--success-soft); color: var(--success-ink); }

.score-preview {
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 14px;
}
.score-preview .big { font-size: 1.7rem; font-weight: 800; font-family: var(--font-display); font-variant-numeric: oldstyle-nums; }
.score-preview .bar { height: 8px; border-radius: 999px; background: var(--border); overflow: hidden; margin: 8px 0; }
.score-preview .bar > div { height: 100%; background: var(--success); width: 75%; }

/* ---------- Grading / barem section ---------- */
.barem-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
  align-items: start;
}
.barem-list {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.barem-list li, .barem-item {
  display: flex;
  gap: 12px;
  align-items: flex-start;
  font-size: 0.98rem;
  color: var(--ink-soft);
}
.barem-item .ico {
  width: 26px; height: 26px; border-radius: 50%;
  background: var(--accent-soft); color: var(--accent-dark);
  display: flex; align-items: center; justify-content: center;
  font-size: 0.8rem; font-weight: 800; flex-shrink: 0; margin-top: 2px;
}
.barem-item .ico .icon { width: 15px; height: 15px; vertical-align: 0; }
.barem-actions { display: flex; gap: 12px; margin-top: 22px; flex-wrap: wrap; }

.grade-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 24px;
  box-shadow: var(--shadow);
}
.grade-card .score-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  margin-bottom: 16px;
}
.grade-card .score-row .num { font-size: 2rem; font-weight: 800; font-family: var(--font-display); font-variant-numeric: oldstyle-nums; }
.grade-card .score-row .den { color: var(--ink-faint); font-weight: 700; }
.feedback-line {
  display: flex;
  gap: 10px;
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  font-size: 0.9rem;
  margin-bottom: 10px;
  line-height: 1.45;
}
.feedback-line.ok { background: var(--success-soft); color: var(--success-ink); }
.feedback-line.warn { background: var(--warm-soft); color: var(--warm-ink); }
.feedback-line.info { background: var(--accent-soft); color: var(--accent-dark); }

.progress-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 24px;
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.progress-caption { margin: 0; font-size: 0.85rem; font-weight: 700; color: var(--ink-soft); }
.progress-chart {
  display: flex;
  align-items: flex-end;
  gap: 12px;
  height: 160px;
}
.progress-bar {
  flex: 1;
  height: var(--h);
  background: var(--bg-soft);
  border-radius: 10px 10px 4px 4px;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding-top: 8px;
}
.progress-bar.is-latest { background: var(--accent); }
.progress-value { font-size: 0.78rem; font-weight: 800; color: var(--ink-soft); }
.progress-bar.is-latest .progress-value { color: #fff; }

/* ---------- Topic grid (Atlas) ---------- */
.subject-block { margin-bottom: 40px; }
.subject-block-head {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: 18px;
}
.subject-roman {
  width: 42px; height: 42px;
  border-radius: 12px;
  background: var(--chip-dark);
  color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-weight: 800; font-size: 1.1rem;
  box-shadow: 0 6px 14px rgba(27, 33, 48, 0.22);
}
.subject-block:nth-of-type(1) .subject-roman { background: linear-gradient(155deg, #3d6bf0, var(--hero-g1)); box-shadow: 0 6px 14px rgba(36, 85, 217, 0.35); }
.subject-block:nth-of-type(2) .subject-roman { background: linear-gradient(155deg, #f0895a, #b8451a); box-shadow: 0 6px 14px rgba(227, 103, 47, 0.35); }
.subject-block:nth-of-type(3) .subject-roman { background: linear-gradient(155deg, #34c176, #12723d); box-shadow: 0 6px 14px rgba(31, 157, 85, 0.35); }
.subject-block-head h3 { margin: 0; font-size: 1.2rem; font-weight: 800; }
.subject-block-head span { color: var(--ink-faint); font-size: 0.85rem; font-weight: 600; }

.topic-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
}
.topic-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 18px;
  box-shadow: var(--shadow-sm);
  display: flex;
  flex-direction: column;
  gap: 10px;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.topic-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); }
.topic-card-top { display: flex; align-items: flex-start; justify-content: space-between; }
.topic-num { font-size: 0.78rem; color: var(--ink-faint); font-weight: 800; }

/* Insignă cu glyph matematic per capitol — colorată pe subiect (I/II/III), aceeași
   paletă ca .subject-pill / .subject-roman, ca fiecare capitol să se distingă vizual. */
.topic-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 40px;
  height: 32px;
  padding: 0 8px;
  border-radius: 10px;
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: 0.92rem;
  background: var(--accent-soft);
  color: var(--accent-dark);
  flex-shrink: 0;
}
.topic-icon.subject-II { background: var(--warm-soft); color: var(--warm-ink); }
.topic-icon.subject-III { background: var(--success-soft); color: var(--success-ink); }
.topic-card h4 { margin: 0; font-size: 1.02rem; font-weight: 800; line-height: 1.3; }
.topic-card p { margin: 0; font-size: 0.85rem; color: var(--ink-soft); }
.topic-meta { font-size: 0.72rem; font-weight: 800; letter-spacing: 0.04em; text-transform: uppercase; color: var(--accent-dark); }
.topic-meta-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.topic-progress { height: 5px; border-radius: 999px; background: var(--bg-soft); overflow: hidden; }
.topic-progress > div { height: 100%; background: var(--accent); }

/* ---------- Daily test / duel ---------- */
.two-col-cta {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
}
.cta-card {
  border-radius: var(--radius-lg);
  padding: 28px;
  color: #fff;
  display: flex;
  flex-direction: column;
  gap: 10px;
  box-shadow: var(--shadow);
}
/* Fundal plat, nu gradient diagonal — --accent și --chip-dark sunt deja gândite ca fundaluri
   pline cu text alb (vezi .btn-primary, .subject-roman), reutilizate aici direct. */
.cta-card.blue { background: var(--accent); }
.cta-card.dark { background: var(--chip-dark); }
.cta-card h3 { margin: 0; font-size: 1.3rem; font-weight: 800; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.cta-card p { margin: 0; opacity: 0.88; font-size: 0.95rem; }
.cta-card .btn { margin-top: 8px; align-self: flex-start; background: #fff; color: #1b2130; box-shadow: none; }

/* ---------- Press mention ---------- */
.press-strip {
  text-align: center;
  color: var(--ink-faint);
  font-size: 0.85rem;
}

/* ---------- Footer ---------- */
footer {
  border-top: 1px solid var(--border);
  padding: 40px 0 30px;
  color: var(--ink-faint);
  font-size: 0.85rem;
}
footer .foot-top {
  display: flex;
  justify-content: space-between;
  gap: 20px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}
footer .foot-cols { display: flex; gap: 46px; flex-wrap: wrap; }
footer .foot-cols h5 { margin: 0 0 10px; color: var(--ink); font-size: 0.85rem; }
footer .foot-cols a { display: block; margin-bottom: 8px; color: var(--ink-faint); }
footer .foot-cols a:hover { color: var(--ink); }
footer .disclaimer { max-width: 760px; line-height: 1.6; border-top: 1px solid var(--border); padding-top: 18px; }
/* Insigne spre platformele de soluționare a litigiilor (SOL/ODR + ANPC), cerute explicit ca
   echivalent al celor de pe e-learno.ro — text simplu, nu logo-urile lor oficiale (nu avem o
   sursă verificată pentru imaginile alea), stilizate ca insignele deja folosite pe site
   (.difficulty-badge/.tier-badge), nu copiate vizual de pe alt site. */
.adr-badges { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }
.adr-badge {
  display: inline-flex;
  align-items: center;
  padding: 4px 11px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.02em;
  color: var(--ink-faint);
}
.adr-badge:hover { color: var(--accent); border-color: var(--accent); }

/* ---------- Inner pages (chapters, quiz, simulare) ---------- */
/* Aceeași pată difuză de accent ca hero-ul de pe homepage, comprimată pe o bandă mai scundă —
   consistență vizuală pe tot site-ul, fără să fie la fel de „încărcat" pe pagini vizitate des. */
.page-hero {
  padding: 44px 0 56px;
  background: radial-gradient(ellipse 120% 100% at 50% 0%, var(--accent-soft), transparent 80%);
}
.page-hero h1 {
  font-size: clamp(1.8rem, 3vw, 2.4rem); margin: 0 0 10px; font-weight: 800; letter-spacing: -0.02em;
}
.page-hero p { color: var(--ink-soft); max-width: 60ch; margin: 0; }
.page-hero .breadcrumb a:hover { color: var(--accent); }

/* accent tipografic — serif elegant, rezervat pentru un singur moment special pe pagină,
   nu peste tot (contrast față de Space Grotesk-ul folosit la restul titlurilor) */
.font-serif { font-family: var(--font-serif); font-weight: 700; letter-spacing: 0; }

/* pagina de Planuri primește mai multă „atenție" — hero mai înalt, gradient care curge
   mai jos decât pe celelalte pagini interioare */
.page-hero-lg { padding-top: 76px; padding-bottom: 140px; }
.page-hero-lg .eyebrow { font-size: 0.82rem; padding: 8px 16px; }
.page-hero-lg h1 { font-size: clamp(2.1rem, 4vw, 3rem); }

.breadcrumb { font-size: 0.85rem; color: var(--ink-faint); margin-bottom: 14px; }
.breadcrumb a:hover { color: var(--accent); }

.chapters-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  padding: 20px 0 60px;
}
.chapter-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 22px;
  box-shadow: var(--shadow-sm);
  display: flex;
  flex-direction: column;
  gap: 12px;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.chapter-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); }
.chapter-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.chapter-card .subject-pill {
  align-self: flex-start;
  background: var(--accent-soft);
  color: var(--accent-dark);
  font-size: 0.7rem;
  font-weight: 800;
  padding: 4px 10px;
  border-radius: var(--radius-sm);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
/* aceeași paletă I/II/III (albastru/cald/verde) ca insignele mari din Atlasul de examen */
.chapter-card .subject-pill.subject-II { background: var(--warm-soft); color: var(--warm-ink); }
.chapter-card .subject-pill.subject-III { background: var(--success-soft); color: var(--success-ink); }
.chapter-card h3 { margin: 0; font-size: 1.15rem; font-weight: 800; }
.chapter-card p { margin: 0; color: var(--ink-soft); font-size: 0.9rem; flex-grow: 1; }
.difficulty-badge {
  display: inline-flex;
  align-items: center;
  padding: 2px 9px;
  border-radius: var(--radius-sm);
  font-size: 0.68rem;
  font-weight: 800;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  flex-shrink: 0;
}
.difficulty-badge.diff-usor { background: var(--success-soft); color: var(--success-ink); }
.difficulty-badge.diff-mediu { background: var(--warm-soft); color: var(--warm-ink); }
.difficulty-badge.diff-avansat { background: var(--danger-soft); color: var(--danger-ink); }
.chapter-card .chapter-foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.8rem;
  color: var(--ink-faint);
  font-weight: 700;
}

/* Arhivă subiecte oficiale BAC — an + listă de sesiuni, fiecare cu subiect+barem per profil
   (M1/M2 științe/M2 tehnologic/M3), extrase din arhiva oficială/e3.ro, fără Istorie —
   populată de JS din assets/subiecte-bac/profiles/manifest.json, vezi subiecte-bac.html */
.archive-year-block { margin-bottom: 34px; }
.archive-year-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 14px; }
.archive-year-head h2 { margin: 0; font-size: 1.5rem; font-weight: 800; }
.archive-year-head .archive-year-tag { font-size: 0.85rem; color: var(--ink-faint); font-weight: 700; }
.archive-list { display: flex; flex-direction: column; gap: 10px; }
.archive-row {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 14px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.archive-row:hover { border-color: var(--accent); box-shadow: var(--shadow-sm); }
.archive-row-info { display: flex; flex-direction: column; gap: 4px; min-width: 0; flex: 1 1 180px; }
.archive-row-info strong { font-size: 1rem; font-weight: 800; }
.archive-row-info span { font-size: 0.85rem; color: var(--ink-soft); }
.archive-profile-links { display: flex; gap: 8px; flex-wrap: wrap; }
.archive-profile-group {
  display: flex;
  align-items: center;
  gap: 5px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 5px 12px;
  font-size: 0.78rem;
}
.archive-profile-group.is-mine { background: var(--accent-soft); border-color: var(--accent); }
.archive-profile-group .archive-profile-label { font-weight: 800; color: var(--ink-soft); margin-right: 2px; }
.archive-profile-group.is-mine .archive-profile-label { color: var(--accent-dark); }
.archive-profile-group a { font-weight: 700; }
.archive-profile-group a:hover { text-decoration: underline; }

/* Quiz engine */
.quiz-shell {
  max-width: 720px;
  margin: 0 auto;
  padding: 30px 0 90px;
}
.quiz-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  padding: 30px;
}
.quiz-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
.quiz-progress-track { height: 8px; background: var(--bg-soft); border-radius: 999px; overflow: hidden; margin-bottom: 22px; }
.quiz-progress-track > div { height: 100%; background: var(--accent); transition: width 0.25s ease; }
.quiz-question { font-size: 1.3rem; font-weight: 700; margin-bottom: 20px; line-height: 1.4; }
/* Figură geometrică opțională (item.svg), sub enunț — grile geometrice (ex. modelul EN 2026). */
.quiz-figure { max-width: 260px; margin: 0 auto 18px; }
.quiz-figure svg { width: 100%; height: auto; display: block; }
.quiz-options { display: flex; flex-direction: column; gap: 10px; margin-bottom: 18px; }
.quiz-opt {
  text-align: left;
  border: 1.5px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 14px 16px;
  font-weight: 600;
  background: var(--bg-card);
  display: flex;
  align-items: center;
  gap: 12px;
  transition: border-color 0.15s, background 0.15s;
}
.quiz-opt .letter {
  width: 26px; height: 26px; border-radius: 50%;
  background: var(--bg-soft); color: var(--ink-soft);
  display: flex; align-items: center; justify-content: center;
  font-size: 0.8rem; font-weight: 800; flex-shrink: 0;
}
.quiz-opt .letter .icon { width: 16px; height: 16px; vertical-align: 0; }
.quiz-opt:hover:not([disabled]) { border-color: var(--accent); }
.quiz-opt.is-correct { background: var(--success-soft); border-color: var(--success); animation: quiz-pop 0.3s ease; }
.quiz-opt.is-correct .letter { background: var(--success); color: #fff; }
.quiz-opt.is-wrong { background: var(--danger-soft); border-color: var(--danger); animation: quiz-shake 0.4s ease; }
.quiz-opt.is-wrong .letter { background: var(--danger); color: #fff; }
@keyframes quiz-pop {
  0% { transform: scale(1); }
  45% { transform: scale(1.035); }
  100% { transform: scale(1); }
}
@keyframes quiz-shake {
  10%, 90% { transform: translateX(-1px); }
  20%, 80% { transform: translateX(2px); }
  30%, 50%, 70% { transform: translateX(-4px); }
  40%, 60% { transform: translateX(4px); }
  100% { transform: translateX(0); }
}
/* Rezultatul quiz-ului "intră" în scenă în loc să apară brusc — vezi runQuiz() din quiz.js. */
.quiz-result { animation: quiz-result-in 0.4s cubic-bezier(0.2, 0.8, 0.2, 1); }
@keyframes quiz-result-in {
  from { opacity: 0; transform: translateY(8px) scale(0.98); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
/* Confetti discret, doar la scor bun (>=80%, vezi quiz.js) — puncte CSS, nicio librărie.
   Ancorat pe wrapper-ul scorului, nu pe tot cardul, ca burst-ul să pornească chiar din cifră. */
.score-num-wrap { position: relative; display: inline-block; }
/* Scorul "sare" ușor la apariție — sincron cu animateCountUp() (main.js), care numără cifra
   de la 0 până la valoarea reală în același interval, ca rezultatul să se simtă ca un moment. */
.score-num, .sim-result-banner .big-score { animation: score-pop 0.45s cubic-bezier(.2,.8,.2,1) both; }
@keyframes score-pop {
  0% { transform: scale(0.7); opacity: 0; }
  60% { transform: scale(1.06); opacity: 1; }
  100% { transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) {
  .score-num, .sim-result-banner .big-score { animation: none; }
}
/* Simboluri matematice, nu pătrate colorate generice — conținutul (π, √, ∫...) vine din
   renderConfetti() (quiz.js), care alege un caracter aleator per piesă; regula de-aici doar
   poziționează/animă/colorează, la fel ca înainte. */
.score-num-wrap .confetti-piece {
  position: absolute;
  top: 50%; left: 50%;
  font-size: 13px;
  font-weight: 800;
  line-height: 1;
  color: var(--dot-color, var(--accent));
  opacity: 0;
  animation: confetti-burst 0.9s var(--dot-delay, 0s) cubic-bezier(0.2, 0.7, 0.2, 1) forwards;
}
@keyframes confetti-burst {
  0% { opacity: 1; transform: translate(-50%, -50%) rotate(0deg) translateY(0); }
  100% { opacity: 0; transform: translate(-50%, -50%) rotate(var(--dot-rot, 180deg)) translateY(var(--dot-dist, -70px)); }
}
.quiz-opt[disabled] { cursor: default; }

.quiz-explain {
  background: var(--bg-soft);
  border-radius: var(--radius-sm);
  padding: 14px 16px;
  font-size: 0.9rem;
  color: var(--ink-soft);
  margin-bottom: 18px;
  display: none;
}
.quiz-explain.show { display: block; }
.quiz-actions { display: flex; justify-content: flex-end; }

.quiz-result { text-align: center; padding: 20px 0; }
.quiz-result .score-num { font-size: 3rem; font-weight: 800; color: var(--accent-dark); }
.quiz-result .score-label { color: var(--ink-soft); margin-bottom: 22px; }
.quiz-result .result-actions { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }

.quiz-timer {
  font-size: 0.78rem;
  font-weight: 800;
  letter-spacing: 0.02em;
  color: var(--accent-dark);
  background: var(--accent-soft);
  padding: 4px 10px;
  border-radius: var(--radius-sm);
}
.quiz-timer.is-low { color: #fff; background: var(--danger); }
.upsell-banner {
  margin-top: 20px;
  padding: 18px 22px;
  background: var(--accent-soft);
  border-radius: var(--radius-md);
  text-align: center;
}

.quiz-review {
  max-width: 720px;
  margin: 20px auto 0;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 24px 30px;
}
.quiz-review h4 { margin: 0 0 14px; font-size: 0.95rem; }
.quiz-review-item { padding: 14px 0; }
.quiz-review-item:not(:last-child) { border-bottom: 1px solid var(--border); }
.quiz-review-q { margin: 0 0 8px; font-weight: 700; }
.quiz-review-explain { margin: 0; font-size: 0.9rem; color: var(--ink-soft); background: var(--bg-soft); border-radius: var(--radius-sm); padding: 12px 14px; }

.wrong-mode-banner {
  max-width: 720px;
  margin: 0 auto 16px;
  padding: 12px 18px;
  background: var(--accent-soft);
  color: var(--accent-dark);
  border-radius: var(--radius-md);
  font-size: 0.88rem;
  font-weight: 600;
  text-align: center;
}
.wrong-mode-banner a { color: inherit; text-decoration: underline; }

.chapter-mode-chips {
  max-width: 720px;
  margin: 0 auto 16px;
  display: flex;
  gap: 10px;
  justify-content: center;
  flex-wrap: wrap;
}

.chapter-search-wrap { max-width: 480px; margin: 0 auto 24px; position: relative; }
.chapter-search {
  width: 100%;
  padding: 12px 16px;
  border: 1.5px solid var(--border);
  border-radius: var(--radius-md);
  font-family: inherit;
  font-size: 0.95rem;
  background: var(--bg-card);
  color: var(--ink);
}
.chapter-search:focus { outline: none; border-color: var(--accent); }
.chapter-search-hits {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 16px;
}
.chapter-search-hit {
  display: flex;
  align-items: center;
  gap: 14px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 14px 16px;
  transition: border-color 0.15s;
}
.chapter-search-hit:hover { border-color: var(--accent); }
.chapter-search-hit strong { display: block; font-size: 0.98rem; }
.chapter-search-hit-meta { font-size: 0.8rem; color: var(--ink-faint); }

.review-reminder {
  margin: -60px auto 40px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  padding: 20px 26px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
  position: relative;
  z-index: 1;
}
.review-reminder-text { font-size: 0.95rem; color: var(--ink-soft); max-width: 480px; }
.review-reminder-text strong { color: var(--ink); }
.review-reminder-links { display: flex; gap: 10px; flex-wrap: wrap; }
@media (max-width: 720px) {
  .review-reminder { margin-top: -30px; }
}

.admin-stat-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 22px; }
.admin-mini-bar { height: 6px; border-radius: 999px; background: var(--border); overflow: hidden; width: 80px; }
.admin-mini-bar > div { height: 100%; background: var(--accent); }
@media (max-width: 720px) { .admin-stat-row { grid-template-columns: repeat(2, 1fr); } }
.upsell-banner p { margin: 0 0 12px; color: var(--accent-dark); font-weight: 600; font-size: 0.92rem; }

/* Simulare */
.sim-shell { max-width: 800px; margin: 0 auto; padding: 30px 0 100px; }
.sim-subject { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); padding: 26px; margin-bottom: 22px; }
.sim-subject-head { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; gap: 4px 14px; margin-bottom: 18px; }
.sim-subject-head h2 { margin: 0; font-size: 1.3rem; font-weight: 800; }
.sim-subject-head span { color: var(--ink-faint); font-size: 0.85rem; font-weight: 600; }
.sim-item { padding: 16px 0; border-top: 1px solid var(--border); }
.sim-item:first-of-type { border-top: none; padding-top: 0; }
.sim-item p.prompt { font-weight: 700; margin: 0 0 10px; }
.sim-item input[type="text"] {
  width: 160px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border);
  font-size: 0.95rem;
  font-weight: 600;
}
.sim-item input[type="text"]:focus { outline: none; border-color: var(--accent); }
.sim-item .pts { color: var(--ink-faint); font-size: 0.8rem; font-weight: 700; margin-left: 10px; }
.sim-problem-title { font-weight: 800; margin: 18px 0 6px; }
.sim-problem-title:first-child { margin-top: 0; }
.sim-practice-source {
  display: inline-block; font-weight: 800; font-size: 0.74rem;
  letter-spacing: 0.04em; text-transform: uppercase; color: var(--accent-dark);
  background: var(--accent-soft); padding: 4px 12px; border-radius: var(--radius-sm); margin: 30px 0 6px;
}
.sim-practice-source:first-child { margin-top: 0; }
.sim-practice-note { font-size: 0.88rem; color: var(--ink-soft); background: var(--bg-soft); border-radius: var(--radius-sm); padding: 10px 14px; margin: 0 0 14px; }
.sim-practice-alt { margin-top: 26px; padding-top: 22px; border-top: 1px solid var(--border); text-align: center; }
.sim-practice-alt p { color: var(--ink-soft); font-size: 0.88rem; margin: 0 0 12px; }
.sim-practice-alt .variant-picker { justify-content: center; }

.hint-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: none;
  border: 1.5px dashed var(--accent);
  color: var(--accent-dark);
  font-size: 0.78rem;
  font-weight: 700;
  padding: 5px 12px;
  border-radius: var(--radius-sm);
  cursor: pointer;
  margin-bottom: 10px;
}
.hint-btn:hover { background: var(--accent-soft); }
.hint-btn:disabled { cursor: default; opacity: 0.75; border-style: solid; }
.hint-text {
  background: var(--accent-soft);
  color: var(--accent-dark);
  border-radius: var(--radius-sm);
  padding: 10px 14px;
  font-size: 0.88rem;
  font-weight: 600;
  margin: 0 0 10px;
}
.hint-used-tag { display: flex; align-items: center; gap: 6px; color: var(--warm); font-size: 0.78rem; font-weight: 700; margin-top: 6px; }

.sim-live-score {
  position: sticky;
  top: 78px;
  z-index: 40;
  display: flex;
  flex-wrap: wrap;
  gap: 6px 18px;
  justify-content: center;
  background: var(--header-bg);
  backdrop-filter: blur(8px);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-sm);
  padding: 10px 20px;
  font-size: 0.85rem;
  font-weight: 700;
  color: var(--ink-soft);
  margin: 0 0 22px;
}
.sim-live-score .live-nota { color: var(--accent-dark); font-size: 0.92rem; }
.sim-live-score.hidden { display: none; }

.sim-footer-bar {
  position: sticky;
  bottom: 16px;
  display: flex;
  justify-content: center;
  margin-top: 20px;
}
.sim-footer-inner {
  background: var(--chip-dark);
  color: #fff;
  border-radius: var(--radius-sm);
  padding: 12px 14px 12px 22px;
  display: flex;
  align-items: center;
  gap: 16px;
  box-shadow: 0 12px 30px rgba(0,0,0,0.25);
}
.sim-footer-inner .btn-primary { box-shadow: none; }

.sim-result-banner {
  text-align: center;
  padding: 28px;
  border-radius: var(--radius-lg);
  background: var(--bg-card);
  border: 1px solid var(--border);
  box-shadow: var(--shadow);
  margin-bottom: 26px;
}
.sim-result-banner .big-score { font-size: 3rem; font-weight: 800; font-family: var(--font-display); font-variant-numeric: oldstyle-nums; }
.sim-result-banner .out-of { color: var(--ink-faint); font-weight: 700; }

.sim-review-item { padding: 14px 0; border-top: 1px solid var(--border); }
.sim-review-item:first-child { border-top: none; }
.sim-review-item .row { display: flex; justify-content: space-between; gap: 10px; align-items: flex-start; }
.sim-review-item .tag { font-size: 0.72rem; font-weight: 800; padding: 3px 9px; border-radius: var(--radius-sm); flex-shrink: 0; }
.tag.correct { background: var(--success-soft); color: var(--success-ink); }
.tag.wrong { background: var(--danger-soft); color: var(--danger-ink); }
.sim-review-item .solution { color: var(--ink-soft); font-size: 0.88rem; margin-top: 6px; }
.sim-review-item .your-answer { color: var(--ink-faint); font-size: 0.85rem; margin-top: 4px; }

.theory-toggle-all {
  display: block;
  margin: 0 0 14px auto;
  padding: 7px 16px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  font-size: 0.82rem;
  font-weight: 700;
  color: var(--accent-dark);
  cursor: pointer;
  transition: background 0.15s ease, border-color 0.15s ease;
}
.theory-toggle-all:hover { background: var(--accent-soft); border-color: var(--accent); }

.theory-box {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-left: 4px solid var(--accent);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 24px 28px;
  margin-bottom: 24px;
}
/* Titlul de secțiune era o etichetă mică (0.78rem, ca un kicker), deși e singurul titlu vizibil
   al secțiunii — mărit la scara unui h4 obișnuit, ca ochiul să se oprească pe el, nu să-l
   citească pe fugă odată cu restul textului. */
.theory-box h4 {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  font-size: 1.08rem;
  font-weight: 800;
  letter-spacing: -0.01em;
  color: var(--ink);
}
.theory-box h4::before {
  content: "Σ";
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 8px;
  background: var(--accent-soft);
  color: var(--accent);
  font-size: 0.95rem;
  font-weight: 800;
  flex-shrink: 0;
}
/* Secțiunile de teorie sunt <details>/<summary> — colapsabile nativ, fără JS.
   Prima secțiune dintr-un capitol pornește deschisă, restul închise (vezi exercitii.html). */
.theory-box summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.theory-box summary::-webkit-details-marker { display: none; }
.theory-box summary::after {
  content: "▾";
  flex-shrink: 0;
  color: var(--ink-faint);
  font-size: 0.8rem;
  transition: transform 0.2s ease;
}
.theory-box[open] summary::after { transform: rotate(180deg); }
.theory-box summary:hover h4 { color: var(--accent); }
.theory-box[open] ul { margin-top: 18px; }
.theory-box ul { display: flex; flex-direction: column; }
.theory-box li {
  font-size: 0.97rem;
  line-height: 1.7;
  color: var(--ink);
  position: relative;
  padding: 16px 0;
}
.theory-box li:first-child { padding-top: 0; }
.theory-box li:last-child { padding-bottom: 0; }
/* Punctată, nu plină — desparte ideile fără să taie pagina în bucăți grele; aceeași convenție
   de "diviziune ușoară" ca .demo-footer/.chapter-progress-item de pe restul site-ului. */
.theory-box li:not(:last-child) { border-bottom: 1px dashed var(--border); }
.theory-box li.theory-def-item { padding: 0; border-bottom: none; }

/* ---------- Fișă de formule (formule.html) ---------- */
/* Randate din CHAPTERS[].theory (vezi formule.html) — .theory-box rămâne folosit pentru accordion
   (icon+titlu+colaps), dar conținutul intern nu mai e un <ul> plat: fiecare formulă e propriul
   "card" într-un grid, ca fișa să se simtă ca un instrument de recapitulare rapidă, nu un
   document lung. Icon-ul de capitol (topic-icon, injectat de formule.html) înlocuiește insigna
   generică "Σ" a .theory-box — altfel ar apărea două insigne suprapuse înaintea titlului. */
#formula-sheet .theory-box h4::before { content: none; }
#formula-sheet .theory-box h4 { gap: 10px; }
#formula-sheet { max-width: 1040px; margin: 0 auto 60px; }
.formula-quicknav {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 28px;
}
.formula-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 12px;
  margin-top: 16px;
}
.formula-item {
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius-sm);
  padding: 14px 16px;
  font-size: 0.92rem;
  line-height: 1.55;
  color: var(--ink);
  transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}
.formula-item:hover { transform: translateY(-2px); box-shadow: var(--shadow-sm); border-color: var(--accent); }
.formula-item.subject-II { border-left-color: var(--warm); }
.formula-item.subject-III { border-left-color: var(--success); }

/* ---------- Skeleton loading (shimmer) ---------- */
/* Folosit cât timp o pagină așteaptă date async (admin.html: fetchAllStudentsData; cont.html:
   fetchMyHomeworkSubmissions) — un placeholder care sugerează forma conținutului real, în loc
   de ecran gol sau doar text "Se încarcă…". Nu ține stare proprie, doar CSS + markup static,
   ascuns/arătat de JS-ul paginii ca orice alt bloc. */
.skeleton-block {
  background: linear-gradient(90deg, var(--bg-soft) 25%, var(--border) 37%, var(--bg-soft) 63%);
  background-size: 400% 100%;
  animation: skeleton-shimmer 1.4s ease infinite;
  border-radius: var(--radius-sm);
}
@keyframes skeleton-shimmer {
  0% { background-position: 100% 50%; }
  100% { background-position: 0 50%; }
}
.skeleton-stat-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 16px; margin-bottom: 24px; }
.skeleton-stat-row .skeleton-block { height: 74px; }
.skeleton-table-row { display: flex; align-items: center; gap: 24px; padding: 8px 0; border-bottom: 1px solid var(--border); }
.skeleton-table-row:last-child { border-bottom: none; }
.skeleton-table-row .skeleton-block { height: 14px; flex: 1; margin: 0; }

.theory-figure {
  margin: 10px 0 4px;
  padding: 10px;
  background: var(--bg-soft);
  border-radius: var(--radius-sm);
  max-width: 480px;
}
.theory-figure svg { display: block; width: 100%; height: auto; }

.theory-def {
  background: var(--accent-soft);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius-sm);
  padding: 16px 18px;
  margin: 4px 0 14px;
}
.theory-def .theory-def-label {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 7px;
  font-size: 0.9rem;
  font-weight: 800;
  color: var(--accent-dark);
}
.theory-def .theory-def-text { font-size: 0.96rem; line-height: 1.65; color: var(--ink); }

/* Rezolvare pas cu pas a unui subiect oficial BAC (rezolvare-bac.html) — reutilizează
   .theory-box/.theory-def pentru fiecare cerință, doar adaugă structura de subiect/grupă. */
.rezolvare-subiect { margin-bottom: 40px; }
.rezolvare-subiect h2 {
  display: flex;
  align-items: baseline;
  gap: 10px;
  font-size: 1.3rem;
  margin: 0 0 16px;
}
.rezolvare-subiect-puncte { font-size: 0.8rem; font-weight: 600; color: var(--ink-soft); }
.rezolvare-grupa { margin-bottom: 22px; }
.rezolvare-grupa:last-child { margin-bottom: 0; }
.rezolvare-enunt {
  background: var(--bg-soft);
  border-radius: var(--radius-sm);
  padding: 14px 18px;
  margin: 0 0 12px;
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--ink);
}

/* Autoevaluare la modul de redactare completă (redactare.html) */
.redactare-feedback { font-size: 0.85rem; font-weight: 700; }
.redactare-feedback.is-correct { color: var(--success-ink); }
.redactare-feedback.is-wrong { color: var(--danger-ink); }

/* Tabel de monotonie/variație (item.table în CHAPTERS[].theory, randat de monotonyTable()
   din matrix.js) — .theory-box li normal are padding vertical + border-bottom punctat, dar
   pentru un tabel vrem lățime completă și fără dashed border sub el. */
.theory-box li.theory-table-item { padding: 4px 0 16px; }
.theory-table-wrap { overflow-x: auto; }
.theory-table-caption { font-size: 0.9rem; font-weight: 700; color: var(--ink-soft); margin: 0 0 10px; }
.theory-table.monotony-table {
  border-collapse: collapse;
  min-width: 100%;
  background: var(--bg-soft);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
.theory-table.monotony-table th,
.theory-table.monotony-table td {
  border: 1px solid var(--border);
  padding: 10px 14px;
  text-align: center;
  font-size: 0.92rem;
  white-space: nowrap;
}
.theory-table.monotony-table th {
  background: var(--accent-soft);
  color: var(--accent-dark);
  font-weight: 800;
  text-align: left;
}
.theory-table.monotony-table td.monotony-arrow {
  font-size: 1.3rem;
  font-weight: 700;
  color: var(--accent);
}

/* Daily test seed banner */
.streak-tag { display: inline-flex; align-items: center; gap: 4px; background: var(--warm); color: #fff; font-size: 0.72rem; font-weight: 800; padding: 3px 9px; border-radius: var(--radius-sm); }
.streak-tag .icon { width: 13px; height: 13px; }
.streak-banner {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  text-align: center;
  margin-top: 16px;
  padding: 14px;
  background: var(--accent-soft);
  color: var(--accent-dark);
  border-radius: var(--radius-md);
  font-weight: 700;
  font-size: 0.95rem;
}

/* ---------- Auth (cont.html) ---------- */
.tab-btn { border-radius: var(--radius-sm); }
.tab-btn.active { background: var(--chip-dark); color: #fff; }
.auth-form { display: flex; flex-direction: column; gap: 14px; }
.auth-form label { display: flex; flex-direction: column; gap: 6px; font-size: 0.85rem; font-weight: 700; color: var(--ink-soft); }
.auth-form input {
  padding: 11px 14px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border);
  font-size: 0.95rem;
  font-weight: 600;
  font-family: inherit;
}
.auth-form input:focus { outline: none; border-color: var(--accent); }
.password-field { position: relative; display: flex; }
.password-field input { flex: 1; padding-right: 42px; }
.password-toggle {
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  color: var(--ink-faint);
}
.password-toggle:hover { color: var(--ink); }
.password-toggle svg { width: 18px; height: 18px; }
.password-toggle .ico-eye-off { display: none; }
.password-toggle[aria-pressed="true"] .ico-eye { display: none; }
.password-toggle[aria-pressed="true"] .ico-eye-off { display: block; }
.auth-form label.auth-checkbox {
  flex-direction: row;
  align-items: flex-start;
  gap: 9px;
  font-size: 0.82rem;
  font-weight: 500;
  color: var(--ink-soft);
  line-height: 1.4;
}
.auth-form label.auth-checkbox input { width: 16px; height: 16px; flex-shrink: 0; margin-top: 2px; accent-color: var(--accent); }

/* Matrice — afișare tip tablou */
.matrix {
  display: inline-flex;
  align-items: stretch;
  vertical-align: middle;
  margin: 0 4px;
}
.matrix-bracket {
  width: 5px;
  border-top: 2.5px solid currentColor;
  border-bottom: 2.5px solid currentColor;
}
.matrix-bracket-l { border-left: 2.5px solid currentColor; margin-right: 5px; }
.matrix-bracket-r { border-right: 2.5px solid currentColor; margin-left: 5px; }
.matrix-grid {
  display: grid;
  gap: 3px 14px;
  padding: 4px 1px;
  align-items: center;
}
.matrix-cell {
  text-align: center;
  font-variant-numeric: tabular-nums;
  font-weight: 700;
}
.quiz-opt .matrix,
.demo-opt .matrix { margin: 0; }

/* Determinant — bare verticale (notație |...|), nu paranteze drepte ca la matrice */
.matrix-bracket-bar { width: 0; border-top: none; border-bottom: none; border-left: 2px solid currentColor; }

/* Sistem de ecuații cu acoladă (rezolvări pas cu pas ale subiectelor oficiale BAC) */
.system {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  vertical-align: middle;
  margin: 4px 3px;
}
.system-brace {
  align-self: stretch;
  width: 10px;
  border-left: 2.5px solid currentColor;
  border-top-left-radius: 8px;
  border-bottom-left-radius: 8px;
}
.system-rows {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-variant-numeric: tabular-nums;
}

/* Fracții — afișare tip numărător/numitor, nu "a/b" */
.frac {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  vertical-align: middle;
  margin: 0 3px;
  font-size: 0.92em;
  line-height: 1.15;
  text-align: center;
}
.frac-num, .frac-den {
  display: block;
  padding: 0 3px;
}
.frac-num { border-bottom: 1.5px solid currentColor; }
.quiz-opt .frac,
.demo-opt .frac { margin: 0; }

/* "lim" cu limita (x→0 etc.) scrisă dedesubt, ca în notația matematică standard */
.lim-op {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  vertical-align: middle;
  line-height: 1.05;
  margin: 0 2px;
}
.lim-sub { font-size: 0.62em; color: var(--ink-soft); }

/* Fracții și lim(...) randate prin KaTeX (când CDN-ul s-a încărcat) — .frac/.lim-op
   de mai sus rămân ca fallback dacă KaTeX lipsește, vezi assets/js/matrix.js */
.katex-inline { margin: 0 2px; }
.katex-inline .katex { font-size: 1em; }

.donate-section {
  max-width: 560px;
  margin: 52px auto 0;
  padding: 32px 24px;
  text-align: center;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
}
/* Mentorat + Donează, unul lângă altul în loc de două secțiuni identice stivuite —
   .donate-section în interior renunță la propriul max-width/margin, controlate de grid. */
.support-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: start;
  gap: 24px;
  max-width: 900px;
  margin: 0 auto;
}
.support-grid .donate-section { margin: 0; max-width: none; }

/* ---------- Formular listă de așteptare (gimnaziu.html + secțiunea de teaser din homepage) —
   randat de initWaitlistForm() (main.js), care caută #waitlist-form pe orice pagină. ---------- */
.waitlist-form { display: flex; gap: 8px; max-width: 420px; margin: 0 auto; }
.waitlist-form input {
  flex: 1;
  padding: 13px 16px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border);
  font-size: 0.95rem;
  font-family: inherit;
  background: var(--bg-card);
  color: var(--ink);
}
.waitlist-form input:focus { outline: none; border-color: var(--accent); }
.waitlist-form button {
  padding: 13px 22px;
  border-radius: var(--radius-sm);
  border: none;
  background: var(--accent);
  color: #fff;
  font-weight: 700;
  font-size: 0.95rem;
  font-family: inherit;
  cursor: pointer;
  white-space: nowrap;
}
.waitlist-form button:hover { background: var(--accent-dark); }
.waitlist-form button:disabled { opacity: 0.6; cursor: default; }
.waitlist-msg { font-size: 0.88rem; font-weight: 600; margin-top: 12px; min-height: 1.3em; }
.waitlist-msg.ok { color: var(--success); }
.waitlist-msg.err { color: var(--danger); }
@media (max-width: 480px) { .waitlist-form { flex-direction: column; } }

/* Honeypot anti-spam — invizibil vizual și pentru cititoare de ecran/tastatură (nu doar
   "display:none", ca să pară un câmp normal la orice bot care verifică stilul calculat). */
.hp-field {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  opacity: 0;
  overflow: hidden;
}

/* Mount point pentru widget-ul Cloudflare Turnstile (injectat de main.js doar dacă
   TURNSTILE_SITE_KEY e completat în supabase-config.js) — rămâne gol, fără spațiu ocupat,
   până atunci. */
.turnstile-mount:not(:empty) { margin: 10px auto 0; display: flex; justify-content: center; }
/* ---------- Despre mine ---------- */
.about-shell {
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: 36px;
  max-width: 760px;
  margin: 0 auto;
  padding-top: 8px;
}
.about-avatar {
  width: 140px;
  height: 140px;
  border-radius: 50%;
  object-fit: cover;
  box-shadow: var(--shadow);
  flex-shrink: 0;
}
.about-copy h2 { margin: 0 0 16px; font-size: 1.4rem; }
.about-copy p { margin: 0 0 14px; color: var(--ink-soft); line-height: 1.65; }
.about-copy p:last-child { margin-bottom: 0; }
.about-copy a { color: var(--accent); font-weight: 700; }

.about-photo {
  display: block;
  max-width: 340px;
  width: 100%;
  height: auto;
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  margin: 40px auto 0;
}

.testimonial-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  max-width: 1000px;
  margin: 0 auto;
}
.testimonial-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 22px 20px;
  box-shadow: var(--shadow-sm);
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.testimonial-card p { margin: 0; font-size: 0.9rem; color: var(--ink); line-height: 1.55; }
.testimonial-tag { font-size: 0.78rem; font-weight: 700; color: var(--ink-faint); }

.price-features { display: flex; flex-direction: column; gap: 10px; flex-grow: 1; }
.price-features li { font-size: 0.9rem; color: var(--ink); }
.price-features li.muted { color: var(--ink-faint); }

/* ---------- Locked content (paywall teaser) ---------- */
.locked-card {
  position: relative;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  padding: 30px;
  text-align: center;
  overflow: hidden;
}
.locked-preview {
  filter: blur(5px);
  opacity: 0.55;
  pointer-events: none;
  user-select: none;
}
.locked-overlay {
  position: relative;
  margin-top: -70px;
  z-index: 2;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  padding: 26px;
  max-width: 420px;
  margin-left: auto;
  margin-right: auto;
}
.locked-overlay .lock-ico {
  width: 44px; height: 44px;
  border-radius: 12px;
  background: var(--accent-soft);
  color: var(--accent-dark);
  display: flex; align-items: center; justify-content: center;
  margin: 0 auto 14px;
}
.locked-overlay .lock-ico .icon { width: 22px; height: 22px; }
.locked-overlay h3 { margin: 0 0 8px; font-size: 1.15rem; font-weight: 800; }
.locked-overlay p { margin: 0 0 18px; color: var(--ink-soft); font-size: 0.9rem; }

/* Utility */
.center { text-align: center; }
.mt-40 { margin-top: 40px; }
.hidden { display: none !important; }

/* ---------- Responsive ---------- */
/* Pragul la care bara de nav devine hamburger — separat de restul breakpoint-urilor de layout
   de mai jos (980px), fiindcă .nav-main + .header-cta (7 linkuri + profil + temă + cont) au
   nevoie de mai mult spațiu ca să nu se rupă decât restul conținutului paginii. Găsit direct
   testând: la 980px conținutul din header ar depăși cu mult lățimea disponibilă (--maxw 1180px,
   plus varianta logată "Contul meu") — vezi și max-width mai mare pe .site-header .wrap. */
@media (max-width: 1300px) {
  .nav-main { display: none; }
  .nav-toggle { display: flex; }

  .nav-main.nav-open {
    display: flex !important;
    position: absolute;
    top: 100%; /* nu 68px fix — vezi mai jos, header-ul poate avea acum 2 rânduri */
    left: 0;
    right: 0;
    flex-direction: column;
    align-items: stretch;
    gap: 2px;
    background: var(--bg);
    border-bottom: 1px solid var(--border);
    padding: 10px 18px 16px;
    box-shadow: var(--shadow);
  }
  .nav-main.nav-open a {
    padding: 12px 14px;
    border-radius: 10px;
  }

  /* Comutatoarele (profil + generație + clasă) NU mai derulează orizontal aici — se rup pe un
     al doilea rând, sub logo/cont/hamburger, și se pot rupe ele însele pe mai multe rânduri.
     Raportat direct cu screenshot: scrollbar-ul ascuns făcea rândul să pară pur și simplu tăiat,
     fără niciun indiciu că mai era conținut la dreapta — mai puțin confuz aici să vezi TOATE
     pastilele deodată, chiar dacă headerul devine puțin mai înalt, decât să ghicești că poți
     derula. `.site-header` trece din fixed în sticky doar la acest breakpoint, tocmai ca
     header-ul să-și poată calcula singur înălțimea (variabilă, 1-3 rânduri) fără compensarea
     manuală de `padding-top` de pe body, care presupunea mereu exact 68px. */
  .site-header { position: sticky; }
  body { padding-top: 0; }
  .site-header .wrap {
    height: auto;
    min-height: 68px;
    padding-top: 10px;
    padding-bottom: 10px;
    align-items: flex-start; /* nu center — vezi comentariul de mai jos, pe .logo */
  }
  /* Cu .wrap acum mai înalt (2-3 rânduri), fără align-self explicit logo-ul ar rămâne aliniat
     la marginea de sus a întregii linii flex (align-items:flex-start de mai sus) — exact ce
     vrem, dar centrat pe înălțimea lui proprie (40px, cât toggle-urile din dreapta), nu doar
     lipit de vârf, ca vizual să pară pe același rând cu tema/hamburger-ul, nu "mai sus". */
  .logo { align-self: flex-start; height: 40px; align-items: center; }
  .header-cta { flex-wrap: wrap; row-gap: 8px; }
  .header-switchers { order: 2; flex-basis: 100%; }
}
/* ---------- Sidebar de navigare tip "cuprins de carte" (>=1300px) ----------
   La lățimi mari, .site-header devine o coloană fixă în stânga (index de carte), nu bară
   orizontală — silueta paginii nu se mai citește ca un site SaaS obișnuit, la scroll (vezi și
   textura de foaie liniată de mai jos, care continuă și în .section-alt, nu doar în hero).
   Sub 1300px rămâne comportamentul existent, neschimbat (bară de sus + hamburger) — un sidebar
   permanent n-ar încăpea confortabil pe tabletă/mobil. Markup-ul celor 14 pagini nu se schimbă:
   eticheta "Cuprins" și numerotarea "01." sunt conținut generat (::before + counter), nu HTML
   nou — .nav-main/.header-cta sunt aceleași elemente refolosite din bara orizontală de azi. */
@media (min-width: 1300px) {
  body {
    padding-top: 0;
    padding-left: 240px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='280' height='280'%3E%3Ctext x='20' y='55' font-family='Georgia,serif' font-size='30' fill='currentColor' fill-opacity='0.055' transform='rotate(-10 20 55)'%3E%CF%80%3C/text%3E%3Ctext x='150' y='45' font-family='Georgia,serif' font-size='26' fill='currentColor' fill-opacity='0.05' transform='rotate(8 150 45)'%3E%E2%88%AB%3C/text%3E%3Ctext x='225' y='90' font-family='Georgia,serif' font-size='26' fill='currentColor' fill-opacity='0.055'%3E%E2%88%9A%3C/text%3E%3Ctext x='55' y='140' font-family='Georgia,serif' font-size='24' fill='currentColor' fill-opacity='0.05' transform='rotate(-6 55 140)'%3E%CE%A3%3C/text%3E%3Ctext x='185' y='160' font-family='Georgia,serif' font-size='22' fill='currentColor' fill-opacity='0.055'%3E%E2%88%9E%3C/text%3E%3Ctext x='20' y='215' font-family='Georgia,serif' font-size='20' fill='currentColor' fill-opacity='0.05' transform='rotate(6 20 215)'%3E%CE%94%3C/text%3E%3Ctext x='135' y='230' font-family='Georgia,serif' font-size='22' fill='currentColor' fill-opacity='0.055'%3E%C3%97%3C/text%3E%3Ctext x='235' y='245' font-family='Georgia,serif' font-size='20' fill='currentColor' fill-opacity='0.05'%3E%E2%88%82%3C/text%3E%3Ctext x='98' y='18' font-family='Georgia,serif' font-size='18' fill='currentColor' fill-opacity='0.05' transform='rotate(5 98 18)'%3Esin%3C/text%3E%3Ctext x='250' y='22' font-family='Georgia,serif' font-size='18' fill='currentColor' fill-opacity='0.045' transform='rotate(-4 250 22)'%3E%CE%B8%3C/text%3E%3Ctext x='8' y='100' font-family='Georgia,serif' font-size='17' fill='currentColor' fill-opacity='0.05' transform='rotate(-8 8 100)'%3Elim%3C/text%3E%3Ctext x='150' y='118' font-family='Georgia,serif' font-size='16' fill='currentColor' fill-opacity='0.045' transform='rotate(4 150 118)'%3E%C2%BD%3C/text%3E%3Ctext x='252' y='190' font-family='Georgia,serif' font-size='17' fill='currentColor' fill-opacity='0.05' transform='rotate(3 252 190)'%3Ecos%3C/text%3E%3Ctext x='95' y='270' font-family='Georgia,serif' font-size='18' fill='currentColor' fill-opacity='0.045' transform='rotate(-3 95 270)'%3E%E2%89%A4%3C/text%3E%3C/svg%3E"),
      repeating-linear-gradient(var(--border) 0 1px, transparent 1px 24px),
      repeating-linear-gradient(90deg, var(--border) 0 1px, transparent 1px 24px);
    background-size: 280px 280px, 24px 24px, 24px 24px;
  }
  /* Caiet cu pătrățele, nu cu liniatură — corectat direct: un caiet de matematică chiar arată
     așa, nu cu linii orizontale ca la alte materii. Pagina rămâne "hârtie de caiet" tot timpul
     derulării, nu doar în zonele cu fundal transparent. Liniuța-reper verticală a fost scoasă
     (tăia direct prin titluri la lățimi unde .wrap se apropie de sidebar, semnalat direct) —
     fundalul bogat de simboluri matematice de mai sus duce singur senzația de "scris pe caiet".
     Fără background-attachment:fixed — vezi comentariul de la body::before mai jos în fișier
     (lumina ambientă): fixed pe un element cu mult conținut deasupra a cauzat scroll janky,
     semnalat direct, reparat prin mutarea pe un pseudo-element izolat; aici riscul e identic. */
  .section-alt {
    background-image:
      repeating-linear-gradient(var(--border) 0 1px, transparent 1px 24px),
      repeating-linear-gradient(90deg, var(--border) 0 1px, transparent 1px 24px);
    background-size: 24px 24px, 24px 24px;
  }
  [id] { scroll-margin-top: 24px; }

  .site-header {
    top: 0;
    bottom: 0;
    right: auto;
    width: 240px;
    border-bottom: none;
    border-right: 1px solid var(--border);
    background: var(--bg-soft);
    backdrop-filter: none;
    overflow-y: auto;
  }
  .site-header .wrap {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    height: auto;
    min-height: 100%;
    max-width: none;
    padding: 32px 22px;
  }
  .nav-main {
    flex-direction: column;
    align-items: stretch;
    gap: 2px;
    margin-top: 36px;
    counter-reset: navitem;
  }
  .nav-main::before {
    content: "Cuprins";
    font-size: 0.72rem;
    font-weight: 800;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--ink-faint);
    margin-bottom: 14px;
  }
  .nav-main a {
    counter-increment: navitem;
    display: flex;
    align-items: baseline;
    gap: 8px;
    padding: 9px 4px;
    border-radius: 0;
    border-bottom: 1px dashed var(--border);
  }
  .nav-main a::before {
    content: counter(navitem, decimal-leading-zero) ".";
    font-family: var(--font-display);
    font-size: 0.78rem;
    color: var(--ink-faint);
    flex-shrink: 0;
  }
  .nav-main a.active,
  .nav-main.has-indicator a.active {
    background: none;
    color: var(--accent);
    font-weight: 800;
  }
  .nav-main a.active::before { color: var(--accent); }
  .nav-indicator { display: none !important; }

  .header-cta {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    margin-top: auto;
    padding-top: 24px;
  }
  /* Coloana sidebar e fixă la 240px, indiferent cât de lată e fereastra per total — comutatorul
     de clasă (5 pastile: Toate/IX/X/XI/XII) nu încape la dimensiunea normală a pastilelor în
     spațiul rămas (~195px). Găsit direct testând la 1400px, nu doar la lățimi mici: "XII"
     dispărea complet, silențios, pe orice monitor obișnuit — nu doar pe ferestre redimensionate
     manual. Aceeași pastilă compactă folosită deja sub 620px (vezi mai jos în fișier). */
  .profile-pill { padding: 6px 8px; font-size: 0.7rem; }
}

@media (max-width: 980px) {
  .hero .wrap { grid-template-columns: 1fr; }
  .steps { grid-template-columns: 1fr; }
  .barem-grid { grid-template-columns: 1fr; }
  .topic-grid { grid-template-columns: repeat(2, 1fr); }
  .chapters-grid { grid-template-columns: repeat(2, 1fr); }
  .two-col-cta { grid-template-columns: 1fr; }
  .support-grid { grid-template-columns: 1fr; }
  .about-shell { grid-template-columns: 1fr; text-align: center; justify-items: center; }
  .testimonial-grid { grid-template-columns: 1fr; }
}
@media (max-width: 620px) {
  .wrap { padding: 0 18px; }
  .demo-options { grid-template-columns: 1fr; }
  .topic-grid { grid-template-columns: 1fr; }
  .chapters-grid { grid-template-columns: 1fr; }
  .hero-ctas { flex-direction: column; align-items: stretch; }
  .hero-ctas .btn { width: 100%; }
  .header-cta .btn { display: none; }
  .profile-pill { padding: 6px 9px; font-size: 0.72rem; }

  /* Bara sticky de jos din simulare ("Corectează după barem") nu avea nicio regulă
     responsive: pe ecran îngust, textul „Completează toate cerințele, apoi corectează."
     nu mai încape lângă buton, se rupe pe mai multe linii, iar bara se lățește vertical
     până devine un dreptunghi negru uriaș, sticky — practic acoperă permanent ultimul
     exercițiu vizibil. Pe mobil ascundem textul (butonul e suficient de clar singur) și
     strângem padding-ul, ca bara să rămână un buton compact, nu un panou. */
  .sim-footer-inner { padding: 10px 10px 10px 10px; gap: 0; }
  .sim-footer-inner span { display: none; }
  .sim-footer-bar { bottom: 12px; }
}

/* ---------- Simulare: selector de variantă ---------- */
.variant-picker {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 22px;
}
.variant-chip {
  font: inherit;
  cursor: pointer;
  background: var(--bg-card);
  border: 1px solid var(--border);
  color: var(--ink-soft);
  font-weight: 700;
  font-size: 0.85rem;
  padding: 9px 16px;
  border-radius: var(--radius-sm);
  transition: border-color 0.15s, color 0.15s, background 0.15s;
}
.variant-chip:hover { border-color: var(--accent); color: var(--accent-dark); }
.variant-chip.active {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
}

/* ---------- Calculator grafic (Desmos) ---------- */
.graph-presets {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 4px 0 18px;
}
.preset-chip {
  font: inherit;
  cursor: pointer;
  background: var(--bg-card);
  border: 1px solid var(--border);
  color: var(--ink-soft);
  font-weight: 700;
  font-size: 0.85rem;
  padding: 8px 16px;
  border-radius: var(--radius-sm);
  transition: border-color 0.15s, color 0.15s, background 0.15s;
}
.preset-chip:hover {
  border-color: var(--accent);
  color: var(--accent-dark);
  background: var(--accent-soft);
}
.graph-calculator {
  width: 100%;
  height: 560px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  background: var(--bg-card);
}
.graph-calculator svg { display: block; }
/* function-plot/d3 randează axele cu culori fixe (negru), invizibile pe fundal întunecat —
   suprascriem cu tokenii de temă ai site-ului, ca graficul să arate corect în ambele teme. */
.graph-calculator .domain { stroke: var(--border); }
.graph-calculator .tick line { stroke: var(--border); }
.graph-calculator .tick text { fill: var(--ink-soft); }
.graph-calculator .x.origin, .graph-calculator .y.origin { stroke: var(--ink-faint); }
.graph-calculator .tip-x-line, .graph-calculator .tip-y-line { stroke: var(--ink-faint); }
.graph-point-halo { fill: #fff; stroke: var(--warm); stroke-width: 2; }
.graph-point-dot { fill: var(--warm); stroke: #fff; stroke-width: 1.5; }
.graph-input-row {
  display: flex;
  gap: 10px;
  margin-bottom: 10px;
}
.math-preview {
  background: var(--bg-soft);
  border-radius: var(--radius-sm);
  padding: 10px 16px;
  margin: -2px 0 14px;
  font-size: 1.05rem;
  color: var(--ink);
}
.math-preview-eq { font-family: "Iowan Old Style", "Palatino Linotype", Georgia, serif; }
.math-preview .mp-op { margin: 0 2px; color: var(--ink-soft); }
.math-preview .frac { font-size: 1em; margin: 0 4px; }
.graph-input {
  flex: 1;
  font: inherit;
  padding: 11px 16px;
  border-radius: var(--radius-md);
  border: 1px solid var(--border);
  background: var(--bg-card);
  color: var(--ink);
}
.graph-input:focus { outline: none; border-color: var(--accent); }
.graph-error {
  color: var(--danger);
  background: var(--danger-soft);
  border-radius: var(--radius-sm);
  padding: 8px 14px;
  font-size: 0.85rem;
  margin: 0 0 14px;
}
.graph-hint {
  color: var(--ink-faint);
  font-size: 0.85rem;
  margin: 14px 0 50px;
}
.graph-extra-row { margin: 0 0 14px; }
.graph-check {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 0.88rem;
  color: var(--ink-soft);
  cursor: pointer;
}
.graph-check input { width: 16px; height: 16px; cursor: pointer; }
.graph-line-row { align-items: center; }
.graph-line-label { font-weight: 700; color: var(--ink-soft); }
.graph-line-info, .graph-points-info {
  font-size: 0.85rem;
  border-radius: var(--radius-sm);
  padding: 8px 14px;
  margin: 0 0 14px;
  line-height: 1.6;
}
.graph-line-info {
  color: var(--success);
  background: var(--success-soft);
}
.graph-points-info {
  color: var(--ink);
  background: var(--accent-soft);
}
@media (max-width: 620px) {
  .graph-calculator { height: 420px; }
  .graph-input-row { flex-direction: column; }
  .graph-line-label { display: none; }
}

/* ---------- Hero: element vizual decorativ (grafic + simboluri) ---------- */
.hero { position: relative; overflow: hidden; }
.hero-math-bg {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  overflow: hidden;
}
.hero-math-bg .curve {
  position: absolute;
  top: 8%;
  right: -4%;
  width: min(46vw, 620px);
  height: auto;
  opacity: 0.5;
}
.hero-math-bg .curve path {
  fill: none;
  stroke: var(--accent);
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-dasharray: 900;
  stroke-dashoffset: 900;
  opacity: 0.45;
  animation: draw-curve 2.6s cubic-bezier(.3,.7,.3,1) 0.4s forwards;
}
.hero-math-bg .curve .axis {
  stroke: var(--ink-faint);
  stroke-width: 1;
  stroke-dasharray: none;
  stroke-dashoffset: 0;
  animation: none;
  opacity: 0.5;
}
.hero-math-bg .curve .dot {
  fill: var(--warm);
  opacity: 0;
  animation: dot-in 0.4s ease 2.6s forwards;
}
@keyframes draw-curve {
  to { stroke-dashoffset: 0; }
}
@keyframes dot-in {
  to { opacity: 1; }
}
.hero-math-bg .symbol {
  position: absolute;
  color: var(--ink);
  opacity: 0.12;
  font-weight: 700;
  font-family: "Iowan Old Style", "Palatino Linotype", Georgia, serif;
  animation: symbol-float 7s ease-in-out infinite;
}
.hero-math-bg .symbol:nth-child(2) { top: 12%; left: 4%; font-size: 3.4rem; animation-delay: 0s; }
.hero-math-bg .symbol:nth-child(3) { top: 62%; left: 10%; font-size: 2.4rem; animation-delay: 1.2s; color: var(--warm); }
.hero-math-bg .symbol:nth-child(4) { top: 78%; left: 46%; font-size: 2rem; animation-delay: 2.4s; }
.hero-math-bg .symbol:nth-child(5) { top: 4%; left: 52%; font-size: 2.2rem; animation-delay: 0.8s; color: var(--warm); }
.hero-math-bg .symbol:nth-child(6) { top: 40%; left: 1%; font-size: 1.8rem; animation-delay: 3.2s; }
@keyframes symbol-float {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  50% { transform: translateY(-14px) rotate(4deg); }
}
.hero .wrap { position: relative; z-index: 1; }
@media (prefers-reduced-motion: reduce) {
  .hero-math-bg .curve path { animation: none; stroke-dashoffset: 0; }
  .hero-math-bg .curve .dot { animation: none; opacity: 1; }
  .hero-math-bg .symbol { animation: none; }
}
@media (max-width: 900px) {
  .hero-math-bg .curve { width: 70vw; opacity: 0.3; }
}

/* ---------- Cerc trigonometric interactiv ---------- */
.theory-box-caption {
  font-size: 0.85rem;
  font-weight: 700;
  color: var(--ink-soft);
  margin: 0 0 12px;
}
.trig-circle-widget {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 24px;
  align-items: center;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 22px;
  margin: 0 0 24px;
}
.trig-circle-svg-wrap { width: 100%; }
.trig-circle-svg { width: 100%; height: auto; touch-action: none; }
.tc-axis { stroke: var(--ink-faint); stroke-width: 1; }
.tc-circle { stroke: var(--accent); stroke-width: 2; fill: none; opacity: 0.6; }
.tc-radius { stroke: var(--ink); stroke-width: 2; }
.tc-sin-line { stroke: var(--warm); stroke-width: 3; stroke-dasharray: 5 4; }
.tc-cos-line { stroke: var(--success); stroke-width: 3; stroke-dasharray: 5 4; }
.tc-point { fill: var(--accent); cursor: grab; }
.tc-point:active { cursor: grabbing; }
.tc-cos-point { fill: var(--success); }
.tc-sin-point { fill: var(--warm); }
.tc-label { fill: var(--ink-faint); font-size: 13px; font-weight: 700; }
.trig-circle-controls { display: flex; flex-direction: column; gap: 16px; }
.tc-slider { width: 100%; accent-color: var(--accent); cursor: pointer; }
.tc-readout {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 16px;
}
.tc-readout-item {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  background: var(--bg-soft);
  border-radius: var(--radius-sm);
  padding: 8px 12px;
}
.tc-readout-label { font-size: 0.78rem; color: var(--ink-soft); font-weight: 700; text-transform: uppercase; letter-spacing: 0.02em; }
.tc-readout-val { font-size: 1rem; font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums; }
.tc-warm { color: var(--warm) !important; }
.tc-success { color: var(--success) !important; }
.tc-presets { display: flex; flex-wrap: wrap; gap: 8px; }
.tc-preset { padding: 6px 12px; font-size: 0.78rem; }
.tc-preset.active { background: var(--accent); border-color: var(--accent); color: #fff; }
@media (max-width: 720px) {
  .trig-circle-widget { grid-template-columns: 1fr; }
}

/* ---------- Triunghi interactiv (linii importante) — vezi assets/js/triangle-lines.js ---------- */
.triangle-widget {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 24px;
  align-items: center;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 22px;
  margin: 0 0 24px;
}
.tl-svg-wrap { width: 100%; }
.tl-svg { width: 100%; height: auto; }
.tl-triangle { fill: var(--accent-soft); stroke: var(--ink); stroke-width: 2; }
.tl-line { stroke-width: 2.5; }
.tl-vertex { fill: var(--ink); }
.tl-midpoint { fill: var(--ink-faint); }
.tl-vertex-label { fill: var(--ink); font-size: 15px; font-weight: 800; }
.tl-controls { display: flex; flex-direction: column; gap: 14px; max-height: 420px; overflow-y: auto; }
.tl-hint { font-size: 0.82rem; color: var(--ink-soft); margin: 0; line-height: 1.5; }
.tl-shape-row { display: flex; flex-wrap: wrap; gap: 8px; padding-bottom: 12px; margin-bottom: 4px; border-bottom: 1px dashed var(--border); }
.tl-shape-toggle { padding: 7px 13px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-soft); color: var(--ink-soft); font-size: 0.82rem; font-weight: 700; }
.tl-shape-toggle.is-active { color: #fff; border-color: var(--ink); background: var(--ink); }
.tl-group { display: flex; flex-direction: column; gap: 6px; }
.tl-group-label { display: flex; align-items: center; gap: 8px; font-size: 0.85rem; font-weight: 800; color: var(--ink); }
.tl-swatch { width: 10px; height: 10px; border-radius: 50%; background: var(--tl-color); flex-shrink: 0; }
.tl-sub-row { display: flex; flex-wrap: wrap; gap: 6px; }
.tl-sub-toggle {
  padding: 6px 12px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--bg-soft);
  color: var(--ink-soft);
  font-size: 0.78rem;
  font-weight: 700;
}
.tl-sub-toggle.is-active { color: #fff; border-color: var(--tl-color); background: var(--tl-color); }
@media (max-width: 720px) {
  .triangle-widget { grid-template-columns: 1fr; }
  .tl-controls { max-height: none; }
}

/* ---------- Widget de feedback (flotant, injectat de main.js pe orice pagină) ---------- */
/* Injectat de initScrollTop() (main.js) pe orice pagină — pe stânga, ca să nu se suprapună
   niciodată cu .feedback-widget (dreapta), care se extinde în sus când panoul e deschis. */
.scroll-top-btn {
  position: fixed;
  left: 22px;
  bottom: 22px;
  z-index: 55;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: none;
  background: var(--chip-dark);
  color: #fff;
  font-size: 1.2rem;
  line-height: 1;
  cursor: pointer;
  box-shadow: var(--shadow);
  transition: transform 0.15s ease, opacity 0.15s ease;
}
.scroll-top-btn:hover { transform: translateY(-3px); }
.feedback-widget { position: fixed; right: 22px; bottom: 22px; z-index: 60; display: flex; flex-direction: column; align-items: flex-end; gap: 12px; }
.feedback-fab {
  display: flex; align-items: center; gap: 8px;
  background: var(--chip-dark); color: #fff; border: none; border-radius: var(--radius-md);
  padding: 13px 20px; font-weight: 700; font-size: 0.88rem;
  box-shadow: var(--shadow); transition: transform 0.15s ease, background 0.15s ease;
}
.feedback-fab:hover { background: var(--hero-g1); transform: translateY(-2px); }
.feedback-panel {
  width: min(320px, calc(100vw - 44px)); background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius-lg); box-shadow: var(--shadow); padding: 18px; display: flex; flex-direction: column; gap: 10px;
}
.feedback-panel.hidden { display: none; }
.feedback-panel-head { display: flex; align-items: center; justify-content: space-between; }
.feedback-panel-head h4 { margin: 0; font-size: 1rem; }
.feedback-close { background: none; border: none; font-size: 1rem; color: var(--ink-faint); line-height: 1; padding: 4px; }
.feedback-close:hover { color: var(--ink); }
.feedback-hint { margin: 0; font-size: 0.82rem; color: var(--ink-soft); line-height: 1.5; }
.feedback-panel textarea, .feedback-panel input {
  width: 100%; font: inherit; font-size: 0.88rem; padding: 10px 12px;
  border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--bg);
  color: var(--ink); resize: vertical;
}
.feedback-panel textarea:focus, .feedback-panel input:focus { outline: 2px solid var(--accent-soft); border-color: var(--accent); }
.feedback-status { margin: 0; font-size: 0.8rem; min-height: 1.1em; }
.feedback-status.error { color: var(--danger); }
.feedback-status.success { color: var(--success); }
@media (max-width: 600px) {
  .feedback-widget { right: 14px; bottom: 14px; }
  .feedback-fab { padding: 0; width: 48px; height: 48px; justify-content: center; font-size: 1.15rem; }
  .feedback-fab span { display: none; }
}

/* ---------- Patrulatere interactive — vezi assets/js/quad-shapes.js ---------- */
.quad-widget {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 24px;
  align-items: center;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 22px;
  margin: 0 0 24px;
}
.qs-svg-wrap { width: 100%; }
.qs-svg { width: 100%; height: auto; }
.qs-polygon { fill: var(--accent-soft); stroke: var(--ink); stroke-width: 2.5; }
.qs-diagonal { stroke: var(--warm); stroke-width: 2; stroke-dasharray: 6 5; }
.qs-midline { stroke: var(--accent); stroke-width: 2.5; }
.qs-height { stroke: #a25ee0; stroke-width: 2.5; stroke-dasharray: 4 3; }
.qs-bisector { stroke: var(--success); stroke-width: 2; }
.qs-vertex-dot { fill: var(--ink); }
.qs-vertex-label { fill: var(--ink); font-size: 14px; font-weight: 800; }
.qs-controls { display: flex; flex-direction: column; gap: 12px; max-height: 440px; overflow-y: auto; }
.qs-buttons { display: flex; flex-wrap: wrap; gap: 8px; }
.qs-toggle { padding: 8px 14px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-soft); color: var(--ink-soft); font-size: 0.85rem; font-weight: 700; }
.qs-toggle.is-active { color: #fff; border-color: var(--accent); background: var(--accent); }
.qs-diag-toggle { display: flex; align-items: center; gap: 8px; font-size: 0.85rem; font-weight: 600; color: var(--ink); cursor: pointer; }
.qs-line-group { display: flex; flex-direction: column; gap: 6px; padding-top: 10px; border-top: 1px dashed var(--border); }
.qs-group-label { display: flex; align-items: center; gap: 8px; font-size: 0.82rem; font-weight: 800; color: var(--ink); }
.qs-swatch { width: 10px; height: 10px; border-radius: 50%; background: var(--qs-color); flex-shrink: 0; }
.qs-sub-row { display: flex; flex-wrap: wrap; gap: 6px; }
.qs-sub-toggle { padding: 6px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-soft); color: var(--ink-soft); font-size: 0.78rem; font-weight: 700; }
.qs-sub-toggle.is-active { color: #fff; border-color: var(--qs-color); background: var(--qs-color); }
.qs-note { margin: 0; font-size: 0.85rem; color: var(--ink-soft); line-height: 1.5; background: var(--bg-soft); border-radius: var(--radius-sm); padding: 10px 12px; }
@media (max-width: 720px) { .quad-widget { grid-template-columns: 1fr; } .qs-controls { max-height: none; } }

/* ---------- Cerc — unghi la centru vs. înscris — vezi assets/js/circle-angles.js ---------- */
.circle-angles-widget {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 24px;
  align-items: center;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 22px;
  margin: 0 0 24px;
}
.ca-svg-wrap { width: 100%; }
.ca-svg { width: 100%; height: auto; touch-action: none; }
.ca-circle { fill: none; stroke: var(--border); stroke-width: 2; }
.ca-central-line { stroke: var(--accent); stroke-width: 2; }
.ca-inscribed-line { stroke: var(--warm); stroke-width: 2; }
.ca-dot { fill: var(--ink); }
.ca-p-point { fill: var(--warm); cursor: grab; }
.ca-p-point:active { cursor: grabbing; }
.ca-label { fill: var(--ink); font-size: 14px; font-weight: 800; }
.ca-readout { display: flex; flex-direction: column; gap: 12px; }
.ca-readout-item { display: flex; justify-content: space-between; align-items: baseline; background: var(--bg-soft); border-radius: var(--radius-sm); padding: 10px 14px; }
.ca-readout-label { font-size: 0.78rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.02em; }
.ca-readout-val { font-size: 1.3rem; font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums; }
.ca-accent { color: var(--accent); }
.ca-warm { color: var(--warm); }
.ca-hint { margin: 0; font-size: 0.82rem; color: var(--ink-soft); line-height: 1.5; }
.ca-basic-line { stroke-width: 2.5; }
.ca-group-label { font-size: 0.78rem; font-weight: 800; color: var(--ink); text-transform: uppercase; letter-spacing: 0.02em; }
.ca-basic-row { display: flex; flex-wrap: wrap; gap: 6px; }
.ca-basic-toggle { padding: 6px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-soft); color: var(--ink-soft); font-size: 0.78rem; font-weight: 700; }
.ca-basic-toggle.is-active { color: #fff; border-color: var(--ca-color); background: var(--ca-color); }
@media (max-width: 720px) { .circle-angles-widget { grid-template-columns: 1fr; } }

/* ---------- Corpuri geometrice 3D — vezi assets/js/solid-3d.js ---------- */
.solid3d-widget {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 24px;
  align-items: center;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 22px;
  margin: 0 0 24px;
}
.s3d-svg-wrap { width: 100%; position: relative; }
.s3d-svg { width: 100%; height: auto; touch-action: none; cursor: grab; }
.s3d-svg:active { cursor: grabbing; }
.s3d-edge { stroke: var(--accent); stroke-width: 2; }
.s3d-important-line { stroke-width: 3; }
.s3d-lines-row { display: flex; flex-wrap: wrap; gap: 6px; }
.s3d-line-toggle { padding: 6px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-soft); color: var(--ink-soft); font-size: 0.78rem; font-weight: 700; }
.s3d-line-toggle.is-active { color: #fff; border-color: var(--s3d-color); background: var(--s3d-color); }
.s3d-drag-hint { margin: 6px 0 0; font-size: 0.76rem; color: var(--ink-faint); text-align: center; }
.s3d-controls { display: flex; flex-direction: column; gap: 14px; }
.s3d-buttons { display: flex; flex-wrap: wrap; gap: 8px; }
.s3d-toggle { padding: 8px 14px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-soft); color: var(--ink-soft); font-size: 0.85rem; font-weight: 700; }
.s3d-toggle.is-active { color: #fff; border-color: var(--accent); background: var(--accent); }
.s3d-formula { margin: 0; font-size: 0.9rem; font-weight: 700; color: var(--ink); background: var(--bg-soft); border-radius: var(--radius-sm); padding: 10px 12px; font-variant-numeric: tabular-nums; }
@media (max-width: 720px) { .solid3d-widget { grid-template-columns: 1fr; } }
