/* beachadex/beachadex.css
   Styles communs à toutes les pages Beachadex (characters.php, officier.php,
   et celles à venir). À lier en plus de style.css sur chaque page Beachadex. */

/* Police "stencil" façon pochoir militaire, réservée aux titres de section,
   labels de type/classe et boutons d'action — Bangers (déjà chargée par
   chaque page, voir <head>) reste la police d'identité (logo, nom du
   personnage/bâtiment survolé) pour garder le côté "tropical/BD arcade" ;
   Staatliches apporte la touche "militaire" sur le chrome UI. Chargée ici
   (et non dans le <head> de chaque page) pour ne pas avoir à toucher tous
   les fichiers qui incluent cette feuille. */
/* Polices locales fournies par le projet (fichiers .ttf) :
   - Bangers      : titres et éléments d'identité (logo, nom de fiche, titres
                    de section, en-têtes de bandeaux/onglets, nav du header...)
   - Montserrat   : tout le reste du texte (corps, tableaux, formulaires...)
   Chemins relatifs à ce fichier (beachadex/beachadex.css) : on suppose un
   dossier /fonts/ à la racine du site, donc ../fonts/... — à adapter si les
   .ttf sont rangés ailleurs. Seul le poids Bold a été fourni pour
   Montserrat : tout le texte "Montserrat" du site s'affiche donc en gras. */
@font-face {
    font-family: 'Bangers';
    src: url('../fonts/Bangers.ttf') format('truetype');
    font-weight: 400;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Montserrat';
    src: url('../fonts/Montserrat-Bold.ttf') format('truetype');
    font-weight: 700;
    font-style: normal;
    font-display: swap;
}

/* Police par défaut de toutes les pages Beachadex/tracker qui chargent
   cette feuille (corps de texte, tableaux, formulaires...) — les titres et
   le header ci-dessous surchargent explicitement avec Bangers. */
html, body {
    font-family: 'Montserrat', 'Segoe UI', Arial, sans-serif;
}

/* ---------------------------------------------------------------------
   Variables pilotées par la page Paramètres (settings.php / $user_settings,
   voir core/settings.php). Thème "Boom Beach tropical & militaire" :
   sombre = opérations de nuit sur la plage (olive/kaki + camp de base sombre),
   clair = plage de jour (sable/bois clair) — accent commun turquoise océan,
   doré pour les éléments "récompense/rang" (voir --bx-gold). Posé par
   beachadex/includes/header.php via data-theme="light"/dark, etc. sur <html>
   (voir le script ajouté en bas de header.php).
   --------------------------------------------------------------------- */
:root {
    /* Palette calquée sur les fenêtres du jeu (voir screenshots Profil/
       Paramètres/Inventaire) : fond lagon bleu profond, panneaux "vitre"
       bleu turquoise dégradé cerclés de crème/sable, cartes intérieures
       gris-ardoise, accents dorés façon médaille/bouton. */
    --bx-bg:          #0b3550;
    --bx-bg-topbar:   #0d3f61;
    --bx-bg-panel:    #1a6fa0;
    --bx-bg-card:     #3a3f4a;
    --bx-bg-card-2:   #4a5162;
    --bx-bg-input:    #f4ecd8;
    --bx-bg-hover:    #565f74;
    --bx-bg-deep:     #2b303a;
    --bx-border:      #f4e6bf;
    --bx-text:        #ffffff;
    --bx-text-muted:  #b9c9dc;
    --bx-text-muted-2:#8fa3ba;
    --bx-text-soft:   #dfe9f4;
    --bx-text-soft-2: #eef4fa;
    --bx-accent:      #33c7f0;
    /* Doré "médaille/récompense/bouton" (Modifier, Oui, badges de QG...) —
       utilisé à part de --bx-accent (cyan) pour garder ce dernier réservé
       aux éléments interactifs (liens actifs, focus). */
    --bx-gold:        #ffb400;
    --bx-gold-dark:   #a95e00;
    --bx-gold-light:  #ffe066;
    /* Bordure "sable/crème" des grandes fenêtres façon jeu (dialogues,
       character-dex-card) — distincte de --bx-border (réutilisée aussi
       pour les liserés fins). */
    --bx-card-border: #f4e6bf;
    /* Bleu "coque de fenêtre" (bandeaux d'onglet, boutons bleus type
       Aide/Renseignements) et vert "positif" (Oui/validation). */
    --bx-window-blue: #2a8fc7;
    --bx-positive:    #7ec13a;
    --bx-negative:    #e0542f;

    /* Palette "wiki communautaire" (inspirée de boombeach.fandom.com),
       utilisée UNIQUEMENT par la fiche Beachadex (.character-dex-card et
       les sections character-dex-section/character-levels-table qui
       l'accompagnent) — volontairement indépendante de --bx-* ci-dessus
       (qui pilote le bandeau, le tiroir Paramètres et le thème sombre/clair
       du reste du site) pour ne rien changer d'autre. Bandeaux bleu-teal +
       fond crème/parchemin façon infobox de wiki. */
    --wiki-teal:        #3f7686;
    --wiki-teal-light:  #4f8ea0;
    --wiki-teal-dark:   #2c5866;
    --wiki-teal-darker: #1f4048;
    --wiki-cream:       #f4e6c6;
    --wiki-cream-alt:   #ecdcb2;
    --wiki-cream-dark:  #e0caa0;
    --wiki-text:        #2c2013;
    --wiki-text-soft:   #55483a;
    /* Variante grise du bandeau sombre (--wiki-text) -- utilisée pour
       "Autres caractéristiques" (fond neutre, pas teinté marron). */
    --wiki-gray-dark:   #333333;
    --wiki-gray:        #3d3d3d;
    --wiki-gray-light:  #494949;
    --wiki-gray-text:   #f2f2f2;
    --wiki-gray-text-soft: #cfcfcf;

    /* Nombre de troupes par ligne (character-browse-group-icons) — reflète
       units_per_row (3 à 6, défaut 4). Une seule grille l'utilise pour
       l'instant ; à réutiliser telle quelle sur toute future grille
       Beachadex/tracker concernée par ce réglage. */
    --bx-units-per-row: 4;

    /* Hauteur du topbar (logo/nav/recherche/paramètres, tout sur une seule
       ligne) — sert à caler le padding-top du body et le panneau de
       recherche, voir plus bas, sans dupliquer la valeur. */
    --bx-topbar-h: 90px;
}

html[data-theme="light"] {
    /* Variante "jour" : mêmes fenêtres bleu lagon, fond général plus clair
       (sable) pour la page derrière les panneaux. */
    --bx-bg:          #cfe9f7;
    --bx-bg-topbar:   #1a6fa0;
    --bx-bg-panel:    #2a95c9;
    --bx-bg-card:     #eef2f6;
    --bx-bg-card-2:   #dfe6ee;
    --bx-bg-input:    #ffffff;
    --bx-bg-hover:    #e4ecf3;
    --bx-bg-deep:     #d7e0e8;
    --bx-border:      #ffffff;
    --bx-text:        #1c2733;
    --bx-text-muted:  #4d6379;
    --bx-text-muted-2:#5c7285;
    --bx-text-soft:   #2c3a48;
    --bx-text-soft-2: #17212b;
    --bx-accent:      #0d84b5;
    --bx-gold:        #f2a900;
    --bx-gold-dark:   #8f5900;
    --bx-gold-light:  #ffd873;
    --bx-card-border: #ffffff;
    --bx-window-blue: #2a8fc7;
    --bx-positive:    #6bb02e;
    --bx-negative:    #d84a26;
}

/* Contraste élevé (réglage "Accessibilité" > Contraste élevé) : bordures et
   séparateurs renforcés, texte secondaire rapproché du texte principal —
   appliqué par-dessus le thème choisi (sombre ou clair), pas à sa place. */
html[data-high-contrast="1"] {
    --bx-border:      currentColor;
    --bx-text-muted:  var(--bx-text);
    --bx-text-muted-2:var(--bx-text);
    --bx-text-soft:   var(--bx-text);
    --bx-text-soft-2: var(--bx-text);
}

/* Texte agrandi (réglage "Accessibilité" > Texte agrandi) : agrandit tout le
   texte des pages Beachadex d'un cran, sans casser les grilles à largeur
   fixe (elles restent en px, seul le texte grossit). */
html[data-large-text="1"] .character-page-wrapper,
html[data-large-text="1"] .settings-page {
    font-size: 1.12em;
}

/* Icônes de la bande de navigation (character-browse-icon) : taille pilotée
   par le réglage icon_size. Par défaut ("medium"), rien ne change — les
   icônes gardent leur taille actuelle (100% de leur cellule de grille). */
html[data-icon-size="small"] .character-browse-icon img {
    width: 72%;
}
html[data-icon-size="large"] .character-browse-icon {
    padding: 4px;
}

