/* ------------------------------------------------------------------
   Nord Panel - stiluri proprii peste Tailwind
------------------------------------------------------------------ */

/*
  Aliasuri vechi.

  Culorile adevarate stau in /css/themes.css, generat din src/themes.js si
  incarcat INAINTEA acestui fisier. Numele de aici au ramas pentru ca sunt
  scrise in zeci de reguli mai jos; sunt doar trimiteri, nu valori.

  `color-scheme` NU se mai pune aici: il da fiecare tema, iar app.css se
  incarca dupa themes.css, deci un `color-scheme: dark` scris aici ar face
  temele luminoase sa aiba controale de formular negre.
*/
:root {
  --ink-900: rgb(var(--c-ink-900));
  --ink-800: rgb(var(--c-ink-800));
  --ink-700: rgb(var(--c-ink-700));
  --ink-600: rgb(var(--c-ink-600));
  --ink-500: rgb(var(--c-ink-500));
  --line: rgb(var(--c-overlay) / 0.07);
  --frost: rgb(var(--c-frost-500));
}

* { -webkit-font-smoothing: antialiased; }

/* Alpine sterge x-cloak abia dupa ce initializeaza componenta. Fara regula asta,
   continutul legat de Alpine ar clipi o data, neformatat, la incarcarea paginii. */
[x-cloak] { display: none !important; }

body {
  margin: 0;
  min-height: 100vh;
  background:
    radial-gradient(1100px 600px at 12% -10%, rgb(var(--c-frost-500) / 0.055), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgb(var(--c-overlay) / 0.025), transparent 55%),
    var(--ink-900);
  color: rgb(var(--c-slate-200));
  font-family: Inter, system-ui, sans-serif;
}

::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: rgb(var(--c-scroll)); border-radius: 99px; border: 3px solid transparent; background-clip: content-box; }
::-webkit-scrollbar-thumb:hover { background: rgb(var(--c-scroll-hi)); background-clip: content-box; }

/* ----------------------------- Layout ----------------------------- */

.app-shell { display: flex; min-height: 100vh; }

.sidebar {
  position: fixed; inset: 0 auto 0 0; z-index: 50;
  display: flex; flex-direction: column;
  width: 262px;
  background: linear-gradient(180deg, rgb(var(--c-ink-850) / .96), rgb(var(--c-sunken) / .98));
  border-right: 1px solid var(--line);
  backdrop-filter: blur(12px);
  transform: translateX(-100%);
  transition: transform .22s ease;
}
.sidebar.is-open { transform: translateX(0); }
.sidebar-backdrop {
  position: fixed; inset: 0; z-index: 40;
  /* Ecranul din spatele meniului se INTUNECA, si pe o tema luminoasa: rostul
     lui e sa scoata meniul in fata, nu sa se potriveasca cu paleta. */
  background: rgb(var(--c-shadow) / .65); backdrop-filter: blur(2px);
  opacity: 0; pointer-events: none; transition: opacity .2s ease;
}
.sidebar-backdrop.is-open { opacity: 1; pointer-events: auto; }

.main { flex: 1; min-width: 0; padding-bottom: 48px; }

@media (min-width: 1024px) {
  .sidebar { transform: none; }
  .sidebar-backdrop { display: none; }
  .main { margin-left: 262px; }
}

.topbar {
  position: sticky; top: 0; z-index: 30;
  display: flex; align-items: center; gap: 14px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .78);
  backdrop-filter: blur(14px);
}

.page { padding: 22px 20px; max-width: 1500px; }
@media (min-width: 768px) { .page { padding: 26px 28px; } }

/* ------------------------------ Logo ------------------------------ */

/* `overflow: visible`: podoabele de anotimp ies peste marginea insignei. */
.brand-logo { flex-shrink: 0; overflow: visible; filter: drop-shadow(0 6px 10px rgb(var(--c-shadow) / .35)); }
.logo-stop-a { stop-color: rgb(var(--c-frost-500)); }
.logo-stop-b { stop-color: rgb(var(--c-frost-700)); }
.logo-mark {
  fill: none; stroke: rgb(var(--c-ink-900));
  stroke-width: 3.6; stroke-linecap: round; stroke-linejoin: round;
}
.logo-deco { display: none; }
html[data-season="winter"] .logo-deco[data-for="winter"],
html[data-season="holidays"] .logo-deco[data-for="holidays"],
html[data-season="autumn"] .logo-deco[data-for="autumn"],
html[data-season="spring"] .logo-deco[data-for="spring"],
html[data-season="summer"] .logo-deco[data-for="summer"] { display: inline; }

.logo-snow { fill: rgb(var(--c-snow)); stroke: rgb(var(--c-snow-edge) / .6); stroke-width: .5; }
.logo-hat { fill: rgb(var(--c-bulb-1)); }
.logo-leaf-a { fill: rgb(var(--c-leaf-2)); }
.logo-leaf-b { fill: rgb(var(--c-leaf-1)); }
.logo-vein { fill: none; stroke: rgb(var(--c-leaf-vein) / .7); stroke-width: .7; stroke-linecap: round; }
.logo-petal { fill: rgb(var(--c-petal-1)); stroke: rgb(var(--c-petal-4)); stroke-width: .45; }
.logo-bloom-core { fill: rgb(var(--c-blossom-core)); }
.logo-sprout { fill: rgb(var(--c-twig-leaf)); }
.logo-sun { fill: rgb(var(--c-sun)); stroke: rgb(var(--c-sun-core) / .8); stroke-width: .8; }
.logo-rays path { stroke: rgb(var(--c-sun)); stroke-width: 1.6; stroke-linecap: round; }

/* Miscare mica, doar cat sa se vada ca e vie. Se opreste la fel ca restul. */
.logo-rays { transform-origin: 37px 3px; animation: logo-spin 24s linear infinite; }
.logo-deco[data-for="autumn"] { transform-origin: 31px 8px; animation: logo-sway 4s ease-in-out infinite alternate; }
@keyframes logo-spin { to { transform: rotate(360deg); } }
@keyframes logo-sway { from { transform: rotate(-6deg); } to { transform: rotate(6deg); } }
@media (prefers-reduced-motion: reduce) {
  html:not([data-motion="full"]) .logo-rays,
  html:not([data-motion="full"]) .logo-deco { animation: none; }
}

/* --------------------------- Navigatie ---------------------------- */

/* Zona derulabila a meniului.

   `overscroll-behavior: contain` opreste "scroll chaining": cu meniul deschis
   pe telefon, o derulare ajunsa la capatul lui continua in pagina de dedesubt,
   iar omul inchide meniul si se trezeste in alt loc al paginii. */
.nav-scroll {
  flex: 1; min-height: 0;
  padding: 0 12px 16px;
  overflow-y: auto; overscroll-behavior: contain;
}
.nav-scroll > .nav-item + .nav-item,
.nav-sec > .nav-item + .nav-item { margin-top: 2px; }
/* Semnul de pagina curenta sta la -12px, adica exact pe marginea zonei
   derulabile - iar `overflow-y: auto` taie tot ce iese in stanga. Il tragem
   inauntru. Intrarile din grupul de Admin au regula lor, mai jos. */
.nav-scroll .nav-item.is-active::before { left: -6px; }

.nav-label {
  padding: 15px 10px 5px;
  font-size: 10.5px; font-weight: 700; letter-spacing: .16em;
  text-transform: uppercase; color: rgb(var(--c-slate-500));
}
/* Primul capitol sta chiar sub logo: fara asta, meniul pare ca incepe strambat. */
.nav-scroll > .nav-label:first-child,
.nav-scroll > .nav-sec:first-child > .nav-label { padding-top: 2px; }

/*
  Capitolele se strang din eticheta (views/partials/shell.ejs). Eticheta ramane
  cum era; doar sageata mica din dreapta spune ca se poate apasa. E vizibila
  mereu, nu doar la hover: pe telefon nu exista hover.
*/
.nav-sec > summary {
  display: flex; align-items: center;
  cursor: pointer; list-style: none; user-select: none;
  transition: color .15s ease;
}
.nav-sec > summary::-webkit-details-marker { display: none; }
.nav-sec > summary::marker { content: ''; }
.nav-sec > summary:hover { color: rgb(var(--c-slate-300)); }
.nav-sec-chev {
  width: 13px; height: 13px; margin-left: auto;
  color: rgb(var(--c-slate-600)); transition: transform .18s ease, color .15s ease;
}
.nav-sec > summary:hover .nav-sec-chev { color: rgb(var(--c-slate-400)); }
.nav-sec:not([open]) .nav-sec-chev { transform: rotate(-90deg); }
.nav-item {
  position: relative;
  display: flex; align-items: center; gap: 11px;
  padding: 9px 12px; border-radius: 11px;
  font-size: 14px; font-weight: 500; color: rgb(var(--c-slate-400));
  transition: background .15s ease, color .15s ease;
}
.nav-item svg { width: 18px; height: 18px; }
.nav-item:hover { background: rgb(var(--c-slate-400) / .07); color: rgb(var(--c-slate-200)); }
.nav-item.is-active {
  background: linear-gradient(90deg, rgb(var(--c-frost-500) / .18), rgb(var(--c-frost-500) / .04));
  color: rgb(var(--c-frost-hi));
}
.nav-item.is-active::before {
  content: ''; position: absolute; left: -12px; top: 50%; transform: translateY(-50%);
  height: 20px; width: 3px; border-radius: 0 3px 3px 0; background: var(--frost);
}



/*
  Grupul pliabil de administrare.

  `<details>` nativ, fara JavaScript: meniul e singurul mod de a naviga pe
  telefon (vezi capcana din views/partials/shell.ejs), deci nu are voie sa
  depinda de un framework. Deschiderea implicita o decide serverul.
*/
.nav-group { margin-top: 10px; }
.nav-group > summary {
  cursor: pointer;
  list-style: none;
  color: rgb(var(--c-slate-300));
  font-weight: 600;
}
/* Triunghiul implicit al browserului: il scoatem, avem chevronul nostru. */
.nav-group > summary::-webkit-details-marker { display: none; }
.nav-group > summary::marker { content: ''; }
.nav-group > summary:hover { background: rgb(var(--c-slate-400) / .07); }
.nav-group[open] > summary { color: rgb(var(--c-slate-200)); }

.nav-chev { margin-left: auto; color: rgb(var(--c-slate-600)); transition: transform .18s ease; }
.nav-group[open] .nav-chev { transform: rotate(180deg); }

/* Linia din stanga tine intrarile impreuna, ca sa se vada ca sunt un capitol. */
.nav-group-body {
  margin: 2px 0 2px 21px;
  padding-left: 10px;
  border-left: 1px solid rgb(var(--c-slate-400) / .12);
}
.nav-group-body .nav-item { padding: 7px 10px; font-size: 13.5px; }
.nav-group-body .nav-item.is-active::before { left: -11px; }
.nav-sub {
  padding: 10px 10px 4px;
  font-size: 10px; font-weight: 700; letter-spacing: .14em;
  text-transform: uppercase; color: rgb(var(--c-slate-600));
}
.nav-group-body > .nav-sub:first-child { padding-top: 4px; }

.avatar {
  display: grid; place-items: center;
  height: 34px; width: 34px; flex-shrink: 0;
  border-radius: 10px;
  background: linear-gradient(135deg, rgb(var(--c-frost-700)), rgb(var(--c-frost-500)));
  color: rgb(var(--c-ink-900)); font-size: 12px; font-weight: 800; letter-spacing: .04em;
}

/* ---------------------------- Carduri ----------------------------- */

.card {
  border: 1px solid var(--line);
  border-radius: 16px;
  background: linear-gradient(180deg, rgb(var(--c-ink-700) / .92), rgb(var(--c-ink-850) / .92));
  box-shadow: 0 18px 40px -26px rgb(var(--c-shadow) / .95);
  /* Fara asta, un <table> lipit de marginea cardului taie colturile rotunjite:
     fundalul de la `thead th` si ultimul rand se desenau in coltul patrat. */
  overflow: hidden;
}
.card-head {
  display: flex; align-items: center; gap: 12px;
  padding: 16px 18px; border-bottom: 1px solid var(--line);
}
.card-title { font-size: 14px; font-weight: 700; color: rgb(var(--c-slate-200)); }
.card-sub { font-size: 12px; color: rgb(var(--c-slate-500)); }
.card-body { padding: 18px; }

.stat-card { position: relative; overflow: hidden; padding: 18px; }
.stat-card::after {
  content: ''; position: absolute; right: -30px; top: -30px;
  height: 110px; width: 110px; border-radius: 50%;
  background: radial-gradient(circle, rgb(var(--c-frost-500) / .16), transparent 70%);
}
.stat-value { font-size: 28px; font-weight: 800; line-height: 1.1; color: rgb(var(--c-slate-50)); }
.stat-label { font-size: 11.5px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: rgb(var(--c-slate-500)); }

/* ---------------------------- Butoane ----------------------------- */

.btn, .btn-ghost, .btn-danger, .btn-soft {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 8px 14px; border-radius: 10px;
  font-size: 13.5px; font-weight: 600; white-space: nowrap;
  border: 1px solid transparent; cursor: pointer;
  transition: all .15s ease;
}
.btn { background: linear-gradient(135deg, rgb(var(--c-frost-500)), rgb(var(--c-frost-700))); color: rgb(var(--c-ink-900)); }
.btn:hover { filter: brightness(1.08); transform: translateY(-1px); }
.btn-soft { background: rgb(var(--c-frost-500) / .12); color: rgb(var(--c-frost-hi)); border-color: rgb(var(--c-frost-500) / .22); }
.btn-soft:hover { background: rgb(var(--c-frost-500) / .2); }
.btn-ghost { background: rgb(var(--c-slate-400) / .07); color: rgb(var(--c-slate-300)); border-color: var(--line); }
.btn-ghost:hover { background: rgb(var(--c-slate-400) / .14); color: rgb(var(--c-text-hi)); }
.btn-danger { background: rgb(var(--c-red) / .16); color: rgb(var(--c-red-on)); border-color: rgb(var(--c-red) / .32); }
.btn-danger:hover { background: rgb(var(--c-red) / .28); color: rgb(var(--c-text-hi)); }
.btn:disabled, .btn-ghost:disabled, .btn-danger:disabled, .btn-soft:disabled { opacity: .5; cursor: not-allowed; transform: none; }

.icon-btn {
  display: inline-grid; place-items: center;
  height: 34px; width: 34px; border-radius: 10px;
  color: rgb(var(--c-slate-400)); background: rgb(var(--c-slate-400) / .06);
  border: 1px solid var(--line); cursor: pointer; transition: all .15s ease;
}
.icon-btn:hover { color: rgb(var(--c-text-hi)); background: rgb(var(--c-slate-400) / .16); }
/* Un buton stins ramane vizibil, dar nu mai raspunde la hover: altfel arata
   apasabil si omul se intreaba de ce nu se intampla nimic. */
.icon-btn:disabled { opacity: .35; cursor: not-allowed; }
.icon-btn:disabled:hover { color: rgb(var(--c-slate-400)); background: rgb(var(--c-slate-400) / .06); }
.icon-btn.danger:hover { color: rgb(var(--c-red-hi)); background: rgb(var(--c-red) / .25); border-color: rgb(var(--c-red) / .4); }

/* Butonul de meniu (hamburger).

   NU se poate folosi `lg:hidden` de la Tailwind: app.css se incarca DUPA
   tailwind.css, iar `.icon-btn { display: inline-grid }` de mai sus are aceeasi
   specificitate ca `.lg\:hidden { display: none }` si, fiind mai jos in ordinea
   fisierelor, castiga. Rezultatul era un hamburger vizibil si pe desktop, langa
   un meniu deja deschis. Regula sta aici, dupa .icon-btn, ca sa fie ea ultima.

   1024px e acelasi prag cu cel la care sidebar-ul devine fix (vezi Layout). */
.sidebar-toggle { display: none; }
@media (max-width: 1023.98px) {
  .sidebar-toggle { display: inline-grid; }
}

/* Meniu inchis -> hamburger; meniu deschis -> X. Schimbarea se face din CSS,
   dupa clasa pusa pe <body>, ca sa nu depinda de niciun framework. */
.sidebar-toggle .icon-close { display: none; }
body.sidebar-open .sidebar-toggle .icon-open { display: none; }
body.sidebar-open .sidebar-toggle .icon-close { display: block; }

/* --------------------------- Formulare ---------------------------- */

.label { display: block; margin-bottom: 6px; font-size: 12px; font-weight: 600; color: rgb(var(--c-slate-400)); }
.input, .select, textarea.input {
  width: 100%; padding: 9px 12px;
  border-radius: 10px; border: 1px solid rgb(var(--c-slate-400) / .16);
  background: rgb(var(--c-sunken) / .75); color: rgb(var(--c-slate-100));
  font-size: 14px; font-family: inherit;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.input::placeholder { color: rgb(var(--c-slate-600)); }
.input:focus, .select:focus {
  outline: none; border-color: rgb(var(--c-frost-500) / .55);
  box-shadow: 0 0 0 3px rgb(var(--c-frost-500) / .13);
}
.select {
  appearance: none;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a1a1aa' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center; background-size: 16px;
  padding-right: 32px;
}
/* Input cu iconita in stanga (lupa, lacat, om).

   NU merge cu `pl-9` de la Tailwind: app.css se incarca dupa tailwind.css, iar
   `.input { padding: 9px 12px }` de mai sus e o prescurtare care rescrie si
   padding-left, la aceeasi specificitate. Rezultatul era text scris peste
   iconita. Aici punem padding-ul explicit, dupa regula care il strica. */
.input.has-icon { padding-left: 38px; }
.input.has-icon-right { padding-right: 40px; }

/* Iconita propriu-zisa: mereu in spatele textului si nefocusabila. */
.input-icon {
  position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  height: 16px; width: 16px;
  color: rgb(var(--c-slate-600)); pointer-events: none;
}

.hint { margin-top: 5px; font-size: 11.5px; color: rgb(var(--c-slate-500)); }
/* Link intr-un rand de ajutor: se vede ca e link, fara sa tipe. */
.icon-link { color: rgb(var(--c-frost-500)); text-decoration: underline; text-underline-offset: 2px; }
.icon-link:hover { color: rgb(var(--c-frost-400)); }

.switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
.switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.switch .track {
  position: relative; height: 22px; width: 40px; flex-shrink: 0;
  border-radius: 99px; background: rgb(var(--c-ink-400)); transition: background .18s ease;
}
.switch .track::after {
  content: ''; position: absolute; top: 3px; left: 3px;
  height: 16px; width: 16px; border-radius: 50%; background: rgb(var(--c-slate-400));
  transition: transform .18s ease, background .18s ease;
}
.switch input:checked + .track { background: rgb(var(--c-frost-500) / .85); }
.switch input:checked + .track::after { transform: translateX(18px); background: rgb(var(--c-ink-900)); }
.switch input:focus-visible + .track { box-shadow: 0 0 0 3px rgb(var(--c-frost-500) / .25); }

/* ----------------------------- Tabele ----------------------------- */

.table-wrap { overflow-x: auto; }
table.data { width: 100%; border-collapse: collapse; font-size: 13.5px; }
table.data thead th {
  padding: 11px 14px; text-align: left;
  font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: rgb(var(--c-slate-500)); background: rgb(var(--c-ink-850) / .96);
  border-bottom: 1px solid var(--line); white-space: nowrap;
}
table.data tbody td { padding: 11px 14px; border-bottom: 1px solid rgb(var(--c-slate-400) / .06); vertical-align: middle; }
/*
  `table.data thead th` de mai sus e mai specific decat `.text-right` din
  Tailwind, deci un antet scris `class="text-right"` ramanea la stanga, iar
  coloana de sub el la dreapta (Last seen din Staff, durata din Ban / Gag list -
  15 antete in total). Alinierea antetului o spune clasa lui, ca la celule.
*/
table.data thead th.text-right { text-align: right; }
table.data thead th.text-center { text-align: center; }
table.data tbody tr:hover { background: rgb(var(--c-slate-400) / .045); }
table.data tbody tr:last-child td { border-bottom: 0; }

/*
  Scoreboard-ul de pe dashboard.

  Un server de 32 de sloti ar face cardul cat toata pagina, deci lista are o
  inaltime maxima si se deruleaza in interiorul ei. Capul de tabel ramane lipit
  sus - fara el, dupa cateva randuri nu mai stii ce inseamna coloana din dreapta.
*/
.scoreboard { max-height: 430px; overflow-y: auto; }
.scoreboard table.data thead th { position: sticky; top: 0; z-index: 2; }
.scoreboard::-webkit-scrollbar { width: 9px; }
.scoreboard::-webkit-scrollbar-thumb { background: rgb(var(--c-slate-400) / .18); border-radius: 99px; }
.scoreboard::-webkit-scrollbar-thumb:hover { background: rgb(var(--c-slate-400) / .3); }
.scoreboard::-webkit-scrollbar-track { background: transparent; }

.badge {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 9px; border-radius: 99px;
  font-size: 11px; font-weight: 700; letter-spacing: .02em;
  border: 1px solid transparent; white-space: nowrap;
}
.badge-frost  { background: rgb(var(--c-frost-500) / .14); color: rgb(var(--c-frost-on)); border-color: rgb(var(--c-frost-500) / .28); }
.badge-green  { background: rgb(var(--c-green) / .14); color: rgb(var(--c-green-on)); border-color: rgb(var(--c-green) / .3); }
.badge-yellow { background: rgb(var(--c-yellow) / .14); color: rgb(var(--c-yellow-on)); border-color: rgb(var(--c-yellow) / .3); }
.badge-red    { background: rgb(var(--c-red) / .14); color: rgb(var(--c-red-on)); border-color: rgb(var(--c-red) / .3); }
.badge-purple { background: rgb(var(--c-purple) / .14); color: rgb(var(--c-purple-on)); border-color: rgb(var(--c-purple) / .3); }
.badge-slate  { background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-400)); border-color: rgb(var(--c-slate-400) / .18); }

.dot { height: 7px; width: 7px; border-radius: 50%; display: inline-block; }
.dot-on  { background: rgb(var(--c-green)); box-shadow: 0 0 0 3px rgb(var(--c-green) / .18); }
.dot-off { background: rgb(var(--c-slate-600)); }

.flag-chip {
  display: inline-grid; place-items: center;
  height: 20px; min-width: 20px; padding: 0 3px;
  border-radius: 6px; background: rgb(var(--c-frost-500) / .12);
  border: 1px solid rgb(var(--c-frost-500) / .22);
  font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600; color: rgb(var(--c-frost-on));
}

/* ------------------------ Selector de flaguri --------------------- */

.flag-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(168px, 1fr)); gap: 7px; }
.flag-opt {
  display: flex; align-items: center; gap: 9px;
  padding: 7px 10px; border-radius: 9px; cursor: pointer;
  border: 1px solid rgb(var(--c-slate-400) / .12); background: rgb(var(--c-sunken) / .5);
  transition: all .14s ease;
}
.flag-opt:hover { border-color: rgb(var(--c-frost-500) / .35); background: rgb(var(--c-frost-500) / .07); }
.flag-opt input { display: none; }
.flag-opt .key {
  display: grid; place-items: center; height: 22px; width: 22px; flex-shrink: 0;
  border-radius: 6px; background: rgb(var(--c-slate-400) / .12); color: rgb(var(--c-slate-400));
  font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700;
}
.flag-opt .txt { font-size: 12px; color: rgb(var(--c-slate-400)); line-height: 1.25; }
.flag-opt.is-on { border-color: rgb(var(--c-frost-500) / .5); background: rgb(var(--c-frost-500) / .12); }
.flag-opt.is-on .key { background: rgb(var(--c-frost-500)); color: rgb(var(--c-ink-900)); }
.flag-opt.is-on .txt { color: rgb(var(--c-frost-hi)); }

/* ----------------------------- Modal ------------------------------ */

.modal { position: fixed; inset: 0; z-index: 80; display: none; }
.modal.is-open { display: block; }
.modal-backdrop { position: absolute; inset: 0; background: rgb(var(--c-shadow) / .74); backdrop-filter: blur(4px); }
.modal-panel {
  position: relative; z-index: 1;
  width: min(760px, calc(100vw - 28px));
  max-height: calc(100vh - 60px); overflow-y: auto;
  margin: 30px auto;
  border-radius: 18px; border: 1px solid rgb(var(--c-slate-400) / .14);
  background: linear-gradient(180deg, rgb(var(--c-ink-700)), rgb(var(--c-ink-800)));
  box-shadow: 0 40px 90px -30px rgb(var(--c-shadow) / .95);
  animation: pop .18s ease;
}
.modal-panel.is-sm { width: min(460px, calc(100vw - 28px)); }
@keyframes pop { from { opacity: 0; transform: translateY(12px) scale(.985); } }
.modal-head { display: flex; align-items: center; gap: 12px; padding: 18px 20px; border-bottom: 1px solid var(--line); }
/*
  Textul din antet ia tot locul ramas, nu doar cat ii trebuie (`mr-auto` singur).
  Cu latimea luata dupa continut, plafonul numelui din `.name-row` (100% - 3.25em)
  se socotea pe latimea numelui plus eticheta - si langa o eticheta scurta
  ("LGN") taia numele, desi fereastra avea loc (reclamat, "LYNN...").
*/
.modal-head > .mr-auto { flex: 1 1 auto; min-width: 0; }
.modal-body { padding: 20px; }
.modal-foot { display: flex; justify-content: flex-end; gap: 10px; padding: 16px 20px; border-top: 1px solid var(--line); }

/* ----------------------------- Toast ------------------------------ */

