﻿/* Rozložení administrátorských stránek: seznamy (Uživatelé, Pozvánky, Transakce, Herní statistiky, Hlášení),
   tabulky analýzy aktivity na /Admin/Settings a výpis logů.

   Psáno MOBILE-FIRST (jako site.css): výchozí = kartové zobrazení, od 1200 px = tabulka.
   Jedno HTML (semantická <table> s data-label na buňkách) se vykresluje dvěma způsoby:
     • úzká plocha (telefon, monitor na výšku)  → každý řádek je KARTA s popiskami polí,
       karty se skládají do mřížky podle šířky (telefon 1 sloupec, 1080px na výšku 2–3 sloupce);
     • široká plocha (1920, 3440 ultrawide)     → klasická tabulka s lepivou hlavičkou.
   Díky tomu jsou na každém zařízení vidět VŠECHNY údaje – nic se neschovává.

   Řazení: v tabulkovém režimu klikem na hlavičku sloupce, v kartovém režimu lištou .admin-sortbar
   (v tabulkovém režimu je skrytá, aby se ovládání nezdvojovalo). */

/* Kontejner administrace: na širokém monitoru potřebuje víc než 1550 px, na které MainLayout omezuje
   .container. Rozšiřuje se proto PŘÍMO ten kontejner (přes :has), NE vystoupením z něj posunem/transformem —
   to sice vypadá stejně, ale obsah pak přetéká mimo rodiče (main i .container hlásily ~430 px přesahu),
   což prohlížeči dává důvod vykreslit vodorovný posuvník. Takhle nic nikde nepřetéká. */
.container:has(.admin-page) {
    max-width: 2400px;
}

.admin-page {
    width: 100%;
    padding-inline: 12px;
}

/* Výchozí (kartový) režim */
/* Rámec tabulky ZÁMĚRNĚ nemá vodorovný posuv: tabulka se do něj vždy vejde (v kartovém režimu z podstaty,
   v tabulkovém díky table-layout: fixed a procentním šířkám sloupců). Bez tohoto pravidla stačí přetečení
   o zlomek pixelu (zaokrouhlení procent při zlomkové šířce stránky) a prohlížeč pod tabulkou vykreslí
   vodorovný posuvník – proužek, který vypadá jako rozbitá čára. `clip` posuvník nikdy nevytvoří. */
.admin-table-wrap {
    overflow-x: clip;
}

.admin-table {
    width: 100%;
    border-collapse: collapse;
}

/* Prvky tabulky se v kartovém režimu chovají jako bloky. */
.admin-table,
.admin-table tbody,
.admin-table tr,
.admin-table td {
    display: block;
}

/* Hlavička tabulky nese v kartovém režimu jen popisky, které jsou už u buněk (data-label). */
.admin-table thead {
    display: none;
}

/* Karty se skládají do mřížky: kolik se jich vejde vedle sebe, tolik jich bude. */
.admin-table tbody {
    display: grid;
    /* min(…, 100 %): na nejužším telefonu (320 px) je plocha užší než 320 px a karta by se ořízla. */
    grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr));
    gap: 12px;
    align-items: start;
}

.admin-table tbody tr {
    border: 1px solid #dee2e6;
    border-radius: 8px;
    background-color: #fff;
    padding: 8px 12px;
}

/* Buňka karty = popisek vlevo, hodnota vpravo. */
.admin-table tbody td {
    display: grid;
    grid-template-columns: minmax(92px, 38%) 1fr;
    gap: 8px;
    align-items: center;
    padding: 5px 0;
    border-top: 1px solid #f1f3f5;
    min-width: 0;
    overflow-wrap: anywhere;
}

.admin-table tbody td::before {
    content: attr(data-label);
    color: #6c757d;
    font-size: 0.85rem;
}

/* První buňka je nadpis karty (přezdívka / datum) – přes celou šířku, bez popisku. */
.admin-table tbody td:first-child {
    grid-template-columns: 1fr;
    border-top: 0;
    font-weight: 700;
    font-size: 1.05rem;
    padding-top: 2px;
}

.admin-table tbody td:first-child::before {
    display: none;
}

/* Herní statistiky: první buňka je „Hráč A" – rovnocenná s „Hráč B" v řádku pod ní, ne nadpis karty.
   Proto se v kartovém režimu (úzká plocha) zobrazuje jako běžné pole s popiskem „Hráč A", stejně jako
   ostatní údaje. Guardováno max-width, aby to neovlivnilo tabulkový režim (tam popisky nese hlavička). */
