/* ============================================================
   RIWA — direction "produit moderne" (aout 2026, 3e passe).

   HISTORIQUE DES DEUX PASSES PRECEDENTES, pour ne pas y revenir :
   1. Peau "emeraude arrondie" d'origine -> jugee "generee par IA".
      Coupables : rayons de 28px partout, ombres portees douces sous
      chaque bloc, tout en cartes blanches flottantes, degrades
      emeraude/dore, grotesque geometrique par defaut.
   2. Reaction "guide editorial" (serif Fraunces + fond parchemin
      beige + filets fins) -> jugee VIEILLE. Le probleme : le serif
      et le beige signent un registre patrimonial, pas un service
      qu'on consulte tous les jours.

   CE QUE FAIT CETTE 3e PASSE : viser franchement le moderne, quitte
   a sacrifier la chaleur (arbitrage demande explicitement).
   - COULEUR ASSUMEE. Chaque categorie a sa teinte vive (voir
     COULEURS_PAR_SLUG cote serveur) injectee en variable --cat sur
     les cartes, pastilles, fiches et en-tetes de categorie. C'est le
     codage couleur qui rend le site vivant, et il est FONCTIONNEL :
     on reconnait une categorie a sa couleur.
   - CONTRASTE FORT. Hero et pied de page en panneau sombre presque
     noir, arrondi ; le reste en blanc franc. Fini le camaieu beige.
   - SURFACES PLEINES plutot que filets. Les blocs sont des aplats
     gris tres clairs, sans bordure ni ombre : c'est le vocabulaire
     des interfaces contemporaines (regroupements iOS/macOS).
   - RAYONS GENEREUX (14-28px) et boutons en pilule.

   POURQUOI CA NE RETOMBE PAS DANS LE RENDU "IA" : ce qui trahissait
   la generation automatique n'etait pas l'arrondi en soi, c'etait sa
   combinaison avec les ombres portees floues, le degrade vert/dore
   omnipresent et l'absence de hierarchie. Ici : aucune ombre diffuse
   (une seule ombre, tres serree, au survol), aucun degrade decoratif,
   une echelle typographique tres contrastee, et une couleur qui
   porte du sens plutot que de la decoration.
   ============================================================ */

