/* ============================================================
   charte-publique.css — FEUILLE UNIQUE DE LA FAMILLE « pages publiques »
   ⚠️ FICHIER GÉNÉRÉ par scripts/regenerer_la_charte.py. Ne rien écrire ici à la
   main : modifier la feuille d'origine, puis régénérer. Les fichiers d'origine
   restent sur le disque.
   Ordre concaténé : fonts_lecture.css, fonts_inter.css, no_scroll.css, no_scroll_lisibilite.css, no_scroll_dimension.css, no_scroll_couleur.css, no_scroll_offres.css, no_scroll_pc.css, no_scroll_barre.css, no_scroll_coherence.css, no_scroll_form.css, design-arrondi.css, nuee3d.css, passe-interface.css
   ============================================================ */

/* ===== début fonts_lecture.css ===== */
/* ============================================================
   LECTURE — Inter (police auto-hébergée) + IBM Plex Mono de la charte.

   ⚠️ POURQUOI CE FICHIER CHANGE (2026-10-06). Deux défauts mesurés sur le site
   public, tous deux invisibles à la lecture du code :

   1. ⚠️⚠️ ANTON, IBM PLEX MONO ET PLEXMONO N'ÉTAIENT JAMAIS ENREGISTRÉS.
      Mesure `document.fonts` sur `/pricing` : seule Bitter était déclarée.
      Cause : les pages no-scroll n'incluent PAS `_head.html` (elles ont leur
      propre <head> SEO), donc ni `fonts.css` ni `fonts_refonte.css` n'étaient
      chargées. Résultat : `.n-title { font-family: Anton, … }` tombait sur le
      `sans-serif` générique du système (DejaVu Sans en test) — le titre était
      rendu dans une police que PERSONNE n'avait choisie, différente selon la
      machine du visiteur. Idem pour les étiquettes mono.
      On redéclare donc ici les polices dont le gabarit `n-` a besoin, dans la
      feuille DÉJÀ chargée par toutes ces pages.

   2. Police de lecture : Bitter (slab serif) → **Inter** (demande du user :
      « plus lisible »). Inter est dessinée pour l'écran : hauteur d'x élevée,
      formes ouvertes, chiffres tabulaires. Déclarée dans `fonts_inter.css`.

   ⚠️ Auto-hébergement obligatoire : aucune requête vers un domaine tiers.
   ============================================================ */

/* ---- IBM Plex Mono (la mono de la charte) ---- */
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/client-ibm-plex-mono-400-normal-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/client-ibm-plex-mono-500-normal-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:600;font-display:swap;src:url('/static/fonts/client-ibm-plex-mono-600-normal-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}

/* ---- PlexMono : nom historiquement utilisé par `fonts_refonte.css` ---- */
@font-face{font-family:'PlexMono';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/plex-mono-500.woff2') format('woff2');}

/* ---- Anton (titres) + Archivo (repli) : déclarés ici car les pages `n-`
   n'incluent pas `_head.html`/`fonts_refonte.css`. Sans ça, Anton reste
   introuvable et le titre tombe sur la sans-serif du système. ---- */
@font-face{font-family:'Anton';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/anton-400.woff2') format('woff2');}
@font-face{font-family:'Archivo';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/archivo-400.woff2') format('woff2');}
@font-face{font-family:'Archivo';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/archivo-500.woff2') format('woff2');}

/* ---- Bitter conservée (les sites clients la déclarent via fonts_client.css ;
   on garde la déclaration pour ne rien casser si une page la demande). ---- */
@font-face{font-family:'Bitter';font-style:normal;font-weight:400;font-display:swap;
  src:url('/static/fonts/client-bitter-400-normal-latin.woff2') format('woff2');}
@font-face{font-family:'Bitter';font-style:normal;font-weight:600;font-display:swap;
  src:url('/static/fonts/client-bitter-600-normal-latin.woff2') format('woff2');}
@font-face{font-family:'Bitter';font-style:normal;font-weight:700;font-display:swap;
  src:url('/static/fonts/client-bitter-700-normal-latin.woff2') format('woff2');}

/* ===== fin fonts_lecture.css ===== */

/* ===== début fonts_inter.css ===== */
/* ============================================================
   POLICE DE LECTURE — Inter, AUTO-HÉBERGÉE (aucun CDN au runtime).
   Generee par scripts/installer_police_inter.py — ne pas editer a la main.

   ⚠️ POURQUOI INTER (2026-10-06). Demande du user : « change la police
   d'ecriture pour quelque chose de plus lisible ». Bitter (slab serif) etait
   la police de lecture ; Inter est dessinee pour l'ecran (hauteur d'x elevee,
   formes ouvertes, chiffres tabulaires) et reste neutre.
   ⚠️ On ne charge QUE latin + latin-ext : le francais n'a besoin de rien
   d'autre, et chaque sous-ensemble en trop est du poids mort a telecharger.
   ============================================================ */

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

/* ===== fin fonts_inter.css ===== */

/* ===== début no_scroll.css ===== */
/* ============================================================
   DEVISALY — MODELE « NO SCROLL » (refonte 2026-10-05)
   Calque sur absurdventures.com : UN ECRAN, tout dans le menu.

   ⚠️⚠️ CE FICHIER NE REUTILISE AUCUNE CLASSE DE L'ANCIEN THEME.
   Prefixe `n-` (comme absurdventures prefixe `abp-`). La demande est explicite :
   « sans rien garder de l'ancien ». Reutiliser `.v-`, `.s-`, `.container`…
   reproduirait le MELANGE ancien/nouveau que l'utilisateur repere tout de suite.

   POLICES : on reutilise celles deja auto-hebergees, qui correspondent aux
   roles d'absurdventures :
     Anton    (condensee)  ~ Tungsten  -> titres
     Archivo  (sans-serif) ~ BioSans   -> texte
     Plex Mono             ~ JetBrains -> etiquettes, meta, boutons

   REGLE DE MISE EN PAGE : chaque page = `min-height: 100svh` (jamais `vh`),
   la navigation vit dans `.n-menu` (plein ecran), presente DANS LE HTML pour
   le SEO/GEO.
   ============================================================ */

:root {
  --n-bg: #ffffff;          /* fond : BLANC */
  --n-fg: #0a0a0a;          /* encre : NOIRE */
  --n-dim: rgba(10, 10, 10, .58);
  --n-rule: rgba(10, 10, 10, .2);
  --n-pad: 24px;

  /* ⚠️⚠️ L'OR DE LA MARQUE — « le site est trop fade » (2026-10-06).
     La refonte avait supprimé TOUTE couleur : « aucune couleur d'accent, comme
     la reference [absurdventures] ». Le user a tranché : « ajoute de la couleur,
     c'est trop fade ». On réintroduit donc l'or du logo (#C8A24A), mais
     ATTÉNUÉ, avec des contrastes MESURÉS sur fond blanc :
       --n-or        #b8892e   3,16:1  APLATS, traits, gros chiffres (>= 24 px)
       --n-or-texte  #8a6a2a   5,03:1  texte fin, et ENCRE des boutons or
       --n-or-pale   #f3ead6   1,20:1  fonds très légers (bandeaux, cartes)
     ⚠️ L'or vif #c8a24a ne fait que 2,41:1 sur blanc : JAMAIS sur du texte
     courant, seulement en aplat. La règle vit maintenant dans `:root` pour que
     toute feuille `n-` puisse l'utiliser. */
  --n-or: #b8892e;
  --n-or-texte: #8a6a2a;
  --n-or-pale: #f3ead6;
  --n-or-ligne: #dcc79a;
}

/* ⚠️ L'ACCENT DE LA BARRE : le mot « devisaly » reprend l'or du logo. */
.n-logo b { font-weight: 500; }
.n-logo { color: var(--n-fg); }
.n-logo b span { color: var(--n-or-texte); }

@media (min-width: 900px) { :root { --n-pad: 56px; } }

* { box-sizing: border-box; }

/* ============================================================
   TYPOGRAPHIE — PROPORTIONS EXACTES DE LA REFERENCE
   Mesurees dans le CSS d'absurdventures :
       --graphicFont: clamp(1.5rem, 3.333vw, 4rem)   -> titres
       --titlesFont : condensed                      -> tres gros titres
       --decorativeFont: mono                        -> etiquettes
       --bodyFont   : sans                           -> texte
   ⚠️ Mon 1er jet utilisait clamp(34px, 7.4vw, 96px) : a 1440 px cela donnait
   96 px, soit DEUX FOIS la reference (48 px). On recale sur la reference.
   ⚠️ Police de LECTURE = **Inter** (2026-10-06, demande « plus lisible » ;
   avant : Bitter, slab serif). Inter est dessinee pour l'ecran : hauteur
   d'x elevee, formes ouvertes, chiffres tabulaires. Declaree dans
   `fonts_inter.css`, chargee par les gabarits `n-`.
   ============================================================ */
:root {
  --n-titre: clamp(1.5rem, 3.333vw, 4rem);        /* 24 -> 48 px */
  --n-titre-grand: clamp(1.5rem, 3.333vw, 4rem);  /* = --graphicFont de la reference */
  --n-corps: clamp(1rem, 1.15vw, 1.15rem);        /* 16 -> 18.4 px */
  --n-etiquette: .75rem;                           /* 12 px, comme la reference */
}

.n-body {
  margin: 0;
  background: var(--n-bg);
  color: var(--n-fg);
  /* ⚠️ Bitter en lecture, Archivo en repli : si le woff2 tarde, on tombe sur une
     sans-serif propre plutot que sur le serif par defaut du systeme. */
  font-family: Inter, Archivo, system-ui, sans-serif;
  font-size: var(--n-corps);
  line-height: 1.62;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* ---------------- LA BARRE (fixe, transparente) ---------------- */
.n-head {
  position: fixed; top: 0; left: 0; right: 0; z-index: 40;
  display: flex; align-items: center; justify-content: space-between;
  padding: 20px var(--n-pad);
  background: transparent;
  pointer-events: none;                 /* seuls les enfants sont cliquables */
}
.n-head > * { pointer-events: auto; }
.n-logo {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 13px; letter-spacing: .22em; text-transform: uppercase;
  color: var(--n-fg); text-decoration: none;
}
.n-logo b { font-weight: 500; }
.n-menu-btn {
  display: inline-flex; align-items: center; gap: 12px;
  background: none; border: 0; cursor: pointer;
  color: var(--n-fg);
  font-family: 'IBM Plex Mono', monospace;
  font-size: var(--n-etiquette); letter-spacing: .2em; text-transform: uppercase;
  padding: 10px 0;
}
.n-menu-btn .n-burger { display: inline-flex; flex-direction: column; gap: 5px; }
.n-menu-btn .n-burger i {
  display: block; width: 26px; height: 1px; background: var(--n-fg);
  transition: transform .3s, opacity .3s;
}
.n-menu-btn[aria-expanded="true"] .n-burger i:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.n-menu-btn[aria-expanded="true"] .n-burger i:nth-child(2) { opacity: 0; }
.n-menu-btn[aria-expanded="true"] .n-burger i:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* ---------------- L'ECRAN (un seul, plein viewport) ----------------
   ⚠️ `100svh` et non `vh` : sur mobile la barre du navigateur apparait/disparait
   et `vh` fait deborder de ~60 px. `min-height` (pas `height`) : si le texte est
   trop long sur un petit ecran, la page grandit plutot que de rogner. */
.n-screen {
  min-height: 100svh;
  display: flex; flex-direction: column; justify-content: center;
  padding: 96px var(--n-pad) 48px;
}
.n-kicker {
  font-family: 'IBM Plex Mono', monospace;
  font-size: var(--n-etiquette); letter-spacing: .26em; text-transform: uppercase;
  color: var(--n-dim); margin: 0 0 22px;
}
.n-title {
  font-family: Anton, Archivo, sans-serif;
  font-weight: 400; text-transform: uppercase;
  font-size: var(--n-titre);
  line-height: 1.02; letter-spacing: -.008em;
  margin: 0; max-width: 24ch;
}
.n-title .n-outline { color: transparent; -webkit-text-stroke: 1.4px var(--n-fg); }
.n-sub {
  margin: 26px 0 0; max-width: 46ch;
  font-size: var(--n-corps); color: var(--n-dim); line-height: 1.62;
}
.n-cta {
  display: flex; flex-wrap: wrap; gap: 14px; margin-top: 34px;
}
.n-btn {
  display: inline-block; padding: 15px 26px;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 12px; letter-spacing: .16em; text-transform: uppercase;
  text-decoration: none; border: 1px solid var(--n-fg);
  color: var(--n-bg); background: var(--n-fg);
  transition: background .2s, color .2s;
}
.n-btn:hover { background: transparent; color: var(--n-fg); }
.n-btn-ghost { background: transparent; color: var(--n-fg); }
.n-btn-ghost:hover { background: var(--n-fg); color: var(--n-bg); }

/* le bandeau de reperes, en bas de l'ecran */
.n-facts {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 1px; margin-top: 48px; border-top: 1px solid var(--n-rule);
}
.n-facts > div { padding: 16px 0 0; border-right: 1px solid var(--n-rule); }
.n-facts > div:last-child { border-right: 0; }
.n-facts dt {
  font-family: 'IBM Plex Mono', monospace; font-size: 10px;
  letter-spacing: .18em; text-transform: uppercase; color: var(--n-dim); margin: 0;
}
.n-facts dd { margin: 6px 0 0; font-size: 18px; }
@media (max-width: 700px) { .n-facts { grid-template-columns: repeat(2, 1fr); } }

/* ---------------- LE MENU (plein ecran, DANS LE DOM) ----------------
   ⚠️ Le menu est SERVI dans le HTML (c'est le plan du site : c'est lui qui rend
   les pages crawlables). On le masque par `visibility` + `transform`, jamais en
   retirant les liens du document. */
.n-menu {
  position: fixed; inset: 0; z-index: 60;
  background: var(--n-bg);
  display: flex; flex-direction: column;
  /* ⚠️⚠️ `flex-start`, JAMAIS `center`. BUG MESURE (2026-10-06) : avec
     `justify-content: center` + `overflow-y: auto`, le contenu depasse des
     DEUX cotes — la premiere entree sortait a -27 px (320x568) et -2 px
     (390x844), donc IMPOSSIBLE de remonter au debut du menu : la barre de
     defilement ne remonte que jusqu'au premier pixel du contenu, pas jusqu'a
     « tout en haut ». En flex, le debordement au-dessus du conteneur est perdu.
     C'est un piege classique du combos « centre + scroll ». */
  justify-content: flex-start;
  padding: 96px var(--n-pad) 40px;
  overflow-y: auto;                     /* le MENU peut defiler (il est long) */
  overscroll-behavior: contain;         /* le scroll ne « deborde » pas sur la page */
  visibility: hidden;
  transform: translateY(-1.5rem);
  opacity: 0;
  transition: opacity .28s ease, transform .28s ease, visibility .28s;
}
.n-menu[data-open="true"] { visibility: visible; opacity: 1; transform: translateY(0); }
/* ⚠️⚠️ OUVERTURE SANS JAVASCRIPT. Le bouton est aussi un lien `#n-menu` : si le
   JS echoue ou est desactive, `:target` ouvre le menu quand meme. La navigation
   ne depend donc JAMAIS du script — c'est la regle du skill `no-scroll-site`. */
.n-menu:target { visibility: visible; opacity: 1; transform: translateY(0); }

.n-menu-group {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px; letter-spacing: .24em; text-transform: uppercase;
  color: var(--n-dim); margin: 30px 0 8px;
}
.n-menu a.n-link {
  display: block; width: 100%;
  padding: 14px 0;
  border-top: 1px solid var(--n-rule);
  font-family: Anton, Archivo, sans-serif;
  font-size: clamp(20px, 2.9vw, 34px);
  letter-spacing: -.01em; text-transform: uppercase;
  color: var(--n-fg); text-decoration: none;
  transition: padding-left .2s, color .2s;
}
.n-menu a.n-link:hover { padding-left: 14px; }
.n-menu-foot {
  margin-top: 30px;
  font-family: 'IBM Plex Mono', monospace; font-size: 11px;
  letter-spacing: .14em; color: var(--n-dim);
}
.n-menu-foot a { color: var(--n-dim); text-decoration: none; margin-right: 18px; }

/* ⚠️⚠️ LE MENU DOIT TENIR DANS L'ECRAN — par paliers de HAUTEUR.
   BUG MESURE (2026-10-06) : le menu debordait de 6 px (390x844), 60 px
   (1440x900) et 153 px (320x568) → une barre de defilement apparaissait a
   l'ouverture, alors que c'est le MENU qui doit tenir. On resserre la chaine
   complete (groupes, entrees, pied) — pas juste le padding. */
@media (max-height: 920px) {
  .n-menu { padding: 80px var(--n-pad) 28px; }
  .n-menu-group { margin: 20px 0 6px; }
  .n-menu a.n-link { padding: 10px 0; font-size: clamp(18px, 2.4vw, 28px); }
  .n-menu-foot { margin-top: 20px; }
}
@media (max-height: 760px) {
  .n-menu { padding: 64px var(--n-pad) 20px; }
  .n-menu-group { margin: 14px 0 4px; }
  .n-menu a.n-link { padding: 8px 0; font-size: clamp(17px, 2.2vw, 24px); }
  .n-menu-foot { margin-top: 14px; font-size: 10px; }
}
@media (max-height: 620px) {
  .n-menu { padding: 54px var(--n-pad) 14px; }
  .n-menu-group { margin: 9px 0 3px; font-size: 9px; }
  .n-menu a.n-link { padding: 6px 0; font-size: clamp(16px, 2vw, 21px); }
  .n-menu-foot { margin-top: 10px; }
}

/* la classe qui verrouille le defilement derriere le menu ouvert */
.n-locked { overflow: hidden; }

/* ============================================================
   PETITS ECRANS — par paliers de HAUTEUR, pas de largeur.
   ⚠️ Un 320x568 est COURT : le meme contenu qui tient sur un 390x844 fait
   818 px de haut (mesure) et deborde de 250 px. On resserre TOUTE la chaine
   d'espacements et la taille des boutons — pas seulement le padding.
   Si ca ne suffit pas encore, la page GRANDIT (min-height) : on ne rogne JAMAIS.
   ============================================================ */
@media (max-height: 760px) {
  .n-screen { padding: 64px var(--n-pad) 24px; }
  .n-kicker { margin-bottom: 14px; }
  .n-title { font-size: clamp(1.5rem, 3.4vw, 2.4rem); }
  .n-sub { margin-top: 18px; font-size: 14px; }
  .n-cta { margin-top: 22px; gap: 10px; }
  .n-btn { padding: 12px 18px; font-size: 11px; }
  .n-facts { margin-top: 26px; }
  .n-facts dd { font-size: 16px; }
  .n-facts > div { padding-top: 12px; }
}
@media (max-height: 620px) {
  .n-screen { padding: 56px var(--n-pad) 18px; }
  .n-kicker { margin-bottom: 10px; }
  .n-title { font-size: clamp(1.4rem, 3.6vw, 1.9rem); }
  .n-sub { margin-top: 12px; font-size: 13px; }
  .n-cta { margin-top: 16px; gap: 8px; }
  .n-cta .n-btn { flex: 1 1 100%; text-align: center; padding: 11px 14px; }
  .n-facts { margin-top: 18px; grid-template-columns: repeat(2, 1fr); }
  .n-facts > div { padding-top: 8px; }
  .n-facts dt { font-size: 9px; }
  .n-facts dd { font-size: 14px; margin-top: 3px; }
}


/* ============================================================
   CARROUSEL NATIF — pour les pages de contenu long (prix métier x departement,
   ~16 000 pages). Défilement horizontal au doigt, accrochage, AUCUN JavaScript.
   ⚠️ C'est le « système » demande : au lieu d'empiler, on fait defiler une bande.
   ============================================================ */
.n-car {
  display: flex; gap: 1px; margin-top: 1.4rem;
  overflow-x: auto; scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  border: 1px solid var(--n-rule);
  scrollbar-width: thin;
}
.n-car-item {
  flex: 0 0 auto; min-width: min(86vw, 320px);
  scroll-snap-align: start;
  padding: 1.3rem 1.2rem; border-right: 1px solid var(--n-rule);
  background: var(--n-bg);
}
.n-car-item:last-child { border-right: 0; }
.n-car-item h3 { font-size: 1.05rem; margin: 0 0 .5rem; font-weight: 600; }
.n-car-item .n-prix { font-family: 'IBM Plex Mono', monospace; font-size: 1.35rem; margin: 0; }
.n-car-item .n-prix small { font-size: .72rem; color: var(--n-dim); letter-spacing: .08em; }
.n-car-label {
  font-family: 'IBM Plex Mono', monospace; font-size: .68rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--n-dim);
  margin: 1.6rem 0 0;
}

/* un écran un peu plus serré (pages de contenu) */
.n-screen--serre { justify-content: center; padding-top: 7rem; }
@media (max-height: 760px) { .n-screen--serre { padding-top: 5.5rem; } }
@media (max-height: 620px) { .n-screen--serre { padding-top: 4.5rem; } }
.n-screen--serre .n-car-item { padding: 1rem .9rem; }
.n-screen--serre .n-sub { margin-top: .9rem; }
.n-screen--serre .n-title { font-size: var(--n-titre); }
.n-detail { margin-top: 1.2rem; max-width: 62ch; }
.n-detail summary {
  cursor: pointer; font-family: 'IBM Plex Mono', monospace; font-size: .72rem;
  letter-spacing: .14em; text-transform: uppercase; color: var(--n-dim);
}
.n-detail p { font-size: .95rem; margin: .8rem 0; }

/* ============================================================
   L'ECRAN D'ACCUEIL — la seule page avec un titre plus grand.
   La reference a `--titlesFont` (condensee) pour les tres gros titres et
   `--graphicFont` pour les titres courants : deux niveaux, pas plus.
   ============================================================ */
.n-screen--accueil .n-title { font-size: var(--n-titre-grand); max-width: 20ch; }

/* ============================================================
   LA PREUVE VISUELLE DE L'ACCUEIL (2026-10-06).
   ⚠️ 3 vignettes compactes (ratio 16/9) pour tenir dans l'écran « no scroll ».
   Angles DROITS, aucun ombre, aucun dégradé : la séparation est un FILET.
   ⚠️ Sur les écrans COURTS, on masque le libellé et on réduit la hauteur -
   la preuve ne doit jamais pousser les CTA hors de l'écran.
   ============================================================ */
.n-preuves { margin-top: 34px; }
.n-preuves__tete {
  font-family: 'IBM Plex Mono', monospace; font-size: 10px;
  letter-spacing: .18em; text-transform: uppercase; color: var(--n-dim);
  margin: 0 0 12px;
}
.n-preuves__grille {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 1px; background: var(--n-rule); border: 1px solid var(--n-rule);
}
.n-preuve {
  display: block; background: var(--n-bg); text-decoration: none; color: inherit;
  transition: background-color .15s;
}
.n-preuve:hover { background: var(--n-or-pale); }
.n-preuve__visuel { display: block; line-height: 0; border-bottom: 1px solid var(--n-rule); }
.n-preuve__visuel img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 16 / 9; object-fit: cover; object-position: top center;
}
.n-preuve__corps { display: block; padding: 10px 12px 12px; }
.n-preuve__corps b {
  display: block; font-family: Anton, Archivo, sans-serif; font-weight: 400;
  font-size: 14px; text-transform: uppercase; letter-spacing: -.005em; color: var(--n-fg);
}
.n-preuve__quoi {
  display: block; font-size: 11.5px; color: var(--n-dim); margin-top: 3px; line-height: 1.4;
}
.n-preuves__plus {
  display: inline-block; margin-top: 12px;
  font-family: 'IBM Plex Mono', monospace; font-size: 11px;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--n-or-texte); text-decoration: none;
}
.n-preuves__plus:hover { text-decoration: underline; }

@media (max-height: 760px) {
  /* écran court : on garde la preuve mais on retire le libellé sous les vignettes */
  .n-preuves { margin-top: 20px; }
  .n-preuve__corps { padding: 0; height: 0; overflow: hidden; }
  .n-preuves__tete { margin-bottom: 8px; }
}

/* ============================================================
   FOND ANIME AVEC EFFET DE FLOU (demande du user)
   ⚠️ CSS PUR, aucun canvas, aucun shader : un effet qui echoue en silence est
   pire qu'un effet absent. Deux nappes radiales qui derivent lentement +
   `filter: blur()`. Respecte `prefers-reduced-motion`.
   ⚠️ Decoratif : `aria-hidden`, jamais au-dessus du contenu (z-index negatif).
   ============================================================ */
.n-blur {
  position: fixed; inset: -20%;
  z-index: -1; pointer-events: none;
  overflow: hidden;
}
.n-blur span {
  position: absolute; display: block;
  width: 55vmax; height: 55vmax; border-radius: 50%;
  filter: blur(90px); opacity: .5;
}
.n-blur span:nth-child(1) { background: rgba(10,10,10,.10); top: -10%; left: -8%;  animation: n-derive-a 26s ease-in-out infinite alternate; }
.n-blur span:nth-child(2) { background: rgba(10,10,10,.07); bottom: -14%; right: -6%; animation: n-derive-b 32s ease-in-out infinite alternate; }
.n-blur span:nth-child(3) { background: rgba(10,10,10,.05); top: 34%; left: 42%;    animation: n-derive-a 40s ease-in-out infinite alternate-reverse; }
@keyframes n-derive-a {
  from { transform: translate3d(0, 0, 0) scale(1); }
  to   { transform: translate3d(14vw, 9vh, 0) scale(1.22); }
}
@keyframes n-derive-b {
  from { transform: translate3d(0, 0, 0) scale(1.1); }
  to   { transform: translate3d(-12vw, -7vh, 0) scale(.92); }
}
@media (prefers-reduced-motion: reduce) {
  .n-blur span { animation: none; }
}

/* ============================================================
   TRES PETITS ECRANS (320x568, 360x640) — derniers resserrements.
   ⚠️ Mesure : a 320 px il restait un debordement de 4 a 31 px sur les pages de
   contenu. On resserre l'espacement, on ne rogne jamais le contenu.
   ============================================================ */
@media (max-height: 600px) {
  .n-screen--serre { padding-top: 3.6rem; padding-bottom: .8rem; }
  .n-screen--serre .n-title { font-size: 1.35rem; }
  .n-screen--serre .n-sub { font-size: .85rem; margin-top: .55rem; line-height: 1.45; }
  .n-screen--serre .n-car-label { margin-top: .7rem; }
  .n-screen--serre .n-car-item { padding: .65rem .7rem; }
  .n-screen--serre .n-car-item h3 { font-size: .92rem; margin-bottom: .3rem; }
  .n-screen--serre .n-car-item .n-prix { font-size: 1.1rem; }
  .n-screen--serre .n-cta { margin-top: .7rem; }
  .n-screen--serre .n-btn { padding: 9px 12px; font-size: 10px; }
  .n-detail { margin-top: .5rem; }
  .n-detail summary { font-size: .66rem; }
}

/* ============================================================
   MODE LECTURE « NO SCROLL » (2026-10-05, demande du user)
   Pour les pages a texte long (blog, CGV, confidentialite, mentions) : la PAGE
   ne defile JAMAIS ; c'est la ZONE DE TEXTE qui defile, dans l'ecran.
   ⚠️ Pourquoi c'est la bonne reponse : un texte long qu'on force a tenir dans
   100svh devient soit illisible (trop petit), soit rogne (perdu). Ici la
   hauteur est exactement celle du viewport et le texte defile DEDANS — comme
   un article dans une fenetre. Mesure : `docH == innerHeight` sur toute page.
   ============================================================ */
.n-lecture {
  /* ⚠️⚠️ `height` et NON `min-height` : c'est la hauteur FIXE de l'ecran qui
     oblige le texte a defiler DEDANS. Avec `min-height`, le conteneur grandit
     avec le texte et c'est la page entiere qui defile (bug mesuré : +1264 px
     sur /cgv). Le bloc est borne a l'ecran, le corps defile a l'interieur. */
  height: 100svh;
  box-sizing: border-box;
  padding: 5.5rem var(--n-pad) 2rem;
  display: flex; flex-direction: column;
  overflow: hidden;
}
.n-lecture__tete { flex: 0 0 auto; }
.n-lecture__tete .n-title { font-size: var(--n-titre); max-width: 28ch; }
.n-lecture__tete .n-sub { margin-top: 1rem; }
.n-lecture__corps {
  /* la hauteur disponible, ni plus ni moins : c'est ce qui garantit que la page
     ne defile pas, quel que soit le volume de texte. */
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  margin-top: 1.6rem;
  padding-right: 1rem;
  max-width: 68ch;              /* largeur de lecture confortable */
  font-size: var(--n-corps);
  line-height: 1.68;
  scrollbar-width: thin;
  border-top: 1px solid var(--n-rule);
  padding-top: 1.4rem;
}
.n-lecture__corps h2 { font-size: 1.15rem; margin: 2rem 0 .7rem; }
.n-lecture__corps h3 { font-size: 1.02rem; margin: 1.5rem 0 .5rem; }
.n-lecture__corps p, .n-lecture__corps li { margin: 0 0 1rem; color: var(--n-fg); }
.n-lecture__corps a { color: var(--n-fg); }
.n-lecture__corps strong { font-weight: 600; }
/* ⚠️ marge basse pour que le dernier paragraphe ne colle jamais au bord */
.n-lecture__corps > *:last-child { margin-bottom: 2rem; }

/* ============================================================
   PAGES A FORMULAIRE / TUNNEL — « no scroll » (2026-10-05).
   Même principe que le mode lecture : la PAGE tient dans l'écran, c'est le
   CONTENU (formulaire) qui défile dedans si besoin.
   ⚠️ Les formulaires gardent TOUS leurs champs, leur `name` et leur `csrf_token` :
   seule l'enveloppe visuelle change. Un formulaire amputé ne se remplit plus.
   ============================================================ */
.n-screen--form {
  height: 100svh; box-sizing: border-box; overflow: hidden;
  padding: 5.5rem var(--n-pad) 2rem;
  display: flex; flex-direction: column;
  justify-content: flex-start;
}
.n-screen--form .n-title { font-size: var(--n-titre); max-width: 26ch; }
.n-formbox {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;
  margin-top: 1.4rem;
  max-width: 46rem;
  scrollbar-width: thin;
  padding-right: .5rem;
}
/* les champs : on garde les classes d'origine, on ne retouche que ce qui est
   indispensable pour qu'ils restent lisibles sur fond blanc. */
.n-formbox input, .n-formbox select, .n-formbox textarea {
  width: 100%; padding: 12px 14px; margin: 6px 0 14px;
  border: 1px solid var(--n-rule); background: var(--n-bg); color: var(--n-fg);
  font-family: Inter, Archivo, system-ui, sans-serif; font-size: 1rem;
  border-radius: 0; box-sizing: border-box;
}
.n-formbox label {
  font-family: 'IBM Plex Mono', monospace; font-size: .72rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--n-dim);
}
.n-formbox .btn, .n-formbox button[type=submit] {
  display: inline-block; padding: 14px 24px; border: 1px solid var(--n-fg);
  background: var(--n-fg); color: var(--n-bg); border-radius: 0;
  font-family: 'IBM Plex Mono', monospace; font-size: .78rem;
  letter-spacing: .14em; text-transform: uppercase; cursor: pointer;
}
.n-formbox h2, .n-formbox h3 { font-family: Anton, Archivo, sans-serif; font-weight: 400; text-transform: uppercase; }

/* ============================================================
   ENVELOPPE « no scroll » des pages a formulaire / tunnel.
   ⚠️ `height: 100svh` + `overflow-y: auto` : la PAGE ne defile pas, le
   CONTENU defile DEDANS. C'est ce qui permet de convertir /leads, /contact,
   /artisan et /visibilite sans toucher a leurs champs.
   ============================================================ */
.n-formwrap {
  height: 100svh; box-sizing: border-box;
  overflow-y: auto;
  padding: 5.5rem var(--n-pad) 2.5rem;
  scrollbar-width: thin;
}
@media (max-height: 760px) { .n-formwrap { padding: 4.5rem var(--n-pad) 1.6rem; } }
/* les champs herites restent lisibles sur fond blanc */
.n-formwrap input, .n-formwrap select, .n-formwrap textarea {
  border: 1px solid var(--n-rule); background: var(--n-bg); color: var(--n-fg);
  border-radius: 0; font-family: Inter, Archivo, system-ui, sans-serif;
}
.n-formwrap .btn, .n-formwrap button { border-radius: 0; }

/* ============================================================
   BLOC DE PAIEMENT (`.n-pay`) — la carte de commande de /visibilite.
   ⚠️ Le FORMULAIRE n'est pas retouche (action, csrf, email, accept) : seule sa
   presentation change. Il doit rester evident et cliquable en un ecran.
   ============================================================ */
.n-screen--pay { height: 100svh; overflow: hidden; justify-content: flex-start; padding-top: 6.5rem; }
.n-screen--pay .n-title { font-size: clamp(1.5rem, 3.333vw, 3rem); max-width: 26ch; }
.n-screen--pay .n-car { margin-top: .9rem; }
.n-screen--pay .n-car-item { min-width: min(80vw, 260px); padding: .9rem 1rem; }
.n-pay {
  display: flex; align-items: center; gap: 2rem; flex-wrap: wrap;
  margin-top: 1.4rem; padding-top: 1.4rem; border-top: 1px solid var(--n-rule);
}
.n-pay__prix { display: flex; flex-direction: column; gap: .35rem; }
.n-pay__montant { font-family: 'IBM Plex Mono', monospace; font-size: 2.4rem; line-height: 1; }
.n-pay__prix small { font-family: 'IBM Plex Mono', monospace; font-size: .8rem; color: var(--n-dim); }
.n-pay__badge {
  font-family: 'IBM Plex Mono', monospace; font-size: .66rem; letter-spacing: .16em;
  text-transform: uppercase; border: 1px solid var(--n-rule); padding: 5px 9px; color: var(--n-dim);
}
.n-pay__form { flex: 1 1 320px; max-width: 34rem; }
.n-pay__form label { display: block; font-family: 'IBM Plex Mono', monospace; font-size: .7rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--n-dim); margin-bottom: 5px; }
.n-pay__form input[type=email] {
  width: 100%; padding: 12px 14px; margin-bottom: 14px; border: 1px solid var(--n-rule);
  background: var(--n-bg); color: var(--n-fg); border-radius: 0;
  font-family: Inter, Archivo, system-ui, sans-serif; font-size: 1rem;
}
.n-pay__consent { display: flex; gap: .6rem; align-items: flex-start; text-transform: none;
  font-family: Inter, Archivo, system-ui, sans-serif; font-size: .82rem; letter-spacing: 0; color: var(--n-fg); margin: 0 0 14px; }
.n-pay__consent input { margin-top: .25rem; }
.n-pay__tiny { font-family: 'IBM Plex Mono', monospace; font-size: .64rem;
  letter-spacing: .1em; color: var(--n-dim); margin: .7rem 0 0; text-transform: uppercase; }
@media (max-height: 760px) {
  .n-screen--pay { padding-top: 4.8rem; }
  .n-screen--pay .n-sub { font-size: .9rem; }
  .n-pay { margin-top: .9rem; padding-top: .9rem; gap: 1.1rem; }
}
@media (max-height: 620px) {
  .n-screen--pay { padding-top: 4rem; }
  .n-screen--pay .n-car { display: none; }   /* ecran trop court : on garde l'essentiel */
}

/* ===== fin no_scroll.css ===== */

/* ===== début no_scroll_lisibilite.css ===== */
/* ============================================================
   LISIBILITÉ DES PAGES DE CONTENU (2026-10-05, demande du user)
   « rend le tout plus lisible » + « tu as perdu des infos, par exemple les prix ».

   ⚠️ Les prix etaient dans des cartes etroites (min-width 320) a la meme taille
   que le reste. Ici : cartes plus LARGES, prix en gros et en gras, chiffres cles
   en bandeau, listes de villes en colonnes. On augmente la taille ET l'air.
   ============================================================ */

/* ---- BANDEAU DE CHIFFRES CLÉS ---- */
.n-kpi {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1px; margin: 1.4rem 0 0; border: 1px solid var(--n-rule);
}
.n-kpi > div { padding: .9rem 1rem; border-right: 1px solid var(--n-rule); }
.n-kpi > div:last-child { border-right: 0; }
.n-kpi dt {
  font-family: 'IBM Plex Mono', monospace; font-size: .64rem;
  letter-spacing: .14em; text-transform: uppercase; color: var(--n-dim); margin: 0;
}
.n-kpi dd {
  margin: .35rem 0 0; font-family: 'IBM Plex Mono', monospace;
  font-size: 1.5rem; line-height: 1.1;
}
@media (max-width: 760px) { .n-kpi { grid-template-columns: repeat(2, 1fr); } }

/* ---- CARROUSEL DES PRIX : plus large, plus lisible ---- */
.n-car--prix .n-car-item {
  min-width: min(92vw, 380px);
  padding: 1.5rem 1.4rem;
  display: flex; flex-direction: column; justify-content: space-between; gap: .6rem;
}
.n-car--prix .n-car-item h3 { font-size: 1.08rem; line-height: 1.35; margin: 0; }
.n-car--prix .n-prix {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 2rem; font-weight: 500; line-height: 1;
  letter-spacing: -.02em; margin: 0;
}
.n-car--prix .n-prix-unite {
  font-family: 'IBM Plex Mono', monospace; font-size: .68rem;
  letter-spacing: .14em; text-transform: uppercase; color: var(--n-dim); margin: 0;
}

/* ---- ÉCRAN « PRIX » : un peu plus d'air, sans déborder ---- */
.n-screen--prix { justify-content: flex-start; padding-top: 6.5rem; }
.n-screen--prix .n-title { font-size: var(--n-titre); max-width: 30ch; }
.n-screen--prix .n-sub { line-height: 1.7; max-width: 64ch; }

/* ---- DÉTAILS : plusieurs colonnes sur grand écran, empilés sur mobile ---- */
.n-detail--grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: .4rem 1.6rem; max-width: none; margin-top: 1.2rem;
  align-items: start;
}
.n-detail--grid details { border-top: 1px solid var(--n-rule); padding: .7rem 0; }
.n-detail--grid summary {
  cursor: pointer; font-family: 'IBM Plex Mono', monospace; font-size: .72rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--n-fg);
  display: flex; justify-content: space-between; align-items: center;
}
.n-detail--grid summary::after { content: "+"; color: var(--n-dim); font-size: 1rem; }
.n-detail--grid details[open] summary::after { content: "–"; }
.n-detail--grid p { font-size: .95rem; line-height: 1.7; margin: .7rem 0 0; }

