/* ===========================================================================
   LOT 08 — EN-TÊTE DE TABLE FIGÉ (data-entete-fixe)
   À charger APRÈS lot03-tables-larges.css et lot06-ancrage-gabarit.css, dont ce
   fichier arbitre la cellule de coin.

   CE QUE CE FICHIER CORRIGE
     « data-entete-fixe="true" » est écrit sur ONZE cadres de table, dans SEPT
     écrans (les six de la reprise Trésorerie, plus Recouvrement). QUATORZE
     maquettes de la passation EasyCompta le posent. Et jusqu'à ce fichier,
     AUCUNE feuille du dossier ne l'implémentait : pas un seul « position:
     sticky » sur un thead dans tout wwwroot/css. L'attribut ne faisait rien.

     L'explication est mécanique, et elle vaut d'être retenue parce qu'elle se
     reproduira : chaque maquette .dc.html porte la règle dans SON PROPRE bloc
     <style>, pour se rendre elle-même. Le portage a recopié le balisage —
     l'attribut a donc voyagé jusqu'au dépôt — et la règle est restée dans le
     fichier de maquette, où personne ne va la chercher.

   POURQUOI CE N'ÉTAIT PAS QU'UNE LIGNE DE « position: sticky »
     Un en-tête collant a besoin d'un CONTENEUR DE DÉFILEMENT BORNÉ. Sans
     hauteur maximale, « top: 0 » se mesure contre un scrollport qui ne défile
     jamais, et la tête ne se fige pas : c'est ce qui serait arrivé en posant la
     seule règle de la maquette dans une feuille du dépôt.

     Or .tbl-defile porte overflow-x: auto, ce qui rend AUSSI son overflow-y
     calculé « auto » (règle CSS : une valeur non-visible sur un axe force
     l'autre à auto). Le conteneur existe donc déjà — il lui manque seulement
     une borne. C'est elle que ce fichier pose, et c'est tout le lot.

   CE QUE CE FICHIER NE FAIT PAS
     · Il ne touche pas au gabarit .tbl-* de Tableau.razor : le composant
       n'écrit pas cet attribut, et lui donner un paramètre sans aucun appelant
       serait poser une deuxième affordance morte pour en réparer une première.
       Quand il en aura un, il faudra AJOUTER ICI la règle de coin pour
       « .tbl-ancre » (lot 06), pendant de celle écrite plus bas pour
       « data-ancre » (lot 03) — les deux familles n'ancrent pas par le même
       sélecteur.
     · Il ne fige pas le <tfoot>. Un seul des onze cadres en porte un
       (PlanTreso), et un pied collant est une décision de lecture — pas la
       symétrie automatique de la tête.

   AUCUNE COULEUR LITTÉRALE : tout vient des jetons du gabarit.
   =========================================================================== */

/* --- 1. La borne, qui est la condition du reste ---------------------------

   62vh : mesuré contre ce que les sept écrans posent AU-DESSUS de la table —
   barre de coquille, marge de .et-scroll, bandeau d'écran, bande de faits
   saillants et .tbl-barre font ensemble ~320 px. Sur un écran de 900 px de
   haut, 62vh en laisse 558, soit à peu près la place réelle ; c'est aussi
   l'ordre de grandeur des « max-height: 22rem à 34rem » que dix-neuf tables du
   dépôt écrivent déjà à la main, à ceci près qu'ici la valeur suit la hauteur
   de l'écran au lieu d'être un nombre par page.

   UNE VARIABLE ET NON UNE VALEUR : un écran dont le bandeau est plus haut la
   redescend depuis SA feuille, sans réécrire ce sélecteur.

   max-height ET NON height : une table plus courte que la borne ne l'atteint
   pas, ne crée aucun conteneur qui défile, et se rend exactement comme avant ce
   lot. C'est le cas le plus fréquent, et c'est ce qui rend ce fichier sûr. */
.tbl-cadre[data-entete-fixe="true"] > .tbl-defile {
    max-height: var(--tbl-defile-h, 62vh);
    overflow-y: auto;
}

/* --- 2. La tête se fige ---------------------------------------------------

   z-index 3 : au-dessus des cellules ancrées à gauche (2, lot 03 et lot 06),
   au-dessous de la cellule de coin (4, ci-dessous). .tbl thead th peint déjà un
   aplat opaque (--tbl-tete-fond) : rien à ajouter pour que les rangées passent
   dessous sans transparaître. */
