/* =============================================================================
   QRcard — Design « minimaliste » (esprit Apple / Revolut)
   Beaucoup de blanc, un sans-serif net (Manrope + Inter), coins arrondis,
   boutons « pilule », un seul accent. Pas de dégradés criards.
   NB : les noms de classes sont volontairement stables (les vues en dépendent).
   ========================================================================== */

:root {
    /* ------------------------------------------------------------------
       ⚠️ LE PAPIER EST CHAUD, PAS GRIS. (0.3.10, 03/08/2026)
       ------------------------------------------------------------------
       `#F5F5F7` est le gris d'Apple : bleute, froid, parfaitement neutre.
       C'est excellent pour un systeme d'exploitation, et c'est exactement ce
       qui empeche ce site de ressembler a autre chose qu'un tableau de bord.

       Un lieu qui veut avoir l'air soigne n'est jamais gris-bleu : le papier
       d'un carton d'invitation, le marbre d'un hall, le lin d'une nappe
       tirent tous vers le chaud. Le decalage est minuscule — deux points de
       teinte — et c'est precisement ce qui fait qu'on le ressent sans le
       remarquer.

       ⚠️ NE PAS AUGMENTER LA SATURATION. Au-dela, on quitte le papier pour
       le beige, et le beige a l'air sale a cote du blanc pur des cartes.
       ------------------------------------------------------------------ */
    --bg:        #FFFFFF;
    --bg-2:      #F7F5F2;   /* papier chaud, remplace le gris froid #F5F5F7 */
    --card:      #FFFFFF;
    --ink:       #0B0B0C;
    --ink-2:     #1D1D1F;
    --soft:      #6E6E73;   /* texte secondaire */
    --muted:     #86868B;
    --line:      #ECE8E3;   /* filet chaud, accorde au papier */
    --line-2:    #DBD5CD;
    --accent:    #2F54EB;   /* bleu net, esprit Revolut */
    --accent-ink:#1D3AC7;
    --accent-bg: #EAEEFE;
    --stamp:     #D0463B;
    /* L'or des QR. Même valeur que le défaut de public/assets/js/app.js —
       si l'une change, l'autre doit suivre : le bouton « Espace membres »
       est censé reprendre exactement la couleur du code imprimé. */
    --gold:      #6C6347;
    --gold-dark: #554E38;
    --good:      #0F7A50;
    --good-bg:   #E7F5EE;
    --bad:       #C4362B;
    --bad-bg:    #FBEBEA;

    --sans:    'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    --display: 'Manrope', 'Inter', -apple-system, sans-serif;
    /* Titres éditoriaux. Le sans-serif gras convenait à un outil ; il ne dit
       rien du soin qu'on met dans une carte de visite. Un serif fin sur les
       grands titres suffit à faire basculer la page du côté « objet soigné »,
       sans rien changer au reste de l'identité : la marque, la navigation et
       les boutons restent en Manrope. Fraunges/Instrument Serif ont été
       écartés au profit de Fraunces pour sa graisse variable (un seul
       fichier couvre les titres et les sous-titres). */
    --serif:   'Fraunces', 'Iowan Old Style', Georgia, 'Times New Roman', serif;

    --wrap: 1080px;
    --r: 12px;
    --r-lg: 20px;
    --r-pill: 980px;
    /* ------------------------------------------------------------------
       DES OMBRES EN DEUX COUCHES, PAS UN HALO
       ------------------------------------------------------------------
       Une ombre unique tres floue donne l'objet qui LEVITE — l'effet le plus
       reconnaissable des maquettes faites a la va-vite. Une ombre reelle a
       deux composantes : un contact serre et sombre juste sous l'objet, et
       une diffusion large et tres pale au-dela.

       C'est ce qui distingue une carte POSEE sur la page d'une carte qui
       flotte au-dessus. Les valeurs restent tres basses : on doit voir
       l'objet, pas son ombre.
       ------------------------------------------------------------------ */
    --sh:    0 1px 2px rgba(28,25,23,.05), 0 12px 34px -10px rgba(28,25,23,.10);
    --sh-sm: 0 1px 2px rgba(28,25,23,.05), 0 4px 12px -4px rgba(28,25,23,.07);
    --sh-lift: 0 2px 4px rgba(28,25,23,.06), 0 18px 42px -12px rgba(28,25,23,.16);
}

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
    margin: 0;
    font-family: var(--sans);
    font-size: 17px;
    line-height: 1.6;
    color: var(--ink-2);
    background: var(--bg);
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
}
img, svg, canvas { display: block; max-width: 100%; }
a { color: var(--ink-2); text-decoration: none; }
a:hover { color: var(--accent); }
hr { border: 0; border-top: 1px solid var(--line); margin: 0; }

/* Typographie
   Les grands titres (h1, h2) passent au serif : c'est ce qui donne le ton.
   Les h3 restent en sans-serif — à petite taille, le serif brouille la
   lecture, et l'alternance des deux familles crée justement la hiérarchie.
   Tailles réduites par rapport à la version précédente (h1 allait jusqu'à
   4,5 rem) : un titre plus mesuré, plus d'air autour, ça se lit comme un
   carton d'invitation plutôt que comme une bannière. */
h1, h2, h3, h4 { color: var(--ink); margin: 0; letter-spacing: -0.02em; line-height: 1.06; }
h1, h2 { font-family: var(--serif); font-weight: 400; font-optical-sizing: auto; }
h1 { font-size: clamp(2.3rem, 5vw, 3.7rem); letter-spacing: -0.022em; line-height: 1.04; }
h2 { font-size: clamp(1.7rem, 3vw, 2.4rem); letter-spacing: -0.018em; line-height: 1.1; }
h3, h4 { font-family: var(--display); }
h3 { font-size: 1.16rem; font-weight: 600; letter-spacing: -0.01em; }
p { margin: 0 0 1rem; }
.lede { font-size: 1.14rem; line-height: 1.62; color: var(--soft); }
/* Le sur-titre porte beaucoup du caractère « premium » : très petit, très
   espacé, en gris plutôt qu'en bleu vif — un accent qui crie perd sa valeur
   d'accent. */
.eyebrow { display: inline-block; font-family: var(--display); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.2em; font-weight: 600; color: var(--muted); }
.muted { color: var(--muted); }
.small { font-size: 0.85rem; }

/* Layout */
.wrap { max-width: var(--wrap); margin: 0 auto; padding: 0 24px; }
.section { padding: 92px 0; }
.section-alt { background: var(--bg-2); }
.section-tight { padding: 56px 0; }
.grid { display: grid; gap: 36px; }
.cols-2 { grid-template-columns: 1fr 1fr; }
.cols-3 { grid-template-columns: repeat(3, 1fr); }
.stack > * + * { margin-top: 1rem; }
.text-center { text-align: center; }
.divider { height: 1px; background: var(--line); margin: 26px 0; }

/* Header public */
.site-header { position: sticky; top: 0; z-index: 40; background: rgba(255,255,255,.8); backdrop-filter: saturate(1.4) blur(14px); border-bottom: 1px solid var(--line); }
/* Le header a besoin d'un peu plus de largeur que le contenu (--wrap: 1080px) :
   avec 4 liens + sélecteur de langue + connexion + bouton, le libellé long
   « À quoi sert votre argent ? » (FR) faisait passer le nav à la ligne
   (26/07/2026). On élargit uniquement le conteneur du header, pas celui des
   sections de contenu, et on resserre un peu les espacements. */
.site-header .wrap { max-width: 1240px; }
/* Ecarts resserres de 18 a 14 px le 03/08/2026 : voir le bloc « L'EN-TETE NE
   TENAIT PAS EN FRANCAIS » plus bas. Chaque pixel gagne ici est un pixel de
   moins a prendre sur la taille du texte. */
.site-header .bar { position: relative; display: flex; align-items: center; justify-content: space-between; height: 66px; gap: 14px; }
.brand { font-family: var(--display); font-weight: 700; font-size: 1.32rem; letter-spacing: -0.02em; display: inline-flex; flex-shrink: 0; }
.brand .qr { color: var(--ink); }
.brand .card { color: var(--accent); }
.brand .dotcom { color: var(--muted); }
.nav { display: flex; align-items: center; gap: 14px; }
.nav a { font-size: 0.88rem; color: var(--soft); white-space: nowrap; }
.nav a:hover, .nav a.active { color: var(--ink); }
/* --------------------------------------------------------------------------
   ⚠️ LE BOUTON DE L'EN-TETE GARDE SON TEXTE BLANC.
   --------------------------------------------------------------------------
   Mesure du 03/08/2026 : « Creer un compte » affichait du gris #6E6E73 sur
   du noir #0B0B0C, soit un contraste de 3,88:1. Le minimum exige pour du
   texte normal est 4,5:1 (WCAG AA). Le bouton avait l'air DESACTIVE — sur le
   principal appel a l'action du site.

   Pourquoi : `.btn` declare `color: #fff`, mais `.nav a` (0,1,1) est plus
   specifique que `.btn` (0,1,0). La couleur du menu ecrasait donc celle du
   bouton, dans l'en-tete UNIQUEMENT — ailleurs sur le site, les memes boutons
   etaient blancs. D'ou un defaut qu'on ne voit pas en relisant la feuille.

   `:visited` est declare explicitement : sinon un bouton deja visite reprend
   la couleur des liens visites du navigateur. `:focus-visible` garde un
   contour net pour la navigation au clavier.
   -------------------------------------------------------------------------- */
