/* ============================================================
   Polices, servies depuis nos serveurs

   Le site chargeait Lato, Oswald et Open Sans depuis fonts.googleapis.com.
   Chaque visite transmettait alors l'adresse IP du visiteur a Google, sans
   son consentement et sans qu'il en soit informe. Le tribunal regional de
   Munich l'a juge illicite le 20 janvier 2022 (Az. 3 O 17493/20) et la CNIL
   tient la meme position. Les fichiers sont donc rapatries dans
   site/polices/ et servis depuis /polices/ : plus aucune requete ne part
   vers un domaine tiers.

   Deux sous-ensembles par graisse, ceux que Google servait deja :
   `latin` couvre le francais entier (accents, oe, euro), `latin-ext` prend le
   relais sur les noms etrangers. Le navigateur ne telecharge que ce dont la
   page a besoin, grace a `unicode-range`.

   Oswald est une police variable : Google renvoyait le meme fichier pour 300,
   400 et 500 (empreintes MD5 identiques). Un seul fichier est donc stocke, et
   les trois declarations le pointent. Le navigateur ne le telecharge qu'une
   fois et fixe l'axe de graisse sur la valeur declaree.

   `font-display: swap` partout : le texte s'affiche tout de suite dans la
   police de secours, puis bascule. Jamais de page blanche en attendant.
   ============================================================ */

  @font-face {
    font-family: "Lato"; font-style: normal; font-weight: 300;
    font-display: swap; src: url("/polices/lato-300.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: "Lato"; font-style: normal; font-weight: 300;
    font-display: swap; src: url("/polices/lato-300-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }
  @font-face {
    font-family: "Lato"; font-style: normal; font-weight: 400;
    font-display: swap; src: url("/polices/lato-400.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: "Lato"; font-style: normal; font-weight: 400;
    font-display: swap; src: url("/polices/lato-400-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }
  @font-face {
    font-family: "Lato"; font-style: normal; font-weight: 700;
    font-display: swap; src: url("/polices/lato-700.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: "Lato"; font-style: normal; font-weight: 700;
    font-display: swap; src: url("/polices/lato-700-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }
  @font-face {
    font-family: "Lato"; font-style: normal; font-weight: 900;
    font-display: swap; src: url("/polices/lato-900.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: "Lato"; font-style: normal; font-weight: 900;
    font-display: swap; src: url("/polices/lato-900-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }

  @font-face {
    font-family: "Oswald"; font-style: normal; font-weight: 300;
    font-display: swap; src: url("/polices/oswald-variable.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: "Oswald"; font-style: normal; font-weight: 300;
    font-display: swap; src: url("/polices/oswald-variable-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }
  @font-face {
    font-family: "Oswald"; font-style: normal; font-weight: 400;
    font-display: swap; src: url("/polices/oswald-variable.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: "Oswald"; font-style: normal; font-weight: 400;
    font-display: swap; src: url("/polices/oswald-variable-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }
  @font-face {
    font-family: "Oswald"; font-style: normal; font-weight: 500;
    font-display: swap; src: url("/polices/oswald-variable.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: "Oswald"; font-style: normal; font-weight: 500;
    font-display: swap; src: url("/polices/oswald-variable-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }

  /* Open Sans ne sert qu'a deux regles, le titre et la legende du slider, en
     graisse 300. Les graisses 400 et 600 etaient demandees a Google sans etre
     jamais utilisees : elles ne sont pas rapatriees. */
  @font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 300;
    font-display: swap; src: url("/polices/open-sans-300.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: "Open Sans"; font-style: normal; font-weight: 300;
    font-display: swap; src: url("/polices/open-sans-300-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }

:root {
    --magenta: #E6007E;
    --magenta-fonce: #B80065;
    --anthracite: #35373E;
    --gris-menu: #6E7079;

    --fond: #FFFFFF;
    --fond-alt: #F6F4F5;
    --surface: #FFFFFF;
    --bordure: #E4E0E2;
    --texte: #35373E;
    --texte-doux: #6E7079;
    --texte-leger: #9B9DA6;
    --ombre: 0 1px 2px rgba(53,55,62,.06), 0 8px 24px rgba(53,55,62,.08);

    --titre: "Oswald", "Arial Narrow", system-ui, sans-serif;
    --corps: "Lato", "Open Sans", -apple-system, "Segoe UI", Roboto, Arial, sans-serif;

    /* Largeur utile du site : la meme que le theme d'origine, mesuree dans
       sa feuille de style (max-width: 1200px). C'est elle qui donne la
       colonne centrale et les marges gauche et droite. Elle etait passee a
       1600px pour supprimer les marges, ce qui s'eloignait du design.

       Mesure faite dans le navigateur sur le site en ligne, en 1440 et en
       1680 px de fenetre : `.mpcth-header-wrap`, `.mpcth-footer-wrap` et le
       bandeau de menu font 1200 px, centres, quelle que soit la fenetre. Le
       texte d'une page editoriale (/page/cgv/) court de 260 a 1420 px en
       1680, soit 1160 px : c'est 1200 moins les 20 px de marge interne de
       part et d'autre. `.contenu` reproduit exactement cela. Aucun contenu
       de page ne doit sortir de ce conteneur : c'est lui, et lui seul, qui
       cale le contenu sur la barre de menu. Le back-office (apps/admin) a sa
       propre feuille de style et n'est pas concerne. */
    --large: 1200px;

    /* Gouttiere de la fiche produit. Mesuree sur
       https://www.pixelprint.fr/produit/bachepvc/ : la colonne image et la
       colonne resume font 600 px chacune (les deux moities de 1200), chacune
       avec 20 px de marge interne, donc 560 px de contenu utile separes par
       40 px de vide. */
    --gouttiere: 40px;
  }

  @media (prefers-color-scheme: dark) {
    :root {
      --fond: #17181C; --fond-alt: #1E1F25; --surface: #212229;
      --bordure: #33343D; --texte: #EDEBEE; --texte-doux: #9C9DA7;
      --texte-leger: #7C7E88;
      --ombre: 0 1px 2px rgba(0,0,0,.45), 0 8px 24px rgba(0,0,0,.35);
    }
  }
  :root[data-theme="dark"] {
    --fond: #17181C; --fond-alt: #1E1F25; --surface: #212229;
    --bordure: #33343D; --texte: #EDEBEE; --texte-doux: #9C9DA7;
    --texte-leger: #7C7E88;
    --ombre: 0 1px 2px rgba(0,0,0,.45), 0 8px 24px rgba(0,0,0,.35);
  }
  :root[data-theme="light"] {
    --fond: #FFFFFF; --fond-alt: #F6F4F5; --surface: #FFFFFF;
    --bordure: #E4E0E2; --texte: #35373E; --texte-doux: #6E7079;
    --texte-leger: #9B9DA6;
    --ombre: 0 1px 2px rgba(53,55,62,.06), 0 8px 24px rgba(53,55,62,.08);
  }

  * { box-sizing: border-box; }

  /* Echelle du site.

     Releve dans le theme du site en ligne (wp-content/themes/blaszok) :

       html, body                    font-size: 12px, line-height: 1.5em
       #mpcth_mega_menu .widget      font-size: 1em, donc 12px
       ...ul.menu > li > a           padding: 2em .3em 1.5em
       (en-tete colle en haut)       padding: 1em .3em

     Le seul 14px du menu est celui des icones FontAwesome, pas du texte.

     Le notre etait a 16px / 1.6, soit un tiers plus gros a chaque niveau :
     c'est ce que le client voit quand il dit que sa typo est plus compacte.

     On ne descend pas la racine a 12px pour autant. Toute la feuille est
     ecrite en rem : passer la racine de 16 a 12 retirerait un quart a chaque
     taille, partout, y compris la ou le rendu n'a rien a se reprocher. On
     reduit l'echelle de 6 %, on adopte l'interlignage du client, et on cale
     le menu principal sur ses 12px exacts (voir `.a-menu > a`). Les valeurs
     en pixels (nuage du pied, vignettes) ne bougent pas : elles sont
     mesurees sur le site en ligne. */
  html { font-size: 15px; }
  body {
    margin: 0; background: var(--fond); color: var(--texte);
    font-family: var(--corps); font-size: 1rem; line-height: 1.5;
    -webkit-font-smoothing: antialiased;
  }
  .contenu { width: 100%; max-width: var(--large); margin-inline: auto; padding: 0 20px; }

  /* ============ Barre superieure, comme le site ============ */
  .barre-haute {
    background: #4A4C55; color: #C9CAD0;
    font-size: .72rem; letter-spacing: .06em; text-transform: uppercase;
  }
  .barre-haute .contenu { display: flex; align-items: center; gap: .95rem; flex-wrap: wrap; padding: .4rem 0; }
  .barre-haute a { color: #C9CAD0; text-decoration: none; transition: color .15s; }
  .barre-haute a:hover { color: #fff; }
  .barre-haute .sep { opacity: .35; }
  .barre-haute .sociaux { margin-left: auto; display: flex; gap: .8rem; }
  .barre-haute svg { width: 14px; height: 14px; fill: #C9CAD0; transition: fill .15s; }
  .barre-haute a:hover svg { fill: #fff; }

  /* Sous-menus de la barre haute (Boutique, Contactez-nous). Le panneau est
     clair sur fond sombre, comme chez le client, et deborde de la barre : il
     lui faut un z-index au-dessus de l'en-tete, qui est a 40. */
  .barre-haute .haute-menu { position: relative; display: inline-block; }
  .haute-deroulant {
    position: absolute; left: -1.1rem; top: 100%;
    display: flex; flex-direction: column; min-width: 210px;
    padding: .5rem 0; margin-top: .5rem;
    background: #F2F0F1; border: 1px solid #DDD9DB;
    box-shadow: 0 8px 24px rgba(0,0,0,.18);
    opacity: 0; visibility: hidden; transform: translateY(-4px);
    transition: opacity .15s, transform .15s, visibility .15s;
    z-index: 60;
  }
  .haute-menu:hover .haute-deroulant,
  .haute-menu:focus-within .haute-deroulant {
    opacity: 1; visibility: visible; transform: none;
  }
  .barre-haute .haute-deroulant a {
    color: #6E7079; padding: .45rem 1.1rem; white-space: nowrap;
  }
  .barre-haute .haute-deroulant a:hover,
  .barre-haute .haute-deroulant a:focus-visible { color: var(--magenta); }

  /* ============ En-tete : logo d'origine, jamais deforme ============ */
  header { background: #FFFFFF; border-bottom: 1px solid #E4E0E2; position: relative; z-index: 40; }
  /* Hauteur reprise au bandeau du logo : 3,3 rem de marges avant, 2,1 apres.
     Le logo lui-meme ne change pas de taille. */
  .logo { text-align: center; padding: 1.3rem 0 .8rem; }
  /* Le logo est un lien vers l'accueil. Le <a> ne doit ni souligner
     l'image ni ajouter la ligne de base d'un element en ligne. */
  .logo a { display: inline-block; line-height: 0; text-decoration: none; }
  .logo a:focus-visible { outline: 3px solid var(--magenta); outline-offset: 4px; }
  .logo img {
    display: inline-block;
    width: clamp(230px, 28vw, 330px);
    height: auto;
    max-width: 100%;
  }

  /* ============ Navigation + menus deroulants ============ */
  .nav-barre { position: relative; }
  .nav-barre .contenu { display: flex; align-items: center; position: relative; }
  nav ul.principal {
    list-style: none; margin: 0 auto; padding: 0;
    display: flex; flex-wrap: wrap; justify-content: center; gap: .1rem;
  }
  .a-menu { position: relative; }
  .a-menu > a {
    /* .8rem de 15px = 12px : la taille exacte du menu du site en ligne. La
       hauteur, elle, reste la notre : ses 2em/1,5em de marge verticale font
       une barre de 54px, la notre en fait 44 et le client la veut compacte. */
    display: block; padding: .72rem 1rem;
    font-family: var(--corps); font-weight: 700; font-size: .8rem;
    letter-spacing: .05em; text-transform: uppercase;
    color: #4A4C55; text-decoration: none;
    border-bottom: 3px solid transparent;
    transition: color .18s, border-color .18s;
    white-space: nowrap;
  }
  .a-menu > a:hover, .a-menu:focus-within > a { color: var(--magenta); border-bottom-color: var(--magenta); }
  .a-menu > a .fleche-bas { font-size: .62rem; vertical-align: 2px; opacity: .5; margin-left: .2rem; }
  .tiret-marque { color: var(--magenta); font-weight: 900; padding: .72rem .3rem; }

  .deroulant {
    position: absolute; top: 100%; left: 50%;
    transform: translate(-50%, 10px);
    background: #fff; border: 1px solid #E4E0E2; border-top: 3px solid var(--magenta);
    box-shadow: 0 14px 40px rgba(53,55,62,.16);
    padding: 1.1rem 1.3rem; min-width: 250px; z-index: 60;
    opacity: 0; visibility: hidden;
    transition: opacity .22s ease, transform .22s ease, visibility .22s;
    text-align: left;
  }
  .a-menu:hover .deroulant, .a-menu:focus-within .deroulant {
    opacity: 1; visibility: visible; transform: translate(-50%, 0);
  }
  .deroulant.mega { display: flex; gap: 2.2rem; min-width: 620px; }
  @media (max-width: 760px) { .deroulant.mega { flex-direction: column; min-width: 250px; gap: 1rem; } }

  .deroulant h5 {
    font-family: var(--corps); font-weight: 700; font-size: .78rem;
    letter-spacing: .08em; text-transform: uppercase; color: #35373E;
    margin: 0 0 .55rem; padding-bottom: .45rem; border-bottom: 2px solid #E4E0E2;
    white-space: nowrap;
  }
  .deroulant ul { list-style: none; margin: 0; padding: 0; }
  .deroulant li a {
    display: block; padding: .3rem 0;
    font-size: .8rem; letter-spacing: .04em; text-transform: uppercase;
    color: #6E7079; text-decoration: none; white-space: nowrap;
    transition: color .15s, padding-left .15s;
  }
  .deroulant li a::before { content: "› "; color: var(--magenta); }
  .deroulant li a:hover { color: var(--magenta); padding-left: .3rem; }
  .deroulant .prix-menu { color: #B4B6B7; font-size: .72rem; text-transform: none; letter-spacing: 0; }

  .bientot {
    display: inline-block; background: var(--magenta); color: #fff;
    font-size: .58rem; font-weight: 700; letter-spacing: .1em;
    padding: .12rem .4rem; margin-left: .45rem; vertical-align: 1px;
  }

  /* Icones recherche et caddie, a droite comme le site */
  .nav-outils { position: absolute; right: 20px; top: 50%; transform: translateY(-50%); display: flex; gap: .45rem; }
  .outil {
    width: 38px; height: 32px; display: grid; place-items: center;
    background: #F2F0F1; border: 1px solid #DDD9DB; cursor: pointer;
    transition: background .15s, border-color .15s;
  }
  .outil:hover, .outil:focus-visible { background: #fff; border-color: var(--magenta); }
  .outil svg { width: 15px; height: 15px; fill: none; stroke: #6E7079; stroke-width: 1.8; }
  .outil:hover svg { stroke: var(--magenta); }
  .badge-panier {
    position: absolute; top: -6px; right: -4px;
    background: var(--magenta); color: #fff; font-size: .6rem; font-weight: 700;
    min-width: 15px; height: 15px; border-radius: 50%;
    display: grid; place-items: center; padding: 0 3px;
  }
  .outil-conteneur { position: relative; }

  .recherche-boite {
    position: absolute; right: 0; top: calc(100% + 8px);
    width: min(340px, 86vw); background: #fff;
    border: 1px solid #E4E0E2; border-top: 3px solid var(--magenta);
    box-shadow: 0 14px 40px rgba(53,55,62,.16);
    padding: .8rem; z-index: 70; display: none;
  }
  .recherche-boite.ouverte { display: block; }
  .recherche-boite input {
    width: 100%; padding: .6rem .7rem; font-family: var(--corps); font-size: .95rem;
    border: 1px solid #DDD9DB; color: #35373E;
  }
  .recherche-boite input:focus { outline: 2px solid var(--magenta); outline-offset: 1px; }
  .recherche-resultats { list-style: none; margin: .5rem 0 0; padding: 0; max-height: 260px; overflow-y: auto; }
  .recherche-resultats li { padding: 0; }
  .recherche-resultats button {
    all: unset; display: flex; justify-content: space-between; gap: 1rem; width: 100%;
    padding: .42rem .3rem; font-size: .85rem; color: #4A4C55; cursor: pointer;
  }
  .recherche-resultats button:hover { color: var(--magenta); background: #FBF3F7; }
  .recherche-resultats .prix-menu { color: #B4B6B7; font-variant-numeric: tabular-nums; white-space: nowrap; }

  /* ============ Slider : reprise au pixel du Revolution Slider ============
     Le site en ligne pose chaque couche en absolu sur une grille de
     1900 x 783 (parametres du slider "intropixelprint", releves dans le HTML
     publie et la table wppp_revslider_sliders du dump). Les visuels sont des
     compositions completes, fond blanc compris : le bandeau garde donc leur
     rapport et les affiche entiers, jamais recadres. Les textes tombent dans
     les zones blanches de l'image, c'est la composition qui les rend
     lisibles, pas un voile.

     Les coordonnees vivent dans site/bloc-slider.html, en pourcentages de la
     grille ; la taille des textes suit la largeur du bandeau (unites cqw,
     d'ou le container-type). Consequence assumee, identique au site
     d'origine : sur un petit ecran tout retrecit proportionnellement, textes
     compris. C'est le comportement du Revolution Slider, et c'est ce qui
     garantit que rien ne se chevauche jamais. */
  .slider {
    position: relative; overflow: hidden;
    background: #FFFFFF;
    aspect-ratio: 1900 / 783;
    border-bottom: 1px solid #E4E0E2;
    container-type: inline-size;
  }
  .diapo { position: absolute; inset: 0; opacity: 0; visibility: hidden; transition: opacity .9s ease; }
  .diapo.active { opacity: 1; visibility: visible; }
  /* Le rapport du bandeau etant celui des visuels, `cover` ne recadre rien :
     il cale simplement l'image sur le cadre. */
  .diapo .fond {
    position: absolute; inset: 0;
    background-size: cover; background-position: center;
  }
  .diapo .fond-video { width: 100%; height: 100%; object-fit: cover; display: block; }

  .contenu-diapo { position: absolute; inset: 0; }

  /* ---- Les couches ----
     Chaque couche porte en ligne sa position, sa taille, sa couleur et son
     horaire (animation-delay = st, animation-duration = sp, releves couche
     par couche sur le site). La feuille ne pose que le nom de l'animation et
     le mode : les deux se composent. */
  .couche { position: absolute; margin: 0; opacity: 0; }

  .texte-diapo {
    font-family: "Open Sans", var(--corps); font-weight: 400;
    text-shadow: none;
  }
  .texte-diapo.leger { font-weight: 300; }

  .diapo.active .texte-diapo { animation-name: rebond; animation-fill-mode: both; }

  /* easeOutBounce, la courbe des textes du site : trois rebonds
     decroissants, en images clefs parce qu'un cubic-bezier ne sait pas
     revenir en arriere. */
  @keyframes rebond {
    0%   { opacity: 0; transform: translateY(34px); }
    30%  { opacity: 1; }
    36%  { transform: translateY(-9px); }
    54%  { transform: translateY(0); }
    72%  { transform: translateY(-4px); }
    86%  { transform: translateY(0); }
    94%  { transform: translateY(-1px); }
    100% { opacity: 1; transform: translateY(0); }
  }

  /* ---- Les pastilles ----
     Disques translucides, releve : background-color rgba(255,255,255,0.20)
     en style en ligne sur chaque forme du site. La bulle de prix du roll-up
     ecrase ce fond en ligne (rose, rgba(255,0,225,.5), 200 px). Elles
     fondent (power2.inOut), sans rebond. */
  .pastille { aspect-ratio: 1; border-radius: 50%; background: rgba(255,255,255,.2); }
  .diapo.active .pastille {
    animation-name: fondu-couche; animation-fill-mode: both;
    animation-timing-function: cubic-bezier(.45, 0, .55, 1);
  }
  @keyframes fondu-couche { from { opacity: 0; } to { opacity: 1; } }

  /* ---- Le logo de la diapositive video ----
     Seule couche de cette diapositive, comme sur le site : centre, 800 px sur
     la grille de 1900, il monte en intensite (releve : st 740 ms,
     sp 1500 ms, power2.inOut). */
  .logo-video {
    left: 50%; top: 50%; transform: translate(-50%, -50%);
    width: 42.105%; height: auto;
  }
  .diapo.active .logo-video {
    animation-name: fondu-couche; animation-fill-mode: both;
    animation-timing-function: cubic-bezier(.45, 0, .55, 1);
  }

  /* Sans mouvement demande : tout est la, tout de suite. */
  @media (prefers-reduced-motion: reduce) {
    .diapo .couche { animation: none !important; opacity: 1; }
  }

  .puces { position: absolute; bottom: 1.2rem; left: 50%; transform: translateX(-50%); display: flex; gap: .55rem; z-index: 3; }
  .puce { width: 30px; height: 4px; border: 0; padding: 0; cursor: pointer; background: #DDD9DB; transition: background .2s; }
  .puce[aria-current="true"] { background: var(--magenta); }
  .puce:focus-visible { outline: 2px solid var(--magenta); outline-offset: 3px; }
  .fleche {
    position: absolute; top: 50%; transform: translateY(-50%); z-index: 3;
    width: 44px; height: 44px; border: 1px solid #E4E0E2; border-radius: 50%; cursor: pointer;
    background: rgba(255,255,255,.9); color: #6E7079; font-size: 1.3rem; line-height: 1;
    transition: all .2s;
  }
  .fleche:hover { background: var(--magenta); color: #fff; border-color: var(--magenta); }
  .fleche.g { left: .9rem; } .fleche.d { right: .9rem; }

  .bouton {
    display: inline-block; padding: .8rem 1.5rem;
    font-family: var(--corps); font-weight: 700; font-size: .85rem;
    letter-spacing: .07em; text-transform: uppercase; text-decoration: none; cursor: pointer;
    border: 2px solid var(--magenta); background: var(--magenta); color: #fff;
    transition: background .18s, border-color .18s, color .18s;
  }
  .bouton:hover, .bouton:focus-visible { background: var(--magenta-fonce); border-color: var(--magenta-fonce); }
  .bouton.creux { background: transparent; color: var(--magenta); }
  .bouton.creux:hover, .bouton.creux:focus-visible { background: var(--magenta); color: #fff; }

  /* ============ Separateur a filets roses, comme le site ============ */
  .separateur {
    display: flex; align-items: center; gap: 1.2rem;
    margin: 0 0 1.8rem; text-align: center;
  }
  .separateur::before, .separateur::after {
    content: ""; flex: 1; height: 3px;
    background: linear-gradient(90deg, transparent, var(--magenta));
    border-radius: 2px;
  }
  .separateur::after { background: linear-gradient(90deg, var(--magenta), transparent); }
  .separateur span {
    font-family: var(--corps); font-weight: 400; font-size: .95rem;
    letter-spacing: .12em; text-transform: uppercase; color: var(--texte-doux);
    white-space: nowrap;
  }
  @media (max-width: 640px) { .separateur span { white-space: normal; } }

  .reassurance { background: var(--fond-alt); border-bottom: 1px solid var(--bordure); }
  .reassurance .contenu { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1px; }
  .rea { padding: 1.3rem 1rem; text-align: center; }
  .rea b { display: block; font-family: var(--titre); font-size: 1.8rem; font-weight: 500; color: var(--magenta); line-height: 1; font-variant-numeric: tabular-nums; }
  .rea span { font-size: .74rem; letter-spacing: .05em; text-transform: uppercase; color: var(--texte-doux); }

  section { padding: clamp(2.6rem, 6vw, 4rem) 0; }

  /* ============ Cartes de familles ============ */
  .familles { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); }
  .famille {
    position: relative; display: block; overflow: hidden;
    aspect-ratio: 3 / 4; text-decoration: none; color: #fff;
    background: var(--anthracite); box-shadow: var(--ombre);
    transition: transform .35s cubic-bezier(.2,.7,.3,1), box-shadow .35s;
  }
  .famille:hover, .famille:focus-visible { transform: translateY(-6px); box-shadow: 0 14px 34px rgba(53,55,62,.22); }
  .famille:focus-visible { outline: 3px solid var(--magenta); outline-offset: 3px; }
  .famille .visuel {
    position: absolute; inset: 0; background-size: cover; background-position: center;
    transition: transform .55s cubic-bezier(.2,.7,.3,1), filter .45s; filter: saturate(.92);
  }
  .famille:hover .visuel, .famille:focus-visible .visuel { transform: scale(1.09); filter: saturate(1.1); }
  .famille .teinte {
    position: absolute; inset: 0;
    background: linear-gradient(to top, rgba(23,24,28,.9) 4%, rgba(23,24,28,.42) 42%, rgba(23,24,28,.05) 100%);
    transition: background .45s;
  }
  .famille:hover .teinte, .famille:focus-visible .teinte {
    background: linear-gradient(to top, rgba(230,0,126,.92) 0%, rgba(184,0,101,.55) 48%, rgba(23,24,28,.2) 100%);
  }
  .famille .legende { position: absolute; inset: auto 0 0 0; padding: 1.15rem 1.2rem 1.25rem; }
  .famille .barre { width: 34px; height: 3px; background: var(--magenta); margin-bottom: .7rem; transition: width .45s, background .45s; }
  .famille:hover .barre, .famille:focus-visible .barre { width: 62px; background: #fff; }
  .famille h3 { font-family: var(--titre); font-size: 1.14rem; font-weight: 500; text-transform: uppercase; letter-spacing: .05em; margin: 0; }
  .famille .detail-carte {
    margin: 0; font-size: .85rem; line-height: 1.45; color: rgba(255,255,255,.92);
    max-height: 0; opacity: 0; overflow: hidden;
    transition: max-height .45s ease, opacity .35s ease, margin .45s ease;
  }
  .famille:hover .detail-carte, .famille:focus-visible .detail-carte { max-height: 8rem; opacity: 1; margin-top: .5rem; }
  .famille .compte {
    display: inline-block; margin-top: .55rem;
    font-family: var(--corps); font-weight: 700; font-size: .68rem; letter-spacing: .12em;
    text-transform: uppercase; color: #fff; border-bottom: 1px solid rgba(255,255,255,.45);
    opacity: 0; transform: translateY(6px); transition: opacity .4s .1s, transform .4s .1s;
  }
  .famille:hover .compte, .famille:focus-visible .compte { opacity: 1; transform: translateY(0); }

  /* ============ Configurateur ============ */
  .configurateur { background: var(--fond-alt); border-top: 1px solid var(--bordure); border-bottom: 1px solid var(--bordure); }
  .config-grille { display: grid; gap: 1.6rem; grid-template-columns: 1fr; align-items: start; }
  @media (min-width: 940px) { .config-grille { grid-template-columns: 1.15fr .85fr; } }
  .panneau { background: var(--surface); border: 1px solid var(--bordure); padding: 1.5rem; box-shadow: var(--ombre); }

  .champ { margin-bottom: 1.15rem; }
  .champ label {
    display: block; font-family: var(--corps); font-weight: 700; font-size: .78rem;
    letter-spacing: .08em; text-transform: uppercase; color: var(--texte-doux); margin-bottom: .4rem;
  }
  .champ select, .champ input {
    width: 100%; padding: .68rem .8rem; font-family: var(--corps); font-size: 1rem;
    color: var(--texte); background: var(--fond); border: 1px solid var(--bordure); border-radius: 0;
  }
  .champ select:focus, .champ input:focus { outline: 2px solid var(--magenta); outline-offset: 1px; }
  .duo { display: grid; grid-template-columns: 1fr 1fr; gap: .8rem; }
  .finitions { display: grid; gap: .8rem; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); }
  .indispo { font-size: .78rem; color: var(--texte-doux); padding: .55rem .7rem; border: 1px dashed var(--bordure); background: var(--fond-alt); }

  .etiquette-famille {
    display: inline-block; font-family: var(--corps); font-weight: 700; font-size: .64rem;
    letter-spacing: .12em; text-transform: uppercase; padding: .18rem .5rem;
    background: var(--magenta); color: #fff; margin-left: .5rem; vertical-align: 2px;
  }
  .etiquette-famille.rigide { background: var(--anthracite); }

  .ticket { position: sticky; top: 1rem; }
  .prix-final {
    font-family: var(--titre); font-size: clamp(2.6rem, 7vw, 3.6rem); font-weight: 500;
    color: var(--magenta); line-height: 1; font-variant-numeric: tabular-nums; margin: .2rem 0 .1rem;
  }
  .prix-ht { font-size: .78rem; color: var(--texte-doux); letter-spacing: .06em; text-transform: uppercase; }
  .detail { list-style: none; margin: 1.3rem 0 0; padding: 1.1rem 0 0; border-top: 1px solid var(--bordure); font-size: .9rem; }
  .detail li { display: flex; justify-content: space-between; gap: 1rem; padding: .34rem 0; }
  .detail li span:last-child { font-variant-numeric: tabular-nums; white-space: nowrap; }
  .detail li.fort { font-weight: 700; border-top: 1px solid var(--bordure); margin-top: .45rem; padding-top: .7rem; }
  .detail li.remise span:last-child { color: var(--magenta); }
  .detail li.note { color: var(--texte-doux); font-size: .82rem; }
  .formule {
    margin-top: 1.2rem; padding: .85rem; background: var(--fond-alt);
    border-left: 3px solid var(--magenta);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: .72rem; line-height: 1.55; color: var(--texte-doux);
    overflow-x: auto; white-space: pre-wrap; word-break: break-word;
  }
  .alerte {
    margin-top: 1rem; padding: .7rem .85rem; border-left: 3px solid var(--magenta);
    background: color-mix(in srgb, var(--magenta) 8%, transparent); font-size: .85rem;
  }
  .bouton-panier { margin-top: 1.2rem; width: 100%; text-align: center; }

  /* ============ Fiche produit, comme le site ============ */
  .fiche { margin-top: 2.2rem; }
  .fiche h3 {
    font-family: var(--corps); font-weight: 700;
    font-size: clamp(1.15rem, 2.4vw, 1.5rem);
    text-transform: uppercase; letter-spacing: .04em;
    color: var(--magenta); margin: 0 0 .8rem;
  }
  .fiche-meta { font-size: .85rem; margin: 0 0 1rem; }
  .fiche-meta dt {
    display: inline; font-weight: 700; letter-spacing: .06em;
    text-transform: uppercase; color: var(--texte); font-size: .78rem;
  }
  .fiche-meta dd { display: inline; margin: 0; }
  .fiche-meta .ligne { margin-bottom: .35rem; }
  .fiche-meta .rose { color: var(--magenta); text-transform: uppercase; font-size: .8rem; }
  .fiche-desc { color: var(--texte-doux); max-width: 75ch; margin: 0; }

  /* ============ Grilles de cartes produit ============
     (boutique, produits recents de l'accueil, produits similaires)

     Demande du client : "certaines fiches depassent", "tu ne dois pas avoir
     des fiches de differentes hauteurs dans ton dev", et en meme temps
     "les images ne sont pas coupees, pas de bord blanc".

     Mesure sur https://www.pixelprint.fr/produit/bachepvc/ en 1440 px, bloc
     "Produits similaires" : carte 260x414, zone d'image 258x344 (rapport
     0,750), bloc de texte 258x68, quatre colonnes de 260 espacees de 40 dans
     un conteneur de 1200. Toutes ses cartes font exactement la meme hauteur
     parce que WordPress recadre chaque vignette a la source, en 300x400 : sa
     feuille de style, elle, ne fait que `width: 100%; height: auto`.

     Ce recadrage nous est interdit. Nos 59 visuels gardent leur format
     d'origine : 700x525 (26 fichiers), 525x700 (23), 466x700 (10). D'ou la
     construction en trois temps :

       1. la zone d'image a le rapport du site en ligne, 3/4. A largeur de
          colonne egale elle a donc toujours la meme hauteur, et deux cartes
          voisines sont hautes pareil par construction, pas par etirement ;
       2. l'image y est centree a son format naturel (`max-width` et
          `max-height`, jamais `object-fit: cover`, jamais de hauteur
          imposee) : aucun recadrage, aucune deformation ;
       3. le vide qui reste autour d'une image qui ne remplit pas la zone est
          comble par une copie floutee de cette meme image (`.visuel-fond`).
          Nos visuels ont des fonds tres differents (gris clair, rose, brun
          sombre) : aucune couleur unie ne pourrait passer inapercue, alors
          qu'une copie floutee prolonge le fond de la photo elle-meme. C'est
          la seule facon de tenir les trois exigences a la fois : hauteurs
          egales, zero recadrage, zero bande.

     `align-items: stretch` (valeur par defaut, donc plus de `start`) plus
     `margin-top: auto` sur `.infos` : si un tarif en promotion passe sur deux
     lignes, sa carte devient la plus haute de la rangee, les autres s'etirent
     a sa hauteur et gardent leur texte cale en bas. */
  .gamme { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(215px, 1fr)); }

  /* Bloc "Produits similaires" : cinq cartes, donc cinq colonnes des que la
     place le permet, puis 3, 2 et 1. Le nombre de colonnes est ecrit a la
     main et ne passe jamais par 4 : `auto-fill` en donnait quatre entre 1000
     et 1040 px, ce qui coupait les cinq cartes en 4 + 1 et laissait
     exactement la rangee trouee que le client ne veut pas voir. 5 et 1
     remplissent leurs rangees, 3 et 2 laissent une derniere rangee partielle
     mais jamais un orphelin isole sous quatre cartes. */
  .gamme-similaires { grid-template-columns: minmax(0, 1fr); }
  @media (min-width: 440px)  { .gamme-similaires { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
  @media (min-width: 700px)  { .gamme-similaires { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
  @media (min-width: 1040px) { .gamme-similaires { grid-template-columns: repeat(5, minmax(0, 1fr)); } }

  .produit-carte {
    position: relative; height: 100%;
    background: var(--surface); border: 1px solid var(--bordure);
    box-shadow: var(--ombre); overflow: hidden;
    transition: transform .3s cubic-bezier(.2,.7,.3,1), box-shadow .3s, border-color .3s;
    display: flex; flex-direction: column; text-align: left; padding: 0;
    font-family: var(--corps);
  }
  .produit-carte:hover, .produit-carte:focus-within { transform: translateY(-5px); border-color: var(--magenta); box-shadow: 0 12px 30px rgba(53,55,62,.18); }

  /* La zone d'image. `overflow: hidden` coupe le fond etendu et le
     grossissement de 6 % au survol : c'est lui qui borne, pas un cadre pose
     sur l'image. */
  .produit-carte .visuel {
    position: relative; aspect-ratio: 3 / 4; overflow: hidden;
    display: flex; align-items: center; justify-content: center;
    background: var(--fond-alt);
  }
  /* Fond etendu : une copie de la meme image, etalee sur toute la zone,
     floutee a 48 px, desaturee et eclaircie. Ce n'est plus une image, c'est un
     aplat : rien n'y est lisible, il ne sert qu'a donner au vide le degrade de
     clarte que la photo a elle-meme du haut vers le bas, pour que le raccord
     avec le visuel ne se voie pas.

     Trois essais avant celui-ci, tous mesures sur
     /produit/porte-brochures-box/ (cinq visuels en 700x525) :
       - copie recadree en `cover` : on ne voyait que la bande centrale de la
         photo, donc le produit. Le haut d'une carte virait au vert, celui de
         la voisine au brun : les cartes etaient barrees de bandeaux colores.
       - copie etalee, flou 30 px, sans desaturation : mieux, mais la couleur
         du produit bavait encore dans les bandes.
       - degrade gris fixe : propre, mais il suppose que tous les visuels ont
         le fond de studio gris des 26 fiches de signaletique. Les autres vont
         du rose au brun sombre, il aurait fallu le reregler a chaque photo.
     La desaturation a 0,35 regle le probleme a la racine : elle enleve la
     couleur, pas la lumiere. La bande suit la clarte de la photo et n'en
     reprend pas la teinte.

     La regle du projet ("jamais de recadrage, jamais de deformation") porte
     sur le visuel produit, celui que le visiteur regarde : lui est intact,
     entier, a son format naturel, juste au-dessus. Le fond, a 48 px de flou et
     sans couleur, n'a plus ni forme ni contour a deformer.

     Le build ne pose ce fond que sur les 36 visuels sur 59 qui ne remplissent
     pas la zone. */
  .produit-carte .visuel-fond {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    /* Le flou deborde de l'element et laisse ses bords se dissoudre :
       l'agrandissement de 8 % repousse cette dissolution hors de la zone. */
    transform: scale(1.08);
    filter: blur(48px) saturate(.35) brightness(1.06);
    pointer-events: none;
  }
  /* Le voile ramene toutes les bandes au meme niveau de clarte, pour qu'une
     photo sombre ne donne pas une carte sombre. Il n'existe que sur les zones
     qui ont un fond a temperer : c'est le build qui pose `visuel-etendu`, lui
     seul sait quels visuels remplissent la zone. */
  .produit-carte .visuel-etendu::before {
    content: ""; position: absolute; inset: 0; z-index: 1;
    background: color-mix(in srgb, var(--surface) 35%, transparent);
    pointer-events: none;
  }
  /* Aucun recadrage : ni `object-fit: cover`, ni hauteur imposee. L'image
     prend la plus grande taille qui tient dans la zone en gardant son format,
     et se centre. Un 525x700 la remplit exactement, un 466x700 laisse 5,6 %
     de chaque cote, un 700x525 laisse 21,9 % en haut et en bas ; dans les
     deux derniers cas c'est le fond etendu qu'on voit, pas une bande. */
  .produit-carte .image {
    position: relative; z-index: 2; /* au-dessus du fond etendu et de son voile */
    max-width: 100%; max-height: 100%;
    width: auto; height: auto; display: block;
    transition: transform .5s;
    /* Sans cela l'image, qui est empilee au-dessus du lien etire sur la
       carte, avale le clic : mesure au centre de la zone d'image, l'element
       vise etait `img.image` et non `a.carte-lien`, et cliquer sur la photo
       ne menait nulle part. Elle n'a aucun evenement a recevoir, le survol
       est porte par la carte. */
    pointer-events: none;
  }
  .produit-carte:hover .image { transform: scale(1.06); }

  /* Panneau de survol, repris du site en ligne (`.mpcth-product-panel`,
     apparition en 0,25 s ease-out). Il ne porte que l'apercu rapide : le
     panier et les favoris n'existent pas encore, et un bouton qui ne fait
     rien est pire que pas de bouton. */
  .produit-carte .carte-actions {
    position: absolute; left: 0; right: 0; bottom: 0; z-index: 3;
    transform: translateY(100%);
    transition: transform .25s ease-out, opacity .25s ease-out;
    opacity: 0;
  }
  .produit-carte:hover .carte-actions,
  .produit-carte:focus-within .carte-actions { transform: none; opacity: 1; }
  .carte-action {
    width: 100%; border: 0; cursor: pointer;
    display: flex; align-items: center; justify-content: center; gap: .4rem;
    padding: .6rem .5rem; min-height: 40px;
    background: var(--magenta); color: #fff;
    font-family: var(--corps); font-size: .72rem; font-weight: 700;
    letter-spacing: .08em; text-transform: uppercase;
  }
  .carte-action:hover { background: var(--magenta-fonce); }
  .carte-action:focus-visible { outline: 3px solid var(--anthracite); outline-offset: -3px; }
  .carte-action-icone {
    width: 15px; height: 15px; flex: none;
    fill: none; stroke: currentColor; stroke-width: 1.7;
    stroke-linecap: round; stroke-linejoin: round;
  }
  /* Sans souris, il n'y a pas de survol : le panneau reste affiche, sinon
     l'apercu serait inatteignable au doigt. Il passe a 44 px de haut, la
     hauteur de cible tactile recommandee. Le lien de la carte, lui, couvre
     toute la carte et marche dans tous les cas : le doigt qui rate le
     panneau tombe sur la fiche, jamais dans le vide. */
  @media (hover: none) {
    .produit-carte .carte-actions { transform: none; opacity: 1; }
    .carte-action { min-height: 44px; }
  }

  .produit-carte .infos {
    margin-top: auto;
    padding: .95rem 1rem 1.05rem; border-top: 1px solid var(--bordure);
    background: var(--surface);
  }
  /* Trois lignes reservees, ni plus ni moins.
     C'est le dernier ecart de hauteur entre deux cartes d'une meme rangee :
     la zone d'image ayant un rapport fixe, seul le titre pouvait encore
     varier, et il variait (mesure sur /produit/bachepvc/ : bloc de texte a
     85,4 px pour "MESH OU GRILLE AU M2" contre 107,4 px pour "ADHESIF
     MICRO-PERFORE LUXE LC M2", soit 22 px de vide sous l'image des cartes a
     titre court).

     Trois et non deux : a deux lignes, six noms sur 59 etaient coupes en
     boutique, dont les quatre rubans adhesifs, qui ne different que par leur
     fin ("108 unites 1 CLS", "36 unites 2CLS"). Un nom tronque juste avant ce
     qui le distingue de son voisin n'est pas acceptable, et ces quatre-la
     s'affichent cote a cote.

     L'interligne descend a 1,35 : trois lignes serrees coutent 11,7 px de
     plus que deux lignes a 1,6, pas 22, et un titre en capitales grasses se
     lit mieux serre.

     Le site en ligne resout la meme chose autrement : il fige son bloc de
     texte a 5,25em avec `overflow: hidden` et ne montre le titre qu'au
     survol, donc la question du nom trop long ne s'y pose pas. */
  .produit-carte .nom {
    font-weight: 700; font-size: .86rem; letter-spacing: .05em;
    line-height: 1.35;
    text-transform: uppercase; color: var(--magenta); margin: 0 0 .35rem;
    min-height: 4.05em; /* 3 lignes a line-height 1.35 */
    display: -webkit-box; -webkit-box-orient: vertical;
    -webkit-line-clamp: 3; line-clamp: 3; overflow: hidden;
  }
  /* Le titre est le lien de la carte, et son pseudo-element couvre toute la
     carte : on clique n'importe ou pour aller sur la fiche. Le panneau de
     survol passe au-dessus grace a son `z-index`. Un `<button>` dans un `<a>`
     n'etant pas du HTML valide, c'est cette construction qui remplace la
     carte-lien d'avant. */
  .produit-carte .carte-lien { color: inherit; text-decoration: none; }
  .produit-carte .carte-lien::after { content: ""; position: absolute; inset: 0; z-index: 1; }
  .produit-carte .carte-lien:focus-visible { outline: 3px solid var(--magenta); outline-offset: 2px; }
  .produit-carte .tarif { font-size: .85rem; color: var(--texte-doux); font-variant-numeric: tabular-nums; margin: 0; }
  .produit-carte .tarif b { color: var(--texte); font-size: 1rem; }
  .produit-carte .tarif .unite {
    display: block; font-size: .74rem; line-height: 1.35; color: var(--texte-leger);
  }

  .table-enveloppe { overflow-x: auto; }
  table { border-collapse: collapse; width: 100%; font-size: .9rem; min-width: 420px; }
  th, td { padding: .6rem .8rem; text-align: left; border-bottom: 1px solid var(--bordure); }
  th { font-family: var(--corps); font-weight: 700; text-transform: uppercase; letter-spacing: .06em; font-size: .74rem; color: var(--texte-doux); }
  td:not(:first-child), th:not(:first-child) { text-align: right; font-variant-numeric: tabular-nums; }
  tr.actif td { background: color-mix(in srgb, var(--magenta) 10%, transparent); font-weight: 700; }

  @media (prefers-reduced-motion: reduce) {
    *, .diapo.active .visuel img { transition: none !important; animation: none !important; }
    .diapo .eyebrow, .diapo h2, .diapo .legende-visuel, .diapo .cta { opacity: 1; transform: none; }
  }

/* ============ Pages produit ============ */
.fil {
  font-size: .78rem; letter-spacing: .05em; text-transform: uppercase;
  color: var(--texte-leger); padding: 1rem 0;
}
.fil a { color: var(--texte-doux); text-decoration: none; }
.fil a:hover { color: var(--magenta); }
.fil .courant { color: var(--magenta); }

.produit-haut { display: grid; gap: var(--gouttiere); grid-template-columns: 1fr; align-items: start; }
/* Deux colonnes strictement egales, comme sur la page en ligne : la colonne
   image et la colonne resume y font 600 px chacune dans un conteneur de
   1200, soit 560 px de contenu de part et d'autre d'une gouttiere de 40 px.
   `.contenu` faisant 1160 px de contenu utile, `1fr 1fr` avec 40 px de
   gouttiere redonne 560 | 40 | 560 au pixel pres. Le rapport 1.02 qui
   trainait ici deportait la separation de 6 px vers la gauche.

   `minmax(0, 1fr)` et non `1fr` : une colonne de grille prend par defaut la
   largeur de son plus grand contenu insecable (une image, un tableau), ce qui
   pousse la page au-dela de la fenetre. C'est la cause classique du
   debordement horizontal d'une fiche produit. */
@media (min-width: 900px) {
  .produit-haut { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}
.produit-haut > * { min-width: 0; }
@media (min-width: 900px) { .produit-achat { position: sticky; top: 1rem; } }
h1.produit-titre {
  font-family: var(--corps); font-weight: 700;
  font-size: clamp(1.4rem, 3vw, 1.9rem);
  text-transform: uppercase; letter-spacing: .04em;
  color: var(--magenta); margin: 0 0 .3rem;
}
.produit-prixbase { font-size: 1.05rem; color: var(--texte-doux); margin: 0 0 1.4rem; }
.produit-prixbase b { color: var(--texte); font-size: 1.3rem; }

/* ============ Apercu rapide d'un produit ============
   Le "Quickview" du site en ligne. Sur pixelprint.fr le panneau de survol
   porte "Ajouter au panier", "Quickview" et une etoile de favori ; ici seul
   l'apercu existe pour de bon, et il est construit pour de bon.

   C'est un `<dialog>` natif : voile, piege a focus et fermeture par Echap
   viennent du navigateur. Le script est genere par tools/build_maquette.py
   dans build/js/apercu.js, pour que ses libelles suivent la langue du build. */
.apercu {
  border: 0; padding: 0; background: transparent;
  max-width: min(880px, calc(100vw - 2rem));
  max-height: calc(100vh - 2rem);
  color: var(--texte);
}
.apercu::backdrop { background: rgba(28,29,33,.62); }
.apercu-boite {
  position: relative; background: var(--surface);
  border: 1px solid var(--bordure); box-shadow: 0 24px 60px rgba(28,29,33,.35);
  max-height: calc(100vh - 2rem); overflow-y: auto;
}
.apercu-fermer {
  position: absolute; top: .5rem; right: .5rem; z-index: 2;
  width: 40px; height: 40px; display: grid; place-items: center;
  border: 0; background: var(--surface); color: var(--texte-doux); cursor: pointer;
}
.apercu-fermer svg {
  width: 18px; height: 18px; fill: none; stroke: currentColor;
  stroke-width: 1.8; stroke-linecap: round;
}
.apercu-fermer:hover { color: var(--magenta); }
.apercu-fermer:focus-visible { outline: 3px solid var(--magenta); outline-offset: -3px; }

.apercu-corps { display: grid; gap: 0; grid-template-columns: 1fr; }
@media (min-width: 720px) {
  .apercu-corps { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}
/* Meme regle que sur les cartes : l'image garde son format naturel, elle est
   centree, elle n'est ni recadree ni etiree. */
.apercu-visuel {
  display: flex; align-items: center; justify-content: center;
  background: var(--fond-alt); padding: 1rem; min-width: 0;
}
.apercu-visuel img {
  display: block; width: auto; height: auto;
  max-width: 100%; max-height: min(58vh, 420px);
}
.apercu-texte { padding: 1.6rem 1.5rem 1.7rem; min-width: 0; }
.apercu-categorie {
  margin: 0 0 .35rem; font-size: .7rem; letter-spacing: .12em;
  text-transform: uppercase; color: var(--texte-leger);
}
.apercu-nom {
  font-family: var(--corps); font-weight: 700;
  font-size: clamp(1.15rem, 2.4vw, 1.45rem);
  text-transform: uppercase; letter-spacing: .04em;
  color: var(--magenta); margin: 0 0 .7rem;
}
.apercu-prix {
  margin: 0 0 .6rem; font-size: .95rem; color: var(--texte-doux);
  font-variant-numeric: tabular-nums;
  display: flex; align-items: baseline; flex-wrap: wrap; gap: .4rem;
}
.apercu-prix .apercu-depuis { font-size: .8rem; }
.apercu-prix del { color: var(--texte-leger); }
.apercu-prix b { color: var(--texte); font-size: 1.35rem; }
.apercu-mesure { margin: 0 0 1rem; font-size: .85rem; color: var(--texte-doux); }
.apercu-options { margin: 0 0 1.4rem; }
.apercu-options-titre {
  margin: 0 0 .45rem; font-size: .7rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--texte-leger);
}
.apercu-options-liste {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: .3rem;
}
.apercu-options-liste li {
  font-size: .72rem; color: var(--texte-doux);
  border: 1px solid var(--bordure); border-radius: 3px; padding: .2rem .45rem;
}
.apercu-options-vide { margin: 0; font-size: .82rem; color: var(--texte-doux); }
.apercu-lien { display: inline-block; }

/* ============ Indication de palier degressif ============ */
.palier-info {
  margin-top: .9rem; padding: .7rem .85rem;
  border-left: 3px solid var(--magenta);
  background: color-mix(in srgb, var(--magenta) 7%, transparent);
  font-size: .85rem; color: var(--texte-doux);
}
.palier-info strong { color: var(--magenta); }

/* ============ Pages editoriales ============ */
/* Le contenu occupe toute la largeur du conteneur, comme sur le site.
   Seuls les paragraphes de texte long sont brides pour rester lisibles. */
/* Les blocs de texte occupent toute la largeur du conteneur. Ils etaient
   plafonnes a 78 caracteres, ce qui laissait la moitie droite de l'ecran vide
   sur les pages editoriales. La lecture reste tenable parce que la hauteur de
   ligne et la taille de police sont genereuses ; si une page tres longue
   devient penible a lire sur un tres grand ecran, c'est `--large` qu'il faut
   reduire, pas ce plafond qu'il faut remettre. */
/* `break-word` ne coupe que les mots qui ne tiennent pas seuls sur la ligne.
   Sans lui, la politique de confidentialite debordait de 57 px sur un ecran de
   375 px : elle cite des adresses comme
   http://www.networkadvertising.org/managing/opt_out.asp, insecables. */
.page-contenu { max-width: none; overflow-wrap: break-word; }
.page-contenu h1 {
  font-family: var(--corps); font-weight: 400;
  font-size: clamp(1.05rem, 2.2vw, 1.35rem);
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--texte-doux);
  margin: 0 0 2.2rem; padding: 0;
  border-bottom: 1px solid var(--bordure);
  line-height: 2.4; position: relative;
}
.page-contenu h1::before {
  content: ""; position: absolute; left: 0; bottom: -1px;
  width: 14em; max-width: 100%; height: 2px; background: var(--magenta);
}
.page-contenu h2, .page-contenu h3, .page-contenu h4 {
  font-family: var(--corps); font-weight: 700; color: var(--texte);
  letter-spacing: .02em; margin: 2rem 0 .6rem; line-height: 1.3;
}
.page-contenu h2 { font-size: 1.25rem; }
.page-contenu h3 { font-size: 1.08rem; }
.page-contenu h4 { font-size: .98rem; }
.page-contenu p { margin: 0 0 1rem; color: var(--texte-doux); }
.page-contenu ul, .page-contenu ol { margin: 0 0 1.2rem; padding-left: 1.3rem; color: var(--texte-doux); }
.page-contenu li { margin-bottom: .35rem; }
.page-contenu a { color: var(--magenta); }
/* Un bouton reste un bouton, meme dans un contenu de page. La regle
   ci-dessus (0,1,1) l'emportait sur `.bouton` (0,1,0) : le libelle prenait le
   magenta du texte de lien sur un fond deja magenta, et le bouton s'affichait
   comme un rectangle rose vide. Visible sur /panier/ ("Voir la boutique"), en
   clair comme en sombre. */
.page-contenu a.bouton { color: #fff; }
.page-contenu a.bouton.creux { color: var(--magenta); }
.page-contenu a.bouton.creux:hover, .page-contenu a.bouton.creux:focus-visible { color: #fff; }
.page-contenu strong { color: var(--texte); }
.page-contenu table { margin-bottom: 1.3rem; }
.page-contenu blockquote {
  margin: 0 0 1.2rem; padding-left: 1rem;
  border-left: 3px solid var(--bordure); color: var(--texte-leger);
}


/* ============ Pied de page, reprise fidele du site ============ */
footer#pied {
  position: relative;
  background: #4A4C55 url('/img/fond-footer.jpg') center/cover no-repeat;
  color: #C9CAD0;
}
footer#pied::before {
  content: ""; position: absolute; inset: 0;
  background: rgba(58,60,67,.88);
}
footer#pied > * { position: relative; }

/* ---- Premier etage : quatre colonnes de produits ----
   Le pied du site en ligne a deux etages de colonnes, le notre n'en avait
   qu'un. Releve dans le navigateur sur https://www.pixelprint.fr/ : trois
   `.mpcth-footer-wrap` de 1200 px, le premier portant quatre widgets de
   300 px (Meilleurs ventes, Recemment vu, Produits les mieux notes,
   Promotion), trois produits chacun, vignette de 75x100 au format naturel,
   prix barre quand le produit est en promotion.

   Une difference assumee avec le site en ligne : son premier etage est sur
   fond blanc, le second sur fond sombre. Le pied de la refonte a une seule
   image de fond sombre qui court sur toute sa hauteur, et le client n'a rien
   demande sur les couleurs. Les deux etages restent donc sur ce fond, separes
   par un filet. A signaler si le blanc est voulu. */
/* Etage produits : fond clair, comme sur le site d'origine, ou il est
   transparent au-dessus du corps de page. Il etait pose sur l'image sombre du
   pied, ce qui l'assombrissait et ecrasait les vignettes. Mesures relevees sur
   https://www.pixelprint.fr/produit/bachepvc/ : titres, noms et prix en 13px,
   vignettes 75x100, titres et prix en #666, noms en #EA148C. */
/* Hauteur resserree a la demande du client : marges des deux etages
   ramenees de 2,8/3 rem a 1,8/2 rem, interlignes des listes reduits, barre
   du bas de 1 rem a 0,7. Les tailles de police ne bougent pas : celles du
   nuage et des vignettes sont mesurees sur le site en ligne. */
.pied-produits {
  background: var(--fond);
  border-bottom: 1px solid var(--bordure);
}
/* `padding-block` et non `padding` : la marge interne de 20 px que `.contenu`
   pose a gauche et a droite doit survivre, sinon les colonnes du pied
   commencent 20 px plus a gauche que le texte de la page et le pied cesse
   d'etre cale sur le menu. Sur un ecran de 375 px, elles touchaient le bord. */
.pied-produits-colonnes {
  display: grid; gap: 2rem;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  padding-block: 1.8rem 1.6rem;
  align-items: start;
}
@media (max-width: 1000px) { .pied-produits-colonnes { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2rem; } }
@media (max-width: 560px)  { .pied-produits-colonnes { grid-template-columns: 1fr; } }

.pied-produits-liste { list-style: none; margin: 0; padding: 0; }
/* `hidden` doit gagner : la colonne "Recemment vu" reste masquee tant que le
   script du pied n'a rien a y mettre. */
.pied-produits-liste[hidden], .pied-produits-vide[hidden] { display: none; }

.pied-produit + .pied-produit { border-top: 1px solid var(--bordure); }
.pied-produit a { display: flex; align-items: flex-start; gap: .8rem; padding: .55rem 0; }
/* Largeur imposee, hauteur libre : la vignette garde son format naturel, sans
   recadrage ni cadre, comme partout ailleurs sur le site. Le site en ligne
   affiche ici du 75x100, ce que donne un visuel 525x700 pose sur 75 px. */
/* Hauteur bornee en plus de la largeur. Les visuels vont du 525x700 au
   750x229 : sans plafond, un portrait pousse sa ligne a 129 px quand un
   paysage tient en 73, et c'est la colonne la plus haute qui fixe la hauteur
   de tout l'etage. `contain` ne recadre pas, il fait tenir l'image entiere
   dans la boite : la regle du client ("pas de recadrage, laisse l'image
   s'adapter a son format") tient, l'image est seulement plus petite. */
.pied-produit img {
  width: 75px; height: auto; max-height: 75px;
  object-fit: contain; object-position: left top;
  flex: none; display: block;
}
.pied-produit-texte { display: flex; flex-direction: column; gap: .3rem; min-width: 0; }
footer#pied .pied-produit-nom { font-size: 13px; line-height: 1.35; color: #EA148C; overflow-wrap: anywhere; transition: color .15s; }
.pied-produit a:hover .pied-produit-nom { color: var(--magenta); }
.pied-produit-prix { font-size: 13px; color: #666; font-variant-numeric: tabular-nums; }
.pied-produit-prix del { color: #9B9DA6; text-decoration: line-through; margin-right: .4rem; }
.pied-produit-prix ins { color: #666; text-decoration: none; font-weight: 700; }
.pied-produits-vide { margin: .4rem 0 0; font-size: 13px; color: #666; line-height: 1.5; }

/* ---- Second etage : les colonnes de liens ---- */
.pied-colonnes {
  display: grid; gap: 2rem;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  padding-block: 2rem 1.8rem;
  align-items: start;
}
.pied-bloc h4, .pied-produits-bloc h4 {
  font-family: var(--corps); font-weight: 400;
  font-size: 1rem; letter-spacing: .14em; text-transform: uppercase;
  color: #EDEBEE; margin: 0 0 .7rem; padding-bottom: .6rem;
  position: relative;
}
/* le filet magenta court sur le tiers gauche, comme sur le site */
.pied-bloc h4::after, .pied-produits-bloc h4::after {
  content: ""; position: absolute; left: 0; bottom: 0;
  width: 100%; height: 2px;
  background: linear-gradient(90deg, var(--magenta) 0 34%, rgba(255,255,255,.25) 34% 100%);
}
.pied-bloc ul { list-style: none; margin: 0; padding: 0; }
.pied-bloc li { padding: .3rem 0; font-size: .95rem; }
footer#pied a { color: #C9CAD0; text-decoration: none; transition: color .15s; }
footer#pied a:hover { color: var(--magenta); }

.pied-menu li { position: relative; padding-left: 1rem; }
.pied-menu li::before {
  content: "\203A"; position: absolute; left: 0; color: var(--magenta);
}
.pied-menu li:first-child a,
.pied-menu li:nth-child(3) a { color: var(--magenta); }

/* Nuage de mots du pied, releve au pixel sur
   https://www.pixelprint.fr/produit/bachepvc/ : trois paliers de taille, et
   le rose palit a mesure que le mot grossit. C'est ce degrade qui lui donne
   son relief ; une taille unique le rendait plat.
     10,7px  #E6007E  magenta plein   (11 mots sur 20)
     14,7px  #E5218D  rose            (8 mots)
     24px    #E570B0  rose pale       (1 mot, le plus frequent)
   Interligne 21px, mots en flux (`inline`), pas en bloc. */
.nuage { line-height: 21px; }
footer#pied .nuage a {
  display: inline;
  margin-right: .45rem;
  color: #E6007E;
  font-size: 10.7px;
  transition: color .15s;
}
footer#pied .nuage a:hover { color: #fff; }
footer#pied .nuage .t0  { font-size: 10.7px; color: #E6007E; }
footer#pied .nuage .t5  { font-size: 14.7px; color: #E5218D; }
footer#pied .nuage .t10 { font-size: 24px;   color: #E570B0; }

/* ============ Moyens de paiement ============
   Image fournie par le client (PayPal, CB, Mastercard, Visa), sur fond
   transparent : elle se pose directement sur le fond sombre du pied, sans
   cadre blanc. L'infobulle de reassurance est un element du document et non
   un attribut `title` : elle apparait sans delai, repond au clavier, et se
   traduit avec le reste du site. */
.pied-paiement { display: flex; justify-content: center; align-items: flex-start; }

/* Reduite de 30 % a la demande du client : 260px -> 182px. */
.paiement { position: relative; display: inline-block; max-width: 182px; }
.paiement img { width: 100%; height: auto; display: block; }
.paiement:focus-visible { outline: 3px solid var(--magenta); outline-offset: 6px; border-radius: 3px; }

.paiement-bulle {
  position: absolute; bottom: calc(100% + 10px); left: 50%;
  transform: translateX(-50%) translateY(4px);
  width: max-content; max-width: 290px;
  background: #17181C; color: #EDEBEE;
  border: 1px solid rgba(255,255,255,.16); border-radius: 5px;
  padding: .6rem .75rem;
  font-size: .74rem; line-height: 1.5; text-align: left;
  box-shadow: 0 10px 28px rgba(0,0,0,.45);
  opacity: 0; visibility: hidden;
  transition: opacity .16s ease, transform .16s ease, visibility .16s;
  z-index: 20;
}
/* La fleche pointe vers l'image. */
.paiement-bulle::after {
  content: ""; position: absolute; top: 100%; left: 50%; margin-left: -6px;
  border: 6px solid transparent; border-top-color: #17181C;
}
.paiement:hover .paiement-bulle,
.paiement:focus .paiement-bulle,
.paiement:focus-visible .paiement-bulle {
  opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0);
}

/* Au dela du bord droit du pied, l'infobulle sortirait de l'ecran : sur
   mobile elle se cale sur la largeur de la colonne. */
@media (max-width: 900px) {
  .paiement-bulle { left: 0; transform: none; max-width: 100%; }
  .paiement-bulle::after { left: 2rem; }
  .paiement:hover .paiement-bulle,
  .paiement:focus .paiement-bulle { transform: none; }
}

.pied-bas {
  border-top: 1px solid rgba(255,255,255,.14);
  background: rgba(0,0,0,.18);
  padding: .7rem 0;
}
.pied-bas .contenu {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; flex-wrap: wrap;
}
/* La signature est desormais un lien vers atonweb, texte et logo compris. */
.pied-signature { margin: 0; font-size: .85rem; color: #9B9DA6; }
.pied-signature a {
  display: inline-flex; align-items: center; gap: .5rem;
  color: #9B9DA6; text-decoration: none; transition: color .15s;
}
.pied-signature a:hover { color: var(--magenta); }
.pied-signature a:focus-visible { outline: 2px solid var(--magenta); outline-offset: 3px; }
.pied-signature img { height: 14px; width: auto; }  /* ratio 44x14 preserve */
.pied-sociaux { margin: 0; display: flex; gap: 1.1rem; align-items: center; }
.pied-sociaux svg { width: 15px; height: 15px; fill: #9B9DA6; transition: fill .15s; }
.pied-sociaux a:hover svg { fill: var(--magenta); }

@media (max-width: 640px) {
  .pied-bas .contenu { justify-content: center; text-align: center; }
}

/* ============ Formulaires repris du site ============ */
.page-contenu form {
  display: grid; gap: 1rem;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  margin: 1.5rem 0 2rem; max-width: none;
}
.page-contenu form > p { display: flex; flex-direction: column-reverse; gap: .35rem; margin: 0; }
.page-contenu form > p:has(textarea) { grid-column: 1 / -1; }
.page-contenu form label {
  font-family: var(--corps); font-weight: 700; font-size: .76rem;
  letter-spacing: .08em; text-transform: uppercase; color: var(--texte-doux);
}
.page-contenu form input,
.page-contenu form textarea,
.page-contenu form select {
  width: 100%; padding: .68rem .8rem;
  font-family: var(--corps); font-size: 1rem;
  color: var(--texte); background: var(--fond);
  border: 1px solid var(--bordure); border-radius: 0;
}
.page-contenu form textarea { min-height: 150px; resize: vertical; }
.page-contenu form input:focus,
.page-contenu form textarea:focus { outline: 2px solid var(--magenta); outline-offset: 1px; }
.page-contenu form input[type="submit"] {
  grid-column: 1 / -1; width: auto; justify-self: start; cursor: pointer;
  padding: .8rem 1.8rem; background: var(--magenta); color: #fff;
  border: 2px solid var(--magenta);
  font-weight: 700; font-size: .85rem; letter-spacing: .07em; text-transform: uppercase;
}
.page-contenu form input[type="submit"]:hover { background: var(--magenta-fonce); border-color: var(--magenta-fonce); }
.page-contenu form input[type="file"] { padding: .5rem; background: var(--fond-alt); }


/* ============ Pages editoriales : titres a filet, comme le theme ============
   Un filet gris clair sur toute la largeur, avec un segment magenta sous le
   texte seulement. C'est la signature visuelle des titres du site. */
.page-contenu h2 {
  font-family: var(--corps); font-weight: 400;
  font-size: clamp(1.05rem, 2.2vw, 1.35rem);
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--texte-doux);
  margin: 2.8rem 0 2rem; padding: 0;
  border-bottom: 1px solid var(--bordure);
  line-height: 2.4;
}
.page-contenu h2 > span,
.page-contenu h2::after { display: none; }
.page-contenu h2 {
  display: block; position: relative;
}
.page-contenu h2::before {
  content: ""; position: absolute; left: 0; bottom: -1px;
  width: var(--filet, 14em); max-width: 100%; height: 2px;
  background: var(--magenta);
}
.page-contenu > h2:first-of-type { margin-top: 0; }

/* ============ Formulaires : placeholders seuls, champs souples ============
   Le formulaire d'origine n'affiche aucun libelle visible, tout passe par le
   placeholder. On garde les <label> pour les lecteurs d'ecran, mais hors flux. */
.page-contenu form {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 2.2rem 1.6rem;
  margin: 0 0 2.5rem;
}
@media (max-width: 900px) { .page-contenu form { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .page-contenu form { grid-template-columns: 1fr; gap: 1.2rem; } }

.page-contenu form > p { margin: 0; display: block; }
.page-contenu form > p:has(textarea) { grid-column: 1 / -1; }

.page-contenu form label {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}

.page-contenu form input,
.page-contenu form textarea,
.page-contenu form select {
  width: 100%;
  padding: 1.05rem 1.2rem;
  font-family: var(--corps); font-size: 1rem; font-weight: 400;
  color: var(--texte);
  background: #FFFFFF;
  border: 1px solid #EEEEEE;
  border-radius: 0;
  transition: border-color .18s;
}
.page-contenu form input::placeholder,
.page-contenu form textarea::placeholder { color: var(--texte-leger); opacity: 1; }
.page-contenu form input:hover,
.page-contenu form textarea:hover { border-color: #DDD9DB; }
.page-contenu form input:focus,
.page-contenu form textarea:focus { outline: none; border-color: var(--magenta); }
.page-contenu form textarea { min-height: 190px; resize: vertical; }
/* Le selecteur de fichier natif ne se dimensionne pas comme un champ texte :
   on lui rend la meme hauteur et la meme largeur que ses voisins. */
.page-contenu form input[type="file"] {
  padding: .8rem 1.2rem; cursor: pointer; background: #FFFFFF;
  font-size: .9rem; line-height: 1.6;
}
.page-contenu form input[type="file"]::file-selector-button {
  margin-right: .8rem; padding: .45rem 1rem; cursor: pointer;
  font-family: var(--corps); font-size: .82rem; font-weight: 700;
  letter-spacing: .05em; text-transform: uppercase;
  color: var(--texte-doux); background: #F5F5F5;
  border: 1px solid #EEEEEE;
}
.page-contenu form input[type="file"]::file-selector-button:hover {
  color: #fff; background: var(--magenta); border-color: var(--magenta);
}

.page-contenu form input[type="submit"] {
  grid-column: 1 / -1; justify-self: end; width: auto;
  padding: .95rem 3rem; cursor: pointer;
  background: #F5F5F5; color: var(--texte-doux);
  border: 1px solid #EEEEEE;
  font-weight: 700; font-size: .85rem; letter-spacing: .12em; text-transform: uppercase;
}
.page-contenu form input[type="submit"]:hover {
  background: var(--magenta); color: #fff; border-color: var(--magenta);
}

/* Images des pages : ratio d'origine toujours preserve */
.page-contenu img {
  max-width: 100%; height: auto; display: block; margin: 1.4rem 0;
}
.page-contenu figure { margin: 1.4rem 0; }

/* Les champs restent blancs en clair ; en sombre on garde le contraste. */
@media (prefers-color-scheme: dark) {
  .page-contenu form input, .page-contenu form textarea, .page-contenu form select {
    background: #1B1C22; border-color: #33343D; color: var(--texte);
  }
  .page-contenu form input[type="submit"] { background: #23242B; border-color: #33343D; }
}
:root[data-theme="dark"] .page-contenu form input,
:root[data-theme="dark"] .page-contenu form textarea,
:root[data-theme="dark"] .page-contenu form select {
  background: #1B1C22; border-color: #33343D; color: var(--texte);
}
:root[data-theme="dark"] .page-contenu form input[type="submit"] {
  background: #23242B; border-color: #33343D;
}

/* ============ Carte Google Maps du contact ============ */
.page-contenu iframe {
  width: 100%; height: 420px; border: 1px solid var(--bordure);
  display: block; margin: 2rem 0 0;
}
@media (max-width: 700px) { .page-contenu iframe { height: 300px; } }

/* ============ Navigation mobile ============
   Sous 900px, le menu horizontal a six entrees et sous-menus ne tient pas.
   Il bascule en panneau deroulant commande par un bouton. */
.burger {
  display: none; position: absolute; left: 20px; top: 50%;
  transform: translateY(-50%);
  width: 42px; height: 34px; padding: 0; cursor: pointer;
  background: #F2F0F1; border: 1px solid #DDD9DB;
}
.burger span {
  display: block; width: 18px; height: 2px; margin: 3px auto;
  background: #6E7079; transition: background .15s;
}
.burger:hover span { background: var(--magenta); }

@media (max-width: 900px) {
  .burger { display: block; }
  /* Le menu etant replie, la barre n'a plus de hauteur propre : on lui en
     donne une pour que le burger et les outils ne chevauchent pas le logo. */
  .nav-barre .contenu { min-height: 54px; }
  .burger { left: 20px; top: 27px; }
  .nav-outils { top: 27px; }
  nav ul.principal {
    display: none; flex-direction: column; align-items: stretch;
    padding: .5rem 0 1rem;
  }
  nav ul.principal.ouvert { display: flex; }
  .tiret-marque { display: none; }
  .a-menu { position: static; }
  .a-menu > a { padding: .8rem 0; border-bottom: 1px solid var(--bordure); }
  .a-menu > a:hover, .a-menu:focus-within > a { border-bottom-color: var(--magenta); }
  /* les sous-menus se deplient dans le flux, pas en survol */
  .deroulant {
    position: static; transform: none; opacity: 1; visibility: visible;
    display: none; min-width: 0; width: 100%;
    border: 0; border-left: 3px solid var(--magenta); box-shadow: none;
    padding: .6rem 0 .6rem 1rem; margin-bottom: .4rem;
  }
  .deroulant.mega { flex-direction: column; min-width: 0; gap: .8rem; }
  .a-menu.deplie .deroulant { display: block; }
  .a-menu.deplie .deroulant.mega { display: flex; }
  .a-menu:hover .deroulant, .a-menu:focus-within .deroulant { opacity: 1; visibility: visible; }
  .nav-outils { top: 50%; }
  .barre-haute .contenu { justify-content: center; font-size: .68rem; gap: .7rem; }
  .barre-haute .sociaux { margin-left: 0; width: 100%; justify-content: center; }
}

@media (max-width: 560px) {
  .logo { padding: 1.3rem 0 .9rem; }
  .logo img { width: min(210px, 62vw); }
  .barre-haute .contenu { font-size: .64rem; gap: .55rem; padding: .5rem 0; }
}

/* ============ Slider en petit ecran ============
   Rien a repositionner : les couches sont en pourcentages de la grille
   1900x783 et les polices en cqw, tout retrecit d'un bloc, comme le
   Revolution Slider d'origine. Seules les commandes s'adaptent : plus
   petites, pour ne pas couvrir les couches d'un bandeau qui ne fait plus
   que ~155 px de haut sur un telephone. */
@media (max-width: 760px) {
  .fleche { width: 30px; height: 30px; font-size: .95rem; }
  .puces { bottom: .4rem; }
  .puce { width: 22px; height: 3px; }
}

/* Titre de page visible sur la boutique */
.titre-page {
  font-family: var(--corps); font-weight: 400;
  font-size: clamp(1.15rem, 2.4vw, 1.5rem);
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--texte-doux); margin: .6rem 0 0;
}
/* Titre reserve aux moteurs et lecteurs d'ecran sur l'accueil */
.titre-invisible {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}

/* ============ Menu de compte de la barre haute ============
   Rempli par js/session.js selon la session. Les liens gardent le gap et le
   repli de leurs voisins de la barre : le conteneur reprend donc les memes
   valeurs a chaque palier de largeur. Le centrage sert en petit ecran, quand
   les quatre entrees du menu connecte passent sur deux lignes. */
.menu-compte {
  display: inline-flex; align-items: center; justify-content: center;
  flex-wrap: wrap; gap: 1.1rem; max-width: 100%; min-width: 0;
}
.menu-compte .salut { color: #fff; font-weight: 700; }
@media (max-width: 900px) { .menu-compte { gap: .7rem; } }
@media (max-width: 560px) { .menu-compte { gap: .55rem; } }

/* ============ Espace client (/compte/) ============
   Trois ecrans dans une seule page : connexion, inscription, tableau de bord.
   Tout est bati sur les classes existantes (.panneau, .champ, .duo, .bouton,
   .detail, table) ; ce bloc ne fait qu'ajouter ce qui manquait. */

.compte [hidden] { display: none !important; }
.compte-attente { color: var(--texte-leger); font-size: .9rem; }

/* Les formulaires du site cachent leurs libelles (tout passe par le
   placeholder). Ici les libelles sont visibles et les champs sont ceux du
   configurateur : on retablit la mise en page normale. */
.page-contenu.compte form {
  display: block; grid-template-columns: none; gap: 0; margin: 0; max-width: none;
}
.page-contenu.compte form label {
  position: static; width: auto; height: auto;
  margin: 0 0 .4rem; padding: 0; overflow: visible;
  clip-path: none; white-space: normal;
}
.page-contenu.compte .champ input,
.page-contenu.compte .champ select {
  width: 100%; padding: .68rem .8rem;
  font-family: var(--corps); font-size: 1rem; color: var(--texte);
  background: var(--fond); border: 1px solid var(--bordure);
}
.page-contenu.compte .champ input:focus,
.page-contenu.compte .champ select:focus {
  outline: 2px solid var(--magenta); outline-offset: 1px; border-color: var(--bordure);
}
.page-contenu.compte .champ input[readonly] {
  background: var(--fond-alt); color: var(--texte-doux);
}
.compte .aide-champ {
  display: block; margin: -.15rem 0 .4rem;
  font-size: .78rem; line-height: 1.4; color: var(--texte-leger);
  letter-spacing: 0; text-transform: none; font-weight: 400;
}

/* Boutons radio et cases a cocher : libelle a cote, pas au-dessus. */
.compte .bloc-choix { border: 0; padding: 0; margin: 0 0 1.15rem; }
.compte .bloc-choix legend {
  padding: 0; margin-bottom: .45rem;
  font-family: var(--corps); font-weight: 700; font-size: .78rem;
  letter-spacing: .08em; text-transform: uppercase; color: var(--texte-doux);
}
.compte .choix-radio, .compte .champ-case {
  display: inline-flex; align-items: center; gap: .5rem; cursor: pointer;
  font-size: .95rem; font-weight: 400; letter-spacing: 0;
  text-transform: none; color: var(--texte);
}
.compte .choix-radio { margin-right: 1.4rem; }
.compte .champ-case { display: flex; align-items: flex-start; margin: 0 0 1.15rem; }
.compte .choix-radio input, .compte .champ-case input {
  width: auto; flex: none; margin: 0; padding: 0; accent-color: var(--magenta);
}
.compte .champ-case input { margin-top: .3rem; }

/* Messages de formulaire : erreur par defaut, plus succes et information. */
.compte .message {
  margin: 0 0 1.1rem; padding: .7rem .85rem;
  border-left: 3px solid var(--magenta);
  background: color-mix(in srgb, var(--magenta) 8%, transparent);
  color: var(--texte); font-size: .88rem; line-height: 1.5;
}
.compte .message.succes {
  border-left-color: #1F8A4C;
  background: color-mix(in srgb, #1F8A4C 10%, transparent);
}
.compte .message.info {
  border-left-color: var(--texte-leger); background: var(--fond-alt); color: var(--texte-doux);
}

/* Cartes de connexion et d'inscription, centrees et bornees en largeur. */
.compte-carte { max-width: 480px; margin: 0 auto; }
.compte-carte-large { max-width: 660px; }
.compte .titre-carte { margin: 0 0 1.3rem; }
.compte .panneau > h3:first-child { margin-top: 0; }
.compte .compte-intro { margin: 0 0 1.3rem; font-size: .92rem; color: var(--texte-doux); }
.compte .compte-liens {
  display: flex; flex-wrap: wrap; gap: 1rem; justify-content: space-between;
  margin: 1.3rem 0 0; padding-top: 1rem;
  border-top: 1px solid var(--bordure); font-size: .85rem;
}
.compte .compte-liens a { color: var(--magenta); text-decoration: none; }
.compte .compte-liens a:hover { text-decoration: underline; }

.compte .actions {
  display: flex; flex-wrap: wrap; align-items: center; gap: .6rem; margin-top: 1.2rem;
}
.bouton.petit { padding: .5rem .9rem; font-size: .72rem; }
/* .page-contenu colore tous ses liens en magenta : sans cela un bouton plein
   ecrit en lien (le renvoi vers la boutique) serait magenta sur magenta. */
.compte .bouton:not(.creux):not(.discret) { color: #fff; }
.bouton.discret { background: transparent; border-color: var(--bordure); color: var(--texte-doux); }
.bouton.discret:hover, .bouton.discret:focus-visible {
  background: transparent; border-color: var(--magenta); color: var(--magenta);
}
.bouton[disabled] { opacity: .55; cursor: default; }

/* Tableau de bord : en-tete, onglets, panneaux. */
.compte-entete {
  display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between;
  gap: 1rem; margin-bottom: 1.6rem;
}
.compte-entete .actions { margin-top: 0; }
.compte .compte-sous-titre { margin: 0; font-size: .85rem; color: var(--texte-leger); }

.compte-onglets {
  display: flex; flex-wrap: wrap; gap: .3rem;
  border-bottom: 1px solid var(--bordure); margin-bottom: 1.6rem;
}
.compte-onglets .onglet {
  padding: .75rem 1rem; cursor: pointer;
  background: transparent; border: 0; border-bottom: 3px solid transparent;
  font-family: var(--corps); font-weight: 700; font-size: .78rem;
  letter-spacing: .06em; text-transform: uppercase; color: var(--texte-doux);
  transition: color .15s, border-color .15s;
}
.compte-onglets .onglet:hover { color: var(--magenta); }
.compte-onglets .onglet.actif { color: var(--magenta); border-bottom-color: var(--magenta); }
.compte-onglets .onglet:focus-visible { outline: 2px solid var(--magenta); outline-offset: -2px; }

/* Pastille de statut : la couleur porte l'information, le mot aussi. */
.etat {
  display: inline-block; padding: .18rem .55rem; white-space: nowrap;
  font-family: var(--corps); font-weight: 700; font-size: .64rem;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--texte-doux); border: 1px solid currentColor;
  background: color-mix(in srgb, currentColor 8%, transparent);
}
.etat-attente { color: #A06A00; }
.etat-encours { color: var(--magenta); }
.etat-fait    { color: #1F8A4C; }
.etat-annule  { color: var(--texte-leger); }

/* Listes de commandes et d'adresses, en cartes pour tenir en petit ecran. */
.liste-commandes, .liste-adresses {
  display: grid; gap: 1rem; grid-template-columns: repeat(auto-fill, minmax(265px, 1fr));
}
.liste-adresses .compte-vide { grid-column: 1 / -1; }
.carte-commande, .carte-adresse {
  display: flex; flex-direction: column; gap: .8rem;
  padding: 1.1rem 1.2rem 1.2rem;
  background: var(--surface); border: 1px solid var(--bordure); box-shadow: var(--ombre);
}
.carte-commande-haut {
  display: flex; align-items: center; justify-content: space-between; gap: .6rem;
}
.compte .reference {
  margin: 0; font-weight: 700; font-size: .95rem;
  letter-spacing: .05em; color: var(--magenta);
}
.carte-commande-infos {
  display: grid; grid-template-columns: 1fr 1fr; gap: .4rem .8rem;
  margin: 0; font-size: .85rem;
}
.carte-commande-infos > div { display: flex; flex-direction: column; }
.carte-commande-infos dt {
  font-size: .66rem; letter-spacing: .08em; text-transform: uppercase; color: var(--texte-leger);
}
.carte-commande-infos dd { margin: 0; font-variant-numeric: tabular-nums; }
.carte-commande .bouton, .carte-adresse .bouton { align-self: flex-start; }
.carte-adresse .actions { margin-top: auto; }

.carte-adresse-titre {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem;
  margin: 0; font-weight: 700; font-size: .9rem; color: var(--texte);
}
.etiquette-type, .etiquette-defaut {
  padding: .12rem .45rem;
  font-size: .62rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: var(--texte-leger); border: 1px solid var(--bordure);
}
.etiquette-defaut { color: #fff; background: var(--magenta); border-color: var(--magenta); }
.carte-adresse-corps {
  display: flex; flex-direction: column; font-size: .88rem; color: var(--texte-doux);
}

/* Detail d'une commande : lignes, totaux, fichiers, suivi. */
.detail-entete { margin: 1.4rem 0 1.2rem; }
.compte .detail-entete h3 {
  margin: 0 0 .35rem; font-size: 1.1rem;
  letter-spacing: .04em; text-transform: uppercase; color: var(--magenta);
}
.compte .detail-sous-titre {
  display: flex; flex-wrap: wrap; align-items: center; gap: .45rem;
  margin: 0; font-size: .85rem; color: var(--texte-leger);
}
.compte .detail { list-style: none; margin: 1.4rem 0 0; padding: 1.1rem 0 0; }
.compte .detail li { margin-bottom: 0; }
.note-fine { font-size: .78rem; color: var(--texte-leger); }
.duo-adresses {
  display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  margin: 1.6rem 0;
}
.compte .liste-fichiers { list-style: none; margin: 0; padding: 0; }
.compte .liste-fichiers li {
  display: flex; flex-direction: column; gap: .15rem;
  margin: 0; padding: .6rem 0; border-bottom: 1px solid var(--bordure); font-size: .9rem;
}
.compte .suivi {
  list-style: none; margin: 0; padding: 0 0 0 1.1rem; border-left: 2px solid var(--bordure);
}
.compte .suivi li { position: relative; margin: 0; padding: 0 0 1rem .9rem; font-size: .9rem; }
.compte .suivi li::before {
  content: ""; position: absolute; left: -1.45rem; top: .5rem;
  width: 9px; height: 9px; border-radius: 50%; background: var(--magenta);
}
.suivi-date {
  display: block; font-size: .72rem; letter-spacing: .06em;
  text-transform: uppercase; color: var(--texte-leger);
}
.suivi-etat { display: block; font-weight: 700; }
.suivi-message { display: block; color: var(--texte-doux); }

.compte-vide {
  padding: 1.5rem; text-align: center;
  border: 1px dashed var(--bordure); background: var(--fond-alt);
  color: var(--texte-doux); font-size: .92rem;
}
.compte-vide p { margin: 0 0 .9rem; }
.compte-vide p:last-child { margin: 0; }

/* En dessous de 560px les paires de champs passent l'une sous l'autre : deux
   champs texte cote a cote ne sont plus saisissables sur un telephone. */
@media (max-width: 560px) {
  .compte .duo { grid-template-columns: 1fr; }
  .liste-commandes, .liste-adresses { grid-template-columns: 1fr; }
  .carte-commande-infos { grid-template-columns: 1fr 1fr; }
  .compte-onglets { gap: 0; }
  .compte-onglets .onglet { flex: 1 1 45%; padding: .65rem .4rem; font-size: .7rem; }
  .compte .actions .bouton { flex: 1 1 auto; text-align: center; }
  .compte-entete { flex-direction: column; }
}

/* Les deux teintes de statut fixes manquent de contraste sur fond sombre. */
@media (prefers-color-scheme: dark) {
  .etat-attente { color: #E0A93C; }
  .etat-fait    { color: #4FBF7C; }
}
:root[data-theme="dark"] .etat-attente { color: #E0A93C; }
:root[data-theme="dark"] .etat-fait    { color: #4FBF7C; }
:root[data-theme="light"] .etat-attente { color: #A06A00; }
:root[data-theme="light"] .etat-fait    { color: #1F8A4C; }

/* Dans une paire, l'aide sous un libelle rallonge la colonne : on cale les
   champs sur le bas pour qu'ils restent alignes entre eux. */
.compte .duo .champ { display: flex; flex-direction: column; }
.compte .duo .champ input, .compte .duo .champ select { margin-top: auto; }

/* ============ Glossaire et articles ============
   Le glossaire reprend les 14 articles du site en ligne, oublies a la
   premiere passe. Ils portent le meilleur referencement du site
   (`/un-fourreau-cest-quoi/` est 4e en clics, position 12,8), d'ou une mise en
   page pensee pour la lecture : une colonne etroite, du texte respirant, et
   les images du contenu qui ne debordent jamais. */

.articles-grille {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 1.4rem;
  margin: 2rem 0 3rem;
}

.article-carte {
  display: flex; flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--bordure);
  border-radius: 3px;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  transition: box-shadow .18s, transform .18s;
}
.article-carte:hover { box-shadow: var(--ombre); transform: translateY(-2px); }

/* Ratio fixe : les visuels d'origine vont du 262x400 au 750x229. Sans cadre
   impose, la grille serait en escalier. `cover` recadre, il ne deforme pas. */
.article-vignette {
  aspect-ratio: 16 / 9;
  background-size: cover;
  background-position: center;
  background-color: var(--fond-alt);
}

.article-infos { padding: 1rem 1.1rem 1.2rem; display: flex; flex-direction: column; gap: .5rem; flex: 1; }
.article-infos h3 {
  margin: 0; font-family: var(--titre); font-weight: 400;
  font-size: 1.05rem; letter-spacing: .01em; line-height: 1.3;
}
.article-extrait { margin: 0; font-size: .87rem; color: var(--texte-doux); line-height: 1.55; }
.article-lire {
  margin-top: auto; font-size: .74rem; letter-spacing: .08em;
  text-transform: uppercase; color: var(--magenta); font-weight: 700;
}
.article-carte:hover .article-lire { color: var(--magenta-fonce); }

/* Colonne de lecture : au dela d'environ 75 caracteres par ligne, l'oeil
   perd la ligne suivante. */
.page-contenu.article { max-width: none; }
.page-contenu.article img { max-width: 100%; height: auto; display: block; margin: 1.4rem 0; }
.page-contenu.article p { line-height: 1.75; }

.article-date {
  font-size: .78rem; color: var(--texte-leger);
  text-transform: uppercase; letter-spacing: .06em;
  margin-top: -.4rem;
}
.article-retour { margin-top: 2.4rem; padding-top: 1.2rem; border-top: 1px solid var(--bordure); }
.article-retour a { color: var(--magenta); text-decoration: none; font-weight: 700; }
.article-retour a:hover { text-decoration: underline; }

@media (max-width: 560px) {
  .articles-grille { grid-template-columns: 1fr; gap: 1.1rem; }
}

/* ============ Selecteur de langue ============
   Deux drapeaux dans la barre haute. Le drapeau de la langue courante n'est
   pas cliquable et reste en pleine opacite ; l'autre s'eclaire au survol. */
.barre-haute .langues { display: inline-flex; align-items: center; gap: .45rem; }
.barre-haute .langues a,
.barre-haute .langues .langue-active {
  display: inline-flex; width: 21px; height: 14px;
  border: 1px solid rgba(255,255,255,.35); border-radius: 2px;
  overflow: hidden; line-height: 0;
}
.barre-haute .langues svg { width: 100%; height: 100%; display: block; }
.barre-haute .langues a { opacity: .55; transition: opacity .15s, border-color .15s; }
.barre-haute .langues a:hover { opacity: 1; border-color: #fff; }
.barre-haute .langues .langue-active { opacity: 1; border-color: #fff; }
.barre-haute .langues a:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* ============ Fiche produit : galerie, onglets, description ============
   Refaite d'apres la page en ligne (https://www.pixelprint.fr/produit/mesh_pvc/).
   Le theme d'origine empile : galerie a gauche, achat a droite, puis un bloc
   a onglets, puis une description longue sur deux colonnes avec son propre
   bloc a onglets, puis les produits similaires. On garde cet ordre, avec la
   charte de la refonte.

   Regle de fond pour cette page : tout conteneur qui peut deborder defile
   en interne (`overflow-x: auto`), jamais la page. */

.produit-page { padding-bottom: 2.5rem; }
.produit-infos { background: var(--fond-alt); border-block: 1px solid var(--bordure); padding: 2.2rem 0 2.6rem; }
.produit-description { padding: 2.6rem 0 1rem; }
.produit-similaires { padding-bottom: 3rem; }

/* ---- Galerie ----
   Le client demandait "la photo en grand sans cadre blanc, photo pleine",
   puis, en comparant avec son site : "les images de produits sont plus
   hautes, elles ne sont pas coupees, laisse s'adapter au format, ne force pas
   le recadrage, pas de bord blanc".

   Le carre precedent (`aspect-ratio: 1/1` + `object-fit: cover`) amputait de
   25 % de leur hauteur les visuels en portrait : mesure sur
   /produit/bachepvc/, format naturel 750x1000 (0,750) affiche a 1,000. Sur la
   page en ligne, la meme image s'affiche en 560x746, soit 0,7506 : le format
   naturel, au recadrage nul.

   Donc plus de cadre du tout : largeur imposee, hauteur libre. Et plus de
   panneau ni de bordure sur la scene, c'est cela le "bord blanc" : quand les
   visuels d'une meme fiche n'ont pas tous le meme format, la piste prend la
   hauteur du plus haut et le vide autour d'un visuel plus bas se confond
   alors avec le fond de la page au lieu de dessiner un cadre. */
.galerie { display: flex; flex-direction: column; gap: .6rem; min-width: 0; }
.galerie-scene {
  position: relative; background: transparent;
  border: 0; overflow: hidden;
}
/* Volontairement sans `scroll-behavior: smooth`, et le script affecte
   `scrollLeft` directement plutot que d'appeler `scrollTo({behavior:"smooth"})`.
   Mesure faite sur la preversion : quand le navigateur n'anime pas le
   defilement (onglet en arriere-plan, moteur de rendu sans compositeur actif,
   mouvement reduit), la version animee ne bouge pas du tout et le slider reste
   fige sur la premiere image alors que le compteur avance. Le saut immediat,
   lui, marche partout. Le glissement au doigt reste natif et fluide. */
.galerie-piste {
  display: flex; margin: 0; padding: 0; list-style: none;
  overflow-x: auto; scroll-snap-type: x mandatory;
  scrollbar-width: none; -ms-overflow-style: none;
  /* Les vues n'ont plus la meme hauteur : sans cela, une image basse serait
     etiree par le comportement `stretch` par defaut de la boite flexible.

     44 fiches sur 59 melangent portrait et paysage dans la meme galerie
     (mesure sur les fichiers du build : plexi-3mm par exemple, 4 vues en
     750x1000 et 5 en 713x535). Une piste en ligne prend la hauteur de sa
     vue la plus haute : une vue en paysage flotte donc dans une scene plus
     haute qu'elle. Centree, le vide se partage au-dessus et en dessous et se
     confond avec le fond de la page. Le site en ligne fait mieux : son
     flexslider ramene la scene a la hauteur de la vue courante
     (`smoothHeight`), releve sur /produit/plexi-3mm/, 375 px sur une vue
     portrait et 225 px sur une vue paysage. Cela demande quatre lignes dans
     /js/produit.js, qui n'est pas dans le perimetre de ce fichier : signale
     dans le compte rendu. */
  align-items: center;
  /* `overflow-x: auto` fait passer `overflow-y` a `auto` lui aussi. Tant que
     la piste n'a pas de hauteur imposee cela ne change rien, mais des que
     /js/produit.js lui en posera une (voir ci-dessus), une vue plus haute que
     la vue courante ferait apparaitre une barre de defilement verticale. */
  overflow-y: hidden;
  transition: height .25s ease;
}
.galerie-piste::-webkit-scrollbar { display: none; }
.galerie-vue { flex: 0 0 100%; scroll-snap-align: center; min-width: 0; }
.galerie-vue img {
  display: block; width: 100%; height: auto;
}

.galerie-fleche {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 42px; height: 42px; display: grid; place-items: center;
  border: 0; cursor: pointer; z-index: 2;
  background: rgba(255,255,255,.88); color: var(--anthracite);
  font-size: 1.5rem; line-height: 1;
  transition: background .15s, opacity .15s;
}
.galerie-fleche:hover { background: var(--magenta); color: #fff; }
.galerie-fleche:focus-visible { outline: 3px solid var(--magenta); outline-offset: -3px; }
.galerie-fleche.precedent { left: 0; }
.galerie-fleche.suivant { right: 0; }
.galerie-fleche[disabled] { opacity: .3; cursor: default; }
.galerie-fleche[disabled]:hover { background: rgba(255,255,255,.88); color: var(--anthracite); }

.galerie-compteur {
  position: absolute; right: .6rem; bottom: .6rem; margin: 0; z-index: 2;
  background: rgba(53,55,62,.78); color: #fff;
  font-size: .72rem; letter-spacing: .06em; padding: .18rem .5rem;
  font-variant-numeric: tabular-nums;
}

/* La bande de vignettes defile horizontalement en interne : sur une fiche a
   34 visuels, elle ne doit pas s'empiler sur dix lignes ni pousser la page. */
.galerie-vignettes {
  display: flex; gap: .4rem; margin: 0; padding: 0; list-style: none;
  overflow-x: auto; scrollbar-width: thin;
}
.galerie-vignette {
  flex: 0 0 auto; padding: 0; border: 1px solid var(--bordure);
  background: var(--fond-alt); cursor: pointer; line-height: 0;
  transition: border-color .15s, opacity .15s; opacity: .68;
}
/* Meme regle sur la bande de navigation : hauteur commune pour que la bande
   reste reguliere, largeur libre pour que chaque miniature garde son format.
   Un carre force y recadrait aussi les visuels en portrait. */
.galerie-vignette img { height: 62px; width: auto; max-width: none; display: block; }
.galerie-vignette:hover { opacity: 1; }
.galerie-vignette.active { border-color: var(--magenta); opacity: 1; }
.galerie-vignette:focus-visible { outline: 2px solid var(--magenta); outline-offset: 1px; }

/* Un produit sans galerie ne montre ni fleche ni vignette : le build ne pose
   simplement pas ces elements, il n'y a donc rien a masquer ici. */

/* ---- Nom a gauche, informations a onglets a droite ---- */
.produit-detail { display: grid; gap: 1.8rem; grid-template-columns: 1fr; align-items: start; }
@media (min-width: 960px) {
  .produit-detail { grid-template-columns: minmax(0, 320px) minmax(0, 1fr); gap: 2.4rem; }
}
.produit-detail > * { min-width: 0; }

.identite-nom {
  font-family: var(--corps); font-weight: 700;
  font-size: clamp(1.15rem, 2.2vw, 1.45rem);
  text-transform: uppercase; letter-spacing: .04em;
  color: var(--magenta); margin: 0 0 .9rem;
}
.identite-resume { color: var(--texte-doux); font-size: .92rem; margin: 0 0 1.3rem; }

.mots-clefs-titre {
  font-size: .74rem; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--texte); margin: 0 0 .5rem;
}
.mots-clefs-liste { display: flex; flex-wrap: wrap; gap: .3rem; margin: 0; padding: 0; list-style: none; }
.mots-clefs-liste li {
  font-size: .72rem; letter-spacing: .04em; text-transform: uppercase;
  color: var(--texte-doux); background: var(--surface);
  border: 1px solid var(--bordure); padding: .16rem .45rem;
}

/* ---- Onglets ----
   Sans JavaScript, tous les panneaux restent visibles les uns sous les autres.
   Le script masque les inactifs ; le contenu n'est donc jamais perdu pour un
   moteur de recherche ni pour un lecteur d'ecran. */
.onglets { min-width: 0; }
.onglets-barre {
  display: flex; gap: .2rem; margin: 0 0 -1px; padding: 0;
  overflow-x: auto; scrollbar-width: thin;
}
.onglet-titre {
  flex: 0 0 auto; border: 1px solid transparent; border-bottom: 0;
  background: none; cursor: pointer; padding: .6rem .95rem;
  font-family: var(--corps); font-weight: 700; font-size: .76rem;
  letter-spacing: .07em; text-transform: uppercase; color: var(--texte-doux);
  white-space: nowrap; transition: color .15s, background .15s;
}
.onglet-titre:hover { color: var(--magenta); }
.onglet-titre.actif {
  color: var(--magenta); background: var(--surface);
  border-color: var(--bordure);
}
.onglet-titre:focus-visible { outline: 2px solid var(--magenta); outline-offset: -2px; }

.onglet-panneau {
  background: var(--surface); border: 1px solid var(--bordure);
  padding: 1.4rem 1.5rem; overflow-wrap: anywhere;
}
.onglet-panneau > :first-child { margin-top: 0; }
.onglet-panneau > :last-child { margin-bottom: 0; }
.onglet-panneau p { color: var(--texte-doux); margin: 0 0 .9rem; }
.onglet-panneau h3 {
  font-family: var(--corps); font-weight: 700; font-size: 1rem;
  color: var(--texte); margin: 1.3rem 0 .6rem; letter-spacing: .01em;
}
.onglet-panneau ul, .onglet-panneau ol { color: var(--texte-doux); margin: 0 0 1rem; padding-left: 1.2rem; }
.onglet-panneau li { margin-bottom: .3rem; }
.onglet-panneau a { color: var(--magenta); }
.onglet-panneau strong { color: var(--texte); }
.onglet-panneau img { max-width: 100%; height: auto; display: block; margin: .8rem 0; }
/* Le tableau global impose une largeur minimale de 420 px, utile ailleurs mais
   fatale ici : sur un ecran de 375 px, il pousserait la page. Il defile. */
.onglet-panneau table, .colonne-centrale table { min-width: 0; }
/* Utilitaire global : `build_maquette.py` enveloppe ainsi tout tableau repris
   du site en ligne, sur les fiches produit comme sur les pages editoriales. */
.table-defile { overflow-x: auto; max-width: 100%; }

/* ---- Description longue ----
   Le client demandait "une colonne centrale avec des marges gauche et droite,
   pour limiter et organiser le texte", et sa page de description est sur deux
   colonnes. La bride de 1180 px datait de l'epoque ou la largeur utile etait
   a 1600 px ; `--large` etant revenu a 1200 px, `.contenu` ne laisse plus que
   1160 px et cette bride ne mordait plus sur rien. C'est `--large` qui tient
   la colonne, ici on ne fait que centrer. */
.colonne-centrale { max-width: none; margin-inline: auto; min-width: 0; }
.deux-colonnes { display: grid; gap: 2.2rem; grid-template-columns: 1fr; margin-bottom: 2.4rem; }
@media (min-width: 900px) { .deux-colonnes { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.deux-colonnes > * { min-width: 0; overflow-wrap: anywhere; }
.deux-colonnes p { color: var(--texte-doux); margin: 0 0 1rem; text-align: justify; }
.deux-colonnes h3 {
  font-family: var(--corps); font-weight: 700; font-size: 1.02rem;
  color: var(--magenta); margin: 0 0 .9rem; line-height: 1.5;
}
.deux-colonnes ul, .deux-colonnes ol { color: var(--texte-doux); margin: 0 0 1.1rem; padding-left: 1.2rem; }
.deux-colonnes li { margin-bottom: .4rem; }
.deux-colonnes strong { color: var(--texte); }
.deux-colonnes a { color: var(--magenta); }
.deux-colonnes img { max-width: 100%; height: auto; }

/* ---- Pictogrammes des onglets du bas ---- */
.pictos {
  display: grid; gap: .8rem 1.6rem; margin: 1.4rem 0 0; padding: 1.3rem 0 0;
  border-top: 1px solid var(--bordure);
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
}
.picto { display: flex; align-items: center; gap: .6rem; font-size: .87rem; color: var(--texte-doux); }
.picto svg { flex: 0 0 auto; width: 19px; height: 19px; fill: none; stroke: var(--magenta); stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }

@media (max-width: 560px) {
  .galerie-fleche { width: 36px; height: 36px; font-size: 1.25rem; }
  .galerie-vignette img { width: 52px; height: 52px; }
  .onglet-panneau { padding: 1.1rem 1rem; }
}


/* ============ Colonne visuelle de la fiche produit ============
   La galerie et les mots-clefs partagent la colonne de gauche. Les etiquettes
   comblent le vide laisse sous les vignettes quand l'image est en paysage. */
.produit-visuel { display: flex; flex-direction: column; gap: 1.2rem; min-width: 0; }
.mots-clefs-visuel { margin-top: .4rem; }
.mots-clefs-visuel .mots-clefs-titre {
  margin: 0 0 .5rem; font-size: .7rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--texte-leger);
}
.mots-clefs-visuel .mots-clefs-liste {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: .3rem;
}
.mots-clefs-visuel .mots-clefs-liste li {
  font-size: .68rem; letter-spacing: .03em;
  color: var(--texte-doux);
  border: 1px solid var(--bordure); border-radius: 3px;
  padding: .16rem .42rem;
}


/* L'etage produits est desormais sur fond clair : ses textes doivent y etre
   lisibles, alors que le reste du pied est sur fond sombre. Le selecteur
   monte a la specificite de `footer#pied a`, sinon la couleur grise du pied
   l'emporte. */
footer#pied .pied-produits h4 { color: #666; }
footer#pied .pied-produits a { color: #EA148C; }
footer#pied .pied-produits a:hover .pied-produit-nom { color: #B80065; }
footer#pied .pied-produits .pied-produit-prix,
footer#pied .pied-produits .pied-produits-vide { color: #666; }
footer#pied .pied-produits .pied-produit-prix ins { color: #666; }


/* ============ Pages legales ============
   Mentions legales et, plus tard, les autres pages de meme nature. Le texte
   d'origine tenait en six lignes suivies de quatre puces vides ; il est
   remplace par une page redigee (site/mentions-legales.template.html).

   Deux besoins de mise en page seulement : une date de mise a jour discrete,
   et des fiches d'identite (editeur, hebergeur) lisibles d'un coup d'oeil.
   Une liste de definitions convient exactement : le libelle et sa valeur
   restent lies, y compris pour un lecteur d'ecran, ce qu'un tableau de deux
   colonnes ne garantit pas. */

.legal-date {
  font-size: .78rem; letter-spacing: .04em; text-transform: uppercase;
  color: var(--texte-leger); margin: -.4rem 0 1.6rem;
}

.legal-carte {
  background: var(--fond-alt);
  border: 1px solid var(--bordure);
  border-left: 3px solid var(--magenta);
  padding: 1.3rem 1.5rem;
  margin: 0 0 1.8rem;
}

.legal-fiche {
  display: grid;
  grid-template-columns: minmax(11rem, 15rem) 1fr;
  gap: .55rem 1.6rem;
  margin: 0;
}

.legal-fiche dt {
  font-size: .74rem; letter-spacing: .06em; text-transform: uppercase;
  font-weight: 700; color: var(--texte-leger);
  /* Le libelle est cale sur la premiere ligne de sa valeur, pas centre : les
     valeurs sur trois lignes (immatriculation) desaligneraient la colonne. */
  padding-top: .1rem;
}

.legal-fiche dd {
  margin: 0; color: var(--texte); line-height: 1.55;
}

/* La liste de definitions passe en une colonne quand deux ne tiennent plus :
   sous 620 px, une colonne de libelles de 11rem laisse moins de place a la
   valeur qu'au libelle. */
@media (max-width: 620px) {
  .legal-fiche { grid-template-columns: 1fr; gap: .15rem; }
  .legal-fiche dt { margin-top: .7rem; }
  .legal-fiche dt:first-child { margin-top: 0; }
  .legal-carte { padding: 1.1rem 1.2rem; }
}


/* ============ Quelques chiffres ============
   Bandeau de compteurs de l'accueil. Le comptage progressif est dans
   js/home.js ; ici, seulement la mise en page. Les chiffres empruntent la
   police de titre du site, en graisse legere : ce sont eux qu'on lit, pas
   leur libelle. */

.chiffres { padding: 2.4rem 0 1rem; }

.chiffres-liste {
  list-style: none; margin: 1.6rem 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.4rem;
  text-align: center;
}

.chiffres-liste li { display: flex; flex-direction: column; gap: .35rem; }

.chiffre {
  font-family: var(--titre); font-weight: 300; font-size: 3rem; line-height: 1;
  color: var(--texte);
  /* Les chiffres defilent pendant l'animation : sans chasse fixe, la largeur
     du bloc saute a chaque image et tout le bandeau tremble. */
  font-variant-numeric: tabular-nums;
}

.chiffres-liste span {
  font-size: .78rem; letter-spacing: .08em; text-transform: uppercase;
  color: var(--texte-doux);
}

@media (max-width: 760px) {
  .chiffres-liste { grid-template-columns: repeat(2, 1fr); gap: 1.8rem 1rem; }
  .chiffre { font-size: 2.3rem; }
}


/* ============ Reassurance et services ============
   Quatre cartes, surbrillance au survol : la tete passe au magenta, le
   pictogramme au blanc, la pointe sous la tete suit. La transition porte sur
   les couleurs seulement, pas sur `all` : animer une ombre ou une taille ici
   fait respirer la grille entiere a chaque passage de souris. */

.services { padding: 1.4rem 0 3rem; }

.services-liste {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.2rem;
}

/* Les quatre cartes doivent faire exactement la meme hauteur, quel que soit le
   nombre de lignes de leur texte. La cellule de grille s'etire deja, mais un
   `height: 100%` sur le lien ne resout rien contre un parent en hauteur
   automatique : c'est le <li> qu'il faut passer en conteneur flexible pour que
   le lien remplisse la cellule. */
.service { display: flex; }

.service a {
  display: flex; flex-direction: column; flex: 1;
  text-decoration: none; color: inherit;
  border: 1px solid var(--bordure); background: var(--surface);
}

.service-tete {
  display: grid; place-items: center; position: relative;
  padding: 1.6rem 0; background: var(--fond-alt);
  transition: background .18s;
}

/* La pointe sous la tete, comme sur le site : un carre tourne a 45 degres,
   moitie dans la tete moitie dans le corps. Un `border` en triangle ne
   marcherait pas, il faudrait deux couleurs de fond a suivre. */
.service-tete::after {
  content: ""; position: absolute; bottom: -6px; left: 50%;
  width: 12px; height: 12px; transform: translateX(-50%) rotate(45deg);
  background: var(--fond-alt); transition: background .18s;
}

.service-tete svg {
  width: 34px; height: 34px; fill: none;
  stroke: var(--magenta); stroke-width: 1.6;
  stroke-linecap: round; stroke-linejoin: round;
  transition: stroke .18s;
}

.service-corps {
  display: flex; flex-direction: column; gap: .45rem; flex: 1;
  padding: 1.5rem 1.2rem 1.4rem; text-align: center;
}

.service-corps b {
  font-family: var(--titre); font-weight: 400; font-size: .95rem;
  letter-spacing: .06em; text-transform: uppercase; color: var(--texte);
  transition: color .18s;
}

.service-corps span { font-size: .82rem; line-height: 1.5; color: var(--texte-doux); }

.service a:hover .service-tete,
.service a:focus-visible .service-tete,
.service a:hover .service-tete::after,
.service a:focus-visible .service-tete::after { background: var(--magenta); }
.service a:hover .service-tete svg,
.service a:focus-visible .service-tete svg { stroke: #fff; }
.service a:hover .service-corps b,
.service a:focus-visible .service-corps b { color: var(--magenta); }
.service a:focus-visible { outline: 2px solid var(--magenta); outline-offset: 2px; }

@media (max-width: 900px) { .services-liste { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .services-liste { grid-template-columns: 1fr; } }


/* ============ Page de l'equipe ============
   Reprise de la mise en page du site en ligne : portrait carre a gauche,
   fonction et competences a droite, chaque competence en barre pleine largeur
   avec son libelle pose dessus.

   Le contenu vient du site (tools/scrape_pages.py) ; c'est
   `mettre_en_forme_equipe` dans tools/build_maquette.py qui reconstruit les
   cartes a partir de la suite portrait / role / lignes "Libelle 80%".

   Les noms ne sont pas affiches : le client demande qu'aucune personne ne
   reste visible pour un moteur d'indexation. La fonction reste, c'est elle qui
   renseigne le visiteur. Le jour ou une equipe nommee est voulue, le gabarit
   affiche le nom sans rien changer d'autre (`.equipe-nom`). */

.equipe { display: flex; flex-direction: column; gap: 2rem; margin: 2rem 0 1rem; }

.equipe-membre {
  display: grid;
  grid-template-columns: 220px minmax(0, 1fr);
  gap: 2rem;
  align-items: start;
}

/* Portrait carre, sans recadrage force : les fichiers sont deja en 300x300.
   `aspect-ratio` garde la case carree meme si un futur portrait ne l'est pas,
   et `contain` fait tenir l'image entiere dedans plutot que de la couper. */
.equipe-portrait {
  aspect-ratio: 1; background: var(--fond-alt);
  border: 1px solid var(--bordure); overflow: hidden;
}
.equipe-portrait img { width: 100%; height: 100%; object-fit: contain; display: block; }

.equipe-role {
  font-family: var(--corps); font-size: .8rem; letter-spacing: .12em;
  text-transform: uppercase; color: var(--texte-leger); margin: 0 0 .2rem;
}
.equipe-nom {
  font-family: var(--titre); font-weight: 500; font-size: 1.5rem;
  letter-spacing: .04em; text-transform: uppercase;
  color: var(--magenta); margin: 0 0 1rem;
}
/* Sans nom affiche, la fonction devient le titre de la carte : elle prend la
   place et le poids que le nom occupait. */
.equipe-infos > .equipe-role:only-of-type { font-size: 1.05rem; color: var(--texte); margin-bottom: 1rem; }

.equipe-competences { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .5rem; }

.equipe-competence { position: relative; min-height: 34px; display: flex; align-items: center; }

/* La barre.

   Le remplissage est peint par un degrade de fond dont `background-size`
   donne la longueur, et non par un element enfant : rien a dimensionner en
   cascade, une seule propriete a animer, et la barre reste un element vide.

   La longueur est ecrite en ligne par le build : le HTML seul affiche la
   bonne valeur, sans script et pour les moteurs d'indexation.

   Le degrade et le reflet remplacent l'aplat : c'est ce qui donne du relief a
   une barre. */
.equipe-jauge {
  position: absolute; inset: 0;
  background-color: var(--fond-alt);
  background-image: linear-gradient(90deg,
                    var(--magenta-fonce) 0%, var(--magenta) 55%, #F0479F 100%);
  background-repeat: no-repeat;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18), inset 0 -1px 0 rgba(0,0,0,.06);
  transition: background-size 1s cubic-bezier(.22, .61, .36, 1);
}

@media (prefers-reduced-motion: reduce) {
  .equipe-jauge { transition: none; }
}

.equipe-libelle {
  position: relative; display: flex; align-items: baseline; gap: .6rem;
  width: 100%; padding: 0 .8rem;
  font-size: .82rem; color: #fff;
  /* Le libelle court sur la barre : sur la partie non remplie il passerait en
     blanc sur gris clair. L'ombre le detache dans les deux cas. */
  text-shadow: 0 1px 2px rgba(0,0,0,.45);
}

@media (max-width: 700px) {
  .equipe-membre { grid-template-columns: 1fr; gap: 1.2rem; }
  .equipe-portrait { max-width: 220px; }
}


/* ============ Colonne laterale ============
   Le site en ligne pose ses widgets a droite de la boutique. Ici les blocs
   viennent de la table `blocs_lateraux`, donc du back-office : le build ne
   fait que les rendre. Sans configuration, aucune colonne n'est produite et
   la page reste sur toute sa largeur, exactement comme avant.

   Les proportions reprennent celles du client : le texte occupe environ les
   deux tiers, la colonne le tiers restant, dans la meme largeur utile de
   1200 px que le reste du site. */

.avec-cote {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 280px;
  gap: 2.6rem;
  align-items: start;
}

/* Sous 900 px, deux colonnes ne tiennent plus : la colonne passe sous le
   texte, ou elle reste utile sans le comprimer. */
@media (max-width: 900px) {
  .avec-cote { grid-template-columns: 1fr; gap: 1.8rem; }
  .colonne-cote { border-top: 1px solid var(--bordure); padding-top: 1.4rem; }
}

.colonne-cote { display: flex; flex-direction: column; gap: 1.8rem; }

.cote-bloc { font-size: .98rem; }
.cote-bloc p { color: var(--texte-doux); line-height: 1.55; margin: 0; }
.cote-bloc a { color: var(--magenta); text-decoration: none; }
.cote-bloc a:hover { color: var(--magenta-fonce); }

/* Meme titre que les blocs du pied : filet magenta sur le tiers gauche. */
.cote-titre {
  font-family: var(--corps); font-weight: 400;
  font-size: 1rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--texte); margin: 0 0 .9rem; padding-bottom: .6rem;
  position: relative;
}
.cote-titre::after {
  content: ""; position: absolute; left: 0; bottom: 0;
  width: 100%; height: 2px;
  background: linear-gradient(90deg, var(--magenta) 0 34%, var(--bordure) 34% 100%);
}

.cote-liste { list-style: none; margin: 0; padding: 0; }
.cote-liste li + li { border-top: 1px solid var(--bordure); }
.cote-liste a {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: .6rem; padding: .5rem 0; color: var(--texte-doux);
}
.cote-liste a:hover { color: var(--magenta); }
.cote-compte { color: var(--texte-leger); font-size: .88rem; font-variant-numeric: tabular-nums; }

.cote-produits { list-style: none; margin: 0; padding: 0; }
.cote-produits li + li { border-top: 1px solid var(--bordure); }
.cote-produits a {
  display: grid; grid-template-columns: 66px minmax(0, 1fr);
  gap: .15rem .7rem; align-items: center; padding: .6rem 0;
}
/* La vignette occupe les deux rangs : sans cela, le placement automatique de
   la grille envoyait le prix au rang suivant, PREMIERE colonne, c'est-a-dire
   sous l'image au lieu de sous le nom. */
.cote-produits img { grid-row: span 2; }
.cote-produits .cote-nom { align-self: end; }
.cote-produits .cote-prix { align-self: start; }
/* Meme regle que partout : largeur imposee, hauteur bornee, aucun recadrage. */
.cote-produits img {
  width: 66px; height: auto; max-height: 66px;
  object-fit: contain; object-position: left center; display: block;
}
.cote-nom { color: var(--magenta); line-height: 1.35; font-size: .95rem; }
.cote-prix { color: var(--texte-doux); font-size: .88rem; font-variant-numeric: tabular-nums; }
.cote-prix del { color: var(--texte-leger); margin-right: .35rem; }
.cote-prix ins { text-decoration: none; font-weight: 700; color: var(--texte); }

/* Le nuage reprend les trois paliers du pied, en plus sobre : sur fond clair,
   le rose pale du plus gros palier passerait mal. */
.cote-nuage { line-height: 1.9; }
.cote-nuage a { margin-right: .45rem; }
.cote-nuage .t0  { font-size: .85rem; color: #C2007A; }
.cote-nuage .t5  { font-size: 1.05rem; color: var(--magenta); }
.cote-nuage .t10 { font-size: 1.4rem; color: #E5218D; }

.cote-image img { width: 100%; height: auto; display: block; }


/* ============ Description longue en une seule colonne redigee ============
   Sept fiches n'ont qu'une colonne de texte : posee dans la grille a deux
   colonnes, elle laissait la moitie droite vide et doublait la hauteur de la
   page. Le texte coule ici sur deux colonnes equilibrees. Les titres restent
   accroches a leur paragraphe et une liste ne se coupe pas en deux. */
.colonne-coulee { columns: 2; column-gap: 2.6rem; }
.colonne-coulee h2, .colonne-coulee h3, .colonne-coulee h4 { break-after: avoid; }
.colonne-coulee li, .colonne-coulee img, .colonne-coulee table { break-inside: avoid; }
.colonne-coulee > *:first-child { margin-top: 0; }
@media (max-width: 900px) { .colonne-coulee { columns: 1; } }


/* ============ Texte SEO et conseils de l'accueil ============
   La page d'accueil n'avait aucun texte indexable. Ces deux sections posent
   le vocabulaire du metier (impression numerique grand format, bache, PVC,
   Dibond, vinyle, finitions) avec des liens vers les vraies fiches, et
   envoient vers le glossaire, qui porte le meilleur referencement du site.
   Le texte coule sur deux colonnes (classe .colonne-coulee, deja definie). */

.seo-accueil { padding: .6rem 0 2.4rem; }
.seo-texte { margin-top: 1.6rem; }
.seo-texte p { color: var(--texte-doux); line-height: 1.65; margin: 0 0 1rem; }
.seo-texte h3 {
  font-family: var(--corps); font-weight: 700; font-size: 1.02rem;
  color: var(--texte); margin: 1.3rem 0 .5rem;
}
.seo-texte a { color: var(--magenta); text-decoration: none; }
.seo-texte a:hover { text-decoration: underline; }

.conseils { padding: 0 0 3rem; }
.conseils-grille {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.2rem;
  margin-top: 1.6rem;
}
.conseil-carte {
  display: flex; flex-direction: column; gap: .6rem;
  border: 1px solid var(--bordure); background: var(--surface);
  padding: 1.1rem 1.2rem; text-decoration: none;
  transition: box-shadow .18s, transform .18s;
}
.conseil-carte:hover { box-shadow: var(--ombre); transform: translateY(-2px); }
.conseil-carte h3 { margin: 0; font-size: .95rem; font-weight: 700; color: var(--texte); }
.conseil-suite { color: var(--magenta); font-size: .8rem; }
.conseils-tout { margin: 1.3rem 0 0; }
.conseils-tout a { color: var(--magenta); text-decoration: none; }
.conseils-tout a:hover { text-decoration: underline; }

@media (max-width: 900px) { .conseils-grille { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .conseils-grille { grid-template-columns: 1fr; } }
