/* Habillage aux couleurs du club Le Logis Auderghem, par-dessus Tabler */
:root {
    --club-rouge: #E50202;
    --club-bleu: #0D062E;
    --club-vert: #42A735;

    --tblr-primary: var(--club-rouge);
    --tblr-primary-rgb: 229, 2, 2;
    --tblr-link-color: var(--club-rouge);
    --tblr-link-color-rgb: 229, 2, 2;
}

/* Tabler pose margin-left: calc(100vw - 100%) sur :root des 992px (compensation de scrollbar
   verticale), ce qui laisse un vide visible a gauche des que la page defile verticalement.
   On annule : charge apres tabler.min.css donc gagne a specificite egale. */
@media (min-width: 992px) {
    :root {
        margin-left: 0;
    }
}

.navbar-brand-image {
    height: 2.2rem;
}

/* Tabler pose img { max-width: 100%; height: auto; } sur toutes les images (reset "responsive
   image" par defaut), ce qui ecrase l'attribut HTML height d'un <img> nu - il faut une regle CSS
   (specificite de classe) plutot que l'attribut pour reduire la taille du logo de connexion. */
.login-logo {
    height: 100px;
    width: auto;
}

/* Barres de navigation (admin + publique) : fond blanc en theme clair, surface Tabler par
   defaut en theme sombre - meme habillage des deux cotes. */
:root:not([data-bs-theme="dark"]) .admin-navbar,
:root:not([data-bs-theme="dark"]) .public-navbar {
    background-color: #fff;
}

/* Barres de navigation fixees en haut sur grand ecran (desktop) : les pages admin (tableaux,
   poules...) peuvent etre longues, et remonter tout en haut a chaque fois pour changer de menu
   ou rafraichir est penible. Limite a partir de 992px (lg) : sur mobile/tablette, le menu est un
   simple deroulant compact deja gere separement ci-dessus, la fixer en plus ajouterait de la
   complexite pour peu de benefice sur un petit ecran ou l'on scrolle differemment. */
@media (min-width: 992px) {
    .admin-navbar,
    .public-navbar {
        position: sticky;
        top: 0;
        z-index: 1030;
    }
}

/* Bouton flottant "retour en haut" : masque par defaut, revele en JS (voir app.js) une fois
   qu'on a suffisamment scrolle - inutile en haut de page ou la barre de nav est deja a portee. */
.btn-back-to-top {
    position: fixed;
    right: 24px;
    bottom: 24px;
    z-index: 1030;
    width: 44px;
    height: 44px;
    border: none;
    border-radius: 50%;
    background-color: var(--club-rouge);
    color: #fff;
    font-size: 1.1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 4px 12px rgba(0, 0, 0, .25);
    opacity: 0;
    visibility: hidden;
    transform: translateY(8px);
    transition: opacity .2s ease, transform .2s ease, visibility .2s;
}
.btn-back-to-top.is-visible {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
}
.btn-back-to-top:hover {
    background-color: #c00202;
    color: #fff;
}

/* Menu mobile de la barre publique : un simple menu deroulant (survole le contenu) plutot
   qu'un bloc qui repousse toute la page - plus compact et plus proche du menu "burger"
   habituel sur smartphone. */
