/* ==================================================================
   rapport.css — surcouche DÉDIÉE à l'écran « Rapport patrimonial » (#65).
   ------------------------------------------------------------------
   Ne modifie PAS optifisc.css : on RÉFÉRENCE ses tokens (var(--…)) et on
   réutilise ses classes (.card, .kpis, .bars, .gauge10k…). N'ajoute ici que
   ce qui est propre au rapport : mise en page d'en-tête, tableaux de
   synthèse, lignes de dérive, et surtout un média print PROPRE (le rapport
   est avant tout un document imprimable / exportable en PDF).
   Servi depuis 'self' (CSP). Aucune police externe, aucune emoji.
   ================================================================== */

/* — En-tête du rapport — */
.rapport-head{
  display:flex;align-items:flex-start;justify-content:space-between;gap:var(--of-gap);
  flex-wrap:wrap;margin:22px 0 10px;
}
/* #828 / #793 (05/08) — LA RÈGLE QUI ANNULAIT LE TITRE ÉDITORIAL SUR CE SEUL ÉCRAN.
   Elle posait `font-size:24px;font-weight:600;letter-spacing:-.01em` en dur — donc
   hors de la source unique de jetons — et, déclarée dans une feuille chargée APRÈS
   `optifisc.css` à spécificité égale, elle l'emportait sur `.page-head h1`.
   Conséquence mesurée : /rapport a gardé son titre en grotesque de 24 px pendant que
   les 21 autres écrans passaient au serif de 42 px, sans qu'aucune garde ne le voie —
   la garde de typographie vérifie que le SOCLE consomme son jeton, pas qu'un écran
   ne le rattrape pas. Seule la marge reste : elle est propre à un en-tête de
   document, pas une valeur de charte.
   ⚠️ Le corps d'impression (20 px, §@media print) reste, lui : c'est une décision
   de MÉDIA, sur une feuille A4 où un titre de 42 px mangerait le haut de page. */
.rapport-head h1{margin:2px 0 4px}
/* #986 (31/08/2026) — `flex-wrap` N'ÉTAIT PAS UN CONFORT : la barre est passée
   de DEUX boutons à TROIS avec l'arrivée de « Générer le dossier », et sur une
   fenêtre de 412 px elle sortait à 519 px — un contenu plus large que la fenêtre
   est INATTEIGNABLE, `body{overflow-x:hidden}` le masque sans le supprimer
   (#827, mesuré par `scripts/parite/largeurs-verif.mjs`).
   `min-width:0` avec : sans lui, un élément flex refuse de passer sous sa largeur
   de contenu et le retour à la ligne ne suffit pas à confiner la boîte. */
.rapport-head-actions{display:flex;flex-wrap:wrap;gap:8px;flex:0 1 auto;min-width:0}

/* — #804 — LA BANDE DU SCEAU (S5), en-tête de document.
     Bande RÉSERVÉE : rien ne passe derrière, ni titre ni bouton — le catalogue
     §2 l'exige (« un signe ne passe jamais derrière du texte ») et §5.4 demande
     que le parent borne le tracé. Le tracé est un carré : la bande l'est aussi,
     une bande plus large ne serait que du vide.

     La teinte vient de l'encre du document (`currentColor` dans le SVG) : le
     doré de l'étoile est isolé par `.of-signe-or`, seul groupe autorisé à le
     porter. Aucun jeton n'est redéclaré ici.

     ⚠️ PAS DE `no-print`, ET C'EST LE POINT. Le catalogue affecte ce signe à
     « l'en-tête de document imprimé » : c'est sur le papier qu'il a un sens.
     Il n'ajoute aucun aplat de fond — un trait et deux cercles, donc rien qui
     dépende de `print-color-adjust`. — */
.rapport-sceau{
  position:relative;overflow:hidden;flex:0 0 auto;margin-left:auto;
  width:66px;height:66px;color:var(--of-ink-550);pointer-events:none;
}
/* En étroit, l'en-tête se replie et le sceau prendrait une ligne de 66 px à lui
   seul — soixante-six pixels de décor sur un écran de 412. Il sort donc de
   l'affichage écran étroit. ⚠️ La règle est bornée à `screen` : la feuille A4 ne
   passe jamais sous ce seuil, et c'est SUR le papier que ce signe a son emploi
   (« en-tête de document imprimé », `CATALOGUE_ASSETS.md` §4). */
