/* ui/web/css/theme.css -- PORT.4: regulile de CONTINUT ale vederilor downloaderului
   (.downloader-view, .status-view, .btn*, .modal-*, .dl-*, .st-*, .tooltip-layer).
   Incarcat de AMANDOUA paginile: cea proprie (`downloader/ui/web/index.html`) si cea a
   OCR-ului (`ui/web/index.html`, prin cale relativa). O singura sursa de adevar -- daca
   ajunge sa fie copiat, cele doua vor diverge tacut.

   Chrome-ul (bara laterala, :root, toast, scrollbar) e in chrome.css, incarcat doar de
   pagina proprie: pagina OCR-ului il are deja pe al ei, cu variabile identice. */

/* Tooltip unic pentru tot shell-ul (sidebar, toolbar, chip-uri de rezultate) -- un singur
   element PARTAJAT, gestionat din JS (wireTooltips() din app.js), NU un ::after per element.
   Nativ `title=` e inconsistent intre Chrome/Edge si intre widget-uri, de-aia data-tooltip
   peste tot -- dar varianta veche (fiecare [data-tooltip] cu propriul ::after) avea doua
   probleme reale (user report 2026-09-03): (1) un element cu data-tooltip care conținea alte
   elemente cu data-tooltip (chip-ul MO + tag-urile/iconițele lui) arăta TOATE tooltipurile
   suprapuse, pentru că :hover urcă mereu la strămoși în CSS; (2) position:absolute e prizonier
   in cel mai apropiat container cu overflow (.dl-results are overflow-y:auto), deci un tooltip
   care s-ar deschide in afara lui era pur si simplu taiat -- "mereu in spate". Un singur
   element `position:fixed`, atasat direct la <body>, scapa de ambele: apare doar pentru cel
   mai specific element hover-uit (closest() gaseste mereu tinta cea mai din interior) si nu
   poate fi taiat de niciun container cu scroll. */
/* UIX.22 (user 2026-09-09, "fa-l alb -- ma rog culoare deschisa din tema"): culorile erau
   fixate pe negru, deci tooltipul ramanea inchis si in tema luminoasa, singurul element
   plutitor din UI care nu asculta de tema. Acum foloseste aceleasi variabile ca `.opt-panel`
   (`ui/web/css/theme.css:263-267`), adica aceeasi suprafata plutitoare ca meniurile: alb in
   tema luminoasa, card inchis in cea intunecata. Marginea si umbra nu sunt decor -- fara
   ele, o suprafata alba peste un fundal alb n-are contur. */
.tooltip-layer {
  position: fixed;
  background: var(--bg-card);
  color: var(--text-primary);
  border: 1px solid var(--border);
  box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.35);
  font-size: var(--font-small);   /* era --font-micro -- "parea micsorat" (user report 2026-09-04) */
  line-height: 1.35;
  padding: 0.25rem 0.5rem;
  border-radius: var(--radius-sm);
  white-space: pre-line;
  max-width: 26rem;
  max-height: 75vh;
  overflow: hidden;
  width: max-content;
  pointer-events: none;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.1s ease;
  z-index: 5000;
}
.tooltip-layer.visible { opacity: 1; visibility: visible; }
/* Cuprinsul MO (hover pe chip-ul ediției): mult text pe coloane (Nr. ... titlu ... Pag.).
   Monospace + `white-space: pre` pastreaza alinierea originala din PDF in loc s-o colapseze
   la un spatiu ("mima mai mult textul original", user 2026-09-04); mai lat ca sa incapa
   titlurile lungi pe un rand. Pozitionarea (langa chip, in dreapta) e in app.js::place(). */
