/* ============================================================
   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, kf-skin; pagina juratului: tokens, judge, base-layout.
   NU adauga/reordona <link>-uri fara audit de coliziuni (ADR 0023).
   kf-skin.css - re-skin Kinetic Flow: @layer base (scope body.kf) +
   @layer components (body.kf; exceptii globale: .style-pill).
   (:focus-visible global a fost mutat in base-layout.css.)
   ============================================================ */
@layer vendor, app, tokens, base, layout, components, utilities;

@layer base {
  /* Scop opt-in: paginile migrate primesc body class `kf` → look nou.
     NU atinge paginile legacy (care n-au clasa). */
  /* Fundalul html = ACELAȘI cu al body-ului kf — altfel sub conținutul scurt (și la overscroll)
     se vedea --paper (kf-surface), o nuanță diferită = „pată" sub ultimele div-uri. */
  html:has(> body.kf) { background: var(--kf-bg); }
  body.kf {
    background: var(--kf-bg);
    min-height: 100dvh;  /* body-ul acoperă viewportul chiar și cu conținut scurt */
    color: var(--kf-text);
    font-family: var(--kf-font);
    font-size: var(--kf-fs-body);
    line-height: 1.5;
  }
  body.kf .text-muted { color: var(--kf-text-variant) !important; }

}

/* ===== LAYOUT — composition primitives (scoped la body.kf) ===== */

