/* ============================================================
   Split din app.css pe layer/audienta (audit 2026-08-06 SF, ADR 0023).
   Precedenta layerelor (ultimul castiga): vendor < app < kf (tokens..utilities).
   Ordinea @layer e declarata IDENTIC in capul fiecarui fisier -
   prima declaratie stabileste ordinea, repetarea e no-op.
   ATENTIE: ordinea <link>-urilor e CONTRACT de cascada (intra-layer
   castiga ultimul incarcat): tokens, scoreboard, components, admin,
   base-layout, site-palette; juratul: tokens, judge, base-layout.
   NU adauga/reordona <link>-uri fara audit de coliziuni (ADR 0023).
   scoreboard.css - S8 BRACKET/scorecard/podium + S10c CATEGORY SHOW.
   ============================================================ */
@layer vendor, app, tokens, base, layout, components, utilities;

@layer app {
/* === 8. BRACKET ============================================ */

/* ── Pagina categorie LATĂ (fără sidebar, container extins pt bracket) ──
   Regula `.page-wide .app-wrap { max-width: 1600px }` a plecat de aici (B68): a devenit un remap de
   `--container-max` pe `body.page-wide` (base-layout.css § 2 LAYOUT), ca bara și subsolul să urce
   odată cu conținutul — altfel conținutul ieșea cu 400px în afara lor.
   ⚠ NU o reintroduce aici: are specificitate 0-2-0 și ar bate tăcut tokenul (0-1-0), indiferent că
   base-layout.css se încarcă mai târziu. Rezultatul ar fi bara și subsolul late, wrapperul condus
   din altă sursă, și orice reglaj din token părând fără efect. */

/* Filtrul „Ale mele" (mine-filter.js): body[data-mine-only] ascunde cardurile străine.
   CSS-driven — compune cu archive-filter.js (care umblă la style.display pe altă axă). */
body[data-mine-only] [data-mine="0"] { display: none !important; }

/* ── Strip categorii = TAB-URILE paginii de concurs, și SUBTITLUL ei: tabul activ poartă numele
      categoriei, TOP N, discriminatorii și starea, fiindcă `h2.res-cat-name` le repeta exact
      (șters 2026-08-15). Antetul mare de concurs = .res-hero via _contest_head. ──

   UN SINGUR RÂND CARE SCROLLEAZĂ, niciodată două rânduri stivuite: cu wrap, poziția fiecărui tab
   se mută la orice redimensionare, deci memoria spațială moare (NN/g „Use Only One Row of Tabs";
   Material 3 „when a set of tabs cannot fit on screen, use scrollable tabs").

   Mecanica de derulare + estomparea + capul de bandă (etichetă/număr/săgeți) NU mai stau aici:
   sunt `.rail` / `.rail-fade` / `.rail-nav__*` în components.css, refolosite de toate benzile
   (categorii, tab-uri admin, clasament). Aici rămâne DOAR ce e al categoriilor.

   ⚠️ RIGLA E PE TAB-URI, nu pe bandă — vezi comentariul de la `.cat-strip__item`: fundalul unui
   părinte se pictează sub fundalurile copiilor, deci ca fundal de bandă ar fi fost acoperită, și
   s-ar fi întins și în dreapta categoriei active. */
/* Linia de baza se intinde pe TOATA latimea, nu doar cat tin taburile (owner, 2026-09-28) — ea e
   acum singurul separator fata de antet, care si-a pierdut firul propriu.
   ⚠️ `box-shadow: inset`, NU `border-bottom` pe banda: un border s-ar aseza SUB cutiile taburilor
   (e in afara cutiei de continut), deci ar iesi doua linii paralele la 3px una de alta. Umbra
   inset se picteaza in interiorul benzii, peste fundalul ei dar SUB copii — deci taburile o acopera
   exact cu propria lor muchie (cerneala pana la activ, fir neutru dupa el), iar dincolo de ultimul
   tab ramane ea sa duca linia pana in margine. Culoarea e `--sm-hair`, adica fix ce au deja
   taburile de DUPA cel activ: traseul ramane „din activ spre stanga", cum a fost gandit.
   ⚠️ Nu se muta pe `.cat-nav`: acolo ar fi sub banda, nu in ea, si s-ar dubla la fel. */
.cat-strip { display: flex; align-items: stretch; box-shadow: inset 0 -3px 0 var(--sm-hair); }

/* `margin-bottom: 0`: linia de bază a benzii și șina verticală a lui `.cat-block` trebuie să se
   ATINGĂ, altfel „L"-ul verde se rupe într-un colț cu spațiu. */
.cat-nav { margin-top: -.5rem; margin-bottom: 0; }
/* TAB CU CUTIE, tip „folder" (brand: „Tabs lift into a bordered folder tab"). Fără cutie, tab-urile
   inactive erau doar text pe fundalul paginii — se citeau ca o listă, nu ca un control apăsabil
   (raport user 2026-08-15: „nu prea îți dai seama uman că sunt tab-uri"). Cutia e UN singur nivel:
   hairline pe trei laturi, muchia de jos deschisă spre riglă, zero pastile înăuntru.
   Semnalul de STIL = muchia de 3px cu hue-ul stilului — aceeași semnătură ca `.style-pill`
   (border-left colorat), refolosită ca marcaj, nu ca a doua cutie. Colțuri SHARP — brand brutalist. */
.cat-strip__item {
    flex: 0 0 auto; scroll-snap-align: start;
    display: inline-flex; flex-direction: column; justify-content: center; align-items: flex-start;
    gap: .05rem; padding: .3rem .7rem; border-radius: var(--sm-r-row) var(--sm-r-row) 0 0;
    border: 1px solid var(--border-hair);
    /* LINIA VERDE E PE TAB-URI, nu pe bandă. Ca fundal al benzii avea două defecte: fundalul unui
       părinte se pictează întotdeauna sub fundalurile copiilor (deci tab-urile o acopereau —
       `z-index` nu schimbă ordinea asta), și mai ales se întindea pe TOATĂ banda. Traseul trebuie să
       plece DIN categoria activă spre stânga, nu să treacă și în dreapta ei: tab-urile de după activ
       primesc hairline neutru (vezi regula cu `~` de mai jos).
       `--primary`, NU `--volt`: volt-ul e umplere (14.65:1 cu text ink); ca linie pe suprafața light
       dă 1.10:1. `--primary` e marcajul care urmează tema (olive 6.06:1 / lime-dim 9.75:1). */
    border-bottom: 3px solid var(--sm-paper);
    border-inline-start: 3px solid hsl(var(--style-h) var(--style-s) var(--style-l-accent));
    background: var(--sm-s2); color: var(--sm-text-mid);
    text-decoration: none; white-space: nowrap;
    /* Mecanismul de folder: inactivele stau 3px mai jos = retrase, activul rămâne sus. Jos NU se
       adaugă marjă — muchia de jos a tuturor cade la aceeași înălțime (`align-items: stretch`), deci
       liniile lor se leagă într-una singură, continuă. */
    margin-block-start: 3px;
}
/* Tab-urile lipite: orice spațiu între ele ar rupe linia în segmente. */
.cat-strip__item + .cat-strip__item { margin-inline-start: 0; }
/* Ce vine DUPĂ categoria activă nu mai e pe traseu → hairline neutru, ca banda să rămână așezată,
   fără să ducă verdele mai departe. `~` = frații de după, singurul mod de a exprima „la dreapta lui"
   fără JS. */
.cat-strip__item--on ~ .cat-strip__item { border-bottom-color: var(--sm-hair); }
/* `border-block-color` + `border-inline-end-color`, NU `border-color`: shorthand-ul ar șterge și
   muchia colorată cu hue-ul stilului (capcana „shorthand reset" din UI_RULES). */
.cat-strip__item:hover { background: var(--sm-s3); color: var(--sm-text-hi); border-block-start-color: var(--border-strong); border-inline-end-color: var(--border-strong); }
.cat-strip__l1 { display: inline-flex; align-items: baseline; gap: .35rem; }
.cat-strip__fmt { color: var(--text-faint); }
/* `.cat-strip__top` (fostul „T8" owner-only) = ȘTERS: `TOP N` apare acum pe TOATE tab-urile, în
   linia de context, pentru toată lumea. */
/* ACTIV = trei semnale (NN/g cere minimum două): umplere volt · ridicat față de frați · tip mai mare
   (rolul de SUBTITLU). Muchia lui de jos e ULTIMA aprinsă: de aici traseul verde merge spre stânga,
   până în colțul din care coboară șina lui `.cat-block`. */
.cat-strip__item--on {
    margin-block-start: 0;
    border-block-start-color: var(--sm-paper); border-inline-end-color: var(--sm-paper);
border-bottom-color: var(--sm-paper); color: var(--sm-on-paper); background: var(--sm-paper); }
.cat-strip__item--on:hover {
    border-block-start-color: var(--sm-paper); border-inline-end-color: var(--sm-paper);
border-bottom-color: var(--sm-paper); color: var(--sm-on-paper); background: var(--sm-paper); }
.cat-strip__item--on .cat-strip__fmt { color: var(--sm-on-paper-mid); opacity: 1; }

/* ── CONȚINUTUL CATEGORIEI SELECTATE — un singur bloc, cu șină verticală în culoarea marcajului.
   Rezolvă două lucruri deodată: (1) „de unde până unde ține categoria asta" — line-up, juriu,
   calificări și bracket sunt ale tabului aprins de deasupra; (2) legătura cerută între banda de
   categorii și tab-urile Calificare|Bracket, fără un conector care ar trebui să urmărească poziția
   unui tab dintr-o bandă care SCROLLEAZĂ (ar arăta greșit la prima derulare).
   RITMUL: secțiunile dinăuntru nu se mai ating (raport user: „calificările și bracketul sunt lipite
   de line-up"). Pas fluid, din aceeași scară peste tot — strâns în grup, aerisit între secțiuni. */
.cat-block {
    --cat-gap: clamp(.85rem, 2.5vw, 1.5rem);
    /* `--primary`, NU `--volt` — vezi linia de bază a benzii: volt-ul ca LINIE dă 1.10:1 pe light. */
    border-inline-start: 3px solid var(--primary);
    padding: var(--cat-gap) 0 var(--cat-gap) clamp(.55rem, 1.8vw, 1rem);
border-inline-start-color: var(--sm-paper); }
.cat-block .res-cat-head { margin-bottom: 0; }
/* Sub-tab-urile sunt ÎN AFARA blocului: acolo se oprește șina (cerință user). Spațiul dintre ele și
   bloc e al secțiunii următoare, deci stă pe ele. */
.cat-panels { margin-top: var(--cat-gap); }
.cat-panels .tab-content { padding-top: var(--cat-gap); }

/* ── „ACUM SE ÎNTÂMPLĂ AICI" (public/_live_signpost.html.twig) — semn, nu redirect.
   Bandă lată, apăsabilă pe toată suprafața: e singurul lucru din pagină care răspunde la „ce
   trebuie să fac eu acum". Volt DOAR aici și pe tabul activ; punctul pulsă ca `.page-state__dot`,
   fiindcă aici înseamnă chiar LIVE.

   UN SINGUR RÂND, până la 320px (raport user: ocupa patru rânduri pe telefon și anula exact
   înălțimea câștigată în antet). `nowrap` peste tot + `min-width: 0` pe numele categoriei, care e
   singurul element elastic: el absoarbe strâmtoarea cu `…`, restul rămân întregi.
   Pragul la care cade starea e o INTEROGARE DE CONTAINER, nu `@media`: banda stă în antet ca o
   coloană de ~16rem chiar și pe un ecran de 1600px, deci lățimea ecranului n-are ce spune despre ea. */
.live-sign {
    container-type: inline-size;
    display: flex; flex-wrap: nowrap; align-items: center; gap: .35rem clamp(.4rem, 2vw, 1.2rem);
    margin: 0 0 .85rem; padding: .5rem .75rem;
    /* ⚠️ ȚINTĂ DE TAP: linkul ăsta e un control întreg. Chenarul de 1px (era 2px înainte de skin)
       scoate 2px din înălțime — estimare statică la 390px: 16 padding + 26.4 `.live-sign__go` +
       2 chenar = 44.4px, adică LA limita `--tap-min` și peste `--tap-aa`. Nu subția mai mult fără
       să măsori cu `ui-probe tap`. Nota venea din allowlist-ul de controale al skinului; a coborât
       aici odată cu valoarea, la B159 L10 (F2), ca să nu rămână fără subiect. */
    border: 1px solid var(--sm-line); background: var(--sm-s1);
    color: var(--text); text-decoration: none;
box-shadow: var(--sm-elev-card); border-radius: var(--sm-r-card); }
.live-sign:hover { background: var(--sm-s2); }
/* ── `.now-tag` = SSOT pentru marcajul „ACUM SE ÎNTÂMPLĂ AICI". Apare în două locuri: banda de
   semnalizare de pe pagina de concurs și rândul categoriei care rulează, în cardurile de pe
   /concursuri. Un singur loc, ca cele două să nu poată diverge.
   Umplere `--status-active-bg` (volt) cu cerneală deasupra — volt-ul ca FUNDAL e corect (14.65:1);
   pulsul e cel de la `.page-state__dot`, fiindcă aici chiar înseamnă LIVE. */
.now-tag {
    display: inline-flex; align-items: center; gap: .4rem; flex: none;
    font-family: var(--font-display); font-weight: var(--type-status-weight, 900);
    text-transform: var(--type-status-case, uppercase); letter-spacing: var(--type-status-tracking, .08em); font-size: var(--font-sm);
    background: var(--status-active-bg); color: var(--status-active-fg);
    padding: .1rem .5rem;
border-radius: var(--sm-r-pill); }
.now-tag__dot {
    width: .5rem; height: .5rem; border-radius: 50%; background: currentColor;
    animation: page-state-pulse 1.2s ease-in-out 3;
}
.live-sign__what { display: flex; flex-wrap: nowrap; align-items: baseline; gap: .15rem .5rem; min-width: 0; }
/* Singurul element elastic din bandă: se taie cu `…` când nu mai e loc. Mărimea e fluidă fiindcă la
   320px un titlu de 18px ar mânca singur jumătate din rând. */
.live-sign__cat {
    min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-family: var(--font-display); font-weight: 700;
    text-transform: var(--type-title-case, uppercase); letter-spacing: var(--type-title-tracking, .02em);
    font-size: clamp(var(--font-base), 3.2vw, var(--font-xl));
}
.live-sign__st {
    flex: none; color: var(--text-secondary);
    font-family: var(--font-mono); font-weight: 700; font-size: var(--font-2xs); letter-spacing: var(--type-status-tracking, .04em);
}
.live-sign__st::before { content: "·"; margin-inline-end: .35rem; }
.live-sign__go {
    flex: none; margin-inline-start: auto;
    display: inline-flex; align-items: center; gap: .35rem;
    font-family: var(--font-display); font-weight: 700;
    text-transform: var(--type-control-case, uppercase); letter-spacing: var(--type-control-tracking, .05em); font-size: var(--font-xs);
    background: var(--sm-text-hi); color: var(--sm-bg);
    padding: .3rem .7rem; white-space: nowrap;
border-radius: var(--sm-r-pill); }
/* Sub pragul ăsta rămân numele categoriei și butonul — starea e derivabilă în două secunde, după ce
   omul ajunge acolo; numele și acțiunea nu sunt. */
@container (max-width: 26rem) {
    .live-sign__st { display: none; }
}
.live-sign:hover .live-sign__go { background: var(--sm-text-hi); color: var(--sm-bg); font-weight: 700; border-radius: var(--sm-r-pill); }

/* Coloana își ia baza din scala comună (`--bk-colw`), nu dintr-o pereche de px fixe. Podeaua de
   2.4rem e ce face un Top-32 să încapă pe telefon; plafonul e exact lățimea de dinainte (190px). */
/* ⚠️ Plafonul trebuie să urce cu `--scale-cap`, ca `--bk-colw`. Până pe 2026-08-27 era `11.875rem`
   FIX, iar `max-width` bate `flex-basis` — deci amendamentul 1 din ADR 0041 (scara ×2 pe proiector)
   era ANULAT exact pe lățimea coloanei: un Top-8 (5 coloane) nu putea trece de ~950px oricât de lat
   era ecranul. Așa arătau amândouă reclamațiile userului — „baleierea poate ocupa mai mult
   stânga-dreapta" și „un Top 8 rămâne în mijlocul ecranului": o singură cifră, două simptome.
   Pe public `--scale-cap` e 1, deci nimic nu se schimbă — podeaua de 2.4rem, cea care face un Top-32
   să încapă pe telefon, rămâne neatinsă. */
.bk-col {
    display: flex;
    flex-direction: column;
    flex: 1 1 var(--bk-colw, 96px);
    min-width: 2.4rem;
    max-width: calc(11.875rem * var(--scale-cap, 1));
}
.bk-col-label {
    font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .07), calc(var(--font-xs) * var(--scale-cap, 1)));
    font-weight: var(--type-label-weight, 900);
    text-transform: var(--type-label-case, uppercase);
    letter-spacing: var(--type-label-tracking, .1em);
    color: var(--sm-text-mid);
    text-align: center;
    padding: clamp(.1rem, calc(var(--bk-u, 12rem) * .035), calc(.35rem * var(--scale-cap, 1))) clamp(.1rem, calc(var(--bk-u, 12rem) * .05), calc(.5rem * var(--scale-cap, 1))) clamp(.15rem, calc(var(--bk-u, 12rem) * .05), calc(.5rem * var(--scale-cap, 1)));
    border-bottom: 1px solid var(--sm-hair);
    margin-bottom: .5rem;
}
.bk-col-label--active { color: var(--sm-text-hi); background: transparent; border-bottom-color: var(--sm-live-mark); }
.bk-col-label--done   { color: var(--sm-text-mid); border-bottom-color: var(--sm-hair); }

.bk-col-body {
    display: flex;
    flex-direction: column;
    flex: 1;
}

/* Fiecare battle = un slot flex egal, conținut centrat → runda cu N/2 matchuri
   pică fix la mijlocul dintre cei 2 feederi din runda dinainte. */
.bk-match {
    flex: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    position: relative;
}

/* ── PRIMUL RÂND (T32) = FĂRĂ overlap → conector OUTGOING curat din marginea feederului.
   Brațul pleacă din muchia dreaptă a cardului (left:100%) și ajunge la bara verticală (merge point)
   la --bk-firstarm. De acolo, o linie de legătură (--bk-childlink) merge până în cardul T16. */
.bk-col--first .bk-match--up::after,
.bk-col--first .bk-match--down::after {
    content: '';
    position: absolute;
    left: 100%;
    width: var(--bk-firstarm);
    height: 50%;
    border-right: 2px solid var(--border-subtle);
}
.bk-col--first .bk-match--up::after   { top: 50%;    border-top: 2px solid var(--border-subtle); border-top-right-radius: 6px; }
.bk-col--first .bk-match--down::after { bottom: 50%; border-bottom: 2px solid var(--border-subtle); border-bottom-right-radius: 6px; }
.bk-col--first .bk-match--straight::after {
    content: '';
    position: absolute;
    left: 100%;
    top: 50%;
    width: var(--bk-firstarm);
    border-top: 2px solid var(--border-subtle);
}
/* ⚠️ BUG VECHI, reparat de skin si coborat aici la B159 L10 (F2): cele TREI reguli de deasupra
   (`--up`, `--down`, `--straight`) au (0,2,1) si bat `.bk-match--resolved::after` (0,1,1), deci
   bratele primului tur ramaneau GRI si dupa meci. Regula asta are aceeasi specificitate ca ele si
   vine DUPA toate trei — de aceea castiga. Doar culoarea: geometria conectorilor
   (left/top/width/height) ramane mai sus.
   ⚠️ ORDINEA E REGULA, nu o intamplare. La coborarea din `@layer skin` regula a aterizat intre
   `--down` si `--straight`, iar `--straight` isi rescria `border-top` — deci pe meciurile DREPTE din
   prima coloana bratul castigatorului ramanea gri. Gasit abia de sonda pe paginile AUTENTIFICATE
   (2026-09-24): bracketul cu meci drept rezolvat in prima coloana apare doar pe concursul live al
   organizatorului. Daca adaugi inca o regula de conector in prima coloana, pune-o INAINTEA asteia. */
.bk-col--first .bk-match--resolved::after { border-color: var(--success); }
/* linia de legătură de la merge point în cardul copil (T16) — ca să nu fie lipit de bracket */
.bk-col--second .bk-match::before {
    content: '';
    position: absolute;
    left: calc(var(--bk-childlink) * -1);
    top: 50%;
    width: var(--bk-childlink);
    border-top: 2px solid var(--border-subtle);
}
.bk-col--second .bk-match--resolved::before { border-color: var(--success); }

/* ── COLOANELE 3+ = overlap → conector „merge" (.bk-merge) pe matchul avansat:
   o LINIE verticală întinsă între CENTRELE celor 2 feederi (25%→75%) + cot scurt în card.
   Capetele sunt pur PROCENTUALE (sloturile flex egale țin centrele la 25%/75% indiferent de
   înălțimea cardului — ex. nume pe 2 rânduri); linia trece PE SUB cardurile feeder
   (z-index: .bk-battle=2 peste .bk-merge=1) → pare că iese din muchia cardului. */
.bk-merge {
    position: absolute;
    left: calc(var(--bk-arm) * -1);
    top: 25%;
    bottom: 25%;
    z-index: 1;
    border-left: 2px solid var(--border-subtle);
}
/* cot scurt din linie în card, la jumătatea matchului avansat */
.bk-col:not(.bk-col--first):not(.bk-col--second):not(.bk-col--final):not(.bk-col--plain) .bk-match::after {
    content: '';
    position: absolute;
    left: calc(var(--bk-arm) * -1);
    top: 50%;
    width: var(--bk-arm);
    border-top: 2px solid var(--border-subtle);
}
/* match rezolvat → linie + cot verzi (calea câștigătorului) */
.bk-match--resolved .bk-merge,
.bk-match--resolved::after { border-color: var(--success); }

/* Card battle — z-index 2 = peste liniile merge (vezi comentariul .bk-merge) */
.bk-battle {
    border: 1px solid var(--sm-card-edge);
    border-radius: var(--radius-sm);
    background: var(--sm-card-surface);
    overflow: hidden;
    /* Aerul dintre battle-uri în aceeași coloană. Coeficientul și tavanul au crescut pe 2026-08-27
       (userul: „să mărim puțin spațiul dintre bracketuri, că e foarte strâns") — înainte ieșeau
       maximum 6px pe proiector, adică practic lipite. Podeaua de 1px rămâne: ea ține Top-32 pe
       telefon. E singura pârghie de spațiere verticală — coloanele sunt flex cu sloturi egale
       (`.bk-match { flex: 1 }`), fără `gap`. */
    margin: clamp(1px, calc(var(--bk-u, 12rem) * .04), calc(7px * var(--scale-cap, 1))) 0;
    position: relative;
    z-index: 2;
    transition: box-shadow .1s;
box-shadow: var(--sm-elev-card); }
.bk-battle--pending   { border-color: var(--sm-hair); box-shadow: none; }
.bk-battle--active    { border-color: var(--sm-live-mark); background: var(--sm-live-tint); color: var(--sm-text-hi); box-shadow: inset 0 3px 0 var(--sm-live-mark); }
.bk-battle--completed { background: var(--sm-s1); }
.bk-battle--golden    { border-color: var(--sm-warning); box-shadow: inset 0 3px 0 var(--sm-warning); color: var(--sm-text-hi); background: var(--sm-live-tint); }
/* ---- Hover pe cardul de meci, coborat din `@layer skin` la B159 L10 (F2) ----
   ⚠️ Ordinea din blocul asta e CONTRACT: `.bk-battle:hover` si `.bk-battle--active:hover` au aceeasi
   specificitate (0,2,0), deci decide pozitia. Starile (LIVE, departajare) se repeta cu `:hover`
   tocmai ca hoverul neutru sa nu le stinga — de-aia stau DUPA el. */
