/* LeLogo, feuille de style unique.

   Refondue le 19 septembre 2026. Le parti pris vient des maisons de joaillerie
   (Van Cleef, Cartier, Chaumet, Boucheron) et de deux applications de travail
   (Stripe, Linear), mesurees puis triees : ce qui fait la tenue d'un site de
   luxe se transpose, sa lenteur et son vide ne se transposent pas.

   Les quatre regles qui expliquent tout ce qui suit :

   1. Une seule echelle d'espacement, de 4 a 80 px. Rien en dehors.
   2. Deux rayons : la feuille est coupee droit (0), l'objet que l'on presse
      est adouci (2 px). La pastille d'etat seule est ronde.
   3. Aucune ombre portee, sauf sur une surface qui flotte reellement.
   4. La couleur n'est jamais seule a porter une information, et le metal ne
      sert qu'a l'ornement : a 3,68 pour 1 il n'a pas le droit d'ecrire.

   Ecran regarde huit heures par jour : tout le texte courant tient au-dessus
   de 4,5 pour 1, toute bordure de commande au-dessus de 3 pour 1.

   Charte unique (15 octobre 2026, docs/CHARTE.md) : toute valeur vient d'un
   jeton de :root, et les tailles sont en rem pour que le reglage de taille du
   texte du navigateur agisse sur tout l'ecran (a 16 px par defaut, 1rem vaut
   16 px : 0.9375rem fait les 15 px du texte courant). La page de reference
   des composants est /reglages/charte. */

/* --------------------------------------------------------------------------
   Les deux polices du logiciel, posees a cote de cette feuille.

   Elles ne sortent jamais de l'ordinateur : aucun appel a Internet, ni au
   demarrage ni plus tard. C'est ce qui permet au meme ecran de se presenter
   a l'identique sur le Mac du cabinet et sur un PC, ce que les polices du
   systeme ne garantissent pas : SF Pro et Segoe UI n'ont ni la meme hauteur
   d'x, ni la meme chasse.

   Inter porte tout le texte de travail. Son fichier est variable : un seul
   fichier couvre les graisses 400, 500 et 600, d'ou la plage declaree.
   EB Garamond ne sert qu'aux titres et aux noms de patients.

   Les deux sont sous SIL Open Font License 1.1 ; le texte de la licence est
   dans polices/LICENCES.txt, qui doit accompagner les fichiers.

   Chaque police vient en deux morceaux : le latin courant, et le latin
   etendu pour les noms a caracteres rares, frequents a Bruxelles. Le
   navigateur ne charge le second que s'il en rencontre un.
   -------------------------------------------------------------------------- */

@font-face {
    font-family: "Inter LeLogo";
    src: url("polices/inter-latin.woff2") format("woff2");
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
    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: "Inter LeLogo";
    src: url("polices/inter-latin-ext.woff2") format("woff2");
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
    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: "Garamond LeLogo";
    src: url("polices/garamond-latin.woff2") format("woff2");
    font-weight: 400;
    font-style: normal;
    font-display: swap;
    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: "Garamond LeLogo";
    src: url("polices/garamond-latin-ext.woff2") format("woff2");
    font-weight: 400;
    font-style: normal;
    font-display: swap;
    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;
}

:root {
    /* Surfaces */
    --fond: #f6f4f1;
    --carte: #ffffff;
    --surface-appuyee: #efece7;
    --surface-survol: #f2efea;
    --surface-choisie: #f3ede3;
    --surface-encre: #1b1a18;

    /* Encres. L'inactive (indications, « rien de noté », jours hors du mois)
       tient 4,5 pour 1 sur le blanc, le fond, le survol et la ligne ouverte
       (5,32 / 4,84 / 4,64 / 4,57) ; elle remplace #9b948a, a 3,00. Sur le
       voile de metal, c'est l'encre douce qui ecrit. */
    --encre: #1b1a18;
    --encre-moyenne: #4a4640;
    --encre-douce: #6e6860;
    --encre-inactive: #726a61;
    /* Le texte pose sur l'encre (bouton principal, bandeau d'apercu). */
    --sur-encre: #ffffff;
    --principal-survol: #33312d;

    /* Filets */
    --trait: #e4dfd8;
    --filet-fort: #c9c2b8;
    --filet-champ: #8f8577;

    /* Metal : ornement, jamais information */
    --metal: #a47f48;
    --metal-texte: #7a5c2e;
    --metal-clair: #d9c6a3;
    --metal-voile: #f3eadb;

    /* Etats */
    --vert: #1b6b4a;
    --vert-survol: #15563b;
    --vert-clair: #e9f1ec;
    --vert-filet: #c4dacd;
    --ambre: #8a5a10;
    --ambre-clair: #faf0dc;
    --ambre-filet: #e6d2a8;
    --rouge: #97241c;
    --rouge-clair: #f9ebe9;
    --rouge-filet: #ebc8c3;
    /* Bordure d'une commande qui detruit (corbeille) : 3,54 pour 1, la ou
       le filet rouge clair n'en faisait que 1,55. */
    --rouge-bord: #cf6b62;

    /* Information : un lien dans du texte suivi, et rien d'autre */
    --accent: #25506e;
    --accent-clair: #eaf0f5;
    /* Les paliers de la carte de chaleur du tableau de bord, de l'accent clair
       a l'accent. */
    --accent-palier-1: #dbe5ee;
    --accent-palier-2: #b3c8da;
    --accent-palier-3: #7c9fbd;

    /* Plusieurs logopedes : la couleur du filet en haut de leurs seances.
       Aucune ne reprend une couleur d'etat (L06-11) : le vert de la
       presence, le rouge de l'absence, le gris de l'encre douce. Les codes
       « vert », « rouge », « gris » restent ceux des donnees ; l'ecran les
       nomme turquoise, framboise, ardoise. */
    --logo-bleu: #2f6fa3;
    --logo-vert: #0f8088;
    --logo-ambre: #b07a1c;
    --logo-rouge: #b23a6c;
    --logo-violet: #6a3f8f;
    --logo-gris: #5b6e85;

    /* Le voile qui eteint la page derriere la visite guidee. */
    --voile: rgba(27, 26, 24, .45);

    /* La feuille MOD 111 dessinee a l'ecran : le papier et l'encre du vrai
       formulaire, pas ceux du logiciel. */
    --feuille-papier: #fffefa;
    --feuille-encre: #161616;
    --feuille-valeur: #000000;
    --feuille-perforation: #8d877d;
    --feuille-trou: #b9b3a8;
    --feuille-taille: 10pt;

    /* Espacement : la liste complete, aucune valeur en dehors. En rem : a
       16 px par defaut, --e1 vaut 4 px et --e10 64 px. --e0 (2 px) ne sert
       qu'aux composants serres : bloc de seance, pastille, liste du mois. */
    --e0: 0.125rem;
    --e1: 0.25rem; --e2: 0.5rem;  --e3: 0.75rem; --e4: 1rem;  --e5: 1.25rem;
    --e6: 1.5rem;  --e7: 2rem;    --e8: 2.5rem;  --e9: 3rem;  --e10: 4rem;

    /* Mise en page. La gouttiere est la meme pour l'en-tete et le corps :
       16 px sur telephone, 24 px jusqu'a 1 279 px, 32 px au-dela. La colonne
       porte les formulaires et les fiches ; les ecrans de donnees (horaire,
       listes, comptabilite) prennent la colonne large. L'en-tete s'aligne sur
       la colonne de la page. */
    --gouttiere: var(--e7);
    --colonne: 80rem;
    --colonne-large: 115rem;
    --colonne-page: var(--colonne);
    /* La marge interieure d'une carte (et d'une section de formulaire). */
    --marge-carte: var(--e6);
    /* Un paragraphe ne depasse pas 72 caracteres par ligne. */
    --mesure: 72ch;
    /* La barre d'onglets du telephone, en bas de l'ecran ; la gouttiere des
       heures du calendrier ; la feuille d'actions d'une seance au doigt. */
    --hauteur-onglets: 3.5rem;
    --largeur-heures: 3.625rem;
    --largeur-feuille: 27.5rem;

    /* Texte : huit tailles, rien d'autre. */
    --taille-affichage: 2.75rem;    /* 44 px, le decompte, seul */
    --taille-titre: 1.625rem;       /* 26 px, Garamond : h1, nom du patient */
    --taille-intertitre: 1.0625rem; /* 17 px, 600 : titre de periode, marque */
    --taille-courant: 0.9375rem;    /* 15 px : texte, champs */
    --taille-commande: 0.875rem;    /* 14 px, 500 : boutons, cases, menu ; h2 en 600 */
    --taille-secondaire: 0.8125rem; /* 13 px : .discret, libelles */
    --taille-surtitre: 0.75rem;     /* 12 px, 500, capitales : legend, th, surtitre */
    --taille-pastille: 0.75rem;     /* 12 px, 500 : pastilles, calendrier */
    --ligne-affichage: 2.75rem;
    --ligne-titre: 2rem;
    --ligne-courant: 1.5rem;
    --ligne-serree: 1.25rem;        /* tableaux, texte secondaire */
    --ligne-commande: 1.125rem;
    --ligne-surtitre: 1rem;         /* surtitres, libelles de champ */
    --ligne-pastille: 0.875rem;
    --ligne-bloc: 0.8125rem;        /* bloc de seance : deux lignes dans 32 px */
    --interlettrage: -0.00667em;    /* le texte courant, un rien serre */
    --interlettrage-titre: -0.0115em;
    --interlettrage-capitales: 0.08em;
    --interlettrage-pastille: 0.03em;

    /* Commandes : bouton, champ, liste, date, heure, a la meme hauteur. */
    --hauteur-commande: 2.5rem;
    --hauteur-commande-petite: 2rem;
    --hauteur-commande-grande: 3rem;
    --cote-case: 1.125rem;          /* case a cocher et bouton radio : 18 px */
    /* Au doigt (pointer: coarse) : une cible fait 44 px, la case 24 px. */
    --cible-tactile: 2.75rem;
    --cote-case-tactile: 1.5rem;

    /* Angles */
    --rayon: 0;
    --rayon-commande: 2px;
    --rayon-rond: 999px;

    /* Filets : 1 px partout ; 2 px pour la marque (page active, aujourd'hui,
       message) ; 3 px pour la couleur d'un logopede ; 4 px pour une presence
       pointee. */
    --filet: 1px;
    --filet-marque: 2px;
    --filet-logopede: 3px;
    --filet-presence: 4px;

    /* Polices. Les piles de secours ne servent que si un fichier manquait.
       Georgia y figure pour les titres et jamais pour les chiffres : ses
       chiffres sont elzeviriens, ils montent et descendent autour de la ligne,
       et une colonne de montants en Georgia est visuellement bancale. Il n'y
       a plus de police a chasse fixe : les chiffres tabulaires d'Inter
       alignent les colonnes, et la chasse fixe du systeme changeait d'un
       ordinateur a l'autre (SF Mono, Consolas, DejaVu). */
    --police: "Inter LeLogo", -apple-system, BlinkMacSystemFont,
              "Segoe UI Variable Text", "Segoe UI", Roboto, "Helvetica Neue",
              Arial, sans-serif;
    --police-titre: "Garamond LeLogo", Georgia, Palatino, "Palatino Linotype",
                    "Times New Roman", serif;

    /* Mouvement. Rien au-dela de 200 ms : au-dela, l'oeil enregistre le
       mouvement comme un objet, et non comme la suite de son geste. */
    --instant: 90ms;
    --etat: 140ms;
    --entree: 180ms;
    --courbe: cubic-bezier(0.4, 0, 0.2, 1);
    --courbe-sortie: cubic-bezier(0.215, 0.61, 0.355, 1);

    /* Deux ombres, pas une de plus : ce qui flotte au-dessus de la page
       (barre des modifications, bulle, question au lacher), et ce qu'on tient
       en main (seance qu'on deplace, heure qu'on change sur place, feuille). */
    --ombre-flottante: 0 8px 24px rgba(27, 26, 24, .16);
    --ombre-glisse: 0 4px 14px rgba(27, 26, 24, .16);
}

/* La gouttiere suit la largeur, la meme pour l'en-tete et le corps. Les
   points de rupture sont en em : avec un texte agrandi dans le navigateur,
   la mise en page etroite arrive plus tot, comme il se doit. */
@media (max-width: 79.9375em) { :root { --gouttiere: var(--e6); } }
@media (max-width: 40em) { :root { --gouttiere: var(--e4); --marge-carte: var(--e5); } }

* { box-sizing: border-box; }

/* Un element marque hidden reste cache, quelle que soit sa mise en page : la
   grille des champs (.colonnes > .champ) le montrait, et le formulaire
   « Placer » offrait la date, le code et l'objet dans tous les cas (vu avec la
   seance collective, L14-4). Le lecteur d'ecran ne lit plus ce qui est cache. */
[hidden] { display: none !important; }

/* La place de l'ascenseur est reservee en permanence. Sans cela, une page qui
   defile rend 15 px de moins que les autres, et l'en-tete bascule sur deux
   lignes d'un ecran a l'autre sans qu'on comprenne pourquoi. */
/* La racine suit le reglage de taille du texte du navigateur : tout ce qui
   suit est en rem. */
/* L'element qui prend le focus (Tab, Maj+Tab) ou qu'une ancre amene ne passe
   jamais sous l'en-tete colle et le sommaire, ni sous la barre des
   modifications en bas (L08-3) : le navigateur garde cette marge en faisant
   defiler. Le script de layout.html mesure les deux hauteurs ; sans lui,
   90 px. */
html { scrollbar-gutter: stable; font-size: 100%;
       scroll-padding-top: calc(var(--hauteur-entete, 90px) + var(--hauteur-sommaire, 0px));
       scroll-padding-bottom: var(--e10); }

/* Ni chiffres tabulaires ni ponctuation des capitales sur le corps : dans
   Inter, la premiere donne au trait d'union la largeur d'un chiffre et la
   seconde le releve, d'ou « rendez - vous » sur chaque page. Les chiffres
   tabulaires vont aux colonnes de chiffres (.nombre et voisins), la
   ponctuation des capitales aux capitales espacees (h2, th, legend...). */
body {
    /* La marge laterale d'une bande pleine largeur (en-tete, bandeaux) : la
       colonne large, sur toutes les pages. Alignee sur la colonne de chaque
       page, la marque sautait de 80 px entre l'accueil et les factures, a
       1 440 px (passe 4 du comparatif). Le pourcentage se compte la ou le
       jeton sert : la largeur de la page. */
    --marge-colonne: max(var(--gouttiere), calc((100% - var(--colonne-large)) / 2 + var(--gouttiere)));
    margin: 0;
    font-family: var(--police);
    font-size: var(--taille-courant);
    line-height: var(--ligne-courant);
    letter-spacing: var(--interlettrage);
    color: var(--encre);
    background: var(--fond);
    -webkit-font-smoothing: antialiased;
}

/* Trois graisses, 400, 500, 600 : le gras du navigateur (700) n'en est pas. */
strong, b { font-weight: 600; }
/* Les commandes du navigateur ne prennent ni la police ni l'interlettrage de
   la page d'elles-memes. */
button, input, select, textarea { font-family: inherit; letter-spacing: inherit; }

a { color: var(--accent); }

/* Un paragraphe ne s'etale pas sur toute la colonne : au-dela de 72
   caracteres, l'oeil perd le debut de la ligne suivante (le sous-titre de
   page suit la meme mesure). */
p { max-width: var(--mesure); }
/* Les messages, les aides posees en bloc et les listes simples suivent la
   meme mesure : a 1 440 px, une ligne y faisait jusqu'a 188 caracteres
   (L08-31). */
.message, div.discret, .champ > .discret, main ul:not([class]) > li, main ol:not([class]) > li,
.prochaines-etapes > li { max-width: var(--mesure); }

/* Le focus se voit toujours, et il ne s'anime jamais. Le decalage de 2 px
   empeche l'anneau de se confondre avec la bordure du champ. */
:focus-visible {
    outline: var(--filet-marque) solid var(--encre);
    outline-offset: var(--filet-marque);
}

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 1ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 1ms !important;
        scroll-behavior: auto !important;
    }
}

/* ------------------------------------------------------ bandeau d'apercu */
/* Une seule bande, au-dessus de tout, sur le fond sombre du logiciel : elle
   dit ce que le visiteur regarde sans lui prendre un centimetre utile. */
.bandeau-apercu {
    background: var(--surface-encre);
    color: var(--sur-encre);
    padding: var(--e3) var(--marge-colonne);
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
    border-bottom: var(--filet-marque) solid var(--metal);
}

.bandeau-apercu strong {
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    color: var(--metal-clair);
    margin-right: var(--e2);
}

/* Controle FastSolve : preavis avant blocage (7 derniers jours sans statut
   neuf). Meme couleurs que les messages « attention », sur toute la largeur. */
.bandeau-licence {
    background: var(--ambre-clair);
    color: var(--ambre);
    padding: var(--e3) var(--marge-colonne);
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
    border-bottom: var(--filet-marque) solid var(--ambre-filet);
}

/* ---------------------------------------------------------------- en-tete */
/* Le contenu de l'en-tete s'aligne sur la colonne large, la meme sur toutes
   les pages : la marque ne bouge pas d'un ecran a l'autre. */
.entete {
    background: var(--carte);
    border-bottom: var(--filet) solid var(--trait);
    padding: 0 var(--marge-colonne);
    display: flex;
    align-items: center;
    gap: var(--e4);
    flex-wrap: nowrap;
    position: sticky;
    top: 0;
    z-index: 10;
}

/* Un nom de cabinet long se coupe (il reste entier au survol). */
.marque {
    font-family: var(--police-titre);
    font-weight: 400;
    font-size: var(--taille-intertitre);
    line-height: var(--ligne-courant);
    letter-spacing: var(--interlettrage-titre);
    padding: var(--e4) 0;
    white-space: nowrap;
    max-width: 12em;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Le menu ne passe jamais sur deux lignes : trop etroit, il defile de cote
   (tour de simplicite, 6 octobre 2026 : a 1 440 px il s'enroulait de nouveau
   depuis l'ajout du tableau de bord et des accords). */
.menu {
    display: flex; gap: 0; flex-wrap: nowrap; flex: 1;
    overflow-x: auto; min-width: 0; scrollbar-width: none;
}
.menu::-webkit-scrollbar { display: none; }

/* Le menu se lit comme une commande, en casse normale (14 px, 500) : plus
   court que les capitales espacees de 12 px, il tient en entier dans la
   colonne, et se lit mieux (charte du 15 octobre 2026). */
.menu a {
    padding: var(--e5) var(--e2);
    text-decoration: none;
    color: var(--encre-douce);
    font-size: var(--taille-commande);
    line-height: var(--ligne-commande);
    font-weight: 500;
    border-bottom: var(--filet-marque) solid transparent;
    white-space: nowrap;
    transition: color var(--instant) var(--courbe),
                border-color var(--etat) var(--courbe-sortie);
}

.menu a:hover { color: var(--encre); }
/* Le menu et le sommaire defilent de cote, donc rognent ce qui depasse : leur
   anneau de focus se pose a l'interieur du lien, entier (L08-7). */
.menu a:focus-visible, .sommaire a:focus-visible { outline-offset: calc(-1 * var(--filet-marque)); }

/* « Aller au contenu » : invisible a la souris, il parait au premier Tab. */
.lien-evitement { position: absolute; left: -9999px; top: var(--e2); z-index: 1000;
                  padding: var(--e2) var(--e3); background: var(--carte); color: var(--encre);
                  border: var(--filet-marque) solid var(--metal); border-radius: var(--rayon-commande); }
.lien-evitement:focus { left: var(--e2); }
main:focus { outline: none; }

/* Les quatre groupes du menu (le temps, les patients, la facturation, la
   gestion) : un trait fin entre eux. Deux traits qui se suivent, ou un trait
   en bout de menu (groupe absent pour ce compte), ne se montrent pas. */
.separateur-menu { flex: none; align-self: center; width: var(--filet); height: var(--ligne-pastille);
                   margin: 0 var(--e1); background: var(--trait); }
.separateur-menu:first-child, .separateur-menu:last-child,
.separateur-menu + .separateur-menu { display: none; }
/* Regle a part : un navigateur sans :has() ignore celle-ci, pas la precedente. */
.separateur-menu:not(:has(~ a)) { display: none; }

/* Un seul trait de metal dans toute la page, et c'est celui-la. */
.menu a.actif { color: var(--encre); border-bottom-color: var(--metal); }

.identite {
    display: flex;
    align-items: center;
    gap: var(--e3);
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
    color: var(--encre-douce);
    white-space: nowrap;
}
.lien-reglages { color: inherit; text-decoration: none; border-bottom: var(--filet) dotted currentColor; }
.lien-reglages:hover, .lien-reglages.actif { color: var(--encre); border-bottom-style: solid; }
/* « Quitter » se lit comme ses voisins (Reglages, le compte) : un lien, pas un
   bouton encadre, ce qui laisse la place au menu sur une ligne. */
.identite .quitter { background: none; border: 0; padding: 0; font-family: inherit;
                     font-size: inherit; line-height: inherit; color: inherit;
                     cursor: pointer; border-bottom: var(--filet) dotted currentColor; }
.identite .quitter:hover { color: var(--encre); border-bottom-style: solid; }

/* ------------------------------------------------------------------ corps */
main { max-width: var(--colonne-page); margin: 0 auto; padding: var(--e6) var(--gouttiere) var(--e10); }
/* Les ecrans de donnees (horaire, listes, comptabilite) : `{% set
   colonne_large = true %}` dans leur gabarit pose cette classe sur le corps,
   et l'en-tete s'aligne sur la meme colonne. */
.page-large { --colonne-page: var(--colonne-large); }

h1 {
    font-family: var(--police-titre);
    font-size: var(--taille-titre);
    line-height: var(--ligne-titre);
    font-weight: 400;
    letter-spacing: var(--interlettrage-titre);
    margin: 0 0 var(--e1);
}

/* Le titre de section est un libelle, pas un titre : petites capitales
   espacees. L'ecart 40 au-dessus contre 12 en dessous est ce qui rattache
   visuellement un titre a ce qu'il annonce. */
h2, .surtitre {
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
}
/* Le titre de section se lit sans effort et passe avant le sous-titre (L08-23,
   L08-32) : en 12 px gris, il paraissait plus petit que le h3 de 17 px gras.
   Il garde ses capitales, en 14 px et 600 ; le h3 descend a la taille du
   texte. */
h2 {
    margin: var(--e8) 0 var(--e3);
    font-size: var(--taille-commande);
    line-height: var(--ligne-courant);
    font-weight: 600;
    color: var(--encre-moyenne);
}

h3 {
    font-size: var(--taille-courant);
    line-height: var(--ligne-courant);
    font-weight: 600;
    margin: var(--e5) 0 var(--e2);
}

.sous-titre { color: var(--encre-douce); margin: 0 0 var(--e6); max-width: var(--mesure); }

.carte {
    /* Une boite placee dedans (texte pour lecteur d'ecran d'un en-tete de
       tableau) se range dans la carte, et non dans la page : elle poussait la
       fiche du tiers payant de 13 px de cote a 320 px (L07-19). */
    position: relative;
    /* Un tableau plus large que la carte defile dans la carte, et un ombrage
       sur le bord le dit (L07-18) : les deux voiles blancs suivent le contenu
       (local) et cachent l'ombre tant qu'il n'y a rien de plus de ce cote. */
    background:
        linear-gradient(to right, var(--carte) var(--e4), transparent) left center / var(--e8) 100% no-repeat local,
        linear-gradient(to left, var(--carte) var(--e4), transparent) right center / var(--e8) 100% no-repeat local,
        linear-gradient(to right, var(--filet-fort), transparent) left center / var(--e3) 100% no-repeat scroll,
        linear-gradient(to left, var(--filet-fort), transparent) right center / var(--e3) 100% no-repeat scroll,
        var(--carte);
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon);
    padding: var(--marge-carte);
    margin-bottom: var(--e4);
    /* Le corps de la page ne defile jamais horizontalement, a aucune largeur
       d'ecran. */
    overflow-x: auto;
}

/* Un titre en premiere ligne de carte n'a pas d'espace au-dessus : il ouvre la
   carte, il ne separe pas deux blocs. Soixante-trois attributs
   `style="margin-top:0"` disaient cela un par un dans les gabarits, et sont
   partis avec cette regle. Le selecteur descend dans les blocs de titre, ou le
   `h2` est emballe dans un `div`. */
.carte > *:first-child,
.carte h2:first-child,
.carte h3:first-child,
.carte > .entre-deux:first-child h2,
.carte > .entre-deux:first-child h3,
.carte > input[type="hidden"]:first-child + h2,
.carte > input[type="hidden"]:first-child + input[type="hidden"] + h2,
.carte > input[type="hidden"]:first-child + input[type="hidden"] + input[type="hidden"] + h2 { margin-top: 0; }
/* Et le dernier element ne laisse pas de vide sous lui : la carte garde sa
   marge interieure, ni plus ni moins, en bas comme en haut. */
.carte > *:last-child { margin-bottom: 0; }

/* Ce qui suit un tableau ou un paragraphe dans une carte, en general un
   bouton, prend l'ecart de l'echelle plutot qu'une marge ecrite a la main. */
.ecarte { margin-top: var(--e4); }

/* Sans align-items, une carte de trois lignes s'etire a la hauteur d'une
   carte de vingt. */
.grille { display: grid; gap: var(--e4); align-items: start; }
.grille.deux { grid-template-columns: 2fr 1fr; }
/* Deux cartes de meme nature cote a cote finissent a la meme hauteur (L06-44). */
.grille.egales { align-items: stretch; }

/* La comptabilite se lit en tableau large. Dans la grille ordinaire, sa carte
   plafonnait a 800 px : ouvrir une ligne poussait le tableau a 1032 px, et le
   bouton « Enregistrer » se posait hors de la carte, hors d'atteinte de la
   souris, a toutes les largeurs. Les ecritures prennent donc toute la
   largeur, et les totaux et l'ajout passent dessous, cote a cote. */
.grille.deux.compta { grid-template-columns: minmax(0, 1fr); }
.grille.deux.compta > div:not(.carte) {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--e4);
    align-items: start;
}
/* Sans min-width, une colonne de grille refuse de descendre sous la largeur
   de son contenu et pousse toute la page. */