.tooltip-layer.tooltip-cuprins {
  max-width: 52rem;
  max-height: calc(100vh - 8px);   /* tot textul, marginea de sus pana la cea de jos (user 2026-09-04) */
  /* PORT.8: `pre` pastreaza alinierea pe coloane dar nu trece niciodata pe randul urmator --
     un titlu mai lung decat max-width ramane trunchiat de `overflow: hidden`, fara nicio
     eticheta ca s-a taiat ceva. `pre-wrap` pastreaza spatiile/newline-urile originale (deci
     alinierea randurilor normale ramane neatinsa) dar lasa un rand prea lung sa treaca pe randul
     urmator in loc sa fie taiat -- auto-shrink-ul de font de mai sus (app.js::place()) tine
     tot blocul in inaltimea ecranului chiar si cu randuri suplimentare. */
  white-space: pre-wrap;
  font-family: "Consolas", ui-monospace, monospace;
}
/* PORT.8 (redeschis): SUMAR-ul MO e tiparit pe doua coloane, deci get_text() da pana la 125 de
   randuri (PI 805/2026; 20 din 51 de editii PI 2026 trec de 60). Pe o coloana, micsorarea din
   app.js::place() se opreste la 7px si `max-height` taia restul. Pe doua coloane, ca in PDF,
   inaltimea se injumatateste si textul incape intreg la font lizibil. Latime explicita: un
   multicol cu latime automata intr-un element `fixed` nu se intinde singur pe doua coloane; in
   `rem`, nu `ch`: `ch` scade odata cu fontul micsorat de place() si latimea se strangea cu el. */
.tooltip-layer.tooltip-cuprins.cuprins-2col {
  max-width: none;
  width: min(calc(100vw - 16px), 110rem);
  column-count: 2;
  column-gap: 1.5rem;
  column-rule: 1px solid var(--border);
}
/* ═══════════════════════════════════════════════════════════════════════
   DOWNLOADER VIEW -- layout tinta: identic la toate 3 surse (MO/ANM-CNAS/
   EMA RCP). Nimic din regiunile de mai jos nu apare/dispare pe schimbare
   de sursa -- doar continutul textarea-ului si starea butoanelor (disabled).
   ═══════════════════════════════════════════════════════════════════════ */

.downloader-view { flex-direction: column; padding: 1.25rem 1.5rem; gap: 0.75rem; overflow-y: auto; }

.dl-source-tabs { display: flex; gap: 0.375rem; border-bottom: 1px solid var(--border); flex-shrink: 0; }
.dl-source-tab {
  padding: 0.5rem 1rem;
  background: none; border: none; border-bottom: 2px solid transparent;
  color: var(--text-muted); cursor: pointer;
  font-family: inherit; font-size: var(--font-body); font-weight: 600;
  transition: all 0.15s;
}
.dl-source-tab:hover { color: var(--text-primary); }
.dl-source-tab.active { color: var(--accent); border-bottom-color: var(--accent); }

.dl-card {
  background-color: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 1rem 1.25rem;
  flex-shrink: 0;
}
/* min-height fix, NU doar btn-sm mai mic: randul trebuie sa aiba aceeasi inaltime la
   ANM/EMA (fara butoane, doar eticheta) ca la MO (cu Azi/Ieri) -- altfel diferenta ramane,
   oricat de mici ar fi butoanele, fiindca la celelalte module randul e mai scund. */
.dl-card-label-row {
  display: flex; align-items: center; gap: 0.75rem; min-height: 1.75rem;
  margin-bottom: 0.5rem;
}
/* Modul de rulare (azi doar EMA) -- NU un <select> nativ: e element "replaced" in
   Chromium/QtWebEngine (fara tooltip la hover pe opțiuni, se auto-dimensionează după
   eticheta aleasă -- "sare" la fiecare schimbare de mod, user report 2026-09-02 de două
   ori). Buton cu etichetă fixă ("Mod rulare", nu se schimbă niciodată) + panou popup,
   portat din OCR Workbench.wui (ui/web/js/searchOptions.js + .opt-panel/.opt-row) -- popup-ul
   e peste conținut, nu în flux, deci nu mai influențează dimensiunea rândului. */