@media screen and (max-width:719px){
  .rapport-sceau{display:none}
}

/* — Grille de sections du rapport — */
.rapport .section{margin-top:var(--of-gap)}
.rapport .section + .section{margin-top:calc(var(--of-gap) + 4px)}

/* — Tableaux de synthèse (valorisation, comptes, justificatifs) — */
.rapport-table{width:100%;border-collapse:collapse;font-size:13px}
.rapport-table caption{text-align:left;color:var(--of-ink-550);font-size:12px;margin-bottom:6px}
.rapport-table th,.rapport-table td{
  padding:8px 10px;border-bottom:1px solid var(--of-line-200);text-align:left;vertical-align:top;
}
/* En-têtes de LIGNE (th scope="row") : poids normal, alignés à gauche comme une
   cellule de données — ils restent des en-têtes pour l'AT sans alourdir le rendu. */
.rapport-table tbody th{font-weight:400;color:var(--of-ink-950)}
.rapport-table thead th{
  color:var(--of-ink-550);font-weight:600;font-size:11.5px;text-transform:uppercase;
  letter-spacing:.04em;border-bottom:1px solid var(--of-line-300);
}
.rapport-table td.num,.rapport-table th.num{
  text-align:right;font-family:var(--of-font-data);font-variant-numeric:tabular-nums;
}
.rapport-table tfoot td{font-weight:600;border-top:1px solid var(--of-line-300);border-bottom:none}
.rapport-table tr:last-child td{border-bottom:none}

/* — Lignes de dérive vs glidepath (réel / cible / écart) — */
.derive-row{
  display:grid;grid-template-columns:minmax(120px,auto) 1fr auto;align-items:center;
  gap:10px;font-size:12.5px;padding:6px 0;
}
.derive-row .lbl{color:var(--of-ink-650)}
.derive-row .fig{font-family:var(--of-font-data);font-variant-numeric:tabular-nums;text-align:right}
/* L'écart de dérive est rendu par OF.ui.delta (.delta-pill) depuis #559 L3 :
   les trois règles de couleur locales n'avaient plus d'émetteur. */

/* — Pastilles d'état (complétude, dossier) réutilisant la sémantique DS — */
.etat-pill{
  display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:600;
  padding:3px 9px;border-radius:var(--of-radius-pilule);border:1px solid var(--of-line-300);
}
.etat-pill.ok{color:var(--of-positive-700);background:var(--of-positive-100);border-color:transparent}
.etat-pill.warn{color:var(--of-ink-950);background:var(--of-surface-100);border-color:var(--of-line-300)}
.etat-pill.bad{color:var(--of-negative-700);background:var(--of-negative-100);border-color:transparent}

/* — « Pièces à fournir » : LE PANNEAU EST PARTI, SA MISE EN FORME AUSSI (#828).
   Vingt-deux classes (`manques-titre`, `manques-ok`, `manque-liste`, `manque-item`,
   `manque-titre`, `manque-titre-txt`, `manque-toggle`, `manque-chevron`,
   `manque-panneau`, `manque-aide`, `manque-action`, `manque-action-note`,
   `manque-roles`, `manque-role`, `manque-badge`, `manque-nature`, `btn-import`…)
   décrivaient un dépliant d'obligations que `rapport.js` ne rend plus : zéro nœud
   dans le DOM rendu de /rapport, zéro porteur dans les 24 `.js` et 23 `.html`.
   Ce n'était pas du poids mort mais de la FAUSSE DOCUMENTATION EXÉCUTABLE — qui lit
   `.manque-toggle[aria-expanded="true"] .manque-chevron` en conclut que l'écran a un
   dépliant, et ne cherche pas plus loin.
   ⚠️ Ne pas confondre avec `decl-manque-*` (`declaration.js`), bien vivantes : c'est
   pour cette ressemblance que le détecteur de la garde les croyait portées — son
   `\b` fait frontière sur le tiret, donc `decl-manque-item` satisfaisait
   `manque-item`. Le relevé DOM tranche, le grep non.
   ⚠️ Ce que ce panneau montrait n'a pas disparu de l'écran : les pièces à fournir
   sont rendues par `sectionCompletude`, et « ce que la feuille ne couvre pas » par
   la section d'absences de #804, avec leurs propres classes. — */

