/**
 * Design system des pages departement - Cent une découvertes (Jalon 2, socle commun).
 * Charte sombre / dorée, patterns réutilisables par les 3 modèles (collector/collection/premium).
 * Le design fin de chaque modèle s'appuiera sur ces variables et patterns.
 *
 * Scopé sous .vdf-dept pour ne pas fuir sur le reste du site.
 */

.vdf-dept {
  /* --- Palette --- */
  --vdf-vert-foret: #1a3c2e;
  --vdf-bleu-nuit: #1b2a4a;
  --vdf-noir: #2c2c2c;

  /* --- Fonds de section, cran 2 (arbitrage Dan du 19/08/2026) ---------------
   * Ces DEUX variables ne servent qu'aux fonds de section à plat. Elles sont
   * distinctes de `--vdf-bleu-nuit`, qui reste à #1b2a4a et continue de porter
   * les HÉROS, les cartes immersives et la CARTE 3D — arbitrage client de
   * juillet, la carte reste nuit.
   *
   * Le cran monte la LUMINOSITÉ à teinte (221°) et saturation (47 %) constantes :
   * la couleur ne change pas, elle s'éclaircit. L'écart de 4,5 points entre le
   * fond et sa tonalité alternée est conservé, sinon le rythme des sections
   * disparaît.
   *
   *   avant   #1b2a4a / #14203a   contraste texte 12,54   or 5,32
   *   cran 2  #2b4377 / #243968   contraste texte  8,52   or 3,62
   *
   * Les deux restent au-dessus des seuils AA (4,5 texte, 3,0 or). Le cran 2
   * amène l'or à 3,62 : conforme, mais c'est la limite basse — descendre d'un
   * cran de plus le ferait passer sous le seuil.
   */
  --vdf-fond-section: #2b4377;
  --vdf-fond-section-alt: #243968;

  /* --- Les rôles dérivés du bleu roi (20/08/2026) ---------------------------
   * Chacun est obtenu en appliquant à sa valeur d'origine LE MÊME écart que le
   * cran 2 a appliqué au fond de section : +12,0 points de luminosité, teinte et
   * saturation inchangées. Les écarts relatifs entre les rôles sont donc
   * conservés — un cartouche reste plus clair que le pied de page, qui reste
   * plus sombre qu'une section.
   *
   *   rôle                 avant      après
   *   cartouche / carte    #16223c -> #263b69
   *   pied de page         #0f1626 -> #202f52
   *   survol de commande   #232d3d -> #394a64
   */
  --vdf-fond-carte: #263b69;      /* cartouches, cartes de village, trio, partenaires */
  --vdf-fond-pied: #202f52;       /* pied de page */
  --vdf-fond-survol: #394a64;     /* survol des commandes de carte */

  /* --- Fonds de CARTOGRAPHIE : volontairement PAS au cran 2 -----------------
   * Ces fonds encadrent des tuiles Leaflet sombres. Les éclaircir dessinerait un
   * liseré clair autour d'une carte sombre — le défaut serait visible alors que
   * la couleur, elle, serait « conforme ». Ils passent en variable pour sortir du
   * dur, et gardent leur valeur : une variable n'oblige pas à changer de valeur,
   * elle oblige à ne plus la répéter.
   */
  --vdf-fond-carto: #0b1120;      /* conteneur Leaflet */
  --vdf-fond-carto-clair: #0e1626;

  /* Texte pose SUR l'or : contraste 6,76 avec --vdf-or, verifie. Il etait ecrit
     en dur a sept endroits ; une seule source desormais. */
  --vdf-sur-or: #0e1626;

  /* Fond du bouton principal du hero, MESURE sur la maquette client du 22/08 :
     rgb(5, 31, 72). Bien plus sombre que le fond de section, c'est ce qui lui donne son
     poids sur la photo. Contraste avec le blanc casse : 16,7. */
  --vdf-cta-fond: #051f48;

  /* Pastille de legende « nature » : couleur SEMANTIQUE, pas un fond de charte. Elle
     entre en variable pour ne plus etre repetee, et garde sa valeur — le vert dit
     « nature », le bleu roi ne le dirait pas. */
  --vdf-vert-legende: #4caf7d;
  --vdf-or: #c2983f;         /* or ambré chaud (retour client : moins jaune, accordé à la Tour Eiffel dorée) */
  --vdf-or-clair: #e3c079;   /* hover / surbrillance (champagne chaud cohérent) */
  --vdf-or-fonce: #a8862f;    /* actif */
  --vdf-or-chaud: #e0a83a;   /* or chaud lumineux "Tour Eiffel" : réservé aux CTA Réserver (retour client) */
  --vdf-or-chaud-clair: #f0c258; /* hover des CTA Réserver */
  --vdf-cuivre: #b87333;
  --vdf-teal: #2dd4bf;        /* villages incontournables (complémentaire de l'or, lisible sur fond sombre) */
  --vdf-teal-clair: #5eead4;  /* hover / surbrillance villages */
  --vdf-blanc-casse: #f5f0e8;
  --vdf-overlay-hero: linear-gradient(180deg, rgba(20,27,39,0.15) 0%, rgba(20,27,39,0.45) 50%, rgba(20,27,39,0.85) 100%);

  /* --- Typographies (titre modifiable selon choix client) --- */
  --vdf-font-titre: 'Cinzel', Georgia, 'Times New Roman', serif;
  --vdf-font-soustitre: 'Playfair Display', Georgia, serif;
  --vdf-font-corps: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;

  /* --- Echelle typographique --- */
  --vdf-fs-hero: clamp(2.6rem, 7vw, 5.5rem);   /* grand titre departement (capitales) */
  --vdf-fs-num: clamp(1rem, 2vw, 1.5rem);       /* numero de departement */
  --vdf-fs-h2: clamp(1.6rem, 3.5vw, 2.6rem);
  --vdf-fs-soustitre: clamp(1.05rem, 2.2vw, 1.45rem);
  --vdf-fs-corps: 1.05rem;
  --vdf-fs-petit: 0.875rem;
  --vdf-ls-caps: 0.08em;   /* letter-spacing des capitales serif */
  --vdf-lh-titre: 1.05;
  --vdf-lh-corps: 1.65;

  /* --- Espacement --- */
  --vdf-space-xs: 0.5rem;
  --vdf-space-sm: 1rem;
  --vdf-space-md: 2rem;
  --vdf-space-lg: 4rem;
  --vdf-space-xl: 6rem;
  --vdf-container: 1200px;
  --vdf-radius: 10px;

  font-family: var(--vdf-font-corps);
  font-size: var(--vdf-fs-corps);
  line-height: var(--vdf-lh-corps);
  color: var(--vdf-blanc-casse);
  /* LOT 1, 20/08/2026 — LE FOND DE BASE PASSE AU BLEU ROI.
     Il valait `--vdf-blanc-casse`, le creme. Toute page ne posant pas son propre
     fond heritait donc du creme et NON du bleu : c'est ce qui laissait la racine
     sur l'ancienne palette alors que le cran 2 etait pose partout ailleurs.

     La couleur de texte bascule AVEC le fond, sinon on obtient du sombre sur du
     bleu. Verifie avant d'ecrire : les 11 regles qui posent du texte sombre sous
     `.vdf-dept` ont TOUTES leur propre fond clair (des boutons dores). Aucune ne
     dependait du creme herite. */
  background: var(--vdf-fond-section);
}

/* --- Conteneurs / sections --- */
.vdf-dept .vdf-section { width: 100%; padding: var(--vdf-space-lg) var(--vdf-space-md); }
.vdf-dept .vdf-section--sombre { background: var(--vdf-fond-section); color: var(--vdf-blanc-casse); }
.vdf-dept .vdf-section--foret { background: var(--vdf-vert-foret); color: var(--vdf-blanc-casse); }
/* LA BANDE VERTE, RAMENÉE D'UN CRAN — 29/08/2026, demande client « très épaisse ».
   Elle mesurait 260 px à 850 comme à 1280, dont 128 px de seul padding vertical.
   La valeur n'est pas choisie au goût : elle descend d'UN CRAN de l'échelle maison,
   --vdf-space-lg (4rem, 64 px) -> --vdf-space-md (2rem, 32 px), le cran qui sert déjà
   de padding horizontal à toutes les sections. Attendu : 260 - 2x32 = 196 px.
   PREMIUM SEULEMENT, et c'est déjà vrai dans les faits : sur collector, la l. 678
   écrase le fond de --foret en bleu, il n'y a pas de bande verte à réduire là-bas.
   Le fond ne bouge pas, les contenus ne bougent pas, la couleur reste. */
.vdf-dept--premium .vdf-section--foret { padding-block: var(--vdf-space-md); }
.vdf-dept .vdf-container { max-width: var(--vdf-container); margin-inline: auto; }

/* --- Typographie --- */
.vdf-dept .vdf-titre {
  font-family: var(--vdf-font-titre);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: var(--vdf-ls-caps);
  line-height: var(--vdf-lh-titre);
  font-size: var(--vdf-fs-hero);
  margin: 0;
}
.vdf-dept .vdf-num {
  font-family: var(--vdf-font-titre);
  font-size: var(--vdf-fs-num);
  letter-spacing: 0.2em;
  color: var(--vdf-or-clair);
}
.vdf-dept .vdf-soustitre {
  font-family: var(--vdf-font-soustitre);
  font-style: italic;
  font-size: var(--vdf-fs-soustitre);
  font-weight: 400;
}
.vdf-dept h2.vdf-h2 {
  font-family: var(--vdf-font-titre);
  text-transform: uppercase;
  letter-spacing: var(--vdf-ls-caps);
  font-size: var(--vdf-fs-h2);
  color: var(--vdf-vert-foret);
  margin: 0 0 var(--vdf-space-md);
}
/* H2 sur sections sombres : or (lisible + charte) au lieu du vert foncé */
.vdf-dept .vdf-section--sombre h2.vdf-h2 { color: var(--vdf-or-clair); } /* or clair : mesure sous 4,5:1 en or de charte sur ce fond (158) */
/* La bande FORÊT garde l'or de charte : l'or y est mesuré 4,54:1 pour un seuil de 3 —
   au-dessus du plancher, donc rien n'y change. */
.vdf-dept .vdf-section--foret h2.vdf-h2 { color: var(--vdf-or); }
.vdf-dept .vdf-filet-or { width: 64px; height: 3px; background: var(--vdf-or); border: 0; margin: var(--vdf-space-sm) 0; }

/* --- HERO : image de fond + overlay sombre dégradé --- */
.vdf-dept .vdf-hero {
  position: relative;
  min-height: 78vh;
  display: flex;
  align-items: flex-end;
  color: var(--vdf-blanc-casse);
  /* Fond degrade sombre par defaut (avant les images HD du client) ; l'image
     Hero (vdf-hero__img) le recouvre quand elle est renseignee. */
  background: linear-gradient(135deg, var(--vdf-vert-foret) 0%, var(--vdf-bleu-nuit) 100%);
}
.vdf-dept .vdf-hero::after { content: ""; position: absolute; inset: 0; background: var(--vdf-overlay-hero); z-index: 1; }
.vdf-dept .vdf-hero__inner { position: relative; z-index: 2; padding: var(--vdf-space-lg) var(--vdf-space-md); width: 100%; }
.vdf-dept .vdf-hero .vdf-titre { color: var(--vdf-blanc-casse); text-shadow: 0 2px 16px rgba(0,0,0,0.5); }

/* --- Badges points d'interet (pastilles posées sur le Hero) --- */
.vdf-dept .vdf-badges { display: flex; flex-wrap: wrap; gap: var(--vdf-space-sm); margin-top: var(--vdf-space-md); }
.vdf-dept .vdf-badge {
  display: inline-flex; align-items: center; gap: 0.5rem;
  padding: 0.5rem 1rem;
  background: rgba(20, 27, 39, 0.55);
  border: 1px solid rgba(201, 168, 76, 0.5);
  border-radius: 999px;
  backdrop-filter: blur(4px);
  color: var(--vdf-blanc-casse);
  font-size: var(--vdf-fs-petit);
}
.vdf-dept .vdf-badge__icone { color: var(--vdf-or); display: inline-flex; }

/* --- Barre de statistiques (horizontale, séparateurs, icônes) --- */
.vdf-dept .vdf-stats {
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: var(--vdf-space-md);
  padding: var(--vdf-space-md);
}
.vdf-dept .vdf-stat { display: flex; flex-direction: column; align-items: center; text-align: center; min-width: 120px; position: relative; }
.vdf-dept .vdf-stat + .vdf-stat::before {
  content: ""; position: absolute; left: calc(var(--vdf-space-md) / -2); top: 10%; height: 80%; width: 1px;
  background: rgba(201, 168, 76, 0.4);
}
.vdf-dept .vdf-stat__valeur { font-family: var(--vdf-font-titre); font-size: 1.7rem; color: var(--vdf-or); }
.vdf-dept .vdf-stat__label { font-size: var(--vdf-fs-petit); text-transform: uppercase; letter-spacing: 0.06em; opacity: 0.8; }

/* --- Cartes de villages --- */
.vdf-dept .vdf-villages { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--vdf-space-md); }
.vdf-dept .vdf-village {
  /* Migre le 20/08 : cette carte etait blanche en dur. Elle appartient au modele de
     BASE, pas aux modeles sombres — le Collector la surcharge en --vdf-fond-carte.
     `--vdf-blanc-casse` la remet dans la charte sans changer son role. */
  background: var(--vdf-blanc-casse); border-radius: var(--vdf-radius); overflow: hidden; box-shadow: 0 6px 24px rgba(0,0,0,0.08); }
.vdf-dept .vdf-village__img { width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block; }
.vdf-dept .vdf-village__body { padding: var(--vdf-space-sm) 1.2rem 1.4rem; }
.vdf-dept .vdf-village__nom { font-family: var(--vdf-font-soustitre); font-size: 1.25rem; color: var(--vdf-vert-foret); margin: 0 0 0.4rem; }

/* --- Images : lazy + responsive par défaut --- */
.vdf-dept img { max-width: 100%; height: auto; }

/* --- CTA --- */
.vdf-dept .vdf-cta { text-align: center; }
.vdf-dept .vdf-bouton {
  display: inline-block; padding: 0.9rem 2.2rem;
  background: var(--vdf-or); color: var(--vdf-noir);
  font-family: var(--vdf-font-corps); font-weight: 600; letter-spacing: 0.03em;
  text-decoration: none; border-radius: 999px; border: 2px solid var(--vdf-or);
  transition: background 0.2s, color 0.2s;
}
.vdf-dept .vdf-bouton:hover { background: transparent; color: var(--vdf-or); }

/* Boutons "Réserver" (Préparez votre séjour) : CTA PRINCIPAUX en OR CHAUD "Tour Eiffel" (retour client).
   Dorés pleins, texte sombre lisible, restent remplis au survol (or chaud plus clair) pour ressortir. */
.vdf-dept .vdf-partenaires__liens .vdf-bouton {
  background: var(--vdf-or-chaud); color: var(--vdf-noir); border-color: var(--vdf-or-chaud);
  box-shadow: 0 6px 22px rgba(224, 168, 58, .32);
}
.vdf-dept .vdf-partenaires__liens .vdf-bouton:hover,
.vdf-dept .vdf-partenaires__liens .vdf-bouton:focus-visible {
  background: var(--vdf-or-chaud-clair); color: var(--vdf-noir); border-color: var(--vdf-or-chaud-clair);
}

/* --- Bloc émotion / citation (collection + collector) --- */
.vdf-dept .vdf-emotion { text-align: center; max-width: 760px; margin-inline: auto; }
.vdf-dept .vdf-citation { font-family: var(--vdf-font-soustitre); font-style: italic; font-size: clamp(1.3rem, 3vw, 2rem); line-height: 1.4; }
.vdf-dept .vdf-citation__auteur { font-size: var(--vdf-fs-petit); text-transform: uppercase; letter-spacing: 0.1em; color: var(--vdf-or); margin-top: var(--vdf-space-sm); }

/* --- Patterns complémentaires (utilisés par les helpers de rendu) --- */
.vdf-dept .vdf-hero__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; }
.vdf-dept .vdf-hero__eyebrow { font-family: var(--vdf-font-corps); text-transform: uppercase; letter-spacing: 0.15em; font-size: var(--vdf-fs-petit); color: var(--vdf-or); margin: 0 0 0.5rem; }

.vdf-dept .vdf-village__desc { font-size: var(--vdf-fs-petit); color: #555; margin: 0 0 0.6rem; }
.vdf-dept .vdf-village__lien { color: var(--vdf-cuivre); font-weight: 600; text-decoration: none; font-size: var(--vdf-fs-petit); }
.vdf-dept .vdf-village__lien:hover { color: var(--vdf-or-fonce); }

.vdf-dept .vdf-carte-immersive__img { width: 100%; border-radius: var(--vdf-radius); display: block; }

.vdf-dept .vdf-saviez { max-width: 760px; }
.vdf-dept .vdf-saviez__contenu { font-size: 1.1rem; }

.vdf-dept .vdf-partenaires__liens { display: flex; flex-wrap: wrap; gap: var(--vdf-space-sm); justify-content: center; }
.vdf-dept .vdf-cta__texte { max-width: 560px; margin: 0 auto var(--vdf-space-md); }
.vdf-dept .vdf-emotion__texte { font-size: 1.15rem; margin-bottom: var(--vdf-space-md); }

/* --- Squelette de socle (avant design fin) --- */
.vdf-dept .vdf-dept__skeleton { padding: var(--vdf-space-xl) var(--vdf-space-md); text-align: center; }
.vdf-dept .vdf-dept__marqueur { font-family: var(--vdf-font-corps); text-transform: uppercase; letter-spacing: 0.1em; font-size: var(--vdf-fs-petit); color: var(--vdf-or); }
.vdf-dept .vdf-dept__titre { font-family: var(--vdf-font-titre); text-transform: uppercase; letter-spacing: var(--vdf-ls-caps); font-size: var(--vdf-fs-hero); color: var(--vdf-vert-foret); margin: var(--vdf-space-sm) 0 0; }

/* ============================================================================
   MODELE COLLECTOR - design fin du hero (maquette Paris).
   ========================================================================== */

.vdf-sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.vdf-dept--collector {
  --vdf-fs-collector-num: clamp(4rem, 10vw, 8rem); /* "75" : proportions template + panneau moins haut -> descend vers le bas du hero */
  --vdf-fs-collector-nom: clamp(2.4rem, 6.5vw, 5rem);
  --vdf-fs-h2: clamp(1.25rem, 2.7vw, 2rem); /* titres de section réduits ~22% (retour client), même hiérarchie */
  --vdf-header-h: 88px; /* hauteur réelle du header fixe en DESKTOP (mesurée 1280-1920 ; 77px en mobile) */
  --vdf-vcard-body-min: 130px; /* 120 + 10 px de place pour la flèche (signal 256). Corps RÉDUIT (retour client : max de place à la photo) ; plancher = corps le plus haut (kicker + nom 2 lignes + desc 2 lignes + flèche) -> villages = secrets = expériences, spread 0 */
}
/* Bande 2 colonnes : cartes étroites -> les noms longs des secrets passent sur 3 lignes.
   On remonte le plancher commun pour préserver l'égalité stricte des 3 grilles. */
@media (max-width: 600px) and (min-width: 381px) {
  .vdf-dept--collector { --vdf-vcard-body-min: 150px; } /* 140 + 10 (signal 256) */
}

/* --- Hero : grille bas-gauche, image de fond plein cadre, LCP --- */
.vdf-dept--collector .vdf-hero {
  display: grid;
  grid-template-columns: minmax(0, 620px) 1fr;
  grid-template-rows: 1fr auto; /* contenu (haut) + barre de stats intégrée (bas) */
  align-items: end;
  min-height: 100vh;
  min-height: 100svh;
  /* Réserve la hauteur du header FIXE (88px desktop, mesuré) + marge, en HAUT du hero, à TOUTES les
     largeurs : le panneau bottom-aligné ne peut plus remonter sous le header sur les viewports courts
     (13-15" : 1280x800/720, 1366x768...). Robuste quelle que soit la hauteur d'écran. */
  padding-top: calc(var(--vdf-header-h, 88px) + 1.75rem);
  background: var(--vdf-bleu-nuit); /* LQIP gratuit pendant le decode de l'image */
  overflow: hidden;
}
/* Calage badges<->image : l'image ET la couche de badges partagent la MEME boite 16:9
   "cover" (centree facon object-position 60%/50%). Les positions x/y % des badges tombent
   donc exactement sur l'image, quel que soit le ratio d'ecran (16:9, 16:10, ultralarge...). */
.vdf-dept--collector .vdf-hero__media,
.vdf-dept--collector .vdf-hero__poi {
  position: absolute; top: 50%; left: 72%; transform: translate(-72%, -50%); /* cadrage : montre + le côté droit (Tour Eiffel) recentrée, moins de gauche (retour client) ; image + badges partagent la boîte -> calage préservé */

  /* ==========================================================================
     16/9 PAR CONSTRUCTION, ET NON PAR COÏNCIDENCE.
     ==========================================================================
     La version précédente calculait les deux dimensions séparément :
         width:  max(100%, calc(100svh * 16 / 9));
         height: max(100%, calc(100vw  * 9 / 16));
     Le ratio n'en sortait à 16/9 que si « 100% » valait exactement le viewport.
     Or .vdf-hero a min-height:100svh mais son contenu (panneau + barre de stats)
     mesure 800 à 930 px SELON LA FICHE : dès que la fenêtre est plus courte, le
     second max() retournait la hauteur réelle du hero et le ratio décrochait.

     Mesuré avant correctif, à 1280x800 : ratio 1,559 sur les Bouches-du-Rhône,
     1,657 sur Paris, 1,778 sur la Guadeloupe — trois valeurs pour trois fiches.
     Comme l'image est en object-fit:cover, cet écart de ratio déplaçait les
     repères : jusqu'à 7,0 points sur Paris à 850 px.

     Ici, une SEULE dimension est calculée et la hauteur découle du ratio. Le
     décrochage devient impossible.

     Couverture : W = max(hero_w, hero_h × 16/9), donc H = W × 9/16 >= hero_h.
     La boîte couvre toujours le hero, comme avant.

     --vdf-hero-h est posée par assets/js/hero-ratio.js (ResizeObserver). Repli
     sur 100svh si le script ne tourne pas, plus min-height:100% qui garantit la
     couverture — on retombe alors sur le comportement d'avant, jamais pire. */
  width: max(100%, calc(var(--vdf-hero-h, 100svh) * 16 / 9));
  aspect-ratio: 16 / 9;
  height: auto;
  min-height: 100%;
}
.vdf-dept--collector .vdf-hero__media { z-index: 0; }
.vdf-dept--collector .vdf-hero__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }

/* Overlay : dense a GAUCHE (lisibilite du texte) + ancrage vertical bas */
.vdf-dept--collector .vdf-hero::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background:
    linear-gradient(90deg, rgba(15,20,32,0.78) 0%, rgba(15,20,32,0.55) 26%, rgba(15,20,32,0.24) 52%, rgba(15,20,32,0) 76%),
    linear-gradient(0deg, rgba(11,16,28,0.6) 0%, rgba(11,16,28,0) 42%);
}

/* --- Bloc texte gauche : PANNEAU encadré (template) ---
   Le bloc repose sur un cartouche sombre translucide (léger flou) détaché de la photo par une
   fine bordure dorée + coins arrondis. Les grandes marges remplacent l'ancien padding externe
   pour insérer le panneau dans la colonne sans toucher les bords du hero. Le badge rond reste
   HORS de ce panneau (élément frère). */
.vdf-dept--collector .vdf-hero__contenu {
  position: relative; z-index: 2; grid-column: 1; align-self: end;
  container-type: inline-size; /* 100cqi = largeur intérieure du panneau -> pilote la taille scalable du titre */
  /* Panneau ÉTROIT façon template, légèrement réduit (retour client). CONTENU CENTRÉ (chiffre + texte). */
  max-width: clamp(280px, 25vw, 375px);
  margin: 0 var(--vdf-space-md) clamp(1.6rem, 5vh, 3.5rem) clamp(1.25rem, 4vw, 3rem);
  padding: clamp(1.1rem, 2.2vh, 1.6rem) clamp(1.1rem, 1.7vw, 1.6rem);
  text-align: center;
  /* Fond 100 % TRANSPARENT (retour client, call post-V1) : « comme pour les statistiques […] comme si
     on a une vue sur le hero en même temps. Mais tous. » Plus de voile ni de backdrop-filter ni d'ombre
     portée : cadre doré seul, la photo traverse le panneau. La lisibilité repose sur les text-shadow
     des textes (vérifiée sur les 6 heros réels). */
  background: transparent;
  border: 1.5px solid rgba(194, 152, 63, .85); /* --vdf-or : cadre franc, comme le cadre doré des stats */
  border-radius: var(--vdf-radius);
  color: var(--vdf-blanc-casse);
}
.vdf-dept--collector .vdf-hero__eyebrow {
  font-family: var(--vdf-font-corps); font-weight: 600; text-transform: uppercase;
  letter-spacing: 0.32em; font-size: clamp(0.7rem, 1.1vw, 0.82rem);
  color: var(--vdf-or); margin: 0 0 clamp(0.6rem, 1.6vh, 1rem);
}
/* Petit diamant devant l'eyebrow (style template) */
.vdf-dept--collector .vdf-hero__eyebrow::before { content: "\25C6\00a0\00a0"; font-size: .8em; }
.vdf-dept--collector .vdf-hero__num {
  display: block; font-family: var(--vdf-font-titre); font-weight: 700;
  font-size: var(--vdf-fs-collector-num); line-height: 0.82; letter-spacing: 0.01em;
  color: var(--vdf-or); margin: 0; text-shadow: 0 4px 28px rgba(0,0,0,0.5);
}
.vdf-dept--collector .vdf-hero__nom {
  font-family: var(--vdf-font-titre); font-weight: 700; text-transform: uppercase;
  /* TAILLE SCALABLE (remplace les ajustements manuels par département) : la font s'adapte au PLUS LONG
     MOT INSÉCABLE du nom (--vdf-nom-maxword, injecté au rendu) pour qu'il tienne toujours dans la largeur
     du panneau (100cqi = largeur intérieure du panneau, cf. container-type sur .vdf-hero__contenu).
     - noms courts (PARIS) : plafonnés à var(--vdf-fs-collector-nom) -> restent grands ;
     - noms à mot long (GUADELOUPE, ATLANTIQUES) : réduits juste ce qu'il faut, jamais débordés ni coupés.
     hyphens:none -> coupe uniquement sur les vrais traits d'union ; overflow-wrap:break-word = filet ultime. */
  /* facteur 1.0 (et non 1.2) : chaque titre occupe ~76% de la largeur du panneau en Chrome -> ~24% de
     marge, qui absorbe les moteurs rendant Cinzel plus large (Safari) et les zooms. À 1.2 la marge
     n'était que ~9% (91%) -> "GUADELOUPE" cassait mid-word hors Chrome. Le mot insécable le plus long
     reste toujours ENTIER, à toutes largeurs, tous navigateurs. */
  font-size: clamp(1.4rem, calc(100cqi / var(--vdf-nom-maxword, 6)), var(--vdf-fs-collector-nom));
  line-height: 1.05; letter-spacing: 0.03em;
  color: var(--vdf-blanc-casse); margin: 0.2rem 0 0; text-shadow: 0 2px 18px rgba(0,0,0,0.55);
  overflow-wrap: break-word; hyphens: none;
}
.vdf-dept--collector .vdf-hero__filet { display: block; width: 72px; height: 2px; background: var(--vdf-or); margin: clamp(.6rem, 1.5vh, .9rem) auto; }
.vdf-dept--collector .vdf-hero__slogan {
  font-family: var(--vdf-font-corps); font-weight: 500; text-transform: uppercase;
  letter-spacing: 0.14em; font-size: clamp(0.85rem, 1.5vw, 1.05rem);
  color: var(--vdf-or); margin: 0; font-style: normal; text-shadow: 0 1px 8px rgba(0, 0, 0, .5);
}

/* Paragraphe descriptif (template) : clair, lisible, largeur limitée */
.vdf-dept--collector .vdf-hero__desc {
  margin: clamp(.7rem, 1.6vh, 1rem) 0 0;
  font-family: var(--vdf-font-corps); font-size: clamp(.8rem, .95vw, .9rem); line-height: 1.5;
  color: rgba(245, 240, 232, .92); text-shadow: 0 1px 6px rgba(0, 0, 0, .55);
}
/* Bouton film + sous-ligne (template : "Paris, autrement (2 min)") */
.vdf-dept--collector .vdf-hero__film-wrap { margin-top: clamp(.8rem, 2vh, 1.3rem); display: flex; flex-direction: column; gap: .45rem; align-items: center; }
.vdf-dept--collector .vdf-hero__film-sous { font-family: var(--vdf-font-soustitre); font-style: italic; font-size: .85rem; color: var(--vdf-or-clair); text-shadow: 0 1px 4px rgba(0, 0, 0, .5); padding-left: .2rem; }
.vdf-dept--collector .vdf-hero__film {
  display: inline-flex; align-items: center; gap: 0.6rem; margin-top: 0.3rem;
  padding: 0.6rem 1.3rem 0.6rem 0.7rem; border: 1px solid var(--vdf-or); border-radius: 999px;
  color: var(--vdf-blanc-casse); text-decoration: none; text-transform: uppercase;
  letter-spacing: 0.1em; font-size: 0.78rem; font-weight: 600;
  transition: background 0.2s, color 0.2s;
}
.vdf-dept--collector .vdf-hero__film:hover, .vdf-dept--collector .vdf-hero__film:focus-visible { background: var(--vdf-or); color: var(--vdf-noir); }
.vdf-dept--collector .vdf-hero__film-play {
  width: 1.7em; height: 1.7em; border-radius: 50%; border: 1px solid currentColor;
  position: relative; flex: none;
}
.vdf-dept--collector .vdf-hero__film-play::before {
  content: ""; position: absolute; top: 50%; left: 54%; transform: translate(-50%, -50%);
  border-left: 0.5em solid currentColor; border-top: 0.32em solid transparent; border-bottom: 0.32em solid transparent;
}

/* --- Indice de scroll --- */
.vdf-dept--collector .vdf-hero__scroll {
  position: absolute; z-index: 2; bottom: 1.4rem; right: clamp(1.5rem, 4vw, 3.5rem);
  display: flex; flex-direction: column; align-items: center; gap: 0.4rem;
  color: var(--vdf-or-clair);
}
.vdf-dept--collector .vdf-hero__scroll-mot { font-family: var(--vdf-font-corps); text-transform: uppercase; letter-spacing: 0.18em; font-size: 0.66rem; }
.vdf-dept--collector .vdf-hero__scroll::after {
  content: ""; width: 12px; height: 12px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg); animation: vdf-scroll-bob 1.8s ease-in-out infinite;
}
@keyframes vdf-scroll-bob { 0%,100% { transform: rotate(45deg) translate(0,0); } 50% { transform: rotate(45deg) translate(3px,3px); } }

/* --- Badges points d'interet (absolus) --- */
/* .vdf-hero__poi : position/boite 16:9 héritées de la règle de calage ci-dessus. */
.vdf-dept--collector .vdf-hero__poi { z-index: 6; pointer-events: none; }
.vdf-dept--collector .vdf-poi {
  position: absolute; transform: translate(-50%, -50%); z-index: 6; pointer-events: auto;
  margin: 0; border: 0; background: none; cursor: default; text-decoration: none;
  font: inherit; color: inherit; line-height: 0;
  animation: vdf-poi-in 0.6s ease both; animation-delay: calc(0.55s + var(--i, 0) * 0.09s);
}
.vdf-dept--collector .vdf-poi--lien { cursor: pointer; }
.vdf-dept--collector .vdf-poi:hover, .vdf-dept--collector .vdf-poi:focus-visible { z-index: 12; }
@keyframes vdf-poi-in { from { opacity: 0; } to { opacity: 1; } }

/* Point : coeur clair + anneau or + halo sombre (ressort sur les lumieres de la ville) */
.vdf-dept--collector .vdf-poi__dot {
  display: block; width: 14px; height: 14px; border-radius: 50%; position: relative;
  background: var(--vdf-blanc-casse);
  box-shadow: 0 0 0 2px var(--vdf-or), 0 0 0 5px rgba(20,27,39,0.55), 0 0 14px 2px rgba(224,199,126,0.6);
  transition: transform 0.2s, box-shadow 0.2s;
}
/* Pulse compositor-friendly (transform + opacity, zero repaint) */
.vdf-dept--collector .vdf-poi__dot::after {
  content: ""; position: absolute; inset: -3px; border-radius: 50%; border: 2px solid var(--vdf-or);
  opacity: 0; animation: vdf-poi-pulse 2.8s ease-out infinite; will-change: transform, opacity;
}
@keyframes vdf-poi-pulse { 0% { transform: scale(0.55); opacity: 0.7; } 100% { transform: scale(2.4); opacity: 0; } }
.vdf-dept--collector .vdf-poi:hover .vdf-poi__dot,
.vdf-dept--collector .vdf-poi:focus-visible .vdf-poi__dot {
  transform: scale(1.2);
  box-shadow: 0 0 0 2px var(--vdf-or-clair), 0 0 0 6px rgba(20,27,39,0.7), 0 0 18px 4px rgba(224,199,126,0.85);
}
.vdf-dept--collector .vdf-poi:focus-visible { outline: none; }
.vdf-dept--collector .vdf-poi:focus-visible .vdf-poi__dot {
  box-shadow: 0 0 0 2px var(--vdf-or-clair), 0 0 0 5px rgba(20,27,39,0.85), 0 0 0 8px var(--vdf-blanc-casse), 0 0 20px 5px rgba(224,199,126,0.9);
}