.nav a.btn, .app-nav a.btn,
.nav a.btn:visited, .app-nav a.btn:visited { color: #fff; }
.nav a.btn:hover, .app-nav a.btn:hover { color: #fff; opacity: 0.88; }
.nav a.btn:focus-visible, .app-nav a.btn:focus-visible {
    color: #fff; outline: 2px solid var(--accent); outline-offset: 2px;
}
/* Les memes boutons en variante claire gardent l'encre foncee. */
.nav a.btn-ghost, .app-nav a.btn-ghost,
.nav a.btn-ghost:visited, .app-nav a.btn-ghost:visited,
.nav a.btn-ghost:hover, .app-nav a.btn-ghost:hover { color: var(--ink); }

/* Barre droite (badge facturation/tarifs + bouton menu mobile) */
/* --------------------------------------------------------------------------
   ⚠️ `flex-shrink: 0` ICI, SINON L'ICONE ENTRE DANS LE PREMIER MOT DU MENU
   --------------------------------------------------------------------------
   Signale par Raf le 03/08/2026 : « le logo retour rentre dans le premier mot
   a sa droite ». Mesure dans le navigateur, sur le site en ligne :

       largeur calculee de .bar-right ................ 0 px
       contenu qu'elle doit porter ................... 38 px
       espace entre l'icone et le premier lien ..... -20 px

   Zero. La boite etait completement ecrasee, a TOUTES les largeurs, et son
   contenu debordait entierement.

   Pourquoi : `min-width: 0` retire le plancher naturel d'un element flex —
   celui qui l'empeche de devenir plus etroit que son contenu. Avec
   `flex-shrink: 1` en plus, la boite se laissait comprimer jusqu'a rien des
   qu'il y avait la moindre tension dans la barre. Son unique enfant visible
   sur desktop, `.home-link`, porte `flex-shrink: 0` : lui ne retrecissait
   pas, il debordait. Et comme l'ecart de `.bar` se mesure sur la BOITE et non
   sur le contenu qui en sort, l'icone se retrouvait posee sur le texte.

   Pourquoi « en fonction de la langue » : la tension vient de la longueur des
   libelles. Le francais (« Comment ca marche », « A quoi sert votre argent ? »)
   la cree partout ; l'anglais, plus court, la cree moins souvent. Le defaut
   etait pourtant present dans les cinq langues.

   Rien dans cette boite ne peut retrecir. Lui permettre de retrecir ne
   pouvait donc produire qu'un debordement, jamais un gain.
   Apres correction, mesure a nouveau : ecart = +14 px, a toutes les largeurs.
   -------------------------------------------------------------------------- */
.bar-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
.plan-pill {
    display: none;
    font-size: 0.82rem; font-weight: 600; white-space: nowrap;
    padding: 8px 15px; border-radius: var(--r-pill);
    background: var(--bg-2); color: var(--ink);
}
.plan-pill:hover, .plan-pill.active { background: var(--accent); color: #fff; }
/* Sélecteur de langue compact affiché directement dans l'en-tête sur mobile
   (au lieu d'être caché dans le menu ☰) — cachée par défaut ici : sur
   desktop, le sélecteur reste à sa place habituelle, dans `.nav`. */
/* ⚠️ VISIBLE A TOUTES LES LARGEURS depuis la 0.3.6.
   Le selecteur etait masque sur desktop (il vivait alors dans `.nav`) et
   revele sur mobile. Le mini menu tenant en 60 px, il reste desormais dans la
   barre du dessus en permanence : une seule commande, au meme endroit, quelle
   que soit la taille de l'ecran. */
.lang-quick { display: inline-flex; flex-shrink: 0; }
/* Petit lien discret « retour » présent sur toutes les pages (26/07/2026) :
   sur les pages publiques il renvoie vers `/` (header_public.php) ; dans
   l'espace membre il renvoie vers le tableau de bord, pas vers le site
   public (header_app.php) — masqué sur la page cible elle-même dans les
   deux cas, pour ne jamais proposer un « retour » vers la page déjà affichée. */
.home-link {
    display: inline-flex; align-items: center; justify-content: center;
    width: 38px; height: 38px; flex-shrink: 0;
    border-radius: 50%; color: var(--muted);
    transition: background .15s ease, color .15s ease;
}
.home-link:hover { background: var(--bg-2); color: var(--ink); }
.nav-toggle {
    display: none; flex-direction: column; align-items: center; justify-content: center;
    gap: 4px; width: 42px; height: 42px; flex-shrink: 0;
    border: 1px solid var(--line-2); border-radius: var(--r); background: var(--bg);
    cursor: pointer; padding: 0;
}
.nav-toggle span { display: block; width: 18px; height: 2px; background: var(--ink); border-radius: 2px; }

/* Boutons — pilule */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; font-family: var(--sans); font-size: 0.98rem; font-weight: 600; padding: 0.82em 1.5em; border-radius: var(--r-pill); border: 1px solid transparent; background: var(--ink); color: #fff; cursor: pointer; transition: transform .12s ease, opacity .2s ease, background .2s ease; }
.btn:hover { opacity: 0.88; color: #fff; }
.btn:active { transform: scale(0.98); }
.btn-accent { background: var(--accent); }
.btn-ghost { background: var(--bg-2); color: var(--ink); }
.btn-ghost:hover { background: #ECECEF; color: var(--ink); opacity: 1; }
/* Bouton « Espace membres » — repris de la couleur des QR (--gold), pour
   qu'il se lise comme une porte de service plutôt que comme un troisième
   appel à l'action en concurrence avec les deux autres. */
/* En CONTOUR, pas en aplat. Rempli, cet or foncé donnait un gros bouton kaki
   qui tirait l'œil plus que les deux vrais appels à l'action, et faisait
   daté. En contour il garde la couleur de marque, se lit comme une porte de
   service, et ne dispute plus la hiérarchie au bouton principal. Il se
   remplit au survol : le signal d'interactivité est conservé. */
.btn-gold {
    background: transparent; color: var(--gold);
    /* Repli d'abord : un navigateur qui ignore color-mix() rejetterait la
       déclaration entière et laisserait le bouton sans bordure — donc
       invisible, puisque le fond est transparent. */
    border: 1px solid #BDB8AC;
    border-color: color-mix(in srgb, var(--gold) 45%, transparent);
}
.btn-gold:hover { background: var(--gold); color: #fff; border-color: var(--gold); opacity: 1; }
.btn-gold svg { opacity: 0.7; }
.btn-danger { background: transparent; color: var(--bad); border-color: var(--line-2); }
.btn-danger:hover { background: var(--bad); color: #fff; opacity: 1; }
.btn-sm { padding: 0.58em 1.05em; font-size: 0.86rem; }
.btn-block { width: 100%; }
.link-arrow { font-weight: 600; display: inline-flex; gap: 0.4rem; align-items: center; color: var(--ink); }
.link-arrow .a { color: var(--accent); transition: transform .12s ease; }
.link-arrow:hover { color: var(--accent); }
.link-arrow:hover .a { transform: translateX(3px); }

/* Hero */
.hero { position: relative; padding: 72px 0 56px; }
.hero-grid { display: grid; grid-template-columns: 1.02fr 0.98fr; gap: 56px; align-items: center; }
.hero h1 { margin: 20px 0 20px; }
.hero .lede { max-width: 38ch; }
/* Grille en « largeur du contenu » : elle prend la largeur de sa ligne la
   plus large — celle des deux boutons — ce qui donne au bouton « Espace
   membres » un repère par rapport auquel se centrer. Voir views/home.php. */
.hero-actions { display: grid; width: fit-content; margin-top: 28px; }
.hero .cta-row { display: flex; gap: 12px; flex-wrap: wrap; }
/* La ligne sous les deux boutons du hero.
   Rouge et italique, a la demande — c'est une accroche, pas une note de bas
   de page. Le rouge est `--stamp`, celui du tampon « ASBL belge » deja
   present sur l'accueil, et non `--bad` : un message positif ne doit pas
   emprunter la couleur des erreurs, sur laquelle repose tout le reste de
   l'interface. */
.hero-note {
    margin: 14px 0 0;
    color: var(--stamp);
    font-style: italic;
    font-weight: 500;
    font-size: 0.95rem;
    line-height: 1.5;
    max-width: 46ch;
}
/* Porte de service, pas troisième appel à l'action : petite taille et filet
   de séparation. Posé en pleine taille sous les deux CTA, il créait un
   troisième bouton isolé au milieu du blanc et brouillait la hiérarchie —
   on ne savait plus lequel des trois était le geste attendu. */
/* Même gabarit que les deux appels à l'action au-dessus — un bouton plus
   petit paraissait écrasé sous eux. C'est le contour, et non la taille, qui
   le tient en retrait dans la hiérarchie. Les marges intérieures sont plus
   généreuses que celles d'un `.btn` ordinaire : seul sur sa ligne, il a
   besoin d'un peu de corps pour ne pas paraître étriqué. */
.hero-members { padding-left: 2.4em; padding-right: 2.5em; }
.hero-members-row {
    display: flex; justify-content: center;
    margin-top: 24px; padding-top: 22px;
    border-top: 1px solid var(--line);
}

/* Deux sections « tight » qui se suivent cumulaient 56 px de bas et 56 de
   haut : 112 px de blanc entre la phrase-signature et le bandeau ASBL, sur
   une page qu'on venait justement de raccourcir. */
.section-tight + .section-tight { padding-top: 30px; }

/* ---------------------------------------------------------------------------
   Réseaux — formulaire de saisie et affichage sur la carte publique.
   --------------------------------------------------------------------------- */
.social-block { border-top: 1px solid var(--line); margin-top: 26px; padding-top: 22px; }
.social-head { margin-bottom: 14px; }
.social-head .lbl { display: block; font-size: 0.82rem; font-weight: 600; color: var(--ink); }
.social-head .help { display: block; font-size: 0.82rem; color: var(--muted); margin-top: 4px; }
.social-wa { align-items: flex-start; }
.social-wa .help { display: block; font-size: 0.8rem; color: var(--muted); }

/* Sur la carte : une rangée de pastilles, distincte des actions de contact.
   Le champ libre est le seul à porter son libellé — les autres sont
   reconnaissables à leur pictogramme, et un mot sous chaque icône ferait
   une deuxième liste là où on veut une ligne. */
.vc-socials { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-top: 18px; }
.vc-social {
    display: inline-flex; align-items: center; justify-content: center; gap: 7px;
    width: 42px; height: 42px; border-radius: 50%;
    background: var(--bg-2); color: var(--soft);
    transition: background .15s ease, color .15s ease, transform .15s ease;
}
.vc-social svg { width: 20px; height: 20px; }
.vc-social:hover { background: var(--accent-bg); color: var(--accent-ink); transform: translateY(-2px); }
/* Le lien libre porte un texte : il lui faut une pastille allongée. */
.vc-social:has(span) { width: auto; border-radius: var(--r-pill); padding: 0 16px; font-size: 0.86rem; font-weight: 600; }

/* ---------------------------------------------------------------------------
   La démonstration : ce qui change / ce qui ne change pas.
   Trois lignes à gauche, une flèche, une ligne à droite. C'est le seul
   argument que la page d'accueil développe — il doit donc être le plus
   soigné, et rester lisible sur un écran de 375 px (où la flèche pivote
   d'un quart de tour et la lecture redevient verticale).
   --------------------------------------------------------------------------- */
.swap-eyebrow { display: block; text-align: center; margin-bottom: 22px; }
/* Colonnes au contenu (max-content) plutôt qu'en fractions : avec `1fr auto
   1fr`, les deux colonnes de texte prenaient toute la largeur disponible et
   la flèche se retrouvait à cinquante pixels du bloc de droite mais à deux
   cents du bloc de gauche. Elle ne reliait plus rien. Ici le groupe entier
   est centré et les trois éléments restent solidaires. */
.swap {
    display: grid;
    grid-template-columns: max-content auto max-content;
    justify-content: center;
    align-items: center;
    gap: 0 30px;
    padding: 44px 36px;
    border: 1px solid var(--line);
    border-radius: var(--r-lg);
    background: var(--bg);
}
.swap-list { list-style: none; margin: 0; padding: 0; }
.swap-list li {
    font-family: var(--serif); font-size: clamp(1.25rem, 2.2vw, 1.7rem);
    line-height: 1.35; color: var(--soft);
    padding: 7px 0 7px 22px; position: relative;
}
/* Puce dessinée plutôt que list-style : elle doit rester alignée sur la
   première ligne même quand le texte passe sur deux lignes (NL, ZH). */
.swap-list li::before {
    content: ""; position: absolute; left: 0; top: 0.78em;
    width: 6px; height: 6px; border-radius: 50%; background: var(--line-2);
}
.swap-arrow { display: flex; align-items: center; justify-content: center; color: var(--accent); }
.swap-arrow svg { width: 74px; height: 24px; }
/* Bornée à ~11 caractères pour tomber sur deux lignes : trois lignes à
   gauche face à une seule ligne à droite déséquilibrait le bloc. */
.swap-fixed {
    font-family: var(--serif); font-size: clamp(1.45rem, 2.8vw, 2.1rem);
    line-height: 1.2; color: var(--ink); margin: 0; letter-spacing: -0.02em;
    max-width: 11ch;
}
/* La phrase qui résume tout le service. En italique, centrée, avec de l'air :
   c'est une citation, pas un paragraphe de plus. */
.swap-note {
    font-family: var(--serif); font-style: italic; font-weight: 400;
    font-size: clamp(1.02rem, 1.7vw, 1.24rem); line-height: 1.55;
    color: var(--soft); text-align: center;
    max-width: 62ch; margin: 30px auto 0;
}

/* Le tampon rouge « GETQRCARD.COM », posé en travers du hero, a été retiré
   le 28/07/2026 : il donnait au site l'air d'une maquette en chantier, ce
   qui est exactement l'inverse du signal recherché — on vend la promesse
   qu'une carte imprimée aujourd'hui marchera encore dans cinq ans. */

/* Carte QR (objet imprimé) */
.qr-card { position: relative; background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 28px; box-shadow: var(--sh); max-width: 340px; margin-left: auto; }
/* Sur « Comment ça marche », la carte est un lien vers la démonstration :
   tout le monde n'a pas un second appareil sous la main pour scanner. */
a.qr-card { transition: transform .15s ease, box-shadow .15s ease; }
a.qr-card:hover { transform: translateY(-2px); box-shadow: 0 14px 40px rgba(0,0,0,.10); }
a.qr-card .cap { transition: color .15s ease; }
a.qr-card:hover .cap { color: var(--accent); }
.qr-frame { display: grid; place-items: center; padding: 12px; background: #fff; border-radius: 14px; }
.qr-frame canvas, .qr-frame img { width: 210px; height: 210px; }
.qr-card .cap { margin-top: 14px; text-align: center; font-size: 0.78rem; color: var(--muted); }
.qr-card .scan-tag { position: absolute; top: -12px; left: 50%; transform: translateX(-50%); background: var(--ink); color: #fff; font-size: 0.66rem; letter-spacing: 0.14em; text-transform: uppercase; padding: 5px 12px; border-radius: var(--r-pill); }
.dyn-line { display: flex; align-items: center; gap: 10px; margin-top: 18px; justify-content: center; font-size: 0.84rem; color: var(--soft); }
.dyn-line .old { text-decoration: line-through; color: var(--muted); }
.dyn-line .arrow { color: var(--accent); }

/* Constellation (hero) — un QR fixe, relié à tous les usages possibles. */
.constellation-wrap { display: flex; justify-content: center; align-items: center; padding: 12px; }
.constellation { width: 100%; max-width: 580px; height: auto; }
/* --------------------------------------------------------------------------
   L'ILLUSTRATION DU HERO EST UN LIEN VERS UNE VRAIE CARTE (03/08/2026)
   --------------------------------------------------------------------------
   Un dessin cliquable ne se devine pas. Sur un telephone il n'y a meme pas
   de survol pour l'apprendre. La mention est donc VISIBLE EN PERMANENCE,
   posee sur l'image, et non revelee au passage de la souris.

   `overflow: hidden` + `border-radius` : la mention epouse le coin de
   l'illustration au lieu d'en depasser.
   -------------------------------------------------------------------------- */
.constellation-lien {
    position: relative; display: inline-flex; border-radius: 20px;
    overflow: hidden; line-height: 0;
    transition: transform .18s ease;
}
.constellation-lien:hover { transform: translateY(-2px); }
.constellation-lien:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
.constellation-cta {
    position: absolute; left: 50%; bottom: 12px; transform: translateX(-50%);
    display: inline-flex; align-items: center; gap: 7px;
    padding: 8px 15px; border-radius: var(--r-pill);
    background: var(--ink); color: #FFF;
    font-family: var(--sans); font-size: 0.82rem; font-weight: 600;
    line-height: 1.3; white-space: nowrap;
    box-shadow: 0 2px 12px rgba(0,0,0,.22);
}
/* ⚠️ La regle globale `img, svg, canvas { display: block }` casserait
   l'alignement du pictogramme dans la pastille : on le remet en ligne ici. */
.constellation-cta svg { display: inline-block; flex-shrink: 0; }
.constellation-lien:hover .constellation-cta { background: var(--accent); }

/* --------------------------------------------------------------------------
   RAPPEL DE L'OFFRE CHOISIE, EN HAUT DU FORMULAIRE D'INSCRIPTION
   --------------------------------------------------------------------------
   Il ne s'affiche QUE si l'offre payante a ete choisie sur la page des
   tarifs. Sur une inscription ordinaire, le formulaire est exactement celui
   d'avant — ce bloc n'existe pas dans le HTML.
   -------------------------------------------------------------------------- */
.offre-rappel {
    background: var(--accent-bg); border: 1px solid var(--accent);
    border-radius: var(--r); padding: 16px 18px; margin: 0 0 22px;
}
.offre-rappel-tete {
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px; flex-wrap: wrap; margin-bottom: 10px;
}
.offre-rappel-tete strong { font-family: var(--display); font-size: 1.25rem; }
.offre-rappel-tete .muted { font-family: var(--sans); font-size: 0.82rem; font-weight: 400; }
.offre-rappel ul { list-style: none; margin: 0 0 10px; padding: 0; display: grid; gap: 5px; }
.offre-rappel li { font-size: 0.88rem; color: var(--ink-2); padding-left: 18px; position: relative; }
.offre-rappel li::before { content: '✓'; position: absolute; left: 0; color: var(--accent); font-weight: 700; }
.offre-rappel .help { margin: 0; }

/* --------------------------------------------------------------------------
   AFFICHER / MASQUER LE MOT DE PASSE
   --------------------------------------------------------------------------
   Le bouton est POSE DANS le champ, a droite. Le `padding-right` de l'input
   lui reserve la place : sans lui, un mot de passe long passerait dessous.

   44 px de cote : c'est la taille minimale d'une cible tactile confortable.
   Le bouton nait avec l'attribut `hidden` et n'est revele que par le script —
   un bouton qui ne fait rien vaut moins que pas de bouton.
   -------------------------------------------------------------------------- */
.mdp-champ { position: relative; display: block; }
.mdp-champ .input { padding-right: 48px; }
.mdp-oeil {
    position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
    width: 40px; height: 40px; display: inline-flex;
    align-items: center; justify-content: center;
    background: none; border: 0; border-radius: 50%; padding: 0;
    color: var(--muted); cursor: pointer;
    transition: background .14s ease, color .14s ease;
}
.mdp-oeil[hidden] { display: none; }
.mdp-oeil:hover { background: var(--bg-2); color: var(--ink); }
.mdp-oeil:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
/* Etat « mot de passe visible » : l'oeil est barre ET l'icone passe a l'encre
   pleine. Deux signaux, parce que le trait seul est tenu a lire. */
.mdp-oeil[aria-pressed="true"] { color: var(--ink); }
.mdp-oeil[aria-pressed="true"]::after {
    content: ''; position: absolute; left: 9px; right: 9px; top: 50%;
    height: 1.8px; background: currentColor; transform: rotate(-45deg);
    border-radius: 2px;
}

/* Accès « Mon compte » (connexion) intégré au hero de l'accueil — évite à un
   client existant de quitter la page pour se connecter. 3e cellule de
   `.hero-grid`, toujours sur toute la largeur (grid-column: 1/-1), qu'on
   soit sur la grille 2 colonnes (desktop) ou 1 colonne (mobile). */
.hero-login {
    grid-column: 1 / -1;
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: var(--r-lg);
    padding: 22px 26px 24px;
    margin-top: 4px;
    box-shadow: var(--sh-sm);
}
.hl-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }
.hl-form { display: flex; gap: 12px; align-items: stretch; }
.hl-field { position: relative; display: flex; align-items: center; flex: 1 1 180px; min-width: 0; }
.hl-field svg { position: absolute; left: 15px; color: var(--muted); pointer-events: none; }
.hl-field .input { padding-left: 42px; }
.hl-form .btn { flex: 0 0 auto; white-space: nowrap; }
.hl-alt { margin-top: 16px; text-align: center; }

/* Comparaison QR Code (statique) vs QRcard (dynamique) */
.compare { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.cmp { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 30px 28px; }
.cmp.dynamic { border: 2px solid var(--accent); box-shadow: var(--sh); }
.cmp-tag { display: inline-block; font-size: 0.7rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; padding: 5px 11px; border-radius: var(--r-pill); }
.cmp.static .cmp-tag { background: var(--bg-2); color: var(--muted); }
.cmp.dynamic .cmp-tag { background: var(--accent-bg); color: var(--accent-ink); }
.cmp-name { font-family: var(--display); font-weight: 700; font-size: 1.45rem; margin: 16px 0 4px; letter-spacing: -0.02em; }
.cmp-sub { color: var(--soft); font-size: 0.92rem; margin-bottom: 12px; }
.cmp-list { list-style: none; margin: 0; padding: 0; }
.cmp-list li { display: flex; gap: 11px; align-items: flex-start; padding: 11px 0; border-top: 1px solid var(--line); font-size: 0.96rem; color: var(--ink-2); }
.cmp-list .mk { font-weight: 700; flex: none; line-height: 1.5; }
.cmp.static .cmp-list li { color: var(--soft); }
.cmp.static .mk { color: var(--muted); }
.cmp.dynamic .mk { color: var(--accent); }

/* Étapes numérotées */
.numbered { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.numbered .cell { background: var(--card); border-radius: var(--r-lg); padding: 28px 26px; box-shadow: var(--sh-sm); }
.numbered .n { font-family: var(--display); font-weight: 700; font-size: 1.9rem; color: var(--accent); line-height: 1; }
.numbered h3 { margin: 16px 0 8px; }
.numbered p { color: var(--soft); margin: 0; font-size: 0.98rem; }


/* ==========================================================================
   ⚠️ L'EN-TÊTE PASSE AU MENU ☰ DÈS 1279 px, ET NON PLUS 900 px
   ==========================================================================
   L'EN-TÊTE NE TENAIT PAS EN FRANÇAIS. Mesuré dans le navigateur le
   03/08/2026, sur macarteqr.fr/tarifs, à la largeur MAXIMALE du site :

       place disponible (wrap 1240 moins 48 de marge) ...... 1192 px
       place nécessaire .................................... 1298 px
       manque .............................................. -106 px

   Le détail : marque 157 · icône retour 38 · « Comment ça marche » 143 ·
   « À quoi sert votre argent ? » 174 · les cinq langues 173 ·
   « Créer un compte » 150 · le reste réparti.

   Le seuil du menu ☰ était à 900 px. Entre 901 et 1400 px, le site affichait
   donc une barre complète qui ne rentrait pas : la page partait vers la
   droite de 28 px à 1280, 168 px à 1120, 348 px à 940. Toute la fenêtre
   glissait latéralement. Les audits précédents ne mesuraient qu'à 390 et
   320 px — la panne était pile dans l'angle mort.

   Ce que ça touche : tout écran de portable 1280 ou 1366, et toute fenêtre
   ouverte sur une moitié d'écran. Ce n'est pas un cas rare.

   Deux corrections, dans cet ordre :
     1. on resserre (écarts 18 → 14 px, texte 0,91 → 0,88 rem, langues plus
        compactes). Mesure après : la barre tient jusqu'à 1280 px inclus.
     2. en dessous, le menu ☰ prend le relais. C'est ce bloc.

   ⚠️ POURQUOI PAS SEULEMENT RESSERRER. Parce que sous 1280 px il faudrait
   descendre le texte du menu sous 0,8 rem et les langues sous 24 px de large.
   On rendrait illisible et intouchable ce qu'on essaie de garder visible. Un
   menu ☰ qui fonctionne vaut mieux qu'une barre qui déborde.

   ⚠️ NE PAS REDESCENDRE CE SEUIL À 900 px sans remesurer les cinq langues.
   Le français est le plus large : c'est lui qui commande.
   ========================================================================== */
@media (max-width: 1279px) {
    /* Le badge Tarifs/Facturation disparaît de la barre : le lien existe déjà
       dans le menu ☰, à un tap. */
    .plan-pill { display: none; }
    .nav-toggle { display: flex; }
    .nav, .app-nav {
        display: none; position: absolute; top: calc(100% + 1px); left: 0; right: 0;
        flex-direction: column; align-items: stretch; gap: 2px;
        background: var(--bg); border-bottom: 1px solid var(--line);
        padding: 10px 20px 18px; box-shadow: 0 12px 24px -12px rgba(0,0,0,.18);
        max-height: calc(100vh - 66px); overflow-y: auto;
    }
    .nav.open, .app-nav.open { display: flex; }
    .nav a, .app-nav a {
        width: 100%; padding: 14px 6px; border-radius: 0;
        border-bottom: 1px solid var(--line); font-size: 1rem;
    }
    .nav a.btn, .app-nav a.btn { border-bottom: none; margin-top: 8px; }
    .app-nav a.active { background: none; }
    .app-nav form { width: 100%; padding: 12px 0 2px; }
    .app-nav form .btn { width: 100%; }
    /* Le sélecteur « plein format » du menu ☰ est masqué : il est remplacé par
       la pastille compacte `.lang-quick`, toujours visible dans la barre. Pas
       besoin des deux à la fois. */

    /* L'EN-TÊTE SUR DEUX LIGNES : logo et ☰ sur la première, les cinq langues
       centrées sur la seconde. Les tasser sur une seule ligne demanderait de
       descendre les cibles tactiles sous 30 px — le seuil en dessous duquel on
       rate la bonne langue une fois sur trois.

       `height: auto` est indispensable : `.bar` était figée à 66 px, la
       seconde ligne serait sortie du cadre. `min-height` conserve la hauteur
       d'origine quand il n'y a rien à mettre à la ligne. */
    /* ------------------------------------------------------------------
       ⚠️ L'EN-TETE TIENT SUR UNE SEULE LIGNE DEPUIS LA 0.3.7.
       ------------------------------------------------------------------
       Il passait sur deux lignes : logo et ☰ en haut, les langues centrees
       en dessous. C'etait justifie tant que le selecteur affichait CINQ
       pastilles de 44 px — 220 px, impossible a caser a cote du logo.

       Le mini menu de la 0.3.6 n'en fait plus que 60. La deuxieme ligne ne
       servait donc plus qu'a manger 40 px de hauteur en haut de chaque page,
       sur l'ecran ou la hauteur est la plus rare. Signale par Raf le
       03/08/2026, capture a l'appui.

       Le compte a 390 px : logo 157 + menu 60 + ☰ 44 + deux ecarts de 14 =
       289 px, pour 354 disponibles. Il reste 65 px de marge.

       ⚠️ `flex-wrap: nowrap` est explicite : sans lui, la barre reprendrait
       le droit de se replier des qu'un element grandit un peu, et on
       retomberait sur deux lignes sans comprendre pourquoi.
       ------------------------------------------------------------------ */
    .site-header .bar, .app-header .bar {
        flex-wrap: nowrap; height: 66px; min-height: 0; padding-bottom: 0;
    }
    /* L'ordre visuel : logo a gauche, puis langue et ☰ colles a droite.
       `margin-left: auto` pousse le groupe de droite ; c'est ce qui remplace
       le `space-between`, devenu inutilisable avec trois enfants. */
    .brand      { order: 1; }
    .lang-quick { order: 2; margin-left: auto; }
    .bar-right  { order: 3; }

    /* ⚠️ LES CIBLES TACTILES SUIVENT CE SEUIL, PAS CELUI DE 900 px.
       Elles etaient dans le bloc 900 px. Or des que l'en-tete passe en mode
       ☰ — c'est-a-dire ici, a 1279 px — on est sur un appareil qui se touche :
       un iPad en paysage fait 1024 px de large et n'a pas de souris. Laisser
       les pastilles a 34 px dans cette plage revenait a soigner le telephone
       et a oublier la tablette. Mesure a 1180 px avant correction : 29 cibles
       sous 44 px. */
    .nav-toggle { width: 44px; height: 44px; }
    .brand { padding: 5px 0; }
}



/* ==========================================================================
   PASSE « PLUS PREMIUM » (0.3.10, 03/08/2026)
   ==========================================================================
   Demande de Raf : « plus premium, plus palace, sans etre trop vibe code ».

   CE QUE J'AI COMPRIS PAR « TROP VIBE CODE » — et donc ce que ce bloc
   n'utilise NULLE PART :
     · degrades violets ou multicolores ;
     · effets de verre depoli, halos lumineux, lueurs colorees ;
     · coins tres arrondis partout (le « tout en bulles ») ;
     · animations qui rebondissent, elements qui montent au survol de 8 px ;
     · emojis en guise d'icones.
   Ce sont les tics qui font qu'une page a l'air produite en serie.

   CE QUI FAIT REELLEMENT « PALACE », ET QUI EST ICI :
     1. DE L'ESPACE. Un hall de palace n'est pas decore, il est VIDE. On
        n'ajoute rien : on ecarte.
     2. DES MATIERES CALMES. Papier chaud plutot que gris froid (voir les
        jetons en haut du fichier), filets fins plutot que cadres marques.
     3. DE LA RETENUE DANS L'ACCENT. Le bleu vif employe partout — titres,
        filets, pastilles — est ce qui fait « application ». Il reste, mais
        pour les ACTIONS. L'identite est portee par l'encre et le papier.
     4. DES CHIFFRES ALIGNES. Un tableau dont les colonnes de chiffres ne
        s'alignent pas se lit comme un brouillon.
     5. DES GESTES LENTS. Rien ne rebondit. Tout se deplace de 1 a 2 px, en
        250 ms, avec une courbe qui decelere.
   ========================================================================== */

/* --- 1. Les cartes reposent sur la page, elles ne flottent pas ------------- */
.panel, .why-cell, .plan, .door, .guide-feature {
    transition: box-shadow .25s cubic-bezier(.2,.6,.2,1),
                transform .25s cubic-bezier(.2,.6,.2,1),
                border-color .25s ease;
}
.door:hover, .why-cell:hover, .guide-feature:hover {
    box-shadow: var(--sh-lift);
    border-color: var(--line-2);
    transform: translateY(-2px);   /* 2 px. Pas 8. */
}

/* --- 2. Les chiffres s'alignent ------------------------------------------- */
/* `tabular-nums` donne a tous les chiffres la MEME largeur : les colonnes
   d'un tableau tombent alors les unes sous les autres au pixel pres. Sans
   cela, un « 1 » etroit decale toute la ligne, et l'oeil lit du desordre
   avant de lire des donnees. */
.stat .v, .plan .price, .dep-table td, .bar-axis,
.dist .small, .stats-row .v, .offre-rappel-tete strong {
    font-variant-numeric: tabular-nums;
    font-feature-settings: 'tnum' 1;
}

/* --- 3. Les boutons ne rebondissent plus ---------------------------------- */
/* `transform: scale(0.98)` au clic imite le bouton d'une application mobile.
   Sur un site vitrine, cela fait maquette. Un vrai bouton s'enfonce : il
   descend d'un pixel et son ombre se resserre. */
.btn {
    transition: transform .2s cubic-bezier(.2,.6,.2,1),
                box-shadow .2s ease, opacity .2s ease, background .2s ease;
    box-shadow: 0 1px 2px rgba(28,25,23,.10);
}
.btn:hover { transform: translateY(-1px); box-shadow: var(--sh-sm); }
.btn:active { transform: translateY(0); box-shadow: none; }

/* --- 4. Le sur-titre porte un filet d'or --------------------------------- */
/* Un trait de 22 px, dans l'or du QR imprime. C'est le seul ornement de la
   page, et il est deliberement minuscule : un detail qui se remarque est un
   detail rate. Il reprend la couleur de l'encre du code — la page et l'objet
   imprime parlent la meme langue. */
.eyebrow { position: relative; padding-left: 30px; }
.eyebrow::before {
    content: ''; position: absolute; left: 0; top: 50%;
    width: 22px; height: 1px; background: var(--gold); opacity: .85;
}

/* --- 5. Un seul anneau de focus, partout --------------------------------- */
/* Le contour par defaut du navigateur change d'un navigateur a l'autre et
   colle au texte. Celui-ci est identique partout et respire. Il n'est JAMAIS
   supprime : quelqu'un qui navigue au clavier doit savoir ou il se trouve. */
:where(a, button, input, select, textarea, summary):focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 3px;
    border-radius: 4px;
}

/* --- 6. Le texte long respire -------------------------------------------- */
/* 1.6 convient a de l'interface. Pour de la prose lue en entier, 1.7 reduit
   nettement la fatigue — et une mesure plafonnee a 68 caracteres empeche
   l'oeil de perdre sa ligne en revenant a la marge. */
.lede { line-height: 1.68; }
.legal-body p, .legal-body li { line-height: 1.72; max-width: 68ch; }

/* ==========================================================================
   PASSE MOBILE — LES CIBLES TACTILES (0.3.10, 03/08/2026)
   ==========================================================================
   Mesure au navigateur sur la page d'accueil a 390 px, avant correction :
   30 elements cliquables sous 44 px de haut. Les pires :

       « Voir la FAQ » ................................. 20 px
       « Pourquoi nous faire confiance » ............... 26 px
       les liens du pied de page ....................... 32 px
       les pastilles de langue ......................... 34 px

   44 px est la recommandation d'Apple comme de Google, et elle ne sort pas
   de nulle part : c'est la largeur moyenne d'une pulpe de doigt. En dessous,
   on ne rate pas la cible de temps en temps, on la rate SYSTEMATIQUEMENT
   quand on marche, qu'on tient l'appareil d'une main, ou qu'on a plus de
   soixante ans.

   Le pied de page est le cas le plus grave : ce sont des liens EMPILES, donc
   une erreur de quelques pixels n'ouvre pas rien, elle ouvre LA PAGE
   D'A COTE. C'est plus agacant qu'un clic perdu.

   ⚠️ ON AGRANDIT LA ZONE, PAS LE TEXTE.
   Le remplissage vertical fait grandir la cible sans toucher a la taille des
   caracteres : la mise en page respire pareil, seule la surface tactile
   change. Grossir le texte aurait rallonge une page qui fait deja 6,5 ecrans.
   ========================================================================== */
@media (max-width: 900px) {
    /* Liens empiles du pied de page : 32 -> 44 px. */
    .footer-col a { padding: 11px 0; }

    /* Les liens de fin de section poses dans un paragraphe (« Voir la FAQ »,
       « Pourquoi nous faire confiance », le credit de l'editeur en pied de
       page). `inline-block` est INDISPENSABLE : un element `inline` ignore le
       remplissage vertical dans le calcul de sa zone cliquable — la cible
       serait restee a 20 px malgre le padding.

       ⚠️ `.link-arrow` ET NON `.trust-text a`. Premier jet ecrit de memoire,
       et il ne visait aucun element : la classe reelle est `.link-arrow`. La
       mesure au navigateur l'a montre (26 px, inchange). Un selecteur qui ne
       correspond a rien ne provoque aucune erreur — il ne fait simplement
       rien, en silence. C'est pour cela qu'on remesure au lieu de relire. */
    .cta-faq a, .link-arrow, .swap-note a, .footer-entity a {
        display: inline-block; padding: 11px 2px;
    }

    /* Les cinq pastilles de langue : 34 -> 44 px. Elles sont COLLEES les unes
       aux autres sur une seule ligne — c'est exactement la configuration ou
       une cible trop petite fait choisir la MAUVAISE langue, et ou l'erreur
       coute cher puisqu'elle recharge toute la page dans une langue qu'on ne
       lit pas. 5 x 44 = 220 px : large sur un ecran de 320 px. */
    /* ⚠️ `.lang-opt`, `.nav-toggle` et `.brand` sont dimensionnes dans le bloc
       1279 px ci-dessus, avec le reste de l'en-tete tactile. Les redeclarer
       ici en ferait une deuxieme source de verite pour la meme regle. */

    /* Le sur-titre etait a 11,2 px. En capitales tres espacees, c'est la
       limite du lisible sur un ecran tenu a bout de bras. */
    .eyebrow { font-size: 0.75rem; }
}

/* ==========================================================================
   PASSE MOBILE — LE TAMPON NE DOIT RIEN RECOUVRIR
   ==========================================================================
   Il est en position fixe : il ne defile pas, donc il est susceptible de se
   poser sur N'IMPORTE QUEL contenu de la page, pas seulement sur le hero.
   `pointer-events: none` garantit deja qu'il n'intercepte aucun clic — mais
   il peut encore GENER LA LECTURE.

   D'ou l'encre plus claire sur petit ecran (voir .tampon-vie plus bas) et,
   ci-dessous, une marge de securite en haut de la premiere section : sans
   elle, le sur-titre « Carte de visite numerique » passait dessous.
   ========================================================================== */
@media (max-width: 900px) {
    .hero { padding-top: 40px; }
}

/* ==========================================================================
   LE TAMPON FIXE « À VIE ET GRATUIT ! » — page d'accueil uniquement
   ==========================================================================
   Un vrai tampon encreur, obtenu SANS AUCUNE IMAGE. Trois choses le
   distinguent d'un simple badge tourné :

   1. L'ENCRE EST IRRÉGULIÈRE. Un tampon ne dépose jamais une couleur pleine :
      le caoutchouc porte mal l'encre, et il reste des manques. C'est le rôle
      du `mask-image` en pointillés radiaux — il grignote la couleur de façon
      aléatoire, sur le cadre comme sur les lettres. Sans lui, on lit « badge
      SVG », pas « tampon ».

   2. IL EST IMPRIMÉ, PAS POSÉ. `mix-blend-mode: multiply` fait que l'encre se
      multiplie avec ce qu'il y a dessous au lieu de le recouvrir : le texte
      de la page transparaît légèrement à travers, exactement comme de l'encre
      sur du papier déjà imprimé.

   3. IL EST DE TRAVERS, MAIS PAS TROP. -13 degrés : au-delà on lit « autocollant
      décoratif », en deçà on croit à une erreur de mise en page.

   ⚠️ `pointer-events: none` EST OBLIGATOIRE. Il est en position fixe
   par-dessus toute la page ; sans cela il intercepterait les clics de ce qui
   se trouve dessous, et comme il ne mène nulle part, ce serait un trou noir
   dans le coin de l'écran.

   ⚠️ Z-INDEX 30, SOUS L'EN-TÊTE (40). L'en-tête est collant : si le tampon
   passait devant, il recouvrirait le bouton « Créer un compte » au défilement.
   ========================================================================== */
.tampon-vie {
    position: fixed; top: 96px; right: 40px; z-index: 30;
    pointer-events: none;
    /* ------------------------------------------------------------------
       ⚠️ ROTATION POSITIVE : LE TAMPON PENCHE VERS L'INTERIEUR DE LA PAGE.
       ------------------------------------------------------------------
       Premier jet a -13deg, donc dans le sens inverse des aiguilles : le
       bout droit du texte MONTAIT. Place dans le coin superieur droit, il
       pointait donc vers l'exterieur de l'ecran — il donnait l'impression de
       s'echapper de la page au lieu d'y etre appose.

       A +13deg, le bout droit descend : le tampon penche vers le centre de
       la page. C'est le geste naturel de quelqu'un qui tamponne un document
       tenu devant lui, et l'oeil est ramene vers le contenu au lieu d'etre
       emmene hors cadre.

       ⚠️ SI LE TAMPON DEMENAGE UN JOUR A GAUCHE, IL FAUDRA REPASSER EN
       NEGATIF : c'est la position dans l'ecran qui decide du signe, pas
       l'esthetique du tampon pris isolement.
       ------------------------------------------------------------------ */
    transform: rotate(13deg);
    mix-blend-mode: multiply;
    /* L'apparition est lente et discrete : un tampon qui surgit ressemble a
       une publicite. Celui-ci est deja la quand on regarde. */
    animation: tampon-encre .9s ease-out both;
}
@keyframes tampon-encre {
    from { opacity: 0; transform: rotate(13deg) scale(1.14); }
    to   { opacity: 1; transform: rotate(13deg) scale(1); }
}
/* Quelqu'un qui a demande a reduire les animations ne veut pas d'un tampon
   qui tombe sur sa page. */
@media (prefers-reduced-motion: reduce) {
    .tampon-vie { animation: none; }
}

/* --------------------------------------------------------------------------
   ⚠️ LE CADRE RESTE NET. SEULES LES LETTRES PERDENT DE L'ENCRE.
   --------------------------------------------------------------------------
   Deux essais rates avant celui-ci, juges a l'ecran dans Chrome :

   1er essai — masque en TRAME DE POINTS sur tout le tampon. Une trame de
   points ne GARDE que les points : elle a mange environ 80 % de l'encre. Le
   tampon etait illisible, on lisait un gribouillis rose.

   2e essai — masque inverse (encre pleine percee de manques), toujours sur
   tout le tampon, cadre compris. Les lettres devenaient bonnes, mais le
   CADRE tournait au pointille regulier : sur un filet de 3 px, un manque de
   1,5 px en emporte la moitie, et les trous tombent a intervalles egaux le
   long d'une ligne droite. On lisait « cadre perfore », pas « tampon ».

   D'ou cette version : le cadre est plein, le masque ne porte que sur le
   texte. C'est d'ailleurs plus juste. Un tampon appuye franchement laisse un
   contour net ; ce sont les pleins des lettres, la ou le caoutchouc porte le
   plus d'encre, qui accrochent mal.

   Trois trames a des pas premiers entre eux (9, 14, 19 px) et a des origines
   differentes : leur recouvrement ne se repete pas a l'oeil. `intersect` :
   un manque de N'IMPORTE LAQUELLE des trames perce l'encre, donc les defauts
   s'accumulent au lieu de s'annuler.
   -------------------------------------------------------------------------- */
.tv-cadre {
    display: flex; align-items: center; justify-content: center;
    padding: 13px 24px;
    border: 3px solid var(--stamp);
    border-radius: 7px;
    /* Le double filet : c'est ce qui fait « tampon officiel » plutot que
       « cadre de bouton ». */
    box-shadow: inset 0 0 0 2px transparent, inset 0 0 0 3.5px var(--stamp);
    color: var(--stamp);
    opacity: .78;
}
.tv-txt {
    font-family: var(--display);
    font-size: 1.05rem; font-weight: 800;
    text-transform: uppercase; letter-spacing: 0.08em;
    line-height: 1.15; text-align: center;
    max-width: 9ch;

    -webkit-mask-image:
        radial-gradient(circle at 27% 41%, transparent 0 .9px, #000 1.05px),
        radial-gradient(circle at 68% 73%, transparent 0 .7px, #000 .85px),
        radial-gradient(circle at 88% 19%, transparent 0 1.1px, #000 1.25px);
    mask-image:
        radial-gradient(circle at 27% 41%, transparent 0 .9px, #000 1.05px),
        radial-gradient(circle at 68% 73%, transparent 0 .7px, #000 .85px),
        radial-gradient(circle at 88% 19%, transparent 0 1.1px, #000 1.25px);
    -webkit-mask-size: 9px 9px, 14px 14px, 19px 19px;
    mask-size: 9px 9px, 14px 14px, 19px 19px;
    -webkit-mask-composite: source-in;
    mask-composite: intersect;
}

/* ⚠️ REPLI POUR LES NAVIGATEURS SANS `mask-composite`.
   Sans ce test, les trois trames se combinent de facon imprevisible et le
   texte peut disparaitre. On lui rend alors une encre pleine : moins texture,
   mais toujours lisible. Un tampon un peu trop propre vaut mieux qu'un mot
   efface. */
@supports not ((mask-composite: intersect) or (-webkit-mask-composite: source-in)) {
    .tv-txt { -webkit-mask-image: none; mask-image: none; }
}

@media (max-width: 1279px) {
    /* L'en-tete passe sur deux lignes des 1279 px : il fait alors une
       centaine de pixels de haut. A `top: 96px` le tampon se glissait dessous
       et son coin se retrouvait coupe. */
    .tampon-vie { top: 120px; }
}
@media (max-width: 900px) {
    /* Sur telephone il reste PRESENT — c'est ce qui a ete demande — mais plus
       petit, plus haut et plus clair : sur 390 px de large, la meme densite
       d'encre mangeait le texte en dessous. */
    .tampon-vie { top: 112px; right: 12px; }
    .tv-cadre { padding: 8px 14px; border-width: 2.5px; opacity: .62; }
    .tv-txt { font-size: 0.76rem; letter-spacing: 0.05em; max-width: 8ch; }
}
@media (max-width: 400px) {
    /* A 320 px, le compte devient juste : on reprend 14 px sur les ecarts et
       un peu sur la marque, plutot que de laisser la barre deborder. */
    .site-header .bar, .app-header .bar { gap: 8px; }
    .brand { font-size: 1.18rem; }
    .lang-menu summary { padding: 0 7px; }
}
@media (max-width: 380px) {
    .tampon-vie { top: 108px; right: 7px; }
    .tv-txt { font-size: 0.7rem; }
}

/* Pourquoi nous (page + cartes de confiance) */
.why-cell { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 28px 26px; box-shadow: var(--sh-sm); }
.why-cell h3 { margin: 0; }

/* Bandeau de confiance (page d'accueil) — tampon rond + court argumentaire,
   lien vers /pourquoi-nous. */
.trust-stamp {
    position: relative;
    display: inline-flex; flex-direction: column; align-items: center; justify-content: center;
    width: 168px; height: 168px; border-radius: 50%; flex: none;
    border: 2px solid var(--accent); box-shadow: inset 0 0 0 5px var(--accent-bg);
    transform: rotate(-6deg); text-align: center; padding: 16px;
    font-family: var(--display); color: var(--accent-ink);
    transition: transform .15s ease;
}
.trust-stamp:hover { transform: rotate(-2deg) scale(1.04); color: var(--accent-ink); }
.trust-stamp .ts-l1 { font-size: 0.8rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em; line-height: 1.2; }
.trust-stamp .ts-div { font-size: 0.7rem; margin: 6px 0; opacity: 0.6; }
.trust-stamp .ts-l2 { font-size: 0.66rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; opacity: 0.85; }
/* Le tampon a l'air d'un simple badge décoratif — sans indice, personne ne
   devine qu'il est cliquable (encore moins sur mobile, où il n'y a pas de
   survol). Petite pastille flèche toujours visible, contre-pivotée pour
   rester bien droite malgré la rotation du tampon. */
.trust-stamp .ts-arrow {
    position: absolute; right: -2px; bottom: 12px;
    width: 34px; height: 34px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    background: var(--accent); color: #fff; font-size: 1rem; font-weight: 700;
    box-shadow: var(--sh-sm); border: 2px solid var(--bg);
    transform: rotate(6deg);
}
/* Le bandeau utilisait `.grid.cols-2`, ce qui donnait deux colonnes égales :
   le tampon (168 px) flottait au milieu d'une demi-page vide. Colonne
   « au plus juste » pour le tampon, tout le reste au texte. */
.trust-banner { display: grid; grid-template-columns: auto 1fr; align-items: center; gap: 44px; }
.trust-banner > div:last-child { min-width: 0; }
.trust-title { font-size: clamp(1.5rem, 2.4vw, 2rem); margin-bottom: 12px; }
.trust-text { font-size: 1.02rem; max-width: 52ch; margin-bottom: 14px; }

/* Points détaillés (page « Comment ça marche ») — filet fin plutôt qu'un
   trait épais : la règle typographique remplace la barre graphique. */
.detail-point { border-top: 1px solid var(--line-2); padding-top: 18px; margin-bottom: 30px; }
.detail-point h3 { margin: 8px 0 8px; }
.detail-point p { color: var(--soft); margin: 0; }

/* Bénéfices */
.feat { display: grid; grid-template-columns: repeat(3, 1fr); gap: 34px; }
.feat h3 { margin-bottom: 8px; }
.feat p { color: var(--soft); font-size: 0.98rem; margin: 0; }

/* ---------------------------------------------------------------------------
   Deux gestes de création côte à côte (tableau de bord, liste des cartes).
   Sur mobile ils passent pleine largeur : deux boutons serrés l'un contre
   l'autre sur 375 px deviennent deux cibles trop petites pour le pouce.
   --------------------------------------------------------------------------- */
.head-actions { display: flex; gap: 10px; flex-wrap: wrap; }
@media (max-width: 560px) {
    .head-actions { width: 100%; }
    .head-actions .btn { flex: 1 1 100%; }
}

/* Paliers de l'offre organisations */
.org-tiers { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.org-tier { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 26px 24px; }
.org-tier .ot-seats { font-family: var(--display); font-weight: 600; font-size: 0.92rem; color: var(--soft); }
.org-tier .ot-price { font-family: var(--serif); font-size: 2.3rem; line-height: 1; margin: 10px 0 6px; color: var(--ink); }
.org-tier .ot-price small { font-family: var(--sans); font-size: 0.85rem; color: var(--muted); }
.org-tier .ot-unit { font-size: 0.85rem; color: var(--muted); }

/* Le formulaire de devis à droite de l'argumentaire : sur un écran étroit
   l'ordre s'inverse naturellement (une seule colonne), le texte d'abord. */
.org-form-wrap { display: grid; grid-template-columns: 1fr 1.1fr; gap: 40px; align-items: start; }
.org-form { position: relative; }
@media (max-width: 900px) {
    .org-tiers { grid-template-columns: 1fr; }
    .org-form-wrap { grid-template-columns: 1fr; gap: 28px; }
}

/* ---------------------------------------------------------------------------
   Mise en avant de la signature d'e-mail (accueil).
   --------------------------------------------------------------------------- */
.sig-promo { display: grid; grid-template-columns: 1fr 300px; gap: 44px; align-items: center; }
.sig-promo-list { list-style: none; margin: 20px 0 26px; padding: 0; display: grid; gap: 9px; }
.sig-promo-list li { position: relative; padding-left: 24px; color: var(--ink-2); font-size: 0.98rem; }
.sig-promo-list li::before {
    content: "✓"; position: absolute; left: 0; top: 0;
    color: var(--accent); font-weight: 700;
}

/* Illustration d'une signature — des blocs, pas du texte : elle doit se lire
   d'un coup d'œil comme une forme reconnaissable, et rester muette pour les
   lecteurs d'écran (aria-hidden côté HTML). */
.sig-demo {
    position: relative; background: var(--card); border: 1px solid var(--line);
    border-radius: var(--r-lg); padding: 22px 24px; box-shadow: var(--sh-sm);
}
.sig-demo .sd-logo { width: 64px; height: 22px; border-radius: 4px; background: var(--gold); opacity: .85; margin-bottom: 14px; }
.sig-demo .sd-name { font-family: var(--serif); font-size: 1.15rem; color: var(--ink); }
.sig-demo .sd-role { font-size: 0.84rem; color: var(--soft); margin-bottom: 12px; }
.sig-demo .sd-line { height: 7px; border-radius: 4px; background: var(--bg-2); margin-bottom: 7px; }
.sig-demo .sd-line.short { width: 62%; }
.sig-demo .sd-qr {
    position: absolute; right: 22px; bottom: 22px;
    width: 54px; height: 54px; border-radius: 6px;
    background:
        repeating-linear-gradient(90deg, var(--gold) 0 6px, transparent 6px 12px),
        repeating-linear-gradient(0deg, var(--gold) 0 6px, transparent 6px 12px);
    opacity: .8;
}

@media (max-width: 900px) {
    .sig-promo { grid-template-columns: 1fr; gap: 28px; }
    /* L'illustration passe APRÈS le texte : sur un écran étroit, une image
       décorative en tête repousse l'argument hors de vue. */
    .sig-demo { order: 2; max-width: 320px; }
}

/* ---------------------------------------------------------------------------
   Champs facultatifs ajoutés un par un.
   --------------------------------------------------------------------------- */
.extra-block { border-top: 1px solid var(--line); margin-top: 26px; padding-top: 22px; }
.extra-rows { display: grid; gap: 14px; margin-bottom: 14px; }
.extra-row { margin-bottom: 0; }
.extra-input { display: flex; gap: 8px; align-items: center; }
.extra-input .input { flex: 1 1 auto; min-width: 0; }
/* Cible tactile de 40 px : un « × » de 16 px se rate une fois sur deux au
   pouce, et l'utilisateur efface alors le champ voisin. */
.extra-remove {
    flex: none; width: 40px; height: 40px; border: 1px solid var(--line-2);
    border-radius: var(--r); background: var(--bg); color: var(--muted);
    font-size: 1.2rem; line-height: 1; cursor: pointer;
    transition: border-color .15s ease, color .15s ease;
}
.extra-remove:hover { border-color: var(--bad); color: var(--bad); }
.extra-add { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.extra-add .select { flex: 1 1 220px; min-width: 0; }

@media (max-width: 560px) {
    .extra-add .select, .extra-add .btn { flex: 1 1 100%; }
}

/* ---------------------------------------------------------------------------
   Signature d'e-mail.
   --------------------------------------------------------------------------- */
.sig-color-row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
/* Le sélecteur natif est minuscule et quasi invisible sur mobile : on lui
   donne une vraie surface, sinon personne ne le remarque. */
.sig-color-row input[type=color] {
    width: 52px; height: 40px; flex: none; padding: 2px;
    border: 1px solid var(--line-2); border-radius: var(--r); background: var(--bg); cursor: pointer;
}
.logo-preview { max-height: 48px; width: auto; border-radius: 4px; background: var(--bg-2); padding: 4px; }

.sig-grid { display: grid; grid-template-columns: 340px 1fr; gap: 24px; align-items: start; }

/* L'APERÇU SUIT LE DÉFILEMENT.
   Le panneau de gauche est long ; en descendant jusqu'aux curseurs, le rendu
   sortait de l'écran et on réglait une taille sans voir ce qu'elle donnait.
   C'est précisément ce qu'un aperçu doit empêcher. `sticky` suffit : aucun
   script, et le navigateur le gère mieux que nous ne le ferions. */
@media (min-width: 901px) {
    .sig-live { position: sticky; top: 16px; }
}

/* Les réglages doivent tenir dans un écran, sans défilement : c'est en
   descendant vers les curseurs qu'on perdait l'aperçu de vue. D'où des lignes
   d'une seule hauteur de texte, et plus de colonne de rappel — le titulaire
   vient de saisir ces valeurs, les lui remontrer coûtait une ligne par champ
   et forçait le libellé à se couper en deux. */
.sig-fields { display: grid; gap: 0; }
.sig-field {
    display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 10px;
    padding: 6px 8px; border-radius: var(--r); cursor: pointer;
    transition: background .12s ease;
}
.sig-field:hover { background: var(--bg-2); }
.sig-field input { accent-color: var(--ink); }
.sig-field .sf-label { font-size: 0.88rem; line-height: 1.3; }
.sig-field-credit { border-top: 1px solid var(--line); margin-top: 4px; padding-top: 10px; }

/* Ligne réordonnable : la case et son libellé restent un <label> cliquable,
   les flèches sont à côté et non dedans — cliquer une flèche ne doit surtout
   pas décocher le champ qu'on est en train de déplacer. */
.sig-row { grid-template-columns: 1fr auto; padding-right: 2px; }
.sig-row .sf-main {
    display: grid; grid-template-columns: auto 1fr; align-items: center; gap: 10px;
    cursor: pointer; min-width: 0;
}
.sf-move { display: flex; gap: 2px; }
.sf-move button {
    border: 1px solid var(--line-2); background: var(--bg); color: var(--soft);
    border-radius: 6px; cursor: pointer; line-height: 1; font-size: 0.58rem;
    /* 26 px sur ordinateur, élargi à 34 px sur téléphone (voir plus bas) :
       c'est au doigt que la cible doit être généreuse, pas à la souris. */
    width: 26px; height: 26px; display: grid; place-items: center;
    transition: background .12s ease, color .12s ease;
}
.sf-move button:hover { background: var(--ink); color: #fff; border-color: var(--ink); }

/* Dispositions : la vignette porte l'information, le nom ne fait que la
   confirmer. Personne ne devine « empilée » sans voir le schéma. */
.sig-layouts { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.sig-layout {
    display: grid; justify-items: center; gap: 4px; cursor: pointer;
    border: 1px solid var(--line-2); border-radius: var(--r); padding: 8px 6px;
    color: var(--soft); text-align: center;
    transition: border-color .12s ease, background .12s ease, color .12s ease;
}
.sig-layout input { position: absolute; opacity: 0; width: 0; height: 0; }
.sig-layout span { font-size: 0.74rem; line-height: 1.2; }
.sig-layout:hover { background: var(--bg-2); }
.sig-layout.is-on { border-color: var(--ink); color: var(--ink); background: var(--bg-2); }
.sig-layout:focus-within { outline: 2px solid var(--ink); outline-offset: 2px; }


/* APPARENCE — trois lignes compactes plutôt que trois sections.
   Les deux tailles se règlent d'un geste identique : proposer un curseur pour
   le logo et des boutons pour le QR obligeait à comprendre deux mécaniques
   pour un réglage de même nature. */
.sig-tune { display: grid; gap: 11px; }
.sig-tune-row { display: grid; grid-template-columns: 92px 1fr auto; gap: 12px; align-items: center; }
.sig-tune-row .lbl { font-size: 0.82rem; font-weight: 600; line-height: 1.25; }
.sig-tune-row input[type=range] { accent-color: var(--ink); min-width: 0; width: 100%; }
.sig-tune-row output { font-size: 0.8rem; color: var(--muted); min-width: 5ch; text-align: right; }
.sig-tune-row[hidden] { display: none; }

/* Le cadre isole l'aperçu de la feuille de style du site : sans lui, on
   montrerait une signature embellie que le destinataire ne verra jamais. */
.sig-preview {
    width: 100%; height: 210px; border: 1px solid var(--line-2);
    border-radius: var(--r); background: #fff; display: block;
}
.sig-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 14px; align-items: center; }

.sig-guide { border-top: 1px solid var(--line); padding: 10px 0 2px; }
.sig-guide:first-of-type { border-top: none; padding-top: 0; }
.sig-guide summary { cursor: pointer; font-weight: 600; font-size: 0.94rem; padding: 4px 0; }
.sig-guide p { color: var(--soft); margin: 8px 0 10px; }

@media (max-width: 900px) {
    .sig-grid { grid-template-columns: 1fr; }

    /* SUR TÉLÉPHONE, L'APERÇU PASSE DEVANT ET RESTE COLLÉ EN HAUT.
       Il était auparavant sous les réglages — « on choisit avant de regarder
       le résultat ». C'était vrai avec des cases à cocher ; ça ne l'est plus
       avec des curseurs, où l'on règle EN REGARDANT. Un aperçu qu'il faut
       aller chercher en défilant ne sert à rien pendant qu'on fait glisser.

       Compact et opaque : il recouvre les réglages qui défilent dessous, et
       un fond transparent les laisserait apparaître au travers. */
    .sig-side { order: -1; }
    .sig-live {
        position: sticky; top: 0; z-index: 5;
        background: var(--bg); border-radius: var(--r);
        box-shadow: 0 6px 18px rgba(0, 0, 0, .07);
    }
    .sig-live > h3, .sig-live > p:first-of-type { display: none; }
    .sig-preview { height: 168px; }
    .sig-actions { margin-top: 10px; }
    .sig-actions .btn { flex: 1 1 100%; }
    .sig-live .small.muted:last-child { display: none; }

    /* Le libellé passe au-dessus du curseur : à 375 px, une colonne de 92 px
       pour « Taille du QR code » ne laisse plus assez de course au doigt. */
    .sig-tune-row { grid-template-columns: 1fr auto; }
    .sig-tune-row .lbl { grid-column: 1 / -1; }
    /* À 375 px, trois colonnes laissent ~95 px chacune : le schéma reste
       lisible et le nom tient sur une ligne. On garde donc les trois de front,
       les comparer d’un coup d’œil étant tout leur intérêt. */
    .sig-layout { padding: 10px 4px; }
    .sig-layout svg { width: 100%; height: auto; max-width: 56px; }
    .sig-layout span { font-size: 0.72rem; }
    /* Cible tactile élargie : c'est au doigt que ces flèches serviront. */
    .sf-move button { width: 34px; height: 34px; }
}

/* Tags cas d'usage */
.tags { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 24px; }
.tag { border-radius: var(--r-pill); padding: 9px 16px; font-size: 0.9rem; color: var(--soft); background: var(--bg-2); }
.tag:hover { color: var(--ink); }

/* Bande CTA sombre */
.cta-band { padding: 30px 0 84px; }
.cta-band .wrap { background: var(--ink); color: #fff; border-radius: 28px; padding: 64px 40px; text-align: center; }
.cta-band h2 { color: #fff; max-width: 20ch; margin: 0 auto 14px; }
.cta-band .lede { color: rgba(255,255,255,.66); max-width: 46ch; margin: 0 auto 26px; }
/* L'issue vers la FAQ, sous le bouton. C'est ce lien qui permet à l'accueil
   de rester court : celui qui veut comprendre avant de s'inscrire a un
   chemin, au lieu d'une section de plus à faire défiler. */
.cta-faq { margin: 26px 0 0; font-size: 0.92rem; }
.cta-faq .muted { color: rgba(255,255,255,.5); }
.cta-faq a { color: #fff; font-weight: 600; border-bottom: 1px solid rgba(255,255,255,.4); padding-bottom: 1px; margin-left: 6px; }
.cta-faq a:hover { color: #fff; border-bottom-color: #fff; }

/* =======================================================================
   GUIDES PUBLICS D'INSTALLATION

   Ces pages répondent à une question tapée dans un moteur de recherche.
   Quelqu'un qui arrive là veut lire une réponse, pas admirer une mise en
   page : d'où des étapes larges, très lisibles, et un appel à l'action
   qui n'arrive qu'après.
   ======================================================================= */
.guide-steps { counter-reset: gs; list-style: none; padding: 0; margin: 0; }
.guide-steps li {
    counter-increment: gs; position: relative;
    padding: 0 0 16px 46px; font-size: 1rem; line-height: 1.6; color: var(--soft);
}
.guide-steps li::before {
    content: counter(gs); position: absolute; left: 0; top: -1px;
    width: 30px; height: 30px; border-radius: 50%;
    background: var(--ink); color: #fff;
    display: grid; place-items: center; font-size: 0.82rem; font-weight: 700;
}
/* Le trait relie les pastilles : on voit d'un coup d'œil que c'est une
   suite ordonnée, et non une liste de possibilités au choix. */
.guide-steps li:not(:last-child)::after {
    content: ''; position: absolute; left: 14px; top: 32px; bottom: 6px;
    width: 1px; background: var(--line-2);
}

.guide-trap { border-left: 3px solid var(--accent, var(--ink)); }

.guide-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
.guide-card {
    display: grid; gap: 4px; padding: 20px;
    border: 1px solid var(--line-2); border-radius: var(--r);
    color: inherit; text-decoration: none;
    transition: border-color .14s ease, transform .14s ease, background .14s ease;
}
.guide-card:hover { border-color: var(--ink); background: var(--bg-2); transform: translateY(-2px); }
.guide-card strong { font-size: 1rem; }
.guide-card span { font-size: 0.86rem; color: var(--muted); line-height: 1.45; }
.guide-card em { font-size: 0.76rem; color: var(--muted); font-style: normal; opacity: .7; }

.guide-cta {
    display: flex; align-items: center; justify-content: space-between; gap: 28px;
    flex-wrap: wrap; background: var(--bg-2);
    border: 1px solid var(--line-2); border-radius: 22px; padding: 32px;
}
.guide-cta-actions { display: flex; gap: 10px; flex-wrap: wrap; }

@media (max-width: 700px) {
    .guide-steps li { padding-left: 40px; font-size: 0.96rem; }
    .guide-cta { padding: 24px; }
    /* Les deux boutons prennent toute la largeur : sur un téléphone, une
       cible de la largeur du pouce vaut mieux que deux cibles serrées. */
    .guide-cta-actions { width: 100%; }
    .guide-cta-actions .btn { flex: 1 1 100%; text-align: center; }
}

/* Les trois actions de l'en-tête de carte. Le <form> de suppression doit se
   comporter comme les deux liens qui le précèdent, d'où la remise à plat de
   ses marges — sinon il décale la rangée d'un cheveu, ce qui se voit. */
.card-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
/* Pas de `display: contents` sur le formulaire : il retire l'élément de
   l'arbre d'accessibilité sur plusieurs navigateurs encore en service. Un
   simple élément de flex, aux marges remises à zéro, produit le même
   alignement sans cet effet de bord. */
.card-actions form { margin: 0; }

/* Action destructrice : même gabarit que ses voisines, mais au repos elle
   reste grise. Le rouge n'apparaît qu'au survol — elle doit se trouver, pas
   attirer l'œil avant « Modifier ». */
.btn-danger-ghost { color: var(--muted); }
.btn-danger-ghost:hover { color: var(--bad); border-color: var(--bad); background: var(--bad-bg); }

/* Footer */
.site-footer { background: var(--bg-2); padding: 56px 0 34px; }
.footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 30px; }
.site-footer .brand { font-size: 1.5rem; }
.site-footer .tl { color: var(--soft); max-width: 34ch; margin-top: 10px; font-size: 0.95rem; }
.footer-col h4 { font-family: var(--sans); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.12em; color: var(--muted); margin-bottom: 14px; font-weight: 600; }
.footer-col a { display: block; color: var(--soft); font-size: 0.93rem; padding: 4px 0; }
.footer-col a:hover { color: var(--accent); }
/* Bas de pied de page — centré (copyright, entité légale, langue). */
.footer-base {
    display: flex; flex-direction: column; align-items: center; text-align: center;
    gap: 10px; margin-top: 40px; padding-top: 20px; border-top: 1px solid var(--line-2);
    font-size: 0.82rem; color: var(--muted);
}
.footer-entity a { color: inherit; text-decoration: underline; text-decoration-color: var(--line-2); text-underline-offset: 2px; }
.footer-entity a:hover { color: var(--accent); text-decoration-color: var(--accent); }

/* Sélecteur de langue */
/* ⚠️ LES REGLES DE L'ANCIENNE LISTE DEROULANTE ONT ETE RETIREES ICI.
   `.lang-switch select` et `.lang-switch noscript` ne visaient plus aucun
   element depuis que le selecteur est fait de liens (3.00) : du CSS mort,
   qui laisse croire a une liste deroulante quand on relit la feuille.
   La mise en forme actuelle vit tout en bas du fichier, avec `.lang-opt`. */

/* Espace membre */
.app-shell { min-height: 100vh; display: flex; flex-direction: column; }
.app-header { position: sticky; top: 0; z-index: 40; border-bottom: 1px solid var(--line); background: var(--bg); }
/* --------------------------------------------------------------------------
   ⚠️ L'EN-TETE MEMBRE A BESOIN DE LA MEME LARGEUR QUE L'EN-TETE PUBLIC
   --------------------------------------------------------------------------
   Constate le 30/07/2026 : « Tableau de bord », « Mes cartes » et « Mon
   compte » se cassaient en deux lignes sur desktop. Deux causes, additionnees.

   1. `.app-header .wrap` restait a --wrap (1080 px), alors que `.site-header
      .wrap` avait ete elargi a 1240 px le 26/07 pour exactement le meme
      probleme. La correction n'avait ete appliquee qu'a UN des deux en-tetes.
      C'est le motif qui revient depuis la serie 2.0x : une regle ecrite a deux
      endroits, juste a l'un et fausse a l'autre.

   2. `.nav a` porte `white-space: nowrap`, `.app-nav a` ne l'avait pas. Meme
      oubli, meme paire de fichiers.

   Le compte, en francais (la langue aux libelles les plus longs) : logo 150,
   icone retour 38, les cinq entrees 518, les cinq langues 172, deconnexion
   115 — soit environ 1025 px. Contre 1032 px disponibles en 1080. Sept pixels
   de marge : le moindre libelle un peu plus long passait a la ligne. En 1240,
   il en reste pres de 170, ce qui absorbe aussi le neerlandais.
   -------------------------------------------------------------------------- */
.app-header .wrap { max-width: 1240px; }
.app-header .bar { position: relative; height: 64px; display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.app-nav { display: flex; gap: 6px; align-items: center; }
/* `white-space: nowrap` : un libelle de menu ne se coupe JAMAIS en deux. S'il
   ne tient pas, c'est la barre qu'il faut elargir, pas le mot qu'il faut
   casser. */
.app-nav a { font-size: 0.9rem; color: var(--soft); padding: 8px 12px; border-radius: var(--r-pill); white-space: nowrap; }
.app-nav a:hover { background: var(--bg-2); color: var(--ink); }
.app-nav a.active { color: var(--ink); background: var(--bg-2); }
.app-main { flex: 1; padding: 44px 0 72px; }

.page-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 20px; margin-bottom: 30px; flex-wrap: wrap; }
.page-head h1 { font-size: clamp(1.9rem, 3vw, 2.5rem); }
.page-head .sub { color: var(--muted); margin-top: 6px; }
.breadcrumb { font-size: 0.85rem; color: var(--muted); margin-bottom: 12px; }
.breadcrumb a { color: var(--muted); }
.breadcrumb a:hover { color: var(--accent); }

/* Tuiles de stats */
.stats-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.stat { background: var(--bg-2); border-radius: 18px; padding: 22px 24px; }
.stat .k { font-size: 0.74rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--muted); font-weight: 600; }
.stat .v { font-family: var(--display); font-weight: 700; font-size: 2.2rem; margin-top: 8px; line-height: 1; letter-spacing: -0.02em; }
.stat .v small { font-family: var(--sans); font-size: 0.9rem; color: var(--muted); font-weight: 400; }

/* Panneaux & listes */
.panel { background: var(--card); border: 1px solid var(--line); border-radius: 18px; }
.panel-p { padding: 24px; }
.qr-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; }
.qr-item { background: var(--card); border: 1px solid var(--line); border-radius: 18px; padding: 20px; display: flex; flex-direction: column; gap: 14px; transition: border-color .15s ease, box-shadow .15s ease; }
.qr-item:hover { border-color: var(--line-2); box-shadow: var(--sh-sm); }
.qr-item .top { display: flex; gap: 14px; align-items: center; }
.qr-item .mini { width: 60px; height: 60px; border: 1px solid var(--line); border-radius: 12px; padding: 5px; background: #fff; flex: none; }
.qr-item .mini canvas, .qr-item .mini img { width: 100%; height: 100%; }
.qr-item .label { font-weight: 600; font-size: 1.02rem; overflow-wrap: anywhere; }
.qr-item .code { font-size: 0.78rem; color: var(--muted); font-family: ui-monospace, 'SF Mono', Menlo, monospace; }
.qr-item .dest { font-size: 0.85rem; color: var(--soft); word-break: break-all; }
.qr-item .row { display: flex; justify-content: space-between; align-items: center; border-top: 1px solid var(--line); padding-top: 12px; }
.qr-item .actions { display: flex; gap: 8px; }

/* Badges */
.badge { display: inline-flex; align-items: center; gap: 6px; font-size: 0.74rem; letter-spacing: 0.02em; padding: 4px 10px; border-radius: var(--r-pill); background: var(--bg-2); color: var(--soft); }
.badge .d { width: 6px; height: 6px; border-radius: 50%; background: var(--muted); }
.badge.on { background: var(--good-bg); color: var(--good); }
.badge.on .d { background: var(--good); }
.badge.off { background: var(--bad-bg); color: var(--bad); }
.badge.off .d { background: var(--bad); }
/* --------------------------------------------------------------------------
   ⚠️ `.badge-plan`, EN UN SEUL MOT. NE JAMAIS REECRIRE `.badge-plan`.
   --------------------------------------------------------------------------
   Cette pastille s'ecrivait `class="badge plan"`. Or `.plan` est AUSSI la
   classe des CARTES TARIFAIRES : `padding: 30px 26px; display: flex;
   flex-direction: column`. Les deux selecteurs ont la meme specificite
   (0,1,0), et `.plan` est declare plus bas dans le fichier : il gagnait.

   Mesure du 03/08/2026 : la pastille faisait 81 px de haut au lieu de 27, a
   CINQ endroits — tableau de bord, page compte, en-tetes admin et stats,
   formulaire de carte. L'en-tete de /mystats debordait visiblement.

   La couleur, elle, etait juste : `.badge-plan` (0,2,0) battait `.plan` sur
   les proprietes qu'elle declarait. Seules celles qu'elle NE declarait PAS —
   padding et display — tombaient sur la carte tarifaire. D'ou un defaut qui
   ressemblait a un probleme d'espacement plutot qu'a un conflit de noms.

   Un correctif du 27/07/2026 avait deja retouche la couleur de cette pastille
   dans le formulaire de carte sans voir la cause : le symptome traite a la
   place de la maladie.

   Un seul mot : plus aucune collision possible, quel que soit l'ordre du
   fichier.
   -------------------------------------------------------------------------- */
.badge-plan { background: var(--accent-bg); color: var(--accent-ink); text-transform: uppercase; font-weight: 600; }

/* Formulaires */
.form { max-width: 560px; }
.field { margin-bottom: 20px; }
.field label.lbl { display: block; font-size: 0.82rem; font-weight: 600; color: var(--ink); margin-bottom: 7px; }
.field .help { font-size: 0.82rem; color: var(--muted); margin-top: 6px; }
.input, .textarea, .select { width: 100%; font-family: var(--sans); font-size: 1rem; color: var(--ink); background: var(--bg); border: 1px solid var(--line-2); border-radius: var(--r); padding: 0.72em 0.9em; transition: border-color .15s ease, box-shadow .15s ease; }
.input:focus, .textarea:focus, .select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-bg); }
.input.err, .textarea.err { border-color: var(--bad); }
.err-msg { color: var(--bad); font-size: 0.82rem; margin-top: 6px; }
.check { display: flex; align-items: flex-start; gap: 10px; }
.check input { margin-top: 4px; }
.color-row { display: flex; gap: 22px; flex-wrap: wrap; }
.color-field { display: flex; align-items: center; gap: 10px; }
/* Galerie / selfie : deux <label> contenant chacun un <input type=file>
   caché. Le label EST la cible du clic — pas besoin de JavaScript pour
   ouvrir le sélecteur, ce qui rend les deux boutons utilisables même si le
   script échoue à se charger. */
.photo-pick { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 10px; }
.photo-pick .btn { cursor: pointer; position: relative; overflow: hidden; }
/* ⚠️ PAS `hidden` NI `display:none` sur ces champs. Un champ en display:none
   ne reçoit pas toujours le clic transmis par son label — selon le
   navigateur, le bouton ne fait alors strictement rien. On le rend
   invisible mais présent dans la mise en page. */
.sr-file {
    position: absolute; inset: 0; width: 100%; height: 100%;
    opacity: 0; cursor: pointer; font-size: 0;
}
/* Le champ de repli reste dans le flux pour les navigateurs sans
   JavaScript, mais s'efface dès que les deux boutons prennent le relais. */
.js .photo-fallback { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.photo-status { color: var(--accent-ink); }
.vcard-photo-current { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.vcard-photo-preview { width: 64px; height: 64px; border-radius: 50%; object-fit: cover; border: 1px solid var(--line); background: var(--bg-2); }
.color-field input[type=color] { width: 40px; height: 40px; padding: 0; border: 1px solid var(--line-2); border-radius: var(--r); background: none; }
.form-actions { display: flex; gap: 12px; align-items: center; margin-top: 26px; }

/* Choix de l'offre à l'inscription (essai Pro 14 jours vs Gratuit d'emblée) */
.plan-choice { display: flex; flex-direction: column; gap: 10px; }
.plan-choice-opt {
    display: flex; align-items: flex-start; gap: 12px;
    border: 1px solid var(--line-2); border-radius: var(--r-lg);
    padding: 14px 16px; cursor: pointer;
    transition: border-color .15s ease, background .15s ease;
}
.plan-choice-opt:has(input:checked) { border-color: var(--ink); background: var(--bg-2); }
.plan-choice-opt input { margin-top: 4px; accent-color: var(--ink); flex-shrink: 0; }
.pc-title { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-weight: 600; font-size: 0.95rem; color: var(--ink); }
.pc-desc { display: block; color: var(--muted); font-size: 0.82rem; margin-top: 4px; line-height: 1.45; }

/* Sélecteur de type de destination (URL / vCard / Document) */
.dest-type-row { display: flex; gap: 8px; flex-wrap: wrap; }
.dest-type-opt {
    display: inline-flex; align-items: center; gap: 7px;
    padding: 9px 14px; border: 1px solid var(--line-2); border-radius: var(--r-pill);
    font-size: 0.88rem; cursor: pointer; transition: border-color .15s ease, background .15s ease;
}
.dest-type-opt:has(input:checked) { border-color: var(--ink); background: var(--bg-2); font-weight: 600; }
.dest-type-opt input { accent-color: var(--ink); }
.dest-type-opt.locked { color: var(--muted); }
.dest-type-opt.locked input { cursor: not-allowed; }
/* Le badge "Payant" de l'option verrouillée était jugé "moche" (27/07/2026) :
   pastille pâle peu contrastée. Retravaillé en scope local à cette option
   (.dest-type-opt.locked .badge-plan) pour ne pas affecter .badge-plan
   ailleurs (profil, tableau de bord, inscription...) — pastille pleine
   couleur accent + petit cadenas, contour de l'option en tirets pour
   signaler visuellement "pas encore débloqué" sans avoir l'air cassé. */
.dest-type-opt.locked { border-style: dashed; }
.dest-type-opt.locked:hover { border-color: var(--accent); background: var(--accent-bg); }
.dest-type-opt.locked .badge-plan {
    background: var(--accent); color: #fff;
    box-shadow: 0 1px 4px rgba(47,84,235,.28);
}
.dest-type-opt.locked .badge-plan svg { flex-shrink: 0; }
.dest-panel { margin-top: 6px; }
/* L'alternative « juste un lien » : une ligne, en retrait, sous les deux
   options principales. Elle reste pleinement cliquable — c'est une option
   reléguée, pas une option dégradée. */
.dest-type-alt {
    display: flex; align-items: center; gap: 9px;
    margin-top: 14px; font-size: 0.88rem; color: var(--muted); cursor: pointer;
}
.dest-type-alt:hover { color: var(--ink-2); }
.dest-type-alt input { accent-color: var(--ink); }

/* Auth */
.auth-wrap { max-width: 440px; margin: 60px auto; padding: 0 24px; }
.auth-card { background: var(--card); border: 1px solid var(--line); border-radius: 24px; padding: 40px 34px; box-shadow: var(--sh-sm); }
.auth-head { text-align: center; margin-bottom: 26px; }
.auth-head h1 { font-size: 2rem; }
.auth-head .sub { color: var(--muted); margin-top: 6px; }
.auth-alt { text-align: center; margin-top: 22px; font-size: 0.9rem; color: var(--muted); }
.auth-alt a { color: var(--accent); }
.demo-hint { text-align: center; margin-top: 16px; font-size: 0.78rem; color: var(--muted); background: var(--bg-2); border-radius: var(--r); padding: 9px; }

/* Flash */
.flash { border-radius: var(--r); padding: 12px 16px; margin-bottom: 12px; font-size: 0.92rem; }
.flash.success { background: var(--good-bg); color: var(--good); }
.flash.error { background: var(--bad-bg); color: var(--bad); }
/* Ni réussite ni échec : une information neutre (ex. « pas encore disponible »).
   Volontairement gris et sobre — le rouge ferait porter à l'utilisateur la
   responsabilité d'un manque qui est le nôtre. */
.flash.info { background: var(--bg-2); color: var(--soft); }

/* Détail QRcard */
.show-grid { display: grid; grid-template-columns: 320px 1fr; gap: 34px; align-items: start; }
.link-box { display: flex; gap: 8px; align-items: stretch; }
.link-box input { font-family: ui-monospace, Menlo, monospace; font-size: 0.85rem; }
.kv { display: grid; grid-template-columns: auto 1fr; gap: 10px 20px; font-size: 0.92rem; }
.kv dt { color: var(--muted); }
.kv dd { margin: 0; word-break: break-all; }
.dest-now { background: var(--bg-2); border-radius: var(--r); padding: 14px 16px; }
.dest-now .u { font-family: ui-monospace, Menlo, monospace; font-size: 0.9rem; word-break: break-all; }

/* Aperçu "carte de contact actuelle" (destination vCard, page QRcard) —
   rendu plus premium le 27/07/2026 : carte blanche avec bordure fine et
   ombre légère (même famille que .qr-card), à la place de la boîte grise
   plate jugée "moche". Garde toutes les infos déjà affichées (photo ou
   initiale, nom, poste/société, téléphone, e-mail). */
.vcard-preview { display: flex; gap: 14px; align-items: center; background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 16px 18px; box-shadow: var(--sh-sm); }
.vcard-preview .vp-photo { width: 52px; height: 52px; border-radius: 50%; object-fit: cover; flex: none; }
.vcard-preview .vp-photo-placeholder { display: flex; align-items: center; justify-content: center; background: var(--accent-bg); color: var(--accent-ink); font-family: var(--display); font-weight: 700; font-size: 1.15rem; }
.vcard-preview .vp-info { min-width: 0; }
.vcard-preview .vp-name { font-family: var(--display); font-weight: 700; font-size: 1.05rem; color: var(--ink); line-height: 1.25; }
.vcard-preview .vp-role { font-size: 0.85rem; color: var(--soft); margin-top: 2px; }
.vcard-preview .vp-line { font-size: 0.85rem; color: var(--soft); margin-top: 3px; word-break: break-all; }

/* ---------------------------------------------------------------------------
   Aperçu de la carte, dans un cadre de téléphone (page de détail d'un QRcard).
   Le cadre n'est pas un ornement : sans lui, la carte publique — conçue pour
   occuper tout un écran de téléphone — s'affiche comme un bloc flottant au
   milieu d'une page d'administration, et on ne comprend plus ce qu'on regarde.
   --------------------------------------------------------------------------- */
.preview-box { margin-top: 12px; }
.preview-box > summary { display: inline-flex; cursor: pointer; list-style: none; }
.preview-box > summary::-webkit-details-marker { display: none; }
.preview-box[open] > summary { margin-bottom: 18px; }

/*
 * Le cadre affiche un VRAI écran de téléphone, mis à l'échelle.
 *
 * Première version : un cadre de 300 px de large contenant une iframe de la
 * même largeur. Résultat, la carte se croyait sur un écran de 300 px — plus
 * étroit qu'aucun téléphone réel — et se retrouvait comprimée, avec une barre
 * de défilement et le bouton « Enregistrer le contact » coupé en bas.
 *
 * Ici l'iframe fait 390 × 844 (les dimensions d'un iPhone courant), donc la
 * carte se rend exactement comme sur un vrai appareil, puis l'ensemble est
 * réduit par transform. On voit la carte entière, à l'échelle, sans rien
 * couper ni faire défiler.
 *
 * ⚠️ `--pp-scale` commande à la fois la réduction et la taille du cadre. Les
 * trois valeurs dérivées (largeur, hauteur, encoche) en découlent par calc() :
 * changer l'échelle seule suffit, et rien ne se désaligne.
 */
.preview-phone {
    --pp-w: 390px;
    --pp-h: 844px;
    /* Hauteur RÉELLEMENT montrée. L'iframe garde ses 844 px — la carte doit
       se rendre comme sur un vrai téléphone — mais le cadre s'arrête plus
       haut : au-delà du haut de la carte (portrait, nom, fonction, moyens de
       contact), l'aperçu n'apprend plus rien et mange la moitié de la page
       d'administration. Le lien « ouvrir en grand » prend le relais. */
    --pp-view: 620px;
    --pp-scale: 0.72;
    position: relative;
    width: calc(var(--pp-w) * var(--pp-scale) + 20px);
    height: calc(var(--pp-view) * var(--pp-scale) + 10px);
    max-width: 100%;
    margin: 0 0 14px;
    padding: 10px 10px 0;
    background: var(--ink);
    /* Coupé net en bas, et non arrondi : un cadre fermé sur une carte
       tronquée laisserait croire que la carte s'arrête là. Ouvert, il se lit
       comme ce qu'il est — un aperçu qui continue. */
    border-radius: 40px 40px 0 0;
    box-shadow: var(--sh);
    overflow: hidden;
}
/* Le fondu qui accompagne la coupe. Purement décoratif, donc sans contenu
   ni rôle : il ne doit rien ajouter pour un lecteur d'écran. */
.preview-phone::after {
    content: ""; position: absolute; left: 10px; right: 10px; bottom: 0; height: 74px;
    background: linear-gradient(to bottom, rgba(245,245,247,0), var(--bg-2));
    pointer-events: none; z-index: 1;
}
/* L'encoche : purement décorative, d'où aria-hidden côté HTML. */
.pp-notch {
    position: absolute; top: 16px; left: 50%; transform: translateX(-50%);
    width: 86px; height: 16px; border-radius: var(--r-pill);
    background: #000; z-index: 2;
}
.pp-screen {
    width: var(--pp-w);
    height: var(--pp-h);
    border: 0; border-radius: calc(30px / var(--pp-scale));
    background: var(--bg-2);
    display: block;
    transform: scale(var(--pp-scale));
    transform-origin: 0 0;
}
.preview-note { margin: 0 0 8px; max-width: 40ch; }

/* Écrans étroits : on réduit encore, pour que le cadre tienne dans la
   colonne sans déborder ni imposer un défilement horizontal. */
@media (max-width: 560px) {
    .preview-phone { --pp-scale: 0.62; --pp-view: 600px; }
}

/* La carte publique affichée DANS le cadre : elle n'a plus à se centrer sur
   toute la hauteur d'un écran, et le crédit fixe est retiré (voir
   views/layouts/card.php). */
.card-body.is-preview { min-height: 100%; padding: 26px 18px 30px; justify-content: flex-start; }

/* Statistiques */
.bars { display: flex; align-items: flex-end; gap: 4px; height: 150px; padding-top: 10px; border-bottom: 1px solid var(--line-2); }
.bars .bar { flex: 1; background: var(--ink); min-height: 2px; border-radius: 3px 3px 0 0; transition: background .15s; }
.bars .bar:hover { background: var(--accent); }
.bar-axis { display: flex; justify-content: space-between; font-size: 0.72rem; color: var(--muted); margin-top: 8px; }
.dist { display: grid; gap: 10px; }
/* Colonne de gauche élargie : elle contenait un code à deux lettres, elle
   accueille désormais un drapeau et un nom de pays complet. */
.dist .r { display: grid; grid-template-columns: minmax(90px, 150px) 1fr auto; gap: 12px; align-items: center; font-size: 0.9rem; }
.dist .ctry { display: inline-flex; align-items: baseline; gap: 7px; min-width: 0; }
.dist .ctry > span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Les emojis drapeaux se rendent dans une police système dédiée ; sans cette
   pile, certains navigateurs retombent sur une fonte sans glyphe et
   affichent deux carrés vides. */
.dist .flag { font-size: 1.05em; line-height: 1; flex: none;
    font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; }
.dist .track { height: 8px; background: var(--bg-2); border-radius: var(--r-pill); overflow: hidden; }
.dist .fill { height: 100%; background: var(--accent); }

/* Tarifs */
.plans { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
         gap: 20px; align-items: start; max-width: 820px; margin-left: auto; margin-right: auto; }
.plan { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 30px 26px; display: flex; flex-direction: column; gap: 16px; }
.plan.featured { border: 2px solid var(--accent); box-shadow: var(--sh); }
.plan .name { font-family: var(--display); font-weight: 700; font-size: 1.4rem; letter-spacing: -0.02em; }
.plan .price { font-family: var(--display); font-weight: 700; font-size: 2.5rem; line-height: 1; letter-spacing: -0.02em; }
.plan .price small { font-family: var(--sans); font-size: 0.9rem; color: var(--muted); font-weight: 400; }
.plan ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 9px; }
.plan li { font-size: 0.92rem; display: flex; gap: 9px; color: var(--ink-2); }
.plan li .mk { color: var(--accent); }
.plan li.off { color: var(--muted); }
.plan li.off .mk { color: var(--line-2); }
.plan .ribbon { align-self: flex-start; font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.12em; color: var(--accent-ink); font-weight: 700; }

/* État vide */
.empty { text-align: center; padding: 60px 24px; border: 1px dashed var(--line-2); border-radius: var(--r-lg); background: var(--card); }
.empty h3 { margin-bottom: 8px; }
.empty p { color: var(--muted); max-width: 42ch; margin: 0 auto 20px; }

/* FAQ */
.faq-list { max-width: 46rem; display: flex; flex-direction: column; gap: 10px; }
.faq-item { border: 1px solid var(--line); border-radius: var(--r); padding: 4px 20px; background: var(--card); }
.faq-item summary {
    padding: 16px 28px 16px 0; position: relative; cursor: pointer;
    font-weight: 600; font-size: 1rem; list-style: none;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after {
    content: '+'; position: absolute; right: 0; top: 14px;
    font-size: 1.3rem; font-weight: 400; color: var(--muted); line-height: 1;
}
.faq-item[open] summary::after { content: '\2212'; }
.faq-item p { margin: 0 0 18px; color: var(--soft); max-width: 60ch; }

/* Pages légales (CGV / Confidentialité) — prose longue, dense, lisible.
   Portée à .legal-body pour ne pas toucher aux h2/h3 utilisés ailleurs
   (marketing, taille bien plus grande). */
.legal-body { max-width: 74ch; }
.legal-body h2 {
    font-size: 1.35rem; font-weight: 700; margin: 40px 0 14px;
    padding-top: 20px; border-top: 1px solid var(--line);
}
.legal-body h2:first-child { margin-top: 0; padding-top: 0; border-top: none; }
.legal-body p, .legal-body ul { color: var(--ink-2); font-size: 0.98rem; }
.legal-body ul { margin: 0 0 1rem; padding-left: 1.2em; }
.legal-body li { margin-bottom: 8px; }
.legal-body a { color: var(--accent); text-decoration: underline; text-decoration-color: var(--accent-bg); text-underline-offset: 2px; }
.legal-body a:hover { text-decoration-color: var(--accent); }
.legal-body code { background: var(--bg-2); border-radius: 4px; padding: 1px 6px; font-size: 0.88em; }
.legal-body table { width: 100%; border-collapse: collapse; margin: 4px 0 20px; font-size: 0.92rem; }
.legal-body th, .legal-body td { text-align: left; padding: 10px 12px; border-bottom: 1px solid var(--line); }
.legal-body th { color: var(--muted); font-weight: 600; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; }
.legal-body table { display: block; overflow-x: auto; white-space: nowrap; }

/* Carte de contact (vCard) — page publique affichée au scan. Layout minimal
   dédié (views/layouts/card.php), sans nav/pied de page du site : l'idée est
   que ça ressemble à une vraie carte de visite premium, pas à une page web. */
/* ==========================================================================
   LES TROIS FONDS DE CARTE (0.3.11)
   ==========================================================================
   Le titulaire choisit. La classe est posee sur `body` par la mise en page,
   a partir d'une liste fermee — voir App\Services\CardTheme.

   ⚠️ LE FOND NE DOIT JAMAIS COUTER EN LISIBILITE. La carte reste blanche
   dans les trois cas : c'est elle qu'on lit, le fond n'est que le plateau
   sur lequel elle est posee. Un fond qui oblige a repenser les couleurs du
   contenu n'est plus un fond, c'est un theme — et un theme, ca se maintient
   en trois exemplaires.
   ========================================================================== */
/* Le remplissage du bas etait de 70 px : il reservait la place du credit,
   alors colle en bas de l'ecran. Le credit etant maintenant dans le flux, il
   porte sa propre marge et 32 px suffisent. */
.card-body { min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 32px 20px; background: var(--bg-2); }

/* Le choix du fond dans le formulaire de carte. Chaque pastille MONTRE le
   fond : un nom de couleur ne dit rien tant qu'on ne l'a pas vu. */
.fond-choix { display: flex; flex-wrap: wrap; gap: 10px; margin: 4px 0 8px; }
.fond-opt {
    display: flex; flex-direction: column; align-items: center; gap: 7px;
    padding: 10px 12px 9px; border: 1px solid var(--line-2); border-radius: var(--r);
    cursor: pointer; min-width: 88px; min-height: 44px;
    transition: border-color .15s ease, background .15s ease;
}
.fond-opt:hover { border-color: var(--ink); }
.fond-opt:has(input:checked) { border-color: var(--ink); background: var(--bg-2); font-weight: 600; }
/* Le bouton radio reste dans le flux pour rester accessible au clavier et aux
   lecteurs d'ecran — on le rend seulement invisible, on ne le retire pas. */
.fond-opt input { position: absolute; opacity: 0; width: 0; height: 0; }
.fond-opt:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
.fond-vignette {
    width: 54px; height: 36px; border-radius: 7px;
    border: 1px solid rgba(28,25,23,.14); box-shadow: inset 0 1px 3px rgba(28,25,23,.08);
}
.fond-papier .fond-vignette { background: radial-gradient(120% 90% at 50% 0%, #FDFCFA 0%, #F7F5F2 45%, #EFEAE3 100%); }
.fond-sable  .fond-vignette { background: linear-gradient(152deg, #FBF8F3 0%, #F3EDE4 48%, #E8DFD2 100%); }
.fond-encre  .fond-vignette { background: #191715; }
.fond-nom { font-size: 0.8rem; color: var(--soft); }
.fond-opt:has(input:checked) .fond-nom { color: var(--ink); }

/* --------------------------------------------------------------------------
   ⚠️ LES FONDS SONT DES COUCHES FIXES, PAS UN `background` SUR LE BODY.
   --------------------------------------------------------------------------
   Signale par Raf le 03/08/2026 : « le fond premium ne s'affiche pas dans la
   version mobile ». Mesure dans le navigateur, sur /q/demo a 390 px :

       hauteur du body ......... 782 px
       hauteur de l'ecran ...... 700 px
       background-attachment ... scroll

   La page DEFILE. Or un degrade pose en `background` sur le body est
   dimensionne sur la zone du body — c'est-a-dire sur toute la hauteur de
   DEFILEMENT, pas sur l'ecran. Etale sur 782 px au lieu de 700, puis sur
   1100 px des qu'une carte porte une photo et quelques boutons de plus, il
   s'aplatit : la portion visible devient presque unie. Le fond ne
   « disparait » pas, il est etire au point de ne plus se voir.

   Sur un grand ecran la carte tient sans defilement, donc le degrade restait
   correct — d'ou un defaut qui ne se manifestait QUE sur telephone.

   Chaque fond est donc peint sur une couche `position: fixed` : toujours
   exactement de la taille de l'ecran, quelle que soit la longueur de la
   carte, et sans repeindre au defilement.

   ⚠️ NE PAS REVENIR A `background-attachment: fixed` POUR FAIRE PLUS COURT.
   iOS Safari le gere mal — sautillements au defilement, et parfois plus rien
   du tout. Une couche fixe fait le meme travail, partout.

   `z-index: -1` la place derriere le contenu sans qu'il faille remonter quoi
   que ce soit ; le body ne cree pas de contexte d'empilement.
   -------------------------------------------------------------------------- */

/* PAPIER — le defaut. Le fond s'assombrit tres legerement vers les bords,
   comme une feuille sous une lumiere douce, avec un grain tres fin par
   dessus. Le plus discret des trois, et celui qui vieillira le mieux. */
.card-fond-papier::before {
    content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none;
    background: radial-gradient(120% 90% at 50% 0%, #FDFCFA 0%, #F7F5F2 45%, #EFEAE3 100%);
}
.card-fond-papier::after {
    content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none; opacity: .05;
    background-image:
        radial-gradient(circle at 25% 30%, #6C6347 0 .6px, transparent .7px),
        radial-gradient(circle at 70% 65%, #6C6347 0 .5px, transparent .6px);
    background-size: 5px 5px, 8px 8px;
}

/* SABLE — degrade diagonal chaud, plus present. */
.card-fond-sable::before {
    content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none;
    background: linear-gradient(152deg, #FBF8F3 0%, #F3EDE4 48%, #E8DFD2 100%);
}

/* ENCRE — fond sombre chaud : la carte blanche devient un objet pose dessus.
   Une couleur unie n'aurait pas eu besoin d'une couche, mais on garde la meme
   construction pour les trois : trois fonds bricoles de trois facons
   differentes, c'est trois occasions d'oublier l'un d'eux. */
.card-fond-encre::before {
    content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none;
    background: #191715;
}
/* L'ombre est nettement renforcee, sinon la carte flotte sans attache sur le
   fond sombre. Et le credit du bas est reecrit : en gris fonce sur fond
   fonce, il disparaissait. */
.card-fond-encre .vc-card {
    box-shadow: 0 2px 6px rgba(0,0,0,.30), 0 34px 80px -20px rgba(0,0,0,.55);
}
.card-fond-encre .card-credit .qr     { color: #EDEAE4; }
.card-fond-encre .card-credit .card   { color: #8FA4FF; }
.card-fond-encre .card-credit .dotcom { color: #8A8378; }
.card-fond-encre .card-credit { opacity: .8; }

/* ⚠️ EN APERCU, PAS DE COUCHE FIXE.
   L'apercu vit dans un cadre de telephone au milieu de l'espace membre : une
   couche `position: fixed` s'y etendrait a toute la fenetre du navigateur et
   repeindrait la page entiere. On revient donc au fond du body, qui suffit
   puisque le cadre ne defile pas. */
.card-body.is-preview::before,
.card-body.is-preview::after { display: none; }
.card-body.is-preview.card-fond-papier { background: #F7F5F2; }
.card-body.is-preview.card-fond-sable  { background: #F3EDE4; }
.card-body.is-preview.card-fond-encre  { background: #191715; }
.card-main { width: 100%; display: flex; justify-content: center; }
/* --------------------------------------------------------------------------
   ⚠️ DANS LE FLUX, PAS EN `position: fixed`.
   --------------------------------------------------------------------------
   Signale par Raf le 03/08/2026, capture d'ecran a l'appui : « le lien en bas
   de page getqrcard.com rentre dans la carte ». On lisait « Get .com » a
   travers le bouton bleu « Enregistrer le contact ».

   Il etait colle en bas de l'ECRAN. Tant que la carte tenait dans la hauteur
   visible, il se posait dessous et tout allait bien. Des que la carte
   depasse — une photo, quelques boutons de plus, un telephone dont la barre
   d'adresse mange 120 px — la carte passe SOUS lui, et il se retrouve pose
   par-dessus le contenu.

   ⚠️ ET J'AVAIS DEJA VERIFIE CE POINT, MAL. Ma mesure disait « carte 680 px
   dans 844 px, aucun chevauchement » — sur la carte SANS photo, dans un
   viewport de bureau. J'ai teste la configuration ou le defaut ne se produit
   pas, et j'en ai conclu qu'il n'existait pas. La photo ajoute 134 px, et la
   barre du navigateur mobile en retire une centaine : les deux ensemble
   suffisaient.

   Dans le flux, le probleme ne peut plus se poser : le credit vient APRES la
   carte, il ne peut pas passer devant. `.card-body` etant une colonne flex
   centree, il reste juste sous la carte sur les ecrans courts comme longs.

   Le commentaire de views/layouts/card.php notait deja ce defaut pour
   l'apercu, et l'avait contourne en RETIRANT le credit dans ce cas. Le
   contournement n'est plus necessaire, mais on le garde : un apercu n'a pas
   a afficher un lien vers le site.
   -------------------------------------------------------------------------- */
.card-credit {
    margin: 24px auto 0; width: fit-content;
    font-size: 0.85rem; opacity: 0.6; transition: opacity .15s ease;
}
.card-credit:hover { opacity: 1; }

.vc-card { width: 100%; max-width: 420px; background: var(--card); border-radius: 28px; box-shadow: var(--sh); padding: 40px 32px 32px; text-align: center; }
.vc-photo { width: 116px; height: 116px; border-radius: 50%; object-fit: cover; margin: 0 auto 18px; display: block; border: 4px solid var(--bg-2); box-shadow: var(--sh-sm); }
.vc-avatar { width: 116px; height: 116px; border-radius: 50%; margin: 0 auto 18px; display: flex; align-items: center; justify-content: center; background: var(--accent-bg); color: var(--accent-ink); font-family: var(--display); font-weight: 800; font-size: 2.6rem; }
.vc-name { font-size: 1.7rem; margin: 0 0 4px; overflow-wrap: anywhere; }
.vc-role { color: var(--soft); font-size: 1rem; margin: 0 0 4px; overflow-wrap: anywhere; }
.vc-note { color: var(--muted); font-size: 0.92rem; font-style: italic; margin: 10px 0 0; overflow-wrap: anywhere; }
.vc-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin: 24px 0 6px; }
.vc-action { display: inline-flex; align-items: center; gap: 7px; padding: 9px 16px; border-radius: var(--r-pill); background: var(--bg-2); color: var(--ink-2); font-size: 0.86rem; font-weight: 600; }
.vc-action:hover { background: var(--accent-bg); color: var(--accent-ink); }
.vc-address { color: var(--muted); font-size: 0.86rem; margin-top: 14px; overflow-wrap: anywhere; }
.vc-save { display: block; width: 100%; margin-top: 26px; padding: 14px; border-radius: var(--r-pill); background: var(--accent); color: #fff; font-weight: 700; font-size: 1rem; text-align: center; }
.vc-save:hover { background: var(--accent-ink); color: #fff; }
@media (max-width: 480px) {
    .vc-card { padding: 34px 22px 26px; border-radius: 22px; }
}

/* Pages de redirection / erreurs */
.notice { max-width: 480px; margin: 12vh auto; text-align: center; padding: 0 24px; }
.notice .mark { font-family: var(--display); font-weight: 700; font-size: 3.2rem; color: var(--accent); }
.notice h1 { margin: 10px 0 12px; }
.notice p { color: var(--soft); }

/* Responsive */
@media (max-width: 900px) {
    .hero-grid, .cols-2, .show-grid, .compare { grid-template-columns: 1fr; }
    .numbered, .feat, .stats-row, .plans, .footer-grid { grid-template-columns: 1fr; }
    .qr-card { margin: 0 auto; }

    /* Mobile : le visuel (QR + constellation d'usages) passe AVANT le texte,
       pour qu'il soit visible dès l'ouverture du site, sans scroll ; l'accès
       « Mon compte » suit juste en dessous, pour qu'un client existant n'ait
       pas à faire défiler tout l'argumentaire pour se connecter. L'ordre du
       DOM ne change pas (h1 toujours lu en premier par les lecteurs d'écran /
       crawlers) — seul l'ordre visuel bouge, via `order` sur la grid
       (.hero-copy reste order:0 par défaut). */
    .hero { padding: 26px 0 40px; }
    .hero-grid { gap: 8px; }
    .constellation-wrap { order: -2; }
    .constellation { max-width: 440px; margin: 0 auto; }
    .hero-login { order: -1; margin-top: 14px; }
    .hero-copy { text-align: center; }
    .hero-copy .lede { margin-left: auto; margin-right: auto; }
    .hero-copy .cta-row { justify-content: center; }
    /* Les deux appels à l'action s'empilaient en largeurs différentes, l'un
       sous l'autre, centrés : deux pilules dépareillées au milieu de l'écran.
       Même largeur, l'un sous l'autre, ça se lit comme une paire. */
    .hero-copy .cta-row .btn { flex: 1 1 100%; max-width: 320px; }
    /* La grille reprend toute la largeur et se recentre : sur un écran
       étroit, « au plus juste » la collerait au bord gauche. */
    .hero-actions { width: 100%; margin-left: auto; margin-right: auto; justify-items: center; }
    .hero .cta-row { justify-content: center; width: 100%; }
    .hero-members-row { width: 100%; }
    /* Le bouton s'aligne sur la largeur des deux autres plutôt que de rester
       calé sur son seul libellé. */
    .hero-members { width: 100%; max-width: 320px; }
    .cta-band .wrap { padding: 52px 26px; }

    /* La démonstration passe en lecture verticale : les trois lignes qui
       changent, la flèche qui pivote d'un quart de tour, puis la ligne qui
       ne change pas. C'est l'ordre naturel du pouce. */
    .swap { grid-template-columns: 1fr; justify-content: stretch; gap: 4px; padding: 32px 24px; text-align: center; }
    .swap-fixed { max-width: none; }
    .swap-list li { padding-left: 0; }
    .swap-list li::before { display: none; }
    .swap-arrow { transform: rotate(90deg); margin: 10px auto; }
    .swap-arrow svg { width: 46px; }
    .swap-note { margin-top: 24px; }

    /* Le tampon repasse au-dessus du texte et se centre : en deux colonnes
       sur un écran étroit, il écrasait le paragraphe contre le bord. */
    .trust-banner { grid-template-columns: 1fr; gap: 22px; justify-items: center; text-align: center; }
    .trust-banner .trust-text { margin-left: auto; margin-right: auto; }

}
@media (max-width: 560px) {
    body { font-size: 16px; }
    .section { padding: 60px 0; }
    /* .section-tight n'avait jamais été resserrée sur mobile (toujours 56px
       en haut ET en bas, comme sur desktop) — combinée au padding bas de
       .hero (40px), ça laissait ~96px de blanc pur avant le tampon "ASBL
       BELGE" de la bannière de confiance, un vide jugé trop grand sur
       iPhone (capture d'écran du 26/07/2026). Resserré ici + padding bas
       du hero réduit d'autant, pour un total ~60px au lieu de ~96px. */
    .section-tight { padding: 32px 0; }
    .constellation-wrap { padding: 4px; }
    .constellation { max-width: 340px; }

    /* 95 % du trafic est mobile : ces valeurs-là sont la référence, pas un
       repli. Le bloc de démonstration perd son cadre (une bordure sur un
       écran de 375 px ne fait qu'ajouter deux traits et voler de la
       largeur) et respire à la place. */
    .swap { border: none; padding: 8px 0 0; }
    .swap-list li { font-size: 1.22rem; padding: 6px 0; }
    .swap-fixed { font-size: 1.5rem; }
    .swap-arrow { margin: 8px auto 12px; }
    .swap-note { font-size: 1.02rem; margin-top: 22px; text-align: left; }
    /* Le tampon garde ses 168 px sur mobile. Une première version le
       réduisait à 138 px pour « gagner de la place » : à cette taille, la
       pastille flèche venait recouvrir le mot PERMANENT. Le cercle tient
       largement dans 375 px — il n'y avait rien à gagner. */
    .cta-faq { margin-top: 22px; }

    /* Optimisations iPhone : plus d'air pour le pouce, rien qui déborde */
    .wrap { padding: 0 18px; }
    /* Le ".com" du logo reste visible même sur mobile (en gris via
       .brand .dotcom, ligne ~84) — demandé explicitement le 26/07/2026,
       après un premier passage qui le masquait sous 560px. */
    .hero { padding: 20px 0 28px; }
    .hero-login { padding: 20px 18px 22px; }
    .hl-form { flex-direction: column; gap: 14px; }
    .hl-field, .hl-form .btn { width: 100%; flex: 1 1 auto; }
    .hl-submit { margin-top: 2px; }
    .auth-card { padding: 30px 22px; border-radius: 18px; }
    .panel-p { padding: 18px; }
    .stats-row { gap: 10px; }
    .stat { padding: 16px 16px; }
    .stat .v { font-size: 1.7rem; }
    .qr-list { grid-template-columns: 1fr; }
    .qr-item .row { flex-wrap: wrap; gap: 10px; }
    .qr-item .actions { flex-wrap: wrap; width: 100%; }
    .qr-item .actions .btn, .qr-item .actions .btn-sm { flex: 1 1 auto; text-align: center; }
    .link-box { flex-wrap: wrap; }
    .link-box input { width: 100%; }
    .form-actions { flex-wrap: wrap; }
    .form-actions .btn { width: 100%; }
    .plan { padding: 24px 20px; }
    .dist .r { grid-template-columns: 70px 1fr auto; gap: 8px; font-size: 0.84rem; }
    .page-head { align-items: stretch; }
    .page-head .btn { width: 100%; text-align: center; }
    /* Les trois actions l'une sous l'autre, pleine largeur : à 375 px, trois
       boutons de front donnent des cibles de 110 px où le texte se coupe. */
    .card-actions { flex-direction: column; align-items: stretch; }
    .card-actions form { width: 100%; }
    .cta-band .wrap { padding: 40px 18px; }
    /* Cibles tactiles : tous les liens/boutons cliquables restent ≥ 44px de haut */
    .btn, .btn-sm { min-height: 44px; }
    .nav-toggle, .plan-pill { min-height: 40px; }
}

/* ==========================================================================
   GUIDE DE DEPLOIEMENT EN ORGANISATION  (.dep-*)
   --------------------------------------------------------------------------
   Cette page est la plus longue du site : dix chapitres, trois logiciels,
   six pannes. Elle a donc son propre vocabulaire visuel, dont le seul role
   est de dire au lecteur ou il en est.

   Trois couleurs, pas une de plus :
     · l'accent pour la progression (numeros, reperes) ;
     · le vert pour ce qu'il faut faire ;
     · le rouge pour ce qui casse.
   Un encadre gris neutre porte les explications de fond, celles qu'on peut
   sauter sans rien perdre de la marche a suivre.
   ========================================================================== */

.dep-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
.dep-badges span {
    font-family: var(--display); font-size: 0.78rem; font-weight: 600;
    color: var(--accent-ink); background: var(--accent-bg);
    padding: 7px 14px; border-radius: var(--r-pill);
}

/* --- La signature de demonstration ------------------------------------- */
.dep-demo { background: var(--bg-2); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 24px; }
.dep-sig { border-collapse: collapse; width: 100%; max-width: 420px; }
.dep-sig-logo { width: 76px; vertical-align: middle; padding: 0 14px 0 0; }
.dep-sig-mark {
    display: flex; align-items: center; justify-content: center;
    width: 64px; height: 64px; border-radius: 50%;
    background: var(--accent); color: #FFF;
    font-family: var(--display); font-weight: 700; font-size: 1.15rem; letter-spacing: .04em;
}
.dep-sig-id { vertical-align: middle; }
.dep-sig-id strong { display: block; font-size: 0.98rem; color: var(--ink); }
.dep-sig-id span { display: block; font-size: 0.82rem; color: var(--soft); margin-top: 2px; }
.dep-sig-qr { width: 72px; vertical-align: middle; text-align: right; }
.dep-sig-qr canvas { display: block; margin-left: auto; }
.dep-sig-qr em { display: block; font-style: normal; font-size: 0.62rem; color: var(--accent); text-align: center; margin-top: 4px; }
.dep-sig-row { padding-top: 12px; border-top: 1px solid var(--line-2); font-size: 0.82rem; color: var(--ink-2); }
/* ⚠️ `display: inline-block` OBLIGATOIRE ICI.
   La regle globale de la feuille (`img, svg, canvas { display: block }`)
   transforme chaque pictogramme en bloc : la ligne de coordonnees se coupait
   alors APRES CHAQUE ICONE, une icone seule par ligne suivie de son texte.
   Le defaut n'existe pas dans la vraie signature envoyee par mail, dont le
   CSS est inline et ignore cette feuille — d'ou une page qui mentait sur ce
   qu'elle montrait. */
.dep-sig-row img { display: inline-block; vertical-align: -2px; }
.dep-sig-row span { white-space: nowrap; }
.dep-sig-row i { color: var(--muted); font-style: normal; padding: 0 2px; }

/* --- Ce qu'il vous faut -------------------------------------------------- */
.dep-needs { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; }
.dep-need { border: 1px solid var(--line); border-radius: var(--r); padding: 18px; background: var(--card); }
.dep-need strong { display: block; font-family: var(--display); font-size: 0.98rem; margin-bottom: 6px; }
.dep-need p { font-size: 0.88rem; color: var(--soft); line-height: 1.55; margin: 0; }

/* --- Les chapitres ------------------------------------------------------- */
.dep-step { border-top: 1px solid var(--line); }
.dep-step h2 { margin: 10px 0 12px; max-width: 24ch; }
.dep-step .dep-lede { font-size: 1.02rem; line-height: 1.62; max-width: 62ch; margin: 0 0 18px; }
.dep-step p { max-width: 68ch; }
.dep-num {
    display: inline-block; font-family: var(--display); font-size: 0.7rem;
    text-transform: uppercase; letter-spacing: 0.18em; font-weight: 700;
    color: var(--accent-ink); background: var(--accent-bg);
    padding: 5px 12px; border-radius: var(--r-pill);
}
.dep-h3 { font-family: var(--display); font-size: 1.08rem; margin: 30px 0 10px; }

/* --- Encadres ------------------------------------------------------------ */
.dep-note { border-radius: var(--r); padding: 16px 18px; margin: 18px 0 0; border-left: 3px solid; }
.dep-note strong { display: block; font-family: var(--display); font-size: 0.8rem; text-transform: uppercase; letter-spacing: .1em; margin-bottom: 6px; }
.dep-note p { margin: 0; font-size: 0.92rem; line-height: 1.6; max-width: 66ch; }
.dep-note-tip  { background: var(--good-bg); border-color: var(--good); }
.dep-note-tip strong  { color: var(--good); }
.dep-note-warn { background: var(--bad-bg);  border-color: var(--bad); }
.dep-note-warn strong { color: var(--bad); }
.dep-note-why  { background: var(--bg-2);    border-color: var(--line-2); }
.dep-note-why strong  { color: var(--soft); text-transform: none; letter-spacing: 0; font-size: 0.95rem; }

/* --- Le tableau des colonnes --------------------------------------------- */
.dep-table-wrap { overflow-x: auto; margin: 0 0 18px; -webkit-overflow-scrolling: touch; }
.dep-table { width: 100%; min-width: 460px; border-collapse: collapse; font-size: 0.92rem; }
.dep-table th {
    text-align: left; font-family: var(--display); font-size: 0.74rem;
    text-transform: uppercase; letter-spacing: .12em; color: var(--muted);
    padding: 0 14px 8px 0; border-bottom: 1px solid var(--line-2);
}
.dep-table td { padding: 11px 14px 11px 0; border-bottom: 1px solid var(--line); vertical-align: top; color: var(--soft); }
.dep-table td:first-child { width: 140px; }
.dep-table code {
    font-size: 0.86rem; color: var(--ink); background: var(--bg-2);
    padding: 2px 8px; border-radius: 6px;
}

/* --- Les trois fichiers --------------------------------------------------- */
.dep-files { display: grid; gap: 12px; }
.dep-file { display: flex; gap: 14px; align-items: flex-start; border: 1px solid var(--line); border-radius: var(--r); padding: 16px 18px; }
.dep-file-n {
    flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%;
    background: var(--ink); color: #FFF; font-family: var(--display);
    font-size: 0.8rem; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
.dep-file p { margin: 0; font-size: 0.92rem; line-height: 1.6; color: var(--soft); }

/* --- Mac / PC cote a cote -------------------------------------------------- */
/* --------------------------------------------------------------------------
   ⚠️ `min-width: 0` N'EST PAS DECORATIF ICI. SANS LUI, LA PAGE DEBORDE.
   --------------------------------------------------------------------------
   Mesure du 03/08/2026 sur /guides/signature-entreprise-microsoft-365 :
   727 px de large sur un ecran de 390. Toute la page partait vers la droite.

   La cause n'est PAS le bloc de commande. `.dep-cmd` porte deja
   `overflow-x: auto`, et le commentaire au-dessus de cette regle dit
   exactement la bonne intention : « on defile DANS le bloc ».

   La cause est que `.dep-cmd` est un ELEMENT DE GRILLE. Un element de grille
   a `min-width: auto` par defaut, c'est-a-dire la largeur de son contenu
   insecable. Une commande PowerShell de 120 caracteres en `white-space: pre`
   ne se coupe nulle part : la colonne s'elargit pour la contenir, et
   `overflow-x: auto` ne s'applique jamais — rien ne depasse d'un bloc qui a
   grandi pour tout contenir.

   `min-width: 0` autorise l'element a devenir plus etroit que son contenu.
   C'est ce qui rend `overflow-x: auto` effectif. Verifie dans le navigateur :
   727 px -> 390 px, et la commande defile bien dans son cadre.

   La lecon, la meme que pour les autres bogues de cette serie : une regle
   ecrite au bon endroit peut rester SANS EFFET si le contexte l'en empeche.
   Ecrire la regle ne suffit pas — il faut mesurer qu'elle agit.
   -------------------------------------------------------------------------- */
.dep-os { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; margin: 0 0 18px; }
.dep-os-col { min-width: 0; }
.dep-cmd, .dep-table-wrap { min-width: 0; }
.dep-os-col h3 { font-family: var(--display); font-size: 1rem; margin-bottom: 10px; }
.dep-os-col p { font-size: 0.92rem; color: var(--soft); line-height: 1.6; }

/* --- Les commandes a recopier ---------------------------------------------
   `pre` deborde par defaut : sur un telephone, une commande de 120 caracteres
   pousserait toute la page vers la droite. On defile donc DANS le bloc. */
.dep-cmd {
    background: var(--ink); color: #F2F2F4; border-radius: var(--r);
    padding: 14px 16px; margin: 10px 0 16px; overflow-x: auto;
    font-size: 0.82rem; line-height: 1.6; -webkit-overflow-scrolling: touch;
}
.dep-cmd code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: pre; }

/* --- Le piege du menu deroulant --------------------------------------------
   Deux colonnes qui montrent le MEME menu avec deux choix, et le resultat de
   chacun sous forme de message stylise. C'est la seule facon de rendre
   evidente une difference que les mots ne portent pas : les deux libelles
   commencent par « ajouter ». */
.dep-choices { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 14px 0 10px; }
.dep-choice { border: 1px solid var(--line); border-radius: var(--r); padding: 16px; position: relative; }
.dep-choice p { font-size: 0.84rem; margin: 10px 0 0; color: var(--soft); max-width: none; }
.dep-choice-bad  { border-color: var(--bad);  background: var(--bad-bg); }
.dep-choice-good { border-color: var(--good); background: var(--good-bg); }
.dep-choice-tag {
    display: inline-block; font-family: var(--display); font-size: 0.68rem;
    text-transform: uppercase; letter-spacing: .12em; font-weight: 700;
    margin-bottom: 10px;
}
.dep-choice-bad .dep-choice-tag  { color: var(--bad); }
.dep-choice-good .dep-choice-tag { color: var(--good); }
.dep-select {
    background: #FFF; border: 1px solid var(--line-2); border-radius: 8px;
    padding: 9px 30px 9px 12px; font-size: 0.82rem; color: var(--ink-2);
    position: relative; line-height: 1.4;
}
.dep-select::after {
    content: ''; position: absolute; right: 12px; top: 50%;
    width: 7px; height: 7px; margin-top: -5px;
    border-right: 1.5px solid var(--muted); border-bottom: 1.5px solid var(--muted);
    transform: rotate(45deg);
}
/* Le petit message schematise : une bande bleue = la signature, des lignes
   grises = le texte ecrit par l'expediteur. L'ordre suffit a tout dire. */
.dep-mail { background: #FFF; border: 1px solid var(--line-2); border-radius: 8px; padding: 12px; margin-top: 12px; }
.dep-mail-sig { height: 26px; border-radius: 5px; background: var(--accent); opacity: .85; margin: 4px 0; }
.dep-mail-txt { height: 7px; border-radius: 4px; background: var(--line-2); margin: 7px 0; }
.dep-mail-txt.short { width: 62%; }

/* --- La regle terminee ------------------------------------------------------ */
.dep-rule { border: 1px solid var(--line-2); border-radius: var(--r); overflow: hidden; margin: 12px 0 4px; }
.dep-rule-row { display: grid; grid-template-columns: 190px 1fr; gap: 16px; padding: 14px 18px; border-bottom: 1px solid var(--line); }
.dep-rule-row:last-child { border-bottom: 0; }
.dep-rule-lbl { font-family: var(--display); font-size: 0.82rem; font-weight: 600; color: var(--soft); }
.dep-rule-val { font-size: 0.86rem; color: var(--ink-2); line-height: 1.55; word-break: break-word; }

/* --- Les six pannes ---------------------------------------------------------- */
.dep-traps { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 14px; }
.dep-trap { border: 1px solid var(--line); border-left: 3px solid var(--bad); border-radius: var(--r); padding: 16px 18px; }
.dep-trap strong { display: block; font-family: var(--display); font-size: 0.95rem; margin-bottom: 6px; color: var(--ink); }
.dep-trap p { margin: 0; font-size: 0.88rem; line-height: 1.58; color: var(--soft); }

@media (max-width: 900px) {
    .dep-os { grid-template-columns: 1fr; gap: 22px; }
    .dep-rule-row { grid-template-columns: 1fr; gap: 4px; }
}

@media (max-width: 700px) {
    /* Les deux choix l'un sous l'autre : cote a cote sous 700 px, les
       libelles se coupent en trois lignes et la demonstration se perd. */
    .dep-choices { grid-template-columns: 1fr; }
    .dep-demo { padding: 18px; }
    .dep-sig-logo { width: 60px; padding-right: 12px; }
    .dep-sig-mark { width: 52px; height: 52px; font-size: 1rem; }
    .dep-sig-row { font-size: 0.78rem; line-height: 1.9; }
    .dep-step h2 { max-width: none; }
}

@media (max-width: 560px) {
    .dep-badges span { font-size: 0.72rem; padding: 6px 11px; }
    .dep-note { padding: 14px 15px; }
    .dep-cmd { font-size: 0.74rem; }
    .dep-table td:first-child { width: 110px; }
}

/* Encart de tete du sommaire des guides : le seul lien de la page qui ne
   mene pas a un guide de messagerie. Il est donc dessine autrement, pour
   qu'on ne le prenne pas pour une sixieme carte. */
.guide-feature {
    display: block; border: 1px solid var(--ink); border-radius: var(--r-lg);
    padding: 26px 28px; background: var(--bg-2); transition: transform .16s ease, box-shadow .16s ease;
}
.guide-feature:hover { transform: translateY(-2px); box-shadow: var(--sh-sm); color: inherit; }
.guide-feature strong { display: block; font-family: var(--display); font-size: 1.22rem; margin: 12px 0 8px; color: var(--ink); }
.guide-feature .guide-feature-txt { display: block; font-size: 0.94rem; line-height: 1.6; color: var(--soft); max-width: 62ch; }

@media (max-width: 560px) {
    .guide-feature { padding: 20px; }
    .guide-feature strong { font-size: 1.06rem; }
}

/* Rappel du guide dans l'espace membre, au-dessus du formulaire d'import. */
.dep-hint {
    display: block; border: 1px solid var(--line-2); border-left: 3px solid var(--accent);
    border-radius: var(--r); padding: 14px 18px; margin: 0 0 22px; background: var(--bg-2);
}
.dep-hint:hover { background: var(--accent-bg); color: inherit; }
.dep-hint strong { display: block; font-family: var(--display); font-size: 0.96rem; color: var(--ink); }
.dep-hint span { display: block; font-size: 0.86rem; color: var(--soft); line-height: 1.55; margin-top: 4px; }

/* --------------------------------------------------------------------------
   « ET POUR TOUTE MA BOITE D'UN COUP ? »  (.guide-ask, accueil uniquement)
   --------------------------------------------------------------------------
   Voisin de .guide-feature, mais PAS le meme objet, et c'est voulu.

   .guide-feature est un renvoi documentaire : il vit sur le sommaire des
   guides et sur la page Organisations, ou le lecteur cherche deja quelque
   chose. Sobre, discret, il ne doit pas voler la vedette au contenu autour.

   .guide-ask, lui, doit ARRETER quelqu'un qui ne cherchait rien. Il arrive
   juste apres « Creer ma carte gratuite », au moment ou un responsable
   d'equipe se dit que ce service ne s'adresse qu'aux individus. D'ou la
   question en gros, l'aplat d'accent, et un vrai bouton : les trois signaux
   qui distinguent une offre d'une note de bas de page.
   -------------------------------------------------------------------------- */
.guide-ask {
    display: block;
    background: var(--accent-bg);
    border: 1px solid transparent;
    border-radius: var(--r-lg);
    padding: 34px 36px;
    transition: transform .16s ease, box-shadow .16s ease, border-color .16s ease;
}
.guide-ask:hover {
    color: inherit;
    transform: translateY(-2px);
    border-color: var(--accent);
    box-shadow: var(--sh-sm);
}
.guide-ask .eyebrow { color: var(--accent-ink); opacity: .75; }
.guide-ask-q {
    display: block;
    font-family: var(--serif);
    font-weight: 400;
    font-size: 2rem;
    line-height: 1.1;
    letter-spacing: -0.02em;
    color: var(--ink);
    margin: 14px 0 12px;
    max-width: 20ch;
}
.guide-ask-txt {
    display: block;
    font-size: 1rem;
    line-height: 1.62;
    color: var(--ink-2);
    max-width: 60ch;
}
/* `pointer-events: none` : le faux bouton ne doit pas intercepter le clic, il
   doit le laisser filer vers le lien qui l'entoure. Sans cela, cliquer
   PILE dessus ne ferait rien sur certains navigateurs. */
.guide-ask-btn { margin-top: 20px; pointer-events: none; }

@media (max-width: 700px) {
    .guide-ask { padding: 26px 22px; }
    .guide-ask-q { font-size: 1.55rem; max-width: none; }
    .guide-ask-txt { font-size: 0.95rem; }
    /* Pleine largeur : a 375 px, un bouton cale a gauche ressemble a un lien
       de plus, pas a l'action principale du bloc. */
    .guide-ask-btn { display: block; width: 100%; text-align: center; }
}

/* --------------------------------------------------------------------------
   CARTE PUBLIQUE — LES RENSEIGNEMENTS QUI NE SE CLIQUENT PAS  (.vc-details)
   --------------------------------------------------------------------------
   Secretariat, service, horaires, IBAN, TVA, mention legale. Ils etaient
   enregistres et jamais affiches (corrige le 30/07/2026).

   Deliberement en retrait : plus petits, plus gris, sous les boutons et sous
   l'adresse. Une carte de visite se lit en trois secondes — le nom, la
   fonction, et un geste. Ces lignes-la sont pour celui qui cherche, pas pour
   celui qui survole ; les mettre au meme niveau que « Appeler » aurait noye
   l'essentiel sous l'accessoire.

   `overflow-wrap: anywhere` sur la valeur : un IBAN belge fait 16 caracteres,
   un IBAN maltais 31, et il n'y a pas d'espace ou couper. Sans cette regle,
   la carte deborde sur un ecran de 320 px.
   -------------------------------------------------------------------------- */
.vc-details { margin-top: 22px; text-align: left; border-top: 1px solid var(--line); padding-top: 18px; }
.vc-detail-group + .vc-detail-group { margin-top: 16px; }
.vc-detail-title {
    font-family: var(--display); font-size: 0.7rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.14em; color: var(--muted);
    margin: 0 0 8px;
}
.vc-detail-row {
    display: grid; grid-template-columns: 1fr auto; gap: 6px 14px;
    padding: 5px 0; font-size: 0.86rem; align-items: baseline;
}
.vc-detail-label { color: var(--muted); }
.vc-detail-value { color: var(--ink-2); text-align: right; overflow-wrap: anywhere; }

@media (max-width: 380px) {
    /* Sous 380 px, deux colonnes donnent un libelle coupe en trois lignes
       face a une valeur d'un mot. On empile, libelle au-dessus. */
    .vc-detail-row { grid-template-columns: 1fr; gap: 1px; }
    .vc-detail-value { text-align: left; }
}

/* Mention « a venir » : une fonction annoncee mais pas encore livree.
   Volontairement discrete et jamais verte — une pastille de couleur a cote
   d'une fonction absente se lit comme une coche. */
.feat-soon {
    display: inline-block; font-size: 0.78rem; line-height: 1.4;
    color: var(--soft); background: var(--bg-2);
    padding: 2px 9px; border-radius: var(--r-pill); margin-left: 4px;
}
li.off .feat-soon { margin-left: 0; margin-top: 4px; }

/* --------------------------------------------------------------------------
   LES TROIS PORTES DE L'ACCUEIL  (.doors)
   --------------------------------------------------------------------------
   Trois cartes egales : aucune ne domine, parce qu'on ignore laquelle
   concerne le lecteur. Une mise en avant aurait ete un pari, et un pari sur
   trois publics se perd deux fois sur trois.

   Le chiffre est decoratif (aria-hidden) : il donne un rythme visuel, il ne
   dit pas un ordre. Rien n'oblige a lire dans le sens 1-2-3, et un lecteur
   d'ecran qui annoncerait « un, deux, trois » laisserait croire a des etapes.

   A 900 px les trois passent sur une colonne. Pas de compromis a deux
   colonnes : la troisieme, seule sur sa ligne, aurait l'air d'un ajout.
   -------------------------------------------------------------------------- */
.doors { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 18px; }
.door {
    display: flex; flex-direction: column;
    border: 1px solid var(--line); border-radius: var(--r-lg);
    padding: 24px 22px 20px; background: var(--card);
    transition: transform .16s ease, border-color .16s ease, box-shadow .16s ease;
}
.door:hover { color: inherit; transform: translateY(-2px); border-color: var(--ink); box-shadow: var(--sh-sm); }
.door-n {
    width: 26px; height: 26px; border-radius: 50%;
    background: var(--accent-bg); color: var(--accent-ink);
    font-family: var(--display); font-size: 0.78rem; font-weight: 700;
    display: flex; align-items: center; justify-content: center; margin-bottom: 14px;
}
.door strong { font-family: var(--display); font-size: 1.12rem; color: var(--ink); margin-bottom: 8px; }
.door-txt { font-size: 0.92rem; line-height: 1.6; color: var(--soft); }
/* `margin-top: auto` : les trois appels a l'action s'alignent sur une meme
   ligne quelle que soit la longueur des textes — en cinq langues, elle varie
   beaucoup, et trois fleches a trois hauteurs donnent un bloc bancal. */
.door-cta {
    margin-top: auto; padding-top: 16px;
    font-family: var(--display); font-size: 0.9rem; font-weight: 600; color: var(--accent);
}
.door:hover .door-cta { color: var(--accent-ink); }

@media (max-width: 900px) {
    .doors { grid-template-columns: 1fr; }
    .door { padding: 20px 18px 18px; }
    .door-cta { padding-top: 12px; }
}

/* Les deux liens de carte, sous l'adresse. Meme habillage que les boutons
   d'action du haut (.vc-action) : ce sont des gestes de meme nature, les
   distinguer visuellement n'aurait rien apporte. Centres, comme le reste de
   la carte, et ils passent a la ligne plutot que de deborder a 320 px. */
.vc-map-links { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 10px; }

/* --------------------------------------------------------------------------
   SELECTEUR DE LANGUE — cinq liens, et la place qu'ils prennent
   --------------------------------------------------------------------------
   La liste deroulante ne fonctionnait pas sans JavaScript et n'etait suivie
   par aucun robot d'indexation. Ce sont desormais cinq liens.

   ⚠️ MAIS CINQ LIENS OCCUPENT TROIS FOIS LA PLACE D'UN `<select>`.
   Constate a l'ecran le 30/07/2026 : dans la barre mobile, « FR EN ES NL 中文 »
   se tassait entre le logo et le bouton menu, et l'en-tete debordait. Deux
   reponses, une par taille d'ecran :

     · sur desktop ils restent dans la barre, mais serres : aucun espace
       entre eux, largeur calee sur deux caracteres ;
     · sur mobile ils passent sur LEUR PROPRE LIGNE, centree sous le logo
       (voir le bloc 900 px plus bas).

   Le chinois fait exception : « 中文 » est plus large que « FR ». D'ou une
   largeur MINIMALE, jamais fixe.
   -------------------------------------------------------------------------- */
/* ==========================================================================
   LE MINI MENU DE LANGUE (0.3.6)
   ==========================================================================
   La langue active est visible, les autres au clic. On recupere ~130 px dans
   l'en-tete par rapport aux cinq pastilles d'avant.

   ⚠️ C'est un <details> : `[open]` est gere par le navigateur, pas par nous.
   ========================================================================== */
.lang-menu { position: relative; flex: none; }
.lang-menu summary {
    display: inline-flex; align-items: center; gap: 4px;
    min-width: 44px; min-height: 40px; padding: 0 9px;
    border-radius: 9px; cursor: pointer; list-style: none;
    font-family: var(--display); font-size: .78rem; font-weight: 600;
    color: var(--ink); background: var(--bg-2);
    transition: background .14s ease;
}
/* La fleche par defaut du <details> est retiree sur les deux moteurs : on a
   la notre, qui pivote. */
.lang-menu summary::-webkit-details-marker { display: none; }
.lang-menu summary::marker { content: ''; }
.lang-menu summary:hover { background: var(--line); }
.lang-menu summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.lm-fleche { transition: transform .18s ease; opacity: .55; }
.lang-menu[open] summary .lm-fleche { transform: rotate(180deg); }

.lm-panneau {
    position: absolute; right: 0; top: calc(100% + 6px); z-index: 60;
    min-width: 190px; padding: 6px;
    background: var(--bg); border: 1px solid var(--line);
    border-radius: var(--r); box-shadow: var(--sh-lift);
}
.lm-opt {
    display: flex; align-items: center; gap: 10px;
    padding: 10px 10px; min-height: 44px; border-radius: 8px;
    color: var(--ink-2); font-size: .9rem; white-space: nowrap;
}
.lm-opt:hover { background: var(--bg-2); color: var(--ink); }
.lm-opt.on { background: var(--ink); color: #FFF; }
.lm-opt.on:hover { background: var(--ink); color: #FFF; }
.lm-code { font-family: var(--display); font-weight: 700; font-size: .76rem; min-width: 26px; }
.lm-nom { color: inherit; opacity: .8; }
.lm-opt.on .lm-nom { opacity: .9; }

/* Dans le panneau ☰, le menu s'ouvre VERS LE BAS et prend toute la largeur :
   un panneau flottant a droite, dans un menu deja deroulant, sortirait de
   l'ecran sur un telephone. */
@media (max-width: 1279px) {
    .nav .lang-menu, .app-nav .lang-menu { width: 100%; margin-top: 8px; }
    .nav .lang-menu summary, .app-nav .lang-menu summary { width: 100%; justify-content: space-between; min-height: 44px; }
    .nav .lm-panneau, .app-nav .lm-panneau { position: static; width: 100%; box-shadow: none; margin-top: 6px; }
}

/* ⚠️ L'ANCIEN SELECTEUR A CINQ PASTILLES (.lang-switch / .lang-opt) A ETE
   RETIRE EN 0.3.6. Ses regles ne visaient plus aucun element : du CSS mort,
   qui laisse croire que le composant existe encore quand on relit la
   feuille. Le selecteur actuel est le mini menu `.lang-menu`, plus haut. */

@media (max-width: 900px) {
    /* =====================================================================
       L'EN-TETE PASSE SUR DEUX LIGNES, ET LES LANGUES SONT CENTREES
       =====================================================================
       Logo et bouton menu sur la premiere ligne, les cinq langues sur la
       seconde, centrees. Les tasser sur une seule ligne aurait demande de
       descendre les cibles tactiles sous 30 px — le seuil en dessous duquel
       on rate la bonne langue une fois sur trois.

       `height: auto` est indispensable : `.bar` etait fige a 66 px, et la
       seconde ligne serait sortie du cadre. `min-height` conserve la hauteur
       d'origine quand il n'y a rien a mettre a la ligne. */

    /* =====================================================================
       LE BANDEAU NOIR N'EST PLUS COLLE AUX BORDS
       =====================================================================
       `.cta-band .wrap` remplace le padding lateral de `.wrap` : sur mobile,
       la carte noire touchait donc les deux bords de l'ecran et paraissait
       decalee plutot que centree. On rend la marge au conteneur exterieur,
       ce qui la recentre sans toucher a sa mise en page interne. */
    .cta-band { padding-left: 16px; padding-right: 16px; }
}