.bk-battle:hover,
.bk-battle--expandable:hover { border-color: var(--sm-line); box-shadow: var(--sm-elev-card); }
.bk-battle--active:hover { background: var(--sm-live-tint); color: var(--sm-text-hi); border-color: var(--sm-live-mark); box-shadow: inset 0 3px 0 var(--sm-live-mark); }
.bk-battle--golden:hover { background: var(--sm-live-tint); color: var(--sm-text-hi); border-color: var(--sm-warning); box-shadow: inset 0 3px 0 var(--sm-warning); }

/* ── PLACEHOLDER (schelet bracket pregătit din start, ca finala „urmează") ──
   bg OPAC (--paper, ca pagina): linia merge trece pe sub carduri → fără mască s-ar vedea prin el.
   Stă SUB `.bk-battle`: are aceeași specificitate (modificatorul ÎNLOCUIEȘTE clasa de bază în
   selector), deci decide ordinea din fișier. Până pe 2026-09-05 stătea deasupra și `border` +
   `background` de aici erau anulate tăcut de bază — placeholderul n-a fost niciodată punctat.
   Prins de gate-ul css-structure (B148). */
.bk-battle--ph {
    border: 1px dashed var(--sm-line);
    background: var(--sm-bg);
    box-shadow: none;
    min-height: clamp(18px, calc(var(--bk-u, 12rem) * .22), calc(40px * var(--scale-cap, 1)));
    display: flex; align-items: center; justify-content: center;
}
.bk-battle--ph i { font-size: var(--font-xs); color: var(--fg4); opacity: .5; }
/* conectorii estompați ai placeholderului stau SUB brațele finalei (`.bk-col--final .bk-battle::before`),
   mai jos în fișier — aceeași capcană de ordine ca mai sus. */

/* Entry row în battle */
/* Rândul de concurent = purtătorul de text al bracketului. Mărimea lui vine din ACEEAȘI scală
   (`--bk-u`) ca geometria conectorilor, deci numele se micșorează exact cât se micșorează cardul.
   Fallback-ul din `var(--bk-u, 12rem)` acoperă coloana standalone de la locul 3: ea stă în afara
   mirror-ului (ADR 0009), deci nu moștenește scala — fără fallback ar rămâne la podea. */
.bk-entry {
    display: flex;
    align-items: center;
    gap: clamp(.1rem, calc(var(--bk-u, 12rem) * .03), calc(.3rem * var(--scale-cap, 1)));
    padding: clamp(.08rem, calc(var(--bk-u, 12rem) * .03), calc(.3rem * var(--scale-cap, 1))) clamp(.12rem, calc(var(--bk-u, 12rem) * .05), calc(.5rem * var(--scale-cap, 1)));
    font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .085), calc(var(--font-base) * var(--scale-cap, 1)));
    border-bottom: 1px solid var(--sm-hair);
    line-height: 1.25;
    min-height: clamp(14px, calc(var(--bk-u, 12rem) * .17), calc(28px * var(--scale-cap, 1)));
}
/* `border-bottom-style`, nu prescurtarea `border-bottom: none`: prescurtarea resetează ȘI culoarea
   la `currentColor`, iar skinul o dădea pe a lui (`--sm-hair`) prin layer. Linia nu se desenează
   oricum (stil `none` ⇒ lățime folosită 0), deci pe ecran e identic — dar dump-ul de stiluri nu
   mai minte. B159 L10 (F2). */
.bk-entry:last-of-type { border-bottom-style: none; }
/* ── BUGETUL DE COLȚURI al cardului de bracket (iter. 2o) ──
   Cardul e cel mai strâmt loc din tot produsul: pe un Top-32, un rând are ~40px lățime. Orice
   etichetă care stă ÎN FLUX fură lățime exact de la singura informație care contează — numele.
   De aceea toate marcajele sunt ABSOLUTE și au fiecare colțul lui, ca să nu se calce între ele:
     sus EXTERIOR → `.bk-golden-mark` (colțul pliat cu rundele de departajare) — al CARDULUI
     sus INTERIOR → `.bk-battle__more` (chevronul „apasă pt scorecard")       — al CARDULUI
     jos EXTERIOR → `.e-chip__out` (RETRAS) / `.bk-wo-mark` (W.O.)            — al RÂNDULUI
   „Exterior" = departe de centrul bracketului; se inversează pe aripa dreaptă, ca numele.
   Marcajele de JOS stau SUB text (`z-index: 0` vs numele la 1): la nume scurte se văd întregi, la
   nume lungi textul trece peste ele — informația portantă câștigă mereu (cerința userului).
   ⚠️ RETRAS și W.O. împart același colț fiindcă sunt marcaje ale unei PERSOANE, nu ale meciului, iar
   într-un walkover cad pe rânduri diferite: RETRAS pe cel care a ieșit, W.O. pe cel care a avansat.
   Vezi `_bracket_column` — W.O. a stat pe card până în iter. 2o și ateriza vizual tocmai pe rândul
   retrasului, adică pe omul care NU beneficiase de el. */
.bk-entry { position: relative; }
.bk-entry .e-chip__out,
.bk-entry .bk-wo-mark {
    position: absolute; bottom: 0; left: 0; right: auto; top: auto; z-index: 0;
    font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .05), calc(var(--font-3xs) * var(--scale-cap, 1)));
    padding: 0 2px; line-height: 1.15; pointer-events: none;
}
.bk-half--right .bk-entry .e-chip__out,
.bk-half--right .bk-entry .bk-wo-mark { left: auto; right: 0; }
/* Rezervă intrată pe locul unui retras (ADR 0042) — colțul de jos INTERIOR, singurul rămas liber:
   exteriorul e luat de RETRAS/W.O., iar un promovat POATE avea W.O., deci n-au voie să împartă colțul.
   Semn, nu nume: numele înlocuitorului ar mânca exact bugetul de lățime care ține un Top-32 pe telefon
   (de-aia săgețile din listele de calificare NU au intrat aici, 2026-08-28). Rămâne VIZIBIL pe
   proiector — o înlocuire e informație publică de concurs (decizia ownerului, 2026-08-30). */
.bk-entry .bk-sub-mark {
    position: absolute; bottom: 0; right: 0; left: auto; top: auto; z-index: 0;
    font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .05), calc(var(--font-3xs) * var(--scale-cap, 1)));
    line-height: 1.15; padding: 0 2px; color: var(--fg3); pointer-events: none;
}
.bk-half--right .bk-entry .bk-sub-mark { right: auto; left: 0; }
/* Declanșatorul de corecții (⋮) stă la COADA rândului, pe latura exterioară: numele se aliniază
   spre centru, deci acolo e spațiul care prisosește. Așa butonul nu mai taie din mijlocul rândului. */
.bk-entry .cm-trigger {
    order: -1; flex: none;
    padding: 0 1px;
    font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .06), calc(var(--font-xs) * var(--scale-cap, 1)));
}
.bk-half--right .bk-entry .cm-trigger { order: 1; }
/* Trofeul rămâne pe latura INTERIOARĂ, lângă capătul numelui — deci se oglindește invers față de ⋮. */
.bk-half--right .bk-entry__trophy { order: -1; }
/* câștigătorul iese clar în evidență (bandă verde la margine + bold) ca să-l urmărești ușor */
.bk-entry--winner {
    background: var(--sm-win-tint); color: var(--sm-text-hi); font-weight: 700;
    box-shadow: inset 3px 0 0 0 var(--sm-accent-mark);
}
.bk-entry--loser  { color: var(--sm-text-mid); font-weight: 400; }   /* lizibil, dar clar secundar */
.bk-entry--bye    { color: var(--sm-text-mid); font-style: normal; letter-spacing: .08em; font-weight: 500; } /* avans liber — fără win/lose */
/* numele se aliniază spre CENTRUL bracketului: aripa stângă → dreapta, aripa dreaptă → stânga.
   Finala = centru. Nume lungi / 2v2 → maxim 2 RÂNDURI apoi taie (line-clamp); geometria nu se
   strică — sloturile .bk-match rămân egale, conectorii sunt procentuali. */
.bk-entry__name {
    /* PODEA DE LIZIBILITATE DOAR PE NUME (B158, 2026-09-16, cererea ownerului): cutiile și scala rămân
       ale ADR 0040 — bracketul se mulează în continuare pe ecran, fără derulare laterală — dar NUMELE
       concurentului nu coboară sub `--font-xs` (11.2px) pe ecran mic. Pe ecran lat `1em` (scala
       rândului) e deja mai mare, deci acolo nu se schimbă nimic. Costul asumat: pe un Top 32 la 360px
       cutia are ~38px → câteva litere pe rând, două rânduri, apoi „…" (line-clamp de mai jos). */
    font-size: max(var(--font-xs), 1em);
    /* Cu litere mai mari decât cutia, un cuvânt lung se rupe („Particip/ant" la 390px, Top 8). `hyphens`
       pune cratimă unde browserul are dicționar pentru `lang="ro"`; altfel rămâne ruptura de mai jos. */
    hyphens: auto;
    /* `position/z-index`: numele trece PESTE marcajele de jos (RETRAS, W.O.), nu invers. */
    position: relative; z-index: 1;
    flex: 1; min-width: 0; text-align: right;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden; overflow-wrap: anywhere;
}
.bk-half--right .bk-entry__name { text-align: left; }
.bk-col--final .bk-entry__name  { text-align: center; }
.bk-col--plain .bk-entry__name  { text-align: center; }   /* coloană standalone (ex. „Locul 3") */
.bk-entry__trophy { color: var(--rank-gold-ink); font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .075), calc(var(--font-sm) * var(--scale-cap, 1))); flex-shrink: 0; }

/* Badge golden round */
/* marcaj departajare = COLȚ PLIAT (triunghi) cu nr de runde suplimentare (1/2/3) pe colț.
   Stă pe latura EXTERIOARĂ (opusă numelui, care e aliniat spre centru): stânga pe aripa
   stângă, dreapta pe aripa dreaptă → nu acoperă numele. Absolut → nu mărește înălțimea. */
.bk-golden-mark {
    position: absolute; top: 0; left: 0; z-index: 3;
    /* Colțul urmează scala cardului: la 190px acoperă un sfert de nume, la 40px l-ar acoperi tot. */
    width: clamp(11px, calc(var(--bk-u, 12rem) * .16), 26px); height: clamp(11px, calc(var(--bk-u, 12rem) * .16), 26px);
    background: var(--sm-warning); color: var(--sm-bg);
    clip-path: polygon(0 0, 100% 0, 0 100%);
    font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .055), var(--font-2xs)); font-weight: 800; line-height: 1;
    text-align: left; padding: 1.5px 0 0 2.5px;
}
/* Marcaj W.O. (walkover, ADR 0039) — a avansat fără să joace: neutru, nu accent, e o consemnare, nu
   o victorie. Doar ASPECTUL stă aici; POZIȚIA vine din regula comună cu `.e-chip__out` de la
   `.bk-entry` („bugetul de colțuri"), fiindcă ambele sunt marcaje ale unei persoane, pe rândul ei. */
.bk-wo-mark {
    font-weight: 700; border-radius: var(--radius-sm);
    background: var(--text-muted); color: var(--surface);
}
.bk-half--right .bk-golden-mark {
    left: auto; right: 0;
    clip-path: polygon(100% 0, 0 0, 100% 100%);
    text-align: right; padding: 1.5px 2.5px 0 0;
}

/* CAMPION */
.bk-champion {
    margin-top: .75rem;
    padding: .65rem .75rem;
    background: var(--sm-paper);
    border: 1px solid var(--sm-paper);
    border-radius: var(--radius-lg);
    text-align: center;
    color: var(--sm-on-paper);
    box-shadow: var(--sm-elev-peak);
}
.bk-champion__label {
    font-family: var(--font-display);
    font-size: var(--font-xs); font-weight: 700; text-transform: var(--type-label-case, uppercase); letter-spacing: .1em;
    color: var(--sm-on-paper-mid); margin-bottom: .2rem;
}
.bk-champion__name {
    font-family: var(--font-display);
    font-size: var(--font-xl); font-weight: var(--type-title-weight, 900); color: var(--sm-on-paper); text-transform: var(--type-title-case, uppercase);
}

/* ── Podium locurile 2-3-4 (clasare categorie, ADR 0009) — locul 1 = bara CAMPION FULL-WIDTH deasupra.
   Locurile 2/3/4 = UN SINGUR rând, pe toată lățimea (= lungimea locului 1), segmente DESCRESCĂTOARE
   (45:32:23) care umplu împreună tot rândul — adică chiar forma unui podium, din lățimi.

   ⚠️ COMENTARIUL DE AICI A MINȚIT până pe 2026-09-28: spunea „bare pline cu CULOAREA medaliei", iar
   codul randa de mult cutii albe cu fir, cu medalia rămasă doar ca un CERC colorat lângă nume.
   Ownerul, despre ce ieșea: „niște cercuri seci de culori diferite într-un chenar, foarte pueril și
   urât" — imediat sub bara de campion, care e puternică. Avea dreptate: cercul recodifica în culoare
   exact ce scria cifra dinăuntru, și concura cu numele, care e informația.

   DE ACUM: zero cercuri. Culoarea stă pe MUCHIA din stânga, 3px — exact idiomul folosit deja de
   `.cat-strip__item` pentru hue-ul stilului și de `.style-pill` pentru identitate, deci un semnal pe
   care ochiul îl cunoaște de pe restul paginii. Cifra se retrage la rolul de etichetă (mică, `text-mid`,
   tabular), numele urcă și rămâne cerneală plină. Forma descrescătoare era acolo dintotdeauna; abia
   acum se vede, fiindcă nu mai e acoperită de trei pete de culoare.
   ⚠️ Locul 4 ia `--rank-4`, care pe site e remapat la `--sm-s3` — aproape cât firul. E INTENȚIONAT:
   locul 4 nu are medalie, iar muchia lui aproape stinsă o spune fără niciun cuvânt. */
.podium { display: flex; flex-wrap: wrap; align-items: stretch; gap: 3px; margin-top: .35rem; }
.podium__step {
    display: flex; align-items: baseline; justify-content: center; gap: .45rem; text-align: center;
    padding: .35rem .6rem; border-radius: var(--radius-sm);
    background: var(--sm-s1); color: var(--sm-text-hi);
    /* Un singur mecanism de contur, ca la `.cat-strip__item`: fir pe trei laturi, muchia de start
       ingrosata si colorata. Inlocuieste `box-shadow: inset` — altfel firul interior si muchia
       exterioara ar fi iesit ca doua linii alaturate in coltul din stanga. */
    border: 1px solid var(--sm-edge);
    border-inline-start: 3px solid var(--_pc); }
/* flex-grow proporțional → 2/3/4 împart toată lățimea în raportul 45:32:23, descrescător. min-width
   rămâne AUTO (nu 0) → segmentul NU se strânge sub numele lui (fără rupere pe litere); când nu mai
   încap toate pe un rând, `flex-wrap` le lasă unul sub altul (abia atunci). */
/* ⚠️ Varianta `-ink`, NU culoarea medaliei. Medaliile sunt culori DESCHISE: ca UMPLERE (cercul de
   dinainte) mergeau, dar ca MUCHIE pe un card alb dadeau 1.87 si 2.40 fata de card — sub pragul
   grafic de 3:1, adica abia marcau ceva, in timp ce pe dark ieseau la 9+. Familia `--rank-*-ink` e
   exact „rangul ca SEMN pe o suprafata" (o folosesc deja `.rank-1..3` din clasament si trofeul din
   `.prize-line`) si se intoarce singura pe tema intunecata (tokens.css:697).
   Locul 4 ia `--sm-edge`, adica fix culoarea firului: nu e o medalie stearsa, e ABSENTA ei. */
.podium__step--2 { --_pc: var(--rank-silver-ink); flex: 45 1 0; }
.podium__step--3 { --_pc: var(--rank-bronze-ink); flex: 32 1 0; }
.podium__step--4 { --_pc: var(--sm-edge);         flex: 23 1 0; }
.podium__medal { flex: 0 0 auto; font-weight: 700; font-size: var(--font-xs); line-height: 1; color: var(--sm-text-mid); font-variant-numeric: tabular-nums; }
.podium__nm { white-space: nowrap; font-weight: 700; text-transform: var(--type-title-case, uppercase); font-size: var(--font-base); line-height: 1.15; }

/* ── Cronometru mare pe proiector (numărătoare inversă, ADR 0010) ── */
.battle-timer {
    display: flex; justify-content: center; align-items: center;
    margin: 0 0 .75rem; padding: .35rem 1rem;
    /* Perechea inversă COMPLETĂ. Era `background: var(--ink)` (raw, fix închis) cu
       `color: var(--paper)` — dar --paper e remapat la o SUPRAFAȚĂ, care în dark devine tot
       închisă: 1.15:1, adică cronometrul de pe proiector dispărea exact în tema în care se
       proiectează. --paper NU e „text pe închis" (vezi nota de la token); aia e --text-on-inverse. */
    background: var(--surface-inverse); color: var(--text-on-inverse);
    border: 2px solid var(--surface-inverse); box-shadow: var(--shadow-hard-sm);
}
.battle-timer__val {
    font-family: var(--font-mono); font-weight: 700; line-height: 1;
    font-size: clamp(2.5rem, 12vw, 6rem); letter-spacing: var(--type-number-tracking, .04em); font-variant-numeric: tabular-nums;
}
/* Timp expirat: fundal flash brand (roșu) — semnal vizual că runda s-a terminat. */
.battle-timer--done { background: var(--primary); border-color: var(--primary); color: var(--on-primary); }
/* Placeholder: element identic dar invizibil (spațiu REZERVAT — ecranul nu saltă când cronometrul
   de rundă pornește/se oprește pe ecranul smoke). */
.battle-timer--idle { visibility: hidden; }
/* Varianta MICĂ a cronometrului. Pe ecranul smoke (ADR 0026 am.4, timerele INVERSATE): ceasul de
   SESIUNE poartă --round (mic, în mijlocul perechii), cronometrul de RUNDĂ e cel mare de bază,
   sub pereche. Starea --done se moștenește. */
.battle-timer--round { margin: 0; padding: .2rem .6rem; }
.battle-timer--round .battle-timer__val { font-size: clamp(1.1rem, 3.5vw, 2rem); }
/* Cronometrul de sală a URCAT în clusterul de categorie, între Line-up și Juriu (2026-08-27, cererea
   userului). Înainte era `sticky bottom` sub scorecard și sub bracket — pe un Top-32 ajungea mai jos
   decât bracketul și risca să iasă din imagine. Sus, în antet, nu-l mai poate împinge nimic afară,
   iar antetul se randează pe toate presetările `?vezi=` (ADR 0041).
   Deci: FĂRĂ `position`/`z-index`/centrare — e un element de flex, vecinii îi fac loc din `gap`-ul
   clusterului. Scara coboară de la „cel mai mare bloc din pagină" la „a treia piesă de pe rând".
   ⚠️ `vw`, NU `cqi` — deliberat, ca la vecinii lui (`.res-jury__lbl`, `body.kf .res-jury .j-pill`).
   `.res-cat-cluster` NU e container de interogare: a fost încercat și RETRAS în iter. 2o (e un flex
   item `flex: 0 1 auto`, deci containment-ul îl prăbușea) — motivul e scris lângă selector în
   components.css. Fără container ancestor, `cqi` ar fi căzut pe viewport, adică o scară care nu
   spune nimic. Iar aici `vw` chiar spune ceva: antetul categoriei e un rând de PAGINĂ, pe toată
   lățimea, nu o componentă dintr-un panou. `--scale-cap` rămâne — el ridică tavanul pe proiector. */
.battle-timer--venue { margin: 0; padding: .2rem .7rem; align-self: center; }
.battle-timer--venue .battle-timer__val {
    font-size: clamp(var(--font-2xl), 3.2vw, calc(2.5rem * var(--scale-cap, 1)));
}


/* ── Split: bracket (STÂNGA) + battle curent (DREAPTA), stivuite pe mobil — bracketul DEASUPRA ──
   Iter. 2o: cele patru declarații `order` de aici au fost ȘTERSE, nu inversate. Ele făceau exact
   pe dos față de comentariile din cod (panoul ajungea stânga, bracketul dreapta) — o contradicție
   tăcută care a trăit luni de zile. Fără `order`, ordinea vizuală E ordinea din DOM
   (`.bk-layout__bracket` apoi `.bk-layout__current`, vezi `_bracket_section`), deci comentariul nu
   mai poate minți, iar stivuirea pe mobil pune bracketul deasupra scoreboardului fără nicio regulă
   în plus — exact ce a cerut userul.
   ADR 0041: ordinea se ALEGE tot în Twig (presetul „Scor sus" emite panoul primul în DOM), NICIODATĂ
   prin `order`/`*-reverse` aici — spec-ul Flexbox le declară non-conformante pentru ordine logică
   (§ „Reordering and Accessibility"), iar WCAG 1.3.2/2.4.3 cer ca ordinea de citire să fie DOM-ul.
   CSS-ul primește doar modificatorii de ARANJAMENT (`--solo`, `--panel-only`, `--stacked`). */
/* CONTAINERUL de măsurare al bracketului (ADR 0040) stă AICI, pe rând, nu pe `.bk-scroll`.
   De ce tocmai aici: `.bk-layout` e un bloc în flux normal, deci lățimea LUI vine oricum de la
   părinte, niciodată din conținut — adică se poate contoriza fără să se rupă nimic. Orice element
   mai adânc (`.bk-scroll`, `.bk-mirror`) e, dimpotrivă, exact sursa din care coloana de bracket își
   calculează `flex-basis: auto`; contorizat, ar contribui cu ZERO și ar prăbuși coloana.
   Regula generală, plătită de două ori în iter. 2o: **containerul de interogare trebuie să fie un
   element a cărui lățime NU depinde de conținutul lui.**
   --bk-share = cât din rând îi revine bracketului. E o PROPORȚIE declarată de layout (singurul care
   o știe), nu o lățime ghicită: scala din `.bk-mirror` o folosește ca să nu-și calculeze cutiile ca
   și cum ar avea tot rândul la dispoziție. Sub-plafonată deliberat — dacă iese ceva mai mic decât
   spațiul real, panoul se umflă (comportamentul dorit); dacă ar ieși mai mare, bracketul ar începe
   să se tragă lateral degeaba. */
.bk-layout { display: flex; flex-direction: column; gap: 1rem; align-items: stretch; container-type: inline-size; --bk-share: 1; }
/* --bk-padb = respirația de sub bracket. Trăiește AICI, pe părintele comun, fiindcă o citesc două
   elemente frați: mirror-ul (ca padding) și căsuța „Locul 3" (ca tragere în sus). Legată într-un
   singur loc, căsuța nu poate ajunge niciodată peste cardurile bracketului. */
.bk-layout__bracket { min-width: 0; --bk-padb: 1.5rem; }
/* Locul 3 stă sub bracket (standalone, ca să nu strice centrarea și conectorii finalei — ADR 0009),
   dar tras în sus în spațiul gol de sub finală ca să se citească ca parte din final, nu ca anexă.
   Plafonul e chiar padding-ul de jos al mirror-ului: peste el ar începe să se suprapună. */