.tbl-cadre[data-entete-fixe="true"] .tbl > thead > tr > th {
    position: sticky; top: 0; z-index: 3;
    /* LE FILET INFÉRIEUR DOIT VOYAGER AVEC LA CELLULE, et c'est le même piège
       qu'au lot 03 : sous border-collapse (le défaut de .tbl) la bordure
       appartient à la TABLE, pas à la cellule — elle resterait en arrière et la
       tête figée n'aurait plus de séparation. Or ce filet a une raison écrite
       (easytime-shell.css, § .tbl thead th) : « il porte quand la tête défile
       sous une ligne sélectionnée », c'est-à-dire exactement le cas que ce lot
       rend enfin possible.

       inset ET NON une ombre portée : une ombre extérieure se poserait SOUS la
       bordure fusionnée et donnerait un trait de deux pixels au repos. Posée à
       l'intérieur, elle recouvre la même ligne de pixels et ne se voit qu'une
       fois. Même raisonnement qu'au lot 06 pour le liseré d'alerte. */
    box-shadow: inset 0 -1px 0 var(--et-table-head-fonce);
}

/* --- 3. Le coin, où les deux ancrages se croisent -------------------------

   Le lot 03 avait DÉJÀ écrit cette arbitration, pour un en-tête figé qui
   n'existait pas encore : « si l'en-tête est par ailleurs figé en haut, les
   deux ancrages se croisent dans la cellule du coin, et c'est l'en-tête qui
   doit rester lisible » — d'où son z-index 4 et son aplat de tête. Ce lot ne
   fait que rendre vraie l'hypothèse de ce commentaire.

   IL FAUT NÉANMOINS RÉÉCRIRE LA RÈGLE ICI, et c'est une affaire de spécificité,
   pas de goût : la règle 2 ci-dessus pèse (0,3,3) et celle du lot 03 (0,3,2),
   donc la règle 2 l'emporterait et emporterait avec elle le z-index 4 ET le
   filet DROIT de la cellule de coin, remplacé par son propre filet du bas. Le
   sélecteur ci-dessous pèse (0,5,2) et rend les deux à la cellule, qui porte
   les DEUX filets parce qu'elle borde deux régions à la fois. */
.tbl-cadre[data-entete-fixe="true"] .tbl-ancree[data-ancre="1"] > thead > tr > :nth-child(1),
.tbl-cadre[data-entete-fixe="true"] .tbl-ancree[data-ancre="2"] > thead > tr > :nth-child(2),
.tbl-cadre[data-entete-fixe="true"] .tbl-ancree[data-ancre="3"] > thead > tr > :nth-child(3),
.tbl-cadre[data-entete-fixe="true"] .tbl-ancree[data-ancre="4"] > thead > tr > :nth-child(4) {
    z-index: 4;
    box-shadow: 1px 0 0 var(--et-hairline), inset 0 -1px 0 var(--et-table-head-fonce);
}

/* --- 4. Paliers -----------------------------------------------------------

   docs/conventions-responsive.md : palier pris dans l'échelle retenue.

   SOUS 640 px, LA BORNE TOMBE. C'est le palier où le rail devient un tiroir et
   où l'écran est sans ambiguïté un téléphone : une zone qui défile dans une
   page qui défile s'y attrape au doigt par erreur, et la page perd le geste.
   Sans borne, .tbl-defile ne défile plus verticalement, et la règle 2 devient
   inerte d'elle-même — il n'y a rien d'autre à annuler. */
@media (max-width: 640px) {
    .tbl-cadre[data-entete-fixe="true"] > .tbl-defile { max-height: none; }
}

/* IMPRESSION. easytime-shell.css rend déjà .tbl-defile en overflow visible pour
   le papier ; il ne pouvait pas prévoir une hauteur maximale, qui tronquerait
   la table à la première page. La tête redevient statique par la même occasion :
   figée, elle n'a aucun sens sur une feuille, et certains moteurs la répètent
   au mauvais endroit. */
@media print {
    .tbl-cadre[data-entete-fixe="true"] > .tbl-defile {
        max-height: none !important; overflow: visible !important;
    }
    .tbl-cadre[data-entete-fixe="true"] .tbl > thead > tr > th {
        position: static !important; box-shadow: none !important;
    }
}
