/* ==========================================================================
   VD TOOLS PRO — FEUILLE DE STYLE
   --------------------------------------------------------------------------
   Refaite d'après la grammaire des grands sites de formation en motion design
   (School of Motion) : des titres énormes et serrés, des sur-titres en petites
   capitales colorées, des fonds presque noirs qui alternent d'une section à
   l'autre, des boutons pleins et francs, et un bandeau d'annonce en haut.
   La couleur reste celle de la marque : le rouge du logo VD Tools Pro, avec
   l'or de son étoile pour les sur-titres. Chaque plugin garde la sienne.
   ========================================================================== */

:root {
  /* Le site n'existe qu'en sombre : on le dit au navigateur, pour qu'il dessine
     ses propres éléments — menus, barres de défilement — dans le même ton. */
  color-scheme: dark;

  /* Fonds : du plus sombre au plus clair, pour faire respirer les sections. */
  --noir: #07070A;
  --bloc: #101014;
  --bloc-2: #16161C;
  --carte: #14141A;
  --carte-clair: #1B1B23;
  --champ: #0D0D11;

  /* Texte : un blanc chaud plutôt qu'un blanc pur, moins agressif sur noir. */
  --texte: #F3EEE4;
  --texte-2: #B5B0A8;
  --texte-3: #8A857D;

  /* Rouge assez foncé pour qu'un texte blanc reste lisible dessus (4,6:1). */
  --rouge: #DE2E3C;
  --rouge-fonce: #B31F2A;
  --or: #F5B82E;
  --vert: #1FD1A0;

  /* L'accent courant : le rouge de la marque, ou la couleur du plugin
     présenté (les fiches produits le redéfinissent). */
  --accent: var(--rouge);
  --accent-2: var(--rouge-fonce);
  --accent-doux: rgba(222, 46, 60, .14);
  --accent-vif: rgba(222, 46, 60, .45);

  --bord: rgba(255, 255, 255, .10);
  --bord-clair: rgba(255, 255, 255, .18);
  /* Un voile clair posé sur le fond : survol d'un lien, pastille d'état.
     En mode jour il devient un voile sombre. */
  --voile: rgba(255, 255, 255, .06);
  --voile-2: rgba(255, 255, 255, .10);
  /* Les fonds qui flottent au-dessus du reste : la barre du haut, le voile
     posé sur une vignette. Ils suivent le thème comme les autres. */
  --flottant: rgba(7, 7, 10, .88);
  --flottant-fort: rgba(7, 7, 10, .96);

  --rayon: 8px;
  --rayon-m: 12px;
  --rayon-l: 16px;
  --ombre: 0 24px 60px rgba(0, 0, 0, .55);

  --largeur: 1200px;
  --police: 'Plus Jakarta Sans', -apple-system, 'Segoe UI', Roboto, system-ui, sans-serif;
  --police-titre: 'Bricolage Grotesque', 'Plus Jakarta Sans', system-ui, sans-serif;
}


/* --- Un seul thème : la nuit --------------------------------------------------
   Le site ne suit plus le réglage du système. C'est la couleur d'After Effects,
   celle dans laquelle les captures ont été prises et dans laquelle les logos
   ont été dessinés : en plein jour, les lueurs colorées et les captures sombres
   perdaient leur raison d'être. « color-scheme » prévient le navigateur, pour
   que les menus déroulants, les barres de défilement et les champs qu'il dessine
   lui-même arrivent sombres eux aussi. */



* { box-sizing: border-box; }
/* Un élément marqué hidden doit disparaître, même quand une classe lui donne
   un display : sans cela, un bouton en flex reste visible, vide. */
[hidden] { display: none !important; }
html {
  scroll-behavior: smooth;
  /* La barre du haut reste collée : sans cette réserve, un lien vers une
     ancre amène le titre visé juste dessous, à moitié caché. */
  scroll-padding-top: clamp(84px, 9vw, 104px);
}

body {
  margin: 0;
  background: var(--noir);
  color: var(--texte);
  font-family: var(--police);
  font-size: 17px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }

/* --- Titres : gros, serrés, jamais bavards ---------------------------------- */
h1, h2, h3, h4 {
  font-family: var(--police-titre);
  font-weight: 800;
  line-height: .96;
  letter-spacing: -.015em;
  margin: 0 0 18px;
  color: var(--texte);
}
/* Les tailles suivent la largeur : plus de marche entre deux paliers. */
h1 { font-size: clamp(28px, 5vw, 70px); }
h2 { font-size: clamp(23px, 3.7vw, 58px); }
h3 { font-size: clamp(18px, 1.8vw, 24px); line-height: 1.15; }
h4 { font-size: 17px; line-height: 1.2; }
p { margin: 0 0 16px; color: var(--texte-2); }

/* Le sur-titre : petites capitales espacées, dans l'or de l'étoile du logo. */
.vd-surtitre {
  display: block; margin-bottom: 14px;
  font-family: var(--police);
  font-size: 13px; font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--or);
}
.vd-surtitre-accent { color: var(--accent); }

/* La marge latérale grandit avec l'écran : 32 px sur un téléphone, 88 px sur
   un grand moniteur, et tout ce qu'il y a entre les deux. */
.vd-large { width: min(100% - clamp(44px, 7.5vw, 144px), var(--largeur)); margin-inline: auto; }
.vd-etroit { max-width: 780px; }

/* Une section = un bloc de couleur. Elles alternent pour rythmer la page. */
.vd-section { padding: clamp(46px, 6.4vw, 96px) 0; }
.vd-section-fond { background: var(--bloc); }
.vd-section-fond-2 { background: var(--bloc-2); }
.vd-section-titre { max-width: 860px; margin-bottom: clamp(30px, 3.6vw, 52px); }
/* Un titre de page qui ouvre une section garde la taille des titres de
   section : le rang compte pour la lecture, pas pour la mise en page. */
.vd-titre-section { font-size: clamp(23px, 3.7vw, 58px); margin: 0 0 14px; }
/* Un titre de carte : deuxième niveau pour la lecture, taille d'un h3. */
.vd-titre-carte { font-size: clamp(18px, 1.8vw, 24px); line-height: 1.15; }
.vd-section-titre p { font-size: clamp(16px, 1.5vw, 19px); max-width: 640px; }
.vd-centre { text-align: center; margin-inline: auto; }
.vd-centre p { margin-inline: auto; }

.vd-accent-texte { color: var(--accent); }
.vd-or-texte { color: var(--or); }