.grille > * { min-width: 0; }

/* --------------------------------------------------------------------------
   Calendrier de la semaine

   Une grille de sept colonnes, une par jour, et une gouttiere d'heures a
   gauche. Les seances ne sont pas des cases de tableau mais des blocs places
   a la minute pres, en pourcentage de la hauteur de la journee : une seance de
   9h05 a 9h50 tombe donc au bon endroit sans qu'il faille une ligne de tableau
   pour chaque cas de figure.

   Les creneaux libres sont des boutons transparents places dessous. Un creneau
   pris est recouvert par son bloc, donc materiellement inatteignable : on ne
   peut pas cliquer sur une place deja occupee.
   -------------------------------------------------------------------------- */

/* La grille porte toute la journee permise, de 7 h a 22 h, et defile dans son
   cadre, dans les deux sens : en hauteur pour monter et descendre dans les
   heures, en largeur quand la fenetre est etroite. Le script de la page donne
   au cadre la hauteur de la tranche ou sont les seances ; sans script, la
   journee entiere s'affiche. Les titres des jours restent en haut, les heures
   restent a gauche. */
.calendrier-zone {
    display: flex;
    gap: var(--e2);
    align-items: stretch;
}

.calendrier-cadre {
    flex: 1 1 auto;
    min-width: 0;
    overflow: auto;
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon);
    background: var(--carte);
}

/* Les fleches d'une heure plus tot, d'une heure plus tard : dans le coin des
   heures, au-dessus de la gouttiere, ou elles ne prennent aucune place (une
   colonne de 46 px a droite du calendrier, 13 % de la largeur sur un
   telephone, L06-46). */
.defilement-heures { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--e0) var(--e1); }
.legende-fleches { flex-basis: 100%; text-align: center; font-size: var(--taille-pastille);
                   line-height: var(--ligne-pastille); color: var(--encre-douce); }
.defilement-heures .bouton { width: var(--e6); height: var(--e6); min-height: 0; padding: 0;
                             font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }

.calendrier {
    /* 64 px l'heure, donc 32 px pour une seance de 30 minutes : c'est la
       hauteur minimale ou le nom et l'horaire tiennent tous les deux sans etre
       coupes. A 56 px, la deuxieme ligne passait sous le bord du bloc. */
    --heure-hauteur: 4rem;
    display: grid;
    grid-template-columns: var(--largeur-heures) repeat(7, minmax(6.5rem, 1fr));
    min-width: 48.75rem;
    background: var(--carte);
}
/* Samedi et dimanche vides : deux colonnes etroites, et la semaine tient a
   768 px (passe 5). Le telephone, un jour a la fois, garde sa grille. */
@media (min-width: 40.0625em) {
    .calendrier.week-end-vide {
        grid-template-columns: var(--largeur-heures) repeat(5, minmax(6.5rem, 1fr))
                               repeat(2, minmax(2.75rem, 0.3fr));
        min-width: 41rem;
    }
    .calendrier.week-end-vide .titre-jour:nth-child(n+7) a > span:first-child {
        display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    }
    .calendrier.week-end-vide .titre-jour:nth-child(n+7) .pointer-noter { display: none; }
}

/* Ce qui reste en place quand la grille defile passe devant les seances. */
.calendrier .titre-jour,
.calendrier .titre-heures { position: sticky; top: 0; z-index: 3; }

.calendrier .titre-jour {
    padding: var(--e2) var(--e1);
    text-align: center;
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
    background: var(--surface-appuyee);
    border-bottom: var(--filet) solid var(--trait);
    border-left: var(--filet) solid var(--trait);
}

.calendrier .titre-heures {
    left: 0;
    z-index: 4;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--surface-appuyee);
    border-bottom: var(--filet) solid var(--trait);
}

.calendrier .gouttiere {
    position: sticky;
    left: 0;
    z-index: 2;
    background: var(--surface-appuyee);
}

/* L'heure tient en entier : a 12 px et en chiffres tabulaires, "10:30"
   demande 33 px, la gouttiere en donne 58 moins 8 de marge. */
.calendrier .gouttiere .heure {
    position: absolute;
    right: var(--e2);
    transform: translateY(-50%);
    white-space: nowrap;
    font-size: var(--taille-pastille);
    line-height: var(--ligne-pastille);
    font-weight: 500;
    letter-spacing: var(--interlettrage-pastille);
    font-variant-numeric: tabular-nums;
    color: var(--encre-douce);
}

/* La derniere heure ferme la journee : aucune ligne ne lui correspond, et la
   centrer sur le bord la ferait couper par le cadre. Elle se pose donc juste
   au-dessus. */
.calendrier .gouttiere .heure.derniere { transform: translateY(-100%); }
/* La premiere ouvre la journee : centree sur le bord, sa moitie haute passait
   sous les titres des jours. Elle se pose donc juste en dessous. */
.calendrier .gouttiere .heure.premiere { transform: none; }

.colonne-jour {
    position: relative;
    border-left: var(--filet) solid var(--trait);
    /* Un trait plein a chaque heure, un trait clair a la demie : on lit
       l'heure d'un coup d'oeil sans compter les lignes. */
    background-image:
        repeating-linear-gradient(to bottom, var(--trait) 0 1px,
                                  transparent 1px var(--heure-hauteur)),
        repeating-linear-gradient(to bottom, transparent 0 calc(var(--heure-hauteur) / 2),
                                  var(--fond) calc(var(--heure-hauteur) / 2)
                                  calc(var(--heure-hauteur) / 2 + 1px),
                                  transparent calc(var(--heure-hauteur) / 2 + 1px)
                                  var(--heure-hauteur));
}

/* Le jour d'aujourd'hui se marque par le seul trait de metal autorise, pas par
   un aplat de couleur. */
.calendrier .titre-jour.aujourdhui {
    background: var(--metal-voile);
    color: var(--encre);
    box-shadow: inset 0 calc(-1 * var(--filet-marque)) 0 var(--metal);
}
/* Sur la surface appuyee, l'encre inactive tomberait a 4,45 pour 1 : le jour
   ferme s'ecrit en encre douce, sa hachure dit le reste. */
.calendrier .titre-jour.ferme { color: var(--encre-douce); font-weight: 400; }

/* Un jour ferme se voit d'un coup d'oeil : hachure legere, et aucun creneau
   libre a l'interieur puisqu'il ne s'y passe rien. */
.colonne-jour.ferme {
    background-image: repeating-linear-gradient(45deg, var(--surface-appuyee) 0 6px,
                                                var(--carte) 6px 12px);
}

/* Une colonne ou l'on peut placer un patient se clique la ou le moment est
   libre (L09-12) : un repere suit la souris, a la hauteur d'un pas de grille,
   avec l'heure qu'un clic donnerait. */
.colonne-jour[data-placer] { cursor: pointer; }
.creneau-survol {
    position: absolute;
    left: 0;
    right: 0;
    padding: 0 var(--e1);
    background: var(--surface-choisie);
    color: var(--encre-moyenne);
    font-size: var(--taille-pastille);
    line-height: var(--ligne-pastille);
    pointer-events: none;
}

.bloc-seance {
    position: absolute;
    left: var(--e0);
    right: var(--e0);
    display: block;
    overflow: hidden;
    padding: var(--e0) var(--e1);
    border-radius: var(--rayon-commande);
    border: var(--filet) solid var(--trait);
    border-left: var(--filet-marque) solid var(--filet-fort);
    background: var(--carte);
    color: var(--encre);
    font-size: var(--taille-pastille);
    line-height: var(--ligne-bloc);
    text-decoration: none;
    transition: border-color var(--instant) var(--courbe);
}

.bloc-seance:hover { border-color: var(--encre); }
/* Avec l'espacement de texte agrandi (interligne, lettres, mots), l'heure
   d'une seance de 30 minutes passait sous le bord du bloc (L08-18) : au
   survol et au clavier, le bloc s'ouvre a la hauteur de ce qu'il porte, sans
   jamais descendre sous sa duree (--hauteur, posee par l'horaire). */
.bloc-seance:hover, .bloc-seance:focus-within {
    z-index: 2;
    height: auto !important;
    min-height: var(--hauteur, 0);
    overflow: visible;
}
/* Le tiers payant prend le metal de sa pastille, comme partout : le vert ne
   dit plus que la presence (L06-11). */
.bloc-seance.tiers-payant { background: var(--metal-voile); border-left-color: var(--metal); }
/* Une presence pointee est un fait acquis : trait plein a gauche. */
.bloc-seance.presente { border-left: var(--filet-presence) solid var(--vert); }
/* Une absence se barre, en encre douce : palie par l'opacite, elle tombait
   entre 2,26 et 2,47 pour 1. */
.bloc-seance.absente { color: var(--encre-douce); text-decoration: line-through; }
/* Le nom tient sur une ligne et se coupe d'une ellipse, dans tous les blocs :
   un nom long passait sur deux lignes et cachait l'heure (L04-24). */
.bloc-seance .qui { font-weight: 600; display: block; overflow: hidden; white-space: nowrap;
                    text-overflow: ellipsis; }
.bloc-seance .quand { color: var(--encre-douce); font-variant-numeric: tabular-nums; }

/* Un bloc qu'on peut deplacer : le nom est une prise (la main), l'heure un
   bouton qu'on touche pour la changer. Les deux se distinguent au survol. */
.bloc-seance.deplacable .qui {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    color: inherit;
    text-decoration: none;
    cursor: grab;
    /* Au doigt, glisser fait defiler la grille : le deplacement ne s'arme
       qu'apres un appui long (script de horaire.html, L04-7). L'appui long
       n'ouvre pas le menu du lien sur iPhone. */
    -webkit-touch-callout: none;
    user-select: none;
    -webkit-user-select: none;
    -webkit-user-drag: none;
}
.bloc-seance.deplacable .quand {
    position: relative;
    z-index: 1;
    display: block;
    padding: 0;
    border: 0;
    background: none;
    font-family: inherit;
    font-size: inherit;
    line-height: inherit;
    color: var(--encre-douce);
    font-variant-numeric: tabular-nums;
    text-align: left;
    cursor: text;
}
.bloc-seance.deplacable .quand:hover { color: var(--encre); text-decoration: underline; }
/* Le nom ouvre la fiche depuis tout le bloc, et non depuis sa seule ligne de
   13 px (L08-17) : l'heure et la croix restent au-dessus, cliquables. */
.bloc-seance.deplacable a.qui::after { content: ""; position: absolute; inset: 0; }
.bloc-seance:has(.menu-bloc) .qui { padding-right: var(--e6); }
.bloc-seance.deplacable .quand[hidden] { display: none; }
.bloc-seance.deplacable .qui:focus-visible,
.bloc-seance.deplacable .quand:focus-visible { outline: var(--filet-marque) solid var(--encre); outline-offset: var(--filet); }

/* Pendant le geste : le bloc d'origine s'efface, son double suit la main au
   pas de cinq minutes et annonce le jour et l'heure ou il tombera. */
.bloc-seance.en-deplacement,
.bloc-seance.parti { opacity: 0.35; }
.bloc-seance.fantome {
    z-index: 1;
    border-color: var(--encre);
    box-shadow: var(--ombre-glisse);
    pointer-events: none;
}
.bloc-seance.fantome.refuse {
    border-color: var(--rouge);
    background: var(--rouge-clair);
}
.bloc-seance.fantome .quand { white-space: nowrap; }
body.glisse-en-cours,
body.glisse-en-cours * { cursor: grabbing !important; user-select: none; -webkit-user-select: none; }

/* L'heure qu'on change sur place : le bloc s'ouvre a la hauteur du champ. */
.bloc-seance.en-edition {
    z-index: 1;
    height: auto !important;
    overflow: visible;
    border-color: var(--encre);
    box-shadow: var(--ombre-glisse);
}
.bloc-seance .heure-sur-place {
    width: 100%;
    height: auto;
    margin-top: var(--e0);
    padding: var(--e0) var(--e1);
    font-size: var(--taille-secondaire);
}

/* Zone de depot : on glisse le fichier dessus, ou on clique. Le champ de
   fichier reste dessous et fait le travail ; l'habillage ne fait que le rendre
   visible et accueillant. C'est le seul dessin d'un champ de fichier : le
   bouton gris « Choisir un fichier » du navigateur n'apparait nulle part. Le
   script de layout.html y ecrit le nom du fichier choisi et accepte le
   fichier glisse dessus. */
.zone-depot {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: var(--e1);
    padding: var(--e6) var(--e5);
    border: var(--filet) dashed var(--filet-champ);
    border-radius: var(--rayon);
    background: var(--carte);
    cursor: pointer;
    text-align: center;
    transition: border-color var(--instant) var(--courbe),
                background-color var(--instant) var(--courbe);
}

.zone-depot:hover, .zone-depot.survol { border-color: var(--encre); background: var(--surface-survol); }
.zone-depot.rempli { border-style: solid; border-color: var(--vert); background: var(--vert-clair); }
.zone-depot .titre-depot { font-weight: 600; }
.zone-depot .nom-fichier { font-size: var(--taille-secondaire); line-height: var(--ligne-serree);
                           margin-top: var(--e1); font-weight: 600; overflow-wrap: anywhere; }
.zone-depot .nom-fichier:empty { display: none; }
/* Le champ reste atteignable au clavier (Tab, puis Espace ouvre le choix) :
   cache a l'oeil, pas au clavier ni au lecteur d'ecran. */
.zone-depot input[type=file] { position: absolute; width: 1px; height: 1px; opacity: 0; overflow: hidden;
                               clip: rect(0 0 0 0); }
.zone-depot:focus-within { outline: var(--filet-marque) solid var(--encre); outline-offset: var(--filet-marque); }
/* La variante d'une ligne, dans un tableau ou un formulaire en rangee :
   la hauteur d'un bouton, le nom du fichier a cote. */
.zone-depot.compacte {
    flex-direction: row;
    align-items: center;
    gap: var(--e2);
    height: auto;
    min-height: var(--hauteur-commande);
    padding: 0 var(--e3);
    text-align: left;
    font-size: var(--taille-commande);
    line-height: var(--ligne-commande);
    font-weight: 500;
}
.zone-depot.compacte .titre-depot { white-space: nowrap; }
.zone-depot.compacte .nom-fichier { margin-top: 0; }
/* Un bouton et sa variante en lien discret (« Exporter en tableur », « ou en
   CSV ») restent ensemble quand la rangee passe a la ligne. */
.avec-variante { display: inline-flex; align-items: center; gap: var(--e2); }
/* Ce que la reprise prend et ce qu'elle laisse : deux colonnes courtes. */
.repris-ou-pas p { margin: 0 0 var(--e2); }

/* Reprise des anciens fichiers : ce qui est incertain se voit, ce qui est
   secondaire se replie. */
tr.incertaine { background: var(--ambre-clair); }
.avertissement { color: var(--ambre); }
.a-verifier { color: var(--rouge); }
/* 15 octobre 2026 (L05-10, L05-28, L05-33). Le resume des champs lus, en tete
   du tableau : une colonne perdue se voit d'un coup. */
.resume-champs { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--e1) var(--e4);
                 font-size: var(--taille-secondaire); line-height: var(--ligne-serree);
                 max-width: none; }
.resume-champs .surtitre { flex: 1 1 100%; }
/* « Modifier » : chaque champ garde la largeur de ce qu'il porte (« vendredi »,
   « 15:30 », « 30 »), au lieu d'etre coupe par une colonne etroite. */
.table-reprise td.jour .en-saisie { min-width: 8.5rem; }
.table-reprise td.heure .en-saisie { min-width: 5rem; }
.table-reprise td.duree .en-saisie { min-width: 4.5rem; }
.table-reprise td.code .en-saisie { min-width: 5.5rem; }
.table-reprise td.duree { white-space: nowrap; }
/* D'ou vient la ligne et ses alertes prennent toute la largeur, sous elle : une
   colonne etroite en faisait des lignes de 200 px de haut. */
.provenance { display: flex; flex-wrap: wrap; gap: 0 var(--e4); margin: 0 0 var(--e1); max-width: none;
              font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
ul.alertes-reprise { list-style: none; margin: 0 0 var(--e1); padding: 0;
                     font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
/* « Tout voir » colle a sa ligne : un seul filet sous les deux. */
.table-reprise tr.ligne-modifiable td { border-bottom: 0; }
.table-reprise tr.tout-voir td { padding-top: 0; }
.table-reprise tr.incertaine + tr.tout-voir { background: var(--ambre-clair); }
.table-reprise tr.ligne-modifiable.ouverte + tr.tout-voir { background: var(--surface-choisie); }
.table-reprise tr.tout-voir summary { font-size: var(--taille-secondaire); color: var(--encre-douce); }
.champs-reprise { display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
                  gap: var(--e3) var(--e4); padding: var(--e3) 0; }
.champs-reprise .champ { margin-bottom: 0; }
.champs-reprise .champ > span { display: block; margin-bottom: var(--e1); }
.champs-reprise .large, .champs-reprise .choix-reprise { grid-column: 1 / -1; }
.champs-reprise .choix-reprise .case { margin-bottom: var(--e1); }
.titre-mobile { display: none; }
@media (max-width: 79.9375em) {
    /* Sous 1 280 px, une carte par personne : neuf champs a saisir ne tiennent
       pas sur une ligne de tableau sans faire defiler la page de cote. Chaque
       valeur sous son libelle ; les champs vont a la ligne quand la place
       manque (un par ligne ou presque sur telephone). */
    .table-reprise thead { display: none; }
    .table-reprise, .table-reprise tbody { display: block; }
    .table-reprise tr.ligne-modifiable { display: flex; flex-wrap: wrap; align-items: flex-start;
                                         gap: var(--e2) var(--e4); padding: var(--e3) 0 0; }
    .table-reprise tr.ligne-modifiable td { display: block; padding: 0; }
    .table-reprise tr.ligne-modifiable td.reprendre { flex: 0 0 auto; padding-top: var(--e4); }
    .table-reprise tr.ligne-modifiable td.nom,
    .table-reprise tr.ligne-modifiable td.prenom { flex: 1 1 11rem; }
    .table-reprise tr.ligne-modifiable td.jour { flex: 1 1 8.5rem; }
    .table-reprise tr.ligne-modifiable td.heure,
    .table-reprise tr.ligne-modifiable td.duree { flex: 1 1 5rem; }
    .table-reprise tr.ligne-modifiable td.code { flex: 1 1 5.5rem; }
    .table-reprise tr.ligne-modifiable td.tp { flex: 0 0 auto; }
    .table-reprise tr.ligne-modifiable td.actions { flex: 0 0 auto; align-self: flex-end; }
    .table-reprise tr.tout-voir { display: block; border-bottom: var(--filet) solid var(--trait); }
    .table-reprise tr.tout-voir td { display: block; padding: var(--e2) 0 var(--e3); }
    .table-reprise .titre-mobile { display: block; font-size: var(--taille-surtitre);
                                   line-height: var(--ligne-surtitre); color: var(--encre-douce); }
    .table-reprise td.jour .en-saisie, .table-reprise td.heure .en-saisie,
    .table-reprise td.duree .en-saisie, .table-reprise td.code .en-saisie { min-width: 0; }
}
@media (max-width: 40em) {
    .table-lu thead { display: none; }
    .table-lu, .table-lu tbody, .table-lu tr { display: block; }
    .table-lu tr { padding: var(--e3) 0; border-bottom: var(--filet) solid var(--trait); }
    .table-lu td { display: inline-block; padding: 0 var(--e3) 0 0; border: 0; text-align: left; }
    .table-lu td:first-child, .table-lu td.actions { display: block; padding: 0 0 var(--e1); }
    .table-lu .titre-mobile { display: inline; color: var(--encre-douce); }
}

/* « A suivre » (L06-7) : ce qui demande un geste, sur l'accueil et dans
   Accords. Une rangee par alerte : la pastille dit l'etat, le texte est en
   encre (il etait en ambre sur 150 caracteres), le nom en 600, la fleche dit
   que la rangee mene ou l'on agit. Un filet ambre a gauche, comme un message. */
.a-suivre { border-left: var(--filet-marque) solid var(--ambre); }
.liste-a-suivre { list-style: none; margin: 0; padding: 0; }
.liste-a-suivre > li {
    display: grid;
    grid-template-columns: 6.5rem minmax(0, 1fr) var(--e4);
    gap: var(--e3);
    align-items: baseline;
    padding: var(--e2) 0;
    border-top: var(--filet) solid var(--trait);
}
.liste-a-suivre > li:first-child { border-top: 0; padding-top: 0; }
.liste-a-suivre > li:last-child { padding-bottom: 0; }
.liste-a-suivre .pastille { justify-self: start; }
.liste-a-suivre > li > :nth-child(2) { max-width: var(--mesure); }
.a-suivre-fleche { color: var(--encre-douce); text-align: right; }
.liste-a-suivre > li.ligne-lien:hover { text-decoration: none; }
.liste-a-suivre > li.ligne-lien:hover > :nth-child(2) { text-decoration: underline; text-underline-offset: 0.1875rem; }
.liste-a-suivre > li.ligne-lien:hover .a-suivre-fleche { color: var(--encre); }
.a-suivre .discret { margin: var(--e3) 0 0; }
@media (max-width: 40em) {
    /* Sur telephone, la pastille passe au-dessus du texte. */
    .liste-a-suivre > li { grid-template-columns: minmax(0, 1fr) var(--e4); row-gap: var(--e1); }
    .liste-a-suivre .pastille { grid-column: 1 / -1; }
    .liste-a-suivre > li > span:empty:first-child { display: none; }
}
/* Le triangle de repli : une seule famille, dessinee ici, pour tout ce qui se
   deplie (note de seance, carte depliable, carre de materiel, « Ajouter un
   intervenant », question de l'aide). Celui du navigateur ne se colore pas,
   change d'un systeme a l'autre et cotoyait le notre sur le meme ecran. Un
   titre dessine en bouton (« Modifier », « Ajouter un logopède ») n'en porte
   pas : c'est un bouton. */
details > summary { cursor: pointer; list-style: none; }
details > summary::-webkit-details-marker { display: none; }
details > summary:not(.bouton)::before {
    content: "";
    flex: none;
    display: inline-block;
    vertical-align: middle;
    width: 0;
    height: 0;
    margin-right: var(--e2);
    border-left: 0.3125rem solid var(--encre-douce);
    border-top: var(--e1) solid transparent;
    border-bottom: var(--e1) solid transparent;
    transition: transform var(--etat) var(--courbe-sortie);
}
details[open] > summary:not(.bouton)::before { transform: rotate(90deg); }
/* Dans un titre en rangee, l'ecart de la rangee suffit. */
details.depliable > summary::before,
.note > summary::before,
.carre-materiel > summary::before { margin-right: 0; align-self: center; }

/* Une carte qu'on deplie : son titre et ce qu'elle contient sur une ligne,
   le triangle devant. Le titre ne passe jamais sous le triangle (a 390 px,
   le triangle restait seul sur sa ligne). */
details.depliable > summary {
    display: flex;
    align-items: baseline;
    flex-wrap: nowrap;
    gap: var(--e1) var(--e3);
}
details.depliable > summary h2 { margin: 0; min-width: 0; }
details.depliable[open] > summary { margin-bottom: var(--e3); }
details.depliable > summary:hover h2 { color: var(--encre); }
details.depliable > summary:focus-visible { outline: var(--filet-marque) solid var(--encre); outline-offset: var(--e1); }

/* Les autorisations d'un compte, une par ligne. */
.liste-permissions { margin: 0; padding: 0; list-style: none; }
.liste-permissions li + li { margin-top: var(--e0); }

/* Sous les cases d'un compte : enregistrer ses autorisations, puis ce qui
   touche au compte lui-meme. Les boutons passent a la ligne plutot que de
   pousser la carte. */
.actions-compte {
    display: flex;
    flex-wrap: wrap;
    gap: var(--e2);
    margin-top: var(--e3);
}
tr.reglage-compte:hover td { background: transparent; }

/* Le materiel du cabinet : un carre par categorie, replie, cote a cote tant
   que la place le permet. Chaque carre demande au moins 15 caracteres de
   large, jamais plus que la carte. */
.carres-materiel {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(15em, 100%), 1fr));
    gap: var(--e3);
    align-items: start;
    margin-top: var(--e4);
}
.carre-materiel {
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon);
    background: var(--carte);
    min-width: 0;
}
.carre-materiel > summary {
    display: flex;
    align-items: center;
    gap: var(--e2);
    padding: var(--e2) var(--e2) var(--e2) var(--e3);
}
.carre-materiel > summary:hover { background: var(--surface-survol); }
.carre-materiel[open] > summary { border-bottom: var(--filet) solid var(--trait); }
.carre-titre {
    flex: 1 1 auto;
    min-width: 0;
    font-weight: 600;
    font-size: var(--taille-commande);
    line-height: var(--ligne-commande);
    overflow-wrap: break-word;
    -webkit-hyphens: auto;
    hyphens: auto;
}
.carre-compte {
    flex: none;
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
    color: var(--encre-douce);
    font-variant-numeric: tabular-nums;
}
.bouton.ajout-dans-carre { flex: none; width: var(--hauteur-commande-petite);
                           height: var(--hauteur-commande-petite); padding: 0; }