#toasts { position: fixed; right: 16px; bottom: 16px; z-index: 100; display: flex; flex-direction: column; gap: 9px; }
.toast {
  display: flex; align-items: flex-start; gap: 10px;
  min-width: 260px; max-width: 380px; padding: 12px 14px;
  border-radius: 12px; border: 1px solid var(--line);
  background: rgb(var(--c-ink-700) / .97); backdrop-filter: blur(8px);
  box-shadow: 0 20px 44px -22px rgb(var(--c-shadow) / .95);
  font-size: 13.5px; color: rgb(var(--c-slate-200));
  animation: slideIn .2s ease;
}
.toast.out { animation: slideOut .2s ease forwards; }
.toast.ok    { border-left: 3px solid rgb(var(--c-green)); }
.toast.err   { border-left: 3px solid rgb(var(--c-red)); }
.toast.warn  { border-left: 3px solid rgb(var(--c-yellow)); }
@keyframes slideIn { from { opacity: 0; transform: translateX(24px); } }
@keyframes slideOut { to { opacity: 0; transform: translateX(24px); } }

/* ------------------------ Taburi login/register ------------------- */

.auth-tab {
  padding: 13px 10px;
  border: 0; background: transparent; cursor: pointer;
  font-size: 13.5px; font-weight: 600; color: rgb(var(--c-slate-500));
  border-bottom: 2px solid transparent;
  transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.auth-tab:hover { color: rgb(var(--c-slate-300)); background: rgb(var(--c-slate-400) / .04); }
.auth-tab.is-active { color: rgb(var(--c-frost-hi)); border-bottom-color: var(--frost); background: rgb(var(--c-frost-500) / .06); }

.pass-toggle {
  position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  padding: 6px; border: 0; border-radius: 6px; background: transparent;
  color: rgb(var(--c-slate-500)); cursor: pointer;
}
.pass-toggle:hover { color: rgb(var(--c-slate-200)); }

/* ---------------------------- Diverse ----------------------------- */

.chart-box { position: relative; height: 330px; }
.chart-box.sm { height: 280px; }

/* Grupul de butoane tip "segment". Pe telefon nu incap toate pe un rand, deci
   se deruleaza pe orizontala in loc sa impinga pagina in lateral. */
.seg {
  display: inline-flex; padding: 3px;
  max-width: 100%; overflow-x: auto;
  border-radius: 11px; background: rgb(var(--c-sunken) / .7); border: 1px solid var(--line);
  scrollbar-width: none; -ms-overflow-style: none;
}
.seg::-webkit-scrollbar { display: none; }
.seg button {
  flex-shrink: 0;
  padding: 6px 14px; border-radius: 8px; border: 0; background: transparent; cursor: pointer;
  font-size: 12.5px; font-weight: 600; color: rgb(var(--c-slate-400)); transition: all .15s ease;
  white-space: nowrap;
}
.seg button:hover { color: rgb(var(--c-slate-200)); }
.seg button.is-active { background: rgb(var(--c-frost-500) / .18); color: rgb(var(--c-frost-hi)); }

.skeleton { background: linear-gradient(90deg, rgb(var(--c-slate-400) / .06), rgb(var(--c-slate-400) / .12), rgb(var(--c-slate-400) / .06)); background-size: 200% 100%; animation: shimmer 1.2s infinite; border-radius: 8px; }
@keyframes shimmer { to { background-position: -200% 0; } }

.empty { padding: 44px 20px; text-align: center; color: rgb(var(--c-slate-500)); }
.empty svg { margin: 0 auto 12px; height: 34px; width: 34px; opacity: .5; }

.mono { font-family: 'JetBrains Mono', monospace; }

/* ------------------------------------------------------------------
   Sectiuni noi: anunturi, regulament, sectiuni oprite, jurnal
------------------------------------------------------------------ */

/* Eticheta "off" din meniul lateral: sectiunea exista, dar un admin a oprit-o. */
.nav-off {
  margin-left: auto;
  padding: 2px 7px;
  border-radius: 99px;
  border: 1px solid rgb(var(--c-slate-400) / .24);
  background: rgb(var(--c-slate-400) / .1);
  color: rgb(var(--c-slate-400));
  font-size: 9.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
}

/* Text lung scris de admini (anunturi, descrierea unei reguli). */
.prose-panel { font-size: 14px; line-height: 1.7; color: rgb(var(--c-prose)); }
.prose-panel p { margin: 0 0 12px; }
.prose-panel p:last-child { margin-bottom: 0; }
.prose-panel strong, .prose-panel b { color: rgb(var(--c-slate-200)); font-weight: 600; }

/* Bara de filtre sub forma de pastile (anunturi, jurnal). */
.chip-row { display: flex; flex-wrap: wrap; gap: 7px; }
.chip {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 6px 13px; border-radius: 99px;
  border: 1px solid var(--line); background: rgb(var(--c-sunken) / .55);
  color: rgb(var(--c-slate-400)); font-size: 12.5px; font-weight: 600;
  cursor: pointer; transition: all .15s ease; white-space: nowrap;
}
.chip:hover { color: rgb(var(--c-slate-200)); border-color: rgb(var(--c-slate-400) / .28); }
.chip.is-active {
  border-color: rgb(var(--c-frost-500) / .5);
  background: rgb(var(--c-frost-500) / .14);
  color: rgb(var(--c-frost-hi));
}
.chip .count {
  padding: 0 6px; border-radius: 99px;
  background: rgb(var(--c-slate-400) / .14); color: rgb(var(--c-slate-400));
  font-size: 11px; font-weight: 700;
}
.chip.is-active .count { background: rgb(var(--c-frost-500) / .28); color: rgb(var(--c-frost-hi)); }

/* --------------------------- Anunturi ----------------------------- */

.news-item { position: relative; }
.news-item.is-pinned { border-color: rgb(var(--c-frost-500) / .28); }
.news-item.is-draft { border-style: dashed; opacity: .82; }
.news-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  font-size: 11.5px; color: rgb(var(--c-slate-500));
}
.news-meta .sep { color: rgb(var(--c-slate-700)); }

/* -------------------------- Regulament ---------------------------- */

.rule-row {
  display: flex; gap: 14px;
  padding: 14px 0;
  border-bottom: 1px solid rgb(var(--c-slate-400) / .06);
}
.rule-row:last-child { border-bottom: 0; padding-bottom: 0; }
.rule-row:first-child { padding-top: 0; }
.rule-code {
  flex-shrink: 0;
  min-width: 42px; height: 26px; padding: 0 8px;
  display: grid; place-items: center;
  border-radius: 8px;
  background: rgb(var(--c-frost-500) / .1);
  border: 1px solid rgb(var(--c-frost-500) / .2);
  font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700; color: rgb(var(--c-frost-on));
}
.rule-title { font-size: 14.5px; font-weight: 600; color: rgb(var(--c-slate-200)); line-height: 1.45; }
.rule-body { margin-top: 5px; font-size: 13px; line-height: 1.65; color: rgb(var(--c-slate-400)); }
/* Eticheta libera a unei reguli: "Gag 10 min", "Kick", "Ban permanent". */
.rule-tag {
  display: inline-flex; align-items: center; gap: 6px;
  margin-top: 8px; padding: 3px 9px;
  border-radius: 7px; border: 1px dashed rgb(var(--c-red) / .3);
  background: rgb(var(--c-red) / .08);
  font-size: 11.5px; font-weight: 600; color: rgb(var(--c-red-on));
}

/* Iconita din fata titlului unei reguli. */
.rule-icon {
  display: inline-grid; place-items: center;
  height: 20px; width: 20px; margin-right: 6px;
  vertical-align: -4px;
  color: rgb(var(--c-frost-500));
}
.rule-icon svg { height: 16px; width: 16px; }

/* Sectiunea de regulament, cu cap de tabel pe care se poate da clic. */
.section-head {
  display: flex; align-items: center; gap: 12px;
  width: 100%; padding: 16px 18px;
  background: transparent; border: 0; cursor: pointer; text-align: left;
  transition: background .15s ease;
}
.section-head:hover { background: rgb(var(--c-slate-400) / .04); }
.section-chevron { transition: transform .2s ease; color: rgb(var(--c-slate-500)); }
.section-head[aria-expanded="true"] .section-chevron { transform: rotate(180deg); }

/* --------------- Sectiune oprita ("Disabled by an administrator") --------------- */

.feature-off {
  position: relative; overflow: hidden;
  padding: 48px 26px 40px; text-align: center;
}
.feature-off::before {
  content: ''; position: absolute; inset: 0;
  background:
    radial-gradient(520px 260px at 50% -30%, rgb(var(--c-slate-400) / .14), transparent 70%),
    repeating-linear-gradient(135deg, rgb(var(--c-overlay) / .018) 0 12px, transparent 12px 24px);
  pointer-events: none;
}
.feature-off > * { position: relative; }
.feature-off-badge {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 13px; margin-bottom: 20px;
  border-radius: 99px;
  border: 1px solid rgb(var(--c-red) / .3);
  background: rgb(var(--c-red) / .1);
  color: rgb(var(--c-red-on)); font-size: 11.5px; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
}
.feature-off-icon {
  position: relative;
  display: grid; place-items: center;
  height: 80px; width: 80px; margin: 0 auto 22px;
  border-radius: 24px;
  background: rgb(var(--c-slate-400) / .08);
  border: 1px solid rgb(var(--c-slate-400) / .2);
  color: rgb(var(--c-slate-500));
}
.feature-off-icon > svg { height: 36px; width: 36px; }
.feature-off-lock {
  position: absolute; right: -8px; bottom: -8px;
  display: grid; place-items: center;
  height: 30px; width: 30px; border-radius: 50%;
  background: rgb(var(--c-red)); color: rgb(var(--c-ink-900));
  box-shadow: 0 0 0 4px rgb(var(--c-ink-800));
}
.feature-off-lock svg { height: 15px; width: 15px; }

.soon-card {
  padding: 16px;
  border-radius: 14px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .42);
  transition: border-color .15s ease, transform .15s ease;
}
.soon-card:hover { border-color: rgb(var(--c-frost-500) / .26); transform: translateY(-2px); }

/* ---------------------------- Jurnal ------------------------------ */

.log-console {
  max-height: 460px; overflow: auto;
  padding: 12px 14px;
  border-radius: 12px;
  background: #000000;
  border: 1px solid var(--line);
  font-family: 'JetBrains Mono', monospace; font-size: 11.5px; line-height: 1.75;
}
.log-line { display: flex; gap: 10px; white-space: pre-wrap; word-break: break-word; }
.log-line + .log-line { margin-top: 1px; }
.log-time { flex-shrink: 0; color: rgb(var(--c-slate-600)); }
.log-level { flex-shrink: 0; width: 46px; font-weight: 700; }
.log-scope { flex-shrink: 0; color: rgb(var(--c-purple)); }
.log-msg { color: rgb(var(--c-slate-300)); }
.log-meta { color: rgb(var(--c-slate-500)); }

.lvl-trace .log-level { color: rgb(var(--c-slate-600)); }
.lvl-debug .log-level { color: rgb(var(--c-frost-500)); }
.lvl-info  .log-level { color: rgb(var(--c-green)); }
.lvl-warn  .log-level { color: rgb(var(--c-yellow)); }
.lvl-error .log-level { color: rgb(var(--c-red)); }
.lvl-fatal .log-level { color: rgb(var(--c-text-hi)); background: rgb(var(--c-red)); border-radius: 4px; text-align: center; }
.lvl-warn  { background: rgb(var(--c-yellow) / .045); }
.lvl-error, .lvl-fatal { background: rgb(var(--c-red) / .07); }

/* Jurnalul de audit, ca lista verticala cu linie de timp. */
.audit-row { display: flex; gap: 13px; padding: 13px 0; border-bottom: 1px solid rgb(var(--c-slate-400) / .06); }
.audit-row:last-child { border-bottom: 0; }
.audit-icon {
  display: grid; place-items: center; flex-shrink: 0;
  height: 32px; width: 32px; border-radius: 10px;
  background: rgb(var(--c-frost-500) / .1); color: rgb(var(--c-frost-500));
}
.audit-row.is-warn .audit-icon { background: rgb(var(--c-yellow) / .12); color: rgb(var(--c-yellow-on)); }
.audit-row.is-error .audit-icon { background: rgb(var(--c-red) / .14); color: rgb(var(--c-red-on)); }
/* Eticheta actiunii (Autentificare, Delogare...).

   `.audit-row` e flex, iar implicit copiii se intind pe toata inaltimea randului:
   un `border-radius: 99px` pe un element inalt de 60px devine o pastila uriasa.
   De aceea se aliniaza sus si primeste dimensiuni proprii, mai mici. */
.audit-tag {
  align-self: flex-start;
  flex-shrink: 0;
  padding: 2px 8px;
  border-radius: 7px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .02em;
  white-space: nowrap;
}

.audit-details {
  margin-top: 7px; padding: 8px 10px;
  border-radius: 9px; background: rgb(var(--c-sunken) / .6); border: 1px solid var(--line);
  font-family: 'JetBrains Mono', monospace; font-size: 11px; color: rgb(var(--c-slate-400));
  white-space: pre-wrap; word-break: break-word;
}

/* Punct care pulseaza cat timp feed-ul live e pornit. */
.pulse { position: relative; }
.pulse::after {
  content: ''; position: absolute; inset: -4px; border-radius: 50%;
  border: 1px solid currentColor; opacity: .5;
  animation: pulse 1.8s ease-out infinite;
}
@keyframes pulse {
  from { transform: scale(.7); opacity: .7; }
  to { transform: scale(1.5); opacity: 0; }
}

/* ------------------------------------------------------------------
   Editorul de text (Quill) si continutul scris cu el
------------------------------------------------------------------ */

/*
   Quill vine cu tema "snow", gandita pentru fundal alb. Aici o aducem pe tema
   panelului. Regulile stau in app.css pentru ca el se incarca DUPA
   quill.snow.css si, la aceeasi specificitate, castiga.
*/

.editor-wrap {
  border-radius: 12px;
  border: 1px solid rgb(var(--c-slate-400) / .16);
  background: rgb(var(--c-sunken) / .75);
  overflow: hidden;
}

.ql-toolbar.ql-snow {
  border: 0 !important;
  border-bottom: 1px solid rgb(var(--c-slate-400) / .14) !important;
  background: rgb(var(--c-ink-700) / .9);
  padding: 8px;
}
.ql-container.ql-snow { border: 0 !important; font-family: inherit; }
.editor-area .ql-editor {
  min-height: 220px; max-height: 45vh;
  padding: 14px 16px;
  font-size: 14px; line-height: 1.7; color: rgb(var(--c-slate-300));
}
.editor-area .ql-editor.ql-blank::before { color: rgb(var(--c-slate-600)); font-style: normal; left: 16px; }

/* Butoanele si listele derulante din bara. */
.ql-snow .ql-stroke { stroke: rgb(var(--c-slate-400)); }
.ql-snow .ql-fill, .ql-snow .ql-stroke.ql-fill { fill: rgb(var(--c-slate-400)); }
.ql-snow .ql-picker { color: rgb(var(--c-slate-400)); }
.ql-snow .ql-picker-label { border-color: transparent; }
.ql-snow button:hover .ql-stroke,
.ql-snow .ql-picker-label:hover { color: rgb(var(--c-slate-200)); }
.ql-snow button:hover .ql-stroke { stroke: rgb(var(--c-frost-500)); }
.ql-snow button.ql-active .ql-stroke { stroke: rgb(var(--c-frost-500)); }
.ql-snow button.ql-active .ql-fill { fill: rgb(var(--c-frost-500)); }
.ql-snow .ql-picker-label.ql-active { color: rgb(var(--c-frost-500)); }

.ql-snow .ql-picker-options {
  background: rgb(var(--c-ink-700));
  border: 1px solid rgb(var(--c-slate-400) / .18) !important;
  border-radius: 10px;
  padding: 6px;
  box-shadow: 0 18px 40px -20px rgb(var(--c-shadow) / .9);
}
.ql-snow .ql-picker-item { color: rgb(var(--c-slate-300)); border-radius: 6px; padding: 3px 6px; }
.ql-snow .ql-picker-item:hover { background: rgb(var(--c-slate-400) / .12); color: rgb(var(--c-text-hi)); }

/* Selectorul de spatiere e adaugat de noi, deci are nevoie de etichete. */
.ql-snow .ql-picker.ql-lineheight { width: 74px; }
.ql-snow .ql-picker.ql-lineheight .ql-picker-label::before,
.ql-snow .ql-picker.ql-lineheight .ql-picker-item::before { content: 'Spatiere'; }
.ql-snow .ql-picker.ql-lineheight .ql-picker-label[data-value]::before,
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value]::before { content: attr(data-value); }

/* Numele fonturilor si marimilor, scrise omeneste in lista. */
.ql-snow .ql-picker.ql-font { width: 110px; }
.ql-snow .ql-picker.ql-size { width: 72px; }

/* Bara de unelte trebuie sa poata trece pe randul urmator pe telefon. */
.ql-toolbar.ql-snow .ql-formats { margin-right: 10px; }

/* Casuta de link a lui Quill. */
.ql-snow .ql-tooltip {
  background: rgb(var(--c-ink-700));
  border: 1px solid rgb(var(--c-slate-400) / .18);
  border-radius: 10px;
  box-shadow: 0 18px 40px -20px rgb(var(--c-shadow) / .9);
  color: rgb(var(--c-slate-300));
}
.ql-snow .ql-tooltip input[type=text] {
  background: rgb(var(--c-sunken) / .8);
  border: 1px solid rgb(var(--c-slate-400) / .2);
  border-radius: 7px; color: rgb(var(--c-slate-200)); padding: 4px 8px;
}

/*
   Indentarea o salveaza Quill ca aceste clase, nu ca stil inline, deci ele
   trebuie sa existe si in afara editorului - altfel textul indentat de admin
   ar aparea aliniat la stanga in pagina de regulament.
*/
.prose-panel .ql-indent-1 { padding-left: 3em; }
.prose-panel .ql-indent-2 { padding-left: 6em; }
.prose-panel .ql-indent-3 { padding-left: 9em; }
.prose-panel .ql-indent-4 { padding-left: 12em; }
.prose-panel .ql-indent-5 { padding-left: 15em; }
.prose-panel .ql-align-center { text-align: center; }
.prose-panel .ql-align-right { text-align: right; }
.prose-panel .ql-align-justify { text-align: justify; }

/* Restul marcajului scris in editor, afisat in pagina. */
.prose-panel ul, .prose-panel ol { margin: 0 0 12px; padding-left: 22px; }
.prose-panel ul { list-style: disc; }
.prose-panel ol { list-style: decimal; }
.prose-panel li { margin-bottom: 4px; }
.prose-panel blockquote {
  margin: 0 0 12px; padding: 8px 14px;
  border-left: 3px solid rgb(var(--c-frost-500) / .5);
  background: rgb(var(--c-frost-500) / .06);
  border-radius: 0 8px 8px 0;
  color: rgb(var(--c-prose));
}
.prose-panel a { color: rgb(var(--c-frost-500)); text-decoration: underline; text-underline-offset: 2px; }
.prose-panel a:hover { color: rgb(var(--c-frost-on)); }
.prose-panel h1, .prose-panel h2, .prose-panel h3, .prose-panel h4 {
  margin: 0 0 10px; color: rgb(var(--c-slate-200)); font-weight: 700; line-height: 1.3;
}
.prose-panel h1 { font-size: 20px; }
.prose-panel h2 { font-size: 18px; }
.prose-panel h3 { font-size: 16px; }
.prose-panel h4 { font-size: 15px; }
.prose-panel code {
  padding: 1px 5px; border-radius: 5px;
  background: rgb(var(--c-slate-400) / .12);
  font-family: 'JetBrains Mono', monospace; font-size: .92em; color: rgb(var(--c-frost-on));
}
.prose-panel hr { border: 0; border-top: 1px solid var(--line); margin: 14px 0; }

/* ------------------------------------------------------------------
   Ban list
------------------------------------------------------------------ */

.ban-id {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 2px 8px; border-radius: 7px;
  background: rgb(var(--c-sunken) / .7); border: 1px solid var(--line);
  font-family: 'JetBrains Mono', monospace; font-size: 11.5px; color: rgb(var(--c-frost-on));
}
.ban-id.is-ip { color: rgb(var(--c-yellow-on)); border-color: rgb(var(--c-yellow) / .25); }

/* Durata banului plus ora exacta de deblocare, una sub alta. */
.ban-when { display: inline-flex; flex-direction: column; align-items: flex-end; gap: 4px; }
td:not(.text-right) > .ban-when { align-items: flex-start; }

.ban-reason {
  display: block; max-width: 420px;
  color: rgb(var(--c-slate-400)); font-size: 13px;
  overflow-wrap: anywhere;
}

/*
  Lista publica (/bans): un rand = un buton care deschide detaliile. Aceeasi
  grila pentru capul listei si pentru randuri, ca coloanele sa se alinieze.
  Culoarea starii (permanent / temporar / expirat) sta pe `--bl`.
*/
.bl-head, .bl-row {
  display: grid; align-items: center; column-gap: 16px;
  grid-template-columns: 34px minmax(0, 1.25fr) minmax(0, 1.2fr) minmax(0, .75fr) 150px 16px;
  grid-template-areas: "mark main reason by when chev";
}
.bl-head {
  padding: 11px 18px; border-bottom: 1px solid var(--line);
  font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: rgb(var(--c-slate-500));
}
.bl-row {
  --bl: var(--c-yellow);
  width: 100%; padding: 12px 18px; text-align: left;
  border-bottom: 1px solid var(--line);
  transition: background .15s ease;
}
.bl-row:last-child { border-bottom: 0; }
/* Doar cu mouse: pe telefon `:hover` ramane lipit dupa atingere. */
@media (hover: hover) {
  .bl-row:hover { background: rgb(var(--c-overlay) / .035); }
}
.bl-row:focus-visible { outline: 2px solid rgb(var(--c-frost-500)); outline-offset: -2px; }
.bl-row.is-perm, .bl-mark.is-perm { --bl: var(--c-red); }
.bl-row.is-expired, .bl-mark.is-expired { --bl: var(--c-slate-500); }
.bl-row.is-expired .bl-name, .bl-row.is-expired .bl-reason { opacity: .6; }

.bl-mark {
  --bl: var(--c-yellow);
  grid-area: mark; display: grid; place-items: center;
  width: 34px; height: 34px; border-radius: 10px;
  background: rgb(var(--bl) / .14); color: rgb(var(--bl));
  box-shadow: inset 0 0 0 1px rgb(var(--bl) / .22);
}
.bl-row .bl-mark { --bl: inherit; }
.bl-mark.is-lg { width: 42px; height: 42px; border-radius: 12px; }