.beachadex-topbar {
    display: flex;
    align-items: center;
    gap: 18px;
    padding: 14px 18px;
    background: linear-gradient(180deg, #0f4e77 0%, var(--bx-bg-topbar) 60%, #082c44 100%);
    border-bottom: 3px solid var(--bx-gold);
    box-shadow: 0 3px 10px rgba(0, 0, 0, 0.4), inset 0 -8px 14px -10px rgba(0, 0, 0, 0.5);
    /* position: fixed plutôt que sticky : sticky casse dès qu'un ancêtre
       (n'importe où dans le DOM, y compris hors de notre contrôle sur les
       pages du site connecté) a un overflow, un transform ou une hauteur
       fixe. fixed garantit un header collé en haut "quoi qu'il arrive". */
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    width: 100%;
    height: var(--bx-topbar-h);
    z-index: 1000;
    box-sizing: border-box;
}

/* Le topbar sortant du flux normal (position: fixed), on redonne cet espace
   à toute page qui l'inclut, automatiquement, sans avoir à toucher chaque
   page une par une. */
body:has(.beachadex-topbar) {
    padding-top: var(--bx-topbar-h);
}

/* Sur mobile, ce topbar desktop (logo + nav-links + recherche/paramètres)
   est remplacé par la barre mobile PARTAGÉE avec le tracker
   (.bx-mobile-topbar, voir core/mobile_nav.php + style.css) : on le masque
   ainsi que son panneau de recherche desktop, et on corrige le padding du
   body en conséquence (règle plus bas dans le fichier que celle ci-dessus,
   donc prioritaire à égalité de spécificité quand la media query matche). */
@media (max-width: 768px) {
    .beachadex-topbar,
    .beachadex-topbar-search {
        display: none;
    }

    body:has(.beachadex-topbar) {
        padding-top: var(--mobile-topbar-h, 56px);
    }
}

.beachadex-topbar-logo {
    flex-shrink: 0;
    font-family: 'Bangers', cursive;
    letter-spacing: 1px;
    font-size: 1.4em;
    /* 🔥 CORRECTIF (demande explicite) : texte blanc avec contour noir (au lieu
       du doré/marron précédent). -webkit-text-stroke pour le contour "propre"
       (Chrome/Edge/Safari) + text-shadow multi-directionnel en secours pour les
       navigateurs qui ignorent text-stroke (Firefox). */
    color: #fff;
    -webkit-text-stroke: 1.5px #000;
    text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000, 0 2px 4px rgba(0, 0, 0, 0.5);
    text-decoration: none;
}

/* Liens Troupes & Armée / Bâtiments / Gravures / Boost / Gadgets — scrollable
   horizontalement si ça déborde (mobile étroit), plutôt que de casser sur
   plusieurs lignes ou de rétrécir le logo/les icônes. */
.beachadex-topbar-nav-links {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    overflow-x: auto;
    scrollbar-width: none;
    height: 100%;
}
.beachadex-topbar-nav-links::-webkit-scrollbar {
    display: none;
}

.beachadex-topbar-nav-link {
    flex-shrink: 0;
    /* 🔥 Rétréci à ~82% de la taille d'origine (194x50 -> 160x41), même ratio
       largeur/hauteur conservé pour ne pas déformer le fond biseauté. */
    width: 160px;
    height: 41px;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 3px 6px;
    margin: 0 1px;
    color: var(--bx-text-soft);
    text-decoration: none;
    font-family: 'Bangers', cursive;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    font-size: clamp(0.6em, 1.2vw, 0.85em);
    font-weight: 400;
    line-height: 1.05;
    white-space: normal;
    overflow: hidden;
    border-radius: 8px 8px 0 0;
    border-bottom: 3px solid transparent;
    background-image: url('../images/icons/76.png');
    background-repeat: no-repeat;
    background-position: center;
    background-size: cover;
    transition: color .15s ease, border-color .15s ease, box-shadow .15s ease;
}

.beachadex-topbar-nav-link:hover {
    color: #fff;
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.1);
}

.beachadex-topbar-nav-link.active {
    color: var(--bx-gold-light);
}

/* Dashboard, dans le groupe actions (à droite, avec recherche/paramètres) —
   pas dans le groupe scrollable, pour rester toujours visible : bouton
   doré biseauté façon "Modifier"/"Recruter" du jeu. */
.beachadex-topbar-nav-dashboard {
    width: 160px;
    height: 41px;
    padding: 3px 6px;
    background-image: url('../images/icons/75.png');
    background-repeat: no-repeat;
    background-position: center;
    background-size: cover;
}
.beachadex-topbar-nav-dashboard:hover {
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.1);
}

.beachadex-topbar-actions {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: 14px;
}

