/* ══ Téléphone — en dessous de 760 px ═══════════════════════════════════
   Le SEUL endroit où le texte du téléphone se règle, et il n'y a qu'un
   nombre. Le coefficient multiplie les neuf tokens de l'échelle et la
   taille des champs (`1-socle.css`), donc absolument tout le texte de
   l'application suit — y compris les tailles écrites en `style="…"` sur
   une balise, qu'une règle de feuille de style ne pourrait pas atteindre.
   Remonter à 1 rend au téléphone les tailles de l'ordinateur ; descendre
   à .90 resserre encore. Rien d'autre à toucher.

   759.98 et non 759 : entre les deux, un écran de 759,5 px — cela arrive
   avec le zoom du navigateur — ne serait ni téléphone ni tablette, et le
   texte y reprendrait sa taille pleine sans que la mise en page suive.

   Le plancher de 13 px annoncé dans `1-socle.css` ne tient plus au
   téléphone : à .94 le badge tombe à 12,2 px. C'est la décision d'Etienne
   du 2026-08-24 — la lisibilité des petites mentions cède la place à la
   densité, sur l'écran où la place manque le plus.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 759.98px){
  :root{--fof-echelle-texte:.94;}

  /* ── LE TEXTE QU'ON SAISIT, AU TÉLÉPHONE ─────────────────────────────
     Relevé sur la maquette REPETITION_Create_Mobile du 2026-08-27, dont
     l'échelle est calée sur le titre (qui, lui, tombe pile sur
     --fof-t-titre-ecran) : elle demande 20,2 px dans un champ contre 14,1
     rendus jusqu'ici, et 17,3 pour le libellé au-dessus contre 12,2.
     21,5 × 0,94 donne 20,2 ; --fof-t-section rend 17,9, le rôle existant le
     plus proche à 3 % près.

     POURQUOI SUR CES DEUX FORMULAIRES ET NON SUR :root — c'est un écart
     assumé avec la règle du jeton, et il est mesuré. Porté par :root, il
     vaudrait pour TOUS les champs du téléphone, dont ceux du devis, des
     clients et de la messagerie, qui ont été composés pour 14,1 px et
     déborderaient. Chaque écran prend la nouvelle taille quand sa maquette
     arrive — et pas avant.

     L'ÉVÈNEMENT L'A REJOINTE le 2026-08-28. Il en était écarté pour une
     raison précise : sa rangée « Date · Prix de vente · Jauge » réclamait
     alors plus large que l'écran. Cette rangée n'existe plus — le formulaire
     se parcourt en quatre étapes, sur une seule colonne. Et sa maquette
     demande exactement la même taille que celle de la répétition : le mot
     « Concert » y mesure 190 unités de large pour une largeur de 318 à
     100 px dans League Spartan, soit 59,7 unités de corps, soit 19,9 px à
     l'écran. 21,5 × 0,94 en rend 20,2, à 1,5 % près.

     Ce qui vient avec, sans rien écrire de plus : sous 16 px, Safari iOS
     ZOOME sur un champ au moment de la saisie ; à 20,2 px il ne le fait
     plus. Et la note (`.fof-grow`) lit --fof-field-size depuis le
     2026-08-27, elle suit donc les autres champs.

     L'ordinateur n'est pas concerné : il rend déjà 18,75 px (15 × 1,25), et
     les champs de la maquette bureau sont un copier-coller de la maquette
     mobile, à l'échelle du téléphone — ils ne disent rien de plus. */
  .fof-rf-form,
  .fof-ef-form{--fof-field-size:calc(21.5px * var(--fof-echelle-texte));}

  /* ── Date et Heure : une PROPORTION, jamais le contenu ────────────────
     Les deux maquettes les dessinent égales, mais elles y écrivent
     « --/--/---- » ; le navigateur, lui, écrit « jj/mm/aaaa », plus large —
     164 px mesurés à cette taille, contre les 155 d'une demi-colonne. La
     date prend donc un peu plus, et l'heure le reste.

     CE QUI ÉTAIT ÉCRIT ICI, ET POURQUOI C'ÉTAIT FAUX (corrigé le
     2026-08-28, Etienne l'a vu sur son téléphone) : la première colonne
     était en `auto`, c'est-à-dire « la largeur de ce que le champ contient ».
     Or ce que contient un champ de date VIDE ne dépend pas de nous : chaque
     navigateur le dessine à sa façon, et plusieurs le rendent bien plus
     étroit tant qu'aucune date n'est saisie. La colonne se rétractait, la
     rangée entière se décalait à gauche, puis se remettait en place dès la
     première saisie. Sur Chrome de bureau on ne voyait rien.

     Une PROPORTION ne pose pas cette question : 1,15 pour 1 rend 166 et 145
     sur un téléphone de 375 px — la même image qu'avant, mais vide comme
     remplie, et sur tous les navigateurs.

     Le petit calendrier que Chrome pose dans le champ est retiré sur les
     DEUX écrans : la maquette ne le montre pas, et au doigt il ne sert à
     rien — toucher le champ ouvre déjà le calendrier du téléphone. Il reste
     en place sur ordinateur, où il est la seule cible pour l'ouvrir. */
  .fof-rf-duo{grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);}
  .fof-rf-duo input[type="date"]::-webkit-calendar-picker-indicator{display:none;}
}

/* ══ Téléphone — mise en page ═══════════════════════════════════════════
   Le bloc du dessus ne règle que le texte ; ici, ce que la largeur seule
   oblige à reprendre.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 759.98px){
  /* Boîte mail : les lignes de la liste serrent leurs côtés — 8 px au lieu
     de 14 (demande d'Etienne du 2026-08-24). Douze pixels de plus pour
     l'expéditeur, l'objet et l'extrait, là où la place manque le plus.
     Le retrait de la page (20 px) et le filet du bloc ne bougent pas : ils
     sont partagés avec tous les autres écrans. */
  .fof-ml-row{padding:calc(12 * var(--fof-px)) calc(8 * var(--fof-px));}
}

/* ══ Tablette — à partir de 760 px ══════════════════════════════════════ */
@media (min-width: 760px){
  .fof-header{gap:calc(22 * var(--fof-px));padding:calc(10 * var(--fof-px)) calc(20 * var(--fof-px));}
  .fof-main{padding:calc(22 * var(--fof-px)) calc(24 * var(--fof-px));padding-bottom:calc(110 * var(--fof-px) + env(safe-area-inset-bottom));}
  .lbl-full{display:inline;}
  .lbl-short{display:none;}
  /* La fiche client n'a PLUS de traitement propre à la tablette. Elle était
     un panneau latéral de 560 px collé à droite, hérité de l'époque où elle
     était une fenêtre flottante ; c'était la seule vue de l'application à ne
     pas prendre tout l'écran en dessous de 1101 px, et cela se voyait
     (constat d'Etienne, 2026-08-24). Elle suit maintenant la règle commune du
     mode mobile — plein écran, glissé d'un bord à l'autre — comme la fiche
     d'une date, la lecture d'un mail et les formulaires. Sa forme de bureau
     (carte centrée de 1040 px) reste déclarée dans la grande media query. */
  .fof-login-card{width:50vw;min-width:calc(420 * var(--fof-px));padding:calc(40 * var(--fof-px)) calc(36 * var(--fof-px));}
  .fof-search{flex:0 0 calc(280 * var(--fof-px));}
  .ed-form-grid{grid-template-columns:1fr 1fr;}
  .fof-ed-pane{padding:calc(20 * var(--fof-px)) calc(18 * var(--fof-px));}
  /* Agenda : le titre et les actions tiennent sur une seule ligne. */
  .fof-ag-head{flex-direction:row;align-items:center;justify-content:space-between;}
  /* La taille du titre ne s'écrit plus ici. Ces 30 px existaient parce que le
     rôle générique --fof-t-ecran (24) était trop petit pour l'Agenda : le
     téléphone se rattrapait à part. Depuis que le titre lit
     --fof-t-titre-ecran, la valeur est bonne dès la règle de base et cette
     ligne ne faisait plus que la rapetisser. */
  .fof-ag-head-actions > *{flex:0 0 auto;}
  .fof-seg-page{max-width:calc(520 * var(--fof-px));}
  .fof-ag-next{padding:calc(24 * var(--fof-px));}
  .fof-ag-row{padding:calc(12 * var(--fof-px)) calc(18 * var(--fof-px));}
}