.bl-main { grid-area: main; display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.bl-name { min-width: 0; font-weight: 700; color: rgb(var(--c-slate-100)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bl-sub { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0; }
.bl-sub .ban-id { max-width: 100%; overflow: hidden; }
.bl-ago { font-size: 11.5px; color: rgb(var(--c-slate-500)); white-space: nowrap; }

.bl-reason {
  grid-area: reason; min-width: 0; font-size: 13px; color: rgb(var(--c-slate-300));
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  overflow-wrap: anywhere;
}
.bl-by { grid-area: by; min-width: 0; font-size: 13px; font-weight: 600; color: rgb(var(--c-slate-300)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bl-by-label, .bl-by-ago { display: none; }
.bl-when { grid-area: when; display: flex; flex-direction: column; align-items: flex-end; gap: 4px; }
.bl-until { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: rgb(var(--c-slate-500)); white-space: nowrap; }
.bl-chev { grid-area: chev; color: rgb(var(--c-slate-600)); transition: transform .15s ease, color .15s ease; }
.bl-row:hover .bl-chev { color: rgb(var(--c-slate-300)); transform: translateX(2px); }

/*
  Pe telefon fiecare ban e un card separat, fara coloana de iconita (lua un sfert
  din latime): starea se vede din bara colorata din stanga. Pe patru randuri:
  nume + durata, identitatea, motivul, "by admin · acum 5 minute".
  `.bl-main` devine `display: contents`, ca numele sa stea langa durata, dar
  SteamID-ul sa aiba tot randul de sub el.
*/
@media (max-width: 767px) {
  .bl-head { display: none; }
  .card.bl-card:has(.bl-row) { background: none; border: 0; box-shadow: none; overflow: visible; }
  .bl-list { display: grid; gap: 10px; }
  .bl-row {
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-areas: "name when" "sub sub" "reason reason" "by chev";
    row-gap: 8px; padding: 13px 14px 12px 15px;
    border: 1px solid var(--line); border-left: 3px solid rgb(var(--bl)); border-radius: 14px;
    background: linear-gradient(180deg, rgb(var(--c-ink-700) / .92), rgb(var(--c-ink-850) / .92));
    box-shadow: 0 14px 30px -24px rgb(var(--c-shadow) / .95);
  }
  .bl-row:last-child { border-bottom: 1px solid var(--line); }
  .bl-row .bl-mark { display: none; }
  .bl-main { display: contents; }
  .bl-name { grid-area: name; font-size: 15px; }
  .bl-sub { grid-area: sub; }
  .bl-sub .bl-ago { display: none; }
  .bl-reason { font-size: 13.5px; color: rgb(var(--c-slate-200)); }
  .bl-by { font-size: 12px; font-weight: 500; color: rgb(var(--c-slate-500)); }
  .bl-by-label, .bl-by-ago { display: inline; }
  .bl-by-label { margin-right: 4px; }
  .bl-by-ago { margin-left: 4px; }
  .bl-chev { justify-self: end; }
  .bl-until { display: none; }
}

/* Fereastra cu detaliile */
.bl-quote {
  padding: 12px 14px; border-radius: 12px;
  background: rgb(var(--c-sunken) / .6); border: 1px solid var(--line);
  border-left: 3px solid rgb(var(--c-frost-500));
}
.bl-quote-label { display: block; margin-bottom: 4px; font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: rgb(var(--c-slate-500)); }
.bl-quote p { font-size: 14px; color: rgb(var(--c-slate-100)); overflow-wrap: anywhere; }

.bl-facts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
.bl-fact {
  display: grid; grid-template-columns: 30px minmax(0, 1fr); grid-template-rows: auto auto; column-gap: 10px;
  padding: 10px 12px; border-radius: 12px;
  background: rgb(var(--c-sunken) / .45); border: 1px solid var(--line);
}
.bl-fact > svg, .bl-fact > i {
  grid-row: span 2; align-self: center;
  width: 30px; height: 30px; padding: 7px; border-radius: 9px;
  background: rgb(var(--c-frost-500) / .12); color: rgb(var(--c-frost-500));
}
.bl-fact-label { font-size: 11px; font-weight: 600; color: rgb(var(--c-slate-500)); }
.bl-fact-value { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 8px; min-width: 0; font-size: 13px; font-weight: 700; color: rgb(var(--c-slate-100)); overflow-wrap: anywhere; }
.bl-fact-value.is-muted { font-weight: 500; color: rgb(var(--c-slate-500)); }
.bl-fact-note { font-size: 11.5px; font-weight: 500; color: rgb(var(--c-slate-500)); }
.bl-copy {
  display: inline-grid; place-items: center; width: 24px; height: 24px; border-radius: 7px;
  color: rgb(var(--c-slate-400)); transition: background .15s ease, color .15s ease;
}
.bl-copy:hover { background: rgb(var(--c-overlay) / .08); color: rgb(var(--c-slate-100)); }

.bl-private {
  padding: 4px 14px; border-radius: 12px;
  border: 1px dashed rgb(var(--c-yellow) / .35); background: rgb(var(--c-yellow) / .05);
}
.bl-private-title { display: flex; align-items: center; gap: 6px; padding-top: 8px; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: rgb(var(--c-yellow-on)); }

@media (max-width: 520px) {
  .bl-facts { grid-template-columns: minmax(0, 1fr); }
}

/* Comutator dezactivat (ex: MCP cand ACP e deja bifat). */
.switch.is-disabled { cursor: not-allowed; opacity: .55; }
.switch.is-disabled .track { background: rgb(var(--c-ink-600)); }

/* ------------------------------------------------------------------
   Etichetele din listele derulante ale editorului
------------------------------------------------------------------ */

/*
   Tema "snow" isi scrie singura etichetele, cu `content`, si stie doar valorile
   ei implicite (Sans Serif / Serif / Monospace, Small / Normal / Large / Huge).
   Fonturile si marimile noastre nu sunt pe lista ei, asa ca toate cadeau pe
   eticheta implicita - de aici cele cinci randuri identice "Sans Serif".
   Fiecare valoare din public/js/editor.js are nevoie de randul ei aici.
*/

/* Fontul - valoarea goala inseamna "asa cum e restul panelului". */
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before { content: 'Implicit'; }

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Inter"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Inter"]::before { content: 'Inter'; font-family: Inter, sans-serif; }

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Georgia"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Georgia"]::before { content: 'Georgia'; font-family: Georgia, serif; }

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Arial"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Arial"]::before { content: 'Arial'; font-family: Arial, sans-serif; }

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Courier New"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Courier New"]::before { content: 'Courier New'; font-family: 'Courier New', monospace; }

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="JetBrains Mono"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="JetBrains Mono"]::before { content: 'JetBrains Mono'; font-family: 'JetBrains Mono', monospace; }

/* Marimea - scrisa in px, ca in editor. */
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before { content: 'Normala'; }

.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12px"]::before { content: '12'; }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14px"]::before { content: '14'; }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16px"]::before { content: '16'; }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18px"]::before { content: '18'; }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22px"]::before { content: '22'; }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28px"]::before { content: '28'; }

/* Lista de fonturi are nevoie de mai mult loc acum, ca numele sunt reale. */
.ql-snow .ql-picker.ql-font { width: 132px; }
.ql-snow .ql-picker.ql-font .ql-picker-options { width: 160px; }
.ql-snow .ql-picker.ql-size { width: 68px; }

/* ------------------------------------------------------------------
   Avertismente pentru staff
------------------------------------------------------------------ */

/* Pastila de langa nume, in bara de sus, cu propriile puncte: 2/3. */
.nav-warn {
  margin-left: auto;
  padding: 2px 7px;
  border-radius: 99px;
  border: 1px solid rgb(var(--c-red) / .32);
  background: rgb(var(--c-red) / .14);
  color: rgb(var(--c-red-on));
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px; font-weight: 700;
}

/*
   Punctele de avertisment, desenate ca bile: cate una pentru fiecare punct
   posibil (implicit trei). Un numar singur ("2") nu spune nimic despre prag;
   trei bile din care doua sunt aprinse se citesc dintr-o privire.
*/
.warn-pips { display: inline-flex; align-items: center; gap: 4px; }
.warn-pip {
  height: 9px; width: 9px; border-radius: 50%;
  background: rgb(var(--c-slate-400) / .16);
  border: 1px solid rgb(var(--c-slate-400) / .22);
  transition: background .18s ease, box-shadow .18s ease;
}
.warn-pip.is-on { background: rgb(var(--c-yellow)); border-color: rgb(var(--c-yellow) / .7); }
.warn-pip.is-hot { background: rgb(var(--c-orange)); border-color: rgb(var(--c-orange) / .75); }
.warn-pip.is-max {
  background: rgb(var(--c-red)); border-color: rgb(var(--c-red) / .85);
  box-shadow: 0 0 0 3px rgb(var(--c-red) / .16);
}
.warn-pips.sm .warn-pip { height: 7px; width: 7px; }

.warn-count { font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 700; color: rgb(var(--c-slate-400)); }
.warn-count.is-on { color: rgb(var(--c-yellow-on)); }
.warn-count.is-max { color: rgb(var(--c-red-on)); }

/* Un avertisment din lista (pagina de admin, contul meu, modalul de staff). */
.warn-item {
  display: flex; gap: 12px;
  padding: 13px 14px;
  border-radius: 13px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .45);
}
.warn-item + .warn-item { margin-top: 9px; }
.warn-item.is-active { border-color: rgb(var(--c-red) / .28); background: rgb(var(--c-red) / .05); }
.warn-item.is-done { opacity: .72; }
.warn-item .warn-mark {
  display: grid; place-items: center; flex-shrink: 0;
  height: 34px; width: 34px; border-radius: 11px;
  background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-400));
}
.warn-item.is-active .warn-mark { background: rgb(var(--c-red) / .14); color: rgb(var(--c-red-on)); }
.warn-reason { font-size: 13.5px; font-weight: 600; color: rgb(var(--c-slate-200)); line-height: 1.45; overflow-wrap: anywhere; }
.warn-note {
  margin-top: 6px; padding: 8px 10px;
  border-radius: 9px; background: rgb(var(--c-sunken) / .7); border: 1px solid var(--line);
  font-size: 12.5px; line-height: 1.6; color: rgb(var(--c-slate-400)); white-space: pre-wrap; overflow-wrap: anywhere;
}
.warn-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 7px;
  margin-top: 7px; font-size: 11.5px; color: rgb(var(--c-slate-500));
}
.warn-meta .sep { color: rgb(var(--c-slate-700)); }

/* ------------------------------------------------------------------
   Staff list
------------------------------------------------------------------ */

/* Antetul mare al paginii, cu cifrele echipei. */
.hero {
  position: relative; overflow: hidden;
  padding: 22px;
  border-radius: 18px;
  border: 1px solid var(--line);
  background:
    radial-gradient(620px 240px at 8% -40%, rgb(var(--c-frost-500) / .2), transparent 70%),
    radial-gradient(520px 240px at 95% 140%, rgb(var(--c-purple) / .14), transparent 70%),
    linear-gradient(180deg, rgb(var(--c-ink-700) / .95), rgb(var(--c-ink-850) / .95));
}
.hero > * { position: relative; }

.tile {
  padding: 13px 15px;
  border-radius: 14px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .5);
}
.tile-value { font-size: 22px; font-weight: 800; line-height: 1.1; color: rgb(var(--c-slate-50)); }
.tile-label { margin-top: 3px; font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: rgb(var(--c-slate-500)); }

/* Cardul unui membru din staff. */
.member {
  position: relative;
  display: flex; flex-direction: column; gap: 11px;
  padding: 14px;
  border-radius: 15px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .42);
  transition: border-color .16s ease, transform .16s ease, background .16s ease;
  text-align: left; width: 100%; cursor: pointer;
}
.member:hover { border-color: rgb(var(--c-frost-500) / .34); transform: translateY(-2px); background: rgb(var(--c-ink-850) / .6); }
.member.is-online { border-color: rgb(var(--c-green) / .22); }
.member.is-flagged { border-color: rgb(var(--c-yellow) / .26); }
.member.is-limit { border-color: rgb(var(--c-red) / .4); background: rgb(var(--c-red) / .06); }
.member.is-me::after {
  content: 'you';
  position: absolute; top: 10px; right: 12px;
  font-size: 9.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: rgb(var(--c-slate-500));
}

/* Avatarul cu inel: verde cand e online, sters cand nu. */
.member-avatar { position: relative; flex-shrink: 0; }
.member-avatar .avatar { height: 42px; width: 42px; border-radius: 13px; font-size: 14px; }
.member-avatar .ring {
  position: absolute; inset: -3px;
  border-radius: 16px; border: 1.5px solid transparent;
}
.member.is-online .member-avatar .ring { border-color: rgb(var(--c-green) / .55); }
.member-avatar .live {
  position: absolute; right: -2px; bottom: -2px;
  height: 11px; width: 11px; border-radius: 50%;
  border: 2px solid rgb(var(--c-ink-950)); background: rgb(var(--c-slate-600));
}
.member.is-online .member-avatar .live { background: rgb(var(--c-green)); }

.member-name { font-size: 14px; font-weight: 700; color: rgb(var(--c-slate-100)); line-height: 1.2; }
.member-sub { margin-top: 3px; font-size: 11.5px; color: rgb(var(--c-slate-500)); }

/* Randul de jos al cardului: puncte de avertisment + ultima activitate. */
/* `margin-top: auto`: cardurile de pe acelasi rand se intind la cel mai inalt,
   iar randul de jos statea sub continut, cu golul dedesubt (reclamat). */
.member-foot {
  margin-top: auto;
  display: flex; align-items: center; gap: 8px;
  padding-top: 10px; border-top: 1px solid rgb(var(--c-slate-400) / .07);
  font-size: 11px; color: rgb(var(--c-slate-500));
}

/* Medalia din capul unui grup de rank. */
.rank-medal {
  display: grid; place-items: center; flex-shrink: 0;
  height: 38px; width: 38px; border-radius: 13px;
  background: rgb(var(--c-frost-500) / .12); color: rgb(var(--c-frost-500));
  border: 1px solid rgb(var(--c-frost-500) / .2);
}
.rank-medal.tier-1 { background: rgb(var(--c-yellow) / .14); color: rgb(var(--c-yellow-on)); border-color: rgb(var(--c-yellow) / .3); }
.rank-medal.tier-2 { background: rgb(var(--c-purple) / .14); color: rgb(var(--c-purple-on)); border-color: rgb(var(--c-purple) / .3); }
.rank-medal.tier-3 { background: rgb(var(--c-frost-500) / .14); color: rgb(var(--c-frost-on)); border-color: rgb(var(--c-frost-500) / .3); }
.rank-medal.tier-4 { background: rgb(var(--c-green) / .14); color: rgb(var(--c-green-on)); border-color: rgb(var(--c-green) / .3); }

/* Lista de perechi eticheta / valoare din modale. */
.kv { display: grid; gap: 0; }
.kv > div {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 9px 0; border-bottom: 1px solid rgb(var(--c-slate-400) / .07);
  font-size: 13px;
}
.kv > div:last-child { border-bottom: 0; }
.kv dt { color: rgb(var(--c-slate-500)); }
.kv dd { color: rgb(var(--c-slate-300)); font-weight: 600; text-align: right; overflow-wrap: anywhere; }

/* Bara de unelte a unei pagini: cade pe mai multe randuri pe telefon. */
.toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.toolbar .grow { flex: 1 1 210px; min-width: 190px; }

/* ------------------------------------------------------------------
   Avatare incarcate de useri
------------------------------------------------------------------ */

/*
   `.avatar` era doar un patrat cu doua litere. Acum poate tine si o poza, deci
   ii trebuie `overflow: hidden` (altfel imaginea iese din coltul rotunjit) si o
   imagine care umple patratul indiferent de proportiile fisierului incarcat.
*/
.avatar { overflow: hidden; }
.avatar img { display: block; height: 100%; width: 100%; object-fit: cover; }

/* Zona de incarcare din pagina "My account". */
.avatar-drop {
  display: flex; align-items: center; gap: 16px;
  padding: 16px;
  border-radius: 16px;
  border: 1px dashed rgb(var(--c-slate-400) / .22);
  background: rgb(var(--c-sunken) / .35);
  transition: border-color .15s ease, background .15s ease;
}
.avatar-drop.is-over { border-color: rgb(var(--c-frost-500) / .55); background: rgb(var(--c-frost-500) / .06); }

.avatar-big {
  position: relative; flex-shrink: 0;
  display: grid; place-items: center;
  height: 88px; width: 88px;
  border-radius: 26px; overflow: hidden;
  background: linear-gradient(135deg, rgb(var(--c-frost-700)), rgb(var(--c-frost-500)));
  color: rgb(var(--c-ink-900)); font-size: 26px; font-weight: 800;
}
.avatar-big img { height: 100%; width: 100%; object-fit: cover; }

/* Bara de progres a upload-ului, subtire, sub zona de incarcare. */
.avatar-bar { height: 4px; border-radius: 99px; background: rgb(var(--c-slate-400) / .12); overflow: hidden; }
.avatar-bar > span {
  display: block; height: 100%; border-radius: 99px;
  background: linear-gradient(90deg, rgb(var(--c-frost-700)), rgb(var(--c-frost-500)));
  transition: width .18s ease;
}

/* ------------------------------------------------------------------
   Starea unui membru din staff: suspendat / retras
------------------------------------------------------------------ */

/*
   Un membru suspendat trebuie sa se vada dintr-o privire, fara sa citesti
   eticheta: cardul primeste o dunga in stanga, iar cel retras se estompeaza
   (e in echipa "pe hartie", nu in activitate).
*/
.member.is-suspended {
  border-color: rgb(var(--c-yellow) / .4);
  background: rgb(var(--c-yellow) / .045);
}
.member.is-retired {
  border-style: dashed;
  border-color: rgb(var(--c-slate-400) / .22);
  opacity: .72;
}
.member.is-suspended::before,
.member.is-retired::before {
  content: ''; position: absolute; left: 0; top: 14px; bottom: 14px;
  width: 3px; border-radius: 0 3px 3px 0;
  background: rgb(var(--c-yellow));
}
.member.is-retired::before { background: rgb(var(--c-slate-500)); }

/* Avatarul unui membru scos din joc: gri, ca sa nu para activ. */
.member.is-retired .member-avatar .avatar,
.member.is-retired .avatar img { filter: grayscale(1); }

/*
  Fundalul de profil pe cardul din staff. Sta sub continut (`isolation` +
  `z-index: -1`), nu intr-un ::before - alea sunt deja ale dungii de
  suspendat / retras si ale etichetei "you".

  Poza ocupa doar partea din dreapta si se stinge spre stanga (masca: conteaza
  doar opacitatea culorii, deci orice variabila a temei merge). Prima varianta
  o intindea pe tot cardul sub o perdea, iar o sigla alba din poza trecea
  exact peste randurile cu orele si activitatea.
*/
.member.has-bg { isolation: isolate; overflow: hidden; }
.member-bg {
  position: absolute; top: 0; right: 0; bottom: 0; left: 34%; z-index: -1;
  background: center / cover no-repeat;
  -webkit-mask-image: linear-gradient(90deg, transparent, rgb(var(--c-ink-900)) 55%);
  mask-image: linear-gradient(90deg, transparent, rgb(var(--c-ink-900)) 55%);
  transition: transform .5s ease;
}
.member-bg::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(0deg, rgb(var(--c-ink-850) / .9), rgb(var(--c-ink-850) / .2) 45%, rgb(var(--c-ink-850) / .1));
}
.member.has-bg .member-sub,
.member.has-bg .member-foot,
.member.has-bg.is-me::after { text-shadow: 0 1px 3px rgb(var(--c-shadow) / .95), 0 0 8px rgb(var(--c-shadow) / .6); }
.member.has-bg:hover .member-bg { transform: scale(1.05); }
.member.is-retired .member-bg { filter: grayscale(1); }
@media (prefers-reduced-motion: reduce) {
  html:not([data-motion="full"]) .member.has-bg:hover .member-bg { transform: none; }
}

/* Randul din istoric (aceeasi forma ca la avertismente, alta poveste). */
.status-item {
  display: flex; gap: 12px;
  padding: 13px 14px;
  border-radius: 13px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .45);
}
.status-item + .status-item { margin-top: 9px; }
.status-item.is-active { border-color: rgb(var(--c-yellow) / .32); background: rgb(var(--c-yellow) / .05); }
.status-item.is-retired.is-active { border-color: rgb(var(--c-slate-400) / .28); background: rgb(var(--c-slate-400) / .05); }
.status-item.is-done { opacity: .72; }
.status-item .status-mark {
  display: grid; place-items: center; flex-shrink: 0;
  height: 34px; width: 34px; border-radius: 11px;
  background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-400));
}
.status-item.is-active .status-mark { background: rgb(var(--c-yellow) / .14); color: rgb(var(--c-yellow-on)); }
.status-reason { font-size: 13.5px; font-weight: 600; color: rgb(var(--c-slate-200)); line-height: 1.45; overflow-wrap: anywhere; }
.status-note {
  margin-top: 6px; padding: 8px 10px;
  border-radius: 9px; background: rgb(var(--c-sunken) / .7); border: 1px solid var(--line);
  font-size: 12.5px; line-height: 1.6; color: rgb(var(--c-slate-400)); white-space: pre-wrap; overflow-wrap: anywhere;
}
.status-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 7px;
  margin-top: 7px; font-size: 11.5px; color: rgb(var(--c-slate-500));
}
.status-meta .sep { color: rgb(var(--c-slate-700)); }

/* Eticheta de langa nume, in bara de sus, cand propriul cont e suspendat sau retras. */
.nav-state {
  margin-left: auto;
  padding: 2px 7px;
  border-radius: 99px;
  border: 1px solid rgb(var(--c-yellow) / .32);
  background: rgb(var(--c-yellow) / .14);
  color: rgb(var(--c-yellow-on));
  font-size: 9.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
}
.nav-state.is-retired {
  border-color: rgb(var(--c-slate-400) / .26);
  background: rgb(var(--c-slate-400) / .12);
  color: rgb(var(--c-slate-400));
}

/* Banda de sus a paginii, cand contul tau e oprit din activitate. */
.state-banner {
  display: flex; gap: 14px; align-items: flex-start;
  padding: 16px 18px;
  border-radius: 16px;
  border: 1px solid rgb(var(--c-yellow) / .35);
  background:
    radial-gradient(520px 200px at 0% 0%, rgb(var(--c-yellow) / .12), transparent 70%),
    rgb(var(--c-sunken) / .5);
}
.state-banner.is-retired {
  border-color: rgb(var(--c-slate-400) / .28);
  background: radial-gradient(520px 200px at 0% 0%, rgb(var(--c-slate-400) / .1), transparent 70%), rgb(var(--c-sunken) / .5);
}
.state-banner .mark {
  display: grid; place-items: center; flex-shrink: 0;
  height: 42px; width: 42px; border-radius: 14px;
  background: rgb(var(--c-yellow) / .14); color: rgb(var(--c-yellow-on));
}
.state-banner.is-retired .mark { background: rgb(var(--c-slate-400) / .12); color: rgb(var(--c-slate-400)); }
/* Pe telefon: butonul / eticheta coboara pe randul lor, ca textul sa ia toata
   latimea (langa ele ramanea o coloana ingusta, cat jumatate de ecran, iar
   bannerul iesea de un ecran intreg - reclamat). Explicatia generala se ascunde. */
@media (max-width: 639.98px) {
  .state-banner { flex-wrap: wrap; gap: 10px 12px; padding: 14px; }
  .state-banner .mark { height: 34px; width: 34px; border-radius: 11px; }
  .state-banner .mark svg { height: 17px; width: 17px; }
  .state-banner-action { flex-basis: 100%; }
}

/* ------------------------------------------------------------------
   Nord Points: portofel, magazin, registru
------------------------------------------------------------------ */

/* ------------------------------ Magazin --------------------------- */

.shop-card {
  display: flex; flex-direction: column;
  padding: 16px;
  border-radius: 16px;
  border: 1px solid var(--line);
  background: rgb(var(--c-ink-850) / .5);
  transition: transform .18s ease, border-color .18s ease, background .18s ease;
}
.shop-card:hover { transform: translateY(-2px); border-color: rgb(var(--c-frost-500) / .3); }
/* Articolul evidentiat primeste o rama calda, nu un fundal aprins: cardurile
   stau unul langa altul si prea multa culoare le face pe toate egale. */
.shop-card.is-featured { border-color: rgb(var(--c-yellow) / .35); background: rgb(var(--c-yellow) / .04); }
.shop-card.is-locked { opacity: .62; }

.shop-icon {
  display: grid; place-items: center; flex-shrink: 0;
  height: 42px; width: 42px; border-radius: 13px;
}

.shop-price { font-size: 24px; font-weight: 800; line-height: 1; color: rgb(var(--c-slate-50)); }
.shop-price-old {
  font-size: 13px; font-weight: 600; color: rgb(var(--c-slate-600)); text-decoration: line-through;
}

/* Cantitatea: minus / camp / plus, pe un singur rand. */
.qty-row { display: flex; align-items: center; gap: 8px; }
.qty-row .input { flex: 1; min-width: 0; }
/* Sagetile native ale input[type=number] se bat cap in cap cu butoanele. */
.qty-row input[type=number] { -moz-appearance: textfield; }
.qty-row input[type=number]::-webkit-outer-spin-button,
.qty-row input[type=number]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

/* Previzualizarea tagului, asa cum arata in chatul din joc. */
.tag-preview {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin-top: 9px; padding: 9px 11px;
  border-radius: 10px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .7);
  font-size: 12.5px;
}
.tag-preview-label {
  font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: rgb(var(--c-slate-600));
}

/* ------------------------------ Comenzi --------------------------- */

.order-row {
  display: flex; gap: 12px; align-items: flex-start;
  padding: 13px 14px;
  border-radius: 13px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .45);
}
.order-row + .order-row { margin-top: 9px; }
.order-row.is-pending { border-color: rgb(var(--c-yellow) / .3); background: rgb(var(--c-yellow) / .05); }
.order-row.is-refunded { opacity: .68; border-style: dashed; }
.order-mark {
  display: grid; place-items: center; flex-shrink: 0;
  height: 34px; width: 34px; border-radius: 11px;
  background: rgb(var(--c-frost-500) / .12); color: rgb(var(--c-frost-on));
}
.order-row.is-pending .order-mark { background: rgb(var(--c-yellow) / .14); color: rgb(var(--c-yellow-on)); }
.order-row.is-refunded .order-mark { background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-400)); }
.order-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 7px;
  margin-top: 7px; font-size: 11.5px; color: rgb(var(--c-slate-500));
}
.order-meta .sep { color: rgb(var(--c-slate-700)); }

/* Randul unui articol in Admin Panel (mai compact decat cardul din magazin). */
.item-row {
  display: flex; gap: 12px; align-items: center;
  padding: 12px 14px;
  border-radius: 13px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .45);
}
.item-row.is-off { opacity: .6; border-style: dashed; }

/* ------------------------------ Registru -------------------------- */

/*
   Un rand de registru are mereu aceeasi forma: semn (intra / iese), ce s-a
   intamplat, si suma in dreapta. Culoarea o da directia banilor, nu felul
   miscarii - asa se citeste lista dintr-o privire, fara sa mai numeri.
*/
.ledger-row {
  display: flex; gap: 12px; align-items: flex-start;
  padding: 11px 2px;
  border-bottom: 1px solid rgb(var(--c-slate-400) / .06);
}
.ledger-row:last-child { border-bottom: 0; }
.ledger-mark {
  display: grid; place-items: center; flex-shrink: 0;
  height: 32px; width: 32px; border-radius: 10px;
}
.ledger-mark.is-in { background: rgb(var(--c-green) / .13); color: rgb(var(--c-green-on)); }
.ledger-mark.is-out { background: rgb(var(--c-red) / .13); color: rgb(var(--c-red-on)); }
.ledger-reason {
  margin-top: 3px; font-size: 12.5px; line-height: 1.5; color: rgb(var(--c-slate-400)); overflow-wrap: anywhere;
}
.ledger-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 7px;
  margin-top: 5px; font-size: 11.5px; color: rgb(var(--c-slate-500));
}
.ledger-meta .sep { color: rgb(var(--c-slate-700)); }

/* ---------------------- Cautarea unui destinatar ------------------ */