.beachadex-topbar-icon-btn {
    background: linear-gradient(180deg, #2a8fc7 0%, #0d3f61 100%);
    border: 2px solid var(--bx-card-border);
    border-radius: 50%;
    width: 36px;
    height: 36px;
    padding: 4px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
    transition: transform .15s ease, border-color .15s ease;
}
.beachadex-topbar-icon-btn:hover {
    border-color: var(--bx-gold);
    transform: translateY(-1px);
}

.beachadex-topbar-icon-btn img {
    width: 20px;
    height: 20px;
    object-fit: contain;
    filter: drop-shadow(0 1px 0 rgba(0, 0, 0, 0.4));
}

/* ---------------------------------------------------------------------
   Formulaire "Paramètres" (core/settings_form.php) — était en <style>
   inline dans settings.php, déplacé ici : le volet coulissant (voir
   plus bas) injecte ce même fragment sur N'IMPORTE QUELLE page, y compris
   celles qui ne chargent pas ce <style> inline (ex: index.php avant sa
   propre correction) — donc ce CSS doit vivre dans la feuille globale.
   --------------------------------------------------------------------- */
.settings-page { max-width: 720px; margin: 0 auto; padding: 24px 16px 60px; color: var(--bx-text); }
.settings-page h1 {
    font-family: "Bangers", cursive;
    font-size: 2.2em;
    letter-spacing: 1px;
    margin-bottom: 4px;
    color: var(--bx-gold-light);
    text-shadow: 0 2px 0 #6b3e00, 0 3px 6px rgba(0, 0, 0, 0.5);
}
.settings-page .settings-subtitle { opacity: .8; margin-bottom: 24px; font-size: .95em; color: var(--bx-text-soft); }
.settings-flash { background: color-mix(in srgb, var(--bx-positive) 20%, transparent); border: 2px solid var(--bx-positive); color: var(--bx-text); padding: 10px 14px; border-radius: 10px; margin-bottom: 20px; }
.settings-flash.error { background: color-mix(in srgb, var(--bx-negative) 25%, transparent); border-color: var(--bx-negative); color: var(--bx-text); }
.settings-group {
    background: linear-gradient(180deg, var(--bx-bg-card-2) 0%, var(--bx-bg-card) 100%);
    border: 2px solid var(--bx-card-border);
    border-radius: 14px;
    padding: 18px 20px;
    margin-bottom: 18px;
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
}
.settings-group h2 {
    font-family: 'Bangers', cursive;
    font-size: 1.15em;
    margin: -18px -20px 14px;
    padding: 8px 20px;
    color: #fff;
    background: linear-gradient(180deg, var(--bx-window-blue) 0%, #185b83 100%);
    border-bottom: 2px solid var(--bx-card-border);
    border-radius: 12px 12px 0 0;
    text-transform: uppercase;
    letter-spacing: .5px;
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
}
/* 🔥 flex-wrap:wrap : sans ça, un select/input pouvait légèrement déborder du
   panneau dans un contexte étroit (volet Paramètres, voir .bx-settings-drawer-
   panel) -- les <select> natifs résistent au rétrécissement flex (min-width:
   auto par défaut) et ne coupent jamais leur propre texte. Le wrap ne se
   déclenche que si ça ne rentre vraiment pas (label long + largeur réduite),
   sans rien changer visuellement quand il y a la place. */
.settings-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px; padding: 10px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
.settings-row:last-child { border-bottom: none; }
.settings-row label.settings-label { font-size: .95em; flex: 1 1 auto; min-width: 0; }
.settings-row select, .settings-row input[type="number"] {
    background: var(--bx-bg-input); color: #1c2733; border: 2px solid var(--bx-card-border); border-radius: 8px; padding: 6px 10px;
    max-width: 100%;
    flex-shrink: 0;
    box-sizing: border-box;
}
.settings-toggle { position: relative; width: 44px; height: 26px; flex-shrink: 0; }
.settings-toggle input { opacity: 0; width: 0; height: 0; }
.settings-toggle .slider { position: absolute; inset: 0; background: #2b303a; border: 1px solid rgba(0,0,0,.3); border-radius: 24px; transition: .15s; cursor: pointer; }
.settings-toggle .slider::before { content: ''; position: absolute; width: 20px; height: 20px; left: 2px; top: 2px; background: #fff; border-radius: 50%; box-shadow: 0 1px 3px rgba(0,0,0,.5); transition: .15s; }
.settings-toggle input:checked + .slider { background: var(--bx-positive); }
.settings-toggle input:checked + .slider::before { transform: translateX(18px); }
.settings-submit {
    display: block;
    width: 100%;
    padding: 14px;
    margin-top: 8px;
    background: linear-gradient(180deg, var(--bx-gold-light) 0%, var(--bx-gold) 55%, var(--bx-gold-dark) 100%);
    color: #4a2c00;
    font-family: 'Bangers', cursive;
    letter-spacing: .5px;
    text-transform: uppercase;
    font-weight: 700;
    border: 1px solid #ffdf94;
    border-bottom: 4px solid #7a4400;
    border-radius: 12px;
    font-size: 1.05em;
    cursor: pointer;
    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.35);
    transition: transform .12s ease, filter .12s ease;
}
.settings-submit:hover { filter: brightness(1.06); transform: translateY(-1px); }
.settings-submit:active { transform: translateY(1px); border-bottom-width: 2px; }
.settings-guest-note { font-size: .85em; opacity: .75; margin-top: 18px; text-align: center; }

/* ---------------------------------------------------------------------
   Volet coulissant "Paramètres" (desktop/tablette, voir header.php pour la
   logique JS ouverture/fermeture + bascule mobile = navigation classique).
   Backdrop cliquable + panneau qui glisse depuis la droite. Contenu
   (.settings-page, voir core/settings_form.php) injecté en JS, hérite donc
   naturellement de toutes les règles .settings-* déjà définies ailleurs.
   --------------------------------------------------------------------- */
.bx-settings-drawer {
    position: fixed;
    inset: 0;
    z-index: 2000;
    pointer-events: none;
}

.bx-settings-drawer-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, .55);
    opacity: 0;
    transition: opacity .2s ease;
}

.bx-settings-drawer-panel {
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 470px;
    max-width: 92vw;
    background: linear-gradient(180deg, #0f4e77 0%, var(--bx-bg) 100%);
    border-left: 4px solid var(--bx-card-border);
    box-shadow: -8px 0 24px rgba(0, 0, 0, .5);
    transform: translateX(100%);
    transition: transform .25s ease;
    overflow-y: auto;
    box-sizing: border-box;
}

.bx-settings-drawer.open {
    pointer-events: auto;
}
.bx-settings-drawer.open .bx-settings-drawer-backdrop {
    opacity: 1;
}
.bx-settings-drawer.open .bx-settings-drawer-panel {
    transform: translateX(0);
}

/* Empêche le scroll de la page derrière le volet ouvert. */
body.bx-drawer-open {
    overflow: hidden;
}

.bx-settings-drawer-close {
    position: sticky;
    top: 0;
    left: 100%;
    margin: 10px 10px 0 0;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    border: 2px solid var(--bx-card-border);
    background: linear-gradient(180deg, #f7f7f7 0%, #cfd4da 100%);
    color: #2b303a;
    font-size: 1.3em;
    line-height: 1;
    cursor: pointer;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
    z-index: 1;
}
.bx-settings-drawer-close:hover {
    filter: brightness(0.95);
}

/* Dans le volet, .settings-page n'a plus besoin d'être centré/limité comme
   sur la page complète — il occupe simplement toute la largeur du panneau. */
.bx-settings-drawer-content .settings-page {
    max-width: none;
    padding: 0 22px 40px;
    margin-top: -18px; /* compense la hauteur du bouton close sticky au-dessus */
}

/* ---------------------------------------------------------------------
   Panneau de recherche live (icône loupe du topbar, voir header.php +
   beachadex/search.php). Recherche uniquement sur les noms traduits des
   personnages (characterid) et bâtiments (buildingid).
   --------------------------------------------------------------------- */
.beachadex-topbar-search {
    position: fixed;
    top: var(--bx-topbar-h);
    left: 0;
    right: 0;
    z-index: 999;
    background: linear-gradient(180deg, var(--bx-bg-topbar) 0%, #082c44 100%);
    border-bottom: 3px solid var(--bx-gold);
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.4);
    padding: 12px 18px;
    box-sizing: border-box;
}

.beachadex-topbar-search-inner {
    max-width: 480px;
    margin: 0 auto;
    position: relative;
}

.beachadex-topbar-search-input {
    width: 100%;
    box-sizing: border-box;
    padding: 10px 14px;
    border-radius: 999px;
    border: 2px solid var(--bx-card-border);
    background: var(--bx-bg-input);
    color: #1c2733;
    font-size: 1em;
    outline: none;
    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);
}

.beachadex-topbar-search-input:focus {
    border-color: var(--bx-gold);
}

.beachadex-topbar-search-results {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    right: 0;
    max-height: 360px;
    overflow-y: auto;
    background: linear-gradient(180deg, var(--bx-bg-card-2) 0%, var(--bx-bg-card) 100%);
    border: 2px solid var(--bx-card-border);
    border-radius: 12px;
    box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);
}

.beachadex-search-result {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 12px;
    text-decoration: none;
    color: var(--bx-text);
    border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}

.beachadex-search-result:last-child {
    border-bottom: none;
}

.beachadex-search-result:hover {
    background: var(--bx-bg-hover);
}

.beachadex-search-result-icon {
    width: 28px;
    height: 28px;
    object-fit: contain;
    flex-shrink: 0;
    border-radius: 4px;
}

.beachadex-search-result-icon--empty {
    display: inline-block;
    background: var(--bx-bg-card-2);
}

.beachadex-search-result-name {
    flex: 1;
    font-size: 0.95em;
}

.beachadex-search-result-type {
    font-size: 0.75em;
    color: var(--bx-text-muted-2);
    text-transform: uppercase;
    flex-shrink: 0;
}

.beachadex-search-empty {
    padding: 12px;
    color: var(--bx-text-muted-2);
    font-size: 0.9em;
    text-align: center;
}

/* ---------------------------------------------------------------------
   Styles de la fiche personnage (characters.php), déplacés ici pour être
   partagés par toutes les pages Beachadex.
   --------------------------------------------------------------------- */
body.character-public-page {
        /* 🔥 Fond crème/parchemin (au lieu du lagon bleu sombre --bx-bg) :
           rapproche la page du wiki communautaire de référence, et fait
           mieux ressortir la bande de navigation + la fiche (toutes deux
           déjà sombres) au lieu de les fondre dans un fond tout aussi
           sombre. */
        background: var(--wiki-cream-dark);
        color: var(--wiki-text);
        font-family: 'Montserrat', 'Segoe UI', Arial, sans-serif;
        margin: 0;
    }

    .character-page-wrapper {
        max-width: 780px;
        margin: 0 auto;
        padding: 16px 16px 60px;
        box-sizing: border-box;
    }

    .character-dex-card {
        /* 🔥 Carte "infobox" façon wiki : fond crème, cadre teal, coins
           moins arrondis — au lieu du panneau vitre bleu nuit d'origine.
           overflow:hidden pour que le bandeau teal plein-largeur
           (.character-dex-top-row, qui déborde volontairement du padding
           via des marges négatives) se fasse rogner par les coins
           arrondis de la carte au lieu de les déborder en carré. */
        background: var(--wiki-cream);
        border: 3px solid var(--wiki-teal);
        border-radius: 0;
        /* Pas de padding propre à la carte : l'espace vient de
           .character-dex-top (padding 26px) et de la marge de
           .character-dex-tidinfo -- éviter un double espace en bas. */
        padding: 0;
        box-shadow: 0 6px 16px rgba(0,0,0,0.28);
        margin-bottom: 24px;
        overflow: hidden;
    }

    /* ---------- Bloc "top" façon Pokédex : carousel + panneau infos ----------
       Grid à zones nommées plutôt que flex : ça permet de replacer
       character-dex-top-row indépendamment (au-dessus du carousel en desktop
       comme en mobile, cf. media query plus bas) sans dépendre de son ordre
       dans le DOM. */
    .character-dex-top {
        display: grid;
        grid-template-columns: 42% 1fr;
        /* 🔥 "row" (icône de classe + nom) occupe désormais sa propre ligne
           en pleine largeur au-dessus de carousel/info (au lieu d'être
           coincée dans la colonne de droite) : c'est ce qui permet à
           .character-dex-top-row de devenir un bandeau teal plein-largeur
           façon en-tête d'infobox de wiki, cf. règle suivante. */
        grid-template-areas:
            "row row"
            "carousel info";
        column-gap: 18px;
        row-gap: 18px;
        align-items: start;
        margin-bottom: 6px;
        padding: 0 26px 26px;
    }

    .character-dex-top-carousel {
        grid-area: carousel;
        min-width: 0;
        /* 🔥 Hauteur FIXE (au lieu de dépendre de la hauteur naturelle de la
           grille) : avant ce correctif, comme .character-dex-top utilise
           align-items: start, cette zone de grille n'était pas "stretch" et
           .character-dex-carousel (height:100% à l'intérieur) retombait sur
           une hauteur basée sur son propre contenu -- qui variait d'une
           troupe à l'autre selon la hauteur de character-dex-top-info à côté
           (nombre/hauteur des chips de stats). Résultat : des cartes
           carousel de hauteurs différentes selon la troupe (ex: Zooka vs les
           autres). Avec une hauteur fixe ici, toutes les cartes carousel
           font systématiquement la même taille, quel que soit le contenu du
           panneau d'infos à côté. */
        /* 🔥 Hauteur réduite (auparavant clamp(240px, 34vh, 320px)) : la
           carte carousel prenait trop de place verticalement -- voir aussi
           l'override mobile ci-dessous (@media max-width: 640px), qui règle
           en plus le souci de mise en page du sous-titre sur téléphone. */
        height: clamp(190px, 26vh, 250px);
        /* 🔥 CORRECTIF DÉBORDEMENT (bug remonté par capture d'écran :
           character-dex-subtitle invisible/recouvert sur mobile) :
           character-dex-carousel-tabs (Icône/Badge/Visuel) est un SIBLING
           de .character-dex-carousel à l'intérieur de ce conteneur, pas un
           enfant -- or .character-dex-carousel avait height:100%, calculé
           sur la hauteur TOTALE de ce conteneur (celle définie ci-dessus),
           sans tenir compte de la place déjà prise par les onglets. Résultat
           : le carousel débordait systématiquement de (hauteur des onglets)
           en bas, ce qui passait inaperçu sur desktop (rien juste en
           dessous dans cette colonne) mais recouvrait directement le
           sous-titre sur mobile (mise en page empilée). Passage en flex
           column ici + .character-dex-carousel en flex:1 (au lieu de
           height:100%) ci-dessous : les onglets gardent leur taille
           naturelle, le carousel se partage exactement l'espace restant,
           sans déborder. */
        display: flex;
        flex-direction: column;
    }

    .character-dex-top-info {
        grid-area: info;
        min-width: 0;
        display: flex;
        flex-direction: column;
        gap: 6px;
    }

    .character-dex-top-row {
        grid-area: row;
        display: flex;
        align-items: center;
        gap: 10px;
        /* Bandeau teal plein-largeur : les marges négatives ramènent le
           bandeau jusqu'aux bords de la carte (qui a 0 padding en haut/
           côtés, voir .character-dex-card), .character-dex-top qui a lui
           un padding horizontal de 20px. */
        background: linear-gradient(180deg, var(--wiki-teal-light) 0%, var(--wiki-teal) 100%);
        margin: 0 -26px 0;
        padding: 14px 26px;
    }

    .character-dex-top-class-icon {
        width: 38px;
        height: 38px;
        object-fit: contain;
        flex-shrink: 0;
        background: transparent;
        border: none;
        padding: 0;
    }

    .character-dex-top-class-name {
        font-family: 'Bangers', cursive;
        letter-spacing: 1px;
        text-transform: uppercase;
        font-size: 1.1em;
        color: #eaf6fa;
        white-space: nowrap;
    }

    .character-dex-top-troop-name {
        margin-left: auto;
        font-family: 'Bangers', cursive;
        letter-spacing: 1px;
        font-size: 1.3em;
        color: #ffffff;
        text-shadow: 0 1px 2px rgba(0,0,0,0.35);
        text-align: right;
        word-break: break-word;
    }

    .character-dex-top-tid {
        font-size: 0.75em;
        font-family: monospace;
        color: var(--wiki-text-soft);
        margin: 0;
        word-break: break-word;
    }

    .character-dex-subtitle {
        color: var(--wiki-text);
        font-weight: 700;
        margin: 0;
    }

    /* 🔥 "Légende sombre" façon infobox de wiki (ex: "Attention la tête !")
       au lieu d'un simple texte italique perdu dans le panneau d'infos. */
    .character-dex-top-flavor {
        color: #dcdcdc;
        font-style: italic;
        margin: 0;
        background: var(--wiki-text);
        border-radius: 0;
        padding: 7px 12px;
    }

    .character-dex-chip-grid {
        display: grid;
        grid-template-columns: repeat(2, 1fr);
        gap: 8px;
        margin-top: 8px;
    }

    .character-dex-chip {
        display: flex;
        flex-direction: column;
        gap: 2px;
        background: var(--wiki-cream-alt);
        border: 1px solid var(--wiki-teal);
        border-radius: 0;
        padding: 6px 10px;
        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
    }

    .character-dex-chip-label {
        font-size: 0.68em;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        color: var(--wiki-teal-dark);
        font-weight: 700;
    }

    .character-dex-chip-value {
        font-size: 0.98em;
        color: var(--wiki-text);
        font-weight: 600;
    }

    .character-dex-tidinfo {
        color: var(--wiki-text);
        background: var(--wiki-cream-alt);
        border: 1px solid var(--wiki-teal);
        border-radius: 0;
        padding: 12px 16px;
        margin: 16px 26px 24px;
    }

    /* ---------- Carousel Icône / Badge / Visuel ----------
       🔥 Repensé en colonne (au lieu d'une ligne flex btn/viewport/btn) : le
       viewport (flex:1) prend tout l'espace vertical dispo, ce qui laisse
       l'image (elle aussi flex:1 + object-fit:contain) se centrer TOUJOURS
       dans cet espace au lieu de flotter avec sa légende comme un seul bloc
       centré verticalement (ancien souci : légende qui "flottait" au milieu
       de la carte au lieu de rester collée en bas). La légende, elle, garde
       sa taille naturelle et se retrouve donc systématiquement collée en
       bas puisque l'image a consommé tout le reste. Les flèches Précédent/
       Suivant sortent du flux (position: absolute sur le carousel en
       position: relative) et se calent au même niveau que la légende, de
       part et d'autre, plutôt que centrées sur la hauteur totale de la
       carte comme avant. */
    .character-dex-carousel {
        position: relative;
        display: flex;
        flex-direction: column;
        padding: 14px 6px;
        background: var(--wiki-cream-alt);
        border: 1px solid var(--wiki-teal);
        border-radius: 0;
        /* 🔥 flex:1 + min-height:0 (au lieu de height:100%) : voir le
           commentaire sur .character-dex-top-carousel -- se partage
           l'espace restant une fois les onglets Icône/Badge/Visuel
           soustraits, au lieu de reprendre toute la hauteur du conteneur
           en plus d'eux (ce qui causait le débordement). */
        flex: 1;
        min-height: 0;
        box-sizing: border-box;
    }

    .character-dex-carousel-viewport {
        flex: 1;
        min-height: 0;
        overflow: hidden;
        display: flex;
    }

    .character-dex-carousel-track {
        display: flex;
        width: 100%;
        transition: transform 0.25s ease;
    }

    .character-dex-carousel-slide {
        flex: 0 0 100%;
        display: flex;
        flex-direction: column;
        align-items: center;
        min-width: 0;
        /* Pas de gap fixe ici : l'espacement image/légende vient des marges
           automatiques de l'image ci-dessous (voir commentaire), pour que la
           légende reste TOUJOURS collée en bas quelle que soit la hauteur
           dispo, plutôt qu'un espacement figé qui laisserait un vide résiduel
           en dessous d'elle. */
    }

    /* 🔥 Reprend le plafond de taille d'origine (max-height/max-width, PAS de
       width/height:100% ni de flex-grow) : la 1ère version de ce correctif
       laissait l'image grandir pour remplir tout l'espace vertical dispo,
       ce qui l'agrandissait bien au-delà de sa résolution source (vignettes
       Badge/Icône basse résolution -> rendu flou) et pouvait la faire
       déborder du cadre. Centrage vertical obtenu SANS grandir l'image :
       margin: auto sur les 4 côtés, dans une colonne flex -- l'espace libre
       au-dessus/en dessous d'elle se répartit à égalité (voir
       .character-dex-carousel-slide, colonne flex sans autre marge auto),
       ce qui la centre dans l'espace laissé par la légende (dernier élément,
       sans marge auto, donc mécaniquement poussée tout en bas). */
    .character-dex-carousel-img {
        max-width: 92%;
        max-height: min(70%, 22vh);
        width: auto;
        height: auto;
        margin: auto;
        object-fit: contain;
    }

    /* 🔥 Légende sous l'image (ordre naturel du DOM : image puis légende) --
       n'utilise plus order:-1 pour remonter au-dessus (utile seulement tant
       que characters.php s'appuyait sur cette légende comme pseudo-onglet
       Icône/Badge/Visuel ; characters.php utilise désormais de vrais
       onglets cliquables et n'émet plus du tout cette classe, seul
       buildings.php/renderTrapDexCard l'utilisent encore, pour afficher le
       niveau du bâtiment sous le visuel). */
    .character-dex-carousel-caption {
        align-self: center;
        flex-shrink: 0;
        margin-top: 8px;
        font-size: 0.72em;
        text-transform: uppercase;
        letter-spacing: 1px;
        font-weight: 700;
        color: #fff;
        background: var(--wiki-teal);
        border-radius: 0;
        padding: 3px 14px;
        box-shadow: 0 1px 3px rgba(0,0,0,0.2);
    }

    .character-dex-carousel-btn {
        position: absolute;
        bottom: 8px;
        z-index: 1;
        background: linear-gradient(180deg, var(--bx-gold-light) 0%, var(--bx-gold) 55%, var(--bx-gold-dark) 100%);
        border: 1px solid #ffdf94;
        border-bottom: 3px solid #7a4400;
        border-radius: 0;
        width: 28px;
        height: 28px;
        padding: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.35);
        transition: transform .12s ease, filter .12s ease;
    }

    /* De part et d'autre de la légende (centrée horizontalement dans le
       viewport) : la carte fait ~42% de la largeur du panneau (voir
       .character-dex-top grid-template-columns), la légende reste courte
       ("BADGE"/"ICÔNE"/"VISUEL") -- un retrait fixe depuis chaque bord
       suffit à les faire lire comme encadrant la légende sans avoir à
       mesurer sa largeur en JS. */
    .character-dex-carousel-prev { left: 14%; }
    .character-dex-carousel-next { right: 14%; }

    .character-dex-carousel-btn:hover {
        filter: brightness(1.08);
        transform: translateY(-1px);
    }
    .character-dex-carousel-btn:active {
        transform: translateY(1px);
    }

    .character-dex-carousel-arrow {
        width: 16px;
        height: 16px;
        object-fit: contain;
    }

    .character-dex-carousel-arrow-left {
        transform: rotate(180deg);
    }

    /* ---------- Onglets Icône/Badge/Visuel (characters.php uniquement --
       buildings.php garde les flèches précédent/suivant, voir
       .character-dex-carousel-btn ci-dessus, laissées telles quelles). Un
       onglet par image disponible (2 ou 3 selon Icon/Badge/FullExportName
       renseignés), actif = fond teal plein, inactif = fond crème. ---------- */
    .character-dex-carousel-tabs {
        display: flex;
        margin-bottom: 8px;
        /* 🔥 flex-shrink:0 : garde toujours sa taille naturelle dans la
           colonne flex de .character-dex-top-carousel, c'est
           .character-dex-carousel (flex:1) qui absorbe le reste/manque
           d'espace, jamais les onglets. */
        flex-shrink: 0;
    }

    .character-dex-carousel-tab {
        flex: 1 1 0;
        font-family: 'Montserrat', 'Segoe UI', Arial, sans-serif;
        font-size: 0.78em;
        font-weight: 700;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        text-align: center;
        padding: 7px 6px;
        border: 1px solid var(--wiki-teal);
        border-radius: 0;
        background: var(--wiki-cream);
        color: var(--wiki-teal-dark);
        cursor: pointer;
    }

    .character-dex-carousel-tab + .character-dex-carousel-tab {
        border-left: none;
    }

    .character-dex-carousel-tab.is-active {
        background: var(--wiki-teal);
        color: #fff;
    }

    /* 🔥 Repensé en liste de lignes (au lieu d'une grille de mini-cartes) :
       fait ressembler "Autres caractéristiques" au tableau "Informations"/
       "Statistiques" d'une infobox de wiki (label en gras à gauche, valeur
       à droite, lignes crème alternées, cadre teal commun). */
    .character-dex-stat-grid {
        display: flex;
        flex-direction: column;
        border: 1px solid var(--wiki-gray-dark);
        border-radius: 0;
    }

    /* 🔥 Gris neutre (au lieu du crème utilisé ailleurs sur la fiche) --
       même esprit "bandeau plein" que .character-dex-top-flavor, mais en
       gris plutôt qu'en brun sombre. */
    .character-dex-stat {
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        gap: 10px;
        background: var(--wiki-gray);
        border-radius: 0;
        border: none;
        border-bottom: 1px solid var(--wiki-gray-dark);
        padding: 9px 16px;
        box-shadow: none;
    }

    .character-dex-stat:nth-child(even) {
        background: var(--wiki-gray-light);
    }

    .character-dex-stat:last-child {
        border-bottom: none;
    }

    .character-dex-stat-label {
        font-size: 0.85em;
        text-transform: none;
        letter-spacing: 0;
        color: var(--wiki-gray-text-soft);
        font-weight: 700;
        flex-shrink: 0;
    }

    .character-dex-stat-value {
        font-size: 0.95em;
        color: var(--wiki-gray-text);
        font-weight: 600;
        text-align: right;
        word-break: break-word;
    }

    /* ---------- Jauge façon Pokémon (Vitesse, Portée) ---------- */
    .character-dex-stat-gauge {
        display: flex;
        gap: 2px;
        margin-top: 4px;
    }

    .character-dex-stat-gauge-segment {
        flex: 1 1 0;
        height: 6px;
        border-radius: 0;
        background: var(--wiki-cream-dark);
    }

    .character-dex-stat-gauge-segment.is-filled {
        background: var(--wiki-teal);
    }

    .character-dex-section {
        /* 🔥 Plus de marge latérale : contrairement à character-dex-tidinfo,
           cette section n'est enveloppée d'aucune div extérieure avec son
           propre padding -- elle prend donc toute la largeur de la carte
           (comme le bandeau character-dex-top-row). */
        margin: 0 0 28px;
        color: var(--wiki-text);
    }

    /* 🔥 Bandeau teal PLEIN LARGEUR (au lieu d'une pastille arrondie) :
       "Informations"/"Statistiques" façon en-tête de section d'infobox de
       wiki. */
    .character-dex-section-title {
        font-family: 'Bangers', cursive;
        letter-spacing: 1.5px;
        text-transform: uppercase;
        text-align: left;
        color: #fff;
        background: linear-gradient(180deg, var(--wiki-teal-light) 0%, var(--wiki-teal) 100%);
        border: none;
        border-radius: 0;
        padding: 10px 18px;
        margin-bottom: 14px;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.18);
    }

    .character-dex-empty {
        color: var(--wiki-text-soft);
        font-style: italic;
    }

    /* ---------- Section Skin : simple galerie d'images ---------- */
    .character-skin-grid {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
        gap: 12px;
    }

    .character-skin-item {
        background: var(--wiki-cream-alt);
        border: 1px solid var(--wiki-teal);
        border-radius: 0;
        padding: 10px;
        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 6px;
        text-align: center;
    }

    .character-skin-img {
        max-width: 100%;
        height: auto;
        object-fit: contain;
    }

    .character-skin-name {
        font-size: 0.8em;
        color: var(--wiki-text);
    }

    .character-skin-cost {
        font-size: 0.75em;
        color: var(--wiki-text-soft);
    }

    /* ---------- Section Famille (Troupe de base -> versions Officier),
       façon arbre d'évolution : grille à 3 colonnes (base | flèche |
       officiers), étendue à 5 ou 7 quand il y a des Downscale (avant) et/ou
       des NPC (après) — voir renderCharacterFamilySection(). ---------- */
    .character-family-grid {
        display: grid;
        grid-template-columns: repeat(var(--family-cols), auto);
        column-gap: 4px;
        row-gap: 10px;
        align-items: center;
        justify-content: center;
    }

    .character-family-cell {
        display: flex;
        flex-direction: column;
        align-items: center;
        gap: 4px;
        text-decoration: none;
        background: var(--wiki-cream-alt);
        border: 2px solid var(--wiki-teal);
        border-radius: 0;
        padding: 8px 6px;
        width: 64px;
        box-sizing: border-box;
        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
        transition: border-color 0.15s ease, transform .15s ease;
    }

    .character-family-cell:hover {
        border-color: var(--wiki-teal-dark);
        transform: translateY(-2px);
    }

    .character-family-base {
        border-color: var(--bx-gold);
        box-shadow: 0 0 0 2px rgba(255, 180, 0, 0.35), 0 1px 3px rgba(0, 0, 0, 0.12);
    }

    /* NPC/Downscale : cliquable comme les autres cartes (fiche dédiée),
       mais légèrement plus discret (bordure en pointillés) pour rester
       visuellement secondaire par rapport à la troupe/l'officier principal. */
    .character-family-item-static {
        cursor: pointer;
        border-style: dashed;
    }

    .character-family-icon {
        width: 36px;
        height: 36px;
        object-fit: contain;
    }

    .character-family-name {
        font-size: 0.62em;
        line-height: 1.15;
        color: var(--wiki-text);
        text-align: center;
        word-break: break-word;
    }

    /* Flèche en pointillés entre deux cellules de la grille */
    .character-family-connector {
        position: relative;
        align-self: stretch;
        min-height: 40px;
        width: 16px;
    }

    .character-family-connector::before {
        content: '';
        position: absolute;
        top: 50%;
        left: 0;
        right: 4px;
        border-top: 2px dotted var(--wiki-teal);
    }

    .character-family-connector::after {
        content: '';
        position: absolute;
        top: 50%;
        right: 0;
        width: 0;
        height: 0;
        transform: translateY(-50%);
        border-top: 4px solid transparent;
        border-bottom: 4px solid transparent;
        border-left: 5px solid var(--wiki-teal);
    }

    /* Tronc vertical en pointillés (arbre d'évolution) : chaque connecteur
       "branche" dessine le tronçon de tronc sur sa propre ligne ; mis bout
       à bout par la grille, ça recrée un trait continu de la base jusqu'à
       la dernière branche. */
    .character-family-connector-trunk {
        position: absolute;
        left: 8px;
        top: 0;
        bottom: 0;
        border-left: 2px dotted var(--wiki-teal);
    }

    /* Repli sans officier (troupe de base + ses extras seulement) */
    .character-family-simple {
        display: flex;
        align-items: center;
        gap: 10px;
        flex-wrap: wrap;
        justify-content: center;
    }

    .character-family-arrow {
        width: 22px;
        height: 22px;
        object-fit: contain;
        flex-shrink: 0;
    }

    .character-levels-table-wrapper {
        overflow-x: auto;
        border-radius: 0;
        border: 1px solid var(--wiki-teal);
        box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
    }

    .character-warship-table-wrapper {
        width: 80%;
        margin: 0 auto;
        text-align:center;
    }

    table.character-levels-table {
        width: 100%;
        border-collapse: collapse;
        font-size: 0.92em;
    }
    /* 🔥 CORRECTIF (demande explicite, "dégage-moi les espaces entre les td...
       c'est moche") : th/td hérite d'une règle globale non scopée dans style.css
       (tout en haut du fichier, "th, td { border: 1px solid #456789; }", pensée
       pour les anciens tableaux du tracker) -- ça dessinait une grille complète
       autour de CHAQUE cellule ici aussi. On neutralise cette bordure : le
       zébrage odd/even (cream/cream-alt, juste en dessous) suffit à lire le
       tableau proprement sans grille. */
    .character-levels-table th, .character-levels-table td {
        padding: 8px 12px;
        text-align: center;
        white-space: nowrap;
        color: var(--wiki-text);
        border: none;
    }
    .character-levels-table thead {
        background: linear-gradient(180deg, var(--wiki-teal-light) 0%, var(--wiki-teal) 100%);
        color: #fff;
        text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
    }
    .character-levels-table tbody tr:nth-child(odd) { background: var(--wiki-cream); }
    .character-levels-table tbody tr:nth-child(even) { background: var(--wiki-cream-alt); }

    .character-levels-total-row {
        font-weight: 700;
        background: var(--wiki-cream-dark) !important;
        border-top: 2px solid var(--wiki-teal);
    }

    .character-levels-th-left,
    .character-levels-cell-left {
        text-align: left !important;
    }

    .character-levels-pair {
        display: flex;
        flex-direction: column;
        align-items: center;
        gap: 4px;
    }

    .character-levels-cell-left .character-levels-pair {
        align-items: flex-start;
    }

    .character-levels-icon-value {
        display: flex;
        align-items: center;
        gap: 6px;
    }

    .character-levels-icon {
        width: 16px;
        height: 16px;
        object-fit: contain;
        flex-shrink: 0;
    }

    /* ---------- Bande de navigation façon Pokémon HOME ---------- */
    .character-browse {
        height: calc(100vh - 60px - 32px); /* topbar (60px) + padding vertical du wrapper (16px x2) */
        display: flex;
        flex-direction: column;
        margin-bottom: 28px;
        background: linear-gradient(180deg, var(--bx-bg-panel) 0%, #0d3f61 100%);
        border: 3px solid var(--bx-card-border);
        border-radius: 0;
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
        overflow: hidden;
    }

    /* 🔥 justify-content: center retiré : ça centrait l'image ET le nom
       COMME UN SEUL BLOC dans les 30vh de hauteur (donc un nom qui flotte
       au milieu, avec du vide en dessous avant la bande de navigation).
       L'image passe en flex:1 (+ object-fit: contain) pour se centrer
       elle-même dans tout l'espace laissé libre au-dessus ; le nom, à
       taille naturelle, se retrouve donc mécaniquement collé en bas —
       juste un petit margin-top pour l'espace demandé avant
       .character-browse-strip (qui suit juste après dans le DOM). */
    .character-browse-visual {
        display: flex;
        flex-direction: column;
        align-items: center;
        gap: 8px;
        padding: 18px 16px;
        box-sizing: border-box;
        flex-shrink: 0;
        min-height: 30vh;
        max-height: 30vh;
        background: radial-gradient(circle at 50% 30%, var(--bx-bg-card-2) 0%, var(--bx-bg-topbar) 100%);
    }

    .character-browse-visual img {
        flex: 1 1 auto;
        min-height: 0;
        width: clamp(90px, 30vw, 160px);
        height: auto;
        object-fit: contain;
        object-position: center;
    }

    .character-browse-name-wrap {
        flex-shrink: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 8px;
        margin-top: 4px;
    }

    .character-browse-go-btn {
        display: flex;
        align-items: center;
        justify-content: center;
        line-height: 0;
    }

    .character-browse-go-btn img {
        width: 22px;
        height: 22px;
        object-fit: contain;
    }

    .character-browse-name-link {
        font-family: 'Bangers', cursive;
        letter-spacing: 1px;
        font-size: 1.3em;
        color: var(--bx-text);
        text-decoration: none;
        border-bottom: 2px solid var(--bx-accent);
        padding-bottom: 2px;
    }
    .character-browse-name-link:hover { color: var(--bx-accent); }

    .character-browse-strip {
        flex: 1;
        min-height: 0;
        overflow-y: auto;
        padding: 12px;
        display: flex;
        flex-direction: column;
        gap: 14px;
    }

    .character-browse-group-label {
        display: block;
        font-size: 0.72em;
        text-transform: uppercase;
        letter-spacing: 1px;
        color: var(--bx-text-muted);
        font-weight: 700;
        margin-bottom: 6px;
    }

    .character-browse-group-icons {
        display: grid;
        grid-template-columns: repeat(var(--bx-units-per-row, 4), 1fr);
        gap: 10px;
    }

    .character-browse-icon {
        background: linear-gradient(180deg, var(--bx-bg-card-2) 0%, var(--bx-bg-card) 100%);
        border: 2px solid rgba(255, 255, 255, 0.2);
        border-radius: 0;
        padding: 6px;
        cursor: pointer;
        line-height: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
        transition: border-color .15s ease, transform .15s ease;
    }
    .character-browse-icon img {
        width: 100%;
        height: auto;
        aspect-ratio: 1 / 1;
        object-fit: contain;
    }
    .character-browse-icon.active,
    .character-browse-icon:hover {
        border-color: var(--bx-gold);
        box-shadow: 0 0 0 2px rgba(255, 180, 0, 0.35), 0 2px 4px rgba(0, 0, 0, 0.3);
        transform: translateY(-1px);
    }

    /* ---------- Repli mobile : le bloc top (carousel + infos) s'empile,
       avec character-dex-top-row au-dessus du carousel ---------- */
    @media (max-width: 640px) {
        .character-dex-top {
            grid-template-columns: 1fr;
            grid-template-areas:
                "row"
                "carousel"
                "info";
        }
        .character-dex-top-carousel {
            width: 100%;
            /* 🔥 Sur téléphone, hauteur basée sur la largeur (vw) plutôt que
               sur la hauteur de viewport (vh) : la carte carousel passe en
               pleine largeur juste au-dessus (width:100%), donc caler sa
               hauteur sur vw donne un rectangle proportionné et nettement
               moins haut qu'avec le clamp desktop -- c'est ce qui écrasait
               .character-dex-subtitle juste en dessous. */
            height: clamp(160px, 46vw, 220px);
        }
        .character-dex-top-troop-name {
            text-align: right;
        }
        /* 🔥 Une seule carte par ligne (au lieu de 2 côte à côte) : sur un
           écran étroit, 2 colonnes rendaient chaque case trop compressée
           (libellé/valeur qui se chevauchaient parfois selon la longueur du
           texte). */
        .character-dex-chip-grid {
            grid-template-columns: 1fr;
        }

        /* Quand une fiche est ouverte (?tid=...), on masque la bande de
           navigation character-browse pour laisser toute la place à la
           fiche, et on la remplace par un bouton de retour flottant. */
        .character-page-wrapper.has-tid .character-browse {
            display: none;
        }

        .character-dex-back-btn {
            position: fixed;
            top: 70px; /* sous le header fixe (~60px) + petite marge */
            left: 12px;
            z-index: 500;
            display: flex;
            align-items: center;
            justify-content: center;
            width: 38px;
            height: 38px;
            background: linear-gradient(180deg, var(--bx-gold-light) 0%, var(--bx-gold) 55%, var(--bx-gold-dark) 100%);
            border: 1px solid #ffdf94;
            border-bottom: 3px solid #7a4400;
            border-radius: 0;
            box-shadow: 0 4px 10px rgba(0,0,0,0.35);
            text-decoration: none;
        }

        .character-dex-back-btn:hover {
            filter: brightness(1.08);
        }

        .character-dex-back-btn img {
            width: 16px;
            height: 16px;
            object-fit: contain;
            transform: rotate(180deg);
        }

        /* Grille Famille encore plus compacte sur petit écran, pour que la
           variante à 7 colonnes (Downscale + officiers + NPC) tienne sans
           scroll horizontal. */
        .character-family-cell {
            width: 54px;
            padding: 6px 4px;
        }
        .character-family-icon {
            width: 30px;
            height: 30px;
        }
        .character-family-name {
            font-size: 0.58em;
        }
        .character-family-connector {
            width: 12px;
            min-height: 34px;
        }
    }

    /* Le bouton retour ne s'affiche qu'au format téléphone */
    @media (min-width: 641px) {
        .character-dex-back-btn {
            display: none;
        }

        .character-family-cell {
            width: 84px;
            padding: 10px 8px;
        }
        .character-family-icon {
            width: 48px;
            height: 48px;
        }
        .character-family-name {
            font-size: 0.78em;
        }
        .character-family-connector {
            width: 26px;
            min-height: 50px;
        }
    }

    /* ---------- Layout PC : sidebar character-browse à 20% (gauche, pleine
       hauteur), contenu character-dex-main sur les 80% restants ---------- */
    @media (min-width: 900px) {
        .character-page-wrapper {
            max-width: none;
            display: flex;
            align-items: flex-start;
            gap: 24px;
            padding: 16px 24px 60px;
        }

        .character-browse {
            flex: 0 0 20%;
            width: 20%;
            position: sticky;
            top: 76px; /* juste sous le header sticky (~60px) + petite marge */
        }

        .character-dex-main {
            flex: 1 1 80%;
            min-width: 0;
        }
    }

/* ---------------------------------------------------------------------
   buildings.php — quelques classes propres aux bâtiments (le reste
   réutilise les composants génériques .character-dex-*/.character-levels-*
   ci-dessus). Déplacé ici depuis le <style> inline de buildings.php : tout
   le CSS vit dans ce fichier, buildings.php ne fait que requêtes/rendu.
   --------------------------------------------------------------------- */