@media (max-width: 767.98px) {
    .public-navbar {
        position: relative; /* ancre le menu deroulant juste sous la barre, pas sous un ancetre plus haut */
    }
    .public-navbar .navbar-collapse {
        position: absolute;
        top: 100%;
        left: 0;
        right: 0;
        background-color: var(--tblr-bg-surface, #fff);
        border-bottom: 1px solid var(--tblr-border-color, rgba(0, 0, 0, .08));
        box-shadow: 0 8px 16px rgba(0, 0, 0, .08);
        padding: .5rem 1rem 1rem;
        z-index: 1030;
    }
    .public-navbar .navbar-nav {
        width: 100%;
    }
}

/* Habillage de Selectize (recherche/autocompletion dans un <select>, voir handicap.php) pour
   ressembler a un .form-select Tabler plutot qu'au theme "default" fourni par la librairie -
   aucune variante Bootstrap 5 n'existe pour cette version (0.12.6, la derniere publiee sur npm).
   Variables --tblr-* : suit automatiquement le theme clair/sombre, comme le reste de l'app.
   !important necessaire : le CSS du theme "default" de Selectize (charge en $extraStyles, donc
   APRES ce fichier commun dans le <head>) a la meme specificite et gagnerait sinon a l'ordre. */
.selectize-control.form-select {
    /* Filet de securite : Selectize recopie les classes du <select> d'origine sur son wrapper -
       si jamais "form-select" s'y retrouve, ca donnerait un "select dans un select" (la boite
       Tabler du wrapper + la boite .selectize-input a l'interieur). Le <select> source ne porte
       normalement plus cette classe (voir handicap.php), mais neutralise ici par prudence. */
    border: none !important;
    padding: 0 !important;
    background: none !important;
    background-image: none !important;
}
.selectize-control.single .selectize-input {
    border: 1px solid var(--tblr-border-color, #dce1e7) !important;
    border-radius: 4px !important;
    padding: .4375rem .75rem !important;
    min-height: calc(2.25rem + 2px) !important;
    font-size: .875rem !important;
    font-family: inherit !important;
    color: var(--tblr-body-color, #182433) !important;
    background-color: var(--tblr-bg-surface, #fff) !important;
    background-image: none !important;
    box-shadow: none !important;
}
.selectize-control.single .selectize-input.input-active,
.selectize-control.single .selectize-input.focus {
    border-color: var(--club-rouge) !important;
    box-shadow: 0 0 0 .25rem rgba(229, 2, 2, .25) !important;
}
.selectize-input input {
    color: inherit !important;
    font-family: inherit !important;
}
.selectize-control .selectize-input.disabled {
    opacity: .5 !important;
}
.selectize-dropdown {
    border: 1px solid var(--tblr-border-color, #dce1e7) !important;
    border-radius: 4px !important;
    box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .1) !important;
    font-size: .875rem !important;
    font-family: inherit !important;
    color: var(--tblr-body-color, #182433) !important;
    background-color: var(--tblr-bg-surface, #fff) !important;
}
.selectize-dropdown-content .option {
    padding: .5rem .75rem !important;
}
.selectize-dropdown .active {
    background-color: var(--club-rouge) !important;
    color: #fff !important;
}

.btn-primary {
    background-color: var(--club-rouge);
    border-color: var(--club-rouge);
}

.btn-primary:hover, .btn-primary:focus {
    background-color: #c00202;
    border-color: #c00202;
}

.badge.bg-club-vert {
    background-color: var(--club-vert) !important;
}

.status-libre { color: var(--club-vert); }
.status-occupee { color: var(--club-rouge); }
.status-hors-service { color: #6c757d; }

.table-card.status-libre { border-left: 4px solid var(--club-vert); }
.table-card.status-occupee { border-left: 4px solid var(--club-rouge); }
.table-card.status-hors-service { border-left: 4px solid #6c757d; opacity: 0.7; }

/* Bascule de theme (barre de navigation admin) : .hide-theme-dark / .hide-theme-light
   sont fournies par Tabler et pilotees par l'attribut data-bs-theme sur <html>. */

/* Tables affichees sous forme de pastilles numerotees, groupees par salle */
.table-pill {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.25rem;
    height: 2.25rem;
    padding: 0 .4rem;
    border-radius: 6px;
    font-weight: 600;
    font-size: .8125rem;
}
.table-pill.status-libre { background: rgba(66, 167, 53, .15); color: var(--club-vert); }
.table-pill.status-occupee { background: rgba(245, 159, 0, .18); color: #f59f00; }
.table-pill.status-hors-service { background: rgba(229, 2, 2, .12); color: var(--club-rouge); text-decoration: line-through; opacity: .8; }

@media print {
    .no-print { display: none !important; }
}

/* .alert-icon (Tabler) est concu pour un <svg> aux dimensions explicites (largeur/hauteur fixees
   par Tabler lui-meme) ; l'app utilise des icones FontAwesome partout ailleurs, dont seule la
   taille de police determine le rendu visuel - sans ceci le glyphe reste minuscule dans sa boite. */
.alert-icon.fa-solid, .alert-icon.fa-regular {
    font-size: 1.4rem;
    line-height: 20px;
    text-align: center;
}
.alert .d-flex > div:first-child { margin-right: .75rem; }

/* Page de check-in public (checkin.php) : liste de resultats en grands boutons faciles a toucher
   sur un telephone, et carte de confirmation avec une icone bien visible. */
.checkin-results { max-height: 320px; overflow-y: auto; }
.checkin-result-item {
    display: flex;
    align-items: center;
    padding: .85rem 1rem;
    font-size: 1.05rem;
}
.checkin-result-name { font-weight: 600; }
.checkin-confirm-card { max-width: 480px; margin: 0 auto; }

/* Arbre de tableau "maison" (admin/bracket.php), meme technique que l'affichage TV
 * (compute_bracket_tree_layout : boites/lignes positionnees en % dans un conteneur de taille
 * fixe) mais habillee pour le theme admin clair/sombre plutot que le theme TV toujours sombre.
 * .bracket-tree-scroll defile horizontalement des que min-width (voir bracket.php) depasse la
 * largeur de la carte - jamais de colonnes ecrasees sur un gros tableau. */
.bracket-tree-scroll { overflow-x: auto; overflow-y: hidden; border-radius: 8px; background: var(--tblr-bg-surface-secondary, rgba(0, 0, 0, .03)); padding: 16px; }
/* Bandeau d'en-tetes de phase (1/8, 1/4, 1/2, Finale...) au-dessus de l'arbre, UNE fois par
 * colonne plutot que repetee dans chaque boite - alignee sur les memes colX/colWidth que les
 * boites (voir compute_bracket_tree_layout -> colWidth/colGap). */
.bracket-tree-headers { position: relative; height: 26px; margin-bottom: 10px; }
.bracket-tree-header {
    position: absolute; top: 0; text-align: center; font-size: .8rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: .03em; color: var(--tblr-secondary);
}
.bracket-tree { position: relative; }
.bracket-tree-line { position: absolute; background: var(--tblr-border-color); }
.bracket-tree-line-h { height: 2px; }
.bracket-tree-line-v { width: 2px; }
.bracket-tree-line-h.is-dashed { background: none; border-top: 2px dashed var(--club-rouge); height: 0; }
.bracket-tree-line-v.is-dashed { background: none; border-left: 2px dashed var(--club-rouge); width: 0; }
.bracket-tree-match {
    position: absolute;
    display: flex;
    flex-direction: column;
    justify-content: center;
    background: var(--tblr-bg-surface, #fff);
    border: 1px solid var(--tblr-border-color);
    border-radius: 6px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .08);
    overflow: hidden;
    font-size: 13px;
    padding-top: 14px;
    box-sizing: border-box;
}
.bracket-tree-match.is-live { box-shadow: 0 0 0 2px var(--club-rouge), 0 1px 3px rgba(0, 0, 0, .08); }
.bracket-tree-match-num {
    position: absolute; top: 2px; left: 8px; right: 8px; font-size: 10px; color: var(--tblr-secondary);
    font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bracket-tree-slot {
    display: flex; justify-content: space-between; align-items: center; gap: 8px; flex: 1; min-height: 0;
    padding: 0 10px; font-weight: 600; border-bottom: 1px solid var(--tblr-border-color);
}
.bracket-tree-slot:last-child { border-bottom: none; }
.bracket-tree-slot-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bracket-tree-slot-score { flex-shrink: 0; font-variant-numeric: tabular-nums; }
.bracket-tree-slot.is-winner { background: rgba(47, 179, 68, .15); }
.bracket-tree-slot.is-winner .bracket-tree-slot-name, .bracket-tree-slot.is-winner .bracket-tree-slot-score { color: #1c7a30; }
/* Exempt (Bye) affiche dans l'arbre : boite attenuee, cote "Bye" en italique gris, ou bouton
 * d'action discret si un joueur en retard peut encore le combler (voir admin/bracket.php). */
.bracket-tree-match.is-bye { opacity: .75; }
.bracket-tree-bye-label { font-style: italic; color: var(--tblr-secondary); }
.bracket-tree-bye-btn { background: none; border: none; padding: 0; font: inherit; font-weight: 700; color: var(--club-rouge); cursor: pointer; }
.bracket-tree-bye-btn:hover { text-decoration: underline; }