/* — Actions à mener (#115) —
   Pour chaque manque restant (obligation déclarative non couverte, cours périmé),
   une ligne portant un libellé d'état (badge + texte, pas seulement la couleur) et
   un ou deux boutons d'action. Réutilise les boutons « soft » du design system. */
.actions{border-top:1px solid var(--of-line-300);margin-top:12px;padding-top:12px}
.actions-titre{font-size:13px;font-weight:600;margin:0 0 2px;color:var(--of-ink-950)}
.actions-ok{margin-top:10px}
.action-liste{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:8px}
.action-item{
  border:1px solid var(--of-line-300);border-left:3px solid var(--of-fiscal-750);
  border-radius:var(--of-radius-md);padding:9px 11px;background:var(--of-fiscal-100);
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 12px;
}
.action-titre{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;flex:1 1 240px}
.action-titre-txt{font-size:13px;font-weight:600}
.action-boutons{display:flex;flex-wrap:wrap;align-items:center;gap:8px;flex:0 0 auto}
.action-boutons .btn.soft{padding:6px 12px;font-size:12px}
.action-declarer:focus-visible,.action-boutons .btn:focus-visible{
  outline:2px solid var(--of-petrol-800);outline-offset:3px;border-radius:var(--of-radius-md);
}

/* — Carte fiscale par instrument (#29) —
   Tableau dense lisible : ISIN en sous-libellé monospace, drapeaux « à confirmer »
   portés par un libellé explicite (pas seulement la couleur) pour l'accessibilité. */
.carte-fiscale-table{font-size:12px}
.carte-fiscale-table td,.carte-fiscale-table th{vertical-align:top}
/* #828 — `ci-isin`, `ci-note`, `flag-fiscal`, `badge-caractere` et ses trois
   variantes (`badge-acc`, `badge-dist`, `badge-inconnu`) sont parties avec le rendu
   détaillé de la carte fiscale : zéro nœud, zéro porteur. La carte fiscale reste —
   elle se DÉPOSE au coffre chiffré (`btn-carte-fiscale`), elle ne se déplie plus
   ligne à ligne dans le rapport. Le tableau dense au-dessus, lui, est vivant. */
#carte-fiscale-statut{margin:10px 0 0;font-size:12.5px}

/* — Bandeau d'erreur (réutilise la sémantique « neg ») — */
.banner.err{
  background:var(--of-negative-100);color:var(--of-negative-700);border:1px solid transparent;
  border-radius:var(--of-radius-md);padding:12px 14px;margin:12px 0;font-size:13px;
}

/* — Petites légendes monétaires — */
.rapport .montant{font-family:var(--of-font-data);font-variant-numeric:tabular-nums;font-weight:600}
.rapport .montant.big{font-size:22px}

/* ==================================================================
   #804 — « CE QUE CETTE FEUILLE NE COUVRE PAS »
   ------------------------------------------------------------------
   Une absence relevée n'est PAS une alarme : elle ne prend donc ni le
   rouge du négatif, ni le laiton, qui est la signature du rail fiscal et
   n'a rien à faire ici. Un filet neutre à gauche, la même encre que le
   reste du document — la HIÉRARCHIE porte le sens, pas la couleur.

   ⚠️ ET ELLE S'IMPRIME. C'est même la section qui compte le plus sur
   papier : le lecteur d'une feuille ne peut pas cliquer pour vérifier.
   Aucune règle de masquage à l'impression, et aucun aplat de fond —
   voir le bloc `@media print` plus bas, qui la neutralise en encre tout
   en gardant son filet.
   ================================================================== */
.rapport-absence{
  border-left:2px solid var(--of-line-300);
  padding:2px 0 2px 12px;margin-top:12px;
}
.rapport-absence:first-of-type{margin-top:14px}
.rapport-absence-t{font-size:13px;font-weight:600;color:var(--of-ink-950)}
.rapport-absence-s{margin:3px 0 0;font-size:12.5px;line-height:19px;color:var(--of-ink-650)}