.building-proto-cost-pair { flex-wrap: wrap; gap: 6px; }
.building-hq-table td, .building-hq-table th { text-align: center; }

/* Timeline "Bâtiment par QG" : icône du bâtiment juste au-dessus du QG où un
   exemplaire supplémentaire se débloque.
   Mobile (défaut) : 6 QG par ligne, pleine largeur de character-dex-main.
   PC (>= 641px)   : repliée sur 2 lignes de 15 colonnes (ordre de lecture
   normal 1, 2, 3... en ligne — voir media query plus bas), sur 75% de la
   largeur de la section, bloc centré. */
.building-unlock-timeline {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    grid-auto-flow: row;
    gap: 8px 4px;
    align-items: end;
    width: 100%;
    text-align: center;
}
.building-unlock-slot {
    display: flex;
    flex-direction: column;
    align-items: center;
    /* Un peu plus d'air entre le bâtiment débloqué (marker) et le QG
       débloqué juste en dessous (avant : 2px, quasi collés). */
    gap: 8px;
}
.building-unlock-marker {
    position: relative;
    height: 22px;
    width: 22px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.building-unlock-marker-img {
    width: 32px;
    height: 32px;
    object-fit: contain;
}
.building-unlock-marker-badge {
    position: absolute;
    bottom: -4px;
    right: -6px;
    font-size: 9px;
    line-height: 1;
    background: var(--bx-gold);
    color: #1a1508;
    border-radius: 0;
    padding: 1px 3px;
    font-weight: bold;
}
.building-unlock-slot.has-marker .building-unlock-th-img {
    outline: 2px solid var(--bx-gold);
    outline-offset: 1px;
    border-radius: 0;
}
.building-unlock-th {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1px;
}
.building-unlock-th-img {
    width: 35px;
    height: 35px;
    object-fit: contain;
}
.building-unlock-th-label {
    font-size: 10px;
    opacity: 0.8;
}

@media (min-width: 641px) {
    .building-unlock-timeline {
        /* Ordre de lecture normal (1, 2, 3... en ligne, PAS 1, 3, 5 sur une
           ligne et 2, 4, 6 sur l'autre) : grid-auto-flow: row (le défaut,
           mis explicitement) + 15 colonnes fixes. 15 colonnes couvrent déjà
           29 QG (15 sur la 1re ligne, 14 sur la 2e) et couvriront le futur
           QG30 (15/15) sans changement — au-delà, une 3e ligne s'ajoute
           automatiquement. */
        grid-template-columns: repeat(15, minmax(36px, 1fr));
        grid-auto-flow: row;
        width: 75%;
        /* Bloc centré horizontalement dans la section (au lieu de collé à
           gauche) — les icônes, elles, restent alignées à gauche À
           L'INTÉRIEUR du bloc (justify-content par défaut = start), donc la
           place pour un futur QG30 reste disponible sans redesign : ce
           centrage ne fait que positionner le bloc de 75% dans son
           conteneur, sans étirer/espacer les colonnes existantes. */
        margin: 0 auto;
    }
}

/* ---------------------------------------------------------------------
   Section "Capacités" (active/passive) et "Talents" d'un officier —
   characters.php, uniquement quand Class = 'Officier'.
   --------------------------------------------------------------------- */
.officer-power-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 14px;
}