/* --- Boutons ---------------------------------------------------------------- */
.vd-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  min-height: clamp(46px, 4.4vw, 52px); padding: 0 clamp(18px, 2.2vw, 26px);
  border: 2px solid transparent; border-radius: var(--rayon);
  /* 700 plutôt que 800 : à cette taille, la graisse la plus lourde
     épaississait les lettres sans les rendre plus lisibles, et elle entrait
     en concurrence avec les titres, qui sont les seuls à devoir crier. */
  font-family: var(--police); font-size: clamp(15px, 1.5vw, 17px); font-weight: 700;
  /* Un libelle qui passe a la ligne reste centre : dans une boite flexible il
     heritait de l'alignement a gauche de la page, et « Voir nos / produits »
     partait en escalier. « balance » coupe les deux lignes a la meme longueur
     plutot que d'abandonner le dernier mot tout seul en bas. */
  text-align: center; text-wrap: balance;
  cursor: pointer;
  transition: transform .14s ease, background .14s ease, border-color .14s ease, color .14s ease;
}
.vd-btn-principal { background: var(--accent); color: #fff; }
.vd-btn-principal:hover { background: var(--accent-2); transform: translateY(-2px); }
.vd-btn-second { background: transparent; color: var(--texte); border-color: var(--bord-clair); }
.vd-btn-second:hover { border-color: var(--texte); transform: translateY(-2px); }
.vd-btn-or { background: var(--or); color: #101014; }
.vd-btn-or:hover { filter: brightness(1.08); transform: translateY(-2px); }
.vd-btn-petit { min-height: 44px; padding: 0 18px; font-size: 15px; }
.vd-btn-large { width: 100%; max-width: 380px; }
/* Dans un formulaire, il reste centré sur sa colonne. */
.vd-form .vd-btn-large { margin-inline: auto; }

/* --- Bandeau d'annonce ------------------------------------------------------- */

/* --- En-tête ----------------------------------------------------------------- */
.vd-entete {
  position: sticky; top: 0; z-index: 100;
  background: var(--flottant);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid transparent;
  transition: border-color .2s ease;
}
.vd-entete.defile { border-bottom-color: var(--bord); }
.vd-entete-corps { display: flex; align-items: center; gap: clamp(10px, 2vw, 22px); height: 72px; }

.vd-logo { display: flex; align-items: center; gap: 11px; }
.vd-logo-image {
  width: 36px; height: 36px; border-radius: 10px; flex: 0 0 auto; display: block;
  transition: transform .18s ease;
}
.vd-logo:hover .vd-logo-image { transform: rotate(-4deg) scale(1.06); }
.vd-logo-texte { display: flex; align-items: center; gap: 8px; }
.vd-logo-nom {
  font-family: var(--police-titre); font-weight: 800; font-size: 19px;
  letter-spacing: -.01em; text-transform: uppercase; color: var(--texte);
  white-space: nowrap;
}
.vd-logo-etat {
  font-size: 11.5px; font-weight: 800; letter-spacing: .09em; color: var(--accent);
  border: 1px solid var(--accent-vif); border-radius: 4px; padding: 2px 6px;
}

.vd-nav { display: flex; gap: 4px; margin-left: auto; }
.vd-nav a { white-space: nowrap;
  padding: 9px 14px; border-radius: var(--rayon);
  font-size: 15px; font-weight: 700; color: var(--texte-2);
  transition: color .15s ease, background .15s ease;
}
.vd-nav a:hover { color: var(--texte); background: var(--voile); }
.vd-nav a.actif { color: var(--texte); }

.vd-entete-actions { display: flex; align-items: center; gap: 10px; }
.vd-btn-icone {
  width: 42px; height: 42px; display: grid; place-items: center;
  border-radius: var(--rayon); background: transparent;
  border: 1px solid var(--bord); color: var(--texte-2); cursor: pointer;
  transition: color .15s ease, border-color .15s ease;
}
.vd-btn-icone:hover { color: var(--texte); border-color: var(--bord-clair); }
.vd-menu-bouton { display: none; }

/* Le sélecteur de langue : discret dans l'en-tête, il reprend le trait des
   boutons d'icône. */
.vd-langue { position: relative; display: inline-flex; }
.vd-langue select {
  appearance: none; -webkit-appearance: none;
  height: 42px; padding: 0 30px 0 14px; border-radius: var(--rayon);
  background: transparent; border: 1px solid var(--bord); color: var(--texte-2);
  font-family: var(--police); font-size: 13.5px; font-weight: 800; letter-spacing: .06em;
  cursor: pointer; transition: color .15s ease, border-color .15s ease;
}
.vd-langue select:hover { color: var(--texte); border-color: var(--bord-clair); }
.vd-langue select option { background: var(--bloc); color: var(--texte); }
/* Le petit chevron, dessiné en bordure. */
.vd-langue::after {
  content: ""; position: absolute; right: 13px; top: 50%; width: 7px; height: 7px;
  margin-top: -5px; pointer-events: none;
  border-right: 2px solid var(--texte-3); border-bottom: 2px solid var(--texte-3);
  transform: rotate(45deg);
}
.vd-nav-mobile { display: none; }

/* --- Hero -------------------------------------------------------------------- */
/* Le haut de page porte son décor : il lui faut un repère et des ciseaux,
   sinon les cadres déborderaient sur la section suivante. */
.vd-hero { position: relative; overflow: hidden; padding: 74px 0 56px; }
.vd-hero-corps { position: relative; z-index: 1; }

/* --- Le fond du haut de page : les braises -------------------------------
   Le rouge de la marque, l'or de son étoile et un souffle du violet du
   carrousel, posés en trois halos très flous derrière le titre — une lumière
   de scène, pas un décor à lire. Rien à charger : trois éléments vides et des
   dégradés.

   Les halos dérivent lentement, chacun à son rythme et sans jamais retomber
   ensemble : les trois durées sont premières entre elles, donc la boucle ne
   se laisse pas repérer. Le flou est posé sur le conteneur, une seule fois,
   plutôt que sur chaque halo : c'est une passe de rendu au lieu de trois. */
.vd-fond-braises {
  position: absolute; inset: -14%; z-index: 0; pointer-events: none;
  filter: blur(16px);
}
.vd-fond-braises i { position: absolute; display: block; border-radius: 50%; }

/* Le rouge, en haut à gauche : il chauffe le titre sans passer dessous. */
.vd-fond-braises i:nth-child(1) {
  left: 2%; top: -8%; width: 46%; height: 58%;
  background: radial-gradient(closest-side,
    color-mix(in srgb, var(--rouge) 30%, transparent), transparent 72%);
  animation: vd-braise-a 13s ease-in-out infinite;
}
/* L'or, en bas à droite : il répond au rouge en diagonale. */
.vd-fond-braises i:nth-child(2) {
  right: 2%; bottom: -10%; width: 44%; height: 56%;
  background: radial-gradient(closest-side,
    color-mix(in srgb, var(--or) 22%, transparent), transparent 72%);
  animation: vd-braise-b 17s ease-in-out infinite;
}
/* Le violet du carrousel, en haut à droite, à peine : il empêche les deux
   autres de faire un simple dégradé rouge-or. */
.vd-fond-braises i:nth-child(3) {
  right: 22%; top: -14%; width: 36%; height: 46%;
  background: radial-gradient(closest-side,
    color-mix(in srgb, #9B5CFF 16%, transparent), transparent 74%);
  animation: vd-braise-c 23s ease-in-out infinite;
}

/* Trois étapes plutôt que deux : un aller-retour se devine, un parcours en
   trois points se regarde. Les amplitudes sont larges — derrière un flou de
   16 px, un déplacement de 5 % ne se voyait tout simplement pas. */
@keyframes vd-braise-a {
  0%       { translate: 0 0;         scale: 1;     opacity: .82; }
  33%      { translate: 16% 10%;     scale: 1.28;  opacity: 1; }
  66%      { translate: 6% -12%;     scale: .88;   opacity: .7; }
  100%     { translate: 0 0;         scale: 1;     opacity: .82; }
}
@keyframes vd-braise-b {
  0%       { translate: 0 0;         scale: 1.1;   opacity: .9; }
  33%      { translate: -18% -9%;    scale: .86;   opacity: .68; }
  66%      { translate: -7% 13%;     scale: 1.22;  opacity: 1; }
  100%     { translate: 0 0;         scale: 1.1;   opacity: .9; }
}
@keyframes vd-braise-c {
  0%       { translate: 0 0;         scale: .92;   opacity: .75; }
  33%      { translate: -13% 16%;    scale: 1.24;  opacity: 1; }
  66%      { translate: 11% 6%;      scale: 1;     opacity: .72; }
  100%     { translate: 0 0;         scale: .92;   opacity: .75; }
}

/* Sur un téléphone, les braises se figent : elles tourneraient en permanence
   sous le doigt, sur batterie, derrière un texte déjà serré. Elles restent —
   c'est la couleur qui fait le fond, pas le mouvement — mais en retrait. */
@media (max-width: 620px) {
  .vd-fond-braises { filter: blur(22px); opacity: .6; }
  .vd-fond-braises i { animation: none; }
}
@media (prefers-reduced-motion: reduce) {
  .vd-fond-braises i { animation: none; }
}
.vd-hero-corps {
  display: grid; gap: 54px; align-items: center;
  grid-template-columns: 1.02fr .98fr;
}
/* La pastille au-dessus du titre : une phrase, un lien, une flèche. */
.vd-pastille {
  display: inline-flex; align-items: center; gap: 11px; margin-bottom: 26px;
  padding: 9px 16px 9px 18px; border-radius: 999px; font-size: 14px;
  background: var(--bloc-2); border: 1px solid var(--bord);
  transition: border-color .2s ease, transform .2s ease;
}
.vd-pastille:hover { border-color: var(--bord-clair); transform: translateY(-1px); }
.vd-pastille b { color: var(--texte); font-weight: 800; }
.vd-pastille span { color: var(--texte-3); }
.vd-pastille i { display: inline-flex; color: var(--accent); }

/* La colonne des gestes : sept lignes visibles, estompées aux deux bouts.
   Elles montent d'un cran, et celle du milieu s'allume. */
.vd-defile {
  --pas: 64px;
  position: relative; height: calc(var(--pas) * 7); overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, transparent, #000 24%, #000 76%, transparent);
  mask-image: linear-gradient(to bottom, transparent, #000 24%, #000 76%, transparent);
}
.vd-defile-piste { transition: transform .75s cubic-bezier(.4, .01, .2, 1); will-change: transform; }
.vd-defile-ligne {
  display: flex; align-items: center; gap: 16px; height: var(--pas);
  font-family: var(--police-titre); font-weight: 800; line-height: 1.05;
  font-size: clamp(19px, 2.2vw, 31px); letter-spacing: -.01em; white-space: nowrap;
  /* Assez pâle pour que la ligne allumée ressorte, assez dense pour se lire. */
  color: color-mix(in srgb, var(--texte) 34%, transparent);
  transition: color .3s ease;
}
.vd-defile-ligne span { min-width: 0; }
/* À gauche du geste allumé, le logo du plugin qui le fait : il garde sa place
   même éteint, pour que rien ne se décale d'une ligne à l'autre. */
.vd-defile-logo {
  flex: none; width: 40px; height: 40px; padding: 6px; border-radius: 12px;
  object-fit: contain; opacity: 0; transform: scale(.78) translateX(-8px);
  background: color-mix(in srgb, var(--accent-geste, var(--accent)) 15%, var(--bloc));
  border: 1px solid color-mix(in srgb, var(--accent-geste, var(--accent)) 42%, var(--bord));
  box-shadow: 0 0 22px color-mix(in srgb, var(--accent-geste, var(--accent)) 32%, transparent);
  transition: opacity .35s ease, transform .35s cubic-bezier(.2, .8, .3, 1.1);
}
.vd-defile-ligne.actif { color: var(--texte); }
.vd-defile-ligne.actif .vd-defile-logo { opacity: 1; transform: scale(1) translateX(0); }

.vd-hero h1 { margin-bottom: 24px; }
.vd-hero-chapeau { font-size: 19px; max-width: 520px; }
.vd-hero-actions { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 30px; }
/* La ligne qui rassure, juste sous les boutons. */
.vd-hero-rassure {
  margin: 18px 0 0; font-size: 14px; color: var(--texte-3);
}
.vd-hero-rassure span::after { content: " · "; }
.vd-hero-rassure span:last-child::after { content: ""; }

.vd-hero-media { position: relative; }
.vd-hero-media img {
  width: 100%; height: auto; border-radius: var(--rayon-l);
  border: 1px solid var(--bord); box-shadow: var(--ombre);
}
/* La lueur derrière la capture, dans la couleur du plugin montré. */
.vd-hero-media::before {
  content: ""; position: absolute; inset: 8% -6% -10% -6%; z-index: -1;
  background: radial-gradient(60% 60% at 50% 50%,
    color-mix(in srgb, var(--accent-doux) 25%, transparent), transparent 72%);
  filter: blur(18px);
}

/* --- Bande de chiffres --------------------------------------------------- */
/* Un chiffre par case, son libellé dessous, et une précision en plus petit.
   Attention : le libellé ne doit pas déteindre sur le chiffre — c'est ce qui
   écrasait le compteur au milieu de son propre « + ». */
.vd-chiffres {
  /* Cinq chiffres dans une grille automatique : dès que la rangée n'est pas
     pleine, la case manquante laissait voir la couleur des séparateurs — un
     grand rectangle gris. En flex, la dernière rangée s'étire et remplit. */
  display: flex; flex-wrap: wrap; gap: 1px; background: var(--bord);
  border: 1px solid var(--bord); border-radius: var(--rayon-l); overflow: hidden;
}
.vd-chiffres > div {
  flex: 1 1 190px;
  background: var(--noir); padding: 30px 24px 26px; text-align: center;
  transition: background .25s ease;
}
.vd-chiffres > div:hover { background: var(--bloc); }
.vd-chiffres b {
  display: block; margin-bottom: 12px;
  font-family: var(--police-titre); font-size: clamp(38px, 4vw, 52px); font-weight: 800;
  line-height: 1; letter-spacing: -.03em; color: var(--texte);
}
/* Le « + » et le « j » accompagnent le chiffre sans lui voler la vedette. */
.vd-chiffres b i { font-style: normal; font-size: .62em; color: var(--accent); }
.vd-chiffres b span { font: inherit; color: inherit; letter-spacing: inherit; }
.vd-chiffres > div > span {
  display: block; font-size: 14.5px; font-weight: 700; color: var(--texte-2);
}
.vd-chiffres em {
  display: block; margin-top: 4px; font-style: normal;
  font-size: 12.5px; color: var(--texte-3);
}

/* --- Cartes ------------------------------------------------------------------- */
.vd-grille { display: grid; gap: clamp(14px, 1.8vw, 22px); }
.vd-grille-2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr)); }
.vd-grille-3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); }

.vd-carte {
  padding: clamp(20px, 2.4vw, 28px); border-radius: var(--rayon-l);
  background: var(--carte); border: 1px solid var(--bord);
  transition: transform .2s ease, border-color .2s ease;
}
.vd-carte:hover { transform: translateY(-4px); border-color: var(--bord-clair); }
.vd-carte h3, .vd-carte .vd-titre-carte { margin-bottom: 10px; }
.vd-carte p { font-size: 16px; margin: 0; }

