/* MILLÉSIME SANTÉ — feuille d'impression.
 *
 * Liée avec `media="print"` : elle n'est jamais évaluée à l'écran, donc elle ne
 * peut rien casser de l'affichage. Elle ne contient QUE de la structure — ce
 * qui disparaît, ce qui s'aère, ce qui ne doit pas se couper en deux.
 *
 * LES COULEURS NE SONT PAS ICI. Le mode clair forcé est généré par
 * `build/palette.py` dans un bloc `@media print` de `tokens.css`, qui reprend
 * exactement les sélecteurs des blocs sombres pour les battre par l'ordre.
 * Recopier trente-six valeurs hexadécimales dans ce fichier les aurait sorties
 * du seul endroit qui a le droit d'en contenir, et la prochaine génération ne
 * les aurait pas mises à jour.
 *
 * Ce qu'on imprime : une fiche d'établissement, ou un comparateur, tels qu'ils
 * sont à l'écran. Pas une mise en page alternative — un document imprimé qui ne
 * ressemble pas à ce qu'on avait sous les yeux est un document qu'on ne
 * reconnaît pas.
 */

/* PAYSAGE, PARCE QUE LES TABLEAUX NE TIENNENT PAS EN PORTRAIT.
 *
 * Mesure du 2026-08-25 : la table du classement fait 1 201 px et celle du
 * comparateur 1 206, pour 703 px imprimables en A4 portrait — six colonnes sur
 * douze tombaient hors de la page, dont 2024, le millésime de référence. La
 * fiche elle-même dépassait de 15 px.
 *
 * En paysage, la largeur imprimable passe à 273 mm, soit 1 032 px. Cela ne
 * suffit toujours pas seul : c'est `table-layout: fixed` plus bas qui garantit
 * que tout rentre. Les deux ensemble, et aucune donnée ne disparaît.
 *
 * La carte et la fiche s'impriment donc aussi en paysage. C'est le prix assumé
 * d'une seule règle `@page` : les pages nommées, qui permettraient une
 * orientation par écran, ne sont pas assez répandues pour qu'on en dépende. */
@page {
  size: A4 landscape;
  margin: 14mm 12mm;
}

/* --------------------------------------------------------------- le chrome */

/* Tout ce qui sert à NAVIGUER disparaît : sur papier, aucun de ces contrôles
 * ne peut être actionné, et chacun coûte de la hauteur. Le bandeau de cadrage
 * part aussi — il a remplacé la barre de filtres, et son contenu est repris en
 * tête de chaque panneau, dans le sous-titre qui porte déjà le libellé du
 * filtre. */
header.appli,
.bandeau,
nav.ecrans,
.reglages,
.panneau-flottant,
.onglets,
.pagination,
.selection,
#chargement,
.suggestions,
.fil-liste,
dialog.apropos,
dialog.rapport-dialogue,
.vs-commandes-carte,
.vs-infobulle {
  display: none !important;
}

/* LE MODE D'EMPLOI DES GESTES N'A RIEN À FAIRE SUR DU PAPIER.
 *
 * La carte imprimée expliquait comment zoomer à la molette, glisser pour se
 * déplacer et survoler une région — aucun de ces gestes ne s'exécute sur une
 * feuille. Vu sur la capture du 25 août, invisible autrement.
 *
 * La **clé de lecture** reste, et c'est la moitié qui compte : sans elle, un
 * disque n'a pas de sens et le gris ne se distingue pas d'un zéro. Les deux
 * étaient dans le même paragraphe ; `ui-carte.js` les a séparés pour que
 * celui-ci puisse partir seul. */

/* Les actions d'un panneau — export CSV, export PDF, sélecteurs — n'ont pas
 * de sens imprimées. L'année de référence, si : elle est déjà dans le titre. */
.panneau > header .actions,
.champ-recherche,
button.bouton,
.bouton-icone,
.lien-bouton {
  display: none !important;
}

/* --------------------------------------------------------------- la page */

html, body {
  background: #fff;
  overflow: visible;
}

main {
  display: block;
  padding: 0;
}

/* Le panneau perd son cadre et son fond : sur papier, un aplat gris coûte de
 * l'encre et n'apporte aucune hiérarchie que le blanc tournant ne donne pas. */