/* ══ Téléphone et tablette — la navigation en VUES PLEIN ÉCRAN ══════════
   Sous 1101 px, ouvrir une fiche n'est pas « poser une fenêtre sur l'écran »
   mais AVANCER d'un écran : la vue courante s'efface vers la gauche pendant
   que la nouvelle entre par la droite, et le retour rejoue l'inverse.

   Le mouvement n'est pas inventé ici : c'est celui de la barre latérale qui
   se déploie sur ordinateur, à la lettre — même durée (`--fof-rail-dur`),
   même courbe (`--fof-rail-ease`). Une seule main tient donc les deux
   animations de l'application, et les régler revient à changer deux valeurs
   dans `1-socle.css`.

   Trois classes suffisent, et le gabarit les pose depuis UNE seule table :
   `NAV_SCREENS` dans `08-navigation.js`, elle-même lue dans l'ordre déjà
   déclaré par `_backLayers()`. Une vue plein écran ajoutée demain hérite du
   glissé en s'inscrivant dans cette liste — il n'y a rien à écrire ici.

     • is-navin    la vue qui arrive
     • is-navout   la vue qui s'en va
     • is-navunder celle qui reste dessous

   Rien de tout cela ne franchit 1101 px : sur ordinateur les fenêtres
   restent des cartes centrées, et la barre latérale garde le mouvement pour
   elle seule.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 1100.98px){
  .is-navin{animation:navIn var(--fof-rail-dur) var(--fof-rail-ease);}
  /* `forwards` : la vue sortie RESTE dehors le temps que la logique la
     referme pour de bon (elle attend la fin du glissé avant de changer
     d'état). Sans cela elle reviendrait d'un bond à sa place, visible une
     dernière image avant de disparaître. */
  .is-navout{animation:navOut var(--fof-rail-dur) var(--fof-rail-ease) forwards;}
  .is-navunder{transform:translateX(calc(-1 * var(--fof-nav-shift)));}

  /* Les surfaces qui participent au parcours. La transition est portée par
     leur classe de BASE, jamais par `is-navunder` : une transition n'existe
     que si elle est déclarée dans les deux états — posée sur le seul état
     décalé, la vue glisserait à l'aller et reviendrait d'un bond au retour. */
  .fof-main,
  .fof-agenda-panel.is-sheet,
  .fof-mv,
  .fof-modal-overlay.is-fullpage,
  .fof-ed-shell,
  .fof-slmod,
  .fof-stage{transition:transform var(--fof-rail-dur) var(--fof-rail-ease);}
  /* La fiche client a une raison de plus de bouger : recouverte par la
     fenêtre d'évènement, elle s'efface (`is-behind`, feuille 2). Cet
     effacement attend la fin du glissé, sinon la fiche disparaîtrait au
     premier pas au lieu de s'en aller. Au retour, aucun délai — elle doit
     être là avant même de commencer à revenir. Même parti pris que la liste
     de l'Agenda, juste en dessous. */
  .fof-drawer-overlay{transition:transform var(--fof-rail-dur) var(--fof-rail-ease),
                                 visibility 0s;}
  .fof-drawer-overlay.is-behind{transition:transform var(--fof-rail-dur) var(--fof-rail-ease),
                                           visibility 0s var(--fof-rail-dur);}

  /* ── Les deux écrans dont la vue de dessus vit DANS <main> ────────────
     La fiche de la date (`.fof-agenda-panel.is-sheet`) et la lecture d'un
     message (`.fof-mv`) sont des `position:fixed` posés à l'intérieur de
     <main>. Transformer <main> les recalerait SUR LUI : ils cesseraient
     d'être collés à l'écran et suivraient le défilement de la page. C'est
     donc le contenu de l'écran qui glisse, pas <main> — d'où ces deux
     listes plutôt que la classe commune. `08-navigation.js` le sait :
     `_navPageUnder()` retire `is-navunder` à <main> dans ces deux cas. */
  .fof-ag4-top,.fof-ag4-seg,.fof-ag4-search,.fof-agenda-list,
  .fof-mail-seg-page,.fof-mail-main > *{
    transition:transform var(--fof-rail-dur) var(--fof-rail-ease);}
  .fof-main.is-agsheet .fof-ag4-top,
  .fof-main.is-agsheet .fof-ag4-seg,
  .fof-main.is-agsheet .fof-ag4-search,
  .fof-main.is-agsheet .fof-agenda-list,
  .fof-main.is-mailview .fof-mail-top,
  .fof-main.is-mailview .fof-mail-seg-page,
  .fof-main.is-mailview .fof-ag-search,
  .fof-main.is-mailview .fof-mail-main > :not(.fof-mv){
    transform:translateX(calc(-1 * var(--fof-nav-shift)));}
  /* La liste de l'Agenda sort du parcours clavier une fois le glissé FINI :
     `visibility:hidden` (feuille 4) posé dès le premier pas couperait le
     mouvement net. Le retard vaut la durée du glissé à l'aller, et rien au
     retour — la liste doit être là avant même de commencer à revenir. */
  .fof-ag4-top,.fof-ag4-seg,.fof-ag4-search,.fof-agenda-list,
  .fof-mail-main > *{
    transition:transform var(--fof-rail-dur) var(--fof-rail-ease),visibility 0s;}
  .fof-main.is-agsheet .fof-ag4-top,
  .fof-main.is-agsheet .fof-ag4-seg,
  .fof-main.is-agsheet .fof-ag4-search,
  .fof-main.is-agsheet .fof-agenda-list,
  .fof-main.is-mailview .fof-mail-main > :not(.fof-mv){
    transition:transform var(--fof-rail-dur) var(--fof-rail-ease),
               visibility 0s var(--fof-rail-dur);}
  /* La liste des messages reste MONTÉE pendant la lecture — c'est ce qui lui
     garde sa place — mais elle est retirée du parcours clavier et des
     lecteurs d'écran, comme celle de l'Agenda et pour la même raison. */
  .fof-main.is-mailview .fof-mail-main > :not(.fof-mv){visibility:hidden;}

  /* ── Plus de croix de fermeture sur une vue plein écran ───────────────
     Ce n'est plus une fenêtre posée sur un écran, c'est un écran de plus
     dans le parcours : on en sort par le retour du téléphone, par le geste,
     ou par « Annuler » — jamais par une croix, qui laissait croire qu'on
     refermait un objet flottant. Au-delà de 1101 px la règle ne s'applique
     pas : la croix y est à sa place et y reste.

     LE `div` N'EST PAS UN DÉTAIL. La règle visait « le seul `.fof-icon-btn`
     de ces fenêtres », ce qui était vrai quand elle a été écrite. Ça ne l'est
     plus : l'écran d'évènement en porte trois autres — le « + » et la
     corbeille de chaque ligne de road map, et la corbeille du pied depuis le
     2026-08-28 — que les maquettes du téléphone montrent toutes. Les croix
     sont écrites en `div role="button"`, les actions en `<button>` : le
     sélecteur nomme donc les croix, et elles seules. */
  .fof-modal-overlay.is-fullpage div.fof-icon-btn{display:none;}

  /* ── Évènement : le parcours en quatre étapes ─────────────────────────
     (maquettes EVENEMENT_Create/Edit_Mobile_Clair_step1-4, 2026-08-28)
     Le formulaire ne se déroule plus, il se PARCOURT : quatre étapes, une à
     la fois, et le ruban 1-2-3-4 pour sauter de l'une à l'autre.

     Pourquoi tout est ICI et rien dans `4-ecrans.css` : le parcours n'existe
     qu'en dessous de 1101 px. Écrit en défaut puis défait pour l'ordinateur,
     il aurait fallu rendre son `display` à chacun des quinze blocs — et le
     rendre JUSTE, `grid` pour le duo Date + Heure, `block` pour les autres —
     avec un poids supérieur à celui des règles de masquage. Une requête média
     dit la même chose sans rien avoir à défaire : au-delà de 1101 px ces
     lignes ne s'appliquent tout simplement pas.

     LE POINT DÉLICAT. L'ordre du téléphone n'est PAS celui des colonnes : la
     Set List descend de la colonne 2 vers l'étape 1, la Road Map monte de la
     1 vers l'étape 2, « Suivi par » et la note technique passent en étape 4.
     Le gabarit garde donc SES TROIS COLONNES — l'écran d'ordinateur est
     conforme à sa maquette, on n'y touche pas — et c'est ici qu'elles
     s'effacent : `display:contents` les fait disparaître en tant que boîtes,
     leurs quinze blocs deviennent les enfants directs du formulaire, et
     l'ordre se règle bloc par bloc.

     `align-items` est REMIS à `stretch`, et ce n'est pas un détail : la
     grille de l'ordinateur porte `align-items:start` pour que ses trois
     colonnes commencent en haut sans s'étirer l'une sur l'autre. Hérité tel
     quel par la colonne du téléphone, il cesse d'aligner en haut pour aligner
     à GAUCHE — chaque champ se réduit alors à la largeur de son contenu, et
     « Concert » tient dans 115 px au milieu du vide. */
  .fof-ef-form{display:flex;flex-direction:column;align-items:stretch;
    gap:var(--fof-sp-5);min-width:0;max-width:calc(440 * var(--fof-px));}
  .fof-ef-col{display:contents;}
  /* Une étape à la fois. On n'écrit que les règles qui MASQUENT : forcer
     `display:block` sur ce qui reste rendrait sa grille au duo Date + Heure. */
  .fof-ef-form.is-etape1 [data-etape]:not([data-etape="1"]),
  .fof-ef-form.is-etape2 [data-etape]:not([data-etape="2"]),
  .fof-ef-form.is-etape3 [data-etape]:not([data-etape="3"]),
  .fof-ef-form.is-etape4 [data-etape]:not([data-etape="4"]){display:none;}
  /* Deux blocs seulement sortent de l'ordre du gabarit. La Road Map (écrite
     en colonne 1) ferme l'étape 2, la note technique (écrite en colonne 2)
     ferme l'étape 4 : sans cela elles arriveraient avant leurs voisines, qui
     sont écrites plus loin. Tout le reste tombe juste tout seul — les
     colonnes se lisent dans l'ordre. */
  .fof-ef-form .is-fin{order:1;}
  /* Les deux notes de l'étape 4 partent HAUTES, comme celle de la répétition
     et pour la même raison : les maquettes du téléphone leur donnent 384
     unités. C'est le nombre exact déjà relevé le 2026-08-27 sur
     REPETITION_Create_Mobile, et déjà écrit une fois dans `4-ecrans.css`
     (`.fof-rf-form .fof-grow`). Elles continuent de grandir avec leur texte
     à partir de là — c'est le point de DÉPART qui change.
     Sur ordinateur elles gardent les 64 px de l'application : la maquette du
     bureau ne demandait pas autre chose. */
  .fof-ef-form .fof-grow > textarea,
  .fof-ef-form .fof-grow::after{min-height:calc(132 * var(--fof-px));}
}