/* --- Carte d'un plugin -------------------------------------------------------- */
.vd-produit {
  display: flex; flex-direction: column; overflow: hidden; padding: 0;
  border-top: 4px solid var(--accent-produit, var(--accent));
}
.vd-produit:hover { border-color: var(--bord-clair); border-top-color: var(--accent-produit, var(--accent)); }
.vd-produit-image {
  position: relative; aspect-ratio: 16 / 11; overflow: hidden;
  background: var(--bloc); border-bottom: 1px solid var(--bord);
}
.vd-produit-image img {
  width: 100%; height: 100%; object-fit: cover; object-position: top center;
  transition: transform .6s cubic-bezier(.2, .7, .3, 1);
}
.vd-produit:hover .vd-produit-image img { transform: scale(1.04); }
.vd-produit-badge {
  position: absolute; left: 16px; top: 16px;
  display: inline-flex; align-items: center; gap: 9px;
  padding: 7px 13px 7px 8px; border-radius: 999px;
  background: var(--flottant); border: 1px solid var(--bord);
  font-family: var(--police-titre); font-size: 14px; font-weight: 800;
}
.vd-produit-badge img { width: 24px; height: 24px; border-radius: 7px; }
.vd-produit-badge i { font-style: normal; font-size: 11px; color: var(--accent-produit, var(--accent)); }
.vd-produit-corps { padding: 26px 28px 30px; display: flex; flex-direction: column; gap: 14px; flex: 1; }
.vd-produit-chiffre {
  font-size: 13px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: var(--accent-produit, var(--accent));
}
.vd-produit-points { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 9px; }
.vd-produit-points li { position: relative; padding-left: 24px; font-size: 15.5px; color: var(--texte-2); }
.vd-produit-points li::before {
  content: ""; position: absolute; left: 0; top: 9px; width: 11px; height: 6px;
  border-left: 2px solid var(--accent-produit, var(--accent));
  border-bottom: 2px solid var(--accent-produit, var(--accent));
  transform: rotate(-45deg);
}
.vd-produit-pied { margin-top: auto; padding-top: 6px; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.vd-produit .vd-btn-principal { background: var(--accent-produit, var(--accent)); }
.vd-produit .vd-btn-principal:hover { filter: brightness(1.1); background: var(--accent-produit, var(--accent)); }

/* --- Les plugins en rangées alternées ---------------------------------------- */
/* Une rangée sur deux inverse l'image et le texte : la page respire, et chaque
   plugin a droit à une grande capture plutôt qu'à une vignette. */
.vd-rangees { display: flex; flex-direction: column; gap: 80px; }
.vd-rangee {
  display: grid; gap: 54px; align-items: center;
  grid-template-columns: 1.05fr .95fr;
}
.vd-rangee.inverse .vd-rangee-media { order: 2; }

/* La colonne image suit la hauteur du texte ; l'image, elle, garde ses
   proportions : elle se contente de ne jamais dépasser ce cadre. */
.vd-rangee { align-items: stretch; }
.vd-rangee-media {
  position: relative; z-index: 0;
  display: flex; align-items: center; justify-content: center; min-width: 0;
}
.vd-rangee-cadre {
  position: relative; z-index: 1; display: block; max-height: 100%; max-width: 100%;
  border-radius: var(--rayon-l); overflow: hidden;
  border: 1px solid color-mix(in srgb, var(--accent-produit, var(--accent)) 45%, var(--bord));
  /* Le liseré coloré, la lueur proche, puis l'ombre portée. */
  box-shadow:
    0 0 0 1px color-mix(in srgb, var(--accent-produit, var(--accent)) 45%, transparent),
    0 0 26px color-mix(in srgb, var(--accent-produit, var(--accent)) 14%, transparent),
    0 0 90px color-mix(in srgb, var(--accent-produit, var(--accent)) 10%, transparent),
    0 28px 70px rgba(0, 0, 0, .55);
  transition: transform .35s cubic-bezier(.2, .7, .3, 1), box-shadow .35s ease;
}
/* La capture ne dépasse jamais ce que l'écran peut montrer d'un coup : au
   pire elle rétrécit, elle ne s'étire ni ne se déforme. */
.vd-rangee-cadre img {
  display: block; width: auto; height: auto;
  max-width: 100%; max-height: min(62vh, 560px);
}

/* Le cadre qui porte un logo plutôt qu'une capture : le logo respire au
   centre, sur le fond de la couleur du plugin. */
/* Juste le logo : ni cadre, ni fond, ni bordure — seule la lueur diffuse
   derrière lui le décolle du noir. */
/* La double classe est nécessaire : la règle de survol du cadre est plus
   précise qu'une classe seule, et remettait son liseré et son halo
   rectangulaires dès que la souris passait dessus. */
.vd-rangee-cadre.vd-rangee-logo {
  /* Le cadre épouse le logo : plus de rapport 16/11 hérité des captures, qui
     laissait un grand vide autour, ni de gros rembourrage. Juste la place
     qu'il faut pour que la lueur ne soit pas coupée. */
  display: grid; place-items: center; width: auto; max-width: 100%;
  aspect-ratio: auto; padding: clamp(14px, 2vw, 26px);
  background: none; border: 0; box-shadow: none; border-radius: 0; overflow: visible;
}
.vd-rangee-media:hover .vd-rangee-cadre.vd-rangee-logo {
  transform: none; box-shadow: none; border: 0;
}
.vd-rangee-logo img {
  /* Le logo remplit mieux sa colonne : sans le vide hérité du cadre, il
     peut grandir sans écraser le texte d'en face. */
  width: clamp(132px, 21vw, 300px); height: auto;
  /* La lueur épouse le logo : drop-shadow suit sa silhouette, pas sa boîte. */
  filter:
    drop-shadow(0 0 14px color-mix(in srgb, var(--accent-produit, var(--accent)) 11%, transparent))
    drop-shadow(0 0 48px color-mix(in srgb, var(--accent-produit, var(--accent)) 8%, transparent))
    drop-shadow(0 18px 38px rgba(0, 0, 0, .5));
  transition: transform .35s cubic-bezier(.2, .7, .3, 1), filter .35s ease;
}
.vd-rangee-media:hover .vd-rangee-logo img {
  filter:
    drop-shadow(0 0 18px color-mix(in srgb, var(--accent-produit, var(--accent)) 13%, transparent))
    drop-shadow(0 0 70px color-mix(in srgb, var(--accent-produit, var(--accent)) 10%, transparent))
    drop-shadow(0 22px 46px rgba(0, 0, 0, .55));
}
.vd-rangee-media:hover .vd-rangee-logo img { transform: scale(1.05) rotate(-2deg); }

/* Un plugin annoncé mais pas encore en vente : même rangée, mention à la
   place du bouton, et tout le bloc légèrement en retrait. */
.vd-rangee.avenir .vd-rangee-media { opacity: .82; }
.vd-indisponible {
  display: inline-flex; align-items: center; gap: 9px; margin-top: 4px;
  padding: 11px 18px; border-radius: var(--rayon);
  font-size: 15px; font-weight: 800; color: var(--texte-2);
  background: var(--bloc-2); border: 1px dashed var(--bord-clair);
}
.vd-indisponible::before {
  content: ""; width: 8px; height: 8px; border-radius: 50%; flex: none;
  background: var(--accent-produit, var(--accent));
}
.vd-rangee-media:hover .vd-rangee-cadre {
  transform: translateY(-6px);
  box-shadow:
    0 0 0 1px color-mix(in srgb, var(--accent-produit, var(--accent)) 75%, transparent),
    0 0 34px color-mix(in srgb, var(--accent-produit, var(--accent)) 18%, transparent),
    0 0 120px color-mix(in srgb, var(--accent-produit, var(--accent)) 14%, transparent),
    0 34px 80px rgba(0, 0, 0, .6);
}
/* Le halo diffus, posé derrière le cadre mais au-dessus du fond de section :
   en z-index négatif il passait sous ce fond et ne se voyait pas. */
.vd-rangee-media::before {
  /* Une lueur derrière une capture, jamais derrière un logo : elle y dessinait
     une forme rectangulaire que rien ne justifiait. */
  content: ""; position: absolute; inset: -4% 6%; z-index: 0; pointer-events: none;
  border-radius: 50%;
  background: radial-gradient(closest-side,
    color-mix(in srgb, var(--accent-produit, var(--accent)) 15%, transparent), transparent 72%);
  filter: blur(54px); opacity: .85;
  transition: opacity .35s ease, transform .35s ease;
}
.vd-rangee-media:hover::before { opacity: 1; transform: scale(1.06); }

/* Derrière un logo, aucun halo : le logo se suffit, avec sa seule ombre
   portée qui épouse sa silhouette. */
.vd-rangee-media:has(.vd-rangee-logo)::before { content: none; }

/* Le texte garde une largeur de lecture : il ne s'étale pas sur toute la
   colonne, et chaque ligne reste sous la largeur du titre. */
.vd-rangee-texte {
  display: flex; flex-direction: column; gap: 12px; align-items: flex-start;
  max-width: 520px;
}
.vd-rangee-texte p, .vd-rangee-texte .vd-produit-points { max-width: 100%; }
.vd-rangee-texte h3 { font-size: clamp(25px, 2.7vw, 34px); margin: 0; }
.vd-rangee-texte p { font-size: 16.5px; margin: 0; }
.vd-rangee-texte .vd-produit-points { gap: 7px; }
.vd-rangee-texte .vd-produit-points li { line-height: 1.45; }
.vd-rangee-texte .vd-btn { margin-top: 4px; min-height: 48px; }
.vd-rangee-texte .vd-btn-principal { background: var(--accent-produit, var(--accent)); }
.vd-rangee-texte .vd-btn-principal:hover { filter: brightness(1.1); }
.vd-rangee-marque {
  display: inline-flex; align-items: center; gap: 11px;
  font-family: var(--police-titre); font-size: 17px; font-weight: 800;
}
.vd-rangee-marque img { width: 30px; height: 30px; border-radius: 9px; }
.vd-rangee-marque i { font-style: normal; font-size: 12px; color: var(--accent-produit, var(--accent)); }
.vd-rangee .vd-produit-chiffre { font-size: 13px; }


/* --- La vie posée sur les captures ---------------------------------------------- */
/* Les captures sont des images fixes ; cette couche rejoue par-dessus ce que le
   plugin fait vraiment : les dégradés dérivent, la forme 3D se balance, les
   calques flottent, et les curseurs glissent quand la souris arrive. Les
   positions viennent de mesures prises dans le plugin (voir js/vd-config.js). */
.vd-vie { position: absolute; inset: 1px; border-radius: var(--rayon-l); overflow: hidden; pointer-events: none; }
.vd-vie-scene { position: absolute; overflow: hidden; border-radius: 6px; }

/* Arrière-plans : trois taches de couleur qui se mélangent et dérivent. */
.vd-vie-degrade { background: #0b0b14; }
.vd-vie-degrade i {
  position: absolute; width: 130%; height: 80%; border-radius: 50%;
  filter: blur(26px); opacity: .95; mix-blend-mode: screen;
  animation: vd-derive 14s ease-in-out infinite alternate;
}
.vd-vie-degrade i:nth-child(1) { left: -30%; top: -12%; background: #3d6bff; }
.vd-vie-degrade i:nth-child(2) { left: -10%; top: 26%; background: #b46cff; animation-duration: 18s; animation-delay: -4s; }
.vd-vie-degrade i:nth-child(3) { left: -25%; top: 58%; background: #ff5f9e; animation-duration: 22s; animation-delay: -9s; }
@keyframes vd-derive {
  from { transform: translate3d(-6%, -4%, 0) scale(1); }
  to   { transform: translate3d(10%, 8%, 0) scale(1.18); }
}

/* Carrousel : quelques calques qui flottent dans l'aperçu. */
.vd-vie-calques { background: transparent; }
.vd-vie-calques i {
  position: absolute; border-radius: 3px;
  animation: vd-flotte 7s ease-in-out infinite alternate;
}
/* Les calques d'un carrousel sont des vignettes debout, pas des barres. */
.vd-vie-calques i:nth-child(1) { left: 8%; top: 12%; width: 34%; height: 22%; background: #4d9bff; }
.vd-vie-calques i:nth-child(2) { left: 46%; top: 30%; width: 40%; height: 26%; background: #f5b82e; animation-duration: 9s; animation-delay: -3s; }
.vd-vie-calques i:nth-child(3) { left: 14%; top: 58%; width: 36%; height: 24%; background: #ff6ea9; animation-duration: 11s; animation-delay: -6s; }
@keyframes vd-flotte {
  from { transform: translateY(-5%) rotate(-1deg); }
  to   { transform: translateY(6%) rotate(1.5deg); }
}

/* Formes & Couleurs : la forme extrudée se balance, comme quand on la tourne. */
.vd-vie-rotation { background: transparent; perspective: 600px; }
.vd-vie-forme {
  position: absolute; left: 26%; top: 30%; width: 48%; height: 34%;
  background: linear-gradient(160deg, #46f08a, #17c46a);
  clip-path: polygon(50% 0%, 93% 25%, 93% 75%, 50% 100%, 7% 75%, 7% 25%);
  box-shadow: 0 14px 0 -2px rgba(10, 90, 50, .9);
  animation: vd-tourne 9s ease-in-out infinite alternate;
}
@keyframes vd-tourne {
  from { transform: rotateY(-38deg) rotateX(6deg); }
  to   { transform: rotateY(38deg) rotateX(-4deg); }
}

/* Les curseurs : la poignée glisse, la barre se remplit derrière elle. */
.vd-vie-curseur { position: absolute; height: 3px; transform: translateY(-1px); }
/* La partie remplie du rail : elle s'étire jusqu'à la poignée. */
.vd-vie-curseur::before {
  content: ""; position: absolute; left: 0; top: 50%; height: 3px; margin-top: -1.5px;
  width: 18%; border-radius: 2px;
  background: var(--accent-produit, var(--accent)); opacity: 0;
}
.vd-vie-curseur i {
  position: absolute; top: 50%; left: 18%; width: 10px; height: 10px; margin-top: -5px;
  border-radius: 50%; background: var(--texte); box-shadow: 0 0 0 2px var(--noir);
  opacity: 0; transform: translateX(-50%);
}
/* Au survol, la barre et sa poignée avancent ensemble. */
.vd-rangee-media:hover .vd-vie-curseur::before {
  animation: vd-rail 2.6s cubic-bezier(.4, 0, .2, 1) var(--retard, 0s) infinite alternate;
}
.vd-rangee-media:hover .vd-vie-curseur i {
  animation: vd-curseur 2.6s cubic-bezier(.4, 0, .2, 1) var(--retard, 0s) infinite alternate;
}
@keyframes vd-curseur {
  0%   { opacity: 0; left: 18%; }
  12%  { opacity: 1; }
  88%  { opacity: 1; }
  100% { opacity: 1; left: 72%; }
}
@keyframes vd-rail {
  0%   { opacity: 0; width: 18%; }
  12%  { opacity: 1; }
  88%  { opacity: 1; }
  100% { opacity: 1; width: 72%; }
}

/* --- Les logiciels compatibles : texte à gauche, grille animée à droite -------- */
/* Pictogrammes dessinés pour le site : les icônes d'Adobe et de CapCut sont
   leurs marques, on ne les reproduit pas — on cite leurs noms, ce qui est libre. */
.vd-compat { display: grid; gap: 54px; align-items: center; grid-template-columns: .95fr 1.05fr; }
.vd-compat-texte h2 { font-size: clamp(28px, 3.4vw, 42px); }
.vd-compat-texte p { font-size: 17px; margin: 0; }

/* Sept logiciels : aucune grille ne les range sans laisser une tuile seule
   en bas, à toutes les largeurs. Les rangées sont donc centrées, et une
   tuile esseulée reste à sa taille au lieu de s’étirer sur tout le bloc. */
.vd-compat-grille { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; }
/* Des tuiles carrées, donc toutes de la même taille : elles ne s'étirent plus
   pour remplir leur ligne. Sans cela, la dernière ligne — souvent une seule
   tuile — s'élargissait jusqu'à 260 px et devenait un carré deux fois plus
   grand que ses voisines. Elles se rangent centrées, et la ligne incomplète
   reste au milieu. */
.vd-compat-grille > * { flex: 0 1 clamp(96px, 11vw, 132px); }
.vd-logiciel {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 9px;
  aspect-ratio: 1;
  padding: 14px 10px; border-radius: var(--rayon-l);
  border: 1px solid var(--bord); background: var(--carte);
  font-size: 13.5px; font-weight: 700; color: var(--texte-2); text-align: center;
  line-height: 1.25;
  transition: border-color .2s ease, transform .2s ease, color .2s ease;
}
.vd-logiciel b { font-weight: 700; }
.vd-logiciel svg {
  /* 21 px : le dessin ne fait plus la moitié de la tuile. C'est le nom qu'on
     lit ; le pictogramme n'est là que pour le repérer d'un coup d'œil. */
  width: 21px; height: 21px; flex: none;
  color: var(--texte-3);
  animation: vd-respire 4.5s ease-in-out infinite;
  animation-delay: var(--retard, 0s);
}
.vd-logiciel:hover { border-color: var(--accent); color: var(--texte); transform: translateY(-4px); }
.vd-logiciel:hover svg { color: var(--accent); }
@keyframes vd-respire {
  0%, 100% { transform: translateY(0) scale(1); }
  50%      { transform: translateY(-5px) scale(1.06); }
}

/* Les tuiles arrivent l'une après l'autre, comme les calques du mode « Grille »
   du carrousel — et elles restent en place ensuite. */
.vd-logiciel.vd-monte, .vd-usage.vd-monte { transform: scale(.88) translateY(14px); }
.vd-logiciel.vd-monte.vu, .vd-usage.vd-monte.vu { transform: none; }

/* --- Les usages : du texte, rien d'autre ---------------------------------------- */
/* Un métier n'a pas de logo. Des cartouches, un point de couleur, et le mot. */
.vd-usages { display: flex; flex-wrap: wrap; gap: 9px; align-content: flex-start; }
.vd-usage {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 15px; border-radius: 999px;
  border: 1px solid var(--bord); background: var(--carte);
  font-size: 14.5px; font-weight: 700; color: var(--texte-2);
  transition: border-color .18s ease, color .18s ease, transform .18s ease;
}
.vd-usage::before {
  content: ""; width: 6px; height: 6px; border-radius: 50%;
  background: var(--accent); flex: 0 0 auto;
  transition: transform .18s ease;
}
.vd-usage:hover { border-color: var(--accent); color: var(--texte); transform: translateY(-3px); }
.vd-usage:hover::before { transform: scale(1.5); }

/* --- Le prix, dès le haut de la fiche ------------------------------------------- */
/* Le prix est la chose qu'on vient chercher : il a droit à un cadre qui se
   voit. Un liseré franc dans la couleur du plugin, un fond teinté, et un
   halo mesuré — assez pour que l'œil y tombe en arrivant, pas assez pour
   que la page devienne une fête foraine. */
.vd-hero-prix {
  display: flex; flex-direction: column; gap: 10px; align-items: flex-start;
  margin: 30px 0 4px; padding: 26px 30px;
  border-radius: var(--rayon-l); max-width: 520px;
  border: 2px solid color-mix(in srgb, var(--accent) 72%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--accent) 20%, var(--carte)) 0%, var(--carte) 72%);
  /* La lueur ne fait plus que poser la carte sur le fond : c'est le prix
     qu'on doit voir, pas le halo autour. L'ombre noire, elle, reste : c'est
     elle qui décolle la carte, et elle ne colore rien. */
  box-shadow: 0 0 44px color-mix(in srgb, var(--accent) 16%, transparent),
              0 18px 48px rgba(0, 0, 0, .45);
}
/* Le chiffre lui-même grandit avec l'écran : c'est lui qu'on lit de loin. */
.vd-hero-prix .vd-prix b { font-size: clamp(38px, 4.6vw, 52px); letter-spacing: -.02em; }
.vd-hero-prix-note { font-size: 14px; color: var(--texte-3); }
.vd-hero-prix-note a { color: var(--accent); font-weight: 700; }
.vd-hero-prix-note a:hover { text-decoration: underline; }
.vd-hero-prix-pack { font-size: 14.5px; font-weight: 700; color: var(--texte-2); }

/* --- Prix (fiches produits et commande) ---------------------------------------- */
.vd-prix { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.vd-prix b { font-family: var(--police-titre); font-size: 30px; font-weight: 800; }
.vd-prix s { color: var(--texte-2); font-size: 17px; text-decoration-thickness: 2px; }
/* La remise se lisait en couleur pâle sur fond pâle. Elle est désormais
   posée en plein, comme une étiquette collée sur le prix. */
.vd-prix-promo {
  padding: 6px 12px; border-radius: var(--rayon); font-size: 13px; font-weight: 800;
  letter-spacing: .06em; text-transform: uppercase;
  background: var(--accent-produit, var(--accent)); color: #fff;
  box-shadow: 0 6px 16px color-mix(in srgb, var(--accent-produit, var(--accent)) 40%, transparent);
}

/* Le récapitulatif d'une commande : même allure qu'une carte d'offre. */
.vd-carte-prix {
  border-color: color-mix(in srgb, var(--accent) 40%, var(--bord));
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--accent) 10%, var(--carte)) 0%, var(--carte) 60%);
  box-shadow: 0 0 40px color-mix(in srgb, var(--accent) 2%, transparent),
              0 18px 48px rgba(0, 0, 0, .45);
}

/* --- Étapes numérotées ---------------------------------------------------------- */
.vd-etape {
  display: block; margin-bottom: 16px;
  font-family: var(--police-titre); font-size: 44px; font-weight: 800; line-height: 1;
  color: var(--accent); opacity: .9;
}

/* --- Plugins en préparation ------------------------------------------------------ */
.vd-avenir { margin-top: 26px; }
.vd-avenir-liste { display: grid; gap: 18px; grid-template-columns: repeat(auto-fit, minmax(380px, 1fr)); }
.vd-avenir-carte {
  display: flex; align-items: center; gap: 18px;
  padding: 20px 22px; border-radius: var(--rayon-l);
  background: transparent; border: 1px dashed var(--bord-clair);
  transition: border-color .18s ease;
}
.vd-avenir-carte:hover { border-color: var(--accent-produit, var(--accent)); }
.vd-avenir-carte img { width: 54px; height: 54px; border-radius: 14px; flex: 0 0 auto; opacity: .9; }
.vd-avenir-carte b { display: block; font-family: var(--police-titre); font-size: 17px; margin-bottom: 4px; }
.vd-avenir-carte p { margin: 0; font-size: 14.5px; }
.vd-avenir-carte .vd-btn { flex: 0 0 auto; }

/* --- Témoignages : deux files qui se croisent --------------------------------- */
/* Celle du haut part vers la droite, celle du bas vers la gauche. Le survol met
   la file en pause, le temps de lire. */
.vd-avis-piste {
  overflow: hidden; padding: 4px 0;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}
.vd-avis-piste + .vd-avis-piste { margin-top: 18px; }
.vd-avis-file { display: flex; gap: 18px; width: max-content; }
.vd-avis-piste.vers-gauche .vd-avis-file { animation: vd-file-gauche 46s linear infinite; }
.vd-avis-piste.vers-droite .vd-avis-file { animation: vd-file-droite 52s linear infinite; }
.vd-avis-piste:hover .vd-avis-file { animation-play-state: paused; }
@keyframes vd-file-gauche { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@keyframes vd-file-droite { from { transform: translateX(-50%); } to { transform: translateX(0); } }

.vd-avis {
  flex: 0 0 auto; width: min(348px, 82vw);
  display: flex; flex-direction: column; align-items: center; text-align: center;
  padding: clamp(26px, 2.8vw, 34px) clamp(22px, 2.2vw, 28px);
  border-radius: var(--rayon-l);
  background: var(--carte); border: 1px solid var(--bord);
}
/* Le portrait, en grand : c'est le visage qu'on regarde avant de lire.
   Sa lueur reprend la couleur du plugin, comme celle des logos. */
.vd-avis-portrait {
  width: clamp(96px, 10vw, 124px); aspect-ratio: 1; flex: none;
  border-radius: 50%; overflow: hidden; display: grid; place-items: center;
  position: relative;
  margin-bottom: 18px;
  background: color-mix(in srgb, var(--accent-avis, var(--accent)) 16%, var(--carte));
  border: 2px solid color-mix(in srgb, var(--accent-avis, var(--accent)) 40%, transparent);
  box-shadow:
    0 0 0 7px color-mix(in srgb, var(--accent-avis, var(--accent)) 8%, transparent),
    0 0 28px color-mix(in srgb, var(--accent-avis, var(--accent)) 22%, transparent);
  color: var(--accent-avis, var(--accent));
  font-family: var(--police-titre); font-weight: 800;
  font-size: clamp(30px, 3vw, 38px); letter-spacing: .01em;
}
/* Le portrait remplit le rond. Posée dans le flux, l’image reprenait ses
   proportions d’origine et débordait par le bas ; calée sur les quatre
   bords, elle se recadre toute seule. */
.vd-avis-portrait img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.vd-avis b { font-family: var(--police-titre); font-size: 18px; letter-spacing: -.01em; }
.vd-avis-role { margin-top: 5px; font-size: 13.5px; color: var(--texte-3); }
/* La phrase prend la place qui reste : côte à côte, les cartes d'une file
   gardent la même hauteur quel que soit le nombre de lignes. */
.vd-avis p {
  flex: 1; display: flex; align-items: center;
  margin: 16px 0 0; font-size: 16px; line-height: 1.6; color: var(--texte-2);
}
/* Un emplacement qui attend son vrai retour se reconnaît à son contour. */
.vd-avis.exemple { border-style: dashed; }

/* --- Appel final ---------------------------------------------------------------------- */
.vd-appel {
  text-align: center; padding: clamp(40px, 6vw, 84px) clamp(20px, 3vw, 32px); border-radius: 24px;
  background: var(--bloc-2); border: 1px solid var(--bord);
}
.vd-appel h2 { margin-bottom: 18px; }
.vd-appel p { max-width: 560px; margin: 0 auto 26px; font-size: clamp(16px, 1.5vw, 18px); }
.vd-appel .vd-hero-actions { justify-content: center; }

/* --- Pied de page : la marque, les liens, la lettre d'information ------------- */
.vd-pied { border-top: 1px solid var(--bord); padding: 72px 0 30px; background: var(--noir); }
.vd-pied-corps {
  display: grid; gap: 40px; align-items: start;
  grid-template-columns: 1.5fr 1fr 1fr .8fr 1.5fr;
}
.vd-pied-marque p { margin: 18px 0 0; font-size: 15px; max-width: 280px; }
.vd-pied h2 {
  margin: 0 0 16px; font-family: var(--police);
  font-size: 12px; letter-spacing: .14em; text-transform: uppercase; color: var(--or);
}
.vd-pied ul { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 11px; }
.vd-pied a { color: var(--texte-2); font-size: 15px; transition: color .15s ease; }
.vd-pied a:hover { color: var(--texte); }
.vd-pied-reseaux a { display: inline-flex; align-items: center; gap: 9px; }

/* L'encadré d'inscription, posé à droite. */
.vd-pied-lettre {
  padding: 24px; border-radius: var(--rayon-l);
  background: var(--carte); border: 1px solid var(--bord);
  display: flex; flex-direction: column; gap: 14px;
}
.vd-pied-lettre p { margin: 0; font-size: 14px; }
.vd-pied-lettre .vd-champ { gap: 0; }
.vd-pied-lettre input { width: 100%; }
.vd-champ-invisible {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.vd-pied-lettre .vd-champ-note { font-size: 12px; line-height: 1.5; }

.vd-pied-bas {
  margin-top: 52px; padding-top: 24px; border-top: 1px solid var(--bord);
  display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  font-size: 13.5px; color: var(--texte-3);
}
.vd-pied-bas span:last-child { display: flex; gap: 24px; }
.vd-pied-bas a { font-size: 13.5px; }

/* --- Apparition au défilement --------------------------------------------------------------- */
.vd-monte { opacity: 0; transform: translateY(26px); transition: opacity .7s ease, transform .7s cubic-bezier(.2, .7, .3, 1); }
.vd-monte.vu { opacity: 1; transform: none; }

/* --- Fil de lecture et retour en haut -------------------------------------------------------- */
.vd-progres {
  position: absolute; left: 0; right: 0; bottom: -1px; height: 2px;
  background: var(--accent); transform-origin: 0 50%; transform: scaleX(0);
  pointer-events: none;
}
.vd-haut {
  position: fixed; right: 22px; bottom: 22px; z-index: 90;
  width: 46px; height: 46px; display: grid; place-items: center;
  border-radius: 50%; cursor: pointer;
  background: var(--carte-clair); border: 1px solid var(--bord); color: var(--texte-2);
  opacity: 0; transform: translateY(14px); pointer-events: none;
  transition: opacity .25s ease, transform .25s ease, color .15s ease, border-color .15s ease;
}
.vd-haut.vu { opacity: 1; transform: none; pointer-events: auto; }
.vd-haut:hover { color: var(--texte); border-color: var(--bord-clair); }

/* ==========================================================================
   PAGES INTÉRIEURES
   ========================================================================== */

/* --- Fiche d'un plugin : elle prend la couleur du plugin ----------------------- */
.vd-page-produit {
  --accent: var(--accent-produit, var(--rouge));
  --accent-2: color-mix(in srgb, var(--accent-produit, var(--rouge)) 82%, #000);
  --accent-doux: color-mix(in srgb, var(--accent-produit, var(--rouge)) 14%, transparent);
  --accent-vif: color-mix(in srgb, var(--accent-produit, var(--rouge)) 45%, transparent);
}
.vd-produit-logo {
  width: 84px; height: 84px; border-radius: 22px; margin-bottom: 22px;
  box-shadow: 0 16px 40px rgba(0, 0, 0, .5);
}

/* Les copies d'écran : la disposition « aperçu à gauche » en grand, les autres
   en dessous, chacune légendée. */
.vd-capture { margin-top: 46px; }
.vd-capture figure { margin: 0; }
.vd-capture img {
  width: 100%; height: auto; display: block; border-radius: var(--rayon-l);
  border: 1px solid var(--bord); background: var(--bloc);
  /* Le rapport des captures larges : la place est prise avant même que
     l'image arrive, la page ne saute plus. */
  aspect-ratio: 25 / 16;
}
.vd-capture figcaption { margin-top: 12px; text-align: center; font-size: 13.5px; color: var(--texte-3); }
.vd-capture-grande { max-width: 780px; margin-inline: auto; }
/* La vitrine du haut d'une fiche : une seule image, cadrée et centrée. */
.vd-capture-grande img { border-radius: var(--rayon-l); }
/* Les écrans détaillés reprennent les rangées du catalogue : même lueur, même
   alternance image / texte. */
#vd-ecrans .vd-rangee-media { cursor: default; }

/* --- Vitrine (les autres produits, en bas d'une fiche) ---------------------------- */
.vd-vitrine { display: grid; gap: 18px; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.vd-vitrine-cadre {
  position: relative; display: block; overflow: hidden;
  border-radius: var(--rayon-l); background: var(--bloc); border: 1px solid var(--bord);
  transition: transform .2s ease, border-color .2s ease;
}
.vd-vitrine-cadre:hover { transform: translateY(-4px); border-color: var(--accent-produit, var(--accent)); }
.vd-vitrine-cadre img { width: 100%; height: auto;
  aspect-ratio: 7 / 10;
}
.vd-vitrine-nom {
  position: absolute; left: 0; right: 0; bottom: 0;
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 30px 16px 14px;
  background: linear-gradient(to top, var(--flottant-fort) 38%, transparent);
  font-family: var(--police-titre); font-size: 15px; font-weight: 800;
}
.vd-vitrine-nom img { width: 22px; height: 22px; border-radius: 6px; flex: 0 0 auto; }
.vd-vitrine-nom i { font-style: normal; font-size: 12px; color: var(--accent-produit, var(--accent)); }

/* « Aussi chez VD », en bas d'une fiche : des cartes plutôt que des vignettes.
   Le logo dit le plugin mieux qu'une capture réduite à 220 px, et la phrase
   dit à quoi il sert. Les plugins annoncés ont la même carte, avec leur
   mention à la place du chiffre : elle ne mène nulle part, faute de fiche. */
.vd-vitrine-carte {
  display: flex; flex-direction: column; align-items: flex-start; gap: 10px;
  padding: clamp(20px, 2.2vw, 28px);
  border-radius: var(--rayon-l); background: var(--carte); border: 1px solid var(--bord);
  color: var(--texte);
  transition: transform .2s ease, border-color .2s ease;
}
a.vd-vitrine-carte:hover {
  transform: translateY(-4px); border-color: var(--accent-produit, var(--accent));
}
.vd-vitrine-carte > img {
  width: 54px; height: 54px; border-radius: 15px; flex: none;
  box-shadow: 0 10px 24px rgba(0, 0, 0, .35);
}
.vd-vitrine-carte b { font-family: var(--police-titre); font-size: 18px; letter-spacing: -.01em; }
.vd-vitrine-chiffre {
  font-style: normal; font-size: 12px; font-weight: 800;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--accent-produit, var(--accent));
}
.vd-vitrine-carte p { margin: 0; font-size: 14.5px; line-height: 1.5; color: var(--texte-2); }
/* Un plugin annoncé : la carte reste entière, légèrement en retrait. */
.vd-vitrine-carte.avenir { opacity: .88; }
.vd-vitrine-carte .vd-indisponible { margin-top: 0; padding: 8px 13px; font-size: 13px; }

/* --- Offres, listes, vidéos ---------------------------------------------------------- */
/* Une offre : le nom en petit, le prix en très gros, ce qu'elle contient, le
   bouton. Celle qui est mise en avant porte un bandeau collé en haut. */
.vd-offre {
  display: flex; flex-direction: column; padding: 0; overflow: hidden;
  box-shadow: 0 0 34px color-mix(in srgb, var(--accent) 8%, transparent),
              0 18px 48px rgba(0, 0, 0, .45);
  transition: transform .2s ease, box-shadow .3s ease, border-color .2s ease;
}
.vd-offre:hover {
  transform: translateY(-4px);
  box-shadow: 0 0 46px color-mix(in srgb, var(--accent) 28%, transparent),
              0 24px 60px rgba(0, 0, 0, .5);
}
.vd-offre-corps { display: flex; flex-direction: column; gap: 14px; padding: 30px 28px; flex: 1; }
.vd-offre.vedette {
  border-color: var(--accent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--accent) 12%, var(--carte)) 0%, var(--carte) 45%);
  /* L'offre mise en avant brille davantage, comme un néon derrière la carte. */
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 70%, transparent),
              0 0 60px color-mix(in srgb, var(--accent) 18%, transparent),
              0 24px 64px rgba(0, 0, 0, .5);
}
.vd-offre.vedette:hover {
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 60%, transparent),
              0 0 80px color-mix(in srgb, var(--accent) 5%, transparent),
              0 30px 74px rgba(0, 0, 0, .55);
}
.vd-offre-ruban {
  display: block; padding: 11px 16px; text-align: center;
  background: var(--accent); color: #fff; font-size: 11.5px; font-weight: 800;
  letter-spacing: .08em; text-transform: uppercase;
}
.vd-offre-nom {
  font-size: 12.5px; font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--texte-3);
}
.vd-offre > .vd-offre-corps > p { font-size: 15.5px; margin: -6px 0 4px; }
.vd-offre-prix { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.vd-offre-prix b { font-family: var(--police-titre); font-size: 44px; font-weight: 800; line-height: 1; }
.vd-offre-prix s { color: var(--texte-3); font-size: 17px; }
/* La période d'un abonnement, collée au prix : « 1 500 FCFA / mois ». */
.vd-offre-prix i { font-style: normal; font-size: 17px; font-weight: 700; color: var(--texte-2); margin-left: -6px; }

/* Les offres tiennent sur une ligne, à trois comme à quatre. */
.vd-offres { grid-template-columns: repeat(auto-fit, minmax(min(100%, 252px), 1fr)); }
.vd-offres-4 .vd-offre-corps { padding: 28px 22px; }
.vd-offres-4 .vd-offre-prix b { font-size: 36px; }
.vd-offres-4 .vd-offre .vd-produit-points li { font-size: 15px; }
.vd-offre .vd-produit-points { gap: 12px; margin: 6px 0; }
/* La pastille des points d'une offre, plus affirmée que le chevron courant. */
.vd-offre .vd-produit-points li { padding-left: 32px; font-size: 15.5px; color: var(--texte); }
.vd-offre .vd-produit-points li::before {
  content: ""; position: absolute; left: 0; top: 1px; width: 20px; height: 20px;
  border-radius: 50%; border: 0; transform: none;
  background: var(--accent-doux);
}
.vd-offre .vd-produit-points li::after {
  content: ""; position: absolute; left: 6px; top: 7px; width: 8px; height: 4px;
  border-left: 2px solid var(--accent); border-bottom: 2px solid var(--accent);
  transform: rotate(-45deg);
}
.vd-offre .vd-btn { margin-top: auto; }
.vd-offre-chiffre { font-size: 13px; font-weight: 700; color: var(--accent); }
.vd-note-tarifs { text-align: center; margin: 32px 0 0; font-size: 14.5px; color: var(--texte-3); }

.vd-modes { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
.vd-modes li {
  display: flex; align-items: center; gap: 13px;
  padding: 14px 16px; border-radius: var(--rayon);
  background: var(--carte); border: 1px solid var(--bord);
  font-size: 15px; font-weight: 600;
  transition: border-color .15s ease, transform .15s ease;
}
.vd-modes li:hover { border-color: var(--accent); transform: translateX(4px); }
.vd-modes li span {
  flex: 0 0 auto; width: 26px; height: 26px; border-radius: 7px; display: grid; place-items: center;
  background: var(--accent-doux); color: var(--accent);
  font-family: var(--police-titre); font-size: 13px; font-weight: 800;
}

.vd-video { aspect-ratio: 16 / 9; background: var(--bloc); border-bottom: 1px solid var(--bord); }
.vd-video iframe { width: 100%; height: 100%; border: 0; display: block; }
.vd-video-vide {
  width: 100%; height: 100%; display: grid; place-content: center; justify-items: center; gap: 12px;
  color: var(--texte-3); font-size: 14px; font-weight: 700;
}

/* --- Fil d'Ariane ----------------------------------------------------------------------- */
.vd-fil { font-size: 13.5px; color: var(--texte-3); margin-bottom: 22px; }
.vd-fil a { color: var(--texte-2); }
.vd-fil a:hover { color: var(--accent); }
.vd-fil span { margin: 0 7px; }

/* --- Étiquette (hero des pages intérieures) ----------------------------------------------- */
/* La carte d'identité du plugin — son nom, sa version, son chiffre — prend
   la couleur du plugin plutôt que le gris de tout le reste. */
.vd-etiquette {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 9px 18px; margin-bottom: 24px; border-radius: var(--rayon);
  background: color-mix(in srgb, var(--accent-produit, var(--accent)) 12%, var(--carte));
  border: 1px solid color-mix(in srgb, var(--accent-produit, var(--accent)) 45%, transparent);
  font-size: 13.5px; font-weight: 700; color: var(--texte-2);
}
.vd-etiquette b { color: var(--accent); }
.vd-etiquette::before {
  content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--accent);
}

/* --- Formulaires -------------------------------------------------------------------------- */
.vd-form { display: flex; flex-direction: column; gap: 18px; }
.vd-champ { display: flex; flex-direction: column; gap: 8px; }
.vd-champ label { font-size: 13.5px; font-weight: 800; color: var(--texte-2); }
.vd-champ input, .vd-champ textarea, .vd-champ select {
  /* Sans ces trois lignes, un <select> prend la largeur de sa plus longue
     option et pousse toute la page — c'est ce qui débordait sur Contact. */
  width: 100%; max-width: 100%; min-width: 0;
  padding: 14px 16px; border-radius: var(--rayon);
  background: var(--champ); border: 1px solid var(--bord); color: var(--texte);
  font-family: inherit; font-size: 16px;
}
.vd-champ input:focus, .vd-champ textarea:focus, .vd-champ select:focus {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-doux);
}
.vd-champ textarea { min-height: 140px; resize: vertical; }
.vd-champ-note { font-size: 13px; color: var(--texte-3); }

/* --- Espace client : les deux onglets ------------------------------------------------
   Se connecter d'un côté, créer un compte de l'autre : un visiteur sait tout
   de suite qu'il a le choix, sans changer de page. */
/* Les initiales dans la barre du haut, à la place du pictogramme. */
.vd-entete-initiales {
  font-family: var(--police-titre); font-weight: 800; font-size: 13px;
  letter-spacing: .02em; color: var(--accent);
}

/* --- Se connecter avec Google ou Apple -----------------------------------------------
   Des boutons neutres, qui suivent le thème du site : fond clair en plein
   jour, sombre la nuit — les deux chartes l'autorisent, à condition que le
   logo garde ses couleurs et que le texte reste lisible. */
.vd-tiers { display: grid; gap: 10px; }
.vd-btn-tiers {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  width: 100%; min-height: 48px; padding: 12px 18px;
  /* Meme coin que « Se connecter » juste en dessous : deux boutons l'un sur
     l'autre ne peuvent pas avoir deux formes. */
  border: 1px solid var(--bord-clair); border-radius: var(--rayon);
  background: var(--carte-clair); color: var(--texte);
  font: inherit; font-weight: 700; font-size: 15px; cursor: pointer;
  transition: background .18s ease, border-color .18s ease;
}
.vd-btn-tiers:hover { background: var(--voile-2); border-color: var(--texte-3); }
.vd-btn-tiers svg { flex: none; }

/* Le trait qui sépare les deux façons d'entrer. */
.vd-ou {
  display: flex; align-items: center; gap: 14px;
  margin: 20px 0; color: var(--texte-3); font-size: 13px;
}
.vd-ou::before, .vd-ou::after {
  content: ""; flex: 1; height: 1px; background: var(--bord);
}

.vd-onglets {
  display: flex; gap: 4px; padding: 4px; margin-bottom: 22px;
  background: var(--bloc-2); border: 1px solid var(--bord); border-radius: var(--rayon-m);
}
.vd-onglets button {
  flex: 1; min-height: 44px; padding: 10px 12px;
  border: 0; border-radius: var(--rayon); background: none; cursor: pointer;
  font: inherit; font-weight: 700; font-size: 14.5px; color: var(--texte-2);
  transition: background .18s ease, color .18s ease;
}
.vd-onglets button:hover { color: var(--texte); }
.vd-onglets button[aria-selected="true"] { background: var(--accent); color: #FFF; }

/* La ligne d'identité, une fois connecté. */
.vd-compte-tete { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.vd-compte-rond {
  flex: none; width: 56px; height: 56px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--accent-doux); color: var(--accent);
  border: 1px solid var(--accent-vif);
  font-family: var(--police-titre); font-weight: 800; font-size: 20px;
}
.vd-compte-tete b { display: block; font-family: var(--police-titre); font-size: 18px; }
.vd-compte-tete .vd-compte-adresse { font-size: 14px; color: var(--texte-3); }
.vd-compte-tete .vd-btn { margin-left: auto; }

/* Ce qui ne va pas se dit sous le formulaire, en rouge, sans fenêtre. */
.vd-erreur {
  display: none; margin: 0; padding: 10px 14px; border-radius: var(--rayon-m);
  background: var(--accent-doux); border: 1px solid var(--accent-vif);
  color: var(--texte); font-size: 14px;
}
.vd-erreur.vu { display: block; }
.vd-succes {
  display: none; margin: 0; padding: 10px 14px; border-radius: var(--rayon-m);
  background: color-mix(in srgb, var(--vert) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--vert) 45%, transparent);
  color: var(--texte); font-size: 14px;
}
.vd-succes.vu { display: block; }

/* Le lien discret sous un formulaire : mot de passe oublié, changer d'avis. */
.vd-lien-discret {
  align-self: center; background: none; border: 0; cursor: pointer;
  font: inherit; font-size: 13.5px; color: var(--texte-3); text-decoration: underline;
  min-height: 44px;
}
.vd-lien-discret:hover { color: var(--texte); }

.vd-bandeau {
  display: flex; gap: 14px; align-items: flex-start;
  padding: 18px 20px; border-radius: var(--rayon-l); margin-bottom: 28px;
  background: var(--accent-doux); border: 1px solid var(--accent-vif);
  font-size: 15px; color: var(--texte-2);
}
.vd-bandeau b { color: var(--texte); }

/* --- Tableaux ------------------------------------------------------------------------------- */
.vd-tableau { width: 100%; border-collapse: collapse; font-size: 15px; }
.vd-tableau th, .vd-tableau td { padding: 15px 14px; text-align: left; border-bottom: 1px solid var(--bord); }
.vd-tableau th { font-size: 12px; text-transform: uppercase; letter-spacing: .1em; color: var(--texte-3); }
.vd-tableau tr:last-child td { border-bottom: 0; }
.vd-tableau code { font-family: ui-monospace, Consolas, monospace; font-size: 14px; color: var(--accent); }
/* Un bouton dans un tableau garde une hauteur cliquable. */
.vd-tableau .vd-btn { min-height: 40px; }
.vd-etat { padding: 4px 11px; border-radius: 999px; font-size: 12px; font-weight: 800; }
.vd-etat.actif { background: var(--accent-doux); color: var(--accent); }
.vd-etat.essai { background: var(--voile-2); color: var(--texte-2); }
.vd-etat.fini { background: var(--voile); color: var(--texte-3); }
.vd-cadre-tableau { overflow-x: auto; }

/* --- FAQ -------------------------------------------------------------------------------------- */
.vd-faq { display: flex; flex-direction: column; gap: 12px; max-width: 860px; }
.vd-faq details {
  background: var(--carte); border: 1px solid var(--bord); border-radius: var(--rayon-l);
  padding: 4px 26px; transition: border-color .15s ease;
}
.vd-faq details[open] { border-color: var(--accent); }
.vd-faq summary {
  cursor: pointer; list-style: none; padding: 20px 0;
  font-family: var(--police-titre); font-weight: 800; font-size: 19px;
  display: flex; align-items: center; justify-content: space-between; gap: 18px;
}
.vd-faq summary::-webkit-details-marker { display: none; }
/* Une flèche plutôt qu'un « + » : elle pointe vers le bas quand c'est fermé,
   se retourne quand on ouvre. */
.vd-faq summary::after {
  content: ""; flex: 0 0 auto; width: 11px; height: 11px; margin-right: 4px;
  border-right: 2.5px solid var(--accent); border-bottom: 2.5px solid var(--accent);
  border-radius: 2px;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform .35s cubic-bezier(.2, .7, .3, 1);
}
.vd-faq details[open] summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
/* Un léger enfoncement au clic, pour que le geste se sente. */
.vd-faq summary:active { transform: scale(.995); }
/* La réponse glisse en arrivant. */
.vd-faq details[open] p { animation: vd-faq-ouvre .38s cubic-bezier(.2, .7, .3, 1); }
@keyframes vd-faq-ouvre {
  from { opacity: 0; transform: translateY(-10px); }
  to   { opacity: 1; transform: none; }
}
.vd-faq p { margin: 0 0 20px; font-size: 16px; }

/* --- Pages de texte ------------------------------------------------------------------------------ */
.vd-prose { max-width: 800px; }
.vd-prose h2 { font-size: clamp(26px, 3vw, 34px); margin: 48px 0 14px; }
.vd-prose h3 { margin: 30px 0 10px; }
.vd-prose ul { padding-left: 22px; color: var(--texte-2); }
.vd-prose li { margin-bottom: 9px; }
.vd-prose .maj { font-size: 13.5px; color: var(--texte-3); }

/* --- Récapitulatif de commande --------------------------------------------------------------------- */
.vd-recap { display: flex; flex-direction: column; gap: 13px; }
.vd-recap-ligne { display: flex; justify-content: space-between; gap: 16px; font-size: 16px; }
.vd-recap-ligne.total { padding-top: 14px; border-top: 1px solid var(--bord); font-size: 21px; font-weight: 800; }
.vd-recap-ligne span:first-child { color: var(--texte-2); }

/* L'article commandé, avec son logo : on voit ce qu'on achète. */
.vd-recap-produit { display: flex; align-items: center; gap: 13px; }
.vd-recap-produit img, .vd-recap-jeton {
  flex: none; width: 46px; height: 46px; border-radius: 13px; padding: 8px;
  background: color-mix(in srgb, var(--accent-produit, var(--accent)) 14%, var(--bloc));
  border: 1px solid color-mix(in srgb, var(--accent-produit, var(--accent)) 38%, var(--bord));
  box-shadow: 0 0 22px color-mix(in srgb, var(--accent-produit, var(--accent)) 28%, transparent);
  object-fit: contain;
}
.vd-recap-jeton { display: grid; place-items: center; color: var(--accent-produit, var(--accent)); }
.vd-recap-produit b { display: block; font-size: 15.5px; color: var(--texte); line-height: 1.3; }
.vd-recap-produit span { font-size: 13px; color: var(--texte-3); }
.vd-recap-articles { display: flex; flex-direction: column; gap: 12px; margin-bottom: 4px; }
.vd-recap-ligne.remise span:last-child { color: var(--vert); }

/* Le moyen de paiement : des tuiles à cocher plutôt qu'une liste déroulante. */
.vd-paiements { display: flex; flex-direction: column; gap: 10px; }
.vd-paiement {
  position: relative; display: flex; align-items: center; gap: 14px; cursor: pointer;
  padding: 14px 16px; border-radius: var(--rayon-m);
  background: var(--bloc); border: 1px solid var(--bord);
  transition: border-color .2s ease, background .2s ease, transform .2s ease;
}
.vd-paiement:hover { border-color: color-mix(in srgb, var(--accent) 45%, var(--bord)); transform: translateY(-1px); }
.vd-paiement input { position: absolute; opacity: 0; pointer-events: none; }
.vd-paiement-picto {
  flex: none; display: grid; place-items: center; width: 42px; height: 42px;
  border-radius: 12px; color: var(--texte-2);
  background: var(--bloc-2); border: 1px solid var(--bord);
  transition: color .2s ease, background .2s ease, border-color .2s ease;
}
.vd-paiement-texte { flex: 1 1 auto; min-width: 0; }
.vd-paiement-texte b { display: block; font-size: 15px; color: var(--texte); }
.vd-paiement-texte span { font-size: 13px; color: var(--texte-3); }
.vd-paiement-marque {
  flex: none; font-size: 12px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  padding: 5px 9px; border-radius: 999px; color: var(--texte-3);
  background: var(--bloc-2); border: 1px solid var(--bord);
}
.vd-paiement input:checked ~ .vd-paiement-picto {
  color: var(--accent);
  background: color-mix(in srgb, var(--accent) 16%, transparent);
  border-color: color-mix(in srgb, var(--accent) 50%, var(--bord));
}
.vd-paiement:has(input:checked) {
  border-color: color-mix(in srgb, var(--accent) 60%, var(--bord));
  background: color-mix(in srgb, var(--accent) 8%, var(--bloc));
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent),
              0 0 28px color-mix(in srgb, var(--accent) 22%, transparent);
}
.vd-paiement input:focus-visible ~ .vd-paiement-picto { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Le code promo, tout en bas : un champ et un bouton sur la même ligne. */
.vd-promo { display: flex; gap: 10px; align-items: stretch; }
.vd-promo input { flex: 1 1 auto; min-width: 0; text-transform: uppercase; letter-spacing: .06em; }
/* Le placeholder, lui, reste une phrase normale. */
.vd-promo input::placeholder { text-transform: none; letter-spacing: normal; }
.vd-promo .vd-btn { flex: none; }
.vd-promo-reponse { font-size: 13.5px; margin-top: 9px; color: var(--texte-3); }
.vd-promo-reponse.ok { color: var(--vert); font-weight: 700; }
.vd-promo-reponse.non { color: var(--accent); }

.vd-deux {
  display: grid; gap: clamp(18px, 2.4vw, 24px); align-items: start;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 330px), 1fr));
}
/* Au-delà de 900 px, le formulaire reprend l'avantage sur le récapitulatif. */
@media (min-width: 900px) { .vd-deux { grid-template-columns: 1.25fr .9fr; } }