/*
   Lista de sub campul de cautare. Nu e un <select>: cu avatar si grad langa
   nume, nu ai cum sa trimiti puncte altui "Andrei" decat celui pe care il vrei.
*/
.lookup-list {
  margin-top: 7px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .8);
  overflow: hidden;
  max-height: 260px; overflow-y: auto;
}
.lookup-row {
  display: flex; align-items: center; gap: 11px; width: 100%;
  padding: 9px 11px;
  text-align: left;
  border-bottom: 1px solid rgb(var(--c-slate-400) / .06);
}
.lookup-row:last-child { border-bottom: 0; }
.lookup-row:hover { background: rgb(var(--c-frost-500) / .08); }
.lookup-row .avatar { height: 32px; width: 32px; font-size: 11px; }

/* ----------------------------- Clasament -------------------------- */

.board-row {
  display: flex; align-items: center; gap: 11px;
  padding: 9px 10px;
  border-radius: 12px;
  border: 1px solid transparent;
  background: rgb(var(--c-sunken) / .35);
}
.board-row:hover { border-color: rgb(var(--c-frost-500) / .22); background: rgb(var(--c-ink-850) / .6); }
.board-row.is-me { border-color: rgb(var(--c-frost-500) / .38); background: rgb(var(--c-frost-500) / .07); }
.board-row .avatar { height: 34px; width: 34px; font-size: 12px; }

/* Primele trei locuri sunt aur / argint / bronz; restul, discret. */
.board-place {
  display: grid; place-items: center; flex-shrink: 0;
  height: 24px; width: 24px; border-radius: 8px;
  background: rgb(var(--c-slate-400) / .1);
  border: 1px solid rgb(var(--c-slate-400) / .16);
  color: rgb(var(--c-slate-400));
  font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 700;
}
.board-place.place-1 { background: rgb(var(--c-yellow) / .16); border-color: rgb(var(--c-yellow) / .4); color: rgb(var(--c-yellow-on)); }
.board-place.place-2 { background: rgb(var(--c-slate-400) / .16); border-color: rgb(var(--c-slate-300) / .34); color: rgb(var(--c-slate-300)); }
.board-place.place-3 { background: rgb(var(--c-orange) / .16); border-color: rgb(var(--c-orange) / .38); color: rgb(var(--c-orange-on)); }

/* ------------------------------------------------------------------
   Roata norocului (/wheel)
   ------------------------------------------------------------------
   Roata insasi e un <canvas>: feliile, textul si beculetele sunt desenate
   in public/js/wheel.js, cu culorile din baza de date. Aici raman doar
   rama, sageata, butonul din centru si listele din jur.
   ------------------------------------------------------------------ */

.wheel-stage { position: relative; padding-top: 26px; }

/* Sageata sta DEASUPRA canvas-ului, nu in el: canvas-ul se roteste, ea nu. */
.wheel-pointer {
  position: absolute; top: 0; left: 50%; transform: translateX(-50%);
  z-index: 2;
  display: grid; place-items: center;
  height: 40px; width: 34px;
  border-radius: 12px 12px 6px 6px;
  background: linear-gradient(180deg, rgb(var(--c-yellow)), rgb(var(--c-orange)));
  color: rgb(var(--c-ink-900));
  box-shadow: 0 8px 18px -8px rgb(var(--c-shadow) / .9);
}
.wheel-pointer::after {
  content: ''; position: absolute; bottom: -9px;
  border-left: 9px solid transparent; border-right: 9px solid transparent;
  border-top: 10px solid rgb(var(--c-orange));
}

.wheel-frame {
  position: relative;
  margin: 0 auto;
  width: min(100%, 420px);
  aspect-ratio: 1 / 1;
}

.wheel-canvas {
  display: block; width: 100%; height: 100%;
  border-radius: 50%;
  /* Durata vine din .env (WHEEL_SPIN_SECONDS), legata inline din Alpine. */
  transition-property: transform;
  transition-timing-function: cubic-bezier(.13, .68, .21, 1);
  box-shadow: 0 0 0 1px rgb(var(--c-overlay) / .06), 0 26px 60px -24px rgb(var(--c-shadow) / 1);
}

/* Butonul din centru: se apasa direct pe roata, ca la roata adevarata. */
.wheel-hub {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  display: grid; place-items: center; gap: 2px;
  height: 27%; width: 27%;
  border-radius: 50%;
  border: 3px solid rgb(var(--c-slate-50) / .14);
  background: radial-gradient(circle at 35% 30%, rgb(var(--c-ink-400)), rgb(var(--c-ink-800)) 72%);
  color: rgb(var(--c-yellow));
  font-weight: 800;
  cursor: pointer;
  transition: transform .15s ease, border-color .15s ease, box-shadow .15s ease;
  box-shadow: 0 10px 26px -10px rgb(var(--c-shadow) / 1);
}
.wheel-hub:hover:not(:disabled) { transform: translate(-50%, -50%) scale(1.06); border-color: rgb(var(--c-yellow) / .5); }
.wheel-hub:disabled { opacity: .7; cursor: not-allowed; }
.wheel-hub.is-free { color: rgb(var(--c-green)); border-color: rgb(var(--c-green) / .45); }
.wheel-hub-text {
  display: block; margin-top: 2px;
  font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: .04em;
}

/* ------------------------ Lista de premii ------------------------- */

.prize-row {
  position: relative;
  display: flex; align-items: center; gap: 11px;
  padding: 10px 12px 10px 16px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .35);
  overflow: hidden;
}
.prize-row + .prize-row { margin-top: 8px; }
.prize-row.is-blocked { opacity: .55; }
.prize-row.is-jackpot { border-color: rgb(var(--c-yellow) / .4); background: rgb(var(--c-yellow) / .05); }

/* Dunga de culoare din stanga = culoarea feliei de pe roata. */
.prize-dot { position: absolute; left: 0; top: 0; bottom: 0; width: 4px; }

.prize-mark {
  display: grid; place-items: center; flex-shrink: 0;
  height: 36px; width: 36px; border-radius: 11px;
}
.prize-mark svg { height: 17px; width: 17px; }

/* ------------------------- Castigatorii --------------------------- */

.winner-card {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 11px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .35);
}
.winner-card.is-jackpot { border-color: rgb(var(--c-yellow) / .38); background: rgb(var(--c-yellow) / .06); }
.winner-card .avatar { height: 34px; width: 34px; font-size: 12px; }

/* ---------------------- Ce ai castigat (modal) -------------------- */

.prize-reveal {
  padding: 30px 22px 22px;
  text-align: center;
  border-bottom: 1px solid var(--line);
  background: radial-gradient(120% 90% at 50% 0%, rgb(var(--c-yellow) / .1), transparent 70%);
}
.prize-reveal.is-blank { background: radial-gradient(120% 90% at 50% 0%, rgb(var(--c-slate-400) / .08), transparent 70%); }
.prize-reveal.is-jackpot { background: radial-gradient(120% 90% at 50% 0%, rgb(var(--c-yellow) / .22), transparent 72%); }
.prize-reveal-mark {
  display: grid; place-items: center; margin: 0 auto;
  height: 74px; width: 74px; border-radius: 24px;
  border: 1px solid transparent;
}

/* ---------------------- Admin: feliile rotii ---------------------- */

.slice-row {
  display: flex; align-items: center; gap: 12px;
  padding: 11px 13px;
  border-radius: 13px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .35);
}
.slice-row.is-off { opacity: .55; border-style: dashed; }
.slice-swatch {
  flex-shrink: 0; height: 38px; width: 38px; border-radius: 12px;
  border: 1px solid rgb(var(--c-overlay) / .12);
}

/* Bara de sansa: cat din roata ocupa felia, la scara. */
.odds-bar { height: 6px; border-radius: 99px; background: rgb(var(--c-slate-400) / .12); overflow: hidden; }
.odds-bar > span { display: block; height: 100%; border-radius: 99px; }

.color-grid { display: flex; flex-wrap: wrap; gap: 7px; }
.color-opt {
  height: 30px; width: 30px; border-radius: 9px;
  border: 2px solid transparent;
  cursor: pointer;
}
.color-opt.is-on { border-color: rgb(var(--c-slate-50)); box-shadow: 0 0 0 3px rgb(var(--c-frost-500) / .25); }

/* ------------------------------------------------------------------
   Telefon: cardurile de sumar
   ------------------------------------------------------------------
   Fiecare pagina isi incepe cu un rand de `.stat-card` (`grid gap-4
   sm:grid-cols-2 xl:grid-cols-4`). Sub 640px, Tailwind nu pune nicio coloana,
   deci cad unul sub altul: patru carduri de cate ~280px inseamna peste 1100px
   de derulat inainte sa se vada primul lucru de pe pagina. Pe dashboard, adica
   pe pagina care se deschide prima.

   Se rezolva intr-un singur loc, cu `:has()`, in loc sa se umble la clasele
   fiecarei pagini: orice grila care CONTINE carduri de sumar trece pe doua
   coloane, iar cifrele si decorul se micsoreaza pe masura. Un browser fara
   `:has()` pur si simplu ramane cu un rand pe card, adica exact ce era.
------------------------------------------------------------------ */
@media (max-width: 639.98px) {
  .grid:has(> .stat-card) { grid-template-columns: 1fr 1fr; gap: 10px; }

  .stat-card { padding: 13px; }
  .stat-card .stat-value { font-size: 20px; }
  .stat-card .stat-label { font-size: 10px; letter-spacing: .07em; }
  /* Cercul decorativ e de 110px: pe un card de jumatate de ecran ar fi cardul. */
  .stat-card::after { height: 68px; width: 68px; right: -20px; top: -20px; }
  /* Patratul cu iconita din coltul din dreapta sus. */
  .stat-card [class*="h-10"][class*="w-10"] { height: 30px; width: 30px; border-radius: 9px; }
  .stat-card [class*="h-10"][class*="w-10"] svg { height: 15px; width: 15px; }
}

/* ------------------------------------------------------------------
   Infatisarea din panel: eticheta proprie si numele colorat
   ------------------------------------------------------------------
   Tot ce se vede aici vine din trei variabile puse pe element de server
   (`src/cosmetics.js`): --c1 (culoarea principala), --c2 (a doua culoare sau
   fundalul etichetei) si --c3 (marginea etichetei). Efectul vine din `data-fx`.

   De ce asa si nu cu clase Tailwind: Tailwind e compilat, deci o clasa
   construita din bucati (`'text-' + culoare`) pur si simplu nu exista
   (capcana #1). Culorile sunt alese de om, la rulare, deci singurul loc in
   care pot ajunge e CSS-ul - exact ca la feliile rotii.

   Cheile din `data-fx` sunt cele din catalogul de efecte. Daca adaugi una
   acolo, are nevoie de randul ei aici, altfel efectul "exista" si nu se vede.
------------------------------------------------------------------ */

.pname {
  display: inline-flex; align-items: center; gap: 5px;
  min-width: 0; max-width: 100%;
  vertical-align: bottom;
}
/* Iconita e <i data-lucide> pana o inlocuieste Lucide cu <svg>; clasa ramane. */
.pname-icon { height: 1em; width: 1em; flex: none; color: var(--c1); }
.pname-text {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--c1);
}

/*
  Efectele care coloreaza LITERELE folosesc background-clip: text, deci merg
  doar pe textul propriu-zis - iconita ramane pe --c1. Un gradient pus pe tot
  `.pname` ar taia si iconita, si ar iesi o pata.
*/
.pname[data-fx="gradient"] .pname-text,
.pname[data-fx="shine"] .pname-text,
.pname[data-fx="rainbow"] .pname-text {
  color: transparent;
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

.pname[data-fx="gradient"] .pname-text {
  background-image: linear-gradient(95deg, var(--c1), var(--c2));
}

.pname[data-fx="shine"] .pname-text {
  background-image: linear-gradient(100deg,
    var(--c1) 0%, var(--c1) 38%, #ffffff 50%, var(--c2) 62%, var(--c2) 100%);
  background-size: 260% 100%;
  animation: pname-sweep 3.4s ease-in-out infinite alternate;
}

.pname[data-fx="rainbow"] .pname-text {
  background-image: linear-gradient(90deg,
    rgb(var(--c-red)), rgb(var(--c-orange)), rgb(var(--c-yellow)), rgb(var(--c-green)), rgb(var(--c-frost-500)), rgb(var(--c-purple)), rgb(var(--c-red)));
  background-size: 300% 100%;
  animation: pname-sweep 5.5s ease-in-out infinite alternate;
}

.pname[data-fx="glow"] .pname-text,
.pname[data-fx="glow"] .pname-icon {
  text-shadow: 0 0 6px color-mix(in srgb, var(--c1) 60%, transparent),
               0 0 16px color-mix(in srgb, var(--c1) 30%, transparent);
}

.pname[data-fx="neon"] .pname-text {
  text-shadow: 0 0 2px rgb(var(--c-text-hi)),
               0 0 7px var(--c1),
               0 0 18px color-mix(in srgb, var(--c1) 70%, transparent),
               0 0 34px color-mix(in srgb, var(--c1) 40%, transparent);
  letter-spacing: .01em;
}
.pname[data-fx="neon"] .pname-icon { filter: drop-shadow(0 0 5px var(--c1)); }

.pname[data-fx="pulse"] { animation: pname-pulse 2.1s ease-in-out infinite; }
.pname[data-fx="flicker"] { animation: pname-flicker 3.6s steps(1, end) infinite; }

/*
  Sweep-ul merge dus-intors (`alternate`), nu in bucla.

  In bucla, ultimul cadru si primul arata cu totul altfel - degradeul e taiat in
  mijlocul lui -, deci la fiecare reluare numele isi schimba culoarea dintr-un
  salt. Dus-intors nu exista reluare, deci nu exista nici saltul, si nu trebuie
  potrivita latimea degradeului pe lungimea fiecarui nick.
*/
@keyframes pname-sweep {
  from { background-position: 0% 50%; }
  to   { background-position: 100% 50%; }
}
@keyframes pname-pulse {
  0%, 100% { opacity: 1; filter: drop-shadow(0 0 6px color-mix(in srgb, var(--c1) 45%, transparent)); }
  50%      { opacity: .62; filter: none; }
}
/*
  Un tub de neon defect nu palpaie ritmic: sta aprins mult si cade scurt, de
  cateva ori la rand. De aceea pasii sunt inegali - unii egali ar arata a
  animatie CSS, nu a bec stricat.
*/
@keyframes pname-flicker {
  0%, 41%, 43%, 45%, 52%, 96%, 100% { opacity: 1; }
  42%, 44%, 51%, 97% { opacity: .28; }
}

/*
  Numele si eticheta, unul langa altul, pe un rand ingust.

  Regula care conteaza e a doua: cand amandoua nu incap, ETICHETA cedeaza prima.
  Numele spune CINE e, eticheta doar ce e - un card pe care scrie "cin..." si
  "MODERATOR AL SERVE..." nu spune nimic despre niciunul.
*/
.name-row { display: flex; align-items: center; gap: 6px; min-width: 0; }
.name-row > :first-child {
  /* Fara grow: eticheta sta LANGA nume, nu impinsa in marginea din dreapta. */
  min-width: 0; flex: 0 1 auto;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/*
  Eticheta cedeaza TOATA, inainte ca numele sa piarda o litera.

  A fost `flex-shrink: 3`, si nu ajungea: flexbox imparte lipsa dupa
  `flex-shrink` INMULTIT cu latimea fiecaruia, deci o eticheta de 24 de litere
  (~230px) langa "Janel" (~40px) lua din nume destul cat sa ramana "Ja". Cu
  1000, eticheta absoarbe practic toata lipsa; numele se taie abia dupa ce ea
  a ajuns la cioturile de mai jos.

  Plafonul de pe nume (cand chiar exista o eticheta langa el) lasa etichetei
  macar iconita si o litera: un nume foarte lung nu o face sa dispara cu totul.
  Nu e plafonul vechi de 60% - acela taia eticheta si cand numele era scurt.

  `:not(:first-child)` nu e o subtilitate: `tagHtml` intoarce SIR GOL pentru un
  cont fara eticheta, deci acolo unde eticheta se pune direct (fara un <span>
  care sa ramana ca invelis gol), singurul copil ramas e numele - si ar fi luat
  el regula de eticheta. Din acelasi motiv plafonul cere o eticheta care nu e
  `:empty`: invelisul gol lasat de `x-html` nu are voie sa scurteze numele.
*/
.name-row > :last-child:not(:first-child) {
  min-width: 0; flex: 0 1000 auto;
  overflow: hidden;
}
.name-row:has(> :last-child:not(:first-child):not(:empty)) > :first-child {
  max-width: calc(100% - 3.25em);
}

/* ----------------------------- Eticheta --------------------------- */

.ptag {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 2px 9px; border-radius: 99px;
  font-size: 11px; font-weight: 800; letter-spacing: .03em; line-height: 1.55;
  white-space: nowrap; max-width: 100%;
  color: var(--c1);
  background: var(--c2);
  border: 1px solid var(--c3);
}
.ptag-icon { height: 12px; width: 12px; flex: none; }
.ptag > span { overflow: hidden; text-overflow: ellipsis; }
/* In tabele si pe randuri stranse: aceeasi eticheta, cu doua puncte mai mica. */
.ptag.sm { padding: 1px 7px; font-size: 10px; }
.ptag.sm .ptag-icon { height: 10px; width: 10px; }

.ptag[data-fx="glow"] {
  box-shadow: 0 0 12px color-mix(in srgb, var(--c1) 30%, transparent),
              inset 0 0 10px color-mix(in srgb, var(--c1) 12%, transparent);
  text-shadow: 0 0 8px color-mix(in srgb, var(--c1) 55%, transparent);
}
.ptag[data-fx="gradient"] { background-image: linear-gradient(135deg, var(--c2), var(--c3)); }
.ptag[data-fx="outline"] {
  background: transparent;
  border-color: var(--c1);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--c1) 22%, transparent);
}
.ptag[data-fx="pulse"] { animation: ptag-pulse 2.2s ease-in-out infinite; }

/*
  Sclipirea e o banda care trece peste eticheta, nu o schimbare de culoare:
  asa merge peste orice fundal ales de admin, inclusiv peste un gradient.
*/
.ptag[data-fx="shine"] { position: relative; overflow: hidden; }
.ptag[data-fx="shine"]::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(110deg, transparent 25%, rgba(255, 255, 255, .3) 50%, transparent 75%);
  transform: translateX(-130%);
  animation: ptag-sweep 3.6s ease-in-out infinite;
  pointer-events: none;
}

@keyframes ptag-pulse {
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--c1) 40%, transparent); }
  70%      { box-shadow: 0 0 0 6px color-mix(in srgb, var(--c1) 0%, transparent); }
}
@keyframes ptag-sweep {
  0%        { transform: translateX(-130%); }
  60%, 100% { transform: translateX(130%); }
}

/*
  Cineva care a cerut sistemului mai putina miscare nu a cerut-o doar pentru
  paginile noastre. Decorul ramane - culorile, gradientii, halourile -, se
  opreste doar ce se misca.
*/
@media (prefers-reduced-motion: reduce) {
  .pname[data-fx], .pname[data-fx] .pname-text,
  .ptag[data-fx], .ptag[data-fx]::after { animation: none !important; }
}

/* ------------------- Previzualizarea din formular ------------------ */

/*
  Fundalul in carouri nu e decor: o eticheta cu fundal inchis pe un card inchis
  pare fara fundal, iar adminul afla asta abia cand o vede pe alta pagina.
*/
.style-preview {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  border-radius: 12px;
  border: 1px solid rgb(var(--c-overlay) / .06);
  background:
    linear-gradient(0deg, rgb(var(--c-ink-800) / .72), rgb(var(--c-ink-800) / .72)),
    repeating-linear-gradient(45deg, rgb(var(--c-ink-600)) 0 8px, rgb(var(--c-ink-700)) 8px 16px);
  padding: 14px 16px;
  font-size: 15px; font-weight: 700; color: rgb(var(--c-slate-200));
}

.swatch-row { display: flex; flex-wrap: wrap; gap: 5px; align-items: center; }
.swatch {
  height: 20px; width: 20px; border-radius: 6px; padding: 0;
  border: 1px solid rgb(var(--c-overlay) / .14);
  cursor: pointer; transition: transform .12s ease, box-shadow .12s ease;
}
.swatch:hover { transform: scale(1.14); }
.swatch.is-on { box-shadow: 0 0 0 2px rgb(var(--c-ink-800)), 0 0 0 3px rgb(var(--c-frost-500)); }
/* Selectorul nativ de culoare, redus la un patrat ca restul randului. */
.swatch-native {
  height: 20px; width: 26px; padding: 0; border: 1px solid rgb(var(--c-overlay) / .14);
  border-radius: 6px; background: transparent; cursor: pointer;
}
.swatch-native::-webkit-color-swatch-wrapper { padding: 1px; }
.swatch-native::-webkit-color-swatch { border: none; border-radius: 4px; }

.icon-pick {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(30px, 1fr)); gap: 5px;
  max-height: 104px; overflow-y: auto; overscroll-behavior: contain;
  border-radius: 10px; border: 1px solid rgb(var(--c-overlay) / .05);
  background: rgb(var(--c-ink-800) / .45); padding: 6px;
}
.icon-pick button {
  display: grid; place-items: center; height: 30px; border-radius: 8px;
  color: rgb(var(--c-slate-400)); transition: background .12s ease, color .12s ease;
}
.icon-pick button:hover { background: rgb(var(--c-frost-500) / .1); color: rgb(var(--c-frost-on)); }
.icon-pick button.is-on { background: rgb(var(--c-frost-500) / .18); color: rgb(var(--c-frost-on)); }

/* ------------------------------------------------------------------
   Selectorul de tema, limba si afisare (views/partials/settings.ejs)
------------------------------------------------------------------ */

.set-title {
  display: flex; align-items: center; gap: 7px;
  font-size: 12px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  color: rgb(var(--c-slate-400));
}
.set-title svg { height: 14px; width: 14px; color: rgb(var(--c-frost-500)); }

.theme-grid,
.lang-grid {
  display: grid; gap: 8px; margin-top: 10px;
  grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
}

.theme-card,
.lang-card {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 11px; border-radius: 12px;
  border: 1px solid var(--line);
  background: rgb(var(--c-ink-700) / .7);
  transition: border-color .15s ease, background .15s ease;
}
.theme-card:hover,
.lang-card:hover { background: rgb(var(--c-ink-600) / .85); border-color: rgb(var(--c-frost-500) / .3); }
.theme-card.is-on,
.lang-card.is-on {
  border-color: rgb(var(--c-frost-500) / .55);
  background: rgb(var(--c-frost-500) / .1);
}

/*
  Trei dungi cu culorile temei: fundal, suprafata, accent.

  Un singur patrat colorat nu spune nimic - jumatate din teme au acelasi
  accent si difera doar prin cat de inchis e fundalul. Trei culori una langa
  alta arata exact diferenta dintre "True Black" si "Dracula".
*/
.theme-swatch {
  display: flex; height: 30px; width: 30px; flex: none;
  overflow: hidden; border-radius: 9px;
  border: 1px solid rgb(var(--c-overlay) / .12);
}
.theme-swatch > span { flex: 1; }

.theme-tick { height: 15px; width: 15px; flex: none; opacity: 0; color: rgb(var(--c-frost-500)); }
/* Culoarea rolului in exceptiile de teme; `--c1` e hex validat (models/roles.js). */
.theme-role-dot { height: 8px; width: 8px; flex: none; border-radius: 50%; background: var(--c1); }
.theme-card.is-on .theme-tick,
.lang-card.is-on .theme-tick { opacity: 1; }

.lang-flag {
  display: grid; place-items: center;
  height: 30px; width: 30px; flex: none;
  border-radius: 9px; background: rgb(var(--c-ink-500));
  font-size: 15px; font-weight: 700; color: rgb(var(--c-slate-300));
}

/* Butonul care arata ca accentul ramane cel al temei. */
.swatch:not([style]) {
  display: grid; place-items: center;
  background: rgb(var(--c-ink-500)); color: rgb(var(--c-slate-500));
}

.set-preview {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin-top: 10px; padding: 14px;
  border-radius: 12px; border: 1px solid var(--line);
  background: rgb(var(--c-ink-800) / .8);
}

/*
  Cursorul de marime a textului. `accent-color` face treaba singur in toate
  browserele care conteaza; un cursor desenat de mana ar fi insemnat opt reguli
  cu prefixe pentru acelasi rezultat.
*/
.range {
  width: 100%; height: 4px; padding: 0;
  accent-color: rgb(var(--c-frost-500));
  background: rgb(var(--c-slate-400) / .18);
  border-radius: 99px;
}

/* ================================================================== */
/*  Cazinou: masa de blackjack si cartile de joc                       */
/* ================================================================== */

/*
  Doua feluri de culoare pe pagina asta, si nu se amesteca:

  **Cartile** nu urmeaza tema (`--c-card-*`): o carte de joc e un obiect
  fizic, la fel pe orice masa din lume. La fel si jetoanele.

  **Masa** urmeaza tema SI accentul (`--c-felt`, `--c-felt-deep`), pentru ca e
  mobila din camera, nu obiect de joc - pe un panel mov, o masa verde sta ca un
  strain. De aceea textul de pe postav se scrie cu `--c-felt-ink`, si pastilele
  de pe el cu `--c-felt-panel`: pe o tema luminoasa postavul e deschis, si un
  text fildes pe el nu s-ar citi deloc. Clasele `text-slate-*` nu merg aici -
  alea sunt calculate pentru fundalul PAGINII, nu pentru postav.
*/

