/* Console Justice — palette beige / marron sur blanc cassé.
 *
 * `gmao.css` porte toute la mise en page ; on ne redéfinit ici que les
 * variables et les quelques couleurs que la feuille GMAO a écrites en dur
 * (bordures du rail, bandeau de démonstration).
 *
 * Couleurs et calques (refonte du 30/09/2026, maquette validée par Lucas : rag-justice/maquettes/) :
 * 1. Une échelle de tons, un rôle par ton (méthode Radix Colors) : sable n1 à n12 pour les neutres, brun a3 à a11
 *    pour l'accent. Pas d'hexadécimal isolé pour une surface, un trait ou un texte.
 * 2. Trois niveaux, toujours dans le même sens (couches de Material 3 et d'IBM Carbon) : le SOL (n2) porte les
 *    colonnes, le PAPIER (n1) porte ce qu'on lit (réponse, dossier, champs, fenêtres), le REMPLISSAGE (n3) sert au
 *    survol et aux jetons. Plus c'est proche, plus c'est clair ; une fenêtre flottante gagne une ombre, pas une teinte.
 *    Avant : la liste des questions était blanche et la réponse sur le beige, la navigation passait devant le contenu.
 * 3. 60-30-10 : 60 % de papier, 30 % de sol et de rail, 10 % d'accent, réservé à ce qui se clique.
 * 4. Une grande surface paraît plus saturée : le sol est un blanc cassé à peine chaud, le beige reste au rail et aux
 *    accents (l'ancien sol #f6f2ea donnait un aspect « papier jauni »).
 * 5. Contraste WCAG 2.2 AA : texte secondaire à 5,7:1 sur le sol ; bord des champs (n5) plus marqué que celui des
 *    cartes (n4). */
:root {
  --n1: #fffefc;        /* papier : réponse, blocs du dossier, champs, fenêtres */
  --n2: #f6f4f0;        /* sol : les colonnes */
  --n3: #eeeae3;        /* remplissage : survol, jetons, en-têtes */
  --n4: #e3ddd3;        /* trait : bord des cartes, séparateurs */
  --n5: #cbc2b5;        /* trait fort : bord des champs */
  --n11: #6b5f55;       /* texte secondaire */
  --n12: #2a211b;       /* texte */
  --a3: #f4ebe0;        /* accent, fond teinté : question ouverte, pastilles de citation */
  --a6: #e2c7a4;        /* accent, trait */
  --a9: #8a5a2b;        /* accent plein : boutons, liens, état actif */
  --a11: #6b4420;       /* accent, texte sur fond teinté */
  --fond: var(--n2); --bg: var(--n1); --panel: var(--n3); --line: var(--n4); --bordure: var(--n5);
  --text: var(--n12); --muted: var(--n11); --accent: var(--a9);
  --ok: #4f6d3a; --warn: #a8641f; --err: #a13b2c;
  --rail: #2b1d14; --rail-texte: #e6d8c7; --rail-actif: #45301f;
  /* Tons du rail, variables depuis les couleurs personnalisées (theme.js, 30/09/2026) : trait, texte secondaire,
     accent (parrainage, jours d'essai), case vide de la barre d'essai. */
  --rail-trait: #45301f; --rail-doux: #b9a38c; --rail-accent: #d9a86a; --rail-vide: #5a4029;
  --ombre-carte: 0 1px 2px rgba(43, 29, 20, .06);
}

#rail nav.tech, #pied { border-top-color: var(--rail-trait); }
#pied select { border-color: var(--rail-trait); }
#rail nav.tech button, #pied .lien, #btnRail { color: var(--rail-doux); }
.avatar small { color: var(--rail-doux); }

.domaine { font-size: 11px; letter-spacing: .14em; text-transform: uppercase;
           color: var(--rail-doux); padding: 0 10px 10px; font-weight: 600; }
#rail.replie .domaine { display: none; }

.marque-portail { display: flex; align-items: center; gap: 12px; }
.marque-domaine { font-size: 13px; letter-spacing: .14em; text-transform: uppercase;
                  font-weight: 700; color: var(--accent); }

.zone-demo { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--line); }
.zone-demo button { width: 100%; }

/* Le bandeau d'essai ou de démonstration informe sans alarmer : remplissage neutre et icône d'information. */
.bandeau-demo { background: var(--n3); border-bottom: 1px solid var(--n4); color: var(--n11); font-size: 12.5px; }
.bandeau-demo b { color: var(--n12); }
.bandeau-demo svg { flex: none; width: 16px; height: 16px; fill: none; stroke: var(--n11); stroke-width: 1.6;
                    stroke-linecap: round; }

button.primary { background: var(--accent); border-color: var(--accent); }
button:hover:not(:disabled) { border-color: var(--accent); }

/* Les trois colonnes sur le même sol ; la question ouverte prend l'accent. */
.colonne-liste { background: var(--n2); }
.colonne-liste input, .colonne-liste .nouveau { background: var(--n1); border-color: var(--n4); }
.q-item.actif { background: var(--a3); border-color: transparent; box-shadow: inset 3px 0 0 var(--a9); }
.q-item.actif b { color: var(--a11); }
/* Le papier : un trait et une ombre à peine visible. */
.carte-reponse, .bloc-dossier { box-shadow: var(--ombre-carte); }
/* Les pastilles de citation prennent l'accent : elles mènent aux sources. */
.cite { background: var(--a3); border-color: var(--a6); color: var(--a11); }
.cite:hover { background: var(--a9); border-color: var(--a9); color: #fff; }
/* Les champs : un bord plus marqué que celui des cartes, un anneau d'accent quand on écrit. */
.saisie { border-color: var(--n5); box-shadow: var(--ombre-carte); }
.saisie:focus-within { border-color: var(--a9); box-shadow: 0 0 0 3px var(--a3); }
.segment, #vue select, .filtres input { border-color: var(--n5); }

/* Filtres de la recherche : portée et ancienneté, au-dessus de la saisie. */
.filtres { display: flex; gap: 8px 18px; align-items: center; flex-wrap: wrap;
           margin-bottom: 8px; font-size: 12px; color: var(--muted); }
/* Chaque libellé reste collé à son champ (24/09/2026) : un groupe passe à la ligne en entier. Sur un écran étroit,
   « Chercher dans » peut se poser au-dessus de ses boutons, trop larges pour tenir à côté. */
.filtre { display: inline-flex; align-items: center; gap: 6px; flex-wrap: nowrap; }
.filtre-portee { flex-wrap: wrap; }
.filtres select { width: auto; padding: 5px 8px; font-size: 13px; }
/* La feuille commune met tous les champs à 100 % : la date passait seule à la ligne, loin de son libellé. */
.filtres input[type=date] { width: auto; padding: 5px 8px; font-size: 13px; }
/* Listes déroulantes : la flèche native se posait sur le texte selon le navigateur (« toutes » dans « Décisions
   depuis », 24/09/2026). Flèche dessinée ici, dans une marge droite qui lui est réservée. */
#vue select { appearance: none; -webkit-appearance: none; padding-right: 28px;
              background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%237a6a5e' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
              background-repeat: no-repeat; background-position: right 10px center; background-size: 10px 6px; }
.segment { display: inline-flex; border: 1px solid var(--line); border-radius: 8px;
           overflow: hidden; background: var(--bg); }
.segment button { border: 0; border-radius: 0; background: none; padding: 5px 12px;
                  font-size: 13px; }