.opt-trigger-wrap { position: relative; flex-shrink: 0; }
/* PORT.4: restrans la vederile downloaderului. E SINGURUL selector de continut care chiar
   difera de al OCR-ului (`left: 0; min-width: 14rem` aici, `right: 0; min-width: 13rem`
   acolo) -- nerestrans, ar fi mutat panourile de optiuni ale Workbench-ului dintr-o parte
   in alta. Celelalte 13 suprapuneri sunt identice caracter cu caracter. */
.downloader-view .opt-panel,
.status-view .opt-panel {
  display: none; position: absolute; top: calc(100% + 0.375rem); left: 0;
  min-width: 14rem; background-color: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.35);
  padding: 0.5rem; z-index: 100; cursor: default;
}
.opt-panel.open { display: block; }
.opt-row {
  display: flex; align-items: center; gap: 0.5rem;
  padding: 0.3125rem 0.5rem; border-radius: var(--radius-sm);
  cursor: pointer; font-size: var(--font-small);
}
.opt-row:hover { background-color: var(--bg-hover); }
.opt-label { flex: 1; }
.dl-card-label {
  font-size: var(--font-small); font-weight: 600; color: var(--text-muted);
  display: block;
}

/* Inaltime fixa deliberat -- P2.x follow-up-ul cerea "fereastra mica de
   maxim 4-5 randuri, cu scroll", nu una care se intinde cat spatiul ramas.
   ~5 randuri la font-body/line-height 1.4. */
.dl-input {
  width: 100%; height: 6.5rem; resize: none;
  padding: 0.625rem 0.875rem;
  background: var(--bg-body);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text-primary); font-family: inherit;
  font-size: var(--font-small); line-height: 1.4;
  outline: none;
}
.dl-input:focus { border-color: var(--accent); }
.dl-input:disabled { opacity: 0.5; cursor: not-allowed; }
.dl-input-quick { display: flex; gap: 0.5rem; }

.dl-dashboard { font-size: var(--font-small); color: var(--text-muted); flex-shrink: 0; }

.dl-toolbar { display: flex; align-items: center; gap: 0.375rem; flex-shrink: 0; flex-wrap: wrap; }
.dl-toolbar-sep { width: 1px; align-self: stretch; background: var(--border); margin: 0 0.375rem; }
.dl-spacer { flex: 1; }

.btn {
  display: inline-flex; align-items: center; gap: 0.375rem;
  padding: 0.4375rem 0.875rem;
  background: var(--bg-hover); color: var(--text-primary);
  border: 1px solid var(--border); border-radius: var(--radius);
  cursor: pointer; font-family: inherit;
  font-size: var(--font-small); font-weight: 600;
  transition: background 0.15s, opacity 0.15s;
}
.btn i { font-size: 1rem; }
.btn:hover:not(:disabled) { background: var(--bg-active); }
.btn:disabled { opacity: 0.4; cursor: not-allowed; }
.btn-primary { background: var(--accent); color: white; border-color: var(--accent); }
.btn-primary:hover:not(:disabled) { background: var(--accent-hover); }
.btn-danger { border-color: var(--status-error); color: var(--status-error); background: transparent; }
.btn-danger:hover:not(:disabled) { background: rgba(239, 68, 68, 0.12); }
.btn-icon {
  width: 2rem; height: 2rem; padding: 0; justify-content: center;
  background: transparent; border-color: transparent;
}
.btn-icon:hover:not(:disabled) { background: var(--bg-hover); }
/* Azi/Ieri, langa eticheta "Căutare" (doar MO) -- cat mai mici, ca randul etichetei sa
   ramana aproape de aceeasi inaltime ca la ANM/EMA, unde butoanele astea nu exista. */
.btn-sm {
  padding: 0.125rem 0.5rem; font-size: var(--font-micro); font-weight: 600;
}

