/* =========================================================================
   RH Outremer — admin.css
   Interface d'administration : sobre, dense, sans fioriture.
   Réutilise les variables de charte définies dans main.css.
   ========================================================================= */

body.admin,
body.admin-auth {
    background: var(--surface);
    color: var(--texte);
}

/* -------------------------------------------------------------------------
   1. Écrans de connexion (carte centrée)
   ------------------------------------------------------------------------- */
body.admin-auth {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    padding: var(--esp-5);
}
.admin-carte {
    width: 100%;
    max-width: 30rem;
    background: var(--blanc);
    border-radius: var(--rayon-lg);
    box-shadow: var(--ombre-carte);
    padding: var(--esp-7);
}
.admin-carte h1 {
    font-size: var(--fs-h3);
    color: var(--bleu-dark);
    margin-bottom: var(--esp-5);
}
.admin-carte + .admin-carte { margin-top: var(--esp-5); }

/* -------------------------------------------------------------------------
   2. Barre d'administration
   ------------------------------------------------------------------------- */
.admin-barre {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--esp-4);
    padding: var(--esp-3) var(--esp-5);
    background: var(--bleu-dark);
    color: var(--blanc);
}
.admin-barre a { color: var(--blanc); }
.admin-barre a:hover { color: var(--parme); }
.admin-barre__titre {
    font-family: var(--police-titre);
    font-weight: 700;
    margin-right: var(--esp-4);
}
.admin-barre__droite { margin-left: auto; display: flex; align-items: center; gap: var(--esp-4); }
.admin-barre__user { font-size: var(--fs-small); color: var(--blanc-70); }

.admin-contenu {
    max-width: 72rem;
    margin-inline: auto;
    padding: var(--esp-6) var(--esp-5) var(--esp-8);
}
.admin-contenu h1 { font-size: var(--fs-h2); color: var(--bleu-dark); margin-bottom: var(--esp-5); }
.admin-contenu h2 { font-size: var(--fs-h3); color: var(--bleu-dark); margin-bottom: var(--esp-4); }

/* -------------------------------------------------------------------------
   3. Formulaires
   ------------------------------------------------------------------------- */
.admin-carte label,
.admin-bloc label {
    display: block;
    margin-top: var(--esp-4);
    margin-bottom: var(--esp-1);
    font-weight: 600;
    font-size: var(--fs-small);
}
input[type="text"],
input[type="email"],
input[type="tel"],
input[type="url"],
input[type="password"],
input[type="number"],
input[type="file"],
textarea,
select {
    width: 100%;
    padding: 0.6em 0.8em;
    font: inherit;
    color: var(--texte);
    /* Champs visibles sur une carte blanche (retour de Willy du 27/09/2026) :
       fond --surface et bordure --bleu-dark à 60 % (4,1:1 sur blanc, seuil
       de 3:1 d'un composant d'interface), au lieu de --bleu-10 (1,1:1). */
    background: var(--surface);
    border: 1px solid rgba(1, 34, 146, 0.6);
    border-radius: var(--rayon-sm);
}
textarea { min-height: 8rem; resize: vertical; }
input:focus-visible,
textarea:focus-visible,
select:focus-visible { outline: 2px solid var(--bleu); outline-offset: 1px; }

.admin-carte button,
.admin-bloc button { margin-top: var(--esp-5); }

.admin-champ-inline {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: var(--esp-3);
}
.admin-champ-inline label { margin-top: 0; }
.admin-champ-inline button { margin-top: 0; }

/* Cases à cocher : pas de pleine largeur. */
input[type="checkbox"] { width: auto; margin-right: var(--esp-2); }

/* -------------------------------------------------------------------------
   4. Blocs et tableaux
   ------------------------------------------------------------------------- */
.admin-bloc {
    background: var(--blanc);
    border-radius: var(--rayon-lg);
    box-shadow: var(--ombre-carte);
    padding: var(--esp-6);
    margin-bottom: var(--esp-6);
}

.admin-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--fs-small);
}
.admin-table th,
.admin-table td {
    text-align: left;
    padding: var(--esp-3);
    border-bottom: 1px solid var(--surface);
    vertical-align: middle;
}
.admin-table th { color: var(--texte-70); font-weight: 600; }
.admin-table tr:last-child td { border-bottom: none; }
/* Les tableaux larges défilent dans leur propre conteneur, jamais la page. */
.admin-table-scroll { overflow-x: auto; }