/* Cartouche VISIBLE en permanence (maquette) : a cote du point, relie par un trait or. */
.vdf-dept--collector .vdf-poi__panel {
  position: absolute; top: 50%; transform: translateY(-50%);
  /* 2 COLONNES (template) : GRAND picto doré à gauche (centré verticalement), bloc texte à droite */
  display: flex; align-items: center; gap: .6rem;
  min-width: 11rem; max-width: 15rem; padding: 0.55rem 0.75rem;
  background: rgba(17, 24, 38, 0.86); border: 1px solid var(--vdf-or); border-radius: 8px;
  box-shadow: 0 8px 22px rgba(0,0,0,0.5); text-align: left; line-height: 1.35;
  transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
}
.vdf-dept--collector .vdf-poi--right .vdf-poi__panel { left: calc(50% + 22px); }
.vdf-dept--collector .vdf-poi--left .vdf-poi__panel { right: calc(50% + 22px); }
/* Trait reliant le cartouche au point */
.vdf-dept--collector .vdf-poi__panel::before { content: ""; position: absolute; top: 50%; width: 22px; height: 1px; background: var(--vdf-or); }
.vdf-dept--collector .vdf-poi--right .vdf-poi__panel::before { right: 100%; }
.vdf-dept--collector .vdf-poi--left .vdf-poi__panel::before { left: 100%; }
/* Survol / focus : mise en avant (agrandissement leger + glow) */
.vdf-dept--collector .vdf-poi:hover .vdf-poi__panel,
.vdf-dept--collector .vdf-poi:focus-visible .vdf-poi__panel {
  transform: translateY(-50%) scale(1.06); border-color: var(--vdf-or-clair);
  box-shadow: 0 12px 30px rgba(0,0,0,0.6), 0 0 0 1px var(--vdf-or-clair), 0 0 22px rgba(224,199,126,0.4);
}
.vdf-dept--collector .vdf-poi__txt { display: block; min-width: 0; }
.vdf-dept--collector .vdf-poi__nom { display: block; font-family: var(--vdf-font-titre); font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.72rem; line-height: 1.2; color: var(--vdf-blanc-casse); } /* nom en BLANC (template) ; seule l'icône reste or */
/* GRAND pictogramme doré, colonne gauche (structure template) */
.vdf-dept--collector .vdf-poi__ic { flex: none; display: inline-flex; color: var(--vdf-or); }
.vdf-dept--collector .vdf-poi__ic-svg { width: 32px; height: 32px; }
.vdf-dept--collector .vdf-poi--lien .vdf-poi__nom::after { content: " \2192"; opacity: 0.85; }
.vdf-dept--collector .vdf-poi--lien:hover .vdf-poi__nom { text-decoration: underline; text-decoration-color: var(--vdf-or); }
.vdf-dept--collector .vdf-poi__desc { display: block; font-family: var(--vdf-font-corps); font-size: 0.66rem; line-height: 1.4; color: var(--vdf-blanc-casse); opacity: 0.9; margin-top: 0.15rem; }

/* Liste accessible des points (mobile/tablette <900px) - masquee en desktop */
.vdf-dept--collector .vdf-hero__poi-liste { display: none; }

/* --- Barre de stats INTÉGRÉE en bas du hero (retour client) : bande pleine largeur sur l'image,
   2e rangée de la grille hero. Valeurs Cinzel or, libellés clairs, séparateurs dorés. --- */
.vdf-dept--collector .vdf-hero__stats {
  grid-column: 1 / -1; grid-row: 2; position: relative; z-index: 3;
  background: linear-gradient(0deg, rgba(11, 16, 28, .85) 0%, rgba(11, 16, 28, .55) 55%, rgba(11, 16, 28, 0) 100%);
  padding: 2.4rem 0 1.5rem;
}
.vdf-dept--collector .vdf-hero__stats-inner {
  /* GRILLE adaptée au NOMBRE réel de stats (--vdf-stat-count, injecté au rendu) : une seule rangée,
     jamais d'orpheline ni de colonne vide, quel que soit le département (retour client : "+80" ne
     tombe plus à 1280-1440). Cadre doré ÉPAISSI (1px .5 -> 2px .75, plus visible), borné + centré. */
  display: grid; grid-template-columns: repeat(var(--vdf-stat-count, 6), minmax(0, 1fr)); align-items: center;
  gap: .5rem 2.2rem;
  width: 100%; max-width: min(1180px, calc(var(--vdf-stat-count, 6) * 200px), 94vw); margin-inline: auto;
  padding: 1rem clamp(1.4rem, 2.5vw, 2.2rem); border: 2.5px solid rgba(201, 168, 76, .9); border-radius: var(--vdf-radius);
}
.vdf-dept--collector .vdf-hero__stat {
  position: relative; display: flex; flex-direction: row; align-items: center; gap: .75rem; text-align: left;
  min-width: 88px; max-width: 230px;
}
.vdf-dept--collector .vdf-hero__stat-ic { flex: none; display: inline-flex; color: var(--vdf-or); opacity: .9; }
.vdf-dept--collector .vdf-hero__stat-svg { width: 30px; height: 30px; } /* taille équilibrée avec la valeur (retour client) */
.vdf-dept--collector .vdf-hero__stat-txt { display: flex; flex-direction: column; }
.vdf-dept--collector .vdf-hero__stat + .vdf-hero__stat::before {
  content: ""; position: absolute; left: -1.1rem; top: 14%; height: 72%; width: 1px; background: rgba(201, 168, 76, .45);
}
/* Sous 1180px la ligne unique ne tient plus : GRILLE RÉGULIÈRE (fini le quinconce du flex-wrap).
   Séparateurs masqués (faux en grille), cadre doré conservé autour d'une grille nette.
   3 colonnes (tablette) -> 2 (mobile) -> 1 (très petit). Cellules alignées en haut. */
/* --- Lisibilité du hero sur téléphone (retour client, 2026-08-11) ---
   Le voile des stats n'a jamais changé de couleur selon la largeur : c'est UNE seule
   règle, non conditionnelle. Ce qui change, c'est la HAUTEUR du bloc — 2 colonnes au
   lieu de 6 font passer les stats de 164 px à 331 px sur Paris, soit 39 % de l'écran.
   Le dégradé s'étire donc sur une bande bien plus haute, et sa zone opaque à 85 %
   mange le bas de la photo : d'où l'impression d'un « fond noir » propre au mobile.
   On traite la cause : sous 900 px, le voile est allégé et son point d'opacité maximale
   remonté, ce qui laisse voir l'image sur toute la hauteur du bloc. Aucun texte n'est
   touché : les valeurs sont blanches, les libellés clairs, ils gardent leur ombre portée. */
@media (max-width: 900px) {
  .vdf-dept--collector .vdf-hero__stats {
    background: linear-gradient(0deg,
      rgba(11, 16, 28, .62) 0%,
      rgba(11, 16, 28, .34) 60%,
      rgba(11, 16, 28, 0) 100%);
    padding-top: 1.6rem; /* était 2.4rem : autant de hauteur de voile en moins */
  }
}

@media (max-width: 1180px) {
  .vdf-dept--collector .vdf-hero__stat + .vdf-hero__stat::before { display: none; }
  .vdf-dept--collector .vdf-hero__stats-inner {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    align-items: start; gap: 1rem 1.3rem; max-width: min(720px, 94vw);
  }
  .vdf-dept--collector .vdf-hero__stat { max-width: none; align-items: flex-start; }
  .vdf-dept--collector .vdf-hero__stat-ic { margin-top: .15rem; } /* icône calée sur la 1re ligne du texte */
}
@media (max-width: 480px) {
  /* vrais téléphones : le panneau prend toute la largeur (lisibilité), 75/PARIS restent empilés.
     width définie (calc 100%-2rem) requise avec container-type:inline-size (sinon collapse en flex). */
  .vdf-dept--collector .vdf-hero__contenu { width: calc(100% - 2rem); max-width: none; }
}
@media (max-width: 700px) {
  .vdf-dept--collector .vdf-hero__stats-inner { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 360px) {
  .vdf-dept--collector .vdf-hero__stats-inner { grid-template-columns: minmax(0, 1fr); }
}
/* Libellés dorés du bandeau au téléphone (F19, brief 23) : « ÉDITION COLLECTOR » et le slogan passaient
   sur le ciel clair de la photo (1,24:1 sur Paris, mesuré sur la capture). Voile sombre derrière le seul
   libellé, aux bords adoucis par l'ombre portée ; la teinte dorée ne change pas. Rien n'est déplacé :
   la boîte prend la largeur du texte, centrée comme lui, sans marge intérieure, et l'ombre ne prend pas
   de place. 600 px et moins : tablette et ordinateur inchangés. */
@media (max-width: 600px) {
  .vdf-dept--collector .vdf-hero__eyebrow,
  .vdf-dept--collector .vdf-hero__slogan {
    width: fit-content; margin-inline: auto; border-radius: 3px;
    background: rgba(11, 16, 28, .84);
    box-shadow: 0 0 10px 5px rgba(11, 16, 28, .84);
  }
}
.vdf-dept--collector .vdf-hero__stat-val { font-family: var(--vdf-font-titre); color: var(--vdf-blanc-casse); font-size: clamp(1.2rem, 1.85vw, 1.6rem); line-height: 1.15; text-shadow: 0 1px 4px rgba(0, 0, 0, .6); } /* valeur en BLANC (template) ; seule l'icône reste or */
/* Valeur longue (ex. "Capitale mondiale de la culture") : typo réduite -> alignée avec les autres stats. */
.vdf-dept--collector .vdf-hero__stat--long .vdf-hero__stat-val { font-size: clamp(.82rem, 1vw, .98rem); line-height: 1.25; }
.vdf-dept--collector .vdf-hero__stat-lab { font-family: var(--vdf-font-corps); font-size: .66rem; text-transform: uppercase; letter-spacing: .08em; color: var(--vdf-blanc-casse); opacity: .85; margin-top: .25rem; text-shadow: 0 1px 3px rgba(0, 0, 0, .55); }

/* Les stats occupant le bas du hero, l'indice de scroll ferait doublon -> masqué. */
.vdf-dept--collector .vdf-hero__scroll { display: none; }

/* --- Cascade d'entree du texte (CSS pur : robuste sans JS) --- */
.vdf-dept--collector .vdf-hero__contenu > * { animation: vdf-hero-in 0.7s cubic-bezier(0.2,0.7,0.2,1) both; animation-delay: calc(0.1s + var(--i, 0) * 0.1s); }
@keyframes vdf-hero-in { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: none; } }

/* --- Responsive --- */
/* <=900px : les cartouches sur l'image deviennent trop denses (chevauchent le panneau) -> bascule
   LISTE. MAIS le panneau garde son style ENCADRÉ ÉTROIT (75/PARIS empilés et contraints) au lieu de
   passer pleine largeur : le client (fenêtre laptop zoomée/scalée ~853px effectifs) voit donc le même
   bloc premium encadré que sur grand écran, pas une version dégradée. Pleine largeur seulement <=480px. */
@media (max-width: 900px) {
  /* padding-top = dégagement sous le header fixe (77px) : le panneau démarre SOUS le header,
     plus aucun chevauchement eyebrow/logo (le contenu, plus haut que le hero, ne remonte plus sous la barre). */
  /* flex-column : align-items pilote l'axe HORIZONTAL. La base est 'end' (bas, pour la grille) -> ici
     'flex-start' sinon le panneau borné (420px) serait poussé à DROITE. Ancrage bas-GAUCHE (template). */
  .vdf-dept--collector .vdf-hero { display: flex; flex-direction: column; justify-content: flex-end; align-items: flex-start; padding-top: 6rem; }
  /* panneau encadré ÉTROIT conservé (max-width borné) : le "75 PARIS" reste stacké/contraint dans le
     cadre doré, ancré bas-gauche, comme sur desktop. */
  .vdf-dept--collector .vdf-hero__contenu { align-self: flex-start; width: min(420px, calc(100% - 2rem)); max-width: min(420px, calc(100% - 2rem)); margin: 0 1rem 1.4rem; padding: clamp(1.2rem, 2.4vh, 1.7rem) clamp(1.2rem, 1.8vw, 1.7rem); } /* align-self flex-start : annule le 'end' de la grille. width DÉFINIE (pas seulement max-width) : indispensable avec container-type:inline-size en flex-column (sinon le panneau collapse -> 100cqi et titre au plancher). */
  .vdf-dept--collector .vdf-hero__stats { align-self: stretch; margin-top: 1.4rem; }
  .vdf-dept--collector .vdf-hero__poi-liste { align-self: stretch; } /* la liste POI s'étend sous le panneau (pleine largeur du hero) */
  .vdf-dept--collector .vdf-hero__poi { display: none; }
  .vdf-dept--collector .vdf-hero__scroll { display: none; }

  /* Voile renforcé sur mobile/tablette : le bloc texte + la liste POI reposent sur du sombre
     CONSTANT quelle que soit la zone de l'image (correctif lisibilité, vérif humaine). */
  .vdf-dept--collector .vdf-hero::after {
    background: linear-gradient(0deg,
      rgba(11, 16, 28, .96) 0%, rgba(11, 16, 28, .86) 36%, rgba(11, 16, 28, .55) 62%,
      rgba(11, 16, 28, .18) 84%, rgba(11, 16, 28, 0) 100%);
  }

  /* Liste POI : panneau lisible (fond sombre translucide + liseré doré), items compacts et réguliers :
     pastille + nom doré + description courte en clair sur UNE ligne (ellipse). Rien ne se fond dans l'image. */
  .vdf-dept--collector .vdf-hero__poi-liste {
    display: block; position: relative; z-index: 2; list-style: none; margin: 1.4rem 0 0; padding: .3rem .95rem;
    background: rgba(11, 16, 28, .58); border: 1px solid rgba(201, 168, 76, .28); border-radius: var(--vdf-radius);
    -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
  }
  .vdf-dept--collector .vdf-poi-item {
    display: flex; align-items: center; gap: .6rem;
    padding: .5rem 0; border-bottom: 1px solid rgba(245, 240, 232, .1);
  }
  .vdf-dept--collector .vdf-poi-item:last-child { border-bottom: 0; }
  /* Même structure que le cartouche desktop : GRANDE icône colonne gauche, nom + description EMPILÉS
     (description sur sa propre ligne, plus d'ellipse inline). */
  .vdf-dept--collector .vdf-poi-item__ic { flex: none; display: inline-flex; color: var(--vdf-or); }
  .vdf-dept--collector .vdf-poi-item__ic-svg { width: 21px; height: 21px; }
  .vdf-dept--collector .vdf-poi-item__txt { display: block; min-width: 0; }
  .vdf-dept--collector .vdf-poi-item__nom { display: block; font-family: var(--vdf-font-titre); text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.8rem; line-height: 1.25; color: var(--vdf-blanc-casse); } /* nom en BLANC (template) ; icône reste or */
  .vdf-dept--collector .vdf-poi-item__desc { display: block; margin: .1rem 0 0; font-size: .74rem; line-height: 1.35; color: rgba(245, 240, 232, .8); }
  .vdf-dept--collector .vdf-poi-item a { text-decoration: none; display: flex; align-items: center; gap: .6rem; min-width: 0; }
}
/* Portrait : on tire le cadrage vers la Tour Eiffel (x~78) pour la garder visible. */
@media (max-aspect-ratio: 1/1) {
  .vdf-dept--collector .vdf-hero__media,
  .vdf-dept--collector .vdf-hero__poi { left: 72%; top: 45%; transform: translate(-72%, -45%); }
}

@media (prefers-reduced-motion: reduce) {
  .vdf-dept--collector .vdf-hero__contenu > *,
  .vdf-dept--collector .vdf-poi { animation: none; opacity: 1; }
  .vdf-dept--collector .vdf-poi { transform: translate(-50%, -50%); }
  .vdf-dept--collector .vdf-poi__dot::after,
  .vdf-dept--collector .vdf-hero__scroll::after { animation: none; }
}

/* ============================================================================
   COLLECTOR - page INTEGRALEMENT sombre/doree (alignee maquette).
   Plus aucune section fond creme : tout en bleu nuit / noir, texte clair,
   titres or Cinzel, filets dores. (Hero + barre de stats non touches.)
   ========================================================================== */
.vdf-dept--collector { background: var(--vdf-fond-section); color: var(--vdf-blanc-casse); }

/* Toutes les sections en sombre, rythme par tonalite + filet or de separation */
.vdf-dept--collector .vdf-section,
.vdf-dept--collector .vdf-section--sombre,
.vdf-dept--collector .vdf-section--foret {
  background: var(--vdf-fond-section);
  color: var(--vdf-blanc-casse);
  border-top: 1px solid rgba(201, 168, 76, 0.14);
}
.vdf-dept--collector .vdf-section:nth-of-type(even) { background: var(--vdf-fond-section-alt); }

/* Titres de section en or + filet dore dessous.
   Sélecteur h2.vdf-h2 (0,2,1) pour battre la règle de base .vdf-dept h2.vdf-h2 (vert). */
.vdf-dept--collector h2.vdf-h2 { color: var(--vdf-or-clair); } /* or clair : mesure sous 4,5:1 en or de charte sur ce fond (158) */
.vdf-dept--collector h2.vdf-h2::after {
  content: ""; display: block; width: 64px; height: 2px; background: var(--vdf-or);
  margin-top: 0.85rem; opacity: 0.9;
}
.vdf-dept--collector .vdf-cta h2.vdf-h2::after { margin-inline: auto; }
/* Collection (maquette 13) : titres de section en BLANC avec UN mot en OR (accent), au lieu du
   tout-or du Collector. La double classe .vdf-dept--collector.vdf-dept--collection a la même
   spécificité que la règle collector ci-dessus -> cette règle APRÈS gagne (source order). */
.vdf-dept--collection h2.vdf-h2 { color: var(--vdf-blanc-casse); }
/*
 * LES TITRES DE SECTION DU GABARIT PREMIUM — 22/09/2026.
 *
 * Collector et collection ont chacun leur couleur de titre ; le premium n'en avait aucune et
 * retombait sur la regle de base, le vert forêt #1a3c2e. Mesuré au 220 sur le PIXEL PEINT de
 * la fiche Corrèze rendue en aperçu : 1,26:1 sur fond bleu nuit rgb(43, 67, 119), pour un
 * plancher de 3. « VILLAGES INCONTOURNABLES » était illisible, et vérifié à l'œil.
 *
 * Le crème est celui de la collection, mesuré sur l'Ain entre 8,43 et 15,38:1. Même sélecteur
 * et même spécificité (0,2,1) que les deux autres gabarits : rien d'autre ne change.
 */
.vdf-dept--premium h2.vdf-h2 { color: var(--vdf-blanc-casse); }
/* Titre de la section des villages (signal 257, courriel de Jérôme du 12/10/2026) : le libellé en or, « – Commune
   de [département] » en blanc, dans les quatre gabarits (le Collector a ses titres en or, d'où la règle de la suite). */
.vdf-dept--premium h2.vdf-h2 .vdf-h2__or { color: var(--vdf-or-clair); }
.vdf-dept h2.vdf-h2 .vdf-h2__suite { color: var(--vdf-blanc-casse); }
.vdf-dept--collection h2.vdf-h2 .vdf-h2__or { color: var(--vdf-or-clair); } /* (0,3,0) : bat le blanc. Or clair : sous 4,5 en or de charte (158) */
/* Le titre "Vivez ... autrement" est dans .vdf-section--sombre, dont la règle de base (0,3,1) bat la
   règle collection ci-dessus (0,2,1) et forcerait le titre tout-or. Override de MÊME spécificité
   (0,3,1), placé APRÈS -> gagne ; accent (0,4,1) pour garder le mot en or. */
.vdf-dept--collection .vdf-section--sombre h2.vdf-h2 { color: var(--vdf-blanc-casse); }
.vdf-dept--collection .vdf-section--sombre h2.vdf-h2 .vdf-h2__or { color: var(--vdf-or-clair); } /* or clair : mesure sous 4,5:1 en or de charte sur ce fond (158) */

/* ============================================================================
   SECTION "Un territoire d'exception / Une terre de caractère" (Collection).
   2 colonnes : gauche (texte + bouton + carte illustrée + légende) / droite (texte + 4 piliers).
   ========================================================================== */
.vdf-dept .vdf-territoire { background: var(--vdf-fond-section); color: var(--vdf-blanc-casse); }
/* 3 ZONES (maquette) : texte gauche étroit | CARTE centrale dominante | texte+piliers droite étroit.
   Zones alignées en HAUT ; la carte (align-self:stretch) remplit la hauteur de la rangée = colonne la
   plus haute -> harmonieux, pas de grand vide. Colonnes de texte compactes (hauteur du contenu). */
.vdf-dept .vdf-territoire__grid { display: grid; grid-template-columns: minmax(0, 0.9fr) minmax(0, 2.4fr) minmax(0, 0.9fr); gap: clamp(1.5rem, 3vw, 3rem); align-items: start; }
.vdf-dept .vdf-territoire__col--gauche,
.vdf-dept .vdf-territoire__col--droite { display: flex; flex-direction: column; }
/* SANS CARTE, DEUX COLONNES ÉGALES — signal 235. L'emplacement « Carte à venir » n'est plus
   rendu : sans cette règle, la colonne de droite glisserait dans la piste centrale large et la
   troisième piste resterait vide. Une colonne de texte seule prend toute la largeur. Sous
   1100 px, l'empilement d'origine reprend (règle plus bas, même spécificité, plus loin). */
.vdf-dept .vdf-territoire--sans-carte .vdf-territoire__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.vdf-dept .vdf-territoire--sans-carte .vdf-territoire__grid > :only-child { grid-column: 1 / -1; }
/* Titres du triptyque : plus petits + letter-spacing resserré -> tiennent sur 2 lignes MAX dans les
   colonnes étroites (~239px), au lieu de casser sur 3 lignes (mesuré : "UN TERRITOIRE" = 278px à 32px
   base -> ~1.6rem pour rentrer). Sélecteur h2.vdf-h2.classe (0,3,1) pour battre .vdf-dept h2.vdf-h2. */
.vdf-dept h2.vdf-h2.vdf-territoire__titre { color: var(--vdf-or); margin: 0 0 1rem; font-size: clamp(1.25rem, 1.75vw, 1.55rem); letter-spacing: .02em; line-height: 1.22; }
.vdf-dept--collection .vdf-territoire__titre { color: var(--vdf-or); } /* gold même en collection (titres de blocs) */
.vdf-dept .vdf-territoire__titre::after { content: ""; display: block; width: 56px; height: 2px; background: var(--vdf-or); margin-top: .8rem; opacity: .9; }
.vdf-dept .vdf-territoire__texte { color: rgba(245, 240, 232, .82); line-height: 1.7; margin: 0 0 1.4rem; font-size: 1.02rem; }
/* Bouton ghost (contour doré, fond transparent) */
.vdf-dept .vdf-bouton--ghost { background: transparent; color: var(--vdf-or); border-color: var(--vdf-or); }
.vdf-dept .vdf-bouton--ghost:hover, .vdf-dept .vdf-bouton--ghost:focus-visible { background: var(--vdf-or); color: var(--vdf-noir); }
.vdf-dept .vdf-territoire__lien { margin-bottom: 1.6rem; font-size: .82rem; padding: .7rem 1.6rem; }
/* Carte CENTRALE dominante : remplit la hauteur de la rangée (stretch) + plancher généreux. */
.vdf-dept .vdf-territoire__carte { position: relative; align-self: stretch; min-height: clamp(320px, 28vw, 440px); border-radius: var(--vdf-radius); overflow: hidden; border: 1px solid rgba(201, 168, 76, .28); background: var(--vdf-fond-carto-clair); line-height: 0; }
/* Image de carte : CONTAIN (une carte illustrée doit s'afficher ENTIÈRE, noms/positions des villages
   préservés ; le fond neutre du cadre fait letterbox). Le placeholder, lui, remplit tout le cadre. */