/* ==========================================================================
   TÉLÉPHONE ET TABLETTE
   ========================================================================== */
@media (max-width: 1040px) {
  .vd-hero-corps { grid-template-columns: 1fr; gap: 40px; }
  .vd-hero-chapeau { max-width: none; }
  .vd-defile { --pas: 56px; }
}

@media (max-width: 1080px) {
  /* Le panneau du menu : il tombe sous la barre, occupe toute la largeur et
     se ferme sur un lien, un clic dehors ou la touche Échap. */
  .vd-nav {
    position: absolute; top: 100%; left: 0; right: 0; display: none;
    flex-direction: column; gap: 0;
    padding: 6px clamp(18px, 5vw, 28px) 18px;
    background: var(--bloc); border-bottom: 1px solid var(--bord);
    box-shadow: 0 24px 40px rgba(0, 0, 0, .45);
    max-height: calc(100vh - 100%); overflow-y: auto;
  }
  .vd-nav.ouvert { display: flex; animation: vd-menu-ouvre .18s ease both; }
  @keyframes vd-menu-ouvre { from { opacity: 0; transform: translateY(-6px); } }

  /* Un filet entre les entrées, et la flèche qui dit « ça mène ailleurs ». */
  .vd-nav a {
    display: flex; align-items: center; justify-content: space-between;
    padding: 15px 2px; border-radius: 0; font-size: 16.5px; font-weight: 700;
    min-height: 44px;
    border-bottom: 1px solid var(--bord);
  }
  .vd-nav a:hover, .vd-nav a:focus-visible { background: none; color: var(--accent); }
  .vd-nav a::after {
    content: ""; width: 7px; height: 7px; flex: none; opacity: .5;
    border-right: 2px solid currentColor; border-top: 2px solid currentColor;
    transform: rotate(45deg);
  }
  .vd-nav a.actif { color: var(--texte); }
  .vd-nav a.actif::after { opacity: 1; color: var(--accent); }

  .vd-nav-mobile { display: flex; }
  /* « Commander » n'est pas un lien comme les autres : c'est le bouton. */
  .vd-nav-mobile:last-child {
    justify-content: center; margin-top: 14px; padding: 15px 20px;
    border: 0; border-radius: var(--rayon);
    background: var(--accent); color: #fff; font-weight: 700;
  }
  .vd-nav-mobile:last-child:hover { background: var(--accent-2); color: #fff; }
  .vd-nav-mobile:last-child::after { content: none; }

  /* Le voile qui assombrit la page derrière le panneau ouvert. */
  .vd-voile-menu {
    position: fixed; inset: 0; z-index: 40; display: none;
    background: rgba(0, 0, 0, .5);
  }
  .vd-voile-menu.ouvert { display: block; }

  .vd-menu-bouton { display: grid; }
  .vd-entete-actions .vd-btn { display: none; }
  /* Le logo d'un côté, le compte et le menu de l'autre. C'est la barre de
     navigation qui poussait les actions à droite (margin-left: auto) ; ici
     elle passe en panneau posé sous la barre, donc hors du flux, et les deux
     boutons retombaient collés au logo avec tout le vide à leur droite. */
  .vd-entete-actions { margin-left: auto; }
  .vd-section { padding: 64px 0; }
  .vd-grille-2 { grid-template-columns: 1fr; }
  .vd-rangees { gap: 64px; }
  .vd-compat { grid-template-columns: 1fr; gap: 32px; }
  .vd-compat-grille > * { flex-basis: clamp(88px, 25vw, 112px); }
  /* Sur téléphone, l'image passe toujours au-dessus du texte. */
  .vd-rangee { grid-template-columns: 1fr; gap: 28px; }
  .vd-rangee.inverse .vd-rangee-media { order: 0; }
  .vd-pied-corps { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 34px; }
  .vd-pied-lettre { grid-column: 1 / -1; }
  .vd-deux { grid-template-columns: 1fr; }
  .vd-avenir-liste { grid-template-columns: 1fr; }
  .vd-appel { padding: 56px 24px; }
}

@media (max-width: 620px) {
  body { font-size: 16px; }

  /* Les tailles sont fluides : ce palier ne s'occupe plus que des
     dispositions, et de ce qui n'a pas sa place sur un téléphone. */
  .vd-prose h2 { margin: 36px 0 12px; }

  /* --- Le haut : le défilé se limite à cinq gestes ---------------------- */
  .vd-defile { --pas: 44px; height: calc(var(--pas) * 5); }
  /* Le geste le plus long doit tenir sur une ligne, même sur un écran de 360. */
  .vd-defile-ligne { font-size: clamp(14.5px, 4.3vw, 18px); gap: 10px; }
  .vd-defile-logo { width: 30px; height: 30px; padding: 5px; border-radius: 9px; }
  .vd-pastille { flex-wrap: wrap; gap: 6px 10px; }
  /* L'en-tête tient sur une ligne : logo compact, boutons resserrés. */
  .vd-logo { gap: 8px; }
  .vd-logo-image { width: 32px; height: 32px; }
  .vd-logo-nom { font-size: 16px; }
  .vd-logo-etat { font-size: 11.5px; padding: 2px 5px; }
  .vd-logo-texte { gap: 6px; }
  /* En dessous de 400 px, l'en-tête doit encore tenir : le sélecteur de
     langue perd sa marge, et les boutons ronds rétrécissent. */
  .vd-entete-actions { gap: 7px; }
  .vd-langue select { height: 38px; padding: 0 26px 0 10px; font-size: 12.5px; }
  /* 44 px : la taille au-dessous de laquelle un doigt rate la cible. */
  .vd-entete-actions > a, .vd-menu-bouton { width: 44px; height: 44px; }
}

@media (max-width: 380px) {
  /* Les plus petits téléphones : l'étiquette PRO cède la place au reste. */
  .vd-logo-etat { display: none; }
  .vd-logo-nom { font-size: 15px; }
  .vd-entete-actions > a[href*="compte"] { display: none; }
  .vd-langue select { padding: 0 22px 0 8px; }
  .vd-hero { padding: 40px 0 34px; }
  /* Les boutons s'élargissent jusqu'à rester des boutons, pas des barres. */
  .vd-hero-actions { gap: 10px; }
  .vd-hero-actions .vd-btn { flex: 1 1 145px; max-width: 340px; }

  /* --- La bande de chiffres : deux colonnes plutôt qu'une pile ---------- */
  .vd-chiffres > div { flex-basis: 40%; }
  .vd-chiffres > div { padding: 20px 12px 18px; }
  .vd-chiffres b { font-size: 32px; margin-bottom: 7px; }
  .vd-chiffres > div > span { font-size: 13px; }
  /* Les précisions sous les libellés doublaient la hauteur de la bande. */
  .vd-chiffres em { display: none; }

  /* --- Les offres et les prix ------------------------------------------- */
  .vd-offre-prix b { font-size: 34px; }
  .vd-offre-corps { padding: 24px 20px; }
  .vd-hero-prix .vd-prix b { font-size: 32px; }

  /* --- Le catalogue ------------------------------------------------------ */
  .vd-rangees { gap: 52px; }
  /* La lueur débordait de 10 % à droite et poussait toute la page : sur un
     écran étroit elle reste dans les marges. */
  .vd-rangee-media::before { inset: -5% 0; }
  /* Les captures en hauteur mangeaient un écran entier : elles gardent leurs
     proportions, simplement plus petites. */
  .vd-rangee-cadre img { max-height: 420px; }
  .vd-rangee-texte .vd-btn { width: 100%; max-width: 340px; }
  .vd-rangee-marque { font-size: 15px; }

  /* --- Ce qui s'efface sur téléphone ------------------------------------ */
  /* Le décor vivant posé sur les captures : à cette taille on ne distingue
     plus les curseurs, et l'animation tourne en permanence sous le doigt. */
  .vd-vie { display: none; }
  /* Deux files de témoignages qui se croisent : le sens inverse ne se lit
     pas sur un écran étroit, une seule file suffit. */
  .vd-avis-piste + .vd-avis-piste { display: none; }

  .vd-avenir-carte { flex-wrap: wrap; }
  .vd-avenir-carte .vd-btn { width: 100%; }
  .vd-haut { right: 14px; bottom: 14px; }

  /* --- Formulaires et tableaux ------------------------------------------ */
  .vd-champ input, .vd-champ textarea, .vd-champ select { font-size: 16px; }
  .vd-paiement { padding: 12px 13px; gap: 11px; }
  .vd-paiement-picto { width: 38px; height: 38px; }
  .vd-paiement-marque { display: none; }
  /* Les petites étiquettes restent lisibles : rien sous 12 px. */

  .vd-promo { flex-wrap: wrap; }
  .vd-promo input { flex: 1 1 100%; }
  .vd-promo .vd-btn { width: 100%; max-width: none; }
  .vd-recap-ligne { font-size: 15px; }
  .vd-recap-ligne.total { font-size: 19px; }


}

@media (prefers-reduced-motion: reduce) {
  .vd-monte { opacity: 1; transform: none; transition: none; }
  .vd-logiciel svg, .vd-vie-degrade i, .vd-vie-calques i, .vd-vie-forme,
  .vd-rangee-media:hover .vd-vie-curseur i,
  .vd-rangee-media:hover .vd-vie-curseur::before { animation: none; }
  .vd-vie { display: none; }
  .vd-faq summary::after, .vd-faq details[open] p { transition: none; animation: none; }
  .vd-avis-file { animation: none; }
  .vd-defile-piste { transition: none; }
  .vd-produit-image img, .vd-produit:hover .vd-produit-image img { transform: none; transition: none; }
  html { scroll-behavior: auto; }
}

/* En portrait, la rangée devient un en-tête : logo à gauche, nom à droite,
   et le reste du texte sur toute la largeur en dessous. */
@media (orientation: portrait) {
  /* Seules les rangées du catalogue, celles qui portent un logo : la
     section « écran par écran » d'une fiche garde ses grandes captures. */
  .vd-rangee:has(.vd-rangee-logo) {
    /* La colonne du logo a une largeur fixe : en « auto », les blocs qui
       traversent les deux colonnes l'élargissaient et éloignaient le nom. */
    --logo: clamp(64px, 17vw, 104px);
    grid-template-columns: var(--logo) minmax(0, 1fr);
    column-gap: clamp(14px, 3.5vw, 22px);
    row-gap: 3px;
    align-items: center;
    /* Les deux lignes de texte ne s'étirent plus pour remplir la hauteur du
       logo : elles gardent la leur et le groupe se centre. */
    align-content: center;
  }
  /* En portrait, plus d'alternance : le logo reste toujours à gauche. */
  .vd-rangee:has(.vd-rangee-logo).inverse .vd-rangee-media { order: 0; }

  /* Le logo occupe les deux lignes de la carte d'identité, centré face à elles. */
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-media {
    grid-column: 1; grid-row: 1 / span 2;
    justify-self: start; align-self: center; width: auto;
  }
  .vd-rangee-cadre.vd-rangee-logo { padding: 0; }
  .vd-rangee-cadre.vd-rangee-logo img { width: 100%; }

  /* Les enfants de la colonne de texte deviennent des cases de la rangée. */
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-texte { display: contents; }
  /* Le nom et le chiffre forment un bloc, centré en face du logo. Chacun
     occupait auparavant la moitié de la hauteur du logo : le nom se collait
     tout en haut, le chiffre tout en bas, et les deux paraissaient étirés
     pour rattraper une image qu'ils ne touchaient jamais. Serrés l'un contre
     l'autre et centrés, ils se lisent comme une seule carte d'identité. */
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-marque {
    grid-column: 2; grid-row: 1; justify-self: start; align-self: end;
    gap: 8px; font-size: clamp(15px, 4vw, 19px); line-height: 1.15;
  }
  /* La version du plugin : elle n'apprend rien à qui découvre le produit, et
     elle coûte une ligne sur un écran étroit. Elle reste sur grand écran et
     sur la fiche du produit, où l'on vient vraiment vérifier. */
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-marque i { display: none; }
  .vd-rangee:has(.vd-rangee-logo) .vd-produit-chiffre {
    grid-column: 2; grid-row: 2; align-self: start; margin: 0;
    font-size: 12px; letter-spacing: .1em; line-height: 1.2;
  }
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-marque img { width: 0; height: 0; visibility: hidden; margin: 0; }
  /* span 2 plutôt que 1 / -1 : la seconde notation laissait le bloc dans la
     seule première colonne, qui s'élargissait alors au texte entier. */
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-texte > :not(.vd-rangee-marque):not(.vd-produit-chiffre) {
    grid-column: 1 / span 2;
  }
  /* Le titre prend ses distances avec la carte d'identité. */
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-texte > h3 { margin-top: 14px; }
  .vd-rangee:has(.vd-rangee-logo) .vd-rangee-texte > .vd-btn, .vd-rangee:has(.vd-rangee-logo) .vd-rangee-texte > .vd-indisponible { justify-self: start; }
}

@media (max-width: 620px) {
  /* --- Les tableaux deviennent des fiches ------------------------------- */
  /* Quatre colonnes sur 390 px, c'est un mot par ligne. Chaque ligne du
     tableau devient un bloc, et chaque valeur porte le nom de sa colonne. */
  .vd-cadre-tableau { overflow-x: visible; }
  .vd-tableau, .vd-tableau tbody, .vd-tableau tr, .vd-tableau td { display: block; width: 100%; }
  .vd-tableau thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
  .vd-tableau tr {
    padding: 14px 0; border-bottom: 1px solid var(--bord);
  }
  .vd-tableau tr:last-child { border-bottom: 0; }
  .vd-tableau td {
    padding: 5px 0; border: 0;
    display: grid; grid-template-columns: minmax(84px, 34%) 1fr; gap: 12px; align-items: start;
  }
  /* Le nom de la colonne, repris devant la valeur. */
  .vd-tableau td::before {
    content: attr(data-colonne);
    font-size: 11.5px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
    color: var(--texte-3); padding-top: 2px;
  }
  /* Une cellule vraiment vide disparaît ; une cellule sans en-tête — la
     colonne d'un bouton — prend toute la largeur. */
  .vd-tableau td:empty { display: none; }
  .vd-tableau td[data-colonne=''] { grid-template-columns: 1fr; }
  .vd-tableau td[data-colonne='']::before { display: none; }
  /* Une pastille d'état ne s'étire pas sur toute la colonne. */
  .vd-tableau td > * { justify-self: start; }
  .vd-tableau td .vd-btn { width: auto; }
}

@media (max-width: 620px) {
  /* Tout ce qui se clique atteint la hauteur d'un doigt : 44 px. */
  .vd-logo { min-height: 44px; }
  .vd-pied a, .vd-pied-bas a {
    display: inline-flex; align-items: center; min-height: 44px;
  }
  /* La liste du pied se resserre pour compenser des liens plus hauts. */
  .vd-pied ul { gap: 0; }

  /* Quatre colonnes de liens empilées font deux écrans de pied à faire
     défiler. Deux par deux, le pied redevient un pied. */
  .vd-pied-corps { grid-template-columns: 1fr 1fr; gap: 30px 18px; }
  .vd-pied-marque, .vd-pied-lettre { grid-column: 1 / -1; }
  .vd-pied h2 { margin-bottom: 8px; }
}

/* Cinq chiffres : cinq de front quand la place y est, sinon trois puis deux.
   Quatre et un orphelin, jamais — c'est ce qui faisait boiter la bande. */
@media (min-width: 760px) and (max-width: 1179px) {
  .vd-chiffres > div { flex-basis: 30%; }
}
@media (min-width: 1180px) {
  .vd-chiffres > div { flex-basis: 18%; }
}

/* Une grille de trois colonnes qui reçoit quatre cartes en pose trois, puis
   une toute seule. Le nombre de colonnes se règle donc sur le nombre de
   cartes : deux par deux, ou quatre de front. */
.vd-grille-3:has(> :nth-child(4):last-child) {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 45%), 1fr));
}
@media (min-width: 1180px) {
  .vd-grille-3:has(> :nth-child(4):last-child) { grid-template-columns: repeat(4, 1fr); }
}
/* Trois cartes : trois de front, ou une seule colonne. Deux et une, jamais. */
.vd-grille-3:has(> :nth-child(3):last-child) { grid-template-columns: 1fr; }
@media (min-width: 820px) {
  .vd-grille-3:has(> :nth-child(3):last-child) { grid-template-columns: repeat(3, 1fr); }
}