/* ---- LISTES DE VILLES / MÉTIERS : colonnes compactes ---- */
.n-villes {
  list-style: none; padding: 0; margin: .7rem 0 0;
  columns: 2; column-gap: 1.4rem; font-size: .92rem;
}
.n-villes li { break-inside: avoid; padding: .18rem 0; }
.n-villes a { color: var(--n-fg); text-decoration: none; }
.n-villes a:hover { text-decoration: underline; }
@media (max-width: 560px) { .n-villes { columns: 1; } }

/* ---- lisibilité générale des pages de contenu ---- */
.n-screen--prix .n-sub, .n-lecture__corps, .n-formwrap { line-height: 1.7; }
.n-detail summary { line-height: 1.5; }

/* ===== fin no_scroll_lisibilite.css ===== */

/* ===== début no_scroll_dimension.css ===== */
/* ============================================================
   REDIMENSIONNEMENT (2026-10-05) — « redimensionne correctement ».

   ⚠️⚠️ DEUX DEFAUTS MESURES, corriges ici.

   1. LE CONTENU N'OCCUPAIT QUE ~640 px SUR 1440 : 740 px vides a droite, tout
      tasse a gauche (max-width en `ch` trop serres). -> enveloppe de lecture
      centree (1180 px max), liste d'arguments sur deux colonnes.

   2. LES TITRES ETAIENT INCOHERENTS : l'accueil a 48 px, les pages de contenu a
      66 px, /visibilite a 56 px. Trois valeurs pour la MEME fonction.
      -> UNE SEULE echelle, en trois niveaux explicites.

   ⚠️ `!important` est necessaire : `/visibilite`, `/leads`, `/contact` et
   `/artisan` chargent encore l'ancienne feuille `devisaly.css` (via `_head.html`,
   dont elles ont besoin pour le CSRF et le service worker). Cette feuille pose
   `h1 { font-size: 56px !important }`, qui gagnerait sans `!important`.
   ============================================================ */

/* ---- 1. L'ENVELOPPE : largeur de lecture, centree ---- */
.n-screen, .n-lecture, .n-formwrap {
  padding-left: max(var(--n-pad), calc((100% - 1180px) / 2));
  padding-right: max(var(--n-pad), calc((100% - 1180px) / 2));
}

/* ---- 2. L'ECHELLE DES TITRES — CALIBREE SUR LA REFERENCE ----
   ⚠️⚠️ LA MESURE DE LA REFERENCE (absurdventures.com) : son titre fait ~48 px a
   1440 (`clamp(1.5rem, 3.333vw, 4rem)`) ET ~46,8 px a 390 (surcharge mobile
   `clamp(38px, 12vw, 66px)`). Autrement dit : la MEME taille sur mobile et sur
   ordinateur. C'est ce qui donne a la reference sa coherence.
   ⚠️ Mon premier jet etait a 96 px (deux fois trop gros), puis 63 px (encore
   +31 %). On se cale sur la reference : ~43 px mobile, 48 px desktop.
   ⚠️ `!important` necessaire : `/visibilite`, `/leads`, `/contact` et `/artisan`
   chargent encore `devisaly.css` (pour le CSRF et le service worker), qui pose
   `h1 { font-size: 56px !important }`. */

/* titres principaux : accueil, logiciel-devis, tarifs, visibilite, comment,
   resultats, a-propos, contact, blog, CGV, confidentialite, mentions */
.n-title,
.n-screen .n-title,
.n-screen--accueil .n-title,
.n-screen--pay .n-title,
.n-lecture .n-title {
  font-size: clamp(2rem, 11vw, 3.4rem) !important;   /* ~43px a 390 */
  line-height: 1.08 !important;
  letter-spacing: -.012em;
  max-width: none;
  padding: .06em 0 .04em !important;                 /* place pour Anton */
}
@media (min-width: 900px) {
  .n-title,
  .n-screen .n-title,
  .n-screen--accueil .n-title,
  .n-screen--pay .n-title,
  .n-lecture .n-title {
    font-size: clamp(2.4rem, 3.333vw, 3rem) !important;  /* 48px a 1440 = reference */
  }
}

/* pages de contenu (prix, services, devis) : un cran plus petit, le titre
   partage l'ecran avec un carrousel et un bandeau de chiffres */
.n-screen--serre .n-title,
.n-screen--prix .n-title {
  font-size: clamp(1.7rem, 8.4vw, 2.6rem) !important;   /* ~33px a 390 */
  line-height: 1.1 !important;
}
@media (min-width: 900px) {
  .n-screen--serre .n-title,
  .n-screen--prix .n-title {
    font-size: clamp(1.9rem, 2.6vw, 2.4rem) !important; /* ~37px a 1440 */
  }
}

/* ---- 3. SOUS-TITRE : largeur de lecture ---- */
.n-sub { max-width: 62ch; }