.bk-third-slot { display: flex; justify-content: center; margin-top: calc(var(--bk-padb) * -0.8); }
.bk-layout__current { min-width: 0; }
@media (min-width: 992px) {
    /* Pe un rând, bracketul primește ~60% (panoul are bază 33% + creștere). Stivuit (sub prag) are
       tot rândul, deci `--bk-share` rămâne 1 din regula de bază. */
    .bk-layout { flex-direction: row; align-items: flex-start; --bk-share: .6; }
    .bk-layout--solo { --bk-share: 1; }
    /* Împărțirea NU mai e fixă 33/67 — o dictează cât loc cere efectiv bracketul.
       Bracketul primește `flex-basis: auto`, adică lățimea CONȚINUTULUI lui, care depinde direct de
       câte runde are (Top 32 = multe coloane, Top 4 = două). Panoul de jurizare are bază 33%, poate
       CREȘTE, dar NU se micșorează.
         · bracket mare  → bazele depășesc containerul; doar bracketul se strânge (scroll intern),
                           panoul rămâne fix pe 33% — exact ca înainte.
         · bracket mic   → rămâne spațiu liber; ambele cresc, deci panoul se umflă până la plafon
                           și nu mai rămâne gol lângă un bracket de 4.
       Zero JS, zero reguli per-mărime: mărimea bracketului se citește singură din conținut.
       Plafonul de 60%: peste atât, cei doi concurenți ajung prea depărtați pe orizontală, cu mijlocul
       pierdut între ei — devine mai greu de citit, nu mai ușor.
       align-self: center = panoul mai scund stă pe MIJLOCUL înălțimii bracketului, nu lipit sus;
       sticky rămâne → la scroll tot se lipește sub marginea de sus. */
    .bk-layout__current { flex: 1 0 33%; max-width: 60%; min-width: 0; align-self: center; position: sticky; top: .75rem; }
    .bk-layout__bracket { flex: 1 1 auto; min-width: 0; }
    .bk-layout--solo .bk-layout__bracket { flex: 1 1 100%; }
    /* Presetările ecranului de sală (ADR 0041) — blocurile lipsă NU se ascund, nu se randează;
       aici stau doar consecințele de aranjament pentru cele rămase:
         · `--panel-only` (doar scoreboard-ul): fără bracket lângă el, plafonul de 60% n-are cui lăsa
           loc — umple rândul. Literele vin din `cqi` pe `.bk-layout`, deci un rând întreg = litere
           mai mari (exact scopul: TV mic, sală mare), cu plafoanele proprii ale scorecardului.
         · `--stacked` (scor SUS): coloana se păstrează și pe lat — scoreboard-ul pe tot rândul,
           bracketul dedesubt cu tot rândul (`--bk-share: 1`). `sticky`/`align-self: center` n-au sens
           când panoul e primul și lat cât rândul. */
    .bk-layout--panel-only .bk-layout__current { flex: 1 1 100%; max-width: 100%; }
    .bk-layout--stacked { flex-direction: column; align-items: stretch; --bk-share: 1; }
    .bk-layout--stacked .bk-layout__current { flex: 1 1 100%; max-width: 100%; position: static; align-self: stretch; }
    .bk-layout--stacked .bk-layout__bracket { flex: 1 1 100%; }
}
/* Familia `.cmd-bar*` (bara volt a battle-ului curent) a fost ȘTEARSĂ în iter. 2n: toate controalele
   organizatorului au urcat pe linia taburilor (`.tab-actions`), iar starea LIVE de pe ea dubla banda
   scorecardului. Ce a rămas util din ea — contorul de voturi și butonul de cronometru — e mai jos.
   Rundele + cronometrul fazei (ADR 0039, editabile doar la primul start) se cer o SINGURĂ dată, în
   modalul de confirmare — iter. 2m; familia `.bk-start-rounds*` a ieșit atunci, `.cf-*` din
   base-layout.css îi ține locul. */
/* Contorul „X/Y" de pe Finalizează dezactivat (iter. 2h) — câți jurați au votat TOT. */
.bk-votes-cnt { font-family: var(--font-mono); font-size: var(--font-2xs); font-weight: 700; opacity: .85; }
.bk-timer-btn { display: inline-flex; align-items: center; gap: .25rem; }
.bk-timer-btn__s { font-size: var(--font-2xs); font-weight: 700; opacity: .85; }
/* Previzualizarea deciziei finalei pe ecranul organizatorului (B30) — `<details>` nativ, zero JS.
   Acoperită implicit: verdictul e la un click, ca o privire peste umăr să nu-l ia. Aceeași mecanică
   de summary ca .panel-acc (marker propriu, nu cel al browserului), dar componentă separată — una e
   un acordeon de listă, cealaltă o dezvăluire unică. */
.fp { border: 1px solid var(--winner-edge); border-radius: var(--radius-sm); background: var(--winner-bg); margin-bottom: .5rem; overflow: hidden; }
.fp--tie { border-color: var(--warning); background: var(--warning-soft); }
.fp > summary {
    display: flex; align-items: center; gap: .3rem;
    padding: .35rem .55rem; cursor: pointer; user-select: none;
    font-size: var(--font-xs); font-weight: 700; color: var(--fg2);
    list-style: none;
}
.fp > summary::-webkit-details-marker { display: none; }
.fp > summary::after { content: "\F282"; font-family: "bootstrap-icons"; margin-left: auto; font-size: .8em; transition: transform .15s ease; color: var(--fg4); }
.fp[open] > summary::after { transform: rotate(180deg); }
.fp > summary:hover { filter: brightness(.97); }
.fp__body { display: flex; align-items: center; gap: .5rem; padding: .1rem .55rem .5rem; }
.fp__icon { font-size: var(--font-lg); flex-shrink: 0; color: var(--winner-ink); }
.fp--tie .fp__icon { color: var(--warning); }
.fp__body strong { font-size: var(--font-sm); color: var(--winner-fg); }
.fp--tie .fp__body strong { color: var(--warning); }
.fp__sub { font-size: var(--font-2xs); color: var(--fg3); }

/* Scorecard focus în coloana din DREAPTA (iter. 2o — laturile au fost schimbate): umple lățimea,
   scară redusă vs panoul mare;
   fără umbră dură — panoul stă lipit de bracket, umbra adăuga zgomot */
.bk-layout__current .sc--focus { width: 100%; max-width: 100%; margin-bottom: 0; box-shadow: var(--sm-elev-float); }
/* Plafoanele separate pe lățimea coloanei au dispărut 2026-08-15: existau fiindcă `cqi` măsura
   RÂNDUL, deci într-o coloană strâmtă numele ieșeau prea mari și trebuiau plafonate de mână. De când
   containerul e CELULA (vezi `.sc__nm`), îngustimea se reglează singură. Mărimea se diferențiază
   acum pe SUPRAFAȚĂ (antet de așteptare vs. cap de scorecard final), nu pe coloană. */
.bk-layout__current .sc--focus .sc-jt__skv { font-size: var(--font-sm); }
.bk-layout__current .sc--focus .sc-jt__arrow,
.bk-layout__current .sc--focus .sc-jt__net,
.bk-layout__current .sc--focus .sc-round__pts { font-size: var(--font-md); }
/* Plafonul separat pe coloana asta a dispărut 2026-08-21, din același motiv ca vecinii de mai sus:
   `.sc-jt__row` își măsoară acum mijlocul pe CONTAINER (`clamp(..., 16cqi, ...)`), deci lățimea
   reală a coloanei o dictează singură — cele trei cifre fixe erau aproximări ale ei. */

/* ── Bracket OGLINDIT (mirrored: stânga → FINALĂ ← dreapta) ──
   FLUID: mirror = 100% din container, coloanele elastice (min 96 / max 190px) → Top 32 încape
   fără scroll pe ecrane late; sub ~1250px coloanele ating minimul și .bk-scroll preia (fallback). */
/* Derularea laterală rămâne, dar ca PLASĂ de siguranță (Top-64 sub ~340px), nu ca mecanism
   principal — scala din `.bk-mirror` face bracketul să încapă singur.
   ⚠️ AICI NU are voie să stea `container-type` (încercat și retras în iter. 2o). `.bk-scroll` e
   conținutul din care `.bk-layout__bracket` își calculează `flex-basis: auto` — adică exact
   mecanismul care lasă panoul să se umfle lângă un bracket mic. Cu `contain: inline-size`, aportul
   lui la lățimea intrinsecă a părintelui devine ZERO, deci coloana de bracket se prăbușea (iar în
   modul proiector, unde bracketul e `flex: 0 1 auto`, dispărea de tot). Containerul stă pe
   `.bk-layout` — vezi comentariul de acolo. */
.bk-scroll { overflow-x: auto; padding-bottom: .5rem; }
.bk-mirror {
    /* ── O SINGURĂ SCALĂ pentru tot bracketul (iter. 2o) ──
       --bk-u = lățimea care îi revine unei coloane dacă bracketul ar încăpea exact în panou.
       TOATE mărimile de mai jos (cutii, brațe, suprapunere, fonturi din regulile copiilor) se
       derivă din ea, fiecare cu clamp-ul ei. De-aia FORMA se păstrează la orice mărime: brațele și
       suprapunerea scad odată cu cardurile, nu rămân în urmă.
       Maximele sunt exact valorile de dinainte → pe ecran lat nu se schimbă nimic — pe PAGINA
       PUBLICĂ. Pe SALĂ (B114, ADR 0041 am.1) tavanul se RIDICĂ: fiecare maxim e înmulțit cu
       `--scale-cap` (1 implicit, 2 sub `body.live-projector` — „fără tavan" = 100 a fost
       dezastruos, vezi secțiunea „Scara de SALĂ"), deci acolo un Top 8 umple share-ul. Un singur
       token, remapat într-un singur loc.
       Podeaua e joasă deliberat (decizia userului: „facem literele mici să se potrivească") — un
       Top-32 intră întreg pe 360px. Sub ~8px numele se citesc ca forme, nu ca text; ăsta e
       compromisul asumat, cu `.bk-scroll` în spate pentru cazurile extreme.
       --bk-overlap = cât trage coloana 3+ PESTE feederul ei (mai mare = mai compact);
       --bk-firstgap = spațiul normal T32→T16 (primul rând rămâne fără overlap);
       --bk-arm = cotul scurt în card. */
    --bk-u: calc(100cqi * var(--bk-share, 1) / var(--bk-cols, 9));
    --bk-colw:      clamp(2.4rem, var(--bk-u), calc(11.875rem * var(--scale-cap, 1)));
    --bk-overlap:   clamp(10px, calc(var(--bk-u) * .19), calc(36px * var(--scale-cap, 1)));
    --bk-firstgap:  clamp(5px, calc(var(--bk-u) * .095), calc(18px * var(--scale-cap, 1)));   /* T32→T16 total = brațul bracketului + linia de legătură spre copil */
    --bk-firstarm:  clamp(3px, calc(var(--bk-u) * .047), calc(9px * var(--scale-cap, 1)));    /* brațul bracketului (din cardul T32 până la bara verticală/merge point) */
    --bk-childlink: clamp(3px, calc(var(--bk-u) * .047), calc(9px * var(--scale-cap, 1)));    /* linia care leagă merge point-ul de copil (cardul T16) — ca să nu fie lipit */
    --bk-arm:       clamp(3px, calc(var(--bk-u) * .042), calc(8px * var(--scale-cap, 1)));
    --bk-gap:       clamp(4px, calc(var(--bk-u) * .074), calc(14px * var(--scale-cap, 1)));
    display: flex;
    align-items: stretch;
    gap: 0;
    min-height: 200px;
    padding: .5rem .25rem var(--bk-padb, 1.5rem);
    width: 100%;
    min-width: 0;
}
/* aripile împart spațiul egal; când coloanele ating max-width, spațiul liber merge spre
   marginile exterioare (justify flex-end + flip pe dreapta) → bracketul se strânge spre finală.
   min-width: MIN-CONTENT (nu 0!): aripa refuză să se strângă sub suma minimelor coloanelor →
   overflow-ul cade la DREAPTA mirror-ului (scrollabil), nu în stânga aripii (de neatins în LTR). */
.bk-half { display: flex; align-items: stretch; gap: 0; flex: 1 1 0; min-width: min-content; justify-content: flex-end; }
.bk-half--center { align-items: center; padding: 0 var(--bk-gap); flex: 0 0 auto; }
/* coloanele 3+ se suprapun pe orizontală → matchul avansat tras sub feederi (diagonal compact).
   Ordinea DOM (coloana mai centrală = mai târzie) o pune pe ea deasupra → conectorul „merge" se vede. */
.bk-col + .bk-col { margin-left: calc(var(--bk-overlap) * -1); }
/* a 2-a coloană (T16) NU se suprapune peste primul rând (T32) → spațiu normal pt conectorii outgoing */
.bk-col--first + .bk-col { margin-left: var(--bk-firstgap); }

/* Jumătatea dreaptă = oglindită prin CSS: scaleX flip pe coloane + conectori,
   iar conținutul (carduri + etichete) e re-flipuit ca textul să rămână normal. */
.bk-half--right { transform: scaleX(-1); }
.bk-half--right .bk-battle,
.bk-half--right .bk-col-label { transform: scaleX(-1); }

/* Finala primește din AMBELE laturi → brațe scurte stânga + dreapta */
.bk-col--final .bk-battle::before,
.bk-col--final .bk-battle::after {
    content: '';
    position: absolute;
    top: calc(50% - 1px);
    width: var(--bk-gap);
    border-top: 2px solid var(--border-subtle);
}
.bk-col--final .bk-battle::before { left: calc(var(--bk-gap) * -1); }
.bk-col--final .bk-battle::after  { right: calc(var(--bk-gap) * -1); }
/* …iar bratele FINALEI n-aveau deloc regula de „rezolvat". Acelasi fix, aceeasi pozitie: dupa cele
   care dau geometria. Coborat din `@layer skin` la B159 L10 (F2). */
.bk-col--final .bk-match--resolved .bk-battle::before,
.bk-col--final .bk-match--resolved .bk-battle::after { border-color: var(--success); }
/* conectorii unui placeholder = estompați (nu negru plin). Stau SUB brațele finalei de mai sus:
   `border-color` de aici și `border-top` de acolo împart `border-top-color` la aceeași specificitate,
   deci decide ordinea din fișier (prins de gate-ul css-structure, B148). */
.bk-match--ph .bk-merge,
.bk-col--second .bk-match--ph::before,
.bk-col--final .bk-battle--ph::before,
.bk-col--final .bk-battle--ph::after { border-color: var(--border-hair); }

/* ── SCORECARD (battle reveal: runde × jurați × participant) ── */
.sc {
    border: 1px solid var(--sm-line);
    border-radius: var(--radius-lg);
    /* Pe light cardul alb pe fundalul crem iesea la 1.11:1 („se contopeste cu fundalul general"):
       contur `--sm-line` (3.85 / 3.90) + umbra de plutire. Coborat din `@layer skin` la B159 L10 (F2). */
    background: var(--sm-card-surface);
    box-shadow: var(--sm-elev-float);
    margin-bottom: .75rem;
    max-width: 680px;
    overflow: hidden;
}
/* `.sc--live` nu mai are marcaj propriu pe panou — rosul sta doar pe cardul din bracket (cererea
   ownerului). Regula a ramas fara nicio declaratie proprie si a disparut la B159 L10 (F2). */
/* Battle-ul terminat NU mai primește chenar verde pe toată cutia: verdele aprins în jurul întregului
   scoreboard concura cu însuși câștigătorul, care e deja marcat verde + trofeu ÎNĂUNTRU. Un semnal
   repetat pe toată rama nu adaugă informație, doar zgomot. `.sc--live` rămâne (acolo chenarul chiar
   distinge un battle ÎN CURS de restul listei). Clasa `.sc--done` se emite în continuare din Twig,
   intenționat: e marcaj de stare, util dacă mai târziu vrem alt semnal — doar chenarul a picat. */

/* Panou FOCUS — battle curent/rezultat */
.sc--focus { max-width: 960px; width: 100%; margin-bottom: 1rem; box-shadow: var(--sm-elev-float); }
.sc--focus .sc__bar { font-size: var(--font-sm); padding: .4rem .85rem; }
/* Plafon la vârful scării (feedback 2026-08-12 ×2: numele erau tot mici) — cqi-ul conduce, cu
   coeficientul de lungime; pe mobil coboară spre floor; line-clamp 2 = plasa finală. */
/* Netul e CONCLUZIA celulei — scalează în ACELEAȘI selectoare ca săgeata și suma din subsol, nu în
   reguli paralele care pot diverge la următoarea calibrare. Sub-notele (registrul) stau o treaptă
   mai jos, ca la mărimea de bază (sm → md). */
.sc--focus .sc-jt__skv { font-size: var(--font-md); }
.sc--focus .sc-jt__arrow,
.sc--focus .sc-jt__net,
.sc--focus .sc-round__pts { font-size: var(--font-lg); }
.sc--focus .sc-jt__cell { min-height: 1.8rem; }
.sc--focus .sc-round__hd { font-size: var(--font-sm); }

/* Banda spune trei lucruri, în ordinea în care le cauți: CE battle (faza) · CE se numără (unitatea) ·
   CUM stă (starea). `flex-wrap` + `gap`: la 360px unitatea pică pe rândul doi UNA CÂTE UNA, nu se
   prăbușesc toate — banda e un rând de informație, nu un tabel. */
.sc__bar {
    display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center;
    gap: .1rem clamp(.4rem, 2vw, 1rem);
    padding: .3rem .6rem;
    background: var(--surface-inverse); color: var(--text-on-inverse);
    font-family: var(--font-display);
    font-size: var(--font-xs); font-weight: 600; text-transform: var(--type-label-case, uppercase); letter-spacing: var(--type-label-tracking, .08em);
}
/* Unitatea de numărare (mutată aici din legendele de sub fiecare cifră, 2026-08-27): e CONTEXT, nu
   verdict — deci estompată față de fază și de stare, care sunt cele două lucruri „tari" ale benzii. */
.sc__unit { font-weight: 400; opacity: .72; }
.sc__state { display: inline-flex; align-items: center; gap: .3rem; font-weight: 700; }
/* Punctul „in desfasurare" pulseaza de TREI ori, nu la infinit: o animatie care se reia la fiecare
   poll e zgomot. Coborat din `@layer skin` la B159 L10 (F2). */
.sc__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--sm-live-mark);
           animation: sc-pulse 1.1s ease-in-out 3; }
@keyframes sc-pulse { 0%,100% { opacity: 1; } 50% { opacity: .25; } }

/* MĂRIMEA numelui = cqi (lățimea containerului) × --nm-k (bucket-ul de LUNGIME al numelui, servit de
   presenter prin .sc-nm--m/--l): cqi nu știe cât de lung e textul — fără coeficient, numele scurte
   rămâneau mici degeaba, iar cele lungi se rupeau în cuvânt (break-word e plasa FINALĂ, nu regula).
   Pe proiector, zoom-ul din .live-projector amplifică totul încă o dată.
   ⚠️ Antetul „VS" propriu (`.sc__vs` / `.sc__side` / `.sc__score*`) a fost ȘTERS pe 2026-09-01:
   capul e acum ACELAȘI partial în ambele stări (`.sc-hd`), deci nu mai există două surse de nume
   care să arate diferit — și nimic nu mai sare la reveal. */
.sc-nm--m { --nm-k: .8; }
.sc-nm--l { --nm-k: .62; }
/* Nume lungi / 2v2 → maxim 3 rânduri apoi taie. `break-word`, NU `anywhere`: `anywhere` rupea ÎN
   INTERIORUL cuvântului chiar când nu era nevoie — „SATANEL" apărea ca „SATAN / EL". Cu `break-word`
   numele rămâne întreg cât timp încape (corpul literei scade fluid înainte) și se rupe doar dacă un
   singur cuvânt chiar nu are loc. */
.sc__nm {
    min-width: 0;
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
    overflow: hidden; overflow-wrap: break-word;
}
/* MĂRIMEA NUMELUI — recalibrată 2026-09-01. Trei lucruri, în ordinea importanței:

   1. PLAFONUL NU se mai înmulțește cu `--nm-k`. Înainte se înmulțea și mijlocul, și plafonul, deci
      punctul în care scara ÎNGHEȚA era acelasi (W=480px) indiferent de lungimea numelui — adică
      exact bugul: între 560px și 1400px lățime de ecran nu se mai schimba nimic. Acum numele lungi
      (k=.62) continuă să crească până la W≈815px, cele scurte până la W≈505px.
   2. Coeficientul urcă de la 7.5 la 6.5cqi *măsurat pe tot capul*, dar numele câștigă spațiu real:
      cifra a IEȘIT din jumătate în coloana din mijloc, deci celula nu mai împarte lățimea cu ea.
   3. `--nm-k` (bucketul de LUNGIME servit de presenter prin `.sc-nm--m/--l`) rămâne pe mijloc:
      `cqi` nu știe cât de lung e textul. Numele lung primește .62, cel scurt 1 → cutii de mărimi
      comparabile, nu litere de mărimi egale. */
.sc-hd__nm .sc__nm {
    font-size: clamp(var(--font-lg), calc(5.8cqi * var(--nm-k, 1)), calc(var(--font-9xl) * var(--scale-cap, 1)));
    /* RÂNDURILE STRÂNSE (2026-09-01, iter. 2). Numele n-avea `line-height` deloc, deci moștenea ~1.5
       din corp: un nume pe două rânduri lăsa între ele un gol cât o linie întreagă și umfla cutia cu
       ~18px. Proiectul folosește deja `line-height: 1` pe nume de afișaj (`.podium__nm`,
       `.sc-totals__v`, bracket) — aici e strâns cu o treaptă sub, ca în macheta aprobată (.98).
       `letter-spacing` negativ: la weight 900 literele stau mai bine apropiate. */
    /* B159 L10 (F2): 1.15 + tracking 0. Valorile vechi (1.02, -.015em) erau pentru greutatea 900 si
       taiau diacriticele sub `overflow: hidden` + line-clamp. Coeficientul 6.5cqi -> 5.8cqi de mai sus
       are acelasi motiv: bucketul de marime numara lungimea TOTALA, iar „KILOMETRU / L ZERO" se rupea. */
    line-height: 1.15; letter-spacing: var(--type-name-tracking, 0);
}
.sc__tr { color: var(--rank-gold-ink); flex-shrink: 0; font-size: clamp(var(--font-sm), 3.6cqi, calc(var(--font-3xl) * var(--scale-cap, 1))); }

/* Scor mare acumulat în antet = runde câștigate (2–0) */

/* ═══ RUNDA din detaliu (B135, 2026-09-02): bandă · rânduri de jurați · subsol ═══
   O rundă se citește ca un BON: capul spune ce rundă e și cine a luat-o (verdictul, centrat pe
   spinare); rândurile arată notele fiecărui jurat; subsolul adună neturile SUB coloana pe care o
   adună — privirea merge în jos spre total (foile de scor ISU/FIG pun suma la capătul coloanei).
   Istoric: capul ținea și punctele („trei scoruri ierarhizate", iter. 5) într-un rând flex cu
   `space-between` — eticheta „RUNDA 1" din stânga împingea totul, deci votul nu cădea pe mijloc și
   punctele nu stăteau sub concurenți. Acum bandă, rânduri și subsol stau pe ACEEAȘI grilă.
   ⛔ ȘTERSE 2026-09-01: culorile rotative `.sc-round--c0/c1/c2` (ciclau pe INDEXUL rundei, nu pe
   criteriu; fixate pe light; culoare fără sens pe un ecran unde culoarea = verdict). */