/* Cinq cartes : trois puis deux. */
.vd-grille-3:has(> :nth-child(5):last-child) {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 30%), 1fr));
}
@media (max-width: 620px) {
  .vd-grille-3:has(> :nth-child(4):last-child),
  .vd-grille-3:has(> :nth-child(5):last-child) { grid-template-columns: 1fr; }
}

/* --- Les deux boutons du haut, sur un téléphone debout --------------------
   Côte à côte sur 390 px, « Voir nos produits » et « Comment ça marche » ne
   tiennent pas sur une ligne : ils passent à deux, ce qui est normal. Ce qui
   ne l'était pas, c'est qu'ils passaient à deux chacun de leur côté, avec des
   largeurs différentes et des lignes calées à gauche. Ici les deux boutons
   prennent exactement la même largeur, et leur texte est centré et équilibré
   (voir .vd-btn). */
@media (orientation: portrait) and (max-width: 620px) {
  .vd-hero-actions { gap: 10px; flex-wrap: nowrap; }
  .vd-hero-actions .vd-btn {
    flex: 1 1 0; min-width: 0; max-width: none;
    padding-inline: 12px; line-height: 1.2;
  }
}

/* --- Le catalogue, en cartes à peine visibles -----------------------------
   Quand l'écran est plus haut que large, chaque plugin du catalogue tient
   dans une carte très transparente — son logo compris, et non seulement son
   texte : en portrait la rangée s'est réorganisée en carte d'identité, logo à
   gauche du nom, et c'est ce bloc entier que la carte rassemble. Presque
   rien : un voile à 40 % du voile habituel et une bordure à 45 % de la
   bordure habituelle. Assez pour que l'œil sépare un plugin du suivant sans
   poser un fond de plus sur le fond de section.

   En paysage, aucune carte : le texte et la capture se font déjà face, et
   l'alternance d'une rangée à l'autre suffit à les séparer. */
