/* =========================================================
   Feuille de style unique — design sobre et moderne
   Palette neutre, facile à personnaliser (voir variables ci-dessous)
   ========================================================= */

:root {
    --couleur-fond:        #ffffff;
    --couleur-surface:     #ffffff;
    --couleur-encre:       #171814;   /* quasi-noir : texte + fond du header */
    --couleur-encre-claire:#f4f2ec;   /* texte clair sur fond sombre */
    --couleur-texte:       var(--couleur-encre);
    --couleur-texte-doux:  #5c5f57;
    --couleur-bordure:     #e4e1d8;

    --couleur-accent:      #b0442b;   /* rouge brique */
    --couleur-accent-fonce:#8a3520;
    --couleur-danger:      #c62828;
    --couleur-succes:      #2f6a44;
    --couleur-succes-fond: #eaf3ec;
    --couleur-erreur-fond: #fbeceb;
    --couleur-attention:   #d9a520;   /* jaune ambré — badge « réservé » */

    --couleur-kaki:        #6b6f47;   /* vert kaki — touche seconde guerre, utilisée avec parcimonie */
    --couleur-kaki-fonce:   #52553a;
    --couleur-kaki-fond:    #e3e1cb;  /* fond teinté kaki/militaire (plus soutenu qu'un vert pastel) */
    --couleur-kaki-fond-vif:rgba(107, 111, 71, 0.12);
    --couleur-gris-fonce:   #34342f;  /* gris foncé chaud (remplace le kaki du fond "Coup de cœur" le 13/07/2026) */

    --rayon: 10px;
    --ombre: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
    /* Typographie unifiée (27/07/2026, demande Enzo — Option 3 "famille
       unique, cohérente" validée sur l'aperçu de la page annonce) : une
       seule famille de caractères (Barlow) déclinée en deux graisses/
       largeurs pour les titres et le texte courant, à la place de l'ancien
       mélange Oswald (titres) + IBM Plex Sans (texte) + Bebas Neue
       (accroches en gros caractères, désormais retirée partout — voir
       .page-hero .intro-page h1, .fiche-detail__prix et
       .site-footer__logo-texte plus bas). */
    --police: 'Barlow', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    --police-titres: 'Barlow Semi Condensed', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}

* { box-sizing: border-box; }

/* ⚠️ 29/07/2026 (bande blanche signalée par Enzo en haut de l'accueil,
   visible en descendant puis remontant rapidement dans la page) : le
   header (.header-b__principal) est en `position: sticky; top: 0`, tout
   premier élément du <body> — rien ne couvre donc l'espace au-dessus de
   lui. Quand le défilement dépasse le haut du document (rebond élastique
   du trackpad/souris à molette lors d'un retour rapide vers le haut —
   "overscroll"/"rubber-band"), le navigateur découvre brièvement cette
   zone hors document et affiche le fond de la page <html> à la place —
   blanc par défaut, d'où la bande blanche au-dessus du header (dont le
   propre fond, lui, reste correct). Corrigé par deux moyens
   complémentaires : (1) `overscroll-behavior-y: none` empêche ce rebond
   d'aller au-delà du haut réel du document (Chrome/Edge/Firefox — geste
   simplement absorbé, aucun impact sur le défilement normal) ; (2) en
   filet de sécurité pour les navigateurs qui autorisent quand même un
   léger rebond visuel (Safari notamment), le fond de <html> est aligné
   sur `--couleur-encre` (la couleur du header) plutôt que blanc — un
   éventuel reste de rebond redevient donc invisible au lieu de former une
   bande blanche contrastée. */
html {
    background-color: var(--couleur-encre);
    overscroll-behavior-y: none;
    /* 31/07/2026 : renfort de la propriété raccourcie (couvre x et y) en
       plus de -y ci-dessus, pour les navigateurs qui la préfèrent. */
    overscroll-behavior: none;
}

body {
    margin: 0;
    font-family: var(--police);
    background: var(--couleur-fond);
    color: var(--couleur-texte);
    line-height: 1.5;
    overscroll-behavior-y: none;
    /* ⚠️ 25/07/2026 : filet de sécurité pour les blocs qui débordent
       volontairement jusqu'aux bords de la fenêtre via `width:100vw` +
       marges négatives (.page-hero, .accueil-layout, .bloc-accueil,
       .fiche-detail__similaires...). `100vw` inclut la largeur d'une
       éventuelle scrollbar verticale "classique" (non-overlay), alors que
       le reste du document se cale sur la largeur visible réelle (hors
       scrollbar) — sur un appareil avec scrollbar classique (tablette avec
       trackpad/souris type Surface, Chromebook...), ces blocs devenaient
       très légèrement plus larges que l'écran, ce qui pouvait provoquer un
       débordement horizontal. N'affecte pas les défilements horizontaux
       volontaires internes (glissière, galerie photo, vignettes), qui
       utilisent leur propre overflow-x:auto imbriqué. */
    overflow-x: hidden;
}

h1, h2, h3,
.carte-annonce__titre, .carte-annonce__categorie,
.bouton-principal, .bouton-secondaire, .bouton-danger,
.barre-filtres button,
.tableau-admin th {
    font-family: var(--police-titres);
}

a { color: var(--couleur-accent-fonce); text-decoration: none; }
a:hover { text-decoration: underline; }

/* --- Icônes SVG maison (touches de décor sobres) ----------------------- */
.icone {
    width: 15px;
    height: 15px;
    display: inline-block;
    vertical-align: -2px;
    flex-shrink: 0;
}

.conteneur {
    max-width: 1100px;
    margin: 0 auto;
    padding: 0 20px;
}

/* Conteneur élargi pour les pages de listing (accueil, à vendre, vendu) :
   permet des cartes annonces un peu plus grandes et une grille à 4 colonnes
   confortable. */
main.page-principale--large { max-width: 1400px; }

/* --- Espace admin : header ----------------------------------------------
   Remplace le bandeau texte "Administration — War Machines" (28/07/2026,
   demande Enzo — maquette validée) : vrai logo, navigation à icônes avec
   état actif, pastille de suivi ("annonces en attente"), identité/déconnexion
   à droite. Nettoyage au passage : les anciennes classes .site-header /
   .site-nav / .site-logo / .bouton-plaque (ancien header public, retiré le
   13/07/2026, conservées jusqu'ici uniquement pour l'espace admin) ne sont
   plus référencées par aucune page — supprimées plutôt que laissées mortes
   dans la feuille de style (vérifié par recherche globale avant suppression). */