:root {
  /* --- Neutres. Gris franchement froids : c'est ce qui lit "moderne"
     la ou le beige lisait "ancien". --- */
  --noir: #0B0B10;
  --noir-2: #16161D;
  --ink: #0E0E14;
  --ink-soft: #56566B;
  /* Fonce par rapport a la 1re version de cette passe (#8E8EA3, ~3.2:1 sur blanc,
     illisible sur les libelles/aide-champ en 11-13px) : vise ~5:1 pour rester lisible
     tout en gardant un role "secondaire" clair face a --ink / --ink-soft. */
  --ink-faint: #6E6E85;
  --cream: #FFFFFF;        /* fond de page */
  --paper: #F4F5F9;        /* aplat des blocs/cartes */
  --paper-2: #EBECF2;      /* aplat au survol */
  --line: #E6E7EE;
  --line-fort: #D5D7E1;

  /* --- Couleur de marque + accents vifs. --cat est surchargee en
     ligne par le serveur avec la couleur de la categorie courante. --- */
  --vert: #00A06A;
  --vert-fonce: #007A50;
  --vert-clair: #E1F7EE;
  --violet: #6C5CE7;
  --corail: #FF6B35;
  --rouge: #E5484D;
  --cyan: #00B8D9;
  --ambre: #F5A524;
  --bleu: #3E63DD;
  --cat: var(--vert);
  --cat-voile: color-mix(in srgb, var(--cat) 10%, #fff);

  /* Anciennes variables conservees : de nombreuses regles historiques
     les utilisent encore (offres payantes, avertissements, admin). */
  --emerald-950: #06120C;
  --emerald-900: #0B2C1E;
  --emerald-800: #0E4630;
  --emerald-700: #007A50;
  --emerald-600: #00A06A;
  --emerald-500: #21C58A;
  --emerald-100: #D6F3E6;
  --emerald-50: #EFFBF6;
  --terre-700: #C4441B;
  --terre-600: #FF6B35;
  --terre-500: #FF8A5E;
  --terre-100: #FFE9DF;
  --gold-700: #9A6B00;
  --gold-600: #F5A524;
  --gold-500: #FFC96B;
  --gold-100: #FFF3DC;
  --gold-ink: #8A5E00;
  --amber-bg: #FFF7E6;
  --amber-border: #FFE0A3;
  --amber-ink: #8A5E00;
  --amber-strong: #C77700;
  --danger: #E5484D;
  --danger-bg: #FFECEE;
  --danger-fonce: #C7373B;

  --radius-xl: 28px;
  --radius-lg: 20px;
  --radius-md: 14px;
  --radius-sm: 10px;
  --radius-pill: 999px;

  /* Une seule ombre dans toute l'interface, tres serree, et uniquement
     au survol : rien a voir avec les halos flous de la 1re version. */
  --shadow-sm: none;
  --shadow-md: none;
  --shadow-hover: 0 6px 20px rgba(11, 11, 16, .10);
  --shadow-lg: 0 40px 90px rgba(0, 0, 0, .5);

  --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  --font-titre: 'Sora', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
}

* { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; }
html { background: var(--cream); color-scheme: light; }
body { font-family: var(--font); font-feature-settings: 'kern' 1, 'liga' 1, 'cv11' 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background: var(--cream); color: var(--ink); min-height: 100vh; display: flex; flex-direction: column; }
main { flex: 1 0 auto; }
a { color: inherit; }
h1, h2, h3, h4 { font-family: var(--font-titre); font-weight: 700; letter-spacing: -.03em; }

/* Etat de focus visible (audit accessibilite, aout 2026) : le contour par defaut du
   navigateur reste correct sur fond blanc uni, mais rend mal (contraste faible/invisible)
   sur les pastilles/boutons colores (.filtre-chip, .nav-btn, cartes...) -- on definit donc un
   contour explicite et coherent pour TOUT element interactif au clavier, sans jamais
   supprimer le focus par defaut (:focus-visible seul, pas :focus, pour ne pas l'afficher
   inutilement au clic souris). Les regles plus specifiques deja definies ailleurs
   (ex. .hero .search input:focus) restent prioritaires la ou elles existent.  */
a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible,
textarea:focus-visible, [tabindex]:focus-visible, [role="button"]:focus-visible {
  outline: 2px solid var(--vert); outline-offset: 2px; border-radius: 4px;
}

/* Intitules en petites capitales : la seule "decoration" typographique du site. */
.type-small, .cat-block h3, .carte-offre h3, .feed-item-type, .timeline-date,
.timeline-type-badge, .annonce-type-badge {
  font-family: var(--font); text-transform: uppercase; letter-spacing: .08em; font-weight: 600;
}

/* ---------- NAVIGATION : barre blanche, bouton d'action en pilule verte ---------- */
nav { background: rgba(255,255,255,.82); backdrop-filter: saturate(180%) blur(18px); -webkit-backdrop-filter: saturate(180%) blur(18px); border-bottom: 1px solid var(--line); position: sticky; top: 0; z-index: 1200; }
.nav-inner { max-width: 1400px; margin: 0 auto; padding: 14px 24px; display: flex; align-items: center; justify-content: space-between; gap: 10px; }
nav .logo { font-family: var(--font-titre); font-size: 26px; font-weight: 800; color: var(--ink); text-decoration: none; letter-spacing: -.05em; flex-shrink: 0; }
nav .logo span { color: var(--vert); }
nav .nav-links { display: flex; align-items: center; flex-wrap: wrap; justify-content: flex-end; }
nav .nav-links a { color: var(--ink-soft); text-decoration: none; font-size: 14.5px; font-weight: 500; margin-left: 8px; }
nav .nav-links a:hover { color: var(--ink); }
.nav-btn-texte-courte { display: none; }
.nav-burger { display: none; background: none; border: none; color: var(--ink); line-height: 1; cursor: pointer; padding: 4px 6px; }
.nav-burger svg { width: 26px; height: 26px; display: block; }
.nav-burger .ico-fermer { display: none; }
.nav-burger.nav-burger-ouvert .ico-burger { display: none; }
.nav-burger.nav-burger-ouvert .ico-fermer { display: block; }
.confirmation-banniere { margin: 24px auto 0; max-width: 1400px; }
@media (max-width: 480px) {
  nav { position: relative; backdrop-filter: none; -webkit-backdrop-filter: none; background: #fff; }
  .nav-inner { padding: 14px 18px; gap: 8px; flex-wrap: nowrap; }
  nav .logo { font-size: 23px; }
  .nav-burger { display: block; position: relative; z-index: 1400; }
  nav .nav-links {
    /* Pas de width:100% ici (retire aout 2026, audit) : "inset: 0" fixe deja les bords
       gauche et droit. Le width:100% se calculait sur la largeur DEFILABLE du document,
       pas sur celle de l'ecran -- des qu'un autre element debordait ne serait-ce que de
       quelques pixels, le menu s'elargissait d'autant et entretenait le debordement. */
    display: flex; position: fixed; inset: 0; flex-direction: column; align-items: stretch; justify-content: flex-start;
    background: #fff; padding: 84px 22px 28px; gap: 6px; height: 100dvh; margin-top: 0; box-shadow: none;
    opacity: 0; visibility: hidden; overflow-y: auto; pointer-events: none;
    transition: opacity .2s ease, visibility 0s linear .2s;
  }
  nav .nav-links.nav-links-ouvert { opacity: 1; visibility: visible; pointer-events: auto; transition: opacity .2s ease; }
  /* Selecteurs plus specifiques que .nav-btn / .nav-btn-secondary (definis plus bas avec
     !important) : le menu mobile reste une liste d'aplats simples, quel que soit l'ordre
     des regles dans le fichier. */
  nav .nav-links a,
  nav .nav-links a.nav-btn,
  nav .nav-links a.nav-btn-secondary {
    margin-left: 0 !important; font-family: var(--font-titre); font-size: 19px !important; font-weight: 600 !important; text-align: left; white-space: normal;
    padding: 18px 20px !important; background: var(--paper) !important; border: none !important; border-radius: var(--radius-md) !important; color: var(--ink) !important;
  }
  nav .nav-links a.nav-btn { background: var(--vert) !important; color: #fff !important; }
  .nav-btn-texte-longue { display: inline; }
  .nav-btn-texte-courte { display: none; }
  body.menu-mobile-ouvert { overflow: hidden; }
}

/* ---------- HERO : panneau sombre arrondi, gros titre tres serre ----------
   C'est le geste le plus fort de cette version : un bloc presque noir pose
   dans la page blanche. Aucun degrade -- un aplat franc. */
/* Bandeau d'accueil — septembre 2026.
   Le noir pur sur 104px + 108px de marge interne occupait presque tout le premier ecran
   et tapait dur a l'oeil. Deux corrections : un vert profond de marque a la place du noir
   (meme lisibilite, beaucoup moins frontal, et ca rattache le bandeau a l'identite du
   site au lieu de flotter dans un noir neutre), et une hauteur reduite d'environ 40 % --
   le titre et la recherche restent au-dessus de la ligne de flottaison, mais la grille
   des categories apparait desormais sans avoir a faire defiler. */
.hero { background: linear-gradient(165deg, #0E4630 0%, #0B2C1E 62%, #082217 100%); border-radius: var(--radius-xl); padding: 62px 40px 66px; text-align: center; color: #fff; max-width: 1400px; margin: 20px auto 0; }
.hero h1 { font-family: var(--font-titre); font-size: 60px; font-weight: 800; letter-spacing: -.05em; margin: 0 auto 18px; line-height: 1; max-width: 18ch; color: #fff; }
.hero h1 span { color: var(--emerald-500, #21C58A); }
.hero p { color: rgba(255,255,255,.72); font-size: 18px; margin: 0 auto; max-width: 52ch; line-height: 1.5; }
.hero .search, .search-page { max-width: 560px; margin: 24px auto 0; position: relative; }
.hero .search input { width: 100%; padding: 17px 22px 17px 48px; border-radius: var(--radius-pill); border: none; font-size: 15.5px; background: #fff; color: var(--ink); box-shadow: none; font-family: inherit; }
.search-page input { width: 100%; padding: 14px 18px; border-radius: var(--radius-md); border: none; background: var(--paper); font-size: 15px; color: var(--ink); margin: 12px 0; font-family: inherit; }
.hero .search input:focus, .search-page input:focus { outline: 2px solid var(--vert); outline-offset: 1px; }
.hero .search-icon { position: absolute; left: 18px; top: 50%; transform: translateY(-50%); font-size: 16px; color: var(--ink-faint); }
.resultats-count { color: var(--ink-faint); font-size: 14px; margin-bottom: 12px; }

/* En-tete de page categorie : aplat teinte de la couleur de la categorie. */
.type-hero { border-radius: var(--radius-lg); padding: 40px 36px 36px; margin-bottom: 30px; color: var(--ink); position: relative; background: var(--cat-voile); border: none; }
.type-hero h1 { color: var(--ink); margin-bottom: 10px; font-size: 46px; letter-spacing: -.045em; line-height: 1; }
.type-hero .type-intro-seo { color: var(--ink-soft); margin-bottom: 0; }
.type-hero .btn-retour-rond { background: #fff; color: var(--ink); border: none; }
.type-hero .btn-retour-rond:hover { background: var(--ink); color: #fff; }

.section { max-width: 1400px; margin: 64px auto; padding: 0 24px; }
.section h1 { font-size: 46px; font-weight: 800; letter-spacing: -.045em; margin-bottom: 18px; line-height: 1.02; }
.section h2 { font-size: 30px; font-weight: 700; letter-spacing: -.035em; margin-bottom: 18px; line-height: 1.1; }
.section h3 { font-family: var(--font); font-size: 12.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .09em; color: var(--ink-faint); margin: 26px 0 10px; }
/* flex-wrap (aout 2026, audit) : sans lui, un titre long + un bouton en white-space:nowrap
   (ex. "Communauté" + "Voir l'actualité") depassaient la largeur de l'ecran sur mobile et
   creaient un defilement horizontal parasite sur tout le site. Le bouton passe desormais a
   la ligne au lieu de pousser hors cadre. min-width:0 autorise le titre a se reduire. */
.section-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 24px; gap: 16px; flex-wrap: wrap; }
.section-header > :first-child { min-width: 0; }
.section-title { font-family: var(--font-titre); font-size: 24px; font-weight: 700; color: var(--ink); letter-spacing: -.03em; }

/* Mentions legales / confidentialite */
.page-legale { max-width: 760px; background: var(--paper); border: none; box-shadow: none; border-radius: var(--radius-lg); padding: 52px 54px 56px; }
.page-legale h1 { font-size: 40px; font-weight: 800; margin-bottom: 6px; letter-spacing: -.045em; }
.page-legale-date { font-size: 13px; color: var(--ink-faint); margin: 0 0 34px; }
.page-legale h3 { font-family: var(--font-titre); font-size: 20px; font-weight: 700; text-transform: none; letter-spacing: -.03em; color: var(--ink); margin: 36px 0 12px; padding-top: 0; border-top: none; }
.page-legale h3:first-of-type { margin-top: 0; }
.page-legale p { font-size: 15.5px; line-height: 1.75; color: var(--ink-soft); margin: 0 0 16px; }
.page-legale p:last-child { margin-bottom: 0; }
.page-legale strong { color: var(--ink); font-weight: 600; }
.page-legale a { color: var(--vert-fonce); text-decoration: underline; text-underline-offset: 2px; }
.page-legale a:hover { color: var(--ink); }
@media (max-width: 600px) { .page-legale { padding: 30px 22px 34px; } }

.fil-ariane { font-size: 13.5px; color: var(--ink-faint); margin-bottom: 16px; }
.fil-ariane a { color: var(--ink-soft); text-decoration: none; font-weight: 500; }
.fil-ariane a:hover { color: var(--ink); }

/* ---------- ANNUAIRE : blocs categorie en aplat, pastilles colorees ---------- */
#annuaire .search-page { margin: 16px 0 0; }
.cat-blocks-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; margin: 30px 0 36px; }
.cat-block { background: var(--paper); border: none; box-shadow: none; border-radius: var(--radius-lg); padding: 26px 24px; margin-bottom: 0; }
.cat-block h3 { margin: 0 0 16px; font-size: 11.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .1em; color: var(--ink-faint); }
.soustype-list { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 0; }
/* Chaque pastille porte la couleur de sa categorie (variable --cat posee par le serveur). */
.soustype-pill { display: inline-block; padding: 9px 16px; background: #fff; border: none; border-radius: var(--radius-pill); font-size: 14px; font-weight: 600; text-decoration: none; color: var(--ink); transition: background .14s, color .14s; }
.soustype-pill:hover { background: var(--cat); color: #fff; transform: none; }

/* ---------- CARTES : aplats pleins, sans bordure ni ombre ---------- */
.une-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 20px; }
.une-card { display: block; background: var(--paper); border-radius: var(--radius-lg); border: none; box-shadow: none; text-decoration: none; color: var(--ink); overflow: hidden; transition: transform .16s ease, box-shadow .16s ease; }
.une-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-hover); }
.une-card-contenu { padding: 24px 24px 26px; position: relative; }
/* Dore, et non plus la couleur de la categorie : les Decouvertes sont une mise en avant
   exceptionnelle, elles doivent se distinguer des cartes ordinaires de l'annuaire. Texte
   sombre sur fond dore -- du blanc sur ce jaune ne passe pas le contraste minimum. */
.une-card .type-small { display: inline-block; font-size: 10.5px; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: #3D2A00; background: var(--gold-600, #F5A524); padding: 5px 11px; border-radius: var(--radius-pill); margin-bottom: 14px; }
.une-card .nom { font-family: var(--font-titre); font-size: 24px; font-weight: 700; letter-spacing: -.038em; margin-bottom: 8px; line-height: 1.1; }
.une-card .desc { font-size: 14.5px; color: var(--ink-soft); line-height: 1.55; }
.une-card-avec-photo img { display: block; width: 100%; height: 200px; object-fit: cover; }
/* Emplacement "A la une" non vendu : visible mais neutre, pour montrer la place libre. */
.une-card-vide { background: none; border: 2px dashed var(--line-fort); display: flex; align-items: center; justify-content: center; min-height: 190px; }
.une-card-vide:hover { transform: none; box-shadow: none; border-color: var(--vert); }

.lieux-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 14px; margin-top: 20px; }
.lieu-card { display: block; background: var(--paper); border-radius: var(--radius-md); padding: 20px 22px; border: none; box-shadow: none; text-decoration: none; color: var(--ink); transition: background .14s, transform .16s ease; }
.lieu-card:hover { background: var(--paper-2); transform: translateY(-2px); box-shadow: none; }
.lieu-card .nom { font-family: var(--font-titre); font-size: 18px; font-weight: 700; margin-bottom: 5px; letter-spacing: -.03em; }
.lieu-card .adresse { font-size: 14px; color: var(--ink-soft); margin-bottom: 3px; }
.lieu-card .ville { font-size: 13px; color: var(--ink-faint); font-weight: 500; }

.lieu-card-enseigne { background: var(--vert-clair); }
.lieu-card-enseigne .badge-enseigne { display: inline-block; font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .08em; color: #fff; background: var(--vert); border: none; border-radius: var(--radius-pill); padding: 4px 10px; margin-bottom: 8px; }
.badge-annonce { display: inline-block; font-size: 11px; font-weight: 600; color: #fff; background: var(--ink); border: none; border-radius: var(--radius-pill); padding: 5px 11px; }
.badge-fiche-pro-lock { display: inline-block; font-size: 11px; font-weight: 600; color: var(--ink-faint); background: var(--paper); border: none; border-radius: var(--radius-pill); padding: 5px 11px; vertical-align: middle; margin-left: 6px; }
.bloc-fiche-pro-verrouille { background: var(--paper); border: none; border-radius: var(--radius-md); padding: 6px 18px 18px; margin-top: 16px; }
.bloc-fiche-pro-verrouille .aide-champ { margin-top: 6px; }
.bloc-fiche-pro-verrouille a { color: var(--vert-fonce); font-weight: 600; }

.fiche-enseigne .nb-adresses-enseigne { color: var(--ink-soft); font-size: 14.5px; margin: 8px 0 20px; }
.filtre-ville-enseigne-bloc { margin-bottom: 20px; }
.filtre-ville-enseigne-bloc label { font-size: 13.5px; color: var(--ink-soft); margin-right: 8px; }
.filtre-ville-enseigne-bloc select { padding: 10px 14px; border-radius: var(--radius-sm); border: none; background: var(--paper); font-family: inherit; }
.branches-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 14px; }
.branche-card { background: var(--paper); border: none; box-shadow: none; border-radius: var(--radius-md); padding: 20px 22px; }
.branche-card .nom a { font-family: var(--font-titre); font-size: 17px; font-weight: 700; color: var(--ink); text-decoration: none; letter-spacing: -.03em; }
.branche-card .nom a:hover { color: var(--vert-fonce); }
.branche-card .adresse { font-size: 14px; color: var(--ink-soft); margin-top: 5px; }
.branche-card .ville { font-size: 13px; color: var(--ink-faint); font-weight: 500; margin-top: 3px; }
.branche-card .tel { font-size: 14px; margin-top: 5px; }
.branche-card .lien-itineraire-branche { display: inline-block; font-size: 13.5px; margin-top: 12px; color: var(--vert-fonce); text-decoration: none; font-weight: 600; }
.branche-card .lien-itineraire-branche:hover { text-decoration: underline; }

.lien-autres-adresses { margin-top: 14px; }
.lien-autres-adresses a { color: var(--vert-fonce); font-weight: 600; text-decoration: none; }
.lien-autres-adresses a:hover { text-decoration: underline; }

/* ---------- FICHE ETABLISSEMENT ---------- */
.type-badge { display: inline-block; padding: 6px 13px; border-radius: var(--radius-pill); font-size: 12px; font-weight: 600; background: var(--cat); color: #fff; margin: 6px 0; }
.reco-badge { display: inline-block; margin-left: 8px; font-size: 12px; font-weight: 600; background: var(--ambre); color: #3D2A00; padding: 6px 12px; border-radius: var(--radius-pill); }
.description-avant { background: var(--cat-voile); border-radius: var(--radius-lg); padding: 26px 28px; margin: 6px 0 26px; }
.fiche-lieu .description-avant .description { background: none; border: none; box-shadow: none; border-radius: 0; padding: 0; margin: 0; line-height: 1.7; color: var(--ink); font-size: 17.5px; font-weight: 500; max-width: 62ch; }
.description-avant .description-longue { margin: 16px 0 0; }
.fiche-lieu-badges { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin: 14px 0 24px; }
.fiche-lieu-badges .type-badge { margin: 0; }
.alerte-alcool { display: inline-block; font-size: 13.5px; font-weight: 500; color: var(--amber-ink); background: var(--amber-bg); border: none; border-radius: var(--radius-md); padding: 12px 18px; margin: 0 0 20px; }
.info-certification-halal { display: inline-block; font-size: 13.5px; font-weight: 500; color: var(--vert-fonce); background: var(--vert-clair); border: none; border-radius: var(--radius-md); padding: 11px 17px; margin: 0 0 20px; }
/* Certification halal non renseignee (aout 2026, audit). Volontairement NEUTRE, ni vert
   (qui vaudrait validation) ni ambre (qui vaudrait alerte sur l'etablissement) : ce n'est
   pas un reproche au commerce, c'est une information manquante chez nous. Un gris franc,
   lisible, qui se distingue clairement du badge vert "Certifie halal". */
.info-halal-inconnue { display: block; max-width: 640px; font-size: 13.5px; line-height: 1.55; font-weight: 500; color: var(--ink-soft); background: var(--paper); border-left: 3px solid var(--line-fort); border-radius: var(--radius-md); padding: 12px 18px; margin: 0 0 20px; }
.bloc-horaires { margin: 26px 0; padding: 24px 26px; background: var(--paper); border-radius: var(--radius-lg); box-shadow: none; }
.bloc-horaires h3 { font-family: var(--font); font-size: 11.5px; text-transform: uppercase; letter-spacing: .09em; color: var(--ink-faint); margin: 0 0 12px; }
.horaire-ligne { display: flex; justify-content: space-between; gap: 12px; padding: 9px 0; font-size: 14.5px; border-bottom: 1px solid var(--line); }
.horaire-ligne:last-child { border-bottom: none; }
.horaire-ligne span:first-child { font-weight: 500; color: var(--ink-soft); }
.grille-horaires { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 10px 16px; margin: 8px 0 4px; }
.grille-horaires label { font-size: 13px; font-weight: 500; color: var(--ink-soft); }
.grille-horaires input, .grille-horaires select { margin-top: 4px; }
.horaire-iqama { font-size: 12.5px; color: var(--ink-faint); font-weight: 400; }
.horaire-note-calcul { margin: 14px 0 0; font-size: 12px; color: var(--ink-faint); line-height: 1.5; }
.horaire-mawaqit { margin: 8px 0 0; font-size: 13.5px; }
.horaire-mawaqit a { font-weight: 600; }
.badge-partenaire { display: inline-flex; align-items: center; margin-left: 8px; font-size: 12px; background: var(--gold-600); color: #3D2A00; padding: 6px 13px; border-radius: var(--radius-pill); font-weight: 600; border: none; }
.badge-priorite { display: inline-block; font-size: 11px; font-weight: 600; color: #3D2A00; background: var(--gold-500); border: none; border-radius: var(--radius-pill); padding: 5px 11px; white-space: nowrap; }
.fiche-lieu-reseaux { display: flex; gap: 8px; flex-wrap: wrap; margin: 4px 0 24px; }
.reseau-lien { display: inline-block; padding: 10px 18px; border-radius: var(--radius-pill); font-size: 13.5px; font-weight: 600; text-decoration: none; background: var(--paper); border: none; color: var(--ink); }
.reseau-lien:hover { background: var(--ink); color: #fff; }
.description-longue { background: var(--paper); border: none; border-left: none; box-shadow: none; border-radius: var(--radius-lg); padding: 26px 28px; margin: 0 0 28px; line-height: 1.75; color: var(--ink-soft); font-size: 16px; max-width: none; }
.lieu-photo-principale { position: relative; margin-bottom: 24px; border-radius: var(--radius-lg); overflow: hidden; box-shadow: none; border: none; cursor: zoom-in; }
/* height (pas max-height) : audit QA aout 2026 -- sans hauteur reservee, l'<img loading="lazy">
   occupe une boite de 0px avant chargement et le navigateur ne declenche jamais son
   chargement/affichage sur une fiche reelle (repro constatee sur Chrome desktop, photo
   jamais visible meme apres plusieurs minutes). Meme cause que sur .une-card-avec-photo img,
   qui a une hauteur fixe et ne presente pas ce probleme. */
.lieu-photo-principale img { display: block; width: 100%; height: 380px; object-fit: cover; }
/* Septembre 2026 : les photos au-dela de la couverture ne sont plus affichees en ligne
   (elles faisaient deborder la colonne photos par rapport a la colonne carte a cote) --
   seule cette pastille indique qu'il y en a d'autres, accessibles via la visionneuse. */
.lieu-photo-compteur { position: absolute; right: 14px; bottom: 14px; background: rgba(11, 11, 16, .72); color: #fff; font-size: 13px; font-weight: 600; padding: 6px 12px; border-radius: var(--radius-pill); pointer-events: none; }
.fiche-lieu-infos { background: var(--paper); border: none; box-shadow: none; border-radius: var(--radius-lg); padding: 6px 24px; margin-bottom: 24px; }
.info-ligne { display: flex; align-items: center; gap: 16px; padding: 17px 0; border-bottom: 1px solid var(--line); }
.info-ligne:last-child { border-bottom: none; }
.info-icone { width: 38px; height: 38px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; background: #fff; border-radius: var(--radius-sm); color: var(--cat); }
.ico { width: 17px; height: 17px; display: block; }
.btn-itineraire .ico { width: 14px; height: 14px; }
.branche-card .tel .ico { width: 14px; height: 14px; display: inline-block; vertical-align: -2px; color: var(--ink-faint); }
.info-texte { flex: 1; font-size: 15.5px; color: var(--ink); }
.info-lien { color: var(--ink); text-decoration: none; font-weight: 500; }
.info-lien:hover { color: var(--vert-fonce); text-decoration: underline; }
.info-ligne .btn-itineraire { flex-shrink: 0; }
.btn-itineraire { display: inline-flex; align-items: center; gap: 7px; background: var(--ink); color: #fff; border: none; text-decoration: none; font-size: 13.5px; font-weight: 600; padding: 11px 18px; border-radius: var(--radius-pill); white-space: nowrap; }
.btn-itineraire:hover { background: var(--vert); }
#mini-map { height: 380px; border-radius: var(--radius-lg); margin-top: 18px; box-shadow: none; border: none; overflow: hidden; }
#carte-globale { height: 560px; border-radius: var(--radius-lg); margin-top: 36px; box-shadow: none; border: none; position: relative; overflow: hidden; z-index: 1; }

.pagination { display: flex; gap: 20px; align-items: center; margin-top: 26px; font-size: 14.5px; }
.pagination a { color: var(--vert-fonce); text-decoration: none; font-weight: 600; }
.pagination a:hover { text-decoration: underline; }

/* CTA COMMERCANTS — note discrete en pied de page. */
.cta-box { background: var(--paper); border: none; border-top: none; border-radius: var(--radius-lg); padding: 32px 34px; text-align: left; color: var(--ink); }
.cta-box h2 { font-family: var(--font-titre); font-size: 24px; font-weight: 700; margin-bottom: 8px; letter-spacing: -.03em; }
.cta-box h3 { font-family: var(--font); font-size: 11.5px; font-weight: 600; color: var(--ink-faint); margin: 0 0 8px; padding-top: 0; border-top: none; text-transform: uppercase; letter-spacing: .09em; }
.cta-box p { color: var(--ink-soft); font-size: 15px; margin-bottom: 20px; max-width: 56ch; margin-left: 0; margin-right: 0; line-height: 1.6; }
.cta-btn { display: inline-block; padding: 14px 28px; background: var(--vert); color: #fff; border: none; border-radius: var(--radius-pill); font-size: 15px; font-weight: 600; text-decoration: none; }
.cta-btn:hover { background: var(--vert-fonce); }

.contact-hub-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 18px; max-width: 940px; margin: 36px auto 0; text-align: left; border-top: none; }
.contact-hub-card { position: relative; overflow: hidden; background: var(--paper); border: none; border-radius: var(--radius-lg); padding: 34px 32px; box-shadow: none; display: flex; flex-direction: column; transition: transform .16s ease, box-shadow .16s ease; }
.contact-hub-card::before { content: none; }
.contact-hub-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-hover); }
.contact-hub-card .type-badge { align-self: flex-start; margin: 0 0 16px; background: var(--vert); color: #fff; }
.contact-hub-card-organisme .type-badge { background: var(--violet); }
.contact-hub-card h2 { font-size: 25px; font-weight: 700; margin: 0 0 12px; color: var(--ink); line-height: 1.15; letter-spacing: -.035em; }
.contact-hub-card p { font-size: 15.5px; color: var(--ink-soft); line-height: 1.6; margin-bottom: 26px; flex-grow: 1; }
/* Le bouton heritait de .btn-lien { white-space: nowrap } : dans une carte etroite, un
   libelle long ("Demander a figurer dans les Decouvertes") depassait le cadre et se faisait
   couper par l'overflow: hidden de la carte -- le texte devenait illisible. Le bouton prend
   desormais toute la largeur de la carte et le libelle peut passer a la ligne. */
.contact-hub-card .btn-lien { align-self: stretch; justify-content: center; text-align: center; white-space: normal; }
.contact-hub-lien { font-size: 15px; font-weight: 600; color: var(--vert-fonce); text-decoration: none; }
.contact-hub-lien:hover { text-decoration: underline; }

/* Barre d'actions de l'onglet "Voir ma fiche" (espace etablissement) : deplacee juste
   sous les badges, avant photo/description, pour ne plus ressembler a des boutons
   d'action rattaches au paragraphe de description qui les precedait auparavant. */
.apercu-fiche-actions { padding-bottom: 20px; border-bottom: 1px solid var(--line); }

/* Bouton secondaire generique. Meme correctif que .choix-cible-option juste au-dessus :
   fond blanc + bordure plutot que "background: var(--paper)" sur fond deja --paper. */
.btn-lien { display: inline-flex; align-items: center; font-size: 14.5px; font-weight: 600; color: var(--ink); background: #fff; border: 1.5px solid var(--line-fort); padding: 11px 21px; border-radius: var(--radius-pill); text-decoration: none; white-space: nowrap; transition: background .14s, color .14s, border-color .14s; }
.btn-lien:hover { background: var(--ink); color: #fff; }
.type-badge-bleu { background: var(--violet); color: #fff; }
.type-badge-or { background: var(--gold-600, #F5A524); color: #3D2A00; }
/* Plus specifique que la regle generique .contact-hub-card .type-badge, qui sinon
   repasserait ce badge en vert. */
.contact-hub-card .type-badge-or { background: var(--gold-600, #F5A524); color: #3D2A00; }

/* ---------- FORMULAIRES ---------- */
/* background #fff + bordure (et non "background: var(--paper)" + "border: none" comme
   avant) : ce bouton s'affiche presque toujours a l'interieur d'un panneau deja colore en
   --paper (.admin-panel, .espace-entree-col...) et devenait invisible, absorbe dans le fond --
   ne restait visible que son texte en gras, sans aucun repere de bouton. */
.choix-cible-option { display: inline-flex; align-items: center; gap: 8px; padding: 13px 21px; background: #fff; border: 1.5px solid var(--line-fort); border-radius: var(--radius-md); font-size: 15px; font-weight: 600; color: var(--ink); cursor: pointer; text-decoration: none; transition: background .14s, border-color .14s; }
.choix-cible-option:hover { background: var(--paper-2); }
.choix-cible-option:has(input:checked) { border-color: var(--vert); background: var(--vert-clair); color: var(--vert-fonce); }
/* Variante pour une action destructrice (ex : suppression de compte) -- meme forme que
   .choix-cible-option pour rester coherent visuellement, mais couleur --danger pour signaler
   clairement qu'il ne s'agit pas d'une action anodine comme "Changer mon mot de passe". */
.choix-cible-option-danger { display: inline-flex; align-items: center; gap: 8px; padding: 13px 21px; background: #fff; border: 1.5px solid var(--danger); border-radius: var(--radius-md); font-size: 15px; font-weight: 600; color: var(--danger); cursor: pointer; text-decoration: none; transition: background .14s, border-color .14s; }
.choix-cible-option-danger:hover { background: var(--danger-bg); }

/* Suggestions d'autocompletion (sept. 2026, voir le script dans page()) : une rangee de
   boutons juste sous le champ concerne, dans le flux normal du formulaire -- pas une liste
   flottante superposee, pour eviter tout probleme de positionnement selon le formulaire. Vide
   par defaut (:empty), elle ne prend donc aucune place tant que rien n'a ete tape. */
/* Liste de suggestions (nom d'etablissement / adresse) : un vrai menu deroulant compact,
   classees par pertinence (le meilleur resultat en premier), pas une rangee de gros boutons
   pill verts -- ".form-commercant button" ciblait par erreur ces boutons generes en JS et
   leur donnait le style du bouton d'envoi du formulaire (sept. 2026). */
.autocomplete-resultats { display: flex; flex-direction: column; margin-top: 2px; margin-bottom: 4px; background: #fff; border: 1.5px solid var(--line-fort); border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-hover, 0 8px 20px -12px rgba(11,44,30,.25)); }
.autocomplete-resultats:empty { display: none; border: none; box-shadow: none; }
.form-commercant .autocomplete-resultats button.autocomplete-option,
button.autocomplete-option {
  display: block; width: 100%; margin-top: 0; padding: 10px 14px; background: #fff; color: var(--ink);
  border: none; border-top: 1px solid var(--line); border-radius: 0; font-size: 13.5px; font-weight: 500;
  font-family: inherit; line-height: 1.4; cursor: pointer; text-align: left; transition: background .12s;
}
.autocomplete-resultats button.autocomplete-option:first-child { border-top: none; }
.form-commercant .autocomplete-resultats button.autocomplete-option:hover,
button.autocomplete-option:hover { background: var(--paper-2); }

.type-etablissement-option { display: flex; align-items: flex-start; gap: 10px; padding: 14px 18px; background: var(--paper); border: 2px solid transparent; border-radius: var(--radius-md); font-size: 15px; font-weight: 500; color: var(--ink); cursor: pointer; margin-bottom: 8px; }
.type-etablissement-option:has(input:checked) { border-color: var(--vert); background: var(--vert-clair); color: var(--vert-fonce); }
.type-etablissement-option input { margin-top: 3px; }
.aide-champ-inline { display: block; font-weight: 400; font-size: 12.5px; color: var(--ink-faint); margin-top: 3px; }
.bloc-deja-ref-non { margin-top: 8px; padding: 20px 22px; background: var(--paper); border: none; border-radius: var(--radius-md); }
.bloc-deja-ref-non p { font-size: 14.5px; color: var(--ink-soft); margin-bottom: 14px; }

.form-commercant { display: flex; flex-direction: column; gap: 18px; max-width: 560px; margin: 26px auto 0; text-align: left; }
.form-commercant label { display: flex; flex-direction: column; gap: 8px; font-size: 14px; font-weight: 600; color: var(--ink); }
/* border : var(--line-fort) et non "none" -- ces champs partagent la meme couleur de fond
   (--paper) que les panneaux qui les contiennent (.admin-panel notamment) et disparaissaient
   litteralement dedans, sans aucun moyen de reperer les limites d'un champ. Le filet resout
   ca quel que soit le fond derriere (panneau gris ou page blanche). */
.form-commercant input, .form-commercant textarea, .form-commercant select { padding: 13px 15px; border: 1.5px solid var(--line-fort); border-radius: var(--radius-md); font-size: 15px; font-family: inherit; background: var(--paper); color: var(--ink); font-weight: 400; }
.form-commercant input:focus, .form-commercant textarea:focus, .form-commercant select:focus { outline: 2px solid var(--vert); outline-offset: 1px; }
.form-commercant button { margin-top: 30px; padding: 16px; background: var(--vert); color: #fff; border: none; border-radius: var(--radius-pill); font-size: 15.5px; font-weight: 600; font-family: inherit; cursor: pointer; transition: background .14s; }
.form-commercant button:hover { background: var(--vert-fonce); }
/* Variante rouge pleine (aout 2026) : meme gabarit que .form-commercant button (pill,
   padding, poids de police) mais couleur --danger -- utilisee uniquement pour une action
   destructive finale et irreversible (ex. suppression de compte), la ou .choix-cible-option-danger
   (contour, plus discret) sert d'entree vers cette action. */
.form-commercant .btn-danger-plein { background: var(--danger); }
.form-commercant .btn-danger-plein:hover { background: var(--danger-fonce); }
.form-erreur { color: var(--danger); background: var(--danger-bg); border: none; padding: 14px 18px; border-radius: var(--radius-md); margin-bottom: 16px; font-size: 14.5px; }
.form-avertissement { color: var(--amber-ink); background: var(--amber-bg); border: none; padding: 14px 18px; border-radius: var(--radius-md); margin-bottom: 16px; text-align: left; font-size: 14.5px; }
.form-avertissement p { margin: 2px 0; }
.champ-piege { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; opacity: 0; }

/* ---------- PIED DE PAGE : panneau sombre arrondi, en echo du hero ---------- */
footer { flex-shrink: 0; background: var(--noir); color: #8E8EA3; padding: 40px 34px; margin: 64px auto 20px; max-width: 1400px; width: calc(100% - 40px); border-radius: var(--radius-xl); font-size: 13px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 18px; }
.footer-copyright { margin: 0; font-size: 13px; color: #6E6E82; }
.footer-links { display: flex; flex-wrap: wrap; justify-content: center; gap: 22px; margin: 0; }
.footer-links a { color: #C4C4D4; text-decoration: none; font-size: 13.5px; font-weight: 500; }
.footer-links a:hover { color: var(--vert); }
.footer-social { display: flex; align-items: center; justify-content: flex-end; gap: 14px; margin: 0; }
.footer-social-label { font-size: 13px; color: #6E6E82; }
.footer-social a { color: #C4C4D4; display: inline-flex; }
.footer-social a:hover { color: var(--vert); }
@media (max-width: 640px) {
  footer { justify-content: center; text-align: center; padding: 32px 22px; }
  .footer-social { justify-content: center; }
}

/* Galerie et lightbox photos */
.article-images-galerie { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 14px; margin-top: 24px; }
.article-images-galerie img { width: 100%; height: 190px; object-fit: cover; border-radius: var(--radius-md); cursor: zoom-in; transition: opacity .15s; }
.article-images-galerie img:hover { opacity: .85; }
.lightbox-article { position: fixed; inset: 0; background: rgba(11, 11, 16, .96); z-index: 2000; display: flex; align-items: center; justify-content: center; padding: 60px 20px 20px; }
.lightbox-article[hidden] { display: none; }
.lightbox-article img { max-width: 100%; max-height: 100%; border-radius: var(--radius-md); box-shadow: var(--shadow-lg); cursor: default; }
.lightbox-retour { position: fixed; top: 18px; left: 18px; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; background: #fff; color: var(--ink); border: none; border-radius: 50%; font-weight: 600; font-size: 19px; line-height: 1; cursor: pointer; z-index: 2001; box-shadow: none; }
.lightbox-retour:hover { background: var(--vert); color: #fff; }
.lightbox-nav { position: fixed; top: 50%; transform: translateY(-50%); width: 48px; height: 48px; display: flex; align-items: center; justify-content: center; background: #fff; color: var(--ink); border: none; border-radius: 50%; font-weight: 600; font-size: 24px; line-height: 1; cursor: pointer; z-index: 2001; box-shadow: none; }
.lightbox-nav:hover { background: var(--vert); color: #fff; }
.lightbox-nav-prec { left: 18px; }
.lightbox-nav-suiv { right: 18px; }
.lightbox-compteur { position: fixed; bottom: 22px; left: 50%; transform: translateX(-50%); color: #fff; font-size: 13.5px; font-weight: 600; background: rgba(255, 255, 255, .15); padding: 6px 14px; border-radius: var(--radius-pill); z-index: 2001; }
@media (max-width: 480px) { .lightbox-nav { width: 40px; height: 40px; font-size: 20px; } .lightbox-nav-prec { left: 8px; } .lightbox-nav-suiv { right: 8px; } }
/* display: flex (et non inline-flex) : garde ce bouton colle a gauche meme dans un
   conteneur centre au texte (.form-section) -- bug recurrent de la fleche recentree. */
.btn-retour-rond { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; background: var(--paper); border: none; color: var(--ink); text-decoration: none; font-size: 17px; font-weight: 600; margin-bottom: 16px; transition: background .14s, color .14s; }
.btn-retour-rond:hover { background: var(--ink); color: #fff; }
@media (max-width: 480px) { .lightbox-retour { top: 10px; left: 10px; width: 40px; height: 40px; } }
.images-existantes-admin { margin: 10px 0; }
.images-existantes-admin p { font-size: 13px; color: var(--ink-soft); margin-bottom: 6px; }
.photo-couverture-bloc { margin: 10px 0 4px; }
.photo-couverture-label { font-size: 14px; font-weight: 600; color: var(--ink); margin-bottom: 8px; }
.photo-couverture-label .aide-champ-inline { display: block; font-size: 12.5px; font-weight: 400; color: var(--ink-faint); margin-top: 3px; }
.photo-couverture-existante { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; }
.photo-couverture-existante img { width: 110px; height: 110px; object-fit: cover; border-radius: var(--radius-md); border: 2px solid var(--vert); }
.miniatures-admin { display: flex; flex-wrap: wrap; gap: 10px; }
.miniature-admin { display: flex; flex-direction: column; align-items: center; gap: 4px; cursor: pointer; }
.miniature-admin-numero { font-size: 10.5px; font-weight: 600; color: #fff; background: var(--ink); border: none; padding: 3px 9px; border-radius: var(--radius-pill); }
.aide-champ { font-size: 13px; color: var(--ink-faint); line-height: 1.55; margin: -4px 0 4px; font-weight: 400; }
.aide-champ code { background: var(--paper); padding: 2px 7px; border-radius: 5px; font-size: 11.5px; }
.champ-requis { display: contents; color: var(--danger); font-weight: 600; }
.bloc-verif-telephone { background: var(--paper); border: none; border-radius: var(--radius-md); padding: 18px; margin: -4px 0 4px; display: flex; flex-direction: column; gap: 12px; }
.btn-verif-tel { align-self: flex-start; padding: 11px 20px; background: #fff; border: none; color: var(--vert-fonce); border-radius: var(--radius-pill); font-size: 14px; font-weight: 600; font-family: inherit; cursor: pointer; }
.btn-verif-tel:hover { background: var(--vert); color: #fff; }
.btn-verif-tel:disabled { opacity: 0.5; cursor: default; }
.bloc-verif-telephone .aide-champ { margin: 0; }
.legende-obligatoire { font-size: 12.5px; color: var(--ink-faint); margin: -6px 0 14px; }
.liste-fichiers-joints { list-style: none; padding: 0; margin: 8px 0 0; display: flex; flex-wrap: wrap; gap: 8px; }
.liste-fichiers-joints li { display: flex; align-items: center; gap: 6px; background: var(--paper); border: none; border-radius: var(--radius-pill); padding: 6px 8px 6px 14px; font-size: 12.5px; max-width: 220px; }
.liste-fichiers-joints li span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.liste-fichiers-joints li button { flex-shrink: 0; border: none; background: #fff; border-radius: 50%; width: 20px; height: 20px; line-height: 18px; cursor: pointer; font-size: 12px; color: var(--ink-faint); padding: 0; }
.liste-fichiers-joints li button:hover { background: var(--danger-bg); color: var(--danger); }
.miniature-admin img { width: 80px; height: 80px; object-fit: cover; border-radius: var(--radius-sm); border: none; }
.miniature-admin-supprimer { display: flex; align-items: center; gap: 4px; font-size: 11px; color: var(--danger); }
.miniature-admin:has(input:checked) img { opacity: .4; outline: 2px solid var(--danger); }

@media (max-width: 1000px) { .hero h1 { font-size: 48px; } }
@media (max-width: 768px) {
  .hero { padding: 48px 26px 52px; }
  .hero h1 { font-size: 40px; letter-spacing: -.045em; }
  .section h1 { font-size: 34px; }
  .type-hero h1 { font-size: 34px; }
}
@media (max-width: 480px) {
  .une-grid, .lieux-grid, .cat-blocks-row { grid-template-columns: 1fr; }
  .hero { padding: 38px 20px 42px; margin: 12px auto 0; border-radius: var(--radius-lg); }
  .hero h1 { font-size: 33px; }
  .hero p { font-size: 16px; }
  .section { padding: 0 18px; margin: 44px auto; }
  .cta-box, .intro-banner { padding: 24px 20px; }
  footer { border-radius: var(--radius-lg); }
}

/* ---------- ADMIN ---------- */
.admin-table { width: 100%; border-collapse: collapse; margin-top: 20px; background: var(--paper); border-radius: var(--radius-md); overflow: hidden; box-shadow: none; }
.admin-table th, .admin-table td { padding: 13px 15px; border-bottom: 1px solid var(--line); font-size: 13px; text-align: left; vertical-align: top; }
.admin-table th { background: none; font-weight: 600; color: var(--ink-faint); text-transform: uppercase; letter-spacing: .08em; font-size: 11px; }
.admin-table tr:last-child td { border-bottom: none; }
.admin-table tr.demande-traitee { opacity: .5; }
.form-marquer-inline { display: inline; margin: 0; }
.input-raison-blocage { width: 130px; padding: 7px 11px; font-size: 12px; border: none; background: #fff; border-radius: var(--radius-sm); margin-right: 6px; vertical-align: middle; font-family: inherit; }
.lien-marquer-traite { background: none; border: none; padding: 0; font: inherit; font-size: 12px; color: var(--vert-fonce); text-decoration: underline; cursor: pointer; white-space: nowrap; }
.lien-marquer-traite:hover { color: var(--ink); }
.lien-supprimer-demande { background: none; border: none; padding: 0; font: inherit; font-size: 12px; color: var(--danger); text-decoration: underline; cursor: pointer; white-space: nowrap; }
.lien-supprimer-demande:hover { color: #a5252a; }
.cellule-actions { display: flex; flex-direction: column; gap: 7px; align-items: flex-start; }
.lien-creer-fiche { font-size: 12px; font-weight: 600; color: var(--vert-fonce); text-decoration: underline; }
.lien-creer-fiche:hover { color: var(--ink); }
.lien-repondre-email { display: inline-block; font-size: 12px; font-weight: 600; color: #fff; background: var(--vert); padding: 7px 14px; border-radius: var(--radius-pill); text-decoration: none; white-space: nowrap; }
.lien-repondre-email:hover { background: var(--vert-fonce); }
.bloc-mise-en-avant { display: flex; flex-direction: column; gap: 5px; align-items: flex-start; }
.badge-en-avant { font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .07em; color: #3D2A00; background: var(--gold-500); border: none; padding: 4px 10px; border-radius: var(--radius-pill); }
.badge-certificat-expire { font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .07em; color: #fff; background: var(--danger); border: none; padding: 4px 10px; border-radius: var(--radius-pill); display: inline-block; }
.form-mise-en-avant-definir { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.form-mise-en-avant-definir input[type="date"] { font-size: 12px; padding: 6px 10px; border: none; background: #fff; border-radius: var(--radius-sm); font-family: inherit; }
.form-mise-en-avant-definir button { font-size: 12px; font-weight: 600; color: #3D2A00; background: var(--gold-500); border: none; padding: 7px 13px; border-radius: var(--radius-pill); cursor: pointer; white-space: nowrap; font-family: inherit; }
.form-mise-en-avant-definir button:hover { background: var(--gold-600); }
.demandes-traitees-details { margin-top: 12px; }

/* Cartes de demandes (admin, septembre 2026) : remplace les anciennes lignes de tableau
   .admin-table, trop denses (tout sur une seule ligne, actions "accepter/supprimer"
   melees au texte) pour permettre une vraie lecture. Chaque demande est une carte
   autonome, regroupee d'abord par type de demande (ajout, signalement, communaute...)
   puis en sous-groupe par categorie d'etablissement quand ca aide (regrouperDemandesParCategorie
   cote serveur ne cree un sous-groupe que s'il y a au moins 2 categories distinctes). */
.demande-groupe { margin-top: 22px; }
.demande-groupe:first-child { margin-top: 4px; }
.demande-groupe-titre { display: flex; align-items: center; gap: 9px; font-family: var(--font); font-size: 13px; font-weight: 600; color: var(--ink-soft); text-transform: uppercase; letter-spacing: .06em; margin: 0 0 12px; }
.demande-groupe-compte { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 6px; border-radius: var(--radius-pill); background: var(--paper); color: var(--ink-faint); font-size: 11px; font-weight: 700; letter-spacing: 0; text-transform: none; }
.demandes-grille { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 16px; }

.demande-carte { background: var(--paper); border-radius: var(--radius-lg); padding: 20px 22px; display: flex; flex-direction: column; gap: 10px; }
.demande-carte-traitee { opacity: .55; }
.demande-carte-traitee:hover { opacity: 1; }
.demande-carte-entete { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.demande-carte-date { font-size: 12px; color: var(--ink-faint); }

.demande-champs { display: flex; flex-direction: column; gap: 7px; }
.demande-champ { display: flex; flex-wrap: wrap; gap: 4px 8px; font-size: 14px; line-height: 1.45; }
.demande-champ-label { flex: 0 0 auto; font-size: 11.5px; font-weight: 600; color: var(--ink-faint); text-transform: uppercase; letter-spacing: .05em; padding-top: 2px; }
.demande-champ-valeur { color: var(--ink); font-weight: 500; }
.demande-champ-valeur a { color: var(--vert-fonce); }

.demande-description { font-size: 13.5px; color: var(--ink-soft); line-height: 1.55; margin: 2px 0 0; background: #fff; border-radius: var(--radius-sm); padding: 10px 13px; }
.demande-pieces { font-size: 12.5px; margin: 0; }
.demande-pieces a { color: var(--vert-fonce); font-weight: 600; text-decoration: none; }
.demande-pieces a:hover { text-decoration: underline; }
.demande-mentions { font-size: 12.5px; color: var(--ink-faint); margin: 0; display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }

.demande-carte-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; margin-top: 4px; padding-top: 12px; border-top: 1px solid var(--line); }
/* Action principale (verifier/publier) : seule mise en avant visuellement, c'est
   l'action que l'admin doit faire dans l'immense majorite des cas. */
.demande-carte-actions .lien-creer-fiche { display: inline-block; font-size: 13px; font-weight: 600; color: #fff; background: var(--vert); padding: 9px 16px; border-radius: var(--radius-pill); text-decoration: none; }
.demande-carte-actions .lien-creer-fiche:hover { background: var(--vert-fonce); }
.demande-carte-actions .lien-repondre-email { padding: 9px 16px; }
/* Marquer traite / supprimer : actions secondaires, delibnerement plus discretes et
   separees a droite pour eviter un clic accidentel sur "supprimer" juste apres "accepter". */
.demande-carte-actions { gap: 8px; }
/* La suppression est repoussee a droite : c'est la seule action irreversible de la
   carte, elle ne doit pas se trouver sous le pouce a cote de « valider ». */
.demande-carte-actions form[action$="/supprimer"] { margin-left: auto; }

.demande-recap { background: var(--vert-clair); color: var(--vert-fonce); border-radius: var(--radius-md); padding: 13px 16px; margin: -4px 0 18px; }
@media (max-width: 480px) {
  .demandes-grille { grid-template-columns: 1fr; }
  .demande-carte-actions .form-marquer-inline { margin-left: 0; }
}
.section-offres-etablissement { margin: 4px 0 26px; }
.grille-offres { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 22px; align-items: stretch; }
@media (max-width: 720px) { .grille-offres { grid-template-columns: 1fr; } }

/* Cartes tarifaires : volontairement discretes -- Riwa reste un annuaire communautaire
   avant tout, ces offres ne doivent pas dominer l'espace etablissement. */
.carte-offre { position: relative; border: none; border-radius: var(--radius-lg); padding: 26px 24px; display: flex; flex-direction: column; gap: 14px; background: var(--paper); }
.carte-offre-active { background: var(--vert-clair); }
.carte-offre-fiche-pro { border-top: 3px solid var(--gold-600); }
.carte-offre-une { border-top: 3px solid var(--vert); }
.carte-offre-entete { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.carte-offre h3 { font-family: var(--font); font-size: 11px; margin: 0; text-transform: uppercase; letter-spacing: .1em; font-weight: 600; color: var(--ink-faint); }
.carte-offre-fiche-pro h3 { color: var(--gold-700); }
.carte-offre-une h3 { color: var(--vert-fonce); }
.carte-offre-prix-bloc { margin: 2px 0 4px; }
.carte-offre-prix-principal { font-family: var(--font-titre); font-size: 38px; font-weight: 800; line-height: 1; color: var(--ink); letter-spacing: -.045em; }
.carte-offre-prix-principal .unite { font-family: var(--font); font-size: 13px; font-weight: 400; color: var(--ink-faint); margin-left: 4px; letter-spacing: 0; }
.carte-offre-prix-alt { font-size: 13px; color: var(--ink-faint); font-weight: 400; margin-top: 7px; }
.carte-offre-avantages { list-style: none; display: flex; flex-direction: column; gap: 11px; flex-grow: 1; margin: 6px 0 0; }
.carte-offre-avantages li { display: flex; align-items: flex-start; gap: 10px; font-size: 13.5px; color: var(--ink-soft); line-height: 1.5; }
.carte-offre-avantages li::before { content: '✓'; flex-shrink: 0; width: 18px; height: 18px; border-radius: 50%; background: #fff; color: var(--vert-fonce); font-size: 10px; font-weight: 700; display: flex; align-items: center; justify-content: center; margin-top: 1px; }
.carte-offre-fiche-pro .carte-offre-avantages li::before { color: var(--gold-700); }
.carte-offre-une .carte-offre-avantages li::before { color: var(--vert-fonce); }
.fiche-lieu-actions-pro { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }
.btn-offre { display: inline-block; text-align: center; font-size: 14.5px; font-weight: 600; color: #fff; background: var(--vert); padding: 14px 24px; border-radius: var(--radius-pill); text-decoration: none; }
.btn-offre:hover { background: var(--vert-fonce); }
.btn-offre-secondaire { background: var(--paper); color: var(--ink); border: none; }
.btn-offre-secondaire:hover { background: var(--ink); color: #fff; }
.carte-offre-boutons { display: flex; flex-direction: column; gap: 8px; margin-top: auto; padding-top: 8px; }
.carte-offre-boutons .btn-offre { font-size: 14px; font-weight: 600; color: var(--ink); background: #fff; padding: 13px 16px; }
.carte-offre-boutons .btn-offre:hover { background: var(--ink); color: #fff; }

/* Vitrine des offres sur /espace-etablissement (page publique) : ici les cartes servent
   a donner envie, contrairement a celles de l'onglet de gestion. */
.bloc-offres-vitrine { margin-top: 56px !important; padding-top: 44px; border-top: 1px solid var(--line); }
.grille-offres-2 { grid-template-columns: repeat(2, 1fr); max-width: 900px; gap: 22px; margin-left: auto; margin-right: auto; }
@media (max-width: 720px) { .grille-offres-2 { grid-template-columns: 1fr; } }
.bloc-offres-vitrine .carte-offre { background: var(--paper); box-shadow: none; border: none; text-align: left; padding: 38px 34px; gap: 18px; border-radius: var(--radius-xl); }
.bloc-offres-vitrine .carte-offre-fiche-pro { border-top: 4px solid var(--gold-600); }
.bloc-offres-vitrine .carte-offre-une { border-top: 4px solid var(--vert); }
.bloc-offres-vitrine .carte-offre h3 { font-size: 12px; }
.bloc-offres-vitrine .carte-offre-prix-principal { font-size: 50px; }
.bloc-offres-vitrine .carte-offre-prix-alt { font-size: 13.5px; }
.bloc-offres-vitrine .carte-offre-avantages { gap: 13px; margin-top: 10px; }
.bloc-offres-vitrine .carte-offre-avantages li { font-size: 15px; }
.bloc-offres-vitrine .carte-offre-avantages li::before { width: 22px; height: 22px; font-size: 12px; }
@media (max-width: 480px) { .bloc-offres-vitrine .carte-offre { padding: 26px 22px; } }

/* ============================================================
   LA FICHE PRO (septembre 2026, refonte complete)

   L'ancienne version empilait des blocs blancs sur fond blanc : plus
   aucun "encadre" ne se lisait, et les six avantages s'etalaient en
   paragraphes que personne ne parcourt.

   Ce qui change : un PANNEAU vert profond avec son propre fond, pose
   franchement sur la page. Deux couleurs et deux seulement -- le vert
   de la marque, le dore pour ce qui est payant. Les avantages sont
   reduits a leur titre, en deux colonnes, lisibles d'un seul regard.
   Le prix vient apres : on comprend d'abord ce qu'on achete.
   ============================================================ */
.fp-page { max-width: 760px; margin: 48px auto 72px; }

.fp-panneau {
  position: relative;
  overflow: hidden;
  border-radius: var(--radius-xl);
  padding: 52px 44px 40px;
  background:
    radial-gradient(120% 90% at 50% -10%, #12472F 0%, transparent 62%),
    linear-gradient(168deg, #0B2C1E 0%, #071A12 100%);
  color: #fff;
  border: 1px solid rgba(245, 165, 36, .22);
}
/* Voile dore tres diffus en haut du panneau : c'est lui qui donne la
   chaleur, sans ajouter ni degrade decoratif ni ombre portee. */
.fp-halo {
  position: absolute;
  top: -180px; left: 50%;
  width: 520px; height: 360px;
  transform: translateX(-50%);
  background: radial-gradient(circle, rgba(245, 165, 36, .30) 0%, transparent 68%);
  pointer-events: none;
}

.fp-entete { position: relative; text-align: center; margin-bottom: 34px; }
.fp-titre {
  font-family: var(--font-titre);
  font-size: 52px; font-weight: 800; letter-spacing: -.045em; line-height: 1.02;
  margin: 0 0 14px; color: #fff;
}
.fp-titre-or {
  background: linear-gradient(100deg, #FFD98A 0%, #F5A524 48%, #FFC96B 100%);
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: #F5A524;
}
.fp-tagline { font-size: 16px; line-height: 1.65; color: rgba(255, 255, 255, .74); margin: 0; }

.fp-avantages {
  position: relative;
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px 28px;
  padding-top: 30px; border-top: 1px solid rgba(255, 255, 255, .10);
}
.fp-avantage { display: flex; align-items: flex-start; gap: 11px; }
.fp-coche { flex-shrink: 0; color: #F5A524; font-size: 13px; line-height: 1.55; }
.fp-avantage-texte { font-size: 15px; line-height: 1.5; color: rgba(255, 255, 255, .88); }
.fp-avantage-texte .avantage-fort { color: #fff; font-weight: 600; }

.fp-prix {
  position: relative;
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px;
  margin-top: 36px; padding-top: 32px;
  border-top: 1px solid rgba(255, 255, 255, .10);
}
.fp-prix-option {
  position: relative;
  border: 1px solid rgba(255, 255, 255, .16);
  border-radius: var(--radius-lg);
  background: rgba(255, 255, 255, .04);
  padding: 22px 20px;
  display: flex; flex-direction: column; gap: 3px;
}
.fp-prix-vedette { border-color: rgba(245, 165, 36, .55); background: rgba(245, 165, 36, .10); }
.fp-prix-ruban {
  position: absolute; top: -11px; left: 18px;
  background: #F5A524; color: #0B2C1E;
  font-size: 10.5px; font-weight: 700; letter-spacing: .04em;
  padding: 4px 11px; border-radius: var(--radius-pill);
}
.fp-prix-montant { font-family: var(--font-titre); font-size: 34px; font-weight: 800; letter-spacing: -.035em; color: #fff; }
.fp-prix-periode { font-size: 13.5px; font-weight: 500; color: rgba(255, 255, 255, .72); }
.fp-prix-note { font-size: 12px; color: rgba(255, 255, 255, .48); margin-top: 3px; }

/* Sept. 2026 : l'offre est reservee aux commerces, le dire ici evite qu'une mosquee
   arrive sur cette page en croyant devoir payer ce qu'elle a deja. */
.fp-destinataire { margin: 14px auto 0; max-width: 60ch; font-size: 13.5px; line-height: 1.55; color: rgba(255,255,255,.72); }

.fp-mention { position: relative; margin: 22px 0 0; text-align: center; font-size: 12px; color: rgba(255, 255, 255, .45); }

@media (max-width: 620px) {
  .fp-panneau { padding: 40px 24px 32px; }
  .fp-titre { font-size: 38px; }
  .fp-avantages { grid-template-columns: 1fr; gap: 13px; }
  .fp-prix { grid-template-columns: 1fr; gap: 18px; }
}

/* Etat du certificat halal dans l'espace etablissement (sept. 2026) :
   le gerant doit savoir, avant de televerser quoi que ce soit, ce que
   sa fiche affiche aujourd'hui au public. */
.certificat-etat { font-size: 13px; line-height: 1.55; border-radius: var(--radius-md); padding: 11px 14px; margin: 4px 0 10px; }
.certificat-etat-ok { background: var(--emerald-50, #EFFBF6); color: var(--emerald-700, #007A50); border: 1px solid var(--emerald-100, #D6F3E6); }
.certificat-etat-attente { background: var(--amber-bg, #FFF7E6); color: var(--amber-ink, #8A5E00); border: 1px solid var(--amber-border, #FFE0A3); }
.certificat-etat-manquant { background: var(--paper, #F4F5F9); color: var(--ink-soft); border: 1px solid var(--line, #E6E7EE); }

.demandes-traitees-details summary { cursor: pointer; font-size: 13px; color: var(--ink-faint); font-weight: 500; }
.admin-message-ok { background: var(--vert-clair); border: none; color: var(--vert-fonce); padding: 14px 18px; border-radius: var(--radius-md); margin-bottom: 20px; font-size: 14.5px; font-weight: 500; }
.admin-liens-outils { font-size: 14px; margin-bottom: 12px; }
.admin-liens-outils a { color: var(--vert-fonce); font-weight: 600; text-decoration: none; }
.admin-liens-outils a:hover { text-decoration: underline; }
.form-admin-lieu { max-width: 680px; }
.label-case { flex-direction: row !important; align-items: flex-start !important; gap: 10px !important; font-weight: 400 !important; text-align: left !important; font-size: 14.5px !important; color: var(--ink) !important; }
.label-case input { width: auto; margin-top: 3px; flex-shrink: 0; }
/* text-align: left ici (et pas seulement herite) : dans un .form-section (text-align:
   center), un texte de case a cocher sur plusieurs lignes se retrouvait centre ligne par
   ligne -- illisible. Le texte d'une case part toujours du bord gauche. */
.label-case span { flex: 1; text-align: left; }

/* Boutons du hero annuaire */
.hero-nav-btns { display: flex; gap: 10px; justify-content: center; margin-top: 26px; flex-wrap: wrap; }
.hero-btn { display: inline-block; padding: 13px 24px; background: rgba(255,255,255,.12); border: none; border-radius: var(--radius-pill); color: #fff; text-decoration: none; font-size: 14.5px; font-weight: 600; }
.hero-btn:hover { background: #fff; color: var(--ink); }

/* SECTION "A LA UNE" */
.section-une { padding: 0 24px; }
.section-une h2 { font-size: 30px; font-weight: 700; letter-spacing: -.035em; color: var(--ink); margin-bottom: 0; }
.section-une-titre { margin-bottom: 0 !important; }
.voir-tout-lien { font-size: 14.5px; font-weight: 600; color: var(--vert-fonce); text-decoration: none; white-space: nowrap; }
/* 3 colonnes fixes : les emplacements "A la une" non vendus doivent rester visibles.
   En auto-fit, deux fiches s'etalaient sur toute la largeur et la place libre
   disparaissait -- or c'est elle qui donne envie de la reserver. */
.une-grid-large { grid-template-columns: repeat(3, 1fr); gap: 20px; }
@media (max-width: 900px) { .une-grid-large { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px) { .une-grid-large { grid-template-columns: 1fr; } }
.une-grid-large .une-card-contenu { padding: 26px 26px 28px; }
.une-grid-large .une-card .nom { font-size: 26px; }
.une-grid-large .une-card .desc { font-size: 15px; }
.une-grid-large .une-card-avec-photo img { height: 210px; }

/* Mobile : les cartes Decouvertes prenaient presque tout l'ecran (photo de 210px + 26px de
   marge + un titre de 26px), au point qu'une seule tenait dans la fenetre -- on ne voyait
   donc jamais qu'il y en avait trois. Tout est ramene a une taille de vignette : la photo
   reste l'element dominant, mais la carte suivante depasse en bas de l'ecran et invite a
   faire defiler. */
@media (max-width: 600px) {
  .une-grid-large { gap: 14px; }
  .une-grid-large .une-card-contenu { padding: 16px 18px 18px; }
  .une-grid-large .une-card .nom { font-size: 20px; }
  .une-grid-large .une-card .desc { font-size: 14px; }
  .une-grid-large .une-card-avec-photo img { height: 150px; }
  .une-grid-large .une-card .type-small { margin-bottom: 10px; }
  .une-card-contenu { padding: 16px 18px 18px; }
  .une-card .nom { font-size: 20px; }
  .une-card-avec-photo img { height: 150px; }
  .une-card-vide { min-height: 120px; }
}
.section-communaute { margin-top: 56px; }
.communaute-card { background: var(--paper); }
.communaute-card .type-small { background: var(--vert); }
.section-communaute-intro { font-size: 17px; color: var(--ink-soft); line-height: 1.6; max-width: 62ch; margin: -4px 0 26px; }
.communaute-card-vide { background: none; display: flex; align-items: center; justify-content: center; min-height: 170px; box-shadow: none; }
.communaute-vide-texte { font-size: 14.5px; color: var(--ink-faint); text-align: center; line-height: 1.5; font-weight: 500; }
.communaute-date { font-size: 12.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-faint); margin: 6px 0 2px; }
.communaute-texte { font-size: 15px; color: var(--ink-soft); line-height: 1.6; margin-top: 2px; }

/* FLUX COMMUNAUTE (accueil) : chaque post est un aplat, pas une ligne de liste. */
.feed-communaute { display: flex; flex-direction: column; gap: 12px; }
.feed-item { display: flex; align-items: flex-start; gap: 20px; padding: 26px 28px; background: var(--paper); border: none; border-radius: var(--radius-lg); text-decoration: none; color: inherit; transition: transform .16s ease, box-shadow .16s ease; }
.feed-item:hover { transform: translateY(-2px); box-shadow: var(--shadow-hover); }
.feed-item-icone { flex-shrink: 0; width: 46px; height: 46px; border-radius: 50%; background: #fff; border: none; display: flex; align-items: center; justify-content: center; color: var(--vert); margin-top: 2px; box-shadow: none; }
.feed-item-icone .ico { width: 21px; height: 21px; }
.feed-item-corps { flex: 1; min-width: 0; }
.feed-item-ligne1 { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.feed-item-etablissement { font-family: var(--font-titre); font-weight: 700; font-size: 21px; letter-spacing: -.035em; color: var(--ink); }
.feed-item-type { font-size: 10.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #fff; background: var(--vert); padding: 4px 10px; border-radius: var(--radius-pill); }
.feed-item-texte { font-size: 15.5px; color: var(--ink-soft); line-height: 1.65; margin-top: 10px; max-width: 68ch; overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.feed-item-date { flex-shrink: 0; font-size: 12.5px; color: var(--ink-faint); white-space: nowrap; margin-top: 6px; font-weight: 500; }
/* Vignette de la publication sur l'accueil (sept. 2026) : format fixe et recadrage
   par le centre, pour que des photos de ratios differents alignent quand meme leurs
   lignes. Une ligne sans photo n'a tout simplement pas cet element -- aucun cadre
   vide, aucune place reservee. */
.feed-item-vignette { flex-shrink: 0; width: 132px; height: 96px; border-radius: var(--radius-md); overflow: hidden; background: #fff; }
.feed-item-vignette img { display: block; width: 100%; height: 100%; object-fit: cover; }
@media (max-width: 640px) {
  .feed-item-vignette { width: 88px; height: 72px; }
}
.feed-item-alerte { background: var(--amber-bg); border: none; border-left: none; padding-left: 28px; margin-left: 0; }
.feed-item-alerte:hover { background: #FFF1D6; }
.feed-item-alerte .feed-item-icone { background: #fff; color: var(--amber-strong); box-shadow: none; }
.feed-item-alerte .feed-item-type { color: #3D2A00; background: var(--gold-500); }
.communaute-vide-texte-feed { text-align: left; padding: 26px 28px; background: var(--paper); border-radius: var(--radius-lg); border-top: none; }
@media (max-width: 600px) {
  .feed-item { padding: 22px 20px; gap: 14px; }
  .feed-item-icone { width: 38px; height: 38px; }
  .feed-item-icone .ico { width: 18px; height: 18px; }
  .feed-item-etablissement { font-size: 19px; }
  .feed-item-ligne1 { flex-direction: column; align-items: flex-start; gap: 8px; }
  .feed-item-date { margin-top: 8px; }
}

/* PAGE /la-vie-de-la-communaute */
/* ============================================================
   Filtres de l'annuaire des associations (sept. 2026)
   Avant : une ligne de pastilles a choix unique -- on ne pouvait pas demander
   "jeunesse ET education", il n'y avait pas de filtre ville alors que les pages
   categorie de l'annuaire en ont un, et neuf pastilles alignees faisaient une
   bouillie de texte en haut de page. Ici : un panneau, des cases a cocher (donc
   cumulables), une ville, un nom.
   ============================================================ */
.asso-filtres { background: var(--paper); border-radius: var(--radius-lg); padding: 22px 26px; margin: 4px 0 26px; }
.asso-filtres-ligne { display: grid; grid-template-columns: 2fr 1fr; gap: 16px; }
.asso-filtre-champ { display: flex; flex-direction: column; gap: 6px; }
.asso-filtre-label { font-size: 12.5px; font-weight: 600; letter-spacing: .03em; text-transform: uppercase; color: var(--ink-faint); padding: 0; }
.asso-filtre-aide { font-weight: 500; text-transform: none; letter-spacing: 0; }
.asso-filtre-champ input, .asso-filtre-champ select {
  width: 100%; padding: 12px 15px; border: none; border-radius: var(--radius-md);
  background: #fff; color: var(--ink); font-family: inherit; font-size: 15px;
}
.asso-filtre-champ input:focus, .asso-filtre-champ select:focus { outline: 2px solid #0E4630; outline-offset: 1px; }
.asso-filtre-groupe { border: none; margin: 20px 0 0; padding: 18px 0 0; border-top: 1px solid var(--line, rgba(14,14,20,.08)); }
.asso-filtre-cases { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 9px 18px; margin-top: 12px; }
.asso-filtre-case { display: flex; align-items: center; gap: 9px; font-size: 14.5px; color: var(--ink); cursor: pointer; line-height: 1.35; }
.asso-filtre-case input { width: 17px; height: 17px; flex-shrink: 0; accent-color: #0E4630; cursor: pointer; margin: 0; }
.asso-filtres-pied { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line, rgba(14,14,20,.08)); }
.asso-filtres-pied .resultats-count { margin: 0; }
@media (max-width: 820px) {
  .asso-filtre-cases { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
  .asso-filtres { padding: 18px 18px; }
  .asso-filtres-ligne { grid-template-columns: 1fr; }
  .asso-filtre-cases { grid-template-columns: 1fr; }
}

.filtres-communaute { display: flex; gap: 8px; flex-wrap: wrap; margin: 4px 0 30px; }
.filtre-chip { font: inherit; font-size: 14px; font-weight: 600; color: var(--ink); background: var(--paper); border: none; padding: 11px 20px; border-radius: var(--radius-pill); cursor: pointer; transition: all .14s; }
.filtre-chip:hover { background: var(--paper-2); }
.filtre-chip.est-actif { background: var(--ink); color: #fff; }

.timeline-communaute { position: relative; margin-top: 4px; display: flex; flex-direction: column; gap: 12px; border-top: none; }
.timeline-communaute::before { content: none; }
.timeline-item { position: relative; display: flex; gap: 20px; padding: 26px 28px; background: var(--paper); border: none; border-radius: var(--radius-lg); text-decoration: none; color: inherit; transition: transform .16s ease, box-shadow .16s ease; }
.timeline-item:hover { transform: translateY(-2px); box-shadow: var(--shadow-hover); }
.timeline-item:last-child { padding-bottom: 26px; border-bottom: none; }
.timeline-rail { position: relative; z-index: 1; flex-shrink: 0; width: 46px; display: flex; justify-content: flex-start; padding-top: 2px; }
.timeline-point { width: 46px; height: 46px; border-radius: 50%; background: #fff; border: none; display: flex; align-items: center; justify-content: center; color: var(--vert); transition: none; box-shadow: none; padding: 0; }
.timeline-point .ico { width: 21px; height: 21px; }
.timeline-item:hover .timeline-point { background: #fff; color: var(--vert-fonce); }
.timeline-corps { flex: 1; min-width: 0; padding-top: 2px; }
.timeline-date { display: inline-block; font-size: 11.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-faint); margin-bottom: 8px; }
.timeline-annee { font-weight: 400; text-transform: none; letter-spacing: normal; color: var(--ink-faint); }
.timeline-entete { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 8px; }
.timeline-etablissement { font-family: var(--font-titre); font-size: 21px; font-weight: 700; color: var(--ink); letter-spacing: -.035em; }
.timeline-type-badge { font-size: 10.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #fff; background: var(--vert); padding: 4px 10px; border-radius: var(--radius-pill); }
.timeline-texte { font-style: normal; font-size: 15.5px; color: var(--ink-soft); line-height: 1.65; margin: 8px 0 8px; padding: 0; background: none; border-left: none; border-radius: 0; max-width: 68ch; overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.timeline-lieu { font-size: 13px; color: var(--ink-faint); }
.timeline-item-alerte { background: var(--amber-bg); }
.timeline-item-alerte .timeline-point { background: #fff; color: var(--amber-strong); }
.timeline-item-alerte .timeline-type-badge { color: #3D2A00; background: var(--gold-500); }
@media (max-width: 600px) {
  .timeline-item { gap: 14px; padding: 22px 20px; }
  .timeline-rail { width: 38px; }
  .timeline-point { width: 38px; height: 38px; }
  .timeline-point .ico { width: 18px; height: 18px; }
  .timeline-etablissement { font-size: 19px; }
}

/* Alertes epinglees au-dessus du flux */
.alerte-banniere { display: flex; flex-direction: column; gap: 10px; margin: 4px 0 30px; border-top: none; }
.alerte-banniere-item { display: flex; gap: 14px; align-items: flex-start; background: var(--amber-bg); border: none; border-radius: var(--radius-lg); padding: 20px 24px; text-decoration: none; color: inherit; transition: transform .16s ease; }
.alerte-banniere-item:hover { box-shadow: none; transform: translateY(-2px); }
.alerte-banniere-icone { flex-shrink: 0; margin-top: 2px; color: var(--amber-strong); }
.alerte-banniere-icone .ico { width: 19px; height: 19px; }
.alerte-banniere-titre { display: block; font-family: var(--font-titre); font-weight: 700; font-size: 18px; color: #4A3300; margin-bottom: 4px; letter-spacing: -.03em; }
.alerte-banniere-texte { display: block; font-size: 14.5px; color: var(--amber-ink); line-height: 1.55; }

/* Page annonce individuelle. Largeur elargie de 720px a 900px (aout 2026, a la demande
   de Yacine : la page paraissait trop centree/etroite), en restant plus etroite que
   .section (1200px) pour garder des lignes de texte confortables a lire. */
.annonce-page { max-width: 1100px; }
.annonce-entete { display: flex; gap: 18px; align-items: flex-start; margin: 4px 0 28px; padding-bottom: 0; border-bottom: none; }
.annonce-icone { flex-shrink: 0; width: 52px; height: 52px; border-radius: 50%; background: var(--paper); border: none; color: var(--vert); display: flex; align-items: center; justify-content: center; box-shadow: none; padding: 0; margin-top: 2px; }
.annonce-icone .ico { width: 23px; height: 23px; }
.annonce-type-badge { display: inline-block; font-size: 10.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #fff; background: var(--vert); padding: 5px 11px; border-radius: var(--radius-pill); margin-bottom: 12px; }
.annonce-entete h1 { font-size: 40px; font-weight: 800; margin: 0 0 10px; line-height: 1.05; letter-spacing: -.05em; }
.annonce-lieu { font-size: 14px; color: var(--ink-faint); margin: 0 0 3px; }
.annonce-date { font-size: 13.5px; color: var(--ink-faint); margin: 0; }
/* Le corps d'une publication etait pose nu sur le fond de page, sans contenant : il
   flottait entre la photo et le bloc "Informations pratiques", qui lui en avait un.
   Depuis septembre 2026 il a le meme aplat que ce bloc, plus un filet vert a gauche --
   on voit ou le texte commence et ou il s'arrete. */
.annonce-texte-complet {
  position: relative; overflow-wrap: anywhere;
  font-size: 17.5px; line-height: 1.75; color: var(--ink-soft);
  margin: 0 0 28px; padding: 28px 32px;
  background: var(--paper); border: none; border-left: 4px solid #0E4630;
  border-radius: var(--radius-lg); box-shadow: none; max-width: 72ch;
}
.annonce-texte-complet p { margin: 0 0 1.1em; overflow-wrap: anywhere; }
.annonce-texte-complet p:last-child { margin-bottom: 0; }
.annonce-cta-groupe { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 4px; padding-top: 0; border-top: none; }

/* Boutons de la nav */
.nav-btn { background: var(--vert) !important; color: #fff !important; padding: 11px 20px; border-radius: var(--radius-pill); font-weight: 600 !important; font-size: 14.5px !important; margin-left: 14px !important; }
.nav-btn:hover { background: var(--vert-fonce) !important; }
.nav-btn-secondary { background: var(--paper) !important; color: var(--ink) !important; border: none; }
.nav-btn-secondary:hover { background: var(--paper-2) !important; }
.nav-link-plain { color: var(--ink-soft) !important; text-decoration: none; padding: 9px 14px; border-radius: var(--radius-pill); font-weight: 500 !important; font-size: 14.5px !important; margin-left: 2px; background: transparent; }
.nav-link-plain:hover { color: var(--ink) !important; background: var(--paper); }

/* BANNIERE D'INTRO */
.intro-banner { background: var(--paper); border: none; border-top: none; border-bottom: none; box-shadow: none; border-radius: var(--radius-lg); padding: 34px 32px; text-align: left; }
.intro-banner h2 { font-size: 28px; font-weight: 700; margin-bottom: 12px; color: var(--ink); letter-spacing: -.035em; }
.intro-banner p { font-size: 16px; color: var(--ink-soft); line-height: 1.65; max-width: 62ch; margin: 0; }

/* Pages formulaire */
.form-section { text-align: center; }
.form-section .form-erreur { max-width: 480px; margin: 0 auto 12px; text-align: left; }
.form-section h2 { font-size: 24px; font-weight: 700; }
.form-section-compact { max-width: 640px; margin-left: auto; margin-right: auto; }
.form-section-compact > p:first-of-type { font-size: 16px; color: var(--ink-soft); line-height: 1.6; margin-bottom: 4px; }

/* Entree /espace-etablissement (deconnecte) : deux parcours cote a cote. */
.espace-entree-hero { max-width: 640px; margin-left: auto; margin-right: auto; text-align: center; padding-bottom: 0; }
.espace-entree-hero p { font-size: 16px; color: var(--ink-soft); line-height: 1.6; }
.espace-entree-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; max-width: 1000px; margin: 30px auto 0; align-items: stretch; border: none; box-shadow: none; border-radius: 0; overflow: visible; background: none; }
.espace-entree-col { padding: 38px 36px; text-align: center; background: var(--paper); border-radius: var(--radius-lg); }
.espace-entree-nouveau { display: flex; flex-direction: column; justify-content: center; border-right: none; }
.espace-entree-col h2 { font-size: 22px; font-weight: 700; margin: 0 0 12px; letter-spacing: -.03em; }
.espace-entree-choix { padding: 16px 0; }
.espace-entree-choix + .espace-entree-choix { border-top: 1px solid var(--line); margin-top: 2px; }
.espace-entree-choix-titre { font-weight: 500; color: var(--ink); margin: 0 0 12px; font-size: 15px; line-height: 1.45; }
.espace-entree-col .form-commercant input { background: #fff; }
@media (max-width: 760px) {
  .espace-entree-grid { grid-template-columns: 1fr; }
  .espace-entree-col { padding: 30px 22px; }
  .espace-entree-nouveau { border-right: none; border-bottom: none; }
}

.visibilite-intro { max-width: 560px; margin: 0 auto; font-size: 16px; color: var(--ink-soft); line-height: 1.65; }
.visibilite-cta-texte { font-weight: 600; color: var(--ink); margin-top: 8px; margin-bottom: 18px; font-size: 16px; }
.visibilite-layout { display: flex; gap: 40px; align-items: flex-start; max-width: 900px; margin: 26px auto 0; text-align: left; }
.visibilite-form-col { flex: 1 1 360px; }
.visibilite-form-col .visibilite-cta-texte { text-align: center; }
.question-alcool { text-align: center; margin: 22px 0; }
.question-alcool .choix-cible-option { margin: 5px 6px; }
@media (max-width: 760px) { .visibilite-layout { flex-direction: column; } }
.contact-direct-ligne { margin-top: 24px; font-size: 13.5px; color: var(--ink-faint); }
.contact-direct-ligne a { color: var(--vert-fonce); font-weight: 600; }

.note-expansion { text-align: center; padding: 8px 24px 0; max-width: 1200px; margin: 0 auto; }
.note-expansion p { font-size: 13.5px; color: var(--ink-faint); }

.search-page.avec-filtre { display: flex; flex-wrap: wrap; gap: 10px; max-width: 780px; }
.search-page.avec-filtre input { flex: 1 1 220px; width: auto; }
.search-page.avec-filtre select { flex: 0 0 200px; padding: 14px 16px; border-radius: var(--radius-md); border: none; background: var(--paper); font-size: 14.5px; color: var(--ink); font-family: inherit; }
@media (max-width: 640px) {
  .search-page.avec-filtre { flex-direction: column; }
  .search-page.avec-filtre input { flex: 0 0 auto; width: 100%; }
  .search-page.avec-filtre select { flex: 0 0 auto; width: 100%; }
}
.filtres-annexes { display: flex; flex-wrap: wrap; gap: 8px; max-width: 780px; margin: 12px 0 0; }
.filtres-annexes .filtre-chip { padding: 9px 17px; font-size: 13px; }
.signaler-erreur-ligne { margin-top: 30px; padding-top: 0; border-top: none; }
.signaler-erreur-ligne a { font-size: 13.5px; color: var(--ink-faint); text-decoration: underline; }
.signaler-erreur-ligne a:hover { color: var(--ink); }
.signalement-note { background: var(--amber-bg); border: none; color: var(--amber-ink); border-radius: var(--radius-md); padding: 14px 18px; font-size: 14.5px; margin: 0 0 16px; }

.lieu-marker span { display: block; width: 14px; height: 14px; border-radius: 50%; border: 2px solid #fff; box-shadow: 0 0 0 1px rgba(0,0,0,.2); }

.type-intro-seo { color: var(--ink-soft); font-size: 16.5px; line-height: 1.65; max-width: 62ch; margin: 0 0 16px; }

.page-404 { min-height: 50vh; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; }
.liens-404 { display: flex; flex-wrap: wrap; justify-content: center; gap: 14px; margin-top: 24px; }
.liens-404 a { color: var(--vert-fonce); font-weight: 600; text-decoration: none; }
.liens-404 a:hover { text-decoration: underline; }

.admin-panel { background: var(--paper); border: none; border-radius: var(--radius-lg); padding: 32px 34px; box-shadow: none; text-align: left; }
@media (max-width: 480px) { .admin-panel { padding: 22px 18px; } }
.admin-header-ligne { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; margin-bottom: 26px; }
.admin-deconnexion { font-size: 13.5px; color: var(--ink-faint); text-decoration: underline; }
.admin-deconnexion:hover { color: var(--ink); }

/* Onglets. Le fond est explicitement neutralise : .nav-admin est un <nav>, et sans cette
   declaration il heritait du fond du bandeau de navigation principal (regle "nav { ... }"
   plus haut), ce qui faisait apparaitre une barre pleine largeur derriere les onglets.
   Ne pas retirer background / position / z-index. */
.nav-admin { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 28px; border-bottom: none; background: none; position: static; top: auto; z-index: auto; backdrop-filter: none; -webkit-backdrop-filter: none; }
.nav-admin a { font-size: 14px; font-weight: 600; color: var(--ink-soft); text-decoration: none; padding: 10px 18px; margin-bottom: 0; border-bottom: none; border-radius: var(--radius-pill); background: #fff; }
.nav-admin a:hover { color: var(--ink); background: var(--paper-2); }
.nav-admin a.nav-admin-actif { color: #fff; background: var(--ink); border-bottom-color: transparent; }
.nav-admin .nav-admin-deconnexion { margin-left: auto; font-weight: 500; color: var(--ink-faint); text-decoration: underline; padding: 10px 4px; border: none; background: none; }
.nav-admin .nav-admin-deconnexion:hover { color: var(--ink); background: none; }

.admin-stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 14px; margin-top: 24px; border-top: none; }
.admin-stat-card { display: block; background: #fff; border: none; box-shadow: none; border-radius: var(--radius-md); padding: 22px 24px; text-decoration: none; color: var(--ink); transition: background .14s; }
.admin-stat-card:hover { box-shadow: none; background: var(--paper-2); }
.admin-stat-card-actif { background: var(--vert-clair); }
.admin-stat-nombre { font-family: var(--font-titre); font-size: 38px; font-weight: 800; margin-bottom: 6px; color: var(--ink); letter-spacing: -.045em; }
.admin-stat-label { font-size: 13px; color: var(--ink-soft); line-height: 1.45; }

.filtres-incomplet { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 18px; }
.input-filtre-fiches { display: block; width: 100%; max-width: 360px; padding: 12px 16px; border-radius: var(--radius-md); border: none; background: #fff; font-size: 14.5px; margin: 4px 0; font-family: inherit; }
.input-filtre-fiches:focus { outline: 2px solid var(--vert); outline-offset: 1px; }
.filtre-incomplet { font-size: 13px; font-weight: 600; color: var(--ink); background: #fff; border: none; padding: 9px 16px; border-radius: var(--radius-pill); text-decoration: none; }
.filtre-incomplet:hover { background: var(--paper-2); }
.filtre-incomplet-actif { background: var(--ink); color: #fff; }
.filtre-type-bloc { margin: 4px 0 18px; }
.filtre-type-select-label { font-size: 13.5px; font-weight: 500; color: var(--ink-soft); display: flex; align-items: center; gap: 8px; }

/* Mention TVA affichee sous les grilles tarifaires (aout 2026, audit) : Riwa est en
   franchise en base, les prix affiches sont donc definitifs. Discret mais lisible. */
.mention-tva { font-size: 13px; color: var(--ink-faint); margin: 18px 0 0; text-align: center; }
/* Chaque offre est desormais un formulaire POST (aout 2026, audit) : on neutralise la marge
   par defaut pour que les boutons restent alignes comme quand c'etaient des liens. */
.form-souscrire { margin: 0; display: contents; }

/* ============================================================
   PAGE D'ACCUEIL — recherche, categories, bloc commercants
   (aout 2026). Jusqu'ici l'accueil promettait "Trouvez ce que vous
   cherchez" sans offrir ni champ de recherche ni acces aux categories :
   il fallait cliquer "Voir l'annuaire" pour atteindre les 900+ fiches.
   ============================================================ */

/* Le champ + le bouton sur une seule ligne. Le champ existant (.hero .search
   input) garde son style ; on ne fait que passer le conteneur en flex. */
.search-accueil { display: flex; gap: 10px; max-width: 620px; }
.search-accueil input { flex: 1; min-width: 0; padding-left: 22px !important; }
.btn-recherche-accueil { flex-shrink: 0; font: inherit; font-size: 15.5px; font-weight: 600; color: #06281c; background: var(--vert); border: none; padding: 17px 26px; border-radius: var(--radius-pill); cursor: pointer; transition: background .15s; }
.btn-recherche-accueil:hover { background: var(--vert-fonce); color: #fff; }

/* Grille des categories avec compteurs. La barre de couleur reprend --cat,
   la meme teinte que la categorie porte partout ailleurs sur le site. */
/* Grille sur 6 colonnes internes, chaque carte en occupant 2 -- soit 3 cartes par ligne.
   Ce decoupage sert uniquement a rattraper les lignes incompletes : avec auto-fit, une
   derniere categorie seule se retrouvait coincee a gauche d'une ligne vide, ce qui donnait
   un trou visuel. Ici, si la derniere ligne ne contient qu'une carte, elle prend toute la
   largeur ; si elle en contient deux, chacune prend la moitie. Plus de vide a droite. */
/* Le filet de gauche des cartes de categorie a beaucoup bouge : couleur de la categorie
   (doublon avec la pastille et l'en-tete de page), puis noir (lourd), puis terre cuite.
   Depuis septembre 2026 il reprend le vert profond du bandeau d'accueil, juste au-dessus :
   les cartes se lisent comme la suite du bandeau et non comme un bloc rapporte. C'est aussi
   la seule couleur que la page porte deja -- une teinte de moins a l'ecran. */


/* v198 : l'ancienne recherche empilait champ et bouton sous 600px. Cette regle
   s'appliquait aussi a la pilule (qui porte encore la classe search-accueil) et cassait
   son rendu sur telephone : bouton pleine largeur SOUS le champ, dans la pilule. */
@media (max-width: 600px) {
  .search-accueil:not(.search-pilule) { flex-direction: column; }
  .search-accueil:not(.search-pilule) .btn-recherche-accueil { width: 100%; padding: 15px 20px; }
}

/* Une seule offre desormais (aout 2026) : la grille ne doit plus etaler une carte unique
   sur toute la largeur, sinon elle parait disproportionnee. */
/* Une seule offre au catalogue : la carte etait bridee a 460px, ce qui tassait les deux
   blocs de prix cote a cote et forcait "Au lieu de 107,88 € par an" a passer a la ligne.
   740px laisse respirer les prix et les avantages sans virer a la pleine largeur (au-dela,
   les lignes de detail deviennent trop longues a lire). */
.grille-offres-1 { grid-template-columns: minmax(0, 740px); justify-content: center; }
/* Demande expresse d'execution immediate, juste au-dessus du bouton de paiement. */
.label-execution-immediate { display: flex; gap: 9px; align-items: flex-start; text-align: left; font-size: 12.5px; line-height: 1.5; color: var(--ink-soft); margin: 0 0 12px; }
.label-execution-immediate input { margin-top: 2px; flex-shrink: 0; }

/* ============================================================
   FILTRES DE LA CARTE (/annuaire, aout 2026)
   Une pastille par categorie, toutes actives au chargement : on arrive sur
   la carte complete et on retire ce qu'on ne veut pas voir. La couleur
   reprend --cat, la meme teinte que la categorie porte partout ailleurs.
   ============================================================ */
.filtres-carte-barre { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; margin: 18px 0 10px; }
.filtres-carte-liste { display: flex; flex-wrap: wrap; gap: 8px; }
.filtres-carte-actions { display: flex; gap: 8px; flex-shrink: 0; }
.btn-lien-petit { font-size: 13px; padding: 7px 14px; }

.filtre-carte { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; border-radius: var(--radius-pill); border: 1.5px solid var(--line); background: #fff; cursor: pointer; user-select: none; font-size: 13.5px; font-weight: 600; color: var(--ink-faint); transition: border-color .15s, color .15s, background .15s; }
/* La case elle-meme est masquee : c'est la pastille coloree qui sert d'indicateur.
   Elle reste focusable au clavier (voir :focus-visible plus bas). */
.filtre-carte-case { position: absolute; opacity: 0; width: 0; height: 0; }
.filtre-carte-pastille { width: 11px; height: 11px; border-radius: 50%; background: var(--line-fort); flex-shrink: 0; transition: background .15s; }
.filtre-carte-compte { font-size: 12px; font-weight: 500; color: var(--ink-faint); }
.filtre-carte.est-actif { border-color: var(--cat, var(--vert)); color: var(--ink); background: #fff; }
.filtre-carte.est-actif .filtre-carte-pastille { background: var(--cat, var(--vert)); }
.filtre-carte:hover { border-color: var(--cat, var(--vert)); }
.filtre-carte-case:focus-visible + .filtre-carte-pastille { outline: 2px solid var(--vert); outline-offset: 2px; }

/* Le compteur etait colle sous la barre de filtres, au point qu'on lisait
   "Tout afficher Tout masquer 926 etablissements affiches" comme une seule ligne.
   Il est maintenant detache au-dessus de la carte. */
.filtres-carte-compteur { font-size: 13.5px; color: var(--ink-faint); margin: 18px 0 14px; min-height: 20px; }


@media (max-width: 600px) {
  .filtres-carte-barre { flex-direction: column; align-items: stretch; }
  .filtres-carte-actions { justify-content: flex-start; }
  .filtre-carte { padding: 7px 12px; font-size: 13px; }
}


/* ============================================================
   PAGE DE RECHERCHE /recherche (refonte aout 2026)
   Le formulaire reutilise .search-page.avec-filtre (champ + select) ; il lui manquait
   seulement un bouton de validation -- sans lui, il fallait deviner qu'on pouvait valider
   avec la touche Entree, et les filtres semblaient donc "ne pas marcher".
   ============================================================ */
.search-page.avec-filtre .btn-recherche-accueil { flex: 0 0 auto; padding: 14px 26px; font-size: 15px; }
@media (max-width: 700px) {
  .search-page.avec-filtre .btn-recherche-accueil { width: 100%; }
}

/* Les filtres de categorie de /recherche sont des LIENS (l'etat est dans l'URL, donc
   partageable et compatible avec le bouton Retour du navigateur), la ou ceux de /type/:slug
   sont des boutons pilotes en JS. Il faut donc neutraliser le soulignement et forcer
   l'alignement, que .filtre-chip ne prevoyait que pour des <button>. */
/* Les filtres de /recherche ne sont pas plafonnes a 780px comme les autres barres de
   filtres : avec sept categories, la derniere ("École d'arabe/coranique") passait seule a
   la ligne suivante. En laissant la barre prendre toute la largeur de la section, les sept
   pastilles tiennent sur une seule ligne sur un ecran classique -- et si un jour une
   huitieme categorie apparait, le retour a la ligne se fera par deux ou trois, pas par une. */
.filtres-recherche { max-width: none; }
/* Le compteur de resultats collait aux pastilles de categorie juste au-dessus : on lui
   donne son propre espace, et un peu plus de presence (c'est la reponse a la question
   posee, pas une note de bas de page). */
.resultats-count-recherche { margin-top: 26px; margin-bottom: 18px; font-size: 15px; color: var(--ink-soft); }
.filtres-recherche a.filtre-chip { display: inline-block; text-decoration: none; line-height: 1.2; white-space: nowrap; }
.filtres-recherche a.filtre-chip:hover { text-decoration: none; }


/* ============================================================
   PAGES CATEGORIE x VILLE — /type/boucherie/bagnolet (aout 2026)
   Bloc de maillage interne, present en bas des pages categorie (toutes les villes) et
   des pages ville (les villes voisines). C'est ce qui rend ces pages atteignables : sans
   lien entrant depuis le site, une page n'existe pratiquement pas pour un moteur.
   ============================================================ */
.bloc-villes-voisines { margin-top: 36px; padding-top: 24px; border-top: 1px solid var(--trait, rgba(0,0,0,.08)); }
.bloc-villes-titre { font-family: var(--font-titre); font-size: 17px; font-weight: 700; color: var(--ink); margin: 0 0 14px; letter-spacing: -.02em; }
.liste-villes-liens { display: flex; flex-wrap: wrap; gap: 8px; }
.liste-villes-liens a.filtre-chip { display: inline-flex; align-items: center; gap: 7px; text-decoration: none; padding: 9px 16px; font-size: 13.5px; }
.liste-villes-liens a.filtre-chip:hover { text-decoration: none; }
/* Le compteur reste lisible mais s'efface derriere le nom de la ville, qui est l'information. */
.ville-lien-compte { font-size: 12px; font-weight: 600; color: var(--ink-faint); }
.filtre-chip.est-actif .ville-lien-compte { color: rgba(255,255,255,.7); }
.bloc-villes-tout { margin: 18px 0 0; }

/* ============================================================
   INVITATION À COMPLÉTER UNE FICHE (aout 2026)
   Affichee uniquement sur les fiches auxquelles il manque quelque chose. Volontairement
   discrete : c'est une invitation, pas une alerte -- un encadre rouge donnerait
   l'impression que la fiche est cassee, et ferait fuir le visiteur au lieu de l'engager.
   ============================================================ */
.bloc-completer-fiche { margin: 28px 0 4px; padding: 18px 20px; background: var(--paper); border-radius: var(--radius-md); border-left: 3px solid var(--cat, var(--vert)); }
.completer-fiche-titre { font-family: var(--font-titre); font-size: 15.5px; font-weight: 700; color: var(--ink); margin: 0 0 6px; letter-spacing: -.01em; }
.completer-fiche-texte { font-size: 14.5px; color: var(--ink-soft); margin: 0 0 14px; line-height: 1.55; }

/* --- Accessibilite : lien d'evitement (septembre 2026) ---------------------------------
   Un visiteur au clavier ou au lecteur d'ecran traversait toute la navigation a chaque
   page avant d'atteindre le contenu. Ce lien est le premier element focalisable de la
   page : invisible tant qu'on ne l'atteint pas au clavier, il apparait des qu'il recoit
   le focus. .erreur-technique n'apparait qu'en developpement (page d'erreur 500). */
.lien-evitement {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 1000;
  padding: 12px 18px;
  background: var(--vert, #12694c);
  color: #fff;
  text-decoration: none;
  border-radius: 0 0 10px 0;
  font-weight: 600;
}
.lien-evitement:focus {
  left: 0;
  outline: 3px solid #111;
  outline-offset: 2px;
}
main:focus { outline: none; }
.erreur-technique {
  margin: 18px auto 0;
  max-width: 720px;
  padding: 12px 14px;
  background: #f4f4f5;
  border-radius: 10px;
  font-size: 13px;
  text-align: left;
  overflow-x: auto;
  white-space: pre-wrap;
}

/* --- Offres : deux formules a egalite (septembre 2026) ---------------------------------
   Avant : l'annuel s'affichait en gros (38 px) et le mensuel en petit gris juste dessous
   ("ou 8,99 €/mois"), avec un seul bouton visible. On croyait ne pouvoir payer qu'a
   l'annee. Desormais les deux formules sont deux blocs de meme taille, chacun cliquable,
   l'annuel portant un ruban "2 mois offerts" et son prix de reference barre mentalement
   ("au lieu de 107,88 € par an"). */
.offre-formules { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; width: 100%; }
.offre-formules .form-souscrire { display: flex; margin: 0; }
.offre-formule {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  width: 100%;
  text-align: left;
  padding: 20px 18px 18px;
  background: #fff;
  border: 1.5px solid var(--line, #E6E6EA);
  border-radius: var(--radius-lg);
  cursor: pointer;
  font-family: inherit;
  transition: border-color .15s ease, transform .15s ease, box-shadow .15s ease;
}
button.offre-formule:hover { border-color: var(--ink); transform: translateY(-2px); box-shadow: var(--shadow-hover); }
button.offre-formule:focus-visible { outline: 3px solid var(--vert); outline-offset: 2px; }
.offre-formule-recommandee { border-color: var(--gold-600, #C58A1E); background: #FFFCF5; }
.offre-formule-ruban {
  position: absolute;
  top: -11px;
  left: 16px;
  background: var(--gold-600, #C58A1E);
  color: #fff;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  padding: 4px 10px;
  border-radius: var(--radius-pill);
}
.offre-formule-prix { font-family: var(--font-titre); font-size: 30px; font-weight: 800; line-height: 1.05; letter-spacing: -.04em; color: var(--ink); }
.offre-formule-periode { font-size: 13.5px; color: var(--ink-soft); font-weight: 500; }
.offre-formule-detail { font-size: 12.5px; color: var(--ink-faint); margin-top: 6px; }
.offre-mention-legale { font-size: 12.5px; color: var(--ink-faint); line-height: 1.55; margin-top: 12px; }
.offre-mention-legale a { color: var(--ink-soft); }
/* Sur la vitrine (non connecte), les formules ne sont pas cliquables : pas de curseur
   main ni d'effet de survol qui laisserait croire a un bouton. */
.offre-formules-vitrine .offre-formule { cursor: default; }

/* Carte d'offre : le liseré orange collé en haut d'un fond gris donnait cet effet de
   trait flottant bizarre. Vraie carte blanche, bordure complete et discrete, accent
   ramene sur le titre et le ruban. */
.carte-offre { background: #fff; border: 1px solid var(--line, #E6E6EA); }
.carte-offre-fiche-pro, .carte-offre-une { border-top: 1px solid var(--line, #E6E6EA); }
.carte-offre-active { background: var(--vert-clair); border-color: transparent; }
.carte-offre-avantages li::before { background: var(--paper); }

/* Espace etablissement : la fiche geree etait un simple texte, on ne voyait pas que
   c'etait cliquable. Vraie carte avec bordure, fleche et effet de survol. */
.carte-fiche-geree {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 20px 22px;
  background: #fff;
  border: 1.5px solid var(--line, #E6E6EA);
  border-radius: var(--radius-lg);
  text-decoration: none;
  color: inherit;
  transition: border-color .15s ease, transform .15s ease, box-shadow .15s ease;
}
.carte-fiche-geree:hover { border-color: var(--ink); transform: translateY(-2px); box-shadow: var(--shadow-hover); }
.carte-fiche-geree-nom { font-family: var(--font-titre); font-size: 20px; font-weight: 700; letter-spacing: -.03em; }
.carte-fiche-geree-meta { font-size: 13px; color: var(--ink-faint); margin-top: 3px; }
.carte-fiche-geree-fleche { flex-shrink: 0; font-size: 20px; color: var(--ink-faint); }

/* --- Agencement de la fiche etablissement (septembre 2026) ------------------------------
   Deux rangees a deux colonnes au lieu d'un empilement en bande etroite : photos + carte,
   puis description + horaires. La colonne principale est nettement plus large (les photos
   doivent dominer), la laterale reste sobre. En dessous de 900px tout repasse en une
   colonne, dans l'ordre de lecture logique. */
.fiche-rangee { display: grid; grid-template-columns: minmax(0, 2.35fr) minmax(280px, 1fr); gap: 28px; align-items: start; margin-top: 28px; }
.fiche-rangee-simple { grid-template-columns: minmax(0, 1fr); }
.fiche-colonne-large { min-width: 0; }
.fiche-colonne-etroite { min-width: 0; }
.fiche-bloc-photos .lieu-photo-principale { margin: 0; }

/* Carte + adresse en colonne laterale : la carte au-dessus, l'adresse et l'itineraire
   juste dessous, dans le meme bloc, pour qu'on lise "ou c'est" d'un seul coup d'oeil. */
.fiche-bloc-localisation { background: var(--paper); border-radius: var(--radius-lg); overflow: hidden; }
.fiche-bloc-localisation #mini-map { margin: 0; border-radius: 0; height: 300px; width: 100%; }
/* Fiche sans photo : la rangee passe en une colonne et la carte s'etirerait sur toute la
   largeur, ce qui donne un aplat de plan disproportionne pour l'information portee. */
.fiche-rangee-simple .fiche-bloc-localisation { max-width: 520px; }
.fiche-adresse-sous-carte { padding: 16px 18px 18px; display: flex; flex-direction: column; gap: 12px; align-items: flex-start; }
.fiche-adresse-texte { font-size: 14.5px; line-height: 1.5; color: var(--ink); margin: 0; }

/* Contact et options : des tuiles cote a cote plutot qu'une liste de lignes. */
.fiche-contact-bloc { margin-top: 28px; }
.fiche-contact-grille { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
.fiche-contact-item { display: flex; align-items: center; gap: 14px; padding: 16px 18px; background: var(--paper); border-radius: var(--radius-lg); text-decoration: none; color: inherit; transition: transform .15s ease, box-shadow .15s ease; }
.fiche-contact-item:hover { transform: translateY(-2px); box-shadow: var(--shadow-hover); }
.fiche-contact-item .info-icone { flex-shrink: 0; }
.fiche-contact-libelle { display: block; font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-faint); }
.fiche-contact-valeur { display: block; font-size: 15px; font-weight: 600; color: var(--ink); margin-top: 2px; word-break: break-word; }
.fiche-contact-item-pro { background: #FFFCF5; }
.fiche-contact-item-pro .fiche-contact-libelle { color: var(--gold-700, #9A6B12); }
.fiche-contact-bloc .fiche-lieu-reseaux { margin-top: 14px; }

/* Mentions de fin de fiche (alcool, certification) : elles etaient collees au bloc
   precedent, d'ou l'impression que l'avertissement appartenait a la carte. */
.fiche-lieu-mentions { margin-top: 34px; padding-top: 26px; border-top: 1px solid var(--line, #E6E6EA); display: flex; flex-direction: column; gap: 12px; }
.fiche-lieu-mentions .alerte-alcool,
.fiche-lieu-mentions .info-halal-inconnue { margin: 0; }

@media (max-width: 900px) {
  .fiche-rangee { grid-template-columns: minmax(0, 1fr); gap: 22px; }
  .fiche-bloc-localisation #mini-map { height: 220px; }
}

/* --- Carte d'offre "riche" (septembre 2026, 2e passe) -----------------------------------
   Premiere tentative : banniere ambre pale, avantages puis prix tout en bas. Deux erreurs.
   (1) Le pale ne fait pas une offre : sur un fond blanc, un beige clair ne se voit pas.
   La banniere est donc un vrai aplat sombre vert-Riwa vire vers l'or, texte blanc dessus.
   (2) Le prix arrivait apres six arguments : on lisait la promesse sans savoir ce qu'elle
   coutait. Le prix est desormais juste sous la banniere, en 44px, et les avantages
   viennent apres, sous un intertitre, pour justifier le montant.
   La couleur reste concentree sur la banniere et le ruban : le reste de la carte est blanc,
   pour que ca reste une offre et pas un encart publicitaire. */
.carte-offre-riche { padding: 0; overflow: hidden; gap: 0; border-color: var(--line-fort, #D5D7E1); box-shadow: 0 10px 30px -18px rgba(11, 44, 30, .4); }
.carte-offre-banniere {
  position: relative;
  padding: 30px 28px 26px;
  background: linear-gradient(135deg, var(--emerald-900, #0B2C1E) 0%, var(--emerald-800, #0E4630) 55%, #6E5411 100%);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 4px;
  overflow: hidden;
}
/* Halo dore en haut a droite : donne du relief a l'aplat sans image ni degrade complexe. */
.carte-offre-banniere::after {
  content: '';
  position: absolute;
  top: -70px;
  right: -50px;
  width: 210px;
  height: 210px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(245,165,36,.45) 0%, rgba(245,165,36,0) 70%);
  pointer-events: none;
}
.carte-offre-une .carte-offre-banniere { background: linear-gradient(135deg, var(--emerald-900, #0B2C1E) 0%, var(--emerald-700, #007A50) 100%); }
.carte-offre-une .carte-offre-banniere::after { background: radial-gradient(circle, rgba(33,197,138,.4) 0%, rgba(33,197,138,0) 70%); }
.carte-offre-eyebrow { position: relative; z-index: 1; font-size: 10.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--gold-500, #FFC96B); }
.carte-offre-une .carte-offre-eyebrow { color: var(--emerald-500, #21C58A); }
.carte-offre h3.carte-offre-titre-grand {
  position: relative;
  z-index: 1;
  font-family: var(--font-titre);
  font-size: 40px;
  font-weight: 800;
  letter-spacing: -.045em;
  line-height: 1;
  text-transform: none;
  color: #fff;
  margin: 4px 0 0;
}
.carte-offre-accroche { position: relative; z-index: 1; font-size: 15.5px; line-height: 1.5; color: rgba(255,255,255,.82); margin: 10px 0 0; max-width: 46ch; }
.carte-offre-banniere .badge-en-avant { position: relative; z-index: 1; margin-top: 14px; }

/* Le corps de la carte reprend le padding que .carte-offre-riche a remis a zero. */
.carte-offre-riche .carte-offre-corps,
.carte-offre-riche .carte-offre-boutons,
.carte-offre-riche > .offre-formules,
.carte-offre-riche > .offre-mention-legale { padding-left: 28px; padding-right: 28px; }
.carte-offre-riche .carte-offre-boutons { padding-top: 24px; padding-bottom: 0; }
.carte-offre-riche > .offre-formules { margin-top: 24px; width: auto; }
.carte-offre-riche > .offre-mention-legale { padding-bottom: 4px; }
.carte-offre-riche > .aide-champ, .carte-offre-riche > form { margin-left: 28px; margin-right: 28px; margin-bottom: 22px; }

/* Bloc "Ce que ca change" : separe des prix par un filet, sur un fond tres legerement
   teinte pour qu'on voie que c'est une autre nature d'information. */
.carte-offre-riche .carte-offre-corps { margin-top: 22px; padding-top: 24px; padding-bottom: 28px; border-top: 1px solid var(--line, #E6E7EE); background: var(--paper); }
.carte-offre-sous-titre { font-size: 11px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--gold-700, #9A6B00); margin: 0 0 18px; }
.carte-offre-une .carte-offre-sous-titre { color: var(--vert-fonce); }
.carte-offre-riche .carte-offre-avantages { margin: 0; gap: 18px; }
.carte-offre-avantages li { align-items: flex-start; }
.carte-offre-avantages li::before { margin-top: 1px; }

/* La coche etait un caractere gris dans un rond blanc : invisible. Pastille pleine aux
   couleurs de l'offre, coche blanche dedans -- c'est ce qui fait qu'on percoit une LISTE
   D'AVANTAGES et pas un paragraphe a puces. */
.carte-offre-riche .carte-offre-avantages li::before {
  background: var(--gold-600, #F5A524);
  color: #fff;
  width: 22px;
  height: 22px;
  font-size: 12px;
  box-shadow: 0 2px 6px -1px rgba(197, 138, 30, .5);
}
.carte-offre-riche.carte-offre-une .carte-offre-avantages li::before { background: var(--vert); color: #fff; box-shadow: 0 2px 6px -1px rgba(0, 160, 106, .45); }
.avantage-titre { display: block; font-size: 16px; font-weight: 700; color: var(--ink); line-height: 1.3; letter-spacing: -.015em; }
.avantage-detail { display: block; font-size: 13.5px; color: var(--ink-soft); line-height: 1.55; margin-top: 4px; }
/* Le mot ou le chiffre qui porte la promesse : c'est ce que l'oeil accroche quand on
   parcourt la liste en diagonale. */
.avantage-fort { color: var(--gold-700, #9A6B00); }
.carte-offre-une .avantage-fort { color: var(--vert-fonce); }
.avantage-detail .avantage-fort { font-weight: 700; }

/* Prix : c'est le premier chiffre que le commercant cherche, il doit dominer la carte. */
.carte-offre-riche .offre-formule { padding: 22px 18px 20px; }
.carte-offre-riche .offre-formule-prix { font-size: 44px; }
.carte-offre-riche .offre-formule-periode { font-size: 15px; color: var(--ink); }
.carte-offre-riche .offre-formule-detail { font-size: 13px; }
.carte-offre-riche .offre-formule-recommandee { background: var(--gold-100, #FFF3DC); border-color: var(--gold-600, #F5A524); border-width: 2px; }

/* La vitrine publique impose son propre padding aux cartes (.bloc-offres-vitrine
   .carte-offre) : plus specifique que .carte-offre-riche, donc a neutraliser ici. */
.bloc-offres-vitrine .carte-offre-riche { padding: 0; gap: 0; }
.bloc-offres-vitrine .carte-offre-riche .carte-offre-corps,
.bloc-offres-vitrine .carte-offre-riche > .offre-formules,
.bloc-offres-vitrine .carte-offre-riche > .offre-mention-legale { padding-left: 34px; padding-right: 34px; }
.bloc-offres-vitrine .carte-offre-banniere { padding: 38px 34px 32px; }
.bloc-offres-vitrine .carte-offre h3.carte-offre-titre-grand { font-size: 46px; }

@media (max-width: 480px) {
  .carte-offre-banniere { padding: 24px 20px 20px; }
  .carte-offre h3.carte-offre-titre-grand,
  .bloc-offres-vitrine .carte-offre h3.carte-offre-titre-grand { font-size: 30px; }
  .carte-offre-riche .carte-offre-corps,
  .carte-offre-riche .carte-offre-boutons,
  .carte-offre-riche > .offre-formules,
  .carte-offre-riche > .offre-mention-legale,
  .bloc-offres-vitrine .carte-offre-riche .carte-offre-corps,
  .bloc-offres-vitrine .carte-offre-riche > .offre-formules,
  .bloc-offres-vitrine .carte-offre-riche > .offre-mention-legale { padding-left: 20px; padding-right: 20px; }
  .carte-offre-riche .offre-formule-prix { font-size: 34px; }
}

/* --- Ecran "Mes informations personnelles" (septembre 2026) -----------------------------
   Une fiche d'identite, pas un menu : chaque ligne montre un libelle et sa valeur, et un
   cadenas signale ce qui n'est pas modifiable. */
.info-compte { margin-top: 16px; background: #fff; border: 1px solid var(--line, #E6E7EE); border-radius: var(--radius-lg); overflow: hidden; }
.info-compte-ligne { display: flex; align-items: center; gap: 14px; padding: 15px 20px; border-bottom: 1px solid var(--line, #E6E7EE); }
.info-compte-ligne:last-child { border-bottom: none; }
.info-compte-libelle { flex: 0 0 170px; font-size: 13px; font-weight: 600; color: var(--ink-faint); }
.info-compte-valeur { flex: 1; font-size: 15.5px; color: var(--ink); font-weight: 600; word-break: break-word; }
.info-compte-vide { color: var(--ink-faint); font-weight: 400; font-style: italic; }
.info-compte-verrou { flex-shrink: 0; font-size: 13px; opacity: .5; }
@media (max-width: 600px) {
  .info-compte-ligne { flex-wrap: wrap; gap: 2px 14px; }
  .info-compte-libelle { flex-basis: 100%; }
}

/* La suppression de compte est une sortie de secours : elle doit rester trouvable, jamais
   se presenter comme une action parmi d'autres. Avant, c'etait un bouton rouge de la meme
   taille que "Modifier mes informations". */
.ligne-supprimer-compte { margin-top: 36px; padding-top: 20px; border-top: 1px solid var(--line, #E6E7EE); }
.ligne-supprimer-compte a { font-size: 13px; color: var(--ink-faint); text-decoration: underline; }
.ligne-supprimer-compte a:hover { color: var(--rouge, #E5484D); }

/* Page "Modifier mes infos" : trois blocs autonomes, chacun avec son propre bouton. */
.bloc-modif-compte { text-align: left; margin-top: 30px; padding-top: 26px; border-top: 1px solid var(--line, #E6E7EE); }
.bloc-modif-compte:first-of-type { margin-top: 22px; padding-top: 0; border-top: none; }
.bloc-modif-compte h2 { font-size: 21px; font-weight: 700; letter-spacing: -.03em; margin: 0 0 6px; }
.bloc-modif-compte .form-commercant { margin-top: 12px; }

/* Encadre de conditions (formulaire Decouvertes) : ce que le visiteur doit avoir lu avant
   de remplir. Ambre et non gris : c'est une condition d'acces, pas une note de bas de page. */
.encadre-conditions { background: var(--amber-bg, #FFF7E6); border-left: 4px solid var(--gold-600, #F5A524); border-radius: var(--radius-md); padding: 18px 20px; margin: 4px 0 22px; }
.encadre-conditions p { font-size: 14.5px; line-height: 1.6; color: var(--amber-ink, #8A5E00); margin: 0 0 10px; }
.encadre-conditions p:last-child { margin-bottom: 0; }
.encadre-conditions strong { color: var(--amber-strong, #C77700); }

/* Intro de page qui n'a pas a etre bridee a 62ch (liste courte, pas un paragraphe de
   lecture longue) : evite une coupure de ligne au milieu d'une enumeration. */
.intro-large { max-width: 90ch; }

/* Statut de moderation des publications communaute (septembre 2026).
   Une publication envoyee par une association passe par une file de validation avant
   d'apparaitre sur le site : ces pastilles rendent l'etat lisible d'un coup d'oeil, cote
   admin (tableau) comme cote gestionnaire (historique de ses publications). */
.statut-annonce { display: inline-block; padding: 3px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; white-space: nowrap; }
.statut-annonce-en_attente { background: var(--amber-bg); color: var(--amber-strong); border: 1px solid var(--gold-500); }
.statut-annonce-publiee { background: var(--vert-clair); color: var(--vert-fonce); border: 1px solid var(--vert); }
.statut-annonce-refusee { background: var(--danger-bg); color: var(--danger-fonce); border: 1px solid var(--danger); }
.admin-table tr.ligne-a-traiter { background: var(--amber-bg); }

/* Tableau des durees de conservation (politique de confidentialite, sept. 2026).
   Le RGPD (art. 13.2.a) impose d'indiquer une duree ou des criteres precis : un tableau
   se lit mieux qu'un paragraphe, et se met a jour sans reecrire le texte autour. */
.tableau-legal { width: 100%; border-collapse: collapse; margin: 16px 0 20px; font-size: 14.5px; }
.tableau-legal th, .tableau-legal td { text-align: left; padding: 10px 12px; border-bottom: 1px solid var(--line); vertical-align: top; }
.tableau-legal thead th { background: var(--paper); font-weight: 600; font-size: 14px; }
.tableau-legal tbody tr:last-child td { border-bottom: none; }
@media (max-width: 600px) { .tableau-legal { font-size: 13.5px; } .tableau-legal th, .tableau-legal td { padding: 8px 9px; } }

/* ============================================================
   FICHE ASSOCIATION (septembre 2026, restructuration)
   Sections nettes plutot qu'une suite de paragraphes : une
   association a plus a dire qu'un commerce, il faut que ca se
   parcoure. Aucune couleur nouvelle -- on reutilise les aplats
   gris du reste du site.
   ============================================================ */
.asso-bloc { margin: 36px 0 0; }
.asso-bloc-titre { font-family: var(--font-titre); font-size: 20px; font-weight: 700; letter-spacing: -.03em; margin: 0 0 16px; }

.asso-publications { display: grid; gap: 10px; }
/* Septembre 2026 : vignette a gauche, texte a droite. Avant, la photo occupait toute la
   largeur de la carte -- une image de 300px etiree a 900px, donc floue -- et le texte
   d'une publication sans espaces (un mot de 400 caracteres) sortait de la carte sans
   jamais revenir a la ligne. */
.asso-publication {
  display: flex; align-items: flex-start; gap: 16px;
  padding: 16px 18px; background: var(--paper); border-radius: var(--radius-md);
  text-decoration: none; color: var(--ink); transition: background .15s;
}
.asso-publication:hover { background: var(--paper-2); }
.asso-publication-vignette { flex: 0 0 auto; }
.asso-publication-vignette img { display: block; width: 96px; height: 96px; object-fit: cover; border-radius: var(--radius-sm); background: #fff; }
.asso-publication-corps { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 7px; }
.asso-publication-entete { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.asso-publication-date { font-size: 12.5px; color: var(--ink-faint); }
/* overflow-wrap: anywhere -- un titre ou un texte colle sans espace doit se couper
   plutot que deborder de la carte. */
.asso-publication-titre { font-family: var(--font-titre); font-size: 17px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; color: var(--ink); overflow-wrap: anywhere; }
.asso-publication-texte { font-size: 14.5px; line-height: 1.55; color: var(--ink-soft); overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }

@media (max-width: 560px) {
  .asso-publication { gap: 12px; padding: 14px; }
  .asso-publication-vignette img { width: 72px; height: 72px; }
}

/* Publications d'une association (sept. 2026) : le formulaire produit desormais un article
   -- titre, texte long, photos, informations pratiques. L'historique dans l'espace
   etablissement le rend sous forme de cartes, pour que le gerant voie ses publications
   telles qu'elles paraitront, et pas comme des lignes de tableau. */
.publications-liste { display: grid; gap: 14px; }
.publication-carte { display: flex; flex-direction: column; gap: 10px; padding: 18px 20px; background: var(--paper); border-radius: var(--radius-md); }
.publication-carte-entete { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.publication-carte-date { font-size: 12.5px; color: var(--ink-faint); }
.publication-carte-titre { font-family: var(--font-titre); font-size: 19px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; margin: 0; color: var(--ink); }
.publication-carte-pratique { font-size: 13.5px; color: var(--ink-faint); margin: 0; }
.publication-carte-photos { display: flex; gap: 8px; flex-wrap: wrap; }
.publication-carte-photos img { width: 108px; height: 80px; object-fit: cover; border-radius: var(--radius-sm); display: block; }
.publication-carte-texte { font-size: 15px; line-height: 1.6; color: var(--ink-soft); margin: 0; max-width: 68ch; }
.publication-carte-texte p { margin: 0 0 .9em; overflow-wrap: anywhere; }
.publication-carte-texte p:last-child { margin-bottom: 0; }
.publication-carte-lien { font-size: 13.5px; margin: 0; }
.publication-carte-lien a { color: var(--vert); }
.publication-carte-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }

/* Titre de publication dans les flux publics (accueil + timeline /communaute) : c'est lui
   qu'on lit en premier, le nom de l'etablissement n'est plus que l'attribution. */
.feed-item-titre { display: block; font-family: var(--font-titre); font-size: 17px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; color: var(--ink); margin-top: 8px; }
.timeline-titre { display: block; font-family: var(--font-titre); font-size: 18px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; color: var(--ink); margin-top: 6px; }
.timeline-vignette { display: block; margin-top: 10px; }
.timeline-vignette img { display: block; width: 100%; max-width: 320px; height: 150px; object-fit: cover; border-radius: var(--radius-sm); }

/* Page article d'une publication : sur-titre (nom de l'etablissement) + bloc pratique. */
.annonce-surtitre { font-size: 13.5px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-faint); margin: 8px 0 2px; }
.annonce-pratique { background: var(--paper); border-radius: var(--radius-lg); padding: 22px 26px; margin: 0 0 36px; max-width: 72ch; }
.annonce-pratique h2 { font-family: var(--font-titre); font-size: 17px; font-weight: 700; letter-spacing: -.02em; margin: 0 0 14px; }
.annonce-pratique dl { margin: 0; display: grid; gap: 10px; }
.annonce-pratique dl > div { display: flex; gap: 14px; align-items: baseline; }
.annonce-pratique dt { flex: 0 0 110px; font-size: 13px; font-weight: 600; color: var(--ink-faint); }
.annonce-pratique dd { margin: 0; font-size: 15px; color: var(--ink); }

.admin-note-photos { font-size: 12px; color: var(--ink-faint); }

@media (max-width: 640px) {
  .publication-carte-photos img { width: 86px; height: 64px; }
  .annonce-texte-complet { padding: 20px 20px 20px 22px; font-size: 16.5px; }
  .annonce-pratique { padding: 16px 18px; }
  .annonce-pratique dl > div { flex-direction: column; gap: 2px; }
  .annonce-pratique dt { flex: none; }
  .timeline-vignette img { height: 120px; }
}

.asso-rangee { display: flex; flex-wrap: wrap; gap: 18px; align-items: flex-start; }
.asso-adresse { flex: 1 1 260px; background: var(--paper); border-radius: var(--radius-md); padding: 16px 18px; }
.asso-adresse .fiche-adresse-texte { margin: 0 0 12px; }

.asso-contacts { display: grid; gap: 10px; margin-bottom: 14px; }
.asso-contact {
  display: flex; flex-direction: column; gap: 2px;
  padding: 14px 18px; background: var(--paper); border-radius: var(--radius-md);
  text-decoration: none; color: var(--ink); transition: background .15s;
}
.asso-contact:hover { background: var(--paper-2); }
.asso-contact-libelle { font-size: 11px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; color: var(--ink-faint); }
.asso-contact-valeur { font-size: 15px; font-weight: 500; }

@media (min-width: 640px) {
  .asso-contacts { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
}

/* Question fermee oui/non dans un formulaire (ex. « Êtes-vous le responsable
   de cet établissement ? » sur la demande Découvertes). Un fieldset plutot
   qu'une simple paire de radios : le lecteur d'ecran annonce la question
   avant les deux reponses, ce qu'un <label> seul ne permet pas. */
.champ-oui-non { border: 1px solid var(--line); border-radius: var(--radius-md); padding: 14px 18px 12px; margin: 4px 0 14px; }
.champ-oui-non legend { font-size: 14px; font-weight: 500; padding: 0 6px; color: var(--ink); }
.champ-oui-non .label-case { margin: 6px 0; }

/* Variante du panneau Fiche Pro affichee dans le compte (onglet « Mettre en avant ») :
   meme panneau que la page publique, mais les formules sont des BOUTONS de paiement et
   l'etat de l'abonnement remplace les tarifs une fois l'offre active. */
.fp-page-compte { margin: 24px 0 0; max-width: none; }
.fp-page-compte .fp-titre { font-size: 40px; }

.fp-prix-form { display: contents; }
button.fp-prix-option {
  font: inherit; text-align: left; cursor: pointer; width: 100%;
  transition: border-color .15s, background .15s, transform .12s;
}
button.fp-prix-option:hover { border-color: rgba(245, 165, 36, .75); background: rgba(245, 165, 36, .14); transform: translateY(-2px); }
button.fp-prix-option:focus-visible { outline: 2px solid #F5A524; outline-offset: 3px; }

.fp-etat {
  position: relative;
  margin-top: 36px; padding-top: 32px;
  border-top: 1px solid rgba(255, 255, 255, .10);
}
.fp-etat-badge {
  display: inline-block; margin: 0 0 12px;
  background: rgba(245, 165, 36, .16); color: #FFD98A;
  border: 1px solid rgba(245, 165, 36, .45);
  border-radius: var(--radius-pill); padding: 7px 15px;
  font-size: 13.5px; font-weight: 600;
}
.fp-etat-texte { margin: 0 0 16px; font-size: 14.5px; line-height: 1.6; color: rgba(255, 255, 255, .74); }
.fp-etat-texte a { color: #FFD98A; }
.fp-bouton-resilier {
  font: inherit; cursor: pointer;
  background: transparent; color: rgba(255, 255, 255, .88);
  border: 1px solid rgba(255, 255, 255, .28); border-radius: var(--radius-pill);
  padding: 11px 22px; font-size: 14.5px; font-weight: 500;
  transition: background .15s, border-color .15s;
}
.fp-bouton-resilier:hover { background: rgba(255, 255, 255, .08); border-color: rgba(255, 255, 255, .5); }

/* Mise en avant « Découvertes » en cours : information, pas une offre a vendre. */
.bloc-une-active { margin-top: 20px; padding: 18px 22px; background: var(--gold-100, #FFF3DC); border-radius: var(--radius-md); }
.bloc-une-active-titre { margin: 0 0 4px; font-weight: 600; color: var(--gold-ink, #8A5E00); }
.bloc-une-active-texte { margin: 0; font-size: 14px; color: var(--ink-soft); }

/* ==========================================================================
   ESPACE D'ADMINISTRATION — septembre 2026, refonte complète.

   L'ancien back-office empilait des <h2 style="margin-top:32px"> et des liens
   soulignés de 12px en guise de boutons, sur des pages qui mélangeaient files
   d'attente et tableaux de consultation. Ce n'était pas un outil de gestion,
   c'était un affichage de base de données.

   Le nouveau repose sur quatre règles :
     1. une page = un objet métier, et la navigation est une colonne fixe qui
        porte le nombre d'éléments en attente — on voit son travail sans cliquer ;
     2. chaque page s'ouvre sur ce qui attend une décision ; ce qui est traité
        est replié ;
     3. les actions sont de vrais boutons, hiérarchisés en trois niveaux
        (principal / secondaire / destructeur), jamais des liens soulignés ;
     4. un seul jeu de composants (.ad-*) pour toutes les pages, donc une
        correction profite partout.

   Le préfixe court .ad- évite toute collision avec les .admin-* historiques
   encore utilisées par le formulaire de fiche.
   ========================================================================== */

.ad-shell { display: grid; grid-template-columns: 248px minmax(0, 1fr); gap: 26px; align-items: start; max-width: 1560px; margin: 0 auto; padding: 0 clamp(16px, 3vw, 40px) 60px; }

/* --- Colonne de navigation --- */
.ad-rail { position: sticky; top: 18px; background: var(--noir); border-radius: var(--radius-lg); padding: 22px 16px 16px; display: flex; flex-direction: column; gap: 4px; }
.ad-rail-marque { font-family: var(--font-titre); font-size: 13px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: rgba(255,255,255,.5); padding: 0 12px 16px; }
.ad-rail-lien { display: flex; align-items: center; gap: 10px; padding: 11px 13px; border-radius: var(--radius-sm); font-size: 14.5px; font-weight: 500; color: rgba(255,255,255,.72); text-decoration: none; transition: background .14s, color .14s; }
.ad-rail-lien:hover { background: rgba(255,255,255,.08); color: #fff; }
.ad-rail-actif, .ad-rail-actif:hover { background: #fff; color: var(--ink); font-weight: 650; }
.ad-rail-libelle { flex: 1 1 auto; }
/* Pastille de file d'attente : c'est elle qui fait de la navigation un plan de
   travail. Elle n'apparaît QUE s'il y a réellement quelque chose à traiter --
   un « 0 » permanent devient invisible à force et bruite la lecture. */
.ad-pastille { flex: 0 0 auto; min-width: 21px; height: 21px; padding: 0 7px; border-radius: var(--radius-pill); background: var(--terre-600); color: #fff; font-size: 11.5px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; }
.ad-rail-actif .ad-pastille { background: var(--terre-600); color: #fff; }
.ad-rail-sortie { margin-top: 14px; padding: 11px 13px; border-top: 1px solid rgba(255,255,255,.12); font-size: 13px; color: rgba(255,255,255,.55); text-decoration: none; }
.ad-rail-sortie:hover { color: #fff; }

/* --- En-tête de page --- */
.ad-main { min-width: 0; }
.ad-entete { display: flex; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; gap: 16px; padding: 10px 0 24px; }
.ad-entete h1 { font-family: var(--font-titre); font-size: clamp(26px, 3vw, 34px); font-weight: 800; letter-spacing: -.04em; margin: 0; }
.ad-entete-sous { margin: 7px 0 0; font-size: 14.5px; color: var(--ink-soft); max-width: 72ch; line-height: 1.55; }
.ad-entete-actions { display: flex; flex-wrap: wrap; gap: 10px; }

.ad-flash { background: var(--vert-clair); color: var(--vert-fonce); border-radius: var(--radius-md); padding: 14px 18px; margin: 0 0 22px; font-size: 14.5px; font-weight: 500; }
.ad-flash-erreur { background: var(--danger-bg); color: var(--danger-fonce); }

/* --- Bloc de section : l'unité de base de toutes les pages --- */
.ad-bloc { background: var(--paper); border-radius: var(--radius-lg); padding: 24px 26px 26px; margin-bottom: 20px; }
.ad-bloc-entete { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 14px; margin-bottom: 18px; }
.ad-bloc-entete h2 { font-family: var(--font-titre); font-size: 19px; font-weight: 700; letter-spacing: -.025em; margin: 0; }
.ad-bloc-aide { flex: 1 1 100%; margin: -8px 0 0; font-size: 13.5px; color: var(--ink-soft); line-height: 1.55; max-width: 80ch; }
.ad-bloc-actions { margin-left: auto; display: flex; flex-wrap: wrap; gap: 8px; }
.ad-compte { display: inline-flex; align-items: center; justify-content: center; min-width: 24px; height: 24px; padding: 0 9px; border-radius: var(--radius-pill); background: #fff; color: var(--ink-soft); font-size: 12.5px; font-weight: 700; }
.ad-compte-actif { background: var(--terre-600); color: #fff; }
.ad-vide { margin: 0; padding: 22px; text-align: center; font-size: 14px; color: var(--ink-faint); background: #fff; border-radius: var(--radius-md); }

/* --- Boutons. Trois niveaux, et c'est tout. --- */
.ad-btn { display: inline-flex; align-items: center; gap: 7px; font: inherit; font-size: 13.5px; font-weight: 600; line-height: 1; padding: 10px 16px; border-radius: var(--radius-pill); border: none; cursor: pointer; text-decoration: none; white-space: nowrap; transition: background .14s, color .14s; }
.ad-btn-primaire { background: var(--vert); color: #fff; }
.ad-btn-primaire:hover { background: var(--vert-fonce); }
.ad-btn-fantome { background: #fff; color: var(--ink); }
.ad-btn-fantome:hover { background: var(--paper-2); }
.ad-btn-danger { background: transparent; color: var(--danger); box-shadow: inset 0 0 0 1px rgba(229,72,77,.35); }
.ad-btn-danger:hover { background: var(--danger-bg); }
.ad-btn-petit { font-size: 12.5px; padding: 7px 12px; }
.ad-btn-bloc { width: 100%; justify-content: center; }
.ad-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.ad-form-inline { display: inline; margin: 0; }

/* --- Tableaux --- */
.ad-table-enveloppe { overflow-x: auto; border-radius: var(--radius-md); background: #fff; }
.ad-table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.ad-table th { padding: 12px 16px; text-align: left; font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-faint); border-bottom: 1px solid var(--line); white-space: nowrap; }
.ad-table td { padding: 14px 16px; border-bottom: 1px solid var(--line); vertical-align: middle; }
.ad-table tbody tr:last-child td { border-bottom: none; }
.ad-table tbody tr:hover { background: var(--paper); }
.ad-table a { color: var(--vert-fonce); font-weight: 600; text-decoration: none; }
.ad-table a:hover { text-decoration: underline; }
.ad-table-nom { font-weight: 600; color: var(--ink); }
.ad-table-secondaire { display: block; font-size: 12.5px; color: var(--ink-faint); margin-top: 3px; }
.ad-table td.ad-cellule-actions { white-space: nowrap; }
.ad-cellule-actions .ad-actions { justify-content: flex-end; }
.ad-ligne-attente { background: var(--amber-bg); }
.ad-ligne-attente:hover { background: var(--amber-bg); }

/* --- Badges d'état : un seul vocabulaire visuel dans tout le back-office --- */
.ad-badge { display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px; font-weight: 700; letter-spacing: .02em; padding: 5px 11px; border-radius: var(--radius-pill); white-space: nowrap; }
.ad-badge-attente { background: var(--amber-bg); color: var(--amber-strong); }
.ad-badge-ok { background: var(--vert-clair); color: var(--vert-fonce); }
.ad-badge-refus { background: var(--danger-bg); color: var(--danger-fonce); }
.ad-badge-neutre { background: var(--paper-2); color: var(--ink-soft); }
.ad-badge-or { background: var(--gold-100); color: var(--gold-ink); }
.ad-badge-info { background: #E8EEFE; color: #2A46A8; }

/* --- Filtres par type (boîte de réception) --- */
.ad-filtres { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 20px; }
.ad-filtre { display: inline-flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; color: var(--ink-soft); background: var(--paper); padding: 9px 16px; border-radius: var(--radius-pill); text-decoration: none; }
.ad-filtre:hover { background: var(--paper-2); color: var(--ink); }
.ad-filtre-actif, .ad-filtre-actif:hover { background: var(--ink); color: #fff; }
.ad-filtre-nb { font-size: 11.5px; font-weight: 700; opacity: .7; }

/* --- Tableau de bord --- */
.ad-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 14px; }
.ad-stat { background: #fff; border-radius: var(--radius-md); padding: 20px 22px; text-decoration: none; color: var(--ink); display: block; }
.ad-stat:hover { background: var(--paper-2); }
.ad-stat-nb { font-family: var(--font-titre); font-size: 32px; font-weight: 800; letter-spacing: -.04em; line-height: 1; }
.ad-stat-label { display: block; margin-top: 7px; font-size: 13px; color: var(--ink-soft); line-height: 1.4; }

/* File de travail : une ligne = une chose à trancher, quel que soit son type. */
.ad-file { display: flex; flex-direction: column; gap: 8px; }
.ad-file-item { display: flex; align-items: center; gap: 14px; background: #fff; border-radius: var(--radius-md); padding: 14px 18px; text-decoration: none; color: var(--ink); }
.ad-file-item:hover { background: var(--paper-2); }
.ad-file-corps { flex: 1 1 auto; min-width: 0; }
.ad-file-titre { display: block; font-size: 14.5px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ad-file-meta { display: block; font-size: 12.5px; color: var(--ink-faint); margin-top: 3px; }
.ad-file-fleche { flex: 0 0 auto; color: var(--ink-faint); font-size: 18px; }

/* --- Publications en attente de modération : aperçu fidèle, pas une ligne de
   tableau. On valide en voyant ce que le visiteur verra. --- */
.ad-moderation { display: grid; grid-template-columns: repeat(auto-fill, minmax(380px, 1fr)); gap: 16px; }
.ad-moderation-carte { background: #fff; border-radius: var(--radius-md); padding: 20px 22px; display: flex; flex-direction: column; gap: 10px; }
.ad-moderation-entete { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.ad-moderation-etab { font-size: 12.5px; color: var(--ink-faint); }
.ad-moderation-titre { font-family: var(--font-titre); font-size: 18px; font-weight: 700; letter-spacing: -.02em; line-height: 1.25; margin: 0; }
.ad-moderation-pratique { margin: 0; font-size: 12.5px; color: var(--ink-faint); }
.ad-moderation-texte { margin: 0; font-size: 14px; line-height: 1.6; color: var(--ink-soft); }
.ad-moderation-texte p { margin: 0 0 .85em; overflow-wrap: anywhere; }
.ad-moderation-texte p:last-child { margin-bottom: 0; }
.ad-moderation-photos { display: flex; gap: 8px; flex-wrap: wrap; }
.ad-moderation-photos img { width: 96px; height: 72px; object-fit: cover; border-radius: var(--radius-sm); display: block; }
.ad-moderation-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; padding-top: 14px; border-top: 1px solid var(--line); }

/* --- Formulaires dans un bloc admin --- */
.ad-form { display: flex; flex-direction: column; gap: 14px; max-width: 720px; }
.ad-form label { display: flex; flex-direction: column; gap: 6px; font-size: 13.5px; font-weight: 600; color: var(--ink-soft); }
.ad-form input[type="text"], .ad-form input[type="email"], .ad-form input[type="date"], .ad-form input[type="url"], .ad-form input[type="tel"], .ad-form select, .ad-form textarea { font: inherit; font-size: 14.5px; font-weight: 400; color: var(--ink); background: #fff; border: 1px solid var(--line-fort); border-radius: var(--radius-sm); padding: 11px 14px; width: 100%; }
.ad-form textarea { resize: vertical; line-height: 1.55; }
.ad-form .ad-case { flex-direction: row; align-items: flex-start; gap: 10px; font-weight: 500; color: var(--ink); }
.ad-form .ad-case input { margin-top: 2px; }
.ad-form-rangee { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; }
.ad-form-rangee > label { flex: 1 1 170px; }
.ad-aide { font-size: 13px; color: var(--ink-faint); line-height: 1.5; margin: 0; }

/* --- Repli de ce qui est traité --- */
.ad-replie { margin-top: 16px; }
.ad-replie > summary { cursor: pointer; font-size: 13.5px; font-weight: 600; color: var(--ink-faint); padding: 10px 0; list-style: none; }
.ad-replie > summary::-webkit-details-marker { display: none; }
.ad-replie > summary::before { content: '▸ '; }
.ad-replie[open] > summary::before { content: '▾ '; }
.ad-replie > summary:hover { color: var(--ink); }

/* --- Responsive : la colonne passe en barre horizontale défilante --- */
@media (max-width: 1080px) {
  .ad-shell { grid-template-columns: minmax(0, 1fr); gap: 18px; padding: 0 16px 48px; }
  .ad-rail { position: static; flex-direction: row; align-items: center; gap: 6px; overflow-x: auto; padding: 12px; border-radius: var(--radius-md); }
  .ad-rail-marque { display: none; }
  .ad-rail-lien { white-space: nowrap; padding: 10px 14px; }
  .ad-rail-sortie { margin: 0 0 0 auto; border-top: none; white-space: nowrap; }
  .ad-bloc { padding: 20px 18px 22px; }
  .ad-moderation { grid-template-columns: minmax(0, 1fr); }
}

/* ============================================================
   FICHE PRO — identite visuelle (septembre 2026)
   L'abonnement payant ne se voyait nulle part : dans l'annuaire, la carte d'un
   abonne etait identique a celle du voisin qui ne paie rien ; sur sa fiche, il
   n'avait qu'un petit badge perdu dans une rangee de pastilles. On reprend ici
   les deux seules couleurs de la page d'offre -- vert profond et dore -- pour
   que ce que le commercant a vu en achetant soit exactement ce qu'il obtient.
   Deux endroits, un seul langage :
     .lieu-card-pro  : la carte dans les listes de l'annuaire
     .fiche-lieu-pro : toute la page de la fiche
   ============================================================ */

/* ---------- 1. La carte dans l'annuaire ---------- */
.lieu-card-pro {
  position: relative;
  background:
    radial-gradient(130% 110% at 85% -20%, rgba(245, 165, 36, .22) 0%, transparent 58%),
    linear-gradient(150deg, #12472F 0%, #0B2C1E 60%, #082217 100%);
  color: #fff;
  border: 1px solid rgba(245, 165, 36, .28);
  padding-top: 38px;
}
.lieu-card-pro:hover {
  background:
    radial-gradient(130% 110% at 85% -20%, rgba(245, 165, 36, .30) 0%, transparent 58%),
    linear-gradient(150deg, #155434 0%, #0D3322 60%, #0A2819 100%);
  color: #fff;
}
.lieu-card-pro .nom { color: #fff; }
.lieu-card-pro .adresse { color: rgba(255, 255, 255, .80); }
.lieu-card-pro .ville { color: rgba(255, 255, 255, .58); }
/* Ruban dore en haut a gauche : le meme signal que le prix sur la page d'offre. */
.lieu-card-pro-ruban {
  position: absolute; top: 14px; left: 22px;
  font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: #3D2A00;
  background: linear-gradient(100deg, #FFD98A 0%, #F5A524 55%, #FFC96B 100%);
  padding: 4px 11px; border-radius: var(--radius-pill);
}

/* ---------- 2. La page de la fiche ---------- */
.fiche-lieu-pro {
  position: relative; overflow: hidden;
  border-radius: var(--radius-xl);
  padding: 34px 38px 44px;
  margin-top: 18px;
  background:
    radial-gradient(110% 80% at 50% -12%, #12472F 0%, transparent 60%),
    linear-gradient(168deg, #0B2C1E 0%, #071A12 100%);
  border: 1px solid rgba(245, 165, 36, .22);
  color: #fff;
}
/* Meme voile dore diffus que sur la page d'offre (.fp-halo) : c'est lui qui
   donne la chaleur, sans ajouter d'ombre ni de bordure decorative. */
.fiche-pro-halo {
  position: absolute; top: -200px; left: 50%;
  width: 620px; height: 400px; transform: translateX(-50%);
  background: radial-gradient(circle, rgba(245, 165, 36, .26) 0%, transparent 68%);
  pointer-events: none;
}
.fiche-lieu-pro > * { position: relative; }

.fiche-lieu-pro h1 { color: #fff; }
.fiche-lieu-pro h2, .fiche-lieu-pro h3 { color: #fff; }
.fiche-lieu-pro .fil-ariane, .fiche-lieu-pro .fil-ariane a { color: rgba(255, 255, 255, .58); }
.fiche-lieu-pro .fil-ariane a:hover { color: #FFC96B; }
.fiche-lieu-pro .btn-retour-rond { background: rgba(255, 255, 255, .10); color: #fff; }
.fiche-lieu-pro .btn-retour-rond:hover { background: rgba(255, 255, 255, .18); color: #fff; }

/* Le badge "Fiche Pro" devient dore plein : c'est la seule pastille doree de la
   page, donc la seule que l'oeil isole. */
.fiche-lieu-pro .badge-annonce {
  color: #3D2A00;
  background: linear-gradient(100deg, #FFD98A 0%, #F5A524 55%, #FFC96B 100%);
  font-size: 11.5px; padding: 6px 13px;
}
/* Les autres pastilles (categorie, gamme de prix) passent en contour discret :
   sur fond sombre, leur aplat de couleur d'origine ecrasait le dore. */
.fiche-lieu-pro .type-badge {
  background: rgba(255, 255, 255, .10); color: #fff;
  border: 1px solid rgba(255, 255, 255, .16);
}
.fiche-lieu-pro .info-certification-halal {
  color: #CDEBD9; background: rgba(33, 197, 138, .14);
}
.fiche-lieu-pro .info-halal-inconnue {
  color: rgba(255, 255, 255, .78); background: rgba(255, 255, 255, .06);
  border-left-color: rgba(255, 255, 255, .28);
}
.fiche-lieu-pro .alerte-alcool { color: #FFE0B2; background: rgba(245, 165, 36, .14); }

/* Tous les blocs de contenu reprennent le meme verre translucide : un seul
   materiau sur toute la page, au lieu de six aplats gris differents. */
.fiche-lieu-pro .description-avant,
.fiche-lieu-pro .description-longue,
.fiche-lieu-pro .bloc-horaires,
.fiche-lieu-pro .fiche-lieu-infos,
.fiche-lieu-pro .bloc-fiche-pro-verrouille {
  background: rgba(255, 255, 255, .055);
  border: 1px solid rgba(255, 255, 255, .09);
}
.fiche-lieu-pro .description-avant .description { color: #fff; }
.fiche-lieu-pro .description-longue { color: rgba(255, 255, 255, .86); }
.fiche-lieu-pro .bloc-horaires h3 { color: rgba(255, 255, 255, .55); }
.fiche-lieu-pro .horaire-ligne { border-bottom-color: rgba(255, 255, 255, .10); color: rgba(255, 255, 255, .92); }
.fiche-lieu-pro .horaire-ligne span:first-child { color: rgba(255, 255, 255, .68); }
.fiche-lieu-pro .horaire-iqama, .fiche-lieu-pro .horaire-note-calcul { color: rgba(255, 255, 255, .50); }
.fiche-lieu-pro .info-ligne { border-bottom-color: rgba(255, 255, 255, .10); color: #fff; }
.fiche-lieu-pro .info-icone { background: rgba(255, 255, 255, .10); color: #FFC96B; }
.fiche-lieu-pro .info-ligne a { color: #FFC96B; }

/* Le bouton d'itineraire etait noir sur fond clair : sur fond vert il disparaissait.
   Il devient dore -- c'est l'action principale de la fiche, elle doit rester la plus
   visible de la page. */
.fiche-lieu-pro .btn-itineraire {
  background: linear-gradient(100deg, #FFD98A 0%, #F5A524 55%, #FFC96B 100%);
  color: #3D2A00;
}
.fiche-lieu-pro .reseau-lien {
  background: rgba(255, 255, 255, .08); color: #fff;
  border: 1px solid rgba(255, 255, 255, .14);
}
.fiche-lieu-pro .reseau-lien:hover { background: #FFC96B; color: #3D2A00; border-color: transparent; }
.fiche-lieu-pro .fiche-lieu-mentions { border-top-color: rgba(255, 255, 255, .12); }
.fiche-lieu-pro .lieu-photo-principale { border: 1px solid rgba(255, 255, 255, .10); }
.fiche-lieu-pro .lien-autres-adresses a { color: #FFC96B; }
.fiche-lieu-pro .bloc-completer-fiche { background: rgba(255, 255, 255, .06); color: rgba(255, 255, 255, .86); }

@media (max-width: 640px) {
  .fiche-lieu-pro { padding: 24px 20px 32px; border-radius: var(--radius-lg); }
}

/* ============================================================
   Formulaire de fiche en sections (septembre 2026)
   Le formulaire de l'espace etablissement etait une liste de quinze champs a la
   suite. Les <fieldset> lui donnent des paliers : on voit d'un coup d'oeil ou
   se trouve ce qu'on vient changer, et les declarations qui engagent (halal,
   alcool) sont visuellement isolees du reste.
   ============================================================ */
.form-fiche-sections .form-bloc {
  border: none; margin: 0 0 26px; padding: 22px 24px 8px;
  background: var(--paper); border-radius: var(--radius-lg);
}
.form-fiche-sections .form-bloc > legend {
  font-family: var(--font-titre); font-size: 16px; font-weight: 700;
  letter-spacing: -.02em; color: var(--ink);
  padding: 0; margin: 0 0 4px;
  display: flex; align-items: center; gap: 9px;
}
/* Les champs a l'interieur d'un bloc : le dernier ne traine pas de marge basse,
   sinon chaque bloc se termine par un vide inutile. */
.form-fiche-sections .form-bloc > label:last-child,
.form-fiche-sections .form-bloc > *:last-child { margin-bottom: 14px; }
/* Le bloc Fiche Pro reprend le filet dore : c'est le seul contenu de la page qui
   depend de l'abonnement, il doit se reconnaitre sans lire le titre. */
.form-fiche-sections .form-bloc-pro { border-left: 4px solid var(--gold-600, #F5A524); }
.form-fiche-sections button[type="submit"] { margin-top: 4px; }
@media (max-width: 560px) {
  .form-fiche-sections .form-bloc { padding: 18px 16px 6px; }
}

/* ============================================================
   Page de detail d'une demande admin (septembre 2026)
   Les cartes et les tableaux resument ; cette page montre le dossier tel qu'il a
   ete envoye, champ par champ, pieces jointes comprises. On decide dessus.
   ============================================================ */
.ad-retour { margin: 0 0 16px; }
.ad-retour a { font-size: 14px; font-weight: 600; color: var(--ink-soft); text-decoration: none; }
.ad-retour a:hover { color: var(--ink); }

.ad-detail-entete { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 16px; }
.ad-detail-date { font-size: 13px; color: var(--ink-faint); }

.ad-detail-champs { margin: 0 0 8px; display: grid; gap: 0; }
.ad-detail-champs > div { display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: 18px; padding: 13px 0; border-bottom: 1px solid var(--line, rgba(14,14,20,.08)); }
.ad-detail-champs > div:last-child { border-bottom: none; }
.ad-detail-champs dt { font-size: 13px; font-weight: 600; color: var(--ink-faint); }
.ad-detail-champs dd { margin: 0; font-size: 15px; color: var(--ink); line-height: 1.55; overflow-wrap: anywhere; }

.ad-detail-titre { font-family: var(--font-titre); font-size: 15px; font-weight: 700; letter-spacing: -.01em; margin: 26px 0 12px; }
/* Les pieces jointes etaient de simples liens « 📷 Photo 1 » : il fallait ouvrir chaque
   onglet pour savoir ce qu'on regardait. En vignettes, un coup d'oeil suffit. */
.ad-detail-vignettes { display: flex; flex-wrap: wrap; gap: 12px; }
.ad-detail-vignettes a { display: block; width: 168px; height: 126px; border-radius: var(--radius-md); overflow: hidden; background: var(--paper); }
.ad-detail-vignettes img { display: block; width: 100%; height: 100%; object-fit: cover; }
.ad-detail-signaux { margin: 10px 0 0; }
.ad-detail-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 28px; padding-top: 22px; border-top: 1px solid var(--line, rgba(14,14,20,.08)); }

/* Le lien vers le dossier complet, depuis une carte ou une ligne de tableau. */
.demande-carte-ouvrir, .ad-table-ouvrir { display: inline-block; margin: 2px 0 12px; font-size: 13.5px; font-weight: 600; color: var(--vert-fonce, #0E4630); text-decoration: none; }
.demande-carte-ouvrir:hover, .ad-table-ouvrir:hover { text-decoration: underline; }
.ad-table-ouvrir { margin: 6px 0 0; display: block; }

@media (max-width: 700px) {
  .ad-detail-champs > div { grid-template-columns: 1fr; gap: 3px; }
  .ad-detail-vignettes a { width: 132px; height: 100px; }
}

/* ============================================================
   FICHE PRO — ce qui se voit AVANT la fiche (septembre 2026)
   Jusqu'ici l'abonnement n'agissait que sur la fiche, c'est-a-dire la ou le
   visiteur est deja entre. Ces deux elements travaillent en amont, dans la liste
   ou il compare quarante adresses et n'en ouvrira que deux.
   ============================================================ */

/* --- La photo sur la carte d'annuaire --- */
/* La photo deborde jusqu'aux bords de la carte (marges negatives egales au padding
   de .lieu-card) : une image encadree de gris ferait vignette collee, une image
   pleine largeur fait carte de magazine. */
.lieu-card-pro-photo { padding-top: 0; }
.lieu-card-photo {
  display: block; position: relative;
  margin: -20px -22px 14px; height: 150px; overflow: hidden;
  border-radius: var(--radius-md) var(--radius-md) 0 0;
}
.lieu-card-photo img { display: block; width: 100%; height: 100%; object-fit: cover; }
/* Sur la photo, le ruban passe en superposition au lieu de prendre une ligne. */
.lieu-card-photo .lieu-card-pro-ruban { position: absolute; top: 12px; left: 12px; }

/* Actualite reprise sur la carte : une ligne, jamais deux. Elle informe, elle ne
   raconte pas -- le texte complet est sur la fiche. */
.lieu-card-actu {
  display: block; margin: 2px 0 6px; font-size: 13px; font-weight: 600;
  color: #FFD98A; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* --- Le bandeau d'actualite sur la fiche --- */
/* Place juste sous le nom et avant les photos : c'est une information perissable,
   elle doit etre lue en premier. Le dore la distingue de tout le reste de la page. */
.fiche-actualite {
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin: 0 0 24px; padding: 14px 20px;
  background: rgba(245, 165, 36, .12);
  border-left: 4px solid #F5A524;
  border-radius: var(--radius-md);
}
.fiche-actualite-etiquette {
  flex-shrink: 0; font-size: 10.5px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: #3D2A00;
  background: linear-gradient(100deg, #FFD98A 0%, #F5A524 55%, #FFC96B 100%);
  padding: 4px 11px; border-radius: var(--radius-pill);
}
.fiche-actualite-texte { font-size: 16px; font-weight: 500; line-height: 1.5; overflow-wrap: anywhere; }
/* Sur fond vert profond (fiche Pro), le texte passe en clair. */
.fiche-lieu-pro .fiche-actualite { background: rgba(245, 165, 36, .14); }
.fiche-lieu-pro .fiche-actualite-texte { color: #fff; }

/* --- La galerie de la fiche Pro --- */
/* Une rangee de vignettes sous la couverture : c'est ce qui donne a la fiche Pro une
   SILHOUETTE differente, pas seulement des couleurs differentes. Hauteur fixe pour ne
   pas decaler la colonne carte a cote (voir .fiche-rangee, align-items: start). */
.lieu-photos-galerie { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin-top: 8px; }
.lieu-photo-vignette {
  display: block; padding: 0; border: none; cursor: zoom-in;
  height: 78px; border-radius: var(--radius-sm, 10px); overflow: hidden;
  background: rgba(255, 255, 255, .08); font: inherit;
}
.lieu-photo-vignette img { display: block; width: 100%; height: 100%; object-fit: cover; }
.lieu-photo-vignette:hover { outline: 2px solid #F5A524; outline-offset: 1px; }
.lieu-photo-vignette-plus {
  display: flex; align-items: center; justify-content: center;
  font-size: 16px; font-weight: 700; color: #FFC96B;
  background: rgba(255, 255, 255, .10);
}

@media (max-width: 640px) {
  .lieu-card-photo { height: 132px; }
  .lieu-photo-vignette { height: 62px; }
  .fiche-actualite { padding: 12px 15px; }
  .fiche-actualite-texte { font-size: 15px; }
}

/* --- Accueil : raccorder le hero et la grille de categories (septembre 2026) ----------
   Le bandeau vert et les six cartes de categories etaient deux blocs sans rapport, poses
   l'un sous l'autre. Trois causes, corrigees ici :

   1. Ils n'etaient pas alignes. .hero fait 1400px de large bord a bord ; .section fait
      1400px MOINS 24px de padding de chaque cote. Le bandeau depassait donc de 24px a
      gauche et a droite du titre "Parcourir par categorie" et des cartes -- un decalage
      trop petit pour etre lu comme un effet, assez grand pour qu'on sente que ca cloche.
      Le hero reprend la meme boite que le contenu : les bords tombent au meme endroit.

   2. Le vide entre les deux. 64px de marge de section apres un bloc deja tres haut
      coupait la page en deux. 36px suffisent a separer sans dissocier.

   3. Les cartes etaient des aplats gris. Le gris est la couleur des champs de formulaire
      sur ce site : les categories ressemblaient a des cases a remplir, pas a des liens.
      Elles passent en blanc sur filet fin -- le liset vert du hero, qu'on avait ajoute en
      v189, redevient l'accent qui les rattache au bandeau au lieu de se noyer dans le gris.
*/
.hero { max-width: 1352px; padding-bottom: 56px; }
.hero + .section { margin-top: 36px; }



@media (max-width: 900px) {
  .hero { max-width: none; padding-bottom: 44px; }
  .hero + .section { margin-top: 28px; }
}

/* --- Unification des associations dans l'annuaire (septembre 2026) --------------------
   L'association n'a plus de page a part : sa fiche est une fiche d'annuaire, a laquelle
   s'ajoute un bloc "Ses publications". Ce bloc reprend exactement les classes de
   .asso-publication (vignette a gauche, texte a droite) deja stylees plus haut -- on ne
   redefinit ici que son enveloppe, pour qu'il respire comme les autres sections de la
   fiche (description, horaires, contact) et non comme un element rapporte. */
.fiche-bloc-publications { margin: 30px 0 4px; }
.fiche-bloc-titre {
  font-family: var(--font-titre); font-size: 19px; font-weight: 700;
  letter-spacing: -.02em; color: var(--ink); margin: 0 0 14px;
}

/* Le lien vers les autres adresses d'une enseigne, descendu en bas de fiche en v192 :
   ligne de service discrete, alignee sur "Signaler une erreur" juste en dessous. */
.fiche-enseigne-ligne { margin: 22px 0 0; font-size: 13.5px; }
.fiche-enseigne-ligne a { color: var(--ink-faint); text-decoration: underline; text-underline-offset: 2px; }
.fiche-enseigne-ligne a:hover { color: var(--vert-fonce); }

/* ==========================================================================
   Recherche en pilule (septembre 2026) -- accueil + Annuaire
   --------------------------------------------------------------------------
   Sur la page Annuaire, la barre etait rectangulaire : elle heritait son arrondi de
   ".hero .search input", une regle qui ne s'applique QUE dans le hero. Hors du hero, le
   champ retombait sur le style par defaut du navigateur. Le composant est desormais
   autonome (.search-pilule) : meme rendu partout ou on le pose.
   Un seul contour blanc qui contient le champ ET le bouton : on lit un seul objet, pas
   deux pilules posees cote a cote.
   ========================================================================== */
.search.search-pilule {
  position: relative; display: flex; align-items: center; gap: 6px;
  max-width: 640px; margin: 26px auto 0; padding: 6px;
  background: #fff; border: 1px solid #CFE6DA; border-radius: var(--radius-pill);
  box-shadow: 0 12px 32px rgba(14, 70, 48, .10);
  transition: border-color .15s, box-shadow .15s;
}
.search.search-pilule:focus-within {
  border-color: var(--vert);
  box-shadow: 0 0 0 4px rgba(0, 160, 106, .14), 0 12px 32px rgba(14, 70, 48, .10);
}
.search-pilule-icone {
  position: absolute; left: 22px; top: 50%; transform: translateY(-50%);
  width: 19px; height: 19px; color: var(--ink-faint); pointer-events: none;
}
.search.search-pilule input {
  flex: 1; min-width: 0; margin: 0;
  padding: 13px 10px 13px 46px !important;
  border: none; background: transparent; box-shadow: none; outline: none;
  border-radius: var(--radius-pill); font-family: inherit; font-size: 16px; color: var(--ink);
}
.search.search-pilule input:focus { outline: none; }
.search.search-pilule .btn-recherche-accueil {
  padding: 13px 26px; background: #0E4630; color: #fff; font-weight: 600;
}
.search.search-pilule .btn-recherche-accueil:hover { background: #135C3F; color: #fff; }

/* ==========================================================================
   Hero de l'accueil (septembre 2026, refonte)
   --------------------------------------------------------------------------
   Le bloc vert tres fonce faisait l'effet d'une dalle : 60px de titre sur trois lignes,
   blanc sur presque noir, qui ecrasait tout ce qui suivait -- et sur telephone, un ecran
   entier de vert sombre avant le moindre contenu. On garde le vert de la marque, mais en
   teinte claire ; le titre passe sur deux lignes, en encre foncee ; deux arches en
   filigrane (la forme de l'icone) signent la page sans rien ajouter a lire.
   ========================================================================== */
.hero {
  position: relative; overflow: hidden;
  background: linear-gradient(180deg, #F1FAF5 0%, #E3F4EA 100%);
  border: 1px solid #D5ECDF; color: var(--ink);
  padding: 58px 40px 62px;
}
.hero > :not(.hero-motif) { position: relative; z-index: 1; }
.hero h1 {
  color: var(--ink); font-size: 50px; line-height: 1.06; font-weight: 800;
  letter-spacing: -.045em; max-width: 17ch; margin: 0 auto 16px;
}
.hero h1 span { color: var(--vert-fonce); }
.hero p { color: var(--ink-soft); font-size: 18px; }
.hero-motif { position: absolute; color: #0E4630; opacity: .07; pointer-events: none; line-height: 0; }
.hero-motif svg { width: 100%; height: 100%; }
.hero-motif-droite { width: 300px; height: 300px; right: -40px; bottom: -90px; }
.hero-motif-gauche { width: 190px; height: 190px; left: -30px; top: -50px; opacity: .05; }

@media (max-width: 1000px) { .hero h1 { font-size: 44px; } }
@media (max-width: 768px) {
  .hero { padding: 44px 24px 48px; }
  .hero h1 { font-size: 36px; }
}
@media (max-width: 480px) {
  .hero { padding: 34px 18px 38px; }
  .hero h1 { font-size: 30px; line-height: 1.1; }
  .hero p { font-size: 15.5px; }
  .hero-motif-gauche { display: none; }
  .hero-motif-droite { width: 200px; height: 200px; right: -50px; bottom: -70px; }
  .search.search-pilule { margin-top: 22px; }
  .search.search-pilule input { font-size: 15px; padding-left: 40px !important; }
  .search-pilule-icone { left: 18px; width: 17px; height: 17px; }
  .search.search-pilule .btn-recherche-accueil { padding: 12px 16px; font-size: 14.5px; }
}

/* ==========================================================================
   Page Annuaire, /categories (septembre 2026, 2e version)
   --------------------------------------------------------------------------
   Meme langage visuel que le hero (teinte verte, arche en filigrane, recherche en
   pilule) : l'Annuaire est la suite naturelle de l'accueil, il doit en avoir l'air.
   Les familles passent en panneaux cote a cote et les categories en lignes compactes :
   la 1re version reutilisait une grille qui etirait les familles d'une ou deux
   categories sur toute la largeur, d'ou les grands vides.
   ========================================================================== */
.annu { margin-top: 28px; }

.annu-entete {
  position: relative; overflow: hidden;
  background: linear-gradient(180deg, #F1FAF5 0%, #E3F4EA 100%);
  border: 1px solid #D5ECDF; border-radius: var(--radius-xl);
  padding: 46px 44px 40px;
}
.annu-entete-contenu { position: relative; z-index: 1; max-width: 700px; }
.annu-entete h1 { font-size: 44px; line-height: 1.05; letter-spacing: -.045em; margin: 0 0 12px; color: var(--ink); }
.annu-entete-texte { font-size: 17px; line-height: 1.55; color: var(--ink-soft); margin: 0; max-width: 56ch; }
.annu-entete .search.search-pilule { margin: 24px 0 0; }
.annu-motif { position: absolute; color: #0E4630; opacity: .07; pointer-events: none; line-height: 0; }
.annu-motif svg { width: 100%; height: 100%; }
.annu-motif-droite { width: 340px; height: 340px; right: -30px; bottom: -110px; }

.annu-chiffres { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 22px; margin-top: 22px; font-size: 14.5px; color: var(--ink-soft); }
.annu-chiffres strong { font-family: var(--font-titre); font-size: 17px; color: #0E4630; margin-right: 3px; }
.annu-lien-carte {
  display: inline-flex; align-items: center; gap: 7px; margin-left: auto;
  font-weight: 600; font-size: 14.5px; color: #0E4630; text-decoration: none;
  background: #fff; border: 1px solid #CFE6DA; border-radius: var(--radius-pill); padding: 9px 16px;
}
.annu-lien-carte:hover { border-color: var(--vert); }
.annu-lien-carte svg { width: 17px; height: 17px; }

/* Familles : deux colonnes, panneaux blancs, en-tete avec icone dans une pastille verte. */
.annu-familles { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 26px; }
.annu-famille { background: #fff; border: 1px solid var(--line); border-radius: var(--radius-lg); padding: 20px 20px 10px; }
.annu-famille-tete { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; }
.annu-famille-icone {
  flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; border-radius: 12px; background: var(--vert-clair); color: #0E4630;
}
.annu-famille-icone svg { width: 21px; height: 21px; }
.annu-famille-tete h2 { font-size: 18px; margin: 0; color: var(--ink); }

.annu-liste { list-style: none; margin: 0; padding: 0; }
.annu-liste li + li { border-top: 1px solid var(--line); }
.annu-ligne {
  display: flex; align-items: center; gap: 12px;
  padding: 13px 6px; margin: 0 -6px; border-radius: 10px;
  text-decoration: none; color: var(--ink); transition: background .12s;
}
.annu-ligne:hover { background: #F4FAF7; }
.annu-ligne-nom { flex: 1; font-weight: 600; font-size: 15.5px; }
.annu-ligne-compte {
  font-size: 13px; font-weight: 700; color: #0E4630; background: var(--vert-clair);
  border-radius: var(--radius-pill); padding: 3px 10px; min-width: 34px; text-align: center;
}
.annu-ligne-fleche { width: 17px; height: 17px; color: var(--ink-faint); transition: transform .12s, color .12s; }
.annu-ligne:hover .annu-ligne-fleche { transform: translateX(2px); color: var(--vert-fonce); }

/* Blocs secondaires : titre dans la typographie des titres du site. */
.annu-bloc { margin-top: 42px; }
.annu-bloc-titre { font-size: 22px; letter-spacing: -.03em; margin: 0 0 16px; color: var(--ink); }


.annu-ajouts { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
.annu-ajout {
  display: flex; flex-direction: column; overflow: hidden;
  background: #fff; border: 1px solid var(--line); border-radius: var(--radius-lg);
  text-decoration: none; color: var(--ink); transition: border-color .12s, transform .15s;
}
.annu-ajout:hover { border-color: var(--line-fort); transform: translateY(-2px); }
/* Sans photo, on ne laisse pas un cadre gris vide : on pose l'arche de la marque sur
   fond vert clair. La carte reste lisible et la page ne montre pas de trou. */
.annu-ajout-visuel {
  display: flex; align-items: center; justify-content: center;
  height: 120px; background: var(--vert-clair); color: #0E4630;
}
.annu-ajout-visuel svg { width: 46px; height: 46px; opacity: .35; }
.annu-ajout-visuel img { width: 100%; height: 100%; object-fit: cover; }
.annu-ajout-corps { display: flex; flex-direction: column; gap: 3px; padding: 14px 16px 16px; }
.annu-ajout-type { font-size: 12.5px; font-weight: 600; color: var(--vert-fonce); }
.annu-ajout-nom { font-family: var(--font-titre); font-size: 16px; font-weight: 700; letter-spacing: -.02em; line-height: 1.25; }
.annu-ajout-ville { font-size: 13.5px; color: var(--ink-faint); }

/* Bandeau final : le seul aplat vert fonce de la page, pour qu'il se remarque. */
.annu-cta {
  position: relative; overflow: hidden;
  display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap;
  margin-top: 46px; padding: 30px 34px;
  background: #0E4630; color: #fff; border-radius: var(--radius-xl);
}
.annu-cta-texte { position: relative; z-index: 1; max-width: 560px; }
.annu-cta-titre { font-family: var(--font-titre); font-size: 21px; font-weight: 700; letter-spacing: -.02em; margin: 0 0 6px; }
.annu-cta-texte p:not(.annu-cta-titre) { margin: 0; color: rgba(255,255,255,.78); font-size: 15px; line-height: 1.5; }
.annu-cta-actions { position: relative; z-index: 1; display: flex; gap: 10px; flex-wrap: wrap; }
.annu-cta-btn {
  display: inline-flex; align-items: center; padding: 12px 20px; border-radius: var(--radius-pill);
  background: #fff; color: #0E4630; font-weight: 600; font-size: 14.5px; text-decoration: none;
}
.annu-cta-btn:hover { background: #F1FAF5; }
.annu-cta-btn-second { background: transparent; color: #fff; border: 1px solid rgba(255,255,255,.4); }
.annu-cta-btn-second:hover { background: rgba(255,255,255,.08); }
.annu-motif-cta { width: 220px; height: 220px; right: 18%; bottom: -120px; color: #fff; opacity: .06; }

@media (max-width: 1000px) {
  .annu-ajouts { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 760px) {
  .annu-entete { padding: 32px 22px 28px; border-radius: var(--radius-lg); }
  .annu-entete h1 { font-size: 34px; }
  .annu-familles { grid-template-columns: 1fr; }
  .annu-lien-carte { margin-left: 0; }
  .annu-cta { padding: 26px 22px; border-radius: var(--radius-lg); }
}
@media (max-width: 480px) {
  .annu-entete h1 { font-size: 30px; }
  .annu-entete-texte { font-size: 15.5px; }
  .annu-motif-droite { width: 220px; height: 220px; right: -60px; bottom: -80px; }
  .annu-ajouts { grid-template-columns: 1fr 1fr; gap: 10px; }
  .annu-ajout-visuel { height: 90px; }
  .annu-cta-actions { width: 100%; }
  .annu-cta-btn { flex: 1; justify-content: center; }
}

/* Aiguillage vers le compte association, en tete du formulaire Communaute. */
.encadre-asso-compte {
  border: 1px solid var(--line); border-left: 4px solid #0E4630;
  border-radius: var(--radius-md); background: #fff;
  padding: 18px 22px; margin: 0 0 26px; text-align: left;
}
.encadre-asso-titre { font-weight: 700; font-size: 16px; color: var(--ink); margin: 0 0 6px; }
.encadre-asso-texte { font-size: 14.5px; line-height: 1.55; color: var(--ink-soft); margin: 0 0 14px; }
.encadre-asso-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }


/* --- Choix en pastilles : gamme de prix et alcool (septembre 2026) ---------------------
   Remplacent un menu deroulant et une case a cocher. Les options sont visibles d'un coup
   et un clic suffit ; l'option choisie prend le vert de la marque. */
.choix-segments { border: none; padding: 0; margin: 4px 0 18px; }
.choix-segments legend { font-weight: 600; font-size: 14.5px; margin-bottom: 8px; padding: 0; color: var(--ink); }
.choix-segments-ligne { display: flex; flex-wrap: wrap; gap: 8px; }
.choix-segment {
  position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 2px; min-width: 104px; flex: 1 1 104px; padding: 12px 14px;
  background: #fff; border: 1.5px solid var(--line-fort); border-radius: var(--radius-md);
  cursor: pointer; text-align: center; transition: border-color .12s, background .12s;
}
.choix-segment input { position: absolute; opacity: 0; pointer-events: none; }
.choix-segment:hover { border-color: var(--vert); }
.choix-segment:has(input:checked) { border-color: var(--vert); background: var(--vert-clair); }
.choix-segment:has(input:focus-visible) { outline: 2px solid var(--vert); outline-offset: 2px; }
.choix-segment-valeur { font-family: var(--font-titre); font-weight: 700; font-size: 16px; color: var(--ink); }
.choix-segment:has(input:checked) .choix-segment-valeur { color: #0E4630; }
.choix-segment-aide { font-size: 12px; color: var(--ink-faint); line-height: 1.3; }
.choix-segment-neutre .choix-segment-valeur { color: var(--ink-faint); }

/* ==========================================================================
   v198 -- le langage visuel de l'accueil et de l'Annuaire gagne tout le site
   ========================================================================== */

/* En-tete des pages categorie (/type/:slug et /type/:slug/:ville) : meme fond vert clair
   et meme arche en filigrane que l'accueil et l'Annuaire. L'aplat "--cat-voile" venait de
   l'epoque ou chaque categorie avait sa couleur ; il n'en reste qu'une, celle de Riwa. */
.type-hero {
  position: relative; overflow: hidden;
  background: linear-gradient(180deg, #F1FAF5 0%, #E3F4EA 100%);
  border: 1px solid #D5ECDF; border-radius: var(--radius-xl);
  padding: 42px 40px 38px;
}
.type-hero > :not(.annu-motif) { position: relative; z-index: 1; }
.type-hero .annu-motif-droite { width: 300px; height: 300px; right: -30px; bottom: -100px; }
.type-hero .btn-retour-rond { border: 1px solid #CFE6DA; }
@media (max-width: 760px) {
  .type-hero { padding: 30px 22px 28px; border-radius: var(--radius-lg); }
  .type-hero .annu-motif-droite { width: 200px; height: 200px; right: -60px; bottom: -70px; }
}

/* Recherches avec filtres (page /recherche et pages categorie) : une seule pilule qui
   contient le champ, les listes deroulantes et le bouton, separes par un filet. Sur
   telephone, la pilule s'ouvre en colonne : on ne tasse pas trois champs sur 340 px. */
.search.search-pilule-filtres { max-width: 920px; margin: 22px 0 0; flex-wrap: nowrap; }
.search.search-pilule-filtres input { flex: 1 1 auto; width: auto; background: transparent; margin: 0; }
.search.search-pilule select {
  flex: 0 0 auto; width: auto; max-width: 210px; margin: 0;
  padding: 11px 30px 11px 16px; border: none; border-left: 1px solid var(--line); border-radius: 0;
  background-color: transparent; font-family: inherit; font-size: 14.5px; color: var(--ink); cursor: pointer;
}
.search.search-pilule select:focus { outline: none; background-color: #F4FAF7; }
.search.search-pilule-filtres .btn-recherche-accueil { flex: 0 0 auto; width: auto; padding: 13px 24px; font-size: 15px; }

@media (max-width: 700px) {
  .search.search-pilule-filtres {
    flex-direction: column; align-items: stretch; gap: 2px;
    border-radius: 22px; padding: 8px;
  }
  .search.search-pilule-filtres .search-pilule-icone { top: 23px; transform: none; }
  .search.search-pilule-filtres input { padding: 12px 12px 12px 44px !important; }
  .search.search-pilule select {
    max-width: none; width: 100%; border-left: none; border-top: 1px solid var(--line);
    padding: 12px 14px;
  }
  .search.search-pilule-filtres .btn-recherche-accueil { width: 100%; margin-top: 6px; }
}

/* Le bandeau "Vous gerez un etablissement" de l'accueil reprend celui de l'Annuaire ;
   dans une .section, il n'a pas besoin de la marge haute prevue pour l'Annuaire. */
.section > .annu-cta:first-child { margin-top: 0; }