.officer-talent-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 14px;
}

.officer-power-card,
.officer-talent-card {
    background: var(--wiki-cream-alt);
    border: 1px solid var(--wiki-teal);
    border-radius: 0;
    padding: 14px 16px;
    display: flex;
    flex-direction: column;
    gap: 8px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
}

.officer-power-head,
.officer-talent-head {
    display: flex;
    align-items: center;
    gap: 10px;
}

.officer-power-icon {
    width: 40px;
    height: 40px;
    object-fit: contain;
    flex-shrink: 0;
    background: var(--wiki-cream);
    border: 1px solid var(--wiki-teal);
    border-radius: 0;
    padding: 4px;
}

.officer-power-head-text,
.officer-talent-head-text {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.officer-power-kind,
.officer-talent-number {
    font-size: 0.68em;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--wiki-teal-dark);
    font-weight: 700;
}

.officer-power-title,
.officer-talent-title {
    font-weight: 700;
    color: var(--wiki-text);
    word-break: break-word;
}

.officer-power-flavor {
    color: var(--wiki-text-soft);
    font-style: italic;
    margin: 0;
    font-size: 0.9em;
}

.officer-power-desc {
    color: var(--wiki-text);
    margin: 0;
    font-size: 0.92em;
}

.officer-power-levels-wrapper {
    margin-top: 6px;
}
.officer-power-chip-grid {
    margin-top: 6px;
    margin-bottom: 0;
}