.dl-progress { height: 0.3125rem; background: var(--bg-hover); border-radius: 4px; overflow: hidden; flex-shrink: 0; }
.dl-progress-bar { height: 100%; width: 0%; background: var(--accent); transition: width 0.2s; }
.dl-progress.indeterminate .dl-progress-bar {
  width: 30% !important; animation: dl-progress-indeterminate 1.2s ease-in-out infinite;
}
@keyframes dl-progress-indeterminate {
  0% { margin-left: -30%; }
  100% { margin-left: 100%; }
}

/* Rezultate/candidati -- "chips". E partea principala a ecranului (poti avea 60 de editii
   MO de rasfoit): ia tot spatiul ramas (flex:1), nu o cutie mica plafonata -- log-ul e cel
   plafonat la cateva randuri, mai jos. min-height:0 e necesar ca flex:1 sa se lase efectiv
   comprimat de continut si scroll-ul intern (overflow-y) sa functioneze, nu doar sa impinga
   pagina la o dimensiune uriasa. Vizibil mereu (nu doar cand :empty), ca inaltimea rezervata
   sa fie identica intre module -- fara asta, un modul cu rezultate goale ar sari brusc la o
   alta dimensiune fata de unul cu rezultate. */
.dl-results {
  display: flex; flex-wrap: wrap; align-content: flex-start; gap: 0.375rem;
  flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
  padding: 0.5rem; border-radius: var(--radius);
  background: var(--bg-body); border: 1px solid var(--border);
}
/* Linkuri instant la o cautare manuala EMA (predictibile, inaintea verificarii complete) --
   spre deosebire de .dl-results, dispare complet cand nu are ce arata (nu e un panou permanent
   al fiecarui modul, doar un bonus opțional). Persistă in vd(sourceId).quickLinks -- schimbarea
   tab-ului NU trebuie sa-l piarda, la fel ca restul rezultatelor. */
