/* =========================================================
   MITARYS AI — interface

   Design de Sidick, porté depuis MITARYS-AI/templates/index.html.
   Ses noms de variables et sa structure sont conservés tels quels :
   c'est son travail, et le retrouver à l'identique facilite les
   allers-retours entre les deux dépôts.

   Ce qui a été retiré, faute de fonctionnalité derrière :
     - les cartes d'historique de conversation
     - le sélecteur de modèle
     - les bascules d'extensions
   Un bouton qui ne fait rien est pire que pas de bouton.

   Ce qui a été ajouté, parce que le site les a déjà :
     - les cartes de suggestion de l'écran vide
     - le compteur de quota
     - l'écran de connexion

   L'ancienne feuille est conservée en mitarysai.css.avant-refonte.
   ========================================================= */

:root{
  /* Palette reprise telle quelle de Sidick (MITARYS-AI/static/style/style.css).
     Monochrome assumé : noir pur, accents blancs, dégradé blanc vers gris.
     C'est une identité distincte du reste du site, qui est crème et orange —
     et c'est voulu : cette page n'étend pas base.html non plus. */
  --noir:#000000;
  --fond:#000000;
  --carte:#0E0E0E;
  --carte-haut:#171717;
  --filet:#222222;
  --filet-clair:#333333;

  /* Ces accents s'appelaient --violet tant que la page l'était. Un nom
     qui ment sur sa valeur coûte plus cher qu'un renommage. */
  --accent:#FFFFFF;
  --accent-sourd:#BBBBBB;
  --degrade:linear-gradient(165deg,#FFFFFF 0%,#C9C9C9 55%,#8A8A8A 100%);

  --texte:#FFFFFF;
  --texte-2:#A0A0A0;
  --texte-3:#5E5E5E;

  --titre:"Inter Tight",system-ui,sans-serif;
  --corps:"Inter",system-ui,sans-serif;
  --mono:"JetBrains Mono",ui-monospace,Menlo,monospace;

  --rail:296px;
}


*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%}

body{
  background:var(--fond);
  color:var(--texte);
  font-family:var(--corps);
  font-size:15px;
  line-height:1.6;
  letter-spacing:-.006em;
  -webkit-font-smoothing:antialiased;
  overflow:hidden;
}

button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
button:focus-visible,textarea:focus-visible,a:focus-visible{
  outline:2px solid var(--accent);outline-offset:2px;
}

.app{display:flex;height:100vh}

/* ================= LOGO ================= */
/* Le logo n'est pas carré (256×206) : une hauteur forcée à 100 % dans
   une boîte carrée l'écraserait. On contraint la largeur, la hauteur
   suit, et `place-items:center` recentre.

   Les deux sélecteurs — svg et img — parce que la page sert l'image et
   la pastille flottante le tracé vectoriel.

   La règle bat les .mai--* de ai_logo.css par spécificité (une classe
   plus un élément contre une classe seule). */
.logo-boite{display:grid;place-items:center;flex-shrink:0}
.logo-boite svg,.logo-boite img{width:100%;height:auto;display:block}

.logo-boite.tourne svg,.logo-boite.tourne img{
  animation:rotation 2.6s cubic-bezier(.62,.04,.36,1) infinite;
}
@keyframes rotation{
  0%   {transform:rotate(0deg)   scale(1)}
  50%  {transform:rotate(180deg) scale(.88)}
  100% {transform:rotate(360deg) scale(1)}
}

/* ================= RAIL ================= */
.rail{
  width:var(--rail);flex-shrink:0;
  background:var(--noir);
  border-right:1px solid var(--filet);
  display:flex;flex-direction:column;
  transition:margin-left .3s cubic-bezier(.4,0,.2,1);
}
.rail.replie{margin-left:calc(var(--rail) * -1)}

.rail-tete{padding:18px 18px 16px}
.bloc-logo{
  display:flex;align-items:center;gap:11px;
  text-decoration:none;color:inherit;
}
.bloc-logo .logo-boite{width:34px;height:34px}
.marque{
  font-family:var(--titre);
  font-size:17px;font-weight:600;
  letter-spacing:.15em;line-height:1;
}
.marque .lambda{font-weight:500}