/* ===== COMPONENTS — Kinetic Flow (scoped la body.kf, bate legacy) ===== */
@layer components {

  /* ---- Dance-style pill — hue din name|style_hue (SSOT: StyleColorExtension) ----
     Culoare distinctă + stabilă per nume stil, număr nelimitat. Single inline
     `--style-h` = excepția dinamică permisă (ca --w%/--fill%). NU e scoped kf →
     se aplică și pe paginile legacy (live/results/category show). */
  /* Scara de culoare a stilului de dans e declarată pe o LISTĂ de consumatori, nu copiată la fiecare:
     hue-ul vine din markup (`--style-h`), saturația/luminozitatea din temă. Al doilea consumator e
     banda de categorii, care desenează aceeași semnătură (muchia colorată) fără pastilă. */
  .style-pill, .cat-strip__item {
    --style-s: 70%; --style-l-bg: 90%; --style-l-fg: 30%; --style-l-accent: 45%;
  }
  .style-pill {
    display: inline-flex; align-items: center; gap: .25rem;
    padding: .12rem .5rem .12rem .42rem; border-radius: 999px;
    background: hsl(var(--style-h) var(--style-s) var(--style-l-bg));
    color: hsl(var(--style-h) var(--style-s) var(--style-l-fg));
    border: 1px solid hsl(var(--style-h) var(--style-s) var(--style-l-accent) / .55);
    border-left: 3px solid hsl(var(--style-h) var(--style-s) var(--style-l-accent));
    font-weight: 600; line-height: 1.25; white-space: nowrap;
  }
  [data-theme="dark"] .style-pill, [data-theme="dark"] .cat-strip__item {
    --style-s: 55%; --style-l-bg: 22%; --style-l-fg: 82%; --style-l-accent: 62%;
  }
  @media (prefers-color-scheme: dark) {
    :root:not([data-theme]) .style-pill,
    :root:not([data-theme]) .cat-strip__item {
      --style-s: 55%; --style-l-bg: 22%; --style-l-fg: 82%; --style-l-accent: 62%;
    }
  }

  /* ---- Page head → Archivo Black uppercase ---- */
  body.kf .page-head {
    font-family: var(--kf-font-display);
    font-weight: 900;
    font-size: var(--font-8xl);
    letter-spacing: .01em;
    text-transform: uppercase;
    color: var(--kf-text);
    line-height: .98;
    margin: 0;
  }

  /* ---- Folder tabs → segmented flat, divizor 1px subțire ---- */
  body.kf .folder-tabs {
    display: flex; flex-wrap: wrap; gap: 0;
    border: var(--kf-border); margin-bottom: var(--kf-5);
    background: var(--kf-surface-bright);
    padding: 0;
    border-radius: var(--kf-r-sm);
    width: fit-content;
    overflow: hidden;
  }
  body.kf .folder-tab {
    border: 0; border-right: 1px solid var(--kf-line); margin: 0;
    border-radius: 0;
    padding: .5rem 1.1rem;
    font-family: var(--kf-font-mono);
    /* .06em = tracking-ul rolului de ETICHETĂ (components.css § 18b). Mărimea rămâne `--font-sm`:
       un tab de PAGINĂ are voie să fie mai mare decât o etichetă de grup — rolul deține familia,
       cazul și tracking-ul, nu treapta. */
    font-weight: 700; font-size: var(--font-sm); text-transform: uppercase; letter-spacing: .06em;
    color: var(--kf-text-variant);
    background: transparent;
    display: inline-flex; align-items: center; gap: .4rem;
    transition: none;
  }
  body.kf .folder-tab:last-child { border-right: 0; }
  body.kf .folder-tab:hover { color: var(--kf-text); background: var(--kf-surface-2); }
  body.kf .folder-tab.active {
    background: var(--kf-primary);
    color: var(--kf-on-primary);
  }

  /* ---- Masonry gutter (coloane independente construite de masonry-columns.js) ----
     Gutterul stă pe GRILĂ, nu ca padding pe coloane: cu padding, jumătate de gutter se pierdea la
     fiecare margine EXTERIOARĂ a grilei (2×12px de lățime de card degeaba, exact unde e mai scump —
     pe ecrane mici). `gap` pune distanța doar ÎNTRE coloane. */
  body.kf .bcast-grid,
  body.kf .bcast-grid.is-masonry { gap: var(--kf-gutter); }
  body.kf .bcast-col { gap: var(--kf-gutter); }

  /* ---- Concurs card (FLAT, sharp, hairline subțire) ----
     FĂRĂ overflow:hidden (vezi .ccard din components.css): dropdown-ul de autocomplete trebuie
     să iasă din card; hero-ul de mai jos își face singur clip-ul. */
  body.kf .ccard {
    background: var(--kf-surface);
    border: var(--kf-border);
    border-radius: var(--kf-r-sm);
    display: flex; flex-direction: column;
    transition: border-color .1s;
  }
  /* hover flat: contur lime instant (fără lift, fără umbră) */
  body.kf .ccard:hover { border-color: var(--kf-primary-solid); }

  /* hero poster band + overlay — grayscale → color la hover (brutalist) */
  body.kf .ccard__hero {
    position: relative; height: 190px; overflow: hidden;
    background: var(--kf-surface-3); cursor: pointer;
  }
  /* Cu program, overlay-ul mai poartă și linia de timp între titlu și rândul de locație/dată.
     Overlay-ul crește în SUS din marginea de jos și e clipuit de `overflow: hidden`, deci la 190px
     un titlu pe două rânduri ar tăia programul. Banda alternată (oră sus / oră jos) e cu ~25px mai
     înaltă decât varianta pe un singur nivel — de aici 265, nu 250. Doar cardurile cu program plătesc. */
  body.kf .ccard__hero:has(.tline) { height: 265px; }
  body.kf .ccard__hero img {
    width: 100%; height: 100%; object-fit: cover; display: block;
    filter: grayscale(1) contrast(1.05); transition: filter .25s;
  }
  body.kf .ccard:hover .ccard__hero img { filter: grayscale(0) contrast(1); }
  /* SCRIM plin ACOLO UNDE E TEXTUL. Varianta veche mergea de la .82 jos la TRANSPARENT sus — iar
     titlul e PRIMUL copil al suprapunerii, deci cădea exact în zona cea mai transparentă: pe un afiș
     încărcat numele concursului se pierdea în imagine (raport user 2026-08-16). Scrim-ul era tare
     unde nu trebuia.
     Acum: plin până peste titlu, stins în ultimii ~12% — care cad în `padding-top` (`--kf-5`), adică
     DEASUPRA numelui. `color-mix` peste tokenul de cerneală, nu `rgba()` literal.
     Scrim PINNAT (identic pe ambele teme) fiindcă textul de deasupra e pinnat alb. */
  body.kf .ccard__hero-ov {
    position: absolute; inset: auto 0 0 0;
    padding: var(--kf-5) var(--kf-4) var(--kf-3);
    background: linear-gradient(to top,
        color-mix(in srgb, var(--c-ink-900) 88%, transparent) 0%,
        color-mix(in srgb, var(--c-ink-900) 88%, transparent) 72%,
        color-mix(in srgb, var(--c-ink-900) 55%, transparent) 88%,
        transparent 100%);
  }
  body.kf .ccard__title {
    font-family: var(--kf-font-display); font-weight: 900; font-size: var(--font-5xl);
    line-height: .95; color: var(--c-white); letter-spacing: .01em; text-transform: uppercase;
  }
  body.kf .ccard__herometa {
    display: flex; flex-wrap: wrap; gap: .25rem 1rem; margin-top: .35rem;
    font-family: var(--kf-font-mono); font-size: var(--font-md); color: rgba(255,255,255,.82);
  }
  body.kf .ccard__hero-badges {
    position: absolute; top: var(--kf-3); right: var(--kf-3);
    display: flex; flex-wrap: wrap; gap: .35rem; z-index: 2;
  }
  body.kf .ccard__zoom {
    position: absolute; top: var(--kf-3); left: var(--kf-3); z-index: 2;
    width: 32px; height: 32px; border-radius: var(--kf-r-sm);
    background: rgba(255,255,255,.85); color: var(--kf-text);
    display: flex; align-items: center; justify-content: center;
    opacity: 0; transition: opacity .18s;
  }
  body.kf .ccard__hero:hover .ccard__zoom { opacity: 1; }

  /* status badge / countdown → fill plat pătrat (flat, fără border) */
  body.kf .badge-status, body.kf .cbc-days {
    border: 0; border-radius: 0;
    padding: .22rem .55rem; font-size: var(--font-xs); font-weight: 700;
    font-family: var(--kf-font-mono); letter-spacing: .06em; text-transform: uppercase;
    display: inline-flex; align-items: center;
  }
  body.kf .badge-status--open   { background: var(--kf-tint);       color: var(--kf-on-tint); }
  body.kf .badge-status--active { background: var(--kf-secondary);  color: var(--kf-on-secondary); }
  body.kf .badge-status--done   { background: var(--kf-surface-inset); color: var(--kf-text-variant); }
  body.kf .cbc-days { background: var(--kf-alert-soft); color: var(--kf-on-alert-soft); }
  body.kf .cbc-days--today { background: var(--kf-alert); color: var(--c-white); }

  /* ---- Categorie (rând în card) ---- */
  body.kf .ccard > .ccat,
  body.kf .ccard .ccat {
    background: var(--kf-surface-bright);
    border: 0; border-radius: 0;
    margin: 0 var(--kf-4) var(--kf-3);
    padding: var(--kf-3) var(--kf-4);
    position: relative; overflow: hidden;
    transition: background .1s;
  }
  body.kf .ccard .ccat:first-of-type { margin-top: var(--kf-4); }
  body.kf .ccard a.ccat { display: block; color: inherit; text-decoration: none; }
  body.kf .ccat::before {
    content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 5px;
    background: var(--kf-marker); opacity: 0; transition: opacity .15s;
  }
  body.kf .ccat:hover { background: var(--kf-surface-2); }
  body.kf .ccat:hover::before { opacity: 1; }
  /* Categoria care se dansează ACUM: banda laterală de hover devine PERMANENTĂ. Zero mecanism nou —
     marcajul de „uite unde ești" exista deja, îl aprindem. Scris sub `body.kf` fiindcă regula de bază
     e aici, în `@layer components`: un modifier din `@layer app` ar pierde tăcut. */
  body.kf .ccat--now::before { opacity: 1; }
  body.kf .ccat--now { background: var(--kf-surface-2); }

  body.kf .ccat__l1 { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; margin-bottom: .6rem; }

  /* Rândul de meta (JURIU / LINE-UP / ÎNSCRIȘI / ACȚIUNI) = `<div class="ccat__row">` cu două span-uri:
     eticheta + clusterul de valori. Markupul stivuiește fără probleme; ce împiedica valorile să coboare
     era GRILA de aici (`grid-template-columns: 4.5rem 1fr`): într-o grilă cu 2 coloane declarate,
     al doilea element e pironit în coloana 2 oricât s-ar îngusta rândul.

     Implicitul e acum STIVUIT (etichetă deasupra, valorile pe tot rândul); alăturat se activează doar
     când CARDUL ÎNSUȘI are loc — măsurat cu `@container`, nu pe viewport. Motivul e o cifră,
     nu o preferință: `.ccat__row` are ~350px într-o coloană de desktop și ~330-375px pe telefon, deci
     lățimea ECRANULUI nu spune nimic despre cât loc are rândul (cardul de desktop e mai îngust decât
     un telefon mare). Pragul de reglat = `27rem` din `@container` (o condiție de container query NU
     poate citi o variabilă CSS, deci numărul stă scris acolo).

     Containerul e `.ccard`, NU `.ccat`: rândul de program (`_schedule_list`) folosește tot `.ccat__row`
     dar stă în card, în afara blocului de categorie — pe `.ccat` n-ar fi avut ce interoga și ar fi
     rămas stivuit permanent. Pragul include deci și paddingul lui `.ccat` (~1,3rem). */
  body.kf .ccard { container-type: inline-size; }
  body.kf .ccat__row {
    display: flex; flex-direction: column; align-items: flex-start;
    gap: .15rem; margin-top: .45rem;
  }
  body.kf .ccat__lbl {
    font-family: var(--kf-font-mono); font-size: var(--font-xs); font-weight: 700;
    /* .06em = tracking-ul rolului de ETICHETĂ (components.css § 18b) — o singură valoare pentru
       uppercase-ul de etichetă în toată aplicația. */
    text-transform: uppercase; letter-spacing: .06em; color: var(--kf-text-variant);
    margin: 0; padding-top: 0; white-space: nowrap;
  }
  /* valorile = cluster wrap (wrapper .ccat__vals sau .e-chip-list). Fără `width: 100%`: într-un flex
     column cu align-items:flex-start lățimea e deja fit-content, deci se împachetează pe lățimea
     disponibilă — iar `.ccat__vals` e refolosit și în `.res-jury`, unde o lățime forțată ar strica. */
  body.kf .ccat__vals, body.kf .ccat__row .e-chip-list {
    display: flex; flex-wrap: wrap; align-items: center; gap: .3rem; min-width: 0;
  }
  /* Card LAT → etichetă lângă valori, coloană de etichete aliniată vertical (densitatea de dinainte). */
  @container (min-width: 27rem) {
    body.kf .ccat__row {
      display: grid; grid-template-columns: 4.5rem 1fr;
      align-items: start; gap: .25rem .5rem;
    }
    body.kf .ccat__lbl { grid-column: 1; align-self: start; justify-self: start; padding-top: .28rem; }
    body.kf .ccat__vals, body.kf .ccat__row .e-chip-list { grid-column: 2; }
  }
  /* `body.kf .res-jury--stacked > .ccat__vals` (coloană stivuită) = ȘTERSĂ 2026-08-15 odată cu
     modificatorul `--stacked`. Line-up + Juriu vor acum exact ce dă regula generală de mai sus:
     un RÂND care se înfășoară. Cu rândul de titlu eliberat, pastilele au loc pe orizontală, iar
     antetul câștigă înălțime în loc s-o cheltuie pe o coloană de nume. */

  /* style-pill pe kf → PĂSTREAZĂ hue-ul (tentă + strip stânga), dar brutalist:
     mono uppercase, plat, sharp. Iese în evidență față de format/TOP gri. */
  body.kf .style-pill {
    border-radius: 0; border: 0;
    border-left: 4px solid hsl(var(--style-h) var(--style-s) var(--style-l-accent));
    background: hsl(var(--style-h) var(--style-s) var(--style-l-bg));
    color: hsl(var(--style-h) var(--style-s) var(--style-l-fg));
    font-family: var(--kf-font-mono); font-weight: 700; font-size: var(--font-xs);
    text-transform: uppercase; letter-spacing: .04em;
    padding: .2rem .5rem .2rem .42rem;
  }
  /* Aceeași pastilă pe linia de timp a programului, strânsă la lățimea unei coloane de stop.
     Declarată AICI, nu lângă restul lui `.tline` din components.css: regula de mai sus e în
     @layer components, deci ar bate orice variantă din @layer app pe `display`/`font-size`,
     indiferent de specificitate (UI_RULES, „capcana body.kf la variante/modifiere"). */
  body.kf .tline__cat {
    font-size: var(--font-2xs);
    border-left-width: 3px;
    padding: .1rem .34rem .1rem .26rem;
    letter-spacing: .02em;
  }
  body.kf .badge-battle-fmt {
    border: 0; border-radius: 0;
    background: var(--kf-surface-inset); color: var(--kf-text-variant);
    font-family: var(--kf-font-mono); font-weight: 700; font-size: var(--font-xs);
    padding: .2rem .5rem; text-transform: uppercase; letter-spacing: .05em;
  }
  body.kf .badge-top-n {
    border: 0; border-radius: 0;
    background: var(--kf-tint); color: var(--kf-on-tint);
    font-family: var(--kf-font-mono); font-weight: 700; font-size: var(--font-xs);
    padding: .2rem .5rem; letter-spacing: .03em;
  }
  body.kf .ccat .badge.bg-secondary {
    border-radius: 0; background: var(--kf-info-soft) !important;
    color: var(--kf-info); font-family: var(--kf-font-mono); font-weight: 700; font-size: var(--font-xs);
  }

  /* juriu / staff / înscriși → fill plat pătrat (fără border) */
  body.kf .j-pill, body.kf .e-chip {
    border: 0; border-radius: 0;
    background: var(--kf-surface-2); color: var(--kf-text);
    font-size: var(--font-xs); padding: .2rem .55rem; display: inline-flex; align-items: center; gap: .3rem;
  }
  /* numele juratului prelua --primary-strong (remapat la olive) → olive-pe-surface ilizibil.
     → text on-surface normal, lizibil pe chip. */
  body.kf .j-pill__n { color: var(--kf-text); }
  body.kf .j-pill__m, body.kf .e-city { color: var(--kf-text-variant); font-family: var(--kf-font-mono); font-size: var(--font-xs); }
  body.kf .s-pill { background: var(--kf-surface-inset); }
  /* rolul (DJ/Host/oră) = text accent DIRECT pe chip (bg transparent) — bg-ul inverse din regula
     de bază dădea olive-pe-negru ilizibil pe light. Pe dark accentul olive nu ține → lime-dim. */
  body.kf .s-pill__r {
    background: transparent;
    font-family: var(--kf-font-mono); font-size: var(--font-2xs); font-weight: 700;
    text-transform: uppercase; color: var(--kf-accent); letter-spacing: .04em;
  }
  [data-theme="dark"] body.kf .s-pill__r { color: var(--c-kf-lime-dim); }
  body.kf .e-chip-list { display: inline-flex; flex-wrap: wrap; gap: .3rem; }

  /* CTA înscriere → lime plat (SINGURUL lime), hover invert instant */
  body.kf .ccat__cta {
    margin-top: var(--kf-4);
    background: var(--kf-primary); color: var(--kf-on-primary);
    border: 0; border-radius: 0;
    padding: .7rem 1rem;
    font-family: var(--kf-font-mono);
    font-weight: 700; font-size: var(--font-md); text-transform: uppercase; letter-spacing: .06em;
    display: flex; align-items: center; justify-content: center; gap: .5rem;
    transition: none;
  }
  body.kf .ccat__cta:hover,
  body.kf .ccat__cta[aria-expanded="true"] {
    background: var(--kf-primary-solid); color: var(--kf-on-solid);
  }
  body.kf .ccat__cta .bi-chevron-down { margin-left: auto; }
  body.kf .ccat__cta[aria-expanded="true"] .bi-chevron-down { transform: rotate(180deg); }

  /* ---- Formular înscriere inline (flat) ---- */
  body.kf .ccat-form {
    background: var(--kf-surface-2);
    margin: 0 var(--kf-4) var(--kf-4);
    border: 0; border-radius: 0;
    padding: var(--kf-4);
  }
  body.kf .pc-form-title {
    font-family: var(--kf-font-display); font-weight: 900; font-size: var(--font-xl);
    text-transform: uppercase; letter-spacing: .02em;
    color: var(--kf-text); margin-bottom: var(--kf-3);
  }
  body.kf .ac-hint, body.kf .dancer-lbl {
    font-family: var(--kf-font-mono); font-size: var(--font-xs); text-transform: uppercase;
    letter-spacing: .04em; color: var(--kf-text-variant);
  }
  /* inputuri → hairline 1px plat, focus = contur lime instant */
  body.kf .ccat-form .form-control,
  body.kf .ccat-form .form-select {
    background-color: var(--kf-surface-bright);   /* background-color (NU background) — nu șterge săgeata select */
    border: 1px solid var(--kf-line);
    border-radius: 0;
    color: var(--kf-text); font-family: var(--kf-font-mono); font-size: var(--font-md);
    box-shadow: none; transition: border-color .1s;
  }
  body.kf .ccat-form .form-control::placeholder { color: var(--kf-outline); }
  body.kf .ccat-form .form-control:focus,
  body.kf .ccat-form .form-select:focus {
    background-color: var(--kf-surface-bright);
    border-color: var(--kf-primary-solid);
    box-shadow: inset 2px 0 0 var(--kf-marker);
  }
  body.kf .ccat-form .dob-row select { font-family: var(--kf-font-mono); }

  /* Formular înscriere — strip „left-strip" DASHED pe stânga + colțuri rotunjite (nu cutie completă).
     Bordura e doar pe stânga; border-radius rotunjește boxul (fundal + capetele strip-ului) = look cool.
     SSOT prin clasa .entry-form pe <form> (_entry_form.html.twig) → identic pe /concursuri
     (în .ccat-form) ȘI pe pagina categoriei organizatorului (formular plain). Plasat în
     @layer components, DUPĂ regula .ccat-form, ca să bată cutia kf (specificitate egală + ordine). */
  body.kf .entry-form .form-control,
  body.kf .entry-form .form-select {
    border: 0; border-left: var(--entry-strip) dashed var(--kf-line);
    border-radius: var(--entry-radius); background-color: var(--kf-surface-bright);
    box-shadow: none; transition: border-left-color .12s;
  }
  body.kf .entry-form .form-control:focus,
  body.kf .entry-form .form-select:focus {
    border-left-color: var(--kf-primary-solid);
    box-shadow: none;
  }

  /* Starea câmpului = derivată din DOM, ZERO JS (UI_RULES „starea în CSS, nu în JS"). Standardul UX
     „reward early, punish late" (Baymard/Smashing): un câmp gol NEATINS nu e o eroare, deci nu e roșu.
     GOL = stripul punctat de mai sus (calm) · COMPLETAT = strip SOLID accent (confirmare pozitivă)
     · GREȘIT = roșu, dar numai după interacțiune/submit (`:user-invalid`, niciodată la încărcare).
     Grosimea nu se schimbă între stări (`--entry-strip`) → zero salt de layout la tastare.
     Select-ul n-are `:placeholder-shown` → „gol" = opțiunea fără valoare e cea bifată.
     Ordinea contează (specificitate egală): completat, apoi eroarea care îl bate. */
  body.kf .entry-form .form-control:not(:placeholder-shown),
  body.kf .entry-form .form-select:not(:has(option[value=""]:checked)) {
    border-left-style: solid;
    border-left-color: var(--kf-primary-solid);
  }
  body.kf .entry-form .form-control:user-invalid,
  body.kf .entry-form .form-select:user-invalid {
    border-left-style: solid;
    border-left-color: var(--danger);
  }

  /* submit → olive solid plat, hover invert instant */
  body.kf .ccat-form .btn-ink {
    background: var(--kf-primary-solid); color: var(--kf-on-solid);
    border: 0; border-radius: 0;
    font-family: var(--kf-font-mono); font-weight: 700; padding: .65rem 1.5rem;
    text-transform: uppercase; letter-spacing: .06em;
    transition: none;
  }
  body.kf .ccat-form .btn-ink:hover { background: var(--kf-primary); color: var(--kf-on-primary); }
  body.kf .ccat-form .btn-outline-secondary {
    border-radius: 0; border-color: var(--border-control); color: var(--kf-text-variant);
    font-family: var(--kf-font-mono); text-transform: uppercase; font-size: var(--font-xs);
  }

  /* empty state */
  body.kf .empty-ico--lg { color: var(--kf-outline); }

  /* ═══════════ DASHBOARD „Contul meu" /cont (scoped body.kf) ═══════════ */

  /* Page header → titlu display + acțiune dreapta, hairline jos */
  body.kf .page-header {
    display: flex; align-items: flex-end; justify-content: space-between;
    flex-wrap: wrap; gap: var(--kf-3);
    border-bottom: var(--kf-border); padding-bottom: var(--kf-3); margin-bottom: var(--kf-5);
  }
  body.kf .page-header__title {
    font-family: var(--kf-font-display); font-weight: 900; font-size: var(--font-8xl);
    line-height: .98; letter-spacing: .01em; text-transform: uppercase;
    color: var(--kf-text); margin: 0;
  }

  /* btn-ink (page/acct primary) → olive solid plat, hover invert instant */
  body.kf .btn-ink {
    background: var(--kf-primary-solid); color: var(--kf-on-solid);
    border: 0; border-radius: 0;
    font-family: var(--kf-font-mono); font-weight: 700;
    text-transform: uppercase; letter-spacing: .05em;
    padding: .5rem 1.1rem; display: inline-flex; align-items: center; gap: .4rem;
    transition: none;
  }
  body.kf .btn-ink:hover { background: var(--kf-primary); color: var(--kf-on-primary); }
  body.kf .btn-ink.btn-xs { padding: .35rem .8rem; font-size: var(--font-xs); }

  /* Card profil organizator → flat hairline */
  body.kf .acct-card {
    background: var(--kf-surface); border: var(--kf-border); border-radius: 0;
    padding: var(--kf-3) var(--kf-4);
  }
  body.kf .acct-card__ico { color: var(--kf-text-variant); }
  body.kf .acct-card__name {
    font-family: var(--kf-font-display); font-weight: 900; text-transform: uppercase;
    letter-spacing: .02em; font-size: var(--font-xl); color: var(--kf-text);
  }
  body.kf .acct-card__email { font-family: var(--kf-font-mono); font-size: var(--font-sm); color: var(--kf-text-variant); }
  body.kf .acct-form { border-top: 1px solid var(--kf-line); }
  body.kf .acct-form__lbl {
    font-family: var(--kf-font-mono); font-size: var(--font-2xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: .05em; color: var(--kf-text-variant);
  }
  body.kf .acct-card .form-control {
    background: var(--kf-surface-bright); border: 1px solid var(--kf-line); border-radius: 0;
    color: var(--kf-text); font-family: var(--kf-font-mono); font-size: var(--font-md); box-shadow: none;
  }
  body.kf .acct-card .form-control:focus {
    border-color: var(--kf-primary-solid); box-shadow: inset 2px 0 0 var(--kf-marker);
  }

  /* Rând de arhivă (/arhiva) — afiș portret + coloană de text.
     AICI stă DOAR ce un token nu poate exprima: fontul mono, uppercase, filtrul grayscale→color
     și fundalul paginii. Bordurile, razele (=0) și suprafețele vin gratis din remap-ul global de
     tokeni de mai sus — NU scrie reguli de culoare pentru ele. Dimensiunile (aspect-ratio, clamp,
     container query) rămân în @layer app: kf-ul e o piele, nu un layout. */
  body.kf .arch-poster { background: var(--kf-surface-3); }
  body.kf .arch-poster img { filter: grayscale(1) contrast(1.05); transition: filter .25s; }
  body.kf .ccard:hover .arch-poster img { filter: grayscale(0) contrast(1); }
  /* Modificator pe o clasă care ARE regulă body.kf → are nevoie de copie scopată, altfel pierde
     pe ordinea de layere (components bate app indiferent de specificitate). */
  body.kf .arch-poster--empty { color: var(--kf-outline); }
  body.kf .arch-title {
    font-family: var(--kf-font-display); text-transform: uppercase; letter-spacing: .01em;
    color: var(--kf-text);
  }
  body.kf .arch-meta {
    font-family: var(--kf-font-mono); font-size: var(--font-xs); color: var(--kf-text-variant);
  }
  /* --bg NU e în blocul de remap de mai sus (doar --kf-bg e fundalul lui body.kf) → fără linia
     asta, antetul lipicios ar avea altă nuanță decât pagina și s-ar vedea o dungă la derulare. */
  body.kf .arch-year { background: var(--kf-bg); border-bottom: 1px solid var(--kf-line); }
  body.kf .arch-year__n { font-family: var(--kf-font-mono); }

  /* Tabel categorii (folosit de _qualification_section) */
  body.kf .pub-cat-table td { padding: .4rem .5rem; }
  body.kf .pub-cat-table tr + tr td { border-top: 1px solid var(--kf-line); }
  /* rând categorie (clasă proprie kf → NU se ciocnește cu legacy .cat-tr important) */
  body.kf .kf-catrow td { transition: background .1s; }
  body.kf .kf-catrow--odd td { background: var(--kf-surface-bright); }
  body.kf .kf-catrow:hover td { background: var(--kf-surface-2); color: var(--kf-text); }
  /* hover = strip lime stânga + grey subtil (ca .ccat::before de pe /concursuri) */
  body.kf .kf-catrow:hover td:first-child { box-shadow: inset 4px 0 0 var(--kf-marker); }
  body.kf .cat-entries-lbl {
    font-family: var(--kf-font-mono); font-size: var(--font-2xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: .05em; color: var(--kf-text-variant);
  }
  /* tier pill (clasă proprie → fără Bootstrap text-bg-* care e important în @layer vendor) */
  body.kf .tier-pill {
    border: 0; border-radius: 0; padding: .2rem .5rem;
    background: var(--kf-surface-inset); color: var(--kf-text-variant);
    font-family: var(--kf-font-mono); font-weight: 700; font-size: var(--font-xs);
    text-transform: uppercase; letter-spacing: .03em; display: inline-flex; align-items: center;
  }
  body.kf .tier-pill--rank { background: var(--kf-tint); color: var(--kf-on-tint); }

  /* Acțiuni per-categorie → next-step = lime plat; restul = outline hairline mono */
  body.kf .cat-actions .btn {
    border-radius: 0; border: 1px solid var(--kf-line);
    font-family: var(--kf-font-mono); font-weight: 700; font-size: var(--font-xs);
    text-transform: uppercase; letter-spacing: .04em; padding: .3rem .7rem;
    transition: none; background: var(--kf-surface-bright); color: var(--kf-text-variant);
  }
  body.kf .cat-actions .btn:hover { border-color: var(--kf-primary-solid); color: var(--kf-text); }
  body.kf .cat-actions .btn-success,
  body.kf .cat-actions .btn-warning,
  body.kf .cat-actions .btn-dark {
    background: var(--kf-primary); color: var(--kf-on-primary); border-color: var(--kf-primary);
  }
  body.kf .cat-actions .btn-success:hover,
  body.kf .cat-actions .btn-warning:hover,
  body.kf .cat-actions .btn-dark:hover {
    background: var(--kf-primary-solid); color: var(--kf-on-solid); border-color: var(--kf-primary-solid);
  }

  /* Editează profil → outline hairline mono transparent */
  body.kf .acct-card .btn-outline-secondary {
    border-radius: 0; border: 1px solid var(--border-control);
    font-family: var(--kf-font-mono); font-weight: 700; font-size: var(--font-xs);
    text-transform: uppercase; letter-spacing: .04em;
    background: transparent; color: var(--kf-text-variant); transition: none;
  }
  body.kf .acct-card .btn-outline-secondary:hover { border-color: var(--kf-primary-solid); color: var(--kf-text); }

  /* === LANDING `/` — Kinetic Sharp (flat, hairline, display Black) ============ */
  body.kf .home-hero {
    border: 0; border-top: 2px solid var(--kf-marker);
    border-radius: 0; background: var(--kf-surface);
    box-shadow: none; padding: var(--kf-7) var(--kf-4);
    text-align: center; margin: var(--kf-4) 0 var(--kf-5);
  }
  body.kf .home-hero__mark { color: var(--kf-accent); }
  body.kf .home-hero__title {
    font-family: var(--kf-font-display); font-weight: 900;
    text-transform: uppercase; letter-spacing: .01em;
    color: var(--kf-text);
  }
  body.kf .home-hero__flash { color: var(--kf-accent); }
  body.kf .home-hero__tag { color: var(--kf-text-variant); }

  body.kf .home-grid { gap: var(--kf-4); }
  body.kf .home-card__body p { color: var(--kf-text-variant); }

  /* Hub cards (DOAR landing) → flat hairline, fără radius/umbră */
  body.kf .hub-card {
    border: var(--kf-border); border-radius: 0;
    background: var(--kf-surface); transition: none;
  }
  body.kf .hub-card:hover { box-shadow: none; border-color: var(--kf-marker); }
  body.kf .hub-strip {
    font-family: var(--kf-font-display); font-weight: 900;
    border-bottom: var(--kf-border); letter-spacing: .08em;
  }

  /* === CLASAMENT `/clasament` — Kinetic Sharp (flat, hairline, mono) ==== */
  /* Selector stil dans = tab-uri (consecvent cu .folder-tab kf) */
  body.kf .role-tabs {
    border-bottom: 1px solid var(--kf-line); gap: 0;
  }
  body.kf .role-tab {
    font-family: var(--kf-font-mono); text-transform: uppercase;
    letter-spacing: .04em; font-size: var(--font-xs); color: var(--kf-text-variant);
    border-bottom: 2px solid transparent; margin-bottom: -1px;
  }
  body.kf .role-tab:hover { color: var(--kf-text); background: var(--kf-surface-2); }
  body.kf .role-tab.active {
    color: var(--kf-text); border-bottom-color: var(--kf-marker);
  }

  /* Panou leaderboard = plat, hairline, 0-radius */
  body.kf .lb-panel {
    border: var(--kf-border); border-radius: 0;
    background: var(--kf-surface); box-shadow: none;
  }
  body.kf .lb-panel__head {
    font-family: var(--kf-font-display); font-weight: 900;
    text-transform: uppercase; letter-spacing: .06em;
    color: var(--kf-text); background: var(--kf-surface-bright);
    border-bottom: 1px solid var(--kf-line);
  }
  body.kf .lb-panel__head .lb-panel__count {
    font-family: var(--kf-font-mono); color: var(--kf-accent);
  }

  /* Tabel ELO — celule hairline, header mono, hover lime (NU volt-galben legacy) */
  body.kf .lb-panel .tier-table td { border-bottom: 1px solid var(--kf-line); }
  body.kf .lb-panel .tier-table tbody tr:nth-child(even) td { background: var(--kf-surface-bright); }
  body.kf .lb-panel .tier-table tbody tr:hover td {
    background: var(--kf-surface-2); color: var(--kf-text);
  }
  body.kf .lb-panel .tier-table tbody tr:hover td:first-child {
    box-shadow: inset 4px 0 0 var(--kf-marker);
  }
  /* ⚠️ `background` OBLIGATORIU aici. Regula de bază (@layer app) pune
     `background: var(--surface-inverse)` = bandă neagră cu text alb. Override-ul ăsta schimba DOAR
     `color`, la un gri de text-variant → gri închis pe negru în light (1.83:1) și gri deschis pe
     alb în dark (1.70:1), fiindcă `--surface-inverse` se întoarce cu tema. Jumătate de pereche
     rescrisă = cel mai ușor bug de scăpat: ambele valori sunt „corecte", dar nu una lângă alta. */
  body.kf .tier-table-header th {
    font-family: var(--kf-font-mono); text-transform: uppercase;
    letter-spacing: .04em; font-size: var(--font-xs);
    background: var(--kf-surface-inset); color: var(--kf-text-variant);
    border-bottom: 1px solid var(--kf-line);
  }

  body.kf .entity-name {
    font-family: var(--kf-font-display); font-weight: 900;
    letter-spacing: .01em; color: var(--kf-text);
  }
  body.kf .lb-elo {
    font-family: var(--kf-font-display); font-weight: 900; color: var(--kf-accent);
  }
  body.kf .lb-meta { color: var(--kf-text-variant); }
  body.kf .lb-meta__cc { font-family: var(--kf-font-mono); color: var(--kf-text); }
  body.kf .lb-empty { font-family: var(--kf-font-mono); color: var(--kf-text-variant); }

  /* Statistici V–Î / Win% */
  body.kf .stat-pct-value { font-family: var(--kf-font-mono); color: var(--kf-text); }
  body.kf .stat-pct-value.pct-high { color: var(--kf-accent); }
  body.kf .stat-pct-value.pct-low { color: var(--kf-text-variant); }
  /* Δ + formă pe skin kf */
  body.kf .lb-delta { font-family: var(--kf-font-mono); color: var(--kf-text-variant); }
  body.kf .lb-delta--up { color: var(--kf-accent); }
  body.kf .lb-delta--down { color: var(--kf-danger); }
  body.kf .form-pip--w { color: var(--kf-accent); }
  body.kf .form-pip--l { color: var(--kf-danger); }
  body.kf .stat-pct-bar { background: var(--kf-surface-inset); border-radius: 0; }
  body.kf .stat-pct-bar .bar-fill, body.kf .bar-win {
    background: var(--kf-marker); border-radius: 0;
  }

  /* Paginare numere (scoped kf — nu atinge alte pagini legacy cu .filter-pill) */
  body.kf .filter-pill {
    font-family: var(--kf-font-mono); border: 1px solid var(--kf-line);
    border-radius: 0; color: var(--kf-text-variant); background: var(--kf-surface);
  }
  body.kf .filter-pill:hover { background: var(--kf-surface-2); color: var(--kf-text); }
  body.kf .filter-pill.active {
    background: var(--kf-tint); color: var(--kf-on-tint); border-color: var(--kf-primary-solid);
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   KF — overrides COMPONENT peste SSOT-ul de tokeni (blocul global `:root{}` ~2950).
   SSOT skin = tokenii. AICI DOAR ce tokenul NU poate exprima:
   uppercase pe nume, MONO pe label-uri ce erau sans/display, accente lime punctuale
   (unde legacy folosea alt token), hover-strip, winner consistent. NU rescrie
   border/bg/radius/shadow/font-display — alea vin din token. (Vezi UI_RULES „SSOT skin".)
   ═══════════════════════════════════════════════════════════════════════════ */
@layer components {
  /* Numere/headere mari: greutatea 900 vine din regulile legacy (display = Archivo Black);
     override-ul de 400 era doar pentru Anton (un singur weight) → eliminat. */
  body.kf .cat-panel-hdr { letter-spacing: .04em; }

  /* MONO pe label-uri/taguri care erau sans/display (semnal kf — nu vine din token) */
  /* `.cat-tabs .nav-link` a IEȘIT din lista asta 2026-08-15: familia lui o deține acum rolul de
     ETICHETĂ (components.css § 18b). Regula de aici, fiind în @layer components, ar fi bătut rolul
     indiferent de specificitate — adică rolul n-ar fi făcut nimic, tăcut. */
  body.kf .bk-col-label,
  body.kf .bgc__hdr, body.kf .tbl-th, body.kf .stat-value, body.kf .sc-totals__v,
  body.kf .sc-round__hd, body.kf .sc-totals__lbl, body.kf .sc-prog__lbl, body.kf .sc-jt__jr,
  body.kf .bk-progress__lbl, body.kf .bk-col-count,
  body.kf .bk-current__phase, body.kf .bk-sc-hint,
  body.kf .adj-chip, body.kf .sc-jc__eq, body.kf .sc-jt__eq,
  body.kf .bgc__ord, body.kf .bgc__state, body.kf .bgc__crew { font-family: var(--kf-font-mono); }

  /* UPPERCASE scoreboard pe nume (fontul rămâne) */
  body.kf .bk-entry__name, body.kf .sc-jt__jn { text-transform: uppercase; letter-spacing: .02em; }

  /* Tab-uri Calificare|Bracket = underline flat (legacy = tab cu rame/radius literal).
     Geometria e IDENTICĂ cu a benzii de categorii de deasupra: aceeași riglă de 2px, aceeași
     origine în stânga, același marcaj aprins. Aici se face „linia care coboară din tabul activ":
     prin REPETIȚIA aceluiași semnal, nu printr-un conector desenat — banda de categorii SCROLLEAZĂ,
     deci orice săgeată care arată spre poziția tabului ar minți la prima derulare.
     `margin-bottom: -2px` (nu -1px cât dă Bootstrap): rigla e acum de 2px, iar marcajul trebuie să
     stea PE ea, nu la un pixel deasupra. Tracking/uppercase le deține rolul de ETICHETĂ. */
  body.kf .cat-tabs { border-bottom: 2px solid var(--border-strong); }
  body.kf .cat-tabs .nav-link {
    border: 0; border-bottom: 2px solid transparent; border-radius: 0; background: transparent;
    margin-bottom: -2px;
  }
  body.kf .cat-tabs .nav-link:hover { background: var(--kf-surface-2); }
  /* ⚠️ REVENIRE 2026-08-15: pusesem `var(--volt)` aici „ca să fie același verde ca la nivelul 1".
     Era o regresie invizibilă pe tema LIGHT: volt = lime #ccff00, iar ca LINIE pe suprafața deschisă
     dă 1.10:1 — marcajul tabului activ dispărea pur și simplu. `--kf-marker` E tokenul făcut pentru
     asta (tokens.css: „un marcaj trebuie să contrasteze cu ce e SUB el, deci urmează tema"):
     olive #506600 pe light (6.06:1), lime-dim pe dark (9.75:1). Traseul verde de la nivelul 1
     (linia benzii + șina lui `.cat-block`) folosește `--primary`, care se rezolvă la ACELAȘI olive —
     deci culoarea rămâne unitară, doar că acum se și vede. */
  body.kf .cat-tabs .nav-link.active { border-bottom-color: var(--kf-marker); }

  /* Accente lime PUNCTUALE (legacy folosea alt token → nu vin din remap) */
  /* Categoria activă = clar evidențiată: bordură accent groasă + bold + bulină lime (e clar pe ce categorie ești) */
  /* DOAR umplerea. Fostul `border: 2px solid` era un SHORTHAND: reseta și muchia colorată cu hue-ul
     stilului, și marcajul aprins de jos (UI_RULES, capcana „shorthand reset"). `font-weight: 700`
     a ieșit și el — greutatea o deține rolul de SUBTITLU (900).
     Bulina pulsantă `::after` = ȘTEARSĂ: pulsul înseamnă LIVE în restul aplicației
     (`.page-state__dot`), nu „selectat" — pe un concurs arhivat tabul activ pulsa degeaba. Tabul are
     deja trei indicatori de selecție, al patrulea era zgomot. */
  body.kf .cat-strip__item--on { background: var(--volt); color: var(--volt-ink); }
  body.kf .bgc__live-dot, body.kf .bgc__dot--active { background: var(--kf-primary-solid); }
  body.kf .sc-totals__v--hi { color: var(--kf-accent); }
  body.kf .sc-prog__cell.is-on { background: var(--kf-primary-solid); border-color: var(--kf-primary-solid); }

  /* Barele de magnitudine din celulele de scor: gri-neutru → lime (is-fav verde / is-tie amber) */
  body.kf .sc-jt__cell { --sc-fill: color-mix(in srgb, var(--kf-accent-strip) 22%, transparent); --sc-edge: var(--kf-primary-solid); }
  body.kf .sc-jt__cell.is-fav { --sc-fill: color-mix(in srgb, var(--kf-success) 20%, transparent); --sc-edge: var(--kf-success); }
  body.kf .sc-jt__cell.is-tie { --sc-fill: color-mix(in srgb, var(--kf-warning) 18%, transparent); --sc-edge: var(--kf-warning); }

  /* WINNER = lime: vine acum din tokenul global --winner-* (legacy :root + remap kf),
     citit de TOATE regulile is-win/winner (bk-entry, sc__side, sc-jc, bracket-entry).
     Zero override per-clasă aici → fără spoturi ratate. */

  /* Hover left-strip (lipsea) */
  body.kf .bk-battle:hover { box-shadow: inset 4px 0 0 var(--kf-marker); }
  body.kf .sc-jt__row:hover { background: var(--kf-surface-2); }

  /* Bara „battle curent": fundalul lime remapat dădea text olive-pe-lime (mohorât, ilizibil).
     → text near-black pe lime = contrast brutalist curat. */
  body.kf .bk-current__phase { color: var(--volt-ink); }

  /* Bara Start: olive-solid avea text olive (on-primary, gândit pt LIME) → olive-pe-olive ilizibil.
     → text alb (on-solid) pe olive-solid = contrast clar. */
  body.kf .bk-current__ctrl .btn-warning, body.kf .bk-current__ctrl .btn-warning:hover {
    background: var(--kf-primary-solid); border-color: var(--kf-primary-solid); color: var(--kf-on-solid);
    text-transform: uppercase; border-radius: 0;
  }
  body.kf .bk-current__ctrl .btn-success, body.kf .bk-current__ctrl .btn-success:hover { text-transform: uppercase; border-radius: 0; }
}