.sc-round {
    border-left: 4px solid var(--sm-edge);
    border-radius: var(--radius-sm); margin: 0 .45rem .4rem; overflow: hidden;
    /* CONTAINERUL DE MĂSURARE E RUNDA, nu `.sc-jt` (B135). Banda și subsolul sunt FRAȚII corpului, nu
       copiii lui: cu containerul pe `.sc-jt`, un `cqi` scris în bandă se rezolva pe următorul strămoș
       cu `container-type`, adică pe rândul de bracket (exact ce făcea, greșit, `.live-projector
       .sc--focus .sc-round__hd`). `.sc-jt` umple conținutul rundei, deci coeficienții vechi rămân.
       `.sc-round` nu e subgrid și nu găzduiește `position: fixed` — containment fără efecte secundare. */
    container-type: inline-size;
    /* SSOT DE COLOANE PE RUNDĂ: rândurile și subsolul consumă aceeași definiție, deci eticheta
       subsolului cade pe spinarea rândurilor PRIN CONSTRUCȚIE, nu din calibrare. (Banda are grila ei,
       tot simetrică — vezi acolo de ce.) `cqi` dintr-o proprietate custom se rezolvă pe elementul
       CONSUMATOR (un descendent), deci pe runda asta — nu pe cel care declară containerul. Mijlocul
       era `7.5rem` fix, cu două rescrieri care aproximau aceeași lățime (`.sc--focus` 10rem,
       `.bk-layout__current` 6.5rem); un clamp pe container le înlocuiește. Pe îngust caseta juratului
       cedează prima. */
    --sc-jt-cols: 1fr clamp(4.2rem, 16cqi, calc(7.5rem * var(--scale-cap, 1))) 1fr;
    /* ⛔ PISTE FIXE ÎN CELULĂ — NU (rev. 5, măsurat pe ecranul mare). În rev. 3-4 nume · valoare ·
       ajustare · net aveau piste fixe din container; pe `?proiector=1` (`--scale-cap: 2`) se dublau —
       137 + 83 + 128 + 109 = 457px + gap-uri într-o celulă de 412px — iar `overflow: hidden` TĂIA
       ultima pistă: nota finală dispărea pur și simplu de pe latura 1. Pragurile de stivuire sunt în
       `rem`, deci nu știu de `--scale-cap`. O pistă fixă e legitimă DOAR pentru ce nu scalează cu
       fontul. Singura rezervare care rămâne e lane-ul de ajustări (mai jos), și acela `minmax(rezervă,
       auto)`: crește dacă un chip e mai lat, nu taie. */
    --sc-jt-adj-w: 0px;
    /* GEOMETRIILE TREPTELOR, declarate O dată aici și doar ACTIVATE în cele două interogări de mai
       jos (altfel aceleași declarații ar sta de două ori). Trei trepte, cad UNA CÂTE UNA (rev. 6,
       owner: „penalizările să cadă primele sub criterii, abia apoi nota finală"):
         lat    — `sk | chip | arrow | net` pe un rând (fallback-ul din `.sc-jt__cell`);
         mediu  — chipul coboară SUB registru, în COLOANA registrului (aliniat cu valorile, nu la
                  spinare sub net — rev. 7, owner: „pică sub nota finală și criterii, la margine");
                  finalul rămâne la dreapta; fără chip rândul doi e gol (0 înălțime), deci rândurile
                  fără penalizare nu se schimbă;
         îngust — cade și finalul, pe rândul trei, la spinare („operație una sub alta"). */
    --sc-jt-mid-cols-1: minmax(0, 1fr) auto auto;
    --sc-jt-mid-cols-2: auto auto minmax(0, 1fr);
    --sc-jt-mid-areas-1: "sk arrow net" "chip . .";
    --sc-jt-mid-areas-2: "net arrow sk" ". . chip";
    --sc-jt-stack-cols-1: minmax(0, 1fr) auto auto;
    --sc-jt-stack-cols-2: auto auto minmax(0, 1fr);
    --sc-jt-stack-areas-1: "sk sk sk" "chip chip chip" ". arrow net";
    --sc-jt-stack-areas-2: "sk sk sk" "chip chip chip" "net arrow .";
}
/* LANE-UL DE AJUSTĂRI se rezervă la nivel de SCORECARD, nu de rundă (rev. 6). Cu rezerva per rundă,
   o rundă fără nicio penalizare avea pista 0 și registrul cu ~90px mai lat — valorile sub-notelor,
   aliniate spre mijloc, „stăteau mai la stânga sau mai la dreapta" decât în runda de deasupra
   (owner). Ochiul compară rânduri din același card, deci rezerva e aceeași pe toate rundele când
   battle-ul are orice ajustare (`.sc-detail--adj`, din Twig, pe listele `entryNAdjustments`).
   6rem > cel mai lat chip uzual („SCLIPIRE +2,5%" ≈ 91px): sub rezervă nu mai sare nici 1px; un chip
   mai lat lărgește pista (`minmax(rezervă, auto)`), nu se rupe. FĂRĂ `--scale-cap` — fontul chipului
   nu scalează pe proiector, deci nici pista lui. */
.sc-detail--adj .sc-round { --sc-jt-adj-w: 6rem; }
.sc-round:first-of-type { margin-top: .4rem; }
/* runda extra (golden) — scoasă în evidență cu auriu */
/* Runda extra: muchie + tenta `warning` din paleta, fara inelul de umbra (B159 L10, F2). */
.sc-round--golden { border: 2px solid var(--sm-warning); border-left-width: 5px; background: var(--sm-warning-soft); }
/* ⚠️ Fundalul golden e PINNED pe light (`--golden-soft`, definit doar în `:root` base — neremapat în
   dark și nici în kf), deci orice cerneală theme-aware peste el se prăbușește: `--fg1` pe dark dă
   1.03:1, iar verdictul rundei extra devine INVIZIBIL. Regula (UI_RULES pct. 6): un fundal pinned
   cere cerneală pinned — `--on-golden`, perechea din `contrast-audit.php`. Copiii benzii moștenesc
   (`color: inherit`), deci sub golden rămân pe cerneala pinned. Banda obișnuită e pe
   `--surface-inverse` / `--text-on-inverse` (mai jos), iar golden o suprascrie AICI, cu perechea lui. */
.sc-round--golden .sc-round__hd { background: var(--golden-soft); color: var(--on-golden); }

/* ── BANDA rundei: eticheta la margine, VERDICTUL centrat pe spinare, pe UN SINGUR rând ──
   Aceeași suprafață ca `.sc__bar` și ca toggle-ul deschis (`--surface-inverse`): banda e capul
   grupului, pe muchia de sus (pattern `fieldset`/`legend`, UI_RULES „Gruparea vizuală"), și iese în
   evidență ca să se vadă de unde începe fiecare rundă (cerere owner 2026-09-02). Copiii moștenesc
   cerneala, ca sub golden să urmeze fundalul pinned fără reguli paralele.
   GRILA `1fr auto 1fr`, NU `--sc-jt-cols` (rev. 2, owner: „să nu mai pice runda pe două rânduri; văd
   că încape; maxim scurtăm runda 1 sau se taie din ea"): verdictul ia exact lățimea lui (`auto`),
   iar cele două `1fr` egale îl țin centrat pe spinare oricât ar crește; eticheta din col. 1 se
   STRÂNGE în loc să se suprapună și se taie cu „…". Cu mijlocul fix al rândurilor, verdictul depășea
   coloana și pe îngust intra peste etichetă — de aici venea căderea pe rândul doi, scoasă acum. */
.sc-round__hd {
    display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center;
    column-gap: .5rem;
    padding: .25rem .6rem;
    background: var(--surface-inverse); color: var(--text-on-inverse);
    font-size: var(--font-xs); font-weight: 600; text-transform: none; letter-spacing: 0;
}
/* Eticheta rundei — display 900, o treaptă peste restul benzii (`em`, ca `.sc--focus` și proiectorul
   s-o crească odată cu banda, dintr-o singură regulă). `min-width: 0` + ellipsis: pe îngust cedează
   EA, nu verdictul („RUNDA EXTRA", nu „RUNDĂ DE DEPARTAJARE" — un nume scurt n-are ce tăia). */
.sc-round__no {
    grid-column: 1; justify-self: start; min-width: 0; max-width: 100%;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-family: var(--font-display); font-weight: 700; font-size: 1.15em; color: inherit;
}
/* Verdictul stă în coloana `auto` din mijloc — centrul benzii = spinarea rândurilor (ambele simetrice). */
.sc-round__res { grid-column: 2; display: inline-flex; align-items: baseline; gap: .6rem; white-space: nowrap; }
/* „egal" nu poate ieși în evidență prin greutate — părintele `.sc-round__verdict` e deja 700.
   Se distinge prin SCRIERE, singurul canal liber în cutia aia. */
.sc-round__w--tie { text-transform: var(--type-status-case, uppercase); letter-spacing: var(--type-status-tracking, .06em); }
/* VOTUL JURAȚILOR și CUMULUL PE RUNDE — LA FEL DE MARI (owner, 2026-09-02 rev. 2; înainte cumulul era
   .85em estompat). Ambele sunt axe care DECID (votul ia runda, rundele iau battle-ul), iar etichetele
   „jurați" / „runde" le țin despărțite. Punctele — singura cifră care POATE contrazice verdictul
   (corolar 5b) — nu mai stau aici deloc: sunt în subsol, unde adună coloana neturilor. */
.sc-round__verdict, .sc-round__cum {
    display: inline-flex; align-items: baseline; gap: .25em;
    font-family: var(--font-mono); font-weight: 700; font-variant-numeric: tabular-nums;
    font-size: 1.2em; color: inherit;
}
/* Egalul primește ȘI fundalul, nu doar cerneala `on-`: o cerneală `on-X` folosită în afara lui X
   e interzisă de UI_RULES (corolar 6b). Perechea completă pe ACELAȘI selector — `contrast-audit.php`
   o prinde singur, pe orice bandă (inversă sau golden) ar sta. */
/* La egal, „egal" nu se estompeaza: e un verdict, nu o nota de subsol (B159 L10, F2). */
.sc-round__verdict.is-tie small { opacity: 1; }
.sc-round__verdict.is-tie {
    background: var(--warning-soft); color: var(--on-warning-soft);
    padding: 0 .3em; border-radius: var(--radius-sm);
}
/* Etichetele „jurați" / „runde" rămân MEREU vizibile: fără ele, „1–2" și „0–1" alături se citesc ca
   o singură cifră pe proiector. Nu se scot „ca să fie mai curat" — ele separă cele două axe. */
.sc-round__verdict small, .sc-round__cum small {
    font-size: .62em; font-weight: 400; letter-spacing: var(--type-label-tracking, .08em);
    text-transform: var(--type-label-case, uppercase); opacity: .7; margin-right: .15em;
}
.sc-round__tally { font-family: var(--font-mono); color: inherit; opacity: .8; flex-shrink: 0; }

/* ── SUBSOLUL rundei: suma punctelor NETE, sub coloana neturilor pe care o adună ──
   Aceeași grilă ca rândurile; valoarea laturii 1 se aliniază la DREAPTA în coloana 1, cu același
   padding interior ca celula (.6rem), deci muchia ei = muchia netului de deasupra; latura 2 în
   oglindă. Eticheta „puncte" stă pe mijloc, ca „total puncte" din `.sc-totals`. FĂRĂ sufixul „p" de
   pe vechile puncte din bandă: eticheta din mijloc îl spune, iar un „p" lipit ar decala zecimala față
   de neturile din coloană (mono, `tabular-nums`). Suprafață `--paper-2` + hairline sus — rețeta
   benzilor secundare (`.sc-totals`, `.sc-av`). */
.sc-round__ft {
    display: grid; grid-template-columns: var(--sc-jt-cols); align-items: baseline;
    padding: .18rem 0 .22rem; background: var(--sm-strip-surface); border-top: 1px solid var(--border-hair);
}
.sc-round__pts {
    font-family: var(--font-mono); font-weight: 700; font-variant-numeric: tabular-nums;
    font-size: var(--font-md); color: var(--fg1); white-space: nowrap; line-height: 1;
}
.sc-round__ft .sc-round__pts:first-child { grid-column: 1; justify-self: end; padding-right: .6rem; }
.sc-round__ft .sc-round__pts:last-child  { grid-column: 3; justify-self: start; padding-left: .6rem; }
.sc-round__lbl {
    grid-column: 2; justify-self: center;
    font-size: var(--font-2xs); font-weight: var(--type-label-weight, 900); color: var(--fg3);
    text-transform: var(--type-label-case, uppercase); letter-spacing: var(--type-label-tracking, .06em);
}

/* Tabel jurați — stânga = e1 | jurat | dreapta = e2. Fundal alb, neutru: din 2026-09-01 celula nu
   mai are umplere de proporție, deci nimic nu concurează cu cifrele. Containerul de măsurare e
   RUNDA (`.sc-round`, mai sus) — nu mai e aici, ca banda și subsolul să măsoare același lucru. */
.sc-jt { display: flex; flex-direction: column; background: var(--card); }
/* Coloanele vin din `--sc-jt-cols` (SSOT pe `.sc-round`): mijloc cu lățime EXPLICITĂ (nu `auto`) →
   celulele laterale e1/e2 rămân egale pe TOATE rândurile și rundele, indiferent de cât de lung e
   numele juratului/criteriului, iar cifrele nete cad pe aceeași coloană de la un jurat la altul.
   Numele/criteriile lungi se rup în mijlocul fix (overflow-wrap). */
.sc-jt__row {
    display: grid; grid-template-columns: var(--sc-jt-cols);
    align-items: stretch; border-top: 1px solid var(--border-hair);
}
.sc-jt__row:first-child { border-top: none; }
/* `break-word`, nu `anywhere`: numele lungi se rup pe CUVINTE (cerut explicit) — `anywhere` le
   pulveriza literă cu literă. Podeaua lățimii o dă `clamp()`-ul din `--sc-jt-cols`, nu ruperea. */
.sc-jt__judge {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    padding: .12rem .4rem; text-align: center; line-height: 1.05;
    border-left: 1px solid var(--border-hair); border-right: 1px solid var(--border-hair);
    min-width: 0; overflow: hidden; overflow-wrap: break-word;
}
.sc-jt__jn { font-size: var(--font-xs); font-weight: 600; }
.sc-jt__jr { font-size: var(--font-2xs); color: var(--fg3); text-transform: var(--type-label-case, uppercase); }
/* ── CELULA (B135 rev. 5-6, forma finală după șase runde de feedback) ──
              Fizic 7/10
           Artistic 6/10   SLIP −2,5%   → 16.2
      Interpretativ 8/10
   Patru piste, dintre care UNA SINGURĂ cedează: registrul (`minmax(0, 1fr)`) — și cedează prin
   RUPERE PE CUVINTE, niciodată prin tăiere (rev. 6, owner: „numele criteriilor trebuie citite mereu").
   Ajustarea (`minmax(rezervă, auto)`, pe un singur rând), săgeata (`auto`, cât glifa) și netul
   (`auto`, lipit de spinare) sunt cât conținutul lor, deci NU pot fi tăiate — cauza pentru care nota
   finală lipsea pe ecranul mare (piste fixe × `--scale-cap` > celulă) nu mai există.
   `align-items: center`: chip, săgeată și net stau pe mijlocul înălțimii registrului, iar celula NU
   crește. Săgeata are pista ei mică și cade lipită de net prin `gap`. Ordinea din DOM = ordinea
   asta; oglinda pe latura 2 vine tot din DOM, nu din `order` (WCAG 1.3.2 / 2.4.3, ADR 0041).
   Subtotalul „19/30" a fost SCOS în rev. 2 (repeta nota finală).
   ⛔ Caretul „favorizat" și muchia `inset 3px` au DISPĂRUT (rev. 3): marcajul e TENTA celulei.
   `position: relative; overflow: hidden` rămân ca plasă — cu piste `auto` nu mai au ce tăia. */
.sc-jt__cell {
    position: relative; overflow: hidden;
    display: grid;
    grid-template-columns: var(--sc-jt-cell-cols, minmax(0, 1fr) minmax(var(--sc-jt-adj-w), auto) auto auto);
    grid-template-areas: var(--sc-jt-cell-areas, "sk chip arrow net");
    align-items: center; justify-items: end;
    column-gap: .25rem; row-gap: .1rem;
    padding: .14rem .6rem; min-height: 1.55rem; min-width: 0;
}
/* Oglinda pentru latura din dreapta: „net ←" la spinare, ajustarea, apoi registrul cu valoarea
   ÎNAINTEA numelui (valorile spre mijloc, numele spre margine). */
.sc-jt__cell--entry2 {
    grid-template-columns: var(--sc-jt-cell-cols, auto auto minmax(var(--sc-jt-adj-w), auto) minmax(0, 1fr));
    grid-template-areas: var(--sc-jt-cell-areas, "net arrow chip sk");
    justify-items: start;
}
/* ── „FAVORIZAT" = TENTA celulei (rev. 3, owner: „scoatem săgeata de tot și dăm o ușoară tentă verde
   căsuței, toată") ──
   Familia WINNER (`--winner-edge`, nu `--success` — al patrulea vocabular de „câștigător" e exact ce
   semnalează B133), derivată LOCAL prin `color-mix`, fără token nou. 22 % peste card = ~1.37:1 pe
   light / ~1.67:1 pe dark — intensitatea suprafeței laturilor nedecise (`--c-kf-side`: 1.40 / 1.61),
   deci același registru de „tentă discretă" ca restul fișierului.
   ⚠️ SUB 3:1 (WCAG 1.4.11), ASUMAT de owner. E acceptabil fiindcă tenta e REDUNDANTĂ: la același
   maxim „favorizat" = netul mai mare, iar netul e scris în celulă; pastilele din grilă poartă și ele
   votul. `contrast-audit.php` NU vede `color-mix` — perechea e documentată acolo de mână.
   Egalul: aceeași rețetă în amber, și pe celulele laterale, și pe caseta juratului din mijloc (care
   stătea pe `--warning-soft`, 1.06:1 față de card pe light — adică invizibilă). */
.sc-jt__cell.is-fav { background: color-mix(in srgb, var(--winner-edge) 22%, var(--card)); }
.sc-jt__cell.is-tie, .sc-jt__judge.is-tie { background: color-mix(in srgb, var(--warning) 22%, var(--card)); }
/* NETUL — concluzia celulei, lipit de spinare (dreapta la e1, stânga la e2), `tabular-nums` ⇒
   zecimalele stau una sub alta de la un jurat la altul, iar suma din subsol cade fix sub el.
   `min-width: 4ch` (rev. 7, MĂSURAT): pista netului e `auto`, deci lată cât textul — „24.2" = 32px,
   „19" = 16px — și registrul de lângă ea se muta cu 16px de la un rând la altul („notele stau mai la
   dreapta sau mai la stânga", owner; dădeam vina pe chip, coincidea). `4ch` e lățimea celui mai lat
   net posibil (mono ⇒ 4 caractere = „28.5"), în CARACTERELE NETULUI, deci scalează cu fontul lui pe
   focus și pe proiector fără să poată tăia (pista rămâne `auto`, doar conținutul are podea).
   Textul aliniat spre spinare în cutia de 4ch ⇒ cifrele stau pe aceeași verticală. */
.sc-jt__net {
    grid-area: net; font-family: var(--font-mono); font-weight: 700; font-size: var(--font-md);
    font-variant-numeric: tabular-nums; color: var(--fg1); white-space: nowrap;
    min-width: 4ch; text-align: end;
}
.sc-jt__cell--entry2 .sc-jt__net { text-align: start; }
/* SĂGEATA spre net (B135): legenda promitea „→ 7" de luni de zile, iar celula n-o randa. E semnul
   NON-cromatic care spune care cifră iese din care — merge pe proiector și când celula se stivuiește
   pe îngust. Marcaj în DOM (`aria-hidden`), nu `content:` CSS, ca să fie testabil prin HTTP și să nu
   fie citit de cititorul de ecran. Mono, ca cifrele dintre care stă; `--fg3` = 6.04:1 pe card. Pista
   ei e `auto` = cât glifa; de net o desparte doar `column-gap`-ul celulei (rev. 5: „lane mai mic"). */
.sc-jt__arrow { grid-area: arrow; font-family: var(--font-mono); font-size: var(--font-md); color: var(--fg3); line-height: 1; }
.sc-jt__eq { font-size: var(--font-2xs); font-weight: 700; text-transform: var(--type-status-case, uppercase); letter-spacing: var(--type-status-tracking, .03em); color: var(--warning); }
/* REGISTRUL sub-notelor: o LINIE per sub-notă, numele și valoarea în ACELAȘI wrap („Fizic 7/10" —
   owner, rev. 5: „notele în același wrap cu numele criteriilor"). Liniile sunt aliniate spre
   MIJLOC (`flex-end` la e1, `flex-start` la e2), deci valorile stau pe muchia dinspre spinare, una
   sub alta, iar numele ies spre margine — oglinda exactă între laturi. Nume și valoare sunt lipite
   prin construcție (un spațiu). Linia cedează prima în celulă, dar NUMAI prin rupere pe cuvinte
   (`white-space: normal`): FĂRĂ ellipsis — numele criteriilor „trebuie citite mereu" (owner, rev. 6),
   iar treptele de mai jos sunt calibrate ca ruperea să nu fie necesară în practică. Valoarea nu se
   rupe niciodată de „/10" (`nowrap`). La o singură sub-notă numele lipsește: linia E nota („9/10"). */
.sc-jt__sk {
    grid-area: sk; justify-self: stretch; min-width: 0;
    display: flex; flex-direction: column; align-items: flex-end; row-gap: 1px;
}
.sc-jt__cell--entry2 .sc-jt__sk { align-items: flex-start; }
.sc-jt__skl { min-width: 0; max-width: 100%; white-space: normal; line-height: 1.25; text-align: end; }
.sc-jt__cell--entry2 .sc-jt__skl { text-align: start; }
/* Registrul e STINS la toate lățimile (rev. 10-11, owner: „se atrage atenția numai asupra notei
   finale, e o alegere bună"): sub-note, nume și „/max" pe 400 + `--fg3`, ca pozițiile de pe un bon;
   singurul lucru gras și pe cerneală plină din celulă e nota finală. ⚠️ `--fg2`, nu `--fg3`, n-ar
   stinge nimic: pe tema KF `--fg2: var(--kf-text)` = `--fg1`. `--fg3` = cerneala săgeții, 6:1 pe card. */
.sc-jt__skn { font-size: var(--font-xs); color: var(--fg3); }
.sc-jt__skv { font-family: var(--font-mono); font-weight: 400; font-size: var(--font-sm); color: var(--fg3); font-variant-numeric: tabular-nums; white-space: nowrap; }
.sc-jt__skv small { font-size: var(--font-2xs); color: var(--fg3); font-weight: 400; }
/* Chip-ul de ajustare (`.adj-chip`) e definit ÎN tokens.css — singurul fișier încărcat și de
   scorecard, și de ecranul juratului, deci culoarea pe nivel e aceeași pe ambele (ADR 0021 am.3).
   PE UN SINGUR RÂND (rev. 5, owner: „Sclipire se rupe pe două rânduri și înalță divul"): pista lui e
   `minmax(rezervă, auto)`, deci un chip mai lat decât rezerva LĂRGEȘTE pista în loc să se rupă sau
   să intre peste sub-note; registrul (`1fr`) cedează. Centrat vertical de `align-items` pe celulă.
   Nu se micșorează la nevoie: e deja pe cel mai mic token de font (~10px), sub el nu se mai citește
   pe proiector — când nu încape, CADE sub registru (treapta medie), mecanismul care chiar câștigă
   lățime. */
.sc-jt .adj-chip { grid-area: chip; white-space: nowrap; }
/* TREAPTA MEDIE (sub ~42rem de CONTAINER = runda): chipul CADE sub registru, finalul rămâne la dreapta
   (owner, rev. 6: „penalizările să cadă primele, abia apoi nota finală"). Fără chip, rândul doi are
   0 înălțime, deci rândurile fără penalizare nu se mișcă. Pragul, din conținut: pe lat o latură cere
   registru (~110px, „Interpretativ 8/10") + rezerva de chip (96) + săgeată (11) + net (36) + gap-uri
   + padding ≈ 284px; două laturi + mijlocul ≈ 675px ⇒ 42rem. */