.bj-table {
  position: relative;
  overflow: hidden;
  padding: 14px 14px 12px;
  border-radius: 20px;
  border: 1px solid rgb(var(--c-overlay) / .09);
  color: rgb(var(--c-felt-ink));
  background:
    radial-gradient(115% 85% at 50% -10%, rgb(var(--c-felt) / .96), rgb(var(--c-felt-deep)) 72%);
  box-shadow:
    inset 0 0 90px rgb(var(--c-felt-deep) / .85),
    0 26px 60px -34px rgb(var(--c-shadow) / 1);
}

/* Tesatura postavului. Fara ea, masa arata a dreptunghi verde. */
.bj-table::before {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: .5;
  background-image:
    repeating-linear-gradient(45deg, rgb(var(--c-overlay) / .035) 0 1px, transparent 1px 3px),
    repeating-linear-gradient(-45deg, rgb(var(--c-overlay) / .035) 0 1px, transparent 1px 3px);
}

.bj-table > * { position: relative; }

.bj-muted { color: rgb(var(--c-felt-ink) / .62); }
.bj-dim { color: rgb(var(--c-felt-ink) / .66); }

/*
  Placuta de pe masa. La o masa adevarata regulile sunt SCRISE pe postav, nu
  intr-un meniu - de aceea si aici stau la vedere, intre dealer si jucator.
*/
.bj-legend {
  margin: 8px auto;
  max-width: 580px;
  text-align: center;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: rgb(var(--c-felt-ink) / .55);
  border-top: 1px solid rgb(var(--c-felt-ink) / .12);
  border-bottom: 1px solid rgb(var(--c-felt-ink) / .12);
  padding: 5px 10px;
  line-height: 1.6;
}

/* ------------------------- O carte de joc ------------------------- */

/*
  Totul inauntru se masoara in `--pc-h`, inaltimea cartii: asa aceeasi carte
  merge si de 120px pe desktop, si de 76px pe telefon, fara o a doua foaie de
  stiluri. Raportul 0.7 e cel adevarat (2.5 x 3.5 inch).
*/
.pcard {
  --pc-h: 112px;
  position: relative;
  flex: 0 0 auto;
  width: calc(var(--pc-h) * .7);
  height: var(--pc-h);
  border-radius: calc(var(--pc-h) * .075);
  background: rgb(var(--c-card-face));
  color: rgb(var(--c-card-ink));
  box-shadow:
    inset 0 0 0 1px rgb(var(--c-card-ink) / .16),
    0 8px 16px -8px rgb(var(--c-shadow) / .95);
  user-select: none;
}

.pcard.is-red { color: rgb(var(--c-card-red)); }

/* Spatele cartii: desenul incrucisat si chenarul alb, ca pe orice pachet. */
.pcard.is-back {
  color: rgb(var(--c-card-back-ink));
  background:
    repeating-linear-gradient(45deg, rgb(var(--c-card-back-ink) / .5) 0 2px, transparent 2px 6px),
    repeating-linear-gradient(-45deg, rgb(var(--c-card-back-ink) / .5) 0 2px, transparent 2px 6px),
    rgb(var(--c-card-back));
  box-shadow:
    inset 0 0 0 calc(var(--pc-h) * .035) rgb(var(--c-card-face)),
    inset 0 0 0 calc(var(--pc-h) * .045) rgb(var(--c-card-back) / .9),
    0 8px 16px -8px rgb(var(--c-shadow) / .95);
}

/*
  Indexul din colt: rangul, si sub el semnul.

  Doua colturi, nu patru (stanga-sus si dreapta-jos, intors), exact ca pe o
  carte adevarata - cu patru nu s-ar mai putea tine un evantai in mana. Cifrele
  sunt tabulare, ca "10" sa nu iasa mai lat decat celelalte si sa danseze de la
  o carte la alta.
*/
.pcard-corner {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  line-height: .86;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  font-size: calc(var(--pc-h) * .14);
  letter-spacing: -.03em;
}
.pcard-corner.is-tl { top: 3.5%; left: 5%; }
.pcard-corner.is-br { bottom: 3.5%; right: 5%; transform: rotate(180deg); }
/*
  Zecele e singurul rang scris cu doua caractere, deci singurul care poate da
  peste semnele de pe fata. Se scrie mai ingust, exact ca pe cartile adevarate,
  unde "10" e vizibil mai stramt decat celelalte.
*/
.pcard-corner b.is-wide { font-size: .78em; letter-spacing: -.07em; }
/* Semnul mic de sub rang. Are latimea lui, nu a unei litere. */
.pcard-mark {
  display: block;
  width: calc(var(--pc-h) * .09);
  height: calc(var(--pc-h) * .09);
  margin-top: calc(var(--pc-h) * .01);
  fill: currentColor;
}

/*
  Semnele de pe fata, pe o grila de 3 coloane si 13 randuri.

  Asezarea lor nu e inventata: e cea de pe cartile adevarate (patru colturi la
  4, doua coloane de trei la 6, doua coloane de patru plus doua la mijloc la
  10). Randurile din jumatatea de jos se deseneaza intoarse, tot ca pe carte.

  Marginile (13% sus-jos, 20% stanga-dreapta) nu sunt de ochi: coloana din
  stanga trebuie sa inceapa DUPA ce se termina indexul din colt. Fara ele, pe
  un 10 cele doua se suprapuneau cu a zecea parte din latimea cartii, si cartea
  arata inghesuita fara sa se vada de ce.
*/
.pcard-pips {
  position: absolute;
  inset: 13% 20%;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(13, 1fr);
  align-items: center;
  justify-items: center;
}
.pcard-pip {
  width: calc(var(--pc-h) * .128);
  height: calc(var(--pc-h) * .128);
  fill: currentColor;
}
.pcard-pip.is-flip { transform: rotate(180deg); }
/* Asul are un singur semn, mare, in mijloc. */
.pcard-pip.is-big { width: calc(var(--pc-h) * .3); height: calc(var(--pc-h) * .3); }

/*
  Figurile.

  Nu copiem gravura de pe o carte adevarata - la 80 de pixeli inaltime ar fi o
  pata. Se deseneaza ce se citeste si acolo: chenarul interior, silueta cu umeri
  si guler, si semnul distinctiv (coroana, diadema, palaria cu pana). Cartea e
  simetrica, ca cele adevarate: aceeasi silueta, o data in sus si o data
  intoarsa.
*/
.pcard-court { position: absolute; inset: 8% 11%; }
.pcard-art { display: block; width: 100%; height: 100%; overflow: hidden; }
.pcard-art .pc-frame {
  fill: rgb(var(--c-card-ink) / .03);
  stroke: currentColor;
  stroke-width: 1.4;
  opacity: .55;
}
/* Haina: culoarea cartii, spalata, ca sa nu innegreasca jumatate de carte. */
.pcard-art .pc-robe { fill: currentColor; opacity: .82; }
.pcard-art .pc-crown { fill: currentColor; }
.pcard-art .pc-face { fill: rgb(var(--c-card-face)); stroke: currentColor; stroke-width: 1.6; }
.pcard-art .pc-hair { fill: currentColor; }
.pcard-art .pc-eye { fill: currentColor; }
.pcard-art .pc-line { fill: none; stroke: rgb(var(--c-card-face)); stroke-width: 1.6; stroke-linecap: round; }
.pcard-art .pc-split { stroke: currentColor; stroke-width: 1.1; opacity: .4; }
.pcard-art .pc-split-mark { fill: currentColor; opacity: .55; }
/* Semnul de pe piept se vede pe haina, deci se scrie cu culoarea cartii. */
.pcard-art .pc-badge path { fill: rgb(var(--c-card-face) / .95); }

/*
  Numai cartile NOI se impart.

  `x-html` rescrie mana intreaga la fiecare schimbare de stare, deci o animatie
  pusa pe `.pcard` ar reporni-o pe TOATE cartile de fiecare data cand ceri una
  singura. Pagina tine minte ce carti au fost deja pe masa si pune clasa doar
  pe cele care chiar au venit acum (vezi public/js/blackjack.js).
*/
.pcard.is-new { animation: pcard-deal .38s cubic-bezier(.2, .8, .3, 1) both; }

@keyframes pcard-deal {
  from { opacity: 0; transform: translate(70%, -170%) rotate(14deg) scale(.92); }
  to { opacity: 1; transform: none; }
}

/* Cartea din gaura, la final: se rasuceste, nu se schimba brusc. */
.pcard.is-flip-in { animation: pcard-flip .5s cubic-bezier(.3, .7, .2, 1) both; }

@keyframes pcard-flip {
  0% { transform: rotateY(90deg) scale(1.04); }
  100% { transform: rotateY(0) scale(1); }
}

/* --------------------------- Mainile ------------------------------ */

/*
  Cartea de pe masa se masoara in latimea ecranului: pe telefon o mana de cinci
  carti trebuie sa incapa fara sa iasa pagina din ecran. Regula e mai specifica
  decat `.pcard`, deci castiga fara `!important`.
*/
/*
  Cartea se masoara si dupa inaltimea ferestrei, nu doar dupa latime: pe un
  laptop scund sau pe telefon, masa trebuie sa incapa intreaga in ecran, si
  cartile sunt cel mai mare consumator de inaltime de pe ea.

  Marimea se pune pe MASA, nu doar pe carti: `.bj-hand` isi calculeaza inaltimea
  tot din `--pc-h`, iar daca variabila sta doar pe `.pcard` el nu o vede si cade
  pe 112px - adica randul manii ramanea cu 30-60px de gol sub carti, la fiecare
  mana. Randul al doilea e tot necesar: `.pcard` isi declara singur marimea
  implicita, iar o declaratie pe element bate o valoare mostenita.
*/
.bj-table {
  --table-card: clamp(72px, min(12vw, 11.5vh), 100px);
  --pc-h: var(--table-card);
}
.bj-table .pcard { --pc-h: var(--table-card); }

.bj-spot { display: flex; flex-direction: column; align-items: center; gap: 6px; }

/* Randul dealerului: `mt-5` din view ar lasa 20px, prea mult pe un ecran scund. */
.bj-table > .bj-spot { margin-top: 10px; }

.bj-hand {
  display: flex;
  align-items: flex-start;
  min-height: calc(var(--pc-h, 112px) + 4px);
}
/* Cartile stau usor suprapuse, ca intr-o mana tinuta pe masa. */
.bj-hand .pcard + .pcard { margin-left: calc(var(--pc-h, 112px) * -.26); }
.bj-hand .pcard:nth-child(2n) { transform: rotate(.9deg); }
.bj-hand .pcard:nth-child(3n) { transform: rotate(-1.2deg); }

/* Locul jucatorului. Cand sunt mai multe maini (split), cea la rand se aprinde. */
.bj-seat {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: 6px 10px 8px;
  border-radius: 16px;
  border: 1px solid transparent;
  transition: border-color .2s ease, background-color .2s ease, transform .2s ease;
}
.bj-seat.is-active {
  border-color: rgb(var(--c-felt-ink) / .35);
  background: rgb(var(--c-felt-ink) / .06);
  box-shadow: 0 0 0 1px rgb(var(--c-felt-ink) / .08), 0 10px 30px -18px rgb(var(--c-shadow));
}
.bj-seat.is-done { opacity: .82; }
.bj-seat.is-bust { opacity: .6; }

/* Totalul mainii: pastila de sub carti. */
.bj-total {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 11px;
  border-radius: 999px;
  font-family: 'JetBrains Mono', monospace;
  font-size: 13px;
  font-weight: 700;
  background: rgb(var(--c-felt-panel) / .45);
  border: 1px solid rgb(var(--c-felt-ink) / .18);
  color: rgb(var(--c-felt-ink));
}
.bj-total.is-bust { background: rgb(var(--c-red) / .8); border-color: rgb(var(--c-red)); }
.bj-total.is-bj { background: rgb(var(--c-yellow) / .85); color: rgb(var(--c-felt-panel)); border-color: rgb(var(--c-yellow)); }
.bj-total.is-win { background: rgb(var(--c-green) / .8); border-color: rgb(var(--c-green)); }
.bj-total.is-push { background: rgb(var(--c-felt-panel) / .55); }

/* Totalul si jetonul, unul langa altul sub carti. */
.bj-pills { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; justify-content: center; }

/* Eticheta locului: DEALER / mana 1 din 2. */
.bj-seat-label {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: rgb(var(--c-felt-ink) / .5);
}

/* --------------------------- Jetoane ------------------------------ */

.bj-chip {
  position: relative;
  display: grid;
  place-items: center;
  height: 40px;
  width: 40px;
  border-radius: 50%;
  font-family: 'JetBrains Mono', monospace;
  font-size: 11.5px;
  font-weight: 700;
  cursor: pointer;
  color: rgb(var(--c-card-face));
  background: rgb(var(--chip, var(--c-chip-2)));
  /* Inelul intrerupt de pe marginea jetonului, ca la masa. */
  box-shadow:
    inset 0 0 0 3px rgb(var(--c-card-face) / .55),
    inset 0 0 0 4px rgb(var(--chip, var(--c-chip-2))),
    0 5px 12px -5px rgb(var(--c-shadow) / 1);
  transition: transform .14s ease, box-shadow .14s ease;
}
.bj-chip:hover:not(:disabled) { transform: translateY(-4px); }
.bj-chip:disabled { opacity: .38; cursor: not-allowed; }
.bj-chip.is-light { color: rgb(var(--c-card-ink)); }
.bj-chip-1 { --chip: var(--c-chip-1); }
.bj-chip-2 { --chip: var(--c-chip-2); }
.bj-chip-3 { --chip: var(--c-chip-3); }
.bj-chip-4 { --chip: var(--c-chip-4); }
.bj-chip-5 { --chip: var(--c-chip-5); }

/* Jetonul asezat pe masa: cat e pariul acum. */
.bj-bet {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 3px 12px 3px 5px;
  border-radius: 999px;
  background: rgb(var(--c-felt-panel) / .45);
  border: 1px solid rgb(var(--c-felt-ink) / .16);
  font-family: 'JetBrains Mono', monospace;
  font-size: 12.5px;
  font-weight: 700;
}

/* ------------------------- Butoanele mesei ------------------------ */

.bj-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
}

.bj-action {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 10px 16px;
  border-radius: 12px;
  font-size: 13.5px;
  font-weight: 700;
  cursor: pointer;
  color: rgb(var(--c-felt-ink));
  background: rgb(var(--c-felt-panel) / .5);
  border: 1px solid rgb(var(--c-felt-ink) / .22);
  transition: background-color .15s ease, border-color .15s ease, transform .1s ease;
}
.bj-action:hover:not(:disabled) { background: rgb(var(--c-felt-panel) / .72); border-color: rgb(var(--c-felt-ink) / .45); }
.bj-action:active:not(:disabled) { transform: translateY(1px); }
.bj-action:disabled { opacity: .35; cursor: not-allowed; }
.bj-action.is-primary {
  background: rgb(var(--c-yellow) / .9);
  border-color: rgb(var(--c-yellow));
  color: rgb(var(--c-felt-panel));
}
.bj-action.is-primary:hover:not(:disabled) { background: rgb(var(--c-yellow)); }
.bj-action.is-danger { border-color: rgb(var(--c-red) / .5); }
.bj-action.is-advised { box-shadow: 0 0 0 2px rgb(var(--c-green) / .55); }

/* Litera de pe tastatura, in coltul butonului. Mesele adevarate au semne, noi taste. */
.bj-key {
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  opacity: .5;
  border: 1px solid currentColor;
  border-radius: 4px;
  padding: 0 4px;
}


/* ------------------- Zonele care nu au voie sa sara ---------------- */

/*
  Masa isi pastreaza inaltimea, oricat s-ar schimba ce e pe ea.

  Fara regulile de aici, masa crestea cu ~236px in clipa in care se termina
  mana: apare mesajul, apare eticheta de rezultat pe loc, iar butoanele mainii
  (42px) sunt inlocuite de asezarea pariului (192px). Trei salturi deodata,
  exact cand omul se uita la carti.
*/

/* Locul mesajului, rezervat si cand nu e niciun mesaj. */
.bj-note {
  margin-top: 10px;
  /* Exact cat tine banner-ul (6+6 padding, 2 bordura, 19.5 randul de text): cu
     mai putin, masa sare cu cativa pixeli cand apare mesajul - adica fix ce
     trebuia sa rezolve locul rezervat. */
  min-height: 34px;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Eticheta de sub mana ("win", "lost"): tine locul si cand e goala. */
.bj-seat-result {
  min-height: 15px;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .14em;
  line-height: 1.25;
}

/*
  Butoanele mainii si asezarea pariului stau UNA PESTE ALTA, in aceeasi casuta
  de grila: inaltimea zonei e mereu a celei mai inalte dintre ele, la orice
  latime de ecran, fara nicio cifra scrisa de mana. De aceea cea nefolosita se
  ascunde cu `visibility` si nu cu `display: none` - altfel ar iesi din grila
  si nu ar mai tine locul (si asta e si motivul pentru care nu e `x-show`).
*/
.bj-controls {
  display: grid;
  /* Butoanele stau la mijlocul zonei rezervate: altfel golul de sub ele, cand
     randul e mai scurt decat asezarea pariului, arata a pagina neterminata. */
  align-items: center;
  margin-top: 10px;
}
.bj-controls > * { grid-area: 1 / 1; }
/* Schela locului gol: tine locul, dar nu se vede. */
.bj-total.is-ghost, .bj-bet.is-ghost { visibility: hidden; }

.bj-controls-layer.is-off {
  visibility: hidden;
  pointer-events: none;
}

/* --------------------------- Rezultatul --------------------------- */

.bj-banner {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  margin: 0 auto;
  padding: 6px 18px;
  border-radius: 999px;
  font-weight: 800;
  font-size: 13px;
  letter-spacing: .02em;
  background: rgb(var(--c-felt-panel) / .55);
  border: 1px solid rgb(var(--c-felt-ink) / .2);
  animation: bj-pop .32s cubic-bezier(.2, 1.4, .4, 1) both;
}
.bj-banner.is-win { background: rgb(var(--c-green) / .22); border-color: rgb(var(--c-green) / .65); }
.bj-banner.is-loss { background: rgb(var(--c-red) / .2); border-color: rgb(var(--c-red) / .55); }
.bj-banner.is-bj { background: rgb(var(--c-yellow) / .28); border-color: rgb(var(--c-yellow) / .8); }

@keyframes bj-pop {
  from { opacity: 0; transform: scale(.86); }
  to { opacity: 1; transform: scale(1); }
}

/* Sabotul si tava de carti jucate: cat s-a jucat pana la reamestecare. */
.bj-shoe {
  height: 5px;
  border-radius: 999px;
  overflow: hidden;
  background: rgb(var(--c-felt-panel) / .45);
}
.bj-shoe span {
  display: block;
  height: 100%;
  border-radius: 999px;
  background: rgb(var(--c-felt-ink) / .55);
  transition: width .4s ease;
}
/* Peste cartonasul de taiere: urmeaza reamestecarea. */
.bj-shoe.is-cut span { background: rgb(var(--c-yellow) / .8); }

/* Sfatul antrenorului, langa butoane. */
.bj-coach {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 4px 11px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
  color: rgb(var(--c-green-on));
  background: rgb(var(--c-green) / .14);
  border: 1px solid rgb(var(--c-green) / .35);
}

/* Randul unei maini din istoric (lista de sub masa si cea din Admin Panel). */
.bj-row {
  display: flex;
  gap: 12px;
  align-items: center;
  padding: 10px 13px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .45);
}
.bj-row + .bj-row { margin-top: 8px; }
.bj-row.is-win { border-color: rgb(var(--c-green) / .3); }
.bj-row.is-loss { border-color: rgb(var(--c-red) / .22); }
.bj-row.is-blackjack { border-color: rgb(var(--c-yellow) / .4); background: rgb(var(--c-yellow) / .05); }
/*
  Cartile din istoric sunt mici: acolo conteaza cifra, nu desenul. Marimea se
  pune pe tot RANDUL, nu doar pe .pcard: .bj-hand isi ia inaltimea minima din
  aceeasi variabila, si cat timp ea statea doar pe carti, randul cadea pe
  112px - adica ~70px de gol sub niste carti de 42 (reclamat, cu captura).
  Si pe .pcard ramane, pentru ca .pcard isi declara singur marimea implicita
  (aceeasi poveste ca la .bj-table).
*/
.bj-row, .bj-row .pcard { --pc-h: 42px; }
.bj-row .bj-hand .pcard + .pcard { margin-left: -11px; }

@media (max-width: 720px) {
  .bj-table { padding: 14px 10px 12px; }
  /* Pe telefon placuta ramane pe un rand: trei randuri de text sunt un sfert
     din inaltimea mesei, si regula intreaga oricum scrie in „House rules”. */
  .bj-legend { letter-spacing: .1em; font-size: 9.5px; }
  /* Antetul sabotului ramane pe un rand: rupt in doua, ia 20px degeaba. */
  .bj-shoe-line { letter-spacing: .1em; font-size: 9.5px; }
  .bj-legend br, .bj-legend-more { display: none; }
}

/*
  Cine a cerut sistemului mai putina miscare nu a cerut-o doar pentru paginile
  noastre: cartile apar instant, fara sa fie impartite si intoarse.
*/
@media (prefers-reduced-motion: reduce) {
  .pcard,
  .pcard.is-flip-in,
  .bj-banner { animation: none; }
}

/* ------------------------------------------------------------------
   Anotimpurile (public/js/season.js)
------------------------------------------------------------------ */

/*
  Doua panze fixe, peste tot ecranul, prin care nu trece niciun clic.

  Cea din spate sta la `z-index: -1`: deasupra fundalului paginii (al lui
  <body>, care se intinde pe tot ecranul), dar SUB interfata - fulgii de
  departe se vad doar printre carduri si, putin, prin sticla lor.

  Cea din fata sta peste pagina, dar SUB bara de sus (30), sub meniul lateral
  (50) si sub fundalul lui intunecat (40). La inceput era peste tot (60), iar
  pe telefon, cu meniul deschis, frunzele si luminitele cadeau peste lista de
  pagini - si peste meniul contului din bara de sus. Luminitele si turturii
  atarna SUB marginea barei, deci se vad in continuare; fulgii trec pe sub ea,
  ca pe sub o streasina.
*/
.season-layer {
  position: fixed; left: 0; top: 0;
  width: 100%; height: 100%;
  pointer-events: none;
}
.season-back { z-index: -1; }
.season-front { z-index: 29; }
@media print { .season-layer { display: none; } }

/*
  Nuanta fundalului, dupa anotimp. Atributul `data-season` il pune serverul pe
  <html> (si il scoate motorul cand contul isi opreste efectele), deci nuanta
  exista din primul cadru, fara nicio clipire.
*/
html[data-season="winter"] body,
html[data-season="holidays"] body {
  background:
    radial-gradient(1200px 560px at 50% -14%, rgb(var(--c-ice) / .10), transparent 65%),
    radial-gradient(900px 500px at 100% 0%, rgb(var(--c-frost-500) / .05), transparent 55%),
    var(--ink-900);
}
html[data-season="holidays"] body {
  background:
    radial-gradient(900px 480px at 8% -10%, rgb(var(--c-bulb-1) / .07), transparent 60%),
    radial-gradient(900px 480px at 92% -10%, rgb(var(--c-bulb-3) / .06), transparent 60%),
    var(--ink-900);
}
html[data-season="autumn"] body {
  background:
    radial-gradient(1100px 600px at 88% -12%, rgb(var(--c-leaf-2) / .08), transparent 60%),
    radial-gradient(900px 520px at 0% 110%, rgb(var(--c-leaf-4) / .05), transparent 60%),
    var(--ink-900);
}
html[data-season="spring"] body {
  background:
    radial-gradient(1100px 600px at 85% -12%, rgb(var(--c-petal-2) / .08), transparent 60%),
    radial-gradient(900px 520px at 5% 110%, rgb(var(--c-twig-leaf) / .05), transparent 60%),
    var(--ink-900);
}
html[data-season="summer"] body {
  background:
    radial-gradient(1200px 700px at 100% -10%, rgb(var(--c-sun) / .10), transparent 60%),
    radial-gradient(900px 500px at 0% 0%, rgb(var(--c-frost-500) / .04), transparent 55%),
    var(--ink-900);
}

/* --------------- Admin Panel -> Panel settings: anotimpul --------------- */

/* Fiecare anotimp isi aduce culoarea, ca variabila: o singura regula pentru toate. */
[data-s="auto"]     { --s: var(--c-frost-500); }
[data-s="off"]      { --s: var(--c-slate-400); }
[data-s="spring"]   { --s: var(--c-petal-2); }
[data-s="summer"]   { --s: var(--c-sun); }
[data-s="autumn"]   { --s: var(--c-leaf-2); }
[data-s="winter"]   { --s: var(--c-ice); }
[data-s="holidays"] { --s: var(--c-bulb-1); }