.ajout-carre {
    display: flex;
    flex-wrap: wrap;
    gap: var(--e2);
    padding: var(--e3);
    border-bottom: var(--filet) solid var(--trait);
}
.ajout-carre[hidden] { display: none; }
.ajout-carre input[type=text] { flex: 1 1 10em; min-width: 0; }
.liste-materiel { margin: 0; padding: var(--e1) 0; list-style: none; }
.liste-materiel li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--e2);
    padding: var(--e1) var(--e2) var(--e1) var(--e3);
}
.liste-materiel li:hover { background: var(--surface-survol); }
.liste-materiel li.faible { color: var(--encre-douce); }
.liste-materiel .materiel-nom { min-width: 0; overflow-wrap: break-word; }
.liste-materiel .bouton { height: var(--hauteur-commande-petite); }
.liste-materiel .bouton.corbeille { width: var(--hauteur-commande-petite); }
/* Deposer un fichier dans un carre (18 octobre 2026) : sous sa liste, a
   l'aplomb des noms, a la hauteur d'un petit bouton. */
.depot-carre { padding: var(--e1) var(--e2) var(--e3) var(--e3); }
.depot-carre .zone-depot.compacte { min-height: var(--hauteur-commande-petite); }
/* Une ligne du materiel qui est un fichier (18 octobre 2026) : son dessin a
   l'encre douce, puis son nom en lien pointille ; un clic l'ouvre. Le dessin
   se cale sur la premiere ligne d'un nom qui passe a la ligne (sa boite a la
   hauteur d'une ligne), et le pointille suit chaque ligne. */
a.fichier-materiel { display: inline-flex; align-items: flex-start; gap: var(--e2); max-width: 100%;
                     color: inherit; text-decoration: none; }
a.fichier-materiel .icone { flex: none; width: 0.875rem; height: var(--ligne-courant);
                            color: var(--encre-douce); }
a.fichier-materiel span { min-width: 0; overflow-wrap: anywhere;
                          text-decoration: underline dotted var(--filet-champ);
                          text-decoration-thickness: var(--filet); text-underline-offset: var(--e1); }
a.fichier-materiel:hover .icone { color: var(--encre); }
a.fichier-materiel:hover span { text-decoration-style: solid; text-decoration-color: var(--encre); }

details.repli > summary { font-weight: 600; }
details.repli[open] > summary { margin-bottom: var(--e3); }
ul.compte-rendu, ul.non-compris { margin: 0 0 var(--e3); padding-left: var(--e5); }
ul.non-compris li { overflow-wrap: anywhere; }

/* La barre d'une periode (horaire de la semaine et du mois, L06-4) : a
   gauche « ← titre → » et le retour a aujourd'hui, a droite la vue et les
   autres pages. Trop etroite, elle passe a la ligne entre ses deux groupes ;
   le groupe passe a la ligne commence alors a gauche (space-between). Le
   compteur se lit sous le titre. */
.barre-periode { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center;
                 gap: var(--e3) var(--e6); }
.barre-periode .periode { flex-wrap: nowrap; min-width: 0; }
.barre-periode .navigation-mois { flex-wrap: nowrap; min-width: 0; }
.barre-periode .navigation-mois > .bouton { flex: none; }
/* Le titre se plie sur deux lignes entre ses fleches plutot que de laisser
   « → » seule a la ligne (320 px). */
.barre-periode .navigation-mois h2 { white-space: normal; min-width: 0; }
.barre-periode-actions { gap: var(--e2) var(--e4); }
.compteur-periode { margin: var(--e2) 0 var(--e4); }

/* Controle segmente : des choix exclusifs cote a cote (la vue de l'horaire,
   la note d'un avis). Le choix en cours est noir, comme un bouton actif ; les
   boutons se touchent, un seul filet entre eux. */
.segments { display: inline-flex; flex-wrap: nowrap; }
.segments > .bouton { border-radius: 0; }
.segments > .bouton + .bouton { margin-left: calc(-1 * var(--filet)); }
.segments > .bouton:first-child { border-top-left-radius: var(--rayon-commande);
                                  border-bottom-left-radius: var(--rayon-commande); }
.segments > .bouton:last-child { border-top-right-radius: var(--rayon-commande);
                                 border-bottom-right-radius: var(--rayon-commande); }
.segments > .bouton:hover, .segments > .bouton:focus-visible { position: relative; z-index: 1; }
/* Des boutons radio dessines en segments (la note d'un avis) : le bouton radio
   reste dessous, pour le clavier (fleches) et le lecteur d'ecran. */
.choix-segments > label.bouton { position: relative; width: var(--hauteur-commande); padding: 0; margin-bottom: 0; }
.choix-segments > label.bouton input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.choix-segments > label.bouton:has(input:checked) { background: var(--surface-encre);
                                                   border-color: var(--surface-encre); color: var(--sur-encre); }
.choix-segments > label.bouton:has(input:focus-visible) { outline: var(--filet-marque) solid var(--encre);
                                                         outline-offset: var(--filet-marque); z-index: 1; }

/* Navigation de periode : « ← titre → ». Seules les fleches, qui portent
   toutes un title (« Semaine précédente »...), grossissent : en 16 px, « Vue
   du mois » et « Rappels » criaient plus fort que tous les autres boutons.
   Le titre de la periode est l'information de l'ecran : en encre, en 17 px,
   en casse normale, et non plus en petites capitales grises. */
.navigation-mois { align-items: center; gap: var(--e3); }
.navigation-mois > .bouton[title],
.navigation-mois .periode > .bouton[title] { width: var(--hauteur-commande); padding: 0;
                                    font-size: var(--taille-intertitre); line-height: var(--ligne-courant);
                                    font-weight: 600; }
.navigation-mois h2 {
    white-space: nowrap;
    margin: 0;
    font-size: var(--taille-intertitre);
    line-height: var(--ligne-courant);
    font-weight: 600;
    text-transform: none;
    letter-spacing: inherit;
    font-feature-settings: normal;
    color: var(--encre);
}

/* Ligne modifiable : lecture d'abord, correction ensuite.

   Une ligne de facture ou de comptabilite s'affiche comme du texte. Le bouton
   « Modifier » ouvre les champs et devient « Enregistrer ». Sans cela, une
   dizaine de cases de saisie s'offrent en permanence a la faute de frappe, et
   l'ecran ressemble a un formulaire alors qu'on vient surtout y lire. */
.ligne-modifiable .en-lecture { display: block; }
.ligne-modifiable.ouverte .en-lecture { display: none; }
.ligne-modifiable.ouverte .en-saisie { display: block; }
.ligne-modifiable.ouverte { background: var(--surface-choisie); }
.ligne-modifiable .bouton.enregistrer { display: none; }
.ligne-modifiable.ouverte .bouton.enregistrer { display: inline-flex; }
.ligne-modifiable.ouverte .bouton.ouvrir { display: none; }
.ligne-modifiable.ouverte td { color: var(--encre-moyenne); }

/* La colonne des actions n'est pas une colonne de chiffres : la classe
   « nombre » y imposait `white-space: nowrap`, donc 239 px de largeur
   minimale, et poussait le tableau hors de sa carte. Et un champ de saisie
   sans largeur imposee prend la place de son contenu, pas celle de sa
   colonne. */
.ligne-modifiable td.actions { text-align: right; white-space: normal; }
.ligne-modifiable td.actions .bouton { transition: opacity var(--instant) var(--courbe); }
.ligne-modifiable .en-saisie { display: none; width: 100%; min-width: 0; box-sizing: border-box; }
.ligne-modifiable .en-saisie.parts { display: none; }
.ligne-modifiable.ouverte .en-saisie.parts {
    display: flex;
    gap: var(--e2);
    justify-content: flex-end;
    margin-top: var(--e2);
}
.ligne-modifiable .parts label {
    display: flex;
    align-items: center;
    gap: var(--e1);
    font-size: var(--taille-secondaire);
    color: var(--encre-douce);
    margin: 0;
}

/* Dans un tableau, les deux boutons d'une ligne tiennent cote a cote et ne
   s'etirent pas : sinon chaque ligne prend deux fois sa hauteur. */
td .rangee { flex-wrap: nowrap; justify-content: flex-end; gap: var(--e2); }
td .rangee .bouton { white-space: nowrap; }
/* Le lieu et le logopede d'une prochaine seance : la liste et « Changer »
   sur une ligne, au debut de la colonne ; « Changer » passe dessous quand la
   place manque (sinon le tableau deborde de 900 a 1 200 px). */
td .rangee.choix-de-seance { justify-content: flex-start; flex-wrap: wrap; }
table input[type=text], table input[type=date], table select { width: auto; }

.en-ordre { color: var(--vert); font-size: var(--taille-secondaire); white-space: nowrap; }

/* Une seule legende, pour l'horaire comme pour les graphiques : une rangee
   de carres de 10 px suivis de leur libelle, un ecart de 8 px entre le carre
   et son libelle, de 16 px entre deux entrees. Les deux regles qui
   s'additionnaient (11 puis 13 px, marge annulee) n'en font plus qu'une. */
.legende {
    margin: var(--e3) 0;
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
    color: var(--encre-douce);
}
.legende > span:not(.pastille-serie) {
    display: inline-flex;
    align-items: center;
    gap: var(--e2);
    margin-right: var(--e4);
}
.legende > span:not(.pastille-serie)::before {
    content: "";
    flex: none;
    width: 0.625rem;
    height: 0.625rem;
    border-radius: var(--rayon-commande);
}

.legende .tp::before { background: var(--metal-voile); border: var(--filet) solid var(--metal-clair); }
.legende .ordinaire::before { background: var(--carte); border: var(--filet) solid var(--filet-fort); }
.legende .libre::before { background: var(--carte); border: var(--filet) solid var(--trait); }
.legende .pointee::before { background: var(--carte); border: var(--filet) solid var(--trait);
                            border-left: var(--filet-presence) solid var(--vert); }
.legende .barree { text-decoration: line-through; }
.legende .groupe::before { background: var(--surface-choisie); border: var(--filet) solid var(--trait);
                           border-left: var(--filet-presence) double var(--encre-moyenne); }
.legende .barree::before { background: var(--carte); border: var(--filet) solid var(--filet-fort); }
.legende .coche { color: var(--vert); font-weight: 600; }

/* Une seance collective (L14-4) : un seul bloc pour ses membres, au double
   filet, qui mene a sa carte ; la carte liste ses membres. */
.bloc-seance.groupe { background: var(--surface-choisie); border-left: var(--filet-presence) double var(--encre-moyenne); }
.groupe-seance + .groupe-seance { border-top: var(--filet) solid var(--trait); margin-top: var(--e4); padding-top: var(--e4); }
.groupe-seance h3 { margin-top: 0; }
.membres-groupe { list-style: none; margin: var(--e2) 0; padding: 0; display: grid; gap: var(--e1); }
.membres-groupe li { display: flex; align-items: center; gap: var(--e2); }

/* Ce que la couleur dit d'une seance se lit aussi en mots (L08-15) : « TP »
   pour le tiers payant, les initiales du logopede quand tout le cabinet
   s'affiche, une coche devant l'heure d'une presence pointee. */
.marque-tp, .marque-logo { margin-left: var(--e1); font-weight: 600; letter-spacing: var(--interlettrage-pastille); }
.marque-tp { color: var(--metal-texte); }
.marque-logo { color: var(--encre-moyenne); }
.legende .marque-tp, .legende .marque-logo { margin-left: 0; }
.bloc-seance.presente .quand::before { content: "\2713\00a0"; content: "\2713\00a0" / ""; color: var(--vert); font-weight: 600; }

@media (max-width: 56.25em) { .grille.deux { grid-template-columns: 1fr; } }
/* Les factures du mois : leur tableau demande 765 px ; la colonne de droite
   passe dessous tant que l'ecran ne les laisse pas cote a cote (L07-18). */
@media (max-width: 77.5em) { .grille.deux.liste-large { grid-template-columns: minmax(0, 1fr); } }

/* ------------------------------------------------------- patient du jour */
/* Le patient du moment occupe deux colonnes : a gauche qui il est et les deux
   boutons, a droite le decompte et les reperes de facturation. */
.patient-courant {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(13.75rem, 0.8fr);
    gap: var(--e7);
    align-items: start;
    background: var(--carte);
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon);
    padding: var(--e7);
    margin-bottom: var(--e4);
}

/* La note occupe toute la largeur sous les deux colonnes. Quand l'editeur sert
   une autre ligne de la journee (L09-5), sa place reste vide et se retire. */
.patient-note { grid-column: 1 / -1; border-top: var(--filet) solid var(--trait); padding-top: var(--e5); }
.patient-note:not(:has(.note)) { display: none; }
.patient-identite { min-width: 0; }
.patient-details { border-left: var(--filet) solid var(--trait); padding-left: var(--e6); }
.repere { width: 100%; }
.repere td { padding: var(--e1) 0; border: 0; }
/* Le libelle est l'en-tete de sa ligne (L08-22) : il garde l'allure d'un
   libelle, pas celle d'un en-tete de colonne. */
.repere th { padding: var(--e1) 0; border: 0; color: var(--encre-douce); width: 45%;
             font-size: inherit; line-height: inherit; font-weight: 400; text-transform: none;
             letter-spacing: inherit; white-space: normal; }
.repere td:last-child { text-align: right; font-weight: 600; font-variant-numeric: tabular-nums; }

/* Une date en toutes lettres commence par un nom de jour en minuscule : la
   majuscule se pose ici plutot que dans le texte, qui sert aussi ailleurs.
   `::first-letter` ne s'applique qu'a un bloc, d'ou le display. */
.capitale { display: inline-block; }
.capitale::first-letter { text-transform: uppercase; }

/* Un mot ne se coupe jamais au milieu : chaque colonne garde au moins la
   largeur de son plus long mot. L'ancienne regle (anywhere) declarait toute
   cellule compressible jusqu'a une lettre, et le tableau en profitait pour
   ecraser les colonnes courtes : « secretaria / t ». La cesure ne vaut pas
   mieux ici : elle rend aussi chaque mot compressible, jusqu'a la syllabe, et
   le tableau coupait « secreta-riat » alors qu'il avait la place. Un tableau
   plus large que sa carte defile dans la carte, jamais la page. */
table td, table th { overflow-wrap: break-word; }
/* Un texte libre (un libelle colle depuis un tableur, sans espace) cede
   avant la colonne des montants : lui seul peut se couper n'importe ou. */
table td.texte-libre { overflow-wrap: anywhere; }

/* La ligne du jour, dans le releve du mois. */
tr.appuyee td { background: var(--surface-choisie); font-weight: 600; }

.patient-courant.alerte { border-color: var(--metal); box-shadow: inset var(--filet-marque) 0 0 var(--metal); }

/* Le nom du patient a la taille d'un titre de page, partout (il etait en 28
   px sur l'accueil et en 26 en titre de fiche). */
.nom-patient {
    font-family: var(--police-titre);
    font-size: var(--taille-titre);
    line-height: var(--ligne-titre);
    font-weight: 400;
    letter-spacing: var(--interlettrage-titre);
    margin: var(--e2) 0 var(--e1);
    /* Un titre h2 a l'accueil (L08-23) : il ne prend rien du surtitre. */
    text-transform: none;
    font-feature-settings: normal;
    color: var(--encre);
}

.creneau { color: var(--encre-douce); font-size: var(--taille-courant); }

/* Le decompte est le seul grand chiffre du logiciel : il se lit de l'autre
   bout de la piece, donc en police d'interface et jamais en Georgia. */
.decompte {
    font-size: var(--taille-affichage);
    line-height: var(--ligne-affichage);
    font-weight: 400;
    letter-spacing: var(--interlettrage-titre);
    font-variant-numeric: tabular-nums;
    margin: var(--e3) 0 var(--e1);
}

/* La fin d'une seance n'est pas une alerte : c'est l'heure. Le texte se fait
   simplement plus petit et plus calme, sans rouge. */
.decompte.fini,
.decompte:not([data-secondes]) { font-size: var(--taille-intertitre); line-height: var(--ligne-courant);
                                  font-weight: 600; letter-spacing: normal; color: var(--encre-douce); }

.boutons-pointage { display: flex; gap: var(--e3); margin-top: var(--e5); flex-wrap: wrap; }

/* ---------------------------------------------------------------- boutons */
/* Le bouton principal est noir sur blanc, comme chez Cartier : c'est a la fois
   le plus elegant et le plus contraste (17,4 pour 1). Le secondaire porte une
   bordure a 3,63 pour 1, seuil des commandes ; l'ancienne bordure a 1,33 etait
   invisible.

   Trois hauteurs, pas une de plus : 40 px (bouton, champ, liste, date, heure
   cote a cote), 32 px pour le petit bouton d'une ligne de tableau, 48 px pour
   le grand bouton seul sur sa ligne (Present, Absent, Enregistrer la fiche). */
.bouton {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--e2);
    height: var(--hauteur-commande);
    padding: 0 var(--e5);
    border-radius: var(--rayon-commande);
    border: var(--filet) solid var(--filet-champ);
    background: var(--carte);
    color: var(--encre);
    font-family: inherit;
    font-size: var(--taille-commande);
    line-height: var(--ligne-commande);
    font-weight: 500;
    cursor: pointer;
    text-decoration: none;
    white-space: nowrap;
    transition: background-color var(--instant) var(--courbe),
                border-color var(--instant) var(--courbe);
}

.bouton:hover { background: var(--surface-survol); border-color: var(--encre); }

.bouton.principal {
    background: var(--surface-encre);
    border-color: var(--surface-encre);
    color: var(--sur-encre);
    font-weight: 600;
}
.bouton.principal:hover { background: var(--principal-survol); border-color: var(--principal-survol); }

.bouton.present { background: var(--vert); border-color: var(--vert); color: var(--sur-encre); font-weight: 600; }
.bouton.present:hover { background: var(--vert-survol); border-color: var(--vert-survol); }
.bouton.absent { background: var(--carte); border-color: var(--rouge); color: var(--rouge); }
.bouton.absent:hover { background: var(--rouge-clair); }
.bouton.grand { height: var(--hauteur-commande-grande); padding: 0 var(--e7); }
/* Le petit bouton d'une ligne (« Retirer », « Annuler », filtres) : il
   gardait les 40 px du bouton ordinaire pour un texte de 12 px. */
.bouton.petit { height: var(--hauteur-commande-petite); padding: 0 var(--e3);
                font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }

/* Un bouton au libelle long, dans une carte etroite (« Envoyer par e-mail les
   14 pas encore parties ») : il passe a la ligne et grandit, au lieu de
   sortir de sa carte (L07-20). */
.bouton.long { max-width: 100%; height: auto; min-height: var(--hauteur-commande); white-space: normal;
               padding-top: var(--e2); padding-bottom: var(--e2); text-align: left; justify-content: flex-start; }
/* Un bouton seul sur sa ligne, de toute la largeur (connexion, impression). */
.bouton.pleine-largeur { width: 100%; }

/* L'action qui detruit : texte rouge, bordure rouge a 3,54 pour 1 ; elle se
   pose au bout de sa rangee, jamais collee au bouton principal. */
.bouton.danger { color: var(--rouge); border-color: var(--rouge-bord); }
.bouton.danger:hover { background: var(--rouge-clair); border-color: var(--rouge); }

/* La corbeille : partout ou une ligne se retire, un bouton carre, rouge, a
   la hauteur des autres boutons. Son libelle est dans title et aria-label. */
.bouton.corbeille {
    width: var(--hauteur-commande);
    padding: 0;
    color: var(--rouge);
    border-color: var(--rouge-bord);
}
.bouton.corbeille:hover { background: var(--rouge-clair); border-color: var(--rouge); }
.bouton.corbeille:focus-visible { outline: var(--filet-marque) solid var(--rouge); outline-offset: var(--filet-marque); }
.bouton .icone { flex: none; display: block; }
.bouton:disabled { color: var(--encre-inactive); border-color: var(--trait);
                   background: var(--surface-appuyee); cursor: default; }
.bouton:disabled:hover { background: var(--surface-appuyee); border-color: var(--trait); }

/* ---------------------------------------------------------------- tableaux */
/* Ligne a 44 px : treize lignes sur un portable, contre neuf si l'on prenait
   la hauteur des sites de joaillerie. Filets horizontaux seulement, jamais de
   quadrillage : les traits verticaux font tableur. */
table { width: 100%; border-collapse: collapse; }

th {
    text-align: left;
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
    padding: var(--e3);
    border-bottom: var(--filet) solid var(--filet-fort);
    white-space: nowrap;
}

/* 12 + 20 + 12 = 44 px de haut, la hauteur ou treize lignes tiennent sur un
   portable. Douze de marge laterale et non seize : dans une grille a deux
   colonnes, six colonnes de tableau perdaient un tiers de leur largeur en
   marges, et les libelles se cassaient en trois lignes. */
td {
    padding: var(--e3);
    line-height: var(--ligne-serree);
    border-bottom: var(--filet) solid var(--trait);
    vertical-align: middle;
}

tbody tr { transition: background-color var(--instant) var(--courbe); }
tbody tr:hover td { background: var(--surface-survol); }
/* Une ligne qui s'ouvre d'un clic le montre au survol (script de layout.html),
   et se voit quand on l'atteint au clavier. */
tbody tr[data-lien] { cursor: pointer; }
tbody tr[data-lien]:focus-visible { outline: var(--filet-marque) solid var(--encre);
                                    outline-offset: calc(-1 * var(--filet-marque)); }
tbody tr[data-lien]:focus-visible td { background: var(--surface-survol); }
/* Le lien que le script de layout.html pose sur le nom d'une ligne (L08-9) :
   il garde l'allure de la ligne, et la ligne entiere s'eclaire quand il a le
   focus. */
.lien-de-ligne { color: inherit; text-decoration: none; }
tbody tr[data-lien]:focus-within td { background: var(--surface-survol); }
/* Un message ou une partie qui recoit le focus apres un envoi ou un saut
   d'ancre (L08-20) : son cadre suffit, pas d'anneau en plus. */
[data-focus-place]:focus { outline: none; }

/* Une alerte ou une carte qui mene ailleurs : meme geste qu'une ligne. */
.ligne-lien { cursor: pointer; border-radius: var(--rayon-commande); }
.ligne-lien:hover { text-decoration: underline; text-underline-offset: 0.1875rem; }
.ligne-lien:focus-visible { outline: var(--filet-marque) solid var(--encre); outline-offset: var(--filet-marque); }
.carte.carte-lien {
    cursor: pointer;
    transition: border-color var(--instant) var(--courbe),
                background-color var(--instant) var(--courbe);
}
.carte.carte-lien:hover { border-color: var(--filet-fort); background: var(--surface-survol); }
.carte.carte-lien:hover td { background: transparent; }
.carte.carte-lien:focus-visible { outline: var(--filet-marque) solid var(--encre); outline-offset: var(--filet-marque); }
tr:last-child td { border-bottom: none; }
/* Dans une carte, le texte d'un tableau commence au bord des titres et des
   paragraphes (il etait 12 px plus loin, L06-28) : le tableau deborde de la
   marge de ses cellules dans celle de la carte, et le survol d'une ligne
   garde son air autour du texte. */