@container (max-width: 42rem) {
    .sc-jt__cell { --sc-jt-cell-cols: var(--sc-jt-mid-cols-1); --sc-jt-cell-areas: var(--sc-jt-mid-areas-1); }
    .sc-jt__cell--entry2 { --sc-jt-cell-cols: var(--sc-jt-mid-cols-2); --sc-jt-cell-areas: var(--sc-jt-mid-areas-2); }
}
/* TREAPTA ÎNGUSTĂ (sub ~29rem, telefon): cade și finalul, pe rândul trei, la spinare — „ca o operație
   matematică una sub alta". Pragul: registru (~110) + săgeată + net + gap-uri + padding ≈ 188px pe
   latură ⇒ 376 + mijlocul ≈ 468px ⇒ 29rem.
   „RESTUL MAI ÎN SPATE" = POZIȚIE, nu prominență (rev. 11; owner: „notele nu stau mai în urma notei
   finale, sunt tot aliniate"). Trei revizii au citit greșit cuvântul: mărime (rev. 6, 9 — finalul a
   ajuns mai mare decât suma rundei, inversare de ierarhie) și cerneală (rev. 10 — păstrată, dar
   mutată pe toate lățimile, la regula registrului). Măsurat: sub-note, chip și net aveau TOATE
   muchia la același pixel. Idiomul de registru contabil: detaliile într-o coloană interioară,
   totalul „trecut" spre exterior — aici sub-notele și chipul se retrag de la muchia spinării cu
   `--space-3`, iar nota finală rămâne SINGURA pe muchie. Un token, nu „coloana următoare" (netul
   întreg dincolo de operanzi ar lăsa coloana la ~84px și ar rupe „Interpretativ 7/10" și numele din
   Trivium pe telefon). Fără `--scale-cap`: treapta asta nu apare pe proiector. Selectoare (0,3,0),
   ca la vecini, ca să nu piardă la egalitate cu regulile de context. */
@container (max-width: 29rem) {
    .sc-jt__cell { --sc-jt-cell-cols: var(--sc-jt-stack-cols-1); --sc-jt-cell-areas: var(--sc-jt-stack-areas-1); }
    .sc-jt__cell--entry2 { --sc-jt-cell-cols: var(--sc-jt-stack-cols-2); --sc-jt-cell-areas: var(--sc-jt-stack-areas-2); }
    .sc .sc-jt__cell .sc-jt__sk { padding-inline-end: var(--space-3); }
    .sc .sc-jt__cell .adj-chip { margin-inline-end: var(--space-3); }
    .sc .sc-jt__cell--entry2 .sc-jt__sk { padding-inline-end: 0; padding-inline-start: var(--space-3); }
    .sc .sc-jt__cell--entry2 .adj-chip { margin-inline-end: 0; margin-inline-start: var(--space-3); }
}

/* Legendă reveal — explică notă / % / bară / crash pentru oameni obișnuiți */
.sc-legend {
    display: flex; flex-wrap: wrap; gap: .3rem 1.1rem;
    padding: .4rem .65rem; background: var(--sm-strip-surface); border-bottom: 1px solid var(--border-hair);
    font-size: var(--font-2xs); color: var(--fg3);
}
.sc-legend > span { display: inline-flex; align-items: center; gap: .35rem; }
.sc-legend__k {
    font-family: var(--font-mono); color: var(--fg1);
    background: var(--card); border: 1px solid var(--border-hair); border-radius: var(--radius-sm); padding: 0 .3rem;
}

/* ȘTERS 2026-09-01 — TOT vocabularul `.sc-jc*` (tabelul de criterii: 3 coloane % | criteriu | %) și,
   la rescrierea capului din aceeași zi, ultimul supraviețuitor `.sc-jc__pens`. Rezumatul pe criterii
   folosește acum ACEEAȘI grilă de pastile ca cel pe runde (`.sc-jg`, mai jos): la panel juratul E
   criteriul, deci coloanele grilei sunt criteriile; cifrele exacte trăiesc în detaliul din toggle.
   Chip-urile de ajustări au trecut în `.sc-hd__adj` / `.sc-hd__adjg` — din B158, în cutia concurentului.
   `.sc-totals` / `.sc-av` nu depindeau de `.sc-jc`; din 2026-09-01 își iau coloanele din `--sc-cols`,
   partajat cu capul — vezi blocul de mai jos. */
/* ═══════════════════════════════════════════════════════════════════════════
   CAPUL BATTLE-ULUI (`.sc-hd`) — RESCRIS 2026-09-01, structură nouă.

   TREI COLOANE × PATRU RÂNDURI, celulele direct pe grila părintelui:

       col 1 (1fr)     col 2 (mijloc)   col 3 (1fr)
       __crew          __mid            __crew      rând 1  ┐
       __nm            (rândurile 1-3)  __nm        rând 2  │ umplute cu verdictul (cutia concurentului)
       __adjg                           __adjg      rând 3  ┘ cipurile LUI (B158; `.sc-hd__adj` = contents)
       __tiebreak ──── toată lățimea ───────────    rând 4

   DE CE s-a rescris (istoric — nu reintroduce forma veche):
   1. Cifra stătea ÎN jumătate, care era `subgrid` cu coloane proprii + reguli de oglindire pe
      `--entry2`. Fiecare proprietate se scria de două ori ⇒ două reguli (0,2,0) se băteau și
      chip-urile din dreapta se aliniau la stânga, deși comentariul promitea oglindire.
   2. Scara era MOARTĂ: cifra atingea plafonul de 48px la o lățime de container de 282px, numele la
      480px. Între 560px și 1400px lățime de ecran capul nu-și mai schimba nicio mărime, iar cifra
      era 3× numele pe telefon. Coeficienții de mai jos sunt recalibrați ca scara să rămână vie.
   3. Chip-urile de ajustări stăteau PESTE umplerea de verdict: 1.00–1.32:1 pe olive (light), adică
      invizibile ca formă. Au stat pe un canal pe fundalul cardului, pe toată lățimea, până la B158
      (2026-09-16), când ownerul le-a cerut înapoi ÎN cutia concurentului („să fie ale lor"): canalul se
      citea ca „o linie albă ruptă". Diferența față de forma veche: umplerea e lime / gri (nu olive), iar
      cipul are un inel de contur (skin) — forma rămâne vizibilă. NU reveni la canal fără ownerul.

   ⚠️ CONTAINERUL DE INTEROGARE STĂ PE `.sc-hd`, niciodată pe o celulă: `cqi` măsoară TOT capul, deci
   toți coeficienții de mai jos sunt calibrați pe lățimea întreagă. Mutat pe celulă, se dublează tăcut.
   ⚠️ Fără `subgrid`: celulele stau direct pe rândurile părintelui, deci cele două laturi se aliniază
   PRIN CONSTRUCȚIE (regula UI_RULES „ce trebuie aliniat între doi frați nu poate sta în interiorul
   lor"). Nu reintroduce jumătăți-wrapper — de acolo veneau coliziunile.
   ═══════════════════════════════════════════════════════════════════════════ */

/* SSOT DE COLOANE. Capul, rândul de vot, totalurile și votul publicului au ACELEAȘI trei coloane —
   înainte se aliniau doar din simetrie („spinarea"), adică din noroc. Acum din definiție. */
.sc {
    /* Rândurile cu ETICHETĂ pe mijloc („total puncte", „Vot public") — au nevoie de lățime. */
    --sc-cols: 1fr minmax(4.5rem, calc(8.5rem * var(--scale-cap, 1))) 1fr;
    /* Capul + rândul de vot — mijlocul ține doar „VS"/scorul, deci e o FRACȚIUNE, nu o lățime fixă:
       ~14% din propria lățime, cu o podea care acoperă cel mai lat scor. Procent, nu `cqi`: vezi nota
       de la `.sc-hd`. Aceeași valoare în ambele ⇒ canalul dintre jumătăți nu are treaptă. */
    --sc-mid: minmax(2.6rem, 14%);
}

.sc-hd {
    display: grid;
    /* MIJLOCUL are lățime PROPRIE (`--sc-mid`), nu `--sc-cols`.
       ⚠️ Cifra care conta nu era podeaua, ci PLAFONUL. Cu `minmax(4.5rem, 8.5rem)` și `min-width: 0`
       pe celulele laterale, baza celor două `fr` e 0 — deci §12.6 „Maximize Tracks" umflă mijlocul
       până la growth limit (8.5rem = 136px) ÎNAINTE ca §12.7 să împartă restul între `fr`-uri. Pe un
       card de 340px asta însemna 136px = 40% pentru o cutie care ține „VS". (Estimarea „72px = 21%"
       era greșită cu 2×: măsura podeaua, nu ce se întâmplă efectiv.)
       ⚠️ NU `auto`: ar fi content-driven, deci lățimea ar diferi între „VS" (2 caractere) și scor
       („10–8" e posibil la panel cu multe criterii) ⇒ coloanele de nume s-ar redimensiona la reveal
       și punctul de rupere al numelui s-ar muta. Track EXPLICIT = aceeași lățime în ambele stări.
       ⚠️ Nici `min-width` pe `.sc-hd__mid` nu ajută: pe ELEMENT nu poate îngusta un track, doar să-l
       apere. Valoarea trebuie să intre în definiția coloanei, adică aici.
       ⚠️ Și NU `cqi` aici: unitățile de container NU se rezolvă pe elementul care DECLARĂ containerul
       (`.sc-hd` are `container-type` mai jos), deci `11cqi` scris aici s-ar măsura pe `.bk-layout` —
       tot rândul de bracket. PROCENTUL, în schimb, se raportează la lățimea proprie a grilei, exact
       ce trebuie. `.sc__vote` folosește aceeași valoare și are aceeași lățime, deci canalul dintre
       jumătăți se continuă fără treaptă (numele + butoanele = un bloc, cerere 2026-08-15).
       Podeaua (2.6rem) acoperă cel mai lat conținut posibil la fontul minim al mijlocului
       („10–8" ≈ 2.4em la 13px ≈ 31px) și e ȘI separatorul care ține cele două umpleri de verdict să
       nu se atingă — singurul motiv real de lățime minimă la cap. */
    grid-template-columns: 1fr var(--sc-mid) 1fr;
    grid-template-rows: auto auto auto auto; gap: 0;
    background: var(--card); font-variant-numeric: tabular-nums;
    container-type: inline-size;
    /* Paddingul celulelor: FLUID, nu `rem` fix. Fixul era cauza pentru „divurile se înalță cât un
       sfert de ecran" pe telefon (13.6px sus+jos oricât de îngust era) și, invers, rămânea pe loc pe
       proiector în timp ce fonturile se dublau.
       Coborât încă o treaptă 2026-09-01 (a doua iterație): penalizările au ieșit în canalul lor, deci
       cutia nu mai are ce ține înăuntru — cerința e „mai lată decât înaltă, subtil vizibilă". */
    --sc-hd-py: clamp(.25rem, 1.2cqi, calc(.9rem * var(--scale-cap, 1)));
    --sc-hd-px: clamp(.4rem, 1.8cqi, calc(1rem * var(--scale-cap, 1)));
    /* BANDA DE CIPURI din cutia concurentului (B158) — mărimea și înălțimea ei, declarate O DATĂ: le
       citesc grupurile (rezervarea) ȘI mijlocul (care își urcă cifrele deasupra benzii). Custom property
       nerezolvată aici: `cqi` se rezolvă la consumator, deci măsoară tot `.sc-hd`.
       Podeaua `--font-3xs`: pe ecran mic cipurile SE MICȘOREAZĂ odată cu capul (cererea ownerului), nu
       stau blocate la 11px cât numele. */
    --sc-hd-adj-fs: clamp(var(--font-3xs), 2cqi, calc(var(--font-md) * var(--scale-cap, 1)));
    --sc-hd-adj-h: calc(var(--sc-hd-adj-fs) * 1.5 + var(--sc-hd-py) * .35 + max(4px, var(--sc-hd-py) * .8));
}

/* ---- CELULELE DE IDENTITATE (rândurile 1-2) ---- */
.sc-hd__sub, .sc-hd__nm {
    min-width: 0; padding-inline: var(--sc-hd-px);
    font-family: var(--font-display);
    background: var(--side-surface);
}
.sc-hd__sub { grid-row: 1; padding-top: var(--sc-hd-py); text-transform: var(--type-title-case, uppercase); }
/* `padding-bottom` la 30%%: penalizările au ieșit în canalul lor, deci jos nu mai e nimic de apărat,
   iar numele e uppercase (fără descendente). ⚠️ NU zero: între nume și `.sc-hd__adj` nu există linie
   de separare (`gap: 0`, iar canalul are `border-BOTTOM`), deci tot spațiul vine de aici plus din
   paddingul canalului — la zero s-ar lipi pe proiector, unde numele urcă la `--font-9xl`. */
.sc-hd__nm { grid-row: 2; padding-bottom: calc(var(--sc-hd-py) * .3); display: flex; align-items: center; gap: .4rem; font-weight: var(--type-name-weight, 900); text-transform: var(--type-name-case, uppercase); letter-spacing: .02em; }

/* Plasarea pe coloană + oglindirea, O SINGURĂ DATĂ fiecare. Latura 2 e împinsă spre marginea
   EXTERIOARĂ; nu se folosește `order`/`row-reverse` nicăieri (WCAG 1.3.2/2.4.3, ADR 0041) — ordinea
   din DOM e deja ordinea de citire. */
.sc-hd__c--1 { grid-column: 1; text-align: start; border-inline-start: 6px solid var(--text); }
.sc-hd__c--2 { grid-column: 3; text-align: end; border-inline-end: 6px solid var(--fg4); }
.sc-hd__c--2.sc-hd__nm { justify-content: flex-end; }
/* Barele de identitate de 6px de pe marginile capului se opreau brusc sus si jos („pare ca se taie").
   Latimea lor e structura (ramane), culoarea urmeaza umplerea cutiei — deci nu se mai vad ca linie
   separata, iar coltul rotunjit al cardului ramane curat. Cutia = crew + nume + CIPURILE.
   ⚠️ Regula sta DUPA `.sc-hd__c--1/2` inadins: aceeasi specificitate (0,1,0), deci ordinea decide.
   Coborata din `@layer skin` la B159 L10 (F2), unde castiga prin layer. */
.sc-hd__sub,
.sc-hd__nm,
.sc-hd__adjg { border-inline-color: var(--side-surface); }

/* Verdictul umple AMBELE celule ale laturii. Contigue pe verticală (`gap: 0`), deci se citesc ca un
   bloc, nu ca două dungi. Mijlocul rămâne pe card ⇒ cele două culori nu se ating. */
.sc-hd__sub.is-win, .sc-hd__nm.is-win, .sc-hd__adjg.is-win { background: var(--winner-edge); color: var(--sm-on-verdict); border-inline-color: var(--sm-verdict-fill); }
.sc-hd__sub.is-out, .sc-hd__nm.is-out, .sc-hd__adjg.is-out { background: var(--loser-fill); color: var(--sm-text-mid); border-inline-color: var(--loser-fill); }
/* INVINSUL are aceeasi greutate ca invingatorul, cu o treapta imperceptibil mai jos, si e ESTOMPAT prin
   CULOARE: o greutate mult mai mica „se vedea oribil" langa castigator. B159 L10 (F2). */
.sc-hd__nm.is-out { font-weight: 750; }
/* Cupa moștenește cerneala laturii: aurul pe umplerea de accent e ilizibil. */
.sc-hd__nm.is-win .sc__tr { color: inherit; }

/* IDENTITATEA SECUNDARĂ — supratitlu lipit de nume: la echipe COMPONENȚII, la solo CREW-ul
   (`BattleScorecardPresenter::subLine()`). Un rând, tăiat cu „…".
   ⚠️ `min-height` E OBLIGATORIU, dar exact CÂT UN RÂND (2026-09-01, iter. 4). Rândul se rezervă
   MEREU, chiar gol: fără el capul își schimba înălțimea de la un battle la altul, după cum avea sau
   nu ce scrie acolo. NU se întoarce la `1.35em` — aia lăsa spațiu mort deasupra și făcea linia să
   citească drept o bandă separată, nu un supratitlu. `1.1em` = fix `line-height`-ul de mai jos.
   Perechea lui e `padding-top` la 60% din pasul comun: destul aer cât să nu se lipească de muchie,
   nu atât cât să pară un rând de sine stătător.
   B158 (2026-09-16, ownerul: „se văd foarte, foarte subtil și font foarte mic"): o treaptă mai mare
   (podea `--font-xs`, plafon `--font-md`), greutate 600, FĂRĂ opacitate — opacitatea făcea pe umplerea
   de verdict o bandă de altă nuanță deasupra numelui. */