.vdf-dept .vdf-territoire__carte-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; display: block; }
.vdf-dept .vdf-territoire__carte-ph {
  position: absolute; inset: 0; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: .7rem; color: rgba(245, 240, 232, .5);
  background: radial-gradient(130% 90% at 50% 30%, rgba(27, 42, 74, .8), transparent 62%), linear-gradient(160deg, #16223c 0%, #0e1626 100%);
}
/* Légende EMPILÉE sous le bouton (colonne gauche étroite) */
.vdf-dept .vdf-territoire__legende { list-style: none; margin: .2rem 0 0; padding: 0; display: flex; flex-direction: column; gap: .55rem; }
.vdf-dept .vdf-territoire__leg { display: inline-flex; align-items: center; gap: .5rem; font-size: .8rem; color: rgba(245, 240, 232, .8); }
.vdf-dept .vdf-territoire__leg-dot { width: 10px; height: 10px; border-radius: 50%; flex: none; }
.vdf-dept .vdf-territoire__leg-dot--nature { background: var(--vdf-vert-legende, #4caf7d); }
.vdf-dept .vdf-territoire__leg-dot--eau { background: var(--vdf-teal); }
.vdf-dept .vdf-territoire__leg-dot--village { background: var(--vdf-or); }
/* Piliers (colonne droite ÉTROITE) : UNE colonne (4 rangées) -> chaque pilier a toute la largeur de
   la colonne, icône cerclée à GAUCHE + libellé à DROITE qui wrappe (min-width:0). ZÉRO superposition
   quelle que soit la largeur (fini le 2x2 qui écrasait icône+texte dans des cellules trop étroites). */
.vdf-dept .vdf-territoire__piliers { list-style: none; margin: 1.4rem 0 0; padding: 0; display: flex; flex-direction: column; gap: .9rem; }
.vdf-dept .vdf-territoire__pilier { display: flex; align-items: center; gap: .75rem; min-width: 0; }
.vdf-dept .vdf-territoire__pilier-ic {
  flex: none; width: 42px; height: 42px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
  color: var(--vdf-or); border: 1px solid rgba(201, 168, 76, .45); background: rgba(201, 168, 76, .06);
}
.vdf-dept .vdf-territoire__pilier-svg { width: 22px; height: 22px; }
.vdf-dept .vdf-territoire__pilier-txt { flex: 1 1 auto; min-width: 0; overflow-wrap: break-word; font-family: var(--vdf-font-titre); font-weight: 700; text-transform: uppercase; letter-spacing: .03em; font-size: .8rem; line-height: 1.2; color: var(--vdf-blanc-casse); }
/* <=1100px : les 3 zones s'empilent (ordre DOM = texte gauche -> carte pleine largeur -> texte droite
   + piliers). Carte un peu plus basse (elle prend la pleine largeur). */
@media (max-width: 1100px) {
  .vdf-dept .vdf-territoire__grid,
  .vdf-dept .vdf-territoire--sans-carte .vdf-territoire__grid { grid-template-columns: minmax(0, 1fr); }
  .vdf-dept .vdf-territoire__carte { min-height: clamp(280px, 44vw, 420px); }
  .vdf-dept .vdf-territoire__legende { flex-flow: row wrap; gap: .5rem 1.5rem; } /* légende sur une ligne quand la zone gauche est pleine largeur */
}
@media (max-width: 460px) {
  .vdf-dept .vdf-territoire__legende { flex-direction: column; }
}

/* Cartes villages : sombres (les images viennent au point 3) */
.vdf-dept--collector .vdf-village {
  background: var(--vdf-fond-carte); border: 1px solid rgba(201, 168, 76, 0.16);
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
}
.vdf-dept--collector .vdf-village__nom { color: var(--vdf-or-clair); }
.vdf-dept--collector .vdf-village__desc { color: rgba(245, 240, 232, 0.78); }
.vdf-dept--collector .vdf-village__lien { color: var(--vdf-or); }
.vdf-dept--collector .vdf-village__lien:hover { color: var(--vdf-or-clair); }


/* Saviez-vous / CTA : texte clair lisible sur sombre */
.vdf-dept--collector .vdf-saviez__contenu,
.vdf-dept--collector .vdf-cta__texte { color: rgba(245, 240, 232, 0.88); }
.vdf-dept--collector .vdf-saviez__contenu a { color: var(--vdf-or-clair); }

/* ============================================================================
   COLLECTOR - cartes villages, grille expériences, CTA, bande partenaires (maquette).
   ========================================================================== */

/* --- Cartes villages : grande image (ou placeholder doré) + nom + desc, hover élégant --- */
.vdf-dept--collector .vdf-villages { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--vdf-space-md); }
.vdf-dept--collector .vdf-village { background: transparent; border: 0; box-shadow: none; border-radius: var(--vdf-radius); overflow: visible; }
.vdf-dept--collector .vdf-village__inner {
  display: block; height: 100%; text-decoration: none; color: inherit;
  background: var(--vdf-fond-carte); border: 1px solid rgba(201, 168, 76, 0.16); border-radius: var(--vdf-radius);
  overflow: hidden; transition: border-color .25s ease, transform .25s ease, box-shadow .25s ease;
}
.vdf-dept--collector a.vdf-village__inner:hover { border-color: var(--vdf-or); transform: translateY(-4px); box-shadow: 0 16px 36px rgba(0, 0, 0, .45); }
.vdf-dept--collector .vdf-village__media { position: relative; aspect-ratio: 4 / 5; overflow: hidden; background: linear-gradient(160deg, #1d2b4a 0%, #0e1626 100%); }
.vdf-dept--collector .vdf-village__img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .5s ease; }
.vdf-dept--collector .vdf-village__media::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, transparent 45%, rgba(11, 16, 28, .6) 100%); opacity: .7; transition: opacity .3s ease; }
.vdf-dept--collector a.vdf-village__inner:hover .vdf-village__img { transform: scale(1.06); }
.vdf-dept--collector a.vdf-village__inner:hover .vdf-village__media::after { opacity: 1; }
/* Placeholder élégant (pas d'image en base) : dégradé sombre + icône village dorée centrée */
.vdf-dept--collector .vdf-village__ph { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: radial-gradient(circle at 50% 38%, rgba(201, 168, 76, .12), transparent 60%); }
.vdf-dept--collector .vdf-village__ph-icone { width: 46px; height: 46px; color: var(--vdf-or); opacity: .55; transition: opacity .3s ease; }
.vdf-dept--collector a.vdf-village__inner:hover .vdf-village__ph-icone { opacity: .85; }
.vdf-dept--collector .vdf-village__body { padding: 1rem 1.1rem 1.3rem; }
.vdf-dept--collector .vdf-village__nom { font-family: var(--vdf-font-titre); font-weight: 700; font-size: 1.12rem; letter-spacing: .04em; color: var(--vdf-blanc-casse); margin: 0 0 .4rem; transition: color .25s ease; }
.vdf-dept--collector a.vdf-village__inner:hover .vdf-village__nom { color: var(--vdf-or); }
.vdf-dept--collector .vdf-village__desc { font-size: var(--vdf-fs-petit); color: rgba(245, 240, 232, .72); margin: 0; line-height: 1.5; }
@media (max-width: 992px) { .vdf-dept--collector .vdf-villages { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .vdf-dept--collector .vdf-villages { grid-template-columns: 1fr; } }

/* Taille par défaut des icônes SVG dorées (placeholders villages/secrets/expériences, etc.). */
.vdf-dept--collector .vdf-icone-svg { width: 38px; height: 38px; display: block; }

/* --- CTA Collector : grand bloc + flèche ronde + kicker --- */
.vdf-dept--collector .vdf-collector-cta__inner {
  display: flex; align-items: center; justify-content: space-between; gap: 2rem;
  text-decoration: none; color: var(--vdf-blanc-casse);
  background: linear-gradient(120deg, #16223c 0%, #0f1830 100%);
  border: 1px solid rgba(201, 168, 76, .4); border-radius: 16px;
  padding: clamp(2rem, 4vw, 3.2rem) clamp(1.5rem, 4vw, 3.5rem); position: relative; overflow: hidden;
  transition: border-color .25s ease, box-shadow .25s ease;
}
.vdf-dept--collector .vdf-collector-cta__inner::before { content: ""; position: absolute; inset: 0; background: radial-gradient(circle at 85% 50%, rgba(201, 168, 76, .14), transparent 55%); pointer-events: none; }
.vdf-dept--collector .vdf-collector-cta__inner:hover { border-color: var(--vdf-or); box-shadow: 0 18px 44px rgba(0, 0, 0, .45); }
.vdf-dept--collector .vdf-collector-cta__txt { position: relative; z-index: 1; }
.vdf-dept--collector .vdf-collector-cta__titre { font-family: var(--vdf-font-titre); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; font-size: clamp(1.6rem, 3.5vw, 2.6rem); color: var(--vdf-blanc-casse); margin: 0; line-height: 1.1; }
.vdf-dept--collector .vdf-collector-cta__sous { font-size: 1rem; color: rgba(245, 240, 232, .8); margin: .8rem 0 0; max-width: 48ch; }
.vdf-dept--collector .vdf-collector-cta__kicker { font-family: var(--vdf-font-corps); text-transform: uppercase; letter-spacing: .28em; font-size: .72rem; color: var(--vdf-or); margin: 1.2rem 0 0; }
.vdf-dept--collector .vdf-collector-cta__arrow {
  flex: none; width: clamp(64px, 9vw, 92px); height: clamp(64px, 9vw, 92px); border-radius: 50%;
  border: 1.5px solid var(--vdf-or); display: flex; align-items: center; justify-content: center;
  color: var(--vdf-or); background: rgba(201, 168, 76, .06); position: relative; z-index: 1;
  transition: background .25s ease, color .25s ease, transform .25s ease;
}
.vdf-dept--collector .vdf-collector-cta__arrow svg { width: 42%; height: 42%; }
.vdf-dept--collector .vdf-collector-cta__inner:hover .vdf-collector-cta__arrow { background: var(--vdf-or); color: var(--vdf-noir); transform: translateX(6px); }
@media (max-width: 720px) { .vdf-dept--collector .vdf-collector-cta__inner { flex-direction: column; align-items: flex-start; } }

/* --- Bande "Nos partenaires de confiance" --- */
.vdf-dept--collector .vdf-trust { margin-top: var(--vdf-space-md); padding-top: var(--vdf-space-md); border-top: 1px solid rgba(201, 168, 76, .18); text-align: center; }
.vdf-dept--collector .vdf-partenaires .vdf-partenaires__liens { margin-bottom: var(--vdf-space-md); }
.vdf-dept--collector .vdf-trust__titre { font-family: var(--vdf-font-corps); text-transform: uppercase; letter-spacing: .22em; font-size: .72rem; color: var(--vdf-or-clair); margin: 0 0 1.2rem; }
.vdf-dept--collector .vdf-trust__logos { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 1.2rem 2.5rem; }
.vdf-dept--collector .vdf-trust__item { font-family: var(--vdf-font-titre); font-weight: 700; letter-spacing: .04em; font-size: 1.05rem; color: rgba(245, 240, 232, .58); }

/* --- Polish revue : focus clavier visible (doré) sur les blocs cliquables --- */
.vdf-dept--collector a.vdf-village__inner:focus-visible,
.vdf-dept--collector a.vdf-collector-cta__inner:focus-visible {
  outline: 2px solid var(--vdf-or-clair);
  outline-offset: 3px;
  border-color: var(--vdf-or);
}

/* --- Polish revue : padding des sections réduit en mobile (rythme) --- */
@media (max-width: 900px) { .vdf-dept--collector .vdf-section { padding: 3rem 1.25rem; } }
@media (max-width: 600px) { .vdf-dept--collector .vdf-section { padding: var(--vdf-space-md) var(--vdf-space-sm); } }

/* ============================================================================
   SECTION CARTE IMMERSIVE + LIEUX SECRETS. Vraie carte Leaflet (sombre, verrouillée sur
   le département) à gauche + liste des lieux secrets à droite (reliée aux marqueurs).
   Générique aux 3 modèles. Marqueurs/popups : carte-france.css (réutilisé).
   ========================================================================== */
.vdf-dept .vdf-carte-immersive { background: linear-gradient(180deg, #0f1830 0%, #0b1322 100%); color: var(--vdf-blanc-casse); }
/* La section « La carte des villages » garde le fond de Paris à toute position (brief 30) :
   l'alternance des sections (:nth-of-type(even), plus haut) la passait en bleu #243968 sur
   les fiches qui ont une section de plus avant elle (« Territoire »). Même spécificité,
   placée après : elle l'emporte. */
.vdf-dept--collector .vdf-section.vdf-secteur--carte { background: linear-gradient(180deg, #0f1830 0%, #0b1322 100%); }
.vdf-dept .vdf-carte-immersive__head { text-align: center; max-width: 62ch; margin: 0 auto var(--vdf-space-lg); }
.vdf-dept .vdf-carte-immersive__head h2.vdf-h2::after { margin-inline: auto; }
.vdf-dept .vdf-carte-immersive__intro { color: rgba(245, 240, 232, .82); margin: var(--vdf-space-sm) 0 0; line-height: 1.65; font-size: 1.05rem; }

/* 2 colonnes : carte (gauche) + liste (droite) */
.vdf-dept .vdf-carte-immersive__grid { display: grid; grid-template-columns: 1.6fr 1fr; gap: var(--vdf-space-md); align-items: stretch; }
.vdf-dept .vdf-carte-dept { position: relative; min-height: 460px; border-radius: var(--vdf-radius); overflow: hidden; border: 1px solid rgba(201, 168, 76, .25); background: var(--vdf-fond-carto); }
.vdf-dept .vdf-carte-dept__loading { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: rgba(245, 240, 232, .6); font-family: var(--vdf-font-corps); font-size: .85rem; }
.vdf-dept .vdf-carte-dept.leaflet-container { background: var(--vdf-fond-carto); }

/* Liste des lieux (colonne droite), reliée aux marqueurs */
.vdf-dept .vdf-carte-immersive__grid .vdf-lieux { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .8rem; max-height: 460px; overflow-y: auto; }
.vdf-dept .vdf-lieu {
  position: relative; background: rgba(255, 255, 255, .03); border: 1px solid rgba(201, 168, 76, .2);
  border-left: 3px solid var(--vdf-or); border-radius: var(--vdf-radius); padding: .9rem 1.1rem;
  transition: border-color .25s ease, background .25s ease;
}
.vdf-dept .vdf-lieu--geo { cursor: pointer; }
.vdf-dept .vdf-lieu--geo:hover { border-color: rgba(201, 168, 76, .6); background: rgba(255, 255, 255, .06); }
.vdf-dept .vdf-lieu--geo:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--vdf-or-clair); border-color: var(--vdf-or); }
.vdf-dept .vdf-lieu__nom { display: block; font-family: var(--vdf-font-titre); font-weight: 700; font-size: .98rem; letter-spacing: .03em; color: var(--vdf-or-clair); padding-right: 3.6rem; }
.vdf-dept .vdf-lieu__sous { display: block; font-family: var(--vdf-font-corps); font-size: var(--vdf-fs-petit); color: rgba(245, 240, 232, .7); margin-top: .25rem; line-height: 1.5; }
.vdf-dept .vdf-lieu__dist { position: absolute; top: .9rem; right: 1.1rem; font-family: var(--vdf-font-corps); font-size: .68rem; letter-spacing: .04em; color: var(--vdf-or); border: 1px solid rgba(201, 168, 76, .35); border-radius: 999px; padding: .15rem .55rem; white-space: nowrap; }

/* Lien discret HONNETE vers la carte nationale */
.vdf-dept .vdf-carte-immersive__foot { text-align: center; margin-top: var(--vdf-space-lg); }
.vdf-dept .vdf-carte-immersive__france { font-family: var(--vdf-font-corps); font-size: .82rem; letter-spacing: .04em; color: var(--vdf-or); text-decoration: none; border-bottom: 1px solid rgba(201, 168, 76, .4); padding-bottom: 2px; }
.vdf-dept .vdf-carte-immersive__france::after { content: " \2192"; }
.vdf-dept .vdf-carte-immersive__france:hover { color: var(--vdf-or-clair); border-color: var(--vdf-or-clair); }
.vdf-dept .vdf-carte-immersive__france:focus-visible { outline: 2px solid var(--vdf-or-clair); outline-offset: 3px; }

@media (max-width: 860px) {
  .vdf-dept .vdf-carte-immersive__grid { grid-template-columns: 1fr; }
  .vdf-dept .vdf-carte-immersive__grid .vdf-lieux { max-height: none; }
}

/* Focus clavier visible sur les boutons dorés (a11y, cohérence avec cartes/CTA) */
.vdf-dept .vdf-bouton:focus-visible { outline: 2px solid var(--vdf-or-clair); outline-offset: 3px; }

/* ============================================================================
   SOCLE 3D STATIQUE (carte immersive). Image de fond + marqueurs dorés posés en %
   (mêmes principe/charte que les badges du Hero) + liste reliée. Remplace la carte
   Leaflet quand une image OU des positions X/Y existent. La hauteur du "stage" est
   donnée par l'image elle-même (width:100%/height:auto, comme l'outil de calibration)
   => les % des marqueurs restent justes à tout ratio. Sans image : placeholder 16:9.
   ========================================================================== */
/* Garde-fou : un cartouche de marqueur en bord d'image ne doit jamais provoquer de scroll
   horizontal (clip en X ; l'axe vertical reste visible pour laisser monter les cartouches). */
.vdf-dept .vdf-carte-immersive--3d { overflow-x: clip; }

/* ===== Disposition FUSION (retour client) : liste consolidée horizontale EN HAUT, grande carte EN BAS.
   Villages + lieux secrets mélangés ; différenciation par couleur (or = secrets, teal = villages). ===== */
/* Légende discrète sous le titre */
.vdf-dept .vdf-carte3d__legende { list-style: none; margin: var(--vdf-space-sm) 0 0; padding: 0; display: flex; flex-wrap: wrap; justify-content: center; gap: .4rem 1.5rem; font-size: .8rem; color: rgba(245, 240, 232, .8); }
.vdf-dept .vdf-carte3d__legende li { display: inline-flex; align-items: center; gap: .5rem; }
.vdf-dept .vdf-carte3d__dot { width: 11px; height: 11px; border-radius: 50%; flex: none; box-shadow: 0 0 0 2px rgba(11, 16, 28, .6); }
.vdf-dept .vdf-carte3d__dot--secret { background: var(--vdf-or); }
.vdf-dept .vdf-carte3d__dot--village { background: var(--vdf-teal); }
/* Légende placée JUSTE AU-DESSUS de la carte (section 3) : centrée, petit espace avant la carte. */
.vdf-dept .vdf-carte3d__legende--carte { margin: 0 0 var(--vdf-space-sm); justify-content: center; }

/* Carte GRANDE pleine largeur (dominante) */
.vdf-dept .vdf-carte3d { position: relative; display: flex; flex-direction: column; }
.vdf-dept .vdf-carte3d--large { width: 100%; }

/* --- Layout carte + menu des villages (retour client : liste à droite, généreuse) ---
   Carte DOMINANTE ~2/3, menu ~1/3. L'aside est plus courte que la carte à toutes les largeurs
   side-by-side (>=1100px) et s'étire à sa hauteur (stretch + liste centrée à gap borné).
   Sous 1100px : menu SOUS la carte, compact. */
.vdf-dept .vdf-carte3d__layout { display: grid; grid-template-columns: minmax(0, 2.2fr) minmax(0, 1fr); gap: var(--vdf-space-md); align-items: stretch; }
/* Toute arrivée par ancre/scroll programmatique dégage le header fixe (77px). */
.vdf-dept .vdf-section { scroll-margin-top: 90px; }
.vdf-dept .vdf-carte-menu {
  display: flex; flex-direction: column; min-width: 0;
  background: linear-gradient(160deg, #16223c 0%, #0f1830 100%);
  border: 1px solid rgba(201, 168, 76, .4); border-radius: var(--vdf-radius); /* liseré doré LISIBLE (l'alpha .22 rendait gris) */
  padding: 1rem 1.15rem .85rem;
}
.vdf-dept .vdf-carte-menu__titre {
  font-family: var(--vdf-font-titre); font-weight: 700; text-transform: uppercase; letter-spacing: .12em;
  font-size: .92rem; color: var(--vdf-or-clair); margin: 0 0 .3rem;
}
/* Centré à gap borné (PAS space-evenly : un département à 2-3 villages donnerait des items
   flottants et des séparateurs orphelins au milieu des vides). */
.vdf-dept .vdf-carte-menu__liste { list-style: none; margin: 0; padding: 0; flex: 1; display: flex; flex-direction: column; justify-content: center; } /* centré, PAS de gap fixe (dépasserait la carte aux largeurs basses) ni space-evenly (items flottants à 2-3 villages) */
.vdf-dept .vdf-carte-menu__li + .vdf-carte-menu__li { border-top: 1px solid rgba(245, 240, 232, .08); }
.vdf-dept .vdf-carte-menu__item {
  display: block; width: 100%; text-align: left; padding: .55rem .2rem;
  margin: 0; border: 0; background: none; font: inherit; color: inherit; cursor: pointer;
  white-space: normal; /* <button> : neutralise le nowrap du reset parent */
  border-radius: 6px; transition: background .2s ease;
}
/* background réaffirmé : neutralise le button:hover rose hérité du thème parent */
.vdf-dept .vdf-carte-menu__item:hover,
.vdf-dept .vdf-carte-menu__item:active,
.vdf-dept .vdf-carte-menu__item:focus-visible,
.vdf-dept .vdf-carte-menu__item.is-active,
.vdf-dept .vdf-carte-menu__item.is-selected { background: rgba(45, 212, 191, .07); }
.vdf-dept .vdf-carte-menu__item--inerte { cursor: default; }
.vdf-dept .vdf-carte-menu__item--inerte:hover { background: none; }
.vdf-dept .vdf-carte-menu__item:focus-visible { outline: 2px solid var(--vdf-teal-clair); outline-offset: 2px; }
.vdf-dept .vdf-carte-menu__nom {
  display: block; font-family: var(--vdf-font-titre); font-weight: 700; letter-spacing: .04em;
  font-size: 1rem; line-height: 1.25; color: var(--vdf-blanc-casse); transition: color .2s ease;
}
.vdf-dept .vdf-carte-menu__item:hover .vdf-carte-menu__nom,
.vdf-dept .vdf-carte-menu__item.is-active .vdf-carte-menu__nom,
.vdf-dept .vdf-carte-menu__item.is-selected .vdf-carte-menu__nom { color: var(--vdf-teal-clair); }
.vdf-dept .vdf-carte-menu__item--inerte:hover .vdf-carte-menu__nom { color: var(--vdf-blanc-casse); }
.vdf-dept .vdf-carte-menu__desc { display: block; font-family: var(--vdf-font-corps); font-size: .78rem; line-height: 1.4; color: rgba(245, 240, 232, .68); margin-top: .18rem; }
@media (max-width: 1160px) {
  /* Sous ~1160px la carte (ratio image) devient plus courte que le menu -> empilé, compact. */
  .vdf-dept .vdf-carte3d__layout { grid-template-columns: minmax(0, 1fr); }
  .vdf-dept .vdf-carte-menu { padding: .85rem 1rem .7rem; }
  .vdf-dept .vdf-carte-menu__item { padding: .5rem .2rem; }
  .vdf-dept .vdf-carte-menu__nom { font-size: .92rem; }
}
.vdf-dept .vdf-carte3d__stage { position: relative; width: 100%; }
.vdf-dept .vdf-carte3d__frame {
  position: relative; border-radius: var(--vdf-radius); overflow: hidden;
  border: 1px solid rgba(201, 168, 76, .25); background: var(--vdf-fond-carto); line-height: 0;
}
.vdf-dept .vdf-carte3d__img { display: block; width: 100%; height: auto; }
/* LA CARTE GÉNÉRÉE (signal 250, inc/carte-generee.php) : le SVG prend la place de l'image,
   mêmes cadre, repères et liste. Le cadre suit le rapport du SVG (borné entre 1:1 et 16:9). */
.vdf-dept .vdf-carte-gen { display: block; width: 100%; height: auto; }
.vdf-dept .vdf-carte-gen__mer { fill: var(--vdf-fond-carto); }
.vdf-dept .vdf-carte-gen__trame { fill: none; stroke: rgba(201, 168, 76, .06); stroke-width: 1; }
.vdf-dept .vdf-carte-gen__voisins { fill: rgba(245, 240, 232, .025); stroke: rgba(194, 152, 63, .2); stroke-width: 1.2; stroke-linejoin: round; }
.vdf-dept .vdf-carte-gen__terre-c { stop-color: #23365c; }
.vdf-dept .vdf-carte-gen__terre-b { stop-color: var(--vdf-bleu-nuit); }
.vdf-dept .vdf-carte-gen__contour { stroke: var(--vdf-or); stroke-width: 3; stroke-linejoin: round; filter: drop-shadow(0 0 8px rgba(224, 192, 121, .35)); }
/* Le cadre est borné à 620 px de HAUT (largeur = 620 x rapport) : une carte carrée tient
   dans l'écran d'un portable. C'est la LARGEUR du stage qu'on borne, pas la hauteur du SVG :
   les repères, posés en % du stage, restent sur leur commune. */
.vdf-dept .vdf-carte3d__stage--gen { width: min(100%, calc(620px * var(--vdf-carte-ratio, 1.7778))); margin-inline: auto; }
/* Côte à côte : la colonne de la carte prend la largeur de la carte (jamais plus que les
   2,2 parts habituelles), la liste prend le reste. Sans cela, une carte carrée flotterait
   au milieu de sa colonne, loin de la liste. */
@media (min-width: 1161px) {
  .vdf-dept .vdf-carte3d__layout--gen {
    grid-template-columns: minmax(0, min(calc(620px * var(--vdf-carte-ratio, 1.7778)), calc((100% - var(--vdf-space-md)) * 2.2 / 3.2))) minmax(0, 1fr);
  }
}

/* Placeholder sombre élégant (en attendant l'image carte 3D) : dégradé + trame "carte" */
.vdf-dept .vdf-carte3d__ph {
  position: relative; width: 100%; aspect-ratio: 16 / 9;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .7rem;
  color: rgba(245, 240, 232, .5);
  background:
    radial-gradient(130% 90% at 50% 28%, rgba(27, 42, 74, .75), transparent 62%),
    linear-gradient(160deg, #16223c 0%, #0b1322 60%, #0e1626 100%);
}
.vdf-dept .vdf-carte3d__ph::before {
  content: ""; position: absolute; inset: 0; opacity: .45; pointer-events: none;
  background-image:
    linear-gradient(rgba(201, 168, 76, .06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(201, 168, 76, .06) 1px, transparent 1px);
  background-size: 46px 46px;
}
.vdf-dept .vdf-carte3d__ph-icone { position: relative; display: inline-flex; color: var(--vdf-or); opacity: .55; }
.vdf-dept .vdf-carte3d__ph-icone .vdf-icone-svg { width: 52px; height: 52px; }
.vdf-dept .vdf-carte3d__ph-txt { position: relative; font-family: var(--vdf-font-corps); text-transform: uppercase; letter-spacing: .2em; font-size: .72rem; }

/* Couche marqueurs : MÊME boîte que l'image (inset:0), NON rognée (les cartouches débordent). */
.vdf-dept .vdf-carte3d__markers { position: absolute; inset: 0; pointer-events: none; }
.vdf-dept .vdf-carte3d__marker {
  position: absolute; transform: translate(-50%, -100%);
  margin: 0; padding: 0; border: 0; background: none; cursor: pointer; line-height: 0;
  z-index: 4; pointer-events: auto;
  animation: vdf-poi-in .5s ease both; animation-delay: calc(.25s + var(--i, 0) * .08s);
}
/* background none réaffirmé : neutralise le button:hover rose hérité du thème parent */
.vdf-dept .vdf-carte3d__marker:hover,
.vdf-dept .vdf-carte3d__marker:focus-visible { background: none; }
/* Halo au pied : repère exact du point sur la carte */
.vdf-dept .vdf-carte3d__marker::after {
  content: ""; position: absolute; left: 50%; top: 100%; transform: translate(-50%, -50%);
  width: 9px; height: 9px; border-radius: 50%;
  background: radial-gradient(circle, rgba(224, 199, 126, .85), rgba(224, 199, 126, 0) 70%);
}
/* Épingle dorée (teardrop) : coin pointu en bas, coeur clair */
.vdf-dept .vdf-carte3d__pin {
  display: block; width: 20px; height: 20px; border-radius: 50% 50% 50% 0;
  background: var(--vdf-or); border: 2px solid var(--vdf-blanc-casse); transform: rotate(45deg);
  box-shadow: 0 0 0 2px rgba(11, 17, 32, .55), 0 5px 12px rgba(0, 0, 0, .5), 0 0 14px 2px rgba(224, 199, 126, .4);
  transition: transform .2s ease, box-shadow .2s ease, background .2s ease;
}
.vdf-dept .vdf-carte3d__pin::after {
  content: ""; position: absolute; inset: 0; margin: auto; width: 7px; height: 7px;
  border-radius: 50%; background: var(--vdf-blanc-casse);
}
.vdf-dept .vdf-carte3d__marker:hover,
.vdf-dept .vdf-carte3d__marker:focus-visible,
.vdf-dept .vdf-carte3d__marker.is-active,
.vdf-dept .vdf-carte3d__marker.is-selected { z-index: 8; }
.vdf-dept .vdf-carte3d__marker:hover .vdf-carte3d__pin,
.vdf-dept .vdf-carte3d__marker:focus-visible .vdf-carte3d__pin,
.vdf-dept .vdf-carte3d__marker.is-active .vdf-carte3d__pin,
.vdf-dept .vdf-carte3d__marker.is-selected .vdf-carte3d__pin {
  background: var(--vdf-or-clair); transform: rotate(45deg) scale(1.2);
  box-shadow: 0 0 0 2px rgba(11, 17, 32, .7), 0 6px 16px rgba(0, 0, 0, .6), 0 0 22px 5px rgba(224, 199, 126, .85);
}
.vdf-dept .vdf-carte3d__marker:focus-visible { outline: none; }
.vdf-dept .vdf-carte3d__marker:focus-visible .vdf-carte3d__pin {
  box-shadow: 0 0 0 2px var(--vdf-or-clair), 0 0 0 5px rgba(11, 17, 32, .85), 0 0 0 8px var(--vdf-blanc-casse), 0 0 22px 6px rgba(224, 199, 126, .9);
}

/* Cartouche du nom (au survol / focus / sélection) facon hero */
.vdf-dept .vdf-carte3d__tip {
  position: absolute; left: 50%; bottom: calc(100% + 9px); transform: translate(-50%, 4px);
  padding: .32rem .6rem; background: rgba(17, 24, 38, .94); border: 1px solid var(--vdf-or); border-radius: 7px;
  font-family: var(--vdf-font-titre); font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
  font-size: .66rem; line-height: 1.2; color: var(--vdf-or-clair);
  white-space: normal; width: max-content; max-width: min(15rem, 60vw); text-align: center;
  box-shadow: 0 10px 24px rgba(0, 0, 0, .5);
  opacity: 0; pointer-events: none; transition: opacity .2s ease, transform .2s ease; z-index: 6;
}
.vdf-dept .vdf-carte3d__tip::after {
  content: ""; position: absolute; left: 50%; top: 100%; transform: translateX(-50%);
  border: 6px solid transparent; border-top-color: var(--vdf-or);
}
.vdf-dept .vdf-carte3d__marker:hover .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker:focus-visible .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.is-active .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.is-selected .vdf-carte3d__tip { opacity: 1; transform: translate(-50%, 0); }

/* Marqueurs VILLAGES = teal (les lieux secrets restent or par défaut). Override pin/halo/cartouche. */
/* Villages = pastille RONDE (vs goutte pointue des lieux secrets) : repère NON coloré,
   donc distinction conservée pour les daltoniens (teal/or sont quasi iso-lumineux). */
.vdf-dept .vdf-carte3d__marker--village .vdf-carte3d__pin { background: var(--vdf-teal); border-radius: 50%; }
/* Petite icône village au centre de la pastille teal (sobre) : remplace le point blanc central. */
.vdf-dept .vdf-carte3d__marker--village .vdf-carte3d__pin::after { display: none; }
.vdf-dept .vdf-carte3d__pin-ic {
  position: absolute; left: 50%; top: 0; width: 20px; height: 20px; transform: translateX(-50%);
  display: flex; align-items: center; justify-content: center; color: var(--vdf-bleu-nuit); pointer-events: none; z-index: 1;
  transition: transform .2s ease;
}
.vdf-dept .vdf-carte3d__pin-svg { width: 12px; height: 12px; }
/* Au survol/actif la pastille grossit (scale 1.2) : l'icône (frère) suit pour rester centrée et proportionnée. */
.vdf-dept .vdf-carte3d__marker--village:hover .vdf-carte3d__pin-ic,
.vdf-dept .vdf-carte3d__marker--village:focus-visible .vdf-carte3d__pin-ic,
.vdf-dept .vdf-carte3d__marker--village.is-active .vdf-carte3d__pin-ic,
.vdf-dept .vdf-carte3d__marker--village.is-selected .vdf-carte3d__pin-ic { transform: translateX(-50%) scale(1.2); }
.vdf-dept .vdf-carte3d__marker--village::after { background: radial-gradient(circle, rgba(94, 234, 212, .85), rgba(94, 234, 212, 0) 70%); }
.vdf-dept .vdf-carte3d__marker--village:hover .vdf-carte3d__pin,
.vdf-dept .vdf-carte3d__marker--village:focus-visible .vdf-carte3d__pin,
.vdf-dept .vdf-carte3d__marker--village.is-active .vdf-carte3d__pin,
.vdf-dept .vdf-carte3d__marker--village.is-selected .vdf-carte3d__pin {
  background: var(--vdf-teal-clair);
  box-shadow: 0 0 0 2px rgba(11, 17, 32, .7), 0 6px 16px rgba(0, 0, 0, .6), 0 0 22px 5px rgba(94, 234, 212, .85);
}
.vdf-dept .vdf-carte3d__marker--village:focus-visible .vdf-carte3d__pin {
  box-shadow: 0 0 0 2px var(--vdf-teal-clair), 0 0 0 5px rgba(11, 17, 32, .85), 0 0 0 8px var(--vdf-blanc-casse), 0 0 22px 6px rgba(94, 234, 212, .9);
}
.vdf-dept .vdf-carte3d__marker--village .vdf-carte3d__tip { border-color: var(--vdf-teal); color: #bdf3e9; }
.vdf-dept .vdf-carte3d__marker--village .vdf-carte3d__tip::after { border-top-color: var(--vdf-teal); }
/* Repère GÉNÉRÉ près d'un bord (signal 250) : le cartouche s'ancre du côté intérieur, pointe
   sur le repère. APRÈS les règles d'état du cartouche (translate -50 %) et plus spécifique
   qu'elles (0,5,0) : à égalité, la règle de base placée plus bas l'emportait (revue du 250). */
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-g .vdf-carte3d__tip { left: calc(50% - 18px); transform: translate(0, 4px); }
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-d .vdf-carte3d__tip { left: auto; right: calc(50% - 18px); transform: translate(0, 4px); }
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-g .vdf-carte3d__tip::after { left: 18px; }
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-d .vdf-carte3d__tip::after { left: auto; right: 18px; transform: translateX(50%); }
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-g:hover .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-g:focus-visible .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-g.is-active .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-g.is-selected .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-d:hover .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-d:focus-visible .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-d.is-active .vdf-carte3d__tip,
.vdf-dept .vdf-carte3d__marker.vdf-carte3d__marker--bord-d.is-selected .vdf-carte3d__tip { transform: translate(0, 0); }

@media (prefers-reduced-motion: reduce) {
  .vdf-dept .vdf-carte3d__marker { animation: none; opacity: 1; }
}

/* ============================================================================
   TRIO ÉDITORIAL (retour client) : "Le saviez-vous ?" + citation + CTA sur UNE rangée
   de 3 colonnes. Grid auto-fit : un bloc vide n'est pas émis -> 3/2/1 colonnes égales,
   sans trou. Cartes alignées (head/corps/pied), cartouches sombres + filet doré.
   ========================================================================== */
.vdf-dept .vdf-trio__grid { display: grid; gap: var(--vdf-space-md); grid-template-columns: minmax(0, 1fr); }
@media (min-width: 861px) {
  .vdf-dept .vdf-trio__grid { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); }
}
/* Une seule colonne rendue : on évite l'étirement pleine largeur */
.vdf-dept .vdf-trio__grid > :only-child { max-width: 60ch; justify-self: center; }

.vdf-dept .vdf-trio__card {
  display: grid; grid-template-rows: auto 1fr auto; gap: 1rem; position: relative;
  padding: clamp(1.4rem, 2.2vw, 2rem);
  background: var(--vdf-fond-carte); border: 1px solid rgba(201, 168, 76, .18); border-radius: var(--vdf-radius);
  color: var(--vdf-blanc-casse); text-decoration: none;
  transition: border-color .25s ease, transform .25s ease, box-shadow .25s ease;
}
/* Filet doré subtil en haut de chaque cartouche */
.vdf-dept .vdf-trio__card::before {
  content: ""; position: absolute; left: clamp(1.4rem, 2.2vw, 2rem); right: clamp(1.4rem, 2.2vw, 2rem); top: 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(201, 168, 76, .6), transparent);
}
/* Alignement fin titres/corps/pieds entre cartes hétérogènes (si subgrid dispo) */
@supports (grid-template-rows: subgrid) {
  @media (min-width: 861px) {
    .vdf-dept .vdf-trio__grid { grid-auto-rows: auto; }
    .vdf-dept .vdf-trio__card:not(:only-child) { grid-row: span 3; grid-template-rows: subgrid; }
  }
}
.vdf-dept .vdf-trio__head { display: flex; flex-direction: column; }
.vdf-dept .vdf-trio__titre {
  font-family: var(--vdf-font-titre); font-weight: 700; color: var(--vdf-or-clair);
  font-size: clamp(1.1rem, 1.6vw, 1.4rem); letter-spacing: .04em; line-height: 1.25; margin: 0; text-wrap: balance;
}
.vdf-dept .vdf-trio__corps { line-height: 1.65; color: rgba(245, 240, 232, .85); }
/* 29/09, signal 237 : carte d'appel sans sous-titre (pas de corps rendu). Seule : deux rangees, la fleche
   reste en bas sans ecart en plus. A cote d'autres cartes (sous-grille) : la fleche reste sur la 3e rangee. */
.vdf-dept .vdf-trio__card--sans-corps { grid-template-rows: auto 1fr; }
@supports (grid-template-rows: subgrid) {
  @media (min-width: 861px) {
    .vdf-dept .vdf-trio__card--sans-corps:not(:only-child) .vdf-trio__pied { grid-row: 3; }
  }
}
.vdf-dept .vdf-trio__corps > * { margin: 0; }
.vdf-dept .vdf-trio__corps > * + * { margin-top: .8em; }
.vdf-dept .vdf-trio__intro { font-style: italic; color: rgba(245, 240, 232, .75); }
.vdf-dept .vdf-trio__quote {
  font-family: var(--vdf-font-soustitre); font-style: italic; font-size: 1.1rem; line-height: 1.5;
  color: var(--vdf-blanc-casse); border-left: 2px solid var(--vdf-or); padding-left: 1rem; margin: 0;
}
.vdf-dept .vdf-trio__pied { display: flex; align-items: flex-end; min-height: 1.5rem; }
.vdf-dept .vdf-trio__cite { font-style: normal; font-size: .8rem; letter-spacing: .14em; text-transform: uppercase; color: var(--vdf-or); }
.vdf-dept .vdf-trio__cite::before { content: "\25C6\00a0\00a0"; font-size: .75em; } /* petit diamant (template) */

/* Saviez-vous : texte + médaillon rond à droite (template). Placeholder sombre si pas d'image. */
.vdf-dept .vdf-trio__corps--media { display: flex; align-items: center; gap: 1.1rem; }
.vdf-dept .vdf-trio__corps--media > * + * { margin-top: 0; } /* neutralise la règle d'espacement vertical (flex row : le gap suffit) */
.vdf-dept .vdf-trio__texte { flex: 1 1 auto; min-width: 0; }
.vdf-dept .vdf-trio__texte > * { margin: 0; }
.vdf-dept .vdf-trio__texte > * + * { margin-top: .8em; }
.vdf-dept .vdf-trio__rond {
  flex: none; width: 92px; height: 92px; border-radius: 50%; overflow: hidden;
  border: 1px solid rgba(201, 168, 76, .45);
  background: radial-gradient(circle at 38% 32%, rgba(201, 168, 76, .16), transparent 60%), linear-gradient(160deg, #1d2b4a 0%, #0e1626 100%);
}
.vdf-dept .vdf-trio__rond-img { width: 100%; height: 100%; object-fit: cover; display: block; }
@media (max-width: 480px) { .vdf-dept .vdf-trio__rond { width: 72px; height: 72px; } }

/* Colonne CTA : lien bloc, kicker + titre + sous-texte + grande flèche ronde */
.vdf-dept .vdf-trio__card--cta { background: linear-gradient(160deg, #16223c 0%, #0f1830 100%); }
.vdf-dept a.vdf-trio__card--cta:hover,
.vdf-dept a.vdf-trio__card--cta:focus-visible { border-color: var(--vdf-or); transform: translateY(-4px); box-shadow: 0 16px 36px rgba(0, 0, 0, .45); }
.vdf-dept a.vdf-trio__card--cta:focus-visible { outline: 2px solid var(--vdf-or-clair); outline-offset: 3px; }
.vdf-dept .vdf-trio__kicker { display: block; font-family: var(--vdf-font-corps); text-transform: uppercase; letter-spacing: .28em; font-size: .7rem; color: var(--vdf-or); margin-bottom: .5rem; }
.vdf-dept .vdf-trio__sub { color: rgba(245, 240, 232, .8); font-style: italic; } /* sous-texte CTA en italique (template) */
.vdf-dept .vdf-trio__arrow {
  width: clamp(48px, 4vw, 64px); height: clamp(48px, 4vw, 64px); border-radius: 50%;
  border: 1.5px solid var(--vdf-or); display: inline-flex; align-items: center; justify-content: center;
  color: var(--vdf-or); background: rgba(201, 168, 76, .06);
  transition: background .25s ease, color .25s ease, transform .25s ease;
}
.vdf-dept .vdf-trio__arrow svg { width: 44%; height: 44%; }
.vdf-dept a.vdf-trio__card--cta:hover .vdf-trio__arrow,
.vdf-dept a.vdf-trio__card--cta:focus-visible .vdf-trio__arrow { background: var(--vdf-or); color: var(--vdf-noir); transform: translateX(4px); }

@media (prefers-reduced-motion: reduce) {
  .vdf-dept .vdf-trio__card, .vdf-dept .vdf-trio__arrow { transition: none; }
  .vdf-dept a.vdf-trio__card--cta:hover { transform: none; }
}

/* ============================================================================
   SECTIONS TEMPLATE (1. villages / 2. secrets / 3. carte) : en-tête commun (titre + sous-titre à
   gauche, lien "Voir tous…" à droite) + grille de cartes. Charte sombre/dorée.
   ========================================================================== */
/* En-tête de section : titre/sous-titre à gauche, lien à droite ; aligné sur le conteneur. */
.vdf-dept .vdf-secteur__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1rem 1.5rem; flex-wrap: wrap; margin-bottom: var(--vdf-space-md); }
.vdf-dept .vdf-secteur__head-txt { min-width: 0; }
.vdf-dept .vdf-secteur .vdf-h2 { margin: 0; }
.vdf-dept .vdf-secteur__sous { color: rgba(245, 240, 232, .82); margin: .6rem 0 0; line-height: 1.6; font-size: 1.02rem; }
.vdf-dept .vdf-secteur__lien {
  flex: none; align-self: center; font-family: var(--vdf-font-corps); font-size: .82rem; letter-spacing: .04em;
  color: var(--vdf-or-clair); text-decoration: none; white-space: nowrap; border-bottom: 1px solid rgba(201, 168, 76, .4); padding-bottom: 2px;
  transition: color .2s ease, border-color .2s ease;
}
.vdf-dept .vdf-secteur__lien::after { content: " \2192"; }
.vdf-dept .vdf-secteur__lien:hover { color: var(--vdf-or-clair); border-color: var(--vdf-or-clair); }
.vdf-dept .vdf-secteur__lien:focus-visible { outline: 2px solid var(--vdf-or-clair); outline-offset: 3px; }
/* Le titre H2 de section : filet doré déjà géré ailleurs ; ici on garde l'alignement à gauche. */
.vdf-dept .vdf-secteur .vdf-h2::after { margin-inline: 0; }
@media (max-width: 640px) {
  .vdf-dept .vdf-secteur__head { align-items: flex-start; }
  .vdf-dept .vdf-secteur__lien { align-self: flex-start; }
}

/* Sections de cartes ÉLARGIES (retour client call post-V1, variante A validée) : marges latérales
   réduites (32 -> 20px), conteneur déplafonné (1200px -> largeur fenêtre), gap fin (16px, 32 en
   tablette -> 3px) -> tout l'espace récupéré va aux PHOTOS (cartes 185 -> 202px @1280, 247 -> 266px
   @850). Périmètre : les 3 sections de cartes des pages département UNIQUEMENT (l'accueil/--acces et
   la barre de stats gardent leurs marges). Spécificité (0,3,0) : bat le padding de base
   .vdf-dept .vdf-section (0,2,0) et le gap tablette du media query 900px. */
/* `--adresses` ajoutee le 08/09/2026 (lot 2 du chantier village) : la section « Saveurs et
   bonnes adresses » de la fiche village est la QUATRIEME famille de cartes du site, et elle
   doit heriter des memes marges, du meme conteneur et de la meme gouttiere que les trois
   autres. L'oublier ici aurait reproduit exactement l'ecart de 40 px que le 146 vient de
   supprimer sur le Premium. */
.vdf-dept .vdf-section.vdf-secteur--villages,
.vdf-dept .vdf-section.vdf-secteur--secrets,
.vdf-dept .vdf-section.vdf-secteur--adresses,
.vdf-dept .vdf-section.vdf-secteur--experiences { padding-left: 20px; padding-right: 20px; }
.vdf-dept .vdf-secteur--villages .vdf-container,
.vdf-dept .vdf-secteur--secrets .vdf-container,
.vdf-dept .vdf-secteur--adresses .vdf-container,
.vdf-dept .vdf-secteur--experiences .vdf-container { max-width: none; }
.vdf-dept .vdf-secteur--villages .vdf-villages-grid,
.vdf-dept .vdf-secteur--secrets .vdf-villages-grid,
.vdf-dept .vdf-secteur--adresses .vdf-villages-grid,
.vdf-dept .vdf-secteur--experiences .vdf-villages-grid { gap: 3px; }
/* NE PAS REPLAFONNER CES SECTIONS. Le brief 27 (16/10/2026, « secteurs aligner », DES-15) les
   avait ramenées au conteneur de 1200 px à partir de 1024 px : cartes et photos réduites (carte
   de 231 -> 198 px de large à 1440 px, de 311 -> 198 à 1920), bandes du fond de page de part et
   d'autre de la rangée. Le client a demandé le 16/10 le retour aux dimensions d'origine, celles
   de la variante A validée ci-dessus (brief 29). */

/* Grille de cartes (villages ET secrets) : 6 sur UNE rangée (desktop), pleine largeur du conteneur.
   Gap réduit pour laisser respirer 6 colonnes. Responsive : 3 (tablette) -> 2 -> 1. */
.vdf-dept .vdf-villages-grid {
  list-style: none; margin: 0; padding: 0;
  /* colonnes = nombre réel de cartes (--vdf-grid-count, injecté au rendu, défaut 6) : une section à 5 ou
     4 cartes (cardinalité variable selon département) remplit la largeur sans colonne vide à droite.
     Défaut 6 -> 13 / 06 / Paris (6 cartes) inchangés. */
  display: grid; grid-template-columns: repeat(var(--vdf-grid-count, 6), minmax(0, 1fr)); gap: var(--vdf-space-sm);
  align-items: stretch; /* cartes de même hauteur */
  /* minmax(0,1fr) (et NON 1fr) : colonnes VRAIMENT égales, qui rétrécissent pour tenir dans le
     conteneur (1fr planche sur le min-content -> colonnes inégales + débordement avec les noms longs). */
}
@media (max-width: 900px) { .vdf-dept .vdf-villages-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--vdf-space-md); } }
/* SOUS 600 px, LE NOMBRE DE COLONNES DEPEND DU NOMBRE DE CARTES — 08/09/2026.
   Deux colonnes laissent un ORPHELIN des que la famille est en nombre impair : cinq cartes
   rendent 2+2+1, mesure sur Baccarat a 390 px (rapport 141-3). C'est le meme defaut que le
   4+2 que la regle du 105 proscrit, et le meme remede que la bande des cinq univers, qui
   passe deja a une colonne sous 700.
   La valeur est calculee UNE SEULE FOIS, en PHP, par `vdf_grid_vars()` (inc/card-image.php)
   et posee en variable sur la grille : le CSS ne sait pas compter, et cinq emetteurs
   partageaient le meme calcul en ligne. Repli sur 2 si la variable manque — aucune grille
   ne regresse si un emetteur oubliait de la poser. */
@media (max-width: 600px) { .vdf-dept .vdf-villages-grid { grid-template-columns: repeat(var(--vdf-grid-sm, 2), minmax(0, 1fr)); } }
@media (max-width: 380px) { .vdf-dept .vdf-villages-grid { grid-template-columns: minmax(0, 1fr); } }

/* Carte village (compacte) : image + nom Cinzel + courte description */
.vdf-dept .vdf-vcard { display: flex; } /* l'inner remplit la cellule -> hauteurs égales */
.vdf-dept .vdf-vcard__inner {
  position: relative; /* ancre les éléments de la zone basse commune (flèche villages / Découvrir secrets) */
  display: block; width: 100%; height: 100%; text-align: left; text-decoration: none; color: inherit;
  font: inherit; cursor: pointer; -webkit-appearance: none; appearance: none; padding: 0;
  white-space: normal; /* les cartes <button> (villages) héritaient d'un nowrap du reset parent -> textes coupés à 1 ligne (les <a> secrets wrappaient, d'où l'inégalité d'origine) */
  background: var(--vdf-fond-carte); border: 1px solid rgba(201, 168, 76, .10); border-radius: var(--vdf-radius);
  overflow: hidden; transition: border-color .25s ease, transform .25s ease, box-shadow .25s ease;
  /* Contour au repos AFFINÉ (retour client : cartes villages/secrets trop épaisses) : opacité de bordure
     réduite .16 -> .10 (1px = épaisseur mini ; on joue sur le contraste) pour un rendu plus fin/élégant.
     Composant partagé -> villages, secrets, expériences, accès cohérents. Hover/focus/selected inchangés. */
}
.vdf-dept .vdf-vcard__inner.is-no-marker { cursor: default; }
/* background réaffirmé sur hover/active/selected : neutralise un fond "button:hover" hérité du
   thème parent (le carrousel rend des <button>, qui héritaient d'un rose #cc3366). */
.vdf-dept .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover,
.vdf-dept .vdf-vcard__inner:not(.vdf-vcard__inner--attente):active,
.vdf-dept .vdf-vcard__inner:focus-visible,
.vdf-dept .vdf-vcard__inner.is-active,
.vdf-dept .vdf-vcard__inner.is-selected { background: var(--vdf-fond-carte); } /* signal 237 : pas sur une carte inerte (sur fond creme Premium, le survol la passait au bleu nuit) */
/* Élévation GÉNÉRIQUE (villages + secrets) au survol / actif / sélectionné. */
.vdf-dept .vdf-vcard__inner:not(.is-no-marker):not(.vdf-vcard__inner--attente):hover,
.vdf-dept .vdf-vcard__inner.is-active,
.vdf-dept .vdf-vcard__inner.is-selected { transform: translateY(-4px); box-shadow: 0 16px 36px rgba(0, 0, 0, .45); }
/* Focus par défaut doré ; couleur d'accent spécialisée plus bas (villages = teal, secrets = or). */
.vdf-dept .vdf-vcard__inner:focus-visible { outline: 2px solid var(--vdf-or-clair); outline-offset: 3px; border-color: var(--vdf-or); }
/* Couleur TEAL réservée aux cartes VILLAGES (reliées aux marqueurs teal) — scopée sur --village
   pour ne PAS dépendre de l'ordre des règles (les secrets gardent l'OR). */
.vdf-dept .vdf-vcard__inner--village:not(.is-no-marker):not(.vdf-vcard__inner--attente):hover,
.vdf-dept .vdf-vcard__inner--village.is-active,
.vdf-dept .vdf-vcard__inner--village.is-selected { border-color: var(--vdf-teal); }
.vdf-dept .vdf-vcard__inner--village.is-selected { box-shadow: 0 16px 36px rgba(0, 0, 0, .45), 0 0 0 1px var(--vdf-teal); }
.vdf-dept .vdf-vcard__inner--village:focus-visible { outline-color: var(--vdf-teal-clair); border-color: var(--vdf-teal); }
.vdf-dept .vdf-vcard__media { position: relative; aspect-ratio: 4 / 3; overflow: hidden; background: linear-gradient(160deg, #1d2b4a 0%, #0e1626 100%); }
/* COLLECTION (retour client 13) : photos des cartes ALLONGÉES en portrait 4/5 (villages / secrets /
   expériences uniquement). Scopé --collection (le Collector/Paris reste en 4/3). Même srcset + lazy :
   la box est simplement plus haute, object-fit:cover recadre sans déformer, et le 800w reste servi au
   retina (net). La grille 6 col + minmax(0,1fr) + min-height du corps sont inchangés -> hauteurs
   toujours uniformes dans chaque grille. */
/* Cartes des sections villages / secrets / expériences (Collection ET Collector) + cartes d'accès de
   l'accueil : zone-image en PORTRAIT 2/3 (retour client : photos encore plus hautes, 6 colonnes
   conservées). aspect-ratio FIXE sur TOUTES les .vdf-vcard__media de ces sections -> hauteur d'image
   identique quelle que soit la carte (6e incluse) et indépendante du texte ; object-fit:cover recadre
   sans déformer. Vignettes vdf-card-1200 servies au ratio 2/3 (cf. inc/card-image.php) -> nettes. */
.vdf-secteur--villages .vdf-vcard__media,
.vdf-secteur--secrets .vdf-vcard__media,
.vdf-secteur--adresses .vdf-vcard__media,
.vdf-secteur--experiences .vdf-vcard__media,
.vdf-secteur--acces .vdf-vcard__media { aspect-ratio: 2 / 3; }
/* EN COLONNE UNIQUE SOUS 600 px, LE MEDIA PASSE EN PAYSAGE — 08/09/2026.
   Le 150 a supprime l'orphelin des familles impaires en les passant a une colonne ; la
   carte occupe alors toute la largeur et un media en 2/3 y fait 522 px de haut a 390 px.
   Mesure : la section experiences de Baccarat passait de 1 368 a 3 470 px. En 3/2 elle
   redescend, sans rien changer aux familles de six, qui gardent leurs deux colonnes.
   LE 3/2 EXISTE DEJA sur le site (en-tete, et la photo de la racine en 1086/724, qui vaut
   exactement 3/2) : aucun format nouveau n'est introduit.
   LA VALEUR VIENT DE LA GRILLE, pas d'une regle recopiee : `vdf_grid_media_sm()` la pose
   en variable a cote du nombre de colonnes, donc les deux ne peuvent pas diverger. Repli
   sur 2/3 si la variable manque -> une grille qui ne la pose pas ne change pas.
   SPECIFICITE : (0,3,0), au-dessus des (0,2,0) ci-dessus — la lecon du 141-2, ou
   `.vdf-dept .vdf-h2` battait `.vdf-village h2` sans qu'on l'ait vu venir.
   Le recadrage reste centre (object-fit: cover, object-position par defaut) et le credit
   est hors du media, dans le flux du corps : il ne bouge pas. */
@media (max-width: 600px) {
  .vdf-dept .vdf-villages-grid .vdf-vcard__media { aspect-ratio: var(--vdf-grid-media-sm, 2 / 3); }
}
.vdf-dept .vdf-vcard__img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .5s ease; }
.vdf-dept .vdf-vcard__inner:not(.is-no-marker):not(.vdf-vcard__inner--attente):hover .vdf-vcard__img,
.vdf-dept .vdf-vcard__inner.is-active .vdf-vcard__img { transform: scale(1.06); }
.vdf-dept .vdf-vcard__ph { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: radial-gradient(circle at 50% 40%, rgba(201, 168, 76, .12), transparent 60%); }
.vdf-dept .vdf-vcard__ph .vdf-icone-svg { width: 42px; height: 42px; color: var(--vdf-or); opacity: .55; }
/* Corps UNIFORME (villages = secrets = expériences, demande client) : mêmes paddings, même zone
   basse réservée (2.3rem : la flèche des villages et le lien Découvrir des secrets s'y inscrivent),
   même hauteur mini (calée sur la carte la plus haute au rendu -> les 3 grilles sont identiques). */
/* Le bas du corps réserve la place de la flèche ronde (.vdf-vcard__go : 0,6rem du bord + 26 px)
   plus 0,3rem d'air. Avec 1,9rem, la dernière ligne d'un crédit long passait sous la flèche
   d'environ 5 px (signal 247, constaté au téléphone sur Argentat ; corrigé au signal 256). */
.vdf-dept .vdf-vcard__body { padding: .5rem .65rem calc(.6rem + 26px + .3rem); min-height: var(--vdf-vcard-body-min, 0px); }
/* Cartes SANS action (expériences, villages non reliés) : pas de flèche ni de lien dans la zone
   basse -> le contenu se CENTRE verticalement (box-sizing border-box : la hauteur totale reste
   pilotée par min-height, l'égalité des 3 grilles est préservée). */
/* Carte sans zone image (F15, audit du 16/10) : le plancher du corps sert à aligner les corps sous des
   photos de même hauteur ; sans photo, il ne laissait qu'un vide sous le texte (186 px pour 69 de texte
   sur une fiche Premium à 390 px). La rangée garde des cartes de même hauteur par la grille. */
.vdf-dept .vdf-vcard--sans-media .vdf-vcard__body { min-height: 0; }
.vdf-dept .vdf-vcard__inner.is-no-marker .vdf-vcard__body { display: flex; flex-direction: column; justify-content: center; padding-block: .7rem; }
/* Cartes VILLAGES : kicker "VILLAGE" + flèche cerclée bas-droite (template) */
.vdf-dept .vdf-vcard__kicker { display: block; font-family: var(--vdf-font-corps); font-weight: 600; text-transform: uppercase; letter-spacing: .2em; font-size: .55rem; color: var(--vdf-or-clair); margin-bottom: .12rem; }
.vdf-dept .vdf-vcard__go {
  position: absolute; right: .6rem; bottom: .6rem; width: 26px; height: 26px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid rgba(201, 168, 76, .5); color: var(--vdf-or); background: rgba(201, 168, 76, .06);
  transition: background .2s ease, color .2s ease;
}
.vdf-dept .vdf-vcard__go svg { width: 13px; height: 13px; }
.vdf-dept .vdf-vcard__inner--village:not(.is-no-marker):hover .vdf-vcard__go,
.vdf-dept .vdf-vcard__inner--village.is-active .vdf-vcard__go { background: var(--vdf-or); color: var(--vdf-noir); }
/* Expériences : cartes désormais cliquables (placeholder #) -> même flèche cerclée que les villages +
   parité de survol/focus (bordure or comme les secrets, flèche remplie or), pour un comportement
   homogène avec les autres cartes. Le curseur, l'élévation et le zoom d'image sont déjà génériques. */
.vdf-dept .vdf-vcard--exp .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover,
.vdf-dept .vdf-vcard--exp .vdf-vcard__inner:focus-visible { border-color: var(--vdf-or); }
.vdf-dept .vdf-vcard--exp .vdf-vcard__inner:hover .vdf-vcard__go,
.vdf-dept .vdf-vcard--exp .vdf-vcard__inner:focus-visible .vdf-vcard__go { background: var(--vdf-or); color: var(--vdf-noir); }
.vdf-dept .vdf-vcard__nom {
  font-family: var(--vdf-font-titre); font-weight: 700; font-size: .95rem; letter-spacing: .02em; line-height: 1.18; color: var(--vdf-blanc-casse); margin: 0 0 .18rem; overflow-wrap: break-word; hyphens: manual; /* pas de césure automatique dans les intitulés en capitales (« CLO-CHER-GUIDE », brief 22, F28) */
  /* clamp 2 lignes : borne la hauteur du corps (l'égalité des 3 grilles devient STRUCTURELLE,
     un nom très long d'un futur département ne peut plus désaligner les sections) */
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;
}
.vdf-dept .vdf-vcard__inner--village:not(.is-no-marker):not(.vdf-vcard__inner--attente):hover .vdf-vcard__nom,
.vdf-dept .vdf-vcard__inner--village.is-active .vdf-vcard__nom { color: var(--vdf-teal-clair); }
/* description tronquée (3 lignes) : cartes étroites tidy + hauteurs régulières */
.vdf-dept .vdf-vcard__desc {
  font-size: .74rem; color: rgba(245, 240, 232, .72); margin: 0; line-height: 1.4;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;
}
@media (prefers-reduced-motion: reduce) {
  .vdf-dept .vdf-vcard__inner:hover { transform: none; }
  .vdf-dept .vdf-vcard__inner:hover .vdf-vcard__img { transform: none; }
}

/* ----- Cartes SECRETS (section 2) : même facture que les villages + cadenas + lien "Découvrir" ----- */
/* Icône cadenas posée sur l'image (haut droite), dorée, discrète -> évoque le contenu à découvrir. */
.vdf-dept .vdf-vcard__lock {
  position: absolute; top: .6rem; right: .6rem; z-index: 2; display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; border-radius: 50%;
  background: rgba(11, 16, 28, .62); border: 1px solid rgba(201, 168, 76, .55); color: var(--vdf-or);
  -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px);
}
.vdf-dept .vdf-vcard__lock .vdf-icone-svg { width: 16px; height: 16px; }
.vdf-dept a.vdf-vcard__inner:hover .vdf-vcard__lock,
.vdf-dept a.vdf-vcard__inner:focus-visible .vdf-vcard__lock { color: var(--vdf-or-clair); border-color: var(--vdf-or-clair); }
/* Lien "Découvrir" (flèche) en bas de carte */
.vdf-dept .vdf-vcard__more {
  position: absolute; left: .8rem; bottom: .7rem; margin: 0; /* ancré dans la zone basse commune (uniformisation) */
  display: inline-flex; align-items: center; gap: .35rem;
  font-family: var(--vdf-font-corps); font-weight: 600; text-transform: uppercase; letter-spacing: .1em;
  font-size: .68rem; color: var(--vdf-or-clair); transition: gap .2s ease, color .2s ease;
}
.vdf-dept .vdf-vcard__more svg { width: 15px; height: 15px; }
.vdf-dept a.vdf-vcard__inner:hover .vdf-vcard__more,
.vdf-dept a.vdf-vcard__inner:focus-visible .vdf-vcard__more { color: var(--vdf-or-clair); gap: .55rem; }
/* Carte secret : le survol vire à l'OR (pas au teal, réservé aux villages reliés à la carte). */
.vdf-dept .vdf-vcard--secret .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover,
.vdf-dept .vdf-vcard--secret .vdf-vcard__inner:focus-visible { border-color: var(--vdf-or); }
.vdf-dept .vdf-vcard--secret .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover .vdf-vcard__nom,
.vdf-dept .vdf-vcard--secret .vdf-vcard__inner:focus-visible .vdf-vcard__nom { color: var(--vdf-or-clair); }
.vdf-dept .vdf-vcard--secret .vdf-vcard__inner:focus-visible { outline-color: var(--vdf-or-clair); }

/* ===== Sections template RESSERRÉES (villages / secrets / carte / expériences) : moins de hauteur
   verticale pour rapprocher la carte des sections du dessus (densité template). Appended en fin de
   fichier -> gagne sur le padding de section par défaut (spécificité égale, ordre plus tardif). ===== */
.vdf-dept--collector .vdf-secteur { padding-top: 2.4rem; padding-bottom: 2.4rem; }
.vdf-dept--collector .vdf-secteur .vdf-secteur__head { margin-bottom: var(--vdf-space-sm); }
@media (max-width: 900px) { .vdf-dept--collector .vdf-secteur { padding-top: 2rem; padding-bottom: 2rem; } }
@media (max-width: 600px) { .vdf-dept--collector .vdf-secteur { padding-top: 1.5rem; padding-bottom: 1.5rem; } }


/* ============================================================================
   PAGE D'ACCUEIL (front page) : hero plein écran centré + section carte + accès.
   Réutilise le design system (.vdf-dept--collector) ; overrides ciblés ici.
   ========================================================================== */
.vdf-dept--collector .vdf-hero--accueil {
  display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center;
  grid-template-columns: none; padding: calc(var(--vdf-header-h, 88px) + 2rem) 1.25rem 4rem;
  min-height: 100vh; min-height: 100svh;
}
/* média : couvre tout le hero (pas le cadrage département) */
.vdf-dept--collector .vdf-hero--accueil .vdf-hero__media {
  /* L'accueil a sa propre boîte, pleine et sans recadrage relatif : on neutralise
     explicitement le ratio hérité plutôt que de compter sur le fait que width et
     height définies le rendent inopérant. */
  aspect-ratio: auto; min-height: 0;
  position: absolute; inset: 0; top: 0; left: 0; transform: none; width: 100%; height: 100%;
}
.vdf-dept--collector .vdf-hero--accueil::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(180deg, rgba(11,16,28,.72) 0%, rgba(11,16,28,.55) 45%, rgba(11,16,28,.78) 100%);
}
.vdf-accueil-hero__inner { position: relative; z-index: 2; max-width: 1080px; display: flex; flex-direction: column; align-items: center; }
/* TITRE dominant sur 2 lignes : ligne 1 blanche, ligne 2 or (dégradé), Cinzel, capitales (template). */
.vdf-accueil-hero__titre {
  font-family: var(--vdf-font-titre); font-weight: 700; text-transform: uppercase;
  font-size: clamp(2.6rem, 8vw, 5.6rem); line-height: .98; letter-spacing: .05em; margin: 0;
  display: flex; flex-direction: column;
}
.vdf-accueil-hero__titre-l1 { color: var(--vdf-blanc-casse); text-shadow: 0 3px 24px rgba(0,0,0,.55); }
.vdf-accueil-hero__titre-l2 {
  /* dégradé doré (template) : clip sur le texte. Fallback couleur or pour les navigateurs sans clip. */
  color: var(--vdf-or);
  background: linear-gradient(180deg, var(--vdf-or-clair) 0%, var(--vdf-or) 52%, var(--vdf-or-fonce) 100%);
  -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
  filter: drop-shadow(0 3px 18px rgba(0,0,0,.5));
}
/* SÉPARATEUR : filet doré + fleur de lys centrée. */
.vdf-accueil-hero__filet {
  display: flex; align-items: center; justify-content: center; gap: clamp(.8rem, 2vw, 1.3rem);
  width: min(440px, 82%); margin: clamp(1.1rem, 3vh, 1.9rem) auto; color: var(--vdf-or);
}
.vdf-accueil-hero__filet-trait { flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--vdf-or)); }
.vdf-accueil-hero__filet-trait:last-child { background: linear-gradient(90deg, var(--vdf-or), transparent); }
/* Lys héraldique (tracé détaillé, viewBox ~carrée) : un poil plus grand que le tracé maison pour rester
   lisible à petite taille, ornement centré dans le filet. Fill = dégradé or (défini dans le SVG). */
.vdf-accueil-hero__lys { flex: none; width: clamp(24px, 2.6vw, 32px); height: auto; color: var(--vdf-or); filter: drop-shadow(0 1px 5px rgba(0,0,0,.45)); }
/* SOUS-TEXTE discret (Cinzel, blanc), sous le filet. Bien plus petit que le titre. */
.vdf-accueil-hero__sous {
  font-family: var(--vdf-font-titre); font-weight: 500; color: var(--vdf-blanc-casse);
  font-size: clamp(.95rem, 1.5vw, 1.2rem); line-height: 1.65; letter-spacing: .04em;
  margin: 0 auto; max-width: 46ch; text-shadow: 0 1px 8px rgba(0,0,0,.6);
}
/* BOUTON contour or (pilule) + boussole cerclée (template) : fond transparent, texte or capitales espacées. */
.vdf-accueil-hero__cta {
  display: inline-flex; align-items: center; gap: .7rem; margin-top: clamp(1.6rem, 4vh, 2.6rem);
  padding: .8rem 1.9rem; background: transparent; color: var(--vdf-or);
  font-family: var(--vdf-font-corps); font-weight: 600; text-transform: uppercase; letter-spacing: .2em;
  font-size: clamp(.72rem, 1vw, .84rem); text-decoration: none;
  border: 1.5px solid var(--vdf-or); border-radius: 999px;
  transition: background .25s ease, color .25s ease, border-color .25s ease;
}
.vdf-accueil-hero__cta:hover, .vdf-accueil-hero__cta:focus-visible {
  background: rgba(194, 152, 63, .14); color: var(--vdf-or-clair); border-color: var(--vdf-or-clair);
}
.vdf-accueil-hero__cta:focus-visible { outline: 2px solid var(--vdf-or-clair); outline-offset: 3px; }
.vdf-accueil-hero__cta-ic { flex: none; width: 22px; height: 22px; }
.vdf-accueil-hero__cta-txt { display: inline-block; }
/* chevron animé (défilement) */
.vdf-accueil-hero__chevron {
  position: absolute; z-index: 2; left: 50%; bottom: clamp(1.2rem, 4vh, 2.4rem); transform: translateX(-50%);
  width: 44px; height: 44px; display: inline-flex; align-items: center; justify-content: center;
  border-radius: 50%; border: 1px solid rgba(201,168,76,.5); color: var(--vdf-or); background: rgba(11,16,28,.35);
  animation: vdf-chevron 2s ease-in-out infinite;
}
.vdf-accueil-hero__chevron-ico { width: 12px; height: 12px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; transform: rotate(45deg) translate(-2px,-2px); }
@keyframes vdf-chevron { 0%,100% { transform: translateX(-50%) translateY(0); } 50% { transform: translateX(-50%) translateY(7px); } }
@media (prefers-reduced-motion: reduce) { .vdf-accueil-hero__chevron { animation: none; } }

/* Section carte (accueil) : titre centré + carte. */
.vdf-accueil-carte { background: var(--vdf-bleu-nuit); }
/* En-tête de la section carte : bloc CENTRÉ. Spécificité (0,2,0) — préfixée .vdf-dept — pour BATTRE la
   règle de base .vdf-dept .vdf-secteur__head { display:flex; justify-content:space-between } qui, sinon,
   gagne et pousse le bloc titre+intro à gauche (flex-start). En block + text-align center, titre et
   paragraphe sont parfaitement centrés sous le centre de la section, à toutes les largeurs. */
.vdf-dept .vdf-accueil-carte__head { display: block; text-align: center; margin-bottom: var(--vdf-space-md); }
.vdf-accueil-carte__head .vdf-h2::after { margin-inline: auto; }
/* Intro de la section carte (retour client) : UNE ligne au desktop. Conteneur élargi + nowrap à partir
   de 1200px (les ~110 caractères tiennent : ~900px < conteneur 1200px). Sous 1200px, wrap propre
   (impossible sur mobile) ; borne lisibilité : la police n'est PAS réduite. */
.vdf-accueil-carte__head .vdf-secteur__sous { max-width: 70ch; margin-inline: auto; }
@media (min-width: 1200px) {
  .vdf-accueil-carte__head .vdf-secteur__sous { max-width: none; white-space: nowrap; }
}

/* Grille d'accès : même composant, colonnes = nombre RÉEL de tuiles (--vdf-acces-count, injecté au
   rendu, défaut 4). Le max-width proportionnel garde à chaque carte EXACTEMENT la largeur qu'elle
   avait à 4 tuiles : sans lui, une tuile seule s'étirerait sur toute la largeur du conteneur.
   À 4 tuiles, max-width vaut 100 % : rendu strictement inchangé. */
.vdf-dept .vdf-acces-grid {
  grid-template-columns: repeat(var(--vdf-acces-count, 4), minmax(0, 1fr));
  max-width: calc(var(--vdf-acces-count, 4) / 4 * 100%);
  margin-inline: auto;
}
/* Aux paliers, le max-width doit être recalculé sur le nombre de colonnes du palier, sinon une
   tuile seule resterait bloquée à 25 % de large sur mobile. */
@media (max-width: 900px) {
  .vdf-dept .vdf-acces-grid {
    grid-template-columns: repeat(min(var(--vdf-acces-count, 4), 2), minmax(0, 1fr));
    max-width: calc(min(var(--vdf-acces-count, 4), 2) / 2 * 100%);
  }
}
@media (max-width: 520px) {
  .vdf-dept .vdf-acces-grid { grid-template-columns: minmax(0, 1fr); max-width: 100%; }
}

/* Crédit photo sous la légende des cartes (arbitrage client 2026-08-11).
   Discret par construction : plus petit que la description, moins contrasté, sans
   graisse. Il doit se lire quand on le cherche, pas concurrencer le texte éditorial.
   Le contraste reste au-dessus du seuil AA : #f5f0e8 à 62 % sur les fonds sombres
   du thème donne un ratio supérieur à 7.
   LA COUPURE — 06/10/2026, signal 247. Les crédits saisis portent souvent une adresse sans
   espace (« …Dordogne%2C_Corr%C3%A8ze%2C_France.jpg ») plus large que la carte, qui est en
   overflow: hidden : le texte était coupé net au bord, sur toutes les fiches (mesuré le 06/10
   sur Paris, la Haute-Savoie, la Corrèze et la Somme). `overflow-wrap: break-word`, la valeur
   du signal 245 pour les listings, le fait passer à la ligne. Seules les cartes dont un
   crédit débordait changent de hauteur. */
.vdf-dept .vdf-vcard__credit {
  margin: .35rem 0 0;
  font-size: .72rem;
  line-height: 1.3;
  letter-spacing: .01em;
  color: rgba(245, 240, 232, .62);
  font-style: italic;
  overflow-wrap: break-word;
}

/* ==========================================================================
   FICHE VILLAGE — d'après la maquette Sainte-Marie validée par le client.
   Conçue pour le cas NU : au départ 34 875 fiches sur 34 875 n'ont ni photo
   ni texte, c'est donc ce cas-là qui doit être digne, pas le cas riche.
   ========================================================================== */

/* Fond de page PROPRE à la fiche village.
   Les fiches département tirent leur fond sombre de `.vdf-dept--collector`, une classe
   de modèle que la fiche village n'a pas : sans cette règle, les sections restaient sur
   le beige du thème et tous les textes clairs devenaient invisibles. On ne réutilise pas
   `--collector` pour autant, la fiche village n'étant pas un modèle de département. */
.vdf-village {
  /* Fond de page des fiches village : cran 2 comme le hub et le Collector. Oubliée au
     premier passage, cette règle laissait la page en nuit pendant que sa section alternée
     s'éclaircissait — le rythme des sections s'inversait. Vu à la mesure, pas à la
     lecture : les deux couleurs existaient, seul leur ORDRE était faux. */
  background: var(--vdf-fond-section, #2b4377);
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-village .vdf-section { background: transparent; }
.vdf-village .vdf-section:nth-of-type(even) { background: var(--vdf-fond-section-alt); }
.vdf-village .vdf-secteur__titre,
.vdf-village h2 {
  color: var(--vdf-or-clair, #e3c079); /* or clair : mesure sous 4,5:1 en or de charte sur ce fond (158) */
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.25rem, 2.7vw, 2rem);
  margin: 0 0 1.2rem;
}

/* Fil d'Ariane : liste ordonnée mise à plat (sinon numérotation native + puces). */
.vdf-village .vdf-ariane__liste {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; align-items: center; gap: .4rem;
}
/* Séparateur APRÈS le chaînon, comme le pilier : un « › » ne commence jamais une ligne (audit du 16/10, F13). */
.vdf-village .vdf-ariane__item:not(:last-child)::after {
  content: "›"; margin-left: .4rem; color: rgba(245, 240, 232, .4);
}
.vdf-village .vdf-ariane a { color: rgba(245, 240, 232, .7); text-decoration: none; }
.vdf-village .vdf-ariane a:hover,
.vdf-village .vdf-ariane a:focus-visible { color: var(--vdf-or-clair, #e3c079); }
.vdf-village .vdf-ariane [aria-current] { color: rgba(245, 240, 232, .45); }

.vdf-village-hero { position: relative; display: flex; align-items: flex-end; overflow: hidden; }
/* AVEC photo : plein écran, comme une fiche département. */
.vdf-village--photo .vdf-village-hero { min-height: 78vh; }

/*
 * LE CADRAGE DU BANDEAU VILLAGE SUR TÉLÉPHONE — 21/09/2026, retour client du 15/09.
 *
 * CE QUE LA MESURE DIT, ET QUI N'EST PAS CE QU'ON ATTENDAIT. Sur cinq fiches village qui
 * portent une photo, à 390 et 412 px : la boîte fait 390x658, la photo servie 389x219,
 * c'est-à-dire du 16:9. `object-fit: cover` ne coupe donc RIEN en haut ni en bas — il coupe
 * 66,6 % de la LARGEUR. Le visiteur ne voit qu'un tiers central de la photo.
 *
 * LA CAUSE EST LA HAUTEUR DE LA BOÎTE, pas le centrage. 78vh sur un téléphone de 844 px
 * donne 658 px de haut pour 390 de large : un format portrait, quand la photo est un
 * paysage. Déplacer `object-position` ne récupérerait pas un pixel — cela ne ferait que
 * choisir QUEL tiers on montre.
 *
 * LA BORNE EST POSÉE SUR LA HAUTEUR, PAS SUR LE RAPPORT. Le bloc de titre mesure 238 px :
 * descendre jusqu'au 16:9 exact (219 px) l'écraserait. 420 px laisse le titre respirer et
 * ramène la coupe de 66,6 % à environ 47 %, soit vingt points de photo rendus.
 *
 * SOUS 640 px SEULEMENT : au-dessus, rien ne change, et c'est vérifié au pixel.
 */
@media (max-width: 639px) {
  .vdf-village--photo .vdf-village-hero { min-height: min(78vh, 420px); }
}
/* SANS photo : hero COMPACT. Une bande pleine hauteur et vide serait un trou ;
   40vh suffit à poser le titre sans donner l'impression d'une page cassée. */
.vdf-village--nu .vdf-village-hero {
  min-height: 40vh;
  background: linear-gradient(160deg, #1b2a4a 0%, #14203a 55%, #0e1626 100%);
}
.vdf-village-hero__media { position: absolute; inset: 0; z-index: 0; }
/* `--vdf-cadrage` est posée par le gabarit d'après les deux champs de cadrage. Son défaut,
   « center center », EST le comportement d'avant : une fiche qui n'a rien choisi ne bouge
   pas d'un pixel. Écrit ici une seule fois plutôt que sur chaque image. */
.vdf-village-hero__media img { width: 100%; height: 100%; object-fit: cover; display: block;
  object-position: var(--vdf-cadrage, center center); }
/* Voile de lisibilité : dégradé depuis la GAUCHE, le texte y étant aligné. */
.vdf-village--photo .vdf-village-hero__media::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(90deg, rgba(11,16,28,.78) 0%, rgba(11,16,28,.45) 45%, rgba(11,16,28,.05) 100%);
}
.vdf-village-hero__contenu {
  position: relative; z-index: 2;
  width: min(640px, 92%);
  margin: 0 auto 0 max(1.25rem, 5vw);
  padding: 3rem 0;
}

/*
 * LE BANDEAU VILLAGE EN PHOTO ENTIÈRE — 07/10/2026, signal 249 (single-village.php,
 * inc/hero-image.php). Seulement sur <main class="... vdf-village--entiere">, c'est-à-dire
 * quand la photo a ses tailles non recadrées ; les autres fiches gardent le bloc ci-dessus.
 * Tout est préfixé `.vdf-dept.vdf-village--entiere` pour battre `.vdf-dept .vdf-hero__img`
 * (cover, 0,2,0) et `.vdf-village-hero__media img` (cover + cadrage, 0,1,1).
 *
 * Plein écran : la section fait la hauteur de l'écran, l'en-tête passe dessus (body
 * vdf-has-hero) et la zone de la photo commence SOUS lui. La photo y est contenue, jamais
 * coupée ; l'espace libre est rempli par la même photo, agrandie et floutée.
 * Téléphone, et tout écran en portrait : la photo d'abord, le texte dessous, sur le flou.
 */
/* Hauteur de l'en-tête transparent, écrite comme lui en rem (padding 2 x 1,15rem + logo) :
   88 px et 77 px à 16 px de base, et elle suit une police par défaut agrandie (revue du 249). */
.vdf-village--entiere { --vdf-header-h: calc(2.3rem + clamp(2.7rem, 4.5vw, 3.2rem)); }
@media (max-width: 992px) { .vdf-village--entiere { --vdf-header-h: 4.8rem; } }
.vdf-dept.vdf-village--entiere .vdf-village-hero { min-height: 100vh; min-height: 100svh; padding-top: var(--vdf-header-h); background: #0e1626; }
.vdf-dept.vdf-village--entiere .vdf-village-hero__fond { position: absolute; inset: 0; z-index: 0; overflow: hidden; display: block; }
.vdf-dept.vdf-village--entiere .vdf-village-hero__fond img {
  position: absolute; inset: 0; width: 100%; height: 100%; max-width: none;
  object-fit: cover; filter: blur(28px) saturate(1.1); transform: scale(1.12);
}
.vdf-dept.vdf-village--entiere .vdf-village-hero__fond::after { content: ""; position: absolute; inset: 0; background: rgba(11, 16, 28, .45); }
.vdf-dept.vdf-village--entiere .vdf-village-hero__media { inset: var(--vdf-header-h) 0 0 0; z-index: 1; }
/* Plafond d'agrandissement (--vdf-photo-max-*) : posé par le gabarit sur une petite photo,
   pour qu'elle reste nette, encadrée de flou, au lieu d'être étirée sur tout l'écran. */
.vdf-dept.vdf-village--entiere .vdf-village-hero__photo {
  position: absolute; inset: 0; margin: auto; width: 100%; height: 100%;
  max-width: var(--vdf-photo-max-w, none); max-height: var(--vdf-photo-max-h, none);
  object-fit: contain; object-position: 50% 50%;
}
.vdf-dept.vdf-village--entiere .vdf-village-hero__badge { top: calc(var(--vdf-header-h) + 1.6rem); }
@media (max-width: 639px), (max-aspect-ratio: 1/1) {
  .vdf-dept.vdf-village--entiere .vdf-village-hero { flex-direction: column; align-items: stretch; }
  .vdf-dept.vdf-village--entiere .vdf-village-hero__media { position: relative; inset: auto; flex: 1 0 calc(100vw * 9 / 16); }
  .vdf-dept.vdf-village--entiere .vdf-village-hero__media::after { display: none; }
  .vdf-dept.vdf-village--entiere .vdf-village-hero__fond::after { background: rgba(11, 16, 28, .58); }
  .vdf-dept.vdf-village--entiere .vdf-village-hero__contenu { padding: 1.4rem 0 2.4rem; }
  /* Le badge de gamme passe dans le flux, aligné sur le texte, au-dessus de la photo. */
  .vdf-dept.vdf-village--entiere .vdf-village-hero__badge { position: static; order: -1; align-self: flex-start; margin: 1rem 0 0 max(1.25rem, 5vw); }
}

/*
 * LE BANDEAU VILLAGE PLEIN — 09/10/2026, signal 256 (courriel de Serge Blanchard du 09/10 :
 * « le même principe que sur les fiches Département », sans bande semi-transparente autour).
 * Sur <main class="... vdf-village--plein">, toute fiche qui a une photo. Préfixé
 * `.vdf-dept.vdf-village--plein` pour passer devant le bloc --photo plus haut.
 *
 * Ordinateur et tablette en paysage : comme le Collector, la section fait la hauteur de l'écran,
 * l'en-tête transparent passe dessus et la photo couvre tout (object-fit: cover, cadrage du
 * client). Même voile que le département : sombre à gauche et en bas, sous le texte.
 * Téléphone et écran en portrait : la photo d'abord, sur toute la largeur et à son rapport
 * (--vdf-photo-ratio, posé par le gabarit), bornée entre le 16:9 et 75 % de l'écran ; le texte
 * dessous, sur le fond nuit. C'est là que le plein écran du département coupait les deux
 * tiers de la largeur d'un paysage (retour client du 15/09) : le cadrage est préservé ainsi.
 */
.vdf-village--plein { --vdf-header-h: calc(2.3rem + clamp(2.7rem, 4.5vw, 3.2rem)); }
@media (max-width: 992px) { .vdf-village--plein { --vdf-header-h: 4.8rem; } }
.vdf-dept.vdf-village--plein .vdf-village-hero {
  min-height: 100vh; min-height: min(100vh, var(--vdf-plein-hmax, 100vh));
  padding-top: calc(var(--vdf-header-h) + 1.5rem);
  background: #0e1626;
}
/* svh seulement là où il est compris : ailleurs, la ligne avec var() serait invalide au calcul et
   la section retomberait à zéro au lieu de 100vh (revue du 256). */
@supports (height: 100svh) {
  .vdf-dept.vdf-village--plein .vdf-village-hero { min-height: min(100svh, var(--vdf-plein-hmax, 100svh)); }
}
/* --vdf-plein-hmax : posée par le gabarit, 1,5 fois la hauteur de la photo servie. Elle ne joue que
   pour une photo basse (panorama) : la section s'arrête avant que la photo ne devienne floue. */
.vdf-dept.vdf-village--plein .vdf-village-hero__media { position: absolute; inset: 0; z-index: 0; }
.vdf-dept.vdf-village--plein .vdf-village-hero__photo,
.vdf-dept.vdf-village--plein .vdf-village-hero__media img {
  position: absolute; inset: 0; width: 100%; height: 100%; max-width: none;
  object-fit: cover; object-position: var(--vdf-cadrage, center center);
}
.vdf-dept.vdf-village--plein .vdf-village-hero__media::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background:
    linear-gradient(90deg, rgba(15,20,32,.78) 0%, rgba(15,20,32,.55) 26%, rgba(15,20,32,.24) 52%, rgba(15,20,32,0) 76%),
    linear-gradient(0deg, rgba(11,16,28,.6) 0%, rgba(11,16,28,0) 42%),
    linear-gradient(180deg, rgba(11,16,28,.45) 0%, rgba(11,16,28,0) 20%);
}
.vdf-dept.vdf-village--plein .vdf-village-hero__credit { z-index: 3; }
.vdf-dept.vdf-village--plein .vdf-village-hero__badge { top: calc(var(--vdf-header-h) + 1.6rem); }
@media (max-width: 639px), (max-aspect-ratio: 1/1) {
  .vdf-dept.vdf-village--plein .vdf-village-hero {
    flex-direction: column; align-items: stretch; min-height: 0; padding-top: 0;
  }
  .vdf-dept.vdf-village--plein .vdf-village-hero__media {
    position: relative; inset: auto; width: 100%;
    aspect-ratio: var(--vdf-photo-ratio, 16 / 9);
    min-height: calc(100vw * 9 / 16); max-height: 75vh; max-height: 75svh;
  }
  /* Seul le haut reste voilé, pour lire l'en-tête transparent posé sur la photo. */
  .vdf-dept.vdf-village--plein .vdf-village-hero__media::after {
    background: linear-gradient(180deg, rgba(11,16,28,.55) 0%, rgba(11,16,28,0) 28%);
  }
  .vdf-dept.vdf-village--plein .vdf-village-hero__contenu { padding: 1.4rem 0 2.4rem; }
  .vdf-dept.vdf-village--plein .vdf-village-hero__badge { margin: 0 0 1.6rem max(1.25rem, 5vw); }
  /* LE CRÉDIT SOUS LA PHOTO, SANS BANDE — brief 48 (courriel du client du 09/10 : « sans bande
     semi-transparente autour de l'image », comme les fiches Département). Posé sur la photo, le
     crédit faisait ici une bande sombre de toute la largeur. Il passe dessous, sans fond, sur le fond
     nuit du bandeau. La photo garde la même boîte : le cadre de rapport passe du conteneur à la
     <picture>, le voile la suit (même case de grille). Seulement quand un crédit existe. La colonne
     est tenue à la largeur du conteneur : sans cela, la hauteur minimale d'une photo panoramique
     devenait une largeur minimale (Briançon : 625 px au lieu de 390, photo décentrée et crédit
     coupé, vu à l'essai sur le test). */
  .vdf-dept.vdf-village--plein .vdf-village-hero__media:has(> .vdf-village-hero__credit) {
    display: grid; grid-template-columns: minmax(0, 1fr); aspect-ratio: auto; min-height: 0; max-height: none;
  }
  .vdf-dept.vdf-village--plein .vdf-village-hero__media:has(> .vdf-village-hero__credit) > picture {
    grid-area: 1 / 1; display: block; position: relative; width: 100%; min-width: 0;
    aspect-ratio: var(--vdf-photo-ratio, 16 / 9);
    min-height: calc(100vw * 9 / 16); max-height: 75vh; max-height: 75svh;
  }
  .vdf-dept.vdf-village--plein .vdf-village-hero__media:has(> .vdf-village-hero__credit)::after {
    grid-area: 1 / 1; position: relative; inset: auto;
  }
  .vdf-dept.vdf-village--plein .vdf-village-hero__media > .vdf-village-hero__credit {
    grid-area: 2 / 1; justify-self: end; position: static; background: none;
  }
}

/* Surtitre : filet vertical doré + département en capitales + étoile (maquette). */
.vdf-village-hero__surtitre {
  display: flex; align-items: center; gap: .6rem;
  margin: 0 0 .9rem; padding-left: .85rem;
  border-left: 3px solid var(--vdf-or, #c2983f);
  font-size: clamp(.85rem, 1.5vw, 1.05rem);
  letter-spacing: .16em; text-transform: uppercase;
}
.vdf-village-hero__surtitre a { color: var(--vdf-blanc-casse, #f5f0e8); text-decoration: none; }
.vdf-village-hero__surtitre a:hover,
.vdf-village-hero__surtitre a:focus-visible { color: var(--vdf-or-clair, #e3c079); }
.vdf-village-hero__etoile { display: inline-flex; width: 1.15em; color: var(--vdf-or, #c2983f); }
.vdf-village-hero__etoile svg { width: 100%; height: auto; fill: currentColor; stroke: none; }

/* Nom : casse NORMALE, contrairement aux fiches département où il est en capitales.
   C'est le choix de la maquette et il distingue les deux niveaux au premier regard. */
.vdf-village-hero__nom {
  margin: 0 0 .7rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-weight: 700;
  font-size: clamp(2.4rem, 7vw, 4.6rem);
  line-height: 1.02;
  color: var(--vdf-blanc-casse, #f5f0e8);
  overflow-wrap: break-word; hyphens: auto; /* noms longs : coupe propre */
}
.vdf-village-hero__accroche,
.vdf-village-hero__situation {
  margin: 0 0 1.6rem;
  font-size: clamp(1rem, 1.9vw, 1.3rem);
  line-height: 1.45;
  color: var(--vdf-or-clair, #e3c079);
  font-style: italic;
}
/* Le cas nu affiche une SITUATION factuelle : ni italique ni doré, elle ne
   prétend pas être une accroche éditoriale. */
.vdf-village-hero__situation { font-style: normal; color: rgba(245,240,232,.82); }

.vdf-village-hero__cta {
  display: inline-flex; align-items: center; gap: .6rem;
  padding: .7rem 1.5rem;
  border: 1px solid var(--vdf-or, #c2983f);
  color: var(--vdf-blanc-casse, #f5f0e8);
  text-decoration: none; text-transform: uppercase;
  font-size: .82rem; letter-spacing: .14em;
  transition: background-color .2s ease, color .2s ease;
}
.vdf-village-hero__cta svg { width: 1.1em; height: 1.1em; }
.vdf-village-hero__cta:hover,
.vdf-village-hero__cta:focus-visible {
  background: var(--vdf-or, #c2983f); color: var(--vdf-sur-or);
}

/* --- Repères INSEE : même composant que la barre de stats des départements --- */
.vdf-village-reperes { padding: 2.6rem 0; }
.vdf-village-reperes__grille {
  list-style: none; margin: 0 auto; padding: 0;
  display: grid;
  grid-template-columns: repeat(var(--vdf-rep-count, 4), minmax(0, 1fr));
  gap: 1rem 2rem;
  border: 2px solid rgba(194,152,63,.75);
  padding: 1.4rem 1.6rem;
  max-width: 940px;
}
.vdf-village-repere { display: flex; flex-direction: column; gap: .2rem; }
.vdf-village-repere__val {
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.15rem, 2vw, 1.5rem);
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-village-repere__lib {
  font-size: .74rem; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(245,240,232,.62);
}
/* Sous 900 px : 2 colonnes, jamais 4 écrasées. */
@media (max-width: 900px) {
  .vdf-village-reperes__grille { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 380px) {
  .vdf-village-reperes__grille { grid-template-columns: minmax(0, 1fr); }
}

/* --- Récit --- */
.vdf-village-recit { padding: 1rem 0 2.6rem; }
.vdf-village-recit__texte {
  max-width: 720px; margin: 0 auto;
  color: rgba(245,240,232,.86); line-height: 1.75;
}
/* Les rubriques du récit (signal 255) : le titre suit la colonne du texte, pas le conteneur. */
.vdf-village-recit__rubrique { max-width: 720px; margin: 0 auto; }
.vdf-village-recit__rubrique + .vdf-village-recit__rubrique { margin-top: 2.2rem; }

/* --- Situation : carte --- */
.vdf-village-situation { padding: 1rem 0 2.6rem; }
/* Carte de situation : le JS (assets/js/carte-village.js) l'initialise à l'entrée du
   viewport. Le fond sombre sert de fond d'attente pendant le chargement de Leaflet. */
.vdf-village-carte {
  width: 100%; aspect-ratio: 16 / 9; max-width: 940px; margin: 0 auto;
  background: var(--vdf-fond-carto-clair); border: 1px solid rgba(194,152,63,.35);
}
.vdf-village-coord {
  text-align: center; margin: .7rem 0 0;
  font-size: .82rem; color: rgba(245,240,232,.6);
}

/* --- À proximité : le seul contenu vraiment unique d'une fiche nue --- */
.vdf-village-proximite { padding: 1rem 0 2.6rem; }
.vdf-village-proximite__liste {
  list-style: none; margin: 0 auto; padding: 0; max-width: 720px;
}
.vdf-village-proximite__liste a {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  padding: .8rem .2rem;
  border-bottom: 1px solid rgba(245,240,232,.12);
  color: var(--vdf-blanc-casse, #f5f0e8); text-decoration: none;
}
.vdf-village-proximite__liste a:hover .vdf-village-proximite__nom,
.vdf-village-proximite__liste a:focus-visible .vdf-village-proximite__nom {
  color: var(--vdf-or-clair, #e3c079);
}
.vdf-village-proximite__km { font-size: .85rem; color: rgba(245,240,232,.55); white-space: nowrap; }
/* UNE COMMUNE VOISINE DONT LA FICHE N'EST PAS PUBLIEE — 14/09/2026.
   Elle reste affichee avec sa distance : c'est deja une donnee utile. Mais elle ne porte
   ni lien, ni curseur de main, ni survol — rien qui promette un clic qui n'arriverait pas.
   Les valeurs sont celles de `.vdf-commune--attente` (l. 2193-2194), le regime deja en
   place pour les communes en attente d'une page de departement : une seule convention. */
.vdf-village-proximite__inerte {
  /* Memes boite, rembourrage et filet que le lien juste au-dessus : le rythme de la liste
     ne doit pas sauter d'une ligne a l'autre selon qu'elle est cliquable ou non. */
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  padding: .8rem .2rem;
  border-bottom: 1px solid rgba(245, 240, 232, .12);
  cursor: default;
}
.vdf-village-proximite__item--attente .vdf-village-proximite__nom { color: rgba(245, 240, 232, .5); }
.vdf-village-proximite__item--attente .vdf-village-proximite__km  { color: rgba(245, 240, 232, .3); }

/* --- Rattachement --- */
.vdf-village-rattachement { padding: 1rem 0 3rem; text-align: center; }
.vdf-village-rattachement__txt { color: rgba(245,240,232,.8); margin: 0 0 1.3rem; }
.vdf-village-rattachement__liens { display: flex; flex-wrap: wrap; gap: .9rem; justify-content: center; }
.vdf-village-btn {
  display: inline-flex; align-items: center; padding: .75rem 1.5rem;
  background: var(--vdf-or, #c2983f); color: var(--vdf-sur-or);
  text-decoration: none; font-size: .84rem; letter-spacing: .1em; text-transform: uppercase;
}
.vdf-village-btn--creux { background: transparent; color: var(--vdf-blanc-casse, #f5f0e8); border: 1px solid var(--vdf-or, #c2983f); }
.vdf-village-btn:hover, .vdf-village-btn:focus-visible { background: var(--vdf-or-clair, #e3c079); color: var(--vdf-sur-or); }

.vdf-village-ariane { padding: 0 0 2.2rem; font-size: .8rem; }

/* ==========================================================================
   ARCHIVE-PILIER /france/villages — les 101 départements, groupés par région.
   ========================================================================== */
.vdf-pilier { background: var(--vdf-fond-section, #2b4377); color: var(--vdf-blanc-casse, #f5f0e8); }
.vdf-pilier .vdf-section { background: transparent; }
.vdf-pilier .vdf-pilier-liste { padding-top: 1.4rem; }

/* Le hero du pilier est une simple en-tête : pas de padding bas généreux, la section
   suivante apporte déjà le sien. Sans cela, ~300 px de vide séparaient le filtre du
   premier groupe à 390 px — visible et gênant sur un annuaire qu'on parcourt. */
.vdf-pilier-hero { padding: 2.4rem 0 0.6rem; }
.vdf-pilier-hero__titre {
  margin: 0 0 .8rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.9rem, 5vw, 3.4rem);
  line-height: 1.08;
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-pilier-hero__titre::after {
  content: ""; display: block; width: 3.2rem; height: 2px;
  background: var(--vdf-or, #c2983f); margin-top: .9rem;
}
.vdf-pilier-hero__intro { margin: 0 0 1.6rem; color: rgba(245, 240, 232, .78); }

.vdf-pilier-filtre { max-width: 420px; }
.vdf-pilier-filtre__label {
  display: block; margin-bottom: .4rem;
  font-size: .74rem; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(245, 240, 232, .6);
}
.vdf-pilier-filtre__champ {
  width: 100%; padding: .7rem .9rem;
  background: rgba(14, 22, 38, .7);
  border: 1px solid rgba(194, 152, 63, .45);
  color: var(--vdf-blanc-casse, #f5f0e8);
  font-size: 1rem; /* 16px minimum : en dessous, iOS zoome au focus */
}
.vdf-pilier-filtre__champ:focus-visible {
  outline: 2px solid var(--vdf-or, #c2983f); outline-offset: 1px;
}
.vdf-pilier-filtre__compte { margin: .5rem 0 0; font-size: .82rem; color: rgba(245, 240, 232, .6); min-height: 1.2em; }

.vdf-pilier-groupe { margin-bottom: 2.4rem; }
.vdf-pilier-groupe__titre {
  display: flex; align-items: baseline; gap: .7rem;
  margin: 0 0 .8rem; padding-bottom: .5rem;
  border-bottom: 1px solid rgba(194, 152, 63, .3);
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1rem, 2vw, 1.3rem);
  letter-spacing: .06em; text-transform: uppercase;
  color: var(--vdf-or, #c2983f);
}
.vdf-pilier-groupe__nb {
  font-family: system-ui, sans-serif; font-size: .74rem;
  color: rgba(245, 240, 232, .45); letter-spacing: 0;
}

.vdf-pilier-groupe__liste {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: minmax(0, 1fr); /* 1 colonne à 390 px */
}
@media (min-width: 700px)  { .vdf-pilier-groupe__liste { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 2rem; } }
@media (min-width: 1100px) { .vdf-pilier-groupe__liste { grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: 2.4rem; } }

/* La LIGNE porte désormais la mise en page : elle contient DEUX cibles distinctes,
   le nom (vers la fiche département) et le compteur (vers la page des communes).
   Un lien ne peut pas en contenir un autre, d'où la séparation. */
.vdf-pilier-dep {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  padding: .7rem .2rem;
  border-bottom: 1px solid rgba(245, 240, 232, .1);
}
.vdf-pilier-dep__lien {
  flex: 1 1 auto; min-width: 0;
  color: var(--vdf-blanc-casse, #f5f0e8); text-decoration: none;
}
a.vdf-pilier-dep__lien:hover .vdf-pilier-dep__nom,
a.vdf-pilier-dep__lien:focus-visible .vdf-pilier-dep__nom { color: var(--vdf-or-clair, #e3c079); }

.vdf-pilier-dep__nb {
  flex: 0 0 auto;
  font-size: .82rem; color: rgba(245, 240, 232, .5); white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
/* Le compteur cliquable : discret au repos, franc au survol. Il vaut pour les 101
   départements, y compris ceux dont la fiche n'est pas publiée — c'est le lien qui
   ferme le cul-de-sac du pilier. */
a.vdf-pilier-dep__nb--lien { text-decoration: none; border-bottom: 1px dotted rgba(245, 240, 232, .3); }
a.vdf-pilier-dep__nb--lien:hover,
a.vdf-pilier-dep__nb--lien:focus-visible {
  color: var(--vdf-or-clair, #e3c079); border-bottom-color: var(--vdf-or, #c2983f);
}

/* Département dont la page n'est pas encore publiée : nom présent, sans lien.
   Assombri pour que la différence se voie sans avoir à cliquer — 6 départements
   ouverts et 95 en attente doivent se lire comme un chantier en cours. Le compteur,
   lui, reste cliquable : la page des communes existe pour tous. */
.vdf-pilier-dep--attente .vdf-pilier-dep__nom { color: rgba(245, 240, 232, .45); }

.vdf-pilier-vide { padding: 2rem 0; color: rgba(245, 240, 232, .6); }
.vdf-pilier-ariane { padding: 1rem 0 2.4rem; font-size: .8rem; }
.vdf-pilier .vdf-ariane__liste { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .4rem; }
/* Séparateur APRÈS le chaînon (et non avant le suivant) : si le fil passe à la ligne, le « › »
   finit la ligne au lieu de commencer la suivante (16/10). Sur une ligne, mêmes positions :
   .4rem de marge + .4rem de gap, dans l'autre ordre. */
.vdf-pilier .vdf-ariane__item:not(:last-child)::after { content: "›"; margin-left: .4rem; color: rgba(245, 240, 232, .4); }
.vdf-pilier .vdf-ariane a { color: rgba(245, 240, 232, .7); text-decoration: none; }
.vdf-pilier .vdf-ariane a:hover, .vdf-pilier .vdf-ariane a:focus-visible { color: var(--vdf-or-clair, #e3c079); }
.vdf-pilier .vdf-ariane [aria-current] { color: rgba(245, 240, 232, .45); }

/* ==========================================================================
   HUB /france — tête du silo. Sobre : c'est une page de passage, pas une
   destination. Elle doit conduire au pilier, pas retenir.
   ========================================================================== */
.vdf-hub { background: var(--vdf-fond-section, #2b4377); color: var(--vdf-blanc-casse, #f5f0e8); }
.vdf-hub .vdf-section { background: transparent; }
.vdf-hub .vdf-section:nth-of-type(even) { background: var(--vdf-fond-section-alt); }

.vdf-hub-hero { padding: 3rem 0 1.6rem; }
.vdf-hub-hero__titre {
  margin: 0 0 1rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(2.6rem, 9vw, 5.2rem);
  line-height: 1.02;
  letter-spacing: .02em;
}
.vdf-hub-hero__titre::after {
  content: ""; display: block; width: 3.2rem; height: 2px;
  background: var(--vdf-or, #c2983f); margin-top: 1rem;
}
.vdf-hub-hero__chapeau {
  margin: 0 0 1.8rem; max-width: 46ch;
  font-size: clamp(1.02rem, 2vw, 1.24rem);
  line-height: 1.6; color: rgba(245, 240, 232, .84);
}

/* Lien vers le pilier : traité comme un bouton, pour qu'il soit vu.
   C'est le lien qui transmet au pilier — il ne doit pas se lire comme
   du texte courant. */
.vdf-hub-hero__pilier { margin: 0; }
.vdf-hub-lien-pilier {
  display: inline-flex; align-items: center; gap: .7rem;
  padding: .9rem 1.6rem;
  border: 1px solid var(--vdf-or, #c2983f);
  color: var(--vdf-blanc-casse, #f5f0e8);
  text-decoration: none;
  font-size: clamp(.86rem, 1.6vw, .96rem);
  letter-spacing: .1em; text-transform: uppercase;
  transition: background-color .2s ease, color .2s ease;
}
.vdf-hub-lien-pilier svg { width: 1.15em; height: 1.15em; flex: none; }
.vdf-hub-lien-pilier:hover,
.vdf-hub-lien-pilier:focus-visible { background: var(--vdf-or, #c2983f); color: var(--vdf-sur-or); }

/* ============================================================================
 * LE LIEN PILIER SOUS LE HERO — 20/08/2026.
 *
 * Le hero ne porte plus qu'un seul appel a l'action, le bouton dore. Le lien pilier est
 * descendu dans la section du chapeau. Encadre comme il l'etait, il y ferait un second
 * bouton a distance du premier : on le rend en LIEN TEXTE, souligne au survol.
 *
 * Ni la classe ni l'ancre ne changent : c'est une decision de maillage, seule sa PLACE et
 * son poids visuel bougent.
 * ========================================================================== */
.vdf-hub-chapeau__pilier { margin: var(--vdf-space-sm, 1rem) 0 0; }

.vdf-hub-chapeau__pilier .vdf-hub-lien-pilier {
  padding: 0;
  border: 0;
  /* `--vdf-or-clair` et non `--vdf-or` : mesure du 21/08. A 17 px ce lien est du TEXTE
     COURANT, seuil 4,5 — et l'or de charte ne donne que 3,62 sur le fond de section.
     L'or clair donne 5,56. Defaut introduit le 20/08 en descendant ce lien du hero,
     ou il etait un bouton a fond plein et ne se mesurait pas contre le fond. */
  color: var(--vdf-or-clair, #e3c079);
  text-transform: none;
  letter-spacing: .02em;
  font-size: var(--vdf-fs-corps, 1.05rem);
}

.vdf-hub-chapeau__pilier .vdf-hub-lien-pilier:hover,
.vdf-hub-chapeau__pilier .vdf-hub-lien-pilier:focus-visible {
  background: transparent;
  color: var(--vdf-or-clair, #e3c079);
  text-decoration: underline;
}

.vdf-hub-presentation { padding: 2.2rem 0; }
.vdf-hub-presentation__texte {
  max-width: 62ch; line-height: 1.75; color: rgba(245, 240, 232, .86);
}
.vdf-hub-presentation__texte p { margin: 0 0 1rem; }
/* Mention d'indépendance : détachée du corps par un filet, parce qu'elle n'est
   pas du discours commercial mais une déclaration de statut. */
.vdf-hub-independance {
  max-width: 62ch; margin: 1.4rem 0 0; padding-top: 1.1rem;
  border-top: 1px solid rgba(194, 152, 63, .28);
  font-size: .9rem; font-style: italic; color: rgba(245, 240, 232, .68);
}

.vdf-hub-carte { padding: 2.2rem 0; scroll-margin-top: 90px; /* header fixe */ }
.vdf-hub-carte__titre {
  margin: 0 0 .7rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.3rem, 3vw, 2rem);
  color: var(--vdf-or, #c2983f);
}
.vdf-hub-carte__intro { margin: 0 0 1.5rem; max-width: 62ch; color: rgba(245, 240, 232, .78); }

/*
 * PAGES LÉGALES ET ÉDITORIALES (page-legale.php).
 *
 * Du texte long, et rien d'autre : pas de colonnes, pas d'encadrés. La largeur est bornée
 * à 68ch parce qu'au-delà l'œil perd la ligne suivante — ces pages sont lues en entier
 * quand elles sont lues, contrairement au reste du site qui se parcourt.
 *
 * L'interligne est plus généreux qu'ailleurs (1.75) : le contraste blanc cassé sur bleu
 * nuit fatigue plus vite que du noir sur blanc, et l'air entre les lignes le compense.
 */
/* LA BANDE BLANCHE SOUS L'EN-TÊTE — mesurée le 22/08 : l'en-tête s'arrête à 69 px, le
   contenu commence à 108 px, et les 39 px entre les deux laissent voir le `body` blanc.
   Ailleurs le hero photo occupe cette zone et masque le défaut ; ici il n'y a pas de hero.

   Le fond est donc posé sur le body, pour ce gabarit seulement. La valeur est écrite en
   dur À DESSEIN : la palette est scopée sous `.vdf-dept` « pour ne pas fuir sur le reste
   du site » (voir en tête de fichier), et la déclarer sur :root pour ce seul cas
   annulerait ce cloisonnement. Duplication assumée, et signalée ici pour qu'un changement
   de cran la retrouve.
   `background-color` et non `background` (signal 241) : le raccourci effaçait la zone de
   compensation de l'en-tête que header.css peint sur le body (même spécificité, feuille
   chargée après). */
body.page-template-page-legale { background-color: #2b4377; }

/* Marge latérale : celle du contenu des autres pages, le 2rem de .vdf-dept .vdf-section. Sans elle,
   titre, texte et formulaire touchaient le bord du téléphone (audit du 16/10, F02). */
.vdf-legale { padding: 2.5rem var(--vdf-space-md) 4rem; }
/* `.vdf-dept .vdf-container` vaut (0,2,0) et écrasait un `.vdf-legale__inner` à (0,1,0) :
   le texte courait sur 1 200 px au lieu des 68 caractères voulus. On monte au même poids. */
.vdf-dept .vdf-legale__inner { max-width: 68ch; }
.vdf-legale__titre {
  margin: 0 0 1.8rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.6rem, 4vw, 2.6rem);
  color: var(--vdf-or, #c2983f);
}
.vdf-legale__corps { color: var(--vdf-blanc-casse, #f5f0e8); line-height: 1.75; }
.vdf-legale__corps h2 {
  margin: 2.4rem 0 .8rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.15rem, 2.4vw, 1.5rem);
  color: var(--vdf-or, #c2983f);
}
.vdf-legale__corps h3 {
  margin: 1.6rem 0 .5rem; font-size: 1rem; letter-spacing: .04em;
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-legale__corps p { margin: 0 0 1.1rem; }
.vdf-legale__corps ul { margin: 0 0 1.2rem; padding-left: 1.3rem; }
.vdf-legale__corps li { margin: 0 0 .5rem; }
.vdf-legale__corps a { color: var(--vdf-or, #c2983f); }
.vdf-legale__corps strong { color: #fff; }
/* Le champ resté à compléter doit se voir de loin : une page légale à trous ne se publie
   pas, et ce repère est là pour qu'on ne l'oublie pas en la relisant. */
.vdf-legale__corps .vdf-a-completer {
  padding: .1em .45em; border: 1px dashed var(--vdf-or, #c2983f);
  color: var(--vdf-or, #c2983f); font-weight: 700; white-space: nowrap;
}
.vdf-legale__ariane { margin-top: 3rem; }

/* --- Formulaire de contact --------------------------------------------------------- */
.vdf-contact { margin: 1.5rem 0 0; }
.vdf-contact__champ { display: flex; flex-direction: column; gap: .35rem; margin: 0 0 1.1rem; }
.vdf-contact__champ label { font-size: .82rem; letter-spacing: .06em; text-transform: uppercase; color: var(--vdf-or, #c2983f); }
.vdf-contact input[type="text"],
.vdf-contact input[type="email"],
.vdf-contact textarea {
  width: 100%; padding: .7rem .8rem;
  background: rgba(0, 0, 0, .18);
  border: 1px solid rgba(194, 152, 63, .45);
  color: var(--vdf-blanc-casse, #f5f0e8);
  font: inherit; font-size: 1rem; /* 16px : en dessous, iOS zoome à la mise au point */
  border-radius: 2px;
}
.vdf-contact textarea { resize: vertical; min-height: 9rem; }
.vdf-contact input:focus-visible, .vdf-contact textarea:focus-visible {
  outline: 2px solid var(--vdf-or, #c2983f); outline-offset: 1px; border-color: transparent;
}
/* LE BOUTON D'ENVOI EST UN <button>, PAS UN <a>.
   `.vdf-hub-btn` suffit pour les liens du hub, mais Hello Elementor style ses boutons à
   part : le bouton ressortait en ROSE #c36 sur fond transparent, alors que la
   neutralisation du rose déjà en place ne vise que les liens. On repasse donc dessus avec
   le poids nécessaire, en reprenant exactement l'apparence des boutons du hub. */
.vdf-dept .vdf-contact__envoi button.vdf-hub-btn {
  background: var(--vdf-or, #c2983f);
  color: var(--vdf-sur-or, #0e1626);
  border: 0;
  cursor: pointer;
  font: inherit;
  font-size: .84rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  padding: .8rem 1.6rem;
}
.vdf-dept .vdf-contact__envoi button.vdf-hub-btn:hover { background: #d8ab4d; }

.vdf-contact__envoi { margin: 1.4rem 0 .8rem; }
.vdf-contact__note { font-size: .82rem; color: rgba(245, 240, 232, .62); }

/* LE POT DE MIEL. Il doit être invisible SANS être `display:none` ni `hidden` : les robots
   sautent ces deux-là, et le piège ne prendrait plus personne. On le sort donc du cadre. */
.vdf-contact__miel {
  position: absolute !important; left: -9999px !important;
  width: 1px; height: 1px; overflow: hidden;
}

.vdf-contact__retour { padding: .8rem 1rem; border-left: 3px solid; margin: 0 0 1.2rem; }
.vdf-contact__retour--ok { border-color: var(--vdf-vert-legende, #4caf7d); background: rgba(76, 175, 125, .12); }
.vdf-contact__retour--ko { border-color: #e0705a; background: rgba(224, 112, 90, .12); }

/*
 * PARTENAIRES — meme forme que la section carte (titre doré Cinzel, texte à 78 %), pour
 * qu'une rubrique en attente ne se distingue pas d'une rubrique servie. Un liseré haut
 * la sépare des appels à l'action sans ajouter de fond : elle annonce, elle n'appelle pas.
 */
.vdf-hub-partenaires { padding: 2.2rem 0 3rem; border-top: 1px solid rgba(194, 152, 63, .22); }
.vdf-hub-partenaires__titre {
  margin: 0 0 .7rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.3rem, 3vw, 2rem);
  color: var(--vdf-or, #c2983f);
}
.vdf-hub-partenaires__texte { margin: 0; max-width: 62ch; color: rgba(245, 240, 232, .78); }

.vdf-hub-cta { padding: 1.4rem 0 3rem; }
.vdf-hub-cta__liens { display: flex; flex-wrap: wrap; gap: .9rem; }
.vdf-hub-btn {
  display: inline-flex; align-items: center; padding: .8rem 1.6rem;
  background: var(--vdf-or, #c2983f); color: var(--vdf-sur-or);
  text-decoration: none; font-size: .84rem; letter-spacing: .1em; text-transform: uppercase;
}
.vdf-hub-btn--creux {
  background: transparent; color: var(--vdf-blanc-casse, #f5f0e8);
  border: 1px solid var(--vdf-or, #c2983f);
}
.vdf-hub-btn:hover, .vdf-hub-btn:focus-visible { background: var(--vdf-or-clair, #e3c079); color: var(--vdf-sur-or); }

.vdf-hub-ariane { padding: 0 0 2.4rem; font-size: .8rem; }
.vdf-hub .vdf-ariane__liste { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .4rem; }
.vdf-hub .vdf-ariane__item:not(:last-child)::after { content: "›"; margin-left: .4rem; color: rgba(245, 240, 232, .4); } /* après le chaînon, comme le pilier */
.vdf-hub .vdf-ariane a { color: rgba(245, 240, 232, .7); text-decoration: none; }
.vdf-hub .vdf-ariane a:hover, .vdf-hub .vdf-ariane a:focus-visible { color: var(--vdf-or-clair, #e3c079); }
.vdf-hub .vdf-ariane [aria-current] { color: rgba(245, 240, 232, .45); }

/* Sur téléphone et tablette, le fil (/france/, /france/villages/, /france/departements/, fiches
   village), le titre et le filtre (/france/villages/) touchaient le bord de l'écran : ils ne sont
   pas dans une .vdf-section. Ils prennent la marge intérieure du contenu de la page, le 2rem de
   .vdf-dept .vdf-section (16/10, décision « marge avec titre » jusqu'à 600 px ; décision
   « marge tablette oui » et audit F13 jusqu'à 1023 px). Ordinateur inchangé. */
@media (max-width: 1023px) {
  .vdf-dept .vdf-pilier-hero,
  .vdf-dept .vdf-pilier-ariane,
  .vdf-dept .vdf-hub-ariane,
  .vdf-dept .vdf-village-ariane { padding-inline: var(--vdf-space-md); }
}

/* ==========================================================================
   PAGE DES COMMUNES /france/villages/departement/<nom> — le chaînon entre le
   pilier et les 34 875 fiches. Jusqu'à 887 lignes sur une seule page : la
   densité prime, et le filtre remplace la pagination.
   ========================================================================== */
.vdf-communes { background: var(--vdf-fond-section, #2b4377); color: var(--vdf-blanc-casse, #f5f0e8); }
.vdf-communes .vdf-section { background: transparent; }
.vdf-communes .vdf-communes-liste { padding-top: 1.2rem; }

.vdf-communes-hero { padding: 2.4rem 0 0.6rem; }
.vdf-communes-hero__surtitre {
  margin: 0 0 .5rem;
  font-size: .78rem; letter-spacing: .18em; text-transform: uppercase;
  color: var(--vdf-or, #c2983f);
}
.vdf-communes-hero__etoile { margin-left: .4rem; }
.vdf-communes-hero__titre {
  margin: 0 0 .7rem;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: clamp(1.7rem, 4.4vw, 3rem);
  line-height: 1.1;
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-communes-hero__titre::after {
  content: ""; display: block; width: 3.2rem; height: 2px;
  background: var(--vdf-or, #c2983f); margin-top: .9rem;
}
.vdf-communes-hero__meta { margin: 0 0 1.2rem; color: rgba(245, 240, 232, .72); font-size: .92rem; }
.vdf-communes-hero__cta { margin: 0 0 1.6rem; }

.vdf-communes-filtre { max-width: 420px; }
.vdf-communes-filtre__label {
  display: block; margin-bottom: .4rem;
  font-size: .74rem; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(245, 240, 232, .6);
}
.vdf-communes-filtre__champ {
  width: 100%; padding: .7rem .9rem;
  background: rgba(14, 22, 38, .7);
  border: 1px solid rgba(194, 152, 63, .45);
  color: var(--vdf-blanc-casse, #f5f0e8);
  font-size: 1rem; /* 16px minimum : en dessous, iOS zoome au focus */
}
.vdf-communes-filtre__champ:focus-visible { outline: 2px solid var(--vdf-or, #c2983f); outline-offset: 1px; }
.vdf-communes-filtre__compte { margin: .5rem 0 0; font-size: .82rem; color: rgba(245, 240, 232, .6); min-height: 1.2em; }

/* Index alphabétique : ancres internes, il reste utile sans JavaScript. */
.vdf-communes-alphabet {
  display: flex; flex-wrap: wrap; gap: .1rem .55rem;
  margin: 1.3rem 0 .2rem;
  padding-top: 1rem;
  border-top: 1px solid rgba(245, 240, 232, .12);
}
.vdf-communes-alphabet__lettre {
  min-width: 1.6rem; padding: .18rem .1rem;
  text-align: center; text-decoration: none;
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: .95rem;
  color: rgba(245, 240, 232, .8);
}
.vdf-communes-alphabet__lettre:hover,
.vdf-communes-alphabet__lettre:focus-visible { color: var(--vdf-or-clair, #e3c079); }
.vdf-communes-alphabet__lettre.est-inactif { color: rgba(245, 240, 232, .22); pointer-events: none; }

.vdf-communes-groupe { margin-bottom: 2rem; scroll-margin-top: 5rem; }
.vdf-communes-groupe__titre {
  display: flex; align-items: baseline; gap: .7rem;
  margin: 0 0 .5rem;
  padding-bottom: .35rem;
  border-bottom: 1px solid rgba(194, 152, 63, .35);
  font-family: var(--vdf-font-titre, Cinzel), serif;
  font-size: 1.2rem; letter-spacing: .06em;
  color: var(--vdf-or, #c2983f);
}
.vdf-communes-groupe__nb { font-family: inherit; font-size: .78rem; color: rgba(245, 240, 232, .45); }

.vdf-communes-groupe__liste {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: minmax(0, 1fr); /* 1 colonne à 390 px */
}
@media (min-width: 700px)  { .vdf-communes-groupe__liste { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 2rem; } }
@media (min-width: 1100px) { .vdf-communes-groupe__liste { grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: 2.4rem; } }

.vdf-commune__lien {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  padding: .5rem .2rem;
  border-bottom: 1px solid rgba(245, 240, 232, .09);
  color: var(--vdf-blanc-casse, #f5f0e8); text-decoration: none;
}
a.vdf-commune__lien:hover .vdf-commune__nom,
a.vdf-commune__lien:focus-visible .vdf-commune__nom { color: var(--vdf-or-clair, #e3c079); }
.vdf-commune__nom { font-size: .96rem; }
.vdf-commune__pop { font-size: .8rem; color: rgba(245, 240, 232, .5); white-space: nowrap; font-variant-numeric: tabular-nums; }
.vdf-commune__etoile { color: var(--vdf-or, #c2983f); font-size: .8em; }

/* Fiche pas encore publiée : la ligne reste, en retrait. Elle porte déjà une
   donnée utile (la population) et redeviendra cliquable à la publication. */
.vdf-commune--attente .vdf-commune__nom { color: rgba(245, 240, 232, .5); }
.vdf-commune--attente .vdf-commune__pop { color: rgba(245, 240, 232, .3); }

.vdf-communes-vide { padding: 2rem 0; color: rgba(245, 240, 232, .6); }
.vdf-communes-legende { margin: 1.4rem 0 0; font-size: .8rem; color: rgba(245, 240, 232, .5); }
.vdf-communes-legende span { color: var(--vdf-or, #c2983f); }

.vdf-communes-ariane { padding: 1rem 0 2.4rem; font-size: .8rem; }
.vdf-communes .vdf-ariane__liste { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .4rem; }
.vdf-communes .vdf-ariane__item:not(:last-child)::after { content: "›"; margin-left: .4rem; color: rgba(245, 240, 232, .4); } /* après le chaînon, comme le pilier (audit du 16/10, F13) */
.vdf-communes .vdf-ariane a { color: rgba(245, 240, 232, .7); text-decoration: none; }
.vdf-communes .vdf-ariane a:hover, .vdf-communes .vdf-ariane a:focus-visible { color: var(--vdf-or-clair, #e3c079); }
.vdf-communes .vdf-ariane [aria-current] { color: rgba(245, 240, 232, .45); }
/* Sur téléphone, le fil, le titre et le filtre touchaient le bord de l'écran, comme ceux du pilier
   avant le brief 18 : même marge, celle du contenu (audit du 16/10, F13). Tablette non visée
   par la décision « marge tablette oui » : inchangée. */
@media (max-width: 600px) {
  .vdf-dept .vdf-communes-hero,
  .vdf-dept .vdf-communes-ariane { padding-inline: var(--vdf-space-md); }
}

/* ============================================================================
 * ARCHIVE DES DÉPARTEMENTS ET 404 — gabarits créés le 20/08/2026.
 *
 * Aucune couleur en dur : tout vient des variables de charte. Ces deux pages n'avaient
 * aucun gabarit enfant et rendaient sur le blanc du thème parent.
 *
 * Volontairement SOBRE : ce sont des pages de service, pas des pages de contenu. Elles
 * empruntent la mise en page d'une section standard et n'ajoutent aucun composant.
 * ========================================================================== */
.vdf-archive-dept,
.vdf-404 {
  background: var(--vdf-fond-section);
  color: var(--vdf-blanc-casse);
  min-height: 60vh;
}

.vdf-archive-dept__titre,
.vdf-404__titre {
  font-family: var(--vdf-font-titre);
  font-size: var(--vdf-fs-h2);
  line-height: var(--vdf-lh-titre);
  letter-spacing: var(--vdf-ls-caps);
  color: var(--vdf-or);
  margin: 0 0 var(--vdf-space-sm);
}

.vdf-404__texte,
.vdf-archive-dept__vide {
  font-size: var(--vdf-fs-corps);
  line-height: var(--vdf-lh-corps);
  color: var(--vdf-blanc-casse);
  max-width: 46em;
}

.vdf-404__liens { margin: var(--vdf-space-md) 0 var(--vdf-space-sm); }
.vdf-404__secondaire { margin: 0; }

/* La liste des départements : une grille qui se réduit d'elle-même, sans media query. */
.vdf-archive-dept__liste {
  list-style: none;
  margin: var(--vdf-space-md) 0 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: var(--vdf-space-sm);
}

.vdf-archive-dept__lien {
  display: flex;
  align-items: baseline;
  gap: 0.7rem;
  padding: 0.9rem 1.1rem;
  background: var(--vdf-fond-carte);
  border: 1px solid rgba(194, 152, 63, 0.22);
  color: var(--vdf-blanc-casse);
  text-decoration: none;
  transition: background-color .2s ease, border-color .2s ease;
}

.vdf-archive-dept__lien:hover,
.vdf-archive-dept__lien:focus-visible {
  background: var(--vdf-fond-section-alt);
  border-color: var(--vdf-or);
  /* LA COULEUR DU TEXTE DOIT ETRE IMPOSEE ICI — mesure du 21/08/2026.
     Sans elle, le theme parent applique sa couleur de survol de lien, #333366, sur le
     fond bleu de la vignette : contraste 1,03, le nom du departement DISPARAIT au
     survol. Le defaut ne se voyait pas au repos — le harnais ne mesurait que des pages
     immobiles. */
  color: var(--vdf-blanc-casse);
}

.vdf-archive-dept__lien:hover .vdf-archive-dept__num,
.vdf-archive-dept__lien:focus-visible .vdf-archive-dept__num {
  color: var(--vdf-or-clair);
}

.vdf-archive-dept__num {
  font-family: var(--vdf-font-titre);
  color: var(--vdf-or);
  flex: none;
}

.vdf-archive-dept__nom { font-size: var(--vdf-fs-corps); }

/* La pagination du cœur de WordPress : on ne la restyle pas, on la met à la charte. */
.vdf-archive-dept .nav-links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin-top: var(--vdf-space-md);
}

.vdf-archive-dept .nav-links .page-numbers {
  padding: 0.5rem 0.85rem;
  border: 1px solid rgba(194, 152, 63, 0.28);
  color: var(--vdf-blanc-casse);
  text-decoration: none;
}

.vdf-archive-dept .nav-links .page-numbers.current,
.vdf-archive-dept .nav-links .page-numbers:hover {
  background: var(--vdf-or);
  color: var(--vdf-sur-or);
  border-color: var(--vdf-or);
}

/* ============================================================================
 * LE MARQUEUR DE LA CARTE DE SITUATION — 21/08/2026.
 *
 * Le fond de cette carte est passé au clair (voir `assets/js/carte-village.js`). Un point
 * doré cerclé de blanc, dessiné pour un fond nuit, s'y dilue : le blanc du cerne disparaît
 * dans le fond clair et il ne reste qu'une pastille sans contour.
 *
 * On lui donne donc un cerne SOMBRE sur cette carte, et une ombre portée qui le décolle du
 * fond quelle que soit la tuile en dessous. Portée par `.vdf-village-carte` : la carte
 * immersive et la carte 3D gardent le marqueur d'origine.
 * ========================================================================== */
.vdf-village-carte .vdf-marker__dot {
  border: 2px solid var(--vdf-fond-carto, #0b1120);
  box-shadow: 0 0 0 2px rgba(245, 240, 232, 0.85), 0 2px 6px rgba(0, 0, 0, 0.45);
}

/* Le cadre de la carte : sur fond clair, un liseré doré vaut mieux qu'un bord sombre qui
   trancherait avec les tuiles. */
.vdf-village-carte {
  border: 1px solid var(--vdf-or, #c2983f);
}

/* Les commandes de zoom de Leaflet, en charte plutôt qu'en gris navigateur. */
.vdf-village-carte .leaflet-bar a {
  background: var(--vdf-blanc-casse, #f5f0e8);
  color: var(--vdf-fond-section, #2b4377);
  border-bottom-color: rgba(43, 67, 119, 0.25);
}

.vdf-village-carte .leaflet-bar a:hover {
  background: var(--vdf-or-clair, #e3c079);
  color: var(--vdf-sur-or, #0e1626);
}

/* ============================================================================
 * LA GALERIE DE LA FICHE VILLAGE — 26/08/2026.
 *
 * JAMAIS D'ORPHELIN, même règle que les grilles de six déjà mesurées les 25 et 26/08 :
 * `auto-fit` avec un minimum produirait 4+2 ou 5+1 selon la largeur, donc une dernière
 * ligne dépareillée. On fixe donc le nombre de colonnes par palier, et chaque palier
 * divise proprement les tailles de galerie attendues (3, 4 ou 6 images) :
 *   au-dessus de 900 px : 3 colonnes  -> 3, 3+3, ou 3+1 pour 4 images
 *   de 560 à 900 px     : 2 colonnes  -> 2+2, 2+2+2
 *   sous 560 px         : 1 colonne
 * À 4 images en 3 colonnes il reste un orphelin : la 4e passe seule. C'est pourquoi la
 * démonstration se fait à 3 ou 6 images — signalé plutôt que masqué.
 * ========================================================================== */
.vdf-dept .vdf-galerie__grille {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--vdf-space-md, 1.5rem);
}
.vdf-dept .vdf-galerie__figure { margin: 0; }
.vdf-dept .vdf-galerie__img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  border: 1px solid rgba(194, 152, 63, .35);
}
/* Le crédit : petit, mais AU-DESSUS du seuil. Mesuré sur le fond de section #2b4377 —
   blanc cassé à 0,72 donne 6,4:1, largement au-delà des 4,5 exigés à cette taille. */
.vdf-dept .vdf-galerie__credit {
  margin: .4rem 0 0;
  font-size: .78rem;
  line-height: 1.4;
  color: rgba(245, 240, 232, .72);
}
@media (max-width: 900px) {
  .vdf-dept .vdf-galerie__grille { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 559px) {
  .vdf-dept .vdf-galerie__grille { grid-template-columns: 1fr; }
}

/* LE CRÉDIT DU HERO VILLAGE — 26/08/2026.
   En bas à droite, sur un fond local sombre : c'est lui qui tient le contraste, et non la
   photo, qui change d'une fiche à l'autre. Blanc cassé à 0,88 sur un noir à 0,55 composité
   donne un rapport très au-delà de 4,5, quelle que soit l'image dessous. */
/* PAS DE `position: relative` SUR __media — la ligne posée le 26/08 a cassé le hero.
   Le média est déjà en `position: absolute; inset: 0` : il EST donc le bloc conteneur de
   ses enfants absolus, et le crédit s'y positionne sans rien ajouter. Passer le média en
   `relative` annulait son `inset: 0` : il redevenait un item de flex à la taille
   intrinsèque de l'image, calé en bas à gauche — 478 x 326 px mesurés à 1700, soit 13 %
   de la section, le reste en bleu uni. */
/* LE CRÉDIT DU BANDEAU DÉPARTEMENT PARTAGE CETTE RÈGLE — 28/09/2026, signal 232.
   « Même place, même style » que le crédit village : ce n'est pas une copie, c'est le même
   bloc de déclarations, posé sur les deux classes. Il est ancré sur le <header> du bandeau
   (voir vdf_dept_hero_credit()), pas sur le cadre de la photo, trop large sur téléphone. */
.vdf-dept .vdf-village-hero__credit,
.vdf-dept .vdf-dept-hero__credit,
.vdf-dept .vdf-article-hero__credit {
  position: absolute;
  right: 0;
  bottom: 0;
  margin: 0;
  padding: .3rem .7rem;
  background: rgba(11, 17, 32, .55);
  color: rgba(245, 240, 232, .88);
  font-size: .72rem;
  font-style: italic;
  line-height: 1.3;
  max-width: 100%;
  z-index: 3;
}
@media (max-width: 559px) {
  .vdf-dept .vdf-village-hero__credit,
  .vdf-dept .vdf-dept-hero__credit,
  .vdf-dept .vdf-article-hero__credit { font-size: .66rem; padding: .25rem .5rem; }
}
/* DEUX ÉCARTS PROPRES AU DÉPARTEMENT, ET SEULEMENT DEUX.
   1. Le plan : sur les modèles signature, la barre de chiffres est en `z-index: 3` et
      couvre toute la largeur du bas du bandeau, voile compris. Au même plan, venue plus
      tard dans la page, elle passerait par-dessus le crédit. Le crédit monte donc à 4.
   2. La place : le cadre doré de la barre s'arrête à 1,5rem du bas, et le crédit mesure
      environ 1,5rem. Sans rien faire, le crédit touche le bord doré dès que la barre est
      large (six chiffres). Quand un crédit est saisi — et SEULEMENT alors, la classe
      `vdf-hero--credit` n'étant posée que dans ce cas —, la barre remonte d'autant. Les
      fiches sans crédit ne bougent pas d'un pixel. */
.vdf-dept .vdf-dept-hero__credit { z-index: 4; }
.vdf-dept--collector .vdf-hero--credit .vdf-hero__stats { padding-bottom: calc(1.5rem + 1.7rem); }

/* ============================================================================
   LA GRILLE DES VILLAGES DU PREMIUM, ET SON CORPS ÉTENDU AUX EXPÉRIENCES
   05/09/2026 — client du 04/09, vérifié le 05 sur Seine-Saint-Denis (93, premium).

   LE 4+2 QUE LE 105 N'AVAIT PAS VU. Il mesurait la seule famille `.vdf-vcard` : sa
   détection cherchait des enfants dont la classe contenait « vcard|carte|card », et la
   grille des villages du Premium s'appelle `.vdf-village`. Elle n'entrait dans aucun
   motif, donc personne ne la regardait — sauf le client, sur son écran, depuis le début.

   LA CAUSE, une ligne : `.vdf-dept .vdf-villages` (l. 221) était en
   `repeat(auto-fill, minmax(240px, 1fr))`. À 1200 px de fenêtre, auto-fill place QUATRE
   colonnes de 260 px, et six cartes donnent 4+2. C'est exactement le motif que la règle
   du 105 proscrit : jamais d'auto-fill sur une grille de six, parce que six se divise par
   6, 3 et 2 — jamais par 4. Mesuré avant le geste : 3+3 à 1024 et 1093, 4+2 à 1200, 1280
   et 1366.

   LA CORRECTION : la MÊME échelle que `.vdf-villages-grid`, à laquelle les expériences
   obéissent déjà, et la MÊME gouttière (3 px). Une seule règle de grille sur la page.

   PORTÉE : le Premium seul. Le Collector garde ses propres règles (l. 795 et suivantes,
   trois colonnes fixes) et n'est pas touché — il n'a d'ailleurs pas le défaut, sa grille
   n'a jamais été en auto-fill.
   ============================================================================ */
.vdf-dept .vdf-villages {
  grid-template-columns: repeat(var(--vdf-grid-count, 6), minmax(0, 1fr));
  gap: 3px;
}
/* LA GOUTTIERE RESTE A 3 px A TOUTES LES LARGEURS, et c'est mesure : les expériences,
   elles, sont a 3 px partout, parce que `.vdf-dept .vdf-secteur--experiences
   .vdf-villages-grid` (l. 1236, sans media query) bat la regle a 900. Rendre 32 px aux
   villages sous 900 aurait remis deux gouttieres differentes sur la meme page — ce que le
   client a signale. Une seule valeur pour les deux familles, c'est la consigne. */
@media (max-width: 900px) { .vdf-dept .vdf-villages { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 600px) { .vdf-dept .vdf-villages { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 380px) { .vdf-dept .vdf-villages { grid-template-columns: minmax(0, 1fr); } }

/* ----------------------------------------------------------------------------
   LE CORPS CLAIR DES VILLAGES, ÉTENDU AUX EXPÉRIENCES DU PREMIUM.

   « le blanc sous le texte comme les villages » : c'est `article.vdf-village` qui le
   porte — `background: var(--vdf-blanc-casse)`, l. 222 — et non une bordure. Le 120
   l'avait cherché sur la BORDURE, et sur Paris qui est Collector : il ne pouvait pas le
   trouver. Valeurs relevées au rendu sur le 93 : fond rgb(245,240,232), titre
   rgb(26,60,46) (--vdf-vert-foret), description rgb(85,85,85).

   On donne le même corps aux cartes expériences du PREMIUM. Le sélecteur est borné par
   `:not(.vdf-dept--collector):not(.vdf-dept--collection)` : ces deux modèles ont leur
   propre habillage sombre, ratifié, et le signal les met hors périmètre.

   Les secrets ne rendent pas sur Premium (garde $signature, décision client du 29/08) :
   il n'y a rien à leur appliquer.
   ---------------------------------------------------------------------------- */
/* Le 08/09, la carte VILLAGE du Premium rejoint ce corps clair : depuis le geste 146 elle
   est la même `.vdf-vcard` que la carte expérience (cf. le bloc daté en fin de feuille).
   Sans cette extension, les villages seraient restés sombres sur une section claire — un
   écart de plus, là où le signal en supprime. Les deux `:not()` gardent la Signature
   dehors : `.vdf-vcard__inner--village` existe aussi en Collector et en Collection. */
/* RESSERRE LE 08/09/2026, AU LOT 3 DU CHANTIER VILLAGE — et c'est une correction, pas
   un gout. Ces regles etaient bornees par `:not(--collector):not(--collection)`, un PROXY
   de « premium » qui etait exact tant que seules les fiches DEPARTEMENT portaient des
   `.vdf-vcard` : un departement est collector, collection ou premium, et rien d'autre.
   Le lot 2 a donne des `.vdf-vcard` a la fiche VILLAGE, qui porte `vdf-dept` sans porter
   aucun de ces deux modeles : le proxy l'a donc attrapee, et ses cartes « experiences »
   sont sorties en corps CLAIR pendant que ses cartes « secrets » restaient sombres — deux
   familles de couleurs differentes sur la meme page, exactement ce que le client signale
   depuis le 08/09. Vu a la capture, pas a la lecture.
   Le selecteur nomme desormais ce qu'il vise. Sur les fiches departement, `--premium` et
   `:not(collector):not(collection)` designent EXACTEMENT le meme ensemble : le resserrage
   ne peut donc rien changer pour elles, et c'est mesure au rapport 141-3. */
.vdf-dept--premium .vdf-vcard--exp .vdf-vcard__inner,
.vdf-dept--premium .vdf-vcard__inner--village {
  background: var(--vdf-blanc-casse);
  border-color: rgba(26, 60, 46, 0.14);
}
.vdf-dept--premium .vdf-vcard--exp .vdf-vcard__nom,
.vdf-dept--premium .vdf-vcard__inner--village .vdf-vcard__nom {
  color: var(--vdf-vert-foret);
}
.vdf-dept--premium .vdf-vcard--exp .vdf-vcard__desc,
.vdf-dept--premium .vdf-vcard__inner--village .vdf-vcard__desc {
  color: #555;
}
/* LE CRÉDIT PHOTO SUR LE CORPS CLAIR — 06/10/2026, signal 247 (mail du client du 03/10 :
   « le crédit photo des villages des fiches premium ne s'affiche pas »).
   La règle commune `.vdf-dept .vdf-vcard__credit` écrit le crédit en crème à 62 %, pensé
   pour les fonds sombres. Sur ce corps crème, c'était le fond lui-même : le crédit était
   rendu, à sa place, mais invisible (11 fiches Premium sur 15 en portent le 06/10). Même
   valeur que le crédit des bonnes adresses de la fiche village, déjà sur ce même fond
   (fin de feuille) : 6,08:1. La coupure des adresses longues est posée sur la règle
   commune (plus haut, même signal). */
.vdf-dept--premium .vdf-vcard--exp .vdf-vcard__credit,
.vdf-dept--premium .vdf-vcard__inner--village .vdf-vcard__credit {
  color: #5a5a5a;
}

/* LE BOUTON « DÉCOUVRIR » SUR LE CORPS CLAIR — mesuré, 05/09.
   Sur le fond crème, l'or de charte rgb(194,152,63) tombe à 1,70 au pire pixel (2,36 à
   850 et 1280) : c'est le même écueil que les icônes du bandeau univers, de l'or sur du
   clair. Les cartes villages n'avaient pas de bouton à copier — il n'y avait donc pas de
   précédent, et il fallait choisir dans LEUR palette plutôt qu'en inventer une.
   Le vert forêt est déjà la couleur de leur titre : il donne 10,7 sur ce fond. */
.vdf-dept--premium .vdf-vcard--exp .vdf-vcard__go {
  color: var(--vdf-vert-foret);
  background: rgba(26, 60, 46, 0.06);
}

/* ============================================================================
   LES DEUX FAMILLES AUX MÊMES DIMENSIONS — PREMIUM, 08/09/2026
   Client du 08/09 : « 6 blocs villages qui n'ont pas la même dimension que les 6 blocs
   expériences sur la même page ».

   LE 139 AVAIT UNIFIÉ LA RÈGLE, PAS LE COMPOSANT. Il a mis les deux grilles sur la même
   échelle de colonnes et la même gouttière de 3 px, et donné le corps clair aux
   expériences. Les cartes, elles, restaient deux composants distincts : `.vdf-village`
   pour les villages, `.vdf-vcard` pour les expériences. D'où quatre écarts, mesurés sur
   la Somme (#199) à 1 280 px avant ce geste :
       grille 1 200 contre 1 240 px · carte 197,5 contre 204,16 · média 206,2 contre
       303,23 · corps 124 à 148 contre 92 à 110.

   LE GESTE EST DANS LE PHP, PAS ICI : `vdf_render_villages()` rend désormais LE MÊME
   composant que les expériences, dans une section `.vdf-secteur--villages`. Les quatre
   écarts tombent par construction — la section hérite des marges à 20 px et du conteneur
   déplafonné (l. 1228-1233), la carte du `aspect-ratio: 2/3` (l. 1299-1302) et du corps
   commun (l. 1311). Il ne reste ici que ce que le PHP ne peut pas porter.

   LE PLANCHER DU CORPS, ET POURQUOI IL MANQUAIT. `--vdf-vcard-body-min` n'était déclaré
   que sur `.vdf-dept--collector` (l. 297). La Collection en hérite — son gabarit ajoute
   volontairement la classe `--collector`. LE PREMIUM, LUI, N'EN AVAIT AUCUN : la variable
   retombait sur `0px`, et chaque grille prenait la hauteur de sa plus haute carte, sans
   se soucier de l'autre. Deux titres sur deux lignes d'un côté, un seul de l'autre, et
   les deux familles ne finissaient pas à la même ligne.

   LA VALEUR EST MESURÉE, PAS CHOISIE AU GOÛT. Le titre est borné à 2 lignes
   (`-webkit-line-clamp: 2`, l. 1338) et la description aussi (l. 1345) : la hauteur du
   corps a donc un MAXIMUM calculable, et il a été relevé au rendu sur la carte la plus
   haute du 80 Somme à 1 280 px —
       8 (padding haut) + 35,88 (nom, 2 lignes) + 2,88 (marge) + 33,16 (desc, 2 lignes)
       + 30,40 (padding bas) = 110,32 px
   Aucune carte Premium ne peut dépasser cela : les quinze fiches Premium ne portent aucun
   crédit photo (vérifié en base, 0 sur 15), donc aucune ligne supplémentaire. Le plancher
   est posé à 111 px, l'entier immédiatement au-dessus. Toutes les cartes des deux
   familles font alors exactement la même hauteur, à toutes les largeurs.
   PÉRIMÉ LE 06/10/2026 (signal 247) : 11 des 15 fiches Premium portent un crédit photo
   village, sans limite de lignes. Sur ces fiches, les cartes village dépassent ce plancher
   et les deux familles n'ont plus la même hauteur ; c'était déjà le cas quand le crédit
   était invisible. Le plancher n'est pas changé ici.
   COMPLÉTÉ LE 09/10/2026 (signal 247, question H, « plancher à revoir ») : assets/js/premium-hauteur.js
   mesure au rendu le corps le plus haut des deux grilles et le pose sur <main> comme plancher
   commun, sans jamais descendre sous ces 111 px. Le nombre de lignes d'un crédit dépend de la
   largeur de la carte : aucune valeur fixe ici ne pouvait le couvrir. Sans JavaScript, 111 px.

   PÉRIMÈTRE. `.vdf-dept--premium` ne porte que le Premium ; Collector et Collection
   gardent leurs 120 px et leurs 140 px sous 600. Mesuré avant le geste : les sélecteurs
   touchés comptent 64 éléments sur deux pages Premium et ZÉRO sur Paris, le Haut-Rhin,
   le 93 et le 92.
   ============================================================================ */
.vdf-dept--premium { --vdf-vcard-body-min: 121px; } /* 111 + 10 px de place pour la flèche (signal 256) */

/* Le survol de la carte village passe le titre en teal (l. 1340), lisible sur le fond
   sombre de la Signature. Sur le corps clair du Premium, on garde le vert forêt du titre
   et on met la flèche en or comme les expériences : même famille, même comportement. */
.vdf-dept--premium .vdf-vcard__inner--village:not(.is-no-marker):not(.vdf-vcard__inner--attente):hover .vdf-vcard__nom,
.vdf-dept--premium .vdf-vcard__inner--village.is-active .vdf-vcard__nom {
  color: var(--vdf-vert-foret);
}
.vdf-dept--premium .vdf-vcard__inner--village .vdf-vcard__go {
  color: var(--vdf-vert-foret);
  background: rgba(26, 60, 46, 0.06);
}
/* 29/09, signal 238 : la carte village ACTIVE d'une fiche Premium garde son fond creme au survol et au focus.
   Le fond bleu nuit generique (.vdf-dept .vdf-vcard__inner:hover / :focus-visible) et la bordure teal des villages
   (0,5,0) battaient le corps creme et l'or Premium : au survol, nom vert fonce sur bleu nuit, contraste 1,11:1. */
.vdf-dept--premium .vdf-vcard__inner--village:not(.is-no-marker):not(.vdf-vcard__inner--attente):hover,
.vdf-dept--premium .vdf-vcard__inner--village:not(.vdf-vcard__inner--attente):hover,
.vdf-dept--premium .vdf-vcard__inner--village:focus-visible,
/* ... et quand la carte 3D la designe (marqueur survole ou choisi : .is-active / .is-selected, poses par
   carte-3d-departement.js). Controle adverse du 238 : la regle generique (l. 1319) la passait au bleu nuit,
   nom vert fonce, 1,11:1 mesure au pixel peint en posant les classes sur Orne. Aucune fiche Premium publiee
   n'a encore de marqueur ; les 14 en attente en auront. */
.vdf-dept--premium .vdf-vcard__inner--village.is-active,
.vdf-dept--premium .vdf-vcard__inner--village.is-selected { background: var(--vdf-blanc-casse); border-color: var(--vdf-or); }
.vdf-dept--premium .vdf-vcard__inner--village:hover .vdf-vcard__go,
.vdf-dept--premium .vdf-vcard__inner--village:focus-visible .vdf-vcard__go,
.vdf-dept--premium .vdf-vcard__inner--village.is-active .vdf-vcard__go,
.vdf-dept--premium .vdf-vcard__inner--village.is-selected .vdf-vcard__go {
  background: var(--vdf-or);
  color: var(--vdf-noir);
}

/* ============================================================================
   LOT 1 DU CHANTIER VILLAGE — LES BLOCS ÉDITORIAUX DES MAQUETTES. 08/09/2026.

   Client du 08/09 : la template de Riquewihr pour TOUS les villages. Les maquettes
   Eguisheim (68) et Baccarat (54) donnent l'ordre et le contenu ; LA CHARTE RESTE CELLE
   DU SITE, et c'est ce que fait ce bloc — il ne reprend aucune couleur des maquettes, il
   réutilise les variables déjà là (`--vdf-or`, `--vdf-blanc-casse`, `--vdf-fond-carte`)
   et les composants déjà écrits pour la fiche village.

   TOUT CE QUI SUIT NE S'APPLIQUE QU'À DES ÉLÉMENTS QUI N'EXISTENT PAS ENCORE : les cinq
   champs du lot 1 sont vides sur les 34 875 fiches. Aucune page ne change tant que
   personne n'a saisi de contenu — Briançon, témoin de ce chantier, comprise.
   ============================================================================ */

/* --- Les deux boutons du bandeau, côte à côte (maquettes) --- */
.vdf-village-hero__actions { display: flex; flex-wrap: wrap; gap: .8rem; margin: 0; }
.vdf-village-hero__film {
  display: inline-flex; align-items: center; gap: .6rem;
  padding: .7rem 1.4rem;
  border: 1px solid rgba(245, 240, 232, .38);
  color: var(--vdf-blanc-casse, #f5f0e8);
  text-decoration: none; text-transform: uppercase;
  font-size: .82rem; letter-spacing: .14em;
  transition: border-color .2s ease, background-color .2s ease;
}
.vdf-village-hero__film-ic {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 50%;
  border: 1px solid var(--vdf-or, #c2983f); color: var(--vdf-or, #c2983f);
}
.vdf-village-hero__film-ic svg { width: 11px; height: 11px; margin-left: 1px; }
.vdf-village-hero__film:hover,
.vdf-village-hero__film:focus-visible {
  border-color: var(--vdf-or, #c2983f); background: rgba(194, 152, 63, .12);
}

/* --- Le badge de gamme : encart haut-droite du bandeau (maquettes) ---
   En FLUX sous 900 px plutôt qu'en absolu : sur un bandeau compact, un encart absolu se
   pose par-dessus le nom de la commune. Le hero est déjà `position: relative`. */
.vdf-village-hero__badge {
  position: absolute; top: 1.6rem; right: 1.6rem; z-index: 2;
  display: flex; flex-direction: column; align-items: center; gap: .1rem;
  padding: .9rem 1.4rem;
  background: rgba(11, 16, 28, .72);
  border: 1px solid rgba(194, 152, 63, .5);
  backdrop-filter: blur(2px);
  text-align: center;
}
.vdf-village-badge__kicker {
  font-size: .6rem; letter-spacing: .22em; text-transform: uppercase;
  color: rgba(245, 240, 232, .78);
}
.vdf-village-badge__nom {
  font-family: var(--vdf-font-soustitre); font-size: 1.05rem; font-style: italic;
  color: var(--vdf-or-clair, #e3c079);
}
.vdf-village-badge__etoiles { font-size: .74rem; letter-spacing: .16em; color: var(--vdf-or, #c2983f); }
@media (max-width: 900px) {
  .vdf-village-hero__badge {
    position: static; align-self: flex-start; margin: 0 0 1rem;
    backdrop-filter: none;
  }
}

/* --- Les cinq clés : liste NUMÉROTÉE et VERTICALE, comme les deux maquettes ---
   La bande horizontale à cinq colonnes des maquettes est la BANDE DES CINQ UNIVERS, un
   autre bloc, qui vient au lot 2 : rendre les clés horizontalement aurait fabriqué deux
   blocs jumeaux indiscernables. */
.vdf-village-cles { padding: 1rem 0 2.6rem; }
.vdf-village-cles__panneau {
  max-width: 720px; margin: 0 auto;
  padding: 1.6rem 1.8rem 1.8rem;
  background: var(--vdf-fond-carte, rgba(38, 59, 105, .55));
  border: 1px solid rgba(194, 152, 63, .28);
}
.vdf-village-cles__liste { list-style: none; margin: 1.2rem 0 0; padding: 0; }
.vdf-village-cle {
  display: flex; align-items: flex-start; gap: 1rem;
  padding: .9rem 0;
  border-top: 1px solid rgba(245, 240, 232, .1);
}
.vdf-village-cle:first-child { border-top: 0; padding-top: 0; }
.vdf-village-cle__num {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 50%;
  border: 1px solid var(--vdf-or, #c2983f); color: var(--vdf-or-clair, #e3c079); /* or clair : mesure sous 4,5:1 en or de charte sur ce fond (158) */
  /* La bordure garde l'or de charte : un trait est un objet graphique, seuil 3:1, et 4,11 le passe. */
  font-size: .78rem; font-weight: 700;
}
.vdf-village-cle__corps { display: flex; flex-direction: column; gap: .2rem; }
.vdf-village-cle__titre {
  font-family: var(--vdf-font-titre); font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; font-size: .92rem;
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-village-cle__texte { font-size: .86rem; line-height: 1.55; color: rgba(245, 240, 232, .8); }

/* --- La FAQ : `details`/`summary` natifs, aucun script ajouté à la page --- */
.vdf-village-faq { padding: 1rem 0 2.6rem; }
.vdf-village-faq__liste { max-width: 720px; margin: 1.2rem auto 0; }
.vdf-village-faq__item { border-bottom: 1px solid rgba(245, 240, 232, .12); }
.vdf-village-faq__q {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: .95rem 0;
  color: var(--vdf-blanc-casse, #f5f0e8); font-size: .95rem;
}
.vdf-village-faq__q::-webkit-details-marker { display: none; }
/* Le signe est en ::after et non en contenu : il ne doit pas être lu par un lecteur
   d'écran, qui annonce déjà l'état ouvert/fermé du `details`.
   ---------------------------------------------------------------------------------
   21/09/2026, retour client : « la croix est trop petite ». Mesuré sur la fiche Cassis,
   avant correction :
       la ligne de la question .... 55 px de haut  -> déjà au-dessus des 44 px requis,
                                     et cliquable sur toute sa largeur, puisque c'est un
                                     `summary` natif : rien à faire de ce côté.
       le signe lui-même .......... 13,2 x 20 px   -> c'est LUI qui est trop petit
   Le contraste, lui, N'ÉTAIT PAS EN CAUSE : mes deux premières mesures annonçaient 2,67
   puis 1,92 pour 1, et elles étaient fausses — le harnais lisait les styles calculés avant
   que la feuille ne soit appliquée, et prenait le fond blanc du navigateur pour celui de
   la section. La capture montre ce que la mesure niait : or sur bleu nuit, au-dessus de
   3:1. L'or de la marque est donc conservé tel quel ; seul le survol l'éclaircit.
   On ne change ici que la TAILLE et la cible, qui étaient, elles, réellement trop petites. */
.vdf-village-faq__q::after {
  content: "+"; flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  inline-size: 44px; block-size: 44px; margin-inline-end: -.5rem;
  color: var(--vdf-or, #c2983f); font-size: 1.9rem; line-height: 1; font-weight: 300;
}
.vdf-village-faq__item[open] .vdf-village-faq__q::after { content: "\2212"; }
/* La ligne entière réagit au survol : le signe n'est pas une cible à viser. */
.vdf-village-faq__q:hover::after { color: #dab765; }
.vdf-village-faq__q:focus-visible { outline: 2px solid var(--vdf-or, #c2983f); outline-offset: 3px; }
.vdf-village-faq__r {
  padding: 0 0 1.1rem; font-size: .9rem; line-height: 1.65;
  color: rgba(245, 240, 232, .82);
}
.vdf-village-faq__r p { margin: 0 0 .6rem; }
.vdf-village-faq__r p:last-child { margin-bottom: 0; }

/* --- La citation, juste avant le renvoi au département (maquette Baccarat) --- */
.vdf-village-citation { padding: 1rem 0 2.6rem; }
.vdf-village-citation__bloc {
  position: relative; max-width: 780px; margin: 0 auto; padding: 1.6rem 1.8rem 1.6rem 3.4rem;
  background: var(--vdf-fond-carte, rgba(38, 59, 105, .55));
  border-left: 2px solid var(--vdf-or, #c2983f);
}
.vdf-village-citation__guillemet {
  position: absolute; left: 1.1rem; top: .55rem;
  font-family: var(--vdf-font-soustitre); font-size: 2.6rem; line-height: 1;
  color: var(--vdf-or, #c2983f); opacity: .75;
}
.vdf-village-citation__txt {
  margin: 0; font-family: var(--vdf-font-soustitre); font-style: italic;
  font-size: clamp(1.02rem, 1.8vw, 1.32rem); line-height: 1.5;
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-village-citation__auteur {
  margin-top: .8rem; font-size: .8rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--vdf-or-clair, #e3c079);
}

/* ============================================================================
   LOT 2 DU CHANTIER VILLAGE — LA BANDE DES CINQ UNIVERS. 08/09/2026.

   Décision de Dan du 08/09 : les blocs liés du village sont des RÉPÉTEURS sur la fiche,
   sur le motif des fiches département. Les trois blocs de CARTES n'ont donc besoin
   d'aucun style ici : ils rendent des `.vdf-vcard` dans des sections `.vdf-secteur--*`,
   et la page village porte déjà `class="vdf-dept vdf-village…"` — toutes les règles du
   composant unifié par le 146 s'y appliquent telles quelles. Seule la classe
   `--adresses` a dû être ajoutée aux quatre règles de section, plus haut.

   IL NE RESTE QUE LA BANDE DES UNIVERS, qui n'est pas une grille de cartes. Elle reprend
   le RENDU de la bande de /france/ — icône dorée, libellé en petites capitales, filets
   verticaux entre les entrées — et lui ajoute le texte court que les maquettes portent.

   5 / 3+2, JAMAIS 4+1, ET JAMAIS 2+2+1. Cinq se divise en 3+2 et en rien d'autre de
   propre : à deux colonnes, cinq entrées donneraient 2+2+1, un orphelin que la règle du
   105 proscrit. Sous la tablette, la bande passe donc à UNE colonne, pas à deux.
   ============================================================================ */
/* LE PLANCHER DU CORPS DE CARTE, POUR LA FICHE VILLAGE — mesuré, pas choisi.
   `--vdf-vcard-body-min` n'était déclaré que sur `.vdf-dept--collector` (l. 297, la
   Collection en hérite) et sur `.vdf-dept--premium` (geste du 146). La fiche village n'en
   avait aucun : la variable retombait sur 0, et chaque grille prenait la hauteur de sa
   plus haute carte sans se soucier des deux autres. Mesuré sur le banc à 6/6/6, avant ce
   plancher : 55 px d'écart entre familles à 850, 51 px à 390.

   LA VALEUR VIENT DU RENDU. Corps le plus haut relevé, toutes familles et toutes largeurs
   confondues : 126,70 px — une carte « adresse » à 390 px, avec son kicker de type de
   lieu, son nom sur deux lignes et sa description sur deux lignes. Titre et description
   étant bornés à 2 lignes chacun (`-webkit-line-clamp`), aucune carte ne peut dépasser
   cela. Plancher posé à 127, l'entier immédiatement au-dessus. */
.vdf-village { --vdf-vcard-body-min: 137px; } /* 127 + 10 (signal 256) */

.vdf-village-univers { padding: 2rem 0 1rem; }
.vdf-village-univers__liste {
  list-style: none; margin: 0; padding: 0;
  display: grid;
  grid-template-columns: repeat(var(--vdf-univ-count, 5), minmax(0, 1fr));
  gap: 1.4rem;
  align-items: start;
}
.vdf-village-univ {
  position: relative;
  display: flex; flex-direction: column; align-items: center; gap: .45rem;
  padding: 0 1rem; text-align: center;
}
/* Le filet vertical entre deux entrées, comme la bande du hub. En ::before sur l'entrée
   suivante : un séparateur en élément propre serait lu par les lecteurs d'écran. */
.vdf-village-univ + .vdf-village-univ::before {
  content: ""; position: absolute; left: 0; top: .35rem; bottom: .35rem;
  width: 1px; background: rgba(194, 152, 63, .28);
}
.vdf-village-univ__ic {
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px; color: var(--vdf-or, #c2983f);
}
.vdf-village-univ__ic svg { width: 100%; height: 100%; }
.vdf-village-univ__titre {
  font-family: var(--vdf-font-titre); font-weight: 700;
  font-size: .82rem; letter-spacing: .1em; text-transform: uppercase;
  color: var(--vdf-blanc-casse, #f5f0e8);
}
.vdf-village-univ__texte {
  font-size: .8rem; line-height: 1.5; color: rgba(245, 240, 232, .78);
}
@media (max-width: 1100px) {
  .vdf-village-univers__liste { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.6rem 1rem; }
  /* 3+2 : le filet ne doit pas apparaître en tête de la seconde rangée. */
  .vdf-village-univ:nth-child(3n + 1)::before { content: none; }
}
@media (max-width: 700px) {
  .vdf-village-univers__liste { grid-template-columns: minmax(0, 1fr); gap: 1.4rem; }
  .vdf-village-univ + .vdf-village-univ::before { content: none; }
  .vdf-village-univ { padding: 0; }
}

/* ============================================================================
   GABARIT VILLAGE — DEMANDE ÉCRITE DU CLIENT DU 11/09/2026.
   Le fond clair des bonnes adresses, et trois hauteurs ramenées d'un cran.

   UN CONSTAT À CONNAÎTRE AVANT DE LIRE CE BLOC, et il explique pourquoi les règles
   ci-dessous sont écrites avec TROIS classes et pas une :
   quatre déclarations de ce fichier posent un padding sur des sections du village —
   `.vdf-village-reperes` (2.6rem), `.vdf-village-recit` (1rem/2.6rem),
   `.vdf-village-situation` (1rem/2.6rem), `.vdf-village-univers` (2rem/1rem). AUCUNE
   NE S'APPLIQUE. Elles valent (0,1,0) et `.vdf-dept .vdf-section` vaut (0,2,0) : c'est
   cette dernière qui gagne, et toutes ces sections rendent 64 px en haut comme en bas.
   MESURÉ le 11/09 sur trois fiches et trois largeurs, pas déduit. Ces règles mortes ne
   sont pas supprimées ici — les signaler est un constat, les retirer serait un autre
   geste — mais il ne faut pas écrire un cinquième padding qui subirait le même sort.
   D'où `.vdf-village .vdf-section.vdf-village-*`, qui vaut (0,3,0) et ne dépend pas de
   l'ordre du fichier.
   ========================================================================== */

/* --- LES BONNES ADRESSES : C'EST LE CORPS DES CARTES QUI EST CRÈME — 11/09/2026, second
   geste. Le 156 avait lu « bloc blanc » comme « section claire » : la section passait en
   crème et les cartes restaient bleues. Or depuis le 28/08 le client appelle « la bande
   blanche » LE CORPS CRÈME SOUS LE TEXTE DES CARTES, celui des villages Premium qu'il cite
   en référence. C'est donc le contraste crème-sur-sombre des fiches Premium, et non deux
   clairs l'un sur l'autre.
   LA SECTION REVIENT À L'ALTERNANCE NORMALE : les deux règles du 156 sont retirées, pas
   neutralisées — une règle annulée par une autre est une dette, pas une correction.
   LE TRAITEMENT EST CELUI DU 139/146, repris tel quel : fond crème, bordure vert forêt à
   14 %, titre vert forêt, description grise, bouton dans la palette de la carte claire.
   L'OR NE SURVIT NULLE PART SUR CE CRÈME : il y est mesuré à 2,36:1. Le kicker et le
   crédit passent donc au vert forêt et au gris, comme le reste de la carte claire.
   Spécificité (0,3,0) : au-dessus des règles de carte sombre (0,2,0), y compris de l'or
   clair posé plus bas — sur un corps clair, c'est le vert forêt qui sert, acquis du 139.
   EXPÉRIENCES ET SECRETS NE BOUGENT PAS : le client n'a demandé que les adresses.
   07/10/2026, signal 252 : HÉBERGEMENTS ET ACTIVITÉS prennent le même corps crème, par les
   mêmes sept règles. Aucune couleur neuve. */
.vdf-village .vdf-village-adresses .vdf-vcard__inner,
.vdf-village .vdf-village-hebergements .vdf-vcard__inner,
.vdf-village .vdf-village-activites .vdf-vcard__inner {
  background: var(--vdf-blanc-casse);
  border-color: rgba(26, 60, 46, .14);
}
.vdf-village .vdf-village-adresses .vdf-vcard__nom,
.vdf-village .vdf-village-hebergements .vdf-vcard__nom,
.vdf-village .vdf-village-activites .vdf-vcard__nom { color: var(--vdf-vert-foret); }
.vdf-village .vdf-village-adresses .vdf-vcard__desc,
.vdf-village .vdf-village-hebergements .vdf-vcard__desc,
.vdf-village .vdf-village-activites .vdf-vcard__desc { color: #555; }
.vdf-village .vdf-village-adresses .vdf-vcard__kicker,
.vdf-village .vdf-village-hebergements .vdf-vcard__kicker,
.vdf-village .vdf-village-activites .vdf-vcard__kicker { color: var(--vdf-vert-foret); }
.vdf-village .vdf-village-adresses .vdf-vcard__credit,
.vdf-village .vdf-village-hebergements .vdf-vcard__credit,
.vdf-village .vdf-village-activites .vdf-vcard__credit { color: #5a5a5a; }
.vdf-village .vdf-village-adresses .vdf-vcard__more,
.vdf-village .vdf-village-hebergements .vdf-vcard__more,
.vdf-village .vdf-village-activites .vdf-vcard__more { color: var(--vdf-vert-foret); }
.vdf-village .vdf-village-adresses .vdf-vcard__go,
.vdf-village .vdf-village-hebergements .vdf-vcard__go,
.vdf-village .vdf-village-activites .vdf-vcard__go {
  color: var(--vdf-vert-foret);
  background: rgba(26, 60, 46, .06);
  border-color: rgba(26, 60, 46, .28);
}
/* LE SURVOL D'UNE CARTE CRÈME LIÉE GARDE SON FOND CRÈME — 07/10/2026, signal 252.
   Le fond bleu nuit générique (.vdf-dept .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover,
   0,4,0) battait le corps crème (0,3,0) : au survol, nom vert forêt sur bleu nuit, 1,11:1 au
   calcul. Défaut invisible en ligne tant qu'aucune adresse n'a de lien ; il serait apparu au
   premier hébergement lié. Même correctif que le Premium au 238, ici à 0,5,0, pour les trois
   familles crème, au survol, à l'appui et au focus clavier. Les deux valeurs existent déjà
   (le fond crème, la bordure de la flèche). Une carte sans lien n'est pas visée. */
.vdf-village .vdf-village-adresses .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover,
.vdf-village .vdf-village-adresses .vdf-vcard__inner:not(.vdf-vcard__inner--attente):active,
.vdf-village .vdf-village-adresses .vdf-vcard__inner:not(.vdf-vcard__inner--attente):focus-visible,
.vdf-village .vdf-village-hebergements .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover,
.vdf-village .vdf-village-hebergements .vdf-vcard__inner:not(.vdf-vcard__inner--attente):active,
.vdf-village .vdf-village-hebergements .vdf-vcard__inner:not(.vdf-vcard__inner--attente):focus-visible,
.vdf-village .vdf-village-activites .vdf-vcard__inner:not(.vdf-vcard__inner--attente):hover,
.vdf-village .vdf-village-activites .vdf-vcard__inner:not(.vdf-vcard__inner--attente):active,
.vdf-village .vdf-village-activites .vdf-vcard__inner:not(.vdf-vcard__inner--attente):focus-visible {
  background: var(--vdf-blanc-casse);
  border-color: rgba(26, 60, 46, .28);
}

/* --- LES TROIS HAUTEURS, D'UN CRAN DE L'ÉCHELLE MAISON ---
   L'échelle : xs .5rem / sm 1rem / md 2rem / lg 4rem / xl 6rem. Le cran appliqué est
   lg -> md, celui-là même qui a servi le 29/08 pour la bande verte « très épaisse ».
   La valeur n'est pas choisie au goût : elle descend d'un cran, et le résultat est mesuré.

   POURQUOI LE PADDING DU BAS SEULEMENT pour les deux bandes. Ce que le client appelle
   « la bande bleue sous les cinq univers » est l'espace vide continu entre le dernier
   contenu de la bande et le premier contenu du bloc suivant : 64 px de padding bas + 64 px
   de padding haut = 128 px, mesurés aux trois largeurs. Ramener les DEUX côtés d'un cran
   donnerait 64 px, soit 50 % de l'origine — sous le plancher de 60 % que le signal fixe.
   Ramener le seul côté bas donne 96 px, soit 75 % : c'est le cran, il passe le plancher,
   et il reste sur l'échelle. L'option à 50 % est rapportée, pas appliquée. */
.vdf-village .vdf-section.vdf-village-univers { padding-bottom: var(--vdf-space-md); }
.vdf-village .vdf-section.vdf-village-reperes { padding-bottom: var(--vdf-space-md); }
/* La section carte : « réduire légèrement ». Les deux côtés d'un cran, car ici la hauteur
   d'origine est celle de la SECTION (la carte elle-même n'est pas touchée) : 747 px à 1280,
   dont 128 px de seul padding. Attendu 683 px, soit 91 % — largement au-dessus du plancher. */
.vdf-village .vdf-section.vdf-village-situation { padding-block: var(--vdf-space-md); }

/* ===========================================================================
   UNE CARTE QUI NE MENE NULLE PART N'EST PAS CLIQUABLE — 16/09/2026.

   Le gabarit rend une <div> au lieu d'un <a> quand aucune destination n'existe
   (voir vdf_carte_enveloppe). Il reste a retirer TOUT ce qui promet un clic :
   le curseur de main, l'elevation au survol, le halo, le zoom de l'image. La
   fleche, elle, n'est pas rendue du tout.

   MEME REGIME QUE LES DEUX PRECEDENTS DU SITE : les departements en attente du
   pilier (.vdf-pilier-dep--attente) et les communes voisines non publiees
   (.vdf-village-proximite__item--attente, posee au 176). Jusqu'aux valeurs :
   c'est la meme attenuation, .5 sur le nom, .3 sur le texte secondaire.

   La carte garde son image, son nom et son texte : elle informe, elle ne
   promet pas.
   ========================================================================== */
.vdf-vcard__inner--attente,
.vdf-dept .vdf-vcard__inner--attente { cursor: default; } /* 29/09, signal 236 : seule, la premiere regle perdait contre .vdf-dept .vdf-vcard__inner (cursor: pointer, plus precise) : les cartes inertes gardaient la main, fiches village comprises. */
.vdf-vcard__inner--attente:hover,
.vdf-vcard__inner--attente:focus-within { transform: none; box-shadow: none; }
.vdf-vcard__inner--attente:hover .vdf-vcard__img { transform: none; }
/* 29/09, signal 237 : ces trois regles perdaient elles aussi contre les survols de .vdf-dept (plus precis) :
   la carte inerte se soulevait, prenait l'ombre et la bordure, l'image zoomait, le nom s'eclairait.
   Les regles de survol portent desormais :not(.vdf-vcard__inner--attente) ; une carte inerte ne
   reagit plus au survol, fiches village comprises. Les cartes actives ne changent pas. */
.vdf-vcard__inner--attente .vdf-vcard__nom  { color: rgba(245, 240, 232, .5); }
.vdf-vcard__inner--attente .vdf-vcard__desc { color: rgba(245, 240, 232, .3); }

/* ============================================================================
   LES PAGES DE LISTING PAR CATEGORIE — 22/09/2026, signal 221 phase 2.

   Elles REEMPLOIENT la grille des villages (`vdf-villages-grid`) plutot que d'en definir
   une autre : memes colonnes, memes ruptures, meme comportement deja mesure par le harnais
   de grilles. Seules les cartes ont leur propre classe, parce qu'elles portent un contenu
   different (un lieu, son departement, sa fiche d'origine).

   LES COULEURS SONT CELLES DE LA CHARTE, prises aux memes variables que le reste : le creme
   sur le bleu nuit pour l'en-tete, le vert foret sur le creme pour les cartes. Ce sont les
   couples deja mesures au-dessus des planchers sur les fiches departement.
   ============================================================================ */
.vdf-listing__tete { text-align: center; padding-block: clamp(2.4rem, 6vh, 4.2rem); }
.vdf-listing__eyebrow {
  font-family: var(--vdf-font-corps); font-weight: 600; text-transform: uppercase;
  letter-spacing: 0.32em; font-size: clamp(0.7rem, 1.1vw, 0.82rem);
  color: var(--vdf-or-clair); margin: 0 0 0.8rem;
}
/* LE TITRE UN PEU PLUS PETIT — 28/09/2026, signal 232 (retour du client : « le titre
   légèrement plus petit »). C'était l'échelle des bandeaux département, --vdf-fs-hero =
   clamp(2.6rem, 7vw, 5.5rem). Environ 15 % de moins à chaque largeur : 41,6 -> 35,2 px à
   390, 88 -> 75,2 px à 1280. La variable commune n'est pas touchée : les bandeaux gardent
   la leur. */
.vdf-listing__titre {
  font-family: var(--vdf-font-titre); text-transform: uppercase;
  letter-spacing: var(--vdf-ls-caps); font-size: clamp(2.2rem, 5.9vw, 4.7rem);
  color: var(--vdf-blanc-casse); margin: 0 0 1rem;
}
/* LE SOUS-TITRE, PUIS LA LIGNE DE DÉTAIL — signal 232. Le sous-titre prend l'italique des
   sous-titres de la charte (Playfair), la ligne de détail garde le corps de texte.
   `text-wrap: balance` répartit la ligne de détail en lignes égales : celle des
   expériences doit tenir sur DEUX lignes à l'ordinateur, et c'est mesuré, pas supposé. */
.vdf-listing__sous-titre {
  font-family: var(--vdf-font-soustitre); font-style: italic; font-weight: 500;
  font-size: clamp(1.2rem, 2.2vw, 1.5rem); line-height: 1.35;
  color: var(--vdf-blanc-casse); max-width: 40ch; margin: 0 auto 0.7rem; text-wrap: balance;
}
.vdf-listing__chapeau { color: var(--vdf-blanc-casse); max-width: 62ch; margin: 0 auto 0.8rem; text-wrap: balance; }
.vdf-listing__compte { color: var(--vdf-or-clair); font-weight: 600; margin: 0; }
/* L'EN-TÊTE DES SAVEURS ET BONNES ADRESSES — 20/10/2026, brief 63 (courriel du client).
   « Les Saveurs et Bonnes Adresses » sur une seule ligne : à l'échelle des autres listings, il
   dépassait le conteneur d'environ 21 %. MESURÉ sur la page en ligne (titre posé dans le
   navigateur) : plus grande taille sur une ligne 36,3 px à 768, 49,6 à 1024, 62 au conteneur de
   1200 ; d'où 4,6vw plafonné à 3,75rem (60 px au lieu de 75,2). Au téléphone, deux lignes : la
   plus grande taille sur deux lignes est 28,6 px à 360, 31,6 à 390 ; d'où 7,6vw plafonné à la
   taille d'avant (2,2rem). Le sous-titre prend l'or des intitulés de cet en-tête (surtitre,
   compte). Les deux autres listings et les pages dédiées (.vdf-ligne) ne sont pas touchés. */
.vdf-dept.vdf-listing[data-categorie="adresse"]:not(.vdf-ligne) .vdf-listing__titre { font-size: clamp(1.5rem, 7.6vw, 2.2rem); text-wrap: balance; }
@media (min-width: 768px) {
  .vdf-dept.vdf-listing[data-categorie="adresse"]:not(.vdf-ligne) .vdf-listing__titre { font-size: min(4.6vw, 3.75rem); }
}
.vdf-dept.vdf-listing[data-categorie="adresse"]:not(.vdf-ligne) .vdf-listing__sous-titre { color: var(--vdf-or-clair); }

.vdf-listing__filtre { padding-block: clamp(1.2rem, 3vh, 2rem); }
.vdf-listing__form { display: flex; flex-wrap: wrap; gap: 0.7rem; align-items: center; }
/*
 * LA PAGE EST SUR FOND SOMBRE, ET C'EST MESURE — 22/09/2026.
 *
 * Ma premiere version colorait le filtre et la pagination en vert forêt, comme s'ils
 * étaient posés sur du clair. Mesure au pixel peint sur l'aperçu, à 1280 px :
 *      « Département »   vert #1a3c2e sur bleu #2b4377 ....... 1,26:1
 *      « Suivant »       idem ................................ 1,34:1
 *      « Page 1 sur 33 » idem ................................ 1,26:1
 * pour un plancher de 4,5. Le crème sur ce même fond donne 8,52:1, et c'est la valeur
 * déjà employée par les sections sombres des fiches département.
 */
.vdf-listing__label { font-weight: 600; color: var(--vdf-blanc-casse); }
.vdf-listing__select {
  flex: 1 1 16rem; min-height: 44px; padding: 0.5rem 0.7rem;
  border: 1px solid var(--vdf-or); border-radius: 4px; background: #fff;
  color: var(--vdf-vert-foret); font-size: 1rem;
}
/* LE THEME PARENT HABILLE LES BOUTONS, ET IL GAGNAIT. Mesure : le libellé « Afficher »
   sortait en rose #cc3366 sur le bleu nuit, à 1,92:1, alors que cette règle demandait du
   crème sur vert forêt. Un sélecteur d'un cran plus précis suffit, et le contraste est
   revérifié après coup plutôt que supposé. */
.vdf-listing .vdf-listing__bouton,
.vdf-listing .vdf-listing__bouton:hover,
.vdf-listing .vdf-listing__bouton:focus {
  min-height: 44px; padding: 0.5rem 1.2rem; border: 1px solid var(--vdf-or); border-radius: 4px;
  cursor: pointer; background: var(--vdf-vert-foret); color: var(--vdf-blanc-casse);
  font-family: var(--vdf-font-corps); font-weight: 600; letter-spacing: 0.06em;
}
.vdf-listing .vdf-listing__raz { min-height: 44px; display: inline-flex; align-items: center; color: var(--vdf-or-clair); }

.vdf-lcard { list-style: none; }
.vdf-lcard__inner {
  display: flex; flex-direction: column; height: 100%; text-decoration: none;
  background: var(--vdf-blanc-casse); border: 1px solid rgba(194, 152, 63, 0.35);
  border-radius: var(--vdf-radius); overflow: hidden;
}
.vdf-lcard__inner:hover { border-color: var(--vdf-or); }
/* LE CADRE PHOTO PLUS HAUT — signal 232 : 4/3 -> carré. La photo servie est le dérivé
   portrait 2/3 (vdf_cardp_picture) : un cadre plus haut en montre DAVANTAGE, il ne rogne
   pas plus. */
.vdf-lcard__media { aspect-ratio: 1 / 1; overflow: hidden; }
.vdf-lcard__img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* LA PHOTO NE REMPLISSAIT PAS LE CADRE — signal 232, défaut trouvé sur la capture.
   `.vdf-dept img { height: auto }` (l. 234, spécificité 0,1,1) bat `.vdf-lcard__img`
   (0,1,0) : la hauteur de l'image retombait sur `auto`, elle gardait son propre format et
   `object-fit: cover` n'agissait pas. C'est le piège que GARDE-FOUS.md consigne au 20/08
   (« une classe seule ne bat pas une classe plus un élément »), quatrième occurrence.
   MESURÉ à 850 px sur l'Ariège, avant correction :
     - dérivé portrait 520x780, cadre 375x375 : image 375x563 calée EN HAUT, le bas coupé
       au lieu d'un recadrage centré (défaut antérieur au signal : en 4/3 déjà, on voyait
       la moitié HAUTE de la photo) ;
     - source trop petite pour le dérivé (Niaux_Cave_Entrance-520x399, paysage) : image
       375x288 et 87 px de vide crème dessous — visible depuis le cadre carré de ce signal.
   Après : 17 cadres remplis sur 17, les deux formes de source (mesuré par injection avant
   d'écrire cette règle). */
.vdf-dept .vdf-lcard__img { height: 100%; }
/* UN MOT PLUS LARGE QUE LA CARTE SE COUPE AU LIEU D'ÊTRE ROGNÉ — signal 245. En cinq colonnes la
   colonne de texte fait 117 à 190 px, moins qu'un mot long en capitales, et `.vdf-lcard__inner`
   coupe ce qui dépasse (overflow: hidden). MESURÉ dans Chrome sur les 89 pages des deux listings
   (1 771 cartes) le 02/10/2026, avant cette règle : 211 titres rognés par le bord de la carte à
   901 px de large, 125 à 960, 25 à 1024 (on y lisait « INTERDEPARTEM » pour INTERDEPARTEMENTAL),
   6 à 1100, 2 de 1280 à 1920 ; et 2 descriptions à 901 px, dont une est un mot saisi sans
   espaces. Défaut antérieur au 232 (lu dans le code, non mesuré). La règle est posée sur le CORPS
   de la carte et non sur le seul titre : `overflow-wrap` s'hérite, le lieu, le titre, la
   description et la source la reçoivent tous. La rangée « Dans le Mag » et la carte unique du
   Mag l'avaient déjà sur leur titre (mag.css, 242 et 243). `break-word` ne coupe qu'un mot qui
   déborderait de sa colonne ; mais il coupe AUSSI celui qui débordait dans la marge sans être
   rogné (voir la taille du titre, plus bas, qui évite la plupart de ces coupes). */
.vdf-lcard__corps { padding: 1rem 1.1rem 1.2rem; display: flex; flex-direction: column; gap: 0.35rem; overflow-wrap: break-word; }
/* L'OR FONCE NE PASSE PAS SUR LE CREME : mesure 3,03:1 pour un plancher de 4,5, ce texte
   étant petit. Le brun ci-dessous est pris dans la même famille et remesuré après. */
.vdf-lcard__lieu {
  font-family: var(--vdf-font-corps); font-size: 0.72rem; font-weight: 600;
  letter-spacing: 0.16em; color: #6d5512; margin: 0;
}
/* LE TITRE DE CARTE EN GRAS — signal 232. Il sortait en graisse 500, que Cinzel n'a pas :
   seules la 400 et la 700 sont hébergées (vdf-fonts.css), le navigateur rendait donc la
   400. La 700 est une vraie graisse, pas un gras simulé. */
.vdf-lcard__nom {
  font-family: var(--vdf-font-titre); font-size: 1.15rem; font-weight: 700; line-height: 1.25;
  color: var(--vdf-vert-foret); margin: 0;
}
.vdf-lcard__desc { font-size: 0.95rem; color: #3a3a3a; margin: 0; }
.vdf-lcard__source { font-size: 0.8rem; color: #5a5a5a; margin: 0.2rem 0 0; }
/* SANS IMAGE, PAS DE CADRE VIDE : la carte se resserre au lieu de montrer un trou. */
.vdf-lcard--nu .vdf-lcard__corps { padding-block: 1.4rem; }

/* ============================================================================
   UNE CARTE DE MOINS PAR RANGÉE — 28/09/2026, signal 232.

   Retour du client : « la largeur du bloc un peu petit, surtout le cadre photo ». Les
   listings suivaient jusqu'ici la grille des fiches (6 / 3 / 2 / 1). Ils ont désormais
   la leur, une carte de moins à chaque palier :
       au-delà de 900 px ... 6 -> 5
       601 à 900 px ....... 3 -> 2
       jusqu'à 600 px ..... 2 -> 1   (et 1 sous 380 px, qui l'était déjà)
   Spécificité (0,3,0) : passe devant `.vdf-dept .vdf-villages-grid` et ses media
   queries (0,2,0), quel que soit l'ordre du fichier. La grille des FICHES n'est pas
   touchée : ces règles ne visent que `.vdf-listing`.
   ============================================================================ */
.vdf-dept.vdf-listing .vdf-listing__grille { grid-template-columns: repeat(5, minmax(0, 1fr)); }
@media (max-width: 900px) { .vdf-dept.vdf-listing .vdf-listing__grille { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 600px) { .vdf-dept.vdf-listing .vdf-listing__grille { grid-template-columns: minmax(0, 1fr); } }
/* LE TITRE UN PEU PLUS PETIT LÀ OÙ LES CARTES SONT ÉTROITES — signal 245, choix de Dan (« titres
   ajustés »). La césure seule (`overflow-wrap`, plus haut) supprimait tout rognage, mais coupait
   aussi les mots qui dépassaient un peu sans être rognés : 144 titres à 1024 px de large, dont
   103 avec une seule lettre rejetée à la ligne (« GASTRONOMI » puis « E » sur 67 cartes), 535 à
   901 px. Avec ce titre, essayé par injection sur les 89 pages : 17 titres ont encore un mot
   coupé à 1024 px, 48 à 901 px, et aucun n'est rogné. 14,4 px à 901 px de large, 15,97 px à
   1024, et la taille de base (1.15rem) à partir de 1180 px : la taille ne change ni au-delà, ni
   en une ou deux colonnes. `not all and (max-width: 900px)` est le complément exact du seuil de
   la grille (une fenêtre de 900,5 px est en cinq colonnes). Ne sont PAS visées les cartes
   rendues en largeur : la carte restée seule sur sa rangée (5n+1 et dernière), et la carte
   unique de la page Le Mag (760 px, mag.css). La carte unique d'un listing filtré, elle, reste
   en colonne : elle reçoit la petite taille (revue adverse du 245). */
@media not all and (max-width: 900px) {
  .vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard:not(:nth-child(5n+1):last-child) .vdf-lcard__nom,
  .vdf-dept.vdf-listing:not(.vdf-mag) .vdf-listing__grille > .vdf-lcard:only-child .vdf-lcard__nom { font-size: clamp(0.9rem, 1.56vw, 1.15rem); }
}

/* LA CARTE RESTÉE SEULE SUR SA RANGÉE S'ÉTEND EN LARGEUR — signal 232.
   Vingt cartes par page remplissent toutes les rangées d'une page pleine. Mais la dernière
   page et le filtre par département rendent un nombre quelconque : à deux colonnes, tout
   nombre impair laisse une carte seule ; à cinq, tout nombre en 5n+1. C'est l'orphelin
   que la règle du 105 proscrit ailleurs sur le site.
   La carte seule prend alors toute la rangée, photo à gauche et texte à droite. Sa photo
   garde la largeur d'une colonne : elle a la même taille que les autres, et le `sizes`
   du gabarit reste exact. `align-self: flex-start` garde le cadre carré : étirée à la
   hauteur du texte, la photo perdrait son format. */
@media (min-width: 901px) {
  .vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard:nth-child(5n+1):last-child:not(:first-child) { grid-column: 1 / -1; }
  .vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard:nth-child(5n+1):last-child:not(:first-child) .vdf-lcard__inner { flex-direction: row; }
  .vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard:nth-child(5n+1):last-child:not(:first-child) .vdf-lcard__media { flex: 0 0 calc((100% - 4 * var(--vdf-space-sm)) / 5); align-self: flex-start; }
}
@media (min-width: 601px) and (max-width: 900px) {
  .vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard:nth-child(2n+1):last-child:not(:first-child) { grid-column: 1 / -1; }
  .vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard:nth-child(2n+1):last-child:not(:first-child) .vdf-lcard__inner { flex-direction: row; }
  .vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard:nth-child(2n+1):last-child:not(:first-child) .vdf-lcard__media { flex: 0 0 calc((100% - var(--vdf-space-md)) / 2); align-self: flex-start; }
}
.vdf-dept.vdf-listing .vdf-listing__grille > .vdf-lcard .vdf-lcard__corps { min-width: 0; flex: 1 1 auto; }

/* LES VIGNETTES DU LISTING DES EXPÉRIENCES AGRANDIES — brief 29, demande du client du 16/10.
   Au-delà de 900 px, quatre colonnes au lieu de cinq, sur /experiences/ SEULEMENT : la photo
   carrée passe de 225 à 286 px de côté (carte de 227 à 288 px) dans le conteneur de 1200 px. Le listing des secrets, les
   fiches et les voisins des pages dédiées (même balisage, mais .vdf-ligne) ne changent pas
   ([data-categorie] et :not(.vdf-ligne) les écartent ; spécificité (0,5,0) et plus, devant les
   règles des cinq colonnes). Vingt cartes par page font cinq rangées de quatre ; la carte
   restée seule devient la 4n+1 et non plus la 5n+1. Le `sizes` des vignettes de ce listing suit
   (listing-categories.php). */
@media (min-width: 901px) {
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard:nth-child(5n+1):last-child:not(:first-child) { grid-column: auto; }
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard:nth-child(5n+1):last-child:not(:first-child) .vdf-lcard__inner { flex-direction: column; }
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard:nth-child(5n+1):last-child:not(:first-child) .vdf-lcard__media { flex: initial; align-self: auto; }
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard:nth-child(4n+1):last-child:not(:first-child) { grid-column: 1 / -1; }
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard:nth-child(4n+1):last-child:not(:first-child) .vdf-lcard__inner { flex-direction: row; }
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard:nth-child(4n+1):last-child:not(:first-child) .vdf-lcard__media { flex: 0 0 calc((100% - 3 * var(--vdf-space-sm)) / 4); align-self: flex-start; }
  /* Titre : la petite taille des colonnes pour toutes les cartes en colonne, la taille de base
     pour la carte seule rendue en largeur (même partage que les cinq colonnes, signal 245). */
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard .vdf-lcard__nom { font-size: clamp(0.9rem, 1.56vw, 1.15rem); }
  .vdf-dept.vdf-listing[data-categorie="experience"]:not(.vdf-ligne) .vdf-listing__grille > .vdf-lcard:nth-child(4n+1):last-child:not(:first-child) .vdf-lcard__nom { font-size: 1.15rem; }
}

.vdf-listing__pages {
  display: flex; gap: 1rem; align-items: center; justify-content: center;
  margin-top: clamp(1.6rem, 4vh, 2.6rem); flex-wrap: wrap;
}
.vdf-listing .vdf-listing__page {
  min-height: 44px; display: inline-flex; align-items: center; padding: 0 1rem;
  border: 1px solid var(--vdf-or); border-radius: 4px; color: var(--vdf-blanc-casse);
  text-decoration: none; font-weight: 600;
}
.vdf-listing .vdf-listing__page:hover { background: rgba(245, 240, 232, 0.12); }
.vdf-listing__page-etat { color: var(--vdf-blanc-casse); }
.vdf-listing__vide { color: var(--vdf-blanc-casse); }

/* ============================================================================
   LES PAGES DÉDIÉES D'UNE EXPÉRIENCE OU D'UN SECRET — 07/10/2026, signal 251.

   template-parts/fiche-element.php, servi par la page listing : <main> porte
   `.vdf-dept.vdf-listing.vdf-ligne`, donc l'en-tête sombre, la grille et les cartes
   `.vdf-lcard` du listing s'appliquent tels quels aux voisins. Ce bloc n'ajoute que ce
   que le listing n'a pas. Préfixe `vdf-ligne` vérifié absent du thème avant adoption.
   Couleurs : les variables de la charte, aux couples déjà mesurés sur fond sombre
   (crème sur bleu, or clair sur bleu). Toute règle sur une image passe par `.vdf-dept`
   (GARDE-FOUS : `.vdf-dept img { height: auto }` bat une classe seule).
   Ces classes n'existent sur aucune page avant la phase 1 : rien d'autre ne bouge.
   ============================================================================ */
.vdf-ligne .vdf-ariane { margin: 0 0 1.4rem; font-size: 0.8rem; }
.vdf-ligne .vdf-ariane__liste {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; justify-content: center; gap: 0.4rem;
}
.vdf-ligne .vdf-ariane__item + .vdf-ariane__item::before { content: "›"; margin-right: 0.4rem; color: rgba(245, 240, 232, 0.4); }
.vdf-ligne .vdf-ariane a { color: rgba(245, 240, 232, 0.75); text-decoration: none; }
.vdf-ligne .vdf-ariane a:hover,
.vdf-ligne .vdf-ariane a:focus-visible { color: var(--vdf-or-clair); }
/* Revue du 251 : 0,6 donnait 4,19:1 à 12,8 px, sous le seuil AA ; 0,75 donne 5,6:1. Le dernier
   élément tient sur une ligne, coupé par des points de suspension : le titre entier est le h1
   juste dessous, et le JSON-LD du fil le garde en entier. */
.vdf-ligne .vdf-ariane [aria-current] { color: rgba(245, 240, 232, 0.75); }
.vdf-ligne .vdf-ariane__item:last-child { min-width: 0; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* LE TITRE DE LA PAGE DÉDIÉE A SA PROPRE ÉCHELLE — revue du 251. Celle du listing
   (clamp(2.2rem, 5.9vw, 4.7rem), espacement 0,08em) est faite pour « LES EXPÉRIENCES » : sur
   un titre saisi, elle coupait les mots en plein milieu à 360 px (GASTRONOMI / E) et un titre
   de 121 caractères remplissait l'écran. (0,3,0) bat `.vdf-listing__titre` (0,1,0).
   MESURÉ le 09/10 (Chromium sans tête, en local, polices et feuille du thème, 1 312 titres
   distincts des listings du 02/10, h1 en 500) : mots coupés hors trait d'union à 360 / 375 px,
   91 / 63 avant, 1 / 0 après ; h1 le plus haut à 375 px, 507 px avant, 202 après ; 4 lignes
   ou plus à 375 px, 227 avant, 10 après. `hyphens: auto` a été essayé et ÉCARTÉ : il coupait
   environ 190 titres de plus à 375 px (COU-CHER, reli-gieux), et 9 à 1 280 px où rien ne
   l'exige. overflow-wrap reste le dernier recours (INTERDEPARTEMENTAL à 320 px). */
.vdf-dept.vdf-ligne .vdf-ligne__titre {
  font-size: clamp(1.5rem, 4.2vw, 3rem); letter-spacing: 0.04em;
  hyphens: manual; overflow-wrap: break-word;
}
.vdf-ligne__chapeau { color: var(--vdf-blanc-casse); max-width: 62ch; margin: 0 auto; text-wrap: pretty; }

.vdf-dept.vdf-ligne .vdf-ligne__corps-section,
.vdf-dept.vdf-ligne .vdf-ligne__porteuse,
.vdf-dept.vdf-ligne .vdf-ligne__voisins,
.vdf-dept.vdf-ligne .vdf-ligne__tous-section,
.vdf-dept.vdf-ligne .vdf-village-situation { padding-block: var(--vdf-space-md); } /* brief 55 : la carte des pages dédiées */
/* LE BLANC SOUS L'EN-TÊTE AU TÉLÉPHONE — brief 34 (défaut relevé le 16/10, brief 32). L'en-tête
   garde le bas de `.vdf-dept .vdf-section` (4rem) et le corps ajoute son haut (2rem) : 96 px vides
   entre le sous-titre et le texte, sur un même fond (mesuré sur 20 pages dédiées à 390 px, avec ou
   sans photo). Au téléphone, le bas de l'en-tête passe à 2rem : 64 px, l'écart qui sépare déjà les
   sections suivantes de la page. Ordinateur et tablette inchangés ; listings inchangés (.vdf-ligne). */
@media (max-width: 600px) {
  .vdf-dept.vdf-ligne .vdf-ligne__tete { padding-bottom: var(--vdf-space-md); }
}
/* `.vdf-dept` en tête : `.vdf-dept .vdf-container` (0,2,0) fixe déjà la largeur. */
/* Sans média, c'est le TEXTE qui est limité, pas le conteneur : un conteneur de 760 px centré
   décalait la ligne « Département : … » de 220 px par rapport aux blocs suivants (revue du 251). */
.vdf-dept .vdf-ligne__corps .vdf-ligne__texte { max-width: 760px; }
.vdf-dept .vdf-ligne__corps--media { max-width: var(--vdf-container); display: grid; gap: var(--vdf-space-md); align-items: start; }
@media (min-width: 901px) {
  .vdf-dept .vdf-ligne__corps--media { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
}
.vdf-ligne__media { margin: 0; max-width: 460px; }
.vdf-dept .vdf-ligne__img { display: block; width: 100%; height: auto; border-radius: var(--vdf-radius); }
.vdf-ligne__credit {
  margin: 0.4rem 0 0; font-size: 0.75rem; line-height: 1.3; font-style: italic;
  color: rgba(245, 240, 232, 0.7); overflow-wrap: break-word;
}
.vdf-ligne__media--icone {
  display: flex; align-items: center; justify-content: center;
  width: min(100%, 280px); aspect-ratio: 1 / 1; border-radius: var(--vdf-radius);
  background: var(--vdf-fond-carte); border: 1px solid rgba(194, 152, 63, 0.35); color: var(--vdf-or);
}
.vdf-ligne__media--icone .vdf-icone-svg { width: 38%; height: auto; }
.vdf-ligne__texte { min-width: 0; color: var(--vdf-blanc-casse); }
.vdf-ligne__recit p { margin: 0 0 1rem; max-width: 70ch; }
.vdf-ligne__action { margin: 0 0 1.2rem; }
.vdf-ligne__partenaires { display: flex; flex-wrap: wrap; gap: var(--vdf-space-sm); } /* brief 55, réponse 1 */
.vdf-ligne__situation { margin: 0; font-size: 0.9rem; color: rgba(245, 240, 232, 0.8); }

.vdf-ligne__h2 {
  font-family: var(--vdf-font-titre); font-size: clamp(1.25rem, 2.7vw, 1.8rem); line-height: 1.2;
  color: var(--vdf-or-clair); margin: 0 0 1.2rem;
}
.vdf-ligne__fiche {
  display: flex; gap: 1.2rem; align-items: center; max-width: 640px; padding: 0.8rem;
  background: var(--vdf-fond-carte); border: 1px solid rgba(194, 152, 63, 0.35); border-radius: var(--vdf-radius);
  color: var(--vdf-blanc-casse); text-decoration: none;
}
.vdf-ligne__fiche:hover,
.vdf-ligne__fiche:focus-visible { border-color: var(--vdf-or); color: var(--vdf-blanc-casse); }
/* La couleur est imposée au survol : sans elle, `a:hover { color: #336 }` du thème parent
   (0,1,1) passe le nom de la fiche en #333366 sur #263b69, 1,06:1 (même piège qu'à la
   l. 2428, vignettes de l'archive, 21/08). */
.vdf-ligne__fiche-media { flex: 0 0 min(40%, 240px); }
.vdf-dept .vdf-ligne__fiche-img { display: block; width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: cover; border-radius: calc(var(--vdf-radius) - 4px); }
.vdf-ligne__fiche-corps { display: flex; flex-direction: column; gap: 0.3rem; min-width: 0; overflow-wrap: break-word; }
.vdf-ligne__fiche-libelle {
  font-size: 0.72rem; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; color: var(--vdf-or-clair);
}
.vdf-ligne__fiche-nom { font-family: var(--vdf-font-titre); font-size: 1.25rem; font-weight: 700; line-height: 1.2; }
.vdf-ligne__fiche-credit { font-size: 0.72rem; font-style: italic; color: rgba(245, 240, 232, 0.7); }
.vdf-ligne__fiche-voir { margin-top: 0.3rem; font-weight: 600; color: var(--vdf-or-clair); text-decoration: underline; text-underline-offset: 3px; }
@media (max-width: 600px) {
  .vdf-ligne__fiche { flex-direction: column; align-items: stretch; }
  .vdf-ligne__fiche-media { flex-basis: auto; }
}
.vdf-dept.vdf-ligne .vdf-ligne__tous {
  min-height: 44px; display: inline-flex; align-items: center; padding: 0 1.1rem;
  border: 1px solid var(--vdf-or); border-radius: 4px; color: var(--vdf-blanc-casse);
  text-decoration: none; font-weight: 600;
}
.vdf-dept.vdf-ligne .vdf-ligne__tous:hover,
.vdf-dept.vdf-ligne .vdf-ligne__tous:focus-visible { background: rgba(245, 240, 232, 0.12); }

/* Le crédit photo d'une carte de listing (phase 2 et pages dédiées) : brun discret sur le
   crème de la carte, comme la ligne « source » (#5a5a5a sur #f5f0e8, plus de 6:1). */
.vdf-lcard__credit { font-size: 0.72rem; line-height: 1.3; font-style: italic; color: #5a5a5a; margin: 0; overflow-wrap: break-word; }

/* « Toutes les expériences (N) » sous les cartes des fiches (phase 2). */
.vdf-dept .vdf-secteur__tous { margin: var(--vdf-space-sm) 0 0; font-weight: 600; }
/* Soulignement imposé : le reset Hello (a { text-decoration: none }) l'ôtait, et le lien
   n'avait plus aucun indice de lien (revue du 251). */
.vdf-dept .vdf-secteur__tous a { color: var(--vdf-or-clair); text-decoration: underline; text-underline-offset: 3px; }
.vdf-dept .vdf-secteur__tous a:hover,
.vdf-dept .vdf-secteur__tous a:focus-visible { color: var(--vdf-blanc-casse); }

/* LE BLOC « AVIS » (13/10/2026, inc/avis.php) : une citation et son auteur, sur la page dédiée d'une expérience et
   dans le bloc « Avis » d'une fiche village. Couleurs de la charte, lisibles sur les fonds sombres. */
.vdf-avis { margin: 1.4rem 0; padding: 1rem 1.25rem; border-left: 3px solid var(--vdf-or, #c9a84c);
  background: rgba(245, 240, 232, .05); border-radius: 0 var(--vdf-radius, 10px) var(--vdf-radius, 10px) 0; max-width: 70ch; }
.vdf-avis__sujet { margin: 0 0 .4rem; font-size: .8rem; letter-spacing: .08em; text-transform: uppercase; color: var(--vdf-or-clair, #e3c079); }
.vdf-avis__texte { margin: 0; }
.vdf-avis__texte p { margin: 0 0 .5rem; font-style: italic; line-height: 1.65; color: var(--vdf-blanc-casse, #f5f0e8); }
.vdf-avis__texte p:last-child { margin-bottom: 0; }
.vdf-avis__texte p:first-child::before { content: "«\00a0"; }
.vdf-avis__texte p:last-child::after { content: "\00a0»"; }
.vdf-avis__auteur { margin-top: .5rem; font-size: .9rem; color: rgba(245, 240, 232, .75); }
.vdf-village-avis { margin-top: 2rem; }
.vdf-village-avis__titre { max-width: 720px; margin: 0 auto 1rem; font-family: var(--vdf-font-titre, Cinzel), serif; color: var(--vdf-or-clair, #e3c079); }
.vdf-village-avis .vdf-avis__liste { display: grid; gap: 1rem; max-width: 720px; margin: 0 auto; }

/* LISIBILITÉ AU TÉLÉPHONE — brief 27, 16/10/2026, décision « lisibilité oui » (DES-18, UX-08).
   600 px et moins seulement : tablette et ordinateur inchangés.
   - Texte des cartes à 13 px (cartes des fiches, des listings et « Où la retrouver ») : il
     descendait à 11,8 px (description), 11,5 px (lieu), 10,9 px (« Découvrir ») et 8,8 px
     (surtitre « Village »). Les titres des cartes, déjà plus grands, ne bougent pas.
   - Crédits photo à 12 px (cartes, bandeaux des fiches et des articles) : 10,6 à 11,5 px. Le
     crédit du bandeau prend 1rem de marge intérieure : son texte ne colle plus au bord.
   - Libellés du formulaire de contact en or clair de la charte : 5,56:1 sur le fond de
     section (or 3,62:1). L'or des titres ne change pas. */
@media (max-width: 600px) {
  .vdf-dept .vdf-vcard__desc,
  .vdf-dept .vdf-vcard__kicker,
  .vdf-dept .vdf-vcard__more,
  .vdf-dept .vdf-lcard__lieu,
  .vdf-dept .vdf-lcard__source,
  .vdf-dept .vdf-ligne__fiche-libelle { font-size: 13px; }
  .vdf-dept .vdf-vcard__credit,
  .vdf-dept .vdf-lcard__credit,
  .vdf-dept .vdf-ligne__fiche-credit { font-size: 12px; }
  .vdf-dept .vdf-village-hero__credit,
  .vdf-dept .vdf-dept-hero__credit,
  .vdf-dept .vdf-article-hero__credit { font-size: 12px; padding: .25rem 1rem; }
  .vdf-contact__champ label { color: var(--vdf-or-clair, #e3c079); }
}

/* LE RÉCIT DE LA PAGE DÉDIÉE D'UNE EXPÉRIENCE — brief 31, variante A (demande du client du 16/10 :
   « les récits ne sont pas suffisamment développés », examiner l'affichage sans reprise des données).
   Le texte saisi reste entier et inchangé ; il prend un titre (« Le récit », même style que « Où la
   retrouver ») et un corps de lecture : 1,125 rem au lieu de 1 rem, interligne 1,7, 65 signes par ligne
   au plus. Les pages des secrets n'ont pas le titre et gardent leur corps. */
.vdf-dept.vdf-ligne--experience .vdf-ligne__recit-titre { margin-bottom: 0.8rem; }
.vdf-dept.vdf-ligne--experience .vdf-ligne__recit p { font-size: 1.125rem; line-height: 1.7; max-width: 65ch; margin-bottom: 1.2rem; }

/* LE TEXTE DES EXPÉRIENCES SUR LES CARTES — brief 31, variante B. Rien en base : on montre ce qui est saisi.
   Fiche Village : l'accroche jusqu'à 4 lignes (2 avant), puis le début du récit de la page dédiée (4 lignes)
   et « Lire la suite » quand la carte y mène. Une ou deux expériences (756 fiches publiées sur 849 en ont
   une seule) : carte horizontale, la photo ou l'icône à gauche, au lieu d'une carte portrait de toute la
   largeur (1 120 x 1 790 px à 1 440, une ligne de texte de 12 px en bas). Listing des expériences : le
   début du récit sous l'accroche (3 lignes) et « Lire la suite ». */
.vdf-dept .vdf-village-experiences .vdf-vcard__desc { -webkit-line-clamp: 4; }
.vdf-dept .vdf-vcard__recit {
  font-size: .74rem; line-height: 1.45; color: rgba(245, 240, 232, .86); margin: .4rem 0 0;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden;
}
.vdf-dept .vdf-vcard__suite {
  display: inline-block; margin-top: .45rem; font-size: .74rem; font-weight: 600; color: var(--vdf-or-clair);
  text-decoration: underline; text-underline-offset: 3px;
}
.vdf-dept .vdf-village-experiences--peu .vdf-villages-grid { grid-template-columns: minmax(0, 1fr); gap: var(--vdf-space-md); }
@media (min-width: 601px) {
  .vdf-dept .vdf-village-experiences--peu .vdf-vcard__inner { display: grid; grid-template-columns: minmax(0, 320px) minmax(0, 1fr); max-width: 980px; }
  .vdf-dept .vdf-village-experiences--peu .vdf-villages-grid .vdf-vcard__media { aspect-ratio: auto; height: 100%; min-height: 240px; } /* la hauteur suit le texte : un rapport fixe élargissait la photo sur le texte */
  .vdf-dept .vdf-village-experiences--peu .vdf-vcard__body { padding: 1.3rem 1.6rem calc(1rem + 26px + .6rem); align-self: center; }
  .vdf-dept .vdf-village-experiences--peu .vdf-vcard__nom { font-size: 1.3rem; -webkit-line-clamp: 3; margin-bottom: .5rem; }
}
.vdf-dept .vdf-village-experiences--peu .vdf-vcard__desc { font-size: 1rem; line-height: 1.5; -webkit-line-clamp: 6; }
.vdf-dept .vdf-village-experiences--peu .vdf-vcard__recit { font-size: 1rem; line-height: 1.6; -webkit-line-clamp: 5; }
.vdf-dept .vdf-village-experiences--peu .vdf-vcard__suite { font-size: .95rem; }
@media (max-width: 600px) {
  .vdf-dept .vdf-village-experiences--peu .vdf-villages-grid .vdf-vcard__media { aspect-ratio: 3 / 2; }
  .vdf-dept .vdf-village-experiences--peu .vdf-vcard__nom { font-size: 1.1rem; }
}
.vdf-lcard__recit {
  font-size: .9rem; line-height: 1.5; color: #4a4a4a; margin: 0;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;
}
.vdf-lcard__suite { font-size: .85rem; font-weight: 600; color: var(--vdf-vert-foret); text-decoration: underline; text-underline-offset: 3px; }

/* LE TEXTE ENTIER — brief 31, variante C (sur la B). Une ou deux expériences sur la fiche Village : le récit
   en entier sur la carte horizontale, sans coupe ; listing des expériences : le récit en entier sous
   l'accroche. Les grilles de trois à six cartes gardent la coupe de la B (4 lignes). La catégorie de
   l'expérience en surtitre de la carte (« Nature et paysages »). */
.vdf-dept .vdf-village-experiences--peu .vdf-vcard__desc,
.vdf-dept .vdf-village-experiences--peu .vdf-vcard__recit,
.vdf-lcard__recit { display: block; -webkit-line-clamp: unset; overflow: visible; }
.vdf-dept .vdf-village-experiences--peu .vdf-vcard__kicker { font-size: .7rem; margin-bottom: .45rem; }
.vdf-dept .vdf-village-experiences--peu .vdf-vcard__desc { font-family: var(--vdf-font-corps); font-style: italic; color: rgba(245, 240, 232, .9); }

/* LE NOM DU VILLAGE EN BLANC — demande écrite du client du 21/10 (brief 72) : dans « Vivez … autrement » et
   « Les secrets de … » des fiches Village, le début reste en or clair (couleur des titres de la fiche), le nom
   passe dans le blanc du texte de la page. Texte, balise h2 et taille inchangés : un <span> autour du nom. */
.vdf-village .vdf-secteur__titre-nom { color: var(--vdf-blanc-casse, #f5f0e8); }

/* LA LISTE DES LIEUX SOUS LE BANDEAU — demande écrite du client du 21/10 (brief 72, variante V1, retenue le 22/10) :
   « suppression des cartouches superposés aux images hero ». La liste des points d'intérêt sort du bandeau
   (inc/departement-render.php) et se lit juste dessous, sur le fond de la page, sans le panneau sombre flouté ;
   icône, nom et description gardent leur style. Réponse 1 du 22/10 : visible aussi à l'ordinateur, au même endroit,
   les lieux en colonnes ; les repères posés sur la photo (« TOUR EIFFEL » à Paris) ne s'affichent plus. Données et
   outil de pose des repères inchangés ; cadre doré du titre inchangé. */
.vdf-dept--collector .vdf-hero__poi { display: none; }
.vdf-dept--collector .vdf-hero-lieux { padding: 1.6rem var(--vdf-space-md); }
.vdf-dept--collector .vdf-hero-lieux .vdf-hero__poi-liste {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: .4rem 2.2rem;
  position: static; list-style: none; margin: 0; padding: 0; background: none; border: 0; border-radius: 0;
  -webkit-backdrop-filter: none; backdrop-filter: none;
}
.vdf-dept--collector .vdf-hero-lieux .vdf-poi-item { display: flex; align-items: center; gap: .6rem; padding: .5rem 0; border-bottom: 1px solid rgba(245, 240, 232, .1); }
.vdf-dept--collector .vdf-hero-lieux .vdf-poi-item a { text-decoration: none; display: flex; align-items: center; gap: .6rem; min-width: 0; }
.vdf-dept--collector .vdf-hero-lieux .vdf-poi-item__ic { flex: none; display: inline-flex; color: var(--vdf-or); }
.vdf-dept--collector .vdf-hero-lieux .vdf-poi-item__ic-svg { width: 21px; height: 21px; }
.vdf-dept--collector .vdf-hero-lieux .vdf-poi-item__txt { display: block; min-width: 0; }
.vdf-dept--collector .vdf-hero-lieux .vdf-poi-item__nom { display: block; font-family: var(--vdf-font-titre); text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.8rem; line-height: 1.25; color: var(--vdf-blanc-casse); }
.vdf-dept--collector .vdf-hero-lieux .vdf-poi-item__desc { display: block; margin: .1rem 0 0; font-size: .74rem; line-height: 1.35; color: rgba(245, 240, 232, .8); }
@media (max-width: 900px) {
  .vdf-dept--collector .vdf-hero-lieux { padding: 1.4rem 1.25rem; }
  .vdf-dept--collector .vdf-hero-lieux .vdf-hero__poi-liste { display: block; }
  .vdf-dept--collector .vdf-hero-lieux .vdf-poi-item:last-child { border-bottom: 0; }
}
@media (max-width: 600px) { .vdf-dept--collector .vdf-hero-lieux { padding: var(--vdf-space-sm); } }

/* L'ACCROCHE ENTIÈRE — réponse 1 du 22/10 au brief 72 (« l'affichage de l'accroche complète, suivi du début du
   récit ») : dans les grilles de trois à six cartes de la fiche Village, l'accroche n'est plus coupée (4 lignes en B
   et C) ; le début du récit (4 lignes) et « Lire la suite » ne changent pas. Une ou deux expériences : déjà entière. */
.vdf-dept .vdf-village-experiences .vdf-vcard__desc { display: block; -webkit-line-clamp: unset; overflow: visible; }

/* LE TÉLÉPHONE DES FICHES VILLAGES ET DÉPARTEMENTS — brief 117, courriels de Serge Blanchard du 27/10 (17h52 à
   18h14 : Pérouges, Seyssel, Ambronay, Allier ; « une correction globale des modèles concernés […] sans dégradation
   de la présentation sur ordinateur »). Sous 640 px SEULEMENT : tablettes et ordinateurs ne changent pas d'un pixel.
   Ni couleur de texte, ni police, ni taille de titre ne changent ; le cadrage choisi par le client reste celui de
   la fiche (--vdf-cadrage).
   Villages avec photo (bandeau plein) :
   ▸ la photo prend la place qui reste dans le premier écran au-dessus du crédit et du bloc bleu nuit (brief
     121) : le bandeau fait la hauteur de l'écran visible (100svh ; l'en-tête, fixe et transparent, est posé
     sur la photo), le bloc garde sa hauteur naturelle, et le bouton « Découvrir » finit en bas du premier
     écran. La photo n'est jamais plus haute que large (décision de Dan du 28/10), ni plus basse qu'un 16:9 :
     au-delà d'un carré, le bandeau s'arrête plus tôt ; sous un 16:9 (titre très long sur un petit écran), il
     dépasse l'écran plutôt que de couper le bloc. Grille : la photo a sa propre rangée, le crédit la suivante
     (sous-grille), et min-content / max-content donnent au bandeau ses deux bornes (photo en 16:9, photo
     carrée). Sans sous-grille, la photo garde son rapport et le 16:9 d'avant, plafonnée au carré ;
   ▸ le bloc bleu nuit sous la photo se resserre : marges du département, du titre et de la description, et
     place sous le bouton « Découvrir » (rapproché de la description) ; le bouton garde sa taille ;
   ▸ les sections qui suivent commencent à 2rem au lieu de 4rem (un cran de l'échelle, comme le 11/09) : le
     pictogramme de la section suivante n'est plus précédé d'une bande vide. */
@media (max-width: 639px) {
  .vdf-dept.vdf-village--plein .vdf-village-hero__media,
  .vdf-dept.vdf-village--plein .vdf-village-hero__media:has(> .vdf-village-hero__credit) > picture {
    max-height: min(75vh, 100vw); max-height: min(75svh, 100vw);
  }
  @supports (grid-template-rows: subgrid) {
    .vdf-dept.vdf-village--plein .vdf-village-hero {
      display: grid; grid-template-columns: minmax(0, 1fr); align-content: start;
      grid-template-rows: minmax(calc(100vw * 9 / 16), 100vw) auto auto auto;
      height: 100vh; height: 100svh; min-height: min-content; max-height: max-content;
    }
    .vdf-dept.vdf-village--plein .vdf-village-hero__media,
    .vdf-dept.vdf-village--plein .vdf-village-hero__media:has(> .vdf-village-hero__credit) {
      grid-row: 1 / span 2; display: grid; grid-template-columns: minmax(0, 1fr); grid-template-rows: subgrid;
      aspect-ratio: auto; min-height: 0; max-height: none;
    }
    .vdf-dept.vdf-village--plein .vdf-village-hero__media:has(> .vdf-village-hero__credit) > picture {
      aspect-ratio: auto; min-height: 0; max-height: none;
    }
    .vdf-dept.vdf-village--plein .vdf-village-hero__contenu { grid-row: 3; }
    .vdf-dept.vdf-village--plein .vdf-village-hero__badge { grid-row: 4; justify-self: start; }
  }
  .vdf-dept.vdf-village--plein .vdf-village-hero__contenu { padding: 1rem 0 1.25rem; }
  .vdf-dept.vdf-village--plein .vdf-village-hero__surtitre { margin-bottom: .45rem; }
  .vdf-dept.vdf-village--plein .vdf-village-hero__nom { margin-bottom: .35rem; }
  .vdf-dept.vdf-village--plein .vdf-village-hero__accroche,
  .vdf-dept.vdf-village--plein .vdf-village-hero__situation { margin-bottom: .9rem; }
  .vdf-dept.vdf-village--plein .vdf-section { padding-top: var(--vdf-space-md); }
}
/* Départements, bandeau Collector et Collection (le modèle des fiches qui portent les deux cartouches sur la photo ;
   le Premium n'en a pas) : le voile bleu nuit posé sur la photo derrière le cartouche du numéro, du nom et de la
   présentation, et celui du cartouche des chiffres, deviennent nettement plus transparents (au bas du bandeau,
   0,62 au lieu de 0,96 ; derrière les chiffres, 0,28 au lieu de 0,62). Cadres dorés et couleurs des textes
   inchangés. La lisibilité passe des voiles aux textes eux-mêmes (« un léger voile ou une ombre portée sur le texte
   plutôt qu'un fond opaque », décision de Dan du 27/10) : une ombre portée sombre et serrée autour des textes clairs ;
   autour du numéro doré, une ombre plus dense et un petit voile à sa mesure, comme celui qui porte déjà les deux
   libellés dorés (F19, brief 23). Contraste mesuré sur les zones les plus claires des photos : rapport du brief 117. */
@media (max-width: 639px) {
  .vdf-dept.vdf-dept--collector .vdf-hero::after {
    background: linear-gradient(0deg,
      rgba(11, 16, 28, .62) 0%, rgba(11, 16, 28, .5) 36%, rgba(11, 16, 28, .32) 62%,
      rgba(11, 16, 28, .1) 84%, rgba(11, 16, 28, 0) 100%);
  }
  .vdf-dept.vdf-dept--collector .vdf-hero__stats {
    background: linear-gradient(0deg, rgba(11, 16, 28, .28) 0%, rgba(11, 16, 28, .12) 60%, rgba(11, 16, 28, 0) 100%);
  }
  .vdf-dept.vdf-dept--collector .vdf-hero__desc,
  .vdf-dept.vdf-dept--collector .vdf-hero__stat-val {
    text-shadow: 0 0 1px #0b101c, 0 0 2px #0b101c, 0 0 3px #0b101c, 0 0 6px rgba(11, 16, 28, .9),
      0 0 12px rgba(11, 16, 28, .7), 0 0 22px rgba(11, 16, 28, .45);
  }
  /* Nom (grand texte sur le ciel clair, Paris, Alpes-Maritimes) et petits libellés des chiffres : ombre plus dense,
     4,5:1 au moins à 360 px (mesuré sur le test). */
  .vdf-dept.vdf-dept--collector .vdf-hero__stat-lab {
    text-shadow: 0 0 1px #0b101c, 0 0 2px #0b101c, 0 0 3px #0b101c, 0 0 4px #0b101c, 0 0 6px #0b101c,
      0 0 12px rgba(11, 16, 28, .8), 0 0 22px rgba(11, 16, 28, .5);
  }
  .vdf-dept.vdf-dept--collector .vdf-hero__nom {
    text-shadow: 0 0 1px #0b101c, 0 0 2px #0b101c, 0 0 3px #0b101c, 0 0 5px #0b101c, 0 0 8px #0b101c,
      0 0 10px #0b101c, 0 0 14px rgba(11, 16, 28, .9), 0 0 26px rgba(11, 16, 28, .6);
  }
  .vdf-dept.vdf-dept--collector .vdf-hero__num {
    width: fit-content; margin-inline: auto; border-radius: 4px;
    background: rgba(11, 16, 28, .9); box-shadow: 0 0 14px 8px rgba(11, 16, 28, .9);
    text-shadow: 0 0 3px #0b101c, 0 0 5px #0b101c, 0 0 8px #0b101c, 0 0 8px #0b101c,
      0 0 16px rgba(11, 16, 28, .9), 0 0 32px rgba(11, 16, 28, .6);
  }
}