.carte table:not(.mois-agenda):not(.disponibilites):not(.resultats):not(.exemple-tableau) {
    width: calc(100% + 2 * var(--e3));
    margin-left: calc(-1 * var(--e3));
    margin-right: calc(-1 * var(--e3));
}
tr.faible td { color: var(--encre-douce); }
.nombre { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.tableau-dense td { padding: var(--e2) var(--e3); }
/* Un tableau « libelle : valeur » : le libelle ne se coupe pas (« Date de /
   naissance » dans la fiche d'une facture, L07-14). */
.tableau-libelles td:first-child, .tableau-libelles th { white-space: nowrap; color: var(--encre-douce); }
/* L'en-tete d'une ligne « libelle : valeur » (L08-22) garde l'allure d'une
   cellule ; la rangee d'en-tetes ecrite pour le lecteur d'ecran seul ne prend
   aucune place. */
.en-tete-ligne { font-size: inherit; line-height: var(--ligne-serree); font-weight: 400; text-transform: none;
                 letter-spacing: inherit; font-feature-settings: normal; color: inherit; white-space: normal;
                 border-bottom: var(--filet) solid var(--trait); }
tr.en-tetes-lecteur th { padding: 0; border: 0; }
tr:last-child th.en-tete-ligne { border-bottom: none; }
/* Le tableau des chiffres d'un graphique (L08-25) : la case du coin porte le
   meme filet que les en-tetes de colonne. */
.chiffres-graphique thead td { border-bottom: var(--filet) solid var(--filet-fort); }
.chiffres-graphique table { margin-top: var(--e2); }
.tableau-dense th { padding: var(--e2) var(--e3); }

/* -------------------------------------------------------------- pastilles */
/* Pastille d'etat : 20 px de haut (2 + 14 + 2 et ses filets), la hauteur
   d'une ligne de texte serre, pour qu'une ligne de tableau garde ses 44 px
   avec ou sans pastille (45, 46 ou 49 px auparavant). Une pastille sans
   variante est neutre, comme « prévue ». */
.pastille {
    display: inline-block;
    padding: var(--e0) var(--e2);
    border-radius: var(--rayon-rond);
    border: var(--filet) solid var(--trait);
    background: var(--surface-appuyee);
    color: var(--encre-moyenne);
    font-size: var(--taille-pastille);
    line-height: var(--ligne-pastille);
    font-weight: 500;
    letter-spacing: var(--interlettrage-pastille);
    white-space: nowrap;
}

.pastille.presente { background: var(--vert-clair); border-color: var(--vert-filet); color: var(--vert); }
.pastille.absente { background: var(--rouge-clair); border-color: var(--rouge-filet); color: var(--rouge); }
.pastille.annulee { background: var(--surface-appuyee); border-color: var(--filet-fort); color: var(--encre-moyenne); }
.pastille.prevue { background: var(--surface-appuyee); border-color: var(--trait); color: var(--encre-moyenne); }
.pastille.tp { background: var(--metal-voile); border-color: var(--metal-clair); color: var(--metal-texte); }
.pastille.alerte { background: var(--ambre-clair); border-color: var(--ambre-filet); color: var(--ambre); }

/* ---------------------------------------------------------------- messages */
.message {
    padding: var(--e3) var(--e4);
    border-radius: var(--rayon);
    margin-bottom: var(--e4);
    border: var(--filet) solid var(--trait);
    border-left: var(--filet-marque) solid var(--filet-fort);
    background: var(--carte);
    animation: apparaitre var(--entree) var(--courbe-sortie);
}

@keyframes apparaitre {
    from { opacity: 0; transform: translateY(4px); }
    to { opacity: 1; transform: none; }
}

.message.succes { background: var(--vert-clair); border-color: var(--vert-filet);
                  border-left-color: var(--vert); color: var(--vert); }
.message.erreur { background: var(--rouge-clair); border-color: var(--rouge-filet);
                  border-left-color: var(--rouge); color: var(--rouge); }
.message.attention { background: var(--ambre-clair); border-color: var(--ambre-filet);
                     border-left-color: var(--ambre); color: var(--ambre); }

/* ------------------------------------------------------------------ formes */
label, .label {
    display: block;
    font-weight: 500;
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
    color: var(--encre-moyenne);
    margin-bottom: var(--e1);
}

/* Champ, liste, date, heure : 40 px, la hauteur du bouton, pour qu'une
   rangee « Début / Durée / Ajouter » soit droite (38, 39 et 40 px
   auparavant). Le texte de la liste commence au meme endroit que celui du
   champ, et sa fleche est la notre, pas celle du systeme. */
input[type="text"], input[type="password"], input[type="date"], input[type="month"],
input[type="number"], input[type="time"], input[type="tel"], input[type="email"],
input[type="search"], select, textarea {
    width: 100%;
    /* Une liste aux options longues ne pousse pas la page (« Toutes les
       natures » des depenses, 339 px a 320, L07-19). */
    max-width: 100%;
    height: var(--hauteur-commande);
    padding: 0 var(--e3);
    border: var(--filet) solid var(--filet-champ);
    border-radius: var(--rayon-commande);
    font-size: var(--taille-courant);
    line-height: var(--ligne-serree);
    font-family: inherit;
    letter-spacing: inherit;
    background: var(--carte);
    color: var(--encre);
    transition: border-color var(--instant) var(--courbe);
}

select {
    -webkit-appearance: none;
    appearance: none;
    padding-right: var(--e8);
    background: var(--carte) url("chevron.svg") no-repeat right var(--e3) center / var(--e3);
    text-overflow: ellipsis;
}
select[multiple], select[size] { height: auto; padding: var(--e2) var(--e3); background-image: none; }

textarea { height: auto; padding: var(--e2) var(--e3); line-height: var(--ligne-courant); resize: vertical; }
input::placeholder, textarea::placeholder { color: var(--encre-inactive); }
/* Une date vide ne ressemble pas a une date remplie : « jj/mm/aaaa » en encre
   inactive, comme une indication (L06-8). Le script de layout.html pose
   l'attribut tant que le champ est vide. */
input[type="date"][data-vide] { color: var(--encre-inactive); }

input:hover, select:hover, textarea:hover { border-color: var(--encre-moyenne); }

input:focus-visible, select:focus-visible, textarea:focus-visible {
    outline: var(--filet-marque) solid var(--encre);
    outline-offset: var(--filet);
    border-color: var(--encre);
}

/* Un champ qu'on ne peut que lire ne ressemble pas a un champ a remplir ; un
   champ refuse se designe lui-meme. */
input[readonly], textarea[readonly], input:disabled, select:disabled, textarea:disabled {
    background-color: var(--surface-appuyee);
    border-color: var(--trait);
    color: var(--encre-douce);
}
[aria-invalid="true"] { border-color: var(--rouge); box-shadow: inset var(--filet-marque) 0 0 var(--rouge); }

/* Case a cocher et bouton radio : 18 px, a la couleur de l'encre, partout
   (le bleu du systeme etait la seule couleur vive de certains ecrans). */
input[type="checkbox"], input[type="radio"] {
    flex: none;
    width: var(--cote-case);
    height: var(--cote-case);
    margin: 0;
    accent-color: var(--encre);
    vertical-align: -0.1875rem;
    cursor: pointer;
}

.champ { margin-bottom: var(--e5); }
/* Des champs a la largeur de ce qu'ils recoivent : une annee, une date, une
   adresse courte. Ils remplacent les largeurs ecrites dans les gabarits. */
.champ-annee { max-width: 7rem; }
.champ-date { max-width: 11.25rem; }
.champ-moyen { max-width: 17.5rem; }
/* Une grille de champs garde les memes colonnes d'un bloc a l'autre (L06-26) :
   `auto-fill` garde les places vides, la ou `auto-fit` etirait trois champs
   sur la largeur de cinq, et chaque bloc de la fiche avait ses propres bords
   (5, 4, 3 puis 5 colonnes). Chaque champ s'etend sur trois rangees
   partagees avec ses voisins (sous-grille) : libelle, champ, aide. Un
   libelle sur deux lignes ne decale plus son champ, et l'aide sous un champ
   ne repousse plus la ligne suivante de ses voisins. */
.colonnes { display: grid; grid-template-columns: repeat(auto-fill, minmax(16.25rem, 1fr)); gap: 0 var(--e4); }
.colonnes > * { grid-row: span 3; }
/* Un champ qui prend toute la ligne de la grille (une adresse). */
.colonnes > .pleine { grid-column: 1 / -1; }
.colonnes > .champ { display: grid; grid-template-rows: subgrid; align-content: start; }
.colonnes > .champ > label { align-self: end; }
/* L'aide sous un champ : un bloc en texte secondaire (13/20), et non un
   morceau de ligne a l'interligne de 24 px du formulaire. */
.champ > .discret { display: block; margin-top: var(--e1); }
/* Le message d'un champ refuse, sous lui, en rouge (L06-12). */
.champ > .a-verifier { display: block; margin-top: var(--e1); font-size: var(--taille-secondaire);
                       line-height: var(--ligne-serree); }
/* La zone des boutons d'un formulaire : detachee des champs au-dessus et de
   la carte qui suit (« Enregistrer » collait a la carte Dossier, L06-27). */
.actions-formulaire { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e3);
                      margin: var(--e6) 0 var(--e8); }
/* A la fin d'une carte, la carte garde sa propre marge, ni plus ni moins. */
.carte .actions-formulaire:last-child { margin-bottom: 0; }
/* L'action qui detruit se pose au bout de sa rangee, loin du bouton principal. */
.rangee > .bouton.danger, .actions-formulaire > .bouton.danger { margin-left: auto; }

/* La case se cale sur la premiere ligne de son libelle, meme quand il en a
   deux. */
.case { display: flex; align-items: flex-start; gap: var(--e2); margin-bottom: var(--e3); }
.case input { margin-top: calc((var(--ligne-courant) - var(--cote-case)) / 2); }
.case label { margin: 0; font-weight: 400; font-size: var(--taille-courant); line-height: var(--ligne-courant);
              color: var(--encre); }

/* Section de formulaire : une seule facon de la dessiner. Seul, le fieldset
   EST une carte (meme filet, meme marge interieure de 24 px) et sa legende
   s'ecrit dedans, en surtitre, comme le h2 d'une carte : elle ne coupe plus
   le filet. Dans une carte, il n'y a pas de boite dans la boite : le
   fieldset perd cadre et marges, et deux sections se separent d'un filet.
   `min-width: 0` : un fieldset prend sinon la largeur de son contenu le plus
   large et pousse toute la page de cote sur telephone. */
fieldset {
    min-width: 0;
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon);
    padding: var(--marge-carte);
    margin: 0 0 var(--e4);
    background: var(--carte);
    /* Un fieldset s'elargit par defaut jusqu'a son plus long contenu : une
       option de liste plus longue en neerlandais faisait deborder la page a
       390 px (L03-38). */
    min-width: 0;
}
/* Dans un cadre, un bouton long passe a la ligne plutot que de faire
   deborder la page sur telephone (« Controleren op MyCareNet (portaal
   Member Data) », L03-38) ; sur un grand ecran, rien ne change. */
fieldset .rangee .bouton {
    white-space: normal;
    height: auto;
    min-height: var(--hauteur-commande);
    max-width: 100%;
    padding-top: var(--e2);
    padding-bottom: var(--e2);
    text-align: center;
}

fieldset > legend {
    float: left;
    width: 100%;
    padding: 0;
    margin: 0 0 var(--e3);
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
}
fieldset > legend + * { clear: both; }
fieldset > :last-child { margin-bottom: 0; }

.carte fieldset:not(.materiel-groupe) { border: 0; padding: 0; margin: 0 0 var(--e6); background: none; }
.carte fieldset:not(.materiel-groupe):last-child { margin-bottom: 0; }
.carte fieldset:not(.materiel-groupe) + fieldset {
    padding-top: var(--e6);
    border-top: var(--filet) solid var(--trait);
}

/* ---------------------------------------------------------------- connexion */
.page-connexion {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--e5);
}

.boite-connexion { width: 100%; max-width: 23.75rem; }
/* La marque du logiciel au-dessus du nom du cabinet : le mot LeLogo, en
   Garamond comme la marque de l'en-tete, en metal qui ecrit (6,18 pour 1). */
.marque-logiciel {
    margin: 0;
    font-family: var(--police-titre);
    font-size: var(--taille-intertitre);
    line-height: var(--ligne-courant);
    letter-spacing: var(--interlettrage-titre);
    color: var(--metal-texte);
}

/* Comptes en ligne (lot v2-12) : inscription, connexion par e-mail, choix du
   cabinet, mot de passe oublie, invitation. La boite de la connexion ; son
   bouton principal en prend toute la largeur, les liens se rangent dessous. */
.boite-connexion .bouton.principal.grand { width: 100%; }
.liens-connexion {
    list-style: none;
    margin: var(--e5) 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--e2);
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
}
.carte .liens-connexion { margin: var(--e3) 0 var(--e4); }
.choix-cabinets { list-style: none; margin: 0 0 var(--e5); padding: 0; display: grid; gap: var(--e3); }
.bouton.choix-cabinet {
    width: 100%;
    height: auto;
    min-height: var(--hauteur-commande-grande);
    padding: var(--e3) var(--e5);
    flex-direction: column;
    align-items: flex-start;
    gap: var(--e1);
    text-align: left;
    white-space: normal;
}
.nom-du-choix { font-weight: 600; }
.role-du-choix { font-weight: 400; font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }

/* Appareils connectes et invitations en attente : une ligne par appareil ou
   par adresse, l'action a droite (dessous sur un telephone). */
.liste-appareils, .liste-invitations { list-style: none; margin: 0 0 var(--e4); padding: 0; }
.liste-appareils li, .liste-invitations li {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--e3);
    padding: var(--e3) 0;
    border-bottom: var(--filet) solid var(--trait);
}
.liste-appareils li:last-child, .liste-invitations li:last-child { border-bottom: 0; }
.appareil-infos { flex: 1 1 16rem; min-width: 0; }
.appareil-infos p { margin: 0; overflow-wrap: anywhere; }
.appareil-nom { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2); }

/* Le lien d'un rappel (lot v2-13) : la page sans compte ou le patient
   confirme ou annule. Le jour et l'heure en grand, les boutons l'un sous
   l'autre, de toute la largeur, faciles a toucher sur un telephone. */
.rdv-public-quand {
    margin: 0 0 var(--e4);
    font-family: var(--police-titre);
    font-size: var(--taille-intertitre);
    line-height: var(--ligne-courant);
}
.rdv-public-choix { display: grid; gap: var(--e3); margin: var(--e5) 0 var(--e4); }
.rdv-public-choix .bouton.grand { width: 100%; }
/* Les reponses aux rappels, a l'accueil et dans l'horaire ; le champ de
   l'essai d'envoi (option avancee). */
.reponses-rappels ul { margin: var(--e2) 0 var(--e3); padding-left: var(--e5); }
/* Une seance confirmee par le patient : une coche en haut du bloc, a gauche
   de la croix, visible meme sur un bloc d'une demi-heure. */
.bloc-seance .marque-confirme { position: absolute; top: var(--filet); right: var(--e5); margin: 0; }
.champ-essai { max-width: 17.5rem; }

/* ----------------------------------------------------- note de seance */
/* Le commentaire et le materiel s'ecrivent la ou la seance se pointe. Le bloc
   est replie par defaut : son en-tete dit ce qui est note, un clic le deplie. */
.note {
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon);
    background: var(--carte);
}

.note > summary {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--e1) var(--e3);
    padding: var(--e3) var(--e4);
}

.note > summary:hover { background: var(--surface-survol); }

.note-titre {
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
}

.note-etat { font-size: var(--taille-secondaire); line-height: var(--ligne-serree); color: var(--encre-moyenne); }
/* « rien de noté » ne porte plus la classe `vide` : celle-ci est l'etat vide
   des listes, avec 64 px de marge en haut et en bas, et le bouton replie de la
   note montait a 176 px de haut pour une ligne de texte (constat de FastSolve,
   22/09/2026 : « pas besoin d'autant d'espace »). */
.note-etat.rien { color: var(--encre-inactive); }

.note-formulaire, .note-lecture {
    padding: var(--e2) var(--e4) var(--e5);
    border-top: var(--filet) solid var(--trait);
}

.note-formulaire .champ:last-of-type { margin-bottom: var(--e4); }
.note-texte { white-space: pre-wrap; margin: 0 0 var(--e2); }

.materiel-listes {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(13.125rem, 1fr));
    gap: var(--e3);
}

/* Un groupe est un aplat, sans filet : dans la note ouverte, la carte, la
   note et chaque groupe faisaient trois cadres emboites (L06-38). */
.materiel-groupe {
    margin: 0;
    padding: var(--e4) var(--e4) var(--e3);
    border: 0;
    background: var(--fond);
}

/* Le titre est DANS le bloc, pose sur son fond : ni l'etiquette que le
   navigateur accroche en travers du filet du haut, moitie dedans moitie
   dehors, ni une bande rapportee d'une autre couleur qui ferait du titre une
   piece collee dessus. Un seul bloc, une seule couleur, le titre en haut.
   `float` est la seule facon de faire d'un <legend> une boite ordinaire dans
   tous les navigateurs ; les cases qui suivent le degagent. */
.materiel-groupe > legend {
    float: left;
    /* Un pourcentage dans un <fieldset> se compte sur la largeur du contenu
       DEJA amputee du retrait : `100%` rendrait le titre trop court de deux
       retraits, et un titre long irait a la ligne avant le bord. Mesure faite
       dans le navigateur : 210 px au lieu de 242. La rallonge remet le titre
       exactement a la largeur du bloc. */
    width: calc(100% + 2 * var(--e4));
    margin: 0 0 var(--e3);
    padding: 0;
}

/* Un groupe sans case laisserait son titre flotter hors du cadre. */
.materiel-groupe::after { content: ""; display: block; clear: both; }

.materiel-groupe .case { clear: both; margin-bottom: var(--e2); }
.materiel-groupe .case label { font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }

/* La ligne de note dans le tableau de la journee : elle n'a ni filet ni
   marge, le cadre de la note fait deja tout le travail. */
tr.ligne-note td { padding: 0 var(--e3) var(--e3); border-bottom: var(--filet) solid var(--trait); }
tr.ligne-note:hover td { background: transparent; }

/* ---------------------------------------------- accueil sans rechargement */
/* Un seul editeur de note pour la journee (L09-5). Chaque ligne porte un lien
   discret sous le nom du patient, qui dit ce qui est note et pose l'editeur
   sous elle. */
.note-ligne {
    display: inline-flex;
    align-items: baseline;
    gap: var(--e2);
    white-space: nowrap;
    color: inherit;
    text-decoration: none;
    border-bottom: var(--filet) dotted var(--filet-champ);
}
.note-ligne:hover .note-titre { color: var(--encre); }
.note-qui { font-size: var(--taille-secondaire); line-height: var(--ligne-serree); color: var(--encre-moyenne); }
/* « Note enregistree. » : a droite de l'en-tete, en vert, sans prendre de place. */
.note-statut { margin-left: auto; font-size: var(--taille-secondaire); line-height: var(--ligne-serree);
               color: var(--vert); }
/* La note de la fois d'avant (L14-3), sur le fond de la page : elle se lit, elle
   ne s'ecrit pas ici. */
.note-precedente { margin: 0 0 var(--e4); padding: var(--e3) var(--e4); background: var(--fond);
                   border-left: var(--filet-marque) solid var(--trait); }
.note-precedente .note-texte { margin: var(--e1) 0; }
details.note-materiel { margin-bottom: var(--e4); }
details.note-materiel > summary .note-etat { font-weight: 400; margin-left: var(--e2); }
/* Dans un carre de la note, la ligne d'un fichier a la hauteur de ses voisines. */
.materiel-groupe .case label a.fichier-materiel .icone { height: var(--ligne-serree); }

/* Une seance de la journee se prend au clavier (fleches, P, A, N). */
tr.ligne-seance:focus-visible { outline: var(--filet-marque) solid var(--encre);
                                outline-offset: calc(-1 * var(--filet-marque)); }
tr.ligne-seance:focus-visible td { background: var(--surface-survol); }

/* Annuler ou reporter une seance depuis l'accueil (L09-10) : les trois points
   d'une ligne ouvrent une petite feuille posee au-dessus de la page, comme la
   question au lacher d'une seance dans l'horaire. Le script la cale sous ses
   trois points. */
.menu-ligne > summary.bouton { width: var(--hauteur-commande); padding: 0; }
/* Le menu d'une seance de la fiche dit « Modifier » en toutes lettres. */
.menu-ligne.texte > summary.bouton { width: auto; padding: 0 var(--e3); }
.menu-ligne[open] > .menu-ligne-contenu {
    position: fixed;
    z-index: 20;
    display: grid;
    gap: var(--e3);
    width: min(22rem, calc(100vw - var(--e4)));
    padding: var(--e3) var(--e4);
    background: var(--carte);
    border: var(--filet) solid var(--encre);
    box-shadow: var(--ombre-flottante);
    text-align: left;
}
.menu-ligne-contenu form { margin: 0; }
/* Encaisser a la seance (L09-16) : un montant tient en dix signes, le mode a
   la largeur de son libelle ; la rangee ne les etire pas. */
.encaisser-seance .rangee input.montant-court { flex: 0 0 7.5rem; width: 7.5rem; }
.encaisser-seance .rangee select { flex: 0 1 auto; }
.menu-ligne-contenu .champ { margin-bottom: var(--e2); }

/* Une date ou une heure ne se coupe jamais en deux lignes : la colonne du
   journal etait trop etroite et « 21/09/2026 a 00h09 » se cassait en son
   milieu, sur les deux cents lignes. */
.quand { white-space: nowrap; }

/* ------------------------------------------------------- suivi du patient */
/* Le fil du suivi, tout en bas de la fiche : une entree par seance, la plus
   recente en premier, avec un filet vertical qui tient la colonne. */
/* Un groupe de cartes (les accords d'un patient) : son titre et son action
   au-dessus d'elles, 40 px avant, 12 px apres ; 40 px le detachent aussi de
   la carte qui suit. */
.suivi { margin: var(--e8) 0; }
.suivi > .entre-deux { align-items: center; margin-bottom: var(--e3); }
.suivi > .entre-deux h2 { margin: 0; }

.fil { list-style: none; margin: 0; padding: 0; }

.fil-entree {
    position: relative;
    padding: 0 0 var(--e5) var(--e5);
    border-left: var(--filet) solid var(--trait);
}

.fil-entree:last-child { padding-bottom: 0; border-left-color: transparent; }

.fil-entree::before {
    content: "";
    position: absolute;
    left: -0.25rem;
    top: 0.25rem;
    width: 0.4375rem;
    height: 0.4375rem;
    border-radius: var(--rayon-rond);
    background: var(--metal);
}

.fil-date {
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
    display: flex;
    align-items: center;
    gap: var(--e2);
}

.fil-texte { white-space: pre-wrap; margin: var(--e2) 0 var(--e1); }
.fil-pied { font-size: var(--taille-secondaire); }

.etiquettes { display: flex; flex-wrap: wrap; gap: var(--e2); margin-bottom: var(--e5); }

.etiquette-compte {
    display: inline-flex;
    align-items: baseline;
    gap: var(--e2);
    padding: var(--e0) var(--e2);
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon-rond);
    font-size: var(--taille-secondaire);
    line-height: var(--ligne-serree);
    background: var(--carte);
}

.etiquette-compte .fois {
    font-size: var(--taille-secondaire);
    font-variant-numeric: tabular-nums;
    color: var(--encre-douce);
}

/* ------------------------------------------------------------------ divers */
.discret { color: var(--encre-douce); font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
/* `.mono` reste dans les gabarits (codes, dates, heures, numeros), mais n'est
   plus une police a chasse fixe : le texte garde la police et la taille de
   ses voisins (« 38,37 € » en 13 px a chasse fixe a cote de « 115,11 € » en
   Inter). Une colonne de montants s'aligne par `.nombre`. */
.mono { font-family: inherit; font-size: inherit; }
.rangee { display: flex; gap: var(--e3); align-items: center; flex-wrap: wrap; }

/* Un champ dans une rangee partage la ligne au lieu de la prendre entiere :
   sans cela, un formulaire d'ajout en une ligne s'empile en trois. */
.rangee input[type="text"], .rangee input[type="date"],
.rangee input[type="number"], .rangee select { width: auto; flex: 1 1 10.625rem; }
.entre-deux { display: flex; justify-content: space-between; align-items: baseline; gap: var(--e4); }
/* Les actions d'un en-tete (L07-13, L06-33) : a droite, sur le bord du
   contenu, sur une ligne tant qu'elles tiennent, et 16 px avant ce qui suit.
   Une description longue ne les ecrase plus en colonne, en escalier. */
.entre-deux > :first-child { min-width: 0; }
.entre-deux > .rangee:not(:first-child) { flex: 0 1 auto; justify-content: flex-end; max-width: 55%;
                                          margin-bottom: var(--e4); }
/* Un bouton seul (« Retour ») aussi : au telephone, il touchait le message
   juste dessous (passe 4). */
.entre-deux > .bouton:not(:first-child) { margin-bottom: var(--e4); }

/* L'etat vide est le seul endroit ou l'on respire a la joailliere. */
.vide { padding: var(--e10) var(--e6); text-align: center; color: var(--encre-douce); }
/* L'etat vide d'une petite carte, sous son titre : une ligne, pas un trou de
   150 px au milieu d'un formulaire (L06-42). */
.vide.compact { margin: 0; padding: var(--e2) 0; text-align: left; }
/* Pages d'erreur (15 octobre 2026) : le code en petit sous le message, les
   chemins de retour cote a cote, ou l'un sous l'autre sur un telephone. */
.page-erreur .retours { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--e3); margin-top: var(--e6); }