.sc-hd__sub {
    min-height: 1.1em; padding-top: calc(var(--sc-hd-py) * .6);
    /* Linia de crew / componenti se vedea „foarte, foarte subtil" -> cerneala tare pe latura nedecisa
       (cea a verdictului vine din regula de umplere de mai sus). B159 L10 (F2). */
    font-weight: 600; letter-spacing: .02em; line-height: 1.1;
    font-family: var(--font-mono);
    font-size: clamp(var(--font-xs), 2.2cqi, calc(var(--font-md) * var(--scale-cap, 1)));
    color: var(--sm-text-hi);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* ⚠️ Pe umplerea de verdict cerneala vine din regula de umplere, NU din `inherit`.
   `color: inherit` aici ar fi (0,2,0) ca ea și, venind mai jos, ar câștiga — crew-ul ar moșteni
   cerneala CORPULUI peste umplere. Fără wrapper de latură nu mai există de la cine să moștenești. */

/* ---- MIJLOCUL (rândurile 1-3, coloana 2) — „VS" înainte, cifrele după ---- */
/* Un singur element care își schimbă TEXTUL. De aici vine „la reveal nu se mișcă nimic": nodul e
   același, deci morph-ul nu inserează și nu șterge nimic. */
.sc-hd__mid {
    /* 1 / 4 (B158): rândul 3 = cipurile de ajustare, acum ÎN cutia fiecărui concurent → mijlocul coboară
       odată cu cutiile, ca despicătura de culoare să rămână continuă până jos. */
    grid-column: 2; grid-row: 1 / 4;
    /* ⚠️ `stretch`, NU `center` (schimbat 2026-09-01, iter. 4): mijlocul trebuie să UMPLE celula lui
       de grilă, altfel fundalul de mai jos ar picta doar cutia conținutului și ar rămâne card în jur.
       Conținutul se centrează din interior. `align-items: center`, nu `baseline`: cele două cifre au
       același corp de literă, deci rezultatul e identic, dar merge și când cutia e mai înaltă. */
    display: flex; align-items: center; justify-content: center; gap: .25em;
    /* CULORILE CONCURENȚILOR TREC PESTE MIJLOC, fix jumătate-jumătate (cerere owner 2026-09-01).
       E o întoarcere la intenția din B115/B116 — „culorile concurenților se întâlnesc la mijloc" —
       pe care am rupt-o când am scos cifra din jumătăți în coloana asta.
       Despicătura cade exact pe SPINARE fără niciun calcul: coloanele laterale sunt `1fr` egale și
       barele de accent sunt simetrice (6px de fiecare parte), deci 50% din mijloc E centrul capului.
       Oprire DURĂ (`0 50%` / `50% 100%`), nu `50%, 50%` — fără interpolare, muchie curată. Idiomul
       există deja în fișier: barele de scor din `judge.css` / `.smoke-*`. */
    background: var(--side-surface);
    /* B158 (cererea ownerului): cifrele stăteau centrate pe TOATĂ înălțimea (nume + cipuri) într-o coloană
       îngustă, deci ieșeau mici și cădeau sub nume. Acum: fundalul continuă pe rândurile 1-3, dar
       conținutul se centrează pe rândurile NUMELOR (`padding-bottom` = înălțimea benzii de cipuri), fără
       margine interioară, iar cifrele POT depăși coloana spre interiorul cutiilor (numele stau spre
       marginile exterioare) — `z-index` ca latura 2, pictată după, să nu le acopere. */
    padding: 0 0 var(--sc-hd-adj-h);
    position: relative; z-index: 1;
    font-family: var(--font-display); font-weight: var(--type-number-weight, 900); line-height: .9;
    /* SCORUL FINAL E CE CONTEAZĂ — umple coloana, nu stă timid în ea (2026-09-01, iter. 3).
       Coeficientul vechi (3.4cqi) folosea ~50% din lățimea disponibilă: coloana nu era constrângerea,
       calibrarea era. Cu liniuța scoasă, conținutul cere 1.49em în loc de 1.86em (-20%), iar restul
       câștigului vine din coeficient. Rezultat: ~2x mai mare la ORICE lățime, fără să lățesc coloana.
       ⚠️ 7cqi, nu 7.5: la 300px lățime 7.5 umple coloana EXACT, iar .62em (lățimea cifrei în Archivo
       900) e o estimare, nu o măsurătoare din font. Marja acoperă abaterea. */
    font-size: clamp(var(--font-2xl), 9cqi, calc(var(--font-9xl) * 1.5 * var(--scale-cap, 1)));
}
/* Doar DOUA stari colorate. „Terminat fara castigator" e IMPOSIBIL: `winnerEntry = null` apare doar
   in constructorul lui Battle (status PENDING), iar toate caile spre COMPLETED seteaza un castigator.
   O a treia regula ar fi cod mort. */
.sc-hd__mid--w1 { background: linear-gradient(90deg, var(--winner-edge) 0 50%, var(--loser-fill) 50% 100%); }
.sc-hd__mid--w2 { background: linear-gradient(90deg, var(--loser-fill) 0 50%, var(--winner-edge) 50% 100%); }
/* ⚠️ `--fg3`, NU `--fg4`: pe fundalul cardului „VS" avea 4.06:1, dar pe suprafata laturii cade la
   2.89:1 pe light — sub pragul GRAFIC. Masurat inainte de livrare; `--fg3` da 6.04 / 5.24. */
.sc-hd__vs { font-size: .55em; letter-spacing: var(--type-label-tracking, .06em); color: var(--sm-text-hi); }
/* Fiecare cifra sta pe JUMATATEA ei, deci isi ia cerneala de pe umplerea de sub ea — nu `--winner-ink`,
   care e cerneala de pe SUPRAFATA si ar fi gresita peste olive. Aceleasi clase ca celulele (`_s1`/`_s2`),
   nu un vocabular paralel: inainte cifra invinsului nu primea nicio clasa. */
.sc-hd__n { color: var(--fg3); }
.sc-hd__n.is-win { color: var(--sm-on-verdict); }
.sc-hd__n.is-out { color: var(--sm-text-mid); font-weight: 750; }

/* ---- AJUSTĂRILE (rândul 3) — ÎN CUTIA CONCURENTULUI (B158, 2026-09-16, cererea ownerului) ----
   Cipurile unui concurent sunt ALE LUI: stau sub numele lui, pe umplerea laturii lui (verdict / învins /
   latură nedecisă), cu bara de identitate continuă. Până acum stăteau pe un canal separat, pe fundalul
   cardului, între cutii și banda juraților — ownerul îl vedea ca „o linie albă ruptă". Motivul vechi
   (cipurile dispăreau ca FORMĂ peste olive, 1.00–1.32:1) e tratat cu un inel fin pe cip, mai jos.
   `.sc-hd__adj` rămâne în DOM (idiomorph potrivește pozițional) dar e `display: contents`: cele două
   grupuri devin celule de grilă (col. 1 și 3, rândul 3). Se randează MEREU, goale — rezervarea ține
   capul la aceeași înălțime înainte și după reveal. */
.sc-hd__adj {
    display: contents;
    /* Padding vertical PROPORȚIONAL, nu `.15rem` fix: fixul nu creștea cu fontul, deci pe proiector
       chip-urile ajungeau lipite de numele mare. Perechea lui `padding-bottom` de pe `.sc-hd__nm`.
       ⚠️ REZERVAREA SCALEAZĂ CU CONȚINUTUL (2026-09-01, iter. 5). `min-height: 1.25em` se măsura pe
       fontul CORPULUI (16px ⇒ 20px constant), în timp ce chipul crește cu `cqi` și `--scale-cap`.
       Peste ~537px lățime de cap rezervarea nu mai acoperea chipul, deci capul creștea la reveal
       (+4.7…+27px; pe proiector ~+25px). Sub 537px diferența era exact 0 — de asta părea „mică".
       Fixul: rândul poartă ACELAȘI font-size ca chipurile, iar `1.5em` = înălțimea lor reală
       (`line-height: 1.3` + `padding: .1em` × 2). Chipurile îl moștenesc, deci nu pot diverge. */
    /* `font-size` pe un element `display: contents` SE MOȘTENEȘTE în continuare de copii. O treaptă mai
       mare (cererea ownerului: „să mărim partea aia"). */
    font-size: var(--sc-hd-adj-fs);
}
/* Rezervarea = înălțimea unui cip (1.5em) + paddingul vertical, în border-box → cutia goală și cea cu
   un rând de cipuri au aceeași înălțime. */
.sc-hd__adjg {
    grid-row: 3; min-width: 0;
    display: flex; flex-wrap: wrap; align-content: flex-start; gap: 2px;
    /* Podea de 6px jos: pe ecran îngust `--sc-hd-py` scade și cipurile ajungeau lipite de muchia cutiei.
       ⚠️ Cipurile POT trece pe al doilea rând când sunt multe (cutia are acum jumătate de lățime):
       rezervarea acoperă UN rând, deci la reveal cu 2+ rânduri capul crește o dată. Asumat — alternativa
       (fără wrap) ar ascunde penalizări, iar rezervarea de două rânduri ar lăsa goluri în fiecare cutie. */
    min-height: var(--sc-hd-adj-h);
    padding: calc(var(--sc-hd-py) * .35) var(--sc-hd-px) max(4px, calc(var(--sc-hd-py) * .8));
    background: var(--side-surface);
}
.sc-hd__adjg--r { justify-content: flex-end; }
/* `font-size: inherit` — scara vine de pe rând (vezi acolo), ca rezervarea și conținutul să nu
   poată diverge. Două declarații ale aceleiași scări = exact felul în care revine driftul. */
/* Inel de contur ca FORMA cipului sa ramana vizibila pe umplerea de verdict / pe cea a invinsului. */
.sc-hd__adj .adj-chip { font-size: inherit; padding: .1em .35em; line-height: 1.3; white-space: nowrap; box-shadow: inset 0 0 0 1px var(--sm-line); }
/* Numarul (x2) si procentul FARA opacitate: pe umplerea de verdict cadeau sub pragul de text.
   ⚠️ `.adj-chip` e definit in tokens.css, pe care il incarca SI juratul — regula lui ramane acolo
   neatinsa, iar aceasta sta in scoreboard.css, foaie de site. Asa opacitatea urca doar pe site.
   Coborata din `@layer skin` la B159 L10 (F2). */
.adj-chip__count,
.adj-chip__pct { opacity: 1; }

/* ---- BANDA DE DEPARTAJARE (rândul 4) — o propoziție despre PERECHE, nu despre o latură ---- */
.sc-hd__tiebreak {
    grid-column: 1 / -1; grid-row: 4; padding: .2rem .6rem; text-align: center;
    background: var(--warning-soft); color: var(--on-warning-soft);
    border-bottom: 1px solid var(--border-hair);
    font-family: var(--font-sans); font-weight: 600; text-transform: var(--type-status-case, uppercase);
    font-size: clamp(var(--font-3xs), 1.4cqi, calc(var(--font-2xs) * var(--scale-cap, 1)));
    letter-spacing: var(--type-status-tracking, .03em); line-height: 1.3;
}
.sc-hd__tiebreak b { font-family: var(--font-mono); }

/* Cupa dispare pe container îngust — înghesuia numele, care e informația. Prag și idiom deja folosite
   în fișier (`.live-sign__st`, `.sc-jt__cell`). Container, nu `@media`: capul își știe lățimea reală,
   ecranul nu. */
@container (max-width: 26rem) {
    .sc-hd__nm .sc__tr { display: none; }
}

/* Toggle „Detaliu pe jurați" — lipit sub rezumat, deschide tabelele pe runde (Bootstrap collapse).
   Capul de tabel NU se redublează: numele sunt deja în rezumatul de deasupra. */
/* rând-footer al aceleiași rame (nu cutie separată): full-width, doar hairline sus */
.sc-detail-toggle {
    display: flex; align-items: center; justify-content: space-between; gap: .5rem;
    width: 100%; margin: 0; padding: .3rem .6rem;
    background: transparent; border: 0; border-top: 1px solid var(--border-hair); border-radius: 0;
    font-family: var(--font-display); font-size: var(--font-2xs); font-weight: 600;
    text-transform: var(--type-control-case, uppercase); letter-spacing: var(--type-control-tracking, .06em); color: var(--fg2); cursor: pointer;
    transition: background .12s, color .12s, border-color .12s;
}
/* Hoverul trece pe tenta de cerneala — gramatica de hover a skinului (B159 L10, F2). */
.sc-detail-toggle:hover { background: color-mix(in srgb, var(--sm-text-hi) 8%, transparent); color: var(--fg1); }
.sc-detail-toggle[aria-expanded="true"] { background: var(--surface-inverse); color: var(--text-on-inverse); border-color: var(--border-strong); }
.sc-detail-toggle__chev { flex-shrink: 0; font-size: var(--font-sm); transition: transform .15s; }
.sc-detail-toggle[aria-expanded="true"] .sc-detail-toggle__chev { transform: rotate(180deg); }
/* FĂRĂ `border-top` aici: butonul de deasupra are deja unul, iar deschis se vedeau DOUĂ linii
   lipite (2026-09-01). Separarea o face butonul, care e mereu prezent deasupra detaliului. */
.sc-detail { border-top: 0; }
.sc--focus .sc-detail-toggle { font-size: var(--font-xs); padding: .4rem .75rem; }

/* Totaluri (baza tie-break) — 3 coloane simetrice, aceeași rețetă ca `.sc-av`. Capul (`.sc-hd`) are
   2 jumătăți, tot simetrice, deci SPINAREA lui cade pe centrul coloanei din mijloc de aici: fiecare
   total rămâne sub numele lui, eticheta pe mijloc. Era `flex
   space-between` (cifrele la margini, „mai centrat pe coloana numelui" — userul, 2026-08-27).
   `padding-inline: 0` — altfel centrul coloanelor s-ar decala față de nume cu jumătate din padding. */
.sc-totals {
    display: grid; grid-template-columns: var(--sc-cols);
    align-items: center; text-align: center;
    padding: .35rem 0; background: var(--sm-strip-surface); border-top: 1px solid var(--border-hair);
}
/* TOTAL PUNCTE = info importantă (tie-break la egal) → cifre MARI, vizibile */
.sc-totals__v { padding: 0 .5rem; font-weight: var(--type-number-weight, 900); font-size: var(--font-3xl); color: var(--fg3); line-height: 1; }
/* Totalul care conduce ia cerneala de accent (B159 L10, F2). */
.sc-totals__v--hi { color: var(--sm-accent-text); }
.sc--focus .sc-totals__v { font-size: var(--font-5xl); }
/* maxul teoretic (constant) = SCALA cifrei („18.6 / 30") — vizibil, nu estompat (cerere 2026-08-27) */
.sc-totals__max { font-size: var(--font-sm); color: var(--fg3); font-weight: 400; margin-left: 3px; }
.sc--focus .sc-totals__max { font-size: var(--font-md); }
.sc-totals__lbl { font-size: var(--font-sm); font-weight: var(--type-label-weight, 900); color: var(--fg3); text-transform: var(--type-label-case, uppercase); letter-spacing: var(--type-label-tracking, .06em); }

/* ═══ Grila JURAT × RUNDĂ (B115, 2026-08-27) — corpul AMBELOR rezumate din 2026-09-01 ═══
   La panel juratul E criteriul, deci aceleași coloane se citesc ca CRITERII — un singur corp, două
   moduri. Pastilele numără VOTURI DE JURAT și NU se adună în antet (UI_RULES „Cifrele de lângă un
   verdict", pct. 5); legenda în unitatea antetului stă pe axa care decide: numărul rundei
   (`.sc-jg__no`) la runde, capul de coloană (`.sc-jg__judge.is-*`) la criterii.
   Două grile suprapuse, nu una: capul `.sc-hd` are 2 jumătăți, corpul are N coloane egale
   (N = jurați, `--sc-jn` din template).
   Toate scările = `clamp(<token>, N cqi, calc(<token> * var(--scale-cap, 1)))` (ADR 0040 / 0041 am.1)
   → pe sală cresc singure, fără reguli `.live-projector` aici. Aceleași clase înainte ȘI după reveal
   (pastila cu fața în jos = `is-down` [+ `is-on` = a votat]); animația pornește când pastila primește
   clasa de stare — prin morph pe același nod sau prin inserare (frații lui `.sc` diferă între stări).
   Pattern-ul = `.jgrid` (components.css): grid pe container, rândurile `display: contents`. */
.sc-jg { background: var(--card); font-variant-numeric: tabular-nums; }
/* Antetul rezumatului e acum banda proprie `.sc-hd` (două jumătăți care se ating la mijloc) — vezi
   blocul ei mai sus. Regulile `.sc-jg__hd .*` de aici au fost ȘTERSE odată cu grila de 3 coloane
   din cap: scorul pe mijloc, liniuța dintre cifre, celula-coloană cu chip-uri, `.sc-jg__id`.
   Corpul: containerul de măsurare e WRAPPER-ul (bloc în flux, lățimea vine de la părinte — testul din
   ADR 0040) și tot el trage lateral când N coloane × podea nu mai încap („se strânge întâi, se trage
   lateral după"). `.sc { overflow: hidden }` e în AFARA lui, deci nu înghite nimic. */
/* Aer ÎNTRE capul cu numele și grila juraților (cerut 2026-08-27: „să fie aerisit de nume, mai
   distanțat, să se vadă că acolo apar scorurile"). Spațiul e pe RAIL, nu pe corp: corpul e containerul
   de scroll și gazda de `cqi`, iar un padding-top acolo ar intra sub masca `.rail-fade` și ar derula
   odată cu conținutul. Pe rail rămâne fix, deci despărțitura se vede și când grila e trasă lateral.
   Distanța e mai mare decât hairline-ul de sub cap tocmai ca să citească drept ZONĂ NOUĂ, nu ca rând
   următor al aceluiași tabel.
   ⚠️ Spațiul e în `rem × --scale-cap`, NU în `cqi`: pe lanțul `.sc → .sc-jg → .sc-jg__rail` nu există
   niciun element cu `container-type` (`.sc-hd` e FRATE, nu strămoș), deci `cqi` ar cădea tăcut pe
   viewport — capcana prinsă azi la cronometru. `--scale-cap` îl dublează pe proiector, unde trebuie. */
/* JURAȚII SUNT O BANDĂ PROPRIE, nu o continuare a căsuțelor concurenților (cerut 2026-08-28:
   „vreau să desprindem jurații din scoreboard, să nu mai fie legați de concurenți").
   Rețeta e cea deja folosită de `.sc-totals` și `.sc-av`: suprafață `--paper-2` + hairline sus.
   Așa scorecardul se citește ca un TEANC de benzi — verdict · jurați · puncte · public — fiecare cu
   propria suprafață, în loc de un bloc unic în care jurații par lipiți de numele de deasupra. */
/* Distanța dintre capul cu numele concurenților (`.sc-hd`) și zona de runde/criterii. Urcată
   2026-09-01 (.6→1rem, focus .9→1.4rem) la cererea ownerului: capul de coloană are acum două etaje
   (jurat + criteriu), deci blocul de dedesubt începe „mai sus" și cele două zone se citeau lipite.
   Se aplică în AMBELE moduri și pre-reveal — toate trei trec prin `.sc-jg`. */
.sc-jg__rail {
    /* Banda sta pe s1, nu pe suprafata cutiilor: pe s2 era identica cu cutiile nedecise, iar inainte
       de verdict capul si banda se vedeau ca „un bloc gri". B159 L10 (F2). */
    background: var(--sm-s1); border-top: 1px solid var(--border-hair);
    padding-top: calc(1rem * var(--scale-cap, 1));
}
.sc--focus .sc-jg__rail { padding-top: calc(1.4rem * var(--scale-cap, 1)); }
.sc-jg__body { container-type: inline-size; overflow-x: auto; padding: .35rem .5rem .45rem; }
.sc-jg__grid {
    /* `gap` urcat 3px→6px (cerut 2026-08-27: „nu așa lipite, mai aerisite"). E un singur `gap`, deci
       aerisește pe AMBELE axe: și între jurați, și între runde — exact ce trebuie când sunt multe
       runde una sub alta. Coloanele rămân `1fr` egale, deci simetria (și mijlocul) se păstrează. */
    display: grid; gap: 6px; align-items: stretch;
    /* Prima coloană = legenda de rând (#1, #2…), `auto` deci ia exact cât cere numărul. Restul rămân
       coloanele de jurați, egale. */
    grid-template-columns: auto repeat(var(--sc-jn, 1), minmax(clamp(2.6rem, 8cqi, calc(4rem * var(--scale-cap, 1))), 1fr));
}
.sc-jg__row { display: contents; }
/* LEGENDA DE RÂND (#1, #2…) — contra-măsura pentru paradoxul de numărare, repusă 2026-08-28 la
   cererea userului: pastilele sunt VOTURI, antetul numără RUNDE, iar numărul ăsta ia culoarea
   câștigătorului RUNDEI. Așa se pot număra rundele în aceeași unitate ca antetul, fără să pară că
   „a câștigat cel cu mai puține pastile". Același vocabular de culoare ca pastilele (`is-winner` /
   `is-loser` / `is-tie`), ca să se citească drept aceeași informație, la altă scară.
   Mai mic decât o pastilă și fără ramă: e o ETICHETĂ de rând, nu un al (N+1)-lea vot. Neutru
   pre-reveal, când `pick` e null. */
.sc-jg__no {
    display: flex; align-items: center; justify-content: center;
    padding: 0 .4em; border-radius: var(--radius-sm);
    font-family: var(--font-mono); font-weight: 700; line-height: 1;
    font-size: clamp(var(--font-xs), 2.4cqi, calc(var(--font-base) * var(--scale-cap, 1)));
    color: var(--fg4); font-variant-numeric: tabular-nums;
}
/* Votul pentru INVINS se topea in card: cifre cu cerneala tare + un inel `box-shadow` care ii da
   forma, fara geometrie noua. B159 L10 (F2). */
.sc-jg__no.is-winner { background: var(--winner-edge); color: var(--sm-on-verdict); }
.sc-jg__no.is-loser  { background: var(--loser-fill); color: var(--sm-text-hi); box-shadow: inset 0 0 0 1px var(--sm-line); }
.sc-jg__no.is-tie    { background: var(--warning-soft); color: var(--on-warning-soft); }

/* Rândul juraților: coloane egale; celula e container, numele se măsoară în COLOANA LUI → cu 3
   jurați iese mare, cu 7 mic, fără nicio clasă de N. `anywhere` + podeaua coloanei merg împreună.

   NUMELE JURATULUI E ETICHETĂ, NU TITLU (corecție user 2026-08-27: „numele juraților sunt cam la fel
   de mari ca numele concurenților, e ciudat să vezi 5 nume scrise la fel"). Măsurat înainte: la ≥537px
   cu ≤5 jurați numele juratului ajungea la 20,8px iar al concurentului (2v2, bucket `l`, `--nm-k: .62`)
   la 19,84px — juratul era MAI MARE, la același font, aceeași greutate 900, același uppercase și
   ACEEAȘI culoare `--fg1`. Nu exista niciun canal de diferențiere.
   Coborârea refolosește vocabularul de text SECUNDAR din fișier: `--fg3` + greutate mai mică +
   treaptă mai jos. Nu inventăm un al doilea vocabular pentru același rol. Al treilea canal (mono)
   vine din lista de mono a vocabularului de scoreboard (`components.css`), lângă pastile — coloana
   juratului devine mono, numele concurenților rămân Archivo 900.
   La PANEL capul ăsta e și LEGENDA în unitatea antetului: primește `is-winner/is-loser/is-tie` din
   `judges[].pick` (presenter) și se numără ca să dea cifra din cap. Fundalul stă pe SPAN, nu pe
   celulă — celula e container de interogare (`container-type`) și gazdă de grilă, iar spanul are
   deja reguli proprii (`.sc-jg__judge > span`, mai jos); o declarație pe span bate moștenirea
   indiferent de layer (lecția B116/B105). */
/* Capul are DOUĂ RÂNDURI DE GRILĂ la panel (criterii, apoi nume), nu două etaje într-o celulă: rândul
   comun e ce ține toate criteriile la același nivel și toate numele la altul, oricâte linii ia fiecare.
   `justify-content: center` (axa rând) ține eticheta pe lățimea TEXTULUI — cu `stretch` s-ar întinde
   cât coloana și, fiind colorată, s-ar citi ca încă un dreptunghi de vot.
   Criteriile se aliniază la BAZĂ (ultima linie pe aceeași cotă), numele la VÂRF — așa granița dintre
   cele două rânduri e o linie dreaptă pe toată banda. */
.sc-jg__judge { container-type: inline-size; min-width: 0; display: flex; justify-content: center; text-align: center; letter-spacing: .04em; }
.sc-jg__judge--crit { align-items: flex-end; padding-bottom: 2px; }
.sc-jg__judge--jn { align-items: flex-start; }
.sc-jg__judge > span {
    /* B159 L10 (F2): scara urcata o treapta, cu ACEEASI forma (podea · cqi · plafon × --scale-cap),
       deci proiectorul ramane proportional. In panoul ingust `8cqi` cadea pe podeaua de 8.8px si se
       vedea ca atare. Numele juratilor = cerneala tare, nu gri: sunt informatie, nu decor. */
    font-weight: 700; line-height: 1.1; color: var(--sm-text-hi); overflow-wrap: anywhere;
    letter-spacing: .04em;
    font-size: clamp(var(--font-xs), 10cqi, calc(var(--font-base) * var(--scale-cap, 1)));
    max-width: 100%;
}
/* Numele juratului (DOAR la panel) — etajul de DEDESUBT, NEUTRU: verdictul e al criteriului, nu al
   persoanei; colorat, s-ar citi „a câștigat juratul". Ordinea criteriu-sus / jurat-jos e cerută
   explicit (2026-09-01): criteriul e informația, persoana e atribuirea.

   ⚠️⚠️ ȚINTA E `.sc-jg__judge--jn > span` (0,2,1), NU `.sc-jg__jn` (0,1,0). Regula de deasupra,
   `.sc-jg__judge > span`, are (0,1,1) și o bate — deci mărimea ȘI greutatea scrise pe clasa simplă
   NU s-au aplicat niciodată, iar numele s-a randat identic cu criteriul. Diagnosticat greșit de două
   ori („600 se rotunjește la 700 în Space Mono") înainte de a citi specificitatea: fontul chiar are
   400 și 700, dar declarația nu ajungea la el. Dacă adaugi aici o proprietate nouă, verifică întâi
   cine câștigă — regula-frate de deasupra pune și `font-family`, și `color`, și `line-height`.

   Singurul canal de diferențiere rămas e GREUTATEA (400 vs 700 — real în Space Mono: măsurat pe
   canvas, 700 are 1.53x cerneala lui 400). Celelalte două au fost încercate și scoase de owner pe
   2026-09-01, în ordinea asta:
     · MĂRIMEA — numele micșorat „se citește greu"; a revenit pe scara criteriului (13px/13px);
     · SCRIEREA — `text-transform: none` scos la cerere („revin la litere uppercase și la nume, că se
       vede mai bine"), deci numele ia din nou uppercase-ul kf de pe CELULĂ, prin moștenire.
   Contra-argumentul rămâne la vedere: majusculele pe nume de oameni costă 10-20% viteză de citire
   (`docs/FEEDBACK-2026-08-18`) — owner-ul a ales lizibilitatea la distanță, cu risc asumat și declarat
   temporar („o mai lăsăm așa o perioadă"). Dacă se revine la scriere normală, `text-transform` se
   anulează AICI, pe span: uppercase-ul stă pe CELULĂ (`.sc-jg__judge`, în `components.css`), iar o
   declarație proprie bate moștenirea indiferent de layer (același mecanism ca `font-family`). */
.sc-jg__judge--jn > span { font-weight: 500; color: var(--sm-text-mid); }
/* Criteriul (panel) — eticheta care poartă verdictul coloanei. Îmbracă TEXTUL, nu lățimea coloanei, și
   NU se lipește de primul dreptunghi: ambele au fost încercate pe 2026-09-01 și respinse de owner —
   „nu merge să fie lipit (…) și nici lat cât dreptunghiul, ca să nu se înțeleagă greșit că e un
   dreptunghi". Rămâne o etichetă, cu greutatea (700) ca al doilea canal față de numele juratului. */
.sc-jg__lbl--crit { padding: .28rem .55rem; border-radius: var(--radius-sm); font-weight: 700; }
/* Legenda pe COLOANĂ — ACEIAȘI tokeni ca legenda pe rând (`.sc-jg__no`) și ca pastilele, ca să nu
   apară un al treilea verde. */
.sc-jg__lbl.is-winner { background: var(--winner-edge); color: var(--sm-on-verdict); }
.sc-jg__lbl.is-loser  { background: var(--loser-fill); color: var(--sm-text-hi); box-shadow: inset 0 0 0 1px var(--sm-line); }
.sc-jg__lbl.is-tie    { background: var(--warning-soft); color: var(--on-warning-soft); }
/* Pastila = blocul care umple celula. Ramă de 2px în TOATE stările (nimic nu se mișcă la întoarcere).
   Colțuri drepte (`--radius-sm`), ca restul scoreboard-ului — „pastilă" e doar numele din discuție.
   Fontul („egal") vine din lista de mono a vocabularului de scoreboard (`components.css`) — cât timp
   regula lui stătea în `@layer components`, una de font aici ar fi fost moartă (UI_RULES „livrare inertă"). */
.sc-jg__pill {
    /* Conținutul rămâne CENTRAT pe ambele axe („păstrează mijlocul") — se schimbă doar cât de înaltă
       e cutia. Coborâtă 2026-08-27 („chenarele mai mici, să le scadă importanța"): pastilele sunt
       DETALIUL care susține verdictul din cap, nu verdictul. `stretch` pe grilă rămâne, ca rândul cu
       „egal" (singurul cu text) să nu iasă din rând cu vecinii lui. */
    display: flex; align-items: center; justify-content: center; min-width: 0;
    min-height: clamp(.8rem, 2.8cqi, calc(1.25rem * var(--scale-cap, 1)));
    border: 2px solid var(--border-hair); border-radius: var(--radius-sm); background: transparent;
    /* B159 L10 (F2): scara urcata o treapta, cu ACEEASI forma (podea · cqi · plafon × --scale-cap) —
       pastilele ajunsesera „extrem de marunte" in panoul ingust. */
    font-weight: 700; text-transform: var(--type-status-case, uppercase); letter-spacing: var(--type-status-tracking, .03em);
    font-size: clamp(var(--font-xs), 2.8cqi, calc(var(--font-base) * var(--scale-cap, 1)));
}
/* Cu fața în jos, votat = CERNEALĂ, nu culoarea verdictului (verdele înseamnă „cu câștigătorul"). */
.sc-jg__pill.is-down.is-on { background: var(--sm-text-hi); border-color: var(--sm-text-hi); }
/* …iar juratul care INCA n-a votat = contur punctat vizibil (era `--border-hair`, 1.34:1 — randul
   „disparea", deci nu se mai citea „2 din 3 au votat"). Punctat ≠ conturul plin al pastilei de
   invins. B159 L10 (F2). */
.sc-jg__pill.is-down:not(.is-on) { border-color: var(--sm-line); border-style: dashed; }
/* ── DUBLU CANAL: câștigătorul UMPLUT, învinsul CONTUR GOL (decizia userului, 2026-08-27) ──
   Raportul: „la tema light se observă destul de greu diferențele de culoare de la alb la verdele
   câștigător sau griul pierzător; încep să văd de ce aleg ăștia roșu și albastru".
   Măsurat, cauza e mai rea decât suna — era INVERS: umplerea de câștigător (`--winner-bg` `#eef7c6`)
   dădea 1,02:1 față de `--card`, iar cea de învins (`--fg4`) 4,06:1. **Pastila de învins era de 4×
   mai vizibilă decât cea de câștigător.** Ce se vedea la câștigător era rama, nu umplerea.
   Reparația nu adaugă un efect, inversează greșeala, și pe DOUĂ canale — culoare ȘI greutate
   vizuală (bloc plin vs. contur gol), ca să se citească și când proiectorul strică hue-ul
   (WCAG 1.4.1; UI_RULES § contrast pct. 8 „accentul e UMPLERE, nu linie").
   Perechea de tokene e semantică, nu aleasă pe ochi: `--winner-edge` E `--primary` sub kf, deci
   cerneala lui e `--on-primary` — se inversează singură pe temă (6,5:1 light / 11:1 dark), iar
   umplerea dă 5,86:1 light / 9,59:1 dark față de card. Cifrele intră în `scripts/contrast-audit.php`
   (§ PAIRS), altfel regresia se repetă tăcut — perechea „fundal câștigător ↔ fundal card" lipsea. */
.sc-jg__pill.is-winner { background: var(--winner-edge); border-color: var(--sm-accent-mark); color: var(--sm-on-verdict); }
/* Învins = UMPLUT cu `--loser-fill`, exact ca jumătatea lui din cap (userul, 2026-08-27: „înțeleg
   că e empty, dar ar fi trebuit să aibă aceeași culoare și pastilele juriului").
   Varianta de dinainte (contur gol) despărțea mai tare câștigătorul de învins, dar rupea legătura
   dintre pastilă și concurentul ei — iar aia e informația: pastila spune CU CINE a votat juratul.
   Un semnal consecvent bate un contrast local. Al doilea canal rămâne: câștigătorul e accent, nu gri.
   Pastila FĂRĂ vot a unui battle finalizat rămâne transparentă cu `--border-hair` (1,43:1) — o cutie
   goală lângă una umplută, deci tot nu se confundă cu învinsul. */
.sc-jg__pill.is-loser { background: var(--loser-fill); border-color: var(--sm-line); color: var(--sm-text-hi); }
.sc-jg__pill.is-tie { background: var(--warning-soft); border-color: var(--on-warning-soft); color: var(--on-warning-soft); }
.sc-jg__empty { padding: .55rem .65rem; font-size: var(--font-sm); color: var(--fg3); }
/* ⛔ ȘTERSĂ la B159 L10 (F2): întoarcerea pastilei la reveal (`@keyframes sc-jg-flip`, cadență în
   TREPTE, 2026-08-27). Pastilele se re-randează la FIECARE poll, iar o animație care se reia e
   zgomot — skinul o oprise cu `animation: none`, iar la coborârea lui a căzut declarația însăși.
   Odată cu ea au căzut și keyframe-urile (nimeni nu le mai numește) și garda `prefers-reduced-motion`
   care o oprea: o gardă fără subiect nu mai e gardă. */
/* Panoul mare (battle-ul curent / sala) */
.sc--focus .sc-jg__body { padding: .5rem .75rem .6rem; }
.sc--focus .sc-jg__grid { gap: 8px; }
/* ⛔ ȘTEARSĂ la B159 L10 (F2): `.sc--focus .sc-jg__judge > span { font-size: 9cqi }`. De când
   skinul a urcat scara generică la 10cqi, regula asta pierdea (layerul bate specificitatea), deci
   panoul mare se randa DEJA la 10cqi. Coborârea skinului îi lua prefixul `body.skin-modern`, iar
   `.sc--focus …` (0,2,1) ar fi CÂȘTIGAT înapoi la specificitate — adică o schimbare de geometrie
   cu toate gate-urile verzi. Ștearsă ca să rămână ce se vede azi. */
/* Numele juratului NU are mărime proprie, nici aici, nici la mărimea de bază: rămâne pe scara lui
   `.sc-jg__judge > span`, aceeași cu a criteriului. Micșorat, devine greu de citit (raportat
   2026-09-01: „marimea e prea mica, se citeste greu"). Diferențierea față de criteriu se face pe
   GREUTATE (400 vs 700) și SCRIERE (normală vs majuscule) — nu pe mărime. */
/* Pe panoul mare culoarea trebuie să se vadă din sală, deci eticheta primește mai mult aer. */
.sc--focus .sc-jg__lbl--crit { padding: .38rem .75rem; }
.sc--focus .sc-jg__pill { min-height: clamp(1rem, 3.4cqi, calc(1.55rem * var(--scale-cap, 1))); }

/* ═══ Scara de SALĂ (B114, ADR 0041 am.1) — pe perete tavanul dispare ═══
   Raportul userului după B112: „bracketul Top 8 rămâne la o mărime intermediară", „div-urile cresc,
   fonturile nu", „A+ ajută puțin". Cauza, una: toate scările din container au tavan fix în rem/px
   (regula 2o „maximele = valorile de dinainte"), iar `zoom` e INVARIANT pe `cqi` (micșorează și
   containerul). Aici stă UN SINGUR loc de remap, în două părți:
     1. `--scale-cap` — tavanul fiecărui clamp() din fișier e `calc(<azi> * var(--scale-cap, 1))`;
        pe sală = 100 ⇒ practic fără tavan, podelele neatinse. Pe public/organizator rămâne 1.
     2. mărimile care NU erau în cqi (scorul mare, „VS", totalurile, bara, campionul, podiumul):
        `max(<azi>, N cqi)` DOAR aici — podeaua e valoarea de azi, creșterea o dă containerul.
        `cqi` se rezolvă pe cel mai apropiat container: `.sc-hd` (capul de
        rezumat), `.sc-jg__body` (grila de pastile), `.sc-round` (o rundă din detaliu — bandă,
        rânduri ȘI subsol, din B135; înainte era `.sc-jt`, deci banda de rundă măsura `.bk-layout`),
        altfel `.bk-layout` (rândul). Coeficienții se CALIBREAZĂ vizual cu userul.
   Specificitate: `.live-projector .sc--focus .x` (0,3,0) bate `.bk-layout__current .sc--focus .x`
   de mai sus la egalitate, fiindcă vine după. */
/* ⚠️ Prima livrare (100 = „fără tavan", iar mărimile de mai jos cu `max()` = fără NICIUN plafon) a
   fost „dezastruoasă" pe ecran (userul, 2026-08-26): pe un panou de 1900px numele ieșeau la 160px,
   scorul la 190px — nimic nu mai încăpea pe ÎNĂLȚIME. Lățimea nu e constrângerea unui ecran 16:9,
   înălțimea e. Soluția „între": UN SINGUR buton, `--scale-cap` = 2 (tavanul = dublul valorii de
   azi), iar mărimile de mai jos au și ele tavanul `azi × --scale-cap`, prin `clamp()`. Reglajul
   global = cifra de pe linia următoare; reglajul unui element = coeficientul lui `cqi`. */
.live-projector { --scale-cap: 2; }
.live-projector .sc--focus .sc__bar { font-size: clamp(var(--font-sm), 1.4cqi, calc(var(--font-sm) * var(--scale-cap, 1))); }
.live-projector .sc--focus .sc-jt__skv { font-size: clamp(var(--font-md), 1.7cqi, calc(var(--font-md) * var(--scale-cap, 1))); }
.live-projector .sc--focus .sc-jt__arrow,
.live-projector .sc--focus .sc-jt__net,
.live-projector .sc--focus .sc-round__pts { font-size: clamp(var(--font-lg), 2cqi, calc(var(--font-lg) * var(--scale-cap, 1))); }
.live-projector .sc--focus .sc-round__hd { font-size: clamp(var(--font-sm), 1.8cqi, calc(var(--font-sm) * var(--scale-cap, 1))); }
.live-projector .sc--focus .sc-totals__v { font-size: clamp(var(--font-5xl), 5cqi, calc(var(--font-5xl) * var(--scale-cap, 1))); }
.live-projector .sc--focus .sc-totals__max { font-size: clamp(var(--font-md), 1.8cqi, calc(var(--font-md) * var(--scale-cap, 1))); }
.live-projector .sc--focus .sc-totals__lbl { font-size: clamp(var(--font-sm), 1.6cqi, calc(var(--font-sm) * var(--scale-cap, 1))); }
.live-projector .bk-champion__label { font-size: clamp(var(--font-xs), 1.4cqi, calc(var(--font-xs) * var(--scale-cap, 1))); }
.live-projector .bk-champion__name { font-size: clamp(var(--font-xl), 4cqi, calc(var(--font-xl) * var(--scale-cap, 1))); }
.live-projector .podium__medal { font-size: clamp(var(--font-lg), 2.6cqi, calc(var(--font-lg) * var(--scale-cap, 1))); }
.live-projector .podium__nm { font-size: clamp(var(--font-sm), 2.2cqi, calc(var(--font-sm) * var(--scale-cap, 1))); }

/* Progresul de dinainte de reveal (fostul `.sc-prog`, căsuțe pe rundă) trăiește acum în grila
   jurat × rundă (`.sc-jg`, pastile `is-down`) — vezi secțiunea B115 de mai sus. */

/* Carduri battle terminate = expandabile + acordeon scorecards */
.bk-battle--expandable { cursor: pointer; }
/* ── „La ce battle mă uit în scoreboard?" (iter. 2o, cererea userului) ──
   Marcajul NU are nevoie nici de JS, nici de o clasă nouă din server: cardul din bracket ESTE
   declanșatorul de collapse al panoului, deci `aria-expanded="true"` e prin construcție exact
   battle-ul afișat — și la randarea de server (`curId` din `currentScorecard`), și după ce omul
   deschide alt scorecard (Bootstrap comută atributul), și după morph (scorecard-slot.js îl
   resincronizează). Un flag paralel s-ar fi putut desincroniza; ăsta nu poate.
   CONTUR, nu umplere: `.bk-battle--active` (IN_PROGRESS) folosește deja umplerea volt, iar cele
   două stări se suprapun de obicei — UN NIVEL = UN MECANISM (UI_RULES).
   ⚠️ `z-index` nu e cosmetic: `outline` pictează ÎN AFARA cutiei, iar cardurile următoare din DOM
   (z-index: 2) l-ar tăia — capcana de ordine de pictare deja plătită pe scara juratului. */
.bk-battle--expandable[aria-expanded="true"] {
    outline: 2px solid var(--text);
    outline-offset: 2px;
    z-index: 3;
}
/* Indiciu „apasă pt scorecard": chevron mic în COLȚ, absolut → fără div/spațiu extra sub card.
   Estompat, se aprinde la hover/expand. A URCAT în colțul de sus-interior (iter. 2o): jos e acum
   locul etichetelor RETRAS / W.O., iar `left: 1px` fix era „exterior" doar pe aripa stângă — pe
   dreapta cădea tocmai în colțul dinspre centru. Acum e simetric, ca toate celelalte marcaje. */
.bk-battle__more {
    position: absolute; top: 0; right: 1px;   /* colț INTERIOR (numele se aliniază spre centru) */
    color: var(--sm-text-mid); font-size: clamp(var(--font-4xs), calc(var(--bk-u, 12rem) * .05), var(--font-3xs)); line-height: 1;
    opacity: 1; pointer-events: none;
    transition: opacity .12s, color .12s;
}
.bk-half--right .bk-battle__more { right: auto; left: 1px; }
.bk-battle__more i { transition: transform .12s; }
/* `color: var(--text)` a fost ȘTERS din ambele la B159 L10 (F2): skinul dădea chevronului
   `--sm-text-mid` în TOATE stările, iar regulile astea (0,3,0) i-ar fi luat locul după fold.
   Ce rămâne — `opacity: 1` — chiar face ceva: scoate chevronul din starea lui estompată. */
.bk-battle--expandable:hover .bk-battle__more { opacity: 1; }
.bk-battle--expandable[aria-expanded="true"] .bk-battle__more { opacity: 1; }
.bk-battle--expandable[aria-expanded="true"] .bk-battle__more i { transform: rotate(180deg); }

/* Slot principal scorecard (în panoul din dreapta): un singur scorecard vizibil odată — battle-ul
   curent implicit, sau cel pe care s-a dat click în bracket. Restul rămân collapse (ascunse). */
.bk-sc-slot { display: flex; flex-direction: column; }
.bk-sc-slot__item .sc { margin-bottom: 0; }

/* Finala = accent (centrul convergenței) */
/* ⛔ ȘTEARSĂ la B159 L10 (F2): `.bk-col--final .bk-battle { box-shadow: var(--shadow-hard-sm) }`.
   Era (0,2,0) și bătea `.bk-battle`, dar skinul o acoperea prin LAYER, deci cardul finalei avea de
   mult umbra de card ca toate celelalte. La coborârea skinului s-ar fi trezit — și `--shadow-hard-sm`
   nici nu mai există în paleta de azi, deci ar fi ieșit `none`. Prinsă de sondă pe proiector. */
/* ⚠️ `:not(--active)` NU e cosmetic — fără el eticheta finalei devenea ILIZIBILĂ pe dark (raportat
   2026-08-21, în timpul unei finale reale). Mecanica: selectorul ăsta are specificitate (0,2,0) și
   bate `.bk-col-label--active` (0,1,0), dar suprascrie DOAR `color` — fundalul plin `--volt` rămâne
   de la starea activă. Rezultă o pereche pe care n-a proiectat-o nimeni: text `--primary-strong` pe
   fundal `--volt`. În light+kf e olive #506600 pe lime #ccff00 (~5.9:1, se citește); în dark+kf
   `--kf-primary-solid` urcă la lime-dim #abd600 → LIME PE LIME, ~1.3:1, invizibil.
   Regula generală de reținut: o decorație de COMPONENTĂ nu are voie să bată o STARE care aduce
   fundal propriu — starea vine cu perechea ei fundal+text, decorația rupe doar jumătate din ea.
   Accentul finalei rămâne exact cum era pe coloana inactivă și pe cea terminată. */
.bk-col--final .bk-col-label:not(.bk-col-label--active) { color: var(--sm-text-hi); border-bottom-color: var(--sm-text-hi); }



/* === 10c. CATEGORY SHOW ==================================== */

.cat-panel-hdr {
    display: flex; align-items: center; justify-content: space-between;
    padding: .32rem .65rem;
    background: var(--paper-2);
    border-top: 2px solid var(--border-strong);
    border-bottom: 1px solid var(--border-hair);
    font-family: var(--font-display);
    font-size: var(--font-xs); font-weight: var(--type-label-weight, 900); text-transform: var(--type-label-case, uppercase);
    color: var(--fg1); margin-bottom: .35rem;
}
.cat-panel-hdr--active { border-left: 3px solid var(--volt-ink); background: var(--volt); color: var(--volt-ink); }
.cat-panel-hdr--done   { border-left: 3px solid var(--success); background: var(--success-soft); color: var(--success); }
.cat-panel-hdr--info   { border-left: 3px solid var(--status-closed-fg); }

.config-pill {
    display: inline-flex; align-items: center; gap: 4px;
    background: var(--card); border: 1px solid var(--border-hair); border-radius: var(--radius-sm);
    padding: .15rem .5rem; font-size: var(--font-xs); color: var(--fg2);
}
.config-pill__val { font-family: var(--font-mono); font-weight: 700; color: var(--fg1); }

/* Tabs categorie (Calificare | Bracket/Smoke). Familia/mărimea/tracking-ul vin din rolul de
   ETICHETĂ (components.css § 18b); aici rămân doar spațierea și culoarea.
   `background` + `border-color` pe `.active` au fost șterse: skinul kf le rescrie oricum (tab plat cu
   underline), deci erau declarații moarte care doar făceau diagnosticul mai greu. */
.cat-tabs .nav-link { padding: .3rem .75rem; color: var(--sm-text-mid); }
.cat-tabs .nav-link.active { font-weight: 700; color: var(--sm-text-hi); border-bottom-color: var(--sm-paper); }

/* Linia taburilor = taburi + acțiunile de categorie (iter. 2k): taburile la stânga, butoanele la
   dreapta, pică pe rând nou PROGRESIV (flex-wrap + gap fluid — regula aranjamentului fluid). */
.cat-tabs-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .35rem clamp(.5rem, 2vw, 1rem); }
.cat-tabs-row .cat-tabs { flex: 1 1 auto; min-width: 0; }
/* Gap MARE între grupuri (iter. 2n): `flex-wrap` umple lacom și rupe unde apucă, deci wrapul trebuie
   să cadă ÎNTRE grupuri, nu prin mijlocul unuia (UI_RULES „Wrapul se face între grupuri"). */
