/* ============================================================
   HOLANGCOURS : Tokens. SOURCE UNIQUE de vérité.
   Variables déclarées dans .hol-scope, JAMAIS dans :root
   (cohabitation avec euduc.com en production).
   Aucune couleur de marque hors de ce fichier.
   ============================================================ */
.hol-scope {
  /* Gouttière du site : marge horizontale de TOUTES les pages
     100 px par défaut ; réduite sous 900 px pour tenir à 360 px. */
  /* Marge horizontale du site. Une seule valeur, fluide : 100px sur grand

     écran, réduite d'elle-même jusqu'à 24px sur mobile (8vw). */

  --hol-gutter: clamp(24px, 8vw, 100px);

  /* AIR VERTICAL D'UNE SECTION. Même principe que la gouttière, et pour la même
     raison : Jimmy, écran de téléphone en main, « il y a trop d'espace entre les
     sections, ça fait vide ». Les quatre-vingt-huit pixels dessinés pour un
     grand écran valaient aussi sur trois cent soixante-quinze, où ils font un
     tiers de la hauteur visible. La valeur descend donc d'elle-même à
     cinquante-deux, sans règle de média et sans qu'une page ait à le savoir.
     « dense » est la variante des sections qui s'enchaînent sans respiration. */
  --hol-bloc:       clamp(52px, 9vw,   88px);
  --hol-bloc-dense: clamp(40px, 6.6vw, 64px);

  /* Motif de fond des sections claires (dérivés de brand / brand-clair / accent-clair)
     Décoratif uniquement. Modifier ces trois valeurs suffit à régler le grain et les halos. */
  --hol-motif-dot: rgba(62, 64, 149, .085);      /* = --hol-brand à 8,5 % */
  --hol-motif-halo-1: rgba(150, 152, 222, .20);  /* = --hol-brand-clair à 20 % */
  --hol-motif-halo-2: rgba(240, 152, 155, .12);  /* = --hol-accent-clair à 12 % */

  /* LE MÊME GRAIN, SUR FOND SOMBRE. Le point bleu à 8,5 % disparaît sur le
     bleu nuit : il faut de la lumière, pas de l'encre. Mêmes dessins, mêmes
     tailles, trois valeurs changées. Voir « .hol-grain--sombre ». */
  /* 3,5 % et pas 9 : sur du bleu nuit, la lumière ressort bien plus que
     l'encre ne ressort sur du clair. À 9 % la grille se comptait point par
     point et prenait le pas sur la photo ; à 3,5 % elle ne se voit plus, elle
     se devine, et c'est tout ce qu'on lui demande. */
  --hol-motif-dot-clair: rgba(255, 255, 255, .035);
  --hol-motif-halo-clair-1: rgba(150, 152, 222, .17);
  --hol-motif-halo-clair-2: rgba(240, 152, 155, .09);

  /* LE VERRE. Une carte posée sur une photo peut être une plaque opaque, ou
     une vitre dépolie qui laisse deviner ce qu'il y a dessous. La seconde se
     tient dans la page au lieu d'être collée dessus. Trois valeurs : la vitre,
     son bord, et la lumière qui court sur son arête haute. */
  /* 93 % et pas 90 : sous les trois derniers pour cent, le texte gris des
     mentions passait à 4,4 contre 1 sur une photo sombre, c'est-à-dire sous le
     seuil de lisibilité. La vitre reste une vitre, elle est juste honnête. */
  --hol-verre: rgba(255, 255, 255, .93);
  --hol-verre-bord: rgba(255, 255, 255, .60);
  --hol-verre-lueur: rgba(255, 255, 255, .85);
  --hol-verre-reflet: rgba(255, 255, 255, .38);

  /* Surfaces, */
  --hol-surface-0: #EEF1F8;        /* fond de page (le plus fréquent) */
  --hol-surface-1: #FFFFFF;        /* cartes et blocs */
  --hol-surface-2: #FFFFFF;        /* surélevé (menus, modales) + shadow */
  --hol-surface-inverse: #1E2340;  /* sections sombres, rares, intentionnelles */
  /* LE MÊME MARINE, MAIS PAS TOUT À FAIT OPAQUE. Il ne sert qu'à une chose :
     le pied des cartes à photo de fond, où le texte blanc se lit sur un aplat.
     Jimmy : « ce bleu est trop compact ; baisse-le un peu pour que je voie
     légèrement ce qu'il y a derrière, sans que mes yeux quittent le texte ».
     Huit pour cent de photo qui transparaît, c'est une texture, pas une image :
     on la devine, on ne la lit pas.

     POURQUOI .94 ET NON .92. Les deux se ressemblent à l'œil, mais la mesure
     les sépare. Le contraste a été calculé sur les vraies photos, pixel par
     pixel, sous le bloc de texte : à .92 le texte courant tombait à 4,5:1 sur
     la photo des tarifs, c'est-à-dire pile sur le seuil, sans marge. À .94 il
     remonte autour de 5:1 et le blanc reste au-dessus de 8:1, pendant qu'on
     devine toujours ce qu'il y a derrière. Ne pas descendre sans refaire ce
     calcul sur la photo la plus claire du site. */
  --hol-voile-fond: rgba(30, 35, 64, .94);
  --hol-voile-modale: rgba(30, 35, 64, .62);  /* derrière une fenêtre ouverte au milieu de l'écran */

/* ===========================================================================
   LA SIGNATURE SUR LE BORD D'UNE CARTE (.hol-card--signee)

   Jimmy, en regardant les grandes cartes du site : « mets notre petite icône
   légèrement sur la bordure, en haut à gauche, centrée sur la bordure, pour
   que ça fasse un effet premium dans tout le site ».

   C'est le même dessin que la puce du hero, en image de fond plutôt qu'en
   balise : une carte n'a pas à porter un élément de plus dans son HTML pour
   être signée, une classe suffit, et la marque ne s'intercale pas dans la
   lecture d'un lecteur d'écran, où elle n'aurait rien à dire.

   ELLE EST À CHEVAL SUR LE BORD, à moitié dedans, à moitié dehors, et elle
   emporte avec elle un peu de la couleur du fond pour interrompre le filet :
   sans cela, la bordure passerait entre les trois traits et l'on croirait à un
   défaut. Le fond se règle par « --hol-signe-fond » quand la carte n'est pas
   posée sur la surface ordinaire.

   DEUX ENCRES, comme la puce : les bleus sur fond clair, le blanc sur fond
   sombre. Un fichier SVG séparé aurait demandé un second aller-retour réseau
   pour vingt-six pixels ; il est donc écrit dans le jeton.
   =========================================================================== */
  --hol-signe:        url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke-linecap='round'><path d='M5.4 18.6 10.2 5.4' stroke='%233E4095' stroke-width='4'/><path d='M11.4 18.6 16.2 5.4' stroke='%239698DE' stroke-width='3.1'/><path d='M17.4 18.6 22.2 5.4' stroke='%23CD3438' stroke-width='2.2'/></svg>");
  --hol-signe-inverse: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke-linecap='round'><path d='M5.4 18.6 10.2 5.4' stroke='%23FFFFFF' stroke-width='4'/><path d='M11.4 18.6 16.2 5.4' stroke='%23C7CBDD' stroke-width='3.1'/><path d='M17.4 18.6 22.2 5.4' stroke='%23F0989B' stroke-width='2.2'/></svg>");


  /* Hero (référence verrouillée), */
  --hol-hero-navy: #23284D;
  /* LE FONDU DU BORD D'UNE RANGÉE QUI DÉFILE. Une opacité ne se déduit pas
     d'un hexadécimal sans color-mix(), que les vieux Android ignorent : les
     deux bouts du dégradé s'écrivent donc, et ils valent --hol-surface-inverse.
     Le bout transparent est écrit en rgba et non « transparent » : les moteurs
     anciens interpolent « transparent » en passant par le noir, et le fondu
     laissait une bavure grise. */
  --hol-inverse-fondu-plein: rgba(30,35,64,1);
  --hol-inverse-fondu-nul:   rgba(30,35,64,0);
  --hol-hero-scrim-a: rgba(14,15,30,.9);
  --hol-hero-scrim-b: rgba(20,22,42,.72);
  --hol-hero-scrim-c: rgba(20,22,42,.32);
  /* Voile intermédiaire : assez dense pour tenir la couleur du site sur une
     photo, assez clair pour que la photo reste lisible dessous. */
  --hol-hero-scrim-d: rgba(20,22,42,.82);
  /* Fin de voile : la même teinte à zéro, jamais le mot « transparent ». Les
     WebKit anciens interpolent ce mot vers du noir transparent et laissent une
     bavure grise au milieu du dégradé. */
  --hol-hero-scrim-nul: rgba(20,22,42,0);
  /* Le voile de la scène sonore. Il n'est pas là pour cacher l'image, il est
     là pour que le texte posé dessus se lise : il est donc dense AU CENTRE,
     derrière les mots, et il s'efface vers les bords, où l'image reste nette.
     La teinte générale, légère, garde la carte dans les couleurs de la maison
     sans éteindre la photo. */
  --hol-voile-son-a: rgba(30,35,64,.88);     /* au centre, sous le texte */
  --hol-voile-son-nul: rgba(30,35,64,0);     /* aux bords, rien */
  --hol-voile-son-b: rgba(62,64,149,.30);    /* la teinte de marque, partout */
  --hol-header-bg: rgba(255,255,255,.94);

  /* Texte, */
  --hol-text-primary: #1A1C2B;     /* 16,9:1 / blanc */
  --hol-text-secondary: #565C72;   /* 6,6:1 */
  --hol-text-muted: #656B7F;       /* 5,3:1 / blanc, 4,7:1 / surface-0 */
  --hol-text-inverse: #FFFFFF;
  --hol-text-inverse-1: #DDE0EC;
  --hol-text-inverse-2: #C7CBDD;   /* 9,5:1 / inverse */
  --hol-text-inverse-muted: rgba(255,255,255,.6);

  /* Bordures, */
  --hol-border-subtle: #E3E7F1;
  --hol-border-strong: #CFD4E4;
  --hol-border-on-dark: rgba(255,255,255,.16);
  /* Surfaces posées SUR un fond sombre. Un aplat de la marque n'y ressort pas :
     bleu sur bleu se sépare à 1,6:1, très loin des 3:1 qu'un élément
     d'interface doit atteindre pour se lire comme une forme. */
  --hol-surface-sur-sombre: rgba(255,255,255,.13);
  --hol-surface-sur-sombre-fort: rgba(255,255,255,.22);
  /* Le CONTOUR d'un élément posé sur du sombre, pas son remplissage : c'est
     lui qui doit atteindre 3:1, sinon la pastille se lit comme du texte qui
     flotte. Un fond assez opaque pour y arriver seul étoufferait la photo. */
  --hol-bordure-sur-sombre: rgba(255,255,255,.46);
  /* Trame diagonale posée sur un aplat sombre : décorative, presque invisible,
     juste assez pour que l'aplat ne soit pas mort. */
  --hol-trame-sur-sombre: rgba(255,255,255,.03);

  /* Marque = ACTION PRINCIPALE, */
  --hol-brand: #3E4095;            /* blanc dessus 8,9:1 */
  --hol-brand-hover: #34377E;
  /* LE BOUTON PRINCIPAL. Chez nous il est la marque ; une maison peut le
     passer sur son accent (voir enseignes.bouton_principal). Ces trois jetons
     ne se posent qu'ici et sur la fiche : les boutons les lisent, rien d'autre. */
  --hol-bouton-fond: var(--hol-brand);
  --hol-bouton-encre: var(--hol-text-inverse);
  --hol-bouton-survol: var(--hol-brand-hover);
  --hol-brand-active: #2B2D68;
  --hol-brand-clair: #9698DE;      /* sur inverse 5,7:1 */
  --hol-brand-wash: #ECECF4;       /* pastilles/aplats très clairs */
  --hol-brand-border: rgba(62,64,149,.26);  /* le pendant de accent-border et succes-border */
  --hol-brand-doux: #4C5894;       /* étiquettes sur fond clair, 7,1:1 */

  /* ── LE CHAMP DE SAISIE ────────────────────────────────────────────────
     Un formulaire sans couleur n'a l'air de rien, et sur une carte claire un
     champ blanc bordé de gris pâle se cherche. Ces deux valeurs sont la seule
     source : l'entrée, l'administration et l'espace y puisent, de sorte qu'un
     formulaire ne dépende jamais de la page où il se trouve.
     Le fond est le bleu le plus clair qui reste un bleu : 14,1:1 pour le texte
     posé dessus, soit trois fois ce que la norme demande.

     LA BORDURE EST MESURÉE, PAS CHOISIE À L'ŒIL. Un champ de saisie doit se
     distinguer de ce qui l'entoure d'au moins 3:1 (WCAG 1.4.11) : c'est ce
     qui permet de voir OÙ ÉCRIRE sans deviner. La marque à 38 % n'en donnait
     que 2,3 contre une carte blanche, et le fond du champ, à 1,2 contre cette
     même carte, ne rattrapait rien. À 65 % la bordure donne 3,9 contre le
     blanc et 3,3 contre son propre fond : les deux passent, et le bleu se
     voit enfin. */
  --hol-champ-fond: #E9EAF4;
  --hol-champ-bord: rgba(62,64,149,.65);

  /* ── LA CARTE D'APPRENANT ────────────────────────────────────────────────
     CES TEINTES VIENNENT DU GABARIT FOURNI, et elles ne servent qu'à la carte.
     Elles sont déclarées ici parce que c'est la règle de la maison : aucun
     hexadécimal ne s'écrit dans une page. Elles ne rejoignent pas la palette
     générale pour autant : un violet de carte n'est pas une couleur d'action,
     et il n'a rien à faire sur un bouton.
     ────────────────────────────────────────────────────────────────────── */
  --hol-crt-brand:   #4844A0;      /* le pied de page du verso */
  --hol-crt-encre:   #0C0839;      /* le nom, les valeurs */
  --hol-crt-second:  #615DA6;      /* les étiquettes, le texte du dos */
  --hol-crt-filet:   #DCD6FA;      /* les filets fins */
  --hol-crt-papier-a:#FFFFFF;      /* le fond, en haut à gauche */
  --hol-crt-papier-b:#FBFBFF;      /* le fond, en bas à droite */
  --hol-crt-badge:   #EEEBFF;      /* la pastille */
  --hol-crt-badge-e: #655DC0;      /* son texte */
  --hol-crt-qr:      #A398E9;      /* le contour du code */
  /* Les biais, du plus lavé au plus plein. */
  --hol-crt-b1:      #EEEBFF;
  --hol-crt-b2:      #C8C1F6;
  --hol-crt-b3:      #5B52B8;
  --hol-crt-b4:      #DFDBFC;
  --hol-crt-b5:      #A49BE8;
  --hol-crt-b6:      #4941A5;      /* dégradé du coin bas droit, départ */
  --hol-crt-b7:      #6C63C7;      /* dégradé du coin bas droit, arrivée */
  --hol-crt-b8:      #F0EDFF;
  --hol-crt-b9:      #D8D3FA;
  --hol-crt-b10:     #B0A8EF;

  /* Accent rouge = IDENTITÉ SEULEMENT
     progression, état actif, blocs mission Haïti.
     INTERDIT en texte courant (4,48:1 sur surface-0).
     Autorisé : grand texte, gras, sur blanc, ou aplat.
     Jamais une action. Jamais un état système. */
  --hol-accent: #CD3438;
  --hol-accent-hover: #902427;
  --hol-accent-clair: #F0989B;     /* sur inverse 7,1:1 */
  --hol-accent-wash: rgba(205,52,56,.12);
  /* L'ENCRE QUI SE LIT SUR L'ACCENT. Chez nous l'accent est un rouge sombre et
     c'est du blanc ; chez un locataire ce peut être un or, et ce sera sa
     couleur de marque. Elle est calculée sur la clarté réelle, jamais supposée :
     du blanc sur #FFD231 ne se lit pas. */
  --hol-accent-encre: #FFFFFF;
  --hol-accent-border: rgba(240,152,155,.4);
  /* L'ENCRE DES SURTITRES D'ACCENT. Chez nous, c'est l'accent lui-même : le
     rouge se lit sur son propre voile. Chez un locataire, elle se recalcule sur
     SON voile et peut en différer : un or sur un voile d'or pâle ne se lit pas.
     Voir Enseigne::jetons(). */
  --hol-accent-texte: var(--hol-accent);

  /* États système (distincts de la marque, toujours + icône & libellé), */
  --hol-succes: #157F52;
  --hol-succes-wash: rgba(21,127,82,.10);
  --hol-succes-border: rgba(21,127,82,.30);
  --hol-alerte: #B45309;
  --hol-alerte-wash: #FBEEDD;
  /* LES TROIS POLICES SONT DES JETONS, comme les couleurs, et pour la même
     raison : une marque blanche change de police autant que de teinte. Elles
     étaient écrites en dur cent dix-neuf fois dans ce fichier ; un locataire
     n'aurait pas pu en changer sans qu'on réécrive la feuille.
     Les familles par défaut restent les nôtres : sans enseigne, rien ne bouge. */
  --hol-police-titre: 'Bricolage Grotesque';
  --hol-police-texte: Inter;
  --hol-police-mono:  'IBM Plex Mono';

  /* ═══ ET LA CLASSE POSE LA POLICE, PAS SEULEMENT SON NOM ═════════════════

     LE DÉFAUT, TROUVÉ LE 4 OCTOBRE 2026 en mesurant la page d'accueil : CENT
     DEUX éléments sur deux cent quarante-cinq s'affichaient en Times. Jimmy
     l'avait vu sans pouvoir le nommer : « une police qui n'est pas la nôtre ».

     POURQUOI. Ces variables sont déclarées sur « .hol-scope » et non sur
     « :root », pour cohabiter avec le site d'EUDUC. Or neuf pages, dont
     l'accueil, le catalogue et les cours, ouvraient sur un « <body> » SANS
     cette classe : leur règle « font-family: var(--hol-police-texte) » portait
     donc sur une variable inconnue. Une variable inconnue rend la déclaration
     invalide, et « font-family » retombe sur le défaut du navigateur, qui est
     un Times. Tout ce qui héritait du corps suivait, en-tête compris.

     LA CLASSE POSE DONC LA POLICE ELLE-MÊME. Partout où les jetons existent, le
     texte est dans la bonne fonte, quoi qu'ait écrit la page. C'est la ceinture ;
     la bretelle est la classe ajoutée aux neuf « <body> » qui l'avaient perdue. */
  font-family: var(--hol-police-texte), system-ui, -apple-system, sans-serif;

  --hol-erreur: #A61B23;
  /* Le voile de l'erreur. Il manquait, et les blocs d'erreur empruntaient
     celui de l'accent, c'est-à-dire le rouge de la marque : --hol-accent dit
     l'identité, jamais un état du système. */
  --hol-erreur-wash: rgba(166,27,35,.12);
  /* LES CINQ PALIERS DE LA CARTE DU MONDE, du plus pâle au bleu de marque.
     Écrits, et non calculés : color-mix() manque aux vieux Android que nous
     servons, et une teinte calculée en JavaScript ferait dépendre la couleur
     d'un script, pas seulement la forme. */
  --hol-monde-1: #DFE3F1;
  --hol-monde-2: #C2C8E6;
  --hol-monde-3: #9AA2D6;
  --hol-monde-4: #6E77C0;
  /* LES MÊMES ÉTATS, SUR FOND SOMBRE. Le vert et l'orange ci-dessus sont
     calculés pour être lus sur du blanc ; posés sur le voile d'une vidéo, ils
     passent tout juste. Ces deux-là sont leurs doubles pour fond sombre, et ils
     ne servent que là. */
  --hol-succes-clair: #7CE0A8;
  --hol-alerte-clair: #F7C66A;

  /* Le verre posé sur une image : la fenêtre d'une question dans la vidéo. */
  --hol-verre-fond: rgba(255,255,255,.12);
  --hol-verre-bord: rgba(255,255,255,.24);
  --hol-verre-fond-vif: rgba(255,255,255,.20);
  --hol-verre-bord-vif: rgba(255,255,255,.70);
  --hol-verre-creux: rgba(0,0,0,.20);
  /* Le noir du plein écran. Pas le bleu sombre de la marque : en plein écran,
     tout ce qui n'est pas l'image doit disparaître, et un fond coloré autour
     d'une vidéo tire l'œil hors de ce qu'on regarde. */
  --hol-noir: #000000;

  /* Interaction, */
  --hol-disabled-bg: #E3E7F1;
  --hol-disabled-text: #A9AEBE;
  --hol-focus: #4A4FC4;            /* anneau, surfaces claires */
  --hol-focus-inverse: #A9ACEC;    /* anneau, surface-inverse */
  --hol-scrim: rgba(20,22,42,.55); /* voile de modale */

  /* Verre (sections inverses uniquement), */
  --hol-glass: rgba(255,255,255,.07);
  --hol-glass-2: rgba(255,255,255,.05);
  --hol-glass-border: rgba(255,255,255,.16);
  --hol-glass-hi: rgba(255,255,255,.3);
  --hol-chip-dark: rgba(20,22,42,.62);
  --hol-wave: rgba(62,64,149,.45);

  /* Cartes verre (surfaces claires) : translucide + reflet + élévation + lueur discrète, */
  --hol-card-glass: rgba(255,255,255,.72);
  --hol-card-glass-border: rgba(62,64,149,.18);
  --hol-shadow-glass: inset 0 1px 0 rgba(255,255,255,.85), 0 20px 46px rgba(30,35,64,.13), 0 0 42px rgba(62,64,149,.18);
  --hol-shadow-glass-sm: inset 0 1px 0 rgba(255,255,255,.8), 0 10px 26px rgba(30,35,64,.1), 0 0 30px rgba(62,64,149,.14);
  --hol-shadow-glass-hover: inset 0 1px 0 rgba(255,255,255,.9), 0 30px 60px rgba(30,35,64,.2), 0 0 54px rgba(62,64,149,.26);

  /* Ombres (une seule teinte, 3 niveaux), */
  --hol-shadow-1: 0 1px 2px rgba(30,35,64,.08), 0 2px 6px rgba(30,35,64,.06);
  --hol-shadow-2: 0 8px 20px rgba(30,35,64,.1), 0 4px 10px rgba(30,35,64,.08);
  --hol-shadow-3: 0 24px 50px rgba(30,35,64,.16);

  /* Rayons (deux valeurs + pastille), */
  --hol-r-sm: 12px;
  --hol-r-lg: 20px;
  --hol-r-pill: 999px;
  --hol-r-ed: 3px;               /* rayon éditorial net (page Offrir) */
  --hol-s1:4px; --hol-s2:8px; --hol-s3:16px; --hol-s4:24px; --hol-s5:32px;
  --hol-s6:48px; --hol-s7:64px; --hol-s8:96px; --hol-s9:128px;
  --hol-ease: cubic-bezier(.16,1,.3,1); --hol-dur: 500ms; --hol-max: 1200px;
}

/* Focus structurel à double anneau : l'anneau intérieur reprend la surface,
   garantissant la séparation même contre un bouton de la même teinte.
   Décliner .hol-focus-ring-inverse sur les sections sombres. */
/* La règle de survol supposait que tout lien est foncé sur fond clair. Posé en
   clair sur un fond sombre, un lien redevenait bleu nuit au survol et
   disparaissait. Le survol passe donc par une variable : un conteneur qui
   recolore ses liens redéfinit les deux, et la règle générale ne le contredit
   plus. Sans redéfinition, le comportement est inchangé. */
/* ═══ UN LIEN QUI RESTE SUR LA PAGE Y GLISSE, IL N'Y SAUTE PAS ═════════════

   Demandé par Jimmy le 4 octobre 2026, depuis le pied de page : « quand je
   clique sur un bouton, si l'information est sur cette même page, il faut que
   ça roule doux. Quand ça va trop brut, je ne vois même pas ce qui s'est
   passé. » C'est exact, et ce n'est pas qu'une affaire de goût : un saut
   instantané de quatre écrans ne dit pas qu'on a bougé, il donne l'impression
   que la page a changé. Le glissement montre le chemin, donc il situe.

   SUR LA RACINE, PAS SUR « .hol-scope » : c'est l'élément qui défile, et il
   est au-dessus de nos portées. C'est la seule règle de ce fichier posée là.

   ET SEULEMENT POUR QUI NE DEMANDE PAS MOINS DE MOUVEMENT. Un défilement animé
   déclenche des nausées chez certaines personnes ; la préférence du système
   fait foi, et le saut instantané reste alors le bon comportement. Un
   navigateur qui ne connaît pas la propriété saute comme avant : rien ne se
   casse, le confort s'ajoute. */
@media (prefers-reduced-motion: no-preference){
  html{scroll-behavior:smooth}
}

/* ═══ LA PISTE « L'EXPÉRIENCE » ET SES FLÈCHES ═════════════════════════════

   LES FLÈCHES BORDENT LES CARTES, à mi-hauteur, et mordent légèrement sur la
   piste : posées à l'extérieur elles auraient mangé la gouttière, posées au
   milieu elles auraient caché une carte. Elles flottent au-dessus, sur un fond
   plein, avec l'ombre qui les décolle.

   SUR TÉLÉPHONE ELLES RESTENT, ET ELLES SE POSENT SUR LA PHOTO. On les avait
   retirées en pensant que le doigt suffisait. Jimmy, écran en main : « on ne
   voit pas qu'on peut défiler, et la barre grise en dessous fait moche ». La
   barre de défilement native est donc masquée, et ce sont les deux flèches qui
   disent, à sa place, qu'il y a autre chose à droite. Elles se calent à la
   hauteur du visuel, pas au milieu d'une carte de six cents pixels de haut, et
   restent à l'intérieur du cadre pour ne pas mordre la gouttière. */
.hol-scope .exp-cadre{position:relative}
.hol-scope .exp-fleche{position:absolute;top:50%;z-index:3;
                       width:46px;height:46px;margin-top:-23px;
                       display:flex;align-items:center;justify-content:center;
                       border-radius:var(--hol-r-pill);
                       border:1px solid var(--hol-border-strong);
                       background:var(--hol-surface-1);color:var(--hol-brand);
                       box-shadow:var(--hol-shadow-2);cursor:pointer;
                       transition:background-color .15s ease,border-color .15s ease,
                                  opacity .15s ease}
.hol-scope .exp-fleche--prec{left:-10px}
.hol-scope .exp-fleche--suiv{right:-10px}
.hol-scope .exp-fleche:hover{background:var(--hol-brand);color:var(--hol-text-inverse);
                             border-color:var(--hol-brand)}
.hol-scope .exp-fleche:focus-visible{outline:2px solid var(--hol-brand);outline-offset:2px}
/* ÉTEINTE PLUTÔT QU'ESCAMOTÉE : si elle s'en allait au bout de la piste, les
   cartes sauteraient de côté à chaque extrémité. */
.hol-scope .exp-fleche[disabled]{opacity:.32;cursor:default;
                                 background:var(--hol-surface-1);
                                 color:var(--hol-brand);
                                 border-color:var(--hol-border-subtle)}
/* MAIS UNE PISTE QUI NE DÉBORDE PAS N'A PAS DE FLÈCHES DU TOUT, et il faut le
   dire ici. Le gabarit pose « hidden » sur les deux boutons et le script ne
   l'enlève que si la bande déborde vraiment ; seulement, le « display:flex »
   de la règle au-dessus battait la règle du navigateur qui escamote un élément
   caché. Résultat sur grand écran : deux ronds blancs posés sur la première et
   la dernière carte, alors qu'il n'y avait rien à faire défiler. */
.hol-scope .exp-fleche[hidden]{display:none}
@media (max-width:760px){
  /* 112 px : le milieu du visuel, qui fait trois quarts de la largeur de carte.
     Les flèches rentrent dans le cadre, sinon elles sortiraient de l'écran. */
  .hol-scope .exp-fleche{top:112px;margin-top:-19px;width:38px;height:38px}
  .hol-scope .exp-fleche--prec{left:6px}
  .hol-scope .exp-fleche--suiv{right:6px}
}
/* ═══ LE NUMÉRO AU-DESSUS DU CADRE (.hol-numero) ══════════════════════════

   D'ABORD POSÉ DANS UNE PASTILLE PLEINE, ET REFUSÉ. Jimmy : « je n'aime pas
   la façon dont tu le mets dans un background. J'aimerais que ce soit plus
   stylé. Tu pourrais le faire un petit peu sur la bordure du cadre, en haut à
   gauche : ça donne plus une image de marque prestigieuse. »

   Il a d'abord été posé À CHEVAL sur le filet, avec un fond de la couleur du
   dessous pour couper le trait. Jimmy, loupe à l'appui : « enlève le petit
   rectangle en dessous du numéro, laisse le numéro seulement ». Il avait
   raison là aussi : ce fond ne pouvait pas se confondre avec une carte de
   verre translucide posée sur un fond à pois, et il se voyait comme une
   plaquette.

   LE CHIFFRE SE POSE DONC JUSTE AU-DESSUS DU FILET, à cinq pixels, aligné sur
   le retrait de la carte. Plus rien à couper, donc plus rien à remplir : il
   ne reste que les deux chiffres, comme la cote d'un plan en marge de son
   cadre. Il appartient toujours à la carte, qui le porte et le déplace avec
   elle.

   DEUX RÉGLAGES, parce que les cartes ne se ressemblent pas :
   - « --hol-numero-encre » : la couleur du chiffre, pour les cartes qui ont
     la leur.
   - « --hol-numero-x » : sa distance au bord gauche, alignée sur le retrait
     de la carte qui le porte.

   ET IL FAUT LUI FAIRE DE LA PLACE AU-DESSUS : dix-sept pixels, hors de la
   carte. Toute piste qui porte des cartes numérotées prend donc vingt pixels
   de retrait en haut, sans quoi son « overflow » coupe le chiffre.

   LA PASTILLE PLEINE (.hol-rang) RESTE, mais pour autre chose : les listes
   d'étapes de la méthode et les trois partis pris, où le numéro est une puce
   au début d'une ligne, pas la légende d'un cadre.

   Il est décoratif : l'ordre est déjà celui des cartes, d'où l'« aria-hidden »
   sur chacun. */
.hol-scope .hol-encadre{position:relative}
.hol-scope .hol-numero{position:absolute;z-index:2;
                       bottom:100%;left:var(--hol-numero-x,22px);
                       margin-bottom:5px;
                       font-family:var(--hol-police-mono),monospace;
                       font-size:12px;font-weight:600;letter-spacing:.2em;
                       line-height:1;
                       color:var(--hol-numero-encre,var(--hol-brand))}
/* ET UNE VARIANTE EN FLUX, pour une ligne qui n'a pas de cadre : les trois
   partis pris sont des paragraphes posés sur le fond, pas des cartes. Le
   chiffre y tient la colonne de gauche comme une puce, mais nu lui aussi : la
   page porterait sinon deux façons de numéroter à deux écrans d'écart. */
.hol-scope .hol-numero--puce{position:static;flex:none;margin:3px 0 0;
                             min-width:30px}

/* ═══ LE BANDEAU DES CARTES FORMAT RÉSERVE SA LIGNE (.fmt-tete__titre) ═════

   Les quatre titres ne font pas la même longueur. Tant que le numéro était
   une pastille posée dans le bandeau, il lui prenait cinquante pixels et
   « Parcours en cohorte » passait sur deux lignes quand les trois autres en
   gardaient une : son bandeau faisait vingt pixels de plus, sa photo démarrait
   vingt pixels plus bas, une marche au milieu de la bande. Le numéro est
   passé sur le filet, la place est revenue, et une ligne suffit de nouveau.

   LA HAUTEUR RESTE ÉCRITE, parce que la cause, elle, n'a pas disparu : en
   créole les mêmes titres seront plus longs, et le premier qui passera sur
   deux lignes décalerait encore toute la rangée. On réserve donc la hauteur
   du titre le plus long, mesurée, plutôt que de la découvrir en production. */
.hol-scope .fmt-tete__titre{line-height:1.2;min-height:1.2em}

/* LA PISTE DU JOURNAL A SON PROPRE REPÈRE (.jrn-cadre)
   Sa photo est un seize-neuvième de carte : cent quarante-six pixels de haut,
   deux fois moins qu'une carte format. Les flèches communes, calées à
   mi-hauteur de carte, tombaient cinq pixels SOUS l'image, sur le surtitre
   « À paraître ». Elles se posent donc au milieu du visuel, mesuré, et la
   translation les y centre quelle que soit leur taille. */
.hol-scope .jrn-cadre .exp-fleche{top:73px;margin-top:0;
                                  transform:translateY(-50%)}

/* LES CARTES SANS PHOTO PRENNENT LEURS FLÈCHES EN DESSOUS (.exp-cadre--dessous)
   Sur une carte format, la flèche se pose sur l'image : elle ne cache rien
   qu'on lise. Sur une carte faite de texte, au même endroit, elle mange le
   début de deux lignes. Elles passent donc sous la bande, à droite, comme la
   commande d'un diaporama. Le cadre le dit, le script ne change pas. */
.hol-scope .exp-cadre--dessous{position:relative}
.hol-scope .exp-barre{display:flex;gap:10px;justify-content:flex-end}
.hol-scope .exp-cadre--dessous .exp-fleche{position:static;top:auto;left:auto;
                                           right:auto;margin:14px 0 0;
                                           width:42px;height:42px}
@media (max-width:760px){
  .hol-scope .exp-cadre--dessous .exp-fleche{width:40px;height:40px}
}

/* PLUS DE BARRE GRISE SOUS LA PISTE : les flèches disent le défilement, et
   la piste garde le glissement du doigt et de la molette. */
.hol-scope .exp-piste{scrollbar-width:none;-ms-overflow-style:none}
.hol-scope .exp-piste::-webkit-scrollbar{width:0;height:0;display:none}
@media (prefers-reduced-motion:reduce){ .hol-scope .exp-fleche{transition:none} }

/* ═══ LES RAPPORTS D'IMAGE, SANS « aspect-ratio » ══════════════════════════

   « aspect-ratio » manque aux Android anciens que ce site doit servir : là où
   il est ignoré, le cadre s'effondre à zéro et l'image disparaît. Cinq blocs
   l'employaient encore. La vieille méthode du rembourrage proportionnel marche
   partout depuis toujours : une hauteur nulle, une marge basse en pourcentage
   de la LARGEUR, et le contenu posé en absolu par-dessus.

   56,25 % = 9/16 · 75 % = 3/4 · 125 % = 5/4. */
.hol-scope .hol-ratio{position:relative;overflow:hidden;height:0}
.hol-scope .hol-ratio > img,
.hol-scope .hol-ratio > picture,
.hol-scope .hol-ratio > video,
.hol-scope .hol-ratio > iframe,
.hol-scope .hol-ratio > .hol-slot{position:absolute;top:0;right:0;bottom:0;left:0;
                                  width:100%;height:100%}
.hol-scope .hol-ratio > img,
.hol-scope .hol-ratio > picture img,
.hol-scope .hol-ratio > video{object-fit:cover}

/* ===========================================================================
   LA VIDÉO DU FONDATEUR PREND LA HAUTEUR DE SON TEXTE
   Les deux colonnes étaient centrées l'une sur l'autre : le seize-neuvièmes
   faisait trois cent vingt pixels de haut face à une colonne de texte qui en
   faisait près de cinq cents, et la vidéo flottait au milieu de deux bandes
   vides. Jimmy : « la zone de vidéo est trop petite par rapport au texte ».
   La carte s'étire sur toute la hauteur de la ligne, et son cadre perd son
   rembourrage proportionnel pour la remplir ; l'image recouvre, elle ne se
   déforme pas. Sous 900 px les colonnes s'empilent, la vidéo reprend ses
   seize-neuvièmes sur toute la largeur, et cette règle ne s'applique plus.
   =========================================================================== */
@media (min-width:901px){
  .hol-scope .fond-media{align-self:stretch}
  .hol-scope .fond-media .hol-ratio{height:100%;padding-bottom:0;min-height:320px}
}
.hol-scope .hol-ratio--16x9{padding-bottom:56.25%}
.hol-scope .hol-ratio--4x3 {padding-bottom:75%}
.hol-scope .hol-ratio--4x5 {padding-bottom:125%}

/* LE MENU DE L'EN-TÊTE : deux écarts, deux rôles. Celui qui le détache de la
   marque est le plus large, c'est la zone de respiration du logo ; celui qui
   sépare les liens reste plus serré, pour qu'ils se lisent comme un groupe.
   Les deux se resserrent sous 1100 px, juste avant que la barre ne se replie. */
.hol-scope .ent-nav{display:flex;gap:28px;margin-left:30px;flex:1 1 auto;
                    flex-wrap:wrap;white-space:nowrap}
@media (max-width:1100px){
  .hol-scope .ent-nav{gap:20px;margin-left:14px}
}

/* ═══ LA CARTE « ACCOMPAGNEMENT PROFESSIONNEL » ═════════════════════════════

   TROIS PAGES LA PORTENT : l'accueil, les tarifs et la page professionnelle.
   Elle était dessinée dans chacune, donc elle divergeait, et sur l'accueil elle
   partageait la carte en deux moitiés égales : les mots s'entassaient à gauche
   pendant que la moitié droite restait presque vide avec deux éléments posés en
   haut. Jimmy : « un manque d'élégance, c'est trop serré vers la gauche et il
   reste trop de place à droite ».

   TROIS COLONNES, DONT UN COULOIR. Les mots prennent la place qu'ils demandent ;
   un filet d'un pixel de haut en bas sépare ; le bloc d'action occupe une
   colonne de largeur décidée, ni étirée ni rabougrie. Le filet n'est pas un
   ornement de bloc, c'est une séparation entre deux contenus, et il est neutre.

   SUR TÉLÉPHONE, LE COULOIR SE COUCHE : il devient le trait horizontal qui
   sépare les deux moitiés empilées, ce qui est le même geste dans l'autre sens.

   PAS DE « min() » ICI, ni nulle part : les Android anciens que ce site doit
   servir ne le connaissent pas, et la déclaration entière tomberait. */
.hol-scope .offre-pro{display:grid;grid-template-columns:1fr;gap:24px;align-items:center}
.hol-scope .offre-pro__mots{min-width:0}
.hol-scope .offre-pro__couloir{height:1px;background:var(--hol-border-subtle)}
.hol-scope .offre-pro__devis{min-width:0;display:flex;flex-direction:column;
                             gap:14px;align-items:flex-start}
.hol-scope .offre-pro__prix{font-family:var(--hol-police-mono),ui-monospace,monospace;
                            font-size:clamp(20px,2.4vw,26px);font-weight:600;
                            color:var(--hol-brand);white-space:nowrap}
.hol-scope .offre-pro__aide{margin:0;font-size:13.5px;line-height:1.55;
                            color:var(--hol-text-muted)}
/* LE BOUTON PREND TOUTE SA COLONNE : posé à sa largeur naturelle, il flottait
   au milieu d'un vide. Occupant son couloir, il devient le bas du bloc. */
.hol-scope .offre-pro__devis .hol-btn{width:100%;justify-content:center;text-align:center}

@media (min-width:880px){
  .hol-scope .offre-pro{grid-template-columns:minmax(0,1fr) 1px minmax(240px,300px);
                        gap:clamp(30px,4.5vw,56px)}
  .hol-scope .offre-pro__couloir{width:1px;height:auto;align-self:stretch}
}

/* LES CONTRÔLES DE FORMULAIRE N'HÉRITENT PAS DE LA POLICE, c'est le navigateur
   qui leur en impose une, et c'est pourquoi trois boutons sortaient en Arial au
   milieu d'une page en Inter. Seule la FAMILLE est forcée : la taille et la
   graisse restent celles que chaque bouton déclare. */
.hol-scope button, .hol-scope input, .hol-scope select,
.hol-scope textarea, .hol-scope optgroup { font-family: inherit; }

.hol-scope a { color: var(--hol-lien, var(--hol-brand)); text-decoration: none; }
.hol-scope a:hover { color: var(--hol-lien-survol, var(--hol-brand-active)); }

/* ═══ LES SURFACES SOMBRES RECOLORENT LEURS LIENS, TOUTES ═══════════════════

   LE DÉFAUT, MESURÉ LE 4 OCTOBRE 2026. Jimmy a vu « Se connecter » devenir
   illisible au survol dans le pied de page. J'ai audité le site au lieu de
   corriger ce bouton-là : sur la seule page d'accueil, DIX-NEUF liens tombaient
   sous 2,5:1 au survol, et certains à 1,1:1, c'est-à-dire invisibles.

   LA CAUSE EST DANS LA RÈGLE JUSTE AU-DESSUS. Au repos, un lien posé sur un
   fond sombre reçoit sa couleur claire par un style propre ; au survol, la
   règle générale la remplace par « --hol-brand-active », un bleu nuit. Sur du
   navy, du rouge ou du bleu de marque, ce bleu nuit disparaît.

   LA RÉPARATION SE FAIT PAR SURFACE, PAS PAR LIEN. Chaque conteneur qui peint
   un fond sombre déclare les deux jetons pour tout ce qu'il contient : l'en-tête
   tant qu'il n'est pas figé, le hero, le pied, les boutons d'action, et les
   sections sombres, qu'on attrape par leur style en ligne faute de classe.

   PUIS ON REND LA MAIN AUX ÎLOTS CLAIRS. Une carte blanche posée dans une
   section sombre reprend les jetons du site, sinon ses liens sortiraient blancs
   sur blanc. L'audit vérifie les deux sens. */
.hol-scope .auth-logo,
.hol-scope .esp-marque,
.hol-scope .adm-marque,
.hol-scope header[data-entete]:not([data-fige="1"]),
.hol-scope [data-hero],
.hol-scope footer,
.hol-scope [data-bouton],
.hol-scope [style*="--hol-surface-inverse"],
.hol-scope [style*="--hol-hero-navy"],
.hol-scope [style*="--hol-brand)"],
.hol-scope [style*="--hol-accent)"]{--hol-lien:var(--hol-text-inverse);
                                     --hol-lien-survol:var(--hol-text-inverse)}

.hol-scope [data-hero] .hol-card,
.hol-scope [style*="--hol-surface-inverse"] .hol-card,
.hol-scope [style*="--hol-surface-inverse"] [style*="--hol-surface-1)"],
.hol-scope [style*="--hol-surface-inverse"] [style*="--hol-surface-0)"],
.hol-scope footer [style*="--hol-surface-1)"]{--hol-lien:var(--hol-brand);
                                              --hol-lien-survol:var(--hol-brand-active)}
.hol-scope ::selection { background: var(--hol-brand); color: var(--hol-text-inverse); }

@keyframes holpulse { 0%,100% { transform: translate(-50%,-50%) scale(1); opacity: .9; } 50% { transform: translate(-50%,-50%) scale(1.5); opacity: .35; } }@keyframes holmarquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.hol-scope [data-reveal] { transition: opacity .7s ease, transform .7s cubic-bezier(.22,.61,.36,1); }
/* Lévitation au survol : cible toute carte-verre par son ombre token, sans markup dédié. */
.hol-scope [style*="hol-shadow-glass"] { transition: transform .28s cubic-bezier(.22,.61,.36,1), box-shadow .28s; }
.hol-scope [style*="hol-shadow-glass"]:hover { transform: translateY(-6px); box-shadow: var(--hol-shadow-glass-hover) !important; }
.hol-scope .hol-list-row:last-child { border-bottom: none !important; }
@media (prefers-reduced-motion: reduce) { .hol-scope * { animation: none !important; transition: none !important; } .hol-scope [style*="hol-shadow-glass"]:hover { transform: none; } }

/* ── Composant carte unique (.hol-card) : géométrie seule, tokens only ── */
.hol-scope .hol-card {
  background: var(--hol-card-glass);
  backdrop-filter: blur(20px) saturate(140%);
  -webkit-backdrop-filter: blur(20px) saturate(140%);
  border: 1px solid var(--hol-card-glass-border);
  border-radius: var(--hol-r-lg);
  box-shadow: var(--hol-shadow-glass);
  padding: 24px;
  transition: transform .28s cubic-bezier(.22,.61,.36,1), box-shadow .28s;
}
.hol-scope .hol-card:hover { transform: translateY(-6px); box-shadow: var(--hol-shadow-glass-hover); }
/* Variante fond sombre : même géométrie, surface adaptée. */
.hol-scope .hol-card--dark { background: var(--hol-glass); border-color: var(--hol-glass-border); box-shadow: var(--hol-shadow-3); }
.hol-scope .hol-card--dark:hover { box-shadow: var(--hol-shadow-3), 0 0 44px rgba(0,0,0,.3); }
/* Variante ligne compacte (lecteurs audio, listes). */
.hol-scope .hol-card--row { padding: 16px 18px; border-radius: var(--hol-r-sm); }
/* Variante posée (états « bientôt », placeholders) : pas de lévitation. */
.hol-scope .hol-card--flat { box-shadow: var(--hol-shadow-1); }
.hol-scope .hol-card--flat:hover { transform: none; box-shadow: var(--hol-shadow-1); }
/* Carte cliquable : focus clavier visible. */
.hol-scope a.hol-card, .hol-scope button.hol-card { cursor: pointer; display: block; text-align: inherit; }

/* ---------------------------------------------------------------------------
   CE QUI SE CLIQUE SE SOULÈVE. La convention existait pour les cartes, pas
   pour les boutons : au survol, rien ne bougeait. Deux niveaux, parce qu'un
   bouton n'est pas une carte.

   Le déplacement vaut pour TOUT élément cliquable, y compris les boutons
   discrets et transparents. L'ombre, elle, ne vaut que pour ceux qui ont une
   surface pleine, marqués « data-bouton » : une ombre portée autour d'un
   bouton transparent flotterait dans le vide.
--------------------------------------------------------------------------- */
.hol-scope button:not([disabled]),
.hol-scope [data-bouton] {
  transition: transform .18s cubic-bezier(.22,.61,.36,1),
              box-shadow .18s ease,
              background-color .18s ease,
              border-color .18s ease;
}
.hol-scope button:not([disabled]):hover,
.hol-scope [data-bouton]:hover { transform: translateY(-2px); }
.hol-scope [data-bouton]:hover { box-shadow: var(--hol-shadow-2); }

/* Appuyer repose le bouton : sans cela, il reste en l'air pendant le clic. */
.hol-scope button:not([disabled]):active,
.hol-scope [data-bouton]:active { transform: translateY(0); box-shadow: var(--hol-shadow-1); }

/* Une carte cliquable garde sa lévitation, plus ample : elle est plus grande. */
.hol-scope button.hol-card:hover { transform: translateY(-6px); }
.hol-scope button.hol-card--flat:hover { transform: none; }

@media (prefers-reduced-motion: reduce) {
  .hol-scope button:hover,
  .hol-scope [data-bouton]:hover,
  .hol-scope button:active,
  .hol-scope [data-bouton]:active { transform: none; }
}


.hol-scope .hol-card:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--hol-surface-0), 0 0 0 4px var(--hol-focus); }
.hol-scope .hol-card--dark:focus-visible { box-shadow: 0 0 0 2px var(--hol-surface-inverse), 0 0 0 4px var(--hol-focus-inverse); }
@media (max-width: 400px) { .hol-scope .hol-card { padding: 18px; } .hol-scope .hol-card--row { padding: 14px 15px; } }

/* Gouttière : paliers responsives (le contrôle 360 px en dépend). */
/* ---------------------------------------------------------------------------
   Emplacement d'image non encore fourni. Volontairement visible : un visuel
   manquant doit se remarquer, pas se déguiser. Voir templates/partials/image.php
   --------------------------------------------------------------------------- */
.hol-slot{
  width:100%;height:100%;min-height:120px;
  display:flex;align-items:center;justify-content:center;
  padding:16px;text-align:center;
  background:
    linear-gradient(var(--hol-brand-wash),var(--hol-brand-wash)),
    repeating-linear-gradient(45deg,transparent 0 10px,rgba(62,64,149,.05) 10px 20px);
  border:1px dashed var(--hol-border-strong);
  color:var(--hol-text-muted);
}
/* L'EMPLACEMENT EST UNE COLONNE : la marque au centre, et la consigne dessous
   quand un administrateur regarde. Pour un visiteur, il n'y a que la marque. */
.hol-slot{flex-direction:column;gap:14px}
.hol-slot__marque{display:flex;flex-direction:column;align-items:center;gap:11px;
                  width:100%;height:100%;justify-content:center;opacity:.38}
/* LE GLOBE SE MET À L'ÉCHELLE DE SON EMPLACEMENT. Posé à une taille fixe, il
   flottait comme une vignette perdue au milieu d'un grand rectangle vide, et
   c'est exactement l'effet que Jimmy a trouvé laid sur les blocs hauts de la
   page d'accueil. Il prend donc un cinquième de la hauteur disponible, borné
   des deux côtés : jamais minuscule dans un grand cadre, jamais écrasant dans
   un petit. La largeur suit, et l'image ne se déforme pas. */
.hol-slot__logo{height:20%;min-height:46px;max-height:118px;
                width:auto;max-width:56%;object-fit:contain;display:block}
.hol-slot__nom{font-family:var(--hol-police-mono),ui-monospace,monospace;
               font-size:10px;font-weight:600;letter-spacing:.22em;
               text-transform:uppercase;color:var(--hol-text-muted)}
.hol-slot-p{
  font-family:var(--hol-police-mono),ui-monospace,monospace;
  font-size:11.5px;
  line-height:1.45;letter-spacing:.02em;max-width:34ch;
}

/* Lien d'évitement : invisible jusqu'à la tabulation, obligatoire au clavier. */
.hol-evitement{
  /* Posé sur le bleu de marque : il garde sa couleur au survol, sinon il vire
     au bleu foncé sur bleu et devient illisible. */
  --hol-lien:var(--hol-text-inverse);--hol-lien-survol:var(--hol-text-inverse);
  position:absolute;left:-9999px;top:0;z-index:100;
  padding:12px 18px;background:var(--hol-brand);color:var(--hol-text-inverse);
  font-weight:600;text-decoration:none;border-radius:0 0 var(--hol-r-sm) 0;
}
.hol-evitement:focus{left:0}
/* Lu par les lecteurs d'écran, absent de l'écran. */
.hol-visuellement-cache{
  position:absolute!important;width:1px;height:1px;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;
}

/* ===========================================================================
   ACCUEIL : styles portés de Landing.dc.html (en-tête, hero, compteur).
   Vivent ici parce que l'en-tête est un partial servi sur toutes les pages.
   =========================================================================== */

/* Fond des sections claires : trame de points + deux halos diffus. Décoratif.

   DEUX PORTES D'ENTRÉE, ET C'EST VOULU. Les pages portées de la maquette
   déclarent leur fond dans leur style en ligne : le sélecteur d'attribut les
   attrape sans rien changer au portage. Les pages écrites depuis, dont le fond
   est posé une fois sur leur conteneur, n'ont aucune section à attraper : elles
   demandent le grain par la classe « hol-grain ». Même dessin, un seul endroit
   où il est défini. */
/* « .hol-scope .hol-grain » exige un ANCÊTRE portant .hol-scope. Or la moitié
   des pages posent les deux classes sur le MÊME élément, et la règle ne
   s'appliquait pas : catalogue, transparence, attestations, fiche de cours et
   offrir sont restées au fond plat sans que cela se voie dans le balisage.
   Les deux écritures sont désormais visées. */
.hol-scope section[style*="--hol-surface-0"],
.hol-scope .hol-grain,
.hol-scope.hol-grain{position:relative;isolation:isolate}
.hol-scope section[style*="--hol-surface-0"]::before,
.hol-scope .hol-grain::before,
.hol-scope.hol-grain::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:-1;
  background-image:
    radial-gradient(var(--hol-motif-dot) 1.1px, transparent 1.7px),
    radial-gradient(circle at 8% 12%, var(--hol-motif-halo-1), transparent 52%),
    radial-gradient(circle at 92% 88%, var(--hol-motif-halo-2), transparent 46%);
  background-size:24px 24px, auto, auto;
}
/* LE GRAIN EN RETRAIT, pour les écrans où l'on travaille longtemps.
   Une page de leçon se regarde une heure d'affilée : le motif y est une
   signature, pas une décoration, et à pleine force il vient chercher l'œil
   pendant qu'on lit une transcription. À quarante pour cent il se devine
   encore, et c'est tout ce qu'on lui demande. */
.hol-scope .hol-grain--discret::before,
.hol-scope.hol-grain--discret::before{opacity:.5}
/* LE GRAIN SUR FOND SOMBRE. Le dessin ne change pas d'une ligne : seules les
   trois couleurs sont reprises, en lumière au lieu d'encre. Une page de compte
   est bleu nuit, et le point bleu y était invisible. */
.hol-scope .hol-grain--sombre,
.hol-scope.hol-grain--sombre{
  --hol-motif-dot: var(--hol-motif-dot-clair);
  --hol-motif-halo-1: var(--hol-motif-halo-clair-1);
  --hol-motif-halo-2: var(--hol-motif-halo-clair-2);
}


/* Carrousel du hero : trois médias empilés, fondu croisé d'une seconde. */
.hero-fond{position:absolute;inset:0;overflow:hidden;z-index:0}
.hero-media{position:absolute;inset:0;opacity:0;transition:opacity 1s ease-in-out}
.hero-media[data-actif="1"]{opacity:1}
.hero-media img,.hero-media video,.hero-media .hol-slot{width:100%;height:100%;object-fit:cover;display:block}
/* Point d'ancrage de la PREMIÈRE diapositive du hero, et d'elle seule.

   Sur un écran étroit, « cover » ne garde que la bande centrale de la photo.
   Sur la photo d'accueil livrée, l'apprenante est à 79% de la largeur et son
   visage à 32% de la hauteur : sans ancrage elle sort entièrement du champ,
   et il ne reste que le bureau et le carnet. Or c'est elle qui amène les gens
   sur le site.

   81% place son visage aux trois quarts de la largeur, c'est-à-dire à droite
   du texte, qui est calé à gauche : elle reste visible sans rien masquer. La
   composition de l'accueil est ainsi la même sur téléphone que sur grand
   écran, texte à gauche et apprenante à droite.

   Sur grand écran la photo déborde en HAUTEUR et non en largeur : les 81%
   n'y ont aucun effet, seuls les 32% jouent, et ils gardent sa tête entière
   dans le cadre. Le hero de référence n'est donc pas modifié là où il était
   déjà juste.

   CE RÉGLAGE EST LIÉ À CETTE PHOTO. Si « Hero, première photo » est changée
   depuis /admin, ce point d'ancrage est à revoir avec la nouvelle image.

   Les diapositives 2 et 3 restent centrées : ce sont des tenants-lieu, et
   ancrer une image dont on ne connaît pas le sujet ferait plus de mal que
   de bien. */
#hero-bg{object-position:81% 32%}
/* Photo remplacée depuis /admin : on ne sait plus où est le sujet, donc on
   revient au centre. Un cadrage neutre vaut mieux qu'un cadrage faux. */
[data-hero-photo="personnalisee"] #hero-bg{object-position:50% 50%}
@media (prefers-reduced-motion:reduce){.hero-media{transition:none}}

/* En-tête : bleu nuit au-dessus du hero, clair dès le défilement.
   L'attribut data-fige est posé par holangcours-site.js. */
header[data-entete]{backdrop-filter:blur(12px);transition:background-color .3s ease,border-color .3s ease,box-shadow .3s ease;background-color:var(--hol-header-bg) !important;border-bottom:1px solid var(--hol-border-subtle) !important}
header[data-entete] .ent-logo{transition:opacity .3s ease}
header[data-entete] .ent-logo--sombre{opacity:0 !important}
header[data-entete][data-fige="1"]{box-shadow:var(--hol-shadow-1) !important}
header[data-entete]:not([data-fige="1"]){background-color:var(--hol-surface-inverse) !important;border-bottom-color:var(--hol-border-on-dark) !important;box-shadow:none !important}
header[data-entete]:not([data-fige="1"]) nav a{color:var(--hol-text-inverse-1) !important}
header[data-entete]:not([data-fige="1"]) nav a:first-child{color:var(--hol-text-inverse) !important}
header[data-entete]:not([data-fige="1"]) .ent-logo--clair{opacity:0 !important}
header[data-entete]:not([data-fige="1"]) .ent-logo--sombre{opacity:1 !important}
/* L'EN-TÊTE A DEUX ÉTATS, ET LA PASTILLE DES RÉGLAGES DOIT SUIVRE LES DEUX.
   En haut de page elle flotte sur le bleu nuit : fond de verre, texte clair.
   Défilée, l'en-tête devient claire : fond clair, texte sombre. Depuis que
   langue et devise ne font qu'un groupe, c'est « ent-choix » qui porte le
   fond ; l'habiller seulement en clair donnait du texte clair sur fond clair,
   et « EN » devenait illisible en haut de page. */
header[data-entete]:not([data-fige="1"]) .ent-choix{background:var(--hol-glass) !important;
  border:1px solid var(--hol-border-on-dark)}
header[data-entete]:not([data-fige="1"]) .ent-choix__groupe--suite{border-left-color:var(--hol-border-on-dark)}
/* Sur fond bleu nuit : devises, langues et « Se connecter » passent en teintes claires. */
header[data-entete]:not([data-fige="1"]) [data-devises] button,
header[data-entete]:not([data-fige="1"]) [data-langues] a{color:var(--hol-text-inverse-2) !important}
header[data-entete]:not([data-fige="1"]) [data-devises] button[data-actif="1"],
header[data-entete]:not([data-fige="1"]) [data-langues] a[aria-current]{color:var(--hol-text-inverse) !important}
/* Les liens de compte se reconnaissent à leur ATTRIBUT, pas à leur adresse.
   Viser « href*=connexion » attrapait /deconnexion par hasard et manquait
   /mon-espace comme /mes-cours, qui restaient bleus sur le hero sombre. */
header[data-entete]:not([data-fige="1"]) a[data-compte],
header[data-entete]:not([data-fige="1"]) button[data-compte]{color:var(--hol-text-inverse) !important}
/* Le rond du compte bascule comme eux : sur le hero sombre son prénom passe
   en blanc, et son survol prend le verre plutôt que le lavis bleu, qui ne se
   voyait pas sur le bleu nuit. */
header[data-entete]:not([data-fige="1"]) .hol-identite{color:var(--hol-text-inverse) !important}
header[data-entete]:not([data-fige="1"]) .hol-identite:hover{background:var(--hol-glass)}
/* La déconnexion est un bouton d'envoi : elle doit se lire comme les liens
   voisins, et non comme un bouton de formulaire. */
.ent-deco{display:inline-flex;align-items:center;margin:0}
.ent-deco__bouton{padding:0;border:0;background:none;cursor:pointer;
                  font:inherit;font-size:15px;font-weight:600;
                  color:var(--hol-text-muted)}
.ent-deco__bouton:hover{color:var(--hol-brand)}
.ent-deco__bouton:focus-visible{outline:none;border-radius:var(--hol-r-sm);
                                box-shadow:0 0 0 2px var(--hol-surface-1),0 0 0 4px var(--hol-focus)}
/* Le panier suit le même basculement : sur le hero il est blanc, une fois
   l'en-tête figé il redevient bleu. Sa pastille garde le rouge d'identité. */
header[data-entete]:not([data-fige="1"]) a[data-panier]{color:var(--hol-text-inverse) !important}

/* ---------------------------------------------------------------------------
   UN LIBELLÉ QUI NE BOUGE PAS D'UNE LANGUE À L'AUTRE
   « Se connecter » et « Log in » n'ont pas la même longueur, ni « Tarifs &
   accès » et « Pricing & access ». Tout ce qui suit glissait au changement de
   langue, jusqu'à 55 px pour le sélecteur de langue lui-même, qui se trouvait
   alors ailleurs qu'à l'endroit où on venait de cliquer.

   Les deux versions sont empilées dans la même case de grille : la largeur est
   celle de la plus longue, la hauteur celle de la visible. Aucune valeur n'est
   devinée, et le jour où un libellé est réécrit, la réserve suit.
   --------------------------------------------------------------------------- */
.ent-stable{display:inline-grid;align-items:center;justify-items:start}
.ent-stable > *{grid-area:1/1}
.ent-fantome{visibility:hidden;height:0;overflow:hidden;white-space:nowrap;pointer-events:none}
/* Dans le panneau déroulant, les liens font toute la largeur : il n'y a plus
   rien à réserver, et une réserve y créerait un blanc au milieu d'une ligne. */
/* Les libellés doublés ne servent que la barre dépliée : repliée, la place ne
   manque plus. Même seuil que le pli, forcément. */
@media (max-width:1259px){
  .ent-stable{display:inline}
  .ent-fantome{display:none}
}

/* ---------------------------------------------------------------------------
   LE PANIER : UNE ICÔNE, SON COMPTEUR DESSUS
   Le mot occupait la place de deux liens dans une barre qui en manque. L'icône
   est dessinée pour ce site : son anse reprend le méridien du globe du logo.
   Le mot revient dans le panneau déroulant, sous 1100 px, où les liens sont des
   lignes pleine largeur et où une icône seule ne dirait rien.
   --------------------------------------------------------------------------- */
.ent-panier{position:relative;display:inline-flex;align-items:center;gap:9px;
            justify-content:center;min-width:42px;min-height:42px;
            color:var(--hol-brand);font-size:15px;font-weight:600;
            border-radius:var(--hol-r-sm);transition:background .18s ease}
.ent-panier:hover{background:var(--hol-brand-wash)}
header[data-entete]:not([data-fige="1"]) .ent-panier:hover{background:var(--hol-surface-sur-sombre)}
.ent-panier-dessin{width:23px;height:23px;flex:none}
.ent-panier-mot{display:none}
/* La pastille chevauche l'icône, comme partout : elle dit « il y a quelque
   chose dedans » sans ajouter une colonne à la barre. Son nombre est répété
   dans le libellé du lien, pour qui ne voit pas la couleur. */
.ent-panier-n{position:absolute;top:1px;right:1px;
              min-width:18px;height:18px;padding:0 5px;
              display:inline-flex;align-items:center;justify-content:center;
              background:var(--hol-accent);color:var(--hol-accent-encre,var(--hol-text-inverse));
              font-family:var(--hol-police-mono),monospace;font-size:11px;font-weight:600;
              line-height:1;border-radius:var(--hol-r-pill);
              border:2px solid var(--hol-header-bg)}
header[data-entete]:not([data-fige="1"]) .ent-panier-n{border-color:var(--hol-hero-navy)}

/* Compteur du hero : relief de verre, entrée en basculement 3D, pouls discret. */
/* LA COLONNE DE DROITE porte le placement des deux pastilles, qui le portaient
   chacune pour soi : elles partageaient le bord droit sans partager la
   largeur, et le journal pendait sous un angle du compteur. La colonne est
   centrée verticalement, ses enfants prennent toute sa largeur. */
.hero-droite{position:absolute;z-index:2;right:var(--hol-gutter);top:50%;
             transform:translateY(-50%);
             width:230px;display:flex;flex-direction:column;gap:12px}

.hero-compteur{/* Pastille de verre sur le hero sombre : même raison. */
  --hol-lien:var(--hol-text-inverse);--hol-lien-survol:var(--hol-text-inverse);
  opacity:0;transform-style:preserve-3d;animation:hc-entree 1.1s cubic-bezier(.22,.9,.24,1) .5s forwards;transition:transform .45s cubic-bezier(.22,.9,.24,1),box-shadow .45s ease;display:block}
@keyframes hc-entree{
  from{opacity:0;transform:translateX(22px) perspective(900px) rotateY(-14deg) rotateX(5deg) scale(.94)}
  to{opacity:1;transform:translateX(0) perspective(900px) rotateY(-7deg) rotateX(2deg) scale(1)}
}
.hero-compteur:hover,.hero-compteur:focus-visible{transform:perspective(900px) rotateY(-2deg) rotateX(0deg) scale(1.03)}
.hero-compteur:focus-visible{outline:none;box-shadow:0 0 0 2px var(--hol-hero-navy),0 0 0 5px var(--hol-focus-inverse),0 22px 48px -12px rgba(9,10,32,.62)}
/* Reflet de vitre : bande claire en diagonale sur la moitié haute. */
.hero-compteur::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:linear-gradient(150deg,rgba(255,255,255,.30) 0%,rgba(255,255,255,.06) 34%,transparent 58%)}
.hero-compteur > *{position:relative}
.hero-pouls{animation:hc-pouls 2.6s ease-in-out infinite}
@keyframes hc-pouls{0%,100%{opacity:1;box-shadow:0 0 0 0 var(--hol-accent-border)}50%{opacity:.55;box-shadow:0 0 0 6px transparent}}
@media (max-width:1100px){.hero-droite{display:none}}
@media (prefers-reduced-motion:reduce){
  .hero-compteur{opacity:1;animation:none;transform:none}
  .hero-pouls{animation:none}
  .hol-marquee{animation:none !important}
}

/* ===========================================================================
   CONTENEUR UNIQUE DU SITE
   max-width 1480px centré, marge horizontale clamp(24px, 8vw, 100px).
   Donne 1280px de contenu utile entre deux marges de 100px sur grand écran,
   et le MÊME bord gauche/droit partout : sections claires, sections sombres,
   pied de page, pages internes.

   Une section pleine largeur (hero, bandeau) garde son fond en pleine largeur
   et pose ce conteneur à l'intérieur, le contenu reste aligné sur le trait.
   =========================================================================== */
.hol-scope .eu-container{
  max-width:1480px;
  margin-left:auto;
  margin-right:auto;
  padding-left:var(--hol-gutter);
  padding-right:var(--hol-gutter);
  width:100%;
}

/* Couleurs officielles des réseaux, au survol seulement. Elles n'entrent pas
   dans la palette du site : aucun autre élément d'interface ne les utilise. */
.hol-scope [data-reseau]{transition:background-color .2s ease,border-color .2s ease,color .2s ease}
.hol-scope [data-reseau="youtube"]:hover  {background:#FF0000;border-color:#FF0000;color:#FFF}
.hol-scope [data-reseau="facebook"]:hover {background:#1877F2;border-color:#1877F2;color:#FFF}
.hol-scope [data-reseau="instagram"]:hover{background:linear-gradient(45deg,#F58529 0%,#DD2A7B 45%,#8134AF 75%,#515BD4 100%);border-color:#DD2A7B;color:#FFF}
.hol-scope [data-reseau="tiktok"]:hover   {background:#000;border-color:#000;color:#FFF}
.hol-scope [data-reseau="linkedin"]:hover {background:#0A66C2;border-color:#0A66C2;color:#FFF}
/* ---------------------------------------------------------------------------
   EN-TÊTE, comportement sur petits écrans.
   À 390px, l'en-tête montait à 234px de haut : logo pleine largeur, puis
   navigation, devises, langues et boutons sur quatre lignes. Sur un en-tête
   collant, cela mangeait un quart de l'écran en permanence.

   Le PNG du logo porte 127px de vide transparent à gauche : la compensation
   vaut TOUJOURS 20% de la hauteur rendue (9,8/48,8 = 12,8/64 = 0,2). En
   l'exprimant en calc, le logo se réduit sans que le cadrage se décale.
   --------------------------------------------------------------------------- */
.hol-scope{ --ent-logo-h: 48.8px; }
@media (max-width:900px){ .hol-scope{ --ent-logo-h: 40px; } }
@media (max-width:600px){ .hol-scope{ --ent-logo-h: 32px; } }

header[data-entete] .ent-logo--sombre{
  height:var(--ent-logo-h);
  width:auto;
  margin-left:calc(var(--ent-logo-h) * -0.2);
}
/* La version couleur est cadrée serrée : pas de compensation, et une hauteur
   proportionnellement plus faible, conforme au rapport 34/48,8 du brief. */
header[data-entete] .ent-logo--clair{
  height:calc(var(--ent-logo-h) * 0.697);
  width:auto;
}

@media (max-width:900px){
  /* La navigation défile latéralement au lieu de passer à la ligne : tous les
     liens restent atteignables, et l'en-tête garde une seule hauteur. */
  header[data-entete] nav{
    flex-wrap:nowrap !important;
    overflow-x:auto;
    scrollbar-width:none;
    -webkit-overflow-scrolling:touch;
    gap:16px !important;
    margin-left:0 !important;
  }
  header[data-entete] nav::-webkit-scrollbar{display:none}
  header[data-entete] [data-devises] button,
  header[data-entete] [data-langues] a{min-width:34px;padding:0 7px}
}

@media (max-width:600px){
  header[data-entete] > div{gap:8px 12px !important}
  header[data-entete] nav{order:3;flex:1 0 100% !important;font-size:14px}
  header[data-entete] nav a{font-size:14px !important}
  /* Le CTA reste au bout de la première ligne, à portée de pouce. */
  header[data-entete] > div > a:last-of-type{padding:9px 14px !important;font-size:14px !important}
}

/* ══════════════════════════════════════════════════════════════════════════
   MENU REPLIÉ : téléphone et tablette uniquement

   Sous 1100 px, l'en-tête se déployait sur trois lignes : logo et sélecteurs,
   puis compte, panier et appel à l'action, puis la navigation. Beaucoup de
   choses pour une barre qui doit surtout dire où l'on est et laisser voir la
   page. Il ne reste donc que le logo et un bouton.

   AU-DESSUS DE 1100 PX, RIEN NE CHANGE : le conteneur est en display:contents,
   ses enfants restent des enfants directs de la barre, et la mise en page du
   prototype n'est pas touchée d'un pixel.

   Ces règles viennent APRÈS les blocs 900 px et 600 px : à spécificité égale,
   c'est l'ordre qui tranche, et ce sont elles qui doivent gagner.
   ══════════════════════════════════════════════════════════════════════════ */

.ent-menu,.ent-choix{display:contents}
.ent-bascule{display:none}

/* LE PLI DE L'EN-TÊTE PASSE DE 1100 À 1259 PIXELS, et c'est une mesure, pas un
   goût. Barre complète d'un administrateur connecté, tout compacté : 1 055 px
   de contenu. La place vaut 84 % de l'écran sous 1 250 px, puis la largeur
   moins 200. Il faut donc 1 256 px d'écran pour que la rangée tienne ; en
   dessous, elle se cassait en deux et le bouton rouge tombait sous la marque.
   Jimmy, sur un treize pouces : « ça déborde en dessous du logo, ce n'est pas
   professionnel ». Mieux vaut un en-tête replié, qui est un objet net, qu'une
   barre à deux rangs qui ressemble à un accident. */
@media (max-width:1259px){

  /* La barre : logo à gauche, bouton à droite, et rien entre les deux. */
  header[data-entete] > div{flex-wrap:nowrap !important;gap:12px !important;
                            justify-content:space-between}

  .ent-bascule{display:inline-flex;align-items:center;gap:10px;flex:none;
               min-height:44px;padding:0 14px;cursor:pointer;
               background:transparent;border:1px solid var(--hol-border-strong);
               border-radius:var(--hol-r-sm);color:var(--hol-brand);
               font:inherit;font-size:14px;font-weight:600}
  .ent-bascule-mot{white-space:nowrap}

  /* Sur le hero, l'en-tête est bleu nuit : le bouton doit basculer comme le
     reste, sinon il reste bleu sur bleu et ne se lit plus. Même mécanique
     que le lien de connexion, plus haut. */
  header[data-entete]:not([data-fige="1"]) .ent-bascule{color:var(--hol-text-inverse) !important;
                                                        border-color:var(--hol-border-on-dark)}

  /* Les trois traits deviennent une croix à l'ouverture. Ils héritent de la
     couleur du bouton, donc ils suivent le basculement clair/sombre. */
  .ent-traits{display:grid;gap:4px;width:18px}
  .ent-traits span{display:block;height:2px;border-radius:2px;
                   background:currentColor;transition:transform .18s ease,opacity .18s ease}
  [aria-expanded="true"] .ent-traits span:nth-child(1){transform:translateY(6px) rotate(45deg)}
  [aria-expanded="true"] .ent-traits span:nth-child(2){opacity:0}
  [aria-expanded="true"] .ent-traits span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}
  @media (prefers-reduced-motion:reduce){.ent-traits span{transition:none}}

  /* Le panneau. Il prend la couleur de la barre : sur le hero il est bleu
     nuit, une fois l'en-tête figé il devient clair. Les règles de bascule
     déjà écrites plus haut habillent alors son contenu sans rien de plus. */
  .ent-menu{position:absolute;left:0;right:0;top:100%;display:none;
            flex-direction:column;align-items:stretch;gap:0;
            padding:6px var(--hol-gutter) 20px;
            /* Surface PLEINE, et non --hol-header-bg : ce token vaut du blanc
               à 94%, prévu pour flotter au-dessus du contenu avec un flou.
               Derrière un menu, on lisait la page à travers les liens. */
            background:var(--hol-surface-1);
            border-top:1px solid var(--hol-border-subtle);
            box-shadow:var(--hol-shadow-2);
            max-height:calc(100svh - 100%);overflow-y:auto;overscroll-behavior:contain}
  header[data-entete]:not([data-fige="1"]) .ent-menu{background:var(--hol-surface-inverse);
                                                     border-top-color:var(--hol-border-on-dark)}
  header[data-entete][data-menu-ouvert="1"] .ent-menu{display:flex}

  /* La navigation redevient une liste : plus de défilement latéral, chaque
     lien occupe la largeur et fait 48 px de haut, la taille d'un pouce. */
  header[data-entete] nav{order:0 !important;flex:none !important;
                          flex-direction:column;flex-wrap:nowrap !important;
                          overflow-x:visible !important;gap:0 !important;
                          margin-left:0 !important;white-space:normal}
  header[data-entete] nav a{display:flex;align-items:center;min-height:48px;
                            font-size:16px !important;
                            border-bottom:1px solid var(--hol-border-subtle)}
  header[data-entete]:not([data-fige="1"]) nav a{border-bottom-color:var(--hol-border-on-dark)}

  /* Langue et devise côte à côte, sur leur propre ligne. */
  .ent-choix{display:flex;gap:10px;align-items:center;margin-top:18px}

  /* Compte et panier, taille de cible respectée. Le panier redevient une ligne
     nommée : dans une liste pleine largeur, une icône seule flotterait sans
     rien dire, et la pastille reprend sa place à la suite du mot. */
  .ent-menu > a[data-compte],
  .ent-menu > .ent-deco,
  .ent-menu > a[data-panier]{min-height:48px;display:flex;align-items:center;
                             font-size:16px;margin-top:6px}
  .ent-menu > .ent-deco .ent-deco__bouton{font-size:16px}
  /* Dans le panneau, le rond du compte est une ligne comme les autres : même
     hauteur de cible, même taille de texte, pleine largeur. */
  .ent-menu > .hol-identite{min-height:48px;margin-top:6px;border-radius:var(--hol-r-sm)}
  .ent-menu > .hol-identite .hol-identite__nom{font-size:16px;max-width:none}
  /* UN ANGLE DROIT SUR UNE LIGNE SURLIGNÉE FAIT BRUT. Jimmy : « l'encadré qui
     montre que c'est sélectionné devrait avoir des bordures arrondies, ce
     serait plus professionnel ». La ligne garde sa pleine largeur, mais son
     fond de survol a maintenant les mêmes coins que les cartes du site, et un
     peu d'air de chaque côté pour qu'on les voie. */
  .ent-menu > .ent-panier{justify-content:flex-start;padding:0 12px;
                          margin-left:-12px;border-radius:var(--hol-r-sm)}
  .ent-panier-mot{display:inline}
  .ent-menu > .ent-panier .ent-panier-n{position:static;margin-left:10px;border:none}

  /* L'appel à l'action ferme le panneau, pleine largeur. */
  .ent-menu > a:last-child{display:flex;align-items:center;justify-content:center;
                           min-height:52px;margin-top:18px;font-size:16px !important;
                           padding:0 20px !important}
}

/* ===========================================================================
   COMPOSANT « bloc image de fond » (.hol-bloc-image)
   Une carte sombre dont l'image occupe le fond à droite et dont SEUL LE BORD
   GAUCHE se dissout dans la couleur de la carte. Le texte passe par-dessus la
   zone noyée, il n'est pas enfermé dans une colonne à côté.

   Il vivait dans le style d'une seule page. Deux pages l'emploient désormais ;
   recopié, il aurait divergé au premier ajustement.

   Le fondu est un dégradé de la couleur du fond, pas un masque CSS : un masque
   laisse un bord net là où il n'est pas pris en charge, un dégradé se comporte
   partout pareil.
   =========================================================================== */
  /* ----- Structure ----------------------------------------------------------
     L'image occupe le fond, à droite, et se dissout vers la gauche dans le
     bleu de la carte. Le texte passe PAR-DESSUS cette dissolution : il n'est
     plus enfermé dans une colonne, il a la place de respirer.

     Le fondu est fait de deux dégradés superposés, pas d'un masque CSS : un
     masque laisserait un bord net là où il n'est pas pris en charge, alors
     qu'un dégradé de la couleur du fond se comporte partout pareil. */
  /* LE TEXTE ET L'ACTION SUR UNE MÊME LIGNE, CENTRÉS. Le bouton était posé
     SOUS la colonne de texte : la carte gagnait sa hauteur, et l'espace ne se
     répartissait plus également en haut et en bas. Côte à côte et centrés, la
     hauteur de la carte est celle du texte, et les marges sont les mêmes des
     quatre côtés.

     La marge est écrite avec « .hol-scope » en tête : sans cela, la règle de
     « .hol-card », plus spécifique, l'emportait et la carte restait à 24 px au
     lieu des 34 à 60 px voulus ici. Le texte collait aux bords depuis le début. */
  .hol-scope .hol-bloc-image{position:relative;overflow:hidden;isolation:isolate;
             padding:clamp(34px,5vw,60px);
             display:flex;align-items:center;justify-content:space-between;
             flex-wrap:wrap;gap:clamp(22px,3vw,44px)}
  /* LA PHOTO COUVRE TOUTE LA CARTE, et c'est ce qui manquait. Elle n'occupait
     que les 62 % de droite : à trente-huit pour cent, le bord gauche de l'image
     tombait net sur le marine de la carte, et le voile, qui ne vaut là que
     soixante-douze pour cent, laissait voir cette arête comme un trait clair du
     haut en bas. Jimmy : « il y a une ligne blanche qui passe sur cette carte ».

     Un dégradé ne peut pas dissoudre un bord qui n'existe pas dans l'image : il
     faut que l'image soit là. Elle part donc du bord gauche, le cadrage se cale
     à droite pour que le sujet reste où il était, et c'est le voile seul qui
     décide de ce qu'on voit. Plus d'arête possible, à aucune largeur. */
  /* Les quatre côtés en toutes lettres : « inset » n'existe pas sur les
     Android anciens que ce site doit servir. */
  .hol-bloc-image__vue{position:absolute;margin:0;
                       top:0;right:0;bottom:0;left:0;z-index:0}
  .hol-bloc-image__vue img,
  .hol-bloc-image__vue picture{display:block;width:100%;height:100%;
                               object-fit:cover;object-position:75% center}
  /* SEUL LE BORD GAUCHE SE NOIE. Le dégradé est opaque sur la première moitié
     de la bande d'image, puis disparaît : passé 66 %, l'image est nette, sans
     aucun voile. Un voile qui la couvrirait entière reviendrait à l'assombrir,
     et il n'y aurait plus rien à montrer.

     POURQUOI 66 % ET NON 58 %. La colonne de texte va jusqu'à 66 % de la carte :
     une ligne de titre un peu longue, ou une note poussée à droite, atterrissait
     sur la zone déjà nette. Le voile s'arrête maintenant là où le texte
     s'arrête. La photo garde tout son tiers droit, celui où se trouve le sujet. */
  .hol-bloc-image__fondu{position:absolute;inset:0;pointer-events:none;
    background:linear-gradient(90deg,
      var(--hol-surface-inverse) 0%,
      var(--hol-surface-inverse) 16%,
      var(--hol-hero-scrim-b) 38%,
      var(--hol-hero-scrim-c) 54%,
      transparent 66%)}
  /* Le texte déborde largement la moitié, et c'est possible parce que le bord
     gauche de l'image est déjà noyé : il s'arrête là où l'image redevient
     nette. Serré sur 620 px, le titre partait sur quatre lignes. */
  .hol-bloc-image__mots{position:relative;z-index:1;max-width:min(66%,800px)}
  .hol-bloc-image__mots h2{max-width:none}
  .hol-bloc-image__mots p{max-width:54ch}

  /* ----- Le pied de la carte : l'action et sa note ---------------------------
     Les deux étaient collés l'un à l'autre en bas à gauche, empilés dans la
     colonne de texte, pendant que la moitié de la carte restait vide. Ils
     s'écartent maintenant aux deux bouts d'une même ligne.

     JUSQU'OÙ, EXACTEMENT. Pas jusqu'au bord : passé 58 % de la carte, le fondu
     est fini et la photo est nette. Une note grise posée là ne se lirait plus.
     La ligne s'arrête donc avant, dans la zone où l'image est encore noyée. */
  /* LE BOUTON ET SA NOTE VONT JUSQU'À LA MARGE DROITE DE LA CARTE, serrés l'un
     contre l'autre comme au premier jour. Le groupe est calé à droite : c'est
     la marge de la carte qui l'arrête, pas une largeur calculée. */
  .hol-bloc-image__pied{position:relative;z-index:1;flex:0 0 auto;
                        display:flex;align-items:center;flex-wrap:wrap;
                        justify-content:flex-end;gap:18px}
  .hol-bloc-image__pied p{margin:0;max-width:34ch}

  /* Sur un téléphone, une image de côté n'a plus de place : elle passe en fond
     de toute la carte, très en retrait, et le texte la recouvre. */
  @media(max-width:860px){
    /* Plus de côte à côte : le texte prend toute la largeur et le bouton passe
       dessous, comme avant. */
    .hol-scope .hol-bloc-image{display:block}
    .hol-bloc-image__pied{margin-top:26px}
    .hol-bloc-image__vue{width:100%}
    /* Plus de largeur à répartir, et nulle part où se caler : les deux blocs se
       suivent simplement, à leur place. */
    .hol-bloc-image__pied{justify-content:flex-start}
    /* LE BLEU DOIT ÊTRE EN HAUT, PARCE QUE L'ÉCRITURE EST BLANCHE.
       Les arrêts étaient en pourcentage de la hauteur de la carte. Sur un
       téléphone cette carte fait sept cents pixels de haut : « opaque à 54 % »
       tombait trois cent cinquante pixels plus bas que la première ligne du
       titre, qui se retrouvait donc en blanc sur la partie claire de la photo.
       Les arrêts sont maintenant en pixels, mesurés depuis le haut de la
       carte : la photo garde une fenêtre d'une centaine de pixels, le marine
       est plein à cent trente, et le texte, qui ne commence qu'à cent
       cinquante, est toujours posé dessus. */
    /* CINQ ARRÊTS, ET LE DERNIER ARRIVE TARD. Avec trois arrêts, le voile
       passait de neuf dixièmes à l'opacité pleine en cinquante pixels : l'œil
       voit une arête, pas un fondu, et c'est ce que Jimmy appelle « mastoc ».
       Les quatre paliers de voile du hero sont donc tous employés, répartis en
       proportion de la hauteur réservée, et le marine plein n'arrive qu'à
       quatre-vingt-douze pour cent. On garde le corps de la photo bien plus
       bas, et la transition ne se repère plus. */
    /* ET LE VOILE COMMENCE PLUS BAS, pour qu'on voie l'image. Il partait du
       bord haut de la carte : même très léger, un voile posé dès le premier
       pixel ternit toute la photo. Jimmy : « je veux voir un peu plus l'image ;
       que le dégradé sorte fort en bas et monte légèrement, avec de petits
       paliers en remontant. »

       Les quatre dixièmes du haut sont donc laissés nus, la photo s'y lit telle
       quelle. Le voile ne prend qu'ensuite, en quatre paliers resserrés vers le
       bas, et le marine est plein juste avant le premier mot. Fort en bas,
       léger en montant : c'est le sens de lecture de la carte. */
    /* TREIZE ARRÊTS SUR UNE COURBE, ET PLUS AUCUN COUDE.
       Les quatre voiles du hero sont des paliers : entre deux, le navigateur
       interpole en ligne droite, et chaque changement de pente se voit comme
       un trait horizontal. Le plus visible était le premier, là où le voile
       démarrait. Jimmy : « la fin du dégradé est trop brusque ; je veux que
       mes yeux ne puissent même pas faire la différence entre le dégradé et
       la photo, qu'il baigne dedans ».

       Le voile suit donc une courbe, alpha = t puissance 2,5, échantillonnée
       en treize points. Il n'y a plus de départ : à un dixième de la hauteur
       l'opacité vaut trois millièmes, on ne peut pas la voir. Elle ne devient
       sensible qu'au deuxième tiers, et atteint sa valeur de pied juste sous
       le titre. Une courbe n'a pas de coude, donc il n'y a plus rien à
       repérer. */
    .hol-bloc-image__fondu{background:linear-gradient(180deg,
      rgba(30, 35, 64, 0) 0,
      rgba(30, 35, 64, .003) calc(var(--hol-img-haut) * .10),
      rgba(30, 35, 64, .017) calc(var(--hol-img-haut) * .20),
      rgba(30, 35, 64, .046) calc(var(--hol-img-haut) * .30),
      rgba(30, 35, 64, .095) calc(var(--hol-img-haut) * .40),
      rgba(30, 35, 64, .166) calc(var(--hol-img-haut) * .50),
      rgba(30, 35, 64, .262) calc(var(--hol-img-haut) * .60),
      rgba(30, 35, 64, .385) calc(var(--hol-img-haut) * .70),
      rgba(30, 35, 64, .505) calc(var(--hol-img-haut) * .78),
      rgba(30, 35, 64, .626) calc(var(--hol-img-haut) * .85),
      rgba(30, 35, 64, .743) calc(var(--hol-img-haut) * .91),
      rgba(30, 35, 64, .849) calc(var(--hol-img-haut) * .96),
      var(--hol-voile-fond) var(--hol-img-haut))}
    .hol-bloc-image__mots{max-width:none}
    .hol-bloc-image__mots p{max-width:52ch}
    /* AVEC « .hol-scope » DEVANT, SINON LA RÈGLE NE PASSAIT PAS : la règle de
       base s'écrit « .hol-scope .hol-bloc-image », deux classes contre une, et
       elle gagnait. La carte gardait donc ses trente-quatre pixels de haut, la
       photo n'avait pas sa fenêtre, et le titre blanc tombait dessus. */
    /* LA FENÊTRE DE LA PHOTO ET LA PLACE QU'ON LUI RÉSERVE SONT LA MÊME
       MESURE. Les arrêts du fondu étaient en pixels fixes, la réserve en
       clamp : sur un téléphone les deux tombaient juste, sur un iPad la
       réserve montait à deux cent vingt pendant que le marine devenait plein
       dès cent trente-deux, et il restait quatre-vingt-dix pixels de bleu nu
       entre la photo et le premier mot. Une seule variable, et l'écart ne peut
       plus réapparaître. */
    /* ET ON LUI DONNE PLUS DE HAUTEUR POUR LE FAIRE : un fondu n'est doux que
       s'il a de la place. Deux cent vingt pixels sur un iPad n'en laissaient
       pas assez. */
    .hol-scope .hol-bloc-image{--hol-img-haut:clamp(170px,38vw,300px);
                               padding-top:var(--hol-img-haut)}
  }


/* ===========================================================================
   FIL D'ARIANE DU SITE PUBLIC (.hol-fil)
   Une bande claire sous l'en-tête, collée juste dessous quand on défile : le
   chemin de retour ne doit pas disparaître au moment où l'on en a besoin, au
   fond d'une page longue.
   =========================================================================== */
/* La hauteur de l'en-tête n'est pas constante : il se replie sur deux rangs
   entre 900 et 1250 px, et fait alors 120 px au lieu de 70. Le fil se collait
   sous une valeur figée et passait donc SOUS l'en-tête à ces largeurs-là. Le
   script mesure la vraie hauteur et la pose ici ; 70 px reste le repli. */
.hol-fil{position:sticky;top:var(--hol-entete-h,70px);z-index:55;
         background:var(--hol-header-bg);backdrop-filter:blur(14px) saturate(160%);
         border-bottom:1px solid var(--hol-border-subtle)}
.hol-fil ol{list-style:none;margin:0;padding:11px 0;display:flex;flex-wrap:wrap;
            align-items:center;gap:9px;
            font-size:13.5px;color:var(--hol-text-muted)}
.hol-fil li{display:flex;align-items:center;gap:9px}
.hol-fil li + li::before{content:"·";color:var(--hol-border-strong)}
.hol-fil a{color:var(--hol-text-secondary);text-decoration:none;
           padding:3px 2px;border-radius:var(--hol-r-sm)}
.hol-fil a:hover{color:var(--hol-brand);text-decoration:underline;text-underline-offset:3px}
.hol-fil [aria-current]{color:var(--hol-brand);font-weight:600}
/* Le retour se distingue : c'est une action, pas une étape du chemin. */
.hol-fil__retour{margin-right:4px}
.hol-fil__retour + li::before{content:none}
.hol-fil__retour a{display:inline-flex;align-items:center;gap:5px;min-height:34px;
                   padding:0 12px;font-weight:600;color:var(--hol-brand);
                   border:1px solid var(--hol-border-subtle);background:var(--hol-surface-1)}
.hol-fil__retour a:hover{border-color:var(--hol-brand);text-decoration:none}
@media (max-width:600px){
  .hol-fil ol{font-size:12.5px;gap:7px;padding:9px 0}
  /* Sur un téléphone, le chemin complet ne tient pas : on garde le retour et
     la page courante, qui sont les deux seules choses utiles au doigt. */
  .hol-fil li:not(.hol-fil__retour):not(:last-child){display:none}
  .hol-fil li:last-child::before{content:none}
}

/* ===========================================================================
   REMONTER EN HAUT (.hol-haut)
   Caché tant qu'on n'a pas descendu : un bouton permanent encombrerait le coin
   de l'écran sans servir. Révélé par le script, donc absent sans lui, ce qui
   est le bon repli pour un pur confort.
   =========================================================================== */
/* LE COIN BAS DROIT EST PARTAGÉ avec le bouton d'Eddy, qui s'y pose en bas.
   La remontée se range donc au-dessus de lui : superposés, l'un des deux
   deviendrait impossible à viser au doigt. La hauteur ajoutée est celle du
   bouton d'Eddy (60px) et l'écart entre les deux (12px). */
/* LA FLÈCHE SE CENTRE SUR LE BOUTON D'EDDY, pas sur son bord. Les deux
   étaient alignés à DROITE, à la même distance du bord de l'écran ; mais
   l'un fait soixante pixels et l'autre quarante-huit, donc leurs axes
   tombaient à six pixels l'un de l'autre, et la pile penchait. On décale
   donc de la moitié de la différence, calculée et non écrite : si la taille
   d'Eddy change un jour, l'axe suit. Sans Eddy, le repli vaut 48 et le
   décalage est nul. */
.hol-haut{position:fixed;
          right:calc(var(--eddy-bord, clamp(14px,3vw,28px)) + (var(--eddy-taille, 48px) - 48px) / 2);
          bottom:calc(clamp(14px,3vw,28px) + 72px);
          z-index:58;display:grid;place-items:center;width:48px;height:48px;
          border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-pill);
          background:var(--hol-surface-1);color:var(--hol-brand);
          box-shadow:var(--hol-shadow-2);cursor:pointer;
          opacity:0;visibility:hidden;transform:translateY(8px);
          transition:opacity .2s ease,transform .2s ease,visibility .2s}
.hol-haut[data-visible="1"]{opacity:1;visibility:visible;transform:none}
/* Le bandeau cookies occupe le bas de l'écran tant qu'on n'a pas répondu. Le
   bouton se range au-dessus de lui plutôt que dessous, où il serait
   inatteignable au moment précis où la page est la plus longue.
   L'attribut est posé par le script, pas par « :has() » : ce sélecteur manque
   encore sur les Android anciens, que ce site doit servir. */
.hol-haut[data-bandeau="1"]{bottom:calc(var(--hol-bandeau-h, 104px) + 12px + 72px)}

/* ═══ LES TROIS CHOIX DU BANDEAU COOKIES ════════════════════════════════════

   AUCUN DES TROIS NE RÉAGISSAIT AU SURVOL : ils étaient habillés dans
   l'attribut « style », qui ne sait pas porter de « :hover ». Et le troisième
   était souligné, ce que Jimmy refuse.

   REFUSER RESTE AUSSI SIMPLE QU'ACCEPTER, et ce n'est pas une préférence de
   dessin : même taille, même graisse, même cible pour les deux premiers. Le
   troisième est un choix plus fin, « seulement l'indispensable » ; il se
   distingue par sa teinte et sa graisse, jamais par un trait. */
.hol-scope .hol-cook__btn{font-family:var(--hol-police-texte),sans-serif;
                          min-height:40px;border-radius:var(--hol-r-sm);
                          cursor:pointer;white-space:nowrap;text-decoration:none;
                          transition:background-color .15s ease,border-color .15s ease,
                                     color .15s ease}
.hol-scope .hol-cook__btn--oui{background:var(--hol-brand);color:var(--hol-text-inverse);
                               font-weight:600;font-size:13.5px;border:1px solid var(--hol-brand);
                               padding:0 16px}
.hol-scope .hol-cook__btn--oui:hover{background:var(--hol-brand-active);
                                     border-color:var(--hol-brand-active)}
.hol-scope .hol-cook__btn--non{background:transparent;color:var(--hol-text-inverse);
                               font-weight:600;font-size:13.5px;
                               border:1px solid var(--hol-border-on-dark);padding:0 16px}
.hol-scope .hol-cook__btn--non:hover{background:var(--hol-verre-fond);
                                     border-color:var(--hol-text-inverse)}
/* LE TROISIÈME CHOIX : un fantôme qui se remplit quand on le vise. Sa teinte
   au repos reste en retrait, et elle monte au blanc plein au survol : la
   lisibilité ne dépend donc jamais de l'état. */
.hol-scope .hol-cook__btn--min{background:transparent;color:var(--hol-text-inverse-2);
                               font-weight:500;font-size:12.5px;
                               border:1px solid transparent;padding:0 12px}
.hol-scope .hol-cook__btn--min:hover{background:var(--hol-verre-fond);
                                     border-color:var(--hol-verre-bord);
                                     color:var(--hol-text-inverse)}
.hol-scope .hol-cook__btn:focus-visible{outline:2px solid var(--hol-focus-inverse);
                                        outline-offset:2px}
@media (prefers-reduced-motion:reduce){.hol-scope .hol-cook__btn{transition:none}}
.hol-haut:hover{background:var(--hol-brand);color:var(--hol-text-inverse);
                border-color:var(--hol-brand)}
.hol-haut svg{width:20px;height:20px}
@media (prefers-reduced-motion:reduce){.hol-haut{transition:none}}

/* ===========================================================================
   QUESTIONS FRÉQUENTES (.faq-*)
   Un accordéon <details> natif : dépliable sans script, navigable au clavier,
   et le texte des réponses reste lisible par un moteur de recherche. Le script
   n'ajoute que le mouvement et le calage sous les barres collantes.
   =========================================================================== */
/* UNE ANCRE S'ÉCARTE DES BARRES COLLANTES. Sans cette marge, le navigateur
   pose le titre visé exactement en haut de la fenêtre, c'est-à-dire derrière
   l'en-tête et le fil d'Ariane : on arrive sur la bonne section en croyant
   qu'elle a sauté. La hauteur réelle des deux barres est posée par le script
   du pied de page ; 128px est le repli quand il ne tourne pas. */
.faq-section,.faq-item,.faq-ecrire{scroll-margin-top:calc(var(--hol-collant, 128px) + 14px)}
.faq-liste{display:flex;flex-direction:column;gap:10px}
.faq-item{padding:0;overflow:hidden}
.faq-som{list-style:none;cursor:pointer;display:flex;align-items:center;gap:14px;
         padding:18px 20px;font-family:var(--hol-police-titre),sans-serif;font-weight:700;
         font-size:16.5px;line-height:1.35;color:var(--hol-text-primary);
         transition:background .18s ease}
/* Safari pose son propre triangle par un pseudo-élément à lui. */
.faq-som::-webkit-details-marker{display:none}
.faq-som::marker{content:""}
.faq-som:hover{background:var(--hol-brand-wash)}
.faq-som:focus-visible{outline:2px solid var(--hol-focus);outline-offset:-2px}
.faq-som__q{flex:1}
.faq-chev{flex:none;width:26px;height:26px;border-radius:var(--hol-r-pill);
          background:var(--hol-brand-wash);color:var(--hol-brand);
          display:flex;align-items:center;justify-content:center;font-size:13px;
          transition:transform .22s ease,background .18s ease,color .18s ease}
/* Le chevron dit l'état : vers le bas fermé, vers le haut ouvert. Il ne le
   disait pas, faute de cette règle : la transition était écrite, la rotation
   jamais. */
.faq-item[open] .faq-chev{transform:rotate(180deg);
                          background:var(--hol-brand);color:var(--hol-text-inverse)}
/* Le conteneur dont la hauteur s'anime. Il ne porte aucune marge intérieure :
   une marge ne suit pas la hauteur animée et laisserait un sursaut au départ
   comme à l'arrivée. Tout l'espace est porté par le bloc du dedans. */
.faq-corps{overflow:hidden}
.faq-rep{padding:16px 20px 20px;border-top:1px solid var(--hol-border-subtle);
         font-size:15px;line-height:1.65;color:var(--hol-text-secondary)}

/* --- Poser une question, sans quitter la page ---------------------------
   Une question qui n'est pas dans la liste EST une question de la liste : on
   la pose au même endroit, dans le même mouvement. Partir sur une page de
   contact pour une seule phrase fait renoncer, et ce renoncement ne se voit
   nulle part. */
.faq-ecrire{margin-top:22px;border:1px solid var(--hol-border-strong);
            border-radius:var(--hol-r-lg);background:var(--hol-surface-1);
            overflow:hidden}
.faq-ecrire[open]{border-color:var(--hol-brand)}
.faq-ecrire__som{list-style:none;cursor:pointer;display:flex;align-items:center;gap:12px;
                 padding:16px 20px;font-size:15px;color:var(--hol-text-secondary);
                 transition:background .18s ease}
.faq-ecrire__som::-webkit-details-marker{display:none}
.faq-ecrire__som::marker{content:""}
.faq-ecrire__som:hover{background:var(--hol-brand-wash)}
.faq-ecrire__som:focus-visible{outline:2px solid var(--hol-focus);outline-offset:-2px}
.faq-ecrire__som b{color:var(--hol-brand);font-weight:600}
.faq-ecrire__signe{flex:none;margin-left:auto;color:var(--hol-brand);font-size:17px;
                   transition:transform .22s ease}
.faq-ecrire[open] .faq-ecrire__signe{transform:rotate(90deg)}
.faq-ecrire__corps{padding:4px 20px 22px;border-top:1px solid var(--hol-border-subtle)}
/* L'ASTÉRISQUE DIT « DEMANDÉ », il ne dit pas « erreur ». C'est un repère de
   formulaire, pas un état du système : il n'annonce rien qui soit arrivé. Il
   prend donc le rouge de la marque, et le sens est porté par la légende sous
   les champs, pas par la couleur seule. */
.faq-oblig{color:var(--hol-accent-texte);margin-left:3px;font-weight:700}
.faq-legende{font-size:12.5px;line-height:1.5;color:var(--hol-text-muted);margin:14px 0 0}
.faq-etiq{display:block;font-size:13.5px;font-weight:600;margin:16px 0 6px;
          color:var(--hol-text-primary)}
.faq-champ{width:100%;min-height:48px;padding:12px 14px;font:inherit;font-size:16px;
           background:var(--hol-surface-1);color:var(--hol-text-primary);
           border:1px solid var(--hol-border-strong);border-radius:var(--hol-r-sm)}
.faq-champ:focus-visible{outline:2px solid var(--hol-focus);outline-offset:1px;
                         border-color:var(--hol-brand)}
textarea.faq-champ{min-height:120px;line-height:1.55;resize:vertical}
.faq-final{font-size:13.5px;line-height:1.55;color:var(--hol-text-muted);margin:14px 0 0}
.faq-envoi{display:inline-flex;align-items:center;justify-content:center;min-height:50px;
           margin-top:14px;padding:0 26px;cursor:pointer;font:inherit;font-weight:600;
           font-size:15.5px;border:0;border-radius:var(--hol-r-sm);
           background:var(--hol-brand);color:var(--hol-text-inverse)}
.faq-mot{display:flex;gap:10px;align-items:flex-start;margin:16px 0 0;padding:12px 14px;
         font-size:14.5px;line-height:1.55;border-radius:var(--hol-r-sm)}
.faq-mot--ok{background:var(--hol-succes-wash);border:1px solid var(--hol-succes-border);
             color:var(--hol-succes)}
.faq-mot--non{background:var(--hol-accent-wash);border:1px solid var(--hol-accent-border);
              color:var(--hol-erreur)}
@media (prefers-reduced-motion:reduce){
  .faq-chev,.faq-ecrire__signe,.faq-som,.faq-ecrire__som{transition:none}
}

/* ===========================================================================
   À L'IMPRESSION, RIEN NE FLOTTE
   Une attestation imprimée est une pièce : ni bouton de remontée, ni assistant
   dans la marge. Les pages qui s'impriment ont leur propre règle pour le reste.
   =========================================================================== */
@media print{
  .hol-haut,.eu-eddy,.eu-eddy-launch,.eu-eddy-nudge{display:none !important}
}

/* ===========================================================================
   BANDEAU « RÉSERVER UN COURS D'ESSAI » (.essai-*)
   Les choix étaient des boutons qui ne choisissaient rien : un attribut
   « aria-pressed » figé dans le balisage, et aucun script pour le changer.
   Ce sont maintenant de vrais boutons radio, cachés à l'œil mais présents dans
   le formulaire : la sélection fonctionne SANS JAVASCRIPT, elle se parcourt au
   clavier avec les flèches, et elle part avec l'envoi.
   =========================================================================== */
.essai-choix{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}
/* Le bouton radio reste dans la page pour le clavier et les lecteurs d'écran :
   « display:none » le retirerait des deux. */
.essai-choix input{position:absolute;opacity:0;width:1px;height:1px;margin:0}
.essai-opt{display:inline-flex;align-items:center;justify-content:center;
           min-height:44px;padding:0 14px;cursor:pointer;
           border:1px solid var(--hol-border-on-dark);border-radius:var(--hol-r-sm);
           background:transparent;color:var(--hol-text-inverse-2);
           font-family:var(--hol-police-mono),monospace;font-size:13px;font-weight:600;
           transition:background .18s ease,border-color .18s ease,color .18s ease}
.essai-opt--large{flex:1 1 130px;font-family:var(--hol-police-texte),sans-serif;font-size:13.5px}
.essai-choix input:checked + .essai-opt{border-color:var(--hol-accent-clair);
                                        background:var(--hol-glass-hi);
                                        color:var(--hol-text-inverse)}
.essai-choix input:focus-visible + .essai-opt{outline:2px solid var(--hol-brand-clair);
                                              outline-offset:2px}
.essai-choix label:hover .essai-opt{border-color:var(--hol-bordure-sur-sombre);
                                    color:var(--hol-text-inverse)}
@media (prefers-reduced-motion:reduce){.essai-opt{transition:none}}

/* ===========================================================================
   CARTES DU CATALOGUE (.cat-card)
   Elles n'avaient que du texte : trois lignes à lire avant de savoir de quoi
   il s'agit, et deux cartes voisines impossibles à distinguer d'un coup d'œil.
   Chacune porte maintenant son visuel, et sa marque d'état posée dessus.

   LE RAPPORT EST TENU SANS « aspect-ratio », par la vieille méthode du
   remplissage proportionnel : la propriété manque sur les Android anciens que
   ce site doit servir, et une image sans hauteur y ferait sauter toute la
   grille au chargement.
   =========================================================================== */
.cat-card{padding:0;overflow:hidden;display:flex;flex-direction:column}
.cat-card__vue{position:relative;margin:0;flex:none;overflow:hidden;
               padding-bottom:62%;background:var(--hol-surface-0)}
.cat-card__vue > img,
.cat-card__vue > .hol-slot{position:absolute;top:0;right:0;bottom:0;left:0;
                           width:100%;height:100%;object-fit:cover;
                           transition:transform .35s ease}
/* Le survol anime l'image, et elle seule : c'est la règle des cartes format de
   l'accueil, reprise telle quelle pour que le site n'ait qu'un seul geste. */
.cat-card:hover .cat-card__vue > img{transform:scale(1.03)}
/* La marque d'état se pose SUR la photo, en pastille claire : sur un fond
   d'image quelconque, un aplat blanc est la seule valeur qui tienne toujours. */
.cat-card__marque{position:absolute;top:12px;right:12px;z-index:1;
                  display:inline-flex;align-items:center;
                  font-family:var(--hol-police-mono),monospace;font-size:10.5px;
                  font-weight:600;letter-spacing:.06em;text-transform:uppercase;
                  padding:5px 10px;border-radius:var(--hol-r-pill);
                  background:var(--hol-surface-1);color:var(--hol-brand);
                  box-shadow:var(--hol-shadow-1)}
.cat-card__marque--bientot{color:var(--hol-text-muted)}
.cat-card__corps{display:flex;flex-direction:column;flex:1 1 auto;padding:20px 22px 22px}
@media (prefers-reduced-motion:reduce){
  .cat-card__vue > img{transition:none}
  .cat-card:hover .cat-card__vue > img{transform:none}
}

/* ===========================================================================
   CADRE VIDÉO (.hol-video)
   Un seul cadre pour tout le site : la page Méthode l'avait écrit à la main,
   la fiche de cours en avait besoin à son tour. Recopié, il aurait divergé.
   =========================================================================== */
.hol-video{position:relative;overflow:hidden;padding:0}
.hol-video__cadre{position:relative;padding-bottom:56.25%;background:var(--hol-surface-0)}
.hol-video__cadre > img,
.hol-video__cadre > video,
.hol-video__cadre > .hol-slot{position:absolute;top:0;right:0;bottom:0;left:0;
                              width:100%;height:100%;object-fit:cover}
.hol-video__lecture{position:absolute;top:0;right:0;bottom:0;left:0;
                    display:flex;align-items:center;justify-content:center;pointer-events:none}
/* « display:flex » l'emporte sur le display:none que le navigateur pose sur un
   élément caché : sans cette ligne, le bouton restait affiché par-dessus la
   vidéo lancée, et l'on croyait le clic sans effet. */
.hol-video__lecture[hidden]{display:none}
/* Le même dessin, mais cliquable : sur un vrai lecteur, c'est un bouton. Le
   voile ne prend pas le clic (pointer-events:none plus haut) ; celui-ci, si. */
.hol-video__lecture--bouton{pointer-events:auto;cursor:pointer;
                            padding:0;border:0;background:none;
                            width:100%;height:100%;color:inherit}
.hol-video__lecture--bouton:hover .hol-video__bouton{background:var(--hol-brand-hover)}
.hol-video__lecture--bouton:focus-visible{outline:none;
                                          box-shadow:inset 0 0 0 3px var(--hol-focus-inverse)}
.hol-video__bouton{width:76px;height:76px;border-radius:var(--hol-r-pill);
                   background:var(--hol-brand);border:1px solid var(--hol-glass-hi);
                   box-shadow:var(--hol-shadow-3);
                   display:flex;align-items:center;justify-content:center}
.hol-video__bouton span{width:0;height:0;margin-left:5px;
                        border-left:20px solid var(--hol-text-inverse);
                        border-top:13px solid transparent;border-bottom:13px solid transparent}
/* Sur un vrai lecteur, la pastille remonte : en bas, elle se posait sur la
   barre de commandes du navigateur et prenait le clic de la lecture. */
.hol-video--lecteur .hol-video__etiquette{top:16px;bottom:auto}
.hol-video__etiquette{position:absolute;left:16px;bottom:16px;pointer-events:none;
                      font-family:var(--hol-police-mono),monospace;font-size:11px;
                      color:var(--hol-text-inverse);background:var(--hol-chip-dark);
                      backdrop-filter:blur(6px);border:1px solid var(--hol-border-on-dark);
                      padding:5px 10px;border-radius:7px}

/* ===========================================================================
   SYLLABUS (.syl-*)
   Une liste de modules et de leçons se lit mal en tableau plat : on cherche où
   commence le module suivant. Chaque module devient un bloc, son numéro une
   pastille, et les leçons se suivent le long d'un rail vertical, comme les
   arrêts d'un parcours. C'est la métaphore de la passerelle du site, tenue
   avec un trait de deux pixels et rien d'autre.
   =========================================================================== */
.syl-module{padding:0;margin-bottom:14px;overflow:hidden}
.syl-module__tete{display:flex;align-items:center;gap:14px;padding:14px 18px;
                  background:var(--hol-brand-wash);
                  border-bottom:1px solid var(--hol-border-subtle)}
.syl-module__n{flex:none;display:grid;place-items:center;width:30px;height:30px;
               border-radius:var(--hol-r-pill);background:var(--hol-brand);
               color:var(--hol-text-inverse);
               font-family:var(--hol-police-mono),monospace;font-size:12px;font-weight:600}
.syl-module__titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;
                   font-size:16.5px;line-height:1.25;min-width:0}
.syl-module__compte{margin-left:auto;flex:none;
                    font-family:var(--hol-police-mono),monospace;font-size:11px;
                    color:var(--hol-text-secondary);background:var(--hol-surface-1);
                    border:1px solid var(--hol-border-subtle);
                    padding:4px 10px;border-radius:var(--hol-r-pill);white-space:nowrap}
/* Le rail : il court entre la première et la dernière leçon, jamais au-delà,
   sinon il pend sous la dernière comme un fil coupé. */
.syl-lecons{position:relative;padding:10px 14px 14px}
.syl-lecons::before{content:"";position:absolute;left:26px;top:22px;bottom:22px;
                    width:2px;background:var(--hol-border-subtle)}
.syl-lecon{position:relative;display:flex;align-items:center;gap:14px;
           padding:10px 8px;border-radius:var(--hol-r-sm);
           transition:background .18s ease}
.syl-lecon:hover{background:var(--hol-surface-0)}
/* L'anneau blanc masque le rail derrière la puce : sans lui, le trait traverse
   le point et le fait paraître creux. */
.syl-puce{flex:none;width:10px;height:10px;border-radius:var(--hol-r-pill);
          background:var(--hol-brand-clair);box-shadow:0 0 0 4px var(--hol-surface-1)}
.syl-lecon__titre{flex:1;min-width:0;font-size:14.5px;line-height:1.4;
                  color:var(--hol-text-primary)}
.syl-niveau{flex:none;font-family:var(--hol-police-mono),monospace;font-size:11px;font-weight:600;
            color:var(--hol-brand);background:var(--hol-brand-wash);
            padding:3px 8px;border-radius:var(--hol-r-pill)}
.syl-type{flex:none;font-family:var(--hol-police-mono),monospace;font-size:11px;
          color:var(--hol-text-muted)}
@media (max-width:520px){
  .syl-type{display:none}
  .syl-module__titre{font-size:15px}
}
@media (prefers-reduced-motion:reduce){.syl-lecon{transition:none}}

/* ===========================================================================
   FICHE LATÉRALE D'UN COURS (.cours-fiche)
   Trois lignes de texte gris se ressemblent toutes : on relit les trois pour
   trouver celle qui répond. Chaque ligne porte donc son signe, et son libellé
   passe en capitales étroites pour se distinguer de la réponse.
   =========================================================================== */
.cours-fiche{padding:20px 22px 22px}
.cours-fiche__kicker{font-family:var(--hol-police-mono),monospace;font-size:10px;
                     letter-spacing:.1em;text-transform:uppercase;
                     color:var(--hol-text-muted);margin-bottom:6px}
.cours-fiche__ligne{display:flex;align-items:flex-start;gap:13px;
                    padding:14px 0;border-top:1px solid var(--hol-border-subtle)}
.cours-fiche__icone{flex:none;display:grid;place-items:center;width:30px;height:30px;
                    border-radius:var(--hol-r-sm);
                    background:var(--hol-brand-wash);color:var(--hol-brand)}
.cours-fiche__icone svg{width:17px;height:17px}
.cours-fiche__texte{display:flex;flex-direction:column;gap:3px;min-width:0}
.cours-fiche__label{font-family:var(--hol-police-mono),monospace;font-size:10.5px;
                    letter-spacing:.08em;text-transform:uppercase;
                    color:var(--hol-text-muted)}
.cours-fiche__val{font-size:14.5px;line-height:1.45;color:var(--hol-text-primary)}
.cours-fiche__cta{--hol-lien:var(--hol-text-inverse);--hol-lien-survol:var(--hol-text-inverse);
                  display:block;text-align:center;min-height:48px;line-height:48px;
                  margin-top:20px;background:var(--hol-brand);color:var(--hol-text-inverse);
                  font-weight:600;font-size:15px;border-radius:var(--hol-r-sm);
                  text-decoration:none}
.cours-fiche__cta:hover{background:var(--hol-brand-hover)}

/* ===========================================================================
   HERO D'UNE FICHE DE COURS (.cours-hero)

   UNE FICHE DE COURS EST UNE PAGE DE VENTE. Le premier écran répond à trois
   questions, avant tout défilement : de quoi s'agit-il, à quoi cela ressemble,
   par où j'entre. Le titre répond à la première, la vidéo à la deuxième, les
   deux boutons à la troisième. Tout le reste de la page vient après.

   LA VIDÉO MONTE DANS LE HERO. Elle vivait sous le pli : on arrivait sur une
   carte coupée en deux, moitié dedans moitié dehors, ce qui donne l'air d'une
   page mal montée avant même qu'on ait lu une ligne.

   LA PHRASE RESTE SOUS LE TITRE, DANS SA COLONNE. Elle a d'abord couru sous
   les deux colonnes, pour tenir sur deux lignes : elle passait alors sous la
   carte vidéo, et l'on ne voyait plus à quoi elle se rattachait. Une colonne,
   un bloc : le titre, la phrase et les boutons tombent sur le même bord, la
   vidéo occupe l'autre colonne, et rien ne se chevauche.

   DEUX LIGNES À PARTIR DE 1400 px, largeur à laquelle la phrase la plus longue
   des deux langues tient entièrement dans sa colonne (mesuré : 739 px de large
   à 16,5 px). En dessous, elle s'écoule sur trois lignes plutôt que d'être
   tronquée : mieux vaut une ligne de plus qu'une phrase coupée au milieu.
   =========================================================================== */
.cours-hero{position:relative;background:var(--hol-hero-navy);overflow:hidden}
.cours-hero__fond,.cours-hero__voile{position:absolute;top:0;right:0;bottom:0;left:0}
.cours-hero__fond{z-index:0}
/* Deux voiles, pas un : l'horizontal tient la colonne de texte, le vertical
   assombrit le bas du cadre, où la photo remonte derrière la phrase et les
   boutons. Sans le second, du texte blanc passerait sur une zone claire. */
.cours-hero__voile{z-index:1;pointer-events:none;
                   background:linear-gradient(90deg,var(--hol-hero-scrim-a) 0%,
                                                    var(--hol-hero-scrim-b) 48%,
                                                    var(--hol-hero-scrim-c) 100%)}
.cours-hero__voile--bas{background:linear-gradient(0deg,var(--hol-hero-scrim-d) 0%,
                                                        var(--hol-hero-scrim-nul) 58%)}
.cours-hero__grille{--hol-cours-titre:clamp(36px,4.6vw,62px);
                    position:relative;z-index:2;display:grid;
                    grid-template-columns:minmax(0,1fr) minmax(0,34%);
                    column-gap:44px;row-gap:22px;align-items:center;
                    padding-top:58px;padding-bottom:62px}
.cours-hero__tete {grid-column:1;grid-row:1;min-width:0}
.cours-hero__bas  {grid-column:1;grid-row:2;min-width:0}
/* La vidéo tient toute la colonne de droite, centrée en face du bloc de texte. */
.cours-hero__media{grid-column:2;grid-row:1 / span 2;align-self:center;min-width:0}
.cours-hero__retour{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
                    display:inline-block;margin-bottom:16px;
                    font-size:13.5px;font-weight:600;text-decoration:none}
.cours-hero__retour:hover{text-decoration:underline;text-underline-offset:3px}
.cours-hero__kicker{font-family:var(--hol-police-mono),monospace;font-size:12px;letter-spacing:.13em;
                    text-transform:uppercase;color:var(--hol-accent-clair);margin-bottom:14px}
/* La taille du titre est nommée : la hauteur réservée au hero s'en déduit,
   plus bas, et les deux ne peuvent plus diverger. */
.cours-hero__titre{font-family:var(--hol-police-titre),sans-serif;font-weight:800;
                   font-size:var(--hol-cours-titre);line-height:1.03;letter-spacing:-.025em;
                   color:var(--hol-text-inverse);margin:0;max-width:22ch;text-wrap:balance}
/* VINGT-DEUX SIGNES, ET NON QUATORZE. Jimmy, le 24 octobre : « Anglais du
   quotidien » sur une seule ligne, comme « Everyday English » en anglais.
   À quatorze, le nom français se coupait en deux alors que la colonne avait
   la place. Un titre plus long que vingt-deux signes repasse sur deux lignes,
   équilibrées par « balance ». */
.cours-hero__desc{margin:0;font-size:16.5px;line-height:1.6;
                  color:var(--hol-text-inverse-1);text-wrap:pretty}
.cours-hero__actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:24px}
.cours-hero__cta{--hol-lien:var(--hol-text-inverse);--hol-lien-survol:var(--hol-text-inverse);
                 display:inline-flex;align-items:center;justify-content:center;
                 min-height:54px;padding:0 30px;border:1px solid var(--hol-brand);
                 background:var(--hol-brand);color:var(--hol-text-inverse);
                 font-weight:600;font-size:16px;border-radius:var(--hol-r-sm);text-decoration:none}
.cours-hero__cta:hover{background:var(--hol-brand-hover);border-color:var(--hol-brand-hover)}
.cours-hero__cta--ghost{background:var(--hol-glass);border-color:var(--hol-border-on-dark)}
.cours-hero__cta--ghost:hover{background:var(--hol-glass-hi);border-color:var(--hol-glass-hi)}
.cours-hero__cta:focus-visible{outline:none;
                               box-shadow:0 0 0 2px var(--hol-hero-navy),0 0 0 5px var(--hol-focus-inverse)}
/* La carte vidéo se détache du bleu nuit : c'est le point de fuite du premier
   écran, elle porte donc l'ombre la plus profonde de la palette. */
.cours-hero__media .hol-video{box-shadow:var(--hol-shadow-3)}

/* LA HAUTEUR SE RÉSERVE SUR LE CADRE, PAS DANS LE TEXTE.
   « Everyday English » tient sur une ligne, « Anglais du quotidien » en prend
   deux : le hero changeait de hauteur d'une langue à l'autre et la carte vidéo
   sautait. Réserver la deuxième ligne DANS le titre creusait un trou sous un
   titre court. La réserve est donc posée sur le cadre, et « align-content »
   recentre tout le bloc dedans : sous un titre d'une ligne, le sous-titre
   remonte contre le titre, et le jeu part en air au-dessus et en dessous, là
   où personne ne le voit.
   Le calcul suit la taille du titre, donc toutes les largeurs : deux lignes de
   titre, plus ce qui l'entoure. Il est volontairement large de quelques
   pixels : trop court, il serait ignoré et l'instabilité reviendrait. */
@media (min-width:901px){
  .cours-hero__grille{min-height:calc(342px + 2.06 * var(--hol-cours-titre));
                      align-content:center}
}
/* Sous 1280 px, la phrase n'est plus tenue à deux lignes : elle peut en
   prendre trois d'un côté et quatre de l'autre, le français étant plus long
   que l'anglais. La réserve prend donc une ligne de phrase de plus. */
@media (min-width:901px) and (max-width:1279px){
  .cours-hero__grille{min-height:calc(367px + 2.06 * var(--hol-cours-titre))}
}
/* Entre 900 et 1400 px, la colonne de texte n'est plus assez large pour tenir
   la phrase en deux lignes à 16,5 px. Plutôt que de la laisser filer sur trois
   lignes, on rend 4 points de largeur à la colonne de gauche et on descend d'un
   point de corps : les deux langues repassent en deux lignes jusque vers
   1260 px, sans jamais descendre sous les 13 px de la charte. */
@media (min-width:901px) and (max-width:1399px){
  .cours-hero__grille{grid-template-columns:minmax(0,1fr) minmax(0,30%)}
  .cours-hero__desc{font-size:15.5px}
}
/* La coupe à deux lignes ne s'arme QUE là où les deux langues y tiennent
   entièrement : au-dessous, elle tronquerait une phrase au milieu. */
@media (min-width:1280px){
  .cours-hero__desc{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}
}
/* Sous 900 px la vidéo passe SOUS le titre et AVANT la phrase : c'est encore
   elle qu'on doit voir sans défiler, un téléphone n'ayant pas la place de
   mettre deux blocs côte à côte. */
/* Sur téléphone la même règle s'applique, mais la vidéo entre dans le compte :
   elle est empilée sous le titre, et sa hauteur vaut 9/16 de la largeur du
   cadre, gouttières déduites. Cela se calcule, donc rien n'est deviné. */
@media (max-width:900px){
  .cours-hero__grille{grid-template-columns:minmax(0,1fr);row-gap:22px;
                      padding-top:34px;padding-bottom:40px;
                      align-content:center;
                      min-height:calc(458px + 2.06 * var(--hol-cours-titre)
                                            + 0.5625 * (100vw - 80px))}
  .cours-hero__tete,.cours-hero__media,.cours-hero__bas{grid-column:1;grid-row:auto}
  .cours-hero__titre{max-width:none}
  .cours-hero__desc{font-size:16px}
  .cours-hero__actions{margin-top:20px}
}
/* Les boutons ne prennent toute la largeur que sur un téléphone. Sur une
   tablette en portrait, un bouton de 724 px de long ne se lit plus comme un
   bouton : il garde donc sa largeur naturelle dès 600 px. */
@media (max-width:600px){
  .cours-hero__cta{width:100%}
}
/* Sous 600 px la gouttière tombe à 22 px : le cadre vidéo s'élargit d'autant,
   et la hauteur réservée suit. */
@media (max-width:600px){
  .cours-hero__grille{min-height:calc(458px + 2.06 * var(--hol-cours-titre)
                                            + 0.5625 * (100vw - 44px))}
}
/* Sur un téléphone, le surtitre se lit encore à 11 px en capitales étroites,
   et tient alors sur une seule ligne : à 12 px il passait à deux et poussait
   le titre d'autant. */
@media (max-width:600px){
  .cours-hero__kicker{font-size:11px;letter-spacing:.09em;margin-bottom:12px}
}

/* ===========================================================================
   LE TEMPS DE SE POSER (html[data-hol-pose])
   L'en-tête est bleu nuit en haut de page et clair dès qu'on défile, et il
   passe de l'un à l'autre en trois dixièmes de seconde. C'est juste quand on
   défile. Ça ne l'est pas au chargement : une page rouverte plus bas (un
   rafraîchissement, un changement de langue) s'affichait avec l'en-tête du
   haut, puis le voyait virer sous les yeux. Un reflet, à chaque ouverture.

   Tant que l'attribut est posé, AUCUNE transition ne joue nulle part : la page
   prend son état, d'un coup et sans bruit. Le script de l'en-tête le retire
   une fois la page posée, et tout redevient animé pour la suite.

   L'attribut n'est posé que par ce script : sans JavaScript, ces règles ne
   s'appliquent jamais.
   =========================================================================== */
html[data-hol-pose] *,
html[data-hol-pose] *::before,
html[data-hol-pose] *::after{transition:none !important}

/* ===========================================================================
   TÊTE DU CATALOGUE (.cat-tete)
   Le titre et le dessin de signature, côte à côte. Le dessin est décoratif :
   sous 900 px la colonne disparaît plutôt que de se tasser, un téléphone
   devant garder sa hauteur pour les cours eux-mêmes.
   =========================================================================== */
.cat-tete{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,40%);
          column-gap:40px;align-items:center;padding-top:60px;padding-bottom:0}
.cat-tete__texte{min-width:0}
.cat-tete__signe{min-width:0}
@media (max-width:900px){
  .cat-tete{grid-template-columns:minmax(0,1fr);padding-top:44px}
  .cat-tete__signe{display:none}
}

/* ===========================================================================
   LES SIGNATURES DESSINÉES (.hol-signe)
   Une par page, à droite du titre : le catalogue, la méthode, l'histoire, les
   tarifs, les questions fréquentes. Toutes tiennent dans le même trait de deux
   pixels, les mêmes pastilles, le même mono pour les niveaux, et ne tirent
   leurs couleurs que des tokens. Elles sont décoratives : le titre porte le
   sens, elles le racontent.

   Elles disparaissent quand la colonne disparaît, plutôt que de se tasser :
   sur un téléphone, la hauteur revient au contenu.
   =========================================================================== */
.hol-signe{display:block;width:100%;height:auto;max-width:480px;margin-left:auto}

/* Hero de page : le texte à gauche, le dessin à droite. La variante étroite
   sert aux titres qui réclament leur largeur, comme celui de la méthode, qui
   passerait à trois lignes sous 780 px. */
.hero-duo{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,36%);
          column-gap:40px;align-items:center;width:100%}
.hero-duo--etroit{grid-template-columns:minmax(0,1fr) minmax(0,28%)}
.hero-duo__signe{min-width:0}
@media (max-width:900px){
  .hero-duo,.hero-duo--etroit{grid-template-columns:minmax(0,1fr)}
  .hero-duo__signe{display:none}
}

/* Questions fréquentes : la liste garde ses 840 px, le dessin prend le reste
   et se cale en haut, à hauteur du titre. Il part plus tôt que les autres :
   sous 1100 px la liste occupe déjà toute la largeur utile. */
.faq-duo{display:grid;grid-template-columns:minmax(0,840px) minmax(0,1fr);
         column-gap:48px;align-items:center}
.faq-duo__liste{min-width:0;max-width:840px}
/* Calé au milieu de la hauteur de la liste, et poussé contre le bord droit :
   c'est la place que la section lui laisse. */
.faq-duo__signe{min-width:0}
.faq-duo__signe .hol-signe{max-width:340px}
@media (max-width:1100px){
  .faq-duo{grid-template-columns:minmax(0,1fr)}
  .faq-duo__signe{display:none}
}

/* ===========================================================================
   LES TRÈS PETITS ÉCRANS (320 px : iPod touch, iPhone SE de première
   génération, Android d'entrée de gamme encore très répandus en Haïti)

   DEUX DÉBORDEMENTS, DEUX CAUSES, MESURÉES.

   1. L'EN-TÊTE. Sous 1100 px la barre est en « nowrap » : le logo à gauche, le
      bouton à droite, et rien entre les deux. Le logo fait 188 px à sa hauteur
      de charte, le bouton 96 px avec son mot, la gouttière en prend 44 : il
      faut 340 px de large pour que tout tienne. En dessous, le mot « Menu »
      s'efface et les trois traits suffisent. Le bouton garde son nom pour les
      lecteurs d'écran, qui l'annoncent comme avant.
      Ni la hauteur du logo ni la gouttière ne bougent : ce sont deux règles de
      marque, et c'est au libellé de céder.

   2. LES GRILLES DE CARTES. Une piste « minmax(300px,1fr) » réclame 300 px
      pour sa colonne, alors qu'il n'en reste que 276 : la carte dépassait de
      24 px. Sous 600 px, ces grilles n'ont de toute façon qu'une colonne, la
      deuxième ne pouvant apparaître qu'autour de 650 px de large : leur rendre
      la largeur disponible ne change donc rien ailleurs, et supprime le
      débordement là où il existe.
   =========================================================================== */
@media (max-width:340px){
  .ent-bascule-mot{display:none}
}
@media (max-width:600px){
  .hol-scope [style*="minmax(300px"],
  .hol-scope [style*="minmax(280px"]{grid-template-columns:minmax(0,1fr) !important}
}

/* ===========================================================================
   LES JALONS D'UN PARCOURS (.jalons)
   Quatre cartes posées côte à côte ne disaient pas qu'elles se suivent : on y
   lisait quatre faits, pas un chemin. Elles s'accrochent donc au rail de la
   passerelle, celui du programme d'un cours et des dessins de signature, et
   chacune porte son numéro sur le rail.

   LE RAIL SE DESSINE PAR MORCEAUX : chaque jalon trace le segment qui le relie
   au suivant, et le dernier n'en trace pas. C'est ce qui permet au trait de
   commencer au premier point et de s'arrêter au dernier, sans calcul de
   largeur ni de gouttière, quelle que soit la taille de l'écran.

   LE DERNIER JALON EST L'ARRIVÉE : son point se remplit, sa carte prend le
   fond de la marque. C'est HOLANGCOURS, le reste du chemin y mène.

   Sur téléphone le rail se redresse : il descend à gauche, les jalons se
   suivent de haut en bas, comme les leçons d'un module.
   =========================================================================== */
.jalons{list-style:none;margin:0;padding:0;
        display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:22px}
.jalon{position:relative;padding-top:40px;min-width:0}
.jalon::before{content:"";position:absolute;top:16px;left:20px;right:-22px;height:2px;
               background:var(--hol-border-strong);opacity:.45}
.jalon:last-child::before{content:none}
/* LE POINT SUR LE RAIL NE PORTE PLUS LE NUMÉRO : le numéro est descendu dans
   la carte, en grand. Deux fois le même chiffre à dix pixels d'écart, c'était
   une redite ; le rail n'a besoin que de ses points. */
.jalon__n{position:absolute;top:9px;left:0;z-index:1;
          width:15px;height:15px;border-radius:var(--hol-r-pill);
          background:var(--hol-surface-1);border:2px solid var(--hol-brand-clair)}
.jalon:last-child .jalon__n{background:var(--hol-brand);border-color:var(--hol-brand)}
.jalon__carte{position:relative;overflow:hidden;
              display:flex;flex-direction:column;gap:13px;height:100%;padding:22px 22px 26px}
/* Le numéro en filigrane, dans l'angle bas : il numérote sans se mettre devant
   le texte, et donne à la carte le poids qui lui manquait. */
.jalon__chiffre{position:absolute;right:14px;bottom:-4px;pointer-events:none;
                font-family:var(--hol-police-mono),monospace;font-size:46px;font-weight:600;
                line-height:1;color:var(--hol-brand);opacity:.1}
/* LA DERNIÈRE ÉTAPE PASSE EN BLEU NUIT. La charte réserve ce fond aux sections
   rares et intentionnelles : celle-ci l'est. Trois cartes claires et une
   sombre, et l'on voit où mène le chemin avant d'avoir lu une ligne. */
.jalon:last-child .jalon__carte{background:var(--hol-surface-inverse);border-color:transparent}
.jalon:last-child .jalon__chiffre{color:var(--hol-text-inverse);opacity:.18}
/* LA DATE EST UNE ÉTIQUETTE, pas une ligne de texte de plus. En pastille, elle
   se distingue du titre au lieu de lui faire concurrence, et le jour où elle
   sera renseignée elle se lira comme une donnée : c'en est une. */
.jalon__date{align-self:flex-start;display:inline-flex;align-items:center;gap:8px;
             padding:5px 11px;border-radius:var(--hol-r-pill);
             background:var(--hol-surface-0);border:1px solid var(--hol-border-subtle);
             font-family:var(--hol-police-mono),monospace;font-size:10.5px;font-weight:600;
             letter-spacing:.09em;text-transform:uppercase;color:var(--hol-text-muted)}
.jalon:last-child .jalon__date{background:var(--hol-glass);
                               border-color:var(--hol-border-on-dark);
                               color:var(--hol-text-inverse-2)}
/* Le point rouge dit qu'il manque quelque chose ; rempli, il ne dit plus rien
   et redevient une simple puce de marque. */
.jalon__puce{flex:none;width:7px;height:7px;border-radius:var(--hol-r-pill);
             background:var(--hol-accent)}
.jalon__titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;
              font-size:18.5px;line-height:1.2;letter-spacing:-.012em;
              color:var(--hol-text-primary)}
.jalon:last-child .jalon__titre{color:var(--hol-text-inverse)}
.jalon__texte{margin:-2px 0 0;font-size:15px;line-height:1.6;color:var(--hol-text-secondary)}
.jalon:last-child .jalon__texte{color:var(--hol-text-inverse-1)}

/* Quatre colonnes ne s'ouvrent qu'à partir de 1220 px : en dessous, chaque
   carte tomberait sous les 240 px et le titre d'un jalon s'y hacherait en
   quatre lignes. Deux rangs de deux se lisent mieux qu'une rangée serrée. */
@media (max-width:1220px){
  .jalons{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 22px}
  /* Sur deux rangs, le rail ne doit pas sauter d'une ligne à l'autre : il
     s'arrête au bout de chaque rang. */
  .jalon:nth-child(2n)::before{content:none}
}
@media (max-width:640px){
  .jalons{grid-template-columns:minmax(0,1fr);gap:0}
  .jalon{padding-top:0;padding-left:38px;padding-bottom:20px}
  .jalon__n{top:24px}
  .jalon::before{content:"";top:24px;bottom:2px;left:6px;right:auto;width:2px;height:auto}
  .jalon:nth-child(2n)::before{content:""}
  .jalon:last-child::before{content:none}
}

/* ===========================================================================
   COQUILLE DE L'ADMINISTRATION (.adm-*)
   L'administration est un outil de travail : elle doit se tenir comme une
   application, et ressembler au site qu'elle administre. Une barre d'identité,
   une rangée d'onglets, un bandeau de page, et le grain de la marque dessous.

   La barre est SOMBRE et les onglets vivent dedans : on sait toujours qu'on
   est du côté outil, et la zone de travail garde tout le reste de l'écran.
   =========================================================================== */
/* LE HAUT RESTE À L'ÉCRAN : l'identité, les onglets ET le fil d'Ariane. Dans
   un outil, on descend dans une longue liste et il faut pouvoir changer
   d'écran, ou remonter d'un cran, sans revenir en haut. Un seul conteneur
   collant plutôt que trois : la hauteur de la barre change avec la largeur de
   l'écran, et il n'y a ainsi rien à mesurer. */
.adm-haut{position:sticky;top:0;z-index:60}
/* Une ancre d'administration s'écarte de la barre collante, dont la hauteur
   est mesurée par le script de la coquille et non devinée. */
.adm-ancre{scroll-margin-top:calc(var(--hol-collant, 170px) + 18px)}
.adm-barre{background:var(--hol-surface-inverse);color:var(--hol-text-inverse);
           box-shadow:var(--hol-shadow-2)}
.adm-barre__rang{display:flex;align-items:center;gap:18px;flex-wrap:wrap;
                 padding-top:14px;padding-bottom:14px}
.adm-marque{display:inline-flex;align-items:center;flex:none}
/* Taille de charte sur fond sombre : à 26 px le globe du O se bouchait. */
.adm-logo{height:48.8px;width:auto;margin-left:-9.8px;display:block}
/* LE LOGO D'UN LOCATAIRE N'EST PAS UN LETTRAGE. Le nôtre est large et bas, et
   son retrait de 9,8 px rattrape le blanc que porte le fichier. Celui d'un
   client est souvent carré ou rond : la même hauteur en ferait un pavé, et le
   retrait le collerait au bord. Il reçoit donc sa propre mesure, et un plafond
   de largeur pour qu'une bannière très allongée ne pousse pas les onglets. */
.adm-logo--locataire{height:38px;max-width:190px;margin-left:0;object-fit:contain}
/* LE LOGO DE PREVALOG, SUR LA CONSOLE (Domain/Console). Moins large que notre
   lettrage : sa hauteur est la sienne, et son retrait ne rattrape que le
   mince blanc que porte le fichier. */
.adm-logo--prevalog{height:40px;margin-left:-3px}
.adm-mot{font-family:var(--hol-police-mono),monospace;font-size:11px;letter-spacing:.14em;
         text-transform:uppercase;color:var(--hol-brand-clair);
         padding:5px 11px;border-radius:var(--hol-r-pill);
         border:1px solid var(--hol-border-on-dark);background:var(--hol-glass)}
.adm-barre__droite{margin-left:auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.adm-lien{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
          font-size:14px;text-decoration:none;white-space:nowrap}
.adm-lien:hover{text-decoration:underline;text-underline-offset:3px}
.adm-sortie{margin:0}
.adm-sortie__bouton{min-height:38px;padding:0 16px;cursor:pointer;font:inherit;font-size:13.5px;
                    font-weight:600;color:var(--hol-text-inverse);
                    background:var(--hol-glass);border:1px solid var(--hol-border-on-dark);
                    border-radius:var(--hol-r-sm)}
.adm-sortie__bouton:hover{background:var(--hol-glass-hi)}
.adm-sortie__bouton:focus-visible{outline:none;
                                  box-shadow:0 0 0 2px var(--hol-surface-inverse),0 0 0 4px var(--hol-focus-inverse)}

/* LES ONGLETS. Une rangée qui défile plutôt qu'une pile qui se replie : sur un
   écran étroit, six onglets empilés mangeraient la page entière. */
/* DES BOUTONS, PAS SIX MOTS ALIGNÉS. Un trait rouge sous un mot, et rien
   autour : on ne voyait pas qu'il y avait là de quoi cliquer, et l'onglet
   ouvert ne se distinguait qu'au trait. Chacun devient une pastille qui
   réagit au survol ; l'onglet ouvert prend le fond clair et le texte sombre,
   comme la touche enfoncée d'un sélecteur. Le rouge reste où il dit quelque
   chose : sur le compteur de ce qui attend d'être traité. */
.adm-onglets{border-top:1px solid var(--hol-border-on-dark)}

/* ON NE DEVINE PAS QU'UNE RANGÉE DÉFILE.
   Quatorze onglets ne tiennent pas sur un écran, et la barre de défilement d'un
   Mac ne se montre que pendant qu'on défile : on arrivait sur l'écran sans
   savoir qu'il y avait quelque chose à droite. Le dernier onglet visible était
   coupé net, ce qui ressemble à un défaut d'affichage plutôt qu'à une invite.

   DEUX FLÈCHES, ET ELLES CLIQUENT. Un simple fondu dirait qu'il y a une suite,
   sans dire comment y aller : sur un ordinateur sans pavé tactile horizontal,
   il faudrait attraper la barre de défilement à la souris. La flèche n'apparaît
   que du côté où il reste quelque chose, et disparaît quand on est au bout :
   c'est elle qui dit où l'on en est. */
/* LES FLÈCHES SONT AUX BORDS DE L'ÉCRAN, et c'est leur place. */
.adm-onglets__cadre{position:relative}
/* LA RANGÉE PREND TOUTE LA LARGEUR DE LA BARRE, et c'est ce qui manquait.
   Elle était centrée dans un conteneur de 1480 pixels comme le reste de
   l'administration : sur un grand écran, le premier onglet commençait à plus de
   cent pixels de la flèche, et l'on voyait un rond perdu dans le vide. Elle
   s'étend maintenant d'un bord à l'autre et ne s'écarte que de la place des
   flèches, de la même mesure des deux côtés. C'est la seule rangée du site
   dans ce cas : elle défile, elle n'est pas un bloc de lecture. */
.adm-onglets__piste{display:flex;gap:6px;overflow-x:auto;
                    -webkit-overflow-scrolling:touch;
                    padding-top:8px;padding-bottom:8px;
                    padding-left:calc(var(--hol-gutter) + 22px);
                    padding-right:calc(var(--hol-gutter) + 22px);
                    max-width:none;margin-left:0;margin-right:0;
                    scrollbar-width:none}
.adm-onglets__piste::-webkit-scrollbar{height:0;width:0}

.adm-fleche{position:absolute;top:0;bottom:0;z-index:2;
            display:flex;align-items:center;
            width:calc(var(--hol-gutter) + 16px);
            padding:0;border:0;cursor:pointer;color:var(--hol-text-inverse);
            transition:opacity .15s ease}
/* Les deux flèches restent visibles tant qu'il y a de quoi défiler ; elles ne
   s'effacent que si toute la rangée tient à l'écran. Celle qui est au bout de
   sa course garde son allure et ne répond plus : l'annoncer par la couleur
   ferait changer la barre d'aspect selon l'endroit où l'on en est. */
.adm-fleche[hidden]{display:none}
.adm-fleche[aria-disabled="true"]{pointer-events:none}
.adm-fleche--g{left:0;justify-content:flex-start;padding-left:max(10px,calc(var(--hol-gutter) - 30px));
               background:linear-gradient(to right,
                 var(--hol-inverse-fondu-plein) 72%,
                 var(--hol-inverse-fondu-nul) 100%)}
.adm-fleche--d{right:0;justify-content:flex-end;padding-right:max(10px,calc(var(--hol-gutter) - 30px));
               background:linear-gradient(to left,
                 var(--hol-inverse-fondu-plein) 72%,
                 var(--hol-inverse-fondu-nul) 100%)}
.adm-fleche__rond{display:flex;align-items:center;justify-content:center;
                  width:30px;height:30px;border-radius:var(--hol-r-pill);
                  background:var(--hol-glass-hi);
                  border:1px solid var(--hol-border-on-dark)}
.adm-fleche:hover .adm-fleche__rond{background:var(--hol-surface-1)}
.adm-fleche:hover{color:var(--hol-surface-inverse)}
.adm-fleche:focus-visible{outline:none}
.adm-fleche:focus-visible .adm-fleche__rond{box-shadow:0 0 0 2px var(--hol-surface-inverse),
                                                       0 0 0 4px var(--hol-focus-inverse)}
.adm-fleche svg{display:block;width:15px;height:15px;fill:none;stroke:currentColor;
                stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.adm-onglet{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
            display:inline-flex;align-items:center;gap:8px;white-space:nowrap;flex:none;
            min-height:38px;padding:0 15px;font-size:14px;font-weight:600;
            text-decoration:none;border-radius:var(--hol-r-pill);
            border:1px solid transparent;
            transition:background .15s ease,border-color .15s ease,color .15s ease}
.adm-onglet:hover{background:var(--hol-glass-hi);border-color:var(--hol-border-on-dark)}
/* Le passage entre la console Prevalog et la maison HOLANGCOURS (Domain/Console) :
   un lien au bout de la rangée, marqué d'un filet pour ne pas passer pour un
   onglet de plus. */
.adm-bascule{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
             display:inline-flex;align-items:center;gap:8px;white-space:nowrap;flex:none;
             min-height:38px;padding:0 15px;margin-left:10px;font-size:14px;font-weight:600;
             text-decoration:none;border-radius:var(--hol-r-pill);
             border:1px dashed var(--hol-border-on-dark)}
.adm-bascule:hover{background:var(--hol-glass-hi)}
.adm-onglet[aria-current]{--hol-lien:var(--hol-surface-inverse);
                          --hol-lien-survol:var(--hol-surface-inverse);
                          color:var(--hol-surface-inverse);
                          background:var(--hol-surface-1);
                          border-color:var(--hol-surface-1);
                          box-shadow:var(--hol-shadow-1)}
.adm-onglet[aria-current]:hover{background:var(--hol-surface-1);
                                border-color:var(--hol-surface-1)}
.adm-onglet:focus-visible{outline:none;
                          box-shadow:0 0 0 2px var(--hol-surface-inverse),0 0 0 4px var(--hol-focus-inverse)}
.adm-pastille{display:inline-flex;align-items:center;justify-content:center;
              min-width:20px;height:20px;padding:0 6px;border-radius:var(--hol-r-pill);
              background:var(--hol-accent);color:var(--hol-accent-encre,var(--hol-text-inverse));
              font-family:var(--hol-police-mono),monospace;font-size:11.5px;font-weight:600}

/* LE BANDEAU DE PAGE : le patron des pages publiques, en plus serré. C'est ce
   qui dit, sans le dire, qu'on est toujours chez HOLANGCOURS. */
.adm-hero{padding:clamp(26px,4vw,40px) 0 clamp(22px,3vw,30px);
          border-bottom:1px solid var(--hol-border-subtle)}
.adm-hero__kicker{font-family:var(--hol-police-mono),monospace;font-size:11.5px;letter-spacing:.14em;
                  text-transform:uppercase;color:var(--hol-brand);margin-bottom:10px}
.adm-hero__titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;
                 font-size:clamp(26px,4vw,38px);line-height:1.1;letter-spacing:-.02em;
                 color:var(--hol-text-primary);margin:0}
.adm-hero__intro{margin:10px 0 0;font-size:16px;line-height:1.6;
                 color:var(--hol-text-secondary);text-wrap:pretty}

/* LE GRAIN DE LA MARQUE COUVRE TOUTE LA FENÊTRE, et non le bloc de contenu.
   Posé sur le conteneur, il s'arrêtait à sa largeur ; posé sur le contenu, il
   s'arrêtait à sa hauteur, et sur un écran peu rempli une couture courait en
   travers de la page. Il est donc porté par le corps lui-même, en fond fixe :
   le motif tient à la fenêtre, pas au flux, et il n'y a plus de bord.

   Le bandeau de page n'a plus de fond propre, sans quoi il masquerait ce
   motif-là pour en reposer un identique. */
/* Pas de « overflow-x:hidden » ici : il masquerait un vrai débordement au lieu
   de le montrer. Les tableaux larges défilent dans leur propre cadre. */
.adm-corps{background-color:var(--hol-surface-0);color:var(--hol-text-primary);
           background-image:
             radial-gradient(var(--hol-motif-dot) 1.1px, transparent 1.7px),
             radial-gradient(circle at 8% 12%, var(--hol-motif-halo-1), transparent 52%),
             radial-gradient(circle at 92% 88%, var(--hol-motif-halo-2), transparent 46%);
           background-size:24px 24px, auto, auto;
           background-attachment:fixed}

/* ═══ LA BARRE D'ADMINISTRATION TIENT SUR UN RANG, À TOUTES LES LARGEURS ═══
   Trois paliers, et ils sont calculés, pas devinés. À sa taille de dessin, la
   barre demande 945 px : la marque 244, la pastille 187, les quatre commandes
   478, et les écarts. La place disponible vaut 84 % de la largeur de l'écran,
   gouttière déduite.

     · au-delà de 1200 px : 1008 px de place pour 945 demandés, rien à faire ;
     · de 1001 à 1200 px  : il manque jusqu'à 85 px, on les reprend sur le logo,
                            la pastille et les écarts, et tout reste lisible ;
     · jusqu'à 1000 px    : même en serrant tout, il manquerait encore cent
                            pixels. La pastille et le prénom s'effacent, le
                            bandeau juste en dessous les redit de toute façon.

   Jimmy, sur iPad Pro : « ça fait un peu des briques quand il y a ces deux
   lignes ; j'aimerais que ce soit affiché comme sur un ordinateur, sur une
   seule ligne. Si ça ne peut pas prendre, rétrécis le texte et Super Admin. »
   C'est exactement ce que fait le palier du milieu. */
@media (max-width:1000px){
  /* La barre reste collée, donc elle doit coûter le moins de hauteur
     possible : sur un téléphone, chaque pixel retenu en haut est un pixel
     retiré au travail. */
  /* Sur un téléphone, barre et fil feraient plus du quart de l'écran : seule
     la barre reste collée, le fil s'en va avec la page. */
  .adm-haut{position:static}
  .adm-barre{position:sticky;top:0;z-index:60}
  .adm-barre__rang{gap:10px;padding-top:7px;padding-bottom:7px}
  .adm-logo{height:30px;margin-left:-5px}
  .adm-logo--locataire{height:28px;max-width:140px;margin-left:0}
  .adm-logo--prevalog{height:30px;margin-left:-2px}
  .adm-sortie__bouton{min-height:34px;padding:0 12px;font-size:13px}
  .adm-lien{font-size:13.5px}
  /* Sur un téléphone, la barre tenait sur trois rangs. Le prénom et la
     pastille « administration » s'effacent : le bandeau les redit juste en
     dessous, et c'est la place qui manque, pas l'information. Le rond, lui,
     reste : c'est la porte du compte, et il ne se remplace pas par un mot. */
  .adm-mot{display:none}
  .adm-barre .hol-identite__nom{display:none}
  .adm-barre .hol-identite{padding-right:3px}
  .adm-onglet{min-height:34px;padding:0 12px;font-size:13.5px}
}

/* DE 701 À 1000 PIXELS, ON INTERDIT LE REPLI. La place existe une fois le logo
   réduit et la pastille retirée ; il se déclenchait pour une poignée de
   pixels. */
@media (min-width:701px) and (max-width:1000px){
  .hol-scope .adm-barre__rang{flex-wrap:nowrap}
  .hol-scope .adm-barre__droite{flex-wrap:nowrap;gap:12px;min-width:0}
}

/* ───── LE PALIER DU MILIEU : 1001 À 1200 PIXELS (iPad Pro en portrait) ─────
   Tout reste à l'écran, marque, pastille et quatre commandes, mais d'un cran
   plus serré. Le compte : logo 190 au lieu de 244, pastille 153 au lieu de
   187, écarts 14 et 12 au lieu de 18 et 16. Soit 837 px demandés pour 840
   disponibles au plus étroit du palier. */
@media (min-width:1001px) and (max-width:1200px){
  .hol-scope .adm-barre__rang{flex-wrap:nowrap;gap:14px}
  .hol-scope .adm-logo{height:38px;margin-left:-7.6px}
  .hol-scope .adm-logo--locataire{height:32px;max-width:160px}
  .hol-scope .adm-logo--prevalog{height:36px;margin-left:-3px}
  .hol-scope .adm-mot{font-size:9.5px;letter-spacing:.1em;padding:4px 9px}
  .hol-scope .adm-barre__droite{flex-wrap:nowrap;gap:12px;min-width:0}
  .hol-scope .adm-lien{font-size:13px}
  .hol-scope .adm-sortie__bouton{min-height:34px;padding:0 13px;font-size:13px}
}

/* LA BARRE A GAGNÉ TROIS COMMANDES DEPUIS LE COMPTE CI-DESSUS (24 octobre
   2026) : la liste « Maison », le lien vers la console et les appareils
   reconnus. Entre 701 et 1200 pixels, celle d'un super administrateur sortait
   de l'écran de 40 à 90 pixels. Le prénom s'efface derrière son rond (il reste
   au survol), et la liste des maisons se resserre. */
@media (min-width:701px) and (max-width:1200px){
  .hol-scope .adm-barre .hol-identite__nom{display:none}
  .hol-scope .adm-barre .hol-identite{padding-right:3px}
  .hol-scope .adm-barre select[data-hl-liste]{max-width:150px !important;margin-left:0 !important}
}
/* SUR UNE TABLETTE ÉTROITE (701 à 860), la pastille « Super administrateur »
   s'efface aussi, comme sur un téléphone : la barre sortait de 30 à 80 pixels. */
@media (min-width:701px) and (max-width:860px){
  .hol-scope .adm-mot{display:none}
  .hol-scope .adm-barre select[data-hl-liste]{max-width:130px !important}
}
@media (min-width:701px) and (max-width:800px){
  .hol-scope .adm-barre__rang{gap:8px}
  .hol-scope .adm-barre__droite{gap:7px}
  .hol-scope .adm-barre select[data-hl-liste]{max-width:146px !important;padding-left:9px !important}
  .hol-scope .adm-logo{height:30px;margin-left:-6px}
  .hol-scope .adm-logo--prevalog{height:28px;margin-left:-2px}
  .hol-scope .adm-sortie__bouton{padding:0 10px}
}
@media (min-width:701px) and (max-width:748px){
  .hol-scope .adm-barre select[data-hl-liste]{max-width:104px !important}
}

/* ===========================================================================
   LA BARRE D'ADMINISTRATION SUR UN TÉLÉPHONE : DEUX RANGS, PAS TROIS
   Sur trois cent soixante-quinze pixels, la marque et les quatre commandes
   demandent cinq cents pixels : aucun réglage ne les mettra sur une ligne, et
   les forcer ne produisait qu'un débordement de cent cinq pixels vers la
   droite. On assume donc deux rangs nets, et on les tient : la marque seule en
   haut, les commandes dessous, alignées à droite jusqu'à la gouttière. Le
   libellé « Voir le site » s'efface derrière sa flèche, sans quoi le rang des
   commandes se couperait à son tour.
   =========================================================================== */
@media (max-width:700px){
  /* DE L'AIR AU-DESSUS DE LA MARQUE. Sept pixels séparaient le logo du bord
     haut : sur un Android à encoche, la caméra mordait dessus, et même sans
     encoche la barre commençait à ras bord quand l'en-tête du site public, lui,
     garde vingt-cinq pixels. Jimmy : « le logo est caché, descends un peu
     l'en-tête ». Quatorze pixels en valeur sûre, et la mesure de l'encoche en
     plus là où le système la donne : la seconde déclaration est ignorée par les
     moteurs qui ne connaissent pas « env », qui gardent donc les quatorze. */
  .hol-scope .adm-barre__rang{flex-wrap:wrap;row-gap:8px;
                              padding-top:14px;padding-bottom:10px}
  .hol-scope .adm-barre__rang{padding-top:calc(14px + env(safe-area-inset-top, 0px))}
  .hol-scope .adm-barre__droite{flex:0 0 100%;margin-left:0;
                                justify-content:flex-end;flex-wrap:nowrap;gap:10px}
  .hol-scope .adm-lien__mot{display:none}
  /* L'application se demande pour l'ordinateur : sur un téléphone, la barre
     n'a pas la place d'un bouton de plus, il s'efface. */
  .hol-scope .adm-installer{display:none}
  .hol-scope .adm-lien{font-size:18px;line-height:1}
  /* TRENTE-QUATRE, PAS VINGT-SIX. La marque était plus basse que le bouton de
     déconnexion posé juste dessous : elle est ce qui dit où l'on se trouve,
     elle ne peut pas être l'élément le plus discret de la barre. À trente-
     quatre elle fait cent soixante-dix-sept pixels de large, la moitié d'un
     écran de trois cent soixante, et elle est seule sur son rang. */
  .hol-scope .adm-logo{height:34px;margin-left:-6.8px}
  .hol-scope .adm-logo--locataire{height:30px;max-width:150px;margin-left:0}
  .hol-scope .adm-logo--prevalog{height:32px;margin-left:-2px}
  /* La liste des maisons part de la gouttière, comme le reste de la barre :
     sa marge de douze pixels ne servait qu'à l'écarter du logo voisin. */
  .hol-scope .adm-barre select[data-hl-liste]{margin-left:0 !important}
}
/* LE SUPER ADMINISTRATEUR SOUS 375 PIXELS. Il a une commande de plus (la
   console) : à 320, le rang dépassait de sept pixels, et vingt-quatre de plus
   pour rester dans la gouttière comme le cadenas au-dessus. Les écarts
   passent de dix à six, FR et EN de trente-huit à trente-deux, le bouton de
   sortie perd six pixels de marge intérieure. Trente-deux reste le plancher
   des cibles tactiles (fin de feuille) : le sélecteur est plus précis que le
   leur, sans quoi il perdrait, écrit plus haut. */
@media (max-width:374px){
  .hol-scope .adm-barre__droite{gap:6px}
  .hol-scope .adm-langues .adm-langue{min-width:32px;padding:0 6px}
  .hol-scope .adm-sortie__bouton{padding:0 9px}
}

/* ===========================================================================
   LES LISTES DÉROULANTES DU SITE

   La flèche du système change de dessin d'un navigateur à l'autre, et d'un
   système à l'autre : sur le même écran, deux listes voisines n'avaient pas la
   même. On la remplace par un chevron unique, le même que partout ailleurs sur
   le site, et on garde la hauteur et le cadre des autres champs.

   CETTE RÈGLE NE SERVAIT QUE L'ADMINISTRATION. Les formulaires publics, eux,
   gardaient la flèche du système, collée au bord droit du champ et dessinée
   autrement sur chaque machine. Elle vaut maintenant pour tout « .hol-scope »,
   c'est-à-dire pour le site entier.

   ELLE GAGNE SANS « !important » : deux classes de sélecteur contre une seule
   dans les pages (« .pro-champ », « .champ », « .edi-champ »), donc elle passe
   devant sans qu'aucune page ait à être réécrite.

   LA COULEUR DU CHEVRON EST LA SEULE ÉCRITE EN DUR du fichier de tokens : une
   image en URI de données ne sait pas lire une variable CSS. Elle reprend
   exactement --hol-text-secondary. Si ce token change, cette ligne change.
   =========================================================================== */
.hol-scope select{
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  width:100%;min-height:46px;padding:0 42px 0 14px;
  font:inherit;font-size:15px;color:var(--hol-text-primary);
  background-color:var(--hol-surface-1);
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23565C72' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 13px center;background-size:18px 18px;
  border:1px solid var(--hol-border-strong);border-radius:var(--hol-r-sm);
  cursor:pointer;
}
.hol-scope select:hover{border-color:var(--hol-brand-clair)}
.hol-scope select:focus-visible{outline:none;border-color:var(--hol-brand);
                                box-shadow:0 0 0 3px var(--hol-brand-wash)}
.hol-scope select:disabled{cursor:not-allowed;opacity:.6}
/* Une liste à choix multiples n'a pas de flèche : elle montre ses lignes. */
.hol-scope select[multiple],.hol-scope select[size]{background-image:none;padding-right:14px;min-height:0}

/* ===========================================================================
   LES ICÔNES DES GROUPES DE RÉGLAGES (.adm-ico)
   Un repère, pas une illustration : 18 px, le trait du site, et la couleur du
   texte à côté. Dans l'entrée active, elles passent au blanc avec le libellé.
   =========================================================================== */
.adm-ico{flex:none;width:18px;height:18px;opacity:.75}
.onglet[aria-current] .adm-ico{opacity:1}

/* ===========================================================================
   LE RACCOURCI VERS LA BANQUE (.adm-raccourci)
   À droite d'un réglage du test : le nombre de questions qui existent, et la
   porte pour aller les voir. Il se lit comme une information, pas comme un
   bouton d'action : c'est un passage, pas une décision.
   =========================================================================== */
.adm-raccourci{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand-hover);
               flex:none;display:inline-flex;align-items:center;gap:8px;
               min-height:48px;padding:0 14px;text-decoration:none;
               font-size:13.5px;font-weight:600;
               background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
               border-radius:var(--hol-r-sm)}
.adm-raccourci:hover{border-color:var(--hol-brand-clair);background:var(--hol-brand-wash)}
.adm-raccourci:focus-visible{outline:none;border-color:var(--hol-brand);
                             box-shadow:0 0 0 3px var(--hol-brand-wash)}
.adm-raccourci__n{font-family:var(--hol-police-mono),monospace;font-size:14px;
                  min-width:24px;height:24px;display:inline-flex;align-items:center;
                  justify-content:center;border-radius:var(--hol-r-pill);
                  background:var(--hol-brand-wash);color:var(--hol-brand)}
.adm-raccourci__fleche{font-size:15px;line-height:1}
@media (max-width:640px){
  .adm-raccourci{width:100%;justify-content:flex-start}
}

/* ===========================================================================
   LA LISTE DÉROULANTE DESSINÉE (.hol-liste)
   Le champ d'origine reste en place, masqué : c'est lui qui part dans le
   formulaire. Ce qui suit n'est que son apparence, posée par le script, et
   seulement quand il s'exécute : sans lui, la liste du système s'affiche et la
   règle « .hol-scope select » plus haut lui donne déjà le chevron du site.
   =========================================================================== */
.hol-liste{position:relative;flex:1 1 260px;min-width:0}
.hol-liste__natif{position:absolute;width:1px;height:1px;padding:0;margin:0;
                  overflow:hidden;clip-path:inset(50%);border:0}
.hol-liste__bouton{display:flex;align-items:center;gap:10px;width:100%;min-height:46px;
                   padding:0 13px;cursor:pointer;text-align:left;
                   font:inherit;font-size:15px;color:var(--hol-text-primary);
                   background:var(--hol-surface-1);
                   border:1px solid var(--hol-border-strong);border-radius:var(--hol-r-sm)}
.hol-liste__bouton:hover{border-color:var(--hol-brand-clair)}
.hol-liste__bouton:focus-visible{outline:none;border-color:var(--hol-brand);
                                 box-shadow:0 0 0 3px var(--hol-brand-wash)}
.hol-liste__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Le chevron est tracé en CSS : deux traits, pas une image. Il pivote à
   l'ouverture, ce qui dit où va le panneau. */
.hol-liste__chevron{flex:none;width:10px;height:10px;margin-right:2px;
                    border-right:2px solid var(--hol-text-secondary);
                    border-bottom:2px solid var(--hol-text-secondary);
                    transform:translateY(-2px) rotate(45deg);
                    transition:transform .18s ease}
.hol-liste.est-ouverte .hol-liste__chevron{transform:translateY(2px) rotate(-135deg)}
.hol-liste.est-ouverte .hol-liste__bouton{border-color:var(--hol-brand)}
/* LE PANNEAU N'EST PAS PRISONNIER DE LA LARGEUR DU BOUTON.
   Il était posé « left:0; right:0 », donc exactement aussi large que le champ
   fermé : un sélecteur étroit coupait ses propres entrées, et l'on lisait
   « HOLANGCOUR » sans le S. Jimmy : « tout le nom ne s'affiche pas, il peut y
   avoir des noms d'entreprises un peu longs, il ne faut pas couper. »

   « right:auto » SANS LARGEUR DÉCLARÉE : un bloc positionné en absolu se
   rétrécit alors sur son contenu, ce qui est exactement ce qu'on veut, et ce
   comportement existe depuis toujours. Pas de « max-content », que les Android
   anciens ignorent. « min-width:100% » garantit qu'il ne sera jamais plus
   étroit que le bouton, et le plafond de 380 l'empêche de traverser l'écran
   sur un libellé à rallonge.
   LE PANNEAU SE RESSERRE SUR SES LIBELLÉS (Jimmy) : calé sur toute la largeur
   d'un champ de 450 px, il laissait les mots à gauche et un grand vide à
   droite. Il ne descend plus sous 240 px et ne dépasse jamais le champ
   (le plafond de 380 a sauté : un titre de groupe doit tenir sur sa ligne).
   IL S'OUVRE SOUS LA FLÈCHE (Jimmy) : calé à droite du champ, là où l'on a
   cliqué, et non sous le début du libellé. */
.hol-liste__panneau{position:absolute;z-index:40;top:calc(100% + 6px);left:auto;right:0;
                    min-width:min(100%,240px);max-width:100%;
                    margin:0;padding:6px;list-style:none;max-height:min(320px,60vh);
                    overflow-y:auto;overscroll-behavior:contain;
                    background:var(--hol-surface-1);
                    border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-sm);
                    box-shadow:var(--hol-shadow-3)}
/* Ouvert vers le haut quand la place manque en dessous : voir placer() dans
   holangcours-liste.js. */
.hol-liste.est-en-haut .hol-liste__panneau{top:auto;bottom:calc(100% + 6px)}
/* ET SI UN LIBELLÉ DÉPASSE MÊME CE PLAFOND, il passe à la ligne au lieu d'être
   coupé : on perd un peu de hauteur, jamais la fin d'un mot. L'alignement part
   du haut, sans quoi la coche flotterait au milieu d'une entrée de deux
   lignes. */
.hol-liste__option{display:flex;align-items:flex-start;gap:14px;min-height:40px;
                   padding:9px 12px;
                   border-radius:var(--hol-r-sm);font-size:14.5px;line-height:1.35;
                   overflow-wrap:break-word;
                   color:var(--hol-text-primary);cursor:pointer;
                   transition:background-color .12s ease}
/* La ligne visée, au clavier comme à la souris : les deux posent la même
   marque, et l'on voit toujours celle qui part si l'on valide. */
.hol-liste__option.est-vise,
.hol-liste__option:hover{background:var(--hol-brand-wash)}
/* L'OPTION VISÉE AU CLAVIER SE DIT PAR SON FOND, défini juste au-dessus. Elle
   a porté un trait de couleur à gauche ; ce trait est banni partout sur le
   site, et il était de toute façon redondant avec le fond. */
.hol-liste__option[aria-selected="true"]{color:var(--hol-brand);font-weight:600}
/* LES TITRES DE GROUPE (<optgroup>) : petits, en capitales, ils ne se
   choisissent pas ; les options du groupe se décalent à peine dessous. */
/* LA DÉMARCATION SE VOIT (Jimmy) : un filet au-dessus de chaque groupe sauf
   le premier, le titre dans la couleur d'action sur un fond à peine teinté,
   et il reste collé en haut du panneau tant qu'on parcourt son groupe. */
.hol-liste__groupe{position:sticky;top:-6px;z-index:1;
                   margin:8px -6px 4px;padding:9px 18px 8px;
                   border-top:1px solid var(--hol-border-subtle);
                   border-bottom:1px solid var(--hol-border-subtle);
                   background:var(--hol-surface-0);
                   font-size:12px;font-weight:800;letter-spacing:.08em;
                   text-transform:uppercase;color:var(--hol-brand);cursor:default;
                   /* SUR UNE SEULE LIGNE (Jimmy) : le panneau s'élargit pour
                      le titre, jusqu'à la largeur du champ, jamais au-delà. */
                   white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hol-liste__groupe:first-child{margin-top:-6px;border-top:0}
.hol-liste__option--groupe{padding-left:12px}
/* L'entrée vide (« Choisir… ») n'est pas un choix : grisée, sans coche. */
.hol-liste__option--vide{color:var(--hol-text-muted)}
.hol-liste__option--vide[aria-selected="true"]{color:var(--hol-text-muted);font-weight:500}
.hol-liste__option.hol-liste__option--vide[aria-selected="true"]::after{opacity:0}
/* La coche marque le choix courant : la couleur seule ne se lit pas par tout
   le monde. Elle garde sa place quand elle est absente, sinon la liste danse. */
/* ELLE SE TIENT À DROITE (Jimmy) : à gauche, elle repoussait tous les
   libellés d'une colonne vide, décalés de leurs titres de groupe. Les mots
   partent maintenant du même bord que les titres. */
.hol-liste__option::after{content:"";flex:none;order:2;width:12px;height:7px;margin:4px 2px 0 auto;
                           border-left:2px solid var(--hol-brand);
                           border-bottom:2px solid var(--hol-brand);
                           transform:rotate(-45deg);opacity:0}
.hol-liste__option[aria-selected="true"]::after{opacity:1}
.hol-liste__option[aria-disabled="true"]{color:var(--hol-text-muted);cursor:not-allowed}
@media (prefers-reduced-motion:reduce){
  .hol-liste__chevron,.hol-liste__option{transition:none}
}

/* Le bouton d'aperçu : une porte, pas une action. Il se distingue du bouton
   d'enregistrement, qui est la seule décision de cet écran. */
.adm-apercu{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand-hover);
            display:inline-flex;align-items:center;gap:9px;min-height:52px;padding:0 20px;
            font-size:15px;font-weight:600;text-decoration:none;
            background:var(--hol-surface-1);border:1px solid var(--hol-border-strong);
            border-radius:var(--hol-r-sm)}
.adm-apercu:hover{border-color:var(--hol-brand);background:var(--hol-brand-wash)}
.adm-apercu:focus-visible{outline:none;border-color:var(--hol-brand);
                          box-shadow:0 0 0 3px var(--hol-brand-wash)}
.adm-apercu__oeil{flex:none;display:inline-flex}
.adm-apercu__oeil svg{width:19px;height:19px}

/* ===========================================================================
   LE BANDEAU D'APERÇU DU TEST (.test-apercu)
   Un écran d'essai qui ressemble trait pour trait à l'écran public se confond
   avec lui. Celui-ci porte le rouge d'identité, il colle sous l'en-tête, et il
   ne quitte pas l'écran : on ne peut pas oublier qu'on est en essai.
   =========================================================================== */
/* Sous l'en-tête ET sous le fil d'Ariane, qui sont collants tous les deux :
   calé sur la hauteur du seul en-tête, le bandeau se glissait derrière le fil
   et le teintait de rouge. « --hol-collant » est la hauteur des deux, mesurée
   par le script du pied de page. */
.test-apercu{position:sticky;top:var(--hol-collant,128px);z-index:50;
             background:var(--hol-accent);color:var(--hol-accent-encre,var(--hol-text-inverse))}
.test-apercu__rang{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
                   padding-top:10px;padding-bottom:10px}
.test-apercu__mot{font-family:var(--hol-police-mono),monospace;font-size:11px;letter-spacing:.14em;
                  text-transform:uppercase;padding:4px 10px;border-radius:var(--hol-r-pill);
                  background:var(--hol-glass-hi);flex:none}
.test-apercu__texte{font-size:14px;line-height:1.45;flex:1 1 320px;min-width:0}
.test-apercu__retour{--hol-lien:var(--hol-text-inverse);--hol-lien-survol:var(--hol-text-inverse);
                     flex:none;font-size:13.5px;font-weight:600;text-decoration:underline;
                     text-underline-offset:3px}

/* ===========================================================================
   LE FIL D'ARIANE DE L'ADMINISTRATION (.adm-fil)
   D'où l'on vient, et comment y retourner. Chaque étape est une pastille, pas
   un mot séparé par un point : on voit tout de suite où cliquer, et la page
   courante se distingue sans avoir à lire. Le chevron entre deux pastilles
   dit le sens de la descente ; il ne se sélectionne pas et ne se lit pas.
   =========================================================================== */
.adm-fil{background:var(--hol-surface-1);border-bottom:1px solid var(--hol-border-subtle)}
.adm-fil__piste{list-style:none;margin:0;display:flex;flex-wrap:wrap;align-items:center;
                gap:7px;padding-top:11px;padding-bottom:11px}
.adm-fil__piste li{display:flex;align-items:center;gap:7px;min-width:0}
/* Le chevron, tracé en CSS comme celui des listes : deux traits, pas un
   caractère, pour qu'il ne parte pas dans une sélection ni dans une lecture. */
.adm-fil__piste li + li::before{content:"";flex:none;width:6px;height:6px;
                                border-top:1.6px solid var(--hol-border-strong);
                                border-right:1.6px solid var(--hol-border-strong);
                                transform:rotate(45deg)}
.adm-fil__piste a,
.adm-fil__piste [aria-current]{display:inline-flex;align-items:center;min-height:32px;
                               padding:0 13px;border-radius:var(--hol-r-pill);
                               font-size:13px;font-weight:600;white-space:nowrap;
                               max-width:46vw;overflow:hidden;text-overflow:ellipsis}
.adm-fil__piste a{--hol-lien:var(--hol-text-secondary);--hol-lien-survol:var(--hol-brand);
                  text-decoration:none;background:var(--hol-surface-0);
                  border:1px solid var(--hol-border-subtle)}
.adm-fil__piste a:hover{border-color:var(--hol-brand-clair);background:var(--hol-brand-wash)}
.adm-fil__piste a:focus-visible{outline:none;border-color:var(--hol-brand);
                                box-shadow:0 0 0 3px var(--hol-brand-wash)}
.adm-fil__piste [aria-current]{color:var(--hol-brand);background:var(--hol-brand-wash);
                               border:1px solid var(--hol-brand-clair)}

/* ===========================================================================
   MÉDIATHÈQUE ET DÉPÔT (.med-*)
   Ces règles vivaient dans l'écran des réglages. La banque de questions s'en
   sert aussi : une question porte une image, un son ou une vidéo, et c'est le
   même geste. Une seule source, donc, pour les deux écrans.

   Le bouton sert aussi bien à un <button> qu'à un <a> : d'où la variable de
   couleur de lien, sans quoi « .hol-scope a » l'emporterait et le libellé
   changerait de teinte d'un bouton à l'autre.
   =========================================================================== */
.med-bouton{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand-hover);
            flex:none;display:inline-flex;align-items:center;justify-content:center;
            min-height:48px;padding:0 16px;cursor:pointer;font:inherit;
            font-size:14px;font-weight:600;white-space:nowrap;text-decoration:none;
            background:var(--hol-surface-1);color:var(--hol-brand);
            border:1px solid var(--hol-border-strong);border-radius:var(--hol-r-sm)}
.med-bouton:hover{border-color:var(--hol-brand);background:var(--hol-brand-wash)}
.med-bouton:focus-visible{outline:none;border-color:var(--hol-brand);
                          box-shadow:0 0 0 3px var(--hol-brand-wash)}
.med-apercu{margin-top:10px}
/* L'aperçu et sa croix : la croix se pose SUR le coin de l'image, là où l'œil
   la cherche, et non dans une barre d'outils à côté. */
.med-vue{position:relative;display:inline-block}
.med-apercu img,
.med-apercu video{max-height:88px;width:auto;border-radius:var(--hol-r-sm);
                  border:1px solid var(--hol-border-subtle);display:block;
                  background:var(--hol-surface-inverse)}
/* NI IMAGE NI VIDÉO : un fichier n'a pas toujours d'aperçu, un .vtt par
   exemple. On montre alors son nom, ce qui suffit à vérifier qu'on a bien
   désigné celui qu'on voulait. */
.med-nom{display:inline-block;max-width:34ch;overflow:hidden;text-overflow:ellipsis;
         white-space:nowrap;padding:8px 13px;border-radius:var(--hol-r-sm);
         border:1px solid var(--hol-border-subtle);background:var(--hol-surface-2,var(--hol-surface-0));
         font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:12px;
         color:var(--hol-text-secondary)}
.med-vider{position:absolute;top:-8px;right:-8px;display:grid;place-items:center;
           width:26px;height:26px;cursor:pointer;color:var(--hol-text-secondary);
           background:var(--hol-surface-1);border:1px solid var(--hol-border-strong);
           border-radius:var(--hol-r-pill);box-shadow:var(--hol-shadow-1);padding:0}
.med-vider:hover{color:var(--hol-erreur);border-color:var(--hol-erreur)}
.med-vider:focus-visible{outline:none;border-color:var(--hol-brand);
                         box-shadow:0 0 0 3px var(--hol-brand-wash)}
.med-apercu-ko{font-size:13px;color:var(--hol-erreur)}

/* ===========================================================================
   LA FENÊTRE DE LA MÉDIATHÈQUE (.med-boite)
   Elle vivait dans la feuille d'un seul écran : ouverte depuis la banque de
   questions, elle s'affichait sans un style, boutons gris et images pleine
   page. Elle est ici, et les deux écrans la servent pareil.

   UNE CARTE, PAS UN ÉCRAN. Elle garde ses marges autour, et le fond derrière
   reste visible : on sait qu'on choisit dans une page, pas qu'on a changé de
   lieu.

   LES CATÉGORIES SONT DES ONGLETS EN HAUT, et non une colonne à gauche : trois
   entrées ne valent pas un cinquième de la largeur, et ce sont les images
   qu'on vient voir. Les sous-dossiers n'apparaissent que si la catégorie
   ouverte en a.
   =========================================================================== */
.med-boite{width:min(860px,92vw);max-height:82vh;padding:0;border:0;
           border-radius:var(--hol-r-lg);background:var(--hol-surface-1);
           color:var(--hol-text-primary);box-shadow:var(--hol-shadow-3)}
.med-boite::backdrop{background:var(--hol-hero-scrim-a)}
/* L'EN-TÊTE PORTE LA MARQUE. Un titre nu et un bouton gris, c'était une boîte
   de dialogue de système ; le surtitre en mono, le fond de marque et la croix
   nommée en font un écran du site. */
.med-entete{display:flex;align-items:flex-start;gap:20px;padding:18px 22px;
            background:var(--hol-brand-wash);
            border-bottom:1px solid var(--hol-border-subtle)}
.med-entete__mots{min-width:0}
.med-sur{display:block;font-family:var(--hol-police-mono),monospace;font-size:10.5px;
         letter-spacing:.14em;text-transform:uppercase;color:var(--hol-brand);margin-bottom:6px}
.med-titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;font-size:19px;
           letter-spacing:-.01em;margin:0 0 5px}
.med-intro{font-size:13px;line-height:1.5;color:var(--hol-text-secondary);margin:0}
.med-fermer{margin-left:auto;flex:none;display:inline-flex;align-items:center;gap:9px;
            min-height:38px;padding:0 14px;cursor:pointer;font:inherit;
            font-size:13.5px;font-weight:600;background:var(--hol-surface-1);
            color:var(--hol-text-secondary);
            border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-pill)}
.med-fermer:hover{border-color:var(--hol-brand);color:var(--hol-brand)}
.med-fermer:focus-visible{outline:none;border-color:var(--hol-brand);
                          box-shadow:0 0 0 3px var(--hol-brand-wash)}
/* La croix est tracée, pas écrite : un caractère de croix se lit à voix haute
   et part dans une sélection. */
.med-croix{position:relative;width:11px;height:11px;flex:none}
.med-croix::before,.med-croix::after{content:"";position:absolute;top:50%;left:0;
                                     width:100%;height:1.8px;border-radius:2px;
                                     background:currentColor}
.med-croix::before{transform:rotate(45deg)}
.med-croix::after{transform:rotate(-45deg)}
/* Le défilement s'arrête au bord de la liste : il ne passe pas à la page. */
.med-corps{padding:16px 22px 22px;overflow-y:auto;overscroll-behavior:contain;
           max-height:calc(82vh - 108px)}
.med-etat{font-size:14px;color:var(--hol-text-muted);padding:18px 0;margin:0}
.med-reessayer{min-height:42px;padding:0 18px;cursor:pointer;font:inherit;font-weight:600;
               background:var(--hol-brand);color:var(--hol-text-inverse);border:0;
               border-radius:var(--hol-r-sm)}

.med-barre{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.med-onglets{display:flex;gap:6px;flex-wrap:wrap;flex:1 1 auto;min-width:0}
.med-onglet,.med-puce{display:inline-flex;align-items:center;gap:7px;cursor:pointer;font:inherit;
                      white-space:nowrap;border-radius:var(--hol-r-pill);
                      background:var(--hol-surface-0);color:var(--hol-text-secondary);
                      border:1px solid var(--hol-border-subtle)}
.med-onglet{min-height:36px;padding:0 14px;font-size:13.5px;font-weight:600}
.med-puce{min-height:30px;padding:0 11px;font-size:12.5px;font-weight:500}
.med-onglet:hover,.med-puce:hover{border-color:var(--hol-brand-clair);background:var(--hol-brand-wash)}
.med-onglet.est-actif,.med-puce.est-actif{background:var(--hol-brand);color:var(--hol-text-inverse);
                                          border-color:var(--hol-brand)}
.med-n{font-family:var(--hol-police-mono),monospace;font-size:11px;opacity:.75}
.med-sous{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
.med-sous[hidden]{display:none}
.med-recherche{flex:0 1 240px;min-width:0;min-height:36px;padding:0 13px;
               font:inherit;font-size:13.5px;background:var(--hol-surface-1);
               border:1px solid var(--hol-border-strong);border-radius:var(--hol-r-pill)}
.med-recherche:focus-visible{outline:none;border-color:var(--hol-brand);
                             box-shadow:0 0 0 3px var(--hol-brand-wash)}

/* DES CARRÉS, PAS DES AFFICHES. Au survol, la vignette grandit un peu dans
   son cadre : on voit mieux sans que la grille bouge. Le rapport est tenu par
   le remplissage proportionnel, « aspect-ratio » manquant aux Android anciens
   que ce site doit servir. */
.med-grille{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(124px,100%),1fr));gap:12px}
/* AU SURVOL, LA CARTE ENTIÈRE GRANDIT, et passe au-dessus de ses voisines.
   Agrandir l'image à l'intérieur de son cadre ne faisait que la recadrer de
   plus près : on voyait moins, pas mieux. Là, on voit la même image en plus
   grand, sans cliquer et sans que la grille bouge d'un pixel. */
.med-carte{display:block;position:relative;padding:0;cursor:pointer;text-align:left;
           overflow:hidden;background:var(--hol-surface-1);
           border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-sm);
           transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}
.med-carte:hover{transform:scale(1.14);z-index:3;border-color:var(--hol-brand);
                 box-shadow:var(--hol-shadow-3)}
.med-carte:focus-visible{outline:none;transform:scale(1.14);z-index:3;
                         border-color:var(--hol-brand);
                         box-shadow:0 0 0 3px var(--hol-brand-wash),var(--hol-shadow-3)}
.med-vignette{display:block;position:relative;padding-bottom:100%;
              background:var(--hol-surface-0);overflow:hidden}
.med-vignette img{position:absolute;top:0;right:0;bottom:0;left:0;
                  width:100%;height:100%;object-fit:cover;display:block}
.med-nom{display:block;font-size:11px;color:var(--hol-text-muted);padding:7px 9px;
         white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@media (prefers-reduced-motion:reduce){
  .med-carte,.med-carte:hover,.med-carte:focus-visible{transition:none;transform:none}
}

/* ===========================================================================
   LES NOTES D'UN ÉCRAN D'ADMINISTRATION (.adt-note) ET LA BULLE (.hol-bulle)
   Quatre lignes d'erreur en pleine largeur repoussaient le formulaire hors de
   l'écran, et c'est le formulaire qu'on vient corriger. Le résumé se fait donc
   petit et reste en place ; la bulle, elle, vient le dire une fois et s'en va.
   =========================================================================== */
/* ---------------------------------------------------------------------------
   LES CHAMPS DE L'ADMINISTRATION, PAR DÉFAUT

   Trois écrans les redéfinissaient chacun chez lui, à un ou deux pixels près,
   et le quatrième n'avait rien : ses champs tombaient aux dimensions du
   navigateur, au milieu de champs dessinés. Voici la définition commune. Les
   trois anciennes la couvrent encore chez elles, et c'est une duplication qui
   reste à retirer ; elle n'empêche rien, elle ne gagne rien non plus.

   « .hol-champs » EST LA MÊME CHOSE, HORS ADMINISTRATION. Les pages de
   l'apprenant ont les mêmes champs à remplir et ne sont pas derrière
   l'administration : elles posent cette classe sur le bloc qui contient le
   formulaire, et les champs se dessinent comme partout ailleurs. Sans elle, il
   aurait fallu recopier ces mesures une quatrième fois.
   ------------------------------------------------------------------------ */
/* ═══════════════════════════════════════════════════════════════════════════
   TOUS LES CHAMPS DE SAISIE DU SITE, D'UN SEUL ENDROIT

   POURQUOI UNE RÈGLE SUR LES ÉLÉMENTS ET NON SUR UNE CLASSE. Les champs du
   site ne portent pas tous la même classe : « .champ » dans l'administration,
   « .auth-champ » à l'entrée, et une dizaine de pages ont leur propre bloc
   avec leurs propres mesures, écrit avant que la classe commune existe.
   Demander à chacune de se mettre à jour, c'est accepter qu'une page sur deux
   reste en arrière ; et un formulaire qui change d'allure d'un écran à l'autre
   donne l'impression de deux sites cousus ensemble.

   ON NE TOUCHE QUE LA COULEUR. Les hauteurs, les creux et les rayons restent
   où ils sont, chez eux : ce sont des décisions prises écran par écran, et
   les reprendre d'ici casserait des gabarits validés. Ce bloc dit seulement
   « un champ est bleu clair, bordé de la marque, et il blanchit quand on y
   écrit ».

   LES CASES ET LES BOUTONS RADIO SONT DEHORS : ce ne sont pas des champs où
   l'on écrit, ils ont leur propre dessin, et le navigateur les peint avec
   « accent-color ». Les curseurs et les fichiers aussi.
   ═══════════════════════════════════════════════════════════════════════════ */
.hol-scope input[type="text"],.hol-scope input[type="email"],
.hol-scope input[type="password"],.hol-scope input[type="search"],
.hol-scope input[type="tel"],.hol-scope input[type="url"],
.hol-scope input[type="number"],.hol-scope input[type="date"],
.hol-scope input[type="time"],.hol-scope input[type="datetime-local"],
.hol-scope input:not([type]),.hol-scope textarea,.hol-scope select{
  background-color:var(--hol-champ-fond);
  border-color:var(--hol-champ-bord)}
/* LA CASE OÙ L'ON ÉCRIT À L'INSTANT EST LA SEULE ÉCLAIRÉE. « :focus » double
   « :focus-visible » pour les navigateurs qui ne connaissent que le premier ;
   sur un champ de texte, les deux disent la même chose. */
.hol-scope input[type="text"]:focus,.hol-scope input[type="email"]:focus,
.hol-scope input[type="password"]:focus,.hol-scope input[type="search"]:focus,
.hol-scope input[type="tel"]:focus,.hol-scope input[type="url"]:focus,
.hol-scope input[type="number"]:focus,.hol-scope input[type="date"]:focus,
.hol-scope input[type="time"]:focus,.hol-scope input[type="datetime-local"]:focus,
.hol-scope input:not([type]):focus,.hol-scope textarea:focus,.hol-scope select:focus{
  background-color:var(--hol-surface-1);
  border-color:var(--hol-brand)}
/* Le texte d'exemple tient 5,5:1 sur le fond bleuté ; « muted » n'en donnait
   que 4,4, juste sous le seuil. */
.hol-scope input::placeholder,.hol-scope textarea::placeholder{color:var(--hol-text-secondary)}

/* LE CHAMP PORTE LA COULEUR DE LA MAISON. Il était blanc sur blanc, bordé
   d'un gris qu'on ne voyait pas : sur une carte claire, la case où l'on écrit
   se cherchait. Fond bleu très clair, bordure de marque ; et au moment où l'on
   écrit dedans, le champ devient blanc et son trait passe à deux pixels de
   bleu plein. La case active est la seule éclairée, les autres restent en
   retrait. Mêmes valeurs qu'à l'entrée du site : un formulaire ne change pas
   d'allure selon la page. */
.adm-corps .champ,.hol-champs .champ{display:block;width:100%;min-height:46px;padding:11px 14px;font:inherit;
                  font-size:15px;color:var(--hol-text-primary);background:var(--hol-champ-fond);
                  border:1px solid var(--hol-champ-bord);border-radius:var(--hol-r-sm)}
/* Le texte d'exemple passe sur la nuance « secondary » : « muted » donnait
   4,4:1 sur le fond bleuté, juste sous le seuil. */
.adm-corps .champ::placeholder,.hol-champs .champ::placeholder{color:var(--hol-text-secondary)}
.adm-corps .champ:hover,.hol-champs .champ:hover{border-color:var(--hol-brand-doux)}
.adm-corps textarea.champ,.hol-champs textarea.champ{min-height:84px;resize:vertical;line-height:1.5}
.adm-corps .champ:focus-visible,.hol-champs .champ:focus-visible{outline:none;
                                background:var(--hol-surface-1);
                                border-color:var(--hol-brand);border-width:2px;
                                /* Le pixel de trait gagné est repris sur le
                                   creux : sans cela le texte sauterait au
                                   moment où l'on pose le curseur. */
                                padding:10px 13px;
                                box-shadow:0 0 0 3px var(--hol-brand-wash)}
.adm-corps .etiquette,.hol-champs .etiquette{display:block;font-size:14px;font-weight:600;margin:0 0 7px;
                  color:var(--hol-brand-doux)}
.adm-corps .aide,.hol-champs .aide{font-size:13px;line-height:1.5;color:var(--hol-text-muted);margin:7px 0 0}
.adm-corps .mono,.hol-champs .mono{font-family:var(--hol-police-mono),monospace}

/* L'ENTRÉE DE MENU DE L'ADMINISTRATION, par défaut. Deux écrans la
   redéfinissaient chez eux ; le troisième n'avait rien, et sa barre latérale
   tombait en liste de liens nus. */
.adm-corps .onglet{--hol-lien:var(--hol-text-secondary);--hol-lien-survol:var(--hol-brand);
                   display:flex;align-items:center;gap:10px;min-height:44px;padding:0 13px;
                   border-radius:var(--hol-r-sm);text-decoration:none;font-size:15px;
                   font-weight:500;color:var(--hol-text-secondary)}
.adm-corps .onglet:hover{background:var(--hol-surface-0)}
.adm-corps .onglet[aria-current]{--hol-lien:var(--hol-text-inverse);
                                 --hol-lien-survol:var(--hol-text-inverse);
                                 background:var(--hol-brand);color:var(--hol-text-inverse);
                                 font-weight:600}
.adm-corps .onglet[aria-current]:hover{background:var(--hol-brand)}

/* ---------------------------------------------------------------------------
   LE CADRAN DU TEST

   Un rond, une durée dedans, et rien d'autre. Le bandeau porte le chiffre ;
   le mode d'emploi tient dans l'infobulle. Une carte de texte à cet endroit
   pèserait plus lourd que ce qu'elle explique.

   L'anneau se remplit sur une heure, l'échelle d'un test de positionnement :
   on lit la durée sans lire le nombre, et un anneau presque plein est un
   avertissement avant même d'avoir compté.
   ------------------------------------------------------------------------ */
.adm-hero__rang{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.adm-hero__texte{flex:1 1 420px;min-width:0}
/* ---------------------------------------------------------------------------
   LA SIGNATURE DE DROITS

   Une ligne, en bas, dans la mono du site. Elle ne cherche pas le regard :
   on la lit quand on la cherche, et le reste du temps elle ne gêne personne.
   C'est pour cela qu'elle n'est pas un pied de page : l'espace de l'apprenant
   n'en veut pas, décision prise et tenue, et quatre colonnes de liens sous un
   écran de travail resteraient une distraction. Une mention légale n'en est
   pas une.

   DEUX FONDS, parce qu'elle paraît sur les deux : le clair des espaces, le
   sombre de la porte d'entrée.
   ------------------------------------------------------------------------ */
/* ═══ LE PIED DE PAGE RÉPOND AU SURVOL ══════════════════════════════════════
   Ses liens étaient habillés dans l'attribut « style », qui ne sait pas porter
   de « :hover » : quatre colonnes de liens ne réagissaient donc à rien quand on
   passait dessus. Demandé par Jimmy : « il faut que ça change de couleur ».

   PAS DE SOULIGNEMENT. Jimmy l'a refusé : « je n'aime pas le souligneur quand
   le curseur est dessus, il faut rendre plus stylé, plus institutionnel ». Le
   trait sous un lien de pied de page fait document administratif ; un pied de
   page haut de gamme s'éclaire, il ne se souligne pas.

   DEUX SIGNAUX, AUCUN TRAIT : l'encre monte du gris bleuté au blanc pur, ce
   qui est une vraie montée de luminosité et non une nuance voisine, et le mot
   avance de deux pixels. L'œil voit le second même quand il ne distingue pas
   le premier.

   AU CLAVIER, C'EST UN ANNEAU, pas un survol : « focus-visible » garde un
   contour franc, qui est le repère attendu et qui ne dépend ni de la couleur
   ni du mouvement. */
/* LA COULEUR D'UN LIEN NE SE POSE PAS AVEC « color », ELLE SE POSE AVEC LES
   JETONS. C'est la règle de ce fichier, et je l'avais oubliée sur ces trois
   classes : « .hol-scope a:hover » repeint tout lien survolé avec
   « --hol-lien-survol », et comme je n'avais rien redéfini, il y mettait le
   bleu de marque. Sur le bleu nuit du pied, un texte en bleu de marque ne se
   lit plus : c'est le bouton « Se connecter » devenu illisible au survol.
   En redéfinissant les deux jetons, le repos ET le survol sont tenus, et la
   règle générale travaille pour nous au lieu de contre nous. */
.hol-scope .hol-pied__lien{--hol-lien:var(--hol-text-inverse-2);
                           --hol-lien-survol:var(--hol-text-inverse);
                           display:inline-flex;align-items:center;min-height:40px;
                           font-size:14.5px;color:var(--hol-lien);
                           text-decoration:none;
                           transition:color .18s ease,transform .18s ease}
.hol-scope .hol-pied__lien--plat{min-height:0;font-size:14px}
.hol-scope .hol-pied__lien:hover{text-decoration:none;transform:translateX(2px)}
.hol-scope .hol-pied__lien--plat:hover{transform:none}
.hol-scope .hol-pied__lien:focus-visible{color:var(--hol-lien-survol);
                                         text-decoration:none;
                                         outline:2px solid var(--hol-focus-inverse);
                                         outline-offset:3px;border-radius:4px}
/* ═══ LES MARQUES EN COULEUR, SUR UNE PASTILLE BLANCHE ═════════════════════

   Choix de Jimmy, 4 octobre 2026 : la version la moins modifiée de chaque
   marque, donc la plus défendable. Chaque tracé porte son propre remplissage,
   écrit dans le SVG ; aucune règle d'ici ne touche à la couleur d'un glyphe, ni
   au repos ni au survol. Une marque déposée ne change pas de teinte parce qu'on
   passe la souris dessus.

   LA PASTILLE BLANCHE N'EST PAS UNE COQUETTERIE : les chartes demandent un fond
   clair ou neutre sous la version couleur, et sur notre bleu nuit le bleu
   Facebook, le bleu LinkedIn et le noir TikTok se perdraient. C'est aussi la
   seule partie que nous dessinons, donc la seule qui a le droit de réagir : au
   survol, elle se soulève et prend un halo. Le logo, lui, ne bouge pas. */
/* LA RANGÉE DU HAUT DU PIED DE PAGE : la marque à gauche, « nous suivre » à
   droite. Elle vit ici et non dans l'attribut « style » du gabarit, parce
   qu'un style en ligne bat n'importe quelle règle de média : sur un téléphone,
   on veut tout recentrer, et c'était impossible tant que la valeur était
   écrite dans la page. Et elle est posée AVANT le bloc téléphone, car à
   spécificité égale c'est la dernière règle qui gagne. */
.hol-scope .hol-pied__haut{display:flex;align-items:center;
                           justify-content:space-between;gap:24px;flex-wrap:wrap}

/* « NOUS SUIVRE » ET SES CINQ PASTILLES S'ALIGNENT À DROITE, en face de la
   marque qui tient le bord gauche. C'est le dessin de l'accueil, et il ne
   bouge pas sur un grand écran.

   MAIS IL EST ÉCRIT ICI, PAS DANS L'ATTRIBUT « style ». Posé en ligne, il
   battait la règle qui recentre tout sur téléphone : le mot se centrait, parce
   qu'on l'avait forcé, et les cinq icônes restaient collées au bord droit.
   Jimmy, capture à l'appui : « les icônes doivent aussi être centrées pour que
   ça donne une belle allure ». Comme les deux règles au-dessous, il est posé
   AVANT le palier téléphone : à spécificité égale, c'est la dernière règle qui
   gagne. */
.hol-scope .hol-pied__suivre__mot{text-align:right}
.hol-scope .hol-pied__reseaux{display:flex;gap:8px;justify-content:flex-end;
                              flex-wrap:wrap}

/* LE RETRAIT DE 12,8 PIXELS compense le vide transparent que le fichier du
   logo porte à sa gauche : 127 pixels à l'échelle 64/634. Sans lui, la marque
   et sa baseline paraissent rentrées par rapport au reste du pied. Il est en
   feuille et non dans l'attribut « style » pour qu'on puisse l'annuler sur un
   téléphone, où tout se centre et où il décalerait la marque. */
.hol-scope .hol-pied__nous{margin-left:-12.8px}

.hol-scope .hol-pied__reseau{width:44px;height:44px;border-radius:var(--hol-r-pill);
                             background:var(--hol-surface-1);border:0;
                             display:inline-flex;align-items:center;justify-content:center;
                             text-decoration:none;
                             box-shadow:0 0 0 0 rgba(255,255,255,0);
                             transition:transform .15s ease,box-shadow .15s ease}
.hol-scope .hol-pied__reseau svg{display:block}
.hol-scope .hol-pied__reseau:hover,
.hol-scope .hol-pied__reseau:focus-visible{transform:translateY(-2px);
                                           box-shadow:0 0 0 3px rgba(255,255,255,.22);
                                           text-decoration:none}
.hol-scope .hol-pied__reseau:focus-visible{outline:2px solid var(--hol-focus-inverse);
                                           outline-offset:3px}
.hol-scope .hol-pied__pilule{--hol-lien:var(--hol-text-inverse);
                             --hol-lien-survol:var(--hol-text-inverse);
                             display:inline-flex;align-items:center;min-height:46px;
                             padding:0 22px;border:1px solid var(--hol-border-on-dark);
                             border-radius:var(--hol-r-pill);color:var(--hol-lien);
                             font-size:14.5px;font-weight:600;text-decoration:none;
                             transition:border-color .15s ease,background-color .15s ease}
.hol-scope .hol-pied__pilule:hover,
.hol-scope .hol-pied__pilule:focus-visible{border-color:var(--hol-text-inverse);
                                           background:var(--hol-verre-fond);
                                           text-decoration:none}
@media (prefers-reduced-motion:reduce){
  .hol-scope .hol-pied__lien,.hol-scope .hol-pied__reseau,
  .hol-scope .hol-pied__pilule{transition:none}
  /* Qui demande moins de mouvement garde la montée de l'encre, qui suffit. */
  .hol-scope .hol-pied__lien:hover{transform:none}
}

.hol-droits{margin:0;font-family:var(--hol-police-mono),monospace;font-size:11px;
            line-height:1.6;letter-spacing:.04em;color:var(--hol-text-muted)}
.hol-droits--sombre{color:var(--hol-text-inverse-muted)}
/* LE LIEN VERS LA LICENCE SUIT LA LIGNE, il ne la double pas : une seconde
   ligne sous la mention de droits ferait un pied de page, et c'est ce qu'on
   refuse depuis le début dans les écrans de travail. Il se souligne pour qu'on
   voie que c'en est un, et il garde la couleur de la ligne : une tache bleue
   en bas de page attirerait l'œil pour rien. */
/* LA SPÉCIFICITÉ EST DANS LE SÉLECTEUR, ET IL LA FAUT. « .hol-scope a » pose
   « text-decoration:none » sur tous les liens du site et pèse plus lourd
   qu'une classe seule : le soulignement écrit ici ne s'appliquait pas, et ces
   liens ne se distinguaient plus que par leur couleur. Or la couleur seule ne
   suffit jamais à dire « ceci est un lien » : qui ne distingue pas les teintes
   ne voit plus rien à cliquer. */
.hol-scope .hol-droits__lien{color:var(--hol-lien,var(--hol-brand));
                  text-decoration:underline;text-underline-offset:3px;
                  white-space:nowrap}
/* LE POINT DE SÉPARATION porte les marges, pas les liens : posées sur chaque
   lien, elles s'ajoutaient à celles du point et la ligne devenait lâche. */
.hol-droits__pt{margin:0 4px;opacity:.55}
/* « GÉRER LES COOKIES » PREND LA FORME D'UN BOUTON, et c'est juste : ses
   voisins sont des liens, ils emmènent ailleurs ; lui n'emmène nulle part, il
   rouvre le bandeau sur la page où l'on est. Souligné comme eux, il promettait
   un départ qui n'arrive jamais.

   UN BLEU PÂLE, PAS L'APLAT DE MARQUE. Le bleu plein est réservé aux actions
   qu'on vient faire ; celle-ci se trouve quand on la cherche, une fois par an,
   et un aplat de marque en bas de page attirerait l'œil pour rien. Le voile de
   la maison, un filet, et l'encre de marque : il se voit, il ne crie pas.

   IL SUIT CHAQUE MAISON tout seul, puisque les trois valeurs sont des jetons :
   chez EUDUC, le voile de son bleu nuit ; chez nous, celui de notre bleu. */
/* LE FILET VIENT DES JETONS DU CHAMP, PAS DU VOILE DE MARQUE. Le voile donnait
   1,8 contre notre fond et 2,2 contre un crème de locataire, là où il en faut
   3 pour qu'on reconnaisse un objet avec lequel on interagit : la pastille
   existait, mais elle ne se voyait pas. « champ-bord » est la seule nuance du
   site qui ait été mesurée pour tenir sur n'importe quelle surface de
   locataire, et c'est précisément son travail. */
/* QUATRE BOUTONS SUR UNE LIGNE ONT BESOIN DE RESPIRER : collés, ils se lisent
   comme un seul objet. L'écart vertical les sépare aussi quand la ligne se
   replie sur un téléphone. Et la hauteur minimale est celle d'une cible qu'un
   pouce atteint. */
.hol-droits__bouton{display:inline-flex;align-items:center;margin:3px 3px 3px 0;
                    min-height:28px;
                    padding:4px 12px;border-radius:var(--hol-r-pill);
                    background:var(--hol-champ-fond);
                    border:1px solid var(--hol-champ-bord);
                    color:var(--hol-brand);font:inherit;font-weight:600;
                    text-decoration:none;cursor:pointer;
                    transition:background-color .15s ease,border-color .15s ease,color .15s ease}
@media (prefers-reduced-motion:reduce){.hol-droits__bouton{transition:none}}
.hol-droits__bouton:hover{background:var(--hol-surface-1);
                          border-color:var(--hol-brand)}
/* L'encre reste celle de la marque, qui tient 13:1 sur ce fond ; seule la
   nuance « texte » du locataire pourrait être claire, et elle ne sert pas
   ici. */
.hol-droits__bouton:focus-visible{outline:2px solid var(--hol-brand);outline-offset:2px}
/* Sur fond sombre, le voile de marque disparaîtrait : le bouton reprend le
   verre du site, qui est fait pour cela. */
/* LE FILET DES PASTILLES, MESURÉ. « verre-bord » vaut un blanc à 24 %, soit
   environ 2:1 une fois composé sur le bleu nuit du pied : la pastille existait
   sans vraiment se voir, et c'est ce que Jimmy appelait un bouton peu lisible.
   À 40 %, le filet passe au-dessus des 3:1 que demande la limite d'un objet
   avec lequel on interagit. Le texte, lui, est blanc pur : 15:1. */
.hol-droits--sombre .hol-droits__bouton{--hol-lien:var(--hol-text-inverse);
                                        --hol-lien-survol:var(--hol-text-inverse);
                                        background:var(--hol-verre-fond);
                                        border-color:rgba(255,255,255,.40);
                                        color:var(--hol-lien)}
.hol-droits--sombre .hol-droits__bouton:hover{background:var(--hol-verre-fond-vif);
                                              border-color:var(--hol-verre-bord-vif)}
/* Le point qui le précède n'a plus lieu d'être : un bouton se distingue par sa
   forme, et le point le collerait à son voisin. */
.hol-droits__pt--avant-bouton{display:none}
.hol-droits__lien:hover{color:var(--hol-brand)}
.hol-droits--sombre .hol-droits__lien:hover{color:var(--hol-text-inverse)}
/* LE SOULIGNEMENT NE S'APPLIQUE PAS À UN BOUTON, même quand il est écrit sur
   un « a » : la forme dit déjà qu'on peut cliquer, et un trait sous une
   pastille la salit. Le sélecteur porte la même spécificité que celui qui
   soulignait les anciens liens, sans quoi il ne gagnerait pas. */
.hol-scope .hol-droits__bouton{text-decoration:none}
.hol-scope .hol-droits__bouton:hover{text-decoration:none}
.hol-droits--bloc{padding:26px var(--hol-gutter) 30px;text-align:center}
/* Sur un fond clair, le bloc se détache par un filet du haut, jamais par un
   fond : un bandeau gris en bas de page ferait un pied de page, qu'on ne veut
   justement pas. Le filet est horizontal ; aucun filet vertical de couleur
   n'entre dans ce site. */
.hol-droits--bloc{border-top:1px solid var(--hol-border-subtle);margin-top:40px}
.hol-droits--sombre.hol-droits--bloc{border-top-color:var(--hol-border-on-dark)}
@media (max-width:600px){
  .hol-droits--bloc{padding:22px var(--hol-gutter) 26px;font-size:10.5px}
}

/* « flex:none » PROTÈGE LE BLOC DE DROITE D'ÊTRE ÉCRASÉ, et c'est voulu : un
   cadran ou une jauge rétrécis ne se lisent plus. Mais « flex:none » le
   dispense AUSSI de tenir dans la place disponible, et sur un téléphone de
   320 pixels un encart de 380 sortait de l'écran, emportant toute la page dans
   un défilement latéral. Le plafond ci-dessous ne coûte rien sur grand écran,
   où la place ne manque pas, et il tient la promesse du brief : zéro
   défilement horizontal, à toutes les largeurs. */
.adm-hero__cote{flex:none;margin-left:auto;max-width:100%}

/* LA JAUGE : sept barres et un anneau. Le nombre dit combien, les barres
   disent depuis quand. Trois demandes dans la semaine et trois demandes hier
   ne se traitent pas de la même façon. */
.adm-jauge{display:flex;align-items:flex-end;gap:14px}
.adm-jauge__barres{display:flex;align-items:flex-end;gap:4px;height:52px;margin-bottom:10px}
.adm-jauge__barre{width:7px;border-radius:3px;background:var(--hol-brand);opacity:.55;
                  transition:opacity .2s ease}
/* Un jour sans rien reste visible : une semaine trouée se lit, une semaine
   raccourcie ment. */
.adm-jauge__barre--vide{background:var(--hol-border-strong);opacity:.6}
.adm-jauge:hover .adm-jauge__barre{opacity:.85}
/* LÀ OÙ L'ON EST. Sans ce repère, onze barres se valent et l'on cherche la
   sienne ; avec lui, on lit sa hauteur avant de lire les autres. */
.adm-jauge__barre--ici{opacity:1;background:var(--hol-brand)}
.adm-jauge__barre--ici.adm-jauge__barre--vide{background:var(--hol-accent);opacity:1}

.adm-cadran{position:relative;width:96px;height:96px;flex:none}
.adm-cadran svg{width:100%;height:100%;display:block;transform:rotate(-90deg)}
.adm-cadran__piste{fill:none;stroke:var(--hol-border-subtle);stroke-width:7}
.adm-cadran__arc{fill:none;stroke:var(--hol-brand);stroke-width:7;stroke-linecap:round;
                 transition:stroke-dashoffset .25s ease}
/* IL RESTE QUELQUE CHOSE À FAIRE. Le rouge de marque le signale, et jamais
   seul : le mot sous le nombre le dit aussi, et l'infobulle en toutes lettres.
   Qui ne distingue pas les couleurs lit la même information. */
.adm-cadran--attention .adm-cadran__arc{stroke:var(--hol-accent)}
.adm-cadran--attention .adm-cadran__n{color:var(--hol-accent-texte)}
/* Le chiffre est au centre, et c'est la seule chose qu'on vient y lire. */
.adm-cadran__val{position:absolute;top:0;left:0;right:0;bottom:0;
                 display:flex;flex-direction:column;align-items:center;justify-content:center;
                 line-height:1}
.adm-cadran__n{font-size:26px;font-weight:700;color:var(--hol-text-primary);
               font-variant-numeric:tabular-nums}
.adm-cadran__u{font-family:var(--hol-police-mono),monospace;font-size:10px;letter-spacing:.1em;
               text-transform:uppercase;color:var(--hol-text-muted);margin-top:3px}
@media (max-width:700px){
  .adm-hero__cote{margin-left:0}
  .adm-cadran{width:78px;height:78px}
  .adm-cadran__n{font-size:21px}
  /* Le mot suit l'anneau qui rétrécit : à 10 px, « À valider » touchait le cercle. */
  .adm-cadran__u{font-size:8.5px;letter-spacing:.06em}
}

/* ---------------------------------------------------------------------------
   UN BLOC D'ADMINISTRATION QUI SE REPLIE

   Quatre longues listes sur un écran, c'est trois listes de trop quand on
   travaille sur la quatrième. Le titre devient une poignée : on replie ce dont
   on n'a pas besoin, et ce rangement tient jusqu'à la fin de la session.
   ------------------------------------------------------------------------ */
.adm-section{margin:0 0 28px}
.adm-section__tete{display:flex;align-items:center;gap:12px;cursor:pointer;list-style:none;
                   padding:8px 0;border-radius:var(--hol-r-sm)}
.adm-section__tete::-webkit-details-marker{display:none}
.adm-section__tete:focus-visible{outline:none;box-shadow:0 0 0 3px var(--hol-brand-wash)}
.adm-section__titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;font-size:22px;
                    line-height:1.2}
.adm-section--mince .adm-section__titre{font-family:var(--hol-police-mono),monospace;font-size:11px;
                    font-weight:600;letter-spacing:.12em;text-transform:uppercase;
                    color:var(--hol-text-muted)}
.adm-section__chevron{flex:none;width:10px;height:10px;
                      border-right:2px solid var(--hol-text-muted);
                      border-bottom:2px solid var(--hol-text-muted);
                      transform:rotate(-45deg);transition:transform .15s ease}
.adm-section[open] > .adm-section__tete .adm-section__chevron{transform:rotate(45deg)}
.adm-section__tete .adm-pastille{background:var(--hol-brand);flex:none}

/* ---------------------------------------------------------------------------
   LA BASE D'EDDY, LIGNE À LIGNE

   Ce qui est livré avec le site et ce qu'on lui a appris tiennent la même
   liste, dans l'ordre où il les regarde. Une ligne dit son sujet, combien de
   façons de poser la question elle couvre, d'où elle vient, et ce qu'on peut
   en faire.
   ------------------------------------------------------------------------ */
.ade-ligne{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
           padding:11px 15px;border-radius:var(--hol-r-sm);
           background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle)}
/* Une entrée qui n'existe que parce qu'on l'a écrite se repère au premier
   coup d'œil : c'est le travail fait, et c'est ce qu'on vient voir. */
.ade-ligne--mienne{border-color:var(--hol-brand-clair, var(--hol-border-strong));
                   background:var(--hol-brand-wash)}
.ade-cle{flex:none;font-size:13px;font-weight:600;color:var(--hol-brand)}
.ade-compte{flex:1 1 160px;min-width:0;font-size:13px;color:var(--hol-text-muted)}
.ade-vide{flex:1 1 220px;font-size:12.5px;line-height:1.45;color:var(--hol-text-muted)}
.ade-agir{flex:none;font:inherit;font-size:13px;text-decoration:none;cursor:pointer;
          background:transparent;border:0;padding:0;color:var(--hol-brand)}
.ade-agir--ko{color:var(--hol-erreur)}

/* La liste de travail : une question par ligne, ce qu'on peut en faire au
   bout. Les réglées gardent la même forme, en plus sourd. */
.ade-sans{display:flex;gap:14px;align-items:center;flex-wrap:wrap;
          padding:11px 22px;border-bottom:1px solid var(--hol-border-subtle)}
.ade-sans:last-child{border-bottom:0}
.ade-sans__q{flex:1 1 240px;min-width:0;font-size:15px;line-height:1.5}
.ade-sans__date{flex:none;font-size:11.5px;color:var(--hol-text-muted)}
/* Les trois actions restent ensemble : éparpillées, la dernière tombait
   seule à la ligne et l'on ne savait plus à quelle question elle se
   rapportait. */
.ade-sans__actions{flex:none;display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.ade-sans--classee .ade-sans__q{color:var(--hol-text-muted)}
.ade-agir--doux{color:var(--hol-text-muted)}

/* LE BANC D'ESSAI. Il rend la réponse telle qu'un visiteur la verrait, puis
   dit POURQUOI : le sujet reconnu, et ceux qui s'en sont approchés avec leur
   écart. Sans le pourquoi, on corrige à l'aveugle. */
.ade-essai__saisie{display:flex;gap:12px;flex-wrap:wrap;align-items:center}
.ade-essai__ok{flex:none;min-height:46px;padding:0 20px;cursor:pointer;font:inherit;
               font-size:15px;font-weight:600;color:var(--hol-text-inverse);
               background:var(--hol-brand);border:0;border-radius:var(--hol-r-sm)}
.ade-essai__ok[disabled]{opacity:.5;cursor:default}
/* La réponse se montre dans une bulle, pour qu'on la lise comme on la lira. */
.ade-essai__bulle{font-size:15px;line-height:1.6;padding:14px 16px;
                  border-radius:var(--hol-r-sm);border-bottom-left-radius:5px;
                  background:var(--hol-brand-wash);
                  border:1px solid var(--hol-brand-clair, var(--hol-border-subtle))}
.ade-essai__verdict{font-size:14px;line-height:1.55;margin:12px 0 0;color:var(--hol-text-secondary)}
.ade-essai__verdict--sur{color:var(--hol-succes)}
.ade-essai__verdict--proche{color:var(--hol-alerte)}
.ade-essai__verdict--inconnu{color:var(--hol-text-muted)}
.ade-essai__titre{font-family:var(--hol-police-mono),monospace;font-size:10.5px;letter-spacing:.12em;
                  text-transform:uppercase;color:var(--hol-text-muted);margin:18px 0 8px}
.ade-essai__ligne{display:flex;gap:12px;align-items:center;padding:7px 0;
                  border-top:1px solid var(--hol-border-subtle)}
.ade-essai__score{flex:1 1 auto;font-family:var(--hol-police-mono),monospace;font-size:12.5px;
                  color:var(--hol-text-muted);font-variant-numeric:tabular-nums}
.ade-essai__etat{font-size:13px;color:var(--hol-text-muted);margin:14px 0 0}

/* La liste de la banque garde toujours de quoi descendre : sans cela, passer
   d'une compétence pleine à une compétence vide renvoyait l'écran en haut. */
.adt-banque{min-height:calc(100vh - var(--hol-collant, 170px))}
.adt-note{display:flex;align-items:flex-start;gap:11px;margin:0 0 16px;
          padding:11px 14px;border-radius:var(--hol-r-sm);font-size:14px;line-height:1.5}
.adt-note--ok{background:var(--hol-succes-wash);border:1px solid var(--hol-succes-border);
              color:var(--hol-succes);font-weight:500}
.adt-note--ko{background:var(--hol-accent-wash);border:1px solid var(--hol-accent-border);
              color:var(--hol-erreur)}
.adt-note__signe{flex:none;display:grid;place-items:center;width:20px;height:20px;margin-top:1px;
                 border-radius:var(--hol-r-pill);background:var(--hol-erreur);
                 color:var(--hol-text-inverse);
                 font-family:var(--hol-police-mono),monospace;font-size:12px;font-weight:700}
.adt-note__titre{display:block;font-size:14px;font-weight:600;margin-bottom:2px}
/* LA RELECTURE DU SITE PREVALOG (Domain/Relecture, partial relecture.php) :
   un signe et un libellé par ligne, jamais la couleur seule. */
.rel{margin:0 0 16px}
.rel-ok,.rel-titre{display:flex;align-items:center;gap:9px;margin:0 0 8px;font-size:14px;font-weight:600}
.rel-signe{flex:none;display:grid;place-items:center;width:20px;height:20px;border-radius:var(--hol-r-pill);
           color:var(--hol-text-inverse);font-family:var(--hol-police-mono),monospace;font-size:12px;font-weight:700}
.rel-signe--ok{background:var(--hol-succes)}
.rel-signe--ko{background:var(--hol-erreur)}
.rel-signe--alerte{background:var(--hol-alerte)}
.rel-liste{list-style:none;margin:0 0 12px;padding:0}
.rel-liste li{padding:9px 0;border-bottom:1px solid var(--hol-border-subtle);font-size:14px;line-height:1.5}
.rel-liste li:last-child{border-bottom:0}
.rel-champ{display:block;font-size:13px;color:var(--hol-text-muted)}
.rel-extrait{display:block;margin-top:4px;font-family:var(--hol-police-mono),monospace;font-size:13px;
             white-space:pre-wrap;overflow-wrap:anywhere;color:var(--hol-text-secondary)}
.adt-note__liste{margin:0;padding-left:18px;font-size:13.5px;line-height:1.55}

/* LES ACTIONS DE SECOND RANG SE VOIENT SANS SE CRIER. Un mot souligné au
   bas de la page ressemblait à une note de bas de page, pas à un bouton.
   Ce sont maintenant des boutons en retrait : contour fin, texte sourd, un
   signe qui redit le mot. Ils ne prennent ni le bleu, qui appartient à
   l'action principale de l'écran, ni le rouge, qui n'est jamais une action
   chez nous. Quitter le test et le refaire partagent ce même habillage :
   ni l'un ni l'autre n'est ce qu'on attend de la personne, mais les deux
   doivent se trouver du premier coup d'œil. */
.hol-doux{display:inline-flex;align-items:center;gap:9px;
           min-height:46px;padding:0 19px 0 16px;cursor:pointer;
           font:inherit;font-size:14.5px;font-weight:500;text-decoration:none;
           color:var(--hol-text-muted);background:transparent;
           border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-pill);
           transition:color .15s ease,border-color .15s ease,background .15s ease}
.hol-doux:hover{color:var(--hol-text-primary);background:var(--hol-surface-1);
                 border-color:var(--hol-border-strong)}
.hol-doux:focus-visible{outline:none;border-color:var(--hol-brand);
                         box-shadow:0 0 0 3px var(--hol-brand-wash)}
.hol-doux svg{flex:none;opacity:.8}
/* `display` écrit sur l'élément bat le « caché » du navigateur. */
.hol-doux[hidden]{display:none}

/* ---------------------------------------------------------------------------
   L'APERÇU D'UNE QUESTION, ET LA LISTE QUI SE DÉPLIE

   Régler une question dans un formulaire, c'est régler à l'aveugle. Le
   panneau de droite montre le rendu pendant qu'on écrit ; chaque ligne de la
   liste s'ouvre sur le sien. Le rendu lui-même vient de la feuille du test,
   pas d'ici : on n'habille que le cadre.
   ------------------------------------------------------------------------ */

/* Le panneau suit le regard : il reste sous la barre pendant qu'on descend
   dans le formulaire, sinon il quitte l'écran au moment précis où l'on écrit
   les réponses. Trop haut pour l'écran, il défile en lui-même. */
.adt-apercu-carte{position:sticky;top:calc(var(--hol-collant, 170px) + 16px);z-index:1;
                  margin-bottom:18px;border-radius:var(--hol-r-lg);
                  background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
                  box-shadow:var(--hol-shadow-1);overflow:auto;
                  max-height:calc(100vh - var(--hol-collant, 170px) - 44px)}
.adt-apercu-tete{padding:14px 20px 12px;border-bottom:1px solid var(--hol-border-subtle);
                 background:var(--hol-surface-0)}
.adt-apercu-mot{display:block;font-family:var(--hol-police-mono),monospace;font-size:11px;
                letter-spacing:.12em;text-transform:uppercase;color:var(--hol-brand)}
.adt-apercu-aide{display:block;font-size:13px;line-height:1.5;color:var(--hol-text-muted);
                 margin-top:5px}
.adt-vue{padding:22px 20px}

/* LA LIGNE QUI S'OUVRE. Le triangle du navigateur change de dessin d'un
   système à l'autre : on le retire et on pose le nôtre, le même chevron que
   partout ailleurs sur le site. */
.adt-ligne{position:relative;padding:0}
.adt-ligne__tete{display:flex;gap:12px;align-items:flex-start;cursor:pointer;
                 padding:16px 18px;padding-right:180px;list-style:none;
                 border-radius:var(--hol-r-lg)}
.adt-ligne__tete::-webkit-details-marker{display:none}
.adt-ligne__tete:hover{background:var(--hol-surface-0)}
.adt-ligne__tete:focus-visible{outline:none;box-shadow:0 0 0 3px var(--hol-brand-wash)}
.adt-ligne__chevron{flex:none;width:10px;height:10px;margin-top:6px;
                    border-right:2px solid var(--hol-text-muted);
                    border-bottom:2px solid var(--hol-text-muted);
                    transform:rotate(-45deg);transition:transform .15s ease}
.adt-ligne[open] .adt-ligne__chevron{transform:rotate(45deg)}
.adt-ligne__niveau{flex:none;font-size:12px;font-weight:600;color:var(--hol-brand);
                   background:var(--hol-brand-wash);border:1px solid var(--hol-border-subtle);
                   padding:4px 9px;border-radius:6px}
.adt-ligne__texte{flex:1 1 auto;min-width:0}
.adt-ligne__enonce{display:block;font-size:15px;line-height:1.45;margin-bottom:6px}
.adt-ligne__meta{display:block;font-size:11px;color:var(--hol-text-muted)}

/* Modifier et Supprimer sont posés par-dessus la ligne d'en-tête : dans le
   résumé, un clic sur l'un d'eux aurait aussi ouvert le pli. */
.adt-ligne__actions{position:absolute;top:16px;right:18px;
                    display:flex;gap:10px;align-items:center}
.adt-ligne__agir{font:inherit;font-size:13.5px;text-decoration:none;cursor:pointer;
                 background:transparent;border:0;padding:0;color:var(--hol-brand)}
.adt-ligne__agir--ko{color:var(--hol-erreur)}
.adt-ligne > .adt-vue{border-top:1px solid var(--hol-border-subtle);
                      background:var(--hol-surface-0);
                      border-radius:0 0 var(--hol-r-lg) var(--hol-r-lg)}

/* Sur un écran étroit, les deux actions ne tiennent plus à côté du texte :
   elles redescendent sous l'en-tête plutôt que de le recouvrir. */
@media (max-width:680px){
  .adt-ligne__tete{padding-right:18px}
  .adt-ligne__actions{position:static;padding:0 18px 14px;justify-content:flex-end}
  .adt-apercu-carte{position:static;max-height:none}
}

/* LA BULLE. En haut à droite, sous les barres collantes, elle ne recouvre rien
   de ce qu'on est en train de lire. Elle s'efface au bout de huit secondes, ou
   au clic : une alerte qui reste indéfiniment devient du décor. */
.hol-bulle{position:fixed;z-index:70;top:calc(var(--hol-collant, 180px) + 16px);right:20px;
           display:flex;align-items:flex-start;gap:12px;width:min(380px,calc(100vw - 40px));
           padding:14px 15px;border-radius:var(--hol-r-lg);
           background:var(--hol-surface-1);border:1px solid var(--hol-accent-border);
           box-shadow:var(--hol-shadow-3);
           transition:opacity .25s ease,transform .25s ease}
.hol-bulle[hidden]{display:none}
.hol-bulle.est-partie{opacity:0;transform:translateY(-8px);pointer-events:none}
.hol-bulle__signe{flex:none;display:grid;place-items:center;width:24px;height:24px;
                  border-radius:var(--hol-r-pill);background:var(--hol-erreur);
                  color:var(--hol-text-inverse);
                  font-family:var(--hol-police-mono),monospace;font-size:13px;font-weight:700}
.hol-bulle__mots{flex:1;min-width:0;font-size:13.5px;line-height:1.5;color:var(--hol-text-primary)}
.hol-bulle__mots strong{display:block;font-size:14px;color:var(--hol-erreur);margin-bottom:3px}
.hol-bulle__fermer{flex:none;display:grid;place-items:center;width:28px;height:28px;cursor:pointer;
                   background:none;border:0;color:var(--hol-text-muted);border-radius:var(--hol-r-sm)}
.hol-bulle__fermer:hover{color:var(--hol-text-primary);background:var(--hol-surface-0)}
@media (prefers-reduced-motion:reduce){.hol-bulle{transition:none}}

/* ===========================================================================
   L'AUDIENCE DU SITE

   Des comptes, dessinés. Chaque barre porte son nombre au survol : le dessin
   donne la forme, les mots donnent le chiffre, et rien ne repose sur la seule
   couleur.
   ======================================================================== */
.ana-periode{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 22px}
.ana-periode__mot{font-family:var(--hol-police-mono),monospace;font-size:10.5px;letter-spacing:.12em;
                  text-transform:uppercase;color:var(--hol-text-muted)}
.ana-depuis{font-size:12.5px;color:var(--hol-text-muted);margin-left:auto}

/* LES QUATRE NOMBRES, à la même taille : aucun n'est plus vrai qu'un autre. */
.ana-nombres{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr));
             gap:14px;margin:0 0 22px}
.ana-nombre{padding:18px 20px;border-radius:var(--hol-r-lg);background:var(--hol-surface-1);
            border:1px solid var(--hol-border-subtle)}
.ana-nombre__n{display:block;font-size:30px;font-weight:700;line-height:1;
               color:var(--hol-brand);font-variant-numeric:tabular-nums}
.ana-nombre__mot{display:block;font-size:13px;color:var(--hol-text-muted);margin-top:7px}

.ana-titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;font-size:17px;
           margin:0 0 16px}

/* JOUR PAR JOUR. Les vues en fond, les visites par-dessus : on lit du premier
   coup si une journée a fait venir du monde ou si quelques personnes ont
   beaucoup lu. */
.ana-courbe{display:flex;align-items:flex-end;gap:3px;height:140px}
.ana-courbe__col{position:relative;flex:1 1 0;min-width:3px;height:100%;
                 display:flex;align-items:flex-end}
.ana-courbe__vues{position:absolute;left:0;right:0;bottom:0;border-radius:3px 3px 0 0;
                  background:var(--hol-brand);opacity:.28}
.ana-courbe__visites{position:absolute;left:0;right:0;bottom:0;border-radius:3px 3px 0 0;
                     background:var(--hol-brand)}
.ana-courbe__col:hover .ana-courbe__vues{opacity:.45}

.ana-legende{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
             font-size:12px;color:var(--hol-text-muted);margin:12px 0 0}
.ana-cle{display:inline-block;width:11px;height:11px;border-radius:3px;background:var(--hol-brand)}
.ana-cle--vues{opacity:.28}
.ana-cle--visites{margin-left:10px}

.ana-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(360px,100%),1fr));gap:18px}

/* UN CLASSEMENT. Le nom, la barre, les vues, les visites. La barre se compare
   à la première ligne : c'est une part, pas une mesure absolue. */
.ana-rang{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
.ana-rang__ligne{display:flex;align-items:center;gap:12px}
.ana-rang__nom{flex:0 0 34%;min-width:0;font-size:13.5px;overflow:hidden;
               text-overflow:ellipsis;white-space:nowrap}
.ana-rang__piste{flex:1 1 auto;height:9px;border-radius:5px;background:var(--hol-surface-0);
                 border:1px solid var(--hol-border-subtle);overflow:hidden}
.ana-rang__part{display:block;height:100%;background:var(--hol-brand);border-radius:5px}
.ana-rang__n{flex:none;min-width:34px;text-align:right;font-family:var(--hol-police-mono),monospace;
             font-size:12.5px;font-variant-numeric:tabular-nums}
.ana-rang__n--doux{color:var(--hol-text-muted)}

.ana-rien{font-size:14px;line-height:1.6;color:var(--hol-text-muted);margin:0}
/* CE QU'ON NE SAIT PAS SE DIT. Un classement amputé présenté sans le dire est
   un chiffre faux. */
.ana-note{font-size:12.5px;line-height:1.5;color:var(--hol-alerte);margin:12px 0 0}

/* LA DISPOSITION DE L'AUDIENCE : la barre latérale et la vue.

   ELLE SE PLIE SOUS NEUF CENTS PIXELS, et ce n'était pas le cas : écrite en
   ligne dans la page, elle ne pouvait pas porter de point de rupture. Sur un
   téléphone, la barre gardait ses deux cent soixante pixels et la vue tombait
   à quatorze : les classements débordaient, la courbe aussi, et la feuille du
   rapport ne pouvait plus être mise à l'échelle faute de place à mesurer. */
.ana-grille{display:grid;grid-template-columns:260px minmax(0,1fr);
            gap:28px;align-items:start}

/* LA BARRE LATÉRALE DE L'AUDIENCE : une question par entrée, la réponse à
   droite. Tout empiler donnerait une page qu'on parcourt sans rien lire. */
.ana-nav{display:flex;flex-direction:column;gap:4px;background:var(--hol-surface-1);
         border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-lg);padding:10px}

@media (max-width:900px){
  /* Une colonne, et la barre devient une rangée d'onglets qui défile du doigt :
     huit entrées empilées repousseraient les chiffres hors de l'écran. */
  .ana-grille{grid-template-columns:minmax(0,1fr);gap:16px}
  .ana-nav{flex-direction:row;flex-wrap:nowrap;overflow-x:auto;padding:8px;
           gap:6px;-webkit-overflow-scrolling:touch}
  .ana-nav .onglet{flex:0 0 auto;white-space:nowrap}
  .ana-depuis{margin-left:0;flex:1 1 100%}
}
.ana-vue{min-height:calc(100vh - var(--hol-collant, 170px))}

/* LA COURBE. Tracée à la main : aucune bibliothèque à charger sur une
   connexion lente, et l'on peut relire ce qu'on dessine. */
.adm-courbe-cadre{position:relative}
.adm-courbe-svg{display:block;width:100%;height:230px}
.adm-courbe__grille{stroke:var(--hol-border-subtle);stroke-width:1}
.adm-courbe__grad{fill:var(--hol-text-muted);font-family:var(--hol-police-mono),monospace;font-size:13px}
.adm-courbe__aire{fill:var(--hol-brand);opacity:.10}
.adm-courbe__trait{fill:none;stroke:var(--hol-brand);stroke-width:2.5;
                   stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}
/* La seconde série reste un trait : deux aires superposées sont illisibles. */
.adm-courbe__trait--doux{stroke:var(--hol-accent);stroke-width:2;stroke-dasharray:5 4}
.adm-courbe__dates{display:flex;justify-content:space-between;
                   font-family:var(--hol-police-mono),monospace;font-size:11.5px;
                   color:var(--hol-text-muted);padding:0 4px 0 44px}
/* Des zones transparentes, une par jour, pour que chaque point ait son
   infobulle sans alourdir le tracé. */
.adm-courbe__sondes{position:absolute;top:0;left:4.4%;right:0.8%;height:230px;display:flex}
.adm-courbe__sonde{flex:1 1 0}
.adm-courbe__sonde:hover{background:var(--hol-brand-wash);opacity:.5}

.ana-heures{display:flex;align-items:flex-end;gap:3px;height:92px}
.ana-heures--grand{height:180px;gap:5px}
.ana-heures__axe{display:flex;justify-content:space-between;margin-top:10px;
                 font-family:var(--hol-police-mono),monospace;font-size:11.5px;color:var(--hol-text-muted)}
.ana-heures__col{flex:1 1 0;height:100%;display:flex;align-items:flex-end}
.ana-heures__barre{width:100%;border-radius:3px 3px 0 0;background:var(--hol-brand);opacity:.65}
.ana-heures__col:hover .ana-heures__barre{opacity:1}

/* LE SURVOL DE LA COURBE. Un trait au jour visé, une étiquette qui donne la
   date et chaque série avec sa couleur. Sans lui, on voit qu'il s'est passé
   quelque chose le 16, sans pouvoir dire quoi. */
.adm-courbe-cadre{cursor:crosshair}
.adm-courbe__viseur{position:absolute;top:0;width:1px;height:230px;
                    background:var(--hol-border-strong);pointer-events:none}
.adm-courbe__viseur[hidden]{display:none}
.adm-courbe__bulle{position:absolute;top:8px;z-index:3;pointer-events:none;
                   min-width:150px;padding:10px 12px;border-radius:var(--hol-r-sm);
                   background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
                   box-shadow:var(--hol-shadow-2);font-size:12.5px}
.adm-courbe__bulle[hidden]{display:none}
.adm-courbe__bulle-jour{display:block;font-weight:600;margin-bottom:6px}
.adm-courbe__bulle-ligne{display:flex;align-items:center;gap:8px;margin-top:3px}
.adm-courbe__bulle-cle{flex:none;width:10px;height:3px;border-radius:2px;background:var(--hol-brand)}
.adm-courbe__bulle-cle.est-doux{background:var(--hol-accent)}
.adm-courbe__bulle-nom{flex:1 1 auto;color:var(--hol-text-muted)}
.adm-courbe__bulle-n{font-family:var(--hol-police-mono),monospace;font-weight:600;
                     font-variant-numeric:tabular-nums}

/* LA LÉGENDE DIT LA VÉRITÉ DU TRACÉ. Elle annonçait deux carrés de la même
   couleur pour une ligne bleue et une ligne rouge : on cherchait laquelle
   était laquelle. */
.ana-cle{display:inline-block;width:14px;height:3px;border-radius:2px;background:var(--hol-brand)}
.ana-cle--vues{opacity:1}
.ana-cle--visites{margin-left:14px;background:var(--hol-accent)}

/* LE DRAPEAU ET LA PASTILLE. Un tableau de codes à deux lettres se lit mot à
   mot ; avec un drapeau et un nom entier, il se parcourt. */
.ana-drapeau{flex:none;font-size:17px;line-height:1;width:22px}
.ana-favicon{flex:none;display:inline-flex;align-items:center;justify-content:center;
             position:relative;width:20px;height:20px;border-radius:5px;
             font-size:11px;font-weight:700;overflow:hidden}
.ana-favicon__img{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;
                  background:var(--hol-surface-1)}
/* L'icône que nous servons nous-mêmes est une image, pas une lettre habillée :
   elle n'a ni fond de couleur ni centrage à faire. */
.ana-favicon--img{display:block;object-fit:contain;background:transparent}

/* ---------------------------------------------------------------------------
   LES CARTES DE MESURE, À LA MANIÈRE DE LA MAISON

   La barre de couleur à gauche se voit sur la moitié des tableaux de bord du
   monde. Ici on reprend le vocabulaire du site : le surtitre en capitales
   espacées, le chiffre en Bricolage, et le fil de la période tracé dans la
   carte. Le point de couleur, lui, rattache la carte à sa ligne sur la courbe.

   Ce sont des interrupteurs : on choisit ce qu'on compare. Éteinte, la carte
   garde son total et perd ses couleurs.
   ------------------------------------------------------------------------ */
.ana-carte{position:relative;display:block;width:100%;text-align:left;cursor:pointer;
           font:inherit;overflow:hidden;
           padding:15px 18px 0;border-radius:var(--hol-r-lg);
           background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
           transition:border-color .15s ease,box-shadow .15s ease}
.ana-carte:hover{border-color:var(--hol-border-strong);box-shadow:var(--hol-shadow-1)}
.ana-carte:focus-visible{outline:none;box-shadow:0 0 0 3px var(--hol-brand-wash)}

.ana-carte__tete{display:flex;align-items:center;gap:7px;margin-bottom:9px}
.ana-carte__point{flex:none;width:8px;height:8px;border-radius:50%;background:var(--hol-border-strong)}
.ana-carte__mot{font-family:var(--hol-police-mono),monospace;font-size:10px;letter-spacing:.13em;
                text-transform:uppercase;color:var(--hol-text-muted)}
.ana-carte__n{display:block;font-family:var(--hol-police-titre),sans-serif;font-weight:700;
              font-size:clamp(26px,3.4vw,34px);line-height:1;letter-spacing:-.02em;
              color:var(--hol-text-primary);font-variant-numeric:tabular-nums;
              /* « 1 337 » est un nombre, pas deux mots : il ne se coupe pas
                 sur l'espace des milliers quand la carte est étroite. */
              white-space:nowrap}
/* Le fil touche le bas de la carte : c'est le socle du chiffre, pas une
   vignette posée à côté. */
.ana-carte__fil{display:block;width:100%;height:30px;margin:12px -18px -1px;
                padding:0 18px;box-sizing:content-box}
.ana-carte__fil polyline{fill:none;stroke:var(--hol-border-strong);stroke-width:1.6;
                         stroke-linejoin:round;stroke-linecap:round;
                         vector-effect:non-scaling-stroke}

.ana-carte--brand .ana-carte__point{background:var(--hol-brand)}
.ana-carte--accent .ana-carte__point{background:var(--hol-accent)}
.ana-carte--succes .ana-carte__point{background:var(--hol-succes)}
.ana-carte--alerte .ana-carte__point{background:var(--hol-alerte)}
.ana-carte--brand  .ana-carte__fil polyline{stroke:var(--hol-brand)}
.ana-carte--accent .ana-carte__fil polyline{stroke:var(--hol-accent)}
.ana-carte--succes .ana-carte__fil polyline{stroke:var(--hol-succes)}
.ana-carte--alerte .ana-carte__fil polyline{stroke:var(--hol-alerte)}
.ana-carte--brand[aria-pressed="true"]{border-color:var(--hol-brand-clair,var(--hol-brand))}
.ana-carte[aria-pressed="true"]{background:var(--hol-surface-1)}

/* ÉTEINTE : le total reste lisible, la couleur s'en va. On ne cache pas une
   mesure parce qu'on a cessé de la comparer. */
.ana-carte[aria-pressed="false"] .ana-carte__point{background:var(--hol-border-strong)}
.ana-carte[aria-pressed="false"] .ana-carte__fil polyline{stroke:var(--hol-border-strong);opacity:.7}
.ana-carte[aria-pressed="false"] .ana-carte__n{color:var(--hol-text-muted)}

.adm-courbe__trait--brand{stroke:var(--hol-brand)}
.adm-courbe__trait--accent{stroke:var(--hol-accent)}
.adm-courbe__trait--succes{stroke:var(--hol-succes)}
.adm-courbe__trait--alerte{stroke:var(--hol-alerte)}
.adm-courbe__trait[hidden]{display:none}
.adm-courbe__bulle-cle.est-brand{background:var(--hol-brand)}
.adm-courbe__bulle-cle.est-accent{background:var(--hol-accent)}
.adm-courbe__bulle-cle.est-succes{background:var(--hol-succes)}
.adm-courbe__bulle-cle.est-alerte{background:var(--hol-alerte)}
/* ===========================================================================
   LE RAPPORT D'AUDIENCE (.ana-rapport)

   Un document, pas un écran. Montrer son site à quelqu'un ne devrait pas
   demander sept captures recollées : cette vue rassemble l'essentiel, avec le
   logo de la maison en tête, et s'imprime telle quelle.

   LES FEUILLES SONT EN MILLIMÈTRES. Une A4 moins ses marges fait 182 sur 269 ;
   les boîtes font exactement cela, à l'écran comme sur le papier, parce qu'un
   millimètre veut dire la même chose des deux côtés. Ce qui tient dans la boîte
   à l'écran tient dans la page à l'impression, et l'aperçu ne ment pas.

   LE DÉCOUPAGE EST FAIT PAR LE SCRIPT (holangcours-rapport.js), qui pose
   « est-paginee ». Sans lui, les feuilles n'ont pas de hauteur imposée, rien
   n'est coupé, et il n'y a pas de numéro de page : un numéro faux serait pire
   que pas de numéro.
   =========================================================================== */
.ana-rapport{background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
             border-radius:var(--hol-r-lg);padding:clamp(22px,4vw,38px)}

/* Une fois paginé, ce ne sont plus des cartes mais des feuilles : le cadre
   extérieur s'efface, chaque feuille devient le papier. */
/* Centré quand la place y est, défilant quand elle manque. Un conteneur en
   « flex » centré couperait le bord gauche de la feuille dès qu'elle dépasse,
   et ce bord-là deviendrait inatteignable ; une marge automatique, non. */
.ana-rapport.est-paginee{background:transparent;border:0;padding:0;
                         display:block;overflow-x:auto;padding-bottom:4px}
.ana-rapport.est-paginee .ana-feuille{zoom:var(--zoom,1);margin:0 auto 22px;width:210mm;height:296mm;
                                      display:flex;flex-direction:column;
                                      padding:0;background:var(--hol-surface-1);
                                      border:1px solid var(--hol-border-subtle);
                                      border-radius:3px;box-shadow:var(--hol-shadow-1)}
/* LE FORMAT COUCHÉ, c'est la même feuille tournée d'un quart de tour : rien
   d'autre ne change, et le script range simplement les blocs dans des boîtes
   plus larges et moins hautes. Il en faut souvent une de plus, et le pied dit
   « 1 sur 3 » au lieu de « 1 sur 2 », parce qu'il compte au lieu de supposer. */
.ana-rapport.est-paginee.est-paysage .ana-feuille{width:296mm;height:210mm}

.ana-rapport.est-paginee .ana-feuille__corps{flex:1 1 auto;min-height:0;
                                             overflow:hidden;padding:14mm 14mm 0}
/* La courbe est mesurée en millimètres comme le reste : en pixels, elle ne
   ferait pas la même hauteur à l'écran et sur le papier. */
.ana-rapport.est-paginee .adm-courbe-svg{height:52mm}
.ana-rapport.est-paginee.est-paysage .adm-courbe-svg{height:38mm}
/* L'ÉCART ENTRE BLOCS EST UN « GAP », PAS UNE MARGE, et c'est une question de
   mesure, pas de goût : la marge basse du dernier bloc n'entre pas dans la
   hauteur que le script lit, et une feuille se croyait pleine à vingt-six
   pixels près. Un gap ne traîne rien derrière le dernier élément. */
.ana-feuille__corps{display:flex;flex-direction:column;gap:26px}
.ana-feuille__corps > *{flex:0 0 auto}
/* Un bloc plus haut qu'une feuille entière ne peut aller nulle part : on le
   laisse déborder plutôt que de le couper. Perdre une donnée est pire qu'un
   numéro de page approximatif, et avec des listes bornées à huit lignes, le
   cas ne se présente pas. */
.ana-feuille__corps.deborde{overflow:visible}
.ana-rapport.est-paginee .ana-feuille__pied{margin:0 14mm 10mm}

.ana-feuille__pied{display:flex;flex-wrap:wrap;align-items:baseline;
                   justify-content:space-between;gap:6px 16px;margin-top:22px;
                   padding-top:10px;border-top:1px solid var(--hol-border-subtle);
                   font-family:var(--hol-police-mono),monospace;font-size:10.5px;
                   letter-spacing:.14em;text-transform:uppercase;
                   color:var(--hol-text-muted)}
.ana-feuille__n{font-weight:600;color:var(--hol-text-secondary)}

/* LA TÊTIÈRE */
.ana-rapport__tete{padding-bottom:16px;margin-bottom:0;
                   border-bottom:2px solid var(--hol-brand)}
.ana-rapport__haut{display:flex;flex-wrap:wrap;align-items:center;
                   justify-content:space-between;gap:10px 20px;margin-bottom:14px}
.ana-rapport__logo{height:34px;width:auto;flex:0 0 auto}
.ana-rapport__titre{font-family:var(--hol-police-titre),sans-serif;font-weight:800;
                    font-size:clamp(22px,3.4vw,30px);line-height:1.1;margin:0;
                    color:var(--hol-text-primary);text-wrap:balance}
.ana-rapport__quand{font-family:var(--hol-police-mono),monospace;font-size:12px;
                    letter-spacing:.04em;color:var(--hol-text-muted);margin:0;
                    text-align:right}
/* La date d'édition passe à la ligne quand la place manque : la période et
   elle sont deux informations, pas une phrase. */
.ana-rapport__edite{display:block;color:var(--hol-text-muted)}

/* LA TÊTE DES FEUILLES SUIVANTES : de quoi reconnaître une page détachée du
   reste, sans lui reprendre la place des tableaux. */
.ana-rapport__suite{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;
                    padding-bottom:12px;margin-bottom:0;
                    border-bottom:1px solid var(--hol-border-subtle)}
.ana-rapport__logo--petit{height:22px}
.ana-rapport__suite-mot{font-family:var(--hol-police-titre),sans-serif;font-weight:700;
                        font-size:15px;color:var(--hol-text-primary)}
.ana-rapport__suite-quand{margin-left:auto;font-family:var(--hol-police-mono),monospace;
                          font-size:11.5px;letter-spacing:.04em;
                          color:var(--hol-text-muted)}

.ana-rapport__nombres{display:grid;gap:12px;margin-bottom:0;
                      grid-template-columns:repeat(4,minmax(0,1fr))}
.ana-rapport__bloc{margin:0}
.ana-rapport__duo{display:grid;gap:26px 32px;margin-bottom:0;
                  grid-template-columns:repeat(2,minmax(0,1fr))}
.ana-rapport__duo .ana-rapport__bloc{margin-bottom:0}

/* LA LÉGENDE DE LA COURBE. Sur l'écran, les cartes sont des interrupteurs et
   leur couleur suffit ; sur une feuille on ne clique sur rien, et quatre lignes
   sans légende sont quatre lignes anonymes. Le trait porte la couleur exacte de
   sa courbe, et le total qui va avec. */
.ana-legende{display:flex;flex-wrap:wrap;gap:6px 22px;list-style:none;
             margin:14px 0 0;padding:0}
.ana-legende__item{display:flex;align-items:center;gap:7px;font-size:12px;
                   color:var(--hol-text-secondary)}
.ana-legende__trait{display:block;width:16px;height:3px;border-radius:2px;
                    background:var(--hol-brand);flex:0 0 auto}
.ana-legende__trait--brand{background:var(--hol-brand)}
.ana-legende__trait--accent{background:var(--hol-accent)}
.ana-legende__trait--succes{background:var(--hol-succes)}
.ana-legende__trait--alerte{background:var(--hol-alerte)}
.ana-legende__n{font-family:var(--hol-police-mono),monospace;font-size:11.5px;
                font-weight:600;color:var(--hol-text-primary);
                font-variant-numeric:tabular-nums;white-space:nowrap}

/* Un deuxième titre dans un même bloc respire, sans aller chercher une marge
   écrite dans la page. */
.ana-titre--suite{margin-top:20px}

/* LA MÉTHODE. Elle tient toute la largeur de la feuille, jusqu'à la marge, et
   elle est justifiée : un paragraphe en drapeau au milieu d'un document de
   chiffres a l'air d'une note oubliée. La coupure des mots est demandée, faute
   de quoi le français justifié creuse des rivières blanches entre les mots. */
.ana-rapport__methode{margin:0}
.ana-rapport__methode p{margin:0;font-size:11.5px;line-height:1.65;
                        color:var(--hol-text-muted);
                        text-align:justify;text-justify:inter-word;
                        hyphens:auto;-webkit-hyphens:auto}

/* La part sans pays connu est une note de lecture, pas une alerte : dans un
   document qu'on présente, le rouge dirait qu'il y a un problème. */
.ana-rapport .ana-note{color:var(--hol-text-muted)}

/* Dans le rapport, les quatre nombres ne sont plus des interrupteurs : ce sont
   des chiffres imprimés. Même dessin, sans le curseur ni le survol. */
.ana-rapport .ana-carte{cursor:default}
.ana-rapport .ana-carte:hover{border-color:var(--hol-border-subtle);box-shadow:none}

/* LA BARRE D'ACTION, COLLÉE EN HAUT ET RANGÉE À DROITE. Un rapport de dix
   feuilles dont le bouton d'impression est à la fin se parcourt deux fois : une
   pour lire, une pour redescendre. Elle suit le défilement, et le fond opaque
   l'empêche de se confondre avec le papier qui passe dessous. */
.ana-barre{position:sticky;top:6px;z-index:20;
           display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;
           gap:8px 14px;margin-bottom:16px;padding:8px 10px;
           background:var(--hol-surface-0);border:1px solid var(--hol-border-subtle);
           border-radius:var(--hol-r-sm);box-shadow:var(--hol-shadow-1)}
.ana-barre__format{display:none;align-items:center;gap:6px;margin-right:auto}
/* Le choix du format ne sert à rien sans le script qui redécoupe les feuilles :
   il n'apparaît qu'une fois la mise en pages faite. */
.ana-rapport.est-paginee .ana-barre__format{display:flex}
.ana-barre__mot{font-family:var(--hol-police-mono),monospace;font-size:11px;
                letter-spacing:.14em;text-transform:uppercase;
                color:var(--hol-text-muted);margin-right:2px}
.ana-barre .onglet[aria-pressed="true"]{background:var(--hol-brand);
                                        border-color:var(--hol-brand);
                                        color:var(--hol-text-inverse)}
.ana-barre__agir{flex:none}

.ana-rapport__aide{font-size:12.5px;line-height:1.5;margin:16px 0 0;
                   color:var(--hol-text-muted)}

/* Sur un écran étroit, la feuille garde sa taille de feuille : la réduire
   mentirait sur ce qui s'imprimera. Elle défile dans son propre cadre, et la
   page, elle, ne défile pas de travers. */
@media (max-width:900px){
  .ana-rapport:not(.est-paginee) .ana-rapport__nombres{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ana-rapport:not(.est-paginee) .ana-rapport__duo{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:600px){
  .ana-rapport:not(.est-paginee) .ana-rapport__nombres{grid-template-columns:minmax(0,1fr)}
}

/* ===========================================================================
   LE RAPPORT À L'IMPRESSION

   Le navigateur sait fabriquer un PDF ; lui demander suffit, et cela évite
   d'embarquer une bibliothèque de deux cents kilo-octets pour refaire moins
   bien ce qu'il fait déjà.

   TOUT CE QUI N'EST PAS LE DOCUMENT DISPARAÎT : barre d'administration, fil
   d'Ariane, onglets, jauge, fenêtre de lecture, barre latérale, et le bouton
   d'impression lui-même, qui n'a rien à faire sur la feuille.

   LES COULEURS SONT GARDÉES. Les points et les courbes portent le sens : un
   rapport imprimé en gris sur gris ne distingue plus les visites des vues.
   =========================================================================== */
@media print{
  .adm-haut,.adm-barre,.adm-fil,.adm-onglets,.adm-hero,.adm-jauge,
  .ana-periode,.ana-nav,.ana-barre,.ana-rapport__aide{display:none !important}

  html,body{background:#fff !important}
  body.adm-corps main{padding:0 !important}
  .adm-corps .grille{display:block !important}

  /* LA FEUILLE NE CHANGE PAS : elle fait déjà une A4 entière, marges
     comprises, et c'est pourquoi la page imprimée n'a aucune marge à elle
     (voir @page). Ce qui est à l'écran est au millimètre ce qui sort de
     l'imprimante. Seuls le cadre, l'ombre et l'écart entre feuilles, qui
     n'existaient que pour montrer du papier sur un écran, s'en vont. */
  .ana-rapport{border:0 !important;border-radius:0 !important;padding:0 !important;
               background:#fff !important}
  .ana-rapport.est-paginee{display:block;overflow:visible;padding-bottom:0}
  .ana-rapport.est-paginee .ana-feuille{zoom:1;margin:0;border:0;border-radius:0;
                                        box-shadow:none;background:#fff}

  /* LE SAUT DE PAGE EST ÉCRIT, pas espéré : c'est ce qui rend le « page 2 sur
     3 » exact. La dernière feuille n'en déclenche pas, sinon le document se
     termine par une page blanche. */
  .ana-feuille{break-after:page;page-break-after:always}
  .ana-feuille:last-of-type{break-after:auto;page-break-after:auto}

  .ana-carte{break-inside:avoid;page-break-inside:avoid}
  .adm-courbe__viseur,.adm-courbe__bulle{display:none !important}

  /* UNE LIGNE À MOITIÉ TRACÉE NE S'IMPRIME PAS. L'animation du tracé dure une
     seconde ; si l'on demande le PDF pendant ce temps, la courbe partirait sur
     le papier avec la moitié de son chemin. Ici, elle est toujours entière. */
  .adm-courbe__trait{stroke-dasharray:none !important;stroke-dashoffset:0 !important;
                     transition:none !important}

  /* Un titre seul en bas de page, sa table à la page suivante : on évite. */
  .ana-titre{break-after:avoid;page-break-after:avoid}
  .ana-rapport__bloc,.ana-rapport__duo,.ana-rapport__methode{break-inside:avoid;
                                                             page-break-inside:avoid}

  /* Sans cela, le navigateur retire les fonds pour économiser l'encre, et les
     pastilles de couleur, qui sont la légende, deviennent blanches. */
  *{-webkit-print-color-adjust:exact;print-color-adjust:exact}
}

/* LE FORMAT EST FIXÉ, pas laissé au réglage du jour. Les feuilles sont bâties
   pour une A4 debout ; imprimées couchées, elles ne tomberaient plus en face.
   Le navigateur grise alors le choix de l'orientation, et c'est voulu.

   LA PAGE N'A PAS DE MARGE, parce que la feuille porte les siennes : quatorze
   millimètres de rembourrage à l'intérieur. Deux marges l'une sur l'autre
   rétréciraient le document d'un coup. */
/* Sans script, c'est le portrait : le format du document tel qu'il est bâti.
   Avec lui, cette règle est remplacée au moment du choix. */
@page{size:A4 portrait;margin:0}

/* ===========================================================================
   L'ATELIER DES COURS, DANS L'ADMINISTRATION (.adc-*)

   Déposer un cours n'est pas une activité de visiteur : c'est le travail de la
   maison. L'atelier vivait dans une page publique avec son propre en-tête et
   sa propre feuille de style en ligne ; il est maintenant derrière la même
   porte et sous la même barre d'onglets que le reste de l'administration, et
   il emprunte ses champs, ses cartes et ses boutons.
   =========================================================================== */
.adc-titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;font-size:19px;
           margin:0 0 18px}

/* LA LISTE DES COURS. Une fiche par cours, cliquable en entier : viser un lien
   de deux mots au doigt est un exercice, viser une carte ne l'est pas. */
.adc-liste{display:flex;flex-direction:column;gap:12px;margin-bottom:30px}
.adc-fiche{display:block;padding:18px 20px;text-decoration:none;color:inherit}
.adc-fiche:hover{border-color:var(--hol-border-strong);box-shadow:var(--hol-shadow-1)}
.adc-fiche__tete{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.adc-fiche__langue{font-family:var(--hol-police-mono),monospace;font-size:11px;letter-spacing:.08em;
                   text-transform:uppercase;color:var(--hol-text-muted)}
.adc-fiche__titre{display:block;font-family:var(--hol-police-titre),sans-serif;font-weight:700;
                  font-size:18px;margin-bottom:6px;color:var(--hol-text-primary)}
.adc-fiche__detail{display:block;font-size:13.5px;color:var(--hol-text-muted)}

/* L'ÉTAT EST UN MOT, PAS UNE COULEUR. La teinte aide celui qui la voit ; le
   libellé sert tout le monde, y compris à l'impression en noir. */
.adc-etat{display:inline-flex;align-items:center;padding:3px 10px;
          border-radius:var(--hol-r-pill);font-family:var(--hol-police-mono),monospace;
          font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase}

.adc-grille{display:grid;gap:16px;
            grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr))}
.adc-grille__large{grid-column:1/-1}

/* Le plan d'un cours : la structure à gauche, la publication à droite, et la
   colonne de droite suit le défilement tant qu'il y a la place pour deux. */
.adc-plan{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:26px;align-items:start}
.adc-cote{position:sticky;top:var(--hol-collant,150px);display:flex;flex-direction:column;
          gap:16px;min-width:0}
.adc-cote__mot{font-family:var(--hol-police-mono),monospace;font-size:11px;letter-spacing:.1em;
               text-transform:uppercase;color:var(--hol-text-muted);margin-bottom:12px}
.adc-compte{margin:0;font-family:var(--hol-police-mono),monospace;font-size:11.5px;
            color:var(--hol-text-muted)}
.adc-renvoi{margin:12px 0 0;padding:12px 14px;font-size:13.5px;line-height:1.5;
            border-radius:var(--hol-r-sm);background:var(--hol-accent-wash);
            border:1px solid var(--hol-accent-border);color:var(--hol-erreur)}

.adc-mod{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.adc-mod__rang{font-family:var(--hol-police-mono),monospace;font-size:10.5px;letter-spacing:.08em;
               text-transform:uppercase;color:var(--hol-text-muted)}
.adc-mod__titre{font-family:var(--hol-police-titre),sans-serif;font-weight:700;font-size:17px}

.adc-ligne{display:flex;align-items:center;gap:10px;padding:10px 0;
           border-bottom:1px solid var(--hol-border-subtle)}
.adc-ligne:last-of-type{border-bottom:none}
.adc-ligne__titre{font-size:15px;font-weight:500;white-space:nowrap;overflow:hidden;
                  text-overflow:ellipsis}
.adc-ligne__meta{font-family:var(--hol-police-mono),monospace;font-size:11px;color:var(--hol-text-muted)}

/* LES BOUTONS DE STRUCTURE RESTENT DES CIBLES QU'ON PEUT VISER. Monter,
   descendre, éditer, supprimer : petits à l'œil, trente-six pixels au doigt. */
.adc-ico{--hol-lien:var(--hol-text-secondary);--hol-lien-survol:var(--hol-brand);
         flex:none;width:36px;height:36px;display:inline-flex;align-items:center;
         justify-content:center;cursor:pointer;font:inherit;font-size:14px;
         text-decoration:none;background:var(--hol-surface-1);color:var(--hol-text-secondary);
         border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-sm)}
.adc-ico:hover{border-color:var(--hol-border-strong);color:var(--hol-text-primary)}

.adc-agir{display:inline-flex;align-items:center;justify-content:center;min-height:46px;
          padding:0 22px;cursor:pointer;font:inherit;font-weight:600;font-size:15px;
          text-decoration:none;border:0;border-radius:var(--hol-r-sm);
          background:var(--hol-brand);color:var(--hol-text-inverse)}
.adc-agir--second{background:var(--hol-surface-1);color:var(--hol-brand);
                  border:1px solid var(--hol-border-strong)}

/* Ajouter un module ou une leçon : un champ, un bouton, sur la même ligne tant
   qu'elle y suffit. */
.adc-ajout{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.adc-ajout .champ{flex:1 1 200px;width:auto}

@media (max-width:900px){
  .adc-plan{grid-template-columns:minmax(0,1fr)}
  .adc-cote{position:static}
}

/* Les deux sorties de l'éditeur de leçon, en haut du travail : revenir à la
   structure, ou voir la leçon telle que l'apprenant la verra. */
.edi-sortie{display:flex;flex-wrap:wrap;gap:10px;margin:0 0 20px}

/* ===========================================================================
   LA LANGUE DE TRAVAIL DE L'ADMINISTRATION (.adm-langues)

   Préparer un cours d'anglais en lisant une interface française oblige à
   traduire dans sa tête à chaque champ. Le même sélecteur que l'en-tête du
   site, posé sur fond sombre : deux lettres, celle qui est active sur fond
   plein.
   =========================================================================== */
.adm-langues{display:flex;gap:2px;padding:3px;border-radius:9px;
             background:var(--hol-surface-sur-sombre,rgba(255,255,255,.08))}
/* LA COULEUR PASSE PAR « --hol-lien », PAS PAR « color ». Les liens de ce site
   prennent leur teinte d'une variable, posée par une règle plus spécifique que
   celle-ci : écrire « color » ici ne servait à rien, et le FR inactif
   s'affichait en bleu de marque sur le bleu nuit de la barre, donc invisible. */
.adm-langue{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
            display:inline-flex;align-items:center;justify-content:center;
            min-width:36px;min-height:28px;padding:0 8px;border-radius:7px;
            font-family:var(--hol-police-mono),monospace;font-size:11.5px;font-weight:600;
            letter-spacing:.04em;text-decoration:none;
            transition:background .15s ease,color .15s ease}
.adm-langue[aria-current]{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand);
                          background:var(--hol-text-inverse)}

/* ===========================================================================
   LA BASCULE « EN LIGNE » (.adc-bascule)

   Un cours prêt part en un clic, un cours qui ne l'est plus en revient en un
   clic. C'est un vrai bouton de formulaire, pas une case à cocher qui
   attendrait un enregistrement : le geste est l'effet.

   SON ÉTAT SE LIT SANS LA COULEUR. Le pouce est à gauche ou à droite, et le
   mot dit ce que le clic va faire. Une bascule qu'on ne distingue que par sa
   teinte ne se comprend ni en noir et blanc, ni pour qui confond le vert.
   =========================================================================== */
.adc-bascule{flex:none;display:inline-flex;align-items:center;gap:9px;
             padding:8px 14px 8px 10px;cursor:pointer;font:inherit;font-size:13.5px;
             font-weight:600;color:var(--hol-text-secondary);
             background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
             border-radius:var(--hol-r-pill)}
.adc-bascule:hover{border-color:var(--hol-border-strong);color:var(--hol-text-primary)}
.adc-bascule:disabled{opacity:.5;cursor:not-allowed}
.adc-bascule__piste{flex:none;display:block;width:34px;height:19px;border-radius:10px;
                    background:var(--hol-border-strong);position:relative;
                    transition:background .18s ease}
.adc-bascule__pouce{position:absolute;top:2px;left:2px;width:15px;height:15px;
                    border-radius:50%;background:var(--hol-surface-1);
                    box-shadow:var(--hol-shadow-1);transition:left .18s ease}
.adc-bascule.est-enligne .adc-bascule__piste{background:var(--hol-succes)}
.adc-bascule.est-enligne .adc-bascule__pouce{left:17px}
.adc-bascule__mot{white-space:nowrap}

/* La fiche porte son titre en lien et sa bascule à côté : un bouton dans un
   lien n'est pas du HTML valide, et le navigateur en fait ce qu'il veut. */
.adc-fiche{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:16px 18px}
.adc-fiche__corps{flex:1 1 280px;min-width:0;text-decoration:none;color:inherit}
.adc-fiche__bascule{flex:none;margin:0}

@media (max-width:600px){
  .adc-fiche{align-items:stretch}
  .adc-fiche__bascule{width:100%}
  .adc-bascule{width:100%;justify-content:center}
}

/* Le champ média d'une leçon : l'adresse, puis les deux autres chemins pour
   l'obtenir, puis l'aperçu de ce qu'on vient de choisir. */
.edi-media{display:flex;flex-direction:column;gap:9px}
.edi-media__chemins{display:flex;flex-wrap:wrap;gap:8px}

/* Le dossier du cours, côté atelier : la liste des pièces jointes et le
   formulaire qui en ajoute une. */
.adc-dossier{padding:clamp(20px,3vw,26px);margin-bottom:14px}
/* Le titre à gauche, la commande de vue à droite, sur la même ligne de base.
   Elle se range sous le titre quand la place manque, plutôt que de rétrécir :
   deux boutons de dix-sept pixels ne se visent plus au doigt. */
.adc-dossier__rang{display:flex;align-items:center;justify-content:space-between;
                   gap:14px;flex-wrap:wrap;margin-bottom:4px}
.adc-dossier__rang > .adc-dossier__titre{margin:0}
.adc-docs{list-style:none;margin:0 0 20px;padding:0}
.adc-doc{display:flex;align-items:center;gap:12px;padding:11px 0}
.adc-doc + .adc-doc{border-top:1px solid var(--hol-border-subtle)}
.adc-doc__nom{flex:1 1 auto;min-width:0;font-size:14.5px;font-weight:500}
.adc-doc__lecon{flex:none;max-width:40%;overflow:hidden;text-overflow:ellipsis;
                white-space:nowrap;font-family:var(--hol-police-mono),monospace;
                font-size:11px;color:var(--hol-text-muted)}
.adc-doc__poids{flex:none;font-family:var(--hol-police-mono),monospace;font-size:11.5px;
                color:var(--hol-text-muted);white-space:nowrap}
.adc-doc form{margin:0}

/* ---------------------------------------------------------------------------
   LES INSCRITS D'UN COURS, côté atelier.

   UNE LIGNE PAR PERSONNE, et l'avancement est le sujet : c'est ce qu'on vient
   regarder. Le nom à gauche, la barre au milieu, l'état de l'attestation à
   droite, dans cet ordre parce que c'est l'ordre des questions qu'on se pose.

   LA BARRE PORTE TOUJOURS SON CHIFFRE. Une couleur seule ne se lit pas quand on
   ne distingue pas les couleurs, et une barre aux trois quarts pleine ne dit
   pas « six sur huit ».
   ------------------------------------------------------------------------ */
.adc-inscrits__n{margin-left:10px;font-family:var(--hol-police-mono),monospace;font-size:11.5px;
                 font-weight:500;letter-spacing:.06em;color:var(--hol-text-muted)}
.adc-inscrit{display:flex;align-items:center;gap:14px;padding:13px 0;flex-wrap:wrap}
.adc-inscrit + .adc-inscrit{border-top:1px solid var(--hol-border-subtle)}
.adc-inscrit__qui{flex:none}
.adc-inscrit__mots{flex:1 1 180px;min-width:0}
.adc-inscrit__nom{margin:0 0 3px;font-size:14.5px;font-weight:600;line-height:1.35;
                  overflow-wrap:break-word}
.adc-inscrit__meta{margin:0;font-family:var(--hol-police-mono),monospace;font-size:11px;
                   line-height:1.5;color:var(--hol-text-muted)}
.adc-inscrit__ou{flex:0 1 190px;min-width:150px}
.adc-jauge{height:7px;border-radius:var(--hol-r-pill);background:var(--hol-surface-0);
           overflow:hidden;margin-bottom:6px}
/* LE ROUGE DE L'IDENTITÉ, et c'est son emploi autorisé : la progression. Il ne
   commande rien, il ne signale aucune erreur, il montre le chemin parcouru. */
.adc-jauge > span{display:block;height:100%;background:var(--hol-accent);
                  border-radius:var(--hol-r-pill)}
.adc-inscrit__pct{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
                  font-family:var(--hol-police-mono),monospace;font-size:11.5px;
                  font-variant-numeric:tabular-nums;color:var(--hol-text-muted)}
.adc-inscrit__fini{font-family:var(--hol-police-texte),sans-serif;font-size:11px;font-weight:600;
                   padding:2px 8px;border-radius:var(--hol-r-pill);
                   background:var(--hol-succes-wash);color:var(--hol-succes)}
/* L'ÉTAT DE L'ATTESTATION PORTE UN MOT, jamais une couleur seule. */
.adc-inscrit__att{flex:none;padding:5px 11px;border-radius:var(--hol-r-pill);
                  font-size:11.5px;font-weight:600;white-space:nowrap;
                  background:var(--hol-surface-0);color:var(--hol-text-muted)}
.adc-inscrit__att--attente{background:var(--hol-alerte-wash);color:var(--hol-alerte)}
.adc-inscrit__att--delivree{background:var(--hol-succes-wash);color:var(--hol-succes)}
.adc-inscrit__att--refusee{background:var(--hol-accent-wash);color:var(--hol-erreur)}
@media (max-width:620px){
  .adc-inscrit__ou{flex:1 1 100%}
}

/* ===========================================================================
   LE LECTEUR DE LEÇON (.lecteur)

   Celui du navigateur change de dessin d'un système à l'autre, ne sait pas
   reculer de dix secondes et cache sa vitesse dans un menu. Or ralentir et
   revenir en arrière sont les deux gestes d'une leçon de langue : ils méritent
   un bouton, pas un menu.

   LA BARRE EST SOUS L'IMAGE, pas dessus. Posée en surimpression, elle masque
   les sous-titres et la bouche de celui qui parle, c'est-à-dire précisément ce
   qu'on regarde dans un cours de langue.
   =========================================================================== */
.lecteur{background:var(--hol-surface-inverse);border-radius:var(--hol-r-lg);
         overflow:hidden}
.lecteur:focus-visible{outline:none;box-shadow:0 0 0 3px var(--hol-brand-wash)}
/* Le cadre de l'image : seize neuvièmes, sans « aspect-ratio », que les vieux
   navigateurs d'Android ne connaissent pas. Le rembourrage fait le même
   travail depuis toujours. */
.lecteur-scene{position:relative;width:100%;height:0;padding-bottom:56.25%}
/* ── UNE VIDÉO VERTICALE ─────────────────────────────────────────────────
   Le script lit le format dans le fichier et remplace le rembourrage ci-dessus
   par celui du fichier : voir holangcours-lecteur.js. Reste à décider de la
   largeur, et la réponse n'est pas la même selon l'écran.

   SUR TÉLÉPHONE, ELLE PREND TOUT. Une vidéo tournée au format d'un téléphone,
   regardée sur un téléphone, doit remplir l'écran : c'est le format pour lequel
   elle a été filmée, et la brider reviendrait à rajouter les bandes noires
   qu'on vient d'enlever. Aucune règle ici, donc : le rembourrage suffit.

   SUR GRAND ÉCRAN, ON BRIDE LA HAUTEUR. Servie sur toute la largeur d'un
   ordinateur, la même vidéo ferait une tour de treize cents pixels qu'on ne
   verrait jamais en entier : on fixe la hauteur à soixante-huit pour cent de
   la fenêtre et la largeur suit, calculée depuis le format du fichier. Le
   lecteur se centre, barre de commandes comprise, et les côtés restent au
   sombre de la scène, comme au cinéma. */
/* ── LE PLEIN ÉCRAN ──────────────────────────────────────────────────────
   LE CADRE N'A PLUS DE FORME IMPOSÉE : il prend ce qui reste sous la barre, et
   l'image se débrouille dedans. Sans ces règles, la hauteur calculée pour une
   page s'appliquait telle quelle à l'écran entier : la vidéo occupait les deux
   tiers du haut, la barre suivait, et le tiers du bas restait noir.

   TROIS RÈGLES SÉPARÉES, et non une liste de sélecteurs : un navigateur qui ne
   connaît pas « :fullscreen » jette la règle entière s'il le rencontre dans
   une liste, et l'on perdrait le plein écran là où il marchait. */
.lecteur:fullscreen{display:flex;flex-direction:column;height:100%;
                    border-radius:0;background:var(--hol-noir)}
/* LA SCÈNE DEVIENT TRANSPARENTE EN PLEIN ÉCRAN, et c'est ce qui rend le halo.

   CE QUI SE PASSAIT. Hors plein écran, la scène est une colonne centrée plus
   étroite que le lecteur : le halo, qui remplit le lecteur, se voyait de chaque
   côté. En plein écran, la scène prend toute la largeur, et son fond sombre
   opaque recouvrait le halo : les bandes redevenaient un aplat bleu, exactement
   là où l'on gagnait le plus à les colorer.

   L'image, elle, ne change pas : « object-fit: contain » la centre dans la
   scène, et ce qui reste autour laisse voir le halo au lieu de l'aplat. */
.lecteur:fullscreen .lecteur-scene{flex:1 1 auto;height:auto;padding-bottom:0;
                                   max-width:none;margin:0;background:transparent}
.lecteur:fullscreen .lecteur-barre{flex:0 0 auto}

.lecteur:-webkit-full-screen{display:flex;flex-direction:column;height:100%;
                             border-radius:0;background:var(--hol-noir)}
.lecteur:-webkit-full-screen .lecteur-scene{flex:1 1 auto;height:auto;
                                            padding-bottom:0;max-width:none;margin:0;
                                            background:transparent}
.lecteur:-webkit-full-screen .lecteur-barre{flex:0 0 auto}

/* Le format lu dans le fichier remplace le seize neuvièmes. Sur téléphone,
   cette règle est la seule qui s'applique : une vidéo verticale y prend toute
   la largeur, c'est-à-dire l'écran entier, comme elle a été filmée. */
.lecteur--mesure .lecteur-scene{padding-bottom:calc(var(--lec-h) * 100%)}

@media (min-width:701px){
  /* SUR GRAND ÉCRAN, LA HAUTEUR MÈNE ET LA LARGEUR SUIT. Le rembourrage en
     pourcentage se calcule sur la largeur du PARENT, jamais sur celle de
     l'élément : brider la largeur de l'image sans toucher au rembourrage lui
     laissait sa hauteur de treize cents pixels, et l'image débordait de son
     propre cadre. On fixe donc la hauteur en « vh » et l'on déduit la largeur
     du format du fichier.

     ET LA BRIDE NE TOUCHE QUE L'IMAGE. Posée sur le lecteur entier, elle
     emportait la barre de commandes, qui se retrouvait dans trois cent
     quarante pixels : les cinq vitesses passaient sur trois lignes. L'image se
     centre seule sur le fond sombre, les commandes gardent toute la largeur. */
  /* « --lec-dispo » est la place réellement restante sous le titre, mesurée par
     le script. Le repli en « vh » sert le temps que la mesure arrive, et aussi
     si le script ne tourne pas du tout. */
  .lecteur--portrait .lecteur-scene{height:var(--lec-dispo, 68vh);padding-bottom:0;
                                    max-width:calc(var(--lec-dispo, 68vh) / var(--lec-h));
                                    margin-left:auto;margin-right:auto}
}
.lecteur-scene video{position:absolute;inset:0;width:100%;height:100%;
                     object-fit:contain;display:block;background:transparent}
/* ── LE HALO ──────────────────────────────────────────────────────────────
   L'image de la vidéo, floutée et débordante, derrière elle. Les bandes qui
   restent de chaque côté d'une vidéo verticale prennent alors les couleurs du
   plan, au lieu d'être deux aplats bleus plus lourds à l'œil que l'image.

   LE FLOU PORTE SUR UNE TOILE DE QUARANTE PIXELS, pas sur la vidéo : étirée
   par la feuille de style, elle est déjà floue avant qu'on la floute, et le
   calcul demandé à la carte graphique reste minuscule. Voir
   holangcours-lecteur.js.

   « scale(1.3) » : sans l'agrandissement, le flou laisse voir les bords de la
   toile, et l'on devine un rectangle dans le halo. */
/* IL COUVRE TOUT LE LECTEUR, barre comprise : celle-ci porte son propre fond
   et repasse par-dessus. Ainsi le halo n'a pas à connaître la hauteur de
   l'image, et il vaut aussi en plein écran, où cette hauteur change. */
.lecteur-halo{position:absolute;inset:0;z-index:0;width:100%;height:100%;
              display:block;pointer-events:none;
              filter:blur(30px) saturate(160%) brightness(.78);
              transform:scale(1.3);opacity:.85}
.lecteur{position:relative}
.lecteur-scene{z-index:1}
.lecteur-barre{position:relative;z-index:4}
/* Le fond du cadre reste sombre : le halo se pose dessus, et là où il manque
   (pendant le chargement, ou s'il est décoché) on retrouve l'aplat d'avant. */
.lecteur-scene{background:var(--hol-surface-inverse)}
@media (prefers-reduced-motion:reduce){ .lecteur-halo{transition:none} }

/* ---------------------------------------------------------------------------
   LA SCÈNE SONORE : quand il n'y a rien à regarder.

   Une leçon faite pour l'oreille, ou une leçon vidéo dont on a coupé l'image.
   Le rectangle sombre avec une phrase dedans ne disait pas « écoutez », il
   disait « quelque chose a échoué ». L'onde dit qu'il y a quelque chose à
   entendre, avant même qu'on ait lu un mot.
   --------------------------------------------------------------------------- */
.lecteur-audio{position:relative;overflow:hidden;
               display:flex;flex-direction:column;align-items:center;
               gap:16px;padding:44px 32px 38px;text-align:center}
/* LA MINIATURE DE LA LEÇON EN FOND, FLOUTÉE ET VOILÉE.
   Un aplat sombre ne dit rien de la leçon qu'on écoute. L'image, elle, la
   rappelle, et le flou l'empêche de disputer l'attention à l'onde : on ne la
   regarde pas, on la sent. Le voile va du bleu nuit au bleu de marque, en
   diagonale, parce qu'un voile noir aurait l'air d'une panne.
   L'agrandissement compense les bords que le flou mange. */
/* L'IMAGE RESTE NETTE. Elle était floutée, et une leçon ne se reconnaissait
   plus : on avait une tache colorée au lieu d'une couverture. Le flou servait
   à rendre le texte lisible ; c'est le travail du voile, pas celui de l'image.
   Un soupçon de flou demeure, deux pixels, juste de quoi empêcher un détail
   contrasté de venir se battre avec les mots. */
.lecteur-audio--image::before{content:"";position:absolute;inset:0;
  background-image:var(--sa-image);background-size:cover;background-position:center;
  -webkit-filter:blur(2px);filter:blur(2px);
  -webkit-transform:scale(1.03);transform:scale(1.03)}
/* LE VOILE EST DENSE OÙ IL Y A DU TEXTE, et nulle part ailleurs. L'ellipse
   couvre l'onde, le surtitre et la phrase ; les bords de la carte laissent
   voir la leçon. */
.lecteur-audio--image::after{content:"";position:absolute;inset:0;
  background:
    radial-gradient(ellipse 72% 92% at 50% 54%,
      var(--hol-voile-son-a) 0%, var(--hol-voile-son-a) 48%, var(--hol-voile-son-nul) 100%),
    linear-gradient(135deg, var(--hol-voile-son-b), var(--hol-voile-son-nul))}
.lecteur-audio > *{position:relative;z-index:1}
.lecteur-onde{display:flex;align-items:center;justify-content:center;
              gap:3px;height:84px;width:100%;max-width:470px}
/* CE QUI RESTE À ÉCOUTER EST EN RETRAIT, ce qui est passé a la couleur
   pleine : l'onde dit aussi où l'on en est, comme une barre d'avancement. */
.lecteur-onde span{flex:1 1 0;min-width:2px;max-width:4px;border-radius:999px;
                   background:var(--hol-brand-clair);opacity:.34;
                   /* --h est posé par le script, de 0 à 1 ; au repos, une forme
                      de colline, pour que l'onde ait déjà l'air d'une onde. */
                   height:calc(6px + var(--h,.18) * 76px)}
/* La couleur pleine marque ce qui est passé ; elle s'allume doucement, trait
   après trait, au rythme de la lecture. C'est le seul mouvement de l'onde. */
.lecteur-onde span.est-lu{opacity:1}
@media (prefers-reduced-motion: no-preference){
  .lecteur-onde span{transition:opacity .3s var(--hol-ease)}
}
.lecteur--eteint .lecteur-onde span{background:var(--hol-text-inverse-2);opacity:.4}

/* L'ONDE AILLEURS QUE DANS LE LECTEUR DE LEÇON.
   Même forme, même geste, deux tailles : « mince » pour une question de test,
   où le son accompagne un énoncé et ne doit pas lui voler la vedette.
   « clair » pour les cartes blanches, où le bleu clair sur blanc ne tiendrait
   pas : c'est le bleu de la marque qui porte. */
.lecteur-onde--mince{height:40px;gap:2px;margin:10px 0 4px}
.lecteur-onde--mince span{min-width:2px;max-width:3px;
                          height:calc(5px + var(--h,.18) * 34px)}
.lecteur-onde--clair span{background:var(--hol-brand);opacity:.26}
.lecteur-onde--clair span.est-lu{opacity:1}
/* LE MOUVEMENT EST ADOUCI DEUX FOIS : ici, par une transition un peu plus
   longue et une courbe qui freine en fin de course, et dans le script, par une
   inertie propre à chaque trait. Un saut brut d'une image à l'autre donne une
   onde nerveuse, qui fatigue l'œil au bout d'une minute d'écoute. */


.lecteur-audio__mot{margin:0;font-family:var(--hol-police-mono),ui-monospace,monospace;
                    font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
                    font-weight:600;color:var(--hol-brand-clair)}
.lecteur-audio__note{margin:0;max-width:56ch;font-size:14.5px;line-height:1.6;
                     color:var(--hol-text-inverse-2)}
/* SUR UNE PHOTO, LE TEXTE PASSE AU BLANC FRANC. Le gris clair suffisait sur un
   aplat sombre ; sur une miniature qui a ses propres zones claires, il
   disparaît. Et une ombre portée, discrète, le décolle du fond quel qu'il
   soit : c'est ce qui permet de garder l'image nette dessous. */
.lecteur-audio--image .lecteur-audio__note{color:var(--hol-text-inverse);
  text-shadow:0 1px 10px var(--hol-voile-son-a)}
.lecteur-audio--image .lecteur-audio__mot{text-shadow:0 1px 10px var(--hol-voile-son-a)}
.lecteur--audio audio{width:100%;display:block}
/* Une fois les commandes de la maison posées, la balise native s'efface. */
.lecteur--audio audio[data-hl-cache]{display:none}

@media (max-width:620px){
  .lecteur-audio{gap:12px;padding:30px 20px 26px}
  .lecteur-onde{height:62px;gap:2px}
  .lecteur-onde span{min-width:2px;max-width:3px;height:calc(7px + var(--h,.18) * 54px)}
  .lecteur-audio__note{font-size:13.5px}
}

/* LA PASTILLE D'IDENTITÉ : le rond, le prénom, et le chemin vers son compte.
   Elle se pose aussi bien sur une barre sombre que sur un fond clair ; seule
   la couleur du nom change. */
.hol-identite{--hol-lien:var(--hol-text-primary);--hol-lien-survol:var(--hol-text-primary);
              display:inline-flex;align-items:center;gap:9px;flex:none;min-width:0;
              padding:3px 10px 3px 3px;border-radius:var(--hol-r-pill);
              text-decoration:none;
              transition:background var(--hol-dur) var(--hol-ease)}
.hol-identite:hover{background:var(--hol-brand-wash)}
.hol-identite__nom{font-size:13.5px;font-weight:600;max-width:14ch;
                   white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hol-identite--sombre{--hol-lien:var(--hol-text-inverse);
                      --hol-lien-survol:var(--hol-text-inverse)}
.hol-identite--sombre:hover{background:var(--hol-glass)}
.hol-identite:focus-visible{outline:none;box-shadow:0 0 0 2px var(--hol-focus)}
.hol-identite--sombre:focus-visible{box-shadow:0 0 0 2px var(--hol-surface-inverse),
                                                0 0 0 4px var(--hol-focus-inverse)}

/* ===========================================================================
   LA BARRE DE L'ESPACE D'APPRENTISSAGE
   Même maison que la barre d'une leçon : fond bleu nuit, logo de charte, filet
   vertical, rond de compte. Voir le partial espace-entete.php pour le pourquoi.
   =========================================================================== */
.esp-barre{position:sticky;top:0;z-index:60;
           background:var(--hol-surface-inverse);color:var(--hol-text-inverse);
           box-shadow:var(--hol-shadow-2)}
/* TROIS BORDS, ET UN SEUL CALCUL POUR CHACUN.
   À gauche, le logo tombe sur la verticale des icônes du menu : 28 px, c'est
   la marge intérieure de la colonne plus celle d'une entrée. Il est posé en
   absolu pour ne pas bouger quand la colonne se replie.
   Au centre et à droite, le reste de la barre reprend EXACTEMENT la géométrie
   du contenu : il commence au bord de la colonne et porte la même largeur
   maximale et la même gouttière que « .eu-container ». Les cartes en dessous
   et le bouton « Le site » s'arrêtent donc sur la même verticale, à toute
   largeur d'écran et quel que soit l'état du menu. */
.esp-barre__rang{position:relative;display:flex;align-items:center;
                 padding:9px 0;min-height:64px}
.esp-marque{position:absolute;left:28px;top:50%;transform:translateY(-50%);
            display:inline-flex;align-items:center;flex:none;z-index:1}
/* Taille de charte sur fond sombre : plus petit, le globe du O se bouche.
   Le retrait de 8,4 px compense le blanc interne du fichier : c'est l'ENCRE du
   logo qui doit tomber sur 28, pas le bord de son cadre. */
.esp-logo{height:42px;width:auto;margin-left:-8.4px;display:block}
.esp-barre__zone{flex:1 1 auto;min-width:0;margin-left:var(--esp-rail-l);
                 transition:margin-left .2s ease}
@media (prefers-reduced-motion:reduce){.esp-barre__zone{transition:none}}
.esp-barre__dedans{max-width:1480px;margin:0 auto;padding:0 var(--hol-gutter);
                   display:flex;align-items:center;gap:18px}
/* LE FIL ENTRE LA MARQUE ET LE TEXTE. Collés, les deux se lisaient comme un
   seul bloc et la marque perdait son air. L'écart seul ne suffit pas : la barre
   oblique du logo pointe vers la droite et vient chercher le premier mot. Un
   filet tranche la question, comme dans la barre de l'administration. */
.esp-ariane{min-width:0;flex:1 1 auto;display:flex;flex-direction:column;gap:1px;
            margin-left:30px;padding-left:30px;
            border-left:1px solid var(--hol-border-on-dark)}
.esp-ariane__quoi{font-family:var(--hol-police-mono),monospace;font-size:11px;
                  letter-spacing:.1em;text-transform:uppercase;
                  color:var(--hol-text-inverse-2);white-space:nowrap;
                  overflow:hidden;text-overflow:ellipsis}
.esp-ariane__ici{font-size:14.5px;font-weight:600;white-space:nowrap;
                 overflow:hidden;text-overflow:ellipsis}
.esp-barre__droite{flex:none;display:flex;align-items:center;gap:12px}
/* Le nom dit où elle vit : « .esp-langue » tout court désigne déjà la
   pastille de langue d'un cours, dans la page. */
.esp-barre__langues{flex:none;display:flex;gap:4px;padding:3px;
             border-radius:var(--hol-r-pill);
             border:1px solid var(--hol-border-on-dark);background:var(--hol-glass)}
.esp-barre__langue{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
            display:inline-flex;align-items:center;min-height:26px;padding:0 11px;
            font-family:var(--hol-police-mono),monospace;font-size:11px;letter-spacing:.1em;
            border-radius:var(--hol-r-pill);text-decoration:none}
.esp-barre__langue:hover{background:var(--hol-glass-hi)}
/* La langue en cours porte l'encre de marque sur blanc : c'est ce qui se voit
   le mieux sur du bleu nuit, et le blanc n'est employé que pour cela ici. */
.esp-barre__langue[aria-current]{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand);
                          font-weight:600;background:var(--hol-surface-1)}
.esp-barre__langue:focus-visible{outline:none;box-shadow:0 0 0 2px var(--hol-focus-inverse)}
/* LA COULEUR D'UN LIEN PASSE PAR « --hol-lien », JAMAIS PAR « color » : une
   règle du site colore tous les liens, et elle bat un « color » posé ici. */
.esp-sortie{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
            display:inline-flex;align-items:center;min-height:38px;padding:0 14px;
            font-size:13.5px;font-weight:600;text-decoration:none;
            border-radius:var(--hol-r-sm);border:1px solid var(--hol-border-on-dark)}
.esp-sortie:hover{background:var(--hol-glass)}
.esp-sortie:focus-visible{outline:none;box-shadow:0 0 0 2px var(--hol-surface-inverse),
                                                 0 0 0 4px var(--hol-focus-inverse)}
@media (max-width:900px){
  /* Plus de colonne à gauche : la barre redevient une ligne ordinaire, et le
     logo reprend sa place dans le flux, sur la gouttière du site. */
  .esp-barre__rang{gap:12px;padding:7px var(--hol-gutter);min-height:56px}
  .esp-marque{position:static;transform:none}
  .esp-logo{height:30px;margin-left:-5px}
  .esp-barre__zone{margin-left:0}
  .esp-barre__dedans{padding:0;gap:12px}
  .esp-ariane{margin-left:14px;padding-left:14px;
              border-left:1px solid var(--hol-border-on-dark)}
  .esp-ariane__quoi{display:none}
}
/* Sous 600 px, le nom de l'écran disparaît entièrement : coincé entre le logo
   et le rond du compte, il ne montrait plus qu'une lettre, et une lettre seule
   ne dit rien. Le titre de la page, juste en dessous, le redit en entier. */
@media (max-width:600px){
  .esp-ariane{display:none}
  .esp-barre .hol-identite__nom{display:none}
  .esp-barre .hol-identite{padding-right:3px}
  .esp-sortie{min-height:34px;padding:0 11px;font-size:12.5px}
}

/* ===========================================================================
   LES MOTS DE PASSE : CE QUI EST EXIGÉ, ET CE QU'ON EN MONTRE
   Venu des pages de compte, posé ici parce que « Mon compte » s'en sert aussi :
   on ne peut pas exiger un mot de passe solide à l'inscription et ne plus rien
   dire au moment où on le change.
   =========================================================================== */
/* ------------------------------------------------------ ce qui est exigé */
/* L'astérisque porte la couleur d'identité : c'est un repère, jamais une
   alerte, et il ne se confond donc pas avec un message d'erreur.

   MAIS IL LA PORTE DANS SA NUANCE LISIBLE. L'accent d'EUDUC est un jaune d'or ;
   posé tel quel sur une carte crème, l'astérisque donnait 1,3:1, c'est-à-dire
   rien. « accent-texte » est le même accent ramené à une encre qui se lit, et
   il vaut l'accent lui-même quand celui-ci est déjà sombre : chez nous, le
   rouge ne bouge pas. */
.auth-oblig {
  color: var(--hol-accent-texte);
  margin-left: 3px;
  font-weight: 700;
}
.auth-oblig-note { margin: 0 0 4px; }

/* --------------------------------------------- la force d'un mot de passe */
/* CE BLOC APPARTIENT AU FORMULAIRE, il en prend donc la famille.

   Il se posait sur « surface-0 », le fond de page, avec le filet le plus
   discret du site. Chez nous, le bleuté se détachait tout juste du blanc de la
   carte. Chez un locataire dont le fond de page et les cartes sont deux crèmes
   à un pour cent l'un de l'autre, le bloc disparaissait : on voyait un pavé
   jaunâtre sans bord, posé sur rien.

   Fond et filet viennent maintenant des mêmes jetons que les champs, qui sont
   dérivés de la marque et mesurés : le filet tient 3,9:1 contre une carte
   crème, et le bloc se lit comme ce qu'il est, un cadran rattaché aux deux
   cases au-dessus. */
.mdp-force {
  margin: -6px 0 0;
  padding: 14px 16px;
  border-radius: var(--hol-r-sm);
  background: var(--hol-champ-fond);
  border: 1px solid var(--hol-champ-bord);
}
.mdp-force__haut {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 8px;
}
.mdp-force__titre {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10.5px;
  letter-spacing: .12em;
  text-transform: uppercase;
  /* « muted » tombait à 4,4:1 sur le fond du bloc, juste sous le seuil, et
     c'est un surtitre de dix pixels et demi : celui qu'on lit le moins bien. */
  color: var(--hol-text-secondary);
}
.mdp-force__mot { font-size: 13.5px; font-weight: 600; }
.mdp-force__piste {
  height: 6px;
  border-radius: var(--hol-r-pill);
  /* UNE JAUGE VIDE DOIT SE VOIR, sans quoi on ne sait pas qu'il y a quelque
     chose à remplir. Le filet le plus discret disparaissait sur le fond du
     bloc chez un locataire aux neutres crème. */
  background: var(--hol-champ-bord);
  overflow: hidden;
}
.mdp-force__part {
  display: block;
  height: 100%;
  width: var(--part, 0%);
  border-radius: var(--hol-r-pill);
  background: var(--hol-text-muted);
  transition: width .2s ease, background-color .2s ease;
}
@media (prefers-reduced-motion: reduce) { .mdp-force__part { transition: none; } }
/* Les couleurs d'état du site, et elles ne sont jamais seules : le mot écrit
   juste au-dessus dit la même chose. */
.mdp-force__part[data-rang="1"] { background: var(--hol-erreur); }
.mdp-force__part[data-rang="2"] { background: var(--hol-alerte); }
.mdp-force__part[data-rang="3"] { background: var(--hol-succes); }

/* QUATRE ÉCHANTILLONS SUR UNE LIGNE, pas quatre phrases en colonne. On lit
   « aA », « 123 », « !?@ » d'un seul regard ; une liste de consignes, non. */
.mdp-crits {
  list-style: none;
  margin: 12px 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
}
/* LES PASTILLES SONT DANS LE BLOC, PAS SUR LA CARTE. Elles prenaient la
   surface des cartes et le filet le plus discret : sur le fond du bloc, qui
   est maintenant celui des champs, elles se détachent par leur clarté, et leur
   filet vient de la même famille pour qu'il se voie chez un locataire dont les
   neutres sont tous du crème. */
.mdp-crit {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px 4px 5px;
  border-radius: var(--hol-r-pill);
  background: var(--hol-surface-1);
  border: 1px solid var(--hol-champ-bord);
  color: var(--hol-text-secondary);
}
.mdp-crit__ex {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 12.5px;
  letter-spacing: .04em;
  font-variant-numeric: tabular-nums;
}
.mdp-crit__marque {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 17px;
  height: 17px;
  border-radius: 50%;
  border: 1px solid var(--hol-border-strong);
  color: transparent;            /* la coche n'existe qu'une fois le point acquis */
}
.mdp-crit.est-ok {
  color: var(--hol-text-primary);
  border-color: var(--hol-succes-bord, var(--hol-succes));
}
.mdp-crit.est-ok .mdp-crit__marque {
  color: var(--hol-text-inverse);
  background: var(--hol-succes);
  border-color: var(--hol-succes);
}

/* L'EXEMPLE, EN UNE LIGNE. Montrer une phrase de mot de passe en dit plus que
   trois lignes de conseils, et se retient mieux. */
.mdp-force__ex {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
  margin: 12px 0 0;
}
.mdp-force__ex-mot {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .12em;
  text-transform: uppercase;
  /* Même raison que le surtitre du bloc : dix pixels en capitales espacées
     n'ont pas de marge pour un contraste à la limite. */
  color: var(--hol-text-secondary);
}
.mdp-force__ex-val {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 13px;
  color: var(--hol-text-secondary);
}

/* ------------------------------------- le second mot de passe, pendant qu'on
   le retape. Le champ se borde, la ligne en dessous dit où l'on en est. Jamais
   la couleur seule : le texte dit la même chose. */
.auth-champ.est-ok { border-color: var(--hol-succes); }
.auth-champ.est-ko { border-color: var(--hol-erreur); }
/* LA LIGNE GARDE SA PLACE MÊME VIDE : sans cela, la carte sautait d'une ligne
   à chaque message, et le champ suivant se dérobait sous le doigt. Elle paraît
   et disparaît en fondu, parce qu'un mot qui surgit d'un coup se lit comme une
   alarme. */
.mdp-verdict {
  display: flex;
  align-items: baseline;
  gap: 6px;
  margin: 7px 0 0;
  min-height: 19px;
  font-size: 13px;
  line-height: 1.45;
  color: var(--hol-text-muted);
  opacity: 0;
  transition: opacity .28s ease;
}
.mdp-verdict.est-vu { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .mdp-verdict { transition: none; } }
.mdp-verdict.est-ok { color: var(--hol-succes); font-weight: 600; }
.mdp-verdict.est-ko { color: var(--hol-erreur); }
/* Le collage refusé n'est pas une faute : c'est un rappel. Il porte donc la
   couleur d'avertissement, pas celle de l'erreur. */
.mdp-verdict.est-alerte { color: var(--hol-alerte); }
.mdp-verdict.est-ok::before { content: '\2713'; font-weight: 700; }

/* LE CHAMP DE CONFIRMATION, pendant qu'on retape. La classe s'ajoute à celle du
   champ, quel que soit son nom sur l'écran. */
.hol-scope input.est-ok{border-color:var(--hol-succes)}
.hol-scope input.est-ko{border-color:var(--hol-erreur)}

/* ===========================================================================
   LE BOUTON DE LA MAISON

   UN MOT BLEU SOULIGNÉ N'EST PAS UN BOUTON. Il l'était un peu partout :
   « Vérifier une attestation », « Retour au panier », « Leçon suivante », tous
   écrits en texte nu, sans forme, sans cible tactile, avec un dessin légèrement
   différent à chaque écran parce que chacun portait son propre style en ligne.
   Sur un téléphone, un mot de quatorze pixels n'est pas quelque chose qu'on
   vise avec le pouce : c'est quelque chose qu'on rate.

   TROIS RANGS, ET UN SEUL DESSIN POUR CHACUN.
     principal : l'action attendue de l'écran. Un seul par écran, en règle.
     second    : une action possible, de même importance qu'une autre.
     doux      : une sortie, un retour, un détail. Il n'a de contour qu'au
                 survol, donc il ne rivalise pas avec les deux autres.
   Et « clair » pour les fonds sombres, où le blanc tient lieu d'encre.

   LA COULEUR PASSE TOUJOURS PAR « --hol-lien ». Une règle du site habille tous
   les liens à partir de cette variable, et elle gagne contre un « color » posé
   sur une classe. C'est le piège qui a coûté le plus de temps sur ce site.

   CE N'EST PAS UN LIEN DANS UNE PHRASE. Un mot cliquable au milieu d'un
   paragraphe reste un lien souligné : l'habiller en bouton casserait la ligne
   et la lecture. Ces classes sont pour les actions qui vivent seules.
   =========================================================================== */
.hol-btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;
         min-height:46px;padding:0 20px;cursor:pointer;
         font:inherit;font-size:14.5px;font-weight:600;line-height:1.2;
         text-align:center;text-decoration:none;white-space:nowrap;
         border:1px solid transparent;border-radius:var(--hol-r-sm);
         transition:background-color .16s ease,border-color .16s ease,color .16s ease}
@media (prefers-reduced-motion:reduce){.hol-btn{transition:none}}
.hol-btn:focus-visible{outline:none;
  box-shadow:0 0 0 2px var(--hol-surface-1),0 0 0 4px var(--hol-focus)}

/* PRINCIPAL : l'aplat de marque, l'encre inversée. */
.hol-btn--principal{--hol-lien:var(--hol-bouton-encre);--hol-lien-survol:var(--hol-bouton-encre);
                    background:var(--hol-bouton-fond);color:var(--hol-bouton-encre);
                    border-color:var(--hol-bouton-fond)}
.hol-btn--principal:hover{background:var(--hol-bouton-survol);border-color:var(--hol-bouton-survol)}

/* SECOND : le blanc des cartes, l'encre de marque, un trait. */
.hol-btn--second{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand);
                 background:var(--hol-surface-1);color:var(--hol-brand);
                 border-color:var(--hol-border-strong)}
.hol-btn--second:hover{background:var(--hol-brand-wash);border-color:var(--hol-brand)}

/* DOUX : rien, jusqu'au survol. Pour les retours et les sorties, qui doivent
   se trouver sans jamais appeler. */
.hol-btn--doux{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand);
               background:transparent;color:var(--hol-brand)}
.hol-btn--doux:hover{background:var(--hol-brand-wash);border-color:var(--hol-brand-bord,transparent)}

/* CLAIR : sur un fond sombre, le blanc devient l'aplat et la marque l'encre. */
.hol-btn--clair{--hol-lien:var(--hol-brand);--hol-lien-survol:var(--hol-brand);
                background:var(--hol-surface-1);color:var(--hol-brand);
                border-color:var(--hol-surface-1)}
.hol-btn--clair:hover{background:var(--hol-surface-0);border-color:var(--hol-surface-0)}
.hol-btn--clair:focus-visible{box-shadow:0 0 0 2px var(--hol-surface-inverse),
                                        0 0 0 4px var(--hol-focus-inverse)}

/* RETIRER : la seule action qui défait quelque chose. Elle ne crie pas, elle
   ne prend pas la couleur de l'erreur au repos : elle se révèle au survol,
   quand on est déjà en train de la viser. Le rouge d'état, jamais celui de la
   marque, et toujours accompagné d'un libellé qui dit ce qu'on défait. */
.hol-btn--defaire{--hol-lien:var(--hol-text-secondary);--hol-lien-survol:var(--hol-erreur);
                  background:transparent;color:var(--hol-text-secondary);
                  border-color:var(--hol-border-subtle)}
.hol-btn--defaire:hover{background:var(--hol-erreur-wash);color:var(--hol-erreur);
                        border-color:var(--hol-erreur)}

/* Deux tailles de plus : le détail, et le pleine largeur des formulaires. */
.hol-btn--petit{min-height:38px;padding:0 14px;font-size:13.5px;gap:7px}
/* MINI : les actions d'une ligne de liste. Plusieurs se suivent sur la même
   ligne, derrière le contenu qu'elles concernent ; à la taille « petit » elles
   pèseraient plus lourd que la ligne elle-même. */
.hol-btn--mini{min-height:32px;padding:0 11px;font-size:12.5px;gap:6px;
               border-radius:var(--hol-r-pill)}
.hol-btn--grand{min-height:52px;padding:0 26px;font-size:16px}
.hol-btn--large{width:100%}
/* UN BOUTON MASQUÉ DOIT DISPARAÎTRE. « .hol-btn » pose un « display », et un
   « display » posé par une classe l'emporte sur la règle du navigateur pour
   « hidden » : sans cette ligne, masquer un bouton avec « hidden » ne fait
   rien du tout, et l'on cherche longtemps pourquoi. Le même piège a déjà coûté
   une soirée ailleurs sur ce site. */
.hol-btn[hidden]{display:none}
.hol-btn[disabled]{cursor:not-allowed;background:var(--hol-surface-0);
                   color:var(--hol-text-muted);border-color:var(--hol-border-strong)}
/* La flèche d'un bouton avance au survol : c'est le seul mouvement qu'on
   s'autorise, et il dit la direction. */
.hol-btn__fleche{transition:transform .18s ease}
.hol-btn:hover .hol-btn__fleche{transform:translateX(3px)}
@media (prefers-reduced-motion:reduce){.hol-btn__fleche{transition:none}}

/* UN LIEN DANS UNE PHRASE RESTE UN LIEN, ET IL SE SOULIGNE.
   Le site retire le soulignement de tous les liens, ce qui va bien pour une
   navigation en pastilles mais laisse, au milieu d'un paragraphe, un simple mot
   bleu qu'on ne sait pas cliquable. Dans du texte courant, le trait revient :
   c'est la seule marque que tout le monde reconnaît depuis trente ans. */
.hol-lien-texte{text-decoration:underline;text-underline-offset:3px;
                text-decoration-thickness:1px;font-weight:600}
.hol-lien-texte:hover{text-decoration-thickness:2px}
/* POSÉE SUR UN BOUTON, elle doit d'abord défaire le bouton du navigateur :
   sans ces lignes, « Annuler » ressort avec le cadre gris et la police système
   de la machine, au milieu d'une page qui n'en a nulle part ailleurs. */
button.hol-lien-texte{appearance:none;-webkit-appearance:none;background:none;
                      border:0;padding:0;font:inherit;font-weight:600;cursor:pointer;
                      color:var(--hol-brand)}
button.hol-lien-texte:focus-visible{outline:none;border-radius:var(--hol-r-sm);
                                    box-shadow:0 0 0 3px var(--hol-focus)}

/* ===========================================================================
   LA BARRE LATÉRALE DE L'ESPACE

   ELLE EST BLEU NUIT, comme la barre du haut : les deux ne font qu'une seule
   pièce en L, et l'espace de travail se distingue au premier regard du site
   public, qui est clair. Une colonne blanche posée contre une barre sombre
   donnait deux objets sans rapport.

   ELLE COMMENCE PLUS BAS QUE LE LOGO. Collée dessous, la première entrée se
   lisait comme un sous-titre de la marque. Vingt-six pixels suffisent à faire
   deux choses distinctes.

   ELLE SE REPLIE SUR SES ICÔNES, et le document porte alors « data-rail ».
   Voir holangcours-rail.js.
   =========================================================================== */
.hol-scope{--esp-rail-l:268px}
[data-rail="replie"] .hol-scope,
.hol-scope[data-rail="replie"]{--esp-rail-l:76px}

.esp-cadre{flex:1 1 auto;display:flex;align-items:flex-start;min-height:0}
/* LA LIGNE LÉGALE TOMBE AU BAS DE LA PAGE, MÊME QUAND LA PAGE EST COURTE.
   La colonne de contenu ne s'étirait pas : « align-items:flex-start » sur le
   cadre la laissait à la hauteur de son texte, et sur un écran où l'on n'a
   encore ni cours ni attestation, les mentions légales se retrouvaient au
   milieu, suivies d'un grand vide. Jimmy : « cette zone devrait être en bas de
   page, pour plus de visibilité ». La colonne s'étire, devient une colonne
   flexible, et le contenu pousse la signature contre le bas. Sur une page
   longue, rien ne change : « flex:1 » ne tire que s'il reste de la place. */
.esp-flux{flex:1 1 auto;min-width:0;align-self:stretch;
          display:flex;flex-direction:column}

.esp-rail{flex:none;width:var(--esp-rail-l);align-self:stretch;
          background:var(--hol-surface-inverse);color:var(--hol-text-inverse);
          transition:width .2s ease}
@media (prefers-reduced-motion:reduce){.esp-rail{transition:none}}
/* COLLÉE SOUS LA BARRE DU HAUT : les deux se touchent, et la colonne commence
   là où la barre finit. Les entrées, elles, respirent d'abord. */
.esp-rail__dedans{position:sticky;top:64px;display:flex;flex-direction:column;gap:3px;
                  padding:26px 14px 18px;min-height:calc(100vh - 64px);
                  max-height:calc(100vh - 64px);overflow-y:auto;overscroll-behavior:contain}

.esp-rail__lien{--hol-lien:var(--hol-text-inverse-2);--hol-lien-survol:var(--hol-text-inverse);
                display:flex;align-items:center;gap:13px;width:100%;min-height:46px;
                padding:0 14px;border:0;background:none;cursor:pointer;
                font:inherit;font-size:14.5px;font-weight:500;text-align:left;
                white-space:nowrap;text-decoration:none;color:var(--hol-text-inverse-2);
                border-radius:var(--hol-r-sm)}
.esp-rail__lien:hover{background:var(--hol-glass);color:var(--hol-text-inverse)}
/* Une entrée fermée tant que l'accompagnement n'est pas validé : éteinte. */
.esp-rail__lien.est-ferme{color:var(--hol-text-inverse-2);opacity:.42;cursor:not-allowed}
.esp-rail__lien.est-ferme:hover{background:transparent;color:var(--hol-text-inverse-2)}
.esp-rail__ico{flex:none}
.esp-rail__mot{min-width:0;overflow:hidden;text-overflow:ellipsis}
/* L'ÉCRAN OÙ L'ON EST porte l'aplat de marque : sur le bleu nuit, c'est le seul
   bleu plus clair et plus saturé de la charte, il se détache sans crier. */
.esp-rail__lien[aria-current]{--hol-lien:var(--hol-text-inverse);
                              --hol-lien-survol:var(--hol-text-inverse);
                              background:var(--hol-brand);color:var(--hol-text-inverse);
                              font-weight:600;box-shadow:var(--hol-shadow-2)}
.esp-rail__lien[aria-current]:hover{background:var(--hol-brand)}
.esp-rail__lien:focus-visible{outline:none;
  box-shadow:0 0 0 2px var(--hol-surface-inverse),0 0 0 4px var(--hol-focus-inverse)}
.esp-rail__filet{height:1px;background:var(--hol-border-on-dark);margin:14px 14px}
.esp-rail__sortie{margin:auto 0 0;padding-top:14px}
.esp-rail__lien--sortie:hover{background:var(--hol-glass);color:var(--hol-accent-clair)}

/* LE BOUTON DE REPLI, en pied de colonne, discret : on le cherche quand on en a
   besoin, il ne se propose pas le reste du temps. */
.esp-rail__bascule{display:flex;align-items:center;gap:13px;width:100%;min-height:42px;
                   margin-top:6px;padding:0 14px;border:0;cursor:pointer;
                   background:none;color:var(--hol-text-inverse-muted);
                   font:inherit;font-size:13px;font-weight:500;text-align:left;
                   white-space:nowrap;border-radius:var(--hol-r-sm)}
.esp-rail__bascule:hover{background:var(--hol-glass);color:var(--hol-text-inverse)}
.esp-rail__bascule:focus-visible{outline:none;
  box-shadow:0 0 0 2px var(--hol-surface-inverse),0 0 0 4px var(--hol-focus-inverse)}
.esp-rail__chevron{flex:none;transition:transform .2s ease}
@media (prefers-reduced-motion:reduce){.esp-rail__chevron{transition:none}}

/* ── REPLIÉE ────────────────────────────────────────────────────────────
   Les mots s'effacent, les icônes se centrent, et le chevron se retourne.
   Chaque entrée garde son libellé en infobulle. */
/* REPLIÉE, LE MOT RESTE DANS LA PAGE, simplement masqué à l'œil : « display:
   none » l'aurait retiré aussi aux lecteurs d'écran, et une icône sans nom
   n'est plus un lien, c'est une devinette. */
[data-rail="replie"] .esp-rail__mot{position:absolute;width:1px;height:1px;
                                    margin:-1px;padding:0;overflow:hidden;
                                    clip-path:inset(50%);white-space:nowrap}
/* ET L'INFOBULLE EST LA NÔTRE : elle paraît tout de suite, dans la typographie
   du site, au lieu d'attendre une seconde et de sortir en gris système. */
[data-rail="replie"] .esp-rail__dedans{overflow:visible}
[data-rail="replie"] .esp-rail__lien{position:relative}
[data-rail="replie"] .esp-rail__lien::after{
  content:attr(data-mot);position:absolute;left:calc(100% + 12px);top:50%;
  transform:translateY(-50%);z-index:70;
  padding:7px 12px;border-radius:var(--hol-r-sm);
  background:var(--hol-text-primary);color:var(--hol-text-inverse);
  font-size:13px;font-weight:600;white-space:nowrap;
  box-shadow:var(--hol-shadow-2);
  opacity:0;pointer-events:none;transition:opacity .12s ease}
[data-rail="replie"] .esp-rail__lien:hover::after,
[data-rail="replie"] .esp-rail__lien:focus-visible::after{opacity:1}
@media (prefers-reduced-motion:reduce){
  [data-rail="replie"] .esp-rail__lien::after{transition:none}
}
[data-rail="replie"] .esp-rail__lien,
[data-rail="replie"] .esp-rail__bascule{justify-content:center;padding:0 10px;gap:0}
[data-rail="replie"] .esp-rail__chevron{transform:rotate(180deg)}
[data-rail="replie"] .esp-rail__filet{margin:14px 8px}

/* SUR UN ÉCRAN ÉTROIT, LA COLONNE DEVIENT UNE BANDE, et la bande défile du
   doigt. Une colonne de 268 px sur un téléphone de 390 ne laisse plus rien au
   contenu, et un menu replié demande un clic pour montrer quatre liens. */
@media (max-width:900px){
  /* COLONNE FLEXIBLE ET NON BLOC, pour que la ligne légale tombe au bas de la
     page ici aussi. Au-dessus de 900, le cadre est une rangée et la colonne de
     contenu s'étire par « align-self:stretch ». En bande, il passait en
     « block » : la colonne reprenait la hauteur de son texte, et sur « Mes
     attestations », qui tient en six cents pixels, les mentions légales se
     retrouvaient au milieu d'une page de mille. Une colonne flexible empile
     exactement comme un bloc, et laisse le contenu pousser la signature. */
  /* « min-width:0 » SUR LES DEUX, ET C'EST LA CLÉ. La taille minimale
     automatique d'un élément flexible est celle de son contenu : la bande fait
     1908 pixels de liens, elle imposait donc 1908 au cadre, qui débordait sans
     qu'on le voie puisque la page rogne. La bande ne défilait plus, et les
     flèches disparaissaient faute de dépassement à signaler. */
  /* « align-items:stretch » EXPLICITE : la règle de base pose « flex-start »
     pour que la colonne de gauche ne s'étire pas en rangée. En colonne, cette
     même valeur empêche la bande de prendre la largeur du cadre : elle
     reprenait celle de son contenu, 1908 pixels, et ne défilait donc plus. */
  .esp-cadre{display:flex;flex-direction:column;align-items:stretch;min-width:0}
  .esp-rail{width:auto;align-self:auto;flex:none;min-width:0}
  .esp-flux{flex:1 1 auto;min-width:0}
  .esp-rail__dedans{position:static;flex-direction:row;gap:6px;
                    min-height:0;max-height:none;
                    padding:10px var(--hol-gutter);overflow-x:auto;
                    scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .esp-rail__dedans::-webkit-scrollbar{display:none}
  .esp-rail__lien{width:auto;flex:none;min-height:40px;font-size:14px}
  .esp-rail__mot{display:inline}
  .esp-rail__filet{width:1px;height:auto;margin:6px 4px}
  .esp-rail__sortie{margin:0;padding-top:0;display:flex;align-items:center}
  /* Replier n'a aucun sens dans une bande horizontale : il n'y a rien à
     gagner en largeur, et tout à perdre en lisibilité. Et le choix fait sur
     l'ordinateur ne suit pas sur le téléphone : il est gardé pour la page, pas
     pour l'écran. Sans ces trois lignes, une colonne repliée la veille sur un
     grand écran rendait la bande du téléphone muette, huit icônes sans un
     mot. */
  .esp-rail__bascule{display:none}
  [data-rail="replie"] .esp-rail__mot{position:static;width:auto;height:auto;
                                      margin:0;clip-path:none;white-space:nowrap}
  [data-rail="replie"] .esp-rail__lien{justify-content:flex-start;padding:0 14px;gap:11px}
  [data-rail="replie"] .esp-rail__lien::after{content:none}
  [data-rail="replie"] .esp-rail__filet{margin:6px 4px}
}

/* SUR UN TÉLÉPHONE, LA BARRE DU HAUT NE PEUT PAS TOUT PORTER. Le logo mesure
   à lui seul la moitié de la largeur : le rond du compte s'efface, parce que
   « Mon compte » est juste en dessous dans la bande du menu, et la sortie se
   resserre. La langue reste : c'est elle qu'on vient chercher. */
@media (max-width:600px){
  .esp-barre .hol-identite{display:none}
  .esp-logo{height:26px;margin-left:-4px}
  .esp-barre__langue{padding:0 8px;min-height:24px;font-size:10px;letter-spacing:.06em}
  .esp-sortie{min-height:32px;padding:0 10px;font-size:12px}
  .esp-barre__droite{gap:8px}
}

/* ===========================================================================
   LE PANNEAU DE LECTURE
   Un texte long par-dessus la page, dans un cadre qu'on referme. Le texte
   défile dedans ; la page, derrière, ne bouge pas d'une ligne. Voir
   holangcours-apercu.js et le partial apercu.php.
   =========================================================================== */
.apercu{position:fixed;inset:0;z-index:200;display:flex;align-items:center;
        justify-content:center;padding:clamp(12px,4vw,40px)}
.apercu[hidden]{display:none}
.apercu__voile{position:absolute;inset:0;background:var(--hol-hero-scrim-a);
               backdrop-filter:blur(6px)}
.apercu__carte{position:relative;display:flex;flex-direction:column;
               width:100%;max-width:760px;max-height:100%;
               background:var(--hol-surface-1);border-radius:var(--hol-r-lg);
               box-shadow:var(--hol-shadow-3);overflow:hidden}
.apercu__haut{display:flex;align-items:center;gap:14px;flex:none;
              padding:18px 20px;border-bottom:1px solid var(--hol-border-subtle)}
.apercu__titre{flex:1 1 auto;margin:0;font-family:var(--hol-police-titre),sans-serif;
               font-weight:700;font-size:18px;letter-spacing:-.01em}
.apercu__fermer{flex:none;display:inline-flex;align-items:center;justify-content:center;
                width:38px;height:38px;padding:0;cursor:pointer;border:0;
                border-radius:var(--hol-r-sm);background:var(--hol-surface-0);
                color:var(--hol-text-secondary)}
.apercu__fermer:hover{background:var(--hol-brand-wash);color:var(--hol-brand)}
.apercu__fermer:focus-visible,.apercu__valider:focus-visible,
.apercu__entier:focus-visible{outline:none;
  box-shadow:0 0 0 2px var(--hol-surface-1),0 0 0 4px var(--hol-focus)}
/* LE TEXTE DÉFILE ICI, ET NULLE PART AILLEURS. */
.apercu__corps{flex:1 1 auto;overflow-y:auto;overscroll-behavior:contain;
               -webkit-overflow-scrolling:touch;padding:4px 20px 20px}
/* Le texte arrive d'une page entière : ses sections portent leurs propres
   marges, calculées pour une page. On les ramène à la taille du panneau. */
.apercu__corps section{padding:16px 0 !important}
.apercu__corps > *:first-child{margin-top:0}
.apercu__attente{margin:28px 0;text-align:center;color:var(--hol-text-muted);font-size:14.5px}
.apercu__bas{flex:none;display:flex;align-items:center;justify-content:space-between;
             gap:14px;flex-wrap:wrap;padding:14px 20px;
             border-top:1px solid var(--hol-border-subtle);background:var(--hol-surface-0)}
.apercu__entier{font-size:14px;font-weight:600;text-decoration:none}
.apercu__valider{min-height:42px;padding:0 20px;cursor:pointer;border:0;font:inherit;
                 font-weight:600;font-size:14.5px;border-radius:var(--hol-r-sm);
                 background:var(--hol-brand);color:var(--hol-text-inverse)}
.apercu__valider:hover{background:var(--hol-brand-hover)}

/* ===========================================================================
   L'ŒIL D'UN CHAMP DE MOT DE PASSE
   Le bouton se pose DANS le champ, à sa droite, et le champ lui réserve sa
   place : posé par-dessus le texte, il recouvrait la fin des mots de passe
   longs. La boîte et le bouton sont ajoutés par holangcours-oeil.js ; sans le
   script, rien de tout cela n'existe et le champ reste un champ ordinaire.
   =========================================================================== */
.hol-mdp{position:relative;display:block}
.hol-mdp > input{padding-right:52px}
.hol-oeil{position:absolute;top:0;right:0;height:100%;width:48px;
          display:inline-flex;align-items:center;justify-content:center;
          padding:0;border:0;background:none;cursor:pointer;
          color:var(--hol-text-muted);border-radius:var(--hol-r-sm)}
.hol-oeil:hover{color:var(--hol-brand)}
/* Montré, l'œil porte la couleur d'action : on voit d'un coup d'œil que le mot
   de passe est à découvert, et qu'un clic le referme. */
.hol-oeil[aria-pressed="true"]{color:var(--hol-brand)}
.hol-oeil:focus-visible{outline:none;
  box-shadow:0 0 0 2px var(--hol-surface-1),0 0 0 4px var(--hol-focus)}
.hol-oeil svg{display:block}
/* Le piège habituel : la règle du dessus bat celle du navigateur pour
   « hidden ». On la redit donc à la main, sinon les deux yeux s'affichent. */
.hol-oeil svg[hidden]{display:none}

/* LE ROND D'UN COMPTE : photo ou initiales, même forme, même place. */
.hol-avatar{flex:none;display:block;border-radius:var(--hol-r-pill);
            object-fit:cover;background:var(--hol-brand);
            color:var(--hol-text-inverse);border:1px solid var(--hol-border-on-dark)}
.hol-avatar--mot{display:flex;align-items:center;justify-content:center;
                 font-family:var(--hol-police-mono),ui-monospace,monospace;
                 font-weight:600;letter-spacing:.02em;line-height:1}

/* ---------------------------------------------------------------------------
   QUAND LA VIDÉO VIENT D'AILLEURS.

   Un lien YouTube ne se lit pas dans une balise vidéo : il faut son cadre, et
   avec son cadre viennent ses commandes. Le lecteur de la maison ne s'applique
   donc pas à ces leçons-là, et on ne fait pas semblant du contraire : pas de
   barre dessinée, pas de bouton qui ne commanderait rien.

   CE QUI RESTE DE NOUS : l'affiche avant le clic. Le rond bleu est celui du
   site, le même que sur la fiche de cours, et rien n'est demandé à YouTube
   tant qu'on ne l'a pas pressé.
   --------------------------------------------------------------------------- */
.lecteur-scene iframe{position:absolute;inset:0;width:100%;height:100%;
                      border:0;display:block}
.yt-affiche{position:absolute;inset:0;display:flex;flex-direction:column;
            align-items:center;justify-content:flex-end;gap:7px;
            width:100%;height:100%;padding:24px 32px 26px;border:0;cursor:pointer;
            font:inherit;text-align:center;color:var(--hol-text-inverse);
            background:var(--hol-surface-inverse)}
/* LE ROND AU MILIEU, LES MOTS EN BAS. Au centre, les mots tombaient sur le
   titre que l'auteur a dessiné dans sa miniature, et les deux se mangeaient.
   En bas, ils sont sur la partie la plus sombre du voile et sur la partie la
   plus calme de l'image. */
.yt-affiche__rond{position:absolute;top:50%;left:50%;
                  transform:translate(-50%,-50%)}
.yt-affiche:hover .yt-affiche__rond{transform:translate(-50%,-50%) scale(1.05)}
/* L'affiche de la vidéo en fond, sous un voile : sans lui, « Lire la vidéo »
   en blanc disparaît sur la moitié des miniatures, qui sont claires et
   chargées. Le voile s'épaissit vers le bas, là où se trouve le texte. */
/* LE VOILE S'ALLÈGE AVEC LE TEXTE QU'IL PROTÉGEAIT. Il était épais pour qu'une
   phrase blanche reste lisible au milieu de l'image ; cette phrase est partie,
   et il n'a plus qu'un rond bleu plein à soutenir. On rend donc la miniature à
   son auteur : c'est sa couverture, pas notre fond. */
.yt-affiche--image{background-image:
    linear-gradient(to bottom,
      var(--hol-hero-scrim-nul) 0%, var(--hol-hero-scrim-c) 100%),
    var(--yt-image);
  background-size:cover,cover;background-position:center,center;
  background-repeat:no-repeat,no-repeat}
.yt-affiche__rond{flex:none;display:flex;align-items:center;justify-content:center;
                  width:64px;height:64px;border-radius:var(--hol-r-pill);
                  background:var(--hol-brand);border:1px solid var(--hol-glass-hi);
                  box-shadow:var(--hol-shadow-3);color:var(--hol-text-inverse);
                  transition:transform var(--hol-dur) var(--hol-ease)}
.yt-affiche:hover .yt-affiche__rond{background:var(--hol-brand-hover)}
.yt-affiche__mot{font-family:var(--hol-police-titre),sans-serif;font-weight:700;
                 font-size:17px;letter-spacing:-.01em}
.yt-affiche__note{max-width:52ch;font-size:12.5px;line-height:1.55;
                  color:var(--hol-text-inverse-2)}
.yt-affiche:focus-visible{outline:none;box-shadow:inset 0 0 0 3px var(--hol-focus-inverse)}
@media (prefers-reduced-motion: reduce){
  .yt-affiche:hover .yt-affiche__rond{transform:translate(-50%,-50%)}
}
/* Sur un téléphone, le cadre ne fait plus que deux cent vingt pixels de haut :
   le rond au milieu et trois lignes en bas se touchent. La phrase explicative
   part, le nom du bouton reste. Ce qui disparaît ici se lit de toute façon dans
   le réglage, et une ligne qui chevauche le bouton n'informe personne. */
@media (max-width:620px){
  .yt-affiche{gap:5px;padding:16px 18px 16px}
  .yt-affiche__rond{width:54px;height:54px}
  .yt-affiche__mot{font-size:15px}
  .yt-affiche__note{display:none}
}

/* La barre d'une leçon YouTube ne porte que nos deux commandes : pas de piste
   d'avancement, pas de temps, rien qui ferait croire qu'on pilote la vidéo. */
.lecteur-barre--tiers{padding:8px 12px}
.lecteur-barre--tiers .lecteur-rang{margin-top:0}
.lecteur-barre{padding:10px 14px 12px;background:var(--hol-surface-inverse)}
/* LE RANG NE SE COUPE PAS EN DEUX.
   Avec treize commandes, le groupe de droite ne tient plus toujours à côté de
   celui de gauche. Quand les deux groupes avaient le droit de passer à la
   ligne, le groupe de droite tombait ENTIER au rang suivant : le premier rang
   restait aux trois quarts vide, et la barre avait l'air cassée.
   Le rang reste donc d'une seule pièce ; c'est le groupe de droite qui se
   replie à l'intérieur de la place qui lui reste, aligné à droite. La largeur
   est utilisée, et la barre a l'air voulue. */
.lecteur-rang{display:flex;align-items:center;justify-content:space-between;
              gap:10px 16px;flex-wrap:nowrap;margin-top:8px}
.lecteur-groupe{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.lecteur-groupe:first-child{flex:0 0 auto}
.lecteur-groupe--fin{flex:1 1 auto;min-width:0;justify-content:flex-end;
                     margin-left:auto}

/* « hidden » DOIT GAGNER. La règle qui suit pose « display:inline-flex » sur
   une classe, et une classe est plus forte que la règle « [hidden] » du
   navigateur : les commandes qu'on cachait restaient à l'écran, et seul le
   code croyait les avoir retirées. Le cas s'est vu sur une leçon sonore, où la
   plein écran n'a rien à régler. */
.lecteur-rond[hidden],.lecteur-bouton[hidden],.lecteur-vitesse[hidden],
.lecteur-piste[hidden],.lecteur-son[hidden]{display:none}
.lecteur-rond,.lecteur-bouton,.lecteur-vitesse{
  display:inline-flex;align-items:center;justify-content:center;gap:4px;
  cursor:pointer;font:inherit;border-radius:var(--hol-r-sm);
  background:transparent;color:var(--hol-text-inverse-1);
  border:1px solid transparent}
.lecteur-rond{width:44px;height:44px;border-radius:50%;
              background:var(--hol-text-inverse);color:var(--hol-surface-inverse)}
.lecteur-rond:hover{opacity:.9}
.lecteur-bouton{min-width:40px;height:38px;padding:0 10px;font-size:14px}
.lecteur-bouton--mot{font-size:12.5px;font-weight:600}
.lecteur-bouton:hover,.lecteur-vitesse:hover{background:var(--hol-surface-sur-sombre,rgba(255,255,255,.12));
                                             color:var(--hol-text-inverse)}
/* Le bouton du son ne s'allume pas en plein quand il est coupé : l'icône le
   dit déjà, avec sa croix. Un bouton blanc dirait « actif », ce qui serait le
   contraire. Les autres boutons à deux états, eux, gardent le plein. */
.lecteur-bouton[aria-pressed="true"]{background:var(--hol-text-inverse);color:var(--hol-surface-inverse)}
.lecteur-bouton.lecteur-son-bouton[aria-pressed="true"]{background:transparent;
                                                        color:var(--hol-text-inverse-2)}
/* Le nombre de secondes se tient à côté de la flèche, dans la mono du site.
   Il était autrefois collé à un caractère de texte en guise d'icône ; la
   flèche est maintenant dessinée, le nombre seul est resté. */
.lecteur-saut__n{font-family:var(--hol-police-mono),monospace;font-size:10.5px;font-weight:600}

/* L'AVANCE QU'ON TIENT SOUS LE DOIGT.
   Un bouton qu'on MAINTIENT, et non qu'on enclenche. Deux détails le font
   tenir dans la main : la sélection de texte est coupée, sans quoi un appui
   un peu long surligne l'icône en bleu système au lieu d'avancer la vidéo ;
   et le délai de trois cents millisecondes que les téléphones gardent pour
   deviner un double-tapotement est levé, sans quoi le geste part en retard.
   Le plein de l'état « tenu » vient de la règle « aria-pressed » commune. */
.lecteur-presse{-webkit-user-select:none;-moz-user-select:none;user-select:none;
                -webkit-touch-callout:none;touch-action:manipulation}

.lecteur-temps{flex:none;font-family:var(--hol-police-mono),monospace;font-size:12px;
               color:var(--hol-text-inverse-2);font-variant-numeric:tabular-nums;
               white-space:nowrap}

.lecteur-vitesses{display:flex;align-items:center;gap:3px;flex-wrap:wrap}
.lecteur-vitesses__mot{font-family:var(--hol-police-mono),monospace;font-size:10.5px;
                       letter-spacing:.1em;text-transform:uppercase;
                       color:var(--hol-text-inverse-2);margin-right:4px}
.lecteur-vitesse{height:30px;padding:0 9px;font-family:var(--hol-police-mono),monospace;
                 font-size:11.5px;font-weight:600}
/* La vitesse choisie est pleine : une bordure seule se perd sur fond sombre. */
.lecteur-vitesse[aria-pressed="true"]{background:var(--hol-text-inverse);
                                      color:var(--hol-surface-inverse)}

/* LES DEUX GLISSIÈRES sont celles du navigateur, rhabillées : une glissière
   refaite à la main perd le clavier, le doigt et le lecteur d'écran.

   LA PART DÉJÀ LUE PORTE LES COULEURS DE LA MAISON, du bleu clair au rouge.
   Une barre rouge pleine disait « attention » ; ce dégradé-là dit le chemin
   parcouru, et il met la couleur d'identité juste sous la tête de lecture,
   c'est-à-dire à l'endroit exact que l'œil cherche. C'est le même geste que la
   marque de section : du bleu vers le rouge, dans le sens de la lecture.

   Le volume se remplit aussi, mais d'un bleu clair uni : c'est un réglage,
   pas une progression, et il ne doit pas disputer l'œil à la ligne du
   temps. */
.lecteur-piste,.lecteur-son{-webkit-appearance:none;appearance:none;
                            height:6px;border-radius:3px;cursor:pointer;
                            background:var(--hol-surface-sur-sombre,rgba(255,255,255,.22))}
.lecteur-piste-rang{position:relative;display:flex;align-items:center;gap:13px}
/* L'heure du point qu'on vise, au-dessus de la poignée. Elle ne prend aucune
   place dans le rang : elle flotte, et le clic la traverse. */
.lecteur-bulle{position:absolute;bottom:calc(100% + 9px);transform:translateX(-50%);
               pointer-events:none;white-space:nowrap;z-index:2;
               padding:4px 9px;border-radius:var(--hol-r-sm);
               font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:11.5px;
               font-weight:600;font-variant-numeric:tabular-nums;
               color:var(--hol-surface-inverse);background:var(--hol-text-inverse);
               box-shadow:var(--hol-shadow-2)}
/* Une pointe, pour qu'on sache de quel point elle parle. */
.lecteur-bulle::after{content:"";position:absolute;top:100%;left:50%;
                      width:0;height:0;margin-left:-5px;
                      border:5px solid transparent;
                      border-top-color:var(--hol-text-inverse)}
.lecteur-piste{flex:1 1 auto;min-width:0;display:block;width:100%;height:7px;
               background:linear-gradient(to right,
                   var(--hol-brand-clair), var(--hol-accent))
                 left center / var(--part,0%) 100% no-repeat,
               var(--hol-surface-sur-sombre)}
.lecteur-son{
  background:linear-gradient(to right,
      var(--hol-brand-clair), var(--hol-brand-clair))
    left center / var(--part,0%) 100% no-repeat,
  var(--hol-surface-sur-sombre);
  width:84px;flex:none}
.lecteur-piste::-webkit-slider-thumb,.lecteur-son::-webkit-slider-thumb{
  -webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;
  background:var(--hol-text-inverse);border:0;cursor:pointer}
.lecteur-piste::-moz-range-thumb,.lecteur-son::-moz-range-thumb{
  width:14px;height:14px;border-radius:50%;background:var(--hol-text-inverse);
  border:0;cursor:pointer}
.lecteur-piste:focus-visible,.lecteur-son:focus-visible{
  outline:2px solid var(--hol-text-inverse);outline-offset:3px}

/* ---------------------------------------------------------------------------
   LA BARRE AVANT LE MÉDIA.

   Une leçon en préparation montre sa vraie forme : la barre est posée, et
   toutes ses commandes sont éteintes, attribut « disabled » compris. Rien ne
   fait semblant de marcher, et l'on voit du premier coup d'œil qu'il ne manque
   qu'une chose, le fichier.
   --------------------------------------------------------------------------- */
/* LE PLAFOND DU LECTEUR A CHANGÉ D'ÉCHELLE.

   Il était posé sur le lecteur éteint seul, pour qu'il cesse d'être un
   rectangle noir de neuf cents pixels de haut. Mais un cadre plus étroit que sa
   colonne laisse du vide à sa droite, et ce qu'il contient paraît alors décalé
   vers la gauche : l'onde sonore et le message étaient pourtant centrés, au
   pixel, DANS LE CADRE.

   C'est donc la colonne entière qui est bornée maintenant, dans « lecon.php » :
   le titre, le lecteur et les cartes partagent la même largeur, le cadre la
   remplit, et plus rien ne flotte. */
/* LE CADRE VIDE SE RÈGLE SUR LA FENÊTRE, PAS SUR LA COLONNE.

   CE QU'ON RÉPARE, ET CE QU'ON NE TOUCHE PAS. Le lecteur réel garde ses seize
   neuvièmes et toute la largeur de la colonne : c'est le gabarit validé, il ne
   bouge pas. Seul le cadre VIDE est concerné, celui qui dit « le média n'est pas
   encore déposé ».

   POURQUOI LUI SEUL. Seize neuvièmes d'une colonne de treize cents pixels font
   sept cent quarante-six de haut. Pour une vraie vidéo c'est tant mieux, on est
   venu la voir. Pour une phrase de huit mots, c'est un mur sombre qui pousse la
   leçon hors de l'écran, et chez un locataire dont les vidéos ne sont pas encore
   déposées, c'est toute la page qui en souffre.

   UNE HAUTEUR DE FENÊTRE, DONC, comme le lecteur d'une vidéo verticale, qui se
   borne déjà ainsi : le cadre occupe une part de l'écran et non une part de la
   largeur. « min-height » empêche qu'il devienne une fente sur un portable posé
   à plat. */
.lecteur--eteint .lecteur-scene--vide{height:52vh;min-height:260px;padding-bottom:0}
.lecteur-scene--vide{background:var(--hol-surface-inverse)}
.lecteur-vide{position:absolute;inset:0;display:flex;flex-direction:column;
              align-items:center;justify-content:center;gap:8px;
              padding:24px 32px;text-align:center}
.lecteur-vide__mot{margin:0;font-size:14.5px;line-height:1.6;
                   color:var(--hol-text-inverse-2)}
.lecteur-vide__note{margin:0;font-family:var(--hol-police-mono),monospace;font-size:10.5px;
                    letter-spacing:.09em;line-height:1.5;
                    color:var(--hol-text-inverse-2);opacity:.68}

.lecteur-rond:disabled,.lecteur-bouton:disabled,.lecteur-vitesse:disabled,
.lecteur-piste:disabled,.lecteur-son:disabled{
  opacity:.38;cursor:not-allowed}
/* Éteint, un bouton ne réagit plus au survol : réagir serait promettre. */
.lecteur-bouton:disabled:hover,.lecteur-vitesse:disabled:hover{
  background:transparent;color:var(--hol-text-inverse-1)}
.lecteur-vitesse:disabled[aria-pressed="true"]{background:var(--hol-text-inverse);
                                               color:var(--hol-surface-inverse)}

/* Sur un téléphone, la barre se replie en deux rangs plutôt que de tout
   serrer : le mot « Vitesse » part, les chiffres restent. */
/* UN CRAN INTERMÉDIAIRE, avant le téléphone.
   Entre 620 et 1200 px, la barre manque d'une trentaine de pixels pour tenir
   sur une ligne, et il suffit d'un bouton qui déborde pour qu'un deuxième rang
   s'ouvre avec un seul bouton dedans : ça se voit, et ça fait négligé. On
   resserre donc un peu avant d'en arriver là. */
@media (max-width:1200px){
  .lecteur-son{width:72px}
  .lecteur-vitesse{padding:0 7px}
  .lecteur-groupe{gap:7px}
}

/* Sur un téléphone, la barre porte les mêmes commandes, plus serrées : treize
   commandes sur quatre rangs mangeaient un tiers de l'écran, et le dernier
   rang ne portait qu'un seul bouton. On rapetisse plutôt que de retirer : ce
   qui disparaît sur un petit écran ne se retrouve jamais. */
@media (max-width:620px){
  /* Sur un téléphone, la place à droite est si mince que replier à l'intérieur
     n'aurait plus de sens : les deux groupes reprennent le droit de se mettre
     l'un sous l'autre. */
  .lecteur-rang{flex-wrap:wrap}
  .lecteur-groupe--fin{flex:1 1 100%;justify-content:flex-start}
  .lecteur-vitesses__mot{display:none}
  .lecteur-son{width:64px}
  .lecteur-groupe--fin{margin-left:0}
  .lecteur-groupe{gap:6px}
  .lecteur-rang{gap:8px 10px;margin-top:6px}
  .lecteur-rond{width:40px;height:40px}
  .lecteur-bouton{min-width:34px;height:34px;padding:0 8px}
  .lecteur-bouton--mot{font-size:11.5px;padding:0 9px}
  .lecteur-vitesse{height:28px;padding:0 7px;font-size:11px}
  .lecteur-barre{padding:9px 11px 11px}
}

/* ═══════════════════════════════════════════════════════════════════════════
   CARTES OU LISTE : LE REGISTRE ET SA COMMANDE DE VUE
   ───────────────────────────────────────────────────────────────────────────
   DEUX MISES EN PAGE, UN SEUL BALISAGE. Les écrans d'administration montrent
   tous la même chose : des personnes, des dossiers, chacun avec un visage, un
   nom, deux repères de date et un état. À six, on veut les voir ; à deux cents,
   on veut les parcourir. Seule la classe du conteneur change, et c'est ce qui
   garantit qu'aucune information ne disparaît en changeant de vue.

   L'ENTRÉE EST UN LIEN ENTIER, pas une ligne avec un lien dedans. On clique où
   l'on veut sur la ligne, comme on ouvre un dossier : viser un nom de douze
   pixels à la souris est un exercice, pas une navigation.

   AUCUN FILET DE COULEUR À GAUCHE, ici comme partout ailleurs sur ce site.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── La commande de vue ──────────────────────────────────────────────────── */
.hol-scope .hol-vues{display:inline-flex;align-items:center;gap:2px;padding:3px;
                     background:var(--hol-surface-0);border:1px solid var(--hol-border-subtle);
                     border-radius:var(--hol-r-pill)}
.hol-scope .hol-vues__btn{display:inline-flex;align-items:center;justify-content:center;
                          width:34px;height:30px;border-radius:var(--hol-r-pill);
                          color:var(--hol-text-muted);text-decoration:none;
                          transition:background .16s ease,color .16s ease}
.hol-scope .hol-vues__btn:hover{background:var(--hol-surface-1);color:var(--hol-text-primary)}
/* LA VUE ACTIVE SE VOIT AU FOND, PAS À LA COULEUR DU TRAIT : une icône bleue
   parmi des grises se lit comme un bouton d'action, pas comme un état. */
.hol-scope .hol-vues__btn[aria-current]{background:var(--hol-surface-1);
                                        color:var(--hol-text-primary);
                                        box-shadow:var(--hol-shadow-1)}

/* ── Le registre ─────────────────────────────────────────────────────────── */
.hol-scope .hol-rang{display:grid;gap:0}
.hol-scope .hol-rang__item{display:grid;align-items:center;gap:4px 14px;
                           color:inherit;text-decoration:none;min-width:0}
.hol-scope .hol-rang__item:hover{color:inherit}
.hol-scope .hol-rang__tete{flex:none;line-height:0}
.hol-scope .hol-rang__mots{min-width:0}
/* « display:block » sur des étiquettes de ligne : le balisage est fait de
   « span », parce que l'entrée entière est un lien et qu'un lien ne peut pas
   contenir de paragraphe. Sans cela, le nom et la date se suivraient sur la
   même ligne. */
.hol-scope .hol-rang__nom{display:block;margin:0;font-size:15.5px;font-weight:600;
                          line-height:1.35;overflow:hidden;text-overflow:ellipsis;
                          white-space:nowrap}
.hol-scope .hol-rang__meta{display:block;margin:3px 0 0;
                           font-family:var(--hol-police-mono),ui-monospace,monospace;
                           font-size:11.5px;line-height:1.5;color:var(--hol-text-muted)}
.hol-scope .hol-rang__avance{display:block;min-width:0}
.hol-scope .hol-rang__avance > .adc-jauge{display:block}
.hol-scope .hol-rang__avance > .adc-inscrit__pct{display:flex}
.hol-scope .hol-rang__etat{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
/* Le chevron ne dit pas « cliquable », il dit « cela s'ouvre ailleurs ». Il
   avance d'un cheveu au survol, assez pour répondre, pas assez pour sauter. */
.hol-scope .hol-rang__ouvre{flex:none;color:var(--hol-text-muted);line-height:0;
                            transition:transform .16s ease,color .16s ease}
.hol-scope .hol-rang__item:hover .hol-rang__ouvre{transform:translateX(2px);
                                                  color:var(--hol-text-primary)}

/* ── En liste : un registre ──────────────────────────────────────────────── */
.hol-scope .hol-rang--liste .hol-rang__item{
  grid-template-columns:auto minmax(0,1fr) auto auto auto;
  padding:11px 10px;border-radius:var(--hol-r-sm);
  border-bottom:1px solid var(--hol-border-subtle)}
/* La colonne d'avancement a une largeur fixe, et c'est voulu : une barre qui
   change de longueur d'une ligne à l'autre ne se compare plus d'un coup d'œil,
   or c'est exactement ce qu'on vient y chercher. */
.hol-scope .hol-rang--liste .hol-rang__avance{width:164px}
.hol-scope .hol-rang--liste .hol-rang__item:last-child{border-bottom:none}
.hol-scope .hol-rang--liste .hol-rang__item:hover{background:var(--hol-surface-0)}
.hol-scope .hol-rang--liste .hol-rang__item:focus-visible{background:var(--hol-surface-0)}

/* ── En cartes : des fiches ──────────────────────────────────────────────── */
/* « auto-fill » et non « auto-fit » : à deux fiches, auto-fit les étirerait sur
   toute la largeur et une fiche isolée ferait un bandeau. */
.hol-scope .hol-rang--cartes{grid-template-columns:repeat(auto-fill,minmax(248px,1fr));
                             gap:14px}
.hol-scope .hol-rang--cartes .hol-rang__item{
  grid-template-columns:auto minmax(0,1fr) auto;
  align-content:start;align-items:start;gap:12px;
  padding:16px;background:var(--hol-surface-1);
  border:1px solid var(--hol-border-subtle);border-radius:var(--hol-r-sm);
  transition:border-color .16s ease,box-shadow .16s ease}
.hol-scope .hol-rang--cartes .hol-rang__item:hover{border-color:var(--hol-brand);
                                                   box-shadow:var(--hol-shadow-1)}
/* L'état passe sous le nom et prend toute la largeur de la fiche : à côté, il
   la couperait en deux colonnes trop étroites pour l'une comme pour l'autre. */
.hol-scope .hol-rang--cartes .hol-rang__etat,
.hol-scope .hol-rang--cartes .hol-rang__avance{grid-column:1 / -1;margin-top:2px}
/* Le chevron reste en haut à droite de la fiche, à côté du nom. Laissé à sa
   place dans le flux, il tombait seul sous l'état, tout en bas à gauche, et ne
   désignait plus rien. */
.hol-scope .hol-rang--cartes .hol-rang__ouvre{grid-row:1;grid-column:3;margin-top:2px}
.hol-scope .hol-rang--cartes .hol-rang__nom{white-space:normal}

/* ── Sur un téléphone ────────────────────────────────────────────────────── */
/* La liste perd sa quatrième colonne et laisse l'état passer sous le nom : à
   360 px, quatre colonnes donnent quatre colonnes illisibles. */
@media (max-width:600px){
  .hol-scope .hol-rang--liste .hol-rang__item{grid-template-columns:auto minmax(0,1fr) auto}
  .hol-scope .hol-rang--liste .hol-rang__etat,
  .hol-scope .hol-rang--liste .hol-rang__avance{grid-column:2 / -1;width:auto;margin-top:5px}
  /* Le chevron reste sur la première ligne, à droite du nom : repoussé en bas
     par les éléments qui passent à la ligne, il ne désignait plus rien. */
  .hol-scope .hol-rang--liste .hol-rang__ouvre{grid-row:1;grid-column:3}
  .hol-scope .hol-rang--cartes{grid-template-columns:1fr}
}


/* ═══════════════════════════════════════════════════════════════════════════
   LE DOSSIER D'UNE ATTESTATION (.adv-*)

   DEUX ÉCRANS S'EN SERVENT : la file d'attente, qui en montre l'identité et
   l'état, et le dossier lui-même, qui ajoute le relevé et la décision. Les
   styles sont ici pour que les deux disent la même chose de la même façon ;
   recopiés dans chaque page, ils auraient divergé au premier ajustement.
   ═══════════════════════════════════════════════════════════════════════════ */
  /* ═══ LA CARTE D'UN DOSSIER ═══════════════════════════════════════════
     CE QU'ON REGARDE, DANS L'ORDRE. Qui c'est, quel parcours, ce qui va se
     passer si personne ne touche à rien, puis le relevé, puis la décision.
     L'écran est bâti sur cet ordre-là, et non sur ce qui tenait le mieux.

     AUCUN TRAIT DE COULEUR À GAUCHE. Il y en a eu un ici, et c'est la
     signature visuelle qu'on retrouve sur tous les sites bâclés. Elle est
     bannie du site entièrement. Ce qui demande un regard se dit par sa
     pastille, en toutes lettres, et par le bandeau qui suit.
     ------------------------------------------------------------------- */
  .adv-carte{background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
             border-radius:var(--hol-r-lg);box-shadow:var(--hol-shadow-1);overflow:hidden}

  /* ── L'identité du dossier ─────────────────────────────────────────── */
  .adv-haut{display:flex;gap:16px;align-items:flex-start;padding:22px 24px 18px}
  @media (max-width:620px){ .adv-haut{padding:18px 16px 14px;gap:12px} }
  .adv-visage{flex:none}
  .adv-visage img,.adv-visage span{border-radius:var(--hol-r-sm)}
  .adv-qui{flex:1 1 auto;min-width:0}
  .adv-nom{margin:0 0 4px;font-family:var(--hol-police-titre),sans-serif;font-weight:800;
           font-size:19px;line-height:1.2;letter-spacing:-.01em;overflow-wrap:break-word}
  .adv-cours{margin:0 0 9px;font-size:14.5px;line-height:1.4;color:var(--hol-text-secondary)}
  /* LES FAITS DU DOSSIER, à chasse fixe et séparés par des points : un niveau
     et une date se lisent en diagonale, pas en phrase. */
  .adv-faits{display:flex;flex-wrap:wrap;gap:6px 14px;margin:0;
             font-family:var(--hol-police-mono),monospace;font-size:11.5px;
             line-height:1.5;color:var(--hol-text-muted)}
  .adv-faits strong{color:var(--hol-text-primary);font-weight:600}

  .adv-etat{display:inline-flex;align-items:center;gap:8px;flex:none;
            padding:7px 14px;border-radius:var(--hol-r-pill);
            font-size:12.5px;font-weight:600;line-height:1.3;white-space:nowrap}
  .adv-etat__point{width:7px;height:7px;border-radius:50%;background:currentColor}
  .adv-etat--doute{background:var(--hol-alerte-wash);color:var(--hol-alerte)}
  .adv-etat--calme{background:var(--hol-succes-wash);color:var(--hol-succes)}
  @media (max-width:620px){ .adv-haut{flex-wrap:wrap} .adv-etat{order:3} }

  /* ── CE QUI VA SE PASSER SI PERSONNE NE TOUCHE À RIEN ───────────────
     La question qu'on se pose vraiment en ouvrant cet écran, et elle ne se
     devine pas : trois dossiers côte à côte peuvent avoir trois avenirs. Ce
     bandeau la répond d'une ligne, et sa teinte reprend celle de la pastille,
     sans jamais remplacer les mots. */
  .adv-suite{display:flex;align-items:center;gap:10px;margin:0;
             padding:11px 24px;font-size:13.5px;line-height:1.45;font-weight:500;
             border-top:1px solid var(--hol-border-subtle);
             border-bottom:1px solid var(--hol-border-subtle)}
  @media (max-width:620px){ .adv-suite{padding:11px 16px} }
  .adv-suite--retenue{background:var(--hol-alerte-wash);color:var(--hol-alerte)}
  .adv-suite--passe{background:var(--hol-brand-wash);color:var(--hol-brand)}
  .adv-suite--calme{background:var(--hol-surface-0);color:var(--hol-text-secondary)}
  .adv-suite svg{flex:none}

  /* ── LE RELEVÉ ──────────────────────────────────────────────────────
     UN TABLEAU DE FAITS, PAS UN VERDICT. Chaque ligne porte un libellé en
     clair et une valeur alignée à droite : on lit la colonne de droite en
     diagonale, et l'on s'arrête sur ce qui dépasse. Les chiffres sont à
     chasse fixe et à largeur égale, sinon les valeurs dansent d'une ligne à
     l'autre et la colonne cesse d'être une colonne. */
  .adv-releve{padding:20px 24px 22px}
  @media (max-width:620px){ .adv-releve{padding:16px} }
  .adv-releve__titre{display:flex;align-items:center;gap:9px;margin:0 0 4px;
                     font-family:var(--hol-police-mono),monospace;font-size:10.5px;
                     letter-spacing:.14em;text-transform:uppercase;
                     color:var(--hol-text-muted)}
  .adv-point{display:flex;align-items:baseline;justify-content:space-between;gap:18px;
             padding:11px 12px;margin:0 -12px;border-radius:var(--hol-r-sm);
             font-size:14.5px;line-height:1.45}
  .adv-point + .adv-point{box-shadow:inset 0 1px 0 var(--hol-border-subtle)}
  .adv-point__mot{color:var(--hol-text-secondary);display:flex;align-items:baseline;gap:9px}
  .adv-point__val{font-family:var(--hol-police-mono),monospace;font-size:14px;font-weight:600;
                  font-variant-numeric:tabular-nums;white-space:nowrap}
  /* CE QUI DÉPASSE PORTE UN FOND, UN POINT ET UNE COULEUR, les trois ensemble.
     La couleur seule ne se lit pas quand on ne distingue pas les couleurs ; le
     point marque la ligne même en noir et blanc, et à l'impression. */
  .adv-point--doute{background:var(--hol-alerte-wash)}
  .adv-point--doute + .adv-point,.adv-point--doute{box-shadow:none}
  .adv-point--doute .adv-point__mot,.adv-point--doute .adv-point__val{color:var(--hol-alerte)}
  .adv-point__puce{flex:none;width:6px;height:6px;border-radius:50%;
                   background:currentColor;transform:translateY(-3px)}

  /* L'avertissement : il compte autant que le relevé, et il se lit moins fort
     que lui. Un encadré d'alerte aurait dit le contraire de ce qu'il dit. */
  .adv-note{display:flex;gap:11px;align-items:flex-start;margin:16px 0 0;
            padding:13px 15px;border-radius:var(--hol-r-sm);
            background:var(--hol-surface-0);border:1px solid var(--hol-border-subtle)}
  .adv-note svg{flex:none;margin-top:2px;color:var(--hol-text-muted)}
  .adv-note p{margin:0;font-size:12.5px;line-height:1.65;color:var(--hol-text-muted)}

  /* ── LA DÉCISION ────────────────────────────────────────────────────
     DEUX GESTES, ET ILS N'ONT PAS LE MÊME POIDS. Délivrer est le geste
     courant : bouton plein. Ne pas délivrer demande d'écrire un motif, donc
     ouvre un volet plutôt que de partir au premier clic. Sans script, le volet
     est déjà ouvert et les deux boutons marchent : la page ne dépend de rien. */
  /* LA BARRE DE DÉCISION APPARTIENT À LA CARTE : même fond qu'elle, et un
     filet net au-dessus. Posée sur le gris du bloc d'avertissement, elle s'y
     collait et l'on ne savait plus où finissait la lecture et où commençait le
     geste. */
  .adv-decision{padding:18px 24px 22px;background:var(--hol-surface-1);
                border-top:1px solid var(--hol-border-subtle)}
  @media (max-width:620px){ .adv-decision{padding:16px} }
  .adv-gestes{display:flex;gap:12px;flex-wrap:wrap;align-items:center}
  .adv-refus{margin-top:16px;padding-top:16px;border-top:1px solid var(--hol-border-subtle)}
  .adv-refus[hidden]{display:none}
  .adv-rien{padding:38px 26px;text-align:center;font-size:15px;color:var(--hol-text-muted)}

/* La file d'attente : la commande de vue, et le mot qui dit l'échéance.
   ───────────────────────────────────────────────────────────────────────────
   L'ÉCHÉANCE TIENT EN DEUX MOTS DANS LA FILE et en une phrase dans le dossier.
   Lue vingt fois de suite, la phrase devient du bruit ; le mot court se compare
   d'une ligne à l'autre, et la phrase attend qu'on entre. */
.hol-scope .adv-rang{display:flex;justify-content:flex-end;margin:0 0 14px}
.hol-scope .adv-quand{font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:11.5px;
                      font-weight:600;white-space:nowrap;color:var(--hol-text-muted)}
.hol-scope .adv-quand--retenue{color:var(--hol-alerte)}
.hol-scope .adv-quand--passe{color:var(--hol-brand)}

/* ═══════════════════════════════════════════════════════════════════════════
   LA QUESTION QUI S'OUVRE DANS LA VIDÉO (.jal-*)

   ELLE SE POSE DANS L'ÉCRAN, et pas sous la vidéo : c'est tout l'intérêt.
   L'image s'efface derrière un voile, la question prend sa place, et l'on
   revient à la vidéo d'un bouton. Déplacée hors du cadre, elle aurait demandé
   de baisser les yeux, et l'on aurait perdu le fil de ce qu'on regardait.

   LE VOILE EST SOMBRE ET OPAQUE : la dernière image de la vidéo derrière un
   texte blanc, c'est un texte illisible une fois sur deux, selon la scène.

   AUCUN FILET DE COULEUR À GAUCHE, ici comme partout ailleurs sur ce site.
   ═══════════════════════════════════════════════════════════════════════════ */
.hol-scope .jal-voile{position:absolute;inset:0;z-index:5;
                      display:flex;align-items:center;justify-content:center;
                      padding:18px;overflow-y:auto;
                      background:var(--hol-hero-scrim-a)}
.hol-scope .jal-voile[hidden]{display:none}
.hol-scope .jal-boite{width:100%;max-width:520px;text-align:left;
                      color:var(--hol-text-inverse)}
.hol-scope .jal-haut{margin:0 0 8px;font-family:var(--hol-police-mono),ui-monospace,monospace;
                     font-size:11px;letter-spacing:.14em;text-transform:uppercase;
                     opacity:.72}
.hol-scope .jal-enonce{margin:0 0 14px;font-family:var(--hol-police-titre),sans-serif;
                       font-weight:700;font-size:clamp(17px,2.4vw,21px);line-height:1.3;
                       text-wrap:balance}
/* L'image garde sa hauteur sous contrôle : une photo verticale pousserait les
   réponses hors du cadre, et l'on répondrait sans les voir. */
.hol-scope .jal-image{display:block;width:100%;max-height:34vh;object-fit:contain;
                      margin:0 0 14px;border-radius:var(--hol-r-sm);background:var(--hol-verre-creux)}
.hol-scope .jal-choix{display:flex;flex-direction:column;gap:8px}
/* DES BOUTONS, PAS DES CASES À COCHER. On répond d'un seul geste, souvent au
   doigt, et il n'y a rien à valider ensuite : viser un rond de dix-huit pixels
   puis chercher « Valider » aurait coûté deux gestes et une hésitation. */
.hol-scope .jal-choix__btn{display:block;width:100%;text-align:left;
                           min-height:46px;padding:11px 15px;
                           font:inherit;font-size:15px;line-height:1.4;cursor:pointer;
                           color:var(--hol-text-inverse);
                           background:var(--hol-verre-fond);border:1px solid var(--hol-verre-bord);
                           border-radius:var(--hol-r-sm);
                           transition:background .14s ease,border-color .14s ease}
.hol-scope .jal-choix__btn:hover{background:var(--hol-verre-fond-vif);border-color:var(--hol-verre-bord-vif)}
.hol-scope .jal-choix__btn[disabled]{cursor:default;opacity:.5}
.hol-scope .jal-choix__btn.est-choisi{opacity:1;background:var(--hol-verre-fond-vif);border-color:var(--hol-verre-bord-vif)}
/* LE VERDICT PORTE UN MOT, jamais une couleur seule : qui ne distingue pas les
   teintes lit la même chose que les autres. */
.hol-scope .jal-verdict{margin:14px 0 0;font-size:15.5px;font-weight:700}
.hol-scope .jal-verdict--juste{color:var(--hol-succes-clair)}
.hol-scope .jal-verdict--faux{color:var(--hol-alerte-clair)}
.hol-scope .jal-expl{margin:6px 0 0;font-size:14px;line-height:1.55;opacity:.84}
.hol-scope .jal-suite{display:inline-flex;align-items:center;min-height:46px;
                      margin-top:16px;padding:0 20px;cursor:pointer;
                      font:inherit;font-size:15px;font-weight:600;
                      color:var(--hol-text-primary);background:var(--hol-surface-1);
                      border:0;border-radius:var(--hol-r-sm)}

/* L'image d'une question, sous la vidéo cette fois : même rôle, autre décor. */
.hol-scope .lec-q-image{display:block;width:100%;max-width:420px;max-height:260px;
                        object-fit:contain;margin:0 0 12px;
                        border-radius:var(--hol-r-sm);background:var(--hol-surface-0)}

/* ───────────────────────────────────────────────────────────────────────────
   ÉCOUTER LA QUESTION (.lec-ecoute)

   UN ROND DE LA TAILLE D'UN MOT, posé au bout de l'énoncé. Il ne prend pas de
   ligne à lui tout seul : la question se lit d'une traite, et l'oreille est
   proposée au passage, pas imposée avant.

   IL EST BLEU PARCE QUE C'EST UNE ACTION. L'identité rouge ne commande jamais
   rien, et réécouter une question est bien une commande.
   ─────────────────────────────────────────────────────────────────────────── */
.hol-scope .lec-ecoute{display:inline-flex;align-items:center;justify-content:center;
                       gap:5px;height:26px;padding:0 10px;margin-left:10px;
                       /* CALÉ SUR LE MILIEU OPTIQUE DE LA LIGNE, mesuré et non
                          deviné : à -0,42 em il tombait cinq pixels trop bas et
                          la ligne paraissait boiteuse. En em, et non en pixels,
                          pour qu'il suive la taille du texte qui l'accueille,
                          l'énoncé de l'exercice comme celui du calque vidéo. */
                       vertical-align:-0.06em;
                       border-radius:999px;text-decoration:none;flex:none;
                       color:var(--hol-brand);background:var(--hol-brand-wash);
                       border:1px solid var(--hol-border-subtle)}
/* L'OREILLE DIT CE QUE LE TRIANGLE NE DIT PAS. Un triangle de lecture seul se
   lit « vidéo » ; accompagné d'une oreille, il ne peut plus vouloir dire autre
   chose qu'écouter. Deux dessins pour un seul bouton, et c'est le minimum
   quand le bouton mesure vingt-six pixels. */
.hol-scope .lec-ecoute__oreille{flex:none}
.hol-scope .lec-ecoute:hover{color:var(--hol-text-inverse);background:var(--hol-brand);
                             border-color:var(--hol-brand)}
.hol-scope .lec-ecoute svg{display:block}
/* EN TRAIN DE JOUER, il s'allume et il respire : sur un écran de téléphone, un
   son qui part sans rien changer à l'image fait croire que rien n'est arrivé. */
.hol-scope .lec-ecoute[data-joue]{color:var(--hol-text-inverse);background:var(--hol-brand);
                                  border-color:var(--hol-brand)}
@media (prefers-reduced-motion:no-preference){
  .hol-scope .lec-ecoute[data-joue]{animation:lec-ecoute-souffle 1.6s ease-in-out infinite}
}
@keyframes lec-ecoute-souffle{
  0%,100%{box-shadow:0 0 0 0 var(--hol-brand-wash)}
  50%    {box-shadow:0 0 0 5px var(--hol-brand-wash)}
}

/* ───────────────────────────────────────────────────────────────────────────
   LA FICHE DE LA LEÇON (.lec-fiche)

   C'ÉTAIT UNE MENTION GRISE QUI NE CLIQUAIT PAS. Elle annonçait « télécharger »
   et ne téléchargeait rien : la pire sorte de commande, celle qui use la
   confiance sans qu'on sache pourquoi. C'est un bouton, et il rend un fichier.
   ─────────────────────────────────────────────────────────────────────────── */
.hol-scope .lec-fiche{display:inline-flex;align-items:center;gap:7px;flex:none;
                      min-height:34px;padding:0 14px;border-radius:var(--hol-r-sm);
                      font-size:12.5px;font-weight:600;text-decoration:none;
                      color:var(--hol-brand);background:var(--hol-brand-wash);
                      border:1px solid var(--hol-border-subtle)}
.hol-scope .lec-fiche:hover{color:var(--hol-text-inverse);background:var(--hol-brand);
                            border-color:var(--hol-brand)}
.hol-scope .lec-fiche svg{flex:none}
@media (max-width:520px){
  .hol-scope .lec-fiche{padding:0 11px;font-size:12px}
}

@media (max-width:600px){
  .hol-scope .jal-voile{padding:14px}
  .hol-scope .jal-image{max-height:26vh}
  .hol-scope .jal-suite{width:100%;justify-content:center}
}

/* LA QUESTION POUSSE LE LECTEUR, SUR PETIT ÉCRAN SEULEMENT.
   Un cadre vidéo fait seize neuvièmes de sa largeur : deux cent dix pixels sur
   un téléphone. Un énoncé et trois réponses n'y tiennent pas, et la dernière
   se retrouvait coupée au bas du cadre. Ici, le voile reprend sa place dans le
   flux et le cadre prend la hauteur qu'il faut. Sur un écran large, tout tient
   dans l'image et le lecteur ne bouge pas d'un pixel : c'est pour cela que la
   règle est sous condition de largeur. */
@media (max-width:700px){
  /* SAUF SI LA VIDÉO EST DÉJÀ VERTICALE : son cadre fait alors cinq cent
     soixante pixels de haut sur un téléphone, et la question en demande deux
     cent quarante. Lui laisser prendre la hauteur du texte ferait rétrécir
     l'image de moitié le temps de répondre, puis la ferait regrandir : un
     sursaut pour rien. Là, la question se pose par-dessus, et c'est tout. */
  .hol-scope .lecteur:not(.lecteur--portrait).est-question .lecteur-scene{height:auto;padding-bottom:0}
  /* « relative » et non « static » : le voile reprend sa place dans le flux,
     et garde son plan. Posé en « static », il perd son « z-index » et la
     vidéo, elle toujours en absolu, repasse par-dessus la question. */
  .hol-scope .lecteur:not(.lecteur--portrait).est-question .jal-voile{position:relative;inset:auto;min-height:180px}
}

/* Le verdict en attente : la ligne existe dès le clic, le mot vient dedans.
   Gris, parce qu'elle ne dit encore ni juste ni faux, et qu'une couleur posée
   avant le verdict en annoncerait un. */
.hol-scope .jal-verdict--attente{color:inherit;opacity:.7;font-weight:500;font-size:14px}
.hol-scope .jal-expl[hidden]{display:none}

/* ═══════════════════════════════════════════════════════════════════════════
   LA CARTE DE FIN DE VIDÉO (.lec-fin)

   La vidéo s'arrêtait et l'écran restait sur sa dernière image, sans rien dire.
   Cette carte s'ouvre à la place et propose ce qui reste à faire : revoir,
   l'exercice, le dialogue, le vocabulaire, les documents, la leçon suivante.
   Elle ne montre que ce que la leçon porte vraiment : voir lecon.php.

   MÊME VOILE QUE LA QUESTION DANS LA VIDÉO, et ce n'est pas un hasard : les
   deux s'ouvrent au même endroit, pour la même raison, et se ressemblent donc.
   AUCUN FILET DE COULEUR À GAUCHE, ici comme partout ailleurs sur ce site.
   ═══════════════════════════════════════════════════════════════════════════ */
/* ELLE COUVRE TOUT LE LECTEUR, bandes comprises, et non la seule image. Posée
   dans la scène, elle se retrouvait coincée dans les deux cent soixante-dix
   pixels d'une vidéo verticale : les boutons s'empilaient en colonne et le
   titre de la leçon suivante était coupé, pendant que les bandes de chaque
   côté restaient vides. La barre de commandes, elle, repasse par-dessus :
   on doit pouvoir relancer sans refermer la carte. */
.hol-scope .lec-fin{position:absolute;inset:0;z-index:3;
                    display:flex;align-items:center;justify-content:center;
                    padding:18px;overflow-y:auto;
                    background:var(--hol-hero-scrim-a)}
.hol-scope .lec-fin[hidden]{display:none}
.hol-scope .lec-fin__boite{width:100%;max-width:520px;text-align:left;
                           color:var(--hol-text-inverse)}
.hol-scope .lec-fin__haut{margin:0 0 6px;font-family:var(--hol-police-mono),ui-monospace,monospace;
                          font-size:11px;letter-spacing:.14em;text-transform:uppercase;
                          opacity:.72}
.hol-scope .lec-fin__titre{margin:0 0 16px;font-family:var(--hol-police-titre),sans-serif;
                           font-weight:700;font-size:clamp(19px,2.6vw,24px);line-height:1.2}

/* Les gestes : des pastilles de verre, posées à la file. « Revoir » est plein,
   parce que c'est le geste le plus fréquent dans un cours de langue. */
.hol-scope .lec-fin__gestes{display:flex;flex-wrap:wrap;gap:9px}
.hol-scope .lec-fin__btn{display:inline-flex;align-items:center;gap:8px;
                         min-height:42px;padding:0 15px;cursor:pointer;
                         font:inherit;font-size:14.5px;font-weight:600;line-height:1.2;
                         text-decoration:none;
                         color:var(--hol-text-inverse);
                         background:var(--hol-verre-fond);
                         border:1px solid var(--hol-verre-bord);
                         border-radius:var(--hol-r-pill);
                         transition:background .14s ease,border-color .14s ease}
.hol-scope .lec-fin__btn:hover{background:var(--hol-verre-fond-vif);
                               border-color:var(--hol-verre-bord-vif);
                               color:var(--hol-text-inverse)}
.hol-scope .lec-fin__btn--revoir{background:var(--hol-surface-1);border-color:var(--hol-surface-1);
                                 color:var(--hol-text-primary)}
.hol-scope .lec-fin__btn--revoir:hover{background:var(--hol-surface-1);color:var(--hol-text-primary)}

/* LA LEÇON SUIVANTE PORTE SON NOM. Un bouton « suivant » nu ne dit pas où l'on
   va ; le titre, si. Elle se détache sur une ligne à elle, sous les gestes. */
.hol-scope .lec-fin__suite{display:flex;align-items:center;gap:12px;
                           margin:16px 0 0;padding:12px 15px;
                           text-decoration:none;color:var(--hol-text-inverse);
                           background:var(--hol-verre-fond);
                           border:1px solid var(--hol-verre-bord);
                           border-radius:var(--hol-r-sm);
                           transition:background .14s ease,border-color .14s ease}
.hol-scope .lec-fin__suite:hover{background:var(--hol-verre-fond-vif);
                                 border-color:var(--hol-verre-bord-vif);
                                 color:var(--hol-text-inverse)}
.hol-scope .lec-fin__suite__mot{flex:none;font-family:var(--hol-police-mono),ui-monospace,monospace;
                                font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;
                                opacity:.72}
.hol-scope .lec-fin__suite__titre{flex:1 1 auto;min-width:0;font-size:15px;font-weight:600;
                                  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hol-scope .lec-fin__suite__fleche{flex:none;font-size:17px}

@media (max-width:600px){
  .hol-scope .lec-fin{padding:14px}
  .hol-scope .lec-fin__btn{min-height:40px;font-size:13.5px;padding:0 13px}
  .hol-scope .lec-fin__suite{flex-wrap:wrap;gap:4px 10px}
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA BANDE D'ANNONCE DE L'ESPACE D'APPRENTISSAGE (.lec-annonce)

   DISCRÈTE MAIS LISIBLE, et c'est tout l'exercice. Elle s'adresse à quelqu'un
   qui est en train d'apprendre : trop voyante, elle vole l'attention qu'on lui
   a demandée ; trop pâle, elle ne sert à rien. D'où ce parti : un fond de
   marque très clair, un filet en bas, un mot en capitales à gauche pour dire
   ce que c'est, et le texte qui glisse doucement.

   LE ROUGE DE LA MARQUE N'Y EST PAS. Une bande rouge en haut d'un écran de
   cours dit « alerte », et ce n'est pas ce qu'elle dit : c'est une nouvelle,
   pas un incident.

   AUCUN FILET DE COULEUR À GAUCHE, ici comme partout ailleurs sur ce site.
   ═══════════════════════════════════════════════════════════════════════════ */
/* ELLE SE CALE SOUS LA BARRE DU HAUT, et non sous « --lec-haut » qui, lui, la
   comprend déjà : sinon elle se pousserait elle-même vers le bas. */
.hol-scope .lec-annonce{position:sticky;top:var(--lec-barre,64px);z-index:55;
                        background:var(--hol-brand-wash);
                        border-bottom:1px solid var(--hol-border-subtle)}
.hol-scope .lec-annonce[hidden]{display:none}
/* PLUS FINE QU'UN BANDEAU D'ALERTE. Trente-six pixels : assez pour se lire,
   assez peu pour ne pas repousser la leçon vers le bas. */
.hol-scope .lec-annonce__rang{display:flex;align-items:center;gap:12px;
                              padding:4px var(--hol-gutter) 4px var(--lec-marge);
                              min-height:36px}
.hol-scope .lec-annonce__mot{flex:none;font-family:var(--hol-police-mono),ui-monospace,monospace;
                             letter-spacing:.16em;text-transform:uppercase;
                             font-weight:600;color:var(--hol-text-inverse);
                             background:var(--hol-brand);padding:3px 8px;
                             border-radius:var(--hol-r-pill)}

/* LA PISTE EST LA FENÊTRE, la file est ce qui passe derrière. Sans la fenêtre,
   le texte en mouvement élargirait la page et ferait apparaître une barre de
   défilement horizontale à chaque passage. */
.hol-scope .lec-annonce__piste{flex:1 1 auto;min-width:0;overflow:hidden}
/* LA TYPOGRAPHIE DES TITRES, et c'est une entorse assumée à la charte, qui la
   réserve aux titres. Une annonce écrite dans la graisse du texte courant se
   confond avec la page et personne ne la lit ; dans celle des titres, l'œil
   comprend en un dixième de seconde que c'est une autre voix qui parle.
   IL EST EN BLOC EN LIGNE, ET CE N'EST PAS UN DÉTAIL. En bloc ordinaire, sa
   largeur serait celle de la bande : le déplacement de 100 % s'arrêterait au
   bord gauche, la phrase entière resterait affichée, et elle sauterait d'un
   coup à droite. En bloc en ligne, la largeur vaut le rembourrage PLUS le
   texte, et les 100 % font sortir la phrase pour de bon. */
.hol-scope .lec-annonce__texte{margin:0;white-space:nowrap;
                               display:inline-block;padding-left:100%;
                               font-family:var(--hol-police-titre),sans-serif;
                               font-weight:600;font-size:14px;line-height:1.5;
                               letter-spacing:-.005em;
                               color:var(--hol-text-primary);
                               animation:lec-annonce-glisse var(--ann-duree,30s) linear infinite}
/* UNE PHRASE À LA FOIS. Le rembourrage de gauche vaut la largeur de la bande :
   la phrase commence donc hors champ, à droite. Le déplacement vaut toute la
   largeur de l'élément, rembourrage compris : quand la fin de la phrase quitte
   le bord gauche, le début revient exactement au bord droit. On ne lit jamais
   deux morceaux de phrase en même temps, et il n'y a pas de temps mort. */
@keyframes lec-annonce-glisse{from{transform:translateX(0)}to{transform:translateX(-100%)}}
/* ARRÊTÉE, elle ne saute pas en arrière : elle se fige là où elle en était. */
.hol-scope .lec-annonce.est-calme .lec-annonce__texte{animation-play-state:paused}
/* Qui demande moins d'animation lit la bande immobile. */
@media (prefers-reduced-motion:reduce){
  .hol-scope .lec-annonce__texte{animation:none;padding-left:0;
                                 display:block;max-width:100%;
                                 overflow:hidden;text-overflow:ellipsis}
}

.hol-scope .lec-annonce__btn{flex:none;display:inline-flex;align-items:center;
                             min-height:28px;padding:0 13px;
                             font-size:12.5px;font-weight:600;text-decoration:none;
                             color:var(--hol-text-inverse);background:var(--hol-brand);
                             border-radius:var(--hol-r-pill);white-space:nowrap}
.hol-scope .lec-annonce__btn:hover{background:var(--hol-brand-active);
                                   color:var(--hol-text-inverse)}

.hol-scope .lec-annonce__fin{flex:none;margin:0}
/* LA COCHE EST VOLONTAIREMENT PÂLE. Elle ne demande rien : elle attend celui
   qui a fini de lire. En gras, elle aurait l'air d'être le geste à faire. */
.hol-scope .lec-annonce__coche{display:inline-flex;align-items:center;gap:6px;
                               min-height:28px;padding:0 11px;cursor:pointer;
                               font:inherit;font-size:12.5px;font-weight:500;
                               color:var(--hol-text-muted);background:transparent;
                               border:1px solid var(--hol-border-subtle);
                               border-radius:var(--hol-r-pill)}
.hol-scope .lec-annonce__coche:hover{color:var(--hol-text-primary);
                                     border-color:var(--hol-border-strong)}

/* Sur un téléphone, la bande se range sur deux lignes plutôt que de rapetisser
   son texte : une annonce illisible ne vaut pas mieux qu'une annonce absente. */
@media (max-width:700px){
  .hol-scope .lec-annonce__rang{flex-wrap:wrap;gap:8px 10px;padding-top:10px;padding-bottom:10px}
  .hol-scope .lec-annonce__piste{flex:1 1 100%;order:3}
  .hol-scope .lec-annonce__coche span{display:none}
  .hol-scope .lec-annonce__coche{padding:0 10px}
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA CARTE D'APPRENANT (.crt-*)

   CE QU'ELLE EST : la preuve qu'on suit nos cours. CE QU'ELLE N'EST PAS : une
   carte étudiante. Le dessin tient compte des deux : il a l'allure d'une carte
   officielle, parce qu'on la présente à quelqu'un, et son verso porte en toutes
   lettres ce qu'elle ne confère pas.

   LES BIAIS DE L'ANGLE sont faits de dégradés à arrêts francs, pas d'images :
   une carte doit s'imprimer net à n'importe quelle taille, et un fichier de
   plus à charger sur une connexion lente ne se justifie pas pour un décor.
   ═══════════════════════════════════════════════════════════════════════════ */

/* LE CHAPÔ PREND TOUTE LA LARGEUR DE LA PAGE, et c'est le seul réglage qui
   réduise vraiment le nombre de lignes. Une mesure bridée, même généreuse,
   laissait une marge droite que rien ne justifiait : le texte s'arrêtait en
   plein milieu pendant que les cartes, juste en dessous, allaient jusqu'au
   bout. C'est la marge de la page qui donne la ligne, ici comme ailleurs. */
.hol-scope .crt-chapo{margin:0 0 18px;font-size:15px;line-height:1.6;
                      color:var(--hol-text-secondary)}

.hol-scope .crt-k{display:flex;align-items:center;gap:9px;margin-bottom:12px;
                  font-family:var(--hol-police-mono),monospace;font-size:11px;font-weight:600;
                  letter-spacing:.13em;text-transform:uppercase;
                  color:var(--hol-text-secondary)}
.hol-scope .crt-k .hol-marque{flex:none}

/* ── LES DEUX FACES CÔTE À CÔTE ──────────────────────────────────────────
   ON VOIT LA CARTE ENTIÈRE D'UN COUP D'ŒIL, recto et verso dans le même
   regard : c'est un objet à deux faces, et il se juge comme tel.

   LE DESSIN N'EST PLUS ICI. La carte est un SVG, repris du gabarit fourni :
   géométrie, biais, positions et corps de texte y sont, au point près. Ce qui
   reste de CSS est l'enveloppe, c'est-à-dire l'ombre, le coin arrondi et la
   place dans la page.
   ───────────────────────────────────────────────────────────────────────── */
.hol-scope .crt-paire{display:grid;grid-template-columns:repeat(auto-fit,minmax(430px,1fr));
                      gap:26px;max-width:1020px;margin:22px 0 6px}
.hol-scope .crt{overflow:hidden;border-radius:24px;
                background:var(--hol-crt-papier-a);
                box-shadow:0 15px 27px -12px rgba(37,52,92,.26), 0 3px 9px rgba(38,53,88,.05)}
.hol-scope .crt-svg{display:block;width:100%;height:auto;
                    font-family:var(--hol-police-texte),Arial,Helvetica,sans-serif}

.hol-scope .crt-face{margin:13px 0 0;text-align:center;
                     font-family:var(--hol-police-mono),monospace;font-size:11px;
                     font-weight:600;letter-spacing:.2em;text-transform:uppercase;
                     color:var(--hol-text-muted)}
.hol-scope .crt-sous{margin:16px 0 0;max-width:1020px;font-size:13px;
                     color:var(--hol-text-secondary);overflow-wrap:anywhere}

@media (max-width:620px){
  .hol-scope .crt{border-radius:14px}
}

/* ── Les conditions, et la photo ────────────────────────────────────────── */
.hol-scope .crt-liste{list-style:none;margin:0;padding:0;display:flex;
                      flex-direction:column;gap:11px}
.hol-scope .crt-liste__li{display:flex;gap:11px;align-items:flex-start;
                          font-size:14.5px;line-height:1.5}
.hol-scope .crt-puce{flex:none;width:20px;height:20px;margin-top:1px;border-radius:50%;
                     display:inline-flex;align-items:center;justify-content:center;
                     background:var(--hol-surface-0);color:var(--hol-text-muted);
                     border:1px solid var(--hol-border-subtle)}
.hol-scope .crt-liste__li.est-faite .crt-puce{background:var(--hol-succes-clair,#E7F4EC);
                     color:var(--hol-succes);border-color:transparent}
.hol-scope .crt-liste__li.est-faite{color:var(--hol-text-secondary)}

.hol-scope .crt-photo{display:flex;gap:22px;align-items:flex-start;flex-wrap:wrap}
.hol-scope .crt-photo__vue{flex:none;width:132px;height:132px;object-fit:cover;
                           border-radius:10px;background:var(--hol-surface-0);
                           border:1px solid var(--hol-border-subtle)}
.hol-scope .crt-photo__vide{flex:none;width:132px;height:132px;border-radius:10px;
                            background:var(--hol-surface-0);
                            border:1px dashed var(--hol-border-strong)}
.hol-scope .crt-photo__mots{flex:1 1 300px;min-width:0}
.hol-scope .crt-regles__mot{margin:0 0 8px;font-size:14px;font-weight:600}
.hol-scope .crt-regles{margin:0 0 16px;padding-left:20px;font-size:13.5px;
                       line-height:1.65;color:var(--hol-text-secondary)}
.hol-scope .crt-regles__fin{margin:12px 0 0;font-size:12.5px;line-height:1.5;
                            color:var(--hol-text-muted)}
.hol-scope .crt-envoi{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.hol-scope .crt-envoi input[type=file]{font:inherit;font-size:13px;max-width:100%}

/* Les trois tons de réponse : on a compris, on attend, on refuse. Chacun porte
   son mot : la couleur seule ne dit rien à qui ne la voit pas. */
.hol-scope .crt-mot{margin:0 0 16px;padding:11px 15px;border-radius:var(--hol-r-sm);
                    font-size:14px;line-height:1.55}
.hol-scope .crt-mot--succes{background:var(--hol-succes-clair,#E7F4EC);color:var(--hol-succes)}
.hol-scope .crt-mot--attente{background:var(--hol-alerte-clair,#FBF1E3);color:var(--hol-alerte)}
.hol-scope .crt-mot--refus{background:var(--hol-accent-wash);color:var(--hol-erreur)}

/* SOUS SIX CENTS PIXELS, LA CARTE NE SE RÉORGANISE PAS : elle rapetisse en
   bloc. Une carte est un objet aux proportions fixes ; la casser en colonnes
   sur un téléphone donnerait un aperçu qui ne ressemble plus à ce qui sortira
   de l'imprimeur, et c'est précisément ce qu'on vient regarder. */
@media (max-width:600px){
  .hol-scope .crt{height:216px;padding:16px 17px 12px;border-radius:11px}
  .hol-scope .crt-logo,.hol-scope .crt-logo--centre{height:23px}
  .hol-scope .crt-logo--centre{margin-top:13px}
  .hol-scope .crt-pastille{padding:5px 11px;font-size:9.5px}
  .hol-scope .crt-corps{gap:20px;margin-top:11px}
  .hol-scope .crt-portrait{width:134px;height:134px}
  .hol-scope .crt-nom{font-size:22px;margin-bottom:12px}
  .hol-scope .crt-lignes{grid-template-columns:86px 1fr;gap:12px 0;font-size:11px}
  .hol-scope .crt-lignes dd{padding-left:14px}
  .hol-scope .crt-pied{font-size:9px}
  .hol-scope .crt-dos{gap:18px}
  .hol-scope .crt-dos__mots{font-size:10.5px}
  .hol-scope .crt-qr img{width:40px;height:40px}
  .hol-scope .crt--verso .crt-pied{font-size:9.5px}
}

/* L'IMPRESSION NE GARDE QUE LES DEUX FACES. Une carte qu'on imprime ne doit
   pas emporter avec elle la colonne de gauche, les conditions et le bouton
   d'envoi : on veut deux rectangles sur une feuille, rien d'autre. */
@media print{
  .hol-scope .esp-rail, .hol-scope .crt-chapo, .hol-scope .crt-sous,
  .hol-scope .crt-mot, .hol-scope .hol-cookies, .hol-scope .eu-eddy,
  .hol-scope .eu-eddy-launch, .hol-scope .hol-haut{display:none !important}
  .hol-scope .crt{box-shadow:none;break-inside:avoid;page-break-inside:avoid}
}

/* Le bouton d'Apple Wallet, et la phrase qui dit ce qu'il fait. Il n'apparaît
   que si les certificats sont en place : voir private/config/wallet. */
.hol-scope .crt-wallet{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:18px 0 0}
.hol-scope .crt-wallet__btn{display:inline-flex;align-items:center;gap:9px;flex:none;
                            min-height:44px;padding:0 20px;border-radius:var(--hol-r-sm);
                            text-decoration:none;font-size:15px;font-weight:600;
                            background:var(--hol-noir,#111318);color:var(--hol-text-inverse)}
.hol-scope .crt-wallet__btn:hover{background:var(--hol-surface-inverse)}
.hol-scope .crt-wallet__mot{flex:1 1 260px;min-width:0;font-size:13px;line-height:1.5;
                            color:var(--hol-text-secondary)}
/* Le second bouton du même rang : il descend un fichier, pas une carte dans un
   téléphone. Même forme, moins de poids. */
.hol-scope .crt-wallet__btn--second{background:var(--hol-brand-wash);color:var(--hol-brand);
                                    border:1px solid var(--hol-border-subtle)}
.hol-scope .crt-wallet__btn--second:hover{background:var(--hol-brand);color:var(--hol-text-inverse)}

/* ── LE CADRAGE DE LA PHOTO DE CARTE (.crt-cadre) ────────────────────────────
   UNE FENÊTRE CARRÉE, parce que la carte l'est. Ce qu'on voit dans la fenêtre
   est ce qui s'imprimera, au pixel près : plus aucun rognage ne se produit
   après ce réglage. */
.hol-scope .crt-cadre{display:flex;gap:24px;align-items:flex-start;flex-wrap:wrap;
                      margin:0 0 22px;padding:18px;border-radius:var(--hol-r-lg);
                      background:var(--hol-surface-0);
                      border:1px solid var(--hol-border-subtle)}
.hol-scope .crt-cadre__vue{position:relative;flex:none;width:208px;height:208px;
                           overflow:hidden;border-radius:10px;
                           background:var(--hol-surface-1);
                           border:1px solid var(--hol-border-subtle)}
.hol-scope .crt-cadre__vue[data-vif]{cursor:move;touch-action:none}
.hol-scope .crt-cadre__img{display:block;width:100%;height:100%;object-fit:cover}
/* Une fois le script en place, l'image est posée au pixel : elle n'est plus
   contrainte par la fenêtre, c'est la fenêtre qui la rogne. */
.hol-scope .crt-cadre__img--libre{position:absolute;max-width:none;object-fit:fill}
.hol-scope .crt-cadre__reperes{position:absolute;inset:0;width:100%;height:100%;
                               pointer-events:none;fill:none;
                               stroke:var(--hol-surface-1);stroke-width:.8;opacity:.7}

.hol-scope .crt-cadre__reglages{flex:1 1 280px;min-width:0}
.hol-scope .crt-cadre__mot{margin:0 0 12px;font-size:14px;font-weight:600}
.hol-scope .crt-cadre__ligne{display:flex;align-items:center;gap:12px;margin-bottom:10px;
                             font-size:13px;color:var(--hol-text-secondary)}
.hol-scope .crt-cadre__ligne span{flex:0 0 96px}
.hol-scope .crt-cadre__ligne input[type=range]{flex:1 1 auto;min-width:0;accent-color:var(--hol-brand)}
.hol-scope .crt-cadre__aide{margin:12px 0 14px;font-size:12.5px;line-height:1.55;
                            color:var(--hol-text-muted)}
.hol-scope .crt-cadre__gestes{display:flex;gap:12px;flex-wrap:wrap}

/* Le portrait est carré partout où il paraît : sur la carte, dans l'aperçu et
   dans la file de vérification. Un seul cadrage, le même pour tous. */
.hol-scope .crt-photo__vue,.hol-scope .crt-photo__vide{height:132px}

/* ===========================================================================
   CE QUE LE SITE DIT QUAND UN CHAMP NE VA PAS.

   La bulle du navigateur est grise, carrée, dans sa police système, et elle
   parle la langue du téléphone plutôt que celle de la page. Au milieu d'une
   page soignée, elle ressemble à une panne. Celle-ci est de la maison : la
   carte blanche du site, notre ombre, notre rayon, notre police.

   LA COULEUR NE PORTE RIEN TOUTE SEULE. Le rouge d'état est toujours
   accompagné du point d'exclamation et de la phrase : un daltonien lit la
   phrase, un lecteur d'écran annonce l'alerte, et le champ porte aria-invalid.
   --hol-erreur et non --hol-accent : le rouge de la marque dit l'identité,
   jamais un état du système.
   =========================================================================== */
.hol-dit{position:absolute;top:-9999px;left:-9999px;z-index:900;
         display:none;align-items:center;gap:10px;
         max-width:330px;
         padding:11px 15px;
         border-radius:var(--hol-r-lg);
         background:var(--hol-surface-1);
         border:1px solid var(--hol-border-subtle);
         box-shadow:var(--hol-shadow-2);
         font-family:var(--hol-police-texte),system-ui,sans-serif;
         font-size:13.5px;line-height:1.45;color:var(--hol-text-primary);
         pointer-events:none}
.hol-dit[data-vu]{display:flex}
.hol-dit__signe{flex:none;display:flex;align-items:center;justify-content:center;
                width:22px;height:22px;border-radius:var(--hol-r-sm);
                background:var(--hol-erreur);color:var(--hol-text-inverse);
                font-family:var(--hol-police-mono),ui-monospace,monospace;
                font-size:14px;font-weight:600;line-height:1}
.hol-dit__texte{min-width:0;overflow-wrap:anywhere}

/* La pointe est un carré tourné, et non un triangle en bordures : il fallait
   qu'elle porte la bordure et l'ombre de la carte pour que l'ensemble tienne
   comme un seul objet. */
.hol-dit__pointe{position:absolute;left:var(--hol-dit-x,22px);
                 width:10px;height:10px;
                 background:var(--hol-surface-1);
                 border:1px solid var(--hol-border-subtle);
                 -webkit-transform:rotate(45deg);transform:rotate(45deg)}
.hol-dit[data-sens="bas"] .hol-dit__pointe{top:-6px;
                 border-right:0;border-bottom:0}
.hol-dit[data-sens="haut"] .hol-dit__pointe{bottom:-6px;
                 border-left:0;border-top:0}

/* LE CHAMP LUI-MÊME LE DIT AUSSI. La bulle part dès qu'on retape ; sans cette
   marque, un formulaire long ne garderait aucune trace de l'endroit fautif
   une fois la bulle refermée. */
.est-fautif{border-color:var(--hol-erreur) !important}
.est-fautif:focus,.est-fautif:focus-visible{outline:none;
            box-shadow:0 0 0 3px var(--hol-erreur-wash) !important}

/* min() manque sur les vieux Android : une requête de média plutôt qu'une
   fonction qu'ils ignoreraient en entier, ce qui emporterait la largeur. */
@media (max-width:360px){ .hol-dit{max-width:calc(100vw - 16px)} }

@media print{ .hol-dit{display:none !important} }

/* ===========================================================================
   LE PETIT CALENDRIER DU MOIS.

   Un coup d'œil, pas un outil de saisie : la liste à côté sert à travailler,
   celui-ci sert à voir la forme du mois. D'où des cases nues, des points
   plutôt que des titres, et un détail qui ne s'ouvre que si on le demande.
   =========================================================================== */
.cal{padding:16px 18px 14px;border-radius:var(--hol-r-lg);
     background:var(--hol-surface-1);border:1px solid var(--hol-border-subtle);
     box-shadow:var(--hol-shadow-1)}
.cal__tete{display:flex;align-items:center;gap:4px;margin-bottom:12px}
.cal__nom{flex:1 1 auto;text-align:center;font-size:14.5px;font-weight:600;
          letter-spacing:-.01em;min-width:0}
.cal__fleche{flex:none;display:flex;align-items:center;justify-content:center;
             width:28px;height:28px;border-radius:var(--hol-r-sm);
             color:var(--hol-text-secondary);text-decoration:none}
.cal__fleche:hover{background:var(--hol-brand-wash);color:var(--hol-brand)}
.cal__fleche svg{width:14px;height:14px;fill:none;stroke:currentColor;
                 stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

.cal__sem{display:grid;grid-template-columns:repeat(7,1fr);gap:3px;margin-bottom:4px}
.cal__sem span{text-align:center;font-family:var(--hol-police-mono),ui-monospace,monospace;
               font-size:9.5px;font-weight:600;letter-spacing:.08em;
               text-transform:uppercase;color:var(--hol-text-muted)}

.cal__grille{display:grid;grid-template-columns:repeat(7,1fr);gap:3px}
.cal__case{position:relative;display:flex;flex-direction:column;align-items:center;
           justify-content:center;gap:3px;min-height:38px;padding:4px 0 5px;
           border:1px solid transparent;border-radius:var(--hol-r-sm);
           background:none;font:inherit;color:var(--hol-text-secondary);
           font-size:12.5px;cursor:default}
.cal__case--hors{min-height:38px}
.cal__case[data-plein]{cursor:pointer;color:var(--hol-text-primary);font-weight:600;
                       background:var(--hol-brand-wash)}
.cal__case[data-plein]:hover{border-color:var(--hol-brand-border)}
.cal__case[data-ouvert]{background:var(--hol-brand);color:var(--hol-text-inverse);
                        border-color:var(--hol-brand)}
/* AUJOURD'HUI SE REPÈRE PAR UN CERCLE, pas par une couleur de fond : le fond
   dit déjà « il y a quelque chose ce jour-là », et deux sens sur un seul signal
   n'en font plus qu'un confus. */
.cal__case[data-auj]{border-color:var(--hol-brand);font-weight:600}
.cal__case[data-auj] .cal__chiffre{color:var(--hol-brand)}
.cal__case[data-ouvert][data-auj] .cal__chiffre{color:var(--hol-text-inverse)}
.cal__chiffre{line-height:1}

.cal__points{display:flex;align-items:center;justify-content:center;gap:2px;
             min-height:5px}
.cal__points i{display:block;width:4px;height:4px;border-radius:50%;
               background:var(--hol-brand)}
.cal__points i.est-plein{background:var(--hol-succes)}
.cal__points i.est-annule{background:var(--hol-text-muted)}
.cal__points b{font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:8.5px;
               font-weight:600;color:var(--hol-text-muted);line-height:1}
.cal__case[data-ouvert] .cal__points i,
.cal__case[data-ouvert] .cal__points b{background:var(--hol-surface-1);
                                       color:var(--hol-surface-1)}

/* Posé sur un bouton de la maison, il ne lui reste qu'à se centrer. */
.cal__auj{display:flex;margin:10px auto 0}

.cal__jour{margin-top:12px;padding-top:12px;
           border-top:1px solid var(--hol-border-subtle);
           display:flex;flex-direction:column;gap:5px}
.cal__jour[hidden]{display:none}
.cal__item{display:flex;align-items:baseline;gap:9px;padding:7px 9px;
           border-radius:var(--hol-r-sm);text-decoration:none;
           background:var(--hol-surface-0);font-size:12.5px}
.cal__item:hover{background:var(--hol-brand-wash)}
.cal__item[data-annule]{opacity:.55;text-decoration:line-through}
.cal__item-h{flex:none;font-family:var(--hol-police-mono),ui-monospace,monospace;
             font-size:11.5px;font-weight:600;color:var(--hol-text-primary)}
.cal__item-t{flex:1 1 auto;min-width:0;color:var(--hol-text-secondary);
             overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cal__item-n{flex:none;font-family:var(--hol-police-mono),ui-monospace,monospace;
             font-size:10.5px;color:var(--hol-text-muted)}

@media print{ .cal{display:none !important} }

/* La pastille du super administrateur se distingue de celle d'un
   administrateur ordinaire : deux comptes se ressemblent à l'écran, et c'est
   le seul endroit où l'on peut voir, sans rien ouvrir, sur lequel on est. */
.adm-mot[data-super]{background:var(--hol-glass-hi);
                     border-color:var(--hol-text-inverse-2);
                     color:var(--hol-text-inverse)}

/* L'ADMINISTRATION EST PLUS LARGE QUE LE SITE, partout et d'un seul tenant.
   Le site public se lit : 1480 pixels tiennent une colonne de texte à bonne
   longueur de ligne. L'administration se travaille : des tableaux, des rangées
   de blocs, des listes à plusieurs colonnes, qui se serrent à cette largeur et
   se lisent d'autant moins vite. 1860 pixels, et la barre, le fil et le contenu
   s'alignent tous dessus : une seule marge sur tous les écrans, sinon le logo
   et les titres ne tombent pas sur le même aplomb d'une page à l'autre.
   LA GOUTTIÈRE NE BOUGE PAS : c'est la marge de la maison, et elle est la même
   des deux côtés du site. C'est la largeur maximale qui change, pas le bord. */
.hol-scope.adm-corps .eu-container{max-width:1860px}
/* Gardée pour les pages qui la posaient encore : elle ne fait plus rien de
   particulier dans l'administration, qui est large de bout en bout. */
.hol-scope .eu-container.eu-large{max-width:1860px}

/* ===========================================================================
   L'AIRE DU PILOTAGE.

   La grille, l'échelle et l'axe sont posés en CSS plutôt que dans le SVG : le
   repère est étiré à la largeur disponible, et tout ce qui y vivrait serait
   étiré avec lui. Un chiffre de graduation deviendrait deux fois plus large
   que haut sur un grand écran.
   =========================================================================== */
.aire{position:relative;padding-left:58px;padding-bottom:4px}
.aire__svg{display:block;width:100%;height:280px;overflow:visible}

.aire__grille{stroke:var(--hol-border-subtle);stroke-width:1;
              vector-effect:non-scaling-stroke}
.aire__grille[data-sol]{stroke:var(--hol-border-strong)}

/* Le dégradé : la couleur de la série en haut, la même évanouie au sol. Les
   deux arrêts sont des éléments à part pour que la teinte vienne d'un token et
   non d'un hexadécimal recopié dans le SVG. */
.aire__h{stop-color:var(--hol-brand);stop-opacity:.28}
.aire__b{stop-color:var(--hol-brand);stop-opacity:.02}
.aire__h[data-ton="succes"]{stop-color:var(--hol-succes);stop-opacity:.26}
.aire__b[data-ton="succes"]{stop-color:var(--hol-succes);stop-opacity:.02}

.aire__trait{fill:none;stroke:var(--hol-brand);stroke-width:2.4;
             stroke-linecap:round;stroke-linejoin:round;
             vector-effect:non-scaling-stroke}
.aire__trait[data-ton="succes"]{stroke:var(--hol-succes)}

/* Les points ont un liseré de la couleur du fond : sans lui, deux points
   voisins se touchent et font un trait épais plutôt que deux mesures. */
.aire__pt{fill:var(--hol-surface-1);stroke:var(--hol-brand);stroke-width:2;
          vector-effect:non-scaling-stroke}
.aire__pt[data-ton="succes"]{stroke:var(--hol-succes)}
.aire__dernier{fill:var(--hol-brand);stroke:var(--hol-surface-1);stroke-width:2.5;
               vector-effect:non-scaling-stroke}
.aire__dernier[data-ton="succes"]{fill:var(--hol-succes)}

/* L'échelle, collée au bord gauche, répartie sur la hauteur du tracé. */
.aire__ech{position:absolute;left:0;top:16px;height:236px;width:52px;
           display:flex;flex-direction:column;justify-content:space-between;
           align-items:flex-end;text-align:right;
           font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:10px;
           font-variant-numeric:tabular-nums;color:var(--hol-text-muted);
           pointer-events:none}
.aire__axe{display:flex;justify-content:space-between;margin-top:6px;
           font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:10px;
           letter-spacing:.06em;text-transform:uppercase;
           color:var(--hol-text-muted)}

@media (max-width:620px){
  .aire{padding-left:44px}
  .aire__ech{width:40px;font-size:9px}
  .aire__svg{height:220px}
  .aire__ech{height:176px}
}

/* Le fil : une forme, pas un graphique. Vingt pixels de haut, aucune
   graduation, et le dernier point marqué pour qu'on sache où l'on est. */
.fil{display:block;width:100%;max-width:140px;height:30px;overflow:visible}
.fil__t{fill:none;stroke:var(--hol-brand);stroke-width:1.8;
        stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}
.fil__t[data-ton="succes"]{stroke:var(--hol-succes)}
.fil__t[data-ton="muet"]{stroke:var(--hol-text-muted)}
.fil__p{fill:var(--hol-brand);vector-effect:non-scaling-stroke}
.fil__p[data-ton="succes"]{fill:var(--hol-succes)}
.fil__p[data-ton="muet"]{fill:var(--hol-text-muted)}

/* LA VARIATION, par rapport à la période d'avant. C'est une soustraction sur
   deux chiffres réels, jamais une tendance estimée : quand il n'y a pas de
   période d'avant, la pastille n'apparaît pas du tout. */
.delta{display:inline-flex;align-items:center;gap:4px;
       padding:2px 8px;border-radius:var(--hol-r-pill);
       font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:10.5px;
       font-weight:600;font-variant-numeric:tabular-nums;
       background:var(--hol-surface-0);color:var(--hol-text-muted)}
.delta[data-sens="haut"]{background:var(--hol-succes-wash);color:var(--hol-succes)}
.delta[data-sens="bas"]{background:var(--hol-erreur-wash);color:var(--hol-erreur)}
.delta i{font-style:normal;line-height:1}

/* ===========================================================================
   LA CARTE DU MONDE.

   Cinq paliers de bleu de marque, du plus pâle au plus franc. Les cinq teintes
   sont écrites ici plutôt que calculées : color-mix() manque aux vieux Android
   que nous servons, et un dégradé calculé en JavaScript rendrait la carte
   dépendante d'un script pour sa couleur, pas seulement pour sa forme.

   UN PAYS SANS DONNÉE GARDE LA TEINTE DU FOND. Le confondre avec un pays à
   petite valeur serait inventer un chiffre, ce que ce tableau de bord ne fait
   nulle part.
   =========================================================================== */
.monde{position:relative}
.monde[data-monde-muet] .monde__pied,
.monde[data-monde-muet] .monde__scene{display:none}
.monde__scene{line-height:0}
.monde__svg{display:block;width:100%;height:auto}

.monde__terres path{fill:var(--hol-surface-0);
                    stroke:var(--hol-surface-1);stroke-width:.6;
                    vector-effect:non-scaling-stroke;
                    transition:fill .12s ease}
.monde__terres path[data-pal]{cursor:pointer}
.monde__terres path[data-pal="0"]{fill:var(--hol-monde-1)}
.monde__terres path[data-pal="1"]{fill:var(--hol-monde-2)}
.monde__terres path[data-pal="2"]{fill:var(--hol-monde-3)}
.monde__terres path[data-pal="3"]{fill:var(--hol-monde-4)}
.monde__terres path[data-pal="4"]{fill:var(--hol-brand)}
.monde__terres path[data-pal]:hover{stroke:var(--hol-brand);stroke-width:1.4}
.monde__terres path[data-vu]{stroke:var(--hol-text-primary);stroke-width:1.8}
.monde__terres path:focus{outline:none;stroke:var(--hol-brand);stroke-width:2}

.monde__bulle{position:absolute;z-index:5;pointer-events:none;
              display:flex;flex-direction:column;gap:1px;
              padding:8px 11px;border-radius:var(--hol-r-sm);
              background:var(--hol-surface-inverse);color:var(--hol-text-inverse);
              box-shadow:var(--hol-shadow-2);white-space:nowrap}
.monde__bulle[hidden]{display:none}
.monde__bulle strong{font-size:13px;font-weight:600}
.monde__bulle span{font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:11px;
                   color:var(--hol-text-inverse-2)}

.monde__pied{display:flex;align-items:center;gap:10px;margin-top:12px}
/* La mention de la base des pays : discrète, à droite du pied de la carte. */
.monde__source{margin-left:auto;font-size:11px;
               --hol-lien:var(--hol-text-muted);--hol-lien-survol:var(--hol-text-secondary)}
.monde__legende{display:flex;gap:2px}
.monde__legende i{display:block;width:26px;height:8px}
.monde__legende i:first-child{border-radius:var(--hol-r-pill) 0 0 var(--hol-r-pill)}
.monde__legende i:last-child{border-radius:0 var(--hol-r-pill) var(--hol-r-pill) 0}
.monde__legende i[data-pal="0"]{background:var(--hol-monde-1)}
.monde__legende i[data-pal="1"]{background:var(--hol-monde-2)}
.monde__legende i[data-pal="2"]{background:var(--hol-monde-3)}
.monde__legende i[data-pal="3"]{background:var(--hol-monde-4)}
.monde__legende i[data-pal="4"]{background:var(--hol-brand)}
.monde__bornes{display:flex;gap:10px;
               font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:10px;
               color:var(--hol-text-muted)}

/* LES COMMANDES DU ZOOM, posées sur la carte, en haut à droite : au-dessous
   elles passeraient sous la ligne de flottaison du bloc, et l'on ne saurait
   pas que la carte zoome. */
.monde__manette{position:absolute;top:0;right:0;z-index:4;
                display:flex;gap:6px;align-items:center}
.monde__manette .hol-btn{min-width:32px;padding:0 9px;
                         background:var(--hol-surface-1)}
.monde__manette .hol-btn[hidden]{display:none}

/* Rapproché, la carte se promène : le curseur l'annonce avant qu'on essaie. */
.monde[data-zoom="1"] .monde__svg{cursor:grab}
.monde[data-prend] .monde__svg{cursor:grabbing}

/* LA FICHE DU PAYS. Le drapeau d'abord, parce qu'on le reconnaît avant de lire
   le nom ; il se fabrique à partir du code du pays, sans rien charger. */
.monde__fiche{display:grid;
              grid-template-columns:auto minmax(0,1fr) auto;
              align-items:center;gap:4px 14px;
              margin-top:14px;padding-top:14px;
              border-top:1px solid var(--hol-border-subtle)}
.monde__fiche[hidden]{display:none}
.monde__fiche-drapeau{grid-row:1 / span 2;font-size:34px;line-height:1}
.monde__fiche-nom{font-size:15.5px;font-weight:600;align-self:end}
.monde__fiche-n{grid-row:1 / span 2;grid-column:3;
                font-family:var(--hol-police-mono),ui-monospace,monospace;
                font-size:26px;font-weight:600;color:var(--hol-brand);
                font-variant-numeric:tabular-nums;text-align:right}
.monde__fiche-m{grid-column:2;align-self:start;
                font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:10px;
                letter-spacing:.08em;text-transform:uppercase;
                color:var(--hol-text-muted)}
.monde__fiche-part{grid-column:2;grid-row:1;justify-self:start;
                   align-self:end;margin-left:8px;
                   padding:2px 8px;border-radius:var(--hol-r-pill);
                   background:var(--hol-brand-wash);color:var(--hol-brand);
                   font-family:var(--hol-police-mono),ui-monospace,monospace;
                   font-size:10.5px;font-weight:600}
.monde__fiche-part[hidden]{display:none}

@media print{ .monde__bulle{display:none !important} }

/* LE SURVOL DE L'AIRE : un trait, une pastille, une bulle.
   Le trait et la pastille vivent dans le SVG, parce qu'ils doivent suivre le
   repère ; la bulle est du texte, dehors, parce que le repère est étiré et
   qu'une lettre le serait avec lui. */
.aire__viseur{stroke:var(--hol-border-strong);stroke-width:1;
              stroke-dasharray:3 3;vector-effect:non-scaling-stroke;
              pointer-events:none}
.aire__viseur[hidden]{display:none}
.aire__vise{fill:var(--hol-surface-1);stroke:var(--hol-brand);stroke-width:2.5;
            vector-effect:non-scaling-stroke;pointer-events:none}
.aire__vise[hidden]{display:none}
.aire__bulle{position:absolute;z-index:6;pointer-events:none;
             display:flex;flex-direction:column;gap:1px;
             padding:7px 11px;border-radius:var(--hol-r-sm);
             background:var(--hol-surface-inverse);color:var(--hol-text-inverse);
             box-shadow:var(--hol-shadow-2);white-space:nowrap}
.aire__bulle[hidden]{display:none}
.aire__bulle strong{font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:9.5px;
                    font-weight:600;letter-spacing:.09em;text-transform:uppercase;
                    color:var(--hol-text-inverse-2)}
.aire__bulle span{font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:14px;
                  font-weight:600;font-variant-numeric:tabular-nums}
/* La zone sensible, c'est tout le tracé : viser un point de sept pixels de
   large sur mille serait un exercice d'adresse. Et c'est une main, pas une
   croix de visée : la croix annonce qu'on va tracer quelque chose, la main
   qu'il y a là de quoi répondre. */
.aire__svg{cursor:pointer}

@media print{ .aire__bulle,.aire__viseur,.aire__vise{display:none !important} }

/* Le premier maillon du fil est un lieu, pas une porte : il garde la pastille
   des autres, sans leur réaction au survol. */
.adm-fil__lieu{display:inline-flex;align-items:center;min-height:30px;padding:0 13px;
               border-radius:var(--hol-r-pill);background:var(--hol-surface-0);
               color:var(--hol-text-secondary);font-size:13.5px;font-weight:600}

/* LA PIÈCE DÉTACHÉE : un calque par-dessus la carte, qui ne la touche pas. */
/* LE CALQUE LAISSE PASSER LES CLICS. Posé sur toute la carte, il interceptait
   tout : un pays soulevé, on ne pouvait plus en choisir un autre sans l'avoir
   d'abord reposé. Seule la pièce elle-même répond. */
.monde__piece{position:absolute;inset:0;z-index:3;pointer-events:none}
.monde__piece-p{pointer-events:auto;cursor:pointer}
.monde__piece[hidden]{display:none}
.monde__piece-svg{display:block;width:100%;height:100%}
.monde__piece-p{fill:var(--hol-brand);stroke:var(--hol-surface-1);stroke-width:.8;
                vector-effect:non-scaling-stroke;
                filter:drop-shadow(0 6px 14px rgba(20,22,42,.28))}

/* LES NOMS, écrits seulement quand on s'est rapproché. Contre-mis à l'échelle
   par le script : ils gardent leur taille pendant que la carte grandit. */
.monde__noms{pointer-events:none}
.monde__nom{font-family:var(--hol-police-texte),system-ui,sans-serif;font-size:9px;font-weight:600;
            fill:var(--hol-text-primary);text-anchor:middle;
            paint-order:stroke;stroke:var(--hol-surface-1);stroke-width:2.5px;
            stroke-linejoin:round}


/* LA FICHE DU PAYS SOULEVÉ. Une carte de la maison, posée dans un coin de la
   carte : au centre elle masquerait le drapeau qu'on vient de faire monter. */
.monde__fiche{position:absolute;left:0;bottom:30px;z-index:5;
              display:flex;flex-direction:column;gap:3px;
              min-width:180px;max-width:250px;
              padding:15px 18px 16px;border-radius:var(--hol-r-lg);
              background:var(--hol-surface-1);
              border:1px solid var(--hol-border-subtle);
              box-shadow:var(--hol-shadow-2);
              pointer-events:none}
.monde__fiche[hidden]{display:none}
.monde__fiche-haut{display:flex;align-items:center;gap:9px;min-width:0}
.monde__fiche-drapeau{font-size:21px;line-height:1;flex:none}
.monde__fiche-nom{font-family:var(--hol-police-titre),sans-serif;font-weight:700;
                  font-size:16px;letter-spacing:-.01em;min-width:0;
                  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.monde__fiche-n{margin-top:7px;
                font-family:var(--hol-police-mono),ui-monospace,monospace;
                font-size:32px;font-weight:600;line-height:1;
                letter-spacing:-.02em;color:var(--hol-brand);
                font-variant-numeric:tabular-nums}
.monde__fiche-m{font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:9.5px;
                font-weight:600;letter-spacing:.13em;text-transform:uppercase;
                color:var(--hol-text-muted)}
/* LA PART SE VOIT AVANT DE SE LIRE. Un pourcentage écrit demande de se
   rappeler ce qu'est beaucoup ; une barre le montre. */
.monde__fiche-barre{display:block;height:6px;margin-top:11px;
                    border-radius:var(--hol-r-pill);background:var(--hol-surface-0)}
.monde__fiche-plein{display:block;height:100%;border-radius:var(--hol-r-pill);
                    background:var(--hol-brand)}
.monde__fiche-part{margin-top:5px;
                   font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:10.5px;
                   font-weight:600;color:var(--hol-text-secondary)}
.monde__fiche-part[hidden]{display:none}

@media (max-width:620px){
  .monde__fiche{position:static;max-width:none;margin-top:14px;box-shadow:none}
}

/* LES PASTILLES DES PETITS PAYS. Un repère, pas une frontière : la Belgique
   n'a pas grandi, on l'a rendue visible. Elles disparaissent dès qu'on se
   rapproche assez pour voir le pays lui-même. */
.monde__point{stroke:var(--hol-surface-1);stroke-width:1.6;cursor:pointer;
              vector-effect:non-scaling-stroke}
.monde__point[data-pal="0"]{fill:var(--hol-monde-1)}
.monde__point[data-pal="1"]{fill:var(--hol-monde-2)}
.monde__point[data-pal="2"]{fill:var(--hol-monde-3)}
.monde__point[data-pal="3"]{fill:var(--hol-monde-4)}
.monde__point[data-pal="4"]{fill:var(--hol-brand)}
.monde[data-zoom="1"] .monde__points{display:none}

/* LE PLEIN ÉCRAN DE LA CARTE. Un bloc fixé sur toute la page plutôt que l'API
   du navigateur, qui refuse de s'ouvrir dans certains cadres sans le dire. */
.monde[data-grand]{position:fixed;inset:0;z-index:200;
                   padding:18px 22px 22px;
                   background:var(--hol-surface-1);
                   overflow:auto}
.monde[data-grand] .monde__svg{height:calc(100vh - 110px);width:100%}
.monde[data-grand] .monde__piece-svg{height:calc(100vh - 110px)}
.monde[data-grand] .monde__fiche{bottom:26px;left:22px}
.monde[data-grand] .monde__manette{top:18px;right:22px}
.monde[data-grand] .monde__pied{position:absolute;left:22px;bottom:0}

/* La réserve de largeur vaut aussi dans l'administration, et à toute largeur :
   la rangée d'onglets défile, elle ne se replie jamais en panneau. */
.adm-onglets .ent-stable,
.adm-barre .ent-stable{display:inline-grid}
.adm-onglets .ent-fantome,
.adm-barre .ent-fantome{display:block}

/* RANGER SES ONGLETS. Le curseur dit qu'on peut les prendre, l'onglet pris
   s'efface, et un trait marque l'endroit où il tombera. */
.adm-onglet{cursor:grab}
.adm-onglet:active{cursor:grabbing}
.adm-onglet[data-pris]{opacity:.35}
.adm-onglet[data-vise="g"]{box-shadow:inset 3px 0 0 var(--hol-text-inverse)}
.adm-onglet[data-vise="d"]{box-shadow:inset -3px 0 0 var(--hol-text-inverse)}

/* Le fil d'ariane devient un rang : le chemin à gauche, l'action à droite. */
.adm-fil__rang{display:flex;align-items:center;gap:16px}
.adm-fil__rang > .adm-fil__piste{flex:1 1 auto;min-width:0}
.adm-remettre{flex:none;margin-left:auto;
              min-height:28px;padding:0 13px;cursor:pointer;
              font:inherit;font-size:12.5px;font-weight:600;
              color:var(--hol-text-secondary);
              background:var(--hol-surface-1);
              border:1px solid var(--hol-border-subtle);
              border-radius:var(--hol-r-pill);white-space:nowrap}
.adm-remettre:hover{color:var(--hol-brand);border-color:var(--hol-brand-border);
                    background:var(--hol-brand-wash)}
.adm-remettre[hidden]{display:none}
@media (max-width:760px){ .adm-remettre{display:none} }

@media print{ .adm-remettre{display:none !important} }

/* PENDANT QU'ON DÉPLACE UN ONGLET, les flèches cessent de répondre. Elles
   couvrent cent dix pixels à chaque bout, c'est-à-dire la bande où il faut
   approcher pour que la rangée défile : sans cela, le pointeur y entrait,
   l'événement allait à la flèche, et la rangée restait immobile. Elles ne
   disparaissent pas, elles s'effacent du chemin. */
.adm-onglets[data-glisse] .adm-fleche{pointer-events:none}

/* LE BANDEAU D'APERÇU. Il ne se fond pas dans la page : c'est son rôle de
   rappeler qu'on regarde sous une autre enseigne que la sienne. Il prend
   l'encre de la maison et non celle du locataire, sinon il disparaîtrait dans
   le décor qu'il sert justement à signaler. */
.hol-apercu{position:relative;z-index:70;display:flex;align-items:center;
            justify-content:center;gap:16px;flex-wrap:wrap;
            padding:9px var(--hol-gutter);
            background:#1E2340;color:#FFFFFF;
            font-family:var(--hol-police-mono),ui-monospace,monospace;
            font-size:11.5px;letter-spacing:.04em}
.hol-apercu a{color:#FFFFFF;text-decoration:underline;text-underline-offset:3px;
              font-weight:600}
@media print{ .hol-apercu{display:none !important} }

/* LE BANDEAU DE DÉMONSTRATION (Domain/Demo). Même encre, même place que
   l'aperçu, et un bouton franc pour revenir : c'est la seule chose qu'on
   puisse faire ici. Sur téléphone, la phrase passe au-dessus du bouton. */
.hol-demo{position:relative;z-index:70;display:flex;align-items:center;
          justify-content:center;gap:10px 18px;flex-wrap:wrap;
          padding:10px var(--hol-gutter);
          background:#1E2340;color:#FFFFFF;font-size:14px;line-height:1.4;
          text-align:center}
.hol-demo form{margin:0}
.hol-demo button{font:inherit;font-weight:600;color:#1E2340;background:#FFFFFF;
                 border:0;border-radius:999px;padding:7px 16px;cursor:pointer;
                 white-space:nowrap}
.hol-demo button:hover{background:#E8EAF4}
@media print{ .hol-demo{display:none !important} }
.hol-demo-entrer{margin:0;display:inline-flex}

/* La signature d'un locataire n'a pas les proportions de notre globe : on fixe
   la hauteur et la largeur suit, plutôt que d'imposer un format à son logo. */
.hol-marque--globe{height:19px;width:auto;max-width:72px;object-fit:contain}

/* La phrase qui suit un titre de section dans l'espace : elle dit ce que la
   section contient, quand le titre seul ne suffit pas. */
.esp-sous{margin:-4px 0 16px;font-size:14px;line-height:1.6;
          color:var(--hol-text-secondary)}
/* L'explication des visios tient sur une ligne et demie, pas trois (Jimmy,
   11 octobre 2026) : elle prend la largeur de la colonne. */
.esp-sous--large{max-width:min(100%,1080px)}

/* ═══════════════════════════════════════════════════════════════════════════
   LES PAGES LÉGALES : mentions, CGV, confidentialité.

   LA STRUCTURE VIENT D'EUDUC.COM, LA MARGE EST LA NÔTRE. Jimmy a tranché le
   4 octobre 2026 : « pour la marge on peut rester sur notre marge à nous,
   surtout celle qu'on a adoptée sur le site en ligne ». J'avais repris leurs
   deux gouttières imbriquées, mesurées sur leur page de CGV ; elles rentraient
   le texte de deux cents pixels, ce qui n'est pas le rythme de ce site-ci.

   LE PATRON EST DONC CELUI DU BRIEF, comme partout ailleurs : une gouttière,
   portée par la section, et un conteneur centré à l'intérieur.

     bannière           padding 72/64, gouttière, conteneur 1480
     section du corps   padding 56/90, gouttière
     conteneur          1480 max, centré, sans marge à lui
     colonnes           232px pour le sommaire, le reste pour le texte
     écart              60px
     sommaire collant   sous les barres du site, sa propre barre de défilement

   LA COLONNE DE TEXTE N'A PAS BESOIN D'ÊTRE BRIDÉE EN LARGEUR : ses
   paragraphes portent déjà « max-width:70ch », qui est la vraie mesure de
   lecture. Brider la colonne en plus aurait fait deux limites pour une seule
   question, et c'est la plus serrée qui aurait gagné sans qu'on sache laquelle.

   AUCUNE COULEUR EN DUR : les trois pages partagent ce bloc, et les tokens
   gouvernent, comme partout.
   ═══════════════════════════════════════════════════════════════════════════ */

/* LA SECTION NE PORTE PLUS LA GOUTTIÈRE, LE CONTENEUR LA PORTE.

   C'EST CE QUI ALIGNE LA PAGE SUR L'EN-TÊTE, et Jimmy l'a vu : « le hero et le
   corps du texte doivent être alignés sur la marge de l'en-tête ». La section
   posait la gouttière puis centrait un conteneur de 1480 à l'intérieur. Au-delà
   de 1680 px de large, les deux boîtes ne tombaient plus au même endroit : le
   logo de l'en-tête partait vers la droite, le titre de la bannière restait à
   gauche, et l'écart atteignait cent pixels.

   « .eu-container » fait exactement ce qu'il faut : 1480 au plus, centré,
   gouttière À L'INTÉRIEUR. C'est la boîte de l'en-tête, celle du fil d'ariane
   et celle de tout le site. La bannière et le corps la reprennent telle quelle,
   et il n'y a plus deux façons de calculer une marge. */
.hol-scope .leg-banniere{position:relative;overflow:hidden;
                         padding:72px 0 64px;
                         background:var(--hol-surface-inverse);
                         color:var(--hol-text-inverse)}
/* LA PHOTO EST UN FOND, PAS UN CONTENU : elle remplit le bloc et se recadre,
   jamais elle ne le déforme ni ne décide de sa hauteur. */
.hol-scope .leg-banniere__fond{position:absolute;inset:0;width:100%;height:100%;
                               object-fit:cover;z-index:0}
/* LE VOILE EST OBLIGATOIRE dès qu'il y a une photo : sans lui, un cliché clair
   fait passer le texte blanc sous le seuil de contraste. Il descend de haut en
   bas plutôt que de gauche à droite, parce que le texte occupe toute la
   largeur de la bannière. */
.hol-scope .leg-banniere__voile{position:absolute;inset:0;z-index:1;
                                background:linear-gradient(180deg,
                                  var(--hol-hero-scrim-a) 0%,
                                  var(--hol-hero-scrim-d) 55%,
                                  var(--hol-hero-scrim-b) 100%)}
/* LE CONTENU DE LA BANNIÈRE PORTE DÉJÀ LA GOUTTIÈRE par la section : le
   conteneur n'y remet donc que sa largeur maximale. */
.hol-scope .leg-banniere__dedans{position:relative;z-index:2}
.hol-scope .leg-sur{margin:0 0 14px;font-family:var(--hol-police-mono),ui-monospace,monospace;
                    font-size:12.5px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;
                    color:var(--hol-brand-clair)}
.hol-scope .leg-h1{margin:0 0 16px;font-family:var(--hol-police-titre),sans-serif;
                   font-weight:800;font-size:clamp(32px,4.4vw,48px);line-height:1.06;
                   letter-spacing:-.02em;text-wrap:balance;color:var(--hol-text-inverse)}
/* LA LIGNE DE RÉSUMÉ VA PLUS LOIN QUE LA MESURE DE LECTURE ORDINAIRE, et c'est
   voulu : elle vit sous un titre qui occupe toute la largeur de la bannière, et
   coupée au tiers elle laissait un grand vide à droite qui faisait croire à un
   défaut de cadrage. Elle reste tout de même bridée, parce qu'une ligne de cent
   trente caractères ne se suit plus d'un bout à l'autre : l'œil perd le début
   de la ligne suivante. Quatre-vingt-seize est le compromis. */
.hol-scope .leg-chapo{margin:0;max-width:96ch;font-size:17px;line-height:1.6;
                      color:var(--hol-text-inverse-2);text-wrap:pretty}

.hol-scope .leg-section{padding:56px 0 90px}
.hol-scope .leg-duo{display:grid;grid-template-columns:1fr;gap:34px}

/* ── LE SOMMAIRE ─────────────────────────────────────────────────────────── */
.hol-scope .leg-som{padding:18px 20px;border-radius:var(--hol-r-lg);
                    background:var(--hol-surface-1);
                    border:1px solid var(--hol-border-subtle)}
/* LE MOT « SOMMAIRE » S'ALIGNE SUR LES LIENS, et c'est un vrai défaut que
   Jimmy a vu : « le sommaire, il n'y a pas le S ». Posé à zéro alors que les
   liens sont rentrés de douze pixels, il débordait d'autant à gauche ; le
   sommaire ayant sa propre barre de défilement, tout ce qui dépasse est COUPÉ,
   et c'est la première lettre qui payait. Il prend donc le même retrait que ce
   qu'il annonce, ce qui règle le rognage et redresse la colonne du même coup. */
.hol-scope .leg-som__mot{margin:0 0 10px;padding-left:10px;
                         font-family:var(--hol-police-mono),ui-monospace,monospace;
                         font-size:10.5px;font-weight:600;letter-spacing:.11em;
                         text-transform:uppercase;color:var(--hol-text-muted)}
.hol-scope .leg-som__liste{margin:0;padding:0;list-style:none;
                           display:flex;flex-wrap:wrap;gap:2px 14px}
.hol-scope .leg-som__liste li{min-width:0}
/* LE FILET EST RÉSERVÉ DÈS LE DÉPART, transparent. Apparu seulement sur la
   ligne en cours, il aurait élargi sa pastille de deux pixels au moment où le
   repère l'atteint, et toute la colonne aurait tressauté pendant la lecture. */
.hol-scope .leg-som .leg-som__liste a{display:block;padding:7px 10px;
                                      border:1px solid transparent;
                                      border-radius:var(--hol-r-sm);
                                      font-size:13.5px;line-height:1.45;
                                      text-decoration:none}
/* LE SURVOL EST UN SOUFFLE, PAS UNE SÉLECTION. Il portait le blanc plein, qui
   est le signal le plus fort de cette colonne : la ligne survolée ressortait
   donc plus que la ligne où l'on se trouve vraiment, et l'œil suivait la
   souris au lieu de suivre la lecture. */
.hol-scope .leg-som .leg-som__liste a:hover{background:var(--hol-brand-wash)}
.hol-scope .leg-som__liste a span{margin-right:4px;
                                  font-family:var(--hol-police-mono),ui-monospace,monospace;
                                  font-size:12px;color:var(--hol-text-muted)}

/* ── LE REPÈRE DE LECTURE ────────────────────────────────────────────────────
   CHEZ EUDUC C'EST UN FILET JAUNE À GAUCHE DU LIEN. Nous ne pouvons reprendre
   ni l'un ni l'autre : un filet de couleur à gauche d'un bloc est banni ici,
   Jimmy l'a refusé deux fois, et le jaune d'EUDUC n'entre pas dans la palette
   de HOLANGCOURS. Le repère dit donc la même chose avec nos moyens : la
   pastille se remplit, le texte passe au bleu de la marque et s'épaissit.
   TROIS SIGNAUX, JAMAIS LA COULEUR SEULE : le fond, le poids, et
   « aria-current » pour qui n'en voit aucun des deux. */
/* L'ARTICLE EN COURS EST UNE PASTILLE POSÉE SUR LA PAGE.

   IL PORTAIT LE VOILE DE MARQUE, #ECECF4, sur un fond de page #EEF1F8 : deux
   teintes à deux points d'écart, c'est-à-dire rien. Le repère existait et ne se
   voyait pas, et c'est ce que Jimmy a vu, en montrant la ligne SURVOLÉE comme
   étant celle qu'il voulait.

   IL PREND DONC LA PASTILLE PLEINE, avec son filet et son ombre : posée, elle
   se détache du fond. « Pas blanche, un petit peu grisée » : c'est le filet et
   l'ombre qui la grisent, pas le remplissage, sans quoi elle se confondrait de
   nouveau avec la page. Quatre signaux en tout, et aucun n'est la couleur
   seule : le relief, le filet, la graisse et « aria-current ». */
.hol-scope .leg-som .leg-som__liste a.est-ici{background:var(--hol-surface-1);
                                              border:1px solid var(--hol-border-strong);
                                              box-shadow:var(--hol-shadow-1);
                                              color:var(--hol-brand);font-weight:600}
.hol-scope .leg-som__liste a.est-ici span{color:var(--hol-brand)}

/* ── LE TEXTE ────────────────────────────────────────────────────────────── */
.hol-scope .leg-maj{margin:0 0 22px;font-family:var(--hol-police-mono),ui-monospace,monospace;
                    font-size:12px;letter-spacing:.04em;color:var(--hol-text-muted)}
/* LE TITRE SE DÉGAGE DE L'EN-TÊTE COLLANT quand on arrive par le sommaire :
   sans cette marge de défilement, le lien amène le titre SOUS la barre du haut,
   et l'on croit avoir atterri au mauvais endroit. */
.hol-scope .leg-art{padding-bottom:30px;
                    scroll-margin-top:calc(var(--hol-collant, 127px) + 20px)}
.hol-scope .leg-h2{margin:0 0 12px;font-family:var(--hol-police-titre),sans-serif;
                   font-weight:700;font-size:21px;line-height:1.25;letter-spacing:-.01em}
.hol-scope .leg-h2__n{margin-right:10px;font-family:var(--hol-police-mono),ui-monospace,monospace;
                      font-weight:500;font-size:14px;color:var(--hol-text-muted)}
/* LE TEXTE OCCUPE TOUTE LA COLONNE, comme les tableaux qui l'entourent.

   IL ÉTAIT BRIDÉ À 70 CARACTÈRES, ce qui est la bonne mesure pour un article
   qu'on lit d'un bout à l'autre. Mais ici les tableaux, eux, prennent toute la
   largeur du cadre : le texte s'arrêtait donc au milieu pendant que le tableau
   juste au-dessus allait jusqu'au bord, et la page semblait mal cadrée.
   Jimmy : « la longueur de ce cadre-là, les textes doivent être à cette
   longueur aussi ». Une seule largeur pour tout ce que contient la colonne. */
.hol-scope .leg-texte p{margin:0 0 12px;font-size:15px;line-height:1.68;
                        color:var(--hol-text-secondary)}
/* ── CE QU'UN TEXTE LÉGAL CONTIENT D'AUTRE QUE DES PHRASES ──────────────────
   Une énumération et un tableau, parce qu'un texte juridique en est plein : les
   droits d'une personne, les destinataires de ses données, les durées de
   conservation. Rendus en paragraphe, ces passages deviennent illisibles, et
   un texte illisible ne protège personne. */
.hol-scope .leg-liste{margin:0 0 14px;padding:0 0 0 22px}
.hol-scope .leg-liste li{margin:0 0 6px;font-size:15px;line-height:1.68;
                         color:var(--hol-text-secondary)}
.hol-scope .leg-cadre{overflow-x:auto;margin:0 0 18px;border-radius:var(--hol-r-sm);
                      border:1px solid var(--hol-border-subtle);background:var(--hol-surface-1)}
.hol-scope .leg-table{width:100%;border-collapse:collapse;font-size:14px;line-height:1.55}
.hol-scope .leg-table th{text-align:left;padding:11px 14px;font-weight:600;
                         font-size:12.5px;color:var(--hol-text-primary);
                         background:var(--hol-surface-2);
                         border-bottom:1px solid var(--hol-border-subtle)}
.hol-scope .leg-table td{padding:11px 14px;vertical-align:top;
                         color:var(--hol-text-secondary);
                         border-top:1px solid var(--hol-border-subtle)}
.hol-scope .leg-table td:first-child{color:var(--hol-text-primary);min-width:190px}

.hol-scope .leg-manque{display:flex;gap:10px;margin:0 0 26px;padding:14px 16px;
                       font-size:14px;line-height:1.5;border-radius:var(--hol-r-sm);
                       background:var(--hol-alerte-wash);border:1px solid var(--hol-alerte);
                       color:var(--hol-alerte)}
.hol-scope .leg-manque p,.hol-scope .leg-texte .leg-manque span{color:inherit}
.hol-scope .leg-texte .leg-manque a{color:var(--hol-alerte);font-weight:600}

/* ── À PARTIR DE 980 px : LE GABARIT D'EUDUC.COM ─────────────────────────── */
@media (min-width:980px){
  .hol-scope .leg-duo{grid-template-columns:232px minmax(0,1fr);gap:60px;
                      align-items:start}
  /* LE SOMMAIRE COLLE ET GARDE SA PROPRE BARRE DE DÉFILEMENT : avec seize
     articles il dépasse la hauteur de l'écran, et sans cela les derniers
     titres resteraient hors de vue pendant toute la lecture. Il perd son
     cadre : posé dans la marge, il n'a plus à se distinguer d'un bloc de
     texte, il EST la marge. Le navigateur qui ignore « sticky » le laisse
     simplement défiler, sans rien casser. */
  /* IL SE CALE SOUS CE QUI EST DÉJÀ COLLÉ EN HAUT, et pas à une valeur
     écrite à la main : l'en-tête et le fil d'ariane mesurent ensemble
     « --hol-collant », que le pied de page tient à jour. Posé à 92 px comme
     chez EUDUC, dont les barres sont moins hautes, le sommaire serait passé
     derrière les nôtres. */
  .hol-scope .leg-som{position:sticky;top:calc(var(--hol-collant, 127px) + 16px);
                      padding:0;background:none;border:0;
                      max-height:calc(100vh - var(--hol-collant, 127px) - 48px);
                      overflow-y:auto}
  .hol-scope .leg-som__liste{display:block}
  .hol-scope .leg-som .leg-som__liste a{padding:7px 12px}
  .hol-scope .leg-som__mot{padding-left:12px}
}

/* ═══════════════════════════════════════════════════════════════════════════
   SUR TÉLÉPHONE : UN PLANCHER DE LISIBILITÉ ET DE CIBLE

   AUDIT DU 4 OCTOBRE 2026, À 360 ET 375 px, sur seize écrans. Majorité des
   apprenants sur téléphone, souvent dehors, souvent sur un appareil ancien.
   Deux mesures reviennent partout :

     LE TEXTE. Des étiquettes à 8,5, 9 et 10 pixels, en capitales espacées :
     elles se devinent, elles ne se lisent pas. Le brief dit « rien sous
     13 px » ; ces micro-étiquettes sont un parti pris assumé sur grand écran,
     mais sur un téléphone le parti pris devient un défaut. Plancher à 11.

     LA CIBLE. Des pastilles de langue de 22 à 28 pixels de haut : un pouce en
     rate une sur trois. Plancher à 32, qui tient dans les barres existantes
     sans les faire grandir.

   CE BLOC NE TOUCHE QU'AUX ÉCRANS ÉTROITS : au-dessus de 600 px, le dessin
   d'origine est intact.

   IL EST EN FIN DE FEUILLE, ET CE N'EST PAS DU RANGEMENT : à spécificité
   égale, c'est la dernière règle qui gagne. Posé au milieu du fichier, il se
   faisait annuler par les déclarations écrites plus bas, et la moitié des
   corrections ne s'appliquait pas. */
@media (max-width:600px){
  /* Les sélecteurs de langue des trois barres : publique, espace, admin. */
  .hol-scope .adm-langue,
  .hol-scope .esp-barre__langue{min-height:32px;min-width:38px;font-size:11px}
  /* Les pastilles légales du pied : elles font 28 de haut, c'est trop peu pour
     des liens que la loi veut atteignables depuis chaque page. */
  /* Quatre pilules légales sur deux rangs : à trente-quatre pixels de haut
     elles pesaient autant que les boutons d'action de la page. Elles passent à
     trente, et restent lisibles : c'est la taille d'une mention, pas d'une
     action. */
  .hol-scope .hol-droits__bouton{min-height:30px;padding:5px 11px;font-size:11.5px}
  /* Les étiquettes du livre de facturation. */
  .hol-scope .fct-etiq{font-size:11px}
  .hol-scope .fct-table th{font-size:11px}
  .hol-scope .fct-somme__mot{font-size:11px}
  /* Les surtitres de filtre du catalogue et les intertitres du pied. */
  .hol-scope .ed-lab,
  .hol-scope .leg-som__mot{font-size:11px !important}

  /* UNE CASE À COCHER DE DIX-HUIT PIXELS SE RATE AU POUCE. Vingt-deux est le
     minimum tenable sans refaire les formulaires, et l'étiquette à côté reste
     cliquable, ce qui double la cible réelle. */
  /* Dix-neuf et non vingt-deux : à vingt-deux la case pesait plus lourd que la
     phrase de deux lignes posée à côté. La zone tactile reste celle du libellé,
     qui porte le clic. */
  .hol-scope input[type=checkbox],
  .hol-scope input[type=radio]{width:19px;height:19px;min-width:19px;min-height:19px}

  /* L'ADRESSE DE CONTACT DU PIED EST UN LIEN QU'ON VISE, pas un bout de phrase :
     elle avait dix-sept pixels de haut, c'est-à-dire rien pour un pouce. */
  .hol-scope .hol-pied__lien--plat{min-height:32px}

  /* ----- LE PIED DE PAGE SUR TÉLÉPHONE -------------------------------------
     Jimmy : « le logo et le texte avec pourraient être plus petits, ainsi que
     les icônes des réseaux, pour que ça reste cohérent avec le site ».
     La marque occupait soixante-quatre pixels de haut, soit la hauteur de
     l'en-tête entière, et six pastilles de quarante-quatre venaient buter sur
     la bulle de discussion, dans le coin droit. Tout baisse d'un cran, et la
     rangée se range au bord, à la gouttière près. */
  /* TOUT SE CENTRE, ET TOUT DESCEND D'UN CRAN. Sur un Android d'entrée de
     gamme, la marque et sa baseline à gauche, « nous suivre » et ses cinq
     pastilles à droite : deux blocs alignés sur deux bords opposés d'une
     colonne de trois cents pixels, ça se lit comme deux morceaux qui se
     tournent le dos. Jimmy : « centre le logo, le texte, nous suivre et les
     icônes, tu auras un rendu beaucoup plus professionnel ».

     LE RETRAIT NÉGATIF TOMBE AVEC. Les 12,8 pixels compensent le vide
     transparent que porte le fichier du logo : utile quand la marque s'aligne
     sur un bord, nuisible quand elle se centre, où il la décalerait de la
     moitié de cette valeur. Même raison pour le décalage de la baseline. */
  .hol-scope .hol-pied__haut{justify-content:center;text-align:center}
  .hol-scope .hol-pied__nous{margin-left:0;display:flex;flex-direction:column;
                             align-items:center}
  /* LA MARQUE FAIT LA LARGEUR DE SA BASELINE, à un pixel près. Jimmy, capture
     à l'appui : « agrandis légèrement le logo pour qu'il fasse la même
     longueur que le petit texte en dessous ».
     Le calcul se fait sur L'ENCRE, pas sur le cadre : le fichier porte 128
     pixels de vide à gauche et 125 à droite sur 3 300, donc l'image visible ne
     fait que 92,3 % de la largeur du cadre. « Une langue de plus, un monde de
     plus » mesure 222 pixels en 12 px ; il faut 240 de cadre, donc 46 de haut.
     Le retrait du bas suit : le fichier porte aussi 110 pixels de vide sous
     l'encre, qui grandissent avec lui. */
  .hol-scope .hol-pied__marque{height:46px !important;margin-bottom:-6px !important}
  .hol-scope .hol-pied__baseline{font-size:12px !important;padding-left:0 !important}
  .hol-scope .hol-pied__suivre__mot{text-align:center}
  .hol-scope .hol-pied__reseaux{justify-content:center}
  .hol-scope .hol-pied__reseau{width:32px;height:32px}
  .hol-scope .hol-pied__reseau svg{width:16px;height:16px}
  /* Le bloc « nous suivre » passait sous la marque et gardait la largeur de son
     contenu : aligné à droite de lui-même, il s'arrêtait au milieu de l'écran.
     Il prend toute la ligne, et sa rangée retrouve la marge de droite. */
  .hol-scope .hol-pied__suivre{width:100%}
  .hol-scope .hol-pied__reseaux{gap:6px}

  /* ═══ LES TITRES TIENNENT EN DEUX LIGNES ══════════════════════════════

     MESURÉ À 375 px : six titres de section occupaient TROIS lignes, et leurs
     tailles allaient de 22 à 40 pixels sans raison apparente, parce que chacun
     portait son propre « clamp ». Jimmy : « ça fait trop mastoc, remets-les
     sur deux lignes, ça fera plus professionnel ».

     UNE SEULE TAILLE POUR TOUS LES TITRES DE SECTION sur téléphone. Ce n'est
     pas un appauvrissement : sur trois cent soixante pixels, la hiérarchie ne
     se joue plus sur la taille des titres entre eux, elle se joue entre le
     titre et son texte. Vingt-trois pixels sur une colonne de trois cent
     quinze, c'est environ vingt caractères par ligne, donc deux lignes pour un
     titre de section ordinaire.

     « !important » EST ICI UN CHOIX, PAS UNE FACILITÉ : ces titres portent leur
     taille dans l'attribut « style » de la page, et un attribut bat n'importe
     quelle règle de feuille. Les alternatives étaient de réécrire une douzaine
     de styles en ligne dans six fichiers, ou de poser ce mot une fois, dans une
     règle qui ne vit que sous six cents pixels. */
  .hol-scope main h2,
  .hol-scope section h2{font-size:23px !important;line-height:1.18 !important;
                        letter-spacing:-.015em}

  /* LE TITRE DU HERO GARDE SON RANG, ET C'EST LUI QU'ON AGRANDIT. Il tenait sur
     une ligne parce qu'un « white-space:nowrap » le lui imposait, et il
     rétrécissait donc jusqu'à vingt-neuf pixels pour y arriver. Il s'écrit
     maintenant sur deux lignes, en trente-huit : c'est la première chose qu'on
     voit en ouvrant le site. */
  .hol-scope [data-hero] h1{font-size:clamp(38px,9vw,46px) !important;
                            line-height:1.04 !important}

  /* LES HÉROS DES PAGES INTERNES TIENNENT AUSSI SUR DEUX LIGNES. Celui de
     l'accueil porte quatre mots, ceux des pages en portent six ou sept : à
     quarante pixels, « Une méthode honnête, en quatre étapes » prenait trois
     lignes et la moitié de l'écran avant le premier mot du texte. Trente
     pixels sur une colonne de trois cent quinze, c'est dix-huit caractères par
     ligne, et ces titres-là en font trente-six. */
  .hol-scope .hero-duo h1,
  .hol-scope .hero-duo__texte h1{font-size:30px !important;line-height:1.08 !important}

  /* ═══ LES CARTES DE FORMAT RESPIRENT MOINS ═══════════════════════════════

     Elles faisaient 566 pixels de haut pour 391 pixels d'image, sur un écran
     qui en fait 812 : une seule carte occupait les deux tiers de l'écran, et il
     en faut quatre. Le portrait quatre cinquièmes a du sens sur un grand écran
     où les quatre sont côte à côte ; empilées, elles demandent un format
     paysage. Seize dixièmes, soit 62,5 %. */
  .hol-scope .fmt-carte .hol-ratio--4x5{padding-bottom:62.5%}

  /* UN BOUTON LONG SE CASSE PLUTÔT QUE DE DÉBORDER. « Voir l'accompagnement
     professionnel » tenait à un pixel près à 375 ; à 360 il sortait du cadre.
     Sur téléphone, la ligne se coupe et la hauteur suit. */
  .hol-scope .offre-pro__devis .hol-btn{white-space:normal;line-height:1.3;
                                        padding-top:11px;padding-bottom:11px}
}

/* ═══ LA PUCE DE MARQUE ════════════════════════════════════════════════════
   Elle remplace les pastilles rondes de couleur qui ponctuaient trois écrans.
   Décision de Jimmy, 4 octobre 2026 : « enlève ce point, et utilise notre
   petit logo ». Décorative, donc « alt » vide et « aria-hidden » : elle ne se
   lit pas, elle se voit. */
.hol-scope .hol-puce{flex:none;width:18px;height:18px;display:block}

/* SUR FOND SOMBRE, LES DEUX BLEUS DISPARAÎTRAIENT. On ne recolore pas le
   dessin, on redéfinit ses trois encres : le trait principal passe au blanc,
   le second à un blanc atténué, et le rouge reste, il tient sur le marine. */
.hol-scope [data-hero] .hol-puce,
.hol-scope footer .hol-puce,
.hol-scope [style*="--hol-surface-inverse"] .hol-puce{
  --hol-puce-1:var(--hol-text-inverse);
  --hol-puce-2:var(--hol-text-inverse-muted);
  --hol-puce-3:var(--hol-accent-clair,var(--hol-accent))}


/* ===========================================================================
   SOUS-NAVIGATION DES PAGES INTERNES (.hol-subnav)
   Vision · Équipe · Méthode · Questions fréquentes.

   ELLE PASSAIT À LA LIGNE, ET LA LIGNE COÛTAIT CHER. Quatre libellés en
   capitales mono ne tiennent pas sur trois cent soixante-quinze pixels : ils se
   répartissaient sur deux rangs de quarante-huit pixels, séparés par l'écart de
   vingt-six, soit cent vingt pixels de barre avant même d'avoir lu le titre de
   la page. Jimmy : « entre les deux menus, il y a trop d'écart ».

   Un seul rang, donc, qui se fait glisser du doigt quand il déborde. Sa barre
   de défilement est masquée comme celle de la piste : le dépassement du dernier
   libellé sur le bord dit déjà qu'il y a une suite.
   =========================================================================== */
.hol-scope .hol-subnav{display:flex;gap:26px;flex-wrap:wrap;
                       justify-content:flex-end;align-items:center}
@media (max-width:760px){
  .hol-scope .hol-subnav{flex-wrap:nowrap;justify-content:flex-start;
                         gap:20px;overflow-x:auto;
                         scrollbar-width:none;-ms-overflow-style:none}
  .hol-scope .hol-subnav::-webkit-scrollbar{width:0;height:0;display:none}
  .hol-scope .hol-subnav__lien{min-height:42px;font-size:11.5px;flex:none}
}

/* ===========================================================================
   LA PISTE DES FORMATS (.fmt-piste)
   Mêmes flèches, même script que « l'expérience », sur tous les écrans.

   ELLE DÉFILE AUSSI SUR TÉLÉPHONE, DÉSORMAIS. On avait d'abord empilé les
   quatre cartes à la verticale, en se disant qu'un téléphone a toute la
   hauteur qu'il veut. Jimmy, écran en main : « quand il y a des cartes qui se
   défilent à la file indienne, il serait mieux que tu les mettes côte à côte
   pour se défiler avec la petite flèche gauche, défilement à droite. Ce serait
   professionnel, ce serait plus mieux pour naviguer. » Il a raison sur le
   fond : empilées, les quatre cartes faisaient huit cents pixels de page à
   traverser sans savoir combien il en restait ; côte à côte, les deux flèches
   disent qu'il y a une suite et combien on en a vu.
   =========================================================================== */
/* LA MISE EN FORME EST DANS LA FEUILLE, PAS DANS L'ATTRIBUT « style » : une
   déclaration posée en ligne bat n'importe quelle règle d'ici, paliers
   d'écran compris. */
.hol-scope .fmt-piste{display:flex;gap:18px;overflow-x:auto;
                      scroll-snap-type:x mandatory;scroll-behavior:smooth;
                      padding:20px 0 6px;-webkit-overflow-scrolling:touch}
@media (prefers-reduced-motion:reduce){
  .hol-scope .fmt-piste{scroll-behavior:auto}
}

/* ===========================================================================
   DEUX COLONNES FACE À FACE, DES CARTES QUI DÉMARRENT À LA MÊME LIGNE
   « Peu de monde, du vrai. » tient sur une ligne, « Pas encore d'avis… » sur
   deux : les cartes dessous se décalaient d'une ligne entière. Jimmy : « ce
   n'est pas aligné, ça fait mal aux yeux ». Les deux titres réservent deux
   lignes, qu'ils les remplissent ou non.
   =========================================================================== */
.hol-scope .equ-h2{min-height:2.24em}
@media (max-width:620px){ .hol-scope .equ-h2{min-height:0} }

/* ===========================================================================
   LA TABLETTE A SON PALIER (601 à 900 px)
   Entre le téléphone et l'ordinateur, les titres gardaient leur taille de
   grand écran dans des colonnes deux fois plus étroites : trois lignes
   partout. Jimmy, sur iPad : « les titres sur deux lignes seraient plus
   professionnels, plus attrayants à regarder. »
   =========================================================================== */
@media (min-width:601px) and (max-width:900px){
  .hol-scope main h2,
  .hol-scope section h2{font-size:26px !important;line-height:1.14 !important;
                        letter-spacing:-.018em}
  .hol-scope .hero-duo h1,
  .hol-scope .hero-duo__texte h1{font-size:40px !important;line-height:1.06 !important}
}

/* ===========================================================================
   LA BARRE LÉGALE SOUS MILLE PIXELS
   La mention de droits et les quatre pastilles tiennent sur une ligne à partir
   d'un millier de pixels. En dessous, la ligne se cassait au milieu des
   pastilles : deux restaient accrochées à la mention, deux tombaient dessous,
   décalées. Jimmy, sur iPad : « c'est un peu en vrac, est-ce que ça ne pourrait
   pas être aligné et réduit ». La mention garde sa ligne, les pastilles passent
   dessous, centrées et à égale distance.
   =========================================================================== */
@media (max-width:1000px){
  /* LES DEUX LIGNES DU BAS SE CENTRENT ENSEMBLE. La mention de droits se
     centrait, « HOLANGCOURS, une initiative EUDUC » restait à gauche : deux
     lignes superposées, deux alignements, et l'œil le voit tout de suite.
     Jimmy : « on peut centrer aussi, comme tu as centré le copyright ». */
  .hol-scope .hol-pied__bas{align-items:center;text-align:center}
  .hol-scope .hol-droits{text-align:center}
  .hol-scope .hol-droits__pt{display:none}
  .hol-scope .hol-droits__actions{display:flex;flex-wrap:wrap;
                                  justify-content:center;gap:8px;margin-top:10px}
  .hol-scope .hol-droits__actions .hol-droits__bouton{margin:0}
}

/* ===========================================================================
   LE SOMMAIRE LÉGAL HORS GRAND ÉCRAN
   Au-dessus de 980 px c'est une colonne collante à côté du texte. En dessous,
   il passait au-dessus du texte en bande souple : vingt-sept entrées de
   longueurs très inégales, posées les unes après les autres, formaient des
   rangs en dents de scie où l'on ne retrouvait plus un numéro. Jimmy, sur
   iPad : « il y a de grands bugs dans l'affichage du sommaire ».

   Ce n'est pas une bande, c'est une table des matières : deux colonnes nettes,
   une entrée par cellule, les numéros alignés à droite les uns sous les
   autres. Sur un téléphone, une seule colonne.
   =========================================================================== */
@media (max-width:979px){
  .hol-scope .leg-som__liste{display:grid;
                             grid-template-columns:repeat(2,minmax(0,1fr));
                             gap:2px 12px}
  .hol-scope .leg-som .leg-som__liste a{display:flex;align-items:baseline;gap:7px}
  .hol-scope .leg-som__liste a span{flex:none;min-width:2.1em;text-align:right;
                                    margin-right:0}
}
@media (max-width:620px){
  .hol-scope .leg-som__liste{grid-template-columns:minmax(0,1fr)}
}

/* ===========================================================================
   LES TITRES DES PAGES LÉGALES SUR TÉLÉPHONE
   « Conditions générales de vente aux consommateurs » et « 13. Séances
   d'accompagnement et travaux corrigés » sont des intitulés qu'on ne peut pas
   raccourcir : ils nomment un document et un article, et c'est leur exactitude
   qui compte. C'est donc la taille qui cède, pas le texte.
   =========================================================================== */
@media (max-width:600px){
  .hol-scope .leg-h1{font-size:22px !important;line-height:1.14 !important}
  .hol-scope .leg-h2{font-size:18px !important;line-height:1.2 !important}
}

/* ===========================================================================
   LA SIGNATURE SUR LE BORD : LA RÈGLE
   Voir le commentaire des jetons « --hol-signe » plus haut dans ce fichier.
   La carte doit être positionnée pour que la marque puisse sortir de son
   cadre ; « overflow:hidden » la couperait, on le neutralise donc là où la
   classe est posée, et jamais ailleurs.
   =========================================================================== */
.hol-scope .hol-card--signee{position:relative;overflow:visible}
.hol-scope .hol-card--signee::before{
  content:"";position:absolute;z-index:3;pointer-events:none;
  top:-13px;left:24px;width:26px;height:26px;
  background:var(--hol-signe) center/26px 26px no-repeat}

/* RIEN DERRIÈRE LA MARQUE. Elle avait d'abord une pastille claire, pour couper
   le filet de la carte. Jimmy : « enlève cet ovale, tu laisses que le petit
   icône ». Les trois traits sont assez épais pour se lire seuls, et le filet
   qui passe entre eux ne se remarque pas à cette taille.

   ET SEULEMENT SUR LES CARTES DE TEXTE. Les cartes qui portent déjà une photo
   n'en veulent pas : l'image est leur signature. Celle-ci est réservée aux
   blocs de texte qui portent un argument fort, ceux sur lesquels on veut que
   l'œil s'arrête. Posée partout, elle ne retiendrait plus rien. */

/* Sur un téléphone, la gouttière est plus serrée : la marque se rapproche du
   coin pour ne pas sembler flotter au milieu du bord. */
@media (max-width:600px){
  .hol-scope .hol-card--signee::before{left:18px;top:-11px;
                                       width:22px;height:22px;
                                       background-size:22px 22px}
}

/* ===========================================================================
   LA BARRE DE L'EN-TÊTE PUBLIC, ET LE PALIER DU PORTABLE

   CE QU'ELLE PORTE, mesuré sur l'écran d'un administrateur connecté, qui est
   le cas le plus chargé : la marque 244, la navigation 426 de contenu, les
   langues 86, les devises 51, l'identité 112, le panier 42, le bouton
   « Administration » 146, et six écarts de 20. Soit 1 227 pixels.

   LA PLACE, ELLE, VAUT 84 % DE L'ÉCRAN, gouttière déduite : 1 008 à 1 200 px,
   1 080 à 1 280. Il manquait donc deux cents pixels, et le bouton rouge
   tombait sous la marque. Jimmy, sur un treize pouces : « l'icône
   Administration déborde en dessous du logo, ce n'est pas professionnel ».

   ON NE REPLIE PAS LA BARRE POUR AUTANT : sur un portable, la navigation
   complète est ce qu'on attend. On reprend les deux cents pixels là où ils ne
   coûtent rien : la marque descend d'un cran, le prénom s'efface derrière son
   rond, et les écarts se resserrent. Le compte y est, avec une marge.
   =========================================================================== */
.hol-scope .ent-barre{padding-top:10px;padding-bottom:10px;min-height:70px;
                      display:flex;align-items:center;flex-wrap:wrap;gap:10px 20px}
.hol-scope .ent-nav a{font-size:15px}

@media (min-width:1260px) and (max-width:1500px){
  .hol-scope{--ent-logo-h:42px}                       /* 244 → 210 : -34 */
  .hol-scope .ent-barre{gap:10px 12px}                /* six écarts : -48 */
  .hol-scope .ent-nav{gap:16px;margin-left:12px}      /* -36 et -18 */
  .hol-scope .ent-nav a{font-size:14.5px}             /* -12 sur les libellés */
  /* Le rond reste, c'est la porte du compte ; le prénom est redit partout
     ailleurs, et il vaut soixante-quatorze pixels. */
  .hol-scope header[data-entete] .hol-identite__nom{display:none}
}

/* ===========================================================================
   LES CARTES DE BUREAU (.aen-*)
   Une carte par domaine : une bande d'image en 16/9, une icône, un titre, une
   phrase, et en bas soit un bouton soit la mention du chantier à venir.

   ELLES ÉTAIENT ÉCRITES DANS L'ÉCRAN DE L'ENTREPRISE. Une deuxième direction
   les emploie désormais, « Communication et marketing », et une troisième
   suivra : recopier le style aurait suffi à les faire diverger au premier
   ajustement. Elles vivent donc ici, comme tout ce qui sert deux fois.

   CE QUI RESTE PROPRE À L'ENTREPRISE y est resté : l'avertissement du haut et
   le mot de confirmation.
   =========================================================================== */
.aen-grille{display:grid;grid-template-columns:repeat(auto-fill,minmax(285px,1fr));
            gap:18px}
.aen-carte.est-ouvert{border-color:var(--hol-brand-border);
                      box-shadow:var(--hol-shadow-2)}
.aen-carte{display:flex;flex-direction:column;height:100%;
           border-radius:var(--hol-r-lg);overflow:hidden;
           background:var(--hol-surface-1);
           border:1px solid var(--hol-border-subtle);
           box-shadow:var(--hol-shadow-1)}
.aen-carte__corps{display:flex;flex-direction:column;gap:9px;flex:1 1 auto;
                  padding:18px 22px 20px}
/* L'IMAGE : une bande en 16/9, calée par le rembourrage et non par
   « aspect-ratio », que les vieux Android ignorent. Tant qu'aucune image
   n'est posée, on garde la place avec un aplat de marque et l'icône : un
   cadre vide vaut mieux qu'une carte qui change de forme le jour où l'on
   met la photo. */
.aen-image{position:relative;width:100%;padding-bottom:56.25%;
           background:var(--hol-brand-wash);overflow:hidden}
.aen-image > *{position:absolute;top:0;left:0;width:100%;height:100%}
.aen-image img{object-fit:cover;display:block}
.aen-image__vide{display:flex;align-items:center;justify-content:center}
/* LE CHOIX DE L'IMAGE, POSÉ SUR L'IMAGE. Discret au repos, franc au survol :
   dix cartes avec un bloc de réglage permanent deviendraient un formulaire,
   et l'on ne verrait plus les cartes. */
.aen-choix{position:absolute;inset:auto 0 0 0;height:auto;
           display:flex;gap:6px;justify-content:flex-end;align-items:center;
           padding:8px 9px;opacity:0;
           background:linear-gradient(to top, rgba(20,22,42,.72), rgba(20,22,42,0));
           transition:opacity .15s ease}
.aen-carte:hover .aen-choix,
.aen-choix:focus-within{opacity:1}
/* Le champ reste dans la page pour que le sélecteur ait où écrire et qu'on
   puisse coller une adresse ; il ne prend pas de place à l'œil. */
.aen-url{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.aen-choix .med-bouton,.aen-oter{min-height:28px;padding:0 11px;cursor:pointer;
           font:inherit;font-size:11.5px;font-weight:600;
           border-radius:var(--hol-r-pill);
           background:var(--hol-surface-1);color:var(--hol-text-primary);
           border:1px solid var(--hol-surface-1)}
.aen-choix .med-bouton:hover,.aen-oter:hover{background:var(--hol-brand);
           color:var(--hol-text-inverse);border-color:var(--hol-brand)}
.aen-oter{background:transparent;color:#FFFFFF;border-color:rgba(255,255,255,.55)}
.aen-image__vide .aen-icone{width:38px;height:38px;opacity:.4}
.aen-icone{width:24px;height:24px;fill:none;stroke:var(--hol-brand);
           stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex:none}
.aen-tete{display:flex;align-items:center;gap:10px}
.aen-carte h2{margin:2px 0 0;font-family:var(--hol-police-titre),sans-serif;
              font-weight:700;font-size:17px;letter-spacing:-.01em}
.aen-carte p{margin:0;font-size:13.5px;line-height:1.6;
             color:var(--hol-text-secondary)}
/* L'ÉTAT EST ÉCRIT SUR CHAQUE CARTE, et c'est le même pour toutes : rien
   n'est commencé. Le jour où l'un démarre, c'est là qu'on le dira. */
/* L'ÉTAT ET LE BOUTON SONT POUSSÉS EN BAS : c'est ce qui aligne les cartes
   entre elles quand leurs textes n'ont pas la même longueur. */
.aen-etat{margin-top:auto;padding-top:10px;align-self:flex-start;
          padding:3px 10px;border-radius:var(--hol-r-pill);
          background:var(--hol-surface-0);color:var(--hol-text-muted);
          font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:9.5px;
          font-weight:600;letter-spacing:.09em;text-transform:uppercase}


/* ===========================================================================
   LA HAUTEUR DU HERO, ET LA BANDE D'ANNONCE QUI LE SUIT

   LE BRIEF DIT 88vh, et c'est juste sur un grand écran. Sur un écran court, ça
   coupe la bande rouge en deux. Le compte, mesuré à 360 sur 800 : en-tête 71,
   hero 704, bande 45. Total 820 pour 800 de fenêtre : il manque vingt pixels,
   et l'on ne lit plus qu'une moitié de lettres. Jimmy : « le texte qui défile
   en bas n'est pas lisible, remonte-le, il y a la place ». Vu sur un Android
   de 800 et sur un portable treize pouces, qui fait 800 lui aussi.

   LE SEUIL EST CALCULÉ, PAS CHOISI : la bande tient tant que
   71 + 0,88 H + 45 <= H, c'est-à-dire H >= 967. En dessous, le hero prend
   toute la hauteur MOINS ce qu'il faut à l'en-tête et à la bande.

   « svh » PLUTÔT QUE « vh » SUR TÉLÉPHONE : « vh » compte la fenêtre sans la
   barre d'adresse du navigateur, qui finit par la recouvrir. La déclaration en
   « vh » reste écrite au-dessus pour les moteurs qui ignorent « svh » : ils la
   gardent, et c'est déjà la bonne mesure à quelques pixels près.
   =========================================================================== */
.hol-scope [data-hero]{min-height:88vh}
@media (max-height:980px){
  .hol-scope [data-hero]{min-height:calc(100vh - 120px)}
  .hol-scope [data-hero]{min-height:calc(100svh - 120px)}
}
/* ET SOUS 720 PIXELS DE HAUT, LA HAUTEUR MINIMALE NE SUFFIT PLUS : c'est le
   CONTENU qui dépasse. Sur un Android de 320 sur 640, le bloc de texte fait
   446 pixels et les soixante-dix de respiration du brief en ajoutent cent
   quarante de chaque côté : cinq cent quatre-vingt-six, pour cinq cent vingt
   disponibles. Le brief fixe cette respiration pour un écran d'ordinateur ;
   sur un écran de la hauteur d'une carte postale, la tenir reviendrait à
   couper la bande qu'elle est censée mettre en valeur. Elle passe donc à
   trente-six, et tout rentre. */
/* La respiration du brief, posée en feuille et non dans l'attribut « style » :
   un style en ligne bat n'importe quelle règle de média, et c'est précisément
   une règle de média qu'il faut ici. */
.hol-scope .hero-mots{padding-top:70px;padding-bottom:70px}
@media (max-height:720px){
  .hol-scope .hero-mots{padding-top:36px;padding-bottom:36px}
}

/* ===========================================================================
   LES FLÈCHES DE LA BANDE DE L'ESPACE (.esp-rail__fleche)
   Elles n'existent que sous 900 pixels, là où la colonne devient une bande qui
   défile. Au-dessus, la colonne est verticale et il n'y a rien à faire
   défiler : les boutons restent cachés, et le script ne les montre pas.

   ELLES SE POSENT AUX DEUX BORDS DE LA BANDE, par-dessus, sur une pastille de
   la couleur de la colonne : la bande est sombre, un rond clair y serait un
   trou. Le filet à quarante pour cent de blanc passe les 3:1 que demande un
   objet avec lequel on interagit, et c'est la mesure déjà retenue pour les
   flèches de l'aperçu.
   =========================================================================== */
.hol-scope .esp-rail__fleche{display:none}
@media (max-width:900px){
  .hol-scope .esp-rail{position:relative}
  .hol-scope .esp-rail__fleche{position:absolute;top:50%;z-index:3;
                               width:34px;height:34px;margin-top:-17px;
                               display:flex;align-items:center;justify-content:center;
                               border-radius:var(--hol-r-pill);
                               border:1px solid rgba(255,255,255,.40);
                               background:var(--hol-surface-inverse);
                               color:var(--hol-text-inverse);
                               box-shadow:0 4px 14px rgba(9,10,32,.5);
                               cursor:pointer;padding:0}
  .hol-scope .esp-rail__fleche[hidden]{display:none}
  .hol-scope .esp-rail__fleche--g{left:4px}
  .hol-scope .esp-rail__fleche--d{right:4px}
  .hol-scope .esp-rail__fleche:hover{background:var(--hol-brand);border-color:var(--hol-brand)}
  .hol-scope .esp-rail__fleche:focus-visible{outline:2px solid var(--hol-focus-inverse);
                                             outline-offset:2px}
  /* Éteinte plutôt qu'escamotée au bout de la course : la bande garde la même
     tête du premier au dernier lien. */
  .hol-scope .esp-rail__fleche[aria-disabled="true"]{opacity:.34}
  /* La bande s'écarte de la place des flèches, des deux côtés également. */
  .hol-scope .esp-rail__dedans{padding-left:42px;padding-right:42px}
}
/* ═══════════════════════════════════════════════════════════════════════════
   LE JOURNAL : LA LISTE ET LA PAGE D'UN ARTICLE
   ───────────────────────────────────────────────────────────────────────────
   Écrit le 20 octobre 2026, avec le module (migration 117). La mise en page
   est celle des pages légales, mesurée sur euduc.com et déjà validée par
   Jimmy : bannière sombre, puis deux colonnes, sommaire collant à gauche et
   texte à droite. Ce qui change tient à ce qu'est un article et non un
   contrat : la mesure de lecture est bridée à soixante-dix caractères, le
   texte est plus grand d'un point et demi, et il y a des illustrations.

   PRÉFIXE « jrnl- » : « jrn- » est pris par la rangée de cartes de l'accueil
   (.jrn-cadre, .jrn-piste), et deux composants de même nom dans une feuille,
   c'est le dernier qui gagne partout.

   TOUTE RÈGLE EST PRÉFIXÉE « .hol-scope », y compris dans les blocs de média :
   une base écrite « .hol-scope .x » bat une règle de média écrite « .x ».
   =========================================================================== */

.hol-scope .jrnl-banniere{position:relative;overflow:hidden;padding:72px 0 64px;
                          background:var(--hol-surface-inverse);
                          color:var(--hol-text-inverse)}

/* ── LE FOND DU BANDEAU, ET SON VOILE ─────────────────────────────────────
   Jimmy, le 20 octobre 2026 : « le héros des articles manque une image de
   fond avec des dégradés dessus ».

   LE VOILE EST OBLIGATOIRE, exactement comme sur le hero de l'accueil : sans
   lui, un titre blanc posé sur une photo claire ne passe aucun contraste. Les
   trois teintes sont celles du hero, reprises telles quelles.

   DEUX DÉGRADÉS SUPERPOSÉS, et chacun a son rôle. Celui de gauche à droite
   garde la colonne de texte opaque et laisse respirer la photo à droite, là
   où il n'y a rien d'écrit. Celui du bas rattache le bandeau à la page, pour
   que l'illustration qui mord dessus ne tombe pas sur une arête.

   LES QUATRE CÔTÉS EN TOUTES LETTRES : le raccourci « inset » manque aux
   Android anciens que ce site doit servir. */
.hol-scope .jrnl-banniere__fond{position:absolute;top:0;right:0;bottom:0;left:0;
                                z-index:0;pointer-events:none}
.hol-scope .jrnl-banniere__fond img,
.hol-scope .jrnl-banniere__fond picture{display:block;width:100%;height:100%;
                                        object-fit:cover;object-position:60% center}
.hol-scope .jrnl-banniere__voile{position:absolute;top:0;right:0;bottom:0;left:0;
  background:
    linear-gradient(180deg, transparent 58%, var(--hol-surface-inverse) 100%),
    linear-gradient(90deg,
      var(--hol-hero-scrim-a) 0%,
      var(--hol-hero-scrim-a) 42%,
      var(--hol-hero-scrim-b) 70%,
      var(--hol-hero-scrim-c) 94%,
      var(--hol-hero-scrim-c) 100%)}
/* SOUS 1040 PIXELS, LE VOILE SE REFERME. Le texte y occupe toute la largeur,
   donc il n'y a plus de côté droit à laisser respirer : alléger le voile
   reviendrait à poser un chapô blanc sur une photo claire. La photo reste
   visible, mais en retrait, comme une texture. */
@media (max-width:1039px){
  .hol-scope .jrnl-banniere__voile{
    background:
      linear-gradient(180deg, transparent 62%, var(--hol-surface-inverse) 100%),
      linear-gradient(90deg,
        var(--hol-hero-scrim-a) 0%,
        var(--hol-hero-scrim-b) 100%)}
}
/* SUR UN TÉLÉPHONE, LE VOILE SE FERME TOUT À FAIT. Le chapô y court jusqu'au
   bord droit, donc sur la partie la plus claire du dégradé, et du texte gris
   clair sur une photo de bibliothèque éclairée ne passe plus le contraste.
   La photo se devine encore ; c'est tout ce qu'on lui demande à cette
   largeur, et la lisibilité ne se négocie pas. */
@media (max-width:600px){
  .hol-scope .jrnl-banniere__voile{
    background:
      linear-gradient(180deg, transparent 70%, var(--hol-surface-inverse) 100%),
      linear-gradient(90deg,
        var(--hol-hero-scrim-a) 0%,
        var(--hol-hero-scrim-a) 100%)}
}
/* Le texte passe au-dessus des deux couches. */
.hol-scope .jrnl-banniere__mots{position:relative;z-index:1}
/* LE SURTITRE EST DU TEXTE NU : ni pilule, ni fond, ni point devant. Jimmy a
   refusé ce motif le 10 octobre 2026, c'est la signature des pages générées. */
.hol-scope .jrnl-sur{margin:0 0 14px;font-family:var(--hol-police-mono),ui-monospace,monospace;
                     font-size:12.5px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;
                     color:var(--hol-brand-clair)}
/* Le fil vers la liste du journal vit dans ce surtitre. Sa couleur se pose
   avec les deux jetons, jamais avec « color » : la règle globale « .hol-scope a »
   est plus spécifique qu'une classe. */
.hol-scope .jrnl-fil{--hol-lien:var(--hol-brand-clair);
                     --hol-lien-survol:var(--hol-text-inverse);
                     text-decoration:none}
.hol-scope .jrnl-h1{margin:0 0 16px;font-family:var(--hol-police-titre),sans-serif;
                    font-weight:800;font-size:clamp(32px,4.4vw,48px);line-height:1.06;
                    letter-spacing:-.02em;text-wrap:balance;color:var(--hol-text-inverse)}
/* LE TITRE D'UN ARTICLE SE BRIDE EN LARGEUR, celui d'une page non : une
   phrase de titre qui court sur toute une bannière de 1480 pixels se perd.

   TRENTE-DEUX SIGNES, ET C'EST MESURÉ. Jimmy, le 20 octobre : « les titres de
   l'article sur deux lignes ». À vingt-deux, nos trois titres tombaient sur
   trois lignes alors que la moitié droite de la bannière restait vide. À
   trente-deux, les six titres, français et anglais, tiennent sur deux lignes,
   et « text-wrap:balance » les répartit également.

   CE N'EST PAS UNE GARANTIE POUR TOUJOURS : un titre de plus de soixante-dix
   signes repassera sur trois lignes. C'est le bon signal, et il se corrige en
   raccourcissant le titre, pas en rapetissant la police. */
/* Jimmy, le 24 octobre : « trop empilé pendant qu'il y a de l'espace vers la
   droite ». Le titre passe à quarante signes, le chapô à quatre-vingts, et
   le voile garde sa partie opaque d'autant plus loin (voir plus haut). */
.hol-scope .jrnl-h1--art{max-width:40ch}
.hol-scope .jrnl-chapo{margin:0;max-width:82ch;font-size:17px;line-height:1.6;
                       color:var(--hol-text-inverse-2);text-wrap:pretty}
/* SUR LE BANDEAU, LE CHAPÔ RESTE DANS LA ZONE OPAQUE DU VOILE. Le dégradé
   s'allège passé soixante-dix pour cent de la largeur (soixante-deux avant le
   24 octobre), pour laisser voir la photo là où rien n'est écrit ; le chapô,
   à quatre-vingts signes, s'arrête avant. */
.hol-scope .jrnl-banniere .jrnl-chapo{max-width:80ch}
.hol-scope .jrnl-meta{display:flex;flex-wrap:wrap;gap:8px;margin:20px 0 0;
                      font-family:var(--hol-police-mono),ui-monospace,monospace;
                      font-size:12px;letter-spacing:.04em;color:var(--hol-text-inverse-2)}

/* L'ILLUSTRATION DE TÊTE MORD SUR LA BANNIÈRE : elle relie le titre au texte
   au lieu de flotter entre les deux. Le chevauchement est modeste, et nul en
   dessous de 700 px, où il mangerait la ligne de signature. */
.hol-scope .jrnl-tete{margin:22px 0 0;position:relative;z-index:2;
                      border-radius:var(--hol-r-lg);overflow:hidden;
                      box-shadow:var(--hol-shadow-2);background:var(--hol-surface-1);
                      aspect-ratio:16/9}
.hol-scope .jrnl-tete img{display:block;width:100%;height:100%;object-fit:cover}

.hol-scope .jrnl-section{padding:48px 0 var(--hol-bloc)}
.hol-scope .jrnl-duo{display:grid;grid-template-columns:1fr;gap:30px}

/* ── LE SOMMAIRE : même objet que celui des pages légales ─────────────────── */
.hol-scope .jrnl-som{padding:18px 20px;border-radius:var(--hol-r-lg);
                     background:var(--hol-surface-1);
                     border:1px solid var(--hol-border-subtle)}
.hol-scope .jrnl-som__mot{margin:0 0 10px;padding-left:10px;
                          font-family:var(--hol-police-mono),ui-monospace,monospace;
                          font-size:10.5px;font-weight:600;letter-spacing:.11em;
                          text-transform:uppercase;color:var(--hol-text-muted)}
.hol-scope .jrnl-som__liste{margin:0;padding:0;list-style:none;
                            display:flex;flex-wrap:wrap;gap:2px 14px}
.hol-scope .jrnl-som__liste li{min-width:0}
.hol-scope .jrnl-som .jrnl-som__liste a{display:block;padding:7px 10px;
                                        border:1px solid transparent;
                                        border-radius:var(--hol-r-sm);
                                        font-size:13.5px;line-height:1.45;
                                        text-decoration:none}
.hol-scope .jrnl-som .jrnl-som__liste a:hover{background:var(--hol-brand-wash)}
.hol-scope .jrnl-som__liste a span{margin-right:4px;
                                   font-family:var(--hol-police-mono),ui-monospace,monospace;
                                   font-size:12px;color:var(--hol-text-muted)}
/* QUATRE SIGNAUX, JAMAIS LA COULEUR SEULE : le relief, le filet, la graisse,
   et « aria-current » posé par le script pour qui n'en voit aucun. */
.hol-scope .jrnl-som .jrnl-som__liste a.est-ici{background:var(--hol-surface-1);
                                                border:1px solid var(--hol-border-strong);
                                                box-shadow:var(--hol-shadow-1);
                                                color:var(--hol-brand);font-weight:600}
.hol-scope .jrnl-som__liste a.est-ici span{color:var(--hol-brand)}

/* ── LE TEXTE DE L'ARTICLE ───────────────────────────────────────────────────
   MESURE DE LECTURE BRIDÉE, contrairement aux pages légales qui portent des
   tableaux larges : un article se lit d'un bout à l'autre, et au-delà de
   soixante-dix caractères l'œil perd le début de la ligne suivante. */
.hol-scope .jrnl-texte{max-width:70ch}
.hol-scope .jrnl-texte p{margin:0 0 16px;font-size:16.5px;line-height:1.72;
                         color:var(--hol-text-secondary);text-wrap:pretty}
.hol-scope .jrnl-texte h2{margin:38px 0 14px;font-family:var(--hol-police-titre),sans-serif;
                          font-weight:700;font-size:clamp(22px,2.6vw,26px);line-height:1.24;
                          letter-spacing:-.015em;color:var(--hol-text-primary);
                          scroll-margin-top:calc(var(--hol-collant, 127px) + 20px)}
.hol-scope .jrnl-texte h3{margin:28px 0 10px;font-family:var(--hol-police-titre),sans-serif;
                          font-weight:700;font-size:18.5px;line-height:1.3;
                          color:var(--hol-text-primary);
                          scroll-margin-top:calc(var(--hol-collant, 127px) + 20px)}
.hol-scope .jrnl-texte ul,.hol-scope .jrnl-texte ol{margin:0 0 18px;padding:0 0 0 22px}
.hol-scope .jrnl-texte li{margin:0 0 8px;font-size:16.5px;line-height:1.72;
                          color:var(--hol-text-secondary)}
/* UNE CITATION SE DÉTACHE PAR UN FOND ET UNE BORDURE COMPLÈTE. Jamais par un
   filet de couleur à gauche : Jimmy l'a refusé deux fois, c'est banni partout
   sur le site. */
.hol-scope .jrnl-texte blockquote{margin:0 0 20px;padding:20px 24px;
                                  background:var(--hol-brand-wash);
                                  border:1px solid var(--hol-border-subtle);
                                  border-radius:var(--hol-r-lg);
                                  font-size:17px;line-height:1.6;
                                  color:var(--hol-text-primary)}
.hol-scope .jrnl-texte a{font-weight:500}
.hol-scope .jrnl-figure{margin:28px 0;padding:0}
.hol-scope .jrnl-figure img{display:block;width:100%;height:auto;
                            border-radius:var(--hol-r-lg);
                            border:1px solid var(--hol-border-subtle);
                            background:var(--hol-surface-1)}
.hol-scope .jrnl-figure figcaption{margin-top:10px;font-size:13.5px;line-height:1.5;
                                   color:var(--hol-text-muted)}
.hol-scope .jrnl-retour{margin:34px 0 0;padding-top:22px;
                        border-top:1px solid var(--hol-border-subtle);
                        font-family:var(--hol-police-mono),ui-monospace,monospace;
                        font-size:12.5px;letter-spacing:.06em;text-transform:uppercase}
.hol-scope .jrnl-retour a{text-decoration:none;font-weight:600}

/* ── LES CARTES D'ARTICLES ───────────────────────────────────────────────────
   TROIS SUR UNE LIGNE, JAMAIS UNE RANGÉE TROUÉE : la grille est bridée à
   trois colonnes au plus, et les cartes gardent une base de 280 px. */
.hol-scope .jrnl-grille{display:grid;gap:22px;
                        grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
/* TROIS COLONNES DÈS QUE LA PLACE EST LÀ. Avec « auto-fit » seul, un journal
   qui ne compte qu'un article lui donnait toute la largeur de la page : une
   carte de mille cinq cents pixels de large, illustration comprise. La largeur
   d'une carte ne dépend pas du nombre d'articles publiés. */
@media (min-width:900px){
  .hol-scope .jrnl-grille{grid-template-columns:repeat(3,minmax(0,1fr))}
}
.hol-scope .jrnl-carte{position:relative;padding:0;overflow:hidden;
                       display:flex;flex-direction:column}
.hol-scope .jrnl-carte__corps{padding:18px 20px 22px;display:flex;flex-direction:column;flex:1}
.hol-scope .jrnl-carte__date{margin:0 0 8px;font-family:var(--hol-police-mono),ui-monospace,monospace;
                             font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;
                             font-weight:600;color:var(--hol-text-muted)}
.hol-scope .jrnl-carte__titre{margin:0 0 8px;font-family:var(--hol-police-titre),sans-serif;
                              font-weight:700;font-size:18px;line-height:1.26;
                              color:var(--hol-text-primary)}
/* LE LIEN COUVRE LA CARTE ENTIÈRE : on clique où l'on veut, et le lecteur
   d'écran n'entend qu'un seul lien, celui qui porte le titre. */
.hol-scope .jrnl-carte__lien{--hol-lien:var(--hol-text-primary);
                             --hol-lien-survol:var(--hol-brand);
                             text-decoration:none}
.hol-scope .jrnl-carte__lien::after{content:"";position:absolute;inset:0;z-index:1}
.hol-scope .jrnl-carte__lien:focus-visible{outline:none}
.hol-scope .jrnl-carte:focus-within{box-shadow:var(--hol-shadow-2)}
.hol-scope .jrnl-carte:focus-within{outline:2px solid var(--hol-focus);outline-offset:2px}
.hol-scope .jrnl-carte__chapo{margin:0 0 14px;font-size:14.5px;line-height:1.58;
                              color:var(--hol-text-secondary)}
.hol-scope .jrnl-carte__suite{margin:auto 0 0;font-family:var(--hol-police-mono),ui-monospace,monospace;
                              font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;
                              font-weight:600;color:var(--hol-brand)}
.hol-scope .jrnl-carte img{transition:transform .35s ease}
.hol-scope .jrnl-carte:hover img{transform:scale(1.03)}
.hol-scope .jrnl-aussi__titre{margin:0 0 24px;font-family:var(--hol-police-titre),sans-serif;
                              font-weight:700;font-size:clamp(22px,3vw,28px);line-height:1.15;
                              letter-spacing:-.02em;color:var(--hol-text-primary)}
.hol-scope .jrnl-aucun{margin:0;font-size:16px;line-height:1.6;color:var(--hol-text-secondary)}

@media (prefers-reduced-motion:reduce){
  .hol-scope .jrnl-carte img{transition:none}
  .hol-scope .jrnl-carte:hover img{transform:none}
}

/* ── À PARTIR DE 980 px : LES DEUX COLONNES ──────────────────────────────── */
@media (min-width:980px){
  .hol-scope .jrnl-duo{grid-template-columns:232px minmax(0,1fr);gap:60px;align-items:start}
  /* Le sommaire se cale sous ce qui est déjà collé en haut. La hauteur n'est
     pas écrite à la main : le pied de page tient « --hol-collant » à jour. */
  .hol-scope .jrnl-som{position:sticky;top:calc(var(--hol-collant, 127px) + 16px);
                       padding:0;background:none;border:0;
                       max-height:calc(100vh - var(--hol-collant, 127px) - 48px);
                       overflow-y:auto}
  .hol-scope .jrnl-som__liste{display:block}
  .hol-scope .jrnl-som .jrnl-som__liste a{padding:7px 12px}
  .hol-scope .jrnl-som__mot{padding-left:12px}
  .hol-scope .jrnl-tete{margin-top:-44px}
}

@media (max-width:600px){
  .hol-scope .jrnl-banniere{padding:52px 0 44px}
  .hol-scope .jrnl-texte p,.hol-scope .jrnl-texte li{font-size:16px}
  .hol-scope .jrnl-tete{margin-top:18px}
}

/* ── S'ABONNER AU JOURNAL ─────────────────────────────────────────────────
   Jimmy, le 20 octobre 2026 : « il faut mettre s'abonner à la newsletter pour
   recevoir des notifications ».

   LE BLOC EST POSÉ APRÈS LE CONTENU, jamais avant : on le propose à qui a lu,
   pas à qui arrive. Et il reste sobre, parce qu'une bande colorée qui réclame
   une adresse au milieu d'un journal se lit comme une publicité.

   LE CHAMP ET LE BOUTON SUR UNE LIGNE au-dessus de 720 px, empilés en
   dessous : un champ d'adresse à côté d'un bouton dans trois cent soixante
   pixels donne deux moitiés trop courtes pour l'un comme pour l'autre. */
.hol-scope .jrnl-abo{padding:0 0 var(--hol-bloc)}
.hol-scope .jrnl-abo__carte{padding:clamp(24px,3.4vw,34px);
                            border-color:var(--hol-border-strong)}
.hol-scope .jrnl-abo__mots{max-width:62ch}
.hol-scope .jrnl-abo__titre{margin:0 0 8px;font-family:var(--hol-police-titre),sans-serif;
                            font-weight:700;font-size:clamp(20px,2.4vw,25px);line-height:1.2;
                            letter-spacing:-.015em;color:var(--hol-text-primary)}
.hol-scope .jrnl-abo__texte{margin:0 0 20px;font-size:15.5px;line-height:1.62;
                            color:var(--hol-text-secondary)}
.hol-scope .jrnl-abo__form{display:flex;flex-direction:column;gap:10px;
                           max-width:560px}
.hol-scope .jrnl-abo__champ{min-height:48px;padding:10px 14px;font:inherit;font-size:15.5px;
                            border-radius:var(--hol-r-sm);
                            border:1px solid var(--hol-champ-bord);
                            background:var(--hol-surface-1);color:var(--hol-text-primary)}
.hol-scope .jrnl-abo__champ:focus-visible{outline:none;border-color:var(--hol-brand);
                                          box-shadow:0 0 0 3px var(--hol-brand-wash)}
.hol-scope .jrnl-abo__cta{display:inline-flex;align-items:center;justify-content:center;
                          min-height:48px;padding:0 24px;border:0;cursor:pointer;
                          background:var(--hol-brand);color:var(--hol-text-inverse);
                          font:inherit;font-weight:600;font-size:15.5px;
                          border-radius:var(--hol-r-sm)}
.hol-scope .jrnl-abo__note{margin:14px 0 0;font-size:13px;line-height:1.5;
                           color:var(--hol-text-muted);max-width:62ch}
@media (min-width:720px){
  .hol-scope .jrnl-abo__form{flex-direction:row;align-items:center}
  .hol-scope .jrnl-abo__champ{flex:1 1 auto;min-width:0}
  .hol-scope .jrnl-abo__cta{flex:none}
}

/* La boucle d'attente du mot du fondateur se cadre comme une image. */
.fond-boucle{width:100%;height:100%;object-fit:cover;display:block}

/* LE BOUTON « INSTALLER L'APPLICATION » DE LA CONSOLE PREVALOG (21 octobre
   2026). Il prend l'habit du bouton de déconnexion, son voisin de barre ; sa
   bulle d'aide (Safari) s'ouvre dessous, comme une carte. Caché tant que le
   script ne l'a pas jugé utile : « hidden » doit l'emporter sur le flex. */
.adm-installer{position:relative;display:flex}
.adm-installer[hidden],.adm-installer__aide[hidden],.adm-installer [hidden]{display:none}
.adm-installer__bouton{white-space:nowrap}
.adm-installer__aide{position:absolute;top:calc(100% + 10px);right:0;z-index:80;width:min(320px,calc(100vw - 2 * var(--hol-gutter)));
                     padding:16px 18px;background:var(--hol-surface-1);color:var(--hol-text-primary);
                     border-radius:var(--hol-r-sm);box-shadow:var(--hol-shadow-3);font-size:14px;line-height:1.5;white-space:normal}
.adm-installer__aide p{margin:0 0 12px}
.adm-installer__ok{min-height:36px;padding:0 14px;cursor:pointer;font:inherit;font-size:13.5px;font-weight:600;
                   color:var(--hol-text-inverse);background:var(--hol-brand);border:0;border-radius:var(--hol-r-sm)}
.adm-installer__ok:focus-visible{outline:2px solid var(--hol-brand);outline-offset:2px}

/* ===========================================================================
   LE VERROU D'ÉCRAN DE L'ADMINISTRATION (21 octobre 2026, Security/Verrou)
   La clé dans la barre, puis le rideau : l'heure en grand, qui est là, huit
   points et un pavé de verre. Le fond reprend la barre sombre du bureau où
   l'on est ; le halo, sa couleur d'action. Chez un locataire, ses jetons
   recolorent tout seuls.
   =========================================================================== */
.adm-cle{display:inline-grid;place-items:center;width:38px;height:38px;flex:0 0 auto;cursor:pointer;padding:0;
         color:var(--hol-text-inverse);background:var(--hol-glass);border:1px solid var(--hol-border-on-dark);
         border-radius:var(--hol-r-sm);text-decoration:none}
/* QUAND LA CLÉ EST UN LIEN (pas de code posé, ou les appareils reconnus), la
   règle « .hol-scope a » la passait en bleu de marque sur la barre sombre :
   presque invisible. La couleur d'un lien se pose par ses deux jetons. */
.adm-cle{--hol-lien:var(--hol-text-inverse);--hol-lien-survol:var(--hol-text-inverse)}
.adm-cle:hover{background:var(--hol-glass-hi)}
.adm-cle:focus-visible{outline:none;box-shadow:0 0 0 2px var(--hol-surface-inverse),0 0 0 4px var(--hol-focus-inverse)}
.adm-cle svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

html.vrr-actif,html.vrr-actif body{overflow:hidden}
html.vrr-actif body > :not(.vrr):not(script){visibility:hidden}
/* Le fond arrive d'un coup, opaque : seul le contenu entre en fondu. Un fond
   en fondu laissait voir la page claire dessous tant que l'animation n'avait
   pas fini (onglet en arrière-plan, machine lente). */
.vrr{position:fixed;inset:0;z-index:2000;display:grid;place-items:center;overflow-y:auto;
     padding:32px var(--hol-gutter);color:var(--hol-text-inverse);background:var(--hol-surface-inverse);
     font-family:var(--hol-police-texte),system-ui,sans-serif}
.vrr__cadre{animation:vrr-entree .35s ease-out}
.vrr[hidden]{display:none}
.vrr__fond{position:absolute;inset:0;pointer-events:none;
           background:radial-gradient(60% 50% at 50% 0%,var(--hol-brand) 0%,transparent 70%),
                      radial-gradient(40% 40% at 85% 100%,var(--hol-brand-active) 0%,transparent 70%);
           opacity:.55}
.vrr__cadre{position:relative;width:100%;max-width:340px;display:flex;flex-direction:column;align-items:center;text-align:center}
.vrr__marque{margin-bottom:28px}
.vrr__logo{height:30px;width:auto;display:block}
.vrr__logo--prevalog{height:34px}
.vrr__logo--locataire{height:44px;max-width:220px;object-fit:contain}
.vrr__heure{margin:0;font-family:var(--hol-police-titre),system-ui,sans-serif;font-weight:800;
            font-size:clamp(56px,14vw,84px);line-height:1;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.vrr__date{margin:8px 0 30px;font-family:var(--hol-police-mono),ui-monospace,monospace;font-size:13px;
           letter-spacing:.14em;text-transform:uppercase;color:var(--hol-text-inverse-2)}
.vrr__qui{display:flex;flex-direction:column;align-items:center;gap:8px;margin-bottom:22px}
.vrr__avatar{box-shadow:0 0 0 3px var(--hol-glass-border)}
.vrr__titre{margin:6px 0 0;font-family:var(--hol-police-titre),system-ui,sans-serif;font-weight:700;font-size:22px}
.vrr__aide{margin:0;font-size:14px;color:var(--hol-text-inverse-2)}
.vrr__points{display:flex;gap:12px;justify-content:center;margin:4px 0 10px}
.vrr__point{width:13px;height:13px;border-radius:50%;border:1.5px solid var(--hol-glass-hi);
            transition:background .15s ease,transform .15s ease,border-color .15s ease}
.vrr__point--plein{background:var(--hol-text-inverse);border-color:var(--hol-text-inverse);transform:scale(1.08)}
.vrr__message{min-height:22px;margin:0 0 14px;font-size:14px;font-weight:600;color:var(--hol-text-inverse)}
.vrr__message:not(:empty)::before{content:"\26A0\FE0E\00A0"}
.vrr__champ{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.vrr__pave{display:grid;grid-template-columns:repeat(3,76px);gap:16px 22px;justify-content:center}
.vrr__touche{width:76px;height:76px;border-radius:50%;cursor:pointer;
             font-family:var(--hol-police-titre),system-ui,sans-serif;font-size:28px;font-weight:700;
             color:var(--hol-text-inverse);background:var(--hol-glass);border:1px solid var(--hol-glass-border);
             -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
             transition:background .12s ease,transform .08s ease}
.vrr__touche:hover{background:var(--hol-glass-hi)}
.vrr__touche:active{transform:scale(.94);background:var(--hol-glass-hi)}
.vrr__touche:focus-visible{outline:none;box-shadow:0 0 0 3px var(--hol-focus-inverse)}
.vrr__touche--efface{background:transparent;border-color:transparent}
.vrr__touche--efface svg{width:28px;height:28px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linejoin:round;stroke-linecap:round}
.vrr--attente .vrr__pave{opacity:.55;pointer-events:none}
.vrr--faux .vrr__points{animation:vrr-non .42s ease}
.vrr__sortie{margin:26px 0 0}
.vrr__sortie-lien{background:none;border:0;padding:6px 8px;cursor:pointer;font:inherit;font-size:14px;
                  color:var(--hol-text-inverse-2);text-decoration:underline;text-underline-offset:3px}
.vrr__sortie-lien:hover{color:var(--hol-text-inverse)}
.vrr__sortie-lien:focus-visible{outline:2px solid var(--hol-focus-inverse);outline-offset:2px}
@keyframes vrr-entree{from{opacity:0}to{opacity:1}}
@keyframes vrr-non{0%,100%{transform:translateX(0)}20%{transform:translateX(-10px)}40%{transform:translateX(9px)}
                   60%{transform:translateX(-6px)}80%{transform:translateX(4px)}}
/* PAR LA HAUTEUR, PAS PAR LA LARGEUR : un iPad tenu en largeur ou une fenêtre
   de portable a moins de hauteur qu'un téléphone. Tout doit tenir sans
   défiler, pavé et lien de sortie compris (mesuré à 640, 667, 768 et 820 px). */
@media (max-height:900px){
  .vrr{padding-top:20px;padding-bottom:20px}
  .vrr__marque{margin-bottom:16px}
  .vrr__heure{font-size:60px}
  .vrr__date{margin-bottom:16px}
  .vrr__qui{gap:6px;margin-bottom:12px}
  .vrr__titre{font-size:20px;margin-top:2px}
  .vrr__message{margin-bottom:10px}
  .vrr__pave{grid-template-columns:repeat(3,64px);gap:12px 20px}
  .vrr__touche{width:64px;height:64px;font-size:24px}
  .vrr__sortie{margin-top:14px}
}
@media (max-height:700px){
  .vrr__date,.vrr__avatar{display:none}
  .vrr__marque{margin-bottom:12px}
  .vrr__logo{height:26px}.vrr__logo--prevalog{height:28px}.vrr__logo--locataire{height:36px}
  .vrr__heure{font-size:44px;margin-bottom:10px}
  .vrr__qui{margin-bottom:8px}
  .vrr__pave{grid-template-columns:repeat(3,58px);gap:10px 18px}
  .vrr__touche{width:58px;height:58px;font-size:22px}
  .vrr__sortie{margin-top:10px}
}
@media (prefers-reduced-motion:reduce){
  .vrr__cadre,.vrr--faux .vrr__points{animation:none}
  .vrr__point,.vrr__touche{transition:none}
}

/* ── LA PASTILLE DU JOURNAL, sous le compteur du hero ──────────────────────
   Jimmy, le 21 octobre 2026 : « la page du journal est un peu égarée, perdue
   dans le site ». Un petit bouton de verre, assorti au compteur, même bord
   droit, posé juste en dessous.

   ELLE EST DISCRÈTE EXPRÈS. Le hero porte déjà deux boutons d'action ; un
   troisième de même poids les affaiblirait tous. Celui-ci est une porte, pas
   un appel.

   ELLE DISPARAÎT SOUS 1100 PIXELS comme le compteur : au-delà, elle
   passerait par-dessus le titre. C'est l'entrée « Le journal » du menu qui
   prend le relais sur un téléphone. */
.hero-journal{--hol-lien:var(--hol-text-inverse-1);--hol-lien-survol:var(--hol-text-inverse);
  display:flex;align-items:center;justify-content:center;gap:9px;
  padding:11px 14px;border-radius:16px;
  font-family:var(--hol-police-mono),monospace;font-size:11px;
  letter-spacing:.08em;text-transform:uppercase;text-decoration:none;
  color:var(--hol-text-inverse-1);
  border:1px solid var(--hol-glass-border);
  background:linear-gradient(160deg,var(--hol-glass) 0%,var(--hol-hero-scrim-b) 100%);
  backdrop-filter:blur(14px) saturate(150%);
  box-shadow:0 10px 24px -10px rgba(9,10,32,.55);
  opacity:0;animation:hj-entree .9s cubic-bezier(.22,.9,.24,1) .95s forwards;
  transition:color .25s ease,border-color .25s ease,transform .35s cubic-bezier(.22,.9,.24,1)}
@keyframes hj-entree{
  from{opacity:0;transform:translateY(14px)}
  to{opacity:1;transform:translateY(0)}
}
.hero-journal:hover,.hero-journal:focus-visible{color:var(--hol-text-inverse);
  border-color:var(--hol-glass-hi);transform:translateY(-2px)}
.hero-journal:focus-visible{outline:none;
  box-shadow:0 0 0 2px var(--hol-hero-navy),0 0 0 5px var(--hol-focus-inverse)}
.hero-journal svg{flex:none;opacity:.85}
.hero-journal__fleche{opacity:.7}
@media (prefers-reduced-motion:reduce){
  .hero-journal{opacity:1;animation:none;transform:none}
  .hero-journal:hover,.hero-journal:focus-visible{transform:none}
}

/* Une entrée de menu réservée au panneau replié : voir l'en-tête, « Journal ».
   Sur la barre large elle ferait passer « Commencer » à la ligne, et c'est la
   pastille du hero qui mène au journal à ces largeurs. */
@media (min-width:1101px){.ent-nav .ent-lien--replie{display:none}}

/* ── LANGUE ET DEVISE : UN SEUL GROUPE ─────────────────────────────────────
   Deux pastilles jumelles côte à côte se lisaient comme deux objets qui se
   ressemblent, et elles coûtaient deux habillages. Réunies, elles forment le
   bloc « réglages d'affichage » de la barre, séparées par un filet. */
.ent-choix__groupe{display:flex;gap:2px}
.ent-choix__groupe--suite{margin-left:8px;padding-left:8px;
                          border-left:1px solid var(--hol-border-strong)}
@media (min-width:1101px){
  .ent-choix{display:flex;align-items:center;padding:3px;
             background:var(--hol-surface-0);border-radius:var(--hol-r-pill);
             border:1px solid transparent;transition:background .3s ease,border-color .3s ease}
}
@media (max-width:1100px){
  /* Dans le panneau replié, le groupe garde son habillage, en ligne. */
  .ent-choix{padding:3px;background:var(--hol-surface-0);
             border-radius:var(--hol-r-pill);gap:0;align-self:flex-start}
}

/* LA BARRE AVEC LE CADENAS ET LE BOUTON D'INSTALLATION (contrôle du
   21 octobre 2026 à 360, 375, 768, 820, 1024 et 1180 px). Les deux ajouts
   prenaient la place que les paliers ci-dessus avaient comptée au pixel :
   - jusqu'à 1200 px, « Installer l'application » se réduit à sa flèche (le
     libellé reste au survol et pour les lecteurs d'écran) ;
   - de 701 à 1200 px, les liens « Voir … » gardent leur flèche seule, comme
     sur un téléphone (le libellé reste au survol) ;
   - sur un téléphone, le cadenas monte sur la ligne du logo, à droite, là
     où il n'y a rien : la ligne des commandes est déjà pleine. */
@media (max-width:1200px){
  .hol-scope .adm-installer__mot{display:none}
  .hol-scope .adm-installer__bouton{padding:0 12px}
}
@media (min-width:701px) and (max-width:1200px){
  .hol-scope .adm-lien__mot{display:none}
  .hol-scope .adm-lien{font-size:18px;line-height:1}
}
@media (max-width:700px){
  .hol-scope .adm-barre__rang{position:relative}
  .hol-scope .adm-cle{position:absolute;right:var(--hol-gutter);top:calc(14px + env(safe-area-inset-top, 0px))}
  /* Les appareils reconnus, juste à gauche du cadenas. */
  .hol-scope .adm-cle--appareils{right:calc(var(--hol-gutter) + 46px)}
}

/* LE BANDEAU « UNE NOUVELLE VERSION EST EN LIGNE » (21 octobre 2026) : en bas,
   au centre, sombre comme la barre, au-dessus du contenu mais sous le verrou.
   Il ne couvre rien d'important et se ferme d'une croix. */
/* Centré par les marges et non par « left:50% » : ce dernier bornait sa
   largeur à la moitié de l'écran, et le texte s'écrasait mot par mot sur un
   téléphone. */
.adm-maj{position:fixed;left:var(--hol-gutter);right:var(--hol-gutter);margin-inline:auto;width:fit-content;
         bottom:calc(20px + env(safe-area-inset-bottom, 0px));
         z-index:1500;display:flex;align-items:center;gap:12px;
         padding:10px 10px 10px 18px;border-radius:var(--hol-r-pill);background:var(--hol-surface-inverse);
         color:var(--hol-text-inverse);box-shadow:var(--hol-shadow-3);font-size:14px;animation:adm-maj-entree .3s ease-out}
.adm-maj[hidden]{display:none}
.adm-maj__texte{margin:0;font-weight:500}
.adm-maj__recharger{min-height:36px;padding:0 16px;cursor:pointer;font:inherit;font-size:14px;font-weight:600;white-space:nowrap;
                    color:var(--hol-text-inverse);background:var(--hol-brand);border:0;border-radius:var(--hol-r-pill)}
.adm-maj__recharger:hover{background:var(--hol-brand-hover)}
.adm-maj__fermer{width:32px;height:32px;flex:0 0 auto;cursor:pointer;font-size:20px;line-height:1;
                 color:var(--hol-text-inverse-2);background:transparent;border:0;border-radius:50%}
.adm-maj__fermer:hover{color:var(--hol-text-inverse);background:var(--hol-glass)}
.adm-maj__recharger:focus-visible,.adm-maj__fermer:focus-visible{outline:none;box-shadow:0 0 0 3px var(--hol-focus-inverse)}
@media (max-width:480px){ .adm-maj{gap:8px;padding-left:14px;font-size:13.5px} }
@keyframes adm-maj-entree{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){ .adm-maj{animation:none} }

/* LES CHAMPS DE DATE SUR IPAD ET IPHONE. Safari d'iOS dessine lui-même les
   champs « date », « time » et « datetime-local » : vides, ils perdent leur
   hauteur et gardent une largeur à eux, qui déborde de leur colonne et passe
   sous le champ voisin (Calendrier des visios, 25 oct.). On lui retire son
   dessin pour qu'il obéisse aux mêmes mesures que les autres champs, et la
   date se range à gauche comme un texte. Seul iOS est visé : ailleurs, le
   champ garde son petit calendrier. */
@supports (-webkit-touch-callout:none){
  .hol-scope input[type="date"],.hol-scope input[type="time"],
  .hol-scope input[type="datetime-local"]{
    -webkit-appearance:none;appearance:none;display:block;min-width:0;max-width:100%}
  .hol-scope input[type="date"]::-webkit-date-and-time-value,
  .hol-scope input[type="time"]::-webkit-date-and-time-value,
  .hol-scope input[type="datetime-local"]::-webkit-date-and-time-value{
    text-align:left;min-height:1.5em}
}