.season-grid {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
}
.season-pick {
  position: relative; overflow: hidden;
  display: flex; align-items: flex-start; gap: 12px;
  padding: 13px 14px; border-radius: 14px;
  border: 1px solid var(--line);
  background:
    linear-gradient(135deg, rgb(var(--s) / .12), transparent 62%),
    rgb(var(--c-ink-700) / .7);
  cursor: pointer; text-align: left;
  transition: border-color .15s ease, transform .15s ease, box-shadow .15s ease;
}
.season-pick:hover { border-color: rgb(var(--s) / .45); transform: translateY(-1px); }
.season-pick.is-on {
  border-color: rgb(var(--s) / .75);
  box-shadow: 0 0 0 3px rgb(var(--s) / .14), 0 16px 34px -24px rgb(var(--c-shadow) / .9);
}
.season-pick.is-on .theme-tick { opacity: 1; color: rgb(var(--s)); }
.season-pick-icon,
.season-badge {
  display: grid; place-items: center; flex: none;
  height: 38px; width: 38px; border-radius: 12px;
  background: rgb(var(--s) / .16);
  border: 1px solid rgb(var(--s) / .3);
  color: rgb(var(--s));
}
.season-badge { height: 42px; width: 42px; }
/* Pe hartie alba, galbenul soarelui si albul ghetii nu se vad ca text. */
.theme-light .season-pick-icon,
.theme-light .season-badge { color: rgb(var(--c-slate-200)); }

.season-calendar { display: flex; flex-wrap: wrap; gap: 8px; }
.season-cal-row {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 6px 11px; border-radius: 10px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .45);
  font-size: 12px;
}
.season-cal-row svg { color: rgb(var(--s)); }
.theme-light .season-cal-row svg { color: rgb(var(--c-slate-300)); }
.season-cal-row.is-now {
  border-color: rgb(var(--s) / .6);
  background: rgb(var(--s) / .12);
}

/* Eticheta "now" din selectorul de teme: tema care merge cu anotimpul de acum. */
.theme-now {
  flex: none;
  padding: 1px 6px; border-radius: 99px;
  background: rgb(var(--c-frost-500) / .16);
  color: rgb(var(--c-frost-hi));
  font-size: 9.5px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
}

/* --------------- Admin Panel -> Panel settings: sectiunile --------------- */

.feature-row {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; border-radius: 14px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .4);
  transition: border-color .15s ease, background .15s ease;
}
.feature-row.is-off {
  border-style: dashed;
  border-color: rgb(var(--c-red) / .3);
  background: rgb(var(--c-red) / .05);
}
.feature-row-icon {
  display: grid; place-items: center; flex: none;
  height: 36px; width: 36px; border-radius: 11px;
  background: rgb(var(--c-frost-500) / .14);
  color: rgb(var(--c-frost-500));
}
.feature-row.is-off .feature-row-icon { background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-500)); }
@media (max-width: 520px) {
  .feature-row { flex-wrap: wrap; }
}
/* ------------------------------------------------------------------
   Bara de sus: meniul contului
------------------------------------------------------------------ */

.topbar-actions { margin-left: auto; display: flex; align-items: center; gap: 8px; }

.user-menu { position: relative; }
.user-chip {
  display: flex; align-items: center; gap: 9px;
  height: 40px; padding: 3px 10px 3px 3px; border-radius: 12px;
  border: 1px solid var(--line);
  background: rgb(var(--c-slate-400) / .06);
  cursor: pointer; list-style: none; user-select: none;
  transition: background .15s ease, border-color .15s ease;
}
.user-chip::-webkit-details-marker { display: none; }
.user-chip::marker { content: ''; }
.user-chip:hover,
.user-menu[open] .user-chip { background: rgb(var(--c-slate-400) / .13); border-color: rgb(var(--c-slate-400) / .2); }
.user-chip .avatar { height: 32px; width: 32px; border-radius: 9px; font-size: 11px; }
.user-chip-text { display: flex; flex-direction: column; min-width: 0; max-width: 150px; line-height: 1.25; }
.user-chip-chev { height: 15px; width: 15px; color: rgb(var(--c-slate-500)); transition: transform .18s ease; }
.user-menu[open] .user-chip-chev { transform: rotate(180deg); }

.user-menu-panel {
  position: absolute; right: 0; top: calc(100% + 8px);
  width: 272px; padding: 6px;
  border-radius: 14px; border: 1px solid rgb(var(--c-slate-400) / .16);
  background: linear-gradient(180deg, rgb(var(--c-ink-700)), rgb(var(--c-ink-800)));
  box-shadow: 0 24px 60px -20px rgb(var(--c-shadow) / .95);
  animation: pop .14s ease;
}
.user-menu-head {
  display: flex; align-items: center; gap: 11px;
  margin-bottom: 4px; padding: 10px 10px 12px;
  border-bottom: 1px solid var(--line);
}
.user-menu-item {
  display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 8px 10px; border-radius: 9px; border: 0; background: transparent;
  color: rgb(var(--c-slate-300)); font-size: 13.5px; font-weight: 500; text-align: left; cursor: pointer;
  transition: background .12s ease, color .12s ease;
}
.user-menu-item svg { height: 16px; width: 16px; flex: none; color: rgb(var(--c-slate-500)); }
.user-menu-item:hover { background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-text-hi)); }
.user-menu-item:hover svg { color: rgb(var(--c-frost-500)); }
.user-menu-item.is-danger:hover { background: rgb(var(--c-red) / .12); color: rgb(var(--c-red-hi)); }
.user-menu-item.is-danger:hover svg { color: rgb(var(--c-red)); }
.user-menu-sep { height: 1px; margin: 5px 6px; background: var(--line); }

/* Pe telefon: doar avatarul (si pastila de avertismente, daca exista). */
@media (max-width: 639.98px) {
  .user-chip-text, .user-chip-chev { display: none; }
  .user-chip { padding: 3px; }
  .user-menu-panel { width: min(272px, calc(100vw - 24px)); }
}

/* ------------------------------------------------------------------
   Clopotelul (notificarile) - langa meniul contului
------------------------------------------------------------------ */

.notif-menu { position: relative; }
.notif-btn { position: relative; list-style: none; cursor: pointer; }
.notif-btn::-webkit-details-marker { display: none; }
.notif-btn::marker { content: ''; }
.notif-menu[open] .notif-btn { background: rgb(var(--c-slate-400) / .13); }
.notif-count {
  position: absolute; top: -4px; right: -4px;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;
  display: grid; place-items: center;
  background: rgb(var(--c-red)); color: rgb(var(--c-ink-900));
  font-size: 10.5px; font-weight: 800; line-height: 1;
  box-shadow: 0 0 0 2px rgb(var(--c-ink-800));
}
.notif-panel {
  position: absolute; right: 0; top: calc(100% + 8px);
  width: 340px; padding: 6px;
  border-radius: 14px; border: 1px solid rgb(var(--c-slate-400) / .16);
  background: linear-gradient(180deg, rgb(var(--c-ink-700)), rgb(var(--c-ink-800)));
  box-shadow: 0 24px 60px -20px rgb(var(--c-shadow) / .95);
  animation: pop .14s ease;
}
.notif-head {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px 10px; border-bottom: 1px solid var(--line);
}
.notif-clear {
  margin-left: auto; border: 0; background: transparent; cursor: pointer;
  font-size: 12px; font-weight: 600; color: rgb(var(--c-slate-500));
}
.notif-clear:hover { color: rgb(var(--c-frost-500)); }
.notif-list { max-height: min(420px, 70vh); overflow-y: auto; overscroll-behavior: contain; padding-top: 4px; }
.notif-item {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 9px 10px; border-radius: 10px;
  transition: background .12s ease;
}
.notif-item:hover { background: rgb(var(--c-slate-400) / .1); }
.notif-item.is-unread { background: rgb(var(--c-frost-500) / .08); }
.notif-item.is-unread:hover { background: rgb(var(--c-frost-500) / .14); }
.notif-icon { display: grid; place-items: center; flex: none; height: 30px; width: 30px; border-radius: 9px; }
.notif-icon svg { height: 15px; width: 15px; }
.notif-empty {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  padding: 26px 10px; font-size: 13px; color: rgb(var(--c-slate-500)); text-align: center;
}
.notif-empty svg { height: 22px; width: 22px; }

@media (max-width: 639.98px) {
  .notif-panel { position: fixed; left: 12px; right: 12px; top: 62px; width: auto; }
}

/* Numele ca link spre profil: arata ca numele, se subliniaza doar la hover. */
.plink { color: inherit; text-decoration: none; }
.plink:hover .pname-text, .plink:hover:not(:has(.pname)) { text-decoration: underline; text-underline-offset: 3px; }

/* ------------------------------------------------------------------
   Selectorul de teme incuiat (Appearance)
------------------------------------------------------------------ */

.theme-swatch-lg { height: 40px; width: 40px; border-radius: 11px; }
.theme-lock {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; border-radius: 12px;
  border: 1px dashed rgb(var(--c-slate-400) / .24);
  background: rgb(var(--c-sunken) / .35);
}

/* ------------------------------------------------------------------
   Admin Panel -> Themes
------------------------------------------------------------------ */

.mode-grid { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); }
.mode-pick {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 13px 14px; border-radius: 14px;
  border: 1px solid var(--line); background: rgb(var(--c-ink-700) / .7);
  cursor: pointer; text-align: left;
  transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.mode-pick:hover { border-color: rgb(var(--c-frost-500) / .4); transform: translateY(-1px); }
.mode-pick.is-on {
  border-color: rgb(var(--c-frost-500) / .7);
  box-shadow: 0 0 0 3px rgb(var(--c-frost-500) / .14);
}
.mode-pick.is-on .theme-tick { opacity: 1; }
.mode-pick-icon {
  display: grid; place-items: center; flex: none;
  height: 38px; width: 38px; border-radius: 12px;
  background: rgb(var(--c-frost-500) / .14); color: rgb(var(--c-frost-500));
}

.allow-grid { display: grid; gap: 6px; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); }
.allow-card {
  display: flex; align-items: center; gap: 9px;
  padding: 7px 10px; border-radius: 11px;
  border: 1px solid var(--line); background: rgb(var(--c-sunken) / .35);
  cursor: pointer; transition: border-color .15s ease, background .15s ease;
}
.allow-card input { accent-color: rgb(var(--c-frost-500)); }
.allow-card .theme-swatch { height: 24px; width: 24px; border-radius: 7px; }
.allow-card.is-on { border-color: rgb(var(--c-frost-500) / .45); background: rgb(var(--c-frost-500) / .08); }
.allow-card.is-locked { cursor: default; opacity: .85; }

.account-hit {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 9px; border-radius: 11px;
  border: 1px solid var(--line); background: rgb(var(--c-sunken) / .35);
}
.account-hit .avatar { height: 30px; width: 30px; border-radius: 9px; font-size: 11px; }

.custom-grid { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); }
.custom-card {
  overflow: hidden; border-radius: 14px;
  border: 1px solid var(--line); background: rgb(var(--c-sunken) / .35);
}
.custom-strip { display: flex; height: 34px; }
.custom-strip > span { flex: 1; }

.usage-row { display: flex; align-items: center; gap: 10px; }
.usage-row .theme-swatch { height: 22px; width: 22px; border-radius: 7px; }
.usage-bar { flex: 1; height: 8px; border-radius: 99px; background: rgb(var(--c-slate-400) / .1); overflow: hidden; }
.usage-bar > span {
  display: block; height: 100%; border-radius: 99px;
  background: linear-gradient(90deg, rgb(var(--c-frost-700)), rgb(var(--c-frost-500)));
  transition: width .4s ease;
}

.color-row {
  display: flex; align-items: center; gap: 11px;
  padding: 7px 9px; border-radius: 11px;
  border: 1px solid var(--line); background: rgb(var(--c-sunken) / .3);
}
.color-well {
  height: 34px; width: 42px; flex: none; padding: 0; cursor: pointer;
  border: 1px solid rgb(var(--c-overlay) / .16); border-radius: 9px; background: transparent;
}
.color-well::-webkit-color-swatch-wrapper { padding: 2px; }
.color-well::-webkit-color-swatch { border: none; border-radius: 6px; }

/*
  Cutia de previzualizare din editor. Variabilele temei se pun pe ea ca `style`,
  deci tot ce e inauntru (clasele obisnuite ale panelului) le citeste pe ale ei.
*/
.theme-preview {
  overflow: hidden; border-radius: 14px;
  border: 1px solid rgb(var(--c-overlay) / .1);
  background: rgb(var(--c-ink-900));
  color: rgb(var(--c-slate-200));
}
.theme-preview-bar {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px; font-size: 13px;
  border-bottom: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .78);
}

.read-check {
  display: flex; align-items: center; gap: 7px;
  padding: 6px 9px; border-radius: 9px; font-size: 12px;
}
.read-check.is-ok { background: rgb(var(--c-green) / .1); color: rgb(var(--c-green-on)); }
.read-check.is-low { background: rgb(var(--c-yellow) / .12); color: rgb(var(--c-yellow-on)); }


/* ------------------------------------------------------------------
   Ruleta (/casino/roulette)

   Roata e desenata pe <canvas> si se roteste din CSS, ca roata norocului
   (sageata si scena sunt aceleasi: .wheel-stage / .wheel-pointer). Masa e
   postavul blackjack-ului (.bj-table), cu buzunarele in culorile ROTII
   (--c-roul-*, fixe in toate temele - vezi TABLE_CSS din src/themes.js).

   Asezarea pe masa vine din variabile puse pe fiecare casuta (--c/--r pe
   desktop, --mc/--mr pe telefon): pe ecran ingust masa se intoarce pe
   verticala, ca la orice ruleta de telefon, fara doua liste de casute.
------------------------------------------------------------------ */

.rl-frame { position: relative; margin: 0 auto; width: min(100%, 340px); aspect-ratio: 1 / 1; }
.rl-canvas {
  display: block; width: 100%; height: 100%; border-radius: 50%;
  transition: transform 5s cubic-bezier(.12, .66, .2, 1);
  box-shadow: 0 0 0 1px rgb(var(--c-overlay) / .06), 0 26px 60px -24px rgb(var(--c-shadow) / 1);
}
.rl-hub {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  display: grid; place-items: center; height: 30%; width: 30%; border-radius: 50%;
  font-family: 'JetBrains Mono', monospace; font-weight: 800; font-size: clamp(20px, 6vw, 30px);
  color: rgb(var(--c-roul-ink));
  background: radial-gradient(circle at 35% 30%, rgb(var(--c-roul-rim)), rgb(var(--c-roul-black)) 75%);
  border: 3px solid rgb(var(--c-coin) / .55);
  transition: background .3s ease;
}
.rl-hub.is-red { background: rgb(var(--c-roul-red)); }
.rl-hub.is-black { background: rgb(var(--c-roul-black)); }
.rl-hub.is-green { background: rgb(var(--c-roul-green)); }

.rl-board {
  display: grid; gap: 3px;
  grid-template-columns: 40px repeat(12, minmax(0, 1fr)) 40px;
  grid-auto-rows: 38px;
}
.rl-cell {
  position: relative;
  grid-column: var(--c) / span var(--cs, 1);
  grid-row: var(--r) / span var(--rs, 1);
  display: grid; place-items: center; min-width: 0;
  border-radius: 6px; border: 1px solid rgb(var(--c-felt-ink) / .22);
  background: rgb(var(--c-felt-panel) / .18);
  color: rgb(var(--c-felt-ink)); font-size: 12px; font-weight: 700;
  cursor: pointer; user-select: none;
  transition: box-shadow .15s ease, filter .15s ease;
}
.rl-cell:hover:not(:disabled) { box-shadow: inset 0 0 0 2px rgb(var(--c-felt-ink) / .5); }
.rl-cell:disabled { cursor: not-allowed; }
.rl-cell.is-red, .rl-dot.is-red { background: rgb(var(--c-roul-red)); color: rgb(var(--c-roul-ink)); border-color: transparent; }
.rl-cell.is-black, .rl-dot.is-black { background: rgb(var(--c-roul-black)); color: rgb(var(--c-roul-ink)); border-color: transparent; }
.rl-cell.is-green, .rl-dot.is-green { background: rgb(var(--c-roul-green)); color: rgb(var(--c-roul-ink)); border-color: transparent; }
.rl-cell.is-hit { box-shadow: 0 0 0 3px rgb(var(--c-yellow)), 0 0 20px rgb(var(--c-yellow) / .6); z-index: 1; }
.rl-cell.is-dim { filter: brightness(.55) saturate(.6); }

/* Jetonul pus pe o casuta: cat e pariat acolo. */
.rl-stake {
  position: absolute; top: -7px; right: -5px; z-index: 2;
  display: grid; place-items: center; min-width: 22px; height: 22px; padding: 0 4px;
  border-radius: 999px; pointer-events: none;
  font-family: 'JetBrains Mono', monospace; font-size: 9.5px; font-weight: 800;
  background: rgb(var(--c-chip-2)); color: rgb(var(--c-card-face));
  box-shadow: 0 0 0 2px rgb(var(--c-card-face) / .85), 0 4px 8px -3px rgb(var(--c-shadow) / 1);
}
.rl-chip.is-on { box-shadow: 0 0 0 3px rgb(var(--c-felt-ink)), 0 0 0 5px rgb(var(--c-felt-deep)); transform: translateY(-4px); }

/* Numerele iesite: bulinele din istoric. Conturul fin tine bulina neagra vizibila pe o tema neagra. */
.rl-dot {
  display: inline-grid; place-items: center; flex: none;
  height: 28px; width: 28px; border-radius: 50%;
  font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 800;
  box-shadow: inset 0 0 0 1.5px rgb(var(--c-roul-ink) / .22);
}

@media (max-width: 639.98px) {
  .rl-board { grid-template-columns: 30px 34px repeat(3, minmax(0, 1fr)); grid-auto-rows: 30px; }
  .rl-cell {
    grid-column: var(--mc) / span var(--mcs, 1);
    grid-row: var(--mr) / span var(--mrs, 1);
  }
  .rl-cell.is-side { writing-mode: vertical-rl; font-size: 10.5px; }
  .rl-frame { width: min(100%, 280px); }
}

/* ------------------------------------------------------------------
   Crash (/casino/crash)
------------------------------------------------------------------ */

.cr-stage {
  position: relative; overflow: hidden;
  height: clamp(240px, 42vh, 380px);
  border-radius: 16px; border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .6);
}
.cr-canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
.cr-mult { position: absolute; inset: 0; display: grid; place-content: center; text-align: center; pointer-events: none; }
.cr-mult b {
  font-family: 'JetBrains Mono', monospace; font-size: clamp(42px, 9vw, 78px); font-weight: 800;
  letter-spacing: -.02em; line-height: 1; color: rgb(var(--c-slate-50));
}
.cr-mult small {
  display: block; margin-top: 8px;
  font-size: 11.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
  color: rgb(var(--c-slate-500));
}
.cr-mult.is-crashed b { color: rgb(var(--c-red)); }
.cr-mult.is-crashed small { color: rgb(var(--c-red-on)); }
.cr-mult.is-cashed small { color: rgb(var(--c-green-on)); }

/* Incasarea de pe curba: doar cand comenzile stau SUB curba (sub pragul xl al
   grilei din crash.ejs). Ascunderea e aici, nu `xl:hidden` in view: `.btn` din
   fisierul asta bate clasa lui Tailwind (capcana #10), iar butonul aparea si pe
   desktop, dublura celui din dreapta. Centrat cu margin, nu cu transform:
   `.btn:hover` isi pune singur transform-ul si l-ar muta la fiecare hover. */
.cr-quick { display: none; }
@media (max-width: 1279.98px) {
  .cr-quick {
    display: inline-flex; position: absolute; z-index: 2;
    left: 0; right: 0; bottom: 14px; width: max-content; margin: 0 auto; white-space: nowrap;
  }
}

.cr-strip { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; }
.cr-strip::-webkit-scrollbar { display: none; }
.cr-pill {
  flex: none; padding: 3px 9px; border-radius: 999px;
  font-family: 'JetBrains Mono', monospace; font-size: 11.5px; font-weight: 700;
  background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-400));
}
.cr-pill.is-low { background: rgb(var(--c-red) / .14); color: rgb(var(--c-red-on)); }
.cr-pill.is-mid { background: rgb(var(--c-green) / .14); color: rgb(var(--c-green-on)); }
.cr-pill.is-high { background: rgb(var(--c-yellow) / .16); color: rgb(var(--c-yellow-on)); }

/* ------------------------------------------------------------------
   Coinflip (/casino/coinflip)

   Moneda are doua fete intr-un spatiu 3D; aruncarea e o singura animatie
   care se opreste pe fata trasa de server (--turns, pus din JavaScript).
------------------------------------------------------------------ */

.cf-stage { perspective: 800px; }
.cf-coin {
  position: relative; margin: 0 auto;
  height: 132px; width: 132px;
  transform-style: preserve-3d;
}
.cf-coin.is-tails { transform: rotateY(180deg); }
.cf-coin.is-flipping { animation: cf-flip 1.7s cubic-bezier(.25, .1, .25, 1) forwards; }
@keyframes cf-flip {
  0% { transform: rotateY(0) translateY(0); }
  45% { transform: rotateY(calc(var(--turns) * .5)) translateY(-26px); }
  100% { transform: rotateY(var(--turns)) translateY(0); }
}
.cf-face {
  position: absolute; inset: 0; border-radius: 50%;
  display: grid; place-items: center;
  backface-visibility: hidden;
  color: rgb(var(--c-coin-ink));
  background: radial-gradient(circle at 35% 30%, rgb(var(--c-coin)), rgb(var(--c-coin-deep)) 82%);
  box-shadow:
    inset 0 0 0 6px rgb(var(--c-coin-deep)),
    inset 0 0 0 9px rgb(var(--c-coin) / .6),
    0 18px 34px -16px rgb(var(--c-shadow) / 1);
}
.cf-face svg { height: 44%; width: 44%; }
.cf-face.is-back { transform: rotateY(180deg); }

/* Moneda mica din liste: ce fata a ales cineva. */
.cf-mini {
  display: inline-grid; place-items: center; flex: none;
  height: 24px; width: 24px; border-radius: 50%;
  color: rgb(var(--c-coin-ink));
  background: radial-gradient(circle at 35% 30%, rgb(var(--c-coin)), rgb(var(--c-coin-deep)) 82%);
  box-shadow: inset 0 0 0 2px rgb(var(--c-coin-deep));
}
.cf-mini svg { height: 13px; width: 13px; }

@media (prefers-reduced-motion: reduce) {
  .rl-canvas { transition-duration: .01s; }
  .cf-coin.is-flipping { animation-duration: .01s; }
}

/* ------------------------------------------------------------------
   Profilul public: fundalul si melodia (/u/<id>)

   Fundalul apare de doua ori:
   - `.pf-bg`, in spatele paginii intregi (`z-index: -2`, sub panza din spate
     a anotimpurilor): poza estompata, cu o perdea din culoarea temei peste
     ea - culoarea ei curge prin cardurile de sticla, iar textul ramane
     citibil pe orice poza (pe o tema luminoasa perdeaua e luminoasa);
   - `.pf-cover`, coperta de sus: poza INTREAGA (`contain`) peste o copie a
     ei blurata care umple marginile. 16:9 pe toata latimea, deci pe telefon
     nu se taie nimic - inainte, fundalul fix pe tot ecranul arata doar o
     felie verticala din poza (reclamat).

   `--pf-tint` e culoarea dominanta a pozei, masurata in browser
   (client/profile.js); pana atunci, si fara poza, e accentul temei. Daca
   fisierul lipseste (e pe cealalta masina, vezi models/profiles.js), coperta
   trece pe varianta fara poza.
------------------------------------------------------------------ */

body { --pf-tint: var(--c-frost-500); }

.pf-bg { position: fixed; inset: 0; z-index: -2; overflow: hidden; pointer-events: none; will-change: transform; animation: pf-drift 48s ease-in-out infinite alternate; }
/* Blurul sta pe copil, miscarea pe parinte: asa stratul blurat se deseneaza o data, nu la fiecare cadru. */
.pf-bg-img { position: absolute; inset: -80px; background: center / cover no-repeat; filter: blur(28px) saturate(1.35); }
.pf-bg::after {
  content: ''; position: absolute; inset: 0;
  background:
    radial-gradient(130% 80% at 50% -10%, transparent 20%, rgb(var(--c-ink-900) / .6) 75%),
    linear-gradient(180deg, rgb(var(--c-ink-900) / .3), rgb(var(--c-ink-900) / .66) 55%, rgb(var(--c-ink-900) / .84));
}
@keyframes pf-drift { from { transform: scale(1.04) translate3d(-1.2%, -.8%, 0); } to { transform: scale(1.12) translate3d(1.2%, .8%, 0); } }

/* Cardurile de pe un profil cu poza: sticla, ca poza sa se vada prin ele. */
.pf-page.has-bg .card {
  background: linear-gradient(180deg, rgb(var(--c-ink-700) / .66), rgb(var(--c-ink-850) / .74));
  backdrop-filter: blur(16px) saturate(1.25);
  -webkit-backdrop-filter: blur(16px) saturate(1.25);
}
.pf-page.has-sound { padding-bottom: 40px; }

/* ----------------------------- Antetul ---------------------------- */

.pf-hero { position: relative; padding: 0; border-radius: 22px; }
.pf-page.has-bg .pf-hero { box-shadow: 0 30px 70px -34px rgb(var(--pf-tint) / .55), 0 18px 40px -26px rgb(var(--c-shadow) / .95); }