/* ==================================================================
   IMPRESSION — le rapport est d'abord un document.
   On masque le chrome applicatif (topbar, boutons), on neutralise les
   fonds/ombres coûteux en encre et on évite les coupures de cartes.
   ================================================================== */
@media print{
  /* Fond papier blanc, pas de halo radial (économie d'encre + lisibilité). */
  body{background:var(--of-white) !important;}
  /* #765 — le shell N'EST PLUS relisté ici. Il est masqué par le bloc
     `@media print` général d'`optifisc.css`, chargé avant sur les 22 pages.
     Redupliquer la règle, c'était deux sources vivantes pour une décision
     (#592) — et c'est précisément ce qui a laissé `#topbar` survivre au
     renommage : ce sélecteur-là ne désignait plus rien depuis la bascule. */
  .no-print{display:none !important;}

  .wrap{max-width:none;padding:0;margin:0;}
  .rapport-head{margin:0 0 8px;}
  .rapport-head h1{font-size:20px;}

  /* Cartes : bordure fine, pas d'ombre, pas de coupure au milieu d'une carte. */
  .card{box-shadow:none !important;border:1px solid var(--of-print-filet-decor) !important;break-inside:avoid;}
  .rapport .section,.kpis,.rapport-table,.derive-row{break-inside:avoid;}

  /* Liens en noir (pas de bleu peu lisible sur papier). */
  a{color:var(--of-print-encre) !important;text-decoration:none !important;}

  /* Les barres/jauges gardent leur tracé : on force l'impression des aplats.
     #828 — `.manque-item` et `.manque-badge` sortent de la liste avec le panneau
     qu'elles habillaient. Une classe d'impression ne se juge pas à l'écran, mais
     celles-ci n'ont de porteur dans AUCUN média : elles ne sont posées nulle part. */
  .bar .fill,.gauge10k .fill,.gauge10k .track,.etat-pill,.action-item{
    -webkit-print-color-adjust:exact;print-color-adjust:exact;
  }

  /* Actions à mener (#115) : sur papier, le constat (libellé d'état) reste, mais
     les boutons d'action interactifs n'ont aucun sens imprimés -> masqués. */
  .action-boutons,#actions-erreur{display:none !important;}
  .action-item{break-inside:avoid;}

  /* Justificatifs : le bandeau d'erreur n'a aucun sens sur papier -> masqué.
     #828 — les quatre règles de dépliant « Pièces à fournir » et `.rapport-dl`
     partent avec leur balisage. Elles décrivaient un comportement d'impression
     (« sur papier, tout déplié ») pour un panneau que l'écran ne rend plus : c'est
     la variante la plus trompeuse de la fausse documentation, parce qu'un média
     qu'on ne regarde pas tous les jours ne dément jamais la règle qui le décrit. */
  #justif-erreur{display:none !important;}

  /* #804 — LES ABSENCES SUR LE PAPIER. Elles ne se masquent PAS : c'est la
     section que le lecteur de la feuille ne peut pas aller vérifier ailleurs,
     donc celle qui doit survivre à l'impression. On neutralise seulement ce
     qui coûte de l'encre sans porter de sens — le filet passe en gris
     imprimable, le bloc ne se coupe pas au milieu, et aucun aplat de fond
     n'est introduit (la refonte visuelle d'un écran ne doit pas faire
     ressortir la feuille A4 en aplats de marine).

     ⚠️ 22/08/2026 — DÉCISION 12 DE LA FICHE #971 (réponse A) : ce gris-ci RESTE
     DISTINCT de celui des bordures de carte. Le clair (1,61:1) cerne une carte,
     c'est de la décoration et ça doit s'effacer ; celui-ci (2,85:1) souligne une
     ABSENCE, c'est de l'information — et la seule que le lecteur de la feuille ne
     peut aller vérifier nulle part ailleurs. Les deux valeurs vivaient en dur ; les
     jetons ne changent AUCUN pixel, ils rendent la distinction opposable. */
  .rapport-absence{border-left-color:var(--of-print-filet-absence) !important;break-inside:avoid;}
  .rapport-absence-t,.rapport-absence-s{color:var(--of-print-encre) !important;}
}

/* prefers-reduced-motion : aucune transition propre au rapport (déjà sobre). */
@media (prefers-reduced-motion:reduce){
  .rapport *{transition:none !important;}
}