/* Une cle a recopier : grande, espacee, en chiffres tabulaires. */
.secret-affiche {
    font-size: var(--taille-intertitre);
    letter-spacing: var(--interlettrage-capitales);
    font-variant-numeric: tabular-nums;
    background: var(--metal-voile);
    border: var(--filet) solid var(--metal-clair);
    border-radius: var(--rayon-commande);
    padding: var(--e3) var(--e4);
    display: inline-block;
    margin-top: var(--e2);
}

/* ------------------------------------------------------------ petits ecrans */
/* Le cabinet travaille sur deux Mac, mais l'ecran doit rester lisible si
   quelqu'un ouvre la page sur un portable etroit ou une fenetre reduite. */
/* L'en-tete s'aligne sur la colonne et ses marges suivent la gouttiere : il
   n'a plus de points de rupture a lui (1 500, 1 100, 1 000 px), seulement le
   passage a l'empilement sur telephone. */

/* Un menu ou un sommaire trop large defile : un fondu a droite dit qu'il en
   reste (le sommaire de la fiche cachait « Notes de séance » sans le dire,
   L04-19). Le masque ne garde que la forme du degrade, pas sa couleur. */
.menu.deborde, .sommaire.deborde, .onglets.deborde {
    -webkit-mask-image: linear-gradient(to right, var(--encre) calc(100% - var(--e8)), transparent);
    mask-image: linear-gradient(to right, var(--encre) calc(100% - var(--e8)), transparent); }
.menu.deborde.au-bout, .sommaire.deborde.au-bout, .onglets.deborde.au-bout {
    -webkit-mask-image: none; mask-image: none; }

/* Sous 1 280 px, l'en-tete ne tient plus sur une ligne : a 1 024 px (tablette
   en paysage), Comptabilite etait coupee et Tableau de bord cache ; a 768 px,
   trois ecrans sur huit etaient visibles (L04-9). Le menu passe sur sa propre
   ligne, sous la marque et l'identite, et revient a la ligne plutot que de
   cacher un ecran. */
@media (max-width: 79.9375em) {
    .entete { flex-wrap: wrap; column-gap: var(--e4); row-gap: 0; }
    .identite { margin-left: auto; }
    .menu { order: 3; flex: 1 1 100%; flex-wrap: wrap; border-top: var(--filet) solid var(--trait); }
    .menu a { display: inline-flex; align-items: center; min-height: var(--cible-tactile);
              padding: 0 var(--e2); }
}

/* La barre d'onglets du telephone : cachee ailleurs. */
.onglets-bas { display: none; }

/* Sur telephone, le menu quitte l'en-tete pour une barre d'onglets fixee en
   bas de l'ecran, a portee du pouce : Accueil, Horaire, Patients, Facture,
   et « Plus » pour le reste (L04-9). L'en-tete (marque et identite) n'est
   plus colle : il occupait 179 px sur 844 en haut de la fiche (L04-18). */
@media (max-width: 40em) {
    main { padding: var(--e4) var(--gouttiere) var(--e9); }
    /* En etroit, l'en-tete s'empile : marque, puis identite.
       flex-wrap doit repasser a nowrap : en colonne, un conteneur qui enroule
       calcule sa largeur sur l'element le plus large et etire tous les autres
       dessus, ce qui pousse l'en-tete hors de l'ecran. */
    .entete {
        position: static;
        gap: 0;
        flex-direction: column;
        flex-wrap: nowrap;
        align-items: stretch;
    }
    /* Le nom du cabinet est saisi par le client : il peut etre long, donc il
       doit pouvoir revenir a la ligne plutot que pousser la page. */
    .marque { padding: var(--e3) 0 var(--e1); white-space: normal; max-width: none; }
    .menu { display: none; }
    body { padding-bottom: var(--hauteur-onglets); }
    .onglets-bas {
        display: flex;
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: 15;
        height: var(--hauteur-onglets);
        background: var(--carte);
        border-top: var(--filet) solid var(--trait);
    }
    .onglets-bas > a, .onglet-plus > summary {
        flex: 1 1 auto;
        min-width: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 0 var(--e1);
        color: var(--encre-douce);
        font-size: var(--taille-secondaire);
        line-height: var(--ligne-serree);
        font-weight: 500;
        text-decoration: none;
        white-space: nowrap;
        border-top: var(--filet-marque) solid transparent;
    }
    .onglets-bas > a.actif, .onglet-plus.actif > summary { color: var(--encre); border-top-color: var(--metal); }
    .onglet-plus { display: flex; flex: 1 1 auto; min-width: 0; }
    .onglet-plus > summary { width: 100%; }
    .onglet-plus > summary:not(.bouton)::before { margin-right: var(--e1); }
    /* La feuille s'ouvre vers le haut : le triangle aussi. */
    .onglet-plus[open] > summary:not(.bouton)::before { transform: rotate(-90deg); }
    /* « Plus » ouvre une feuille posee sur la barre : une ligne de 48 px par
       ecran. */
    .feuille-plus {
        position: fixed;
        left: 0;
        right: 0;
        bottom: var(--hauteur-onglets);
        display: grid;
        padding: var(--e2) var(--gouttiere);
        background: var(--carte);
        border-top: var(--filet) solid var(--trait);
        box-shadow: var(--ombre-flottante);
    }
    .feuille-plus a {
        display: flex;
        align-items: center;
        min-height: var(--hauteur-commande-grande);
        color: var(--encre);
        text-decoration: none;
        border-bottom: var(--filet) solid var(--trait);
    }
    .feuille-plus a:last-child { border-bottom: 0; }
    .feuille-plus a.actif { font-weight: 600; }
    /* L'en-tete sur une rangee (passe 5) : le nom du cabinet, puis la loupe,
       l'aide et les initiales du compte. Reglages et Quitter sont dans la
       feuille « Plus » de la barre du bas. Il prenait deux rangees, et la
       premiere fiche arrivait a 670 px sur 812. */
    .entete { flex-direction: row; align-items: center; gap: var(--e3); }
    .marque { flex: 1 1 auto; min-width: 0; padding: var(--e2) 0; }
    .identite {
        margin-left: 0;
        flex: 0 0 auto;
        gap: var(--e1);
        padding: var(--e1) 0;
    }
    .identite .lien-reglages, .identite form { display: none; }
    .identite .lien-compte { max-width: none; overflow: visible; }
    .lien-compte .nom-du-compte { position: absolute; width: 1px; height: 1px; overflow: hidden;
                                  clip: rect(0 0 0 0); white-space: nowrap; }
    .identite .initiales-du-compte {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: var(--cible-tactile);
        height: var(--cible-tactile);
        border: var(--filet) solid var(--filet-fort);
        border-radius: var(--rayon-rond);
        font-size: var(--taille-secondaire);
        font-weight: 600;
        letter-spacing: var(--interlettrage-capitales);
        color: var(--encre);
    }
    .feuille-plus form { margin: 0; }
    .feuille-plus .quitter {
        display: flex;
        align-items: center;
        width: 100%;
        min-height: var(--hauteur-commande-grande);
        padding: 0;
        background: none;
        border: 0;
        font-family: inherit;
        font-size: inherit;
        line-height: inherit;
        color: var(--encre);
        text-align: left;
        cursor: pointer;
    }
    th { white-space: normal; }
    td, th { padding: var(--e3) var(--e2); }
    .carte table:not(.mois-agenda):not(.disponibilites):not(.resultats):not(.exemple-tableau) {
        width: calc(100% + 2 * var(--e2));
        margin-left: calc(-1 * var(--e2));
        margin-right: calc(-1 * var(--e2));
    }
    .colonnes { grid-template-columns: 1fr; }
    .patient-courant { padding: var(--e5); grid-template-columns: 1fr; gap: var(--e5); }
    .patient-details { border-left: 0; border-top: var(--filet) solid var(--trait);
                       padding-left: 0; padding-top: var(--e4); }
    .boutons-pointage .bouton.grand { flex: 1; }
    /* Un bouton ne sort jamais de son bloc : trop long pour la largeur, son
       libelle passe a la ligne et le bouton grandit (« Vérifier sur
       MyCareNet (portail Member Data) » poussait la fiche hors de l'ecran). */
    .bouton { max-width: 100%; height: auto; min-height: var(--hauteur-commande);
              padding-top: var(--e2); padding-bottom: var(--e2); white-space: normal; text-align: center; }
    .entre-deux { flex-direction: column; align-items: stretch; }
    .entre-deux > .rangee:not(:first-child) { max-width: none; justify-content: flex-start; }
    .materiel-listes { grid-template-columns: 1fr; }
}

/* Telephone en paysage : 390 px de haut. Un en-tete colle en prenait 29 %
   (L04-18) : il defile avec la page. */
@media (max-height: 31.25em) {
    .entete { position: static; }
}

@media print {
    /* Fiche patient en onglets : a l'impression, toutes les parties a la suite. */
    [data-onglet][hidden] { display: block !important; }
    .codes-secours { break-inside: avoid; }
    .visite, .bandeau-version, .premiers-pas-accueil { display: none !important; }
    .entete, .boutons-pointage, .bouton, .sans-impression { display: none !important; }
    /* Tableau de bord et rapports : une carte sous l'autre, jamais coupee. */
    .indicateurs, .deux-graphiques { display: block; }
    .indicateurs .carte, .deux-graphiques .carte { margin-bottom: 8mm; break-inside: avoid; }
    /* Une carte ne se coupe pas, un titre ne reste pas seul en bas de page
       (L07-30). */
    .carte { break-inside: avoid; }
    h2 { break-after: avoid; }
    .creneau-survol { display: none !important; }
    .calendrier-cadre { overflow: visible; max-height: none !important; }
    .defilement-heures { display: none !important; }
    body { background: var(--carte); }
    /* Sur papier, ni cadre ni ombre de defilement. */
    .carte { border: none; padding: 0; background: none; }
    .note { display: none !important; }
}

/* --------------------------------------------------------------------------
   Fiche du tiers payant

   A gauche la feuille MOD 111 a sa vraie taille, 127 x 304,8 mm ; a droite ses
   valeurs, corrigeables. La colonne de gauche prend la largeur de la feuille
   et pas un millimetre de plus (min-content : la feuille ne se plie pas, le
   texte autour si) : c'est la colonne de droite qui s'adapte a la fenetre. Sous 1300 px les deux s'empilent, et la feuille defile dans son
   propre cadre plutot que de pousser la page.
   -------------------------------------------------------------------------- */

.grille.fiche-tp { grid-template-columns: min-content minmax(0, 1fr); }

.feuille-cadre {
    overflow-x: auto;
    padding: var(--e4);
    margin: var(--e3) 0;
    background: var(--surface-appuyee);
    border-radius: var(--rayon);
}

/* La feuille elle-meme. Tout ce qui s'herite de la page est remis a plat :
   l'interlettrage et les chiffres tabulaires du logiciel decaleraient les
   valeurs par rapport au formulaire imprime, qui ne les connait pas. */
.mod111-feuille {
    position: relative;
    margin: 0 auto;
    overflow: hidden;
    background: var(--feuille-papier);
    box-shadow: var(--ombre-glisse);
    color: var(--feuille-valeur);
    font-family: "Courier New", Courier, monospace;
    font-size: var(--feuille-taille);
    font-weight: 400;
    font-style: normal;
    letter-spacing: normal;
    word-spacing: normal;
    font-feature-settings: normal;
    font-variant-numeric: normal;
    text-transform: none;
    flex: none;
}

.mod111-feuille .preimprime { position: absolute; left: 0; top: 0; display: block; }
.mod111-feuille .preimprime .encre { fill: var(--feuille-encre); }
.mod111-feuille .preimprime .filet { fill: none; stroke: var(--feuille-encre); }
.mod111-feuille .preimprime .pointille {
    fill: none;
    stroke: var(--feuille-encre);
    stroke-width: 0.3;
    stroke-dasharray: 0.3 0.7;
}
.mod111-feuille .preimprime .perforation {
    fill: none;
    stroke: var(--feuille-perforation);
    stroke-width: 0.15;
    stroke-dasharray: 1.2 0.9;
}
/* Un trou laisse voir ce qu'il y a derriere la feuille. */
.mod111-feuille .preimprime .trou { fill: var(--surface-appuyee); stroke: var(--feuille-trou); stroke-width: 0.15; }
/* Sans crenage : avec une largeur imposee, WebKit calcule l'echelle sur les
   chasses sans crenage puis dessine avec, et le titre finissait 1 mm trop tot
   (mesure le 2026-09-20 sur le rendu WebKit de macOS). */
.mod111-feuille .preimprime .libelle {
    fill: var(--feuille-encre);
    font-family: Helvetica, Arial, "Liberation Sans", sans-serif;
    font-weight: 400;
    letter-spacing: normal;
    font-kerning: none;
    font-variant-ligatures: none;
}
.mod111-feuille .preimprime .libelle.gras { font-weight: 700; }
.mod111-feuille .preimprime .libelle.empattements {
    font-family: "Times New Roman", Times, serif;
    font-weight: 700;
}

/* Les valeurs : memes regles que le formulaire imprime, au caractere pres. */
.mod111-feuille .valeur {
    position: absolute;
    white-space: nowrap;
    overflow: hidden;
    line-height: 1;
    text-overflow: clip;
}
.mod111-feuille .valeur.droite { text-align: right; }
.mod111-feuille .valeur.centre { text-align: center; }
.mod111-feuille .trait { position: absolute; border-top: 0.4mm solid var(--feuille-valeur); height: 0; }

.valeurs-tp { table-layout: auto; }
.valeurs-tp td { overflow-wrap: anywhere; }
.valeurs-tp th { white-space: normal; }

/* Le libelle d'une case est un entete de ligne : il en garde le role, pas
   l'allure des entetes de colonne (capitales, interlettrage). */
.valeurs-tp th[scope=row] {
    width: 34%;
    font-size: inherit;
    line-height: inherit;
    font-weight: 400;
    text-transform: none;
    letter-spacing: inherit;
    font-feature-settings: normal;
    border-bottom: var(--filet) solid var(--trait);
    overflow-wrap: normal;
    vertical-align: top;
}

/* La colonne des boutons, et elle seule, se serre sur son contenu. Viser la
   derniere cellule ecrasait la valeur pour un compte sans le droit de corriger,
   chez qui la derniere cellule EST la valeur. */
.valeurs-tp td.actions { width: 1%; white-space: nowrap; }
/* Les boutons d'une ligne de valeurs sont petits (32 px). Sur un ecran a
   souris, ils restent visibles mais discrets (texte gris, sans cadre) et
   prennent leur cadre au survol ou au clavier de leur ligne : encadres, vingt
   « Modifier » empiles faisaient une colonne de boutons a cote des valeurs
   (L07-37), 25 paires Modifier et corbeille dans la comptabilite (L07-35) ;
   invisibles jusqu'au survol, on ne savait pas qu'ils existaient. */
.valeurs-tp td.actions .bouton { height: var(--hauteur-commande-petite); padding: 0 var(--e3);
                                 font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
@media (hover: hover) {
    tr.ligne-modifiable:not(.ouverte):not(:hover):not(:focus-within) > td.actions .bouton {
        border-color: transparent; background: transparent; color: var(--encre-douce); }
}
.valeurs-tp td.actions .rangee { flex-wrap: wrap; }
.valeurs-tp .automatique { display: block; font-size: var(--taille-secondaire); }
.valeurs-tp .pastille { margin-left: var(--e1); }
.valeurs-tp .en-saisie { max-width: 100%; }
/* Une adresse ou une identification se corrige en la voyant en entier. */
.valeurs-tp input.en-saisie[type=text]:not([size]) { width: 100%; }

/* Une valeur longue (adresse, identification) se corrige en la voyant en
   entier : son champ occupe une ligne a lui, sous la sienne, sur toute la
   largeur du tableau. La ligne n'existe a l'ecran que pendant la saisie. */
.valeurs-tp .saisie-large { display: none; }
.valeurs-tp .ligne-modifiable.ouverte + .saisie-large { display: table-row; background: var(--surface-choisie); }
.valeurs-tp .saisie-large td { padding-top: 0; }
.valeurs-tp .saisie-large .en-saisie { display: block; width: 100%; }
.valeurs-tp .limite { display: block; font-size: var(--taille-secondaire); margin-top: var(--e1); }
.valeurs-tp .ligne-modifiable.ouverte.a-saisie-large td,
.valeurs-tp .ligne-modifiable.ouverte.a-saisie-large th { border-bottom-color: transparent; }

/* Le resultat d'un envoi, repete au-dessus de la ligne qu'il concerne. */
.valeurs-tp .rappel td { padding: var(--e2) 0; border-bottom: none; }
.valeurs-tp .rappel .message { margin: 0; }

/* Finitions : le libelle suit sa ligne (filet, survol, alignement). */
.valeurs-tp tr:last-child th[scope=row] { border-bottom: none; }
.valeurs-tp tbody tr:hover th[scope=row] { background: var(--surface-survol); }
.valeurs-tp td, .valeurs-tp th[scope=row] { vertical-align: top; }
.ligne-modifiable .bouton.annuler { display: none; }
.ligne-modifiable.ouverte .bouton.annuler { display: inline-flex; }
.ligne-modifiable.ouverte .bouton.retablir { display: none; }

/* Un bouton seul dans son formulaire, pose dans le texte ou une ligne. */
form.en-ligne { display: inline-block; margin: 0 var(--e1) var(--e1) 0; }

/* Lu par un lecteur d'ecran, invisible a l'oeil. */
.pour-lecteur {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}

.seulement-impression { display: none; }

/* Sous 1300 px la colonne de droite passerait sous 640 px, et le tableau des
   prestations (cinq colonnes, pastilles comprises) n'y tient plus : les deux
   colonnes s'empilent plutot que de cacher des boutons derriere un defilement. */
@media (max-width: 81.25em) {
    .grille.fiche-tp { grid-template-columns: minmax(0, 1fr); }
}

/* La feuille dessinee ne s'imprime jamais : le vrai papier porte deja tout, et
   un Cmd+P reflexe, imprimante matricielle choisie, gacherait un formulaire
   numerote. L'impression passe par le bouton « Sur le formulaire MOD 111 ». */
@media print {
    .feuille-cadre { display: none !important; }
    .seulement-impression { display: block !important; }
    /* Une saisie en cours n'est pas une valeur enregistree : seule la lecture
       s'imprime. */
    .valeurs-tp .en-saisie, .valeurs-tp .saisie-large, .valeurs-tp .limite { display: none !important; }
    .valeurs-tp .en-lecture { display: block !important; }
}

/* Seuil de presence (Reglages) : un seul chiffre, lu d'abord, ouvert par
   « Modifier ». Le champ garde la largeur de trois chiffres, suivi de son %. */
.seuil-presence.ouverte { background: none; }
.seuil-presence .champ { margin-bottom: var(--e3); }
.seuil-presence .seuil-lecture { font-size: var(--taille-intertitre); font-weight: 600; }
.ligne-modifiable.ouverte .seuil-saisie { display: flex; align-items: center; gap: var(--e2); }
.seuil-presence .seuil-saisie input { width: 6rem; flex: none; }

/* Accords, bilans, documents (6 octobre 2026). */
.compteur { font-variant-numeric: tabular-nums; white-space: nowrap; }
.compteur .rouge { color: var(--rouge); font-weight: 600; }
.compteur .ambre { color: var(--ambre); font-weight: 600; }
/* La jauge des seances d'un accord : une barre de la charte, la meme sous
   Chrome, Safari et Firefox, et non la jauge arrondie verte du systeme. Le
   vert, l'ambre et le rouge suivent les bornes posees sur l'element. La
   jauge du statut social (.jauges > .jauge) est un autre composant. */
meter {
    display: block;
    width: 100%;
    height: var(--e2);
    margin: var(--e2) 0 var(--e3);
    -webkit-appearance: none;
    appearance: none;
    border: 0;
    background: var(--surface-appuyee);
}
meter::-webkit-meter-bar { height: var(--e2); border: 0; border-radius: 0; background: var(--surface-appuyee); }
meter::-webkit-meter-optimum-value { background: var(--vert); }
meter::-webkit-meter-suboptimum-value { background: var(--ambre); }
meter::-webkit-meter-even-less-good-value { background: var(--rouge); }
meter::-moz-meter-bar { background: var(--vert); }
meter:-moz-meter-sub-optimum::-moz-meter-bar { background: var(--ambre); }
meter:-moz-meter-sub-sub-optimum::-moz-meter-bar { background: var(--rouge); }
.alertes-accord > div + div { margin-top: var(--e2); }
.alertes-accord .pastille { margin-right: var(--e1); }
.lecture-carte { margin-bottom: var(--e4); }
/* Un tableau plus large que l'ecran defile dans son cadre. Positionne : ses
   etiquettes pour lecteur d'ecran (position absolue) restent dedans, et
   n'elargissent plus la page sur un telephone. */
.defilement { overflow-x: auto; position: relative; }
/* Dans une carte, le cadre prend aussi la marge ou deborde le tableau (L06-28) :
   sans cela, il coupait les 12 px de gauche, le debut du texte d'un tableau
   empile sur telephone, et defilait de 12 px sur un grand ecran. */
.carte .defilement { margin-left: calc(-1 * var(--e3)); margin-right: calc(-1 * var(--e3));
                     padding-left: var(--e3); padding-right: var(--e3); }
table.resultats td { vertical-align: top; }
table.resultats th, table.resultats td { padding-left: var(--e1); padding-right: var(--e1); }
table.resultats select { max-width: 10.625rem; }
table.resultats td:nth-child(2) select { max-width: 8.75rem; }
table.resultats td:nth-child(4) input { width: 8.125rem; }
table.resultats input.court { width: 4.25rem; padding-left: var(--e1); padding-right: var(--e1); }
table.resultats input.petit { display: block; margin-top: var(--e2); width: 100%; min-width: 7.5rem; }
.conformite ul { list-style: none; margin: var(--e3) 0 0; padding: 0; }
.conformite li + li { margin-top: var(--e2); }
.carte.traitement h3 { margin: 0; }

/* ------------------------------------------------ agenda, criteres 7 a 9 */
/* Rendez-vous sans patient : gris, hachure fine, il occupe sa place. */
.bloc-seance.rendez-vous {
    background-image: repeating-linear-gradient(135deg, var(--surface-appuyee) 0 4px,
                                                var(--carte) 4px 8px);
    border-left-color: var(--encre-inactive);
    color: var(--encre-moyenne);
}
.bloc-seance .marque-rdv {
    display: inline-block;
    margin-top: var(--filet);
    padding: 0 var(--e1);
    border-radius: var(--rayon-rond);
    background: var(--accent-clair);
    color: var(--accent);
    font-size: var(--taille-pastille);
    line-height: var(--ligne-bloc);
}
.bloc-seance .menu-bloc {
    position: absolute;
    top: 0;
    right: 0;
    z-index: 1;
    /* 24 x 24 px, la taille minimale d'une cible (L08-17) : elle en faisait 16. */
    width: var(--e6);
    height: var(--e6);
    padding: 0;
    border: 0;
    border-radius: var(--rayon-commande);
    background: transparent;
    color: var(--encre-douce);
    font-family: inherit;
    font-size: var(--taille-commande);
    line-height: var(--e6);
    font-weight: 600;
    cursor: pointer;
}
/* A la souris, la croix se voit sans survol (elle ne paraissait qu'au
   survol) ; le nom s'arrete deja avant elle. Au doigt, le bloc ouvre sa
   feuille d'actions et la croix se cache (L04-8, plus bas). */
.bloc-seance .menu-bloc:hover { background: var(--rouge-clair); color: var(--rouge); }
.bloc-seance .menu-bloc:focus-visible { outline: var(--filet-marque) solid var(--encre); outline-offset: 0; }
.bloc-seance.fantome .menu-bloc { display: none; }

/* Un lien se reconnait sans le survol (L08-39) : un soulignement discret, au
   filet des champs (3,6 pour 1), qui fonce au survol. */
.calendrier .titre-jour a { color: inherit; text-decoration: underline; text-decoration-color: var(--filet-champ);
                            text-underline-offset: 0.1875rem; }
.calendrier .titre-jour a:hover { color: var(--encre); text-decoration-color: currentColor; }

.legende .rdv::before {
    background-image: repeating-linear-gradient(135deg, var(--surface-appuyee) 0 2px,
                                                var(--carte) 2px 4px);
    border: var(--filet) solid var(--trait);
    border-left: var(--filet-marque) solid var(--encre-inactive);
}

/* La question posee au lacher d'une seance : cette fois, ou chaque semaine. */
.choix-agenda {
    position: fixed;
    z-index: 20;
    max-width: min(27.5rem, calc(100vw - var(--e4)));
    padding: var(--e3) var(--e4);
    background: var(--carte);
    border: var(--filet) solid var(--encre);
    box-shadow: var(--ombre-flottante);
}
.choix-agenda p { margin: 0 0 var(--e2); font-size: var(--taille-commande); }
.choix-agenda .rangee { flex-wrap: wrap; }
/* La croix d'une seance ne montre que ce qui vaut pour elle (L08-2) : le
   bouton dessine gardait sa boite malgre l'attribut hidden. */
.choix-agenda [hidden] { display: none; }

/* La fenetre du logiciel (15 octobre 2026) : la question avant un geste qui
   ne se defait pas, ou un avertissement. Elle remplace les boites grises du
   navigateur (confirm, alert), qui ne suivaient ni la police ni la charte.
   La page derriere s'eteint, la reponse se donne au clavier comme a la
   souris (Entree, Echap). */
.fenetre {
    width: min(27.5rem, calc(100vw - var(--e7)));
    max-width: none;
    padding: var(--e5) var(--e6);
    border: var(--filet) solid var(--filet-fort);
    border-radius: var(--rayon);
    background: var(--carte);
    color: var(--encre);
    box-shadow: var(--ombre-flottante);
    animation: apparaitre var(--entree) var(--courbe-sortie);
}
.fenetre::backdrop { background: var(--voile); }
.fenetre-texte { margin: 0 0 var(--e5); white-space: pre-line; overflow-wrap: break-word; }
.fenetre-boutons { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--e3); }
.fenetre-boutons [hidden] { display: none; }