@media (max-width: 1199.98px) {
    .admin-table--games tbody td:first-child {
        grid-template-columns: minmax(92px, 38%) 1fr;
        border-top: 0;
        font-weight: 400;
        font-size: inherit;
        padding-top: 5px;
    }

    .admin-table--games tbody td:first-child::before {
        display: block;
    }
}

/* Lišta řazení pro kartový režim. */
.admin-sortbar {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    align-items: center;
    margin-bottom: 12px;
}

.admin-sortbar .form-select {
    max-width: 260px;
}

/* Volba počtu položek na stránku – viditelná v obou režimech (na rozdíl od lišty řazení). */
.admin-pagesize {
    display: flex;
    gap: 8px;
    align-items: center;
    margin-bottom: 12px;
}

.admin-pagesize .form-select {
    width: auto;
}

/* Tabulkový režim (široká plocha) */
@media (min-width: 1200px) {
    .admin-sortbar {
        display: none;
    }

    .admin-table {
        display: table;
        /* Pevné rozložení: šířky sloupců určuje CSS níže, ne délka obsahu (jinak si dlouhý e-mail
           urve celý sloupec a ostatní se zmáčknou do několikařádkových „sloupečků"). */
        table-layout: fixed;
    }

    /* Šířky sloupců (součet 100 % VČETNĚ posledního sloupce Akce – bez něj by mu nezbylo místo
       a tabulka ho ořízne) – /Admin/Users. */
    .admin-table--users th:nth-child(1) { width: 8%; }
    .admin-table--users th:nth-child(2) { width: 11%; }
    .admin-table--users th:nth-child(3) { width: 3%; }   /* potvrzený e-mail (jen ikona) */
    .admin-table--users th:nth-child(4) { width: 6%; }   /* jazyk */
    .admin-table--users th:nth-child(5) { width: 6%; }
    .admin-table--users th:nth-child(6) { width: 6%; }
    .admin-table--users th:nth-child(7) { width: 6%; }   /* verze mobilní aplikace */
    .admin-table--users th:nth-child(8) { width: 10%; }  /* mobilní zařízení */
    .admin-table--users th:nth-child(9) { width: 3%; }   /* VIP */
    .admin-table--users th:nth-child(10) { width: 7%; }
    .admin-table--users th:nth-child(11) { width: 7%; }
    .admin-table--users th:nth-child(12) { width: 8%; }
    .admin-table--users th:nth-child(13) { width: 10%; }
    .admin-table--users th:nth-child(14) { width: 9%; }  /* akce */

    /* 15 sloupců potřebuje aspoň 1600 px. Na užší ploše (1200–1699 px) se tabulka posouvá vodorovně JEN
       uvnitř svého rámce (stránka nepřetéká); od 1700 px se vejde celá a rámec zůstává bez posuvu,
       aby lepivá hlavička fungovala vůči stránce. */
    .admin-table--users { min-width: 1600px; }

    /* Šířky sloupců – /Admin/Transactions. */
    .admin-table--tx th:nth-child(1) { width: 12%; }
    .admin-table--tx th:nth-child(2) { width: 18%; }
    .admin-table--tx th:nth-child(3) { width: 18%; }
    .admin-table--tx th:nth-child(4) { width: 7%; }
    .admin-table--tx th:nth-child(5) { width: 12%; }
    .admin-table--tx th:nth-child(6) { width: 11%; }
    .admin-table--tx th:nth-child(7) { width: 22%; }

    /* Šířky sloupců – /Admin/Invitations. */
    .admin-table--invites th:nth-child(1) { width: 16%; }
    .admin-table--invites th:nth-child(2) { width: 24%; }
    .admin-table--invites th:nth-child(3) { width: 13%; }
    .admin-table--invites th:nth-child(4) { width: 13%; }
    .admin-table--invites th:nth-child(5) { width: 22%; }
    .admin-table--invites th:nth-child(6) { width: 12%; }   /* zrušení pozvánky */

    /* Šířky sloupců – /Admin/Invitations/Send (výběr kontaktů do pozvánky). */
    .admin-table--contacts th:nth-child(1) { width: 35%; }
    .admin-table--contacts th:nth-child(2) { width: 45%; }
    .admin-table--contacts th:nth-child(3) { width: 20%; }

    /* Šířky sloupců – /Admin/GameStats, pohled PARTIE (Kdy, Hra, Hráčů, Hráči, Výsledek, Kredity).
       Sloupec Hráči je nejširší – nese štítky VŠECH účastníků partie (i 8+), které se v něm zalamují. */
    .admin-table--sessions th:nth-child(1) { width: 12%; }
    .admin-table--sessions th:nth-child(2) { width: 10%; }
    .admin-table--sessions th:nth-child(3) { width: 6%; }
    .admin-table--sessions th:nth-child(4) { width: 42%; }
    .admin-table--sessions th:nth-child(5) { width: 16%; }
    .admin-table--sessions th:nth-child(6) { width: 14%; }

    /* Šířky sloupců – /Admin/GameStats, pohled BILANCE DVOJIC. */
    .admin-table--games th:nth-child(1) { width: 15%; }
    .admin-table--games th:nth-child(2) { width: 15%; }
    .admin-table--games th:nth-child(3) { width: 13%; }
    .admin-table--games th:nth-child(4) { width: 9%; }
    .admin-table--games th:nth-child(5) { width: 15%; }
    .admin-table--games th:nth-child(6) { width: 17%; }
    .admin-table--games th:nth-child(7) { width: 16%; }

    .admin-table thead {
        display: table-header-group;
    }

    .admin-table tbody {
        display: table-row-group;
    }

    .admin-table tr {
        display: table-row;
    }

    .admin-table thead th,
    .admin-table tbody td {
        display: table-cell;
        padding: 8px 10px;
        border: 0;
        border-bottom: 1px solid #e9ecef;
        vertical-align: middle;
        min-width: 0;
        overflow-wrap: anywhere;
    }

    .admin-table tbody tr {
        border: 0;
        border-radius: 0;
        padding: 0;
    }

    .admin-table tbody tr:nth-child(even) {
        background-color: #fbfcfd;
    }

    .admin-table tbody td::before {
        display: none;
    }

    .admin-table tbody td:first-child {
        font-weight: 600;
        font-size: inherit;
    }

    /* Herní statistiky: první sloupec (Hráč A) NENÍ nadpisový sloupec – váhu písma řídí až
       zvýraznění vedoucího hráče (.fw-bold), aby neveducí „Hráč A" nebyl polotučný. */
    .admin-table--games tbody td:first-child {
        font-weight: 400;
    }

    /* Hlavička zůstane vidět i při dlouhém seznamu. */
    .admin-table thead th {
        position: sticky;
        top: 0;
        z-index: 2;
        background-color: #f8f9fa;
        border-bottom: 2px solid #dee2e6;
        text-align: left;
    }
}