.character-ability-dex-chip {
    display: flex;
    flex-direction: column;
    gap: 2px;
    background: var(--wiki-cream);
    border: 1px solid var(--wiki-teal);
    border-radius: 0;
    padding: 6px 10px;
}


/* Groupe de boutons flottants (Statue / Gravures / Tribus / Boom Pass / MM
   [/ Talents sur characters.php]) — remplace l'ancien bouton unique
   "Appliquer des bonus" : chaque icône ouvre son propre panneau (voir
   toggleApplyBonusesPanel(key)), alignées en ligne horizontale en bas à
   droite. 🔥 Rétracté PAR DÉFAUT quel que soit l'écran désormais (plus
   seulement sur mobile ≤640px) : seul le bouton ".apply-bonuses-fab-toggle"
   reste visible tant que le groupe n'a pas la classe "-open" (voir le JS
   déjà présent dans characters.php/buildings.php, inchangé). */
.apply-bonuses-fab-group {
    position: fixed;
    right: 18px;
    bottom: 18px;
    z-index: 1200;
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: flex-end;
    align-items: center;
    gap: 10px;
    max-width: calc(100vw - 36px);
}

.apply-bonuses-fab-toggle {
    display: flex;
}

.apply-bonuses-fab-group:not(.apply-bonuses-fab-group-open) .apply-bonuses-fab-icon:not(.apply-bonuses-fab-toggle) {
    display: none;
}