@media (orientation: portrait) {
  /* Les cartes se touchent presque : c'est leur bordure qui sépare désormais
     un plugin du suivant, plus un grand vide. */
  #vd-produits .vd-rangees { gap: clamp(16px, 4vw, 26px); }
  #vd-produits .vd-rangee {
    padding: clamp(16px, 4vw, 26px);
    border-radius: var(--rayon-l);
    background: color-mix(in srgb, var(--voile) 40%, transparent);
    border: 1px solid color-mix(in srgb, var(--bord) 45%, transparent);
  }
}

/* --- Les logiciels compatibles, sur un téléphone debout -------------------
   Sept tuiles à 30 px de pictogramme prenaient presque un écran entier pour
   dire une chose simple : « ça marche avec After Effects, Premiere, CapCut ».
   Le pictogramme descend à 20 px et la tuile se resserre autour ; le nom, lui,
   ne bouge presque pas — c'est lui qu'on lit, pas le dessin. */
@media (orientation: portrait) and (max-width: 620px) {
  .vd-logiciel { padding: 10px 8px; gap: 7px; font-size: 12.5px; }
  .vd-logiciel svg { width: 14px; height: 14px; }
}


/* --- Le piège à robots ----------------------------------------------------
   Invisible à l'œil, mais bien présent dans la page : un display:none aurait
   été ignoré par la moitié des robots, et ce sont eux qu'on attend. */
