/* =========================================================================
   campagne-nouvelle.css — vue « Nouvelle campagne » (#/campagne/nouvelle).

   Cette feuille est servie à tous (comme les autres CSS) : elle ne nomme
   AUCUN module à privilège ni aucune route d'API — uniquement ses propres
   classes cn-*. Le module qui l'utilise, lui, n'est servi qu'aux sessions
   autorisées. Un test du dépôt garde cet invariant.
   Design : mêmes conventions liquid-glass que campagnes.css / reglages.css
   (.glass, .glassin, tokens --txt/--muted/--dim/--line/--accent).
   Chaque élément interactif porte une classe cn-* DÉDIÉE et unique.

   19/08/2026 — CE N'EST PLUS UN PANNEAU, C'EST UNE VUE.
   Demande de Sylvain : « fais un front-end comme les autres et l'animation de
   chargement comme les autres, repense tout, ne supprime aucune fonction ».
   Ont donc disparu, et avec eux tout leur coût : le voile plein écran, le
   panneau en 100vw/100dvh, le flou du fond d'écran, l'effacement de
   l'application derrière, les vingt-huit particules animées, l'ouverture
   animée (gonflage depuis le bouton, glissé du contenu) et le verrouillage du
   défilement de la page.
   N'ont RIEN perdu : les quatre écrans, leurs boutons, leurs compteurs, leurs
   avertissements et leurs explications — tout ce qui suit à partir de « Écran
   0 » est inchangé.

   L'attente de chargement est désormais celle de toute l'application :
   `App.skeleton`, posé par le shell puis par la vue. Il n'y a plus une seule
   animation propre à cet écran, donc plus rien à mettre en pause, à couper en
   `prefers-reduced-motion` ou à recomposer image par image.
   ========================================================================= */

/* ---------- La vue : un panneau de verre comme les autres ----------------- */
.cn-vue{display:flex;flex-direction:column;min-width:0;overflow:hidden}

/* Tête et pied : les deux barres qui portent le titre, la jauge et les boutons
   d'action. Leur voile propre est CONSERVÉ — la vue est un panneau de verre
   posé sur une photo, et un titre de 21 px comme un bouton « Envoyer » doivent
   se lire quel que soit le fond d'écran tiré. */
.cn-head{display:flex;align-items:flex-start;gap:16px;justify-content:space-between;
  padding:20px 24px 14px;border-bottom:1px solid var(--line);flex:none;
  background:linear-gradient(180deg,rgba(8,10,17,.52),rgba(8,10,17,.30))}
.cn-head-txt{min-width:0;display:flex;flex-direction:column;gap:10px}
.cn-title{margin:0;font-size:21px;font-weight:780;letter-spacing:-.02em;color:var(--txt)}

/* Jauge d'avancement */
.cn-jauge{display:flex;gap:8px;flex-wrap:wrap;margin:0;padding:0;list-style:none}
.cn-jauge-pas{display:inline-flex;align-items:center;gap:8px;padding:6px 13px;
  border-radius:999px;border:1px solid var(--line);background:rgba(255,255,255,.06);
  color:var(--dim);font-size:12px;font-weight:650}
.cn-jauge-n{display:grid;place-items:center;width:19px;height:19px;border-radius:50%;
  background:rgba(255,255,255,.14);font-size:10.5px;font-weight:780}