.btn-neuf{
  margin:2px 14px 6px;padding:11px 14px;
  border:1px solid var(--filet);border-radius:11px;
  font-family:var(--titre);
  font-size:14px;font-weight:500;text-align:left;
  display:flex;align-items:center;gap:10px;
  transition:border-color .2s,background .2s;
}
.btn-neuf:hover{border-color:var(--filet-clair);background:var(--carte)}
.btn-neuf .plus{
  width:18px;height:18px;flex-shrink:0;
  border-radius:6px;background:var(--degrade);
  display:grid;place-items:center;
  color:var(--noir);font-size:14px;font-weight:700;line-height:1;
}

.rail-titre{
  font-family:var(--mono);
  font-size:9.5px;letter-spacing:.19em;text-transform:uppercase;
  color:var(--texte-3);
  padding:20px 20px 4px;
  display:flex;align-items:baseline;justify-content:space-between;gap:8px;
}

.historique{flex:1;overflow-y:auto;padding:6px 12px 16px;display:flex;flex-direction:column;gap:7px}
.historique::-webkit-scrollbar{width:5px}
.historique::-webkit-scrollbar-thumb{background:var(--filet);border-radius:3px}

.historique-vide{
  font-size:12px;color:var(--texte-3);
  padding:10px 13px;line-height:1.5;
}

/* ---- cartes d'historique ---- */
.carte-fil{
  position:relative;
  width:100%;text-align:left;
  padding:12px 13px 11px;
  border-radius:12px;
  background:var(--carte);
  border:1px solid var(--filet);
  overflow:hidden;
  transition:transform .22s cubic-bezier(.34,1.4,.64,1),
             border-color .22s, background .22s;
}
.carte-fil::before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:2px;
  background:var(--degrade);
  transform:scaleY(0);transform-origin:top;
  transition:transform .3s cubic-bezier(.4,0,.2,1);
}
.carte-fil:hover{
  transform:translateX(3px);
  border-color:var(--filet-clair);
  background:var(--carte-haut);
}
.carte-fil:hover::before{transform:scaleY(1)}
.carte-fil.actif{background:var(--carte-haut);border-color:var(--accent-sourd)}
.carte-fil.actif::before{transform:scaleY(1)}

