:root{
  /* LA LARGEUR DE LA PAGE -- une seule valeur, cinq endroits la lisent (voir plus bas).
     980px etait une colonne de LECTURE : bonne pour du texte, couteuse pour un tableau de
     suivi. Demande de Frederick, 29 aout 2026 : « un rendu plein ecran ».
     Au-dela de 1600px la ligne cesse de s allonger : un paragraphe y devient penible et les
     colonnes se perdent. Pour changer d avis, c est ICI et nulle part ailleurs. */
  --largeur-page: min(1600px, 96vw);
  --panel-bg: #16181c;
  --panel-face: #1f2227;
  --panel-face-2: #24272d;
  --hairline: #33373f;
  --amber: #ffb200;
  --amber-dim: #8a6200;
  --green: #4fd68a;
  --red: #ff5c5c;
  --blue: #6fa8ff;
  --grey-text: #9aa0ab;
  --white-text: #eef0f3;
  /* LE FOND DU PANNEAU DE MENU, SEUL -- constat du 27 aout 2026 : "le fond du menu devrait etre
     plus pale pour bien differencier le popup du fond d'ecran". Mesure : `.nav-menu-panel`
     utilisait `var(--panel-face)` (#1f2227) au-dessus d'un corps de page qui vaut #1c1f24 pres du
     coin ou le panneau s'ouvre (le sommet du degrade radial du `body`, voir plus bas) -- un
     rapport de contraste WCAG de 1,04:1, soit visuellement confondu. Cette variable est DEDIEE au
     panneau de menu, et n'est PAS `--panel-face` : cette derniere est partagee par `.panel`,
     `.aircraft-switcher` et le popup de nouveautes sur toutes les pages -- l'elargir aurait
     reclaire vingt-huit ecrans pour corriger un seul. #414855 porte le panneau a 1,8:1 contre le
     coin superieur du degrade (verifie par scripts/essai-nav-menu-contraste.js, qui rejoue la
     VRAIE feuille de style dans un Chromium et exige >=1,6 avec marge). Le texte ambre des liens
     (--amber, #ffb200) y garde un contraste de ~5,1:1 -- toujours lisible, mesure dans le meme
     essai. */
  --nav-menu-panel-bg: #414855;
  /* LE SELECTEUR D'AERONEF, SEUL -- constat du 27 aout 2026, personne independante : "grossir le
     dropdown de selection d'avion pour qu'il soit visible". C'est le controle le PLUS utilise du
     produit (aircraft.html, tracking.html, certifications.html, documents.html) : tout ce qui
     s'affiche depend de quel appareil y est choisi. Mesure AVANT correctif, Chromium reel, aux
     deux largeurs (scripts/essai-dropdown-avion.js) : 32px de haut, police 12.5px, fond
     `var(--panel-face)` (#1f2227) contre le sommet du degrade du `body` (#1c1f24) -- un contraste
     de 1,04:1, EXACTEMENT le meme defaut mesure ce jour-la sur le panneau de menu (voir
     --nav-menu-panel-bg juste au-dessus). Cette variable est DEDIEE au selecteur d'aeronef et
     n'est PAS `--panel-face`, qui reste partagee par `.panel` et le popup de nouveautes sur
     vingt-huit ecrans -- meme raisonnement que pour --nav-menu-panel-bg, meme valeur deja mesuree
     a 1,8:1 contre ce fond (essai-nav-menu-contraste.js), reprise ici plutot qu'une troisieme
     couleur inventee sans mesure. */
  --aircraft-switcher-bg: #414855;
}
*{box-sizing:border-box;}
/* « HIDDEN » VEUT DIRE CACHE -- une seule fois, pour tout le produit.

   La regle du navigateur est `[hidden] { display:none }`, de specificite (0,1,0). N IMPORTE
   QUEL `display` ecrit ailleurs la bat : un style en ligne toujours, un selecteur d id
   (1,0,0) aussi. Le 7 septembre 2026, `#lot-barre` du questionnaire d equipement portait
   `hidden` ET `style="display:flex"` : `barre.hidden = true` n a rien cache, la barre est
   restee a l ecran avec zero case cochee (78 px mesures), et son script sortait avant
   d ecrire les libelles. Frederick a lu TROIS BOUTONS VIDES sur un ecran de navigabilite.

   Mesure avant de poser la regle : 2 noeuds portent `hidden` dans tout public/*.html, et
   AUCUN script ne les rend visibles en ecrivant `style.display` -- personne ne perd rien.
   Le garde derive vit dans scripts/essai-297-repondre-en-bloc.js (section 8). */