.tab-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .3rem clamp(.5rem, 2.5vw, 1rem); }
/* …și gap MIC în grup: butoanele care se folosesc împreună stau lipite și se citesc ca un cluster.
   `wrap`, nu `nowrap`: asimetria de gap e destulă ca ruptura să cadă între grupuri la orice lățime
   realistă, iar la 320px cu o etichetă lungă de fază preferăm o rupere în grup decât o pagină care
   se trage lateral (containerele n-au voie să înghită depășirea). */
.tab-actions__grp { display: flex; flex-wrap: wrap; align-items: center; gap: .2rem; }
/* Butoanele de pe linie stau O TREAPTĂ sub btn-xs (cererea userului: pe mobil ocupau prea mult
   când picau pe rânduri) — doar aici, restul btn-xs din produs rămâne cum e. */
.tab-actions .btn-xs { font-size: var(--font-2xs); padding: .12rem .38rem; }
/* Subiectul grupului ACUM: pe CE battle apasă butoanele. Doar faza — starea (LIVE/urmează) stă pe
   banda scorecardului, unde e adevărată. Accentul e UMPLERE, nu linie (memoria accent-token-fill). */
.tab-now {
    display: inline-flex; align-items: center; gap: .25rem;
    padding: .1rem .4rem; border-radius: var(--radius-sm);
    background: var(--volt);
    font-weight: 900;
    font-size: var(--font-2xs); text-transform: uppercase; letter-spacing: .06em;
    white-space: nowrap;
}


/* ── Tabul Calificare: containerul de măsurare (iter. 2o, ADR 0040) ──
   TOT ce e pe tab se dimensionează din LĂȚIMEA TABULUI, nu din ecran. Regulile de aici au fost
   scrise cândva pentru un `@media`, dar secțiunea trăia într-un `.col-md-6`: de la 768px în sus
   înghesuia 4 carduri în JUMĂTATE de ecran, adică exact anti-pattern-ul de care `.qual-2col`
   fusese deja scăpat (vezi comentariul ei mai jos). */
.qual-tab { container-type: inline-size; }
.qual-groups { min-width: 0; }

/* Grid de grupe calificare — se RĂREȘTE CÂTE UNA pe măsură ce se îngustează (cerința userului),
   până la 2 pe rând, fără niciun prag: `auto-fit` + `minmax` fac exact asta, singure.
   --bgc-min = podeaua unui card; la 360px lățime utilă intră FIX două, iar de acolo în sus grila
   adaugă câte o coloană când chiar încape încă una. `min(100%, …)` ține grila validă și când
   containerul e mai îngust decât podeaua (o singură coloană, nu overflow). */
.bouts-groups-grid {
    /* Podeaua CREȘTE cu tabul: pe un proiector lat cardurile trebuie să fie MARI (se citesc din
       fundul sălii), nu multe și mici. Cu o podea fixă, 16 grupe ar fi umplut 1500px cu 9 coloane
       de 160px. Așa, de pe la ~700px în sus grila se așază pe 4 coloane care cresc cu ecranul, iar
       în jos cade 4 → 3 → 2, câte una. */
    --bgc-min: clamp(9.5rem, 22cqi, 22rem);
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--bgc-min)), 1fr));
    gap: clamp(3px, .5cqi, 7px);
    margin-top: .35rem;
}

/* Card grupă — background se umple orizontal pe măsură ce votează jurații (--fill dinamic).
   CARDUL e containerul de măsurare pentru tot ce scrie în el (iter. 2o): tipografia lui nu are
   voie să depindă de ecran, fiindcă același card are 152px pe telefon și ~370px pe proiector.
   ⚠️ `cqi` NU se rezolvă pe elementul care DECLARĂ containerul — de aceea mărimile fluide stau pe
   COPII (.bgc__hdr / .bgc__row), nu aici. `font-size` de mai jos rămâne baza moștenită. */
.bgc {
    position: relative;
    container-type: inline-size;
    border: 1px solid var(--sm-card-edge);
    border-radius: var(--radius-sm);
    background: var(--sm-card-surface);
    overflow: hidden;
    font-size: var(--font-base);
}
.bgc::before {
    content: ""; position: absolute; inset: 0;
    width: var(--fill, 0%);
    background: color-mix(in srgb, var(--sm-text-hi) 6%, transparent);
    transition: none;
    z-index: 0; pointer-events: none;
}
.bgc--done::before { width: 100%; background: transparent; }
/* Grupa IN DESFASURARE isi arata progresul cu tenta live; cea TERMINATA nu mai are ce arata, deci
   bara ei ramane transparenta. Coborata din `@layer skin` la B159 L10 (F2). */
.bgc--active::before { background: color-mix(in srgb, var(--sm-live) 10%, transparent); }
.bgc--done   { border-color: var(--sm-card-edge); background: var(--sm-card-surface); }
/* Grupa ACTIVĂ stă pe fundal de CARD, nu pe volt plin (iter. 2c): volt-ul plin acoperea exact
   fill-ul de progres (volt 38% peste volt = invizibil) și, pe tema închisă, făcea invizibil tot
   ce moștenea culoarea textului (creionul de corecții). Activarea se citește din ramă + umbra
   hard-offset (limbajul brandului) + punctul LIVE + fill-ul care crește cu voturile. */
.bgc--active { border-color: var(--sm-live-mark); background: var(--sm-s1); box-shadow: none; }

.bgc__hdr {
    position: relative; z-index: 1;
    display: flex; align-items: center; justify-content: space-between; gap: 4px;
    font-size: clamp(var(--font-2xs), 6.5cqi, var(--font-2xl)); font-weight: 800;
    text-transform: var(--type-label-case, uppercase); letter-spacing: var(--type-label-tracking, .08em);
    padding: clamp(.1rem, 1.2cqi, .4rem) clamp(.15rem, 1.6cqi, .5rem);
    background: var(--sm-s2);
    border-bottom: 1px solid var(--sm-edge);
    color: var(--sm-text-hi);
}
.bgc--done .bgc__hdr   { color: var(--sm-text-hi); background: var(--sm-sage-fill); border-color: var(--sm-edge); }
/* Pe fundal de card, antetul activ folosește culoarea de TEXT a temei (volt-ink era „text pe
   volt" — pe card, în dark, ar fi negru pe închis). Tenta volt rămâne în fundalul antetului. */
.bgc--active .bgc__hdr { color: var(--sm-text-hi); background: var(--sm-live-tint); border-color: var(--sm-live-mark); }
.bgc__ord { white-space: nowrap; }
.bgc__state { display: inline-flex; align-items: center; gap: 3px; font-size: clamp(var(--font-3xs), 5cqi, var(--font-lg)); opacity: .85; }
.bgc--pending { opacity: 1; }
.bgc--pending .bgc__state { color: var(--sm-text-mid); opacity: 1; }
/* „GATA" al grupei terminate ia cerneala de accent, fara opacitate: e un verdict, nu nota de subsol.
   B159 L10 (F2). */
.bgc--done .bgc__state { color: var(--sm-accent-text); opacity: 1; }
/* Rundă de departajare (tie-break) — accent golden ca să iasă din grupele normale (B24).
   După regulile de stare → câștigă pe antet chiar și când e „done". */