.dl-results-quick {
  display: flex; flex-wrap: wrap; align-content: flex-start; gap: 0.375rem;
  flex: 0 0 auto; max-height: 30%; overflow-y: auto; overscroll-behavior: contain;
  padding: 0.5rem; border-radius: var(--radius);
  background: var(--bg-body); border: 1px dashed var(--accent);
}
.dl-results-quick:empty { display: none; padding: 0; border: none; }
.dl-group-header {
  width: 100%; font-size: var(--font-micro); font-weight: 600; color: var(--text-muted);
  padding: 0.25rem 0.125rem; text-transform: uppercase; letter-spacing: 0.02em;
}
.dl-chip {
  display: inline-flex; align-items: baseline; gap: 0.25rem;
  padding: 0.1875rem 0.625rem;
  background: var(--bg-hover); border: 1px solid var(--border-strong, var(--border));
  border-radius: 999px; cursor: pointer;
  font-size: var(--font-small); color: var(--text-primary);
  transition: background 0.12s, border-color 0.12s;
}
.dl-chip:hover { background: var(--bg-active); border-color: var(--accent); }
/* raport de Scan (ANM/CNAS): NOU nu exista inca pe disc, nu are ce deschide la dublu-click */
.dl-chip.disabled { cursor: default; opacity: 0.6; }
.dl-chip.disabled:hover { background: var(--bg-hover); border-color: var(--border-strong, var(--border)); }
.dl-scan-summary {
  width: 100%; display: flex; flex-wrap: wrap; gap: 0.5rem 1rem; align-items: baseline;
  padding: 0.375rem 0.125rem 0.625rem; margin-bottom: 0.375rem;
  border-bottom: 1px solid var(--border); font-size: var(--font-small, 0.8125rem);
}
.dl-scan-summary .dl-scan-total { color: var(--text-muted); }
.dl-scan-summary .dl-scan-total a { color: inherit; }
.dl-scan-summary .dl-scan-new { color: var(--status-ok); }
.dl-scan-summary .dl-scan-updated { color: var(--accent); }
.dl-scan-summary .dl-scan-missing { color: var(--status-processing); }
.dl-scan-summary .dl-scan-deleted { color: var(--status-error, #d9534f); }
.dl-chip.selected { background: var(--accent-glow); border-color: var(--accent); }
.dl-chip .dl-chip-sub { font-size: var(--font-micro); color: var(--text-muted); }
.dl-chip .dl-chip-check { color: var(--status-ok); }
/* candidat MO neaparut in niciun Scan anterior din sesiunea curenta -- vezi highlightNew */
.dl-chip .dl-chip-new-badge {
  font-size: var(--font-micro); font-weight: 700; color: var(--status-ok);
}
/* categoriile recunoscute in cuprins (P2.16, provizoriu) + salvarea in folderul ales */
.dl-chip .dl-chip-tag {
  font-size: var(--font-micro); color: var(--accent);
  background: var(--accent-glow); border-radius: 999px; padding: 0 0.375rem;
}
.dl-chip .dl-chip-save {
  color: var(--status-ok); cursor: pointer; padding: 0 0.125rem;
  border-radius: var(--radius, 4px);
}
.dl-chip .dl-chip-save:hover { background: var(--accent-glow); }

/* Plafonat la ~2 randuri implicit (cerut explicit) -- rezultatele sunt partea mare a
   ecranului, nu log-ul. flex:0 0 auto -- nu mai concureaza cu .dl-results pentru spatiu.

   overscroll-behavior: contain (si pe .dl-results, .st-table-wrap, .st-detail, .st-diff pre):
   cand ajungi la capatul unei cutii cu scroll, browserul continua implicit cu parintele, deci
   rotita "scapa" din log si misca pagina. Feedback explicit: "scroll peste log sa ramana doar
   in log". E exact ce face proprietatea asta -- fara niciun handler de wheel in JS. */
.dl-log {
  flex: 0 0 auto; height: 3.25rem; min-height: 1.75rem;
  background: var(--bg-body); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 0.625rem 0.75rem; overflow-y: auto; overscroll-behavior: contain;
  font-family: "Consolas", monospace; font-size: var(--font-micro); line-height: 1.5;
  color: var(--text-muted); white-space: pre-wrap; word-break: break-word;
}

/* Impartitor intre rezultate si log, doar la MO (app.js il arata/ascunde la schimbarea
   sursei) -- tras, mareste/micsoreaza DOAR log-ul (rezultatele, flex:1, absorb automat
   diferenta). Inaltimea aleasa se retine in localStorage (app.js). */
.dl-panel-divider {
  height: 6px; flex-shrink: 0; cursor: row-resize; border-radius: 3px;
  background: var(--border); transition: background 0.15s;
}
.dl-panel-divider:hover, .dl-panel-divider.dragging { background: var(--accent); }
.dl-log .log-error { color: var(--status-error); }
.dl-log .log-warn { color: var(--status-processing); }
.dl-log .log-success { color: var(--status-ok); }

.dl-status-bar {
  flex-shrink: 0; font-size: var(--font-small); color: var(--text-muted);
  padding: 0.375rem 0; border-top: 1px solid var(--border);
}

/* ═══ Tabul Status — starea reală a fiecărui fișier ═══════════════════════════════════════
   Un tabel dens peste mii de rânduri: coloane înguste, un singur rând per document, și
   culoarea stării ca pastilă în prima coloană — se citește dintr-o privire care e problema,
   fără să citești textul. */
.status-view { flex-direction: column; padding: 1rem 1.25rem; gap: 0.75rem; overflow: hidden; }

.st-toolbar { display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0; }
.st-select, .st-search {
  background: var(--bg-card); color: var(--text-primary);
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  padding: 0.375rem 0.625rem; font-size: var(--font-body); font-family: inherit;
}
.st-search { flex: 0 1 22rem; }
.st-hint { color: var(--text-muted); font-size: var(--font-small); }

.st-counters { display: flex; flex-wrap: wrap; gap: 0.5rem; flex-shrink: 0; }
.st-counter {
  display: flex; align-items: baseline; gap: 0.5rem; cursor: pointer;
  background: var(--bg-card); border: 1px solid var(--border);
  border-left: 3px solid var(--text-dim);
  border-radius: var(--radius-sm); padding: 0.4rem 0.7rem;
}
.st-counter:hover { background: var(--bg-hover); }
.st-counter.active { background: var(--bg-active); border-color: var(--accent); }
.st-counter b { font-size: var(--font-heading); }
.st-counter span { color: var(--text-muted); font-size: var(--font-small); }
.st-counter[data-state="ok"] { border-left-color: var(--status-ok); }
.st-counter[data-state="inaccesibil"] { border-left-color: var(--status-review); }
.st-counter[data-state="sters_de_pe_site"] { border-left-color: var(--status-new); }
.st-counter[data-state="sters_fara_fisier"] { border-left-color: var(--status-error); }
.st-counter[data-state="lipsa_local"] { border-left-color: var(--status-error); }
.st-counter[data-state="niciodata_descarcat"] { border-left-color: var(--status-processing); }
/* Avem fisierul, doar sursa nu-l mai da -- nu e o problema de rezolvat, deci nu e rosu.
   Aceeasi culoare ca "sters_de_pe_site", care inseamna exact acelasi lucru: pastrat local. */
.st-counter[data-state="retras_cu_fisier"] { border-left-color: var(--status-new); }
.st-counter[data-state="in_asteptare_cu_fisier"] { border-left-color: var(--status-new); }
.st-counter[data-state="inaccesibil_cu_fisier"] { border-left-color: var(--status-new); }
.st-counter[data-state="motiv_necunoscut_cu_fisier"] { border-left-color: var(--status-new); }
.st-counter[data-state="motiv_necunoscut"] { border-left-color: var(--status-review); }

.st-table-wrap {
  flex: 1; overflow: auto; overscroll-behavior: contain; border: 1px solid var(--border);
  border-radius: var(--radius); background: var(--bg-card); min-height: 0;
}
.st-table { width: 100%; border-collapse: collapse; font-size: var(--font-small); }
.st-table thead th {
  position: sticky; top: 0; z-index: 1; text-align: left; white-space: nowrap;
  background: var(--bg-sidebar); color: var(--text-muted); font-weight: 600;
  padding: 0.5rem 0.6rem; border-bottom: 1px solid var(--border);
  cursor: pointer; user-select: none;
}
.st-table thead th:hover { color: var(--text-primary); }
.st-table td {
  padding: 0.35rem 0.6rem; border-bottom: 1px solid var(--border);
  max-width: 26rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.st-table tbody tr:hover { background: var(--bg-hover); cursor: pointer; }
.st-pill {
  display: inline-block; padding: 0.1rem 0.5rem; border-radius: 999px;
  font-size: var(--font-micro); white-space: nowrap; color: var(--text-primary);
  background: var(--bg-active); border-left: 3px solid var(--text-dim);
}
.st-pill[data-state="ok"] { border-left-color: var(--status-ok); }
.st-pill[data-state="inaccesibil"] { border-left-color: var(--status-review); }
.st-pill[data-state="sters_de_pe_site"] { border-left-color: var(--status-new); }
.st-pill[data-state="sters_fara_fisier"] { border-left-color: var(--status-error); }
.st-pill[data-state="lipsa_local"] { border-left-color: var(--status-error); }
.st-pill[data-state="niciodata_descarcat"] { border-left-color: var(--status-processing); }
.st-pill[data-state="retras_cu_fisier"] { border-left-color: var(--status-new); }
.st-pill[data-state="in_asteptare_cu_fisier"] { border-left-color: var(--status-new); }
.st-pill[data-state="inaccesibil_cu_fisier"] { border-left-color: var(--status-new); }
.st-pill[data-state="motiv_necunoscut_cu_fisier"] { border-left-color: var(--status-new); }
.st-pill[data-state="motiv_necunoscut"] { border-left-color: var(--status-review); }

.st-detail {
  /* 40% inainte -- prea putin pentru un diff Inline pe un RCP intreg (raportat 2026-09-03).
     70% lasa tabelul de deasupra vizibil, dar diff-ul are loc sa respire. */
  flex-shrink: 0; max-height: 70%; overflow: auto; overscroll-behavior: contain;
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius);
}
.st-detail-head {
  display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;
  padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--border);
  font-weight: 600; position: sticky; top: 0; background: var(--bg-card);
}
/* P2.7: "Verifică acum" -- un HEAD live per document, lângă titlu, nu în locul tabelului */
.st-detail-head-left { display: flex; align-items: center; gap: 0.5rem; min-width: 0; }
.st-detail-head-left span#stDetailTitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.st-detail-body { padding: 0.5rem 0.75rem; font-size: var(--font-small); }
.st-detail-body h4 {
  margin: 0.75rem 0 0.35rem; color: var(--text-muted); font-size: var(--font-small);
  font-weight: 600;
}
.st-detail-body h4:first-child { margin-top: 0; }
.st-detail-body table { width: 100%; border-collapse: collapse; }
.st-detail-body td { padding: 0.2rem 0.5rem 0.2rem 0; color: var(--text-muted); }
.st-detail-body td:first-child { color: var(--text-primary); white-space: nowrap; }

/* P2.9: fiecare rand de versiune (nu doar cea curenta) se deschide cu dublu-click. */
.st-detail-body tr.st-openable { cursor: pointer; }
.st-detail-body tr.st-openable:hover td { color: var(--text-primary); }

/* „Ce s-a schimbat" în panoul de istoric -- doar sumarul (cate linii, ce sectiuni, cand).
   Diferenta insasi NU mai sta aici (era inghesuita intr-un <details> de 40rem, in interiorul
   unui panou deja limitat la 40% din ecran -- raportat 2026-09-03 "textul e prea mic, fereastra
   mica"): "Vezi diferența" deschide #diffModal, pe tot ecranul. */
.st-diff { border-left: 2px solid var(--border); padding: 0.35rem 0 0.35rem 0.6rem;
           margin-bottom: 0.4rem; display: flex; gap: 0.7rem; align-items: baseline;
           flex-wrap: wrap; color: var(--text-muted); }
.st-diff-add { color: var(--status-new); font-weight: 600; }
.st-diff-del { color: var(--status-error); font-weight: 600; }
.st-diff-when { color: var(--text-dim); }
.st-diff-open { margin-left: auto; }

/* Modal cu diferenta -- singurul mod acum (Inline: core/textdiff.py::inline_word_diff_html,
   portat din DIFF LIB PDF\diff_pdf.py). Fara comutator Unificat/Inline: doua moduri pe care
   nimeni nu stia sa le deosebeasca (raportat 2026-09-03) nu erau doua optiuni utile, erau
   confuzie -- Inline arata tot documentul, deci acopera si ce arata Unificat. */
.modal-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.55);
                  display: flex; align-items: center; justify-content: center; z-index: 1000; }