.panneau {
  border: 0;
  background: none;
  box-shadow: none;
  padding: 0;
  margin: 0 0 8mm;
  /* Un panneau coupé entre deux pages est lisible ; un TITRE séparé de son
   * tableau ne l'est pas. */
  break-inside: auto;
}
.panneau > header {
  break-after: avoid;
  margin-bottom: 3mm;
}

/* ------------------------------------------------------------- l'en-tête */

/* Le document imprimé doit dire de quoi il parle sans la barre de navigation :
 * on rétablit un titre de document à partir de la marque, en tête de page. */
#appli::before {
  content: "MILLÉSIME SANTÉ — volumes d'actes chirurgicaux, source Assurance Maladie / VISUCHIR";
  display: block;
  margin-bottom: 6mm;
  padding-bottom: 2mm;
  border-bottom: 1px solid var(--md-sys-color-outline);
  font-size: 9pt;
  color: var(--md-sys-color-on-surface-variant);
}

footer.appli {
  break-before: avoid;
  border-top: 1px solid var(--md-sys-color-outline-variant);
  padding-top: 2mm;
  font-size: 8pt;
}

/* --------------------------------------------------------------- tableaux */

/* Le tableau ne défile plus : il n'a plus de fenêtre où défiler. La colonne
 * figée cesse de l'être — un `position: sticky` sur papier fige la colonne à
 * l'endroit où la première page l'a laissée. */
.table-enveloppe,
.table-colonne-figee {
  overflow: visible !important;
  max-height: none !important;
}
/* AUCUNE CELLULE N'EST COLLANTE SUR PAPIER, PAS SEULEMENT LA COLONNE FIGEE.
 *
 * La regle ne visait que `.colonne-figee`. Or les en-tetes triables portent
 * eux aussi `position: sticky`, et l'un d'eux se peignait PAR-DESSUS la
 * colonne voisine : « EVOLUTION » a cheval sur « 2024 », visible sur la
 * capture du 2026-08-25. La mise en page etait juste — le bouton mesurait
 * 53 px dans une cellule de 62 — c'est le rendu qui decalait la cellule.
 *
 * Un `position: sticky` n'a aucun sens sans fenetre de defilement : sur
 * papier il ne colle a rien, il derive. */
table.donnees th,
table.donnees td {
  position: static !important;
}

/* L'EN-TETE TRIABLE REDEVIENT DU TEXTE.
 *
 * La fleche de tri ne s'actionne pas sur papier, et elle occupait 16 px d'une
 * colonne qui en compte 62. Le bouton lui-meme etait en `inline-flex` et
 * aligne a droite : son texte debordait par la GAUCHE et se faisait rogner —
 * « /OLUTION » au lieu d'« EVOLUTION », par-dessus la colonne 2024. En
 * `inline` sans remplissage, il se comporte comme le texte qu'il est devenu et
 * revient a la ligne si besoin. Mesure : zero en-tete coupe, zero
 * debordement. */
table.donnees th.triable button.tri svg { display: none !important; }
table.donnees th.triable button.tri {
  display: inline;
  padding: 0;
}

/* `width: 100%` NE CONTRAINT RIEN, ET C'EST LE PIÈGE DE CE FICHIER.
 *
 * La déclaration était déjà là, et la table du classement faisait quand même
 * 1 201 px. En disposition automatique, `width: 100%` est un **minimum** : le
 * tableau grossit dès que ses colonnes réclament davantage. Elle a l'air de
 * faire le travail, elle ne le fait pas — et rien ne le disait, puisqu'à
 * l'écran l'enveloppe défile.
 *
 * LA CONTRAINTE NE VISE QUE LES DEUX TABLES LARGES. Mesures du 2026-08-25, en
 * paysage, pour 957 px utiles : classement 1 075 px, comparateur 1 176 — mais
 * fiche 718, qui tient sans qu'on lui impose rien. Forcer la disposition fixe
 * partout coûtait cher là où c'était inutile : sur la fiche, les noms de
 * spécialité — « DIGESTIF VISCERAL », « GYNECO OBSTETRIQUE » — se coupaient
 * dans une première colonne devenue trop étroite.
 *
 * AUCUNE LARGEUR N'EST IMPOSÉE AUX COLONNES, et c'est mesuré. Réserver 18, 25
 * ou 30 % à la colonne d'identité donnait 1, 77 et 79 cellules coupées ; les
 * laisser égales en donne 37, toutes dans une seule colonne d'étiquettes, et
 * aucun nombre n'est touché. Le nom d'établissement, lui, revient à la ligne. */
