/* ============================================================================
   TOTODOC — Design system V0 (accueil)
   Couleurs échantillonnées sur le logo : marine var(--marine), cyan var(--cyan).
   Police : Nunito (variable), auto-hébergée (RGPD). Accessibilité : WCAG 2.1 AA.
   ========================================================================== */

/* ---------- Police ---------- */
@font-face {
    font-family: 'Nunito';
    font-style: normal;
    font-weight: 200 1000;
    font-display: swap;
    src: url('../fonts/nunito-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
        U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
        U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Nunito';
    font-style: normal;
    font-weight: 200 1000;
    font-display: swap;
    src: url('../fonts/nunito-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
        U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020,
        U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ---------- Variables ---------- */

/* ---------------------------------------------------------------------------
   LA CASE ENTIÈRE EST LE LIEN (règle générale de Julien, 19/08/2026).

   Posée dans `site.css` — chargée sur TOUTES les pages — parce que le geste
   vaut côté praticien comme côté patient. Écrite dans une feuille de console,
   elle aurait manqué aux documents de l'espace patient, et l'on aurait cherché
   pourquoi une case ne réagit qu'à moitié.

   ⚠ LE SURVOL N'EST PAS DE L'ORNEMENT : sans lui, rien ne distingue une case
   cliquable d'un paragraphe. Le curseur seul ne se voit pas au doigt.
   --------------------------------------------------------------------------- */
/* ⚠ `cursor: pointer` N'EST PAS COSMÉTIQUE — c'est une CONDITION DE
   FONCTIONNEMENT SUR iOS (constaté le 19/08/2026 : « en mobile la case du
   patient n'est pas cliquable, juste le nom »). Safari mobile n'envoie pas
   d'événement `click` aux éléments qu'il ne tient pas pour cliquables : une
   écoute posée sur `document` ne reçoit alors RIEN, et seul le lien intérieur
   répond. Chromium sans tête, lui, envoie le clic — le harnais était donc vert
   sur un défaut bien réel.

   La règle vise ici TOUTES les cases d'un coup. Elle n'existait que sur
   `.jour-tbl` et `.pt-tbl` : la patientèle, oubliée, était précisément celle
   qui ne répondait pas au doigt. */
.ligne-cliquable,
[data-href],
[data-modele-ligne] { cursor: pointer; }
.ligne-cliquable { border-radius: 8px; }
.ligne-cliquable:hover { background: var(--cyan-voile); }

/* ---------------------------------------------------------------------------
   SECOND FACTEUR DE L'ESPACE ADMIN (19/08/2026).
   Trois écrans rares, vus quelques fois par an : pas de dessin propre, on
   reprend la carte du tunnel. Seuls le QR, la clé et les codes de secours
   demandent des règles — parce qu'ils se RECOPIENT, souvent à la main.
   --------------------------------------------------------------------------- */
.mfa-qr { margin: 18px 0; text-align: center; }
.mfa-qr svg { width: 190px; height: 190px; max-width: 100%; }
/* ⚠ Chasse fixe et lettres espacées : une clé base32 se recopie caractère par
   caractère, et un `l` qui ressemble à un `1` coûte une tentative. */
.mfa-cle code, .mfa-codes code {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    letter-spacing: .09em; font-size: 1.02rem;
}
.mfa-cle { margin: 0 0 18px; word-break: break-all; }
.mfa-codes {
    list-style: none; margin: 16px 0 22px; padding: 14px 16px;
    display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px 18px;
    background: var(--fond-doux); border: 1px solid var(--bord); border-radius: 12px;
}
@media (max-width: 420px) { .mfa-codes { grid-template-columns: 1fr; } }

/* ---------- Base ---------- */
*, *::before, *::after { box-sizing: border-box; }

html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
    *, *::before, *::after { transition: none !important; animation: none !important; }
}

body {
    margin: 0;
    font-family: var(--police);
    font-size: 1.0625rem;
    line-height: 1.65;
    color: var(--encre);
    background: var(--fond);
    -webkit-font-smoothing: antialiased;
}

h1, h2, h3 { color: var(--marine); line-height: 1.15; margin: 0 0 .6em; }
h1 { font-size: clamp(2.1rem, 4.6vw, 3.3rem); font-weight: 900; letter-spacing: -.015em; }
h2 { font-size: clamp(1.55rem, 3vw, 2.15rem); font-weight: 800; letter-spacing: -.01em; }
h3 { font-size: 1.15rem; font-weight: 800; }

p { margin: 0 0 1em; }
ul, ol { margin: 0; padding: 0; }
img { max-width: 100%; height: auto; }

a { color: var(--cyan-fonce); text-underline-offset: 3px; }
a:hover { color: var(--marine); }

:focus-visible {
    outline: 3px solid var(--cyan-fonce);
    outline-offset: 2px;
    border-radius: 4px;
}

.container { max-width: var(--largeur); margin-inline: auto; padding-inline: clamp(18px, 4vw, 32px); }

.visually-hidden {
    position: absolute; width: 1px; height: 1px; margin: -1px;
    clip-path: inset(50%); overflow: hidden; white-space: nowrap;
}

.skip-link {
    position: absolute; left: 16px; top: -60px; z-index: 100;
    background: var(--marine); color: #fff; font-weight: 700;
    padding: 10px 18px; border-radius: 0 0 var(--rayon-s) var(--rayon-s);
    transition: top var(--transition);
}
.skip-link:focus { top: 0; color: #fff; }

/* ---------- Boutons ---------- */
.btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    font: 700 1rem var(--police);
    padding: 13px 24px; border-radius: 999px;
    text-decoration: none; border: 2px solid transparent;
    transition: background var(--transition), color var(--transition),
        border-color var(--transition), transform var(--transition);
    cursor: pointer;
}
.btn:active { transform: translateY(1px); }
.btn--primary { background: var(--marine); color: #fff; }
.btn--primary:hover { background: var(--marine-2); color: #fff; }
.btn--outline { background: #fff; color: var(--marine); border-color: var(--marine); }
.btn--outline:hover { background: var(--marine); color: #fff; }
.btn--ghost { background: transparent; color: var(--marine); padding-inline: 14px; }
.btn--ghost:hover { background: var(--fond-doux); color: var(--marine); }
.btn--inverse { background: #fff; color: var(--marine); }
.btn--inverse:hover { background: var(--cyan); color: var(--marine); }
/* CORBEILLE — action destructrice, donc DISCRÈTE AU REPOS et franche au
   survol. Elle ne doit pas rivaliser du regard avec « Ouvrir » : on ouvre
   cent fois une consultation pour une fois qu'on la supprime. 40 px de côté :
   sous ce seuil, une cible tactile se rate, et la rater ici n'est pas grave —
   c'est la toucher par erreur qui l'est, d'où la demande de confirmation. */
.btn--corbeille {
    background: transparent; color: var(--encre-2); border-color: transparent;
    width: 40px; height: 40px; padding: 0; border-radius: 10px;
    display: inline-flex; align-items: center; justify-content: center;
}
.btn--corbeille:hover { background: var(--alerte-fond); color: var(--alerte-texte); border-color: transparent; }
.btn--corbeille svg { display: block; }
/* ⚠ GRISÉE, PAS MASQUÉE (§10 de la spécification DG). Faire disparaître le
   bouton n'apprend rien : le praticien cherche pourquoi il ne peut pas
   supprimer et ne trouve rien à chercher. Grisé, il dit qu'une règle
   s'applique ; l'infobulle dit laquelle. Le curseur « interdit » achève de le
   signaler avant même le survol prolongé. */
.btn--corbeille--bloque { opacity: .38; cursor: not-allowed; }
.btn--corbeille--bloque:hover { background: transparent; color: var(--encre-2); }

/* ---------- En-tête ---------- */
.site-header {
    position: sticky; top: 0; z-index: 50;
    background: rgba(255, 255, 255, .92);
    backdrop-filter: blur(8px);
    border-bottom: 1px solid var(--bord);
}
.site-header__inner {
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; min-height: 68px;
}
.brand { display: inline-flex; align-items: center; gap: 10px; text-decoration: none; }
.brand__mark { width: 42px; height: auto; }
.brand__word { width: 110px; height: auto; }
.brand--footer .brand__mark { width: 36px; }
.brand--footer .brand__word { width: 100px; }

/* La navigation occupe toute la place entre le logo et le bouton « Espace
   patient » : les liens se posent à la suite du logo, le bouton reste à
   l'extrémité droite. Sans ce flex:1, tout se tassait à droite. */
.site-nav { display: flex; align-items: center; gap: 22px; flex: 1; justify-content: space-between; }
/* ⚠ LES LIENS SE RÉPARTISSENT ENTRE LE LOGO ET LE BOUTON (Julien, 20/08/2026).
   Ils étaient groupés à gauche, collés au logo, et tout l'espace restait vide
   avant « Espace patient ». `space-evenly` sur une liste qui occupe la place
   disponible les écarte régulièrement, et les marges égales de part et d'autre
   gardent l'ensemble équilibré entre les deux extrémités. */
.site-nav__links {
    display: flex; list-style: none;
    flex: 1; justify-content: space-evenly; gap: 20px;
    margin-inline: clamp(16px, 3vw, 40px);
}
.site-nav__links a {
    color: var(--marine); text-decoration: none; font-weight: 700; font-size: .98rem;
    padding: 6px 2px; border-bottom: 2px solid transparent;
}
.site-nav__links a:hover { border-bottom-color: var(--cyan); }
.site-nav__actions { display: flex; align-items: center; gap: 10px; }
.site-nav__actions .btn { padding: 9px 18px; font-size: .95rem; }

.nav-toggle { display: none; }

@media (max-width: 920px) {
    .nav-toggle {
        display: inline-flex; align-items: center; justify-content: center;
        width: 44px; height: 44px; border: 2px solid var(--bord);
        border-radius: var(--rayon-s); background: #fff; cursor: pointer;
    }
    .nav-toggle__bar,
    .nav-toggle__bar::before,
    .nav-toggle__bar::after {
        content: ''; display: block; width: 20px; height: 2.4px;
        background: var(--marine); border-radius: 2px; position: relative;
    }
    .nav-toggle__bar::before { position: absolute; top: -6px; }
    .nav-toggle__bar::after { position: absolute; top: 6px; }

    .site-nav {
        display: none; flex: none;
        position: absolute; left: 0; right: 0; top: 100%;
        flex-direction: column; align-items: stretch; gap: 4px;
        background: #fff; border-bottom: 1px solid var(--bord);
        padding: 14px clamp(18px, 4vw, 32px) 20px;
        box-shadow: var(--ombre);
    }
    .site-nav--open { display: flex; }
    .site-nav__links { flex-direction: column; gap: 2px; margin-left: 0; }
    .site-nav__links a { display: block; padding: 11px 4px; font-size: 1.05rem; }
    .site-nav__actions { flex-direction: column; align-items: stretch; margin-top: 10px; }
}

/* ---------- Hero ---------- */
/* ⚠ MÊME RYTHME QUE `.section` (Julien, 20/08/2026) : « les paddings doivent
   tous être équivalents au padding de début et de fin de section ». Le hero
   avait un bas deux fois plus court que son haut (16–36 px contre 40–84) : la
   première section semblait collée à lui, et chaque page respirait autrement.
   Un seul rythme vertical pour tout le site — il se change ICI, et nulle part
   ailleurs. */
.hero { padding: clamp(48px, 7vw, 84px) 0; }
.hero__grid {
    display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, .75fr);
    gap: clamp(24px, 5vw, 64px); align-items: center;
}
.hero__lead { font-size: 1.17rem; color: var(--encre-2); }
.hero__actions { display: flex; flex-wrap: wrap; gap: 12px; margin: 26px 0 30px; }
/* ── LES DEUX BOUTONS DU HÉROS (17/08/2026, unifiés le 19/08) ──
   Repris de docteurgozlan.fr, à la demande de Julien. Ils remplaçaient un
   couple pastille + bouton foncé : l'état et l'action, séparés, disaient deux
   fois la même chose.

   ⚠ UNE SEULE FORME POUR LES DEUX. « Consulter maintenant » et « Prendre
   rendez-vous » sont deux réponses à la même question — « quand ? ». Tant que
   l'un était une carte de deux lignes et l'autre une gélule d'une ligne, ils
   n'avaient ni la même hauteur ni le même poids, et se lisaient comme deux
   natures d'action. La forme est commune ; seule la couleur les sépare, et
   c'est elle qui porte le sens : le vert dit « tout de suite ».

   Le vert #2E9E5B est FONCÉ à dessein : le blanc dessus tient le contraste AA
   (5,0:1) — obligation légale, pas question de goût. */
.btn-hero {
    display: inline-flex; align-items: center; gap: 16px;
    padding: 13px 26px 13px 20px; border-radius: 999px;
    text-decoration: none; border: 2px solid transparent;
    transition: background .15s, transform .15s, box-shadow .15s, border-color .15s;
}
.btn-hero:hover { transform: translateY(-1px); }
.btn-hero:focus-visible { outline: 3px solid var(--cyan-fonce); outline-offset: 3px; }

/* ⚠ LES DEUX LIGNES SONT CENTRÉES L'UNE SUR L'AUTRE (Julien, 19/08/2026).
   L'état est plus court que l'action — calées à gauche, elles laissaient un
   bord droit en escalier. Centrées, le bloc a un axe, et les deux boutons se
   répondent. `align-items` centre les DEUX LIGNES entre elles ; `text-align`
   centre le texte à l'intérieur de chacune, quand il se replie. Il faut les
   deux : l'un sans l'autre laisse un des deux niveaux décalé. */
.btn-hero__texte {
    display: flex; flex-direction: column; align-items: center; gap: 1px;
    text-align: center; padding-left: 16px; min-width: 0;
}
.btn-hero__etat {
    font-size: .72rem; font-weight: 700; letter-spacing: .09em;
    text-transform: uppercase;
}
.btn-hero__action { font-size: 1.06rem; font-weight: 800; letter-spacing: .01em; }
/* ⚠ L'icône PORTE SES DIMENSIONS : sans elles, un SVG n'a aucune taille propre
   dans une boîte flexible et disparaît. Défaut déjà payé sur le crayon des
   modèles, le 19/08 au matin. */
.btn-hero__icone { width: 22px; height: 22px; flex: 0 0 auto; }
.btn-hero__pastille {
    width: 15px; height: 15px; border-radius: 50%; flex: 0 0 auto;
    background: #fff; box-shadow: 0 0 0 4px rgba(255, 255, 255, .28);
    animation: dot-pulse-clair 1.8s ease-out infinite;
}
@keyframes dot-pulse-clair {
    0%   { box-shadow: 0 0 0 0 rgba(255, 255, 255, .6); }
    70%  { box-shadow: 0 0 0 10px rgba(255, 255, 255, 0); }
    100% { box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); }
}
@media (prefers-reduced-motion: reduce) {
    .btn-hero__pastille { animation: none; box-shadow: 0 0 0 4px rgba(255,255,255,.28); }
    .btn-hero:hover { transform: none; }
}

/* ---- « Consulter maintenant » : plein, vert ---- */
.btn-hero--dispo {
    background: #2E9E5B; color: #fff;
    box-shadow: 0 6px 18px rgba(46, 158, 91, .28);
}
.btn-hero--dispo:hover { background: #27884E; box-shadow: 0 8px 22px rgba(46, 158, 91, .34); }
.btn-hero--dispo .btn-hero__texte { border-left: 1px solid rgba(255, 255, 255, .32); }
.btn-hero--dispo .btn-hero__etat { color: rgba(255, 255, 255, .88); }

/* ---- « Prendre rendez-vous » : cerclé, encre ---- */
.btn-hero--rdv {
    background: #fff; color: var(--marine); border-color: var(--marine);
}
.btn-hero--rdv:hover { background: var(--fond-doux); }
.btn-hero--rdv .btn-hero__texte { border-left: 1px solid var(--bord); }
.btn-hero--rdv .btn-hero__etat { color: var(--encre-2); }

/* ⚠ SUR TÉLÉPHONE, ILS S'EMPILENT MAIS NE S'ÉTIRENT PLUS (Julien, 19/08/2026 :
   « pourquoi les boutons sont si larges sur mobile ? »).

   La pleine largeur était mon choix du matin, et il produisait exactement le
   défaut qu'il fallait éviter : étiré, le bloc de texte se centrait dans un
   vide, l'icône restait seule à l'extrême gauche, et le filet ne séparait plus
   rien de lisible. À sa taille de contenu, le bouton retrouve la géométrie
   qu'il a sur grand écran — repère, filet, texte — et le centrage demandé le
   19/08 redevient vrai à toutes les largeurs.

   `max-width: 100%` reste : un libellé long doit se replier, jamais déborder. */
@media (max-width: 560px) {
    /* ⚠ UNE GRILLE D'UNE COLONNE `max-content`, ET NON UNE COLONNE FLEX
       (Julien, 19/08/2026 : « centre les boutons sur mobile ! »).

       Empilés en flex et centrés, les deux boutons gardent chacun sa largeur
       naturelle — 285 px contre 273 — et se décalent de six pixels de chaque
       côté : un escalier que l'œil voit sans savoir le nommer. La colonne
       `max-content` prend la largeur du PLUS LARGE, les deux la remplissent,
       et l'ensemble se centre d'un bloc. Même largeur, même axe, sans figer
       aucune valeur en dur — si un libellé change, la colonne suit. */
    .hero__actions {
        display: grid; grid-template-columns: max-content;
        justify-content: center; gap: 12px;
    }
    .btn-hero { width: 100%; max-width: 100%; }
}
.hero__media { text-align: center; }
.hero__media img { width: min(310px, 64vw); }


.hero__reassurance { list-style: none; display: grid; gap: 10px; }
.hero__reassurance li {
    display: flex; align-items: center; gap: 10px;
    font-weight: 700; font-size: .98rem; color: var(--marine);
}
.hero__reassurance svg { width: 22px; height: 22px; flex: none; color: var(--cyan-fonce); }

@media (max-width: 820px) {
    .hero__grid { grid-template-columns: 1fr; }
    .hero__media { order: -1; }
    .hero__media img { width: min(170px, 42vw); }
}

/* ---------- Sections ---------- */
.section { padding: clamp(48px, 7vw, 84px) 0; }
.section--soft { background: var(--fond-doux); }
.section--marine { background: linear-gradient(135deg, var(--marine) 0%, var(--marine-2) 100%); }
.section--marine h2 { color: #fff; }
.section__intro { color: var(--encre-2); font-size: 1.1rem; margin-bottom: 2em; }
.section__intro--inverse { color: #C8DCEA; }

/* En-tête des espaces professionnels (console, administration). */
.site-header__pro {
    margin: 0; margin-left: auto; font-weight: 700; color: var(--encre-2);
    font-size: .95rem; letter-spacing: .02em;
}
/* Le pied réduit des espaces pro est réglé PLUS BAS, juste après `.site-footer` :
   à spécificité égale, c'est l'ordre du fichier qui tranche, et la propriété
   raccourcie `padding` de `.site-footer` écrasait tout réglage placé ici. */

/* Renvoi secondaire en bas d'un formulaire (connexion → inscription). */
.renvoi {
    margin: 26px 0 0; padding-top: 22px; border-top: 1px solid var(--bord);
    text-align: center;
}
.renvoi p { margin: 0 0 12px; color: var(--encre-2); font-size: .95rem; }

/* ---------- Étapes ---------- */
.etapes {
    list-style: none; counter-reset: etapes;
    display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px;
}
.etape {
    position: relative; background: #fff; border: 1px solid var(--bord);
    border-radius: var(--rayon); padding: 30px 24px 22px;
    box-shadow: var(--ombre);
}
.etape__numero {
    position: absolute; top: -19px; left: 22px;
    width: 38px; height: 38px; display: grid; place-items: center;
    background: var(--cyan); color: var(--marine);
    font-weight: 900; font-size: 1.05rem; border-radius: 50%;
    border: 3px solid #fff;
}
.etape__icone {
    position: absolute; top: -19px; right: 22px;
    width: 38px; height: 38px; padding: 8px;
    background: #fff; border: 1px solid var(--bord); border-radius: 50%;
    box-shadow: 0 2px 8px rgba(16, 31, 45, .08);
    color: var(--marine);
}
.etape p { margin: 0; color: var(--encre-2); font-size: .99rem; }
@media (max-width: 820px) { .etapes { grid-template-columns: 1fr; } }

/* ---------- Spécialités ---------- */
.specialites {
    list-style: none;
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px;
}
/* Motifs de consultation : 3 colonnes, pour une grille pleine et équilibrée. */
.specialites--motifs { grid-template-columns: repeat(3, 1fr); }
@media (max-width: 900px) { .specialites--motifs { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .specialites--motifs { grid-template-columns: 1fr; } }
.specialites li {
    display: flex; align-items: center; gap: 12px;
    background: #fff; border: 1px solid var(--bord); border-radius: var(--rayon-s);
    padding: 15px 18px; font-weight: 700; color: var(--marine);
}
.specialites svg { width: 26px; height: 26px; flex: none; color: var(--cyan-fonce); }
@media (max-width: 920px) { .specialites { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 480px) { .specialites { grid-template-columns: 1fr; } }

/* ---------- Documents ---------- */
.documents__grid {
    display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
    gap: clamp(28px, 5vw, 64px); align-items: center;
}
.documents__liste { list-style: none; display: grid; gap: 12px; }
.documents__liste li {
    position: relative; padding-left: 34px; color: var(--encre-2);
}
.documents__liste li::before {
    content: ''; position: absolute; left: 0; top: 2px;
    width: 22px; height: 22px; border-radius: 50%;
    background: var(--cyan);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2a10 10 0 100 20 10 10 0 000-20zm-1.2 13.6L7 11.8l1.5-1.5 2.3 2.3 4.7-4.7L17 9.4l-6.2 6.2z'/%3E%3C/svg%3E") center/contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2a10 10 0 100 20 10 10 0 000-20zm-1.2 13.6L7 11.8l1.5-1.5 2.3 2.3 4.7-4.7L17 9.4l-6.2 6.2z'/%3E%3C/svg%3E") center/contain no-repeat;
}
.documents__liste strong { color: var(--marine); }

.documents__visuel { display: grid; place-items: center; }
.doc-carte {
    width: min(300px, 80%); background: #fff;
    border: 1px solid var(--bord); border-radius: var(--rayon);
    box-shadow: var(--ombre); padding: 26px 24px;
    display: grid; gap: 12px;
}
.doc-carte__entete { height: 14px; width: 46%; border-radius: 7px; background: var(--marine); }
.doc-carte__ligne { height: 9px; border-radius: 5px; background: var(--bord); }
.doc-carte__ligne--l { width: 85%; }
.doc-carte__ligne--c { width: 60%; background: #CBE9F4; }
.doc-carte__pied {
    display: flex; align-items: center; gap: 10px; margin-top: 8px;
    color: var(--cyan-fonce); font-weight: 700;
}
.doc-carte__pied svg { width: 34px; height: 34px; }
.doc-carte__pied em { font-style: normal; font-size: .9rem; }
@media (max-width: 820px) {
    .documents__grid { grid-template-columns: 1fr; }
    .documents__visuel { order: -1; }
}

/* ---------- Cartes sécurité ---------- */
.cartes { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
.carte {
    background: #fff; border: 1px solid var(--bord); border-radius: var(--rayon);
    padding: 24px 22px; box-shadow: var(--ombre);
}
.carte svg { width: 30px; height: 30px; color: var(--cyan-fonce); margin-bottom: 12px; }
.carte h3 { margin-bottom: .35em; }
.carte p { margin: 0; color: var(--encre-2); font-size: .96rem; }
@media (max-width: 980px) { .cartes { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 540px) { .cartes { grid-template-columns: 1fr; } }

/* ---------- Section praticiens ---------- */
.praticiens__grid { display: grid; grid-template-columns: minmax(0, 1fr); }
.praticiens__liste {
    list-style: none; display: grid; gap: 12px; margin: 0 0 30px;
}
.praticiens__liste li {
    position: relative; padding-left: 30px; color: #E4EEF6; font-size: 1.02rem;
}
.praticiens__liste li::before {
    content: ''; position: absolute; left: 0; top: 7px;
    width: 14px; height: 14px; border-radius: 50%;
    background: var(--cyan);
}

/* ---------- Page d'attente ---------- */
.page-attente { min-height: 52vh; display: grid; align-items: center; }
.page-attente__inner { text-align: center; max-width: 560px; margin-inline: auto; }
.page-attente img { margin-bottom: 18px; }
.page-attente p { color: var(--encre-2); margin-bottom: 28px; }
.erreur-code {
    margin: 0 0 4px; font-size: 3.2rem; font-weight: 900; line-height: 1;
    color: var(--cyan-fonce); letter-spacing: .02em;
}

/* ---------- Pied de page ---------- */
.site-footer {
    border-top: 1px solid var(--bord);
    padding: 44px 0 34px; background: #fff;
}
.site-footer__grid {
    display: grid; grid-template-columns: 1.2fr 1fr 1fr;
    gap: 32px; margin-bottom: 30px;
}
.site-footer__baseline { color: var(--encre-2); margin-top: 12px; font-size: .97rem; }
.site-footer__title {
    font-size: .85rem; letter-spacing: .06em; text-transform: uppercase;
    color: var(--encre-2); margin: 0 0 12px; font-weight: 800;
}
.site-footer nav ul { list-style: none; display: grid; gap: 8px; }
.site-footer nav a { color: var(--marine); text-decoration: none; font-weight: 600; font-size: .97rem; }
.site-footer nav a:hover { text-decoration: underline; }
.site-footer__legal {
    border-top: 1px solid var(--bord); padding-top: 20px;
    color: var(--encre-2); font-size: .9rem; margin: 0;
}
@media (max-width: 720px) { .site-footer__grid { grid-template-columns: 1fr; gap: 24px; } }

/* Espaces professionnels (console, administration) : le pied se réduit à la
   seule mention légale. Sans ces deux lignes, le filet de `.site-footer` et
   celui de `.site-footer__legal` se superposaient à 45 px d'intervalle, avec
   une bande vide entre les deux que l'encart cookies venait chevaucher.
   ⚠ Doit rester APRÈS les règles ci-dessus (même spécificité, ordre du fichier). */
/* ⚠ LE REPÈRE A CHANGÉ le 19/08/2026, et c'était le vrai risque du retrait du
   pied de page : la colonne flexible des espaces professionnels était accrochée
   à `body:has(.site-footer--pro)`, donc à la PRÉSENCE DU PIED DE PAGE. Le
   supprimer emportait silencieusement la mise en page de l'agenda — celle-là
   même qui venait d'être réparée, et dont la panne ne se voit qu'à l'œil.
   Le repère est désormais `body.espace-pro`, posé par le gabarit d'après la
   route : il décrit ce que la page EST, pas ce qu'elle contient. Un état ne se
   déduit pas d'un élément décoratif qui peut disparaître. */
/* ⚠ `100dvh`, PAS `100vh` (19/08/2026). Sur mobile, `100vh` vaut la hauteur
   de la fenêtre BARRE D'ADRESSE MASQUÉE : elle est donc toujours plus grande
   que la surface réellement visible, et la page défile de la hauteur de la
   barre — pour ne rien montrer. Tant que le pied de page occupait ce bas, le
   défilement révélait quelque chose et passait pour voulu ; le pied retiré, il
   ne mène plus qu'au vide. La règle était déjà écrite trois lignes plus bas
   pour l'agenda, et n'avait pas été appliquée ici. */
body.espace-pro { display: flex; flex-direction: column; min-height: 100dvh; }
body.espace-pro > main { flex: 1 0 auto; }

/* ---------- Pages « plein écran » des espaces professionnels ----------
   L'agenda occupe la fenêtre : la page ne défile pas, seul le planning défile.
   `100dvh` (et non `100vh`) parce que sur mobile la barre d'adresse du
   navigateur se rétracte : avec `vh`, le bas de la grille passe dessous.
   `min-height: 0` sur <main> lève la règle implicite qui empêche un enfant
   flexible de rétrécir sous la taille de son contenu. */
body:has(.console-agenda) { height: 100dvh; min-height: 0; overflow: hidden; }
/* ⚠ `flex-direction: column` INDISPENSABLE : sans lui, <main> devient une
   boîte flexible EN LIGNE, la section n'occupe plus que la largeur de son
   contenu et l'agenda se replie en une colonne étroite au milieu de l'écran. */
body:has(.console-agenda) > main {
    flex: 1 1 auto; min-height: 0;
    display: flex; flex-direction: column;
}
/* L'encart cookies flotte au-dessus : il ne doit pas réserver d'espace en bas,
   sinon la fenêtre est plus haute que l'écran et la barre de défilement revient.
   ⚠ ÉLARGI À TOUT L'ESPACE PRO le 19/08/2026 : la règle ne visait que l'agenda,
   si bien que les autres écrans de la console gardaient 132 px de réserve — et
   210 px sur téléphone. Un praticien y voyait une barre de défilement qui ne
   menait à rien. La réserve a un sens sur le SITE PUBLIC, où le bandeau
   masquerait la fin d'une page qu'on lit jusqu'au bout ; elle n'en a aucun sur
   un poste de travail. */
body.espace-pro:has(.rgpd:not([hidden])),
body.sans-pied:has(.rgpd:not([hidden])) { padding-bottom: 0; }

/* ---------- Annuaire (point 4a) ---------- */
.annuaire-en-tete h1 { margin-top: .2em; }

.fil-ariane {
    display: flex; flex-wrap: wrap; gap: 8px; align-items: center;
    font-size: .92rem; color: var(--encre-2); margin-bottom: 18px;
}
.fil-ariane a { color: var(--encre-2); }
.fil-ariane [aria-current] { color: var(--marine); font-weight: 700; }

.avatar {
    display: inline-grid; place-items: center; flex: none;
    width: 56px; height: 56px; border-radius: 50%;
    background: var(--fond-doux); border: 2px solid #BCE4F1;
    color: var(--marine); font-weight: 900; font-size: 1.15rem;
}

.praticiens-liste { list-style: none; display: grid; gap: 16px; }
.praticien-carte {
    display: flex; align-items: center; gap: 18px;
    background: #fff; border: 1px solid var(--bord); border-radius: var(--rayon);
    box-shadow: var(--ombre); padding: 20px 22px;
}
.praticien-carte__infos { flex: 1; min-width: 0; }
.praticien-carte h2 { font-size: 1.2rem; margin: 0 0 .15em; }
.praticien-carte h2 a { color: var(--marine); text-decoration: none; }
.praticien-carte h2 a:hover { text-decoration: underline; }
.praticien-carte__meta { color: var(--encre-2); font-size: .95rem; margin: 0 0 .3em; }
.praticien-carte__tarif { margin: 0; font-size: .98rem; color: var(--encre); }
@media (max-width: 640px) {
    .praticien-carte { flex-wrap: wrap; }
    .praticien-carte__cta { width: 100%; }
}

/* ---------- En-tête des documents : aperçu et champs (console + admin) ---------- */
/* Reproduit à l'écran ce qui s'imprimera : le praticien voit son en-tête réel,
   pas une description de son en-tête. */
.entete-apercu {
    background: #fff; border: 1px solid var(--bord); border-radius: var(--rayon-s);
    padding: 16px 18px 14px; margin-bottom: 14px; position: relative;
    border-bottom: 3px solid var(--bord);
}
.entete-apercu__ligne { display: block; font-size: .95rem; color: var(--encre); }
.entete-apercu__ligne--nom { font-weight: 900; font-size: 1.15rem; color: var(--marine); margin-bottom: 2px; }
.entete-apercu__marque {
    position: absolute; top: 16px; right: 18px;
    font-weight: 800; color: var(--cyan); font-size: 1rem;
}
.entete-champs { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; margin: 0 0 10px; }
.entete-champs > div { background: var(--fond-doux); border-radius: var(--rayon-s); padding: 10px 12px; }
.entete-champs dt { font-size: .78rem; font-weight: 800; text-transform: uppercase;
    letter-spacing: .04em; color: var(--encre-2); margin-bottom: 3px; }
.entete-champs dd { margin: 0; color: var(--marine); font-weight: 700; }

/* ==================== ÉDITEUR DE CV (console → Profil) ====================
   Défaut signalé par Julien le 13/08/2026 : « des grandes cases, des petites
   cases, une absence de cohérence ». Il avait raison, et pour trois raisons
   cumulées.

   · Le champ le plus important du bloc — son TITRE — était le plus étroit,
     coincé à côté des cases à cocher, pendant que les lignes en dessous
     prenaient toute la largeur.
   · Les champs de ligne étaient deux fois moins hauts que ceux du reste de la
     page : ils héritaient d'un `flex-basis` mais d'aucune hauteur commune.
   · Rien ne disait ce qu'on tapait : chaque colonne ne s'annonçait que par son
     texte grisé, qui disparaît à la première lettre.

   LA RÉPONSE EST UNE GRILLE. En-tête de colonnes et lignes partagent le MÊME
   gabarit, choisi d'après les colonnes actives du bloc : tout s'aligne
   verticalement, quelle que soit la combinaison. Les colonnes masquées ne sont
   pas seulement invisibles, elles sortent de la grille (`display: none`), sinon
   elles laisseraient des vides. */
.cv-editeur {
    border: 1px solid var(--bord); border-radius: var(--rayon-s);
    padding: 16px 18px; margin: 22px 0 0;
    /* Éditeur dense : des champs de 54 px y feraient une page interminable.
       C'est LA variable que lit la règle de hauteur commune — on ne redéfinit
       donc aucune hauteur à la main. */
    --hauteur-champ: 44px;
}
.cv-editeur legend { font-weight: 800; color: var(--marine); padding: 0 8px; display: table; }

.cv-section {
    border: 1px solid var(--bord); border-radius: var(--rayon-s);
    padding: 16px 18px; margin-bottom: 14px; background: #fff;
}

/* Le titre du bloc prend TOUTE la largeur : c'est ce qui apparaîtra en tête de
   rubrique sur la fiche publique. Les cases de colonnes passent en dessous,
   au rang de réglage. */
.cv-section__tete { margin-bottom: 14px; }
.cv-section__tete .champ { margin: 0 0 10px; }
/* Le titre du bloc s'aligne sur les LIGNES qu'il coiffe : dans un même bloc,
   tout part du même bord gauche et s'arrête au même bord droit. C'était le
   dernier écart de largeur — un champ court au-dessus de champs longs se lit
   comme une erreur de mise en page. */
.cv-section__tete .champ input { max-width: none; }

.cv-colonnes {
    display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
    border: 0; padding: 0; margin: 0;
}
.cv-colonnes legend {
    font-size: .78rem; font-weight: 700; color: var(--encre-2);
    padding: 0; margin: 0 4px 0 0; float: left; line-height: 32px;
}
/* Une case à cocher devient une pastille : on voit d'un coup d'œil quelles
   colonnes sont actives, sans lire trois libellés minuscules. */
.cv-colonnes label {
    display: inline-flex; align-items: center; gap: 7px;
    padding: 6px 14px; border: 1.5px solid var(--bord); border-radius: 999px;
    font-size: .88rem; color: var(--encre); background: #fff; cursor: pointer;
    transition: all var(--transition);
}
.cv-colonnes label:has(input:checked) {
    border-color: var(--cyan-fonce); background: var(--fond-doux);
    color: var(--marine); font-weight: 700;
}
.cv-colonnes input { flex: none; width: 16px; height: 16px; accent-color: var(--cyan-fonce); }

/* ------------------------- LA GRILLE DES LIGNES --------------------------
   Ordre des colonnes : dates, intitulé, précision, lien, corbeille. Chaque
   combinaison a son gabarit ; l'en-tête utilise EXACTEMENT le même, ce qui
   garantit l'alignement sans un seul calcul. */
.cv-entetes, .cv-entree {
    display: grid; gap: 8px; align-items: center;
    grid-template-columns: minmax(0, 1fr) var(--cv-corbeille, 44px);
}
.cv-section--dates .cv-entetes, .cv-section--dates .cv-entree {
    grid-template-columns: 150px minmax(0, 1fr) var(--cv-corbeille, 44px);
}
.cv-section--detail .cv-entetes, .cv-section--detail .cv-entree,
.cv-section--lien .cv-entetes, .cv-section--lien .cv-entree {
    grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) var(--cv-corbeille, 44px);
}
.cv-section--dates.cv-section--detail .cv-entetes, .cv-section--dates.cv-section--detail .cv-entree,
.cv-section--dates.cv-section--lien .cv-entetes, .cv-section--dates.cv-section--lien .cv-entree {
    grid-template-columns: 150px minmax(0, 1.3fr) minmax(0, 1fr) var(--cv-corbeille, 44px);
}
.cv-section--detail.cv-section--lien .cv-entetes, .cv-section--detail.cv-section--lien .cv-entree {
    grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) minmax(0, 1fr) var(--cv-corbeille, 44px);
}
.cv-section--dates.cv-section--detail.cv-section--lien .cv-entetes,
.cv-section--dates.cv-section--detail.cv-section--lien .cv-entree {
    grid-template-columns: 150px minmax(0, 1.2fr) minmax(0, 1fr) minmax(0, 1fr) var(--cv-corbeille, 44px);
}

/* ⚠ VOICI LA VRAIE CAUSE DES « PETITES CASES ». Les champs d'une ligne ne sont
   PAS dans un `.champ` : ils n'héritaient donc ni du cadre, ni du remplissage,
   ni de la hauteur commune du site, et se rendaient à la taille par défaut du
   navigateur — deux fois plus bas que tous les autres champs de la page. On
   leur donne ici la même apparence, explicitement. */
.cv-entree input {
    width: 100%; font: inherit; color: var(--encre);
    height: var(--hauteur-champ, 44px); padding: 0 12px; line-height: 1.4;
    border: 1.5px solid var(--bord); border-radius: var(--rayon-s);
    background: #fff; box-sizing: border-box;
    transition: border-color var(--transition);
}
.cv-entree input:focus {
    outline: 2px solid var(--cyan-fonce); outline-offset: 1px;
    border-color: var(--cyan-fonce);
}
.cv-entree input::placeholder { color: var(--encre-2); opacity: .7; }

/* ⚠ PLANCHER À 12 px (relevé par le harnais de captures, 15/08/2026).
   `.74rem` donnait 11,8 px pour « Dates », « Intitulé », « Précision » — les
   en-têtes qui disent à quoi sert chaque case de l'éditeur de CV. Un en-tête
   qu'on ne lit pas laisse remplir la mauvaise colonne. Les capitales, en
   prime, se lisent moins bien que les minuscules à taille égale. */
.cv-entetes {
    font-size: .78rem; font-weight: 800; text-transform: uppercase;
    letter-spacing: .05em; color: var(--encre-2); margin-bottom: 5px;
}
.cv-entree { margin-bottom: 8px; }

/* ⚠ `display: none` et non `visibility` : une colonne masquée doit SORTIR de
   la grille, sinon elle y laisse une colonne vide et tout se décale. */
.cv-section:not(.cv-section--dates)  [data-nom="periode"],
.cv-section:not(.cv-section--detail) [data-nom="detail"],
.cv-section:not(.cv-section--lien)   [data-nom="lien"] { display: none; }

/* ⚠ PLANCHER EXPLICITE À 40 px (relevé par le harnais, 15/08/2026).
   La hauteur suit `--hauteur-champ` pour rester alignée sur les champs de la
   ligne — mais cette variable est redéfinie plus bas selon le contexte, et la
   croix retombait à 38 px sur téléphone. Deux pixels sous le seuil, sur le
   bouton qui EFFACE une entrée de CV : le rater n'est rien, le toucher par
   erreur en visant son voisin détruit une ligne qu'on vient d'écrire.
   Un plancher vaut mieux qu'une valeur héritée qu'on croit connaître. */
.cv-supprimer {
    width: 44px; height: var(--hauteur-champ, 44px); min-height: 40px; padding: 0;
    display: inline-flex; align-items: center; justify-content: center;
    color: var(--encre-2); font-size: 1.05rem;
}
.cv-supprimer:hover { background: var(--alerte-fond); color: var(--alerte-texte); }
.cv-supprimer-bloc { color: var(--alerte-texte); }
.cv-supprimer-bloc:hover { background: var(--alerte-fond); color: var(--alerte-texte); }
.cv-section__actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }

@media (max-width: 700px) {
    /* Sur téléphone la grille n'a plus de sens : une colonne de 150 px et
       trois champs côte à côte deviennent illisibles. Chaque champ prend la
       ligne, la corbeille se place à droite en dessous, et l'en-tête de
       colonnes disparaît — le texte grisé de chaque champ suffit. */
    .cv-entetes { display: none; }
    /* ⚠ Le `float` de la légende la laissait sur la même ligne que la première
       pastille, les deux autres passant en dessous : trois pastilles réparties
       sur deux lignes autour d'un libellé. Elle prend sa propre ligne. */
    .cv-colonnes legend { float: none; width: 100%; line-height: 1.3; margin: 0 0 8px; }
    /* Un filet à gauche GROUPE les champs d'une même ligne : empilés sans
       repère, six champs à la suite ne disent plus où finit une entrée et où
       commence la suivante. */
    .cv-entree {
        grid-template-columns: minmax(0, 1fr) !important; gap: 6px;
        margin: 0 0 12px; padding: 2px 0 2px 12px;
        border-left: 3px solid var(--bord);
    }
    .cv-section { padding: 14px; }
    .cv-supprimer { justify-self: end; height: 38px; width: 38px; }
}

/* ---------- Fiche praticien : bandeau marine pleine largeur ---------- */
/* Le praticien, sa disponibilité et son tarif tiennent dans un seul bloc en
   haut de page ; les ACTIONS sont sorties du bandeau (Julien, 13/08/2026) et
   posées juste en dessous, centrées. Le CV vit plus bas, sur fond clair.

   ⚠ RESPIRATIONS ACCORDÉES. Le bandeau était payé 18 px en haut et 26 en bas,
   et le bloc suivant repartait sur la marge d'une section ordinaire : trois
   valeurs sans rapport, donc un bandeau qui semblait « posé de travers ».
   Elles découlent maintenant d'une seule variable — la changer déplace tout
   l'ensemble d'un bloc, et rien ne se décale tout seul.
   Cette organisation est la RÉFÉRENCE pour les fiches des confrères qui nous
   rejoindront : aucune mesure en dur, aucun cas particulier par praticien. */

.praticien-bandeau {
    background: var(--marine); color: #fff;
    padding: var(--fiche-respiration) 0;
}
.praticien-bandeau h1 { margin: 0; color: #fff; font-size: clamp(1.55rem, 3.2vw, 2.15rem); }
.fil-ariane--inverse, .fil-ariane--inverse a { color: #BCE4F1; }
.fil-ariane--inverse a:hover { color: #fff; }
/* Le fil d'Ariane fait partie du bandeau : sa marge basse est la respiration
   INTERNE, la moitié de celle des bords. */
.praticien-bandeau .fil-ariane { margin-bottom: calc(var(--fiche-respiration) / 2); }

.praticien-bandeau__grille {
    display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: center; gap: 18px;
}
.praticien-bandeau__photo {
    width: 96px; height: 96px; border-radius: 50%; object-fit: cover;
    border: 3px solid #2E5877; background: var(--marine-2); flex: none;
}
.praticien-bandeau__photo--initiales {
    display: inline-grid; place-items: center;
    font-weight: 900; font-size: 2rem; color: #BCE4F1;
}
.praticien-bandeau__meta { margin: 4px 0 0; color: #BCE4F1; }
.praticien-bandeau__dispo {
    display: flex; align-items: center; gap: 10px; margin: 10px 0 0;
    color: #8BE8B4; font-weight: 700; font-size: .97rem;
}
.praticien-bandeau__tarif { margin: 0; text-align: right; }
.praticien-bandeau__tarif span { display: block; font-size: .85rem; color: #BCE4F1; }
.praticien-bandeau__tarif b { font-size: 1.6rem; font-weight: 800; }

/* LES ACTIONS, sous le bandeau, centrées : à cet endroit de la page, c'est le
   seul geste proposé — il ne se dispute plus la place avec le nom et le tarif. */
.praticien-actions {
    display: flex; flex-wrap: wrap; justify-content: center; gap: 14px;
    padding: var(--fiche-respiration) 20px;
}
/* ⚠ `.btn--large` vaut `width: 100%` sur tout le site : sorti du bandeau, le
   bouton traversait donc la page d'un bord à l'autre — une barre noire de
   1 400 px pour trois mots (constaté par Julien, 13/08/2026). Ici il reprend
   une largeur de bouton : assez large pour se voir, pas au point de devenir
   une bannière. */
.praticien-actions .btn { width: auto; min-width: 240px; max-width: 360px; }

@media (max-width: 560px) {
    /* Sur téléphone, la pleine largeur redevient la bonne réponse : la colonne
       fait déjà la largeur d'un bouton. */
    .praticien-actions .btn { width: 100%; max-width: none; min-width: 0; }
}

@media (max-width: 760px) {
    .praticien-bandeau__grille { grid-template-columns: auto minmax(0, 1fr); }
    .praticien-bandeau__photo { width: 72px; height: 72px; }
    .praticien-bandeau__tarif { grid-column: 1 / -1; text-align: left; }
    .praticien-actions .btn { flex: 1 1 100%; }
}

/* ⚠ La section qui suit les actions ne repart PAS de zéro : les actions
   portent déjà la respiration basse, et l'ajouter deux fois creusait un trou
   entre le bouton et la présentation du médecin. */
.praticien-actions + .section { padding-top: 0; }

/* Pleine largeur (Julien, 11/08) : l'intro dit où le médecin exerce vraiment,
   elle tient sur une ou deux lignes et ne doit pas être bridée en colonne. */
.praticien-intro { font-size: 1.05rem; margin: 0 0 8px; }


/* ---------- CV du praticien (rendu générique, cf. partials/cv-praticien) ---------- */
.cv__bloc { margin-top: 30px; }
.cv__titre {
    font-size: 1.15rem; margin: 0 0 12px; padding-bottom: 8px;
    border-bottom: 1px solid var(--bord);
}
.cv__chrono, .cv__liste { list-style: none; margin: 0; padding: 0; }
.cv__chrono > li {
    display: grid; grid-template-columns: 130px minmax(0, 1fr); gap: 16px;
    padding: 11px 0; border-bottom: 1px solid var(--bord);
}
.cv__periode { color: var(--cyan-fonce); font-weight: 800; font-size: .92rem; }
.cv__corps { display: block; }
.cv__intitule { display: block; color: var(--marine); font-weight: 700; }
.cv__lien { color: var(--cyan-fonce); text-decoration: underline; }
.cv__lien:hover { color: var(--marine); }
.cv__detail { display: block; color: var(--encre-2); font-size: .95rem; }
/* Section non datée (diplômes) : liste sur deux colonnes, sans années. */
.cv__liste { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 26px; }
.cv__liste > li {
    padding-left: 18px; position: relative;
}
.cv__liste > li::before {
    content: ""; position: absolute; left: 0; top: .55em;
    width: 7px; height: 7px; border-radius: 50%; background: var(--cyan);
}
@media (max-width: 760px) {
    .cv__chrono > li { grid-template-columns: 1fr; gap: 2px; }
    .cv__liste { grid-template-columns: 1fr; }
}

.fiche__walkin {
    display: flex; align-items: center; gap: 10px; margin: 0;
    color: #1B7A43; font-weight: 700; font-size: .97rem;
}
.dot {
    width: 10px; height: 10px; border-radius: 50%; background: #2FB56B; flex: 0 0 auto;
    /* Halo statique = état de repli. Il reste visible si l'animation est coupée
       (prefers-reduced-motion, ligne 56), le rond ne perd jamais son relief. */
    box-shadow: 0 0 0 4px rgba(47, 181, 107, .18);
    /* Pulsation reprise des autres sites de Julien (tc.css « tcpulse ») : le rond
       respire, le patient comprend que la disponibilité est relevée en direct. */
    animation: dot-pulse 1.6s ease-out infinite;
}
@keyframes dot-pulse {
    0%   { box-shadow: 0 0 0 0 rgba(47, 181, 107, .55); }
    70%  { box-shadow: 0 0 0 9px rgba(47, 181, 107, 0); }
    100% { box-shadow: 0 0 0 0 rgba(47, 181, 107, 0); }
}

/* ---------- Encart cookies ---------- */
.rgpd {
    position: fixed; z-index: 90; left: 16px; right: 16px; bottom: 16px;
    display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
    max-width: 720px; margin-inline: auto;
    background: #fff; border: 1px solid var(--bord); border-radius: var(--rayon);
    box-shadow: 0 12px 40px rgba(16, 31, 45, .18);
    padding: 16px 20px;
}
.rgpd[hidden] { display: none; }
/* Tant que le bandeau est affiché, on libère l'espace correspondant en bas de
   page : sinon il recouvre les derniers champs des formulaires. */
body:has(.rgpd:not([hidden])) { padding-bottom: 132px; }
@media (max-width: 700px) { body:has(.rgpd:not([hidden])) { padding-bottom: 210px; } }
.rgpd p { margin: 0; flex: 1 1 320px; font-size: .95rem; }
.rgpd .btn { padding: 9px 20px; font-size: .95rem; }

/* ---------- Tunnel de réservation (4b→4e) ---------- */
.tunnel__inner { max-width: 780px; }

/* ═══ DENSITÉ DU TUNNEL ═══
   Les formulaires du parcours patient étaient dessinés aux dimensions des
   pages de présentation : titres de 30 px, champs de 54 px, cartes de choix
   de 30 px de rembourrage. Sur un écran d'ordinateur, une étape simple
   occupait deux hauteurs de fenêtre — le patient défilait pour trouver le
   bouton, et l'ensemble faisait « site vitrine » plutôt que « formulaire
   médical ». On resserre, à l'image du module du Dr Gozlan.

   ⚠ Portée limitée à `.tunnel` : la console et l'espace admin gardent leurs
   dimensions, qui sont réglées pour un autre usage. */
.tunnel { --hauteur-champ: 44px; padding: 26px 0 44px; }
.tunnel .carte-tunnel { padding: clamp(18px, 2.6vw, 30px); }
.tunnel .carte-tunnel h1 { font-size: clamp(1.15rem, 2.2vw, 1.42rem); margin-bottom: .5em; }
.tunnel .carte-tunnel .aide { font-size: .9rem; }
.tunnel .sous-titre { margin-top: 1.3em; margin-bottom: .7em; font-size: 1rem; }

.tunnel .champ { margin-bottom: 13px; }
.tunnel .champ label { font-size: .88rem; margin-bottom: 4px; }
.tunnel .champ input, .tunnel .champ select, .tunnel .champ textarea {
    padding: 9px 12px; font-size: .95rem;
}
.tunnel .champ select { padding-right: 38px; background-position: right 12px center; }

/* ⚠ LES RÈGLES `.tunnel …` QUI VIVAIENT ICI ONT ÉTÉ RETIRÉES le 13/08/2026.
   Elles doublaient et contredisaient `public/css/tunnel.css`, qui est chargé
   APRÈS : deux modèles de « choix » se cumulaient — l'un met la bordure sur la
   carte (modèle DG), l'autre sur le texte qu'elle contient (ancien modèle
   pastille) — et le patient voyait un cadre dans un cadre.
   Tout ce qui concerne le tunnel vit désormais dans tunnel.css, et nulle part
   ailleurs. */


/* ⚠ `.tunnel-praticien__nom` et `__meta` ONT ÉTÉ RETIRÉS le 19/08/2026 —
   dernières survivantes du bloc « tunnel maison » supprimé le matin même. Mon
   nettoyage visait `.tunnel-praticien` avec une limite de mot : les variantes
   `__nom` et `__meta` y échappaient, et sont restées seules SOUS le commentaire
   qui dit que rien du tunnel ne vit plus ici. Une expression régulière qui
   borne trop laisse exactement ce genre de reste. */


.carte-tunnel {
    background: #fff; border: 1px solid var(--bord); border-radius: var(--rayon);
    box-shadow: var(--ombre); padding: clamp(24px, 4vw, 40px);
}
.carte-tunnel h1 { font-size: clamp(1.45rem, 3vw, 1.9rem); }
.carte-tunnel .aide { color: var(--encre-2); }
.sous-titre { margin-top: 1.6em; font-size: 1.1rem; }

.champ { margin: 0 0 18px; }
.champ label { display: block; font-weight: 700; color: var(--marine); margin-bottom: 6px; }
.champ input:not([type="checkbox"]):not([type="radio"]),
.champ select, .champ textarea {
    width: 100%; font: inherit; color: var(--encre);
    padding: 12px 14px; border: 1.5px solid var(--bord); border-radius: var(--rayon-s);
    background: #fff; transition: border-color var(--transition);
    box-sizing: border-box;
}

/* LIGNE « CASE À COCHER + LIBELLÉ ».
   `align-items: flex-start` et non `center` : sur téléphone le libellé passe
   sur deux ou trois lignes, et une case centrée verticalement se retrouve au
   milieu du paragraphe au lieu d'être en face de sa première ligne.
   `flex: none` sur la case : sans cela elle se laisse comprimer par un long
   libellé et devient un rectangle de deux pixels. */


/* Hauteur IDENTIQUE pour tous les champs d'une même ligne (texte, date, liste).
   Sans cela le navigateur rend la date 2 px plus haute et la liste 3 px plus
   basse que les champs texte, ce qui se voit immédiatement côte à côte. */
.champ input:not([type="checkbox"]):not([type="radio"]),
.champ select {
    height: var(--hauteur-champ, 54px);
    line-height: 1.65;
}
.champ textarea { min-height: var(--hauteur-champ, 54px); line-height: 1.6; }

/* Certains navigateurs (Chrome, Safari) ajoutent leur propre gabarit interne
   aux champs de date : on le neutralise. */
.champ input[type="date"] { -webkit-appearance: none; appearance: none; }
.champ input[type="date"]::-webkit-date-and-time-value { text-align: left; }
.champ input[type="date"]::-webkit-datetime-edit { line-height: 1.65; padding: 0; }

/* Liste déroulante : flèche maison, rendu identique sur tous les navigateurs
   (le rendu natif diffère fortement entre Chrome, Safari et Firefox mobile). */
.champ select {
    -webkit-appearance: none; appearance: none;
    padding-right: 42px;
    background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2322364A' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 14px center;
    cursor: pointer;
}
.champ input:focus, .champ select:focus, .champ textarea:focus {
    outline: none; border-color: var(--cyan); box-shadow: 0 0 0 3px rgba(20, 178, 217, .18);
}
.champ--code { max-width: 190px; font-size: 1.5rem; letter-spacing: .35em; text-align: center; height: 62px; }

/* ---------- Code SMS : six cases sur toute la largeur ---------- */
.code-cases__legende {
    display: block; font-weight: 700; color: var(--marine); margin-bottom: 8px;
}
.code-cases__grille { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: clamp(6px, 1.6vw, 14px); }
.code-case {
    width: 100%; min-width: 0; height: clamp(56px, 12vw, 72px);
    font: 800 clamp(1.4rem, 5vw, 1.9rem)/1 var(--police); color: var(--marine);
    text-align: center; background: #fff;
    border: 1.5px solid var(--bord); border-radius: var(--rayon-s);
    transition: border-color var(--transition), box-shadow var(--transition);
    -webkit-appearance: none; appearance: none;
}
.code-case:focus {
    outline: none; border-color: var(--cyan-fonce);
    box-shadow: 0 0 0 3px rgba(14, 124, 153, .18);
}
/* Le code est complet : les six cases le disent avant même l'envoi. */
.code-cases--complet .code-case { border-color: #2FB56B; }
.champ-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; }
@media (max-width: 560px) { .champ-duo { grid-template-columns: 1fr; } }

.erreur { color: #A5372B; font-weight: 700; font-size: .92rem; margin: 6px 0 0; }
.erreur--bloc {
    background: var(--alerte-fond); border: 1px solid var(--alerte-bord);
    border-radius: var(--rayon-s); padding: 10px 14px; margin-bottom: 16px;
}

/* ---------------------------- PILULES DE FILTRE ---------------------------
   ⚠ DÉFAUT CORRIGÉ LE 20/08/2026, et il ne se voyait que sur UN écran.
   Ce composant avait été écrit pour un <label> enveloppant un radio invisible :
   tout le dessin — bordure, fond, espacement — vivait sur le <span> INTÉRIEUR.
   L'admin, lui, s'en sert en NAVIGATION, avec un <a> sans span : l'ancre ne
   recevait donc que `display:block`, et les quatre filtres de
   `/admin/candidatures` s'affichaient en quatre lignes nues. Pire, la pilule
   active recevait bien son fond cyan — sans le moindre espacement autour du
   texte. Rien ne le signalait : la page répondait 200, les liens marchaient.
   La forme <label>+<input> n'est plus utilisée nulle part (le questionnaire de
   santé est passé aux `tc-choice`) ; elle est conservée par prudence, mais le
   dessin est désormais posé sur les DEUX formes à la fois. */
.pilules { border: 0; padding: 0; margin: 0 0 20px; display: flex; flex-wrap: wrap; gap: 10px; }
.pilule { position: relative; display: block; }
.pilule input { position: absolute; opacity: 0; inset: 0; }

.pilule > span,
a.pilule {
    display: flex; align-items: center; gap: 9px;
    padding: 11px 14px 11px 18px; border-radius: 999px;
    border: 1.5px solid var(--bord); background: #fff;
    font-weight: 700; font-size: .95rem; color: var(--marine);
    text-decoration: none; cursor: pointer; transition: all var(--transition);
}
a.pilule:hover { border-color: var(--cyan-fonce); color: var(--cyan-fonce); text-decoration: none; }

/* Le compte, en pastille : lu d'un coup d'œil, et aligné d'une pilule à
   l'autre quel que soit le nombre de chiffres. */
.pilule__n {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 26px; height: 22px; padding: 0 7px; border-radius: 999px;
    background: var(--fond-doux); color: var(--encre-2);
    font-size: .8rem; font-weight: 800; font-variant-numeric: tabular-nums;
    border: 1px solid var(--bord);
}
/* Un zéro ne réclame pas l'attention : il s'efface, sans disparaître. */
.pilule__n--vide { color: var(--encre-2); opacity: .65; }

/* ⚠ CE QUI RESTE À FAIRE SE VOIT DE LOIN. « À examiner » avec au moins un
   dossier est la seule case de cet écran qui appelle un geste : elle porte
   donc un compte en couleur, là où les autres ne font qu'informer. */
.pilule__n--afaire { background: var(--succes-fond); border-color: var(--succes-bord); color: var(--succes); }

.pilule input:checked + span,
a.pilule--active {
    background: var(--cyan-fonce); border-color: var(--cyan-fonce); color: #fff;
}
a.pilule--active:hover { background: var(--cyan-sombre); border-color: var(--cyan-sombre); color: #fff; }
.pilule--active .pilule__n {
    background: rgba(255, 255, 255, .22); border-color: rgba(255, 255, 255, .35); color: #fff;
}
.pilule input:focus-visible + span,
a.pilule:focus-visible { outline: 3px solid var(--cyan-fonce); outline-offset: 2px; }

/* Choix d'entrée de parcours (« pour qui ? ») : deux grandes cartes plutôt que
   deux petites pastilles. C'est la première décision du patient, elle doit se
   voir de loin et se toucher sans viser. */


@media (max-width: 560px) {

}


.recap { display: grid; gap: 10px; margin: 0 0 20px; padding: 18px 20px;
    background: var(--fond-doux); border-radius: var(--rayon-s); }
.recap div { display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.recap dt { color: var(--encre-2); font-weight: 700; }
.recap dd { margin: 0; color: var(--marine); font-weight: 800; text-align: right; }


.btn--large { width: 100%; padding: 15px 24px; font-size: 1.05rem; margin-top: 6px; }


.carte-tunnel--confirmation { text-align: center; }
.confirmation-coche {
    display: inline-grid; place-items: center; width: 72px; height: 72px;
    border-radius: 50%; background: var(--succes-fond); color: #1B7A43; margin-bottom: 14px;
}
.confirmation-coche svg { width: 38px; height: 38px; }

/* ---------- Espace patient ---------- */
.espace-entete {
    display: flex; justify-content: space-between; align-items: center;
    gap: 16px; flex-wrap: wrap; margin-bottom: 26px;
}
.espace-entete h1 { margin-bottom: .1em; }

/* ------------------------------------------------------------------------
   ⛔ `.fiche-grille` A ÉTÉ SUPPRIMÉE LE 17/08/2026 — c'était du CSS mort.

   Elle déclarait une grille de quatre colonnes pour « les traits d'identité,
   en lecture », avec en commentaire toute la leçon de §21.12. Vérifié sur le
   dépôt entier : AUCUNE vue ne portait cette classe. Le dossier de l'espace
   patient et celui de la fiche patient sont des `<dl class="fiche-liste">`.

   Elle n'a pas seulement dormi : l'audit du 17/08 s'en est servi comme d'une
   PREUVE pour écarter le défaut §21.12 (« la seule grille voisine,
   .fiche-grille, a quatre colonnes uniformes »). Un raisonnement juste, sur
   une règle qui ne s'appliquait à rien. C'est §21.10 par l'autre bout : on
   cherche du code mort en croyant qu'il est vivant, ici on a cru vivante une
   règle morte — et elle a servi d'argument.

   Si une grille de dossier redevient nécessaire, la reprendre de DG en la
   MESURANT : 4 colonnes, gouttières 20 px / 6 px, 2 colonnes à 880 px, 1 à
   520 px (docs/dg-reference/console/MESURES-REELLES.md §5).
   ------------------------------------------------------------------------ */

/* ------------------------------------------------------------------------
   SÉLECTEUR DE PERSONNE de l'espace patient (§9 de la spécification DG).

   Une barre de gélules : le titulaire d'abord, puis les enfants. Sur mobile
   elle DÉFILE horizontalement plutôt que de passer à la ligne — un compte de
   trois enfants occuperait sinon deux rangées avant le moindre contenu, et
   c'est exactement le défaut qu'on vient de corriger dans la console.
   ------------------------------------------------------------------------ */
.pt-personnes {
    display: flex; gap: 8px; margin: 0 0 22px; padding-bottom: 4px;
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity; scrollbar-width: none;
}
.pt-personnes::-webkit-scrollbar { display: none; }
.pt-personne {
    flex: 0 0 auto; scroll-snap-align: start;
    text-decoration: none; font-weight: 700; color: var(--marine);
    background: var(--fond-doux); border: 1.5px solid var(--bord);
    padding: 8px 16px; border-radius: 999px; transition: all var(--transition);
    white-space: nowrap;
}
.pt-personne:hover { border-color: var(--cyan); color: var(--marine); }
/* La gélule active est PLEINE (spécification DG) : sur une barre qui défile,
   une simple bordure ne se repère pas au premier regard. */
.pt-personne--actif {
    background: var(--cyan-fonce); border-color: var(--cyan-fonce); color: #fff;
}
.pt-personne--actif:hover { color: #fff; }
.rdv-liste { list-style: none; display: grid; gap: 14px; margin-bottom: 34px; }
.rdv-carte {
    display: flex; gap: 16px; align-items: center; flex-wrap: wrap;
    background: #fff; border: 1px solid var(--bord); border-radius: var(--rayon);
    box-shadow: var(--ombre); padding: 16px 20px;
}
.rdv-carte__date {
    text-align: center; background: var(--fond-doux); border-radius: var(--rayon-s);
    padding: 8px 14px; font-weight: 800; color: var(--marine); min-width: 92px;
    font-variant-numeric: tabular-nums;
}
.rdv-carte__date span {
    display: block; font-size: .78rem; color: var(--cyan-fonce);
    font-weight: 800; text-transform: uppercase; letter-spacing: .05em;
}
.rdv-carte__infos { flex: 1; min-width: 220px; }
.rdv-carte__infos h3 { margin: 0 0 2px; }
.rdv-carte__meta { margin: 0; color: var(--encre-2); font-size: .94rem; }
.statut {
    font-size: .78rem; font-weight: 800; padding: 5px 13px; border-radius: 999px;
    background: var(--fond-doux); color: var(--cyan-fonce);
    text-transform: uppercase; letter-spacing: .04em; white-space: nowrap;
}
.statut--confirmed { background: var(--succes-fond); color: #1B7A43; }
.statut--done { background: var(--bord); color: var(--encre-2); }
.statut--cancelled, .statut--noshow { background: var(--alerte-fond); color: var(--alerte-texte); }
/* Une consultation EN COURS doit sauter aux yeux : c'est la seule ligne de
   la journée qui demande une action immédiate. */
.statut--in_progress { background: var(--cyan-fonce); color: #fff; }
.statut--waiting { background: #FFF4DA; color: #8A5A00; }


/* Bandeau discret quand la file a changé : on prévient, on n'interrompt pas
   une saisie en cours en rechargeant la page dans le dos du praticien. */
.pouls {
    display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
    background: #FFF4DA; border: 1.5px solid #E9C97A; color: #6B4700;
    padding: 12px 18px; border-radius: 12px; margin: 0 0 22px; font-weight: 700;
}

/* ⚠ RÈGLE GÉNÉRALE — DÉJÀ PAYÉE DEUX FOIS.
   Le navigateur attache `display:none` à [hidden] avec la spécificité d'un
   SÉLECTEUR D'ATTRIBUT. N'importe quelle classe qui pose un `display` la bat :
   `.pouls { display:flex }` rendait le bandeau « la liste a changé » visible en
   permanence, quoi que fasse le JavaScript — et le bouton « Actualiser »
   rechargeait une page qui le réaffichait aussitôt. Même défaut que
   `.consult-live` dans la console de consultation (corrigé le 10/08).
   Cette règle ferme le sujet pour toutes les feuilles du site. */
[hidden] { display: none !important; }

/* Ouverture du sans-rendez-vous, avec sa durée. */
.sansrdv { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.sansrdv label { font-weight: 700; color: var(--encre-2); font-size: .92rem; }
.sansrdv select { height: 42px; padding: 0 34px 0 12px; }
.sansrdv__etat {
    display: inline-flex; align-items: center; gap: 8px;
    background: var(--succes-fond); color: #1B7A43; font-weight: 800; font-size: .88rem;
    padding: 8px 16px; border-radius: 999px; white-space: nowrap;
}
.btn--petit { padding: 9px 16px; font-size: .9rem; }


/* Fiche patient : deux colonnes libellé / valeur, qui se replient sur mobile. */
.fiche-liste { display: grid; grid-template-columns: minmax(180px, 34%) 1fr; gap: 8px 22px; margin: 0; }
.fiche-liste dt { font-weight: 700; color: var(--encre-2); }
.fiche-liste dd { margin: 0; color: var(--marine); }
@media (max-width: 640px) {
    .fiche-liste { grid-template-columns: 1fr; gap: 2px; }
    .fiche-liste dd { margin: 0 0 10px; }
}
.liste-simple { list-style: none; margin: 0; padding: 0; }
.liste-simple li { padding: 7px 0; border-bottom: 1px solid var(--bord); }
.liste-simple li:last-child { border-bottom: 0; }

/* Corbeille : une action irréversible ne se propose pas comme les autres. */


.btn:disabled { opacity: .45; cursor: not-allowed; }


/* ---------- Console praticien (5a) ---------- */

.flash-ok {
    background: var(--succes-fond); border: 1px solid #BFE8D0; color: #1B7A43;
    border-radius: var(--rayon-s); padding: 12px 18px; font-weight: 700;
    margin-bottom: 22px;
}

/* ---------- Éditeur d'ordonnance (5b) ---------- */


.rx-ajout { display: flex; gap: 12px; align-items: end; flex-wrap: wrap; margin-top: 14px; }
.rx-ajout .champ { flex: 1 1 280px; margin: 0; }
.rx-autocomplete { position: relative; }
.rx-suggestions {
    position: absolute; z-index: 30; left: 0; right: 0; top: 100%;
    list-style: none; background: #fff; border: 1px solid var(--bord);
    border-radius: var(--rayon-s); box-shadow: var(--ombre);
    max-height: 280px; overflow-y: auto;
}
.rx-suggestions button {
    display: block; width: 100%; text-align: left; background: none; border: 0;
    padding: 10px 14px; font: inherit; color: var(--marine); cursor: pointer;
}
.rx-suggestions button:hover { background: var(--fond-doux); }

.rx-ajout--types { margin-top: 10px; }
.rx-ajout--types .btn { padding: 9px 16px; font-size: .93rem; }


/* Alignement du texte libre : pose [l] / [c] / [r] en tête de ligne, marqueurs
   appliqués au PDF par DocumentService. */
.rx-align { display: flex; align-items: center; gap: 5px; }
.rx-align__legende { font-size: .72rem; color: var(--encre-2); margin-right: 2px; }
.rx-align__bouton {
    width: 32px; height: 24px; padding: 0; cursor: pointer;
    border: 1px solid var(--bord); border-radius: 6px; background: #fff;
    font: inherit; font-size: .72rem; font-weight: 800; color: var(--marine);
}
.rx-align__bouton:hover { border-color: var(--cyan); background: var(--fond-doux); }

/* ---------- Documents (5c) ---------- */
.docs-liste { list-style: none; display: grid; gap: 8px; margin: 0 0 16px; }
.docs-liste li {
    display: flex; justify-content: space-between; gap: 12px; align-items: baseline;
    padding: 10px 14px; background: var(--fond-doux); border-radius: var(--rayon-s);
}
.docs-liste a { font-weight: 700; }

.recap--verification div { flex-wrap: wrap; }

/* ---------- 5d/5e : file, agenda, comptabilité ---------- */
.banniere-maintenant {
    display: flex; align-items: center; gap: 12px;
    background: var(--succes-fond); border: 1.5px solid var(--succes-bord); color: var(--succes-texte);
    border-radius: var(--rayon); padding: 16px 20px; margin-bottom: 22px;
    text-decoration: none; font-size: 1.02rem; transition: border-color var(--transition);
}
.banniere-maintenant:hover { border-color: #2FB56B; color: var(--succes-texte); }
.console-nav { display: flex; gap: 8px; flex-wrap: wrap; margin: 0 0 26px; }
.console-nav a {
    text-decoration: none; font-weight: 700; color: var(--marine);
    background: var(--fond-doux); border: 1.5px solid var(--bord);
    padding: 9px 18px; border-radius: 999px; transition: all var(--transition);
}
.console-nav a:hover { border-color: var(--cyan); }
/* Encaissements : barre de navigation mensuelle, dans la forme de la console
   de DG. Le tableau lui-même est traité plus bas, avec TOUS les tableaux. */
.enc-nav { display: flex; align-items: center; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; }
.enc-fleche {
    width: 40px; height: 40px; display: flex; align-items: center; justify-content: center;
    border: 1.5px solid var(--bord); border-radius: 10px; text-decoration: none;
    color: var(--cyan-fonce); font-size: 1.9rem; line-height: 1; font-weight: 800;
}
.enc-fleche:hover { background: var(--fond-doux); border-color: var(--cyan); }
.enc-mois {
    font-size: 1.15rem; font-weight: 800; color: var(--marine);
    min-width: 180px; text-align: center; text-transform: capitalize;
}
.enc-total { margin-left: auto; color: var(--marine); font-size: 1.05rem; }
.enc-total b { color: var(--cyan-fonce); }
.enc-defilement { overflow-x: auto; }
@media (max-width: 640px) {
    .enc-mois { flex: 1 1 auto; min-width: 0; }
    .enc-total { flex-basis: 100%; margin-left: 0; text-align: right; }
}

/* ------------------------- TABLEAUX DE LA CONSOLE ------------------------ */
/* UNE SEULE mise en forme pour tous les tableaux (encaissements, journal des
   accès, patientèle…), et UNE SEULE bascule mobile : sous 640 px chaque LIGNE
   devient une FICHE, et chaque cellule affiche son libellé de colonne, repris
   de l'attribut `data-libelle`.
   C'est le mécanisme de la console de DG (docs/dg-reference/console/) et c'est
   la partie la plus rentable de cette feuille de style : tout nouvel écran à
   tableau devient lisible sur téléphone SANS une ligne de CSS supplémentaire —
   il suffit de poser `data-libelle` sur les cellules.
   ⚠ La première colonne (le <th> de la ligne : le nom du patient, la date)
   reste le TITRE de la fiche : elle remonte en tête (`order: -1`), sans libellé
   et en gras. Une cellule vide est masquée : une fiche ne doit pas afficher
   « Objet — » sur une ligne qui n'a rien à dire. */
.enc-table, .tableau { width: 100%; border-collapse: collapse; }
.enc-table th, .enc-table td, .tableau th, .tableau td {
    padding: 11px 12px; text-align: left; border-bottom: 1px solid var(--bord);
    font-size: .95rem; vertical-align: baseline;
}
.enc-table thead th, .tableau thead th {
    font-size: .8rem; text-transform: uppercase; letter-spacing: .05em;
    color: var(--encre-2); font-weight: 800;
}
.enc-table tbody th, .tableau tbody th { font-weight: 700; color: var(--marine); }
.enc-table tbody tr:last-child th, .enc-table tbody tr:last-child td,
.tableau tbody tr:last-child th, .tableau tbody tr:last-child td { border-bottom: 0; }
.enc-droite { text-align: right; }
/* Actions de rattrapage : côte à côte quand il y a la place, empilées sinon.
   Un seul bouton par ligne dans le cas courant — les trois ne peuvent pas
   coexister, un paiement n'ayant qu'un état à la fois. */
.enc-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.enc-actions form { margin: 0; }
@media (max-width: 640px) {
    .enc-table, .tableau,
    .enc-table tbody, .tableau tbody { display: block; }
    .enc-table thead, .tableau thead {
        position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%);
    }
    /* La ligne devient une FICHE. */
    .enc-table tbody tr, .tableau tbody tr {
        display: flex; flex-direction: column; gap: 4px;
        background: #fff; border: 1px solid var(--bord); border-radius: 11px;
        padding: 11px 13px; margin-bottom: 11px; box-shadow: 0 1px 2px rgba(16,31,45,.05);
    }
    .enc-table tbody tr:last-child, .tableau tbody tr:last-child { margin-bottom: 0; }
    .enc-table th, .enc-table td, .tableau th, .tableau td {
        display: flex; justify-content: space-between; gap: 16px;
        border: 0; padding: 0; font-size: .93rem;
    }
    .enc-table td::before, .tableau td::before {
        content: attr(data-libelle); color: var(--encre-2); font-weight: 700;
        flex: none; max-width: 45%;
    }
    /* Titre de la fiche : le <th> de la ligne, ou la cellule marquée. */
    .enc-table tbody th, .tableau tbody th {
        order: -1; display: block; font-size: 1.05rem; font-weight: 800;
        color: var(--marine); padding-bottom: 7px; margin-bottom: 3px;
        border-bottom: 1px solid var(--bord);
    }
    .enc-table td:empty, .tableau td:empty { display: none; }
    .enc-droite { text-align: left; }
    .tableau-encadre { border: 0; background: none; padding: 0; overflow: visible; }
}

input[type="month"], input[type="search"] {
    font: inherit; padding: 10px 14px; border: 1.5px solid var(--bord);
    border-radius: var(--rayon-s); background: #fff;
}

/* Inscription praticien + espace admin */
a.pilule { text-decoration: none; color: inherit; }
/* (le style de `.pilule--active` a rejoint le bloc des pilules, plus haut :
   écrit à deux endroits, il ne posait ici ni espacement ni bordure.) */

/* Visioconférence (salle d'attente + console) */


@media (max-width: 700px) { }

/* ---------- Page « rejoindre » : arguments et dossier ----------
   Le composant .recap était détourné ici : il aligne ses valeurs à DROITE et en
   gras, ce qui convient à « Praticien / Dr Martin » mais transformait chaque
   argument en pavé illisible poussé contre la marge. Un argument = un titre et
   un texte courant, alignés à gauche. */
.atouts { margin: 26px 0 30px; padding: 0; display: grid; gap: 2px; }
.atouts__item { background: var(--fond-doux); padding: 16px 20px; }
.atouts__item:first-child { border-radius: var(--rayon-s) var(--rayon-s) 0 0; }
.atouts__item:last-child { border-radius: 0 0 var(--rayon-s) var(--rayon-s); }
.atouts dt {
    /* La coche reste sur la PREMIÈRE ligne du titre : centrée, elle flottait au
       milieu d'un titre replié sur deux lignes en mobile. */
    display: flex; align-items: flex-start; gap: 10px;
    color: var(--marine); font-weight: 800; font-size: 1.03rem; margin-bottom: 5px;
}
.atouts dt svg { width: 20px; height: 20px; flex: none; color: var(--cyan-fonce); margin-top: 2px; }
.atouts dd {
    margin: 0; padding-left: 30px; text-align: left;
    color: var(--encre-2); font-weight: 500; line-height: 1.62;
}
.atouts dd strong { color: var(--marine); font-weight: 800; }

.dossier__titre {
    margin: 22px 0 10px; font-size: 1rem; font-weight: 800; color: var(--marine);
}
.dossier-liste { list-style: none; margin: 0 0 6px; padding: 0; display: grid; gap: 8px; }
/* Deux colonnes en flux (et non en grille) : avec une grille, un libellé qui
   passe sur deux lignes creusait un blanc sous son voisin. */
.dossier-liste--deux { display: block; columns: 2; column-gap: 28px; }
.dossier-liste--deux li { break-inside: avoid; margin-bottom: 8px; }
@media (max-width: 620px) { .dossier-liste--deux { columns: 1; } }
.dossier-liste li {
    position: relative; padding-left: 26px; color: var(--encre-2); line-height: 1.5;
}
.dossier-liste li::before {
    content: ""; position: absolute; left: 0; top: .42em;
    width: 14px; height: 14px; border-radius: 50%;
    background: var(--cyan-fonce);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2a10 10 0 100 20 10 10 0 000-20zm-1.2 13.6L7 11.8l1.5-1.5 2.3 2.3 4.7-4.7L17 9.4l-6.2 6.2z'/%3E%3C/svg%3E") center/contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2a10 10 0 100 20 10 10 0 000-20zm-1.2 13.6L7 11.8l1.5-1.5 2.3 2.3 4.7-4.7L17 9.4l-6.2 6.2z'/%3E%3C/svg%3E") center/contain no-repeat;
}
.dossier-liste li strong { color: var(--marine); font-weight: 800; }

/* Appel à l'action : le renvoi vers la console est une porte SECONDAIRE ;
   collé sous le bouton et aligné à gauche, il ressemblait à une note oubliée. */
.rejoindre-action { margin-top: 30px; }
.action-secondaire {
    margin: 20px 0 0; padding-top: 18px; border-top: 1px solid var(--bord);
    text-align: center; color: var(--encre-2); font-size: .95rem;
}
.action-secondaire a { font-weight: 700; }

/* ⚠ `.choix-praticien*` (13 règles) A ÉTÉ RETIRÉ le 19/08/2026. Il habillait
   l'écran « choisir un praticien pour une consultation immédiate », supprimé
   avec la FUSION DES PARCOURS du 14/08/2026 : une consultation immédiate est
   désormais une réponse à « quand ? » dans le tunnel du praticien qu'on a déjà
   choisi. Aucune vue, aucun script ne l'émettait plus. */

/* ============================ PAGES LÉGALES =============================
   Quatre pages de texte long : mentions légales, CGU, confidentialité,
   accessibilité. Une seule mise en forme, posée sur le socle partagé.

   La largeur est bornée à 68 caractères environ : au-delà, l'œil perd la
   ligne au retour à la ligne suivante — ce qui, sur un site d'ophtalmologie
   qui reçoit des patients qui voient mal, serait une faute de goût doublée
   d'une faute d'accessibilité. */
.legal { max-width: 760px; }
.legal h2 {
    font-size: 1.28rem; color: var(--marine); margin: 40px 0 12px;
    padding-top: 22px; border-top: 1px solid var(--bord);
}
.legal h3 { font-size: 1.05rem; color: var(--marine); margin: 26px 0 8px; }
.legal p, .legal li { line-height: 1.72; }
.legal p { margin: 0 0 14px; }
.legal__maj { color: var(--encre-2); font-size: .92rem; margin-bottom: 24px; }
.legal__chapeau {
    background: var(--fond-doux); border-left: 4px solid var(--cyan);
    border-radius: 0 var(--rayon-s) var(--rayon-s) 0; padding: 16px 20px; margin-bottom: 8px;
}
.legal__chapeau p { margin: 0; color: var(--encre); }

/* Définitions : libellé au-dessus de la valeur sur téléphone, en colonnes
   ailleurs. Un <dl> en deux colonnes fixes casse dès qu'un libellé est long. */
.legal__liste { display: grid; grid-template-columns: 250px 1fr; gap: 4px 20px; margin: 0 0 18px; }
.legal__liste dt { color: var(--encre-2); font-weight: 700; font-size: .93rem; }
.legal__liste dd { margin: 0; color: var(--encre); }
@media (max-width: 640px) {
    .legal__liste { grid-template-columns: 1fr; gap: 2px; }
    .legal__liste dd { margin-bottom: 12px; }
}

.legal__points { margin: 0 0 16px; padding-left: 22px; display: grid; gap: 9px; }
.legal__points li { padding-left: 2px; }

/* Une précision qui engage : encadrée, pour qu'on ne la lise pas en diagonale. */
.legal__note {
    background: var(--fond-doux); border: 1px solid var(--bord);
    border-radius: var(--rayon-s); padding: 13px 16px; margin: 0 0 16px;
    font-size: .94rem; color: var(--encre-2);
}
/* Les urgences : le seul bloc rouge de ces pages. S'il y en avait deux, il
   n'y en aurait aucun. */
.legal__alerte {
    background: var(--alerte-fond); border: 1.5px solid var(--alerte-bord);
    color: var(--alerte-texte); border-radius: var(--rayon-s);
    padding: 15px 18px; margin: 0 0 18px;
}
.legal__pied {
    margin-top: 40px; padding-top: 20px; border-top: 1px solid var(--bord);
    color: var(--encre-2); font-size: .94rem;
}
.legal .tableau { margin-bottom: 18px; }
.legal .tableau td, .legal .tableau th { font-size: .92rem; line-height: 1.55; }

/* ======================= PAGES ÉDITORIALES PAR MOTIF ====================
   FORMAT ÉDITORIAL (20/08/2026) — mise en page reprise du site du
   Dr Nathalie Gozlan (drnathaliegozlan.co.il), aux couleurs de Totodoc.

   ⚠ POURQUOI CET ÉCART DE COULEURS EST VOULU. Chez NG, le bleu vif sert de
   couleur de TEXTE (dates, sommaire, « lire l'article »). Le cyan de Totodoc
   porte en toutes lettres, dans `jetons.css`, la mention « DÉCORATIF
   uniquement (pas AA) » : l'employer là aurait cassé le contraste exigé par
   WCAG 2.1 AA, obligatoire depuis l'EAA. Tout ce qui est TEXTE prend donc
   `--cyan-fonce` ; `--cyan` ne sert qu'aux filets et aux aplats.

   La structure, elle, est celle de NG à l'identique : bandeau de titre,
   encart auteur, chapô, sommaire, corps en h2, FAQ dépliante, encart
   d'appel, sources, « à lire aussi ». Voir `docs/ARTICLES.md`. */
.motif { max-width: 100%; padding: 0; }
.art-bandeau { max-width: 780px; margin-inline: auto; }
.art { max-width: 780px; margin-inline: auto; }

.art h2 {
    font-size: clamp(1.22rem, 2.6vw, 1.44rem); line-height: 1.3;
    color: var(--marine); margin: 2em 0 .55em; text-wrap: balance;
    /* Le sommaire renvoie ici : sans cette marge, le titre se colle au bord
       haut de la fenêtre et l'on croit avoir atterri au mauvais endroit. */
    scroll-margin-top: 20px;
}
.art h3 { font-size: 1.04rem; color: var(--marine); margin: 1.5em 0 .3em; }
.art p, .art li { line-height: 1.72; }
.art > p { margin: 0 0 1.05em; }
.art ul, .art ol { margin: 0 0 1.15em; padding-left: 1.35em; display: grid; gap: .45em; }

/* Le filet de NG : l'accent, puis sa trace claire. Décoratif, donc `--cyan`. */
.art-filet {
    width: 78px; height: 4px; margin: 18px 0; border-radius: 2px;
    background: linear-gradient(90deg, var(--cyan) 0 46%, var(--cyan-voile) 46%);
}
.art-meta {
    margin: 0; font-size: .9rem; font-weight: 600; color: var(--encre-2);
    display: flex; flex-wrap: wrap; align-items: center; gap: 5px 10px;
}
.art-meta .sep { color: var(--bord); }
.art-meta .revu { color: var(--succes); font-weight: 700; }

/* ---- ENCART AUTEUR — le signal E-E-A-T, pas une vignette décorative ------
   Google classe la santé en YMYL et y exige de savoir QUI écrit. Retirer ce
   bloc, c'est retirer le premier critère de classement de ces pages. */
.art-auteur {
    display: flex; align-items: center; gap: 14px; margin: 0 0 24px;
    padding: 14px 18px; background: var(--fond);
    border: 1px solid var(--bord); border-left: 4px solid var(--cyan-fonce);
    border-radius: 0 var(--rayon) var(--rayon) 0;
}
.art-auteur img, .art-auteur .art-auteur__ini {
    width: 54px; height: 54px; flex: none; border-radius: 50%; object-fit: cover;
}
.art-auteur .art-auteur__ini {
    display: grid; place-items: center; font-weight: 800;
    color: var(--marine); background: linear-gradient(150deg, var(--cyan-voile), var(--cyan));
}
.art-auteur b { display: block; color: var(--marine); font-size: .97rem; }
.art-auteur i {
    display: block; margin-top: 1px; font-style: normal;
    color: var(--cyan-fonce); font-size: .82rem; font-weight: 600;
}
.art-auteur small { display: block; margin-top: 3px; color: var(--encre-2); font-size: .77rem; }

/* L'illustration en tête d'article. Même rapport que la vignette de la carte :
   on retrouve exactement le dessin sur lequel on a cliqué.
   ⚠ Le rapport est porté par l'IMAGE (voir le piège Safari plus haut). */
.art-couverture {
    display: block; width: 100%; height: auto;
    aspect-ratio: 40 / 21; object-fit: cover;
    border-radius: var(--rayon); border: 1px solid var(--bord);
    background: var(--cyan-voile); margin: 0 0 24px;
}

.art-chapo {
    font-size: 1.13rem; font-weight: 600; color: var(--marine);
    line-height: 1.62; margin: 0 0 26px;
}

.art-sommaire {
    margin: 0 0 28px; padding: 16px 20px; background: var(--fond);
    border: 1px solid var(--bord); border-left: 4px solid var(--cyan-fonce);
    border-radius: 0 var(--rayon) var(--rayon) 0;
}
.art-sommaire__t {
    margin: 0 0 9px; font-size: .71rem; font-weight: 800;
    letter-spacing: .11em; text-transform: uppercase; color: var(--marine);
}
.art-sommaire ol { margin: 0; padding-left: 20px; gap: .3em; }
.art-sommaire a { color: var(--cyan-fonce); font-weight: 600; font-size: .91rem; }

/* ---- deux colonnes « permet / ne permet pas » ---------------------------
   Le vert et le gris disent « possible » et « pas possible » sans qu'on ait à
   lire le titre. Aucun rouge ici : le rouge est réservé aux urgences. */
.art-colonnes { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 1.3em 0 1.7em; }
@media (max-width: 700px) { .art-colonnes { grid-template-columns: 1fr; } }
.art-bloc { border: 1.5px solid var(--bord); border-radius: var(--rayon); padding: 16px 18px; }
.art-bloc h3 { margin: 0 0 .5em; font-size: .97rem; display: flex; align-items: center; gap: 8px; }
.art-bloc svg { flex: none; }
.art-bloc ul { margin: 0; padding-left: 1.2em; }
.art-bloc li { font-size: .93rem; line-height: 1.6; }
.art-bloc--oui { border-color: var(--succes-bord); background: var(--succes-fond); }
.art-bloc--oui h3 { color: var(--succes); }
.art-bloc--non { background: var(--fond-doux); }
.art-bloc--non h3 { color: var(--encre-2); }

.art-urgence {
    margin: 1.7em 0; padding: 18px 20px;
    background: var(--alerte-fond); border: 1px solid var(--alerte-bord);
    border-left: 5px solid var(--danger); border-radius: 0 var(--rayon) var(--rayon) 0;
}
.art-urgence h2 {
    margin: 0 0 .45em; color: var(--danger); font-size: 1.12rem;
    display: flex; align-items: flex-start; gap: 9px;
}
.art-urgence h2 svg { flex: none; margin-top: 3px; }
.art-urgence p, .art-urgence li { color: var(--alerte-texte); }
.art-urgence p:last-child { margin-bottom: 0; }

/* ---- FAQ dépliante ------------------------------------------------------
   ⚠ `<details>` s'ouvre SANS JavaScript : la réponse reste atteignable si un
   script tombe, et la recherche du navigateur (Ctrl+F) la trouve. */
.art-faq details {
    background: var(--fond); border: 1px solid var(--bord);
    border-radius: var(--rayon); padding: 0 20px; margin-bottom: 10px;
    transition: border-color .2s, box-shadow .2s;
}
.art-faq details[open] { border-color: var(--cyan-fonce); box-shadow: 0 4px 16px rgba(14,124,153,.09); }
.art-faq summary {
    list-style: none; cursor: pointer; font-weight: 700; color: var(--marine);
    padding: 15px 34px 15px 0; position: relative; line-height: 1.45;
}
.art-faq summary::-webkit-details-marker { display: none; }
.art-faq summary::after {
    content: "+"; position: absolute; right: 0; top: 50%;
    width: 25px; height: 25px; margin-top: -12.5px;
    display: grid; place-items: center; border-radius: 50%;
    background: var(--cyan-voile); color: var(--cyan-fonce); font-weight: 800;
    transition: transform .22s, background .22s, color .22s;
}
.art-faq details[open] summary::after { transform: rotate(45deg); background: var(--cyan-fonce); color: #fff; }
.art-faq details > p { padding: 0 0 15px; margin: 0; }

.art-appel {
    margin: 30px 0 0; padding: 22px 24px; background: var(--cyan-voile);
    border: 1px solid var(--bord); border-left: 5px solid var(--cyan-fonce);
    border-radius: 0 var(--rayon) var(--rayon) 0;
}
.art-appel__t {
    display: flex; align-items: center; gap: 9px; margin: 0 0 9px;
    font-size: 1.1rem; font-weight: 800; color: var(--marine);
}
.art-appel__t svg { color: var(--cyan-fonce); flex: none; }
.art-appel__d { margin: 0 0 15px; }
.art-appel__btns { display: flex; flex-wrap: wrap; gap: 12px; }
.art-appel .fiche__walkin { margin: 0 0 12px; }
.art-appel__note { margin: 12px 0 0; font-size: .84rem; color: var(--encre-2); }

/* ---- SOURCES — l'autre moitié du signal d'autorité ----------------------
   Une page de santé sans sources vérifiables se lit comme un texte écrit
   pour occuper une position, pas par un médecin. Chaque source porte son
   ORGANISME en pastille : c'est lui qui vaut caution, pas le titre. */
.art-sources { margin-top: 32px; padding-top: 20px; border-top: 1px solid var(--bord); }
.art-sources h2 { font-size: 1.04rem; margin: 0 0 .7em; }
.art-sources ul { list-style: none; margin: 0; padding: 0; gap: 10px; }
.art-sources li {
    display: flex; align-items: flex-start; gap: 11px;
    padding: 11px 14px; background: var(--fond);
    border: 1px solid var(--bord); border-radius: var(--rayon);
    font-size: .89rem; line-height: 1.55;
}
.art-source__org {
    flex: none; min-width: 62px; text-align: center;
    padding: 3px 9px; border-radius: 20px;
    font-size: .66rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
    background: var(--cyan-voile); color: var(--cyan-fonce);
    border: 1px solid var(--bord);
}
.art-source__org--pubmed { background: #EFF3FB; color: #2C4A8A; }
.art-source__org--ansm { background: #FFF8E6; color: #7A5A12; }
.art-source__t { display: block; }
.art-source__n { display: block; margin-top: 2px; color: var(--encre-2); font-size: .82rem; }
.art-maj { margin: 14px 0 0; font-size: .84rem; color: var(--encre-2); font-style: italic; }

.art-aussi {
    margin: 28px 0 0; padding: 18px 20px; background: var(--fond);
    border: 1px solid var(--bord); border-radius: var(--rayon);
}
.art-aussi__t { margin: 0 0 8px; font-size: .95rem; font-weight: 800; color: var(--marine); }
.art-aussi__item {
    display: flex; align-items: center; gap: 11px; padding: 10px 0;
    border-top: 1px solid var(--bord); text-decoration: none;
}
.art-aussi__item:first-of-type { border-top: 0; }
.art-aussi__item svg { flex: none; color: var(--cyan-fonce); }
.art-aussi__item span { color: var(--encre); font-weight: 600; font-size: .93rem; line-height: 1.4; }
.art-aussi__item:hover span { color: var(--cyan-fonce); text-decoration: underline; }

/* ---------------- LA GRILLE D'ARTICLES (page /articles) -------------------
   Vignettes reprises du site du Dr Nathalie Gozlan, aux couleurs de Totodoc.

   ⚠ HAUTEUR DE RANGÉE ÉGALE, mais SANS hauteur fixe. NG fige
   `grid-auto-rows: 490px` ; sur un texte français plus long que l'anglais, un
   extrait déborderait ou serait coupé au milieu d'un mot. Ici les rangées
   s'étirent (`1fr` implicite) et c'est l'EXTRAIT qui se limite, en nombre de
   lignes : les cartes d'une même rangée restent alignées, et aucun texte n'est
   tranché. */
.art-grille {
    list-style: none; margin: 0; padding: 0;
    display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px;
    max-width: 1060px; margin-inline: auto;
}
@media (max-width: 940px) { .art-grille { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px) { .art-grille { grid-template-columns: 1fr; } }

.art-vignette {
    display: flex; flex-direction: column; height: 100%;
    background: var(--fond); border: 1px solid var(--bord);
    border-radius: var(--rayon); overflow: hidden;
    text-decoration: none; color: inherit;
    transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.art-vignette:hover {
    transform: translateY(-3px); border-color: var(--cyan-fonce);
    box-shadow: 0 12px 30px rgba(16, 31, 45, .11); text-decoration: none;
}
.art-vignette:focus-visible { outline: 3px solid var(--cyan-fonce); outline-offset: 3px; }

/* La tuile d'icône tient lieu d'image : le projet n'a pas de photographie par
   motif, et une image d'illustration achetée dirait moins que le pictogramme
   déjà utilisé sur la vitrine — c'est le même dessin, donc le même repère. */
.art-vignette__image {
    display: flex; align-items: center; justify-content: center;
    height: 132px; flex: 0 0 auto;
    background: linear-gradient(150deg, var(--cyan-voile), var(--fond));
    border-bottom: 1px solid var(--bord);
    color: var(--cyan-fonce);
}
/* ⚠ `site.css` impose 30 px et le cyan aux <svg> d'une carte : on rétablit
   ici la taille voulue, sinon l'icône reste minuscule au centre de la tuile. */
.art-vignette__image svg { width: 42px; height: 42px; }

/* Une tuile qui porte un vrai dessin n'a plus besoin du dégradé ni de la
   hauteur d'icône : l'image occupe toute la surface, en 800 × 420.

   ⚠ LE RAPPORT EST PORTÉ PAR L'IMAGE, PAS PAR SA TUILE, et c'est délibéré.
   Écrit l'inverse — `aspect-ratio` sur la tuile et `height: 100%` sur l'image —
   la hauteur de l'image se calcule en POURCENTAGE d'un parent dont la hauteur
   est elle-même déduite d'un rapport. Chrome s'en accommode ; Safari et
   plusieurs navigateurs mobiles résolvent cette boucle à zéro tant que l'image
   n'est pas décodée, PUIS à sa vraie valeur — et la page grandit sous les
   doigts pendant qu'on la fait défiler. Ici la hauteur ne dépend que de la
   largeur : la place est réservée avant même le premier octet de l'image. */
.art-vignette__image--dessin { height: auto; background: var(--cyan-voile); padding: 0; display: block; }
.art-vignette__image--dessin img {
    display: block; width: 100%; height: auto;
    aspect-ratio: 40 / 21; object-fit: cover;
}

.art-vignette__corps { display: flex; flex-direction: column; flex: 1; min-height: 0; padding: 18px; }

.art-vignette__meta {
    display: flex; justify-content: space-between; align-items: baseline; gap: 8px;
    font-size: .72rem; color: var(--encre-2); margin-bottom: 8px;
}
.art-vignette__par {
    font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
    color: var(--cyan-fonce); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.art-vignette__meta time { flex: none; white-space: nowrap; font-variant-numeric: tabular-nums; }

.art-vignette__titre {
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
    line-clamp: 3; overflow: hidden;
    font-size: 1.02rem; font-weight: 800; color: var(--marine);
    line-height: 1.35; margin-bottom: 10px;
}
.art-vignette__extrait {
    display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical;
    line-clamp: 5; overflow: hidden;
    flex: 1; color: var(--encre-2); font-size: .89rem; line-height: 1.6;
}
.art-vignette__plus {
    display: block; margin-top: auto; padding-top: 14px;
    font-weight: 800; color: var(--cyan-fonce); font-size: .82rem;
}
.art-vignette:hover .art-vignette__plus { text-decoration: underline; }

.art-avert {
    margin: 26px 0 0; padding: 14px 16px; font-size: .84rem;
    color: var(--encre-2); line-height: 1.6;
    background: var(--fond); border: 1px dashed var(--bord); border-radius: var(--rayon);
}

/* ---------------- SUGGESTIONS D'ADRESSE (Base Adresse Nationale) ----------
   La liste se pose SOUS le champ, par-dessus le reste du formulaire. Le
   conteneur est créé par `public/js/adresse-ban.js` : sans JavaScript, il
   n'existe pas et le champ reste un champ de texte ordinaire. */
.ban-champ { position: relative; }
.ban-liste {
    position: absolute; z-index: 30; left: 0; right: 0; top: calc(100% + 4px);
    margin: 0; padding: 4px; list-style: none;
    background: #fff; border: 1.5px solid var(--bord); border-radius: var(--rayon-s);
    box-shadow: 0 10px 28px rgba(16, 31, 45, .14);
    max-height: 260px; overflow-y: auto;
}
.ban-item {
    padding: 10px 12px; border-radius: 6px; cursor: pointer;
    font-size: .95rem; color: var(--encre);
}
.ban-item--actif, .ban-item:hover { background: var(--fond-doux); color: var(--marine); }

/* =========================================================================
   SALLE D'ATTENTE DU PATIENT (17/08/2026)

   ⚠ CE N'EST PLUS LE CADRE VIDÉO. Jusqu'ici le patient arrivait directement
   dans un rectangle noir plein écran et y attendait, parfois longtemps, sans
   savoir s'il était au bon endroit. Décision de Julien : reprendre le modèle
   de docteurgozlan.fr — une page qui parle, dans la charte du site, et la
   visio qui ne prend l'écran qu'au moment où le médecin lance la
   consultation. Les styles ci-dessous ne servent QUE cette page d'attente ;
   le cadre d'appel garde les siens (tc-visio.css).
   ========================================================================= */
.salle-attente { text-align: center; }

/* Le stéthoscope, pas une roue qui tourne : une roue dit « ça charge » et
   inquiète au bout de trente secondes ; un stéthoscope dit « un médecin
   arrive », ce qui est exactement la situation. Même image que dans le cadre
   d'appel — le patient ne change pas d'univers en cours de route. */
.salle-attente__rond {
    display: flex; align-items: center; justify-content: center;
    width: 78px; height: 78px; margin: 4px auto 20px; border-radius: 50%;
    background: var(--fond-doux); position: relative;
}
.salle-attente__rond::before {
    content: ""; width: 36px; height: 36px; background: var(--cyan-fonce);
    -webkit-mask: var(--tcv-stetho) center/contain no-repeat;
            mask: var(--tcv-stetho) center/contain no-repeat;
}
.salle-attente__rond::after {
    content: ""; position: absolute; inset: -8px; border-radius: 50%;
    border: 2px solid rgba(20, 178, 217, .45);
    animation: dot-pulse-anneau 2.2s ease-out infinite;
}
@keyframes dot-pulse-anneau {
    0%   { transform: scale(.85); opacity: .85; }
    100% { transform: scale(1.4); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
    /* Le halo s'immobilise, il ne disparaît pas : l'information reste. */
    .salle-attente__rond::after { animation: none; opacity: .45; transform: scale(1.1); }
}

.salle-attente__rang { margin: 0 0 14px; font-weight: 700; color: var(--encre); }
.salle-attente__rang:empty { display: none; }
.salle-attente__aide {
    margin: 0 auto; max-width: 46rem; color: var(--encre-2);
    font-size: .95rem; line-height: 1.55;
}
.salle-attente__urgence {
    display: inline-block; margin: 22px 0 0; padding: 7px 15px; border-radius: 999px;
    background: var(--fond-doux); border: 1px solid var(--bord);
    font-size: .82rem; font-weight: 700; color: var(--encre-2);
}

/* ⚠ LE CALQUE D'AUTORISATION CAMÉRA CHANGE DE DÉCOR. `visio-geste.js` le
   dessine pour un cadre vidéo SOMBRE et plein écran (fond opaque, texte
   blanc, position absolue). Posé dans une carte blanche, il la recouvrait
   d'un voile noir. On ne touche pas au module — il sert aussi au cadre — on
   le remet ici dans le flux, aux couleurs du site. */
.salle-attente__geste:empty { display: none; }
.salle-attente__geste .tcv-geste {
    position: static; inset: auto; padding: 22px 0 0;
    background: none; backdrop-filter: none; -webkit-backdrop-filter: none;
}
.salle-attente__geste .tcv-geste__boite { margin: 0 auto; }
.salle-attente__geste .tcv-geste__boite h2 { color: var(--marine); font-size: 1.02rem; }
.salle-attente__geste .tcv-geste__boite p { color: var(--encre-2); }
.salle-attente__geste .tcv-geste__aide { color: var(--danger) !important; }

/* ── Encart « Documents à transmettre » ── */
.salle-docs { margin-top: 18px; text-align: center; }
.salle-docs__titre {
    display: flex; align-items: center; justify-content: center; gap: 9px;
    margin: 0 0 16px; font-size: 1.02rem; color: var(--marine);
}
.salle-docs__titre::before {
    content: ""; width: 19px; height: 19px; flex: 0 0 auto; background: var(--cyan-fonce);
    -webkit-mask: var(--icone-trombone) center/contain no-repeat;
            mask: var(--icone-trombone) center/contain no-repeat;
}
:root {
    --icone-trombone: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 11.5l-8.6 8.6a5 5 0 0 1-7.1-7.1l9-9a3.4 3.4 0 0 1 4.8 4.8l-9 9a1.8 1.8 0 0 1-2.5-2.5l8.3-8.3'/%3E%3C/svg%3E");
}

/* Bordure en pointillés : la zone se lit comme un dépôt, pas comme un bouton
   d'envoi de formulaire — le patient comprend qu'il ne valide rien. */
.salle-docs__ajouter {
    display: inline-flex; align-items: center; gap: 10px; cursor: pointer;
    padding: 16px 30px; border-radius: 12px; font: inherit; font-weight: 800;
    color: var(--cyan-fonce); background: #fff;
    border: 2px dashed rgba(20, 178, 217, .55);
    transition: background .15s, border-color .15s;
    min-height: 48px;                      /* cible tactile confortable */
}
.salle-docs__ajouter::before {
    content: ""; width: 18px; height: 18px; background: currentColor;
    -webkit-mask: var(--icone-depot) center/contain no-repeat;
            mask: var(--icone-depot) center/contain no-repeat;
}
:root {
    --icone-depot: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V4'/%3E%3Cpath d='M7.5 8.5L12 4l4.5 4.5'/%3E%3Cpath d='M4 16v3a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-3'/%3E%3C/svg%3E");
}
.salle-docs__ajouter:hover { background: var(--fond-doux); border-color: var(--cyan-fonce); }
.salle-docs__ajouter:focus-visible { outline: 3px solid var(--cyan-fonce); outline-offset: 3px; }
.salle-docs__aide { margin: 12px 0 0; font-size: .87rem; color: var(--encre-2); }

/* La liste des pièces envoyées est celle du cadre d'appel (elle y est
   DÉPLACÉE, pas recopiée) : on la remet ici dans un décor clair. */
#docs-accueil .tcv-pieces {
    list-style: none; margin: 16px 0 0; padding: 0;
    display: flex; flex-direction: column; gap: 8px; text-align: left;
}
#docs-accueil .tcv-pieces li {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    background: var(--fond-doux); border: 1px solid var(--bord);
    border-radius: 10px; padding: 10px 14px; font-size: .92rem; color: var(--encre);
}
#docs-accueil .tcv-pieces__retirer {
    border: 0; background: none; cursor: pointer; font: inherit; font-weight: 700;
    color: var(--cyan-fonce); padding: 4px 6px;
}
#docs-accueil .tcv-pieces__retirer[disabled] { opacity: .5; cursor: progress; }
#docs-accueil .tcv-flash {
    margin-top: 14px; padding: 10px 14px; border-radius: 10px;
    background: var(--fond-doux); border: 1px solid var(--bord);
    font-size: .9rem; color: var(--encre);
}

/* ---------------------------------------------------------------------------
   LES PIÈCES ENVOYÉES, DANS LA CARTE CLAIRE DE LA SALLE D'ATTENTE
   (Julien, 18/08/2026)

   ⚠ `tc-visio.css` habille cette liste pour le CADRE VIDÉO, qui est sombre :
   bordure blanche translucide sur fond transparent. Dans la carte « Documents
   à transmettre », qui est claire, cette croix devenait invisible — blanc sur
   blanc. On ne touche pas à la règle d'origine (elle reste juste là où elle
   sert) : on l'habille pour CE contexte, et seulement lui.

   La croix est rouge parce qu'elle SUPPRIME : le patient doit voir du premier
   coup d'œil que ce bouton retire son document, et non qu'il l'ouvre.
   --------------------------------------------------------------------------- */
.salle-docs .tcv-pieces {
    /* ⚠ La règle d'origine est en `position: absolute` — elle épingle la liste
       dans un coin du cadre vidéo. Hors de ce cadre, elle flotterait par-dessus
       la carte. On la remet dans le flux, explicitement. */
    position: static;
    max-width: none;
    list-style: none;
    margin: 12px 0 0;
    padding: 0;
    display: grid;
    gap: 8px;
}
.salle-docs .tcv-pieces li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 8px 10px 8px 14px;
    border: 1px solid var(--bord);
    border-radius: var(--rayon-s);
    background: var(--fond-doux);
    font-size: .95rem;
    color: var(--encre);
}
.salle-docs .tcv-pieces li span {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.salle-docs .tcv-pieces__retirer {
    flex: none;
    width: 30px;
    height: 30px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--fond);
    border: 1px solid var(--alerte-bord);
    border-radius: 999px;
    color: var(--danger);
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
}
.salle-docs .tcv-pieces__retirer:hover:not(:disabled) {
    background: var(--alerte-fond);
    border-color: var(--danger);
}
.salle-docs .tcv-pieces__retirer:disabled { opacity: .5; cursor: default; }

/* ---------------------------------------------------------------------------
   « VOIR SA FICHE » — la pastille à droite du nom, dans l'annuaire
   (Julien, 19/08/2026). Quand un praticien est disponible, le grand bouton de
   la carte entre directement dans son parcours : sans cette pastille, rien
   n'invitait à d'abord LIRE qui il est. Le titre était bien un lien, mais rien
   ne le disait.
   --------------------------------------------------------------------------- */
/* ⚠ `center`, PAS `baseline` (Julien, 19/08/2026 : « le bouton semble un tout
   petit peu plus bas »). Mesuré : 2,3 px sous le nom. Avec `baseline`, la
   pastille aligne son TEXTE sur celui du nom — mais son cadre est plus haut
   (29 px contre 22) à cause du remplissage et de la bordure, et déborde donc
   vers le bas. Ce sont les BOÎTES qu'il faut centrer, pas les lignes de base :
   l'œil compare des formes, pas des empattements. */
.praticien-carte__ligne-nom {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0;
}
.praticien-carte__ligne-nom h2 { margin: 0; }
/* ⚠ CYAN PLEIN, TEXTE BLANC — et le choix est MESURÉ, pas esthétique
   (Julien, 19/08/2026 : « là c'est vraiment pâlot »). Le cadre clair d'origine
   ne se voyait pas. La variante qui venait d'abord à l'esprit — fond cyan
   voilé, texte cyan — tombe à 4,35:1, SOUS le seuil AA de 4,5 exigé pour ce
   corps de texte : elle aurait été plus visible pour l'œil valide et moins
   lisible pour les autres. Le cyan plein tient 4,81:1, et le survol assombri
   davantage encore. */
.lien-fiche {
    display: inline-flex; align-items: center; white-space: nowrap;
    font-size: .78rem; font-weight: 700; text-decoration: none;
    color: #fff; background: var(--cyan-fonce); border: 1px solid var(--cyan-fonce);
    border-radius: 999px; padding: 4px 12px;
    transition: background var(--transition), border-color var(--transition);
}
.lien-fiche:hover { background: var(--cyan-sombre); border-color: var(--cyan-sombre); }
