/* ===== Ajouts V2 (le design system V1 reste la référence) ===== */
#support-banner{background:var(--red);color:#fff;font-weight:700;font-size:12.5px;padding:8px 20px;display:flex;gap:14px;align-items:center;position:sticky;top:0;z-index:200}
#support-banner .btn{background:#fff;color:var(--red);padding:4px 12px}
#toasts{position:fixed;bottom:20px;right:20px;z-index:300;display:flex;flex-direction:column;gap:8px}
.toast{background:var(--navy);color:#fff;border-radius:10px;padding:10px 16px;font-size:12.5px;box-shadow:0 8px 30px rgba(22,33,66,.35);max-width:380px}
.toast.err{background:var(--red)}.toast.ok{background:var(--green)}
/* Login */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--navy) 0%,var(--purple) 100%);width:100%}
.login-card{background:#fff;border-radius:16px;padding:34px 38px;width:400px;max-width:92vw;box-shadow:0 30px 80px rgba(0,0,0,.35)}
.login-card .logo2{display:flex;align-items:center;gap:10px;margin-bottom:18px}
.login-card .logo2 .dot{width:14px;height:14px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 5px rgba(198,22,141,.2)}
.login-card h1{font-size:20px;color:var(--navy);margin:0}
.login-tabs{display:flex;gap:6px;margin:14px 0}
.demo-hint{background:var(--bg);border-radius:10px;padding:10px 12px;font-size:11px;color:var(--text-soft);margin-top:14px;line-height:1.7}
/* Breadcrumbs / toggle / états */
.crumbs{font-size:11.5px;color:var(--muted);margin-bottom:12px}
.crumbs b{color:var(--navy)}
.viz-toggle{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;margin-left:auto}
.viz-toggle button{border:none;background:#fff;padding:4px 12px;font-family:var(--font);font-size:11px;font-weight:600;color:var(--text-soft);cursor:pointer}
.viz-toggle button.on{background:var(--navy);color:#fff}
.loading{padding:40px;text-align:center;color:var(--muted)}
.loading::after{content:'…';animation:pulse 1s infinite}
@keyframes pulse{50%{opacity:.3}}
.searchbar{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.searchbar input,.searchbar select{border:1px solid var(--line);border-radius:8px;padding:6px 10px;font-family:var(--font);font-size:12px}
.chip{display:inline-block;background:var(--pink);color:var(--brand-dark);border-radius:14px;padding:2px 10px;font-size:10.5px;font-weight:700}
.chip.navy{background:#e4e9f5;color:var(--navy)}
.timeline{border-left:2px solid var(--pink);margin-left:8px;padding-left:16px}
.timeline .tl-item{position:relative;padding-bottom:12px}
.timeline .tl-item::before{content:'';position:absolute;left:-21px;top:4px;width:8px;height:8px;border-radius:50%;background:var(--brand)}
.timeline .tl-date{font-size:10.5px;color:var(--muted);font-weight:700}
.status-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:5px}
.st-on_track{background:var(--green)}.st-warning{background:var(--orange)}.st-late{background:var(--red)}.st-no_data{background:var(--muted)}
.scenario-active{border:2px solid var(--brand) !important;position:relative}
.scenario-active::after{content:'SCÉNARIO ACTIF';position:absolute;top:-9px;right:14px;background:var(--brand);color:#fff;font-size:9px;font-weight:800;letter-spacing:1px;padding:2px 8px;border-radius:8px}
.mapping-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;max-width:520px}

/* ---- Bandeau d'orientation du tableau de bord ---- */
.ctx-band{border-left:3px solid var(--brand)}
.ctx-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px}
.ctx-item .ctx-k{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:#8a8d93}
.ctx-item .ctx-v{font-size:15px;font-weight:700;color:var(--navy);margin-top:2px}
.ctx-item .ctx-s{font-size:10.5px;color:#6b6e74;margin-top:1px}
.ctx-foot{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:12px;padding-top:10px;border-top:1px solid var(--line)}
.lnk{color:var(--brand);cursor:pointer;text-decoration:underline}

/* ---- Débordement horizontal (constaté en recette navigateur à 1280, 1024 et 390 px) ----
   Un élément de grille ou de flex ne peut pas, par défaut, devenir plus étroit
   que son contenu (min-width:auto). Un tableau large poussait donc la page
   entière vers la droite au lieu de défiler dans son conteneur .tblwrap, qui
   est pourtant déjà en overflow-x:auto. On autorise le rétrécissement. */
.grid > *, .flex > *{min-width:0}
#mainwrap, #main{min-width:0}

/* ============================================================================
   COUPURE DU TEXTE — un système, pas une règle unique
   ----------------------------------------------------------------------------
   CE QUI S'EST PASSÉ. Pour empêcher un tableau large de pousser la page vers la
   droite, `.card` portait `overflow-wrap:anywhere`. La correction fonctionnait,
   mais `anywhere` a un effet de bord rarement mesuré : contrairement à
   `break-word`, il MODIFIE LA TAILLE INTRINSÈQUE MINIMALE du contenu. La largeur
   minimale d'une colonne devient celle d'UN CARACTÈRE, et l'algorithme de
   tableau se croit alors autorisé à la comprimer autant qu'il veut — même quand
   la place ne manque pas. D'où « ORGANISATI / ON », « UTILISATE / URS »,
   « STAT / UT », « Essent / ial », sur une page à moitié vide.

   `break-word` conserve le même filet de sécurité pour une chaîne réellement
   insécable (un identifiant, une URL) SANS toucher au calcul de largeur : la
   largeur minimale reste celle du plus long MOT. C'est toute la correction de
   fond ; le reste ci-dessous rend la règle explicite là où elle compte.
   ========================================================================== */

/* Texte courant : coupure entre les mots ; à l'intérieur d'un mot uniquement
   quand il ne tient de toute façon pas, et sans influencer la mise en page. */
.card{overflow-wrap:break-word;word-break:normal;hyphens:none}

/* En-têtes de tableau : deux lignes propres valent mieux qu'une coupure. On
   interdit explicitement la coupure interne — un en-tête est un libellé court,
   il se lit ou ne se lit pas. `vertical-align:bottom` aligne les en-têtes d'une
   et de deux lignes sur la même ligne de base. */
.tbl th{overflow-wrap:normal;word-break:normal;hyphens:none;vertical-align:bottom}

/* Cellules : coupure naturelle entre les mots, jamais au milieu de l'un d'eux.
   Une valeur sans aucune espace (identifiant, URL) reste gérée par le filet de
   `.card` ci-dessus. */
.tbl td{overflow-wrap:break-word;word-break:normal;hyphens:none}

/* Étiquettes courtes : elles ne se coupent pas. Un badge « Lecture seule » sur
   deux lignes cesse d'être un badge, et « Essent / ial » ne veut rien dire.
   Leur largeur naturelle est leur largeur : c'est à la colonne de s'adapter. */
.badge, .chip, .btn, .tab, .status-dot + .badge{white-space:nowrap}

/* Le libellé d'un en-tête triable peut passer à la ligne entre ses mots.
   L'indicateur de tri reste À CÔTÉ du libellé, jamais renvoyé seul sur une ligne
   en dessous : un glyphe orphelin sous un en-tête donne l'impression d'une
   troisième ligne vide. Il se centre donc verticalement contre le bloc de
   texte, qu'il fasse une ou deux lignes. */
.tbl th.sortable > button{flex-wrap:nowrap;align-items:center}
.tbl th.sortable > button > span:first-child{
  overflow-wrap:normal;word-break:normal;min-width:0}
.tbl th.sortable .sort-ic{flex:0 0 auto}

/* Colonne d'actions : plusieurs boutons y cohabitent. Ils passent proprement à
   la ligne — c'est le conteneur qui se replie, jamais le texte des boutons. */
.tbl td .btn{margin:1px 0}

/* ---- Écrans étroits (constaté en recette navigateur à 390 px) ----
   La barre supérieure est une ligne flex qui ne se replie pas : le nom de
   l'utilisateur et le bouton de déconnexion sortaient de l'écran. On autorise
   le passage à la ligne ; l'espaceur force la coupure au bon endroit. */
@media(max-width:760px){
  #topbar{flex-wrap:wrap;gap:8px 10px;padding:10px 14px}
  #topbar .spacer{flex:0 0 100%;height:0}
  #topbar h1{font-size:15px}
  #main{padding:16px 14px 48px}
  .card{padding:14px 14px}
}


/* ---- Offre & capacité (V3) ---- */
.cap-row{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;padding:9px 0;border-bottom:1px solid var(--line)}
.cap-row:last-child{border-bottom:none}
.cap-name{font-size:12.5px;color:var(--navy);font-weight:600}
.cap-sub{font-size:10.5px;color:#6b6e74}
.cap-val{font-size:12.5px;font-weight:700;color:var(--navy);white-space:nowrap}
.cap-bar{grid-column:1/-1;height:6px;border-radius:4px;background:#eef1f7;overflow:hidden}
.cap-bar span{display:block;height:100%;background:var(--brand);border-radius:4px}
.cap-bar.warn span{background:var(--orange,#e08a00)}
.cap-bar.over span{background:var(--red,#d64545)}
.plan-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:14px}
.plan-card{border:1px solid var(--line);border-radius:var(--radius);padding:16px;background:var(--card);position:relative;display:flex;flex-direction:column}
.plan-card.reco{border:2px solid var(--brand)}
.plan-card .badge-reco{position:absolute;top:-10px;left:14px;background:var(--brand);color:#fff;font-size:9px;font-weight:800;letter-spacing:.8px;padding:2px 9px;border-radius:8px}
.plan-name{font-size:15px;font-weight:800;color:var(--navy)}
.plan-tag{font-size:10.5px;color:#6b6e74;min-height:28px;margin-top:2px}
.plan-price{font-size:22px;font-weight:800;color:var(--navy);margin:8px 0 0}
.plan-price .u{font-size:11px;font-weight:600;color:#6b6e74}
.plan-alt{font-size:10.5px;color:#6b6e74}
.plan-fee{font-size:10.5px;color:#6b6e74;margin-top:6px;padding-top:6px;border-top:1px solid var(--line)}
.plan-caps{list-style:none;padding:0;margin:10px 0 0;font-size:11.5px;color:#3d3f44}
.plan-caps li{padding:3px 0}
.plan-current{margin-top:auto;padding-top:10px}

/* ---- Sélecteur d'organisation (B6.1) ----
   Le nom de l'organisation reste au même endroit et dans le même ton qu'avant :
   quand plusieurs organisations sont accessibles, il devient sélectionnable
   sans changer de place ni de poids visuel. */
#topbar .org-switch{display:inline-flex;align-items:center}
#topbar .org-switch select{
  font:inherit;font-size:12px;font-weight:600;color:var(--navy);
  background:transparent;border:1px solid var(--line);border-radius:8px;
  padding:3px 24px 3px 9px;max-width:230px;cursor:pointer;
  appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23585a5e' stroke-width='1.5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 8px center;
}
#topbar .org-switch select:hover{border-color:var(--brand)}
#topbar .org-switch select:focus{outline:2px solid var(--brand);outline-offset:1px}
@media (max-width:720px){ #topbar .org-switch select{max-width:130px} }
@media print{ #topbar .org-switch select{border:none;appearance:none;background-image:none;padding-left:0} }
/* Libellé réservé aux lecteurs d'écran : le champ doit être nommé sans
   alourdir une barre d'en-tête déjà dense. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ============================================================================
   TABLEAUX TRIABLES ET LIGNES CLIQUABLES
   ----------------------------------------------------------------------------
   Additif : `.tbl` est défini dans v1.css, artefact gelé. On ne redéfinit rien,
   on ajoute seulement les états que la V1 ne connaissait pas.
   ========================================================================== */

/* En-tête triable : le bouton porte l'interaction (focus clavier natif,
   activation par Entrée et Espace sans code). Il hérite de la typographie du
   `th` V1 pour que le tableau garde exactement son allure. */
.tbl th.sortable{padding:0}
.tbl th.sortable > button{
  width:100%;display:flex;align-items:center;gap:5px;
  font:inherit;color:inherit;letter-spacing:inherit;text-transform:inherit;
  background:none;border:0;padding:7px 9px;cursor:pointer;text-align:inherit;
  border-radius:6px;
}
.tbl th.sortable.num > button{justify-content:flex-end}
.tbl th.sortable > button:hover{color:var(--navy)}
.tbl th.sortable > button:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
/* Colonne triée : le libellé s'assombrit, l'indicateur devient plein. */
.tbl th.sortable[aria-sort="ascending"] > button,
.tbl th.sortable[aria-sort="descending"] > button{color:var(--navy)}

/* Indicateur discret : présent partout pour annoncer que la colonne est
   triable, très effacé tant qu'elle ne l'est pas. */
.tbl th.sortable .sort-ic{font-size:8.5px;line-height:1;opacity:.25;transition:opacity .12s}
.tbl th.sortable > button:hover .sort-ic{opacity:.55}
.tbl th.sortable[aria-sort="ascending"] .sort-ic,
.tbl th.sortable[aria-sort="descending"] .sort-ic{opacity:1;color:var(--brand)}

/* Ligne cliquable : survol plus marqué que le survol de tableau V1, et repère
   clavier explicite — la ligne est atteignable au Tab. */
.tbl tr.rowlink{cursor:pointer}
.tbl tr.rowlink:hover td{background:#eef3fc}
.tbl tr.rowlink:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
.tbl tr.rowlink:focus-visible td{background:#eef3fc}
/* Ligne dont la fiche est ouverte : repérable même après avoir fait défiler. */
.tbl tr.is-selected td{background:#fdf0f8;box-shadow:inset 3px 0 0 var(--brand)}
.tbl tr.is-selected:hover td{background:#fbe6f3}

@media print{
  .tbl th.sortable .sort-ic{display:none}
  .tbl tr.is-selected td{box-shadow:none}
}

/* ---- Classement et dispersion (B6.3.3) ----------------------------------
   Le rang se lit d'un coup d'oeil, la valeur se verifie a droite, et la ligne
   de dispersion reste en petit : c'est un commentaire du classement, pas un
   second classement. L'organisation ouverte est mise en evidence pour qu'on se
   situe sans chercher son nom dans la liste. */
.rk-blk{padding:12px 0;border-bottom:1px solid #eef1f7}
.rk-blk:last-of-type{border-bottom:0}
.rk-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.rk-list{list-style:none;margin:0;padding:0}
.rk-list li{display:flex;align-items:center;gap:10px;padding:3px 0}
.rk-n{flex:0 0 22px;height:22px;line-height:22px;text-align:center;border-radius:11px;
  background:#eef3fc;color:var(--navy);font-size:11px;font-weight:600}
.rk-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rk-name.is-me{font-weight:600;color:var(--navy)}
.rk-v{flex:0 0 auto;font-variant-numeric:tabular-nums}
.rk-disp{margin-top:6px;color:#6b7280}

/* ============================================================================
   ÉTATS D'INTERACTION ET LISTES — additifs
   ----------------------------------------------------------------------------
   `v1.css` est gelé : il définit l'apparence au repos et le survol des boutons,
   mais ni le repère clavier, ni l'état actif, ni l'état désactivé. On ne
   redéfinit rien — on ajoute les états manquants.
   ========================================================================== */

/* Repère clavier unique pour tout ce qui s'active. `:focus-visible` ne se
   déclenche qu'à la navigation clavier : la souris ne dessine pas de contour. */
.btn:focus-visible,
.tab:focus-visible,
.searchbar select:focus-visible,
.searchbar input:focus-visible{
  outline:2px solid var(--brand);outline-offset:2px;
}
.btn:active{transform:translateY(1px)}
.btn:disabled,.btn[aria-disabled="true"]{
  opacity:.45;cursor:not-allowed;transform:none;
}
.btn:disabled:hover,.btn[aria-disabled="true"]:hover{background:var(--brand)}
.btn.sec:disabled:hover,.btn.sec[aria-disabled="true"]:hover{background:var(--card)}
/* Action en cours : le bouton reste lisible et cesse de réagir au survol. */
.btn[aria-busy="true"]{opacity:.65;cursor:progress}
.btn[aria-busy="true"]::after{content:'…'}

/* Onglets — désormais de vrais boutons, donc atteignables au Tab et activables
   à Entrée et Espace sans une ligne de JavaScript. `v1.css` les stylait pour un
   <span> : on neutralise ce que le navigateur impose à un <button>. */
.tabs .tab{
  font-family:var(--font);line-height:1.45;appearance:none;
  transition:background .12s,border-color .12s,color .12s;
}
.tabs .tab:hover:not(.active){background:var(--bg);border-color:var(--muted)}
.tabs .tab:active{transform:translateY(1px)}

/* Ligne de liste — ce motif était recopié en dix endroits sous forme de style
   en ligne. Une seule définition, un seul endroit où le faire évoluer. */
.list-row{padding:10px 0;border-bottom:1px solid var(--line-soft)}
.list-row:last-child{border-bottom:none}
.list-row.compact{padding:7px 0}
.list-row .rt{color:var(--navy);font-weight:700}
.list-row .rh{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}

/* Teinte de séparation, jusqu'ici écrite en dur treize fois. */
:root{--line-soft:#eef1f7}
/* Rang dans une liste de priorités : la couleur de marque porte le repère. */
.list-row .rn{color:var(--brand);font-size:15px;font-weight:700}

/* ---- Lecture seule sur impayé (D-4) ----
   Ton d'AVERTISSEMENT, pas d'erreur : le client n'a rien fait de mal et n'a
   rien perdu. Le rouge du bandeau de support signale une intervention en cours
   chez un client ; ici il dramatiserait une situation réversible. */
#readonly-banner{background:var(--orange-bg);color:#7a4a00;border-bottom:1px solid var(--orange);
  font-weight:600;font-size:12.5px;padding:8px 20px;position:sticky;top:0;z-index:190}
@media(max-width:760px){ #readonly-banner{padding:8px 14px;font-size:12px} }
@media print{ #readonly-banner{position:static} }

/* ---- Capacités de liste : recherche, filtres, pagination ------------------
   La barre se replie naturellement sur écran étroit ; les boutons d'export
   restent atteignables plutôt que d'être poussés hors de vue. */
.grid-bar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.grid-bar input,.grid-bar select{border:1px solid var(--line);border-radius:8px;
  padding:6px 10px;font-family:var(--font);font-size:12px;color:var(--text);background:var(--card)}
.grid-bar input[type="search"]{min-width:190px;flex:1 1 190px;max-width:320px}
.grid-bar input[type="number"]{width:104px}
.grid-bar select{max-width:230px}
.grid-bar .grid-range{display:inline-flex;gap:6px;align-items:center}
.grid-bar .grid-exports{display:inline-flex;gap:6px;margin-left:auto}
.grid-bar select.grid-multi{min-height:30px}

.grid-pager{display:flex;gap:4px;align-items:center;flex-wrap:wrap;margin-top:12px;
  padding-top:10px;border-top:1px solid var(--line-soft)}
.grid-pager .grid-range-lbl{font-size:11.5px;color:var(--text-soft);margin-right:auto}
.grid-pager .btn{min-width:30px;justify-content:center}
.grid-pager .grid-gap{color:var(--muted);padding:0 2px}
/* Le compteur accompagne le titre : c'est la première chose qu'on cherche. */
.grid-count{font-size:11.5px;font-weight:600;color:var(--text-soft);margin-left:8px}

@media(max-width:760px){
  .grid-bar .grid-exports{margin-left:0;width:100%}
  .grid-bar input[type="search"]{max-width:none}
}
.grid-bar .grid-range-name{font-size:11px;color:var(--text-soft);font-weight:600}
.grid-bar input[type="number"]{width:74px}

/* ============================================================================
   ROADMAP — CONTROL TOWER
   ----------------------------------------------------------------------------
   Une trajectoire se lit d'un coup d'œil ou ne se lit pas. Le tableau de huit
   lignes qui précédait obligeait à reconstruire mentalement l'ordre des phases.
   La frise le montre, et les huit phases tiennent dans la largeur d'un écran
   standard ; en dessous, elle défile horizontalement dans son conteneur plutôt
   que d'écraser les cartes jusqu'à l'illisible.
   ========================================================================== */
.rm-timeline{display:flex;gap:0;overflow-x:auto;padding:6px 2px 10px;align-items:stretch}
/* 130 px : les huit phases tiennent dans la largeur d'une carte sur un écran
   standard. Au-delà de cette limite, la frise défile dans son conteneur plutôt
   que d'écraser les cartes — mais l'écran large, lui, montre TOUT, ce qui est
   la condition d'une lecture en quelques secondes. */
.rm-slot{flex:1 1 0;min-width:130px;position:relative;display:flex}
/* Le trait qui relie les phases : c'est lui qui dit « trajectoire » plutôt que
   « liste de cartes ». Il s'arrête à la dernière. */
.rm-slot:not(:last-child)::after{content:'';position:absolute;top:26px;right:-1px;
  width:10px;height:2px;background:var(--line);z-index:1}

.rm-phase{flex:1;display:flex;flex-direction:column;gap:5px;text-align:left;
  background:var(--card);border:1px solid var(--line);border-radius:12px;
  margin:0 3px;padding:10px 9px 11px;cursor:pointer;font-family:var(--font);
  transition:border-color .12s,box-shadow .12s}
.rm-phase:hover{border-color:var(--brand)}
.rm-phase:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
/* La phase en cours se repère sans lire : c'est la première question posée. */
.rm-phase.is-now{border-color:var(--brand);box-shadow:0 0 0 1px var(--brand) inset}
.rm-phase.is-open{border-color:var(--navy);box-shadow:0 0 0 1px var(--navy) inset}
.rm-ph-head{display:flex;align-items:center;justify-content:space-between;gap:6px}
.rm-ph-code{font-size:15px;font-weight:800;color:var(--navy);letter-spacing:.5px}
/* `min-width:0` sur la carte et ses enfants : sans cela, un nom long impose sa
   largeur minimale (min-width:auto) et pousse la frise au défilement alors
   qu'elle tiendrait. Les huit phases doivent se voir d'un seul regard. */
.rm-phase, .rm-phase > *{min-width:0}
.rm-ph-name{font-size:11px;color:var(--text-soft);line-height:1.35;min-height:30px;
  overflow-wrap:break-word}
.rm-ph-bar{display:block;height:5px;border-radius:3px;background:#eef1f7;overflow:hidden}
.rm-ph-bar > span{display:block;height:100%;background:var(--brand);border-radius:3px}
.rm-ph-num{font-size:10px;color:var(--muted);font-weight:600}
.rm-streams{display:flex;flex-direction:column;gap:2px;margin-top:3px}
.rm-stream{font-size:10.5px;color:var(--text-soft);display:flex;align-items:center;gap:4px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rm-flags{display:flex;flex-wrap:wrap;gap:3px;margin-top:4px}
.rm-flag{font-size:9.5px;font-weight:700;border-radius:6px;padding:1px 6px;white-space:nowrap}
.rm-f-block{background:#fde8e8;color:#a12626}
.rm-f-dec{background:var(--orange-bg);color:#7a4a00}
.rm-f-risk{background:#f3e8fd;color:#5b2b86}

/* Pastilles de statut : la couleur porte, le glyphe redouble — un daltonien
   distingue ● de ■ et de ○ sans dépendre de la teinte. */
.rm-dot{font-size:11px;line-height:1;flex:0 0 auto}
.rm-ok{color:var(--green)}.rm-now{color:var(--brand)}.rm-next{color:var(--navy)}
.rm-later{color:var(--muted)}.rm-exp{color:var(--orange)}.rm-blocked{color:var(--red)}
.rm-defer{color:var(--muted)}.rm-off{color:var(--muted)}
.rm-legend{display:flex;gap:10px;flex-wrap:wrap;margin-left:auto;align-items:center}
.rm-lg{font-size:10.5px;color:var(--text-soft);display:flex;align-items:center;gap:3px;white-space:nowrap}

/* Voies maintenant / ensuite / plus tard : cinq colonnes de lecture rapide. */
.rm-lanes{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
.rm-lane{background:var(--bg);border-radius:10px;padding:10px}
.rm-lane-maintenant{background:#fdf0f8}
.rm-lane-bloque{background:#fdeeee}
.rm-lane-h{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;margin-bottom:8px}
.rm-lane-h b{color:var(--navy);font-size:12.5px}
.rm-lane-n{margin-left:auto;font-size:11px;font-weight:700;color:var(--text-soft)}
.rm-card{background:var(--card);border-radius:8px;padding:7px 9px;margin-bottom:6px;
  border:1px solid var(--line)}
.rm-card-t{font-size:11.5px;color:var(--navy);margin-left:4px}
.rm-card-n{color:var(--text-soft);margin-top:2px}
.rm-empty{font-size:11px;color:var(--text-soft);font-style:italic;padding:6px 2px}

.rm-detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:6px}
.rm-h3{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);
  margin:14px 0 4px;font-weight:700}
.rm-h3:first-child{margin-top:0}
.rm-chain{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.rm-arrow{color:var(--brand);font-weight:700}

@media(max-width:900px){
  .rm-detail-grid{grid-template-columns:1fr}
  .rm-slot{min-width:150px}
}
@media print{ .rm-timeline{overflow:visible} .rm-legend{display:none} }
/* Lecture de la trajectoire : des puces, pas un formulaire. Deux axes — le
   public concerné et le statut — suffisent à filtrer sans faire perdre la vue
   d'ensemble, qui est la raison d'être de cet écran. */
.rm-filters{display:flex;gap:5px;flex-wrap:wrap;align-items:center;margin:2px 0 12px}
.rm-f-lbl{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--muted);font-weight:700;margin-right:4px}
.rm-f-sep{width:1px;height:18px;background:var(--line);margin:0 5px}
.rm-f-count{margin-left:auto;font-size:11px;color:var(--text-soft);font-weight:600}
.rm-chip{background:var(--card);border:1px solid var(--line);border-radius:14px;
  padding:3px 11px;font-family:var(--font);font-size:11px;font-weight:600;
  color:var(--text-soft);cursor:pointer;white-space:nowrap;transition:all .12s}
.rm-chip:hover{border-color:var(--brand);color:var(--navy)}
.rm-chip:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.rm-chip.is-on{background:var(--navy);border-color:var(--navy);color:#fff}