#ecran-classement table.donnees,
#ecran-comparateur table.donnees {
  table-layout: fixed;
  font-size: 8pt;
}
#ecran-classement table.donnees th,
#ecran-classement table.donnees td,
#ecran-comparateur table.donnees th,
#ecran-comparateur table.donnees td { padding: 0.7mm 1.2mm; }

/* LES EN-TETES DESCENDENT A 7 pt, PARCE QU'UN TITRE COUPE REND SA COLONNE
 * ININTERPRETABLE. A 8 pt, « Categorie » se coupait et « EVOLUTION » se
 * dessinait par-dessus la colonne 2024 — visible sur la capture, invisible
 * pour le compteur de troncature, qui ne regarde que la cellule. A 7 pt : zero
 * en-tete coupe, zero debordement, et la rangee d'en-tete garde ses 46 px. */
#ecran-classement table.donnees thead th,
#ecran-comparateur table.donnees thead th { font-size: 7pt; }

/* LA COLONNE D'IDENTITE GARDE 26 %, ET CE NOMBRE A ETE PAYE CHER.
 *
 * A colonnes egales, la mesure disait « 37 cellules coupees sur 612 » — un bon
 * chiffre. La capture disait autre chose : LES NOMS D'ETABLISSEMENT AVAIENT
 * DISPARU. Ils vivent dans une boite flex a l'interieur de la cellule ; a
 * 77 px de colonne elle tombe a 1 px de large, et un nom absent n'est pas un
 * nom tronque — aucun compteur de troncature ne le voit. Un classement sans
 * noms est un document inutile.
 *
 * A 26 % le nom fait 179 px, et il reste 62 px par colonne chiffree. C'est
 * juste : « +18,6 % » en demande 48, et les marges d'origine — 1 mm sur 2 —
 * n'en laissaient que 51. D'ou les 0,7 mm et les 8 pt ci-dessus, qui rendent
 * une dizaine de pixels par colonne. Resultat mesure : UNE cellule coupee sur
 * 612, l'en-tete « Categorie », et aucun nombre.
 *
 * LA LECON EST DANS L'ECART ENTRE LES DEUX MESURES. Le compteur de troncature
 * ne peut pas voir ce qui a une largeur nulle. Toute mesure de mise en page
 * doit donc etre confrontee a l'image. */
#ecran-classement table.donnees th:first-child,
#ecran-classement table.donnees td:first-child,
#ecran-comparateur table.donnees th:first-child,
#ecran-comparateur table.donnees td:first-child { width: 26%; }

/* SUR PAPIER ON REVIENT À LA LIGNE, ON NE TRONQUE PAS.
 *
 * À l'écran, une cellule tronquée reste consultable : le survol ou la largeur
 * de fenêtre rendent le texte. Sur papier il n'y a aucun recours — un en-tête
 * « Taux ambu… » rend sa colonne ininterprétable.
 *
 * LA RÈGLE DOIT ATTEINDRE LES ENFANTS. Posée sur `th`/`td` seuls, elle ne
 * changeait rien : les noms restaient coupés, « Cliniques privées » se
 * dessinait PAR-DESSUS la colonne Dpt, et « 2024 » chevauchait « ÉVOLUTION ».
 * Le texte n'est pas dans la cellule, il est dans un lien ou un `span` qui
 * porte ses propres `white-space: nowrap` et `text-overflow: ellipsis` hérités
 * de l'écran. La cellule obéissait ; son contenu, non.
 *
 * `word-break` RESTE À `normal`, ET C'EST UNE CORRECTION. Avec `break-word`,
 * les mots se brisaient au milieu — « Cliniq / es / privée / s », « ÉV / OL /
 * UTI » — et les rangées gonflaient jusqu'à se chevaucher. Le retour à la
 * ligne n'était pas le problème ; la césure forcée l'était.
 *
 * `overflow: hidden` sur la cellule reste le garde-fou : il empêche un contenu
 * de se dessiner sur sa voisine. Le prix est en hauteur — une rangée passe de
 * 39 à 61 px quand un nom déborde sur deux lignes — et la hauteur est ce que
 * le papier a de moins cher : l'en-tête se répète en haut de chaque page. */