/* Vue du mois */
.mois-agenda { width: 100%; table-layout: fixed; border-collapse: collapse; }
.mois-agenda.week-end-vide col.week-end { width: 7%; }
.mois-agenda th {
    padding: var(--e2) var(--e1);
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
    background: var(--surface-appuyee);
    border: var(--filet) solid var(--trait);
}
.mois-agenda td {
    height: 6.5rem;
    padding: var(--e1);
    vertical-align: top;
    border: var(--filet) solid var(--trait);
    font-size: var(--taille-pastille);
    line-height: var(--ligne-pastille);
}
.mois-agenda td.hors-mois { background: var(--surface-survol); color: var(--encre-inactive); }
.mois-agenda td.ferme {
    background-image: repeating-linear-gradient(45deg, var(--surface-appuyee) 0 6px,
                                                var(--carte) 6px 12px);
}
/* Aujourd'hui se marque comme dans la semaine : voile et filet de metal, et
   non plus un cadre noir (L06-32). */
.mois-agenda td.aujourdhui { background: var(--metal-voile); box-shadow: inset 0 var(--filet-marque) 0 var(--metal); }
/* Le numero du jour est l'information de la case : 13 px, 600, en encre. Le
   lien vers la semaine ne parait qu'au lundi, en petit et en encre douce (il
   etait en 13 px gras sur chaque case, plus visible que le jour). */
.mois-agenda .numero { display: flex; justify-content: space-between; align-items: baseline;
                       font-size: var(--taille-secondaire); line-height: var(--ligne-serree); font-weight: 600; }
.mois-agenda .numero a { color: inherit; text-decoration: underline; text-decoration-color: var(--filet-champ);
                         text-underline-offset: 0.1875rem; }
.mois-agenda .numero .vers-semaine { font-size: var(--taille-pastille); line-height: var(--ligne-pastille);
                                     font-weight: 400; color: var(--encre-douce); }
.mois-agenda .numero a:hover { text-decoration-color: currentColor; }
.mois-agenda ul { margin: var(--e0) 0 0; padding: 0; list-style: none; }
/* Chaque nom de la vue du mois est une cible de 24 px de haut (L08-17) : ils
   faisaient 14 px, empiles les uns sur les autres. */
/* Le nom se coupe, jamais « TP » ni les initiales du logopede : coupes en
   bout de ligne, elles disparaissaient (passe 4). */
.mois-agenda li { display: flex; align-items: baseline; gap: var(--e1); white-space: nowrap;
                  line-height: var(--e6); }
.mois-agenda li .nom-seance { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.mois-agenda li .heure, .mois-agenda li .marque-tp, .mois-agenda li .marque-logo { flex: none; margin-left: 0; }
.mois-agenda li a { color: var(--encre); text-decoration: underline; text-decoration-color: var(--filet-champ);
                     text-underline-offset: 0.1875rem; }
.mois-agenda li a:hover { text-decoration-color: currentColor; }
/* Dans le mois, le tiers payant se dit par « TP », et non par un nom en vert
   a cote de la coche verte de la presence (L06-11). */
.mois-agenda .marque-tp { margin-left: var(--e1); color: var(--metal-texte); font-weight: 500;
                          text-decoration: none; }
.mois-agenda li.presente::before { content: "\2713\00a0"; color: var(--vert); }
.mois-agenda li.absente { text-decoration: line-through; }
.mois-agenda li.absente a { color: var(--encre-douce); }
.mois-agenda li.rendez_vous { color: var(--encre-moyenne); font-style: italic; }
.mois-agenda .heure { font-variant-numeric: tabular-nums; color: var(--encre-douce); }
.mois-cadre { overflow-x: auto; }
.mois-cadre .mois-agenda { min-width: 45rem; }

/* Liste d'attente */
table.disponibilites { width: auto; }
table.disponibilites th, table.disponibilites td { text-align: center; padding: var(--e1) var(--e2); }
table.disponibilites th[scope=row] { text-align: left; }
.sans-coupure { white-space: nowrap; }

/* Recherche dans les fiches, etiquettes */
.recherche-fiches { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2) var(--e3); }
.recherche-fiches label { margin: 0; }
.recherche-fiches input[type=search] { flex: 1 1 17.5rem; width: auto; }
.recherche-fiches #compte-recherche:empty { position: absolute; }
.etiquettes-filtre { flex-basis: 100%; display: flex; flex-wrap: wrap; gap: var(--e1) var(--e2); }
/* L'etiquette posee par le cabinet sur une fiche (« école Les Tilleuls ») :
   la forme d'une pastille, mais la casse saisie, sur le fond du survol. Le
   libelle en petites capitales de l'accueil (« Attendu maintenant ») est un
   .surtitre, plus une etiquette : les deux sens se melangeaient. */
.etiquette {
    display: inline-block;
    margin-left: var(--e1);
    padding: var(--e0) var(--e2);
    border: var(--filet) solid var(--trait);
    border-radius: var(--rayon-rond);
    background: var(--surface-survol);
    color: var(--encre-moyenne);
    font-size: var(--taille-pastille);
    line-height: var(--ligne-pastille);
    font-weight: 500;
    letter-spacing: var(--interlettrage-pastille);
    text-decoration: none;
    white-space: nowrap;
}
/* Dans le filtre, l'etiquette se clique : plus grande, 24 px de haut. */
.etiquettes-filtre .etiquette { margin-left: 0; padding: var(--e0) var(--e3); letter-spacing: inherit;
                                font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
a.etiquette:hover { border-color: var(--encre); color: var(--encre); }
.etiquette.choisie { background: var(--surface-encre); border-color: var(--surface-encre); color: var(--sur-encre); }
.etiquette.choisie .discret { color: var(--metal-clair); }

/* Dossier : chronologie, intervenants */
table.chronologie td:first-child { width: 6rem; white-space: nowrap; }
table.chronologie td:nth-child(2) { width: 6rem; }
.filtres-chronologie { margin-bottom: var(--e3); }
/* La lettre a la largeur d'une ligne lisible (L06-41). */
.lettre .colonnes, .lettre > .champ { max-width: var(--mesure); }

/* --------------------------------------------------------------------------
   Tableau de bord et rapport annuel (criteres 12 et 10, 6 octobre 2026).
   Les graphiques sont des SVG ecrits par app/graphiques.py : leurs couleurs
   viennent d'ici, et chaque barre porte sa valeur en infobulle.
   -------------------------------------------------------------------------- */
/* Sept indicateurs sans trou dans la derniere rangee (L07-29) : une colonne
   sur telephone, deux ensuite, quatre a partir de 1 280 px ; la carte de
   l'annee prend deux places (1 2 3 4 / 5 5 6 7, ou 1 2 / 3 4 / 5 5 / 6 7). */
.indicateurs {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--e4);
    margin-bottom: var(--e4);
}
@media (min-width: 40.0625em) {
    .indicateurs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .indicateurs > .indicateur:nth-child(5):nth-last-child(3) { grid-column: span 2; }
}
@media (min-width: 40.0625em) and (max-width: 79.9375em) {
    /* Cinq indicateurs (rapport de l'annee) : le cinquieme prend la ligne. */
    .indicateurs > .indicateur:nth-child(5):last-child { grid-column: 1 / -1; }
}
@media (min-width: 80em) {
    .indicateurs { grid-template-columns: repeat(4, minmax(0, 1fr)); }
    /* Cinq indicateurs tiennent sur une ligne de cinq. */
    .indicateurs:has(> .indicateur:nth-child(5):last-child) { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
.indicateurs .carte { margin: 0; }
/* Le titre d'un indicateur est un libelle (13 px, 500), pas un surtitre. */
.indicateur h2 { font-size: var(--taille-secondaire); line-height: var(--ligne-surtitre); text-transform: none;
                 letter-spacing: normal; font-feature-settings: normal; color: var(--encre-douce);
                 font-weight: 500; margin: 0 0 var(--e2); }
.indicateur .chiffre { font-family: var(--police-titre); font-size: var(--taille-titre); line-height: var(--ligne-titre);
                       margin: 0 0 var(--e1); font-variant-numeric: tabular-nums; }
/* Un chiffre qui mene a la liste se souligne d'un filet qui se voit (le
   filet des cartes n'y faisait que 1,3 pour 1, L07-29). */
.indicateur .chiffre a { color: inherit; text-decoration: none; border-bottom: var(--filet) solid var(--filet-champ); }
.indicateur .chiffre a:hover { border-bottom-color: var(--encre); }
.indicateur .chiffre .unite { font-family: var(--police); font-size: var(--taille-commande); color: var(--encre-douce); }
.indicateur p { margin: 0 0 var(--e2); }
/* Une comparaison par ligne, a l'interligne du texte secondaire : deux
   interlignes se cotoyaient dans la meme carte (20 et 24 px, L07-29). */
.variation { display: block; font-size: var(--taille-secondaire); line-height: var(--ligne-serree);
             color: var(--encre-douce); }
.variation.hausse { color: var(--vert); }
.variation.baisse { color: var(--rouge); }
.liens-courts { list-style: none; padding: 0; margin: 0; font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
.liens-courts li + li { margin-top: var(--e1); }
.deux-graphiques {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(26.25rem, 100%), 1fr));
    gap: var(--e4);
    margin-bottom: var(--e4);
}
.deux-graphiques .carte { margin: 0; }
/* Un graphique a sa taille dessinee (largeur et hauteur ecrites dans le SVG) :
   il retrecit dans une carte plus etroite, il n'est jamais etire (L07-4). */
.graphique { display: block; max-width: 100%; height: auto; }
/* Sa version couchee, pour un telephone, quand il en a une. */
.graphique-etroit { display: none; }
@media (max-width: 40em) {
    .graphique:has(+ .graphique-etroit) { display: none; }
    .graphique-etroit { display: block; }
}
.graphique .g-axe { stroke: var(--trait); stroke-width: 1; }
.graphique text { font-family: var(--police); font-size: var(--taille-pastille); fill: var(--encre-douce);
                  text-transform: none; letter-spacing: 0; font-variant-numeric: tabular-nums; }
.graphique .g-valeur { fill: var(--encre-moyenne); }
.graphique .serie-1, .pastille-serie.serie-1 { fill: var(--accent); background: var(--accent); }
.graphique .serie-2, .pastille-serie.serie-2 { fill: var(--metal); background: var(--metal); }
/* La carte de chaleur garde sa taille et defile dans sa carte sur un ecran
   etroit : retrecie, ses chiffres ne se liraient plus. */
/* Centree dans sa carte : a gauche, elle laissait la moitie droite vide
   (passe 4). */
.defile-horizontal .graphique.chaleur { max-width: none; margin: 0 auto; }
.graphique .palier-0 { fill: var(--surface-appuyee); }
.graphique .palier-1 { fill: var(--accent-palier-1); }
.graphique .palier-2 { fill: var(--accent-palier-2); }
.graphique .palier-3 { fill: var(--accent-palier-3); }
.graphique .palier-4, .graphique .palier-5 { fill: var(--accent); }
.graphique text.g-case { fill: var(--encre); font-size: var(--taille-pastille); }
.graphique text.g-case.fonce { fill: var(--sur-encre); }
.pastille-serie { display: inline-block; width: 0.625rem; height: 0.625rem;
                  margin: 0 var(--e2) 0 var(--e4); vertical-align: -0.0625rem; }
.pastille-serie:first-child { margin-left: 0; }
.defile-horizontal { overflow-x: auto; }
/* Les jauges du statut social : libelle, barre, pourcentage. */
.statut-social .jauges { display: grid; gap: var(--e2); margin: var(--e3) 0; }
.jauges > .jauge { display: grid; grid-template-columns: minmax(0, 18.75rem) 1fr 3rem; gap: var(--e3);
                   align-items: center; font-size: var(--taille-secondaire); }
.jauges > .jauge .jauge-barre { height: var(--e2); background: var(--surface-appuyee); display: block; }
.jauges > .jauge .jauge-barre span { display: block; height: 100%; background: var(--vert); }
.jauges > .jauge .jauge-valeur { text-align: right; font-variant-numeric: tabular-nums; }
tr.total td { font-weight: 600; border-top: var(--filet) solid var(--filet-fort); }
.bouton.actif { background: var(--surface-encre); color: var(--sur-encre); border-color: var(--surface-encre); }
@media (max-width: 40em) {
    .jauges > .jauge { grid-template-columns: 1fr 3rem; }
    .jauges > .jauge .jauge-libelle { grid-column: 1 / -1; }
}
.onglets { display: flex; gap: var(--e1); flex-wrap: wrap; border-bottom: var(--filet) solid var(--trait); margin: 0 0 var(--e5); }
/* Un onglet est un lien (onglets de la comptabilite) ou un bouton qui filtre
   la page (chronologie) : le meme dessin. */
.onglets a, .onglets button { padding: var(--e2) var(--e4); color: var(--encre-douce); text-decoration: none;
             font-family: inherit; font-size: var(--taille-commande); line-height: var(--ligne-commande);
             font-weight: 500; background: none; border: 0; border-radius: 0; cursor: pointer;
             border-bottom: var(--filet-marque) solid transparent; margin-bottom: -1px; }
.onglets a:hover, .onglets button:hover { color: var(--encre); }
.onglets a.actif, .onglets button.actif { color: var(--encre); border-bottom-color: var(--metal); }
.proposition-lue { background: var(--accent-clair); border: var(--filet) solid var(--trait); padding: var(--e3) var(--e4);
                   margin-bottom: var(--e4); font-size: var(--taille-commande); }
.justificatifs-liste { list-style: none; margin: 0; padding: 0; font-size: var(--taille-secondaire); }
.justificatifs-liste li { display: flex; gap: var(--e2); align-items: center; }
.resultat-estime { font-family: var(--police-titre); font-size: var(--taille-titre); }
/* Plusieurs logopedes : un filet de couleur EN HAUT des blocs de l'horaire.
   Le filet de gauche dit deja « presence pointee » : la couleur du logopede
   ne doit pas le contredire. La legende nomme chaque couleur, et le nom du
   logopede est dans l'infobulle : la couleur ne porte jamais seule l'information. */
.bloc-seance.logo-bleu { box-shadow: inset 0 var(--filet-logopede) 0 var(--logo-bleu); }
.bloc-seance.logo-vert { box-shadow: inset 0 var(--filet-logopede) 0 var(--logo-vert); }
.bloc-seance.logo-ambre { box-shadow: inset 0 var(--filet-logopede) 0 var(--logo-ambre); }
.bloc-seance.logo-rouge { box-shadow: inset 0 var(--filet-logopede) 0 var(--logo-rouge); }
.bloc-seance.logo-violet { box-shadow: inset 0 var(--filet-logopede) 0 var(--logo-violet); }
.bloc-seance.logo-gris { box-shadow: inset 0 var(--filet-logopede) 0 var(--logo-gris); }
.legende .pastille-logo { width: 0.875rem; height: var(--filet-logopede); margin-right: 0; }
.pastille-logo { display: inline-block; width: 0.625rem; height: 0.625rem; margin-right: var(--e2); }
.pastille-logo.logo-bleu { background: var(--logo-bleu); }
.pastille-logo.logo-vert { background: var(--logo-vert); }
.pastille-logo.logo-ambre { background: var(--logo-ambre); }
.pastille-logo.logo-rouge { background: var(--logo-rouge); }
.pastille-logo.logo-violet { background: var(--logo-violet); }
.pastille-logo.logo-gris { background: var(--logo-gris); }
/* Le carre d'un logopede sans couleur : sa place reste, pour que son nom
   commence au meme bord que les autres (L07-22), mais rien ne s'y dessine :
   le carre vide se lisait comme une case a cocher (passe 5). */
.pastille-logo.sans-couleur { background: transparent; box-shadow: none; }
.modifier-logopede[open] { text-align: left; }
.modifier-logopede form { margin-top: var(--e3); }
.roles-prets { margin: 0 0 var(--e3); }
.legende .sans-marque::before, .legende .pastille-logo::before { content: none; display: none; }

/* Liaison chiffree du second poste (critere 13, 06/10/2026). */
.boite-connexion.boite-liaison { max-width: 40rem; }
.empreinte { word-break: break-all; font-size: var(--taille-secondaire); }

/* Mon compte et double authentification (critere 13, 06/10/2026). */
.lien-compte { color: inherit; text-decoration: none; border-bottom: var(--filet) dotted currentColor;
  max-width: 14em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lien-compte:hover, .lien-compte.actif { border-bottom-style: solid; }
.initiales-du-compte { display: none; }
.qr-double-auth { margin: var(--e2) 0 var(--e3); }
.qr-double-auth svg { display: block; }
.champ-code { width: 9em; letter-spacing: var(--interlettrage-capitales); font-variant-numeric: tabular-nums; }
.liste-codes { columns: 2; list-style: none; padding: 0; font-size: var(--taille-courant); font-variant-numeric: tabular-nums; }
.liste-codes li { padding: var(--e0) 0; }
.envoi-brut { max-height: 22rem; overflow: auto; background: var(--fond); padding: var(--e3);
  font-size: var(--taille-secondaire); white-space: pre-wrap; word-break: break-word; }
.liste-sorties li { margin-bottom: var(--e2); }
.registre td { vertical-align: top; }
.suggestions-destinations { list-style: none; padding: 0; margin: 0 0 var(--e3); }
.suggestions-destinations li { padding: var(--e0) 0; }
.resultats-verification { list-style: none; }

/* Aide (critere 21, 06/10/2026). */
.lien-aide { display: inline-flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem;
  border-radius: var(--rayon-rond); border: var(--filet) solid currentColor; color: inherit; text-decoration: none;
  font-weight: 500; font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
.lien-aide:hover, .lien-aide.actif { background: var(--encre-douce); color: var(--sur-encre); }
/* La loupe de la recherche globale, a cote de l'aide, du meme dessin. */
.lien-recherche { display: inline-flex; align-items: center; justify-content: center; width: 1.5rem;
  height: 1.5rem; border-radius: var(--rayon-rond); border: var(--filet) solid currentColor;
  color: inherit; text-decoration: none; }
.lien-recherche:hover, .lien-recherche.actif { background: var(--encre-douce); color: var(--sur-encre); }

/* La recherche globale (L09-M1) : une fenetre posee en haut de l'ecran, au-dessus
   d'un voile, comme la visite guidee. */
.recherche-globale {
    width: min(40rem, calc(100vw - 2 * var(--gouttiere)));
    max-height: calc(100vh - 2 * var(--e10));
    margin: var(--e10) auto auto;
    padding: var(--e5) var(--e6);
    border: var(--filet) solid var(--encre);
    border-radius: var(--rayon);
    background: var(--carte);
    color: var(--encre);
    box-shadow: var(--ombre-flottante);
}
.recherche-globale::backdrop { background: var(--voile); }
.recherche-globale label { display: block; margin-bottom: var(--e2); }
.recherche-globale input[type=search] { width: 100%; }
.recherche-resultats { margin-top: var(--e3); }
.recherche-resultats .surtitre { display: block; margin: var(--e3) 0 var(--e1); }
.recherche-resultat {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0 var(--e3);
    padding: var(--e2) var(--e3);
    color: var(--encre);
    text-decoration: none;
    border-radius: var(--rayon-commande);
}
.recherche-resultat:hover, .recherche-resultat[aria-selected="true"] { background: var(--surface-survol); }
.recherche-resultat[aria-selected="true"] { box-shadow: inset var(--filet-marque) 0 0 var(--encre); }
.recherche-aide { margin: var(--e4) 0 0; }
.guides { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(21.25rem, 100%), 1fr)); gap: var(--e3); }
.guide ol { padding-left: var(--e5); }
.guide li { margin-bottom: var(--e2); }
.question > summary { padding: var(--e1) 0; font-weight: 500; }
#recherche-aide { min-width: 18rem; }
/* La langue de l'ecran se voit : en encre et en 600, sans soulignement.
   L'attribut lang de la page suit la langue (traduction.py). */
.choix-langue { text-align: right; font-size: var(--taille-secondaire); line-height: var(--ligne-serree); margin: 0 0 var(--e2); }
.choix-langue a { color: inherit; }
html[lang="fr"] .choix-langue a[lang="fr"],
html[lang="nl"] .choix-langue a[lang="nl"] { color: var(--encre); font-weight: 600; text-decoration: none; }
.bandeau-essai { background: var(--vert-clair); border-bottom: var(--filet) solid var(--vert-filet);
                 padding: var(--e2) var(--marge-colonne); font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }

/* Premiers pas, visite guidee, avis de nouvelle version (criteres 23 et 24, 06/10/2026). */
.bandeau-version { background: var(--accent-clair); color: var(--accent); border-bottom: var(--filet) solid var(--trait);
  padding: var(--e2) var(--marge-colonne); font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
.barre-avancement { height: var(--e2); background: var(--surface-appuyee); border-radius: var(--rayon-rond);
  overflow: hidden; margin: var(--e2) 0 var(--e4); }
.barre-avancement span { display: block; height: 100%; background: var(--vert); }
.premiers-pas-accueil { margin-bottom: var(--e5); }
.premiers-pas-accueil h2 { margin-bottom: 0; }
.prochaines-etapes { list-style: none; padding: 0; margin: 0; }
.prochaines-etapes li { padding: var(--e1) 0; }
.prochaines-etapes li a { margin-right: var(--e2); }
.etapes-premiers-pas { list-style: none; padding: 0; margin: 0 0 var(--e5); display: grid; gap: var(--e3);
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 23.75rem), 1fr)); }
.etape-premiers-pas h2 { margin-bottom: var(--e2); }
.etape-premiers-pas.fait, .etape-premiers-pas.sans_objet { background: var(--fond); }
.etape-premiers-pas.sans_objet h2, .etape-premiers-pas.sans_objet p { color: var(--encre-douce); }
/* Le premier jour et les listes vides : une phrase, puis le geste qui suit
   (L01-10, L01-31, 15/10/2026). */
.vide .rangee { justify-content: center; margin: var(--e4) auto 0; }
.vide > p { margin: 0 auto var(--e2); }
.pour-commencer h2 { margin-bottom: var(--e3); }
/* La cle de recuperation (_cle_recuperation.html) : un groupe de quatre ne se
   coupe jamais, la ligne passe apres un tiret (L01-28). */
.cle-recuperation { font-size: var(--taille-titre); font-weight: 500;
  font-variant-numeric: tabular-nums; letter-spacing: 0.12em; line-height: 1.6; background: var(--carte); color: var(--encre);
  border: 2px solid var(--encre); padding: var(--e4) var(--e5); margin: var(--e4) 0; text-align: center; }