/* ---- 4. LISTE D'ARGUMENTS : deux colonnes sur grand ecran ---- */
@media (min-width: 1000px) {
  .n-screen ul.n-sub { columns: 2; column-gap: 2.6rem; max-width: none; }
  .n-screen ul.n-sub li { break-inside: avoid; }
}

/* ---- 5. BLOC DE PAIEMENT /visibilite : mieux reparti ---- */
.n-pay { align-items: flex-start; justify-content: space-between; }
.n-pay__prix { flex: 0 0 auto; min-width: 12rem; }
.n-pay__form { flex: 1 1 420px; max-width: 40rem; }

/* ---- 6. PETITS ECRANS COURTS : on resserre, on ne rogne jamais ---- */
@media (max-height: 760px) {
  .n-screen { padding-top: 5.5rem; padding-bottom: 1.4rem; }
  .n-screen ul.n-sub { margin-top: .8rem; }
  .n-screen ul.n-sub li { padding: .38rem 0; font-size: .9rem; }
  .n-screen .n-cta { margin-top: .9rem; }
  .n-screen--serre .n-car-item { padding: .8rem .8rem; }
}
@media (max-height: 620px) {
  .n-title, .n-screen .n-title, .n-screen--accueil .n-title,
  .n-screen--pay .n-title, .n-lecture .n-title { font-size: 1.5rem !important; }
  .n-screen--serre .n-title, .n-screen--prix .n-title { font-size: 1.3rem !important; }
  .n-screen ul.n-sub li { padding: .28rem 0; font-size: .84rem; }
}


/* ============================================================
   7. LE CONTENU DEFILE DANS L'ECRAN (pages riches, petits ecrans)
   ⚠️ Mesure : /prix/plomberie/69 a 390px = 1 269 px de contenu pour 844 px
   d'ecran. Forcer tout dans l'ecran rendrait illisible. On borne donc la
   section a l'ecran (`height`), et c'est son contenu qui defile DEDANS
   (`overflow-y: auto`) — exactement le motif du mode lecture.
   Resultat : `document.scrollHeight == innerHeight` sur toute page.
   ============================================================ */
@media (max-height: 900px) {
  .n-screen--serre,
  .n-screen--prix {
    height: 100svh;
    min-height: 0;
    overflow-y: auto;
    justify-content: flex-start;
    padding-bottom: 2rem;
    scrollbar-width: thin;
  }
}
@media (max-height: 760px) {
  .n-screen { height: 100svh; min-height: 0; overflow-y: auto; scrollbar-width: thin; }
  .n-lecture__corps { margin-top: 1rem; padding-top: 1rem; }
}

/* ============================================================
   8. RESERVE DE PLACE POUR LE TITRE (Anton dessine hors des glyphes)
   ⚠️ Rognage mesure sur /visibilite : `scrollHeight` > hauteur de la boite.
   Anton a une hauteur de glyphe superieure a son interligne ; le trait et les
   jambages debordent de la boite de ligne. On reserve la place en padding.
   ============================================================ */
.n-title { padding: .06em 0 .04em !important; line-height: 1.1 !important; }
@media (max-height: 620px) { .n-title { line-height: 1.12 !important; } }

/* ============================================================================
   ⚠️⚠️ CORRECTION DU ROGNAGE DES TITRES « n- » (2026-10-10)

   Anton a une boîte de glyphe de **1.5 em**. Avec un interligne de 1.1 em, le
   haut des lettres sort de la boîte : mesuré, glyphe 64 px dans une boîte de
   57 px (page « mentions légales »), et 50 px dans 45 px (page blog).

   ⚠️ POURQUOI ICI, ET PAS DANS `anton-rognage.css`. Le monde `n-` (accueil,
   tarifs, blog, CGV, mentions, résultats) utilise son PROPRE gabarit de tête :
   il ne charge **jamais** `anton-rognage.css`. La correction posée là-bas
   n'avait donc aucun effet sur ces pages — c'est mesuré, pas supposé.

   ⚠️ POURQUOI LA DOUBLE SÉLECTIVITÉ. `no_scroll_dimension.css` porte plus haut
   `.n-screen .n-title { line-height: 1.08 !important }` (deux classes) et
   `.n-screen--serre .n-title { 1.1 !important }`. Un simple `.n-title` (une
   classe) perdrait contre eux. Même spécificité + règle plus BAS dans le même
   fichier = c'est la nôtre qui gagne.
   ============================================================================ */
.n-title,
.n-screen .n-title,
.n-screen--serre .n-title,
.n-screen--prix .n-title,
.n-screen--accueil .n-title,
.n-lecture .n-title,
.n-screen--exemples .n-title {
  line-height: 1.30 !important;
  padding: .14em 0 !important;
}
@media (max-height: 620px) {
  .n-title, .n-screen .n-title, .n-screen--serre .n-title { line-height: 1.32 !important; }
}
/* Titres de cartes d'exemple (« Plombier », « Électricien »…) : même police,
   même défaut, à plus petite échelle (glyphe 23 px dans une boîte de 20 px). */
.n-ex__titre, .n-bloc__titre, .n-etape__titre {
  line-height: 1.38 !important;
  padding: .1em 0 !important;
}
/* Le prix d'une formule (« Sur devis », « 0 €/mois ») : même piège, même
   correction. Mesuré sur /pricing après ajout du bandeau d'audit SEO. */
.n-plan__prix {
  line-height: 1.42 !important;
  padding: .08em 0 !important;
}
/* Le montant mis en avant sur /visibilite (« 129,90 € »). Même piège : un span
   de prix en police display, dont la boîte est plus petite que son glyphe. */
.n-pay__montant, .n-pay__prix, .n-prix {
  line-height: 1.42 !important;
  padding: .08em 0 !important;
}

/* ============================================================
   9. LES BLOCS REPLIES : un peu d'air, et jamais colles au bord
   ============================================================ */
.n-detail--grid details { padding: .8rem 0 !important; }
.n-detail--grid details:last-child { margin-bottom: 1rem; }
.n-car { scrollbar-width: thin; }
.n-screen--serre .n-car, .n-screen--prix .n-car { margin-bottom: .3rem; }


/* ============================================================
   10. LE MOTIF UNIQUE : L'ECRAN TIENT DANS LE VIEWPORT, LE CONTENU DEFILE
       DEDANS (2026-10-05).

   ⚠️⚠️ POURQUOI C'EST LE BON MOTIF, ET PAS UN « ECRAN QUI TIENT TOUJOURS ».
   Mesure : sur un 390x844, `/visibilite` fait 971 px de contenu (127 px rognes,
   invisibles), `/logiciel-devis` 928 px, `/prix/plomberie/69` 1 269 px. Forcer
   tout dans l'ecran rendrait le texte illisible ; laisser la page defiler
   contredit le « no scroll ».

   Le motif qui resout les deux : `height: 100svh` (la SECTION fait exactement
   l'ecran) + `overflow-y: auto` (son contenu defile a l'interieur). Resultat :
   `document.scrollHeight == innerHeight` sur TOUTES les pages — verifie — et
   aucun contenu rogne ni illisible.
   ⚠️ `height` et NON `min-height` : avec `min-height` la section grandit avec le
   contenu et c'est la page entiere qui defile (bug deja rencontre deux fois).
   ============================================================ */
.n-screen,
.n-screen--serre,
.n-screen--prix,
.n-screen--pay,
.n-screen--accueil {
  height: 100svh;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  scrollbar-width: thin;
  overscroll-behavior: contain;
  justify-content: flex-start;
}
/* l'accueil : son contenu TIENT dans l'ecran, on le laisse centre */
.n-screen--accueil { justify-content: center; }
@media (max-height: 900px) {
  .n-screen--accueil { justify-content: center; padding-top: 5rem; }
}
/* la barre fixe : on lui reserve la place en haut du contenu qui defile */
.n-screen { padding-top: max(5.5rem, 9vh); }
@media (max-height: 620px) { .n-screen { padding-top: 4.2rem; } }

/* ===== fin no_scroll_dimension.css ===== */

/* ===== début no_scroll_couleur.css ===== */
/* ============================================================
   COULEUR — l'or de la marque sur le site public (2026-10-06).
   Chargee EN DERNIER par les gabarits `n-`.

   ⚠️⚠️ POURQUOI CE FICHIER. La refonte blanche avait pour règle « aucune
   couleur d'accent, comme la référence [absurdventures] ». Le site en est
   devenu fade : tout en noir sur blanc. Demande du user : « ajoute de la
   couleur au site c'est trop fade ».

   ⚠️ On réintroduit l'or DU LOGO (#C8A24A), en trois valeurs dont les
   contrastes sont MESURÉS sur blanc (#ffffff) — pas estimés :
       --n-or        #b8892e   3,16:1   aplats, traits, gros chiffres (>= 24 px)
       --n-or-texte  #8a6a2a   5,03:1   texte fin, et encré des boutons or
       --n-or-pale   #f3ead6   1,20:1   fonds très légers (bandeaux, cartes)
   ⚠️ L'or vif #c8a24a (2,41:1) reste réservé aux APLATS : jamais sur du texte
   courant. C'est la règle de `refonte_blanche.css`, on l'applique ici.

   ⚠️ Aucune règle ne cible une classe de l'ancien thème : uniquement `n-`.
   ============================================================ */

/* ---- L'ÉTIQUETTE DE HAUT DE PAGE : un filet or, pas un trait gris ---- */
.n-kicker {
  color: var(--n-or-texte);
}
.n-kicker::before {
  content: "";
  display: inline-block; vertical-align: middle;
  width: 26px; height: 2px; margin-right: 10px;
  background: var(--n-or);
}

/* ---- LE FILET SOUS LA BARRE : discret, or pâle ---- */
/* ⚠️ NEUTRALISE (2026-10-06) : le site interdit les DEGRADES. Le fond de
   barre est desormais un simple aplat, pose par no_scroll_barre.css. */
.n-head { background: none; }
.n-logo b span { color: var(--n-or-texte); }
.n-menu-btn:hover { color: var(--n-or-texte); }

/* ---- LES BOUTONS : l'action principale garde l'encre, la SECONDAIRE passe à
   l'or quand elle mène à une demande de devis. ---- */
