/* ═══════════════════════════════════════════════════════════════════
   PROS V2 — la refonte de /pros/, en aperçu sur /pros-v2/.
   Chargée APRÈS `coquille.css` : la capsule et le pied viennent de là,
   cette feuille ne porte que la grammaire propre à la page.
   Ne pas éditer la maquette et ce fichier séparément — la maquette de
   travail est `pros-v7-src.html`, ce fichier en est l'extraction.
   ═══════════════════════════════════════════════════════════════════ */
  :root{
    --noir:#131009; --noir2:#1D1810; --champagne:#C9A876; --champ-clair:#E8D5B5;
    --papier:#FAF8F4; --creux:#F1EEE7; --encre:#17150F; --encre2:#4E4A3F;
    --gris:#8A8578; --filet:#E0DCD1; --filet2:#C6C0B1; --brun:#8A6A45;
    --lin:#F6F2E9; --ambre:#B0782A; --ambre-fond:#F6E8D2; --vert:#4C7A4C;
    /* Une seule courbe pour tout ce qui bouge : départ franc, arrivée qui
       se pose. C'est elle qui fait que les éléments semblent d'une même main. */
    --mvt:cubic-bezier(.22,1,.36,1);
  }
  *{box-sizing:border-box}
  html{scroll-behavior:smooth}
  body{margin:0; background:var(--papier); color:var(--encre);
    font:300 1rem/1.6 "Archivo",system-ui,sans-serif; -webkit-font-smoothing:antialiased; overflow-x:hidden}
  img{max-width:100%; display:block}
  h1,h2,h3{font-weight:300; margin:0; text-wrap:balance}
  h1 i,h2 i{font-family:"Instrument Serif",serif; font-style:italic; letter-spacing:0; font-weight:400}
  /* Un seul fil à plomb pour toute la page : le bord gauche du logo, du titre
     du héro et de chaque section sont la MÊME verticale. La longueur de ligne
     se règle élément par élément (max-width), jamais en recentrant le bloc. */
  /* ⚠️ LES EMOJI, ET POURQUOI CETTE RÈGLE EST OBLIGATOIRE ICI.
     WordPress remplace chaque emoji d'un texte par un `<img class="emoji">` de
     72 px. La feuille qui les remet à la taille du texte est INLINE — et elle
     part avec notre liste BLANCHE de styles. Sans la règle ci-dessous, les 🥰
     😉 😘 des avis s'affichent à leur taille naturelle. Constaté le 31/08 sur
     les pages résultats (une fleur de 173 px au milieu d'une carte), puis le
     03/09 ici, en vue mobile. Cette feuille étant le socle de `tarif-v2` et
     `aide-v2`, la règle les couvre toutes les trois. */
  img.emoji, img.wp-smiley{display:inline !important; width:1em !important;
    height:1em !important; margin:0 .07em !important; padding:0 !important;
    border:none !important; box-shadow:none !important; background:none !important;
    vertical-align:-.1em !important}

  .contenu{max-width:none; margin:0; padding-inline:calc(var(--pad) + var(--cap-px))}
  /* En dessous de 760 px la capsule occupe presque toute la largeur : lui
     réserver `--cap-px` en plus de `--pad` mangeait 18 px de chaque côté et
     rendait cette page plus étroite que l'accueil (299 px contre 335 px à
     375 px de large). Même gouttière que `.large` sur accueil-v2. */
  @media(max-width:760px){ .contenu{padding-inline:var(--pad)} }
  .etq{font:500 .72rem/1 "DM Mono",monospace; letter-spacing:.2em; text-transform:uppercase; margin:0 0 .85rem; color:var(--brun)}
  .af{display:inline-block; vertical-align:.45em; font:500 .55rem/1 "DM Mono",monospace; letter-spacing:.04em;
    color:var(--ambre); background:var(--ambre-fond); border-radius:999px; padding:.24em .55em; margin-left:.3em; white-space:nowrap}

  .bandeau{background:var(--ambre-fond); color:#7A5B22; font:400 .72rem/1.5 "DM Mono",monospace;
    padding:.55rem 1.2rem; text-align:center}
  .bandeau b{font-weight:500}

  a{color:inherit; text-decoration:none}

  /* boutons du thème (assets/accueil-v2.css) — règle de la charte : un seul
     bouton NOIR PLEIN par écran, c'est l'action principale ; le reste est du
     texte ou une arête. */
  .btn-fantome{display:inline-flex; align-items:center; justify-content:center;
    border-radius:999px; padding:11px 21px; font-weight:500; white-space:nowrap;
    color:#fff; border:1px solid rgba(255,255,255,.45); background:transparent;
    transition:background .18s, border-color .18s, color .18s}
  .btn-fantome:hover{color:#fff; background:rgba(255,255,255,.16); border-color:rgba(255,255,255,.75)}
  .btn-noir{display:inline-flex; align-items:center; justify-content:center;
    background:var(--noir); color:#fff; border-radius:999px; font-weight:500;
    padding:12px 24px; white-space:nowrap; border:0; font-family:inherit; cursor:pointer;
    transition:background .2s, transform .25s ease}
  .btn-noir:hover{color:#fff; background:#211D17; transform:translateY(-2px)}

  /* ⚠️ La pile de repli n'est PAS décorative : le raccourci `font:` écrase
     la famille héritée du body. Sans `,system-ui,sans-serif` ici, un
     échec de chargement d'Archivo fait tomber TOUS les boutons de la page
     en sérif par défaut — constaté le 03/09 sur une capture. */
  .btn{display:inline-block; border-radius:999px; padding:.85rem 1.6rem;
    font:500 .92rem/1 "Archivo",system-ui,sans-serif;
    text-decoration:none; cursor:pointer; border:1px solid transparent;
    transition:transform .25s ease, box-shadow .25s ease, background .25s ease}
  .btn:hover{transform:translateY(-2px)}
  .btn-or{background:var(--champagne); color:var(--noir)}
  .btn-or:hover{background:var(--champ-clair); box-shadow:0 10px 28px rgba(201,168,118,.35)}
  .btn-ligne{background:transparent; color:var(--encre); border-color:var(--filet2)}
  .btn-ligne:hover{border-color:var(--encre2)}
  /* ═ héro produit : la grammaire de l'accueil — photo, voile, bloc à gauche.
     Pas de voile teinté : la charte assombrit les LETTRES (ombres portées),
     jamais l'image. ═ */
  .hero{position:relative; min-height:100vh; min-height:100svh; overflow:hidden;
    background:var(--encre); display:flex; flex-direction:column;
    padding-top:calc(var(--cap-t) + var(--cap-h)); padding-bottom:clamp(30px,7vh,120px)}
  .hero-photo{position:absolute; inset:0; width:100%; height:100%;
    object-fit:cover; object-position:58% center}
  .hero-voile{position:absolute; inset:0; pointer-events:none}
  .hero-bloc{position:relative; z-index:2; margin-block:auto;
    padding:0 var(--pad) 0 calc(var(--pad) + var(--cap-px));
    display:flex; flex-direction:column; align-items:flex-start;
    gap:clamp(18px,2.4vw,28px); color:#fff; width:100%;
    max-width:calc(760px + var(--pad) * 2 + var(--cap-px))}
  .hero h1{font-size:clamp(36px,5.2vw,64px); font-weight:200; letter-spacing:-.038em;
    line-height:1.02; color:#fff}
  .hero h1 b{font-weight:500}
  .hero-sur{margin:0; font:500 .7rem/1.5 "DM Mono",ui-monospace,monospace; letter-spacing:.2em;
    text-transform:uppercase; color:rgba(255,255,255,.72)}
  .hero-sous{margin:0; font-size:clamp(15.5px,1.35vw,19px); font-weight:300; line-height:1.5;
    color:rgba(255,255,255,.9); max-width:32em}
  .hero-note{margin:0; font:400 .72rem/1.7 "DM Mono",ui-monospace,monospace;
    color:rgba(255,255,255,.55)}
  /* Les ombres portées ne servent que sur une photo — rangées ici pour le jour
     où l'image (ou la carte animée) revient : il suffit de rendre la classe. */
  .hero.photo h1{text-shadow:0 1px 2px rgba(10,9,7,.58), 0 2px 11px rgba(10,9,7,.58), 0 4px 30px rgba(10,9,7,.46)}
  .hero.photo .hero-sur{color:rgba(255,255,255,.8); text-shadow:0 1px 2px rgba(10,9,7,.6), 0 2px 11px rgba(10,9,7,.6)}
  .hero.photo .hero-sous{color:rgba(255,255,255,.92); text-shadow:0 1px 2px rgba(10,9,7,.58), 0 2px 11px rgba(10,9,7,.58), 0 4px 26px rgba(10,9,7,.46)}
  .hero.photo .hero-note{color:rgba(255,255,255,.62); text-shadow:0 1px 6px rgba(10,9,7,.75)}
  /* La moitié droite est laissée libre : carte animée ou écran, à décider. */
  .hero-libre{position:absolute; inset:0 0 0 auto; width:44%; pointer-events:none}

  /* ═ L'OUVERTURE — une seule séquence, jouée une fois au chargement.
     La capsule se pose, le sur-titre monte, le titre s'écrit mot par mot,
     puis la promesse, le bouton, la mention. Rien ne rejoue au défilement.
     ⛔ 19/09 — ELLE NE DÉPEND PLUS D'AUCUN SCRIPT. Elle attendait la classe
     `charge`, posée par pros-v2.js, que WP Rocket retardait jusqu'au premier
     geste : sur un téléphone, logo, menu, accroche et BOUTON restaient à
     `opacity:0` tant qu'on n'avait pas touché l'écran (capture du 19/09).
     Maintenant chaque élément joue son entrée à son premier affichage.
     `both` : l'état de départ tient pendant le délai, l'état d'arrivée reste
     ensuite. Et l'état de REPOS est visible : si l'animation ne joue pas
     (mouvement réduit, navigateur qui n'anime pas), tout est là. ═ */
  .capsule{animation:cap-entre .65s var(--mvt) .05s both}
  @keyframes cap-entre{from{opacity:0} to{opacity:1}}

  .mot{display:inline-block; overflow:hidden;
    padding:0 .05em .16em; margin:0 -.05em -.16em; vertical-align:bottom}
  .lettre{display:inline-block; transform:translateY(106%); will-change:transform}
  .charge .lettre{animation:lettre-monte .72s var(--mvt) forwards;
    animation-delay:calc(var(--i) * 15ms + 260ms)}
  @keyframes lettre-monte{to{transform:translateY(0)}}

  .ouvr{animation:ouvr-monte .7s var(--mvt) both; animation-delay:var(--d,0ms)}
  @keyframes ouvr-monte{from{opacity:0; transform:translateY(14px)} to{opacity:1; transform:none}}
  /* Sur fond noir, le bouton plein s'inverse. La règle de la charte est
     « UN SEUL bouton plein par écran », pas « un bouton noir » : un noir sur
     noir ne se voit pas. Le remplissage suit le fond, la règle tient. */
  .btn-blanc{display:inline-flex; align-items:center; justify-content:center;
    background:#fff; color:var(--encre); border-radius:999px; font-weight:500;
    padding:12px 24px; white-space:nowrap; border:0; font-family:inherit; cursor:pointer;
    transition:background .2s, transform .25s ease}
  .btn-blanc:hover{background:var(--papier); transform:translateY(-2px)}
  .hero .btn-blanc{padding:14px 28px; font-size:1rem}
  @media(max-width:760px){
    .hero-photo{object-position:72% center}
    .hero-bloc{gap:clamp(14px,4vw,20px)}
    .hero h1{font-size:clamp(33px,9.2vw,42px)}
  }
  /* .hero-actions sert encore au CTA final */
  .hero-actions{display:flex; flex-wrap:wrap; gap:.9rem; margin:1.8rem 0 0; align-items:center}

  /* ═ le téléphone dessiné (écrans faux, à remplacer par de vrais screens) ═ */
  .tel{width:min(300px,86%); margin:0 auto; background:#FFFEFB; border-radius:30px;
    border:7px solid #241E12; box-shadow:0 30px 70px rgba(0,0,0,.5); padding:1.05rem 1rem 1.15rem; color:var(--encre)}
  .tel-tete{display:flex; justify-content:space-between; align-items:baseline; font:500 .74rem/1 "DM Mono",monospace}
  .tel-tete .jour{letter-spacing:.1em; text-transform:uppercase}
  .tel-tete .opt{color:var(--brun); font-size:.66rem}
  .tel-titre{font:500 1.02rem/1.3 "Archivo"; margin:.7rem 0 .2rem}
  .tel-sous{font:400 .72rem/1.5 "DM Mono",monospace; color:var(--gris)}
  .ecran-liste{display:grid; gap:.5rem; margin-top:.8rem}
  .rdv{display:grid; grid-template-columns:auto 1fr auto; gap:.6rem; align-items:center;
    background:var(--creux); border-radius:12px; padding:.6rem .7rem; font-size:.78rem}
  .rdv .h{font:500 .72rem/1 "DM Mono",monospace; color:var(--brun)}
  .rdv .ok{font:500 .62rem/1 "DM Mono",monospace; color:var(--vert)}
  .rdv small{display:block; font-size:.64rem; color:var(--gris)}
  .trajet{font:400 .6rem/1 "DM Mono",monospace; color:var(--gris); padding-left:.4rem}
  .toast{margin-top:.8rem; background:var(--noir); color:var(--champ-clair); border-radius:12px;
    padding:.6rem .8rem; font:500 .68rem/1.45 "DM Mono",monospace; box-shadow:0 10px 24px rgba(0,0,0,.25)}
  .toast small{display:block; color:rgba(246,242,233,.55); font-weight:400}
  /* séquence « l'agenda se remplit » : UNE fois, puis tout reste en place */
  .anime .seq{opacity:0; transform:translateY(10px)}
  .anime.joue .seq{animation:pose .5s ease-out forwards}
  .anime.joue .s1{animation-delay:.2s}.anime.joue .s2{animation-delay:.7s}
  .anime.joue .s3{animation-delay:1.2s}.anime.joue .s4{animation-delay:1.9s}
  @keyframes pose{to{opacity:1; transform:none}}

  /* notification SMS (module lapins) */
  .notif{background:#F4F2EC; border:1px solid var(--filet); border-radius:14px; padding:.7rem .8rem;
    display:grid; grid-template-columns:auto 1fr; gap:.6rem; align-items:start; font-size:.76rem}
  .notif .ico{width:1.7rem; height:1.7rem; border-radius:8px; background:var(--noir); color:var(--champ-clair);
    display:grid; place-items:center; font:500 .6rem/1 "DM Mono",monospace}
  .notif b{font-weight:500; display:block; font-size:.74rem}
  .notif small{color:var(--gris); font-size:.66rem}
  .badge-ok{display:inline-block; margin-top:.6rem; font:500 .62rem/1 "DM Mono",monospace; color:var(--vert);
    background:#E8EFE4; border-radius:999px; padding:.45em .8em}

  /* fiche cliente / stats */
  .ligne-fiche{display:flex; justify-content:space-between; gap:.6rem; font-size:.76rem;
    padding:.5rem .2rem; border-bottom:1px solid var(--filet)}
  .ligne-fiche small{color:var(--gris)}
  .stat-gros{font:500 1.9rem/1 "DM Mono",monospace; margin-top:.6rem; font-variant-numeric:tabular-nums}
  .stat-gros small{font-size:.4em; color:var(--gris); font-weight:400}
  .jauge{height:8px; border-radius:99px; background:var(--creux); margin-top:.7rem; overflow:hidden}
  .jauge i{display:block; height:100%; width:0; background:var(--brun); border-radius:99px;
    transition:width 1s ease-out}
  .vu .jauge i{width:72%}

  /* ═ modules produit alternés ═ */
  section.sur-papier{padding:var(--sect) 0}
  section.sur-papier + section.sur-papier{border-top:1px solid var(--filet)}
  .module{display:grid; grid-template-columns:1fr 1fr; gap:3.4rem; align-items:center}
  .module + .module{margin-top:4.6rem}
  @media(max-width:860px){.module{grid-template-columns:1fr; gap:2rem} .module .cote-ecran{order:-1}}
  .module h2{font-size:clamp(1.45rem,2.7vw,1.95rem); line-height:1.2; letter-spacing:-.01em}
  .module p{margin:.9rem 0 0; color:var(--encre2); max-width:30rem; font-size:.98rem}
  .module .puces{margin:1rem 0 0; padding:0; list-style:none; display:grid; gap:.5rem}
  .module .puces li{padding-left:1.4rem; position:relative; font-size:.92rem; color:var(--encre2)}
  .module .puces li::before{content:"✓"; position:absolute; left:0; color:var(--brun); font-weight:600}
  .ecran-note{text-align:center; font:400 .74rem/1.6 "DM Mono",monospace; color:var(--gris); margin-top:.9rem}

  /* ⛔ 19/09 — CACHÉS SEULEMENT QUAND LE SCRIPT EST PRÊT. `.rev` naissait
     à `opacity:0` et attendait qu'un IntersectionObserver de pros-v2.js lui
     pose `.vu` : script retardé (WP Rocket) ou absent, les blocs restaient
     invisibles. Maintenant c'est le script qui pose `rev-pret` sur <html>,
     APRÈS avoir marqué `vu` tout ce qui est déjà à l'écran ou au-dessus :
     seul ce qui est encore sous le pli se cache, puis entre au défilement.
     Sans script, la page est simplement statique. */
  .rev-pret .rev{opacity:0; transform:translateY(28px); transition:opacity .8s var(--mvt), transform .8s var(--mvt)}
  .rev-pret .rev.vu{opacity:1; transform:none}
  .rev-pret .rev-suite>*{opacity:0; transform:translateY(22px); transition:opacity .7s var(--mvt), transform .7s var(--mvt)}
  .rev-pret .rev-suite.vu>*{opacity:1; transform:none}
  .rev-suite.vu>*:nth-child(2){transition-delay:.12s}
  .rev-suite.vu>*:nth-child(3){transition-delay:.24s}

  /* teaser tarif */
  .tarif{background:var(--noir); border-radius:20px; color:var(--lin); padding:2.8rem 2.6rem;
    display:grid; grid-template-columns:1.2fr .8fr; gap:2.4rem; align-items:center}
  @media(max-width:820px){.tarif{grid-template-columns:1fr}}
  .tarif h2{color:var(--lin); font-size:clamp(1.5rem,2.8vw,2rem)}
  .tarif h2 i{color:var(--champ-clair)}
  .tarif p{color:rgba(246,242,233,.78); margin:.9rem 0 0; font-size:.96rem; max-width:30rem}
  .tarif .prix{font-family:"Instrument Serif",serif; font-size:clamp(2.6rem,5vw,3.6rem); line-height:1; color:var(--champ-clair)}
  .tarif .prix small{font:400 .28em "DM Mono",monospace; color:rgba(246,242,233,.6)}
  .tarif .carte-prix{background:var(--noir2); border:1px solid rgba(201,168,118,.3); border-radius:16px;
    padding:1.6rem 1.6rem; text-align:center}
  .tarif .carte-prix ul{list-style:none; margin:.9rem 0 0; padding:0; font-size:.8rem; color:rgba(246,242,233,.7); display:grid; gap:.35rem}
  .tarif .carte-prix .btn{margin-top:1.1rem}
  .tarif .lien-tarif{display:inline-block; margin-top:1.1rem; color:var(--champ-clair); font-size:.88rem}
  .tarif .lien-tarif:hover{color:var(--lin)}
  .tarif a{color:inherit}


  /* ── LE MOCKUP TÉLÉPHONE de la carte « planning ».
     ⛔ NE PAS l'appeler `.tel` : cette classe existe déjà plus haut (le
     téléphone DESSINÉ du bloc « tout-en-un ») avec `background:#FFFEFB`,
     `border:7px solid #241E12`, `border-radius:30px` et du `padding`. Une
     seconde règle `.tel` n'écrase que ce qu'elle redéclare : le fond crème, le
     bord sombre et le padding restaient et dessinaient une carte plus grande
     DERRIÈRE le mockup — le « second téléphone » signalé trois fois par
     Nicolas. La couleur relevée dans sa capture, #FFFEFB, était la preuve.
     📌 Vérifier qu'un nom de classe est libre avant de le prendre.
     Le mockup est détouré (fond transparent) : `drop-shadow`, jamais
     `box-shadow`. Il se pose comme les autres captures : à droite, débordant
     un peu en bas, rogné par le cadre. ── */
  /* À gauche et ENTIÈREMENT dans le cadre, avec des marges franches : les
     captures des autres cartes se posent à gauche et ne débordent pas. Un
     mockup de téléphone est deux fois plus haut que large ; à 100 % il sortait
     du cadre par le bas. 76 % le fait tenir avec 60 px d'air en haut et 45 en
     bas sur 456 de hauteur. */
  .mockup{position:absolute; left:6%; right:auto; bottom:10%; height:76%; width:auto;
    filter:drop-shadow(0 22px 38px rgba(20,17,9,.32)) drop-shadow(0 4px 10px rgba(20,17,9,.18))}
  .mockup img{height:100%; width:auto; display:block}
  @media(max-width:900px){
    .mockup{height:72%; bottom:9%; left:5%}
  }

  /* ── L'OFFRE — une seule, tout compris. Reprend la carte tarifaire de la page
     en production (« L'unique », 42,90 €) mais SANS la seconde colonne :
     deux cartes côte à côte font hésiter, et le palier gratuit n'est pas un
     abonnement concurrent — il devient une ligne sous la carte. ── */
  .offre-tete{text-align:center; max-width:min(52rem,100%); margin:0 auto clamp(2rem,4vw,3rem)}
  .offre-tete h2{font-size:clamp(1.9rem,3.4vw,2.7rem); line-height:1.1; letter-spacing:-.026em;
    margin:0 0 .9rem; text-wrap:balance}
  .offre-tete p{margin:0; font-size:clamp(1.05rem,1.4vw,1.2rem); color:var(--encre2)}
  .offre{background:var(--noir); color:var(--lin); border-radius:24px; overflow:hidden;
    max-width:62rem; margin-inline:auto;
    display:grid; grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr)}
  @media(max-width:820px){.offre{grid-template-columns:1fr}}
  .offre-prix{padding:clamp(2rem,3.4vw,2.8rem); border-right:1px solid rgba(201,168,118,.22);
    display:flex; flex-direction:column; justify-content:center; gap:.5rem}
  @media(max-width:820px){.offre-prix{border-right:0; border-bottom:1px solid rgba(201,168,118,.22)}}
  .offre-nom{font:500 .74rem/1 "DM Mono",ui-monospace,monospace; letter-spacing:.2em;
    text-transform:uppercase; color:var(--tan); margin:0}
  .offre-chiffre{font:600 clamp(2.8rem,5.4vw,4rem)/1 "Archivo",sans-serif; letter-spacing:-.04em;
    color:#fff; margin:.4rem 0 0; white-space:nowrap}
  .offre-chiffre span{font-size:.34em; font-weight:500; color:var(--tan); letter-spacing:-.01em}
  .offre-unite{margin:.2rem 0 0; font:400 .82rem/1.5 "DM Mono",ui-monospace,monospace;
    color:rgba(246,242,233,.6)}
  .offre-prix .btn-or{margin-top:1.6rem; width:100%}
  .offre-note{margin:.9rem 0 0; font:400 .76rem/1.6 "DM Mono",ui-monospace,monospace;
    color:rgba(246,242,233,.6)}
  .offre-liste{padding:clamp(2rem,3.4vw,2.8rem)}
  .offre-liste p.t{margin:0 0 1.2rem; font-size:1.05rem; font-weight:600; color:#fff}
  .offre-liste ul{list-style:none; margin:0; padding:0;
    display:grid; grid-template-columns:repeat(auto-fit,minmax(12rem,1fr)); gap:.75rem 1.6rem}
  .offre-liste li{position:relative; padding-left:1.55rem; font-size:.98rem; line-height:1.4;
    color:rgba(246,242,233,.9)}
  .offre-liste li::before{content:"✓"; position:absolute; left:0; top:0; color:var(--tan); font-weight:700}

  /* La ligne « le référencement est gratuit » se perdait sous la carte noire.
     En petite carte à part, avec sa loupe, elle se lit comme une seconde
     porte d'entrée — sans venir concurrencer l'abonnement au-dessus. */
  .carte-gratuit{max-width:62rem; margin:1.4rem auto 0; background:var(--blanc);
    border:1px solid var(--filet); border-radius:16px; padding:1.3rem 1.5rem;
    display:flex; align-items:flex-start; gap:1.1rem}
  .cg-icone{flex:none; width:42px; height:42px; border-radius:12px; background:var(--creux);
    color:var(--brun); display:grid; place-items:center}
  .cg-t{margin:0 0 .3rem; font-size:1.05rem; font-weight:600; color:var(--encre)}
  .cg-p{margin:0; font-size:.98rem; line-height:1.45; color:var(--encre2)}

  /* ── POP-UP TÉLÉCHARGEMENT — relevé sur welcome-app.com : titre, deux QR
     codes, deux badges de magasin. Même <dialog> que la démo, donc mêmes
     comportements (Échap, focus, fond inerte) et un seul mécanisme à maintenir. ── */
  /* ⚠️ 23/09 — `.modale.modale-app` et pas `.modale-app` : la base `.modale`
     (même poids, déclarée PLUS BAS) lui reprenait sa largeur — la pop-up
     s'ouvrait à 1 040 px, une grande boîte blanche autour de deux petits QR. */
  .modale.modale-app{max-width:min(520px,92vw)}
  .modale-app .boite{background:var(--papier); border-radius:20px; padding:2.4rem 2rem 2rem;
    text-align:center; position:relative; box-shadow:0 40px 90px rgba(0,0,0,.45)}
  .modale-app h3{margin:0 0 1.6rem; font-size:1.35rem; line-height:1.25; color:var(--encre)}
  .qr{display:grid; grid-template-columns:1fr 1fr; gap:1.2rem; max-width:330px; margin:0 auto}
  .qr figure{margin:0}
  .qr img.code{width:100%; height:auto; display:block; border-radius:10px; background:#fff}
  .qr figcaption{margin-top:.9rem}
  .qr figcaption img{height:38px; width:auto; display:block; margin:0 auto}
  .modale-app .fermer{position:absolute; top:12px; right:12px; width:34px; height:34px;
    appearance:none; -webkit-appearance:none; border-radius:999px; border:1px solid var(--filet2);
    background:var(--blanc); color:var(--encre2); display:grid; place-items:center; cursor:pointer;
    transition:background .18s}
  .modale-app .fermer:hover{background:var(--creux); color:var(--encre)}
  .cg-cta{appearance:none; -webkit-appearance:none; font:inherit; cursor:pointer;
    margin-top:.9rem; display:inline-flex; align-items:center; justify-content:center;
    background:var(--noir); color:#fff; border:0; border-radius:999px; font-weight:500;
    padding:11px 22px; font-size:.96rem; transition:background .2s, transform .25s var(--mvt)}
  .cg-cta{text-decoration:none}
  .cg-cta:hover{background:#211D17; transform:translateY(-2px)}

  /* ⭐ 08/09 — SUR UN TÉLÉPHONE, LE QR CODE EST UNE ABSURDITÉ : il faudrait un
     SECOND appareil pour scanner l'écran de celui qu'on tient. Sous 760 px on
     le retire et les badges officiels des magasins deviennent les boutons —
     l'un sous l'autre, plus hauts, vraie cible de doigt. Le QR reste sur
     grand écran, où il a du sens : on est devant un ordinateur, on scanne
     avec son téléphone. Vaut pour les trois pop-ups ET pour les deux blocs
     visibles (#telecharger de /aide/, bloc « sur votre smartphone » de
     /tarif/), qui partagent tous la classe `.qr`. */
  @media(max-width:760px){
    .qr{grid-template-columns:1fr; gap:.7rem; max-width:20rem}
    .qr img.code{display:none}
    .qr figcaption{margin-top:0}
    .qr figcaption img{height:46px}
  }
  .offre-gratuit{margin:1.6rem auto 0; max-width:62rem; text-align:center;
    font-size:.98rem; color:var(--encre2)}
  .offre-gratuit b{color:var(--encre); font-weight:600}

  /* FAQ */
  .faq{margin:2rem 0 0; border-top:1px solid var(--filet)}
  .faq details{border-bottom:1px solid var(--filet)}
  .faq summary{cursor:pointer; list-style:none; display:flex; justify-content:space-between; gap:1rem;
    align-items:baseline; padding:1.1rem .2rem; font-size:1rem}
  .faq summary::-webkit-details-marker{display:none}
  .faq summary::after{content:"+"; font:300 1.3rem/1 "Archivo"; color:var(--brun); flex:none}
  .faq details[open] summary::after{content:"–"}
  .faq details[open] summary{font-weight:500}
  .faq .rep{padding:0 .2rem 1.35rem; max-width:44rem; color:var(--encre2); font-size:1rem}
  /* Les liens posés dans la prose (page Tarifs, facturation, annuaire) :
     sans style ils étaient indistinguables du texte. Souligné discret, pas
     de couleur criarde — on reste dans l'encre de la page. */
  .faq .rep a, .cg-p a, .bloc-r p a{color:var(--encre); text-decoration:underline;
    text-decoration-color:var(--filet2); text-underline-offset:.18em;
    text-decoration-thickness:1px; transition:text-decoration-color .25s var(--mvt)}
  .faq .rep a:hover, .cg-p a:hover, .bloc-r p a:hover{text-decoration-color:var(--brun)}

  /* CTA final sur photo */
  .final{position:relative; color:var(--lin); text-align:center; padding:5.4rem 1.4rem; overflow:hidden}
  .final .fond{position:absolute; inset:0; z-index:0}
  .final .fond img{width:100%; height:100%; object-fit:cover}
  .final .fond::after{content:""; position:absolute; inset:0; background:rgba(19,16,9,.78)}
  .final .int{position:relative; z-index:1; max-width:720px; margin:0 auto}
  .final h2{font-size:clamp(1.9rem,4.2vw,2.9rem); color:var(--lin)}
  .final p{color:rgba(246,242,233,.8); margin:1rem auto 0; max-width:34rem}
  .final .hero-actions{justify-content:center}

  /* coulisses */
  .coulisses{margin:3.4rem auto; border:1px dashed var(--filet2); border-radius:16px; background:var(--creux);
    padding:2rem 2.2rem}
  .coul-repli summary{cursor:pointer; list-style:none; font-size:1.12rem; font-weight:500;
    display:flex; justify-content:space-between; align-items:baseline; gap:1rem}
  .coul-repli summary::-webkit-details-marker{display:none}
  .coul-repli summary::after{content:"+"; font:300 1.3rem/1 "Archivo"; color:var(--brun)}
  .coul-repli[open] summary::after{content:"–"}
  .coulisses dl{margin:1.2rem 0 0; display:grid; gap:1rem}
  .coulisses dt{font:500 .68rem/1 "DM Mono",monospace; letter-spacing:.14em; text-transform:uppercase; color:var(--brun)}
  .coulisses dd{margin:.35rem 0 0; font-size:.98rem; color:var(--encre2); max-width:56rem}
  .coulisses ul{margin:.3rem 0 0; padding-left:1.1rem}
  .coulisses li{margin:.28rem 0}

  /* bande CTA répétée (médiane observée : 8 CTA/page, un seul libellé) */
  .bande-cta{text-align:center; margin:3.4rem 0 0}
  .bande-cta .btn{padding:1rem 2rem}
  .bande-cta .micro{font:400 .78rem/1.7 "DM Mono",monospace; color:var(--gris); margin:.7rem 0 0}

  /* ═ LES FAITS — un chiffre, une ligne, côte à côte.
     Un chiffre qui a besoin d'un paragraphe pour être compris n'est pas un
     argument. Trois colonnes, huit mots maximum chacune. ═ */
  .faits{display:grid; grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));
    gap:clamp(1.6rem,3vw,3rem); margin:1.6rem 0 0;
    border-top:1px solid var(--filet); padding-top:2rem}
  .fait-n{margin:0; font:500 clamp(2.6rem,5.4vw,3.8rem)/1 "DM Mono",ui-monospace,monospace;
    color:var(--encre); font-variant-numeric:tabular-nums; letter-spacing:-.02em; white-space:nowrap}
  .fait-n .unite{font-size:.36em; color:var(--gris); letter-spacing:0; margin-left:.18em}
  .fait-l{margin:.5rem 0 0; font-size:1.02rem; line-height:1.38; color:var(--encre2); max-width:15em}
  .faits-note{margin:2rem 0 0; font:400 .78rem/1.6 "DM Mono",ui-monospace,monospace; color:var(--gris)}

  /* ═ le tout-en-un : UN téléphone, cinq écrans (onglets qui défilent) ═
     Ce n'est pas un carrousel : les cinq intitulés restent lisibles en
     permanence, la barre dit le temps qu'il reste, le survol met en pause
     et un clic rend la main. ═ */
  .poche{display:grid; grid-template-columns:1fr 340px; gap:3.2rem; align-items:start; margin:2.6rem 0 0}
  /* mobile : le téléphone passe au-dessus et reste collé pendant qu'on lit
     la liste — sinon l'écran change hors du champ de vision */
  @media(max-width:900px){
    .poche{display:flex; flex-direction:column; gap:0}
    .poche-cote{order:-1; position:sticky; top:54px; z-index:5; max-width:none;
      background:var(--papier); padding:.5rem 0 .9rem; margin:0 auto}
    .poche-menu{max-width:none; margin-top:.4rem}
  }
  .poche-menu{align-content:start; max-width:31rem}
  .poche-item{position:relative; display:block; width:100%; text-align:left; font:inherit;
    background:transparent; border:0; border-top:1px solid var(--filet2); cursor:pointer;
    padding:1.05rem .2rem 1.05rem 0}
  .poche-item:last-of-type{border-bottom:1px solid var(--filet2)}
  /* Une jauge, pas un trait : on voit le rail vide ET le remplissage, donc on
     comprend qu'il reste du temps — c'est ce qui donne envie d'attendre la suite. */
  .poche-item[aria-selected="true"]::after{content:""; position:absolute; top:-1px; left:0; right:0;
    height:3px; background:rgba(138,106,69,.18); border-radius:2px}
  .poche-item .barre{position:absolute; top:-1px; left:0; height:3px; width:100%; z-index:1;
    background:var(--brun); border-radius:2px; transform:scaleX(0); transform-origin:0 50%}
  .poche.tourne .poche-item[aria-selected="true"] .barre{animation:poche-remplir var(--poche-duree,5000ms) linear forwards}
  @keyframes poche-remplir{to{transform:scaleX(1)}}
  .poche-menu:hover .barre,.poche-menu:focus-within .barre{animation-play-state:paused}
  .poche-item .t{display:block; font-size:1.1rem; color:var(--gris); transition:color .3s ease}
  .poche-item .b{display:block; margin-top:.25rem; font-size:.95rem; color:#A29C8D; transition:color .3s ease}
  .poche-item:hover .t{color:var(--encre2)}
  .poche-item:hover .b{color:var(--gris)}
  .poche-item[aria-selected="true"] .t{color:var(--encre); font-weight:500}
  .poche-item[aria-selected="true"] .b{color:var(--encre2)}
  .poche-plus{margin:1.5rem 0 0; font:400 .82rem/1.75 "DM Mono",monospace; color:var(--gris)}
  .poche-plus b{color:var(--brun); font-weight:500}
  .poche-appart{margin:.9rem 0 0; font-size:1rem; color:var(--encre2); max-width:31rem}
  .poche-appart b{font-weight:500; color:var(--encre)}
  .poche-cote{width:100%; max-width:340px; justify-self:center}
  .poche-tel{width:min(316px,100%); min-height:20.5rem; display:flex; flex-direction:column;
    box-shadow:0 24px 55px rgba(23,21,15,.18)}
  .poche-ecran{display:flex; flex-direction:column; flex:1; animation:poche-entre .5s var(--mvt)}
  .poche-ecran[hidden]{display:none}
  @keyframes poche-entre{from{opacity:0; transform:translateY(8px)}}
  .poche-ecran > :last-child{margin-top:auto}
  .poche-ecran .badge-ok{align-self:flex-start}

  /* ═ AVIS — marquee à deux rangées, sens opposés.
     Mécanique relevée sur glossgenius.com : la piste contient TROIS copies de
     la même liste ; l'animation translate d'exactement UNE largeur de liste,
     donc la boucle est invisible. La rangée du bas part en sens inverse
     (animation-direction:reverse). Survol = pause. ═ */
  .avis-v7 .tete{max-width:none}
  .avis-v7 h2{font-size:clamp(2.1rem,4.4vw,3.4rem); line-height:1.06; letter-spacing:-.028em; max-width:20ch}
  .avis-v7 .tete > p:last-child{margin:.9rem 0 0; font-size:clamp(1.05rem,1.4vw,1.2rem); color:var(--encre2)}
  .mq-wrap{margin-top:clamp(2rem,4vw,3rem); display:flex; flex-direction:column; gap:clamp(.8rem,1.6vw,1.2rem)}
  .mq{overflow:hidden;
    -webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);
            mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
  .mq-piste{display:flex; width:max-content; will-change:transform;
    animation:mq-defile var(--mq-duree,40s) linear infinite}
  .mq[data-sens="droite"] .mq-piste{animation-direction:reverse}
  .mq:hover .mq-piste{animation-play-state:paused}
  @keyframes mq-defile{to{transform:translateX(calc(var(--mq-pas,0px) * -1))}}
  .mq-liste{display:flex; align-items:stretch; width:max-content}
  .mq-item{width:clamp(19rem,26vw,23rem); padding-inline:.5rem; display:flex}

  .avis{margin:0; background:var(--blanc); border:1px solid var(--filet); border-radius:18px;
    padding:1.4rem 1.5rem; display:flex; flex-direction:column; gap:.85rem; width:100%;
    box-shadow:0 10px 30px rgba(40,30,14,.05)}
  .etoiles{color:var(--ambre); font-size:.95rem; letter-spacing:.12em; line-height:1}
  .avis blockquote{margin:0; font-size:1.02rem; line-height:1.45; color:var(--encre)}
  .avis figcaption{margin-top:auto; padding-top:.4rem; display:flex; align-items:center; gap:.75rem}
  .avis figcaption img{width:44px; height:44px; border-radius:50%; object-fit:cover; flex:none;
    background:var(--creux)}
  .avis figcaption b{display:block; font-size:.97rem; font-weight:600}
  .avis figcaption small{display:block; font-size:.84rem; color:var(--gris)}

  @media (prefers-reduced-motion:reduce){
    /* Animations coupées : le marquee ne défile plus. `overflow-x:auto`
       montrait alors une barre de défilement grise sous chaque rangée.
       On replie plutôt les avis en grille — tout est lisible sans bouger,
       et les deux copies de la liste (qui n'existent que pour la boucle)
       disparaissent. */
    .mq-piste{animation:none; width:auto; flex-wrap:wrap; justify-content:center}
    .mq{overflow:hidden; -webkit-mask-image:none; mask-image:none}
    .mq-liste{width:auto; flex-wrap:wrap; justify-content:center}
    .mq-liste + .mq-liste{display:none}
    /* 03/09 : replié en grille, les cartes de la 2e rangée touchaient celles
       de la 1re (aucun espace vertical). Vu sur /tarif-v2/ par Nicolas, dont
       le Chrome est en mouvement réduit. */
    .mq-item{width:min(23rem,100%); padding-block:.5rem}
    .mq:hover .mq-piste{animation-play-state:running}
  }

  /* CTA collant mobile (GoodUI #41 ; apparaît après le héro) */
  .colle{position:fixed; left:0; right:0; bottom:0; z-index:30; background:rgba(19,16,9,.97);
    border-top:1px solid rgba(201,168,118,.25); padding:.65rem .9rem calc(.65rem + env(safe-area-inset-bottom));
    display:none; align-items:center; justify-content:center; gap:.9rem;
    transform:translateY(100%); transition:transform .35s ease}
  .colle.visible{transform:none}
  .colle .btn{padding:.75rem 1.4rem; font-size:.88rem; flex:none}
  /* Sur le fond quasi noir de la barre, le champagne manque de tranche : le
     blanc plein se détache franchement et reste le seul bouton plein de
     l'écran quand la barre est visible. */
  .colle .btn-or{background:#FFFDF8; color:var(--noir)}
  .colle .btn-or:hover{background:#fff; box-shadow:0 10px 28px rgba(0,0,0,.45)}
  .colle .micro{font:400 .62rem/1.4 "DM Mono",monospace; color:rgba(246,242,233,.6)}
  @media(max-width:760px){.colle{display:flex}}

  a:focus-visible,summary:focus-visible{outline:2px solid var(--champagne); outline-offset:3px; border-radius:4px}
  @media (prefers-reduced-motion:reduce){
    html{scroll-behavior:auto}
    .trace::after{width:100%; transition:none}
    .colle{transition:none}
    .app,.rev,.rev-suite>*{opacity:1 !important; transform:none !important; transition:none !important}
    .anime .seq{opacity:1 !important; transform:none !important; animation:none !important}
    .jauge i{transition:none} .vu .jauge i{width:72%}
    .btn{transition:none}
    .poche.tourne .poche-item[aria-selected="true"] .barre{animation:none; transform:scaleX(1)}
    .poche-ecran{animation:none}
    .capsule,.lettre,.ouvr{animation:none !important}
    .lettre,.ouvr{opacity:1 !important; transform:none !important}
  }

  /* ═══════════════════════════════════════════════════════════════════
     V7 — structure GlossGenius, couleurs Welcome, angle « moins de
     téléphone ». Trois blocs neufs : l'accroche (héro clair), les
     chiffres (compteurs), les cartes (photo + capture). Le reste est
     repris tel quel. Titres en Archivo 600 : chaleureux, pas éditorial.
     ═══════════════════════════════════════════════════════════════════ */
  .v7 h1,.v7 h2,.v7 h3{font-weight:600; letter-spacing:-.02em}
  .v7 .etq{color:var(--brun)}

  /* ── L'ACCROCHE — média plein écran, texte par-dessus.
     Relevé sur glossgenius.com : vidéo en `object-fit:cover`, texte clair
     aligné à gauche, AUCUN voile teinté (leur média est simplement sombre),
     H1 72 px / graisse 500 / interlignage 0,97 / -0,03 em, sous-titre 16 px.
     Plein écran (100 svh, pas 100 vh, sinon la barre d'adresse mobile coupe le
     bas), texte centré verticalement par le `margin-block:auto` du contenu.
     Même grammaire que `hero-photo` + `hero-bloc` de l'accueil client : on
     réutilise, on n'invente pas. ── */
  .accroche{position:relative; overflow:hidden; background:var(--encre);
    min-height:100vh; min-height:100svh; display:flex; flex-direction:column;
    padding-top:calc(var(--cap-t) + var(--cap-h)); padding-bottom:clamp(2rem,5vh,3.5rem)}
  .accroche-media{position:absolute; inset:0; z-index:0}
  .accroche-media img,.accroche-media video{width:100%; height:100%; object-fit:cover;
    object-position:62% center; display:block}
  /* ── LE FILM DU HÉRO ────────────────────────────────────────────────────
     Il se superpose au poster et se fond dedans une fois la lecture partie
     (classe `joue`, posée par le script). Tant qu'il n'a pas de source il
     n'affiche rien et ne coûte rien : c'est le poster qu'on voit.
     ⛔ En mouvement réduit il n'existe pas — et le script ne le charge même
     pas, donc ce n'est pas seulement une image cachée, c'est un mégaoctet
     qui ne part jamais. ── */
  .accroche-film{position:absolute; inset:0; opacity:0; z-index:0;
    transition:opacity .9s var(--mvt)}
  .accroche-film.joue{opacity:1}
  @media (prefers-reduced-motion:reduce){ .accroche-film{display:none} }
  /* La charte n'assombrit pas l'image : ce sont les LETTRES qui portent leur
     ombre. On ajoute seulement un dégradé très léger à gauche, parce que
     notre photo est plus claire que la leur à l'endroit du texte. */
  .accroche-voile{position:absolute; inset:0; z-index:1; pointer-events:none;
    background:linear-gradient(90deg, rgba(10,9,7,.58) 0%, rgba(10,9,7,.28) 42%, rgba(10,9,7,0) 72%)}
  .accroche .contenu{position:relative; z-index:2; margin-block:auto;
    display:flex; flex-direction:column; align-items:flex-start; gap:clamp(1rem,2vw,1.5rem)}
  /* Le plancher du clamp est descendu à 2 rem : à 2,4 rem, « s'écrit toute
     seule. » ne tient pas sur 390 px et laisse « s'écrit » orphelin sur sa
     ligne. `text-wrap:balance` rattrape les largeurs intermédiaires. */
  .accroche h1{font-size:clamp(2rem,5.4vw,4.5rem); line-height:.98; letter-spacing:-.032em;
    font-weight:600; color:#fff; max-width:16ch; text-wrap:balance;
    text-shadow:0 1px 2px rgba(10,9,7,.5), 0 2px 12px rgba(10,9,7,.45), 0 4px 34px rgba(10,9,7,.35)}
  .accroche h1 span{display:block}
  .accroche .sous{margin:0; font-size:clamp(1.02rem,1.35vw,1.18rem); line-height:1.5;
    color:rgba(255,255,255,.94); max-width:46ch; font-weight:400;
    text-shadow:0 1px 2px rgba(10,9,7,.55), 0 2px 14px rgba(10,9,7,.45)}
  .accroche .cta{display:flex; flex-wrap:wrap; align-items:center; gap:.8rem}
  .btn-clair{display:inline-flex; align-items:center; justify-content:center;
    background:#fff; color:var(--encre); border-radius:999px; font-weight:600;
    padding:15px 30px; font-size:1.02rem; white-space:nowrap; border:0; cursor:pointer;
    transition:background .2s, transform .25s var(--mvt)}
  .btn-clair:hover{background:var(--lin); transform:translateY(-2px)}
  .btn-contour{display:inline-flex; align-items:center; justify-content:center;
    background:transparent; color:#fff; border:1.5px solid rgba(255,255,255,.6);
    border-radius:999px; font-weight:500; padding:14px 26px; font-size:1.02rem;
    white-space:nowrap; cursor:pointer;
    transition:background .2s, border-color .2s, transform .25s var(--mvt)}
  .btn-contour:hover{background:rgba(255,255,255,.14); border-color:#fff; transform:translateY(-2px)}
  .accroche .note{margin:0; font:400 .8rem/1.6 "DM Mono",ui-monospace,monospace;
    color:rgba(255,255,255,.72); text-shadow:0 1px 6px rgba(10,9,7,.6)}
  @media(max-width:760px){
    .accroche-media img,.accroche-media video{object-position:70% center}
    /* Le film vertical ET l'image fixe sont DÉJÀ recadrés en 9/16 : les
       décaler une seconde fois à 70 % les casserait. Sélecteurs à trois
       niveaux pour passer devant la règle ci-dessus. */
    .accroche-media video.accroche-film,
    .accroche-media picture img{object-position:center center}
    .accroche-voile{background:linear-gradient(180deg, rgba(10,9,7,.35) 0%, rgba(10,9,7,.55) 55%, rgba(10,9,7,.7) 100%)}
    .accroche h1{max-width:none}
    /* Mesuré : à 32 px, « s'écrit toute seule. » demande 360 px pour 313 px
       disponibles — le titre tombe sur trois lignes et « s'écrit » se retrouve
       orphelin au milieu. À 28 px il tient, et la coupure voulue en deux temps
       est respectée. Un titre un peu plus petit vaut mieux qu'un titre déchiré. */
    .accroche h1{font-size:1.75rem; letter-spacing:-.035em}
  }

  /* ═══════════════════════════════════════════════════════════════════
     30/09 — LE HÉROS DE /pros/ : le film « une journée, du matin au soir »
     (motion design, chantier app 26 bis ; page-pros-v2.php, pros-v2.js).
     ⛔ Tout ce bloc vise `.accroche-journee`, le héros de /pros/ SEUL :
     /tarif/ charge aussi cette feuille. La 2.10.103 posait ces règles sur
     `.accroche` et avait mis le texte de /tarif/ en bas sur téléphone.
     ═══════════════════════════════════════════════════════════════════ */
  /* La scène du film est sur la MOITIÉ DROITE de l'image, à droite du texte :
     cadrage calé à droite. */
  .accroche-journee .accroche-media img,.accroche-journee .accroche-media video{object-position:100% center}
  /* ORDINATEUR ET TABLETTE COUCHÉE : LA SCÈNE TIENT ENTRE LA CAPSULE ET LE BAS
     DE L'ÉCRAN, quelle que soit la forme de la fenêtre.
     ⛔ 2.10.103 : film en « cover ». Or une vraie fenêtre est PLUS LARGE que le
     16/9 (barres du navigateur : 1536 × 730, 1903 × 937…) : le film, mis à la
     largeur, était rogné en haut et en bas — le titre d'étape passait sous la
     capsule, le bilan final sortait de l'écran (vu par Nicolas le 30/09).
     Le film est fabriqué dans une page de 1440 × 810 (1 « unité » = 1 px de
     cette page) : sa scène va de 94 à 784 en hauteur (690 unités), de 720 à
     1408 en largeur ; au-dessus, il n'y a que le plan, qui peut passer sous la
     capsule (elle est en verre). --u, la taille d'une unité à l'écran, est la
     plus grande qui fasse tenir la scène sous la capsule (12 px de marge) sans
     dépasser la largeur de la fenêtre. Le film est calé à droite, sa scène à
     8 px sous la capsule, et centrée dans la hauteur libre s'il en reste (écran
     4:3). Bords haut et bas fondus dans le même noir. Vues d'écran, pas de
     pourcentage : un « 100% » se lirait en largeur dans `width`. */
  @media (min-width:761px) and (orientation:landscape){
    .accroche-journee .accroche-media{--cap:calc(var(--cap-t) + var(--cap-h));
      --u:min(calc((100svh - var(--cap) - 12px) / 690), calc(100vw / 1440))}
    .accroche-journee .accroche-media video.accroche-film,
    .accroche-journee .accroche-media picture img{position:absolute; left:auto; right:0; bottom:auto; transform:none;
      width:calc(var(--u) * 1440); height:calc(var(--u) * 810); object-fit:cover;
      top:calc(var(--cap) + 8px - var(--u) * 94 + max(0px, (100svh - var(--cap) - 12px - var(--u) * 690) / 2));
      -webkit-mask-image:linear-gradient(180deg, transparent 0, #000 7%, #000 97%, transparent);
              mask-image:linear-gradient(180deg, transparent 0, #000 7%, #000 97%, transparent)}
  }
  /* TÉLÉPHONE ET TABLETTE EN PORTRAIT : le film vertical met la scène EN HAUT
     (sous la capsule), le texte descend EN BAS, le voile ne couvre plus que le
     texte. Le film (et l'image finale du mouvement réduit) prend TOUTE LA
     HAUTEUR du héros, à son propre format (390/844), centré : jamais rogné en
     bas, là où sa scène s'arrête au-dessus du titre (mis à la largeur, il
     descendait sous le titre sur 360 × 740 ou sur tablette). Sur un écran
     relativement plus large que lui, il laisse des marges du même noir que
     lui (#17150F) ; ses bords s'y fondent (masque). */
  @media (max-width:760px), (max-width:1024px) and (orientation:portrait){
    .accroche-journee .contenu{margin-top:auto; margin-bottom:0}
    .accroche-journee .accroche-voile{background:linear-gradient(180deg, rgba(10,9,7,0) 0%, rgba(10,9,7,0) 56%, rgba(10,9,7,.5) 68%, rgba(10,9,7,.66) 100%)}
    .accroche-journee .accroche-media video.accroche-film,
    .accroche-journee .accroche-media picture img{position:absolute; inset:0 auto 0 50%; width:auto; height:100%;
      aspect-ratio:390/844; transform:translateX(-50%); object-fit:cover; object-position:center top;
      -webkit-mask-image:linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
              mask-image:linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent)}
  }
  /* TÉLÉPHONE COURT (360 × 740, iPhone SE…) : le film vertical, mis à la
     hauteur, pose son bilan final juste au-dessus du titre. Le texte se
     resserre (≤ 780 px de haut), puis rapetisse un peu (≤ 700 px). */
  @media (max-width:760px) and (max-height:780px){
    .accroche-journee{padding-bottom:1rem}
    .accroche-journee .contenu{gap:.8rem}
  }
  @media (max-width:760px) and (max-height:700px){
    .accroche-journee h1{font-size:1.55rem}
    .accroche-journee .sous{font-size:.95rem}
  }

  /* ── les chiffres : titre, crédibilité, trois compteurs ── */
  .chiffres-v7 .tete{text-align:center}
  /* Une seule ligne au bureau : 36 signes demandent ~1 174 px à 60 px de corps
     pour 1 227 px disponibles. Au-delà de 3,8 rem le titre casse. */
  .chiffres-v7 h2{font-size:clamp(2rem,4.6vw,3.8rem); line-height:1.06; letter-spacing:-.03em;
    max-width:none; margin-inline:auto; text-wrap:balance}
  .chiffres-v7 .tete p{margin:.9rem auto 0; font-size:clamp(1.05rem,1.5vw,1.25rem); color:var(--encre2); max-width:46ch}
  .stats{display:grid; grid-template-columns:repeat(auto-fit,minmax(13rem,1fr));
    gap:clamp(1.4rem,2.5vw,2.4rem); margin-top:clamp(2.4rem,4.5vw,3.6rem); text-align:center}
  /* Chez eux le chiffre fait ~150 px et l'intitulé se colle dessous. Le poids
     est dans le nombre, pas dans la phrase. */
  .stat .n{font:600 clamp(4rem,10vw,8.5rem)/.92 "Archivo","Helvetica Neue",Arial,sans-serif;
    letter-spacing:-.05em; color:var(--encre); font-variant-numeric:tabular-nums; white-space:nowrap}
  .stat .n .u{font-size:.34em; font-weight:500; color:var(--brun); margin-left:.06em; letter-spacing:-.02em}
  .stat .n .lt{font-size:.5em; font-weight:500; color:var(--brun); margin-right:.04em; vertical-align:.14em}
  .stat p{margin:.55rem auto 0; font-size:clamp(1rem,1.2vw,1.08rem); line-height:1.35;
    color:var(--encre2); max-width:24ch}
  /* Les deux premiers chiffres sont mesurés chez nous, le troisième vient
     d'ailleurs : la source est affichée, sinon le bloc s'attribue une mesure
     qui n'est pas la sienne. */
  .stat p.source{margin-top:.4rem; font:400 .72rem/1.4 "DM Mono",ui-monospace,monospace;
    color:var(--gris); letter-spacing:.02em}



  /* ── « QUATORZE JOURS » — gabarit relevé sur glossgenius.com (« See what a
     difference 30 days can make ») : titre et paragraphe centrés, un bouton,
     puis une image pleine largeur à coins 16 px. Chez eux DEUX fichiers, un
     panoramique 1380/500 pour le bureau et un presque carré 360/380 pour le
     téléphone — pas un seul recadré, parce qu'un panoramique réduit à la
     largeur d'un écran de téléphone ne montre plus rien. On fait pareil. ── */
  /* Mesuré contre glossgenius.com : leur titre tient sur UNE ligne parce que
     leur colonne fait 8/12 du conteneur (~890 px). À 46 rem le nôtre cassait en
     deux et le bloc paraissait deux fois plus étroit que le leur. Le titre fait
     36 signes : mesuré, il lui faut plus de 896 px à 46 px de corps. À 43 px il
     tient dans 840, d'où le plafond à 2,7 rem et la colonne à 60 rem. */
  .trente-tete{text-align:center; max-width:min(60rem,100%); margin-inline:auto}
  .trente-tete h2{font-size:clamp(1.9rem,3.4vw,2.7rem); line-height:1.1; letter-spacing:-.026em;
    margin:0 0 1.1rem; text-wrap:balance}
  .trente-tete > p{margin:0 auto 2rem; font-size:clamp(1.05rem,1.45vw,1.24rem); line-height:1.55;
    color:var(--encre2); max-width:44rem}
  /* Le bouton a son propre conteneur pleine largeur : dans un <p> mesuré à
     44 rem calé à gauche des 60 rem, il se centrait sur la boîte, pas sur la
     section — décalé de 130 px vers la gauche, mesuré. */
  .trente-cta{text-align:center}
  /* Le rapport se pose sur le CADRE, pas sur l'image : sur l'image il perd
     contre `height:100%` et c'est le rapport intrinsèque du fichier qui gagne
     (mesuré : 1,36 au lieu de 2,76). Une seule image, un seul cadre, dont le
     rapport change avec la largeur — panoramique au bureau, presque carré sur
     téléphone, où un panoramique ne montrerait plus rien. */
  .trente-image{margin-top:clamp(2.4rem,4.5vw,3.5rem); border-radius:16px; overflow:hidden;
    background:var(--creux); aspect-ratio:1380/500}
  .trente-image img{width:100%; height:100%; object-fit:cover; display:block}
  @media(max-width:760px){
    .trente-image{aspect-ratio:360/380}
  }


  /* ── LES MODALES — un <dialog> natif. Ici, la seule base commune à la modale
     des magasins (#modale-app) et à celle des vidéos (#modale-demo). Tout ce
     qui est propre aux vidéos et au bouton « Voir la démo » vit dans
     assets/demo.css depuis le 23/09 (les guides pro s'en servent sans ce socle). ── */
  .modale{border:0; padding:0; background:transparent; max-width:min(1040px,92vw); width:100%}
  .modale::backdrop{background:rgba(10,9,7,.82); backdrop-filter:blur(6px)}

  /* ── les cartes : blanc sur papier, texte à gauche, photo + capture à droite ── */
  .cartes-v7 .tete{max-width:34em}
  .cartes-v7 h2{font-size:clamp(2.1rem,4.4vw,3.4rem); line-height:1.06; letter-spacing:-.028em}
  .cartes-v7 .tete p{margin:.9rem 0 0; font-size:clamp(1.05rem,1.4vw,1.2rem); color:var(--encre2); max-width:44ch}
  .cartes{display:flex; flex-direction:column; gap:clamp(1.2rem,2.5vw,2rem); margin-top:clamp(2rem,4vw,3rem)}
  .carte{background:var(--blanc); border:1px solid var(--filet); border-radius:26px;
    padding:clamp(1.4rem,3vw,2.4rem);
    display:grid; grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr); gap:clamp(1.4rem,3vw,3rem);
    box-shadow:0 14px 44px rgba(40,30,14,.06)}
  @media(max-width:900px){.carte{grid-template-columns:1fr}}
  .carte .txt{display:flex; flex-direction:column}
  .carte .etq{margin:0}
  /* 12ch sur un titre de 46 px = 278 px dans une colonne qui en fait 480 :
     le texte n'occupait que la moitié de sa place. Mesures reprises sur la
     largeur réelle de la colonne. */
  .carte h3{font-size:clamp(1.9rem,3.8vw,2.9rem); line-height:1.05; margin-top:.7rem; max-width:16ch}
  .carte .bas{margin-top:auto; padding-top:clamp(1.6rem,4vw,3.4rem)}
  .carte .bas p{margin:0; font-size:1.1rem; line-height:1.45; color:var(--encre); max-width:none}
  /* Gabarit repris de la page /pros/ en production : un titre puis une liste
     de points courts. La coche remplace le ✔️ du site — un emoji ne prend pas
     la couleur de la charte et se dessine différemment selon les systèmes. */
  .carte .points{list-style:none; margin:0; padding:0; display:grid; gap:.62rem}
  .carte .points li{position:relative; padding-left:1.6rem; font-size:1.02rem;
    line-height:1.4; color:var(--encre)}
  .carte .points li::before{content:"✓"; position:absolute; left:0; top:.02em;
    color:var(--brun); font-weight:700}
  .carte .bas a{display:inline-block; margin-top:1rem; color:var(--gris); font-weight:500; text-decoration:none}
  .carte .bas a:hover{color:var(--encre)}
  .visuel{position:relative; border-radius:18px; overflow:hidden; aspect-ratio:4/3; background:var(--creux)}
  .visuel img{width:100%; height:100%; object-fit:cover; display:block}
  /* Un cadre vide et honnête tant que la vraie capture n'est pas là.
     Jamais un écran dessiné (CLAUDE.md §7). */
  /* Le cadre en pointillés ne servait qu'à dire « il manquera quelque chose
     ici ». Les vraies captures sont des PNG à FOND TRANSPARENT : les poser dans
     une carte blanche revient à mettre une carte blanche dans une carte
     blanche. Elles flottent donc directement sur la photo.
     `drop-shadow` et non `box-shadow` : le premier suit le canal alpha, le
     second dessinerait un rectangle autour d'une image détourée.
     La taille se donne en HAUTEUR — les fichiers font tous 750 × 1000 avec
     beaucoup de vide autour, une largeur en % déborderait du cadre 4/3.
     Position et hauteur se règlent carte par carte (--ch, --cl, --cr, --cb,
     --ct) : quatre captures posées au même endroit font quatre fois la même
     image. */
  .capture{position:absolute; height:var(--ch,88%); width:auto;
    left:var(--cl,auto); right:var(--cr,4%); top:var(--ct,auto); bottom:var(--cb,2%);
    pointer-events:none}
  .capture img{height:100%; width:auto; display:block;
    filter:drop-shadow(0 20px 34px rgba(20,17,9,.30)) drop-shadow(0 3px 10px rgba(20,17,9,.18))}

  /* ── Relevé sur glossgenius.com (GSAP 3.15 + ScrollTrigger) ──
     Cartes  : data-fade-in="element" → opacité 0, y +32 px, puis 1 / 0 en une
               fois à l'entrée dans l'écran. Elles sont espacées de ~600 px,
               donc elles se révèlent naturellement une par une.
     Chiffres: data-scroll-stagger → les trois colonnes partent décalées vers
               le bas (+51 / +131 / +160 px) et remontent à 0 EN SUIVANT LE
               DÉFILEMENT — pas une animation lancée une fois, un mouvement
               scrubbé qui recule si on remonte. La gauche arrive en premier.
     Titre   : data-title-fade-in-stagger="word" → les mots du titre entrent
               un par un. */
  .rev-pret .carte.rev{transform:translateY(32px); transition-duration:.9s}
  .rev-pret .carte.rev.vu{transform:none}

  .stat{will-change:transform}
  .stat > *{transition:none}

  /* les mots du titre de l'accroche entrent un par un.
     ⛔ 19/09 — découpés côté serveur (welcome_titre_mots, inc/01-assets.php)
     et animés dès le premier affichage, comme le reste de l'ouverture : le
     titre ne disparaît plus pour rejouer son entrée quand le script arrive. */
  .accroche h1 .mot{display:inline-block; animation:mot-entre .7s var(--mvt) both;
    animation-delay:calc(var(--i) * 70ms + 180ms)}
  @keyframes mot-entre{from{opacity:0; transform:translateY(.35em)} to{opacity:1; transform:none}}

  /* ⏱️ 19/09 — SUR TÉLÉPHONE, L'OUVERTURE EST DEUX FOIS PLUS SERRÉE.
     Maintenant qu'elle joue au premier affichage, ses délais comptent dans la
     mesure de Google : le paragraphe sous le titre est le plus gros bloc de
     texte du premier écran, donc l'« élément principal » de la page (la photo
     plein écran n'a été retenue dans aucune de nos mesures) — et il attendait
     620 ms avant de commencer à apparaître, soit autant de retard sur la
     mesure. Même séquence, mêmes durées, départs deux fois plus rapprochés
     (la mention part à 420 ms au lieu de 840). Le bureau garde les temps
     d'origine. */
  @media (max-width:760px){
    .ouvr{animation-delay:calc(var(--d,0ms) * .5)}
    .accroche h1 .mot{animation-delay:calc(var(--i) * 40ms + 80ms)}
  }

  /* ── Le bandeau « on s'occupe de tout » : la reprise en main.
     Surface plus chaude que le papier pour casser la suite de blocs clairs,
     deux colonnes, et un seul lien vers la page dédiée. ── */
  .reprise{background:var(--lin); border-top:1px solid var(--filet); border-bottom:1px solid var(--filet)}
  .reprise .contenu{display:grid; grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr);
    gap:clamp(1.8rem,4vw,4rem); align-items:center}
  @media(max-width:900px){.reprise .contenu{grid-template-columns:1fr}}
  .reprise h2{font-size:clamp(2.1rem,4.4vw,3.4rem); line-height:1.06; letter-spacing:-.028em; max-width:13ch}
  .reprise .intro{margin-top:1rem; font-size:clamp(1.05rem,1.4vw,1.2rem); color:var(--encre2); max-width:38ch}
  .reprise .lien{display:inline-flex; align-items:center; gap:.5rem; margin-top:1.4rem;
    font-weight:500; color:var(--encre); text-decoration:none;
    border-bottom:2px solid var(--brun); padding-bottom:.15rem;
    transition:gap .25s var(--mvt)}
  .reprise .lien:hover{gap:.85rem}
  .reprise .actions-reprise{margin:1.6rem 0 0}
  .duo-reprise{position:relative}
  .bloc-r{background:var(--blanc); border:1px solid var(--filet); border-radius:18px;
    padding:clamp(1.2rem,2.5vw,1.7rem); display:flex; flex-direction:column; gap:.55rem}
  .bloc-r .t{font-size:1.16rem; font-weight:600}
  .bloc-r p{font-size:1rem; color:var(--encre2); max-width:none}
  /* Les trois points rassurants remplacent la liste des concurrents : nommer
     Planity ou Fresha sur sa propre page, c'est leur offrir une mention. */
  .rassur{list-style:none; margin:.6rem 0 0; padding:0; display:grid; gap:.75rem}
  .rassur li{display:flex; align-items:center; gap:.7rem; font-size:1rem; color:var(--encre)}
  .rassur li svg{flex:none; color:var(--brun)}
  /* ⚠️ Ce bloc est APRÈS les règles .bloc-r et .rassur exprès : à
     spécificité égale, la cascade donnait raison à `.bloc-r p{color:var(--encre2)}`
     et le texte restait sombre sur le voile sombre. L'ordre fait partie de la règle. */
  /* La carte « Vos données, importées » : photo en fond, voile sombre
     uniforme, texte clair par-dessus (consigne de Nicolas, 05/09). Le
     contenu est posé en bas ; la carte garde un ratio 4/3 minimum pour que
     la photo respire au-dessus du texte. */
  .bloc-r--photo{position:relative; overflow:hidden; isolation:isolate; min-height:0;
    aspect-ratio:4/3; justify-content:flex-end; color:var(--lin);
    border-color:transparent; background:var(--noir)}
  .bloc-r__fond{position:absolute; inset:0; width:100%; height:100%; object-fit:cover;
    object-position:60% 40%; z-index:-2}
  .bloc-r--photo::before{content:""; position:absolute; inset:0; z-index:-1;
    background:linear-gradient(to top, rgba(19,16,9,.86) 0%, rgba(19,16,9,.62) 55%, rgba(19,16,9,.42) 100%)}
  .bloc-r--photo .t{color:#fff}
  .bloc-r--photo p{color:rgba(246,242,233,.86)}
  .bloc-r--photo .rassur li{color:var(--lin)}
  .bloc-r--photo .rassur svg{color:rgba(246,242,233,.9)}
  @media(max-width:900px){ .bloc-r--photo{aspect-ratio:auto; min-height:22rem} }
  .bloc-r .detail{display:flex; flex-wrap:wrap; gap:.4rem; margin-top:.35rem}
  .bloc-r .detail span{font:500 .74rem/1 "DM Mono",ui-monospace,monospace;
    background:var(--creux); color:var(--brun); border-radius:999px; padding:.5em .8em}

  /* En colonne unique, un décalage vertical de 160 px ne « stagger » plus rien :
     il pousse le 3e chiffre dans la section suivante. On coupe sous 820 px. */
  @media (max-width:820px){
    .stat{transform:none !important}
  }
  @media (prefers-reduced-motion:reduce){
    .stat{transform:none !important}
    .accroche h1 .mot{opacity:1 !important; transform:none !important; animation:none !important}
  }

  /* ═══════════════════════════════════════════════════════════════════
     LE COMPARATEUR D'ABONNEMENT — remplace la carte noire sur /pros-v2/.
     Fond `--lin`, choisi par Nicolas parmi cinq essais (03/09).
     ⛔ NE PAS toucher aux classes `.offre*` juste au-dessus : elles servent
        encore à `page-tarif-v2.php`. Ce bloc vit à côté, pas à leur place.
     Deux règles de couleur, demandées : le prix Welcome se lit sur du BLANC
     (contraste maximal, la carte de droite avance), et le montant prélevé
     reste gris barré. Aucun texte en italique ici — le sérif italique de la
     charte ne sert qu'à l'accent d'un titre de section.
     ═══════════════════════════════════════════════════════════════════ */
  /* 08/09 — RESSERRÉ. Le bloc faisait ~640 px pour trois nombres ; il en fait
     ~430. La carte passe en CLAIR pour rejoindre celles de /tarif/ et /aide/,
     et la réassurance + les notes des magasins descendent sur la MÊME bande
     que les boutons. Plus une seule étiquette en DM Mono : à cette taille le
     monospace donne un air de facture, pas d'offre. */
  .mesure{background:var(--blanc); border:1px solid var(--filet); border-radius:24px;
    max-width:52rem; margin-inline:auto; overflow:hidden;
    box-shadow:0 20px 48px rgba(40,30,14,.12)}
  .mesure-haut{background:linear-gradient(180deg,#F7EADA 0%, #FDF9F3 88%, var(--blanc) 100%);
    padding:clamp(1.4rem,2.8vw,1.9rem) clamp(1.2rem,2.8vw,2rem) clamp(1.2rem,2.4vw,1.5rem)}
  .mesure-nom{margin:0; font-size:.75rem; font-weight:700; letter-spacing:.19em;
    text-transform:uppercase; color:var(--brun)}
  .mesure h3{font-size:clamp(1.45rem,2.9vw,1.9rem); line-height:1.14; letter-spacing:-.025em;
    margin:.35rem 0 0; max-width:26ch; color:var(--encre); text-wrap:balance}

  .mesure-cur{margin-top:1.15rem}
  .mesure-cur label{display:flex; justify-content:space-between; align-items:baseline; gap:1rem;
    font-size:.93rem; color:var(--encre2)}
  .mesure-cur label b{font:700 1.3rem/1 "Archivo",sans-serif; letter-spacing:-.03em;
    color:var(--encre); font-variant-numeric:tabular-nums; white-space:nowrap}
  /* la piste se remplit jusqu'au curseur : --pct est posé par pros-v2.js */
  .mesure input[type=range]{-webkit-appearance:none; appearance:none; width:100%; display:block;
    height:22px; margin-top:.5rem; background:transparent; cursor:pointer}
  .mesure input[type=range]::-webkit-slider-runnable-track{height:5px; border-radius:99px;
    background:linear-gradient(90deg,var(--champagne) var(--pct,32%), #E7DFD2 var(--pct,32%))}
  .mesure input[type=range]::-moz-range-track{height:5px; border-radius:99px; background:#E7DFD2}
  .mesure input[type=range]::-moz-range-progress{height:5px; border-radius:99px; background:var(--champagne)}
  .mesure input[type=range]::-webkit-slider-thumb{-webkit-appearance:none; width:22px; height:22px;
    border-radius:50%; background:var(--champagne); border:3px solid #fff; margin-top:-8.5px;
    box-shadow:0 3px 10px rgba(138,106,69,.4); transition:transform .15s var(--mvt)}
  .mesure input[type=range]::-moz-range-thumb{width:22px; height:22px; border:3px solid #fff;
    border-radius:50%; background:var(--champagne); box-shadow:0 3px 10px rgba(138,106,69,.4)}
  .mesure input[type=range]:hover::-webkit-slider-thumb{transform:scale(1.08)}
  .mesure input[type=range]:focus-visible{outline:none}
  .mesure input[type=range]:focus-visible::-webkit-slider-thumb{outline:3px solid var(--brun); outline-offset:2px}

  .mesure-duo{display:grid; grid-template-columns:1fr 1fr; gap:.7rem; margin-top:1.05rem}
  @media(max-width:600px){.mesure-duo{grid-template-columns:1fr}}
  .mesure-duo>div{border-radius:14px; padding:.85rem 1rem}
  .mesure-eux{background:var(--creux); border:1px solid var(--filet)}
  .mesure-nous{background:var(--blanc); border:2px solid var(--champagne);
    box-shadow:0 10px 26px rgba(201,168,118,.25)}
  .mesure-duo .t{margin:0; font-size:.86rem; line-height:1.4; color:var(--encre2)}
  .mesure-nous .t b{color:var(--brun); font-weight:700}
  .mesure-duo .n{margin:.2rem 0 0; font:700 1.9rem/1 "Archivo",sans-serif; letter-spacing:-.045em}
  .mesure-duo .n span{font-size:.42em; font-weight:600}
  .mesure-eux .n{color:var(--gris)}
  .mesure-eux .n i{font-style:normal; text-decoration:line-through; text-decoration-thickness:2px;
    text-decoration-color:rgba(138,133,120,.55)}
  .mesure-nous .n{color:var(--encre)}
  .mesure-nous .n span{color:var(--brun)}
  .mesure-duo .m{margin:.25rem 0 0; font-size:.76rem; line-height:1.45; color:var(--gris)}
  .mesure-nous .m{color:var(--encre2)}

  .mesure-verdict{margin:.85rem 0 0; background:#F7EADA; border-radius:13px; padding:.7rem 1rem;
    display:flex; align-items:baseline; gap:.5rem; flex-wrap:wrap;
    font-size:.95rem; line-height:1.45; color:var(--encre)}
  .mesure-verdict b{font:700 1.45rem/1 "Archivo",sans-serif; letter-spacing:-.035em;
    color:var(--brun); font-variant-numeric:tabular-nums}
  .mesure-verdict em{font-style:normal; color:var(--encre2); font-size:.9rem}

  /* boutons + réassurance + notes : une seule bande, plus trois lignes */
  .mesure-bas{padding:1rem clamp(1.2rem,2.8vw,2rem) 1.1rem; border-top:1px solid var(--filet);
    display:flex; align-items:center; justify-content:space-between; gap:1rem; flex-wrap:wrap}
  .mesure-actions{display:flex; gap:.55rem; flex-wrap:wrap}
  @media(max-width:560px){
    .mesure-bas{justify-content:center}
    .mesure-actions{width:100%; flex-direction:column}
    .mesure-actions .btn{width:100%}
  }
  .mesure-actions .btn{padding:.82rem 1.4rem; font-size:.95rem; text-align:center}
  .mesure-actions .btn-ligne{border-color:var(--filet2); color:var(--encre)}
  .mesure-actions .btn-ligne:hover{border-color:var(--encre); color:var(--encre)}
  .mesure-bande{display:flex; align-items:center; gap:.75rem; flex-wrap:wrap;
    font-size:.85rem; color:var(--encre2)}
  @media(max-width:560px){.mesure-bande{justify-content:center; text-align:center}}
  .mesure-sep{width:1px; height:1rem; background:var(--filet)}
  @media(max-width:760px){.mesure-sep{display:none}}

  /* ── Le rappel de prix des cartes : un texte fléché, jamais un bouton.
     Chaque carte a déjà sa liste de points ; un cinquième bouton dans la page
     aurait concurrencé l'essai gratuit. La flèche avance au survol, c'est le
     seul mouvement. ── */
  /* 07/09 — Retour de Nicolas : « on ne les voit pas assez ». Vérifié en
     prod : le lien n'était PAS brun, il était GRIS. `.carte .bas a` (l. 711,
     spécificité 0,2,1) écrasait `color:var(--brun)` et `font-weight` de
     `.carte-cta` (0,1,0) — la déclaration brune était là depuis le début et
     ne servait à rien. D'où le sélecteur qualifié ci-dessous (0,3,1) plutôt
     qu'un `!important`. On en profite pour poser le soulignement en
     permanence : un lien qui ne se signale qu'au survol n'existe pas sur un
     téléphone. */
  .carte .bas a.carte-cta{display:inline-flex; align-items:center; gap:.55rem;
    margin-top:clamp(1.1rem,2vw,1.5rem); font:600 1rem/1.35 "Archivo",sans-serif;
    color:var(--brun); text-decoration:none;
    border-bottom:1px solid rgba(138,106,69,.45);
    padding-bottom:3px; transition:color .25s ease, border-color .25s ease}
  .carte-cta svg{flex:none; transition:transform .25s var(--mvt)}
  .carte .bas a.carte-cta:hover,.carte .bas a.carte-cta:focus-visible{color:var(--encre); border-bottom-color:var(--encre)}
  .carte-cta:hover svg,.carte-cta:focus-visible svg{transform:translateX(4px)}

  @media (prefers-reduced-motion:reduce){
    .carte-cta svg{transition:none}
    .carte-cta:hover svg,.carte-cta:focus-visible svg{transform:none}
  }

/* ── LA CAPSULE PRO SUR TÉLÉPHONE (04/09) ───────────────────────────────
   Mesuré à 390 px : le document faisait 399 px de large, 9 px de défilement
   horizontal sur les trois pages pro. La cause n'est pas le burger, c'est le
   bouton « Télécharger l'app » (164 px) resté dans la capsule : logo 123 +
   gap 18 + bouton 164 + burger 44 + padding 26 = 375 pour 335 disponibles.
   `accueil-v2.css` masque ce bouton sous 720 px depuis toujours — la règle
   n'a pas suivi lors de l'extraction de `coquille.css`. On la remet ICI,
   dans le socle des pages pro, plutôt que dans un fichier généré. Le bouton
   n'est pas perdu : le menu du burger le porte, en dernière ligne. ── */
@media (max-width:720px){
  .capsule-pro .btn-fantome{display:none}
}

/* ══ LES NOTES DES DEUX MAGASINS — 08/09 ═══════════════════════════════
   Servies par `parts/notes-stores.php`, partagées par /tarif/, /aide/ et
   /pros/. Étoiles en SVG et non le caractère ★ : au-delà de 20 px il change
   de dessin d'un système à l'autre. Le socle porte ces règles parce que les
   trois pages les emploient ; les blocs qui les entourent, eux, vivent dans
   la feuille de leur page. ── */
  .w-etoiles{display:inline-flex; gap:.13rem; line-height:0}
  .w-etoiles svg{display:block}
  .w-notes{display:grid; grid-template-columns:1fr 1fr; gap:1.2rem; width:100%; max-width:30rem;
    margin:1.3rem auto 0; padding-top:1.2rem; border-top:1px solid #EADDC8}
  .w-note{display:grid; gap:.22rem; justify-items:center; text-align:center}
  .w-chiffre{font:700 1.9rem/1 "Archivo",sans-serif; letter-spacing:-.035em;
    font-variant-numeric:tabular-nums; color:var(--encre)}
  .w-ou{font-size:.88rem; color:var(--encre2)}
  @media(max-width:520px){.w-notes{grid-template-columns:1fr; gap:.9rem}}
  /* version d'une ligne, pour les bandes serrées (comparateur de /pros/) */
  .w-mini{display:inline-flex; align-items:center; gap:.35rem; white-space:nowrap}
  .w-mini b{font-weight:700; color:var(--encre); font-variant-numeric:tabular-nums}