.carte-titre{
  font-family:var(--titre);
  font-size:13.5px;font-weight:500;line-height:1.35;
  color:var(--texte);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;
  margin-bottom:7px;
}
.carte-meta{
  display:flex;align-items:center;gap:8px;
  font-family:var(--mono);font-size:9.5px;
  color:var(--texte-3);letter-spacing:.03em;
}
.carte-meta .sep{width:2px;height:2px;border-radius:50%;background:var(--texte-3)}
.carte-meta .jeter{
  margin-left:auto;
  font-family:var(--corps);font-size:15px;line-height:1;
  color:var(--texte-3);
  padding:0 2px;border-radius:4px;
  opacity:0;transition:opacity .18s,color .18s;
}
.carte-fil:hover .jeter{opacity:1}
.carte-meta .jeter:hover{color:#C88A8A}
.carte-modele{
  color:var(--accent);
  padding:1px 5px;border-radius:4px;
  background:rgb(255 255 255 / 10%);
  border:1px solid rgb(255 255 255 / 18%);
}

.rail-liens{padding:0 14px 10px;display:flex;flex-direction:column;gap:2px}
.rail-lien{
  display:flex;align-items:center;gap:9px;
  padding:9px 12px;border-radius:9px;
  font-size:13px;color:var(--texte-3);
  text-decoration:none;
  transition:color .18s,background .18s;
}
.rail-lien:hover{color:var(--texte-2);background:var(--carte)}
.rail-lien svg{width:14px;height:14px;flex-shrink:0}

.rail-pied{
  padding:13px 20px 16px;border-top:1px solid var(--filet);
  font-family:var(--mono);font-size:10px;letter-spacing:.04em;
  color:var(--texte-3);
  display:flex;align-items:center;gap:8px;
}
.pastille{
  width:6px;height:6px;border-radius:50%;background:var(--accent);
  box-shadow:0 0 0 3px rgb(255 255 255 / 13%);
}
.pastille.actif{animation:battement 1.5s ease-in-out infinite}
@keyframes battement{
  0%,100%{box-shadow:0 0 0 3px rgb(255 255 255 / 13%)}
  50%    {box-shadow:0 0 0 8px rgb(255 255 255 / 3%)}
}
.quota-chiffre{color:var(--accent)}

/* ================= PRINCIPAL ================= */
.principal{flex:1;display:flex;flex-direction:column;min-width:0}

.barre{
  height:56px;flex-shrink:0;
  display:flex;align-items:center;gap:14px;padding:0 22px;
  border-bottom:1px solid var(--filet);
}
.bascule{
  width:30px;height:30px;border-radius:8px;
  display:grid;place-items:center;color:var(--texte-2);
  transition:color .18s,background .18s;
}
.bascule:hover{color:var(--texte);background:var(--carte)}
.barre-titre{
  font-family:var(--titre);
  font-size:14px;font-weight:500;color:var(--texte-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}

.flux{flex:1;overflow-y:auto;scroll-behavior:smooth;display:flex;flex-direction:column}
.flux::-webkit-scrollbar{width:9px}
.flux::-webkit-scrollbar-thumb{background:var(--filet);border-radius:5px}
.piste{max-width:780px;width:100%;margin:0 auto;padding:36px 26px 30px}

/* ================= ECRAN VIDE ================= */
.vide{
  min-height:100%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:40px 26px;
  animation:monte .55s cubic-bezier(.4,0,.2,1) both;
}
.vide-marque{
  font-family:var(--titre);
  font-size:clamp(46px,8vw,86px);
  font-weight:600;
  letter-spacing:.055em;
  line-height:1;
  text-align:center;
  background:var(--degrade);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
}
.vide-marque .lambda{
  font-weight:500;
  letter-spacing:.02em;
}

/* Propositions d'accueil. Portées de Sidick (.vide-quali /
   .quali-btn-accueil), avec ses noms de classes mais nos variables de
   couleur.

   Chez lui ces boutons s'affichent SANS cadre : --surface, --border et
   --text ne sont définies nulle part dans sa feuille, donc les
   déclarations tombent. C'est un accident, mais c'est le rendu qu'on
   garde — écrit ici volontairement, pour qu'il survive au jour où
   quelqu'un « corrigera » ces variables. */
.vide-quali{
  display:flex;flex-direction:column;gap:9px;
  margin-top:34px;
  max-width:440px;width:100%;
}
.quali-btn-accueil{
  text-align:left;
  padding:12px 18px;
  font-family:inherit;font-size:13.5px;
  color:var(--texte);
  background:transparent;
  border:none;border-radius:12px;
  cursor:pointer;
  transition:background .18s,transform .18s;
}
.quali-btn-accueil:hover{
  background:var(--carte);
  transform:translateX(3px);
}
.quali-btn-accueil:focus-visible{
  outline:2px solid var(--accent);
  outline-offset:2px;
}
/* Pendant qu'une réponse arrive, les propositions ne doivent plus
   partir : deux questions en vol, et le fil devient illisible. */
.quali-btn-accueil:disabled{
  opacity:.4;cursor:not-allowed;transform:none;
}

/* ================= CHAINE D'AGENTS =================
   Portée de Sidick (.flow / .bloc / .requete / .source). Sa feuille
   utilise les mêmes noms de variables que celle-ci.

   Elle raconte l'attente et disparaît dès le premier mot de la réponse :
   ce n'est pas un journal à conserver, c'est ce qui se passe pendant
   qu'on patiente.
   ================================================== */
.flow{
  border:1px solid var(--filet);
  border-radius:16px;
  background:var(--carte);
  overflow:hidden;
}
.flow-tete{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:13px 17px;
  border-bottom:1px solid var(--filet);
  font-family:var(--mono);
  font-size:9.5px;letter-spacing:.19em;text-transform:uppercase;
  color:var(--texte-3);
}
.flow-tete .compteur{color:var(--texte);font-variant-numeric:tabular-nums}

.flow-corps{padding:15px 17px 6px;position:relative}

/* Le rail : un trait mat sur toute la hauteur, et par-dessus un trait
   clair dont la hauteur suit l'étape courante. */
.flow-corps::before{
  content:"";position:absolute;left:22px;top:24px;bottom:20px;
  width:1px;background:var(--filet);
}
.flow-corps::after{
  content:"";position:absolute;left:22px;top:24px;width:1px;
  height:var(--rail-h,0);
  background:linear-gradient(180deg,#FFFFFF,#B4B4B4,#6E6E6E);
  transition:height .6s cubic-bezier(.4,0,.2,1);
}

.bloc{
  display:flex;gap:14px;
  padding-bottom:16px;
  position:relative;
  opacity:.32;
  transition:opacity .4s ease;
}
.bloc.vu{opacity:1}

.bloc .puce{
  width:11px;height:11px;flex-shrink:0;margin-top:4px;
  border-radius:50%;
  background:var(--carte);
  border:1.5px solid var(--filet-clair);
  position:relative;z-index:1;
  transition:border-color .35s,background .35s,
             transform .4s cubic-bezier(.34,1.5,.64,1);
}
.bloc.encours .puce{
  border-color:var(--accent);background:var(--accent);
  transform:scale(1.3);
  box-shadow:0 0 0 5px rgb(255 255 255 / 11%);
}
.bloc.faite .puce{border-color:#767676;background:#767676}

.bloc-txt{flex:1;min-width:0}
.bloc-nom{
  font-family:var(--titre);
  font-size:13.5px;font-weight:500;
  display:flex;align-items:baseline;justify-content:space-between;gap:12px;
}
.bloc-nom .verdict{
  font-family:var(--mono);font-size:10px;
  color:var(--texte-3);
  text-align:right;
  opacity:0;transition:opacity .45s;
}
.bloc.vu .verdict{opacity:1}

/* Requêtes web lancées */
.requetes{margin-top:9px;display:flex;flex-direction:column;gap:6px}
.requete{
  display:flex;align-items:center;gap:9px;
  padding:7px 11px;
  background:var(--carte-haut);
  border:1px solid var(--filet);
  border-radius:9px;
  font-size:12px;color:var(--texte-2);
  animation:glisse .4s cubic-bezier(.4,0,.2,1) both;
}
.requete .loupe{color:var(--texte);flex-shrink:0;opacity:.75}
.requete .q{
  flex:1;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:var(--mono);font-size:11px;
}
.requete .n{
  font-family:var(--mono);font-size:10px;
  color:var(--texte);flex-shrink:0;
  padding:1px 6px;border-radius:4px;
  background:rgb(255 255 255 / 8%);
}

/* Domaines écartés. Barrés, en pointillés : montrer qu'on a refusé un
   concurrent vaut mieux que de ne rien dire — c'est ce que domaines.py
   fait de plus visible. */
.domaines{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px}
.domaine{
  font-family:var(--mono);font-size:10px;
  padding:3px 8px;border-radius:6px;
  background:transparent;
  border:1px dashed var(--filet-clair);
  color:var(--texte-3);
  animation:glisse .3s cubic-bezier(.4,0,.2,1) both;
}
.domaine s{text-decoration-color:var(--texte-3)}

/* Sources retenues */
.sources{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px}
.source{
  font-family:var(--mono);font-size:10px;
  padding:3px 8px;border-radius:6px;
  background:var(--carte-haut);
  border:1px solid var(--filet);
  color:var(--texte-2);
  animation:glisse .3s cubic-bezier(.4,0,.2,1) both;
}

/* Pied de la carte : le logo tourne tant que ça travaille. */
.flow-pied{
  display:flex;align-items:center;gap:11px;
  padding:13px 17px;
  border-top:1px solid var(--filet);
  background:var(--noir);
}
.flow-pied .logo-boite{width:26px;height:26px}
.flow-pied .mot{
  font-family:var(--mono);
  font-size:10px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--texte);
}

@keyframes glisse{
  from{opacity:0;transform:translateX(-7px)}
  to{opacity:1;transform:none}
}

/* ================= TABLEAUX =================
   Repris de Sidick (.tbl). Chez lui les filets ne s'affichent pas :
   --border, --surface2 et --text n'existent pas dans sa feuille. Ici on
   ne reproduit pas l'accident — un comparatif chiffré sans filets se
   lit à l'œil nu, ligne par ligne. On garde les valeurs que ses noms
   visaient.
   ============================================= */
.tbl{
  width:100%;border-collapse:collapse;
  margin:14px 0;font-size:13px;
  /* Un comparatif à cinq colonnes déborde sur téléphone. Le tableau
     défile plutôt que d'écraser la mise en page. */
  display:block;overflow-x:auto;
}
.tbl th,.tbl td{
  border:1px solid var(--filet);
  padding:8px 12px;text-align:left;
  white-space:nowrap;
}
.tbl th{
  background:var(--carte-haut);
  color:var(--texte);font-weight:600;font-size:12px;
}
.tbl td{color:var(--texte-2)}
.tbl tr:hover td{background:var(--carte)}

/* La première colonne porte le nom du produit : elle a le droit d'être
   longue et de revenir à la ligne, les colonnes de chiffres non. */
.tbl th:first-child,.tbl td:first-child{
  white-space:normal;min-width:150px;
}

/* ================= MESSAGES ================= */
.msg{margin-bottom:30px;animation:monte .36s cubic-bezier(.4,0,.2,1) both}

.msg-toi{display:flex;justify-content:flex-end}
.msg-toi .msg-corps{
  max-width:82%;
  background:var(--carte);
  border:1px solid var(--filet);
  padding:13px 17px;border-radius:16px 16px 4px 16px;
  font-size:15px;
}

.msg-ia .msg-etiq{margin-bottom:12px}
.msg-ia .msg-etiq .logo-boite{width:34px;height:34px}
.msg-ia .msg-corps{
  font-size:15.5px;line-height:1.75;color:var(--texte);
}
.msg-corps p{margin-bottom:14px}
.msg-corps p:last-child{margin-bottom:0}
.msg-corps ul{margin:0 0 14px;padding-left:19px}
.msg-corps li{margin-bottom:6px}
.msg-corps strong{color:var(--accent);font-weight:600}

/* Un lien vers une de nos annonces est le seul qui mène à un achat :
   c'est le seul qui a le droit d'attirer l'œil. */
.msg-corps a{
  color:var(--accent);text-decoration:none;
  border-bottom:1px solid rgb(255 255 255 / 32%);
  transition:border-color .18s;
}
.msg-corps a:hover{border-bottom-color:var(--accent)}
.msg-corps a.externe{
  color:var(--texte-2);
  border-bottom-color:var(--filet-clair);
  font-size:13.5px;word-break:break-all;
}
.msg-corps a.externe:hover{color:var(--texte);border-bottom-color:var(--filet-clair)}

/* attente */
.attente{display:flex;align-items:center;gap:11px;color:var(--accent)}
.attente .logo-boite{width:26px;height:26px}
.attente .mot{
  font-family:var(--mono);
  font-size:10px;letter-spacing:.16em;text-transform:uppercase;
}

.erreur{
  border:1px solid rgba(180,60,60,.25);
  background:rgba(180,60,60,.06);
  color:#C88A8A;
  padding:12px 15px;border-radius:12px;font-size:14px;
}

/* ================= COMPOSITEUR ================= */
.compo-zone{
  flex-shrink:0;padding:0 26px 22px;
  background:linear-gradient(to top,var(--fond) 66%,transparent);
}
.compo{
  max-width:780px;margin:0 auto;
  background:var(--carte);
  border:1px solid var(--filet);
  border-radius:18px;
  transition:border-color .2s,box-shadow .2s;
}
.compo:focus-within{
  border-color:var(--accent-sourd);
  box-shadow:0 0 0 3px rgba(124,58,237,.08);
}
.compo-haut{
  display:flex;align-items:flex-end;gap:10px;
  padding:13px 13px 8px 18px;
}
.compo textarea{
  flex:1;background:none;border:none;outline:none;resize:none;
  color:var(--texte);font-family:inherit;
  font-size:15.5px;line-height:1.55;
  max-height:180px;padding:4px 0;
}
.compo textarea::placeholder{color:var(--texte-3)}
.envoyer{
  width:34px;height:34px;flex-shrink:0;
  background:var(--degrade);color:var(--noir);
  border-radius:10px;display:grid;place-items:center;
  transition:transform .18s,opacity .18s;
}
.envoyer:hover:not(:disabled){transform:translateY(-1px)}
.envoyer:disabled{opacity:.22;cursor:not-allowed}

/* --- barre d'extensions dans le compositeur ---
   Deux des trois bascules ne pilotent encore rien côté serveur. Elles
   portent la classe .bientot, qui les grise et les rend inertes : une
   bascule qui s'allume sans rien changer serait un mensonge, une bascule
   visiblement à venir est une promesse. */
.compo-bas{
  display:flex;align-items:center;gap:7px;
  padding:0 13px 11px 14px;
  flex-wrap:wrap;
}

.ext{
  display:flex;align-items:center;gap:6px;
  padding:5px 10px;border-radius:9px;
  border:1px solid var(--filet);
  font-size:12px;color:var(--texte-2);
  transition:border-color .18s,color .18s,background .18s;
}
.ext:hover{border-color:var(--filet-clair);color:var(--texte)}
.ext.on{
  border-color:var(--accent-sourd);
  background:rgba(124,58,237,.1);
  color:var(--accent);
}
.ext svg{flex-shrink:0}
.ext.bientot{opacity:.42;cursor:default}
.ext.bientot:hover{border-color:var(--filet);color:var(--texte-2)}
.ext .bientot-marque{
  font-family:var(--mono);font-size:8px;letter-spacing:.08em;
  color:var(--texte-3);
}

.choix-modele{position:relative;margin-left:auto}
.btn-modele{
  display:flex;align-items:center;gap:7px;
  padding:5px 10px;border-radius:9px;
  border:1px solid var(--filet);
  font-size:12px;
  transition:border-color .18s;
}
.btn-modele:hover{border-color:var(--filet-clair)}
.btn-modele .nom{
  font-family:var(--titre);font-weight:600;letter-spacing:.02em;
  background:var(--degrade);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
}
.btn-modele .fleche{color:var(--texte-3);transition:transform .2s}
.choix-modele.ouvert .fleche{transform:rotate(180deg)}

.menu-modele{
  position:absolute;bottom:calc(100% + 8px);right:0;
  width:282px;
  background:var(--carte);
  border:1px solid var(--filet-clair);
  border-radius:14px;
  box-shadow:0 12px 40px rgba(0,0,0,.5);
  padding:6px;z-index:40;
  opacity:0;visibility:hidden;transform:translateY(6px);
  transition:opacity .2s,transform .2s,visibility .2s;
}
.choix-modele.ouvert .menu-modele{opacity:1;visibility:visible;transform:none}

.option{
  width:100%;text-align:left;
  padding:10px 11px;border-radius:10px;
  display:flex;gap:11px;align-items:flex-start;
  transition:background .16s;
}
.option:hover{background:var(--carte-haut)}
.option.bientot{opacity:.42;cursor:default}
.option.bientot:hover{background:none}
.option .coche{
  width:14px;flex-shrink:0;margin-top:3px;
  color:var(--accent);opacity:0;transition:opacity .16s;
}
.option.actif .coche{opacity:1}
.option-nom{
  font-family:var(--titre);
  font-size:13.5px;font-weight:600;line-height:1.3;
}
.option-desc{
  font-size:11.5px;color:var(--texte-3);
  line-height:1.45;margin-top:3px;
}
.badge{
  font-family:var(--mono);font-size:8px;letter-spacing:.09em;
  padding:2px 5px;border-radius:4px;
  background:var(--degrade);color:var(--noir);
  margin-left:7px;vertical-align:2px;font-weight:500;
}
.badge.sourd{
  background:none;border:1px solid var(--filet-clair);
  color:var(--texte-3);
}

.mention{
  max-width:780px;margin:10px auto 0;
  font-family:var(--mono);font-size:9.5px;letter-spacing:.05em;
  color:var(--texte-3);text-align:center;
}

/* ---- non connecté ---- */
.portail{
  max-width:780px;margin:0 auto;
  border:1px solid var(--filet);border-radius:18px;
  background:var(--carte);
  padding:20px;text-align:center;
}
.portail p{color:var(--texte-2);font-size:14px;margin-bottom:13px}
.portail-btn{
  display:inline-block;padding:10px 22px;border-radius:10px;
  background:var(--degrade);color:var(--noir);
  font-family:var(--titre);font-size:14px;font-weight:600;
  text-decoration:none;
  transition:transform .18s;
}
.portail-btn:hover{transform:translateY(-1px)}

@keyframes monte{from{opacity:0;transform:translateY(11px)}to{opacity:1;transform:none}}

@media (prefers-reduced-motion:reduce){
  *{animation:none !important;transition:none !important}
  .flux{scroll-behavior:auto}
}

/* Voile sous le rail en mobile : donne un endroit où taper pour refermer.
   Sans lui, le rail s'ouvre en plein écran et il n'y a aucun moyen évident
   d'en sortir — le bouton bascule est caché derrière. */
.voile{
  position:fixed;inset:0;z-index:29;
  background:rgb(0 0 0 / 55%);
  opacity:0;visibility:hidden;
  transition:opacity .25s ease,visibility .25s ease;
}

@media (max-width:860px){
  .rail{
    position:fixed;inset:0 auto 0 0;z-index:30;
    box-shadow:0 0 50px rgba(0,0,0,.7);
    width:min(var(--rail),86vw);
  }
  /* Le rail est refermé par défaut sur mobile : le JS pose .replie au
     chargement. La transition sur margin-left le fait glisser. */
  .rail:not(.replie) ~ .voile{opacity:1;visibility:visible}

  .piste,.vide{padding-left:18px;padding-right:18px}
  .compo-zone{padding:0 14px 16px}
  .ext .libelle{display:none}
}

/* Au-dessus de 860px le rail fait partie du flux : aucun voile. */
@media (min-width:861px){
  .voile{display:none}
}