table.donnees th,
table.donnees td {
  overflow: hidden;
  vertical-align: top;
}
table.donnees th,
table.donnees td,
table.donnees th *,
table.donnees td * {
  white-space: normal !important;
  word-break: normal;
  text-overflow: clip !important;
  max-width: none !important;
}

/* UNE CASE À COCHER VIDE NE VEUT RIEN DIRE SUR PAPIER. Elle sert à composer
 * une comparaison à l'écran ; imprimée, elle occupe une place qui manque aux
 * colonnes de droite. La retirer a fait tomber la largeur naturelle de la
 * table du classement de 1 201 à 1 075 px — à elle seule, un dixième du
 * problème. */
table.donnees input[type="checkbox"] { display: none !important; }
/* L'en-tête se répète en haut de chaque page : sans cela, la deuxième page
 * d'un classement est une grille de nombres sans colonnes. */
table.donnees thead { display: table-header-group; }
table.donnees tr { break-inside: avoid; }
table.donnees th,
table.donnees td {
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  padding: 1mm 2mm;
  height: auto;
}

/* ------------------------------------------------------- couleur imprimée */

/* `print-color-adjust: exact` demande au navigateur de NE PAS économiser
 * l'encre sur ces éléments. C'est nécessaire et c'est limité à ce qui perdrait
 * son sens en noir : la pastille qui identifie une série, la barre d'un
 * histogramme, le tracé d'une courbe. Le reste — fonds, halos — reste soumis à
 * l'économie par défaut, et tant mieux.
 *
 * La règle de compensation continue de s'appliquer : chaque série porte aussi
 * une FORME de marqueur distincte, et la légende la reprend. Une impression en
 * noir et blanc reste donc lisible même si le pilote ignore cette propriété. */
.puce-serie,
.pastille,
svg .vs-serie,
svg .vs-ligne,
svg .vs-barre,
.vs-bh-barre,
.sparkline {
  print-color-adjust: exact;
  -webkit-print-color-adjust: exact;
}

/* Les graphiques : deux côte à côte deviennent illisibles sur 186 mm utiles. */
.graphiques { display: block; }
.zone-graphique {
  break-inside: avoid;
  margin-bottom: 4mm;
}
.zone-graphique svg { width: 100%; height: auto; }

/* ------------------------------------------------------- ce qu'on garde */

/* L'arbre de répartition s'imprime OUVERT sur ce qui l'était à l'écran, et
 * rien de plus : imprimer 337 familles parce qu'elles existent n'aiderait
 * personne. La boîte d'enfants doit donc cesser d'être une grille à 0fr, sans
 * quoi les nœuds ouverts sortiraient vides. */
.vs-arbre-enfants { grid-template-rows: 1fr !important; }
.vs-arbre-enfants > * { overflow: visible !important; }
.vs-arbre-noeud { break-inside: avoid; }

/* La composition reconstruite reste imprimée avec son avertissement : c'est
 * exactement le document qu'on risque de faire circuler en oubliant qu'il
 * s'agit d'une déduction et non d'une donnée publiée. */
details.composition { border: 0; padding: 0; }
details.composition > summary { list-style: none; font-weight: 600; }
details.composition[open] > summary::marker { content: ""; }

/* Le marquage des valeurs estimées survit à l'impression : le pointillé est la
 * seule chose qui dise, sur papier, qu'un chiffre repose sur une estimation. */
.estime {
  border-bottom: 1.5pt dotted var(--md-sys-color-tertiary);
  background: none;
  print-color-adjust: exact;
  -webkit-print-color-adjust: exact;
}

/* Les infobulles ne s'impriment pas — leur contenu est perdu. Les notes, si :
 * elles portent les avertissements de méthode. */
.note {
  font-size: 8pt;
  break-inside: avoid;
}

/* SUR PAPIER, LE PIED REDEVIENT UN BLOC. Superpose, il masquerait la portion
 * de carte qu'il recouvre — a l'ecran on peut deplacer la carte sous lui, pas
 * sur une feuille. */
.carte-pied {
  display: block !important;
  position: static !important;
  background: none !important;
  backdrop-filter: none !important;
  padding: 0 !important;
}

/* L'ATTRIBUTION SURVIT AU PAPIER. Un fond imprime reste un fond diffuse : la
 * licence s'applique a la feuille comme a l'ecran. Elle redevient un bloc
 * ordinaire plutot que de flotter sur la carte. */
.carte-attribution {
  position: static !important;
  background: none !important;
  padding: 0 !important;
}