.pf-cover {
  position: relative; overflow: hidden; isolation: isolate;
  /* Chenarul are FORMA pozei (`--pf-ratio`, pusa de server din dimensiunile
     ei): poza il umple cap-coada, fara margini (cerut: "fa chenarul cat
     giful"). Doar la forme extreme se taie putin - vezi RATIO in profiles.js. */
  aspect-ratio: var(--pf-ratio, 16 / 9);
  background: rgb(var(--c-sunken));
}
/* `--pf-pos`: cand chenarul e scurtat, ce parte din poza ramane (aleasa de om). */
.pf-cover-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% var(--pf-pos, 50%); cursor: zoom-in; }
/* Sus o umbra pentru butoane, jos o trecere scurta spre card - poza ramane intreaga intre ele. */
.pf-cover-shade {
  position: absolute; inset: 0; pointer-events: none;
  background:
    linear-gradient(180deg, rgb(var(--c-scrim) / .34), transparent 18%),
    linear-gradient(0deg, rgb(var(--c-ink-800) / .55), transparent 11%);
}
/* Fara poza: o banda scurta, din accentul temei. */
.pf-cover.is-empty {
  aspect-ratio: auto; height: 132px;
  background:
    radial-gradient(520px 200px at 12% -20%, rgb(var(--c-frost-500) / .32), transparent 70%),
    radial-gradient(420px 220px at 92% 130%, rgb(var(--c-purple) / .24), transparent 70%),
    repeating-linear-gradient(135deg, rgb(var(--c-overlay) / .03) 0 14px, transparent 14px 28px),
    linear-gradient(180deg, rgb(var(--c-ink-600)), rgb(var(--c-ink-800)));
}
.pf-cover.is-empty .pf-cover-shade { background: linear-gradient(0deg, rgb(var(--c-ink-800) / .7), transparent 40%); }

.pf-cover-tools { position: absolute; top: 12px; right: 12px; z-index: 2; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
.pf-chip {
  display: inline-flex; align-items: center; gap: 7px; height: 34px; padding: 0 13px;
  border-radius: 999px; border: 1px solid rgb(var(--c-scrim-ink) / .18);
  background: rgb(var(--c-scrim) / .5); color: rgb(var(--c-scrim-ink));
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
  font-size: 12px; font-weight: 700; transition: background .15s ease, transform .15s ease;
}
.pf-chip:hover { background: rgb(var(--c-scrim) / .72); transform: translateY(-1px); }
.pf-chip svg { width: 15px; height: 15px; }

/* Avatarul iese din coperta; numele sta dedesubt, pe card, nu peste poza. */
/* Avatarul intra putin in poza: coperta e mica si fiecare rand de pixeli din ea conteaza. */
.pf-id { position: relative; z-index: 3; display: flex; flex-direction: column; gap: 14px; margin-top: -30px; padding: 0 16px; }
/* Avatarul in stanga, gradele lipite de marginea lui de jos, in dreapta. */
.pf-id-top { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; }
.pf-badges { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; min-width: 0; padding-bottom: 4px; }
.pf-actions { display: flex; flex-wrap: wrap; gap: 8px; }
/*
  Pe profil numele e titlul paginii: are tot randul si nu se taie niciodata
  (nu `.name-row`). Eticheta de clan e ascunsa aici - apare pe randul clanului
  (`.pf-clan`), altfel clanul s-ar vedea de doua ori, una sub alta.
*/
.pf-name { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0; line-height: 1.2; }
.pf-name .pname-text { white-space: normal; overflow-wrap: anywhere; }
.pf-name > span:first-child { min-width: 0; max-width: 100%; overflow-wrap: anywhere; }
.pf-name > .ctag { display: none; }
.pf-name .ctag + .ptag { margin-left: 0; }
.pf-clan {
  display: inline-flex; align-items: center; gap: 6px; max-width: 100%; margin-top: 8px;
  font-size: 13px; font-weight: 600; color: rgb(var(--c-slate-300));
}
.pf-clan:hover .pf-clan-name { color: rgb(var(--c-slate-100)); text-decoration: underline; }
.pf-clan > svg { width: 14px; height: 14px; flex: none; color: rgb(var(--c-slate-500)); }
.pf-clan-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pf-clan > .ctag, .pf-clan > span:last-child { flex: none; }
.pf-avatar {
  position: relative; overflow: visible;
  width: 84px; height: 84px; border-radius: 24px; font-size: 26px;
  box-shadow: 0 0 0 5px rgb(var(--c-ink-800)), 0 16px 36px -10px rgb(var(--pf-tint) / .7);
}
.pf-avatar img { border-radius: inherit; }
.pf-avatar-dot {
  position: absolute; right: -2px; bottom: -2px; width: 20px; height: 20px; border-radius: 999px;
  background: rgb(var(--c-green)); box-shadow: 0 0 0 4px rgb(var(--c-ink-800));
}
.pf-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 16px; padding: 12px 16px 16px; font-size: 12px; color: rgb(var(--c-slate-500)); }
.pf-meta > span { min-width: 0; max-width: 100%; }

/*
  Asezarea paginii: O SINGURA grila, fara goluri (cerut: "fa cardul ca pe
  telefon, dar nu lasa locuri goale pe pagina").

  Cardul de profil e acelasi peste tot - cel de pe telefon, cu poza INTREAGA
  in coperta 16:9. Pe un ecran lat sta in stanga, iar in dreapta graficul pe
  14 zile, intins la exact inaltimea cardului (`stretch` + panza care creste);
  dedesubt cifrele si cazinoul, pe toata latimea. Pe telefon: unul sub altul,
  in ordinea de dinainte.

  Latimile se masoara pe PAGINA (container query), nu pe ecran: de la 1024px
  meniul lateral ia 262px. Drumul pana aici, cu toate variantele refuzate, e
  in CLAUDE.md.
*/
.pf-page { container-type: inline-size; }
.pf-grid { display: grid; gap: 20px; grid-template-columns: minmax(0, 1fr); grid-template-areas: "hero" "stats" "chart" "ach" "casino"; }
.pf-hero { grid-area: hero; }
.pf-stats { grid-area: stats; display: grid; gap: 16px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.pf-chart { grid-area: chart; display: flex; flex-direction: column; }
.pf-casino { grid-area: casino; }
.pf-chart .card-body { flex: 1; display: flex; flex-direction: column; }
/* Panza nu are voie sa impinga cardul: sta absolut in cutia care creste. */
.pf-chart-canvas { position: relative; flex: 1 1 auto; min-height: 208px; }
.pf-chart-canvas canvas { position: absolute; inset: 0; }
.pf-games { display: grid; gap: 8px; }
.pf-games > .empty { grid-column: 1 / -1; }
@container (min-width: 700px) {
  .pf-grid {
    grid-template-columns: clamp(300px, 34cqi, 460px) minmax(0, 1fr);
    grid-template-areas: "hero chart" "stats stats" "ach ach" "casino casino";
  }
  .pf-games { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
}
@container (min-width: 900px) {
  .pf-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* ------------------- Ce canta: cartonasul din colt ----------------- */

.pf-np {
  position: fixed; right: 18px; bottom: 18px; z-index: 29;
  width: min(370px, calc(100vw - 36px));
  display: grid; grid-template-columns: 58px minmax(0, 1fr) auto auto; align-items: center; gap: 12px;
  padding: 10px 12px 13px 10px; border-radius: 20px; overflow: hidden;
  border: 1px solid var(--line);
  background:
    radial-gradient(260px 120px at 0% 0%, rgb(var(--pf-tint) / .26), transparent 70%),
    rgb(var(--c-ink-800) / .9);
  backdrop-filter: blur(18px) saturate(1.3); -webkit-backdrop-filter: blur(18px) saturate(1.3);
  box-shadow: 0 22px 50px -16px rgb(var(--c-shadow) / .7), 0 0 0 1px rgb(var(--pf-tint) / .1);
  animation: pf-np-in .5s cubic-bezier(.2, .9, .3, 1.2) both;
}
@keyframes pf-np-in { from { opacity: 0; transform: translateY(24px) scale(.96); } }
.pf-np-cover {
  position: relative; width: 58px; height: 58px; border-radius: 14px; overflow: hidden;
  display: grid; place-items: center;
  background: linear-gradient(135deg, rgb(var(--c-frost-700)), rgb(var(--c-frost-500))); color: rgb(var(--c-ink-900));
  box-shadow: 0 10px 22px -10px rgb(var(--pf-tint) / .9);
}
.pf-np-cover img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .6s ease; }
.pf-np-cover-icon svg { width: 24px; height: 24px; }
.pf-np.is-playing .pf-np-cover img { animation: pf-breathe 3.6s ease-in-out infinite; }
@keyframes pf-breathe { 50% { transform: scale(1.08); } }
.pf-np-text { min-width: 0; line-height: 1.3; }
.pf-np-label { display: flex; align-items: center; gap: 7px; font-size: 10px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; color: rgb(var(--c-frost-500)); }
.pf-np-time { margin-left: auto; font-size: 10px; font-weight: 600; letter-spacing: 0; text-transform: none; color: rgb(var(--c-slate-500)); }
.pf-np-title { display: block; margin-top: 2px; font-size: 14px; color: rgb(var(--c-slate-50)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pf-np-artist { display: block; font-size: 12px; color: rgb(var(--c-slate-400)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pf-np-src { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: rgb(var(--c-slate-500)); transition: all .15s ease; }
.pf-np-src:hover { color: rgb(var(--c-text-hi)); background: rgb(var(--c-slate-400) / .12); }
.pf-np-src svg { width: 15px; height: 15px; }
.pf-np-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: rgb(var(--c-slate-400) / .14); }
.pf-np-bar span { display: block; height: 100%; width: 0; background: linear-gradient(90deg, rgb(var(--c-frost-500)), rgb(var(--pf-tint))); transition: width .35s linear; }

.pf-sound-btn {
  flex: none; display: grid; place-items: center; width: 42px; height: 42px; border-radius: 999px;
  background: linear-gradient(135deg, rgb(var(--c-frost-500)), rgb(var(--c-frost-700))); color: rgb(var(--c-ink-900));
  box-shadow: 0 8px 20px -8px rgb(var(--c-frost-500) / .9); transition: transform .15s ease;
}
.pf-sound-btn:hover { transform: scale(1.06); }
.pf-sound-btn svg { width: 18px; height: 18px; }

.pf-eq { flex: none; display: inline-flex; align-items: flex-end; gap: 2px; height: 11px; }
.pf-eq i { width: 2.5px; height: 30%; border-radius: 2px; background: currentColor; }
.pf-np.is-playing .pf-eq i { animation: pf-eq .8s ease-in-out infinite alternate; }
.pf-eq i:nth-child(2) { animation-delay: -.3s; }
.pf-eq i:nth-child(3) { animation-delay: -.55s; }
.pf-eq i:nth-child(4) { animation-delay: -.15s; }
@keyframes pf-eq { from { height: 25%; } to { height: 100%; } }

@media (max-width: 639.98px) {
  .pf-np { left: 10px; right: 10px; bottom: 10px; width: auto; grid-template-columns: 48px minmax(0, 1fr) auto auto; gap: 10px; }
  .pf-np-cover { width: 48px; height: 48px; border-radius: 12px; }
  .pf-page.has-sound { padding-bottom: 92px; }
}

/* Cine a cerut mai putina miscare: poza sta pe loc, egalizatorul se opreste. */
@media (prefers-reduced-motion: reduce) {
  html:not([data-motion="full"]) .pf-bg,
  html:not([data-motion="full"]) .pf-np,
  html:not([data-motion="full"]) .pf-np.is-playing .pf-np-cover img { animation: none; }
  html:not([data-motion="full"]) .pf-np.is-playing .pf-eq i { animation: none; height: 70%; }
}
html[data-motion="off"] .pf-bg,
html[data-motion="off"] .pf-np,
html[data-motion="off"] .pf-np.is-playing .pf-np-cover img,
html[data-motion="off"] .pf-np.is-playing .pf-eq i { animation: none; }

/* Poza intreaga, pe tot ecranul (butonul "View" de pe coperta). */
.pf-lightbox.is-open { display: grid; place-items: center; padding: 12px; }
.pf-lightbox img {
  position: relative; z-index: 1; max-width: 100%; max-height: calc(100vh - 24px);
  border-radius: 14px; object-fit: contain; box-shadow: 0 30px 80px -20px rgb(var(--c-shadow) / .9);
  animation: pop .2s ease;
}
.pf-lightbox-close { position: absolute; top: 14px; right: 14px; z-index: 2; }

/* Playerul de YouTube / Spotify: in pagina, dar nevazut - se aude doar
   sunetul. Nu e `display: none`: un player ascuns asa nu mai porneste deloc.
   200px e marimea minima ceruta de YouTube pentru un player care reda. */
.pf-player { position: fixed; left: 0; bottom: 0; z-index: -3; width: 200px; height: 200px; border: 0; opacity: 0; pointer-events: none; }

/* Formularul (My account, si modalul unui ACP de pe profil). */
.pf-lock {
  display: flex; align-items: center; gap: 12px; margin-top: 12px; padding: 12px;
  border-radius: 14px; border: 1px dashed rgb(var(--c-yellow) / .4); background: rgb(var(--c-yellow) / .07);
}
.pf-lock-icon { flex: none; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; background: rgb(var(--c-yellow) / .16); color: rgb(var(--c-yellow)); }
.pf-mini-cover { flex: none; width: 44px; height: 44px; border-radius: 11px; object-fit: cover; box-shadow: 0 6px 14px -8px rgb(var(--c-shadow) / .8); }

/*
  Previzualizarea fundalului (partials/bg-preview.ejs): cardul de profil in
  mic, cu aceleasi reguli ca pagina - coperta 16:9, poza intreaga, marginile
  umplute de aceeasi poza blurata; avatarul si numele dedesubt.
*/
.bgp { margin: 0; overflow: hidden; border-radius: 14px; border: 1px solid var(--line); background: rgb(var(--c-ink-800)); }
.is-over .bgp { border-color: rgb(var(--c-frost-500) / .6); }
.bgp-cover { position: relative; overflow: hidden; aspect-ratio: var(--pf-ratio, 16 / 9); background: rgb(var(--c-sunken)); }
.bgp-media { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% var(--pf-pos, 50%); user-select: none; -webkit-user-drag: none; }
.bgp-cover.is-cropped { cursor: ns-resize; touch-action: none; }
.bgp-id { position: relative; display: flex; align-items: flex-end; gap: 9px; margin-top: -20px; padding: 0 12px 9px; }
.bgp-avatar { width: 44px; height: 44px; border-radius: 13px; font-size: 14px; box-shadow: 0 0 0 3px rgb(var(--c-ink-800)); }
.bgp-name { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 14px; font-weight: 800; color: rgb(var(--c-slate-100)); }
.bgp figcaption { display: flex; align-items: center; gap: 5px; padding: 6px 12px; border-top: 1px solid var(--line); font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: rgb(var(--c-slate-500)); }

/* Previzualizarea fundalului din "My account". */
.pf-preview {
  position: relative; aspect-ratio: 16 / 7; overflow: hidden;
  border-radius: 14px; border: 1px dashed var(--line);
  background: rgb(var(--c-sunken) / .5) center / cover no-repeat;
}
.pf-preview.is-over { border-color: rgb(var(--c-frost-500) / .6); background-color: rgb(var(--c-frost-500) / .08); }
/* Venit din profil (/account#profile-page): capul cardului nu sta sub bara de sus, lipita. */
#profile-page { scroll-margin-top: 88px; }

/* Editorul de fundal din "My account" (cadrul 16:9 e chiar panza). `touch-action:
   none`: pe telefon, tragerea muta poza, nu pagina. */
.bge-stage {
  position: relative; aspect-ratio: 16 / 9; overflow: hidden;
  border-radius: 12px; border: 1px solid var(--line);
  background: rgb(var(--c-sunken));
}
.bge-canvas { position: absolute; inset: 0; width: 100%; height: 100%; cursor: grab; touch-action: none; }
.bge-canvas:active { cursor: grabbing; }
/* Regula treimilor, ca in orice editor de poze: ajuta la asezat subiectul.
   Cu borduri, nu cu gradient - o linie de 1px pusa pe o treime cade pe o
   jumatate de pixel si una din ele disparea. */
.bge-thirds { position: absolute; inset: 0 33.333%; pointer-events: none; border-inline: 1px solid rgb(var(--c-slate-50) / .22); }
.bge-thirds::after { content: ''; position: absolute; inset: 33.333% -100%; border-block: 1px solid rgb(var(--c-slate-50) / .22); }
.btn-ghost.is-on { background: rgb(var(--c-frost-500) / .16); color: rgb(var(--c-frost-hi)); border-color: rgb(var(--c-frost-500) / .35); }

/* =================================================================== */
/*  Achievementuri (/achievements, profilul, Admin Panel)               */
/* =================================================================== */

/*
  Nivelul unui achievement (bronz -> diamant) e o culoare, dar NU una noua:
  fiecare nivel ia una din culorile de stare ale temei, deci merge pe toate
  temele, si pe cele luminoase (capcana #17). Selectorul e pe `data-tier`,
  oriunde ar fi pus - card, rand din lista de recente, vitrina de profil.
*/
[data-tier="bronze"]   { --tier: var(--c-orange);    --tier-on: var(--c-orange-on); }
[data-tier="silver"]   { --tier: var(--c-slate-300); --tier-on: var(--c-slate-200); }
[data-tier="gold"]     { --tier: var(--c-yellow);    --tier-on: var(--c-yellow-on); }
[data-tier="platinum"] { --tier: var(--c-frost-500); --tier-on: var(--c-frost-on); }
[data-tier="diamond"]  { --tier: var(--c-purple);    --tier-on: var(--c-purple-on); }

/*
  Insigna: emblema NIVELULUI (medalie -> diamant, SVG din src/achievements.js)
  in patratul colorat, si iconita categoriei in coltul din dreapta-jos
  (`.ach-mini`). Fara `overflow: hidden`: iconita mica iese putin peste
  margine, intentionat - de aceea si sclipirea diamantului e un fundal care se
  plimba (`background-position`), nu un element care trebuie taiat.
*/
.ach-badge {
  --ach-size: 52px;
  position: relative; display: grid; place-items: center; flex-shrink: 0;
  width: var(--ach-size); height: var(--ach-size); border-radius: 16px;
  color: rgb(var(--tier-on, var(--c-slate-300)));
  background: radial-gradient(circle at 30% 25%, rgb(var(--tier, var(--c-slate-400)) / .38), rgb(var(--tier, var(--c-slate-400)) / .12) 70%);
  border: 1px solid rgb(var(--tier, var(--c-slate-400)) / .45);
  box-shadow: inset 0 1px 0 rgb(var(--c-slate-50) / .08), 0 10px 22px -14px rgb(var(--tier, var(--c-slate-400)) / .9);
}
.ach-badge.is-sm { --ach-size: 36px; border-radius: 11px; }
.ach-badge.is-xs { --ach-size: 24px; border-radius: 7px; box-shadow: none; }
.ach-emblem { width: calc(var(--ach-size) * .52); height: calc(var(--ach-size) * .52); }
.ach-mini {
  position: absolute; right: -5px; bottom: -5px; display: grid; place-items: center;
  width: calc(var(--ach-size) * .42); height: calc(var(--ach-size) * .42); border-radius: 50%;
  color: rgb(var(--c-slate-100)); background: rgb(var(--c-ink-800));
  border: 1px solid rgb(var(--tier, var(--c-slate-400)) / .6);
}
.ach-mini svg { width: 58%; height: 58%; }
/* Diamantul are o sclipire care trece peste el. */
[data-tier="diamond"] .ach-badge::after {
  content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none;
  background: linear-gradient(115deg, transparent 40%, rgb(var(--c-slate-50) / .35) 50%, transparent 60%) no-repeat;
  background-size: 250% 100%;
  animation: ach-sheen 3.2s ease-in-out infinite;
}
@keyframes ach-sheen { 0%, 55% { background-position: 120% 0; } 100% { background-position: -20% 0; } }

/* ------------------------------ Antetul ------------------------------ */

.ach-hero { display: grid; gap: 18px; padding: 20px; }
.ach-hero-main { display: flex; align-items: center; gap: 18px; }
/* Inelul nivelului: cat s-a facut din nivelul urmator, dintr-un conic-gradient. */
.ach-level {
  --pct: 0; position: relative; display: grid; place-items: center; flex-shrink: 0;
  width: 92px; height: 92px; border-radius: 50%;
  background: conic-gradient(rgb(var(--c-frost-500)) calc(var(--pct) * 1%), rgb(var(--c-slate-400) / .14) 0);
}
.ach-level::before { content: ''; position: absolute; inset: 7px; border-radius: 50%; background: rgb(var(--c-ink-800)); }
.ach-level > * { position: relative; }
.ach-level { grid-template-rows: auto auto; align-content: center; }
.ach-level-num { font-size: 30px; font-weight: 900; line-height: 1; color: rgb(var(--c-slate-50)); }
.ach-level-cap { font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: rgb(var(--c-slate-500)); }
.ach-xp { height: 8px; border-radius: 999px; overflow: hidden; background: rgb(var(--c-sunken) / .7); }
.ach-xp > span { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, rgb(var(--c-frost-600)), rgb(var(--c-frost-400))); transition: width .6s ease; }
.ach-hero-stats { display: grid; gap: 10px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.ach-hero-stats > div { padding: 10px 12px; border-radius: 12px; border: 1px solid var(--line); background: rgb(var(--c-sunken) / .35); }
.ach-hero-num { margin-top: 3px; font-size: 20px; font-weight: 800; color: rgb(var(--c-slate-100)); }
.ach-hero-num small { font-size: 13px; font-weight: 600; color: rgb(var(--c-slate-500)); }
@media (min-width: 900px) {
  .ach-hero { grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); align-items: center; }
  .ach-hero-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* ---------------------------- Categoriile ---------------------------- */

.ach-cats { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
.ach-cat {
  display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 14px;
  border: 1px solid var(--line); background: rgb(var(--c-ink-800) / .7); text-align: left;
  transition: border-color .15s, background .15s;
}
.ach-cat:hover { border-color: rgb(var(--c-frost-500) / .3); }
.ach-cat.is-active { border-color: rgb(var(--c-frost-500) / .55); background: rgb(var(--c-frost-500) / .1); }
.ach-cat-icon { display: grid; place-items: center; width: 32px; height: 32px; flex-shrink: 0; border-radius: 10px; background: rgb(var(--c-frost-500) / .15); color: rgb(var(--c-frost-500)); }
.ach-cat-bar { display: block; height: 3px; margin-top: 5px; border-radius: 999px; overflow: hidden; background: rgb(var(--c-slate-400) / .14); }
.ach-cat-bar > span { display: block; height: 100%; background: rgb(var(--c-frost-500)); }

/* ------------------------------ Cardurile ---------------------------- */

.ach-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 290px), 1fr)); }
.ach-card {
  position: relative; display: flex; flex-direction: column; padding: 14px; border-radius: 16px;
  border: 1px solid rgb(var(--tier) / .28);
  background: linear-gradient(160deg, rgb(var(--tier) / .09), rgb(var(--c-ink-800) / .9) 45%);
}
.ach-card-top { display: flex; align-items: center; gap: 12px; }
.ach-name { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 15px; font-weight: 800; color: rgb(var(--c-slate-100)); }
.ach-tier { margin-top: 2px; font-size: 11px; font-weight: 700; letter-spacing: .04em; color: rgb(var(--tier-on)); }
.ach-desc { margin-top: 10px; font-size: 12.5px; line-height: 1.45; color: rgb(var(--c-slate-400)); }
.ach-bar { height: 6px; border-radius: 999px; overflow: hidden; background: rgb(var(--c-sunken) / .7); }
.ach-bar > span { display: block; height: 100%; border-radius: inherit; background: rgb(var(--tier)); }
.ach-foot { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: auto; padding-top: 12px; }
.ach-reward { font-size: 11px; font-weight: 700; color: rgb(var(--c-slate-400)); }
.ach-pin {
  display: grid; place-items: center; width: 32px; height: 32px; flex-shrink: 0; border-radius: 10px;
  color: rgb(var(--c-slate-500)); border: 1px solid var(--line); background: rgb(var(--c-sunken) / .4);
}
.ach-pin:hover { color: rgb(var(--c-slate-200)); }
.ach-pin.is-on { color: rgb(var(--tier-on)); border-color: rgb(var(--tier) / .5); background: rgb(var(--tier) / .14); }

/*
  Treptele unui card: o bulina per treapta, in culoarea nivelului ei - plina
  cand e deblocata, doar conturata cand nu. Asa se vede dintr-o privire si cat
  ai facut, si ce culoare urmeaza.
*/
.ach-steps { display: flex; gap: 5px; margin-top: 12px; }
.ach-pip {
  flex: 1; height: 6px; border-radius: 999px;
  background: rgb(var(--tier) / .12); box-shadow: inset 0 0 0 1px rgb(var(--tier) / .45);
}
.ach-pip.is-on { background: rgb(var(--tier)); box-shadow: none; }
.ach-next { margin-top: 6px; font-size: 11px; font-weight: 600; color: rgb(var(--c-slate-500)); }
/* Terminat: toate treptele. Chenarul ia culoarea nivelului, mai apasat. */
.ach-card.is-done { border-color: rgb(var(--tier) / .55); }

/* Blocat: se vede ce urmeaza, dar stins. Secretul e si mai stins. */
.ach-card.is-locked { border-color: var(--line); background: rgb(var(--c-ink-800) / .6); }
.ach-card.is-locked .ach-badge { filter: grayscale(1); opacity: .5; box-shadow: none; }
.ach-card.is-locked .ach-name { color: rgb(var(--c-slate-300)); }
.ach-card.is-secret .ach-name { letter-spacing: .2em; color: rgb(var(--c-slate-500)); }

/* Abia deblocat (venit in `fresh`): se aprinde de doua ori. */
.ach-card.is-fresh { animation: ach-fresh 1.6s ease-out 2; }
@keyframes ach-fresh {
  0% { box-shadow: 0 0 0 0 rgb(var(--tier) / .7); }
  100% { box-shadow: 0 0 0 16px rgb(var(--tier) / 0); }
}

/* Randul contului la care te uiti, in clasament. */
.ach-me { border-color: rgb(var(--c-frost-500) / .45) !important; background: rgb(var(--c-frost-500) / .08) !important; }

/* ------------------------------ Profilul ----------------------------- */

.pf-ach { grid-area: ach; }
.pf-ach-grid { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 210px), 1fr)); }
.pf-ach-item {
  display: flex; align-items: center; gap: 10px; min-width: 0; padding: 10px; border-radius: 14px;
  border: 1px solid rgb(var(--tier) / .3); background: linear-gradient(160deg, rgb(var(--tier) / .1), transparent 60%);
}
.pf-ach .ach-level { width: 44px; height: 44px; }
.pf-ach .ach-level::before { inset: 4px; }
.pf-ach .ach-level-num { font-size: 16px; }
.pf-ach .ach-level-cap { display: none; }