/* ══ Bureau — à partir de 1101 px : le rail remplace la barre basse ═════ */
@media (min-width: 1101px){
  /* ── LES DEUX ÉCHELLES DU BUREAU ───────────────────────────────────────
     Demande d'Etienne du 2026-08-26 : à 100 % de zoom, retrouver ce qu'il
     voyait avec le zoom du navigateur à 110 % sur le menu de gauche et à
     125 % sur le contenu et la barre du haut. Ce n'est donc pas « du texte
     plus gros » : c'est TOUT — retraits, écarts, largeurs, hauteurs, rayons
     — multiplié, exactement comme le fait un zoom.

     Deux nombres, et deux seulement, pour toute l'application. Le reste
     suit, y compris les tailles écrites en `style="…"` dans le gabarit.

     Le zoom du navigateur n'est PAS employé, ni `zoom`, ni `transform` : le
     premier réduirait la fenêtre vue par les media queries (le contenu
     basculerait en mise en page tablette sans prévenir), le second rendrait
     un texte flou et décalerait les zones cliquables.

     Pourquoi le rail est posé sur :root et non sur `.fof-sidebar` — ce
     n'est pas un raccourci : `--fof-rail-w` (`1-socle.css`) vaut
     `calc(248 * var(--fof-px))` et est déclarée sur :root, elle se calcule
     donc avec le --fof-px de :root. C'est cette même largeur que le contenu
     lit pour sa marge de gauche (`.fof-shell`, plus bas). Les deux tombent
     d'accord par construction, sans que 1,1 soit écrit deux fois. */
  :root{--fof-px:1.1px;--fof-echelle-texte:1.1;}

  /* ── 125 % : le contenu, la barre du haut, et tout ce qui flotte ───────
     Les trois fenêtres « Mon profil », « Gestion des utilisateurs » et
     « Envoi mail » vivent HORS de `.fof-shell` dans le gabarit : sans leur
     nom ici, elles resteraient à l'échelle du rail. Même chose pour la
     copie qui suit le curseur pendant un glisser-déposer, que le code
     accroche à <body>. L'écran de connexion en fait partie lui aussi :
     c'est la fenêtre principale quand il n'y en a pas d'autre.

     LA REDÉCLARATION QUI SUIT N'EST PAS UNE REDONDANCE. Une variable
     dérivée se résout là où elle est ÉCRITE : `--fof-sp-6` est déclarée sur
     :root, elle s'y calcule avec le --fof-px de :root, et poser un autre
     --fof-px ici ne la changerait PAS. Il faut la réécrire sur la zone pour
     qu'elle s'y recalcule. Sans ces trente lignes, la première ligne de ce
     bloc ne ferait rigoureusement rien pour les jetons.

     À TENIR À JOUR : cette liste est le double de celle de `1-socle.css`.
     Un jeton dérivé ajouté là-bas doit être ajouté ICI, sinon il restera à
     l'échelle du rail sans que rien ne le signale. `probe_echelle_bureau`
     compare les deux listes à chaque passage et refuse qu'elles divergent.

     --fof-shadow n'y est PAS, volontairement : il vaudrait 5 px de flou au
     lieu de 4,4, et il faudrait le redire deux fois de plus pour ne pas
     perdre sa valeur du thème sombre. Une ombre portée ne se mesure pas.
     --fof-rail-w et --fof-rail-w-mini non plus : ce sont les mesures du
     RAIL, elles doivent garder son échelle jusque dans le contenu. */
  .fof-shell,.fof-login-bg,.fof-modal-overlay,.fof-drawer-overlay,
  .fof-ed-shell,.fof-usermenu,.fof-drag-ghost{
    --fof-px:1.25px;--fof-echelle-texte:1.25;

    --fof-r-sm:calc(8 * var(--fof-px)); --fof-r-md:calc(12 * var(--fof-px));
    --fof-r-lg:calc(16 * var(--fof-px)); --fof-r-xl:calc(20 * var(--fof-px));

    --fof-sp-1:calc(4 * var(--fof-px));  --fof-sp-2:calc(8 * var(--fof-px));
    --fof-sp-3:calc(12 * var(--fof-px)); --fof-sp-4:calc(16 * var(--fof-px));
    --fof-sp-5:calc(20 * var(--fof-px)); --fof-sp-6:calc(24 * var(--fof-px));
    --fof-sp-7:calc(32 * var(--fof-px)); --fof-sp-8:calc(48 * var(--fof-px));

    --fof-t-page:calc(34px * var(--fof-echelle-texte));
    --fof-t-ecran:calc(24px * var(--fof-echelle-texte));
    --fof-t-fiche:calc(23px * var(--fof-echelle-texte));
    --fof-t-section:calc(19px * var(--fof-echelle-texte));
    --fof-t-ligne:calc(16.5px * var(--fof-echelle-texte));
    --fof-t-corps:calc(16px * var(--fof-echelle-texte));
    --fof-t-libelle:calc(14.5px * var(--fof-echelle-texte));
    --fof-t-second:calc(14px * var(--fof-echelle-texte));
    --fof-t-badge:calc(13px * var(--fof-echelle-texte));
    --fof-t-libelle-champ:calc(18px * var(--fof-echelle-texte));

    --fof-t-titre-ecran:calc(36px * var(--fof-echelle-texte));
    --fof-t-titre-carte:calc(36px * var(--fof-echelle-texte));
    --fof-t-titre-ligne:calc(21.5px * var(--fof-echelle-texte));
    --fof-t-titre-bouton:calc(22.5px * var(--fof-echelle-texte));
    --fof-t-titre-etape:calc(30px * var(--fof-echelle-texte));

    --fof-field-h:calc(48 * var(--fof-px));
    --fof-field-px:calc(12 * var(--fof-px));
    --fof-field-size:calc(15px * var(--fof-echelle-texte));
    --fof-field-radius:var(--fof-r-md);

    --fof-gap-e:calc(12 * var(--fof-px));}

  /* La colonne ne reçoit ici que sa POSITION, sa LARGEUR et son mouvement.
     Tout ce qu'elle EST par ailleurs — retraits, fond, filet de droite —
     vient de `MainMenu_desktop`, exactement comme la barre du haut vient de
     `MainHeader_desktop` plus bas.
     Trois propriétés étaient encore écrites ici jusqu'au 2026-09-03, et
     comme cette feuille est chargée APRÈS le design system, à spécificité
     égale, elles reprenaient la main sans prévenir : le retrait du bas
     tombait à 0 — « Réglages » se collait au bord au lieu des 50 unités de la
     planche — et le filet de droite repassait en `--fof-border-soft`.
     NE RIEN RÉÉCRIRE ICI que le composant dise déjà.

     La largeur, elle, RESTE : c'est la seule cote que le contenu doit lire
     aussi, pour sa marge de gauche (`.fof-shell`, plus bas). Les deux la
     prennent au MÊME jeton — redéclaré juste au-dessus aux 500 unités de la
     planche — et ne peuvent donc pas se désaccorder. L'écrire deux fois, une
     dans le composant et une pour la marge, rouvrirait exactement la dérive
     que `probe_echelle_bureau` surveille. */
  .fof-sidebar{right:auto;top:0;bottom:0;width:var(--fof-rail-w);height:auto;
    transition:width var(--fof-rail-dur) var(--fof-rail-ease);}
  /* ── État REPLIÉ ────────────────────────────────────────────────────────
     Une seule propriété change vraiment : la largeur — 160 unités contre 500,
     le même couple que `MainMenu_desktop.is-ferme`. Tout le reste suit de la
     mise en page, c'est ce qui donne le mouvement d'ensemble plutôt qu'une
     succession d'effets. */
  .fof-sidebar.is-mini{width:var(--fof-rail-w-mini);}
  /* Le logo a toujours été en pourcentage « pour qu'il suive si la barre
     change de largeur » : il se réduit donc tout seul. Seul son retrait est
     animé, et le mot FOFBOARD s'efface — à 46 px il ne se lirait plus. */
  .fof-logo{display:block;padding:calc(30 * var(--fof-px));
    border-bottom:1px solid var(--fof-border-soft);
    transition:padding var(--fof-rail-dur) var(--fof-rail-ease);}
  .fof-sidebar.is-mini .fof-logo{padding:calc(14 * var(--fof-px)) calc(11 * var(--fof-px));}
  /* Replié, le logo rectangulaire cède la place au carré : à 48 px de large,
     le nom du groupe écrit ne se lirait plus, alors que la marque carrée tient
     à cette taille. Ce sont les deux images importées dans « Mon groupe ».
     L'échange est net — pas de fondu : les deux marques n'ont ni la même forme
     ni la même hauteur, et se croiser en transparence les brouillerait. */
  .fof-sidebar.is-mini .fof-logo-full{display:none;}
  .fof-sidebar.is-mini .fof-logo-mark{display:block;}
  .fof-logo-word{transition:opacity .1s ease,
    height var(--fof-rail-dur) var(--fof-rail-ease),
    margin-top var(--fof-rail-dur) var(--fof-rail-ease);}
  .fof-sidebar.is-mini .fof-logo-word{opacity:0;height:0;margin-top:0;overflow:hidden;}
  /* La liste défile VERTICALEMENT, jamais de côté. `overflow-y:auto` seul ne
     suffit pas à le garantir : quand une seule des deux directions est réglée,
     la règle du CSS bascule l'autre de `visible` à `auto` — un contenu trop
     large fait alors apparaître un ascenseur horizontal. On ferme donc la
     porte explicitement. L'étiquette de survol de la barre repliée n'en
     souffre pas : elle passe en `position:fixed`, qui échappe au rognage. */
  .fof-nav{flex-direction:column;justify-content:flex-start;align-items:stretch;
    gap:calc(4 * var(--fof-px));padding:calc(16 * var(--fof-px)) calc(12 * var(--fof-px));overflow-y:auto;overflow-x:hidden;}
  .fof-nav-item{flex:0 0 auto;flex-direction:row;justify-content:flex-start;
    text-align:left;gap:calc(11 * var(--fof-px));padding:calc(10 * var(--fof-px)) calc(13 * var(--fof-px));font-size:var(--fof-t-badge);
    transition:background .12s,color .12s,gap var(--fof-rail-dur) var(--fof-rail-ease);}
  /* L'écart vient APRÈS l'icône : le réduire ne la déplace pas. À zéro, la
     largeur utile du bouton (20 px) est exactement celle de l'icône, et le
     libellé — `flex` à `min-width:0` — tombe à zéro sans jamais déborder.
     Aucun `overflow:hidden` n'est nécessaire, l'anneau de focus reste donc
     entièrement visible. */
  .fof-sidebar.is-mini .fof-nav-item,
  .fof-sidebar.is-mini .fof-rail-toggle{gap:0;}
  /* Le libellé se laisse écraser par la mise en page pendant que la barre se
     resserre, et s'efface plus VITE qu'elle ne se referme (100 ms contre
     200) : le texte a disparu avant que la place ne manque, il ne peut donc
     ni déborder ni clignoter. Au déploiement, l'inverse — il attend 60 ms
     que la place soit faite avant de revenir. */
  .fof-nav-label{flex:1 1 auto;min-width:0;overflow:hidden;
    white-space:nowrap;text-overflow:ellipsis;
    transition:opacity .14s ease .06s;}
  .fof-sidebar.is-mini .fof-nav-label{opacity:0;transition:opacity .1s ease;}
  /* ── Étiquette de survol de la barre repliée ────────────────────────────
     C'est le libellé LUI-MÊME qui devient l'étiquette : un seul texte dans
     la page, donc jamais lu deux fois par un lecteur d'écran. Il est déjà
     invisible quand il bascule en flottant, il n'y a donc pas de saut.
     `position:fixed` sans `top` : la boîte reste à sa place naturelle en
     hauteur, et échappe au rognage de la liste qui défile — ce qu'un
     `absolute` ne ferait pas. `left` seul est repris du repère de la
     fenêtre, ce qui la pose juste à droite de la barre.
     Apparence : celle des menus flottants de l'application. */
  .fof-sidebar.is-mini .fof-nav-item:hover  .fof-nav-label,
  .fof-sidebar.is-mini .fof-nav-item:focus-visible .fof-nav-label,
  .fof-sidebar.is-mini .fof-rail-toggle:hover .fof-nav-label,
  .fof-sidebar.is-mini .fof-rail-toggle:focus-visible .fof-nav-label{
    position:fixed;left:calc(var(--fof-rail-w-mini) + 10 * var(--fof-px));top:auto;
    transform:translateY(calc(-7 * var(--fof-px)));z-index:60;pointer-events:none;
    flex:0 0 auto;overflow:visible;opacity:1;
    padding:calc(7 * var(--fof-px)) calc(11 * var(--fof-px));font-size:var(--fof-t-badge);font-weight:600;line-height:1.2;
    color:var(--fof-ink);background:var(--fof-surface);
    border:1px solid var(--fof-border-soft);border-radius:var(--fof-r-sm);
    box-shadow:var(--fof-shadow);transition:opacity .1s ease;}
  /* ── Le bouton replier / déployer ───────────────────────────────────────
     Même géométrie qu'une entrée de navigation — mêmes retraits, même
     écart — pour que son icône tombe sur le MÊME axe que les autres, à 35 px
     du bord. Il est hors de la liste qui défile : on doit pouvoir le
     reprendre sans remonter. */
  .fof-rail-toggle{display:flex;align-items:center;position:relative;
    margin:calc(14 * var(--fof-px)) calc(12 * var(--fof-px)) 0;padding:calc(10 * var(--fof-px)) calc(13 * var(--fof-px));gap:calc(11 * var(--fof-px));
    border:none;border-radius:calc(10 * var(--fof-px));background:none;cursor:pointer;
    font-family:inherit;font-size:var(--fof-t-badge);font-weight:600;text-align:left;
    color:var(--fof-faint);
    transition:background .12s,color .12s,gap var(--fof-rail-dur) var(--fof-rail-ease);}
  .fof-rail-toggle:hover{background:var(--fof-surface-2);color:var(--fof-ink-2);}
  /* Le double chevron pointe vers le bord où la barre va se ranger, et fait
     demi-tour quand elle est rangée : la même icône dit les deux actions. */
  .fof-rail-chev{transition:transform var(--fof-rail-dur) var(--fof-rail-ease);}
  .fof-sidebar.is-mini .fof-rail-chev{transform:rotate(180deg);}
  /* Menu sélectionné : fond posé + ICÔNE en bordeaux (capture du brief).
     Plus de liseré vertical à gauche — c'est l'icône qui porte la couleur.
     Le libellé reste en encre pleine : deux marqueurs de couleur sur la même
     ligne se disputeraient l'attention. */
  .fof-nav-item.is-active{background:var(--fof-bg);color:var(--fof-ink);}
  .fof-nav-item.is-active .fof-nav-icon{color:var(--fof-primary);}
  .fof-nav-icon{width:calc(20 * var(--fof-px));height:calc(20 * var(--fof-px));}
  .fof-nav-head{display:block;padding:calc(18 * var(--fof-px)) calc(13 * var(--fof-px)) calc(6 * var(--fof-px));color:var(--fof-faint);
    transition:opacity .12s ease,padding var(--fof-rail-dur) var(--fof-rail-ease);}
  /* Replié, l'intertitre s'efface mais garde une hauteur : il continue de
     séparer les groupes, et la liste ne saute pas d'un état à l'autre. Le
     texte reste dans la page — le groupe s'appelle toujours « Pilotage »
     pour un lecteur d'écran.
     `overflow:hidden` est indispensable : transparent, le mot occupait quand
     même toute sa largeur (« PILOTAGE » fait 65 px dans une barre qui n'en
     mesure que 45 utiles) et poussait un ascenseur horizontal sous la liste.
     Invisible, donc, ET sans encombrement. */
  .fof-sidebar.is-mini .fof-nav-head{opacity:0;padding:calc(10 * var(--fof-px)) calc(13 * var(--fof-px)) calc(2 * var(--fof-px));
    overflow:hidden;white-space:nowrap;}
  /* Le contenu suit la barre sur la MÊME durée et la MÊME courbe : un seul
     mouvement, pas deux qui se ressemblent. */
  .fof-shell{margin-left:var(--fof-rail-w);
    transition:margin-left var(--fof-rail-dur) var(--fof-rail-ease);}
  .fof-shell.is-railmini{margin-left:var(--fof-rail-w-mini);}
  .fof-shell.is-ownhead .fof-header{display:flex;}
  /* ── La barre du haut passe au design system V4 ─────────────────────────
     `MainHeader_desktop` porte ses cotes — 167 plus son trait, 50 à gauche,
     60 à droite. Mais le design system est chargé AVANT `2-mise-en-page.css`,
     dont l'ancien habillage de `.fof-header` l'emporterait : on le retire ici,
     et le composant reprend la main. Ses trois emplacements (`Frame_left`,
     `Frame_center`, `Frame_right`) viendront avec les écrans, au fur et à
     mesure qu'ils seront refaits ; pour l'instant chaque écran garde le
     contenu qu'il posait déjà — et l'écart de 18 px qui sépare deux familles
     dans la barre reste écrit ici pour eux, faute de quoi les deux groupes de
     la Boîte mail se toucheraient. */
  .fof-header{min-height:0;padding:0;gap:calc(18 * var(--fof-px));}
  .fof-usermenu{left:auto;right:calc(24 * var(--fof-px));top:calc(70 * var(--fof-px));bottom:auto;width:calc(230 * var(--fof-px));border-radius:calc(11 * var(--fof-px));}
  /* Dans le rail, le badge devient un compteur aligné à droite du libellé. */
  .fof-nav-badge{position:static;margin-left:auto;}
  /* Replié, il n'y a plus de libellé à border : le badge revient SUR l'icône,
     exactement comme dans la barre basse du téléphone. Le compte de messages
     non lus reste ainsi visible dans les deux états. */
  .fof-sidebar.is-mini .fof-nav-badge{position:absolute;top:calc(4 * var(--fof-px));left:50%;margin-left:calc(2 * var(--fof-px));}
  /* Tout le haut d'écran de l'Agenda et de la Boîte mail remonte dans la
     barre : titre, segmenté, recherche, actions. */
  /* Le titre CÈDE avant le champ de recherche. Il était figé
     (`flex-shrink:0`), si bien que la recherche — seul élément rétractable —
     absorbait à elle seule tout le manque de place : porter sa largeur de
     repos de 320 à 480 px ne changeait alors rien à l'écran. C'est ce qui
     s'est vu le 2026-07-28. Le titre se laisse maintenant réduire, et son
     sous-titre se tronque proprement plutôt que de pousser la barre. */
  /* `flex-shrink:100` contre 1 sur la recherche : quand la barre est trop
     étroite, le manque de place est absorbé PRESQUE ENTIÈREMENT par le
     titre, jusqu'à son plancher de 96 px — la recherche ne cède qu'après.
     C'est ce qui remplace l'ancienne media query 1101-1279 px : le même
     ordre de priorité, mais continu, et sans seuil à tenir à jour. */
  /* `position:relative` : sur la Boîte mail, le titre EST le sélecteur de
     dossier et porte le menu des dossiers (`.fof-lx-menu`), comme chaque
     filtre de Clients porte le sien (`.fof-crm-f`). Sans repère de position
     ici, ce menu se raccrocherait à la barre entière. */
  .fof-hd-titles{display:block;position:relative;flex:0 100 auto;min-width:calc(96 * var(--fof-px));}
  .fof-hd-h1{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .fof-hd-seg{display:flex;flex:0 0 auto;max-width:none;margin-bottom:0;}
  .fof-hd-search,.fof-hd-new,.fof-hd-ghost{display:inline-flex;}
  .fof-hd-addwrap{display:block;}
  /* L'itinéraire de la fiche était RETIRÉ ici : « on ne part pas en tournée
     depuis un ordinateur de bureau ». Les maquettes de lecture du 2026-08-28
     servent les DEUX largeurs — la fiche est la même au téléphone et dans la
     colonne de droite — et Etienne l'y veut aussi. La règle a donc disparu :
     rien ne remplace une règle qui n'a plus lieu d'être. */
  /* Heures : sur ordinateur on TAPE « 18:30 », c'est plus rapide que
     n'importe quel sélecteur. Le champ natif reprend donc sa place et le
     bouton du téléphone est retiré — retiré, pas masqué, sinon il resterait
     dans le parcours au clavier avec le champ juste à côté. */
  .fof-tp-field{display:none;}
  .fof-tp-native{display:block;}
  /* … et l'horloge apparaît DANS le champ : la molette reste accessible à
     la souris sans retirer la saisie au clavier. */
  .fof-tp-open{display:flex;}
  /* ── Les fenêtres pleine page prennent la ZONE DE CONTENU ──────────────
     Demande d'Etienne du 2026-08-27, sur la maquette « REPETITION_Create_
     Desktop » : « la fenêtre de création doit s'étendre sur toute la fenêtre
     principale de l'appli ». Elle ne redevient donc plus une carte centrée
     de 520 px — elle remplace la page, entre la barre du haut et le bas de
     l'écran, à droite du menu. La barre et le menu, eux, restent en place.

     Le mécanisme est celui de `.fof-mv` (la lecture d'un mail), à la lettre :
     un `position:fixed` qui redevient un BLOC EN FLUX. Ce n'est pas un
     détail de style — c'est ce qui évite d'écrire quelque part la hauteur de
     la barre du haut. `.fof-shell` est une colonne flex de 100 vh ; en
     posant la fenêtre dedans, après <main>, `flex:1` lui donne exactement ce
     qui reste sous la barre, quelle que soit sa hauteur, et la marge de
     gauche du contenu lui donne le décalage du menu — replié ou déployé,
     pendant l'animation comprise. Le gabarit a été changé pour ça : les
     trois fenêtres sont passées DANS `.fof-shell`.

     `.fof-main` cède la place plutôt que de la partager : deux blocs `flex`
     dans la même colonne se couperaient la hauteur en deux. C'est
     `is-formfull`, posé sur la coquille par `15-affichage.js` — le même
     principe que `is-railmini` : le contenu et ce qui le recouvre portent le
     même état, chacun sous son nom, et ne peuvent pas se désaccorder. */
  .fof-modal-overlay.is-fullpage{position:static;inset:auto;z-index:auto;
    flex:1 1 auto;min-height:0;
    align-items:stretch;justify-content:stretch;
    padding:var(--fof-sp-6);background:var(--fof-bg);animation:none;}
  .fof-modal-overlay.is-fullpage .fof-sheet{width:100%;max-width:none;
    height:100%;max-height:none;padding:0;overflow:hidden;
    background:var(--fof-surface);
    border:1px solid var(--fof-border);border-radius:var(--fof-r-lg);
    box-shadow:none;animation:none;}
  /* ── L'ASCENSEUR NE PREND QUE LE CONTENU ÉDITABLE ─────────────────────
     Demande d'Etienne du 2026-08-27 : en toute circonstance, le menu de
     gauche, la barre du haut et l'en-tête de la fenêtre restent fixes ; seul
     ce qui se saisit défile. C'est déjà la règle au téléphone, où la fenêtre
     est un `position:fixed` de la hauteur de l'écran.

     Sur ordinateur il manquait UNE chose, et c'est tout le bug : `.fof-shell`
     est en `min-height:100vh`. Une note longue le faisait donc GRANDIR au
     lieu de le remplir — la carte descendait sous le pli, `.fof-rf-body`
     n'était jamais contraint, son `overflow-y:auto` ne se déclenchait pas, et
     la seule façon de lire la suite était de faire défiler la page entière,
     emportant la barre du haut et l'en-tête de la fenêtre avec elle.

     `height` (et non `min-height`) borne la coquille à l'écran, et la chaîne
     se referme : la fenêtre est `flex:1` à `min-height:0`, la carte fait
     100 %, la deuxième rangée de sa grille est `minmax(0,1fr)`, et le corps
     défile enfin pour lui seul. `overflow:hidden` ferme la porte au cas où :
     rien ne peut plus pousser la page.

     UNIQUEMENT dans cet état : `is-formfull` n'est posé que lorsqu'un
     formulaire pleine page est ouvert, et <main> est alors retiré. Les écrans
     ordinaires gardent le défilement de page qu'ils ont toujours eu. */
  .fof-shell.is-formfull{height:100vh;overflow:hidden;}
  .fof-shell.is-formfull > .fof-main{display:none;}
  /* ÉVÈNEMENT et LIEU, en attendant leurs maquettes. Ils passent en pleine
     zone avec la répétition (décision d'Etienne du 2026-08-27), mais leur
     contenu, lui, n'a pas de raison de s'étirer : un champ « Nom de
     l'évènement » large de 1 400 px ne se remplit pas mieux. Chaque bloc
     garde donc la largeur qu'il avait en fenêtre (--sheet-w), centré dans la
     carte — c'est le même parti que `.fof-rf-form` pour la répétition.
     Cette règle disparaîtra le jour où ces deux écrans auront leur propre
     dessin ; d'ici là elle évite une régression que personne n'a demandée. */
  .fof-modal-overlay.is-fullpage .fof-sheet:not(.fof-rf-sheet) > *{
    width:100%;max-width:var(--sheet-w, calc(520 * var(--fof-px)));
    margin-left:auto;margin-right:auto;}

  /* ── Répétition : en-tête et actions sur la même ligne ─────────────────
     Deux colonnes, deux rangées : l'identité à gauche, les deux boutons à
     droite, le formulaire dessous sur toute la largeur. Le filet de la
     maquette court d'un bord à l'autre de la carte — il est donc porté par
     le formulaire, qui est le seul bloc à toucher les deux bords (la carte
     n'a pas de retrait, chaque bloc porte le sien).
     La grille est posée sur `.fof-rf-sheet` et non sur `.fof-sheet` : les
     deux autres fenêtres pleine page gardent leur empilement. */
  .fof-modal-overlay.is-fullpage .fof-rf-sheet{display:grid;
    grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto minmax(0,1fr);}
  .fof-rf-head{grid-column:1;grid-row:1;flex-direction:row;align-items:center;
    justify-content:flex-start;padding:var(--fof-sp-5) 0 var(--fof-sp-5) var(--fof-sp-5);}
  .fof-rf-acts{grid-column:2;grid-row:1;align-self:center;
    justify-content:flex-end;
    padding:var(--fof-sp-5) var(--fof-sp-5) var(--fof-sp-5) 0;}
  /* Les deux boutons reprennent leur largeur naturelle… mais pas moins de
     124. Sur la maquette bureau ils font 154 px rendus et sont ÉGAUX entre
     eux (350 et 353 unités) alors que leurs libellés ne le sont pas : ce
     n'est donc pas une largeur au contenu — au contenu, « ANNULER » ne
     ferait que 97 px. 124 × 1,25 rend exactement 155.
     Au téléphone la règle ne sert pas : ils s'y partagent la rangée à parts
     égales, ce qui leur en donne déjà 152. */
  .fof-rf-acts > *{flex:0 0 auto;min-width:calc(124 * var(--fof-px));}
  .fof-rf-body{grid-column:1 / -1;grid-row:2;
    border-top:1px solid var(--fof-border);
    padding:var(--fof-sp-8) var(--fof-sp-5);}
  /* ── Évènement : les trois colonnes de la maquette ──────────────────────
     La date à gauche avec son déroulé, le client et l'argent au milieu, le
     groupe à droite : trois blocs qu'on lit de front au lieu de dérouler
     quinze champs les uns sous les autres.
     Elles ne s'ÉTIRENT pas — chacune est plafonnée par `.fof-ef-col` à la
     largeur d'un champ, et l'ensemble se cale à gauche, comme sur la
     maquette (49 unités de marge à gauche, tout le reste à droite). Sur un
     écran très large, la place gagnée reste vide plutôt que d'étirer un
     champ « Nom de l'évènement » sur 500 px.

     Le parcours en quatre étapes n'a rien à défaire ici : il vit tout entier
     dans la requête média du téléphone, plus haut dans cette feuille. Il ne
     reste qu'à retirer le ruban, qui n'aurait plus rien à parcourir. */
  .fof-ef-form{grid-template-columns:repeat(3, minmax(0, calc(440 * var(--fof-px))));
    justify-content:start;}
  .fof-ef-steps{display:none;}
  /* L'en-tête d'écran, le segmenté et la recherche qui vivaient DANS la page
     n'ont plus lieu d'être : leur contenu est dans la barre. */
  .fof-ag-top,.fof-ag-seg-page,.fof-ag-search{display:none;}
  /* Documents et Plan : leurs titres sont maintenant dans la barre du haut,
     comme ceux des autres menus, et ces deux écrans n'ont aucune action
     d'en-tête — le bloc entier disparaît, il ne resterait rien à afficher.
     Devis & factures n'est pas ici : son en-tête d'écran est un `.fof-ag-top`
     comme celui de l'Agenda, déjà retiré par la règle juste au-dessus. */
  .fof-doc-head,.fof-plan-head{display:none;}
  /* Idem pour la Boîte mail : son en-tête d'écran (maquette 3a) et sa
     bascule de boîte sont dans la barre du haut au-delà de 1101 px. */
  .fof-mail-top,.fof-mail-seg-page{display:none;}
  /* Un seul champ de recherche dans toute l'application : celui de la barre.
     Les champs propres aux pages ne servent qu'en dessous de 1101 px, là où
     la barre n'a pas la place de les accueillir. Celui de la Boîte mail est
     couvert par la règle `.fof-ag-search` ci-dessus : c'est le même élément.
     Ici la rangée ne contient PLUS que la recherche (« Déjà joué » a rejoint
     les filtres) : on retire donc la rangée entière, et non son contenu —
     vidée, elle laisserait sa marge. */
  .fof-lx-search{display:none;}
  /* Les filtres reprennent leur largeur naturelle : il y a la place, et trois
     puces étirées sur 1200 px seraient trois banderoles. */
  /* Les trois filtres sont dans la barre du haut : ceux de la page n'ont
     plus lieu d'être, exactement comme les onglets de l'Agenda. */
  .fof-lx-filters{display:none;}
  /* Boîte mail : les trois filtres sont des boutons de la barre du haut, à
     droite de la bascule de boîte — le ⋮ qui les rassemblait au téléphone n'a
     donc plus d'objet. */
  .fof-mail-more{display:none;}
  /* La lecture d'un message reprend sa place dans le bloc : plus de plein
     écran, plus de recouvrement de la barre latérale. */
  .fof-mv{position:static;inset:auto;z-index:auto;background:none;padding-top:0;}

  /* ── Éditeur de setlist : bibliothèque à gauche, setlist à droite ──────
     Les deux colonnes défilent séparément, sous un en-tête et au-dessus d'un
     pied qui, eux, ne bougent pas. Les hauteurs sont réparties par le flex,
     sans hauteur calculée à la main. */
  .fof-slmod{overflow:hidden;}
  .fof-slmod-inner{max-width:calc(1180 * var(--fof-px));height:100%;min-height:0;}
  /* Deux colonnes de largeur égale : la séparation tombe au milieu. */
  .fof-sl-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
    gap:calc(20 * var(--fof-px));min-height:0;}
  .fof-sl-lib{display:flex;flex-direction:column;min-height:0;}
  .fof-sl-lib-list{flex:1 1 auto;min-height:0;overflow-y:auto;
    overscroll-behavior:contain;padding-right:calc(6 * var(--fof-px));}
  .fof-sl-col-main{overflow-y:auto;overscroll-behavior:contain;padding-right:calc(6 * var(--fof-px));}
  /* La bibliothèque est sous les yeux : la feuille « Ajouter » n'a plus
     d'objet, elle ne sert qu'en dessous de 1101 px. Le pied ne portait
     qu'elle : il disparaît avec, plutôt que de laisser un filet et une
     bande vides en bas de la fenêtre. */
  .fof-sl-add{display:none;}
  .fof-sl-foot{display:none;}
  .fof-sl-empty-wide{display:block;}
  .fof-sl-empty-narrow{display:none;}
  /* La vignette du compte est en pied de rail (maquette 2a), plus en barre. */
  .fof-main{padding:calc(28 * var(--fof-px)) calc(24 * var(--fof-px));padding-bottom:calc(48 * var(--fof-px));}
  /* ── Fiche client : la même fenêtre que « Ajouter un contact » ───────────
     Demande d'Etienne du 2026-07-29 : sur ordinateur la fiche n'est plus un
     panneau collé à droite mais la carte centrée commune aux fenêtres de
     l'application (`.fof-sheet`) — même voile sombre, mêmes coins arrondis,
     même hauteur (88 vh au plus), mais DEUX FOIS plus large (520 → 1040 px).
     Les valeurs posées en ligne sur l'élément sont pilotées par les trois
     variables `--drw-*`, sinon l'attribut `style` gagnerait sur la règle. */
  .fof-drawer-overlay{--drw-backdrop:rgba(20,4,10,.45);
    align-items:center;justify-content:center;padding:calc(24 * var(--fof-px));}
  .fof-drawer{--drw-bg:var(--fof-surface);--drw-shadow:var(--fof-shadow);
    width:min(calc(1040 * var(--fof-px)),100%);height:auto;max-height:88vh;
    border-radius:var(--fof-r-lg);
    animation:popIn .16s ease;}
  /* La fenêtre devient une carte centrée, comme les autres fenêtres. */
  .fof-ed-shell{padding:calc(24 * var(--fof-px));}
  .fof-ed-card{width:min(var(--ed-w,calc(1180 * var(--fof-px))),100%);height:auto;max-height:92vh;
    border-radius:var(--fof-r-lg);box-shadow:0 calc(24 * var(--fof-px)) calc(70 * var(--fof-px)) rgba(40,4,16,.4);
    animation:popIn .18s ease;}
  .fof-ed-header{flex-wrap:nowrap;padding:calc(12 * var(--fof-px)) calc(20 * var(--fof-px));}
  .fof-ed-missing,.fof-ed-sent{padding:calc(12 * var(--fof-px)) calc(20 * var(--fof-px));}
  .fof-ed-actions{width:auto;margin-left:auto;flex-wrap:nowrap;}
  .fof-ed-body{flex-direction:row;overflow-y:hidden;}
  .fof-ed-pane{flex:0 0 40%;overflow-y:auto;padding:calc(24 * var(--fof-px)) calc(26 * var(--fof-px));
    border-right:1px solid var(--fof-border-soft);border-bottom:none;}
  .fof-ed-preview{overflow-y:auto;padding:calc(30 * var(--fof-px));}
  .fof-ed-page{padding:calc(46 * var(--fof-px)) calc(48 * var(--fof-px));min-height:calc(920 * var(--fof-px));}
  /* Devis : au-delà de 1100 px, les trois sections sont visibles d'un bloc,
     avec l'aperçu à côté. L'indicateur d'étapes et le pied disparaissent. */
  .fof-ed-stepper,.fof-ed-foot{display:none;}
  .fof-ed-step{display:block;}
  .fof-ln-row{gap:calc(12 * var(--fof-px));}
  /* Agenda : liste à gauche, panneau de détail permanent de 420 px à droite.
     Plus de modale pour consulter une date.
     Les DEUX colonnes défilent séparément : chacune est collée sous la barre
     du haut, plafonnée à la hauteur de la fenêtre, et porte son propre
     ascenseur. Faire défiler la liste ne bouge donc plus le panneau, et
     inversement. La page elle-même ne défile plus sur cet écran. */
  /* ── LES DEUX COLONNES (maquette D_AGENDA_Clair_v2 du 2026-09-04) ───────
     Les dates à gauche, la date choisie à droite. Les cotes de la planche, sur
     son cadre de 3721 (564 → 4285) :
        50    du menu à la colonne de gauche
      2250    le panneau du mois
       100    entre les deux colonnes
      1271    le bloc de lecture
        50    jusqu'au bord droit
     50 + 2250 + 100 + 1271 + 50 = 3721. La colonne de droite est FIXE, la
     gauche prend ce qui reste : sur un écran plus large, c'est elle qui
     grandit — c'est le partage qu'Etienne décrivait, deux tiers contre un
     tiers sur la largeur de sa maquette.
     ⚠ Le bloc de lecture est passé de 1100 à 1271 : la planche le redessine à
     cette largeur-là, et il s'y pose sans rien changer d'autre — ses écarts
     verticaux et ses retraits sont les mêmes qu'au téléphone, seule la largeur
     bouge. */
  .fof-agenda{display:grid;
    grid-template-columns:minmax(0,1fr) calc(1271 * var(--ds-unite));
    gap:calc(100 * var(--ds-unite));align-items:start;}
  /* Les deux colonnes défilent chacune de son côté, collées sous la barre du
     haut — 170, la hauteur de `MainHeader_desktop`, trait compris. Leur
     hauteur est celle de la fenêtre moins la barre ET moins les 50 qui les en
     séparent : elles s'arrêtent donc exactement au bas de l'écran.
     ⚠ PLUS DE RETRAIT DE 20 À DROITE : il réservait la place de l'ascenseur du
     DS, que D_AGENDA_Clair_v2 ne dessine plus — et que l'application masque
     partout depuis le 2026-09-03. Le panneau du mois retrouve ses 2250 pleins.
     La gouttière reste réservée, qu'il y ait de quoi défiler ou non : sans
     cela, une colonne qui déborde se décalerait quand l'autre non. */
  .fof-agenda-list,.fof-agenda-panel{position:sticky;top:calc(170 * var(--ds-unite));
    max-height:calc(100vh - 220 * var(--ds-unite));overflow-y:auto;overscroll-behavior:contain;
    scrollbar-gutter:stable;}
  .fof-agenda-panel{display:block;}
  /* 60 sous la barre pour l'intertitre du premier mois, contre 50 pour le
     panneau de droite : la planche décale les deux colonnes de 10. Les 50 sont
     portés par la page, ces 10 par le seul intertitre de tête. */
  .fof-agenda-list > .fof-ag4-month:first-child{margin-top:calc(10 * var(--ds-unite));}
  /* Au-delà de 1101 px il n'y a pas de fenêtre : le panneau est la colonne
     de droite, même si l'état « fenêtre ouverte » traîne après un
     redimensionnement. */
  .fof-agenda-panel.is-sheet{position:sticky;inset:auto;top:calc(170 * var(--ds-unite));z-index:auto;
    background:none;padding:0;}
  /* Même précaution pour ce que la fenêtre retirait : sur écran large la
     liste doit revenir, même si l'état traîne après un redimensionnement.
     (En-tête, segmenté et recherche sont déjà masqués ici par ailleurs.) */
  .fof-main.is-agsheet .fof-agenda-list{visibility:visible;}
  /* Le titre d'écran n'est plus retouché ici non plus. Cette feuille étant
     chargée APRÈS 4-ecrans.css, elle gagnait : elle ramenait la taille à
     --fof-t-page (34) et remettait un resserrement de -.5 px réglé pour
     Instrument Sans — sur une condensée, il colle les lettres. Les deux
     viennent maintenant de --fof-t-titre-ecran, une seule fois, pour tous
     les écrans et toutes les largeurs. */
  /* Boîte mail : plus de colonne de dossiers à gauche (2026-08-23). Les
     195 px qu'elle prenait vont à la liste des messages, et le dossier se
     choisit dans le titre de la barre du haut. Rien à écrire pour la faire
     disparaître : la feuille montante vit dans l'en-tête d'écran, déjà retiré
     ici (`.fof-mail-top`), et `.fof-mail-body` reste la colonne qu'il est au
     téléphone — avec un seul enfant, qui prend toute la place. */
  /* Sur ordinateur, « Répondre » n'a pas à s'étirer sur toute la largeur. */
  .fof-mv-footer{justify-content:flex-start;}
  .fof-mv-action{flex:0 0 auto;min-width:calc(170 * var(--fof-px));}
  /* Lecture d'un mail : l'objet monte d'un cran, sur la ligne du chevron de
     retour et des boutons étoile / dossier / ⋮ (demande d'Etienne du
     2026-07-29). La barre ne se replie plus, l'objet reprend sa place entre
     les deux et le filet revient sous la barre. */
  .fof-mv-topbar{flex-wrap:nowrap;padding:calc(8 * var(--fof-px)) calc(10 * var(--fof-px));
    border-bottom:1px solid var(--fof-border-soft);}
  /* 23 px était une taille de titre de page ; dans une barre de 44 px c'est
     un titre de barre. Un objet trop long est coupé aux points de suspension
     plutôt que de repousser les trois boutons — il reste lisible en entier
     par l'infobulle. */
  .fof-mv-subject{order:0;flex:1 1 auto;min-width:0;
    margin:0 calc(6 * var(--fof-px));padding:0;border-top:none;
    font-size:calc(18px * var(--fof-echelle-texte));line-height:1.3;word-break:normal;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  /* Pas de retrait supérieur à rendre à l'en-tête : l'objet est parti dans
     la barre, et `.fof-mv-from` porte déjà ses 14 px de marge haute. En le
     remettant, on cumulait les deux — 28 px de vide sous la barre, à
     hauteur du bloc de la liste et du bouton « Nouveau message »
     (signalé par Etienne). L'en-tête garde donc la règle du téléphone. */

  /* ── Connexion : la maquette du bureau ─────────────────────────────────
     « Figma Etienne/D_Connection_clair.svg », par différence avec celle du
     téléphone qui est écrite en entier dans `4-ecrans.css`. Tout ce qui
     n'est pas repris ici est identique d'un format à l'autre : les
     composants gardent leurs tailles — c'est la règle du DS — et seuls le
     panneau et un écart bougent.

     Ces règles ne connaissent pas `--fof-px`. L'écran du DS s'écrit en
     `--ds-unite`, qui vaut le même tiers de pixel partout : sur un écran
     plus large il y a plus de place, pas des composants plus gros. La
     double échelle du bureau, elle, ne s'applique qu'aux écrans d'avant. */
  /* Le bloc reprend le centre de la fenêtre : l'écart fixe du téléphone
     n'existe que pour dégager les champs du clavier, et sur un ordinateur
     il n'y a pas de clavier qui monte.

     ⚠ La maquette, elle, ne le centre pas tout à fait : elle le pose à 357
     du haut d'un cadre de 2410, là où un centrage donnerait 409. Cinquante
     unités, 23 px à l'écran. On garde le centrage — une cote fixe prise sur
     un cadre de 2410 ne veut plus rien dire dans une fenêtre plus haute ou
     plus courte, et l'écran de connexion est le seul qui n'ait rien pour
     remplir le vide. À dire à Etienne s'il tient au cadrage exact. */
  .fof-conn-bloc{margin:auto;}
  /* 1600 − 2 traits de 3 − 1200 de champ, le tout en deux, soit 197.
     114,3 en haut : la maquette pose la ligne de base de « Connexion » à
     184 du bord intérieur du panneau, moins 0,697 × 100 de capitales. */
  .fof-conn-panneau{width:calc(1600 * var(--ds-unite));
    padding:calc(114.3 * var(--ds-unite)) calc(197 * var(--ds-unite)) calc(155 * var(--ds-unite));}
  .fof-conn-erreur{margin-top:calc(40 * var(--ds-unite));}
  /* ⚠ Au bureau, tout ce qui est sous le panneau tombe 0,7 px plus haut que
     la maquette, et ce n'est pas une cote fausse : le trait de 3 unités vaut
     1,335 px à cette échelle, et le navigateur arrondit TOUJOURS l'épaisseur
     d'un trait au pixel entier — 1 px au lieu de 1,335. Chacun des quatre
     traits traversés perd un tiers de pixel. Au téléphone le trait tombe
     juste sur 1 px et rien ne dérive. Il n'y a rien à corriger ici : ce
     serait mentir sur la cote pour rattraper un arrondi d'affichage. */
  /* Et c'est tout. Les maquettes du 2026-09-02 ont rapproché les deux
     formats : l'accroche, les écarts entre les champs, celui du bouton et
     tout le pied sont IDENTIQUES au chiffre près, écrits une seule fois
     dans `4-ecrans.css`. Ne restent ici que la largeur du panneau, ses
     trois retraits, et l'écart au-dessus du message d'erreur. */
}

/* ── AGENDA V4 : la barre du bas est celle du TÉLÉPHONE ─────────────────────
   Au-delà de 1101 px, la navigation vit dans le menu de gauche (`MainMenu_
   desktop`) : la barre du bas n'a plus lieu d'être, et l'écran rend le retrait
   qu'elle occupait. La maquette de bureau, D_AGENDA_Clair, ne la dessine pas.
   Le retrait du bas de la page est écrit plus loin, avec les trois autres. */
@media (min-width: 1101px) {

  /* ── LE MENU AU DESIGN SYSTEM V4 (D_AGENDA_Clair, 2026-09-02) ───────────
     La barre du bas est la forme TÉLÉPHONE du menu : ici c'est la colonne de
     gauche qui prend le relais, et les deux ne se croisent jamais.

     Les deux largeurs sont celles de la planche : 564 unités ouverte, 160
     fermée — 251 et 71 px à l'unité du bureau, contre 273 et 77 avant. Elles
     passent par les deux mêmes jetons qu'avant, ce qui suffit à décaler la
     coquille : `.fof-shell` lit `--fof-rail-w`, elle n'a rien à savoir de
     plus.

     ⚠ Ces deux jetons sont REDÉCLARÉS ici et non modifiés dans `1-socle.css` :
     ils y sont écrits en `--fof-px`, l'échelle de l'ancien socle, et le menu
     V4 se mesure en unités du plan. Les écrans non refaits gardent donc leur
     échelle, seule la colonne change. */
  :root {
    --fof-rail-w: calc(564 * var(--ds-unite));
    --fof-rail-w-mini: calc(160 * var(--ds-unite));
  }
  .MenuMobile_Footer { display: none; }
  .fof-sidebar { display: flex; }

  /* Le logo large en tête, 75 avant l'entrée « Réduire le menu ». Une fois la
     colonne repliée, c'est le carré qui prend sa place, suivi d'un trait.
     ⚠ IL FAIT TOUTE LA LARGEUR DE LA COLONNE depuis « D_AGENDA_Clair_v2 »
     (2026-09-04) : 562 × 250 au lieu de 450 × 200, et il RESSORT donc du
     retrait de 55,5 du menu — d'une demi-unité de plus, même, de chaque côté.
     Sa taille est celle du composant (`Image_ouvert`) ; il n'y a ici que la
     sortie du retrait. */
  .fof-menu4-logo { margin: 0 calc(-56 * var(--ds-unite)) calc(75 * var(--ds-unite)); }
  .fof-menu4-mark,
  .fof-menu4-trait { display: none; }
  .fof-sidebar.is-ferme .fof-menu4-logo { display: none; }
  .fof-sidebar.is-ferme .fof-menu4-mark { display: block; margin: 0 auto; }
  .fof-sidebar.is-ferme .fof-menu4-trait { display: block; }

  /* 75 entre « Réduire le menu » et la première entrée : le même écart qu'entre
     deux familles. Les entrées, elles, se suivent sans écart — leurs boîtes de
     100 se touchent, et c'est `is-groupe` qui ouvre les familles suivantes. */
  .fof-menu4-nav { display: flex; flex-direction: column;
    margin-top: calc(75 * var(--ds-unite)); }

  /* Le libellé d'une entrée tient sur UNE ligne, comme sur la maquette : la
     colonne a la largeur qu'il faut, et « Réduire le menu » y entre tout juste.
     Sans cette ligne, c'est lui qui se coupe en deux et fait grandir l'entrée. */
  .fof-menu4-label { white-space: nowrap; }

  /* Repliée, la colonne ne montre plus que les icônes. */
  .fof-sidebar.is-ferme .fof-menu4-label { display: none; }
  .fof-sidebar.is-ferme .fof-menu4-toggle .icon_ArrowOpenClose_44x44 { transform: rotate(180deg); }
}

/* ── AGENDA V4 : ce qui appartient au TÉLÉPHONE se retire ───────────────────
   Le titre, les trois onglets et la recherche vivent dans la barre du haut
   au-delà de 1101 px — c'est ce que montre `MainHeader_desktop` sur la
   maquette D_AGENDA_Clair, et c'est ce que fait déjà la barre existante. La
   page rend aussi son retrait de téléphone : ici c'est `.fof-main` qui le
   porte, comme pour tous les écrans.
   Le carrousel, lui, n'a pas de règle à écrire : la logique ne le rend pas
   sur écran large (`agShowNextBlock`), la maquette de bureau ne le dessine
   pas non plus. */
@media (min-width: 1101px) {
  .fof-ag4-top,
  .fof-ag4-seg,
  .fof-ag4-search { display: none; }
  /* La page REND à l'écran le retrait de `.fof-main` et prend celui de la
     planche : 50 sur les côtés, 50 en haut, rien en bas. Jusqu'au 2026-09-03
     elle remettait sa marge à zéro et vivait donc dans le retrait de
     `.fof-main` — 30 px de côté au lieu des 50 unités de la maquette, 22 px.
     ⚠ LES TROIS NOMBRES SONT CEUX DU BUREAU, pas ceux du téléphone : plus haut
     dans cette même feuille, `.fof-main` passe à 28 / 24 / 48 au-delà de
     1101 px. Une marge écrite avec les 16 / 20 / 106 du téléphone ne les
     annulerait pas — c'est ce qui laissait 5 px de trop de chaque côté.
     Le fond, lui, n'est pas repris : la racine de l'application peint déjà
     --fof-bg, qui est le --background-color du DS. */
  .fof-ag4-page { margin: calc(-28 * var(--fof-px)) calc(-24 * var(--fof-px))
                          calc(-48 * var(--fof-px));
    padding: calc(50 * var(--ds-unite)) calc(50 * var(--ds-unite)) 0;
    background: none; }

  /* ── … et ce que la barre du haut met à leur place ────────────────────
     Les emplacements sont au DS ; leur CONTENU appartient à l'écran.
     Les cotes de D_AGENDA_Clair_v2, prises sur ses cadres :
        100  du titre aux onglets — « Agenda » en Bebas 120 mesure 286,2, il
             commence à 614, et `Frame_buttons` est posé à 1001
        300  la largeur d'un onglet, 40 entre eux — 980 en tout, la largeur
             exacte de `Frame_buttons` (1001 → 1981)
        800  la recherche, puis 60 avant le « + » de 132 : 992, et les 60 de
             `Frame_right` referment la barre à 4285.
     La recherche est le seul morceau élastique : sous la largeur de la
     maquette, c'est elle qui cède, comme dans l'ancienne barre. Les onglets,
     eux, ne cèdent pas (`flex:none`) — c'est le titre qui se laisse réduire.
     ⚠ Les onglets ne sont plus au MILIEU de la barre : ils suivent le titre
     dans `Frame_left`, et c'est cet emplacement qui les met en ligne. */
  .fof-ag4-hdseg { display: flex; align-items: center; flex: none;
    gap: calc(40 * var(--ds-unite)); margin-left: calc(100 * var(--ds-unite)); }
  .fof-ag4-hdseg .Btn_clickable { width: calc(300 * var(--ds-unite)); }
  .MainHeader_desktop:has(> .Frame_left) > .Frame_right { gap: calc(60 * var(--ds-unite)); }
  .fof-ag4-hdsearch { width: calc(800 * var(--ds-unite)); min-width: 0; }
}