.cle-recuperation span { white-space: nowrap; }
.verifier-cle .champ-code { width: 9em; max-width: 100%; text-transform: uppercase; }
.visite { position: fixed; inset: 0; z-index: 1000; pointer-events: none; }
.visite-voile { position: fixed; inset: 0; background: var(--voile); pointer-events: auto; }
.visite-halo { position: fixed; border-radius: var(--rayon-commande); pointer-events: none;
  outline: var(--filet-marque) solid var(--carte); box-shadow: 0 0 0 100vmax var(--voile);
  transition: left var(--entree) var(--courbe), top var(--entree) var(--courbe),
              width var(--entree) var(--courbe), height var(--entree) var(--courbe); }
.visite-bulle { position: fixed; width: min(27.5rem, calc(100vw - var(--e7))); background: var(--carte);
  border: var(--filet) solid var(--filet-fort); box-shadow: var(--ombre-flottante); padding: var(--e4) var(--e5);
  pointer-events: auto; }
.visite-bulle h2 { margin: 0 0 var(--e2); }
.visite-bulle .visite-compte { margin: 0 0 var(--e1); }
.visite-bulle .visite-texte { margin: 0 0 var(--e4); }
.visite-boutons { display: flex; align-items: center; gap: var(--e2); }
.visite-espace { flex: 1 1 auto; }
.visite-passer { background: none; border: none; padding: 0; font-family: inherit; font-size: var(--taille-secondaire);
  color: var(--encre-douce); text-decoration: underline; text-underline-offset: 0.1875rem; cursor: pointer; }
.visite-passer:hover { color: var(--encre); }
.visite [hidden] { display: none; }

/* Tour de simplicite (6 octobre 2026) : sommaire de la fiche patient, barre
   des modifications pas encore enregistrees. */
.sommaire {
    position: sticky; top: calc(var(--hauteur-entete, 90px) - var(--e4)); z-index: 5;
    display: flex; flex-wrap: wrap; gap: var(--e0) var(--e4);
    background: var(--fond); padding: var(--e2) 0; margin: 0 0 var(--e4);
    border-bottom: var(--filet) solid var(--trait); font-size: var(--taille-secondaire); line-height: var(--ligne-serree);
}
.sommaire a { color: var(--encre-douce); text-decoration: none; padding: var(--e0) 0; }
.sommaire a:hover { color: var(--encre); text-decoration: underline; text-underline-offset: 0.1875rem; }
/* La partie qu'on lit se voit dans le sommaire (L06-45) : en encre, sur un
   filet de metal, comme la page ouverte dans le menu. */
.sommaire a.actif { color: var(--encre); box-shadow: inset 0 calc(-1 * var(--filet-marque)) 0 var(--metal); }
/* Trop large, il defile : un fondu dit qu'il en reste, comme pour le menu. */
.sommaire.deborde { -webkit-mask-image: linear-gradient(to right, var(--encre) calc(100% - var(--e8)), transparent);
                    mask-image: linear-gradient(to right, var(--encre) calc(100% - var(--e8)), transparent); }
.sommaire.deborde.au-bout { -webkit-mask-image: none; mask-image: none; }
/* Une page de reglages (L07-32) : une colonne de lecture, et le sommaire colle
   a sa droite, en liste, la partie lue sur un filet de metal. Sous 900 px, le
   sommaire repasse en haut, sur une ligne qui defile. */
@media (min-width: 56.25em) {
    .avec-sommaire { display: grid; grid-template-columns: minmax(0, 1fr) 12.5rem; gap: var(--e7);
                     align-items: start; }
    .avec-sommaire > .colonne-sommaire { grid-row: 1; grid-column: 1; min-width: 0; }
    .avec-sommaire > .sommaire { grid-row: 1; grid-column: 2; top: var(--hauteur-entete, 90px);
                                 flex-direction: column; flex-wrap: nowrap; gap: 0; margin: 0; padding: 0;
                                 background: none; border-bottom: 0; border-left: var(--filet) solid var(--trait); }
    .avec-sommaire > .sommaire a { padding: var(--e1) 0 var(--e1) var(--e4); margin-left: calc(-1 * var(--filet));
                                   border-left: var(--filet-marque) solid transparent; }
    .avec-sommaire > .sommaire a.actif { box-shadow: none; border-left-color: var(--metal); }
}
/* « Ouvrir → » sur une carte qui mene a une autre page. */
.ouvrir { flex: none; color: var(--encre-douce); font-size: var(--taille-commande); line-height: var(--ligne-commande);
          font-weight: 500; }
.carte-lien:hover .ouvrir { color: var(--encre); }
/* Les modeles de courrier d'une fiche, sous le titre de leur carte. */
.modeles-courrier { margin-bottom: var(--e4); }
/* Etroit : le sommaire tient sur une ligne qui defile de cote, pour ne pas
   empiler trois lignes collees sous l'en-tete. */
@media (max-width: 56.25em) {
    .sommaire { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; white-space: nowrap; }
    .sommaire::-webkit-scrollbar { display: none; }
}
/* Les cinq onglets de la fiche patient (passe 4) : au telephone, ils
   remplissent la ligne et tiennent tous a l'ecran, jusqu'a 320 px. */
@media (max-width: 40em) {
    .sommaire.onglets-fiche { justify-content: space-between; column-gap: var(--e2); }
}
/* A 400 % de zoom (320 x 256), le sommaire colle laissait 77 px a la fiche
   (L08-4) : a petite hauteur, il defile avec la page, comme l'en-tete. */
@media (max-height: 31.25em) {
    .sommaire { position: static; }
}
.barre-modifs {
    position: fixed; left: 0; right: 0; bottom: var(--e5); z-index: 20;
    width: max-content; margin: 0 auto;
    display: flex; align-items: center; gap: var(--e4);
    background: var(--carte); border: var(--filet) solid var(--trait); border-radius: var(--rayon-commande);
    box-shadow: var(--ombre-flottante); padding: var(--e3) var(--e3) var(--e3) var(--e5);
    font-size: var(--taille-commande); max-width: calc(100vw - var(--e7));
}
.barre-modifs[hidden] { display: none; }

/* Page de reference de la charte (/reglages/charte, 15 octobre 2026) : le
   nuancier et les mesures de l'echelle. Le reste de la page n'emploie que
   les composants ci-dessus. */
.charte-nuancier { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(15rem, 100%), 1fr));
                   gap: var(--e3) var(--e4); }
.charte-nuance { display: grid; grid-template-columns: var(--e8) minmax(0, 1fr); column-gap: var(--e3);
                 align-items: center; font-size: var(--taille-secondaire); line-height: var(--ligne-serree); }
.charte-nuance .discret { grid-column: 2; }
.charte-echantillon { grid-row: span 2; width: var(--e8); height: var(--e8);
                      border: var(--filet) solid var(--trait); border-radius: var(--rayon-commande); }
.charte-mesure { display: flex; align-items: center; gap: var(--e3); margin-bottom: var(--e2);
                 font-size: var(--taille-secondaire); }
.charte-barre { flex: none; height: var(--e2); background: var(--encre); }
.carte-etroite-charte { max-width: 16rem; }
code { font-family: inherit; font-size: inherit; font-weight: 500; overflow-wrap: anywhere; }

/* --------------------------------------------------------------------------
   Telephone, tablette et domicile (lot v2-01, 15 octobre 2026)

   En fin de feuille : ces regles retouchent des composants definis plus haut,
   et doivent passer apres eux.
   -------------------------------------------------------------------------- */

/* En bref, en haut de la fiche (L04-6) : ce qu'on cherche entre deux
   rendez-vous, en lecture, avec le numero et l'adresse a toucher. */
.resume { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(15em, 100%), 1fr));
          gap: var(--e3) var(--e6); margin: 0; }
.resume dt { font-size: var(--taille-secondaire); line-height: var(--ligne-serree); color: var(--encre-douce); }
.resume dd { margin: 0; overflow-wrap: anywhere; }
/* Le compteur d'accord (« 10 séances sur 288, jusqu'au 27/02/2028 ») passe a
   la ligne dans sa colonne : sans retour, il touchait la colonne voisine a
   1 440 px (passe 5). Chaque morceau reste entier. */
.resume dd.compteur { white-space: normal; }
.resume dd.compteur .morceau { white-space: nowrap; }

/* Les parties de la saisie de la fiche (`details.partie-fiche`) : ouvertes,
   leur titre est la legende du fieldset ; sur telephone, elles se replient
   et leur titre se touche (L04-6). Repliee, une partie montre toujours son
   titre, a toutes les largeurs. */
details.partie-fiche > summary {
    display: none;
    align-items: center;
    min-height: var(--cible-tactile);
    margin: 0 0 var(--e2);
    padding: 0 var(--marge-carte);
    background: var(--carte);
    border: var(--filet) solid var(--trait);
    font-size: var(--taille-surtitre);
    line-height: var(--ligne-surtitre);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--interlettrage-capitales);
    font-feature-settings: "case" 1;
    color: var(--encre-douce);
}
details.partie-fiche:not([open]) > summary { display: flex; }

/* Un lien pose seul sur sa ligne, sous un autre (nom et numero de la liste
   d'attente) : 24 px de haut au moins, 44 px au doigt (plus bas). */
.cible { display: inline-block; padding: var(--e1) 0; }

/* La case d'une disponibilite (liste d'attente) et son moment, ecrit seulement
   sur telephone : toute la cellule se touche. */
table.disponibilites .case-dispo { display: inline-flex; align-items: center; gap: var(--e2); margin: 0;
                                   cursor: pointer; }

/* Sous 1 280 px, noter l'envoi d'un document (date, moyen, deux boutons)
   passe a la ligne dans sa cellule : la carte des documents defilait de
   220 px a 1 024 px en neerlandais. */
@media (max-width: 79.9375em) {
    td .rangee.envoi-document { flex-wrap: wrap; }
}

/* La periode d'une navigation (« ← 12 – 18 octobre 2026 → ») ne se separe
   jamais de ses fleches (L04-24). */
.navigation-mois .periode { display: inline-flex; align-items: center; gap: var(--e3); flex-wrap: nowrap; }

/* L'horaire au doigt (L04-8). Le titre d'un jour dit qu'il mene a la journee
   ou l'on pointe et note : au survol sur ordinateur, ecrit dessous au doigt. */
.calendrier .titre-jour .pointer-noter { display: none; }
/* Une consigne pour la souris, une pour le doigt : chacune a son ecran. */
.au-doigt { display: none; }
.jours-telephone { display: none; }

/* La feuille d'actions d'une seance, au doigt. */
.feuille-actions {
    position: fixed;
    z-index: 20;
    left: 0;
    right: 0;
    bottom: var(--e4);
    width: min(var(--largeur-feuille), calc(100vw - var(--e4)));
    margin: 0 auto;
    padding: var(--e4);
    background: var(--carte);
    border: var(--filet) solid var(--encre);
    box-shadow: var(--ombre-flottante);
}
.feuille-actions[hidden], .feuille-actions [hidden] { display: none; }
.feuille-actions .feuille-titre { margin: 0 0 var(--e3); font-weight: 600; }
.feuille-actions .feuille-boutons { display: grid; gap: var(--e2); }
.feuille-actions .feuille-boutons > .bouton, .feuille-actions .feuille-fermer { width: 100%; }
.feuille-actions .feuille-heure { flex-wrap: nowrap; gap: var(--e2); }
.feuille-actions .feuille-heure input { flex: 1 1 auto; min-width: 0; width: auto; }
.feuille-actions .feuille-heure .bouton { flex: none; }
.feuille-actions .discret { margin: var(--e3) 0; }
/* Le bloc qu'on vient d'armer d'un appui long : il se souleve. */
.bloc-seance.en-prise { border-color: var(--encre); box-shadow: var(--ombre-glisse); }

/* Vue du mois : le nom du jour ne s'ecrit que dans la liste. */
.mois-agenda .jour-nom { display: none; }

/* Sous 900 px et au doigt, la vue du mois est une liste par jour (L04-21) :
   le jour en titre, chaque seance sur une ligne de 44 px, heure et nom
   entier. Les jours sans seance s'effacent, sauf aujourd'hui. */
@media (max-width: 56.25em), (pointer: coarse) {
    .mois-cadre .mois-agenda { min-width: 0; }
    .mois-agenda, .mois-agenda tbody, .mois-agenda tr, .mois-agenda td { display: block; }
    .mois-agenda thead { display: none; }
    .mois-agenda td {
        height: auto;
        padding: var(--e2) 0;
        border: 0;
        border-bottom: var(--filet) solid var(--trait);
        font-size: var(--taille-courant);
        line-height: var(--ligne-serree);
    }
    .mois-agenda td.hors-mois, .mois-agenda td.sans-seance:not(.aujourdhui) { display: none; }
    .mois-agenda td.aujourdhui { outline: 0; background: var(--surface-choisie); }
    .mois-agenda .numero { align-items: center; }
    .mois-agenda .numero a { display: inline-flex; align-items: center; justify-content: center;
                             gap: var(--e1); min-height: var(--cible-tactile); min-width: var(--cible-tactile); }
    .mois-agenda .jour-nom { display: inline; text-transform: capitalize; }
    .mois-agenda li { display: flex; align-items: center; gap: var(--e3); min-height: var(--cible-tactile);
                      white-space: normal; }
    .mois-agenda li a { flex: 1 1 auto; display: flex; align-items: center; min-height: var(--cible-tactile); }
    .mois-agenda li .nom-seance { display: flex; white-space: normal; }
}

/* Le libelle d'une cellule, ecrit devant sa valeur quand le tableau
   s'empile (l'en-tete de colonne n'est plus la). */
.libelle-empile { display: none; }

/* Tableau empile (`table.empile`) : sous 900 px, chaque ligne devient un bloc,
   son titre (`td.titre-empile`) en premier sur toute la largeur, les autres
   valeurs a la suite avec leur libelle, l'action (`td.pleine`) dessous. Les
   dernieres colonnes, actions comprises, etaient coupees par le bord de la
   carte (liste d'attente, patients, documents de la fiche : L04-20). */
@media (max-width: 56.25em) {
    table.empile, table.empile tbody, table.empile td { display: block; }
    table.empile thead { display: none; }
    table.empile tr {
        display: flex;
        flex-wrap: wrap;
        align-items: baseline;
        gap: var(--e1) var(--e4);
        padding: var(--e3) 0;
        border-bottom: var(--filet) solid var(--trait);
    }
    table.empile tr:last-child { border-bottom: 0; }
    /* Dans une carte, le tableau deborde de 12 px de chaque cote (L06-28) :
       la ligne empilee reprend cette marge, son texte reste au bord des titres. */
    .carte table.empile tr { padding-left: var(--e3); padding-right: var(--e3); }
    /* Une liste de choix ne depasse pas la ligne : « Lieu » de la seance a des
       libelles plus longs qu'un telephone n'est large. */
    table.empile td { min-width: 0; max-width: 100%; }
    table.empile td select { max-width: 100%; }
    table.empile td { padding: 0; border: 0; text-align: left; white-space: normal; }
    table.empile td:empty { display: none; }
    table.empile td.titre-empile { order: -1; flex: 1 1 100%; }
    table.empile td.pleine { flex: 1 1 100%; }
    table.empile td .rangee { flex-wrap: wrap; justify-content: flex-start; }
    table.empile tbody tr:hover td { background: transparent; }
    table.empile tbody tr[data-lien]:hover { background: var(--surface-survol); }
    /* Une ecriture empilee se lit libelle et valeur sur la meme ligne. */
    table.empile .ligne-modifiable:not(.ouverte) .en-lecture { display: inline; }
    /* Impayes empiles : le mode et « Encaisser » sur une ligne, « Rappel »
       dessous (trois lignes de boutons sinon). */
    table.liste-impayes td.pleine form.rangee { flex: 1 1 100%; flex-wrap: nowrap; }
    table.liste-impayes td.pleine form.rangee select { flex: 1 1 auto; min-width: 0; width: auto; }
    /* Prochaine seance empilee : le libelle (« Lieu », « Logopède ») au-dessus,
       la liste et « Changer » cote a cote dessous si la liste y tient en
       entier (sa largeur propre, « Comme prévu (nom) » compris) ; sinon
       « Changer » passe a la ligne. */
    table.empile .choix-de-seance .libelle-empile { flex: 1 1 100%; margin: 0; }
    table.empile .choix-de-seance select { flex: 0 1 auto; min-width: 0; }
    table.empile .libelle-empile, table.journee .libelle-empile {
        display: inline;
        font-family: var(--police);
        margin-right: var(--e1);
        color: var(--encre-douce);
        font-size: var(--taille-secondaire);
    }
}

/* Un tableau large dans une carte pleine largeur (impayes, depenses : 1 057 et
   994 px dans 950 a 1 000 px d'ecran, L07-18) s'empile des 70em : les memes
   regles que `table.empile`, pour `table.empile-tot`. */
@media (min-width: 56.26em) and (max-width: 70em) {
    table.empile-tot, table.empile-tot tbody, table.empile-tot td { display: block; }
    table.empile-tot thead { display: none; }
    table.empile-tot tr {
        display: flex;
        flex-wrap: wrap;
        align-items: baseline;
        gap: var(--e1) var(--e4);
        padding: var(--e3) 0;
        border-bottom: var(--filet) solid var(--trait);
    }
    table.empile-tot tr:last-child { border-bottom: 0; }
    .carte table.empile-tot tr { padding-left: var(--e3); padding-right: var(--e3); }
    table.empile-tot td { min-width: 0; max-width: 100%; }
    table.empile-tot td select { max-width: 100%; }
    table.empile-tot td { padding: 0; border: 0; text-align: left; white-space: normal; }
    table.empile-tot td:empty { display: none; }
    table.empile-tot td.titre-empile { order: -1; flex: 1 1 100%; }
    table.empile-tot td.pleine { flex: 1 1 100%; }
    table.empile-tot td .rangee { flex-wrap: wrap; justify-content: flex-start; }
    table.empile-tot tbody tr:hover td { background: transparent; }
    table.empile-tot tbody tr[data-lien]:hover { background: var(--surface-survol); }
    table.liste-impayes td form.rangee { flex-wrap: nowrap; }
    /* De 900 a 1 120 px, le libelle devant la liste, sur une largeur commune :
       les listes du lieu et du logopede s'alignent. */
    table.empile-tot .choix-de-seance .libelle-empile { flex: 0 0 6rem; margin: 0; }
    table.empile-tot .choix-de-seance select { flex: 0 1 auto; min-width: 0; }
    table.empile-tot .libelle-empile {
        display: inline;
        font-family: var(--police);
        margin-right: var(--e1);
        color: var(--encre-douce);
        font-size: var(--taille-secondaire);
    }
}

@media (max-width: 56.25em) {
    /* Toute la journee, a l'accueil : une seance par bloc, l'heure, le nom et
       le statut sur une ligne, l'arrivee et le montant dessous, Present et
       Absent sur toute la largeur, puis la note. Le tableau faisait 649 px
       dans 356 : Present et Absent etaient hors de l'ecran (L04-3), et encore
       14 px de trop sur une tablette en portrait. */
    table.journee, table.journee tbody { display: block; }
    table.journee thead { display: none; }
    table.journee tr {
        display: grid;
        /* L'heure a une colonne de largeur fixe : chaque ligne est sa propre
           grille, et les noms se decalaient selon les chiffres (passe 4). */
        grid-template-columns: 3.5rem minmax(0, 1fr) auto;
        align-items: center;
        gap: var(--e1) var(--e3);
        padding: var(--e3) 0;
        border-top: var(--filet) solid var(--trait);
    }
    table.journee tr:first-child { border-top: 0; }
    table.journee td { display: block; padding: 0; border: 0; }
    table.journee td:nth-child(4) { grid-column: 1 / 3; }
    /* « Arrivée — » sur chaque seance a venir ne disait rien : la case reste,
       vide, et le montant garde sa place a droite (passe 5). */
    table.journee td.sans-arrivee { visibility: hidden; }
    table.journee td:nth-child(5) { grid-column: 3; text-align: right; }
    table.journee td:nth-child(6) { grid-column: 1 / -1; }
    table.journee td .rangee .bouton { flex: 1 1 0; }
    table.journee td > .bouton { width: 100%; }
    table.journee tr.ligne-note { display: block; padding: 0 0 var(--e3); border-top: 0; }
    table.journee tr.ligne-note td { padding: 0; }
    table.journee tbody tr:hover td { background: transparent; }
}

