/* ==========================================================================
   LES POLICES SONT SERVIES D'ICI, PAS DEPUIS GOOGLE. Avant, la premiere ligne
   etait un @import de fonts.googleapis.com : le navigateur devait recevoir ce
   fichier, puis la feuille de Google, puis les deux fichiers de fonts.gstatic.com
   — trois allers-retours vers deux domaines tiers, EN SERIE, avant le premier
   texte (mesure : 1 000 a 1 200 ms en 4G lente, alors que le HTML etait la a
   180 ms). Les quatre fichiers vivent maintenant dans /_app/polices/, leur nom
   porte leur empreinte (cache d'un an, immutable), et chaque page les
   precharge depuis son <head>. Ce sont des polices VARIABLES restreintes aux
   graisses reellement utilisees (Archivo 500-700, Manrope 400-700) : un seul
   fichier par famille, 31 + 23 ko, et les variantes latin-ext ne sont
   telechargees que si un texte en a besoin (unicode-range).
   font-display: swap : le texte s'affiche tout de suite dans la police de
   secours, jamais de texte invisible. Pour regenerer : scripts/polices.mjs.
   ========================================================================== */
@font-face{font-family:"Archivo";font-style:normal;font-weight:500 700;font-display:swap;
  src:url(/_app/polices/archivo-latin.ff1d9c76.woff2) format("woff2");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Archivo";font-style:normal;font-weight:500 700;font-display:swap;
  src:url(/_app/polices/archivo-latin-ext.366ccbbb.woff2) format("woff2");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Manrope";font-style:normal;font-weight:400 700;font-display:swap;
  src:url(/_app/polices/manrope-latin.e782cba4.woff2) format("woff2");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Manrope";font-style:normal;font-weight:400 700;font-display:swap;
  src:url(/_app/polices/manrope-latin-ext.7439ce6c.woff2) format("woff2");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
/* ==========================================================================
   COACHIAMO · systeme d'application · public/_app/athlon.css
   Le seul fichier de style des deux applications (client et coach).
   Aucun ecran ne redefinit une valeur d'ici, aucun ecran n'ecrit une couleur.
   --------------------------------------------------------------------------
   LES HUIT REGLES
   1. Marine pour la structure et le texte. VERT PROFOND #1F6633 pour l'action,
      et rien d'autre : un seul aplat d'action par ecran, texte blanc dessus
      (charte « Court et Tilleul », docs/31, 21/09/2026 ; l'azur #1E9FE6 est sorti).
   2. Tilleul, ambre, corail sont des ETATS : ils portent un point, un trait ou
      un bord. Jamais du texte (le tilleul ne tient ni sous du blanc ni sur du blanc).
   3. Archivo pour les titres et TOUS les chiffres (tabular-nums).
      Manrope pour le texte courant, 14 px sur 18.
   4. Un seul trait (--filet), une seule epaisseur. Aucune ombre de carte.
   5. Rayon 0 partout, sauf .face .pastille .volant .pastilleN .inter et les
      points d'etat.
   6. La photographie posee sur du blanc EST la carte.
   7. Le prix en gras et souligne EST le bouton.
   8. Aucun emoji, aucune couleur or, aucune serif, aucun tiret cadratin.
   ========================================================================== */

/* ═══════════════ 1 · JETONS ═══════════════ */
:root{
  --papier:#FFFFFF;            /* le fond */
  --papier2:#F4F5F6;           /* section posee, champ, encart */
  --papier3:#EDEFF1;           /* reserve d'image */
  --encre:#16263F;             /* Marine : texte et structure */
  --ardoise:#4A5A6E;           /* texte secondaire */
  --brume:#5E6D80;             /* capitales, libelles, tertiaire. 5,3 contre 1 sur blanc, 4,8 sur
                                  papier2 : l'ancien #8493A4 tombait a 3,1 (retour C31, verif du 12/09),
                                  et #637285 frolait 4,5 sur papier2 (4,504 : rien ne doit tenir a un cheveu) */
  --brume2:#B4BEC9;            /* le POINT d'un jour ou d'un creneau indisponible. Jamais du texte : 1,9
                                  contre 1 sur blanc (le chiffre d'un jour ferme est en brume depuis le 14/09) */
  --filet:rgba(22,38,63,.14);  /* LE trait */
  --filet2:rgba(22,38,63,.07); /* le meme trait a l'interieur d'un bloc */
  /* LA COULEUR D'ACTION (palette A de la charte docs/31, posee le 21/09/2026) : le vert profond
     du logotype, texte BLANC dessus (6,98 contre 1), appui #1C5C2E (8,02). Elle ne change pas la
     nuit : un bouton vert profond + blanc tient sur toute encre. --azur et --azur-fg RESTENT
     COMME ALIAS (des dizaines de regles et de vues les nomment) et valent l'action : on ne les
     ecrit plus dans une regle neuve, on ecrit --action / --action-fg. */
  --action:#1F6633; --action-fg:#FFFFFF; --action-appui:#1C5C2E;
  --azur:var(--action); --azur-fg:var(--action-fg);
  /* LE TILLEUL : l'accent doux du logo. Pastille d'etat positif, filet gauche, jauge, trait sous
     l'onglet actif, fond a 12 % (--tilleul-12 = #F2F7EA sur blanc) et bordure douce a 24 %
     (--tilleul-24 = #E5EED4). JAMAIS un bouton, jamais sous du texte blanc (2,27), jamais en
     texte sur blanc (2,27) : seul le marine tient dessus (6,69). */
  --tilleul:#91B94C; --tilleul-12:rgba(145,185,76,.14); --tilleul-24:rgba(145,185,76,.32);
  /* LE VERT « EN TEXTE » : liens, onglet actif, petites capitales de section du site. Vert profond
     le jour (6,41 sur papier), tilleul clair #9EC350 la nuit (9,07 sur #0C1520) : c'est le SEUL
     endroit ou la nuit change le vert. */
  --lien:#1F6633;
  /* L'etat positif EST le tilleul (plus de vert menthe #1F9E6B : aucune troisieme famille de vert). */
  --vert:var(--tilleul); --ambre:#E8A33D; --corail:#E5544E;
  /* LE CORAIL QUI PORTE UN CHIFFRE (19/09, pastilles de compte « a traiter »). --corail lisait
     3,6 contre 1 sous du blanc : trop peu pour un nombre de 12 px. Celui-ci tient 4,8 contre 1
     sous #FFFFFF, le jour comme la nuit (il ne s'eclaircit pas la nuit : c'est un fond, pas un
     texte). Il ne sert QU'AUX pastilles de compte (.pastilleN.du, .item .n.du) : rien d'autre. */
  --corail-plein:#CF3F39;
  --voile:rgba(8,16,26,.72);   /* voile photographique et fond de feuille */
  --sur-photo:#FFFFFF;
  --contre:#16263F;            /* grande surface a contre-jour : bloc de chiffres, toast */
  --contre-txt:#FFFFFF;
  --bureau:#E3E6E9;            /* la planche autour de la colonne, en large */
  --bureau-filet:rgba(22,38,63,.16);
  --titre:"Archivo","Avenir Next","Helvetica Neue",Helvetica,Arial,sans-serif;
  --texte:"Manrope","Avenir Next","Helvetica Neue",Helvetica,Arial,sans-serif;
  --marge:20px;
  --colonne:430px;             /* largeur maximale de la coque */
  --h-action:48px; --h-second:40px; --h-champ:56px;
  --h-onglets:60px; --h-tete:52px;
  --rayon-doigt:999px;
  --bas:env(safe-area-inset-bottom,0px);
  /* Le decalage du tiroir de gestion : 0 partout, sauf sur un grand ecran de
     l'espace du coach, ou le tiroir reste ouvert en colonne fixe (voir 3.4).
     Tout ce qui est `position:fixed` s'en sert pour rester aligne. */
  --decalage:0px;
  /* Reserve basse pour la bande « Coachiamo sur votre ecran d'accueil » (6.29 / 7.5).
     Elle vaut 0 px et elle y reste : depuis le 10/09 la bande est DANS LE FLUX du
     corps, elle ne flotte plus au-dessus de rien (7.5). La variable survit pour les
     regles de .corps et pour une feuille de page qui voudrait s'en servir. */
  --h-pose:0px;
  /* LES JETONS DE MOUVEMENT (12/09). Une animation d'application native dure entre
     180 et 260 ms et ralentit en arrivant : --courbe. Ce qui revient a sa place
     (une ligne relachee avant le seuil, une feuille qui monte) depasse un peu et
     revient : --ressort. On n'ecrit JAMAIS une duree ni une courbe en dur dans une
     regle de transition : on nomme ces quatre jetons. Sous prefers-reduced-motion,
     les durees tombent a 0 (voir 7.2) : tout devient instantane, rien ne casse. */
  --duree-courte:180ms; --duree:240ms;
  --courbe:cubic-bezier(.2,.8,.2,1);
  --ressort:cubic-bezier(.34,1.56,.64,1);
  /* Le ressort des GRANDES surfaces (feuille, tiroir du bas, boite de dialogue) :
     il depasse de 3 % et se pose. Le --ressort de 10 % va aux petites choses (une
     ligne qui revient, un bouton, un interrupteur) ; sur une feuille de 700 px il
     ferait sauter le contenu de 70 px. */
  --ressort-doux:cubic-bezier(.3,1.2,.5,1);
  /* L'a-coup du retour haptique (Athlon.haptique) : 80 ms, l'instant du seuil. */
  --duree-acoup:80ms;
  /* Le chiffre qui compte (Athlon.compter, 7.12) : 300 ms, le PLAFOND de tout ce qui bouge
     hors la courbe des statistiques. Le chiffre qui CHANGE apres un geste suit --duree. */
  --duree-compte:300ms;
  /* LES DEUX MOUVEMENTS D'ECRAN (19/09, Athlon.transition, LISEZ-MOI § 17). « Pousser » :
     un sous-ecran entre de la droite pendant que l'ancien recule de 30 % en s'assombrissant,
     280 ms ; le retour fait l'inverse. « Fondu » : un changement d'onglet racine, fondu croise
     de 160 ms, rien ne se deplace, comme iOS. Le recul de l'ecran derriere une feuille
     (--recul-feuille) tient de la meme famille. 0 ms sous mouvement reduit. */
  --duree-pousser:280ms; --duree-fondu:160ms;
  /* [W1 22/09] LE SITE QUI BOUGE (docs/42 § 2.3, § 2.4). Le volet de menu et le tiroir du coach glissent en
     320 ms (240 a la fermeture) sous un voile marine a 40 % qui laisse voir la page (un menu laisse voir,
     une feuille masque : --voile reste a 72 %). L'apparition au defilement (Athlon.apparaitre) : 480 ms,
     fondu + 24 px, une seule fois. 0 ms sous mouvement reduit. Un menu laisse lire la page derriere
     lui (le tiroir du coach comme le volet du site) ; seule la feuille masque, elle garde --voile a 72 %. */
  --duree-volet:320ms; --duree-parait:480ms; --voile-menu:rgba(22,38,63,.40);
  --recul-ecran:30%; --recul-feuille:.96; --ombre-recul:.28;
  /* LES APLATS DOUX D'ETAT (les « washes »). La couleur d'etat prend plus de place
     qu'un point : elle teinte le FOND d'une ligne, d'une carte, d'un bandeau, a 10
     a 14 % sur le papier. Le texte pose dessus reste marine ou ardoise, MESURE :
     marine 13,3 contre 1, ardoise 6,2 contre 1 sur chacun des quatre. La brume
     (2,7) n'y a pas sa place : dans un aplat d'etat, le tertiaire devient ardoise. */
  --vert-doux:var(--tilleul-12);      /* #F2F7EA sur blanc : le fond tilleul a 12 % de la charte */
  --ambre-doux:rgba(232,163,61,.14);  /* #FCF2E4 */
  --corail-doux:rgba(229,84,78,.11);  /* #FCECEC */
  --azur-doux:var(--tilleul-12);      /* l'aplat « information » prend le tilleul a 12 % (charte docs/31) */
  --action-doux:rgba(31,102,51,.08);  /* #EDF3EF : vert profond a 8 %, la teinte des cartes 1 et 6 */
  /* Les six teintes des cartes de raccourci (6.20) : chaque carte a la sienne. */
  --teinte-1:var(--action-doux); --teinte-2:var(--tilleul-12); --teinte-3:rgba(232,163,61,.12);
  --teinte-4:rgba(229,84,78,.08);  --teinte-5:rgba(22,38,63,.06);   --teinte-6:rgba(31,102,51,.16);
  color-scheme:light;
}
@media (prefers-color-scheme:dark){ :root:not([data-theme="light"]){
  --papier:#0C1520; --papier2:#141F2C; --papier3:#1B2836;
  --encre:#EEF3F7; --ardoise:#A2B3C4; --brume:#7D91A4; --brume2:#4A5B6C;
  --filet:rgba(190,215,235,.18); --filet2:rgba(190,215,235,.09);
  /* La nuit : le bouton d'action NE CHANGE PAS (vert profond + blanc) ; le vert en texte et le
     tilleul passent au tilleul clair #9EC350 (9,07 contre 1 sur #0C1520). */
  --tilleul:#9EC350; --tilleul-12:rgba(158,195,80,.14); --tilleul-24:rgba(158,195,80,.34);
  --lien:#9EC350;
  --ambre:#F0B454; --corail:#F0746E;
  --voile:rgba(4,9,15,.76);
  /* LA SURFACE A CONTRE-JOUR DE NUIT (14/09). #1B2836 n'etait qu'a 1,23 contre 1 du fond
     et 1,11 de --papier2 : les blocs marine (« Ce que disent les chiffres », « Ton mois »)
     se confondaient avec les sections posees et la regle 9 s'eteignait la nuit. #2E4359 :
     1,80 contre 1 sur --papier, 1,63 sur --papier2 ; le blanc voile a 62 % y reste a
     5,07, a 72 % a 6,16, le texte plein a 9,1. Les points d'etat y tiennent (vert 4,4,
     ambre 5,5, vert profond via le tilleul clair). */
  --contre:#2E4359; --contre-txt:#EEF3F7;
  --bureau:#060D15; --bureau-filet:rgba(190,215,235,.18);
  --ambre-doux:rgba(240,180,84,.16); --corail-doux:rgba(240,116,110,.14);
  --action-doux:rgba(158,195,80,.10);
  --teinte-3:rgba(240,180,84,.12); --teinte-4:rgba(240,116,110,.10); --teinte-5:rgba(190,215,235,.07);
  --teinte-6:rgba(158,195,80,.22);
  color-scheme:dark;
} }
:root[data-theme="dark"]{
  --papier:#0C1520; --papier2:#141F2C; --papier3:#1B2836;
  --encre:#EEF3F7; --ardoise:#A2B3C4; --brume:#7D91A4; --brume2:#4A5B6C;
  --filet:rgba(190,215,235,.18); --filet2:rgba(190,215,235,.09);
  /* La nuit : le bouton d'action NE CHANGE PAS (vert profond + blanc) ; le vert en texte et le
     tilleul passent au tilleul clair #9EC350 (9,07 contre 1 sur #0C1520). */
  --tilleul:#9EC350; --tilleul-12:rgba(158,195,80,.14); --tilleul-24:rgba(158,195,80,.34);
  --lien:#9EC350;
  --ambre:#F0B454; --corail:#F0746E;
  --voile:rgba(4,9,15,.76);
  /* LA SURFACE A CONTRE-JOUR DE NUIT (14/09). #1B2836 n'etait qu'a 1,23 contre 1 du fond
     et 1,11 de --papier2 : les blocs marine (« Ce que disent les chiffres », « Ton mois »)
     se confondaient avec les sections posees et la regle 9 s'eteignait la nuit. #2E4359 :
     1,80 contre 1 sur --papier, 1,63 sur --papier2 ; le blanc voile a 62 % y reste a
     5,07, a 72 % a 6,16, le texte plein a 9,1. Les points d'etat y tiennent (vert 4,4,
     ambre 5,5, vert profond via le tilleul clair). */
  --contre:#2E4359; --contre-txt:#EEF3F7;
  --bureau:#060D15; --bureau-filet:rgba(190,215,235,.18);
  --ambre-doux:rgba(240,180,84,.16); --corail-doux:rgba(240,116,110,.14);
  --action-doux:rgba(158,195,80,.10);
  --teinte-3:rgba(240,180,84,.12); --teinte-4:rgba(240,116,110,.10); --teinte-5:rgba(190,215,235,.07);
  --teinte-6:rgba(158,195,80,.22);
  color-scheme:dark;
}

/* ═══════════════ 2 · REMISE A ZERO ═══════════════ */
*{margin:0;padding:0;box-sizing:border-box}
/* LE FOND DE LA PAGE EST LE PAPIER, pas le bureau : quand iOS tire l'ecran au-dela de
   ses bords (l'elastique du haut et du bas), c'est le fond de <html> qu'on voit. Il etait
   gris : une application qui montre son bureau a chaque tirage n'est pas une application.
   Le bureau reste celui de <body>, il n'apparait qu'autour de la colonne sur un ordinateur.
   -webkit-tap-highlight-color : Safari peignait un voile gris sur tout ce qu'on touchait
   (0 occurrence dans le depot avant le 14/09) ; l'etat presse est le notre, il s'enfonce
   (4.5). */
html{-webkit-text-size-adjust:100%;background:var(--papier);-webkit-tap-highlight-color:transparent}
body{background:var(--bureau);color:var(--encre);font-family:var(--texte);
     font-size:14px;line-height:18px;-webkit-font-smoothing:antialiased;
     font-variant-numeric:tabular-nums;overflow-x:hidden}
img{display:block;max-width:100%}
button{font:inherit;color:inherit;background:none;border:none;cursor:pointer;text-align:left;
       -webkit-user-select:none;user-select:none;-webkit-touch-callout:none}
/* Un appui long sur une photographie ou sur une carte <a> ouvrait le menu du systeme
   (« Ouvrir dans un nouvel onglet », « Enregistrer l'image ») : sur un bouton, un lien de
   carte, un visage, une photographie, l'appui long n'est pas un geste de l'application. Le
   texte courant, lui, reste selectionnable : on copie une adresse, un prix, un nom. */
a.coach,a.dest,a.racc,a.cren,a.client-l,a.bande,a.carre,.rapide,.face,.ph img,.bande img,
.onglets a,.tiroir a,.item,.decider .dessus,.tirer .dessus,.inter,.case,.pastille,.action,.second,.carre{
  -webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
input,textarea,select{font:inherit;color:inherit;background:none;border:none;border-radius:0}
a{color:inherit;text-decoration:none}
:focus-visible{outline:2px solid var(--lien);outline-offset:2px}
::selection{background:var(--action);color:var(--action-fg)}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ═══════════════ 3 · LA COQUE D'APPLICATION ═══════════════
   <body><div class="app"> … </div></body>
   Telephone : la coque occupe l'ecran. Large : une colonne de 430 posee sur
   le bureau, cernee d'un filet. Rien d'autre ne change. */
.app{background:var(--papier);color:var(--encre);min-height:100dvh;
     max-width:var(--colonne);margin:0 auto;position:relative;
     display:flex;flex-direction:column;overflow-x:clip}
@media(min-width:520px){
  .app{box-shadow:0 0 0 1px var(--bureau-filet);min-height:100dvh}
}
/* le corps qui defile ; les classes disent ce qui est fixe par dessus.
   --h-pose s'ajoute PARTOUT, et vaut 0 px : la bande d'invitation n'est plus du
   mobilier fixe, elle vit dans le flux du corps (7.5). */
.corps{flex:1;min-width:0;padding-bottom:var(--h-pose)}
.corps.sous-onglets{padding-bottom:calc(var(--h-onglets) + var(--bas) + 8px + var(--h-pose))}
/* 120 px, et non 104 : une barre d'action qui porte une ligne .rassure mesure 112 px.
   A 104, la derniere ligne de l'ecran passait dessous. */
.corps.sous-barre{padding-bottom:calc(120px + var(--bas) + var(--h-pose))}
.corps.sous-volant{padding-bottom:calc(84px + var(--bas) + var(--h-pose))}
.corps.sous-onglets.sous-volant{padding-bottom:calc(var(--h-onglets) + var(--bas) + 76px + var(--h-pose))}
/* le corps d'un ecran de gestion : plus de barre d'onglets sous lui, seulement
   le degagement d'une barre d'action eventuelle */
.corps.sous-rien{padding-bottom:calc(var(--bas) + 18px + var(--h-pose))}

/* --- 3.4 · LA COQUE DE GESTION (body.gestion) --------------------------
   L'espace du coach a un TIROIR (6.17) et, depuis le 19/09, une barre du bas
   a cinq entrees (.onglets.pro, 3.2 bis) qui n'existe que sur un telephone.
   Sur un telephone, le tiroir glisse par-dessus. Au-dela de 1000 px il ne
   glisse plus : il reste ouvert en colonne fixe a gauche, le bouton qui
   l'ouvre disparait, le fond sombre n'a plus lieu d'etre, et toute la
   coque se decale de sa largeur. La colonne s'elargit un peu : un outil
   professionnel se travaille sur un ecran d'ordinateur. */
@media(min-width:1000px){
  body.gestion{--decalage:288px;--colonne:520px;padding-left:var(--decalage)}
  /* LE TIROIR ET LA COLONNE FONT UNE SEULE PLANCHE, POSEE AU MILIEU DU BUREAU.
     Colle a gauche, le tiroir laissait un couloir gris entre lui et le contenu :
     deux objets qui flottent, au lieu d'un outil. La colonne est centree dans
     l'espace qui reste (le remplissage de body), le tiroir se pose donc juste
     a sa gauche : left = 50% - (tiroir + colonne)/2. */
  body.gestion .tiroir{width:var(--decalage);transform:none;transition:none;
                       left:calc(50% - (var(--decalage) + var(--colonne))/2);
                       box-shadow:0 0 0 1px var(--bureau-filet)}
  body.gestion .tiroir-fond{display:none}
  body.gestion .ouvre-tiroir{display:none}
  /* Plus de bouton de menu a gauche : sans lui, un titre centre tombe de travers. */
  body.gestion .tete.pro .titre{text-align:left}
}

/* --- 3.5 · LE BUREAU, VRAIMENT (>= 1100 px) ---------------------------
   A 1440, l'outil restait une bande de 520 px : tiroir 288 + contenu 520 =
   808 px employes, environ 630 px de gris a droite, et rien de centre. Un
   tableau de bord de professionnel doit tenir en DEUX COLONNES a cette
   largeur, pas en maquette de telephone posee dans un coin.
     · la colonne de contenu s'elargit ;
     · les pages riches passent en deux colonnes avec `.deux-colonnes`, qui
       ne fait rien du tout en dessous de 1100 px — le telephone ne change pas. */
@media(min-width:1100px){
  body.gestion{--colonne:min(1040px, calc(100vw - var(--decalage) - 48px))}
  body.gestion .app{padding-bottom:24px}
}
/* Deux colonnes de meme largeur, separees par LE trait : l'important a gauche,
   le deroulement a droite. Chaque colonne defile avec la page, aucune ne se fige :
   deux barres de defilement independantes sur un tableau de bord font perdre le fil. */
.deux-colonnes{display:block}
@media(min-width:1100px){
  /* Le trait qui separe les deux colonnes est une BORDURE, pas un fond que les
     enfants recouvrent : avec un fond, la colonne la plus courte laissait voir
     une grande dalle grise sous elle. */
  .deux-colonnes{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
                 align-items:start;background:var(--papier)}
  .deux-colonnes>*+*{border-left:1px solid var(--filet)}
  .deux-colonnes>*{min-width:0}
  /* Un separateur horizontal n'a plus de sens en tete d'une colonne. */
  .deux-colonnes>*>hr.filet:first-child{display:none}
}
/* --- 3.6 · LA PLACE DE MARCHE SUR UN ORDINATEUR (body.marche) ----------
   L'espace du coach se deploie sur 1040 px avec son menu en colonne et deux
   colonnes de contenu ; la place de marche, elle, restait une bande de 430 px
   posee sur du gris, puis une bande de 1040 px ou tout s'empilait encore en
   une seule file. Sur un ordinateur, le cote client faisait maquette de
   telephone pendant que le cote coach faisait outil. Voici l'autre moitie
   du bureau.

   LE SEUIL EST 1000 px, et non 1100 : c'est celui de l'espace du coach (3.4).
   Les deux moities du produit basculent desormais a la meme largeur.

   Ce qui change au-dela de 1000 px, et rien d'autre :
     · la coque s'elargit a 1040 px, comme celle du coach ;
     · la barre d'onglets QUITTE LE BAS et devient la navigation du haut : sur un
       ordinateur, la navigation d'un site se lit en haut, elle ne se colle pas au
       ras du bureau. Les cinq entrees, leur icone et leur libelle, ne changent pas ;
     · les rangees qui glissent se DEPLIENT en grille (.ordi-grille) : sur un
       telephone le bord coupe appelle le geste, sur un ordinateur il ne fait que
       cacher la moitie de l'offre derriere une barre de defilement invisible ;
     · les listes de coachs passent en deux ou trois cartes par rangee
       (.grille-cartes, .grille-cartes.trois) ;
     · la fiche du coach met la photographie a gauche et le PANNEAU DE
       RESERVATION colle a droite (.ordi-fiche) ;
     · le tunnel garde le calendrier a gauche et le recapitulatif a droite
       (.deux-colonnes, 3.5) ;
     · un espace a onglets pose son menu en colonne a gauche (.ordi-cote).

   Rien de tout cela n'existe en dessous de 1000 px : le telephone, valide, ne
   bouge pas d'un pixel.

   LA NAVIGATION DU HAUT NE SE COLLE PAS. Elle defile avec la page, et ce n'est
   pas un oubli : la barre du haut (.tete) et la recherche de l'accueil, elles,
   se collent deja a zero. Deux barres collantes a la meme hauteur se recouvrent,
   et sur les ecrans ou la barre d'onglets est cachee, une navigation collante
   laisserait un trou de 59 px sous rien du tout. */
@media(min-width:1000px){
  body.marche{--colonne:min(1040px, calc(100vw - 48px))}
  body.marche .app{padding-bottom:24px}
  body.marche .onglets{position:static;transform:none;order:-1;
        width:100%;max-width:none;height:auto;min-height:59px;padding:0 6px;
        border-top:0;border-bottom:1px solid var(--filet)}
  body.marche .onglets a{flex:0 0 auto;flex-direction:row;gap:9px;padding:0 15px;min-height:58px}
  body.marche .onglets a.on::before{top:auto;bottom:0;left:15px;right:15px}
  body.marche .onglets .lab{font-size:11px;letter-spacing:.04em}
  /* plus rien de fixe au ras du bas : le corps n'a plus a s'en degager */
  body.marche .corps.sous-onglets{padding-bottom:calc(var(--bas) + 28px + var(--h-pose))}
  /* Les deux colonnes de 3.5 servent aussi la place de marche, et des 1000 px :
     le tunnel de reservation en vit (calendrier a gauche, recapitulatif a droite). */
  body.marche .deux-colonnes{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
                 align-items:start;background:var(--papier)}
  body.marche .deux-colonnes>*+*{border-left:1px solid var(--filet)}
  body.marche .deux-colonnes>*{min-width:0}
  body.marche .deux-colonnes>*>hr.filet:first-child{display:none}
}

/* Un ecran qui n'est qu'un formulaire ou un texte suivi garde sa LARGEUR DE
   LECTURE quand la coque s'elargit : un champ de saisie de mille pixels ne se
   lit pas, il s'endure. Sans effet en dessous de 1000 px. */
.mesure{width:100%}
@media(min-width:1000px){
  body.marche .mesure{max-width:520px;margin-left:auto;margin-right:auto}
}

/* .lisible — LA LIGNE NE DEPASSE PAS SOIXANTE-DIX SIGNES. Un paragraphe de
   texte suivi pose en travers de 1000 px fait 160 signes par ligne : l'oeil
   perd le debut de la ligne suivante. Sur un telephone la question ne se pose
   pas (390 px = 55 signes), la regle ne vit donc qu'au-dela de 1000 px.
   A poser sur le PARAGRAPHE, jamais sur son conteneur : le conteneur porte
   souvent un fond ou un filet qui, lui, va d'un bord a l'autre.
   50ch, et non 64 : le « ch » est la chasse du zero, plus large que la lettre
   moyenne de Manrope. A 64ch la ligne portait 82 signes, mesures ; a 50ch elle
   en porte 62 a 70 selon le texte (une phrase de r, de t et de i est plus
   serree qu'une phrase de m et de o). */
.lisible{max-width:100%}
@media(min-width:1000px){
  body.marche .lisible{max-width:50ch}
  /* Dans une COLONNE d'ordinateur (la fiche, le tunnel, une bande photographique),
     tout paragraphe est lisible d'office : un avis de 86 signes sur une ligne, une
     aide de champ de 76, une mention de 108 ne se nomment pas un par un. La regle
     ne touche que la largeur maximale : un texte court ne bouge pas, un texte
     centre ou aligne a droite n'existe pas dans ces colonnes. */
  body.marche .ordi-fiche>.pcpal :is(p,.note,.c14):not(.cap),
  body.marche .deux-colonnes :is(p,.aide),
  body.marche .bande .mot p{max-width:50ch}
  /* le petit texte (12 et 13 px) a des lettres plus etroites : 54 ch y font
     encore 66 signes, et une mention de 60 signes ne rejette plus son dernier mot. */
  body.marche .ordi-fiche>.pcpal :is(.c12,.c13):not(.cap){max-width:54ch}
  /* l'aide d'un champ est un span en ligne : une largeur maximale ne le plie pas
     tant qu'il n'est pas un bloc. Il le devient ici, et seulement ici. */
  body.marche .deux-colonnes .champ-l .aide{display:block}
}

/* Une liste de cartes qui passe a DEUX PAR RANGEE sur un ordinateur — TROIS
   avec .trois — et qui ne fait rien du tout en dessous de 1000 px. Ce qui n'est
   pas une carte — une bande photographique, une rangee de chiffres, un
   separateur — tient toute la largeur. .paquet est le regroupement de trois
   cartes qui donne son rythme au telephone : sur un ordinateur il s'efface
   (display:contents) pour que ses cartes deviennent les cases de la grille. */
.grille-cartes{display:block}
@media(min-width:1000px){
  body.marche .grille-cartes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
        align-items:start;column-gap:0;row-gap:0}
  body.marche .grille-cartes.trois{grid-template-columns:repeat(3,minmax(0,1fr))}
  body.marche .grille-cartes>*{min-width:0}
  body.marche .grille-cartes>.paquet{display:contents}
  body.marche .grille-cartes>:not(.coach):not(.paquet):not(.bande){grid-column:1/-1}
  /* LA BANDE PHOTOGRAPHIQUE EST UNE CASE, PAS UNE BARRE. Posee apres trois cartes,
     en pleine largeur, elle laissait la troisieme carte seule sur sa rangee avec
     une case blanche a cote : un trou au milieu de la liste. Elle prend donc une
     case, sur toute la hauteur de la rangee, et la liste coule sans trou : deux
     cartes, une carte et la bande, deux cartes. Le sommaire des chiffres, lui,
     garde les deux colonnes : c'est une conclusion, pas une case. */
  body.marche .grille-cartes>.bande{grid-column:auto;align-self:stretch;height:auto;min-height:280px}
  body.marche .grille-cartes>.bande .mot{bottom:20px}
  body.marche .grille-cartes .coach{padding-bottom:22px}
  body.marche .grille-cartes .coach .ph{height:220px}
  body.marche .grille-cartes.trois .coach .ph{height:196px}
}

/* --- 3.7 · LA RANGEE QUI GLISSE SE DEPLIE (.ordi-grille, .ordi-deplie) -
   Sur un telephone, le quatrieme element coupe au bord droit EST ce qui
   appelle le geste (6.26). Sur un ordinateur il n'appelle rien : il cache la
   moitie des destinations derriere une barre de defilement qu'on ne voit pas.
   Deux depliages, tous deux inertes en dessous de 1000 px :

     .ordi-grille  pour des CARTES : la rangee passe a la ligne et les cartes
                   se partagent la largeur. Elles GRANDISSENT pour la remplir
                   (flex-grow 1) : la derniere rangee ne laisse jamais une case
                   vide, quel que soit le nombre de coachs inscrits ce jour-la.
                   --ordi-base est la largeur minimale d'une carte (190 px), et
                   c'est elle qui decide du nombre par rangee ; .large la porte
                   a 300 px pour une carte qui raconte.
     .ordi-deplie  pour des PASTILLES : elles gardent leur largeur, la rangee
                   passe simplement a la ligne. C'est la forme des rails de
                   filtres, ou rien ne doit rester cache derriere le bord.

   Les reperes de la rangee (6.26) n'ont plus rien a reperer : ils disparaissent. */
@media(min-width:1000px){
  /* cursor:auto : glisse() pose la main qui saisit (.saisissable) sur toute rangee ;
     une grille depliee ne se tire pas, la main mentirait. */
  body.marche .glisse.ordi-grille,body.marche .glisse.ordi-deplie{
        flex-wrap:wrap;row-gap:var(--ecart);overflow:visible;scroll-snap-type:none;cursor:auto}
  body.marche .glisse.ordi-grille>*{flex:1 1 var(--ordi-base,190px);min-width:0;
        scroll-snap-align:none}
  body.marche .glisse.ordi-grille.large{--ordi-base:300px}
  /* les bandeaux (6.24) : trois par rangee dans 828 px, deux dans 1040 avec .large ;
     240 px, c'est le minimum pour que « 3,9 sur 5 » et sa legende tiennent. */
  body.marche .glisse.bandeaux.ordi-grille{--ordi-base:240px;padding-bottom:2px}
  /* .dest a une largeur fixe de 160 px pour la rangee du telephone : dans la
     grille, la case decide, pas la carte. */
  body.marche .glisse.ordi-grille>.dest{width:auto}
  body.marche .glisse.ordi-grille>.dest .ph{height:196px}
  body.marche .glisse.ordi-grille>.sportv .ph{height:146px}
  body.marche .glisse.ordi-grille~.reperes,
  body.marche .glisse.ordi-deplie~.reperes{display:none}
  /* Les deux rangees de pastilles du systeme — les gestes rapides (6.25) et le
     rail d'onglets ou de filtres (4.5) — se deplient d'office : elles n'ont pas
     besoin d'etre nommees une par une, et une pastille cachee derriere le bord
     droit d'un ecran de bureau est une pastille perdue. */
  body.marche .rapides,body.marche .rail{flex-wrap:wrap;row-gap:8px;overflow:visible}
}

/* --- 3.8 · LE MENU D'UN ESPACE PASSE EN COLONNE (.ordi-cote) ----------
   L'espace du client a cinq onglets dans un rail qui glisse (4.5). Au-dela de
   1000 px, ce rail devient un MENU EN COLONNE a gauche, comme le tiroir du
   coach (3.4) : c'est la meme famille d'ecrans, elle se tient de la meme
   maniere. A poser sur le conteneur dont le PREMIER enfant est le .rail ;
   le second enfant est la vue. En dessous de 1000 px, rien ne change. */
@media(min-width:1000px){
  body.marche .ordi-cote{display:grid;grid-template-columns:212px minmax(0,1fr);
        align-items:start;background:var(--papier)}
  body.marche .ordi-cote>.rail{display:block;overflow:visible;padding:16px 16px 24px var(--marge);
        border-right:1px solid var(--filet);position:sticky;top:calc(var(--h-tete) + 10px)}
  body.marche .ordi-cote>.rail>.pastille{display:flex;width:100%;justify-content:flex-start;
        white-space:normal;border-radius:0;border:0;border-left:2px solid transparent;
        background:none;height:auto;min-height:36px;padding:8px 10px;color:var(--ardoise)}
  body.marche .ordi-cote>.rail>.pastille+.pastille{margin-top:2px}
  body.marche .ordi-cote>.rail>.pastille.on{background:var(--papier2);border-left-color:var(--encre);
        color:var(--encre)}
  /* Les colonnes sont NOMMEES, elles ne dependent pas de l'ordre : le rail est
     cache (display:none) tant que la session n'a pas repondu, et la vue seule
     serait alors tombee dans la colonne etroite de gauche. */
  body.marche .ordi-cote>.rail{grid-column:1}
  body.marche .ordi-cote>*:not(.rail){grid-column:2;min-width:0}
}

/* --- 3.9 · LA FICHE DU COACH, A LA MANIERE D'AIRBNB (.ordi-fiche) ------
   Au-dela de 1000 px, la photographie et le recit tiennent la colonne large,
   et LE PANNEAU DE RESERVATION — les formules, le prix, le bouton — se colle
   a droite et suit le defilement. C'est le geste d'Airbnb, et c'est le seul
   qui repond a la question du client : « combien, et quand ».

   La page se decoupe en trois blocs, et l'ORDRE DU DOCUMENT EST CELUI DU
   TELEPHONE :
       <div class="ordi-fiche">
         <div class="pcpal">  photographie, cartouche, chiffres, presentation
         <aside class="reserve">  formules, puis la barre de reservation
         <div class="pcpal">  avis, lieux, destinations, prochains jours
   En dessous de 1000 px les trois blocs s'effacent (display:contents) et la
   page se lit exactement comme la maquette validee, au pixel pres. Au-dela,
   les deux .pcpal tombent dans la colonne de gauche et l'aside occupe la
   colonne de droite sur toute la hauteur.

   LA BARRE DE RESERVATION EST LE MEME NOEUD dans les deux cas : fixee au ras
   du bas sur un telephone (6.4), reposee dans le flux du panneau sur un
   ordinateur. Une barre dupliquee aurait fini par annoncer deux prix. */
.ordi-fiche,.ordi-fiche>.pcpal,.ordi-fiche>.reserve{display:contents}
@media(min-width:1000px){
  body.marche .ordi-fiche{display:grid;grid-template-columns:minmax(0,1fr) 366px;
        grid-template-rows:auto auto;align-items:start;background:var(--papier)}
  /* LE TRAIT est porte par les deux blocs de gauche, pas par le panneau : le
     panneau colle en haut ne mesure que sa hauteur, et sous lui le trait
     s'arretait net, laissant la colonne de droite sans bord sur un ecran entier. */
  body.marche .ordi-fiche>.pcpal{display:block;grid-column:1;min-width:0;
        border-right:1px solid var(--filet)}
  body.marche .ordi-fiche>.reserve{display:block;grid-column:2;grid-row:1/3;min-width:0;
        position:sticky;top:14px}
  /* la barre du bas revient dans le flux : plus de position fixe, plus de
     largeur de coque, plus d'ombre portee au ras du bureau. */
  body.marche .ordi-fiche>.reserve .barre-bas{position:static;transform:none;left:auto;
        width:auto;max-width:none;padding-bottom:0;border-top:1px solid var(--filet);z-index:auto}
  /* La barre du haut de la fiche est POSEE SUR la photographie (3.1) : elle
     doit donc s'arreter la ou la photographie s'arrete, sinon son bouton de
     partage flotte au-dessus du panneau de reservation.
     LA CLASSE DE PAGE EST fiche-coach, JAMAIS fiche : .fiche est un composant
     (6.9, la fiche d'un client) dont la remise a zero `.fiche .tete{position:
     static}` s'appliquait a toute la page des que body portait `fiche`. La barre
     du haut tombait alors AU-DESSUS de la photographie, en bande blanche, sur le
     telephone comme sur l'ordinateur. */
  body.marche.fiche-coach .tete.sur-photo{right:366px}
  /* le degagement du bas n'a plus lieu d'etre : la barre n'est plus fixee. */
  body.marche.fiche-coach .corps.sous-barre{padding-bottom:calc(var(--bas) + 24px + var(--h-pose))}
  /* LE PANNEAU EMPILE SES FORMULES. Dans 366 px, la rangee qui glisse ne montrait
     que deux formules et le bord de la troisieme : une formule cachee derriere le
     bord d'un panneau de bureau est une formule perdue. La rangee passe en
     colonne, chaque carte prend la largeur, les reperes n'ont plus rien a reperer. */
  body.marche .ordi-fiche>.reserve .glisse{flex-direction:column;flex-wrap:nowrap;
        overflow:visible;scroll-snap-type:none;cursor:auto;gap:8px}
  body.marche .ordi-fiche>.reserve .glisse>*{flex:0 0 auto;width:100%;min-height:0;
        scroll-snap-align:none}
  body.marche .ordi-fiche>.reserve .glisse~.reperes{display:none}
}


/* --- 3.9 bis · LA FICHE DU COACH SUR ORDINATEUR, VERSION 2 (.ordi-fiche.v2) --------------------
   [W1 22/09] docs/42 § 3.6, la fiche d'Airbnb : « tu arrives, des photos, tu descends ». Au-dela de
   1000 px la page se decoupe en quatre : le TITRE au-dessus des photos (cap, h1 44 px, la note et
   « Profil verifie » a droite, Mettre de cote / Partager en liens texte), la MOSAIQUE 1 + 4 (480 px,
   gouttiere 8, rayon 0, jamais une case vide : 4 photos = 1 + 3, 3 = 1 + 2 empilees, 1 = pleine
   largeur), la COLONNE GAUCHE (720 px : presentation, formules en cartes 2 x 2 sans bordure,
   chiffres, lieux, avis, destinations, verifications, h2 a 28 px, un filet entre deux sections et
   aucun autour d'un bloc) et la COLONNE DE RESERVATION COLLANTE (380 px, top 92, blanc pose sur le
   papier, sans bordure : le prix en 32 px souligne, le rail des jours, les creneaux du jour, le seul
   bouton vert, Tout le mois, Poser une question). En dessous de 1000 px : display:contents, l'ecran
   du telephone tel quel (les ids des hooks ne changent pas : #formules, #dispos, #pied-fiche…). */
.ordi-fiche.v2,.ordi-fiche.v2>.fiche-tete,.ordi-fiche.v2>.mosaique,.ordi-fiche.v2>.pcpal,.ordi-fiche.v2>.reserve{display:contents}
.ordi-fiche.v2>.fiche-tete,.ordi-fiche.v2>.mosaique,.ordi-fiche.v2 #pied-fiche-prix{display:none}
@media(min-width:1000px){
  body.marche .ordi-fiche.v2{display:grid;grid-template-columns:minmax(0,1fr) 380px;column-gap:64px;row-gap:0;
        align-items:start;background:var(--papier);max-width:1180px;margin:0 auto;padding:0 var(--marge-site) 48px;box-sizing:content-box}
  body.marche .ordi-fiche.v2>.fiche-tete{display:flex;grid-column:1/-1;align-items:flex-end;justify-content:space-between;gap:32px;padding:32px 0 20px}
  .ordi-fiche.v2 .fiche-tete .g{display:flex;flex-direction:column;gap:10px;min-width:0}
  .ordi-fiche.v2 .fiche-tete .cap{color:var(--lien)}
  .ordi-fiche.v2 .fiche-tete h1{font-family:var(--titre);font-weight:700;font-size:44px;line-height:1;letter-spacing:-.028em}
  .ordi-fiche.v2 .fiche-tete .d{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:0 0 auto}
  .ordi-fiche.v2 .fiche-tete .note{display:inline-flex;align-items:center;gap:8px;font-family:var(--titre);font-weight:600;font-size:20px;font-variant-numeric:tabular-nums}
  .ordi-fiche.v2 .fiche-tete .note .ic{width:20px;height:20px;color:var(--encre)}
  .ordi-fiche.v2 .fiche-tete .note a{font-family:var(--texte);font-weight:500;font-size:15px;color:var(--encre);text-decoration:underline;text-underline-offset:3px}
  .ordi-fiche.v2 .fiche-tete .verif{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--ardoise)}
  .ordi-fiche.v2 .fiche-tete .verif::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--tilleul)}
  .ordi-fiche.v2 .fiche-tete .verif.attente::before{background:var(--ambre)}
  .ordi-fiche.v2 .fiche-tete .liens{display:flex;gap:20px;margin-top:4px}
  .ordi-fiche.v2 .fiche-tete .liens button{display:inline-flex;align-items:center;gap:8px;min-height:44px;background:none;border:0;padding:0;
        font-size:15px;font-weight:600;color:var(--encre);text-decoration:underline;text-underline-offset:3px;cursor:pointer}
  .ordi-fiche.v2 .fiche-tete .liens .ic{width:18px;height:18px}
  /* la mosaique */
  body.marche .ordi-fiche.v2>.mosaique{display:grid;grid-column:1/-1;position:relative;height:480px;gap:8px;
        grid-template-columns:2fr 1fr 1fr;grid-template-rows:1fr 1fr;margin-bottom:40px}
  .ordi-fiche.v2 .mosaique img{width:100%;height:100%;object-fit:cover;display:block;background:var(--papier3);border-radius:0}
  .ordi-fiche.v2 .mosaique>div{min-width:0;min-height:0}
  .ordi-fiche.v2 .mosaique>.ph1{grid-row:1/3}
  body.marche .ordi-fiche.v2>.mosaique.n4{grid-template-columns:2fr 1fr 1fr}
  body.marche .ordi-fiche.v2>.mosaique.n4>.ph4{grid-column:2/4}
  body.marche .ordi-fiche.v2>.mosaique.n3{grid-template-columns:2fr 1fr}
  body.marche .ordi-fiche.v2>.mosaique.n2{grid-template-columns:1fr 1fr;grid-template-rows:1fr}
  body.marche .ordi-fiche.v2>.mosaique.n2>.ph1{grid-row:auto}
  body.marche .ordi-fiche.v2>.mosaique.n1{grid-template-columns:1fr;grid-template-rows:1fr}
  body.marche .ordi-fiche.v2>.mosaique.n1>.ph1{grid-row:auto}
  .ordi-fiche.v2 .mosaique .toutes{position:absolute;right:16px;bottom:16px;height:40px;padding:0 16px;display:inline-flex;align-items:center;gap:8px;
        background:#fff;color:#16263F;border:1px solid #16263F;font-family:var(--titre);font-weight:600;font-size:14px;cursor:pointer}
  .ordi-fiche.v2 .mosaique .toutes .ic{width:18px;height:18px}
  /* la colonne gauche */
  body.marche .ordi-fiche.v2>.pcpal{display:block;grid-column:1;min-width:0;border:0}
  .ordi-fiche.v2 .pcpal>*+*{margin-top:8px}
  .ordi-fiche.v2 .pcpal .pose{background:none;border:0}
  .ordi-fiche.v2 .pcpal .section .t20,.ordi-fiche.v2 .pcpal .section .cap:first-child{font-family:var(--titre);font-weight:600;font-size:28px;line-height:1.1;letter-spacing:-.022em;text-transform:none;color:var(--encre)}
  .ordi-fiche.v2 .pcpal .section.serre .cap.gris{font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--brume)}
  .ordi-fiche.v2 .pcpal .section{padding-top:40px;padding-bottom:16px;border-top:1px solid var(--filet)}
  .ordi-fiche.v2 .pcpal>:first-child .section{border-top:0;padding-top:8px}
  .ordi-fiche.v2 .pcpal .c14.lisible{font-size:17px;line-height:1.55;max-width:64ch}
  .ordi-fiche.v2 .pcpal .faits{font-size:15px;line-height:24px;color:var(--ardoise);padding:0 var(--marge) 8px;max-width:64ch}
  /* les formules en cartes 2 x 2, blanc pose, sans bordure, le prix 24 px souligne en bas a droite */
  .ordi-fiche.v2 .pcpal .fc-cartes{display:grid;grid-template-columns:1fr 1fr;gap:12px;overflow:visible;padding:0 var(--marge);scroll-snap-type:none}
  .ordi-fiche.v2 .pcpal .fc-cartes>*{width:auto;flex:none;min-height:180px;padding:24px;border:0;background:var(--papier2);scroll-snap-align:none}
  .ordi-fiche.v2 .pcpal .fc-cartes .c.etat-info{background:var(--papier2);box-shadow:inset 4px 0 0 var(--tilleul);border-left:0;padding-left:24px}
  .ordi-fiche.v2 .pcpal .fc-cartes .c:hover{background:var(--papier3)}
  .ordi-fiche.v2 .pcpal .fc-cartes .n{font-size:17px;line-height:22px}
  .ordi-fiche.v2 .pcpal .fc-cartes .m{font-size:15px;line-height:21px;color:var(--ardoise)}
  .ordi-fiche.v2 .pcpal .fc-cartes .p{font-size:24px;line-height:28px;font-weight:700}
  .ordi-fiche.v2 .pcpal .fc-cartes .d{font-size:13px}
  .ordi-fiche.v2 .pcpal .fc-cartes .c>span:last-child{text-align:right}
  .ordi-fiche.v2 .pcpal .fc-cartes~.reperes{display:none}
  .ordi-fiche.v2 .pcpal .chiffres .grand{font-size:64px;line-height:1;letter-spacing:-.03em}
  .ordi-fiche.v2 .pcpal .glisse.galerie-fiche{display:none}
  .ordi-fiche.v2 .pcpal #galerie{display:none}
  /* la colonne de reservation collante */
  body.marche .ordi-fiche.v2>.reserve{display:flex;flex-direction:column;grid-column:2;grid-row:3;min-width:0;position:sticky;top:92px;
        background:var(--papier2);padding:24px;box-sizing:border-box;align-self:start;max-height:calc(100vh - 108px);overflow:auto;scrollbar-width:none}
  body.marche .ordi-fiche.v2>.reserve::-webkit-scrollbar{display:none}
  .ordi-fiche.v2 #pied-fiche-prix{display:block}
  .ordi-fiche.v2 .reserve .prix-tete .cap{color:var(--brume)}
  .ordi-fiche.v2 .reserve .prix-tete .v{font-family:var(--titre);font-weight:700;font-size:32px;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums;margin-top:8px}
  .ordi-fiche.v2 .reserve .prix-tete .v .souligne,.ordi-fiche.v2 .reserve .prix-tete .v button{font:inherit;color:inherit;background:none;border:0;padding:0;text-decoration:underline;text-underline-offset:5px;text-decoration-thickness:2px;cursor:pointer}
  .ordi-fiche.v2 .reserve .prix-tete .l{font-size:14px;line-height:20px;color:var(--ardoise);margin-top:8px}
  .ordi-fiche.v2 .reserve .prix-tete .rassure{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ardoise);margin-top:10px}
  .ordi-fiche.v2 .reserve .prix-tete .rassure .ic{color:var(--lien);width:16px;height:16px}
  .ordi-fiche.v2 .reserve #dispos{margin:16px -24px 0}
  /* le rail des jours reste une rangee qui glisse (la regle de 3.9 l'empilait dans l'ancien panneau) */
  body.marche .ordi-fiche.v2>.reserve .glisse{flex-direction:row;flex-wrap:nowrap;overflow-x:auto;gap:8px;scroll-snap-type:x proximity;cursor:grab}
  body.marche .ordi-fiche.v2>.reserve .glisse>*{width:auto;flex:0 0 auto}
  .ordi-fiche.v2 .reserve #dispos .section{padding-top:0;padding-bottom:6px}
  .ordi-fiche.v2 .reserve #dispos .section .t20{font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;color:var(--brume)}
  .ordi-fiche.v2 .reserve #dispos .section .lien{display:none}
  .ordi-fiche.v2 .reserve #dispos .c12.px:first-child{display:none}
  .ordi-fiche.v2 .reserve .creneaux{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:0 var(--marge)}
  .ordi-fiche.v2 .reserve .creneaux .cren{width:auto}
  .ordi-fiche.v2 .reserve .barre-bas{position:static;transform:none;left:auto;width:auto;max-width:none;padding:0;border:0;background:none;box-shadow:none;z-index:auto;display:block}
  .ordi-fiche.v2 .reserve .barre-bas .etat-gauche,.ordi-fiche.v2 .reserve .barre-bas .rassure{display:none}
  .ordi-fiche.v2 .reserve .barre-bas .bas{padding:0;display:block;margin-top:8px}
  .ordi-fiche.v2 .reserve .barre-bas .action{width:100%;height:48px;font-size:16px}
  .ordi-fiche.v2 .reserve .liens-reserve{display:flex;flex-direction:column;margin-top:8px}
  .ordi-fiche.v2 .reserve .liens-reserve button{display:flex;align-items:center;justify-content:center;gap:8px;min-height:44px;background:none;border:0;padding:0;
        font-size:15px;font-weight:600;color:var(--encre);text-decoration:underline;text-underline-offset:3px;cursor:pointer}
  .ordi-fiche.v2 .reserve .liens-reserve button+button{border-top:1px solid var(--filet);margin-top:6px;padding-top:6px}
  .ordi-fiche.v2 .reserve .liens-reserve .ic{width:16px;height:16px;color:var(--ardoise)}
  /* la barre du haut de la fiche (retour, partage) n'existe pas sur le site : l'en-tete de site suffit */
  body.marche.fiche-coach .ordi-fiche.v2~*{grid-column:1/-1}
  body.marche.fiche-coach .corps.sous-barre{padding-bottom:0}
}

/* barre du haut d'un ecran de gestion : le bouton de menu a GAUCHE, le titre
   au centre, la cloche a droite. Les deux boutons font la meme largeur, le
   titre tombe donc bien au milieu. */
.tete.pro .titre{text-align:center}

/* --- 3.1 · BARRE DU HAUT COLLANTE (.tete) ------------------------------ */
/* 4 px de remplissage vertical, et non 7 : le bouton carre fait 44 px depuis le 14/09, et
   4 + 44 + 4 = 52, la hauteur de la barre (--h-tete) ne bouge pas. */
.tete{position:sticky;top:0;z-index:20;background:var(--papier);
      border-bottom:1px solid var(--filet);min-height:var(--h-tete);
      display:flex;align-items:center;gap:10px;padding:4px 12px;
      padding-top:calc(4px + env(safe-area-inset-top,0px))}
.tete .titre{flex:1;min-width:0;font-family:var(--titre);font-weight:600;
             font-size:17px;line-height:20px;letter-spacing:-.018em;
             overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tete .titre small{display:block;font-family:var(--texte);font-weight:500;
                   font-size:12px;line-height:15px;letter-spacing:0;color:var(--brume);margin-top:1px}
.tete .carre{border:0;width:44px;height:44px;margin:0 -9px}
.tete.nue{border-bottom:0}
.tete.sur-photo{position:absolute;left:0;right:0;top:0;background:none;border:0;color:var(--sur-photo);z-index:12}
.tete.sur-photo .carre{background:rgba(10,18,28,.34);border:1px solid rgba(255,255,255,.42);
                       -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:#fff;margin:0}
/* la barre du haut se teinte quand la page a defile : .tete.pose (pose par JS) */
.tete.pose{background:var(--papier)}
/* .tete est AUSSI le nom de l'en-tete interne de .demande et de .fiche. Sans cette
   remise a zero, ces deux blocs heritaient de la barre collante (fond, sticky, filet
   du bas, hauteur, remplissage) et s'affichaient en pave blanc colle au sommet.
   Les regles propres a chaque bloc, plus bas dans ce fichier, reposent ensuite leur
   propre remplissage. */
.demande .tete,.fiche .tete{position:static;z-index:auto;background:none;border-bottom:0;
                            min-height:0;padding:0}

/* --- 3.2 · BARRE D'ONGLETS DU BAS (.onglets) --------------------------- */
.onglets{position:fixed;left:calc(50% + var(--decalage)/2);transform:translateX(-50%);bottom:0;
         width:100%;max-width:var(--colonne);height:calc(var(--h-onglets) + var(--bas));
         padding-bottom:var(--bas);background:var(--papier);
         border-top:1px solid var(--filet);display:flex;align-items:stretch;z-index:24}
.onglets a{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
           gap:5px;color:var(--brume);position:relative;min-width:0}
/* L'onglet actif : le vert en texte (vert profond le jour, tilleul clair la nuit) et le trait tilleul
   (charte docs/31, 21/09). Il etait marine + trait marine. */
.onglets a.on{color:var(--lien)}
.onglets a.on::before{content:"";position:absolute;top:0;left:22px;right:22px;height:2px;background:var(--tilleul)}
/* LE TOAST MONTE AU-DESSUS DE LA BARRE (13/09). Mesure : le bac des toasts est pose
   a --bas + 16 px, la barre d'onglets a 0 : le toast (43 px) couvrait « Chercher /
   Carnet / Amis » pendant 3,2 s. Convention iOS et Material : la notification passe
   AU-DESSUS du mobilier fixe. Quand une barre d'onglets est visible (pas cachee par
   la page), le bac se pose 12 px au-dessus d'elle ; meme chose au-dessus d'une barre
   d'action fixe (112 px au plus, celle qui porte une ligne .rassure). Une barre
   d'action DANS une feuille est dans le flux : elle ne compte pas. Sur un ordinateur
   (body.marche des 1000 px, 3.6), la barre d'onglets est montee en haut : le bac
   reprend sa place du bas. */
body:has(.onglets:not([style*="none"])) .toasts{
  bottom:calc(var(--h-onglets) + var(--bas) + 12px)}
body:has(.barre-bas:not(.feuille .barre-bas)) .toasts{
  bottom:calc(112px + var(--bas) + 12px)}
@media(min-width:1000px){
  body.marche:not(:has(.barre-bas:not(.feuille .barre-bas))) .toasts{bottom:calc(var(--bas) + 16px)}
}
.onglets .lab{font-family:var(--titre);font-weight:600;font-size:11px;
              letter-spacing:.04em;text-transform:uppercase}
/* six onglets : l'espace du COACH en porte six (journee, agenda, argent, clients,
   chiffres, toi). La cellule passe de 97 a 65 px : le libelle se resserre, le trait
   de l'onglet actif se raccourcit, et la pastille de compte revient sur le coin de
   l'icone au lieu de flotter au milieu. L'application du CLIENT en garde quatre. */
.onglets.six .lab{font-size:11px;letter-spacing:0}
.onglets.six a.on::before{left:13px;right:13px}
.onglets.six .pastilleN{right:12px}
/* --- 3.2 bis · LA BARRE DU BAS DU COACH (.onglets.pro) (19 septembre 2026) ------
   Decision de Nils : le coach GARDE son tiroir ET recoit cinq entrees en bas, « comme
   Uber Driver » : Aujourd'hui, Agenda, Clients, Argent, Menu (LISEZ-MOI § 4.3). Elle se
   nomme .pro, comme la barre du haut .tete.pro : « .coach » est deja la carte de coach
   (6.2), et la barre en heritait un display:block. La cinquieme entree est un BOUTON : elle ouvre le tiroir, elle ne mene nulle part ; elle prend
   exactement la mise en forme d'un onglet, et s'allume (aria-expanded) tant que le
   tiroir est sorti. Cinq cellules de 78 px a 390 : le libelle passe en bas de casse a
   12 px (voir la mesure plus bas), la pastille revient au coin de l'icone, le trait de
   l'onglet actif se raccourcit. La pastille cachee ([hidden])
   l'est vraiment : display:grid l'emportait sur l'attribut.
   AU-DELA DE 1000 px LA BARRE DISPARAIT : le tiroir est ouvert en colonne (3.4) et
   porte les memes entrees ; le bas de l'ecran redevient libre, donc le corps, le bouton
   volant et les toasts reprennent les mesures d'un ecran SANS barre (la barre est
   toujours dans le DOM : les regles :has(.onglets) la voient, on les contredit ici). */
.onglets.pro button{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
                      gap:5px;color:var(--brume);position:relative;min-width:0;text-align:center;
                      -webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
.onglets.pro button[aria-expanded="true"]{color:var(--encre)}
.onglets.pro button:active{opacity:.62;transition:opacity var(--duree-courte) var(--courbe)}
/* Le libelle : 12 px, bas de casse, sans interlettrage. Mesure a 390 : « AUJOURD'HUI » en
   capitales de 11 px fait 76 px dans une cellule de 78, « Aujourd'hui » en 12 px en fait 64.
   C'est aussi la casse d'Uber Driver, et la regle des 12 px au moins. */
.onglets.pro .lab{font-size:12px;letter-spacing:0;text-transform:none}
.onglets.pro a.on::before{left:14px;right:14px}
.onglets.pro .pastilleN{right:12px}
.onglets .pastilleN[hidden]{display:none}
@media(min-width:1000px){
  body.gestion .onglets.pro{display:none}
  body.gestion .corps.sous-onglets{padding-bottom:calc(var(--bas) + 18px + var(--h-pose))}
  body.gestion .corps.sous-onglets.sous-volant{padding-bottom:calc(84px + var(--bas) + var(--h-pose))}
  body.gestion .volant{bottom:calc(var(--bas) + 20px)}
  body.gestion:not(:has(.barre-bas:not(.feuille .barre-bas))) .toasts{bottom:calc(var(--bas) + 16px)}
}
/* LA PASTILLE DE COMPTE N'EST JAMAIS AZUR (19/09, LISEZ-MOI § 6.5 bis). L'azur dit l'action,
   et rien d'autre (regle 1) : un compteur qui le portait passait pour un bouton et faisait un
   second aplat sur l'ecran. Un compte NEUTRE (des seances a venir, des lignes) est marine plein,
   texte blanc (--contre / --contre-txt : le meme marine que le toast et les blocs de chiffres,
   qui reste marine la nuit) ; un compte a TRAITER ou un DU (demandes a repondre, seances a
   encaisser, notifications, ce qui attend le coach) porte `.du` : corail plein, texte blanc
   (--corail-plein, 4,8 contre 1). La barre du bas, la cloche et le tiroir suivent la meme regle. */
.pastilleN{position:absolute;top:8px;right:26px;min-width:18px;height:18px;padding:0 5px;
           background:var(--contre);color:var(--contre-txt);font-family:var(--titre);font-weight:700;
           font-size:12px;display:grid;place-items:center;border-radius:var(--rayon-doigt)}
.pastilleN.du{background:var(--corail-plein);color:#FFFFFF}
/* La meme pastille sur un bouton carre (la cloche de la barre du haut) : elle se
   pose au coin, et non a la position calculee pour une case d'onglet. */
.carre .pastilleN{top:-3px;right:-3px}

/* ═══════════════ 4 · PRIMITIVES ═══════════════ */
.px{padding-left:var(--marge);padding-right:var(--marge)}
.filet{height:1px;background:var(--filet);border:0}
.filet.doux{background:var(--filet2)}
.filet.marge{margin:0 var(--marge)}
/* 11 px, jamais moins : RIEN de visible ne descend sous 11 px dans le systeme (regle du
   12/09, verif : les capitales de 9 et 10 px passaient sous le seuil de lecture) ; les
   LEGENDES (petite capitale .cap, pastille .etat) sont a 12 px, partout. */
.cap{font-family:var(--titre);font-weight:600;font-size:12px;line-height:15px;
     letter-spacing:.12em;text-transform:uppercase;color:var(--brume)}
.cap.encre{color:var(--encre)}
/* Une petite capitale QUI PORTE UNE DATE ne se met pas en capitales : un mois
   s'ecrit « mercredi 9 septembre », jamais « MERCREDI 9 SEPTEMBRE ». La classe
   garde la graisse, la taille et la couleur de la petite capitale, et n'annule
   que la transformation de casse et l'interlettrage qui l'accompagnait. */
/* La specificite doit BATTRE celle des selecteurs descendants qui posent la
   capitale (`.cartouche .g`, `.section .cap` …) : a specificite egale, c'est
   l'ordre du fichier qui tranchait, et « AUJOURD'HUI · MERCREDI 9 SEPTEMBRE »
   restait en capitales. On nomme donc les parents concernes. */
.cap.date,.g.date,.lab.date,
.cartouche .g.date,.cartouche .d.date,
.section .cap.date,.section.serre .cap.date,
.chiffres .cap.date,.bord .cap.date{text-transform:none;letter-spacing:.02em}
.t32{font-family:var(--titre);font-weight:700;font-size:32px;line-height:34px;letter-spacing:-.032em}
.t26{font-family:var(--titre);font-weight:600;font-size:26px;line-height:28px;letter-spacing:-.028em}
.t20{font-family:var(--titre);font-weight:600;font-size:20px;line-height:22px;letter-spacing:-.022em}
.t17{font-family:var(--titre);font-weight:600;font-size:17px;line-height:20px;letter-spacing:-.018em}
.c14{font-size:14px;line-height:18px}
.c13{font-size:13px;line-height:17px;color:var(--ardoise)}
.c12{font-size:12px;line-height:16px;color:var(--brume)}
.gris{color:var(--brume)} .ard{color:var(--ardoise)} .fort{font-weight:600}
.tronq{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.deux-lignes{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.souligne{font-weight:700;text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}
.chiffre{font-family:var(--titre);font-weight:600;font-variant-numeric:tabular-nums}

.section{display:flex;align-items:baseline;justify-content:space-between;gap:12px;
         padding:20px var(--marge) 14px}
.section.serre{padding-top:14px;padding-bottom:10px}
.cartouche{display:flex;align-items:baseline;justify-content:space-between;gap:12px;
           padding:9px var(--marge) 10px}
.cartouche .g{display:block;font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.12em;
              text-transform:uppercase;color:var(--brume);overflow:hidden;
              text-overflow:ellipsis;white-space:nowrap;min-width:0}
.cartouche .d{font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.02em;
              color:var(--encre);flex:0 0 auto;display:flex;align-items:center;gap:5px}
/* [charte docs/31 § 4, retouche 1 ; controle 21/09] la pastille du cartouche des dates (« Tous les jours ») se dit en
   CONTOUR quand elle est choisie : le jour choisi (.j.on) garde l'aplat marine, et le seul aplat plein de la
   fenetre reste le vert profond. Un filet encre, le texte encre, pas d'aplat. */
.cartouche .d .pastille.on{background:transparent;border-color:var(--encre);color:var(--encre);box-shadow:inset 0 0 0 1px var(--encre)}

/* --- 4.1 · LE RYTHME DES FONDS ----------------------------------------
   Reponse au « trop blanc » : une section sur deux est POSEE (papier2),
   cernee de deux filets. Jamais deux posees a la suite. */
.pose{background:var(--papier2);border-top:1px solid var(--filet2);
      border-bottom:1px solid var(--filet2);padding-bottom:4px}
/* la grande surface a contre-jour : marine en jour, surface haute en nuit.
   Jamais l'inverse pur, un aplat blanc dans une application sombre eblouit. */
/* Sur le marine, LES JETONS de texte secondaire changent : ardoise et brume deviennent du
   blanc voile (84 % et 72 %, soit 11 et 7 contre 1 sur l'encre). La brume de la palette
   tombait a 3,1 contre 1 la ou une vue l'ecrivait sur ce bloc (verif du 12/09). */
.encre-pose{background:var(--contre);color:var(--contre-txt);padding-bottom:6px;
            --ardoise:rgba(255,255,255,.84);--brume:rgba(255,255,255,.72);--brume2:rgba(255,255,255,.4)}
.encre-pose .cap,.encre-pose .gris,.encre-pose .c12{color:rgba(255,255,255,.62)}
.encre-pose .c13{color:rgba(255,255,255,.78)}

/* --- 4.2 · PHOTOGRAPHIE ------------------------------------------------ */
.ph{position:relative;overflow:hidden;background:var(--papier3)}
.ph img{width:100%;height:100%;object-fit:cover}
.ph .voile{position:absolute;inset:0;
           background:linear-gradient(180deg,rgba(8,16,26,0) 34%,var(--voile) 100%)}
.ph .voile.haut{background:linear-gradient(180deg,rgba(8,16,26,.42) 0,rgba(8,16,26,0) 26%,
                rgba(8,16,26,0) 42%,var(--voile) 100%)}
.sur-ph{position:absolute;color:#fff;left:var(--marge);right:var(--marge);bottom:14px}
/* Sur une photographie, la brume tombe a 2 contre 1 : le libelle en capitales
   et le texte secondaire reprennent du blanc voile, comme dans .encre-pose. */
.sur-ph .cap,.tete.sur-photo .titre small{color:rgba(255,255,255,.74)}
.sur-ph .c12,.sur-ph .c13{color:rgba(255,255,255,.82)}
.etiq{position:absolute;top:0;left:0;background:#fff;color:#000;font-family:var(--titre);
      font-weight:600;font-size:12px;letter-spacing:.1em;text-transform:uppercase;padding:6px 9px}
.carre-act{width:44px;height:44px;display:grid;place-items:center;color:#fff;
           background:rgba(10,18,28,.34);border:1px solid rgba(255,255,255,.42);
           -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
/* la photographie d'OUVERTURE : celle qui tient le haut d'un ecran public,
   sous une .tete.sur-photo. Une seule par ecran. */
.ph.ouverture{height:286px}
/* la barre de recherche chevauche la photo de 30 px : le texte pose dessus
   lui laisse la place, sinon sa derniere ligne passe sous la barre. */
.ph.ouverture .sur-ph{bottom:48px}
/* la bande : la respiration photographique entre deux sections */
/* `display:block` EST OBLIGATOIRE ICI. La bande est tantot un <div>, tantot un
   <a> (« Ta page publique travaille pour toi » mene a la vitrine) — et `height`
   ne s'applique pas a une boite EN LIGNE : l'ancre s'etirait alors a la hauteur
   naturelle de la photo, 680 px sur un ordinateur au lieu de 168. Meme piege que
   l'ellipse posee sur un <span> (§ 6.7). */
.bande{display:block;position:relative;height:168px;overflow:hidden;background:var(--papier3)}
.bande img{width:100%;height:100%;object-fit:cover}
.bande .voile{position:absolute;inset:0;
              background:linear-gradient(180deg,rgba(8,16,26,.10) 30%,var(--voile) 100%)}
.bande .mot{position:absolute;left:var(--marge);right:var(--marge);bottom:14px;color:#fff}
.bande .mot h2{font-family:var(--titre);font-weight:700;font-size:22px;line-height:24px;letter-spacing:-.026em}
.bande .mot p{font-size:13px;line-height:17px;color:rgba(255,255,255,.82);margin-top:5px}

/* --- 4.3 · VISAGES ----------------------------------------------------- */
.face{border-radius:var(--rayon-doigt);object-fit:cover;flex:0 0 auto;background:var(--papier3)}
/* LE MONOGRAMME — le repli quand il n'y a pas de photographie, et c'est le cas de
   TOUTES les fiches clientes : la table `customers` ne porte pas de photo, et le
   portrait d'un athlete appartient a l'athlete. Les silhouettes tirees au sort
   revenaient a l'identique de ligne en ligne (quatre fois le meme visage sur les
   quatre cartes de « Demandes ») ; les initiales, elles, sont differentes a chaque
   ligne. Rond comme .face, aplat de --papier2, un seul trait, aucune ombre.
   `display:grid` + `place-items:center` sont poses ICI et pas dans un style en
   ligne : c'est la place des initiales, pas une decision de vue. */
.face.mono{background:var(--papier2);border:1px solid var(--filet);
  border-radius:var(--rayon-doigt);font-family:var(--titre);font-weight:600;
  color:var(--ardoise);letter-spacing:.02em;display:grid;place-items:center;
  line-height:1;overflow:hidden}
.pile{display:flex;align-items:center;flex:0 0 auto}
.pile img{border:2px solid var(--papier);border-radius:var(--rayon-doigt)}
.pile img+img{margin-left:-8px}

/* --- 4.4 · ICONES LUCIDE ----------------------------------------------- */
.ic{width:18px;height:18px;flex:0 0 auto;stroke:currentColor;fill:none;stroke-width:1.7;
    stroke-linecap:round;stroke-linejoin:round}
.ic.xs{width:14px;height:14px} .ic.s{width:16px;height:16px}
.ic.l{width:22px;height:22px} .ic.xl{width:26px;height:26px}
.ic.plein{fill:currentColor;stroke:none}
.ic.droite{transform:rotate(-90deg)} .ic.haut{transform:rotate(180deg)}

/* --- 4.4 bis · LE MONOGRAMME (.monogramme) -------------------------------
   Le C du logo (20/09/2026), en masque CSS : blanc sur une barre marine ou sur la
   photographie (il prend la couleur du texte), vert profond sur fond clair (.vert).
   24 a 28 px dans une barre du haut, a cote du nom en texte quand il y est. Le
   logotype bitmap n'entre pas dans l'application. */
/* @@MONOGRAMME:debut */
/* Ecrit par scripts/icones.mjs depuis marque/monogramme.svg (le C du logo du 20/09/2026) : ne pas
   retoucher a la main. La couleur est celle du texte (color), la taille celle de width/height. */
.monogramme{display:inline-block;width:26px;height:26px;flex:0 0 auto;vertical-align:middle;background:currentColor;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='207 209 601 604'%3E%3Cpath d='M221.73 490.70 C232.52 479.59 241.45 466.88 252.48 455.87 C287.22 421.16 330.51 395.31 375.75 376.67 C387.11 371.99 399.36 369.51 411.09 366.02 C481.22 345.19 560.26 331.02 600.12 261.89 C608.19 247.89 617.30 231.25 619.72 215.20 C591.17 205.55 559.66 209.16 530.45 213.31 C424.60 228.36 339.30 302.45 278.92 386.75 C260.94 411.85 225.69 460.27 221.73 490.70 Z M572.56 342.41 C614.19 351.61 644.10 356.35 678.81 384.84 C691.74 395.45 700.34 409.38 711.88 421.16 C735.37 409.12 766.21 377.26 786.32 358.66 C793.14 352.36 807.63 342.50 808.51 332.46 C809.43 321.81 789.46 302.20 782.31 294.90 C754.70 266.70 702.25 231.76 662.44 226.38 C656.63 233.97 654.05 242.43 649.80 250.90 C643.83 262.77 636.82 274.00 628.89 284.66 C619.39 297.44 608.96 309.64 597.20 320.39 C589.04 327.85 579.91 334.14 572.56 342.41 Z M209.53 738.61 C216.15 724.81 215.74 707.76 219.83 693.01 C227.86 663.98 255.75 610.06 280.67 593.43 C287.16 603.40 287.51 615.82 291.29 627.04 C296.38 642.20 304.08 657.16 312.00 671.02 C344.65 728.15 410.70 779.00 473.91 796.92 C481.39 799.04 488.08 801.71 495.84 802.54 C502.38 794.07 506.84 784.52 512.48 775.46 C520.07 763.26 529.11 751.56 538.73 740.91 C575.80 699.87 637.36 664.13 690.65 649.26 C714.45 642.62 740.69 649.25 764.42 643.97 C754.70 635.49 742.35 631.18 731.49 624.33 C722.38 618.59 714.65 611.14 705.58 605.38 C697.78 613.26 692.73 623.19 684.64 630.88 C655.47 658.59 609.93 677.54 569.72 678.71 C546.30 679.40 522.16 671.28 501.40 661.18 C427.07 625.03 386.06 551.99 407.86 470.77 C414.32 446.68 427.91 424.20 446.43 407.54 C453.17 401.48 460.88 396.98 466.96 390.26 C444.91 388.74 399.24 415.60 378.90 426.39 C292.26 472.34 228.60 559.34 212.52 656.10 C208.54 680.01 202.99 715.14 209.53 738.61 Z M531.51 811.99 C548.07 817.76 567.46 810.71 584.64 810.54 C651.34 809.89 709.73 784.38 761.33 743.13 C779.67 728.46 797.54 712.75 809.53 692.24 C793.68 678.92 756.24 682.39 736.20 683.42 C670.14 686.80 614.61 710.78 568.32 758.98 C554.26 773.62 535.11 791.29 531.51 811.99 Z'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='207 209 601 604'%3E%3Cpath d='M221.73 490.70 C232.52 479.59 241.45 466.88 252.48 455.87 C287.22 421.16 330.51 395.31 375.75 376.67 C387.11 371.99 399.36 369.51 411.09 366.02 C481.22 345.19 560.26 331.02 600.12 261.89 C608.19 247.89 617.30 231.25 619.72 215.20 C591.17 205.55 559.66 209.16 530.45 213.31 C424.60 228.36 339.30 302.45 278.92 386.75 C260.94 411.85 225.69 460.27 221.73 490.70 Z M572.56 342.41 C614.19 351.61 644.10 356.35 678.81 384.84 C691.74 395.45 700.34 409.38 711.88 421.16 C735.37 409.12 766.21 377.26 786.32 358.66 C793.14 352.36 807.63 342.50 808.51 332.46 C809.43 321.81 789.46 302.20 782.31 294.90 C754.70 266.70 702.25 231.76 662.44 226.38 C656.63 233.97 654.05 242.43 649.80 250.90 C643.83 262.77 636.82 274.00 628.89 284.66 C619.39 297.44 608.96 309.64 597.20 320.39 C589.04 327.85 579.91 334.14 572.56 342.41 Z M209.53 738.61 C216.15 724.81 215.74 707.76 219.83 693.01 C227.86 663.98 255.75 610.06 280.67 593.43 C287.16 603.40 287.51 615.82 291.29 627.04 C296.38 642.20 304.08 657.16 312.00 671.02 C344.65 728.15 410.70 779.00 473.91 796.92 C481.39 799.04 488.08 801.71 495.84 802.54 C502.38 794.07 506.84 784.52 512.48 775.46 C520.07 763.26 529.11 751.56 538.73 740.91 C575.80 699.87 637.36 664.13 690.65 649.26 C714.45 642.62 740.69 649.25 764.42 643.97 C754.70 635.49 742.35 631.18 731.49 624.33 C722.38 618.59 714.65 611.14 705.58 605.38 C697.78 613.26 692.73 623.19 684.64 630.88 C655.47 658.59 609.93 677.54 569.72 678.71 C546.30 679.40 522.16 671.28 501.40 661.18 C427.07 625.03 386.06 551.99 407.86 470.77 C414.32 446.68 427.91 424.20 446.43 407.54 C453.17 401.48 460.88 396.98 466.96 390.26 C444.91 388.74 399.24 415.60 378.90 426.39 C292.26 472.34 228.60 559.34 212.52 656.10 C208.54 680.01 202.99 715.14 209.53 738.61 Z M531.51 811.99 C548.07 817.76 567.46 810.71 584.64 810.54 C651.34 809.89 709.73 784.38 761.33 743.13 C779.67 728.46 797.54 712.75 809.53 692.24 C793.68 678.92 756.24 682.39 736.20 683.42 C670.14 686.80 614.61 710.78 568.32 758.98 C554.26 773.62 535.11 791.29 531.51 811.99 Z'/%3E%3C/svg%3E") center/contain no-repeat}
.monogramme.vert{color:#1F6633}
/* La nuit, la regle « blanc sur sombre » l'emporte : le vert profond #1F6633 sur la barre
   #0C1520 ne tient qu'a 2,6 contre 1 (le blanc y tient a 18,4). Les trois etats du theme
   d'athlon.css (choix explicite ou reglage du systeme) sont couverts. */
:root[data-theme="dark"] .monogramme.vert{color:#fff}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .monogramme.vert{color:#fff}}
/* @@MONOGRAMME:fin */

/* --- 4.5 · BOUTONS ----------------------------------------------------- */
.action{height:var(--h-action);display:inline-flex;align-items:center;justify-content:center;gap:8px;
        background:var(--action);color:var(--action-fg);font-family:var(--titre);font-weight:600;
        font-size:15px;letter-spacing:-.01em;padding:0 22px}
/* l'appui : le vert profond s'assombrit d'un cran (#1C5C2E, 8,02 contre 1 sous le blanc) */
.action:active:not([disabled]){background:var(--action-appui)}
.action.pleine{width:100%}
.action[disabled],.action[aria-disabled="true"]{background:var(--papier2);color:var(--brume);cursor:default}
.second{height:var(--h-second);display:inline-flex;align-items:center;justify-content:center;gap:7px;
        background:var(--papier2);color:var(--encre);font-family:var(--titre);font-weight:600;
        font-size:13px;padding:0 16px}
.second.trait{background:none;border:1px solid var(--filet)}
.second.pleine{width:100%}
 /* 44 x 44, et non plus 38 (14/09) : c'est la plus petite cible qu'un pouce touche a coup sur
   (Apple : 44 pt). Les fleches de mois et de semaine, la cloche, la croix d'une feuille,
   le bouton de menu sont des .carre : ils y gagnent tous d'un coup. */
.carre{position:relative;width:44px;height:44px;border:1px solid var(--filet);display:grid;place-items:center;
       color:var(--encre);flex:0 0 auto;background:var(--papier)}
.carre.nu{border:0}
/* Une vue qui retrecit le DESSIN d'un .carre (les fleches de semaine a 30 x 30 dans la
   journee) garde tout de meme 44 x 44 sous le pouce : la zone de toucher deborde par un
   ::after invisible, centre, et le dessin ne bouge pas. */
.carre::after{content:"";position:absolute;top:50%;left:50%;width:max(100%,44px);height:max(100%,44px);
              transform:translate(-50%,-50%)}
/* la fleche qui n'a plus rien devant elle (le mois courant, la semaine d'aujourd'hui) : brume */
.carre[disabled]{color:var(--brume);cursor:default}
/* LE LIEN TEXTE D'ACTION (« Trier », « Voir l'argent », « Ouvrir la fiche ») : 13 px de
   haut ne se touchent pas. Le texte ne grossit pas et la ligne autour ne bouge pas d'un
   pixel : sa ZONE DE TOUCHE est un ::before invisible de 44 px de haut, centre sur lui,
   au moins aussi large que lui. Meme chose pour le prix souligne quand il est un lien ou
   un bouton (regle 8 : le prix souligne EST le bouton). Un ::before absolu n'entre pas
   dans la boite flexible : l'icone et le texte ne bougent pas. */
.lien{font-size:13px;font-weight:600;color:var(--encre);display:inline-flex;align-items:center;gap:5px;
      position:relative}
.lien::before,button.souligne::before,a.souligne::before{content:"";position:absolute;top:50%;left:50%;
  width:calc(100% + 8px);min-width:44px;height:44px;transform:translate(-50%,-50%)}
button.souligne,a.souligne{position:relative}
/* La meme zone invisible pour ce qui se dessine a 40 px de haut ou moins et se touche :
   la pastille de filtre (40), le bouton secondaire (40), la case a cocher (22), la bascule
   Jour / Nuit (36), le bouton d'action quand une vue le raccourcit (42 dans .demande).
   Le dessin ne change pas ; le pouce, lui, ne rate plus. */
.pastille,.second,.action,.case,.bascule-theme button,.bascule-fil button,.defi-audience button{position:relative}
.pastille::before,.second::before,.action::before,.case::before,.bascule-theme button::before,.bascule-fil button::before,.defi-audience button::before{content:"";
  position:absolute;top:50%;left:50%;width:max(100%,44px);height:max(100%,44px);transform:translate(-50%,-50%)}
.pastille{height:var(--h-second);display:inline-flex;align-items:center;gap:6px;padding:0 14px;
          border:1px solid var(--filet);border-radius:var(--rayon-doigt);font-size:13px;font-weight:600;
          color:var(--encre);white-space:nowrap;flex:0 0 auto;background:var(--papier)}
.pastille.on{background:var(--encre);border-color:var(--encre);color:var(--papier)}
.pastille.basse{height:34px;font-size:12px}
.rail{display:flex;gap:8px;overflow-x:auto;padding:0 var(--marge);scrollbar-width:none;
      -webkit-overflow-scrolling:touch}
.rail::-webkit-scrollbar{display:none}

/* LE BOUTON PRESSE S'ENFONCE (12/09). Deux pour cent, pas plus, le temps court, et
   il remonte au ressort : c'est ce que fait un bouton natif sous le doigt. La
   regle vaut pour tout ce qui se presse dans le systeme ; .dessus n'en fait pas
   partie (sa transformation est celle du geste). */
.action,.second,.carre,.pastille,.rapide,.racc,.atraiter,.bandeau,.volant,.cren,.case{
  transition:transform var(--duree-courte) var(--ressort),background-color var(--duree-courte) var(--courbe)}
.action:active,.second:active,.carre:active,.pastille:active,.rapide:active,.racc:active,
.atraiter:active,.bandeau:active,.volant:active,.cren:active,.case:active{transform:scale(.98)}
/* LE RETOUR HAPTIQUE VISIBLE : au franchissement d'un seuil, l'element fait un
   a-coup de 2 % pendant 80 ms (Athlon.haptique(el) pose la classe et, quand le
   telephone sait vibrer, vibre 10 ms). */
.a-coup{animation:athlon-acoup var(--duree-acoup) var(--courbe)}
@keyframes athlon-acoup{50%{transform:scale(1.02)}}
/* CE QUI SE TOUCHE SANS ETRE UN BOUTON DESSINE (14/09) : un lien texte, une ligne de client,
   une entree du tiroir, un onglet, une carte de coach. Safari ne peint plus son voile gris
   (html, section 2) : l'etat presse est le notre, une baisse d'opacite, courte, qui remonte
   au relachement. Jamais sur une ligne qui se tire ou se glisse : son mouvement suffit. */
.lien:active,.souligne:active,.onglets a:active,.item:active,.tiroir a:active,
a.client-l:active,button.client-l:active,a.ligne:active,button.ligne:active,
a.coach:active,a.dest:active,.mois .grille button:not([disabled]):active{opacity:.62;
  transition:opacity var(--duree-courte) var(--courbe)}

/* --- 4.6 · LIGNE GENERIQUE --------------------------------------------- */
.ligne{display:flex;align-items:center;justify-content:space-between;gap:12px;
       padding:13px var(--marge);width:100%}
.ligne+.ligne{border-top:1px solid var(--filet2)}
.ligne .co{min-width:0;flex:1}
/* La rangee « Activer les notifications » (Athlon.notifications.rangee, 19/09) : l'interrupteur ou la pastille a droite, jamais coupes. */
.notifs-rangee .k{flex:0 0 auto;display:flex;align-items:center}
.notifs-rangee .etat{white-space:nowrap}

/* ═══════════════ 5 · CHAMPS DE FORMULAIRE (16 px minimum) ═══════════════
   Sous 16 px, iOS zoome a l'arrivee dans le champ et ne dezoome jamais. */
.champ{width:100%;font-size:16px;line-height:20px;padding:12px 0;color:var(--encre);background:none}
.champ::placeholder{color:var(--brume)}
.champ.encadre{height:var(--h-champ);padding:0 14px;border:1px solid var(--filet);background:var(--papier)}
.zone{width:100%;font-size:16px;line-height:22px;min-height:88px;padding:12px 14px;
      border:1px solid var(--filet);background:var(--papier);resize:none;color:var(--encre)}
.zone::placeholder{color:var(--brume)}
/* le champ complet : libelle en capitales, champ, aide ou erreur dessous */
.champ-l{padding:12px var(--marge) 14px;display:block}
/* un champ que l'ecran n'a pas a poser (la date de naissance deja connue) : [hidden] doit gagner sur display:block */
.champ-l[hidden]{display:none}
.champ-l>.cap{display:block;margin-bottom:7px}
.champ-l .aide{font-size:12px;line-height:16px;color:var(--brume);margin-top:7px}
.champ-l.faux .champ.encadre,.champ-l.faux .zone{border-color:var(--corail)}
.champ-l .dit{display:none;font-size:12px;line-height:16px;color:var(--ardoise);margin-top:7px;
              padding-left:14px;position:relative}
.champ-l .dit::before{content:"";position:absolute;left:0;top:5px;width:6px;height:6px;
                      border-radius:var(--rayon-doigt);background:var(--corail)}
.champ-l.faux .dit{display:block}
.champ-l.faux .aide{display:none}
select.champ.encadre{-webkit-appearance:none;appearance:none;
  background-image:linear-gradient(45deg,transparent 49%,currentColor 50%),
                   linear-gradient(-45deg,transparent 49%,currentColor 50%);
  background-position:calc(100% - 20px) 26px,calc(100% - 14px) 26px;
  background-size:6px 6px,6px 6px;background-repeat:no-repeat}
.case{width:22px;height:22px;border:1.5px solid var(--filet);display:grid;place-items:center;
      flex:0 0 auto;color:transparent;background:var(--papier)}
.case.on{background:var(--encre);border-color:var(--encre);color:var(--papier)}
/* L'INTERRUPTEUR AUX MESURES D'iOS (14/09) : 51 x 31, curseur de 27, et non plus 40 x 24.
   La zone de toucher monte a 44 px de haut par un ::before invisible. Le curseur s'etire
   sous le doigt (33 px) comme un interrupteur natif ; le fond passe au vert sur
   --duree-courte. Rond : c'est l'une des exceptions de la regle 6. */
.inter{width:51px;height:31px;background:var(--filet);border-radius:var(--rayon-doigt);
       position:relative;flex:0 0 auto;display:inline-block;
       transition:background-color var(--duree-courte) var(--courbe)}
.inter::before{content:"";position:absolute;top:50%;left:50%;width:100%;min-width:44px;height:44px;
               transform:translate(-50%,-50%)}
.inter::after{content:"";position:absolute;top:2px;left:2px;width:27px;height:27px;
              border-radius:var(--rayon-doigt);background:var(--papier);border:1px solid var(--filet);
              box-shadow:0 1px 2px rgba(8,16,26,.18);
              transition:left var(--duree-courte) var(--ressort),width var(--duree-courte) var(--courbe)}
.inter.on{background:var(--vert)}
.inter.on::after{left:22px}
.inter:active::after{width:33px}
.inter.on:active::after{left:16px}

/* ═══════════════ 6 · COMPOSANTS PARTAGES ═══════════════ */

/* --- 6.1 · BARRE DE RECHERCHE A TROIS SEGMENTS (.rech) ----------------- */
.rech{display:flex;align-items:stretch;background:var(--papier);border:1px solid var(--filet);height:60px}
.rech .seg{flex:1;min-width:0;padding:10px;display:flex;flex-direction:column;justify-content:center;gap:2px}
.rech .seg+.seg{border-left:1px solid var(--filet)}
.rech .seg .l{font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.08em;
              text-transform:uppercase;color:var(--brume)}
.rech .seg .v{font-size:16px;line-height:20px;font-weight:600;color:var(--encre);width:100%;
              display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:none}
.rech .seg .v::placeholder{color:var(--brume);font-weight:500}
.rech .go{width:52px;flex:0 0 auto;background:var(--azur);color:var(--azur-fg);display:grid;place-items:center}
.rech.sur-photo{margin-top:-30px;position:relative;z-index:3}
.rech-marge{padding:0 var(--marge)}
/* les trois segments ne pesent pas pareil : le lieu et la date ont besoin de
   plus de place que le sport. Ratios repris de la maquette validee. */
.rech .seg.serre{flex:.62}
.rech .seg.large{flex:1.55}
/* un segment peut etre une LISTE : c'est la seule facon que la recherche
   marche sans JavaScript et qu'elle envoie un slug, jamais du texte libre. */
.rech .seg select.v,.rech .seg input.v{-webkit-appearance:none;appearance:none;border:0;padding:0}
.rech .seg select.v{cursor:pointer}
/* LA LISTE FAIT 44 PX DE HAUT SOUS LE POUCE (19/09, regle 15). Un <select> n'a pas de
   pseudo-element : sa boite grandit pour de vrai. 20 px de texte + 22 de marge interieure en
   haut + 2 en bas = 44 ; les marges negatives rendent la place prise, si bien que le libelle
   (« SPORT ») et la valeur restent exactement ou ils etaient : la liste couvre le libelle,
   transparente, et c'est tout le segment qui repond au doigt, meme sans JavaScript. */
.rech .seg select.v{box-sizing:border-box;height:44px;padding:22px 0 2px;margin:-22px 0 -2px;position:relative;z-index:1}

/* --- 6.2 · CARTE DE COACH (.coach) -------------------------------------
   Ni fond, ni bordure, ni ombre : la photographie pleine largeur EST la carte. */
.coach{display:block;padding-bottom:16px;width:100%}
.coach .ph{height:186px}
/* la photographie de la carte est un lien vers la fiche : l'ancre prend toute la case (le piege du § 6.7) */
.coach .ph>a{display:block;height:100%}
.coach .txt{padding:11px var(--marge) 0}
.coach .l1{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.coach .note{display:flex;align-items:center;gap:4px;font-family:var(--titre);font-weight:600;
             font-size:13px;flex:0 0 auto}
.coach h3{font-family:var(--titre);font-weight:600;font-size:17px;line-height:20px;
          letter-spacing:-.018em;margin-top:6px}
.coach .amis{display:flex;align-items:center;gap:7px;margin-top:7px}
.coach .prix{margin-top:7px;font-size:14px;line-height:18px}

/* --- 6.2 ter · LES PROCHAINES DATES DE LA CARTE (.coach .dates) --------
   Remontees de /rechercher/ le 20/09 (lot C, « voir plus », pas « +1 »). Sous la
   photo et le texte de la carte : deux lignes de 44 px, une par jour qui a des
   creneaux (.creneaux.ligne.ligne-jour : le jour en .cap.date, trois heures
   soulignees, « des 90 € » en .prix-jour), puis « Voir plus de dates »
   (.creneaux.ligne.ligne-plus > button.cren.attente.voir-plus, aria-expanded),
   qui deplie SUR PLACE la semaine (.dates-sem.pose) : sept pastilles du systeme
   (.creneaux > .cren, § 6.3), une par jour, le jour sans creneau [disabled] et
   barre ; les heures du jour touche (.heures-jour) ; « Reserver » (.reserver-jour
   > .second) quand une heure est choisie. Rien n'est ecrit ici sur .cren ni sur
   .creneaux : ce sont les composants ; ceci n'est que l'assemblage. Tout en jetons.
   (Le bloc porte la classe .dates, la meme que la zone qui glisse du § 6.33 : il
   en herite un overflow:hidden et un touch-action:pan-y sans consequence, ses
   rangees defilant chacune dans leur .creneaux.) */
.coach .dates .ligne-jour .prix-jour{flex:0 0 auto;margin-left:10px;padding:13px 0;white-space:nowrap;
  font-family:var(--titre);font-variant-numeric:tabular-nums;color:var(--ardoise)}
.coach .dates .ligne-plus .cren.attente{border:0;font:inherit;color:var(--encre);cursor:pointer}
.coach .dates .dates-sem{margin-top:6px;padding:14px 0 16px}
.coach .dates .dates-sem .heures-jour{margin-top:12px}
.coach .dates .dates-sem .heures-jour .cap.date{display:block;padding:0 var(--marge) 8px}
.coach .dates .dates-sem .heures-jour .cren{padding:9px 12px 10px;min-width:72px}
.coach .dates .dates-sem .heures-jour .cren .o{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
.coach .dates .dates-sem .heures-jour .cren .h{font-size:15px}
.coach .dates .dates-sem .reserver-jour{padding:14px var(--marge) 0}
.coach .dates .dates-sem .reserver-jour .second{height:44px;font-family:var(--titre);font-variant-numeric:tabular-nums}
.coach .dates .dates-sem .cren[disabled] .h{text-decoration:line-through}

/* --- 6.2 bis · CARTE DE DESTINATION (.dest) ----------------------------
   La meme regle que la carte de coach : la photographie EST la carte.
   Elle ne vit QUE dans un .rail.dests — une grille de destinations ferait
   une page de catalogue, la rangee qui glisse fait un sommaire. Le numero
   se lit comme le sommaire d'un magazine, le prix de depart en encre,
   la discipline et la saison en brume. */
.rail.dests{gap:12px;padding-bottom:4px;align-items:flex-start}
.dest{flex:0 0 auto;width:160px}
.dest .ph{height:156px}
.dest .lg{display:flex;gap:8px;margin-top:9px}
.dest .no{font-family:var(--titre);font-weight:700;font-size:12px;color:var(--brume);
          padding-top:2px;flex:0 0 auto}
.dest .co{min-width:0}
.dest .nom{font-family:var(--titre);font-weight:600;font-size:15px;line-height:18px;letter-spacing:-.018em}
.dest .pr{font-size:12px;line-height:16px;color:var(--encre);margin-top:3px}
.dest .sa{font-size:12px;line-height:15px;color:var(--brume);margin-top:2px}

/* --- 6.3 · PASTILLE D'HORAIRE A DEUX LIGNES (.cren) --------------------
   Heure en gras, lieu dessous en gris. Toujours en rangee qui glisse,
   jamais en grille : le manque a la forme de l'offre.
   REFAITE LE 14/09 (audit « residu Excel », endroits 1 et 2). La pastille
   etait une case blanche bordee a quatre cotes : 60 cellules sous 16 photos
   sur « Chercher », deux rangees de cases sur la fiche, la grille de tableur
   type. Elle est desormais une PASTILLE PLEINE, papier2 sans bord, l'heure en
   Archivo a chiffres tabulaires, et l'etat par UN POINT (regle 13) : vert =
   libre, ambre = presque plein (.presque), gris = passe ou pris ([disabled],
   .passe). Le creneau CHOISI est un aplat marine (.on), pas un cadre epais.
   Hauteur de cible : 54 px, au-dessus des 44 exiges. Sur une section posee, la
   pastille reprend le papier (sinon papier2 sur papier2 disparait). */
.creneaux{display:flex;gap:8px;overflow-x:auto;padding:0 var(--marge) 2px;scrollbar-width:none;
          -webkit-overflow-scrolling:touch}
.creneaux::-webkit-scrollbar{display:none}
.cren{flex:0 0 auto;min-width:104px;min-height:44px;border:0;padding:9px 12px 10px;
      background:var(--papier2);position:relative;color:var(--encre);text-align:left;
      transition:transform var(--duree-courte) var(--ressort),background-color var(--duree-courte) var(--courbe),
                 color var(--duree-courte) var(--courbe)}
.pose .cren,.encre-pose .cren{background:var(--papier)}
.cren .h{display:flex;align-items:center;gap:7px;font-family:var(--titre);font-weight:600;
         font-size:16px;line-height:18px;letter-spacing:-.01em;font-variant-numeric:tabular-nums;
         white-space:nowrap}
/* le point d'etat devant l'heure : la couleur dit l'etat, le texte reste marine */
.cren .h::before{content:"";width:7px;height:7px;border-radius:var(--rayon-doigt);
                 background:var(--vert);flex:0 0 auto}
.cren.presque .h::before{background:var(--ambre)}
.cren[disabled] .h::before,.cren.passe .h::before,.cren.pris .h::before{background:var(--brume2)}
/* .neutre : une pastille qui n'est pas un creneau (« Tout le mois ») ne porte pas de point */
.cren.neutre .h::before,.cren.attente .h::before{display:none}
.cren .o{display:block;font-size:12px;line-height:15px;color:var(--brume);margin-top:2px;white-space:nowrap}
/* CHOISI = l'aplat marine (l'inverse en nuit, comme .pastille.on et .etat.plein). */
.cren.on,.pose .cren.on,.encre-pose .cren.on{background:var(--encre);color:var(--papier)}
.cren.on .o{color:var(--papier);opacity:.74}
/* L'ALERTE (« Me prevenir ») n'est pas un creneau : pas d'aplat, pas de point, le texte
   gras souligne EST le bouton (regle 8). Elle garde la hauteur de la rangee. */
.cren.attente{background:none;padding-left:4px;padding-right:4px}
.pose .cren.attente,.encre-pose .cren.attente{background:none}
.cren.attente .h{font-size:14px;font-weight:700;text-decoration:underline;
                 text-underline-offset:3px;text-decoration-thickness:1px;padding-top:1px}
.cren[disabled]{color:var(--brume);cursor:default}
.cren[disabled] .h{text-decoration:line-through;text-decoration-thickness:1px}
.cren .ami{position:absolute;top:-9px;right:-7px}
/* LA LIGNE DE CRENEAUX SOULIGNES (.creneaux.ligne) : la variante de la LISTE de
   recherche (14/09, endroit 2). Sous une photographie, une rangee de pastilles
   defaisait la carte que la photo venait de faire. Ici une seule ligne de texte :
   « 08:00 · 09:00 · 10:00 », chaque heure en gras souligne (regle 8 : le texte
   souligne EST le bouton), separee par un point median, sans cadre ni aplat. Le
   jour se dit UNE FOIS en tete de ligne (.cap.date) ; la seconde ligne .o de chaque
   pastille est lue par les lecteurs d'ecran mais n'occupe plus l'ecran. La zone de
   toucher de chaque heure fait 44 px de haut par son remplissage vertical. */
.creneaux.ligne{gap:0;align-items:center;padding-bottom:0}
.creneaux.ligne .cap.date{flex:0 0 auto;margin-right:10px;padding:13px 0}
.creneaux.ligne .cren,.pose .creneaux.ligne .cren,.encre-pose .creneaux.ligne .cren{
  min-width:0;min-height:44px;background:none;padding:12px 0;display:inline-flex;align-items:center}
.creneaux.ligne .cren .h{font-size:15px;font-weight:700;text-decoration:underline;
                         text-underline-offset:3px;text-decoration-thickness:1px}
.creneaux.ligne .cren .h::before{display:none}
.creneaux.ligne .cren .o{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);
                         white-space:nowrap;margin:0}
.creneaux.ligne .cren+.cren::before{content:"\00B7";color:var(--brume);font-weight:500;padding:0 9px}
.creneaux.ligne .cren.on,.pose .creneaux.ligne .cren.on{background:none;color:var(--encre)}
.creneaux.ligne .cren.on .h{text-decoration-thickness:2px}
/* « 08:00 » a 15 px fait 40 px de large : la zone de toucher de l'heure s'elargit a 44 par
   un ::after invisible (le ::before dessine le point median). */
.creneaux.ligne .cren::after{content:"";position:absolute;top:0;bottom:0;left:50%;width:max(100%,44px);
                             transform:translateX(-50%)}
.creneaux.ligne .cren.attente{padding-left:0;padding-right:0}
.creneaux.ligne .cren.attente .h{font-size:14px}
.creneaux.ligne .cren[disabled] .h{text-decoration:line-through}

/* --- 6.4 · BARRE D'ACTION FIXE EN BAS (.barre-bas) ---------------------
   Deux zones : l'etat factuel a gauche, l'action a droite. */
.barre-bas{position:fixed;left:calc(50% + var(--decalage)/2);transform:translateX(-50%);bottom:0;width:100%;
           max-width:var(--colonne);background:var(--papier);border-top:1px solid var(--filet);
           z-index:22;padding-bottom:var(--bas)}
.barre-bas .rassure{display:flex;align-items:center;gap:8px;padding:9px var(--marge);
                    border-bottom:1px solid var(--filet2);font-size:12px;line-height:16px;color:var(--ardoise)}
.barre-bas .bas{display:flex;align-items:center;justify-content:space-between;gap:14px;
                padding:12px var(--marge) 16px}
.barre-bas .etat-gauche{min-width:0}
.barre-bas .etat-gauche .v{font-family:var(--titre);font-weight:600;font-size:20px;
                           line-height:22px;letter-spacing:-.022em}
.barre-bas .etat-gauche .l{font-size:12px;line-height:16px;color:var(--brume);margin-top:2px}
.barre-bas .bas.large{display:block;padding:10px var(--marge) 12px}
.barre-bas .apres{font-size:12px;line-height:16px;color:var(--brume);margin-top:9px}
/* dans une feuille, la barre reprend sa place dans le flux */
.feuille .barre-bas{position:relative;transform:none;left:auto;max-width:none;padding-bottom:0}

/* --- 6.5 · PASTILLE D'ETAT (.etat) -------------------------------------
   La couleur porte le POINT, jamais le texte. */
.etat{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 9px;
      border:1px solid var(--filet);font-family:var(--titre);font-weight:600;font-size:12px;
      letter-spacing:.06em;text-transform:uppercase;color:var(--ardoise);white-space:nowrap;flex:0 0 auto}
.etat::before{content:"";width:6px;height:6px;border-radius:var(--rayon-doigt);
              background:var(--brume);flex:0 0 auto}
.etat.vert::before{background:var(--vert)}
.etat.ambre::before{background:var(--ambre)}
.etat.corail::before{background:var(--corail)}
.etat.muet::before{display:none}
.etat.plein{background:var(--encre);border-color:var(--encre);color:var(--papier)}
.etat.plein::before{background:var(--papier)}
.etats{display:flex;gap:6px;flex-wrap:wrap;padding:0 var(--marge) 8px}

/* --- 6.6 · JAUGE DE GESTE (.geste) ------------------------------------- */
.geste{display:flex;align-items:center;gap:12px;padding:6px var(--marge)}
.geste .n{flex:1;min-width:0;font-size:14px;line-height:18px;font-weight:500}
.jauge{display:flex;gap:3px;flex:0 0 auto}
.jauge i{width:15px;height:6px;background:var(--filet);display:block}
.jauge i.on{background:var(--encre)}
.geste .v{width:30px;text-align:right;font-family:var(--titre);font-weight:600;font-size:14px;flex:0 0 auto}
.jauge-l{flex:1;height:3px;background:var(--filet);position:relative;display:block}
.jauge-l i{position:absolute;top:0;left:0;bottom:0;background:var(--encre);display:block}

/* --- 6.7 · LIGNE DE CLIENT (.client-l) --------------------------------- */
.client-l{display:flex;align-items:center;gap:12px;padding:11px var(--marge);width:100%}
.client-l+.client-l{border-top:1px solid var(--filet2)}
.client-l .face{width:40px;height:40px}
.client-l .co{flex:1;min-width:0}
.client-l .nom{font-size:14px;line-height:18px;font-weight:600;display:flex;align-items:center;gap:6px}
.client-l .meta{display:block;font-size:12px;line-height:16px;color:var(--brume);margin-top:2px;
                overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.client-l .d{flex:0 0 auto;text-align:right}
/* quand la colonne de droite est un bouton (le montant du sur Argent : 55 x 38), sa zone de
   toucher monte a 44 par un ::before invisible ; le dessin ne bouge pas (14/09) */
.client-l button.d,.ligne button.d,.ar-du button.d{position:relative}
.client-l button.d::before,.ligne button.d::before,.ar-du button.d::before{content:"";position:absolute;top:50%;left:50%;
  width:max(100%,44px);height:max(100%,44px);transform:translate(-50%,-50%)}
.client-l .d .v,.client-l .d .l{display:block}
.client-l .d .v{font-family:var(--titre);font-weight:600;font-size:14px;line-height:18px}
.client-l .d .l{font-size:12px;line-height:15px;color:var(--brume);margin-top:2px}

/* --- 6.8 · LIGNE D'AGENDA (.agenda) ------------------------------------
   L'heure en gouttiere, le filet vertical, le repere carre.
   Le trou se voit autant que la seance : c'est l'argent qui manque. */
.agenda{display:flex;gap:12px;padding:0 var(--marge);width:100%;text-align:left}
.agenda .h{width:44px;flex:0 0 auto;font-family:var(--titre);font-weight:600;font-size:12px;
           color:var(--brume);padding-top:12px}
.agenda .co{flex:1;min-width:0;border-left:1px solid var(--filet);padding:9px 0 9px 14px;position:relative}
.agenda .co::before{content:"";position:absolute;left:-3.5px;top:16px;width:6px;height:6px;background:var(--encre)}
.agenda .l1{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.agenda .nom{font-size:14px;line-height:18px;font-weight:600;display:flex;align-items:center;gap:6px}
.agenda .m{font-family:var(--titre);font-weight:600;font-size:13px;flex:0 0 auto}
.agenda .meta{font-size:13px;line-height:17px;color:var(--ardoise);margin-top:2px}
.agenda.attente .co::before{background:var(--ambre)}
.agenda.libre .co{border-left-style:dashed}
.agenda.libre .co::before{background:var(--filet)}
.agenda.libre .nom{font-weight:500;color:var(--brume)}
/* LE TEMPS LIBRE EST UN ETAT (12/09), pas un trou gris : .agenda.libre.etat-info prend
   l'aplat azur doux, le point azur, le nom en marine. Les trois vues (agenda, journee,
   tableau de bord) ecrivent la meme ligne. */
.agenda.libre.etat-info{padding-top:0;padding-bottom:0}
.agenda.libre.etat-info .co::before{background:var(--azur)}
.agenda.libre.etat-info .nom{color:var(--encre);font-weight:600}
.agenda.libre.etat-info .nom .point{flex:0 0 auto}
.agenda.libre.etat-info+.agenda.libre.etat-info{border-top:1px solid var(--filet2)}

/* --- 6.9 · BOUTON VOLANT (.volant) -------------------------------------
   Un seul par ecran, jamais au-dessus d'un texte. */
.volant{position:fixed;bottom:calc(var(--h-onglets) + var(--bas) + 16px);width:52px;height:52px;
        border-radius:var(--rayon-doigt);background:var(--azur);color:var(--azur-fg);
        display:grid;place-items:center;z-index:23;
        left:calc(50% + var(--decalage)/2);margin-left:calc(var(--colonne)/2 - 68px)}
.volant.libre{bottom:calc(var(--bas) + 20px)}
/* Une page SANS barre d'onglets (l'espace du coach) rend le volant libre d'elle-meme :
   mesure du 13/09, la journee du coach le posait a 110 px du bas, 76 px trop haut,
   et en fin de page il couvrait un paragraphe. La classe .libre reste le chemin
   explicite ; cette regle est le filet. */
body:not(:has(.onglets)) .volant{bottom:calc(var(--bas) + 20px)}
@media(max-width:470px){.volant{left:auto;right:16px;margin-left:0}}

/* --- 6.10 · FEUILLE QUI MONTE DU BAS (.feuille) ------------------------ */
.feuille-fond{position:fixed;inset:0;padding-left:var(--decalage);background:var(--voile);z-index:40;display:flex;
              align-items:flex-end;justify-content:center;opacity:0;
              transition:opacity var(--duree-courte) var(--courbe)}
.feuille-fond.ouverte{opacity:1}
.feuille{width:100%;max-width:var(--colonne);max-height:88dvh;background:var(--papier);
         border-top:1px solid var(--filet);display:flex;flex-direction:column;position:relative;
         transform:translateY(100%);transition:transform var(--duree-courte) var(--courbe);
         padding-bottom:var(--bas)}
/* Elle MONTE au ressort doux (elle depasse d'un rien et se pose), elle DESCEND a la
   courbe naturelle : ce qui part n'a pas a rebondir. */
.feuille-fond.ouverte .feuille{transform:translateY(0);transition:transform var(--duree) var(--ressort-doux)}
.feuille .prise{height:22px;display:grid;place-items:center;flex:0 0 auto;cursor:grab;touch-action:none;
                position:relative;z-index:1}
.feuille .prise::before{content:"";width:36px;height:3px;background:var(--filet);border-radius:var(--rayon-doigt)}
/* La prise mesure 22 px a l'oeil et 44 sous le doigt (13/09) : la zone tactile
   deborde de 11 px en haut et en bas, sans deplacer rien. Sur le tiroir du bas, qui
   n'a pas d'en-tete, c'etait la seule zone tirable : 22 px, sous le minimum. */
.feuille .prise::after{content:"";position:absolute;left:0;right:0;top:-11px;bottom:-11px}
.feuille-tete{display:flex;align-items:center;justify-content:space-between;gap:12px;
              padding:6px var(--marge) 12px;border-bottom:1px solid var(--filet);flex:0 0 auto}
.feuille-corps{flex:1;overflow-y:auto;scrollbar-width:none;padding-bottom:8px;-webkit-overflow-scrolling:touch;
               overscroll-behavior-y:contain}
.feuille-corps::-webkit-scrollbar{display:none}

/* --- 6.11 · BOITE DE DIALOGUE (.dialogue) ------------------------------
   Une seule question, deux issues. A GAUCHE la sortie, en secondaire :
   « Garder », « Plus tard ». A DROITE, en azur, l'acte que le titre annonce.
   Le titre dit donc toujours ce que fera le bouton azur. */
.dialogue-fond{position:fixed;inset:0;padding-left:var(--decalage);background:var(--voile);z-index:50;display:flex;
               align-items:center;justify-content:center;padding:24px;opacity:0;
               transition:opacity var(--duree-courte) var(--courbe)}
.dialogue-fond.ouverte{opacity:1}
.dialogue{width:100%;max-width:340px;background:var(--papier);border:1px solid var(--filet);
          transform:scale(.97);transition:transform var(--duree-courte) var(--courbe)}
.dialogue-fond.ouverte .dialogue{transform:scale(1);transition:transform var(--duree-courte) var(--ressort-doux)}
.dialogue .co{padding:20px var(--marge) 18px}
.dialogue h2{font-family:var(--titre);font-weight:600;font-size:20px;line-height:23px;letter-spacing:-.022em}
.dialogue p{font-size:14px;line-height:19px;color:var(--ardoise);margin-top:9px}
.dialogue .boutons{display:flex;gap:8px;padding:0 var(--marge) 18px}
.dialogue .boutons>*{flex:1;height:44px;padding:0;font-size:14px}

/* --- 6.12 · TABLEAU DE CHIFFRES (.chiffres) ---------------------------
   Le chiffre est un objet graphique : grande echelle, legende minuscule.
   Jamais une cellule de tableur. */
.chiffres{padding:14px var(--marge)}
.chiffres .grand{font-family:var(--titre);font-weight:700;font-size:40px;line-height:40px;
                 letter-spacing:-.04em;margin-top:9px}
.chiffres .dessous{font-size:12px;line-height:16px;color:var(--brume);margin-top:7px;max-width:64ch}
.chiffres .rangee{display:flex;margin-top:14px;border-top:1px solid var(--filet2);padding-top:12px}
.chiffres .rangee div{flex:1;padding-left:14px;border-left:1px solid var(--filet2);min-width:0}
.chiffres .rangee div:first-child{padding-left:0;border-left:0}
.chiffres .rangee .v{font-family:var(--titre);font-weight:600;font-size:17px;line-height:20px;
                     letter-spacing:-.018em;display:block}
.chiffres .rangee .l{font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.08em;
                     text-transform:uppercase;color:var(--brume);display:block;margin-top:4px}
/* les barres : sept jours, une hauteur, aucune grille, aucun axe */
.barres{display:flex;align-items:flex-end;gap:5px;height:64px;margin-top:16px}
.barres i{flex:1;background:var(--filet);display:block;min-height:2px}
.barres i.on{background:var(--encre)}
.barres i.azur{background:var(--azur)}
.barres-l{display:flex;gap:5px;margin-top:7px}
.barres-l span{flex:1;text-align:center;font-family:var(--titre);font-weight:600;font-size:12px;
               letter-spacing:.04em;text-transform:uppercase;color:var(--brume)}

/* --- 6.13 · DEMANDE AVEC DELAI DE REPONSE (.demande) ------------------- */
.demande{padding:13px var(--marge)}
.demande+.demande{border-top:1px solid var(--filet2)}
.demande .tete{display:flex;gap:11px;align-items:flex-start}
.demande .face{width:40px;height:40px}
.demande .l1{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.demande .prix{font-family:var(--titre);font-weight:700;font-size:15px;flex:0 0 auto}
.demande .delai{position:relative;margin-top:9px;padding-left:14px;font-size:12px;
                line-height:16px;color:var(--ardoise)}
.demande .delai::before{content:"";position:absolute;left:0;top:5px;width:6px;height:6px;
                        border-radius:var(--rayon-doigt);background:var(--ambre)}
.demande .delai b{font-weight:700;color:var(--encre)}
.demande .boutons{display:flex;gap:8px;margin-top:10px}
.demande .boutons .action,.demande .boutons .second{flex:1;height:44px;padding:0;font-size:13px}

/* --- 6.14 · FICHE A DEUX ETAGES (.fiche) ------------------------------- */
.fiche .tete{display:flex;align-items:center;gap:12px;padding:12px var(--marge)}
.fiche .tete .face{width:44px;height:44px}
.fiche .etage{padding:12px var(--marge) 14px;border-top:1px solid var(--filet2)}
.fiche .etage.epingle{background:var(--papier2)}
.fiche .lab{display:flex;align-items:center;gap:6px}
.fiche .note{font-size:14px;line-height:18px;margin-top:8px}
.fiche .source{display:flex;align-items:center;gap:6px;margin-top:7px;font-family:var(--titre);
               font-weight:600;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--brume)}

/* --- 6.15 · COMPTEUR, SEMAINE, RECAPITULATIF --------------------------- */
.pas{display:flex;align-items:center;gap:2px;flex:0 0 auto}
.pas button{width:44px;height:44px;border:1px solid var(--filet);display:grid;place-items:center;color:var(--encre)}
.pas button[disabled]{color:var(--brume);cursor:default}
.pas .n{width:38px;text-align:center;font-family:var(--titre);font-weight:600;font-size:16px}
.semaine{display:flex;padding:2px var(--marge) 10px;gap:2px}
.semaine .j{flex:1;text-align:center;padding-top:8px}
.semaine .j .d{font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.06em;color:var(--brume)}
.semaine .j .q{margin-top:5px;height:40px;display:grid;place-items:center;font-family:var(--titre);
               font-weight:600;font-size:16px;letter-spacing:-.01em}
.semaine .j.passe .q{color:var(--brume);text-decoration:line-through}
.semaine .j.on .q{background:var(--encre);color:var(--papier)}
/* les memes etats de jour que le calendrier de mois (6.15 bis), sur la bande */
.semaine .j.complet .q,.semaine .j.ferme .q,.semaine .j.repos .q,.semaine .j.horizon .q,
.semaine .j.preavis .q,.semaine .j.ailleurs .q{color:var(--brume)}
.semaine .j.ferme .q,.semaine .j.horizon .q{text-decoration:line-through;text-decoration-thickness:1px}
.recap{padding:10px var(--marge) 2px}
.recap .r{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:4px 0;
          font-size:14px;line-height:18px}
.recap .r.total{padding-top:11px;margin-top:7px;border-top:1px solid var(--filet)}

/* --- 6.15 bis · CALENDRIER DE MOIS (.mois) ET ETATS DE JOUR --------------
   Regle du 9 septembre : le client avance de mois en mois SANS BUTEE, et
   chaque jour dit son etat sans qu'on le touche, facon Airbnb : le chiffre
   reste toujours visible, gris clair, barre d'un trait fin quand le jour
   est ferme ou pas encore ouvert. Aucun jour ne disparait.
   Les etats, portes par la case (et par .semaine .j) :
     .libre     des creneaux : encre, point vert, cliquable ;
     .complet   tout est pris : gris, mention « complet » ;
     .ferme     ferme par le coach (blocage, conges) : barre, « ferme » ;
     .repos     aucune regle ce jour-la : gris, sans mention ;
     .horizon   au-dela de l'horizon du coach : barre, « pas encore ouvert » ;
     .preavis   trop proche : gris, « trop tard » ;
     .ailleurs  le coach est a une autre destination : gris, « a Courchevel » ;
     .passe     derriere nous : barre, sans mention ;
     .on        le jour retenu : un cerne azur (la selection) ; l'aplat azur
                reste au bouton d'action, un seul par ecran.
   La mention `.m` est la seconde ligne de la case : Manrope 8 px, deux
   lignes au plus, jamais en capitales. La legende `.mois-lg` reprend la
   meme mention en `<b>` devant sa phrase. */
.mois-tete{display:flex;align-items:center;justify-content:space-between;gap:10px;
           padding:16px var(--marge) 10px}
.mois-tete .nom{font-family:var(--titre);font-weight:600;font-size:18px;line-height:20px;
                letter-spacing:-.018em}
.mois-tete .fleches{display:flex;gap:6px;flex:0 0 auto}
.mois{padding:0 var(--marge) 2px}
.mois .jours,.mois .grille{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.mois .jours span{text-align:center;font-family:var(--titre);font-weight:600;font-size:12px;
                  letter-spacing:.08em;color:var(--brume);padding-bottom:7px}
.mois .grille button{height:46px;display:flex;flex-direction:column;align-items:center;
                     justify-content:center;gap:1px;position:relative;padding:0 1px;min-width:0;
                     font-family:var(--titre);font-weight:600;font-size:15px;line-height:18px;
                     font-variant-numeric:tabular-nums;color:var(--encre);text-align:center;
                     background:var(--papier)}
.mois .grille button.hors{visibility:hidden}
.mois .grille button[disabled]{cursor:default}
.mois .grille .q{display:block}
/* LA MENTION .m NE S'ECRIT PLUS DANS LA CASE (14/09). Elle etait en Manrope 8 px : sous le
   plancher de 12 px du contrat (§ 2, regle du 12/09), illisible sur un telephone, et a
   12 px « pas encore ouvert » ne tient pas dans 48 px de large. L'etat du jour se lit au
   DESSIN (gris, chiffre barre, point vert), la legende .mois-lg dessous le nomme a 12 px,
   et l'aria-label de la case le dit aux lecteurs d'ecran : la mention reste dans le DOM,
   masquee a l'oeil. */
.mois .grille .m,.semaine .j .m{position:absolute;width:1px;height:1px;overflow:hidden;
        clip:rect(0 0 0 0);white-space:nowrap}
.mois .grille button.libre::after{content:"";position:absolute;bottom:6px;left:50%;margin-left:-2px;
                                  width:4px;height:4px;border-radius:var(--rayon-doigt);background:var(--vert)}
/* LE CHIFFRE D'UN JOUR QU'ON NE PEUT PAS RESERVER est en brume (5,3 contre 1 en jour, 5,7
   en nuit), plus en brume2 : a 1,88 contre 1, il ne se lisait pas (audit du 12/09, encore la
   le 14/09). Il reste distinct du jour ouvert : pas de graisse marine, pas de point vert, et
   barre quand il est passe, ferme ou hors horizon. */
.mois .grille button.complet,.mois .grille button.ferme,.mois .grille button.repos,
.mois .grille button.horizon,.mois .grille button.preavis,.mois .grille button.ailleurs,
.mois .grille button.passe{color:var(--brume)}
.mois .grille button.ferme .q,.mois .grille button.horizon .q,.mois .grille button.passe .q{
  text-decoration:line-through;text-decoration-thickness:1px}
.mois .grille button.on{box-shadow:inset 0 0 0 2px var(--azur)}
.mois-lg{display:flex;flex-direction:column;gap:6px;padding:10px var(--marge) 16px}
.mois-lg span{display:flex;align-items:center;gap:8px;font-size:12px;line-height:16px;color:var(--brume)}
.mois-lg i{width:6px;height:6px;border-radius:var(--rayon-doigt);display:block;flex:0 0 auto;margin:0 4px}
.mois-lg i.v{background:var(--vert)} .mois-lg i.g{background:var(--brume2)}
.mois-lg b{flex:0 0 auto;font-weight:500;font-size:12px;line-height:15px;color:var(--brume);
           border:1px solid var(--filet);padding:1px 5px}
.mois-lg b.barre{text-decoration:line-through;text-decoration-thickness:1px}

/* --- 6.16 · LIGNE QU'ON TIRE VERS LA GAUCHE (.tirer) -------------------
   Le geste de GlideBlue, sorti de la vue « Argent » et pose ici : une ligne
   dont on tire le CONTENU vers la gauche pour decouvrir une a trois actions
   colorees. Les actions sont DEJA dans le HTML : sans JavaScript, elles
   restent atteignables, et le clavier les ouvre en y entrant (voir tirer()).
   Une a trois, jamais quatre : au-dela, le doigt ne vise plus rien. */
.tirer{position:relative;overflow:hidden;background:var(--papier)}
.tirer+.tirer{border-top:1px solid var(--filet2)}
.tirer .dessous{position:absolute;top:0;right:0;bottom:0;display:flex;z-index:0}
/* Les tuiles d'action : l'APLAT DOUX de leur etat, texte marine (13 contre 1), l'icone
   dans la couleur pleine, et un trait plein en haut qui dit la couleur meme de loin.
   Le blanc 10 px sur vert plein mesurait 3,4 (verif du 12/09) : les tuiles restent
   visibles tant que la ligne est ouverte, ce sont des mots qu'on lit, pas un eclair. */
/* Un LIEN <a> (tel:, mailto:) prend exactement les formes du bouton : meme largeur,
   meme aplat DOUX a bord plein, meme libelle marine. Un lien tel: se garde en appui
   long, ce qu'un bouton ne sait pas faire (la fiche client, 12/09). Aucune tuile ne
   porte un aplat azur PLEIN : l'azur plein est l'action de l'ecran, et il n'y en a qu'une. */
.tirer .dessous button,.tirer .dessous a{width:84px;display:grid;place-items:center;gap:5px;justify-items:center;
                       font-family:var(--titre);font-weight:700;font-size:12px;letter-spacing:.06em;
                       text-transform:uppercase;background:var(--papier2);color:var(--encre);
                       text-decoration:none;border-top:3px solid var(--filet)}
.tirer .dessous button.rouge,.tirer .dessous a.rouge{background:var(--corail-doux);border-top-color:var(--corail)}
.tirer .dessous button.rouge .ic,.tirer .dessous a.rouge .ic{color:var(--corail)}
.tirer .dessous button.verte,.tirer .dessous a.verte{background:var(--vert-doux);border-top-color:var(--vert)}
.tirer .dessous button.verte .ic,.tirer .dessous a.verte .ic{color:var(--lien)}   /* le tilleul ne tient pas sur son propre aplat : le vert en texte */
.tirer .dessous button.azur,.tirer .dessous a.azur{background:var(--azur-doux);border-top-color:var(--azur)}
.tirer .dessous button.azur .ic,.tirer .dessous a.azur .ic{color:var(--azur)}
/* Memes jetons que le glissement qui decide (6.30) : la ligne s'ouvre sur --courbe
   et revient a sa place sur --ressort (la classe .revient est posee par tirer()
   le temps du retour). Un seul langage de mouvement dans toute l'application. */
.tirer .dessus{position:relative;z-index:1;background:var(--papier);
               transition:transform var(--duree) var(--courbe);touch-action:pan-y}
.tirer .dessus.revient{transition:transform var(--duree) var(--ressort)}
.tirer.tire .dessus{transform:translateX(calc(-1 * var(--tire,168px)))}
/* Le clavier : en entrant dans les ACTIONS, la ligne s'ouvre d'elle-meme.
   Sans cette regle, la tabulation posait le curseur sur un bouton CACHE.
   On vise .dessous, jamais :focus-within sur toute la ligne : le bouton
   visible de .dessus aurait ouvert les actions rien qu'en recevant le focus. */
.tirer:has(.dessous :focus) .dessus{transform:translateX(calc(-1 * var(--tire,168px)))}
/* L'amorce : une PRISE au bord droit, courte et centree, dit qu'il y a
   quelque chose dessous. Sur toute la hauteur, elle se lisait comme un bord
   de tableau. Elle disparait des que la ligne est tiree. */
.tirer .dessus::after{content:"";position:absolute;top:50%;right:0;width:2px;height:22px;
                      transform:translateY(-50%);background:var(--filet);transition:opacity var(--duree-courte)}
.tirer.tire .dessus::after,.tirer:has(.dessous :focus) .dessus::after{opacity:0}
/* Le bouton de secours (tirer(el,{menu:true})) : les MEMES actions, en clair,
   pour qui ne peut pas glisser. */
.tirer .ouvre-menu{position:absolute;top:50%;right:5px;transform:translateY(-50%);z-index:2;
                   width:26px;height:44px;display:grid;place-items:center;color:var(--brume)}
/* la zone de toucher des menus « … » fait 44 x 44 SANS changer le dessin : un ::after
   invisible, centre, deborde du bouton de ce qu'il faut (14/09). */
.tirer .ouvre-menu::after,.decider .ouvre-menu::after{content:"";position:absolute;top:50%;left:50%;
  width:44px;height:44px;transform:translate(-50%,-50%)}
/* Le bouton se pose SUR la ligne : sans cette reserve, il tombait sur le prix.
   tirer(el,{menu:true}) pose la classe lui-meme. */
.tirer.avec-menu .dessus{padding-right:28px}
.tirer.tire .ouvre-menu,.tirer:has(.dessous :focus) .ouvre-menu{opacity:0;pointer-events:none}

/* PERIME · l'ancien nom de ce composant etait .glisse. Il ne sert plus qu'aux
   ecrans deja livres, et .glisse designe desormais la rangee horizontale
   (6.26). N'ecris plus cette forme : elle sera retiree. */
.glisse:has(>.dessus){display:block;position:relative;overflow:hidden;background:var(--papier);padding:0}
.glisse:has(>.dessus)>.dessous{position:absolute;top:0;right:0;bottom:0;display:flex;z-index:0}
.glisse:has(>.dessus)>.dessous button{width:84px;display:grid;place-items:center;gap:5px;
     justify-items:center;font-family:var(--titre);font-weight:700;font-size:12px;letter-spacing:.06em;
     text-transform:uppercase;background:var(--papier2);color:var(--encre);flex:0 0 auto}
.glisse:has(>.dessus)>.dessous button.rouge{background:var(--corail-doux);border-top:3px solid var(--corail)}
.glisse:has(>.dessus)>.dessus{position:relative;z-index:1;background:var(--papier);width:auto;
     transition:transform var(--duree-courte) var(--courbe);touch-action:pan-y}
.glisse.tire:has(>.dessus)>.dessus{transform:translateX(calc(-1 * var(--tire,168px)))}
.glisse:has(>.dessous :focus)>.dessus{transform:translateX(calc(-1 * var(--tire,168px)))}

/* --- 6.17 · TIROIR DE GESTION (.tiroir) --------------------------------
   LE MENU D'UN OUTIL PROFESSIONNEL : un professionnel ouvre un menu depuis
   un bouton EN HAUT A GAUCHE. Depuis le 19/09 il coexiste avec la barre du bas
   du coach (3.2 bis) : quatre entrees rapides en bas, les quatorze dans le tiroir.
   Comportement repris de l'espace privé de Louis Tessa : il glisse par la
   gauche, un fond sombre derrière, il se ferme au clic extérieur et à la
   touche d'échappement.
   AU-DELA DE 1000 px il ne glisse plus : il RESTE ouvert en colonne fixe et
   le contenu se décale (voir 3.4). Un coach travaille souvent sur ordinateur. */
/* [W1 + W2 22/09, docs/42 § 3.10] deux reglages, rien d'autre : le voile est celui d'un MENU
   (marine a 40 %, --voile-menu : la page reste lisible derriere), et la glisse d'entree dure
   320 ms (--duree-volet) pour que l'oeil la voie ; la sortie garde --duree (240 ms).
   0 ms sous mouvement reduit. */
.tiroir-fond{position:fixed;inset:0;background:var(--voile-menu);z-index:44;
             opacity:0;pointer-events:none;transition:opacity var(--duree) var(--courbe)}
.tiroir-fond.ouvert{opacity:1;pointer-events:auto}
.tiroir{position:fixed;top:0;left:0;height:100dvh;width:min(300px,86vw);z-index:45;
        background:var(--papier);color:var(--encre);border-right:1px solid var(--filet);
        display:flex;flex-direction:column;overflow-y:auto;overscroll-behavior:contain;
        scrollbar-width:none;-webkit-overflow-scrolling:touch;
        transform:translateX(-101%);transition:transform var(--duree) var(--courbe)}
.tiroir.ouvert{transition-duration:var(--duree-volet)}
.tiroir::-webkit-scrollbar{display:none}
.tiroir.ouvert{transform:none;transition-duration:var(--duree-volet)}
/* en tête : qui tu es. La photo, le nom, la ville — jamais un identifiant. */
.tiroir .qui{display:flex;align-items:center;gap:12px;flex:0 0 auto;
             padding:14px var(--marge);border-bottom:1px solid var(--filet)}
.tiroir .qui .face{width:44px;height:44px}
.tiroir .qui .co{min-width:0;flex:1}
.tiroir .qui .n{font-family:var(--titre);font-weight:600;font-size:16px;line-height:19px;
                letter-spacing:-.018em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tiroir .qui .v{font-size:12px;line-height:16px;color:var(--brume);margin-top:2px;
                overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tiroir nav{flex:1;padding:4px 0 6px}
.tiroir .g{font-family:var(--titre);font-weight:600;font-size:12px;line-height:15px;
           letter-spacing:.16em;text-transform:uppercase;color:var(--brume);
           padding:15px var(--marge) 7px}
.tiroir .bas{flex:0 0 auto;border-top:1px solid var(--filet);
             padding:6px 0 calc(var(--bas) + 10px)}
/* une entrée */
.item{display:flex;align-items:center;gap:12px;width:100%;text-align:left;position:relative;
      padding:13px var(--marge);min-height:44px;font-size:14px;line-height:18px;font-weight:500;color:var(--encre)}
.item .ic{color:var(--brume);flex:0 0 auto}
.item .l{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.item:hover{background:var(--papier2)}
.item.on{font-weight:700;background:var(--papier2)}
.item.on .ic{color:var(--encre)}
.item.on::before{content:"";position:absolute;left:0;top:5px;bottom:5px;width:2px;background:var(--encre)}
.item .n{flex:0 0 auto;min-width:19px;height:19px;padding:0 5px;background:var(--contre);color:var(--contre-txt);
         border-radius:var(--rayon-doigt);font-family:var(--titre);font-weight:700;font-size:12px;
         line-height:19px;text-align:center;font-variant-numeric:tabular-nums}
/* un compte a traiter dans le tiroir (Demandes a repondre, Notifications) : la meme regle
   que .pastilleN.du, corail plein */
.item .n.du{background:var(--corail-plein);color:#FFFFFF}
.item .fl{flex:0 0 auto;color:var(--brume)}
/* Une pastille a zero se retire du DOM par `hidden` : on ne compte pas sur la seule
   feuille du navigateur, un `display` d'auteur la rendrait a nouveau visible. */
.item .n[hidden]{display:none}
/* La déconnexion, en bas du tiroir : SEULE L'ICONE est corail (le corail ne fait
   jamais du texte, règle 2 : le corail lisait 3,3 contre 1 sur blanc, 2,6 de nuit).
   Le mot « Se déconnecter » reste marine le jour, encre de nuit : 14,6 contre 1. */
.item.sortie{color:var(--encre)}
.item.sortie .ic{color:var(--corail)}

/* --- 6.18 · EN-TETE DE TABLEAU DE BORD (.bord) -------------------------
   La photographie porte le bonjour et la date ; les chiffres restent SOUS
   elle, sur du blanc. Une photo ne passe jamais derrière un nombre. */
.bord{position:relative;overflow:hidden;background:var(--papier3);height:172px}
.bord img{width:100%;height:100%;object-fit:cover}
.bord .voile{position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(8,16,26,.34) 0,rgba(8,16,26,.04) 38%,rgba(8,16,26,.68) 100%)}
.bord .co{position:absolute;left:var(--marge);right:var(--marge);bottom:14px;
          display:flex;align-items:flex-end;gap:12px;color:#fff}
.bord .face{width:46px;height:46px;box-shadow:0 0 0 2px rgba(255,255,255,.78)}
.bord .txt{min-width:0;flex:1}
.bord .cap{color:rgba(255,255,255,.74)}
.bord h1{font-family:var(--titre);font-weight:700;font-size:24px;line-height:26px;
         letter-spacing:-.028em;margin-top:4px}
.bord .j{font-size:12px;line-height:16px;color:rgba(255,255,255,.84);margin-top:4px}

/* --- 6.19 · BANDEAU D'ACTION A TRAITER (.atraiter) ---------------------
   Un nombre, ce qu'il faut faire, et où cela mène. Le corail et l'ambre
   portent le TRAIT de gauche, jamais le texte (règle 2). */
.atraiter{display:flex;align-items:center;gap:13px;width:100%;text-align:left;
          padding:12px var(--marge);background:var(--papier);
          border-left:3px solid var(--filet)}
.atraiter+.atraiter{border-top:1px solid var(--filet2)}
.atraiter.urgent{border-left-color:var(--corail)}
.atraiter.douce{border-left-color:var(--ambre)}
.atraiter.calme{border-left-color:var(--vert)}
.atraiter:hover{background:var(--papier2)}
.atraiter .n{flex:0 0 auto;min-width:32px;font-family:var(--titre);font-weight:700;
             font-size:22px;line-height:24px;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.atraiter .co{flex:1;min-width:0}
.atraiter .t{font-size:14px;line-height:18px;font-weight:600}
.atraiter .d{font-size:12px;line-height:16px;color:var(--brume);margin-top:2px}
.atraiter .ic{flex:0 0 auto;color:var(--brume)}

/* --- 6.20 · CARTE DE RACCOURCI (.raccs + .racc) ------------------------
   Deux colonnes séparées par LE trait, et rien d'autre : la grille est un
   fond de filet que les cartes recouvrent. Aucune ombre, aucun rayon. */
.raccs{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--filet);
       border-top:1px solid var(--filet);border-bottom:1px solid var(--filet)}
.racc{display:block;width:100%;text-align:left;background:var(--papier);
      padding:14px 16px 15px;min-height:98px}
.racc .ic{color:var(--brume)}
.racc .t{font-family:var(--titre);font-weight:600;font-size:14px;line-height:17px;
         letter-spacing:-.012em;margin-top:11px}
.racc .d{font-size:12px;line-height:16px;color:var(--brume);margin-top:3px}
.racc:hover{background:var(--papier2)}
/* LES SIX TEINTES (12/09). « Les cartes de raccourcis portent chacune une teinte de
   fond douce differente. » Six aplats a 6-18 % tires de la palette (azur, vert,
   ambre, corail, marine, azur soutenu) : jamais d'or, jamais une couleur neuve.
   L'icone passe en marine et la legende en ardoise : la brume tombait a 2,8 contre 1
   sur une teinte. Le survol fonce a peine la teinte au lieu de la remplacer. */
/* La teinte est posee SUR le papier (degrade uni + couleur de fond), pas a nu : la grille
   des raccourcis est un fond de filet gris, et une teinte translucide posee dessus
   virait au gris sale. */
.racc.teinte-1{background:linear-gradient(var(--teinte-1),var(--teinte-1)) var(--papier)}
.racc.teinte-2{background:linear-gradient(var(--teinte-2),var(--teinte-2)) var(--papier)}
.racc.teinte-3{background:linear-gradient(var(--teinte-3),var(--teinte-3)) var(--papier)}
.racc.teinte-4{background:linear-gradient(var(--teinte-4),var(--teinte-4)) var(--papier)}
.racc.teinte-5{background:linear-gradient(var(--teinte-5),var(--teinte-5)) var(--papier)}
.racc.teinte-6{background:linear-gradient(var(--teinte-6),var(--teinte-6)) var(--papier)}
.racc[class*="teinte-"] .ic{color:var(--encre)}
.racc[class*="teinte-"] .d{color:var(--ardoise)}
.racc[class*="teinte-"]:hover{filter:brightness(.97)}

/* --- 6.24 · BANDEAU DE TETE (.bandeau) ---------------------------------
   La reponse au « ca fait trop Excel » : quand une page empile des blocs,
   c'est LUI qui prend la tete, pas un premier tableau. Un chiffre qui compte,
   sa legende minuscule, une ligne de detail, et il se touche pour ouvrir le
   detail. Il remplace un bloc, il ne s'ajoute pas a lui.
   Comme partout (regle 2), la couleur porte le TRAIT de gauche, jamais le
   texte : vert pour l'argent rentre, corail pour ce qui presse, encre pour
   l'activite. Le chiffre s'anime avec Athlon.compter() — voir 7.13. */
.bandeau{display:flex;align-items:center;gap:14px;width:100%;text-align:left;
         padding:14px var(--marge) 16px;background:var(--papier);
         border-top:1px solid var(--filet);border-bottom:1px solid var(--filet);
         border-left:3px solid var(--encre)}
.bandeau .co{flex:1;min-width:0}
.bandeau .v{display:block;font-family:var(--titre);font-weight:700;font-size:32px;line-height:34px;
            letter-spacing:-.032em;margin-top:6px;font-variant-numeric:tabular-nums;
            white-space:nowrap}
.bandeau .cap{font-size:12px;line-height:16px;letter-spacing:.12em;color:var(--ardoise)}
.bandeau .d{display:block;font-size:12px;line-height:16px;color:var(--ardoise);margin-top:5px;
            overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bandeau .fin{flex:0 0 auto;display:flex;align-items:center;gap:8px}
.bandeau>.ic{flex:0 0 auto;color:var(--brume)}
.bandeau:hover{background:var(--papier2)}
.bandeau.argent{border-left-color:var(--vert)}
.bandeau.alerte{border-left-color:var(--corail)}
.bandeau.activite{border-left-color:var(--encre)}
/* deux bandeaux qui se suivent ne font qu'UN trait entre eux (regle 4) */
.bandeau+.bandeau{border-top:0}
/* Deux ou trois bandeaux : ils GLISSENT, ils ne s'empilent pas. */
.glisse.bandeaux{--par-vue:1.12;--ecart:8px;padding-top:12px;padding-bottom:2px}
/* longhand, et non `border:` : le raccourci reecrivait border-left-color et
   la variante perdait son vert ou son corail. */
.glisse.bandeaux .bandeau{height:100%;border-top:1px solid var(--filet);
                          border-right:1px solid var(--filet);border-bottom:1px solid var(--filet)}
/* LES BANDEAUX QUI ONT UN ETAT (12/09) : dans une rangee, deux cartes a trait gris cote
   a cote font un tableau. Un bandeau .etat-ok / .etat-du / .etat-info / .etat-attente
   (6.29) prend son aplat ET perd son cadre gris : le fond dit l'etat, le bord de
   gauche le confirme, plus aucun filet ne le decoupe. Un bandeau .calme (a zero, rien
   a dire) se pose sur le marine a 6 % (--teinte-5), sans cadre lui non plus. */
.glisse.bandeaux .bandeau:is(.etat-ok,.etat-du,.etat-info,.etat-attente,.calme){border-top-color:transparent;
  border-right-color:transparent;border-bottom-color:transparent}
.bandeau.calme{background:var(--teinte-5);border-left-color:var(--ardoise)}
.bandeau.calme:hover{background:var(--teinte-5)}
.bandeau.etat-ok:hover{background:var(--vert-doux)} .bandeau.etat-du:hover{background:var(--corail-doux)}
.bandeau.etat-info:hover{background:var(--azur-doux)}

/* --- 6.25 · GESTES RAPIDES (.rapides + .rapide) ------------------------
   « Plein de petits boutons rapides, que ca renvoie vite fait. » Une rangee
   qui glisse horizontalement, jamais une grille : la grille rend l'ecran
   carre et sature. Chaque bouton fait UNE chose, en un geste, sans changer
   de page quand c'est possible.
   Zone tactile 44 px. Trois a six boutons : au-dela, ce n'est plus rapide.
   Un seul .cle par ecran (l'aplat azur, regle 1). */
.rapides{display:flex;gap:8px;overflow-x:auto;padding:10px var(--marge) 12px;
         scrollbar-width:none;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain}
.rapides::-webkit-scrollbar{display:none}
.rapide{flex:0 0 auto;min-height:44px;display:inline-flex;align-items:center;gap:8px;
        padding:0 14px;border:1px solid var(--filet);background:var(--papier);color:var(--encre);
        font-size:13px;line-height:16px;font-weight:600;white-space:nowrap}
.rapide .ic{color:var(--ardoise)}
.rapide .nb{font-family:var(--titre);font-weight:700;font-size:12px;color:var(--brume);
            font-variant-numeric:tabular-nums}
.rapide:hover{background:var(--papier2)}
.rapide.cle{background:var(--azur);border-color:var(--azur);color:var(--azur-fg)}
.rapide.cle .ic,.rapide.cle .nb{color:var(--azur-fg)}
.rapide.cle:hover{background:var(--azur)}
.rapide[disabled],.rapide[aria-disabled="true"]{color:var(--brume);border-color:var(--filet2);cursor:default}
.rapide[disabled] .ic{color:var(--brume)}

/* --- 6.26 · RANGEE QUI GLISSE (.glisse + .reperes) ---------------------
   La solution d'Airbnb et de Resy, et le glissement de GlideBlue : les jours,
   les cours, les clients, les destinations se DECOUVRENT en glissant vers la
   gauche, ils ne s'empilent pas vers le bas.
   --par-vue est le nombre d'elements dans la largeur. La valeur est FRACTION-
   NAIRE exprès : 3,4 laisse le quatrieme coupe au bord droit, et ce bord
   coupe est ce qui appelle le geste. Un compte rond (3, 4) rend la rangee
   muette : rien ne dit qu'il y a une suite.
   L'inertie est celle du navigateur (defilement natif) ; glisse() n'ajoute
   que la souris, les fleches du clavier et les reperes. */
.glisse{--par-vue:3.4;--ecart:10px;
        display:flex;gap:var(--ecart);overflow-x:auto;padding:0 var(--marge);
        scroll-snap-type:x proximity;scroll-padding-left:var(--marge);
        scrollbar-width:none;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain}
.glisse::-webkit-scrollbar{display:none}
.glisse>*{flex:0 0 calc((100% - var(--ecart) * (var(--par-vue) - 1)) / var(--par-vue));
          scroll-snap-align:start;min-width:0}
/* .libre : chaque element garde sa propre largeur (pastilles, creneaux). */
.glisse.libre>*{flex:0 0 auto}
.glisse.serree{--par-vue:4.4;--ecart:8px}
.glisse.deux{--par-vue:2.15}
.glisse.une{--par-vue:1.1}
/* la souris : on saisit la rangee et on la tire (glisse() pose ces classes) */
.glisse.saisissable{cursor:grab}
.glisse.saisie{cursor:grabbing;scroll-snap-type:none;user-select:none}
.glisse.saisie *{pointer-events:none}
/* Les reperes : ou l'on en est dans la rangee. Des barres, pas des pastilles :
   rayon 0 (regle 5), et une barre se lit comme une position. */
.reperes{display:flex;gap:3px;align-items:center;flex:0 0 auto}
.reperes i{width:14px;height:2px;background:var(--filet);display:block;transition:background var(--duree-courte) var(--courbe)}
.reperes i.on{background:var(--encre)}
.reperes.px{padding-top:10px;padding-bottom:2px}
/* une rangee qui tient entiere dans la largeur n'a pas de reperes a montrer.
   Sans cette ligne, [hidden] ne faisait rien : display:flex l'emportait. */
.reperes[hidden]{display:none}

/* --- 6.27 · TIROIR DU BAS (.tiroir-bas) --------------------------------
   Une feuille COURTE pour UNE action : confirmer un encaissement, choisir
   entre trois façons de faire. Elle ne defile pas, elle ne prend pas l'ecran.
   La grande feuille (6.10) reste pour un formulaire ou une liste.
   C'est la meme mecanique que .feuille : le retour du telephone la ferme, le
   fond la ferme, Echap la ferme, et on la tire vers le bas. */
.feuille.tiroir-bas{max-height:none}
.tiroir-bas .co{padding:14px var(--marge) 2px}
.tiroir-bas h2{font-family:var(--titre);font-weight:600;font-size:18px;line-height:22px;
               letter-spacing:-.02em}
.tiroir-bas p{font-size:13px;line-height:18px;color:var(--ardoise);margin-top:7px}
.tiroir-bas .liste{padding:10px 0 6px}
.tiroir-bas .liste button{display:flex;align-items:center;gap:12px;width:100%;min-height:52px;
                          padding:0 var(--marge);font-size:14px;line-height:18px;font-weight:600;
                          color:var(--encre)}
.tiroir-bas .liste button+button{border-top:1px solid var(--filet2)}
.tiroir-bas .liste button .ic{color:var(--brume)}
/* Regle 2 : le corail porte le TRAIT de gauche, jamais le texte. La seule
   exception du fichier reste la deconnexion du tiroir de gestion. */
.tiroir-bas .liste button.rouge{border-left:3px solid var(--corail);
                                padding-left:calc(var(--marge) - 3px)}
.tiroir-bas .liste button[disabled]{color:var(--brume);cursor:default}
/* [E 21/09] un choix avec son sous-texte (c.sous) : le nom, puis la phrase en 12, empilés, alignés à gauche */
.tiroir-bas .liste button .co{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;padding:12px 0;text-align:left}
.tiroir-bas .liste button .co .c12{font-weight:500;color:var(--ardoise)}
.tiroir-bas .choix{padding:12px var(--marge) 16px;display:flex;flex-direction:column;gap:8px}
.tiroir-bas .choix>*{width:100%}

/* --- 6.28 · BASCULE JOUR / NUIT (.bascule-theme) -----------------------
   L'APPLICATION S'OUVRE EN JOUR, TOUJOURS (athlon.js, en bas). La nuit reste
   atteignable a tout moment, et elle doit l'etre des DEUX cotes :
     · l'espace du coach  — Reglages, section « Affichage » ;
     · l'espace du client — /moi/ ? onglet=moi, section « Affichage » ;
     · les pages PUBLIQUES — cette bascule, au pied de page.
   Deux segments, un seul trait, rayon 0 : c'est le meme objet que la bascule
   de /_app/exemples.html, sorti de l'atelier et pose dans le systeme. */
.bascule-theme{display:inline-flex;border:1px solid var(--filet);flex:0 0 auto;background:var(--papier)}
.bascule-theme button{font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.1em;
                      text-transform:uppercase;padding:0 14px;height:36px;color:var(--brume);
                      display:inline-flex;align-items:center;gap:6px}
.bascule-theme button+button{border-left:1px solid var(--filet)}
.bascule-theme button[aria-pressed="true"]{background:var(--encre);color:var(--papier)}
.bascule-theme .ic{width:14px;height:14px}
/* Au pied d'une page publique : posee, discrete, jamais au milieu du contenu. */
.pied-theme{display:flex;align-items:center;justify-content:space-between;gap:14px;
            padding:16px var(--marge) calc(20px + var(--bas));border-top:1px solid var(--filet);
            background:var(--papier2)}
.pied-theme .l{font-size:12px;line-height:16px;color:var(--brume);min-width:0}

/* --- 6.29 · LA COULEUR DIT L'ETAT (.etat-attente, .etat-ok, .etat-du, .etat-info) --
   La regle 2 ne change pas (jamais du texte colore) : la couleur prend seulement
   PLUS DE PLACE. Quatre etats, poses sur n'importe quelle ligne, carte ou bandeau :
     .etat-attente  bord ambre a gauche              une demande qui attend
     .etat-ok       aplat vert doux + bord vert       acceptee, encaissee, faite
     .etat-du       aplat corail doux + bord corail   un impaye, un retard
     .etat-info     aplat azur doux + bord azur       une information, une nouveaute
   L'aplat est un « wash » de 10 a 14 % (jetons --*-doux) ; le texte reste marine
   (13 contre 1) ou ardoise (6,2 contre 1), MESURE sur chaque aplat ; la brume y
   devient ardoise. Les composants du systeme qui ont une marge de gauche la
   reprennent de 3 px : le texte ne bouge pas quand l'etat arrive ou s'en va.
   Le passage d'un etat a l'autre est une transition (--duree) : une ligne qu'on
   vient d'accepter VIRE au vert sur place, elle ne clignote pas. */
.etat-attente,.etat-ok,.etat-du,.etat-info{border-left:3px solid transparent;
  transition:background-color var(--duree) var(--courbe),border-color var(--duree) var(--courbe)}
.etat-attente{border-left-color:var(--ambre)}
.etat-ok{background:var(--vert-doux);border-left-color:var(--vert)}
.etat-du{background:var(--corail-doux);border-left-color:var(--corail)}
.etat-info{background:var(--azur-doux);border-left-color:var(--azur)}
/* la marge de gauche absorbe le bord : rien ne se decale */
.demande.etat-attente,.demande.etat-ok,.demande.etat-du,.demande.etat-info,
.ligne.etat-attente,.ligne.etat-ok,.ligne.etat-du,.ligne.etat-info,
.client-l.etat-attente,.client-l.etat-ok,.client-l.etat-du,.client-l.etat-info,
.agenda.etat-attente,.agenda.etat-ok,.agenda.etat-du,.agenda.etat-info,
.atraiter.etat-attente,.atraiter.etat-ok,.atraiter.etat-du,.atraiter.etat-info,
.bandeau.etat-attente,.bandeau.etat-ok,.bandeau.etat-du,.bandeau.etat-info,
.racc.etat-attente,.racc.etat-ok,.racc.etat-du,.racc.etat-info{padding-left:calc(var(--marge) - 3px)}
.racc.etat-attente,.racc.etat-ok,.racc.etat-du,.racc.etat-info{padding-left:13px}
/* la carte de coach (pages de referencement, 18/09) : le texte et la ligne d'heures absorbent le bord */
.coach.etat-attente .txt,.coach.etat-attente .creneaux{padding-left:calc(var(--marge) - 3px)}
.racc.etat-ok{background:linear-gradient(var(--vert-doux),var(--vert-doux)) var(--papier)}
.racc.etat-du{background:linear-gradient(var(--corail-doux),var(--corail-doux)) var(--papier)}
.racc.etat-info{background:linear-gradient(var(--azur-doux),var(--azur-doux)) var(--papier)}
/* le bandeau porte deja un trait de gauche : l'etat le recolore, il n'en ajoute pas */
.bandeau.etat-ok{border-left-color:var(--vert)} .bandeau.etat-du{border-left-color:var(--corail)}
.bandeau.etat-attente{border-left-color:var(--ambre)} .bandeau.etat-info{border-left-color:var(--azur)}
/* dans un aplat, le tertiaire remonte a l'ardoise (la brume tombait a 2,7 contre 1, 3,7
   en nuit). C'est LE JETON qui change, pas une liste de classes : tout ce qui, dans
   l'aplat, ecrit var(--brume) (une vue, un .meta, un .s, un .hint, une icone) devient
   ardoise sans qu'aucune feuille ait a le savoir. Une vue ne peut donc plus repasser
   dessous en redeclarant la brume : elle n'existe plus a l'interieur de l'aplat. */
.etat-ok,.etat-du,.etat-info{--brume:var(--ardoise)}
:is(.etat-ok,.etat-du,.etat-info) :is(.c12,.meta,.d,.l,.gris,.delai,.cap){color:var(--ardoise)}
/* le prix ou le chiffre d'une ligne encaissee : marine, plein, jamais vert */
/* LA PASTILLE PLEINE D'ETAT : la pastille .etat (6.5) prend l'aplat de sa couleur et
   perd son trait ; le point et le texte ne changent pas. */
.etat.pleine{border-color:transparent;color:var(--encre);background:var(--teinte-5)}
.etat.pleine.vert{background:var(--vert-doux)} .etat.pleine.ambre{background:var(--ambre-doux)}
.etat.pleine.corail{background:var(--corail-doux)} .etat.pleine.azur{background:var(--azur-doux)}
.etat.azur::before{background:var(--azur)}
/* LE POINT PLEIN : la plus petite unite d'etat, ronde (regle 6), 8 px, a poser a
   cote d'un nom, d'une heure, d'un jour. .grand fait 10 px. */
.point{display:inline-block;width:8px;height:8px;border-radius:var(--rayon-doigt);
       background:var(--brume);flex:0 0 auto;vertical-align:middle}
.point.grand{width:10px;height:10px}
.point.vert{background:var(--vert)} .point.ambre{background:var(--ambre)}
.point.corail{background:var(--corail)} .point.azur{background:var(--azur)}
/* LE CHIFFRE QUI A UN ETAT : l'argent encaisse aujourd'hui se lit dans un aplat vert,
   pas en chiffres verts. Un objet graphique, pas une cellule. */
.chiffre-etat{display:inline-flex;flex-direction:column;gap:2px;padding:10px 14px 11px;
              border-left:3px solid var(--filet);background:var(--papier2);min-width:112px}
.chiffre-etat .v{font-family:var(--titre);font-weight:700;font-size:24px;line-height:26px;
                 letter-spacing:-.028em;font-variant-numeric:tabular-nums;white-space:nowrap}
.chiffre-etat .cap{color:var(--ardoise)}
.chiffre-etat.ok{background:var(--vert-doux);border-left-color:var(--vert)}
.chiffre-etat.du{background:var(--corail-doux);border-left-color:var(--corail)}
.chiffre-etat.attente{background:var(--ambre-doux);border-left-color:var(--ambre)}
.chiffre-etat.info{background:var(--azur-doux);border-left-color:var(--azur)}
.chiffres-etat{display:flex;gap:8px;padding:6px var(--marge) 14px;overflow-x:auto;scrollbar-width:none}
.chiffres-etat::-webkit-scrollbar{display:none}
/* LE CHIFFRE CALME (12/09) : un chiffre qui n'a PAS encore d'etat (0 € rentre, 0 cours
   regle) n'est pas une boite grise bordee de gris dans une rangee de boites : il est
   POSE, sans fond ni bord, le nombre en ardoise, et la phrase qui explique le zero
   dessous (.pourquoi). Dans une rangee, seuls les chiffres qui ONT un etat portent un
   aplat : l'oeil va droit a eux. Des qu'il prend une valeur, la vue remplace .calme par
   .ok / .du / .attente / .info et la transition fait le reste. */
.chiffre-etat.calme{background:transparent;border-left-color:transparent;padding-left:0;padding-right:6px}
.chiffre-etat.calme .v{color:var(--ardoise)}
.chiffre-etat .pourquoi{font-size:12px;line-height:16px;color:var(--ardoise);white-space:normal;max-width:132px}
.chiffre-etat:not(.calme) .pourquoi{display:none}
/* les chiffres qui ont un etat, SUR LE MARINE (.encre-pose) : la tuile garde son aplat
   (la couleur d'etat se pose sur le marine, le blanc voile la souleve), le bord plein a
   gauche, le texte blanc. Plus de cellules bordees de blanc voile sur fond marine. */
.encre-pose .chiffres-etat{padding-top:4px}
.encre-pose .chiffre-etat{color:var(--contre-txt);
  background:linear-gradient(rgba(255,255,255,.07),rgba(255,255,255,.07)) var(--contre);border-left-color:rgba(255,255,255,.3)}
/* 78 %, et non 72 : sur l'aplat ambre pose sur le --contre de nuit, 72 % tombait a 4,43 ; 78 % tient a 5,0 */
.encre-pose .chiffre-etat .cap,.encre-pose .chiffre-etat .pourquoi{color:rgba(255,255,255,.78)}
.encre-pose .chiffre-etat.ok{background:linear-gradient(var(--vert-doux),var(--vert-doux)),linear-gradient(rgba(255,255,255,.05),rgba(255,255,255,.05)) var(--contre);border-left-color:var(--vert)}
.encre-pose .chiffre-etat.du{background:linear-gradient(var(--corail-doux),var(--corail-doux)),linear-gradient(rgba(255,255,255,.05),rgba(255,255,255,.05)) var(--contre);border-left-color:var(--corail)}
.encre-pose .chiffre-etat.attente{background:linear-gradient(var(--ambre-doux),var(--ambre-doux)),linear-gradient(rgba(255,255,255,.05),rgba(255,255,255,.05)) var(--contre);border-left-color:var(--ambre)}
.encre-pose .chiffre-etat.info{background:linear-gradient(var(--azur-doux),var(--azur-doux)),linear-gradient(rgba(255,255,255,.05),rgba(255,255,255,.05)) var(--contre);border-left-color:var(--azur)}
.encre-pose .chiffre-etat.calme{background:transparent;border-left-color:transparent}
.encre-pose .chiffre-etat.calme .v{color:rgba(255,255,255,.78)}
/* la pastille pleine sur le marine : l'aplat d'etat se voit a peine sur l'encre, le
   blanc voile le porte ; le texte reste blanc */
.encre-pose .etat.pleine{color:var(--contre-txt);background:linear-gradient(rgba(255,255,255,.1),rgba(255,255,255,.1)) var(--contre)}
.encre-pose .etat.pleine.vert{background:linear-gradient(var(--vert-doux),var(--vert-doux)),linear-gradient(rgba(255,255,255,.08),rgba(255,255,255,.08)) var(--contre)}
.encre-pose .etat.pleine.ambre{background:linear-gradient(var(--ambre-doux),var(--ambre-doux)),linear-gradient(rgba(255,255,255,.08),rgba(255,255,255,.08)) var(--contre)}
.encre-pose .etat.pleine.corail{background:linear-gradient(var(--corail-doux),var(--corail-doux)),linear-gradient(rgba(255,255,255,.08),rgba(255,255,255,.08)) var(--contre)}
.encre-pose .etat.pleine.azur{background:linear-gradient(var(--azur-doux),var(--azur-doux)),linear-gradient(rgba(255,255,255,.08),rgba(255,255,255,.08)) var(--contre)}

/* --- 6.31 · LE GLISSER-DEPOSER AU DOIGT (.deposable, .saisi) -------------
   Une rangee dont on change l'ordre au doigt (Athlon.glisserDeposer, 7.21) :
   la carte saisie se souleve d'un rien (1,04), suit le doigt (--dx), les
   voisines glissent (reordonner), et elle se pose au ressort. Pas d'ombre
   (regle 5) : c'est l'echelle et l'opacite des autres qui disent « saisie ». */
.deposable>*{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}
.deposable .saisi{position:relative;z-index:2;transform:translateX(var(--dx,0px)) scale(1.04);transition:none;cursor:grabbing}
.deposable.depose>*:not(.saisi){opacity:.82;transition:opacity var(--duree-courte) var(--courbe)}
.deposable .repose{transition:transform var(--duree) var(--ressort)}
.deposable.depose{scroll-snap-type:none;cursor:grabbing}

/* --- 6.30 · LE GLISSEMENT QUI DECIDE (.decider) ------------------------
   « Quand on peut glisser, ca accepte, ca refuse. » LE GESTE EST LA PREMIERE
   ACTION, le bouton la seconde. On glisse la ligne a DROITE pour la premiere
   decision (le fond vert grandit sous le doigt, la coche arrive), a GAUCHE pour
   la seconde (fond corail, croix). Avant le seuil (42 % de la largeur), on peut
   relacher : la ligne revient au ressort et rien ne se passe. Au seuil, un a-coup
   et une vibration ; au-dela, la ligne part, se replie en hauteur, et un toast
   « Annuler » de cinq secondes apparait : le serveur n'est appele qu'apres.
   Athlon.glisserPourDecider(ligne, { droite:{…}, gauche:{…} }) construit tout :
     <div class="decider">
       <div class="fond droite vert"><span class="co">ICONE coche Accepter</span></div>
       <div class="fond gauche corail"><span class="co">Refuser ICONE croix</span></div>
       <div class="dessus"> … la ligne telle qu'elle etait … </div>
       <button class="ouvre-menu">…</button>
     </div>
   Le fond n'est pas une bande de la couleur pleine des le depart : il est en aplat
   DOUX tant que le seuil n'est pas franchi (on peut encore se raviser), et il
   devient PLEIN au seuil (.pret) : la couleur dit ou l'on en est avant le texte.
   Le libelle sur le fond plein est blanc sur vert et corail (3,4 et 3,7 contre 1,
   le seuil des composants d'interface est 3), marine sur ambre et azur. */
.decider{position:relative;overflow:hidden;background:var(--papier)}
.decider+.decider{border-top:1px solid var(--filet2)}
.decider .fond{position:absolute;inset:0;display:flex;align-items:center;
               padding:0 var(--marge);opacity:0;
               transition:background-color var(--duree-courte) var(--courbe),color var(--duree-courte) var(--courbe)}
.decider .fond.droite{justify-content:flex-start}
.decider .fond.gauche{justify-content:flex-end}
.decider .fond.vert{background:var(--vert-doux);color:var(--encre)}
.decider .fond.corail{background:var(--corail-doux);color:var(--encre)}
.decider .fond.ambre{background:var(--ambre-doux);color:var(--encre)}
.decider .fond.azur{background:var(--azur-doux);color:var(--encre)}
/* le fond plein « Accepter » est TILLEUL : le blanc n'y tient pas (2,27), le marine oui (6,69) */
.decider .fond.pret.vert{background:var(--vert);color:#16263F}
.decider .fond.pret.corail{background:var(--corail);color:#fff}
.decider .fond.pret.ambre{background:var(--ambre);color:var(--encre)}
.decider .fond.pret.azur{background:var(--azur);color:var(--azur-fg)}
.decider .fond.visible{opacity:1}
/* le libelle suit le doigt : cache derriere le bord tant que la fente fait moins de
   72 px, en place ensuite. --dx est la largeur decouverte, posee par le code. */
.decider .fond .co{display:inline-flex;align-items:center;gap:8px;font-family:var(--titre);
                   font-weight:700;font-size:14px;letter-spacing:-.01em;white-space:nowrap;
                   transition:transform var(--duree-acoup) var(--courbe)}
.decider .fond.droite .co{transform:translateX(calc(min(var(--dx,0px),72px) - 72px))}
.decider .fond.gauche .co{transform:translateX(calc(72px - min(var(--dx,0px),72px)))}
/* au seuil, le libelle passe a 19 px : blanc sur vert plein (3,4) et sur corail plein (3,7)
   tiennent le seuil des grands textes gras (3 contre 1), la couleur d'un instant ou pas */
.decider .fond.pret .co{transform:none;font-size:19px;letter-spacing:-.02em}
.decider .fond .ic{stroke-width:2.2}
.decider .dessus{position:relative;z-index:1;background:var(--papier);touch-action:pan-y;
                 -webkit-user-select:none;user-select:none;-webkit-touch-callout:none;
                 transition:transform var(--duree) var(--ressort)}
.decider .dessus.suit{transition:none}
.decider .dessus.part{transition:transform var(--duree-courte) var(--courbe)}
/* pendant le glissement le fond de la ligne garde le papier : l'aplat d'etat qu'elle
   portait (6.29) reste dans .dessus, il glisse avec elle. */
.decider .ouvre-menu{position:absolute;top:8px;right:5px;z-index:2;width:30px;height:32px;
                     display:grid;place-items:center;color:var(--brume)}
.decider.avec-menu .dessus>*{padding-right:36px}
/* La ligne qui revient apres « Annuler » : elle se deplie (Athlon.deplier) puis fait
   un a-coup ; rien d'autre a ecrire. */

/* --- 6.32 · SECTION REPLIABLE (.sec) -----------------------------------
   Un ecran de reglages est une pile de sections FERMEES SUR LEUR RESUME : le pli
   cache le detail, jamais l'etat. Le meme dessin des deux cotes (Reglages du
   coach, Reglages du client) depuis le 13/09 : avant, la regle vivait dans
   reglages.js et le client n'avait rien. Le titre est un bouton nomme .tete :
   c'est un NOM D'ENFANT, pas la barre du haut, d'ou la meme remise a zero que
   .demande .tete et .fiche .tete (3.1). Sans elle, le titre d'une section
   ouverte restait collant, se posait au sommet et passait PAR-DESSUS le bouton
   du tiroir (vu le 13/09 : « La reservation » chevauchait le menu). */
.sec+.sec{border-top:1px solid var(--filet)}
.sec>.tete{position:static;z-index:auto;border:0;min-height:0;background:none;
  display:flex;align-items:center;gap:12px;width:100%;
  padding:17px var(--marge) 15px;text-align:left;color:var(--encre)}
.sec>.tete .t{flex:1;min-width:0;font-family:var(--titre);font-weight:600;
  font-size:17px;line-height:21px;letter-spacing:-.018em}
.sec>.tete .r{flex:0 0 auto;max-width:46%;font-size:12px;line-height:16px;
  color:var(--brume);font-variant-numeric:tabular-nums;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sec>.tete .ch{flex:0 0 auto;color:var(--brume);
  transition:transform var(--duree-courte) var(--courbe)}
.sec>.tete[aria-expanded="true"] .ch{transform:rotate(180deg)}
.sec>.tete[aria-expanded="true"] .r{display:none}
.sec>.co{padding-bottom:10px}
/* La rangee « Se deconnecter » d'un ecran de profil suit la regle du tiroir (6.17) :
   SEULE L'ICONE est corail, le mot reste encre. */
.ligne.sortie>.ic:first-child{color:var(--corail)}

/* --- 6.33 · LES DATES QUI GLISSENT (.dates) ------------------------------
   Nils, 13/09 : « t'es dans les fleches ou il y a les dates : est-ce que ca
   glisse ? » Toute zone qui porte des dates (la bande de sept jours, le mois, la
   periode des statistiques, le mois de l'argent) est armee par
   Athlon.glisserDates(zone, …) : elle devient .dates. La zone est le CADRE : il
   coupe (overflow), il laisse le defilement vertical au navigateur
   (touch-action:pan-y) et il retient la roue horizontale du navigateur
   (overscroll-behavior-x). Ce qui bouge, c'est SON CONTENU : chaque enfant suit
   --dx, que le composant ecrit pendant le geste.
     .suit     le doigt est pose : aucune transition, le contenu colle au doigt ;
     .revient  relache sous le seuil : retour a 0 sur --ressort ;
     .pret     le seuil est franchi (22 % de la largeur) : l'a-coup vient de
               Athlon.haptique, la classe est la pour qui veut marquer l'etat ;
     .butee    peutPrecedent()/peutSuivant() a dit non : le contenu resiste (un
               quart du deplacement) et le cadre le dit par un trait au bord ;
     .change   l'echange est en cours : le calque .dates-sortant, pose par-dessus,
               emporte l'ancien contenu pendant que le nouveau entre ;
     [aria-busy=true]  la vue a rendu une promesse et on l'attend. Sous mouvement
               reduit il n'y a pas de calque : l'ancien contenu reste en place et
               prend l'opacite d'attente, sans transition, puis le nouveau s'affiche
               d'un coup.
   Les fleches de la vue restent a cote : le geste s'ajoute, il ne retire rien. */
.dates{position:relative;overflow:hidden;touch-action:pan-y;overscroll-behavior-x:contain;
       -webkit-user-select:none;user-select:none;outline-offset:-2px}
.dates:focus-visible{outline:2px solid var(--azur)}
.dates>*{transform:translateX(var(--dx,0px))}
.dates.suit>*{transition:none}
.dates.revient>*{transition:transform var(--duree) var(--ressort)}
.dates.butee::after{content:"";position:absolute;top:0;bottom:0;width:2px;background:var(--filet);
  pointer-events:none;opacity:0;transition:opacity var(--duree-courte) var(--courbe)}
.dates.butee[data-butee="gauche"]::after{left:0;opacity:1}
.dates.butee[data-butee="droite"]::after{right:0;opacity:1}
.dates>.dates-sortant{position:absolute;top:0;left:0;right:0;transform:none;transition:none;
  pointer-events:none;z-index:1}
.dates.change>*:not(.dates-sortant){pointer-events:none}
.dates[aria-busy="true"]>*:not(.dates-sortant){opacity:.55;transition:none}

/* ═══════════════ 7 · ETATS DE PAGE ═══════════════ */

/* --- 7.1 · ETAT VIDE (.vide) ------------------------------------------
   Un dessin au trait, une phrase qui dit quoi faire, un seul bouton. */
.vide{padding:44px var(--marge) 40px;text-align:center;display:flex;flex-direction:column;
      align-items:center;gap:0}
.vide .dessin{width:84px;height:84px;border:1px solid var(--filet);display:grid;place-items:center;
              color:var(--brume);border-radius:var(--rayon-doigt);margin-bottom:18px}
.vide h2{font-family:var(--titre);font-weight:600;font-size:17px;line-height:21px;letter-spacing:-.018em}
.vide p{font-size:13px;line-height:18px;color:var(--brume);margin-top:8px;max-width:30ch}
.vide .action,.vide .second{margin-top:18px}

/* --- 7.2 · CHARGEMENT (.squelette, .rond) ------------------------------ */
.chargement{padding:24px var(--marge)}
.squelette{background:var(--papier2);display:block;height:12px;position:relative;overflow:hidden}
.squelette+.squelette{margin-top:9px}
.squelette.photo{height:186px;margin:0 0 12px}
.squelette.titre{height:18px;width:62%}
.squelette.court{width:38%}
.squelette::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,var(--filet2),transparent);
  animation:athlon-passe 1.25s infinite}
@keyframes athlon-passe{100%{transform:translateX(100%)}}
.rond{width:18px;height:18px;border:2px solid var(--filet);border-top-color:var(--encre);
      border-radius:var(--rayon-doigt);animation:athlon-tourne .7s linear infinite;flex:0 0 auto}
.action .rond{border-color:rgba(22,38,63,.3);border-top-color:var(--azur-fg)}
@keyframes athlon-tourne{100%{transform:rotate(360deg)}}
/* TIRER POUR ACTUALISER (.actualiser, Athlon.rafraichir, 7.26 du LISEZ-MOI ; systeme depuis le
   19/09, la meme ecriture vivait dans /moi/ et /rechercher/). Une bande de hauteur nulle en tete
   du corps, que le doigt ouvre en tirant la page tout en haut ; le rond du systeme s'y devoile
   (opacite) et tourne pendant la relecture. `suit` : elle suit le doigt, sans transition ;
   `arme` : le seuil est passe, le rond est plein ; `va` : la relecture court. Jetons partout :
   0 ms sous mouvement reduit. */
.actualiser{height:0;overflow:hidden;display:flex;align-items:center;justify-content:center;
            transition:height var(--duree-courte) var(--courbe)}
.actualiser.suit{transition:none}
.actualiser .rond{opacity:0;animation-play-state:paused;transition:opacity var(--duree-courte) linear}
.actualiser.arme .rond{opacity:1}
.actualiser.va .rond{opacity:1;animation-play-state:running}
@media(prefers-reduced-motion:reduce){
  :root{--duree-courte:0ms;--duree:0ms;--duree-acoup:0ms;--duree-compte:0ms;--duree-pousser:0ms;--duree-fondu:0ms;--duree-volet:0ms;--duree-parait:0ms}
  *{animation-duration:.01ms !important;transition-duration:.01ms !important}
}

/* --- 7.3 · MESSAGE D'ERREUR (.erreur) ---------------------------------
   Le corail porte le TRAIT de gauche, jamais le texte. */
.erreur{margin:12px var(--marge);padding:11px 13px;background:var(--papier2);
        border-left:3px solid var(--corail);display:flex;gap:10px;align-items:flex-start}
.erreur .co{min-width:0;flex:1}
.erreur .t{font-family:var(--titre);font-weight:600;font-size:13px;line-height:17px}
.erreur .d{font-size:13px;line-height:17px;color:var(--ardoise);margin-top:3px}
.erreur .lien{margin-top:8px}
.erreur.douce{border-left-color:var(--ambre)}
.erreur.bonne{border-left-color:var(--vert)}

/* --- 7.4 · TOAST (.toast) ---------------------------------------------
   Une phrase, en bas, au-dessus de tout. Jamais deux a la fois. */
.toasts{position:fixed;left:calc(50% + var(--decalage)/2);transform:translateX(-50%);bottom:calc(var(--bas) + 16px);
        width:100%;max-width:var(--colonne);padding:0 var(--marge);z-index:60;
        display:flex;flex-direction:column;gap:8px;pointer-events:none}
.toast{background:var(--contre);color:var(--contre-txt);padding:12px 14px;display:flex;
       align-items:center;gap:10px;font-size:13px;line-height:17px;border:1px solid var(--filet);
       opacity:0;transform:translateY(8px);
       transition:opacity var(--duree-courte) var(--courbe),transform var(--duree-courte) var(--courbe)}
.toast.ouvert{opacity:1;transform:translateY(0);transition:opacity var(--duree-courte) var(--courbe),transform var(--duree) var(--ressort-doux)}
.toast .ic{color:var(--contre-txt)}
.toast.faute{background:var(--corail);color:#fff}
.toast.faute .ic{color:#fff}
/* LE TOAST QUI S'ANNULE (12/09, Athlon.annulable). Une phrase, un bouton « Annuler »,
   et une barre qui se vide en bas : le temps qu'il reste pour se raviser. Le geste
   (6.30) s'en sert pour ne parler au serveur qu'apres ce delai. C'est le seul toast
   qui se touche : le bac reste transparent aux doigts, lui non. La barre est une
   transition lineaire de la largeur, lancee par le code ; le nombre dans le bouton
   compte aussi, pour qui a demande moins d'animation (la barre saute alors a zero). */
.toast.annulable{pointer-events:auto;position:relative;padding-right:8px;padding-bottom:14px}
.toast.annulable .annuler{flex:0 0 auto;font-family:var(--titre);font-weight:700;font-size:12px;
      letter-spacing:.06em;text-transform:uppercase;color:var(--contre-txt);padding:6px 10px;
      border:1px solid rgba(255,255,255,.42);display:inline-flex;align-items:center;gap:6px;
      font-variant-numeric:tabular-nums}
.toast.annulable .annuler:active{transform:scale(.98)}
/* « Annuler » se dessine a 31 px de haut ; sa zone de toucher fait 44 (regle 15), par le meme
   pseudo-element invisible que .lien : le dessin du toast ne bouge pas. */
.toast.annulable .annuler{position:relative}
.toast.annulable .annuler::before{content:"";position:absolute;top:50%;left:50%;width:max(100%,44px);height:44px;
  transform:translate(-50%,-50%)}
.toast.annulable .compte{position:absolute;left:0;bottom:0;height:3px;width:100%;
      background:var(--azur);transition:width linear;transform-origin:left}
.toast.annulable.corail .compte{background:var(--corail)}
.toast.annulable.vert .compte{background:var(--vert)}

/* --- 7.5 · L'INVITATION A INSTALLER (.poser-athlon) ---------------------------
   UNE RANGEE SOBRE (12/09), plus un encart : une icone marine, un texte marine de
   14 px, un chevron, sur --papier2 ; toute la rangee est un bouton qui ouvre le
   tiroir du bas (marche a suivre d'iPhone, vrai bouton d'Android, « Ne plus
   proposer »). Elle ne pose AUCUN aplat azur : l'azur plein est l'action de
   l'ecran, il n'y en a qu'une par ecran, et ce n'est jamais elle.
   Elle ne parait QUE sur le tableau de bord de l'espace du coach et sur /moi/ du
   client, sur un telephone, a partir de la deuxieme visite, une fois par session,
   et plus jamais si on la ferme (Athlon.revoirLaPose() la retire quand l'espace
   change d'ecran).

   ELLE NE FLOTTE PAS. C'est LA regle, et elle vient d'une mesure du 10/09 : posee en
   `position:fixed`, la bande occupait 145 px — 17 % de l'ecran — par-dessus le contenu,
   doigts compris. Sur /rechercher/, elementFromPoint rendait la bande, et deux pastilles
   d'horaire RESERVABLES (09:00, 10:00) dormaient dessous. Elle est donc DANS LE FLUX, en
   dernier enfant de .corps : elle pousse le contenu au lieu de le couvrir, elle passe sous
   les feuilles et les dialogues sans z-index, et le degagement de .corps (3.3) la porte.
   --h-pose reste declaree a 0 px en 3.3. */
.poser-athlon{width:100%;max-width:var(--colonne);margin:22px auto 0;
      padding:0 var(--marge);opacity:0;transform:translateY(8px);
      transition:opacity var(--duree) var(--courbe),transform var(--duree) var(--courbe)}
.poser-athlon.ouverte{opacity:1;transform:translateY(0)}
.poser-athlon .rangee{display:flex;align-items:center;gap:12px;width:100%;min-height:52px;
      padding:12px 12px 12px 14px;background:var(--papier2);color:var(--encre);text-align:left;
      border-left:3px solid var(--filet)}
.poser-athlon .rangee:hover{background:var(--papier3)}
.poser-athlon .rangee .ic{flex:0 0 auto;color:var(--encre)}
.poser-athlon .rangee .t{flex:1;min-width:0;font-family:var(--titre);font-weight:600;font-size:14px;
      line-height:18px;letter-spacing:-.012em;color:var(--encre)}
.poser-athlon .rangee .chevron{transform:rotate(-90deg);color:var(--brume)}
/* le tiroir qu'elle ouvre */
.pose-marche{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:4px var(--marge) 12px}
.pose-marche .vignette{width:40px;height:40px;flex:0 0 auto;border-radius:10px;display:block;
      border:1px solid var(--filet)}  /* l'icone du coach est blanche : sans ce filet, elle flotterait */
.pose-marche p{flex:1;min-width:0;font-size:14px;line-height:19px;color:var(--ardoise)}
.pose-marche .marche{flex:1 0 100%;display:flex;align-items:center;gap:8px;padding:10px 12px;
      background:var(--papier2);font-size:14px;line-height:19px;color:var(--encre)}
.pose-marche .marche .ic{flex:0 0 auto;color:var(--encre)}

/* ─── 6.34 · DOCUMENT JURIDIQUE .doc (18 septembre 2026) ─────────────────────────
   Une page de conditions, de politique ou de mentions : un long texte lu au telephone.
   La coque est la meme (.tete, .corps.sous-rien) ; .doc ajoute ce qu'un long texte
   demande et que le systeme n'avait pas : des titres de section numerotes, des listes,
   une citation, un sommaire en rangees de 44 px, et l'alternance de fonds (regle 9 : une
   section sur deux est posee). Les blancs a remplir par l'entite ([[CROCHETS]]) portent
   .blanc : un trait ambre en dessous, jamais du texte ambre (regle 2). Une seule police
   de texte (Manrope 14 sur 20, un peu plus aere que le 14 sur 18 courant : on lit
   longtemps), les titres en Archivo. Aucune couleur en dur, aucun rayon. */
.doc .entete{padding:14px var(--marge) 6px}
.doc .entete .cartouche{padding-left:0;padding-right:0}
.doc .entete p{font-size:14px;line-height:20px;color:var(--ardoise);margin:8px 0 6px}
.doc .sommaire{padding:6px 0 8px}
.doc .sommaire .section{padding-bottom:4px}
.doc .sommaire a{position:relative;display:flex;align-items:baseline;gap:12px;min-height:44px;
      padding:12px var(--marge);font-size:14px;line-height:20px;color:var(--encre);text-decoration:none}
.doc .sommaire a+a{border-top:1px solid var(--filet2)}
.doc .sommaire a .n{flex:0 0 24px;font-family:var(--titre);font-weight:600;font-size:12px;
      color:var(--brume);font-variant-numeric:tabular-nums}
.doc .sommaire a:hover{background:var(--papier3)}
.doc article>section{padding:20px var(--marge) 8px}
.doc article>section.pose{padding-top:20px;padding-bottom:8px}
.doc h2{font-family:var(--titre);font-weight:600;font-size:20px;line-height:24px;letter-spacing:-.022em;
      color:var(--encre);margin:0 0 12px;scroll-margin-top:64px}
.doc h2 .n{color:var(--brume);margin-right:8px;font-variant-numeric:tabular-nums}
.doc h3{font-family:var(--titre);font-weight:600;font-size:15px;line-height:19px;letter-spacing:-.012em;
      color:var(--encre);margin:16px 0 6px}
.doc p,.doc li{font-size:14px;line-height:20px;color:var(--encre);margin:0 0 12px}
.doc li{margin-bottom:6px}
.doc ul,.doc ol{margin:0 0 12px;padding-left:22px}
.doc li>ul,.doc li>ol{margin-top:6px}
.doc blockquote{margin:0 0 12px;padding:10px 14px;border-left:3px solid var(--encre);background:var(--papier2)}
.doc .pose blockquote{background:var(--papier)}
.doc blockquote p:last-child{margin-bottom:0}
.doc strong{font-weight:700}
.doc p a,.doc li a{color:var(--encre);text-decoration:underline;text-underline-offset:2px;
      /* un lien dans une phrase : le padding vertical d'un element en ligne ne bouge pas la
         ligne mais agrandit la zone de toucher a 44 px (regle 15), sans pseudo-element */
      padding:12px 0}
.doc .blanc{font-family:var(--titre);font-weight:600;letter-spacing:.01em;border-bottom:2px solid var(--ambre);
      overflow-wrap:anywhere}
.doc .pied-doc{padding-top:4px;padding-bottom:26px}
.doc .pied-doc .ligne .fort{color:var(--contre-txt)}
.doc .pied-doc .ligne .c12{color:rgba(255,255,255,.72)}
.doc .pied-doc .ligne .ic{color:rgba(255,255,255,.72)}
.doc .pied-doc .section .cap{color:rgba(255,255,255,.72)}
.doc .pied-doc p{color:rgba(255,255,255,.78);font-size:12px;line-height:16px;padding:12px var(--marge) 0;margin:0}
.doc .pied-doc .ligne+.ligne{border-top-color:rgba(255,255,255,.14)}

/* ═══════════════ 8 · IMPRESSION ET SANS JAVASCRIPT ═══════════════ */
.si-js{display:none}
html.js .si-js{display:revert}
html.js .si-pas-js{display:none}
/* .si-clavier (12/09) : le DOUBLON d'un geste, pour qui ne glisse pas. Sur un telephone il
   n'existe pas (le geste et le menu « … » suffisent, et une rangee de boutons encadres
   sous chaque ligne refaisait un tableau) ; il parait a la souris sur un grand ecran, et
   des la premiere tabulation (html.clavier, posee par athlon.js). */
.si-clavier{display:none}
html.clavier .si-clavier{display:revert}
@media (hover:hover) and (pointer:fine) and (min-width:1000px){.si-clavier{display:revert}}

/* --- 6.34 · LES PAGES DE REFERENCEMENT (18 septembre 2026) --------------
   /cours/<sport>/<ville>/, /coach-a/<ville>/, /guide/<article>/ : des pages
   rendues par le Worker, lues par un robot autant que par un client. Trois
   pieces manquaient au systeme, et deux classes locales de l'accueil (la
   vignette de discipline .sportv, le pied sur le marine .pied-encre) sont
   remontees ici pour que ces pages les partagent sans les recopier. */

/* le fil d'Ariane : une ligne de 12 px en brume, le dernier maillon en encre ;
   chaque lien garde ses 44 px de zone de toucher par un ::before invisible */
.ariane{display:flex;flex-wrap:wrap;align-items:center;gap:2px 0;list-style:none;margin:0;
        padding:10px var(--marge) 0;font-size:12px;line-height:16px;color:var(--brume)}
.ariane li{display:flex;align-items:center;min-width:0}
.ariane li+li::before{content:"/";margin:0 6px;color:var(--brume)}
.ariane a{position:relative;color:var(--ardoise);text-decoration:none;font-weight:600}
.ariane a::before{content:"";position:absolute;left:50%;top:50%;width:max(100%,44px);height:44px;
                  transform:translate(-50%,-50%)}
.ariane [aria-current]{color:var(--encre);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* les questions frequentes : une pile de <details>, UN filet entre deux, la
   question en Archivo, le chevron qui tourne ; aucun cadre, aucune ombre */
.faq details{border-bottom:1px solid var(--filet)}
.faq details:first-of-type{border-top:1px solid var(--filet)}
.faq summary{display:flex;align-items:center;justify-content:space-between;gap:12px;
             min-height:56px;padding:12px var(--marge);cursor:pointer;list-style:none;
             font-family:var(--titre);font-weight:600;font-size:15px;line-height:20px;color:var(--encre)}
.faq summary::-webkit-details-marker{display:none}
.faq summary .ic{flex:0 0 auto;color:var(--brume);transition:transform var(--duree) var(--courbe)}
.faq details[open] summary .ic{transform:rotate(180deg)}
.faq .r{padding:0 var(--marge) 16px;font-size:14px;line-height:20px;color:var(--ardoise);max-width:64ch}

/* le corps d'un article ou d'une introduction : Manrope 15 sur 23, 70 signes
   par ligne, les titres en Archivo, les listes a puce simple */
.prose{padding:0 var(--marge);max-width:100%}
.prose p,.prose li{font-size:15px;line-height:23px;color:var(--encre)}
.prose p+p,.prose ul+p,.prose p+ul{margin-top:12px}
.prose h2{font-family:var(--titre);font-weight:700;font-size:20px;line-height:24px;
          letter-spacing:-.02em;margin:26px 0 10px}
.prose h3{font-family:var(--titre);font-weight:600;font-size:17px;line-height:21px;margin:20px 0 8px}
.prose ul{padding-left:18px;margin:0}
.prose li+li{margin-top:6px}
.prose a{color:var(--encre);font-weight:600;text-decoration:underline;text-underline-offset:2px}
/* [controle 21/09, regle 15] LE LIEN DANS UNE PHRASE : le nom d'un coach dans le titre de sa carte (.coach h3 a),
   « conditions d'utilisation » dans la case du tunnel (.lien-texte, remonte des deux pages qui l'ecrivaient), un
   renvoi dans un texte lu (.prose a ; .doc p a le fait deja par son padding). Il se coupe comme le texte (inline, jamais inline-flex)
   et porte la meme zone de toucher invisible de 44 px que .lien : la ligne ne bouge pas d'un pixel. */
.lien-texte{display:inline;font:inherit;font-weight:600;color:var(--encre);text-decoration:underline;text-underline-offset:2px}
.lien-texte,.prose a,.coach h3 a{position:relative}
.lien-texte::before,.prose a::before,.coach h3 a::before{content:"";position:absolute;top:50%;left:50%;
  width:calc(100% + 8px);min-width:44px;height:44px;transform:translate(-50%,-50%)}
.prose .c12{color:var(--brume)}
@media (min-width:1000px){body.marche .prose p,body.marche .prose li{max-width:60ch}}

/* la vignette de discipline (photo + nom + nombre de coachs), remontee de l'accueil */
.sportv{display:block;min-width:0}
.sportv .ph{height:104px}
.sportv .n{display:block;font-family:var(--titre);font-weight:600;font-size:13px;
           line-height:15px;letter-spacing:-.014em;margin-top:8px;min-height:30px}
.sportv .d{display:block;font-size:12px;line-height:15px;color:var(--brume);margin-top:1px}

/* le pied sur le marine, remonte de l'accueil (regle 9) */
.pied-encre .ligne+.ligne{border-top-color:rgba(255,255,255,.14)}
.pied-encre .ligne .fort{color:var(--contre-txt)}
.pied-encre .ligne .c12{color:rgba(255,255,255,.72)}
.pied-encre .ligne .ic{color:rgba(255,255,255,.72)}
.pied-encre .section .cap{color:rgba(255,255,255,.72)}

/* la photographie cliquable d'une carte : sans display:block, l'ancre s'etire */
a.ph{display:block}


/* --- 6.35 · LA PROGRESSION (carnet Strava, lot 1, 19 septembre 2026) --------
   Ce que Strava fait avec des kilometres, le carnet le fait avec des faits notes par des
   humains (docs/19, maquettes/final/strava/2 et 3). Sept objets, tous prives, tous en
   jetons, aucune couleur or : le niveau en chiffre geant (.prog-niveau), la courbe en
   ESCALIER (.prog-courbe : le niveau ne bouge qu'a une evaluation, entre deux il est plat ;
   points marine, UN SEUL point azur, aujourd'hui), le geste avec sa FLECHE depuis la
   premiere evaluation (.prog-geste), la frise du rythme (.prog-semaines : active en marine,
   en pause hachuree, vide, celle-ci cerclee), les reperes en pastilles rondes marine
   (.prog-repere, a venir en pointille), la Premiere (.prog-premiere, et sa banniere
   .prog-banniere posee sur l'etat information du systeme), l'objectif avec sa jauge
   (.prog-objectif), la saison contre la meme saison un an plus tot (.prog-compare) et le mot
   du coach (.prog-mot). Le rond du repere rejoint la courte liste de ce qui est rond (regle 6). */
.prog-niveau{display:flex;align-items:flex-end;gap:16px;padding:10px var(--marge) 4px}
.prog-niveau .grand{font-family:var(--titre);font-weight:700;font-size:56px;line-height:52px;
                    letter-spacing:-.04em;font-variant-numeric:tabular-nums}
.prog-niveau .grand small{font-size:20px;letter-spacing:-.02em;color:var(--brume);font-weight:600;margin-left:4px}
.prog-niveau .co{flex:1;min-width:0;padding-bottom:6px}
.prog-niveau .co .l{font-family:var(--titre);font-weight:600;font-size:17px;line-height:20px;letter-spacing:-.018em}
.prog-niveau .co .s{font-size:12px;line-height:16px;color:var(--brume);margin-top:3px}
.prog-courbe{padding:6px var(--marge) 0}
.prog-courbe svg{width:100%;height:auto;display:block;overflow:visible}
.prog-courbe .l{stroke:var(--encre);stroke-width:2;fill:none;stroke-linejoin:round;stroke-linecap:round}
.prog-courbe .g{stroke:var(--filet);stroke-width:1}
.prog-courbe .p{fill:var(--papier);stroke:var(--encre);stroke-width:2}
.prog-courbe .auj{fill:var(--azur);stroke:var(--azur)}
.prog-courbe text{font-family:var(--titre);font-weight:600;font-size:12px;fill:var(--brume)}
.prog-courbe text.v{fill:var(--encre)}
.prog-courbe .noms{display:flex;justify-content:space-between;gap:12px;margin-top:6px;
                   font-size:12px;line-height:16px;color:var(--brume)}
.prog-courbe .noms span:last-child{flex:0 0 auto}
/* la courbe se dessine a l'ouverture, dans le plafond du chiffre qui compte ; 0 ms sous mouvement reduit */
.prog-courbe .l.trace{stroke-dasharray:1400;stroke-dashoffset:1400;animation:prog-trace var(--duree-compte) var(--courbe) forwards}
@keyframes prog-trace{to{stroke-dashoffset:0}}
.pose .prog-courbe .p{fill:var(--papier2)}
/* la phrase du coach sous la courbe : chaque marche est un constat commente, jamais une note obtenue */
.prog-marche{padding:8px var(--marge) 4px;font-size:13px;line-height:17px;color:var(--ardoise)}
.prog-marche b{color:var(--encre);font-weight:600}
.prog-geste{display:flex;align-items:center;gap:12px;padding:8px var(--marge);min-height:56px}
.prog-geste+.prog-geste{border-top:1px solid var(--filet2)}
.prog-geste .n{flex:1;min-width:0;font-size:14px;line-height:18px;font-weight:600}
.prog-geste .n small{display:flex;align-items:center;gap:4px;font-weight:400;font-size:12px;line-height:16px;
                     color:var(--brume);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.prog-geste .n small b{font-weight:600;color:var(--ardoise)}
.prog-geste .n small .ic{width:13px;height:13px;flex:0 0 auto;color:var(--encre)}
.prog-geste .n small .ic.haut{transform:rotate(-45deg)}
.prog-geste .n small .ic.bas{transform:rotate(45deg)}
.prog-geste .v{min-width:64px;flex:0 0 auto;text-align:right;font-family:var(--titre);font-weight:600;
               font-size:17px;line-height:20px;font-variant-numeric:tabular-nums}
.prog-geste .v small{display:block;font-size:12px;line-height:14px;color:var(--brume);font-weight:500;white-space:nowrap}
.prog-semaines{display:flex;gap:4px;padding:10px var(--marge) 0}
.prog-semaines i{flex:1;height:26px;display:block;background:var(--papier2);position:relative;
                 transition:background var(--duree-courte) var(--courbe)}
.pose .prog-semaines i{background:var(--papier)}
.prog-semaines i.on{background:var(--encre)}
.prog-semaines i.pause,.pose .prog-semaines i.pause{background:repeating-linear-gradient(135deg,var(--filet) 0 2px,transparent 2px 6px)}
.prog-semaines i.now,.pose .prog-semaines i.now{outline:2px solid var(--encre);outline-offset:-2px;background:none}
.prog-semaines-l{display:flex;justify-content:space-between;padding:4px var(--marge) 0;font-size:12px;line-height:16px;color:var(--brume)}
.prog-leg{display:flex;flex-wrap:wrap;gap:6px 14px;padding:10px var(--marge) 0;font-size:12px;line-height:16px;color:var(--ardoise)}
.prog-leg span{display:inline-flex;align-items:center;gap:6px}
.prog-leg i{width:12px;height:12px;display:inline-block;background:var(--papier2)}
.pose .prog-leg i{background:var(--papier)}
.prog-leg i.on{background:var(--encre)}
.prog-leg i.pause,.pose .prog-leg i.pause{background:repeating-linear-gradient(135deg,var(--filet) 0 2px,transparent 2px 6px)}
.prog-reperes{display:grid;grid-template-columns:repeat(3,1fr);gap:16px 10px;padding:4px var(--marge) 10px}
.prog-repere{text-align:center;min-width:0}
.prog-repere .rond{width:56px;height:56px;border-radius:var(--rayon-doigt);background:var(--encre);color:var(--papier);
                   display:grid;place-items:center;margin:0 auto}
.prog-repere .rond .ic{width:22px;height:22px}
.prog-repere.avenir .rond{background:none;border:1px dashed var(--brume);color:var(--brume)}
.prog-repere .t{font-size:12px;line-height:16px;font-weight:600;margin-top:8px}
.prog-repere .d{font-size:12px;line-height:16px;color:var(--brume);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.prog-premiere{display:flex;gap:12px;padding:10px var(--marge);align-items:flex-start}
.prog-premiere+.prog-premiere{border-top:1px solid var(--filet2)}
.prog-premiere .d{font-family:var(--titre);font-weight:600;font-size:12px;line-height:16px;color:var(--brume);
                  width:64px;flex:0 0 auto;padding-top:2px}
.prog-premiere .co{flex:1;min-width:0}
.prog-premiere .co p+p{margin-top:2px}
.prog-banniere{display:flex;align-items:center;gap:12px;width:100%;text-align:left;padding:12px var(--marge);
               margin-top:8px;color:var(--encre)}
.prog-banniere .rond{width:40px;height:40px;border-radius:var(--rayon-doigt);background:var(--encre);color:var(--papier);
                     display:grid;place-items:center;flex:0 0 auto}
.prog-banniere .co{flex:1;min-width:0}
.prog-banniere .t{font-size:14px;line-height:18px;font-weight:600}
.prog-banniere .d{font-size:12px;line-height:16px;color:var(--brume);margin-top:2px}
.prog-banniere>.ic{flex:0 0 auto;color:var(--brume)}
.prog-objectif{padding:11px var(--marge)}
.prog-objectif+.prog-objectif{border-top:1px solid var(--filet2)}
.prog-objectif .l1{display:flex;justify-content:space-between;gap:10px;align-items:baseline}
.prog-objectif .l1 .v{font-family:var(--titre);font-weight:600;font-size:14px;flex:0 0 auto;font-variant-numeric:tabular-nums}
.prog-objectif .jauge-l{margin-top:8px}
.prog-objectif .jauge-l i{transition:width var(--duree-compte) var(--courbe)}
.prog-compare{display:grid;grid-template-columns:1fr 84px 84px;padding:0 var(--marge) 6px}
.prog-compare div{padding:9px 0;border-top:1px solid var(--filet2);font-size:13px;line-height:17px}
.prog-compare div.h{border-top:0;font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.06em;
                    color:var(--brume);padding-bottom:6px;text-align:right}
.prog-compare div.h:first-child{text-align:left}
.prog-compare div.n{font-family:var(--titre);font-weight:600;font-size:17px;line-height:20px;text-align:right;font-variant-numeric:tabular-nums}
.prog-compare div.n.avant{color:var(--brume);font-weight:500}
.prog-mot{padding:12px var(--marge) 14px}
.prog-mot+.prog-mot{border-top:1px solid var(--filet2)}
.prog-mot .q{font-family:var(--titre);font-weight:500;font-size:16px;line-height:21px;letter-spacing:-.012em}
.prog-mot .s{display:flex;align-items:center;gap:8px;margin-top:8px;font-size:12px;line-height:16px;color:var(--brume)}
.encre-pose .prog-mot+.prog-mot{border-top-color:rgba(255,255,255,.14)}
.encre-pose .prog-mot .s{color:rgba(255,255,255,.72)}
/* la ligne qui pousse la page d'un sport : un bouton pleine largeur, le chevron a droite */
.prog-lien{display:flex;align-items:center;gap:10px;width:100%;text-align:left;min-height:48px;padding:6px var(--marge);
           color:var(--encre);background:none;font-size:14px;line-height:18px;font-weight:600}
.prog-lien .ic{flex:0 0 auto;color:var(--brume)}
.prog-lien .ic:first-child{color:var(--encre)}
.prog-lien span{flex:1;min-width:0}
.prog-lien:hover{background:var(--papier2)}

/* --- 8 · LE NAVIGATEUR INTERNE ET LES TRANSITIONS D'ECRAN (19 septembre 2026) ----
   Athlon.naviguer change d'ecran sans recharger la page ; Athlon.transition anime le
   passage. Deux mouvements, et pas un de plus (LISEZ-MOI § 17) :
     · pousser  : le nouvel ecran entre de la droite, l'ancien recule de 30 % et s'assombrit ;
     · revenir  : l'inverse, l'ecran du dessus sort par la droite, celui du dessous revient ;
     · fondu    : entre deux onglets racines, fondu croise de 160 ms, rien ne bouge.
   Quand le navigateur sait faire des View Transitions (document.startViewTransition), c'est
   l'ECRAN ENTIER (la racine) qui est photographie : le defilement, la barre du haut, tout
   part ensemble ; la barre d'onglets porte son propre nom et reste fixe. Sinon, le repli :
   une copie de l'ancien ecran (.ecran-ombre) glisse par-dessus ou par-dessous pendant que le
   nouveau entre (.ecran-entre). Les deux lisent les memes jetons. */
.onglets{view-transition-name:athlon-onglets}
/* le tiroir du coach et son fond sont photographies a part : une fermeture encore en cours
   n'entre pas dans le fondu de l'ecran */
.tiroir{view-transition-name:athlon-tiroir}
.tiroir-fond{view-transition-name:athlon-tiroir-fond}
::view-transition-group(athlon-tiroir),::view-transition-group(athlon-tiroir-fond){z-index:4}
::view-transition-group(root),::view-transition-group(athlon-onglets){animation:none}
::view-transition-old(root),::view-transition-new(root),
::view-transition-old(athlon-onglets),::view-transition-new(athlon-onglets){
  animation:none;mix-blend-mode:normal;transform-origin:50% 50%}
::view-transition-group(athlon-onglets){z-index:3}
::view-transition-old(athlon-onglets){display:none}
/* pousser : le nouveau passe DEVANT, l'ancien recule et s'assombrit */
html[data-transition="pousser"]::view-transition-old(root){animation:athlon-recule var(--duree-pousser) var(--courbe) both}
html[data-transition="pousser"]::view-transition-new(root){z-index:2;animation:athlon-entre-droite var(--duree-pousser) var(--courbe) both}
/* revenir : l'ancien (le sous-ecran) sort par la droite, DEVANT ; le parent revient de -30 % */
html[data-transition="revenir"]::view-transition-old(root){z-index:2;animation:athlon-sort-droite var(--duree-pousser) var(--courbe) both}
html[data-transition="revenir"]::view-transition-new(root){animation:athlon-revient var(--duree-pousser) var(--courbe) both}
/* fondu : les deux se croisent, rien ne bouge */
html[data-transition="fondu"]::view-transition-old(root){animation:athlon-fondu-sort var(--duree-fondu) linear both}
html[data-transition="fondu"]::view-transition-new(root){animation:athlon-fondu-entre var(--duree-fondu) linear both}
/* la barre d'onglets qui PART (vers un ecran qui n'en a pas) suit l'ancien ecran ;
   celle qui ARRIVE suit le nouveau. Entre deux ecrans qui l'ont, elle ne bouge pas. */
html[data-onglets="part"]::view-transition-old(athlon-onglets){display:block}
html[data-transition="pousser"][data-onglets="part"]::view-transition-old(athlon-onglets){animation:athlon-recule var(--duree-pousser) var(--courbe) both}
html[data-transition="revenir"][data-onglets="part"]::view-transition-old(athlon-onglets){animation:athlon-sort-droite var(--duree-pousser) var(--courbe) both}
html[data-transition="fondu"][data-onglets="part"]::view-transition-old(athlon-onglets){animation:athlon-fondu-sort var(--duree-fondu) linear both}
html[data-transition="pousser"][data-onglets="arrive"]::view-transition-new(athlon-onglets){animation:athlon-entre-droite var(--duree-pousser) var(--courbe) both}
html[data-transition="revenir"][data-onglets="arrive"]::view-transition-new(athlon-onglets){animation:athlon-revient var(--duree-pousser) var(--courbe) both}
html[data-transition="fondu"][data-onglets="arrive"]::view-transition-new(athlon-onglets){animation:athlon-fondu-entre var(--duree-fondu) linear both}
@keyframes athlon-recule{to{transform:translateX(calc(-1 * var(--recul-ecran)));filter:brightness(calc(1 - var(--ombre-recul)))}}
@keyframes athlon-revient{from{transform:translateX(calc(-1 * var(--recul-ecran)));filter:brightness(calc(1 - var(--ombre-recul)))}}
@keyframes athlon-entre-droite{from{transform:translateX(100%)}}
@keyframes athlon-sort-droite{to{transform:translateX(100%)}}
@keyframes athlon-fondu-sort{to{opacity:0}}
@keyframes athlon-fondu-entre{from{opacity:0}}

/* LE REPLI SANS VIEW TRANSITIONS. .ecran-ombre est la photographie de l'ancien ecran : un
   cadre fixe qui couvre la fenetre, dedans la copie du DOM posee exactement ou elle etait
   (le defilement compris), et un voile qui l'assombrit. L'ecran qui entre porte
   .ecran-entre ; la classe .va, posee au trait suivant, lance le mouvement. */
.ecran-ombre{position:fixed;inset:0;padding-left:var(--decalage);z-index:21;overflow:hidden;pointer-events:none}
.ecran-ombre .cadre{position:absolute;display:flex;flex-direction:column;background:var(--papier);
                    transition:transform var(--duree-pousser) var(--courbe),opacity var(--duree-fondu) linear}
.ecran-ombre .cadre>*{flex:0 0 auto;transform:none !important}
.ecran-ombre .voile-ombre{position:absolute;inset:0;background:var(--encre);opacity:0;
                          transition:opacity var(--duree-pousser) var(--courbe)}
.ecran-ombre[data-sens="revenir"],.ecran-ombre[data-sens="fondu"]{z-index:22}
.ecran-ombre[data-sens="pousser"].va .cadre{transform:translateX(calc(-1 * var(--recul-ecran)))}
.ecran-ombre[data-sens="pousser"].va .voile-ombre{opacity:var(--ombre-recul)}
.ecran-ombre[data-sens="revenir"].va .cadre{transform:translateX(100%)}
.ecran-ombre[data-sens="fondu"].va .cadre{opacity:0}
/* le voile qui se leve du parent quand on revient (il etait recule et assombri) */
.voile-ecran{position:fixed;inset:0;padding-left:var(--decalage);z-index:21;pointer-events:none;
             background:var(--encre);opacity:var(--ombre-recul);transition:opacity var(--duree-pousser) var(--courbe)}
.voile-ecran.va{opacity:0}
.ecran-entre{will-change:transform;transition:transform var(--duree-pousser) var(--courbe),opacity var(--duree-fondu) linear}
.ecran-entre:not(.sur-photo):not(.tete){position:relative}
/* l'ecran qui entre est OPAQUE le temps du mouvement : le papier est sur .app, sous la
   photographie de l'ancien ecran ; sans ce fond, l'ancien se lisait a travers le nouveau */
.ecran-entre:not(.sur-photo){background:var(--papier)}
.ecran-entre[data-entre="pousser"]{z-index:22;transform:translateX(100%)}
.ecran-entre[data-entre="revenir"]{transform:translateX(calc(-1 * var(--recul-ecran)))}
.ecran-entre.va{transform:translateX(0)}
[inert]{pointer-events:none;cursor:default}
/* pendant qu'un ecran entre, la colonne ne montre pas de barre de defilement horizontale */
html.en-transition,html.en-transition body{overflow-x:clip}

/* LA FEUILLE AU NIVEAU iOS (19/09, § 7.5). Le fond est verrouille par position:fixed sur
   body (le seul verrou que Safari iOS respecte ; le defilement est rendu a la fermeture),
   et l'ecran derriere recule un peu : echelle .96, l'assombrissement vient du voile. */
body.fond-verrouille{position:fixed;left:0;right:0;width:100%;overflow:hidden}
.recule-feuille{transition:transform var(--duree) var(--courbe)}
.recule-feuille.va{transform:scale(var(--recul-feuille))}
/* le titre de la feuille recoit le focus a l'ouverture : c'est la feuille qui est le repere, pas un liseré */
.feuille-tete h2:focus{outline:none}

/* ═══════════════════════════════════════════════════════════════════════
   [L3] 6.36 · LES LIEUX ET LE RAYON (21/09/2026, docs/33 § 1)
   Le champ Ou (une feuille : le champ, « Autour de moi », la liste), le rond
   du rayon (la mini-carte SVG sans tuile : le cercle, les villes couvertes a
   leur vraie place), le curseur du rayon a six crans, les trois modes, et la
   carte MapLibre (chargee sur demande, dans les Reglages et l'inscription).
   Jetons seulement : l'action (--azur) fait le cercle, l'encre fait l'epingle.
   ═══════════════════════════════════════════════════════════════════════ */

/* --- le champ Ou dans sa feuille ------------------------------------------ */
/* la feuille est HAUTE (88 dvh, la hauteur maximale d'une feuille) : le champ reste au-dessus du
   clavier du telephone et la liste a la place de ses huit lignes */
.feuille.feuille-lieux{height:88dvh}
.lieux-champ{padding:4px var(--marge) 8px;position:relative}
.lieux-champ .ic{position:absolute;left:calc(var(--marge) + 14px);top:50%;transform:translateY(-50%);color:var(--brume);pointer-events:none}
.lieux-champ .champ.encadre{padding-left:44px}
.lieux{list-style:none;margin:0;padding:0 0 8px}
.lieux li{margin:0}
/* une ligne de resultat : le nom, sa region, la distance a droite ; 56 px sous le doigt */
.lieu-item{display:flex;align-items:center;gap:12px;width:100%;min-height:56px;padding:8px var(--marge);
           text-align:left;border-top:1px solid var(--filet2);background:none;color:var(--encre)}
.lieux li:first-child .lieu-item{border-top:0}
.lieu-item .ic{flex:0 0 auto;color:var(--brume)}
.lieu-item .co{min-width:0;flex:1}
.lieu-item .n{display:block;font-size:15px;line-height:19px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lieu-item .d{display:block;font-size:12px;line-height:16px;color:var(--brume);margin-top:2px}
.lieu-item .d:empty{display:none}
.lieu-item .km{flex:0 0 auto;font-family:var(--titre);font-variant-numeric:tabular-nums;font-size:13px;color:var(--ardoise)}
.lieu-item:active{background:var(--papier2)}
/* « Autour de moi » : la meme ligne, l'icone en action, la phrase de consentement dessous */
.lieu-item.autour .ic{color:var(--azur)}
.lieu-item.autour .n{color:var(--azur)}
/* le mot du bas : « Tapez deux lettres », « Aucune ville de ce nom… » */
.lieux-mot{padding:14px var(--marge) 18px;font-size:13px;line-height:18px;color:var(--ardoise)}
/* le lieu choisi, affiche a la place d'un champ (le bouton qui rouvre la feuille) */
.lieu-choisi{display:flex;align-items:center;gap:12px;width:100%;min-height:var(--h-champ);padding:0 14px;
             border:1px solid var(--filet);background:var(--papier);color:var(--encre);text-align:left;font-size:16px;line-height:20px}
.lieu-choisi .ic{flex:0 0 auto;color:var(--brume)}
.lieu-choisi .v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lieu-choisi .v small{display:block;font-size:12px;line-height:14px;color:var(--brume)}
.lieu-choisi .v.vide{color:var(--brume)}
.lieu-choisi .fl{flex:0 0 auto;color:var(--brume)}

/* --- le rond du rayon : la mini-carte sans tuile ---------------------------- */
/* 420 px au plus : au-dela, le SVG grossit ses libelles avec lui (vu a 1280) */
.rond-rayon{display:block;width:100%;max-width:420px;border:1px solid var(--filet);background:var(--papier);overflow:hidden}
.rond-rayon svg{display:block;width:100%;height:auto}
.rond-rayon .anneau{fill:none;stroke:var(--filet2);stroke-width:1}
.rond-rayon .cercle{fill:var(--azur-doux);stroke:var(--azur);stroke-width:2}
.rond-rayon .epingle{fill:var(--encre)}
.rond-rayon .voisin{fill:var(--ardoise)}
.rond-rayon text{font-family:var(--texte);font-size:11px;font-weight:600;fill:var(--brume)}
.rond-rayon text.centre{font-family:var(--titre);font-size:12px;fill:var(--encre)}
.rond-rayon text.echelle{font-family:var(--titre);font-size:11px;font-variant-numeric:tabular-nums;fill:var(--ardoise)}
.rond-rayon .trait-echelle{stroke:var(--ardoise);stroke-width:1}
/* la phrase calculee sous le rond : « jusqu'a 25 km autour de Saint-Tropez : … » */
.rond-phrase{font-size:13px;line-height:18px;color:var(--ardoise);padding:10px 0 0}
.rond-phrase b{color:var(--encre);font-weight:600}

/* --- le curseur du rayon : six crans, trois mots ------------------------------ */
.curseur-rayon{display:block}
.curseur-rayon .val{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:6px}
.curseur-rayon .val .km{font-family:var(--titre);font-weight:700;font-size:26px;line-height:30px;font-variant-numeric:tabular-nums}
.curseur-rayon .val .km small{font-size:14px;font-weight:600;margin-left:3px}
.curseur-rayon .val .mot{font-size:13px;color:var(--ardoise)}
.curseur-rayon input[type=range]{width:100%;height:44px;margin:0;-webkit-appearance:none;appearance:none;background:transparent}
.curseur-rayon input[type=range]::-webkit-slider-runnable-track{height:4px;background:var(--filet);border-radius:0}
.curseur-rayon input[type=range]::-moz-range-track{height:4px;background:var(--filet)}
.curseur-rayon input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:28px;height:28px;margin-top:-12px;
                       border-radius:50%;background:var(--azur);border:3px solid var(--papier);box-shadow:0 0 0 1px var(--azur)}
.curseur-rayon input[type=range]::-moz-range-thumb{width:22px;height:22px;border-radius:50%;background:var(--azur);border:3px solid var(--papier)}
.curseur-rayon input[type=range]:focus-visible{outline:2px solid var(--azur);outline-offset:4px}
/* les crans : six pastilles basses, la courante allumee */
.curseur-rayon .crans{display:flex;gap:6px;margin-top:4px;flex-wrap:wrap}
.curseur-rayon .crans .pastille{height:36px;padding:0 12px;font-size:13px}
.curseur-rayon .crans .pastille small{font-weight:500;color:var(--brume);margin-left:4px}
.curseur-rayon .crans .pastille.on small{color:inherit}

/* --- les trois modes : chez le client, sur place, les deux --------------------- */
.modes-lieu{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.modes-lieu .mode{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:72px;padding:10px 6px;
                  border:1px solid var(--filet);background:var(--papier);color:var(--encre);font-size:13px;line-height:16px;font-weight:600;text-align:center}
.modes-lieu .mode .ic{color:var(--brume)}
.modes-lieu .mode.on{border-color:var(--azur);background:var(--azur-doux)}
.modes-lieu .mode.on .ic{color:var(--azur)}
.modes-lieu .mode:active{transform:scale(.98)}

/* --- la carte MapLibre, sur demande ---------------------------------------- */
.carte-rayon{position:relative;width:100%;height:260px;border:1px solid var(--filet);background:var(--papier2);overflow:hidden}
.carte-rayon .maplibregl-map{position:absolute;inset:0}
.carte-rayon.attend{display:grid;place-items:center;color:var(--brume);font-size:13px}
/* l'attribution de MapLibre reste visible (OpenFreeMap l'exige) : on ne la cache jamais */
.carte-rayon .maplibregl-ctrl-attrib{font-size:11px;line-height:14px}
.carte-rayon .maplibregl-ctrl-attrib a{color:var(--ardoise)}

/* ═══════════════ 9 · LE SITE PUBLIC (21 septembre 2026, lot L1) ═══════════════
   « Un seul Worker, un seul domaine, deux rendus » (docs/32 § 3) : en dessous de 1000 px,
   l'accueil est la COQUE du telephone (barre du haut sur la photographie, barre d'onglets
   en bas) ; au-dela, c'est un SITE (en-tete de site, sections pleine largeur, pied en
   colonnes), dessine dans Boat/docs/planches/coachiamo-site/finale.html et porte ici avec
   la palette A (docs/31). En application posee (html.posee, ecrite par athlon.js quand la
   page tourne en plein ecran depuis l'icone), la coque reste, meme sur un grand ecran.
   Tout ce qui suit est SANS EFFET sur les ecrans qui ne portent pas body.site.
   Les couleurs en dur de cette section sont toutes du blanc ou un voile sombre POSE SUR
   UNE PHOTOGRAPHIE (regle 4 de la charte : le texte sur photo est blanc sur un voile,
   jamais vert), ou le noir des deux badges « comme un magasin ». */

/* --- 9.0 · body.site : la coque devient un site au-dela de 1000 px -------- */
:root{--marge-site:20px;--papier-chaud:#F7F5F0;--filet-chaud:#E6E2DA}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--papier-chaud:#141F2C;--filet-chaud:rgba(190,215,235,.18)}}
:root[data-theme="dark"]{--papier-chaud:#141F2C;--filet-chaud:rgba(190,215,235,.18)}
.contenant{width:100%;max-width:1180px;margin:0 auto;padding-left:var(--marge-site);padding-right:var(--marge-site)}
@media(min-width:1000px){
  :root{--marge-site:clamp(20px,5vw,72px)}
  html:not(.posee) body.marche.site{--colonne:100%}
  html:not(.posee) body.marche.site .app{max-width:none;box-shadow:none;padding-bottom:0}
  /* la navigation du site est son en-tete : la barre d'onglets ne monte pas en haut ici */
  html:not(.posee) body.marche.site .onglets{display:none}
  html:not(.posee) body.marche.site .corps.sous-onglets{padding-bottom:0}
  html:not(.posee) body.marche.site .tete.coque{display:none}
}

/* --- 9.1 · Le logotype (.logotype) et la barre du haut de la coque (.tete.coque) --------
   Le logotype vecteur : le monogramme du logo (le masque CSS de 4.4 bis) suivi du mot en
   Archivo 700 serre. Il prend la couleur du texte : blanc sur la photographie et sur le
   marine, vert profond sur le papier (.vert), blanc la nuit. Le mot vient du serveur
   (<span class="mot" data-marque-mot> recoit le nom sans sa premiere lettre : le C est le
   monogramme). 148 px de large sur l'accueil du telephone (charte docs/31 § 4, retouche 2 : 26,5 px de corps),
   28 px de haut dans l'en-tete du site. Le logotype bitmap de marque/ n'entre pas ici. */
.logotype{display:inline-flex;align-items:center;gap:.12em;font-family:var(--titre);font-weight:700;
          font-size:26.5px;line-height:1;letter-spacing:-.035em;color:currentColor;white-space:nowrap;
          text-decoration:none;position:relative}
.logotype .monogramme{width:1.02em;height:1.02em;margin-top:-.04em}
.logotype .mot{display:inline-block}
.logotype.vert{color:var(--action)}
:root[data-theme="dark"] .logotype.vert{color:var(--encre)}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .logotype.vert{color:var(--encre)}}
.logotype.moyen{font-size:22px}
.logotype.petit{font-size:18px}
/* un logotype qui est un lien garde ses 44 px de zone de toucher */
a.logotype::before{content:"";position:absolute;top:50%;left:50%;width:calc(100% + 8px);height:max(100%,44px);transform:translate(-50%,-50%)}
/* la barre du haut de l'accueil, posee sur la photographie : le logotype et sa legende a gauche,
   « Devenir coach » et le bouton « Menu » a droite. 64 px de haut. */
.tete.coque{min-height:64px;padding:8px 12px 8px 16px;gap:8px;justify-content:space-between}
.tete.coque .titre{display:flex;flex-direction:column;align-items:flex-start;gap:3px;overflow:visible;white-space:nowrap}
.tete.coque .titre small{margin-top:0;color:rgba(255,255,255,.84);font-size:12px;line-height:14px}
.tete.coque .droite{display:flex;align-items:center;gap:2px;flex:0 0 auto}
.tete.coque .pro-lien{display:inline-flex;align-items:center;min-height:44px;padding:0 8px;
  font:600 14px/16px var(--texte);color:var(--sur-photo);white-space:nowrap;text-decoration:underline;text-underline-offset:3px}
/* sous 360 px, la legende du logotype cede la place : le bouton « Menu » ne se coupe jamais */
@media(max-width:359px){.tete.coque .titre small{display:none}.tete.coque .pro-lien{display:none}}

/* --- 9.2 · Le bouton « Menu » (.bouton-menu) : les TROIS TRAITS et le mot, jamais l'icone seule ----
   [W1 22/09] « le menu, les trois traits, on l'ouvre » (docs/42 § 3.1) : Lucide `menu` 20 px + « Menu »,
   44 x 44 au moins, SANS bordure (fond transparent, papier 2 a l'appui). Il ouvre le volet (9.13). */
.bouton-menu{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;min-width:44px;
             padding:0 10px 0 8px;border:0;background:none;color:var(--encre);
             font-family:var(--titre);font-weight:600;font-size:14px;flex:0 0 auto;position:relative;white-space:nowrap}
.bouton-menu .ic{width:20px;height:20px}
.bouton-menu:hover{background:var(--papier2)}
.bouton-menu:active{transform:scale(.98)}
.sur-photo .bouton-menu,.bouton-menu.sur-photo{background:rgba(10,18,28,.34);color:#fff;
             -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}

/* --- 9.3 · L'en-tete de site (.site-tete), au-dela de 1000 px seulement ---------------
   Logotype, trois liens (Coachs, Comment ca marche, Devenir coach), a droite la langue
   (FR, EN a venir), « Se connecter », l'appel « Trouver un coach » (.appel : blanc sur la
   photo, contour une fois posee ; jamais un second aplat vert), le bouton « Menu ». Deux postures : .site-tete seule, en flux, sur le papier
   (les pages sans photographie d'ouverture) ; .site-tete.sur-photo, posee sur la photographie
   de l'accueil, texte blanc, qui devient .pose (fixee, papier, filet) quand la page a defile
   de 140 px (Athlon.site.teteQuiSePose). Athlon.site.entete() la rend. */
.site-tete{display:none}
@media(min-width:1000px){
  html:not(.posee) .site-tete{display:block;position:relative;z-index:20;background:var(--papier);color:var(--encre);
            border-bottom:1px solid var(--filet)}
  .site-tete .contenant{display:flex;align-items:center;gap:28px;height:76px}
  .site-tete .site-nav{display:flex;align-items:center;gap:26px;font-weight:600;font-size:15px;white-space:nowrap}
  .site-tete .site-nav a{display:inline-flex;align-items:center;min-height:44px;padding:0 2px;border-bottom:2px solid transparent;position:relative}
  .site-tete .site-nav a:hover,.site-tete .site-nav a[aria-current="page"]{border-bottom-color:var(--tilleul)}
  .site-tete .droite{margin-left:auto;display:flex;align-items:center;gap:20px;white-space:nowrap}
  .site-tete .droite>a:not(.action){display:inline-flex;align-items:center;min-height:44px;font-weight:600;font-size:15px;padding:0 2px}
  /* l'appel de droite (« Trouver un coach ») n'est PAS l'aplat d'action de la page : sur la photographie il
     est blanc a texte marine, pose il passe en contour. Le seul aplat vert de la fenetre reste celui de la
     carte de recherche (une action par ecran, charte docs/31 § 3). */
  .site-tete .appel{display:inline-flex;align-items:center;justify-content:center;height:46px;padding:0 20px;
            font-family:var(--titre);font-weight:600;font-size:15px;background:#fff;color:#16263F;border:1px solid #fff;white-space:nowrap}
  .site-tete:not(.sur-photo) .appel,.site-tete.sur-photo.pose .appel{background:none;color:var(--encre);border-color:var(--encre)}
  .site-tete .appel:hover{background:var(--tilleul-12)}
  .site-tete .langue{display:inline-flex;align-items:center;gap:6px;font-family:var(--titre);font-weight:600;font-size:12px;
            letter-spacing:.08em;text-transform:uppercase;min-height:44px;color:var(--brume)}
  .site-tete .langue b{color:var(--encre);font-weight:600}
  /* posee sur la photographie : transparente, blanche, au-dessus du heros */
  html:not(.posee) .site-tete.sur-photo{position:absolute;top:0;left:0;right:0;background:none;border-bottom:0;color:#fff}
  .site-tete.sur-photo .contenant{height:84px}
  .site-tete.sur-photo .langue,.site-tete.sur-photo .langue b{color:rgba(255,255,255,.9)}
  .site-tete.sur-photo .bouton-menu{background:rgba(10,18,28,.34);color:#fff;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
  /* la page a defile : elle se fixe en haut, reprend le papier et l'encre, le logotype passe au vert */
  html:not(.posee) .site-tete.sur-photo.pose{position:fixed;background:var(--papier);color:var(--encre);border-bottom:1px solid var(--filet)}
  .site-tete.sur-photo.pose .contenant{height:64px}
  .site-tete.sur-photo.pose .langue{color:var(--brume)} .site-tete.sur-photo.pose .langue b{color:var(--encre)}
  .site-tete.sur-photo.pose .bouton-menu{background:none;color:var(--encre);-webkit-backdrop-filter:none;backdrop-filter:none}
  .site-tete.sur-photo .logotype{color:#fff}
  .site-tete.sur-photo.pose .logotype{color:var(--action)}
  :root[data-theme="dark"] .site-tete.sur-photo.pose .logotype{color:var(--encre)}
  @media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .site-tete.sur-photo.pose .logotype{color:var(--encre)}}
}

/* --- 9.4 · Les sections du site (.site-bloc, .site-titre) ------------------------------
   Une section = un .site-bloc (papier), .site-bloc.pose (le papier chaud de la charte) ou
   .site-bloc.encre-pose (le marine) : jamais deux blancs a la suite (regle 9). Dedans, un
   .contenant, puis .site-titre : la petite capitale VERTE (le vert en texte), le titre, une
   phrase, et le lien de droite. */
.site-bloc{padding:48px 0 52px}
.site-bloc.pose{background:var(--papier-chaud);border-top:1px solid var(--filet2);border-bottom:1px solid var(--filet2);padding-bottom:52px}
.site-bloc.encre-pose{padding-bottom:52px}
.site-titre{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin-bottom:22px}
.site-titre .cap{color:var(--lien)}
.encre-pose .site-titre .cap,.site-coach .site-titre .cap{color:var(--tilleul)}
.site-titre h2,.site-titre h1{font-family:var(--titre);font-weight:600;font-size:28px;line-height:1.06;letter-spacing:-.022em;
                  max-width:22ch;text-wrap:balance;color:inherit}
.site-titre h2 .lieu{white-space:nowrap}
.site-titre p{color:var(--ardoise);font-size:15px;line-height:22px;max-width:56ch}
.encre-pose .site-titre p{color:rgba(255,255,255,.84)}
.site-titre .lien{color:var(--lien);font-size:14px;min-height:44px;gap:6px}
.site-titre .lien .ic{width:16px;height:16px}
.encre-pose .site-titre .lien{color:#fff}
@media(min-width:1000px){
  .site-bloc{padding:clamp(56px,8vw,104px) 0}
  .site-bloc.pose,.site-bloc.encre-pose{padding-bottom:clamp(56px,8vw,104px)}
  .site-titre{flex-direction:row;align-items:flex-end;justify-content:space-between;gap:24px;margin-bottom:40px}
  .site-titre>div{display:flex;flex-direction:column;gap:12px}
  .site-titre h2,.site-titre h1{font-size:clamp(30px,3.4vw,46px)}
  .site-titre p{font-size:16px;line-height:24px}
  .site-titre .lien{flex:0 0 auto;margin-bottom:6px}
}

/* --- 9.5 · L'ouverture (.site-hero) : la grande photographie, la promesse, la recherche ----
   Telephone : la photographie respire seule (440 a 540 px), le titre et la phrase en bas
   sur un voile ; la carte de recherche vient APRES, sur le papier, et chevauche la photo
   de 28 px ; la rangee de raccourcis glisse dessous. Ordinateur : tout est SUR la photo
   (94 vh au plus), la carte a quatre colonnes, les raccourcis en une ligne. */
.site-hero{position:relative;isolation:isolate;color:var(--encre)}
.site-hero .visuel{position:relative;min-height:clamp(440px,56svh,540px);display:flex;align-items:flex-end;color:#fff;
                   background:var(--contre);isolation:isolate}
.site-hero .visuel>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:58% 30%;z-index:-2}
.site-hero .visuel .voile{position:absolute;inset:0;z-index:-1;
  background:linear-gradient(180deg,rgba(22,38,63,.46) 0%,rgba(22,38,63,.06) 26%,rgba(22,38,63,.4) 48%,rgba(22,38,63,.64) 62%,rgba(22,38,63,.72) 100%)}
/* [controle 21/09] enfant direct seulement : la liste .suggestions du champ Ou, posee dans le hero, a aussi un span.texte
   (la ligne « Autour de moi » mesurait 214 px de haut) */
.site-hero .visuel>.texte{padding:96px var(--marge-site) 50px}
.site-hero h1{font-family:var(--titre);font-weight:700;font-size:40px;line-height:1;letter-spacing:-.028em;max-width:12ch;
              text-shadow:0 1px 3px rgba(22,38,63,.5),0 6px 30px rgba(22,38,63,.85)}
.site-hero .sous{font-size:16px;line-height:1.5;margin-top:12px;max-width:34ch;text-shadow:0 1px 10px rgba(22,38,63,.9)}
.site-hero .sous .long{display:none}
.site-hero .zone-rech{position:relative;z-index:2;margin-top:-28px;padding-bottom:8px}
@media(min-width:1000px){
  .site-hero{min-height:min(94vh,880px);display:flex;flex-direction:column;justify-content:flex-end;color:#fff;background:var(--contre)}
  .site-hero .visuel{position:static;min-height:0;display:block;background:none;isolation:auto}
  .site-hero .visuel .voile{background:linear-gradient(90deg,rgba(22,38,63,.62) 0%,rgba(22,38,63,.56) 36%,rgba(22,38,63,.36) 56%,rgba(22,38,63,0) 74%),
    linear-gradient(180deg,rgba(22,38,63,.5) 0%,rgba(22,38,63,.08) 30%,rgba(22,38,63,.22) 55%,rgba(22,38,63,.86) 100%)}
  .site-hero .visuel>img{object-position:64% 30%}
  .site-hero .visuel>.texte{padding:150px var(--marge-site) 0}
  .site-hero h1{font-size:clamp(40px,5.8vw,76px);max-width:16ch;text-shadow:0 1px 3px rgba(22,38,63,.5),0 6px 34px rgba(22,38,63,.85)}
  .site-hero .sous{font-size:clamp(17px,1.4vw,20px);max-width:52ch;margin-top:22px}
  .site-hero .sous .long{display:inline}
  .site-hero .zone-rech{margin-top:0;padding:34px var(--marge-site) 44px}
}

/* --- 9.6 · La carte de recherche (.site-rech) : Sport, Ou, Quand, l'aplat ---------------
   Un <form method="get" action="/rechercher/"> : sans JavaScript, la recherche part quand meme.
   Trois champs a 16 px (aucun zoom iOS), chacun de 44 px de haut sous le doigt, une petite
   capitale au-dessus de la valeur, l'icone du champ en vert. Le champ Ou est un texte libre
   avec ses suggestions (Athlon.champOu, § 7.28) ; Sport et Quand sont des listes. */
.site-rech{display:grid;grid-template-columns:1fr;background:var(--papier);color:var(--encre);border:1px solid var(--filet);
           text-align:left}
.site-rech .champ{position:relative;display:flex;align-items:center;gap:14px;padding:10px 18px;min-height:62px;
                  border-bottom:1px solid var(--filet2)}
.site-rech .champ>.ic{color:var(--lien);width:22px;height:22px}
.site-rech .champ .valeur{flex:1;min-width:0;display:flex;flex-direction:column}
.site-rech .champ .l{display:block;font-family:var(--titre);font-size:12px;line-height:14px;letter-spacing:.14em;
                     text-transform:uppercase;color:var(--brume);font-weight:600}
.site-rech .champ .v{display:block;width:100%;min-height:44px;margin:-8px 0 -8px;padding:0;border:0;background:none;
                     font:600 16px/22px var(--texte);color:var(--encre);appearance:none;-webkit-appearance:none;border-radius:0}
.site-rech .champ .v::placeholder{color:var(--encre);opacity:1}
.site-rech .champ select.v{cursor:pointer;background-image:none}
.site-rech .champ .v:focus{outline:none}
.site-rech .champ:focus-within{background:var(--tilleul-12);box-shadow:inset 0 -2px 0 var(--tilleul)}
.site-rech .champ .effacer{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:44px;height:44px;
                     display:grid;place-items:center;color:var(--brume)}
.site-rech .champ .effacer[hidden]{display:none}
.site-rech .valider{padding:10px}
.site-rech .valider .action{width:100%;height:52px;font-size:16px}
@media(min-width:1000px){
  .site-rech{grid-template-columns:1.05fr 1.15fr 1fr auto;align-items:stretch;max-width:1000px;border:0}
  .site-rech .champ{border-bottom:0;border-right:1px solid var(--filet2);min-height:78px;padding:14px 22px}
  .site-rech .champ .v{font-size:17px}
  .site-rech .valider{display:flex;align-items:center;padding:12px}
  .site-rech .valider .action{height:100%;min-height:54px;padding:0 28px;width:auto}
}
/* la rangee de raccourcis sous la carte : des pastilles du systeme, en rail ; sur la photo
   (ordinateur) elles sont blanches, sur le papier (telephone) elles ont le filet */
.site-tags{margin-top:12px;padding:2px 0 6px;gap:8px}
.site-tags .pastille{gap:7px}
.site-tags .pastille .ic{color:var(--lien);width:16px;height:16px}
@media(min-width:1000px){
  .site-tags{margin-top:18px;padding:0;overflow:visible;flex-wrap:wrap;max-width:1000px}
  .site-tags .pastille{background:#fff;border-color:#fff;color:#16263F}
  .site-tags .pastille .ic{color:#1F6633}
  .site-tags .pastille:hover{border-color:var(--tilleul)}
}

/* --- 9.7 · Les sports en grille de photographies (.site-sports > .vignette) -------------
   La photographie EST la tuile (regle 7) : le nom en Archivo pose sur un voile bas, une
   sous-ligne de 13 px, la fleche. Deux colonnes sur 180 px au telephone ; quatre colonnes sur
   300 px au-dela, la premiere tuile (.large) et la derniere (.tous, sur le marine) sur deux. */
.site-sports{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:180px;gap:10px;list-style:none;margin:0;padding:0}
.vignette{position:relative;overflow:hidden;background:var(--papier3);display:flex;align-items:flex-end;isolation:isolate;min-width:0}
.vignette img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-2;transition:transform var(--duree) var(--courbe)}
.vignette:hover img{transform:scale(1.03)}
.vignette::after{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(22,38,63,0) 45%,rgba(22,38,63,.8) 100%)}
.vignette .nom{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;padding:16px;color:#fff;
               font-family:var(--titre);font-weight:600;font-size:20px;line-height:1.1;letter-spacing:-.012em;min-height:44px}
.vignette .nom small{display:none;font-family:var(--texte);font-weight:500;font-size:13px;letter-spacing:0;line-height:16px;color:rgba(255,255,255,.9);margin-top:3px}
.vignette .nom .ic{width:20px;height:20px;flex:0 0 auto;color:rgba(255,255,255,.9)}
.vignette.large{grid-column:span 2}
.vignette.large .nom{font-size:26px;padding:18px}
.vignette.large .nom small{display:block}
.vignette.tous{background:var(--contre);color:var(--contre-txt);grid-column:span 2;flex-direction:column;align-items:flex-start;
               justify-content:flex-end;padding:18px;gap:8px}
.vignette.tous::after{display:none}
.vignette.tous .nom{padding:0;font-size:24px}
.vignette.tous p{color:rgba(255,255,255,.82);font-size:14px;line-height:20px}
.vignette a.nom:active{opacity:.82}
@media(min-width:1000px){
  .site-sports{grid-template-columns:repeat(4,1fr);grid-auto-rows:300px;gap:16px}
  .vignette .nom{font-size:24px;padding:22px}
  .vignette .nom small{display:block}
  .vignette.large .nom{font-size:32px;padding:26px}
  .vignette.tous{padding:26px} .vignette.tous .nom{font-size:32px} .vignette.tous p{font-size:15px}
}

/* --- 9.8 · L'etiquette posee sur une photographie (.etiquette) et les trois pas (.site-pas) ----
   L'etiquette : une carte blanche posee en bas d'une photographie (le texte sur photo est
   blanc sur un voile, ou marine sur du blanc : jamais vert). Petite capitale de 12 px, phrase
   en Archivo 700, et au besoin une ligne de dates (.ligne-dates) ou un escalier (.escalier). */
.etiquette{position:absolute;left:14px;right:14px;bottom:14px;background:#fff;color:#16263F;padding:12px 14px;
           display:flex;flex-direction:column;gap:2px}
.etiquette small{font-family:var(--titre);font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;color:#5F5E58}
.etiquette b{font-family:var(--titre);font-weight:700;font-size:19px;line-height:1.15;letter-spacing:-.012em}
.etiquette .ligne-dates{display:flex;gap:6px;margin-top:6px;flex-wrap:wrap}
.etiquette .ligne-dates span{font-family:var(--titre);font-weight:600;font-size:12px;border:1px solid #E5EED4;background:#F2F7EA;padding:5px 9px;color:#16263F}
.etiquette .ligne-dates span.choisi{background:#16263F;border-color:#16263F;color:#fff}
.etiquette .escalier{display:flex;align-items:flex-end;gap:4px;height:34px;margin-top:8px}
.etiquette .escalier i{flex:1;background:#E5EED4}
.etiquette .escalier i.on{background:#91B94C}
.etiquette.libre{position:static}
.site-pas{display:grid;grid-template-columns:1fr;gap:26px;list-style:none;margin:0;padding:0}
.site-pas li{display:flex;flex-direction:column;gap:14px;min-width:0}
.site-pas .cadre{position:relative;overflow:hidden;aspect-ratio:4/5;background:var(--papier3);isolation:isolate}
.site-pas .cadre img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-1}
.site-pas .cadre::after{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(22,38,63,.1),rgba(22,38,63,.55) 100%)}
.site-pas .numero{position:absolute;left:16px;top:14px;width:44px;height:44px;border-radius:var(--rayon-doigt);background:#fff;color:#16263F;
                  font-family:var(--titre);font-weight:700;font-size:18px;display:grid;place-items:center}
.site-pas h3{font-family:var(--titre);font-weight:600;font-size:20px;line-height:1.2;letter-spacing:-.016em}
.site-pas p{color:var(--ardoise);font-size:15px;line-height:22px;margin-top:6px;max-width:44ch}
@media(min-width:1000px){
  .site-pas{grid-template-columns:repeat(3,1fr);gap:20px}
  .etiquette{left:16px;right:16px;bottom:16px;padding:14px 16px} .etiquette b{font-size:20px}
  .site-pas h3{font-size:21px} .site-pas p{font-size:15.5px}
}

/* --- 9.9 · La garantie en trois chiffres (.site-garantie) -----------------------------
   Trois cartes sur le papier chaud, le filet tilleul a gauche (le tilleul en filet, jamais en
   bouton), le chiffre en Archivo 700 tres grand : un chiffre est un objet graphique. */
.site-garantie{display:grid;grid-template-columns:1fr;gap:14px;list-style:none;margin:0;padding:0}
.site-garantie li{background:var(--papier-chaud);border:1px solid var(--filet2);border-left:4px solid var(--tilleul);padding:24px 22px 22px}
.site-bloc.pose .site-garantie li{background:var(--papier)}
.site-garantie .chiffre{font-family:var(--titre);font-size:48px;font-weight:700;line-height:.95;letter-spacing:-.03em;color:var(--encre);margin-bottom:14px}
.site-garantie .chiffre small{font-family:var(--titre);font-size:18px;font-weight:600;letter-spacing:0;color:var(--ardoise);margin-left:6px}
.site-garantie h3{font-family:var(--titre);font-weight:600;font-size:19px;line-height:1.2;margin-bottom:8px;letter-spacing:-.014em}
.site-garantie p{color:var(--ardoise);font-size:15px;line-height:22px}
@media(min-width:1000px){
  .site-garantie{grid-template-columns:repeat(3,1fr);gap:16px}
  .site-garantie li{padding:30px 28px 28px}
  .site-garantie .chiffre{font-size:clamp(48px,5vw,64px)}
}

/* --- 9.10 · La bande « Tu es coach ? » (.site-coach) ------------------------------------
   Une photographie sombre (voile noir : le texte blanc tient partout), le titre, la phrase
   au coach TUTOYE, un bouton en contour blanc (le seul aplat vert de la page est plus haut),
   et trois etiquettes en escalier a droite (« Ta seance de 9 h : 120 € », « Ce qui te
   revient : 100 % »). */
.site-coach{position:relative;color:#fff;background:var(--contre);isolation:isolate;padding:60px 0}
.site-coach>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:56% 0%;z-index:-2}
.site-coach::before{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(0,0,0,.66) 0%,rgba(0,0,0,.72) 100%)}
.site-coach .contenant{display:grid;grid-template-columns:1fr;gap:30px;align-items:center}
.site-coach .site-titre{margin-bottom:0}
.site-coach .site-titre h2{color:#fff}
.site-coach .site-titre p{color:rgba(255,255,255,.88);font-size:16px;line-height:24px;max-width:52ch}
.site-coach .contour{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:48px;padding:0 22px;
                     border:2px solid #fff;color:#fff;font-family:var(--titre);font-weight:600;font-size:15px;position:relative;margin-top:8px}
.site-coach .contour:hover{background:rgba(255,255,255,.12)}
.site-coach .contour:active{transform:scale(.98)}
.site-coach .legendes{display:grid;gap:12px}
.site-coach .legendes .etiquette{position:static}
.site-coach .legendes .etiquette b{font-size:24px}
.site-coach .legendes .etiquette:nth-child(2){margin-left:24px}
@media(min-width:1000px){
  .site-coach{padding:clamp(64px,8vw,120px) 0}
  .site-coach::before{background:linear-gradient(90deg,rgba(0,0,0,.66) 0%,rgba(0,0,0,.56) 48%,rgba(0,0,0,.34) 100%)}
  .site-coach .contenant{grid-template-columns:1.1fr .9fr;gap:clamp(32px,5vw,80px)}
  .site-coach .legendes{max-width:420px;justify-self:end}
  .site-coach .legendes .etiquette b{font-size:26px}
  .site-coach .legendes .etiquette:nth-child(2){margin-left:36px}
  .site-coach .legendes .etiquette:nth-child(3){margin-left:12px}
}

/* --- 9.11 · Le bloc « Coachiamo sur votre telephone » (.site-magasin, .badge-magasin.officiel) ------
   [W1 22/09] Decision de Nils (docs/42 § 3.4, qui remplace docs/33 § 3.2) : « le vrai truc, le logo Apple,
   le logo Play Store, le long truc noir ». LES DEUX BADGES OFFICIELS, servis depuis /_app/magasins/
   (scripts/magasins-badges.mjs), noirs dans les deux themes (leur lisere clair les tient sur la surface
   de nuit), 40 px de haut sur ordinateur, 36 sur telephone, cote a cote, gouttiere 12 px, JAMAIS modifies
   (ni couleur, ni coin, ni texte : c'est la condition d'usage des deux marques). Le PNG de Google porte
   une marge transparente imposee : pose a 136 x 40 (rapport 3,4 contre 2,58 natif) en object-fit:cover,
   son noir mesure 40 px comme celui d'Apple. Tant que les variables MAGASINS_* sont vides, chaque badge
   ouvre la feuille du pas-a-pas ; des qu'elles existent, il mene au magasin (Athlon.site.armerMagasin).
   Sous les badges, le lien « Ou ajoutez-la a votre ecran d'accueil sans rien telecharger ». A droite, la
   capture reelle dans une coque INCLINEE de -6°, la seule ombre portee du site (sur un objet, jamais sur
   une carte), qui apparait 120 ms apres le texte. */
.site-magasin{display:grid;grid-template-columns:1fr;gap:32px;align-items:center}
.site-magasin .site-titre{margin-bottom:0}
.badges-magasin{display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;align-items:center}
.badge-magasin.officiel{display:inline-flex;align-items:center;background:none;border:0;padding:0;height:36px;flex:0 0 auto;position:relative}
.badge-magasin.officiel img{height:36px;width:auto;display:block}
.badge-magasin.officiel.google img{width:122px;object-fit:cover;object-position:center}
.badge-magasin.officiel:hover{opacity:.88}
.badge-magasin.officiel:active{transform:scale(.98)}
/* la zone de toucher : 44 px de haut meme si le badge en mesure 36 */
.badge-magasin.officiel::before{content:"";position:absolute;left:0;right:0;top:50%;height:44px;transform:translateY(-50%)}
.site-magasin .ecran-accueil{display:inline-flex;align-items:center;min-height:44px;margin-top:8px;font-size:15px;color:var(--lien);
                             text-decoration:underline;text-underline-offset:3px}
/* le pas a pas dans la feuille : trois gestes numerotes */
.pas-a-pas{list-style:none;margin:0;padding:0 var(--marge) 8px;counter-reset:geste}
.pas-a-pas li{display:flex;gap:14px;align-items:flex-start;padding:14px 0;font-size:15px;line-height:22px}
.pas-a-pas li+li{border-top:1px solid var(--filet2)}
.pas-a-pas li::before{counter-increment:geste;content:counter(geste);flex:0 0 auto;width:32px;height:32px;border-radius:var(--rayon-doigt);
                      background:var(--contre);color:var(--contre-txt);font-family:var(--titre);font-weight:700;font-size:14px;display:grid;place-items:center}
.pas-a-pas li b{font-family:var(--titre);font-weight:600}
.pas-a-pas li .ic{vertical-align:-3px;margin:0 2px;color:var(--lien)}
/* la vignette de l'application dans son cadre (le telephone dessine) : l'ecran reel a l'echelle */
.site-magasin .appareil{justify-self:center;width:280px;aspect-ratio:280/580;border-radius:44px;background:var(--contre);padding:12px;
                        box-shadow:0 0 0 1px var(--bureau-filet)}
.site-magasin .appareil .ecran{width:100%;height:100%;border-radius:34px;overflow:hidden;background:var(--papier);position:relative;display:flex;flex-direction:column}
.site-magasin .appareil .ecran img{width:100%;height:100%;object-fit:cover;object-position:top}
.site-magasin .legende{text-align:center;color:var(--brume);font-size:13px;line-height:18px;margin-top:14px}
@media(min-width:600px){
  .badge-magasin.officiel,.badge-magasin.officiel img{height:40px}
  .badge-magasin.officiel.google img{width:136px}
}
@media(min-width:1000px){
  .site-magasin{grid-template-columns:1.1fr .9fr;gap:clamp(32px,5vw,80px)}
  .site-magasin .appareil.incline{transform:rotate(-6deg);box-shadow:0 24px 60px rgba(22,38,63,.18),0 0 0 1px var(--bureau-filet);margin:24px 0}
  .site-magasin .legende{margin-top:28px}
}

/* --- 9.12 · Le pied de site (.site-pied) ----------------------------------------------
   Cinq colonnes au-dela de 1000 px (la marque, les lieux, les sports, Coachiamo, le
   juridique) ; au telephone, la marque puis quatre sections repliables (<details>).
   [W1 22/09] Plus de bascule Jour / Nuit (« ca, c'est dans les parametres » : Reglages du coach,
   carnet du client), plus de langue « bientot », plus de filet au-dessus des titres sur ordinateur :
   un seul filet, au-dessus du bas de page (docs/42 § 3.3). Liens 15 px, interligne 34 px. */
.site-pied{background:var(--papier);border-top:1px solid var(--filet);padding:40px 0 24px;color:var(--encre)}
.site-pied .colonnes{display:grid;grid-template-columns:1fr;gap:0}
.site-pied .marque{margin-bottom:22px}
.site-pied .marque .logotype{margin-bottom:14px}
.site-pied .marque p{color:var(--ardoise);font-size:15px;line-height:22px;max-width:34ch;margin-bottom:10px}
.site-pied .marque a.lien{color:var(--lien);font-size:15px}
.site-pied h4{font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--brume);margin:0}
.site-pied details{border-top:1px solid var(--filet2)}
.site-pied details summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;min-height:52px}
.site-pied details summary::-webkit-details-marker{display:none}
.site-pied details summary .ic{width:18px;height:18px;color:var(--brume);transition:transform var(--duree-courte) var(--courbe)}
.site-pied details[open] summary .ic{transform:rotate(180deg)}
.site-pied ul{list-style:none;margin:0;padding:0 0 16px;columns:2;column-gap:16px}
.site-pied li{break-inside:avoid;margin:0}
.site-pied li a{display:flex;align-items:center;min-height:44px;font-size:15px;color:var(--encre)}
.site-pied li a:hover{color:var(--lien);text-decoration:underline;text-underline-offset:3px}
.site-pied .petite{font-size:13px;line-height:18px;color:var(--brume);margin:-6px 0 16px}
.site-pied .bas-de-page{border-top:1px solid var(--filet);margin-top:24px;padding-top:18px;display:grid;gap:10px;color:var(--brume);font-size:13px;line-height:19px}
.site-pied .bas-de-page b{color:var(--encre);font-weight:600}
@media(min-width:1000px){
  .site-pied{padding:clamp(48px,6vw,80px) 0 40px;border-top:0}
  .site-pied .colonnes{grid-template-columns:1.2fr 1fr 1fr 1fr 1fr;gap:28px}
  .site-pied details{border-top:0}
  .site-pied details summary{pointer-events:none;min-height:0;margin-bottom:16px}
  .site-pied details summary .ic{display:none}
  .site-pied ul{columns:1;padding-bottom:0}
  .site-pied li a{min-height:34px;line-height:34px}
  .site-pied .petite{margin:8px 0 0}
  .site-pied .bas-de-page{margin-top:48px;padding-top:22px;font-size:13px;line-height:19px}
}

/* --- 9.13 · Le volet de menu du site (.site-volet, .site-volet-fond) ------------------------
   [W1 22/09] « Menu : comme tous les sites, le truc qui s'ouvre a gauche » (docs/42 § 3.2, qui
   remplace le panneau « tout » de docs/33 § 2). UN VOLET A GAUCHE : min(360px, 100vw - 56px), pleine
   hauteur (100dvh), papier, aucun trait au bord droit (le voile marine a 40 % fait la separation et
   laisse voir la page). Il glisse translateX(-100%) -> 0 en --duree-volet (320 ms), se ferme en
   --duree (240). Dedans : le logotype et la croix (76 px), huit grandes lignes de 64 px en Archivo 600
   20 px avec un chevron ardoise (Trouver un coach, Coachs par ville > sous-volet, Sports v pli,
   Comment ca marche, La garantie, Devenir coach en vert, Aide, Se connecter), Creer un compte, puis le
   seul aplat vert du volet colle en bas. ZERO bordure sauf le filet au-dessus de Se connecter.
   Le sous-volet des villes arrive de la droite dans le meme cadre (240 ms) pendant que la premiere
   colonne glisse de 40 px en fondu. Athlon.site.volet (= Athlon.menuSite) l'ouvre et le ferme :
   croix, voile, Echap, geste vers la gauche, retour du telephone ; focus piege, page inerte. */
.site-volet-fond{position:fixed;inset:0;z-index:25;background:var(--voile-menu);opacity:0;pointer-events:none;
                 transition:opacity var(--duree) var(--courbe)}
.site-volet-fond.ouvert{opacity:1;pointer-events:auto}
.site-volet{position:fixed;top:0;left:0;bottom:0;z-index:26;width:min(360px,100vw - 56px);height:100dvh;
            background:var(--papier);color:var(--encre);display:flex;flex-direction:column;overflow:hidden;
            transform:translateX(-100%);transition:transform var(--duree) var(--courbe);will-change:transform}
.site-volet.ouvert{transform:none;transition-duration:var(--duree-volet)}
.site-volet .haut{display:flex;align-items:center;justify-content:space-between;flex:0 0 auto;height:76px;padding:0 16px 0 28px}
.site-volet .haut .fermer{color:var(--encre)}
.site-volet .principal{display:flex;flex-direction:column;flex:0 1 auto;min-height:0;overflow:auto;-webkit-overflow-scrolling:touch;padding:4px 0 0}
.ligne-volet{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:64px;padding:0 24px 0 28px;
             font-family:var(--titre);font-weight:600;font-size:20px;line-height:1.15;letter-spacing:-.012em;color:var(--encre);
             background:none;border:0;width:100%;text-align:left;text-decoration:none;flex:0 0 auto}
.ligne-volet>span{min-width:0}
.ligne-volet .ic{width:20px;height:20px;color:var(--ardoise);flex:0 0 auto;transition:transform var(--duree) var(--courbe)}
.ligne-volet:hover{background:var(--papier2)}
.ligne-volet:active{background:var(--tilleul-12)}
.ligne-volet.pro{color:var(--lien)}
.ligne-volet.pro .ic{color:var(--lien)}
.ligne-volet.pli-tete[aria-expanded="true"] .ic{transform:rotate(180deg)}
/* Se connecter : Manrope 17, une icone a gauche, le filet au-dessus (le seul du volet) */
.ligne-volet.compte{justify-content:flex-start;gap:12px;min-height:56px;margin-top:8px;border-top:1px solid var(--filet);
                    font-family:var(--texte);font-weight:600;font-size:17px;letter-spacing:0}
.ligne-volet.compte .ic{color:var(--encre)}
.site-volet .compte-plus a{display:flex;align-items:center;gap:12px;min-height:56px;padding:0 24px 0 28px;font-size:17px;font-weight:600;color:var(--encre)}
.site-volet .compte-plus .ic{width:20px;height:20px}
.site-volet .compte-plus a:hover{background:var(--papier2)}
/* le pli des sports : six familles en 48 px, retrait de 24 px, Manrope 17 */
.site-volet .familles{list-style:none;margin:0;padding:0 0 6px;overflow:hidden}
.site-volet .familles a{display:flex;align-items:center;min-height:48px;padding:0 24px 0 52px;font-size:17px;color:var(--encre)}
.site-volet .familles a:hover{background:var(--papier2);color:var(--lien)}
.site-volet .familles .tous{color:var(--lien);font-weight:600}
.site-volet .familles .attente{display:flex;align-items:center;min-height:48px;padding-left:52px;color:var(--brume);font-size:15px}
/* le seul aplat vert du volet, colle en bas */
.site-volet .bas{flex:0 0 auto;margin-top:auto;padding:12px 28px calc(16px + var(--bas));background:var(--papier)}
.site-volet .bas .action{width:100%}
/* le sous-volet des villes : dans le meme cadre, il arrive de la droite ; la premiere colonne recule */
.site-volet .principal,.site-volet .compte-plus,.site-volet .bas{transition:transform var(--duree) var(--courbe),opacity var(--duree) var(--courbe)}
.site-volet.sous-ouvert .principal,.site-volet.sous-ouvert .compte-plus,.site-volet.sous-ouvert .bas{transform:translateX(-40px);opacity:0;pointer-events:none}
.site-volet .sous{position:absolute;top:76px;left:0;right:0;bottom:0;background:var(--papier);display:flex;flex-direction:column;
                  transform:translateX(100%);opacity:0;transition:transform var(--duree) var(--courbe),opacity var(--duree) var(--courbe)}
.site-volet.sous-ouvert .sous{transform:none;opacity:1}
.site-volet .sous .haut{height:56px;padding:0 16px 0 12px;justify-content:flex-start;gap:6px}
.site-volet .sous .haut h3{font-family:var(--titre);font-weight:600;font-size:20px;letter-spacing:-.012em}
.site-volet .sous-corps{flex:1 1 auto;overflow:auto;-webkit-overflow-scrolling:touch;padding:4px 0 24px}
.site-volet .sous-corps .ligne-volet{font-family:var(--texte);font-weight:600;font-size:17px;min-height:56px;letter-spacing:0}
.site-volet .sous-corps .ligne-volet small{font-weight:500;color:var(--brume);font-size:14px}
.site-volet .sous-corps .ligne-volet.fort{color:var(--lien)}
.site-volet .sous-corps .ligne-volet.fort .ic{color:var(--lien)}
.site-volet .sous-corps .ligne-volet.fort:first-child{gap:12px;justify-content:flex-start}
.site-volet .note{font-size:13px;line-height:18px;color:var(--ardoise);padding:12px 24px 0 28px}
.site-volet .note .etat{margin-right:6px}

/* --- 9.16 · L'apparition au defilement ([data-parait], Athlon.apparaitre) --------------------------
   [W1 22/09] docs/42 § 2.3 : tout ce qui porte data-parait « se pose » quand il entre dans l'ecran :
   opacite 0 -> 1 et 24 px de translation vers le haut, --duree-parait (480 ms), --courbe, une seule
   fois. Le script pose la classe .parait AU DEPART (jamais dans le HTML : sans script, tout est visible)
   puis .vu a l'entree ; les enfants d'un [data-parait-groupe] partent a 80 ms d'intervalle (le retard
   est pose en style par le script). Sous mouvement reduit, le script ne pose pas .parait : 0 ms, rien
   ne bouge. */
.parait{opacity:0;transform:translateY(24px);transition:opacity var(--duree-parait) var(--courbe),transform var(--duree-parait) var(--courbe)}
.parait.vu{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.parait{opacity:1;transform:none;transition:none}}

/* --- 9.17 · L'echelle du site sur ordinateur (.site-h1, .site-h2, .site-sous, .site-chiffre) ----------
   [W1 22/09] docs/42 § 2.1 : un site « wow » a une hierarchie de 1 a 5 entre le titre et le texte ; le
   notre avait 1 a 1,6 (h1 26 px, neuf h2 a 20 px). Ces classes ne touchent pas l'application (le .t20
   reste a la coque de 430 px). Sur telephone elles gardent une echelle de coque (h1 40, h2 26). */
.site-h1{font-family:var(--titre);font-weight:700;font-size:clamp(34px,9.5vw,44px);line-height:1;letter-spacing:-.028em;text-wrap:balance;color:inherit}
.site-h2{font-family:var(--titre);font-weight:600;font-size:clamp(26px,6.5vw,30px);line-height:1.05;letter-spacing:-.024em;text-wrap:balance;color:inherit;max-width:22ch}
.site-sous{font-family:var(--texte);font-size:17px;line-height:1.5;color:var(--ardoise);max-width:52ch}
.encre-pose .site-sous,.bande .site-sous,.site-hero-page .site-sous{color:rgba(255,255,255,.86)}
.site-texte{font-size:16px;line-height:1.55;color:var(--encre);max-width:64ch}
.site-chiffre{display:block;font-family:var(--titre);font-weight:700;font-size:48px;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.site-chiffre+.l,.site-legende{display:block;margin-top:10px;font-family:var(--titre);font-weight:600;font-size:12px;line-height:16px;letter-spacing:.14em;text-transform:uppercase;color:var(--brume)}
.encre-pose .site-chiffre+.l,.encre-pose .site-legende{color:rgba(255,255,255,.74)}
@media(min-width:1000px){
  .site-h1{font-size:clamp(44px,5.2vw,72px)}
  .site-h2{font-size:clamp(32px,3vw,44px)}
  .site-sous{font-size:19px}
  .site-texte{font-size:17px}
  .site-chiffre{font-size:64px}
}

/* --- 9.18 · Le rythme des sections d'une page de site (.site-page) -----------------------------------
   docs/42 § 2.2 : une section = une idee, 96 px d'air en haut et en bas sur ordinateur (64 au telephone),
   alternance des fonds (papier, blanc pose, photo, marine), AUCUNE bordure entre deux sections ; deux
   colonnes 1fr 1fr a 64 px de gouttiere qui s'inversent une section sur deux (.site-deux.inverse).
   La page ecrit ses sections en <section class="site-bloc"> avec un .contenant dedans (9.4) : ici,
   ce qui manque a 9.4 pour une page de marque. */
.site-page .site-bloc{padding:64px 0}
.site-page .site-bloc.pose{border:0;background:var(--papier-chaud)}
.site-page .site-bloc.encre-pose{padding:64px 0;color:var(--contre-txt)}
.site-page .site-bloc.encre-pose .cap{color:var(--tilleul)}
.site-page .cap.vert{color:var(--lien)}
.site-page .site-entete{display:flex;flex-direction:column;gap:14px;margin-bottom:32px}
.site-deux{display:grid;grid-template-columns:1fr;gap:32px;align-items:center}
.site-deux .texte{display:flex;flex-direction:column;gap:16px}
.site-deux .texte .lien{align-self:flex-start;min-height:44px;display:inline-flex;align-items:center;gap:6px;font-size:16px;font-weight:600;color:var(--lien);text-decoration:underline;text-underline-offset:3px}
/* la photo d'une colonne : plein cadre, 4/5, sans cadre ni ombre (regle 7) */
.site-deux .photo{width:100%;aspect-ratio:4/5;object-fit:cover;display:block;background:var(--papier3)}
/* le telephone incline : la coque dessinee de 9.11, 390 x 844 a l'echelle 0,72 ; droit sous 600 px */
.telephone{width:min(300px,78vw);aspect-ratio:390/844;border-radius:44px;background:var(--contre);padding:12px;margin:0 auto;
           box-shadow:0 0 0 1px var(--bureau-filet)}
.telephone .ecran{width:100%;height:100%;border-radius:34px;overflow:hidden;background:var(--papier)}
.telephone .ecran img{width:100%;height:100%;object-fit:cover;object-position:top;display:block}
/* l'ouverture d'une page de marque : la photo occupe le cadre, le titre en bas a gauche */
.site-hero-page{position:relative;isolation:isolate;min-height:560px;display:flex;align-items:flex-end;color:#fff;background:var(--contre);overflow:hidden}
.site-hero-page>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-2}
.site-hero-page::before{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(22,38,63,0) 30%,rgba(22,38,63,.72))}
.site-hero-page .contenant{padding-top:48px;padding-bottom:48px;display:flex;flex-direction:column;align-items:flex-start;gap:18px}
.site-hero-page .cap{color:rgba(255,255,255,.9)}
.site-hero-page .site-sous{font-size:19px;max-width:40ch}
.site-hero-page .action{margin-top:6px;height:48px;padding:0 24px;font-size:17px;width:auto;display:inline-flex}
/* la bande de chiffres sur marine : trois colonnes */
.site-chiffres{display:grid;grid-template-columns:1fr;gap:32px}
.site-chiffres>div{display:flex;flex-direction:column}
.site-chiffres .site-chiffre{color:#fff}
.site-chiffres .l{color:rgba(255,255,255,.74)}
.site-chiffres .dit{margin-top:8px;font-size:15px;line-height:22px;color:rgba(255,255,255,.86);max-width:30ch}
/* la frise des etapes : trois cercles marine relies par un trait tilleul qui se dessine */
.frise{position:relative;display:grid;grid-template-columns:1fr;gap:28px;margin-top:40px}
.frise .trait{display:none}
.frise .etape{display:flex;flex-direction:column;gap:14px;position:relative}
.frise .rond{width:56px;height:56px;border-radius:var(--rayon-doigt);background:var(--contre);color:var(--contre-txt);display:grid;place-items:center;
             font-family:var(--titre);font-weight:700;font-size:24px;font-variant-numeric:tabular-nums;position:relative;z-index:1}
.frise .etape h3{font-family:var(--titre);font-weight:600;font-size:20px;line-height:1.15;letter-spacing:-.012em}
.frise .etape p{font-size:15px;line-height:22px;color:var(--ardoise);max-width:36ch}
/* les plis (FAQ, details de la frise) : un filet ENTRE deux plis, le chevron tourne */
.plis{margin-top:32px}
.plis details{border-top:1px solid var(--filet)}
.plis details:first-child{border-top:0}
.plis summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:64px;padding:12px 0;
              font-family:var(--titre);font-weight:600;font-size:18px;line-height:1.25;letter-spacing:-.012em;color:var(--encre)}
.plis summary::-webkit-details-marker{display:none}
.plis summary .ic{width:20px;height:20px;flex:0 0 auto;color:var(--ardoise);transition:transform var(--duree) var(--courbe)}
.plis details[open] summary .ic{transform:rotate(180deg)}
.plis .r,.plis details>p,.plis details>div{font-size:16px;line-height:1.55;color:var(--encre);max-width:64ch;padding:0 0 22px}
.plis details>div p+p{margin-top:10px}
/* le pli discret sous une frise ou une section (« Ce qu'on verifie, et pourquoi », « Voir les quatre ecrans ») */
.pli-doux{margin-top:28px}
.pli-doux>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:8px;min-height:44px;font-size:16px;font-weight:600;color:var(--lien);text-decoration:underline;text-underline-offset:3px}
.pli-doux>summary::-webkit-details-marker{display:none}
.pli-doux>summary .ic{width:18px;height:18px;transition:transform var(--duree) var(--courbe)}
.pli-doux[open]>summary .ic{transform:rotate(180deg)}
.pli-doux>*:not(summary){margin-top:16px}
/* les cartes de prix : blanc pose sur le papier, sans bordure, un seul filet gauche tilleul */
.site-prix{display:grid;grid-template-columns:1fr;gap:12px;margin-top:32px}
.site-prix .offre{display:flex;flex-direction:column;gap:8px;padding:24px;background:var(--papier);color:var(--encre);min-height:200px;text-decoration:none}
.site-prix .offre.choisie{box-shadow:inset 4px 0 0 var(--tilleul)}
.site-prix .offre .t{font-family:var(--titre);font-weight:600;font-size:17px}
.site-prix .offre .p{font-family:var(--titre);font-weight:700;font-size:40px;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums;margin-top:4px}
.site-prix .offre .p small{display:block;font-family:var(--texte);font-weight:500;font-size:13px;letter-spacing:0;color:var(--brume);margin-top:8px}
.site-prix .offre .d{font-size:15px;line-height:22px;color:var(--ardoise)}
.site-prix .offre .cap{color:var(--lien)}
.site-compare{display:grid;grid-template-columns:1fr;gap:20px;margin-top:40px}
.site-compare .v{font-family:var(--titre);font-weight:700;font-size:32px;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.site-compare .l{display:block;margin-top:8px;font-size:14px;line-height:20px;color:var(--ardoise)}
/* la bande finale : photo plein cadre, voile marine, un titre, le meme bouton qu'en haut */
.site-bande-finale{position:relative;isolation:isolate;min-height:420px;display:flex;align-items:center;color:#fff;background:var(--contre);overflow:hidden}
.site-bande-finale>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-2}
.site-bande-finale::before{content:"";position:absolute;inset:0;z-index:-1;background:rgba(22,38,63,.62)}
.site-bande-finale .contenant{display:flex;flex-direction:column;align-items:flex-start;gap:20px;padding-top:56px;padding-bottom:56px}
.site-bande-finale .action{height:48px;padding:0 24px;font-size:17px;width:auto;display:inline-flex}
.site-bande-finale a.lien.blanc{color:#fff;text-decoration:underline;text-underline-offset:3px;min-height:44px;display:inline-flex;align-items:center;font-size:15px}
.site-bande-finale a.lien.blanc:hover{color:#fff}
/* le fil d'Ariane d'une page de marque passe SOUS l'ouverture, 13 px */
.site-page .ariane-sous{padding:12px 0 0}
@media(min-width:600px){
  .site-chiffres{grid-template-columns:repeat(3,1fr)}
  .site-prix{grid-template-columns:repeat(3,1fr)}
  .site-compare{grid-template-columns:repeat(3,1fr)}
  .frise{grid-template-columns:repeat(3,1fr);gap:32px}
  .frise .trait{display:block;position:absolute;left:0;right:0;top:27px;height:2px;z-index:0;overflow:visible}
  .frise .trait line{stroke:var(--tilleul);stroke-width:2;stroke-dasharray:1;stroke-dashoffset:1;transition:stroke-dashoffset 600ms var(--courbe);
                     transition-duration:calc(var(--duree-parait) * 1.25)}
  .frise.vu .trait line,html:not(.js) .frise .trait line{stroke-dashoffset:0}
  .frise .etape .rond{margin-left:0}
}
@media(min-width:1000px){
  .site-page .site-bloc{padding:96px 0}
  .site-page .site-bloc.encre-pose{padding:96px 0}
  .site-page .site-entete{margin-bottom:48px}
  .site-deux{grid-template-columns:1fr 1fr;gap:64px}
  .site-deux.inverse>.texte{order:2}
  .site-deux.inverse>.visuel{order:1}
  .site-deux .texte{gap:20px}
  .site-deux .visuel{display:flex;justify-content:center}
  .telephone{width:min(300px,28vw);margin:24px 0}
  .telephone.droite{transform:rotate(6deg)}
  .telephone.gauche{transform:rotate(-6deg)}
  .telephone.droite,.telephone.gauche{box-shadow:0 24px 60px rgba(22,38,63,.18),0 0 0 1px var(--bureau-filet)}
  .site-hero-page{min-height:max(640px,80vh)}
  .site-hero-page .contenant{padding-top:96px;padding-bottom:80px;gap:22px}
  .site-hero-page .site-sous{font-size:28px;line-height:1.3;max-width:34ch}
  .site-chiffres{gap:64px}
  .site-bande-finale{min-height:480px}
  .site-bande-finale .contenant{padding-top:96px;padding-bottom:96px}
  .site-prix .offre{min-height:260px}
  .site-prix .offre .p{font-size:48px}
  .frise{margin-top:56px}
  .plis summary{font-size:20px;min-height:72px}
  .plis .r,.plis details>p,.plis details>div{font-size:17px}
}

/* --- 9.14 · Le champ Ou et ses suggestions (.suggestions, Athlon.champOu) -----------------
   La liste qui s'ouvre sous le champ Ou : « Autour de moi » d'abord (le geste de position, au
   geste seulement), puis les lieux qui repondent a la frappe (GET /api/pub/lieux?q=, lot L3 ;
   sinon les destinations de /api/pub/places), chacun avec sa region et son pays. Rien n'est
   ecrit en dur. */
.suggestions{position:absolute;left:-1px;right:-1px;top:calc(100% + 1px);z-index:15;background:var(--papier);color:var(--encre);
             border:1px solid var(--filet);list-style:none;margin:0;padding:8px;max-height:min(60vh,420px);overflow:auto;text-align:left}
.suggestions[hidden]{display:none}
.suggestions li{display:flex;align-items:center;gap:12px;min-height:50px;padding:6px 12px;font-size:15px;line-height:20px;cursor:pointer;color:var(--encre)}
.suggestions li .ic{width:20px;height:20px;color:var(--lien);flex:0 0 auto}
.suggestions li .texte{flex:1;min-width:0}
.suggestions li .texte small{display:block;color:var(--ardoise);font-size:13px;line-height:17px}
.suggestions li .texte mark{background:none;color:inherit;font-weight:700;text-decoration:underline;text-decoration-color:var(--tilleul);text-decoration-thickness:2px;text-underline-offset:2px}
.suggestions li .pays{font-family:var(--titre);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--brume);font-weight:600;white-space:nowrap}
.suggestions li.autour{background:var(--tilleul-12);border:1px solid var(--tilleul-24);margin-bottom:6px}
.suggestions li.autour strong{font-weight:700}
.suggestions li:hover,.suggestions li[aria-selected="true"]{background:var(--papier-chaud)}
.suggestions li[aria-selected="true"]{box-shadow:inset 3px 0 0 var(--tilleul)}
.suggestions li.indice{cursor:default;min-height:0;padding:8px 12px 10px;font-size:13px;color:var(--ardoise);line-height:18px;display:block}
.suggestions li.indice b{color:var(--encre);font-weight:600}
@media(min-width:1000px){
  .suggestions{top:calc(100% + 10px);left:-1px;width:min(420px,calc(100vw - 2*var(--marge-site)));right:auto}
}

/* --- 9.15 · LA BARRE DU BAS PARTOUT COTE CLIENT (docs/33 § 4, 21/09) ----------------------
   Toute page du client porte la barre d'onglets, la fiche et le tunnel compris. Une barre
   d'action fixe (.barre-bas) se pose alors AU-DESSUS de la barre d'onglets, et le corps se
   degage de la somme des deux. Sur un ordinateur (body.marche des 1000 px), la barre d'onglets
   est en haut ou cachee : la barre d'action reprend le ras du bas. */
.app:has(>.onglets) .barre-bas:not(.feuille .barre-bas){bottom:calc(var(--h-onglets) + var(--bas));padding-bottom:0}
.corps.sous-barre.sous-onglets{padding-bottom:calc(120px + var(--h-onglets) + var(--bas) + var(--h-pose))}
body:has(.app>.onglets):has(.barre-bas:not(.feuille .barre-bas)) .toasts{bottom:calc(112px + var(--h-onglets) + var(--bas) + 12px)}
@media(min-width:1000px){
  body.marche .app:has(>.onglets) .barre-bas:not(.feuille .barre-bas){bottom:0;padding-bottom:var(--bas)}
  body.marche .corps.sous-barre.sous-onglets{padding-bottom:calc(120px + var(--bas) + var(--h-pose))}
  /* la barre du haut posee sur la photographie (la fiche) descend sous la navigation du haut, au lieu de passer dessous */
  body.marche:not(.site) .app:has(>.onglets) .tete.sur-photo{top:60px}
  body.marche.fiche-coach .corps.sous-barre.sous-onglets{padding-bottom:calc(var(--bas) + 24px + var(--h-pose))}
  body.marche:has(.app>.onglets):has(.barre-bas:not(.feuille .barre-bas)) .toasts{bottom:calc(112px + var(--bas) + 12px)}
}

/* ═══════════════ 10 · [L2] LA RECHERCHE « CARNET » (21 septembre 2026) ═══════════════
   Lot L2 de la nuit du 21/09 (docs/33 § 5, B2 ; maquette Boat/docs/planches/coachiamo-site/
   finale.html). Cinq pieces, toutes inertes sur un telephone sauf la feuille des lieux et le
   tag d'amis, qui vivent des deux cotes :
     10.1  body.marche.site, .site-tete, .site-pied : le SITE autour de la coque au-dela de
          1000 px (en-tete de site, pied en colonnes, la barre d'onglets et la barre du haut
          disparaissent, la coque s'elargit a 1180 px sur un fond pose). L1 construit l'en-tete
          et le pied definitifs (Athlon.site.entete / pied) : ces regles portent le MEME dessin
          (maquette finale) pour que l'integrateur n'ait qu'a unifier.
     10.2  .rech.carnet : la barre de recherche en pleine largeur (Sport · Ou · Quand · l'aplat
          « Trouver un coach »), ordinateur seulement ; le telephone garde sa barre du haut.
     10.3  .lieux + .rayon : la feuille du champ « Ou » (Autour de moi, la liste des lieux, le
          curseur du rayon 5 / 10 / 25 / 50 km et sa phrase). Telephone ET ordinateur.
     10.4  .amis-vont + .ami-coach + .tag-amis : « Vos amis y vont » en tete des resultats, et le
          tag « 2 amis · Marc y va pour le tennis » sur la carte. Rien n'est ecrit sans la
          visibilite accordee par l'ami : la route filtre, l'ecran n'invente rien.
     10.5  la grille « carnet » : au-dela de 1000 px, les cartes de coach deviennent des cartes
          BLANCHES POSEES SUR LE FOND (un filet, pas d'ombre, rayon 0 : la regle 6 tient ;
          la maquette arrondit a 18 px, ce point est a trancher par l'integrateur avec L1).
   Tout en jetons : le passage a la palette verte (docs/31, lot L1) se fait sans toucher ici. */

/* --- 10.1 · LE SITE AUTOUR DE LA COQUE (body.marche.site.carnet) -------------------
   L'en-tete de site, le bloc magasin et le pied sont ceux du lot L1 (§ 9, une seule source :
   scripts/site-statique.mjs). Ce qui reste ici, c'est la LARGEUR : l'accueil etale ses sections
   sur toute la fenetre (.site-bloc + .contenant) ; les pages construites sur la coque (la
   recherche, la connexion, les pages seo…) portent en plus la classe `carnet` : au-dela de
   1000 px la coque s'elargit a 1180 px, centree, la barre du haut et la barre d'onglets cedent
   la place a l'en-tete de site, les feuilles du systeme se posent en colonne de lecture.
   Rien ne change sous 1000 px ni en application posee. */
.ordi-seul{display:none !important}
@media(min-width:1000px){
  .ordi-seul{display:revert !important}
  .tel-seul{display:none !important}
  html:not(.posee) body.marche.site.carnet{--colonne:min(1180px, calc(100vw - 48px))}
  html:not(.posee) body.marche.site.carnet .app{max-width:var(--colonne);box-shadow:none;padding-bottom:0}
  html:not(.posee) body.marche.site.carnet .app>.tete{display:none}
  html:not(.posee) body.marche.site.carnet .corps.sous-onglets{padding-bottom:0}
  /* les feuilles du systeme ne s'etirent pas sur 1180 px : une colonne de lecture, centree */
  html:not(.posee) body.marche.site.carnet .feuille{max-width:560px;border:1px solid var(--filet);border-bottom:0}
  html:not(.posee) body.marche.site.carnet .toasts{max-width:560px}
  /* dans la coque, l'en-tete, le magasin et le pied gardent la marge de la coque, pas celle du site */
  body.marche.site.carnet .contenant{padding-left:var(--marge);padding-right:var(--marge)}
  /* [controle 21/09] un texte juridique dans le site : la coque a 1180 px, mais le TEXTE se lit dans une colonne
     de 760 px centree (l'en-tete du document, le sommaire, l'article, les autres documents) ; l'en-tete de site,
     le magasin et le pied gardent la largeur de la coque. */
  html:not(.posee) body.marche.site.carnet .doc>:not(.site-bloc):not(.site-pied){max-width:760px;margin-left:auto;margin-right:auto}
  /* [W1 22/09] la fiche du coach et les pages de marque (.site-page : Devenir coach, l'application, comment ca
     marche) s'etalent sur toute la fenetre, sur le papier, comme l'accueil : plus de planche grise autour d'une
     colonne de 1180 px. Les sections gardent leur .contenant de 1180 px centre. */
  html:not(.posee) body.marche.site.carnet.fiche-coach,html:not(.posee) body.marche.site.carnet.site-page{--colonne:100%;background:var(--papier)}
  html:not(.posee) body.marche.site.carnet.fiche-coach .app,html:not(.posee) body.marche.site.carnet.site-page .app{max-width:none}
  body.marche.site.carnet.fiche-coach .contenant,body.marche.site.carnet.site-page .contenant{padding-left:var(--marge-site);padding-right:var(--marge-site)}
  /* la fiche du coach dans le site : le degagement du bas d'un telephone n'a plus lieu d'etre (la barre est dans le panneau, le pied ferme la page) */
  html:not(.posee) body.marche.site.carnet.fiche-coach .corps.sous-barre{padding-bottom:var(--h-pose)}
}

/* --- 10.2 · LA BARRE DE RECHERCHE DU CARNET (.rech.carnet), ordinateur seulement ---- */
.rech.carnet{display:none}
@media(min-width:1000px){
  .rech.carnet{display:flex;height:auto;min-height:76px;margin:0 var(--marge)}
  .rech.carnet .seg{background:none;border:0;border-radius:0;text-align:left;font:inherit;color:inherit;
                    cursor:pointer;padding:12px 20px;gap:4px;flex:1 1 0;align-items:flex-start}
  .rech.carnet .seg+.seg{border-left:1px solid var(--filet)}
  .rech.carnet .seg:hover,.rech.carnet .seg.ouverte{background:var(--papier2)}
  .rech.carnet .seg .l{display:block}
  .rech.carnet .seg .v{display:block;width:100%;text-align:left;font-size:17px;line-height:22px;font-weight:600;color:var(--encre);
                       white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .rech.carnet .seg .v.libre{color:var(--brume);font-weight:500}   /* « libre » : rien de choisi (jamais .vide, qui est l'etat vide du systeme) */
  .rech.carnet .go{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;
                   width:auto;height:auto;align-self:center;min-height:52px;margin:10px;padding:0 24px;gap:8px;
                   font-family:var(--titre);font-weight:600;font-size:15px;letter-spacing:-.01em;white-space:nowrap}
  .rech.carnet .go .ic{color:currentColor}
  /* le titre du carnet, au-dessus de la barre : le h1 de la page sur un ordinateur */
  .carnet-tete{padding:28px var(--marge) 16px;display:flex;align-items:flex-end;justify-content:space-between;gap:20px}
  .carnet-tete h1{font-family:var(--titre);font-weight:600;font-size:30px;line-height:34px;letter-spacing:-.02em}
  .carnet-tete p{font-size:14px;line-height:20px;color:var(--ardoise);margin-top:6px;max-width:60ch}
}

/* --- 10.3 · LA FEUILLE DU CHAMP « OU » (.lieux) et LE CURSEUR DU RAYON (.rayon) ---- */
.lieux .liste-lieux{padding:0 0 4px}
.lieux .liste-lieux .ligne{width:100%;text-align:left;font:inherit;color:inherit;background:none;border:0;
                           border-radius:0;padding:10px var(--marge);min-height:56px;cursor:pointer}
.lieux .liste-lieux .ligne+.ligne{border-top:1px solid var(--filet2)}
.lieux .liste-lieux .ligne:hover{background:var(--papier2)}
.lieux .liste-lieux .ligne .ic{flex:0 0 auto;color:var(--ardoise)}
.lieux .liste-lieux .ligne.autour .ic{color:var(--encre)}
.lieux .liste-lieux .ligne.autour{background:var(--azur-doux)}
.lieux .liste-lieux .ligne .co .n{font-size:15px;line-height:20px;font-weight:600;color:var(--encre)}
.lieux .liste-lieux .ligne .co .s{font-size:12px;line-height:16px;color:var(--brume);margin-top:1px}
.lieux .liste-lieux .ligne .d{flex:0 0 auto;font-family:var(--titre);font-variant-numeric:tabular-nums;
                              font-size:12px;color:var(--brume);white-space:nowrap}
.lieux .liste-lieux .ligne mark{background:none;color:inherit;font-weight:700;text-decoration:underline;
                                text-decoration-color:var(--vert);text-decoration-thickness:2px;text-underline-offset:2px}
.lieux .liste-lieux .indice{padding:8px var(--marge) 12px;font-size:13px;line-height:18px;color:var(--brume)}
.lieux .liste-lieux .indice b{color:var(--encre);font-weight:600}
/* LE RAYON : un curseur a quatre crans (5, 10, 25, 50 km), une phrase, les bornes.
   Le curseur natif, colore au jeton d'action ; sa piste fait 44 px de haut sous le doigt. */
.rayon{padding:14px var(--marge) 6px}
.rayon .phrase{font-size:14px;line-height:20px;color:var(--ardoise)}
.rayon .phrase b{color:var(--encre);font-family:var(--titre);font-variant-numeric:tabular-nums}
.rayon input[type=range]{display:block;width:100%;height:44px;margin:4px 0 0;accent-color:var(--azur);
                         background:transparent;cursor:pointer}
.rayon .bornes{display:flex;justify-content:space-between;font-family:var(--titre);font-weight:600;font-size:12px;
               letter-spacing:.04em;color:var(--brume);font-variant-numeric:tabular-nums;margin-top:-2px}
.rayon .bornes span{min-width:44px;text-align:center}
.rayon .bornes span:first-child{text-align:left}
.rayon .bornes span:last-child{text-align:right}
.rayon .bornes span.on{color:var(--encre)}

/* --- 10.4 · « VOS AMIS Y VONT » (.amis-vont, .ami-coach) et le tag d'amis (.tag-amis) ---- */
.amis-vont{padding-bottom:14px}
.amis-vont .section{padding-bottom:8px}
.amis-vont .rail{gap:12px;padding-bottom:6px;align-items:stretch}
.ami-coach{flex:0 0 268px;display:flex;gap:12px;padding:12px;border:1px solid var(--filet);
           background:var(--papier);color:var(--encre);text-decoration:none;align-items:flex-start}
.ami-coach .ph{width:72px;height:72px;flex:0 0 auto;background:var(--papier3);overflow:hidden}
.ami-coach .ph img{width:100%;height:100%;object-fit:cover;display:block}
.ami-coach .co{min-width:0;flex:1;display:flex;flex-direction:column;gap:4px}
.ami-coach .co .n{font-family:var(--titre);font-weight:600;font-size:15px;line-height:20px;letter-spacing:-.01em}
.ami-coach .co .s{font-size:12px;line-height:16px;color:var(--ardoise)}
.ami-coach .co .p{font-size:13px;line-height:18px;margin-top:2px}
.tag-amis{display:inline-flex;align-items:center;gap:6px;max-width:100%;padding:5px 9px;
          background:var(--vert-doux);color:var(--encre);font-size:12px;line-height:16px;font-weight:600}
.tag-amis .pile{flex:0 0 auto}
.tag-amis .pile .face{width:18px;height:18px}
.tag-amis .m{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.coach .amis .tag-amis{margin:0}
/* l'invitation douce, quand le client n'a pas encore d'ami : une ligne, pas un bandeau */
.amis-vont .invitation{display:flex;align-items:center;gap:12px;padding:12px var(--marge) 14px}
.amis-vont .invitation .ic{flex:0 0 auto;color:var(--ardoise)}
.amis-vont .invitation p{flex:1;min-width:0;font-size:13px;line-height:18px;color:var(--ardoise)}
@media(min-width:1000px){
  body.marche .amis-vont .rail{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));overflow:visible}
  body.marche .ami-coach{flex:auto}
}

/* --- 10.5 · LA GRILLE « CARNET » : des cartes blanches posees sur le fond (>= 1000 px) ---- */
@media(min-width:1000px){
  body.marche.site .grille-cartes.trois{column-gap:20px;row-gap:20px;padding:0 var(--marge) 8px;align-items:stretch}
  body.marche.site .grille-cartes.trois .coach{background:var(--papier);border:1px solid var(--filet);padding-bottom:18px}
  body.marche.site .grille-cartes.trois .coach .ph{height:200px}
  body.marche.site .grille-cartes.trois>.paquet.pose{background:none;border:0;padding:0}
  body.marche.site .grille-cartes.trois>.bande{min-height:300px}
  body.marche.site .grille-cartes.trois>.encre-pose{margin:0}
  /* les rangees de commande gardent la marge de la coque et respirent un peu plus */
  body.marche.site .rapides{padding-top:14px;padding-bottom:6px;flex-wrap:wrap}
  body.marche.site .cartouche#jours-tete{padding-top:10px}
  /* le bandeau et l'etat vide s'alignent sur la grille */
  body.marche.site #bandeau-tete .bandeau{width:calc(100% - 2 * var(--marge));margin:16px var(--marge) 0}
  body.marche.site .tri-ligne{padding-bottom:6px}
}

/* ═══════════════ 11 · LE SITE PUBLIC (lot L4, 21 septembre 2026) ═══════════════
   Les pieces du site de la place de marche (docs/32, docs/33, maquette finale
   Boat/docs/planches/coachiamo-site/finale.html), posees sur les pages PUBLIQUES
   (body.marche.site.carnet) : les deux portes de la connexion, les ecrans reels de
   l'application, l'alerte de pre-ouverture, la case d'accord, les etapes numerotees.
   L'en-tete de site, le bloc « comme un magasin » et le pied sont ceux du lot L1 (§ 9,
   une seule source : scripts/site-statique.mjs) ; la largeur de la coque est au § 10.1.
   En dessous de 1000 px, rien ne change : la coque, la barre du haut, la barre d'onglets.
   Tout en jetons : la couleur d'action est celle de --azur (le vert profond depuis la
   charte docs/31), jamais une couleur ecrite ici. */

/* --- 11.1 · Les deux portes de la connexion (.portes, .porte) ------------------ */
/* Sur telephone, un accordeon : une porte ouverte a la fois, donc UN aplat visible.
   En large, les deux portes cote a cote, ouvertes ; l'aplat suit la porte ACTIVE
   (celle qui a le focus ou le dernier clic), l'autre montre son bouton en contour. */
.portes{display:block;padding:6px 0 0}
.porte{border-top:1px solid var(--filet)}
.porte:last-child{border-bottom:1px solid var(--filet)}
.porte-tete{display:flex;align-items:center;gap:14px;width:100%;text-align:left;background:none;border:0;
            padding:16px var(--marge);color:var(--encre);cursor:pointer;min-height:44px}
.porte-tete .co{flex:1;min-width:0}
.porte-tete .cap{display:block;margin-bottom:4px}
.porte-tete h2{margin:0;font-family:var(--titre);font-weight:600;font-size:20px;line-height:24px;letter-spacing:-.015em}
.porte-tete p{margin:4px 0 0;font-size:13px;line-height:18px;color:var(--ardoise)}
.porte-tete .ic{color:var(--brume);flex:0 0 auto;transition:transform var(--duree-courte) var(--courbe)}
.porte.active .porte-tete .ic{transform:rotate(180deg)}
.porte-corps{display:none;padding-bottom:18px}
.porte.active .porte-corps{display:block}
.porte .apres{font-size:12px;line-height:16px;color:var(--brume);margin:10px 0 0}
.porte .liens{padding:6px var(--marge) 0;display:flex;flex-wrap:wrap;gap:0 18px}
.porte .code-grand{font-family:var(--titre);font-size:28px;letter-spacing:.18em;text-align:center;font-weight:600}
.porte .si-pas-js{padding:0 var(--marge) 16px}

/* --- 11.2 · Les ecrans reels de l'application (.ecrans-app, .ecran-app) -------- */
/* De VRAIES captures a 390 px (scripts/captures-application.mjs) : une rangee qui
   glisse sur telephone, une grille en large ; chaque ecran est pose sur le papier avec
   un seul trait (regle 5), sa legende dessous, et la mention « Ecran de demonstration »
   tant que les donnees viennent du semis (docs/32 § 7.2, decision 5). */
.ecrans-app{padding:6px var(--marge) 4px}
.ecran-app{flex:0 0 auto;width:236px;display:block;text-decoration:none;color:inherit;margin:0}
.ecran-app img{display:block;width:100%;height:auto;border:1px solid var(--filet);background:var(--papier2)}
.ecran-app .t{font-family:var(--titre);font-weight:600;font-size:14px;line-height:17px;color:var(--encre);margin-top:10px}
.ecran-app .d{font-size:12px;line-height:16px;color:var(--ardoise);margin-top:3px}
.ecran-app .demo{display:inline-block;margin-top:6px;font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.06em;
                 text-transform:uppercase;color:var(--brume)}

/* --- 11.3 · L'alerte de pre-ouverture (.alerte-ouverture) et la case d'accord (.accord) -- */
.alerte-ouverture .appel-alerte{padding-top:10px;padding-bottom:6px}
.alerte-ouverture .champ-l{padding-bottom:6px}
.accord{display:flex;gap:12px;align-items:flex-start;padding:10px var(--marge);cursor:pointer;color:var(--encre);font-size:13px;line-height:18px}
.accord input[type="checkbox"]{appearance:auto;-webkit-appearance:checkbox;width:22px;height:22px;margin:0;flex:0 0 auto;font-size:16px;
                               accent-color:var(--encre);cursor:pointer;position:relative}
/* la zone de toucher de 44 px, sans bouger le dessin (regle 15) */
.accord input[type="checkbox"]::before{content:"";position:absolute;left:50%;top:50%;width:44px;height:44px;transform:translate(-50%,-50%)}
.accord.faux{color:var(--corail)}
.accord.faux input{outline:2px solid var(--corail);outline-offset:1px}

/* --- 11.4 · Les etapes numerotees (.ligne.etape + .no-etape), l'appel, le pied marine -- */
/* Remontes des pages /devenir-coach/ et /comment-ca-marche/ (lot C du 20/09), ou ils
   vivaient en style local : trois pages les partagent desormais. */
.no-etape{flex:0 0 36px;font-family:var(--titre);font-weight:700;font-size:22px;line-height:24px;
          letter-spacing:-.03em;color:var(--brume);font-variant-numeric:tabular-nums}
.ligne.etape{align-items:flex-start}
.ligne.etape .co{padding-top:2px}
.appel{padding:8px var(--marge) 22px}
.appel .c12{margin-top:10px}
.pied-encre .ligne+.ligne{border-top-color:rgba(255,255,255,.14)}
.pied-encre .ligne .fort{color:var(--contre-txt)}
.pied-encre .ligne .c12{color:rgba(255,255,255,.72)}
.pied-encre .ligne .ic{color:rgba(255,255,255,.72)}
.pied-encre .section .cap{color:rgba(255,255,255,.72)}
/* la carte d'un palier de prix (/devenir-coach/) : le prix en grand dans la carte de raccourci */
.racc .prix-palier{font-family:var(--titre);font-weight:700;font-size:28px;line-height:30px;
                   letter-spacing:-.03em;color:var(--encre);margin:8px 0 6px;font-variant-numeric:tabular-nums}
.racc .prix-palier small{display:block;font-size:13px;line-height:17px;font-weight:600;letter-spacing:0;color:var(--ardoise);margin-top:2px}

/* --- 11.5 · Au-dela de 1000 px : les portes cote a cote, les ecrans en grille ---- */
@media(min-width:1000px){
  body.marche.site .portes{display:grid;grid-template-columns:1fr 1fr;gap:0 28px;padding:10px var(--marge) 0}
  body.marche.site .porte{border:1px solid var(--filet);background:var(--papier)}
  body.marche.site .porte:last-child{border-bottom:1px solid var(--filet)}
  body.marche.site .porte-tete{cursor:default}
  body.marche.site .porte-tete .ic{display:none}
  body.marche.site .porte-corps{display:block}
  /* l'aplat suit la porte active ; l'autre porte montre son bouton en contour */
  body.marche.site .porte:not(.active) .action{background:none;color:var(--encre);border:1px solid var(--filet)}
  body.marche.site .ecrans-app.glisse{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;overflow:visible;padding-left:var(--marge);padding-right:var(--marge)}
  body.marche.site .ecrans-app.glisse.quatre{grid-template-columns:repeat(4,minmax(0,1fr))}
  body.marche.site .ecran-app{width:auto}
  body.marche.site .ecrans-app~.reperes{display:none}
}
/* la nuit : tout est en jetons ; rien a redire */

/* ═══════════════ 12 · [M4] « VOS AMIS Y VONT » ET LA STORY DE SEANCE (21 septembre 2026) ═══════════════
   Lot M4 de la nuit du 21/09 (docs/35 § 8 et § 9, ecrans 8, 9 et 10). Trois pieces :
     12.1  .amis-vont.doux + .amis-vont .sous : la section de la recherche sur le fond tilleul a 12 %
          (charte docs/31 : le tilleul est une respiration, jamais un aplat sous du blanc), avec son
          sous-titre « Ce qu'ils ont choisi de montrer ». Le tag de carte garde .tag-amis (§ 10.4).
     12.2  .amis-fiche : le bloc detaille de la fiche du coach : une ligne par ami (visage anonyme,
          prenom, « 14 seances de tennis · la derniere en aout », le niveau s'il est montre), le lien
          « Son avis » a droite, le pied qui dit qui a choisi de montrer quoi. Aucun nom qui ne vienne
          de la route : l'ecran n'ajoute rien.
     12.3  .story-* : la feuille « Votre seance en story » : l'apercu du canvas (9:16 ou 1:1, clair ou
          sombre), le choix de la photo (galerie ou l'instant, <input type=file> masque), les cases de
          ce qui sort (sport toujours, ville, gestes un a un, prenom du coach s'il est citable), la
          phrase de garantie, le bouton « Partager » en barre du bas. Tout en jetons. */

/* --- 12.1 · la section « Vos amis y vont » sur le fond tilleul (recherche) ---- */
.amis-vont.doux{background:var(--tilleul-12);border-top:1px solid var(--tilleul-24);border-bottom:1px solid var(--tilleul-24);padding-top:6px}
.amis-vont .sous{display:block;font-size:12px;line-height:16px;color:var(--ardoise);padding:0 var(--marge) 10px;margin-top:-4px}
.amis-vont.doux .ami-coach{border-color:var(--tilleul-24)}
/* sur le fond tilleul, le tag garde le papier : vert doux sur vert doux ne se lisait plus */
.amis-vont.doux .tag-amis{background:var(--papier);border:1px solid var(--tilleul-24)}

/* --- 12.2 · le bloc « Vos amis y vont » de la fiche du coach (.amis-fiche) ---- */
.amis-fiche{padding-bottom:4px}
.amis-fiche .section{padding-bottom:4px}
.amis-fiche .ami{display:flex;align-items:center;gap:12px;padding:11px var(--marge)}
.amis-fiche .ami+.ami{border-top:1px solid var(--filet2)}
.amis-fiche .ami .face{width:40px;height:40px}
.amis-fiche .ami .co{flex:1;min-width:0}
.amis-fiche .ami .nom{font-size:14px;line-height:18px;font-weight:600}
.amis-fiche .ami .meta{display:block;font-size:12px;line-height:16px;color:var(--ardoise);margin-top:2px}
.amis-fiche .ami .niveau{display:block;font-size:12px;line-height:16px;color:var(--ardoise);margin-top:2px}
.amis-fiche .ami .niveau .chiffre{font-family:var(--titre);font-weight:600;color:var(--encre);font-variant-numeric:tabular-nums}
.amis-fiche .ami .lien{flex:0 0 auto;color:var(--lien)}
.amis-fiche .pied{display:flex;gap:10px;align-items:flex-start;padding:10px var(--marge) 14px;font-size:12px;line-height:16px;color:var(--ardoise)}
.amis-fiche .pied .ic{flex:0 0 auto;color:var(--ardoise);margin-top:1px}
.amis-fiche .compte{height:28px;display:inline-flex;align-items:center;padding:0 10px;border:1px solid var(--tilleul-24);background:var(--tilleul-12);
                    font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--encre)}
/* l'avis d'un ami, dans sa feuille : la note en jauge, le texte, le mois */
.avis-ami{padding:8px var(--marge) 18px}
.avis-ami .jauge{margin:6px 0 10px}
.avis-ami p{font-size:14px;line-height:20px;color:var(--encre)}

/* --- 12.3 · la story de seance (.story-*) ---- */
.story-apercu{display:flex;gap:14px;align-items:flex-start;padding:6px var(--marge) 12px}
.story-cadre{flex:1;min-width:0;background:var(--papier3);position:relative;overflow:hidden;
             aspect-ratio:9/16;max-height:52dvh;margin:0 auto;display:flex;align-items:center;justify-content:center}
.story-cadre.carre{aspect-ratio:1/1;max-height:42dvh}
.story-cadre canvas{display:block;max-width:100%;max-height:100%;width:auto;height:auto}
.story-cadre .attente{position:absolute;inset:0;display:grid;place-items:center;font-size:12px;color:var(--ardoise);background:var(--papier3)}
.story-cotes{display:flex;flex-direction:column;gap:8px;flex:0 0 auto;width:96px}
.story-cotes .pastille{height:40px;justify-content:center;padding:0 10px;font-family:var(--titre);font-variant-numeric:tabular-nums}
.story-cotes .cap{margin-top:8px}
.story-photo{display:flex;gap:8px;padding:0 var(--marge) 8px}
.story-photo .second{flex:1;min-width:0;font-size:13px;padding:0 10px}
.story-photo .second .ic{flex:0 0 auto}
.story-photo input[type="file"]{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.story-choix .ligne{padding-top:11px;padding-bottom:11px}
.story-choix .ligne .co .c12{margin-top:2px}
.story-choix .ligne.fixe .case{background:var(--papier2);border-color:var(--filet);color:var(--brume)}
.story-choix .ligne.geste{padding-left:calc(var(--marge) + 28px);padding-top:9px;padding-bottom:9px}
.story-choix .ligne.geste .co .c14{display:flex;align-items:baseline;gap:8px}
.story-choix .ligne.geste .marche{font-family:var(--titre);font-weight:600;font-variant-numeric:tabular-nums;color:var(--ardoise);font-size:13px}
.story-garantie{display:flex;gap:10px;align-items:flex-start;padding:12px var(--marge) 18px;font-size:13px;line-height:18px;color:var(--ardoise)}
.story-garantie .ic{flex:0 0 auto;color:var(--ardoise);margin-top:1px}

/* --- 6.39 · LE DÉFI DU JOUR (lot M2, 21 septembre 2026, docs/35 § 7) ----------------
   Les écrans du client pour le défi : l'activation (.defi-activation), la carte du défi
   (.defi-carte), le viseur DANS la coque (.defi-viseur : la barre du bas reste là, le geste
   est un seul appui sur .defi-obtu), la composition (.defi-compo), la carte d'un ami dans le
   fil (.defi-fil, .defi-photo), la photo double (.defi-double : grande + vignette arrondie,
   la seule vignette à coins ronds du système : c'est une PHOTO dans une photo, pas un cadre),
   les trois réactions (.defi-react : la mienne sur tilleul 12 % avec bord tilleul 24 %, texte
   marine : 13,9 contre 1), le timbre du défi (.defi-timbre, tourné de 3 degrés, marine, capitale
   tilleul : la signature qui n'est pas BeReal), la série douce (.defi-serie + .defi-frise, le
   même dessin que la frise des semaines du carnet : pleine, hachurée « pause », vide, cerclée
   aujourd'hui), les souvenirs (.defi-souv), la barre de l'envoi (.defi-envoi), le QR de
   l'écran d'ordinateur (.defi-qr). Aucune couleur en dur hors le blanc d'un liseré de photo et
   du QR : le fond du viseur est l'encre, le timbre est le marine de la charte à 92 %. Aucun
   compte à rebours nulle part (§ 12.1). */
.defi-activation .defi-photo{margin:0 var(--marge)}
.defi-activation h1{font-family:var(--titre);font-weight:700;font-size:26px;line-height:30px;letter-spacing:-.03em;
                    padding:16px var(--marge) 6px}
.defi-activation .courant{font-size:14px;line-height:20px;color:var(--ardoise);padding:0 var(--marge) 10px}
.defi-activation .ligne .c12{margin-top:3px}
.defi-activation .pied{font-size:12px;line-height:16px;color:var(--brume);padding:10px var(--marge) 18px;text-align:center}
.defi-activation .lien.centre{display:flex;justify-content:center;width:100%;min-height:44px;margin-top:4px}
/* la carte du défi : surtitre en capitale, titre, consigne, trois puces, la version assise, UNE ligne d'état */
.defi-carte{padding:14px var(--marge) 6px}
.defi-carte h2{font-family:var(--titre);font-weight:700;font-size:28px;line-height:32px;letter-spacing:-.03em;margin-top:6px}
.defi-carte .consigne{font-size:15px;line-height:21px;color:var(--ardoise);margin-top:8px}
.defi-puces{display:flex;flex-wrap:wrap;gap:6px 14px;padding:10px var(--marge) 0;font-size:12px;line-height:16px;color:var(--ardoise)}
.defi-puces span{display:inline-flex;align-items:center;gap:5px;font-family:var(--titre);font-weight:600}
.defi-puces .ic{width:14px;height:14px;color:var(--brume)}
.defi-assise{display:flex;align-items:flex-start;gap:10px;width:100%;text-align:left;padding:10px var(--marge);
             min-height:48px;color:var(--encre);background:none;font-size:13px;line-height:18px}
.defi-assise .case{margin-top:-2px}
.defi-assise span:not(.case){flex:1;min-width:0}
.defi-assise .case{flex:0 0 auto}
.defi-assise b{font-weight:600}
.defi-etat{display:flex;align-items:flex-start;gap:10px;padding:10px var(--marge) 4px;font-size:13px;line-height:18px;color:var(--ardoise)}
.defi-etat .ic{flex:0 0 auto;width:16px;height:16px;color:var(--brume);margin-top:1px}
.defi-etat b{color:var(--encre);font-weight:600}
.defi-bouton{padding:12px var(--marge) 8px}
/* la série douce : une ligne privée, la frise de quatorze cases, aucun classement, aucun or (§ 4.3) */
.defi-serie{padding:12px var(--marge) 14px}
.defi-serie .t{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.defi-serie .t b{font-family:var(--titre);font-weight:600;font-size:15px;line-height:19px}
.defi-serie .s{font-size:12px;line-height:16px;color:var(--brume);margin-top:2px}
.defi-frise{display:flex;gap:4px;margin-top:10px}
.defi-frise i{flex:1;height:22px;display:block;background:var(--papier2);position:relative}
.pose .defi-frise i{background:var(--papier)}
.defi-frise i.on{background:var(--encre)}
.defi-frise i.pause,.pose .defi-frise i.pause{background:repeating-linear-gradient(135deg,var(--filet) 0 2px,transparent 2px 6px)}
.defi-frise i.now,.pose .defi-frise i.now{outline:2px solid var(--encre);outline-offset:-2px;background:none}
.defi-frise i.now.on{background:var(--encre)}
.defi-reperes{display:flex;gap:6px 14px;flex-wrap:wrap;margin-top:8px;font-size:12px;line-height:16px;color:var(--ardoise)}
.defi-reperes span{display:inline-flex;align-items:center;gap:6px}
.defi-reperes span::before{content:"";width:10px;height:10px;border-radius:var(--rayon-doigt);border:1.5px solid var(--brume)}
.defi-reperes span.atteint::before{border-color:var(--action);background:var(--action)}
/* la photo double : la grande EST la carte, la vignette est une photo posée dans la photo */
.defi-double{position:relative;aspect-ratio:3/4;overflow:hidden;background:var(--papier3);display:block}
.defi-double img.grande{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
/* le canvas du flou d'un doigt prend la place exacte de l'image (même rapport 3:4) : sans cette règle, il
   s'affichait à ses 1080 px et l'on ne voyait qu'un coin de la photo pendant la retouche (21/09) */
.defi-double canvas.grande{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none}
.defi-double img.vig{position:absolute;left:4%;top:3.2%;width:30%;aspect-ratio:3/4;object-fit:cover;border:3px solid #FFFFFF;border-radius:14px}
.defi-double.egal{aspect-ratio:1/1}
.defi-double.mini img.vig{border-width:2px;border-radius:8px}
/* le timbre : la signature du défi, tournée de 3 degrés, posée en bas à gauche d'une photo */
.defi-timbre{position:absolute;left:12px;bottom:14px;max-width:80%;padding:8px 12px 9px;background:rgba(22,38,63,.92);color:#FFFFFF;
             transform:rotate(-3deg);transform-origin:left bottom}
.defi-timbre .cap{display:block;color:var(--tilleul);letter-spacing:.12em;font-size:12px;line-height:14px}
.defi-timbre b{display:block;font-family:var(--titre);font-weight:700;font-size:16px;line-height:19px;margin-top:2px;
               overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.defi-timbre small{display:block;font-family:var(--titre);font-weight:600;font-size:12px;line-height:15px;color:rgba(255,255,255,.82);margin-top:2px}
.defi-double.mini .defi-timbre,.defi-grille .defi-timbre{display:none}
/* le viseur, dans la coque : bandeau, cadre 3:4 sur l'encre, la puce d'étape, l'éclair, le geste */
.defi-viseur{padding:0 0 12px}
.defi-bandeau{display:flex;flex-direction:column;gap:2px;padding:10px var(--marge) 10px}
.defi-bandeau b{font-family:var(--titre);font-weight:700;font-size:18px;line-height:22px;letter-spacing:-.02em}
.defi-cadre{position:relative;margin:0 var(--marge);aspect-ratio:3/4;background:var(--encre);overflow:hidden}
.defi-cadre .defi-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.defi-cadre .defi-video.miroir{transform:scaleX(-1)}
.defi-cadre .defi-vignette-video{inset:auto;left:4%;top:3.2%;width:30%;height:auto;aspect-ratio:3/4;border:3px solid #FFFFFF;border-radius:14px;z-index:2}
.defi-puce{position:absolute;left:12px;bottom:12px;z-index:3;display:inline-flex;align-items:center;gap:7px;padding:7px 11px;
           background:rgba(22,38,63,.78);color:#FFFFFF;font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.06em;text-transform:uppercase}
.defi-flash{position:absolute;inset:0;background:#FFFFFF;opacity:0;pointer-events:none;z-index:4;transition:opacity var(--duree) var(--courbe)}
.defi-flash.on{opacity:.9;transition:none}
.defi-sous{font-size:13px;line-height:18px;color:var(--ardoise);text-align:center;padding:12px var(--marge) 0;min-height:30px}
.defi-vb{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:8px;padding:10px var(--marge) 0}
.defi-vb .lien{justify-content:center;min-height:44px}
.defi-vb .lien[hidden]{visibility:hidden;display:inline-flex}
.defi-obtu{width:76px;height:76px;border-radius:var(--rayon-doigt);border:4px solid var(--encre);background:none;display:grid;place-items:center;
           padding:0;justify-self:center;position:relative;transition:transform var(--duree-courte) var(--ressort)}
.defi-obtu span{width:58px;height:58px;border-radius:var(--rayon-doigt);background:var(--encre);display:block;transition:transform var(--duree-courte) var(--courbe)}
.defi-obtu:active span{transform:scale(.9)}
.defi-obtu[disabled]{opacity:.4}
/* la composition : la photo double avec le timbre, la phrase sur les tiers, deux boutons, le pied.
   « ENVOYER » RESTE AU-DESSUS DE LA BARRE DU BAS À 390 × 844 (œil indépendant du 21/09 : avec le choix
   d'audience et sa note, le bouton passait 53 px sous la barre). Trois mesures : la photo ne dépasse pas
   52 % de la hauteur de l'écran (largeur suivie par le rapport 3:4, centrée ; pleine largeur dès qu'elle
   tient), « Flouter » devient une puce posée SUR la photo (.defi-outil, même dessin que .defi-puce : c'est
   l'outil de cette photo, il n'a pas besoin d'une ligne à lui), et les blancs se resserrent de 4 px. */
.defi-compo{padding:0 var(--marge);container-type:inline-size}
.defi-compo .defi-double{width:100%;margin:0 auto}
@supports (height:1cqw){
  .defi-compo .defi-double{height:min(calc(100cqw * 4 / 3),52dvh);width:auto}
}
.defi-outil{position:absolute;right:10px;bottom:10px;z-index:3;display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 12px 0 10px;
            border-radius:var(--rayon-doigt);background:rgba(22,38,63,.78);color:#FFFFFF;
            font-family:var(--titre);font-weight:600;font-size:13px;letter-spacing:-.01em}
.defi-outil .ic{width:16px;height:16px;flex:0 0 auto}
.defi-outil::before{content:"";position:absolute;left:50%;top:50%;width:max(100%,44px);height:44px;transform:translate(-50%,-50%)}
.defi-avert{display:flex;gap:10px;align-items:flex-start;padding:10px var(--marge) 0;font-size:13px;line-height:18px;color:var(--ardoise)}
.defi-avert .ic{flex:0 0 auto;width:16px;height:16px;margin-top:1px;color:var(--brume)}
.defi-deux{display:grid;grid-template-columns:1fr 1.5fr;gap:10px;padding:8px var(--marge) 0}
.defi-deux .second,.defi-deux .action{width:100%}
.defi-pied{font-size:12px;line-height:16px;color:var(--brume);text-align:center;padding:10px var(--marge) 16px}
/* la barre de l'envoi : une jauge tilleul, jamais un chiffre anxiogène ; l'échec garde la photo ici */
.defi-envoi{padding:10px var(--marge) 4px}
.defi-envoi .jauge-l{height:6px;background:var(--papier2);overflow:hidden}
.defi-envoi .jauge-l i{display:block;height:100%;background:var(--tilleul);width:0;transition:width var(--duree) var(--courbe)}
.defi-envoi .l{font-size:12px;line-height:16px;color:var(--brume);margin-top:6px}
/* le fil « Entre amis » : la bande du haut, la grande carte, la grille de deux */
.defi-bande{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px var(--marge)}
.defi-bande .co{flex:1;min-width:0}
.defi-bande b{display:block;font-family:var(--titre);font-weight:700;font-size:17px;line-height:21px;letter-spacing:-.02em}
.defi-bande small{display:block;font-size:12px;line-height:16px;color:var(--ardoise);margin-top:3px}
.defi-bande .lien{flex:0 0 auto}
.defi-fil{padding:0 var(--marge) 8px}
.defi-fil>.defi-photo{margin-bottom:12px}
.defi-grille{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.defi-photo{display:block;min-width:0}
.defi-photo .pied{display:flex;align-items:center;gap:10px;padding:8px 0 0;min-height:44px}
.defi-photo .pied .qui{flex:1;min-width:0}
.defi-photo .pied .qui b{display:block;font-size:14px;line-height:18px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.defi-photo .pied .qui small{display:block;font-size:12px;line-height:16px;color:var(--brume)}
.defi-photo .pied .tard{font-size:12px;line-height:16px;color:var(--brume);flex:0 0 auto}
.defi-grille .defi-photo .pied .face{display:none}
.defi-grille .defi-photo .etat{padding:0 6px;letter-spacing:.02em}
.defi-reacts{display:flex;align-items:center;gap:6px;padding-top:6px}
.defi-react{display:inline-flex;align-items:center;gap:5px;min-height:36px;padding:0 10px;border:1px solid var(--filet);background:none;
            color:var(--encre);font-family:var(--titre);font-weight:600;font-size:12px;position:relative;
            transition:background var(--duree-courte) var(--courbe),border-color var(--duree-courte) var(--courbe)}
.defi-react::before{content:"";position:absolute;left:50%;top:50%;width:max(100%,44px);height:44px;transform:translate(-50%,-50%)}
.defi-react .ic{width:16px;height:16px}
.defi-react.on{background:var(--tilleul-12);border-color:var(--tilleul-24)}
.defi-react .n{font-variant-numeric:tabular-nums}
.defi-reacts .carre{margin-left:auto}
.defi-grille .defi-react{padding:0 7px;min-height:32px}
.defi-grille .defi-react .mot{display:none}
/* les jours précédents : un rail de pastilles, sept jours, celui qu'on lit allumé */
.defi-jours{padding-top:10px;padding-bottom:6px}
/* les souvenirs : la grille de trois, le point tilleul « à l'heure », cerclé « plus tard », pointillé « pause » */
.defi-mois{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px var(--marge) 8px}
.defi-mois .t{font-family:var(--titre);font-weight:600;font-size:15px;line-height:19px;flex:1;text-align:center;text-transform:capitalize}
.defi-souvs{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:0 var(--marge) 12px}
.defi-souv{position:relative;display:block;padding:0;background:none;text-align:left;color:var(--encre);border:0}
.defi-souv .j{position:absolute;left:6px;top:6px;z-index:2;font-family:var(--titre);font-weight:700;font-size:13px;line-height:16px;color:#FFFFFF;
              text-shadow:0 1px 3px rgba(0,0,0,.5);font-variant-numeric:tabular-nums}
.defi-souv .pt{position:absolute;right:7px;bottom:7px;z-index:2;width:10px;height:10px;border-radius:var(--rayon-doigt);background:var(--tilleul);border:2px solid #FFFFFF}
.defi-souv .pt.tard{background:none;border:2px solid #FFFFFF}
.defi-souv.vide{aspect-ratio:3/4;border:1px dashed var(--filet);display:grid;place-items:center;align-content:center;background:var(--papier)}
.defi-souv.vide .j{position:static;color:var(--brume);text-shadow:none}
.defi-souv.vide small{display:block;font-size:12px;line-height:16px;color:var(--brume)}
.defi-liens{display:flex;justify-content:space-between;gap:12px;padding:4px var(--marge) 16px}
/* l'écran d'un ordinateur : la phrase, le QR, aucun bouton plein */
.defi-ordi{padding:18px var(--marge) 22px;text-align:center}
.defi-ordi h2{font-family:var(--titre);font-weight:700;font-size:22px;line-height:26px;letter-spacing:-.02em}
.defi-ordi p{font-size:14px;line-height:20px;color:var(--ardoise);margin-top:8px}
.defi-qr{display:block;width:180px;height:180px;margin:16px auto 6px;border:1px solid var(--filet);background:#FFFFFF}
/* les états (caméra refusée, hors ligne, application non posée) : le message d'erreur du système (§ 6.18), avec sa place */
.defi-etats{padding:8px var(--marge) 4px}
.defi-etats .erreur{margin-left:0;margin-right:0}
/* --- DÉCOUVRIR (lot E, 21 septembre 2026, docs/40 § 4) ---------------------------------
   Le second fil des photos. Cinq classes : le rail des deux fils (.bascule-fil, dessiné sur
   .bascule-theme § 6.28 : deux segments à parts égales, 44 px, capitales Archivo 12 espacées de
   0,1 em, le segment allumé en encre sur papier, largeur pleine moins les marges), le choix
   d'audience à l'envoi (.defi-audience : deux boutons de 44 px moitié-moitié, le choisi PLEIN EN
   ENCRE comme .pastille.on, jamais le vert qui reste au seul « Envoyer » ; .defi-audience-note
   sous le groupe), la carte de Découvrir (.defi-photo.decouvrir : « Ajouter » en contour 44 px,
   « Demande envoyée » en .tard ; les réactions sans mot et UN seul chiffre .n.total à côté), la
   sentinelle de la pagination et « Vous avez tout vu. » (.defi-fin). Aucun classement, aucun
   rang, aucune couleur en dur. */
.bascule-fil{display:flex;margin:10px var(--marge) 0;border:1px solid var(--filet);background:var(--papier)}
.bascule-fil button{flex:1 1 0;height:44px;display:inline-flex;align-items:center;justify-content:center;gap:6px;
                    font-family:var(--titre);font-weight:600;font-size:12px;letter-spacing:.1em;text-transform:uppercase;
                    color:var(--brume);background:none;padding:0 10px;
                    transition:background var(--duree-courte) var(--courbe),color var(--duree-courte) var(--courbe)}
.bascule-fil button+button{border-left:1px solid var(--filet)}
.bascule-fil button[aria-pressed="true"]{background:var(--encre);color:var(--papier)}
.bascule-fil+.defi-bande{padding-top:14px}
/* le choix d'audience à l'envoi : « Mes amis » toujours choisi à l'ouverture (docs/40 décision 1) */
.defi-audience{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:8px var(--marge) 0}
.defi-audience button{height:44px;display:inline-flex;align-items:center;justify-content:center;padding:0 10px;
                      border:1px solid var(--encre);background:none;color:var(--encre);
                      font-family:var(--titre);font-weight:600;font-size:13px;letter-spacing:-.01em;
                      transition:background var(--duree-courte) var(--courbe),color var(--duree-courte) var(--courbe)}
.defi-audience button[aria-checked="true"]{background:var(--encre);color:var(--papier)}
.defi-audience-note{font-size:12px;line-height:16px;color:var(--ardoise);padding:6px var(--marge) 0;text-align:center}
.defi-audience-note[hidden]{display:none}
/* la carte de Découvrir : le pied dit « Léa M. · il y a 12 min · 2 amis en commun », puis « Ajouter » */
.defi-photo.decouvrir .pied{align-items:center}
.defi-photo.decouvrir .ajouter{height:36px;padding:0 12px;flex:0 0 auto;font-size:13px}
.defi-photo.decouvrir .ajouter .ic{width:16px;height:16px}
.defi-photo.decouvrir .ajouter[disabled]{opacity:.5}
.defi-grille .defi-photo.decouvrir .ajouter{height:32px;padding:0 9px;font-size:12px;gap:5px}
.defi-grille .defi-photo.decouvrir .pied{flex-wrap:wrap;gap:6px 8px}
.defi-grille .defi-photo.decouvrir .pied .qui{flex:1 1 100%}
.defi-grille .defi-photo.decouvrir .pied .ajouter,.defi-grille .defi-photo.decouvrir .pied .tard{margin-left:0}
.defi-reacts .n.total{font-family:var(--titre);font-weight:600;font-size:12px;line-height:16px;color:var(--ardoise);
                      font-variant-numeric:tabular-nums;padding:0 2px;min-width:12px}
.defi-reacts .n.total[hidden]{display:none}
.defi-photo.decouvrir .defi-react{padding:0 10px;gap:0}
.defi-grille .defi-photo.decouvrir .defi-react{padding:0 7px}
/* la pagination : la sentinelle (invisible) à deux écrans de la fin, puis « Vous avez tout vu. » */
.defi-sentinelle{height:1px;margin-top:-1px}
.defi-fin{text-align:center;padding:14px 0 4px}
.defi-fin[hidden]{display:none}

/* ==========================================================================
   13 · LE COMPTE DU COACH ET L'APERCU DE SA FICHE (lot M5, 21 septembre 2026, docs/34 § 7)
   ==========================================================================
     13.1  .cadre-apercu : la fiche publique du coach rendue DANS la coque de son espace
           (/espace/?vue=apercu, aussi /espace/apercu/), en lecture. Une ligne d'information
           (« C'est ce que voient tes clients ») et le cadre de la vraie fiche (/c/<slug>/?apercu=1),
           jamais une copie dessinee a la main : ce que le coach voit est ce que le client voit.
     13.2  body.apercu : la fiche quand elle est ouverte en apercu : la barre du bas du client et
           le site autour disparaissent (on est deja dans une coque), la fleche de retour aussi, et
           l'action « Reserver » de la barre d'action est INERTE (.action.inerte) : aucun lien de
           reservation actif dans un apercu (docs/34 § 7.2).
   Tout en jetons ; la nuit suit d'elle-meme. */

/* --- 13.1 · Le cadre de l'apercu (.cadre-apercu) -------------------------------- */
.cadre-apercu{display:flex;flex-direction:column;
              /* la hauteur restante sous la barre du haut : la fiche defile DANS son cadre, la page ne defile pas
                 (la marge negative annule le degagement de .corps.sous-onglets, § 4.1) */
              height:calc(100dvh - var(--h-tete) - env(safe-area-inset-top,0px) - var(--h-onglets) - var(--bas));
              margin-bottom:calc(-1 * (var(--h-onglets) + var(--bas) + 8px + var(--h-pose)));
              min-height:420px}
.cadre-apercu .ligne.etat-info{flex:0 0 auto}
.cadre-apercu .cadre{flex:1 1 auto;min-height:0;position:relative;background:var(--papier)}
.cadre-apercu iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:var(--papier)}
/* au-dela de 1000 px la barre du bas du coach n'existe plus : le cadre reprend sa hauteur */
@media(min-width:1000px){.cadre-apercu{height:calc(100dvh - var(--h-tete) - env(safe-area-inset-top,0px));margin-bottom:0}}

/* --- 13.2 · La fiche ouverte en apercu (body.apercu) ------------------------------- */
body.apercu .onglets,body.apercu .site-tete,body.apercu .site-pied,body.apercu .site-bloc,
body.apercu .tete #retour{display:none}
body.apercu .corps.sous-barre.sous-onglets{padding-bottom:calc(120px + var(--bas) + var(--h-pose))}
body.apercu .app:has(>.onglets) .barre-bas:not(.feuille .barre-bas){bottom:0;padding-bottom:var(--bas)}
/* l'action inerte : le dessin du bouton, sans le geste (opacite, aucun pointeur, aucun lien) */
.barre-bas .action.inerte{opacity:.55;pointer-events:none;cursor:default}

/* ═══════════════════════════════════════════════════════════════════════
   14 · [W2 22/09] LE TABLEAU DE BORD EPURE DU COACH (.vue-tb, .carte-tb, .tb-*, .pli-tb) — docs/42 § 3.9
   « Le tableau de bord : trop d'informations, trop de trucs ; fais-moi un truc assez Apple,
   design. » Au premier ecran, TROIS choses : le bonjour et la journee en une phrase, l'argent
   du jour en grand chiffre, la prochaine seance ; puis « A traiter » ; le reste derriere un
   pli « Voir plus ». Des cartes BLANCHES posees sur le papier chaud, sans bordure, sans ombre,
   rayon 0 ; 24 px d'air entre les groupes ; un seul aplat vert. La nuit, le papier est le fond
   sombre et la carte la surface posee (papier2). Tout en jetons. LISEZ-MOI § 24.
   ═══════════════════════════════════════════════════════════════════════ */
.vue-tb{--tb-fond:var(--papier-chaud);--tb-carte:var(--papier);background:var(--tb-fond);
        min-height:calc(100dvh - var(--h-tete));padding-bottom:24px}
:root[data-theme="dark"] .vue-tb{--tb-fond:var(--papier);--tb-carte:var(--papier2)}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .vue-tb{--tb-fond:var(--papier);--tb-carte:var(--papier2)}}
/* 14.1 · le bonjour : la face, le prenom en Archivo 28, la journee en une phrase (deux lignes au plus) */
.tb-accueil{display:flex;gap:14px;align-items:flex-start;padding:24px var(--marge) 20px}
.tb-accueil .face{width:56px;height:56px}
.tb-accueil .co{flex:1;min-width:0}
.tb-accueil h1{font-family:var(--titre);font-weight:700;font-size:28px;line-height:32px;letter-spacing:-.03em;color:var(--encre)}
.tb-accueil .tb-phrase{font-size:16px;line-height:22px;color:var(--ardoise);margin-top:4px;
                       display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* 14.2 · la carte : blanche, sans bordure, 20 px de remplissage, 12 px entre deux */
.carte-tb{display:block;background:var(--tb-carte);color:var(--encre);margin:0 var(--marge) 12px;
          padding:18px 20px 20px;border:0;border-radius:0;box-shadow:none;position:relative}
a.carte-tb:active{background:var(--papier2)}
.carte-tb .cap{display:block}
/* la carte de l'argent du jour : le chiffre Archivo 48, tabulaire, qui compte au montage */
.argent-jour .v{display:block;font-family:var(--titre);font-weight:700;font-size:48px;line-height:52px;
                letter-spacing:-.036em;font-variant-numeric:tabular-nums;margin-top:8px;color:var(--encre)}
.argent-jour .l{font-size:13px;line-height:17px;color:var(--ardoise);margin-top:6px}
.argent-jour .fl{position:absolute;right:16px;top:18px;color:var(--brume)}
/* la carte de la prochaine seance : l'heure Archivo 24, le nom 17/600, le detail 13, la face a droite */
.prochaine .rang{display:flex;align-items:center;gap:14px;margin-top:10px;min-height:48px}
.prochaine .h{font-family:var(--titre);font-weight:700;font-size:24px;line-height:28px;letter-spacing:-.02em;
              font-variant-numeric:tabular-nums;flex:0 0 auto;min-width:64px}
.prochaine .h small{display:block;font-size:12px;line-height:14px;font-weight:600;letter-spacing:.02em;color:var(--brume)}
.prochaine .co{flex:1;min-width:0}
.prochaine .nom{font-size:17px;line-height:21px;font-weight:600}
.prochaine .meta{font-size:13px;line-height:17px;color:var(--ardoise);margin-top:2px}
.prochaine .face{width:40px;height:40px}
.prochaine .rien{font-size:16px;line-height:22px;color:var(--ardoise);margin-top:8px}
.prochaine .rien .lien{display:inline-block;margin-top:6px}
/* l'enveloppe du geste (Athlon.glisserPourAgir) prend la carte : le fond doit suivre la marge */
.vue-tb .tirer.carte-tb-env{margin:0 var(--marge) 12px}
.vue-tb .tirer.carte-tb-env>.dessus{background:var(--tb-carte)}
.vue-tb .tirer.carte-tb-env .carte-tb{margin:0}
/* 14.3 · l'action : LE seul aplat vert de l'ecran, pleine largeur, 48 px, 24 px d'air au-dessous */
.tb-action{padding:12px var(--marge) 24px}
/* 14.4 · « A traiter » : le cap et le nombre (Archivo 20) sur la meme ligne ; des lignes de 56 px
   sur la carte blanche, un point d'etat a gauche, le chevron a droite ; un seul filet interieur */
.tb-cap{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:0 var(--marge) 12px}
.tb-cap .n{font-family:var(--titre);font-weight:700;font-size:20px;line-height:22px;letter-spacing:-.02em;
           font-variant-numeric:tabular-nums;color:var(--encre)}
.tb-liste{background:var(--tb-carte);margin:0 var(--marge) 12px}
.tb-liste .tb-ligne{display:flex;align-items:center;gap:12px;min-height:56px;padding:8px 16px 8px 20px;color:var(--encre);
                    width:100%;text-align:left;background:none;border:0}
.tb-liste>*+*{border-top:1px solid var(--filet2)}
.tb-ligne .point{flex:0 0 auto}
.tb-ligne .co{flex:1;min-width:0}
.tb-ligne .t{font-size:15px;line-height:20px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tb-ligne .d{font-size:13px;line-height:17px;color:var(--ardoise);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tb-ligne .ic.droite{color:var(--brume);flex:0 0 auto}
/* la demande courte (.tb-dem, glissee pour decider) vit dans la meme carte : son fond suit, son filet
   gauche d'etat (.etat-attente) reste : c'est le point d'etat qui dit l'attente */
.tb-liste .tb-dem{background:var(--tb-carte)}
.tb-liste .decider>.dessus,.tb-liste .tirer>.dessus{background:var(--tb-carte)}
.tb-suite-lien{display:block;padding:12px 20px 14px;font-size:14px;line-height:18px;font-weight:600;color:var(--lien)}
/* 14.5 · le pli « Voir plus » : un <details> de 48 px, le chevron qui tourne en --duree, ferme par defaut */
.pli-tb{margin:12px 0 0}
.pli-tb>summary{list-style:none;display:flex;align-items:center;justify-content:space-between;gap:10px;
                min-height:48px;padding:0 var(--marge);font-size:15px;line-height:20px;font-weight:600;color:var(--encre);cursor:pointer}
.pli-tb>summary::-webkit-details-marker{display:none}
.pli-tb>summary .ic{color:var(--brume);transition:transform var(--duree) var(--courbe)}
.pli-tb[open]>summary .ic{transform:rotate(180deg)}
.pli-tb>summary:focus-visible{outline:2px solid var(--encre);outline-offset:-2px}
.pli-tb .tb-plus{padding-top:4px}
/* dans le pli : la bande marine garde ses trois chiffres (le « 2 » geant est parti) */
.pli-tb .encre-pose{margin:12px 0 0;padding-top:6px}
.pli-tb .encre-pose .chiffres-etat{padding-top:10px}
/* « Gerer » en LISTE : six lignes de 56 px avec une icone, sur la carte blanche, sans couleur de fond */
.tb-gerer{background:var(--tb-carte);margin:0 var(--marge) 12px}
.tb-gerer a{display:flex;align-items:center;gap:14px;min-height:56px;padding:8px 16px 8px 20px;color:var(--encre)}
.tb-gerer a+a{border-top:1px solid var(--filet2)}
.tb-gerer .ic{color:var(--encre);flex:0 0 auto}
.tb-gerer .co{flex:1;min-width:0}
.tb-gerer .t{font-size:15px;line-height:20px;font-weight:600}
.tb-gerer .d{font-size:13px;line-height:17px;color:var(--ardoise);margin-top:1px}
.tb-gerer .ic.droite{color:var(--brume)}
.pli-tb .bande{margin:12px var(--marge) 0}
.vue-tb .tb-journee-ligne{margin:0 var(--marge) 12px;background:var(--tb-carte)}
.vue-tb .tb-journee-ligne .agenda{padding-top:4px;padding-bottom:4px}
/* 14.6 · l'ordinateur (>= 1100 px, body.gestion) : deux colonnes, le pli ouvert d'office */
@media(min-width:1100px){
  .vue-tb .deux-colonnes{background:transparent}
  .vue-tb .deux-colonnes>*{padding-top:8px}
  .vue-tb .pli-tb>summary{display:none}
  .vue-tb .pli-tb .tb-plus{padding-top:0}
}
/* 14.7 · l'apparition douce des blocs au montage (opacite + 12 px, --duree-compte, une seule fois,
   echelonnee de 60 ms) ; 0 ms sous mouvement reduit : les jetons y valent 0 et l'animation est retiree */
@keyframes tb-parait{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
.vue-tb .parait{animation:tb-parait var(--duree-compte) var(--courbe) both}
.vue-tb .parait.p2{animation-delay:60ms}
.vue-tb .parait.p3{animation-delay:120ms}
.vue-tb .parait.p4{animation-delay:180ms}
@media(prefers-reduced-motion:reduce){.vue-tb .parait{animation:none}}
/* 14.8 · les finitions de la reprise (22/09 apres-midi) : le lien a droite d'un cap (« 12 h de
   libre » sur « Ta journee »), la carte sans photo (le rond de la face reste, en surface posee),
   la demande glissee (.decider) et la ligne tiree (.tirer) prennent le fond de la carte ; le
   pli se deplie sans filet ; a l'ordinateur les deux colonnes n'ont plus de trait entre elles
   (une gouttiere de 24 px : la separation, c'est l'air, regle de docs/42 § 2.2). */
.tb-cap .lien{font-size:13px;line-height:17px}
.tb-cap .cap{margin:0}
.tb-accueil span.face{width:56px;height:56px;border-radius:var(--rayon-doigt);background:var(--tb-carte)}
.tb-liste .decider,.tb-liste .decider .dessus,.tb-liste .tirer,.tb-liste .tirer .dessus{background:var(--tb-carte)}
.tb-liste .decider+.decider,.tb-liste .decider+.tb-ligne,.tb-liste .tb-ligne+.decider{border-top:1px solid var(--filet2)}
.tb-liste>div:first-child>*+*{border-top:1px solid var(--filet2)}
.tb-liste>div:first-child:empty+*{border-top:0}
.tb-atraiter{padding-top:8px}
.vue-tb .tirer.carte-tb-env .dessous button{width:78px}
/* la carte tiree : le « … » de secours se pose en haut a droite, a la hauteur du cap (la face
   du client garde sa place) ; le petit trait qui signale « ca se tire » n'existe pas ici
   (zero bordure au premier ecran) */
.vue-tb .tirer.carte-tb-env.avec-menu .dessus{padding-right:0}
.vue-tb .tirer.carte-tb-env .ouvre-menu{top:12px;transform:none;right:10px;height:32px}
.vue-tb .tirer.carte-tb-env .dessus::after{display:none}
.vue-tb .tb-plus>*+*{margin-top:20px}
.vue-tb .tb-plus>.encre-pose+*{margin-top:24px}
@media(min-width:1100px){
  .vue-tb .deux-colonnes{gap:24px;padding:0 var(--marge)}
  .vue-tb .deux-colonnes>*+*{border-left:0}
  .vue-tb .deux-colonnes>*>.tb-atraiter{padding-top:32px}
}

/* ═══════════════════════════════════════════════════════════════════════
   15 · [W2 22/09] LA FEUILLE DU CALENDRIER (.feuille-calendrier, Athlon.feuilleCalendrier) — docs/42 § 3.11
   « Le calendrier, quand on fait voir plus, ouvre d'une facon plus precise. » Une feuille PLEINE
   HAUTEUR : le mois complet en grille (chaque jour dit son etat : passe, ferme, libre, des cours),
   navigation par mois (fleches, glisse au doigt : Athlon.glisserDates), le jour choisi et ses
   creneaux dessous, une seule action collee en bas. La grille est celle du systeme (6.15 bis :
   .mois > .jours + .grille) : ici seulement ce que la feuille ajoute. LISEZ-MOI § 7.31.
   ═══════════════════════════════════════════════════════════════════════ */
.feuille.feuille-calendrier{height:92dvh;max-height:92dvh}
.feuille-calendrier .fc-tete{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px var(--marge) 4px}
.feuille-calendrier .fc-tete .nom{font-family:var(--titre);font-weight:600;font-size:18px;line-height:22px;letter-spacing:-.02em;
                                  transition:opacity var(--duree-courte) var(--courbe)}
.feuille-calendrier .fc-tete .nav{display:flex;align-items:center;gap:2px;flex:0 0 auto}
.feuille-calendrier .fc-tete .nav .carre{border:0;width:44px;height:44px}
.feuille-calendrier .fc-tete .lien{margin-right:6px}
.feuille-calendrier .fc-cadre{position:relative}
.feuille-calendrier .mois{padding:0 var(--marge) 4px}
/* les cases : 52 px, le quantieme et, dessous, le nombre de cours (12 px Archivo) ou le point tilleul */
.feuille-calendrier .mois .grille button{height:52px;gap:2px;position:relative}
.feuille-calendrier .mois .grille .q{font-family:var(--titre);font-weight:600;font-size:15px;line-height:18px}
.feuille-calendrier .mois .grille .n{font-family:var(--titre);font-weight:600;font-size:12px;line-height:12px;min-height:12px;color:var(--ardoise);font-variant-numeric:tabular-nums}
.feuille-calendrier .mois .grille button.libre::after{bottom:8px}
.feuille-calendrier .mois .grille button.avec-cours.libre::after{display:none}
.feuille-calendrier .mois .grille button.today .q{text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:2px}
.feuille-calendrier .mois .grille button.on{background:var(--encre);color:var(--papier);box-shadow:none}
.feuille-calendrier .mois .grille button.on .q,.feuille-calendrier .mois .grille button.on .n{color:var(--papier)}
.feuille-calendrier .mois .grille button.on.libre::after{background:var(--papier)}
.feuille-calendrier .mois .grille button.ferme .q,.feuille-calendrier .mois .grille button.passe .q{color:var(--brume);text-decoration:line-through;text-decoration-thickness:1px}
.feuille-calendrier .mois .grille button.passe.avec-cours .q{text-decoration:none;color:var(--ardoise)}
.feuille-calendrier .mois .grille button.on.ferme .q,.feuille-calendrier .mois .grille button.on.passe .q{color:var(--papier)}
.feuille-calendrier .mois-lg{padding:8px var(--marge) 8px;flex-direction:row;flex-wrap:wrap;gap:6px 14px}
/* le jour choisi : la date en cap, sa phrase, ses lignes, ses heures libres ; la hauteur ne saute pas */
.feuille-calendrier .fc-jour{border-top:1px solid var(--filet);margin-top:6px;padding-top:6px;min-height:160px;
                             transition:opacity var(--duree-fondu) var(--courbe)}
.feuille-calendrier .fc-jour.passe-a{opacity:0}
.feuille-calendrier .fc-jour .cartouche{padding-top:10px}
.feuille-calendrier .fc-jour .cartouche .g{text-transform:none;letter-spacing:.02em;font-size:13px;color:var(--encre)}
.feuille-calendrier .fc-jour .phrase{font-size:13px;line-height:18px;color:var(--ardoise);padding:0 var(--marge) 8px}
.feuille-calendrier .fc-jour .agenda{padding-top:2px;padding-bottom:2px}
/* les heures libres du jour : DEUX PAR LIGNE, pas un rail (docs/42 § 3.7). Le rail du systeme
   sert la ou la place manque ; dans une feuille pleine hauteur il y a la place, et onze heures
   cachees derriere un glissement lateral sont onze heures qu'on ne voit pas. */
.feuille-calendrier .fc-jour .creneaux{display:grid;grid-template-columns:1fr 1fr;gap:8px;
                                       overflow:visible;padding:4px var(--marge) 8px}
.feuille-calendrier .fc-jour .cren{min-width:0}
.feuille-calendrier .fc-jour .vide-jour{display:flex;align-items:center;gap:10px;padding:8px var(--marge) 12px;font-size:13px;line-height:18px;color:var(--ardoise)}
.feuille-calendrier .fc-jour .vide-jour .ic{color:var(--brume);flex:0 0 auto}