.modal-box { width: 92vw; height: 88vh; max-width: 90rem; background: var(--bg-card);
             border: 1px solid var(--border); border-radius: var(--radius);
             display: flex; flex-direction: column; overflow: hidden; }
.modal-head { display: flex; align-items: center; justify-content: space-between;
              gap: 0.75rem; padding: 0.85rem 1.25rem; border-bottom: 1px solid var(--border);
              font-weight: 600; font-size: 1.05rem; color: var(--text-primary); }
.modal-body { flex: 1; overflow: auto; overscroll-behavior: contain; padding: 1.5rem 2rem; }

/* Tiparul DIFF LIB PDF\diff_pdf.py::build_minimal_html: proza, nu bloc de cod -- serif, text
   justificat, line-height generos, la marime normala de citit (nu 0.82em intr-o caseta mica).
   Singura schimbare fata de sursa portata: culorile vin din tema noastra, nu din hex-uri fixe. */
.st-diff-inline { font-family: Georgia, "Times New Roman", serif; white-space: pre-wrap;
                   word-break: break-word; line-height: 1.8; text-align: justify;
                   font-size: 1.05rem; color: var(--text-primary); max-width: 60rem;
                   margin: 0 auto; }
.st-diff-inline ins { background: rgba(34,197,94,.15); color: var(--status-new);
                       text-decoration: none; border-radius: 2px; padding: 0 0.1em; }