.n-btn { border: 1px solid var(--n-fg); }
.n-btn:hover { background: var(--n-or-texte); border-color: var(--n-or-texte); color: #fff; }
.n-btn--or {
  background: var(--n-or-texte); color: #fff; border-color: var(--n-or-texte);
}
.n-btn--or:hover { background: var(--n-fg); border-color: var(--n-fg); color: #fff; }
.n-btn-ghost:hover { background: var(--n-or-pale); border-color: var(--n-or); color: var(--n-or-texte); }

/* ---- LE MENU : l'entrée survolée prend l'or, le pied aussi ---- */
.n-menu a.n-link:hover { color: var(--n-or-texte); }
.n-menu-foot a:hover { color: var(--n-or-texte); }
.n-menu-group { color: var(--n-or-texte); }

/* ---- LES CHIFFRES CLÉS (accueil) : la valeur en or, comme un repère ---- */
.n-facts dd { color: var(--n-fg); }
.n-facts > div:first-child dd { color: var(--n-or-texte); }

/* ---- LES CARTES DE PRIX / DE PRESTATION : filet or pâle, jamais gris ---- */
.n-car-item { border-right: 1px solid var(--n-or-ligne); }
.n-car { border: 1px solid var(--n-or-ligne); }
.n-car-label { color: var(--n-or-texte); }

/* ---- L'ACCROCHE : le mot mis en avant prend l'or (au lieu du contour noir) ---- */
.n-title .n-or { color: var(--n-or); }
.n-title .n-outline { -webkit-text-stroke: 1.4px var(--n-or); color: transparent; }

/* ============================================================
   LA GRILLE DE TARIFS — trois offres, un écran.
   ⚠️ Sur desktop : 3 colonnes. Sur mobile : carrousel natif (meme motif que le
   reste du site) — on n'empile pas 3 cartes, ça ne tiendrait pas.
   ============================================================ */
.n-plans {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px; margin-top: 1.6rem;
  border: 1px solid var(--n-or-ligne); background: var(--n-or-ligne);
}
.n-plan {
  background: var(--n-bg); padding: 1.5rem 1.4rem;
  display: flex; flex-direction: column; gap: .7rem;
}
.n-plan__nom {
  font-family: 'IBM Plex Mono', monospace; font-size: .66rem;
  letter-spacing: .2em; text-transform: uppercase; color: var(--n-or-texte);
  margin: 0;
}
.n-plan__titre { font-size: 1.25rem; line-height: 1.2; margin: 0; }
.n-plan__prix {
  font-family: 'IBM Plex Mono', monospace; font-size: 2rem;
  line-height: 1; letter-spacing: -.02em; margin: .2rem 0 0;
}
.n-plan__prix small { font-size: .7rem; color: var(--n-dim); letter-spacing: .06em; }
.n-plan__liste { list-style: none; padding: 0; margin: .5rem 0 0; font-size: .92rem; }
.n-plan__liste li { padding: .32rem 0; border-top: 1px solid var(--n-rule); }
.n-plan__pied { margin-top: auto; padding-top: 1rem; }
.n-plan__pied .n-btn { display: block; text-align: center; width: 100%; }

/* l'offre mise en avant : bandeau or, contraste net */
.n-plan--phare { background: var(--n-or-pale); }
.n-plan--phare .n-plan__titre { color: var(--n-fg); }
.n-plan__badge {
  align-self: flex-start;
  font-family: 'IBM Plex Mono', monospace; font-size: .6rem;
  letter-spacing: .16em; text-transform: uppercase;
  background: var(--n-or-texte); color: #fff; padding: 4px 8px;
}

/* l'offre « sur devis » : pas de prix affiché, on vend le principe */
.n-plan__note {
  font-family: 'IBM Plex Mono', monospace; font-size: .68rem;
  letter-spacing: .08em; color: var(--n-dim); margin: .35rem 0 0;
}

/* ============================================================
   /pricing : LA GRILLE COMPLÈTE TIENT DANS L'ÉCRAN.
   ⚠️ Mesure avant correction : 73 px de débordement sur 1440x900 (3 cartes +
   bandeau de CTA + FAQ repliée). Comme le motif du site est « la section fait
   l'écran, son contenu défile dedans », on resserre la grille sur les écrans
   de hauteur moyenne au lieu de rogner : c'est la même règle que `.n-screen`.
   ============================================================ */
.n-screen--prix { justify-content: flex-start; padding-top: 5.5rem; }
@media (max-height: 900px) {
  .n-plans { margin-top: 1rem; }
  .n-plan { padding: 1.1rem 1.1rem; gap: .45rem; }
  .n-plan__titre { font-size: 1.08rem; }
  .n-plan__prix { font-size: 1.65rem; margin-top: .1rem; }
  .n-plan__note { font-size: .62rem; margin-top: .2rem; }
  .n-plan__liste { font-size: .84rem; margin-top: .3rem; }
  .n-plan__liste li { padding: .22rem 0; }
  .n-plan__pied { padding-top: .7rem; }
  .n-screen--prix .n-cta { margin-top: 1rem; }
  .n-screen--prix .n-detail { margin-top: .7rem; }
}

@media (max-width: 900px) {
  /* carrousel natif : 3 offres, défilement horizontal au doigt, sans JS */
  .n-plans {
    display: flex; gap: 1px; overflow-x: auto;
    scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
    scrollbar-width: thin; padding-bottom: 2px;
  }
  .n-plan { flex: 0 0 auto; min-width: min(84vw, 320px); scroll-snap-align: start; }
  /* ⚠️⚠️ L'OFFRE PHARE PASSE EN PREMIER sur mobile. Mesure : à 390 px, seule la
     première carte est visible à l'ouverture — si c'est le logiciel gratuit, le
     visiteur ne voit JAMAIS l'offre à 129,90 €, qui est celle qu'on vend. On
     remonte donc l'offre recommandée en tête du carrousel. */
  .n-plan--phare { order: -1; }
}

/* l'indication de défilement, comme partout ailleurs sur le site */
.n-plans-label { display: none; }
@media (max-width: 900px) {
  .n-plans-label {
    display: block; margin: 1.2rem 0 0;
    font-family: 'IBM Plex Mono', monospace; font-size: .68rem;
    letter-spacing: .18em; text-transform: uppercase; color: var(--n-or-texte);
  }
}
@media (max-height: 760px) {
  .n-plan { padding: 1.1rem 1rem; gap: .5rem; }
  .n-plan__titre { font-size: 1.1rem; }
  .n-plan__prix { font-size: 1.7rem; }
  .n-plan__liste { font-size: .86rem; }
  .n-plans { margin-top: 1rem; }
}

/* ============================================================
   LE DEVIS CONSULTABLE EN LIGNE (`shared_quote.html`) — 2026-10-06.
   ⚠️ Meme identite que le site : Anton pour les titres, Inter pour le texte,
   or pour les accents, angles droits, zero ombre. L'ancien gabarit affichait un
   bandeau DEGRADE dore qui ne ressemblait a rien du site que le client venait
   de voir.
   ============================================================ */
.n-screen--doc { padding-top: 5.5rem; }
.n-doc {
  margin-top: 1.4rem; border: 1px solid var(--n-or-ligne);
  background: var(--n-bg);
}
.n-doc__entete {
  display: flex; justify-content: space-between; align-items: flex-end;
  gap: 1rem; padding: 1.1rem 1.3rem;
  background: var(--n-or-pale); border-bottom: 1px solid var(--n-or-ligne);
}
.n-doc__titre { font-family: Anton, Archivo, sans-serif; font-size: 1.4rem;
  text-transform: uppercase; letter-spacing: -.01em; color: var(--n-fg); line-height: 1.15; }
.n-doc__sous { font-family: 'IBM Plex Mono', monospace; font-size: .66rem;
  letter-spacing: .14em; text-transform: uppercase; color: var(--n-or-texte); margin-top: .3rem; }
.n-doc__num { font-family: 'IBM Plex Mono', monospace; font-size: .78rem;
  letter-spacing: .2em; color: var(--n-fg); }
.n-doc__note { font-size: .82rem; color: var(--n-dim); margin: .9rem 1.3rem 0;
  white-space: pre-line; line-height: 1.6; }

.n-doc__table { width: 100%; border-collapse: collapse; margin-top: .9rem; }
.n-doc__table th {
  text-align: left; padding: .7rem 1.3rem;
  font-family: 'IBM Plex Mono', monospace; font-size: .62rem;
  letter-spacing: .16em; text-transform: uppercase; color: var(--n-or-texte);
  border-bottom: 1px solid var(--n-or-ligne);
}
.n-doc__table th.num, .n-doc__table td.num { text-align: right; }
.n-doc__table td { padding: .7rem 1.3rem; border-bottom: 1px solid var(--n-rule);
  font-size: .92rem; vertical-align: top; }
.n-doc__label { display: block; }
.n-doc__detail { display: block; font-size: .72rem; color: var(--n-dim); margin-top: .15rem; }
.n-doc__prix { font-family: 'IBM Plex Mono', monospace; }

.n-doc__totaux { padding: 1rem 1.3rem 1.2rem; }
.n-doc__ligne { display: flex; justify-content: space-between; gap: 1rem;
  padding: .35rem 0; font-size: .95rem; color: var(--n-fg); }
.n-doc__ligne span:last-child { font-family: 'IBM Plex Mono', monospace; }
.n-doc__ligne--grand {
  margin-top: .4rem; padding: .8rem 1rem; background: var(--n-or-pale);
  border: 1px solid var(--n-or-ligne);
  font-family: Anton, Archivo, sans-serif; text-transform: uppercase;
  letter-spacing: -.005em; font-size: 1.1rem;
}
.n-doc__ligne--grand span:last-child { font-family: 'IBM Plex Mono', monospace;
  color: var(--n-or-texte); font-size: 1.25rem; }
.n-doc__message { margin: 0 1.3rem 1.2rem; font-size: .88rem; color: var(--n-dim);
  line-height: 1.6; font-style: italic; }
.n-doc__pied { margin-top: 1.2rem; text-align: center;
  font-family: 'IBM Plex Mono', monospace; font-size: .64rem;
  letter-spacing: .14em; text-transform: uppercase; color: var(--n-dim); }

@media (max-width: 600px) {
  .n-doc__entete { flex-direction: column; align-items: flex-start; }
  .n-doc__table th, .n-doc__table td { padding: .6rem .8rem; }
  .n-doc__table th:nth-child(3), .n-doc__table td:nth-child(3) { display: none; }
  .n-doc__note, .n-doc__message { margin-left: .8rem; margin-right: .8rem; }
  .n-doc__totaux { padding: .9rem .8rem 1rem; }
}

/* ============================================================
   LES EXEMPLES DE SITES — /resultats (2026-10-06).

   ⚠️ Demande du user : « dans la section resultats integre plein d'exemples de
   site web ». Chaque exemple est une CAPTURE d'un site d'artisan fictif, rendu
   depuis le vrai gabarit du produit : ce que le visiteur voit est ce que le
   produit genere.

   ⚠️ Contraintes du site : angles droits, AUCUNE ombre, aucun degrade, zero
   emoji. Une capture d'ecran n'a donc qu'un filet pour la separer du fond.
   ============================================================ */
.n-car--exemples { align-items: stretch; }
.n-car--exemples .n-ex {
  /* ⚠️⚠️ LARGEUR EXPLICITE, PAS SEULEMENT `min-width`.
     Meme piege que les cartes d'offres : `.n-car-item` porte `flex: 0 0 auto`,
     donc la largeur suit le CONTENU — ici l'image, large de 1000 px. Les cartes
     mesuraient **1001 px** et debordaient de l'ecran avant ce correctif.
     `min-width` n'est qu'un plancher : il faut `width`. */
  flex: 0 0 auto;
  /* ⚠️⚠️ DEUX CARTES PLEINES, PAS DEUX ET DEMIE (corrige 2026-10-06).
     Le user a signale « un manque de symetrie ». Mesure : le carrousel fait
     1180 px et les cartes 460 px -> 2 cartes pleines (920) + une 3e COUPEE de
     260 px. Cette 3e carte tronquee desalignait tout et donnait l'impression
     d'un bloc casse.
     On demande donc EXACTEMENT 2 cartes : la largeur se calcule sur celle du
     carrousel, moins le filet de separation (1 px, `gap` de `.n-car`).
     `min-width: 0` reste indispensable pour que le texte se replie DANS la
     carte au lieu de l'elargir. */
  width: calc((100% - 1px) / 2);
  min-width: 0;
  padding: 0;                      /* l'image touche les bords de la carte */
  display: flex; flex-direction: column;
}
.n-ex__visuel {
  border-bottom: 1px solid var(--n-or-ligne);
  background: var(--n-or-pale);
  line-height: 0;                  /* supprime l'espace sous l'image */
}
.n-ex__visuel img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 16 / 10; object-fit: cover; object-position: top center;
}
.n-ex__corps { padding: 1rem 1.1rem 1.2rem; display: flex; flex-direction: column; flex: 1; }
.n-ex__variante {
  font-family: 'IBM Plex Mono', monospace; font-size: .62rem;
  letter-spacing: .16em; text-transform: uppercase; color: var(--n-or-texte);
  margin: 0 0 .5rem;
}
.n-ex__titre {
  font-family: Anton, Archivo, sans-serif; font-weight: 400;
  font-size: 1.15rem; line-height: 1.2; text-transform: uppercase;
  letter-spacing: -.01em; margin: 0; color: var(--n-fg);
}
.n-ex__meta {
  font-size: .78rem; color: var(--n-dim); margin: .35rem 0 0;
}
.n-ex__pourquoi {
  font-size: .88rem; line-height: 1.5; color: var(--n-fg);
  margin: .7rem 0 0; padding-top: .7rem; border-top: 1px solid var(--n-rule);
}

/* ⚠️ La page porte desormais un CARROUSEL d'images : la section doit tenir dans
   l'ecran (« no scroll »). Le carrousel lui-meme defile horizontalement. */
.n-screen--exemples { justify-content: flex-start; padding-top: 76px; }
.n-screen--exemples .n-title { font-size: clamp(1.6rem, 3.2vw, 2.2rem); max-width: 26ch; }
.n-screen--exemples .n-sub { margin-top: .8rem; max-width: 74ch; }
.n-screen--exemples .n-car { margin-top: 1rem; }
.n-screen--exemples .n-cta { margin-top: 1.2rem; }

/* ⚠️ COMMANDES DU CARROUSEL D'EXEMPLES (2026-10-06).
   La tête aligne le libellé à gauche et les commandes à droite. Contrairement
   au carrousel des prix (commandes masquées sur grand écran car les 3 offres y
   tiennent), ici les 6 exemples ne tiennent JAMAIS côte à côte : les commandes
   restent visibles à TOUTES les tailles. */
.n-ex-tete {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin: 1.6rem 0 0; flex-wrap: wrap;
}
.n-ex-tete .n-car-label { margin: 0; }
.n-ex-commandes { display: flex; align-items: center; gap: 14px; }
.n-ex-commandes .n-fleche {
  width: 40px; height: 40px; flex: none;
  display: grid; place-items: center;
  background: transparent; color: var(--n-fg);
  border: 1px solid var(--n-rule); border-radius: 0;
  font-family: 'IBM Plex Mono', monospace; font-size: 15px; line-height: 1; cursor: pointer;
  transition: background-color .15s, color .15s, border-color .15s;
}
.n-ex-commandes .n-fleche:hover { background: var(--n-fg); color: #fff; border-color: var(--n-fg); }
.n-ex-commandes .n-fleche:disabled { opacity: .3; cursor: default; }
.n-ex-commandes .n-fleche:disabled:hover { background: transparent; color: var(--n-fg); border-color: var(--n-rule); }
.n-ex-commandes .n-pastilles { display: flex; align-items: center; gap: 9px; }
.n-ex-commandes .n-pastille {
  width: 10px; height: 10px; padding: 0; flex: none;
  background: transparent; border: 1px solid var(--n-or-texte); border-radius: 0;
  cursor: pointer; transition: background-color .15s;
}
.n-ex-commandes .n-pastille[aria-current="true"] { background: var(--n-or); border-color: var(--n-or); }
@media (max-height: 760px) {
  .n-screen--exemples { padding-top: 64px; }
  .n-screen--exemples .n-title { font-size: clamp(1.35rem, 5.4vw, 1.7rem); }
  .n-screen--exemples .n-sub { font-size: .88rem; margin-top: .55rem; }
  .ex__sep { display: none; }
  .n-ex__corps { padding: .75rem .85rem .9rem; }
  .n-ex__pourquoi { font-size: .82rem; margin-top: .5rem; padding-top: .5rem; }
  .n-screen--exemples .n-cta { margin-top: .8rem; }
}

/* ⚠️⚠️ LE CARROUSEL ETAIT COMPRIME VERTICALEMENT (2026-10-06).
   Mesure a 320x568 : la carte mesurait **129 px de haut** alors que son contenu
   (image 176 + corps 155) en demandait **331**. Les enfants debordaient donc
   hors de la carte.

   CAUSE : identique a celle des cartes d'offres. `.n-screen` est une colonne
   flex ; `.n-car` en est un enfant SANS `flex-shrink: 0`, donc le navigateur le
   RETRECIT pour faire tenir le tout — au lieu de laisser la section defiler.

   CORRECTIF : `flex-shrink: 0` sur le carrousel (il garde sa hauteur naturelle),
   et `align-items: flex-start` pour qu'une carte ne soit pas etiree a la hauteur
   d'une autre plus longue. C'est la SECTION qui defile, conformement au motif
   « no scroll » du site. */
.n-screen > .n-car,
.n-screen > .n-plans {
  flex-shrink: 0;
}
.n-car--exemples { align-items: flex-start; }

/* ⚠️ Le lien « Ouvrir le site » de chaque exemple (2026-10-06) : discret mais
   cliquable, dans le langage du site (encre + soulignement or). */
.n-ex__ouvrir {
  display: inline-block; margin-top: .8rem; align-self: flex-start;
  font-family: 'IBM Plex Mono', monospace; font-size: .66rem;
  letter-spacing: .16em; text-transform: uppercase;
  color: var(--n-or-texte); text-decoration: none;
  border-bottom: 1px solid var(--n-or-ligne); padding-bottom: 2px;
  transition: color .15s, border-color .15s;
}
.n-ex__ouvrir:hover { color: var(--n-fg); border-color: var(--n-fg); }
/* le visuel entier est cliquable : on le signale */
.n-ex__visuel { display: block; cursor: pointer; }
.n-ex__visuel:hover img { opacity: .92; }
.n-ex__visuel img { transition: opacity .18s; }

/* ⚠️ SUR MOBILE : UNE carte pleine, pas « une et demie ».
   Meme raisonnement que pour le PC : une carte tronquee cree un desequilibre.
   A moins de 900 px, une carte occupe donc toute la largeur du carrousel, et le
   libelle « faites glisser » porte l'indication qu'il y en a d'autres. */
@media (max-width: 900px) {
  .n-car--exemples .n-ex { width: 100%; }
}

/* ===== fin no_scroll_couleur.css ===== */

/* ===== début no_scroll_offres.css ===== */
/* ============================================================
   ⚠️⚠️ LES OFFRES SORTAIENT DE L'ÉCRAN SUR MOBILE (2026-10-06).

   DÉFAUT MESURÉ. Dans le carrousel (≤ 900 px), `.n-plan` portait
   `flex: 0 0 auto` + `min-width: min(84vw, 320px)`. Or `flex-basis: auto` fait
   que la largeur suit le CONTENU, et `min-width` n'est qu'un PLANCHER :
   une carte au texte long devenait donc PLUS LARGE que le min-width.

     viewport   carte « Logiciel »   carte « Visibilité »   carte « Projet »
      390px          320px                450px                 681px
      768px          320px                525px                 792px

   Résultat : la carte affichée était coupée à droite, et les deux autres
   commençaient à x=476 et x=797 sur un écran de 390 px — donc invisibles.
   L'utilisateur ne voyait qu'UNE offre sur trois (signalement : « les offres
   n'apparaissent plus sur le site mobile »).

   CORRECTIF. On donne une largeur EXPLICITE (et bornée) à la carte, et
   `min-width: 0` pour que le contenu puisse se replier à l'intérieur au lieu
   d'élargir boîte. Les trois offres sont alors accessibles par glissement, à
   largeur constante.

   ⚠️ Ne pas revenir à `flex: 0 0 auto` sans `width` : c'est le dimensionnement
   sur le contenu qui casse tout.
   ============================================================ */
@media (max-width: 900px) {
  .n-plans {
    display: flex;
    gap: 1px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
    padding-bottom: 2px;
  }
  .n-plan {
    flex: 0 0 auto;
    /* ⚠️⚠️ LARGEUR = « la carte laisse DÉPASSER la suivante ». Le user a
       signalé DEUX FOIS ne pas voir les offres. Mesure : avec une carte de
       335 px dans un conteneur de 342 px, la carte suivante ne dépassait que de
       **7 px** — invisible, donc rien n'indiquait qu'il y en avait d'autres.
       On garde donc une carte plus étroite que le conteneur (il reste ~64 px) :
       l'offre suivante se voit à droite, et le carrousel s'explique tout seul.
       ⚠️ Largeur FIXE (pas déduite du contenu) + `min-width: 0` pour que le
       texte se replie DANS la carte au lieu de l'élargir (cf. le bug d'origine).
       ⚠️ Plafond 340 px : sur tablette on évite des cartes démesurées. */
    width: min(calc(100% - 64px), 340px);
    min-width: 0;
    scroll-snap-align: start;
  }
  /* L'offre phare passe en tête : à l'ouverture, seule la 1re carte est vue. */
  .n-plan--phare { order: -1; }
}

/* ============================================================
   ⚠️⚠️ LES OFFRES ÉTAIENT ÉCRASÉES SUR PETIT ÉCRAN (2026-10-06).

   MESURE. À 320x568, chaque carte d'offre ne faisait plus que **35 px de haut**
   (au lieu de ~180), alors que ses enfants restaient comptés « visibles » : ils
   étaient en réalité COMPRIMÉS.

   CAUSE. `.n-screen` est une colonne flex (`display: flex; flex-direction:
   column`) et `.n-plans` en est un enfant SANS `flex-shrink: 0`. Quand la place
   manque (petit écran), le navigateur RÉTRÉCIT donc `.n-plans` pour faire tenir
   le tout — au lieu de laisser la section défiler. Le contenu des cartes est
   alors écrasé, et comme la section ne déborde plus (`scrollHeight ==
   clientHeight`), l'utilisateur ne peut même pas faire défiler pour lire.

   CORRECTIF. `.n-plans` garde sa hauteur naturelle (`flex-shrink: 0`) : c'est la
   SECTION qui défile, conformément au motif « no scroll » du site (la section
   fait l'écran, son contenu défile dedans). Les offres restent lisibles.
   ============================================================ */
.n-screen > .n-plans,
.n-screen--prix > .n-plans {
  flex-shrink: 0;
}

/* ⚠️ La note des offres tombait a 9,9 px sur mobile (regle `max-height: 760px`
   de `no_scroll_couleur.css`) : illisible. On la remonte, y compris sur les
   petits ecrans — une mention « apercu avant paiement » doit se lire. */
.n-plan__note {
  font-size: .74rem;
  line-height: 1.5;
  color: var(--n-dim);
}
@media (max-height: 760px) {
  .n-plan__note { font-size: .72rem; margin-top: .3rem; }
}

/* ============================================================
   COMMANDES DU CARROUSEL DES PRIX (2026-10-06).

   ⚠️⚠️ POURQUOI CES COMMANDES. Le carrousel natif existait deja (scroll-snap)
   mais RIEN n'indiquait qu'on pouvait glisser : a 390 px, seule l'offre phare
   etait entierement visible, et il y avait 0 fleche / 0 pastille. Le user l'a
   signale : « je ne vois que l'offre a 129 ». Mesure avant : cartes 2 et 3 a
   x=361 et x=698 sur un ecran de 390 px.

   ⚠️ MASQUEES PAR DEFAUT, AFFICHEES SEULEMENT SUR MOBILE. A partir de 901 px
   les 3 offres sont en grille cote a cote : des fleches y seraient des
   commandes qui ne deplacent rien. On ecrit donc `display: none` en regle de
   base, PUIS le media query d'affichage APRES (a specificite egale, l'ordre
   tranche — cf. le piege deja rencontre sur `carrousel-mobile.css`).

   ⚠️ Identite du site : angles DROITS, aucune ombre, aucun degrade, or de
   marque pour les accents. Le survol change le FILET/fond, pas d'effet.
   ============================================================ */
.n-commandes {
  display: none;                 /* grand ecran : inutile (grille) */
  flex: 0 0 auto;                /* ne pas etre compresse dans .n-screen */
  align-items: center; justify-content: center;
  gap: 20px; margin-top: 20px;
}
@media (max-width: 900px) {
  .n-commandes { display: flex; }
}

/* La TETE du carrousel : libelle a gauche, commandes a droite, SUR LA MEME
   LIGNE. ⚠️ Mesure : placees SOUS les cartes, les commandes tombaient a
   y=875 sur un ecran de 844 px — donc invisibles sans scroller. En tete, elles
   sont vues en meme temps que la premiere offre. */
.n-plans-tete { display: none; }
@media (max-width: 900px) {
  .n-plans-tete {
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px; margin: 1.2rem 0 0; flex: 0 0 auto;
  }
  /* le libelle porte deja sa propre marge : dans la tete, on l'annule */
  .n-plans-tete .n-plans-label { margin: 0; }
  /* l'espacement vertical vient de `.n-plans-tete`, pas de la rangee de boutons */
  .n-plans-tete .n-commandes { margin-top: 0; gap: 14px; }
}
.n-fleche {
  width: 44px; height: 44px; flex: none;
  display: grid; place-items: center;
  background: transparent; color: var(--n-fg);
  border: 1px solid var(--n-rule); border-radius: 0;
  font-family: 'IBM Plex Mono', monospace; font-size: 16px; line-height: 1;
  cursor: pointer;
  transition: background-color .15s, color .15s, border-color .15s;
}
.n-fleche:hover { background: var(--n-fg); color: #fff; border-color: var(--n-fg); }
/* une fleche qui ne fait rien donne l'impression d'un carrousel casse */
.n-fleche:disabled { opacity: .3; cursor: default; }
.n-fleche:disabled:hover {
  background: transparent; color: var(--n-fg); border-color: var(--n-rule);
}
.n-pastilles { display: flex; align-items: center; gap: 10px; }
.n-pastille {
  width: 10px; height: 10px; padding: 0; flex: none;
  background: transparent; border: 1px solid var(--n-or-texte); border-radius: 0;
  cursor: pointer; transition: background-color .15s;
}
.n-pastille[aria-current="true"] { background: var(--n-or); border-color: var(--n-or); }
.n-pastille:hover { background: var(--n-or); opacity: .6; }

/* ===== fin no_scroll_offres.css ===== */

/* ===== début no_scroll_pc.css ===== */
/* ============================================================
   PASSE DESIGN PC — les offres et la respiration (2026-10-06).

   ⚠️⚠️ CONTRAINTES NON NEGOCIABLES (preferences etablies du user) :
     - theme BLANC (#fff) / encre noire / or de marque ;
     - ANGLES DROITS, AUCUNE ombre portee, aucun degrade ;
     - ZERO emoji, icones au trait fin uniquement ;
     - sobre et professionnel, pas d'effet « flashy ».
   ⚠️ Un modele de vision a suggere d'ajouter des « ombres douces » et des
   polices serif : c'est EXACTEMENT ce que le user a rejete. On ne suit donc PAS
   cette recommandation. « Plus pro » ici veut dire : HIERARCHIE plus nette,
   RYTHME plus regulier, LISIBILITE meilleure — pas plus de decoration.

   ⚠️ On ameliore la version PC sans toucher a la version mobile deja corrigee.
   ============================================================ */

/* ---- 1. LES CARTES D'OFFRES : structure et lisibilite ----
   ⚠️ Double condition (largeur ET hauteur) : ces ameliorations prennent de la
   place verticale. Sur un portable 1366x768 elles faisaient deborder la section
   de 122 px, alors que le site est « no scroll ». On ne les applique donc que
   quand il y a la hauteur pour les accueillir ; sinon la version compacte
   ci-dessous prend le relais. */
@media (min-width: 901px) and (min-height: 851px) {
  .n-plans {
    gap: 0;                       /* les filets font la separation, pas l'espace */
    margin-top: 2rem;
  }
  .n-plan {
    padding: 1.5rem 1.5rem 1.4rem;
    gap: 0;                       /* on gere le rythme par les marges internes */
  }
  /* l'en-tete de carte : un filet or court au-dessus du nom d'offre */
  .n-plan__nom {
    display: flex; align-items: center; gap: 10px;
    margin: 0 0 .7rem;
  }
  .n-plan__nom::before {
    content: ""; flex: 0 0 auto;
    width: 14px; height: 2px; background: var(--n-or);
  }
  .n-plan__titre {
    font-size: 1.24rem; line-height: 1.2; margin: 0;
    min-height: 2.4em;            /* les 3 titres s'alignent sur 2 lignes */
  }
  .n-plan__prix {
    font-size: 2.1rem; margin: .45rem 0 0;
    letter-spacing: -.03em;
  }
  .n-plan__prix small { font-size: .72rem; letter-spacing: .04em; }
  .n-plan__note {
    margin: .5rem 0 0; min-height: 2.4em;   /* notes alignees */
    font-size: .74rem; line-height: 1.5;     /* etait .67rem (~10,7px) : trop petit */
    color: var(--n-dim);
  }
  /* la liste : un repere CARRE (la marque), aligne sur la premiere ligne */
  .n-plan__liste {
    margin: .75rem 0 0; font-size: .9rem;
  }
  .n-plan__liste li {
    position: relative;
    padding: .3rem 0 .3rem 16px;
    border-top: 1px solid var(--n-rule);
    line-height: 1.4;
  }
  .n-plan__liste li::before {
    content: ""; position: absolute; left: 0; top: .82em;
    width: 5px; height: 5px; background: var(--n-or);
  }
  /* pied de carte : le bouton reste en bas quelle que soit la hauteur du texte */
  .n-plan__pied { padding-top: .9rem; }
  .n-plan__pied .n-btn { padding: 14px 16px; }

  /* survol : on change le FILET, pas d'ombre (langage du site) */
  .n-plan { transition: background .18s ease; }
  .n-plan:hover { background: #fcfbf8; }
  .n-plan--phare:hover { background: #efe4cb; }
  .n-plan .n-btn { transition: background .18s, color .18s, border-color .18s; }
}

/* ---- 2. LA GRILLE DE PAGE : meilleure respiration sur grand ecran ---- */
@media (min-width: 1200px) {
  /* le titre de page et le sous-titre restent lisibles sur une ligne confortable */
  .n-screen--prix .n-sub { max-width: 78ch; }
  /* le bandeau de CTA et la FAQ respirent */
  .n-screen--prix .n-cta { margin-top: 1.6rem; }
  .n-screen--prix .n-detail { margin-top: 1.1rem; }
}

/* ---- 3. LE BANDEAU D'ACTIONS : les boutons alignes sur UNE bande neutre ----
   ⚠️⚠️ LA BANDE ETAIT DOREE (2026-10-14). `background: var(--n-or-ligne)` posait un
   aplat or de 30 % derriere les quatre boutons : sur un ecran ivoire, cela faisait
   une dalle moutarde en travers de la page, le bouton principal se noyait dedans, et
   le premier regard tombait sur la bande au lieu de la promesse. Les filets et les
   separations suffisent a aligner les actions : on passe sur le FILET neutre
   (`--n-rule`), comme le bloc de verification de l'accueil. */
@media (min-width: 901px) {
  .n-screen--prix .n-cta {
    display: grid; grid-template-columns: 1fr 1fr; gap: 0;
    border: 1px solid var(--n-rule); background: transparent;
  }
  /* ⚠️ ON NE TOUCHE PAS AU FOND DES BOUTONS : le premier est en encre pleine, les
     trois autres sont des liens fantomes. Imposer un fond ici ecraserait la
     hierarchie (mesure faite : le bouton principal redevenait ivoire comme les
     autres). Les separateurs se dessinent donc PAR BORDURE, pas par le fond. */
  .n-screen--prix .n-cta .n-btn {
    border: 0; text-align: center; padding: 18px 20px;
  }
  .n-screen--prix .n-cta .n-btn:nth-child(odd) { border-right: 1px solid var(--n-rule); }
  .n-screen--prix .n-cta .n-btn:nth-child(-n+2) { border-bottom: 1px solid var(--n-rule); }
  .n-screen--prix .n-cta .n-btn--or { background: var(--n-or-texte); color: #fff; }
}

/* ---- 1bis. PORTABLES (pas assez de hauteur) : version compacte ----
   ⚠️ On resserre la chaine d'espacements SANS retirer le design (repere or,
   alignement des titres). Le site doit tenir dans l'ecran sur un 1366x768,
   qui est un ecran de travail courant. */
@media (min-width: 901px) and (max-height: 850px) {
  .n-plans { margin-top: .9rem; }
  .n-plan { padding: .9rem 1rem .85rem; }
  .n-plan__nom { margin: 0 0 .4rem; }
  .n-plan__titre { font-size: 1.05rem; line-height: 1.16; min-height: 2.2em; margin: 0; }
  .n-plan__prix { font-size: 1.55rem; margin: .25rem 0 0; }
  .n-plan__note { margin: .3rem 0 0; min-height: 2.1em; font-size: .7rem; line-height: 1.45; color: var(--n-dim); }
  .n-plan__liste { margin: .45rem 0 0; font-size: .82rem; }
  .n-plan__liste li { padding: .2rem 0 .2rem 14px; line-height: 1.35; }
  .n-plan__liste li::before { top: .76em; width: 4px; height: 4px; }
  .n-plan__pied { padding-top: .55rem; }
  .n-plan__pied .n-btn { padding: 11px 12px; }
  .n-screen--prix .n-cta { margin-top: .7rem; }
  .n-screen--prix .n-detail { margin-top: .55rem; }
}

/* ---- 1ter. AJUSTEMENT FIN POUR LES PORTABLES COURTS (1366x768) ----
   ⚠️ Mesure : il restait 28 px de debordement. On les reprend sur les marges
   du bloc (pas sur la taille du texte, qui doit rester lisible). */
@media (min-width: 901px) and (max-height: 850px) {
  .n-plans { margin-top: .5rem; }
  .n-plan__liste { margin-top: .3rem; }
  .n-plan__liste li { padding: .16rem 0 .16rem 14px; }
  .n-screen--prix .n-sub { margin-top: .55rem; }
}

/* ===== fin no_scroll_pc.css ===== */

/* ===== début no_scroll_barre.css ===== */
/* ============================================================
   LA BARRE DU HAUT — hauteur maitrisee (2026-10-06).

   ⚠️⚠️ MESURE DU DEFAUT. `.n-head` portait `padding: 20px` en haut ET en bas,
   avec un bouton de 39 px : la barre faisait donc **80 px de haut**, soit :
       9,5 % d'un ecran 390x844
      14,1 % d'un ecran 320x568   <-- « trop imposante » sur l'accueil mobile
   Et comme la barre est `position: fixed`, `.n-screen` reservait `96px` (puis
   `max(5.5rem, 9vh)`) de `padding-top` pour la degager : le contenu commencait
   88 a 96 px trop bas, ce qui mangeait encore un huitieme de l'ecran.

   ⚠️ DEUX AUTRES DEFAUTS RELEVES EN PASSANT.
   1. `no_scroll_couleur.css` posait un `linear-gradient` en fond de barre :
      contraire a la regle DURE du site (« aucun degrade »). Remplace par un
      aplat, qui suffit puisque la barre ne sert qu'a rendre la navigation
      lisible.
   2. La barre n'avait pas de filet de separation : sur une page dont le contenu
      defile dessous, rien ne marquait la limite. Un filet TRES fin la pose.

   ⚠️ Objectif : barre <= 62 px sur mobile, <= 72 px sur ordinateur, et contenu
   qui demarre juste en dessous.
   ============================================================ */

/* ---- 1. HAUTEUR DE LA BARRE ---- */
.n-head {
  padding: 11px var(--n-pad);
  background: var(--n-bg);              /* aplat, plus de degrade */
  border-bottom: 1px solid var(--n-rule);
}
.n-menu-btn {
  padding: 7px 0;                       /* etait 10px : cible tactile conservee */
  min-height: 40px;                     /* >= 40px : reste confortable au pouce */
}
.n-logo { font-size: 12.5px; letter-spacing: .2em; }

@media (max-width: 900px) {
  .n-head { padding: 9px var(--n-pad); }
  .n-menu-btn { padding: 6px 0; min-height: 38px; }
  .n-menu-btn .n-burger i { width: 22px; }
}

/* ---- 2. LE CONTENU REMONTE (il n'a plus a degager 96 px) ----
   ⚠️ On garde une marge confortable au-dessus du premier texte : la barre est
   fixe, donc sans cette reserve le titre passerait DESSOUS. On se cale sur la
   hauteur reelle de la barre + une respiration. */
.n-screen { padding-top: 76px; }
.n-screen--serre { padding-top: 76px; }
.n-screen--prix { padding-top: 88px; }
.n-screen--pay { padding-top: 76px; }
.n-screen--form { padding-top: 76px; }
.n-lecture { padding-top: 76px; }
.n-formwrap { padding-top: 68px; }

@media (max-height: 760px) {
  .n-screen { padding-top: 66px; }
  .n-screen--prix { padding-top: 70px; }
  .n-screen--pay { padding-top: 66px; }
  .n-screen--serre { padding-top: 66px; }
  .n-lecture { padding-top: 66px; }
  .n-formwrap { padding-top: 60px; }
}
@media (max-height: 620px) {
  .n-screen { padding-top: 58px; }
  .n-screen--prix { padding-top: 60px; }
  .n-screen--pay { padding-top: 58px; }
  .n-screen--serre { padding-top: 58px; }
  .n-lecture { padding-top: 58px; }
  .n-formwrap { padding-top: 54px; }
}

/* ============================================================
   ⚠️⚠️ LE TITRE PASSAIT SOUS LA BARRE DU HAUT (2026-10-13, signalé par le client).

   MESURE DU DÉFAUT. `.n-screen` est une boîte de la hauteur de l'écran
   (`min-height:100svh`, `overflow-y:auto`) qui centre son contenu
   (`justify-content:center`). Quand le contenu est plus haut que l'écran, le
   centrage flex le fait déborder PAR LE HAUT : la partie haute est alors
   INATTEIGNABLE (on ne peut même pas y défiler) et le titre passe SOUS la barre
   fixe (63 px). Relevé sur l'accueil, largeur 1366 :

       577 px  →  titre à y = -4 px    (coupé, hors écran)
       700 px  →  sur-titre à y = 47 px (sous la barre)
       768 px  →  titre à y = 32 px     (sous la barre)
       900 px  →  sur-titre à y = 57 px (sous la barre)
      1000 px  →  OK

   Ce sont les portables (768-900 px de haut), donc la majorité des visiteurs.

   ⚠️ LA CORRECTION. On ne centre plus par `justify-content` mais par des marges
   automatiques sur les extrémités : le groupe reste centré quand il y a la place,
   et se colle en haut dès qu'il déborde. C'est la technique qui marche partout
   (pas de `safe center`, que les vieux Safari ignorent), et le `padding-top` de
   `.n-screen` garde le titre sous la barre dans tous les cas.
   ============================================================ */
.n-screen { justify-content: flex-start; }
.n-screen > :first-child { margin-top: auto; }
.n-screen > :last-child { margin-bottom: auto; }
/* ⚠️ Sur les écrans très courts (<= 620 px), `no_scroll_barre.css` réservait
   58 px de haut alors que la barre en fait 63 : le sur-titre passait encore de
   5 px sous la barre. On réserve la hauteur de la barre plus une respiration. */
@media (max-height: 620px) {
  .n-screen, .n-screen--prix, .n-screen--pay,
  .n-screen--serre, .n-lecture, .n-formwrap { padding-top: 70px; }
}

/* ===== fin no_scroll_barre.css ===== */

/* ===== début no_scroll_coherence.css ===== */
/* ============================================================
   COHERENCE DES PAGES — les titres, partout (2026-10-06).

   ⚠️⚠️ DEFAUT MESURE. Deux pages n'ont JAMAIS ete migrees au langage du site :
   `/contact` et `/artisan`. Elles utilisent l'ANCIEN vocabulaire
   (`.container` + `.page-head h1`, `.artisan-hero h1`), dont le style vivait
   dans `devisaly.css`. Or cette feuille n'est plus chargee (le double theme a
   ete retire) : leur `h1` retombait donc sur le style PAR DEFAUT DU NAVIGATEUR.

     /              Anton, MAJUSCULES, 48px     -> correct
     /pricing       Anton, MAJUSCULES, 37px     -> correct
     /contact       Inter, 33px, minuscules     -> DEFAUT
     /artisan       Inter, 33px, minuscules     -> DEFAUT

   ⚠️ La regle ci-dessous rend le style de titre du site a TOUT `h1` place dans
   une page du gabarit `n-`, quelle que soit la classe heritee. Une page future
   ne pourra donc plus « oublier » son style de titre.
   ⚠️ On cible `h1` et non une liste de classes : c'est justement parce qu'une
   liste de classes avait laisse ces deux pages de cote.
   ============================================================ */

/* ---- 1. LE TITRE DE PAGE ---- */
.n-screen h1,
.n-formwrap h1,
.n-lecture h1,
.artisan-hero h1,
.page-head h1,
.container > h1 {
  font-family: Anton, Archivo, sans-serif;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: -.012em;
  line-height: 1.12;
  color: var(--n-fg);
  font-size: clamp(1.9rem, 7.2vw, 2.6rem);
  margin: 0;
  /* ⚠️ Anton a une hauteur de glyphe > son interligne : sans cette reserve, le
     haut des capitales est rogne (piege connu du site). */
  padding: .06em 0 .04em;
  max-width: none;
}

/* ---- 2. LE SOUS-TITRE QUI SUIT ---- */
.n-formwrap .page-head > p,
.artisan-hero > p {
  font-family: Inter, Archivo, system-ui, sans-serif;
  font-size: 1rem;
  line-height: 1.6;
  color: var(--n-dim);
  margin: .9rem 0 0;
  max-width: 60ch;
}

/* ---- 3. LE MOT MIS EN AVANT DANS UN TITRE (`<em>`) = l'or de la marque ---- */
.artisan-hero h1 em,
.n-formwrap h1 em {
  font-style: normal;
  color: var(--n-or);
}

/* ---- 4. LES CONTENEURS HERITES NE DOIVENT PAS IMPOSER LEUR MISE EN PAGE ----
   `.container` venait de l'ancien theme (largeur, centrage, padding). Sur une
   page `n-`, c'est `.n-formwrap` / `.n-screen` qui porte la mise en page : on
   neutralise donc ce que `.container` pourrait encore imposer. */
.n-formwrap .container {
  max-width: none;
  padding: 0;
  margin: 0;
}

/* ============================================================
   DEUX DEFAUTS RESIDUELS (2026-10-06), mesures sur les pages applicatives.
   ============================================================ */

/* ⚠️ 1. DEGRADE SUR L'ENCART DE L'ESPACE CLIENT.
   `.upsell-banner` (devisaly.css) posait
   `background: linear-gradient(160deg, var(--gold-bg), rgba(...))`.
   Le site interdit les degrades : remplace par l'aplat pale de la marque, qui
   donne le meme effet de « bloc mis en avant » sans le degrade. */
.upsell-banner {
  background: var(--n-or-pale, #f3ead6);
  background-image: none;
  border-radius: 0;
}

/* ⚠️ 2. TITRE D'AUTHENTIFICATION EN ANTON MINUSCULES.
   `.auth-card > h1` forcait `font-size: 22px !important` en minuscules. Or
   **Anton est une police dessinee pour les CAPITALES** : en minuscules elle est
   etroite et peu lisible, et elle n'a plus rien a voir avec les titres du site.
   On applique donc le style de titre du site (Anton + MAJUSCULES), avec une
   taille de page interieure (plus petite que l'accueil, c'est voulu) mais ou le
   texte respire. */
.titre-erreur,
.auth-card > h1 {
  font-family: Anton, Archivo, sans-serif !important;
  text-transform: uppercase;
  letter-spacing: -.008em;
  line-height: 1.14;
  font-size: clamp(1.5rem, 3.2vw, 2rem) !important;
  padding: .05em 0 .03em;
  color: var(--n-fg);
}
@media (max-width: 600px) {
  .titre-erreur,
  .auth-card > h1 {
    font-size: clamp(1.35rem, 6.4vw, 1.7rem) !important;
  }
}

/* ============================================================
   LES LIENS RESTAIENT AU BLEU PAR DEFAUT (2026-10-06).

   ⚠️⚠️ MESURE : 234 liens affiches en `rgb(0, 0, 238)` — le bleu par defaut du
   navigateur. Sur un site blanc / noir / or, c'est le signe le plus visible
   d'une page « pas finie » :
       /blog        105 liens (les articles)
       /prix/<metier> 101 liens (les departements)
       /artisan       4 liens (pied de page)
       /agence-ou-devisaly, /services/…

   CAUSE : ces pages n'ont AUCUNE regle `a { color }`. Le navigateur applique
   alors sa couleur par defaut. Le site n'a jamais eu de regle globale pour les
   liens nus (seules les classes `.n-link`, `.n-btn`, `.n-villes a` en avaient).

   CORRECTIF : une regle globale pour les liens NUS. `:not([class])` garantit
   qu'on ne touche a AUCUN lien deja stylise (`.n-btn`, `.n-link`, `.n-btn--or`…).
   Un lien souligne a l'encre, qui prend l'or au survol — le langage du site.
   ============================================================ */
a:not([class]) {
  color: var(--n-fg);
  text-decoration: underline;
  text-decoration-color: var(--n-or-ligne);
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
  transition: color .15s, text-decoration-color .15s;
}
a:not([class]):hover {
  color: var(--n-or-texte);
  text-decoration-color: var(--n-or);
}

/* ⚠️ Le selecteur de langue et le pied de page du menu ont leurs propres
   classes : on s'assure qu'ils ne prennent pas le bleu non plus. */
.n-menu-foot a,
.n-doc a,
.n-villes a { color: var(--n-fg); text-decoration-color: var(--n-or-ligne); }
.n-menu-foot a:hover,
.n-doc a:hover,
.n-villes a:hover { color: var(--n-or-texte); text-decoration-color: var(--n-or); }

/* ⚠️ 2 liens restaient bleus : ils portent une CLASSE, donc la regle
   `a:not([class])` ne les atteignait pas.
     `.artisan-brand`   (logo du tunnel /artisan)
     `.footer-mail`     (email brut du pied de page)
   Le tunnel `/artisan` est un parcours epure dont la feuille (`artisan.css`)
   n'est pas chargee ici : sa marque retombait donc sur le bleu par defaut. */
.artisan-brand,
.footer-mail,
a.artisan-brand,
a.footer-mail {
  color: var(--n-fg);
  text-decoration: none;
}
.artisan-brand:hover,
.footer-mail:hover {
  color: var(--n-or-texte);
  text-decoration: underline;
  text-decoration-color: var(--n-or);
}

/* ⚠️ BOUTONS DU BUILDER EN POLICE PAR DEFAUT (2026-10-06).
   Mesure : `/app` — « + Ajouter une prestation » et « Réinitialiser »
   s'affichaient en **Arial**, la police par defaut du navigateur. `.add-service`
   et `.clear-draft` (devisaly.css) declarent taille et couleur mais PAS de
   `font-family` : ils heritent d'une chaine qui ne remonte a aucune police du
   site. On la declare explicitement.
   ⚠️ Angles droits aussi : c'est la contrainte du design system. */
.add-service, .clear-draft, .svc-actions button, .lib-btn {
  font-family: 'IBM Plex Mono', monospace;
  letter-spacing: .06em;
  border-radius: 0;
}

/* ===== fin no_scroll_coherence.css ===== */

/* ===== début no_scroll_form.css ===== */
/* ============================================================
   LES FORMULAIRES DES PAGES « NO SCROLL » (2026-10-06).

   ⚠️⚠️ MEME CLASSE DE BUG QUE /artisan, trouvee en CHASSANT le signal.
   Les pages du gabarit `n-` chargent les feuilles `no_scroll*.css` et **PAS**
   `devisaly.css`, qui portait le style des formulaires et des boutons `.btn`.
   Mesure sur /contact :

       button.btn   342x21   Arial   fond rgb(239,239,239)   <- NON STYLE
       input         13 px                                    <- mobile zoome
       select        13 px
       textarea      13 px

   `rgb(239,239,239)` et `Arial` sont les valeurs PAR DEFAUT du navigateur : le
   formulaire de contact etait donc nu, et ses champs faisaient 13 px — en
   dessous de 16 px, Android et iOS zooment automatiquement au focus, ce qui
   casse la mise en page.

   ⚠️ On NE charge PAS `devisaly.css` : elle porte tout l'ancien theme
   (`.drawer`, `.plan`, `.hero`…) et la chargerait ramenerait les regles qu'on a
   justement retirees. On isole donc les formulaires ici, avec les contraintes du
   site : angles droits, aplat or, AUCUN degrade, AUCUNE ombre.
   ============================================================ */

/* ---- LES CHAMPS ---- */
.n-body input[type=text],
.n-body input[type=email],
.n-body input[type=tel],
.n-body input[type=password],
.n-body input[type=number],
.n-body select,
.n-body textarea,
.n-formwrap input,
.n-formwrap select,
.n-formwrap textarea {
  width: 100%;
  min-height: 44px;                 /* cible tactile */
  padding: 11px 14px;
  margin: 0 0 14px;
  background: var(--n-bg, #fff);
  color: var(--n-fg, #0a0a0a);
  border: 1px solid var(--n-rule, rgba(10,10,10,.2));
  border-radius: 0;                 /* angles droits : contrainte du site */
  font-family: Inter, Archivo, system-ui, sans-serif;
  font-size: 16px;                  /* ⚠️ 16 px : en dessous, les mobiles zooment */
  line-height: 1.4;
  outline: none;
  transition: border-color .15s;
}
.n-body textarea, .n-formwrap textarea { min-height: 120px; resize: vertical; }
.n-body input:focus, .n-body select:focus, .n-body textarea:focus,
.n-formwrap input:focus, .n-formwrap select:focus, .n-formwrap textarea:focus {
  border-color: var(--n-or, #b8892e);
}

/* ---- LES ETIQUETTES ---- */
.n-body form label, .n-formwrap form label {
  display: block;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10.5px; letter-spacing: .16em; text-transform: uppercase;
  color: var(--n-or-texte, #8a6a2a);
  margin: 0 0 6px;
}

/* ---- LES BOUTONS (`.btn` de l'ancien theme, jamais dessines ici) ---- */
.n-body .btn, .n-formwrap .btn,
.n-body button.btn, .n-body form button[type=submit],
.n-fallback .btn {
  display: inline-flex; align-items: center; justify-content: center;
  min-height: 44px; padding: 13px 22px;
  background: var(--n-fg, #0a0a0a);
  color: var(--n-bg, #fff);
  border: 1px solid var(--n-fg, #0a0a0a);
  border-radius: 0;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 11.5px; letter-spacing: .14em; text-transform: uppercase;
  text-decoration: none; cursor: pointer; width: 100%;
  transition: background .15s, border-color .15s, color .15s;
}
.n-body .btn:hover, .n-formwrap .btn:hover,
.n-body button.btn:hover, .n-body form button[type=submit]:hover {
  background: var(--n-or-texte, #8a6a2a);
  border-color: var(--n-or-texte, #8a6a2a);
}
.n-body .btn.primary, .n-formwrap .btn.primary {
  background: var(--n-or-texte, #8a6a2a);
  border-color: var(--n-or-texte, #8a6a2a);
}
.n-body .btn.primary:hover, .n-formwrap .btn.primary:hover {
  background: var(--n-fg, #0a0a0a); border-color: var(--n-fg, #0a0a0a);
}
.n-body .btn.big, .n-formwrap .btn.big { font-size: 12px; letter-spacing: .16em; }

/* ---- LE CONTENEUR DE FORMULAIRE (ancienne classe `.card`) ---- */
.n-formwrap .card, .n-fallback .card {
  background: var(--n-bg, #fff);
  border: 1px solid var(--n-or-ligne, #dcc79a);
  border-radius: 0; padding: 22px 20px;
}

/* ---- LES MESSAGES (flash / succes / erreur) ---- */
.n-body .flash, .n-formwrap .flash {
  border-radius: 0; padding: 12px 14px; margin: 0 0 16px;
  font-family: Inter, system-ui, sans-serif; font-size: 14.5px;
  border: 1px solid var(--n-or-ligne, #dcc79a);
  background: var(--n-or-pale, #f3ead6);
  color: var(--n-fg, #0a0a0a);
}
.n-body .flash.error { border-color: #d9b0a8; background: #f7e7e4; }
.n-body .flash.success { border-color: #b6c9a4; background: #eef4e6; }
.n-body .lead-privacy, .n-formwrap .lead-privacy {
  font-size: 12.5px; color: var(--n-dim, rgba(10,10,10,.58));
  margin-top: 10px; line-height: 1.5;
}
.n-body .hint, .n-formwrap .hint {
  font-size: 12.5px; color: var(--n-dim, rgba(10,10,10,.58)); margin: -8px 0 14px;
}

/* ============================================================
   CIBLES TACTILES TROP PETITES — les 3 cas RÉELS (2026-10-06).

   ⚠️ La plupart des « cibles < 40 px » relevees sont des LIENS DE TEXTE inline :
   une ligne de 20 px, c'est normal et ca ne se « corrige » pas. Restent trois
   controles qui, eux, sont vraiment difficiles a toucher au pouce :

     input[type=checkbox]  13x13   la case d'acceptation des conditions (/visibilite)
     .pw-toggle            36x36   l'oeil qui affiche/masque le mot de passe
     .btn                  33 px   « Voir mon apercu »
   ============================================================ */

/* ---- La case d'acceptation (conditions, RGPD) ----
   ⚠️ 13 px, c'est trois fois trop petit pour un pouce. On agrandit la CASE et on
   etend sa ZONE CLIQUABLE avec un pseudo-element : sans cela, viser 13 px est
   penible — et une case de consentement qu'on rate est un frein a la commande. */
.n-body input[type=checkbox],
.n-formwrap input[type=checkbox],
.n-body .n-pay__consent input[type=checkbox] {
  width: 22px; height: 22px;
  min-width: 22px; min-height: 22px;
  margin: 0 10px 0 0;
  accent-color: var(--n-or-texte, #8a6a2a);
  cursor: pointer;
  position: relative;
}
.n-pay__consent, .n-body label:has(input[type=checkbox]) {
  min-height: 44px; align-items: flex-start; cursor: pointer;
}

/* ---- L'oeil du mot de passe ---- */
.pw-toggle, button.pw-toggle {
  min-width: 44px; min-height: 44px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 0; border-radius: 0;
  color: var(--n-dim, rgba(10,10,10,.58)); cursor: pointer;
}
.pw-toggle:hover { color: var(--n-fg, #0a0a0a); }

/* ---- Les boutons `.btn` : hauteur tactile minimale ---- */
.n-body .btn, .n-formwrap .btn, .n-body a.btn, .n-fallback .btn {
  min-height: 44px;
}

/* ---- Les liens de bloc dans une carte (pas du texte inline) ---- */
.n-ex__ouvrir, .n-menu-foot a { min-height: 24px; display: inline-block; }

/* ⚠️⚠️ `.btn` A UNE HAUTEUR DE 33 px SUR /login, /register, /app (2026-10-06).
   `min-height: 44px` etait ecrit plus haut, mais il ne gagnait PAS : une regle
   plus specifique (probablement `body:not(.app-mode) .btn` ou un `.auth-body
   .btn`) pose `display:flex` et un padding plus petit. `min-height` est IGNORE
   sans `display` de bloc — et meme avec, la specificite tranche.
   ⚠️ `!important` est ici l'usage LEGITIME deja rencontre sur ce site : reprendre
   la main sur un empilement de feuilles legacy qu'on ne veut pas reecrire.
   Verification : mesurer `getComputedStyle().minHeight`, PAS lire la regle. */
.n-body .btn, .n-body a.btn, .n-body button.btn, .n-body input.btn,
.n-formwrap .btn, .n-formwrap a.btn, .n-formwrap button.btn,
.auth-body .btn, .auth-body a.btn, .auth-body button.btn {
  min-height: 48px !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  padding: 14px 22px !important;
  border-radius: var(--r-pil) !important;
}
/* ⚠️ Et l'APLAT OR : `.btn.primary` portait un DEGRADE
   (`linear-gradient(165deg, #c9a457…)`), contraire a la regle dure du site. */
.n-body .btn.primary, .n-formwrap .btn.primary, .auth-body .btn.primary {
  background: #8a6a2a !important;
  background-image: none !important;
  border-color: #8a6a2a !important;
  color: #fff !important;
}
.n-body .btn.primary:hover, .auth-body .btn.primary:hover {
  background: #0a0a0a !important; border-color: #0a0a0a !important;
}

/* ⚠️⚠️ `/app` A UN `<body>` SANS CLASSE (2026-10-06).
   Le gabarit de `/app` ecrit `<body>` nu (les classes `guest`/`app-mode` sont
   conditionnelles, et absentes pour un visiteur ordinaire). Mes selecteurs
   `.n-body .btn` / `.auth-body .btn` ne pouvaient donc PAS l'atteindre — c'est
   pourquoi le bouton de `/app` restait a 33 px alors que /login et /contact
   etaient corriges.
   ⚠️ On cible le CONTENEUR reel du builder (`.builder`, `.container`), qui existe
   sur cette page quelle que soit la classe du body. */
.builder .btn, .container .btn,
.builder a.btn, .builder button.btn,
.container a.btn, .container button.btn {
  min-height: 48px !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  padding: 14px 22px !important;
  border-radius: var(--r-pil) !important;
}
.builder .btn.primary, .container .btn.primary {
  background: #8a6a2a !important;
  background-image: none !important;
  border-color: #8a6a2a !important;
  color: #fff !important;
}
.builder .btn.primary:hover, .container .btn.primary:hover {
  background: #0a0a0a !important; border-color: #0a0a0a !important;
}
/* les boutons utilitaires du builder gardent une taille sobre mais tactile */
.builder .btn.ghost { background: transparent !important; background-image: none !important;
  border: 1px solid var(--n-rule, rgba(10,10,10,.2)) !important; color: var(--n-fg, #0a0a0a) !important; }
.builder .btn.ghost:hover { border-color: var(--n-fg, #0a0a0a) !important; background: transparent !important; }
.builder .btn-sm, .container .btn-sm { min-height: 40px !important; padding: 11px 16px !important; }

/* ⚠️ Le dernier bouton a 33 px est dans la BARRE DE NAVIGATION (`.nav`) des pages
   qui utilisent `_head.html` : « Voir mon aperçu ». Les selecteurs precedents
   visaient le builder et la barre d'action, pas la nav. */
.nav .btn, .topbar .btn, .nav a.btn, .topbar a.btn {
  min-height: 44px !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  padding: 12px 18px !important;
}
.nav .btn.primary, .topbar .btn.primary {
  background: #8a6a2a !important; background-image: none !important;
  border-color: #8a6a2a !important; color: #fff !important;
}

/* ⚠️ BORDURES DE CHAMPS INCOHERENTES SUR /login (2026-10-06).
   Releve au controle visuel : le champ Email portait une bordure NOIRE epaisse,
   le mot de passe une bordure grise fine. Deux champs du MEME formulaire doivent
   avoir le meme traitement : la bordure epaisse etait un effet de `:focus` reste
   actif, ou une regle de l'ancien theme. On uniformise.
   ⚠️ Le placeholder etait aussi trop pale (contraste insuffisant). */
.auth-body input, .auth-card input, .n-body .card input, .n-formwrap .card input {
  border: 1px solid var(--n-rule, rgba(10,10,10,.2)) !important;
  background: var(--n-bg, #fff) !important;
}
.auth-body input:focus, .auth-card input:focus,
.n-body .card input:focus, .n-formwrap .card input:focus {
  border-color: var(--n-or, #b8892e) !important;
  outline: none !important;
}
/* ⚠️ Placeholder lisible : un gris trop pale est un defaut d'accessibilite. */
.n-body input::placeholder, .n-formwrap input::placeholder,
.auth-body input::placeholder, .n-body textarea::placeholder {
  color: rgba(10, 10, 10, .5);
  opacity: 1;
}

/* ⚠️ POLICE DES CHAMPS SUR /login, /register : 14 px (2026-10-06).
   `font-size: 16px` etait ecrit plus haut mais les selecteurs `.n-body input` ne
   touchent PAS ces pages (leur `<body>` porte `auth-body`). Or en dessous de
   16 px, Android et iOS ZOOMENT automatiquement au focus : la mise en page saute
   et l'utilisateur doit dezoomer. On force donc 16 px sur les pages d'auth aussi. */
.auth-body input, .auth-body select, .auth-body textarea,
.auth-card input, .auth-card select, .auth-card textarea {
  font-size: 16px !important;
  font-family: Inter, Archivo, system-ui, sans-serif !important;
  min-height: 48px !important;
  padding: 12px 14px !important;
}
.auth-body textarea, .auth-card textarea { min-height: 120px !important; }

/* ============================================================
   LES FORMULAIRES DE RAPPEL (2026-10-13).

   ⚠️⚠️ POURQUOI. Le site ne prend plus de paiement automatique (voir
   PAIEMENT_EN_LIGNE dans app.py). Le formulaire de paiement de /visibilite est
   devenu un formulaire de RAPPEL — quatre champs au lieu d'un — et l'accueil en
   porte un désormais dans le bandeau `.n-rappel`, pour que le visiteur puisse
   laisser ses coordonnées sans quitter la page d'arrivée.

   ⚠️ Le bloc `.n-pay` de no_scroll.css n'habillait QUE `input[type=email]` :
   les nouveaux champs (texte, téléphone, zone de texte) apparaîtraient sans
   bordure et collés au libellé. On leur donne exactement les mêmes cotes.
   Charte de la famille : angles DROITS, filet de 1 px, aucune ombre.
   ============================================================ */

.n-pay__form input[type=text], .n-pay__form input[type=tel], .n-pay__form textarea {
  width: 100%; padding: 12px 14px; margin-bottom: 14px; border: 1px solid var(--n-rule);
  background: var(--n-bg); color: var(--n-fg); border-radius: 0;
  font-family: Inter, Archivo, system-ui, sans-serif; font-size: 1rem;
}
.n-pay__form textarea { min-height: 74px; resize: vertical; line-height: 1.5; }

/* ---- le bandeau « être rappelé » de l'accueil ---- */
.n-rappel {
  display: grid; grid-template-columns: 1.05fr .95fr; gap: 2.6rem; align-items: start;
  max-width: 1120px; margin: 0 auto; padding: 3.4rem var(--n-pad) 3.8rem;
  border-top: 1px solid var(--n-rule);
}
.n-rappel__titre {
  font-family: Anton, Archivo, sans-serif; font-weight: 400; text-transform: uppercase;
  font-size: clamp(1.5rem, 3.1vw, 2.5rem); line-height: 1.04; letter-spacing: -.008em; margin: 0;
}
.n-rappel .n-sub { margin-top: 18px; max-width: 40ch; }
.n-rappel__form label {
  display: block; font-family: 'IBM Plex Mono', monospace; font-size: .7rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--n-dim); margin-bottom: 5px;
}
.n-rappel__form input[type=text], .n-rappel__form input[type=tel], .n-rappel__form input[type=email] {
  width: 100%; padding: 12px 14px; margin-bottom: 14px; border: 1px solid var(--n-rule);
  background: var(--n-bg); color: var(--n-fg); border-radius: 0;
  font-family: Inter, Archivo, system-ui, sans-serif; font-size: 1rem;
}
.n-rappel__consent {
  display: flex; gap: .6rem; align-items: flex-start; text-transform: none;
  font-family: Inter, Archivo, system-ui, sans-serif; font-size: .82rem; letter-spacing: 0;
  color: var(--n-fg); margin: .2rem 0 14px;
}
.n-rappel__consent input { margin-top: .25rem; }
@media (max-width: 860px) {
  .n-rappel { grid-template-columns: 1fr; gap: 1.6rem; padding-top: 2.4rem; }
}

/* ===== fin no_scroll_form.css ===== */

/* ===== début design-arrondi.css ===== */
/* ============================================================================
   DESIGN ARRONDI — chargé EN DERNIER sur le site public ET le cockpit.

   ⚠️⚠️ DEMANDE USER (2026-10-07) : « fais un design beaucoup plus coin arrondi,
   quelque chose de beaucoup plus agréable à l'œil en globalité », sur le cockpit
   ET le site public (« cohérence totale »).

   CELA REMPLACE UNE RÈGLE ANTÉRIEURE. Jusqu'ici la charte disait « angles DROITS,
   AUCUNE ombre, aucun dégradé » et je l'appliquais partout. Le user a demandé
   explicitement l'inverse : on l'assume, et on l'écrit ici pour que personne ne
   « corrige » ces arrondis en croyant à une régression.

   ⚠️⚠️ POURQUOI CE FICHIER ET PAS CHAQUE FEUILLE. Mesuré avant d'écrire : sur les
   deux surfaces, **tous** les composants avaient `border-radius: 0px` et aucune
   ombre — 11 composants sur /pricing, 16 dans le cockpit. Modifier 20 feuilles de
   style (dont `no_scroll*.css`, 9 fichiers en cascade) aurait été ingérable et
   aurait fini par diverger. Une SEULE échelle, un SEUL fichier, chargé en dernier.

   ⚠️ IL EST VOLONTAIREMENT EN DERNIER dans l'ordre de chargement : il doit gagner
   sur `devisaly.css`, `sections.css` et les 9 `no_scroll*.css`. C'est la seule
   raison de son existence — d'où son nom explicite.

   ÉCHELLE (une seule définition, utilisée des deux côtés) :
     --r-xs  petit : badges, tags, pastilles
     --r-sm  champs, boutons secondaires
     --r-md  cartes, panneaux        <- la valeur qui porte le design
     --r-lg  grandes surfaces, sections
     --r-pil boutons principaux, pilules
   ============================================================================ */

:root {
  /* ---- L'échelle d'arrondis ---- */
  --r-xs: 6px;
  --r-sm: 10px;
  --r-md: 16px;
  --r-lg: 22px;
  --r-xl: 28px;
  --r-pil: 999px;

  /* ---- Ombres : chaudes, jamais grises ----
     ⚠️ Teintées d'or (176,138,62) et d'encre (25,23,19), pas de gris neutre : un
     gris neutre sur un fond ivoire vire au sale. Deux niveaux suffisent — au-delà,
     on ne distingue plus et on alourdit. */
  --ombre-1: 0 1px 2px rgba(25, 23, 19, .04), 0 2px 8px rgba(25, 23, 19, .04);
  --ombre-2: 0 2px 6px rgba(90, 70, 35, .06), 0 10px 28px rgba(90, 70, 35, .08);
  --ombre-3: 0 6px 18px rgba(90, 70, 35, .09), 0 22px 48px rgba(90, 70, 35, .11);
  --ombre-or: 0 4px 14px rgba(176, 138, 62, .20), 0 14px 36px rgba(176, 138, 62, .13);

  /* ---- Un mouvement doux, une seule courbe ---- */
  --t-doux: cubic-bezier(.22, .68, .32, 1);
  --d-court: .16s;
  --d-long: .28s;
}

/* ============================================================================
   1. SITE PUBLIC — les composants `n-*`
   ============================================================================ */

/* ---- 1.1 Boutons ---- */
.n-body .btn, .n-formwrap .btn, .n-body button.btn,
.n-body form button[type=submit], .n-fallback .btn,
.n-btn, .n-cta .btn {
  border-radius: var(--r-pil);
  transition: transform var(--d-court) var(--t-doux),
              box-shadow var(--d-court) var(--t-doux),
              background-color var(--d-court) var(--t-doux);
}
/* ⚠️ Un bouton rond qui « monte » d'1 px au survol : c'est ce qui donne la
   sensation de répondre au doigt. Sur mobile, `:active` remplace `:hover`. */
.n-btn:hover, .n-body .btn:hover, .n-cta .btn:hover {
  transform: translateY(-1px);
  box-shadow: var(--ombre-2);
}
.n-btn:active, .n-body .btn:active, .n-cta .btn:active { transform: translateY(0); }

/* Le bouton d'or : la seule ombre colorée du site. Il doit « porter ». */
.n-btn--or, .n-body .btn.primary, .n-formwrap .btn.primary {
  box-shadow: var(--ombre-or);
}
.n-btn--or:hover, .n-body .btn.primary:hover,
.n-formwrap .btn.primary:hover {
  box-shadow: 0 6px 20px rgba(176, 138, 62, .28), 0 18px 44px rgba(176, 138, 62, .18);
}
.n-btn-ghost { border-radius: var(--r-pil); }

/* ---- 1.2 Champs ----
   ⚠️ `--r-md` (16 px), PAS `--r-sm` (10 px) — CORRIGÉ après contrôle visuel
   (2026-10-07). Mesuré : des champs à 10 px posés à côté de boutons en pilule
   créent une tension — l'œil lit deux systèmes. 16 px s'accorde aux deux, et c'est
   la valeur des cartes : le champ devient « un petit cartouche », pas un rectangle. */
.n-formwrap input, .n-formwrap select, .n-formwrap textarea,
.n-body input[type=text], .n-body input[type=email],
.n-body input[type=password], .n-body input[type=tel],
.n-body input[type=number], .n-body select, .n-body textarea,
input, select, textarea {
  border-radius: var(--r-md);
  transition: border-color var(--d-court) var(--t-doux),
              box-shadow var(--d-court) var(--t-doux);
}
input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: var(--gold, #b08a3e);
  box-shadow: 0 0 0 3px rgba(176, 138, 62, .16);
}

/* ---- 1.3 Cartes et panneaux ----
   ⚠️⚠️ LES GRILLES À FILETS INTERNES ONT BESOIN DE `overflow:hidden`. Elles
   dessinent leurs séparations avec `gap:1px` + un fond coloré : sans découpe, les
   cellules dépassent des coins arrondis et on voit quatre petits carrés. */
.n-car, .n-car-item, .n-ex, .n-ex__visuel, .n-doc,
.n-plan, .n-plans, .n-formbox, .n-detail, .n-lecture,
.n-car--prix, .n-car--exemples, .n-commandes, .n-doc__table {
  border-radius: var(--r-md);
}
.n-plans, .n-doc, .n-car { overflow: hidden; }
.n-car-item, .n-ex, .n-plan, .n-formbox, .n-lecture {
  overflow: hidden;
  transition: transform var(--d-long) var(--t-doux),
              box-shadow var(--d-long) var(--t-doux),
              border-color var(--d-long) var(--t-doux);
}
.n-car-item:hover, .n-ex:hover, .n-plan:hover, .n-lecture:hover {
  transform: translateY(-2px);
  box-shadow: var(--ombre-2);
}
/* La carte « phare » se détache : c'est elle qui vend. */
.n-plan--phare {
  border-radius: var(--r-lg);
  box-shadow: var(--ombre-3);
}
.n-plan--phare:hover { box-shadow: var(--ombre-or); }

/* ---- 1.4 Images et pastilles ---- */
.n-car-item img, .n-ex__visuel img, .n-car img,
.n-doc img, .photo, .n-photo, figure img {
  border-radius: var(--r-sm);
}
.n-plan__badge { border-radius: var(--r-pil); }
.n-menu, .n-head { border-radius: 0; }   /* les barres restent franches */

/* ---- 1.5 Le devis (document) et le tunnel ---- */
.n-doc { box-shadow: var(--ombre-2); }
.n-doc__entete { border-radius: var(--r-md) var(--r-md) 0 0; }
.n-doc__pied { border-radius: 0 0 var(--r-md) var(--r-md); }
.n-formbox { box-shadow: var(--ombre-2); }

/* ============================================================================
   2. COCKPIT DE PROSPECTION — les composants internes
   ============================================================================ */

/* ---- 2.1 Boutons ---- */
.cta { border-radius: var(--r-pil); box-shadow: var(--ombre-1);
  transition: transform var(--d-court) var(--t-doux), box-shadow var(--d-court) var(--t-doux); }
.cta:hover { transform: translateY(-1px); box-shadow: var(--ombre-2); }
.cta:active { transform: translateY(0); }
.cta:disabled { box-shadow: none; transform: none; }
.lien, .frein button, .filtres button, .pg, .btn, .tel {
  border-radius: var(--r-pil);
  transition: transform var(--d-court) var(--t-doux),
              box-shadow var(--d-court) var(--t-doux),
              background-color var(--d-court) var(--t-doux);
}
.lien:hover, .filtres button:hover, .pg:hover, .tel:hover {
  transform: translateY(-1px); box-shadow: var(--ombre-2);
}
.btn-env, .btn-or { box-shadow: var(--ombre-or); }
.btn-or:hover, .btn-env:hover { box-shadow: 0 6px 20px rgba(176,138,62,.28); }
.btn-dgr { border-radius: var(--r-sm); box-shadow: none; }

/* ---- 2.2 Cartes, panneaux, listes ----
   ⚠️ `overflow:hidden` est INDISPENSABLE sur `.carte`, `.kpis`, `.parcours` et
   `table` : leurs cellules sont jointes par un `gap:1px` sur fond coloré. Sans
   découpe, les coins arrondis laissent voir les carrés des cellules. */
.carte, section.carte, .bloc, section.bloc, .desabo, .apercu-lot, .pret .bulle {
  border-radius: var(--r-md);
  overflow: hidden;
  box-shadow: var(--ombre-1);
}
.kpis, .parcours, .ab-barre, .plans {
  border-radius: var(--r-md);
  overflow: hidden;
  box-shadow: var(--ombre-1);
}
.kpi { transition: background-color var(--d-court) var(--t-doux); }
.kpi:hover { background: #fffdf8; }
.etape { transition: background-color var(--d-court) var(--t-doux); }
.etape:first-child { border-radius: var(--r-md) 0 0 var(--r-md); }
.etape:last-child { border-radius: 0 var(--r-md) var(--r-md) 0; }
.sorties a { border-radius: var(--r-sm); }
.sorties a:hover { background: #fbfaf7; box-shadow: none; }

/* ---- 2.3 Champs ----
   ⚠️ `--r-md` ici aussi (voir §1.2) : un champ à 10 px à côté d'un bouton en
   pilule fait jurer l'ensemble. */
input[type=number], input[type=search], input[type=text], select, textarea {
  border-radius: var(--r-md);
  transition: border-color var(--d-court) var(--t-doux),
              box-shadow var(--d-court) var(--t-doux);
}
input:focus, select:focus, textarea:focus {
  outline: none;
  box-shadow: 0 0 0 3px rgba(176, 138, 62, .16);
}
input[type=checkbox] { border-radius: var(--r-xs); }

/* ---- 2.4 Barres de progression ---- */
.jauge, .prog-piste { border-radius: var(--r-pil); overflow: hidden; }
.jauge-r, .prog-remplie { border-radius: var(--r-pil); }

/* ---- 2.5 Pastilles d'état, messages, tags ----
   ⚠️ `--r-pil` POUR LES PASTILLES (corrigé après contrôle visuel). Le badge « +9 »
   de tendance et les pastilles d'intention étaient à 6 px, donc presque carrés, au
   milieu d'une interface arrondie : c'était le détail qui jurait le plus. Une
   pastille de texte court est TOUJOURS une pilule — c'est la règle. */
.avis-f, .avis { border-radius: var(--r-sm); }
.delta, .intent, .objet .tag, .et, .cst .p, .fil .cat,
.n-plan__badge, .n-kicker, .recents .int, .ac, .p-act {
  border-radius: var(--r-pil);
}
.et, .cst .p { border-radius: var(--r-xs); }
.personnes .p-nom, .p-txt { border-radius: var(--r-sm); }
.etat-c { border-radius: var(--r-pil); }
.tel { border-radius: var(--r-md); box-shadow: var(--ombre-1); }
.tel .tel-l, .tel .tel-n { border-radius: 0; }

/* ---- 2.6 LA MESSAGERIE — les bulles ----
   ⚠️⚠️ UNE BULLE N'EST PAS UNE CARTE. Sur WhatsApp, le coin du côté de celui qui
   parle est NET (il « sort » de la bulle), les trois autres sont arrondis : c'est
   ce qui indique qui parle sans lire un mot. On garde cette asymétrie — un
   arrondi uniforme donnerait une liste de cartes, pas une conversation. */
.ligne .bulle { border-radius: var(--r-lg); }
.ligne.nous .bulle { border-bottom-right-radius: var(--r-xs); }
.ligne.lui .bulle { border-bottom-left-radius: var(--r-xs); }
.bulle { box-shadow: var(--ombre-1); }
.pret .bulle { border-radius: var(--r-lg);
  border-bottom-right-radius: var(--r-xs); }

/* ---- 2.7 Tableaux ---- */
table { border-radius: var(--r-md); overflow: hidden; }
tbody tr:hover { background: #fbfaf7; }

/* ---- 2.8 Le rail et les écrans ---- */
.rail nav a { border-radius: var(--r-sm); border-left: 0; }
.rail nav a.on { border-radius: var(--r-sm); }
.sep span { border-radius: var(--r-xs); background: #fff; padding: 0 10px; }
.recents li, .personnes li, .fil li:last-child { border-radius: 0; }
details > summary { border-radius: var(--r-sm); }

/* ============================================================================
   3. LES ÉLÉMENTS DE NAVIGATION ET DE PIED
   ⚠️ Ajouté après vérification (2026-10-07) : `.n-menu-btn`, les liens du menu
   plein écran `.n-link` (1328 px de large) et les liens du pied étaient les
   DERNIERS à rester carrés — mesurés à `border-radius: 0px` après la première
   passe. Ce sont eux qu'on touche en premier sur mobile (le bouton « Menu »), donc
   ce sont eux qui décidaient de l'impression générale. Un `border-radius` sur un
   élément de 1328 px ne se voit pas, mais son survol et son état actif, si.
   ============================================================================ */
.n-menu-btn, .n-burger, .n-link, .n-menu a, .n-footer a,
footer a, .footer-mail, .n-head a {
  transition: background-color var(--d-court) var(--t-doux),
              border-radius var(--d-court) var(--t-doux),
              color var(--d-court) var(--t-doux);
}
/* ⚠️ Le burger et le lien du pied : un arrondi MODÉRÉ (`--r-sm`), pas une pilule.
   Une pilule de 1328 px de large serait un ovale — le lien du menu est une LIGNE,
   pas un bouton. On arrondit juste assez pour que le survol ait une forme. */
.n-menu-btn, .n-burger { border-radius: var(--r-sm); }
.n-link, .n-menu a { border-radius: var(--r-sm); }
.n-footer a, footer a, .footer-mail { border-radius: var(--r-xs); }
.n-link:hover, .n-menu a:hover { background: rgba(176, 138, 62, .07); }

/* ============================================================================
   4. RESPECT DE `prefers-reduced-motion`
   ⚠️ Un utilisateur qui a demandé moins d'animation n'en reçoit AUCUNE. Le
   `transform` au survol est une animation : on le coupe aussi, pas seulement les
   `transition`.
   ============================================================================ */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition: none !important;
    animation: none !important;
  }
  .n-btn:hover, .n-body .btn:hover, .cta:hover, .lien:hover,
  .n-car-item:hover, .n-ex:hover, .n-plan:hover, .lecture:hover,
  .filtres button:hover, .pg:hover, .tel:hover {
    transform: none !important;
  }
}

/* ===== fin design-arrondi.css ===== */

/* ===== début nuee3d.css ===== */
/* ============================================================================
   LA NUÉE — couche de fond commune (2026-10-13)

   ⚠️ À QUOI ÇA SERT. Le décor animé (`nuee3d.js`) doit être visible sur TOUTES
   les pages : accueil, offres, /prix, /services, métiers, départements, blog,
   CGV, mentions, tableau de bord, administration. Les pages viennent de deux
   gabarits différents (`_head.html` et `_n_essentiel.html`) qui peignent chacun
   leur fond opaque (`body{background:var(--paper)}` d'un côté, `.n-body{
   background:var(--n-bg)}` de l'autre) : sans cette feuille, la nuée resterait
   cachée derrière eux.

   ⚠️⚠️ UNE SEULE COUCHE, ET C'EST LE CANVAS (2026-10-13, bug constaté en prod).
   La première version posait un DEUXIÈME calque plein écran : un `<div>` voile
   de lisibilité en `z-index:-1`. Résultat : les images de la page — les trois
   exemples de l'accueil — s'affichaient EN BLANC, le compositeur du navigateur
   perdant leur calque. Le voile est désormais peint DANS le canvas (dernière
   passe de `dessiner()`), et il n'existe plus aucun élément plein écran autre
   que `#nuee-fond`. ⚠️ Ne jamais réintroduire de `<div>` de ce genre ici.

   ⚠️ LE CONTENU N'EST PAS TOUCHÉ. Aucun `z-index` de page n'est modifié, aucune
   carte, aucun menu ne change de plan : le canvas reste en `z-index:-2`, donc
   au-dessus du fond de `<html>` et sous tout le reste.

   ⚠️ Le fond papier du canvas (propriété `background` ci-dessous) n'est qu'un
   repli pour l'instant qui précède la première image, quand le JS n'a pas
   encore tourné : dès la première image, le voile peint dans le canvas prend
   le relais.
   ============================================================================ */

#nuee-fond {
  position: fixed;
  inset: 0;
  z-index: -2;
  display: block;
  pointer-events: none;   /* un décor ne capte jamais un clic */
  background: linear-gradient(180deg,
      rgba(247, 244, 238, .62) 0%,
      rgba(247, 244, 238, .86) 42%,
      rgba(247, 244, 238, .97) 100%);
}

/* Les deux fonds pleine page laissent voir la nuée. Les surfaces de contenu
   (cartes, panneaux, menus, tableaux) gardent leur fond : elles restent nettes. */
html { background-color: var(--paper, #f7f4ee); }
html.nuee-on body { background-color: transparent !important; }
html.nuee-on .n-body { background: transparent !important; }

/* Surface plein écran du gabarit « no scroll ». */
html.nuee-on .n-screen { background: transparent; }

/* Le décor ne s'affiche pas à l'impression. */
@media print {
  #nuee-fond { display: none; }
  html { background: #fff; }
}

/* ===== fin nuee3d.css ===== */

/* ===== début passe-interface.css ===== */
/* ============================================================
   PASSE D'INTERFACE — 2026-10-13
   Feuille chargée EN DERNIER dans les deux familles de gabarits
   (`_head.html` pour les pages classiques, `n_base.html` + `_n_essentiel.html`
   pour les pages publiques). Elle ne réécrit aucune page : elle repose les
   mêmes composants avec une seule échelle, une seule palette et un seul rythme.

   ⚠️ CE QUI N'ALLAIT PAS, RELEVÉ PAGE PAR PAGE :
   1. Le fond des pages publiques était BLANC PUR (`--n-bg: #ffffff`) et l'encre
      NOIRE (`--n-fg: #0a0a0a`), alors que la charte du site est ivoire
      (#f7f4ee) et encre chaude (#191713). La moitié du site était froide.
   2. Chaque famille avait ses propres cotes de bouton, de carte et de champ.
   3. Les titres de section n'avaient pas de repère : pas d'échelle commune
      entre l'accueil (titre géant) et une page de prix (titre moyen).
   4. Le pied de page de la famille publique n'existait PAS (voir
      templates/_n_pied.html), et celui de la famille classique était clair,
      sans hiérarchie.
   5. Aucun état de focus visible sur les champs : on tabulait dans le vide.

   ⚠️ ORDRE DE CHARGE : cette feuille DOIT rester la dernière. Les feuilles de
   page (`seo_*.html`, `admin_*.html`) qui viennent après gardent la main sur
   leur propre périmètre.
   ============================================================ */

:root {
  /* La charte, écrite une fois pour tout le site. */
  --pi-papier:      #f7f4ee;   /* ivoire : le fond de tout le site */
  --pi-papier-2:    #efeae0;   /* ivoire plus dense : bandeaux, survols */
  --pi-carte:       #fffdf9;   /* le papier des cartes, plus clair que le fond */
  --pi-encre:       #191713;   /* encre chaude, jamais du noir pur */
  --pi-encre-doux:  #6f675a;   /* texte secondaire (4,9:1 sur ivoire) */
  --pi-or:          #b08a3e;   /* aplats, traits, gros chiffres */
  --pi-or-clair:    #e8c887;   /* or sur fond sombre */
  --pi-or-profond:  #8a6a2a;   /* texte doré fin (4,6:1 sur ivoire) */
  --pi-ligne:       rgba(25, 23, 19, .10);
  --pi-ligne-forte: rgba(25, 23, 19, .18);
  --pi-ligne-or:    rgba(176, 138, 62, .30);
  --pi-ombre-1: 0 1px 2px rgba(25, 23, 19, .05), 0 4px 14px rgba(25, 23, 19, .05);
  --pi-ombre-2: 0 10px 30px rgba(90, 70, 35, .10), 0 2px 6px rgba(90, 70, 35, .06);
}

/* ---------- 1. LE PAPIER ---------- */
html, body, .n-body, .n-screen, .vitrine { background-color: var(--pi-papier); }
body, .n-body { color: var(--pi-encre); }

/* Les jetons historiques pointent maintenant sur la charte : les pages qui les
   utilisent (elles sont nombreuses) suivent sans être touchées. */
:root {
  --n-bg:       var(--pi-carte);
  --n-fg:       var(--pi-encre);
  --n-dim:      var(--pi-encre-doux);
  --n-rule:     var(--pi-ligne);
  --n-or:       var(--pi-or);
  --n-or-texte: var(--pi-or-profond);
  --n-or-ligne: var(--pi-ligne-or);
}

/* ---------- 2. L'ÉCHELLE TYPOGRAPHIQUE ---------- */
.n-title {
  font-size: clamp(2.1rem, 5.2vw, 5rem);
  line-height: .99; letter-spacing: -.022em;
  text-wrap: balance;
}
.n-kicker {
  color: var(--pi-or-profond);
  letter-spacing: .24em; font-size: .72rem;
  display: flex; align-items: center; gap: .7rem;
}
.n-kicker::before {           /* un trait doré : la page a un début lisible */
  content: ""; width: 28px; height: 1px;
  background: var(--pi-or); opacity: .75; flex: 0 0 auto;
}
.n-sub {
  font-size: clamp(1rem, 1.1vw, 1.12rem);
  line-height: 1.7; color: var(--pi-encre-doux); max-width: 58ch;
  text-wrap: pretty;
}
.n-car-label, h2, h3 { letter-spacing: -.01em; }

/* ---------- 3. LES BOUTONS : une seule famille ---------- */
.n-btn, .btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  min-height: 52px; padding: 0 26px; border: 1px solid transparent; border-radius: 999px;
  font-family: 'IBM Plex Mono', monospace; font-size: .76rem; font-weight: 500;
  letter-spacing: .15em; text-transform: uppercase; text-decoration: none;
  cursor: pointer; background: var(--pi-encre); color: #fbf8f2;
  transition: transform var(--d-court, .16s) var(--t-doux, ease),
              box-shadow var(--d-court, .16s) var(--t-doux, ease),
              background-color var(--d-court, .16s), border-color var(--d-court, .16s), color var(--d-court, .16s);
}
.n-btn:hover, .btn:hover { transform: translateY(-1px); box-shadow: var(--pi-ombre-2); }
.n-btn:active, .btn:active { transform: translateY(0); box-shadow: var(--pi-ombre-1); }

/* Bouton or : encre sur or. C'est la règle de contraste de la charte
   (« --n-or : aplats ; encre des boutons or »). */
.n-btn--or, .btn.primary { background: var(--pi-or); color: #1c1607; }
.n-btn--or:hover, .btn.primary:hover { background: #bd954a; }

/* Bouton contour : pour l'action secondaire, jamais deux boutons pleins côte à côte. */
.n-btn-ghost, .btn.ghost {
  background: transparent; color: var(--pi-encre); border-color: var(--pi-ligne-forte);
}
.n-btn-ghost:hover, .btn.ghost:hover { border-color: var(--pi-or); color: var(--pi-or-profond); background: transparent; }

.btn.big { min-height: 56px; padding: 0 30px; font-size: .8rem; }

/* ---------- 4. LES CARTES ---------- */
.n-car-item, .n-plan, .n-preuve, .n-pay, .n-rappel__form, .card, .auth-card,
.lead-benefit, .tn-chip, .n-pastille {
  background: var(--pi-carte);
  border: 1px solid var(--pi-ligne);
  border-radius: var(--r-lg, 22px);
  box-shadow: var(--pi-ombre-1);
  transition: transform var(--d-court, .16s) var(--t-doux, ease),
              box-shadow var(--d-court, .16s) var(--t-doux, ease),
              border-color var(--d-court, .16s);
}
.n-car-item:hover, .n-plan:hover, .n-preuve:hover, .lead-benefit:hover {
  transform: translateY(-2px);
  box-shadow: var(--pi-ombre-2);
  border-color: var(--pi-ligne-or);
}
.n-car-item { padding: 1.15rem 1.25rem; }
.n-car-item h3 { color: var(--pi-encre); letter-spacing: -.005em; }
.n-prix { color: var(--pi-or-profond); font-variant-numeric: tabular-nums; }

.n-plan { padding: 1.9rem 1.7rem; }
.n-plan__nom { color: var(--pi-or-profond); }
.n-plan__prix { font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.n-plan--phare { border-color: var(--pi-ligne-or); box-shadow: var(--pi-ombre-2); }
.n-plan__badge {
  background: var(--pi-or); color: #1c1607; border: 0; border-radius: 999px;
}
.n-plan__liste li::marker { color: var(--pi-or); }

/* ---------- 5. LES CHAMPS ---------- */
input[type=text], input[type=email], input[type=tel], input[type=password],
input[type=search], select, textarea {
  border-radius: var(--r-sm, 10px) !important;
  border: 1px solid var(--pi-ligne-forte) !important;
  background: #fff; color: var(--pi-encre);
  min-height: 52px; padding: 0 16px; font-size: 1rem;
  font-family: Inter, Archivo, system-ui, sans-serif;
  transition: border-color var(--d-court, .16s), box-shadow var(--d-court, .16s);
}
textarea { padding: 14px 16px; line-height: 1.6; min-height: 110px; }
input::placeholder, textarea::placeholder { color: rgba(25, 23, 19, .42); }

/* ⚠️ Sans anneau de focus, on tabule dans le vide : le champ actif doit se voir. */
input:focus, select:focus, textarea:focus,
.n-btn:focus-visible, .btn:focus-visible, a:focus-visible, summary:focus-visible {
  outline: none;
  border-color: var(--pi-or) !important;
  box-shadow: 0 0 0 3px rgba(176, 138, 62, .18) !important;
}
a:focus-visible, .n-btn:focus-visible, .btn:focus-visible {
  outline: 2px solid var(--pi-or); outline-offset: 3px; box-shadow: none !important;
}
label { color: var(--pi-encre-doux); }

/* ---------- 6. LA BARRE DU HAUT ---------- */
.n-head {
  background: rgba(247, 244, 238, .88) !important;
  -webkit-backdrop-filter: saturate(140%) blur(10px);
  backdrop-filter: saturate(140%) blur(10px);
  border-bottom: 1px solid var(--pi-ligne) !important;
}
.n-logo { color: var(--pi-encre) !important; letter-spacing: .01em; }
.n-logo b { font-weight: 500; }
.n-logo b span { color: var(--pi-or-profond); }
.n-menu-btn {
  border-radius: 999px !important; border: 1px solid var(--pi-ligne-forte) !important;
  transition: border-color var(--d-court, .16s), background-color var(--d-court, .16s);
}
.n-menu-btn:hover { border-color: var(--pi-or) !important; background: var(--pi-papier-2); }

/* ---------- 7. LE RYTHME DES SECTIONS ---------- */
.n-screen { padding-left: var(--n-pad); padding-right: var(--n-pad); }
.n-car { gap: 1rem; scroll-padding-left: var(--n-pad); }
.n-detail details {
  border: 1px solid var(--pi-ligne); border-radius: var(--r-md, 16px);
  background: var(--pi-carte); padding: 2px 20px 6px; margin-bottom: 10px;
}
.n-detail summary {
  cursor: pointer; padding: 16px 0; font-family: 'IBM Plex Mono', monospace;
  font-size: .76rem; letter-spacing: .14em; text-transform: uppercase;
  color: var(--pi-encre); list-style: none;
}
.n-detail summary::-webkit-details-marker { display: none; }
.n-detail summary::after { content: "+"; float: right; color: var(--pi-or-profond); }
.n-detail details[open] summary::after { content: "−"; }
.n-detail p { color: var(--pi-encre-doux); line-height: 1.7; }

/* Les quatre chiffres de l'accueil : un vrai bandeau, plus du texte posé. */
.n-facts { border-top: 1px solid var(--pi-ligne-or); border-bottom: 1px solid var(--pi-ligne-or); }
.n-facts dt { color: var(--pi-or-profond); letter-spacing: .14em; }
.n-facts dd { color: var(--pi-encre); font-variant-numeric: tabular-nums; }
.n-facts > div { border-right-color: var(--pi-ligne); }

/* ---------- 8. DÉTAILS ---------- */
::selection { background: rgba(176, 138, 62, .26); }
html { scroll-behavior: smooth; }
a, button, summary { -webkit-tap-highlight-color: transparent; }
img { max-width: 100%; }

/* ---------- 9. LES PIEDS DE PAGE : la même encre pour les deux familles ---------- *
   ⚠️ Le pied public n'existait pas (voir templates/_n_pied.html) et celui de la
   famille classique était clair, sans hiérarchie, avec un logo à fond clair.
   Les deux passent sur l'encre du site, texte ivoire, accents or. */
.np, .footer {
  background: var(--pi-encre); color: #e7e0d2;
  padding: 3.6rem var(--n-pad, 28px) 2rem;
}
.np a, .footer a, .np__mail, .footer-mail, .footer-tagline {
  color: #e7e0d2; text-decoration: none; opacity: .8;
  transition: color var(--d-court, .16s), opacity var(--d-court, .16s);
}
.np a:hover, .footer a:hover { color: var(--pi-or-clair); opacity: 1; }
.np__grille {
  display: grid; grid-template-columns: 1.6fr repeat(3, 1fr); gap: 2.4rem;
  max-width: 1120px; margin: 0 auto;
}
.np__logo {
  font-family: Anton, Archivo, sans-serif; font-size: 1.4rem; letter-spacing: .01em;
  text-transform: lowercase; opacity: 1 !important; color: #f6f1e7 !important;
}
.np__phrase { margin: .9rem 0 .6rem; max-width: 34ch; font-size: .95rem; line-height: 1.65; opacity: .72; }
.np__titre, .footer h4 {
  font-family: 'IBM Plex Mono', monospace; font-size: .7rem; letter-spacing: .18em;
  text-transform: uppercase; color: var(--pi-or-clair); margin: 0 0 1rem;
}
.np__col { display: flex; flex-direction: column; gap: .62rem; font-size: .95rem; }
.np__bas {
  display: flex; flex-wrap: wrap; gap: 1rem; justify-content: space-between; align-items: center;
  max-width: 1120px; margin: 3rem auto 0; padding-top: 1.4rem;
  border-top: 1px solid rgba(232, 200, 135, .18); font-size: .82rem; opacity: .7;
}
.np__liens { display: flex; gap: 1.2rem; }

/* la famille classique : on garde sa grille et son bloc de marque, on change l'encre */
.footer { padding: 3.2rem 0 1.8rem; }
.footer-grid { max-width: 1120px; margin: 0 auto; padding: 0 var(--n-pad, 28px); gap: 2.4rem; }
.footer .brand-name { color: #f6f1e7; }
.footer .brand-name span { color: var(--pi-or-clair); }
/* ⚠️ Le logo de la marque est un fichier à fond clair : sur l'encre il
   disparaîtrait. On garde le mot-symbole, qui lui est lisible. */
.footer .brand-mark { display: none; }
.footer h4 { margin-bottom: .85rem; }

@media (max-width: 980px) { .np__grille { grid-template-columns: 1fr 1fr; gap: 1.9rem; } }
@media (max-width: 560px) {
  .np__grille { grid-template-columns: 1fr; gap: 1.6rem; }
  .np__bas { flex-direction: column; align-items: flex-start; margin-top: 2rem; }
}

/* ---------- 10. FINITIONS DE LA PREMIÈRE PASSE (mesurées à l'écran) ---------- */

/* ⚠️ Le titre de l'accueil plafonnait à 48 px en 1440 : `no_scroll_dimension.css`
   verrouille la taille des titres en `@media (min-width: 900px)` avec
   `!important` (3,333 vw). Un hero qui vend « vous êtes invisible sur Google »
   mérite plus d'autorité. C'est le SEUL endroit de cette passe où l'on écrit
   `!important` — il faut bien relever un verrou pour le relever. */
.n-screen--accueil .n-title, .n-screen--pay .n-title {
  font-size: clamp(2.4rem, 4.7vw, 4.4rem) !important;
  letter-spacing: -.02em;
}
/* Le hero prend la largeur de l'écran : le regard descend, il ne balaie pas. */
.n-screen--accueil .n-sub { max-width: 52ch; }

/* ⚠️ `.n-blur` posait un gros aplat beige en haut à droite : sur le papier ivoire
   il se lit comme un bloc inachevé, pas comme une lumière. On en fait une lueur
   très douce, et on la garde hors du texte. */
.n-blur { opacity: .45 !important; filter: blur(60px) saturate(120%) !important; }
.n-blur span {
  background: radial-gradient(circle at 50% 50%, rgba(176,138,62,.32), rgba(176,138,62,0) 72%) !important;
}

/* Les exemples : le métier en étiquette dorée, la description discrète. */
.n-preuves__tete { color: var(--pi-encre); letter-spacing: .2em; }
.n-preuve__corps { padding: .9rem 1.1rem 1.05rem; }
.n-preuve__corps b {
  display: block; font-family: 'IBM Plex Mono', monospace; font-size: .74rem;
  letter-spacing: .16em; text-transform: uppercase; color: var(--pi-or-profond);
}
.n-preuve__quoi { color: var(--pi-encre-doux); font-size: .9rem; }
.n-preuve { overflow: hidden; }
.n-preuve__visuel { display: block; border-bottom: 1px solid var(--pi-ligne); }
.n-preuves__plus {
  display: inline-flex; align-items: center; gap: .5rem;
  font-family: 'IBM Plex Mono', monospace; font-size: .74rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--pi-or-profond); text-decoration: none;
}
.n-preuves__plus:hover { color: var(--pi-encre); }

/* Le carrousel de prestations : même hauteur de carte, titre en encre, prix en or. */
.n-car-item h3 { font-size: 1.02rem; }
.n-car-item .n-prix { font-size: .95rem; }

/* Les listes d'offres : un tiret doré, pas un carré de navigateur. */
.n-plan__liste { list-style: none; padding-left: 0; }
.n-plan__liste li { position: relative; padding-left: 1.15rem; }
.n-plan__liste li::before {
  content: "—"; position: absolute; left: 0; color: var(--pi-or);
}
.n-plan__liste li::marker { content: ""; }

/* ---------- 11. LES ÉCRANS NE TRONQUENT PLUS LEUR DERNIER BLOC ----------
   ⚠️⚠️ MESURÉ sur /pricing : `section.n-screen--prix` a `height: 100svh` (900 px)
   et `overflow: hidden auto`. Le bloc « DevisalySEO » qui la suit était donc
   COUPÉ EN DEUX au ras du bas de l'écran. Le défaut passait inaperçu tant que la
   page se terminait là ; depuis qu'elle a un pied de page, la coupure saute aux
   yeux. L'écran garde sa hauteur minimale (l'effet « une seule page »), mais il
   ne tronque plus : ce qui dépasse allonge la page au lieu d'être perdu. */
.n-screen--prix { height: auto !important; min-height: 100svh; overflow: visible !important; }

/* ---------- 12. LES EXEMPLES SUR MOBILE : une rangée qu'on fait glisser ----------
   ⚠️ Mesuré en 390 px : la grille des exemples restait en trois colonnes, chaque
   étiquette se cassait sur quatre lignes (« PLOMBIER / Dépannage et
   installations, à Lyon »). On passe en rangée glissante — c'est déjà le langage
   du site pour les carrousels (« FAITES DÉFILER ») — avec accroche au doigt. */
@media (max-width: 860px) {
  /* ⚠️ La grille gardait `grid-template-columns: repeat(3, 1fr)` d'une autre
     feuille : tant qu'on ne la neutralise pas, les items restent à 1fr et les
     étiquettes se cassent sur quatre lignes. */
  .n-preuves__grille {
    display: grid !important; grid-template-columns: none !important;
    grid-auto-flow: column !important; grid-auto-columns: 78% !important;
    gap: .9rem; overflow-x: auto; scroll-snap-type: x mandatory;
    scroll-padding-left: var(--n-pad, 20px);
    -webkit-overflow-scrolling: touch;
    padding-bottom: .4rem;
  }
  .n-preuves__grille::-webkit-scrollbar { display: none; }
  .n-preuve { scroll-snap-align: start; }
  .n-preuve__corps b { font-size: .7rem; }
  .n-preuve__quoi { font-size: .86rem; }
}


/* ============================================================
   13. UNE SEULE COLONNE DE CONTENU (2026-10-13, « tout n'est pas centré »)

   ⚠️⚠️ CE QUE LA MESURE MONTRE. Le site n'a pas UNE grille, il en a cinq.
   Bords gauches relevés en 1440 px de large :

        accueil, /pricing, /services, /blog, pages prix   56 px   (pleine largeur)
        /visibilite, /leads, /contact, /artisan          130 px
        pied de page classique                           155 px
        bandeau « être rappelé » et pied public          160 px
        carte de connexion                               500 px (centrée)

   Cinq bords gauches : le logo de la barre (56) ne tombe jamais sur le texte de
   la page, et le pied ne tombe sur rien. C'est ça, le « décalé » — ce n'est pas
   une impression, c'est mesuré.

   ⚠️ LA RÈGLE. Une colonne de 1120 px, centrée, jamais moins de 28 px de marge :
   c'est déjà la largeur du pied, du bandeau, des pages /leads et /visibilite, et
   du `.container` historique. On aligne les pages « pleine largeur » sur elle,
   plutôt que l'inverse : le texte d'un paragraphe ne doit pas courir sur 1328 px.
   ============================================================ */
:root { --pi-colonne: 1120px; }

/* Les écrans de la famille no-scroll : la gouttière devient une gouttière de
   colonne. `padding-inline` ne touche pas le `padding-top` de chaque écran. */
.n-screen {
  padding-inline: max(var(--n-pad, 28px), calc((100% - var(--pi-colonne)) / 2)) !important;
}

/* Les pages à formulaire (leads, contact, artisan, tunnel) : même colonne. */
.n-formwrap, .artisan-hero {
  padding-inline: max(24px, calc((100% - var(--pi-colonne)) / 2)) !important;
}

/* Le bandeau « être rappelé ». */
.n-rappel {
  max-width: none; padding-inline: max(var(--n-pad, 28px), calc((100% - var(--pi-colonne)) / 2));
}
.n-rappel__txt, .n-rappel__form { max-width: 520px; }

/* Le pied de page public : même colonne que la page, pas 104 px plus à droite. */
.np__grille, .np__bas {
  max-width: none;
  padding-inline: max(var(--n-pad, 28px), calc((100% - var(--pi-colonne)) / 2));
}

/* Le pied de page classique : sa colonne est celle de `.container` (1120 px avec
   ses 28 px internes). On enlève la marge double qui le décalait de 25 px. */
.footer-grid { max-width: var(--pi-colonne); margin: 0 auto; padding-inline: 0; }
.footer .container { max-width: none; padding-inline: 0; }

/* ⚠️ Sur mobile, la carte de connexion touchait les deux bords : centrée sur
   grand écran, collée aux bords en 390 px. */
@media (max-width: 620px) {
  .auth-body .auth-card, .auth-card { width: auto; margin-inline: 20px; }
}

/* ⚠️⚠️ ET LA BARRE DU HAUT N'ÉTAIT PAS SUR LA COLONNE. Le logo est à 56 px du
   bord alors que TOUT le texte des pages commence à 153 px : sur chaque page, le
   mot-symbole flottait à gauche de tout le reste — c'est le premier « décalage »
   qui saute aux yeux. La barre reste pleine largeur (son filet traverse l'écran),
   mais son contenu se cale sur la colonne, et le bouton MENU sur le bord droit. */
.n-head {
  padding-inline: max(var(--ng-pad, 24px), calc((100% - var(--pi-colonne)) / 2)) !important;
}


/* ============================================================
   14. LE RYTHME VERTICAL, LE BOUTON DE BARRE, LES DERNIERS DÉCALAGES
   ============================================================ */

/* ---------- 14.1 Un rythme vertical, au lieu de paddings au cas par cas ----------
   ⚠️ Les écarts entre sur-titre, titre, sous-titre, boutons et blocs étaient
   posés à la main dans huit feuilles (22, 26, 32, 48 px selon l'endroit). Une
   seule échelle : 8, 16, 24, 32, 48, 64. */
.n-kicker { margin-bottom: 20px; }
.n-title { margin: 0; }
.n-sub { margin-top: 24px; }
.n-cta { margin-top: 32px; }
.n-preuves { margin-top: 48px; }
.n-facts { margin-top: 40px; }
.n-facts dt { margin-top: 8px; }
.n-facts dd { margin-top: 16px; }
.n-detail { margin-top: 48px; }
.n-car-item { padding: 20px 22px; }
.n-plan { padding: 32px 30px; }
.n-plan__pied { margin-top: 24px; }
.n-pay { margin-top: 48px; padding-top: 32px; }
.n-rappel { padding-block: 64px 72px; }
.np { padding-block: 64px 32px; }
.np__bas { margin-top: 48px; padding-top: 24px; }

/* ---------- 14.2 Le bouton de conversion dans la barre du haut ----------
   ⚠️ Ajouté dans les deux partials de barre. Un bouton discret, à gauche du
   MENU : c'est la seule action du site qui rapporte. */
.n-head__cta {
  margin-left: auto; margin-right: 14px;
  display: inline-flex; align-items: center; min-height: 40px; padding: 0 18px;
  border-radius: 999px; background: var(--pi-or); color: #1c1607;
  font-family: 'IBM Plex Mono', monospace; font-size: .7rem; letter-spacing: .13em;
  text-transform: uppercase; text-decoration: none; white-space: nowrap;
  transition: background-color var(--d-court, .16s), transform var(--d-court, .16s);
}
.n-head__cta:hover { background: #bd954a; transform: translateY(-1px); }
@media (max-width: 560px) {
  .n-head__cta { min-height: 36px; padding: 0 13px; font-size: .64rem; letter-spacing: .1em; margin-right: 8px; }
}

/* ---------- 14.2 bis Le bouton « Appeler » (2026-10-13) ----------
   ⚠️ UN SEUL BOUTON OR PAR ÉCRAN : « Être rappelé » le reste. Celui-ci est en
   CONTOUR (fond transparent, filet d'encre), donc il ne concurrence pas l'action qui
   rapporte, et il reste lisible sur le fond clair comme sur le fond or.

   ⚠️ IL PORTE `margin-left: auto`, PAS `.n-head__cta` SEUL. La barre est en
   `justify-content: space-between` : c'est ce `margin-left:auto` qui pousse le bloc
   des actions vers la droite. Posé AVANT « Être rappelé » dans le DOM, il pousse donc
   les deux boutons ensemble et laisse le logo à gauche. Vérifié en 390 px : la barre
   ne débordait plus dès qu'on l'a masqué sous 900 px (voir plus bas).

   ⚠️ IL DISPARAÎT SOUS 900 px. À 390 px, la barre porte le logo, « Être rappelé » et le
   bouton MENU : un quatrième élément la faisait passer à la ligne. Le numéro reste
   joignable depuis le pied du menu plein écran (`_n_menu.html`), et c'est justement
   sur téléphone qu'un `tel:` est le plus utile — on ne le supprime donc pas, on le
   déplace. */
.n-head__tel {
  margin-left: auto; display: inline-flex; align-items: center;
  min-height: 40px; padding: 0 16px;
  border: 1px solid rgba(10, 10, 10, .35); border-radius: 999px;
  background: transparent; color: #0a0a0a; text-decoration: none; white-space: nowrap;
  font-family: 'IBM Plex Mono', monospace; font-size: .7rem; letter-spacing: .1em;
  text-transform: uppercase;
  transition: border-color var(--d-court, .16s), color var(--d-court, .16s);
}
.n-head__tel:hover { border-color: var(--pi-or, #b8892e); color: #8a6a2a; }
/* ⚠️ Quand « Appeler » est là, c'est LUI qui pousse à droite : « Être rappelé » ne doit
   plus le refaire, sinon les deux se disputent la marge automatique et le logo part au
   milieu. */
.n-head__tel + .n-head__cta { margin-left: 14px; }
@media (max-width: 900px) {
  .n-head__tel { display: none; }
  .n-head__cta { margin-left: auto; }
}

/* ---------- 14.3 Les deux derniers décalages mesurés ----------
   ⚠️ 1. La famille classique posait son contenu 7 px à droite du reste
   (`.container { max-width: 1120px; padding: 0 28px }` : le contenu interne
   commençait à 160 px quand la colonne publique commence à 153). En élargissant
   le conteneur de ses deux gouttières, les deux familles tombent au même pixel.
   ⚠️ 2. Le menu plein écran gardait la gouttière de 56 px : ses entrées ne
   tombaient pas sur la colonne du contenu qu'elles recouvrent. */
.container { max-width: calc(var(--pi-colonne) + 56px) !important; }
.n-menu, .n-menu-foot, .n-menu-group {
  padding-inline: max(24px, calc((100% - var(--pi-colonne)) / 2)) !important;
}

/* ---------- 14.4 Un seul texte restait sous le seuil AA ----------
   ⚠️ « Visibilité Pro » : or profond #8a6a2a sur la carte ivoire, corps 10,6 px,
   rapport mesuré 4,20:1 (seuil 4,5:1). On assombrit l'or des étiquettes posées
   sur une carte, sans toucher à l'or des grands aplats (la charte le réserve aux
   gros chiffres et aux traits). */
.n-plan__nom, .n-preuve__corps b { color: #74581f; }

/* ============================================================
   15. LE DÉCOR NE DOIT PAS PASSER DEVANT LES CHIFFRES (2026-10-13)

   ⚠️ CONSTAT. Sur une page de prix (`/prix/<métier>/<département>`), le décor de la
   nuée se lit comme des RECTANGLES PÂLES posés derrière le titre et la grille de
   tarifs : des blocs gris à bords droits, qui donnent l'impression d'une page
   inachevée. Sur l'accueil, les cartes flottantes sont dans une scène plein écran,
   elles se lisent comme un décor ; ici, l'écran est court (577 px), le contenu est
   dense et commence tout en haut, donc les cartes tombent DERRIÈRE des chiffres.

   ⚠️ CE QU'ON NE FAIT PAS : poser un calque pardessus pour baisser le contraste.
   Un calque plein écran en plus du canvas fait disparaître les images de la page
   (bug des exemples blancs, commit 86534c4). On baisse l'opacité DU CANVAS, ce qui
   éclaircit aussi son voile de lisibilité — et comme le voile est peint DANS le
   canvas, le texte gagne en contraste au lieu d'en perdre.

   ⚠️ `:has()` plutôt qu'une classe de page : le canvas est posé par le script à la
   racine du document, il n'est donc pas un descendant de l'écran. Sans `:has()`, il
   faudrait modifier chaque gabarit. Navigateurs anciens : le décor garde sa pleine
   opacité, rien ne casse. */
body:has(.n-screen--prix) #nuee-fond,
body:has(.n-screen--serre) #nuee-fond { opacity: .42; }

/* ============================================================
   16. L'ACCROCHE ET LE VÉRIFICATEUR — ACCUEIL, EN MODE PC (2026-10-13)

   ⚠️ CONSTAT DU CLIENT : « en mode PC, le site fait très vite ». Mesure : à
   1440 px, le titre plafonnait à 68 px, la phrase d'accroche n'existait pas, et
   l'écran enchaînait sur une grille d'exemples — rien n'arrêtait l'œil, tout
   défilait. Sur une page qui vend de la visibilité, l'écran doit poser un
   constat, une promesse, une preuve vérifiable, puis une action. Dans cet ordre.
   ============================================================ */

/* ---------- 16.1 Le titre et l'accroche, plus haut en mode PC ---------- */
@media (min-width: 900px) {
  .n-screen--accueil .n-title {
    font-size: clamp(3rem, 5.4vw, 5.4rem) !important;   /* 78 px en 1440, 86 px en 1920 */
    line-height: .98 !important;
    max-width: 22ch;
  }
}
.n-hook {
  font-family: 'Archivo', Arial, sans-serif; font-weight: 600;
  font-size: clamp(1.1rem, 1.6vw, 1.6rem); line-height: 1.25;
  color: var(--pi-or-profond); margin: 6mm 0 0; max-width: 34ch;
  /* ⚠️ Pas d'emoji, pas de flèche, pas de gras criard : la phrase est la seule
     chose en gras or de l'écran, c'est ce qui la fait lire. */
}
.n-hook b { font-weight: 700; color: var(--pi-encre); }

/* ---------- 16.1 bis La ligne « tout est dit » ----------
   ⚠️ Demande utilisateur (2026-10-14) : « attirer l'œil sur le fait qu'il n'y a pas de
   blabla, tout est rapide et limpide ». UNE ligne, sous les boutons : le prix, le
   délai, et ce qu'il reste à faire (rien). Le filet au-dessus la détache des boutons
   sans ajouter un bloc de plus à l'écran, et les chiffres sont en or profond : c'est
   ce que l'œil doit attraper. Aucune phrase de plus. */
.n-dit {
  margin: 22px 0 0; padding-top: 14px; border-top: .7pt solid var(--pi-ligne);
  font-family: 'IBM Plex Mono', monospace; font-size: .82rem; line-height: 1.5;
  letter-spacing: .04em; color: var(--pi-encre-doux);
}
.n-dit b { font-weight: 700; color: var(--pi-or-profond); white-space: nowrap; }

/* ---------- 16.2 Le vérificateur de visibilité ---------- */
.n-verif {
  border: .7pt solid var(--pi-filet); border-top: 2pt solid var(--pi-or);
  padding: 5mm 6mm 4.5mm; margin: 8mm 0 0; max-width: 100%;
}
.n-verif__titre {
  font-family: 'Archivo', Arial, sans-serif; font-weight: 700; font-size: 1.02rem;
  margin: 0 0 2mm; color: var(--pi-encre);
}
.n-verif__note { font-size: .84rem; color: var(--pi-muted); margin: 0 0 4mm; max-width: 76ch; }
.n-verif__note b { color: var(--pi-encre); font-weight: 700; }
.n-verif__form {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: 4mm 6mm;
}
.n-verif__champ { display: flex; flex-direction: column; gap: 1.6mm; min-width: 200px; }
.n-verif__champ > span {
  font-family: 'PlexMono', ui-monospace, monospace; font-size: .62rem;
  letter-spacing: .14em; text-transform: uppercase; color: var(--pi-muted);
}
.n-verif__champ select {
  appearance: none; -webkit-appearance: none;
  font-family: 'Archivo', Arial, sans-serif; font-size: .9rem; color: var(--pi-encre);
  background: transparent; border: 0; border-bottom: 1pt solid var(--pi-encre);
  border-radius: 0; padding: 2mm 6mm 2mm 0; cursor: pointer;
  background-image: linear-gradient(45deg, transparent 50%, var(--pi-encre) 50%),
                    linear-gradient(135deg, var(--pi-encre) 50%, transparent 50%);
  background-position: right 3mm center, right 1.4mm center;
  background-size: 5px 5px, 5px 5px; background-repeat: no-repeat;
}
.n-verif__champ select:focus-visible { outline: 2px solid var(--pi-or); outline-offset: 2px; }
.n-verif__bas { font-size: .74rem; color: var(--pi-muted); margin: 3.5mm 0 0; }

/* Le bouton encre : la deuxième action de l'écran, distincte du bouton or. */
.n-btn--encre {
  background: var(--pi-encre); color: #f7f4ee; border-color: var(--pi-encre);
}
.n-btn--encre:hover { background: #2b2620; border-color: #2b2620; }

@media (max-width: 700px) {
  .n-verif { padding: 4mm 4.5mm; }
  .n-verif__form { gap: 3mm; }
  .n-verif__champ { min-width: 100%; }
  .n-btn--encre { width: 100%; justify-content: center; }
}

/* ---------- 16.3 En mode PC, l'écran se compose en deux colonnes ----------
   ⚠️ MESURE À 1920 px : le titre et l'accroche n'occupaient que le tiers gauche de
   l'écran, le reste était vide. Sur une page qui vend, la moitié droite est la place
   naturelle de la preuve : le vérificateur y monte, à hauteur du titre, sans qu'on
   ait à défiler. Les exemples et la barre de chiffres restent en pleine largeur. */
@media (min-width: 1180px) {
  .n-screen--accueil {
    display: grid !important;
    grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr);
    column-gap: 14mm; row-gap: 0;
    /* ⚠️⚠️ MESURÉ : la boîte restait hauteur 100svh alors que le contenu en demande
       1128 px. Avec `align-content: center`, le débordement part DES DEUX CÔTÉS : le
       sur-titre se retrouvait à y=28, c'est-à-dire DERRIÈRE la barre de 63 px —
       invisible. On rend donc la hauteur élastique et on colle le contenu en haut,
       sous la barre. Le défilement redevient normal, rien n'est coupé. */
    height: auto !important;
    min-height: 100svh;
    align-content: start;
    padding-top: 104px !important;
  }
  .n-screen--accueil > .n-kicker,
  .n-screen--accueil > .n-title,
  .n-screen--accueil > .n-hook,
  .n-screen--accueil > .n-sub,
  .n-screen--accueil > .n-cta { grid-column: 1; }
  .n-screen--accueil > .n-verif {
    grid-column: 2; grid-row: 1 / span 6; align-self: center; margin-top: 0;
  }
  .n-screen--accueil > .n-preuves,
  .n-screen--accueil > .n-facts { grid-column: 1 / -1; }
  .n-screen--accueil > .n-preuves { margin-top: 10mm; }
}

/* ---------- 16.4 L'accueil respire plus large que les pages de contenu ----------
   ⚠️ La colonne unique de 1120 px vaut pour les pages de texte (prix, blog, CGV).
   Sur l'accueil en 1920 px, elle laissait 400 px de vide de chaque côté : une page
   de vente qui n'occupe que le centre de l'écran ne vend pas. On élargit L'ACCUEIL
   SEUL à 1400 px, et seulement au-delà de 1180 px. Les paragraphes gardent leur
   propre largeur de lecture (max-width en ch) : la colonne élargie ne rallonge
   aucune ligne de texte. */
@media (min-width: 1180px) {
  .n-screen--accueil {
    padding-inline: max(var(--n-pad, 56px), calc((100% - 1400px) / 2)) !important;
  }
  .n-screen--accueil .n-sub { max-width: 52ch; }
}

/* ===== fin passe-interface.css ===== */
