/* =========================================================================
   campagnes.css — vue « Campagnes » (module chargé selon le compte).
   Cette feuille est servie à tous (comme les autres CSS) : elle ne nomme
   AUCUN module à privilège — uniquement ses propres classes camp-*.
   Design : mêmes conventions liquid-glass que liste.css / fiche.css
   (panneaux .glass, saisies .glassin, tokens --txt/--muted/--dim/--line).
   Chaque élément interactif porte une classe camp-* DÉDIÉE et unique
   (ancres du harnais de tests — leçon du 2026-08-12 : jamais de classe
   générique réutilisée comme ancre).
   ========================================================================= */

.view-campagnes{max-width:1136px;margin:0 auto}

/* ---------- Bandeau SMTP (honnêteté : envoi désarmé, préparation ouverte) -- */
.camp-smtp-banner{display:flex;gap:12px;align-items:flex-start;padding:14px 18px;
  margin-bottom:14px;border-left:3px solid var(--warn,#e8a13c);font-size:13.5px;line-height:1.5}
.camp-smtp-banner .ic{width:18px;height:18px;flex:none;margin-top:2px;color:var(--warn,#e8a13c)}
.camp-smtp-vars{font-family:ui-monospace,monospace;font-size:12.5px}
.camp-smtp-note{margin:0 0 12px;font-size:12px}

/* ---------- Barre d'outils / erreurs ---------------------------------------- */
.camp-toolbar{margin-bottom:12px}
.camp-err{color:#ff8d7a;font-size:12.5px;font-weight:600;margin-top:6px}

/* ---------- Barre de progression (4 étapes) --------------------------------- */
.camp-steps{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}
.camp-step{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;
  border-radius:999px;border:1px solid var(--line);background:rgba(255,255,255,.06);
  color:var(--muted);font-size:12.5px;font-weight:650;cursor:pointer}
.camp-step[disabled]{cursor:default}
.camp-step-n{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;
  background:rgba(255,255,255,.14);font-size:11px;font-weight:760}
.camp-step.on{background:color-mix(in srgb, var(--accent) 22%, transparent);
  color:var(--txt);border-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.camp-step.on .camp-step-n{background:var(--accent);color:var(--b1-ink,#06090e)}
.camp-step.done{color:var(--txt)}
.camp-step.done .camp-step-n{background:color-mix(in srgb, var(--accent) 40%, transparent)}

/* ---------- Accueil : cartes de campagne ------------------------------------ */
.camp-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}
.camp-card{padding:16px 18px;display:flex;flex-direction:column;gap:10px}
.camp-card-head{display:flex;align-items:center;gap:10px;justify-content:space-between}
.camp-card-nom{font-size:15.5px;font-weight:740;letter-spacing:-.01em}
.camp-card-sub{font-size:12px}
.camp-card-stats{display:flex;gap:6px;flex-wrap:wrap}
.camp-card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto}
.camp-empty{padding:34px;text-align:center;display:flex;flex-direction:column;
  align-items:center;gap:8px}
.camp-empty .ic{width:26px;height:26px;color:var(--dim)}

/* Puces de statut campagne + compteurs */
.camp-statut{padding:4px 12px;border-radius:999px;font-size:11.5px;font-weight:720;
  border:1px solid var(--line);background:rgba(255,255,255,.08)}
.camp-statut-brouillon{color:var(--muted)}
.camp-statut-prete{color:#7fd7a0;border-color:rgba(127,215,160,.4)}
.camp-statut-cloturee{color:var(--dim)}
.camp-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;
  border-radius:999px;background:rgba(255,255,255,.07);font-size:11.5px;color:var(--muted)}
.camp-chip .num{color:var(--txt)}
.camp-chip.zero{opacity:.55}
.camp-chip.zero .num{color:var(--dim)}
.camp-n-echec .num{color:#ff8d7a}
.camp-n-envoye .num{color:#7fd7a0}
.camp-n-desinscrit .num{color:var(--warn,#e8a13c)}

/* ---------- Assistant de création ------------------------------------------- */
.camp-create{margin-bottom:16px}
.camp-create .inner2{display:flex;flex-direction:column;gap:12px;padding:16px 18px}
.camp-create-grid{display:grid;gap:14px 16px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
.camp-create input[type="text"],.camp-create textarea,.camp-create select{
  width:100%;padding:9px 12px;border-radius:11px;border:1px solid var(--line);
  background:rgba(255,255,255,.07);color:var(--txt);font:inherit;font-size:13px}
.camp-create select option{background:var(--panel-solid,#12141a);color:var(--txt)}
.camp-src-lbl{margin-top:2px}
.camp-zone{display:flex;flex-direction:column;gap:6px}
.camp-nos{resize:vertical;font-family:ui-monospace,monospace}
.camp-nos-count,.camp-lien-note{font-size:11.5px}
.camp-honnete-note{font-size:12px;line-height:1.5}
.camp-create-bar{display:flex;justify-content:flex-end}
/* Sociétés cochées dans la liste : encart en tête du formulaire. Il dit ce
   qu'il sait (combien de sociétés) et ce qu'il ne sait PAS (combien sont
   joignables) — ce dernier chiffre n'arrive qu'avec les compteurs serveur. */
.camp-graine-slot:empty{display:none}
.camp-graine{padding:12px 16px;display:flex;flex-direction:column;gap:6px}
.camp-graine-tete{font-size:13.5px;line-height:1.5}
.camp-graine-n{font-size:16px}
.camp-graine-note{margin:0;font-size:12px;line-height:1.5;max-width:76ch}

/* ---------- Détail : honnêteté + panneaux ----------------------------------- */
.camp-honnete{padding:14px 18px;margin-bottom:4px;display:flex;flex-direction:column;gap:8px}
.camp-honnete-tete{font-size:13.5px;line-height:1.5}
.camp-honnete-motifs{display:flex;gap:6px;flex-wrap:wrap}
.camp-excl{background:rgba(255,141,122,.12)}
.camp-excl.zero{background:rgba(255,255,255,.06)}
.camp-honnete-extra{font-size:12px}
.camp-panel{padding:14px 16px;display:flex;flex-direction:column;gap:12px}
.camp-panel-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.camp-panel-foot{display:flex;justify-content:flex-end;gap:10px}
.camp-searchwrap{max-width:420px}
.camp-search{width:100%;padding:9px 12px 9px 4px;border:0;background:transparent;
  color:var(--txt);font:inherit;font-size:13px;outline:none}

/* ---------- Source (recap étape 1) ------------------------------------------ */
.camp-source{padding:16px 18px;display:flex;flex-direction:column;gap:8px;font-size:13.5px}
.camp-source-params{margin:0;padding-left:18px;color:var(--muted);font-size:12.5px}

/* ---------- Tableau des destinataires --------------------------------------- */
.camp-table{display:flex;flex-direction:column;overflow-x:auto}
/* 20/08/2026 (point 11) : DEUX colonnes de plus — dernier envoi, dernière
   réponse — et un bloc d'actions plus large (quatre boutons de société y
   précèdent maintenant les boutons d'étape). La largeur minimale du tableau
   monte en conséquence : la rogner ferait tasser les dates, qui sont
   précisément ce qu'on vient lire. Le conteneur défile déjà en X. */
.camp-row{display:grid;align-items:center;gap:10px;padding:9px 10px;
  grid-template-columns:minmax(180px,1.4fr) minmax(90px,.7fr) minmax(70px,.5fr)
    minmax(150px,1fr) minmax(96px,.6fr) minmax(104px,.6fr)
    minmax(110px,.8fr) minmax(190px,auto);
  border-bottom:1px solid var(--line);font-size:13px;min-width:1080px}
.camp-p-send .camp-row{grid-template-columns:34px minmax(180px,1.4fr) minmax(90px,.7fr)
  minmax(70px,.5fr) minmax(150px,1fr) minmax(96px,.6fr) minmax(104px,.6fr)
  minmax(110px,.8fr) minmax(250px,auto)}
/* Dates : chiffres alignés d'une ligne à l'autre, sinon la colonne « saute »
   et on ne compare plus rien du regard. */
.camp-date{font-variant-numeric:tabular-nums;font-size:12.5px;color:var(--muted)}
/* Une RÉPONSE REÇUE est le fait le plus important de cette table : c'est la
   seule preuve que quelqu'un a réagi. Elle porte donc la teinte « réponse
   reçue » du kanban, pas le gris des métadonnées. */
.camp-date-rep{color:var(--st-reponse);font-weight:700}
/* Boutons de société : le même bloc qu'ailleurs — visible en permanence ici,
   parce que cette table N'EST PAS parcourue en survol : on y lit ligne à ligne
   et on agit sur celle qu'on regarde. */
.camp-c-act{display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  white-space:normal;overflow:visible}
.camp-c-act .btn.b4.mini{flex:none}
.camp-head{color:var(--dim);font-size:11px;font-weight:740;letter-spacing:.06em;
  text-transform:uppercase;border-bottom:1px solid var(--line)}
.camp-row:last-child{border-bottom:0}
.camp-cell{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.camp-den{display:flex;align-items:center;gap:6px;font-weight:640}
.camp-fiche-lnk{display:inline-flex;color:var(--dim)}
.camp-fiche-lnk:hover{color:var(--txt)}
.camp-fiche-lnk .ic{width:13px;height:13px}
.camp-email{font-family:ui-monospace,monospace;font-size:12px;color:var(--muted)}
.camp-ecartee{opacity:.5}
.camp-table-vide{padding:22px;text-align:center}
.camp-more-wrap{display:flex;justify-content:center;padding:12px}
.camp-edited{margin-left:8px;font-size:11px}

/* Case d'envoi : zone de 34 px, clic qui ne remonte pas à la ligne */
.camp-cell-check{display:grid;place-items:center;width:34px;height:34px;cursor:pointer}
.camp-check,.camp-check-all,.camp-confirm-check{width:15px;height:15px;accent-color:var(--accent)}
.camp-check-all-wrap{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:12.5px}

/* Statuts + motifs d'exclusion (badges) */
.camp-st{padding:3px 10px;border-radius:999px;font-size:11px;font-weight:720;
  background:rgba(255,255,255,.09)}
.camp-st-pret{color:#9fc8ff}
.camp-st-envoye{color:#7fd7a0}
.camp-st-echec{color:#ff8d7a}
.camp-st-exclu{color:var(--dim)}
.camp-st-repondu{color:var(--accent)}
.camp-st-desinscrit{color:var(--warn,#e8a13c)}
.camp-motif{margin-left:6px;font-size:11px;color:var(--muted);font-style:italic}
.camp-result-ok{color:#7fd7a0;font-size:12px;font-weight:680}
.camp-result-fail{color:#ff8d7a;font-size:12px;font-weight:680;white-space:normal}

/* ---------- Étape 3 : message ------------------------------------------------ */
.camp-msg-mode{margin:0;font-size:13.5px}
.camp-msg-why{cursor:help;text-decoration:underline dotted}
.camp-msg-h{margin:8px 0 0;font-size:14px}

/* ---- Pièces jointes de la campagne (20/08/2026) ---------------------------
   Même grammaire que les pièces de l'écran Mails (mails.css) : une puce par
   fichier, nom tronqué, poids en chiffres tabulaires. La croix de retrait est
   séparée du lien de téléchargement — deux gestes très différents ne doivent
   pas partager la même cible. */
.camp-pieces-box{display:flex;flex-direction:column;gap:7px;margin-top:10px}
.camp-pieces-avert{margin:0;font-size:12px;line-height:1.5}
.camp-pieces{display:flex;flex-wrap:wrap;align-items:center;gap:7px}
.camp-pieces-vide{margin:0;font-size:12.5px;line-height:1.5}
.camp-piece-wrap{display:inline-flex;align-items:center;
  border-radius:999px;border:1px solid var(--line);
  background:rgba(255,255,255,.05)}
.camp-piece{display:inline-flex;align-items:center;gap:6px;padding:4px 8px 4px 10px;
  font-size:12px;color:var(--txt);text-decoration:none;min-width:0}
.camp-piece:hover{color:var(--accent-ink)}
.camp-piece .ic{width:13px;height:13px;flex:none;color:var(--dim)}
.camp-piece-nom{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  max-width:220px}
.camp-piece-poids{font-size:11px;flex:none}
.camp-piece-x{display:grid;place-items:center;width:20px;height:20px;
  margin-right:5px;padding:0;border:none;border-radius:50%;background:none;
  color:var(--dim);cursor:pointer}
.camp-piece-x:hover{color:var(--danger);
  background:color-mix(in srgb, var(--danger) 18%, transparent)}
.camp-piece-x .ic{width:11px;height:11px;color:inherit}
.camp-pieces-total{font-size:11.5px}
.camp-piece-input{display:none}
.camp-pieces-bar{display:flex;gap:8px;align-items:center}
.camp-apercu-sujet{margin:6px 0}
.camp-apercu-corps{white-space:pre-wrap;font-family:ui-monospace,monospace;
  font-size:12px;line-height:1.55;background:rgba(0,0,0,.25);border-radius:12px;
  padding:14px;overflow-x:auto}

/* Éditeur d'un destinataire */
.camp-editor{margin:4px 0 10px}
.camp-editor .inner2{display:flex;flex-direction:column;gap:10px;padding:14px 16px}
.camp-editor-head{font-size:13.5px}
.camp-edit-sujet{width:100%;padding:9px 12px;border-radius:11px;border:1px solid var(--line);
  background:rgba(255,255,255,.07);color:var(--txt);font:inherit;font-size:13px}
.camp-edit-corps{width:100%;resize:vertical;padding:12px;border-radius:11px;
  border:1px solid var(--line);background:rgba(255,255,255,.07);color:var(--txt);
  font-family:ui-monospace,monospace;font-size:12.5px;line-height:1.55}
.camp-footer-note{font-size:12px}
.camp-editor-bar{display:flex;justify-content:flex-end;gap:10px}

/* 400 banned_terms : badge rouge + termes en évidence dans le corps */
.camp-banned{border:1px solid rgba(255,141,122,.5);border-radius:12px;padding:12px;
  display:flex;flex-direction:column;gap:8px;background:rgba(255,60,40,.08)}
.camp-banned-badge{display:flex;align-items:center;gap:8px;color:#ff8d7a;
  font-size:12.5px;font-weight:700}
.camp-banned-badge .ic{width:15px;height:15px}
.camp-banned-marked{white-space:pre-wrap;font-family:ui-monospace,monospace;
  font-size:12px;line-height:1.55;max-height:220px;overflow:auto}
.camp-term{background:rgba(255,90,60,.45);color:#fff;border-radius:4px;padding:0 3px}

/* ---------- Étape 4 : envoi -------------------------------------------------- */
.camp-send-bar{gap:14px}
.camp-stats{display:flex;gap:6px;flex-wrap:wrap}

/* Modale récapitulative — le bouton n'est armé que par la case de confirmation */
.camp-send-modal .modal-body{display:flex;flex-direction:column;gap:10px}
.camp-send-list{margin:0;padding-left:18px;max-height:220px;overflow:auto;
  font-size:13px;line-height:1.6}
.camp-send-meta,.camp-quota-note{margin:0;font-size:12.5px;line-height:1.5}
.camp-confirm-wrap{display:flex;align-items:center;gap:8px;cursor:pointer;
  font-size:13px;font-weight:650;padding:8px 0}
.camp-send-go[disabled]{opacity:.45;cursor:not-allowed}

@media (max-width:760px){
  .camp-grid{grid-template-columns:1fr}
  .camp-panel-bar{align-items:stretch;flex-direction:column}
}

/* Titre de la campagne ouverte quand le module est monté en ONGLET
   (17/08/2026) : la coquille porte « Campagne » (h1), il faut quand même
   savoir LAQUELLE on relit avant d'envoyer — d'où un h2 sobre. */
.camp-nom-encastre{margin:0 0 12px;font-size:19px;font-weight:760;
  letter-spacing:-.01em;line-height:1.25}