[hidden]{display:none !important;}
body{
  margin:0;
  background: radial-gradient(ellipse at top, #1c1f24 0%, #101216 60%);
  color:var(--white-text);
  font-family:'Inter',sans-serif;
  min-height:100vh;
  padding:0 0 60px 0;
}
.rivet-strip{
  height:10px;
  background:repeating-linear-gradient(90deg, #2a2d33 0 6px, #16181c 6px 14px);
  border-bottom:1px solid var(--hairline);
}
/* ⚠ LA PLEINE LARGEUR EST UNE EXCEPTION NOMMÉE, PAS UN NOUVEAU DÉFAUT.

   `min(1600px, 96vw)` protège la LISIBILITÉ : une ligne de texte de 1900 px ne se lit pas, et
   la plupart des écrans du produit sont faits pour être lus. Les compléments d'aéronef, eux,
   portent des tableaux et des listes de décisions à trancher — la marge leur coûte de la place
   utile sans rien leur rendre. Frederick l'a demandé le 31 août 2026.

   ON REDÉFINIT LA VARIABLE plutôt que de surcharger chaque bloc : `header`, `main`, `.section`
   et `footer` la lisent tous les quatre. Une surcharge bloc par bloc élargirait le contenu en
   laissant le titre centré à 1600 px au-dessus — un décalage plus voyant que la marge qu'on
   voulait supprimer.

   Le remplissage de 20 px des sections reste : la pleine largeur ne veut pas dire coller au
   bord de l'écran. Mesuré par scripts/essai-largeur-complements.js, qui vérifie AUSSI qu'une
   page sans la classe reste étroite -- sinon « tout élargir » sortirait vert. */
body.pleine-largeur{ --largeur-page: 100%; }

header{ padding:32px 20px 20px; max-width:var(--largeur-page); margin:0 auto; }
/* Mini-menu de changement d'aeronef (aircraft.html/tracking.html) -- demande explicite :
   "pouvoir changer d'avion sans revenir necessairement" a la liste. */
/* GROSSI le 27 aout 2026 -- constat d'une personne independante : "grossir le dropdown de
   selection d'avion pour qu'il soit visible". C'est le controle le plus utilise du produit : tout
   l'ecran depend de quel aeronef y est choisi, et sur telephone (mesure a 390px) c'est la que la
   place manque le plus. AVANT : 32px de haut, police 12.5px, padding 7px 10px, fond confondu au
   fond de page (1,04:1, voir --aircraft-switcher-bg ci-dessus). APRES, mesure par
   scripts/essai-dropdown-avion.js dans un Chromium reel, aux DEUX largeurs (1280 et 390px, le
   controle est en flux, sa hauteur ne depend pas de la largeur d'ecran) : 46px de haut (au-dessus
   du seuil de cible tactile recommande, 44px, Apple/Material), police 15px, fond a 1,8:1 contre
   le fond de page -- et rien ne deborde de l'ecran a 390px (essai-alignement-vertical.js verifie
   le meme genre de depassement ailleurs ; ce script verifie celui-ci). */
.aircraft-switcher{
  margin-top:10px; background:var(--aircraft-switcher-bg); color:var(--white-text); border:1px solid var(--hairline);
  border-radius:6px; padding:12px 14px; font-family:'IBM Plex Mono',monospace; font-size:15px;
  font-weight:600; width:100%; max-width:320px; min-height:44px;
}
.site-logo{
  height:40px; width:auto; display:block; margin-bottom:14px;
}
/* Pied de page -- petit logo FH Aeroservices (l'entreprise editrice) a cote du copyright/de la
   version, voir footer.copyright -- demande explicite de garder ce logo visible mais discret
   maintenant que le gros logo en en-tete de page est celui de ReadyAero (le produit). */
/* Le pied de page tient sur UNE ligne : logo et copyright a gauche, politiques a droite (voir
   .site-footer-links, pousse par margin-left:auto). flex-wrap pour que les liens passent
   proprement en dessous sur un ecran etroit plutot que de deborder. */
.site-footer{ display:flex; align-items:center; gap:10px 18px; flex-wrap:wrap; }
.footer-logo{ height:26px; width:auto; opacity:.85; flex-shrink:0; }
.eyebrow{
  font-family:'IBM Plex Mono',monospace; font-size:11px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--amber); margin-bottom:10px;
}
.eyebrow a{ color:var(--amber); }

/* ================================================================================================
   LA COULEUR DES LIENS — posée le 19 septembre 2026, et elle manquait DEPUIS LE DÉBUT
   ================================================================================================

   📊 MESURE : `a{`, `a:link`, `a:visited` rendaient **0** dans ce fichier. Les **93 liens nus**
      du produit tombaient donc sur le bleu par défaut du navigateur — #0000EE sur un fond
      #16181c. Illisible, et personne ne l'avait dit jusqu'à ce que Frederick le voie sur l'écran
      de masse et centrage : « les bouton bleu ne sont pas visible ».

   🛑 C'EST UNE RÈGLE DE SOURCE, PAS UN CORRECTIF D'ÉCRAN. Corriger les liens de l'écran qui a
      été signalé aurait laissé les 92 autres, et le prochain lien écrit serait né bleu (§ 8 :
      corriger la FORME, jamais l'occurrence).

   📐 L'AMBRE PLUTÔT QU'UN BLEU CLAIR : son contraste est **déjà mesuré** dans ce fichier
      (« ~5,1:1 — toujours lisible »). Un produit lu en hangar, sur un écran que personne
      n'étalonne, ne reçoit pas une couleur choisie au jugé.

   ⚠️ CE QUI N'EST PAS TOUCHÉ, ET POURQUOI. `.btn`, `.btn.secondary` et `.eyebrow a` posent
      **leur propre** `color` : leur spécificité l'emporte, ils gardent exactement leur allure.
      Cette règle ne rattrape que ce qui n'était habillé par personne.

   ⚠️ AUCUN `@media print` N'EXISTE DANS CE FICHIER — vérifié avant de poser la couleur. Les
      documents imprimés sont des PDF fabriqués au serveur ; l'ambre sur blanc n'est donc jamais
      servi par cette règle. */
a{ color:var(--amber); }
a:hover{ text-decoration:underline; }
h1{ font-size:clamp(22px,4vw,32px); margin:0 0 8px; font-weight:800; letter-spacing:-0.01em; }
/* 9 sept. 2026 : 640px cassait « Vue d ensemble de tous tes aeronefs... » au tiers de la
   ligne sur un ecran large, ce qui donnait a l en-tete un air a l etroit alors que la page
   venait de passer en pleine largeur. 900px tient encore sous les ~75 caracteres au-dela
   desquels une ligne devient penible a suivre. */
.sub{ color:var(--grey-text); font-size:14.5px; max-width:900px; line-height:1.55; }
.warning-banner{
  max-width:var(--largeur-page); margin:18px auto 0; padding:12px 16px;
  background:rgba(255,92,92,0.08); border:1px solid rgba(255,92,92,0.35);
  border-radius:6px; font-size:13px; line-height:1.5; color:#ffb3b3;
}
.warning-banner b{color:#ff8080;}

main{ max-width:var(--largeur-page); margin:28px auto 0; padding:0 20px; display:grid; grid-template-columns:1fr; gap:20px; }
main.two-col{ grid-template-columns:1fr; }
@media(min-width:860px){ main.two-col{grid-template-columns: 380px 1fr;} }

/* Fiche aeronef en pleine largeur en haut de aircraft.html (voir demande : liberer la largeur
   pour la liste des AD en dessous) -- info a gauche, boutons d'action a droite sur ecran large,
   empiles sur mobile. */
.fiche-panel{ display:flex; flex-wrap:wrap; gap:24px; align-items:flex-start; }
/* 🛑 LE PLANCHER NE PEUT PAS ETRE PLUS LARGE QUE LA BOITE QUI LE PORTE. `min-width:280px`
   etait un plancher INCONDITIONNEL : a 360 px d ecran, la boite de contenu de `.panel` ne
   fait plus que 278 px (360 - 2x20 de `main` - 2x20 de rembourrage - 2x1 de bordure), et
   263 px des qu une barre de defilement de 15 px prend sa place. Le panneau debordait donc
   de 2 a 17 px selon la barre -- absorbe par le `overflow-x:auto` de `.panel` sous 760 px,
   ce qui en faisait un defilement lateral A L INTERIEUR d une fiche aeronef, jamais rouge
   chez aucun garde puisque la PAGE, elle, ne debordait pas.
   `min()` borne le plancher a la largeur reellement disponible. Au-dessus de 280 px de boite
   -- c est-a-dire des 390 px d ecran, et sur tout ecran de bureau -- il vaut 280 px comme
   avant : le point de bascule a deux colonnes (280 + 24 de gouttiere + 220) ne bouge pas. */
.fiche-panel-info{ flex:2; min-width:min(280px, 100%); }
.fiche-panel-actions{ flex:1; min-width:220px; display:flex; flex-direction:column; }
.fiche-panel-actions .full{ margin-top:8px; }
.fiche-panel-actions .full:first-child{ margin-top:0; }

.section{ max-width:var(--largeur-page); margin:20px auto 0; padding:0 20px; }

/* UNE SECTION DÉJÀ DANS `main` NE REPREND PAS LA GOUTTIÈRE : ELLE L'A DÉJÀ.
   Frederick, 19 août 2026 : « dans la page AD, les boîtes à partir de "partager avec un
   technicien" sont désalignées ». Mesuré sur staging à 1280 px, fiche aéronef :

       main   x=190   Fiche aéronef
       main   x=190   Résultat de l'évaluation
       hors   x=170   Partager avec un technicien      <-- la rupture est ICI
       hors   x=170   AD manquantes

   La cassure tombe exactement sur la balise `</main>`. `main` porte déjà max-width:980px et
   padding:0 20px ; les deux sections QU'IL CONTIENT reprenaient les mêmes 20 px par-dessus, et
   se retrouvaient poussées de 20 px vers l'intérieur. Celles qui suivent, hors du `main`, sont
   au bon endroit -- ce sont les deux premières qui avaient tort.

   `aircraft.html` est le SEUL écran qui imbrique ainsi (vérifié sur les 31 pages) : le
   correctif ne peut donc rien déplacer ailleurs. La marge verticale part aussi, l'espacement
   étant déjà assuré par le `gap:20px` de la grille de `main` -- la garder ajouterait 20 px de
   blanc à chaque section.

   PREMIÈRE VERSION DE CE CORRECTIF : `max-width:none`. Elle alignait bien les bords gauches
   (170 px partout, mesuré) mais faisait passer les panneaux imbriqués de 940 à 1701 px de
   large -- un élément de grille prend sa largeur de son CONTENU quand plus rien ne le borne, et
   `min-width:auto` l'empêche même de rétrécir. Un défaut échangé contre un autre, que seule la
   mesure a montré. `100%` borne à la colonne, `min-width:0` autorise le rétrécissement. */
main > .section{ max-width:100%; min-width:0; margin:0; padding:0; }

.panel{
  background:linear-gradient(180deg, var(--panel-face) 0%, var(--panel-face-2) 100%);
  border:1px solid var(--hairline); border-radius:10px; padding:20px; position:relative;
}
.panel h2{
  font-family:'IBM Plex Mono',monospace; font-size:12px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--grey-text); margin:0 0 16px;
  display:flex; align-items:center; gap:8px;
}
.panel h2::before{ content:""; width:6px;height:6px;border-radius:50%; background:var(--amber); box-shadow:0 0 6px var(--amber); }

label{
  display:block; font-size:12px; color:var(--grey-text); margin:14px 0 6px;
  font-family:'IBM Plex Mono',monospace; letter-spacing:.02em;
}
label:first-of-type{margin-top:0;}
select, input[type=text], input[type=date], input[type=email], input[type=password], input[type=tel], input[type=file], input[type=number], textarea{
  width:100%; background:#0f1114; border:1px solid var(--hairline); color:var(--white-text);
  padding:9px 10px; border-radius:5px; font-family:'IBM Plex Mono',monospace; font-size:13.5px; outline:none;
}
select:focus, input:focus, textarea:focus{ border-color:var(--amber-dim); box-shadow:0 0 0 2px rgba(255,178,0,0.12); }

.fiche-line{ font-size:12.5px; color:var(--grey-text); margin:5px 0; }
.fiche-line b{ color:var(--white-text); font-weight:600; }
.fiche-empty{ color:var(--grey-text); font-size:12.5px; font-style:italic; margin-top:10px; }
.tag-list{ display:flex; flex-wrap:wrap; gap:6px; margin-top:4px; }
.tag{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; padding:2px 7px; border-radius:3px;
  background:rgba(255,255,255,0.06); color:var(--grey-text); border:1px solid var(--hairline);
}

/* ================================================================================================
   LE PLANCHER DE LA CIBLE AU DOIGT -- #151 / H3, remesure le 4 septembre 2026

   CE QUE LE CARNET 3.3 DISAIT, ET POURQUOI C ETAIT INCOMPLET. Il fermait H3 sur la mesure au
   doigt de Frederick (29 aout) : cinq rangees de boutons aux VRAIES tailles, cinq visees
   chacune, « aucun rate, meme a 26 px ». Les tailles essayees etaient 26 · 28 · 36 · 40 · 44 px,
   et le 26 venait d un tableau CALCULE depuis cette feuille de style (padding + police x
   interligne + bordures).

   🛑 CE CALCUL NE VOYAIT PAS LES `style="padding:3px 8px; font-size:11px"` ECRITS DANS LE HTML.
      Ils ecrasent la classe, et il y en a une trentaine. Mesure dans un vrai Chromium, aux deux
      largeurs (1280 et 390) : le plancher REEL du produit est **20 px**, pas 26 -- six pixels
      SOUS la plus petite cible que la main de l utilisateur ait jamais essayee. Le plus petit
      de tous porte « Desactiver » : encore une fois, le plus petit bouton est le destructif.

   CE QUE CETTE LIGNE FAIT, ET CE QU ELLE NE FAIT PAS. Elle ne choisit aucune taille : elle
   ramene au plancher DEJA VALIDE PAR UNE MAIN ce qui etait passe dessous sans que personne le
   decide. Elle ne monte rien a 40 ni a 44 -- ces seuils viennent d un guide, et la mesure de
   Frederick les a explicitement refuses.

   ⚠️ `min-height` ET PAS UN PADDING : le padding est justement ce que les styles en ligne
      ecrasent. `min-height` n est pose nulle part en ligne, donc il tient. `box-sizing:border-box`
      est global (ligne 46) : la valeur est la hauteur RENDUE, bordures comprises.

   Gardee par `scripts/essai-plancher-au-doigt.js`, qui MESURE le rendu de vraies pages -- il ne
   relit pas cette ligne.
   ================================================================================================ */
button{
  margin-top:10px; background:var(--amber); color:#1a1300; border:none;
  padding:10px 14px; border-radius:6px; font-weight:700; font-size:13.5px; cursor:pointer;
  letter-spacing:.01em; transition:filter .15s;
  min-height:26px;   /* le plancher au doigt -- voir le pave ci-dessus */
}
button.full{ width:100%; }
button:hover{filter:brightness(1.08);}
button:active{filter:brightness(0.92);}
button.secondary{ background:transparent; color:var(--grey-text); border:1px solid var(--hairline); }

/* Etat "arme" d'une confirmation EN PLACE (questionnaire equipement, bouton "Aucun de ceux-la")
   -- remplace un confirm() natif qui s'ouvrait loin du bouton clique. Doit se distinguer nettement
   de l'etat au repos, sinon le second clic part sans que l'utilisateur ait vu qu'on lui demandait
   quelque chose. */
/* Barre de filtres de la liste des taches de maintenance (statut / categorie / recherche). */
.tk-filter-bar{
  display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-bottom:12px;
}
.tk-filter-bar select, .tk-filter-bar input[type="search"]{
  margin:0; padding:6px 10px; font-size:13px; width:auto; min-width:150px;
}
.tk-filter-bar input[type="search"]{ flex:1 1 200px; }
.tk-filter-count{ font-size:12px; color:var(--grey-text); margin-left:auto; white-space:nowrap; }

button.secondary.confirming{
  color:var(--amber); border-color:var(--amber);
  background:rgba(255,178,0,.10); font-weight:600;
}
button.danger{ background:transparent; color:#ff8f8f; border:1px solid rgba(255,92,92,0.4); padding:5px 10px; font-size:11.5px; margin:0; }
button:disabled{ opacity:.5; cursor:not-allowed; }

.results-empty{
  color:var(--grey-text); font-size:13.5px; padding:30px 10px; text-align:center;
  border:1px dashed var(--hairline); border-radius:8px;
}

.ad-card{ border:1px solid var(--hairline); border-radius:8px; padding:10px 14px; margin-bottom:8px; background:#0f1114; }
.ad-card[open]{ padding-bottom:14px; }

/* Carte-resultat repliee par defaut (voir aircraft.html) -- une seule ligne compacte tant que
   l'admin/le client n'a pas besoin du detail. */
/* flex-wrap MESURE, PAS DECORATIF (8 septembre 2026). A 360 px, la ligne repliee ne tient pas :
   ▸ + le numero d AD + la pastille de statut font 274 px dans une carte large de 232. La pastille
   partait donc a x=240 et finissait a 408 -- 48 px HORS DE L ECRAN. Et comme .panel porte
   overflow-x:auto sous 760 px, le panneau ABSORBAIT : la page ne defilait pas, aucune barre ne
   s affichait, rien a l ecran ne disait qu il manquait du texte. Un TEA lisait « Verification
   requi » sans savoir qu il lui manquait un mot. 226 pastilles etaient dans ce cas.
   Sans wrap, aucun min-width:0 n y peut rien : white-space:nowrap fixe la taille min-contenu de
   la pastille a sa largeur pleine, donc flex ne peut pas la retrecir. On la laisse DESCENDRE A LA
   LIGNE. Le placement en lignes se fait sur la taille de base (pastille = 168 px), donc a 1280 px
   tout tient sur une ligne comme avant : le rendu large ne change pas. */
.ad-summary{
  display:flex; align-items:center; gap:10px; cursor:pointer; list-style:none;
  padding:4px 0; user-select:none; flex-wrap:wrap;
}
.ad-summary::-webkit-details-marker{ display:none; }
.ad-summary::before{ content:'▸'; color:var(--amber); font-size:11px; flex-shrink:0; transition:transform .1s; }
.ad-card[open] > .ad-summary::before{ content:'▾'; }
.ad-summary .ad-id{ flex-shrink:0; }
.ad-summary-title{
  flex:1; min-width:0; font-size:12.5px; color:var(--grey-text);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.ad-card-body{ padding-top:8px; margin-top:6px; border-top:1px solid var(--hairline); }
.ad-card.applicable{border-left:3px solid var(--red);}
.ad-card.non_applicable{border-left:3px solid var(--blue);}
.ad-card.verification_requise{border-left:3px solid var(--amber);}
.ad-card.fermee{border-left:3px solid var(--green);}

.ad-top{ display:flex; justify-content:space-between; align-items:flex-start; gap:12px; flex-wrap:wrap; }
.ad-id{ font-family:'IBM Plex Mono',monospace; font-size:13px; color:var(--white-text); font-weight:600; }
/* white-space:normal ET NON nowrap -- ET CE N EST PAS « laisser la pastille se casser » (8 sept.
   2026). `normal` ne FORCE aucun retour a la ligne : une boite qui s ajuste a son contenu reste
   sur une ligne tant qu elle tient. Le seul cas ou il change quelque chose est celui ou la
   pastille NE TIENT PAS -- et la, l ancien nowrap ne la faisait pas tenir non plus : il la
   faisait DEPASSER, en silence, absorbee par le panneau. Retourner a la ligne montre le mot ;
   nowrap le supprimait de l ecran.
   max-width:100% ferme le meme trou pour les deux emplois BLOC de cette classe (index.html et le
   bloc de confiance d aircraft.html), ou le texte vient de la base et n a pas de longueur connue.
   overflow-wrap:break-word, et non `anywhere` : `anywhere` abaisserait la taille min-contenu a un
   caractere et flex ecraserait la pastille en colonne de lettres. */
.status-pill{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.08em; text-transform:uppercase;
  padding:4px 9px; border-radius:20px; white-space:normal; max-width:100%; overflow-wrap:break-word;
}
.status-pill.applicable{background:rgba(255,92,92,0.14);color:#ff8f8f;}
.status-pill.non_applicable{background:rgba(111,168,255,0.14);color:#a9c6ff;}
.status-pill.verification_requise{background:rgba(255,178,0,0.14);color:var(--amber);}
.status-pill.fermee{background:rgba(79,214,138,0.14);color:#7be3ac;}

.ad-title{font-size:14px;margin:8px 0 4px;color:var(--white-text);font-weight:600;}
.ad-meta{font-size:11.5px;color:var(--grey-text);font-family:'IBM Plex Mono',monospace;margin-bottom:10px;}
.reasoning{ font-size:12.5px; color:var(--grey-text); line-height:1.6; padding-top:8px; margin-top:4px; }
.reasoning div{margin-bottom:3px;}

.reasoning-details{ margin-top:2px; }
.reasoning-details summary{
  cursor:pointer; font-size:11.5px; color:var(--grey-text); font-family:'IBM Plex Mono',monospace;
  list-style:none; user-select:none; padding-top:8px; border-top:1px solid var(--hairline);
}
.reasoning-details summary::-webkit-details-marker{ display:none; }
.reasoning-details summary::before{ content:'▸ '; color:var(--amber); }
.reasoning-details[open] summary::before{ content:'▾ '; }
.reasoning-details summary:hover{ color:var(--white-text); }

.legend{ display:flex; gap:16px; flex-wrap:wrap; font-size:11.5px; color:var(--grey-text); margin-bottom:16px; font-family:'IBM Plex Mono',monospace; }
.legend span{display:flex;align-items:center;gap:6px;}
.dot{width:8px;height:8px;border-radius:50%;display:inline-block;}
.dot.applicable{background:var(--red);}
.dot.verification_requise{background:var(--amber);}
.dot.fermee{background:var(--green);}
.dot.non_applicable{background:var(--blue);}

.status-line{ font-size:12px; color:var(--grey-text); font-family:'IBM Plex Mono',monospace; margin-top:12px; min-height:16px; }
.status-line.error{ color:#ff8f8f; }

/* AD applicable ET recurrente (compliance.recurring) -- releve le seuil d'attention au-dela
   du simple statut : c'est une obligation qui revient a chaque echeance, pas une action
   ponctuelle qu'on coche et qu'on oublie. */
.ad-card.recurring{
  border-left-width:5px;
  box-shadow:0 0 0 1px var(--amber-dim) inset, 0 0 14px -4px rgba(255,178,0,0.35);
}
.recurring-badge{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.06em; text-transform:uppercase;
  padding:4px 9px; border-radius:20px; white-space:nowrap;
  background:var(--amber); color:#1a1400; font-weight:700;
}

.pdf-link{
  font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--grey-text);
  border:1px solid var(--hairline); border-radius:6px; padding:3px 9px; text-decoration:none;
  white-space:nowrap;
}
.pdf-link:hover{ color:var(--white-text); border-color:var(--grey-text); }

.filter-bar{ display:flex; gap:8px; flex-wrap:wrap; margin-bottom:16px; }
.filter-chip{
  font-family:'IBM Plex Mono',monospace; font-size:11.5px; letter-spacing:.03em;
  padding:6px 12px; border-radius:20px; border:1px solid var(--hairline); background:transparent;
  color:var(--grey-text); cursor:pointer;
}
.filter-chip:hover{ color:var(--white-text); border-color:var(--grey-text); }
.filter-chip.active{ background:var(--white-text); color:#0b0c0e; border-color:var(--white-text); font-weight:600; }
.filter-chip.active.recurring-active{ background:var(--amber); border-color:var(--amber); color:#1a1400; }

.category-tag{ background:rgba(111,168,255,0.10); color:#a9c6ff; border-color:rgba(111,168,255,0.3); }

/* ================================================================================================
   LA BANDE DE NAVIGATION SE RESERVE SA HAUTEUR -- ET ELLE EST OPAQUE.
   ================================================================================================

   LE DEFAUT, MESURE (constat E4, 24 aout 2026, 22 h 31). Frederick ouvre le tableau de bord sur
   son iPhone : le titre de page, un numero de bon de travail et une bande jaune pleine largeur
   passent SOUS les pastilles « ← Retour / ☰ Menu / EN / Déconnexion », et les deux textes se
   melangent. `scripts/essai-ecran-telephone.js` a mesure ceci, avant correctif :

       360 / 390 / 402 px : la barre occupe y 16 -> 55 ; le logo d'en-tete commence a y 43.
                            12 px de chevauchement.
       1280 px            : 13 px. LE MEME DEFAUT, A TOUTES LES LARGEURS.

   CETTE DERNIERE LIGNE EST LA SURPRISE, et elle a change le correctif. Je croyais tenir un defaut
   d'ecran etroit -- l'en-tete est centre a 980 px, donc sur un grand ecran il reste de la place
   dans les marges. Faux : `.nav-menu` est a `left:20px` et l'en-tete a `padding-left:20px`, si
   bien que le bouton « ← Retour » couvre le logo DEPUIS TOUJOURS, sur les vingt-huit pages, quelle
   que soit la largeur. Une correction sous media query aurait laisse le defaut en place sur
   l'ecran ou je l'aurais declare corrige.

   LA CAUSE. `position:fixed` retire l'element du flux. PERSONNE ne lui reserve sa hauteur : le
   contenu commence a y=0 et la barre se pose par-dessus. Ce n'est pas un reglage a ajuster, c'est
   une hauteur qui n'a jamais ete demandee a personne.

   POURQUOI ON GARDE `position:fixed` PLUTOT QUE DE LA RENDRE STATIQUE SOUS UNE CERTAINE LARGEUR.
   C'etait l'autre option, et elle supprimait le chevauchement par construction, sans constante
   magique. Elle coute trop cher : ces quatre pastilles sont la SEULE navigation du portail sur
   vingt-huit pages, et le tableau de bord de Skynova fait dix-huit aeronefs de long. Les faire
   disparaitre au premier glissement du doigt, c'est obliger a remonter en haut de page pour
   changer d'ecran -- on echangerait un defaut d'affichage contre un defaut d'usage, sur le
   telephone, c'est-a-dire exactement la ou le premier faisait mal.

   DEUX REGLES, PAS UNE, PARCE QUE LA CAPTURE MONTRE DEUX MOMENTS :
     1. LA HAUTEUR EST RESERVEE -- rien ne commence plus sous la barre, page en haut.
     2. LA BANDE EST OPAQUE -- une fois qu'on fait defiler, du contenu passe FORCEMENT sous une
        barre fixe. C'est supportable si elle le CACHE ; c'est illisible si elle le laisse
        transparaitre, et c'est litteralement ce que montre la capture (la bande jaune « Voir les
        2 bon(s) de travail → » coupee en deux par les pastilles). Mesure : avant correctif, un
        balayage de la bande rendait `div.sub « Vue d'ensemble de tous tes aéronefs... »` aux
        trois largeurs.

   `:has()` PLUTOT QU'UNE CLASSE POSEE EN JAVASCRIPT. La barre n'existe que sur les pages qui
   chargent nav-menu.js ; login.html et la vitrine n'en ont pas, et leur imposer une bande vide de
   60 px serait un defaut invente. La regle est donc portee par le CSS, jamais par un booleen --
   meme raison qu'ecrit deja `#fl-mode` dans dashboard.html : « une media query ne peut pas se
   desynchroniser d'un booleen ». Si `:has()` venait a ne pas s'appliquer, on retombe sur le
   comportement d'aujourd'hui, jamais sur pire -- et l'essai d'ecran le dirait tout de suite.

   LA HAUTEUR EST MESUREE, PAS DEVINEE : bas de barre a 55 px, plus 5 px de respiration. Elle
   n'est ecrite qu'ICI, et `essai-ecran-telephone.js` verifie le RESULTAT (aucun croisement de
   rectangles) plutot que la constante -- le jour ou une pastille grandit, c'est l'essai qui le
   dit, pas un client. */
:root{
  /* Une declaration PAR LIGNE, et ce n'est pas une question de gout : verifier-pages.js
     reconnait une variable CSS a `^\s*--nom\s*:`. Ecrite sur la meme ligne que `:root{`, elle
     passait pour inexistante et le controle refusait le fichier -- il m'a attrape en trois
     secondes, ce qui est exactement son travail. */
  --barre-nav-h:60px;
}
body:has(> .nav-menu){ padding-top:var(--barre-nav-h); }
body:has(> .nav-menu)::before{
  content:''; position:fixed; top:0; left:0; right:0; height:var(--barre-nav-h);
  /* Opaque, et de la meme couleur que le haut du degrade du corps -- une bande qui se voit
     serait une barre d'outils qu'on n'a pas dessinee. `pointer-events:none` : elle cache, elle
     n'intercepte pas ; sans ca elle avalerait le premier clic destine a la page. */
  background:#1c1f24; border-bottom:1px solid var(--hairline);
  z-index:9; pointer-events:none;
}
/* Le bandeau rivete EST le bord haut de cette bande : il monte avec elle plutot que d'etre
   pousse 60 px plus bas, ou il ne borderait plus rien. */
body:has(> .nav-menu) > .rivet-strip{ position:fixed; top:0; left:0; right:0; z-index:10; }
/* ET ON REND UNE PARTIE DU DECALAGE. Sans cette ligne, l'en-tete descendrait de 50 px sur les
   vingt-huit pages -- un deplacement que personne n'a demande, pour corriger un chevauchement de
   12. Avec elle, le contenu passe de y=42 a y=70 : il degage la barre, et il bouge le moins
   possible. */
body:has(> .nav-menu) > header{ padding-top:10px; }

.logout-btn{
  position:fixed; top:16px; right:20px; z-index:10;
  font-family:'IBM Plex Mono',monospace; font-size:11px; letter-spacing:.03em;
  padding:6px 12px; border-radius:20px; border:1px solid var(--hairline); background:var(--panel-bg);
  color:var(--grey-text); cursor:pointer; text-decoration:none;
}
.logout-btn:hover{ color:var(--white-text); border-color:var(--grey-text); }

/* Menu deroulant en haut a gauche (Mon compte / Abonnement / Aide / Admin) -- demande
   explicite : "met les en menu deroulant en haut a gauche" -- remplace la pile de liens ambre
   qui encombrait l'en-tete de index.html. Meme famille visuelle que .logout-btn (position fixe,
   coin de la fenetre), miroir a gauche plutot qu'a droite. */
.nav-menu{ position:fixed; top:16px; left:20px; z-index:10; }
.nav-menu-btn{
  font-family:'IBM Plex Mono',monospace; font-size:11px; letter-spacing:.03em;
  padding:6px 12px; border-radius:20px; border:1px solid var(--hairline); background:var(--panel-bg);
  color:var(--grey-text); cursor:pointer;
}
.nav-menu-btn:hover{ color:var(--white-text); border-color:var(--grey-text); }
.nav-menu-panel{
  position:absolute; top:calc(100% + 6px); left:0; min-width:230px;
  /* `--nav-menu-panel-bg`, PAS `--panel-face` (voir le commentaire de sa declaration, en tete de
     fichier) : ce panneau est le seul a se dessiner par-dessus le coin le plus clair du degrade de
     `body`, et c'est le seul qui avait besoin d'un fond plus pale. */
  background:var(--nav-menu-panel-bg); border:1px solid var(--hairline); border-radius:8px;
  padding:6px; box-shadow:0 8px 24px rgba(0,0,0,0.4);
  /* Le panneau grandit avec le nombre d'aeronefs (une entree par appareil) : sans plafond, il
     depassait simplement le bas de la fenetre et les dernieres entrees -- Administration
     comprise -- devenaient inatteignables. Il defile desormais a l'interieur de lui-meme.
     overscroll-behavior evite que la page defile derriere une fois le bas du menu atteint. */
  max-height:calc(100vh - 90px); overflow-y:auto; overscroll-behavior:contain;
  max-width:calc(100vw - 40px);
}
.nav-menu-panel a{
  display:block; padding:7px 10px; border-radius:5px; text-decoration:none; color:var(--amber);
  font-size:12.5px; white-space:nowrap;
}
/* Sections repliables (voir restoreFolds dans nav-menu.js) : le chevron indique l'etat, et
   summary garde exactement l'allure d'une etiquette de section pour ne pas creer deux styles
   de titre differents dans le meme panneau. */
.nav-menu-panel details.nav-menu-fold > summary{
  cursor:pointer; list-style:none; user-select:none;
}
.nav-menu-panel details.nav-menu-fold > summary::-webkit-details-marker{ display:none; }
.nav-menu-panel details.nav-menu-fold > summary::after{ content:' ▸'; }
.nav-menu-panel details.nav-menu-fold[open] > summary::after{ content:' ▾'; }
.nav-menu-panel details.nav-menu-fold > summary:hover{ color:var(--amber); }
/* Sur ecran etroit, les libelles longs ("+ Ajouter une AD (extraction IA depuis un PDF) →")
   depassaient en largeur : on les laisse passer a la ligne plutot que de forcer un defilement
   horizontal, plus penible au doigt. */
@media (max-width:600px){
  .nav-menu-panel a{ white-space:normal; }
}
/* Deux colonnes quand le panneau ne tient pas en hauteur (voir ajusterPanneau dans
   nav-menu.js -- la classe est posee apres mesure, jamais par media query). Le flux multi-
   colonnes repartit les entrees tout seul ; break-inside empeche qu'une section soit coupee
   en deux entre les colonnes. */
.nav-menu-panel.two-col{ min-width:470px; column-count:2; column-gap:16px; }
.nav-menu-panel.two-col > *{ break-inside:avoid; }
.nav-menu-panel.two-col hr{ break-after:avoid; }

.nav-menu-panel a:hover{ background:rgba(255,178,0,0.08); }
.nav-menu-panel hr{ border:none; border-top:1px solid var(--hairline); margin:6px 2px; }
/* L'EN-TETE DE GROUPE, PLUS EN EVIDENCE QUE SES ITEMS -- tache FQ3e (26 aout 2026) : "il faut
   mettre les groupes de sous-menu dans le menu plus en evidence". Mesure avant correctif : cette
   classe est desormais posee UNIQUEMENT sur le <summary> de chaque repli (public/nav-menu.js,
   regrouperEnFamilles() et le bloc Administration) -- plus jamais sur une etiquette de section a
   plat -- et elle rendait un texte gris 10px SANS graisse, plus PETIT et plus PALE que les liens
   ambre 12.5px qu'il coiffe : le titre du groupe se voyait donc MOINS que son propre contenu,
   l'inverse de ce qu'un en-tete doit faire. Corrige par trois leviers indissociables : une graisse
   (700, les liens n'en portent aucune), une teinte plus claire (--white-text plutot que
   --grey-text) et un fond distinct (rgba blanc a 6%, que .nav-menu-panel a n'a jamais au repos) --
   scripts/essai-nav-menu-contraste.js compare les trois avec les items pour que la mesure porte
   sur le VRAI ecart, pas sur une seule propriete qui suffirait a elle seule. */
.nav-menu-panel .nav-menu-section-label{
  font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.07em;
  color:var(--white-text); background:rgba(255,255,255,0.06);
  border-radius:5px; padding:7px 10px; margin:3px 0 2px;
}

footer{ max-width:var(--largeur-page); margin:30px auto 0; padding:0 20px; font-size:12px; color:var(--grey-text); line-height:1.6; }
footer a{ color:var(--amber); }

/* Liste d'aeronefs
   ------------------------------------------------------------------------------------------
   UNE GRILLE `1fr auto`, EXACTEMENT COMME `.camp-item` DE « PAR OU COMMENCER ». Ce n'est pas un
   emprunt d'apparence : c'est le seul agencement qui rende le groupement INDEPENDANT de la
   largeur. La version d'avant etait un `flex` a deux blocs ou le geste vivait au bout des liens ;
   MESURE LE 22 AOUT 2026 A 1280 px, avec les vrais libelles francais : les quatre liens font
   759 px pour 868 px disponibles, et l'amas de gestes (137 px) passait a la ligne -- il
   atterrissait alors SOUS le premier lien, a 722 px a gauche du dernier, c'est-a-dire range
   parmi les liens, ce que cette separation existe pour empecher. Le repli dependait donc de la
   longueur des libelles : une traduction plus longue aurait defait la mise en page en silence.
   Avec deux colonnes, le geste a SA colonne, et les liens se replient dans la leur. */
.aircraft-row{
  display:grid; grid-template-columns:1fr auto; gap:14px; align-items:center;
  padding:12px 14px; border:1px solid var(--hairline); border-radius:8px; background:#0f1114; margin-bottom:10px;
}
.aircraft-row .reg{ font-family:'IBM Plex Mono',monospace; font-weight:700; font-size:14px; color:var(--white-text); }
.aircraft-row .model{ font-size:12px; color:var(--grey-text); margin-top:2px; }
.aircraft-row .links{ display:flex; gap:8px; flex-wrap:wrap; margin-top:9px; }
.aircraft-row .links a{
  font-family:'IBM Plex Mono',monospace; font-size:11.5px; text-decoration:none; color:var(--amber);
  border:1px solid var(--amber-dim); padding:6px 10px; border-radius:5px; white-space:nowrap;
}
.aircraft-row .links a:hover{ background:rgba(255,178,0,0.08); }

/* ================================================================================================
   UN LIEN QUI OUVRE UN ECRAN ET UN BOUTON QUI ARCHIVE UN AERONEF NE DOIVENT PAS SE RESSEMBLER.
   ================================================================================================
   FREDERICK, 22 AOUT 2026 : « il faut que les boutons (leur utilite soit plus claire) ». Sur sa
   capture, la carte portait SIX gestes de meme apparence : quatre qui MENENT AILLEURS (Verifier
   les AD, Suivi, Documents, Complements) et deux qui CHANGENT L ETAT de l appareil (Desactiver,
   Retirer). Rien ne disait lequel etait lequel -- et le plus consequent des six, celui qui
   effacait la ligne, etait juste a cote de ceux qui ne font que naviguer.

   CE N EST PAS UNE QUESTION DE COULEUR, C EST UNE QUESTION DE NATURE. Recolorer le bouton l aurait
   rendu plus voyant sans le rendre plus lisible : un bouton rouge reste un bouton range parmi des
   liens. On separe donc les deux familles, et la separation se MESURE (voir
   scripts/essai-archiver-aeronef.js, section 2) :

     - la NATURE : les quatre navigations sont des <a> avec une adresse ; le geste est un <button>
       sans adresse. Un essai lit le nom de balise, pas l apparence.
     - le GROUPEMENT : le geste vit dans son propre amas `.gestes`, apres une reglure verticale.
       L ecart mesure entre le dernier lien et le geste est plus du double de l ecart entre deux
       liens -- 8 px contre 8+18+18 px.
     - la TAILLE et la TEINTE : ambre pour ce qui navigue (la couleur d action du produit), gris
       sur reglure pour ce qui agit sur l etat. Deliberement DISCRET : archiver n est pas une
       urgence, c est un rangement. L ancien « Retirer » etait rouge parce qu il detruisait ; il
       n existe plus, et rien ne doit heriter de son alarme.

   LE PATRON EST CELUI DE « PAR OU COMMENCER », que Frederick a lui-meme nomme comme le bon :
   `.camp-item` y est une grille `1fr auto` -- le contenu a gauche, les gestes en amas a droite,
   boutons `width:auto`, et `.secondary` en transparent sur reglure pour ce qui engage le moins.
   On reprend exactement ces valeurs plutot que d en inventer de proches.
   ================================================================================================ */
.aircraft-row .gestes{
  display:flex; gap:8px; align-items:center;
  padding-left:18px; border-left:1px solid var(--hairline); align-self:stretch;
}
.aircraft-row .gestes button{
  width:auto; margin:0; padding:6px 12px; font-size:11.5px; font-family:'IBM Plex Mono',monospace;
  background:transparent; color:var(--grey-text); border:1px solid var(--hairline); border-radius:5px;
  white-space:nowrap;
}
.aircraft-row .gestes button:hover{ color:var(--white-text); border-color:var(--grey-text); }
/* Quand la carte se replie en une colonne, une reglure VERTICALE ne separe plus rien -- elle
   devient horizontale, sinon le groupement disparait exactement sur l ecran ou il compte le plus. */
@media (max-width:640px){
  .aircraft-row{ grid-template-columns:1fr; gap:0; }
  .aircraft-row .gestes{
    margin-top:11px; padding:11px 0 0; border-left:none; border-top:1px solid var(--hairline);
  }
  .aircraft-row .gestes button{ flex:1; }
  /* 🛑 UN SEUL LIEN ELARGISSAIT TOUTE LA CARTE — mesure du 12 septembre 2026, a 375 px.
     `essai-archiver-aeronef` rougissait sur « le bouton tient dans sa carte -> 1 px de
     depassement », et le bouton n y etait pour RIEN : il remplit `.gestes`, qui s etire sur la
     piste de grille, dont la largeur etait imposee par ailleurs.

     LA MESURE, boite par boite : la carte offre 263 px de contenu (334 − 41, moins 1 px de
     bordure et 14 px de rembourrage de chaque cote). `.gestes` a un min-content de 82 px ;
     `.ident` en a un de 278,72 — et il vient entierement de `.links`, dont le plus large lien
     mesure exactement 278,72 :

         « Verifier les AD → »               150,73
         « 🛠️ Suivi de maintenance → »        207,92
         « 📁 Documents → »                   120,02
         « 🧩 Complements (STC/mods/equip… »  278,72   <- lui seul

     `white-space:nowrap` rend ce lien insecable ; `1fr` vaut `minmax(auto, 1fr)`, donc la piste
     prend ce min-content pour plancher. La carte s elargit a 278,72 au lieu de 263, et 0,72 px
     passent la bordure — le « 1 px » arrondi que le garde voyait.

     ⚠️ LE NOWRAP RESTE AU-DESSUS DE 640 px, ou il a sa raison d etre : un lien coupe en deux au
        milieu d une rangee se lit mal. Sous 640 px la carte est deja en UNE colonne, les liens
        se replient deja les uns sous les autres (`flex-wrap:wrap`), et un libelle long qui passe
        a la ligne se lit tres bien — alors qu une carte qui deborde ne se lit pas du tout.

     ⚠️ ET ON NE POSE PAS `minmax(0,1fr)` SUR LA PISTE. Ca aurait fait rentrer la CARTE en
        laissant le lien deborder tout seul : le garde serait passe au vert pendant que l ecran
        resterait casse — le pixel deplace, pas supprime. */
  .aircraft-row .links a{ white-space:normal; }
}

/* ================================================================================================
   OU VIVENT LES ARCHIVES -- « on enleve de la page, mais on garde en archive » (Frederick).
   ================================================================================================
   UN REPLI EN BAS DE PAGE, PAS UNE PAGE A PART. Une page separee aurait exige une entree de menu ;
   sans elle, on aurait pose un etat dont personne ne peut sortir -- le defaut du module technicien
   (#76/#80), qui est exactement ce que cette liste doit eviter. Le repli est sur LA MEME page que
   le geste qui archive : le chemin de retour ne peut pas se perdre.

   FERME PAR DEFAUT, ET COMPTE DANS LE TITRE. Ferme, il tient la moitie « on enleve de la page ».
   Le compte dans le titre tient l autre : « Aeronefs archives (1) » dit qu il y a quelque chose
   la-dedans sans rien montrer. Un repli sans compte serait un tiroir qu on n ouvre jamais.

   ABSENT QUAND IL EST VIDE. Un repli « (0) » apprendrait a ne pas l ouvrir.
   ================================================================================================ */
.aircraft-archive{ margin-top:16px; border:1px dashed var(--hairline); border-radius:8px; }
.aircraft-archive > summary{
  cursor:pointer; padding:11px 14px; font-size:12px; color:var(--grey-text);
  font-family:'IBM Plex Mono',monospace; list-style:none; user-select:none;
}
.aircraft-archive > summary::-webkit-details-marker{ display:none; }
.aircraft-archive > summary::before{ content:'▸ '; color:var(--grey-text); }
.aircraft-archive[open] > summary::before{ content:'▾ '; }
.aircraft-archive > summary:hover{ color:var(--white-text); }
.aircraft-archive .aircraft-archive-corps{ padding:2px 12px 12px; }
/* Estompe, pas cache : un dossier archive reste de la donnee reglementaire, et on doit pouvoir
   le lire. Il ne doit simplement plus tirer l oeil comme la flotte en service. */
.aircraft-archive .aircraft-row{ opacity:.62; margin-bottom:8px; }
.aircraft-archive .aircraft-row:last-child{ margin-bottom:0; }

/* Boutons/liens colores selon le statut de la page ciblee (AD ou Tracking) -- demande
   explicite : "peux-tu mettre les boutons AD et tracking en couleur variable selon le statut
   de la page dediee ?". Vocabulaire unifie vert/jaune/rouge (voir aircraftContext.js
   getAdStatusSummary : attention->rouge, action->jaune, clear->vert -- meme mapping que le
   module tracking). Un point de couleur avant le texte, pas juste la bordure -- plus visible
   au premier coup d'oeil sur une liste de plusieurs aeronefs. */
.status-link{ position:relative; padding-left:22px !important; }
.status-link::before{
  content:''; position:absolute; left:9px; top:50%; transform:translateY(-50%);
  width:8px; height:8px; border-radius:50%; background:var(--grey-text);
}
.status-link.sl-vert::before{ background:var(--green); }
.status-link.sl-jaune::before{ background:var(--amber); }
.status-link.sl-rouge::before{ background:var(--red); }
.status-link.sl-donnee_manquante::before{ background:var(--grey-text); }

/* Listes editables (complements) */
.item-row{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:9px 12px; border:1px solid var(--hairline); border-radius:6px; background:#0f1114; margin-bottom:8px;
  font-size:12.5px;
}
.item-row .item-main b{ color:var(--white-text); }
.item-row .item-sub{ color:var(--grey-text); font-size:11px; margin-top:2px; }
/* LES ACTIONS SE REPLIENT A TOUTE LARGEUR, PAS SEULEMENT SUR TELEPHONE.

   CE QUI S'EST PASSE. `flex-shrink:0` sans `flex-wrap` etait un choix defendable quand la ligne
   portait deux cases a cocher : les actions restaient alignees a droite, jamais coupees. Le
   repli n'existait que sous 760 px (voir le bloc @media plus bas).

   Puis la ligne a grossi, une decision a la fois : suivi, documents, technicien (2.0), lecture
   seule, et le cran « pilote » (#59). Cinq cases, plus « Reinitialiser le mot de passe », plus
   « Desactiver ». Sur un ecran ordinaire, ca ne rentre plus -- et comme rien ne pouvait ni
   retrecir ni passer a la ligne, ca SORTAIT DE LA PAGE. Signale par Frederick le 19 aout 2026
   sur staging, dans « Mon compte -> Mon equipe ».

   POURQUOI LE CONTROLE NAVIGATEUR NE L'A PAS VU. Il ouvre bien /account.html a 1280 px, mais
   « Mon equipe » ne s'affiche que pour un admin de compagnie et ne se remplit qu'apres un fetch :
   il mesurait un panneau VIDE. Un ecran vide ne deborde jamais.

   `flex-wrap` plutot qu'une largeur fixe : sur grand ecran la ligne reste sur une seule rangee
   comme avant, et elle passe a la ligne le jour ou elle ne rentre plus -- sans qu'on ait a
   deviner d'avance combien de cases viendront encore s'y ajouter. */
.item-row .item-actions{
  display:flex; align-items:center; justify-content:flex-end; flex-wrap:wrap;
  gap:8px 10px; flex-shrink:1; min-width:0;
}

/* LES CASES À COCHER FORMENT LEUR PROPRE RANGÉE, ALIGNÉE À GAUCHE.

   POURQUOI ELLES SORTENT DU LOT. `justify-content:flex-end` aligne chaque rangée repliée sur sa
   DROITE. Tant que toutes les lignes portent le même contenu, ça se voit à peine ; dès qu'une
   ligne en porte moins -- un admin de compagnie n'a pas de bouton « Désactiver » -- sa dernière
   rangée est plus courte, et l'alignement à droite décale ses cases par rapport aux voisines.

   MESURE DU 19 AOÛT, signalée par Frederick (« les cases ne sont pas alignées ») : colonnes 1 à
   4 justes, 5e colonne à 701 px sur deux lignes et à 616 sur les trois autres. À 1024 px : 573
   contre 488. Le défaut grandit à chaque case ajoutée, et cinq y sont déjà.

   `width:100%` force la rangée de cases à occuper toute la largeur du bloc d'actions ; à partir
   de là, `flex-start` les fait toutes partir du MÊME x, quoi que porte le reste de la ligne.
   Les boutons, eux, gardent l'alignement à droite -- ils n'ont pas à s'aligner entre eux. */
.item-row .item-toggles{
  display:flex; flex-wrap:wrap; align-items:center;
  gap:6px 14px;
  /* PLEINE LARGEUR DE LA LIGNE, PAS DU BLOC D'ACTIONS. C'est toute la différence, et ma
     première version l'a manquée : posées dans .item-actions, les cases héritaient d'une
     boîte sans largeur propre, poussée par .item-main -- donc par la LONGUEUR DU NOM. Chaque
     ligne démarrait ailleurs, et les CINQ colonnes se désalignaient au lieu d'une seule.
     Ici, `flex-basis:100%` s'applique à .item-row : la rangée de cases prend sa propre ligne
     et part du bord gauche du contenu, identique pour toutes. */
  flex: 0 0 100%;
  justify-content:flex-start;
  margin-top:6px;
}

/* LA MARGE DES CASES, A ZERO -- SUITE DU #88, MESUREE CETTE FOIS DANS LE BON AXE (#95).

   Le #88 avait ete declare corrige : les cases partaient toutes du meme bord GAUCHE, mesure a
   0 px. C etait vrai, et incomplet. Un essai de navigateur ecrit le 20 aout 2026 a repose la
   question sur l axe VERTICAL et trouve 7 px d ecart entre « Acces AD » et ses cinq voisines.

   LE CHIFFRE EXPLIQUE LA CAUSE : label{margin:14px 0 6px} (plus haut dans ce fichier) donne 14
   px de marge haute a toutes les cases sauf la premiere (label:first-of-type). Ce conteneur est
   en align-items:center : cinq boites de 14 px plus hautes que la sixieme se recentrent, et le
   decalage vaut la MOITIE de la marge. 14 / 2 = 7.

   Porte sur ce conteneur seulement, pas sur .checkbox-inline en general : la classe sert a dix-
   neuf endroits, dont quatorze qui s appuient encore sur la marge heritee. */
.item-row .item-toggles .checkbox-inline{ margin:0; }

/* LES ACCES DANS LE PORTAIL D ADMINISTRATION (#97).

   Frederick, 20 aout 2026 : « les 6 cases sont la sous admin, mais deborde ». Il avait
   raison : neuf colonnes de tableau, dont six boutons a 104 px de largeur minimale, ne
   tiennent pas dans un panneau. J avais ajoute les colonnes sans mesurer ce qu elles
   coutaient en largeur.

   LE PATRON EXISTAIT DEJA, ET IL EST EPROUVE : c est .item-toggles, cote client (« Mon
   equipe »). Un seul bloc qui passe a la ligne, chaque case portant SON nom. On ne reinvente
   pas -- et les deux ecrans se ressemblent enfin, ce qui etait la demande de depart.

   PLUS DE min-width SUR LES BOUTONS. Elle servait a aligner six boutons qui disaient tous
   « Active » / « Desactive » (voir #88). Maintenant que chacun porte un nom DIFFERENT, une
   largeur commune ne les alignerait plus : elle les etirerait tous a la longueur du plus
   long. */
.admin-acces{
  display:flex; flex-wrap:wrap; align-items:center; gap:6px 10px;
  /* La cellule d un tableau ne se retrecit pas toute seule : sans min-width:0, le contenu
     impose sa largeur et c est le tableau entier qui deborde. */
  min-width:0;
}
.admin-acces button{ margin:0; }
/* Sans ça, la rangée de cases ne peut pas passer à la ligne : .item-row est un flex qui, par
   défaut, entasse tout sur une seule rangée. */
.item-row{ flex-wrap:wrap; }
.checkbox-inline{ display:flex; align-items:center; gap:6px; font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--grey-text); }
/* margin:0 -- le navigateur pose de lui-meme une marge (3px 3px 3px 4px) sur une case a cocher.
   Ces 4 px a gauche decalaient la case par rapport a tous les libelles de la page : mesure en
   production, libelles a x=191 et case a x=195. Le `gap` du conteneur suffit a l'espacement. */
.checkbox-inline input{ accent-color: var(--amber); margin:0; flex-shrink:0; }

/* Renversement de decision (outil d'audit, voir aircraft.html) */
/* LE RENVERSEMENT NE DOIT PAS VOLER LA COULEUR DU STATUT.
 *
 * Cette regle posait `border-left:3px solid var(--amber)` -- la couleur EXACTE de
 * « verification requise » (ligne 162). Meme specificite que `.ad-card.applicable` (deux
 * classes), mais ecrite plus bas : elle gagnait. Une AD renversee en APPLICABLE s'affichait donc
 * en ambre, c'est-a-dire comme une AD encore a verifier. La pastille disait « Applicable * » et
 * la bordure disait le contraire -- et sur un outil de navigabilite, c'est la couleur qu'on lit,
 * pas le texte. Defaut signale par l'utilisateur : « il etait applicable, mais orange/jaune ».
 *
 * On ne touche donc plus a la COULEUR (elle encode le statut, et doit rester vraie) : seul le
 * STYLE du trait change. Tirete = cette decision vient d'un humain, pas du moteur.
 */
.ad-card.overridden{ border-left-style:dashed; }
.override-banner{
  margin-top:10px; padding:8px 10px; border:1px solid var(--amber); border-radius:6px;
  background:#15130a; font-size:12px; color:var(--white-text);
}
.override-reason{ margin-top:4px; color:var(--grey-text); font-style:italic; }
.override-meta{ margin-top:4px; color:var(--grey-text); font-size:11px; }
.override-form{ margin-top:8px; padding:10px; border:1px dashed var(--hairline); border-radius:6px; }
.override-form select{ width:100%; }

/* Questionnaire equipement groupe par categorie (voir equipment-questionnaire.html) */
.item-group{ margin-bottom:8px; }
.item-group .item-group-header{ border-color:var(--amber); background:#15130a; margin-bottom:6px; }
.item-group .item-group-detail .item-row{ margin-bottom:6px; }

.modal-overlay{
  position:fixed; inset:0; background:rgba(0,0,0,0.65); display:flex; align-items:center;
  justify-content:center; z-index:1000; padding:20px;
}
.modal-box{
  background:linear-gradient(180deg, var(--panel-face) 0%, var(--panel-face-2) 100%);
  border:1px solid var(--hairline); border-radius:10px; padding:24px; max-width:540px; width:100%;
  max-height:82vh; overflow-y:auto; box-shadow:0 20px 60px rgba(0,0,0,0.5);
}
.modal-box h2{
  font-family:'IBM Plex Mono',monospace; font-size:13px; letter-spacing:.1em; text-transform:uppercase;
  color:var(--amber); margin:0 0 8px;
}

/* Point 11 -- "le popup sur la page des AD, peut-on faire defiler la liste mais en gardant les
   boutons toujours visibles ?" -- par defaut .modal-box defile EN ENTIER (overflow-y:auto sur la
   boite complete), donc une longue liste pousse les boutons hors ecran. .modal-box-flex isole
   UNE zone interne comme seule region defilante (.modal-scroll-area), le reste (titre, boutons)
   reste fixe dans la fenetre modale. */
.modal-box-flex{ display:flex; flex-direction:column; overflow-y:hidden; }
.modal-box-flex .modal-scroll-area{ overflow-y:auto; flex:1 1 auto; min-height:0; }

.form-grid{ display:grid; grid-template-columns:1fr 1fr; gap:0 10px; }
.form-grid .span2{ grid-column:1 / -1; }

.back-link{
  display:inline-block; font-family:'IBM Plex Mono',monospace; font-size:12px; color:var(--grey-text);
  text-decoration:none; margin-bottom:6px;
}
.back-link:hover{ color:var(--amber); }

/* === Ecrans etroits : empecher tout debordement horizontal ===================================
   Trois ecrans debordaient sur telephone -- les autorisations de "Mon equipe", la file de
   telechargement en admin, et la mise a jour des temps -- pour deux raisons distinctes.

   1. .item-row est un flex dont .item-actions portait flex-shrink:0 SANS flex-wrap : les cases
      a cocher et les boutons ne rétrécissaient ni ne passaient a la ligne, donc ils sortaient de
      l'ecran. On le croyait propre au telephone -- ce bloc n'existait que pour lui.
      MAIS LE DEFAUT ETAIT AUSSI SUR GRAND ECRAN, et personne ne le savait : le 19 aout 2026,
      « Mon equipe » debordait de 84 px a 1280 px et de 212 px a 1024 px, une fois arrive a cinq
      cases par ligne. Le repli est donc remonte a TOUTE largeur (voir .item-actions plus haut) ;
      ce qui suit ne fait plus que l'elargir sur telephone -- passer les actions en pleine
      largeur, sous le libelle.

   2. Les tableaux (file, temps) ont des colonnes a largeur fixe -- notamment des champs de
      saisie de 120 px. Ils sont rendus APRES un fetch, en innerHTML : un enrobage pose en
      JavaScript au chargement de la page les manquerait. On rend donc le PANNEAU defilant, ce
      qui attrape aussi bien le contenu present au depart que celui ajoute ensuite.

   Le corps de la page, lui, ne defile jamais lateralement : c'est le conteneur qui defile. */
@media (max-width:760px){
  /* Piege classique de CSS Grid : un enfant de grille porte min-width:auto et refuse de
     retrecir sous la largeur de son contenu -- il deborde alors du conteneur au lieu de
     s adapter. Mesure sur aircraft.html a 375 px : parent 375, enfant 362 decale de 20, soit
     7 px hors ecran. Le correctif precedent traitait les panneaux et les lignes, pas la grille
     elle-meme -- je l avais verifie sur fleet-times et account, pas sur aircraft. */
  /* min-width:0 sur l enfant ne suffit PAS : la piste de grille est en `auto`, donc
     dimensionnee au max-content de son contenu, et un enfant qui accepte de retrecir ne fait
     pas retrecir la piste. Il faut contraindre la PISTE : minmax(0,1fr) l autorise a descendre
     sous la largeur du contenu. Constate en mesurant apres un premier correctif insuffisant. */
  main{ grid-template-columns:minmax(0,1fr); min-width:0; }
  main > *{ min-width:0; }
  /* ET LA BORNE HAUTE, qui manquait. Mesuré sur aircraft.html à 375 px le 17 août 2026 : la
     SECONDE section de <main> (« Résultat de l'évaluation ») restait large de 980 px dans une
     piste de 335, et poussait le document à 1000 px -- la page défilait latéralement. Les deux
     lignes ci-dessus autorisent un élément à RÉTRÉCIR (min-width:0) ; aucune ne l'EMPÊCHE de
     grandir. `.section` porte `max-width:980px`, une valeur pensée pour un écran large : sur un
     téléphone elle ne borne rien, et il suffit qu'un descendant réclame de la place pour que la
     section aille jusqu'à 980.
     `max-width:100%` la ramène à la largeur réellement disponible. Le débordement retombe alors
     là où il doit être traité -- dans `.panel`, qui porte déjà `overflow-x:auto` juste en
     dessous et sait défiler tout seul. */
  main > .section, .section{ max-width:100%; }
  .panel{ min-width:0; }
  /* Double rembourrage : main porte padding 0 20px, et .section en porte un SECOND. A
     l interieur de main ce dernier est en trop -- il ajoute 40 px de largeur demandee sur un
     ecran qui n en a pas, et decale visuellement le contenu deux fois. Hors de main, .section
     garde le sien : il est alors seul a border le contenu. */
  main > .section{ padding-left:0; padding-right:0; }

  /* Le panneau absorbe le debordement plutot que la page entiere. */
  .panel{ overflow-x:auto; -webkit-overflow-scrolling:touch; }

  /* Les actions passent sous le libelle au lieu de le pousser hors de l'ecran. */
  .item-row{ flex-wrap:wrap; align-items:flex-start; }
  .item-row .item-main{ flex:1 1 100%; min-width:0; }
  .item-row .item-actions{ flex-shrink:1; flex-wrap:wrap; width:100%; margin-top:8px; }

  /* Le nom d'un utilisateur ou d'un aeronef ne doit pas elargir la ligne a lui seul. */
  .item-row .item-main b, .item-row .item-sub{ overflow-wrap:anywhere; }

  /* Barre d'outils de la mise a jour des temps : les champs se replient. */
  .ft-bar{ flex-wrap:wrap; }

  /* LES RANGÉES DE BOUTONS D'UNE MODALE PASSENT À LA LIGNE.
     Signalé par Frederick le 17 août 2026 : « le popup d'équipement s'affiche mal sur un
     téléphone ». Mesuré avec Playwright à 360, 375 et 390 px : la boîte tient (aucun
     débordement horizontal), mais la rangée du bas est en `nowrap` avec TROIS boutons --
     « Plus tard », « 🎯 Par où commencer », « Voir toutes les questions → ». Ils se partagent
     302 px et leurs libellés se cassent sur deux ou trois lignes CHACUN : la rangée passe de
     ~34 px à 78 px de haut, et les mots sont hachés. En français les libellés sont plus longs
     qu'en anglais, où la mesure a été prise -- c'est donc pire que ce qui a été mesuré.

     ON CORRIGE LA FORME, PAS L'ENDROIT. Cette rangée existe 29 fois sur 10 pages, toujours
     écrite en style en ligne (`display:flex; gap:10px`). Corriger le seul popup d'équipement
     aurait laissé les 28 autres, et la prochaine modale serait née avec le même défaut.
     `flex-wrap` est inerte sur un élément qui n'est pas en flex : cibler `.modal-box > div`
     n'atteint donc que les rangées réellement concernées, sans toucher au reste.

     `flex:1 1 auto` fait que deux boutons se partagent une ligne au lieu que trois s'écrasent ;
     `white-space:normal` laisse un libellé long revenir à la ligne proprement plutôt que de
     forcer la largeur du bouton. */
  .modal-box > div{ flex-wrap:wrap; }
  .modal-box > div > button, .modal-box > div > a{ flex:1 1 auto; }
  .modal-box > div > a > button{ width:100%; }
  .modal-box button{ white-space:normal; }
}

/* Un tableau ne doit jamais forcer la page a defiler : il defile dans son propre conteneur. */
.table-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; }

/* --- Avis de nouveautes (public/nouveautes.js) ------------------------------------------- */
/* Affiche une fois par version. Volontairement sobre : il informe, il ne vend rien. */
.nouv-overlay{ position:fixed; inset:0; background:rgba(0,0,0,.62); display:flex; align-items:center;
               justify-content:center; padding:20px; z-index:2000; }
.nouv-boite{ background:var(--panel-bg); border:1px solid var(--hairline); border-radius:10px;
             max-width:560px; width:100%; max-height:82vh; overflow-y:auto; padding:22px 24px; }
.nouv-version{ font-family:"IBM Plex Mono",monospace; font-size:11px; color:var(--amber);
               text-transform:uppercase; letter-spacing:.08em; margin-bottom:4px; }
.nouv-boite h2{ margin:0 0 14px; font-size:18px; }
.nouv-boite ul{ margin:0 0 18px; padding-left:18px; }
.nouv-boite li{ margin-bottom:9px; line-height:1.55; font-size:13.5px; color:var(--grey-text); }
.nouv-pied{ display:flex; align-items:center; justify-content:space-between; gap:12px; }
.nouv-aide{ font-size:13px; color:var(--amber); text-decoration:none; }
.nouv-aide:hover{ text-decoration:underline; }
.nouv-ok{ width:auto; margin:0; padding:9px 20px; }
@media (max-width:640px){ .nouv-boite{ padding:18px; } .nouv-pied{ flex-direction:column-reverse; align-items:stretch; } .nouv-ok{ width:100%; } .nouv-aide{ text-align:center; } }


/* --- .btn : un LIEN qui doit ressembler a un bouton -------------------------------------
   Six pages posaient deja class="btn" sur un <a> ; la classe n existait nulle part et le
   navigateur affichait un lien bleu souligne. On reprend exactement la facture des <button>
   ci-dessus plutot que d en inventer une seconde : deux apparences pour la meme action est
   precisement ce qui fait douter de ce sur quoi on clique. */
a.btn, .btn{
  display:inline-block; text-decoration:none;
  background:var(--amber); color:#1a1300; border:none;
  padding:10px 14px; border-radius:6px; font-weight:700; font-size:13.5px; cursor:pointer;
  letter-spacing:.01em; transition:filter .15s;
}
a.btn:hover, .btn:hover{ filter:brightness(1.08); text-decoration:none; }
a.btn.secondary, .btn.secondary{ background:transparent; color:var(--grey-text); border:1px solid var(--hairline); }

/* --- #exports-bar : la barre d'exports de la page (T6, 22 aout 2026) --------------------
   Les exports vivaient dans un sous-menu du menu deroulant ; Frederick les a ramenes sur la
   page (« y ajouter les boutons d'export au lieu qu'il soit dans le menu »), sur TOUTES les
   pages qui en deposent. Le contenu est rendu par nav-menu.js -- une seule ecriture pour les
   deux pages qui s'en servent.

   `flex-wrap` PLUTOT QU'UNE LARGEUR FIXE : la meme barre est posee dans la barre d'outils
   HORIZONTALE de tracking.html et dans la colonne d'actions ETROITE (220 px) d'aircraft.html.
   Une regle qui suppose l'une casse l'autre ; envelopper marche dans les deux, et les libelles
   d'export sont longs (« Rapport de conformite (preteur/assureur) »), d'ou `white-space:normal`
   -- sans lui, le bouton deborde de la colonne au lieu de s'y plier.
   `align-items:stretch` : dans la barre HORIZONTALE, les <a> et le <button> n'ont pas la meme
   hauteur naturelle (38 px contre 35 px, mesure a l'ecran) -- trois boutons cote a cote dont un
   plus court se lit comme un defaut d'alignement, la famille qui a deja coute six correctifs a
   la 2.4. */
.exports-bar{ display:flex; flex-wrap:wrap; gap:10px; align-items:stretch; }
.exports-bar > .btn{ margin:0; padding:9px 16px; white-space:normal; text-align:left; }
/* Dans la COLONNE d'actions de la fiche aeronef, tout est pleine largeur (« Evaluer
   l'applicabilite », « Historique »). Des exports de 215 px a cote de boutons de 291 px
   donnaient une colonne en escalier -- mesure a l'ecran. Regle portee par le CONTENEUR de la
   page et non par la barre : c'est la colonne qui impose sa mise en page, pas l'inverse, et
   tracking.html doit garder ses exports a leur largeur naturelle dans sa barre horizontale. */
.fiche-panel-actions #exports-bar > .btn{ width:100%; }

/* Le bouton Retour partage la facture du bouton Menu -- il vit dans le meme conteneur, en
   ligne avec lui. Discret : on veut qu il soit la quand on le cherche, pas qu il attire le
   regard a chaque page. */
.nav-menu{ display:flex; gap:8px; align-items:center; }
.retour-btn{ opacity:.85; }
.retour-btn:hover{ opacity:1; }
/* Le panneau du menu s ouvre sous le bouton MENU, pas sous le conteneur : sans cette regle,
   l ajout du bouton Retour l aurait decale vers la gauche. */
.nav-menu-panel{ left:auto; }

/* --- Encart « commencer par le groupe » (popup equipement) -------------------------------
   Il precede la liste de l aeronef : c est une proposition, pas une alerte. Fond de panneau
   et filet ambre a gauche, comme les autres encarts du produit -- inventer une deuxieme
   apparence pour un troisieme type d encart est ce qui rend une interface illisible. */
.camp-encart{ background:var(--panel-bg); border:1px solid var(--hairline);
  border-left:3px solid var(--amber); border-radius:6px; padding:14px 16px; }
.camp-encart-titre{ font-weight:700; font-size:14.5px; margin-bottom:6px; }
.camp-encart-sous{ font-size:13px; color:var(--grey-text); line-height:1.55; }
.camp-encart-actions{ display:flex; flex-wrap:wrap; gap:10px; margin-top:14px; }
.camp-encart-actions button{ margin:0; width:auto; }

/* Le gain, porte par le bouton lui-meme : « Aucun - mes 4 CESSNA 172  [40] ». Le chiffre
   doit etre sur le bouton et non a cote, sinon deux boutons voisins semblent promettre le
   meme resultat. */
.camp-gain-btn{ display:inline-block; margin-left:7px; padding:1px 6px; border-radius:9px;
  background:rgba(0,0,0,.22); font-size:11.5px; font-weight:700; }

.camp-encart-liste{ font-size:12px; color:var(--grey-text); margin-top:8px;
  font-family:'IBM Plex Mono', monospace; word-break:break-word; }

/* La categorie qui retient une consigne en « verification requise ». Discrete mais lisible :
   c est une explication, pas une alerte -- la ligne est deja marquee par son statut. */
.bloque-par{ display:inline-block; margin-left:8px; padding:1px 8px; border-radius:9px;
  background:rgba(232,163,61,.14); color:var(--amber); font-size:11px; font-weight:600;
  white-space:nowrap; max-width:100%; overflow:hidden; text-overflow:ellipsis; vertical-align:middle; }

/* Le doublon US/CA d'une meme consigne (decision D3, voir matchingEngine.js) : la tache
   affichee est la seule du numero, et elle le DIT. La note de base est une explication,
   discrete comme .bloque-par ; la variante -alarme porte le cas ou la ligne couverte disait
   quelque chose de PLUS alarmant (verdict ou delai) -- elle doit se voir, jamais se deviner. */
.doublon-note{ margin-top:8px; padding:8px 11px; border-left:3px solid var(--grey-text);
  background:rgba(255,255,255,0.03); border-radius:0 6px 6px 0; font-size:11.5px;
  color:var(--grey-text); line-height:1.5; }
.doublon-note .doublon-alarme{ color:var(--amber); margin-top:5px; font-weight:600; }
/* « Les deux portent un delai, je ne sais pas lequel prime » (constat A6). LISIBLE, PAS
   ALARMANT : ce n'est pas un verdict plus rouge qu'on masquait, c'est un doute qu'on doit
   au lecteur. Donc la couleur du texte normal, pas l'ambre reserve a ce qui alarme. */
.doublon-note .doublon-incomparable{ color:var(--white-text); margin-top:5px; font-weight:600; }
/* Le libelle de l'autre autorite (doublon US/CA) : une citation discrete DANS la note, jamais
   un second titre -- une consigne, un titre, et le libelle couvert presente comme tel. */
.doublon-note .doublon-libelle{ margin-top:5px; font-style:italic; opacity:.9; overflow-wrap:anywhere; }
.doublon-badge{ display:inline-block; margin-left:8px; padding:1px 8px; border-radius:9px;
  background:rgba(232,163,61,.14); color:var(--amber); font-size:11px; font-weight:600;
  white-space:nowrap; vertical-align:middle; }

/* Note sur les frais de transaction non remboursables (page abonnement). Informative, pas
   une alerte : le client doit la lire s il rembourse, pas s en inquieter a chaque visite. */
.rembours-note{ margin-top:14px; padding:11px 13px; border:1px solid var(--hairline);
  border-left:3px solid var(--grey-text); border-radius:6px; font-size:12.5px;
  color:var(--grey-text); line-height:1.55; }

/* Liens de politiques et de revisions, injectes dans chaque pied de page par nav-menu.js.
   Discrets, sur une ligne sous le copyright, separes proprement en colonne sur telephone. */
/* LE margin-top:10px A ETE RETIRE. Ces liens sont un ELEMENT FLEX du pied, pas un bloc pose
   dessous : la marge haute les decalait de 5 px vers le bas par rapport au logo et au
   copyright (mesure en production : trois hauteurs differentes, 1048 / 1051 / 1056), ce qui
   donnait ce pied « de travers ». margin-left:auto les envoie a droite, ou ils tiennent leur
   propre colonne sans decaler le reste. */
.site-footer-links{ display:flex; flex-wrap:wrap; align-items:center; gap:8px 18px;
  margin:0 0 0 auto; font-size:12px; }
.site-footer-links a{ color:var(--grey-text); text-decoration:none; }
.site-footer-links a:hover{ color:var(--amber); }

/* Reprise des reponses, categorie par categorie (voir aircraft.html / reprendreReponses.js).
   Chaque ligne est une decision distincte : elle doit se lire et se cliquer comme telle. */
.reprise-cats{ display:flex; flex-direction:column; gap:7px; margin:11px 0 4px; }
.reprise-cat{ font-size:12.5px; color:var(--white-text); align-items:flex-start; cursor:pointer; }
.reprise-cat input{ margin-top:2px; }
.reprise-gain{ display:block; font-size:11px; color:var(--grey-text);
  font-family:'IBM Plex Mono',monospace; margin-top:1px; }
/* Repondre a la question d'equipement DEPUIS la consigne (voir aircraft.html). Se distingue du
   renversement juste en dessous : ce sont deux gestes de nature differente -- un fait sur
   l'aeronef, contre un jugement sur une consigne -- et les confondre est ce qui a fait croire
   qu'un renversement « ne changeait pas l'applicabilite ». */
.repondre-ici{ margin-top:10px; padding:9px 11px; border-left:3px solid var(--amber);
  background:rgba(255,178,0,0.06); border-radius:0 6px 6px 0; }
.repondre-ici-titre{ font-size:12px; color:var(--white-text); font-weight:600; }
.repondre-ici-note{ font-size:11px; color:var(--grey-text); margin-top:6px; line-height:1.45; }
/* L'ÉTAT D'UN BON DE TRAVAIL ET D'UNE TÂCHE — LA MÊME PASTILLE PARTOUT.
   Ces trois règles vivaient dans le <style> de certifications.html. Le 17 août 2026, en
   parcourant l'écran, on a constaté qu'un bon COMPLÉTÉ se lisait exactement comme un bon ouvert
   dans « Bons de travail de votre atelier » (ame.html) et au tableau de bord : seule la page du
   bon portait la pastille. Or c'est justement dans ces LISTES qu'on cherche où on en est.
   La classe monte donc ici : trois pages disent le même état, de la même façon. Une pastille
   recopiée dans chaque page finirait par diverger d'une page à l'autre. */
.c571-badge{ display:inline-block; font-size:10px; font-family:'IBM Plex Mono',monospace; padding:2px 7px; border-radius:4px; margin-left:6px; border:1px solid var(--hairline); }
.c571-badge.signed{ color:#7bbf8a; border-color:rgba(123,191,138,0.5); background:rgba(123,191,138,0.08); }
.c571-badge.draft{ color:var(--amber); border-color:var(--amber); background:rgba(230,180,80,0.10); }
/* LES CINQ ETATS D'UN DOCUMENT SCELLE -- memes couleurs que la page publique /verifier.html,
   pour qu'un document remplace ne soit pas vert ici et bleu la-bas (groupe 12, 23 aout 2026).
   Vert = valide ; bleu = remplace (« il y a une suite », pas « c'est faux ») ; rouge = annule ;
   ambre = fichier disparu ou etat inconnu (« regarde ca »). */
.c571-badge.etat-valide{ color:#7bbf8a; border-color:rgba(123,191,138,0.5); background:rgba(123,191,138,0.08); }
.c571-badge.etat-remplace{ color:#6ba3d6; border-color:rgba(107,163,214,0.5); background:rgba(107,163,214,0.10); }
.c571-badge.etat-annule{ color:var(--red); border-color:rgba(255,92,92,0.5); background:rgba(255,92,92,0.10); }
.c571-badge.etat-fichier_disparu{ color:var(--amber); border-color:var(--amber); background:rgba(230,180,80,0.10); }
.c571-badge.etat-inconnu{ color:var(--amber); border-color:var(--amber); background:rgba(230,180,80,0.10); }

/* UNE SORTIE POUR CHAQUE MODALE (voir public/modales.js). Hauteur nulle : la croix ne pousse
   rien vers le bas, le titre reste ou il etait. `sticky` la garde visible dans une boite qui
   defile en entier -- une croix absolue disparaitrait au premier defilement, c'est-a-dire
   exactement quand on en a besoin. */
.modal-fermer-zone{ position:sticky; top:0; height:0; text-align:right; z-index:5; }
.modal-fermer{
  position:relative; top:-14px; right:-10px; width:32px; height:32px; padding:0; margin:0;
  line-height:1; font-size:22px; border-radius:6px; cursor:pointer;
  background:transparent; border:1px solid transparent; color:var(--grey-text);
}
.modal-fermer:hover{ background:rgba(255,255,255,0.07); color:var(--white-text); }
.modal-fermer:focus-visible{ outline:2px solid var(--amber); outline-offset:2px; }

/* « CE QUE VOUS AVEZ TAPE VA DISPARAITRE » -- pose par public/modales.js, jamais dans le HTML.
   Une fenetre marquee `data-modale-garde-saisie` dans laquelle quelqu un a tape refuse le
   PREMIER geste de fermeture et affiche cette ligne ; le second geste ferme. Le meme patron de
   confirmation EN PLACE que « repondre aucun » sur une consigne (.repondre-ici) et que le
   « rouvrir » du questionnaire d equipement : la boite native, elle, s ouvre loin du bouton
   qu on vient de toucher -- et ce produit ne se sert ni de confirm() ni de alert(). */
.modale-avertissement{
  margin-top:14px; padding:9px 11px; border-left:3px solid var(--amber);
  background:rgba(230,180,80,0.09); border-radius:0 6px 6px 0;
  font-size:12.5px; line-height:1.45; color:var(--white-text);
}