.cn-jauge-pas.fait{color:var(--muted)}
.cn-jauge-pas.fait .cn-jauge-n{background:color-mix(in srgb, var(--accent) 40%, transparent)}
.cn-jauge-pas.on{color:var(--txt);background:color-mix(in srgb, var(--accent) 20%, transparent);
  border-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.cn-jauge-pas.on .cn-jauge-n{background:var(--accent);color:#06090e}

/* Le corps ne défile plus DANS le panneau : c'est la PAGE qui défile, comme
   dans toutes les autres vues. Un conteneur à défilement interne n'avait de
   sens que tant que le panneau occupait exactement l'écran ; sur une vue, il
   produirait deux barres de défilement imbriquées. */
.cn-body{padding:18px 24px 10px}
.cn-foot{flex:none;display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding:14px 24px;border-top:1px solid var(--line);background:rgba(4,6,11,.46)}
.cn-foot .cn-suivant,.cn-foot .cn-envoyer,.cn-foot .cn-fin{margin-left:auto}
.cn-retenu,.cn-retenu2{font-size:13px;font-weight:650;color:var(--muted);margin-left:auto}
.cn-foot .cn-retenu + .cn-suivant,.cn-foot .cn-retenu2 + .cn-envoyer{margin-left:0}

/* ---------- Textes transverses -------------------------------------------- */
.cn-intro{margin:0 0 16px;font-size:13.5px;line-height:1.6;color:var(--muted);max-width:78ch}
.cn-note{margin:10px 0 0;font-size:12.5px;line-height:1.6;color:var(--dim);max-width:82ch}
.cn-note-prevision{border-left:2px solid var(--line);padding-left:12px}
.cn-avert{margin:10px 0 0;font-size:13px;line-height:1.6;color:var(--muted);max-width:82ch}
.cn-avert-email{border-left:3px solid var(--warn);padding-left:12px}
.cn-avert-tronque{border-left:3px solid var(--warn);padding-left:12px}
.cn-err{display:flex;gap:9px;align-items:flex-start;margin:14px 0;padding:12px 14px;
  border-radius:12px;background:rgba(255,69,58,.13);border:1px solid rgba(255,69,58,.38);
  font-size:13px;line-height:1.55;color:var(--txt)}
.cn-err .ic{width:17px;height:17px;flex:none;color:var(--danger);margin-top:2px}

/* ---------- Écran 0 : les colonnes ---------------------------------------- */
/* `grid-auto-rows:1fr` : SANS lui, seules les cartes d'une MÊME rangée ont la
   même hauteur, et la rangée qui contient « Contact autorisé » (badge du
   garde-fou en plus) était plus haute que les autres — c'est le décalage
   signalé par Sylvain. Avec `1fr`, toutes les rangées prennent la hauteur de
   la plus grande, et le badge vide (`.cn-col-gate-vide`) réserve sa ligne dans
   les cartes qui n'en ont pas. */
.cn-cols{display:grid;gap:12px;grid-auto-rows:1fr;
  grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}
/* Fond OPACIFIÉ : `var(--glass)` est un blanc très transparent, conçu pour se
   poser sur un panneau opaque. Le socle sombre propre est conservé — il
   délimite les cartes sur le verre de la vue. */
.cn-col{display:flex;flex-direction:column;gap:4px;padding:16px 18px;text-align:left;
  border:1px solid var(--line);background:rgba(13,16,25,.52);color:var(--txt);cursor:pointer;
  border-radius:var(--radius);transition:border-color .14s,transform .14s,background .14s}
.cn-col:hover{border-color:color-mix(in srgb, var(--accent) 55%, transparent);transform:translateY(-2px)}
@media (prefers-reduced-motion: reduce){.cn-col{transition:none}.cn-col:hover{transform:none}}
.cn-col-nom{font-size:14.5px;font-weight:730;letter-spacing:-.01em}
.cn-col-n{font-size:26px;font-weight:800;letter-spacing:-.03em;color:var(--accent-ink)}
.cn-col-sub{font-size:11.5px;color:var(--dim)}
/* Le compteur pousse le badge en bas de carte : les quatre badges se lisent
   alors sur une même ligne d'horizon, quelle que soit la longueur du nom. */
.cn-col-sub{margin-bottom:auto}
.cn-col-gate{display:inline-flex;align-items:center;gap:6px;margin-top:8px;min-height:15px;
  font-size:11px;font-weight:680;color:var(--warn)}
.cn-col-gate .ic{width:13px;height:13px}
.cn-col-gate-vide{visibility:hidden}

/* Teinte des 4 étapes-bascules — même source que le kanban (App.teinterEtape).
   On choisit ici la colonne qu'on regardait là-bas : elle doit avoir la même
   couleur, sinon c'est deux objets différents dans la tête. */
/* La teinte se mélange au socle sombre, PAS au transparent : sinon les quatre
   cartes-bascules seraient les seules à laisser passer le fond. */
.cn-col.etape-teinte{
  border-color:color-mix(in srgb, var(--etape-teinte, var(--accent)) 50%, transparent);
  background:color-mix(in srgb, var(--etape-teinte, var(--accent)) 14%, rgba(13,16,25,.52))}
.cn-col.etape-teinte .cn-col-nom{
  color:color-mix(in srgb, var(--etape-teinte, var(--accent)) 55%, var(--txt))}
.cn-col.etape-teinte .cn-col-n{
  color:color-mix(in srgb, var(--etape-teinte, var(--accent)) 62%, #ffffff)}
.cn-col.etape-teinte:hover{
  border-color:color-mix(in srgb, var(--etape-teinte, var(--accent)) 78%, transparent);
  background:color-mix(in srgb, var(--etape-teinte, var(--accent)) 22%, rgba(13,16,25,.55))}

/* ---------- Compteurs (écrans 1 et 3) ------------------------------------- */
.cn-compteurs{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:6px}
.cn-c{display:flex;flex-direction:column;gap:2px;padding:11px 16px;border-radius:13px;
  border:1px solid var(--line);background:rgba(11,14,22,.46);min-width:132px}
.cn-c-n{font-size:22px;font-weight:800;letter-spacing:-.03em;color:var(--txt)}
.cn-c-l{font-size:11.5px;color:var(--dim)}
.cn-n-joignables,.cn-n-envoyes{color:var(--ok)}
.cn-n-ecartees,.cn-n-echecs{color:var(--warn)}

.cn-motifs{margin:8px 0 0;padding-left:18px;font-size:12.5px;color:var(--muted);line-height:1.7}
.cn-motif-l{margin:0}

/* ---------- Écran 1 : nom, outils, liste ---------------------------------- */
.cn-nom-l{display:flex;flex-direction:column;gap:6px;margin:16px 0 12px;max-width:520px;
  font-size:12px;font-weight:650;color:var(--muted)}
.cn-nom{padding:10px 13px;border-radius:11px;font-size:13.5px;color:var(--txt);
  border:1px solid var(--line);background:rgba(4,6,11,.52)}
.cn-outils{display:flex;gap:8px;margin-bottom:10px}
.cn-vide{margin:24px 0;padding:26px;text-align:center;font-size:13.5px;color:var(--muted);
  border:1px dashed var(--line);border-radius:14px}

.cn-liste-zone{display:grid;grid-template-columns:1fr;gap:14px}
.cn-liste-zone:has(.cn-fiche-zone.on){grid-template-columns:1fr 330px}
.cn-liste{display:flex;flex-direction:column;gap:2px;min-width:0}

.cn-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;
  gap:12px;padding:9px 12px;border-radius:11px;border:1px solid transparent}
.cn-row:hover{background:rgba(255,255,255,.05);border-color:var(--line)}
.cn-row-exclu{opacity:.62}
/* La ligne dont la fiche est ouverte dans le tiroir. Sur une colonne de deux
   cents sociétés, sans ce repère on ne sait plus de qui parle le panneau de
   droite dès qu'on a fait défiler trois lignes. Le liseré est à GAUCHE et non
   tout autour : la bordure complète se confondait avec celle du survol. */
.cn-row-active,.cn-row-active:hover{
  background:color-mix(in srgb, var(--accent) 13%, transparent);
  border-color:color-mix(in srgb, var(--accent) 34%, transparent)}
.cn-row-active{box-shadow:inset 3px 0 0 var(--accent)}
.cn-case{width:17px;height:17px;accent-color:var(--accent);cursor:pointer;flex:none}
.cn-case:disabled{cursor:not-allowed}
.cn-ouvre{display:flex;flex-direction:column;gap:2px;min-width:0;text-align:left;
  background:none;border:none;padding:0;cursor:pointer;color:var(--txt)}
.cn-nom-soc{font-size:13.5px;font-weight:690;letter-spacing:-.01em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cn-meta{font-size:11.5px;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cn-chips{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}
.cn-chip-mail{font-family:ui-monospace,monospace;font-size:11px;color:var(--muted)}
.cn-chip-motif{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 40%, transparent)}
.cn-chip-envoi{color:var(--dim)}
.cn-chip-grade{color:var(--muted)}

/* Tiroir fiche — DANS le panneau : aucune navigation, aucune sélection perdue */
.cn-fiche-zone{display:none}
.cn-fiche-zone.on{display:block;position:sticky;top:0;align-self:start;
  padding:14px 16px;border-radius:14px;border:1px solid var(--line);
  background:rgba(5,7,12,.62);max-height:70vh;overflow:auto}
.cn-fiche-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}
.cn-fiche-t{margin:0;font-size:13.5px;font-weight:740;color:var(--txt)}
.cn-fiche-close{padding:6px 11px;font-size:12px}
.cn-fiche-corps{display:flex;flex-direction:column;gap:6px}
.cn-fiche-l{display:grid;grid-template-columns:130px minmax(0,1fr);gap:8px;font-size:12.5px}
.cn-fiche-k{color:var(--dim)}
.cn-fiche-v{color:var(--txt);word-break:break-word}
/* Note d'équipe — texte libre, donc pleine largeur et non en colonne de droite
   (18/08/2026). Le filet à gauche la distingue des couples clé/valeur sans lui
   construire un cadre de plus. `pre-wrap` : les retours à la ligne saisis par
   l'équipe font partie de la note. */
.cn-fiche-note-eq{margin-top:10px;padding:9px 0 2px 11px;
  border-left:2px solid color-mix(in srgb, var(--accent) 55%, transparent)}
.cn-fiche-note-eq-t{display:block;font-size:10.5px;text-transform:uppercase;
  letter-spacing:.06em;color:var(--dim);margin-bottom:4px}
.cn-fiche-note-eq-v{margin:0;font-size:12.5px;line-height:1.55;color:var(--txt);
  white-space:pre-wrap;word-break:break-word}
.cn-fiche-pied{display:flex;flex-direction:column;gap:2px}
.cn-fiche-note{margin:10px 0 0;font-size:11.5px;color:var(--dim);line-height:1.55}
.cn-fiche-full{margin-top:10px;align-self:flex-start;font-size:12px;padding:8px 13px;
  text-decoration:none;display:inline-flex;align-items:center;gap:7px}

/* ---------- Écran 2 : réglages appliqués ---------------------------------- */
.cn-reglages{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:14px}
.cn-r{display:flex;flex-direction:column;gap:2px;padding:9px 14px;border-radius:12px;
  border:1px solid var(--line);background:rgba(11,14,22,.44);min-width:150px;max-width:280px}
.cn-r-k{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--dim)}
.cn-r-v{font-size:13px;font-weight:680;color:var(--txt);word-break:break-word}
.cn-r-sub{font-size:11px;color:var(--muted)}
.cn-v-apres{color:var(--accent-ink)}

/* ---------- Réglages MODIFIABLES sur place (20/08/2026, point 5) -----------
   Les mêmes cartes que les puces en lecture — même cadre, même clé en petites
   capitales — avec un contrôle à la place du texte. Continuité voulue : ce
   n'est pas un « mode édition » qu'on ouvre, ce sont les mêmes réglages,
   simplement devenus actionnables. `cursor:pointer` sur le <label> pour que
   toute la carte donne accès au champ. */
.cn-r-edit{cursor:pointer;min-width:210px;max-width:320px}
.cn-sel,.cn-r-objet-inp{width:100%;font:inherit;font-size:12.5px;
  padding:5px 9px;border-radius:9px;border:1px solid var(--line);
  background:rgba(11,14,22,.62);color:var(--txt)}
.cn-sel{appearance:none;-webkit-appearance:none;cursor:pointer}
.cn-sel option{background:var(--panel-solid,#12141a);color:var(--txt)}
.cn-sel:disabled,.cn-r-objet-inp:disabled{opacity:.55;cursor:default}
.cn-sel:focus-visible,.cn-r-objet-inp:focus-visible{
  outline:2px solid var(--accent-ink);outline-offset:1px}

.cn-reglages-bar{display:flex;align-items:center;gap:11px;flex-wrap:wrap;
  width:100%;margin-top:2px}
.cn-reglages-etat{font-size:11.5px;color:var(--muted);line-height:1.5}
/* L'avertissement « les brouillons portent encore l'ancienne signature » n'est
   pas une information de plus : sans lui, on envoie une campagne signée du
   mauvais nom. Il est donc en teinte d'alerte, et il reste jusqu'à ce que la
   réécriture ait eu lieu. */
.cn-reglages-alerte{color:var(--warn);font-weight:700}
.cn-reglages-note{width:100%;margin:8px 0 0;font-size:11.5px;color:var(--dim);
  line-height:1.6}

/* ---------- Panneau « Historique » (20/08/2026, point 10) ------------------ */
.cn-hist-zone:empty{display:none}
.cn-hist{margin:0 0 16px;padding:13px 15px;border-radius:14px}
.cn-hist-tete{display:flex;align-items:center;gap:11px;flex-wrap:wrap;
  margin-bottom:9px}
.cn-hist-t{font-size:13.5px}
.cn-hist-n{font-size:11.5px}
.cn-hist-filtre{margin-left:auto;font-size:11.5px}
.cn-hist-liste{display:flex;flex-direction:column;gap:6px;
  max-height:min(46vh,380px);overflow-y:auto;overscroll-behavior:contain}
/* Une ligne d'historique est un BOUTON : on l'ouvre. Grille et non flex, pour
   que les colonnes s'alignent d'une ligne à l'autre — une liste dont les
   statuts dansent ne se parcourt pas du regard. */
.cn-hist-l{display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:3px 10px;align-items:center;width:100%;text-align:left;
  padding:8px 11px;border-radius:11px;cursor:pointer;font:inherit;
  border:1px solid color-mix(in srgb, var(--line) 75%, transparent);
  background:color-mix(in srgb, #fff 3%, transparent);color:var(--txt);
  transition:background .16s,border-color .16s}
.cn-hist-l:hover{background:color-mix(in srgb, #fff 8%, transparent);
  border-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.cn-hist-nom{font-size:13px;font-weight:720;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.cn-hist-statut{justify-self:end;font-size:10.5px;padding:1px 8px}
.cn-hist-statut-brouillon{color:var(--muted)}
.cn-hist-statut-prete{color:var(--accent-ink);
  border-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.cn-hist-statut-cloturee{color:var(--ok);
  border-color:color-mix(in srgb, var(--ok) 40%, transparent)}
.cn-hist-meta{font-size:11px}
.cn-hist-chiffres{grid-column:1/-1;font-size:11.5px;color:var(--muted)}
.cn-hist-vide{margin:4px 0 0;font-size:12.5px}
.cn-hist-tout{margin-top:10px;align-self:flex-start;font-size:12px;
  display:inline-flex;align-items:center;gap:7px;text-decoration:none}
.cn-hist-btn{flex:none;font-size:12px;display:inline-flex;align-items:center;gap:7px}

/* Verdict serveur : les retenues que le serveur a écartées */
.cn-ecartes-zone{margin:0 0 14px;padding:12px 15px;border-radius:13px;
  border:1px solid color-mix(in srgb, var(--warn) 40%, transparent);
  background:color-mix(in srgb, var(--warn) 10%, transparent)}
.cn-ecartes-t{margin:0 0 8px;font-size:13px;font-weight:680;color:var(--txt)}
.cn-ecartes{margin:0;padding-left:18px;font-size:12.5px;color:var(--muted);line-height:1.7}
.cn-ecarte-l{margin:0}

/* Barre du modèle local. `.glass` la peint avec `var(--glass)`, transparent :
   on lui ajoute le socle sombre exigé par le panneau translucide. */
.cn-llm{display:flex;align-items:center;gap:16px;justify-content:space-between;
  flex-wrap:wrap;padding:13px 16px;margin-bottom:14px;background:rgba(11,14,22,.55)}
.cn-llm-txt{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}
.cn-llm-t{font-size:13px;font-weight:730;color:var(--txt)}
.cn-llm-etat{font-size:12.5px;color:var(--muted);line-height:1.55}
.cn-llm-actions{display:flex;gap:8px;flex:none}
/* Un bouton désactivé DOIT se voir comme tel. Sans cette règle, « Reformuler
   tous les messages » gardait sa couleur pleine alors qu'il ne répondait pas
   (modèle injoignable) : on cliquait dans le vide, et l'infobulle qui explique
   pourquoi demandait de survoler pour être lue. */
.cn-llm-actions .btn[disabled],
.cn-msg-reform .btn[disabled]{opacity:.42;cursor:not-allowed;filter:grayscale(.6)}
/* Indication ponctuelle pour TOUT le lot (19/08/2026). Elle prend la largeur
   restante de la barre plutôt qu'une ligne à elle : c'est un complément de
   consigne, pas un formulaire. */
.cn-llm-extra{flex:1 1 260px;min-width:0;padding:8px 12px;border-radius:11px;
  border:1px solid var(--line);background:rgba(3,4,8,.60);color:var(--txt);
  font:inherit;font-size:12.5px}
.cn-llm-extra::placeholder{color:var(--dim);opacity:1}

/* Case « Inclure les messages édités à la main » (22/08/2026) : un choix
   explicite, posé entre l'indication et les boutons. */
.cn-llm-edites{display:flex;gap:8px;align-items:center;flex:none;
  font-size:12.5px;color:var(--muted);cursor:pointer;user-select:none}
.cn-llm-edites-chk{width:15px;height:15px;flex:none;accent-color:var(--accent);
  cursor:pointer}

/* Reformuler UN message. Replié par défaut : trente champs ouverts feraient de
   l'écran de relecture un formulaire. */
.cn-msg-reform{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cn-msg-reform-btn{font-size:12px;padding:7px 12px;flex:none;color:var(--txt)}
.cn-msg-reform-extra{flex:1 1 220px;min-width:0;padding:8px 12px;border-radius:11px;
  border:1px solid var(--line);background:rgba(3,4,8,.72);color:var(--txt);
  font:inherit;font-size:12.5px}
.cn-msg-reform-extra::placeholder{color:var(--dim);opacity:1}
.cn-msg-reform-go{font-size:12px;padding:7px 14px;flex:none}
.cn-msg-reform .hidden{display:none}

/* Cartes de message — TOUTES DÉPLIÉES */
/* L'écran « Messages » est LA zone de texte dense du panneau : un objet et un
   corps d'e-mail à relire mot à mot, sur des dizaines de cartes. C'est donc
   ici que la translucidité du panneau s'arrête — les cartes et leurs champs
   posent un fond franc, et on relit sur du sombre plein. */
.cn-msgs{display:flex;flex-direction:column;gap:12px}
.cn-msg{padding:0;overflow:hidden;border:1px solid var(--line);
  background:rgba(11,14,22,.66)}
.cn-msg.on{border-color:color-mix(in srgb, var(--accent) 60%, transparent);
  box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent)}
.cn-msg-tete{display:flex;align-items:center;gap:12px;flex-wrap:wrap;width:100%;
  padding:12px 16px;background:rgba(255,255,255,.05);border:none;cursor:pointer;
  text-align:left;color:var(--txt)}
.cn-msg-nom{font-size:14px;font-weight:730;letter-spacing:-.01em}
.cn-msg-mail{font-family:ui-monospace,monospace;font-size:11.5px;color:var(--dim)}
.cn-rendu{margin-left:auto}
.cn-rendu-gabarit{color:var(--muted)}
.cn-rendu-llm{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 40%, transparent)}
.cn-rendu-cours{color:var(--accent-ink);border-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.cn-rendu-humain{color:var(--violet);border-color:color-mix(in srgb, var(--violet) 50%, transparent)}

.cn-msg-champs{display:flex;flex-direction:column;gap:11px;padding:14px 16px}
.cn-msg-l{display:flex;flex-direction:column;gap:5px;font-size:11.5px;
  font-weight:650;color:var(--dim)}
.cn-msg-sujet,.cn-msg-corps{padding:10px 13px;border-radius:11px;font-size:13px;
  color:var(--txt);border:1px solid var(--line);background:rgba(3,4,8,.72);
  font-family:inherit;line-height:1.6;resize:vertical;width:100%;box-sizing:border-box}
.cn-msg-corps{white-space:pre-wrap}
.cn-msg-pied{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.cn-msg-etat{font-size:11.5px;color:var(--dim)}
.cn-msg-refus{font-size:11.5px;color:var(--warn)}
.cn-msg-off{margin-left:auto;font-size:12px;padding:7px 12px}

/* ---------- Écran 3 : résultat -------------------------------------------- */
.cn-echecs-zone{margin:14px 0;padding:12px 15px;border-radius:13px;
  border:1px solid rgba(255,69,58,.36);background:rgba(255,69,58,.10)}
.cn-echecs-t{margin:0 0 8px;font-size:13px;font-weight:680;color:var(--txt)}
.cn-echecs{margin:0;padding-left:18px;font-size:12.5px;color:var(--muted);line-height:1.7}
.cn-echec-l{margin:0}
.cn-bascule{margin-top:16px;padding:14px 16px;border-radius:13px;
  border:1px solid var(--line);background:rgba(11,14,22,.48)}
.cn-bascule-t{margin:0 0 8px;font-size:14px;font-weight:740;color:var(--txt)}
.cn-bascule-ok{margin:0;font-size:13px;color:var(--txt);line-height:1.6}
.cn-bascule-non{margin:0;font-size:13px;color:var(--muted);line-height:1.6}
.cn-bascule-raisons{margin:8px 0 0;padding-left:18px;font-size:12.5px;
  color:var(--dim);line-height:1.7}
.cn-bascule-r{margin:0}

/* ---------- Bouton d'entrée, posé par le kanban --------------------------- */
.pipe-camp-bar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0 0 12px}
.pipe-camp-hint{font-size:12.5px;color:var(--dim);line-height:1.5;max-width:70ch}