.st-diff-inline del { background: rgba(239,68,68,.15); color: var(--status-error);
                       text-decoration: line-through; border-radius: 2px; padding: 0 0.1em; }

/* Stări adăugate după reconstrucția ANM/CNAS: „lipsă” nu mai e o singură stare, ci trei —
   descărcabil / gazdă moartă / link mort. Verde-galben-roșu în ordinea în care poți face ceva. */
.st-counter[data-state="de_descarcat"], .st-pill[data-state="de_descarcat"] { border-left-color: var(--status-new); }
.st-counter[data-state="gazda_moarta"], .st-pill[data-state="gazda_moarta"] { border-left-color: var(--text-dim); }
.st-counter[data-state="link_mort"], .st-pill[data-state="link_mort"] { border-left-color: var(--status-error); }
/* Recuperat din Internet Archive: avem fișierul, dar linkul e tot mort. Culoare proprie, nu
   verdele lui „ok” — altfel s-ar citi ca „e pe site”, exact confuzia interzisă de P2.18. */
.st-counter[data-state="recuperat_din_arhiva"], .st-pill[data-state="recuperat_din_arhiva"] { border-left-color: var(--accent); }
/* Sursa insasi spune ca nu e nimic de luat -- nu e un esec, deci nici rosu, nici verde. */
.st-counter[data-state="sursa_nu_are_document"], .st-pill[data-state="sursa_nu_are_document"] { border-left-color: var(--text-dim); }
.st-counter[data-state="document_in_asteptare"], .st-pill[data-state="document_in_asteptare"] { border-left-color: var(--status-processing); }