/* -------------------------------------------------------------------------
   5. Messages
   ------------------------------------------------------------------------- */
.admin-message {
    padding: var(--esp-3) var(--esp-4);
    border-radius: var(--rayon-sm);
    margin-bottom: var(--esp-4);
    font-size: var(--fs-small);
}
.admin-message--ok {
    background: rgba(0, 51, 204, 0.08);
    color: var(--bleu-dark);
    border-left: 3px solid var(--bleu);
}
.admin-message--erreur {
    background: rgba(190, 30, 45, 0.08);
    color: #8c1420;
    border-left: 3px solid #be1e2d;
}

.admin-vide { color: var(--texte-70); font-style: italic; }
.admin-aide { color: var(--texte-70); font-size: var(--fs-small); margin-top: var(--esp-2); }

/* Bouton discret pour les actions destructives. */
.admin-lien-danger {
    background: none;
    border: none;
    padding: 0;
    color: #be1e2d;
    font: inherit;
    text-decoration: underline;
    cursor: pointer;
}

/* -------------------------------------------------------------------------
   6. Fichiers d'un produit (un bloc par fichier)
   Pas de tableau ici : chaque ligne porte son propre formulaire, et un
   <form> ne peut pas être enfant direct d'un <tr>.
   ------------------------------------------------------------------------- */
.admin-fichier {
    padding: var(--esp-4);
    border: 1px solid var(--surface);
    border-radius: var(--rayon-sm);
    margin-bottom: var(--esp-3);
}
.admin-fichier__meta {
    font-size: var(--fs-small);
    color: var(--texte-70);
    font-weight: 600;
}
.admin-champ-inline__large { flex: 1 1 16rem; }
.admin-fichier .admin-lien-danger { margin-top: var(--esp-3); }

/* -------------------------------------------------------------------------
   7. Mot de passe provisoire et statuts de commande
   ------------------------------------------------------------------------- */
/* Bloc d'alerte : le mot de passe provisoire ne s'affiche qu'une fois. */
.admin-bloc--alerte {
    border-left: 4px solid var(--parme);
}
.admin-mdp {
    font-family: ui-monospace, "Cascadia Mono", "Courier New", monospace;
    font-size: 1.3rem;
    letter-spacing: 0.06em;
    background: var(--surface);
    padding: var(--esp-3) var(--esp-4);
    border-radius: var(--rayon-sm);
    user-select: all;
    display: inline-block;
}