/* Sur mobile, la rangée flottante ne doit pas chevaucher la barre de
   navigation basse partagée (.mobile-bottom-nav, voir style.css) : on
   remonte le groupe ET son panneau au-dessus de sa hauteur réelle. */
@media (max-width: 768px) {
    .apply-bonuses-fab-group {
        bottom: calc(var(--mobile-bottom-nav-h, 60px) + 14px);
    }
    .apply-bonuses-panel {
        bottom: calc(var(--mobile-bottom-nav-h, 60px) + 14px + 66px);
    }
}

.apply-bonuses-fab-toggle-arrow {
    display: inline-block;
    font-size: 1.1em;
    line-height: 1;
    color: #12210f;
    transition: transform 0.15s ease;
}

.apply-bonuses-fab-group-open .apply-bonuses-fab-toggle-arrow {
    transform: rotate(180deg);
}

.apply-bonuses-fab-icon {
    width: 50px;
    height: 50px;
    padding: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--bx-accent);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);
    transition: transform 0.15s ease, background 0.15s ease;
    flex-shrink: 0;
}

.apply-bonuses-fab-icon:hover {
    background: #28d6c6;
    transform: translateY(-2px);
}

.apply-bonuses-fab-icon img {
    width: 28px;
    height: 28px;
    object-fit: contain;
}

.apply-bonuses-fab-icon-emoji {
    font-size: 1.4em;
    line-height: 1;
    color: #12210f;
}

.apply-bonuses-panel {
    position: fixed;
    right: 18px;
    /* Dégage la rangée de FAB horizontale au-dessus (50px de haut, +18px
       de marge basse, +16px d'air) — plus besoin de calculer une hauteur
       de pile puisque les boutons sont maintenant côte à côte. */
    bottom: 84px;
    z-index: 1200;
    width: min(340px, calc(100vw - 36px));
    max-height: min(420px, calc(100vh - 130px));
    background: var(--bx-bg-topbar);
    border: 1px solid var(--bx-border);
    border-radius: 12px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

.apply-bonuses-panel[hidden] {
    display: none;
}

.apply-bonuses-panel-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px 14px;
    background: var(--bx-bg-card);
    color: var(--bx-text);
    font-family: 'Bangers', cursive;
    letter-spacing: 0.5px;
    text-transform: uppercase;
}

.apply-bonuses-panel-close {
    background: none;
    border: none;
    color: var(--bx-text);
    font-size: 1.3em;
    line-height: 1;
    cursor: pointer;
    padding: 0 4px;
}

.apply-bonuses-field {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin-bottom: 12px;
}

.apply-bonuses-field label {
    font-size: 0.85em;
    color: var(--bx-text-muted);
}

.apply-bonuses-field select {
    background: var(--bx-bg-card);
    color: var(--bx-text);
    border: 1px solid var(--bx-border);
    border-radius: 6px;
    padding: 6px 8px;
    font-size: 0.95em;
}

/* Section Gravures : icône d'aperçu (TinyIconExportName, mise à jour en JS
   par applyBonusesEngravingChanged()) + select gravure + select %age, sur
   une seule ligne. L'icône reste masquée (hidden en HTML) tant qu'aucune
   gravure n'est choisie. */
.apply-bonuses-engraving-row {
    display: flex;
    align-items: center;
    gap: 6px;
}

.apply-bonuses-engraving-icon {
    width: 22px;
    height: 22px;
    object-fit: contain;
    flex-shrink: 0;
    border-radius: 4px;
}

.apply-bonuses-engraving-row select:first-of-type {
    flex: 1 1 auto;
    min-width: 0;
}

.apply-bonuses-engraving-row select:last-of-type {
    flex: 0 0 auto;
    width: 90px;
}

/* Champs numériques (%) du panneau — mêmes proportions que les <select>
   ci-dessus, avec un suffixe "%" positionné en absolu pour ne pas dépendre
   d'un wrapper supplémentaire par champ. */
.apply-bonuses-field-percent {
    position: relative;
}
.apply-bonuses-field-percent input[type="number"] {
    width: 100%;
    box-sizing: border-box;
    background: var(--bx-bg-card);
    color: var(--bx-text);
    border: 1px solid var(--bx-border);
    border-radius: 6px;
    padding: 6px 26px 6px 8px;
    font-size: 0.95em;
    /* Masque les flèches natives du <input type=number> : le "%" prend
       leur place, et le clavier numérique reste utilisable au clic. */
    -moz-appearance: textfield;
}
.apply-bonuses-field-percent input[type="number"]::-webkit-outer-spin-button,
.apply-bonuses-field-percent input[type="number"]::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}
.apply-bonuses-field-percent::after {
    content: '%';
    position: absolute;
    right: 10px;
    bottom: 7px;
    color: var(--bx-text-muted);
    font-size: 0.85em;
    pointer-events: none;
}

/* Séparateur entre le bloc "Talents/Capacités" (propre à un officier) et le
   bloc "Bonus externes" (statue, gravures, tribus... — toujours affiché,
   troupes comme bâtiments) à l'intérieur du panneau. */
.apply-bonuses-section-title {
    font-family: 'Bangers', cursive;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    font-size: 0.85em;
    color: var(--bx-gold-light);
    margin: 4px 0 10px;
    padding-top: 10px;
    border-top: 1px solid rgba(255, 255, 255, 0.15);
}
.apply-bonuses-section-title:first-child {
    margin-top: 0;
    padding-top: 0;
    border-top: none;
}

.apply-bonuses-empty {
    color: var(--bx-text-muted);
    font-size: 0.85em;
    margin: 0;
}

.apply-bonuses-actions {
    display: flex;
    gap: 8px;
    margin-top: 4px;
}

.apply-bonuses-apply-btn,
.apply-bonuses-reset-btn {
    flex: 1;
    border: none;
    border-radius: 8px;
    padding: 8px 10px;
    font-family: 'Bangers', cursive;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    cursor: pointer;
    transition: transform 0.15s ease, background 0.15s ease;
}

.apply-bonuses-apply-btn {
    background: var(--bx-accent);
    color: #12210f;
}

.apply-bonuses-apply-btn:hover {
    background: #28d6c6;
    transform: translateY(-1px);
}

.apply-bonuses-reset-btn {
    background: var(--bx-bg-hover);
    color: var(--bx-text);
}

.apply-bonuses-reset-btn:hover {
    background: var(--bx-bg-card-2);
    transform: translateY(-1px);
}

.apply-bonuses-panel-body {
    padding: 14px;
    color: var(--bx-text-soft);
    font-size: 0.9em;
    overflow-y: auto;
}