/* OPS.2 E5b: panourile Surse / Istoric / Setari (erau dialoguri Qt). Aceeasi cutie ca
   diferenta, dar cat continutul, nu pe tot ecranul. */
.modal-box.dl-panou { height: auto; max-height: 88vh; }
.dl-panou .modal-body { padding: 1rem 1.25rem; display: flex; flex-direction: column; gap: 0.6rem; }
.dl-panou-foot { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;
                 padding: 0.75rem 1.25rem; border-top: 1px solid var(--border); }
.dl-panou-row { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
.dl-panou-row label { display: inline-flex; align-items: center; gap: 0.4rem; font-size: var(--font-small); }
.dl-panou-pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-size: var(--font-small);
                font-family: Consolas, monospace; color: var(--text-primary); }
.dl-panou .st-table-wrap { flex: 0 1 auto; max-height: 55vh; }
.dl-panou .st-table td { max-width: 22rem; }
.dl-src-in { height: 3.2rem; flex: 1; min-width: 12rem; }
.dl-cell { width: 100%; min-width: 5rem; background: transparent; border: 1px solid transparent;
           border-radius: var(--radius-sm); color: var(--text-primary); font: inherit; padding: 0.1rem 0.3rem; }
.dl-cell:hover, .dl-cell:focus { border-color: var(--border); outline: none; background: var(--bg-card); }
.dl-src-confirm { border: 1px solid var(--accent); border-radius: var(--radius); padding: 0.6rem;
                  display: flex; flex-direction: column; gap: 0.5rem; }
.dl-src-warn { white-space: normal; color: var(--status-review); font-size: var(--font-micro); max-width: 30rem; }
.dl-form { display: grid; grid-template-columns: max-content 1fr; gap: 0.6rem 0.9rem; align-items: center;
           font-size: var(--font-small); }
.dl-form .dl-panou-row { flex-wrap: nowrap; }
.dl-grow { flex: 1; min-width: 0; }