@media (max-width: 40em) {
    /* La barre des modifications se pose au-dessus de la barre d'onglets. */
    .barre-modifs { bottom: calc(var(--hauteur-onglets) + var(--e3)); }
    .cache-au-telephone { display: none; }
    /* Les onglets (comptabilite) defilent sur une ligne, comme le sommaire de
       la fiche : « Année et comptable » partait seul a la ligne (passe 4). */
    .onglets { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
    .onglets::-webkit-scrollbar { display: none; }
    .onglets a, .onglets button { flex: 0 0 auto; white-space: nowrap; }
    /* Sur telephone, le titre d'une partie de la fiche est toujours la : il
       la replie et la deplie ; la legende, qui dit la meme chose, ne reste
       que pour le lecteur d'ecran. */
    details.partie-fiche > summary { display: flex; }
    details.partie-fiche[open] > summary { margin-bottom: 0; border-bottom: 0; }
    details.partie-fiche > fieldset > legend {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
        white-space: nowrap;
    }
    details.partie-fiche > fieldset > legend + * { clear: none; }
    /* La periode garde ses fleches aux deux bouts ; trop longue, elle passe
       sur deux lignes entre elles. */
    .navigation-mois .periode { flex: 1 1 100%; justify-content: space-between; }
    .navigation-mois .periode h2 { min-width: 0; white-space: normal; text-align: center; }
    /* L'horaire sur telephone : un jour a la fois, choisi par les onglets,
       aujourd'hui d'abord (L04-8). */
    .jours-telephone {
        display: grid;
        /* Sept onglets sur une ligne des 375 px ; a 320 px, le samedi et le
           dimanche passent dessous plutot que de tomber sous 36 px. */
        grid-template-columns: repeat(auto-fit, minmax(calc(var(--cible-tactile) - var(--e2)), 1fr));
        gap: var(--e2);
        margin: 0 0 var(--e3);
    }
    .jour-onglet {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        min-height: var(--hauteur-commande-grande);
        padding: var(--e1) 0;
        border: var(--filet) solid var(--filet-champ);
        border-radius: var(--rayon-commande);
        background: var(--carte);
        color: var(--encre);
        font-family: inherit;
        cursor: pointer;
    }
    .jour-onglet .jour-court { font-size: var(--taille-secondaire); line-height: var(--ligne-serree);
                               color: var(--encre-douce); }
    .jour-onglet .jour-numero { font-size: var(--taille-intertitre); line-height: var(--ligne-courant);
                                font-weight: 600; font-variant-numeric: tabular-nums; }
    .jour-onglet.aujourdhui { box-shadow: inset 0 calc(-1 * var(--filet-marque)) 0 var(--metal); }
    .jour-onglet.ferme .jour-numero { font-weight: 400; color: var(--encre-douce); }
    .jour-onglet.vu { background: var(--surface-encre); border-color: var(--surface-encre); color: var(--sur-encre); }
    .jour-onglet.vu .jour-court, .jour-onglet.vu .jour-numero { color: var(--sur-encre); }
    .calendrier { grid-template-columns: var(--largeur-heures) minmax(0, 1fr); min-width: 0; }
    .calendrier .titre-jour:not(.vu), .calendrier .colonne-jour:not(.vu) { display: none; }
    .defilement-heures { display: none; }
    /* Un seul defilement au telephone, celui de la page : la grille du jour
       defilait dans son cadre, dans la page qui defile (passe 4). */
    .calendrier-cadre { overflow: visible; }
    .calendrier .titre-jour, .calendrier .titre-heures { position: static; }
    .feuille-actions { bottom: calc(var(--hauteur-onglets) + var(--e2)); }
    /* Les disponibilites sur telephone : un jour par bloc, ses quatre moments
       en deux colonnes, chacun ecrit a cote de sa case. */
    table.disponibilites, table.disponibilites tbody { display: block; width: 100%; }
    table.disponibilites thead { display: none; }
    table.disponibilites tr {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 0 var(--e3);
        padding: var(--e2) 0;
        border-bottom: var(--filet) solid var(--trait);
    }
    table.disponibilites th[scope=row] { grid-column: 1 / -1; padding: var(--e1) 0; border: 0; }
    table.disponibilites td { display: block; padding: 0; border: 0; text-align: left; }
    table.disponibilites td .case-dispo { display: flex; justify-content: flex-start;
                                          min-height: var(--cible-tactile); font-size: var(--taille-courant);
                                          font-weight: 400; color: var(--encre); }
    table.disponibilites .libelle-empile { display: inline; }
    /* Le titre d'une zone de depot compacte passe a la ligne plutot que de
       pousser sa carte (« Bestanden kiezen of hierheen slepen »). */
    .zone-depot.compacte .titre-depot { white-space: normal; }
    /* Comptabilite : les totaux et l'ajout d'une ecriture l'un sous l'autre ;
       cote a cote, chacun faisait 134 px de large a 320 px. */
    .grille.deux.compta > div:not(.carte) { grid-template-columns: minmax(0, 1fr); }
}

/* ---------------------------------------------------------------- au doigt */
/* Telephone et tablette (pointeur grossier) : chaque cible fait 44 px, la
   case a cocher 24 px, et le texte des champs 16 px, sous lequel Safari sur
   iPhone agrandit la page a chaque champ touche (L04-10, L04-11). Les
   commandes gardent leur dessin ; seules leurs mesures changent. */
@media (pointer: coarse) {
    :root {
        --hauteur-commande: var(--cible-tactile);
        --hauteur-commande-petite: var(--cible-tactile);
        --cote-case: var(--cote-case-tactile);
    }
    input, select, textarea { --taille-courant: 1rem; }
    .case { min-height: var(--cible-tactile); align-items: center; }
    .case input { margin-top: 0; }
    /* La case d'une disponibilite : sa cellule entiere, 44 px de cote. */
    table.disponibilites .case-dispo { min-width: var(--cible-tactile); min-height: var(--cible-tactile);
                                       justify-content: center; }
    /* La loupe aussi : 24 px a cote d'un « ? » de 44 px (passe 4). */
    .lien-aide, .lien-recherche { width: var(--cible-tactile); height: var(--cible-tactile); }
    /* Les liens de l'en-tete et du sommaire : 44 px de haut, le pointille
       reste sous le mot. */
    .lien-reglages, .lien-compte, .identite .quitter {
        display: inline-block;
        line-height: var(--cible-tactile);
        border-bottom: 0;
        text-decoration: underline dotted;
        text-underline-offset: var(--e1);
    }
    .sommaire a { display: inline-flex; align-items: center; min-height: var(--cible-tactile); }
    .onglets a, .etiquettes-filtre .etiquette { display: inline-flex; align-items: center;
                                                min-height: var(--cible-tactile); }
    /* En flex, l'espace entre le libelle et son nombre disparaissait :
       « mercredi5 » (passe 4). */
    .etiquettes-filtre .etiquette { gap: var(--e2); }
    details.repli > summary, .question > summary { padding: var(--e3) 0; }
    .note > summary { min-height: var(--cible-tactile); align-items: center; }
    .materiel-groupe .case { margin-bottom: 0; }
    /* L'horaire : une demi-heure fait 44 px, un bloc de 30 minutes est une
       cible entiere. Le bloc ne fait qu'une chose, ouvrir sa feuille
       d'actions : l'heure et la croix ne se visent plus a part (L04-8). Le
       titre du jour se touche sur toute sa hauteur et dit ce qu'il ouvre. */
    .calendrier { --heure-hauteur: calc(2 * var(--cible-tactile)); }
    .bloc-seance.deplacable { -webkit-touch-callout: none; -webkit-user-select: none; user-select: none; }
    .bloc-seance.deplacable .quand { pointer-events: none; }
    .bloc-seance .menu-bloc { opacity: 0; pointer-events: none; }
    .bloc-seance .menu-bloc:focus-visible { opacity: 1; }
    .calendrier .titre-jour { padding: 0; }
    .calendrier .titre-jour a { display: flex; flex-direction: column; justify-content: center;
                                min-height: var(--cible-tactile); padding: var(--e1); }
    .calendrier .titre-jour .pointer-noter { display: block; font-size: var(--taille-pastille);
                                             line-height: var(--ligne-pastille); font-weight: 400;
                                             text-transform: none; letter-spacing: normal;
                                             font-feature-settings: normal; }
    /* La question au lacher, au doigt : « Ne rien changer » d'abord (L04-7). */
    .choix-agenda [data-choix="annuler"] { order: -1; }
    .au-doigt { display: block; }
    .a-la-souris { display: none; }
    /* Un lien pose seul sur sa ligne (nom et numero de la liste d'attente). */
    .cible, .resume a { display: inline-flex; align-items: center; min-height: var(--cible-tactile); }
    /* Les lignes cliquables d'un message et les prochaines etapes : 44 px. */
    .message .ligne-lien { min-height: var(--cible-tactile); padding: var(--e2) 0; }
    .prochaines-etapes li { padding: var(--e3) 0; }
    /* Un champ `.mono` prend la police de ses voisins : au doigt, 16 px. */
    input.mono, textarea.mono { font-size: var(--taille-courant); }
}
/* Cabinet a plusieurs logopedes (lot v2-09, 15 octobre 2026). */
/* Reglages, Logopedes : un bouton « Modifier » de meme largeur au bout de
   chaque ligne, la fiche s'ouvre en dessous (L02-32). */
.tableau-logopedes .actions-ligne { width: 1%; white-space: nowrap; text-align: right; }
.tableau-logopedes .bouton-modifier { min-width: 6.5rem; padding: 0 var(--e3); }
.tableau-logopedes .reglage-logopede > td { text-align: left; }
/* A l'etroit, le nom et le bouton : le reste se lit dans la fiche ouverte. */
@media (max-width: 40rem) {
    .tableau-logopedes th:nth-child(n+2):nth-child(-n+5),
    .tableau-logopedes tr:not(.reglage-logopede) > td:nth-child(n+2):nth-child(-n+5) { display: none; }
}
/* Un logopede sans couleur a une pastille vide, dans la legende de l'horaire
   comme a l'accueil (L02-25) : la regle de la charte, plus haut (L07-22). */
/* Accueil, tout le cabinet : le logopede de chaque seance (L02-13). */
.logopede-ligne { font-size: var(--taille-secondaire); color: var(--encre-douce); white-space: nowrap; }
.autres-courantes ul { list-style: none; margin: 0; padding: 0; }
.autres-courantes li { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e1) var(--e3);
                       padding: var(--e2) 0; border-top: var(--filet) solid var(--trait); }
.autres-courantes li:first-child { border-top: 0; }
/* Vue du mois, tout le cabinet : un filet a gauche de la couleur du
   logopede, nomme dans la legende (L02-18). */
.mois-agenda li[class*="logo-"] { padding-left: var(--e1); }
.mois-agenda li.logo-bleu { box-shadow: inset 3px 0 0 var(--logo-bleu); }
.mois-agenda li.logo-vert { box-shadow: inset 3px 0 0 var(--logo-vert); }
.mois-agenda li.logo-ambre { box-shadow: inset 3px 0 0 var(--logo-ambre); }
.mois-agenda li.logo-rouge { box-shadow: inset 3px 0 0 var(--logo-rouge); }
.mois-agenda li.logo-violet { box-shadow: inset 3px 0 0 var(--logo-violet); }
.mois-agenda li.logo-gris { box-shadow: inset 3px 0 0 var(--logo-gris); }
/* Liste d'attente : les moments libres de chaque logopede (L02-16). */
.libres-logopede { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e1); margin-bottom: var(--e2); }
.libres-logopede > .discret { flex-basis: 100%; }
/* Le filtre Logopede en tete d'une page : sous le titre a l'etroit, il ne
   colle pas a la carte qui suit (L02-13, L02-14). */
.entre-deux > .choix-logopede { margin-bottom: var(--e3); }
/* La liste du logopede et son bouton « Afficher » (L08-13) restent cote a
   cote : la liste raccourcit plutot que de pousser le bouton dessous. */
.rangee.choix-logopede { flex-wrap: nowrap; }
.rangee.choix-logopede select { min-width: 0; }
/* Sous 380 px, le bouton passe sous la liste plutot que de sortir de la carte. */
@media (max-width: 23.75em) { .rangee.choix-logopede { flex-wrap: wrap; } }
/* Depart d'un logopede : « Pour tous » a la largeur d'une liste (L02-21). */
.champ-pour-tous select { max-width: 24rem; }
@media (max-width: 40rem) {
    /* Un patient par bloc : son nom et sa seance, puis ce qu'il devient. */
    .tableau-depart thead { display: none; }
    .tableau-depart tr { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--e1) var(--e3);
                         padding: var(--e3) 0; border-bottom: var(--filet) solid var(--trait); }
    .tableau-depart td { display: block; padding: 0; border: 0; }
    .tableau-depart td:nth-child(3) { grid-column: 1 / -1; }
    .tableau-depart td:nth-child(3) select { width: 100%; }
}

/* ------------------------------------------------- abonnement (lot v3-06) */
/* Le choix de la formule et la console FastSolve : une page sans menu (le
   cabinet ne s'ouvre qu'apres le choix), a la colonne de la charte. */
.page-abonnement { min-height: 100vh; padding: var(--e6) var(--gouttiere) var(--e10); }
.boite-abonnement { max-width: var(--colonne); margin: 0 auto; }
.boite-abonnement .choix-langue { margin-bottom: var(--e4); max-width: none; }
/* Les trois formules cote a cote (l'une sous l'autre sur un telephone) ;
   celle qui est choisie se marque d'un filet d'encre. Chaque carte a sa
   hauteur : Premium dit trois fois plus que Simple, et cela se voit (16
   octobre 2026) ; etirees, les petites cartes avaient de grands vides
   (passe 4). */
.grille-formules {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
    gap: var(--e4);
    /* Cartes de meme hauteur : « Nous contacter » tombait a trois hauteurs
       differentes (passe 5). */
    align-items: stretch;
    margin: 0 0 var(--e4);
}
.carte-formule { display: flex; flex-direction: column; gap: var(--e2); margin-bottom: 0; }
.carte-formule:has(input:checked) { border-color: var(--encre); box-shadow: inset 0 0 0 var(--filet) var(--encre); }
.carte-formule.actuelle { border-color: var(--encre); }
.carte-formule .case { margin-bottom: 0; align-items: center; }
.carte-formule p { margin: 0; }
.nom-formule {
    font-family: var(--police-titre);
    font-size: var(--taille-titre);
    line-height: var(--ligne-titre);
    font-weight: 400;
    letter-spacing: var(--interlettrage-titre);
    color: var(--encre);
    margin: 0;
}
.carte-formule .case label.nom-formule { font-size: var(--taille-titre); line-height: var(--ligne-titre); }
.phrase-formule { margin: 0; color: var(--encre-moyenne); }
.prix-formule { margin: var(--e2) 0 0; font-variant-numeric: tabular-nums; }
.prix-formule strong { font-size: var(--taille-titre); line-height: var(--ligne-titre); }
.prix-barre { text-decoration: line-through; color: var(--encre-douce); }
.liste-formule { list-style: none; margin: var(--e2) 0 0; padding: 0; display: grid; gap: var(--e1); }
.liste-formule li { padding-left: var(--e4); position: relative; line-height: var(--ligne-serree); }
.liste-formule li::before { content: "+"; position: absolute; left: 0; color: var(--metal-texte); font-weight: 600; }
.liste-formule.liste-inami li::before { content: "\2713"; color: var(--vert); }
.liste-formule.colonnes-formule { grid-template-columns: repeat(auto-fill, minmax(min(100%, 18rem), 1fr)); gap: var(--e1) var(--e5); }
.bientot { color: var(--encre-douce); font-size: var(--taille-secondaire); white-space: nowrap; }
/* « Nous contacter » au pied de chaque formule (aligne d'une carte a l'autre),
   et la carte « Cabinet » en bande sous les trois (decision du 15/10). */
.carte-formule .contact-formule { margin-top: auto; padding-top: var(--e2); font-size: var(--taille-secondaire); }
.carte-formule.carte-cabinet {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--e3) var(--e5);
    margin-bottom: var(--e4);
}
/* L'etiquette « Plus » ou « Premium » d'une fonction vendue dans une formule. */
.etiquette-formule {
    display: inline-block;
    padding: 0 var(--e2);
    border: var(--filet) solid var(--metal-clair);
    border-radius: var(--rayon-commande);
    background: var(--metal-voile);
    color: var(--metal-texte);
    font-size: var(--taille-pastille);
    line-height: var(--ligne-pastille);
    font-weight: 500;
    letter-spacing: var(--interlettrage-pastille);
    vertical-align: middle;
    /* Dans une ligne en flex (feuille « Plus » du telephone), l'espace qui
       la precede disparait : la marge le remplace. */
    margin-left: var(--e1);
}
/* Les cartes du choix : les lignes communes en retrait, coche grise ; ce que
   la formule ajoute en gras, avec son « + ». */
.carte-formule .liste-formule li:not(.ajout) { color: var(--encre-moyenne); }
.carte-formule .liste-formule li:not(.ajout)::before { content: "\2713"; color: var(--encre-douce); font-weight: 400; }
.carte-formule .liste-formule li.ajout { color: var(--encre); font-weight: 600; }
.rythme-formule { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e1) var(--e5); margin: 0 0 var(--e4); }
.rythme-formule .label { margin: 0; }
.champ-parrainage input { max-width: 16rem; }
.rythme-formule .case { margin-bottom: 0; }
.actions-abonnement { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e3); margin-top: var(--e5); }
@media (max-width: 40em) {
    /* « Paiement » au-dessus, ses deux choix l'un sous l'autre, au meme bord :
       le second passait sous le libelle, decale (passe 4). */
    .rythme-formule { flex-direction: column; align-items: flex-start; }
    /* Le bouton du choix reste en bas de l'ecran. */
    .actions-choix {
        position: sticky;
        bottom: 0;
        z-index: 5;
        padding: var(--e3) 0;
        background: var(--fond);
        border-top: var(--filet) solid var(--trait);
    }
    .actions-choix .bouton { width: 100%; }
}
/* La fenetre « Disponible en ... » : la carte d'une fenetre du logiciel,
   posee dans la page (elle s'ouvre aussi sans script). */
.fenetre-formule {
    /* 44rem depuis l'exemple (16/10/2026) : ses tableaux et son graphique. */
    max-width: 44rem;
    margin: var(--e7) auto;
    border-color: var(--filet-fort);
    box-shadow: var(--ombre-flottante);
}
.fenetre-formule .surtitre { margin: 0 0 var(--e2); }
.fenetre-formule h1 { margin-bottom: var(--e3); }
/* Le statut social INAMI sous la fenetre du tableau de bord (ouvert a toutes
   les formules) : a la largeur de la fenetre. */
.fenetre-formule ~ .statut-social { max-width: 44rem; margin-left: auto; margin-right: auto; }
/* L'exemple de la fenetre « Disponible en ... » (16 octobre 2026, demande de
   FastSolve) : la fonction montree a l'oeuvre, aux donnees inventees, dans un
   cadre en pointilles qui dit que c'est un exemple. */
.exemple-formule {
    margin: var(--e4) 0;
    padding: var(--e4);
    border: var(--filet) dashed var(--filet-fort);
    border-radius: var(--rayon-commande);
    background: var(--fond);
}
.exemple-formule > .surtitre { margin: 0 0 var(--e3); }
.exemple-formule p { margin: 0 0 var(--e2); }
.exemple-formule > :last-child { margin-bottom: 0; }
.exemple-liste { margin: 0 0 var(--e2); padding-left: var(--e5); display: grid; gap: var(--e1); }
.exemple-formule .defilement { margin: 0 0 var(--e3); padding: 0; }
.exemple-tableau { width: 100%; margin: 0; background: var(--carte); }
.exemple-tableau .nombre { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.exemple-totaux, .exemple-fiche { margin: 0 0 var(--e3); display: grid; gap: var(--e2); }
.exemple-totaux > div { display: flex; justify-content: space-between; gap: var(--e3); }
.exemple-totaux dt, .exemple-fiche dt { color: var(--encre-douce); }
.exemple-totaux dd, .exemple-fiche dd { margin: 0; font-variant-numeric: tabular-nums; }
.exemple-indicateurs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--e3);
                       margin: 0 0 var(--e3); }
.exemple-indicateurs .carte { margin: 0; padding: var(--e3); }
.exemple-graphique { margin: 0 0 var(--e3); padding: var(--e2); background: var(--carte);
                     border-radius: var(--rayon-commande); }
/* La largeur seulement : l'affichage (debout, ou couche sur telephone) reste
   celui de .graphique et .graphique-etroit. */
.exemple-graphique .graphique { width: 100%; }
.exemple-message { margin: 0 0 var(--e3); padding: var(--e3); background: var(--carte);
                   border: var(--filet) solid var(--trait); border-radius: var(--rayon-commande); }
.exemple-formule .exemple-canal { margin: 0 0 var(--e1); font-size: var(--taille-secondaire);
                                  color: var(--encre-douce); font-weight: 600; }
.exemple-entete-document { display: flex; align-items: center; gap: var(--e4); margin: 0 0 var(--e3);
                           padding: var(--e3); background: var(--carte); border-radius: var(--rayon-commande); }
.exemple-logo { flex: none; display: inline-flex; align-items: center; justify-content: center;
                width: 4rem; height: 4rem; border-radius: var(--rayon-rond); border: var(--filet) dashed var(--filet-fort);
                color: var(--encre-douce); font-size: var(--taille-pastille); text-align: center; }
@media (max-width: 40em) {
    .exemple-formule { padding: var(--e3); }
    .exemple-indicateurs { grid-template-columns: minmax(0, 1fr); }
    /* Sur telephone, une ligne par mouvement, empilee : le tableau defilait
       dans son cadre a 320 px. Le montant reste a droite. */
    .exemple-tableau thead { display: none; }
    .exemple-tableau, .exemple-tableau tbody { display: block; width: auto; }
    .exemple-tableau tr { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: baseline;
                          gap: 0 var(--e2); padding: var(--e2) var(--e3);
                          border-bottom: var(--filet) solid var(--trait); }
    .exemple-tableau tr:last-child { border-bottom: 0; }
    .exemple-tableau td { display: block; padding: 0; border: 0; }
    /* La premiere case (date, numero, seance) en petit, sur sa ligne. */
    .exemple-tableau td:first-child { grid-column: 1 / -1; font-size: var(--taille-secondaire);
                                      color: var(--encre-douce); }
    .exemple-tableau td.nombre { grid-column: 2; }
}
/* La console FastSolve : un tableau large, qui defile dans sa carte. */
.tableau-console th, .tableau-console td.nombre, .tableau-console td.date-console { white-space: nowrap; }
.tableau-console td.nom-console { min-width: 9rem; }
.chiffres-console { display: flex; flex-wrap: wrap; gap: var(--e2) var(--e6); margin: 0 0 var(--e4); padding: 0; list-style: none; }
.chiffres-console strong { font-variant-numeric: tabular-nums; }
/* Option Cabinet et sur mesure (16 octobre 2026) : sous la ligne du cabinet,
   au bord gauche, et non pousses a droite comme les actions d'une cellule. */
.reglages-console td .rangee { justify-content: flex-start; flex-wrap: wrap; }
.reglages-console input[type="number"] { flex: 0 0 6rem; width: 6rem; }
.reglages-console table { margin-top: var(--e2); }
/* Sauvegardes du serveur (lot v3-04) : la derniere copie, dite en une ligne,
   en vert quand elle a ete relue, en rouge quand la relecture a echoue (le
   signe ✓ ou ✗ la dit aussi, sans la couleur). */
.etat-copie { font-size: var(--taille-intertitre); font-weight: 500; margin-bottom: var(--e2); }
.etat-copie.reussie { color: var(--vert); }
.etat-copie.manquee { color: var(--rouge); }
/* Pages de transparence lisibles sans etre connecte (securite, sous-traitants,
   projets juridiques) : plus larges que la boite de connexion. */
.boite-connexion.boite-document { max-width: 46rem; }
.boite-document .carte { margin-bottom: var(--e4); }
/* Ce qui reste a decider dans un texte : visible comme tel. */
.a-completer { background: var(--ambre-clair); color: var(--ambre); }
.fiche-sous-traitant { display: grid; grid-template-columns: max-content minmax(0, 1fr);
                       gap: var(--e1) var(--e4); margin: 0; }
.fiche-sous-traitant dt { font-weight: 500; color: var(--encre-moyenne); }
.fiche-sous-traitant dd { margin: 0; }
@media (max-width: 40rem) {
    /* Au telephone, le libelle au-dessus de sa valeur. */
    .fiche-sous-traitant { grid-template-columns: minmax(0, 1fr); gap: 0; }
    .fiche-sous-traitant dd { margin-bottom: var(--e2); }
}

/* --------------------------------------------------------------------------
   Les familles (lot v3-03) : liste d'attente en ligne, page publique du
   cabinet, fiche de renseignements remplie par les parents.
   -------------------------------------------------------------------------- */
/* Les pages publiques : une colonne lisible au telephone, plus large que la
   boite de connexion (le formulaire est long), le nom du cabinet en tete. */
.page-famille { min-height: 100vh; display: flex; justify-content: center; padding: var(--e5) var(--e4) var(--e9); }
.boite-famille { width: 100%; max-width: 40rem; }
.entete-famille { display: flex; justify-content: space-between; align-items: baseline; gap: var(--e3);
                  flex-wrap: wrap; margin-bottom: var(--e4); padding-bottom: var(--e3);
                  border-bottom: var(--filet) solid var(--trait); }
.entete-famille .choix-langue { margin: 0 0 0 auto; }
.nom-cabinet-famille { margin: 0; font-family: var(--police-titre); font-size: var(--taille-intertitre);
                       line-height: var(--ligne-courant); color: var(--metal-texte); overflow-wrap: anywhere; }
.boite-famille .bouton.principal.grand { width: 100%; }
.pied-famille { margin-top: var(--e7); }
/* L'aide d'une question ouverte se lit avant d'ecrire : entre le libelle et le champ. */
.champ > .aide-avant { margin: 0 0 var(--e2); }
/* Le champ piege des robots : hors de la vue et du clavier. */
.piege { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* Un texte tape par une famille ou un parent : ses retours a la ligne restent. */
.texte-demande { white-space: pre-line; overflow-wrap: anywhere; }
.libelle-motif { margin: var(--e3) 0 0; font-size: var(--taille-secondaire); line-height: var(--ligne-serree);
                 color: var(--encre-douce); }
.libelle-motif + .texte-demande { margin-top: var(--e1); }
/* La liste d'attente : une demande en ligne par bloc, ses gestes dessous. */
.ligne-en-ligne { margin: var(--e3) 0 var(--e4); }
.demande-en-ligne { padding: var(--e5) 0; border-top: var(--filet) solid var(--trait); }
.demande-en-ligne:last-child { padding-bottom: 0; }
.demande-en-ligne h3 { margin: 0 0 var(--e3); }
.accepter-demande { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 0 var(--e4); margin-top: var(--e4); }
.accepter-demande .champ { flex: 1 1 12rem; margin-bottom: var(--e3); }
.accepter-demande .bouton { margin-bottom: var(--e3); }
.refuser-demande { margin-top: var(--e2); }
.refuser-demande textarea { max-width: var(--mesure); }
/* Le QR du formulaire, a imprimer pour la salle d'attente. */
.qr-attente { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e3) var(--e5); }
.qr-attente svg { display: block; }
.qr-attente p { flex: 1 1 14rem; margin: 0; }
/* La fiche des parents, a relire : la case de chaque champ et ce qu'elle fera. */
.relecture-parents td { vertical-align: top; }
.case-verser { display: inline-flex; align-items: center; gap: var(--e2); margin: 0; font-weight: 400;
               white-space: nowrap; min-height: var(--cible-tactile); }
.lien-a-copier input[type="text"] { flex: 1 1 18rem; }
@media (max-width: 56.25em) {
    /* Sur telephone : la fiche, puis la reponse des parents, chacune sur sa
       ligne avec son libelle au-dessus, puis la case. */
    table.relecture-parents td { flex: 1 1 100%; }
    table.relecture-parents .libelle-empile { display: block; margin: 0; }
}

/* Ou la liste est un tableau (passe 5) : la colonne Etat des factures, une
   pastille sur une ligne ; le nom d'une demande de la liste d'attente. */
@media (min-width: 56.3125em) {
    td.etat-facture { white-space: nowrap; }
    td.nom-demande > a.cible { white-space: nowrap; }
}

/* Les seances d'une attestation, au telephone : le numero, la date, le code
   et le montant sur une ligne, « Modifier » dessous. La carte « Valeurs
   portées sur la feuille » defilait de cote, 412 px dans 341 (passe 5). */
@media (max-width: 40em) {
    table.prestations-tp thead { display: none; }
    table.prestations-tp, table.prestations-tp tbody, table.prestations-tp tfoot { display: block; }
    table.prestations-tp tr {
        display: grid;
        grid-template-columns: 1.5rem minmax(0, 1fr) minmax(0, 1fr) auto;
        align-items: center;
        gap: 0 var(--e2);
        border-bottom: var(--filet) solid var(--trait);
    }
    table.prestations-tp td { border-bottom: 0; }
    table.prestations-tp td[colspan] { grid-column: 1 / 4; }
    table.prestations-tp td.actions { grid-column: 1 / -1; width: auto; padding-top: 0; }
    table.prestations-tp td.actions:empty { display: none; }
}