.vd-piege {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; opacity: 0; pointer-events: none;
}

/* --- La bannière de consentement -------------------------------------------
   En bas, posée sur la page sans la bloquer : on peut lire le site, la barre
   du haut reste atteignable, et rien n'oblige à répondre tout de suite. Les
   deux boutons ont le même poids — refuser ne coûte pas un clic de plus. */
.vd-consent {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 60;
  background: var(--flottant-fort);
  border-top: 1px solid var(--bord-clair);
  box-shadow: 0 -18px 40px rgba(0, 0, 0, .35);
  backdrop-filter: blur(10px);
  animation: vd-consent-monte .25s ease both;
}
@keyframes vd-consent-monte { from { transform: translateY(100%); } }
.vd-consent-corps {
  display: flex; align-items: center; gap: clamp(14px, 2.5vw, 30px);
  padding: 16px 0; flex-wrap: wrap;
}
.vd-consent p { margin: 0; flex: 1 1 320px; font-size: 14.5px; color: var(--texte-2); line-height: 1.5; }
.vd-consent a { color: var(--accent); font-weight: 700; text-decoration: underline; }
.vd-consent-boutons { display: flex; gap: 10px; flex: none; }
@media (max-width: 620px) {
  .vd-consent-corps { padding: 14px 0; gap: 12px; }
  .vd-consent p { font-size: 13.5px; }
  .vd-consent-boutons { width: 100%; }
  .vd-consent-boutons .vd-btn { flex: 1 1 0; min-width: 0; }
}
@media (prefers-reduced-motion: reduce) { .vd-consent { animation: none; } }