@media (min-width: 1200px) and (max-width: 1699.98px) {
    .admin-table-wrap:has(.admin-table--users) {
        overflow-x: auto;
    }
}

/* Kompaktní ovládací prvky uvnitř buněk (platí v obou režimech). */
.admin-table .btn-cell {
    padding: 0.1rem 0.4rem;
    font-size: 0.8rem;
    line-height: 1.25;
    white-space: nowrap;
}

.admin-table .cell-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
}

.admin-table .cell-inline {
    display: flex;
    align-items: center;
    gap: 5px;
    flex-wrap: wrap;
}

.admin-table .cell-credits-input {
    width: 120px;
}

/* Jednořádková hodnota, která se nesmí zalomit ani roztáhnout sloupec/kartu (model zařízení):
   přebytek se ořízne třemi tečkami, celá hodnota je v title. */
.admin-table .cell-ellipsis {
    display: block;
    min-width: 0;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.admin-table .cell-sub {
    color: #6c757d;
    font-size: 0.82em;
}

/* Herní statistiky: štítky účastníků partie (pohled Partie) */
/* Účastníci partie jako zalamované štítky – počet hráčů je libovolný (1:1 i 8+), buňka roste do výšky,
   ne do šířky. Platí v tabulkovém i kartovém režimu (v kartě je štítek hodnotou pole „Hráči"). */
.gs-players {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 6px;
    align-items: center;
}

.gs-player {
    display: inline-flex;
    align-items: baseline;
    gap: 3px;
    padding: 1px 8px;
    border-radius: 999px;
    border: 1px solid #dee2e6;
    background-color: #f8f9fa;
    line-height: 1.5;
    white-space: nowrap;
}

/* Vítěz: zeleně, tučně, s trofejí (emoji v HTML). */
.gs-player--winner {
    border-color: #a3cfbb;
    background-color: #e8f5ee;
    color: #146c43;
    font-weight: 700;
}

.gs-player--draw {
    border-color: #ffe69c;
    background-color: #fff8e1;
}

/* Smazaný účet: ztlumeně a kurzívou (přezdívka je snapshot z doby hry). */
.gs-player--deleted {
    color: #6c757d;
    font-style: italic;
    border-style: dashed;
}

/* Skóre hráče (jen hry se skóre) – malé číslo za jménem. */
.gs-player-score {
    font-size: 0.8em;
    color: #6c757d;
    font-weight: 400;
}

.gs-player--winner .gs-player-score {
    color: #146c43;
}

/* Bilance dvojic: poznámka „N× vyhrál jiný" se drží u skóre; když se nevejde, zalomí se pod něj. */
.gs-score {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: baseline;
    column-gap: 2px;
}

/* Administrátorská pozvánka */

/* Box „Pozvat novou osobu" na záložce Pozvánky: pole pro e-mail + tlačítko vedle sebe,
   na úzké ploše pod sebou (tlačítko se nesmí zmáčknout na pár pixelů). */
.admin-invite-box {
    margin-bottom: 16px;
}

.admin-invite-row {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    align-items: center;
    margin-top: 4px;
}

.admin-invite-row .form-control {
    flex: 1 1 260px;
    min-width: 0;
}

/* Vybrané kontakty pozvánky – rámeček nad seznamem kontaktů, ať je pořád vidět, co se pošle. */
.invite-selected-box {
    border: 1px solid #dee2e6;
    border-radius: 8px;
    background-color: #fff;
    padding: 12px;
    margin-bottom: 16px;
}

.invite-selected-list {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin: 0 0 12px;
    padding: 0;
}

.invite-selected-item {
    display: flex;
    gap: 8px;
    align-items: center;
    border: 1px solid #dee2e6;
    border-radius: 999px;
    background-color: #f8f9fa;
    padding: 4px 10px;
}

.invite-selected-item .btn-close {
    font-size: 0.65rem;
}

.invite-send-row {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

/* Už přidaný kontakt zůstává v seznamu, ale zašedlý a bez možnosti přidat ho podruhé. */
.invite-contact--added {
    opacity: 0.5;
}

/* Jazyk uživatele ve výpisu /Admin/Users: vlajka + nativní název na jednom řádku (v tabulce i v kartě). */
.cell-lang { display: inline-flex; align-items: center; gap: .4rem; white-space: nowrap; }
.cell-lang-flag { width: 1.25rem; height: auto; border-radius: 2px; box-shadow: 0 0 0 1px rgba(0,0,0,.15); flex: 0 0 auto; }

/* Karta „Analýza uživatelů a diskuzí" na /Admin/Settings (tabulky nových účtů a nových diskuzí).
   Stejný vzor jako ostatní seznamy administrace: pod 1200 px karty s popisky (data-label), od 1200 px tabulka
   s pevnými šířkami sloupců a menším písmem – má 18 resp. 14 sloupců, proto má tabulka minimální šířku
   a mezi 1200 px a touto šířkou se posouvá vodorovně JEN uvnitř svého rámce (stránka nepřetéká).
   Celý řádek je odkaz do nové záložky: každá buňka nese blokový odkaz (bez JS a bez position:relative na <tr>). */
.container:has(.admin-analysis) {
    max-width: 2400px;
}

.admin-analysis .row-link {
    display: block;
    color: inherit;
    text-decoration: none;
    min-width: 0;
}

.admin-analysis .row-link:hover {
    text-decoration: underline;
}

.admin-analysis .analysis-summary {
    white-space: pre-wrap;
}

/* Podezřelá položka je žlutě podbarvená v obou režimech (karta i řádek tabulky). */
.admin-table--analysis tbody tr.is-suspicious {
    background-color: var(--bs-warning-bg-subtle, #fff3cd);
}

@media (min-width: 1200px) {
    .admin-table-wrap--scroll {
        overflow-x: auto;
    }

    .admin-table--analysis {
        font-size: 0.82rem;
    }

    .admin-table--analysis thead th,
    .admin-table--analysis tbody td {
        padding: 6px 6px;
    }

    .admin-table--analysis thead th .sort-header {
        font-size: 0.78rem;
        white-space: normal;
        line-height: 1.2;
    }

    .admin-table--analysis tbody tr.is-suspicious:nth-child(even) {
        background-color: var(--bs-warning-bg-subtle, #fff3cd);
    }

    /* Nově registrovaní uživatelé (18 sloupců, součet 100 %). */
    .admin-table--analysis-users { min-width: 1700px; }
    .admin-table--analysis-users th:nth-child(1) { width: 8%; }    /* přezdívka */
    .admin-table--analysis-users th:nth-child(2) { width: 4%; }    /* podezřelé */
    .admin-table--analysis-users th:nth-child(3) { width: 11%; }   /* e-mail */
    .admin-table--analysis-users th:nth-child(4) { width: 6%; }    /* registrace */
    .admin-table--analysis-users th:nth-child(5) { width: 5%; }    /* jazyk */
    .admin-table--analysis-users th:nth-child(6) { width: 6%; }    /* aktivita web */
    .admin-table--analysis-users th:nth-child(7) { width: 6%; }    /* aktivita mobil */
    .admin-table--analysis-users th:nth-child(8) { width: 7%; }    /* IP */
    .admin-table--analysis-users th:nth-child(9) { width: 4%; }    /* různých IP */
    .admin-table--analysis-users th:nth-child(10) { width: 5%; }   /* sdílená IP */
    .admin-table--analysis-users th:nth-child(11) { width: 4%; }   /* diskuze */
    .admin-table--analysis-users th:nth-child(12) { width: 4%; }   /* komentáře */
    .admin-table--analysis-users th:nth-child(13) { width: 4%; }   /* zprávy */
    .admin-table--analysis-users th:nth-child(14) { width: 4%; }   /* pozvánky */
    .admin-table--analysis-users th:nth-child(15) { width: 4%; }   /* hlášení */
    .admin-table--analysis-users th:nth-child(16) { width: 4%; }   /* blokace */
    .admin-table--analysis-users th:nth-child(17) { width: 4%; }   /* stav */
    .admin-table--analysis-users th:nth-child(18) { width: 10%; }  /* důvod */

    /* Nově založené diskuze (14 sloupců, součet 100 %). */
    .admin-table--analysis-discussions { min-width: 1400px; }
    .admin-table--analysis-discussions th:nth-child(1) { width: 16%; }   /* název */
    .admin-table--analysis-discussions th:nth-child(2) { width: 4%; }    /* podezřelé */
    .admin-table--analysis-discussions th:nth-child(3) { width: 8%; }    /* rubrika */
    .admin-table--analysis-discussions th:nth-child(4) { width: 9%; }    /* autor */
    .admin-table--analysis-discussions th:nth-child(5) { width: 7%; }    /* vytvořeno */
    .admin-table--analysis-discussions th:nth-child(6) { width: 4%; }    /* délka */
    .admin-table--analysis-discussions th:nth-child(7) { width: 4%; }    /* odkazy */
    .admin-table--analysis-discussions th:nth-child(8) { width: 5%; }    /* zobrazení */
    .admin-table--analysis-discussions th:nth-child(9) { width: 5%; }    /* komentáře */
    .admin-table--analysis-discussions th:nth-child(10) { width: 4%; }   /* lajky */
    .admin-table--analysis-discussions th:nth-child(11) { width: 4%; }   /* hlášení */
    .admin-table--analysis-discussions th:nth-child(12) { width: 4%; }   /* filtr */
    .admin-table--analysis-discussions th:nth-child(13) { width: 6%; }   /* stav */
    .admin-table--analysis-discussions th:nth-child(14) { width: 20%; }  /* důvod */
}

/* /Admin/Logs – text logu (stacktrace) se zalamuje a dlouhý se posouvá uvnitř rámečku. */
.log-message {
    white-space: pre-wrap;
    word-break: break-word;
    max-height: 320px;
    overflow: auto;
    font-size: 0.82rem;
    background: #f8f9fa;
    padding: 8px 10px;
    border-radius: 6px;
    margin: 0;
}

/* Zdroj logu (Soubor.Metoda) bývá dlouhý – štítek se na telefonu musí zalomit (badge je jinak nowrap a přetekl by). */
.log-source {
    white-space: normal;
    overflow-wrap: anywhere;
    text-align: left;
}

/* Mazací tlačítka logů: globální .btn má pevnou výšku (--btn-height), takže delší potvrzovací text
   „Opravdu smazat vše?" by se ve stísněném sloupci zalomil a byl oříznut – tlačítka proto rostou do výšky. */
.log-delete-actions .btn {
    height: auto;
    min-height: var(--btn-height);
    white-space: normal;
    line-height: 1.15;
}

/* /Admin/Reports – tlačítko „Označit vyřízené / Vrátit k vyřízení": delší překlad se smí zalomit
   a tlačítko pak roste do výšky (globální .btn má pevnou výšku a text by z něj vytekl). */
.report-state-btn {
    height: auto;
}