@media (prefers-reduced-motion: reduce) {
  html:not([data-motion="full"]) [data-tier="diamond"] .ach-badge::after,
  html:not([data-motion="full"]) .ach-card.is-fresh { animation: none; }
}
html[data-motion="off"] [data-tier="diamond"] .ach-badge::after,
html[data-motion="off"] .ach-card.is-fresh { animation: none; }

/* ------------------------------------------------------------------
   Roluri si permisiuni (Admin Panel -> Roles & permissions)

   Culoarea unui rol e aleasa de admin (hex verificat pe server, vezi
   src/permissions.js) si ajunge doar ca `--rc`, ca feliile rotii si
   infatisarile. Fara ea, totul cade pe accentul temei. Textul se amesteca cu
   culoarea textului din tema, ca un rol galben sa se citeasca si pe hartie.
------------------------------------------------------------------ */

.role-chip {
  --rc: rgb(var(--c-frost-500));
  display: inline-flex; align-items: center; gap: 5px;
  max-width: 100%;
  padding: 2px 9px 2px 7px; border-radius: 99px;
  font-size: 11px; font-weight: 700; line-height: 1.6; white-space: nowrap;
  color: color-mix(in srgb, var(--rc) 62%, rgb(var(--c-slate-100)));
  background: color-mix(in srgb, var(--rc) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--rc) 34%, transparent);
}
.role-chip svg { height: 12px; width: 12px; flex: none; }
.role-chip > span { overflow: hidden; text-overflow: ellipsis; }
.role-chip .role-chip-via { height: 10px; width: 10px; opacity: .7; }
.role-chip.sm { padding: 1px 7px 1px 5px; font-size: 10.5px; }

.role-layout { display: grid; gap: 20px; align-items: start; }
@media (min-width: 1024px) { .role-layout { grid-template-columns: minmax(280px, 340px) minmax(0, 1fr); } }

.role-item {
  --rc: rgb(var(--c-frost-500));
  position: relative; display: flex; align-items: center; gap: 4px;
  border-radius: 13px; border: 1px solid transparent;
  transition: background .15s ease, border-color .15s ease;
}
.role-item::before {
  content: ''; position: absolute; left: 0; top: 10px; bottom: 10px; width: 3px;
  border-radius: 3px; background: var(--rc); opacity: .75;
}
.role-item:hover { background: rgb(var(--c-slate-400) / .06); }
.role-item.is-active {
  background: color-mix(in srgb, var(--rc) 10%, transparent);
  border-color: color-mix(in srgb, var(--rc) 30%, transparent);
}
.role-item-main { display: flex; flex: 1; min-width: 0; align-items: center; gap: 11px; padding: 9px 8px 9px 13px; }
.role-item-icon, .role-hero-icon, .role-pick-icon {
  display: grid; place-items: center; flex: none;
  color: var(--rc);
  background: color-mix(in srgb, var(--rc) 16%, transparent);
  border: 1px solid color-mix(in srgb, var(--rc) 28%, transparent);
}
.role-item-icon { height: 34px; width: 34px; border-radius: 10px; }
.role-item-count {
  flex: none; min-width: 26px; padding: 1px 8px; border-radius: 99px; text-align: center;
  font-size: 11px; font-weight: 800; color: rgb(var(--c-slate-300)); background: rgb(var(--c-slate-400) / .12);
}
.role-item-move { display: flex; flex-direction: column; gap: 2px; padding-right: 6px; }

.role-hero { display: flex; align-items: center; gap: 14px; padding: 18px 18px 14px; flex-wrap: wrap; }
.role-hero-icon { height: 52px; width: 52px; border-radius: 16px; box-shadow: 0 8px 28px -12px var(--rc); }
.card[style*="--rc"] .role-hero { background: linear-gradient(180deg, color-mix(in srgb, var(--rc) 9%, transparent), transparent); }
.role-seg-count {
  margin-left: 5px; padding: 0 6px; border-radius: 99px; font-size: 10.5px;
  background: rgb(var(--c-slate-400) / .14); color: rgb(var(--c-slate-300));
}
.role-note {
  display: flex; align-items: flex-start; gap: 9px;
  margin: 0 18px 14px; padding: 10px 12px; border-radius: 12px;
  font-size: 12.5px; line-height: 1.5;
  color: rgb(var(--c-yellow-on)); background: rgb(var(--c-yellow) / .08); border: 1px solid rgb(var(--c-yellow) / .25);
}
.card-body > .role-note { margin: 0; }
.role-note.is-strong { color: rgb(var(--c-red-on)); background: rgb(var(--c-red) / .08); border-color: rgb(var(--c-red) / .25); }

.perm-group { border-radius: 14px; border: 1px solid var(--line); background: rgb(var(--c-sunken) / .45); overflow: hidden; }
.perm-group-head {
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
  border-bottom: 1px solid var(--line); background: rgb(var(--c-slate-400) / .04);
}
.perm-group-icon { display: grid; place-items: center; height: 28px; width: 28px; border-radius: 9px; color: rgb(var(--c-frost-500)); background: rgb(var(--c-frost-500) / .14); }
.perm-row {
  display: flex; align-items: flex-start; gap: 12px; padding: 11px 14px;
  border-bottom: 1px solid rgb(var(--c-slate-400) / .06);
  transition: background .15s ease;
}
.perm-row:last-child { border-bottom: 0; }
.perm-row > .switch { margin-top: 1px; }
.perm-row.is-on { background: rgb(var(--c-frost-500) / .045); }
.perm-row.is-off { opacity: .6; }
.perm-row.is-locked .text-sm { color: rgb(var(--c-slate-400)); }
.perm-key {
  font-family: 'JetBrains Mono', monospace; font-size: 10.5px;
  padding: 0 5px; border-radius: 5px; color: rgb(var(--c-slate-500)); background: rgb(var(--c-slate-400) / .08);
}
.perm-needs { display: flex; align-items: center; gap: 4px; margin-top: 3px; font-size: 11px; color: rgb(var(--c-slate-500)); }
.perm-limit { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; width: 104px; flex: none; }
.perm-state {
  display: grid; place-items: center; flex: none; height: 24px; width: 24px; margin-top: 1px; border-radius: 8px;
  color: rgb(var(--c-slate-500)); background: rgb(var(--c-slate-400) / .1);
}
.perm-state.is-on { color: rgb(var(--c-green-on)); background: rgb(var(--c-green) / .16); }
.perm-state.is-deny { color: rgb(var(--c-red-on)); background: rgb(var(--c-red) / .16); }
.perm-src {
  display: inline-flex; align-items: center; padding: 1px 8px; border-radius: 99px;
  font-size: 10.5px; font-weight: 700; white-space: nowrap;
  color: rgb(var(--c-slate-400)); background: rgb(var(--c-slate-400) / .1); border: 1px solid rgb(var(--c-slate-400) / .16);
}
.perm-src.is-allow { color: rgb(var(--c-green-on)); background: rgb(var(--c-green) / .12); border-color: rgb(var(--c-green) / .28); }
.perm-src.is-deny { color: rgb(var(--c-red-on)); background: rgb(var(--c-red) / .12); border-color: rgb(var(--c-red) / .28); }

.perm-override {
  display: flex; align-items: center; gap: 11px; padding: 10px 12px; border-radius: 12px;
  border: 1px solid var(--line); background: rgb(var(--c-sunken) / .5);
}
.perm-override-mark { display: grid; place-items: center; flex: none; height: 26px; width: 26px; border-radius: 8px; }
.perm-override.is-allow .perm-override-mark { color: rgb(var(--c-green-on)); background: rgb(var(--c-green) / .16); }
.perm-override.is-deny .perm-override-mark { color: rgb(var(--c-red-on)); background: rgb(var(--c-red) / .16); }
.perm-override-form {
  display: grid; gap: 8px; padding-top: 12px; border-top: 1px solid var(--line);
  grid-template-columns: 1fr;
}
@media (min-width: 900px) {
  .perm-override-form { grid-template-columns: auto minmax(0, 2fr) 90px 100px minmax(0, 1.4fr) auto; align-items: center; }
}

.role-member {
  display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 12px;
  border: 1px solid transparent;
}
.role-member:hover { background: rgb(var(--c-slate-400) / .05); border-color: var(--line); }
.role-via {
  flex: none; padding: 1px 8px; border-radius: 99px; font-size: 10.5px; font-weight: 700;
  color: rgb(var(--c-slate-400)); background: rgb(var(--c-slate-400) / .1);
}
.role-via.is-direct { color: rgb(var(--c-frost-on)); background: rgb(var(--c-frost-500) / .14); }
.role-via.is-rank { color: rgb(var(--c-purple-on)); background: rgb(var(--c-purple) / .14); }
.role-via.is-system { color: rgb(var(--c-red-on)); background: rgb(var(--c-red) / .12); }
.role-add { position: relative; }
.role-add-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 8px; padding: 8px 10px;
  border-radius: 12px; border: 1px solid rgb(var(--c-frost-500) / .3); background: rgb(var(--c-frost-500) / .06);
}

/* Rolurile din formularul de user (Admin Panel -> Users). */
.role-pick { display: grid; gap: 6px; }
@media (min-width: 560px) { .role-pick { grid-template-columns: 1fr 1fr; } }
.role-pick-row {
  --rc: rgb(var(--c-frost-500));
  display: flex; flex-direction: column; gap: 6px; padding: 8px 10px; border-radius: 12px;
  border: 1px solid var(--line); background: rgb(var(--c-sunken) / .45);
  transition: border-color .15s ease, background .15s ease;
}
.role-pick-row.is-on { border-color: color-mix(in srgb, var(--rc) 40%, transparent); background: color-mix(in srgb, var(--rc) 8%, transparent); }
.role-pick-row.is-locked { opacity: .6; }
.role-pick-row .switch { min-width: 0; }
.role-pick-row .switch input:checked + .track { background: var(--rc); }
.role-pick-icon { height: 22px; width: 22px; border-radius: 7px; }
.role-pick-rank { color: rgb(var(--c-purple-on)); }
.role-pick-term { display: flex; align-items: center; gap: 8px; padding-left: 50px; }
.role-pick-term .input { width: 110px; }

/* ------------------------------------------------------------------
   Cautarea globala (Ctrl+K)
------------------------------------------------------------------ */

.topbar-search {
  display: inline-flex; align-items: center; gap: 9px;
  height: 36px; padding: 0 10px; border-radius: 11px;
  border: 1px solid var(--line); background: rgb(var(--c-slate-400) / .06);
  color: rgb(var(--c-slate-500)); font-size: 13px; cursor: pointer;
  transition: border-color .15s ease, color .15s ease;
}
.topbar-search:hover { color: rgb(var(--c-slate-300)); border-color: rgb(var(--c-slate-400) / .25); }
.topbar-search-text { display: none; }
.topbar-search-kbd { display: none; }
@media (min-width: 900px) {
  .topbar-search { width: 230px; }
  .topbar-search-text { display: inline; margin-right: auto; }
  .topbar-search-kbd { display: inline; }
}
.topbar-search-kbd, .search-kbd, .search-hint kbd {
  padding: 1px 6px; border-radius: 6px; font-family: 'JetBrains Mono', monospace; font-size: 10.5px; font-weight: 600;
  color: rgb(var(--c-slate-400)); background: rgb(var(--c-slate-400) / .1); border: 1px solid rgb(var(--c-slate-400) / .18);
}

.search-modal .modal-backdrop { backdrop-filter: blur(6px); }
.search-panel {
  position: relative; z-index: 1;
  display: flex; flex-direction: column;
  width: min(640px, calc(100vw - 24px)); max-height: min(620px, calc(100vh - 90px));
  margin: 9vh auto 0;
  border-radius: 18px; border: 1px solid rgb(var(--c-slate-400) / .16);
  background: linear-gradient(180deg, rgb(var(--c-ink-700)), rgb(var(--c-ink-800)));
  box-shadow: 0 30px 80px -20px rgb(var(--c-shadow) / .7);
  overflow: hidden;
  animation: pop .16s ease-out;
}
@media (max-width: 640px) { .search-panel { margin-top: 12px; max-height: calc(100vh - 24px); } }
.search-field { display: flex; align-items: center; gap: 11px; padding: 14px 16px; border-bottom: 1px solid var(--line); }
.search-input {
  flex: 1; min-width: 0; border: 0; outline: 0; background: transparent;
  font-size: 16px; font-weight: 500; color: rgb(var(--c-slate-100));
}
.search-input::placeholder { color: rgb(var(--c-slate-500)); }
.search-input::-webkit-search-cancel-button { display: none; }
.search-spin {
  height: 16px; width: 16px; flex: none; border-radius: 50%;
  border: 2px solid rgb(var(--c-frost-500) / .25); border-top-color: rgb(var(--c-frost-500));
  animation: search-spin .7s linear infinite;
}
@keyframes search-spin { to { transform: rotate(360deg); } }
.search-results { overflow-y: auto; overscroll-behavior: contain; padding: 6px 8px 10px; }
.search-section {
  padding: 10px 10px 5px; font-size: 10.5px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: rgb(var(--c-slate-500));
}
.search-row {
  display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 11px;
  color: inherit; text-decoration: none; cursor: pointer;
}
.search-row.is-active, a.search-row:hover { background: rgb(var(--c-frost-500) / .11); }
.search-row.is-active { box-shadow: inset 2px 0 0 rgb(var(--c-frost-500)); }
.search-icon {
  --rc: rgb(var(--c-frost-500));
  display: grid; place-items: center; flex: none; height: 32px; width: 32px; border-radius: 10px;
  color: rgb(var(--c-slate-400)); background: rgb(var(--c-slate-400) / .09);
}
.search-row.is-active .search-icon { color: rgb(var(--c-frost-500)); background: rgb(var(--c-frost-500) / .14); }
.search-icon.is-role { color: var(--rc); background: color-mix(in srgb, var(--rc) 16%, transparent); }
.search-row mark { background: transparent; color: rgb(var(--c-frost-hi)); font-weight: 800; }
.search-action {
  flex: none; padding: 3px 9px; border-radius: 8px; font-size: 11px; font-weight: 700;
  color: rgb(var(--c-frost-on)); background: rgb(var(--c-frost-500) / .12);
}
.search-action:hover { background: rgb(var(--c-frost-500) / .22); }
.search-enter { flex: none; color: rgb(var(--c-slate-500)); }
.search-idle { padding: 4px 0; }
.search-hint { padding: 14px 10px 6px; font-size: 12px; color: rgb(var(--c-slate-500)); }

@media (prefers-reduced-motion: reduce) {
  html:not([data-motion="full"]) .search-panel,
  html:not([data-motion="full"]) .search-spin { animation: none; }
}
html[data-motion="off"] .search-panel,
html[data-motion="off"] .search-spin { animation: none; }

/* ------------------------------------------------------------------
   Clanurile
------------------------------------------------------------------ */

/*
  Eticheta de clan de langa nume: [TAG]. Fara upgrade-ul "Tag colours" e
  neutra (culorile temei); cu el, serverul pune `--c1` = culoarea clanului
  (validata hex, ca la infatisari), iar restul se amesteca din ea.
*/
.ctag {
  --c1: rgb(var(--c-slate-300));
  display: inline-flex; align-items: center; gap: 4px; vertical-align: middle;
  padding: 1px 7px; border-radius: 6px;
  font-family: 'JetBrains Mono', monospace;
  font-size: 10.5px; font-weight: 800; letter-spacing: .04em; line-height: 1.55;
  white-space: nowrap; max-width: 100%;
  color: var(--c1);
  background: color-mix(in srgb, var(--c1) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--c1) 38%, transparent);
}
.ctag > span { overflow: hidden; text-overflow: ellipsis; }
.ctag-icon { height: 11px; width: 11px; flex: none; }
.ctag.sm { padding: 0 5px; font-size: 9.5px; }
.ctag.sm .ctag-icon { height: 9px; width: 9px; }
/* Doua etichete in acelasi invelis (clan + panel): un pic de aer intre ele, pe un rand. */
.ctag + .ptag { margin-left: 4px; }
.name-row > :last-child:not(:first-child) { white-space: nowrap; }

.ctag[data-fx="glow"] {
  box-shadow: 0 0 10px color-mix(in srgb, var(--c1) 35%, transparent);
  text-shadow: 0 0 7px color-mix(in srgb, var(--c1) 60%, transparent);
}
.ctag[data-fx="pulse"] { animation: ptag-pulse 2.2s ease-in-out infinite; }
.ctag[data-fx="shine"] { position: relative; overflow: hidden; }
.ctag[data-fx="shine"]::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(110deg, transparent 25%, rgb(var(--c-text-hi) / .35) 50%, transparent 75%);
  transform: translateX(-130%);
  animation: ptag-sweep 3.6s ease-in-out infinite;
  pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  html:not([data-motion="full"]) .ctag[data-fx],
  html:not([data-motion="full"]) .ctag[data-fx]::after { animation: none; }
}
html[data-motion="off"] .ctag[data-fx], html[data-motion="off"] .ctag[data-fx]::after { animation: none; }

/*
  Culoarea clanului pe pagini: `--cc1` / `--cc2` puse inline din hex-ul
  validat al clanului (ca `--rc` la roluri). Fara ele, accentul temei.
*/
.clan-tone { --cc1: rgb(var(--c-frost-500)); }
.clan-icon {
  display: grid; place-items: center; flex: none;
  height: 44px; width: 44px; border-radius: 14px;
  color: var(--cc1);
  background: color-mix(in srgb, var(--cc1) 16%, transparent);
  border: 1px solid color-mix(in srgb, var(--cc1) 34%, transparent);
}
.clan-icon.lg { height: 64px; width: 64px; border-radius: 18px; }
.clan-icon svg { height: 45%; width: 45%; }

.clan-hero {
  position: relative; overflow: hidden;
  padding: 22px; border-radius: 18px;
  border: 1px solid color-mix(in srgb, var(--cc1) 30%, transparent);
  background:
    radial-gradient(640px 260px at 6% -30%, color-mix(in srgb, var(--cc1) 30%, transparent), transparent 70%),
    radial-gradient(560px 260px at 96% 130%, color-mix(in srgb, var(--cc2, var(--cc1)) 22%, transparent), transparent 70%),
    linear-gradient(180deg, rgb(var(--c-ink-700) / .95), rgb(var(--c-ink-850) / .95));
}
/* Cu upgrade-ul "Banner": cele doua culori ale clanului pe toata latimea. */
.clan-hero.has-banner {
  background:
    linear-gradient(120deg, color-mix(in srgb, var(--cc1) 42%, transparent), color-mix(in srgb, var(--cc2) 38%, transparent)),
    linear-gradient(180deg, rgb(var(--c-ink-700) / .95), rgb(var(--c-ink-850) / .95));
}
.clan-hero > * { position: relative; }
.clan-motto { font-style: italic; color: rgb(var(--c-slate-400)); }

/* Bara de XP (nivelul clanului). */
.xpbar {
  height: 7px; border-radius: 99px; overflow: hidden;
  background: rgb(var(--c-slate-400) / .12);
}
.xpbar > span {
  display: block; height: 100%; border-radius: inherit;
  background: linear-gradient(90deg, var(--cc1), color-mix(in srgb, var(--cc1) 55%, rgb(var(--c-text-hi))));
  transition: width .5s ease;
}

/* Cardul unui clan in lista. */
.clan-card {
  display: flex; flex-direction: column; gap: 12px;
  padding: 15px; border-radius: 15px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .42);
  transition: border-color .16s ease, transform .16s ease;
}
.clan-card:hover { border-color: color-mix(in srgb, var(--cc1) 45%, transparent); transform: translateY(-2px); }
.clan-card .clan-foot { margin-top: auto; }
.clan-place {
  display: grid; place-items: center; flex: none;
  height: 24px; min-width: 24px; padding: 0 6px; border-radius: 8px;
  font-size: 11px; font-weight: 800;
  background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-400));
}
.clan-place.p1 { background: rgb(var(--c-yellow) / .16); color: rgb(var(--c-yellow-on)); }
.clan-place.p2 { background: rgb(var(--c-slate-300) / .16); color: rgb(var(--c-slate-200)); }
.clan-place.p3 { background: rgb(var(--c-orange) / .16); color: rgb(var(--c-orange-on)); }
.clan-metric { font-size: 11px; color: rgb(var(--c-slate-500)); }
.clan-metric b { display: block; font-size: 14px; color: rgb(var(--c-slate-100)); }

/* Gradul intr-un clan: aceeasi pastila, alta culoare pe fiecare treapta. */
.clan-grade {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 1px 8px; border-radius: 99px;
  font-size: 10.5px; font-weight: 700; white-space: nowrap;
  border: 1px solid transparent;
}
.clan-grade svg { height: 11px; width: 11px; }
.clan-grade[data-grade="leader"] { background: rgb(var(--c-yellow) / .14); color: rgb(var(--c-yellow-on)); border-color: rgb(var(--c-yellow) / .3); }
.clan-grade[data-grade="coleader"] { background: rgb(var(--c-purple) / .14); color: rgb(var(--c-purple-on)); border-color: rgb(var(--c-purple) / .3); }
.clan-grade[data-grade="officer"] { background: rgb(var(--c-frost-500) / .14); color: rgb(var(--c-frost-on)); border-color: rgb(var(--c-frost-500) / .28); }
.clan-grade[data-grade="member"] { background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-300)); border-color: rgb(var(--c-slate-400) / .18); }
.clan-grade[data-grade="recruit"] { background: rgb(var(--c-green) / .12); color: rgb(var(--c-green-on)); border-color: rgb(var(--c-green) / .26); }

/* Randul unui membru sau al unei cereri: aceeasi suprafata ca in restul panelului. */
.clan-row {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; border-radius: 13px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .4);
}
.clan-row + .clan-row { margin-top: 8px; }
.clan-row.is-me { border-color: color-mix(in srgb, var(--cc1) 40%, transparent); }
.clan-row .avatar { height: 38px; width: 38px; border-radius: 12px; font-size: 13px; flex: none; }
@media (max-width: 639.98px) {
  .clan-row { flex-wrap: wrap; }
}
.clan-dot {
  display: inline-block; height: 7px; width: 7px; border-radius: 50%;
  background: rgb(var(--c-slate-600));
}
.clan-dot.on { background: rgb(var(--c-green)); box-shadow: 0 0 0 3px rgb(var(--c-green) / .18); }

.clan-post {
  padding: 13px 14px; border-radius: 13px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .4);
}
.clan-post + .clan-post { margin-top: 9px; }
.clan-post.is-pinned {
  border-color: rgb(var(--c-yellow) / .32);
  background: rgb(var(--c-yellow) / .05);
}
.clan-post-body { white-space: pre-line; overflow-wrap: anywhere; font-size: 13.5px; line-height: 1.6; color: rgb(var(--c-slate-200)); }

.clan-log {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 9px 2px;
  border-bottom: 1px solid rgb(var(--c-slate-400) / .07);
  font-size: 13px;
}
.clan-log:last-child { border-bottom: 0; }
.clan-log-icon {
  display: grid; place-items: center; flex: none;
  height: 28px; width: 28px; border-radius: 9px;
  background: rgb(var(--c-slate-400) / .1); color: rgb(var(--c-slate-400));
}
.clan-log-icon svg { height: 14px; width: 14px; }
.clan-log-icon.in { background: rgb(var(--c-green) / .14); color: rgb(var(--c-green-on)); }
.clan-log-icon.out { background: rgb(var(--c-red) / .12); color: rgb(var(--c-red-on)); }
.clan-log-icon.up { background: rgb(var(--c-yellow) / .14); color: rgb(var(--c-yellow-on)); }
.clan-amount.in { color: rgb(var(--c-green-on)); }
.clan-amount.out { color: rgb(var(--c-red-on)); }

/* Upgrade-urile: un card pe fel, cu treptele ca bile. */
.up-card {
  display: flex; flex-direction: column; gap: 10px;
  padding: 15px; border-radius: 15px;
  border: 1px solid var(--line);
  background: rgb(var(--c-sunken) / .42);
}
.up-card.is-max { border-color: rgb(var(--c-green) / .3); }
.up-card .up-foot { margin-top: auto; }
.up-pips { display: flex; gap: 4px; }
.up-pips > span {
  height: 6px; flex: 1; border-radius: 99px;
  background: rgb(var(--c-slate-400) / .14);
}
.up-pips > span.on { background: var(--cc1); }

/* Matricea de drepturi din setari: un rand pe drept, gradul minim in dreapta. */
.clan-perm {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 0;
  border-bottom: 1px solid rgb(var(--c-slate-400) / .07);
}
.clan-perm:last-child { border-bottom: 0; }
.clan-perm .select { width: auto; min-width: 140px; }
@media (max-width: 639.98px) {
  .clan-perm { flex-wrap: wrap; }
  .clan-perm .select { width: 100%; }
}