/* --- Sur téléphone, les logos perdent leur ombre portée -------------------
   Un logo n'est pas une capture : il n'a rien à décoller du fond, il EST une
   forme posée dessus. L'ombre noire sous lui, utile sur grand écran pour
   donner du relief, se voyait surtout sur un petit écran comme une tache
   grise sous une icône déjà nette.
   Les captures, elles, gardent la leur : ce sont des fenêtres, et sans ombre
   elles se confondraient avec la page. */
@media (max-width: 620px) {
  /* Le logo d'une rangée du catalogue : la lueur colorée reste, l'ombre part. */
  .vd-rangee-logo img {
    filter:
      drop-shadow(0 0 14px color-mix(in srgb, var(--accent-produit, var(--accent)) 11%, transparent))
      drop-shadow(0 0 48px color-mix(in srgb, var(--accent-produit, var(--accent)) 8%, transparent));
  }
  /* Le logo en haut d'une fiche, et ceux des cartes « Aussi chez VD ». */
  .vd-produit-logo { box-shadow: none; }
  .vd-vitrine-carte > img { box-shadow: none; }
}


/* --- Ce qui s'allège sur un téléphone -------------------------------------
   Quatre réglages qui ne retirent rien du site : ils repoussent seulement au
   deuxième plan ce qui faisait défiler sans rien apprendre. Tout reste
   atteignable, et tout revient entier dès qu'il y a de la place. */

/* Le chevron qui ouvre une liste repliée. Il n'existe que là où le repli
   existe : au-delà du téléphone la liste est entière, et un « Voir plus » qui
   n'ouvrirait rien n'aurait aucun sens. Le nombre d'éléments montrés vit dans
   le script (VD.replier) ; ici on ne fait que cacher ce qui porte la marque. */
.vd-voir-plus { display: none; }

/* Le haut de page : la phrase courte n'apparaît que sur téléphone. */
.vd-hero-chapeau.vd-court { display: none; }

@media (max-width: 620px) {
  .vd-replie .vd-replie-cache { display: none; }
  .vd-voir-plus {
    display: flex; margin: 18px auto 0; padding: 0;
    width: 46px; height: 46px; min-height: 0; border-radius: 50%;
  }
  .vd-voir-plus svg { transition: transform .22s ease; }
  /* Ouvert, le chevron se retourne : il ne propose plus d'ouvrir mais de fermer. */
  .vd-voir-plus[aria-expanded="true"] svg { transform: rotate(180deg); }

  /* Les deux chiffres que le reste de la page redit déjà. */
  .vd-chiffre-secondaire { display: none; }

  /* Le chapeau : deux lignes au lieu de cinq, et le bouton remonte dans
     l'écran d'arrivée. */
  .vd-hero-chapeau.vd-long { display: none; }
  .vd-hero-chapeau.vd-court { display: block; }
}
@media (prefers-reduced-motion: reduce) {
  .vd-voir-plus svg { transition: none; }
}

/* --- La jauge du mot de passe ---------------------------------------------
   Trois barres sous le champ, qui se remplissent pendant la frappe. La
   couleur ne porte jamais l'information toute seule : la phrase sous la
   jauge dit toujours ce qui ne va pas, pour qui ne distingue pas le rouge
   du vert — et parce qu'une barre rouge sans explication n'apprend rien. */
.vd-jauge { display: flex; gap: 5px; margin: 8px 0 2px; }
.vd-jauge i {
  height: 4px; width: 42px; border-radius: 999px;
  background: var(--voile-2);
  transition: background .2s ease;
}
.vd-jauge[data-niveau="0"] i:nth-child(1) { background: var(--rouge); }
.vd-jauge[data-niveau="1"] i:nth-child(-n+1) { background: var(--or); }
.vd-jauge[data-niveau="2"] i:nth-child(-n+2) { background: var(--or); }
.vd-jauge[data-niveau="3"] i { background: var(--vert); }
@media (prefers-reduced-motion: reduce) { .vd-jauge i { transition: none; } }