.bgc--golden { border-color: var(--sm-warning); opacity: 1; }
.bgc--golden .bgc__hdr { color: var(--sm-on-warning-soft); background: var(--sm-warning-soft); border-color: var(--sm-warning); }
/* Punctele de RUNDĂ din antetul grupei (B163) — atâtea câte runde are boutul, pline cât s-au încheiat.
   Apar DOAR la mai multe runde (Twig decide); la o rundă n-ar spune nimic. Sunt decor: starea în cuvinte
   stă în `title`-ul cardului, de aceea markupul e `aria-hidden`. Mărimea urmează containerul (`cqi`), ca
   restul antetului, deci nu adaugă un rând nou nici pe proiector. ⚠️ „Rundă" aici = rundă PLANIFICATĂ a
   boutului (`roundsPlanned`), NU runda de departajare (`.bgc--golden`, tie-break). */
.bgc__rounds { display: inline-flex; align-items: center; gap: clamp(2px, .8cqi, 4px); flex: 0 0 auto; }
.bgc__rd {
    width: clamp(5px, 1.8cqi, 9px); aspect-ratio: 1; border-radius: 50%;
    border: 1px solid var(--sm-line); opacity: .55;
color: var(--sm-text-mid); }
.bgc__rd--done { background: currentColor; opacity: 1; color: var(--sm-text-hi); }

.bgc__live-dot {
    width: clamp(5px, 2cqi, 10px); height: clamp(5px, 2cqi, 10px); border-radius: 50%;
    /* Culoarea punctului LIVE (`--sm-live-mark`) a coborât în regula asta la B159 L10: umplerea e
       scrisă mai jos, în aceeași regulă, nu moștenită de undeva. */
    display: inline-block;
    border: 1px solid var(--sm-live-mark);
    animation: bgc-pulse 1.2s ease-in-out 3;
background: var(--sm-live-mark); }
@keyframes bgc-pulse { 0%,100% { opacity: 1; transform: scale(1); } 50% { opacity: .35; transform: scale(.7); } }

/* Numele concurenților = ce se citește de la distanță, deci ele iau treapta cea mai mare din card.
   Padding-ul scade odată cu fontul: pe telefon aerul costă rânduri, pe proiector nu deranjează. */
.bgc__row {
    position: relative; z-index: 1;
    display: flex; align-items: center; gap: clamp(3px, 1cqi, 7px);
    font-size: clamp(var(--font-2xs), 7.5cqi, var(--font-2xl));
    padding: clamp(.1rem, 1.4cqi, .45rem) clamp(.15rem, 1.6cqi, .5rem);
    border-bottom: 1px solid var(--border-hair);
    min-width: 0;
}
.bgc__row:last-child { border-bottom: none; }

.bgc__dot {
    width: clamp(5px, 2cqi, 10px); height: clamp(5px, 2cqi, 10px); border-radius: 50%;
    flex-shrink: 0;
    background: var(--border-hair);
}
.bgc__dot--done   { background: var(--success); }
/* Celelalte doua puncte de stare, coborate din `@layer skin` la B159 L10 (F2). */
.bgc__dot--pending { background: var(--sm-line); }
.bgc__dot--active  { background: var(--sm-live-mark); }

.bgc__name {
    flex: 1; min-width: 0;
    overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
    color: var(--sm-text-hi); font-weight: 600;
    line-height: 1.3;
}
.bgc--done .bgc__name   { color: var(--sm-text-hi); }
.bgc--active .bgc__name { color: var(--sm-text-hi); }
.bgc--pending .bgc__name { color: var(--sm-text-mid); }
.bgc__crew { color: var(--fg3); font-weight: 400; }

/* Listă calificați — 2 coloane jumate/jumate (stivuite pe mobil) + iconiță metodă */
/* Despicarea în două coloane e dictată de CONTAINER, nu de ecran. Avea `@media (min-width: 768px)`,
   dar panoul stă într-un `.col-md-6`, deci exact de la 768px în sus are jumătate din lățimea pe care
   o măsura media query-ul: două tabele de 4 coloane într-o jumătate de ecran → rândurile ieșeau
   afară (raportat: „pe ecran mic se adaptează, pe intermediare iese"). `auto-fit` + `minmax` rupe
   coloana a doua abia când chiar încape, progresiv, fără prag.
   `min(100%, …)` în minmax = supapa obligatorie: fără ea, sub 20rem pista rămâne mai lată decât
   containerul și overflow-ul revine, doar mai jos.
   `min-width: 0` pe copii fiindcă itemii de grid au implicit `min-width: auto` — adică nu pot coborî
   sub min-content-ul tabelului, deci pistele `1fr` nu se strâng deloc. */
/* Accentul cerut (2026-08-21): lista calificaților e ce așteaptă sala, deci BLOCUL se vede ca unitate.
   ⚠️ Accentul e pe TOȚI calificații deopotrivă — locurile 1/2/3 NU se medaliază aici (decizia
   userului): calificarea nu e podium, iar locul 1 e adesea doar invitatul cu seed direct. */
/* Din iter. 2o rezultatul stă DEASUPRA grupelor, în DOUĂ BLOCURI SUPRAPUSE, fiecare pe toată
   lățimea: calificații întâi, necalificații pe rândul următor. Fiecare listă e despicată în două
   coloane (`.qual-2col`) ca să nu se întindă ca un rând lung și subțire pe un ecran lat.
   Simetria e intenționată — același antet, aceleași patru coloane — fiindcă asta se compară: cine a
   trecut linia și cine nu. Ce le DEOSEBEȘTE e o singură lucru, tenta (vezi `--in` mai jos). */
.qual-block + .qual-block { margin-top: .6rem; }
.qual-2col {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr)); gap: .5rem;
    padding: .4rem; background: var(--sm-card-surface); border: 1px solid var(--sm-card-edge);
border-radius: var(--sm-r-row); }
/* TENTA VERDE e a calificaților și NUMAI a lor (cerința userului, iter. 2o). Nu e decor: pe fundal
   verde, rândurile impare opace (`.kf-catrow--odd`) produc zebra verde/deschis care se citește din
   sală ca „ăștia au trecut"; necalificații stau pe `--card`, deci aceeași zebră iese neutră.
   Tenta stă pe CONTAINER, nu pe rânduri — altfel ar ieși dungată peste `.kf-catrow--odd`. */
.qual-2col--in { background: var(--sm-s1); border-bottom-left-radius: 0; border-top-left-radius: 0; box-shadow: inset 4px 0 0 var(--sm-accent-mark); }

/* ---- RANDUL DE CATEGORIE din tabelul de calificare (mutat din kf-skin.css, B159 L10) ----
   Clasa e scrisa in template (`_qualification_section.html.twig`), iar regulile ei existau DOAR in
   kf — stergerea fisierului le-ar fi luat cu totul. Tokenii kf sunt inlocuiti de echivalentii globali
   (tabel de echivalente extras din blocul de remap: `--kf-surface-bright` == `--card`,
   `--kf-surface-2` == `--surface-2`, `--kf-text` == `--text`, `--kf-marker` == `--accent`).
   Dunga de la hover citeste rolul `hover-strip`, cu valoarea de azi ca fallback. */
.kf-catrow td { transition: background .1s; }
.kf-catrow--odd td { background: color-mix(in srgb, var(--sm-text-hi) 4%, transparent); }
.kf-catrow:hover td { background: var(--surface-2); color: var(--text); }
.kf-catrow:hover td:first-child { box-shadow: var(--shadow-hover-strip, inset 4px 0 0 var(--accent)); }
.qual-2col > * { min-width: 0; }
/* COLOANA e containerul de măsurare: numele se citesc de la distanță, deci mărimea lor trebuie să
   urmeze lățimea coloanei (~20rem pe telefon, ~45rem pe proiector), nu lățimea ecranului.
   ⚠️ ca la `.bgc`: `cqi` se rezolvă pe COPII, nu pe elementul care declară containerul. */
.qual-col { container-type: inline-size; min-width: 0; }
.qual-col .pub-cat-table { font-size: clamp(var(--font-sm), 3.6cqi, var(--font-3xl)); }
.qual-col .tbl-th        { font-size: clamp(var(--font-3xs), 2.2cqi, var(--font-md)); padding: clamp(.1rem, .8cqi, .3rem) clamp(.2rem, 1.4cqi, .6rem); }
.qual-col .stat-value    { font-size: clamp(var(--font-2xs), 3cqi, var(--font-2xl)); }
/* Podelele stau pe COLOANĂ, nu pe tabel (UI_RULES „Tabel dens"): cele trei coloane înguste își țin
   lățimea de citire, iar coloana de nume ia tot restul și e singura care se rupe. Fluide, ca să
   crească odată cu litera — o coloană de rang de 2rem sub o cifră de 24px ar tăia cifra. */
.qual-2col .col-rank-narrow { width: clamp(1.8rem, 7cqi, 4rem); }
.qual-2col .qual-name-cell { min-width: clamp(4rem, 26cqi, 12rem); }
.qual-method { font-size: clamp(var(--font-3xs), 2.6cqi, var(--font-lg)); margin-left: .3rem; vertical-align: middle; }
/* Celula nume = flex → marcajul ⚖ (departajare) împins la dreapta, aliniat în coloană */
.qual-name-cell { display: flex; align-items: center; gap: .25rem; min-width: 0; flex-wrap: wrap; }
/* Numele lung se RUPE, nu se taie: `text-overflow: ellipsis` ascundea tăcut coada numelui, iar la
   calificați numele E informația. Rupere pe cuvinte întâi (`break-word`); `anywhere` ar cobora
   min-content-ul până la o literă, iar podeaua de mai sus n-ar mai însemna nimic. */
.qual-name-cell .e-chip { min-width: 0; overflow-wrap: break-word; background: transparent; }
.qual-name-cell .qual-method { margin-left: auto; flex-shrink: 0; }
.qual-method--tie_break { color: var(--primary); }
/* Invitat = calificat direct (fără scor/voturi) — marcaj ★ pe rândul din tabelul de calificați */
.qual-method--invited { color: var(--primary); }
/* Rezervă intrată pe locul unui retras (ADR 0042) — marcaj ⇧. Ton NEUTRU, nu accent: a intrat
   pentru că s-a eliberat un loc, nu pentru o performanță în plus. Aceeași logică ca badge-ul de
   retras, care e tot neutru („retragerea e informație, nu accent"). */
.qual-method--reserve { color: var(--fg3); }
/* Perechea de înlocuire („înlocuit de X" pe retras, „în locul lui X" pe înlocuitor). Micro-etichetă,
   în ton cu `.e-chip__out`: e adnotare de istorie, nu verdict. `nowrap` fiindcă eticheta și numele
   sunt o singură unitate de citire — rupte pe două rânduri n-ar mai însemna nimic.
   Până pe 2026-08-30 era o săgeată goală („→ X"), scoasă la raportul ownerului: nu spunea ce s-a
   întâmplat și cele două direcții se confundau între ele. Textul poartă acum înțelesul, deci NU mai
   are nevoie de tooltip sau legendă — regula „denumiri care se citesc singure".
   ⚠️ DOAR în listele de calificare. În bracket a fost scoasă (cerința userului, 2026-08-28): acolo
   cardul se dimensionează din container (ADR 0040), iar un nume de lungime arbitrară îi mănâncă
   bugetul de lățime — cel care ține un Top-32 pe telefon. */
.qual-swap {
    font-size: var(--font-2xs); font-weight: 600; color: var(--fg3);
    white-space: nowrap; letter-spacing: .02em; font-style: italic;
}
/* Cel care a PIERDUT locul se stinge mai tare decât cel care l-a primit: rândul lui e istorie, nu
   competiție. Aceeași ierarhie ca între `.e-chip__out` și un rând activ. */
.qual-swap--out { opacity: 1; font-weight: 400; color: var(--sm-text-mid); }
/* Voturile juriului (decidentul PRIMAR) — coloană proeminentă X/Y; plin (toți jurații) = verde */
.qual-votes {
    display: inline-block; min-width: clamp(2rem, 9cqi, 4.5rem); text-align: center;
    font-family: var(--font-mono); font-size: clamp(var(--font-3xs), 2.6cqi, var(--font-lg)); font-weight: 700;
    color: var(--sm-text-mid); background: transparent;
    border: 1px solid var(--sm-edge); border-radius: var(--sm-r-pill); padding: 0 .3rem;
}
.qual-votes--full { color: var(--sm-accent-text); border-color: var(--sm-accent-mark); background: transparent; }
.qual-legend { font-size: var(--font-2xs); color: var(--sm-text-mid); margin: .4rem .15rem 0; line-height: 1.45; }
/* `.qual-cutline` (linia punctată „Necalificați", divider între calificați și eliminați) a fost
   ȘTEARSĂ în iter. 2o: necalificații nu mai vin ca a treia listă dedesubt, ci ca A DOUA COLOANĂ, cu
   antetul ei `.cat-panel-hdr` — același vocabular ca restul tabului. Un divider n-are ce despărți
   între două coloane alăturate, iar o regulă rămasă fără consumatori e junk care minte. */
/* `opacity: .72` pe tot tabelul a fost SCOASĂ în iter. 2o: cât timp necalificații erau o anexă sub
   linia punctată, estomparea îi ținea secundari — dar acum sunt un bloc propriu, cu antet și cu
   aceeași zebră ca restul, iar opacitatea spăla exact zebra pe care userul a cerut-o „normală"
   (și, pe deasupra, contrazicea cererea de text mare, citibil din sală).
   Semnalul „ăștia n-au trecut" rămâne, dar unde trebuie: pe TEXT (culoare estompată), nu pe toată
   suprafața — plus absența tentei verzi, care e adevăratul purtător al distincției. */
.qual-row--out td { color: var(--text-muted); }


/* ── VOTUL PUBLICULUI (ADR 0030 am.2) — CTA-ul stă LÂNGĂ numele concurentului, în capul „VS" al
   panoului curent, nu într-o cutie separată care repetă numele. Counts NU apar aici
   (anti-bandwagon) — cifrele trăiesc pe scorecard la reveal (.sc-av mai jos). ── */
/* RÂNDUL de vot: aceleași 3 coloane ca „VS" de deasupra, deci fiecare buton stă sub numele lui.
   Sub nume, NU în celula numelui (încercat, raportat 2026-08-15): acolo fura din lățimea numelui pe
   ecran mic, iar cele două laturi își distribuiau liniile independent → butoanele ieșeau decalate
   pe verticală. Într-un rând propriu sunt pe aceeași linie prin construcție. */
.sc__vote {
    /* `padding: 0` (B158, cererea ownerului: „prea departe de toate, recuperăm spațiu"). */
    display: grid; grid-template-columns: 1fr var(--sc-mid) 1fr; align-items: center;
    padding: 0; border-bottom: 1px solid var(--border-hair);
    /* Continuă suprafața capului, ca numele și butoanele să rămână UN bloc (cerere 2026-08-15). */
    background: var(--side-surface);
}
/* Coloanele 1 și 3 (a 2-a rămâne goală), fiecare buton CENTRAT pe coloana lui. NOTĂ 2026-09-01:
   numele de deasupra NU mai e centrat (stă spre marginea exterioară, `.sc-hd__c--1/2`), deci butonul
   nu mai cade sub centrul lui — cade sub centrul COLOANEI. Coloanele sunt însă aceleași ca ale
   capului (`--sc-mid`), deci canalul dintre jumătăți se continuă drept. Textul de mai jos —
   adică exact sub numele de deasupra, care e și el centrat. Containerul se randează și gol după
   vot: rezervă spațiul, nimic nu sare. */
.avc { display: flex; align-items: center; justify-content: center; min-height: 44px; }
/* B158: butonul e VIZUAL mai mic (36px, cererea ownerului), dar ținta de tap rămâne 44px — `::after`
   întinde zona apăsabilă 4px sus și jos (UI_RULES „Ținte touch": acțiunea principală = 44px). Rândul
   păstrează 44px ca rezervare, deci nimic nu sare după vot. */
.avc:first-child { grid-column: 1; }
.avc:last-child { grid-column: 3; }
.avc__btn {
    /* Corp de literă PROPRIU: numele de lângă poate urca până la --font-7xl pe panoul mare, iar
       moștenirea ar face din buton un panou. */
    display: inline-flex; align-items: center; gap: .35rem;
    position: relative;
    min-height: 36px; padding: .3rem .7rem;       /* ținta de tap: vezi `::after` */
    font-family: var(--font-display); font-weight: var(--type-control-weight, 900); text-transform: var(--type-control-case, uppercase);
    font-size: var(--font-sm); letter-spacing: var(--type-control-tracking, .04em); line-height: 1; white-space: nowrap;
    /* CTA NEUTRU: lime-ul e al rezultatului, nu al invitatiei de a vota. B159 L10 (F2). */
    border: 2px solid transparent; border-radius: var(--sm-r-pill);
    background: var(--sm-text-hi); color: var(--sm-bg); cursor: pointer;
    box-shadow: var(--shadow-hard-sm);
}
/* `inset` se măsoară de la PADDING box: butonul de 36px are border 2px, deci -4px dădea 40px (măsurat).
   -6px sus/jos = 44px; -2px lateral acoperă borderul. Rămâne în interiorul `.avc` (44px), fără suprapuneri. */
.avc__btn--vote::after { content: ""; position: absolute; inset: -6px -2px; }
.avc__btn--vote:hover { background: var(--sm-text-mid); color: var(--sm-bg); }
/* După vot: confirmarea rămâne pe latura ALEASĂ. PĂSTREAZĂ umplerea lime — varianta „plată"
   (transparent + --volt-ink) punea cerneală ÎNCHISĂ pe suprafața închisă a panoului și dispărea
   (feedback 2026-08-15). `--volt-ink` are contrast garantat DOAR pe `--volt`, perechea lui.
   Se schimbă doar afordanța: fără cursor de apăsat, fără umbră, fără hover. */
/* „Ai votat" = doar bifa + textul, fara cutie (cererea ownerului). Pe suprafata laturii, cerneala
   tare tine 15:1 in ambele teme. B159 L10 (F2). */
.avc__btn--voted { cursor: default; box-shadow: none;
    background: transparent; border-color: transparent; color: var(--sm-text-hi);
    padding-inline: 0; font-weight: 600; }

/* ── Rezultatul votului pe scorecard — RÂND PROPRIU, DEASUPRA rezumatului, pe ACELEAȘI 3 coloane ca
   `.sc-totals` → cifra fiecărei laturi cade exact peste numele ei din capul `.sc-hd` (simetric, deci
   spinarea lui cade pe centrul coloanei din mijloc). Tavanul coloanei din mijloc = `--scale-cap`
   (era 8.5rem fix → pe sală se decala față de restul; B115).
   Suprafață NEUTRĂ + o muchie de accent (nu bandă lime plină, feedback 2026-08-15: striga mai tare
   decât verdictul juriului). Identitatea vine din muchie + etichetă, nu din fundal. */
.sc-av {
    display: grid; grid-template-columns: var(--sc-cols); align-items: center;
    background: var(--audience-bg); color: var(--audience-fg);
    border-top: 1px solid var(--border-hair);
    box-shadow: inset 0 3px 0 0 var(--audience-edge);
}
.sc-av__v { padding: .4rem .5rem .3rem; text-align: center; font-family: var(--font-display); font-weight: var(--type-number-weight, 900); line-height: 1; }
/* Cifra e MARE — se citește din sală, de la aceeași distanță ca scorul juriului de sub ea. */
/* Latura care a pierdut votul e ESTOMPATA, nu taiata (B159 L10, F2). */
.sc-av__v:not(.is-win) { color: var(--sm-text-mid); font-weight: 500; }
.sc-av__v b { font-size: var(--font-4xl); }
.sc-av__v.is-win b { text-decoration: underline; text-underline-offset: .18em; text-decoration-thickness: .09em; }
.sc-av__mid {
    display: flex; align-items: center; justify-content: center; gap: .3rem; padding: .3rem .4rem;
    font-family: var(--font-display); font-weight: 600; text-transform: var(--type-status-case, uppercase);
    letter-spacing: var(--type-status-tracking, .06em); font-size: var(--font-xs); text-align: center; color: var(--audience-lbl);
}
.sc--focus .sc-av__v b { font-size: var(--font-6xl); }
.sc--focus .sc-av__mid { font-size: var(--font-sm); }


  /* ---- Garda de MISCARE: punctele care pulseaza se opresc. Coborata din `@layer skin` la B159 L10
     (F2). Garda se imparte dupa unde traieste regula de baza a fiecarui punct: cele trei de aici,
     `.page-state__dot` in base-layout.css. ---- */
  @media (prefers-reduced-motion: reduce) {
    .sc__dot, .bgc__live-dot, .now-tag__dot { animation: none; }
  }

  /* ---- FORCED COLORS (High Contrast pe Windows). Toate marcajele de stare ale skinului sunt
     fundaluri / umbre / gradienturi, pe care modul le STERGE: castigatorul, verdictul, live-ul,
     rigla calificatilor ar fi disparut. Fallback verificat in emularea Chromium, ambele teme:
      · starile pe elemente CU TEXT = contur (Chromium picteaza un backplate Canvas sub text, deci o
        umplere Highlight ascunde textul);
      · `border-color: transparent` NU se pastreaza (devine CanvasText) -> `Canvas`;
      · culorile de sistem se pastreaza fara `forced-color-adjust: none`.
     Coborata din `@layer skin` la B159 L10 (F2). ---- */
  @media (forced-colors: active) {
    .bk-entry--winner,
    .sc-jg__no.is-winner,
    .sc-jg__lbl.is-winner { outline: 3px solid Highlight; outline-offset: -3px; }
    :is(.sc-hd__nm, .sc-hd__sub, .sc-hd__adjg).is-win { border-inline-color: Highlight; }
    .sc-hd__n.is-win { text-decoration: underline; text-decoration-thickness: .08em; text-underline-offset: .12em; }
    .sc-jg__pill.is-winner { background: Highlight; border-color: Highlight; }
    .sc-jg__pill.is-down.is-on { background: CanvasText; border-color: CanvasText; }
    .bk-battle--active,
    .bk-battle--golden { outline: 3px double CanvasText; outline-offset: 2px; }
    .bgc--active { outline: 3px double CanvasText; outline-offset: 1px; }
    .qual-2col--in { border-inline-start: 4px solid Highlight; }
    .bgc__dot--done,
    .sc__dot { background: CanvasText; }
    .bgc__dot--active { background: Highlight; }
    .bgc__dot--pending { background: Canvas; outline: 1px solid CanvasText; outline-offset: -1px; }
    .cat-strip__item--on { outline: 3px solid Highlight; outline-offset: -3px; }
  }

  /* ---- Ultimele reguli coborate din `@layer skin` la B159 L10 (F2) ----
     Scopul pe proiector RAMANE (are un inteles: acolo geometria e alta); scopul pe skin dispare —
     foaia asta e incarcata doar de site. */
  /* Linia de baza a benzii de categorii: granita linistita, nu accent. Nu pe proiector, unde banda e
     ascunsa si ar ramane un ciot de 3px fara traseu. */
  body:not(.live-projector) .cat-tabs-row { border-inline-start: 3px solid var(--sm-paper); }
  /* Numele campionului: singura exceptie de MARIME din contractul DENSE (ADR 0054, Decizia 6), si
     doar in afara proiectorului, unde scara e deja dubla. */
  body:not(.live-projector) .bk-champion__name { font-size: var(--sm-fs-display); line-height: 1.15; }
  /* Pe PROIECTOR bracketul isi ia latimea din continut: numele in scriere normala l-au ingustat de la
     1313px la 994px (masurat). Pe sala raman in majuscule, ca geometria sa nu se miste. */
  body.live-projector .bk-entry__name { text-transform: uppercase; letter-spacing: .02em; }
} /* END @layer app */