/* ---------------------------------------------------------------------
   Affichage "en direct" d'une stat recalculable (Santé/Dégâts/Vitesse —
   voir characterStatValueSpan()/buildingStatValueSpan() côté PHP et
   officerUpdateStatValue() côté JS) : la valeur de base reste affichée
   telle quelle tant qu'aucun bonus n'est appliqué ; dès qu'un bonus change
   le résultat, l'écart (+X, en rose) puis "=" (icône fast.png) puis la
   valeur finale apparaissent à la suite, sans reformater la valeur de base.
   --------------------------------------------------------------------- */
.character-stat-live {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    flex-wrap: wrap;
}

.character-stat-delta {
    color: #ff4fa3;
    font-weight: 700;
}

.character-stat-eq-icon {
    width: 12px;
    height: 12px;
    object-fit: contain;
    opacity: 0.85;
}

.character-stat-result {
    color: var(--bx-gold-light);
    font-weight: 700;
}

/* ---------------------------------------------------------------------
   Pop-up "Menu" de la barre de navigation basse mobile : DÉPLACÉ dans
   style.css sous les classes PARTAGÉES .bx-mobile-menu-popup/
   .bx-mobile-menu-link* (section "POP-UP MENU MOBILE PARTAGÉ"), désormais
   réutilisées à l'identique côté tracker ET Beachadex (même design, même
   CSS, plus de duplication) -- voir beachadex/includes/header.php et
   tracker/includes/sidebar.php. Les anciennes classes
   .beachadex-mobile-menu-popup/.beachadex-mobile-menu-link* n'existent
   donc plus, ce bloc est retiré.
   --------------------------------------------------------------------- */
@media (max-width: 768px) {
    :root { --mobile-bottom-nav-h: 60px; }
}

/* ==========================================================================
   FOOTER PUBLIC BEACHADEX (beachadex/includes/footer.php)
   Commun à index.php, beachadex/characters.php, buildings.php, engravings.php,
   settings.php, confidentialite.php, cgu.php, retours.php. Palette --bx-*
   (respecte le thème clair/sombre choisi dans les Paramètres), même habillage
   "cadre doré" que .beachadex-topbar pour rester cohérent avec le header.
   ========================================================================== */
.bx-footer {
    margin-top: 40px;
    background: linear-gradient(180deg, var(--bx-bg-topbar) 0%, #082c44 100%);
    border-top: 3px solid var(--bx-gold);
    box-shadow: inset 0 8px 14px -10px rgba(0, 0, 0, 0.5);
    color: var(--bx-text-soft);
}

.bx-footer-inner {
    max-width: 1200px;
    margin: 0 auto;
    padding: 36px 24px 24px;
    display: flex;
    flex-wrap: wrap;
    gap: 32px;
    justify-content: space-between;
}

.bx-footer-col {
    display: flex;
    flex-direction: column;
    gap: 10px;
    min-width: 180px;
}

.bx-footer-brand {
    flex: 1 1 260px;
    max-width: 420px;
}

/* Artwork (Besh artwork by Etoile2LAube.png) à gauche du logo/pitch sur
   bureau, repassé sous le texte en pile verticale sur mobile (voir media
   query plus bas) — même logique de bascule row/column-avec-order que
   .officer-ability-upgrade côté tracker. */
.bx-footer-brand-inner {
    display: flex;
    align-items: flex-start;
    gap: 14px;
}

.bx-footer-artwork {
    width: 84px;
    height: auto;
    flex-shrink: 0;
    border-radius: 8px;
    object-fit: cover;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);
}

.bx-footer-brand-text {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.bx-footer-logo {
    display: flex;
    align-items: center;
    gap: 10px;
    text-decoration: none;
    font-family: 'Bangers', cursive;
    font-size: 1.3em;
    letter-spacing: 1px;
    color: var(--bx-gold-light);
    text-shadow: 0 2px 0 #6b3e00, 0 3px 6px rgba(0, 0, 0, 0.5);
}

.bx-footer-logo img {
    width: 32px;
    height: 32px;
    object-fit: contain;
    flex-shrink: 0;
}

.bx-footer-tagline {
    margin: 4px 0 0;
    font-size: 0.88em;
    line-height: 1.5;
    color: var(--bx-text-muted);
}

.bx-footer-col-title {
    font-family: 'Bangers', cursive;
    letter-spacing: 0.5px;
    font-size: 1.02em;
    color: var(--bx-gold-light);
    margin-bottom: 2px;
}

.bx-footer-col a {
    color: var(--bx-text-soft);
    text-decoration: none;
    font-size: 0.92em;
    width: fit-content;
    transition: color 0.15s ease;
}

.bx-footer-col a:hover {
    color: var(--bx-gold-light);
    text-decoration: underline;
}

.bx-footer-social-links {
    display: flex;
    gap: 10px;
    margin-top: 2px;
}

.bx-footer-social-btn {
    height: 38px;
    flex-shrink: 0;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 2px solid var(--bx-card-border);
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
    transition: transform 0.15s ease, filter 0.15s ease;
}

/* 🔥 VRAIE cause de l'ovale (flex-shrink ne suffisait pas) : ces boutons sont
   des <a>, donc ".bx-footer-col a" (0,1,1 -- classe + type) les touche aussi
   et impose width:fit-content, qui l'emporte sur ".bx-footer-social-btn" seul
   (0,1,0 -- classe seule), moins spécifique. Sélecteur à 2 classes ci-dessous
   pour regagner la priorité sans !important. */
.bx-footer-social-links .bx-footer-social-btn {
    width: 38px;
}

.bx-footer-social-btn:hover {
    transform: translateY(-2px);
    filter: brightness(1.1);
}

.bx-footer-social-btn svg {
    width: 19px;
    height: 19px;
    fill: #fff;
}

.bx-footer-social-youtube { background: #FF0000; }
.bx-footer-social-discord { background: #5865F2; }

.bx-footer-bottom {
    border-top: 1px solid rgba(255, 255, 255, 0.12);
    padding: 14px 24px 20px;
    display: flex;
    flex-wrap: wrap;
    gap: 6px 20px;
    justify-content: center;
    align-items: center;
    text-align: center;
    font-size: 0.78em;
    color: var(--bx-text-muted-2);
}

.bx-footer-bottom a {
    color: var(--bx-text-muted-2);
    text-decoration: underline;
}

.bx-footer-bottom a:hover {
    color: var(--bx-gold-light);
}

@media (max-width: 768px) {
    .bx-footer-inner {
        flex-direction: column;
        gap: 24px;
        padding: 28px 18px 18px;
    }

    /* Artwork repassé SOUS le texte (pas à gauche) sur mobile : colonne au
       lieu de ligne, avec order pour inverser sans toucher au DOM (le texte
       reste avant l'image dans le HTML pour la lecture/SEO). */
    .bx-footer-brand-inner {
        flex-direction: column;
    }

    .bx-footer-brand-text {
        order: 1;
    }

    .bx-footer-artwork {
        order: 2;
        width: 140px;
        max-width: 50%;
    }

    /* Rien ne réserve la place de la barre de navigation basse fixe
       (.mobile-bottom-nav, voir style.css) au niveau du <body> sur les pages
       Beachadex (contrairement au tracker, où .main-content s'en charge) :
       sans ce padding, la ligne mention légale/copyright du footer -- dernier
       élément de la page -- se retrouverait cachée dessous sur mobile. */
    .bx-footer-bottom {
        padding-bottom: calc(var(--mobile-bottom-nav-h) + 20px);
    }
}

/* ==========================================================================
   PAGES STATIQUES (confidentialite.php, cgu.php, retours.php) — texte
   légal/informatif en prose, même palette --bx-* que le reste du site.
   ========================================================================== */
.bx-static-page {
    max-width: 760px;
    margin: 0 auto;
    padding: 36px 20px 60px;
    color: var(--bx-text-soft);
    line-height: 1.6;
}

.bx-static-page-narrow {
    max-width: 560px;
    text-align: center;
}

.bx-static-page h1 {
    font-family: 'Bangers', cursive;
    font-size: 2.1em;
    letter-spacing: 1px;
    margin: 0 0 4px;
    color: var(--bx-gold-light);
    text-shadow: 0 2px 0 #6b3e00, 0 3px 6px rgba(0, 0, 0, 0.5);
}

.bx-static-updated {
    font-size: 0.85em;
    color: var(--bx-text-muted-2);
    margin: 0 0 22px;
}

.bx-static-page h2 {
    font-family: 'Bangers', cursive;
    font-size: 1.3em;
    letter-spacing: 0.5px;
    color: var(--bx-gold-light);
    margin: 28px 0 8px;
    text-align: left;
}

.bx-static-page p,
.bx-static-page ul {
    margin: 0 0 14px;
    font-size: 0.96em;
}

.bx-static-page ul {
    padding-left: 22px;
}

.bx-static-page li {
    margin-bottom: 8px;
}

.bx-static-page a {
    color: var(--bx-gold-light);
}

.bx-static-note {
    font-size: 0.85em;
    color: var(--bx-text-muted-2);
    margin-top: 18px;
}

.bx-cta-btn {
    display: inline-block;
    margin: 8px 0 4px;
    padding: 14px 28px;
    background: linear-gradient(180deg, var(--bx-gold-light) 0%, var(--bx-gold) 55%, var(--bx-gold-dark) 100%);
    color: #4a2c00;
    font-family: 'Bangers', cursive;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    font-weight: 700;
    text-decoration: none;
    border: 1px solid #ffdf94;
    border-bottom: 4px solid #7a4400;
    border-radius: 12px;
    font-size: 1.05em;
    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.35);
    transition: transform 0.12s ease, filter 0.12s ease;
}

.bx-cta-btn:hover {
    filter: brightness(1.06);
    transform: translateY(-1px);
}

.bx-cta-btn:active {
    transform: translateY(1px);
    border-bottom-width: 2px;
}