.admin-statut {
    display: inline-block;
    padding: 0.2em 0.7em;
    border-radius: var(--rayon-pill);
    font-size: var(--fs-small);
    font-weight: 600;
    white-space: nowrap;
    background: var(--surface);
    color: var(--texte-70);
}
.admin-statut--payee    { background: rgba(0, 51, 204, 0.12);   color: var(--bleu-dark); }
.admin-statut--manuelle { background: rgba(164, 139, 255, 0.22); color: var(--bleu-dark); }
.admin-statut--echouee  { background: rgba(190, 30, 45, 0.10);  color: #8c1420; }
.admin-statut--remboursee { background: rgba(190, 30, 45, 0.10);  color: #8c1420; }
.admin-statut--gratuite   { background: rgba(0, 51, 204, 0.12);   color: var(--bleu-dark); }
/* Statuts en attente et expirée : pastilles distinctes du fond neutre
   (écran des commandes, 27/09/2026). Contrastes mesurés texte sur fond
   composé sur blanc (.admin-bloc), AA 4,5:1 exigé :
   en_attente ≈ 10,4:1 (--bleu-dark sur parme à 22 %), expiree ≈ 14,9:1
   (--texte sur gris à 8 %). */
.admin-statut--en_attente { background: rgba(164, 139, 255, 0.22); color: var(--bleu-dark); }
.admin-statut--expiree    { background: rgba(26, 26, 26, 0.08);    color: var(--texte); }

/* -------------------------------------------------------------------------
   8. Réglages, utilisateurs, journal (lot 4a)
   ------------------------------------------------------------------------- */
.admin-fieldset { border: 0; }
.admin-fieldset legend {
    float: left;
    width: 100%;
    font-family: var(--police-titre);
    font-size: var(--fs-h3);
    font-weight: 600;
    color: var(--bleu-dark);
    margin-bottom: var(--esp-3);
}
.admin-fieldset legend + * { clear: both; }

.admin-cases__titre { font-weight: 600; margin-top: var(--esp-5); }
.admin-cases {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-2) var(--esp-5);
}
.admin-cases label { margin-top: 0; font-weight: 400; }

.admin-erreur-champ { color: #8c1420; font-size: var(--fs-small); margin-top: var(--esp-1); }

.admin-table form { display: inline; }

/* -------------------------------------------------------------------------
   Lignes répétables d'une formation (modules, sessions), sprint 6.
   Cadre en --bleu-dark à 30 % sur la carte blanche ; textes en --texte et
   --bleu-dark, contrastes AA tenus (comme .admin-publication).
   ------------------------------------------------------------------------- */
.admin-ligne {
    margin-top: var(--esp-4);
    padding: var(--esp-3) var(--esp-4) var(--esp-4);
    border: 1px solid rgba(1, 34, 146, 0.3);
    border-radius: var(--rayon-md);
}
.admin-ligne legend {
    padding: 0 var(--esp-2);
    font-weight: 700;
    color: var(--bleu-dark);
}
.admin-ligne__champs {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
    gap: 0 var(--esp-4);
}
/* Champs date et heure de l'écran formation : même habillage que les autres
   champs (la règle générale ne les couvre pas). */
.admin-formation input[type="date"],
.admin-formation input[type="time"] {
    width: 100%;
    padding: 0.6em 0.8em;
    font: inherit;
    color: var(--texte);
    background: var(--surface);
    border: 1px solid rgba(1, 34, 146, 0.6);
    border-radius: var(--rayon-sm);
}
.admin-formation h3 { margin-top: var(--esp-7); }
.admin-table button { margin-top: 0; }
.admin-statut--succes { background: rgba(0, 51, 204, 0.12); color: var(--bleu-dark); }
.admin-statut--echec  { background: rgba(190, 30, 45, 0.10); color: #8c1420; }

.admin-pagination { display: flex; flex-wrap: wrap; gap: var(--esp-4); margin-top: var(--esp-5); }

/* Filtres de statut en pastilles (écran des commandes, 27/09/2026).
   Inactif : blanc, filet et texte --bleu-dark (12,8:1). Actif : plein
   --bleu-dark, texte blanc (12,8:1). */
.admin-filtres {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-2);
    list-style: none;
    margin: var(--esp-4) 0 0;
    padding: 0;
}
.admin-filtre {
    display: inline-flex;
    align-items: center;
    gap: var(--esp-2);
    padding: var(--esp-1) var(--esp-4);
    border: 1px solid var(--bleu-dark);
    border-radius: var(--rayon-pill);
    background: var(--blanc);
    color: var(--bleu-dark);
    font-weight: 600;
    text-decoration: none;
}
.admin-filtre:hover { background: var(--bleu-05); }
.admin-filtre--actif,
.admin-filtre--actif:hover {
    background: var(--bleu-dark);
    color: var(--blanc);
}
.admin-filtre__nombre {
    min-width: 1.5em;
    padding: 0 0.4em;
    border-radius: var(--rayon-pill);
    background: var(--bleu-10);
    font-size: var(--fs-small);
    text-align: center;
}
.admin-filtre--actif .admin-filtre__nombre { background: rgba(255, 255, 255, 0.2); }

/* Bouton d'un formulaire posé hors d'un bloc : même respiration qu'un bloc. */
.admin-actions { margin-bottom: var(--esp-6); }

/* -------------------------------------------------------------------------
   9. Médiathèque (lot 4b)
   ------------------------------------------------------------------------- */
.admin-medias {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
    gap: var(--esp-5);
    margin-top: var(--esp-5);
}
.admin-media {
    display: flex;
    flex-direction: column;
    gap: var(--esp-2);
    margin: 0;
    padding: var(--esp-4);
    background: var(--blanc);
    border: 1px solid var(--surface);
    border-radius: var(--rayon-lg);
    box-shadow: var(--ombre-carte);
}
.admin-media__apercu {
    display: block;
    width: 100%;
    height: 9rem;
    object-fit: cover;
    border-radius: var(--rayon-md);
    background: var(--surface);
}
.admin-media__apercu--pdf {
    display: grid;
    place-items: center;
    font-family: var(--police-titre);
    font-weight: 600;
    color: var(--bleu-dark);
}
.admin-media__nom {
    display: block;
    font-size: var(--fs-small);
    font-weight: 600;
    word-break: break-all;
}
.admin-media__lien {
    margin-top: 0;
    font-size: var(--fs-small);
}
.admin-media__copier { margin-top: var(--esp-2); }
.admin-media form { margin-top: auto; }
.admin-media button { width: 100%; }

/* --- Médiathèque en mode sélection (fenêtre de l'éditeur). --- */
.admin-media--choix {
    border: 1px solid var(--surface);
    text-align: left;
    font: inherit;
    cursor: pointer;
    transition: box-shadow var(--transition), border-color var(--transition);
}
.admin-media--choix:hover,
.admin-media--choix:focus-visible {
    border-color: var(--bleu);
    box-shadow: var(--ombre-carte-survol);
}

/* --- Aperçu de l'image de couverture dans un formulaire. --- */
.admin-media__apercu--couverture {
    max-width: 20rem;
    height: auto;
    margin-top: var(--esp-3);
}

/* -------------------------------------------------------------------------
   10. Thème D1 et navigation groupée
   -------------------------------------------------------------------------
   Fond de contenu #ADB8DB, validé par Willy le 20/09/2026.

   C'est le premier jeton hors charte du projet : il n'est ni --parme, ni une
   dérivée de --bleu-dark. Il est donc déclaré ici, sous body.admin, et ne
   peut pas atteindre le site public.

   Contrastes mesurés sur ce fond : --texte 8,83:1, --bleu-dark 6,48:1,
   --bleu 4,54:1. En dessous d'AA et donc PROSCRITS en texte sur ce fond :
   --texte-70 (3,29), blanc (1,97), --parme (1,38). La barre reste en
   --bleu-dark, où le blanc tient à 12,76:1.

   Les cartes blanches ne sont qu'à 1,97:1 du fond : un filet et une ombre
   portée les détachent, faute de contraste suffisant.

   Depuis le 27/09/2026, l'espace client (body.espace-membre, posé par
   inc/compte-layout.php) reprend le même fond et les mêmes jetons, à la
   demande de Willy : son en-tête reste celui du site public. Les règles
   propres à l'espace client sont en section 34 de components.css.
   ------------------------------------------------------------------------- */
body.admin,
body.admin-auth,
body.espace-membre {
    --admin-fond:        #ADB8DB;
    --admin-filet:       rgba(1, 34, 146, 0.18);
    --admin-ombre:       0 10px 30px rgba(1, 34, 146, 0.20);
    --admin-texte-fond:  rgba(26, 26, 26, 0.72);

    background: var(--admin-fond);
    color: var(--texte);
}

/* --- Cartes : détachées par le filet et l'ombre, pas par le contraste. --- */
.admin-bloc,
.admin-carte,
.admin-media {
    border: 1px solid var(--admin-filet);
    box-shadow: var(--admin-ombre);
}

/* --- Textes posés sur le fond, hors carte. --- */
.admin-contenu > p,
.admin-contenu > .admin-vide { color: var(--admin-texte-fond); }
.admin-contenu > h1 { color: var(--bleu-dark); }

/* -------------------------------------------------------------------------
   Barre : entrées groupées
   ------------------------------------------------------------------------- */
.admin-barre__lien,
.admin-barre__declencheur {
    display: inline-flex;
    align-items: center;
    gap: var(--esp-2);
}
.admin-barre__icone { flex: none; }

.admin-barre__groupe { position: relative; }

.admin-barre__declencheur {
    margin: 0;
    padding: var(--esp-2) var(--esp-3);
    font: inherit;
    color: var(--blanc);
    background: rgba(255, 255, 255, 0.12);
    border: 0;
    border-radius: var(--rayon-pill);
    cursor: pointer;
    transition: background var(--transition);
}
.admin-barre__declencheur:hover,
.admin-barre__declencheur:focus-visible { background: rgba(255, 255, 255, 0.22); }

/* Le groupe qui contient la page servie se signale par un filet parme :
   sur le bleu foncé de la barre, le parme est à 4,7:1. */
.admin-barre__groupe.est-actif .admin-barre__declencheur {
    background: rgba(164, 139, 255, 0.24);
    box-shadow: inset 0 -2px 0 var(--parme);
}

.admin-barre__panneau {
    list-style: none;
    margin: 0;
    padding: var(--esp-2);
}
.admin-barre__panneau a {
    display: flex;
    align-items: center;
    gap: var(--esp-2);
    padding: var(--esp-2) var(--esp-3);
    border-radius: var(--rayon-md);
    white-space: nowrap;
}

/* --- Repli sans JavaScript ---------------------------------------------
   Tant que admin.js n'a pas posé la classe « js », les panneaux restent
   dépliés : la barre redevient la liste à plat d'avant la refonte, donc
   utilisable. Masquer par défaut priverait un navigateur sans script de
   neuf entrées sur douze. */
body.js .admin-barre__panneau {
    position: absolute;
    top: calc(100% + var(--esp-2));
    left: 0;
    z-index: 20;
    min-width: 13rem;
    background: var(--blanc);
    border-radius: var(--rayon-lg);
    box-shadow: 0 14px 34px rgba(1, 34, 146, 0.28);
    display: none;
}
body.js .admin-barre__panneau a { color: var(--bleu-dark); }
body.js .admin-barre__panneau a:hover,
body.js .admin-barre__panneau a:focus-visible {
    background: var(--bleu-05);
    color: var(--bleu);
}
body.js .admin-barre__declencheur[aria-expanded="true"] + .admin-barre__panneau { display: block; }
body.js .admin-barre__declencheur[aria-expanded="true"] .admin-barre__icone:last-child {
    transform: rotate(180deg);
}
.admin-barre__declencheur .admin-barre__icone:last-child { transition: transform var(--transition); }

/* -------------------------------------------------------------------------
   11. Détails d'une commande (suivi des commandes, sprint 5)
   ------------------------------------------------------------------------- */
.admin-details summary {
    cursor: pointer;
    font-weight: 600;
    color: var(--bleu);
}
.admin-details__corps {
    margin-top: var(--esp-3);
    padding: var(--esp-4);
    background: var(--surface);
    border-radius: var(--rayon-md);
}
.admin-details__corps dl {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: var(--esp-2) var(--esp-4);
    margin: 0;
}
.admin-details__corps dt { font-weight: 600; color: var(--texte-70); }
.admin-details__corps dd { margin: 0; }
.admin-details__corps h3 {
    margin-top: var(--esp-5);
    margin-bottom: var(--esp-2);
    font-size: var(--fs-small);
    color: var(--bleu-dark);
}
.admin-details__corps form { margin-top: var(--esp-4); }
.admin-details__corps .btn { margin-top: 0; }

/* Ligne de détail : pleine largeur du tableau (tâche 4, 27/09/2026). */
.admin-ligne-detail > td { padding-top: 0; }
.admin-details__grille {
    display: grid;
    gap: var(--esp-4) var(--esp-6);
}
@media (min-width: 1024px) {
    .admin-details__grille { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1400px) {
    .admin-details__grille { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
.admin-details__section h3 { margin-top: 0; }
.admin-details__corps dt { color: var(--texte); }
/* Dans une section étroite (jusqu'à 4 colonnes), le couple dt/dd max-content/1fr
   du bloc général déborde sur les libellés longs (ex. « Accès immédiat... »),
   qui poussent alors la valeur hors de vue sans agrandir la piste de la grille
   (minmax(0, 1fr) la borne). Empilé, dt puis dd, jamais de débordement, quelle
   que soit la largeur de la section (constaté à l'écran, 27/09/2026). */
.admin-details__section dl { grid-template-columns: 1fr; }

/* -------------------------------------------------------------------------
   Publication d'un produit (retour de Willy du 27/09/2026)
   Encadré distinct au-dessus du bouton : la case est plus grande, l'état est
   écrit en toutes lettres, et un produit « fichier » sans livrable affiche
   pourquoi la case est grisée. Textes en --texte et --bleu-dark sur --bleu-05
   posé sur la carte blanche : contrastes AA largement tenus.
   ------------------------------------------------------------------------- */
.admin-publication {
    margin-top: var(--esp-5);
    padding: var(--esp-4) var(--esp-5);
    border: 1px solid rgba(1, 34, 146, 0.3);
    border-radius: var(--rayon-md);
    background: var(--bleu-05);
}
.admin-publication legend {
    padding: 0 var(--esp-2);
    font-weight: 700;
    color: var(--bleu-dark);
}
.admin-bloc .admin-publication__case {
    display: flex;
    align-items: center;
    gap: var(--esp-3);
    margin-top: 0;
    font-weight: 600;
    cursor: pointer;
}
.admin-publication__case input[type="checkbox"] {
    width: 1.35rem;
    height: 1.35rem;
    margin: 0;
    accent-color: var(--bleu);
}
.admin-publication__case input[type="checkbox"]:disabled {
    cursor: not-allowed;
    opacity: 0.5;
}
.admin-publication__etat {
    margin-top: var(--esp-2);
    color: var(--texte);
}
.admin-publication__blocage {
    margin-top: var(--esp-2);
    font-weight: 600;
    color: var(--bleu-dark);
}

/* Pages du site qui mènent au produit (review V1, point 8) : avertissement,
   jamais un blocage. Couleurs admises sur le fond D1 seulement. */
.admin-publication__liens {
    margin-top: var(--esp-3);
    padding-top: var(--esp-2);
    border-top: 1px solid rgba(26, 26, 26, .2);
    color: var(--texte);
}

.admin-publication__liens ul {
    margin: var(--esp-1) 0 0;
    padding-left: var(--esp-4);
}

/* Filet parme des blocs d'alerte (mot de passe provisoire, étape de dépôt
   des fichiers) : la bordure uniforme du thème D1, déclarée plus bas que la
   règle d'origine, l'écrasait. Sélecteur plus précis pour la rétablir. */
.admin-bloc.admin-bloc--alerte {
    border-left: 4px solid var(--parme);
}

/* -------------------------------------------------------------------------
   Tableau de bord : indicateurs de la boutique (27/09/2026)
   Cartes blanches cliquables sur le fond D1 : chiffre en --bleu-dark,
   libellé en --texte, contrastes AA tenus sur le blanc. Une rétractation à
   traiter porte le filet parme des alertes.
   ------------------------------------------------------------------------- */
.admin-indicateurs {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
    gap: var(--esp-4);
    margin-bottom: var(--esp-6);
}
.admin-indicateur {
    display: flex;
    flex-direction: column;
    gap: var(--esp-1);
    padding: var(--esp-5);
    background: var(--blanc);
    border: 1px solid var(--admin-filet);
    border-radius: var(--rayon-lg);
    box-shadow: var(--admin-ombre);
    color: var(--texte);
    text-decoration: none;
    transition: transform var(--transition);
}
.admin-indicateur:hover {
    transform: translateY(-2px);
}
.admin-indicateur__valeur {
    font-family: var(--police-titre);
    font-size: 2rem;
    font-weight: 700;
    line-height: 1.1;
    color: var(--bleu-dark);
}
.admin-indicateur__libelle {
    font-size: var(--fs-small);
    font-weight: 600;
}
.admin-indicateur--alerte {
    border-left: 4px solid var(--parme);
}

/* Case à cocher isolée dans la fiche produit (prix TTC unique, 13/10/2026) :
   même rendu que les cases de publication, détachée de l'aide qui précède. */
.admin-bloc .admin-publication__case.admin-case-isolee {
    margin-top: var(--esp-4);
}

/* -------------------------------------------------------------------------
   Annuaire des partenaires et demandes de partenariat (15/10/2026)
   Une visibilité qui expire dans moins de 30 jours est une prestation
   annuelle à renouveler : pastille pleine bleu profond, texte blanc
   (13,6:1), et ligne teintée de parme à 8 % (le texte --texte y garde
   plus de 15:1). Compteur dépassé : le rouge des statuts d'échec, 8,9:1
   sur le blanc des blocs.
   ------------------------------------------------------------------------- */
.admin-statut--alerte { background: var(--bleu-dark); color: var(--blanc); }
.admin-table tr.admin-ligne-expire_bientot > td { background: var(--parme-08); }
.admin-table tr.admin-ligne-expire_bientot > td:first-child { box-shadow: inset 4px 0 0 var(--parme); }
.admin-compteur--depasse { color: #8c1420; font-weight: 600; }
.admin-texte-libre { white-space: normal; overflow-wrap: anywhere; }
.admin-details__corps form .btn + .btn { margin-left: var(--esp-2); }