.admin-header { background: var(--couleur-encre); }
.admin-header__interieur {
    max-width: 1320px;
    margin: 0 auto;
    padding: 0 20px;
    display: flex;
    align-items: center;
    gap: 28px;
    height: 68px;
}
.admin-header__marque {
    display: flex;
    align-items: center;
    gap: 12px;
    text-decoration: none;
    padding-right: 22px;
    border-right: 1px solid rgba(244, 242, 236, 0.18);
}
.admin-header__marque:hover { text-decoration: none; }
.admin-header__marque-logo { height: 30px; width: auto; display: block; }
.admin-header__marque-textes { display: flex; flex-direction: column; line-height: 1.15; }
.admin-header__marque-nom { font-family: var(--police-titres); font-weight: 700; font-size: 1.05rem; letter-spacing: 0.02em; color: #fff; }
.admin-header__marque-tag { font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.1em; color: rgba(244, 242, 236, 0.55); }

.admin-header__nav { display: flex; align-items: center; gap: 4px; flex: 1; }
.admin-header__nav a {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 16px;
    border-radius: 999px;
    font-family: var(--police-titres);
    font-weight: 600;
    font-size: 0.88rem;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    color: rgba(244, 242, 236, 0.75);
    text-decoration: none;
    transition: background 0.2s ease, color 0.2s ease;
}
.admin-header__nav a .icone { opacity: 0.8; }
.admin-header__nav a:hover { background: rgba(244, 242, 236, 0.08); color: #fff; text-decoration: none; }
.admin-header__nav a.actif { background: var(--couleur-accent); color: #fff; }
.admin-header__nav a.actif .icone { opacity: 1; }

.admin-header__pastille {
    background: var(--couleur-accent);
    color: #fff;
    font-family: var(--police);
    font-size: 0.72rem;
    font-weight: 700;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: 999px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
}
.admin-header__nav a.actif .admin-header__pastille { background: rgba(255, 255, 255, 0.28); }

.admin-header__compte { display: flex; align-items: center; gap: 14px; }
.admin-header__compte-nom { font-size: 0.85rem; color: rgba(244, 242, 236, 0.65); white-space: nowrap; }
.admin-header__compte-nom strong { color: #fff; font-weight: 600; }
.admin-header__deconnexion {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 8px 14px;
    border-radius: var(--rayon);
    border: 1px solid rgba(244, 242, 236, 0.25);
    color: rgba(244, 242, 236, 0.85);
    font-size: 0.82rem;
    font-weight: 600;
    text-decoration: none;
    white-space: nowrap;
    transition: background 0.2s ease, border-color 0.2s ease;
}
.admin-header__deconnexion:hover { background: rgba(244, 242, 236, 0.08); border-color: rgba(244, 242, 236, 0.4); text-decoration: none; }

@media (max-width: 900px) {
    .admin-header__interieur { flex-wrap: wrap; height: auto; padding: 14px 20px; gap: 14px; }
    .admin-header__marque { border-right: none; padding-right: 0; }
    .admin-header__nav { order: 3; width: 100%; flex-wrap: wrap; }
    .admin-header__compte { margin-left: auto; }
}

/* =====================================================================
   Header public "Classique & institutionnel" (validé avec Enzo le
   13/07/2026, après comparaison de 2 maquettes ; bandeau utilitaire
   défilant retiré le 20/07/2026, cf. maj-47) : logo centré en médaillon
   flanqué de la navigation de part et d'autre, bouton d'action à coins
   abattus façon plaque d'identification militaire. Remplace l'ancien
   header (.site-header / .site-nav / .site-logo), gardé un temps pour
   l'espace admin seul avant d'être lui aussi remplacé le 28/07/2026 (voir
   .admin-header plus bas) — plus aucune page ne référence ces anciennes
   classes, supprimées. ===================================================== */

/* Sentinelle invisible placée juste avant le header sur les pages avec
   hero (.page-hero) : haute comme le header lui-même (--hauteur-header),
   positionnée hors flux tout en haut du document. Observée en JS
   (IntersectionObserver) pour faire basculer .header--colle dès qu'elle
   sort du haut de la fenêtre, càd dès que le bas du header atteint le
   haut de la page. */
.sentinelle-header {
    position: absolute;
    top: 0;
    left: 0;
    width: 1px;
    height: var(--hauteur-header, 88px);
    visibility: hidden;
    pointer-events: none;
}

/* Barre principale (logo + nav) : reste collée en haut de l'écran au
   défilement, comme l'ancien .site-header. */
.header-b__principal {
    /* Transparent par défaut (flotte au-dessus du bandeau hero, photo ou
       dégradé) — bascule en gris très foncé dès le premier scroll, via la
       classe .header--colle (ajoutée par assets/js/dynamique.js dès que le
       bas du header atteint le haut de page, ou directement par
       includes/header.php sur les pages sans hero). */
    background: rgba(24, 24, 21, 0);
    box-shadow: 0 0 0 rgba(0, 0, 0, 0);
    backdrop-filter: blur(0px);
    -webkit-backdrop-filter: blur(0px);
    position: sticky;
    top: 0;
    z-index: 10;
    transition: background-color 0.45s ease, box-shadow 0.45s ease,
        backdrop-filter 0.45s ease;
    /* ⚠️ 31/07/2026 (bande blanche signalée à nouveau par Enzo dans le
       bandeau du header, en descendant puis remontant rapidement — Chrome,
       Mac ou Windows) : un header en `position: sticky` combiné à
       `backdrop-filter` (flouté dès qu'il devient .header--colle) est un
       cas connu de bug de rendu Chromium — lors d'un défilement rapide,
       le moteur peut repeindre la zone du header en retard/de façon
       incomplète (tearing), le temps qu'une frame se stabilise, ce qui se
       voit comme un aplat clair anormal. `transform: translateZ(0)`
       force ce header dans sa propre couche de composition GPU stable
       (recalculée une seule fois, indépendamment du reste de la page), ce
       qui évite ce repeint tardif dans la plupart des cas documentés pour
       ce bug. Aucun effet visuel sur le rendu normal (élément déjà en
       `position: sticky`, donc déjà hors du flux normal de peinture). */
    transform: translateZ(0);
    will-change: background-color;
}
.header-b__principal.header--colle {
    /* Fond blanc + ombre noire en bas à la place du gris foncé + filet
       clair d'origine (demande Enzo du 22/07/2026) : le header collé se
       distingue désormais du contenu par un simple ombrage porté, sans
       bordure ni couleur d'accent. Le texte/logo/nav basculent en couleurs
       sombres juste en dessous (peu lisibles en clair sur fond blanc). */
    background: rgba(255, 255, 255, 0.98);
    /* Ombre renforcée (demande Enzo du 22/07/2026) : opacité et étalement
       augmentés pour un ombrage plus marqué que celui posé le 20/07/2026. */
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.32);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
}
/* Header collé : hauteur réduite au scroll (demande Enzo du 22/07/2026,
   revient sur l'agrandissement du même jour) — padding vertical abaissé
   sous le niveau de l'état transparent (22px) pour un header nettement
   plus compact une fois qu'on a commencé à défiler, et qui laisse plus de
   place au contenu. Comme le header est en position: sticky, son rendu
   s'ajuste tout seul à ce padding réduit (aucun script JS à modifier) ;
   --hauteur-header (mesurée par assets/js/dynamique.js pour positionner
   .page-hero/.sentinelle-header) reste basée sur la hauteur de l'état
   transparent au chargement, ce qui est correct puisque le bandeau hero
   est déjà rendu à ce moment-là — la réduction ultérieure au scroll n'a
   pas besoin d'être suivie par ce calcul. */
.header-b__principal.header--colle .header-b__interieur {
    padding-top: 12px;
    padding-bottom: 12px;
}
.header-b__principal::before {
    /* filet fin — effet "document officiel", visible uniquement une fois
       le header collé/opaque, sur les pages qui restent dans le thème
       sombre (aucune actuellement : conservé par prudence/rétrocompat,
       neutralisé ci-dessous sur le fond blanc — voir demande "ombre au
       lieu d'une bordure" du 22/07/2026). */
    content: '';
    position: absolute;
    left: 10px; right: 10px; top: 4px; bottom: 4px;
    border-top: 1px solid rgba(244,242,236,0);
    border-bottom: 1px solid rgba(244,242,236,0);
    pointer-events: none;
    transition: border-color 0.45s ease;
}
.header-b__principal.header--colle::before {
    border-top-color: transparent;
    border-bottom-color: transparent;
}

/* --- Textes/nav/logo du header en couleurs sombres une fois collé (fond
   blanc) — remplace le traitement clair pensé pour un header transparent
   sur photo (demande Enzo du 22/07/2026). ------------------------------ */
.header-b__principal.header--colle .header-b__nav a {
    color: var(--couleur-encre);
    text-shadow: none;
    border-right-color: rgba(23, 24, 20, 0.12);
}
.header-b__principal.header--colle .header-b__nav a:hover,
.header-b__principal.header--colle .header-b__nav a.actif {
    color: var(--couleur-encre);
}
.header-b__principal.header--colle .header-b__nav a:not(.header-b__cta):hover {
    background: var(--couleur-kaki-fond);
}
/* Logo "War Machines" en deux versions (demande Enzo du 22/07/2026,
   remplace le halo clair posé sur la version couleur) : le fichier fourni
   par Enzo a un wordmark noir fixe, illisible tel quel par-dessus la photo
   du bandeau hero à l'état transparent — un détourage tout en blanc du
   même logo (assets/img/logo-war-machines-blanc.png) est affiché dans cet
   état à la place, et la version couleur d'origine reprend le dessus dès
   que le header devient blanc (état collé). Voir .header-b__logo-image--*
   plus bas pour la bascule. */
.header-b__principal.header--colle .selecteur-langue__bouton {
    background: rgba(23, 24, 20, 0.05);
    border-color: rgba(23, 24, 20, 0.18);
    color: var(--couleur-encre);
}
.header-b__principal.header--colle .selecteur-langue__bouton:hover {
    background: rgba(23, 24, 20, 0.09);
}
.header-b__interieur {
    /* Élargi le 23/07/2026 (1320px → 1400px) : le bouton CTA agrandi + le
       sélecteur de langue plus espacé (retouches du même jour, demandées
       par Enzo) ne tenaient plus dans les 1320px précédents à 1440px de
       large — le sélecteur de langue se retrouvait poussé hors de
       l'écran (pas seulement le léger débordement invisible déjà connu et
       documenté, un vrai élément inaccessible). */
    max-width: 1400px;
    margin: 0 auto;
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    align-items: center;
    /* Espace entre le logo et les menus augmenté le 22/07/2026 (demande
       Enzo, ils étaient trop collés de part et d'autre du logo) : 24px →
       56px. */
    gap: 56px;
    /* Hauteur légèrement augmentée le 20/07/2026 (demande Enzo) : padding
       vertical 18px → 22px. */
    padding: 22px 32px;
    position: relative;
    /* Bug signalé par Enzo le 22/07/2026 : au moment précis de la
       transition transparent → collé, le fond/l'ombre du header
       (.header-b__principal) s'estompaient en douceur (0.45s) mais le
       padding (donc la hauteur du header et la position du logo/menu/
       bouton) basculait instantanément — un "saut" brut de mise en page en
       plein milieu du fondu de couleur, très visible si la souris est en
       train de survoler un lien à ce moment précis (le lien se décale
       d'un coup sous le curseur). Corrigé en animant le padding avec la
       même durée/allure que le fondu de couleur, pour que la hauteur du
       header change en douceur en même temps que sa couleur. */
    transition: padding 0.45s ease;
}
.header-b__nav { display: flex; align-items: center; gap: 0; flex-wrap: nowrap; }
.header-b__nav--gauche { justify-content: flex-end; }
.header-b__nav--droite { justify-content: flex-start; }
.header-b__nav a {
    display: flex; align-items: center; gap: 6px;
    font-family: var(--police-titres);
    font-weight: 600;
    /* Taille agrandie le 22/07/2026 (demande Enzo), 0.78rem → 0.9rem. */
    font-size: 0.9rem;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: rgba(244,242,236,0.88);
    text-decoration: none;
    padding: 6px 18px;
    border-right: 1px solid rgba(244,242,236,0.2);
    transition: color 0.2s ease;
    white-space: nowrap;
    /* Légère ombre portée : garde les liens lisibles quand le header est
       transparent par-dessus une photo claire (voir .header--colle). */
    text-shadow: 0 1px 4px rgba(0,0,0,0.35);
}
.header-b__nav--droite a:last-child { border-right: none; }
.header-b__nav a .icone { width: 14px; height: 14px; opacity: 0.75; }
.header-b__nav a:hover, .header-b__nav a.actif { color: #fff; }
/* Fond blanc au survol (demandé par Enzo le 20/07/2026), sur les liens de
   navigation simples uniquement — exclut le bouton "Déposer une annonce"
   (.header-b__cta), qui garde son propre traitement rouge au survol un
   peu plus bas (.header-b__cta:hover), et n'affecte pas non plus le
   sélecteur de langue (déjà surclassé par une règle plus spécifique,
   voir .selecteur-langue__panneau .selecteur-langue__item:hover). */
.header-b__nav a:not(.header-b__cta):hover {
    background: #f4f2ec;
    color: var(--couleur-encre);
    text-shadow: none;
    border-radius: 3px;
}
.header-b__logo { display: flex; align-items: center; justify-content: center; text-decoration: none; padding: 6px 4px; }
/* Logo image "War Machines" fourni par Enzo (remplace le traitement texte
   du 19/07/2026, maj-44) — recadré serré sur son propre contenu et fond
   rendu transparent avant intégration (le fichier reçu avait un fond blanc
   plein). Hauteur agrandie le 22/07/2026 (demande Enzo), 40px → 54px ;
   largeur automatique (ratio d'origine ~3.94:1 préservé). */
.header-b__logo-image {
    height: 54px;
    width: auto;
    display: block;
}
/* Bascule entre les deux versions du logo selon l'état du header (demande
   Enzo du 22/07/2026, remplace le halo clair de la version précédente) :
   - version blanche visible par défaut (état transparent, photo en fond) ;
   - version couleur (noir + kaki) visible une fois le header collé (fond
     blanc), où la version blanche se fondrait dans le fond.
   Les deux images sont superposées dans le même bloc .header-b__logo (voir
   includes/header.php) ; une seule des deux est affichée à la fois. */
.header-b__logo-image--couleur { display: none; }
.header-b__logo-image--blanc { display: block; }
.header-b__principal.header--colle .header-b__logo-image--couleur { display: block; }
.header-b__principal.header--colle .header-b__logo-image--blanc { display: none; }
.header-b__nav a.header-b__cta {
    display: inline-flex; align-items: center; gap: 8px;
    /* Couleurs alignées sur le nouveau logo "War Machines" (demande Enzo du
       22/07/2026) : le vert kaki du logo (#6a6c49) s'est avéré quasiment
       identique à --couleur-kaki (#6b6f47) déjà utilisée ailleurs sur le
       site — réutilisée ici plutôt que d'introduire une couleur en plus.
       Remplace le rouge brique (--couleur-accent) utilisé jusque-là pour ce
       bouton précis ; --couleur-accent reste inchangée partout ailleurs
       (liens, bouton sidebar, badges...). */
    background: var(--couleur-kaki);
    border: 1.5px solid var(--couleur-kaki);
    color: #f2efe4 !important;
    font-family: var(--police-titres);
    font-weight: 600;
    /* Agrandi à la demande d'Enzo (0.72rem → 0.78rem le 23/07/2026, puis
       0.78rem → 0.92rem le 27/07/2026, padding et icône élargis en
       proportion à chaque fois). */
    font-size: 0.92rem;
    letter-spacing: 0.07em;
    text-transform: uppercase;
    padding: 12px 22px 12px 20px;
    /* ⚠️ 27/07/2026 (retour Enzo) : "Pièces" et ce bouton se touchaient —
       .header-b__nav a garde `border-right` comme séparateur entre liens
       simples (Accueil/Véhicules/Pièces), mais rien ne les espaçait
       davantage du bouton lui-même (`.header-b__nav` a `gap: 0`, les liens
       ne comptent que sur ce filet vertical). Une marge à gauche, propre au
       bouton, crée un vrai espace visuel avant lui sans toucher à
       l'espacement des liens simples entre eux. */
    margin-left: 14px;
    /* ⚠️ 27/07/2026 (2e retour Enzo, capture à l'appui) : ce bouton et le
       sélecteur de langue se touchaient aussi, de l'autre côté. Le
       sélecteur de langue garde son `margin-left: auto` (le pousse tout à
       droite du header, voir plus bas), mais cet auto ne vaut que pour
       l'espace EN TROP dans la nav — s'il n'y en a pas (nav qui remplit
       tout juste la largeur disponible), l'auto ne produit aucun espace du
       tout, d'où le collage observé. Un `margin-right` fixe ici garantit un
       espace minimum quoi qu'il arrive, en plus de l'auto s'il y a de la
       place (les deux s'additionnent, les marges ne fusionnent pas entre
       éléments flex voisins). */
    margin-right: 14px;
    /* ⚠️ 23/07/2026 (2e retour) : le margin-left:auto qui poussait ce bouton
       (et tout ce qui suivait) tout à droite a été déplacé sur
       .selecteur-langue lui-même — Enzo souhaite désormais que ce soit
       spécifiquement le sélecteur de langue qui aille "tout à droite du
       header", pas ce bouton. Le bouton reste donc en flux normal, juste
       après Véhicules/Pièces. */
    text-decoration: none;
    text-shadow: none;
    box-shadow: 0 2px 0 rgba(0,0,0,0.25);
    /* Coins abattus façon plaque d'identification militaire (même principe
       que .bouton-plaque plus haut, repris ici à une échelle plus petite
       adaptée à la barre de nav). */
    clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
    transition: background 0.2s ease, border-color 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;
}
.header-b__cta:hover {
    background: var(--couleur-kaki-fonce);
    border-color: var(--couleur-kaki-fonce);
    transform: translateY(-2px);
    box-shadow: 0 6px 14px rgba(0,0,0,0.35);
}
.header-b__cta:active {
    transform: translateY(0);
    box-shadow: 0 1px 0 rgba(0,0,0,0.25);
}
.header-b__cta .icone { width: 18px; height: 18px; }

/* Sélecteur de langue FR/EN — bouton dropdown avec drapeaux, posé dans la
   nav de droite. ⚠️ 23/07/2026 (2e retour d'Enzo) : "met le tout à droite
   du header" — le margin-left:auto est donc déplacé ici (retiré de
   .header-b__cta ci-dessus) pour que ce soit précisément le sélecteur de
   langue qui aille se coller au bord droit du header, quelle que soit la
   largeur du bouton "Déposer une annonce" juste avant. */
.selecteur-langue {
    position: relative;
    margin-left: auto;
}
.selecteur-langue__bouton {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(244,242,236,0.08);
    border: none;
    color: var(--couleur-encre-claire);
    font-family: var(--police);
    font-weight: 500;
    font-size: 0.8rem;
    padding: 8px 12px;
    border-radius: 6px;
    cursor: pointer;
    transition: background 0.2s ease, transform 0.2s ease;
}
.selecteur-langue__bouton:hover { background: rgba(244,242,236,0.16); transform: translateY(-1px); }
/* Drapeaux : blocs de couleur façon "plaque militaire" (coins coupés),
   même motif que .plaque-drapeau sur l'annuaire des professionnels
   (assets/css/style.css plus bas), réutilisé tel quel ici via les classes
   .plaque-drapeau--fr/--gb posées dans includes/header.php — remplace les
   émoji drapeaux (retour Enzo du 23/07/2026 : "c'est des emoji c'est pas
   terrible"). Bordure entièrement retirée ci-dessous (autre demande du
   même jour, "enlève toute bordure") : les aplats de couleur suffisent à
   distinguer chaque drapeau, plus besoin du cadre ajouté au tour
   précédent. Sélecteur ".selecteur-langue .plaque-drapeau" (0,2,0) plutôt
   que ".plaque-drapeau" seul (0,1,0) pour l'emporter sur la règle de base
   du motif (définie plus bas dans le fichier) quel que soit l'ordre des
   règles dans la feuille — cf. le bug de cascade déjà rencontré sur
   .sous-titre-bloc. */
.selecteur-langue .plaque-drapeau {
    width: 22px;
    height: 15px;
    border: none;
    box-shadow: none;
    flex-shrink: 0;
}
.selecteur-langue__chevron {
    width: 8px;
    height: 8px;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg);
    transition: transform 0.25s ease;
    margin-top: -3px;
}
.selecteur-langue--ouvert .selecteur-langue__chevron { transform: rotate(-135deg); margin-top: 3px; }

.selecteur-langue__panneau {
    position: absolute;
    top: calc(100% + 10px);
    right: 0;
    background: #fff;
    border-radius: 10px;
    box-shadow: 0 14px 34px rgba(0,0,0,0.18);
    padding: 6px;
    /* 29/07/2026 : élargi de 168px à 190px et plafonné en hauteur (avec
       défilement) suite au passage de 2 à 7 langues (demande Enzo) — évite
       qu'un nom de langue plus long ("Nederlands", "Čeština"...) ne
       provoque un retour à la ligne, et qu'un panneau à 7 lignes ne
       déborde sur un très petit écran en hauteur. */
    min-width: 190px;
    max-height: min(70vh, 340px);
    overflow-y: auto;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-8px) scale(0.96);
    transform-origin: top right;
    transition: opacity 0.22s ease, transform 0.22s ease, visibility 0.22s;
    z-index: 20;
}
.selecteur-langue--ouvert .selecteur-langue__panneau {
    opacity: 1;
    visibility: visible;
    transform: translateY(0) scale(1);
}
/* Spécificité : ".header-b__nav a" (0,1,1) est plus spécifique qu'une
   simple classe ".selecteur-langue__item" (0,1,0) et l'emporterait sinon
   (texte clair/transparent, majuscules... illisible sur le panneau blanc).
   On qualifie donc avec ".selecteur-langue__panneau" pour repasser devant. */
.selecteur-langue__panneau .selecteur-langue__item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 12px;
    border-radius: 7px;
    color: var(--couleur-encre);
    font-family: var(--police);
    font-size: 0.88rem;
    font-weight: 500;
    text-decoration: none;
    border-right: none;
    text-transform: none;
    letter-spacing: normal;
    white-space: nowrap;
    transition: background 0.15s ease;
}
.selecteur-langue__panneau .selecteur-langue__item:hover,
.selecteur-langue__panneau .selecteur-langue__item.actif { background: #f4f2ec; color: var(--couleur-encre); }
.selecteur-langue__panneau .selecteur-langue__item--actif { font-weight: 600; }
.selecteur-langue__panneau .selecteur-langue__item--actif::after {
    content: '✓';
    margin-left: auto;
    color: var(--couleur-accent);
    font-weight: 700;
}

/* =====================================================================
   Header mobile/tablette : menu burger plein écran (29/07/2026, refonte
   responsive demandée par Enzo — "la version PC est super, n'y touche
   pas"). En dessous de 1360px (seuil relevé le 29/07/2026 — voir
   correctif juste en dessous, il était à 1180px depuis le 09/07/2026),
   l'ancien comportement empilait nav gauche / logo / nav droite
   verticalement et centrés — lisible sur tablette large mais franchement
   à l'étroit sur téléphone (beaucoup de liens qui s'enroulent sur
   plusieurs lignes). Remplacé par un bouton burger qui ouvre un panneau
   plein écran (voir .menu-mobile plus bas).
   Au-dessus de 1360px, RIEN dans cette feuille de style ne change : le
   bouton burger et le panneau restent display:none, la nav desktop
   garde exactement son rendu d'origine.
   ⚠️ 29/07/2026 (bug tablette signalé par Enzo, capture à l'appui) :
   seuil remonté de 1180px à 1360px. Le 23/07/2026, le bouton CTA "Déposer
   une annonce" avait été agrandi et le sélecteur de langue plus espacé
   (voir .header-b__interieur plus bas, max-width 1320px → 1400px) sans
   revérifier ce seuil de bascule — la nav desktop (logo + liens + gros
   bouton CTA + sélecteur de langue, tout sur une seule ligne, jamais
   autorisée à passer à la ligne) a besoin d'environ 1324px pour tenir
   sans déborder. Entre 1180px et 1324px, elle restait donc affichée
   (seuil pas encore atteint) mais débordait hors de l'écran de 50px de
   trop — d'où le décalage/la marge en trop constatée sur tablette (confirmé
   en mesurant précisément la largeur de page nécessaire à plusieurs
   largeurs d'écran avant de choisir cette nouvelle valeur, avec une marge
   de sécurité). ===================================================== */
/* Bouton burger : 3 barres pures CSS (pas de SVG), qui s'animent en croix
   à l'ouverture. Couleur alignée sur celle des liens de nav desktop selon
   l'état du header (blanc sur bandeau hero transparent, encre une fois
   .header--colle) — mêmes règles de bascule que .header-b__nav a.
   ⚠️ Cette déclaration de base (display:none) DOIT rester avant la media
   query ci-dessous dans le fichier : à spécificité égale (simple classe),
   c'est l'ordre d'apparition dans la feuille de style qui tranche, pas la
   media query elle-même — si cette règle passait après, elle écraserait
   systématiquement le display:flex du dessous, y compris en dessous de
   1360px (bug rencontré et corrigé pendant la vérification de ce lot). */
.header-b__burger {
    display: none;
    position: relative;
    width: 30px;
    height: 20px;
    padding: 0;
    background: none;
    border: none;
    cursor: pointer;
    flex-shrink: 0;
}
.header-b__burger-barre {
    position: absolute;
    left: 0;
    width: 100%;
    height: 2px;
    border-radius: 2px;
    background: #fff;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
    transition: transform 0.3s ease, opacity 0.2s ease, background-color 0.2s ease;
}
.header-b__burger-barre:nth-child(1) { top: 0; }
.header-b__burger-barre:nth-child(2) { top: 9px; }
.header-b__burger-barre:nth-child(3) { top: 18px; }
.header-b__principal.header--colle .header-b__burger-barre {
    background: var(--couleur-encre);
    box-shadow: none;
}
/* Croix à l'ouverture (classe posée par assets/js/dynamique.js). */
.header-b__burger--ouvert .header-b__burger-barre:nth-child(1) { top: 9px; transform: rotate(45deg); }
.header-b__burger--ouvert .header-b__burger-barre:nth-child(2) { opacity: 0; }
.header-b__burger--ouvert .header-b__burger-barre:nth-child(3) { top: 9px; transform: rotate(-45deg); }
/* Le burger reste blanc une fois le panneau ouvert (panneau sombre plein
   écran par-dessus le header, quel que soit l'état collé/transparent en
   dessous) — sinon la croix deviendrait illisible sur pages sans hero. */
.header-b__burger--ouvert .header-b__burger-barre { background: #fff; box-shadow: none; }

/* ⚠️ 29/07/2026 (retour Enzo) : le menu burger s'affichait aussi sur
   tablette (jusqu'à 1360px), ne laissant que l'icône burger visible, sans
   aucun lien — Enzo veut la nav complète visible sur tablette, pas
   masquée derrière le burger. Mesure faite avant ce correctif : la nav
   desktop pleine taille a besoin d'environ 1468px pour tenir sans
   déborder (mesuré en largeur naturelle, logo + les 2 colonnes de liens +
   gaps/padding du header) — bien plus que la largeur d'une tablette
   (768-1024px). Donc sur la plage tablette (768-1360px), tous les liens
   restent visibles (pas de burger) mais dans une version compacte
   (police/espacements/bouton/sélecteur de langue resserrés) qui tient
   dans cette largeur — vérifié sans débordement ni retour à la ligne de
   768px à 1360px. En dessous de 768px (vrais téléphones), le menu burger
   reste utilisé comme avant (la nav compacte elle-même ne rentrerait plus
   à ces largeurs). */
/* ⚠️ 29/07/2026 (2e retour Enzo, capture à l'appui) : la nav tablette
   ci-dessus/dessous était restée à une seule taille "compacte", calibrée
   pour tenir à 768px (le cas le plus étroit) — bien trop petite et peu
   lisible sur une tablette plus large (ex. 1280-1360px de large), où
   pourtant beaucoup de place restait inutilisée de part et d'autre.
   Remplacé par 4 paliers qui grandissent progressivement avec la largeur
   (768-899 / 900-1023 / 1024-1179 / 1180-1360), chacun vérifié
   individuellement (Playwright, largeurs testées : 768, 850, 899, 900,
   950, 1000, 1023, 1024, 1100, 1179, 1180, 1250, 1300, 1360) pour ne
   jamais déborder ni revenir à la ligne — le palier 900-1023 avait d'abord
   débordé de ~65px à 900px pile avec des valeurs trop proches de celles du
   palier suivant, d'où des paliers plus rapprochés (4 plutôt que 2) pour
   garder une marge de sécurité à chaque frontière. */
@media (min-width: 768px) and (max-width: 899px) {
    .header-b__interieur { gap: 10px; padding: 16px 14px; }
    .header-b__nav a {
        font-size: 0.64rem;
        letter-spacing: 0.01em;
        padding: 5px 6px;
        gap: 3px;
    }
    .header-b__nav a .icone { width: 11px; height: 11px; }
    .header-b__logo-image { height: 30px; }
    .header-b__nav a.header-b__cta {
        font-size: 0.64rem;
        padding: 7px 9px 7px 8px;
        margin-left: 5px;
        margin-right: 5px;
        letter-spacing: 0.01em;
    }
    .header-b__cta .icone { width: 12px; height: 12px; }
    .selecteur-langue__bouton { padding: 5px 5px; gap: 3px; }
    .selecteur-langue__code { display: none; }
    .selecteur-langue .plaque-drapeau { width: 17px; height: 12px; }
    .selecteur-langue__chevron { width: 6px; height: 6px; }
    .header-b__burger { display: none !important; }
}
@media (min-width: 900px) and (max-width: 1023px) {
    .header-b__interieur { gap: 14px; padding: 17px 16px; }
    .header-b__nav a {
        font-size: 0.69rem;
        letter-spacing: 0.012em;
        padding: 5px 7px;
        gap: 3px;
    }
    .header-b__nav a .icone { width: 12px; height: 12px; }
    .header-b__logo-image { height: 34px; }
    .header-b__nav a.header-b__cta {
        font-size: 0.69rem;
        padding: 8px 11px 8px 10px;
        margin-left: 6px;
        margin-right: 6px;
        letter-spacing: 0.012em;
    }
    .header-b__cta .icone { width: 13px; height: 13px; }
    .selecteur-langue__bouton { padding: 5px 6px; gap: 4px; }
    .selecteur-langue__code { display: none; }
    .selecteur-langue .plaque-drapeau { width: 18px; height: 12px; }
    .selecteur-langue__chevron { width: 6px; height: 6px; }
    .header-b__burger { display: none !important; }
}
@media (min-width: 1024px) and (max-width: 1179px) {
    .header-b__interieur { gap: 22px; padding: 18px 20px; }
    .header-b__nav a {
        font-size: 0.76rem;
        letter-spacing: 0.018em;
        padding: 6px 9px;
        gap: 4px;
    }
    .header-b__nav a .icone { width: 13px; height: 13px; }
    .header-b__logo-image { height: 39px; }
    .header-b__nav a.header-b__cta {
        font-size: 0.76rem;
        padding: 9px 14px 9px 12px;
        margin-left: 8px;
        margin-right: 8px;
        letter-spacing: 0.018em;
    }
    .header-b__cta .icone { width: 14px; height: 14px; }
    .selecteur-langue__bouton { padding: 6px 8px; gap: 5px; }
    .selecteur-langue__code { display: none; }
    .selecteur-langue .plaque-drapeau { width: 19px; height: 13px; }
    .selecteur-langue__chevron { width: 7px; height: 7px; }
    .header-b__burger { display: none !important; }
}
@media (min-width: 1180px) and (max-width: 1360px) {
    .header-b__interieur { gap: 34px; padding: 20px 26px; }
    .header-b__nav a {
        font-size: 0.82rem;
        letter-spacing: 0.03em;
        padding: 6px 11px;
        gap: 5px;
    }
    .header-b__nav a .icone { width: 13px; height: 13px; }
    .header-b__logo-image { height: 45px; }
    .header-b__nav a.header-b__cta {
        font-size: 0.82rem;
        padding: 10px 18px 10px 16px;
        margin-left: 11px;
        margin-right: 11px;
        letter-spacing: 0.03em;
    }
    .header-b__cta .icone { width: 16px; height: 16px; }
    .selecteur-langue__bouton { padding: 7px 10px; gap: 7px; }
    .selecteur-langue__code { display: inline; }
    .selecteur-langue .plaque-drapeau { width: 21px; height: 14px; }
    .selecteur-langue__chevron { width: 7px; height: 7px; }
    .header-b__burger { display: none !important; }
}

@media (max-width: 767px) {
    /* La grille à 3 colonnes du header (1fr auto 1fr) est conservée telle
       quelle : c'est justement elle qui garantit que le logo reste
       parfaitement centré, colonne du milieu en "auto", flanquée de deux
       colonnes de largeur strictement égale (1fr) — même mécanique qu'en
       desktop, pas de nouveau calcul de centrage à maintenir. On vide
       juste ces deux colonnes de leur contenu desktop pour n'y laisser
       rien (colonne de gauche, qui équilibre visuellement l'autre côté)
       et le bouton burger (colonne de droite — déplacé de la gauche vers
       la droite le 29/07/2026, demande Enzo).
       ⚠️ Bug rencontré et corrigé pendant la vérification de ce lot : passer
       `.header-b__nav--gauche` entière en `display: none` la retire
       complètement de la grille (elle n'est alors plus un "item" de grille
       du tout) — avec seulement 2 items restants (logo, nav-droite) pour 3
       colonnes définies, le placement automatique de CSS Grid réattribue
       le logo à la 1ère colonne (1fr, prévue pour nav-gauche) et nav-droite
       à la 2e (auto, prévue pour le logo), cassant tout le centrage. On
       masque donc seulement les liens (`a`) à l'intérieur de nav-gauche,
       jamais le `<nav>` lui-même : il reste un item de grille vide mais
       présent, qui continue à occuper sa colonne normalement. */
    .header-b__interieur { padding: 16px 20px; gap: 0; }
    .header-b__nav--gauche a,
    .header-b__nav--droite a,
    .header-b__nav--droite .selecteur-langue { display: none; }
    /* Le bouton "Déposer une annonce" (`.header-b__cta`) a besoin de son
       propre sélecteur, à spécificité égale à la règle desktop qui le
       rend visible (`.header-b__nav a.header-b__cta`, 2 classes + 1
       élément) — un simple `.header-b__nav--droite a` (1 classe + 1
       élément, spécificité plus faible) ne suffisait pas à l'emporter sur
       elle : le bouton restait visible et élargissait toute la colonne de
       droite, cassant le centrage du logo (bug trouvé pendant la
       vérification de ce lot). */
    .header-b__nav--droite a.header-b__cta { display: none; }
    .header-b__nav--droite { justify-content: flex-end; }
    .header-b__logo-image { height: 38px; }
    .header-b__burger { display: flex; }
}

/* =====================================================================
   Panneau de navigation mobile plein écran (téléphones uniquement depuis
   le 29/07/2026, voir plus haut — la tablette a maintenant sa propre nav
   compacte, plus de burger ni de panneau plein écran entre 768 et 1360px)
   — glisse depuis la droite, liens qui apparaissent en cascade. Jamais
   affiché au-dessus de 767px (display:none par défaut, réactivé
   uniquement dans la media query ci-dessous), donc aucun risque d'effet
   de bord sur le rendu PC/tablette même si le JS s'exécutait par erreur à
   ces largeurs. ===================================================== */
.menu-mobile { display: none; }
@media (max-width: 767px) {
    .menu-mobile {
        display: block;
        position: fixed;
        inset: 0;
        /* Au-dessus de .bandeau-cookies (z-index: 500) : bug trouvé pendant
           la vérification de ce lot — le bandeau de cookies restait visible
           par-dessus le panneau plein écran une fois ouvert (moins haut en
           z-index que lui), rendant le sélecteur de langue en bas du
           panneau confus/en partie masqué. Le menu doit recouvrir tout le
           reste de la page, cookies compris, tant qu'il est ouvert. */
        z-index: 600;
        background: var(--couleur-encre);
        transform: translateX(100%);
        transition: transform 0.42s cubic-bezier(0.65, 0, 0.35, 1);
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
    }
    .menu-mobile--ouvert { transform: translateX(0); }
    .menu-mobile__interieur {
        min-height: 100%;
        max-width: 480px;
        margin: 0 auto;
        display: flex;
        flex-direction: column;
        padding: 96px 32px 40px;
    }
    .menu-mobile__fermer {
        position: fixed;
        top: 18px;
        right: 18px;
        width: 44px;
        height: 44px;
        background: rgba(244, 242, 236, 0.08);
        border: none;
        border-radius: 50%;
        cursor: pointer;
    }
    .menu-mobile__fermer span {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 18px;
        height: 2px;
        background: #f4f2ec;
        border-radius: 2px;
        transform-origin: center;
    }
    .menu-mobile__fermer span:first-child { transform: translate(-50%, -50%) rotate(45deg); }
    .menu-mobile__fermer span:last-child { transform: translate(-50%, -50%) rotate(-45deg); }
    .menu-mobile__nav { display: flex; flex-direction: column; }
    .menu-mobile__nav a {
        display: block;
        padding: 16px 2px;
        font-family: var(--police-titres);
        font-size: 1.4rem;
        font-weight: 600;
        letter-spacing: 0.01em;
        color: #f4f2ec;
        text-decoration: none;
        border-bottom: 1px solid rgba(244, 242, 236, 0.14);
        opacity: 0;
        transform: translateX(28px);
        transition: opacity 0.4s ease, transform 0.4s ease;
    }
    /* Cascade : chaque lien apparaît un peu après le précédent, uniquement
       une fois le panneau ouvert (.menu-mobile--ouvert). */
    .menu-mobile__nav a:nth-child(1) { transition-delay: 0.08s; }
    .menu-mobile__nav a:nth-child(2) { transition-delay: 0.13s; }
    .menu-mobile__nav a:nth-child(3) { transition-delay: 0.18s; }
    .menu-mobile__nav a:nth-child(4) { transition-delay: 0.23s; }
    .menu-mobile__nav a:nth-child(5) { transition-delay: 0.28s; }
    .menu-mobile__nav a:nth-child(6) { transition-delay: 0.33s; }
    .menu-mobile--ouvert .menu-mobile__nav a { opacity: 1; transform: translateX(0); }
    .menu-mobile__nav a.actif { color: var(--couleur-accent); }
    .menu-mobile__cta {
        margin-top: 26px;
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 10px;
        background: var(--couleur-kaki);
        color: #f2efe4;
        font-family: var(--police-titres);
        font-weight: 600;
        text-transform: uppercase;
        letter-spacing: 0.05em;
        font-size: 0.95rem;
        padding: 16px 20px;
        border-radius: var(--rayon);
        text-decoration: none;
        opacity: 0;
        transform: translateY(18px);
        transition: opacity 0.4s ease 0.36s, transform 0.4s ease 0.36s, background 0.2s ease;
    }
    .menu-mobile__cta .icone { width: 18px; height: 18px; }
    .menu-mobile--ouvert .menu-mobile__cta { opacity: 1; transform: translateY(0); }
    .menu-mobile__cta:hover { background: var(--couleur-kaki-fonce); }
    /* 30/07/2026 (retour Enzo, mobile uniquement) : passage de 2 à 7 langues
       le 29/07/2026 (voir includes/header.php) sans adapter cette mise en
       page, restée en ligne unique (`display: flex`, un item par langue,
       chacun forcé à occuper 1/7e de la largeur via `flex: 1 1 0`) — sur
       un panneau de 320-430px de large, 7 blocs (drapeau + libellé, ex.
       "Nederlands", "Čeština"...) ne peuvent pas tenir sur une seule ligne :
       les items en fin de liste étaient poussés hors de la zone visible à
       droite (coupés par l'`overflow-x: hidden` global du site, voir tout
       en haut de ce fichier), au lieu d'être simplement masqués par un
       scroll. Passage en grille qui retombe à la ligne (`flex-wrap: wrap`)
       : chaque langue garde une largeur confortable et lisible, réparties
       sur plusieurs lignes plutôt qu'écrasées/coupées sur une seule. */
    .menu-mobile__langues {
        margin-top: auto;
        padding-top: 32px;
        display: flex;
        flex-wrap: wrap;
        gap: 12px;
        opacity: 0;
        transition: opacity 0.4s ease 0.4s;
    }
    .menu-mobile--ouvert .menu-mobile__langues { opacity: 1; }
    .menu-mobile__langue {
        /* Largeur minimale confortable (au lieu de 1/7e forcé) : deux items
           par ligne sur la plupart des téléphones, un seul sur les plus
           étroits (le flex-wrap ci-dessus s'en charge automatiquement). */
        flex: 1 1 calc(50% - 6px);
        min-width: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 8px;
        padding: 12px;
        border-radius: var(--rayon);
        border: 1px solid rgba(244, 242, 236, 0.18);
        color: rgba(244, 242, 236, 0.8);
        text-decoration: none;
        font-size: 0.88rem;
        white-space: nowrap;
    }
    .menu-mobile__langue.actif { border-color: var(--couleur-accent); color: #fff; }
}
@media (max-width: 420px) {
    .menu-mobile__nav a { font-size: 1.25rem; }
}
@media (max-width: 360px) {
    /* Sous 360px, même deux libellés confortables ("Nederlands",
       "Čeština"...) commencent à devenir un peu justes côte à côte : un
       seul par ligne, plus lisible que de réduire encore la police. */
    .menu-mobile__langue { flex-basis: 100%; }
}
/* Le corps de page ne défile plus pendant que le panneau est ouvert (même
   convention que .modal-contact-ouverte, page fiche annonce). */
body.menu-mobile-ouvert { overflow: hidden; }

@media (prefers-reduced-motion: reduce) {
    /* Respecte "réduire les animations" : le panneau et ses liens
       apparaissent/disparaissent directement, sans glissement ni cascade
       (même politique que le diaporama du bandeau d'accueil plus haut). */
    .menu-mobile,
    .menu-mobile__nav a,
    .menu-mobile__cta,
    .menu-mobile__langues,
    .header-b__burger-barre {
        transition: none !important;
    }
}

/* --- Structure générale --------------------------------------------- */
.page-principale { padding: 32px 20px 64px; min-height: 60vh; }

/* Quand la page commence directement par le bandeau .page-hero (accueil,
   à vendre), on retire le padding du haut : sinon une bande blanche reste
   visible entre le header et le bandeau plein écran. */
.page-principale:has(> .page-hero, > .annuaire-hero) { padding-top: 0; }

/* Idem en bas de page : quand la dernière section est un bloc plein écran
   (ex. la newsletter sombre qui doit rejoindre le pied de page sans
   interruption), on retire le padding bas — sinon une bande blanche
   réapparaît entre la section et le footer. */
.page-principale:has(> .bloc-accueil:last-child) { padding-bottom: 0; }

/* Support de la classe .page-principale--decor (includes/header.php,
   activée via $fondDecore) : réservé pour un futur décor de page, aucune
   page ne l'active encore aujourd'hui.
   ⚠️ 29/07/2026 (purge/allègement demandé par Enzo) : les règles
   .decor-etoile* qui accompagnaient ce décor ont été retirées — orphelines
   (aucun gabarit ne les utilisait, $fondDecore n'étant jamais mis à true),
   elles ne faisaient qu'alourdir la feuille de style pour rien. */
.page-principale--decor { position: relative; overflow: hidden; }

.intro-page { text-align: center; margin-bottom: 24px; }
.intro-page h1 { margin-bottom: 4px; font-size: 2rem; }
.sous-titre { color: var(--couleur-texte-doux); margin-top: 0; }
/* Titre en majuscules (26/07/2026, demande Enzo), uniquement sur la page
   "Déposer une annonce" — voir deposer-annonce.php. */
.intro-page--depot h1 { text-transform: uppercase; }

/* --- Page de contact ------------------------------------------------ */
.contact-coordonnees {
    max-width: 720px;
    margin: 0 auto 24px;
    text-align: center;
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.contact-coordonnees .icone { width: 16px; height: 16px; vertical-align: -3px; color: var(--couleur-accent); margin-right: 4px; }
/* overflow-wrap (25/07/2026) : même raison que .fiche-detail__contact p —
   une adresse email est une chaîne sans espace, non coupable en fin de
   ligne sans cette règle. Les adresses provisoires actuelles tiennent tout
   juste sur téléphone ; sans ce garde-fou, les vraies adresses définitives
   (voir le guide de migration) pourraient déborder de la page sur mobile
   dès qu'elles sont un peu plus longues. */
.contact-coordonnees a { overflow-wrap: break-word; }

/* --- Section "hero" (accueil / à vendre) --------------------------------
   Bloc plein écran avec fond visuel, contenant le titre et la barre de
   filtres ; la section des annonces juste en dessous reste sur fond blanc
   (couleur-fond). Fond de base = dégradés générés en CSS (pas de photo sous
   licence incertaine). Sur l'accueil et sur "à vendre" (photo ajoutée le
   23/07/2026), une photo fixe (.page-hero__image-fixe) vient se superposer
   à ce fond, avec un voile sombre (.page-hero__overlay) par-dessus pour
   garder le texte lisible — ces deux classes ne produisent rien tant que
   la page ne pose pas elle-même les <div> correspondants dans son propre
   fichier .php (voir index.php et a-vendre.php) : les autres pages qui
   partagent .page-hero (vendu.php, contact.php, deposer-annonce.php,
   mentions légales, annonce.php, admin login) n'incluent pas ces <div> et
   restent donc sur le simple dégradé, sans aucune modification à faire. */
.page-hero {
    position: relative;
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    margin-right: calc(-50vw + 50%);
    /* Remonte le bandeau hero sous le header transparent (--hauteur-header,
       mesurée en JS par assets/js/dynamique.js) pour qu'il n'y ait pas de
       bande blanche entre le header et la photo/dégradé tant que le header
       n'est pas encore "collé" (voir .header-b__principal). Valeur de repli
       88px si le JS n'a pas encore tourné (hauteur du header desktop). */
    margin-top: calc(-1 * var(--hauteur-header, 88px));
    margin-bottom: 40px;
    padding: calc(64px + var(--hauteur-header, 88px)) calc(50vw - 50%) 64px;
    display: flex;
    /* 29/07/2026 : ajouté pour le titre "flottant" de l'accueil
       (.page-hero__titre-flottant, voir plus bas et index.php) — sur
       l'accueil, .page-hero a désormais deux enfants "de flux" (le titre
       flottant + .page-hero__interieur, le second reprenant tout le
       reste) plutôt qu'un seul, et doivent s'empiler verticalement (comme
       avant) plutôt que côte à côte (comportement par défaut de flex sans
       cette ligne). Sans effet sur les autres pages (.page-hero__image-fixe
       et .page-hero__overlay sont en position:absolute, donc jamais des
       enfants "de flux" concernés par cette direction ; .page-hero__interieur
       reste leur unique enfant de flux, un seul élément se centre à
       l'identique quelle que soit la direction). */
    flex-direction: column;
    align-items: center;
    justify-content: center;
    /* Section plus haute (demandé par Enzo le 20/07/2026) : occupe une
       bonne part de l'écran sans jamais dépasser 760px sur très grand
       écran. Le titre/texte/barre de filtre restent centrés horizontalement
       (text-align + margin auto sur .page-hero__interieur) et verticalement
       (align-items/justify-content ci-dessus) quelle que soit la hauteur. */
    min-height: min(78vh, 760px);
    overflow: hidden;
    background: linear-gradient(160deg, #1a1a1a 0%, #2c2c2c 100%);
}

/* Diaporama de photos de couverture (27/07/2026, demande Enzo — remplace
   l'ancienne photo fixe unique) : toutes les <img> sont superposées au même
   endroit (position absolute + inset 0, comme avant), seule celle avec la
   classe ".page-hero__image--actif" est visible (opacity: 1), les autres
   restent à opacity: 0 en dessous — le fondu enchaîné vient simplement de la
   transition d'opacité quand assets/js/dynamique.js déplace cette classe
   d'une photo à la suivante. */
.page-hero__image-fixe { position: absolute; inset: 0; overflow: hidden; }
.page-hero__image-fixe img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: 0;
    transition: opacity 1.4s ease;
}
.page-hero__image-fixe img.page-hero__image--actif {
    opacity: 1;
}
@media (prefers-reduced-motion: reduce) {
    /* Respecte "réduire les animations" : pas de fondu ni de défilement
       automatique, la transition est neutralisée (assets/js/dynamique.js
       n'exécute pas non plus le minuteur dans ce cas, voir plus bas). */
    .page-hero__image-fixe img { transition: none; }
}

/* Voile noir simple et uniforme par-dessus la photo, pour garantir la
   lisibilité du texte blanc tout en laissant la photo bien visible
   (transparence modérée, pas de teinte colorée qui la dénature). Opacité
   légèrement renforcée le 22/07/2026 (demande Enzo) : 0.45 → 0.55. */
.page-hero__overlay {
    position: absolute;
    inset: 0;
    background: rgba(10, 10, 10, 0.55);
}

.page-hero__interieur {
    position: relative;
    z-index: 1;
    width: 100%;
    /* Assez large pour que la barre de filtres (recherche + 3 menus +
       bouton) tienne sur une seule ligne, bouton compris : à 760px, le
       bouton "Filtrer" n'avait plus la place de rester à côté des champs
       et passait seul à la ligne suivante en dessous. Le titre/sous-titre
       profitent aussi de cette largeur (aucun souci, restent centrés). */
    max-width: 980px;
    margin: 0 auto;
    text-align: center;
}
/* Le titre et le sous-titre restent contenus dans une mesure de lecture
   confortable même si le bloc parent est désormais plus large. */
.page-hero .intro-page { max-width: 760px; margin-left: auto; margin-right: auto; }
.page-hero .intro-page h1 {
    color: #ffffff;
    font-family: var(--police-titres);
    font-weight: 700;
    font-size: clamp(2.8rem, 6vw, 4.6rem);
    letter-spacing: 0.01em;
    line-height: 1;
    margin-bottom: 10px;
}
/* 29/07/2026 : mêmes propriétés que .page-hero .intro-page h1 ci-dessus,
   mais via une classe dédiée plutôt qu'un sélecteur imbriqué dans
   .intro-page — nécessaire pour le titre "flottant" de l'accueil (voir
   index.php et le bloc @media plus bas), désormais dupliqué en deux
   exemplaires identiques (un vrai <h1> affiché, une copie invisible qui
   réserve sa place d'origine) qui doivent avoir EXACTEMENT la même taille
   à l'écran pour que le second ne décale rien. Les autres pages (à
   vendre, vendu, contact...) gardent leur simple h1 imbriqué dans
   .intro-page, non concernées, toujours régies par la règle ci-dessus. */
.page-hero__titre-contenu {
    color: #ffffff;
    font-family: var(--police-titres);
    font-weight: 700;
    font-size: clamp(2.8rem, 6vw, 4.6rem);
    letter-spacing: 0.01em;
    line-height: 1;
    /* margin-top: 0.67em (29/07/2026) : les navigateurs appliquent cette
       marge par défaut à tout <h1>. La copie invisible ci-dessous
       (.page-hero__titre-espace) est un <div>, qui n'a lui aucune marge
       par défaut — sans cette ligne, l'espace réservé serait plus petit
       que l'ancien <h1> et "sous-titre"/"barre-filtres" remonteraient de
       quelques pixels par rapport à leur position d'origine (interdit par
       la demande d'Enzo : ne pas les déplacer). Le vrai titre flottant
       (h1.page-hero__titre-flottant, positionné en absolute) neutralise
       cette marge via `margin: 0` (règle plus spécifique, voir plus bas) :
       cette ligne ne sert donc qu'à la copie invisible. */
    margin-top: 0.67em;
    margin-bottom: 10px;
    text-align: center;
}
/* Sur mobile (par défaut, <701px) : la copie invisible ne sert à rien — le
   vrai titre (.page-hero__titre-flottant) reste dans le flux normal, juste
   au-dessus du sous-titre, exactement comme l'ancien h1 qu'il remplace ici
   (aucun changement visuel sur mobile). La copie est donc entièrement
   masquée pour ne pas laisser un espace vide en double. */
.page-hero__titre-espace { display: none; }
/* ⚠️ Fix (29/07/2026, retour Enzo : "le titre WAR MACHINES n'apparaît plus
   sur téléphone") : avant ce lot, le <h1> vivait à l'intérieur de
   .page-hero__interieur (position: relative; z-index: 1;), qui le plaçait
   automatiquement au-dessus de .page-hero__overlay (le voile sombre
   semi-transparent posé sur la photo de fond). Depuis que le <h1> est
   devenu un enfant DIRECT de .page-hero, frère de .page-hero__overlay (pour
   la mécanique du titre "flottant" PC/tablette, voir plus haut), il a perdu
   cette protection : en `position: static` (valeur par défaut sur mobile,
   voir plus bas — le `position: absolute` ne s'applique qu'à partir de
   701px), un élément se peint TOUJOURS en dessous de tout élément positionné
   du même niveau (ici .page-hero__overlay, position: absolute), quel que
   soit son ordre dans le HTML — le voile sombre recouvrait donc le titre,
   le rendant illisible/quasi invisible selon la photo de fond affichée.
   Corrigé en donnant explicitement au <h1> sa propre position + z-index,
   à toutes les largeurs (pas seulement PC/tablette), pour qu'il reste
   toujours au-dessus du voile, exactement comme avant ce lot. */
h1.page-hero__titre-flottant {
    position: relative;
    z-index: 1;
}
/* Chaque "ligne" du titre (voir index.php : nom de marque "WAR MACHINES" +
   accroche, deux <span> distincts depuis le 27/07/2026) est mise en bloc
   pour forcer un retour à la ligne volontaire entre les deux, quelle que
   soit la largeur d'écran. `white-space: nowrap` (27/07/2026, demande
   Enzo) évite en plus que le texte de chaque ligne se coupe lui-même sur
   plusieurs lignes ; à très faible largeur d'écran, le texte peut malgré
   tout déborder légèrement (essai raisonnable plutôt qu'une réduction de
   taille agressive qui rendrait le titre illisible). */
.page-hero__titre-ligne { display: block; white-space: nowrap; }
/* Nom de marque ("WAR MACHINES") agrandi par rapport à la suite du titre
   (demande Enzo du 22/07/2026) : la ligne secondaire garde la taille
   d'origine du h1 (aucune régression), la ligne principale est agrandie
   d'environ un tiers en plus via une taille relative (em). */
.page-hero__titre-ligne--principale { font-size: 1.32em; }
/* ⚠️ 27/07/2026 (retour Enzo) : l'accroche "Achetez, Vendez, Préservez
   l'Histoire" est plus longue que l'ancien texte — combinée au
   `white-space: nowrap` ci-dessus, elle dépassait la largeur de sa colonne
   (760px, `.page-hero .intro-page`) et `text-align: center` ne recentrait
   alors PAS ce débordement de façon symétrique (comportement des
   navigateurs sur un bloc en dépassement dont la largeur reste égale à son
   conteneur) : le texte semblait "collé à gauche" et débordait uniquement
   à droite, d'où l'effet visuel "centré à droite" signalé par Enzo. Fix :
   la ligne se dimensionne maintenant à son propre contenu
   (`width: max-content`) puis se recentre elle-même via
   `left: 50% + translateX(-50%)`, relatif à sa colonne (`.intro-page`,
   déjà centrée sur la page) — un centrage qui reste vrai même si le texte
   dépasse la colonne (le débordement devient alors symétrique de part et
   d'autre, au lieu de partir uniquement vers la droite). Graisse réduite
   (700 → 500) sur cette seule ligne, à la demande d'Enzo, pour bien la
   distinguer du nom de marque au-dessus. Taille légèrement réduite
   (1em → 0.8em, retour Enzo du 27/07/2026) pour la même raison. */
.page-hero__titre-ligne--secondaire {
    font-size: 0.8em;
    margin-top: 6px;
    font-weight: 500;
    width: max-content;
    position: relative;
    left: 50%;
    transform: translateX(-50%);
}
.page-hero .sous-titre { color: rgba(244, 242, 236, 0.85); font-size: 1.05rem; }
.page-hero .barre-filtres { margin-bottom: 4px; }

/* =====================================================================
   Titre "flottant" de l'accueil, PC et tablette uniquement (29/07/2026,
   demande Enzo) : "WAR MACHINES" + l'accroche centrés sur toute la
   hauteur/largeur de la section .page-hero, indépendamment du sous-titre
   ("Véhicules et pièces détachées...") et de la barre de recherche juste
   en dessous, qui doivent rester exactement où ils sont — voir les
   commentaires dans index.php pour le détail de la mécanique (copie
   invisible qui réserve la place d'origine + vrai titre repositionné).
   Seuil à 701px : reprend l'inverse exact du seuil mobile existant pour
   ce même titre (voir @media max-width: 700px juste en dessous) — au-delà,
   comportement inchangé par rapport à avant ce lot.
   ===================================================================== */
@media (min-width: 701px) {
    .page-hero__titre-espace {
        display: block;
        visibility: hidden;
    }
    h1.page-hero__titre-flottant {
        position: absolute;
        inset: 0;
        margin: 0;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        /* Ne doit jamais capter de clic/survol à la place du reste du
           bandeau (recherche, flèches du diaporama...) : un h1 en pleine
           page (inset: 0) se superposerait sinon par-dessus tout,
           invisiblement, tant qu'il n'a pas de fond opaque — seul son
           texte est visible, le reste de la zone doit rester traversable. */
        pointer-events: none;
    }
    /* Le décalage manuel (.page-hero__titre-ligne--secondaire ci-dessus,
       pensé pour un h1 en simple bloc avec text-align) devient inutile
       une fois ce h1 passé en conteneur flex (align-items: center le
       centre déjà nativement, sans déborder de façon asymétrique) — cumulé
       avec l'ancien decalage, il pousserait la ligne deux fois vers la
       droite. Neutralisé uniquement sur ce titre flottant : le sous-titre
       secondaire garde son ancien comportement partout ailleurs (mobile,
       et le h1 imbriqué classique des autres pages). */
    .page-hero__titre-flottant .page-hero__titre-ligne--secondaire {
        position: static;
        left: auto;
        transform: none;
        width: auto;
    }
}

/* 31/07/2026 (demande Enzo) : petite section clin d'œil entre le bandeau
   photo et "Coup de cœur" (voir index.php), MOBILE UNIQUEMENT — masquée
   par défaut ici, réaffichée seulement sous 700px dans le bloc @media
   juste en dessous (même seuil que les retouches "mobile uniquement" du
   bandeau juste au-dessus). Desktop/tablette : totalement absente,
   comportement inchangé. */
.bloc-clin-oeil { display: none; }

@media (max-width: 700px) {
    /* Même technique "sort du conteneur centré" que .page-hero/.bloc-accueil
       juste au-dessus : bandeau plein largeur, bord à bord sur mobile.
       31/07/2026 (retour Enzo) : fond repassé en blanc (au lieu du kaki
       clair d'origine) — tranche mieux entre le bandeau photo au-dessus
       (liseré accent déjà présent à la jointure) et "Coup de cœur" en
       dessous (fond sombre), un peu comme un carton/étiquette blanche
       collée sur du matériel militaire. */
    .bloc-clin-oeil {
        display: block;
        width: 100vw;
        margin-left: calc(-50vw + 50%);
        margin-right: calc(-50vw + 50%);
        background: var(--couleur-fond);
        border-bottom: 1px solid rgba(23, 24, 20, 0.1);
        padding: 18px 24px;
    }
    /* 31/07/2026 (retour Enzo : "ça va pas" sur Kalam) : retour définitif à
       Special Elite (voir includes/header.php) — esprit machine à écrire
       d'époque. Couleur repassée en noir (var(--couleur-encre), le "noir"
       du site) à la demande d'Enzo — remplace le kaki foncé utilisé avec
       Kalam. Taille de police agrandie (0.94rem -> 1.08rem, même retour
       Enzo) pour mieux se voir avec Special Elite, plus fine que Kalam à
       corps égal. */
    .bloc-clin-oeil__citation {
        margin: 0;
        max-width: 460px;
        margin-left: auto;
        margin-right: auto;
        text-align: center;
        font-family: 'Special Elite', var(--police-titres);
        font-style: normal;
        font-weight: 400;
        font-size: 1.08rem;
        line-height: 1.6;
        letter-spacing: 0.02em;
        color: var(--couleur-encre);
    }
    /* Icône sous la citation (retour Enzo 31/07/2026) : la jeep initiale
       remplacée par l'étoile "type seconde guerre mondiale" déjà utilisée
       ailleurs sur la page (marquage véhicule allié étoile cerclée, voir
       icone('etoile-militaire') / section "Coup de cœur") — en noir comme
       le texte, un peu plus grande qu'une icône inline classique du site
       pour bien se voir en dessous d'une citation courte. */
    .bloc-clin-oeil__icone {
        display: block;
        width: 34px;
        height: 34px;
        margin: 12px auto 0;
        color: var(--couleur-encre);
    }
}

@media (max-width: 700px) {
    .page-hero { padding: calc(44px + var(--hauteur-header, 88px)) calc(50vw - 50%) 44px; min-height: min(68vh, 560px); }
    /* 30/07/2026 (demande Enzo, page d'accueil UNIQUEMENT — jamais
       .page-hero--compact, réutilisé par à-vendre/vendu avec un tout autre
       gabarit de hero sans barre de filtres intégrée) : la barre de
       recherche, jusqu'ici empilée EN FLUX avec ses 3 champs + bouton,
       obligeait le bandeau photo à rester assez haut pour lui faire de la
       place (la photo, en object-fit: cover, rognait donc davantage sur
       téléphone pour remplir cette hauteur). Un essai précédent la sortait
       du flux ("à cheval" sur la jointure avec la section suivante,
       overflow: visible) mais Enzo est finalement revenu dessus ("à cheval
       c'est pas terrible") : la barre reste maintenant simplement DANS le
       bandeau, en flux normal, juste réduite à l'essentiel (recherche +
       bouton rond, menus retirés — voir .barre-filtres plus bas) pour
       rester compacte malgré tout. min-height retiré : la hauteur du
       bandeau reste basée sur son seul contenu réel (titre + accroche +
       recherche), sans espace vide artificiel. */
    /* 30/07/2026 (retour Enzo : "colle les 2 sections ensemble, ya une
       marge entre les deux actuellement") : margin-bottom repassé à 0 —
       "Coup de cœur" (section suivante, voir plus bas) garde son propre
       padding-top intégré (24px, non modifié) qui suffit largement comme
       seule respiration entre les deux, sans marge supplémentaire ici. */
    .page-hero:not(.page-hero--compact) {
        min-height: 0;
        margin-bottom: 0;
    }
    /* 30/07/2026 (retour Enzo : la jointure entre le bandeau photo et "Coup
       de cœur" juste en dessous faisait "coupure nette" une fois les 2
       sections collées ci-dessus — la photo s'arrête net sur une ligne
       droite face au bloc gris uni). Fin liseré couleur accent ajouté
       exactement à la jointure pour transformer cette coupure en séparation
       volontaire et nette plutôt qu'un arrêt qui semblait accidentel —
       option choisie par Enzo parmi plusieurs proposées (dégradé, liseré
       diagonal, double liseré, pointillé, ombre portée). Pseudo-élément
       plutôt que `border-bottom` : évite de affecter la boîte/le
       positionnement du bandeau (`.page-hero` a déjà `position: relative`,
       voir plus haut dans ce fichier). */
    .page-hero:not(.page-hero--compact)::after {
        content: '';
        position: absolute;
        left: 0;
        right: 0;
        bottom: 0;
        height: 5px;
        background: var(--couleur-accent);
        pointer-events: none;
    }
    /* 29/07/2026 (retour Enzo, "le titre est trop large" sur mobile) : le
       titre du bandeau d'accueil ("WAR MACHINES" + accroche) est pensé en
       desktop pour ne jamais revenir à la ligne (`white-space: nowrap`,
       demande Enzo du 27/07/2026 — voir .page-hero__titre-ligne plus haut)
       — à la largeur d'un téléphone, même la taille minimale du clamp()
       desktop (2.8rem) combinée à ce nowrap faisait déborder le texte
       hors de l'écran. Corrigé pour mobile uniquement (desktop inchangé,
       cette règle ne s'applique qu'en dessous de 700px) : taille réduite
       et proportionnelle à la largeur d'écran (vw), et l'accroche (ligne
       secondaire, plus longue) est autorisée à revenir à la ligne plutôt
       que de déborder hors écran.
       ⚠️ Un premier essai gardait le multiplicateur ×1.32 desktop
       (`.page-hero__titre-ligne--principale`) sur "WAR MACHINES" — mesuré
       et corrigé pendant la vérification : même réduit, le h1 de base
       combiné à ce ×1.32 (≈46px à 390px de large) débordait encore
       légèrement hors de l'écran (largeur réelle du texte mesurée à
       372px, contre 350px de large disponible). Le multiplicateur est
       donc neutralisé sur mobile (repasse à ×1, la ligne principale
       utilise alors directement la taille du h1 ci-dessous, déjà
       réduite) — revérifié après coup avec la largeur réelle du texte
       (`scrollWidth`), plus seulement la taille de police, jusqu'à
       375px et 360px de large. */
    /* 29/07/2026 (retour Enzo, retouches suite au premier lot responsive) :
       "WAR MACHINES" un peu plus grand, l'accroche du dessous un peu plus
       petite. Cette même taille de base (clamp ci-dessous) sert aussi de
       titre de page pour "À vendre" / "Les Véhicules" / "Pièces détachées"
       (.page-hero--compact, a-vendre.php, texte simple sans ligne
       principale/secondaire) — un agrandissement lui profite donc aussi,
       conformément à la même demande d'Enzo pour ces pages. Bornes du
       clamp() réévaluées (scrollWidth) jusqu'à 320px de large pour "WAR
       MACHINES" et "Pièces détachées"/"Les Véhicules" (les plus longs) :
       aucun débordement constaté. */
    /* 29/07/2026 : `.page-hero__titre-contenu` ajoutée ici (en plus du
       sélecteur imbriqué existant) — sur mobile, le titre flottant de
       l'accueil (index.php, voir plus haut) reste un h1 tout à fait normal
       dans le flux, mais il n'est plus imbriqué dans .intro-page (il en
       est désormais un frère), donc le sélecteur `.page-hero .intro-page
       h1` seul ne le retrouve plus. Sans cet ajout, ce titre resterait à
       sa taille desktop (bien trop grande) sur mobile — exactement le bug
       corrigé une première fois le 29/07/2026 (voir plus bas). */
    .page-hero .intro-page h1,
    .page-hero__titre-contenu {
        font-size: clamp(2.05rem, 9.8vw, 2.85rem);
    }
    /* 29/07/2026 (retour Enzo : "agrandit encore la taille du titre War
       Machines") : multiplicateur propre à cette seule ligne (×1.08),
       plutôt que de remonter le clamp() du h1 de base juste au-dessus —
       celui-ci sert aussi de titre à "À vendre"/"Les Véhicules"/"Pièces
       détachées" (voir note ci-dessus), pas concernées par cette demande.
       ×1.08 vérifié sans débordement (`scrollWidth` < largeur dispo) de
       320 à 430px ; un essai à ×1.16 débordait visuellement jusqu'au bord
       de l'écran à 390px (marge quasi nulle), écarté. */
    /* 30/07/2026 (retour Enzo, "agrandit encore un peu" le titre principal
       sur mobile) : ×1.08 -> ×1.13. Revérifié (scrollWidth) sans
       débordement de 320 à 430px — le seul palier déjà écarté était ×1.16
       (note ci-dessus), ×1.13 reste en dessous avec une marge suffisante.
       30/07/2026 (retour Enzo, encore le même jour : "pas assez grand") :
       ×1.13 -> ×1.19, revérifié (scrollWidth) sans débordement de 320 à
       430px (voir vérification Playwright de ce lot).
       30/07/2026 (retour Enzo, nouvelle demande : "agrandis le titre WAR
       MACHINES") : ×1.19 -> valeur revérifiée ci-dessous par scrollWidth
       réel (pas seulement la taille de police) de 320 à 430px avant de
       fixer le palier définitif. */
    .page-hero__titre-ligne--principale { font-size: 1.24em; }
    .page-hero__titre-ligne--secondaire {
        white-space: normal;
        width: auto;
        position: static;
        left: auto;
        transform: none;
        line-height: 1.3;
        /* Réduite (0.8em → 0.68em) à la demande d'Enzo : avec le h1 de base
           agrandi juste au-dessus, l'accroche paraissait trop proche en
           taille du nom de marque. */
        font-size: 0.68em;
    }
}
@media (max-width: 380px) {
    /* Marge supplémentaire pour les très petits téléphones (320-375px de
       large, ex. iPhone SE) : encore un cran plus petit.
       .page-hero__titre-contenu ajouté (29/07/2026) : le nouveau titre
       "flottant" n'est plus imbriqué dans .intro-page, il doit donc être
       ciblé explicitement ici aussi pour garder la même taille de police
       sur très petit écran. */
    .page-hero .intro-page h1,
    .page-hero__titre-contenu {
        font-size: clamp(1.6rem, 9.2vw, 2.15rem);
    }
}

/* Modificateur pour la page "à vendre" (23/07/2026, retour Enzo "trop
   haut") : reprend la même structure/photo que .page-hero mais avec une
   marge/hauteur nettement réduites — la page liste surtout un catalogue
   d'annonces juste en dessous, elle n'a pas besoin d'un bandeau aussi
   imposant que celui de l'accueil. N'affecte que cette page (classe
   ajoutée uniquement dans a-vendre.php, en plus de .page-hero, jamais à la
   place). */
.page-hero--compact {
    padding-top: calc(28px + var(--hauteur-header, 88px));
    padding-bottom: 28px;
    min-height: min(38vh, 360px);
    margin-bottom: 32px;
}
@media (max-width: 700px) {
    .page-hero--compact { padding-top: calc(20px + var(--hauteur-header, 88px)); padding-bottom: 20px; min-height: min(44vh, 320px); }
}

/* --- Barre de filtres ------------------------------------------------ */
.barre-filtres {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    justify-content: center;
    margin: 24px 0 32px;
}
.barre-filtres input,
.barre-filtres select {
    padding: 10px 12px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    font-family: inherit;
    font-size: 0.95rem;
    background: var(--couleur-surface);
}
/* Largeurs ajustées (27/07/2026, demande Enzo) : sans règle explicite, un
   <select> se dimensionne sur son option la plus longue — "Toutes
   sous-catégories" (qui liste des noms de catégories parfois longs)
   devenait ainsi le champ le plus large de la barre. Après plusieurs
   essais de largeurs différenciées, Enzo a finalement demandé les trois
   mêmes largeurs pour tous les filtres — même `flex` et `max-width` pour
   les trois, ce qui les force à occuper exactement le même espace quel
   que soit le texte affiché ("Toutes sous-catégories" est alors tronqué
   avec "...", la liste déroulante elle-même affiche toujours le texte
   complet). */
.barre-filtres input[name="q"],
.barre-filtres select[name="type"],
.barre-filtres select[name="categorie"] {
    flex: 1 1 210px;
    max-width: 210px;
}
.barre-filtres select[name="categorie"] {
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}
.barre-filtres button {
    padding: 10px 18px;
    border: none;
    border-radius: var(--rayon);
    background: var(--couleur-accent);
    color: #fff;
    cursor: pointer;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.barre-filtres button:hover { background: var(--couleur-accent-fonce); }
/* 30/07/2026 : icône "loupe" (voir index.php) masquée par défaut — ne sert
   que pour le bouton rond compact de l'accueil mobile (voir plus bas,
   .page-hero:not(.page-hero--compact) .barre-filtres button), qui la
   réaffiche explicitement. PC/tablette et "à vendre" mobile gardent leur
   bouton texte "FILTRER" inchangé. */
.barre-filtres button .icone { display: none; }

/* Mobile/tablette (29/07/2026, refonte responsive) : en dessous de 700px,
   les champs à largeur fixe (210px, voir plus haut) se retrouvaient
   chacun centrés avec du vide de part et d'autre au lieu de profiter de
   la largeur de l'écran — peu lisible et peu "propre" sur téléphone.
   Empilés en pleine largeur à la place, comme un vrai formulaire. Un peu
   de marge horizontale est aussi rendue à .page-hero__interieur, qui n'en
   a par défaut aucune (inutile en desktop, son contenu ne s'approche
   jamais des bords à 980px de large) : sans elle, titre et champs
   toucheraient les bords de l'écran sur téléphone. */
@media (max-width: 700px) {
    .page-hero__interieur { padding: 0 20px; }
    .barre-filtres { flex-direction: column; align-items: stretch; gap: 12px; margin: 20px 0 8px; }
    .barre-filtres input[name="q"],
    .barre-filtres select[name="type"],
    .barre-filtres select[name="categorie"] {
        flex: 1 1 auto;
        max-width: none;
        width: 100%;
    }
    .barre-filtres input,
    .barre-filtres select { padding: 13px 14px; font-size: 1rem; }
    .barre-filtres button { width: 100%; padding: 14px 18px; }

    /* 30/07/2026 (retour Enzo : "intègre la barre de recherche à la
       section WAR MACHINES, à cheval c'est pas terrible") : la barre reste
       désormais simplement DANS le bandeau photo, en flux normal (plus de
       position: absolute/chevauchement, voir ci-dessus) — juste réduite à
       une seule ligne compacte (recherche + bouton rond) au lieu des 3
       champs + bouton empilés verticalement, pour rester courte malgré
       tout et limiter le rognage de la photo. Les menus type/catégorie
       restent utilisables normalement via la page "à vendre" (a-vendre.php,
       formulaire complet inchangé) : seul l'encart d'accueil est simplifié
       ici, le <select> reste dans le HTML (inchangé pour PC/tablette,
       voir plus haut) mais n'est plus affiché sur mobile. */
    .page-hero:not(.page-hero--compact) .barre-filtres {
        flex-direction: row;
        flex-wrap: nowrap;
        align-items: center;
        justify-content: center;
        gap: 14px;
        margin: 22px 0 0;
    }
    .page-hero:not(.page-hero--compact) .barre-filtres select {
        display: none;
    }
    .page-hero:not(.page-hero--compact) .barre-filtres input[name="q"] {
        flex: 1 1 auto;
        width: auto;
        min-width: 0;
        max-width: none;
        height: 54px;
        background: var(--couleur-surface);
        color: var(--couleur-texte);
        border: 1px solid var(--couleur-bordure);
        border-radius: 999px;
        padding: 0 22px;
        box-shadow: 0 8px 20px rgba(0, 0, 0, 0.22);
    }
    /* Bouton rond, icône "loupe" seule (voir index.php) — remplace le
       précédent essai en émoji ("🔍", jugé pas assez soigné/incohérent avec
       les autres icônes du site) par l'icône SVG maison déjà utilisée dans
       l'espace admin (icone('loupe'), voir includes/functions.php), dans
       le même style trait fin que toutes les autres icônes du site. */
    .page-hero:not(.page-hero--compact) .barre-filtres button {
        width: 54px;
        height: 54px;
        flex: none;
        padding: 0;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.26);
    }
    .page-hero:not(.page-hero--compact) .barre-filtres button .icone {
        display: block;
        width: 22px;
        height: 22px;
    }
    /* Texte "Filtrer" du bouton : gardé dans le HTML pour les lecteurs
       d'écran (accessibilité), mais masqué visuellement ici puisque le
       bouton rond n'affiche que l'icône — même technique que la classe
       utilitaire .masque-visuel définie plus bas dans ce fichier (reprise
       ici explicitement plutôt que d'ajouter la classe dans le HTML, pour
       ne pas masquer aussi ce même texte sur PC/tablette et "à vendre" où
       il doit rester visible). */
    .page-hero:not(.page-hero--compact) .barre-filtres button .barre-filtres__texte-bouton {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        white-space: nowrap;
        border: 0;
    }
}

/* --- Grille d'annonces ------------------------------------------------ */
.grille-annonces {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 24px;
}
@media (max-width: 1180px) {
    .grille-annonces { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 860px) {
    .grille-annonces { grid-template-columns: repeat(2, 1fr); }
}
/* Téléphone (28/07/2026, demande Enzo) : 2 annonces par ligne plutôt que 1
   seule, y compris sur les plus petits écrans — gap réduit pour que les
   deux cartes restent confortables sans devenir trop étroites. Les
   ajustements de padding/tailles de police de `.carte-annonce` ci-dessous
   (même seuil 560px) compensent la largeur de carte réduite pour que le
   contenu reste lisible. */
@media (max-width: 560px) {
    .grille-annonces { grid-template-columns: repeat(2, 1fr); gap: 12px; }
}

/* Vendu, Véhicules, Pièces détachées : cartes plus grandes qu'ailleurs sur
   le site (`.grille-annonces--resultats` = grille "Résultats" affichée sur
   l'accueil quand un filtre est actif, notamment via les liens Véhicules/
   Pièces détachées du menu). La page "À vendre" n'est pas concernée : elle
   garde volontairement sa taille de carte d'origine, non demandé par Enzo
   pour cette page.
   `repeat(auto-fit, minmax(290px, 320px))` + `justify-content: center` au
   lieu d'un nombre de colonnes fixe : le nombre de cartes par ligne
   s'adapte tout seul à la largeur d'écran (plus besoin de paliers manuels
   par média-requête), ET surtout, quand il n'y a pas assez d'annonces pour
   remplir une ligne complète (petit catalogue, ou dernière ligne d'une
   liste plus longue), les cartes présentes sont centrées sur la largeur
   disponible au lieu de rester collées à gauche avec du vide à droite —
   c'était précisément le problème signalé par Enzo avec la grille à 5
   colonnes fixes précédente. */
.grille-annonces--vendu {
    grid-template-columns: repeat(auto-fit, minmax(290px, 320px));
    justify-content: center;
}
/* Téléphone (28/07/2026) : l'auto-fit/minmax ci-dessus ne peut pas produire
   2 colonnes sur une largeur d'écran de 320-430px (290px minimum par carte
   = 1 seule colonne qui tient). On force donc explicitement 2 colonnes à
   ce palier, comme pour `.grille-annonces` de base. */
@media (max-width: 560px) {
    .grille-annonces--vendu { grid-template-columns: repeat(2, 1fr); gap: 12px; }
}
/* "Résultats" (accueil filtré : Véhicules, Pièces détachées) — demande
   Enzo du 22/07/2026 : 4 cartes par ligne au lieu de 3. Cette grille vit
   dans la colonne principale à côté de la barre latérale (.accueil-layout,
   ~1030px de large sur la plupart des écrans desktop, sidebar de 300px
   comprise) plutôt que sur toute la largeur de la page — le seuil minimal
   de carte de `.grille-annonces--vendu` ci-dessus (290px) n'y laissait
   jamais la place à 4 colonnes.
   Important (piège CSS Grid) : pour `repeat(auto-fit, minmax(min, max))`,
   le nombre de colonnes que le navigateur essaie de faire tenir est calculé
   à partir du "max" du minmax() dès que celui-ci est une longueur fixe
   (ex. 290px) — PAS à partir du "min", même si le min est plus petit. Un
   simple `minmax(215px, 290px)` continuait donc à ne compter que 2 à 3
   colonnes (calcul basé sur 290px), pas 4. Pour forcer le calcul à se baser
   sur le "min" (215px), le "max" doit être une longueur flexible plutôt
   qu'une longueur fixe : `1fr` à la place de `290px`. Avec `minmax(205px, 1fr)`,
   4 colonnes tiennent bien sur les largeurs desktop courantes (1280px et
   plus, colonne principale ≈ 912–1032px), ET les cartes s'étirent pour
   remplir tout l'espace disponible (plus large sur 1440/1920px que sur
   1280px) au lieu de rester figées à une taille fixe avec du vide autour.
   "Vendu" (`.grille-annonces--vendu` ci-dessus, 290/320px) n'est pas
   concernée par cette demande et reste inchangée (déjà correcte à 4/ligne,
   pleine largeur, sans barre latérale). */
.grille-annonces--resultats {
    grid-template-columns: repeat(auto-fit, minmax(205px, 1fr));
    justify-content: center;
}
/* Téléphone (28/07/2026) : idem `.grille-annonces--vendu` ci-dessus, on
   force 2 colonnes explicitement plutôt que de laisser l'auto-fit décider
   (qui donnerait 1 seule colonne sur un écran de 320-430px). */
@media (max-width: 560px) {
    .grille-annonces--resultats { grid-template-columns: repeat(2, 1fr); gap: 12px; }
}

/* "Dernières arrivées" (accueil sans filtre) — corrigé le 28/07/2026 :
   utilisait d'abord `--resultats` ci-dessus par souci de réemploi, mais
   son `auto-fit` calcule "autant de colonnes de 205px que la largeur le
   permet" — sur un grand écran, la colonne principale peut dépasser
   1200px (voir .accueil-layout, plafond à 1600px avec barre latérale
   soustraite) et 5 cartes de ~205px+ y tiennent alors sans problème.
   Résultat signalé par Enzo : 5 cartes sur la 1re ligne puis seulement 3
   sur la 2e (8 annonces au total), au lieu des 2 lignes de 4 voulues.
   `--dernieres-arrivees` fixe donc le nombre de colonnes explicitement
   (jamais "autant que ça tient") : toujours exactement 4, quelle que soit
   la largeur d'écran, jusqu'à un seuil de bascule à 3 (voir media query).
   Seuil à 1300px plutôt que les 1180px utilisés ailleurs sur le site pour
   ce même palier (ex. `.grille-annonces` de base, pleine largeur) : cette
   grille vit dans la colonne réduite par la barre latérale (~300px + 28px
   d'espacement en moins que la pleine largeur) — en dessous de 1300px de
   fenêtre, 4 colonnes fixes y deviendraient trop étroites (moins de
   200px chacune, cartes écrasées). */
.grille-annonces--dernieres-arrivees {
    grid-template-columns: repeat(4, 1fr);
}
/* 9e annonce (29/07/2026, demande Enzo) : index.php récupère volontairement
   9 annonces au lieu de 8 pour cette section, mais seule la version
   tablette (3 colonnes, media query juste en dessous) l'affiche vraiment —
   8 cartes y laissaient un trou sur la dernière ligne (2 cartes sur 3
   possibles), 9 la remplit exactement. Cachée par défaut ici (PC, 4
   colonnes × 2 lignes = 8 cartes pile, la 9e serait seule et seule sur une
   3e ligne) et recachée explicitement dans la media query 860px plus bas
   (téléphone, 2 colonnes × 4 lignes = 8 cartes pile, même raisonnement). */
.grille-annonces--dernieres-arrivees .carte-annonce:nth-child(9) {
    display: none;
}
@media (max-width: 1300px) {
    .grille-annonces--dernieres-arrivees { grid-template-columns: repeat(3, 1fr); }
    .grille-annonces--dernieres-arrivees .carte-annonce:nth-child(9) {
        display: flex;
    }
}
@media (max-width: 860px) {
    .grille-annonces--dernieres-arrivees { grid-template-columns: repeat(2, 1fr); }
    .grille-annonces--dernieres-arrivees .carte-annonce:nth-child(9) {
        display: none;
    }
}
/* Téléphone (28/07/2026) : 2 par ligne au lieu d'1, comme les autres
   grilles d'annonces du site — voir `.grille-annonces` plus haut. */
@media (max-width: 560px) {
    .grille-annonces--dernieres-arrivees { grid-template-columns: repeat(2, 1fr); gap: 12px; }
}
/* Le bouton "Voir tous les véhicules" qui suit directement cette grille
   n'a par défaut aucune marge au-dessus (`.bouton-voir-tout` = margin 0 0
   40px) — trop collé à la dernière ligne de cartes. Valeur alignée sur
   l'espacement déjà utilisé au-dessus de .pagination (36px, voir plus
   bas). */
.accueil-principal .grille-annonces--dernieres-arrivees + .bouton-voir-tout {
    margin-top: 36px;
}

.carte-annonce {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    overflow: hidden;
    box-shadow: var(--ombre);
    color: var(--couleur-texte);
    display: flex;
    flex-direction: column;
    transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.carte-annonce:hover {
    text-decoration: none;
    transform: translateY(-3px);
    box-shadow: 0 8px 20px rgba(0,0,0,0.09);
}

.carte-annonce__photo { position: relative; aspect-ratio: 4 / 3; background: #ece9e2; overflow: hidden; }
.carte-annonce__photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.carte-annonce__photo-absente {
    width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;
    color: var(--couleur-texte-doux); font-size: 0.85rem;
}

/* --- Badge d'état de vente (nouveau / réservé / vendu) ------------------ */
.badge-etat {
    display: inline-block;
    padding: 6px 16px;
    border-radius: 999px;
    font-family: var(--police-titres);
    font-size: 0.72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: #fff;
    box-shadow: var(--ombre);
    white-space: nowrap;
}
.badge-etat--nouveau { background: var(--couleur-succes); }
.badge-etat--reserve { background: var(--couleur-attention); color: var(--couleur-encre); }
.badge-etat--vendu   { background: var(--couleur-danger); }

/* Sur une carte annonce (grille) : pastille posée sur la photo. */
.carte-annonce__photo .badge-etat {
    position: absolute;
    top: 10px;
    left: 10px;
    z-index: 2;
}

/* Page "Vendu" : photos légèrement atténuées pour marquer qu'elles ne sont
   plus disponibles, sans les rendre illisibles. */
.grille-annonces--vendu .carte-annonce__photo img { filter: grayscale(30%); opacity: 0.88; }

.carte-annonce__contenu { padding: 18px 20px; flex: 1; display: flex; flex-direction: column; gap: 5px; }
/* Ligne d'en-tête de la carte (24/07/2026) : catégorie à gauche, pastille
   du pays d'origine (si renseigné) alignée à droite — remplace le simple
   <span> catégorie isolé d'origine, sans changer sa position verticale. */
.carte-annonce__entete { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
/* Taille agrandie le 26/07/2026 (demande Enzo, "un peu plus grand" sur les
   étiquettes d'annonces) — 20x14 -> 26x18. */
.carte-annonce__entete .plaque-drapeau { width: 26px; height: 18px; flex-shrink: 0; }
.carte-annonce__categorie {
    font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.04em;
    color: var(--couleur-accent-fonce); font-weight: 700;
}
/* Petite touche de vert kaki pour distinguer les pièces détachées des
   véhicules en un coup d'œil, sans toucher au reste de la palette. */
.carte-annonce__categorie--piece { color: var(--couleur-kaki-fonce); }
.carte-annonce__titre { margin: 0; font-size: 1.15rem; }
.carte-annonce__prix { margin: 6px 0 0; font-weight: 700; font-size: 1.05rem; }
.carte-annonce__ville { margin: 0; color: var(--couleur-texte-doux); font-size: 0.9rem; }

/* Téléphone (28/07/2026) : les cartes passent de "1 par ligne, pleine
   largeur" à "2 par ligne", soit une largeur à peu près divisée par deux
   (~165-190px au lieu de ~350px sur un écran de 375-430px). Le padding et
   les tailles de police d'origine (pensés pour la largeur pleine) rendent
   alors le contenu trop serré / le texte trop gros par rapport à la carte.
   On réduit donc proportionnellement l'ensemble ci-dessous, uniquement à
   ce palier, pour que chaque carte reste lisible et confortable malgré sa
   largeur réduite — la version PC/tablette n'est pas concernée. */
@media (max-width: 560px) {
    .carte-annonce__contenu { padding: 12px 14px; gap: 3px; }
    .carte-annonce__titre { font-size: 0.95rem; line-height: 1.25; }
    .carte-annonce__prix { font-size: 0.9rem; margin-top: 4px; }
    .carte-annonce__ville { font-size: 0.78rem; }
    .carte-annonce__categorie { font-size: 0.68rem; }
    .carte-annonce__entete .plaque-drapeau { width: 20px; height: 14px; }
    .badge-etat { padding: 5px 12px; font-size: 0.62rem; }
    /* 30/07/2026 (retour Enzo, mobile uniquement) : dans "Coup de cœur",
       les cartes du slider sont bien plus larges (74vw, une seule visible
       à la fois, voir .glissiere-annonces__piste .carte-annonce plus bas)
       que celles de la grille "Dernières arrivées" juste en dessous (2 par
       ligne, ~165-190px) — la réduction de police ci-dessus, pensée pour
       cette dernière, rendait aussi le texte du "Coup de cœur" plus petit
       que nécessaire vu la place disponible. Étiquette/titre/prix
       agrandis ici, seulement pour cette section (le reste du site, dont
       la grille juste en dessous, n'est pas concerné). */
    .section-coup-de-coeur .badge-etat { padding: 7px 16px; font-size: 0.78rem; }
    .section-coup-de-coeur .carte-annonce__titre { font-size: 1.2rem; line-height: 1.3; }
    .section-coup-de-coeur .carte-annonce__prix { font-size: 1.12rem; margin-top: 6px; }
}

.aucun-resultat { text-align: center; color: var(--couleur-texte-doux); padding: 40px 0; }

/* --- Section "Coup de cœur" (annonces mises en avant depuis l'admin) ---
   Fond gris foncé (remplace le 13/07/2026 le vert kaki soutenu utilisé
   depuis le 12/07/2026 — Enzo souhaitait une teinte plus neutre) + titre
   en blanc, pour que la mise en avant se distingue nettement du reste de
   la page. */
.section-coup-de-coeur {
    position: relative;
    /* Espacement augmenté (40px→56px) pour aérer davantage les sections
       de l'accueil entre elles. */
    margin-bottom: 56px;
    padding: 28px 28px 24px;
    /* Coins abattus façon plaque d'identification militaire (demande Enzo
       du 22/07/2026, remplace les coins arrondis 16px) — même principe que
       .bouton-plaque/.header-b__cta déjà utilisé ailleurs sur le site, à
       une échelle adaptée à cette grande section (28px au lieu de 8px). */
    clip-path: polygon(28px 0, 100% 0, 100% calc(100% - 28px), calc(100% - 28px) 100%, 0 100%, 0 28px);
    background: var(--couleur-gris-fonce);
    border: 1px solid rgba(255, 255, 255, 0.08);
    box-shadow: var(--ombre);
}
/* Combinateur d'enfant direct (>) important ici : les cartes du slider
   "Coup de cœur" utilisent elles-mêmes un <h2> pour leur titre
   (`.carte-annonce__titre`) — un simple sélecteur descendant aurait aussi
   agrandi le titre de chaque carte par erreur. */
.section-coup-de-coeur > h2 {
    display: flex;
    align-items: center;
    gap: 10px;
    /* Titres de section agrandis (24px→30px par défaut du navigateur) pour
       mieux marquer chaque section de l'accueil. */
    font-size: 1.85rem;
    margin: 0 0 20px;
    /* Titre en blanc : le texte sombre par défaut du site ne se lirait
       plus une fois le fond assombri en kaki foncé. */
    color: #fff;
}
.section-coup-de-coeur > h2 .icone { color: var(--couleur-accent); width: 24px; height: 24px; }
/* Le bouton "Voir tous les véhicules" (.bouton-voir-tout, partagé avec
   d'autres sections restées sur fond blanc) a son texte par défaut en
   rouge brique foncé — pas assez lisible sur le nouveau fond kaki foncé.
   Repassé en blanc uniquement ici (la bordure et le survol restent
   inchangés, définis globalement plus bas). */
.section-coup-de-coeur .bouton-voir-tout a { color: #fff; }

.titre-section-annonces {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: 1.85rem;
    margin: 0 0 20px;
}
.titre-section-annonces .icone { color: var(--couleur-kaki-fonce); width: 24px; height: 24px; }

/* Indicatif du nombre d'annonces affichées (25/07/2026, demande Enzo) —
   pages "À vendre", "Véhicules", "Pièces détachées" (toutes les trois
   servies par a-vendre.php depuis l'ajout de la pagination le 25/07/2026 —
   voir claude/etat-avancement.md) et la section filtrée de index.php.
   Simple ligne discrète, pas un vrai sous-titre. Sur a-vendre.php, format
   "1 sur X résultats" (X = total, demande explicite d'Enzo) ; sur index.php
   (pas de pagination) elle reste le total simple ("X résultats"). */
.compte-resultats {
    margin: 0 0 20px;
    color: var(--couleur-texte-doux);
    font-size: 0.92rem;
}

/* Pagination (25/07/2026, demande Enzo) — bas des pages "À vendre" /
   "Véhicules" / "Pièces détachées" (a-vendre.php), 32 annonces par page. */
.pagination {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 18px;
    margin: 36px 0 10px;
    flex-wrap: wrap;
}
.pagination__lien {
    display: inline-flex;
    align-items: center;
    padding: 9px 18px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon, 8px);
    color: var(--couleur-encre);
    font-weight: 600;
    font-size: 0.9rem;
    background: #fff;
}
.pagination__lien:hover { border-color: var(--couleur-accent); color: var(--couleur-accent-fonce); text-decoration: none; }
.pagination__lien--desactive {
    color: var(--couleur-texte-doux);
    opacity: 0.5;
    cursor: default;
    pointer-events: none;
}
.pagination__info {
    color: var(--couleur-texte-doux);
    font-size: 0.9rem;
    font-weight: 600;
}
@media (max-width: 480px) {
    .pagination { gap: 10px; }
    .pagination__lien { padding: 8px 14px; font-size: 0.85rem; }
}

/* Pagination NUMÉROTÉE (1, 2, 3, 4 ... 10) du tableau de bord admin
   (28/07/2026, demande Enzo) — réutilise .pagination/.pagination__lien
   ci-dessus pour rester cohérent visuellement avec le site public, avec un
   gabarit plus carré (adapté à un ou deux chiffres) plutôt que le format
   "Précédent"/"Suivant" tout en largeur. */
.pagination__lien--numero { padding: 8px 13px; min-width: 38px; justify-content: center; }
.pagination__lien--actif {
    background: var(--couleur-accent);
    border-color: var(--couleur-accent);
    color: #fff;
    cursor: default;
    pointer-events: none;
}
.pagination__ellipse { color: var(--couleur-texte-doux); padding: 0 2px; }

/* --- Glissière (slider) d'annonces : "Coup de cœur" / "Dernières
   arrivées" sur l'accueil. Défilement horizontal natif (tactile sur
   mobile/tablette), flèches en plus sur desktop. --------------------- */
.glissiere-annonces { position: relative; margin-bottom: 18px; }
.glissiere-annonces__piste {
    display: flex;
    gap: 20px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    padding: 2px 2px 12px;
    scrollbar-width: none;
    -ms-overflow-style: none;
    /* Historique du 29/07/2026 sur cette seule ligne (4 passes en une
       journée, voir le détail complet dans assets/js/glissiere.js,
       commentaire au-dessus de `activerGlisserPiste`) :
       1re passe `pan-x` seul → toujours buggé (résidu vertical qui fuite).
       2e passe `pan-y` (navigateur gère le vertical nativement, JS gère tout
       l'horizontal) → toujours buggé (résidu horizontal qui fuite, malgré
       `pan-y`, en présence de `scroll-snap-type: x mandatory`).
       3e passe `none` (plus aucun défilement natif, tout repris à la main en
       JS dans les deux axes) → réglait le "la piste bouge" mais cassait la
       fluidité du glissement horizontal et bloquait carrément le défilement
       vertical par endroits (retour Enzo : "rien ne se passe").
       **4e passe, approche retenue** : retour à `pan-x` (défilement tactile
       à nouveau 100% natif dans les deux axes, donc toute la fluidité/
       l'inertie native est récupérée), combiné à un filet de sécurité léger
       et non bloquant côté JS (`neutraliserDeriveTactileVerticale`, assets/
       js/glissiere.js) qui rattrape après coup le seul résidu horizontal
       gênant pendant un geste vertical, sans jamais appeler
       `preventDefault()` ni ralentir/bloquer le défilement natif de la
       page. */
    touch-action: pan-x;
}
.glissiere-annonces__piste::-webkit-scrollbar { display: none; }
.glissiere-annonces__piste .carte-annonce { flex: 0 0 250px; scroll-snap-align: start; }
/* "Coup de cœur" : cartes plus grandes, 3 visibles à la fois au lieu de 4. */
.section-coup-de-coeur .glissiere-annonces__piste .carte-annonce { flex: 0 0 320px; }
/* Cliquer-glisser à la souris (en plus du défilement tactile natif). */
.glissiere-annonces__piste--glissable { cursor: grab; }
.glissiere-annonces__piste--glissable .carte-annonce { -webkit-user-select: none; user-select: none; }
.glissiere-annonces__piste--glisse { cursor: grabbing; scroll-behavior: auto; }
/* Le clic sur une carte reste actif tant qu'aucun mouvement réel n'a été
   détecté (voir glissiere.js) : sinon même un simple clic sans glisser
   raterait la carte (pointer-events coupé dès le mousedown, avant même
   de savoir si l'utilisateur voulait cliquer ou glisser). */
.glissiere-annonces__piste--glisse-confirme .carte-annonce { pointer-events: none; }
.glissiere-annonces__fleche {
    position: absolute;
    top: 40%;
    transform: translateY(-50%);
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 1px solid var(--couleur-bordure);
    background: #fff;
    box-shadow: var(--ombre);
    font-size: 1.4rem;
    line-height: 1;
    color: var(--couleur-texte);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 2;
}
.glissiere-annonces__fleche:hover { background: var(--couleur-kaki-fond); }
.glissiere-annonces__fleche--prec { left: -18px; }
.glissiere-annonces__fleche--suiv { right: -18px; }

.bouton-voir-tout { text-align: center; margin: 0 0 40px; }
/* Coins abattus façon "plaque militaire" (demande Enzo du 23/07/2026,
   remplace les coins arrondis génériques). ⚠️ Un premier essai a gardé le
   style "contour" (fond transparent + simple bordure de 1px) : une fois
   coupé en polygone via clip-path, ce contour se retrouvait cassé aux deux
   coins tronqués (clip-path découpe aussi la bordure, mais ne redessine pas
   de trait le long de la coupe diagonale — visuellement, le bouton
   semblait "à moitié dessiné"). Corrigé en passant en fond plein (même
   traitement que .bouton-plaque/.site-nav__cta ailleurs sur le site, qui
   n'a jamais ce problème car un aplat de couleur reste net une fois
   coupé, contrairement à un simple contour). */
.bouton-voir-tout a {
    display: inline-block;
    background: var(--couleur-accent);
    color: #fff;
    padding: 10px 22px;
    clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
    font-weight: 600;
    font-size: 0.9rem;
    box-shadow: 0 2px 0 rgba(0, 0, 0, 0.2);
    transition: background 0.2s ease;
}
.bouton-voir-tout a:hover { background: var(--couleur-accent-fonce); color: #fff; text-decoration: none; }

/* Variante à 2 boutons (28/07/2026, demande Enzo) : "Dernières arrivées"
   affiche désormais son bouton existant + un 2e dédié aux pièces, tous
   deux centrés côte à côte. Passe le conteneur en flex (au lieu du
   text-align:center hérité ci-dessus, sans effet ici mais inoffensif) —
   flex-wrap pour repasser proprement sur 2 lignes centrées si la place
   manque (petits écrans). */
.bouton-voir-tout--groupe {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-wrap: wrap;
    gap: 14px;
}

@media (max-width: 700px) {
    .glissiere-annonces__fleche { display: none; }
    .glissiere-annonces__piste .carte-annonce { flex-basis: 74vw; }
    /* ⚠️ 25/07/2026 : sans cette ligne, la règle ci-dessus (spécificité
       0,2,0) ne l'emporte jamais sur `.section-coup-de-coeur
       .glissiere-annonces__piste .carte-annonce` définie plus haut dans le
       fichier (spécificité 0,3,0, hors média-requête) — une spécificité
       plus élevée l'emporte toujours, peu importe l'ordre des règles ou la
       présence d'un @media. Résultat : sur téléphone, les cartes du slider
       "Coup de cœur" restaient figées à 320px de large (largeur desktop)
       au lieu de suivre le 74vw prévu pour mobile — première carte visible
       tronquée d'environ 20% au chargement, sans les flèches (masquées
       juste au-dessus) pour indiquer qu'il faut swiper. Répété ici avec la
       même spécificité que la règle desktop pour bien la neutraliser. */
    .section-coup-de-coeur .glissiere-annonces__piste .carte-annonce { flex-basis: 74vw; }
}

/* Téléphone/tablette (28/07/2026, demande Enzo : "mets 'coup de cœur' en
   pleine largeur, le bloc gris en fond, pour gagner de la place") : le
   fond gris de la section reste inséré à l'intérieur de .accueil-layout
   (20px de padding, voir plus haut) + son propre padding desktop de 28px
   de chaque côté sur mobile — soit 48px perdus de chaque bord avant même
   d'arriver au slider de cartes, qui n'affichait donc qu'une toute petite
   portion de la carte suivante. Même technique que .bloc-accueil /
   .page-hero plus haut dans le fichier : la section déborde sur toute la
   largeur de la fenêtre (100vw + marges négatives), et son padding interne
   est réduit (20px) pour que le titre et le slider gagnent significativement
   en largeur utile, sans coller le contenu aux bords de l'écran pour
   autant. Le clip-path "coin coupé" desktop est retiré ici : sur un bloc
   plein écran qui touche déjà les deux bords, la découpe diagonale
   d'origine (pensée pour un bloc inséré avec de la marge tout autour)
   perdait son sens et laissait une encoche visuellement étrange pile dans
   le coin de l'écran. */
@media (max-width: 1000px) {
    .section-coup-de-coeur {
        width: 100vw;
        margin-left: calc(-50vw + 50%);
        margin-right: calc(-50vw + 50%);
        padding: 24px 20px 20px;
        clip-path: none;
        border-left: none;
        border-right: none;
    }
}
/* ⚠️ 30/07/2026 : l'ancien chevauchement "Coup de cœur" par-dessus l'encart
   de filtres (fond de section remonté par marge négative + z-index sur
   .page-hero) a été retiré — Enzo est revenu sur le principe de barre "à
   cheval" (voir .page-hero:not(.page-hero--compact) .barre-filtres plus
   haut, maintenant en flux normal DANS le bandeau photo). Les 2 sections
   s'enchaînent donc simplement l'une après l'autre, sans marge négative ni
   chevauchement, avec l'espacement standard ci-dessus (padding-top: 24px).
*/

/* --- Apparition en douceur au scroll ------------------------------------
   30/07/2026 (demande Enzo : "revois les animations d'entrée... ça doit
   être fluide et beau") : courbe re-choisie pour une décélération douce
   ("ease-out-expo", cubic-bezier(0.16, 1, 0.3, 1)) plutôt que le "ease"
   linéaire d'origine — même signature de mouvement que la nouvelle entrée
   des bandeaux hero ci-dessous, pour une cohérence sur tout le site. Léger
   effet d'échelle (0.97→1) ajouté en plus du glissement vertical, pour une
   apparition avec un peu plus de profondeur/matière qu'un simple fondu. */
.reveal-attente {
    opacity: 0;
    transform: translateY(24px) scale(0.97);
    transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
}
.reveal-visible { opacity: 1; transform: translateY(0) scale(1); }
/* Cascade sur les grilles d'annonces (jusqu'à 8 cartes — au-delà, ça reste
   à 420ms, l'apparition individuelle au scroll prend ensuite le relais). */
.grille-annonces .carte-annonce:nth-child(1) { transition-delay: 0ms; }
.grille-annonces .carte-annonce:nth-child(2) { transition-delay: 60ms; }
.grille-annonces .carte-annonce:nth-child(3) { transition-delay: 120ms; }
.grille-annonces .carte-annonce:nth-child(4) { transition-delay: 180ms; }
.grille-annonces .carte-annonce:nth-child(5) { transition-delay: 240ms; }
.grille-annonces .carte-annonce:nth-child(6) { transition-delay: 300ms; }
.grille-annonces .carte-annonce:nth-child(7) { transition-delay: 360ms; }
.grille-annonces .carte-annonce:nth-child(8) { transition-delay: 420ms; }
/* ⚠️ Le slider "Coup de cœur" (.glissiere-annonces__piste .carte-annonce)
   n'utilise plus ce système au scroll depuis le 30/07/2026 (voir plus bas,
   "Entrée immédiate de Coup de cœur au chargement" + assets/js/dynamique.js,
   ses cartes sont désormais exclues de l'observateur) — sa propre cascade
   d'apparition vit dans ce nouveau bloc, avec animation-delay plutôt que
   transition-delay. */
.etapes .etape:nth-child(1) { transition-delay: 0ms; }
.etapes .etape:nth-child(2) { transition-delay: 90ms; }
.etapes .etape:nth-child(3) { transition-delay: 180ms; }
.atouts .atout:nth-child(1) { transition-delay: 0ms; }
.atouts .atout:nth-child(2) { transition-delay: 80ms; }
.atouts .atout:nth-child(3) { transition-delay: 160ms; }
.atouts .atout:nth-child(4) { transition-delay: 240ms; }
@media (prefers-reduced-motion: reduce) {
    .reveal-attente { opacity: 1; transform: none; transition: none; }
}

/* --- Entrée animée des premières sections de page (30/07/2026) ----------
   Différent du "reveal" au scroll ci-dessus : ces éléments (bandeau hero,
   titre de page...) sont visibles DÈS le chargement, sans scroll — pas
   besoin de JavaScript/IntersectionObserver ici, l'animation se joue toute
   seule via @keyframes dès que la page s'affiche. Même courbe de
   décélération douce que le reveal au scroll, pour une seule signature de
   mouvement cohérente sur tout le site. Demande Enzo : "surtout la page
   d'accueil car c'est l'entrée sur le site, ça doit être fluide et beau". */
@keyframes entree-echelle-fondu {
    from { opacity: 0; transform: scale(1.06); }
    to   { opacity: 1; transform: scale(1); }
}
@keyframes entree-fondu-simple {
    from { opacity: 0; }
    to   { opacity: 1; }
}
@keyframes entree-glissement-fondu {
    from { opacity: 0; transform: translateY(24px); }
    to   { opacity: 1; transform: translateY(0); }
}

/* Bandeaux hero avec photo (accueil, à vendre, annuaire professionnels) :
   la photo se dévoile en un léger zoom arrière, le voile sombre apparaît
   juste après, puis le titre, le sous-titre et enfin la barre de filtres/
   le bouton arrivent en cascade — jamais tout d'un coup. */
.page-hero__image-fixe,
.annuaire-hero__image-fixe {
    animation: entree-echelle-fondu 1.3s cubic-bezier(0.16, 1, 0.3, 1) both;
}
.page-hero__overlay,
.annuaire-hero__overlay {
    animation: entree-fondu-simple 1s ease-out 0.1s both;
}
.page-hero__titre-flottant,
.page-hero .intro-page h1,
.annuaire-hero__interieur h1 {
    animation: entree-glissement-fondu 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.35s both;
}
.page-hero .sous-titre,
.annuaire-hero__interieur p {
    animation: entree-glissement-fondu 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.5s both;
}
.page-hero .barre-filtres,
.annuaire-hero__cta {
    animation: entree-glissement-fondu 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.65s both;
}
/* 30/07/2026 (demande Enzo, "revois les animations d'entrée") : le bouton
   "Tarification" (.annuaire-hero__cta-secondaire) a été ajouté après coup,
   sous le bouton principal ci-dessus, mais sans jamais rejoindre cette
   cascade d'entrée — il restait donc à opacité 100% dès la 1re image (t=0),
   flottant au-dessus d'un bandeau encore invisible pendant que tout le
   reste (photo, voile, titre, sous-titre, bouton principal) continuait de
   se fondre en fondu jusqu'à ~1,7s. Rejoint maintenant la cascade juste
   après le bouton principal (0.65s → 0.78s). */
.annuaire-hero__cta-secondaire {
    animation: entree-glissement-fondu 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.78s both;
}

/* Pages sans bandeau photo (mentions légales, CGU/CGV, confidentialité :
   simple <h1> ; contact, dépôt d'annonce, vendu : bloc titre + sous-titre)
   — entrée plus sobre mais cohérente avec le reste, sans toucher aux
   fichiers .php de ces pages (ciblage uniquement via leur structure HTML
   déjà en place : <h1> ou .intro-page directement enfant de <main>). */
.page-principale > h1,
.page-principale > .intro-page h1 {
    animation: entree-glissement-fondu 0.8s cubic-bezier(0.16, 1, 0.3, 1) both;
}
.page-principale > .intro-page .sous-titre {
    animation: entree-glissement-fondu 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.15s both;
}

/* Entrée immédiate de "Coup de cœur" au chargement (30/07/2026, demande
   Enzo) : avec le nouveau bandeau hero raccourci (voir .page-hero:not(.page-hero--compact)
   plus haut), un bout de cette section reste visible dans la fenêtre dès le
   chargement, sans avoir scrollé — l'ancien système "apparition au scroll"
   (assets/js/dynamique.js, classes .reveal-attente/.reveal-visible) ne la
   déclarait donc pas encore "vue" à ce moment-là, et elle restait
   invisible/figée jusqu'à ce qu'on scrolle un peu plus. Elle est maintenant
   exclue de ce système (voir dynamique.js) et rejoint à la place la même
   cascade d'entrée au chargement que le bandeau photo juste au-dessus,
   directement à la suite (la barre de filtres démarre à 0.65s ci-dessus).
   Suit la même logique de cascade que .grille-annonces plus haut (nth-child),
   mais avec animation-delay (chargement) plutôt que transition-delay
   (scroll) — ne vise que les vraies cartes, jamais les clones du défilement
   infini ajoutés après coup par assets/js/glissiere.js (mêmes classes,
   donc même animation rejouée sur eux : sans effet visible, ils ne sont de
   toute façon visibles qu'après une interaction avec le slider, bien après
   la fin de cette séquence). */
.section-coup-de-coeur {
    animation: entree-glissement-fondu 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.75s both;
}
.section-coup-de-coeur .glissiere-annonces__piste .carte-annonce {
    animation: entree-glissement-fondu 0.7s cubic-bezier(0.16, 1, 0.3, 1) both;
}
.section-coup-de-coeur .glissiere-annonces__piste .carte-annonce:nth-child(1) { animation-delay: 0.85s; }
.section-coup-de-coeur .glissiere-annonces__piste .carte-annonce:nth-child(2) { animation-delay: 0.91s; }
.section-coup-de-coeur .glissiere-annonces__piste .carte-annonce:nth-child(3) { animation-delay: 0.97s; }
.section-coup-de-coeur .glissiere-annonces__piste .carte-annonce:nth-child(4) { animation-delay: 1.03s; }

@media (prefers-reduced-motion: reduce) {
    .page-hero__image-fixe,
    .annuaire-hero__image-fixe,
    .page-hero__overlay,
    .annuaire-hero__overlay,
    .page-hero__titre-flottant,
    .page-hero .intro-page h1,
    .annuaire-hero__interieur h1,
    .page-hero .sous-titre,
    .annuaire-hero__interieur p,
    .page-hero .barre-filtres,
    .annuaire-hero__cta,
    .annuaire-hero__cta-secondaire,
    .page-principale > h1,
    .page-principale > .intro-page h1,
    .page-principale > .intro-page .sous-titre,
    .section-coup-de-coeur,
    .section-coup-de-coeur .glissiere-annonces__piste .carte-annonce {
        animation: none;
        opacity: 1;
        transform: none;
    }
}

/* --- Fiche annonce détail --------------------------------------------- */
.fil-ariane { margin-bottom: 16px; position: relative; z-index: 1; }
/* 30/07/2026 (demande Enzo, capture d'écran mobile à l'appui) : le lien
   "Retour aux annonces" était un simple lien texte, sans aucun habillage —
   trop discret, risque de passer inaperçu. Transformé en petit bouton
   secondaire (fond clair + bordure + ombre légère), même famille visuelle
   que .bouton-secondaire mais en plus compact, pour rester nettement moins
   voyant que le bouton principal "Déposer une annonce" tout en étant
   clairement identifiable comme cliquable — sur mobile, tablette et PC (pas
   de media query dédiée ici : la taille compacte convient déjà partout). */
.fil-ariane a {
    display: inline-block;
    padding: 10px 20px;
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    color: var(--couleur-texte);
    font-weight: 600;
    font-size: 0.9rem;
    box-shadow: 0 2px 8px rgba(23, 24, 20, 0.08);
    transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
}
.fil-ariane a:hover,
.fil-ariane a:focus-visible {
    background: var(--couleur-kaki-fond);
    border-color: var(--couleur-kaki);
    color: var(--couleur-texte);
    text-decoration: none;
    transform: translateX(-3px);
    box-shadow: 0 4px 14px rgba(23, 24, 20, 0.14);
}
.fil-ariane a:active { transform: translateX(-1px); }

.fiche-annonce {
    position: relative;
    z-index: 1;
    display: grid;
    grid-template-columns: 1.2fr 1fr;
    gap: 32px;
    align-items: start;
}

.fiche-annonce__galerie,
.fiche-annonce__infos {
    /* Empêche la bande de vignettes (largeur intrinsèque fixe, non
       compressible) de forcer la largeur de toute la colonne de la
       grille — sans ça, sur mobile (colonne unique), une annonce avec
       plusieurs photos fait déborder toute la page horizontalement. */
    min-width: 0;
}

.fiche-annonce__galerie .carte-annonce__photo-absente {
    aspect-ratio: 1 / 1;
    border-radius: var(--rayon);
    border: 1px solid var(--couleur-bordure);
    background: #f0eee7;
}

.galerie__principale {
    position: relative;
    aspect-ratio: 1 / 1;
    overflow: hidden;
    border-radius: var(--rayon);
    border: 1px solid var(--couleur-bordure);
    background: #f0eee7;
}
.galerie__principale img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: opacity 0.15s ease;
    cursor: zoom-in;
    /* Empêche le glisser-déposer natif de l'image (nécessaire pour le
       cliquer-glisser "changer de photo" en JS) et la sélection de texte
       accidentelle pendant le geste. */
    -webkit-user-drag: none;
    user-select: none;
    -webkit-user-select: none;
}
.galerie__principale .badge-etat {
    position: absolute;
    top: 12px;
    left: 12px;
    z-index: 2;
    font-size: 0.88rem;
    padding: 9px 20px;
}

/* Flèches de navigation, visibles au survol de la photo principale
   (masquées sur tactile où le survol n'existe pas — les vignettes en
   dessous restent le moyen de navigation). */
.galerie__fleche {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 40px;
    height: 40px;
    border: none;
    border-radius: 50%;
    background: rgba(23, 24, 20, 0.55);
    color: #fff;
    font-size: 1.6rem;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    opacity: 0;
    transition: opacity 0.15s ease, background 0.15s ease;
}
.galerie__principale:hover .galerie__fleche { opacity: 1; }
.galerie__fleche:hover { background: rgba(23, 24, 20, 0.8); }
.galerie__fleche--prec { left: 12px; }
.galerie__fleche--suiv { right: 12px; }

@media (hover: none) {
    .galerie__fleche { display: none; }
}

.galerie__vignettes {
    display: flex;
    gap: 8px;
    margin-top: 10px;
    overflow-x: auto;
    padding-bottom: 4px;
}
.galerie__vignette {
    flex: 0 0 auto;
    width: 72px;
    height: 72px;
    padding: 0;
    border: 2px solid transparent;
    border-radius: 8px;
    overflow: hidden;
    cursor: pointer;
    background: none;
    opacity: 0.65;
    transition: opacity 0.15s ease, border-color 0.15s ease;
}
.galerie__vignette img { width: 100%; height: 100%; object-fit: cover; display: block; }
.galerie__vignette:hover { opacity: 1; }
.galerie__vignette--active { opacity: 1; border-color: var(--couleur-accent); }

/* --- Lightbox (zoom plein écran, clic sur la photo principale) --------- */
.lightbox {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 100;
    align-items: center;
    justify-content: center;
    background: rgba(15, 16, 12, 0.92);
    padding: 40px;
}
.lightbox--ouverte { display: flex; }
body.lightbox-ouverte { overflow: hidden; }

.lightbox__image {
    max-width: 90vw;
    max-height: 90vh;
    object-fit: contain;
    border-radius: 4px;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
}

.lightbox__fermer {
    position: absolute;
    top: 20px;
    right: 24px;
    width: 44px;
    height: 44px;
    border: none;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    font-size: 1.8rem;
    line-height: 1;
    cursor: pointer;
}
.lightbox__fermer:hover { background: rgba(255, 255, 255, 0.22); }

.lightbox .lightbox__fleche {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 48px;
    height: 48px;
    border: none;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    font-size: 2rem;
    line-height: 1;
    cursor: pointer;
}
.lightbox .lightbox__fleche:hover { background: rgba(255, 255, 255, 0.22); }
.lightbox .lightbox__fleche--prec { left: 24px; }
.lightbox .lightbox__fleche--suiv { right: 24px; }
.lightbox--une-photo .lightbox__fleche { display: none; }

@media (max-width: 600px) {
    .lightbox { padding: 16px; }
    .lightbox .lightbox__fleche { width: 40px; height: 40px; font-size: 1.6rem; }
    .lightbox__fermer { top: 10px; right: 12px; }
}

/* Toute la colonne de droite (résumé + description + contact) reste
   collée au scroll tant que la galerie à gauche est plus haute qu'elle —
   comportement "sticky sidebar" classique. Le fond opaque évite tout
   chevauchement visuel avec ce qui défile derrière (photo, page suivante). */
.fiche-annonce__infos {
    position: sticky;
    top: 128px; /* dégage la hauteur du header sticky (~115px) + une marge */
    align-self: start;
    background: var(--couleur-fond);
    z-index: 1;
}

.fiche-annonce__prix { font-size: 1.4rem; font-weight: 700; margin: 6px 0 16px; }

.fiche-annonce__caracteristiques {
    list-style: none;
    padding: 0;
    margin: 0 0 20px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.fiche-annonce__caracteristiques li { display: flex; align-items: center; gap: 8px; }
.fiche-annonce__caracteristiques .icone { color: var(--couleur-kaki-fonce); }

.fiche-annonce__description h2,
.fiche-annonce__contact h2 {
    display: flex;
    align-items: center;
    gap: 8px;
}
.fiche-annonce__description h2 .icone,
.fiche-annonce__contact h2 .icone {
    color: var(--couleur-accent);
}

.fiche-annonce__description {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 20px 24px;
    margin-top: 24px;
}

.fiche-annonce__contact {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 20px 24px;
    margin-top: 20px;
}

@media (max-width: 800px) {
    .fiche-annonce { grid-template-columns: 1fr; }
    .fiche-annonce__infos { position: static; }
}

/* --- Fiche annonce détail (page publique) — "Écran divisé", validée avec
   Enzo le 09/07/2026 en remplacement de l'ancienne mise en page en grille
   ci-dessus (`.fiche-annonce`, toujours utilisée par la prévisualisation
   admin dans admin/annonce.php — laissée inchangée). Galerie collante à
   gauche (vraie galerie du site, `.galerie` / assets/js/galerie.js : clic
   pour zoomer, flèches, cliquer-glisser pour changer de photo), fiche qui
   défile à droite. Mise en page large mais centrée : on sort du conteneur
   centré habituel du site (plafonné à 1400px, trop étroit ici), puis on
   replafonne à 1760px bien centré — ni collée au bord gauche de l'écran,
   ni cadre étriqué. --------------------------------------------------- */
.fiche-detail {
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    margin-right: calc(-50vw + 50%);
}
.fiche-detail__interieur {
    max-width: 1760px;
    margin: 0 auto;
    /* Garantit une marge confortable des deux côtés même quand la fenêtre
       est plus étroite que 1760px (donc que le "plein écran" ne laisse
       aucune marge automatique) : sans ça, la photo se retrouvait collée
       au bord gauche de l'écran sur la plupart des ordinateurs. */
    padding: 0 40px;
    box-sizing: border-box;
    display: flex;
    align-items: flex-start;
    /* Les deux colonnes ont chacune une largeur maximale (photo comme
       texte n'ont pas besoin de plus pour bien rendre) et un écart fixe
       et volontairement resserré entre elles (`gap`), plutôt que deux
       colonnes en pourcentage (46/54) qui s'étiraient chacune de leur
       côté sur un cadre très large : ça laissait un grand vide entre la
       photo et le texte, qui semblaient alors chacun "flotter" au lieu
       de former un seul bloc. Le duo est ensuite centré comme un tout
       dans le cadre. */
    justify-content: center;
    gap: 48px;
    min-height: 600px;
}

.fiche-detail__galerie {
    width: 100%;
    max-width: 680px;
    flex: 1 1 640px;
    padding: 28px 0;
    position: sticky;
    /* ⚠️ 25/07/2026 : remplace l'ancien décalage fixe (top: 128px, pensé
       pour la hauteur du header desktop non empilé, ~115px). Entre 900px
       (bascule de cette colonne en position: static, voir plus bas) et
       1360px (seuil du menu burger mobile/tablette, .header-b__interieur —
       relevé de 1180px à 1360px le 29/07/2026), le header réellement affiché est bien plus
       haut que 128px — la galerie, restée sticky avec cet ancien décalage
       fixe, remontait alors sous le header collé au scroll (chevauchement)
       sur cette plage de largeurs tablette. On réutilise donc la même
       variable CSS que .page-hero/.sentinelle-header (mesurée en JS par
       assets/js/dynamique.js, toujours à jour quelle que soit la hauteur
       réelle du header). */
    top: calc(var(--hauteur-header, 88px) + 20px);
    align-self: flex-start;
    max-height: calc(100vh - var(--hauteur-header, 88px) - 20px);
    overflow-y: auto;
}
/* Photo un peu plus contenue qu'un carré plein (aspect-ratio plus large +
   hauteur maximale plafonnée), pour bien s'adapter aux photos de
   véhicules (plus larges que hautes) sans recadrage trop agressif. */
.fiche-detail__galerie .galerie__principale {
    aspect-ratio: 5 / 4;
    max-height: calc(100vh - 280px);
    min-height: 300px;
}

.fiche-detail__contenu {
    width: 100%;
    max-width: 640px;
    flex: 1 1 600px;
    padding: 40px 0 40px 40px;
    border-left: 1px solid var(--couleur-bordure);
}
.fiche-detail__contenu-interieur { max-width: 600px; margin: 0; }
.fiche-detail__eyebrow { font-family: var(--police-titres); font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--couleur-accent-fonce); font-weight: 700; }
.fiche-detail__contenu h1 { font-family: var(--police-titres); font-weight: 600; font-size: 2rem; margin: 8px 0 6px; line-height: 1.15; }
.fiche-detail__prix { font-family: var(--police-titres); font-weight: 700; font-size: 2.5rem; letter-spacing: 0.01em; color: var(--couleur-accent-fonce); margin: 0 0 22px; }

/* Pays d'origine (vendeur) : sur sa propre ligne entre le prix et les
   pastilles année/état/corps d'armée/ville (26/07/2026, demande Enzo,
   capture à l'appui — auparavant dernière pastille de .fiche-detail__pills
   plus bas). Marges haut/bas généreuses pour ne pas serrer le drapeau
   contre le prix au-dessus ni les pastilles en dessous. */
.fiche-detail__pays {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 14px 0 22px;
    font-size: 0.95rem;
    color: var(--couleur-texte);
}
.fiche-detail__pays .plaque-drapeau { width: 24px; height: 16px; }

/* Ligne titre + bouton de partage (ajouté le 23/07/2026) : le titre garde
   ses marges habituelles (règle ci-dessus), le bouton vient se caler à
   droite sur la même ligne, verticalement centré sur la hauteur du titre. */
.fiche-detail__titre-ligne { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; }
.fiche-detail__titre-ligne h1 { flex: 1 1 auto; }
.bouton-partage {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 10px;
    padding: 8px 14px;
    background: none;
    border: 1.5px solid var(--couleur-bordure);
    border-radius: 999px;
    color: var(--couleur-texte);
    font-family: var(--police);
    font-size: 0.82rem;
    font-weight: 500;
    cursor: pointer;
    white-space: nowrap;
    transition: background 0.18s ease, border-color 0.18s ease, color 0.18s ease;
}
.bouton-partage .icone { width: 15px; height: 15px; }
.bouton-partage:hover { border-color: var(--couleur-accent); color: var(--couleur-accent-fonce); background: #fbeeea; }
/* État temporaire affiché après copie du lien dans le presse-papiers
   (repli sur les navigateurs sans API de partage native, cf.
   assets/js/partage.js) — vert kaki plutôt que rouge accent, pour bien le
   distinguer visuellement d'un état d'erreur. */
.bouton-partage--copie { border-color: var(--couleur-kaki); color: var(--couleur-kaki-fonce); background: var(--couleur-kaki-fond); }
@media (max-width: 560px) {
    .fiche-detail__titre-ligne { flex-wrap: wrap; }
    .bouton-partage__texte { display: none; }
    /* 30/07/2026 (demande Enzo, capture à l'appui) : le bouton passait à la
       ligne sous le titre (souvent lui-même sur deux lignes), ce qui le
       faisait atterrir "mélangé" entre le titre et le prix. Repositionné en
       absolu dans le coin haut-droit de la colonne de contenu — au niveau
       de la catégorie ("REMORQUES") tout en haut, jamais dans le flux du
       titre/prix — comme demandé. .fiche-detail__contenu-interieur devient
       le repère de positionnement (position: relative) ; le titre garde un
       peu de marge à droite pour ne jamais passer sous le bouton même sur
       sa première ligne. */
    .fiche-detail__contenu-interieur { position: relative; }
    .fiche-detail__titre-ligne .bouton-partage {
        position: absolute;
        top: 0;
        right: 0;
        margin-top: 0;
    }
    .fiche-detail__contenu h1 { padding-right: 48px; }
}

.fiche-detail__pills { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 30px; padding: 0; list-style: none; }
.fiche-detail__pills li {
    display: inline-flex; align-items: center; gap: 6px;
    background: var(--couleur-kaki-fonce); color: var(--couleur-encre-claire);
    padding: 8px 14px; border-radius: 999px; font-size: 0.82rem; font-weight: 500;
}
.fiche-detail__pills .icone { color: var(--couleur-kaki-fond); }

.fiche-detail__section { margin-bottom: 30px; max-width: 620px; }
.fiche-detail__section h2 { font-family: var(--police-titres); font-size: 1rem; text-transform: uppercase; letter-spacing: 0.04em; margin: 0 0 10px; display: flex; align-items: center; gap: 8px; }
.fiche-detail__section h2 .icone { color: var(--couleur-accent); }
.fiche-detail__section p { color: var(--couleur-texte-doux); line-height: 1.65; font-size: 0.93rem; margin: 0; }

.fiche-detail__contact { background: #f7f6f1; border: 1px solid var(--couleur-bordure); border-radius: 12px; padding: 22px; max-width: 460px; }
.fiche-detail__contact h2 { font-family: var(--police-titres); font-size: 1rem; text-transform: uppercase; letter-spacing: 0.04em; margin: 0 0 12px; }
/* overflow-wrap (25/07/2026) : l'email/nom/téléphone du vendeur (saisis
   librement via deposer-annonce.php, sans limite de longueur pour l'email)
   sont des chaînes sans espace — sans cette règle, le navigateur ne peut
   jamais les couper en fin de ligne. Sur PC, la colonne (jusqu'à 460px de
   large) absorbe une adresse un peu longue sans problème ; sur téléphone,
   une fois la page empilée sur une seule colonne étroite, une adresse
   longue dépassait de l'encart "Contacter le vendeur" et provoquait un
   débordement horizontal de toute la page. */
.fiche-detail__contact p { margin: 0 0 4px; font-size: 0.9rem; color: var(--couleur-texte-doux); overflow-wrap: break-word; }
.fiche-detail__contact-boutons { display: flex; gap: 10px; margin-top: 14px; flex-wrap: wrap; }
/* Le bouton "Envoyer un email" est un <button> depuis le 26/07/2026 (popup
   de contact, voir annonce.php) au lieu d'un lien mailto: — mêmes règles
   que les liens <a> ("Appeler"), plus une remise à zéro du style natif de
   bouton (bordure/police/curseur), pour un rendu strictement identique. */
.fiche-detail__contact-boutons a,
.fiche-detail__contact-boutons button {
    flex: 1; min-width: 150px; text-align: center;
    padding: 12px 16px; border-radius: 8px; font-weight: 600; font-size: 0.85rem;
    text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: 7px;
    border: none; font-family: inherit; cursor: pointer;
}
.fiche-detail__contact-boutons a.principal,
.fiche-detail__contact-boutons button.principal { background: var(--couleur-accent); color: #fff; }
.fiche-detail__contact-boutons a.principal:hover,
.fiche-detail__contact-boutons button.principal:hover { background: var(--couleur-accent-fonce); text-decoration: none; }
.fiche-detail__contact-boutons a.secondaire,
.fiche-detail__contact-boutons button.secondaire { background: #fff; border: 1px solid var(--couleur-bordure); color: var(--couleur-encre); }
.fiche-detail__contact-boutons a.secondaire:hover,
.fiche-detail__contact-boutons button.secondaire:hover { background: var(--couleur-kaki-fond); text-decoration: none; }
.fiche-detail__avertissement { font-size: 0.76rem; color: var(--couleur-texte-doux); margin-top: 24px; opacity: 0.8; }

/* Annonce vendue : le bloc "Contacter le vendeur" est remplacé par un simple
   message (plus de coordonnées affichées, la vente étant déjà conclue). */
.fiche-detail__contact--vendu .fiche-detail__avertissement { margin-top: 0; font-size: 0.85rem; opacity: 1; }

/* Popup "Contacter le vendeur" (26/07/2026) — remplace l'ancien lien
   mailto: direct : l'email du vendeur n'est plus jamais affiché côté
   visiteur, le message passe par ce formulaire et est transmis par email
   côté serveur (voir annonce.php). Ouverture/fermeture en JS (classe
   "modal-contact--ouverte", voir assets/js/dynamique.js) ; réouverte
   automatiquement par le serveur s'il y a des erreurs de validation. */
.modal-contact {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 500;
    align-items: center;
    justify-content: center;
    padding: 20px;
}
.modal-contact--ouverte { display: flex; }
.modal-contact__fond {
    position: absolute;
    inset: 0;
    background: rgba(23, 24, 20, 0.65);
    border: none;
    padding: 0;
    cursor: pointer;
}
.modal-contact__panneau {
    position: relative;
    background: #fff;
    border-radius: var(--rayon, 10px);
    max-width: 480px;
    width: 100%;
    max-height: 90vh;
    overflow-y: auto;
    padding: 30px 26px 26px;
    box-shadow: 0 24px 60px rgba(0, 0, 0, 0.35);
}
.modal-contact__fermer {
    position: absolute;
    top: 10px;
    right: 12px;
    width: 34px;
    height: 34px;
    border: none;
    background: transparent;
    font-size: 1.7rem;
    line-height: 1;
    cursor: pointer;
    color: var(--couleur-texte-doux);
}
.modal-contact__fermer:hover { color: var(--couleur-accent-fonce); }
.modal-contact__panneau h2 {
    margin: 0 0 18px;
    padding-right: 30px;
    font-family: var(--police-titres);
    font-size: 1.15rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
/* Réutilise le style des champs .formulaire-annonce (label/input/textarea)
   sans reprendre son cadre/fond propre : le panneau de la popup fait déjà
   office de cadre. */
.modal-contact__panneau .formulaire-annonce {
    background: none;
    border: none;
    padding: 0;
    max-width: none;
    margin: 0;
}
.modal-contact__panneau .formulaire-annonce button[type="submit"] { width: 100%; margin-top: 18px; }
body.modal-contact-ouverte { overflow: hidden; }
@media (max-width: 560px) {
    .modal-contact__panneau { padding: 26px 18px 20px; }
}

/* Popup "Enrôlez votre entreprise" (annuaire des professionnels,
   29/07/2026) — remplace l'ancienne redirection vers contact.php. Reprend
   à l'identique le gabarit de .modal-contact ci-dessus (fond assombri +
   panneau centré + bouton de fermeture), dupliqué ici sous son propre nom
   plutôt que partagé avec .modal-contact : ce dernier est déjà en
   production sur la fiche annonce, autant ne jamais risquer de régression
   dessus en le généralisant. Ouverture/fermeture en JS (classe
   "modal-annuaire--ouverte", voir assets/js/dynamique.js) ; réouverte
   automatiquement par le serveur s'il y a des erreurs de validation. */
.modal-annuaire {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 500;
    align-items: center;
    justify-content: center;
    padding: 20px;
}
.modal-annuaire--ouverte { display: flex; }
.modal-annuaire__fond {
    position: absolute;
    inset: 0;
    background: rgba(23, 24, 20, 0.65);
    border: none;
    padding: 0;
    cursor: pointer;
}
.modal-annuaire__panneau {
    position: relative;
    background: #fff;
    border-radius: var(--rayon, 10px);
    /* 30/07/2026 (demande Enzo) : légèrement élargi (480px → 520px) pour
       laisser un peu plus de respiration sur mobile/tablette — la grille 2
       colonnes ci-dessous (voir .formulaire-ligne dans la règle plus bas)
       prend elle-même le relais à partir de 601px avec un panneau bien
       plus large, pour tenir sur PC/tablette sans avoir à scroller. */
    max-width: 520px;
    width: 100%;
    max-height: 90vh;
    overflow-y: auto;
    padding: 30px 26px 26px;
    box-shadow: 0 24px 60px rgba(0, 0, 0, 0.35);
}
/* 30/07/2026 (demande Enzo : "trop en hauteur sur les grands écrans, PC et
   tablette... ne touche pas à la version mobile") : à partir de 601px
   (même seuil que .formulaire-ligne ci-dessous, pour rester cohérent), le
   panneau s'élargit nettement pour accueillir les champs groupés par deux
   côte à côte — le formulaire tient alors sans scroll interne sur la
   plupart des écrans PC/tablette. En dessous de ce seuil (téléphone),
   .formulaire-ligne repasse en une seule colonne (règle déjà existante) :
   la disposition mobile reste inchangée. */
@media (min-width: 601px) {
    .modal-annuaire__panneau {
        max-width: 700px;
        padding: 34px 40px 32px;
    }
}
/* Les champs groupés par deux (voir professionnels.php) doivent pouvoir se
   rétrécir sous leur largeur "naturelle" dans une colonne de grille — sans
   ça, un <select> un peu large peut forcer sa colonne à déborder. */
.modal-annuaire__panneau .formulaire-annonce__champ { min-width: 0; }
.modal-annuaire__fermer {
    position: absolute;
    top: 10px;
    right: 12px;
    width: 34px;
    height: 34px;
    border: none;
    background: transparent;
    font-size: 1.7rem;
    line-height: 1;
    cursor: pointer;
    color: var(--couleur-texte-doux);
}
.modal-annuaire__fermer:hover { color: var(--couleur-accent-fonce); }
.modal-annuaire__panneau h2 {
    margin: 0 0 18px;
    padding-right: 30px;
    font-family: var(--police-titres);
    font-size: 1.15rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
/* Réutilise le style des champs .formulaire-annonce (label/input/select)
   sans reprendre son cadre/fond propre : le panneau de la popup fait déjà
   office de cadre. */
.modal-annuaire__panneau .formulaire-annonce {
    background: none;
    border: none;
    padding: 0;
    max-width: none;
    margin: 0;
}
.modal-annuaire__panneau .formulaire-annonce button[type="submit"] { width: 100%; margin-top: 18px; }
body.modal-annuaire-ouverte { overflow: hidden; }
@media (max-width: 560px) {
    .modal-annuaire__panneau { padding: 26px 18px 20px; }
}

/* Texte d'aide générique sous un champ de .formulaire-annonce (utilisé ici
   par le lien facultatif de la popup annuaire ci-dessus) — même style que
   .depot-champ__aide, mais pas rattaché à un conteneur .depot-champ
   particulier. */
.formulaire-annonce__aide { margin: 6px 0 14px; font-size: 0.8rem; color: var(--couleur-texte-doux); }

.fiche-detail__similaires {
    background: var(--couleur-kaki-fond); padding: 40px 20px; margin-top: 50px;
    width: 100vw; margin-left: calc(-50vw + 50%); margin-right: calc(-50vw + 50%);
}
/* `width:100%` fait que le titre (icône + texte, en display:flex donc de
   largeur naturelle) s'étale sur toute la largeur de la colonne centrée à
   1400px, au lieu de rester centré au milieu de la page comme un simple
   bloc de contenu — le texte reste ainsi aligné à gauche, au même niveau
   que la première carte de la grille juste en dessous. Combinateur
   d'enfant direct (>) important : les cartes de la grille utilisent elles
   aussi un <h2> pour leur titre (`.carte-annonce__titre`) — un sélecteur
   descendant les aurait affectées par erreur. */
.fiche-detail__similaires > h2 { display: flex; align-items: center; gap: 8px; width: 100%; max-width: 1400px; margin: 0 auto 18px; }
.fiche-detail__similaires .grille-annonces { max-width: 1400px; margin: 0 auto; }
.fiche-detail__similaires .bouton-voir-tout { max-width: 1400px; margin: 24px auto 0; }

@media (max-width: 900px) {
    .fiche-detail__interieur { flex-direction: column; padding: 0; gap: 0; min-height: 0; }
    /* `flex: 1 1 640px` (colonnes desktop) devient une consigne de
       HAUTEUR une fois le conteneur passé en `flex-direction: column`
       ci-dessus — sans ce reset, la galerie s'étire verticalement bien
       au-delà de son contenu réel et laisse un grand vide avant le texte. */
    .fiche-detail__galerie, .fiche-detail__contenu { width: 100%; max-width: none; flex: none; }
    .fiche-detail__galerie {
        position: static;
        max-height: none;
        overflow-y: visible;
        padding: 20px 20px 24px;
        border-bottom: 1px solid var(--couleur-bordure);
    }
    .fiche-detail__galerie .galerie__principale { aspect-ratio: 4 / 3; max-height: none; min-height: 0; }
    .fiche-detail__contenu { padding: 28px 20px; border-left: none; }
    .fiche-detail__contenu-interieur { max-width: none; margin: 0; }
    .fiche-detail__section, .fiche-detail__contact { max-width: none; }
}

/* --- Formulaires -------------------------------------------------------- */
.formulaire-annonce {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 24px;
    max-width: 720px;
    margin: 0 auto;
}

.formulaire-annonce fieldset {
    border: none;
    padding: 0;
    margin: 0 0 24px;
}
.formulaire-annonce legend {
    font-weight: 700;
    padding: 0 0 12px;
    border-bottom: 1px solid var(--couleur-bordure);
    width: 100%;
    margin-bottom: 12px;
}

.formulaire-annonce label {
    display: block;
    font-weight: 600;
    margin: 14px 0 6px;
}

.formulaire-annonce input[type="text"],
.formulaire-annonce input[type="email"],
.formulaire-annonce input[type="tel"],
.formulaire-annonce input[type="number"],
.formulaire-annonce input[type="file"],
.formulaire-annonce select,
.formulaire-annonce textarea {
    width: 100%;
    padding: 10px 12px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    font-family: inherit;
    font-size: 0.95rem;
    background: #fdfcfa;
}

/* Piège à robots (formulaires dépôt d'annonce + contact) : caché hors écran
   plutôt qu'en display:none, pour rester "rempli-ssable" par un robot qui
   ignore les champs display:none, tout en restant invisible pour un vrai
   visiteur (et retiré de la navigation clavier/lecteur d'écran). */
.champ-piege {
    position: absolute;
    left: -9999px;
    top: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

.formulaire-ligne {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
}
@media (max-width: 600px) {
    .formulaire-ligne { grid-template-columns: 1fr; }
}

/* --- Aperçu des photos sélectionnées (formulaire de dépôt) --------------- */
.apercu-photos__aide { color: var(--couleur-texte-doux); font-size: 0.85rem; margin: 8px 0 0; }
/* Message de plafond de photos (29/07/2026, voir assets/js/apercu-photos.js)
   — masqué par défaut ([hidden] posé côté serveur), affiché en JS
   uniquement quand des photos ont été ignorées ou que le vendeur dépasse
   le plafond en cours (décoché "10 photos" après coup). Ton "avertissement"
   (couleur accent) plutôt qu'"erreur" franche : ce n'est jamais bloquant en
   soi, juste informatif — le formulaire reste envoyable tel quel. */
.apercu-photos__limite { color: var(--couleur-accent-fonce); font-size: 0.85rem; font-weight: 600; margin: 8px 0 0; }

.apercu-photos {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 12px;
}
.apercu-photos:empty { margin-top: 0; }

.apercu-photos__vignette {
    position: relative;
    width: 100px;
    height: 100px;
    border-radius: 8px;
    overflow: hidden;
    border: 2px solid var(--couleur-bordure);
    background: #f0eee7;
    cursor: grab;
}
.apercu-photos__vignette--principale { border-color: var(--couleur-accent); }
.apercu-photos__vignette--glissee { opacity: 0.4; }
.apercu-photos__vignette img { width: 100%; height: 100%; object-fit: cover; display: block; pointer-events: none; }

.apercu-photos__actions {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    display: flex;
    justify-content: space-between;
    padding: 3px;
    background: linear-gradient(to bottom, rgba(23, 24, 20, 0.6), transparent);
}
.apercu-photos__action {
    width: 22px;
    height: 22px;
    padding: 0;
    border: none;
    border-radius: 50%;
    background: rgba(23, 24, 20, 0.68);
    color: #fff;
    font-size: 0.95rem;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}
.apercu-photos__action:hover { background: rgba(23, 24, 20, 0.88); }
.apercu-photos__action:disabled { opacity: 0.3; cursor: default; }
.apercu-photos__action--supprimer:hover { background: var(--couleur-danger); }

.apercu-photos__numero {
    position: absolute;
    bottom: 4px;
    left: 4px;
    padding: 2px 8px;
    border-radius: 999px;
    background: rgba(23, 24, 20, 0.72);
    color: #fff;
    font-size: 0.68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.apercu-photos__vignette--principale .apercu-photos__numero { background: var(--couleur-accent); }

/* Masque visuellement un élément tout en le gardant accessible/focusable
   (lecteurs d'écran, clavier) — utilisé sur le vrai <input type="file"> du
   formulaire de dépôt (la zone stylée cliquable est un <label> à côté).
   ⚠️ Ne JAMAIS appliquer cette classe à un <legend> : testé et abandonné
   (24/07/2026) — même posée sur un <span> interne, elle fait quand même
   gonfler la largeur réelle du <fieldset>/<legend> dans Chromium (calcul de
   layout de <legend> qui ignore l'overflow:hidden du texte masqué),
   provoquant un débordement horizontal invisible à l'œil mais bien réel au
   scroll. Les panneaux ci-dessous utilisent donc `aria-labelledby` sur le
   <fieldset>, pointant vers le vrai <h2> visible, plutôt qu'un <legend>. */
.masque-visuel {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* ==========================================================================
   Formulaire de dépôt d'annonce (24/07/2026, retouché le 24/07/2026) : refonte
   "panneaux par section" (maquette B choisie par Enzo). Remplace l'ancien
   formulaire par blocs (fieldset simples dans une seule carte
   .formulaire-annonce) par des panneaux distincts par section, chacun avec
   icône + titre. Les règles .formulaire-annonce (label/input) restent
   utilisées pour la cohérence typographique ; seule l'enveloppe visuelle
   change ici.
   ⚠️ La maquette B incluait à l'origine une colonne d'aperçu en direct de
   l'annonce (mise à jour au fil de la saisie) — retirée le jour même à la
   demande d'Enzo ("j'aime pas"). Les classes .depot-apercu*/.depot-mise-en-page
   et le script assets/js/apercu-depot.js qui les pilotait ont été supprimés
   entièrement plutôt que simplement masqués, pour ne pas laisser de code mort
   dans le site.
   ========================================================================== */
.formulaire-annonce--depot-v2 {
    background: none; border: none; box-shadow: none; padding: 0; max-width: none;
}

.depot-colonne-formulaire { max-width: 760px; margin: 0 auto; }

.depot-panneau {
    background: var(--couleur-surface); border: 1px solid var(--couleur-bordure);
    /* ⚠️ 29/07/2026 (retour Enzo, capture à l'appui) : padding augmenté —
       le texte touchait presque le bord/l'ombre du panneau ("marge collée
       au texte"), surtout visible sur mobile où le padding était plus
       réduit (voir aussi la version mobile de cette règle plus bas). */
    border-radius: var(--rayon); box-shadow: var(--ombre); padding: 34px 40px;
    margin: 0 0 22px;
}
.depot-panneau__entete {
    display: flex; align-items: center; gap: 10px; margin-bottom: 20px;
    padding-bottom: 14px; border-bottom: 2px solid var(--couleur-kaki-fond);
}
.depot-panneau__entete .icone { width: 20px; height: 20px; color: var(--couleur-accent); }
.depot-panneau__entete h2 { margin: 0; font-size: 1.15rem; }

.depot-grille { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 22px; }
.depot-champ { min-width: 0; }
.depot-champ--pleine { grid-column: 1 / -1; }
.formulaire-annonce--depot-v2 .depot-champ label { margin-top: 0; }
.formulaire-annonce--depot-v2 .depot-champ input,
.formulaire-annonce--depot-v2 .depot-champ select,
.formulaire-annonce--depot-v2 .depot-champ textarea { box-sizing: border-box; }

/* Aide sous le champ email (26/07/2026) : explique pourquoi l'email ne sera
   pas affiché publiquement (voir annonce.php — formulaire de contact). */
.depot-champ__aide { margin: 6px 0 0; font-size: 0.8rem; color: var(--couleur-texte-doux); }

/* Case "j'accepte d'afficher mon numéro de téléphone" (26/07/2026, demande
   Enzo) — même principe que .case-mis-en-avant (espace admin). */
.depot-champ--case { margin-top: 8px; }
.depot-case {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    cursor: pointer;
    font-size: 0.88rem;
    color: var(--couleur-texte-doux);
}
.depot-case input { accent-color: var(--couleur-accent); margin-top: 3px; flex-shrink: 0; }

/* Case "professionnel" repensée en carte bien visible (29/07/2026, retour
   Enzo : l'ancienne case à cocher toute simple, .depot-case ci-dessus,
   était trop discrète — un vendeur professionnel risquait de ne jamais la
   remarquer). Même principe que .depot-extra__carte plus bas (case à
   cocher invisible recouvrant toute la carte, cercle de sélection en haut
   à droite), pour une cohérence visuelle avec le reste du formulaire.
   ⚠️ Reformulée une 2e fois (retour Enzo du 29/07/2026, après coup) :
   le fond dégradé kaki restait encore trop proche du reste du formulaire
   pour certains visiteurs. Nouveau traitement "encadré alerte" validé par
   Enzo parmi 3 propositions (variante C) : bordure gauche épaisse colorée
   façon bloc de notice/information, icône dans un cadré distinct, et un
   sur-titre "ESPACE PROFESSIONNELS" au-dessus de la question elle-même —
   l'œil doit accrocher sur le sur-titre + la bordure colorée avant même de
   lire le texte. */
.depot-bascule-pro {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: 16px;
    cursor: pointer;
    background: #fff;
    border: 2px solid var(--couleur-kaki);
    border-left: 7px solid var(--couleur-accent);
    border-radius: var(--rayon);
    padding: 18px 58px 18px 20px;
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.08);
    transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
}
.depot-bascule-pro:hover {
    border-color: var(--couleur-kaki-fonce);
    border-left-color: var(--couleur-accent-fonce);
    box-shadow: 0 8px 22px rgba(0, 0, 0, 0.14);
    transform: translateY(-1px);
}
.depot-bascule-pro input[type="checkbox"] {
    position: absolute;
    inset: 0;
    margin: 0;
    opacity: 0;
    cursor: pointer;
    z-index: 2;
}
.depot-bascule-pro:has(input:focus-visible) { outline: 2px solid var(--couleur-accent); outline-offset: 2px; }
.depot-bascule-pro:has(input:checked) {
    border-color: var(--couleur-accent);
    box-shadow: 0 6px 18px rgba(176, 68, 43, 0.22);
}
.depot-bascule-pro__coche {
    position: absolute;
    top: 16px;
    right: 16px;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    border: 2px solid var(--couleur-kaki);
    background: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    color: transparent;
    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.depot-bascule-pro__coche .icone { width: 13px; height: 13px; }
.depot-bascule-pro:has(input:checked) .depot-bascule-pro__coche {
    background: var(--couleur-accent);
    border-color: var(--couleur-accent);
    color: #fff;
}
.depot-bascule-pro__icone-fond {
    width: 44px;
    height: 44px;
    border-radius: 10px;
    background: var(--couleur-kaki-fond);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    margin-top: 2px;
    transition: background 0.15s ease;
}
.depot-bascule-pro__icone { width: 24px; height: 24px; color: var(--couleur-kaki-fonce); }
.depot-bascule-pro:has(input:checked) .depot-bascule-pro__icone-fond { background: rgba(176, 68, 43, 0.14); }
.depot-bascule-pro:has(input:checked) .depot-bascule-pro__icone { color: var(--couleur-accent); }
.depot-bascule-pro__contenu { display: flex; flex-direction: column; min-width: 0; }
.depot-bascule-pro__eyebrow {
    font-family: var(--police-titres);
    font-weight: 700;
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--couleur-accent);
    margin-bottom: 3px;
}
.depot-bascule-pro__titre {
    font-family: var(--police-titres);
    font-weight: 700;
    font-size: 1.2rem;
    color: var(--couleur-encre);
}
.depot-bascule-pro__detail { font-size: 0.86rem; color: var(--couleur-texte-doux); margin-top: 4px; }

/* Champs "Nom de société" / "Numéro de SIRET" : masqués tant que la carte
   ci-dessus n'est pas cochée — et donc, comme ils ne sont "pas rendus",
   exclus de la validation HTML5 native malgré l'attribut required (la
   validation PHP côté serveur dans deposer-annonce.php ne fait de toute
   façon jamais confiance au seul masquage CSS, elle revalide tout). */
.depot-bascule-pro__champs {
    display: none;
    grid-template-columns: 1fr 1fr;
    gap: 4px 22px;
    margin-top: 14px;
}
.depot-champ:has(.depot-bascule-pro input:checked) .depot-bascule-pro__champs {
    display: grid;
}

.depot-zone-photos { position: relative; margin-top: 6px; }
.depot-zone-photos__input { }
.depot-zone-photos__etiquette {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 8px; text-align: center; padding: 34px 20px; border: 2px dashed var(--couleur-bordure);
    border-radius: 10px; color: var(--couleur-texte-doux); cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease;
}
.depot-zone-photos__etiquette:hover { border-color: var(--couleur-kaki); background: #fbfaf6; }
.depot-zone-photos__etiquette .icone { width: 26px; height: 26px; color: var(--couleur-kaki); }
.depot-zone-photos__note { font-size: 0.8rem; color: var(--couleur-texte-doux); }
/* Champ réel masqué de façon accessible (garde le focus clavier — voir
   .masque-visuel plus haut) : le <label for="photos"> ci-dessus fait office
   de zone cliquable stylée ; Tab + Entrée/Espace continue de fonctionner
   nativement sur l'input pour un usage clavier. */
.depot-zone-photos__input.masque-visuel:focus-visible + .depot-zone-photos__etiquette {
    outline: 2px solid var(--couleur-accent); outline-offset: 2px;
}

.depot-badges { display: flex; gap: 10px; flex-wrap: wrap; margin: 16px 0 0; }
.depot-badge {
    display: inline-flex; align-items: center; gap: 6px; background: var(--couleur-kaki-fond);
    color: var(--couleur-kaki-fonce); font-size: 0.78rem; font-weight: 600; padding: 7px 13px;
    border-radius: 999px;
}
.depot-badge .icone { width: 14px; height: 14px; }

.depot-envoi {
    display: flex; align-items: center; justify-content: space-between; gap: 20px;
    padding: 22px 32px; background: var(--couleur-encre); border-radius: var(--rayon);
}
.depot-envoi p { margin: 0; color: rgba(255, 255, 255, 0.72); font-size: 0.85rem; }
/* ⚠️ 24/07/2026 : le white-space:nowrap posé ici initialement forçait ce
   bouton à rester sur une seule ligne quelle que soit la largeur de
   l'écran — comme .depot-envoi est un conteneur flex (colonne sur mobile,
   voir media query plus bas), ce texte non coupable forçait TOUT le
   panneau à s'élargir pour lui faire de la place, provoquant un
   débordement horizontal invisible à l'œil sur mobile (repéré au scroll,
   pas visuellement). Retiré : le texte du bouton peut désormais passer à
   la ligne normalement sur petit écran. */
.depot-envoi__bouton { margin-top: 0; }

@media (max-width: 700px) {
    .depot-grille { grid-template-columns: 1fr; }
    .depot-panneau { padding: 26px 24px; }
    .depot-envoi { flex-direction: column; align-items: stretch; text-align: center; }
    .depot-bascule-pro__champs { grid-template-columns: 1fr; }
    /* Encadré alerte (29/07/2026, voir plus haut) légèrement resserré sur
       téléphone : évite que le cadré icône/le titre en 1.2rem ne prennent
       une place disproportionnée sur les plus petits écrans. */
    .depot-bascule-pro { gap: 12px; padding: 16px 44px 16px 16px; }
    .depot-bascule-pro__icone-fond { width: 36px; height: 36px; }
    .depot-bascule-pro__icone { width: 20px; height: 20px; }
    .depot-bascule-pro__titre { font-size: 1.05rem; }
}

.bouton-principal,
.bouton-secondaire,
.bouton-danger {
    display: inline-block;
    padding: 12px 22px;
    border: none;
    border-radius: var(--rayon);
    font-weight: 600;
    cursor: pointer;
    font-size: 0.95rem;
    margin-top: 20px;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.bouton-principal { background: var(--couleur-accent); color: #fff; }
.bouton-principal:hover { background: var(--couleur-accent-fonce); text-decoration: none; }

.bouton-secondaire { background: #eeece5; color: var(--couleur-texte); margin-top: 0; padding: 8px 14px; }
.bouton-secondaire:hover { background: #e2ded2; text-decoration: none; }

.bouton-danger { background: var(--couleur-danger); color: #fff; }
.bouton-danger:hover { background: #9c1f1f; }

/* --- Alertes / messages flash ------------------------------------------- */
.alerte {
    padding: 14px 18px;
    border-radius: var(--rayon);
    margin-bottom: 20px;
}
.alerte ul { margin: 0; padding-left: 20px; }
.alerte-succes { background: var(--couleur-succes-fond); color: var(--couleur-succes); }
.alerte-erreur { background: var(--couleur-erreur-fond); color: var(--couleur-danger); }

/* --- Espace admin -------------------------------------------------------- */
/* Compteurs cliquables du tableau de bord (28/07/2026, demande Enzo —
   maquette validée) : remplacent les anciens onglets texte (`.onglets-statut`,
   retirés) par des cartes plus lisibles d'un coup d'œil, avec une icône et
   une couleur distincte par statut — mêmes liens `?statut=...` qu'avant. */
.admin-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; }
.admin-stats__carte {
    display: block;
    text-decoration: none;
    color: var(--couleur-texte);
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-left: 4px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 16px 18px;
    box-shadow: var(--ombre);
    transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.admin-stats__carte:hover { transform: translateY(-2px); box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08); text-decoration: none; }
.admin-stats__carte--actif { outline: 2px solid var(--couleur-accent); outline-offset: -2px; }
.admin-stats__icone {
    width: 32px;
    height: 32px;
    border-radius: 9px;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 10px;
}
.admin-stats__icone .icone { width: 17px; height: 17px; }
.admin-stats__nombre { font-family: var(--police-titres); font-size: 1.7rem; font-weight: 700; line-height: 1; }
.admin-stats__libelle { font-size: 0.8rem; color: var(--couleur-texte-doux); margin-top: 4px; }

.admin-stats__carte--paiement { border-left-color: var(--couleur-attention); }
.admin-stats__carte--paiement .admin-stats__icone { background: #fbf3de; color: #8a6d0f; }
.admin-stats__carte--attente { border-left-color: var(--couleur-accent); }
.admin-stats__carte--attente .admin-stats__icone { background: var(--couleur-erreur-fond); color: var(--couleur-accent); }
.admin-stats__carte--validee { border-left-color: var(--couleur-succes); }
.admin-stats__carte--validee .admin-stats__icone { background: var(--couleur-succes-fond); color: var(--couleur-succes); }
.admin-stats__carte--refusee { border-left-color: var(--couleur-texte-doux); }
.admin-stats__carte--refusee .admin-stats__icone { background: #eeece5; color: var(--couleur-texte-doux); }

@media (max-width: 900px) { .admin-stats { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .admin-stats { grid-template-columns: 1fr; } }

/* Barre de recherche du tableau de bord (28/07/2026, demande Enzo) :
   cherche une annonce tous statuts confondus, sans passer par les onglets
   (voir admin/index.php — bascule vers une requête dédiée dès qu'un terme
   est saisi). */
.admin-recherche {
    display: flex;
    gap: 8px;
    margin-bottom: 20px;
    max-width: 420px;
}
.admin-recherche input {
    flex: 1;
    padding: 10px 14px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    font-family: inherit;
    font-size: 0.92rem;
    background: var(--couleur-surface);
}
.admin-recherche button {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 0 16px;
    border: none;
    border-radius: var(--rayon);
    background: var(--couleur-accent);
    color: #fff;
    font-weight: 600;
    font-size: 0.9rem;
    cursor: pointer;
}
.admin-recherche button:hover { background: var(--couleur-accent-fonce); }
.admin-recherche button .icone { width: 15px; height: 15px; }
.admin-recherche__effacer { font-size: 0.85rem; color: var(--couleur-texte-doux); margin: -12px 0 20px; display: block; }

.tableau-admin {
    width: 100%;
    border-collapse: collapse;
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    overflow: hidden;
}
.tableau-admin th, .tableau-admin td {
    text-align: left;
    padding: 12px 14px;
    border-bottom: 1px solid var(--couleur-bordure);
    vertical-align: middle;
}
.tableau-admin th { background: #f0eee7; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.03em; }
.tableau-admin tr:last-child td { border-bottom: none; }
.tableau-admin tr:hover td { background: #faf9f5; }

/* Vignette photo (28/07/2026) : repère visuel rapide, en plus du titre —
   .apercu-photos__aide, hors du sujet ici, gère un tout autre contexte
   (formulaire de dépôt) malgré le nom de fichier CSS partagé. Le motif
   rayé remplace la photo tant qu'aucune image n'existe pour l'annonce
   (mêmes teintes neutres que .carte-annonce__photo-absente ailleurs). */
.tableau-admin__photo {
    width: 56px;
    height: 40px;
    border-radius: 6px;
    overflow: hidden;
    background: repeating-linear-gradient(45deg, #e7e5da, #e7e5da 5px, #ddd9c8 5px, #ddd9c8 10px);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.6rem;
    color: #9a9682;
}
.tableau-admin__photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tableau-admin__titre { font-weight: 600; }

/* Pastille de statut, affichée uniquement dans les résultats de recherche
   (mélange d'annonces de statuts différents, contrairement aux onglets qui
   n'affichent toujours qu'un seul statut à la fois — voir admin/index.php). */
.tableau-admin__statut {
    display: inline-block;
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    padding: 3px 9px;
    border-radius: 999px;
    background: #eeece5;
    color: var(--couleur-texte-doux);
}
.tableau-admin__statut--en_attente_paiement { background: #fbf3de; color: #8a6d0f; }
.tableau-admin__statut--en_attente { background: var(--couleur-erreur-fond); color: var(--couleur-accent); }
.tableau-admin__statut--validee { background: var(--couleur-succes-fond); color: var(--couleur-succes); }
.tableau-admin__statut--refusee { background: #eeece5; color: var(--couleur-texte-doux); }

/* Écran de connexion (28/07/2026, demande Enzo — maquette validée) :
   remplace la page blanche sans identité visuelle (formulaire nu sur fond
   blanc) par un écran centré sur le même gris foncé que le header admin,
   avec l'emblème du site. Marges négatives pour déborder du padding de
   .page-principale jusqu'aux bords, comme .page-hero sur le site public. */
.connexion-ecran {
    /* 31/07/2026 (demande Enzo, correctif visuel) : l'aplat gris uni
       d'origine ne débordait pas jusqu'aux bords de l'écran — bug corrigé
       avec la même technique "sortie du conteneur centré" que .page-hero
       (width:100vw + margins calc(-50vw + 50%)). Une première version a
       ensuite posé la photo du hangar assombrie en fond, puis Enzo est
       revenu sur ce choix le jour même : fond uni noir/gris foncé,
       sans photo. */
    background: linear-gradient(160deg, #14140f 0%, var(--couleur-gris-fonce) 100%);
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    margin-right: calc(-50vw + 50%);
    margin-top: -32px;
    margin-bottom: -64px;
    padding: 70px 20px;
    display: flex;
    justify-content: center;
}
.connexion-carte {
    background: var(--couleur-surface);
    border-radius: 14px;
    padding: 40px 38px;
    width: 100%;
    max-width: 380px;
    box-shadow: 0 20px 50px rgba(0, 0, 0, 0.35);
    text-align: center;
    align-self: flex-start;
}
.connexion-carte__logo { height: 46px; width: auto; margin-bottom: 14px; }
.connexion-carte h1 { font-family: var(--police-titres); font-size: 1.25rem; margin: 0 0 4px; }
.connexion-carte__sous-titre { color: var(--couleur-texte-doux); font-size: 0.85rem; margin: 0 0 26px; }
.connexion-carte form { text-align: left; }
.connexion-carte label { display: block; font-size: 0.82rem; font-weight: 600; margin: 14px 0 6px; }
.connexion-carte input {
    width: 100%;
    padding: 11px 13px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    font-family: var(--police);
    font-size: 0.95rem;
    background: #fdfcfa;
}
.connexion-carte .bouton-principal { width: 100%; text-align: center; }

.actions-moderation {
    display: flex;
    flex-direction: column;
    gap: 16px;
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 20px;
    margin-top: 24px;
    max-width: 760px;
}

/* --- Panneau "état de vente" (admin) ------------------------------------ */
.panneau-etat-vente {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 20px;
    margin-top: 24px;
    max-width: 760px;
}
.panneau-etat-vente h2 { margin-top: 0; }

/* Panneau "Pays d'origine" côté admin (ajouté le 23/07/2026), même gabarit
   que .panneau-etat-vente juste au-dessus. */
.panneau-pays-origine {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 20px;
    margin-top: 24px;
    max-width: 760px;
}
.panneau-pays-origine h2 { margin-top: 0; }
.champ-pays-origine { display: flex; align-items: center; gap: 12px; margin: 12px 0 18px; }
.champ-pays-origine select {
    padding: 10px 12px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    font-family: inherit;
    font-size: 0.9rem;
    min-width: 220px;
}
/* Aperçu à côté du menu déroulant : un peu plus grand que dans les pastilles
   (.fiche-detail__pills plus bas) pour rester bien lisible ici. */
.champ-pays-origine .plaque-drapeau { width: 32px; height: 22px; }

/* Panneau "Catégorie" côté admin (ajouté le 26/07/2026, en même temps que le
   remplacement de la liste des catégories), même gabarit que
   .panneau-etat-vente/.panneau-pays-origine ci-dessus. */
.panneau-categorie {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 20px;
    margin-top: 24px;
    max-width: 760px;
}
.panneau-categorie h2 { margin-top: 0; }
.formulaire-categorie { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.formulaire-categorie select {
    padding: 10px 12px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    font-family: inherit;
    font-size: 0.9rem;
    min-width: 260px;
}

/* Panneau "Paiement" côté admin (27/07/2026), même gabarit que
   .panneau-etat-vente/.panneau-pays-origine/.panneau-categorie ci-dessus. */
.panneau-paiement {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    padding: 20px;
    margin-top: 24px;
    max-width: 760px;
}
.panneau-paiement h2 { margin-top: 0; }
.panneau-paiement p { margin: 0 0 14px; color: var(--couleur-texte-doux); }

/* Panneau "Supprimer cette annonce" (admin, 30/07/2026, demande Enzo) —
   même gabarit que .panneau-etat-vente/.panneau-pays-origine/
   .panneau-categorie/.panneau-paiement ci-dessus, avec un liseré rouge à
   gauche (couleur "danger", même que .bouton-danger) pour bien le
   distinguer visuellement comme une zone d'action irréversible, séparée
   des panneaux de réglage courants au-dessus. */
.panneau-suppression {
    background: var(--couleur-surface);
    border: 1px solid var(--couleur-bordure);
    border-left: 4px solid var(--couleur-danger);
    border-radius: var(--rayon);
    padding: 20px;
    margin-top: 24px;
    max-width: 760px;
}
.panneau-suppression h2 { margin-top: 0; }
.panneau-suppression p { margin: 0 0 14px; color: var(--couleur-texte-doux); }

/* Sélection de pack sur acheter-credits.php (27/07/2026) — cartes cliquables
   réutilisant les couleurs/rayons déjà en place plutôt que d'introduire une
   nouvelle palette. */
.choix-packs {
    display: flex;
    flex-wrap: wrap;
    gap: 14px;
    margin: 18px 0;
}
.choix-pack {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 16px 20px;
    border: 2px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    cursor: pointer;
    min-width: 180px;
    transition: border-color 0.15s ease, background 0.15s ease;
}
.choix-pack:has(input:checked) {
    border-color: var(--couleur-accent);
    background: var(--couleur-kaki-fond);
}
.choix-pack input { accent-color: var(--couleur-accent); }
.choix-pack__libelle { font-family: var(--police-titres); font-weight: 600; font-size: 1rem; }
.choix-pack__prix { font-family: var(--police-titres); font-weight: 700; font-size: 1.3rem; color: var(--couleur-accent); }
.choix-pack__unite { font-size: 0.78rem; color: var(--couleur-texte-doux); }

.cases-etat-vente {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 12px 0 18px;
}
.case-etat-vente {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 9px 16px;
    border: 1px solid var(--couleur-bordure);
    border-radius: 999px;
    cursor: pointer;
    font-size: 0.9rem;
    font-weight: 600;
    user-select: none;
    transition: border-color 0.15s ease, background 0.15s ease;
}
.case-etat-vente input { margin: 0; accent-color: var(--couleur-accent); }
.case-etat-vente:hover { border-color: var(--couleur-texte-doux); }
.case-etat-vente:has(input:checked) { background: var(--couleur-encre-claire); border-color: var(--couleur-encre); }
.case-etat-vente--nouveau:has(input:checked) { border-color: var(--couleur-accent); background: #fbeeea; }
.case-etat-vente--reserve:has(input:checked) { border-color: var(--couleur-kaki); background: var(--couleur-kaki-fond); }
.case-etat-vente--vendu:has(input:checked) { border-color: var(--couleur-encre); background: var(--couleur-encre-claire); }

.case-mis-en-avant {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 0 0 16px;
    cursor: pointer;
    font-size: 0.9rem;
    user-select: none;
}
.case-mis-en-avant input { accent-color: var(--couleur-accent); }
.case-mis-en-avant .icone { color: var(--couleur-accent); }

.formulaire-refus { display: flex; flex-direction: column; gap: 8px; }
.formulaire-refus input { padding: 10px 12px; border: 1px solid var(--couleur-bordure); border-radius: var(--rayon); }

/* --- Pied de page (étendu : présentation + 3 colonnes de liens) ------------ */
.site-footer {
    position: relative;
    background: var(--couleur-encre);
    color: rgba(244, 242, 236, 0.7);
    padding: 44px 20px 22px;
    font-size: 0.9rem;
}
/* Fin liseré à deux tons (kaki + rouge brique), discret clin d'œil "galon"
   au-dessus du pied de page. */
.site-footer::before {
    content: '';
    position: absolute;
    top: -3px;
    left: 0;
    right: 0;
    height: 3px;
    background: linear-gradient(to right, var(--couleur-kaki) 0 50%, var(--couleur-accent) 50% 100%);
    opacity: 0.85;
}
.site-footer__grille {
    display: grid;
    grid-template-columns: 1.3fr 1fr 1fr 1fr;
    gap: 30px;
    padding-bottom: 26px;
    border-bottom: 1px solid rgba(244, 242, 236, 0.12);
}
.site-footer__logo {
    display: flex;
    align-items: center;
    margin: 0 0 14px;
}
/* Logo image (27/07/2026, remplace l'ancien traitement texte "War Machines"
   ci-dessus — .site-footer__logo-icone/-texte/-texte-accent supprimées,
   devenues orphelines). Le footer est toujours sur fond sombre
   (var(--couleur-encre)), donc uniquement la version détourée en blanc du
   logo est utilisée ici, sans bascule couleur/blanc comme dans le header. */
.site-footer__logo-image {
    display: block;
    height: 60px;
    width: auto;
}
.site-footer__colonne--marque p:last-child { margin: 0; font-size: 0.85rem; line-height: 1.5; }
.site-footer__colonne h4 {
    color: #fff;
    font-size: 0.85rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin: 0 0 12px;
}
.site-footer__colonne a {
    display: block;
    color: rgba(244, 242, 236, 0.65);
    font-size: 0.85rem;
    margin-bottom: 8px;
}
.site-footer__colonne a:hover { color: #fff; text-decoration: none; }
.site-footer__bas { margin-top: 18px; text-align: center; font-size: 0.82rem; }
/* Crédit agence (31/07/2026, demande Enzo) : discret, sous la ligne de
   copyright existante. */
.site-footer__creation { margin: 4px 0 0; }
.site-footer__creation a { color: rgba(244, 242, 236, 0.75); text-decoration: underline; }
.site-footer__creation a:hover { color: #fff; }

@media (max-width: 760px) {
    .site-footer__grille { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 480px) {
    .site-footer__grille { grid-template-columns: 1fr; }
}

/* =====================================================================
   Page d'accueil : mise en page enrichie (colonne principale + barre
   latérale, sections de présentation de la plateforme). Reprend le
   vocabulaire visuel déjà en place (couleurs, rayons, ombres, police).
   ===================================================================== */

/* --- Colonne principale + barre latérale (annonces + encarts pro) ------ */
/* Élargie le 22/07/2026 (demande Enzo) au-delà des 1400px partagés par le
   reste de la page — cette zone (Coup de cœur, Dernières arrivées, encarts
   pub) vit directement dans <main class="page-principale--large">
   (1400px), une classe commune à l'accueil, À vendre et Vendu : l'élargir
   globalement aurait aussi élargi les grilles de ces deux autres pages,
   non demandé. Corrigé avec la même technique de "sortie du conteneur
   centré" que .bloc-accueil plus bas (cf. maj-8), mais en un seul niveau
   (pas de fond coloré à faire déborder ici) : la zone déborde jusqu'aux
   bords de la fenêtre, puis un padding calculé recentre son propre
   contenu à un plafond de 1600px (au lieu de 1400px), sans toucher à
   <main> ni aux autres pages. */
.accueil-layout {
    display: grid;
    grid-template-columns: 1fr 300px;
    gap: 28px;
    align-items: start;
    margin-bottom: 8px;
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    margin-right: calc(-50vw + 50%);
    box-sizing: border-box;
    /* Marge gauche agrandie à la demande d'Enzo du 23/07/2026 (le contenu
       semblait un peu trop proche du bord gauche de l'écran) — la droite
       n'est volontairement pas touchée, elle reste au minimum de 20px. */
    padding-left: max(40px, calc((100vw - 1600px) / 2));
    padding-right: max(20px, calc((100vw - 1600px) / 2));
}
/* Sans ça, une grille CSS ne laisse jamais une colonne "1fr" rétrécir
   sous la largeur de son contenu (min-width auto par défaut) : la
   glissière ne pourrait jamais défiler, elle pousserait toute la page
   en largeur à la place. */
.accueil-principal { min-width: 0; }
.accueil-sidebar {
    display: flex;
    flex-direction: column;
    gap: 18px;
    position: sticky;
    /* ⚠️ 25/07/2026 : même correctif que .fiche-detail__galerie plus haut
       dans le fichier — l'ancien décalage fixe (top: 128px) ne dégageait la
       hauteur du header que dans son état desktop non empilé. Entre 1000px
       (bascule de cette colonne en position: static, voir plus bas) et
       1360px (seuil du menu burger, .header-b__interieur — relevé de
       1180px à 1360px le 29/07/2026), le
       header réel est nettement plus haut que 128px : la sidebar restait
       collée en dessous d'un point situé À L'INTÉRIEUR du header, qui
       passait donc visuellement par-dessus elle au scroll (le premier
       encart pub se retrouvait masqué). Variable dynamique réutilisée pour
       rester juste à toutes les largeurs. */
    top: calc(var(--hauteur-header, 88px) + 20px);
}

/* Encarts "espace pro" : cadre en pointillés assumé (emplacement en
   attente d'un futur annonceur), sobre et clairement identifiable. */
.encart-pub {
    border: 2px dashed #b7bba0;
    border-radius: var(--rayon);
    background: #f5f4ee;
    color: var(--couleur-kaki-fonce);
    padding: 18px;
    text-align: center;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 4px;
}
.encart-pub strong {
    font-family: var(--police-titres);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-size: 0.95rem;
}
.encart-pub span { font-size: 0.78rem; color: var(--couleur-texte-doux); }
.encart-pub--large { min-height: 260px; }
.encart-pub--bandeau { padding: 26px; }

/* Encart "espace pro" occupé par une vraie bannière annonceur (300×250) —
   remplace le cadre en pointillés par un rendu propre, image pleine
   largeur avec juste un léger relief (cohérent avec les cartes d'annonces
   du site). Ajouté le 13/07/2026 (première bannière : ELM Marketing /
   DNRS, emplacement du haut). */
.encart-pub--rempli {
    border: none;
    background: transparent;
    padding: 0;
    min-height: 0;
    box-shadow: var(--ombre);
    border-radius: var(--rayon);
    overflow: hidden;
}
.encart-pub--rempli a { display: block; line-height: 0; }
.encart-pub--rempli img { display: block; width: 100%; height: auto; }

/* ⚠️ .encart-vendeur-pro ("Un véhicule ou une pièce à vendre ?", encart
   sidebar) retiré le 22/07/2026 (demande Enzo) — remplacé par un troisième
   emplacement publicitaire dans index.php. Son message est repris par
   .bloc-deposer-annonce ci-dessous (section pleine largeur en bas de
   l'accueil, ex-"Devenir partenaire"). Règles supprimées avec lui, devenues
   orphelines. */

@media (max-width: 1000px) {
    .accueil-layout { grid-template-columns: 1fr; }
    .accueil-sidebar { position: static; }
    /* 29/07/2026 (refonte mobile/tablette, demande Enzo "centre tout bien") :
       le padding desktop (40px à gauche, 20px à droite — voulu ainsi par
       Enzo le 23/07/2026 pour rapprocher le contenu du bord gauche sur
       grand écran) devient visiblement asymétrique une fois la colonne
       repassée à une seule (accueil et barre latérale empilés) — corrigé
       en un padding symétrique de 20px, identique au reste du site sur
       mobile/tablette (.conteneur). N'affecte jamais le rendu desktop
       (>1000px), qui garde exactement son padding d'origine. */
    .accueil-layout { padding-left: 20px; padding-right: 20px; }
}

/* --- Sections de présentation de la plateforme (sous les annonces) ----- */
/* Ces sections vivent à l'intérieur de <main class="conteneur ...">, déjà
   limité à 1400px de large : sans ce correctif, leur fond coloré ne
   pourrait jamais atteindre les bords réels de l'écran (grand espace
   blanc de part et d'autre sur les écrans larges). Même technique que
   .page-hero, qui n'a pas ce problème : on fait déborder la section sur
   toute la largeur de la fenêtre, et son <div class="conteneur"> interne
   recentre le contenu comme partout ailleurs sur le site. */
.bloc-accueil {
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    margin-right: calc(-50vw + 50%);
    /* Espacement vertical augmenté (44px→64px) pour que chaque section de
       l'accueil respire davantage — les sections se suivaient de trop
       près. */
    padding: 64px 0;
}
/* Le <div class="conteneur"> interne à ces sections recentre le contenu,
   mais avec la largeur "de base" du site (1100px) — nettement plus
   étroite que le reste de la page d'accueil (annonces, colonne latérale),
   qui elle profite des 1400px de <main class="page-principale--large">.
   On élargit donc spécifiquement ce conteneur ici pour que tout
   s'aligne à la même largeur sur toute la page. */
.bloc-accueil .conteneur { max-width: 1400px; }
/* Fond passé du kaki clair (--couleur-kaki-fond) au vert kaki plein
   (#6b6f47 = --couleur-kaki) à la demande d'Enzo du 23/07/2026, pour
   "Un véhicule ou une pièce à vendre ?" (section .bloc-deposer-annonce,
   seule utilisatrice de cette classe). Fond nettement plus soutenu que
   l'ancien kaki clair → titre et texte repassés en clair pour rester
   lisibles (même logique que .bloc-accueil--sombre plus bas, qui gère un
   fond sombre différent pour "Comment ça marche"/"Pourquoi..."). */
.bloc-accueil--teinte { background: var(--couleur-kaki); }
.bloc-accueil--teinte h2 { color: #fff; }
/* Fond sombre pour "Comment ça marche" et "Pourquoi War Machines..."
   (demande Enzo du 22/07/2026, à la place du fond clair --couleur-kaki-fond
   ci-dessus — modificateur séparé pour ne pas toucher "Déposer une annonce"
   (ex-"Devenir partenaire"), qui garde --bloc-accueil--teinte inchangée
   (renommée le 22/07/2026, cf. .bloc-deposer-annonce plus bas). Gris foncé chaud choisi
   plutôt que le vert kaki : --couleur-kaki est déjà réservé aux accents
   utilisés avec parcimonie (badge, icônes, bouton du header depuis ce même
   lot) — l'étendre à un grand aplat de fond diluerait ce rôle d'accent,
   alors que --couleur-gris-fonce est déjà le fond sombre "de référence" du
   site (section Coup de cœur), ce qui garde une cohérence entre les deux
   zones sombres de l'accueil. Tous les textes/icônes enfants sont
   repassés en clair pour rester lisibles. */
.bloc-accueil--sombre { background: var(--couleur-gris-fonce); }
.bloc-accueil--sombre h2 { color: #fff; }
.bloc-accueil--sombre .etape h3,
.bloc-accueil--sombre .atout h3 { color: #fff; }
.bloc-accueil--sombre .etape p,
.bloc-accueil--sombre .atout p { color: rgba(244, 242, 236, 0.68); }
/* Les ombres claires posées sur .atout/.etape (lot du 22/07/2026, pensées
   pour un fond clair) seraient invisibles sur ce fond sombre — assombries
   ici pour garder l'effet de relief voulu. */
.bloc-accueil--sombre .atout { box-shadow: 0 6px 18px rgba(0, 0, 0, 0.35); }
.bloc-accueil h2 {
    display: flex;
    align-items: center;
    gap: 10px;
    /* Titres de section agrandis (24px→30px par défaut du navigateur),
       cohérent avec "Coup de cœur"/"Dernières arrivées" plus haut sur la
       page. */
    font-size: 1.85rem;
    margin: 0 0 20px;
}
.bloc-accueil .sous-titre-bloc {
    color: var(--couleur-texte-doux);
    margin: -8px 0 28px;
    max-width: 620px;
    font-size: 1.05rem;
}
/* Titres centrés — "Comment ça marche" et "Pourquoi MilDépot". */
.bloc-accueil h2.titre-centre { justify-content: center; text-align: center; }
.bloc-accueil .sous-titre-bloc.titre-centre {
    text-align: center;
    margin-left: auto;
    margin-right: auto;
}
/* ⚠️ Bug trouvé et corrigé le 23/07/2026 (en vérifiant la retouche du fond
   "Un véhicule ou une pièce à vendre ?" ci-dessous) : ces deux surcharges
   vivaient plus haut, AVANT la règle générale ".bloc-accueil .sous-titre-
   bloc" ci-dessus — à spécificité CSS égale (deux classes de chaque
   côté), c'est l'ordre d'apparition dans la feuille de style qui tranche,
   donc la règle générale (couleur sombre, pensée pour un fond clair)
   gagnait systématiquement et rendait le sous-titre presque illisible sur
   les fonds sombre/kaki. Déplacées ici, après la règle générale, pour
   qu'elles s'appliquent bien. */
.bloc-accueil--teinte .sous-titre-bloc { color: rgba(244, 242, 236, 0.82); }
.bloc-accueil--sombre .sous-titre-bloc { color: rgba(244, 242, 236, 0.72); }

/* Étapes "Comment ça marche" */
.etapes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 26px; }
/* ⚠️ L'effet de survol (bloc surélevé + ombre + agrandissement du chiffre,
   ajouté au maj-51 du 22/07/2026) a été retiré le 23/07/2026 à la demande
   d'Enzo : il ne se déclenchait qu'au survol de la souris, donc invisible
   la plupart du temps (et jamais sur tactile). Remplacé par une animation
   permanente qui montre en continu le sens de lecture des étapes — voir
   plus bas ".etape:not(:last-child)::before" (point lumineux qui voyage le
   long de la ligne de connexion). */
.etape {
    position: relative;
    text-align: center;
    padding: 14px 10px;
    border-radius: var(--rayon);
}
.etape__numero {
    position: relative;
    width: 46px;
    height: 46px;
    border-radius: 50%;
    /* Dégradé (au lieu d'un aplat rouge brique uni) + ombre portée colorée,
       pour un rendu plus moderne — demande Enzo du 22/07/2026 ("revois la
       dynamique... fais quelque chose de moderne").
       Recorrigé le 22/07/2026 (suite retour Enzo "c'est plus dans le
       thème les couleurs") : le dégradé mélangeait accent (rouge brique)
       et kaki, deux couleurs que le reste du site ne combine jamais en
       dégradé — le kaki y est toujours réservé à des touches isolées
       (badge, icônes, bouton), jamais fondu avec le rouge (cf. commentaire
       plus haut sur --couleur-kaki "utilisée avec parcimonie"). Le mélange
       rouge+vert kaki donnait en plus un rendu un peu terne/brouillé sur le
       fond sombre. Remplacé par un dégradé dans la même famille que
       l'accent (rouge brique → rouge brique foncé), qui garde l'effet de
       relief "moderne" tout en restant dans la palette du site. */
    background: linear-gradient(135deg, var(--couleur-accent), var(--couleur-accent-fonce));
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--police-titres);
    font-size: 1.2rem;
    margin: 0 auto 14px;
    box-shadow: 0 8px 18px rgba(176, 68, 43, 0.32);
    transition: transform 0.25s ease, box-shadow 0.25s ease;
}
/* "#" devant chaque chiffre d'étape (demande Enzo du 22/07/2026) — ajouté
   en CSS (::before) plutôt que dans le texte PHP, pour garder le contenu
   ("1", "2", "3") simple côté code. */
.etape__numero::before {
    content: "#";
    opacity: 0.7;
    margin-right: 1px;
}
.etape h3 { margin: 0 0 8px; font-size: 1.05rem; }
.etape p { color: var(--couleur-texte-doux); font-size: 0.9rem; margin: 0; }

/* ⚠️ 23/07/2026 (2e retour d'Enzo) : "enlève les animations, ça ne me
   convient pas" — toutes les animations spécifiques à "Comment ça marche"
   (rebond du chiffre à l'apparition, ligne de connexion qui se dessinait,
   chevron lumineux voyageant en boucle) sont retirées. Présentation
   maintenant entièrement statique : les 3 étapes restent reliées par une
   simple ligne fixe (aucune transition, aucune animation), qui montre le
   sens de lecture sans aucun mouvement. La légère apparition en fondu au
   scroll (classe .reveal-attente/.reveal-visible, cf. plus bas dans le
   fichier) reste en revanche en place : c'est le même effet discret
   partagé par les cartes annonces et les "atouts" ailleurs sur le site,
   pas l'animation spécifique dont Enzo ne voulait plus ici. */
@media (min-width: 1001px) {
    /* Ligne de connexion statique, positionnée exactement dans l'espace
       entre deux cartes (`left: 100%` = bord droit de la carte, `width` =
       la valeur exacte du `gap` de `.etapes` ci-dessus). */
    .etape:not(:last-child)::after {
        content: '';
        position: absolute;
        top: 37px;
        left: 100%;
        width: 26px;
        height: 3px;
        border-radius: 2px;
        background: linear-gradient(90deg, var(--couleur-accent-fonce), var(--couleur-accent));
        pointer-events: none;
    }
}

/* Histoire / principe de la plateforme : texte + vraie photo (remplace le
   panneau décoratif texturé le 22/07/2026 — photo fournie par Enzo, avec
   un badge "Depuis 2000" superposé en bas à gauche, cf. .bloc-histoire__badge
   ci-dessous, à la place de l'ancien contenu du panneau). */
.bloc-histoire { display: grid; grid-template-columns: 1fr 1fr; gap: 40px; align-items: center; }
.bloc-histoire__texte h2 { margin-top: 0; }
.bloc-histoire__texte p { color: var(--couleur-texte-doux); line-height: 1.6; }
.bloc-histoire__visuel {
    position: relative;
    /* ⚠️ 29/07/2026 (retour Enzo, 2 passes) : 1re passe — la hauteur fixe
       (min-height) + largeur variable selon l'écran donnait un cadre dont
       le rapport largeur/hauteur ne correspondait presque jamais à celui
       de la vraie photo, donc soit ça coupait les 2 personnes sur les
       bords (object-fit: cover), soit ça laissait de larges bandes vides
       de chaque côté (object-fit: contain, 2e passe, toujours pas bon).
       Fond du problème : le cadre et la photo n'avaient tout simplement
       pas le même rapport largeur/hauteur. Solution définitive : forcer le
       cadre à adopter EXACTEMENT le rapport largeur/hauteur réel de la
       photo (aspect-ratio) plutôt que fixer une hauteur indépendante de la
       largeur — la photo remplit alors le cadre pile, entière, sans
       jamais rien couper ni laisser de bande vide, quelle que soit la
       largeur d'écran.
       30/07/2026 (demande Enzo) : photo remplacée par celle des deux
       fondateurs devant leur collection de véhicules — nouvelles
       dimensions réelles (1536×1024, ratio différent de l'ancienne photo)
       reportées ici pour garder ce même principe "cadre = ratio exact de
       la photo". Ne pas oublier de remettre ce nombre à jour si la photo
       est changée à nouveau avec des dimensions différentes. 1536×1024 =
       dimensions réelles de assets/img/histoire-passionnes.jpg. */
    aspect-ratio: 1536 / 1024;
    border-radius: var(--rayon);
    overflow: hidden;
    box-shadow: var(--ombre);
    background: var(--couleur-kaki-fond);
}
.bloc-histoire__visuel img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
}
.bloc-histoire__badge {
    position: absolute;
    left: 16px;
    bottom: 16px;
    z-index: 1;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(23, 24, 20, 0.72);
    color: #fff;
    padding: 8px 14px;
    border-radius: 999px;
    font-family: var(--police-titres);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    font-size: 0.82rem;
    backdrop-filter: blur(3px);
}
.bloc-histoire__badge-icone { width: 18px; height: 18px; }

/* Pourquoi nous choisir */
.atouts { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
/* Légère ombre portée sous chaque bloc, pour un peu de relief (demande
   Enzo du 22/07/2026) — statique, pas d'effet de survol ici (contrairement
   aux blocs "Comment ça marche" ci-dessus, seuls concernés par le hover). */
.atout {
    text-align: center;
    padding: 24px 16px;
    border-radius: var(--rayon);
    box-shadow: 0 6px 16px rgba(23, 24, 20, 0.08);
}
/* Icônes recolorées (retour Enzo du 22/07/2026 : la section "Pourquoi..."
   restait un cercle blanc + icône grise sur fond sombre — trop noir et
   blanc, "plutôt triste"). Même dégradé accent que les chiffres de
   "Comment ça marche" (cf. .etape__numero, corrigé au maj-57), pour une
   vraie touche de couleur cohérente avec le reste du site plutôt qu'un
   nouvel aplat inventé, et pour faire écho visuellement aux deux sections
   qui partagent déjà le même fond sombre. */
.atout__icone {
    width: 52px;
    height: 52px;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--couleur-accent), var(--couleur-accent-fonce));
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 0 auto 14px;
    box-shadow: 0 8px 18px rgba(176, 68, 43, 0.32);
}
.atout__icone .icone { width: 26px; height: 26px; }
.atout h3 { margin: 0 0 6px; font-size: 0.98rem; }
.atout p { color: var(--couleur-texte-doux); font-size: 0.85rem; margin: 0; }

/* Déposer une annonce (CTA pleine largeur, ex-"Devenir partenaire" —
   repensée le 22/07/2026 à la demande d'Enzo pour promouvoir le dépôt
   d'annonce plutôt que le contact professionnel ; reprend les clés de
   traduction et le style de l'ancien encart sidebar retiré au-dessus). */
.bloc-deposer-annonce { text-align: center; max-width: 640px; margin: 0 auto; }
.bloc-deposer-annonce h2 { justify-content: center; }
.bloc-deposer-annonce .sous-titre-bloc { margin-left: auto; margin-right: auto; text-align: center; }

/* Newsletter — section sombre assortie au header/footer plutôt qu'un
   encart kaki flottant : elle fait la jonction visuelle avec le pied de
   page juste en dessous (même famille de couleur), au lieu de retomber
   sur un ton clair qui la faisait paraître ajoutée après-coup. */
.bloc-newsletter {
    padding: 50px 0;
    background: var(--couleur-encre);
    color: var(--couleur-encre-claire);
}
.bloc-newsletter .newsletter {
    background: transparent;
    padding: 0;
    max-width: 1100px;
    margin: 0 auto;
}
.newsletter {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
    flex-wrap: wrap;
    background: var(--couleur-kaki-fond);
    border-radius: var(--rayon);
    padding: 30px 34px;
}
.newsletter h3 { margin: 0 0 4px; }
.newsletter p { margin: 0; color: var(--couleur-texte-doux); font-size: 0.9rem; }
.bloc-newsletter .newsletter h3 { color: #fff; }
.bloc-newsletter .newsletter p { color: rgba(244, 242, 236, 0.72); }
.newsletter form { display: flex; gap: 8px; flex-wrap: wrap; max-width: 100%; }
.newsletter input {
    padding: 11px 14px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    font-family: var(--police);
    width: 240px;
    max-width: 100%;
}
.bloc-newsletter .newsletter input {
    background: rgba(244, 242, 236, 0.08);
    border: 1px solid rgba(244, 242, 236, 0.28);
    color: #fff;
}
.bloc-newsletter .newsletter input::placeholder { color: rgba(244, 242, 236, 0.55); }
.newsletter button {
    border: none;
    background: var(--couleur-accent);
    color: #fff;
    padding: 11px 20px;
    border-radius: var(--rayon);
    font-weight: 700;
    text-transform: uppercase;
    font-size: 0.8rem;
    cursor: pointer;
}
.newsletter button:hover { background: var(--couleur-accent-fonce); }

@media (max-width: 1000px) {
    .etapes, .atouts { grid-template-columns: repeat(2, 1fr); }
    .bloc-histoire { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
    .newsletter { padding: 24px 20px; }
    .newsletter form { width: 100%; }
    .newsletter input { width: 100%; }
    .newsletter button { width: 100%; }
}

/* =========================================================================
   Annuaire des professionnels (professionnels.php / admin/professionnels.php)
   Ajouté le 23/07/2026, à partir de la maquette validée "Maquette A".
   .annuaire-hero / .annuaire-filtres portent des noms propres à cette page,
   volontairement différents de .page-hero / .barre-filtres déjà utilisés par
   l'accueil / à-vendre / vendu avec un tout autre gabarit (grand hero plein
   écran avec photo, min-height jusqu'à 760px) : réutiliser ces noms aurait
   soit cassé l'affichage de ces pages, soit hérité ici d'une hauteur non
   désirée. Le reste (plaques pays, pastilles catégorie, liste des fiches) est
   repris quasiment tel quel de la maquette : ces classes n'existaient pas
   encore ailleurs sur le site.
   ========================================================================= */
.annuaire-hero {
    /* Bandeau étiré jusqu'aux bords de la fenêtre (comme .page-hero sur les
       autres pages) plutôt que limité à la largeur de <main class="conteneur">
       — sans cette technique, un simple <section> placé dans <main> reste
       plafonné à la même largeur que le reste du contenu, ce qui rend le
       bandeau plus étroit que le reste de la page. Son propre contenu (titre,
       texte) est ensuite recentré par le <div class="conteneur"> imbriqué à
       l'intérieur (voir professionnels.php), comme pour .bloc-accueil. */
    position: relative;
    overflow: hidden;
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    margin-right: calc(-50vw + 50%);
    background: var(--couleur-gris-fonce);
    color: #fff;
    /* Padding bas augmenté 60px → 104px le 28/07/2026 (demande Enzo, "peut
       être agrandit la hauteur") pour laisser respirer le nouveau bouton
       CTA ajouté sous le paragraphe, sans changer le chevauchement de
       .annuaire-filtres (toujours -40px, voir plus bas) ni le reste de la
       mise en page. */
    padding: 68px 0 104px;
}

/* Photo de couverture (convoi de véhicules militaires, fournie par Enzo le
   23/07/2026) + voile noir moyennement foncé par-dessus, même principe que
   .page-hero__image-fixe/.page-hero__overlay sur l'accueil. */
.annuaire-hero__image-fixe { position: absolute; inset: 0; overflow: hidden; }
.annuaire-hero__image-fixe img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.annuaire-hero__overlay {
    position: absolute;
    inset: 0;
    /* Voile assombri à la demande d'Enzo du 23/07/2026 (0.55 → 0.68). */
    background: rgba(10, 10, 10, 0.68);
}
.annuaire-hero__interieur {
    position: relative;
    z-index: 1;
}
.annuaire-hero h1 {
    font-family: var(--police-titres);
    font-size: 2.1rem;
    margin: 0 0 10px;
    display: flex;
    align-items: center;
    gap: 12px;
}
.annuaire-hero h1 .icone { width: 30px; height: 30px; color: var(--couleur-accent); }
.annuaire-hero p { margin: 0; color: rgba(244,242,236,0.75); max-width: 640px; line-height: 1.5; }

/* Bouton CTA pro (28/07/2026, demande Enzo) : réutilise .bouton-principal
   (déjà utilisé en <a> ailleurs, ex. index.php) comme base (couleur, forme
   générale), sans jamais modifier .bouton-principal lui-même (partagé par
   tout le site) — tout l'habillage "plus attractif" ci-dessous est ajouté
   uniquement via ce sélecteur dédié, propre à ce bouton précis.
   30/07/2026 (demande Enzo : "rend le bouton plus attractif, afin que les
   clients comprennent que pour s'enregistrer faut cliquer dessus") : forme
   à coins abattus reprise du bouton du header (.header-b__cta) et du
   bouton "Déposer une annonce" de l'accueil — signature visuelle "plaque
   militaire" déjà utilisée ailleurs sur le site, plus grand, avec une
   ombre marquée au repos (pas seulement au survol) pour bien le détacher
   de la photo derrière lui, et une flèche qui se déplace légèrement au
   survol pour suggérer l'action. Volontairement SANS animation en boucle
   (pulsation, clignotement...) : Enzo avait explicitement retiré ce genre
   d'effet ailleurs sur le site ("enlève les animations, ça ne me convient
   pas", voir Comment ça marche) — l'attractivité vient ici de la taille,
   de la forme et de l'ombre, pas du mouvement continu. */
.annuaire-hero__cta {
    margin-top: 26px;
    padding: 16px 34px;
    font-size: 1.05rem;
    letter-spacing: 0.05em;
    display: inline-flex;
    align-items: center;
    gap: 10px;
    clip-path: polygon(14px 0, 100% 0, 100% calc(100% - 14px), calc(100% - 14px) 100%, 0 100%, 0 14px);
    box-shadow: 0 10px 26px rgba(0, 0, 0, 0.45);
    transition: background 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
}
/* Flèche suggérant l'action (pure CSS, aucune clé de traduction à ajouter) :
   glisse légèrement vers la droite au survol/focus. */
.annuaire-hero__cta::after {
    content: '\2192';
    font-size: 1.1em;
    transition: transform 0.2s ease;
}
.annuaire-hero__cta:hover,
.annuaire-hero__cta:focus-visible {
    transform: translateY(-3px);
    box-shadow: 0 16px 34px rgba(0, 0, 0, 0.5);
}
.annuaire-hero__cta:hover::after,
.annuaire-hero__cta:focus-visible::after {
    transform: translateX(4px);
}
.annuaire-hero__cta:active {
    transform: translateY(-1px);
    box-shadow: 0 8px 18px rgba(0, 0, 0, 0.4);
}
@media (max-width: 700px) {
    /* Sur mobile (bouton déjà pleine largeur ou proche), un padding aussi
       généreux prendrait trop de place — resserré, la forme/l'ombre restent
       identiques. */
    .annuaire-hero__cta { padding: 14px 26px; font-size: 0.98rem; }
}

/* Bouton secondaire "Tarification" (30/07/2026, demande Enzo). Historique :
   1) simple lien souligné jugé "pas très visible" ; 2) vrai bouton à contour
   repositionné EN DESSOUS du CTA principal avec la même forme à coins coupés
   (coins coupés = "thème seconde guerre" du site) ; 3) (même jour, 3e retour)
   Enzo ne veut PLUS de ce thème pour ce bouton précis : "plus petit et avec
   que des bordures arrondis fines (pas de bordures thème seconde guerre)".
   Donc ici on abandonne volontairement le `clip-path` à coins coupés (gardé
   partout ailleurs sur le site) au profit d'un simple `border-radius` fin,
   et on réduit nettement padding/taille de police pour qu'il reste visible
   mais clairement plus discret/petit que le CTA principal juste au-dessus. */
.annuaire-hero__cta-secondaire {
    display: flex;
    width: fit-content;
    align-items: center;
    gap: 8px;
    margin-top: 14px;
    padding: 9px 20px;
    font-family: var(--police-titres);
    font-size: 0.85rem;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: #fff;
    background: rgba(244, 242, 236, 0.08);
    border: 1.5px solid rgba(255, 255, 255, 0.7);
    border-radius: 999px;
    transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease;
}
.annuaire-hero__cta-secondaire:hover,
.annuaire-hero__cta-secondaire:focus-visible {
    background: #fff;
    color: var(--couleur-encre);
    transform: translateY(-2px);
}
@media (max-width: 700px) {
    /* Même resserrement que le CTA principal juste au-dessus sur mobile. */
    .annuaire-hero__cta-secondaire { padding: 8px 18px; font-size: 0.8rem; }
}

.annuaire-filtres {
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
    align-items: center;
    background: var(--couleur-encre-claire);
    border: 1px solid var(--couleur-bordure);
    border-left: 5px solid var(--couleur-accent);
    border-radius: var(--rayon);
    box-shadow: var(--ombre);
    padding: 18px 20px;
    /* Chevauchement volontaire sur le bas du bandeau photo ("à cheval sur
       la section", confirmé par Enzo le 23/07/2026) — un essai précédent
       avait retiré ce chevauchement (posé simplement en dessous), jugé
       "mal intégré" à l'inverse par Enzo, qui voulait bien le
       chevauchement mais correctement rendu. Repris ici avec un
       chevauchement un peu plus marqué (-40px) qu'à l'origine. */
    margin-top: -40px;
    margin-bottom: 0;
    /* ⚠️ Bug découvert le 23/07/2026 en testant (pas signalé par Enzo) :
       .annuaire-hero est en "position: relative" (sans z-index), ce qui le
       fait peindre APRÈS les éléments non positionnés du même niveau —
       donc APRÈS .annuaire-filtres bien qu'il soit avant lui dans le code
       source. Résultat concret : dans la bande où les deux se chevauchent,
       .annuaire-hero__overlay (le voile noir, à l'intérieur de .annuaire-hero)
       captait les clics à la place du champ de recherche/bouton "Filtrer"
       qui se trouvaient dessous — invisible à l'œil (le bouton reste bien
       affiché au-dessus visuellement grâce à cette même règle) mais bien
       réel au clic. Positionner .annuaire-filtres également et lui donner
       un z-index le fait passer dans le même groupe de peinture que
       .annuaire-hero, où l'ordre du code source (lui, après) l'emporte
       cette fois — il repasse donc aussi au-dessus pour les clics. */
    position: relative;
    z-index: 2;
}
.annuaire-filtres input[type="text"],
.annuaire-filtres select {
    font-family: inherit;
    font-size: 0.9rem;
    padding: 10px 14px;
    border: 1px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    background: #fff;
    color: var(--couleur-texte);
}
.annuaire-filtres input[type="text"] { flex: 1 1 220px; }
.annuaire-filtres select { flex: 0 0 auto; min-width: 170px; }
.annuaire-filtres__reinit {
    background: none;
    border: none;
    color: var(--couleur-accent-fonce);
    font-size: 0.85rem;
    cursor: pointer;
    font-weight: 700;
    text-decoration: underline;
    padding: 12px 0;
}

.annuaire-contenu {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 48px;
    align-items: start;
    padding: 36px 0 80px;
}
@media (max-width: 800px) {
    .annuaire-contenu { grid-template-columns: 1fr; }
}

/* --- Sections pays (partagé avec la maquette de validation) ------------- */
.section-pays { margin-bottom: 40px; }
.section-pays__titre {
    display: flex; align-items: center; gap: 10px; font-family: var(--police-titres);
    font-size: 1.3rem; padding-bottom: 10px; margin-bottom: 4px; border-bottom: 3px solid var(--couleur-kaki);
}
.section-pays__titre .compte { font-size: 0.85rem; color: var(--couleur-texte-doux); font-family: var(--police); font-weight: 400; }
.section-pays__titre .plaque-drapeau { width: 30px; height: 20px; }

/* Petits drapeaux à coins arrondis (26/07/2026, demande Enzo) — remplace
   les précédentes plaques dessinées en CSS (coins coupés façon "plaque
   militaire", couleurs approximatives faute de vraies images). Chaque
   ".plaque-drapeau--XX" affiche désormais le vrai drapeau (SVG fourni par
   Enzo, assets/img/drapeaux/), avec des coins arrondis plutôt que coupés. */
.plaque-drapeau {
    display: inline-block; flex-shrink: 0; width: 26px; height: 18px;
    border: 1px solid var(--couleur-encre); box-shadow: 0 1px 2px rgba(0,0,0,0.18);
    border-radius: 3px;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
}
.plaque-drapeau--fr { background-image: url('../img/drapeaux/fr.svg'); }
.plaque-drapeau--be { background-image: url('../img/drapeaux/be.svg'); }
.plaque-drapeau--de { background-image: url('../img/drapeaux/de.svg'); }
.plaque-drapeau--nl { background-image: url('../img/drapeaux/nl.svg'); }
.plaque-drapeau--it { background-image: url('../img/drapeaux/it.svg'); }
.plaque-drapeau--ca { background-image: url('../img/drapeaux/ca.svg'); }
.plaque-drapeau--gb { background-image: url('../img/drapeaux/gb.svg'); }
.plaque-drapeau--us { background-image: url('../img/drapeaux/us.svg'); }
.plaque-drapeau--pl { background-image: url('../img/drapeaux/pl.svg'); }
/* Ajoutés le 29/07/2026 (demande Enzo, passage du sélecteur de langue de 2 à
   7 langues) : espagnol et tchèque, absents jusque-là de l'annuaire des
   drapeaux (voir assets/img/drapeaux/es.svg et cz.svg). */
.plaque-drapeau--es { background-image: url('../img/drapeaux/es.svg'); }
.plaque-drapeau--cz { background-image: url('../img/drapeaux/cz.svg'); }
/* "Autre" ajouté le 30/07/2026 (demande Enzo, pays_code 'zz' — voir
   listePaysProfessionnels() dans includes/functions.php) : ce n'est pas un
   vrai pays, donc pas de vrai drapeau à afficher — sur demande explicite
   d'Enzo, la plaque reste masquée plutôt que d'afficher un rectangle vide
   sans image. Le libellé texte "Autre" à côté (annonce.php,
   includes/section-pays-pro.php) reste lui bien affiché. */
.plaque-drapeau--zz { display: none; }

/* --- Liste des fiches, fluide (chaque fiche prend juste sa largeur de
   contenu, se réorganise naturellement sans media query) ------------------ */
.grille-pros { display: flex; flex-wrap: wrap; gap: 4px 32px; }
/* flex-shrink autorisé (contrairement à un flex 0 0 auto strict) + min-width: 0 :
   sur les petits écrans, une fiche dont le nom + la pastille métier dépassent la
   largeur disponible (ex : nom long + "Fournisseur de pièces") doit pouvoir se
   rétrécir plutôt que déborder du conteneur — la pastille passe alors à la ligne
   suivante grâce au flex-wrap déjà posé sur .ligne-pro h3 juste en dessous. Sur
   desktop, où la largeur ne manque pas, le comportement "packée par son propre
   contenu" reste inchangé (rien ne force le rétrécissement si la place suffit). */
.ligne-pro { flex: 0 1 auto; max-width: 100%; min-width: 0; padding: 8px 6px; border-radius: var(--rayon); transition: background 0.15s ease; }
.ligne-pro:hover { background: var(--couleur-encre-claire); }
.ligne-pro h3 { margin: 0; font-family: var(--police-titres); font-size: 1rem; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ligne-pro h3 a { color: inherit; text-decoration: none; }
.ligne-pro h3 a:hover { color: var(--couleur-accent); text-decoration: underline; }

.pastille-cat {
    font-family: var(--police-titres); font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.04em;
    padding: 3px 8px; border-radius: 999px; color: #fff; white-space: nowrap;
}
.pastille-cat--restaurateur { background: var(--couleur-kaki); }
.pastille-cat--garage { background: var(--couleur-accent); }
.pastille-cat--pieces { background: var(--couleur-gris-fonce); }
.pastille-cat--assureur { background: var(--couleur-attention); color: var(--couleur-encre); }

@media (max-width: 700px) {
    /* 29/07/2026 (refonte mobile/tablette) : même traitement que
       .barre-filtres (accueil/à vendre) — empilé en pleine largeur plutôt
       que des champs à largeur fixe qui se comprimaient les uns contre
       les autres (comportement remplacé, la règle `min-width: 140px`
       posée le 23/07/2026 ne suffisait plus une fois le formulaire
       vraiment adapté au tactile). Chevauchement avec la photo du bandeau
       réduit (-40px → -20px) : le formulaire est nettement plus haut une
       fois empilé, un chevauchement aussi marqué qu'en desktop grignotait
       le bouton CTA juste au-dessus. */
    .annuaire-filtres {
        flex-direction: column;
        align-items: stretch;
        margin-top: -20px;
    }
    .annuaire-filtres input[type="text"],
    .annuaire-filtres select {
        width: 100%;
        min-width: 0;
        flex: 1 1 auto;
        padding: 13px 14px;
        font-size: 1rem;
    }
    .annuaire-filtres button,
    .annuaire-filtres__reinit { width: 100%; text-align: center; }
}
/* 29/07/2026 (retour Enzo, "trop d'espacement entre les mots, réduis
   l'espacement de hauteur") : sur mobile, le titre ("Annuaire des
   professionnels partenaires") revient sur 3 lignes — combiné à
   `align-items: center` (hérité du desktop, où le titre tient sur 1 seule
   ligne) l'icône se retrouvait centrée sur la hauteur totale des 3 lignes
   empilées, donc au milieu de la 2e ligne, ce qui laissait un grand vide
   à gauche des 1re et 3e lignes — d'où l'impression de titre "trop espacé".
   Par ailleurs le h1 n'avait pas de line-height propre : il héritait du
   1.5 global (texte courant), bien trop aéré pour un gros titre découpé
   sur plusieurs lignes. Corrigé uniquement ici (desktop inchangé, 1 seule
   ligne, pas concerné) : `align-items: flex-start` aligne l'icône sur la
   1re ligne seulement (plus de vide artificiel), `line-height` resserré à
   1.15, et taille très légèrement réduite pour limiter le nombre de mots
   par ligne. */
@media (max-width: 700px) {
    .annuaire-hero h1 {
        font-size: 1.7rem;
        line-height: 1.15;
        align-items: flex-start;
        gap: 10px;
    }
    .annuaire-hero h1 .icone { width: 26px; height: 26px; margin-top: 3px; flex-shrink: 0; }
}

/* =========================================================================
   Section tarification annuaire pro (30/07/2026, demande Enzo) — livrée une
   première fois comme une carte centrée (largeur 560px), revue le jour même
   ("fais une section en pleine largeur, plus qu'un bloc, collée au
   footer") : repose désormais sur le composant générique ".bloc-accueil"
   déjà utilisé ailleurs sur le site (bandeau plein écran qui sort du
   conteneur centré, voir ".bloc-accueil" plus haut) avec le modificateur
   sombre ".bloc-accueil--sombre" (même gris que "Coup de cœur"/"Comment ça
   marche"), pour rester cohérent avec le reste du site plutôt que
   d'introduire un nouveau motif de carte. Le fait qu'elle soit collée au
   pied de page (aucun espace blanc) vient gratuitement de la règle déjà en
   place ".page-principale:has(> .bloc-accueil:last-child) { padding-bottom:
   0; }" dès qu'elle porte la classe ".bloc-accueil" — rien à ajouter ici
   pour ce point précis. Seul le contenu interne (titre/prix/détail/texte/
   bouton) est stylé ci-dessous, centré dans une colonne de largeur
   raisonnable pour rester lisible sur un bandeau pleine largeur. */
.annuaire-tarification__interieur {
    max-width: 640px;
    margin: 0 auto;
    text-align: center;
}
.annuaire-tarification__interieur h2 { justify-content: center; }
/* 30/07/2026 (7e retour Enzo, même jour) : icône "étiquette" retirée du
   titre (elle avait été ajoutée le même jour, plus tôt, pour "rendre la
   section plus attirante", mais Enzo revient dessus). Les règles CSS
   dédiées à cette icône (couleur, et l'empilement icône/texte en colonne
   sur mobile) sont retirées avec elle : ".bloc-accueil h2" gère déjà seule
   le centrage du titre texte, plus rien à ajouter ici. */
/* "Plaque" mettant le prix en valeur (30/07/2026) — jusque-là un simple
   texte au milieu d'autres lignes de texte, peu différent visuellement du
   reste du bandeau. Reprend le motif "plaque militaire" à coins coupés
   déjà utilisé sur les boutons du site (même famille visuelle que
   ".annuaire-hero__cta"/".annuaire-hero__cta-secondaire" juste au-dessus),
   avec un fond et une bordure légèrement plus clairs que le bandeau sombre
   pour se détacher nettement et devenir le vrai point focal de la
   section. */
/* 30/07/2026 (4e retour Enzo, même jour) : "j'aime pas l'écriture du prix en
   couleur orange sur fond gris". Auparavant le prix (--couleur-accent, orange
   brique) était écrit sur un fond gris tramé très subtil (rgba blanc-cassé à
   6% d'opacité) — combinaison jugée peu lisible/peu attirante. 1re inversion
   du traitement : fond plein --couleur-accent (orange brique) + prix en
   blanc cassé.
   30/07/2026 (5e retour Enzo, même jour, capture d'écran à l'appui) : l'aplat
   orange brique ne convient pas non plus — passage à un fond gris clair
   (--couleur-encre-claire) + texte en encre foncée.
   30/07/2026 (6e retour Enzo, même jour) : ce mélange de couleurs (icône
   orange + plaque gris clair/encre foncée + bouton orange) ne plaisait
   toujours pas dans l'ensemble. 4 propositions de palettes envoyées à Enzo
   en aperçu (kaki militaire / laiton-médaille / épurée sans bloc coloré /
   fond clair) — Enzo choisit l'option "kaki militaire" (icône + plaque
   kaki, cohérent avec l'esprit "matériel" du site plutôt que de reprendre
   le rouge brique déjà très présent ailleurs), mais souhaite garder le
   bouton "S'enregistrer dans l'annuaire" en rouge brique — qui est déjà sa
   couleur par défaut via ".bouton-principal" (aucune couleur de bouton
   dédiée n'avait été ajoutée ici), donc aucune modification supplémentaire
   n'est nécessaire pour ce point. */
.annuaire-tarification__plaque {
    display: inline-block;
    margin: 22px 0 0;
    padding: 22px 44px;
    background: var(--couleur-kaki);
    border: 1px solid var(--couleur-kaki-fonce);
    clip-path: polygon(16px 0, 100% 0, 100% calc(100% - 16px), calc(100% - 16px) 100%, 0 100%, 0 16px);
}
.annuaire-tarification__prix {
    font-family: var(--police-titres);
    font-size: 2.6rem;
    /* 30/07/2026 (7e retour Enzo, même jour) : blanc cassé (--couleur-encre-claire)
       remplacé par un blanc pur, demande explicite d'Enzo ("met '12 € HT / mois'
       en blanc"). */
    color: #fff;
    margin: 0;
    line-height: 1.2;
}
.annuaire-tarification__detail {
    margin: 6px 0 0;
    font-size: 0.92rem;
    color: rgba(244, 242, 236, 0.8);
}
.annuaire-tarification__texte {
    margin: 26px 0 26px;
    line-height: 1.5;
    color: rgba(244, 242, 236, 0.9);
}
.annuaire-tarification__interieur .bouton-principal { margin-top: 0; }
@media (max-width: 560px) {
    .annuaire-tarification__plaque { padding: 18px 30px; }
    .annuaire-tarification__prix { font-size: 2rem; }
}

/* =========================================================================
   Bandeau de consentement aux cookies (28/07/2026, demande Enzo — mise en
   place de Google Analytics). Masqué par défaut via l'attribut HTML
   "hidden" (posé dans includes/cookie-banner.php) : seul
   assets/js/cookies.js le retire si aucun choix n'est encore enregistré.
   Sans JavaScript, ce bandeau ne s'affiche jamais — cohérent avec le fait
   qu'Analytics ne se charge alors jamais non plus.
   ========================================================================= */
.bandeau-cookies {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 500;
    background: var(--couleur-encre);
    color: var(--couleur-encre-claire);
    box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.25);
}
.bandeau-cookies__interieur {
    max-width: 1100px;
    margin: 0 auto;
    padding: 18px 20px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
    flex-wrap: wrap;
}
.bandeau-cookies__texte { margin: 0; font-size: 0.9rem; line-height: 1.5; flex: 1 1 380px; }
.bandeau-cookies__texte a { color: #fff; text-decoration: underline; }
.bandeau-cookies__actions {
    display: flex;
    gap: 12px;
    flex-wrap: wrap;
    flex: 0 0 auto;
}
/* Boutons réutilisés tels quels (.bouton-principal/.bouton-secondaire),
   juste sans la marge supérieure par défaut (hors de propos ici, alignés
   horizontalement avec le texte). */
.bandeau-cookies .bouton-principal,
.bandeau-cookies .bouton-secondaire { margin-top: 0; }

@media (max-width: 560px) {
    .bandeau-cookies__interieur { padding: 16px; }
    .bandeau-cookies__actions { width: 100%; }
    .bandeau-cookies__actions .bouton-principal,
    .bandeau-cookies__actions .bouton-secondaire { flex: 1 1 0; text-align: center; }
}

/* ==========================================================================
   Panneau "Boostez votre annonce" (extras payants du dépôt d'annonce) —
   redesigné le 29/07/2026 à la demande d'Enzo : ce panneau était visuellement
   identique aux autres (coordonnées, photos...), ce qui faisait qu'on n'y
   prêtait pas attention — pourtant la seule section du formulaire qui génère
   du revenu. Traitement délibérément différent du reste du formulaire :
   dégradé kaki + bordure colorée sur le panneau, ruban "Facultatif", options
   présentées comme des cartes cliquables (façon tableau de prix) plutôt que
   de simples cases à cocher/radio alignées, carte "Coup de cœur" mise en
   vedette (bordure + bandeau "Le plus visible"). Remplace l'ancienne classe
   .depot-choix-mise-en-avant (simple liste de radios empilées). Les
   name/id/value des champs réels n'ont pas changé — voir deposer-annonce.php.
   ========================================================================== */
.depot-panneau--extras {
    position: relative;
    background: linear-gradient(160deg, #ffffff 0%, var(--couleur-kaki-fond) 145%);
    border: 2px solid var(--couleur-kaki);
    box-shadow: 0 10px 28px rgba(107, 111, 71, 0.2);
}
.depot-panneau--extras .depot-panneau__entete {
    border-bottom-color: rgba(107, 111, 71, 0.35);
}
/* Surclasse la couleur par défaut (rouge accent) des icônes d'en-tête de
   panneau, qui vise `.depot-panneau__entete .icone` en général — cette
   règle, plus spécifique (deux classes) et placée après dans la feuille de
   style, l'emporte pour ce panneau précis uniquement. */
.depot-panneau__entete .depot-panneau__icone-extras { color: var(--couleur-kaki); }

/* Ruban "Facultatif" — poussé à droite de l'en-tête (flex déjà en place sur
   .depot-panneau__entete) pour rappeler que le dépôt reste gratuit sans ces
   options, sans pour autant passer inaperçu comme un simple texte. */
.depot-panneau__ruban {
    margin-left: auto;
    background: var(--couleur-accent);
    color: #fff;
    font-family: var(--police-titres);
    font-size: 0.72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    padding: 5px 13px;
    border-radius: 999px;
    white-space: nowrap;
}

.depot-panneau__sous-titre {
    margin: 20px 0 4px;
    font-family: var(--police-titres);
    font-weight: 600;
    font-size: 0.95rem;
    color: var(--couleur-encre);
}
/* Phrase d'explication sous "Mise en avant en page d'accueil" (29/07/2026,
   retour Enzo) : précise que ces options correspondent chacune à une
   section précise et déjà visible de la page d'accueil, pour que le
   visiteur comprenne à quoi ça correspond avant même de lire chaque carte
   (voir aussi le détail redondant mais explicite sur chaque carte
   elle-même, .depot-extra__detail). */
.depot-champ__aide--extras { margin-bottom: 2px; }

/* --- Cartes d'options (checkbox "10 photos" + radios "mise en avant") --- */
.depot-extra { margin-top: 12px; }
.depot-extra--groupe {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 16px;
    margin-top: 18px;
}

.depot-extra__carte {
    position: relative;
    display: block;
    cursor: pointer;
    background: #fff;
    border: 2px solid var(--couleur-bordure);
    border-radius: var(--rayon);
    /* ⚠️ 29/07/2026 (retour Enzo) : padding augmenté partout — le texte
       touchait presque la bordure des cartes ("marge de contour" trop
       fine). */
    padding: 26px 52px 26px 26px;
    transition: border-color 0.15s ease, background 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}
/* Option seule ("10 photos") : mise en page horizontale icône/texte/prix. */
.depot-extra:not(.depot-extra--groupe) .depot-extra__carte {
    display: flex;
    align-items: center;
    gap: 18px;
}
/* Options groupées (mise en avant) : cartes verticales centrées, façon
   tableau de tarifs, alignées en 3 colonnes. */
.depot-extra--groupe .depot-extra__carte {
    display: flex;
    flex-direction: column;
    align-items: center;
    /* ⚠️ 29/07/2026 (retour Enzo) : la carte "Aucune mise en avant" a moins
       de contenu que ses deux voisines (pas d'icône ni de détail), donc une
       fois étirée à la même hauteur (`height: 100%`) son contenu restait
       collé en haut au lieu d'occuper le centre de la carte — corrigé avec
       `justify-content: center`, qui centre verticalement le contenu quelle
       que soit sa hauteur réelle par rapport à celle de la carte. */
    justify-content: center;
    text-align: center;
    gap: 9px;
    height: 100%;
    padding: 34px 24px 28px;
}
.depot-extra__carte:hover {
    border-color: var(--couleur-kaki);
    transform: translateY(-3px);
    box-shadow: var(--ombre);
}
/* L'input réel couvre toute la carte (invisible mais toujours cliquable et
   accessible au clavier/lecteur d'écran) plutôt qu'une simple case listée —
   c'est la carte entière qui devient la zone cliquable. */
.depot-extra__carte input[type="checkbox"],
.depot-extra__carte input[type="radio"] {
    position: absolute;
    inset: 0;
    margin: 0;
    opacity: 0;
    cursor: pointer;
    z-index: 2;
}
.depot-extra__carte:has(input:focus-visible) {
    outline: 2px solid var(--couleur-accent);
    outline-offset: 2px;
}
/* État sélectionné : bordure + ombre colorée — bien distinct au premier
   coup d'œil de l'état non sélectionné. ⚠️ 29/07/2026 (retour Enzo) : le
   fond teinté kaki/vert posé initialement a été retiré, remplacé par un
   simple fond blanc (la bordure + l'ombre suffisent à distinguer l'état
   sélectionné, sans ajouter de teinte verte jugée pas assez propre). */
.depot-extra__carte:has(input:checked) {
    border-color: var(--couleur-accent);
    background: #fff;
    box-shadow: 0 6px 16px rgba(176, 68, 43, 0.18);
}
/* Pastille de sélection (coin haut-droit) : cercle vide par défaut, coche
   pleine une fois l'option cochée/sélectionnée. */
.depot-extra__coche {
    position: absolute;
    top: 14px;
    right: 14px;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    border: 2px solid var(--couleur-bordure);
    background: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    color: transparent;
    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.depot-extra__coche .icone { width: 12px; height: 12px; }
.depot-extra__carte:has(input:checked) .depot-extra__coche {
    background: var(--couleur-accent);
    border-color: var(--couleur-accent);
    color: #fff;
}
.depot-extra__icone { width: 30px; height: 30px; color: var(--couleur-kaki); flex-shrink: 0; }
.depot-extra__carte:has(input:checked) .depot-extra__icone { color: var(--couleur-accent); }
.depot-extra__contenu { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.depot-extra:not(.depot-extra--groupe) .depot-extra__contenu { flex: 1; }
.depot-extra__titre { font-family: var(--police-titres); font-weight: 600; color: var(--couleur-encre); }
.depot-extra__detail { font-size: 0.8rem; color: var(--couleur-texte-doux); }
.depot-extra__prix {
    font-family: var(--police-titres);
    font-weight: 700;
    font-size: 1.05rem;
    color: var(--couleur-accent-fonce);
    white-space: nowrap;
}
.depot-extra:not(.depot-extra--groupe) .depot-extra__prix { margin-left: auto; }
.depot-extra--groupe .depot-extra__prix { margin-top: 2px; }
.depot-extra__prix--gratuit { color: var(--couleur-succes); font-size: 0.92rem; }

/* Carte "Coup de cœur" mise en avant (option la plus chère, la plus
   visible) : bordure kaki + bandeau flottant au-dessus de la carte. */
.depot-extra__carte--vedette { border-color: var(--couleur-kaki); }
.depot-extra__carte--vedette:has(input:checked) { border-color: var(--couleur-accent); }
.depot-extra__badge {
    position: absolute;
    top: -12px;
    left: 50%;
    transform: translateX(-50%);
    display: inline-flex;
    align-items: center;
    gap: 4px;
    background: var(--couleur-kaki);
    color: #fff;
    font-size: 0.66rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    padding: 4px 11px;
    border-radius: 999px;
    white-space: nowrap;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.22);
    z-index: 3;
}
.depot-extra__badge .icone { width: 11px; height: 11px; }

@media (max-width: 700px) {
    .depot-extra--groupe { grid-template-columns: 1fr; }
    /* Ruban "Facultatif" renvoyé sur sa propre ligne sous le titre en
       dessous de 480px : au-dessus de cette largeur, la ligne icône + titre
       + ruban tenait déjà bien ; en dessous, le ruban forçait le titre à se
       couper sur 3 lignes très étroites (repéré à la vérification mobile,
       390px). */
    .depot-panneau--extras .depot-panneau__entete { flex-wrap: wrap; row-gap: 8px; }
    .depot-panneau__ruban { margin-left: 0; }
}