.segment button.actif { background: var(--accent); color: #fff; }

/* Étiquette de type sur les sources. Trois couleurs au lieu de dix (30/09/2026) : la règle (codes, lois, décrets,
   conventions), son application (toutes les juridictions, la CNIL, les documents de la Cour), le cabinet. Le libellé
   garde le détail (« Cassation », « Juge du fond »…) et le dossier est déjà rangé par famille. */
.type-source { display: inline-block; font-size: 10px; letter-spacing: .08em;
               text-transform: uppercase; font-weight: 700; padding: 2px 7px;
               border-radius: 5px; margin-right: 6px; vertical-align: 1px; }
.type-source.article, .type-source.reglement, .type-source.convention { background: #e6ecdc; color: #3d5a2a; }
.type-source.decision, .type-source.commentaire, .type-source.fond, .type-source.admin, .type-source.constit,
.type-source.cnil { background: #f3e7d6; color: #7a4c1c; }
.type-source.cabinet { background: #e1e8f0; color: #33506e; }

/* Une source du dossier (30/09/2026) : son titre ouvre le texte officiel (Légifrance, Cour de cassation), « Lire ici »
   le lit dans la console (versions, passages surlignés) ; l'extrait est une citation, plus une boîte dans la boîte ;
   le chemin d'un article (« Partie législative > … > Paragraphe 1 ») tenait jusqu'à sept lignes : ses deux derniers
   niveaux, le chemin entier au survol. */
.source-extrait { background: none; border-radius: 0; border-left: 2px solid var(--n4); padding: 1px 0 1px 10px; }
.source-titre a { color: var(--n12); text-decoration: none; }
.source-titre a:hover { color: var(--a9); text-decoration: underline; text-underline-offset: 3px; }
.source-titre a svg { width: 11px; height: 11px; margin-left: 5px; vertical-align: 0; fill: none; stroke: var(--n11);
                      stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.source-titre a:hover svg { stroke: var(--a9); }
.source-meta { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
.source-meta .lien { font-size: 11.5px; font-weight: 600; }
.chemin { font-size: 12px; color: var(--n11); margin-bottom: 6px; white-space: nowrap; overflow: hidden;
          text-overflow: ellipsis; }
.depot-cabinet { border: 2px dashed var(--bordure, #c9b99a); border-radius: 10px; padding: 26px; text-align: center;
  cursor: pointer; transition: background-color .15s, border-color .15s; }
.depot-cabinet.survol { background: var(--a3); border-color: var(--a9); }
.statut-cabinet.pret { color: #3f5a2c; }
.statut-cabinet.erreur { color: #a33; }
.statut-cabinet.en_attente { color: #7a4e1c; }
.source-item.non-cite { opacity: .72; }
.similarite { font-variant-numeric: tabular-nums; }

/* Corps d'une source ouverte dans le volet de droite. */
.texte-source { white-space: pre-wrap; font-size: 13.5px; line-height: 1.6;
                background: var(--bg); border: 1px solid var(--line);
                border-radius: 8px; padding: 14px 16px; max-height: 60vh; overflow: auto; }
.texte-source mark { background: #f3dfb5; padding: 0 2px; border-radius: 3px; }
.zone-titre { font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
              color: var(--accent); font-weight: 700; margin: 14px 0 4px; }
.timeline { margin: 0; padding: 0; list-style: none; font-size: 13px; }
.timeline li { padding: 6px 0; border-top: 1px solid var(--line); display: flex; gap: 10px; }
.timeline li:first-child { border-top: 0; }
.timeline .muted { flex: 0 0 90px; }

/* Onglet Corpus : jauges d'avancement. */
.jauge { height: 8px; background: var(--panel); border-radius: 99px; overflow: hidden;
         margin-top: 6px; }
.jauge > span { display: block; height: 100%; background: var(--accent); border-radius: 99px; }
.ligne-jauge { display: grid; grid-template-columns: 200px 1fr 130px; gap: 12px;
               align-items: center; padding: 8px 0; border-top: 1px solid var(--line);
               font-size: 13px; }
.ligne-jauge:first-child { border-top: 0; }
.stats { margin-bottom: 14px; }
.stat { background: var(--bg); }

/* Rail (30/09/2026) : le parrainage est une rubrique comme les autres (plus de pavé doré, qui était l'élément le plus
   lumineux de l'écran) ; le compte, l'essai et son compte à rebours descendent en bas, sous Paramètres, à la place de
   la barre du haut. À deux jours de la fin, l'essai passe en orange. Le parrainage n'est pas dans une <nav> :
   ouvrir() réécrit la classe de tous les boutons des <nav> du rail. */
#railOffres { display: flex; flex-direction: column; gap: 2px; margin-top: 8px; }
#pied.hidden { display: none; }      /* #pied (gmao.css) l'emporterait sur .hidden */
#railOffres:empty { display: none; }
.rail-parrainage { background: transparent; border: 0; color: var(--rail-texte); text-align: left; padding: 8px 10px;
                   border-radius: 8px; font: inherit; font-size: 14px; cursor: pointer; width: 100%;
                   display: flex; align-items: center; gap: 10px; }
.rail-parrainage:hover { background: var(--rail-actif); color: #fff; }
.rail-parrainage .lib b { display: block; font-weight: 400; line-height: 1.3; }
.rail-parrainage .lib small { display: block; font-size: 11px; color: var(--rail-accent); font-weight: 500; }
#rail.replie .rail-parrainage { justify-content: center; padding: 10px 0; }
.essai-barre { display: flex; gap: 3px; margin-top: 2px; width: 100%; align-self: stretch; }
.essai-barre i { flex: 1; height: 4px; border-radius: 2px; background: var(--rail-vide); }
.essai-barre i.plein { background: var(--rail-accent); }

.rail-compte { position: relative; border-top: 1px solid var(--rail-trait); margin-top: 8px; padding-top: 8px; }
.rail-compte > summary { display: block; border-radius: 8px; padding: 7px 8px; color: var(--rail-texte);
                         cursor: pointer; list-style: none; }
.rail-compte .ligne { display: flex; align-items: center; gap: 10px; }
.rail-compte > summary::-webkit-details-marker { display: none; }
.rail-compte > summary:hover, .rail-compte[open] > summary { background: var(--rail-actif); }
.rail-compte .initiales { background: var(--a9); }
.rail-compte .qui { min-width: 0; }
.rail-compte .qui b { display: block; font-size: 13.5px; color: #fff; font-weight: 600; line-height: 1.25;
                      overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rail-compte .qui small { display: block; font-size: 11.5px; color: var(--rail-doux); line-height: 1.3;
                          overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rail-compte .chevron-haut { width: 12px; height: 12px; margin-left: auto; flex: none; fill: none; stroke: var(--rail-doux);
                             stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.rail-compte .essai-barre { padding: 7px 0 1px; }
.rail-compte.urgent .qui small { color: #ffb38a; }
.rail-compte.urgent .essai-barre i.plein { background: #e07a4f; }
.rail-compte .menu-panneau { top: auto; bottom: calc(100% + 6px); left: 0; right: auto; min-width: 236px; }
.rail-compte .menu-panneau a { display: block; padding: 8px 10px; font-size: 13px; color: var(--n12);
                               text-decoration: none; border-radius: 7px; }
.rail-compte .menu-panneau a:hover { background: var(--n3); }
.rail-compte .menu-panneau hr { border: 0; border-top: 1px solid var(--n4); margin: 6px 4px; }
#rail.replie .rail-compte > summary { padding: 7px 0; }
#rail.replie .rail-compte .ligne { justify-content: center; }
#rail.replie .rail-compte .chevron-haut { display: none; }

/* Fenêtre de parrainage (30/09/2026) : ce qu'on gagne, comment ça marche, puis le code et le message, chacun avec
   son bouton. */
.parr-accroche { font-size: 15px; margin: 0 0 14px; }
.parr-gains { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 18px; }
.parr-gain { border: 1px solid var(--n4); border-radius: 10px; padding: 12px 14px; background: var(--n1); }
.parr-gain.fort { background: var(--a3); border-color: var(--a6); }
.parr-gain small { display: block; font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--n11);
                   font-weight: 600; margin-bottom: 4px; }
.parr-gain b { display: block; font-size: 20px; color: var(--a9); line-height: 1.2; }
.parr-gain span { display: block; font-size: 12.5px; color: var(--n11); margin-top: 4px; line-height: 1.45; }
.parr-titre { font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--n11);
              font-weight: 600; margin: 0 0 8px; }
.parr-etapes { list-style: none; counter-reset: etape; margin: 0 0 18px; padding: 0; display: grid; gap: 8px; }
.parr-etapes li { counter-increment: etape; display: grid; grid-template-columns: 24px 1fr; gap: 10px;
                  font-size: 13px; line-height: 1.45; align-items: start; }
.parr-etapes li::before { content: counter(etape); width: 24px; height: 24px; border-radius: 50%;
                          background: var(--n3); color: var(--n12); font-weight: 600; font-size: 12px;
                          display: flex; align-items: center; justify-content: center; }
.parr-code { display: flex; align-items: center; justify-content: space-between; gap: 12px;
             border: 1px solid var(--n4); border-radius: 10px; padding: 12px 14px; background: var(--n2);
             margin-bottom: 12px; }
.parr-code small { display: block; font-size: 11.5px; color: var(--n11); }
.parr-code b { font-size: 20px; letter-spacing: .1em; color: var(--n12); font-variant-numeric: tabular-nums; }
.parr-message { border: 1px solid var(--n4); border-radius: 10px; padding: 12px 14px; }
.parr-message textarea { width: 100%; font-family: inherit; font-size: 13px; line-height: 1.55; border: 0; padding: 0;
                         margin: 6px 0 10px; background: none; color: var(--n12); resize: vertical; min-height: 150px; }
.parr-message a.bouton { display: inline-block; padding: 7px 12px; border-radius: 7px; border: 1px solid var(--n5);
                         color: var(--n12); text-decoration: none; }
.parr-message a.bouton:hover { border-color: var(--a9); }
/* Conditions complètes, repliées sous le message : un lecteur juriste veut tout lire, les autres n'en ont pas besoin. */
.parr-conditions { margin-top: 12px; border: 1px solid var(--n4); border-radius: 10px; padding: 0 14px; }
.parr-conditions > summary { cursor: pointer; padding: 11px 0; font-size: 13px; font-weight: 600; color: var(--a9);
                             list-style: none; display: flex; align-items: center; gap: 8px; }
.parr-conditions > summary::-webkit-details-marker { display: none; }
.parr-conditions > summary::before { content: '›'; font-size: 16px; line-height: 1; transition: transform .15s; }
.parr-conditions[open] > summary::before { transform: rotate(90deg); }
.parr-regles { margin: 0 0 10px; padding-left: 20px; display: grid; gap: 7px; font-size: 12.5px; line-height: 1.5;
               color: var(--n12); }
.parr-conditions p.muted { font-size: 12px; margin: 0 0 12px; }
.parr-conditions a { color: var(--a9); }
@media (max-width: 520px) { .parr-gains { grid-template-columns: 1fr; } }

/* Comptes (admin) : essais et abonnés */
.liste-comptes { width: 100%; border-collapse: collapse; font-size: 13px; }
.liste-comptes th { text-align: left; font-weight: 600; color: var(--muted); padding: 6px 8px; border-bottom: 1px solid var(--line); }
.liste-comptes td { padding: 7px 8px; border-bottom: 1px solid var(--line); vertical-align: top; }
/* Les actions passent à la ligne entre deux liens (30/09/2026) : la colonne Abonnement a élargi le tableau. */
.liste-comptes td.actions { white-space: normal; min-width: 190px; }
.liste-comptes td.actions .lien { white-space: nowrap; display: inline-block; margin-bottom: 3px; }
.liste-comptes td.actions .lien { margin-right: 8px; }

/* Titres longs (« Avis complémentaire de l'avocat général : Cass. … ») : la croix reste en haut à droite */
.panneau-tete { flex-wrap: nowrap; align-items: flex-start; }
.panneau-tete b { flex: 1 1 auto; min-width: 0; }
.panneau-fermer { flex: none; }

/* Versions d'un article (panneau de lecture) et repère « version remplacée » */
.versions-article { margin: 4px 0 12px; }
.versions-article button.version { display: block; text-align: left; padding: 3px 0; font-size: 12px; }
.versions-article button.version.active { font-weight: 600; color: inherit; cursor: default; text-decoration: none; }
.pill.version-ancienne { background: var(--a3); color: var(--a11); font-weight: 500; font-size: 11px; vertical-align: middle; }
.filtres input[type="date"] { font: inherit; font-size: 13px; padding: 3px 6px; border: 1px solid var(--bordure, #d8cfc2); border-radius: 6px; background: transparent; color: inherit; }

/* Veille : pastille du rail, bandeau de notification, domaines, fil. */
#rail nav button { position: relative; }
.badge-rail { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); min-width: 18px;
              height: 18px; padding: 0 5px; border-radius: 99px; background: #c2452f; color: #fff;
              font-size: 10.5px; font-weight: 700; line-height: 18px; text-align: center; }
#rail.replie .badge-rail { right: auto; left: 26px; top: 3px; transform: none; min-width: 15px; height: 15px;
                           line-height: 15px; font-size: 9.5px; padding: 0 3px; box-shadow: 0 0 0 2px var(--rail); }
.toast-veille { position: fixed; top: 14px; right: 18px; z-index: 50; display: flex; gap: 10px;
                align-items: center; background: var(--bg); border: 1px solid var(--line);
                border-left: 4px solid var(--accent); border-radius: 10px; padding: 10px 12px;
                box-shadow: 0 8px 24px rgba(43, 29, 20, .14); font-size: 13.5px; }
.toast-veille .lien { font-size: 18px; line-height: 1; padding: 0 4px; }
.vl-domaines { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.vl-domaines button { border-radius: 99px; padding: 6px 13px; font-size: 13px; background: var(--bg); }
.vl-domaines button.actif { background: var(--accent); border-color: var(--accent); color: #fff; }
.vl-section { margin-top: 14px; }
.vl-section h2 { display: flex; align-items: baseline; gap: 10px; }
.vl-section h2 .muted { font-size: 13px; font-weight: 400; }
.vl-groupe { border-top: 1px solid var(--line); padding: 12px 0; }
.vl-groupe:first-of-type { border-top: 0; }
.vl-tete { display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; }
.vl-titre { font-weight: 600; }
.vl-meta { font-size: 12.5px; color: var(--muted); }
.vl-nouveau { background: #c2452f; color: #fff; font-size: 10px; font-weight: 700; letter-spacing: .06em;
              text-transform: uppercase; padding: 2px 7px; border-radius: 5px; }
.vl-articles { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.vl-articles button { font-size: 12px; padding: 3px 9px; border-radius: 6px; background: var(--panel);
                      border-color: transparent; }
.vl-articles button.abroge { text-decoration: line-through; opacity: .8; }
.vl-arret { border-top: 1px solid var(--line); padding: 11px 0; cursor: pointer; }
.vl-arret:first-of-type { border-top: 0; }
.vl-arret:hover .vl-titre { color: var(--accent); }
.vl-sommaire { font-size: 13px; margin-top: 4px; line-height: 1.5; }

/* Réponse au fil de sa rédaction : un curseur qui clignote en fin de texte. */
.curseur-redaction { display: inline-block; width: 8px; height: 1.05em; margin-left: 2px; vertical-align: -2px;
                     background: var(--accent); border-radius: 1px; animation: clignote 1s steps(1) infinite; }
@keyframes clignote { 50% { opacity: 0; } }
#rch-flux-etape { white-space: nowrap; }

/* --- Repli du dossier et de ses rubriques (24/09/2026) -------------------------------------------------------
   Une flèche replie le dossier entier : en bande étroite quand il est en colonne, en simple en-tête quand il passe
   sous la réponse. Chaque rubrique (« Codes et lois »…) montre aussi sa flèche : elle se repliait déjà, sans le dire. */
.titre-dossier { display: flex; align-items: center; gap: 8px; }
.titre-dossier .pill:empty { display: none; }
.plier { flex: none; width: 26px; height: 26px; padding: 0; border: 1px solid var(--line); border-radius: 7px;
         background: var(--bg); color: var(--muted); display: inline-flex; align-items: center;
         justify-content: center; cursor: pointer; }
.plier:hover { border-color: var(--accent); color: var(--accent); }
.plier svg, .bloc-dossier .chevron { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 1.8;
                                     stroke-linecap: round; stroke-linejoin: round; transition: transform .15s; }
.colonne-dossier.replie { flex: 0 0 50px; min-width: 50px; padding: 16px 11px; overflow: hidden; cursor: pointer; }
.colonne-dossier.replie #rch-dossier { display: none; }
.colonne-dossier.replie .titre-dossier { flex-direction: column; gap: 12px; }
.colonne-dossier.replie .lib-dossier { writing-mode: vertical-rl; }
.colonne-dossier.replie .plier svg { transform: rotate(180deg); }
.bloc-dossier > summary .droite { display: inline-flex; align-items: center; gap: 8px; }
.bloc-dossier .chevron { color: var(--muted); }
.bloc-dossier:not([open]) .chevron { transform: rotate(-90deg); }
/* Sous 1150 px, le dossier passe sous la réponse : ouvert, la flèche pointe vers le haut ; replié, vers le bas. */
@media (max-width: 1150px) {
  .plier svg { transform: rotate(-90deg); }
  .colonne-dossier.replie { flex: 1 1 100%; min-width: 0; padding: 12px 16px; }
  .colonne-dossier.replie .titre-dossier { flex-direction: row; gap: 8px; margin-bottom: 0; }
  .colonne-dossier.replie .lib-dossier { writing-mode: horizontal-tb; }
  .colonne-dossier.replie .plier svg { transform: rotate(90deg); }
}

/* --- Téléphone (24/09/2026) -----------------------------------------------------------------------------------
   Les pages passent dans une barre en bas, côte à côte ; la liste des questions devient un tiroir ouvert par le
   burger en haut à gauche ; la réponse et le dossier s'empilent ; rien ne déborde en largeur. */
.burger { display: none; flex: none; width: 36px; height: 36px; padding: 0; border: 1px solid var(--line);
          border-radius: 8px; background: var(--bg); color: var(--text); align-items: center; justify-content: center; }
.voile { display: none; }
@media (max-width: 760px) {
  #app { display: block; }
  #corps { min-height: 100vh; padding-bottom: calc(64px + env(safe-area-inset-bottom)); }
  #barre { padding: 0 10px; gap: 8px; }
  #barre .avatar { display: none; }
  body[data-vue="recherche"] .burger { display: inline-flex; }
  .bandeau-demo { font-size: 12px; padding: 8px 12px; }
  #vue { display: block; }
  .colonne-centre, .colonne-pleine { max-height: none; padding: 14px 12px; }
  .colonne-dossier, .colonne-dossier.replie { max-height: none; padding: 12px; }
  #vue table { display: block; overflow-x: auto; }

  /* La liste des questions : un tiroir à gauche, au-dessus d'un voile. */
  .colonne-liste { position: fixed; top: 0; bottom: 0; left: 0; z-index: 60; width: min(86vw, 340px);
                   min-width: 0; max-height: none; transform: translateX(-104%); transition: transform .2s ease;
                   box-shadow: 0 0 24px rgba(43, 29, 20, .2); }
  body.liste-ouverte .colonne-liste { transform: none; }
  body.liste-ouverte .voile { display: block; position: fixed; inset: 0; z-index: 55;
                              background: rgba(43, 29, 20, .35); }

  /* Les pages : le rail devient une barre fixe en bas, icône au-dessus du libellé. */
  #rail, #rail.replie { position: fixed; left: 0; right: 0; bottom: 0; top: auto; z-index: 50; width: auto;
                        height: auto; flex: none; flex-direction: row; align-items: stretch; gap: 0;
                        padding: 4px 4px calc(4px + env(safe-area-inset-bottom)); overflow-x: auto;
                        border-top: 1px solid var(--rail-trait); }
  #rail .marque, #rail .domaine, #rail > .grow, #railOffres, #pied { display: none; }
  /* Les deux groupes de pages s'effacent : tous les boutons se partagent la barre à parts égales, sur une ligne. */
  #rail nav, #rail nav.tech { display: contents; }
  #rail nav button, #rail.replie nav button { flex: 1 1 0; min-width: 0; width: auto; flex-direction: column;
                                              gap: 3px; padding: 6px 2px; font-size: 10.5px; justify-content: center; }
  #rail nav.tech button { color: var(--rail-texte); font-size: 10.5px; }
  #rail nav button .lib, #rail.replie nav button .lib { display: block; max-width: 100%; }
  /* Ce qu'on amène à l'écran (renvoi, champ) ne se cache ni sous la barre du haut ni sous celle des pages. */
  html { scroll-padding-top: 64px; scroll-padding-bottom: calc(76px + env(safe-area-inset-bottom)); }
  #rail .badge-rail, #rail.replie .badge-rail { left: auto; right: 8px; top: 2px; transform: none; }
  .toast-veille { top: auto; bottom: calc(76px + env(safe-area-inset-bottom)); left: 12px; right: 12px; }
}

/* --- Paramètres (24/09/2026) : compte et abonnement, puis l'administration pour l'admin ------------------------- */
.parametres-onglets { margin: 0 0 16px; flex-wrap: wrap; }
.parametres-onglets button.actif { background: var(--accent); color: #fff; }
.prm-lignes { display: grid; gap: 8px; margin: 4px 0 8px; }
.prm-lignes > div { display: flex; gap: 12px; align-items: baseline; flex-wrap: wrap; }
.prm-lignes .muted { width: 110px; flex: none; font-size: 13px; }
.prm-bloc { border-top: 1px solid var(--line); margin-top: 16px; padding-top: 14px; }
.prm-bloc h3 { font-size: 15px; margin: 0 0 6px; }
.prm-bloc p { margin: 0 0 10px; font-size: 14px; }

/* --- Plus de barre du haut sur ordinateur et tablette (30/09/2026) ----------------------------------------------
   Elle redisait la rubrique ouverte (« RECHERCHE ») et portait le compte, descendu en bas du rail. Les colonnes
   prennent la hauteur de la fenêtre moins le bandeau d'essai, que core.js mesure (--bandeau). Sur téléphone, la barre
   reste : elle porte le bouton des questions et le compte, et le bas du rail y est une barre d'onglets. */
@media (min-width: 761px) {
  :root { --barre: var(--bandeau, 0px); }
  #barre { display: none; }
}
@media (max-width: 760px) {
  #railCompte { display: none; }
}

/* --- Abonnement par carte (30/09/2026) ---------------------------------------------------------------------------
   Mêmes règles que le reste : cartes sur le papier (n1), la formule annuelle mise en avant par le fond teinté
   d'accent (a3), comme l'abonnement annuel du parrainage ; l'accent plein reste aux boutons. La session réduite
   (essai ou abonnement terminé) passe le bandeau en teinte d'accent, sans rouge : rien n'est perdu, reste à
   choisir une formule. */
.bandeau-demo.alerte { background: var(--a3); border-bottom-color: var(--a6); color: var(--a11); }
.bandeau-demo.alerte svg { stroke: var(--a11); }
.bandeau-demo .bandeau-action { flex: none; margin-left: auto; background: var(--n1); border: 1px solid var(--n5);
                                color: var(--n12); border-radius: 7px; padding: 4px 10px; font-size: 12px; }
.bandeau-demo .bandeau-action:hover { border-color: var(--a9); color: var(--a9); }
.abo-alerte { border: 1px solid var(--a6); background: var(--a3); color: var(--a11); border-radius: 12px;
              padding: 14px 16px; margin: 0 0 16px; font-size: 14px; line-height: 1.5; }
.abo-alerte b { display: block; color: var(--n12); font-size: 15px; margin-bottom: 4px; }
.abo-formules { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 12px 0 8px; }
.abo-formule { display: flex; flex-direction: column; gap: 6px; border: 1px solid var(--n4); border-radius: 12px;
               padding: 16px; background: var(--n1); box-shadow: var(--ombre-carte); }
.abo-formule.fort { background: var(--a3); border-color: var(--a6); }
.abo-formule small { font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--n11);
                     font-weight: 600; }
.abo-formule .prix { font-size: 26px; font-weight: 700; color: var(--n12); line-height: 1.15;
                     font-variant-numeric: tabular-nums; }
.abo-formule .prix span { font-size: 13.5px; font-weight: 500; color: var(--n11); }
.abo-formule .detail { flex: 1; font-size: 13px; line-height: 1.5; color: var(--n11); }
.abo-formule button { align-self: flex-start; margin-top: 4px; }
.abo-etiquette { display: inline-block; margin-left: 8px; padding: 2px 7px; border-radius: 5px; background: var(--a9);
                 color: #fff; font-size: 10px; letter-spacing: .06em; vertical-align: 1px; }
.abo-note { font-size: 12.5px; color: var(--n11); margin: 6px 0 0; line-height: 1.5; }
.abo-note a { color: var(--a9); }
.abo-carte { border: 1px solid var(--n4); border-radius: 12px; padding: 14px 16px; background: var(--n1);
             box-shadow: var(--ombre-carte); }
.abo-carte .ligne-titre { display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
                          flex-wrap: wrap; }
.abo-carte p { margin: 6px 0 0; font-size: 14px; }
.abo-statut { flex: none; font-size: 12px; font-weight: 600; border-radius: 99px; padding: 2px 10px; }
.abo-statut.ok { background: #e6ecdc; color: #3d5a2a; }
.abo-statut.attention { background: #f6e3cf; color: #8a4b12; }
.abo-statut.neutre { background: var(--n3); color: var(--n11); }
.abo-actions { display: flex; gap: 10px 14px; align-items: center; flex-wrap: wrap; margin-top: 12px; }
.abo-factures { width: 100%; border-collapse: collapse; font-size: 13px; }
.abo-factures th { text-align: left; font-weight: 600; color: var(--n11); padding: 6px 8px;
                   border-bottom: 1px solid var(--n4); }
.abo-factures td { padding: 7px 8px; border-bottom: 1px solid var(--n4); }
.abo-factures td.montant { font-variant-numeric: tabular-nums; }

/* Fenêtre de souscription : trois étapes annoncées (informations, récapitulatif, paiement chez Stripe). */
.abo-etapes { list-style: none; display: flex; gap: 6px; margin: 0 0 16px; padding: 0; counter-reset: etape;
              font-size: 12.5px; color: var(--n11); }
.abo-etapes li { counter-increment: etape; display: flex; align-items: center; gap: 6px; }
.abo-etapes li + li::before { content: ''; width: 18px; height: 1px; background: var(--n5); margin-right: 2px; }
.abo-etapes li span, .abo-etapes li { white-space: nowrap; }
.abo-etapes li.actif { color: var(--a11); font-weight: 600; }
.abo-etapes li.fait { color: var(--ok); }
.abo-choix { margin: 0; }
.abo-choix button { padding: 6px 14px; }
.abo-choix button.actif { background: var(--accent); color: #fff; }
.abo-champs { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 12px; align-items: end; }
.abo-champs label { display: flex; flex-direction: column; gap: 4px; font-size: 12.5px; color: var(--n11); }
.abo-champs label.large { grid-column: 1 / -1; }
.abo-champs label.hidden { display: none; }
.abo-champs input, .abo-champs select { border-color: var(--n5); color: var(--n12); font-size: 14px; }
.abo-cases { display: grid; gap: 10px; margin: 16px 0 0; font-size: 13.5px; line-height: 1.45; }
.abo-cases label { display: flex; gap: 9px; align-items: flex-start; cursor: pointer; }
.abo-cases input { flex: none; width: 16px; height: 16px; margin: 2px 0 0; accent-color: var(--a9); }
.abo-cases a { color: var(--a9); }
.abo-recap { display: grid; grid-template-columns: 110px 1fr; gap: 9px 14px; margin: 0; font-size: 13.5px;
             line-height: 1.5; }
.abo-recap dt { color: var(--n11); }
.abo-recap dd { margin: 0; color: var(--n12); }
.abo-securite { font-size: 12.5px; color: var(--n11); margin: 12px 0 0; line-height: 1.5; }
.abo-test { font-size: 12.5px; background: #fdf3d8; border: 1px solid #ecd58f; color: #6b5310; border-radius: 8px;
            padding: 8px 10px; margin: 12px 0 0; }
.abo-erreur { color: var(--err); font-size: 13px; margin: 10px 0 0; }
.abo-erreur:empty { display: none; }
@media (max-width: 620px) {
  .abo-formules, .abo-champs { grid-template-columns: 1fr; }
  .abo-recap { grid-template-columns: 1fr; gap: 2px 0; }
  .abo-recap dd { margin-bottom: 8px; }
  .abo-etapes li + li::before { width: 10px; }
}

/* --- Apparence (30/09/2026, sans barres depuis le 06/10/2026) : couleurs personnalisées --------------------------
   Réglages à gauche, aperçu à droite : rien ne couvre ce qui change, et toute la console (rail compris) suit en direct.
   La teinte en douze pastilles, l'intensité en quatre boutons. */
.app-grille { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 20px; align-items: start; }
.app-prereglages { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.app-prereglages button { display: inline-flex; align-items: center; gap: 7px; padding: 5px 11px 5px 6px;
                          border-radius: 99px; background: var(--n1); border-color: var(--n4); font-size: 13px; }
.app-prereglages button.actif { border-color: var(--a9); box-shadow: 0 0 0 2px var(--a3); }
.app-prereglages i { width: 18px; height: 18px; border-radius: 50%; flex: none; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .12); }
.app-libelle { display: flex; justify-content: space-between; align-items: baseline; font-size: 13px; font-weight: 600;
               color: var(--n12); margin: 4px 0 8px; }
.app-libelle .muted { font-weight: 400; font-size: 12.5px; }
.app-teintes { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 18px; }
.app-teinte { width: 30px; height: 30px; padding: 0; border-radius: 50%; border: 2px solid var(--n1);
              background: var(--c); box-shadow: 0 0 0 1px var(--n4); cursor: pointer; transition: box-shadow .12s; }
.app-teinte:hover { box-shadow: 0 0 0 2px var(--n5); }
.app-teinte.actif { box-shadow: 0 0 0 2px var(--n12); }
.app-teinte:focus-visible { outline: 2px solid var(--a9); outline-offset: 2px; }
.app-niveaux { margin: 0 0 18px; }
.app-niveaux button { padding: 6px 16px; }
@media (max-width: 520px) { .app-teinte { width: 34px; height: 34px; } }
.app-apercu { display: grid; grid-template-columns: 118px 1fr; border: 1px solid var(--n4); border-radius: 12px;
              overflow: hidden; box-shadow: var(--ombre-carte); min-height: 230px; }
.app-rail { background: var(--rail); color: var(--rail-texte); padding: 14px 10px; display: flex; flex-direction: column;
            gap: 6px; font-size: 12.5px; }
.app-rail b { color: #fff; font-size: 13px; margin-bottom: 6px; }
.app-rail span { padding: 5px 8px; border-radius: 7px; }
.app-rail span.actif { background: var(--rail-actif); color: #fff; font-weight: 600; }
.app-rail small { margin-top: auto; color: var(--rail-accent); font-size: 11.5px; padding: 0 8px; }
.app-page { background: var(--n2); padding: 14px 16px; font-size: 13px; }
.app-page p { margin: 0 0 8px; }
.app-page .app-titre { font-size: 11px; letter-spacing: .08em; text-transform: uppercase; font-weight: 600; color: var(--n11); }
.app-fort { background: var(--a3); border: 1px solid var(--a6); border-radius: 9px; padding: 9px 11px; margin: 6px 0 4px; }
.app-fort b { display: block; color: var(--a11); }
.app-fort span { color: var(--n12); }
.app-bouton { background: var(--a9); color: #fff; border-radius: 7px; padding: 6px 12px; font-weight: 600; }
.app-lien { color: var(--a9); text-decoration: underline; text-underline-offset: 3px; }
.app-contrastes { border-top: 1px solid var(--line); margin-top: 18px; padding-top: 14px; }
.app-contrastes ul { list-style: none; margin: 0 0 6px; padding: 0; display: grid;
                     grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 6px 18px; font-size: 13px; }
.app-contrastes li { display: grid; grid-template-columns: 1fr auto; column-gap: 8px; padding: 6px 0;
                     border-bottom: 1px solid var(--n4); }
.app-contrastes li b { font-variant-numeric: tabular-nums; }
.app-contrastes li small { grid-column: 1 / -1; color: var(--n11); font-size: 11.5px; }
.app-contrastes li.conforme small { color: var(--ok); }
.app-contrastes li.non-conforme small { color: var(--err); }
@media (max-width: 900px) { .app-grille { grid-template-columns: 1fr; } }

/* Suppression du compte : une action rare et définitive, en rouge sobre, jamais en bouton principal. */
button.danger { background: var(--err); border-color: var(--err); color: #fff; font-weight: 600; }
button.danger:hover:not(:disabled) { border-color: #7d2c20; background: #8d3326; }
button.danger-contour { background: var(--n1); border-color: #e2b8b0; color: var(--err); }
button.danger-contour:hover:not(:disabled) { border-color: var(--err); }
.abo-champ-seul { display: flex; flex-direction: column; gap: 4px; font-size: 12.5px; color: var(--n11); }

/* --- Abonnement cabinet (30/09/2026) ----------------------------------------------------------------------------------
   L'offre sous les deux formules individuelles, en bandeau clair ; dans la rubrique Cabinet, la jauge des sièges reprend
   la barre de l'essai (une case par siège). */
.abo-cabinet-offre { display: flex; justify-content: space-between; align-items: center; gap: 12px 18px; flex-wrap: wrap;
                     margin-top: 14px; padding: 14px 16px; border: 1px dashed var(--a6); border-radius: 12px;
                     background: var(--n1); }
.abo-cabinet-offre b { display: block; color: var(--n12); }
.abo-cabinet-offre span { display: block; font-size: 13px; color: var(--n11); line-height: 1.5; max-width: 62ch; }
.abo-sieges { margin-top: 14px; }
.abo-sieges input { max-width: 140px; }
.abo-calcul { font-size: 15px; font-weight: 600; color: var(--n12); margin: 8px 0 2px; font-variant-numeric: tabular-nums; }
.cab-entete { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-bottom: 10px; }
.cab-entete b { display: block; font-size: 17px; color: var(--n12); }
.cab-entete span.muted { display: block; font-size: 13px; margin-top: 2px; }
.cab-jauge { display: flex; gap: 4px; max-width: 520px; }
.cab-jauge i { flex: 1; height: 8px; border-radius: 3px; background: var(--n4); }
.cab-jauge i.plein { background: var(--a9); }
.cab-jauge-texte { font-size: 13px; color: var(--n11); margin: 6px 0 14px; }
.cab-grille { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; align-items: start; }
.cab-grille .abo-carte > b { display: block; margin-bottom: 4px; color: var(--n12); }
.cab-grille .abo-carte p { font-size: 13px; color: var(--n11); }
.cab-grille .abo-champ-seul { margin-top: 10px; }
.cab-lien { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--n4); }
.cab-lien p { margin: 0 0 8px; font-size: 13px; }
.cab-lien input { width: 100%; font-size: 12.5px; color: var(--n12); }
.cab-membres td { vertical-align: middle; }
.cab-membres .abo-statut { margin-left: 6px; font-size: 11px; }
@media (max-width: 900px) { .cab-grille { grid-template-columns: 1fr; } }

/* --- Accès d'assistance (30/09/2026) ------------------------------------------------------------------------------------
   Le code se lit d'un coup d'oeil pour être dicté au téléphone : grand, espacé, en chiffres tabulaires. */
.as-code { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
           border: 1px solid var(--a6); background: var(--a3); border-radius: 10px; padding: 12px 14px; margin-top: 12px; }
.as-code small { display: block; font-size: 11.5px; color: var(--a11); }
.as-code b { font-size: 24px; letter-spacing: .12em; color: var(--n12); font-variant-numeric: tabular-nums; }
.as-liste { display: grid; gap: 8px; margin-top: 12px; }
.as-acces { border: 1px solid var(--n4); border-radius: 10px; padding: 10px 12px; background: var(--n1); font-size: 13px; }
.as-acces .ligne-titre { display: flex; justify-content: space-between; gap: 10px; align-items: baseline; flex-wrap: wrap; }
.as-acces details { margin-top: 6px; }
.as-acces summary { cursor: pointer; color: var(--a9); font-size: 12.5px; }
.as-acces ul { margin: 6px 0 4px; padding-left: 18px; display: grid; gap: 3px; }
.as-acces .lien { margin-top: 6px; font-size: 12.5px; }
#as-vue { margin-top: 12px; }
.as-entete .segment { margin-right: auto; }
.as-reponse { font-size: 14px; line-height: 1.6; margin-top: 8px; }
.as-sources { margin: 0; padding-left: 18px; font-size: 12.5px; color: var(--n11); display: grid; gap: 2px; }

/* --- Double authentification (30/09/2026) ------------------------------------------------------------------------------ */
#portail[data-mode="code"] #zoneDemo { display: none; }
.df-etapes { margin: 0 0 12px; padding-left: 20px; display: grid; gap: 12px; font-size: 13.5px; line-height: 1.5; }
.df-etapes li > span { display: block; }
.df-champ { display: block; margin-top: 6px; width: 100%; max-width: 240px; font-size: 16px; letter-spacing: .08em; }
.df-qr { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin: 8px 0 0; padding: 12px;
         border: 1px solid var(--n4); border-radius: 10px; background: var(--n1); }
.df-qr svg { width: 188px; height: 188px; flex: none; shape-rendering: crispEdges; }
.df-qr div { min-width: 0; flex: 1 1 180px; }
.df-qr small { display: block; font-size: 12px; color: var(--n11); margin-bottom: 4px; }
.df-qr code { display: block; font-size: 14px; letter-spacing: .06em; color: var(--n12); overflow-wrap: anywhere;
              user-select: all; }
/* Mise en place depuis le téléphone lui-même : le QR code ne s'y scanne pas, le lien otpauth:// ouvre l'application. */
.df-qr a.df-lien-app { display: none; }            /* plus précis que a.bouton-lien, qui l'afficherait partout */
@media (max-width: 700px), (pointer: coarse) { .df-qr a.df-lien-app { display: inline-block; margin-top: 10px; } }
.df-codes { columns: 2; margin: 0 0 12px; padding-left: 26px; font-family: ui-monospace, "Cascadia Mono", Consolas, monospace;
            font-size: 15px; line-height: 1.9; color: var(--n12); }
.df-confirme { display: flex; gap: 9px; align-items: center; margin-top: 14px; font-size: 13.5px; cursor: pointer; }
.df-confirme input { width: 16px; height: 16px; accent-color: var(--a9); }
.df-peu { color: #8a4b12; font-weight: 600; }
.df-carte { margin-top: 14px; }
/* Un lien habillé en bouton (Télécharger) : mêmes mesures que les boutons voisins (style.css). */
a.bouton-lien { display: inline-block; font: inherit; line-height: normal; padding: 7px 12px; border-radius: 7px;
                border: 1px solid var(--line); background: var(--panel); color: var(--text); text-decoration: none; }
a.bouton-lien:hover { border-color: var(--accent); }

/* --- Compte partagé (30/09/2026) ------------------------------------------------------------------------------------ */
.cpt-partage { font-size: 11px; margin-left: 4px; white-space: nowrap; }

/* --- Bandeau d'erreur (30/09/2026) : orange = serveur injoignable, rouge = erreur. Couleurs fixes, hors thème
   (blanc sur #b42318 : 6,6:1, blanc sur #b54708 : 5,4:1). -------------------------------------------------------- */
.bandeau-erreur { position: fixed; top: 12px; left: 50%; transform: translateX(-50%); z-index: 1000;
                  width: min(780px, calc(100% - 24px)); display: flex; align-items: flex-start; gap: 10px;
                  padding: 11px 12px 11px 14px; border-radius: 10px; color: #fff; font-size: 13.5px; line-height: 1.45;
                  box-shadow: 0 12px 32px rgba(0, 0, 0, .28); animation: bandeau-entree .22s ease-out; }
.bandeau-erreur[hidden] { display: none; }
.bandeau-erreur.erreur { background: #b42318; }
.bandeau-erreur.alerte { background: #b54708; }
.bandeau-erreur > svg { flex: none; margin-top: 1px; }
.bandeau-erreur .texte { flex: 1; min-width: 0; }
.bandeau-erreur .ref { font-weight: 600; white-space: nowrap; }
.bandeau-erreur details { margin-top: 4px; font-size: 12px; }
.bandeau-erreur summary { cursor: pointer; }
.bandeau-erreur code { display: block; margin-top: 4px; padding: 6px 8px; border-radius: 6px; background: rgba(0, 0, 0, .2);
                       color: #fff; font-size: 11.5px; white-space: pre-wrap; word-break: break-word; }
.bandeau-erreur button { flex: none; background: transparent; color: #fff; border: 1px solid rgba(255, 255, 255, .6);
                         border-radius: 7px; padding: 4px 10px; font-size: 13px; cursor: pointer; }
.bandeau-erreur button:hover { background: rgba(255, 255, 255, .15); border-color: #fff; }
.bandeau-erreur .bandeau-fermer { border: none; font-size: 20px; line-height: 1; padding: 0 4px; }
@keyframes bandeau-entree { from { transform: translate(-50%, -14px); } to { transform: translate(-50%, 0); } }
@media (max-width: 760px) { .bandeau-erreur { top: 8px; width: calc(100% - 16px); font-size: 13px; } }

/* --- Nouveautés (notes de mise à jour, 30/09/2026) ----------------------------------------------------------------- */
.nv-liste { display: grid; gap: 16px; }
.nv-note + .nv-note { border-top: 1px solid var(--n4); padding-top: 16px; }
.nv-date { font-size: 11.5px; color: var(--n11); text-transform: uppercase; letter-spacing: .05em; }
.nv-note h3 { margin: 4px 0 6px; font-size: 17px; color: var(--n12); }
.nv-texte { font-size: 14px; line-height: 1.6; color: var(--n12); }
.nv-texte p { margin: 0 0 8px; }
.nv-texte ul, .nv-texte ol { margin: 0 0 8px; padding-left: 22px; }
.nv-texte a { color: var(--a9); }
.nv-apercu { margin: 0 0 14px; padding: 8px 10px; border-radius: 8px; background: var(--a3); color: var(--a11);
             font-size: 12.5px; }
.nv-editeur textarea { width: 100%; font: inherit; resize: vertical; }
.nv-cartes { display: grid; gap: 10px; }

/* --- Paramètres dans le rail (06/10/2026, sur le modèle de Proton ou de Stripe) ------------------------------------
   En ouvrant Paramètres, le rail montre ses sections sous « Retour à la console » ; le groupe Administration suit pour
   l'admin. Sur téléphone, le rail reste la barre du bas et les sections restent en haut de la page, en bande qui défile. */
#railParametres[hidden] { display: none; }
.rail-parametres .domaine { padding: 12px 10px 8px; }
.rail-groupe { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--rail-doux);
               font-weight: 600; padding: 18px 10px 6px; }
/* Le retour se voit au repos (bouton plein, couleur d'accent du rail) et réagit au survol (plus clair, flèche qui
   recule). Texte en couleur du rail sur l'accent : le contraste de la paire rail / rail-accent est garanti par theme.js. */
#rail nav button.rail-retour { background: var(--rail-accent); color: var(--rail); font-weight: 600; margin-bottom: 8px; }
#rail nav button.rail-retour:hover, #rail nav button.rail-retour:focus-visible { background: var(--rail-accent);
  color: var(--rail); filter: brightness(1.1); }
#rail nav button.rail-retour:focus-visible { outline: 2px solid var(--rail-texte); outline-offset: 2px; }
#rail nav button.rail-retour .ico { stroke-width: 2; transition: transform .15s ease; }
#rail nav button.rail-retour:hover .ico { transform: translateX(-3px); }
@media (prefers-reduced-motion: reduce) { #rail nav button.rail-retour .ico { transition: none; } }
/* Libellés longs (« Compte et abonnement ») : sur deux lignes plutôt que coupés. */
#rail .rail-parametres button .lib { white-space: normal; line-height: 1.25; }
@keyframes rail-fondu { from { opacity: 0; } to { opacity: 1; } }
#rail.mode-parametres #railParametres { animation: rail-fondu .16s ease-out; }
@media (prefers-reduced-motion: reduce) { #rail.mode-parametres #railParametres { animation: none; } }
@media (min-width: 761px) {
  #rail.mode-parametres #rubriques, #rail.mode-parametres #railOffres, #rail.mode-parametres #rubriquesTech,
  #rail.mode-parametres > .domaine { display: none; }
  body.rail-parametres .parametres-onglets { display: none; }
}
@media (max-width: 760px) {
  #railParametres { display: none !important; }
  .parametres-onglets { display: flex; flex-wrap: nowrap; overflow-x: auto; max-width: 100%; }
  .parametres-onglets button { flex: none; }
}
.fil-sep { color: var(--muted); margin: 0 4px; }

/* Écran Apparence sans aperçu (06/10/2026) : les réglages sur une colonne de lecture. */
.app-reglages { max-width: 720px; }
/* Vue abonné : l'entrée du menu du compte, sur téléphone, suit les autres boutons du menu. */
#btnVueAbonne.hidden { display: none; }

/* --- Mode sombre (07/10/2026, variante 6 choisie par Lucas) -------------------------------------------------------
   Gris anthracite neutres, du plus foncé (le rail) au plus clair (ce qu'on lit) : rail < sol < papier < remplissage.
   Ces valeurs servent avant que theme.js ne pose la palette calculée (accent de la teinte choisie). Le texte posé sur
   l'accent devient foncé ; les couleurs écrites en dur ailleurs (étiquettes de type, statuts, surlignage) ont ici leur
   version sombre. */
:root[data-mode="sombre"] {
  --n1: #232528; --n2: #1b1c1f; --n3: #2c2e32; --n4: #36393e; --n5: #474b51; --n11: #a2a7ae; --n12: #e6e7ea;
  --a3: #352b21; --a6: #6a5237; --a9: #d6a468; --a11: #ecc792;
  --rail: #141518; --rail-texte: #d6d8dc; --rail-actif: #26282c; --rail-trait: #26282c; --rail-doux: #9a9ea6;
  --rail-accent: #d8a86c; --rail-vide: #34373c;
  --ok: #8cc06e; --warn: #e2a65e; --err: #ee8a7a; --sur-accent: #1b1c1f;
  --ombre-carte: 0 1px 2px rgba(0, 0, 0, .35);
  color-scheme: dark;
}
:root[data-mode="sombre"] body { background: var(--n2); }
:root[data-mode="sombre"] button.primary, :root[data-mode="sombre"] .segment button.actif,
:root[data-mode="sombre"] .parametres-onglets button.actif, :root[data-mode="sombre"] .abo-choix button.actif,
:root[data-mode="sombre"] .vl-domaines button.actif, :root[data-mode="sombre"] .tri button.actif,
:root[data-mode="sombre"] .cite:hover, :root[data-mode="sombre"] .abo-etiquette, :root[data-mode="sombre"] .initiales,
:root[data-mode="sombre"] button.danger { color: var(--sur-accent); }
:root[data-mode="sombre"] .type-source.article, :root[data-mode="sombre"] .type-source.reglement,
:root[data-mode="sombre"] .type-source.convention, :root[data-mode="sombre"] .abo-statut.ok { background: #26301f; color: #b5d29a; }
:root[data-mode="sombre"] .type-source.decision, :root[data-mode="sombre"] .type-source.commentaire,
:root[data-mode="sombre"] .type-source.fond, :root[data-mode="sombre"] .type-source.admin,
:root[data-mode="sombre"] .type-source.constit, :root[data-mode="sombre"] .type-source.cnil { background: #3a2d1f; color: #e8c08c; }
:root[data-mode="sombre"] .type-source.cabinet { background: #22303d; color: #a9c4e2; }
:root[data-mode="sombre"] .abo-statut.attention { background: #3d2e1d; color: #f0b97c; }
:root[data-mode="sombre"] .texte-source mark { background: #5c4a26; color: var(--n12); }
:root[data-mode="sombre"] .abo-test { background: #332c1a; border-color: #6b5a2e; color: #ecd58f; }
:root[data-mode="sombre"] .df-peu { color: #f0b97c; }
:root[data-mode="sombre"] button.danger-contour { border-color: #7d3b33; }
:root[data-mode="sombre"] .contour:hover, :root[data-mode="sombre"] .danger:hover { background: var(--n3); }
:root[data-mode="sombre"] .statut-cabinet.pret { color: #b5d29a; }
:root[data-mode="sombre"] .statut-cabinet.erreur { color: #ee8a7a; }
:root[data-mode="sombre"] .statut-cabinet.en_attente { color: #e8c08c; }
:root[data-mode="sombre"] .panneau-fond.ouvert { background: rgba(0, 0, 0, .55); }
/* Le choix du mode, en tête de l'écran Apparence. */
.app-modes { margin: 0 0 18px; }
.app-modes button { padding: 6px 16px; }

/* --- Paramètres : Sécurité, Nouveautés, Informations légales (07/10/2026, demande de Lucas) --------------------------
   Ce que proposait le menu du compte, réuni aussi dans Paramètres. Les textes légaux sont ceux des pages publiques,
   mis aux couleurs de la console, mode sombre compris. */
.menu-panneau .hidden { display: none; }              /* .menu-panneau button (gmao.css) l'emporterait sur .hidden */
/* Entrée active du menu de Paramètres : un gras dessiné par le contour du texte, qui ne l'élargit pas. En vrai gras,
   « Informations légales » passait sur deux lignes au clic et décalait les entrées du dessous. */
#rail .rail-parametres button.actif { font-weight: inherit; -webkit-text-stroke: .45px currentColor; }
.mdp-form .abo-champ-seul + .abo-champ-seul { margin-top: 10px; }
.mdp-form .abo-note { margin-top: 12px; }
.legal-tete { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; margin: 0 0 20px; }
/* Sur ordinateur, les quatre onglets restent en tête quand on descend dans un texte. */
@media (min-width: 761px) {
  .legal-tete { position: sticky; top: 0; z-index: 1; background: inherit; padding: 10px 0; margin: -10px 0 10px; }
}
.legal-onglets button:not(.actif):hover { background: var(--n3); }
.legal-seul { font-size: 13px; color: var(--a9); }
.legal-texte { font-size: 14.5px; line-height: 1.65; color: var(--n12); max-width: 780px; }
.legal-texte h1 { font-size: 20px; line-height: 1.3; margin: 0 0 4px; white-space: normal; }   /* style.css : nowrap */
.legal-texte .maj { color: var(--n11); font-size: 13px; margin: 0 0 18px; }
.legal-texte h2 { font-size: 16px; margin: 26px 0 8px; text-transform: none; letter-spacing: normal; color: var(--n12);
                  scroll-margin-top: 64px; }
.legal-texte p, .legal-texte li { margin: 0 0 10px; }
.legal-texte ul, .legal-texte ol { padding-left: 22px; margin: 0 0 10px; }
.legal-texte a { color: var(--a9); }
.legal-texte .encadre { background: var(--a3); border-left: 4px solid var(--a9); padding: 12px 16px; border-radius: 6px;
                        margin: 0 0 14px; }
.legal-texte table { width: 100%; border-collapse: collapse; margin: 6px 0 14px; font-size: 14px; }
.legal-texte th, .legal-texte td { text-align: left; vertical-align: top; padding: 8px 10px; border-bottom: 1px solid var(--n4); }
.legal-texte th { font-size: 12px; text-transform: uppercase; letter-spacing: .04em; color: var(--n11); }
@media (max-width: 760px) {
  .legal-onglets { display: flex; max-width: 100%; overflow-x: auto; }
  .legal-onglets button { flex: none; }
  .legal-texte { font-size: 14px; }
  .legal-texte table { font-size: 13px; }
}

/* --- Paramètres, refonte du 07/10/2026 (demande de Lucas, sur le modèle des SaaS de référence) ----------------------
   Une section = un titre, une phrase qui dit ce qu'on y trouve, puis des cartes titrées faites de lignes : libellé et
   explication à gauche, action à droite. Plus de grand panneau autour des cartes (une seule boîte, pas deux), largeur
   de lecture limitée. Les sections d'administration gardent leurs panneaux. */
section.prm-page { background: none; border: 0; border-radius: 0; padding: 0; box-shadow: none; max-width: 760px; }
.prm-page > h2 { font-size: 22px; font-weight: 650; line-height: 1.25; text-transform: none; letter-spacing: 0;
                 color: var(--n12); margin: 2px 0 4px; }
.prm-intro { font-size: 14px; line-height: 1.5; color: var(--n11); margin: 0 0 20px; }
.prm-carte { background: var(--n1); border: 1px solid var(--n4); border-radius: 12px; padding: 4px 18px;
             margin: 0 0 16px; box-shadow: var(--ombre-carte); }
.prm-carte-titre { font-size: 11.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .07em;
                   color: var(--n11); margin: 14px 0 0; }
.prm-ligne { display: flex; align-items: center; gap: 10px 20px; padding: 14px 0; border-top: 1px solid var(--n4); }
.prm-carte-titre + .prm-ligne, .prm-carte > .prm-ligne:first-child { border-top: 0; }
.prm-texte { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.prm-texte > b { font-size: 14.5px; font-weight: 600; color: var(--n12); display: flex; align-items: center; gap: 8px;
                 flex-wrap: wrap; }
.prm-texte > span { font-size: 13px; line-height: 1.5; color: var(--n11); }
.prm-texte > span b { color: var(--n12); }
.prm-action { flex: none; display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.prm-ligne-pile { flex-wrap: wrap; }
.prm-ligne-pile .prm-action { flex-basis: 100%; }
.prm-cle { flex: 0 0 130px; font-size: 13px; color: var(--n11); }
.prm-valeur { font-size: 14.5px; font-weight: 600; color: var(--n12); overflow-wrap: anywhere; }
.prm-danger { border-color: #e9c6bf; }
:root[data-mode="sombre"] .prm-danger { border-color: #5c302a; }
#prm-assistance-liste:empty { display: none; }
#prm-assistance-liste { padding: 0 0 14px; }
/* Abonnement : les blocs d'avant (formules, carte, factures), sans leur filet de séparation. */
.prm-page .prm-bloc { border-top: 0; margin-top: 0; padding-top: 0; }
.prm-page .prm-bloc + .prm-bloc { margin-top: 22px; }
.prm-page .prm-bloc > h3, .prm-page .parr-titre { font-size: 15px; font-weight: 600; text-transform: none;
  letter-spacing: 0; color: var(--n12); margin: 0 0 10px; }
.prm-page .parr-titre { margin-top: 22px !important; }      /* les intertitres d'avant avaient leur marge en ligne */
/* Apparence : les libellés au même style, la teinte nommée juste après son libellé. */
.prm-page .app-reglages { padding: 14px 18px 16px; max-width: none; }
.prm-page .app-libelle { justify-content: flex-start; gap: 8px; margin: 14px 0 8px; }
.prm-page .app-libelle:first-child { margin-top: 0; }
.prm-page .app-contrastes { border-top: 1px solid var(--n4); margin-top: 0; padding: 12px 18px; }
.prm-page .app-contrastes summary { cursor: pointer; font-size: 13px; font-weight: 600; color: var(--n12); }
.prm-page .app-contrastes summary small { font-weight: 400; color: var(--n11); margin-left: 6px; }
.prm-page .app-contrastes[open] summary { margin-bottom: 10px; }
/* Nouveautés et Informations légales dans une carte ; les onglets des textes restent lisibles en tête. */
.prm-page .nv-liste { padding: 16px 20px; }
.prm-page .legal-texte.prm-carte { padding: 22px 26px; }
.prm-page .legal-tete { background: var(--n2); }
/* Menu du nom : qui est connecté, puis les actions de session. */
.menu-entete { display: flex; flex-direction: column; gap: 1px; padding: 6px 10px 10px; margin: 0 0 4px;
               border-bottom: 1px solid var(--n4); }
.menu-entete small { font-size: 11.5px; color: var(--n11); }
.menu-entete b { font-size: 13px; font-weight: 600; color: var(--n12); overflow-wrap: anywhere; }
.menu-panneau a.menu-lien { display: block; padding: 8px 10px; font-size: 13px; color: var(--n12); text-decoration: none;
                            border-radius: 6px; }
.menu-panneau a.menu-lien:hover { background: var(--n3); }
#compte .menu-panneau hr { border: 0; border-top: 1px solid var(--n4); margin: 6px 4px; }
@media (max-width: 600px) {
  .prm-ligne { flex-wrap: wrap; }
  .prm-ligne .prm-action { flex-basis: 100%; }
  .prm-cle { flex-basis: 100px; }
  .prm-page .legal-texte.prm-carte { padding: 18px 16px; }
}

/* Factures sous la carte de l'abonnement (07/10/2026, demande de Lucas, sur le modèle de Claude) : une ligne par
   facture, date et période à gauche, montant, état et « Voir » à droite. */
.prm-page .prm-bloc > * + h3 { margin-top: 22px; }
.factures-carte .prm-ligne { padding: 12px 0; }
.facture-montant { font-size: 14px; font-weight: 600; color: var(--n12); font-variant-numeric: tabular-nums;
                   min-width: 92px; text-align: right; }
.facture-voir { padding: 4px 12px; font-size: 13px; }
.facture-voir:disabled { opacity: .55; cursor: not-allowed; }
@media (max-width: 600px) {
  .factures-carte .prm-action { justify-content: flex-start; }
  .facture-montant { min-width: 0; text-align: left; }
}

/* Écritures en attente de la clé du cabinet (07/10/2026) : la zone de dépôt ne répond plus. */
.depot-cabinet.inactif { opacity: .5; cursor: not-allowed; }

/* Avis et partage sous chaque réponse (07/10/2026, demande de Lucas, qualite.py). Le choix se voit par le fond et un
   liseré intérieur, jamais par la graisse ou la taille : rien ne bouge quand on clique. */
.avis-reponse { margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--line); display: grid; gap: 8px;
                font-size: 13px; }
.avis-ligne { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.avis-libelle { color: var(--n11); }
.avis-choix { display: inline-flex; border: 1px solid var(--bordure); border-radius: 8px; overflow: hidden; }
.avis-choix button { border: 0; border-radius: 0; background: var(--bg); color: var(--text); padding: 4px 12px;
                     font-size: 13px; cursor: pointer; }
.avis-choix button + button { border-left: 1px solid var(--bordure); }
.avis-choix button:hover { background: var(--n3); }
.avis-choix button.actif { background: var(--a3); color: var(--a11); box-shadow: inset 0 -2px 0 var(--a9); }
.avis-raisons { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.avis-raisons[hidden] { display: none; }
.avis-raison { border: 1px solid var(--line); border-radius: 99px; background: var(--bg); color: var(--text);
               padding: 3px 10px; font-size: 12.5px; cursor: pointer; }
.avis-raison:hover { background: var(--n3); }
.avis-raison.actif { background: var(--a3); border-color: var(--a6); color: var(--a11); }
.avis-pied { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.avis-message:empty { display: none; }
.avis-partager { font-size: 13px; }
.avis-partager.avis-invite { text-decoration: underline; text-underline-offset: 3px; }
.panneau .avis-reponse { margin-top: 18px; }

/* Fenêtre de partage : la question à corriger, ce qui ressemble à un nom ou un numéro, ce qui part avec. */
.partage { display: grid; gap: 10px; font-size: 13.5px; max-width: 620px; }
.partage p { margin: 0; }
.partage-champ { font-weight: 600; font-size: 13px; }
.partage textarea { width: 100%; box-sizing: border-box; resize: vertical; min-height: 110px; font: inherit; }
.partage-verifier { font-size: 12.5px; line-height: 1.9; }
.partage-verifier mark, .qlt-partage-question mark { background: color-mix(in srgb, var(--warn) 24%, transparent);
  color: inherit; border-radius: 3px; padding: 0 3px; }
.partage-envoi { font-size: 12.5px; }
/* Sur téléphone, la fenêtre défile : « Envoyer » reste visible en bas. */
.partage-actions { position: sticky; bottom: 0; background: var(--bg); padding: 8px 0 2px; margin: 0; }

/* Rubrique Qualité de l'administration (modules/qualite.js). */
.qlt-reglages { margin-bottom: 12px; gap: 14px; align-items: center; }
.qlt-case { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--n11);
            white-space: nowrap; cursor: pointer; }
.qlt-case input { width: auto; margin: 0; flex: none; }
.qlt-repartition { font-size: 13px; margin: -4px 0 0; }
.qlt-partage { border: 1px solid var(--line); border-radius: 10px; background: var(--bg); padding: 12px 14px;
               margin-bottom: 10px; display: grid; gap: 8px; }
.qlt-partage-tete { font-size: 12.5px; }
.qlt-partage-question { margin: 0; font-size: 14px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }
.qlt-partage-textes { font-size: 12.5px; color: var(--n11); }
.qlt-partage-textes ul { margin: 6px 0 0; padding-left: 18px; }
.qlt-partage-actions { gap: 8px; align-items: center; }

/* --- Durée de conservation (Paramètres › Compte, 07/10/2026) ---------------------------------------------------------- */
.prm-statut { font-size: 12.5px; color: var(--a11); }
.prm-statut:empty { display: none; }

/* --- Visite guidée (modules/tutoriel.js, 07/10/2026) ------------------------------------------------------------------
   L'élément éclairé reste à sa place : un cadre transparent posé dessus, dont l'ombre immense assombrit le reste. La page
   ne réagit pas pendant la visite (la couche du dessus prend les clics). Au-dessus des fenêtres (60) et du bandeau. */
.visite { position: fixed; inset: 0; z-index: 80; }
.visite-voile { position: fixed; inset: 0; background: rgba(20, 14, 9, .55); }
.visite-halo { position: fixed; border-radius: 10px; pointer-events: none;
  box-shadow: 0 0 0 2px var(--a9), 0 0 0 200vmax rgba(20, 14, 9, .55);
  transition: left .2s ease, top .2s ease, width .2s ease, height .2s ease; }
.visite-carte { position: fixed; width: min(380px, calc(100vw - 24px)); max-height: calc(100vh - 24px); overflow: auto;
  background: var(--n1); color: var(--n12); border: 1px solid var(--n4); border-radius: 14px; padding: 16px 18px 14px;
  box-shadow: 0 18px 50px rgba(0, 0, 0, .28); }
.visite[data-place="centre"] .visite-carte { left: 50%; top: 50%; transform: translate(-50%, -50%); }
.visite-etiquette { font-size: 11.5px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; color: var(--a11); }
.visite-etiquette span { color: var(--n11); font-weight: 500; letter-spacing: .02em; text-transform: none; }
/* Le titre de la carte, en phrase : la règle « section h2 » de la console (petites capitales) ne s'applique pas ici. */
.visite-carte h2 { font-size: 17px; font-weight: 650; line-height: 1.3; margin: 0 0 8px; text-wrap: balance;
  text-transform: none; letter-spacing: normal; color: var(--n12); }
.visite-etiquette + h2 { margin-top: 6px; }
.visite-texte p { font-size: 14px; line-height: 1.55; margin: 0 0 8px; }
.visite-texte .visite-note { font-size: 12.5px; color: var(--n11); }
.visite-texte .visite-alerte { font-size: 13px; background: var(--a3); color: var(--a11); border-radius: 8px; padding: 8px 10px; }
.visite-illus { border: 1px solid var(--n4); border-radius: 10px; background: var(--n2); padding: 10px 12px; margin: 2px 0 10px;
  font-size: 13px; }
.vi-reponse { margin: 0 0 8px; line-height: 1.5; }
.vi-renvoi { display: inline-block; font-size: 11.5px; font-weight: 600; color: var(--a11); background: var(--a3);
  border-radius: 5px; padding: 0 4px; }
.vi-source { display: flex; gap: 6px; align-items: baseline; flex-wrap: wrap; background: var(--n1); border: 1px solid var(--n4);
  border-radius: 8px; padding: 6px 8px; }
.vi-type { font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; color: var(--n11); }
.vi-libelle { display: block; font-size: 12.5px; color: var(--n11); margin-bottom: 6px; }
.vi-avis { display: inline-flex; border: 1px solid var(--bordure); border-radius: 8px; overflow: hidden; background: var(--n1); }
.vi-avis span { padding: 4px 12px; }
.vi-avis span + span { border-left: 1px solid var(--bordure); }
.visite-couleurs { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; margin: 2px 0 8px; }
.visite-couleurs .app-prereglages { margin-bottom: 0; }
.visite-etat { font-size: 12.5px; color: var(--n11); min-height: 1.2em; }
.visite-progres { display: flex; gap: 5px; margin: 8px 0 12px; }
.visite-progres i { width: 6px; height: 6px; border-radius: 3px; background: var(--n4); }
.visite-progres i.fait { background: var(--a6); }
.visite-progres i.actuel { width: 18px; background: var(--a9); }
.visite-actions { display: flex; align-items: center; gap: 8px; }
.visite-actions .visite-quitter { font-size: 13px; color: var(--n11); white-space: nowrap; }
.visite-actions .visite-quitter:hover { color: var(--n12); text-decoration: underline; }
.visite-actions button:not(.lien) { white-space: nowrap; }
@media (max-width: 760px) {
  .visite-carte { padding: 14px 14px 12px; }
  .visite-carte h2 { font-size: 16px; }
}
@media (prefers-reduced-motion: reduce) { .visite-halo { transition: none; } }

/* --- Aide et suggestions (modules/aide.js, 07/10/2026) ----------------------------------------------------------------
   Le point d'interrogation : en bas à droite sur ordinateur, sous les fenêtres (60) et la visite (80). Sur téléphone,
   dans la barre du haut, à gauche de l'avatar : en bas, il couvrirait le bouton d'envoi de la question. */
.aide-flottante { position: fixed; right: 18px; bottom: calc(18px + env(safe-area-inset-bottom, 0px)); z-index: 40;
  width: 38px; height: 38px; padding: 0; border-radius: 50%; font-size: 17px; font-weight: 700; line-height: 1;
  color: var(--a9); background: var(--n1); border: 1px solid var(--n5); box-shadow: 0 2px 10px rgba(0, 0, 0, .14); }
.aide-flottante:hover, .aide-barre:hover { background: var(--a3); border-color: var(--a9); }
.aide-flottante:focus-visible, .aide-barre:focus-visible { outline: 2px solid var(--a9); outline-offset: 2px; }
.aide-barre { display: none; }
@media (max-width: 760px) {
  .aide-flottante { display: none; }
  .aide-barre { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 32px; height: 32px;
    padding: 0; border-radius: 50%; font-size: 15px; font-weight: 700; color: var(--a9); background: var(--n1);
    border: 1px solid var(--n5); }
}
/* La place du bouton : le bas des colonnes et la fin de la mention sous la question défilent au-dessus de lui. */
@media (min-width: 761px) {
  .avec-aide .colonne-pleine, .avec-aide .colonne-dossier { padding-bottom: 72px; }
  .avec-aide .rch-mentions { padding-right: 48px; }
}
.aide { display: grid; gap: 18px; }
.aide-visite { display: flex; gap: 12px; align-items: center; justify-content: space-between; flex-wrap: wrap;
  padding: 12px 14px; border: 1px solid var(--n4); border-radius: 10px; background: var(--n2); }
.aide-visite > div { display: grid; gap: 2px; min-width: 0; }
.aide-visite span { font-size: 12.5px; }
.aide-titre { font-weight: 600; font-size: 14px; }
.aide-types { justify-self: start; flex-wrap: wrap; }
.aide-form input[type="email"] { width: 100%; box-sizing: border-box; }
.aide-pied { font-size: 12.5px; margin: 0; }
.menu-panneau .badge-rail { position: static; transform: none; margin-left: 6px; vertical-align: 1px; }
.rtr-type { font-weight: 600; color: var(--a11); }

/* Textes seuls (08/10/2026) : les textes retenus en entier dans la colonne centrale, la synthèse sur demande. Mêmes
   couleurs et mêmes bordures que le dossier ; rien ne change de taille au survol. */
.synthese-offre { display: flex; align-items: center; justify-content: space-between; gap: 10px 16px; flex-wrap: wrap;
  margin: 2px 0 6px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 10px; background: var(--n2);
  font-size: 13.5px; line-height: 1.5; }
.synthese-offre p { margin: 0; flex: 1 1 320px; min-width: 0; }
.synthese-offre .row { margin: 0; flex-wrap: wrap; }
.textes-retenus { margin-top: 4px; }
.groupe-textes h3 { display: flex; align-items: center; gap: 8px; margin: 20px 0 2px; font-size: 12px; font-weight: 600;
  letter-spacing: .06em; text-transform: uppercase; color: var(--n11); }
.texte-retenu { padding: 14px 0 12px; border-top: 1px solid var(--line); scroll-margin-top: 12px; }
.groupe-textes h3 + .texte-retenu { border-top: none; }
.texte-retenu .source-titre { margin: 4px 0 2px; font-size: 15px; font-weight: 600; line-height: 1.4; }
/* Déplié, le texte s'affiche en entier, sans la hauteur maximale ni le défilement intérieur des volets (08/10/2026,
   demande de Lucas : un long article restait enfermé dans une petite boîte). */
.texte-retenu .texte-integral { margin-top: 8px; font-size: 14px; max-height: none; overflow: visible; }
.texte-retenu .texte-integral.replie { max-height: calc(1.6em * 8); overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, #000 72%, transparent); mask-image: linear-gradient(to bottom, #000 72%, transparent); }
.texte-retenu.vise { outline: 2px solid var(--accent); outline-offset: 6px; border-radius: 6px; }
.titre-textes { margin: 26px 0 0; font-size: 17px; }
.carte-synthese { margin-bottom: 4px; }

/* Fenêtre de lecture d'un texte (article, décision, document de la Cour, écriture) : au centre, 75 % de la largeur
   et de la hauteur de l'écran (08/10/2026, demande de Lucas : le volet latéral était trop étroit pour un article).
   Plein écran sur téléphone. Les lignes de texte restent sous 130 caractères sur les très grands écrans. */
.panneau-fond[data-position="lecture"] { align-items: center; justify-content: center; }
[data-position="lecture"] .panneau { width: 75vw; height: 75vh; max-width: 100%; border-radius: 14px;
  transform: translateY(10px) scale(.99); opacity: 0; }
.ouvert[data-position="lecture"] .panneau { transform: none; opacity: 1; }
[data-position="lecture"] .panneau-corps { flex: 1 1 auto; min-height: 0; padding: 22px 28px; }
[data-position="lecture"] .texte-source { max-width: 130ch; max-height: none; overflow: visible; }  /* un seul défilement : la fenêtre */
@media (max-width: 760px) {
  [data-position="lecture"] .panneau { width: 100vw; height: 100dvh; border-radius: 0; }
  [data-position="lecture"] .panneau-corps { padding: 16px; }
}

/* --- Zone de saisie de la Recherche (08/10/2026, version choisie par Lucas parmi les maquettes) ---------------------
   Une carte : la question, puis une barre avec la pastille « Textes seuls / Synthèse » et un sélecteur par réglage
   (portée, ancienneté des décisions, date du droit, convention), l'envoi à droite ; la mention en une ligne dessous.
   La zone reste en bas de la colonne pendant qu'on lit, sur un fondu du sol. Tons de la console seulement. Classes en
   « compo- » : .bulle et .bulle-aide existent déjà (infobulles, bouton d'aide). Les règles de .saisie (gmao.css) visent
   tous ses boutons : remises à zéro ici. */
.zone-saisie { position: sticky; bottom: -20px; z-index: 6; margin-top: 16px; padding: 18px 0 20px;
               background: linear-gradient(to bottom, transparent, var(--fond) 18px); }
.saisie.compositeur { position: relative; display: block; padding: 10px 10px 8px 16px; border-radius: 16px;
                      background: var(--n1); }
.compositeur textarea { display: block; width: 100%; min-height: 28px; max-height: 200px; padding: 6px 0 10px;
                        font-size: 15px; line-height: 1.5; }
/* La question n'a pas de cadre à elle : c'est la carte qui s'allume quand on écrit (.saisie:focus-within). */
.compositeur textarea, .compositeur textarea:focus { border: 0; outline: 0; box-shadow: none; background: transparent; }
.compositeur button { width: auto; height: auto; border-radius: 8px; display: inline-flex; align-items: center;
                      justify-content: center; }
.compositeur [hidden] { display: none !important; }
.compositeur button:focus-visible, .compositeur input:focus-visible { outline: 2px solid var(--a9); outline-offset: 2px; }
.compositeur svg { fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
.compo-barre { display: flex; align-items: flex-end; gap: 8px; }
.compo-gauche { display: flex; align-items: center; gap: 6px; flex: 1 1 auto; min-width: 0; flex-wrap: wrap; }
.compositeur .compo-envoyer { flex: none; width: 36px; height: 36px; padding: 0; border-radius: 50%; color: #fff; }
.compo-envoyer svg { width: 17px; height: 17px; stroke-width: 2; }

/* La forme de la réponse : une pastille à deux choix, toujours visible */
.compo-mode { display: inline-flex; padding: 2px; border-radius: 999px; background: var(--n3); }
.compositeur .compo-mode button { gap: 6px; height: 30px; padding: 0 12px; border: 0; border-radius: 999px;
                                  background: none; color: var(--n11); font-size: 13px; }
.compo-mode button svg { width: 15px; height: 15px; }
.compositeur .compo-mode button.actif { background: var(--n1); color: var(--n12); box-shadow: 0 1px 2px rgba(0, 0, 0, .14); }
.compo-mode button:hover:not(.actif) { color: var(--n12); }

/* Les réglages : chaque sélecteur montre sa valeur ; une valeur changée prend la teinte de la console */
.compo-selecteurs { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
.compositeur .compo-selecteur { gap: 6px; height: 32px; padding: 0 8px 0 10px; border: 1px solid var(--n4); background: none;
                                color: var(--n11); font-size: 12.5px; white-space: nowrap; }
.compositeur .compo-selecteur:hover, .compositeur .compo-selecteur[aria-expanded="true"] { background: var(--n3); color: var(--n12); }
.compositeur .compo-selecteur.modifie { background: var(--a3); border-color: var(--a6); color: var(--a11); }
.compo-valeur { display: inline-flex; align-items: center; gap: 6px; }
.compo-selecteur .compo-chevron { width: 10px; height: 10px; }

/* Les menus des sélecteurs : au-dessus de la carte, alignés sur leur bouton (pleine largeur sur téléphone) */
.compo-bulle { position: absolute; bottom: calc(100% + 8px); left: 8px; z-index: 20; min-width: 260px;
               max-width: min(600px, calc(100% - 16px)); padding: 14px; border: 1px solid var(--n4); border-radius: 12px;
               background: var(--n1); color: var(--n12); box-shadow: 0 12px 32px rgba(0, 0, 0, .14), 0 2px 6px rgba(0, 0, 0, .08); }
.compo-bulle[hidden] { display: none; }
.compo-menu { padding: 6px; min-width: 240px; }
.compo-choix { display: flex; flex-direction: column; gap: 2px; }
.compositeur .compo-choix button { justify-content: flex-start; gap: 10px; width: 100%; padding: 8px 10px; border: 0;
                                   background: none; color: var(--n12); font-size: 13.5px; text-align: left; }
.compositeur .compo-choix button:hover { background: var(--n3); }
.compo-choix .compo-coche { flex: none; width: 16px; height: 16px; margin-left: auto; visibility: hidden; color: var(--a9);
                            stroke-width: 2; }
.compo-choix button.actif .compo-coche { visibility: visible; }
.compo-libelle { display: block; margin-bottom: 8px; font-size: 12.5px; color: var(--n11); }
.compo-champ { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.compo-champ input { width: auto; font-size: 13px; padding: 5px 8px; }
.compo-champ #rch-idcc { width: 200px; }
.compo-aide { margin: 12px 0 0; font-size: 12px; line-height: 1.45; color: var(--n11); max-width: 46ch; }

/* La mention, en une ligne centrée sous la carte */
.zone-saisie .rch-mentions { margin: 8px 0 0; text-align: center; font-size: 12px; color: var(--n11); }
.zone-saisie .rch-mentions a { color: var(--a9); }

:root[data-mode="sombre"] .compositeur .compo-envoyer { color: var(--sur-accent); }
:root[data-mode="sombre"] .compo-bulle { box-shadow: 0 12px 32px rgba(0, 0, 0, .5), 0 2px 6px rgba(0, 0, 0, .3); }
:root[data-mode="sombre"] .compositeur .compo-mode button.actif { background: var(--n4); }

@media (max-width: 760px) {
  .colonne-centre { overflow: visible; }            /* la zone suit alors la page et reste au-dessus de la barre du bas */
  .zone-saisie { bottom: calc(64px + env(safe-area-inset-bottom)); margin-top: 12px; padding: 12px 0 8px; }
  .compo-bulle { left: 0 !important; right: 0; min-width: 0; max-width: none; }
  /* Les sélecteurs passent sous la pastille, en une rangée qui défile, avec un fondu à droite */
  .compo-selecteurs { flex: 1 1 100%; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
                      -webkit-mask-image: linear-gradient(to right, #000 82%, transparent);
                      mask-image: linear-gradient(to right, #000 82%, transparent); }
  .compo-selecteurs::-webkit-scrollbar { display: none; }
}

/* Contrôle des références d'une synthèse (09/10/2026, modules/controle.js) : sous le texte, une ligne discrète quand
   tout est au dossier, un encadré quand la base signale une référence citée hors du dossier. */
.controle-refs { margin-top: 14px; padding: 9px 12px; border: 1px solid var(--line); border-radius: 8px;
                 font-size: 13px; line-height: 1.5; }
.controle-refs.ok { color: var(--muted); border-style: dashed; }
.controle-refs.alerte { border-color: var(--warn); border-left: 4px solid var(--warn); }
.controle-refs .controle-titre { font-weight: 600; color: var(--warn); }
.controle-refs p { margin: 2px 0 0; font-size: 12.5px; }
.controle-refs ul { margin: 6px 0 0; padding-left: 18px; }
.controle-refs li { margin: 4px 0; }
.controle-refs li .ref { font-weight: 600; }
.controle-refs li .message { color: var(--muted); }
.controle-refs li.niveau-erreur .ref { color: var(--err); }
.controle-refs li.niveau-attention .ref { color: var(--warn); }
.controle-refs details summary { cursor: pointer; color: var(--muted); }
.controle-refs details summary:hover { color: var(--accent); }
.controle-refs.alerte details { margin-top: 6px; }

/* Vérifier un document (modules/document.js et lecteurs.js, 16/10/2026) : le trombone de la zone de saisie et sa bulle
   (case « Déposer vos fichiers », formats lus), la fenêtre qui s'ouvre quand on glisse un fichier sur la Recherche, et
   le rapport, aux couleurs des alertes de la console (--err, --warn, --ok), en clair comme en sombre. */
.compositeur .compo-joindre { flex: none; width: 32px; height: 32px; padding: 0; display: grid; place-items: center;
  border: 1px solid var(--n4); border-radius: 50%; background: none; color: var(--muted); cursor: pointer; }
.compositeur .compo-joindre:hover, .compositeur .compo-joindre:focus-visible,
.compositeur .compo-joindre[aria-expanded="true"] { background: var(--n3); color: var(--n12); }
.compo-joindre svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; }
/* La bulle tient dans les écrans courts (portable, Safari sur téléphone) : au-delà, elle défile en elle-même. Sa hauteur
   exacte se calcule à l'ouverture (document.js), ces valeurs servent de secours. */
.verif-bulle { width: 400px; max-height: calc(100vh - 230px); overflow-y: auto; overscroll-behavior: contain; }
/* La case se voit cliquable au repos (bord en pointillés, flèche à la teinte de la console) et au survol (fond teinté) */
.compositeur .verif-case { display: flex; flex-direction: column; gap: 8px; width: 100%; min-height: 104px; padding: 18px;
  border: 2px dashed var(--bordure); border-radius: 10px; background: none; color: var(--n12); font-size: 14px;
  font-weight: 600; cursor: pointer; transition: background-color .15s, border-color .15s; }
.compositeur .verif-case svg { width: 26px; height: 26px; color: var(--a9); stroke-width: 1.6; }
.compositeur .verif-case:hover, .compositeur .verif-case.survol { background: var(--a3); border-color: var(--a9); }
.verif-bulle .verif-confidentialite { margin: 10px 0 0; max-width: none; }
.carte-verif > p.err { margin: 0; line-height: 1.5; }
.carte-verif > p.err + p.err { margin-top: 6px; }
.verif-formats-titre { margin: 14px 0 6px; font-size: 11.5px; font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--n11); }
.verif-formats { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 6px 12px; margin: 0;
  align-items: baseline; text-align: left; }
.verif-formats dt { font-size: 12.5px; color: var(--n11); }
.verif-formats dd { display: flex; flex-wrap: wrap; gap: 4px; margin: 0; }
.verif-ext { padding: 0 6px; border-radius: 5px; background: var(--n3); color: var(--n12);
  font: 12px/1.6 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
.verif-formats-note { margin: 8px 0 0; font-size: 12px; line-height: 1.45; color: var(--n11); text-align: left; }
.verif-marques { margin: 6px 0 0; font-size: 11px; line-height: 1.4; color: var(--n11); text-align: left; }
.verif-voile { position: fixed; inset: 0; z-index: 60; display: grid; place-items: center; padding: 16px;
  pointer-events: none; background: color-mix(in srgb, var(--fond) 78%, transparent); }
.verif-voile[hidden] { display: none; }
.verif-fenetre { display: grid; justify-items: center; gap: 6px; width: min(440px, 100%); padding: 26px 26px 22px;
  border: 2px dashed var(--a9); border-radius: 16px; background: var(--n1); color: var(--n12); text-align: center;
  box-shadow: 0 18px 48px rgba(0, 0, 0, .16), 0 2px 8px rgba(0, 0, 0, .08); }
.verif-fenetre > svg { width: 30px; height: 30px; fill: none; stroke: var(--a9); stroke-width: 1.6; stroke-linecap: round;
  stroke-linejoin: round; }
.verif-fenetre b { font-size: 17px; }
.verif-fenetre-texte { font-size: 13.5px; color: var(--n11); }
.verif-fenetre .verif-formats-titre, .verif-fenetre .verif-formats, .verif-fenetre .verif-formats-note,
.verif-fenetre .verif-marques { justify-self: stretch; }
:root[data-mode="sombre"] .verif-fenetre { box-shadow: 0 18px 48px rgba(0, 0, 0, .5), 0 2px 8px rgba(0, 0, 0, .3); }
.accueil-document svg { width: 14px; height: 14px; vertical-align: -2px; fill: none; stroke: currentColor; stroke-width: 1.6;
  stroke-linecap: round; }
.carte-verif + .carte-verif { margin-top: 14px; }
/* Le nom du fichier garde sa casse, et les groupes ne prennent pas le fond des sections (règles « h2 » et « section »
   de style.css) : une carte de référence ne se pose pas dans un panneau, lui-même dans la carte. */
.carte-verif .verif-fichier { margin: 0 0 8px; font-size: 15px; font-weight: 650; text-transform: none;
  letter-spacing: normal; color: var(--text); overflow-wrap: anywhere; }
section.verif-groupe { background: none; border: 0; border-radius: 0; padding: 0; }
.verif-detail { margin-top: 8px; font-size: 12px; color: var(--muted); }
.verif-detail code { display: block; margin-top: 4px; overflow-wrap: anywhere; }
@media (max-width: 760px) {
  .verif-bulle { width: auto; max-height: calc(100vh - 300px); max-height: calc(100dvh - 300px); }
  .compositeur .verif-case { min-height: 76px; padding: 12px; }
}
.carte-verif .verif-resume { margin: 0; font-weight: 600; }
.verif-bilan { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0 2px; }
.verif-jeton { font-size: 12.5px; padding: 2px 10px; border-radius: 999px; border: 1px solid var(--line); }
.verif-jeton.erreur { color: var(--err); border-color: color-mix(in srgb, var(--err) 45%, transparent);
  background: color-mix(in srgb, var(--err) 9%, transparent); }
.verif-jeton.attention { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 45%, transparent);
  background: color-mix(in srgb, var(--warn) 9%, transparent); }
.verif-jeton.ok { color: var(--ok); border-color: color-mix(in srgb, var(--ok) 45%, transparent);
  background: color-mix(in srgb, var(--ok) 9%, transparent); }
.verif-jeton.info { color: var(--muted); }
.verif-groupe { margin-top: 16px; }
.verif-groupe h2, .verif-groupe summary { margin: 0 0 6px; font-size: 12.5px; font-weight: 600; letter-spacing: .05em;
  text-transform: uppercase; color: var(--muted); }
.verif-groupe summary { cursor: pointer; }
.verif-groupe summary:hover { color: var(--accent); }
.verif-ref { margin: 8px 0; padding: 9px 12px; border: 1px solid var(--line); border-left: 4px solid var(--line); border-radius: 8px; }
.verif-ref.erreur { border-left-color: var(--err); }
.verif-ref.attention { border-left-color: var(--warn); }
.verif-ref.ok { border-left-color: var(--ok); }
.verif-ref h3 { margin: 0; font-size: 14px; }
.verif-ref.erreur h3 { color: var(--err); }
.verif-ref.attention h3 { color: var(--warn); }
.verif-ref p { margin: 3px 0 0; font-size: 13px; }
.verif-extrait { margin: 7px 0 0; padding: 4px 0 4px 10px; border-left: 2px solid var(--line); color: var(--muted);
  font-size: 12.5px; overflow-wrap: anywhere; }
.verif-extrait mark { background: color-mix(in srgb, var(--warn) 22%, transparent); color: var(--text); border-radius: 3px; padding: 0 2px; }
.verif-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-top: 6px; font-size: 12.5px; }
.verif-note { margin: 18px 0 0; font-size: 12.5px; }
